Command & Conquer Generals nativ mit Fable auf macOS, iPhone und iPad portiert
(github.com/ammaarreshi)- Command & Conquer Generals: Zero Hour läuft ohne Emulation auf Apple-Silicon-Macs, iPhone und iPad, sodass sich der klassische RTS-Titel direkt auf modernen Apple-Geräten spielen lässt
- Kernstück ist eine ARM64-Kompilierung der tatsächlichen Engine von 2003; die Grafik wird über den Pfad DirectX 8 → DXVK → Vulkan → MoltenVK → Metal umgesetzt
- Basierend auf EAs GPL-v3-Source-Release und dem macOS/Linux-Port GeneralsX ergänzt dieser Fork iOS/iPadOS-Unterstützung und Engine-Anpassungen
- Spiel-Assets sind nicht enthalten; die Daten müssen daher aus einer eigenen Kopie etwa von Steam selbst eingebracht werden
- Längere iPad-Sitzungen können wegen rund 3 GB oder mehr residentem Speicher beendet werden; auch mögliche Abstürze beim Wechsel in den iOS-Hintergrund bleiben bestehen, daher sollte häufig gespeichert werden
Die echte Zero-Hour-Engine auf Apple-Geräten
- Zero Hour läuft nativ auf Apple-Silicon-Macs, iPhone und iPad
- Unterstützt werden Kampagne, Skirmish und der Modus Generals Challenge
- Touch-Steuerung für RTS ist enthalten
- Antippen zum Auswählen
- Auswahlrahmen per Ziehen
- Langes Drücken zum Abwählen
- Scrollen mit zwei Fingern
- Pinch-Zoom
- Die Ausführung erfolgt nicht per Emulation, sondern als ARM64-Kompilierung der tatsächlichen Engine von 2003
- Das Rendering läuft in der Reihenfolge DirectX 8 → DXVK → Vulkan → MoltenVK → Metal
Umfang des auf GeneralsX basierenden Forks
- Der Engine-Code basiert auf EAs GPL-v3-Source-Release
- Grundlage ist der Port fbraz3/GeneralsX; die wesentliche Arbeit am macOS/Linux-Port wurde in GeneralsX geleistet
- Dieser Fork ergänzt den iOS/iPadOS-Port sowie Engine-Korrekturen
- Das ursprüngliche GeneralsX-README liegt im Branch
upstream-main
Spiel-Assets müssen Nutzer selbst bereitstellen
- Spiel-Assets sind nicht enthalten und werden nicht verteilt
- Nutzer benötigen ihre eigene Spielkopie
- Es wird ein Steam-Link bereitgestellt; bei Sales wird ein Preis von rund 5 US-Dollar genannt
scripts/get-assets.shist ein Skript, das die Steam-Spieldaten aus dem Besitz des Nutzers abruft; die Ziel-App-ID lautet 2732960
macOS-Build und Ablauf zum Starten
- Für den macOS-Build sind einmalige Vorbereitungen nötig
xcode-select --installbrew install cmake ninja meson pkgconfbrew install --cask steamcmd- Vollständiger Klon von
vcpkgund Setzen vonVCPKG_ROOT - Installation des LunarG Vulkan SDK und Setzen von
VULKAN_SDK
- Für
vcpkgist ein vollständiger Klon erforderlich, da bei einem Shallow Clone die Manifest-Baseline brechen kann - Beim Vulkan SDK muss das LunarG Vulkan SDK verwendet werden, nicht das Homebrew-Cask
- Nach dem Klonen des Repositorys werden die folgenden Skripte der Reihe nach ausgeführt
./scripts/build/macos/build-macos-zh.sh: Abhängigkeiten prüfen, konfigurieren, bauen./scripts/build/macos/deploy-macos-zh.sh:~/GeneralsX/GeneralsZHundrun.sherstellen./scripts/get-assets.sh <your_steam_username>: Spieldaten aus dem Besitz des Nutzers abrufencd ~/GeneralsX/GeneralsZH && ./run.sh -win: starten
Build-Voraussetzungen für iPhone und iPad
- Für den iOS/iPadOS-Build werden zusätzlich zu den macOS-Vorbereitungen die vollständige Xcode-Installation, ein angemeldeter Apple-ID-Account,
xcodegenund ein Apple-Developer-Team benötigt - Der Build-Prozess besteht aus folgenden Elementen
- Initialisierung des Submoduls
references/fbraz3-dxvk - DXVK für iOS wird aus diesem Submodul und
Patches/dxvk-ios.patchgebaut - Mit
./scripts/build/ios/fetch-moltenvk.shwird eine festgelegte Version von MoltenVK.framework mit Prüfsumme abgerufen - Mit
./scripts/build/ios/stage-fonts.shwerden Liberation Fonts unter den vom Spiel erwarteten Namen vorbereitet - Gebaut wird mit
cmake --preset ios-vulkanundcmake --build build/ios-vulkan --target z_generals
- Initialisierung des Submoduls
- Für Paketierung und Installation werden
GX_TEAM_IDundGX_BUNDLE_IDgesetzt, danach wird./scripts/build/ios/package-ios-zh.sh --installausgeführt - Die Team ID findet man in Xcode → Settings → Accounts
- Die Assets werden in das App-Bundle aufgenommen, sodass eine eigenständige Installation entsteht;
--devüberspringt für schnelle Code-Iterationen das Kopieren von rund 2,7 GB
Interessante Dateien und Dokumente im Repository
docs/port/PORTING_PLAYBOOK.md: vollständiges Engineering-Log des Ports, das Fehlermodi, Ursachen und Korrekturen dokumentiert- §8 bug archaeology behandelt schwarze Minimap, stumme EVA-Sprachausgaben und Chirp-Probleme
docs/port/PORTING_PATTERNS.md: verallgemeinerte Methodik zum Portieren klassischer Windows-Spiele auf Apple-Plattformendocs/port/RELEASE_CHECKLIST.md: Gates für öffentliche Releasesscripts/get-assets.sh: Skript zum Abrufen der Steam-Assets aus dem Besitz des Nutzersscripts/build/macos/,scripts/build/ios/: Build-, Deployment- und Packaging-Pipelinesios/: XcodeGen-Signatur-Stub-Projekt sowie vorbereiteteOptions.iniunddxvk.confinios/config/Patches/dxvk-ios.patch: DXVK-Änderungen, die zum Bau der iOS-d3d8/d3d9-dylibs verwendet werden
Noch bestehende Einschränkungen
- Lange Sitzungen auf dem iPad können bei rund 3 GB oder mehr residentem Speicher von iOS beendet werden
- In diesem Fall landet die App ohne Dialog auf dem Homescreen
- Logs der aktuellen und vorherigen Sitzung liegen im Spielordner der Files-App
- Dieses Problem wird derzeit untersucht
- Wenn unter iOS während des Spiels in den Hintergrund gewechselt wird, kann es gelegentlich zu Abstürzen kommen
- Die Lifecycle-Pausierung behandelt die üblichen Pfade
- Es bleiben seltene Race Conditions, daher sollte häufig gespeichert werden
Lizenz und Entstehungsweise
- Der Engine-Code steht unter GPL v3; der Weg ist EA-Source-Release → GeneralsX → dieser Fork
- Spiel-Assets sind nicht enthalten und werden hier nicht lizenziert
- Die Credits umfassen Westwood/EA Pacific, EA, fbraz3/GeneralsX, TheSuperHackers/GeneralsGameCode, DXVK, MoltenVK, SDL, OpenAL Soft, FFmpeg und Liberation Fonts
- Der Port entstand in Zusammenarbeit von Mensch und KI
- Das Engineering übernahm Claude Code, konkret Anthropics Claude-Fable-Modell
- Ammaar Reshi gab auf echten Geräten die Richtung vor und führte Playtests durch
- Die Engineering-Logs in
docs/port/sind ein unbearbeiteter Mitschnitt dieser Arbeitsweise
1 Kommentare
Meinungen auf Hacker News
Das wirkt wie ein ziemlich guter Use Case dafür, dass ein Mensch ein Modell anleitet, um eine Massenkonvertierung durchzuführen.
Allerdings fände ich es gut, wenn die Portierungsdokumentation von einem Menschen etwas überarbeitet würde. Der KI-generierte Stil stört.
Die Hürde ist niedrig, es ist größtenteils etwas, das man aus Spaß macht, und iterative Verbesserungen sind möglich. Das ist etwas anderes als die Situation bei Bun, wo es hieß: „Wir haben alles von Zig auf Rust umgestellt, es läuft natürlich gut, kann bald in Produktion gehen, und wir schreiben auch noch einen Blogpost darüber, was wir gemacht haben“ – nur dass dieser Beitrag bis heute nicht existiert.
Das wird als Beispiel für schlechten LLM-Einsatz genannt, aber es läuft schon seit einer Weile in Produktion, und ich habe keinen Beleg gesehen, dass es wegen Claude Code signifikant mehr Fehler oder Segmentation Faults gibt als vorher.
„Ganz okay, nicht schlecht, ein guter Use Case“ – was hat Fable da bitte geleistet?
Dinge wie
(tap-select, drag-box, long-press deselect, two-finger scroll, pinch zoom)sind eine weitere KI-typische Ausdrucksweise, die man bei Coding Agents oft sieht.Sie scheinen relativ komplexe und konkrete Konzepte gern zu neuen Komposita oder manchmal sogar Verben zu verdichten, als wären es Ein-Wort-Phrasen. Ob das Token sparen soll oder später als knapper Identifier wiederverwendbar sein soll, weiß ich nicht, aber es fällt ziemlich auf.
Die resultierenden Sätze sind schwer zu lesen, aber wenn man diese Tendenz kennt und Nominalphrasen bewusst parst, wird es etwas besser. Trotzdem ist das nur ein Zwischenprodukt eines Coding Agents und kein Essay oder Blogpost, also finde ich es in Ordnung.
In manchen germanischen Sprachen läuft das genau so. Instinktiv will man Substantive zu etwas wie
lawnchairzusammenziehen, dann kommt die Rechtschreibunterstreichung,lawn chairsieht auch komisch aus, undlawn-chairwird zur Zwischenlösung.## Einfache Sprache, kein JargonIch habe festgelegt, dass keine abkürzenden Fachbegriffe verwendet werden sollen, sondern gesagt werden soll, was tatsächlich gemeint ist.
Zum Beispiel statt „load-bearing assumptions“ lieber „Annahmen, von denen xyz abhängt“, und statt „cross-service“ sollen die Services X und Y direkt beim Namen genannt werden.
Auch abstrakte Nominalphrasen-Urteile wie „Cross-RCA double-counting is unfounded“ sind verboten; stattdessen soll es heißen: „Wir haben geprüft, ob dieselbe Root Cause über mehrere RCA-Läufe hinweg doppelt gezählt wird, und das war nicht der Fall.“
## Keine weltbewegenden VerkündungenÜbertreibungen wie „eine wichtige Entdeckung ändert alles“, „jetzt haben wir das Gesamtbild verstanden“ oder „das ist ein Game Changer“ sollen weggelassen und die Erkenntnisse nüchtern beschrieben werden.
## Ein Ja nicht reflexhaft verwässernWenn die Antwort ja ist, soll auch ja gesagt werden. Wenn jede positive Antwort mit Einschränkungen versehen wird, wirkt sie weniger sicher; Einschränkungen sollen nur dann kommen, wenn es tatsächlich eine konkrete Unsicherheit gibt.
Es näht 2 bis 4 fortgeschrittene Konzepte in ein oder zwei Wörter zusammen, sodass ich jedes Mal sagen muss: „Bitte ausführlich erklären.“ Für Muttersprachler ist das sicher auch nicht einfach, aber für Nicht-Muttersprachler ist es noch schwieriger.
Entscheidend ist der Teil, dass es auf EAs GPL-v3-Quellcodeveröffentlichung basiert und auf fbraz3/GeneralsX aufsetzt. Die große Arbeit für die macOS-/Linux-Portierung hat GeneralsX geleistet; dieser Fork fügt vor allem die iOS-/iPadOS-Portierung und ein paar Engine-Änderungen hinzu.
Das sieht nicht nach einer riesigen Plackerei aus, und Opus 4.6 hätte vermutlich auch gereicht.
Ich frage mich, ob so eine Technik auch für Emperor: Battle for Dune (2001) nützlich wäre.
Es war Westwood Studios’ erstes 3D-Echtzeitstrategiespiel und kam ein paar Jahre vor C&C Generals heraus. Wegen Streitigkeiten um geistige Eigentumsrechte und der Einführung neuer Fraktionen abseits der Originalvorlage war seine Popularität begrenzt, aber Gameplay, Soundtrack und Kampagnenmissionen waren hervorragend.
Als Kind habe ich unzählige Stunden in dieses Spiel gesteckt, und je älter ich wurde, desto schwieriger wurde es, es wieder zu spielen, weil die Technik die ursprünglich vorgesehenen Plattformen hinter sich gelassen hat.
In den Händen engagierter Fans ist das ein guter Einsatzbereich, in dem KI helfen kann. Wenn ich Zeit finde, würde ich gern auch mit nutzergenerierten Karten oder Einheiten experimentieren. Die Modding-Community von C&C Generals war immer ziemlich aktiv.
Für die anderen Dummköpfe, die nach mir kommen: Der folgende Fehler bedeutet, dass ihr das Spiel nicht auf Steam gekauft habt.
"ERROR! Failed to install app '2732960' (No subscription)"Natürlich steht das schon im README.
Fable kann das unmöglich gemacht haben. Es wäre beim Ausdruck „command and conquer“ stehen geblieben, auf Opus herabgestuft worden und gleichzeitig auf einer NSA-Überwachungsliste gelandet.
Wie kann es „mit Fable gemacht“ sein, wenn der erste Commit vom Februar letzten Jahres ist?
Ähnlich wird mit KI daran gearbeitet, Battle for Middle Earth auf derselben Engine „open-source“ zu machen: https://github.com/dginovker/BFME-Source-Code
Ist es nicht problematisch, Quellcode einfach aus einem Binary zu dekompilieren und zu veröffentlichen?
Das ist kein Clean-Room-Ansatz, und Unternehmen könnten weiterhin Urheberrechtsverletzungen geltend machen und es entfernen lassen.
Der Titel ist Clickbait.
Diese Arbeit begann im Februar, und wenn man sich die Commits ansieht, hat Fable nur einen kleinen Teil der neuesten Commits gemacht: 19 von 2000 Commits: https://github.com/ammaarreshi/Generals-Mac-iOS-iPad/commits...
Außerdem war es vielleicht gar nicht Fable. Es könnte auch auf Opus herabgestuft worden sein.
Wegen solcher häufigen Fehlinformationen werde ich gegenüber Anthropics LLM-Behauptungen skeptisch. In Webentwicklungs-Workflows lag es im Vergleich zu GPT 5.5 mal vorn, mal hinten, und genauso war es mit Fable, nachdem es wieder aktiviert wurde und ich angefangen habe, es zu testen.
Ein ordentliches LLM hätte diese Portierung wohl geschafft. Selbst etwas wie GLM 5.2 hätte es wahrscheinlich gekonnt, und vielleicht sogar besser, weil es nicht ständig mutmaßt, ob ich ein Terrorist bin, der die Regierung hacken oder Biowaffen bauen will.
Den Leuten fehlen die Ressourcen, um LLMs zu vergleichen, also deuten sie schnell an, dass das Modell, das sie benutzt haben, das beste aller Zeiten sei und neue Workflows eröffnet habe. Seit Opus 4.6 habe ich kaum Verbesserungen gesehen.
Die Commits des Fork-Besitzers beginnen vor 19 Stunden, daher ist es durchaus plausibel, dass dieser Teil mit Fable gemacht wurde. Ob das Hinzufügen von iOS-Unterstützung allerdings etwas war, das frühere Modelle nicht konnten und nur Fable kann, ist mir völlig unklar.