
Écrits · 12 oct. 2026
Outcast 99
Un projet de loisir aux frontières du possible
Outcast (1999) est une œuvre d'art, et l'un de mes jeux préférés de tous les temps : Cutter Slade, la planète Adelpha, ses paysages en voxels et sa bande originale orchestrale. En trois jours, avec une équipe d'agents IA, je l'ai porté en natif sur mon portable Linux, mon iPad, mon iPhone et mon Apple Vision Pro, en 3D stéréoscopique. Un projet de loisir, rien n'est à vendre, écrit avec un profond respect pour ceux qui l'ont fait, et pour tous ceux qui rêvent encore d'Adelpha.
Une œuvre d'art en avance sur son temps
Outcast a été créé par Appeal, en Belgique, et sorti en 1999. Il avait des années d'avance. Un monde ouvert libre et vivant, deux ans avant Grand Theft Auto III. Un moteur de paysages qui dessinait collines ondulantes, eau réfléchissante, profondeur de champ et bump mapping entièrement en logiciel, sur un Pentium III. Une bande originale de Lennie Moore, interprétée par l'Orchestre symphonique et le chœur de Moscou, à une époque où la musique de jeu orchestrale était rare. GameSpot l'a élu jeu d'aventure de l'année.
Et puis il y a l'IA. Appeal a construit pour cela son propre moteur, appelé GAIA : Game Artificial Intelligence with Agents. Chaque habitant d'Adelpha était un ensemble d'agents autonomes dotés de compétences comme la vue, l'ouïe et l'acrobatie, qui coopéraient et même se concurrençaient pour accomplir une tâche. Les soldats sonnent du cor, essaient de te prendre à revers et te cherchent quand tu disparais. Les Talan se souviennent de la façon dont tu les as traités, et t'aident ou te tournent le dos. Même la sauvegarde fait partie du monde : tu serres ton Gaamsaav, il s'illumine et émet un son, et les gardes viennent voir. En 1999 !
Je l'avais acheté à l'époque, plus d'une fois. Des années plus tard, les fondateurs d'origine, Yann Robert, Franck Sauer et Yves Grolet, ont racheté les droits et reconstruit le jeu à partir de son code source d'origine sous le nom d'Outcast 1.1, avec des résolutions plus élevées et un rendu sur plusieurs threads. C'est la version que j'ai rachetée sur GOG, et celle dont part ce projet. Si tu n'y as jamais joué : achète Outcast 1.1 sur GOG. Et si tu veux voir où Adelpha est allée ensuite, il y a Outcast: A New Beginning, fait par le même studio en 2024.

Que ce soit bien clair dès le départ : c'est un projet de loisir personnel, un hommage. Le portage n'est pas publié et ne le sera pas sans l'accord officiel de ses créateurs. Aucun code, aucune donnée de jeu et aucune analyse ne sortent de chez moi. Il te faut toujours ta propre copie du jeu.
Cutter, mon vieil ami
Tout a commencé un dimanche matin sur mon Framework 12 sous Omarchy Linux. Outcast 1.1 tournait sous Wine, une couche de compatibilité pour les programmes Windows, à environ 21 images par seconde. Ça faisait un moment que je n'avais pas vu mon ami Cutter Slade. Puis la question est venue : jusqu'où peut-on aller ?

Plus loin que je ne le pensais. Au lieu d'émuler le jeu, les agents ont transformé l'exécutable Windows en code C portable : une recompilation statique. Chacune de ses 66 968 fonctions est devenue du C, environ 48 Mo. Autour, un runtime écrit à la main joue le rôle de Windows : mémoire, fichiers, threads, DirectInput, DirectSound, la fenêtre graphique. PAS DE WINE, PAS D'ÉMULATEUR !

