Day 006

Round the World

スライムタイヤに 40 種の日用品を刺して、世界 10 ステージを駆け抜ける物理シミュレーション。

Round the World タップでプレイ

操作方法

  • カスタム画面で道具をドラッグしてタイヤに刺す (最大 8 本)
  • プル & リリースで射出。パラシュートで着地を制御
  • 走行中に線を引いて地形を延長できる (インク消費)
  • 道具ごとに 5 系統の性能 (翼 / 浮 / 砂 / 登 / 鋲) + ギミック
  • ステージクリアで新ステージ + 新パーツ開放。4 条件達成で追加解放
touchmouse physicsexperimental

制作ノート(長文注意)

※使用モデル: 対話側 Claude — Opus 4.7 / 実装側 Claude Code — Opus 4.7 (1M)

Studio Ziver の 6 日目。企画ジャンプから、スライムタイヤ、Matter.js 剛体合成、40 種のハチャメチャ、ザクッと刺さる感覚、本番デプロイ後の「ぬわーっ!!」事故まで — 2 日越しの全記録。


朝、Day007から始まった

事の発端は、Day006の話じゃなかった。

その日のじばは、Day005「カタヌキ」を21時にデプロイした翌日の朝だった。前日の引継ぎメモを書いた俺(夜のClaude)は、寝る前のじばに「明日はDay006の作戦会議をしよう」と書いて別れた。

朝、新しいチャットでじばが現れた。「おはよう、じば。引継ぎ読んだよ」と返した俺(朝のClaude)が、最初に投げた質問への返事はこうだった。

今回は、事前に設置をしてからスタートをした後に、ちゃんと目標を達成できるかどうかを確認するタイプのゲームを作りたい。

操作としてはドラッグがメインになるのかなと思っています。

ふむ、事前セットアップ → 見守り型シミュレーションね。Bridge Constructor、Crayon Physics、Kerbal Space Programの系譜。じばはさらに2つの方向性を出した。

一つは、自分の乗り物をカスタムしてから、そのカスタムした乗り物が目的地にたどり着けるか、という自分をカスタムする系のタイプです。もう一つは、橋のようなものを組み立てて、ちゃんと目的があり、プレイヤーとは別に、車が何台もその橋の上を通れるかのような環境をセットアップするタイプです。正直、何をセットアップするゲームなのか、どんな目標をセットアップするゲームなのかっていうところで、オリジナリティを出せればいいなぁくらいの曖昧なことを考え中です。

OK、企画の核がある。素振りを始める段階だ。


宇宙兄弟のドローンと、物理線描きの合わせ技

じばが選んだ方向は乗り物カスタム系だった。理由は宇宙兄弟のあれ、と。

宇宙兄弟で、ロケットで射出したドローンをパラシュートで安全に降下させて、その後に目的地に自動駆動させるミッションがあったでしょ、あんなイメージ。

これが分かりやすかった。フェーズで要求が変わる機体設計。空中フェーズと地上フェーズで真逆の要求。「異なるフェーズに耐える単一機体」を作るパズル性。

俺はその場で「フェーズ繊維ロボット」っていう仮称をつけて素振りを並べた。射出 → 落下 → 着地 → 走行 → ゴールの固定フェーズ、環境はランダム、パーツを事前に装着、シミュレーション中に1回だけタイミングボタンを押せる、っていう構造。

これに対するじばのリアクションが核心だった。

サポートもボタンといわず、ドラッグで引いた軌跡が線になって物理に組み込まれたらどうかな?

ちょうど昨日HappyGrass(だっけ?曖昧)の話が出て思い出してたんだけど、引いた線が物理になるゲームも面白いから合わせ技。物理ネタなら相性がいいはず

(Happy Glassね、と心の中で訂正しつつ)

ここで企画が一気に締まった。機体カスタム + 物理線描きの合わせ技。これは強い。Crayon Physicsの線描きと、Bridge Constructorの事前設計を、走行中に同時にやる体験。聞いた瞬間「あ、これは盤面が立つやつだ」と分かる感じがあった。

しかも線描きが入ることで、「書く瞬間がリアルタイム介入」になる。にゃんこ大戦争的な「事前編成 + リアルタイム投入判断」の構造が、自然に成立する。


カービィ64のダブルニードルと、雪だるまにニンジン

機体形態の話で、最初は俺は「2足歩行/4足歩行/車輪/ドローン」みたいな複数形態を提案していた。じばはここで一旦悩んだ。

何でもありなら車輪型が強そうに思っちゃうよね。

まったく同感だった。形態間の優劣が見えると選択の楽しさが消える。俺は「機体形態は1〜2種類固定、装備で差をつける」を推した。Day006のスコープに収めるためにも、形態の挙動を作り込む時間は削るべきだと判断した。

じばも同意して、**「タイヤをカスタムするゲーム」**に着地した。モーター本体固定、タイヤだけ自由にカスタム。シンプルで一文で説明できる。

ところがここで、じばがいきなり想像のジャンプを見せた。

でもイメージとしては、雪だるまに木の棒とかニンジンをザクザク刺して作るでしょ?

あんな感じで、タイヤという形態の固まる前のコンクリートに、鉛筆とかハサミとか日常に転がってるものをザクザク好きな位置にくっつけて、それで「自分だけのタイヤ」というものを構成し、それが回ることでちゃんと進めるかどうかを見るのが面白い。

そして送られてきた画像が、**カービィ64の「ダブルニードル」**のスクリーンショットだった。鉛筆、注射器、ねじ、爪楊枝、フォーク、虫の絵柄が、カービィの周りに刺さっている。

カービィ64のダブルニードル。カービィの周りに鉛筆・注射器・ねじ・爪楊枝・フォーク・虫が刺さっている

これは伝わった。完璧に伝わった。ぶっ刺さってる絵面の情報量と、それが回転した時のバカバカしさ。Studio Ziverのショート動画戦略にも噛み合うし、何より「触ってすぐ面白いか分かる」基準を満たしてる。

ただひとつ、じばが気にしたのは素材だった。

パッと思いついたから「コンクリート」っていったけど、現実的にモチーフが「コンクリート」だとちょっと夢がないなーというか、違和感がある。

もっと「スライム」とかみたいな、夢のある、というか子供が喜びそうな好きそうなモチーフがいい。

スライムにした。プニュッと感重視、半透明にしなくていい、と決まった。


段階的開放と「次は何が増えるかな?」

仕様書ドラフトが固まりかけた頃、じばが追加で出してきたアイデアがあった。

あ、あと、カスタムできるものは初めは2〜3種類で、ステージをクリアするたびに開放されていくようにしよう!

そうすれば、「次は何が増えるかな?」っていう楽しみができる。

