Playtest #6 follow-up (v2.5.1): leader HP review — 直接乘算, one debuff instance, 999 layer cap, 限伤; elite to the board; 假想敌:胄 kit

- co-op leaders died within seconds: leader HP is the official data (40 values pinned); bond / strategy / item /
  机变 / 特质 "+X%" bonuses now add up (PRTS 直接乘算) instead of compounding; a same-named enemy debuff keeps one
  (strongest) instance per target (奥术 across a pair field); leader parts pass damage 1:1; fixed co-op pool (the user's call)
- official limits read from the client: each bond stops at 999 layers (MAX_GARRISON_STACK); a leader hit of 300000+ in
  boss / hidden battles is cancelled (MAX_BATTLE_DAMAGE, 限伤) — shared/constants.js switches, research 11
- a merge that consumes a deployed copy puts the elite on that tile and facing (user-confirmed); gold target highlight,
  promotion effect
- 假想敌:胄 per PRTS: one shell, shells within range, any drone death costs 2 % max HP, 剑/锤 sorties and 瘫痪
- DESIGN §20.10–§20.14; 2842 unit tests, all 28 browser suites green; Chrome = Node on boss fields
This commit is contained in:
sganggs committed 2026-10-02 04:19:28 +08:00
1 parent 6464e4b46a
commit 620f88c0d8
81 files changed
+4194 -447

No files matched your search

+7 -6
View File
@@ -77,7 +77,7 @@ const STAT_CASES = [
[A('6_11'), { spRecovery: 1.2 }], [B('6_11'), { spRecovery: 1.35 }], // 家族徽章
];
test('stat equipment: every percentage is its own multiplier (normal / golden numbers from data)', () => {
test('stat equipment: percentages are 直接乘算 — additive with each other (normal / golden numbers from data)', () => {
for (const [id, want] of STAT_CASES) {
const h = fight({ units: [{ chessId: 't_op', row: 10, col: 4, items: [id] }] });
h.step(1);
@@ -85,13 +85,14 @@ test('stat equipment: every percentage is its own multiplier (normal / golden nu
for (const [k, v] of Object.entries(want)) close(s[k], v, `${id} ${k}`);
cover(id);
}
// two items multiply (维式重锤 ×1.15 × 阿戈尔重刃 ×1.4), a normal + golden copy of one item both apply
// two items add up (PRTS 盟约记录 "装备效果提供的属性加成均为直接乘算"; 直接乘算 values are summed, PRTS 游戏数据基础):
// 维式重锤 +15 % and 阿戈尔重刃 +40 % = +55 %, not ×1.15 × 1.4; a normal + golden copy of one item both apply
const h = fight({ units: [{ chessId: 't_op', row: 10, col: 4, items: [A('1_01'), A('3_07')] }] });
h.step(1);
close(h.unit('t_op').s.atk, 500 * 1.15 * 1.4, 'stacked');
close(h.unit('t_op').s.atk, 500 * (1 + 0.15 + 0.4), 'stacked');
const h2 = fight({ units: [{ chessId: 't_op', row: 10, col: 4, items: [A('1_01'), B('1_01')] }] });
h2.step(1);
close(h2.unit('t_op').s.atk, 500 * 1.15 * 1.25, 'normal + golden');
close(h2.unit('t_op').s.atk, 500 * (1 + 0.15 + 0.25), 'normal + golden');
checkInvariants(h2.b);
});
@@ -179,8 +180,8 @@ test('歌利亚头盔: HP +25 % / +45 %, and +15 % / +25 % more when nobody stan
const ops = { t_op: op('t_op'), t_f: op('t_f') };
const free = fight({ ops, units: [{ chessId: 't_op', row: 10, col: 4, items: [id] }] });
free.step(1);
close(free.unit('t_op').s.maxHp, 2000 * base * ex, `${id} free`);
close(free.unit('t_op').hp, 2000 * base * ex, `${id} deployed at full HP`);
close(free.unit('t_op').s.maxHp, 2000 * (base + ex - 1), `${id} free (+25 % and +15 % add up: 直接乘算)`);
close(free.unit('t_op').hp, 2000 * (base + ex - 1), `${id} deployed at full HP`);
const blocked = fight({ ops, units: [{ chessId: 't_op', row: 10, col: 4, items: [id] }, { chessId: 't_f', row: 10, col: 5 }] });
blocked.step(1);
close(blocked.unit('t_op').s.maxHp, 2000 * base, `${id} front occupied`);