Jarle lager 3D-motor på fritiden

Snart kommer det første spillet hans, The Omega Strain. Vi har fått noen ord med ham.

Hvis vi går tilbake til åtti- og store deler av nittitallet, var det uvanlig at en spillutvikler ikke utviklet sin egen teknologi for spillene sine. Ofte startet individuelle spillprosjekter med blanke ark, og kanskje noen nyttige rutiner som utvikleren hadde laget for tidligere prosjekter. Skulle de for eksempel bruke 3D-grafikk, ble 3D-motoren typisk bygd opp fra bunnen av. Det fantes selvsagt noen unntak, som Incentive Softwares grensesprengende Freescape-motor, men det var først med PC-utviklere som id Software at ideen om å lisensiere bort spillmotorer gradvis fikk fotfeste.

Commodore 64-grafikk fra 1987.
Freescape-motoren på Commodore 64.

I dag er det annerledes. I dag representerer avanserte motorer som Unreal, Unity, Godot og til og med GameMaker en snarvei til ferdigutviklede spill man bare kunne drømme om den gangen man jobbet med Commodore 64, Amiga eller Atari ST. Snarveier de aller fleste tar i bruk – når selv et selskap som CD Projekt, med sin avanserte og heftige REDengine, hopper over til Unreal er det åpenbart fordi det har fordeler. Og for indie-utviklere er det å bruke måneder og år på å i praksis finne opp hjulet på nytt vanligvis helt uaktuelt når ferdigløsningene er tilgjengelige og billige.

Man kan fortsatt lage sin egen 3D-motor

Men det er altså fortsatt mulig å gå den andre veien, slik man gjorde på åtti- og nittitallet. Det kommer rett som det er nye spill som bygger på helt egenutviklet teknologi, og noen av dem er ganske avanserte også – utviklet av folk som vet nøyaktig hva de trenger fra motoren sin, og er klare for å brette opp ermene for å få det til. For andre handler det mer om det å faktisk gjøre det. Å hoppe over snarveien fordi det er prosessen i seg selv som appellerer.

Jarle Adolfsen. Foto: Privat.
Jarle Adolfsen. Foto: Privat.

Norske Jarle Adolfsen er en av disse. Han har i de tre siste årene jobbet med 3D-motoren RetroMesh, og spillet The Omega Strain. 51-åringen fra Oslo startet å programmere i BASIC på VIC-20 som 13-åring, og hoppet videre til Commodore 128 og etter hvert Atari ST der han ble involvert i demoscenen og lærte å kode i assembler for 68000-prosessoren. På nittitallet var han innom Funcom for intervju, men tok et annet valg og endte opp med en karriere innen mer tradisjonell programvareutvikling.

Han havnet etter hvert i mobilbransjen, og har vært med å starte flere selskaper. Blant annet Link Mobility i 2002, der han jobbet med interaktive TV-konsepter rundt programmer som Big Brother og Baren. Men etter barn nummer to i 2008 ønsket han seg mer normale arbeidstider, og var med å starte konsulentfirmaet bspoke AS, der han fortsatt jobber i dag. De siste 20 årene har han stort sett jobbet med Microsoft-teknologi – C#, .NET, SQL Server og Azure – så det ble en lang omvei før han kom tilbake til spillutvikling.

Men nå er The Omega Strain snart klart for lansering på Steam. Dette spillet er inspirert av David Brabens legendariske Virus (opprinnelig kjent som Zarch), og er et romspill der du må hindre utenomjordiske slasker i å spre et dødelig virus på planetene. Vi tok en prat med Adolfsen om motoren han har laget, og spillet som kjører på den:

Atari ST. Bilde: Bill Bertram (2006).
Atari ST. Bilde: Bill Bertram (2006).

La oss starte med spillhistorien din. Hvor begynte du, og hvilke spill har preget deg i årenes løp?

Jeg begynte selvfølgelig med de enkle spillene på VIC-20 – Space Invaders og mye av det vanlige fra den tiden.

Men den virkelig store interessen kom med Zarch/Virus på Atari ST i 1987. Det var et helt fantastisk spill, og det har nok påvirket meg mer enn noe annet spill når det gjelder både spill og retrospill.

Jeg har også veldig varme minner fra Sierra-spillene, spesielt Space Quest og Leisure Suit Larry. Humoren, figurene og følelsen av å delta i en interaktiv historie var fantastisk. Det er faktisk en helt annen del av spillhistorien som fortsatt inspirerer meg.

Så kom selvfølgelig Wolfenstein 3D og Doom, som på mange måter markerte slutten på Atari ST og Amiga som de viktigste plattformene for meg.

