Portage natif de Command & Conquer Generals sur macOS, iPhone et iPad avec Fable
(github.com/ammaarreshi)- Command & Conquer Generals: Zero Hour fonctionne sans émulation sur les Mac Apple Silicon, iPhone et iPad, ce qui permet de jouer directement à ce RTS classique sur les appareils Apple récents
- L’élément central est la compilation ARM64 du véritable moteur de 2003 ; les graphismes sont convertis via la chaîne DirectX 8 → DXVK → Vulkan → MoltenVK → Metal
- Basé sur la publication du code source par EA sous GPL v3 et sur le port macOS/Linux GeneralsX, ce fork ajoute la prise en charge d’iOS/iPadOS et des modifications du moteur
- Les ressources du jeu ne sont pas incluses : il faut importer soi-même les données d’une copie que l’on possède, par exemple depuis Steam
- Les longues sessions sur iPad peuvent être interrompues en raison d’une résidence mémoire d’environ 3 Go ou plus, et des plantages lors du passage en arrière-plan sous iOS restent possibles ; il faut donc sauvegarder souvent
Le véritable moteur de Zero Hour tourne sur les appareils Apple
- Zero Hour s’exécute nativement sur Mac Apple Silicon, iPhone et iPad
- Les modes campagne, escarmouche et Generals Challenge sont pris en charge
- Des contrôles tactiles pour RTS sont inclus
- sélection par toucher
- sélection par cadre glissé
- appui long pour désélectionner
- défilement à deux doigts
- zoom par pincement
- Le mode d’exécution n’est pas de l’émulation, mais une compilation ARM64 du véritable moteur de 2003
- Le rendu suit la chaîne DirectX 8 → DXVK → Vulkan → MoltenVK → Metal
Périmètre du fork basé sur GeneralsX
- Le code du moteur repose sur la publication du code source par EA sous GPL v3
- Le port de base est fbraz3/GeneralsX, et l’essentiel du travail de portage macOS/Linux a été réalisé dans GeneralsX
- Ce fork ajoute le port iOS/iPadOS et des modifications du moteur
- Le README original de GeneralsX se trouve dans la branche
upstream-main
Les ressources du jeu doivent être fournies par l’utilisateur
- Les ressources du jeu ne sont ni incluses ni distribuées
- L’utilisateur doit disposer de sa propre copie du jeu
- Un lien Steam est fourni, avec l’indication d’un prix d’environ 5 dollars pendant les promotions
scripts/get-assets.shest un script qui récupère les données du jeu Steam appartenant à l’utilisateur ; l’ID d’application cible est 2732960
Flux de build et d’exécution sur macOS
- Le build macOS nécessite quelques préparatifs à effectuer une seule fois
xcode-select --installbrew install cmake ninja meson pkgconfbrew install --cask steamcmd- clonage complet de
vcpkget configuration deVCPKG_ROOT - installation du SDK Vulkan LunarG et configuration de
VULKAN_SDK
vcpkgnécessite un clonage complet, car un clone superficiel peut casser la baseline du manifeste- Il faut utiliser le SDK Vulkan LunarG, et non le cask Homebrew du SDK Vulkan
- Après avoir cloné le dépôt, les scripts suivants s’exécutent dans l’ordre
./scripts/build/macos/build-macos-zh.sh: vérification des dépendances, configuration, build./scripts/build/macos/deploy-macos-zh.sh: création de~/GeneralsX/GeneralsZHet derun.sh./scripts/get-assets.sh <your_steam_username>: récupération des données du jeu appartenant à l’utilisateurcd ~/GeneralsX/GeneralsZH && ./run.sh -win: exécution
Conditions de build pour iPhone et iPad
- Le build iOS/iPadOS nécessite, en plus des prérequis macOS, une installation complète de Xcode, une connexion avec un Apple ID,
xcodegenet une team Apple Developer - Le processus de build se compose des éléments suivants
- initialisation du sous-module
references/fbraz3-dxvk - DXVK pour iOS est buildé depuis ce sous-module et
Patches/dxvk-ios.patch ./scripts/build/ios/fetch-moltenvk.shrécupère une version figée de MoltenVK.framework avec checksum./scripts/build/ios/stage-fonts.shprépare les polices Liberation Fonts sous les noms attendus par le jeu- build via
cmake --preset ios-vulkanetcmake --build build/ios-vulkan --target z_generals
- initialisation du sous-module
- Pour le packaging et l’installation, il faut définir
GX_TEAM_IDetGX_BUNDLE_ID, puis exécuter./scripts/build/ios/package-ios-zh.sh --install - Le Team ID se trouve dans Xcode → Settings → Accounts
- Les ressources sont incluses dans le bundle de l’app, ce qui produit une installation autonome ;
--devévite la copie d’environ 2,7 Go afin d’accélérer les itérations de code
Fichiers et documents intéressants dans le dépôt
docs/port/PORTING_PLAYBOOK.md: journal d’ingénierie complet du port, qui consigne les modes d’échec, causes racines et correctifs- §8 bug archaeology couvre la minimap noire, les répliques EVA muettes et les problèmes de chirp
docs/port/PORTING_PATTERNS.md: méthodologie généralisée pour porter des jeux Windows classiques vers les plateformes Appledocs/port/RELEASE_CHECKLIST.md: gates de publication publiquescripts/get-assets.sh: script de récupération des ressources Steam appartenant à l’utilisateurscripts/build/macos/,scripts/build/ios/: pipelines de build, déploiement et packagingios/: projet stub de signature XcodeGen et fichiersOptions.ini,dxvk.confpréparés dansios/config/Patches/dxvk-ios.patch: modifications DXVK utilisées pour builder les dylib d3d8/d3d9 sur iOS
Contraintes encore présentes
- Sur iPad, les longues sessions peuvent être arrêtées par iOS lorsque l’app atteint une résidence mémoire d’environ 3 Go ou plus
- Dans ce cas, l’app revient à l’écran d’accueil sans boîte de dialogue
- Les journaux de la session actuelle et de la session précédente se trouvent dans le dossier du jeu de l’app Fichiers
- Le problème est en cours d’investigation
- Sous iOS, le passage en arrière-plan pendant une partie peut parfois provoquer un plantage
- La pause du cycle de vie gère les chemins habituels
- De rares conditions de course subsistent, il faut donc sauvegarder souvent
Licence et méthode de réalisation
- Le code du moteur est sous GPL v3, selon le flux publication du code source EA → GeneralsX → ce fork
- Les ressources du jeu ne sont pas incluses et ne font pas l’objet d’une licence ici
- Les crédits incluent Westwood/EA Pacific, EA, fbraz3/GeneralsX, TheSuperHackers/GeneralsGameCode, DXVK, MoltenVK, SDL, OpenAL Soft, FFmpeg et Liberation Fonts
- Le port a été réalisé par une collaboration humain+IA
- L’ingénierie a été assurée par Claude Code, c’est-à-dire le modèle Claude Fable d’Anthropic
- Ammaar Reshi a défini l’orientation et effectué les tests sur appareils réels
- Les journaux d’ingénierie dans
docs/port/constituent un enregistrement non édité de cette méthode de travail
1 commentaires
Avis Hacker News
Cela semble être un très bon cas d’usage où un humain guide le modèle pour effectuer une conversion de masse
Cela dit, la documentation du portage aurait mérité un peu de retouche humaine. Le style généré par l’IA est agaçant
Le coût est faible, c’est surtout fait pour le plaisir, et on peut améliorer ça de manière itérative. Ce n’est pas comme Bun qui disait « on a tout remplacé de Zig vers Rust, bien sûr ça tourne très bien, on peut bientôt mettre ça en production, et on écrira aussi un billet de blog sur ce qu’on a fait », sauf que ce billet n’est toujours pas là
On dit que c’est un mauvais usage des LLM, mais c’est déjà utilisé en production depuis un moment, et je n’ai entendu aucune preuve montrant que Claude Code aurait entraîné une hausse significative des bugs ou des segfaults par rapport à avant
« Assez correct, pas mal, un bon cas d’usage. » Qu’est-ce que Fable a bien pu accomplir au juste
Des expressions comme
(tap-select, drag-box, long-press deselect, two-finger scroll, pinch zoom)relèvent aussi d’une autre tournure typiquement IA qu’on voit souvent chez les agents de codeIls semblent aimer condenser des concepts relativement complexes et précis en nouvelles locutions composées, voire parfois en verbes, comme si c’étaient des expressions d’un seul mot. Je ne sais pas si c’est pour économiser des tokens ou pour fabriquer des identifiants concis réutilisables plus tard, mais c’est très visible
Les phrases produites sont dures à lire, mais une fois qu’on connaît cette tendance et qu’on pense consciemment à parser ces groupes nominaux, ça passe un peu mieux. Cela dit, comme il s’agit d’un livrable intermédiaire d’agent de code et non d’un essai ou d’un billet de blog, ça me paraît acceptable
Dans certaines langues germaniques, c’est normal. Instinctivement, j’ai envie de coller les noms pour former quelque chose comme
lawnchair, mais le correcteur le souligne, etlawn chaira aussi l’air bizarre, donclawn-chairdevient un compromis## Des mots simples, pas du jargonJ’indique qu’il faut éviter le jargon abrégé et dire explicitement ce qu’on veut dire
Par exemple, au lieu de « load-bearing assumptions », écrire « les hypothèses dont xyz dépend », et au lieu de « cross-service », nommer directement les services X et Y
J’interdis aussi les jugements formulés comme des groupes nominaux abstraits du type « Cross-RCA double-counting is unfounded », et je demande d’écrire plutôt quelque chose comme « nous avons vérifié si la même cause racine était comptée deux fois entre deux exécutions de RCA, et ce n’était pas le cas »
## Pas de déclarations qui secouent le mondeJ’enlève les exagérations du genre « une découverte importante change tout », « nous voyons maintenant l’ensemble du tableau » ou « c’est un game changer », et je demande de décrire simplement ce qui a été constaté
## Ne pas nuancer machinalement un yesSi la réponse est yes, il faut dire yes. Ajouter une réserve à chaque réponse positive affaiblit inutilement le niveau de confiance ; je ne veux une nuance que lorsqu’il existe une incertitude concrète
Il assemble 2 à 4 concepts avancés en un ou deux mots, et je dois sans cesse lui demander de développer. Ce n’est sans doute pas évident non plus pour un natif, mais pour un non-natif c’est encore plus difficile
Le point essentiel, c’est que cela a été construit au-dessus de fbraz3/GeneralsX, lui-même basé sur la version du code source publiée par EA sous GPL v3. Le gros du travail de portage macOS/Linux a été fait par GeneralsX, et ce fork ajoute surtout le portage iOS/iPadOS ainsi que quelques modifications du moteur
Ça n’a pas l’air d’avoir nécessité un effort extraordinaire, et Opus 4.6 aurait probablement suffi
Je me demande si cette technique pourrait aussi être utile pour Emperor: Battle for Dune (2001)
C’était le premier jeu de stratégie en temps réel 3D de Westwood Studios, et il est sorti quelques années avant C&C Generals. Sa popularité a été limitée par des litiges autour de la propriété intellectuelle et par l’ajout de nouvelles factions absentes de l’univers original, mais le gameplay, la bande-son et les missions de campagne étaient excellents
J’ai passé un nombre incalculable d’heures sur ce jeu quand j’étais enfant, et avec le temps il est devenu de plus en plus difficile d’y rejouer à mesure que la technologie dépassait sa plateforme d’origine
Si c’est entre les mains de fans dévoués, c’est un bon usage possible de l’IA. Si j’ai le temps, j’aimerais aussi expérimenter avec des cartes ou des unités créées par les joueurs. La communauté de modding de C&C Generals a toujours été assez active
Pour les autres idiots qui tomberont là-dessus après moi : l’erreur ci-dessous signifie que vous n’avez pas acheté le jeu sur Steam
"ERROR! Failed to install app '2732960' (No subscription)"Bien sûr, c’est déjà écrit dans le README
Fable n’a pas pu faire ça. Il a dû s’arrêter sur les mots « command and conquer », rétrograder vers Opus, et probablement vous inscrire en même temps sur une liste de surveillance de la NSA
Comment peut-on dire que « Fable a été utilisé » alors que le premier commit date de février de l’an dernier ?
De façon similaire, j’utilise aussi l’IA pour « open sourcer » Battle for Middle Earth sur le même moteur : https://github.com/dginovker/BFME-Source-Code
Décompiler simplement le binaire pour republier le code source, ce n’est pas problématique ?
Ce n’est pas une méthode en clean room, et les entreprises pourraient toujours invoquer une violation du droit d’auteur et faire retirer le projet
Le titre est trompeur
Le travail a commencé en février, et si on regarde les commits, Fable n’a fait qu’une petite partie des plus récents. 19 commits sur 2000 : https://github.com/ammaarreshi/Generals-Mac-iOS-iPad/commits/main
En plus, ce n’était peut-être même pas Fable. Ça a aussi pu être rétrogradé vers Opus
Ce genre de désinformation répétée me rend sceptique face aux affirmations d’Anthropic sur ses LLM. Dans les workflows de développement web, c’est du coude-à-coude avec GPT 5.5, et Fable que j’ai recommencé à tester après sa réactivation m’a donné la même impression
N’importe quel bon LLM aurait sans doute pu faire ce portage. Même quelque chose comme GLM 5.2 aurait pu y arriver, et ça aurait peut-être même été mieux puisqu’il ne passe pas son temps à se demander si je suis un terroriste essayant de pirater le gouvernement ou de fabriquer une arme biologique
Les gens manquent de ressources pour comparer les LLM, donc ils laissent facilement entendre que le modèle qu’ils utilisent est le meilleur de tous les temps et qu’il ouvre un workflow entièrement nouveau. Depuis Opus 4.6, je n’ai pratiquement vu aucune amélioration
Les commits du propriétaire du fork commencent il y a 19 heures, donc il est tout à fait plausible que cette partie ait été faite avec Fable. En revanche, je ne vois pas du tout clairement si l’ajout du support iOS était une tâche que les anciens modèles ne pouvaient pas faire et que seul Fable pouvait accomplir.