下にあるゲーム——地形、ヘリコプター、敵、ミサイル、音、ミッション——は、 土曜日の午後に私が出した9つの指示から生まれました。
上の数字はその最初の版のものです。いまオンラインで遊べるのは、同じ着想にアート、音、 そして13ラウンドの批評を重ねたものです。
なぜこのゲームか
オマージュであり、錨でもある
1992年にDesert Strikeというゲームがありました。アイソメトリック視点で 攻撃ヘリを操縦し、弾薬と燃料を管理し、ウインチで人質を救出し、どの目標から叩くかを自分で 選ぶ。子どもの頃に遊んだゲームの一つです。
34年後、自分なりのオマージュを作りたくなりました。そしてこのゲームは 錨となるプロジェクトにもなりました——ゲーム開発、AIを使ったプログラミング、 そして一度もやったことのなかった「公開しながら進める」というやり方を学ぶための、 ちょうどよい口実です。
錨は実際の問題を解いてくれます。何かを「学んだ気になって」どこにも辿り着かない、 というのは簡単に起きます。動くか動かないかがはっきりする成果物があると、自分を ごまかしにくくなる。審判はゲームそのものです。
仕事の分け方
3つのセッションを並行して
1つのセッションでは作業しません。3つを同時に走らせ、それぞれに別の役割を 持たせています。
| セッション | 何のために | つまり |
|---|---|---|
| アイデアを話す会話 | 仕組みを考え、決める | 方法 |
| 制御用のセッション | 環境を整え、道具を作る | 計装 |
| 封じた隔離セッション | 長い自律性をもって作る | 生産 |
3つとも測りました。
| どこ | 私の文 | tool use | 1文あたりのtool use |
|---|---|---|---|
| 方法を考える | 28 | 36 | 1.3 |
| 道具を作る | 20 | 218 | 10.9 |
| ゲームを作る | 9 | 1,240 | 137.8 |
端から端まで2桁の開きがあります。考えるのは会話です——私が1文、返事が1つ。道具を作る 段階では、指示1つにつき11歩近く進みます。生産とは、エンジンをかけて道を空ける ことです。
ゲーム全体を作るよりも、方法を考え出すほうに3倍多く話しました。
内部のしくみ
中心にある1つの関数
11ファイル、133 KBのJavaScript、ゲームエンジンなし。
main.jsです。これが最良の設計だとも、リファクタリングが不要だとも
思っていません。AIが生成したものそのままで、いまのところ手を入れないつもりです。すべてはノイズから始まります。noise.jsは1.6 KB、依存関係は
ゼロ。ある点を渡すと必ず同じ擬似乱数値を返す数学関数の集まりです。複数の周波数で足し合わせ
ると、地形の起伏になります。
そしてすべては1つの関数に収束します。terrain.jsはその
ノイズを受け取り、getHeight(x, z)を公開します——マップ上の点を渡すと、そこの
地面の高さが返ってくる。5つのモジュールが地形を読み込みますが、どれもそこから欲しいものは
この関数だけです。ヘリコプターは、自分がどの高さを飛んでいるかを知るために。エンティティは、
地面に接地するために。弾は、着弾したかを知るために。パーティクルは、正しい面で弾けるために。
パネルは、ミニマップを描くために。物理エンジンもシーングラフの照会もありません——
誰でも呼べる純粋な関数があるだけです。
そして誰も隣を知りません。ヘリコプター、エンティティ、弾、パーティクル、
パネルは同じ段に並んでいて、互いに関心がありません。それらを縫い合わせているのは、
最後に1つだけ置かれたmain.jsです。だからこそ6つのファイルを一度に、
ひとまとめに書き直しても何も壊れませんでした——どれも地形に応え続けさえすればよかったから
です。
サブシステム
既製のエンジンなら箱から出てくるものが、ここではコードです。
| サブシステム | 何をするか |
|---|---|
| 地形 | ノイズから起伏、道、オアシス、平坦地を生成する |
| 描画 | シーンを描き、ブルーム——光源からにじみ出る輝き——を含む後処理に通す |
| 音響 | ローター、武器、爆発、警報を、すべてリアルタイムで合成する |
| パーティクル | 炎、煙、砂埃、破片を、使い回す固定のプールから出す |
| 弾 | 弾道、射程、そして地面と目標への当たり判定 |
| エンティティ | レーダー、対空砲、戦車、ジープ、兵士、人質、補給箱、着陸地点 |
| ミッション | 目標、集計、そして勝利条件 |
| 入力 | キーボードとマウス。照準はワールド内のカーソル位置から導出する |
組み上がる過程を分単位で
土曜日、12:02
以下は、後からテーマごとに整理し直したものではなく、実際に生まれた順番です。ファイルの 更新時刻とセッションのログをそのまま使いました。文字どおり、ゲームが自分で組み上がって いく様子です。
<canvas>1つ、そして3Dライブラリを
指すインポートマップ。まだ何も起きません。entities.jsだけで40 KBあります。レーダーとは何か、
対空砲とは、兵士とは、人質とは、指揮所とは何かを知っているファイルです。これが世界
です。

