Appearance
第31回 出撃コストと再出撃待ち時間
2 / 2 出撃条件と消費
このステップの目的
条件を満たしたときだけ生成し、成功後に資源と待ち時間を更新します。
条件を確認する順序
Battle.cppのBattle::TryDeployを置き換えます。戦闘中か、候補が存在するか、待ち時間が終わったか、資源が足りるか、戦場へ生成できたかを順に調べます。失敗時は理由をreasonへ入れてfalseを返してください。
data_.roster[slot]のIDから定義を探し、共通のSpawnUnitへ渡します。成功してからコストを引き、cooldowns_[slot]へ定義の待ち時間を設定します。戦場が満員だった場合に、先に資源を消費してはいけません。
操作と比較
ビルド後、軽装兵を連続で出撃し、資源と待ち時間のどちらが制限になったかを説明します。重装兵はコスト85、待ち時間4秒です。軽装兵と比べ、同じ時間内に何体出せるかを観察してください。
Roster.csvの順番を変更し、種類の性能を変えずに候補の表示順と数字キーが変わることを確認します。確認後は元の順番へ戻します。資源と待ち時間はリトライで初期値へ戻ることも確かめます。
実装後に比較する参考コード
Source/TowerDefense/Battle.cppcpp
bool Battle::TryDeploy(std::size_t slot, std::string& reason)
{
reason.clear();
if (result_ != Result::Playing) { reason = "戦闘が終了しています"; return false; }
if (slot >= data_.roster.size()) { reason = "その出撃候補はありません"; return false; }
const int definition = data_.FindUnit(data_.roster[slot]);
const auto& type = data_.units.at(definition);
if (cooldowns_[slot] > 0) { reason = "再出撃まで待ってください"; return false; }
if (resource_ < type.spawnCost) { reason = "資源が足りません"; return false; }
if (!SpawnUnit(definition, Team::Ally)) { reason = "戦場の上限128体に達しています"; return false; }
resource_ -= type.spawnCost;
cooldowns_[slot] = type.spawnCooldownSec;
return true;
}チェックリスト
今回の変更箇所を指し示し、観察した結果とその理由を説明できますか。実験後の値とファイルを確認して次へ進みます。