Lingue: English · Nederlands · Deutsch · Español · Français · Italiano · Português · Papiamentu · Frysk

Indice / Articoli / Outcast 99

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.

Outcast 1.1 nella mia collezione GOG. Compra la tua copia!
Outcast 1.1 nella mia collezione GOG. Compra la tua copia!

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?

Cutter Slade sul mio Framework 12, la prima mattina
Cutter Slade sul mio Framework 12, la prima mattina

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!

Parlando con Zokrym, in esecuzione nativa su Linux: niente Wine, niente emulatore
Parlando con Zokrym, in esecuzione nativa su Linux: 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.

Primo giorno: caduto dalla sedia un paio di volte
Primo giorno: caduto dalla sedia un paio di volte

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à.

La prima tela nativa su Apple Vision Pro
La prima tela nativa su Apple Vision Pro
La tela nella mia stanza, con il menu nativo accanto
La tela nella mia stanza, con il menu nativo accanto

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.

Modalità immersiva: il cielo di Adelpha tutto intorno, lune comprese
Modalità immersiva: il cielo di Adelpha tutto intorno, lune comprese
Modalità immersiva su un'isola tropicale di Adelpha
Modalità immersiva su un'isola tropicale di Adelpha

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.

Una conversazione, con il livello di testo nativo in verde
Una conversazione, con il livello di testo nativo in verde
L'anello della conversazione come veri pulsanti
L'anello della conversazione come veri pulsanti
La schermata delle armi, disegnata in modo nativo
La schermata delle armi, disegnata in modo nativo

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.

Quattro modi per tracciare il font del 1999: ha vinto il contorno morbido
Quattro modi per tracciare il font del 1999: ha vinto il contorno morbido

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.
Il DualSense di PlayStation 5, il controller per Vision Pro
Il DualSense di PlayStation 5, il controller per Vision Pro

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.

Riprendi da dove avevi lasciato: lo stesso salvataggio sull'iPad
Riprendi da dove avevi lasciato: lo stesso salvataggio sull'iPad

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]

Formati per macchine di questa pagina