技術スタック
最初に1つだけ制約を課しました。ブラウザで、3Dで、何もインストールせずに動く こと。その結果、ウェブ用の3Dライブラリと素のJavaScriptになり、ゲームエンジンは 使いませんでした。ビジュアルエディタなし、既製の物理なし、既製のパーティクルシステムなし ——すべて手で書いています。
第1章にとっては正しい判断でしたし、どこかの時点でおそらく間違いになるでしょう。
品質のエンジン
作る側は裁かない
AIと並んで作ることの問題は、AIが同意してくれることです。爆発を頼めば爆発を作り、 そしてAI自身がそれを素晴らしい出来だと思っています。作る者が評価も兼ねると、基準は下へ滑っていき、すでに 出来ているものの高さで止まります。
そこで、gauntlet loop——作る者と批評する者を向かい合わせに置き、毎周とも文脈を 真新しくするという発想——に倣って、役割を分けました。一方に作る者。もう一方に、 コードを一度も見たことがなく、何を試したかも知らず、並べた2枚の画像だけを受け取る 批評者——私のものと、品質の参照。問いは1つ、どちらが優れているか、そしてなぜか、 観点ごとに別々に。パレット。光。動き。シルエット。カメラ。観点ごとに判定が下ります。
批評者に渡した参照は、目標ではありませんでした。あれは方向を与える計器 です。評価者にとっては「これは良い」と言うより、「パレットが単色だからこちらが劣る」 と言うほうがはるかに易しい。比較は、具体的で手の打てる批評を生むために存在します。
最初の視覚的判定は容赦のないものでした——5観点対0で私の負け。しかも 有益でした。名前がついていたからです。単色のパレット、太陽が高すぎて露出が飛んでいる、 平べったい爆発、動きを先読みしすぎるカメラ、視覚的な目印のない敵。
並行して走っていたゲーム性の批評者は、より優しく、そしてより厳しいものでした。
資源、輸送、武装、ミッション · 引き分け
戦闘の駆け引き · 負け — 対空ミサイルが回避不能、8回中0回
2人の批評者が挙げた6つの欠落は、6ファイルにまたがって一度に直しました。その途中で つまずきが1つ。モデルの安全フィルタがコマンドの1つを拒みました——よりによって、空の色と 陽光の色を変えるものでした。1文字も変えずに送り直したら、35秒後に通りました。
避けられなかったミサイル
2ラウンド目、批評者は意見ではなく測定値を持って戻ってきました。「DODGE!」の警告が 着弾の0.20秒前に出る——そこに人間の反応時間は存在しません——回避動作の 再使用待ちが2.2秒で、3発斉射をしのげない。さらに2種類の敵兵器はまったく警告を 出していませんでした。
3つの数字、3つの修正。次のラウンドでは猶予0.62秒、6回中6回の回避、そして3発斉射を 生き延びた。回避不能から公平へ、2回の反復で。しかもそのどれ1つとして私が 始めたものではありません。私は見てすらいませんでした。
最初の2ラウンドで負けていたカメラは、3ラウンド目で引き分けに持ち込み、そこで止まりました。 目標達成、観点は固定、以後誰も触りません。
どこで止まったか
「砂が一色、棒付きキャンディの木」
5ラウンドを経ても、4つの視覚的観点が動きませんでした。パレット、光、動き、シルエット。 そして私が何を試したかを知らない批評者は、回を追うごとに正確な言葉で同じことを言い続け ました。
「敵の種別が、地面の色付きリングでしか見分けられない」
正しい指摘でした。この記事の最初の画像をもう一度見てください。一色の砂漠に、潰れた緑の 球でできた茂みが生えています。
そしてここで、この章で最良だったと思う判断が来ます——やめる、という判断です。
ある観点が3ラウンド続けて収束しないとき、規則は基準を下げるのではなく原因を 報告することです。ここでの原因は構造的で、後から見れば明らかでした。 プロシージャルなコードでアートを生成して、視覚的な豊かさには到達できない。 どのラウンドも、求められた結果を出す手立てを持たない系のパラメータをいじっていたのです。
そこでループは自ら止まり、4つの観点すべてに「手立てがないため停止」と記録し、問題を私に 返しました。開始から1時間47分後、私の手元には遊べるゲームと、何が足りないかの正直な診断と、 記録の中に嘘が1つもない状態がありました。
中断
道具を作るための2時間半
診断は、アートを作る手立てがない、というものでした。ゲームはおよそ12時間止まりました—— その一部は私が眠っていた時間です——そしてその窓の中で、2時間半の連続作業が アセットのパイプラインを組み上げました。依頼(「継ぎ目なく並ぶ砂漠の地面」、 「背の低いヤシの木」、「軍用車両」)を受け取って、出来上がったファイルを返す部品です。 自由に使えるアートのライブラリから取ってくるか、注文に応じて生成し、出どころを記録します。
そして「私が組み上げた」は言葉の綾です。夜通し働いたのはClaudeでした。yolo modeで 解き放たれ——一歩ごとに私の許可を求めて止まることなく——他に何も巻き添えにせず失敗できる 隔離された砂場の中で。
その前に、決定的な一歩がありました。本物の視覚的参照を集めに行くことです。 「きれいにして」とは頼めません。けれどもジャンルの画像を集め、そこからパレットと光の向きを 取り出し、それを作業の材料にすることはできます。後から出てきた品質のかなりの部分は、 画像を集めたあの退屈な30分に生まれています。
そして、私には予測できなかった失敗が1つありました。生成したテクスチャの背景を切り抜く ために、そこを純粋なマゼンタで塗るよう生成器に頼みました。自然界のどこにも現れない色で、 まさに後から見つけて消しやすいからです。返ってきたのはほぼ純粋なマゼンタ でした。
目には同一。厳密な色の値を探していた切り抜き処理にとっては、マゼンタなど存在しません でした。何も消えず、どのテクスチャも派手な長方形に囲まれて出てきます。直し方は、色を 仮定するのをやめ、各画像の縁で測るようにすることでした。
これは、生成器の上に自動化を重ねたときにだけ現れる失敗です。人間が判断することは正しく 当て、機械が要求することを外す——そしてその2つの隔たりは、機械が壊れるまで目に見えません。
前と後
砂漠が質感を得る
道具が整い、ループが再開しました。13ラウンドの批評、17枚の生成テクスチャ、そして箱の 代わりに入ってくる本物の3Dモデル。
同じ軍事基地を、工程の3つの時点で。



