From 4fd8d431e20a8ed344e007ec6063d630b5db8652 Mon Sep 17 00:00:00 2001 From: sganggs Date: Wed, 7 Oct 2026 01:41:11 +0800 Subject: [PATCH] =?UTF-8?q?feedback5=20CB1:=20=E7=83=9B=E7=85=8C's=20?= =?UTF-8?q?=E7=BB=9D=E5=A4=84=E9=87=8D=E7=87=83=20and=20=E5=9D=9A=E5=9B=BA?= =?UTF-8?q?=E7=BB=B4=E5=BC=8F=E9=87=8D=E9=94=A4's=20lock=20both=20work,=20?= =?UTF-8?q?one=20after=20the=20other=20=E2=80=94=20pinned=20(community=20r?= =?UTF-8?q?eport=20=E3=80=8C=E7=BB=B4=E5=A4=9A=E5=88=A9=E4=BA=9A=E7=9A=84?= =?UTF-8?q?=E9=94=81=E8=A1=80=E9=94=A4=E5=92=8C=E7=83=9B=E7=85=8C=E7=9A=84?= =?UTF-8?q?=E9=94=81=E8=A1=80=E5=8F=AA=E7=94=9F=E6=95=88=E4=BA=86=E4=B8=80?= =?UTF-8?q?=E4=B8=AA=E3=80=8D,=20item=205)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Measured: 烛煌 carrying the hammer, a lethal hit every 2 s — 倒地 at the first (the talent, kit fatal −50, 「次数不限」), the lock at the hit that breaks the 6000 barrier while she is 倒地 (PRIO_REVIVE −100: consumable savers run last, items header, DESIGN §21.21), death 8 s later; without the hammer she falls at the second. The lock never shows when she is not killed while 倒地 (the talent takes every lethal hit outside 【重燃】). [ASSUMED] order, no source gives one — an owner question. No product change; golden unchanged. Test: test/content/feedback5-blaze-hammer.test.js. --- test/content/feedback5-blaze-hammer.test.js | 44 +++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 test/content/feedback5-blaze-hammer.test.js diff --git a/test/content/feedback5-blaze-hammer.test.js b/test/content/feedback5-blaze-hammer.test.js new file mode 100644 index 00000000..3be057d8 --- /dev/null +++ b/test/content/feedback5-blaze-hammer.test.js @@ -0,0 +1,44 @@ +// Community report of 2026-10-06 「维多利亚的锁血锤和烛煌的锁血只生效了一个」 (item 5): both work, one after the other. On +// 烛煌's lethal hit her talent 绝处重燃 (kit `fatal` −50: 倒地, 6000 barrier, PRTS 备注 「次数不限」 outside 【重燃】) comes first; +// 坚固维式重锤's once-per-deployment 不死 lock (PRIO_REVIVE −100: consumable savers run last, so a talent's own undying never +// wastes the charge — items/battle.js header, DESIGN §21.21 / §22) waits for a lethal hit while she is 倒地, then holds her +// at 1 HP for 8 s. [ASSUMED] that order (no source gives one; the official autochess hammer buff is not in the client's +// buff templates). + +import { test } from 'node:test'; +import assert from 'node:assert/strict'; +import { makeBattle, enemyRec } from '../helpers/battleHarness.js'; +import { hasGeneratedData } from '../../server/sim/simdata.js'; + +const REAL = { skip: !hasGeneratedData() }; + +/** 烛煌 (elite) carrying `items`, hit for 3000 true damage every 2 s by a far enemy; the timeline of her savers. */ +function run(items) { + const h = makeBattle({ + units: [{ chessId: 'chess_char_5_03_b', row: 9, col: 4, items }], + enemies: [{ key: 'enemy_far', time: 0, route: 0 }], + defs: { enemies: { enemy_far: enemyRec({ key: 'enemy_far', hp: 1e9, atk: 0, bat: 99, speed: 0.0001 }) } }, + timeLimit: 120, seed: 3, + }); + const u = h.unit('chess_char_5_03_b'); + const out = { downedAt: null, lockAt: null, deathAt: null }; + h.b.every(2, () => { const e = h.b.enemies.find((x) => x.alive); if (e && u.alive) h.b.dealDamage(e, u, { amount: 3000, type: 'true', canDodge: false }); }); + h.b.on('death', (c) => { if (c.unit === u && out.deathAt == null) out.deathAt = h.b.time; }, { priority: -1000 }); + h.step(); // the battle-start deployment + while (!h.b.finished && h.b.time < 60 && u.alive) { + h.step(); + if (out.downedAt == null && u.mem.downed) out.downedAt = h.b.time; + if (out.lockAt == null && u.mem.undyingUntil != null) out.lockAt = h.b.time; + } + return out; +} + +test('烛煌 + 坚固维式重锤: 绝处重燃 on the first lethal hit, the lock on the next one while 倒地, death 8 s later', REAL, () => { + const w = run(['chess_item_3_09_e_a']); + assert.ok(w.downedAt != null && w.downedAt < 2.1, `倒地 at the first lethal hit (2 s), got ${w.downedAt}`); + assert.ok(w.lockAt != null && w.lockAt > 7.9 && w.lockAt < 8.1, `the lock at the hit that breaks the barrier (8 s), got ${w.lockAt}`); + assert.ok(Math.abs(w.deathAt - 16) < 0.1, `8 s of 不死, then the next lethal hit (16 s), got ${w.deathAt}`); + const bare = run([]); + assert.equal(bare.lockAt, null); + assert.ok(Math.abs(bare.deathAt - 8) < 0.1, `without the hammer she falls at 8 s, got ${bare.deathAt}`); +});