Og det gikk enormt mange timer til Quake etter arbeidstid på 90-tallet. Det var en fin tid!

Det å lage sin egen 3D-motor fra bunnen av er jo et interessant valg nå som det finnes så mange «ferdige» løsninger, så hvordan startet dette?

På 90-tallet var jeg tungt involvert i demoscenen og tilbrakte utrolig mye tid foran Atari-en min.

Allerede den gangen hadde jeg store planer om å lage min egen 3D-motor som jeg kunne bruke til forskjellige spill. Jeg tror kanskje jeg var litt redd for prosjektet også, fordi jeg skjønte hvor vanskelig det kom til å bli.

The Omega Strain.
The Omega Strain.

Så tok voksenlivet over. Karriere, selskaper, familie og barn gjorde sitt, og prosjektet ble lagt på is.

Men det ble egentlig aldri glemt.

Da jeg var rundt 49 hadde barna blitt store nok til at jeg plutselig fikk litt mer tid på kvelden igjen. Da tenkte jeg at hvis jeg noen gang skulle gjøre dette, så måtte det være nå.

Så jeg begynte.

Jeg pleier å oppsummere det slik:

«Curiosity got me started, and my stubbornness kept me going.»

Det viste seg at jeg kom til å trenge ganske mye av begge deler.

Kan du gi et innblikk i hva det faktisk innebærer å skape en 3D-motor?

Jeg kan i hvert fall fortelle hvordan jeg startet, for hele prosjektet har egentlig utviklet seg gjennom små eksperimenter.

Først måtte jeg finne ut om teknologistacken jeg hadde valgt faktisk kunne tegne 3D på en fornuftig måte og vise det raskt nok på skjermen. Jeg skrev kalkulasjonene selv og startet med helt enkel wireframe-grafikk.

Da det fungerte, var første mål nådd.

The Omega Strain.
The Omega Strain.

Neste steg var å lese inn et STL-objekt på omtrent 1500 trekanter, rotere det rundt alle aksene og forsøke å shade flatene. Ytelsen var ikke fantastisk, men det fungerte godt nok til at eksperimentet kunne fortsette.

Slik jobbet jeg egentlig videre: løse ett problem, se hva som fungerte, og så ta neste.

Etter fire-fem større iterasjoner hadde jeg plutselig en rudimentær demo hvor jeg kunne fly et skip opp fra en plattform og bevege meg rundt blant objekter i en 3D-verden.

På det tidspunktet delte jeg kildekoden i to prosjekter: selve 3D-motoren RetroMesh, og spillet som etter hvert ble The Omega Strain.

I dag består de to prosjektene til sammen av rundt 90 000 linjer kode.

Det morsomme er at en 3D-motor fort blir mye mer enn bare å tegne trekanter. Plutselig trenger du kamera og projeksjon, clipping, rasterisering, teksturer, lys og shading, fysikk, kollisjoner, partikler, AI, lyd og alle de små tingene som gjør at en verden faktisk føles levende.

Det har vært en enorm læringsreise.

Hva er den endelige planen med motoren din? Kun til eget bruk, eller vil du gi den ut?

RetroMesh ligger allerede på GitHub, så hvem som helst kan se på og bruke den.

Det finnes også et enkelt eksempelprosjekt hvor man kan laste et objekt med noen tusen flater og flytte og rotere det rundt.

Motoren er tilgjengelig under MIT-lisens, så hvis noen har lyst til å eksperimentere med den, er det bare å gjøre det. Og hvis noen faktisk ønsker å bruke RetroMesh til noe, må de veldig gjerne ta kontakt. Det hadde vært utrolig morsomt.

Jeg bruker den selvfølgelig også videre selv. The Omega Strain er det første ordentlige spillet som bruker RetroMesh, men planen er ikke at det skal være det siste.

The Omega Strain.
The Omega Strain.

Kan du fortelle oss litt The Omega Strain?

The Omega Strain er et 3D-arkadespill med en ganske enkel filosofi: «old-school gameplay with beefed-up retro graphics».

Du er pilot i Global Earth Defence League, som vanligvis har ganske mange piloter tilgjengelig når verden trenger å reddes.

Problemet er at alle de andre har fått influensa. De sitter hjemme, snufser og ser på TV.

Samtidig sprer The Omega Strain seg.

Dermed må du alene dra ut og rense de åtte nærmeste planetene i nabosolsystemene før smitten får spredd seg videre.

Spillet består av åtte forskjellige verdener med fiender, powerups, forskjellige våpen og bosskamper. Målet har hele tiden vært at det skal være enkelt å forstå, men krevende å bli ordentlig god i.

