【開発[#2] 42日目】戦略SLG

これまで、このゲームには「攻められたら終わり」という最大の穴があった。

出陣された側は、迎撃する手段も援軍を呼ぶ手段もなく、ただ拠点を失うだけ。戦略SLGとして、これはさすがにまずい。

この4日間(6/6〜6/9)は、その穴を塞ぐところから始まり、気がつけば「捕らえた武将を登用する」「結果を演出で見せる」「武将をトレカ開封風にお披露目する」ところまで一気に進んでいた。順に記録する。

今回から、作業フローが大きく変わった。
開発が佳境に入り、Proプランでは5時間のセッション上限が1時間と経たずに100%へ達するようになり、作業の停滞が無視できなくなっていた。そこで6/8、思い切ってClaudeの契約をProからMax 20xへ変更した(出費は痛い…)。セッションに余裕が生まれたので、開発のベースはClaude Codeへ移していく。


■ 39〜42日目のまとめ

大きく4つの山があった。

  • 39〜40日目(6/6〜6/7):迎撃・援軍システムの第1段・第2段(戦争の可視化と判定)
  • 41日目(6/8):内政・諜報・外交・戦闘のバランス大改修と、設計書のMarkdown移行
  • 42日目(6/9):捕縛→登用システムの完成、計略・引抜のバランス刷新
  • 42日目(6/9・続き):結果パネルの演出、同盟勝利という新しい勝ち方、武将登用カードのドロー演出

「見る」「動かす」を固めた前回までに対して、今回は「戦争で殴り合い、捕らえ、登用し、その結果をちゃんと見せる」という、ゲームの中核がぐっと動き出した4日間だった。


■ 39〜40日目(6/6〜6/7):迎撃・援軍システム 第1段・第2段

戦争システムは規模が大きいので、3段階に分けて進めることにした。第1段は「戦争を可視化する」、第2段は「迎撃・援軍できるか判定してボタンを出す」、第3段が「迎撃・援軍の中身を実装する」。今回は第1段と第2段を完成させ、実機で動作確認した。

戦争を地図上に可視化する

コマンド入力フェーズに入った時点で、全勢力の未解決の戦争を地図上にアイコンで表示するようにした。1つの戦争につき1つのアイコン。クリックすると戦争詳細パネルが開き、右クリックか閉じるボタンで閉じる。プレイヤーに関係する戦争かどうかで色を分け、ひと目で「自分が関わる戦い」が分かるようにしている。

地味に厄介だったのが遭遇戦の扱いだ。通常の戦争は「戦場となる拠点」で一意に識別できるが、遭遇戦は拠点Aと拠点Bが互いに攻め合う形なので、戦場が1つに定まらない。そこで2拠点の無順序ペアを識別キーにして、アイコンは2拠点の中点に表示するようにした。

双方が同時に出陣した場合は中間で遭遇戦となる


迎撃・援軍できるかの判定

アイコンをクリックすると、その戦争に対してプレイヤーが迎撃できるか、援軍を送れるかを判定し、ボタンの有効・無効を切り替える。迎撃は「戦場が自分の拠点なら有効(遭遇戦は対象外)」、援軍は「同盟の拠点が攻められている防衛戦なら要請不要で有効」「同盟が出陣した戦いには要請経由で有効」というルールに整理した。

開発中丸出しの画像だけど迎撃と援軍の操作が可能に


遭遇戦の即入替バグと、「戦争は常に2ターンで解決」への統一

動作確認中に重大なバグを見つけた。AIが出陣した次のターン、戦争アイコンも出ないまま拠点が即座に入れ替わってしまう。

原因は、戦争を解決する条件が「通常攻撃かつ前ターン出陣」に限定されていたこと。遭遇戦や強制迎撃はその手前で状態が変化してしまうため、条件をすり抜けて同じターンのうちに解決されていた。

ここで仕様そのものを見直した。戦争は状態の種類に関係なく、常に「発行から2ターン後」に解決する。発行ターンに出陣コマンド、その翌ターンで戦争の確定とアイコン表示、さらに翌ターンで結果処理と拠点入替。遭遇戦も強制迎撃も「迎撃が自動入力されるだけ」と捉えれば、解決タイミングを特別扱いする必要はない。判定基準を「発行から何ターン経ったか」だけにしたことで、状態ごとの複雑な分岐が丸ごと消え、バグの温床を根本から断てた。

開発方針をひとつ確定:ボタンはコード配線で統一

第1段で「ボタンを押してもパネルが起動しない」問題が起きた。原因は、ボタンのクリックをUnityのInspector(OnClick欄)での割り当てに頼っていたこと。これは見落としや消失が起きやすい。

そこで、ボタンのクリックはすべてコード側で配線する方針に統一した。Inspectorでの割り当ては禁止、例外なし。今後の全パネルでこれを守る。地味だが、後々のデグレを防ぐ大事なルールだ。

要請コマンドの仕様も確定

援軍と密接に関わる「要請」コマンドの仕様も固めた。要請は1ターンに1回、同盟している全勢力へ一括送信。出陣していないと要請できず、要請済みなら無効化される。援軍可否は「戦争の発行ターン=その勢力の最終要請ターン」で判定する設計にした。同じターンに出した出陣はすべて同じ発行ターンになるので、入力順による付け忘れが構造的に起きない。実際にフラグを立てる処理は第3段で実装する。


■ 41日目(6/8):バランス大改修と、設計書のMarkdown移行

システムの骨格が見えてきたので、この日は数値バランスを一気に見直した。

内政・収支の見直し

国力(開発)がインフレしすぎないよう、開発の上昇量を帯ごとに逓減させるカーブへ変更。収入は国力に民忠連動の倍率をかける方式にし、春には軍事給与として保有兵数に応じた支出が発生するようにした。兵を抱えすぎると維持費で苦しくなる、という当たり前の緊張感を入れたかった。

徴兵は民忠の減り方を資金ベースに改め、徴発は「最終手段」として割に合わない設定に寄せた(国力には下限を設けてクランプ)。資金を絞り出す手段はあるが、乱発すれば国が傾く、というバランスを狙っている。

諜報・外交の確率カーブ

親睦・同盟の成功率を信頼度の二相カーブにして、信頼度が低いうちは渋く、一定を超えれば能力次第でほぼ通る、という手応えにした。諜報網・千里眼の発動率や効果量も調整している。

戦闘の捕縛率を戦力差ベースへ

捕らえられるかどうかを、勝者と敗者の戦力差に応じた折れ線にした。一方的な勝利ほど捕縛が起きやすく、辛勝ではまず捕まらない。さらに「達人」は捕縛率を底上げし、「名馬」は発動すれば捕縛を完全回避する。名馬持ちは安心して削り戦法に出られる、という個性づけだ。

AIも同盟を守るようにした

これまでAIは援軍を送らなかったが、同盟拠点が攻められている防衛戦には、要請がなくても加勢するようにした。プレイヤーだけが律儀に同盟を守り、AIは知らんぷり、では不公平だしゲームとしても面白くない。

設計書をMarkdownへ移行

仕様の正本にしている設計書を、Word(docx)からMarkdownへ移行した。バージョン管理とも相性がよく、編集も速い。今後は.mdを直接更新していく。

なお、この日は欲張ってタスクを詰め込みすぎ、後半は手戻りが増えてしまった。区切りの良いところで一度切り上げる、という判断も大事だと改めて思う。次の捕縛まわりは、頭を冷やしてから着手することにした。


■ 42日目(6/9):捕縛→登用、結果演出、武将お披露目

ここからが今回の本丸。一日でかなり踏み込んだ。

捕らえた武将を登用できるようにした

戦争・計略・引抜のどの経路で捕縛が起きても、プレイヤーは「登用するか/放免するか」を選べるようにした。拒否すれば、その武将は敗者側へは戻らず在野に残る。AIが捕らえた場合は、空きがあれば即登用、満席なら在野へ、という挙動だ。

そして君主が捕らえられた場合はゲームオーバー。戦争でも計略でも引抜でも、君主を失えば終わり。AIは君主を計略や引抜の実行役に出さない仕様なので、これはプレイヤー側に効いてくる緊張感になる。

計略・引抜のバランスを刷新

捕縛と一緒に、謀略まわりの数値も大きく作り直した。計略の成功率は知力と諜報力のカーブの掛け合わせ+「策士」特性のボーナスで決まる。失敗には「バレない(ノーリスク)」と「バレる(友好度が下がり、捕縛される)」の2分岐があり、知力が高いほどバレにくい。

効果も5種それぞれ性格づけした。焼討は資金と兵を削り、流言は配下の一部の忠誠と民忠を下げ、破壊は国力と資金、攪乱は兵と訓練度を狙う。二虎競食は双方を大きく削る、といった具合だ。引抜は対象の忠誠が低いほど加速度的に成功率が上がるカーブにして、「忠誠管理を怠った相手は引き抜かれる」というリスクを明確にした。

「無言でステータスが変わる」問題を、結果報告で解消

これまで、コマンドの結果がログもなく静かに反映されるだけで、何が起きたのか分かりづらかった(開発中ですら追いづらい)。そこで、プレイヤーが実行した計略・引抜・外交・破棄などの成否と効果を、結果パネルにテキストで報告するようにした。

同盟破棄の改修と、AIの破棄判断

同盟破棄のペナルティを割合ベースに作り直した。友好度・名声が現在値に応じて下落し、魅力で軽減される。さらに破棄した側は全配下の忠誠も下がる。「裏切りには相応の代償が伴う」という設計だ。

あわせて、これまで「AIは破棄しない」としていたのを、厳しい条件付きで破棄するようにした。進攻先が同盟だらけで身動きが取れず、かつ自分の名声が十分に高い、といった状況でのみ、最も見返りの大きい同盟を破棄して攻めに出る。AIにも裏切る理由ができたわけだ。

新しい勝ち方:「同盟勝利」

通常の勝敗とは別に、任意のクリア条件「同盟勝利」を追加した。生き残っている他勢力がすべてプレイヤーと同盟していて、かつプレイヤーが最大勢力なら成立する。ただし強制ではなく、「ここで勝ちにするか、それとも続けるか」を選べる。続行を選んだあとで盤面が崩れれば、また条件を満たしたときに再提示される。武力一辺倒ではない勝ち筋を用意したかった。

結果パネルの演出:積み上げ表示とパラメータ同期アニメ

結果をただ並べるのではなく、1件ずつ「積み上がる」演出にした。さらに、結果が1件積まれるごとに、画面左の勢力パラメータ(国力・資金・兵数など)がアニメーションで増減する。数字がスッと変わるだけでは伝わらない変化を、目で追えるようにしている。

報告に合わせて勢力値が変動


武将登用カードのドロー演出

今回いちばん作って楽しかった部分。武将を登用する際、いきなりカードが出るのではなく、トレカ開封風にめくって登場させる演出を入れた。図鑑未登録の新武将には「NEW」バッジが縮小インと後光で出現し、レア度に応じたエフェクトも切り替わる(本番素材は今後差し替え)。

地味な数値調整の合間に、こういう「引きの気持ちよさ」を作れると一気にゲームらしくなる。

静止画だとわかないがカードをめくるような演出を入れた

文字コードをUTF-8へ全面統一

最後は完全に裏方の作業。スクリプト全101ファイルを点検したところ、半数以上がShift-JISのままだったり、不要なBOMが付いていたりした。日本語環境では表面化しないが、編集次第で文字化けが固定化するリスクがある。これを全部UTF-8(BOM無し)へ統一した。派手さは皆無だが、長く付き合うコードベースほどこういう土台が効いてくる。

あわせて、満席の配下枠で武将を入れ替えると登用が成立しない退行バグも修正した。在野の照合条件のわずかな食い違いが原因で、同種の不具合もまとめて解消できた。


■ 現時点の開発状況

カテゴリ状況
戦争の可視化(戦争アイコン・詳細パネル)✅ 完了
迎撃・援軍 判定/ボタン制御✅ 完了
迎撃・援軍 第3段(中身の実装)⬜ 次回着手
捕縛→登用システム(戦争・計略・引抜)✅ 完了
計略・引抜のバランス✅ 調整完了(テストプレイ待ち)
内政・収支・諜報・外交・戦闘のバランス✅ 調整完了(テストプレイ待ち)
結果報告パネル(報告・積み上げ・パラメータ同期)✅ 完了
武将登用カードのドロー演出✅ 完了(本番素材は差し替え予定)
同盟破棄の改修/AIの破棄判断✅ 完了
新クリア条件「同盟勝利」✅ 実装(テストプレイ待ち)
文字コードのUTF-8統一✅ 完了
AIの最終調整(難易度別の収入・兵数加算)⬜ 未着手
エンドシーン⬜ 未着手

■ 次回の作業予定

いよいよ迎撃・援軍システムの第3段、つまり「中身」の実装に入る。武将選択と兵数入力から防衛用の戦争データを生成する迎撃フロー、援軍データを親の戦争に紐付ける援軍フロー、そして要請フラグを立てる処理。今モックになっている確認パネルを本実装すれば、ようやく「攻められても戦える」が完成する。

あわせて、今回入れた大量のバランス調整は、ほぼすべて実際に遊んでみてからの調整待ちだ。国力インフレの抑制具合、徴発の損得、捕縛率の体感——数字は机上で決めたので、ここからはテストプレイで詰めていく。


執筆後記

「攻められたら終わり」から始まって、4日後には捕らえた武将をトレカ開封風にお披露目していた。

文字コードの統一みたいな完全な裏方から、引きの演出みたいな完全な表方まで、振れ幅の大きい4日間だった。でも、こういう日を越えるたびにゲームが「遊べる形」へ近づいていく実感がある。

次は迎撃・援軍の中身。ここが通れば、戦争がやっと「戦争」になる。