【個人ゲーム開発23日目】戦術SLG制作

ブログ整備と、多方面バグ修正祭り

今日はまたいつものペース(1日10時間以上)で開発再開です。
昨日は私用で半日作業だったので、その分、今日は盛りだくさんな一日になりました。


■ 本日の開発状況

1. ブログ・Web環境の整備

ゲーム本体の作業に入る前に、ブログ周りの整備を進めました。

サイドバープロフィール追加

開発ブログにプロフィール小窓を設置しました。
アイコン画像・名前・bio・Xフォローボタンをまとめたウィジェットです。
WordPressのカスタムHTMLウィジェットとCSSで実装しています。

実装中にちょっとしたトラブルがありました。
Xへのリンクを含むHTMLを保存しようとすると「保存された」とは出るのに
実際には反映されない、という現象が発生。
WAFかセキュリティプラグインを疑って調査しましたが、
最終的な原因は「X(エックス)」のUnicode文字でした。
サーバーのフィルターが不審なバイト列として検知していたようです。
テキストを「X でフォローする」に変えたら一発で解決しました(笑)

仕上がりはこんな感じです。

ステージ1のプレイ映像(3分36秒)を限定公開でアップしました。
ブログへの埋め込み用です。
デモ版リリースのタイミングで公開に切り替える予定です。


2. 結果シーンの改修

ステージ選択モード対応

ステージ選択でクリアした場合、「次のステージへ」ボタンを非表示にする対応を行いました。
ステージ選択はハイスコア更新専用の機能なので、そのまま次ステージへ進めてしまうのは仕様上おかしいためです。
GameSessionManager.CurrentModeの判定を1箇所追加するだけで済みました。

ランク画像の実装

評価ランク(C/B/A/S/SS)をテキストではなく画像で表示するように変更しました。
ミリタリー×スチームパンク調のランクバッジを新たに作成しています。
錆びた金属・歯車・月桂樹をモチーフにしたデザインで、ゲームの雰囲気に合わせました。

表示項目の追加

残ユニット数(終了時 / 開始時)と戦力(終了時 / 開始時)の表示を追加しました。
リザルト画面で何がわかるか、が増えると達成感も出てきますね。

多言語対応

「次のステージへ」「作戦終了」のボタンラベルが日本語固定になっていたので、
英語・中国語にも対応しました。
LocalizeText.SetDynamicText()を使う方式で統一しています。


3. 戦闘演算のバグ修正

地形効果の適用順序が誤っていた

地形防御ボーナスの計算順序にバグがありました。

誤った順序:(基本DEF + 支援DEF)× 地形倍率
正しい順序:(基本DEF × 地形倍率)+ 支援DEF

地形効果はユニット固有の能力値に対して乗算するものですが、
誤った実装では支援効果も含めた値に地形倍率が掛かっていました。
結果として地形効果の高い場所で支援ありで守ると防御力が過大になる問題が発生していました。

この修正はゲームロジック側(UnitController.cs)と戦闘演出側(BattleManager.cs)の
両方に適用しています。演出の数値表示も実際の計算と一致するように直しています。


4. 戦力計算式の統一

式がコード各所にバラバラに記述されていた

戦力計算式が複数のスクリプトに分散して記述されており、しかも式が統一されていませんでした。

  • BattleFieldEvaluatorHP × (ATK + DEF)
  • GameSessionManagermaxHP × ATK × DEF(← 誤り)
  • TurnManagerCurrentHP × ATK × DEF(← 誤り)

UnitController.GetBattlePower()という共通メソッドが既に存在していたので、
全箇所をこのメソッド経由に統一しました。
これでSITREPウィンドウの損耗率が開始直後から95%になっていた謎が解けました(笑)

どうも以前AIにコード生成を依頼した際に別の式が混入したようで、
発見が遅れましたが今回の整理で綺麗になりました。


5. ステージ評価基準の拡張

残ユニット数・損耗率をランク評価基準に追加

これまでSSランクの基準はターン数のみでしたが、
残ユニット数と損耗率も評価基準として追加しました。

StageDataの評価基準構造体に以下のフィールドを追加しています。

  • targetRemainingUnitsSS:SSランク基準残ユニット数
  • targetLossRateSS:SSランク基準損耗率

ランク算出は3項目の平均で決まる方式です。
ターン・損耗率・残ユニット数それぞれが評価され、総合的にランクが出ます。


6. 敵AI改善

渋滞で動けない敵ユニットの問題

複数の敵ユニットが同じ経路で移動しようとして、先行ユニットが詰まっていると
後続が移動できずその場に留まる問題がありました。

根本原因は「経路を1本探してその上を辿る」という実装で、
経路上が塞がれた場合の代替ルート探索がなかったことです。

FindApproachPath()にフォールバック処理を追加しました。
最短経路上を一歩も進めなかった場合、移動可能マスの中から
経路ゴールに最も近いマスを選んで移動する、という動作になっています。


■ 進捗メモと今後の課題

【現在の進捗状況】

  • ブログ整備: プロフィールウィジェット・Xリンク設置 ✅
  • プレイ動画: YouTube限定公開アップ済み ✅
  • 結果シーン: ランク画像・多言語対応・各種修正 ✅
  • 戦闘演算: 地形効果適用順序バグ修正 ✅
  • 戦力計算: GetBattlePower()に一本化 ✅
  • 敵AI: 渋滞時フォールバック追加 ✅
  • 次回予定: 動作確認、地形チップ作成継続、ブリーフィングシーンデザイン着手

執筆後記
今日は「バグ修正の日」でした。
地形効果の適用順序、戦力計算式の混在、SITREP損耗率95%問題と
立て続けに問題が出てきましたが、どれも原因が明確で気持ちよく直せました。
中でも戦力計算式の混入はAIコード生成の落とし穴で、
「動いてるように見えるけど計算が違う」という一番厄介なパターンです。
こういうバグを踏むたびに、ちゃんとコードを読む習慣の大切さを痛感します。
デモ版完成まであともう少し、引き続き頑張ります。