Jeg ønsker også at det skal fungere godt på relativt beskjedent utstyr. Det står utrolig mange fullt brukbare gamle laptoper i skap rundt omkring, og jeg liker tanken på at de kan få et nytt liv som retromaskiner.

The Omega Strain.
The Omega Strain.

Vurderer du i den forbindelse støtte for eldre utgaver av Windows?

Per i dag støtter spillet Windows 10 og nyere. Det passer egentlig godt med ambisjonen min om at The Omega Strain skal kunne kjøre bra også på eldre maskinvare.

Jeg har blant annet testet spillet på en rundt syv år gammel Surface, og den kjører spillet overraskende bra. På de høyeste grafikkinnstillingene får jeg rundt 30 FPS, også når det skjer mye på skjermen, og det oppleves veldig spillbart.

Å gå lenger tilbake enn Windows 10 er litt mer komplisert. Steam støtter ikke lenger Windows 8-serien, og moderne versjoner av C#/.NET som spillet bygger på har også gått bort fra støtte for disse eldre operativsystemene.

Men dersom det viser seg å være interesse for det, er det absolutt ikke utenkelig at jeg undersøker muligheten. Det kunne faktisk vært et morsomt teknisk eksperiment å se hvor langt tilbake vi kan få spillet til å kjøre.

Du nevnte Virus, som er en tydelig inspirasjonskilde. Hvilke aspekter av det spillet du har videreført i The Omega Strain?

The Omega Strain er definitivt inspirert av Virus.

Jeg synes fortsatt, med tanke på når det kom, at Virus kanskje er et av spillhistoriens mest innovative spill. Det hadde fylte polygoner, fysikk, partikler og en utrolig troverdig flymekanikk.

Det var også fryktelig vanskelig. Jeg ble aldri spesielt god i det!

Virus på Atari ST. Bilde: Mobygames.
Virus på Atari ST. Bilde: Mobygames.

Men det fascinerte meg enormt. Verden føltes levende. Det var til og med fisk som hoppet i vannet. Når man ser tilbake på det i dag, inneholdt det overraskende mange ideer vi forbinder med langt nyere spill.

Jeg ønsket å fange noe av den samme følelsen: flygingen, fysikken, partiklene og friheten ved å bevege seg rundt på en planet.

Men The Omega Strain er ikke en kopi av Virus. Ingenting er kopiert; alt er laget fra bunnen av. Det jeg ønsket å ta med meg var selve følelsen og noen av idéene.

Jeg ville også at verden skulle føles levende. Derfor har vi blant annet bølger i vannet, fisk som hopper, vær, vegetasjon og til og med noen isbjørner.

Samtidig ønsket jeg å gjøre ting annerledes.

Lyden i Virus var kanskje ikke spillets sterkeste side! Jeg ønsket derfor at musikken skulle være en viktig del av opplevelsen. Der har jeg vært utrolig heldig og fått tillatelse til å bruke musikk fra det svenske chiptune-bandet 047, blant annet fra et fantastisk album de ga ut i 2011.

Jeg ønsket også mer historie og stemning, og ikke minst å gjøre spillet mer arkadevennlig.

Derfor har The Omega Strain ting som powerups, flere våpen, åtte forskjellige planeter og bosskamper – ideer som har blitt vanlige i spill senere, men som jeg synes passer veldig godt sammen med de gamle retroidéene og polygonestetikken.

The Omega Strain.
The Omega Strain.

Hvilke aspekter av spillet er du mest fornøyd med?

Jeg er veldig fornøyd med fysikken og selve flyfølelsen.

Fysikksystemet fungerer på tvers av objektene i spillet, og det har vært viktig for meg at skipet skal føles riktig å fly.

Jeg synes også stemningen og gameplayet etter hvert har kommet dit jeg ønsket. Musikken har vært utrolig viktig for dette.

Spillet skal være utfordrende. Det skal være lett å komme i gang, men kreve litt arbeid hvis du virkelig vil bli god.

Grafisk ønsket jeg å beholde det tydelige polygonuttrykket, men uten å være bundet av begrensningene maskinene hadde på slutten av 80- og begynnelsen av 90-tallet. På skjermen kan det derfor være flere tusen polygoner samtidig, sammen med moderne effekter, partikler og vær.

Det er egentlig det jeg mener med «beefed-up retro graphics».

Jeg føler at jeg har klart å nå de fleste av målene jeg satte meg da prosjektet startet – selv om listen over ting jeg får lyst til å legge til aldri ser ut til å bli helt tom.

