feedback1d WL: 源石溶剂 drain is 无来源 true damage; 信仰搅拌机 S3 counters any damage

Player report D1: the 源石溶剂 HP loss should set off 信仰搅拌机 S3 and, next to
莫斯提马, stack 拉特兰 layers on its own. The drain was a Battle.loseHp 流失, which
skips 受击回复 SP and the 重装 TAKE_DAMAGE trigger, and the S3 counter needed an
enemy attack and a target.

Official: PRTS 盟约记录 源石溶剂 "受到60真实伤害" (修正 "并非流失", 备注
"造成无来源真实持续环境伤害"); PRTS 信仰搅拌机 S3 备注 "反击受到任何伤害后均可触发,
无需目标,视为普通攻击"; PRTS 作战机制: 生命流失 skips 反伤 / 受击回复.

- damage.js periodicDamage: the periodic_damage template (源石溶剂, 狂暴宿主组长)
  as 无来源 true damage (shields, damage-taken modifiers, hit effects, 受击回复 SP,
  TAKE_DAMAGE); the credit is unchanged.
- 信仰搅拌机 S3: any damage except 流失 / element 损伤 counters; with no enemy in
  range the counter still spends its bullet.
- Audit, same rule both ways (damage.js isHpLoss): 孽罪奇美拉's aura on operators
  is damage; 雷蛇 战术防御 and 蒂比 S2 / 片场工作指南 respond to any damage
  (PRTS notes); 乌尔比安, 伪装服, 远牙, 录武官's guard and 坚守 thorn chances no
  longer respond to a 流失.
- data/items.json regenerated (源石溶剂 implFormula text only).
This commit is contained in:
sganggs committed 2026-10-03 04:23:21 +08:00
1 parent 7f134737ce
commit 01f5b216c6
15 files changed
+447 -38

No files matched your search

+12 -4
View File
@@ -1292,14 +1292,22 @@ test('2_11 风丸: while substituted she fights with the <替身> ATK/DEF (+modu
}
});
test('2_13 蒂比: only enemy attacks set off 紧急赶场通知; a true-damage attack triggers it but is not dodged', () => {
test('2_13 蒂比: any damage instance sets off 紧急赶场通知 (PRTS 修正 "受到伤害前触发") and a physical one is dodged; a 流失 does not; a true-damage attack triggers it but is not dodged', () => {
const id = 'chess_char_2_13_a';
const g = run({ units: [{ chessId: id, row: 9, col: 5, carryState: READY }] });
const v = g.unit(id);
g.step();
g.b.loseHp(v, 50);
g.step();
assert.equal(v.skill.active, false, 'a 流失 never triggers it');
const hp = v.hp;
g.b.dealDamage(null, v, { amount: 50, type: 'phys' });
assert.ok(v.skill.active, 'a non-attack (sourceless) damage instance triggers it');
assert.equal(v.hp, hp, '…and the physical damage is dodged');
done(g);
const h = run({ defs: { enemies: { e: dummy('e', { atk: 300, bat: 1, dmgType: 'true' }) } }, units: [{ chessId: id, row: 9, col: 5, carryState: READY }] });
const u = h.unit(id);
h.step();
h.b.dealDamage(null, u, { amount: 50, type: 'phys' });
h.step();
assert.equal(u.skill.active, false, 'non-attack damage never triggers it');
h.spawn('e', { pos: [9, 5] });
h.runUntil(() => u.skill.active, 3);
assert.ok(u.skill.active, 'the attack triggered it');