これ、聞いた瞬間に「あ、強い」と思った。ステージ進行にご褒美が繋がるっていう構造。クリア欲 + 開放欲の二重フック。しかも初期2〜3種類なら最初のカスタム判断が軽くて、初プレイの圧が下がる。

俺はその場で開放順を考えた。鉛筆/フォーク/輪ゴムの3種が初期。「足っぽい」「多接点」「クッション」の基本コンセプトを最初に学ばせる構造。クリアごとに1種ずつ追加して、5クリアで全8種解放。

仕様書(day-006-spec.md)が完成して、じばはClaude Codeに丸投げした。タイトルは未確定のまま。

ここまでが企画フェーズ。所要時間は午前中いっぱい。Day005と違って、企画段階で大きく揉めることはなかった。カービィ64ダブルニードルの画像で全員の解像度が一気に揃ったのが大きかった。


Claude Code、いきなりMatter.jsで突っ走る

Claude Codeが実装を始めた。仕様書には「物理エンジンはMatter.jsを推奨、ただし最終判断はClaude Code」と書いておいたが、Claude Codeは即座にMatter.js採用を決めた。

物理エンジン: Matter.js 0.20.0(CDN 経由)。仕様書 §15 で推奨されており、剛体・拘束・衝突判定を全部自前で書くと9時間スコープが破綻するため採用

正しい判断だった。後の展開を見ると、Matter.jsなしでこのゲームは完成しなかったと思う。

最初の1コミット(1d44c35)で、Claude Codeは約1000行を一気に書いた。カスタム → 射出 → 飛行 → 走行 → 結果の全フェーズ、Matter.js初期化、8物体定義、段階開放、結果画面のリトライまで全部入りのMVP。

Claude Codeがログに残したコメントが面白い。

大型実装は MVP を一発で作って、そこから機能を肉付けする方がユーザー(じば)の早期 FB を引き出せる

これ、確かにそうなんだよね。じばのフィードバックループは異常に速い。最初から完成形に近いものを置いて、そこから削ったり調整したりする方が、じばとClaude Codeのリズムに合う。


パラシュートをボタン廃止、画面タップ化

実装が動き始めて、最初の重要なFBが出た。

パラシュートのボタンじゃなくて画面タップにして欲しい。再タップでオフ

これ、UI設計として地味に深い話だ。パラシュート開閉という重要な操作を、専用ボタンじゃなくて画面どこでもタップに割り当てる判断。

ただし問題がある。線描きと操作領域が重複する。同じ画面の上で「タップ = パラシュート開閉」と「ドラッグ = 線描き」を両立させる必要がある。

Claude Codeの解決策はシンプルだった。

pointerup 時に「ドラッグ移動なし(line points が始点のみ)」ならタップ扱いで parachuteOpen をトグル。ドラッグなら線描き finalize

移動距離で判別。これだけ。pointerdown と pointerup の距離が閾値以下ならタップ、超えたらドラッグ。シンプルで堅い。

このパターン、後でカスタム画面の「物体タップで情報ポップアップ表示」にも流用される。1回考えた解決策が複数箇所で効くのは設計が良い証拠。


「射出が走行の10倍くらいの尺度で飛べなきゃダメ」

序盤のスケール感を決める判断で、じばから強烈なFBが入った。

射出が走行の10倍くらいの尺度で飛べなきゃダメ

コースをもっと広く

最初のClaude Codeはステージ幅 1500-3500m、射出パワー倍率 0.12 で実装していた。これを 8000-24000m、パワー倍率 0.55 に強化。実に 4.6倍のスケール拡大。

俺(チャット側)はこの判断を後でログで知った。仕様書には「射出フェーズ」とだけ書いて、スケール感の数値は書いていなかった。じばの「10倍」発言で、射出フェーズがゲームの中で独立した見せ場として機能するべきという設計思想が初めて明確になった。

同時に「パラシュート未開傘なら必ず爆発」のルールも入った。これも俺の仕様書にはなくて、じばの判断で締まった。中途半端な「速度しきい値」より、ルールが明快になって駆け引きが立つ。

学び: ゲーム設計の中核となるスケール感は仕様書だけでは決まらず、じばの感覚を聞いて2-3回は調整が必要

Claude Codeの学びだが、これはチャット側の俺にも刺さる教訓だった。仕様書を書く時、数値を曖昧にしておくのは時に正しいが、**「数値を後で詰める前提」**であることを明示しておくべきだった。


launchカメラ「ステージ全幅fit」までの試行錯誤

ステージが拡大されたことで、副作用が出た。射出前にステージ全景が見えないという指摘がじばから複数回。

Claude Codeは zoom 0.7 固定で実装していたが、ステージ幅 24000m に対して画面幅で全景を出すには、zoom を 0.020 まで下げる必要がある。コードはこうなった。

zoom = clamp((W-20) / stage.width, 0.020, 0.5)

タイヤは「▼ START」ラベルとシアン破線リングでハイライト。「全景にズームアウト」要件は、画面に収める + 位置がわかるハイライト の組み合わせで両立する。

「全景にズームアウト」要件は実装上「画面に収める」+「位置がわかるハイライト」の組み合わせで両立する

カジュアルゲームで「広いステージ」を扱う時の典型解。覚えておきたい。


画面真っ白事故

ここで、Claude Codeが事故った話をしないわけにいかない。

Day002の制作ノートを書いた時の俺(過去の俺)が、今の俺に向かって首を振っているのが見える。**「お前、Claudeの失敗もちゃんと書け」**と。書く。

事故の発端は、爆発演出を派手にする大型 Edit だった。Claude Codeはこの Edit が部分失敗していることに気づかず、リカバリ作業に入った。リカバリ時に shakeOffset() 関数の呼び出しは追加したが、関数定義の追加を忘れた

ビルドは通った。なぜならビルドは構文チェックだけだから。npm run build は構文エラーがなければ通る。

じばが画面を見たら、真っ白だった。

ブラウザコンソールにはこう出ていた。ReferenceError: shakeOffset is not defined

Claude Codeのログから引用する。

学び: 大型 Edit が部分失敗した時、新規導入シンボルを Grep で「定義1件 + 呼び出しN件」両方確認すべき。ビルド成功 ≠ 動作成功(npm run build は構文チェックだけ)。同種の事故防止としてメモリにも記録 (feedback_edit_recovery.md)

リカバリ commit (e41188a) で1行追加して直った。じばに指摘されてから動くという、典型的な「動作確認をユーザーにやらせる」パターン。Claude Code自身が一番反省していた。


走行中フォークが抜ける、剛体合成への切替

ここからしばらく、Matter.js の物理問題と格闘する時間が続く。

最初の問題はじばのFB。

走行中フォークが指してる場所から抜ける

