Direct naar inhoud

Red Alert in 3D op Linux, en de Rest van je Jeugd erbij

Een tutorial: een retro-gamebibliotheek met alleen open-source engines en legale data, met AI als monteur

Nick Aldewereld •
it-toolsAIinspiratie

Op 26 oktober kwam er een trailer voorbij: Red Alert, het Westwood-spel uit 1996, volledig in 3D. Het draait niet in een nagebouwde engine, maar op de originele spellogica. Dat wilde ik ook. En als ik toch bezig was, wilde ik ook de rest van mijn retro-bibliotheek eindelijk afmaken, zodat ik op een tegel klik en speel.

Hieronder staat hoe ik dat heb gedaan, met de commando’s erbij. Je kunt alles zelf natrekken, en je kunt het volgen zonder AI. De AI deed het zoekwerk en het doorzetten. De stappen zelf zijn gewone Linux.

Eerst de grens

Eén regel vooraf, omdat die de hele opzet bepaalt: geen gekochte of gekraakte spelbestanden van internet. Wat wel mag: open-source engines, freeware, shareware die vrij verspreid mag worden, en je eigen data uit bijvoorbeeld GOG.

Dat klinkt beperkend. In de praktijk valt het mee. Een flink deel van de klassiekers is inmiddels legaal gratis, of heeft een open engine die alleen jouw eigen datafiles nodig heeft.

Wat RA3D eigenlijk is

RA3D is een module van OpenCNC3D, een fanproject onder GPL v3. De broncode staat op GitHub. De spellogica is de broncode van Red Alert die Electronic Arts zelf onder GPL heeft vrijgegeven. De spelbestanden komen van de originele Red Alert-discs, die EA in 2008 als freeware vrijgaf. Dat staat in de data-README van het project, met de checksums van beide disc-images.

Het addertje: het project levert alleen Windows- en macOS-builds. Ik draai Linux.

De build vinden

De downloadknop op de site laadt zijn lijst uit een openbaar endpoint. Dat kun je zelf opvragen:

curl -sL https://www.opencnc3d.com/api/builds | python3 -m json.tool

Daarin staan alle bestanden van de laatste release, en een manifest met de SHA-256 van elk bestand. Download de Red Alert-module voor Windows en controleer hem tegen die manifest, vóórdat je er iets mee doet:

sha256sum -c <<< "<hash uit de manifest>  OpenCNC3D-module-ra-windows-v0.9.1.zip"

Reken op ruim 2 GB, en de films en muziek komen er straks nog bij.

Windows-software draaien zonder sudo

Wine heb je niet als systeempakket nodig. De Flatpak-versie installeer je in je eigen gebruikersaccount:

flatpak install --user flathub org.winehq.Wine//stable-25.08
flatpak override --user --filesystem=/pad/naar/opencnc3d org.winehq.Wine

Die tweede regel is belangrijk. Een Flatpak ziet standaard alleen je homemap. Staan je games op een andere schijf, dan moet je de app die map expliciet laten zien. Zonder die regel krijg je een spel dat zijn eigen bestanden niet vindt.

Hoe start je het spel?

In de module zit geen gewone launcher, alleen de engine in een submap. Hoe de officiële launcher het spel start, vond ik in de broncode van die launcher: hij gaat naar de installatiemap en roept het spel aan met één vlag. Zelf doe je dat zo:

cd ra3d && flatpak run --cwd="$PWD" org.winehq.Wine 'ra3d\opencnc3d-game.exe' --module ra3d

Het spel schrijft een logbestand naast zichzelf. Daar zag ik dat het werkte voordat ik naar het scherm keek: OpenGL 4.6 via Mesa op de ingebouwde Intel-GPU, menu geladen, alle knoppen actief.

Films en muziek

Die zitten niet in de download. De launcher haalt ze zelf op, rechtstreeks uit de freeware-discs op archive.org. Het commando daarvoor geeft eerst een weigering:

this folder is not an OpenCNC3D install (it has no opencnc3d-install.txt)

Een installatie via de officiële installer schrijft dat bestand. Een losse zip doet dat niet. Wat erin hoort, staat in de broncode van de updater: een versienummer en een data-ID, en die data-ID staat gewoon in de release-manifest. Na dat bestand liep de download door: 94 films en de soundtrack, ruim 700 MB, met checksumcontrole.

