予告を出した砲座が壊れたら、予約していた攻撃も取り消します。 私が制作している救助ゲーム「灰都の救難艇」の最終任務では、双砲座の巡洋艦が航路を封鎖します。艇が外へ逃げるだけでなく、牽引中のカプセルも予告された空域から出す必要があります。
この記事はv1のボス予告と取消のCoreの作り方です。汎用の敵AIやアニメーション全体を説明するものではありません。ゲームを直接遊ぶか、操作と制作意図を見るから開始できます。最終任務は前の二つの任務を救助すると解放されます。

C#サンプルで三つの操縦を再現する
Coreと検査操縦のZIPを展開し、.NET 10 SDKで実行します。画面・素材・音は含みません。
dotnet run --project HaitoSample.csproj -c Release
Boss direct tow Lost health 2 rescued 0 seconds 8.65004 damage 6 Boss flank tow Won health 5 rescued 2 seconds 58.382614 damage 0 turrets 8,8 Boss turret-first Won health 3 rescued 2 seconds 60.465916 damage 2 turrets 0,0 Checks 69
上の時間は固定刻みの検査操縦です。人の初見プレイ時間ではありません。Program.csには、従来の牽引経路を持ち込む操縦、冷却を待って外側を通る操縦、砲座を壊してから救助する操縦を入れています。
予告を始めるときに、攻撃元と空域を決める
手順 01
見張り
2.5秒
手順 02
予告
1.6秒・範囲固定
手順 03
砲撃
2.4秒
手順 04
冷却
3.5秒
開始位置では敵を動かさず、艇が警戒域のY9より北へ進んだら見張りを始めます。予告開始時には、生きている砲座のうち艇に近い方を選び、その砲座番号をReservedGunに保存します。左側・右側・中央のどこにいるかでReservedAreaも固定します。
ReservedGun = Guns[0].Health > 0 &&
(Guns[1].Health <= 0 ||
(Guns[0].Position - Ship).Length <= (Guns[1].Position - Ship).Length)
? 0 : 1;
ReservedArea = Ship.X < 7
? new Block(3.5f, 8, 3.5f, 22)
: Ship.X > 18 ? new Block(18, 8, 3, 22)
: new Block(7, 18, 11, 12);
Reservation++;
Blockade = BlockadePhase.Warning;
BlockadeClock = 1.6f;
この後に艇が動いても範囲を追いかけません。艇を空身で使って予告を誘い、冷却に入ってから拾うという攻略が成立します。描画も別の範囲を計算せず、ReservedAreaをそのまま使います。見えている危険と実際の被害をずらさないためです。
同じTickの砲座破壊を、被害より先に処理する
重要なのは、予告の状態が進むことと、被害の適用を分ける順番でした。
AdvanceBlockade(dt); // 予告から砲撃へ進む可能性がある
Combat(dt); // 実弾を動かし、砲座の耐久を更新する
ValidateReservation(); // 壊れた砲座の予約を取り消す
ApplyBlockade(); // 残っている有効な予約だけ被害を出す
砲座を壊した直後にも予約が残っていれば、その一手で相打ちになります。そこで実弾の処理後に再度検査します。ReservedGunが壊れていたら番号を−1にし、取消回数を増やし、冷却へ進めます。両方が壊れた場合はDisabledにして封鎖を終了します。
if (ReservedGun >= 0 && Guns[ReservedGun].Health <= 0)
{
ReservedGun = -1;
CancelledReservations++;
Blockade = BlockadePhase.Recovery;
BlockadeClock = 3.5f;
}
独立Coreでは、実際に移動した弾が砲座を壊す条件を用意し、同じTickの封鎖被害を受けないことを確認しました。ブラウザでもPC・375pxの実入力で砲座を先に破壊し、どちらも予約取消1回、両砲座の耐久0、艇耐久3・損傷2で全2個を救助しました。所要時間は60.49925秒と60.93258秒です。予約取消の数字だけを、無傷だったという意味には使いません。
ただし、この「空域内に止まって撃つ」操縦がいつも成功するわけではありません。追加の375px実入力では18.39989秒で艇を失い、二つ目の砲座は耐久1、中央空域の砲撃中でした。敵の耐久を下げず、予告されている中央と側方の空域を見て、その外へ移りながら撃つ操縦も確認しました。PC64.94939秒・375px65.16611秒で全員救助、両幅艇耐久3・損傷2です。固定刻みで成功する操縦を、そのまま人に安全な攻略として保証しません。
中断は残り時間だけでなく予約全体を止める
Tickの入口はPhase.Active以外なら処理を返します。停止中も描画は続きますが、ゲーム時刻・予告時間・砲座番号・範囲を更新しません。予告の点滅や着弾の演出にもゲーム時刻を使い、停止中だけ外見が進むことを避けました。
PCと375px幅で予告中に中断し、時間を置いても時刻・予約番号・予告残り時間が変わらないことを確認しました。再開後は同じ予約から続きます。両砲座を破壊した成功から「出動する」を押すと、同じ任務の艇耐久5、救助0、砲座8/8、予約番号0へ戻ることも検査しています。
短い封鎖では、以前の攻略がそのまま通った
ボスを置いても判断が増えていなかった
- 症状
- 最初の短い封鎖では、従来の大回りで48.93276秒・艇耐久5・損傷1の成功になった。
- 原因
- 左右の航路のY8〜18だけを1.2秒封鎖し、予告を読まずに通過できる範囲だった。
- 対処
- 外側の退避路を残して封鎖範囲を長くし、冷却を待つ接続と砲座先行破壊の二つの有効攻略を比較した。
封鎖を広げるだけでは逃げ場がなくなります。左右の予告空域のさらに外に航路を残し、未接続カプセルは固定具で保護しました。何もせずに待っている間に救助対象が壊れないようにし、拾う時機と拾ってからの航路を判断にしています。
先に砲座を壊す攻略は被害を受けますが、その後の封鎖が消えます。砲座を残す攻略は無傷で成功でき、救助を優先できます。固定盤面で二つの有効な操縦を確認した結果であり、全攻略を列挙したわけではありません。人の初見難度とスマホ実機での操作感は未評価です。
まとめ
- 予告の開始時に砲座と空域を固定し、そのデータから危険範囲を描く。
- 実弾で砲座の耐久を更新した後に予約を検査し、残る攻撃だけ被害を適用する。
- 以前の経路が通るかと、複数の有効な攻略があるかを分けて比較する。