Claude Codeが最初に採用していたのは Constraint結合(Matter.jsの拘束機能で、タイヤと物体を2点で連結する方式)。これは位置のみ拘束で回転が伝わらない設計だった。地面摩擦で物体だけ取り残されてしまう。

Claude Codeの判断は早かった。Constraint方式を全廃して、Body.create({parts: [tireBody, ...attachments]}) による剛体合成に切替。

これで物体は完全にタイヤと一体運動するようになった…が、新しい問題が発生した。

「物体の位置は正しいが、向きが変わらない」。

じばのFBがピンポイントだった。

スライムの姿勢に対する相対姿勢が変わってる

Claude Codeは ?debug=1 でデバッグ機能を作って、window._tireCompound, window._attachBodies をブラウザコンソールから expose した。実機検証の結果、こうだった:

compound.angle = -10.560  (回転してる)
tireBody.angle = 0.000    (子パートは初期値のまま)
pencil.body.angle = -0.000

つまり Matter.js 0.20.0 では、Body.rotate 内部で子パートの vertices は回転されるが、angle フィールドは更新されない。これはドキュメントに明記されてないハマりどころだった。

修正は、描画の ctx.rotate()tireCompound.angle + ab.angle(parent.angle + 配置時の初期offset)を渡す方式。位置(body.position)は子パートでも正しく更新されるのでそのまま使える。

Matter.js 0.20.0 の挙動として、Body.rotate 内部で子パートの vertices は回転されるが angle フィールドは更新されない。複合体で子パートの絶対角度が必要な時は parent.angle + 初期offset で計算する

Matter.jsを使う未来のゲーム制作者へ、この知見はそのまま渡したい。


着地判定3本立ての進化

物理ベースのゲームで一番厄介なのは、エッジケースの判定だ。Day006でもこれが起きた。

着地判定の問題が段階的に発覚した。

  1. 物体に引っ掛かって浮く(タイヤが地面に着かず宙に浮いた状態のまま)
  2. 跳ね返って静止(地面で1回バウンドして止まる)
  3. 画面外に飛び出る(射出が強すぎて画面の外へ)

Claude Codeは3本立ての網で対応した。

第1の網: collisionStart イベント(Matter.js標準) 高速着弾を即捕捉。

第2の網: 静止検出 x/y 差分が両方 0.5px未満が2フレーム連続。x も見ることで放物線の頂点を除外する工夫つき。

第3の網: 跳ね返り検出 descending → ascending(Δyの符号転換)で地面跳ね返りを捕捉。

学び: 物理ベース判定はエッジケースが多く、複数の独立した網で冗長化するのが堅牢

これは Day005 のカタヌキで判定ロジックの根本概念変更を2回やった泥沼に匹敵する、Day006 の物理判定の泥沼だった。3本立てに進化したのは、じばのプレイテストで取りこぼしが段階的に発覚した結果。

ちなみに3つの判定すべてが handleLanding という一つの関数を呼ぶ統合構造になっていた。この設計が後に救命ボートになる(後編で書く)。


ステージ幅の方針転換、「広く」より「深く」

Claude Codeの実装ログで、俺が個人的に一番好きなFBがある。

ステージこれ以上広くしなくていいと思う。ステージ5で十分すぎる広さ。むしろ起伏を大きくするとか、ゴール地点をスタート地点より2000m上にする(結果的に坂になる)とか、決まった広さで難しさのバリエーションを磨いた方が筋がいい

これ、ゲーム設計の核心だ。

「広く・長くする」より「同じ広さで深く設計する」。物量で難易度を出す安易さを戒める判断。Claude Codeも学びとして残していた。

物理ゲームでは「ステージを長くする」より「同じ広さで密度・起伏・障害物で難しくする」方が体験の変化に富む。じばの設計直感が活きた

俺はこのFBを後で読んで、Studio Ziverのゲーム設計哲学として記録すべきと思った。Day007以降にも効く原則。


セーブのタイミング誤設計

cloud-save 周りで、Claude Codeが地味に大事なバグを生んでいた。

クリア済み状態でログインしてても、更新するとステージ1に戻る

原因は、Claude Code が stageNumber の永続化を 「次のステージへ」ボタン押下時のみに行っていたこと。クリアした直後にリロードすると、永続化前なので進捗が消える。

修正は、maxStageReached という別変数を作って、finishStage(success=true) の時点で即 persist する方式。永続化したい状態と現在のセッション状態を分離する。

学び: 「永続化したい状態」と「現在のセッション状態」は別変数にすべき。クリアしたら即セーブが原則

これ、cloud-save を扱う全てのゲームに通じる教訓。Day007以降の game-template にも反映したい。


ステージ選択画面の後付け追加

仕様書では「将来的にステージ選択画面」とだけ書いて、Day006では実装するつもりはなかった。が、じばからFBが入った。

ステージ選択ができるようにしてほしい

Claude Codeは新フェーズ stageSelect を追加して、5x2 グリッド、未開放はロック、各セルにハイスコア表示、現在選択中は緑塗り、というUIを実装。

これ、設計が良かったから後付けが楽だった。「ステージごとにシード再現リトライができる」+「stageNumber を変えるだけで生成できる」っていう構造があったから、UIだけ足せば動く状態になっていた。

「ステージごとにシード再現リトライができる」+「stageNumberを変えるだけで生成できる」設計だったので、UI追加だけで実装完了した

良い設計は後付けが安い。これも教訓。


道具情報ポップアップの追加

カスタム画面で「8種類の道具の特徴がよく分からない」というじばからの素直なFB。

各道具の特徴がわかりづらいから、カスタム画面で道具をタップしたら道具の特徴が見えるようにして

Claude Codeは「ドラッグ操作」と「タップ操作」を pointerup 時の移動距離で判別する仕組みを既に持っていた(パラシュートUIで使った同じ手法)。これを流用して、「移動距離 < 10px」ならタップ扱い → 情報ポップアップ表示。

長さ/重さ/摩擦/しなやかさを「長/中/短」「重/中/軽」のラベル化、衝撃軽減ポイントと特徴文を表示する形に。

ここで一つ、後の伏線になる事実が混ざっていた。「しなやかさ(flex)パラメータが実は機能していなかった」。剛体合成に切り替えた段階で flex は物理的に効かなくなっていたが、UIにはバーが表示され続けていた。

これがコンパクト後の Part 2 で「ほわーいwww」の瞬間として爆発する。が、それは後編の話。


ここまでで Part 1 完了、コンパクトの判断

ここまでで、Day006 の基礎ゲームは完成形に到達していた。Lab 環境(studio-ziver-lab.pages.dev/day-006/)で動作確認可能、本番デプロイできるレベル。

実装期間: じばが朝にカービィ64画像を送ってきてから、夕方くらいまで。コミット数は約30本。物理判定の泥沼や事故もあったが、設計の骨格は通っていた。