Hvordan er tilnærmingen til nivådesign? Hvor mye er skriptet/forhåndsspesifisert, og hvor mye er dynamisk?

Dette er egentlig en litt interessant kombinasjon.

The Omega Strain.
The Omega Strain.

Motoren har funksjonalitet for å generere planeter og scener proseduralt. Terreng, geografi og sammensetningen av biomer kan derfor genereres dynamisk. Problemet – eller kanskje det interessante – er at ikke alle tilfeldig genererte verdener blir like spennende å spille på.

Under utviklingen har jeg derfor generert veldig mange verdener og tatt vare på de jeg synes har fått spesielt interessant geografi og gode kombinasjoner av biomer. Disse bruker jeg som utgangspunkt for kampanjen og kan finjustere videre. På den måten får jeg både variasjonen fra prosedyregenerering og muligheten til å håndplukke de beste resultatene.

Når spilleren har fullført kampanjen med de åtte planetene, åpnes Simulation Mode. Der brukes systemet mye friere, og nye planeter med forskjellige biomer og vanskelighetsgrader genereres fortløpende.

Det betyr at spillet i praksis kan fortsette så lenge spilleren ønsker. Man kan fortsette å samle poeng og forsøke å klatre på det globale Steam-leaderboardet.

Jeg liker tanken på at man ikke nødvendigvis skal være «ferdig» med The Omega Strain bare fordi man har fullført kampanjen. Jeg vil at folk skal få mye igjen for sine hardt opptjente penger, og at de som virkelig liker flymekanikken skal kunne fortsette å bli bedre, konkurrere med venner og jakte på highscore. Vi har derfor også Steam Achievements og leaderboards som en del av dette.

Hvor lenge har du jobbet med selve spillet, og hvordan har den prosessen vært?

Rundt tre år.

The Omega Strain.
The Omega Strain.

Alt er gjort på kveldstid ved siden av vanlig jobb og familieliv, og et grovt anslag er at det har gått med omtrent 2000 timer totalt på RetroMesh og The Omega Strain.

Prosessen har stort sett bestått av små steg. Jeg startet aldri med tanken om at jeg skulle bruke tre år og skrive rundt 90 000 linjer kode.

Det begynte med:

Kan jeg få en trekant på skjermen?

Så:

Kan jeg rotere den?

Så:

Kan jeg laste et objekt?

Og på et tidspunkt står man der med åtte planeter, fiender, fysikk, vær, bosskamper, musikk og en Steam-side.

Det er kanskje noe av det morsomste med hele prosjektet.

The Omega Strain.
The Omega Strain.

Hvordan går du frem for spilltesting, og har spillet endret seg som følge av testernes tilbakemeldinger?

I dag har jeg rundt 8–10 betatestere, og de siste ukene har jeg nok publisert minst ti nye versjoner, i stor grad som følge av tilbakemeldinger fra dem.

Testerne spiller på forskjellige måter og på forskjellig maskinvare, og det er utrolig nyttig. Som utvikler blir man fort vant til sitt eget spill og sin egen måte å spille på. En annen person kan i løpet av fem minutter gjøre noe jeg aldri har tenkt på.

Tilbakemeldingene har ført til alt fra små justeringer i menyer og brukeropplevelse til konkrete endringer i gameplay. Et eksempel er flyfysikken. Jeg fikk tilbakemeldinger på hvordan skipet oppførte seg når man slapp thrust, og det førte til at jeg jobbet videre med blant annet inertia og hvordan skipet beholder bevegelsen. Resultatet ble etter min mening en betydelig bedre flyfølelse.

Vi kommuniserer gjerne via e-post eller Messenger, og jeg har også laget et eget skjema der betatesterne kan registrere feil, kommentarer og forslag.

Det har egentlig vært en av de morsomste delene av den siste fasen. Spillet begynner å bli ferdig, men så kommer noen med en observasjon som gjør at man kan forbedre noe enda litt til.

The Divide.
The Divide.

Hvor fleksibel er egentlig RetroMesh-motoren – hva slags spill kan du lage med den?

Litt moro du spør faktisk. Du finner dette bildet på nettsiden, og RetroMesh motoren skal faktisk brukes her også! RetroMesh er forberedt på å kunne bruke 2D og 3D sammen i én og samme scene.

Med andre ord så er tanken at et Sierra-aktig eventyrspill skal kunne kombinere 3D-grafikk inn i en 2D-scene hvor 2D-objektene plasseres i tredimensjonale rom.

For eksempel på bildet du ser vil det flyvende skipet være 3D-grafikk med teksturer. Tog og liknende skal være 3D-grafikk som beveger seg i bakgrunnen.

