Outcast 99
Un progetto per hobby al limite di ciò che è possibile
- Pubblicato
- Aggiornato
- (creato )
- Scritto da
- Willem L. Middelkoop
- Argomenti
- AI · gioco · programmazione · retro
- Versione umana di questo articolo
- https://willem.com/it/2026-10-12_outcast-99/
- English
- Outcast 99
- Nederlands
- Outcast 99
- Deutsch
- Outcast 99
- Español
- Outcast 99
- Français
- Outcast 99
- Português
- Outcast 99
- Papiamentu
- Outcast 99
- Frysk
- Outcast 99
- Lingue
- Tradotto dall’originale inglese da un modello linguistico in due passaggi (traduzione e correzione) con un glossario e un controllo ortografico; non ancora letto da un madrelingua.
Riassunto
Outcast (1999) è un'opera d'arte e uno dei miei giochi preferiti di sempre: Cutter Slade, il pianeta Adelpha, i suoi paesaggi voxel e la sua colonna sonora orchestrale. In tre giorni, con una squadra di agenti AI, l'ho portato in modo nativo sul mio laptop Linux, su iPad, iPhone e Apple Vision Pro, in 3D stereoscopico. Un progetto per hobby, niente in vendita, scritto con profondo rispetto per le persone che l'hanno creato e per chiunque sogni ancora Adelpha.
Testo completo
Un'opera d'arte, in anticipo sui tempi
Outcast è stato creato da Appeal in Belgio ed è uscito nel 1999. Era anni avanti rispetto al suo tempo. Un mondo aperto libero e vivo, due anni prima di Grand Theft Auto III. Un motore per i paesaggi che disegnava colline ondulate, acqua riflettente, profondità di campo e bump mapping interamente in software, su un Pentium III. Una colonna sonora di Lennie Moore, eseguita dalla Moscow Symphony Orchestra e dal suo coro, in un'epoca in cui la musica orchestrale nei giochi era rara. GameSpot lo nominò gioco d'avventura dell'anno.
E poi c'è l'AI. Appeal costruì per questo un proprio motore, chiamato GAIA: Game Artificial Intelligence with Agents. Ogni abitante di Adelpha era un insieme di agenti autonomi con abilità come vista, udito e acrobazia, che cooperavano e perfino competevano per portare a termine un compito. I soldati suonano i corni, cercano di aggirarti e ti cercano quando sparisci. I Talan ricordano come li hai trattati, e ti aiutano o ti voltano le spalle. Persino salvare la partita fa parte del mondo: stringi il tuo Gaamsaav, si illumina ed emette un suono, e le guardie vengono a guardare. Nel 1999!
L'ho comprato all'epoca, più di una volta. Anni dopo i fondatori originali, Yann Robert, Franck Sauer e Yves Grolet, hanno riacquistato i diritti e ricostruito il gioco dal suo codice sorgente originale come Outcast 1.1, con risoluzioni più alte e rendering su più thread. È la versione che ho comprato di nuovo su GOG, e quella da cui parte questo progetto. Se non l'hai mai giocato: compra Outcast 1.1 su GOG. E se vuoi vedere dove è andata Adelpha dopo, c'è Outcast: A New Beginning, fatto dallo stesso studio nel 2024.

Chiariamolo subito: questo è un progetto personale per hobby, un omaggio. Il port non è stato rilasciato e non lo sarà senza l'approvazione ufficiale dei suoi autori. Nessun codice, nessun dato del gioco e nessuna analisi escono da casa mia. Serve sempre la propria copia del gioco.
Cutter, vecchio amico
È cominciato una domenica mattina sul mio Framework 12 con Omarchy Linux. Outcast 1.1 girava sotto Wine, un livello di compatibilità per i programmi Windows, a circa 21 fotogrammi al secondo. Era un po' che non vedevo il mio amico Cutter Slade. Poi è arrivata la domanda: fin dove possiamo spingerci?

Più lontano di quanto pensassi. Invece di emulare il gioco, gli agenti hanno trasformato l'eseguibile Windows in codice C portabile: una ricompilazione statica. Ognuna delle sue 66.968 funzioni è diventata C, circa 48 MB. Intorno c'è un runtime scritto a mano che fa la parte di Windows: memoria, file, thread, DirectInput, DirectSound, la finestra grafica. NIENTE WINE, NIENTE EMULATORE!