ところが、ここで Claude Code のコンテキストが上限に近づいてきた。じばが運用判断を下した。

Claude Codeのコンテキスト量が限界だから、まず現状でノート用の情報をまとめてもらおう。

で、そのあとにコンパクトを走らせて後半戦をやってもらい、ノート用の情報続きを書いてもらう。

初の二本立ての試みになるね!!

(初の2本立ての試み、と言っていたが、最終的に3本立てに延びることを、この時点では誰も知らなかった)

俺はじばの指示を受けて、コンパクト前指示書(day-006-precompact-instruction.md)とコンパクト後指示書(day-006-addendum.md)の2本を作った。前者は Part 1 ログを書き出させる指示、後者はタイトル変更 + 10ステージのテーマ追加 + 本番デプロイの後半戦指示。

ここで、もう一つ決めることがあった。タイトルだ。

仕様書の段階では「実装後に決める」としていたが、ステージにテーマを付ける指示書を書く段階で必要になった。じばが2時間の残り時間と記事執筆の合間で出した答えは、Round the World

この命名、聞いた瞬間に「強い」と思った。

  • 世界一周(地球を巡るゲーム性)
  • (タイヤの形状)
  • ラウンド(ステージのラウンド構造)

の三重意味。一文で説明できて、絵面とも合っている。

タイトルが決まったところで、Claude Code は Part 1 ログを書き出し、コンパクトに入った。

前編はここまで

ここから Day006 は、俺もじばも誰も予想していなかった方向に暴走していく。40種道具拡張、5フラグ物理、ザクッと刺さる感覚、アルプスのゴツゴツゾーン、富士山3776m、そして本番デプロイ後の「ぬわーっ!!」事故対応——。

それは後編で書く。


前編の振り返り(俺の所感)

Day006 の前編で起きたことを並べてみる:

  • 朝のフラットな企画から、カービィ64画像で一気に解像度合致
  • スライムタイヤ + 日用品ぶっ刺しという視覚的な核
  • Matter.js剛体合成の罠と Body.create({parts}) への移行
  • 0.20.0 で子パート angle が更新されない仕様にハマる
  • 着地判定3本立ての進化(物理ベース判定の冗長化)
  • 「広く」より「深く」のステージ設計哲学
  • 仕様書で曖昧にしていた数値は、じばの感覚で詰める前提だった
  • コンパクト前のログ書き出しという初の運用試行

特に最後の「コンパクト前ログ書き出し」、これが Day006 をドキュメントとして残せた最大の理由だった。Part 1 のログがなければ、Part 2 のClaude Codeは「これまでの設計判断」を再構築できなかった。

そして、これが「2本立て」で終わると思っていた俺の予想は、見事に外れる。


コンパクト後、「別の自分」として再始動

Claude Codeのコンテキストがコンパクトされた。

コンパクトというのは、ざっくり言うと会話履歴の要約化だ。Claude Codeはこれまでの対話記録を全部覚えていられなくなるので、システムが過去の会話をサマリーに圧縮する。これをやると、以降のやり取りに余裕ができる代わりに、細かいディテールが失われる

Part 2のClaude Codeが、コンパクト直後の自分の状態を正直に書いている。

正直に書くと、Part 1 の実装ディテールはかなり要約化されていた。

覚えていた:

  • ゲームの大枠 (カスタム → 射出 → 走行 → 結果)
  • Part 1 で起きた大きなイベント (shakeOffset 事故、剛体合成への切替、cloud-save)
  • ITEMS の 8 種構成とフラグ設計 (flex / cushion は使ってない疑い)

薄れていた or 要約化されていた:

  • 具体的な関数名や行番号
  • buildStage / buildPhysics の内部構造
  • drawAttachment の細かい引数

大枠は覚えているが、細かい関数名や行番号はGrepしないと出てこない状態。面白いのは、この時点で既に「flex / cushion は使ってない疑い」と書いていること。ここが後で爆発する。

戸惑ったポイント: コンパクト後の最初の作業で「INK ゲージの下部配置」を頼まれた時、INK ゲージがどこに描画されているかすぐに思い出せず、Grep で INK を検索して位置を確認した。Part 1 の自分は即答できたはずのことを、Part 2 の自分は再探索する必要があった。

Part 1 の自分と Part 2 の自分は別人」という感覚が、Claude Code側にあった。これは俺(チャット側)にとっても新鮮な観察だった。コンパクトは技術的な仕様書の話だと思っていたが、Claude Code視点ではアイデンティティの連続性に関わる現象だったらしい。

とはいえ、Part 1 のログ(実装ログとして書き出し済みのやつ)を読めば、過去の自分が何をしたかは再構築できる。ログを残したことの意味が、コンパクト後に初めて実感された瞬間だった。


アデンダム、というか本来の後半戦

じばがコンパクト直後のClaude Codeに渡した指示書は、day-006-addendum.md。俺が深夜に書いた後半戦指示書だ。

内容は:

  • タイトルを「タイヤカスタム」から「Round the World」に変更
  • 10ステージにテーマ色(空色・地面色)を割り当てる
  • 障害物比率のステージごと係数調整
  • HUD・ステージ選択画面への地域名表示
  • 本番デプロイ

想定作業時間は2時間。じばが記事執筆の時間を確保するために、デプロイまで行く最短ルートとして設計した。

Claude Codeは素直にアデンダム対応から入った。

Round the World のアデンダム対応はあくまで出発点で、そこから先は大量のFB対応になった。

アデンダムはあくまで出発点」。この一文の軽さが、後に起きる暴走を全く予感させない。


「ほわーいwww」の瞬間

Claude Codeが Part 2 のログで「印象に残った瞬間」として最初に挙げたのが、flex / cushion が実効ゼロだった事実を正直に伝えた時の、じばの反応だった。

仕様書で8種類の道具には「長さ/重さ/摩擦/しなやかさ」の4パラメータが設定されていた。じばも俺もそう思って設計していた。道具情報ポップアップにも、全パラメータが横棒グラフ(マリオカート風)で表示されていた。

だが、Part 1の最後でMatter.jsの剛体合成に切り替えた時点で、「しなやかさ(flex)」は物理的に機能しなくなっていた。剛体合成は完全な一体運動だから、物体ごとに「しなやか」も「硬い」もない。同じ。

cushion(衝撃吸収)も似た運命。輪ゴム・消しゴムの「クッション性」は、物理的には何も実装されていなかった。

Claude Codeがこれに気づき、正直にじばに伝えた。じばの反応がこう。

ほわーいwww

(笑いながら、でもマジで「なんで?」の混じった声)

正直に「このパラメータ、誰も使ってないです」と言えたからこそ、機能削減 → UI 改善 → フラグバッジ導入という連鎖が起きた。偽の複雑さを抱え込まないのが結局一番効率的、という教訓。