Comment fonctionne la conversion
Le lifter lit chaque instruction x86 et écrit le C qui fait exactement la même chose. Ça paraît simple, jusqu'à ce qu'on tombe sur un moteur aussi malin que celui d'Appeal. Il utilise des instructions MMX et SSE pour ses paysages, de la virgule flottante x87 avec ses propres modes d'arrondi (le premier build natif avait des défauts de couleur tant qu'on ne les avait pas modélisés), et 62 endroits où le code se réécrit lui-même pendant qu'il tourne, une astuce classique d'une époque où chaque cycle comptait. Tout cela a demandé ses propres extensions par-dessus le lifter open source dont nous sommes partis. Pour être sûrs que le C fait ce que faisait le processeur, chaque forme d'instruction utilisée par le jeu a été testée contre un émulateur de CPU, sur Intel et sur ARM.
La musique s'est révélée être un seul enregistrement de 68 minutes que le moteur joue par plages de temps, avec ses propres fondus. Le runtime a donc reçu un petit substitut de la couche média de Windows qui envoie ces plages au mixeur audio. La première fois que la partition de Lennie Moore est revenue dans le build natif, c'était assez épique.
La vitesse est venue de la mesure, à chaque étape. Deux points chauds du thread principal du jeu ont reçu un remplaçant natif : le décompresseur des paquets de données du jeu et la routine qui peint le ciel (de 2,15 ms à 0,37 ms par image, vérifié octet par octet par rapport à l'original sur 1 200 images). Le MMX est devenu du vrai code vectoriel. Et Outcast 1.1 répartit déjà son rendu sur plusieurs threads, ce qui explique en grande partie pourquoi il vole sur les puces modernes. Sur le Framework 12, le jeu est passé de 21 images par seconde sous Wine à environ 76 en natif. Sur l'iPad Pro, il tourne à environ 90.
Une équipe d'agents
Rien de tout cela n'est tapé à la main. Trois sessions de Claude Code ont travaillé ensemble comme un petit studio : une sur le portable Linux pour le recompilateur et le runtime, une sur le MacBook pour Xcode et les builds iPad, iPhone et Vision Pro, et une sur la machine de mon homelab qui coordonnait les deux, en relayant des notes jour et nuit. Moi, je jouais, je testais et je décidais. C'est le même dispositif multi-agents qui anime les pipelines de développement natif que j'ai construits pour des applis comme Contact, et Outcast l'a poussé plus fort que tout avant lui. Il y a là une jolie symétrie : un jeu dont les personnages étaient pilotés par des agents en 1999, porté sur de nouveaux appareils par des agents en 2026.

Cela veut dire aussi des tokens. Après sept heures d'itérations sans interruption, on en était à 180 millions, à la fin du premier jour à 278 millions, et le troisième jour à plus de 1,4 milliard. Voilà pour un petit projet de loisir. Mais j'ai énormément appris sur les moteurs de jeu, l'interaction et la réinterprétation d'une œuvre d'art.
La vitesse est le concept
Un jeu où l'on se déplace dans un monde est un type de logiciel à part. Dans une page web, quelques millisecondes de retard passent inaperçues. Dans un jeu, tu les sens toutes : les commandes deviennent molles, la caméra traîne, la magie disparaît. Je l'ai appris avec Thinc Ahead 3D et Protect Your Eggs.
En réalité virtuelle, la marge est plus petite encore. Sur le Vision Pro, l'image doit suivre ta tête, chaque œil a besoin de sa propre image, et la moindre saccade va droit à l'estomac. Cela exige le meilleur d'un pipeline de développement : mesurer chaque image, ne jamais deviner, et garder le chemin du retour ouvert. Chaque optimisation a un interrupteur qui rétablit le comportement d'origine, octet pour octet.
Adelpha en 3D
Outcast dessine une image plate par image. Pour obtenir de la 3D stéréoscopique, les agents sont allés fouiller dans la mémoire du jeu et ont trouvé ce que le moteur d'Appeal garde pour chaque pixel : sa distance, juste à côté de sa couleur. Avec cela, le GPU construit une image pour chaque œil : chaque pixel se décale vers la gauche ou la droite selon sa profondeur, les trous sont comblés, et l'interface reste à la profondeur de l'écran. Cela coûte environ 1,2 ms par image sur le GPU, et les paysages de 1999 ont soudain une vraie profondeur.


Regarde les images ci-dessous : Outcast sur Apple Vision Pro, joué avec une DualSense de PlayStation 5.
Sur le Vision Pro, le jeu tourne comme une appli visionOS native. Le canevas flotte dans ta pièce en 3D, et en mode immersif, le panorama du ciel du jeu t'entoure comme un dôme qui tourne avec Cutter. Se tenir sous les lunes d'Adelpha est assez intense, et j'adore ça.


Une interface native
La stéréo a un hic : le jeu dessine ses menus et ses textes de conversation dans la même image plate, si bien qu'en 3D ils se retrouvent éparpillés dans la scène. La seule solution fiable était de donner à l'interface sa propre couche. Le runtime lit les conversations, le sac à dos, les notes, les armes, la carte et les menus du moteur, et les applis les dessinent en natif : de vrais boutons que tu touches, regardes ou sélectionnes avec la manette. Les mots, les choix et la logique restent ceux d'Appeal, avec le même ton et le même rythme. Le sac à dos connaît les 105 types d'objets, avec les icônes et les légendes du jeu.



Même les lettres sont celles du jeu : la police bitmap d'origine de 1999, vectorisée en contours lisses, avec la police système pour les petits textes.

Les commandes
Chaque appareil se joue différemment, alors chaque appareil a ses propres commandes :
- iPad : le trackpad du Magic Keyboard fait tourner la caméra, le clavier déplace Cutter. Détache le clavier et une surcouche tactile apparaît en quelques secondes : un stick pour se déplacer, un stick de visée qui continue de tourner quand tu le tiens au bord, et des boutons pour l'action, le tir, le saut et la visée.
- iPhone : tactile, en paysage, avec l'interface native adaptée à un petit écran.
- Vision Pro : la DualSense de PlayStation 5, avec les glyphes PlayStation sur les boutons et le clic du pavé tactile pour la carte.
- Linux : clavier et souris, comme en 1999.

Une sauvegarde, tous les appareils
Je veux pouvoir arrêter de jouer sur le portable et continuer sur l'iPad, ou dans le casque, sans y penser. Les agents ont donc construit un synchroniseur de sauvegardes : un petit service sur game.willem.com qui garde la plus récente. Serre le Gaamsaav et l'emplacement est envoyé, vérifié avec un hash SHA-256 ; au démarrage, le jeu récupère une sauvegarde plus récente d'un autre appareil et reprend exactement là où tu t'étais arrêté, comme le fait le bouton « Continuer » du lanceur GOG. La sauvegarde la plus récente l'emporte toujours et l'historique est conservé. Ça marche parce que les fichiers de sauvegarde sont identiques octet pour octet sur chaque appareil : le moteur est le même partout.

Une base de code, quatre plateformes
Le runtime C est partagé : Linux sur la branche principale, Apple sur sa propre branche qui suit la ligne principale. L'iPad et l'iPhone partagent une seule appli ; le Vision Pro a sa propre appli native en Swift et RealityKit autour du même moteur. Le nom Outcast 99 est un clin d'œil à mes propres jeux Snake '97 et Block 89.
| Appareil | Se joue avec | Vitesse |
|---|---|---|
| Framework 12, Linux | Clavier et souris | Environ 76 i/s (Wine : 21) |
| iPad Pro M4 | Trackpad, clavier ou tactile | Environ 90 i/s |
| iPhone | Tactile | Fluide, en paysage |
| Apple Vision Pro | DualSense | 3D stéréoscopique, ciel immersif |
Conclusion
Ce projet est une lettre d'amour à un jeu qui garde un air de magie, 27 ans plus tard. Tout ce qui le rend spécial était là en 1999 : le monde, les agents, la musique, l'histoire. Je n'ai fait que le porter sur de nouvelles vitres. Merci Yann Robert, Franck Sauer, Yves Grolet et tous ceux d'Appeal d'avoir fait Outcast. Si tu n'as jamais visité Adelpha, c'est le bon moment : achète le jeu, monte le son, et dis bonjour aux Talan de ma part. Ulukai, EN 3D !