Colossal Cave Adventure の設計の素晴らしさ
PDP-10 FORTRAN版 Colossal Cave Adventure の
advent.for / advent.dat / advent.readme を読むと、
このゲームの「設計の凄さ」は
物語(テキスト)を“コードから分離したデータベース”として扱い、限られた計算資源の中で“世界シミュレーション”を成立させている
点に凝縮されていることが分かります。
以下、その設計美をソースの構造に沿ってエッセイとしてまとめます。
1. 物語を「データベース」として実装した先見性
この版の Adventure は、単にテキストをハードコードしたプログラムではありません。 最初に驚くのは、ゲーム世界の文章・地形・語彙・ヒント・運用メッセージまでを外部データファイルの“セクション”として定義し、 起動時に読み込んで内部テーブルへ変換していることです。
データファイルはセクション番号で始まり -1 で終わる、という明確なフォーマットを持ちます。
たとえば…
- セクション 1: 場所ごとの「ロング説明」
- セクション 2: 繰り返し訪問時の「ショート説明」
- セクション 3: 移動(トラベル)表 – 「場所Xでこの動詞を使ったらYへ」
- そのほか、ヒント、メッセージ、語彙表などがセクションごとに定義
こうして、物語は“編集可能なデータ”へ落とし込まれています。これは現代の言葉で言えば データ駆動設計(data-driven design) そのものです。 ゲームエンジン(ルール・状態更新・入出力)と世界コンテンツ(文章・地名・語彙・イベント文)を切り離すことで、 物語側は修正・拡張がしやすく、エンジン側は汎用化されます。 これを 1970 年代にやっているのが凄いところです。
2. “テキストの保存”が、すでにエンジン設計になっている
さらに面白いのが、テキストの保持方法です。
advent.for では、読み込んだ文章は巨大配列 LINES に格納され、
各行の前に「次の行へのポインタ」を置く方式がコメントで説明されています。
さらに、そのポインタが負なら「そのメッセージの先頭行」を意味するなど、
メッセージを“リンク構造”で保持しています。
そして STEXT / LTEXT / PTEXT / RTEXT / CTEXT / MTEXT といった配列は、
その LINES の“ポインタ位置”を指す索引テーブルとして働きます。
これは単なる省メモリ技巧ではなく、
「同じオブジェクトでも状態(PROP)によって別の文章を出す」
といったゲーム表現を、きちんとデータモデルに落としている点が本質的です。
文章はコードに焼き付いた定数ではなく、 状態と結び付いたデータ として設計されている。 ここからすでに「インタラクティブフィクションのエンジン」という視点が見えます。
3. 移動(世界の地形)を“グラフ”として圧縮し、条件分岐まで符号化する
Adventure の“洞窟”は、結局のところ 場所(ノード)と移動(エッジ) のネットワークです。 ここでも設計が冴えています。
データベースのセクション 3(トラベル表)では、
「場所 X・行き先 Y・動詞(移動語)」のリストで移動を定義します。
実装側では、各場所の移動候補を配列 TRAVEL の連続領域として詰め込み、
各要素を NEWLOC * 1000 + KEYWORD の形で格納し、
最後の要素だけ負数にして“終端”を表します。
先頭インデックスは KEY(N) に保持されます。
これは今のゲームでも通用する「テーブル駆動の遷移表」そのものですが、 終端を符号で表す・領域を連続化するなど、 当時の制約(メモリ、速度)を前提にした美しい圧縮です。 そして行き先番号に“条件(フラグ)”をエンコードしておき、 遷移時にその条件を解釈することで 条件付き遷移 を実現しています。
移動=単なる場所移動ではなく、パズルの骨格となる ロジック付きのグラフ遷移 になっている点が、この設計の肝です。
4. 二語パーサ+語彙表:自然言語“風”を、テーブル参照へ落とす
プレイヤー入力は自然言語に見えますが、内部構造は非常に明快です。
入力ルーチン GETIN はコマンドを読み取り、
第 1 語と第 2 語を切り出して返す 仕様になっています。
YES/NO 確認も同じ入力系の上に構築され、
YES なら Y、NO なら N も受け付け、
それ以外なら「質問に答えて」と促して再入力させます。
UI としても堅牢です。
語彙はデータベース由来の配列(KTAB, ATAB など)に保持され、
VOCAB() が検索して「定義番号」を返します。
ここで重要なのは、この“定義番号”が単なる ID ではなく、
N / 1000 によって語の種類(動詞/名詞など)を埋め込む設計 になっている点です。
そのため、非同義語(non-synonymous)に 1000 個という上限が設定されます。
これは「自然言語っぽさ」を、最終的に 型付きトークン へ落とす設計です。 現代で言うところの字句解析+シンボルテーブルのミニマム実装が、 すでにここにあります。
さらに語彙テーブルは XOR 'PHROG' で簡単にマスクされ、
コアダンプなどからゲームの秘密が読み取られにくくなっています。
「ゲームを遊ばせるためのエンジニアリング」が、
細かいところまで徹底されています。
5. 世界状態の表現:オブジェクト連結リスト+プロパティ+場所条件ビット
Adventure の世界は、「場所」「物体」「状態」で成り立っています。 ソースコードはそれを極めて直截に表現します。
-
物体は
PLACE/FIXED/PROPなどで位置と状態を持つ (所持中はPLACE = -1で表現) -
場所ごとに「その場にある物体の連鎖」を
ATLOCとLINKの“鎖”で管理し、 場所の描写後に順に物体描写を出す
特に美しいのが COND(LOC) のビット設計です。
光(0 ビット)、液体属性(1, 2 ビット)、盗賊(pirate)の制約(3 ビット)、
さらにヒント用の状況ビット(4〜9 ビット)まで、
場所条件がビット単位で持たれています。
そこから見えてくるのは、このゲームが“物語”ではなく、
状態遷移システム(simulation) として書かれていることです。
advent.dat 側にも、
ドラゴンやトロル等の“状態別メッセージ”が 0/100/200… のように段階を持って並び、
コード側は PROP をキーに出し分けます。
つまり文章は固定台本ではなく、 状態に結び付いた反応 として設計されている。 これがインタラクティブフィクションを“ゲーム”にしている核です。
6. ペース設計:ロング/ショート描写、ヒント、そして「プレイヤーの停滞」を検知する
設計の“優しさ”も、コードに埋め込まれています。
まず、同じ場所に何度も来たときの冗長さを避けるため、
ショート描写(STEXT)とロング描写(LTEXT)を切り替える仕組みがあります。
配列 ABB(LOC) を増やして「省略(abbrev)」を管理し、
一度見た説明を再びダラダラ表示しないようにする。
これにより探索のテンポが上がりつつ、
必要であれば詳細描写も見られるというバランスがとれています。
次にヒント。 ヒントは「その状況の場所に何ターン居続けたか」を条件にトリガーされ、 質問を投げ、了承すればポイントを差し引きつつヒントを出します。
ここが本当に上手いのは、ヒントが“救済”であると同時に、 スコア(達成)との交換 になっていることです。 詰まってやめるよりは、減点してでも前へ進む。 その選択をプレイヤーに委ねる倫理的設計があります。
7. 緊張の演出:ランタン、閉鎖、そして時間で物語を駆動する
Adventure は「洞窟探検」というテーマを、 資源制約によって体験に変換します。
代表例がランプです。 ランプが弱ってくると警告し、条件が揃えば電池交換で延命し、 最終的には消える。外に出てランプが尽きた場合は“強制終了”さえあります。 暗闇は即死リスク(落とし穴など)にもつながりうるため、 プレイヤーは「行けるうちに行く」「戻れるうちに戻る」という判断を常に迫られます。
さらに「洞窟の閉鎖」。 宝物発見後に一定ターンで閉鎖フェーズへ移行する設計によって、 探索は終盤に向かう“物語の締め切り”を持ちます。 そしてスコアは 350 点満点として設計され、 宝物・生存・閉鎖到達など複数の達成を束ねて評価します。
プレイヤー体験が「迷って終わり」ではなく、 「達成して終わる」 ように締められている──それがこの設計です。
8. 動的世界:ドワーフと海賊が「物語の揺らぎ」を作る
静的なパズルに留まらないのは、 敵対存在が“イベント”としてではなく、 簡易的な AI として存在するからです。
ドワーフは初期位置 DLOC を持ち、
プレイヤーが Hall of Mists(場所 15)に達するとシステムが活性化し、
段階(DFLAG)に応じて挙動が変わります。
これにより、プレイヤーには「世界が反応して動いている」という感覚が生まれます。
しかも行動には確率が絡むため、 再プレイでも同じ展開になりにくい。 “語り”ではなく、“システム”が緊張を生む。 ここにゲームデザインの強さがあります。
9. そして異様に現代的な「運用設計」── cave hours と wizard mode
この版の最も興味深い特徴の一つが、 ゲーム内に運用ポリシー(勤務時間に遊ばせない)が組み込まれている点です。
advent.readme には、
この版が「cave hours(洞窟の営業時間)」の概念を持ち、
管理者が時間帯を設定できること、
デモゲームだけを許可するモードがあることなどが書かれています。
実装側にも「prime time の判定」「再開の待ち時間(latency)」
「ウィザードは短縮可能」などが組み込まれています。
これは“ゲーム”がタイムシェアリングという社会環境の中で動いていたことの証拠であり、 同時に「遊び」を現実の制約と共存させる設計思想でもあります。 ゲームデザインが、システム運用まで含んでいるのです。
結び:Adventure の設計が今も輝く理由
このソースから見える Adventure の凄みは、 懐古趣味では片付けられません。
- データ駆動で世界を定義し(セクション分割)
- 遷移表(TRAVEL)と語彙表(VOCAB)で入力と移動を形式化し
- ビットと配列で状態を持ち、文章を状態に結び付け
- ヒント・スコア・資源制約でプレイヤー体験を破綻させず
- 運用ポリシー(cave hours)までシステム化している
こうして見ると、Adventure は「テキストの名作」である以前に、 ゲームエンジン+ワールド DB+対話 UI+運用機構 をひとつにまとめた、 非常に完成度の高い“システム設計”です。
文章が美しいのはもちろんですが、 設計が美しいからこそ、その文章がゲームとして機能し、 何度でも“冒険”になり続ける── それが、このソースを読んで改めて分かる素晴らしさです。