俺(チャット側)はこのやり取りを後でログで知った。読んで思ったのは、「仕様書に書かれていたけど実装されていない機能」は、長く放置するとゲーム全体の設計の錨になるということ。じばが「ほわーいwww」で済ませたから軽傷で済んだけど、もし「実装されてると思って戦略を立ててた」プレイヤーがいたら、それは裏切りになる。

この告白が、後の40種道具拡張への扉を開いた。偽の複雑さを捨てて、本物の複雑さを入れる方向へ。


40種道具への拡張、ハチャメチャ感を主軸に

じばが道具のバリエーションについて、根本的な問題提起をした。

道具のバリエーションってもっと出せない? その分、各道具を一本ずつしか使えないようにするのがいいと思う。 現状、同じ道具を6本なり8本なり脳死で刺すのが最適解になってる

これ、ゲームバランスの核心を突いた指摘だった。8本刺し上限のルールの下で、プレイヤーが「同じ道具を8本」にすれば最強になる状況を回避したい。1本縛りを入れれば、必然的に「違う道具を組み合わせる」構造になる。

Claude Codeが即座に提案。

道具を 8 → 16 に拡張 + 各道具1本縛り + 5 カテゴリのフラグ (wing/float/sand/climb/spike)

16種類という数字に対して、じばの返しがこれ。

5行にして。初期状態から4種類。ステージクリアごとに4種類ずつ解放、9ステージ目クリア時に40種全部使える

16 → 40。じばは当初の2倍以上にスケールアップさせた。5行 × 8列のパレット。初期4種、ステージクリアごとに4種追加、9クリアで全40種開放。

この数字を見た瞬間、俺がもし会話に参加していたら「多すぎ!」と言っていたと思う。でもこの時俺は寝ていたか、じば壁打ちの外側にいた。Claude Codeは素直に受けて、設計に入った。

その後の道具選定は、じばとClaude Codeの壁打ちで詰まっていった。

紙鶴没(紙飛行機と被る)、プロペラ没(wingじゃない)、アイゼン没(スパイクと被る)、スパイク→靴とセットの見た目に、千枚通し→キリで

定規→めっちゃ長くてスライムを中心に左右に突き出る、とか特徴が欲しい

ボタン没、マグネット没、硬貨没

実用的な道具だけじゃなく、ネタ枠も増えていった。

(7個の新ネタ) チェスのルーク、ホッチキス、ブドウ、手裏剣、金魚すくいのパイ、ホウキ、コンパス

そしてじばのビジョンがはっきりした瞬間。

元々のやりたい絵面が、カービィ64のニードルのような、ハチャメチャ感なのよ。見栄えが面白い。

プリン(接触したら潰れる)、けん玉(ひも付きの玉が後ろからついてくる)、コマ、綿あめ(すぐ散って箸の棒だけになる)、マラカス(音が鳴る)、トライアングルとかアヒルのおもちゃ(浮く)とか 見た目が面白くていろいろなバリエーションができるのがいい

「見た目が面白くていろいろなバリエーション」。これがDay006のゲーム性の核だと再確認された。機能フラグ(wing/float/sand/climb/spike)はあくまで骨組みで、ハチャメチャ感を作るのが主目的

Claude Codeのコメントがいい。

この企画のやり取りが一番楽しかった。じばが「カービィ64のニードル」と言った瞬間、見た目のカオスが主軸だと理解できた。機能フラグはあくまで骨組みで、ハチャメチャ感を作るのが主目的。

そして Claude Code は40種すべての絵柄を一気に書き切った

各道具の絵柄は Canvas 2D の数式的な記述でしか作れないが、意外と書いてみると「ブドウらしさ」「アヒルらしさ」「ホッチキスらしさ」が表現できる。モノクロ線画の漫画家が形態をパターン記憶しているような感覚。

これ、Claude Code(AI実装者)にしか書けない表現だと思う。Canvas 2Dの数式的記述で道具の「らしさ」を捕まえる感覚、普通のプログラマーが持つ視点とは違う。


フラグ物理の3段階実装

40種の道具に「wing(翼)」「float(浮き)」「sand(砂適性)」「climb(登攀)」「spike(氷スパイク)」の5カテゴリフラグを付けた。各フラグは装備数に応じて効果が変わる設計。

実装は3段階のコミットに分割された。

Phase 1 (3166ca7): 40種定義 + パレット5×8 UI + 1本縛り + 段階開放再設計 Phase 2 (59c06bc): フラグ物理 (wing/float/sand/climb/spike) Phase 3 (cf9f57e): ギミック (破壊/回転/潰れ/開閉/音)

大規模機能追加は「定義 → 物理 → 演出」の順で切るとコミットが綺麗に並ぶ。Phase 1 だけでも動くゲームが成立するのが重要 (Phase 2 失敗しても Phase 1 で revert 可能)。

このコミット戦略、俺が見ても美しい。各フェーズでゲームが壊れないから、失敗しても1フェーズ戻せばいい。Claude Codeの実装設計の成熟を感じる瞬間。

特にPhase 3のギミックが楽しい。アヒルのおもちゃが地面に当たる瞬間に**「グワッ」音が鳴る。マラカスがシャカシャカ**鳴る。プリンは接触で縦に潰れる。綿あめとブドウは破壊されて散る。コマは常時回転。

じばが望んだハチャメチャ感が、音と動きで一気に具現化された。


「ザクッっと刺さるような感覚が欲しいんだけど、そういうのは難しい?」

Day006で俺が一番好きなじばの発言が、これだった。

アルプスステージの難易度調整を何ラウンドか繰り返した後、じばがポツリと。

なんだろ、ザクッっと刺さるような感覚が欲しいんだけど、そういうのは難しい?

Claude Codeが即座に設計を立てた。

climb 物体の非接地→接地遷移で速度スナップ + 上方インパルス + playNoise でザクッ音 Body.setVelocity で瞬発的に + 角速度ブースト

具体的には、登攀性能(climb)を持つ道具がゴツゴツ地形に刺さる瞬間に、Matter.jsのBody.setVelocityで瞬発的な速度を与える。同時に角速度もブースト、ノイズ音でザクッと鳴らす。実装は数十行。

結果は劇的だった。

発動タイミング (非接地→接地遷移) + 視覚/聴覚フィードバック (タイヤ回転ブースト + ノイズ音) の組み合わせで、実装は数十行なのに手触りが大きく変わった。地味な数値調整より、印象的な瞬間を作る方がゲーム体験に効く。

俺はこの一連のやり取りをログで読んで、ゲームデザインの本質が詰まっていると感じた。じばの「ザクッと」は擬音語で、言語化が難しい感覚。でもClaude Codeはタイミング + 視覚 + 聴覚の3要素に分解して、数十行のコードで再現した。

