feedback5: merge CB1 — community reports (bonds / strategies / items): a pair of colds on an enemy becomes the freeze and leaves no cold (the 谢拉格 wind no longer freezes for good), a 复活 (埃芒加德's 命结之秘, M3茧甲) is a knock-out and an immediate free redeploy where the operator lies (砾's and 瑕光's 被击倒时 / 部署时 layers fire), 佩佩's special refresh is paid, the result card hides the layers of 调和 / 协防干员 / 独行 / 绝技, the 炎佑 keeps off 外勤医疗's slot, 凯瑟琳's 定向投放 offers every shop item; 烛煌's 绝处重燃 before the hammer's lock and the 寻呼模块 / 简易通讯机 tier cap kept as they are (the owner's decisions of 2026-10-07); §25.15 → §25.21 (§25.15 is the shortcuts'); golden: vs feedback5 CB1's own rules — roster-005/009/010/012/014/015/016/018/026/029/031/033/036/040/042/046/047/049, bond-egirShip-high, bond-indomShip-low, bond-kjeragShip-high, bond-maniShip-high, bond-raidShip-low, bond-steadShip-high, bond-suntShip-low, boss-boss_2/3/4/6-pair, hidden-boss_8/9/10-pair, standin-07, matches solo-FUNNY-1, solo-NORMAL-1, solo-HARD-1, solo-ABYSS-1, coop3-ABYSS-5, coop4-FUNNY-6, coop4-ABYSS-7; vs CB1 what feedback5 changed since its base (CB2, CB3, CB4, CB5) plus roster-014
Conflicts resolved by hand: - server/sim/content/items/battle.js: CB3 had extended `revivedInPlace` (an in-place 复活 restarts a deploy-timed skill, item 44); CB1 replaced the in-place revive by PRTS's form — `reviveNow`, a `death` hook that redeploys the operator at once, free, where it lies — and removed `revivedInPlace`. CB1's side is kept: its redeploy resets the skill, so an `activateOnDeploy` skill starts anew by itself; CB3's tests (test/sim/feedback5-raid-revive.test.js: the jump at once after M3茧甲 / 埃芒加德, the window back to full, 砾's fresh barrier) pass on it unchanged. Their header, bonds_core's comment, DESIGN §25.17.5 say so. - docs/SIM.md, docs/design/engine.md: CB1's `fatal` rows (the 复活 are `death` hooks now); the `death` rows also say a deploy-timed skill starts anew (§25.17.5). - data/choices.json: no conflict; `node tools/build-data.mjs --offline` on the merged tree rewrites all 15 data files byte-identically, and the JSON compare with feedback5 shows only pools.pool_equip_kathe.maxTier removed (CB1). - docs/history/0.2.0.md: CB1's section renumbered §25.21 (its §25.15.1–10 and two self-citations; no citation of it elsewhere), placed last; the owner's decisions of 2026-10-07 on items 5 and 45 recorded there, in the intro and in the two pin tests' headers (feedback5-blaze-hammer, feedback5-cb1-pins). Golden: solo-FUNNY-1 (outside CB1's list) has 6 埃芒加德 revives and 85 freezes on feedback5's path (instrumented). roster-014 differs from CB1's own digest by 玛恩纳's 无动于衷: CB3's rule (every enemy damage instance) answers the 萨卡兹枯朽战车's pollution that hits a 卡西米尔 operator in CB1's timeline — with that counter limited to attacks the merged roster-014 equals CB1's digest exactly (checked). Gate: non-browser suites 5021 / 5021, npm run golden ok, test/golden.test.js 9 / 9, lint 0 errors, check:imports ok, typecheck ok.
This commit is contained in:
commit
9ca52ba798
39 files changed
+1433
-861
No files matched your search
@@ -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. No source gives that order (the official autochess hammer buff is not in the client's buff templates);
|
||||
// the owner kept it (the owner's decision of 2026-10-07: 绝处重燃 first, then the lock; DESIGN §25.21.1).
|
||||
|
||||
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}`);
|
||||
});
|
||||
Reference in new issue
Block a user