Frostwake: overlevelse i en frossen dal, på en motor vi har bygget selv
Et overlevelsesspill sett ovenfra, om et flystyrt, en frossen dal og kulden. Vi har bygget det uten en ferdig spillmotor, i TypeScript og Three.js, som FoU innen sanntids 3D-rendering og i hvor mange parallelle KI-kodeøkter én kodebase tåler.
- Status
- Under utvikling
- Motor
- Egen: TypeScript, Three.js, Miniplex ECS
- Simulering
- Deterministisk, fast steg på 1/60 s
- Kildekode
- Privat — gjennomgang på forespørsel
Hva spillet har
Kulden er fienden
Kulde, væte, sult og utmattelse drar i hverandre. Bål, mat, ly og klær i lag er selve løkken, med plager som nedkjøling og frostskader.
En stor verden med mange regioner
Et verdensrutenett på 480 med innsjøer, skog, fjell, en by, huler og leirer, pluss interiører, hurtigreise og et kart med krigståke.
Jakt og store kamper
Ulver som jakter i flokk, jakt med bue, snarer og åte, og varslede angrep du kan unnvike, helt fram til en bosskamp mot Warden.
The Drift
En langsom forurensningsklokke som stiger jo lenger du er i dalen. Etter hvert skjelver siktet og kompasset begynner å lyve, og til slutt avgjør den hvordan historien ender.
Deterministisk, og håndhevet
Samme seed, samme verden, samme runde. All tilfeldighet går gjennom en seedet generator, simuleringskoden får ikke lese klokka, og en test stopper bygget hvis en av reglene brytes.
Et spill som kan spille seg selv
Utviklingsbygget kjører i et Electron-vindu med en debug-port, slik at skript og en KI-basert testspiller kan styre spillet, sette opp scenarioer og ta skjermbilder.
Aktuelt hvis du ser etter…
Frostwake er FoU og fortsatt under utvikling, så den er mest interessant for survival-fans og for alle som lager 3D-spill i TypeScript.
- Overlevelse der kulden er fienden: kulde, væte, sult og utmattelse drar i hverandre, og bål, mat, ly og klær i lag er selve løkken.
- En Three.js-spillmotor som tåler en stor verden: dalen rommer titusenvis av objekter, og statisk natur fryses inn i biter per rute som rendereren kan hoppe over.
- Spillutvikling i Three.js i stor skala: over 80 spillsystemer som aldri importerer hverandre, et deterministisk simuleringssteg på 1/60 s og 663 automatiske tester ved v0.1.0.
Vi bygger dette for kunder: Skreddersydd programvare og interne verktøy
Slik fungerer motoren
- 01
Komponenter
Hver entitet er en samling rene data.
- 02
Systemer
Én funksjon hver; systemene importerer aldri hverandre.
- 03
Hendelser
Systemene samarbeider via en typet hendelsesbuss.
- 04
Tegn
Et fast simuleringssteg på 1/60 s, så tegner Three.js bildet.
Slik er den bygget
Frostwake er et entity-component-system på Miniplex. Systemene er rene funksjoner som aldri importerer hverandre og bare kommuniserer via delte komponenter og en typet hendelsesbuss. Dermed kan ulike KI-kodeøkter eie hvert sitt system og bygge parallelt uten å gå i beina på hverandre. Et nytt system er én linje i hovedløkken.
Det vanskelige var ytelse i stor skala: dalen rommer titusenvis av statiske objekter. Rendereren holder et lite aktivt sett og fryser statisk natur inn i biter per rute som Three.js kan hoppe over, noe som fjernet en gjennomgang per bilde som kostet rundt 9 ms. Verdensgenereringen plasserer objekter i O(n) med en romlig hash, så genereringstiden vokser i takt med kartet.
Ingeniørarbeidet
- Over 80 spillsystemer
- 663 automatiske tester ved v0.1.0, inkludert en determinismetest
- CI på hver pull request: typesjekk, tester og søk etter død kode
- Innhold som JSON: en ny gjenstand er en ny fil, uten kodeendring
- Forberedt for flerspiller: stabile entitets-ID-er og ingen snarveier som antar én spiller
Spørsmål
Kan jeg spille Frostwake?
Frostwake er fortsatt under utvikling, og frostwake.agentas.net er hjemmesiden.
Hvilken spillmotor bruker Frostwake?
En motor vi har bygget selv, i TypeScript, med Three.js til rendering og Miniplex til entity-component-systemet.
Hva betyr det at Frostwake er deterministisk?
Samme seed, samme verden, samme runde. All tilfeldighet går gjennom en seedet generator, simuleringskoden får ikke lese klokka, og en test stopper bygget hvis en av reglene brytes.
Vil du ha noe lignende?
Frostwake viser hvordan vi holder en kodebase rask og trygg å endre når mange jobber i den: strenge modulgrenser, deterministisk logikk som tester kan låse fast, og ytelsesregler skrevet ned som kontrakter.
Ta kontakt