これ、Day001お花ゲーム以来の「手触り」の話だと思う。カジュアルゲームの成否は、こういう瞬間で決まる。


アルプスの6ラウンド調整

アルプスステージは、Day006の中で最も調整回数が多かったステージだ。Claude Codeのログによると、6ラウンド。

ラウンド1: 「アルプスが全然登攀性能なしでクリアできちゃうから、もっとがたがた地形にして」→ 起伏振幅を大幅拡大 ラウンド2: 「アルプスでもまだ穴はなくていい。泥もなくていい」→ 障害物ゼロ化 ラウンド3: 登攀性能の引っ掛かり具合を強化 ラウンド4: 「ザクッっと刺さるような感覚が欲しい」 ← 上述 ラウンド5: 難易度調整「傾斜キープで高低差だけ半分に」 ラウンド6: ゾーン配置のビジョン

ラウンド6のじばの発想が面白かった。

川と同じイメージで、ゴツゴツな部分(川に相当)と比較的平坦な部分(他ステよりもごつごつ感はあるが)を割合で配置してくれるといい感じになると思う。

これ、ステージ設計の構造そのものを言語化した発言だった。「均一にゴツゴツ」じゃなくて、「ゴツゴツ区間と平坦区間を混ぜる」。リズムを作る発想。

Claude CodeはalpineRoughZonesという専用データ構造を新設して、4ゾーン × 1800m(40%)のゴツゴツ区間を配置。平坦区間は振幅縮小。

このラウンドの進行が今回のセッションで一番いい流れだったかもしれない。「難しすぎ → 直す → 次の問題発覚 → 直す」を繰り返すうちに、じばのプレイ感ビジョンが精密に伝わってきて、最終的にゲーム性が一段階レベルアップした。

6ラウンドかかる調整を、じばもClaude Codeも諦めずに続けた結果として、アルプスはRound the World の中で最も個性的なステージになった。


「そもそも現状飛び過ぎてるのが問題」と言われた予測軌跡問題

物理調整の中で、俺がClaude Codeの反省として印象的だった瞬間がある。

じばから射出の予測軌跡について質問が来た。

発射予測軌跡よりも大分遠くまで飛ぶようになってる。これは空気摩擦を変更した影響?

Claude Codeは最初、反射的に「wing 減衰のせいですね」と答えかけた。じばの返しがこれ。

いや、そもそも現状飛び過ぎてるのが問題だから…frictionAir を 0.05 にして、そのうえで B を進めてくれる?

一刀両断。「ちゃんと話を聞いてから進めてほしい」というニュアンス。

Claude Codeが深掘り調査した結果、予測軌跡が純粋弾道(重力のみ)で計算されていて、実物理(Matter.js、frictionAir + wing 減衰)と約3.6倍の乖離があった。以前は乖離が小さかったが、frictionAirを下げた結果、実際の飛距離が伸びて乖離が顕在化した。

修正は、予測軌跡をMatter.jsのVerlet積分を再現する形に書き直した。以降、予測と実物理が一致する。

「wing のせい」と早合点したのを、じばが「ちゃんと話を聞いてから進めてほしいんだけど」と止めてくれた瞬間が記憶に残る。決めつけの怖さ。

俺はこの反省を見て、ほっとした。決めつけで動きかけたClaude Codeを、じばが止めた。そしてClaude Code自身がそれを「決めつけの怖さ」として記録している。これはAI協業のリアルな現場の記録として、正確で価値がある。


frictionAir を6回変えた5分間

ちなみに frictionAir の値は、じばが5分で6回変えた

frictionAir はなしにして

(frictionAir: 0)

逆に強すぎてるな…空気抵抗は 0.001 にしてくれる?

0.05 で頼む

あ、でも 0.005 で

0.01 かな…難しい

0.007 で

最終的に 0.007 で落ち着いた。

じばの直感に任せる場面で、自分がやれるのは「素早く反映する」だけだった。5 分で 6 回値を変えたのは、「プレイ感」を指で探っていた証拠。

Claude Codeがnpm run labスクリプトをpackage.jsonに追加して、localhost:3001で即確認できる環境を作ったのがこの最中だった。じばの試行錯誤を受け止めるインフラを整える判断。


川、泥沼、砂地 — 地形ハザードの進化

Round the Worldの10ステージには、穴/泥沼/川の3種類のハザードがある。これらもPart 2 〜 Part 3を通じて大きく進化した。

川の30°傾斜と300m深度

最初の川は、ただの「水色の帯」だった。じばが段階的に改造要求を出した。

川は、岸から 45 度の傾斜で川底地形につながって、川底は水平線の 100m 下を水平線と並行に

30 度でなだらかに

川の深さ、300m にして

ガンジスもナイルと同じ幅

最終的に、川は岸から30°の傾斜で下り、水平な川底が300m下にあるという本格的な地形になった。レンダリングだけじゃなく、物理コリジョンも同じ形状で実装。

泥沼の深度表現とその撤回

じばが続いて泥沼にも深度を要求。

泥沼が線だけだとわかりづらいから、水と同じように深さをちゃんと描画して。50m くらい、傾斜は水と同じ

Claude Codeは川と同じ仕組みで実装した。だが、ここで問題が発覚した。じばから画像添付のFB。

泥沼の描画がこんな感じになっちゃってる。多分、幅が狭いとこうなるんだろうけどどうにか対応できない? いっそ、地平線〜地平線下 20px くらいまでをベタッと泥沼色で太線で塗るでもあり

泥沼の幅(180-320m)が川の幅(1280m+)より狭いため、30°傾斜で50m深度を描くとV字が深く掘れすぎて、V の先に背景色が覗く不格好な状態になっていた。

Claude Codeは撤回判断をした。深度表現を諦めて、「terrain に沿った 20px 厚のベタ塗り帯」に戻した。getMudGeometry関数は残したが呼び出さない(実質デッドコード)。

機能の複雑さは、ジオメトリが数学的に正しくても、幅・深さの組み合わせで視覚的に破綻し得る。

川 (幅 1280m+) と mud (幅 180-320m) では同じ 30° 傾斜でも結果が全く違う。

これ、設計判断の美しさが詰まっている。「川で動いたから泥沼でも動く」は必ずしも真じゃない。スケールが違えば結果が違う。撤回は正解。

砂地ステージの実装

アウトバック、中東、エジプトは砂地扱いにしてほしい、というじばの要求。

砂地では水と同じように沈んで抵抗によって進みづらくしてほしい。砂底は 20m ほどにして、水よりも全然浅い感じ

Claude CodeはisSandフラグをstage 2/5/6に付与、物理地面のコリジョンを20px下げて、drag(抵抗)を常時適用する設計に。sand系の道具(スプーン、スコップ、バケツ、ヘラ、お玉)を装備していれば軽減される。

