Hopp til innhold

Spill

Full Blast

Dataspillet mitt, startet i romjulen fordi spill er gøy. Siden ble det AI-flåtens testbane, og nå bygges hele spillet på nytt i Godot.

  • Three.js
  • TypeScript
  • Godot

Full Blast er dataspillet mitt: du løper, skyter og overlever bølge etter bølge, med følelsen fra spillene jeg selv vokste opp med. Jeg begynte for hånd i romjulen 2025, rett og slett fordi det å lage spill er noe av det gøyeste jeg vet. Nå bygges hele spillet på nytt i spillmotoren Godot, for at en drøm skal bli mulig: tusenvis av fiender på skjermen samtidig, på en liten spillkonsoll.

Spillet

Løp, skyt, overlev

Bølge etter bølge med glødende fiender strømmer inn i en neonarena; innimellom kommer en boss. Du glir, hopper og kaster deg gjennom mengden, plukker opp krystaller og blir sterkere, helt til du dør og vil prøve igjen med en ny plan. Og hele verdenen pulserer i takt med musikken.

Drømmen

Tusenvis av fiender på en Switch

Nettleserversjonen klarer et par tusen fiender. Så sier prosessoren stopp, fordi hver fiende må flyttes én og én, seksti ganger i sekundet. Drømmen er tusenvis samtidig, på en maskin så beskjeden som en Nintendo Switch. Da må svermen over på grafikkortet, som er bygget for akkurat sånt. Det er hele poenget med Godot-versjonen.

Porten er en gjenoppbygging med én streng regel: følelsen skal overleve flyttingen. Hver tallverdi fra originalen ligger i en egen fasitfil: hvor fort du løper, hvor høyt du hopper, hvor hardt et skudd treffer. Testene sjekker i hver eneste kjøring at den nye versjonen holder fasiten. Avvik fanges av en maskin, ikke av magefølelse.

%%{init: {"themeVariables":{"fontFamily":"Instrument Sans","fontSize":"14px"},"flowchart":{"useMaxWidth":true,"nodeSpacing":22,"rankSpacing":36,"padding":6,"diagramPadding":4}}}%%
flowchart TB
  O["Originalen i nettleseren"] -- "fart, hopp, skade" --> F["Fasitfiler"]
  G["Godot-porten"] --> T["Hver testkjøring"]
  F --> T
  T -- "avvik" --> S["Maskinen sier ifra"]
  T -- "fasiten holder" --> V["Videre"]
Regelen i porten, tegnet opp: tallverdiene fra originalen ligger i fasitfiler, og hver testkjøring holder den nye versjonen opp mot fasiten. Diagrammet tegner avsnittet over; fasitfilene og testene ligger i spillets repo. Kilde: commit:b233b2b.

Og så skjedde det morsomste: den nye versjonen vokste forbi originalen.

Det nye

Tre ting nettleseren aldri fikk

Musikken ble spilldata

Soundtracket ligger inne i spillet, så tempoet er kjent på forhånd. Det er målt over hele sporet, nøyaktig 105 slag i minuttet, og bakt inn i spilldataene som et taktrutenett. Robotfiendene marsjerer diagonalt til basstromma i samlet flokk, og bossenes missiler danser på samme takt. Nettleserversjonen kunne bare lytte til musikken og reagere i etterkant; Godot-versjonen vet når neste slag kommer, før det kommer. Og fordi bevegelsene styres av rutenettet og ikke av lyden, spiller et testløp helt likt hver gang.

Roboter som spilltestere, og en bot som lærte av en bot

Spillet tester seg selv: roboter spiller runde etter runde og måler hvor langt de kommer. Én av dem er håndskrevet og flink. Den jakter på powerup-kasser og bruker det den finner. Så trente jeg et lite nevralt nett på opptak av den flinke, og det lærte seg kassejakten bare ved å se på. En bot som har lært av en bot. Og vil jeg se dem spille, åpner et eget verktøy en vegg av vinduer der botene spiller live, med alle effektene på.

