MechCommanderの「左腕バグ」とは何か?

1999年にリリースされたリアルタイムストラテジーゲーム『MechCommander』には、長年プレイヤーを悩ませてきた奇妙なバグが存在しました。それは、「大型の武器がすべてメカの左腕に搭載されてしまう」というものです(出典)。これにより、もしメカが大型武器のみで構成されていた場合、左腕を失うことはメカの戦闘能力のほぼすべてを失うことを意味しました。

大型武器がメカの左腕に偏って搭載されるというバグは、ゲームの戦略性に大きな影響を与えかねない問題でした。

開発者によると、このバグはミッションの成否に常に大きな影響を与えるわけではなかったとのことです。しかし、運悪く自機の左腕が破壊された場合、そのメカはほぼ使い物にならなくなり、プレイヤーにとっては大きなフラストレーションとなっていました。長年、多くのプレイヤーがこの現象に首を傾げていたことでしょう。

謎のバグを紐解く解析手法

今回、この「左腕バグ」の修正に成功した記事執筆者は、その解析にモダンなリバースエンジニアリングツールを駆使しています。特に注目すべきは、MechCommander 1(または少なくとも筆者が所有するMechCommander Gold版)に埋め込まれていた「デバッグシンボル」の存在です(出典)。

これにより、ゲームの実行コードの挙動について、限定的ではあるものの有益な洞察を得ることができたとのことです。デバッグシンボルが残っているのは、開発者としては見落としだったのかもしれませんが、後世の解析者にとってはまさに宝の山ですね。

具体的な解析プロセスは以下の通りです。

  • デバッグシンボルの活用: ゲームコードの内部動作をある程度把握するための手がかりとしました。
  • Ghidraによる逆アセンブル: NSAが開発したオープンソースの逆アセンブラツールGhidraを使用し、ゲームの機械語コードをC言語ライクな擬似コードに変換しました。これにより、アセンブリよりも人間が読みやすい形でコードを分析することが可能になりました。GhidraはローカルLLM開発でも活用できるのではと個人的に注目しています。低レベルなコード解析とLLMの組み合わせは、今まで想像もできなかった領域を切り開くかもしれません。
  • ゲームデータファイルとの照合: compbas.csvファイル(MISC.FST内にパックされている)内の武器IDと、その他の情報源、そして実際のテストを組み合わせることで、「大型」武器と「小型」武器の分類リストを作成しました。

「大型武器」の定義とバグの真相

解析の結果、ゲーム内で「大型(Large)」と判定される武器のリストが明らかになりました。これは単に「9トン以上」という一般的な認識とは異なるもので、特定の武器IDに基づいて内部的に定義されていました。

ID 武器名 入手可能性 トン数 サイズ判定
100 Light Autocannon ベースゲーム 9.5 Large
101 Autocannon ベースゲーム 15.5 Large
102 Heavy Autocannon ベースゲーム 19.5 Large
103 Light Ultra Autocannon ベースゲーム 11.0 Large
104 Gauss Rifle ベースゲーム 16.5 Large
110 C. Light Ultra Autocannon ベースゲーム 8.5 Large
111 C. Ultra Autocannon ベースゲーム 13.5 Large
112 C. Heavy Ultra Autocannon ベースゲーム 17.5 Large
113 C. Gauss Rifle ベースゲーム 13.5 Large
98 Rail Gun 拡張版のみ 30.0 Small
99 Light Gauss Rifle 拡張版のみ 13.5 Small
107 Light LB-X Autocannon 拡張版のみ 9.5 Small
108 LB-X Autocannon 拡張版のみ 14.5 Small
109 Heavy LB-X Autocannon 拡張版のみ 19.5 Small
116 C. Light LB-X Autocannon 拡張版のみ 8.5 Small
117 C. LB-X Autocannon 拡張版のみ 13.5 Small
118 C. Heavy LB-X Autocannon 拡張版のみ 17.5 Small
120 LRM Rack ベースゲーム 4.0 Small
123 SRM Pack ベースゲーム 3.0 Small
125 Streak SRM Pack ベースゲーム 5.0 Small
126 Heavy Thunderbolt 拡張版のみ 21.0 Small
130 C. LRM Rack ベースゲーム 3.0 Small

バグの原因は、武器の「Large」判定ロジックと、その後のメカへのコンポーネント割り当てロジックの不整合にあることが判明しました。

詳細なコード解析によって、なぜ「Large」と判定された武器が左腕に偏るのか、その根本的な原因が特定されたとのことです。具体的なコードの不具合については主記事には明記されていませんが、今回の発見により、この長年のバグに対するパッチが開発され、ゲームコミュニティに提供されることになりました。

個人的には、Pythonバインディングがあれば、このような古いゲームのロジック解析をもっと手軽に自動化できるのではないかと感じます。AIを使った自動デバッグやリファクタリングの可能性が広がりますね。

クラシックゲームと現代の解析技術

今回のケースは、古いゲームの未解決バグを現代のリバースエンジニアリングツールと技術で解決できることを示しています。Ghidraのようなツールや、ゲームに残されたデバッグシンボルが、長年の謎を解き明かす鍵となったことは非常に興味深いです。

このような取り組みは、単にゲームのバグを修正するだけでなく、当時の開発者がどのような実装を行っていたのか、その技術的背景を学ぶ貴重な機会にもなります。以前、友人が自作PCで古いOSを動かして、昔のゲームを動かすことに情熱を燃やしていましたが、まさにその精神を感じます。

このような解析は、他のクラシックゲームに存在する未解決のバグや、失われた機能を復元する可能性も秘めていると感じます。オープンソースコミュニティや趣味のハッカーが、商業的サポートが終了したソフトウェアを解析し、改善を続ける動きは、技術の進歩と歴史の継承という両面で非常に価値があるのではないでしょうか。