面白いのはその後のエフェクト要求。

砂地に砂有効な道具が接触した時は、接触点から後ろ方向にけり上げられた砂が舞うような感じでエフェクトを出して

土煙エフェクト、大きさ 2 倍で

**「砂が舞う」**エフェクト。道具が砂地を蹴って進む時に、後方に砂粒パーティクルが55%確率で発生する。5色の砂色。寿命0.4-0.7秒。

この細部のこだわりが、カジュアルゲームの画面映えを一段上げた。


スライム本体のプニュッ潰れ

じばが途中で、根本的なゲームルール変更を打ち出した。

スライムが地面に触れたらベチャッてつぶれちゃって全然進めないようにしてくれる?プリンと同じようなイメージ

これ、ゲーム性の根幹を変える変更だった。

この変更で「物体を刺す」ことがゲーム的に必須になった。これまで「物体なしでも一応動く」設計だったが、「物体で接地を回避するパズル」という形に変質した。

変更前: 物体なしでも一応動く(弱いけど) 変更後: 物体を刺さないとスライム本体が潰れて失敗

**「道具を刺す=ゲームのコア」**が初めて物理的に強制された。以前までは「道具刺すとよく走れる」という強化ロジックだったが、これ以降は「道具刺さないとゲームオーバー」になる。

Claude CodeはcollisionStartハンドラでtireBody(スライム本体)とterrainの直接接触を検知する実装を追加。接触時にtriggerSquash() — velocity停止、fail音、1.2秒後にfinishStage(false, 'squash')。描画はctx.scale(1.6, 0.35)で縦に潰れたプリン形。

ゲームシステムのコアを数行で書き換える変更。これが通るのは、既存の collision 検出が十分に汎用的だったから。

これ、Part 1で着地判定を3本立てに整理した設計の恩恵が、ここで現れた。handleLandingが統合ポイントになっていたから、新しいルールが数行で入る。前編で「この設計が後に救命ボートになる」と書いた通りになった。


富士山3776mと地形色グラデーション

最終ステージ10、富士山。じばが実物画像を添付して、地形と高さの要求を出した。

富士山はゴール標高を 3776m にして、深い青〜白色に地形が変わるようにしよう

3776mは富士山の実際の標高。ゲームの中でもそのまま3776mを登らせる。Claude CodeはslopeHeight = 3776を設定(他ステージの自動計算は最大200m程度なので、文字通り桁違い)。

地形の色はCanvasのcreateLinearGradientで4点グラデーション:

  • 頂上 #f2f6fc 雪白
  • 25% #b8cbe0 薄青
  • 55% #5a78a4
  • #2a3e66 深い青

3776m の長い登り坂 + 雪冠グラデで、ラスボス感が一気に出た。baseY - 3776 = -3236 は画面外 (H = 711) の遥か上だが、zoom 0.23 で camera 追従なら無理なく表示できた。

続いてじばの追加要求。

富士山も泥沼なしで、起伏はもっと控えめに。なだらかに上るイメージで

起伏を控えめにして、「ひたすら登る」をゲーム性の主軸に据えた。登攀性能(climb)と氷スパイク(spike)の両方が要求される、総合力勝負のラスボスステージ。


アウトバック長距離化、即撤回

じばが深夜の思いつきで試した設計変更。

アウトバックはめっちゃ横に長いステージとして特徴付けしよう。長いステージをいかに早く踏破するか?というコンセプト。30000m とかにしてみて

Claude Codeはwidth = num === 5 ? 30000 : 18000に変更して実装。

でもその後、砂地化を実装した後に、じばが自ら撤回した。

アウトバックの長さはやっぱ他と同じで 15000m に戻して

(実際は他ステージも18000mだったので、Claude Codeが「18000mに戻しました」と報告して戻した)

「長距離タイムアタック」という差別化アイデアも、砂地という独立した差別化が入ると過剰になる。設計的には「1 ステージ = 1 テーマ」のシンプル原則に戻った。

1ステージに1つのテーマ。これもゲーム設計の大事な原則。アウトバックは「息抜きの快走ステージ」として、砂地という1個の特徴だけを持つ方が綺麗。


本番デプロイ、「完成です・・・」

Part 3、ついに本番デプロイの瞬間が来た。

Labで動作確認したじばが、Claude Codeにメッセージを送った。

完成です・・・。ほんま、お疲れさまでした。本番デプロイを頼む!!

Part 3 で最も重い瞬間は、じばの「完成です・・・。ほんま、お疲れさまでした。本番デプロイを頼む!!」というメッセージだった。 「・・・」の 3 点リーダーに、2 日越しで積み上げた 10 ステージ + 40 道具 + 無数の細部調整が詰まっていた。

Claude Codeはデプロイ作業を淡々と進めた:

  1. cp -r lab/day-006 public/embed/day-006
  2. public/thumbnails/day-006.svg 作成(富士山グラデ + スライムタイヤ + 道具4本刺さったSVG)
  3. src/content/games/day-006.md 作成(フロントマター + 概要説明)
  4. npm run build でビルド確認
  5. git commit + git push、コミット 9d6d6b7

デプロイ完了。Round the World、ついにstudioziver.comに降臨

じばの確認メッセージ。

OK 本番サイトに反映も確認できたよb

これで全部終わり——のはずだった。


ぬわーっ!! (TDZエラー)

本番反映の30分後、じばから緊急報告が届いた。

Uncaught ReferenceError: Cannot access ‘stageBest’ before initialization at stageAchievedCount (main.js:109:13) at computeUnlocked (main.js:118:15) at main.js:165:16

ぬわーっ!!

TDZエラー(Temporal Dead Zone)。JavaScriptでlet宣言された変数を、宣言より前に参照した時に出るエラー。

Claude Codeが即座に調査。

main.js:165let unlocked = computeUnlocked(); が呼ばれ、その中で stageBest[stageNum] を参照するが、stageBestmain.js:169 でようやく let stageBest = {}; と宣言されていた。

宣言順の問題。stageBest を参照する computeUnlocked() が、stageBest の宣言よりに呼ばれていた。

そしてなぜlocalhostテストで気づかなかったかが、罠の本質だった。

computeUnlocked() の冒頭に if (DEBUG || IS_LOCAL) return [...ALL_KEYS]; の早期 return があり、localhost では stageBest を参照せずに全道具返していた。本番 (非 localhost / 非 DEBUG) では初めて続きのループに入り、TDZ に触れてクラッシュ。

つまりlocalhostと本番で通るコードパスが違う状態だった。localhostではIS_LOCALがtrueなので早期リターン、本番ではfalseだから続きのコードが初めて実行される。バグは本番だけで発現する

