feedback5 WV: 泥岩 S3 秽壤的血脉's 10 s dormancy is 闭锁 = 强制缴械 + 无敌 + 不可阻挡 — she blocks nobody and lets go of the enemies she held (PRTS 泥岩 S3 备注 "实际将会进入闭锁状态"; PRTS 异常效果: 不可阻挡 "无法阻挡/被阻挡,自动解除阻挡"), not "keeps blocking"; kits_alt_t4 updated on purpose; golden: roster-040 moved (it fields 泥岩 S3: the enemies she held walk on during the 闭锁)

This commit is contained in:
sganggs committed 2026-10-06 18:16:48 +08:00
1 parent 9d85467479
commit dfb528802e
3 files changed
+41 -27

No files matched your search

+18 -7
View File
@@ -797,7 +797,7 @@ test('星熊 module PRO-X 护身符: DEF +20 % while blocking', () => {
approx(def(null, true), def(null, false), 1e-9);
});
test('泥岩 S1 防御力强化·γ型 (TAKE_DAMAGE) and S3 秽壤的血脉 (dormant & invulnerable & blocking, slow; then stun, buffs, hits all blocked)', () => {
test('泥岩 S1 防御力强化·γ型 (TAKE_DAMAGE) and S3 秽壤的血脉 (闭锁: invulnerable, no attack, blocks nobody — the enemies she held walk on —, slow; then stun, buffs, hits all blocked)', () => {
for (const id of pair('chess_char_4_18_a')) {
const b1 = D(id, 0).skill.bb, sk = D(id, 2).skill, b3 = sk.bb;
let h = battle([U(id, 10, 4, 0)], { enemies: { enemy_hitter: dummy({ key: 'enemy_hitter', atk: 300, bat: 1 }) } });
@@ -812,21 +812,32 @@ test('泥岩 S1 防御力强化·γ型 (TAKE_DAMAGE) and S3 秽壤的血脉 (dor
for (let i = 0; i < 3; i++) h.spawn('e_walk', { routeIndex: 0 });
u = h.unit(id);
assert.ok(h.runUntil(() => u.blocking.length === 3, 30), 'blocks three walkers');
const walkers = u.blocking.slice();
const hp0 = u.hp;
assert.ok(u.skill.activate('test', { free: true }));
const t0 = h.b.time;
h.run(b3.sleep - 1);
h.step();
// 闭锁 (PRTS 备注 "实际将会进入闭锁状态"; PRTS 异常效果 闭锁 = 强制缴械 + 无敌 + 不可阻挡, 不可阻挡 "无法阻挡/被阻挡,自动解除阻挡")
assert.ok(u.blocking.length === 0 && walkers.every((e) => e.blockedBy !== u), `${id}: 闭锁 lets go of the enemies she held`);
assert.ok(walkers.every((e) => e.findBuff(`mudrok:slow:${u.id}`)), 'enemies around slowed');
const x0 = walkers.map((e) => e.x);
h.run(1);
assert.ok(walkers.every((e, i) => e.removed || e.x < x0[i] - 0.05), `${id}: they walk on`);
h.run(b3.sleep - 2.5);
assert.equal(u.hp >= hp0 - 1e-6, true, `${id}: no damage while dormant`);
assert.equal(u.blocking.length, 3, 'keeps blocking');
assert.equal(u.blocking.length, 0, `${id}: blocks nobody while dormant`);
assert.equal(h.hooksOf('attack').filter((c) => c.attacker === u && c.t > t0).length, 0, 'cannot act');
assert.ok(u.blocking.every((e) => e.findBuff(`mudrok:slow:${u.id}`)), 'enemies around slowed');
h.run(1.2);
assert.ok(u.findBuff('mudrok:awake'), 'awake');
for (const e of u.blocking) assert.ok(e.s.flags.stun, 'ground enemies around stunned');
const near = [0, 1, 2].map(() => h.spawn('enemy_dummy', { pos: [9, 5] })); // on her tile before she wakes
h.step();
assert.equal(u.blocking.length, 0, `${id}: not blocked before she wakes`);
assert.ok(h.runUntil(() => !!u.findBuff('mudrok:awake'), 2), 'awake');
h.run(0.2);
for (const e of near) assert.ok(e.s.flags.stun, 'ground enemies around stunned');
approx(u.s.atk, u.base.atk * (1 + b3.atk) * (u.findBuff('mudrok:module') ? 1 + (u.def.traitBb.atk ?? 0) : 1), 1e-6, 'ATK');
approx(u.s.interval, (u.base.bat + b3.base_attack_time) * 100 / u.s.aspd, 1e-6, 'BAT −0.3 s');
assert.ok(h.runUntil(() => h.hooksOf('attack').some((c) => c.attacker === u && c.t > t0), 5));
assert.equal(h.hooksOf('attack').find((c) => c.attacker === u && c.t > t0).targets.length, 3, 'attacks every blocked enemy');
assert.ok(h.runUntil(() => u.blocking.length === 3, 4), `${id}: she blocks again once awake (their stun over)`);
h.runUntil(() => !u.skill.active, sk.duration);
assert.ok(!u.findBuff('mudrok:awake'));
checkInvariants(h.b);