1 points par GN⁺ 4 시간 전 | 1 commentaires | Partager sur WhatsApp
  • 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.sh est 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 --install
    • brew install cmake ninja meson pkgconf
    • brew install --cask steamcmd
    • clonage complet de vcpkg et configuration de VCPKG_ROOT
    • installation du SDK Vulkan LunarG et configuration de VULKAN_SDK
  • vcpkg né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/GeneralsZH et de run.sh
    • ./scripts/get-assets.sh <your_steam_username> : récupération des données du jeu appartenant à l’utilisateur
    • cd ~/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, xcodegen et 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.sh récupère une version figée de MoltenVK.framework avec checksum
    • ./scripts/build/ios/stage-fonts.sh prépare les polices Liberation Fonts sous les noms attendus par le jeu
    • build via cmake --preset ios-vulkan et cmake --build build/ios-vulkan --target z_generals
  • Pour le packaging et l’installation, il faut définir GX_TEAM_ID et GX_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 Apple
  • docs/port/RELEASE_CHECKLIST.md : gates de publication publique
  • scripts/get-assets.sh : script de récupération des ressources Steam appartenant à l’utilisateur
  • scripts/build/macos/, scripts/build/ios/ : pipelines de build, déploiement et packaging
  • ios/ : projet stub de signature XcodeGen et fichiers Options.ini, dxvk.conf préparés dans ios/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

 
GN⁺ 4 시간 전
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à

    • Je ne comprends pas très bien la remarque sur Bun. Bun exécute probablement Claude Code, qui est aujourd’hui l’une des applis de développement les plus utilisées
      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
    • Le modèle a fait le travail, et il avait probablement l’ensemble du projet dans sa fenêtre de contexte, donc il est peut-être même mieux placé pour rédiger la documentation ici
    • Dire que c’est un « bon usage où un humain guide le modèle pour faire une conversion de masse », c’est encore trop faible. C’est peut-être la litote de l’année
      « 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 code
    Ils 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

    • Moi aussi, je fais parfois ça
      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, et lawn chair a aussi l’air bizarre, donc lawn-chair devient un compromis
    • C’est vraiment pénible. J’ai essayé de l’interdire dans AGENTS.md, mais ce n’est pas efficace à 100 %
      ## Des mots simples, pas du jargon
      J’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 monde
      J’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 yes
      Si 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
    • Peut-être que les LLM sont simplement allemands
    • Je parle et j’écris déjà plutôt bien anglais pour un non-natif, mais c’est justement le plus gros obstacle avec Claude
      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
    • La sur-hyphénation, c’est de l’hyperfixation-sur-l’IA
  • 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

    • Quelque chose de similaire est aussi en cours côté Renegade, mais comme tout est refait depuis zéro sur un autre moteur, ça semble tout à fait faisable
    • Ce jeu tourne tellement mal sur les versions récentes de Windows qu’il lui faudrait un rétroportage Winx64
    • Oui. En pratique, ce que Fable a fait, c’est porter vers iOS un projet qui était déjà multiplateforme
      Ç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

    • Fable devrait essayer avant le 7 juillet, date à laquelle il disparaîtra du prix de l’abonnement à Claude Code
    • C’était l’un des meilleurs jeux de stratégie en temps réel de son époque, et il reste encore très correct aujourd’hui. La musique était aussi excellente
    • Je vais peut-être essayer
    • Ce n’est pas plutôt Dune 2000 ? https://www.openra.net/download/#linux
    • J’adorais ce jeu. C’était le premier STR auquel j’ai joué
  • 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

    • Quand il commence à lire les parties du code sur la faction chinoise et la faction terroriste, ça paraît vraiment plausible
  • Comment peut-on dire que « Fable a été utilisé » alors que le premier commit date de février de l’an dernier ?

    • Ils ont forké GeneralsX puis n’ont ajouté que les derniers commits
    • Ça n’a probablement pas été fait uniquement avec Fable
    • Ce n’est pas ça, c’est juste un énième billet de marketing gratuit pour Anthropic
  • 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

    • J’ai fait un travail similaire sur quelques vieux jeux que j’aime bien, mais l’affirmation « identique octet pour octet » m’inquiète
      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

    • Ce projet est un fork et l’essentiel du travail réel consiste à ajouter la prise en charge d’iOS
      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.