feedback7 R22-LATE: 引星棘刺 S1 度算浪波 — two alchemy units on one ally add their DEF (+60 +60), as their heals already did; golden: roster-033, roster-034 move

GitHub #388 (claim 1). Every S1 alchemy unit applied its DEF buff under one shared key ('thorn2:bastion'), so a second
unit over the same ally replaced the first one's buff (two units: DEF +60, not +120; a normal and an elite: +75, not
+135) while both units' heals landed. PRTS 引星棘刺 技能1 备注: 「效果均可叠加」. Each alchemy unit now has its own
DEF buff key (assigned at its first tick), so the buffs add (aggregateMods sums defFlat) and each lapses with its own
unit. S3's 不叠加 debuff is untouched.

Golden: roster-033 (a normal 引星棘刺 with S1, pass 1) and roster-034 (an elite one, pass 1) move — one operator's
consecutive S1 units overlap for a few seconds (6 / 7 s + 3 s 心相 against a 7 / 6 SP cost) and now add their DEF on
an ally both cover (033: killed 46 → 64, leaks 121 → 103; 034: damage taken by 5_13_b 41498 → 14903 …).
Tests: test/content/kits_alt_t5.test.js (+1: normal + elite on one ally = +135, the longer unit's +75 stays alone,
nothing afterwards; fails on the parent with +75).
This commit is contained in:
sganggs committed 2026-10-08 21:45:09 +08:00
1 parent 0ca2a9c21a
commit 1a67ecc35f
3 files changed
+78 -45

No files matched your search

+30
View File
@@ -1028,6 +1028,36 @@ test('引星棘刺 S1 度算浪波: an alchemy unit on the lowest-HP ally: DEF +
}
});
test('引星棘刺 S1 度算浪波: two alchemy units on one ally add their DEF (PRTS 备注 「效果均可叠加」, GitHub #388)', () => {
// two 引星棘刺 (a normal and an elite: +60 and +75) throw at the same lowest-HP ally; one shared buff key used to let the
// last unit's DEF replace the other's (+75 instead of +135) while both heals already landed
const [na, el] = pair('15');
const h = run({
defs: { chess: { t_low: ally('t_low', { stats: { def: 100 } }) } },
units: [entry(na, 'skchr_thorn2_1', { row: 10, col: 3 }), entry(el, 'skchr_thorn2_1', { row: 11, col: 3 }), { chessId: 't_low', row: 10, col: 5 }],
enemies: [],
});
const a = sel(h, na, 'skchr_thorn2_1'), b = sel(h, el, 'skchr_thorn2_1');
const low = h.unit('t_low');
h.step();
low.hp = low.s.maxHp * 0.3;
for (const u of [a, b]) u.skill.gainSp(1000);
h.runUntil(() => [a, b].every((u) => (u.mem.zones || []).some((z) => z.type === 'guard')), 10);
h.run(1.1);
const [za, zb] = [a, b].map((u) => u.mem.zones.find((z) => z.type === 'guard'));
assert.deepEqual([za.r, za.c, zb.r, zb.c], [10, 5, 10, 5], 'both on the lowest-HP ally');
assert.equal(low.s.def, 100 + bbOf(a).def + bbOf(b).def, '+60 +75');
assert.ok(low.hp > low.s.maxHp * 0.3, 'and they restore its HP');
// one unit runs out: the other's DEF stays
mute(h, a); mute(h, b);
h.run(Math.max(0, za.dur - za.t) + 0.6);
assert.ok(!a.mem.zones.includes(za) && b.mem.zones.includes(zb), 'the elite\'s unit (7 s) outlasts the normal one (6 s)');
assert.equal(low.s.def, 100 + bbOf(b).def, 'its DEF stays alone');
h.run(zb.dur);
assert.equal(low.s.def, 100, 'no DEF bonus afterwards');
done(h);
});
test('引星棘刺 S1 度算浪波 (AUTO): fires as soon as its SP is full, no enemy needed (GitHub #124)', () => {
for (const id of pair('15')) {
const h = run({