概要
Pizza Legacy は、1994年のDOSゲーム Pizza Tycoon のオープンソース再実装プロジェクト。 都市のズームビューで 車の流れ を再現し、低スペックCPUでも滑らかな動作を実現。 現代的な設計 を捨て、オリジナルのシンプルなロジックを解析・再現。 衝突判定 や経路探索を単純化し、効率的な処理を追求。 失敗と学びを経て、 アセンブリ解析 とLLMの力で完成に至った経緯。
Pizza Tycoonの車両シミュレーション再現の試行錯誤
- 2010年に ズームレベルの実装 からプロジェクト開始
- 14年かけてようやく 満足できる車の動き を実現
- 途中で複雑なシステム(例:タイルごとの占有管理、ロックシステム)に陥り 開発が難航
- オリジナルは25MHz 386 CPU で動作していた事実に疑問
- アセンブリの解析 とLLMの活用でオリジナルの挙動を解明
都市マップと道路システムの構造
- マップは 160×120タイル のグリッド構成
- 各タイルは landsym.vga から選ばれる
- 道路タイルごとに 進行方向が固定
- 例:0x16は左から右のみ、0x06は右から左のみ
- コーナータイル では直進か曲がるかをランダムで決定
- 連続した左折を防ぐ 補助ルール を設定
車の移動ロジック
- 1フレームごとに 1ピクセル移動
- 16ピクセル進むごとに タイル境界処理 (方向決定・スプライト更新)
- 各車両の進行状況を ランダムに初期化 し、処理の分散を実現
衝突判定の最適化
- O(n²) のシンプルな全ペアチェック
- 進行方向が異なる場合は 即座に判定終了
- 同方向・同車線のみ 座標計算による衝突判定
- 衝突時は 10ティックの待機カウンター で自然な渋滞を表現
- 一部の組み合わせは判定されず バグの原因 にも
車両のスポーンとリサイクル
- ズームビュー突入時に 画面内132タイルを走査
- 各道路タイルで 交通密度に応じて車をスポーン
- コーナータイルは スポーン対象外
- 画面外に出た車は 反対方向・新色で再スポーン
- スクロール時も 新たなタイルでスポーン処理
なぜこの方法でうまくいくのか
- 経路探索不要 :マップ自体が進行方向を規定
- 衝突判定は 早期リターンで高速化
- 1ピクセル単位の移動 で十分な「動き感」を演出
- 複雑な物理処理は不要
- アセンブリのロジックを Car.cppのswitch文 で忠実に再現
まとめ:現代的過剰設計からの脱却
- 現代的な設計思想 (シーングラフ、経路探索、複雑な衝突判定)は不要
- 目的はリアルな自動車シミュレーションではなく、都市の「賑わい感」の演出
- オリジナルの シンプルで効率的なアプローチ が、最終的に最適解であることを再認識