Come funziona il lifting
Il lifter legge ogni istruzione x86 e scrive il C che fa esattamente la stessa cosa. Sembra semplice finché non incontri un motore intelligente come quello di Appeal. Usa istruzioni MMX e SSE per i paesaggi, virgola mobile x87 con modalità di arrotondamento proprie (la prima build nativa aveva difetti nei colori finché non le abbiamo modellate), e 62 punti in cui il codice si riscrive mentre gira, un classico trucco di un'epoca in cui ogni ciclo contava. Tutto questo ha richiesto estensioni nostre sopra il lifter open source da cui siamo partiti. Per essere sicuri che il C faccia ciò che faceva il processore, ogni forma di istruzione usata dal gioco è stata testata contro un emulatore di CPU, su Intel e su ARM.
La musica si è rivelata essere un'unica registrazione di 68 minuti che il motore riproduce per intervalli di tempo, con dissolvenze proprie. Così il runtime ha ricevuto un piccolo sostituto del livello multimediale di Windows che riproduce quegli intervalli nel mixer audio. La prima volta che la colonna sonora di Lennie Moore è tornata nella build nativa, è stato epico.
La velocità è venuta dal misurare, a ogni passo. Due punti caldi sul thread principale del gioco hanno avuto una sostituzione nativa: il decompressore dei pacchetti di dati del gioco e la routine che dipinge il cielo (da 2,15 ms a 0,37 ms per fotogramma, controllata byte per byte con l'originale su 1.200 fotogrammi). L'MMX è diventato vero codice vettoriale. E Outcast 1.1 già distribuisce il rendering su più thread, un grande motivo per cui vola sui chip moderni. Sul Framework 12 il gioco è passato da 21 fotogrammi al secondo sotto Wine a circa 76 in nativo. Sull'iPad Pro gira a circa 90.
Una squadra di agenti
Niente di tutto questo è scritto a mano. Tre sessioni di Claude Code hanno lavorato insieme come un piccolo studio: una sul laptop Linux per il ricompilatore e il runtime, una sul MacBook per Xcode e le build per iPad, iPhone e Vision Pro, e una sulla macchina del mio homelab che coordinava le altre due, passando appunti giorno e notte. Io giocavo, testavo e decidevo. È lo stesso assetto multi-agente che guida le pipeline di sviluppo native che ho costruito per app come Contact, e Outcast l'ha messo sotto pressione più di qualsiasi altra cosa prima. C'è una bella simmetria: un gioco i cui personaggi erano guidati da agenti nel 1999, portato su nuovi dispositivi da agenti nel 2026.

Questo significa anche token. Dopo sette ore di iterazioni senza sosta erano 180 milioni, alla fine del primo giorno 278 milioni, e il terzo giorno più di 1,4 miliardi. Altro che piccolo progetto per hobby. Ma ho imparato un sacco su motori di gioco, interazione e reinterpretazione di un'opera d'arte.
La velocità è il concetto
Un gioco in cui ti muovi dentro un mondo è un tipo speciale di software. In una pagina web qualche millisecondo di ritardo passa inosservato. In un gioco li senti tutti: i comandi diventano molli, la camera è in ritardo, la magia sparisce. L'ho imparato con Thinc Ahead 3D e Protect Your Eggs.
Nella realtà virtuale il margine è ancora più piccolo. Sul Vision Pro l'immagine deve seguire la testa, ogni occhio ha bisogno della sua immagine, e qualsiasi scatto va dritto allo stomaco. Questo richiede il meglio da una pipeline di sviluppo: misurare ogni fotogramma, non tirare mai a indovinare e tenere aperta la via del ritorno. Ogni ottimizzazione ha un interruttore che ripristina il comportamento originale, byte per byte.
Adelpha in 3D
Outcast disegna un'immagine piatta per fotogramma. Per ottenere il 3D stereoscopico, gli agenti sono andati a cercare nella memoria del gioco e hanno trovato ciò che il motore di Appeal conserva per ogni pixel: la sua distanza, accanto al suo colore. Con quella, la GPU costruisce un'immagine per ogni occhio: ogni pixel si sposta a sinistra o a destra in base alla sua profondità, i vuoti vengono riempiti e l'HUD resta alla profondità dello schermo. Costa circa 1,2 ms per fotogramma sulla GPU, e i paesaggi del 1999 improvvisamente hanno una vera profondità.


Guarda il filmato qui sotto: Outcast su Apple Vision Pro, giocato con un DualSense di PlayStation 5.
Sul Vision Pro il gioco gira come app visionOS nativa. La tela è sospesa nella tua stanza in 3D, e nella modalità immersiva il panorama del cielo del gioco ti circonda come una cupola che ruota insieme a Cutter. Stare sotto le lune di Adelpha è piuttosto intenso, e lo adoro.


Un'interfaccia nativa
Lo stereo ha un trabocchetto: il gioco disegna i menu e i testi delle conversazioni nella stessa immagine piatta, quindi in 3D finiscono sparpagliati nella scena. L'unica soluzione affidabile era dare all'interfaccia un livello tutto suo. Il runtime legge le conversazioni, lo zaino, gli appunti, le armi, la mappa e i menu del motore, e le app li disegnano in modo nativo: veri pulsanti che tocchi, guardi o selezioni con il controller. Le parole, le scelte e la logica restano di Appeal, con lo stesso tono e lo stesso ritmo. Lo zaino conosce tutti i 105 tipi di oggetto, con le icone e le didascalie del gioco.



Perfino le lettere sono quelle del gioco: il font bitmap originale del 1999 tracciato in contorni vettoriali morbidi, con il font di sistema per il testo piccolo.

Comandi
Ogni dispositivo si gioca in modo diverso, quindi ogni dispositivo ha i suoi comandi:
- iPad: il trackpad della Magic Keyboard ruota la camera, la tastiera muove Cutter. Stacca la tastiera e in pochi secondi appare un overlay touch: uno stick per muoversi, uno stick per guardarti intorno che continua a girare quando lo tieni al bordo, e pulsanti per azione, fuoco, salto e mira.
- iPhone: touch, in orizzontale, con l'interfaccia nativa adattata a uno schermo piccolo.
- Vision Pro: il DualSense di PlayStation 5, con i glifi PlayStation sui pulsanti e il click del touchpad per la mappa.
- Linux: tastiera e mouse, come nel 1999.

Un salvataggio, ogni dispositivo
Voglio smettere di giocare sul laptop e continuare sull'iPad, o nel visore, senza pensarci. Così gli agenti hanno costruito un sincronizzatore di salvataggi: un piccolo servizio su game.willem.com che tiene il salvataggio più recente. Stringi il Gaamsaav e lo slot viene inviato, verificato con un hash SHA-256; all'avvio il gioco recupera un salvataggio più recente da un altro dispositivo e riprende esattamente da dove avevi lasciato, come fa il pulsante "Continua" del launcher GOG. Vince sempre il salvataggio più recente e la cronologia viene conservata. Funziona perché i file di salvataggio sono identici byte per byte su ogni dispositivo: il motore è lo stesso ovunque.

Una sola base di codice, quattro piattaforme
Il runtime C è condiviso: Linux sul ramo principale, Apple su un ramo proprio che segue la linea principale. L'iPad e l'iPhone condividono un'unica app; il Vision Pro ha una propria app nativa in Swift e RealityKit attorno allo stesso motore. Il nome Outcast 99 è un omaggio ai miei giochi Snake '97 e Block 89.
| Dispositivo | Si gioca con | Velocità | |---|---|---| | Framework 12, Linux | Tastiera e mouse | Circa 76 fps (Wine: 21) | | iPad Pro M4 | Trackpad, tastiera o touch | Circa 90 fps | | iPhone | Touch | Fluido, in orizzontale | | Apple Vision Pro | DualSense | 3D stereoscopico, cielo immersivo |
Conclusione
Questo progetto è una lettera d'amore a un gioco che dopo 27 anni sembra ancora magia. Tutto ciò che lo rende speciale c'era già nel 1999: il mondo, gli agenti, la musica, la storia. Io ho solo portato tutto su un vetro nuovo. Grazie Yann Robert, Franck Sauer, Yves Grolet e tutti quelli di Appeal per aver creato Outcast. Se non hai mai visitato Adelpha, è un buon momento: compra il gioco, alza la musica e saluta i Talan da parte mia. Ulukai, IN 3D!
[action1]