そして対空砲——さきほど回避不能だったのと同じもの——の前と後。




動いているところ


ラウンドを重ねるなかで、6つの静かなリグレッションが捕まりました。基地が爆発の火球を隠して いた。フィルタが炎のフレームを暗くしていた。戦闘の途中でパーティクルのプールが尽きていた。 画像の撮影中に手榴弾が炸裂していた。コードの行末コメントが誤って行を飲み込んでいた。そして エンジンがポリゴンの裏面を捨てるせいで、火球の半分が消えていた。どれ1つ ゲームを壊してはいません。どれもが、フレームごとに見ている評価者がいたから浮かび上がり ました。
勘定
16ドル
最初からすべて記録してあったので、勘定は1行ずつ合います。
| 方法 | 道具 | ゲーム | 合計 | |
|---|---|---|---|---|
| 私の文 | 28 | 20 | 9 | 57 |
| 機械の応答 | 32 | 152 | 564 | 748 |
| tool use | 36 | 218 | 1,240 | 1,494 |
| 実作業時間 | 2.4 h | 4.3 h | 8.7 h | 15.4 h |
| 処理したトークン | — | — | — | ≈ 370M |
そして費用。誤解を招かないために2行必要です。
(サブスクリプションの按分)
かかっていた額
月額のサブスクリプションはUS$ 200です。それを週で按分し、自分の総消費のうちこの章が 占めた割合を測りました——34%。16ドルになります。もう一方の数字は、同じ作業を従量課金の サービスとして請求した場合の額です。
耳に入る細部が1つ。無線で、ヘリコプターはSandstormと呼ばれます。 これは化石です。ゲームの最初の名前がそれで、同名の公開済みゲームがあると知るまで使って いました。名前は変わり、コールサインは残りました。
ゲームが出来上がったあと
仕事のもう半分
ゲームは1時間47分で遊べる状態になりました。それを誰かが開ける場所に置き、どう作ったかを 語るには、4日間と35.9時間の作業がかかりました。
その部分が前の節の数字に入っていないのは、別のことを扱っているからです。自分の機械で 動くフォルダを、見知らぬ誰かの機械で開くものに変えること——そしてそのあと、中で何が起きたかを 説明すること。
itch.ioで遊べるようになるまで4つの版
ゲームはもう動いていました。ファイルを開けば遊べる——私はこの章のあいだずっとそうやって 遊んでいました。公開するのに4回かかりました。
v0.1.3 · プレイボタンが404を返した — itch.ioのサーバーはフォルダのアドレスを解決しない
v0.1.3 · 誰が開いてもポルトガル語で始まった
v0.1.4 · itch.ioの枠の中ではマウスホイールが後ろのページをスクロールし、キーボードに焦点が移らず、画面が黒くなって安定するまで震えた
最初と最後のあいだで、ルールもアートも音も1つも変わっていません。 変わったのは、他人のページの中でゲームが動くために必要なものです。
最後の項目には、ゲーム側に新しいコードが要りました。それがないと、itch.ioの枠の中での
最初の数秒は安定するまで震える黒い画面でした——グラフィックスカードが、
プレイの真っ最中に、描画に使う小さなプログラムをコンパイルしていたのです。直し方は
シェーダの事前ウォームアップ——LOADINGがまだ画面に出ているあいだに、
全部まとめてコンパイルさせてしまう。ゲームではありふれた手法で、それをここへ連れてきたのは
公開という行為でした。
そしてその前の、誰の目にも触れない部分
| 何を | なぜ |
|---|---|
| 公開用の別ビルド | テスト用のフックをバンドルから外し、3DライブラリをCDNから取らずに埋め込み、メッシュの精度を落とす |
| セキュリティの見直し | 漏れているグローバル変数なし、アドレスの読み取りなし、開発時だけの分岐の残りなし |
| アセットの減量 | プレイヤー1人あたり8.7 MBから5 MBへ——ページを開く人は、待つつもりで開いていない |
| ライセンス | こんなに早く決める必要があるとは思っていなかった判断 |
| 2度決めたホスティング | ブラウザゲームにはitch.ioのほうが良いと分かって、最初の選択を取り消した |
| 3度の改名 | 最初の名前は公開済みのゲームと衝突し、2つ目は自分の判断で捨てた。そのたびにタイトル、開始画面、ライセンス、言語キーに手が入った |
| 2つの言語 | ゲームとこの文章で、別々に決めて同じ答えに行き着いた——既定は英語、ポルトガル語はワンクリック先 |
減量は思っていた以上に効きました。重さが1か所に集まっていたからです。ゲームはプレイヤー 1人あたり8.7 MBで出ていて、そのうち3分の1以上をたった1つのファイルが占めて いました——兵士、3.6 MB。その中身はほとんどアニメーションでした。24本の動作 シーケンスがあり、ゲームが使うのは8本。誰も見ない16本を外し、ジオメトリを圧縮したところ、 1.4 MBまで落ちました。
空は、プレイ中には誰も見分けられない解像度で保存されていて、1.5 MBから0.5 MBになりました。 車両も合わせて、合計は5 MBに着地——そしてバンドルは、ゲームが実際に求めるファイルだけを 運ぶようになりました。どこからも参照されていない9つは、外に残りました。
そして、いまあなたが読んでいるこの前線
ゲームを公開するのは半分です。もう半分がこれ——文章と、それを載せるサイトと、 記事が私以外の誰かにとって存在するために要るすべて。
| 何を | 何が要ったか |
|---|---|
| この文章 | 数えきれないほど書き、測り、書き直した——最初の版は、機械が書いた文章の癖をひととおり備えていた |
| 数字 | セッションのログから1つずつ数えた。最初の集計は最大で4.5倍に膨らんでいて、ゼロからやり直すことになった |
| 画像 | 初日のゲームは、リポジトリにならなかったフォルダから回収し、当時どう見えていたかを撮るためだけに動かし直した |
| 言語 | 全文を翻訳し、言語ごとにアドレスを分け、同じページだと検索エンジンに伝える印を付けた |
| サイト | ドメイン、ホスティング、そして章が出るたびにまとめていくページ |
| 計測 | 何人が来て、何人が最後まで読み、何人が言語を切り替えるかを知ること。加えて法が求めるクッキーの告知 |
| メーリングリスト | サービスを選び、フォームを作り、送ってもらったものがどう扱われるかを書く一文を用意する |
| アカウント | itch.ioに1つ、Xに1つ、ドメインを1つ——どれも、まだ空いている名前が要った |
この記事の最初の版は、いわゆるAI slopだらけでした。何かが面白いと示す代わりに 面白いと予告する文、すぐ下の数字と食い違う体裁のいい対句、本文が決して答えない修辞疑問。 「もっとうまく書いて」と頼んでも、そのどれ1つ消えません。効いたのは、悪い箇所を1つずつ つまみ出して、それぞれを規則に変えることでした——そこから出てきた一覧は、次の章以降にも 効きます。
2つ目の勘定
2つの半分——ゲームを作ることと、そのあと公開に出すこと——を同じやり方で測りました。 1列目は前の節の勘定そのもの、方法と道具とゲームの全部です。2列目はその後に来たもの—— 公開用のビルド、ストアのページ、サイト、そして4か国語のこの文章です。
| ゲームを作る 方法・道具・ゲーム | 公開して語る 区切りより後 | 2つの合計 | |
|---|---|---|---|
| 期間 | 9/4 18:39 → 9/6 19:18 | 9/6 23:05 → 9/10 23:05 | — |
| 経過時間 | 48.6 h | 96 h | 144.7 h |
| 実作業時間 | 15.4 h | 35.9 h | 51.3 h |
| 私の文 | 57 | 303 | 360 |
| 機械の応答 | 748 | 2,685 | 3,433 |
| tool use | 1,494 | 2,524 | 4,018 |
| サブスクリプション費用 | US$ 16 | US$ 25 | US$ 41 |
金額では2つはほぼ並びます——US$ 16に対してUS$ 25。違いは、それぞれが私自身をどれだけ 必要としたかにあります。ゲームを作るのに57文、公開するのに303文。
次に来るもの
第2章、すでに進行中
この記事が出た時点で、次の章はもう始まっていました。いま作業台にあるもの。
音を本気で。初日のオシレータによる音は役目を果たしましたが、そろそろ 本物の音響エンジンの番です——イベントで鳴る音、ミキシング、そして銃がそれらしく 聞こえるかを判定する評価者。
性能。プレイヤーの機械に合わせて変わる品質段階、ジオメトリの統合、 そして運任せにせずゲームが守るフレーム予算。
アセットをもう一段上へ。実際の標高データから彫り出した地形、モデルごとの 物理ベースのマテリアル、破壊、そしてボリュメトリックな効果。
そして何より望んでいること——これをオンラインに出して、あなたに遊んでもらう こと。1レベル、ブラウザで、インストールなしで。
コードと道具について
いまのところ、コードも、使ったプロンプトも、作った道具も公開しないことにしました。 もっと先では公開するかもしれません。当面は自分の過程を共有することに集中します——論理、 判断、間違い、数字、そして舞台裏。私が語れるのはそれです。
これを追いかけたい方へ
このゲームは、間違いを見せたまま、数字を開いたまま、1章ずつ公開の場で育っていきます。 そしてあなたの声を聞きたい——コードについてではなく、ゲームについて。難易度は公平に 感じますか。ヘリコプターは思ったとおりに応えますか。この最初のレベルに足りなかったものは 何でしょう。ここから送ってください、 またはXのプロフィールで返信を。