Wees hier eerlijk tegen jezelf: ik heb het tot het hoofdmenu getest, met de introfilm. Of de muziek in de missies goed speelt, weet ik pas als ik een missie heb gespeeld.

Eén frontend voor alles

Losse games zijn leuk, één bibliotheek is beter. Ik gebruik ES-DE, een frontend die emulators en native games in één menu zet. De truc voor native games is het systeem “Ports”: elk shellscript in die map wordt een tegel. Elke game is dus een paar regels:

#!/bin/sh
exec flatpak run org.zdoom.UZDoom -iwad /pad/naar/freedoom2.wad "$@"

Wat ik er nu naast heb staan, allemaal zonder iets te kopen:

  • Doom-familie: de shareware van Doom en Freedoom, een complete vrije vervanger van de Doom-levels, via UZDoom.
  • Shareware-klassiekers: Quake via QuakeSpasm, Wolfenstein 3D via ECWolf, Commander Keen via DOSBox Staging.
  • Strategie: C&C en Red Alert in 2D via OpenRA, OpenTTD, Warzone 2100, 0 A.D., Battle for Wesnoth.
  • Overig: Tyrian 2000 (freeware), Prince of Persia via SDLPoP, SimCity via Micropolis, OpenArena, SuperTuxKart.

Alles wat als Flatpak bestaat, installeer je met één flatpak install --user.

Wat er misging (het leerzame deel)

Drie dingen, want daar leer je meer van dan van wat in één keer werkte.

De bibliotheek was leeg, en niemand had het gezien. In de instellingen van ES-DE stond geen ROM-map. Het programma zocht in een standaardmap die niet bestond. Alle eerder klaargezette games waren er dus wel, maar de frontend zag ze niet. Eén regel in es_settings.xml. Controleer dat vóórdat je gaat zoeken naar een probleem met je scripts.

Een pakket dat leeg is. Het Ubuntu-pakket freedoom stond als geïnstalleerd, maar bevatte geen enkel bestand. dpkg -L freedoom liet dat in één seconde zien. De WAD-bestanden heb ik daarom van de officiële release gehaald en tegen de meegeleverde checksum gecontroleerd.

Een script dat op zichzelf wachtte. Ik had een lus geschreven die wachtte tot een andere installatie klaar was, met pgrep -f "flatpak install ...". Die zoekt in de volledige opdrachtregel van alle processen, dus ook in die van de lus zelf. Hij vond zichzelf, en wachtte voor altijd. Als je met pgrep -f wacht, zorg dan dat je zoekpatroon niet in je eigen commando staat.

Wat de AI hier deed, en wat niet

Ik heb dit gebouwd met een AI-codeerassistent in mijn terminal. Die zocht uit wat RA3D precies is, las de broncode van de launcher om te zien hoe die het spel start, vond het build-endpoint en de ontbrekende markering, en schreef de scripts. Het werk dat je anders een avond kost, door forums en issue-lijsten te lezen.

Twee dingen deed hij niet, en dat hoort er eerlijk bij. Hij besliste niet wat er wel en niet in mocht: die grens stond vooraf vast, en daarom staat de 3D-versie van Tiberian Dawn er níét in. Die heeft graphics uit een Nintendo 64-cartridge nodig, en die krijg je niet legaal te pakken zonder je eigen cartridge. En hij kon de 3D-games niet op mijn scherm zien. Of iets echt speelt, bevestig je zelf.

Wil je dit met een gratis model doen? Alles hierboven is gewone shell, dus de tutorial zelf heeft geen AI nodig. Elke stap kun je met de hand doen. Een AI scheelt je het uitzoekwerk. Hoe goed een gratis model dat zoekwerk doet, heb ik niet getest, dus daar doe ik geen uitspraak over.

Zelf beginnen

Mijn volgorde, als je dit wilt nadoen:

  1. Kies je frontend en zet de ROM-map goed. Controleer dat eerst.
  2. Begin met wat gratis en self-contained is, zodat je stack bewezen is voordat je eigen data toevoegt.
  3. Geef elke Flatpak alleen toegang tot de map die hij nodig heeft.
  4. Controleer elke download tegen een checksum van de bron.
  5. Houd een logboek bij van wat je installeerde en waarom. Over een halfjaar weet je het anders niet meer.

Dan ga ik nu de Sovjets een lesje leren. In 3D.

Wilt u hierover sparren?

Plan een vrijblijvend kennismakingsgesprek en ontdek wat ik voor u kan betekenen.

Plan een gesprek →