Command & Conquer GeneralsをFableでmacOS・iPhone・iPadへネイティブ移植
(github.com/ammaarreshi)- Command & Conquer Generals: Zero Hour が、Apple Silicon Mac、iPhone、iPadでエミュレーションなしに動作し、クラシックRTSを最新のAppleデバイス上で直接プレイできるようになった
- 中核は 2003年当時の実エンジンをARM64向けにコンパイル した点で、グラフィックスは DirectX 8 → DXVK → Vulkan → MoltenVK → Metal の経路で変換される
- EAの GPL v3ソース公開 と GeneralsX の macOS/Linux 移植をベースに、このフォークが iOS/iPadOS 対応とエンジン修正を追加している
- ゲームアセットは含まれていないため、Steam などで 所有しているコピー のデータを自分で取り込む必要がある
- iPadでの長時間プレイは約 3GB超のメモリ常駐 で終了させられる可能性があり、iOSのバックグラウンド移行時クラッシュの可能性も残っているため、こまめなセーブが必要
Appleデバイスで動く本物のZero Hourエンジン
- Zero Hour が Apple Silicon Mac、iPhone、iPad でネイティブ動作する
- キャンペーン、スカーミッシュ、Generals Challenge モードに対応
- RTS向けのタッチ操作を搭載
- タップ選択
- ドラッグ範囲選択
- 長押しで選択解除
- 2本指スクロール
- ピンチズーム
- 実行方式はエミュレーションではなく、2003年当時の実エンジン を ARM64 向けにコンパイルしたもの
- レンダリングは DirectX 8 → DXVK → Vulkan → MoltenVK → Metal の順でつながる
GeneralsXベースのフォークの範囲
- エンジンコードは EA の GPL v3ソース公開 を基にしている
- ベースとなる移植は fbraz3/GeneralsX で、macOS/Linux 移植の中核作業は GeneralsX で行われている
- このフォークは iOS/iPadOS 移植 とエンジン修正を追加する
- 元の GeneralsX README は
upstream-mainブランチにある
ゲームアセットはユーザーが自分で用意する必要がある
- ゲームアセットは同梱も配布もされない
- ユーザーは自分のゲームコピーを用意する必要がある
- Steam へのリンクが提供されており、セール時は約 5ドル と案内されている
scripts/get-assets.shは、ユーザーが所有する Steam ゲームデータを取得するスクリプトで、対象アプリ ID は 2732960
macOSビルドと実行の流れ
- macOS ビルドには一度だけ必要な事前準備がある
xcode-select --installbrew install cmake ninja meson pkgconfbrew install --cask steamcmdvcpkgの完全クローンとVCPKG_ROOTの設定- LunarG Vulkan SDK のインストールと
VULKAN_SDKの設定
vcpkgは浅いクローンだと manifest baseline が壊れる可能性があるため、完全クローン が必要- Vulkan SDK は Homebrew cask ではなく、LunarG Vulkan SDK を使う必要がある
- リポジトリをクローンしたあと、以下のスクリプトを順番に実行する方式
./scripts/build/macos/build-macos-zh.sh: 依存関係の確認、設定、ビルド./scripts/build/macos/deploy-macos-zh.sh:~/GeneralsX/GeneralsZHとrun.shを生成./scripts/get-assets.sh <your_steam_username>: 所有しているゲームデータを取得cd ~/GeneralsX/GeneralsZH && ./run.sh -win: 実行
iPhone・iPadビルドの条件
- iOS/iPadOS ビルドには、macOS の事前準備に加えて、完全版 Xcode、Apple ID でのログイン、
xcodegen、Apple Developer team が必要 - ビルド工程は以下の要素で構成される
references/fbraz3-dxvkサブモジュールの初期化- iOS 向け DXVK は、そのサブモジュールと
Patches/dxvk-ios.patchからビルドされる ./scripts/build/ios/fetch-moltenvk.shで、チェックサム付きの固定バージョン MoltenVK.framework を取得./scripts/build/ios/stage-fonts.shで、Liberation Fonts をゲームが期待する名前に整えるcmake --preset ios-vulkanおよびcmake --build build/ios-vulkan --target z_generalsでビルド
- パッケージ化とインストールでは
GX_TEAM_IDとGX_BUNDLE_IDを設定したうえで./scripts/build/ios/package-ios-zh.sh --installを実行する - Team ID は Xcode → Settings → Accounts で確認できる
- アセットはアプリバンドル内に含まれるため 自己完結型インストール となり、
--devは高速なコード反復のため約 2.7GB のコピーを省略する
リポジトリ内で注目すべきファイルと文書
docs/port/PORTING_PLAYBOOK.md: 移植全体のエンジニアリングログで、失敗モード・根本原因・修正内容を記録- §8 bug archaeology では、黒いミニマップ、無音の EVA 音声、chirp 問題を扱っている
docs/port/PORTING_PATTERNS.md: クラシックな Windows ゲームを Apple プラットフォームへ移植するための一般化された方法論docs/port/RELEASE_CHECKLIST.md: 公開リリースのゲートscripts/get-assets.sh: 所有している Steam アセットを取得するスクリプトscripts/build/macos/,scripts/build/ios/: ビルド、デプロイ、パッケージングのパイプラインios/: XcodeGen の署名スタブプロジェクトと、ios/config/内の用意済みOptions.ini、dxvk.confPatches/dxvk-ios.patch: iOS 向け d3d8/d3d9 dylib ビルドで使われる DXVK 変更点
まだ残っている制約
- iPad での長時間セッションは、約 3GB超のメモリ常駐 状態で iOS によって終了させられる可能性がある
- この場合、アプリはダイアログなしでホーム画面へ戻る
- 現在および前回セッションのログは Files アプリ内のゲームフォルダにある
- この問題は調査中
- iOS でゲーム中にバックグラウンドへ移行すると、まれにクラッシュすることがある
- ライフサイクルの一時停止は通常の経路を処理している
- まれな race condition が残っているため、こまめにセーブする必要がある
ライセンスと制作方式
- エンジンコードは GPL v3 で、流れは EA のソース公開 → GeneralsX → このフォーク
- ゲームアセットは含まれず、ここではライセンス提供もされない
- クレジットには Westwood/EA Pacific、EA、fbraz3/GeneralsX、TheSuperHackers/GeneralsGameCode、DXVK、MoltenVK、SDL、OpenAL Soft、FFmpeg、Liberation Fonts が含まれる
- この移植は人間+AIの協業で作られている
- エンジニアリングは Claude Code、つまり Anthropic の Claude Fableモデル が担った
- Ammaar Reshi が実機での方向付けとプレイテストを担当した
docs/port/のエンジニアリングログは、その作業方式を編集せず記録したもの
1件のコメント
Hacker Newsの反応
これは、人間がモデルを誘導して大量変換をさせる、かなり良い活用例に見える
ただ、移植ドキュメントは人間が少し手を入れてほしかった。AI生成っぽい文体が鼻につく
負担は低く、ほとんどは趣味でやることだし、反復的な改善も可能だ。Bunが「ZigからRustへ全部書き換えたし、当然うまく動くし、すぐ本番投入できるし、何をやったかブログ記事も書く」と言っていたのに、その記事がいまだに出ていない状況とは違う
LLMの悪い使い方の例だと言われるけれど、すでにしばらく本番で使われていて、Claude Codeのせいでバグやセグメンテーション違反のような問題が以前より有意に増えたという証拠は聞いたことがない
「かなり良い、悪くない、良い活用例」って、Fableはいったい何を成し遂げたんだ
(tap-select, drag-box, long-press deselect, two-finger scroll, pinch zoom)みたいなものは、コーディングエージェントでよく見かける別のAIっぽい表現だ比較的複雑で具体的な概念を、新しい複合名詞や、時には動詞にして、1語のフレーズのように要約するのが好きらしい。トークンを節約したいのか、後で再参照できる簡潔な識別子を作りたいのかはわからないが、かなり目立つ
できあがった文章は読みにくいが、そういう傾向を知って意識的に名詞句を解析すれば多少はマシになる。それでもコーディングエージェントの中間生成物であって、エッセイやブログ記事ではないのだから問題ないと思う
一部のゲルマン語派の言語ではそういう感じだ。本能的に名詞をくっつけて
lawnchairのようにしたくなるが、スペルチェックの下線が出るし、lawn chairも変に見えるので、lawn-chairが中間地帯になる## わかりやすい言葉を、専門用語ではなく省略のための専門用語は使わず、本当に意味していることを書けとしている
たとえば「load-bearing assumptions」ではなく「xyzが依存している前提」と書き、「cross-service」とは言わずXサービスとYサービスを直接名指しさせる
「Cross-RCA double-counting is unfounded」のような抽象名詞句の判定も禁止して、「RCAの実行間で同じ根本原因が二重に数えられていないか確認し、そうではなかった」のように書かせる
## 世界を揺るがす宣言を禁止「重要な発見がすべてを変える」「これで全体像がつかめた」「ゲームチェンジャーだ」といった大げさな表現を外し、見つかった内容を淡々と書かせる
## yesを反射的にぼかさないこと答えがyesならyesと言わせる。肯定の答えすべてに条件を付けると確信が弱く見えるので、本当に具体的な不確実性があるときだけ条件を付けるようにさせる
高度な概念を2〜4個、1語か2語に縫い合わせるので、毎回「ほどいて説明してくれ」と言わないといけない。ネイティブにも簡単ではないだろうが、非ネイティブにはなおさら難しい
EAのGPL v3ソース公開版をベースに、fbraz3/GeneralsXの上に作られているという点が重要だ。macOS/Linux移植の大仕事はGeneralsXがやっていて、このフォークはiOS/iPadOS移植とエンジンのいくつかの修正を加えたものだ
そこまで大変な苦労が入ったようには見えず、Opus 4.6でも十分だっただろう
この手法がEmperor: Battle for Dune(2001)にも有効なのか気になる
Westwood Studios初の3Dリアルタイムストラテジーで、C&C Generalsより数年早かった。知的財産権の争いと、原作設定から外れた新勢力の導入のため人気は限定的だったが、ゲームプレイ、サウンドトラック、キャンペーン任務は素晴らしかった
子どものころこのゲームに数え切れないほど時間を使ったし、年を取るにつれて、本来の想定プラットフォームを技術が追い越してしまい、再び遊ぶのがどんどん難しくなっている
熱心なファンの手にあるなら、AIが役立てる良い用途だ。時間があればユーザー製マップやユニットも試してみたい。C&C Generalsのモッディングコミュニティはずっとかなり活発だった
あとから来る他の間抜けのために言っておくと、下のエラーはSteamでゲームを購入していないことを意味する
"ERROR! Failed to install app '2732960' (No subscription)"もちろんREADMEにはすでに書いてある
Fableがこれをやったはずがない。「command and conquer」という語で止まり、Opusに格下げしたうえで、同時にNSAの監視リストにも載せただろう
「Fableを使った」と言うには、最初のコミットが去年2月なのはどういうことなんだ?
同様にAIを使って、同じエンジンのBattle for Middle Earthを「オープンソース化」する作業も進めている: https://github.com/dginovker/BFME-Source-Code
バイナリからソースコードを単純にデコンパイルして公開するのは問題にならないのか?
これはクリーンルーム方式ではないし、企業が依然として著作権侵害だと主張して差し止めることはできそうだ
タイトルは釣りだ
この作業は2月に始まっていて、コミットを見ればFableがやったのは最新コミットのうちごく一部にすぎない。2000件中19件だ: https://github.com/ammaarreshi/Generals-Mac-iOS-iPad/commits...
しかもFableですらないかもしれない。Opusに格下げされていた可能性もある
こういう誤情報が頻繁にあるせいで、AnthropicのLLMに関する主張には懐疑的になる。Web開発のワークフローではGPT 5.5と比べて一進一退で、再び有効化されてからテストし始めたFableも同じだった
まともなLLMならこうした移植はできただろう。GLM 5.2のようなものでも可能だったはずで、自分が政府をハッキングしようとするテロリストなのか生物兵器を作ろうとしているのかを延々と推測してこないぶん、むしろそちらのほうが良かったかもしれない
人々にはLLMを比較するためのリソースが足りないので、自分が使ったモデルが史上最高で新しいワークフローを開いたと簡単にほのめかしてしまう。Opus 4.6以降はほとんど改善を見ていない
リポジトリのフォーク所有者のコミットは19時間前から始まっているので、その部分がFableで行われたというのは十分あり得る。ただし、iOS対応の追加が以前のモデルではできずFableでしかできなかった作業なのかは、自分にもまったく不明だ