世界を動かす技術を、日本語で。

「ピザタイクーン」が25 MHz CPU上でトラフィックをシミュレートした方法

概要

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文 で忠実に再現

まとめ:現代的過剰設計からの脱却

  • 現代的な設計思想 (シーングラフ、経路探索、複雑な衝突判定)は不要
  • 目的はリアルな自動車シミュレーションではなく、都市の「賑わい感」の演出
  • オリジナルの シンプルで効率的なアプローチ が、最終的に最適解であることを再認識

Hackerたちの意見

たった今、GOGでこのゲームを探してたんだ。ティーンエイジャーにどれだけ素晴らしいか話してたのに、残念ながらGOGにはないみたい。

GOGとSteamにはあるよ。アメリカでは「Pizza Tycoon」として知られてたけど、国際的には「Pizza Connection」としてリリースされたんだ。https://www.gog.com/en/game/pizza_connection https://store.steampowered.com/app/598990/Pizza_Connection/

高校の彼女とこのゲームをめっちゃやってたな。最高得点を取るためにピザを作るのがいつも超イライラしたけど、自分の「帝国」を築くのが大好きだった。

高校の彼女とこのゲームをずっとやってたんだ。ピザを作って最高得点を狙うのがいつもすごくイライラした。いつも一ピクセル足りない感じがしてた。Pizza Tycoonは、何年か後に£5で再パッケージされた「クラシックゲーム」コレクションで手に入れたゲームの一つだけど、ブックレットなしで来たんだ。ブックレットがあればピザを正しく作るための重要な情報が載ってたらしい。(ブックレットなしだとプレイはできるけど、クリアは不可能だから、アンチパイラシー対策に使われてたって聞いたことがあるけど、本当かどうかはわからない笑)私たちはただ、良いピザを作るために手探りでやってたよ。

「そんな低いハードウェア要件で動くビジネスなんてない」ってテーマのコミュニティやゲームジャム知ってる人いる?デモシーンみたいな感じで、ゲームに特化したやつ。子供の頃、ハードウェアに期待されることが歪んだ見方をさせるゲームがたくさんあった。バトルトード、クラッシュ・バンディクー、マラソントリロジー(マッキントッシュ)、エイジ・オブ・エンパイア(マルチプレイヤー)、ローラーコースタータイクーン(もちろん)。

デモパーティーには通常、ゲームのカテゴリがあるよ。

基準に合ってるかはわからないけど、ほとんどのレトロプラットフォーム向けにレトロテーマのコンポがよく開催されてるから、自然なハードウェア制限があるんだ(レトロプラットフォーム向けのデモみたいに)。8ビットのNES(NESJamは5月末/6月)、ゲームボーイ(GBJamは去年、年2回)、アタリなど、MSDOSやアミガ、PS1のようなセミモダンなプラットフォームも含まれてる。今では、現代のツールを使っても、古いプラットフォームで印象的なものを動かすのはかなりの作業だよ(前回のコンポではゲームボーイのテクデモがあったけど、これからすごく成長する予定)。

これ、まだ存在してないなら絶対必要だよね!ただ、みんな同じハードウェアを持ってないっていう問題があるかも?エミュレーターをターゲットにするのもアリかもね。(ファンタジーコンソールみたいなのも含まれるかな?)あんまり詳しく見てないけど、レトロテーマのジャムの中には、期待してた「スピリット」が欠けてるものもあった気がする。前にノキアのジャムをやったことがあって、モノクロでビープ音が鳴るやつなんだけど、ルール的には解像度とカラーパレットさえ守れば3D UnityのゲームもOKだったのがちょっとイラッとした記憶がある。(TIの電卓で回転する3Dキューブは別の話だしね;)

Wolfenstein 3Dはそのリストに入るべきだね。

「Micro Mages」: https://morphcat.de/micromages/ これを思い出すな。彼らの動画で、NESにゲームを合わせるために必要なことの breakdown を見たけど、めっちゃ面白かった!

交通方向の矢印を示した3枚目の画像を見て、ちょっとした「なるほど!」な瞬間があった。交差点で車が何をするかに複雑なルールはいらないんだ。交差点について考える必要は全くなくて、レーンについて考えるだけ!各選択セルでは、ランダムに決めるときに直進よりも曲がる方を低く評価するだけだし、Uターンを避けたいなら、そういうルールを設定するか、曲がることに「クールダウン」を設ければいいんだ。

誰かがBiffaを見逃してるね! https://www.youtube.com/watch?v=pGCoLh3NL7g レーンとフローが全てだよ。

車は行き先を知る必要がない。各道路タイルタイプにはそれぞれの方向がある。道路タイル0x16は水平道路の下部分で、車はこの道路で左から右にしか走れない。古いゲームがやるには複雑すぎるように見えることには、いつもシンプルな説明があるんだ。

よし!ついにベルリン(最安の街)で全ての商業スポットを買って、競争を避けられるようになる。そして、その後にレストランを開くつもり。昔は「アイスクリーム」(違法武器)を取引して、一つの街で買って別の街で売って、すぐにお金を稼いでから商業スポットを買ってたけど、開くことはなかった(ショップの管理が面倒すぎて)。でも、200個くらい買った後、セーブデータの数週間後にゲームが必ずクラッシュしてたから、結局やめちゃった。バグの詳細はわからなかったけど、このリメイクにはないことを願ってる!それに、最も楽しかったのは変なピザレシピを試して、味のアルゴリズムがちょっと変だったこと。たくさんの鶏肉やパイナップルを入れて、いくつかの材料を混ぜると、年齢層から高評価をもらえた。でも、競争を妨害する方が普通のビジネスを扱うより面白かったな。

エンジンをゼロから作ってるから(元のエンジンを再現してるわけじゃない)、元のバグは絶対にないよ。もちろん、自分のバグは出るだろうけど、今はオープンソースだから、もっと多くの人が修正できるしね :D

一番利益が出るピザ、ピザ生地にミンチトマト一個(文字通り一個)を乗せたやつ。そう、あなたは正しく読んでるよ、そのピザは0ドルで買える。丸め誤差でね、生地は無料(確かそうだったはず)で、ミンチトマトも丸め誤差以下だから、実質ゼロ。で、そのピザをお客さんが嫌がる最低価格で売るんだけど、価格が良すぎてアイスクリームもいらなくなる。

道路を一方向にして、道路が動きを支配するようにしたことで、コンベアベルトと同じような感じになったと思う…つまり、Factorioのコンベアベルト最適化が関係してくるかも。例えば、アイテムの位置を直接追跡するのではなく、アイテム間の差分を保存すること。道路の長さの間は車の距離が静的だから、圧縮や挿入、車の取り外しの時以外はね。 https://www.factorio.com/blog/post/fff-176

距離は静的じゃないよ。車同士が止まったりするからね。

こういう投稿が大好き!ゲーム開発に興味があったけど、時間がなかなか取れなかったから、ほんとにありがとう!

これがずっと開発されてきたのが好き。今の忙しいコーディングの時代に新鮮な風を感じるし、ゆっくりすることも大事だって思い出させてくれる。

「1994年のDOSゲームのオープンソース再実装」こういうのをコミュニティが協力して生かしていくのが好きだし、元のものを超えて成長するのもいいよね。