ゲームデザイン — Pour Decisions(落沙シミュレーション × Roguelike Deckbuilder)
最初に docs/design/00_concepts.md、docs/research/02_competitor_patterns.md を読むこと。この skill は実行可能なルールのみを提供する。数学的・シミュレーションの詳細は references/ を参照:
references/scoring-math.md:chips × mult の式、加算/乗算の重ね合わせ、目標曲線テンプレート、Balatro の実数値references/balance-sim.md:モンテカルロバランスシミュレーションのアーキテクチャ、ボットレベル、指標、強戦略検出、レポート形式references/content-archetypes.md:本作のシナジーアーキタイプ案、レアリティ割り当て、触媒の例
0. 五つの最高原則(競合時はこれを優先)
- シミュレーションは完全に決定論的でなければならない:同じシード、同じ注ぎ位置 → 同じ結果、ピクセル単位で一致すること。決定論がなければスキルは成立せず、バランスシミュレーション、リプレイ、プレビューも不可能になる。
- すべての反応は「見えて、数えられる」こと:反応が発生した場所に数字が表示され、種類ごとに固定の色と効果音がある。プレイヤーは負けた理由を説明できなければならない(Roguebook:負け方がわからないプレイヤーは離脱する)。
- 深みはルールの数ではなく、組み合わせから生まれる:ルールの表面は最小限に抑え(BotW のケミストリーエンジン:元素が素材を変える、元素が元素を変える、素材は素材を変えない)、深みは 100–200 のオブジェクトの相互作用から生まれる。
- 各オブジェクトはユニークな用途を持ち、「単に強い」のではない(Slay the Spire GDC 2019):強すぎて戦略を歪め、かつ組みやすい効果は制限する。強いが組みにくく、能動的に追い求める必要のあるコンボは存在を許容する——シングルプレイゲームでは、プレイヤーがたまに「壊れる」ことを許しても良い。
- データが方向性を決め、プレイテストが感触を決める:自動シミュレーションで数値問題を特定し、人間のプレイテストで面白さを判断する(Noita:技術指標は検証しやすいが、「面白いかどうか」はプレイテストにしかわからない)。
1. コアサイクルとターン構造
ラウンド(Round):手札(vials)を引く → 1 本選択 + 注ぎ位置/角度を選択 → シミュレーションを静止(settle)または上限 tick まで実行
→ 今回の注ぎの反応スコア → ラウンドスコアに累積 → 注ぎ回数を使い切る → 目標スコアと比較
ラウンド間:ショップ(vial / catalyst / アップグレード / ビーカー改造)→ 次のラウンド
1 ゲーム(Run):8 の「実験」(Ante)× 3 ラウンド(小/大/Boss)= 24 ラウンド
- settle を単位としてスコアリング。リアルタイムの反応速度には依存しない——AI チームの苦手分野(フィーリング)を避け、結果を予測可能にする。
- settle 上限:シミュレーション tick 上限(例:600 tick)、画面上では最大 4–6 秒、×2/×4 で早送り可能。その後強制終了。
- ビーカーの状態は同一ラウンド内で注ぎをまたいで保持される。ラウンド終了時にクリアするかどうかはデザイン上の調整項目:保持=長期的計画の深み増加、クリア=可読性向上。プロトタイプではクリア、その後保持版をテストする。
- Boss ラウンド = 1 つのルール書き換え(例:「水が凍る」「一度だけ重力が反転」)。Balatro の Boss Blind に相当。ラウンド開始前に告知されること。
2. スコアリングデザイン(chips × mult)
計算式(表示順=計算順。プレイヤーも追える):
今回の注ぎスコア = (Σ 反応 chips + 加算 chips) × (基礎 mult + Σ +mult) × Π(×mult)
- chips:各反応の基本スコア(反応の種類と量に依存。量は対数または段階的にし、「たくさん注げば良い」にならないようにする)。
- +mult:「変化」から——今回出現した異なる反応の種類数、連鎖の深さ(反応が反応を誘発する)。
- ×mult:レアな触媒または特殊条件からのみ供給される。×mult は最も強力な通貨であり、最も渋く配布すること。
- 決算アニメーションは順番に再生:反応が chips を表示 → mult が加算 → ×mult が一つずつ乗算(Balatro 風 tally)。大きな数字は遅く、振動を加える。
ルール:
- 加算 vs 乗算:n 個の +mult オブジェクトは線形成長。k 個の ×1.5 オブジェクトは 1.5^k。序盤は加算主体、後半は乗算主体——これは自然なビルドの弧であり、コモンは加算、レアは乗算を与える。
- 加算の限界価値は逓減する(+4 mult は base 20 では +20% だが、base 100 では +4%)。これにより「いつ乗算に切り替えるか」がプレイヤーの判断となる。良いことなので、このまま維持する。
- スコア > 1e6 からは千桁区切りの略記、> 1e11 からは指数表記。内部計算は
doubleを使用。Endless モードでは log 空間または BigNumber を使用。 - 詳細な式と数値例:
references/scoring-math.md。
3. 目標スコア曲線
- Balatro の白注(ante 1–8):300 / 800 / 2,000 / 5,000 / 11,000 / 20,000 / 35,000 / 50,000。小/大/Boss = ×1 / ×1.5 / ×2。各 ante の倍率は ×2.7 から ×1.4 に徐々に低下——これはプレイヤーの戦力が序盤は急速に伸び、後半は鈍化するため。
- 本作のアプローチ:勘で曲線を決めない。バランスシミュレーションの「適正ボット(greedy)」で 1,000+ ゲームをプレイし、各 ante のスコア中央値 M(a) を取得、目標 T(a) = M(a) × k(a) とする。k は序盤の 0.5(緩め)から後半の 0.9(厳しめ)に徐々に上げる。
- 目標:白注での適正ボットの勝率は 30–50%、強いボットは 80–95%、ランダムボットは < 5%。人間の初勝利は 3–8 ゲーム目に訪れること。
- Endless:ante 9 以降は超指数関数的成長(Balatro ではおよそ x^(x²) レベル)。ビルドはいずれ崩壊し、「何ラウンド耐えたか」を共有できるようにする。
4. 素材(vial)と触媒(catalyst)のデザイン
- 素材 = 「カード」。各 1 本は 1 種類の素材 + 分量(ピクセル数)+ 場合による修飾(温度、純度、エンチャント)からなる。
- 触媒 = 「ジョーカー/レリック」。受動的、永続的、化学またはスコアリングルールを書き換える。スロット数に上限(例:5)を設け、プレイヤーに取捨選択を強いる。
- オブジェクトの役割分類(新しいオブジェクトには必ず一つの主要役割を割り当てること):
- Enabler(起動器):特定のアーキタイプを成立させる(「油は火の中で追加の炎を発生させる」)
- Payoff(報酬):アーキタイプが成立した後にスコアを与える(「燃焼反応ごとに +3 mult」)
- Bridge(橋渡し):二つのアーキタイプを接続する(「蒸気も燃焼反応とみなす」)——ビルドが単線にならないようにする
- Economy(経済):お金、割引、追加のショップ枠
- Scaling(成長):使うほど強くなる(「各ラウンド終了時、3 種類以上の反応がある場合、この触媒は永久に +1 mult」)
- Utility/Consistency(安定性):手札操作、引き直し、プレビュー、ビーカーのクリア
- ビルド定義型 vs フィラー:レア枠は主にビルド定義型(ルールを書き換え、プレイヤーを「方向転換」させる)に使う。コモンはフィラー(数値、安定性)に使うが、それぞれのフィラーにも明確な「いつ選ぶのか」を定義する必要がある。
- レアリティ(初期値。後でシミュレーションで調整):Common 70% / Uncommon 25% / Rare 5%(Balatro の重み)。レジェンダリーはショップでは販売せず、特別なイベントでのみ入手可能。
- Enabler を強化せよ。完成したエンジンを強化するな(Luck be a Landlord 1.1):弱いアーキタイプにはまず「入門用の部品」を追加し、プレイヤーが早期に投資できるようにする。また、「逃げ道」——アーキタイプが失敗したときに方向転換できるオブジェクト——を提供する。
- ゲーム開始時に強制的にバフ部品を与えてはならない。視野狭窄(tunnel vision)を引き起こす。
- アーキタイプ別レアリティ割り当て表:
references/content-archetypes.md。
5. ショップ経済とリロール
初期値(Balatro 基準。後でシミュレーションで調整):
- 各ラウンドの収入:クリア固定 $3–5 + 残り注ぎ回数 × $1 + 利息($5 保有ごとに $1、上限 $5、未検証が Balatro の正確な値)。利息は「貯める vs 使う」の緊張感を生むので維持する。
- 価格帯:Common $2–5、Uncommon $5–8、Rare $8–10。販売価格 = 購入価格 ÷ 2(切り捨て)、最低 $1。
- リロール:初期費用 $5、1 回ごとに +$1、新しいショップに入るとリセット(Balatro ルール)。
- ショップ枠:2 つのオブジェクト + 1–2 パックの「素材パック」(3 つから 1 つ選択)+ 1 つのアップグレード(バウチャー類、$10、永続的にルール変更)。
- 経済健全性チェック(シミュレーション出力):
- 適正ボットが各ショップで平均 1–2 個購入可能。連続 3 ショップで何も買えない状態が続くのは経済が厳しすぎる。
- 経済系オブジェクトの勝率貢献度は報酬系オブジェクトを上回ってはならない。そうでなければ「まず金を稼ぐ」が唯一解になる。
- リロール回数の分布:中央値 1–2 回。ボットの最適戦略が毎ショップ 5 回以上リロールする場合、リロールが安すぎるか、枠が悪すぎることを示す。
6. ラン長とテンポ(目標 30–60 分)
- 予算:24 ラウンド ×(3–4 回注ぎ × 15–25 秒 + ショップ 30–60 秒)≈ 35–50 分。計測後、注ぎ回数を調整し、settle 速度は調整しない。
- 3 ラウンド(1 ante)ごとに「何か新しいもの」が登場すること:Boss ルール、新しいレアリティの解禁、新しい素材の登場。
- 最初の 3 ラウンドは 6 分以内に完了すること。新規プレイヤーが「面白いかどうか」を判断する時間は非常に短い(Peglin Demo:プレイ時間中央値 67 分はデモ全体の参考値として)。
- 失敗は早期に:負けるゲームは ante 7 ではなく ante 2–4 で終了すること。「40 分プレイしてビルドがダメだとわかる」のは避ける。
7. 難易度階梯(Stakes / Ascension)
- 8–10 階、累積制、各階で 1 つのルールのみ追加(Slay the Spire Ascension 20、Balatro の 8 Stake はすべて累積制)。
- 本作の候補(易しい順):目標 ×1.2 → 残り注ぎでお金がもらえない → ショップ枠が 1 つ減る → ビーカーに汚染ピクセルが配置される → 素材分量 -10% → レア触媒確率半減 → Boss ルールが 2 つ → 目標成長曲線が Purple 等級に変更。
- 難易度階梯はデータツールとしても機能する:各階層の勝率はより詳細なバランス情報を提供する(Slay the Spire GDC)。
- 各階の解除条件は「前の階で 1 回勝つこと」。メニューに表示し、プレイヤーに長期的目標を与える。
8. メタプログレッション(pay-to-win にしない)
- 永続的な進行は横方向の解放が中心:新しい素材、新しい触媒、新しいビーカー形状、新しい初期デッキ、図鑑。永続的な数値ボーナス(例:「すべての火 +5%」)は与えない。
- 解放順はチュートリアルとして設計:最初は 2–3 つのアーキタイプのみ開放し、数ゲーム後に複雑なものを解放する(Roguebook:進度を使って複雑なメカニズムを後回しにする)。
- 各ゲーム(負けたとしても)で何かが解放または進行するべき(Ball x Pit「プレイヤーの時間を尊重せよ」:ほぼすべてのゲームで新しい設計図が手に入る)。
- ベテランプレイヤーやストリーマー向けに「全解放」オプションを提供する(Balatro も追加)。代償として、そのセーブデータは実績の対象外とする。
- 有料 DLC はコンテンツ(新しい素材パック)のみとする。パワーは含めない。
9. 混沌としたシミュレーションをスキルに見せる方法
- 決定論:固定タイムステップ、整数または固定小数点数、固定更新順序(下から上へ;左右のスキャン方向は tick の偶奇で決定、RNG は使用しない)。すべての乱数は run seed から派生した PRNG から取得する。同じ入力で 2 回実行しハッシュを比較、CI テストに含める。
- プレビュー:注ぐ前に着地軌跡と「どの素材に当たるか」のアイコンを表示。決定論的であるため、バックグラウンドのコピーで最初の N tick をシミュレートし、「予測反応アイコン」を表示できる。完全なスコアプレビューは触媒/アイテム(「試験管鏡」)にリソースとして残し、無料では提供しない。
- 反応語彙は固定かつ少数:反応ごとに 1 色 + アイコン + 音程。同じ種類の反応は一つのポップアップ数字にまとめる(「燃焼 ×37 → +185」)。ピクセルごとに数字を表示しない。
- 因果関係の線:連鎖反応は細い線やフラッシュで「誰が誰を引き起こしたか」を繋ぐ。連鎖の深さは大きな文字で表示(×2、×3…)。これも動画のハイライトになる。
- ばらつきの制御:注ぎ位置の違いはスコアに有意な影響を与えるが、同じ位置での結果は安定していること。「スキル差」=最適位置ボットのスコア ÷ ランダム位置ボットのスコア、目標 ≥ 2。< 1.3 は注ぎ位置に意味がないことを示す。
- プレイヤーが見るものだけをシミュレーションする:Noita は苔の成長やゆっくりした溶解など、誰も気にしない微細な効果を削除した。リソースはスコアや画面を変える反応に投資する。
- シミュレーションがゲームプレイを妨げる場合は、ゲームプレイを優先する(Noita):不正を許容しても良い(例:反応は注ぎ後 X tick 以内のみスコアリングする、パーティクル数上限を設ける)。
10. FTUE / チュートリアル(システム型ゲーム)
- 最初のゲームは固定シードと固定手札:1 回目の注ぎ = 砂(注ぎ方を学ぶ)、2 回目の注ぎ = 水(反応を学ぶ:砂+水→泥)、3 回目の注ぎ = 火と油(連鎖と mult を学ぶ)。各注ぎで 1 つのことだけを教える。
- ビーカーを使って教え、テキストでは教えない。テキスト量を減らすことで、10+ 言語の翻訳コストと AI テキスト生成の負担を軽減する。
- 「反応図鑑」(codex):初めて発生した反応は自動的に記録され、一時的にハイライト表示される。プレイヤー自身が発見する=楽しみ(Roguebook:シナジーの発見は中核的な楽しみ)。
- 各 vial/触媒のツールチップには「X と反応する」アイコン列を表示。テキストに依存しない。
- 触媒とショップは 2 ラウンド目から解禁。Boss は ante 1 の終わりから登場。
- 最初のゲームは勝てる可能性があるが、進行は最初のゲームの勝利に依存しない。
11. プレイテストの方法と指標
- 方法:ブラインドテスト(説明なし)→ 最初の 15 分は think-aloud → その後は静かに観察 → 終了後に 3 つの質問:「どうやって負けた?」「一番気持ちよかった瞬間は?」「どこがわからなかった?」。録画する。
- HSU プレイテスト:毎回 1–2 つの仮説のみ検証。事前に
docs/design/playtests/YYYY-MM-DD.mdに記述する。 - 必須収集指標(テレメトリーはローカル JSON に書き出し、プレイテスト版では有効):
- 初回反応時間、初回 ×mult 理解時間(能動的に乗数を追うかどうかを見る)
- 各ゲームの死亡 ante 分布、ラン長、各ラウンドの所要時間
- 自発的に 2 ゲーム目を開始した割合(最も重要な単一指標)
- 「なぜ負けたか」の回答正答率(可読性指標、目標 ≥ 70%)
- オブジェクトのツールチップ表示回数 vs 購入回数(理解できない vs 欲しくない)
- イベント形式:
run_start / pour{vial,x,angle,reactions[],score} / shop{offered[],bought[],rerolls} / run_end{ante,cause,build[]}。 - 「スーパープレイテスター」バイアスに注意:最も詳しい人のデータは一般プレイヤーを代表しない(Slay the Spire GDC)。
12. バランスシミュレーション(概要;詳細は references/balance-sim.md)
- バランスシミュレーションは
sim/(Python またはヘッドレス C# で同一ルールテーブル)で実行。ルールデータ(素材、反応、触媒)は同一の JSON/CSV を使用し、Unity と sim で共有。これにより二つの実装間のズレを防ぐ。 - ボットレベル:Random / Greedy(各手で期待スコアが最大のものを選択)/ Lookahead(MCTS またはビームサーチで注ぎ + 購入を選択)。
- 数値を変更するたびに、各ボットで 1,000 ゲーム以上実行。レポートは
docs/design/balance/YYYY-MM-DD_<トピック>.mdに保存。 - 強戦略アラート:
- 単一オブジェクトの「取得時の勝率 − ベースライン勝率」> +10 パーセントポイント
- 単一アーキタイプの勝利数シェア > 40%(目標:トップ 5 アーキタイプが 10–30% に分散)
- Greedy ボットで特定オブジェクトの取得率 < 3% → 死にカード
- 強いボットの白注勝率 > 98% → 全体的に簡単すぎる
- シミュレーションで奇妙な戦略が見つかった = シグナル。まずバグかどうかを確認する(Google 研究:エージェントの奇妙な行動は多くの場合、実際のパラメータ調整ミスを明らかにする)。
- 修正時はまず数値(コスト、レアリティ、ボーナス値)を調整し、次に条件を変更し、最後に作り直す(LocalThunk:ほとんどの修正は数値調整)。
13. 新しい vial / 触媒 レビューチェックリスト
新しいオブジェクトを提出する前に各項目をチェックし、オブジェクトのデータシートの備考に記録すること:
- 一言で「何に使うのか」「いつ選ぶのか」を説明できる
- 主要な役割(Enabler/Payoff/Bridge/Economy/Scaling/Utility)と所属アーキタイプがラベルされている
- 効果を 15 英単語以内、または 1 行のアイコンで表現できる。新しいキーワードを必要としないか、新しいキーワードは 3 つ以上のオブジェクトで共有される
- 効果は「見える」:トリガー時に画面にフィードバックがある(テキスト表示/フラッシュ/効果音)
- 決定論的:シードされていない乱数を導入しない。フレームレートに依存しない
- スコアリングレベルが正しい:コモンは ×mult を付与しない。×mult を付与するものは Rare+ であるか、組みにくい条件がある
- 既存の上位 3 オブジェクトとの組み合わせでシミュレーションを実行し、10× 以上のスコアバーストが発生しない(またはバーストは意図的かつ組みにくいものである)
- 既存のどのオブジェクトも無用にしない(cannibalize)——同じアーキタイプ内の他のオブジェクトの取得率の変化を確認する
- 弱い状況でも逃げ道がある:このオブジェクトを取ったがアーキタイプが成立しなかった場合、少なくともフィラーとして使えるか、売却できる
- 価格とレアリティは同じ役割のオブジェクトと一致している
- テキストは既にローカライゼーションテーブル(key)に入っている。ドイツ語/ロシア語で +35% に膨張しても収まる長さである
- パフォーマンス:トリガー時の最悪のピクセル量でも目標 FPS を維持できる
- 1,000 ゲームのシミュレーションを実行済み:取得率 5–40%、勝率差 ±10pp 以内(意図的なビルド定義 Rare である場合を除く)
出典
- Slay the Spire データ駆動バランス(GDC 2019):https://www.gdcvault.com/play/1025731 ・ https://glasp.co/youtube/7rqfbvnO_H0 ・ https://podwise.ai/episodes/1459444
- Balatro デザインインタビュー:https://rogueliker.com/balatro-interview/ ・ https://toucharcade.com/2024/03/18/balatro-interview-mobile-port-localthunk-dlc-plans-updates-new-jokers-demo-feedback/
- Balatro 数値(ブラインド、アンテ):https://balatrowiki.org/w/Blinds_and_Antes ・ https://balatrowiki.org/w/Shop
- Luck be a Landlord 1.1 バランスノート:https://blog.trampolinetales.com/the-big-buffs-update-preview/
- Ball x Pit「プレイヤーの時間を尊重せよ」:https://automaton-media.com/articles/newsjp/ball-pit-20251217-375231/
- Peglin データ:https://howtomarketagame.com/2022/05/04/how-peglin-made-1049413-in-1-week/
- Roguebook 構築デザイン:https://www.gamedeveloper.com/design/tackling-deckbuilding-design-in-abrakam-s-roguebook
- Noita 落沙デザインと技術:https://www.gamedeveloper.com/game-platforms/road-to-the-igf-nolla-games-i-noita-i- ・ https://80.lv/articles/noita-a-game-based-on-falling-sand-simulation/
- BotW ケミストリーエンジン(GDC 2017):https://www.thumbsticks.com/gdc-17-breath-of-the-wild-science-lies
- AI エージェントによる自動バランステスト(Google):https://ar5iv.arxiv.org/html/1811.06962