CHAPTER 13 · 全23項目
合体レーザーとボム
発動条件、射線と円形範囲の判定、ゲージや弾数の消費を整理します。
主な参照先:canUseSpecial / activateLaser / updateLaser / LASER_MOVE / activateBomb
発動できる条件を共通にする
function canUseSpecial() { return state === "play" && !paused && player.alive && bannerT <= 0; }プレイ中、ポーズしていない、自機が生存中、ウェーブ開始バナーが消えている、という条件を両方の必殺技で使います。そのうえでレーザーは満タンのゲージ、ボムは残数と再使用までの待ち時間を確認します。使えない場合は false を返し、資源を消費しません。
レーザーは縦長の四角形
function activateLaser() {
if (!canUseSpecial() || special.charge < LASER_MAX || special.laserT > 0) return false;
special.charge = 0;
special.laserT = 1.2;
special.laserW = 14 + active.beam * 10;
special.laserDps = 20 + active.beam * 8;
shake = 0.18;
beep({ f0: 180, f1: 1800, dur: 0.7, type: "sawtooth", vol: 0.1 });
return true;
}発射時にゲージを0にし、1.2秒の持続時間、幅、毎秒のダメージを決めます。幅は 14 + 連結砲の数 × 10 px、威力は毎秒 20 + 連結砲の数 × 8 なので、連結砲がなければ幅14 px・毎秒20、4門なら幅54 px・毎秒52になります。連結砲自体は消費しません。
function updateLaser(dt) {
if (special.laserT <= 0) return;
const duration = Math.min(dt, special.laserT);
const beam = { x: player.x - special.laserW / 2, y: 58, w: special.laserW, h: PLAYER_Y - 58 };
for (const a of aliens) {
if (!a.alive) continue;
const r = alienRectInto(a, SCRATCH);
if (hit(beam, r)) killAlien(a, r);
}
eBullets = eBullets.filter(b => !hit(beam, b));
if (saucer && hit(beam, saucer)) killSaucer();
if (boss) {
for (const part of boss.parts) {射線と重なった通常の敵は撃破し、敵弾も除去します。ボスには毎秒の威力に有効な経過秒数を掛けたダメージを与えます。最終フレームでは残り時間以上のダメージにならないよう Math.min(dt, special.laserT) を使います。
照射中は自機が遅くなる
射線の四角形は毎フレーム、その時点の player.x を中心に作り直します。自機を横へ動かせば射線もついてくるので、速さがそのままだと、マウスを横に振るだけで編隊全体をなぎ払えてしまいます。そこで照射中は、自機の速さを LASER_MOVE までに抑えます。
// 合体レーザー照射中の自機の最高速度(px/秒)。反動で鈍り、横に振って編隊全体をなぎ払えないようにする。
// ボスの最高速度(約 59px/秒)よりは速く、動くコアを追い続けることはできる。
const LASER_MOVE = 70;毎秒70 pxなので、1.2秒の照射中に動けるのは約84 px、編隊の2〜3列ぶんです。一方、ボスの最高速度(約59 px/秒)よりは速いので、左右に揺れるコアを追い続けることはできます。速さを抑える処理そのものは「08 自機の移動と入力」で扱います。
ボムは敵弾全体と近くの敵に作用する
ボムは初期2個、最大3個です。使用すると敵弾をすべて消し、自機から半径240 px以内に中心がある敵を撃破します。距離は Math.hypot(dx, dy) で求めます。ボスに対しては攻撃を中断し、各部位へ BOSS_BOMB_DAMAGE のダメージを試みます。
const BOSS_BOMB_DAMAGE = 5; // ボムがボスの各部位に与えるダメージボム1個で各部位に5ダメージを与えます。コアの保護条件は通常どおり適用されるので、砲台が残っている間はコアへのダメージは無効です。
ボム使用後は少なくとも1.6秒の無敵時間が付きます。レーザーもボムもバリアを削りません。ボムが補充されるのはボスを撃破したときの1個だけで、ウェーブクリアやミスでの復帰では補充されません。