
2026/02/01 22:32
2003年版ゲームのバイナリから2週間で逆コンパイルし、書き換えました。
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
要約
Crimson Land は、フィンランドのスタジオ 10tons が 2003 年にリリースしたシングルプレイヤー上から見下ろすシューティングゲームで、後に 2014 年に Steam へ再マスターされ、GOG、OS X、Linux、PS4、および Xbox に移植された。ゲームの初期無料版(v1.0.2 – 2002年5月、v1.3.0 – 2002年7月で音楽追加、v1.4.0 – 2002年9月)が集結し、カルト的な人気を博した v1.9.8 シェアウェア版(2003年4月)へと至った。10tons がカジュアルモバイルタイトルに移行した後、続編は実現しなかった。
2026年1月16日 に、著者がクラシック v1.9.93 ビルド(2011年2月)を完全再作成するプロジェクトを開始し、「完全忠実」を目指してすべてのバグと奇妙な挙動を正確に再現することを目的としている。元の実行ファイルは Visual Studio 2003(VC++ 7.1 SP1)で構築された DirectX 8.1 のゲームで、カスタムエンジン
grim.dll をロードし、Direct3D 8、DirectInput、および2Dスプライトレンダラーの84メソッド vtable を公開していた。
リバースエンジニアリングに使用されたツールは Ghidra(無料、ヘッドレス)、Binary Ninja(有料、スクリプタブル)、IDA Pro、およびランタイムデバッガー Windbg(cdb)と Frida であり、関数フックやデータキャプチャに利用された。アセットパッケージングには PAQ アーカイブ(
paq\0 ヘッダー)が使用され、Windows スタイルのパスを含む。テクスチャは JAZ ファイルとして保存されており、zlib 圧縮 JPEG にカスタムランレングスエンコードアルファチャンネルがラップされている。オリジナルで確認されたフォントは Xirod Regular、Armor Piercing Regular、Pixel Arial 11、および Courier New Bold であり、これらまたはベクター代替が再作成に使用される。
再作成の対象は raylib である。raylib は DirectX 8 の低レベルレンダリングをエミュレートしつつ、ウィンドウ管理、入力、オーディオ、およびテクスチャ描画を処理できるベアボーンエンジンだ。ゲームプレイロジックは完全に再実装され(約 46,800 行の C/C++ と ~16,000 行のドキュメント)、すべてのモード、武器、特典、およびクエストを網羅している。残存するバグはクレジットや隠しコンテンツなどコア以外の領域に限定される。
将来の拡張としては、ソフトシャドウ付き夜間モード(符号付き距離関数ラーニング)や、オリジナルで約束された機能をベースとしたオンラインハイスコア追跡またはネットワークマルチプレイヤーの可能性がある。コミュニティ参加は Telegram グループ、GitHub リポジトリ、およびナレッジベースを通じて奨励され、残存する不整合点を発見し忠実な再現をテストすることが期待される。
この改訂要約は、一覧の主要ポイントすべてを取り入れつつ、主旨を明確に保ち、曖昧な表現を排除しています。
本文
あるゲームは静かに消えてしまう。
それらはリストから外され、マルチプレイサーバーを失い、デジタルの虚無へと漂っていく。別のゲームはオリジナル作者によって少しだけグラフィックが上げられたバージョンでリメイクされ、バトルパスも付与される。
そして第三の道――Ghidra でバイナリを開き、関数に名前をつけ始める方法。
歴史
| バージョン | 年 | 備考 |
|---|---|---|
| Crimsonland | 2003 | トップダウンシューター。インディー「shareware」時代の最初のゲーム、フィンランドのスタジオ 10tons によるもの。 |
| Remastered | 2014 | グラフィックを更新し、新エンジンへ移行。 |
| Resurrected | 2026 | 完全リライト(この記事の対象)。 |
元々のフリーウェア版
- v1.0.2 – 2002年5月:コアメカニクスを持つ初期プロトタイプ。
- v1.3.0 – 2002年7月:以降は聞かれない3曲の音楽が追加。
- v1.4.0 – 2002年9月:出版社の興味が湧く前の最終フリーバージョン。
shareware シリーズ
- v1.8.x–1.9.x – 2003年4月にリリース、CDカバーで広く配布。
- v1.9.8 – 2003年9月:過剰なコンボで愛好家に人気。
- v1.9.93 – Reflexive が2010年に閉鎖した後、ワイドスクリーン(960×800)が追加され、後に GOG.com の無料ボーナスとしても提供。
続編噂とリリース
- 2010–2013:『Crimsonland 2』は実現せず、モバイル casual ゲームへシフト。
- 2014年6月11日:Steam 上でリメイク版がリリース。
- 2014年7月:GOG.com のリリースに続き macOS、Linux、PS4、Xbox が登場。
私の心は2003年にある ― オリジナルのメカニクスはまだ最も新鮮に感じる。
プロジェクト
目標
オリジナル Windows バイナリと完全に一致するリライト(バグやピクセルレベルの細部まで)。
三つのルール:
- 完全忠実 – GOG クラシックビルド (v1.9.93, 2011年2月) と同じ挙動。
- 推測不可 – 実装した全関数はデコンパイルコードまたはランタイム証拠に遡れる。
- オリジナル依存なし – アセットはアーカイブからロードし、コードは一から書く。
ツールとワークフロー
| ツール | 用途 |
|---|---|
| Ghidra | 静的解析・初期デコンパイル(101 k 行 → 114 k 行へリネーム)。 |
| Binary Ninja | ヘッドレス探索、MCP を使った動的クエリ。主にクロスチェック用。 |
| Windbg / CDB | ランタイムブレークポイント、メモリ検査、ヘッドレスサーバ/クライアント設定。 |
| Frida | JS フックを注入し呼び出し追跡、フレームバッファ取得、引数変更を即時に実行。 |
Windbg コマンド例
cdb -server tcp:port=5005,password=secret -logo C:\windbg.log \ -pn crimsonland.exe -noio cdb -remote tcp:server=127.0.0.1,port=5005,password=secret -bonc
Frida の使い方
frida -n crimsonland.exe -l scripts/frida/unlock_secrets.js
カスタムフォーマット
PAQ アーカイブ
from construct import Bytes, Const, CString, GreedyRange, Int32ul, Struct MAGIC = b"paq\x00" PAQ_ENTRY = Struct( "name" / CString("utf8"), "size" / Int32ul, "payload" / Bytes(lambda ctx: ctx.size), ) PAQ = Struct( "magic" / Const(MAGIC), "entries" / GreedyRange(PAQ_ENTRY), )
JAZ テクスチャ
JAZ = JPEG + RLE エンコードされたアルファチャンネル、次に zlib 圧縮。
抽出方法:
uv run paq extract crimsonland/ assets/ dumps everything --convert jaz png
文字列レンダリングとフォント
確認済みフォント(dafont.com から取得):
| 用途 | フォント |
|---|---|
| ロゴ | Xirod Regular |
| メニューラベル | Armor Piercing Regular |
| 小さいテキスト | Pixel Arial 11 |
| レベル名 | Courier New Bold |
ピクセルフォントはオリジナルと同一バリアントを使用し、JPEG 圧縮のアーティファクトを回避。
エンジン選択
Raylib を採用した理由?
- シンプルで抽象化が少ない – DirectX 8 の直接描画に近い。
- ウィンドウ作成、テクスチャ描画、サウンド、入力などを扱う。
- エンジンの内部構造よりもゲームロジックに集中できる。
リライト進捗
| 指標 | 値 |
|---|---|
| コード行数 | 46 800 |
| ドキュメント行数 | 16 000 |
| ゲームプレイ完全接続 | ✔︎ |
| 全モードが終盤までプレイ可能 | ✔︎ |
| 武器・パーク機能 | ✔︎ |
残作業:ロジックバグ、クレジット、隠れた「宇宙動物園管理者」ゲーム。
次のステップ
- オンラインハイスコア – 復活または再実装。
- ネットワークマルチプレイ – Crimsonland 2 の約束通りに実装。
- オプションナイトモード – Signed‑distance field ラーニングを用いた柔らかい影(プロトタイプあり)。
グラフィックの大幅変更は行わず、忠実な保存が目的。
どうやって手伝える?
- 微妙な不整合点を指摘(例:クモに対する「フレンドリー・ファイア」)。
- Telegram グループで最新情報を受け取る。
- GitHub リポジトリを閲覧し、コードと知識ベースを研究。
パッケージマネージャー経由で現在のバージョンをプレイ。uv
スクリーンショット「Crimsonland 2003」 – 実際は私のリライト版から取得。