feedback6 R21H: the round's enemy effects reach the 频次 器物 and the leaders' mid-fight summons (PR #272, 感谢 @CXUtk); golden: 74 moved
器物 (the 14 hit-count keys): hits = data × the spawn's hpMul ÷ supplyHpMul, rounded as before (setHits) — 攻坚装备 / II / III leave out only 炎佑, 补给线 / 补给线II also exactly these 14 keys (activity_table aceffect_enemy_2 / 2_2 enemy_exclude, data/effects.json); until now setHits(def.maxHp) overwrote the round's HP (青铜镜 30 hits at every difficulty). build-data writes enemyScale[r].supplyHp = 1.2^(kHp − kAtk) · extra (the HP-only 补给线II steps and 补给线's 1.08; co-op 终极 R5–R15 only — the rebuild changed config.json alone), gamedata returns it as supplyHpMul and the wave / 悬赏 mods carry it (waves.js roundMods; a 频次 enemy's death spawn inherits it). Not taken from the PR: its 1.08 / 1.2 back-calculation (it counted the 补给线II steps as 攻坚装备) and its fractional-HP ceiling. Leader summons (死亡集群's 妖怪, 刺胄之弹, “裂管之音”/“断弦之音”, 不祥幻影): the boss / hidden field carries the round's scale as flags.enemyScale (bossRounds.js, golden fields, tools/balance.mjs) and bosses.js summonMods gives them HP / ATK / speed (死亡集群's summon.hp_ratio on top; 刺胄之弹 / 余音 hit counts follow their HP); the leader's pool stays exempt; 王权号令's invulnerable equipment unchanged; 炎佑 is an ally token, never scaled (no change). Unchanged and open: the 逐火 / 再生 husk counts (talent prop_max_hp). Golden — 器物 counts: roster 37 (002 003 004 005 007–020 022 023 025 026 029–034 036–041 043 045 049: each holds a 器物 extra spawn / 频次 wave / death spawn), bond-soloShip-high, diy 9 (036 040 056 062 068 073 091 114 115), boss-boss_6-solo (俗心's 小说卷轴 escorts); matches 16 (all but solo-ABYSS-2 and coop2-NORMAL-70-diy: 频次 rounds / 悬赏 and the Final Assault summons). Summons: boss-boss_1-pair/solo, hidden-boss_8-pair/solo (妖怪, 刺胄之弹), boss-boss_3-pair/solo, hidden-boss_10-pair/solo (余音), boss-boss_5-pair/solo (不祥幻影). standins unchanged.
This commit is contained in:
1 parent
783bd30afd
commit
e33ee3db8f
20 files changed
+1491
-1324
No files matched your search
@@ -79,6 +79,7 @@ for (const n of [1, 2, 3, 4]) {
|
||||
assert.deepEqual(f.opts.rect, GEO.BOSS_RECT);
|
||||
assert.equal(f.opts.timeLimit, Infinity);
|
||||
assert.equal(f.opts.flags.layerGainsEnabled, false);
|
||||
assert.deepEqual(f.opts.flags.enemyScale, m.gd.enemyScale(14), 'the round\'s enemy effects for the leader\'s summons (PR #272)');
|
||||
assert.ok(f.opts.players.every((p) => p.lpForBoss === m.teamLp));
|
||||
if (f.opts.players.length === 2) {
|
||||
assert.deepEqual(f.opts.players.map((p) => p.side), ['L', 'R']);
|
||||
|
||||
@@ -179,6 +179,30 @@ test('boss templates: leaders never scaled, pairs use the multi template, single
|
||||
assert.equal(w.pick, setup.picks[9], 'solo 标准: the leader round uses slot 9');
|
||||
});
|
||||
|
||||
test('co-op 终极: supplyHpMul = the 补给线 / 补给线II share of hp (hp ÷ it = the 攻坚装备 stacks 1.2^kAtk); wave and bounty mods carry it (PR #272)', () => {
|
||||
const gd = new GameData(DATA, 'mode_multi_abyss');
|
||||
for (const [r, row] of Object.entries(gd.mode.enemyScale)) {
|
||||
const sc = gd.enemyScale(Number(r));
|
||||
assert.ok(Math.abs(sc.hpMul / (sc.supplyHpMul ?? 1) - 1.2 ** row.kAtk) < 1e-5, `R${r}: ${sc.hpMul} / ${sc.supplyHpMul}`);
|
||||
}
|
||||
assert.equal(gd.enemyScale(4).supplyHpMul, undefined);
|
||||
assert.equal(gd.enemyScale(5).supplyHpMul, 1.2); // 补给线II
|
||||
assert.equal(gd.enemyScale(6).supplyHpMul, 1.08); // 补给线
|
||||
for (const id of ['mode_single_funny', 'mode_single_abyss', 'mode_multi_hard']) {
|
||||
const g = new GameData(DATA, id);
|
||||
for (const r of Object.keys(g.mode.enemyScale)) assert.equal(g.enemyScale(Number(r)).supplyHpMul, undefined, `${id} R${r}`);
|
||||
}
|
||||
const key = 'enemy_1200_msfjin';
|
||||
const picks = [];
|
||||
picks[6] = { round: 6, type: 'TIMES', key, normal: key, elite: key, fly: false, firstHalf: true };
|
||||
const wave = buildNormalWave(gd, createRng(1), { picks }, 6);
|
||||
const tokens = wave.spawns.filter((s) => s.enemyKey === key);
|
||||
assert.ok(tokens.length > 0);
|
||||
for (const s of tokens) assert.deepEqual([s.mods.hpMul, s.mods.supplyHpMul], [gd.enemyScale(6).hpMul, 1.08]);
|
||||
const [b] = bountySpawns(gd, 6, wave, [{ id: 'jin', card: { enemyKey: key, count: 1 } }], 'p1');
|
||||
assert.deepEqual([b.mods.hpMul, b.mods.supplyHpMul], [gd.enemyScale(6).hpMul, 1.08]);
|
||||
});
|
||||
|
||||
test('bounty spawns: joined to the template\'s first normal action of the enemy\'s class, spread over its window; no solo ×0.7', () => {
|
||||
const gd = new GameData(DATA, 'mode_multi_hard');
|
||||
const picks = [];
|
||||
|
||||
Reference in new issue
Block a user