feedback5 WE1: 伺夜 S2 casts while the pack is in its 战术点形态 — the DP at once, the gift kept for the returning pack (follow-up 2)

PRTS 伺夜 S2 备注 「仅场上存在狼群,且狼群未获得此技能的充能时可触发技能」 uses S1's words, whose ① counts the 战术点形态 — the
follow-up's recommended reading [ASSUMED].

- vigil kit: S2 casts when ready while the pack is on the field in either form (packOf) and holds no unused gift; in the
  form it pays +cost DP at once and the gift waits on the pack for its next attack once back (the heal reaches a standing
  pack only). It used to wait for the pack.

Golden: no scenario moved (no corpus battle has S2 ready with the pack in its form).

Tests: kits_alt_t3 "3_19 伺夜 S2" updated on purpose (cast in the form, DP, the waiting gift); kits_t3, tokens_devices pass.
Docs: DESIGN §5.6 trigger note, PLAYING.md 技能自动释放.
This commit is contained in:
sganggs committed 2026-10-06 16:15:11 +08:00
1 parent 19b63f2a02
commit b2d3964478
4 files changed
+23 -18

No files matched your search

+11 -8
View File
@@ -1034,7 +1034,7 @@ test('3_19 伺夜 S2 领袖的馈赠: +DP, the pack recovers HP, its next attack
}
});
test('3_19 伺夜 S2 领袖的馈赠 (自动触发): no enemy needed — cast at full SP while the pack stands and holds no unused gift (PRTS 备注), never while it is in its 战术点形态 [ASSUMED] — cast once it is back (kit pack and prep piece)', () => {
test('3_19 伺夜 S2 领袖的馈赠 (自动触发): no enemy needed — cast at full SP while the pack is on the field and holds no unused gift (PRTS 备注), in its 战术点形态 too [ASSUMED: S1\'s words] — the DP at once, the gift kept for the returning pack (kit pack and prep piece)', () => {
for (const id of BOTH('chess_char_3_19_a')) for (const piece of [false, true]) {
const b = SB(id, 'skchr_vigil_2'), tag = `${id} ${piece ? 'piece' : 'kit pack'}`;
const h = makeBattle({ defs: { chess: noGarrison(id) }, timeLimit: 60, flags: { dpPerSec: 0 }, units: vigilUnits(id, 'skchr_vigil_2', piece) });
@@ -1050,17 +1050,20 @@ test('3_19 伺夜 S2 领袖的馈赠 (自动触发): no enemy needed — cast at
fill(u);
h.run(3);
assert.equal(u.skill.activations, 1, '"狼群未获得此技能的充能时可触发": no second cast while the gift is unused');
// the gift spent (as by a bite), the pack in its 战术点形态: no cast (the 备注 does not count that form for S2 —
// [ASSUMED]); once it is back, the waiting cast fires
// the gift spent (as by a bite), the pack in its 战术点形态: the cast fires there too (its 备注 uses S1's words, which count
// that form — [ASSUMED]; until 0.2.0 it waited for the pack): +cost DP at once, the gift waits on the pack
w.mem.vigilGift = null;
for (let i = 0; i < 10 && w.alive; i++) h.b.dealDamage(null, w, { amount: 1e9, type: 'true' }); // a wolf is lost per KO
assert.ok(wolfTacticalPoint(w), `${tag}: 战术点形态`);
h.run(5);
assert.equal(u.skill.activations, 1, `${tag}: no cast while the pack is in its 战术点形态`);
assert.ok(u.skill.ready, 'the SP waits full');
const dp1 = p.dp;
assert.ok(h.runUntil(() => u.skill.activations === 2, 0.5), `${tag}: cast while the pack is in its 战术点形态`);
approx(p.dp, dp1 + b.cost, 1e-6, `${tag}: +cost DP at once`);
assert.ok(w.mem.vigilGift && !w.alive, `${tag}: the gift waits on the pack`);
fill(u);
h.run(3);
assert.equal(u.skill.activations, 2, `${tag}: no second cast while that gift is unused`);
assert.ok(h.runUntil(() => w.alive, WOLF_IV(id)), `${tag}: the pack is back`);
assert.ok(h.runUntil(() => u.skill.activations === 2, 0.5), `${tag}: cast once it stands again`);
assert.ok(w.mem.vigilGift, 'the returned pack holds the gift');
assert.ok(w.mem.vigilGift, `${tag}: the returned pack holds the gift for its next attack`);
done(h);
}
});