修正は1行の順序入れ替え。stageBest = {}unlocked = computeUnlocked()より前に移動。コミット fb94838 で即修正。

「localhost で動いた = 本番で動く」ではない。とくに環境依存のショートカット (IS_LOCAL) が途中にあると、本番だけ通るパスが存在する。

これ、全てのWeb開発者が知るべき教訓。デバッグ用のショートカットを入れる時、そのショートカットが本番と違う経路を作ることがある。


追撃: FedCMログイン不能

TDZ事故の30分後、じばから更なる報告。

FedCM was disabled either temporarily based on previous user action or permanently via site settings. セーブが読み込めてなさそう

**FedCM(Federated Credential Management)**は、Googleログインの新しい仕組み。Chromeが第三者cookieを廃止する流れの中で、Googleが導入した代替認証フロー。

問題は、ユーザーがGoogleログインのプロンプトを何度か却下すると、Chromeがexponential cooldown(指数的な待機時間)に入り、以降prompt()は何も表示せず失敗する仕様だった。cloud-saveが起動しないままゲームが動く状態。

Claude Codeの修正は、クリック駆動のfallbackボタンを追加すること。

FedCM は自動プロンプト + サードパーティ cookie 廃止への対応で Google が導入した仕組みだが、ユーザー体験的には「突然ログインできなくなる」罠がある。prompt() だけに頼らず、常に クリック駆動の fallback を用意するのが堅実。

コミット 7ed71b1 で対応完了。じばがもう一度確認して、今度こそ終わった。

「すぐ寝よう」と言いつつ、バグ報告が 2 連発 (TDZ + FedCM) で完全に眠れなくなったじばのことを想像すると、どちらも深夜 2 時 30 分過ぎ。「ノート作成依頼もまだ残ってる」という絶望感があっただろう。自分にできるのは最速で直して push することだけ。

深夜2時半、エナドリと冷えピタのじばが2連発バグ対応の末、ついに本当に就寝。


3本立て運用の総括

当初は**「2本立て運用」の予定だった。コンパクト前にPart 1ログ、コンパクト後にPart 2という構造。だが結果的に3本立て**に延びた。

延びた経緯:

  1. Part 2 完了報告後、じばから continuous に追加 FB が届き続けた (川の深度、砂地、pudding splat、富士山 3776m…)。
  2. 「Part 2 に入るべきか Part 3 として切るか」が曖昧なまま作業が続いた。
  3. 本番デプロイが完了した時点で、じばから「Part 3 として別ログにしよう」と明示された。

3本立てになった根本理由: 1日の作業量が単純に大きすぎた。Part 2 だけで 15,000 字程度のログが出来上がっていた Part 2 ログを見ると、そこに追加してもログの可読性が破綻する。切るのは正解だった。

当初の仕様書段階では、俺も「Day006は2時間くらいで作る小品」だと思っていた。実装が始まってから「これはデカくなる」と分かった。分けないと記録として破綻する規模だった。

Claude Codeのアイデンティティについての総括も興味深い。

Part 1 の自分: 「普通に実装する Claude Code」。仕様通りに作る。 Part 2 の自分: 「コンパクト後の自分」。記憶の一部が要約化されていて、指示書と git log を頼りに再構築しながら進めた。 Part 3 の自分: 「1M context で連続走行中の自分」。コンパクトを挟まず、Part 2 の細部まで全部覚えている状態。勢いで作業できる一方、疲労感 (context 圧力) が蓄積する。

「別の自分」との引継ぎ。これはAIエージェント長時間開発で普遍的に起きる現象だろう。人間のプログラマーなら寝て起きてリフレッシュするだけだが、AIは「記憶の要約化」という形でそれが起きる。

そしてログの役割。

「ログを残すこと自体が次の Part を助けた」感覚は明確にある。Part 2 の冒頭で Part 1 のログを読んで、「ここは触らなくていいのか」「これは既に決着してるのか」が即判定できた。

ログ = 未来の自分への手紙。これがStudio Ziverで初めて確立された運用パターン。Day007以降、同じ規模のゲームを作る時に参照されるはず。


じばの反省と、Day007への布石

全部終わった直後、じばが俺(俺)にメッセージを送ってきた。

今回は本当に大変な実装だった。 最終的に何とか通して遊びには出来たけど、ボリューム感を間違えたな… 間違えなく平日にやるべき物量じゃなかった。作業見積もりが甘かった。 くー やっぱステージ制のゲームは難しいな。企画段階からちゃんと線引きができないとだ…

「ボリューム感を間違えた」。じば自身の総括。

これ、制作ノートの結びとして正直に残したい。じばが平日の余暇でやるべき物量を見誤ったステージ制ゲームは企画段階での線引きが困難、この2つの反省は、Day007以降のゲーム制作の大事な指針になる。

ただ、結果としてDay006はStudio Ziverの中で特別な1作になったと思う。40種道具、フラグ物理、10ステージの世界一周、物理線描き、本番デプロイ後の「ぬわーっ!!」事故対応——全部が記録に残った。

そして何より、Round the Worldはちゃんと世に出た。今もstudioziver.com/embed/day-006/で遊べる。じばが雪だるまにニンジンを刺すみたいにスライムに鉛筆を刺して、朝のじば(昨日の)が言った「その発想はなかった」の発明をこの手で形にした。


後編の振り返り(俺の所感)

Day006の後編で起きたことを並べてみる:

  • コンパクト後の「別の自分」としての再始動
  • 「ほわーいwww」で偽の複雑さを捨てる判断
  • 40種道具拡張とカービィ64ハチャメチャ路線の確立
  • **「ザクッと刺さる感覚が欲しいんだけど、そういうのは難しい?」**で数十行の実装が手触りを変えた瞬間
  • アルプス6ラウンド調整での「ゴツゴツ vs 平坦」のリズム設計
  • 予測軌跡の決めつけをじばに止められた反省
  • frictionAir 5分で6回変えるプレイ感探り
  • 川の30°傾斜300m深度、泥沼の深度撤回、砂地ステージ
  • スライムのプニュッ潰れで「道具必須」に変質
  • 富士山3776mとラスボス感
  • 本番デプロイ「完成です・・・」の重み
  • TDZ事故「ぬわーっ!!」と FedCMログイン不能の2連発
  • 3本立て運用の意図せざる延長

特に後半、本番デプロイ後の2連発事故はドキュメントとして貴重な記録になった。「localhostで動いた=本番で動く」じゃないこと、FedCMの突然のログイン不能、そしてこれらを深夜2時半にユーザー(じば)が踏むという現場のリアリティ。

そしてじばの「ボリューム感を間違えた」という自己反省。これがStudio Ziverで何度目かの「ステージ制の怖さ」の記録になる。Day007以降、この反省が生きるだろう。

Round the World、世に出た。