Det vil også være actionsekvenser og liknende som er full 3D med typisk pikselartstil og teksturer. Det blir retrospill dette og, skal se ut som et Sierra spill men med dagens hardware, uten at det på noen måte skal se Unreal eller Unity aktig ut.

Surface-løsningen som brukes The Omega Strain er litt spesifisert, jeg skal se om det er mulig å flytte den over i RetroMesh og gjøre den litt mer generell.

Det store spørsmålet i 2026 er jo KI. Bruker du KI i utviklingen, og i så fall hvordan og hva er erfaringene?

Da jeg startet prosjektet for tre år siden var generativ KI ikke på agendaen på samme måte som i dag.

Jeg begynte først å bruke det aktivt for omtrent et år siden, også fordi det etter hvert ble relevant og nødvendig i prosjektene jeg jobber med profesjonelt.

Jeg vibekoder ikke. Jeg foretrekker fortsatt å sette opp arkitekturen selv: interfaces, klasser, ansvarsområder, patterns og hvordan systemene skal henge sammen. Jeg prøver å forberede mest mulig før KI-en slipper til, og gi den et godt definert område å arbeide innenfor i stedet for å si «lag et spill».

Brukt på den måten synes jeg KI er et fantastisk utviklerverktøy.

The Omega Strain.
The Omega Strain.

Store, mekaniske refaktoreringer er et godt eksempel. Ting som tidligere kunne tatt mange timer med ganske kjedelig arbeid kan gjøres utrolig mye raskere, samtidig som jeg selv beholder kontrollen over arkitekturen.

Jeg hadde nylig både en talk og en todagers workshop på NDC Oslo om prosjektet. Til workshopen laget jeg blant annet en del instrukser og «skills» for KI-verktøyene slik at deltakerne kunne jobbe raskt nok med RetroMesh.

Å utvikle en komplett fiende med 3D-geometri, fysikk og AI kan normalt ta dager eller uker. På en workshop har man to dager, så da blir KI et veldig interessant verktøy.

Min erfaring er derfor ganske enkel: KI er fantastisk når det brukes til de riktige tingene.

Men jeg synes fortsatt utvikleren må forstå systemet, ta arkitekturvalgene og vite hva man faktisk ønsker å bygge.

For meg er KI først og fremst en ekstremt effektiv samarbeidspartner – ikke en erstatning for å kunne utvikle programvare.

Mange spillere er kritiske til KI-bruk i spillutvikling, hva tenker du om det?

Jeg forstår godt at noen er skeptiske til KI i spillutvikling – jeg er selv opptatt av å bruke det med omtanke. For meg er det viktigste hvordan KI brukes, og hvem som tar beslutningene.

Jarle foran utviklersystemet sitt.
Jarle foran utviklersystemet sitt.

Jeg har programmert siden 1987 og har jobbet med The Omega Strain i rundt tre år. De to første årene spilte KI ingen særlig rolle i prosjektet. Først for omtrent ett år siden begynte jeg å bruke det aktivt, og da var mye av grunnlaget for spillet allerede på plass.

Mye av koden skriver jeg fortsatt selv. Ofte lager jeg mønsteret for hvordan noe skal fungere, skriver den første delen av koden og lar AI hjelpe meg med å fullføre, forbedre og lage tester. Jeg bruker også KI som hjelp til enkelte 3D-objekter. Uansett må jeg forstå det som lages, vurdere om det passer inn i spillet og kvalitetssikre resultatet.

Ideen om et spill inspirert av Virus hadde jeg lenge før jeg begynte på The Omega Strain. Jeg visste ganske godt hvordan jeg ville at spillet skulle se ut og føles, og skisserte flere av objektene på papir. Noen av skissene har jeg også brukt som utgangspunkt når AI har hjulpet meg med å lage 3D-modellene.

Når jeg ser spillet i dag, er det overraskende nært det bildet jeg hadde i hodet fra starten. KI har hjulpet meg med å utvikle det raskere, men ideen, designet, arkitekturen og retningen er resultatet av mine egne valg. Det er jeg stolt av.

Jeg tror KI på sikt kan bidra til at flere gode spill blir utgitt, og at kvaliteten kan bli høyere. Men da må vi som utviklere ha kontroll over verktøyet og bruke det på en måte som gjør at vi kan stå inne for resultatet.

Vi takker Jarle for at han tok seg tid til å svare på spørsmålene våre. The Omega Strain finner du på Steam.

Legg igjen en kommentar

Dette nettstedet bruker Akismet for å redusere spam. Finn ut mer om hvordan kommentardataene dine behandles.