%%{init: {"themeVariables":{"fontFamily":"Instrument Sans","fontSize":"14px"},"flowchart":{"useMaxWidth":true}}}%%
flowchart TB
  H["Håndskrevet bot"] -- "runde etter runde" --> R["Opptak av løpene"]
  R -- "treningsdata" --> N["Lite nevralt nett"]
  N -- "lærte kassejakten" --> S2["Spiller selv"]
  H --> W["Vegg av vinduer:<br/>botene spiller live"]
  S2 --> W
Bot som lærer av bot, tegnet opp: den håndskrevne boten spiller, opptakene blir treningsdata, og det nevrale nettet lærer kassejakten ved å se på. Diagrammet tegner avsnittet over; botene og treningsløpet ligger i spillets repo. Kilde: commit:b233b2b.

Spillet måler hvor godt løpet ditt gikk

Etter hver etasje regner spillet ut en rating, samme idé som sjakk bruker, og anbefaler neste etasje: vanskelig nok til å være spennende, aldri håpløs. Formelen er ikke gjettet. Den er kalibrert på hundrevis av robotrunder, der tre boter med ulikt ferdighetsnivå spilte de samme etasjene med de samme tilfeldighetsfrøene.

Historikk

Fra romjul til taktfaste roboter

Fem punkter, hentet fra commit-historikken.

  1. Romjulen 2025
    Første commit
    Spillet begynner for hånd i nettleseren, mellom juledagene, i Three.js og TypeScript.
  2. 25. mai 2026
    Godot-porten starter
    AI-flåten setter i gang gjenoppbyggingen: fundament, spillbar bit og arenaen på plass samme dag. Planen er lagt: svermen skal bo på grafikkortet.
  3. 4. juni 2026
    Svermen på grafikkortet
    Compute-versjonen av svermen kobles inn i det levende spillet, foreløpig som tilvalg bak et flagg.
  4. 12. juni 2026
    Musikken blir spilldata
    Taktrutenettet på 105 BPM bakes inn: missilene danser, og robotfiendene marsjerer til basstromma.
  5. 14. juni 2026
    Bot lærer av bot
    Den klonede boten lærer kassejakt av den håndskrevne læreren, og rating-systemet som anbefaler neste etasje lander samme dag.

Tallene

Talt i historikken

Tallene er talt i git-historikken og i spillets egne dokumenter; kilden står under hvert tall.

1 535
Endringer · hele spillet
Alle commits i git-historikken, fra første juledagscommit i 2025 til siste opprydding.
1 251
Endringer · mai 2026
Commits med forfatterdato i mai. Alle landet i én og samme uke, for porten startet 25. mai.
270
Agenter · én kodegjennomgang
Hele kodebasen revidert i én operasjon av en sverm på 270 agenter.
360
Testrunder · kalibrering
Tre boter × ti etasjer × tolv tilfeldighetsfrø: datagrunnlaget rating-systemet er tilpasset.
105BPM
Musikkens tempo, bakt inn som data
Målt over hele sporet og skrevet inn i fasitfilen; fiendene beveger seg på dette rutenettet.
207 718
Linjer · GDScript
All spillkode i godot/-treet ved siste commit. Nettleserversjonen den bygger på er 47 892 linjer.

Kildercommit:b233b2bcommit:bf76966commit:6da3813commit:d388da9commit:80831dc

Ærlig talt

Hvor porten faktisk står

Godot-versjonen er spillbar fra start til slutt på PC: bevegelse, kamp, bosser, progresjon, effekter og lyd. Men målet er ikke nådd. Grafikkort-svermen er bygget og koblet inn, men står fortsatt som tilvalg bak et flagg. Noen Switch finnes ennå ikke, verken devkit eller konsollport. Siste Godot-commit er fra midten av juni; der står porten nå.

Jeg lar det stå sånn. Et spill som er spillbart hele veien og ærlig om hva som gjenstår, er en bedre historie enn et som later som det er ferdig.