feedback5 CB3: the "受到攻击时" counters answer every damage instance from an enemy, not its attacks only — 菲莱 S2 now blasts on 深溟巢涌者's pulse, so do 星熊 S2, 泡泡, 刺玫 S2, 余 S1, 玛恩纳 无动于衷, 年 S2 and 斩业星熊 (community report of 2026-10-06, item 30)

The report's 退行的潮涌者 is the 巢涌者 (深溟 / 富营养的巢涌者 in this mode): no normal attack, its talent hurts every operator in
range once a second. Official (ArknightsGameData buff_template_data): its pulse is an AdvancedApplyDamage with the enemy as
source (enemy_dsubrl_aoe[aura]); the counters fire on ON_TAKE_DAMAGE — philae_s_2 with no filter, inverse_damage (星熊 S2),
inverse_damage[magic] + nian_s_2 (年 S2), bubble_s_2 / bubble_t_1 (泡泡), vendla_s_2 (刺玫), yu_s_1[inverse_damage] (余 S1),
hsgma2_s_1 / hsgma2_e_003_tr_take (斩业星熊), mlynar_t_2[inverse] (玛恩纳) on a source of the other side; 棘刺 S2 (普通伤害
filter) and 信仰搅拌机 S3 already took any damage. Cause: the kits required dmg.isAttack. Now kits/shared/tier1.js
byEnemyAttack = any enemy damage instance but a 流失, an element 损伤, 无来源 damage or another counter / reflection (tags
'counter' / 'reflect'); 菲莱 S2 any instance but a 流失 or a counter. test/content/op_nian.test.js pinned "a non-attack hit
returns nothing" for 年 S2 — updated on purpose (answered now; a 流失 still is not).

Golden: 19 scenarios where an enemy's non-attack damage (skills, pulses, areas) reached one of these operators — their counter
now answers it (more damage, fx thorns / aoe): roster-002, -005, -008, -010, -012, -016, -033, -044; bond-lateranoShip-low;
fields boss-boss_2-solo, boss-boss_4-pair, boss-boss_4-solo, hidden-boss_8-pair, hidden-boss_8-solo; matches solo-FUNNY-1,
solo-FUNNY-2, coop4-ABYSS-7, coop2-ABYSS-10-boosted; diy-051. Tests: test/sim/feedback5-counters-any-damage.test.js (6; 5
fail on the parent, the first checks the 巢涌者 never attacks). Docs: docs/SIM.md (re-entrancy rule).
This commit is contained in:
sganggs committed 2026-10-07 02:30:07 +08:00
1 parent 9b164fdc66
commit 5877800a67
16 files changed
+341 -182

No files matched your search

+4 -1
View File
@@ -798,7 +798,10 @@ registration order. `battle.off(handle)` / `battle.off(name, fn)` / `battle.offO
"bonus damage on hit") must not react to its own output or to other reactive damage, or two such effects ping-pong "bonus damage on hit") must not react to its own output or to other reactive damage, or two such effects ping-pong
until the nesting guard trips (the guard then skips *every* nested handler, including `kill`/`death` bookkeeping of until the nesting guard trips (the guard then skips *every* nested handler, including `kill`/`death` bookkeeping of
content). Respond only to `dmg.isAttack` (normal attacks), tag your damage (`tags: ['counter']`) and skip tagged damage, content). Respond only to `dmg.isAttack` (normal attacks), tag your damage (`tags: ['counter']`) and skip tagged damage,
or guard with a per-unit flag while dealing it. When the guard trips, the logged error names the open frames or guard with a per-unit flag while dealing it. The "受到攻击时" counters take the second way: the official ones fire on
every damage instance from an enemy (ON_TAKE_DAMAGE — its attack, a skill hit, 深溟巢涌者's pulse; never a 流失), so they
answer `kits/shared/tier1.js byEnemyAttack` (星熊 S2, 泡泡, 刺玫 S2, 余 S1, 玛恩纳 无动于衷, 年 S2, 斩业星熊; 菲莱 S2 any
instance) and skip `'counter'` / `'reflect'` damage. When the guard trips, the logged error names the open frames
(`chain: hit(enemy_x→chess_y) > damaged(chess_y) > …`). (`chain: hit(enemy_x→chess_y) > damaged(chess_y) > …`).
--- ---
@@ -6,8 +6,9 @@ import { onDefaultSkill } from '../shared/tier2.js';
export default { export default {
// --------------------------------------------------------------------------------------------------------------- // ---------------------------------------------------------------------------------------------------------------
// 2_08 泡泡 “挨打”: stops attacking; DEF +def, taunt +taunt_level, each attack received returns atk_scale × DEF phys // 2_08 泡泡 “挨打”: stops attacking; DEF +def, taunt +taunt_level, each enemy damage instance received (its attack or not:
// damage to the attacker. 尖刺盾: attackers get ATK −atk for `duration` s. Elite module (PRO-X): DEF +def while blocking. // the official bubble_s_2 / bubble_t_1 fire on ON_TAKE_DAMAGE — tier1 byEnemyAttack) returns atk_scale × DEF phys damage
// to its source. 尖刺盾: that source gets ATK −atk for `duration` s. Elite module (PRO-X): DEF +def while blocking.
// S1 防御力强化·β型 (alt, TAKE_DAMAGE from data): DEF +def for its duration; the counter belongs to “挨打” only. // S1 防御力强化·β型 (alt, TAKE_DAMAGE from data): DEF +def for its duration; the counter belongs to “挨打” only.
chess_char_2_08_a: (bb, chess) => { chess_char_2_08_a: (bb, chess) => {
const t = talentBb(chess, 0); const t = talentBb(chess, 0);
@@ -2,10 +2,12 @@
// Conventions of the tier-3 kits: ../shared/tier3.js; kit contract and rules: ../README.md. // Conventions of the tier-3 kits: ../shared/tier3.js; kit contract and rules: ../README.md.
import { num, defOf, talentBb, traitBb, selectedId, altSkills, fx, NINE, giveSp } from '../shared/tier3.js'; import { num, defOf, talentBb, traitBb, selectedId, altSkills, fx, NINE, giveSp } from '../shared/tier3.js';
import { isHpLoss } from '../../../damage.js';
export default { export default {
// ---- 3_06 菲莱 · 本源铁卫 — S2 冥河诅咒: stops attacking, HP +; when attacked blasts the ground enemies of the 3×3 // ---- 3_06 菲莱 · 本源铁卫 — S2 冥河诅咒: stops attacking, HP +; "受到攻击时" — any damage instance she takes (official
// around her (PRTS 备注: range x-4; arts + ep_damage_ratio × ATK apoptosis, aoe_cd); ATK + once hit by element // philae_s_2: ON_TAKE_DAMAGE with no source or attack filter) — blasts the ground enemies of the 3×3 around her
// (PRTS 备注: range x-4; arts + ep_damage_ratio × ATK apoptosis, aoe_cd); ATK + once hit by element
// damage; 神河谕使: 元素损伤 taken −damage_resistance, +SP on apoptosis // damage; 神河谕使: 元素损伤 taken −damage_resistance, +SP on apoptosis
// 精锐 module PRP-X "阻挡敌人时,自身造成的元素损伤提升15%": EVERY element fill she deals (the S2 blast, a 灼燃维式重锤 // 精锐 module PRP-X "阻挡敌人时,自身造成的元素损伤提升15%": EVERY element fill she deals (the S2 blast, a 灼燃维式重锤
// she carries …) ×ep_damage_scale while she blocks — an `elementHit` multiplier, like 余's // she carries …) ×ep_damage_scale while she blocks — an `elementHit` multiplier, like 余's
@@ -85,7 +87,11 @@ export default {
if (isS2 && sk && sk.active && !unit.findBuff('skill:philae_rage')) battle.addBuff(unit, { key: 'skill:philae_rage', mods: { atkPct: num(bb.atk) }, visible: true }); if (isS2 && sk && sk.active && !unit.findBuff('skill:philae_rage')) battle.addBuff(unit, { key: 'skill:philae_rage', mods: { atkPct: num(bb.atk) }, visible: true });
return; return;
} }
if (!isS2 || !sk || !sk.active || !ctx.dmg?.isAttack || !ctx.source || ctx.source.side !== 'enemy') return; // the official philae_s_2 (buff_template_data) fires on ON_TAKE_DAMAGE with no filter: any damage instance — an
// enemy's attack, a skill hit, 深溟巢涌者's pulse, a 无来源 hit — never a 流失 or an element 损伤 (above), nor a
// counter / reflection. Until 0.2.0 enemy attacks only (community report of 2026-10-06, item 30)
const d = ctx.dmg;
if (!isS2 || !sk || !sk.active || !d || isHpLoss(d) || (d.tags || []).some((t) => t === 'counter' || t === 'reflect')) return;
if (battle.time < (unit.mem.philaeCd ?? -Infinity)) return; if (battle.time < (unit.mem.philaeCd ?? -Infinity)) return;
unit.mem.philaeCd = battle.time + cd; unit.mem.philaeCd = battle.time + cd;
// "周围的地面敌人" = range x-4, the 3×3 tiles around her (PRTS 备注) // "周围的地面敌人" = range x-4, the 3×3 tiles around her (PRTS 备注)
@@ -2,6 +2,7 @@
// Conventions of the tier-4 kits: ../shared/tier4.js; kit contract and rules: ../README.md. // Conventions of the tier-4 kits: ../shared/tier4.js; kit contract and rules: ../README.md.
import { AURA, num, tbb, whileDeployed, pulse, toggleBuff, isSel, alt, withDefaults } from '../shared/tier4.js'; import { AURA, num, tbb, whileDeployed, pulse, toggleBuff, isSel, alt, withDefaults } from '../shared/tier4.js';
import { byEnemyAttack } from '../shared/tier1.js';
export default withDefaults({ export default withDefaults({
// ===== 星熊 (protector) S2 荆棘 (passive) — DEF +13 %, counters every attacker for 65 % ATK phys; talents // ===== 星熊 (protector) S2 荆棘 (passive) — DEF +13 %, counters every attacker for 65 % ATK phys; talents
@@ -40,7 +41,8 @@ export default withDefaults({
if (!S2) return; if (!S2) return;
battle.on('damaged', (c) => { battle.on('damaged', (c) => {
const src = c.source; const src = c.source;
if (c.target !== unit || !unit.alive || !src || src.side !== 'enemy' || !src.alive || !c.dmg?.isAttack) return; // 荆棘 = the official inverse_damage: every enemy damage instance, not its attacks only (tier1 byEnemyAttack)
if (c.target !== unit || !unit.alive || !byEnemyAttack(c) || !src.alive) return;
battle.dealDamage(unit, src, { amount: unit.s.atk * num(bb.atk_scale, 0.65), type: 'phys', canDodge: false, isSkill: true, tags: ['counter'] }); battle.dealDamage(unit, src, { amount: unit.s.atk * num(bb.atk_scale, 0.65), type: 'phys', canDodge: false, isSkill: true, tags: ['counter'] });
battle.fx('thorns', { x: unit.x, y: unit.y, id: unit.id }); battle.fx('thorns', { x: unit.x, y: unit.y, id: unit.id });
}, { owner: unit }); }, { owner: unit });
@@ -5,6 +5,7 @@ import {
num, on, inRange, talent, skillGrid, batPct, mods, inFaction, isOp, selectedId, lazySkills, skillRange, leaderOf, num, on, inRange, talent, skillGrid, batPct, mods, inFaction, isOp, selectedId, lazySkills, skillRange, leaderOf,
whileOn, permBuff, whileOn, permBuff,
} from '../shared/tier5.js'; } from '../shared/tier5.js';
import { byEnemyAttack } from '../shared/tier1.js';
/** 玛恩纳 游侠 "周围存在3名及以上敌人" radius (8-neighbourhood). */ /** 玛恩纳 游侠 "周围存在3名及以上敌人" radius (8-neighbourhood). */
const AROUND_RADIUS = 1.5; const AROUND_RADIUS = 1.5;
@@ -18,7 +19,7 @@ export default {
// PRTS 备注 the trait bonus drops by 10 % (per_kill_reduce, absolute: +400 % → +390 %) for each enemy knocked out by // PRTS 备注 the trait bonus drops by 10 % (per_kill_reduce, absolute: +400 % → +390 %) for each enemy knocked out by
// his own attack (or the damage it carries — not 无动于衷's reflection, not a mark another operator's attack set off), // his own attack (or the damage it carries — not 无动于衷's reflection, not a mark another operator's attack set off),
// settled after that attack, never below +0 %. T1 游侠: ×1.1 ATK on attacks (×1.15 and −15 % damage taken with ≥3 // settled after that attack, never below +0 %. T1 游侠: ×1.1 ATK on attacks (×1.15 and −15 % damage taken with ≥3
// enemies around). T2 无动于衷: taunt +1, Kazimierz ops reflect 15 % of his ATK as true damage when attacked. // enemies around). T2 无动于衷: taunt +1, Kazimierz ops reflect 15 % of his ATK as true damage when an enemy damages them.
// S1 未声张的怒火 (duration, SEARCH): attacks attack@atk_scale × ATK, DEF +. S2 未宽解的悲哀 (duration): skill range, // S1 未声张的怒火 (duration, SEARCH): attacks attack@atk_scale × ATK, DEF +. S2 未宽解的悲哀 (duration): skill range,
// BAT +0.3 s, attacks attack@atk_scale × ATK twice; a kill of his own attacks during the skill keeps the trait ramp // BAT +0.3 s, attacks attack@atk_scale × ATK twice; a kill of his own attacks during the skill keeps the trait ramp
// when it ends. S1 / S2 have no 对空 note: ground only, like his trait. S2's data rule is ACTIVE_RANGE on its 2-3 (the // when it ends. S1 / S2 have no 对空 note: ground only, like his trait. S2's data rule is ACTIVE_RANGE on its 2-3 (the
@@ -85,7 +86,9 @@ export default {
if (!(scale > 0)) return; if (!(scale > 0)) return;
battle.on('damaged', (c) => { battle.on('damaged', (c) => {
const a = c.target, src = c.source; const a = c.target, src = c.source;
if (a.side !== 'ally' || !isOp(a) || !isKazimierz(a) || !src || src.side !== 'enemy' || !src.alive || !c.dmg?.isAttack) return; // the official mlynar_t_2[inverse] (ON_TAKE_DAMAGE, InverseDamage from an enemy source): every enemy damage instance
// a Kazimierz operator takes, not its attacks only (tier1 byEnemyAttack)
if (a.side !== 'ally' || !isOp(a) || !isKazimierz(a) || !byEnemyAttack(c) || !src.alive) return;
if (!on(unit) || leaderOf(battle, unit) !== unit) return; if (!on(unit) || leaderOf(battle, unit) !== unit) return;
battle.dealDamage(unit, src, { amount: unit.s.atk * scale, type: 'true', canDodge: false, tags: ['talent', 'reflect'] }); battle.dealDamage(unit, src, { amount: unit.s.atk * scale, type: 'true', canDodge: false, tags: ['talent', 'reflect'] });
}, { owner: unit }); }, { owner: unit });
@@ -6,7 +6,7 @@ import {
num, bv, tbb, moduleBb, live, opsOf, ANY, onDefaultSkill, selectedSkill, skillGridOf, AROUND8, onElementHit, num, bv, tbb, moduleBb, live, opsOf, ANY, onDefaultSkill, selectedSkill, skillGridOf, AROUND8, onElementHit,
elementDmg, aura, elementDmg, aura,
} from '../shared/tier6.js'; } from '../shared/tier6.js';
import { holdProtect } from '../shared/tier1.js'; import { holdProtect, byEnemyAttack } from '../shared/tier1.js';
/** /**
* "传送至自身位置": a ground enemy that can reach `unit`'s tile on the ground grid is moved onto it (unblocked, its * "传送至自身位置": a ground enemy that can reach `unit`'s tile on the ground grid is moved onto it (unblocked, its
@@ -71,7 +71,8 @@ function yu(bb, chess, def) {
battle.addBuff(unit, { key: 'yu:host', mods: { taunt: num(bb.taunt_level, 1) }, persist: true, allowDead: true }); battle.addBuff(unit, { key: 'yu:host', mods: { taunt: num(bb.taunt_level, 1) }, persist: true, allowDead: true });
battle.on('damaged', (ctx) => { battle.on('damaged', (ctx) => {
const s = ctx.source; const s = ctx.source;
if (ctx.target !== unit || !unit.skill?.active || !s || s.side !== 'enemy' || !s.alive || !ctx.dmg?.isAttack) return; // "每次受到攻击" = the official yu_s_1[inverse_damage]: every enemy damage instance (tier1 byEnemyAttack)
if (ctx.target !== unit || !unit.skill?.active || !byEnemyAttack(ctx) || !s.alive) return;
elementDmg(battle, unit, s, 'burn', unit.s.atk * num(bb.ep_damage_ratio), ['skill']); elementDmg(battle, unit, s, 'burn', unit.s.atk * num(bb.ep_damage_ratio), ['skill']);
}, { owner: unit }); }, { owner: unit });
}, },
+7 -5
View File
@@ -52,7 +52,7 @@
// refund of a withdrawal is not modelled — no retreat in the sim refunds DP). No strategy of this mode closes it: PRTS // refund of a withdrawal is not modelled — no retreat in the sim refunds DP). No strategy of this mode closes it: PRTS
// 帮助 lists the 上半 row that did as removed in 下半, so in a fight the skill simply runs its `duration`. // 帮助 lists the 上半 row that did as removed in 下半, so in a fight the skill simply runs its `duration`.
import { num, talentBb, traitBb, skillRec, up } from '../shared/tier1.js'; import { num, talentBb, traitBb, skillRec, up, byEnemyAttack } from '../shared/tier1.js';
import { canTargetEnemy } from '../../../targeting.js'; import { canTargetEnemy } from '../../../targeting.js';
import { bodyInRadius } from '../../../body.js'; import { bodyInRadius } from '../../../body.js';
import { hasHp } from '../../../damage.js'; import { hasHp } from '../../../damage.js';
@@ -252,15 +252,17 @@ export default {
} }, } },
], ],
install(battle, unit) { install(battle, unit) {
// S1 恶业苦果: every enemy attack she takes ⇒ atk_scale × ATK arts back to the attacker // S1 恶业苦果: every enemy damage instance she takes (the official hsgma2_s_1 on ON_TAKE_DAMAGE, not its attacks only:
// tier1 byEnemyAttack) ⇒ atk_scale × ATK arts back to its source
battle.on('damaged', (c) => { battle.on('damaged', (c) => {
const s = c.source; const s = c.source;
if (c.target !== unit || !unit.alive || unit.skill?.id !== S1 || !unit.skill.active) return; if (c.target !== unit || !unit.alive || unit.skill?.id !== S1 || !unit.skill.active) return;
if (!s || s.side !== 'enemy' || !s.alive || !c.dmg?.isAttack) return; if (!byEnemyAttack(c) || !s.alive) return;
battle.dealDamage(unit, s, { amount: unit.s.atk * num(b1.atk_scale), type: 'arts', canDodge: false, isSkill: true, ignoreSelect: true, tags: ['skill', 'counter'] }); battle.dealDamage(unit, s, { amount: unit.s.atk * num(b1.atk_scale), type: 'arts', canDodge: false, isSkill: true, ignoreSelect: true, tags: ['skill', 'counter'] });
battle.fx('counter', { x: s.x, y: s.y, id: unit.id }); battle.fx('counter', { x: s.x, y: s.y, id: unit.id });
}, { owner: unit }); }, { owner: unit });
// AST-X 无迹: her attack damage ⇒ +atk_scale × ATK arts (附加伤害); an enemy attack she takes ⇒ atk_scale × ATK arts back // AST-X 无迹: her attack damage ⇒ +atk_scale × ATK arts (附加伤害); an enemy damage instance she takes (the official
// hsgma2_e_003_tr_take: ON_TAKE_DAMAGE from the other side) ⇒ atk_scale × ATK arts back
const astx = num(tb.atk_scale); const astx = num(tb.atk_scale);
if (astx > 0) { if (astx > 0) {
battle.on('damaged', (c) => { battle.on('damaged', (c) => {
@@ -270,7 +272,7 @@ export default {
}, { owner: unit, priority: -20 }); }, { owner: unit, priority: -20 });
battle.on('damaged', (c) => { battle.on('damaged', (c) => {
const s = c.source; const s = c.source;
if (c.target !== unit || !unit.alive || !s || s.side !== 'enemy' || !s.alive || !c.dmg?.isAttack) return; if (c.target !== unit || !unit.alive || !byEnemyAttack(c) || !s.alive) return;
battle.dealDamage(unit, s, { amount: unit.s.atk * astx, type: 'arts', ignoreSelect: true, tags: ['module', ASTX, 'counter'] }); battle.dealDamage(unit, s, { amount: unit.s.atk * astx, type: 'arts', ignoreSelect: true, tags: ['module', ASTX, 'counter'] });
}, { owner: unit }); }, { owner: unit });
} }
+4 -3
View File
@@ -37,7 +37,7 @@
// −one_minus_status_resistance), refreshed every AURA s while the skill runs; two 年 of a shared field keep the stronger // −one_minus_status_resistance), refreshed every AURA s while the skill runs; two 年 of a shared field keep the stronger
// (installAura's rule). The DEF / block buff ends with the skill, the 抵抗 within AURA_DUR. // (installAura's rule). The DEF / block buff ends with the skill, the 抵抗 within AURA_DUR.
import { num, talentBb, traitBb, skillRec, statBuff, toggleBuff, up, giveSp } from '../shared/tier1.js'; import { num, talentBb, traitBb, skillRec, statBuff, toggleBuff, up, giveSp, byEnemyAttack } from '../shared/tier1.js';
import { absoluteRangeKeys } from '../../../targeting.js'; import { absoluteRangeKeys } from '../../../targeting.js';
import { COLS } from '../../../constants.js'; import { COLS } from '../../../constants.js';
@@ -154,12 +154,13 @@ export default {
battle.addBuff(unit, { key: FORT, mods: nz({ hpPct: perHp * n, healingTakenMul: Math.min(healMax, healBase + healAdd * n) }), data: { n }, tags: ['trait'] }); battle.addBuff(unit, { key: FORT, mods: nz({ hpPct: perHp * n, healingTakenMul: Math.min(healMax, healBase + healAdd * n) }), data: { n }, tags: ['trait'] });
}, { owner: unit }); }, { owner: unit });
} }
// S2 铜印: every enemy attack she takes ⇒ atk_scale × ATK arts back to the attacker + silence `silence` s // S2 铜印: every enemy damage instance she takes (the official inverse_damage[magic] + nian_s_2 on ON_TAKE_DAMAGE, not
// its attacks only: tier1 byEnemyAttack) ⇒ atk_scale × ATK arts back to its source + silence `silence` s
const scale = num(b2.atk_scale), sil = num(b2.silence); const scale = num(b2.atk_scale), sil = num(b2.silence);
battle.on('damaged', (c) => { battle.on('damaged', (c) => {
const src = c.source; const src = c.source;
if (c.target !== unit || !unit.alive || unit.skill?.id !== S2 || !unit.skill.active) return; if (c.target !== unit || !unit.alive || unit.skill?.id !== S2 || !unit.skill.active) return;
if (!src || src.side !== 'enemy' || !src.alive || !c.dmg?.isAttack) return; if (!byEnemyAttack(c) || !src.alive) return;
if (scale > 0) battle.dealDamage(unit, src, { amount: unit.s.atk * scale, type: 'arts', canDodge: false, isSkill: true, ignoreSelect: true, tags: ['skill', 'counter'] }); if (scale > 0) battle.dealDamage(unit, src, { amount: unit.s.atk * scale, type: 'arts', canDodge: false, isSkill: true, ignoreSelect: true, tags: ['skill', 'counter'] });
if (sil > 0 && src.alive) battle.applyStatus(src, 'silence', { duration: sil, source: unit }); if (sil > 0 && src.alive) battle.applyStatus(src, 'silence', { duration: sil, source: unit });
battle.fx('counter', { x: src.x, y: src.y, id: unit.id }); battle.fx('counter', { x: src.x, y: src.y, id: unit.id });
+16 -2
View File
@@ -31,6 +31,7 @@ import { COLS, TICK } from '../../../constants.js';
import { absoluteRangeKeys, sortEnemyTargets } from '../../../targeting.js'; import { absoluteRangeKeys, sortEnemyTargets } from '../../../targeting.js';
import { offsetTile } from '../../../dir.js'; import { offsetTile } from '../../../dir.js';
import { bodyInKeys, bodyTileReach } from '../../../body.js'; import { bodyInKeys, bodyTileReach } from '../../../body.js';
import { isHpLoss } from '../../../damage.js';
// ================================================================================================================= // =================================================================================================================
// shared helpers (named exports; content/index.js only merges the default export) // shared helpers (named exports; content/index.js only merges the default export)
@@ -66,8 +67,21 @@ export const cheb = (a, b) => (b.hitArea ? bodyTileReach(b, Math.round(a.y), Mat
: Math.max(Math.abs(Math.round(a.y) - Math.round(b.y)), Math.abs(Math.round(a.x) - Math.round(b.x)))); : Math.max(Math.abs(Math.round(a.y) - Math.round(b.y)), Math.abs(Math.round(a.x) - Math.round(b.x))));
/** Normal attack hit on its primary target (no splash, no chain jump). */ /** Normal attack hit on its primary target (no splash, no chain jump). */
export const isMainHit = (dmg) => !!dmg && dmg.isAttack && !dmg.isSplash && !(dmg.tags && dmg.tags.includes('chain')); export const isMainHit = (dmg) => !!dmg && dmg.isAttack && !dmg.isSplash && !(dmg.tags && dmg.tags.includes('chain'));
/** Damage ctx caused by an enemy's attack. */ /**
export const byEnemyAttack = (ctx) => !!ctx.source && ctx.source.side === 'enemy' && !!ctx.dmg && ctx.dmg.isAttack; * `damaged` ctx that sets off a "受到攻击时" counter: a damage instance from an enemy, of any kind — its normal attack, a
* skill hit, an area pulse (深溟巢涌者's 无途径 法术伤害). The official counters fire on ON_TAKE_DAMAGE from a source of the
* other side, not on attacks only (ArknightsGameData buff_template_data: inverse_damage / inverse_damage[magic] — 星熊 S2,
* 年 S2 —, bubble_s_2 / bubble_t_1 — 泡泡 —, vendla_s_2 — 刺玫 —, yu_s_1[inverse_damage] — 余 S1 —, hsgma2_s_1 /
* hsgma2_e_003_tr_take — 斩业星熊 —, mlynar_t_2[inverse] — 玛恩纳 无动于衷; 菲莱 S2's philae_s_2 checks no source at all).
* Never a 流失 (PRTS 作战机制 "生命流失…不会触发反伤、受击回复等受到攻击触发的时点"), an element 损伤 (its own event), 无来源 damage
* (no source to strike back) or another counter / reflection (tags 'counter' / 'reflect': no ping-pong). Community report
* of 2026-10-06 (item 30): it took enemy attacks only, so 深溟巢涌者's pulse never set a counter off.
*/
export const byEnemyAttack = (ctx) => {
const s = ctx.source, d = ctx.dmg;
if (!s || s.side !== 'enemy' || !d || d.sourceless || ctx.type === 'element' || isHpLoss(d)) return false;
return !(Array.isArray(d.tags) && (d.tags.includes('counter') || d.tags.includes('reflect')));
};
/** /**
* `damaged` ctx of a damage that removed HP and can give 受击回复 SP — the engine's rule (damage.js applyHpLoss: not a 流失 * `damaged` ctx of a damage that removed HP and can give 受击回复 SP — the engine's rule (damage.js applyHpLoss: not a 流失
* (`noSp`, Battle.loseHp), not an element 损伤), whatever its source: an attack, a zone, the 无来源 源石溶剂 tick. * (`noSp`, Battle.loseHp), not an element 损伤), whatever its source: an attack, a zone, the 无来源 源石溶剂 tick.
+7 -2
View File
@@ -127,7 +127,7 @@ test('S1 锡灼 (23 / 26 s): DEF +40 % / +55 %, ATK +20 % / +30 %, her normal at
} }
}); });
test('S2 铜印 (31 / 32 s): stops attacking; DEF +80 % / +100 %, block +1; every enemy attack she takes returns 60 % / 70 % ATK arts to the attacker (ranged ones too, a direct pick) and silences it 3 s; nothing for a non-attack hit, nothing once it ends', () => { test('S2 铜印 (31 / 32 s): stops attacking; DEF +80 % / +100 %, block +1; every enemy damage instance she takes (its attack or not — official ON_TAKE_DAMAGE) returns 60 % / 70 % ATK arts to its source (ranged ones too, a direct pick) and silences it 3 s; nothing for a 流失, nothing once it ends', () => {
for (const [tier, elite, mod] of [[5, false, null], [6, true, null], [6, true, PROY]]) { for (const [tier, elite, mod] of [[5, false, null], [6, true, null], [6, true, PROY]]) {
const sk = skillOf(tier, elite, S2); const sk = skillOf(tier, elite, S2);
const { h, u } = field({ tier, elite, mod, skill: 1 }); const { h, u } = field({ tier, elite, mod, skill: 1 });
@@ -151,9 +151,14 @@ test('S2 铜印 (31 / 32 s): stops attacking; DEF +80 % / +100 %, block +1; ever
const sil = h.hooksOf('statusApplied').filter((c) => c.source === u && c.target === src && c.status === 'silence').slice(-1)[0]; const sil = h.hooksOf('statusApplied').filter((c) => c.source === u && c.target === src && c.status === 'silence').slice(-1)[0];
assert.ok(sil && Math.abs(sil.duration - 3) < 1e-9, `T${tier}: ${src.defId} silenced 3 s`); assert.ok(sil && Math.abs(sil.duration - 3) < 1e-9, `T${tier}: ${src.defId} silenced 3 s`);
} }
// updated on purpose by the community report of 2026-10-06 (item 30): the official inverse_damage[magic] / nian_s_2 fire on
// ON_TAKE_DAMAGE from an enemy source — a non-attack hit is answered too (it returned nothing up to 0.2.0); a 流失 is not
const before = h.hooksOf('damaged').length; const before = h.hooksOf('damaged').length;
h.b.dealDamage(near, u, { amount: 100, type: 'phys' }); h.b.dealDamage(near, u, { amount: 100, type: 'phys' });
assert.ok(!h.hooksOf('damaged').slice(before).some((c) => c.source === u), `T${tier}: a non-attack hit returns nothing`); assert.equal(h.hooksOf('damaged').slice(before).filter((c) => c.source === u && c.target === near).length, 1, `T${tier}: a non-attack hit is answered`);
const beforeLoss = h.hooksOf('damaged').length;
h.b.loseHp(u, 100, { source: near });
assert.ok(!h.hooksOf('damaged').slice(beforeLoss).some((c) => c.source === u), `T${tier}: a 流失 returns nothing`);
u.skill.extend(-999); u.skill.extend(-999);
h.run(0.1); h.run(0.1);
const after = h.hooksOf('damaged').length; const after = h.hooksOf('damaged').length;
+7 -7
View File
@@ -670,20 +670,20 @@
"p1": {"killed":17,"total":17,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":94536,"bossDmg":0,"heal":0,"deaths":3,"layerGains":{"lateranoShip":3}} "p1": {"killed":17,"total":17,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":94536,"bossDmg":0,"heal":0,"deaths":3,"layerGains":{"lateranoShip":3}}
}, },
"units": [ "units": [
["p1",1,"op","chess_char_3_06_a",1,null,3066.32,1,2,0,0,400,0,0,1], ["p1",1,"op","chess_char_3_06_a",1,null,3066.32,1,2,0,450,400,0,0,1],
["p1",2,"op","chess_char_3_05_a",2,null,4697.91,1,4,3,8989,737,0,10,1], ["p1",2,"op","chess_char_3_05_a",2,null,4697.91,1,4,2,8751,737,0,9,1],
["p1",3,"op","chess_char_1_01_a",1,null,223,1,7,2,13909,900,0,35,1], ["p1",3,"op","chess_char_1_01_a",1,null,223,1,7,2,13909,900,0,35,1],
["p1",4,"op","chess_char_2_01_a",1,null,0,0,8,1,7351,1694,0,10,0], ["p1",4,"op","chess_char_2_01_a",1,null,0,0,8,1,7351,1694,0,10,0],
["p1",5,"op","chess_char_3_01_a",2,null,1071.8,1,1,7,6614,400,0,32,1], ["p1",5,"op","chess_char_3_01_a",2,null,1071.8,1,1,8,6403,400,0,32,1],
["p1",6,"op","chess_char_3_08_a",1,null,1194,1,3,0,5328,400,0,6,1], ["p1",6,"op","chess_char_3_08_a",1,null,1194,1,3,0,5328,400,0,6,1],
["p1",7,"op","chess_char_3_09_a",1,null,0,0,5,3,16254,1267,0,21,1], ["p1",7,"op","chess_char_3_09_a",1,null,0,0,5,3,16254,1267,0,21,1],
["p1",8,"op","chess_char_3_10_a",1,null,0,0,6,0,36092,1650,0,15,1] ["p1",8,"op","chess_char_3_10_a",1,null,0,0,6,0,36092,1650,0,15,1]
], ],
"enemies": {"enemy_1267_nhpbr":[11,11,0,4668,57024],"enemy_1267_nhpbr_2":[5,5,0,1141,31680],"enemy_1272_nhtank":[1,1,0,1639,13824]}, "enemies": {"enemy_1267_nhpbr":[11,11,0,4668,57024],"enemy_1267_nhpbr_2":[5,5,0,1141,31680],"enemy_1272_nhtank":[1,1,0,1639,13824]},
"hooks": [1,25,1853,134,134,488,488,0,20,20,7,4,15,7720,0,3,17,0,1,20,1,0,0], "hooks": [1,25,1853,133,133,488,489,0,20,20,7,4,15,7720,0,3,17,0,1,20,1,0,0],
"events": {"atk":174,"deploy":8,"die":20,"dmg":488,"engage":7,"fx":28,"layer":1,"skill":11,"spawn":25,"status":1}, "events": {"atk":173,"deploy":8,"die":20,"dmg":489,"engage":7,"fx":32,"layer":1,"skill":11,"spawn":25,"status":1},
"fx": {"buff":1,"displace":4,"garrison":1,"pull":4,"zone":18}, "fx": {"aoe":4,"buff":1,"displace":4,"garrison":1,"pull":4,"zone":18},
"snaps": "c9571e9b 447301c4 c2a9024c efb0fbd5 235c33ca 49372e4b f842196b" "snaps": "c9571e9b 447301c4 c2a9024c efb0fbd5 235c33ca 426df9e4 5d2597e0"
}, },
"bond-lateranoShip-high": { "bond-lateranoShip-high": {
"about": "拉特兰 high: tier 2 layers 999; chess_char_4_01_b chess_char_5_13_b chess_char_5_14_b chess_char_1_01_b chess_char_2_01_b chess_char_3_01_b chess_char_3_21_b chess_char_4_02_b", "about": "拉特兰 high: tier 2 layers 999; chess_char_4_01_b chess_char_5_13_b chess_char_5_14_b chess_char_1_01_b chess_char_2_01_b chess_char_3_01_b chess_char_3_21_b chess_char_4_02_b",
+9 -9
View File
@@ -2069,28 +2069,28 @@
"bossHpLeft": null, "bossHpLeft": null,
"rngDraws": 0, "rngDraws": 0,
"errors": {"count":0,"kinds":[]}, "errors": {"count":0,"kinds":[]},
"players": {"p1":{"killed":85,"total":99,"perfect":false,"leaks":14,"leaksUncounted":0,"coins":0,"dmg":1118348,"bossDmg":0,"heal":39314,"deaths":11,"layerGains":{}}}, "players": {"p1":{"killed":85,"total":99,"perfect":false,"leaks":14,"leaksUncounted":0,"coins":0,"dmg":1118419,"bossDmg":0,"heal":39314,"deaths":11,"layerGains":{}}},
"units": [ "units": [
["p1",1,"op","chess_char_5_diy1_a",0,null,2592,1,120,0,6323,2592,0,24,0], ["p1",1,"op","chess_char_5_diy1_a",0,null,2592,1,120,0,6323,2592,0,24,0],
["p1",2,"op","chess_char_5_diy2_a",1,null,2592,1,113,1,21971,2592,1520,19,1], ["p1",2,"op","chess_char_5_diy2_a",1,null,2592,1,113,1,21971,2592,1520,19,1],
["p1",3,"op","chess_char_5_diy1_a",2,null,2592,1,111,2,58248,3442,0,36,1], ["p1",3,"op","chess_char_5_diy1_a",2,null,2592,1,111,2,58248,3442,0,36,1],
["p1",4,"op","chess_char_5_diy2_b",0,"none",3228,1,121,12,109351,3228,0,74,1], ["p1",4,"op","chess_char_5_diy2_b",0,"none",3228,1,121,12,109351,3228,0,74,1],
["p1",5,"op","chess_char_5_diy1_b",1,"none",3032.16,1,12,19,263069,21223,23687,95,6], ["p1",5,"op","chess_char_5_diy1_b",1,"none",3032.16,1,12,19,262996,21223,23687,95,6],
["p1",6,"op","chess_char_5_diy2_b",2,"none",732.33,1,93,16,190077,6715,0,82,2], ["p1",6,"op","chess_char_5_diy2_b",2,"none",732.33,1,93,16,190077,6715,0,82,2],
["p1",7,"op","chess_char_5_diy1_b",0,"uniequip_002_hsgma2",27.21,1,75,12,127942,6809,0,83,1], ["p1",7,"op","chess_char_5_diy1_b",0,"uniequip_002_hsgma2",27.21,1,75,12,128015,6809,0,83,1],
["p1",8,"op","chess_char_5_diy2_b",1,"uniequip_002_hsgma2",1,1,3,5,67826,7203,6378,42,4], ["p1",8,"op","chess_char_5_diy2_b",1,"uniequip_002_hsgma2",1,1,3,5,67837,7203,6378,42,4],
["p1",9,"op","chess_char_5_diy1_b",2,"uniequip_002_hsgma2",0,0,5,2,79393,4086,0,44,2], ["p1",9,"op","chess_char_5_diy1_b",2,"uniequip_002_hsgma2",0,0,5,2,79453,4086,0,44,2],
["p1",10,"op","chess_char_6_diy1_a",0,null,0,0,118,0,1484,5185,605,43,0], ["p1",10,"op","chess_char_6_diy1_a",0,null,0,0,118,0,1484,5185,605,43,0],
["p1",11,"op","chess_char_6_diy2_a",1,null,2592,1,119,2,62301,2644,6236,42,2], ["p1",11,"op","chess_char_6_diy2_a",1,null,2592,1,119,2,62301,2644,6236,42,2],
["p1",12,"op","chess_char_6_diy1_a",2,null,0,0,11,14,130362,3304,888,80,2], ["p1",12,"op","chess_char_6_diy1_a",2,null,0,0,11,14,130362,3304,888,80,2],
["-","~1","device","trap_1105_accrate",null,null,100,1,1,0,0,0,0,0,null], ["-","~1","device","trap_1105_accrate",null,null,100,1,1,0,0,0,0,0,null],
["-","~2","device","trap_1105_accrate",null,null,100,1,2,0,0,0,0,0,null] ["-","~2","device","trap_1105_accrate",null,null,100,1,2,0,0,0,0,0,null]
], ],
"enemies": {"enemy_1010_demon":[42,38,4,21593,454505],"enemy_1320_wdrrl_2":[12,6,5,44200,309455],"enemy_1422_lrsldr_2":[45,41,4,3230,354388]}, "enemies": {"enemy_1010_demon":[42,38,4,21593,454505],"enemy_1320_wdrrl_2":[12,6,5,44200,309526],"enemy_1422_lrsldr_2":[45,41,4,3230,354388]},
"hooks": [1,121,6900,1369,1369,2970,2970,1467,96,109,22,20,0,11502,695,97,99,13,1,96,0,0,0], "hooks": [1,121,6900,1369,1369,2973,2973,1467,96,109,22,20,0,11502,695,97,99,13,1,96,0,0,0],
"events": {"atk":1482,"deploy":20,"die":96,"dmg":2756,"engage":12,"fx":893,"heal":574,"leak":13,"skill":42,"spawn":113,"status":264}, "events": {"atk":1482,"deploy":20,"die":96,"dmg":2759,"engage":12,"fx":893,"heal":574,"leak":13,"skill":42,"spawn":113,"status":264},
"fx": {"counter":154,"explode":10,"strike":695,"undying":21,"zone":13}, "fx": {"counter":154,"explode":10,"strike":695,"undying":21,"zone":13},
"snaps": "3178290b a1e79565 3e8d348d 5df93583 8eaac70b 4fd00ffb c91cde31 fe3a467d bc262795 604cd633 bbf789d3 7026fba9 19512d4c 51ebad00 91169fd0 b7c98067 f6a5313f f592cfc9 b78c6faf 3522036e 0ff4b89b dc781b7a c895cf51" "snaps": "3178290b a1e79565 3e8d348d 57d8c0ec 693d384c 31d69b16 e600d9d0 18d1f8ba 6b8f73c6 556d017a e6dbe7c7 a8f52db3 e86e3395 6f0b94e1 5de77001 0f5c8e43 2d22cb67 9d427bb7 b213b370 79e1e980 6dbddd86 d243d612 6b2385d8"
}, },
"diy-052": { "diy-052": {
"about": "6_diy1_b=hsgma2/S1 6_diy2_b=hsgma2/S2 6_diy1_b=hsgma2/S3 6_diy2_b=hsgma2/S1/002_hsgma2 6_diy1_b=hsgma2/S2/002_hsgma2 6_diy2_b=hsgma2/S3/002_hsgma2 5_diy1_a=thumpy/S1 5_diy2_a=thumpy/S2 5_diy1_a=thumpy/S3 5_diy2_b=thumpy/S1 5_diy1_b=thumpy/S2 5_diy2_b=thumpy/S3", "about": "6_diy1_b=hsgma2/S1 6_diy2_b=hsgma2/S2 6_diy1_b=hsgma2/S3 6_diy2_b=hsgma2/S1/002_hsgma2 6_diy1_b=hsgma2/S2/002_hsgma2 6_diy2_b=hsgma2/S3/002_hsgma2 5_diy1_a=thumpy/S1 5_diy2_a=thumpy/S2 5_diy1_a=thumpy/S3 5_diy2_b=thumpy/S1 5_diy1_b=thumpy/S2 5_diy2_b=thumpy/S3",
+55 -55
View File
@@ -193,12 +193,12 @@
"killed": 5, "killed": 5,
"total": 7, "total": 7,
"unspawned": 0, "unspawned": 0,
"bossHpLeft": 2859626, "bossHpLeft": 2859549,
"rngDraws": 58, "rngDraws": 58,
"errors": {"count":0,"kinds":[]}, "errors": {"count":0,"kinds":[]},
"players": {"p1":{"killed":5,"total":7,"perfect":false,"leaks":2,"leaksUncounted":0,"coins":0,"dmg":299098,"bossDmg":134272,"heal":35078,"deaths":3,"layerGains":{}}}, "players": {"p1":{"killed":5,"total":7,"perfect":false,"leaks":2,"leaksUncounted":0,"coins":0,"dmg":299175,"bossDmg":134349,"heal":35078,"deaths":3,"layerGains":{}}},
"units": [ "units": [
["p1",1,"op","chess_char_4_17_b",1,"uniequip_002_hsguma",1986.83,1,18,0,1827,13433,11108,37,0], ["p1",1,"op","chess_char_4_17_b",1,"uniequip_002_hsguma",1986.83,1,18,0,1903,13433,11108,37,0],
["p1",2,"op","chess_char_4_18_b",1,"uniequip_002_mudrok",6104,1,4,0,37730,0,0,35,2], ["p1",2,"op","chess_char_4_18_b",1,"uniequip_002_mudrok",6104,1,4,0,37730,0,0,35,2],
["p1",3,"op","chess_char_4_23_b",2,"uniequip_002_gvial2",2811,1,6,0,16657,4105,2581,25,3], ["p1",3,"op","chess_char_4_23_b",2,"uniequip_002_gvial2",2811,1,6,0,16657,4105,2581,25,3],
["p1",4,"op","chess_char_4_19_b",2,"uniequip_002_flamtl",2118,1,7,1,21419,5053,804,44,5], ["p1",4,"op","chess_char_4_19_b",2,"uniequip_002_flamtl",2118,1,7,1,21419,5053,804,44,5],
@@ -209,11 +209,11 @@
["p1",9,"op","chess_char_4_25_b",2,"uniequip_002_cetsyr",1671,1,3,0,0,0,305,0,3], ["p1",9,"op","chess_char_4_25_b",2,"uniequip_002_cetsyr",1671,1,3,0,0,0,305,0,3],
["p1",10,"op","chess_char_4_26_b",0,"uniequip_002_bldsk",1522,1,5,0,0,1296,18849,34,3] ["p1",10,"op","chess_char_4_26_b",0,"uniequip_002_bldsk",1522,1,5,0,0,1296,18849,34,3]
], ],
"enemies": {"enemy_1249_lysdb_2":[5,5,0,9688,107495],"enemy_1430_lrrook":[2,0,2,0,62729],"enemy_9017_achunt":[1,0,0,20116,140374]}, "enemies": {"enemy_1249_lysdb_2":[5,5,0,9688,107495],"enemy_1430_lrrook":[2,0,2,0,62729],"enemy_9017_achunt":[1,0,0,20116,140451]},
"hooks": [1,21,6000,385,385,1023,1424,4394,8,10,26,25,0,13111,66,5,8,2,1,11,0,3,1], "hooks": [1,21,6000,385,385,1025,1426,4394,8,10,26,25,0,13111,66,5,8,2,1,11,0,3,1],
"events": {"atk":403,"deploy":13,"die":8,"dmg":1420,"engage":7,"fx":263,"heal":40,"leak":2,"skill":54,"spawn":18,"status":411}, "events": {"atk":403,"deploy":13,"die":8,"dmg":1422,"engage":7,"fx":265,"heal":40,"leak":2,"skill":54,"spawn":18,"status":411},
"fx": {"bandage":3,"block":3,"burst":3,"charge":7,"dodge":1,"featherArrow":1,"flame":5,"garrisonGrant":1,"healField":1,"jungleSoul":3,"mote":102,"redistribute":45,"reweave":3,"riposte":1,"rockslide":2,"sandChains":3,"sandChainsCharged":2,"shieldBreak":9,"slash":55,"spGift":5,"thorns":5,"truesilver":3}, "fx": {"bandage":3,"block":3,"burst":3,"charge":7,"dodge":1,"featherArrow":1,"flame":5,"garrisonGrant":1,"healField":1,"jungleSoul":3,"mote":102,"redistribute":45,"reweave":3,"riposte":1,"rockslide":2,"sandChains":3,"sandChainsCharged":2,"shieldBreak":9,"slash":55,"spGift":5,"thorns":7,"truesilver":3},
"snaps": "cfcfbf4d 2e36f4c4 d86de811 0291110d a7bef78a 57650c6e 1788104a a346a2f4 ac587ca9 03b1a538 d546b910 cb6e362b 1d445bed 6fb308e1 46e3cb1a 26076bc9 1f093b66 58befce9 abcdba0e 4123d12c" "snaps": "cfcfbf4d 2e36f4c4 d86de811 0291110d 4f29388b e434804a d530cfc9 d89605a6 4a75903e ddfff266 80cd13ba 850aef17 c3b00acb 56dc7d74 bd189bf7 7feda4fd 3278f83b a5ac2ad0 e0909387 8bd04ac0"
}, },
"boss-boss_3-pair": { "boss-boss_3-pair": {
"about": "假想敌:管 pair pool 4000000: chess_char_6_03_b chess_char_6_06_b chess_char_6_07_b chess_char_6_01_b chess_char_6_02_b chess_char_6_04_b chess_char_6_05_b chess_char_6_08_b chess_char_6_09_b chess_char_6_11_b token_10017_skadi2_dedant | chess_char_6_15_b chess_char_6_19_b chess_char_5_01_b chess_char_6_17_b chess_char_6_12_b chess_char_6_13_b chess_char_6_14_b chess_char_6_16_b chess_char_6_18_b chess_char_6_20_b", "about": "假想敌:管 pair pool 4000000: chess_char_6_03_b chess_char_6_06_b chess_char_6_07_b chess_char_6_01_b chess_char_6_02_b chess_char_6_04_b chess_char_6_05_b chess_char_6_08_b chess_char_6_09_b chess_char_6_11_b token_10017_skadi2_dedant | chess_char_6_15_b chess_char_6_19_b chess_char_5_01_b chess_char_6_17_b chess_char_6_12_b chess_char_6_13_b chess_char_6_14_b chess_char_6_16_b chess_char_6_18_b chess_char_6_20_b",
@@ -393,15 +393,15 @@
"killed": 9, "killed": 9,
"total": 14, "total": 14,
"unspawned": 0, "unspawned": 0,
"bossHpLeft": 7601883, "bossHpLeft": 7601606,
"rngDraws": 496, "rngDraws": 496,
"errors": {"count":0,"kinds":[]}, "errors": {"count":0,"kinds":[]},
"players": { "players": {
"p1": {"killed":9,"total":14,"perfect":false,"leaks":3,"leaksUncounted":0,"coins":0,"dmg":832066,"bossDmg":272991,"heal":24644,"deaths":21,"layerGains":{}}, "p1": {"killed":9,"total":14,"perfect":false,"leaks":3,"leaksUncounted":0,"coins":0,"dmg":832342,"bossDmg":273268,"heal":24644,"deaths":21,"layerGains":{}},
"p2": {"killed":0,"total":0,"perfect":false,"leaks":2,"leaksUncounted":0,"coins":0,"dmg":815098,"bossDmg":525125,"heal":3151,"deaths":24,"layerGains":{}} "p2": {"killed":0,"total":0,"perfect":false,"leaks":2,"leaksUncounted":0,"coins":0,"dmg":815098,"bossDmg":525125,"heal":3151,"deaths":24,"layerGains":{}}
}, },
"units": [ "units": [
["p1",1,"op","chess_char_5_19_b",2,"uniequip_002_mlynar",0,0,51,3,138264,7838,24,22,1], ["p1",1,"op","chess_char_5_19_b",2,"uniequip_002_mlynar",0,0,51,3,138541,7838,24,22,1],
["p1",2,"op","chess_char_4_01_b",2,"uniequip_002_rmixer",0,0,5,0,16815,6179,893,10,1], ["p1",2,"op","chess_char_4_01_b",2,"uniequip_002_rmixer",0,0,5,0,16815,6179,893,10,1],
["p1",3,"op","chess_char_5_14_b",1,"none",0,0,62,0,49407,10951,912,3,8], ["p1",3,"op","chess_char_5_14_b",1,"none",0,0,62,0,49407,10951,912,3,8],
["p1",4,"op","chess_char_5_17_b",1,"uniequip_002_f12yin",0,0,59,0,4545,12126,187,2,1], ["p1",4,"op","chess_char_5_17_b",1,"uniequip_002_f12yin",0,0,59,0,4545,12126,187,2,1],
@@ -424,9 +424,9 @@
["p2",21,"token","token_10041_cathy_catsld",null,null,100,1,21,0,0,0,0,0,null], ["p2",21,"token","token_10041_cathy_catsld",null,null,100,1,21,0,0,0,0,0,null],
["p2",22,"token","token_10041_cathy_catsld",null,null,100,1,22,0,0,0,0,0,null] ["p2",22,"token","token_10041_cathy_catsld",null,null,100,1,22,0,0,0,0,0,null]
], ],
"enemies": {"enemy_1010_demon":[4,4,0,1913,200612],"enemy_1438_dspred":[10,5,5,22724,648434],"enemy_1521_dslily":[1,0,0,93299,798117]}, "enemies": {"enemy_1010_demon":[4,4,0,1913,200612],"enemy_1438_dspred":[10,5,5,22724,648434],"enemy_1521_dslily":[1,0,0,93299,798394]},
"hooks": [1,66,6000,1002,1068,2527,2646,4783,54,61,108,107,10,27478,1110,16,15,5,1,57,0,24,2], "hooks": [1,66,6000,1002,1068,2528,2647,4783,54,61,108,107,10,27478,1110,16,15,5,1,57,0,24,2],
"events": {"atk":1226,"deploy":51,"die":56,"dmg":2639,"engage":17,"fx":653,"heal":160,"leak":5,"skill":215,"spawn":37,"status":755}, "events": {"atk":1226,"deploy":51,"die":56,"dmg":2640,"engage":17,"fx":653,"heal":160,"leak":5,"skill":215,"spawn":37,"status":755},
"fx": { "fx": {
"aoe": 21, "aoe": 21,
"appear": 9, "appear": 9,
@@ -464,7 +464,7 @@
"weightless": 4, "weightless": 4,
"zone": 230 "zone": 230
}, },
"snaps": "9d889e0e f29df90d 7a4bf6fc 19fe1302 bbe35359 e3aae426 3f978616 3d9f6e1d dcc49f9b e2e26bac eaf0159e 0d0a2271 04949e73 baad20e5 dca9ced6 a4351d0b b4846197 afc80a44 a6e80893 96d194a3" "snaps": "9d889e0e f29df90d 7a4bf6fc 19fe1302 f02b38cf 1043fb86 f6c0e4b0 3f6edb60 1d12afb7 e637500a db80ed0c 3cead573 35c6b311 0b15df1a 28462491 e9ff6747 4e0ef05e fc5ac3ae fb26886b e2eae1b8"
}, },
"boss-boss_4-solo": { "boss-boss_4-solo": {
"about": "盐风主教昆图斯 solo pool 4200000: chess_char_4_17_b chess_char_4_18_b chess_char_4_23_b chess_char_4_19_b chess_char_4_22_b chess_char_4_20_b chess_char_4_21_b chess_char_4_24_b chess_char_4_25_b chess_char_4_26_b", "about": "盐风主教昆图斯 solo pool 4200000: chess_char_4_17_b chess_char_4_18_b chess_char_4_23_b chess_char_4_19_b chess_char_4_22_b chess_char_4_20_b chess_char_4_21_b chess_char_4_24_b chess_char_4_25_b chess_char_4_26_b",
@@ -481,12 +481,12 @@
"killed": 3, "killed": 3,
"total": 7, "total": 7,
"unspawned": 0, "unspawned": 0,
"bossHpLeft": 3784802, "bossHpLeft": 3782696,
"rngDraws": 93, "rngDraws": 93,
"errors": {"count":0,"kinds":[]}, "errors": {"count":0,"kinds":[]},
"players": {"p1":{"killed":3,"total":7,"perfect":false,"leaks":4,"leaksUncounted":0,"coins":0,"dmg":684711,"bossDmg":415198,"heal":102513,"deaths":4,"layerGains":{}}}, "players": {"p1":{"killed":3,"total":7,"perfect":false,"leaks":4,"leaksUncounted":0,"coins":0,"dmg":686816,"bossDmg":417304,"heal":102513,"deaths":4,"layerGains":{}}},
"units": [ "units": [
["p1",1,"op","chess_char_4_17_b",1,"uniequip_002_hsguma",2960.13,1,4,0,24792,17230,20988,31,0], ["p1",1,"op","chess_char_4_17_b",1,"uniequip_002_hsguma",2960.13,1,4,0,26897,17230,20988,31,0],
["p1",2,"op","chess_char_4_18_b",1,"uniequip_002_mudrok",5988.52,1,22,1,44133,24266,18046,14,7], ["p1",2,"op","chess_char_4_18_b",1,"uniequip_002_mudrok",5988.52,1,22,1,44133,24266,18046,14,7],
["p1",3,"op","chess_char_4_23_b",2,"uniequip_002_gvial2",2811,1,21,2,195258,38908,13125,40,1], ["p1",3,"op","chess_char_4_23_b",2,"uniequip_002_gvial2",2811,1,21,2,195258,38908,13125,40,1],
["p1",4,"op","chess_char_4_19_b",2,"uniequip_002_flamtl",3388.8,1,9,0,0,5388,0,0,0], ["p1",4,"op","chess_char_4_19_b",2,"uniequip_002_flamtl",3388.8,1,9,0,0,5388,0,0,0],
@@ -499,11 +499,11 @@
["-","~1","device","trap_1105_accrate",null,null,100,1,1,0,0,0,0,0,null], ["-","~1","device","trap_1105_accrate",null,null,100,1,1,0,0,0,0,0,null],
["-","~2","device","trap_1105_accrate",null,null,100,1,2,0,0,0,0,0,null] ["-","~2","device","trap_1105_accrate",null,null,100,1,2,0,0,0,0,0,null]
], ],
"enemies": {"enemy_1010_demon_2":[2,2,0,6788,107495],"enemy_1438_dspred":[5,1,4,35508,162017],"enemy_1521_dslily":[1,0,0,69173,415198]}, "enemies": {"enemy_1010_demon_2":[2,2,0,6788,107495],"enemy_1438_dspred":[5,1,4,35508,162017],"enemy_1521_dslily":[1,0,0,69173,417304]},
"hooks": [1,23,6000,585,585,998,1144,8285,7,11,30,30,0,13584,137,13,8,4,1,7,0,31,0], "hooks": [1,23,6000,585,585,1005,1151,8285,7,11,30,30,0,13584,137,13,8,4,1,7,0,31,0],
"events": {"atk":794,"deploy":13,"die":7,"dmg":1126,"engage":6,"fx":343,"heal":107,"leak":4,"skill":62,"spawn":20,"status":525}, "events": {"atk":794,"deploy":13,"die":7,"dmg":1133,"engage":6,"fx":350,"heal":107,"leak":4,"skill":62,"spawn":20,"status":525},
"fx": {"bandage":4,"block":19,"burst":31,"camouflage":1,"featherArrow":5,"garrisonGrant":1,"grow":1,"healField":2,"jungleSoul":1,"mote":68,"redistribute":45,"reweave":3,"rockfall":18,"rockslide":7,"sandChains":5,"shieldBreak":18,"slash":46,"spGift":3,"tentacle":6,"thorns":51,"tide":5,"truesilver":3}, "fx": {"bandage":4,"block":19,"burst":31,"camouflage":1,"featherArrow":5,"garrisonGrant":1,"grow":1,"healField":2,"jungleSoul":1,"mote":68,"redistribute":45,"reweave":3,"rockfall":18,"rockslide":7,"sandChains":5,"shieldBreak":18,"slash":46,"spGift":3,"tentacle":6,"thorns":58,"tide":5,"truesilver":3},
"snaps": "501b4dd4 877a4d48 68f61133 0c4f2d25 66d31d7d 2f1febdd 16d86817 be1ddbe8 895b5c6a ce7ab97a 2c2c9cff e0efdfa3 98ac6cb8 133c9069 5d797196 35eb846a 463c1d7b 0485eea7 2025f7bd a77ca075" "snaps": "501b4dd4 877a4d48 68f61133 a14c3141 7de19e3d 43935a2d 5e496d64 5114c159 873c19da e4c0f03d 378dbfbd 9372ab33 7c8921ba 1cba8560 7342781f 4e42938d c1a0ccea e8e4755b 44327e56 1337e35b"
}, },
"boss-boss_5-pair": { "boss-boss_5-pair": {
"about": "卢西恩,“猩红血钻” pair pool 1560000: chess_char_6_03_b chess_char_6_06_b chess_char_6_07_b chess_char_6_01_b chess_char_6_02_b chess_char_6_04_b chess_char_6_05_b chess_char_6_08_b chess_char_6_09_b chess_char_6_11_b token_10017_skadi2_dedant token_10030_mlyss_wtrman | chess_char_6_15_b chess_char_6_19_b chess_char_5_01_b chess_char_6_17_b chess_char_6_12_b chess_char_6_13_b chess_char_6_14_b chess_char_6_16_b chess_char_6_18_b chess_char_6_20_b", "about": "卢西恩,“猩红血钻” pair pool 1560000: chess_char_6_03_b chess_char_6_06_b chess_char_6_07_b chess_char_6_01_b chess_char_6_02_b chess_char_6_04_b chess_char_6_05_b chess_char_6_08_b chess_char_6_09_b chess_char_6_11_b token_10017_skadi2_dedant token_10030_mlyss_wtrman | chess_char_6_15_b chess_char_6_19_b chess_char_5_01_b chess_char_6_17_b chess_char_6_12_b chess_char_6_13_b chess_char_6_14_b chess_char_6_16_b chess_char_6_18_b chess_char_6_20_b",
@@ -928,53 +928,53 @@
"killed": 13, "killed": 13,
"total": 18, "total": 18,
"unspawned": 0, "unspawned": 0,
"bossHpLeft": 12749411, "bossHpLeft": 12750934,
"rngDraws": 469, "rngDraws": 469,
"errors": {"count":0,"kinds":[]}, "errors": {"count":0,"kinds":[]},
"players": { "players": {
"p1": {"killed":13,"total":18,"perfect":false,"leaks":2,"leaksUncounted":0,"coins":0,"dmg":1782144,"bossDmg":862264,"heal":34974,"deaths":19,"layerGains":{}}, "p1": {"killed":13,"total":18,"perfect":false,"leaks":2,"leaksUncounted":0,"coins":0,"dmg":1787115,"bossDmg":862264,"heal":35986,"deaths":19,"layerGains":{}},
"p2": {"killed":0,"total":0,"perfect":false,"leaks":2,"leaksUncounted":0,"coins":0,"dmg":1063494,"bossDmg":787168,"heal":3526,"deaths":23,"layerGains":{}} "p2": {"killed":0,"total":0,"perfect":false,"leaks":2,"leaksUncounted":0,"coins":0,"dmg":1052836,"bossDmg":786217,"heal":3389,"deaths":23,"layerGains":{}}
}, },
"units": [ "units": [
["p1",1,"op","chess_char_5_19_b",2,"uniequip_002_mlynar",0,0,73,2,70060,30258,344,15,1], ["p1",1,"op","chess_char_5_19_b",2,"uniequip_002_mlynar",0,0,73,2,75031,30258,344,15,1],
["p1",2,"op","chess_char_4_01_b",2,"uniequip_002_rmixer",5411.15,1,78,0,6068,12135,463,20,2], ["p1",2,"op","chess_char_4_01_b",2,"uniequip_002_rmixer",5411.15,1,78,0,6068,12135,463,20,2],
["p1",3,"op","chess_char_5_14_b",1,"none",0,0,82,0,47436,18275,3606,26,11], ["p1",3,"op","chess_char_5_14_b",1,"none",0,0,82,0,47436,18275,3606,26,11],
["p1",4,"op","chess_char_5_17_b",1,"uniequip_002_f12yin",5476,1,88,0,43232,18483,434,21,3], ["p1",4,"op","chess_char_5_17_b",1,"uniequip_002_f12yin",5476,1,88,0,43232,18483,434,21,3],
["p1",5,"op","chess_char_5_15_b",1,"uniequip_002_thorn2",161.56,1,79,2,719512,4898,9898,98,11], ["p1",5,"op","chess_char_5_15_b",1,"uniequip_002_thorn2",161.56,1,79,2,719512,4898,9898,98,11],
["p1",6,"op","chess_char_5_20_b",2,"uniequip_002_aglina",2764,1,93,1,69538,10605,41,18,2], ["p1",6,"op","chess_char_5_20_b",2,"uniequip_002_aglina",2764,1,94,1,69538,11617,41,18,2],
["p1",7,"op","chess_char_5_21_b",1,"uniequip_002_sntlla",2053.18,1,83,1,288400,7730,9,2,1], ["p1",7,"op","chess_char_5_21_b",1,"uniequip_002_sntlla",2053.18,1,83,1,288400,7730,9,2,1],
["p1",8,"op","chess_char_5_22_b",1,"uniequip_002_nymph",1084.8,1,72,1,524208,5369,9,40,13], ["p1",8,"op","chess_char_5_22_b",1,"uniequip_002_nymph",1084.8,1,72,1,524208,5369,9,40,13],
["p1",9,"op","chess_char_5_23_b",1,"uniequip_002_reckpr",3220,1,90,0,0,11772,20169,18,2], ["p1",9,"op","chess_char_5_23_b",1,"uniequip_002_reckpr",3220,1,91,0,0,11772,21181,19,3],
["p1",10,"op","chess_char_4_02_b",2,"uniequip_002_mostma",0,0,80,1,13692,10170,0,9,1], ["p1",10,"op","chess_char_4_02_b",2,"uniequip_002_mostma",0,0,80,1,13692,10170,0,9,1],
["p2",11,"op","chess_char_4_11_b",1,"uniequip_002_cathy",0,0,75,0,0,7525,137,0,2], ["p2",11,"op","chess_char_4_11_b",1,"uniequip_002_cathy",0,0,75,0,0,6513,137,0,1],
["p2",12,"op","chess_char_4_04_b",1,"uniequip_002_ines",2149,1,84,2,27393,10756,5,74,5], ["p2",12,"op","chess_char_4_04_b",1,"uniequip_002_ines",2149,1,84,2,27393,10756,5,74,5],
["p2",13,"op","chess_char_4_07_b",1,"uniequip_002_bpipe",4170.25,1,92,1,15991,9948,1608,6,3], ["p2",13,"op","chess_char_4_07_b",1,"uniequip_002_bpipe",4165.58,1,92,1,15991,9958,1613,6,3],
["p2",14,"op","chess_char_4_16_b",2,"uniequip_002_texas2",1619,1,87,0,78679,12401,119,22,8], ["p2",14,"op","chess_char_4_16_b",2,"uniequip_002_texas2",1004.13,1,87,0,78679,13018,121,22,8],
["p2",15,"op","chess_char_4_09_b",1,"uniequip_002_mizuki",0,0,67,0,126046,8396,309,30,3], ["p2",15,"op","chess_char_4_09_b",1,"uniequip_002_mizuki",0,0,67,0,126046,8396,309,30,3],
["p2",16,"op","chess_char_4_06_b",1,"uniequip_002_kroos2",0,0,71,1,301353,3122,0,77,1], ["p2",16,"op","chess_char_4_06_b",1,"uniequip_002_kroos2",0,0,71,1,301353,3122,0,77,1],
["p2",17,"op","chess_char_4_10_b",1,"uniequip_002_aroma",0,0,20,0,52829,6922,264,53,2], ["p2",17,"op","chess_char_4_10_b",1,"uniequip_002_aroma",0,0,20,0,52829,6922,264,53,2],
["p2",18,"op","chess_char_4_12_b",2,"uniequip_002_glady",2232,1,86,0,42669,2582,350,30,3], ["p2",18,"op","chess_char_4_12_b",2,"uniequip_002_glady",2232,1,86,0,40736,2632,400,25,3],
["p2",19,"op","chess_char_4_13_b",1,"uniequip_002_gnosis",0,0,63,2,356112,4467,489,68,20], ["p2",19,"op","chess_char_4_13_b",1,"uniequip_002_gnosis",0,0,63,2,347386,4272,294,61,18],
["p2",20,"op","chess_char_4_14_b",1,"uniequip_002_lionhd",0,0,64,1,62422,3497,245,25,4], ["p2",20,"op","chess_char_4_14_b",1,"uniequip_002_lionhd",0,0,64,1,62422,3497,245,25,4],
["p2",21,"token","token_10041_cathy_catsld",null,null,100,1,21,0,0,0,0,0,null], ["p2",21,"token","token_10041_cathy_catsld",null,null,100,1,21,0,0,0,0,0,null],
["p2",22,"token","token_10041_cathy_catsld",null,null,100,1,22,0,0,0,0,0,null] ["p2",22,"token","token_10041_cathy_catsld",null,null,100,1,22,0,0,0,0,0,null]
], ],
"enemies": { "enemies": {
"enemy_10027_vtsk": [6,1,4,138886,892170], "enemy_10027_vtsk": [6,1,4,137679,887524],
"enemy_1005_yokai": [4,4,0,0,1600], "enemy_1005_yokai": [4,4,0,0,1600],
"enemy_1229_darmy_2": [8,8,0,3486,294231], "enemy_1229_darmy_2": [8,8,0,3486,294231],
"enemy_9013_acstmk_2": [1,0,0,45577,1650589], "enemy_9013_acstmk_2": [1,0,0,45637,1649066],
"enemy_9014_acstma": [5,4,0,2385,30898], "enemy_9014_acstma": [5,4,0,2385,29767],
"enemy_9015_acstmb": [2,1,0,8977,5739], "enemy_9015_acstmb": [3,2,0,10607,5347],
"enemy_9016_acstmr": [8,7,0,0,41] "enemy_9016_acstmr": [8,7,0,0,41]
}, },
"hooks": [1,91,6000,753,753,2602,2727,3433,67,73,98,95,6,20855,903,13,34,4,1,71,0,4,11], "hooks": [1,92,6000,743,743,2583,2689,3370,68,74,96,92,6,20650,847,13,35,4,1,71,0,4,11],
"events": {"atk":855,"deploy":57,"die":69,"dmg":2724,"engage":17,"fx":566,"heal":95,"leak":4,"skill":193,"spawn":56,"status":571}, "events": {"atk":846,"deploy":57,"die":70,"dmg":2686,"engage":17,"fx":564,"heal":96,"leak":4,"skill":188,"spawn":57,"status":548},
"fx": { "fx": {
"aoe": 37, "aoe": 37,
"appear": 8, "appear": 8,
"beam": 48, "beam": 48,
"blink": 13, "blink": 14,
"burst": 4, "burst": 4,
"charge": 9, "charge": 9,
"counter": 6, "counter": 6,
@@ -982,12 +982,12 @@
"dilemma": 3, "dilemma": 3,
"disappear": 8, "disappear": 8,
"dodge": 11, "dodge": 11,
"explode": 6, "explode": 8,
"explosion": 4, "explosion": 4,
"frostNova": 20, "frostNova": 18,
"iceSpike": 2, "iceSpike": 2,
"overclock": 2, "overclock": 1,
"phase": 3, "phase": 1,
"pull": 2, "pull": 2,
"quadShot": 1, "quadShot": 1,
"revive": 2, "revive": 2,
@@ -1010,7 +1010,7 @@
"weightless": 2, "weightless": 2,
"zone": 184 "zone": 184
}, },
"snaps": "1b4d1c90 5e89ae3a 18b0277b 718ea4d9 fb14ee3f 2c5d7b5a 90a9e918 535d6535 ff46bb00 d6a87ebe a53bce20 63043c57 e1656d7b 7fb55cb8 8d7c7ef0 ced6863b 72e4c7b9 574e2998 fcaf465c 0ac59845" "snaps": "1b4d1c90 77ce88df 3b79b01e b459b9fc f1675c08 e80328a4 a83f0016 2753b454 294c4add eb8695c0 9b1bc8a1 4832e0f2 4f466939 23ce7f0c 7f59ea9a f124af52 4fa7d310 e3bd0452 461dc8e9 2f6a9acd"
}, },
"hidden-boss_8-solo": { "hidden-boss_8-solo": {
"about": "假想敌:胄 solo pool 7200000: chess_char_4_17_b chess_char_4_18_b chess_char_4_23_b chess_char_4_19_b chess_char_4_22_b chess_char_4_20_b chess_char_4_21_b chess_char_4_24_b chess_char_4_25_b chess_char_4_26_b", "about": "假想敌:胄 solo pool 7200000: chess_char_4_17_b chess_char_4_18_b chess_char_4_23_b chess_char_4_19_b chess_char_4_22_b chess_char_4_20_b chess_char_4_21_b chess_char_4_24_b chess_char_4_25_b chess_char_4_26_b",
@@ -1027,12 +1027,12 @@
"killed": 6, "killed": 6,
"total": 16, "total": 16,
"unspawned": 0, "unspawned": 0,
"bossHpLeft": 6810440, "bossHpLeft": 6810274,
"rngDraws": 230, "rngDraws": 230,
"errors": {"count":0,"kinds":[]}, "errors": {"count":0,"kinds":[]},
"players": {"p1":{"killed":6,"total":16,"perfect":false,"leaks":10,"leaksUncounted":0,"coins":0,"dmg":430027,"bossDmg":389560,"heal":30839,"deaths":21,"layerGains":{}}}, "players": {"p1":{"killed":6,"total":16,"perfect":false,"leaks":10,"leaksUncounted":0,"coins":0,"dmg":430335,"bossDmg":389726,"heal":30839,"deaths":21,"layerGains":{}}},
"units": [ "units": [
["p1",1,"op","chess_char_4_17_b",1,"uniequip_002_hsguma",0,0,6,1,366,8626,0,14,0], ["p1",1,"op","chess_char_4_17_b",1,"uniequip_002_hsguma",0,0,6,1,673,8626,0,14,0],
["p1",2,"op","chess_char_4_18_b",1,"uniequip_002_mudrok",0,0,36,3,17870,18617,6409,9,6], ["p1",2,"op","chess_char_4_18_b",1,"uniequip_002_mudrok",0,0,36,3,17870,18617,6409,9,6],
["p1",3,"op","chess_char_4_23_b",2,"uniequip_002_gvial2",0,0,7,0,0,2811,0,0,0], ["p1",3,"op","chess_char_4_23_b",2,"uniequip_002_gvial2",0,0,7,0,0,2811,0,0,0],
["p1",4,"op","chess_char_4_19_b",2,"uniequip_002_flamtl",0,0,53,0,0,12061,0,0,0], ["p1",4,"op","chess_char_4_19_b",2,"uniequip_002_flamtl",0,0,53,0,0,12061,0,0,0],
@@ -1048,19 +1048,19 @@
["-","~4","device","trap_1105_accrate",null,null,100,1,4,0,0,0,0,0,null] ["-","~4","device","trap_1105_accrate",null,null,100,1,4,0,0,0,0,0,null]
], ],
"enemies": { "enemies": {
"enemy_10027_vtsk": [3,0,3,31231,18110], "enemy_10027_vtsk": [3,0,3,31231,18252],
"enemy_1005_yokai": [4,2,2,0,800], "enemy_1005_yokai": [4,2,2,0,800],
"enemy_1197_sfshu": [3,2,1,80,19661], "enemy_1197_sfshu": [3,2,1,80,19661],
"enemy_1198_msfshu": [6,2,4,0,9], "enemy_1198_msfshu": [6,2,4,0,9],
"enemy_9013_acstmk_2": [1,0,0,38158,389560], "enemy_9013_acstmk_2": [1,0,0,38158,389726],
"enemy_9014_acstma": [3,2,0,0,1865], "enemy_9014_acstma": [3,2,0,0,1865],
"enemy_9015_acstmb": [4,3,0,4799,0], "enemy_9015_acstmb": [4,3,0,4799,0],
"enemy_9016_acstmr": [6,6,0,0,22] "enemy_9016_acstmr": [6,6,0,0,22]
}, },
"hooks": [1,56,6000,313,313,552,552,869,38,48,16,16,0,5467,46,4,30,10,1,32,0,0,0], "hooks": [1,56,6000,313,313,565,565,869,38,48,16,16,0,5467,46,4,30,10,1,32,0,0,0],
"events": {"atk":365,"deploy":22,"die":38,"dmg":545,"engage":5,"fx":181,"heal":79,"leak":10,"skill":33,"spawn":44,"status":141}, "events": {"atk":365,"deploy":22,"die":38,"dmg":558,"engage":5,"fx":194,"heal":79,"leak":10,"skill":33,"spawn":44,"status":141},
"fx": {"bandage":1,"beam":33,"blink":11,"block":8,"charge":6,"explode":9,"garrisonGrant":1,"healField":4,"mote":4,"redistribute":5,"reweave":1,"rockslide":6,"sandChains":1,"shell":6,"shieldBreak":7,"slash":57,"spGift":5,"summon":6,"telegraph":3,"thorns":4,"truesilver":3}, "fx": {"bandage":1,"beam":33,"blink":11,"block":8,"charge":6,"explode":9,"garrisonGrant":1,"healField":4,"mote":4,"redistribute":5,"reweave":1,"rockslide":6,"sandChains":1,"shell":6,"shieldBreak":7,"slash":57,"spGift":5,"summon":6,"telegraph":3,"thorns":17,"truesilver":3},
"snaps": "c4c16f4a ddad744b 0ec6d0a5 6cb40df0 b236a93e cb798820 ca99623b cba70a39 80d89436 d2c74f1b fc6586fc acf0d6cf 27a8ebae 816ae142 dae36003 48c83f46 040cf0ab f675868b bf456a17 84add322" "snaps": "c4c16f4a e0f36869 c8e410ce 7b59826b 31eb0f33 df2f84b5 c35f8fe9 05bd5883 08426b21 63c36146 97833e0e e6aa0e4d b1857582 0aaabec8 0bbeefa0 3205278b 4f41f8a5 c2d70b82 b6c40c16 ebd2bc44"
}, },
"hidden-boss_9-pair": { "hidden-boss_9-pair": {
"about": "假想敌:铳 pair pool 5600000: chess_char_6_03_b chess_char_6_06_b chess_char_6_07_b chess_char_6_01_b chess_char_6_02_b chess_char_6_04_b chess_char_6_05_b chess_char_6_08_b chess_char_6_09_b chess_char_6_11_b token_10017_skadi2_dedant token_10030_mlyss_wtrman | chess_char_6_15_b chess_char_6_19_b chess_char_5_01_b chess_char_6_17_b chess_char_6_12_b chess_char_6_13_b chess_char_6_14_b chess_char_6_16_b chess_char_6_18_b chess_char_6_20_b", "about": "假想敌:铳 pair pool 5600000: chess_char_6_03_b chess_char_6_06_b chess_char_6_07_b chess_char_6_01_b chess_char_6_02_b chess_char_6_04_b chess_char_6_05_b chess_char_6_08_b chess_char_6_09_b chess_char_6_11_b token_10017_skadi2_dedant token_10030_mlyss_wtrman | chess_char_6_15_b chess_char_6_19_b chess_char_5_01_b chess_char_6_17_b chess_char_6_12_b chess_char_6_13_b chess_char_6_14_b chess_char_6_16_b chess_char_6_18_b chess_char_6_20_b",
+9 -9
View File
@@ -16,7 +16,7 @@
"combat": "client", "combat": "client",
"boost": null, "boost": null,
"setup": {"stageId":"act1autochess_m01","bossId":"boss_5","hiddenBossId":null,"factions":["TIMES","DOT","INVISIBLE"]}, "setup": {"stageId":"act1autochess_m01","bossId":"boss_5","hiddenBossId":null,"factions":["TIMES","DOT","INVISIBLE"]},
"end": {"victory":true,"roundsPassed":9,"hiddenReached":false,"hiddenCleared":false,"reason":"victory","teamLp":21,"bossPoolLeft":0,"virtualMs":68100}, "end": {"victory":true,"roundsPassed":9,"hiddenReached":false,"hiddenCleared":false,"reason":"victory","teamLp":25,"bossPoolLeft":0,"virtualMs":68100},
"rng": {"setup":16,"shop":142,"waves":0,"draft":0,"bots":5205,"meta":0}, "rng": {"setup":16,"shop":142,"waves":0,"draft":0,"bots":5205,"meta":0},
"errors": {"engine":0,"logged":0,"sim":0,"dispatcher":0}, "errors": {"engine":0,"logged":0,"sim":0,"dispatcher":0},
"rounds": [ "rounds": [
@@ -35,12 +35,12 @@
"victory": true, "victory": true,
"roundsPassed": 9, "roundsPassed": 9,
"eliminatedRound": null, "eliminatedRound": null,
"lp": 21, "lp": 25,
"bandId": "band_ermengard", "bandId": "band_ermengard",
"title": {"id":"comment_1","name":"卫戍之星","picId":"comment_icon_1","text":"对敌方领袖造成伤害最高(仅胜利时)"}, "title": {"id":"comment_1","name":"卫戍之星","picId":"comment_icon_1","text":"对敌方领袖造成伤害最高(仅胜利时)"},
"trophies": 0, "trophies": 0,
"reward": 113, "reward": 113,
"stats": {"activatedLayers":78,"bossDamage":200000,"dmgDealt":841708,"gold":72,"itemsEquipped":10,"kills":175,"leaks":0,"lpLost":0,"merges":2,"perfectRounds":8,"refreshes":14}, "stats": {"activatedLayers":78,"bossDamage":200000,"dmgDealt":831708,"gold":72,"itemsEquipped":10,"kills":174,"leaks":0,"lpLost":0,"merges":2,"perfectRounds":8,"refreshes":14},
"lineup": ["4_14_a@12,7","2_08_a@12,8[4_05_e_a+2_04_e_b]","2_14_a@11,8","3_10_a@10,3","2_17_a@10,4[1_01_e_b+4_02_e_a]","4_01_b@10,7","1_12_b@10,8[3_05_e_a+5_02_e_a]","5_02_a@9,8[4_08_e_a]"], "lineup": ["4_14_a@12,7","2_08_a@12,8[4_05_e_a+2_04_e_b]","2_14_a@11,8","3_10_a@10,3","2_17_a@10,4[1_01_e_b+4_02_e_a]","4_01_b@10,7","1_12_b@10,8[3_05_e_a+5_02_e_a]","5_02_a@9,8[4_08_e_a]"],
"bonds": ["deputShip 0/16","emptyShip 1/0","indomShip 0/7","preciShip 1/7","sargonShip 1/28","steadShip 2/38","swiftShip 1/5"] "bonds": ["deputShip 0/16","emptyShip 1/0","indomShip 0/7","preciShip 1/7","sargonShip 1/28","steadShip 2/38","swiftShip 1/5"]
} }
@@ -56,7 +56,7 @@
"combat": "client", "combat": "client",
"boost": null, "boost": null,
"setup": {"stageId":"act1autochess_m01","bossId":"boss_5","hiddenBossId":null,"factions":["ELEMENT","DOT","REFLECTION"]}, "setup": {"stageId":"act1autochess_m01","bossId":"boss_5","hiddenBossId":null,"factions":["ELEMENT","DOT","REFLECTION"]},
"end": {"victory":false,"roundsPassed":8,"hiddenReached":false,"hiddenCleared":false,"reason":"defeat","teamLp":0,"bossPoolLeft":124751,"virtualMs":68100}, "end": {"victory":false,"roundsPassed":8,"hiddenReached":false,"hiddenCleared":false,"reason":"defeat","teamLp":0,"bossPoolLeft":124331,"virtualMs":68100},
"rng": {"setup":16,"shop":123,"waves":0,"draft":0,"bots":5205,"meta":28}, "rng": {"setup":16,"shop":123,"waves":0,"draft":0,"bots":5205,"meta":28},
"errors": {"engine":0,"logged":0,"sim":0,"dispatcher":0}, "errors": {"engine":0,"logged":0,"sim":0,"dispatcher":0},
"rounds": [ "rounds": [
@@ -83,7 +83,7 @@
"title": {"id":"comment_2","name":"不朽盟约","picId":"comment_icon_2","text":"激活的盟约层数总和最高"}, "title": {"id":"comment_2","name":"不朽盟约","picId":"comment_icon_2","text":"激活的盟约层数总和最高"},
"trophies": 0, "trophies": 0,
"reward": 100, "reward": 100,
"stats": {"activatedLayers":182,"bossDamage":75249,"dmgDealt":642303,"gold":68,"itemsEquipped":11,"kills":140,"leaks":6,"lpLost":6,"merges":3,"perfectRounds":5,"refreshes":11}, "stats": {"activatedLayers":182,"bossDamage":75669,"dmgDealt":642724,"gold":68,"itemsEquipped":11,"kills":140,"leaks":6,"lpLost":6,"merges":3,"perfectRounds":5,"refreshes":11},
"lineup": ["3_20_a@12,3[3_11_e_b+1_05_e_a]","1_02_b@12,8[3_10_e_b+4_10_e_a]","1_06_a@11,3[5_02_e_a+1_05_e_b]","3_08_b@11,8","4_14_a@10,3","3_16_a@10,4","5_22_a@9,8","2_05_a@9,9"], "lineup": ["3_20_a@12,3[3_11_e_b+1_05_e_a]","1_02_b@12,8[3_10_e_b+4_10_e_a]","1_06_a@11,3[5_02_e_a+1_05_e_b]","3_08_b@11,8","4_14_a@10,3","3_16_a@10,4","5_22_a@9,8","2_05_a@9,9"],
"bonds": ["deputShip 1/22","emptyShip 0/12","indomShip 0/2","kjeragShip 1/34","steadShip 1/21","swiftShip 1/21","victoriaShip 1/84"] "bonds": ["deputShip 1/22","emptyShip 0/12","indomShip 0/2","kjeragShip 1/34","steadShip 1/21","swiftShip 1/21","victoriaShip 1/84"]
} }
@@ -1134,7 +1134,7 @@
"title": {"id":"comment_4","name":"精英云集","picId":"comment_icon_4","text":"晋升精锐次数最多"}, "title": {"id":"comment_4","name":"精英云集","picId":"comment_icon_4","text":"晋升精锐次数最多"},
"trophies": 2, "trophies": 2,
"reward": 255, "reward": 255,
"stats": {"activatedLayers":0,"bossDamage":0,"dmgDealt":3052677,"gold":114,"itemsEquipped":8,"kills":110,"leaks":99,"lpLost":53,"merges":5,"perfectRounds":5,"refreshes":9}, "stats": {"activatedLayers":0,"bossDamage":0,"dmgDealt":3051941,"gold":114,"itemsEquipped":8,"kills":110,"leaks":99,"lpLost":53,"merges":5,"perfectRounds":5,"refreshes":9},
"lineup": [], "lineup": [],
"bonds": ["arcaneShip 0/8","indomShip 0/4","kazimierzShip 0/88","kjeragShip 0/5","preciShip 0/87","raidShip 0/24","swiftShip 0/56"] "bonds": ["arcaneShip 0/8","indomShip 0/4","kazimierzShip 0/88","kjeragShip 0/5","preciShip 0/87","raidShip 0/24","swiftShip 0/56"]
}, },
@@ -1162,7 +1162,7 @@
"title": {"id":"comment_5","name":"万事俱备","picId":"comment_icon_5","text":"装备配发数量最多"}, "title": {"id":"comment_5","name":"万事俱备","picId":"comment_icon_5","text":"装备配发数量最多"},
"trophies": 2, "trophies": 2,
"reward": 213, "reward": 213,
"stats": {"activatedLayers":0,"bossDamage":0,"dmgDealt":2969116,"gold":100,"itemsEquipped":10,"kills":147,"leaks":37,"lpLost":28,"merges":3,"perfectRounds":6,"refreshes":9}, "stats": {"activatedLayers":0,"bossDamage":0,"dmgDealt":3018022,"gold":100,"itemsEquipped":10,"kills":148,"leaks":37,"lpLost":28,"merges":3,"perfectRounds":6,"refreshes":9},
"lineup": [], "lineup": [],
"bonds": ["deputShip 0/24","egirShip 0/6","kazimierzShip 0/2","kjeragShip 0/14","lateranoShip 0/2","preciShip 0/6","raidShip 0/6","siracusaShip 0/2","skillfulShip 0/16","soloShip 0/14","steadShip 0/56","swiftShip 0/78","victoriaShip 0/35","yanShip 0/35"] "bonds": ["deputShip 0/24","egirShip 0/6","kazimierzShip 0/2","kjeragShip 0/14","lateranoShip 0/2","preciShip 0/6","raidShip 0/6","siracusaShip 0/2","skillfulShip 0/16","soloShip 0/14","steadShip 0/56","swiftShip 0/78","victoriaShip 0/35","yanShip 0/35"]
}, },
@@ -1468,7 +1468,7 @@
"title": {"id":"comment_2","name":"不朽盟约","picId":"comment_icon_2","text":"激活的盟约层数总和最高"}, "title": {"id":"comment_2","name":"不朽盟约","picId":"comment_icon_2","text":"激活的盟约层数总和最高"},
"trophies": 8, "trophies": 8,
"reward": 425, "reward": 425,
"stats": {"activatedLayers":2713,"bossDamage":1676605,"dmgDealt":10050362,"gold":153,"itemsEquipped":19,"kills":283,"leaks":6,"lpLost":0,"merges":4,"perfectRounds":12,"refreshes":33}, "stats": {"activatedLayers":2713,"bossDamage":1672050,"dmgDealt":10044373,"gold":153,"itemsEquipped":19,"kills":283,"leaks":6,"lpLost":0,"merges":4,"perfectRounds":12,"refreshes":33},
"lineup": ["2_18_b@11,5[2_01_e_a+3_03_e_a]","3_13_b@11,8","4_09_a@10,3","3_05_a@10,8[1_01_e_b+4_05_e_b]","3_09_a@9,6","6_16_a@9,7[3_11_e_a+1_02_e_b]","4_20_a@9,8","3_12_a@9,9[4_03_e_a]"], "lineup": ["2_18_b@11,5[2_01_e_a+3_03_e_a]","3_13_b@11,8","4_09_a@10,3","3_05_a@10,8[1_01_e_b+4_05_e_b]","3_09_a@9,6","6_16_a@9,7[3_11_e_a+1_02_e_b]","4_20_a@9,8","3_12_a@9,9[4_03_e_a]"],
"bonds": ["arcaneShip 1/387","deputShip 0/304","egirShip 1/353","emptyShip 0/300","indomShip 0/300","investShip 0/300","kazimierzShip 1/356","kjeragShip 0/302","lateranoShip 0/300","maniShip 0/300","miraShip 0/300","preciShip 0/318","raidShip 1/330","sargonShip 0/300","siracusaShip 0/300","skillfulShip 1/340","soloShip 1/304","steadShip 1/343","suntShip 1/300","swiftShip 0/302","victoriaShip 0/300","visiShip 0/300","yanShip 0/300"] "bonds": ["arcaneShip 1/387","deputShip 0/304","egirShip 1/353","emptyShip 0/300","indomShip 0/300","investShip 0/300","kazimierzShip 1/356","kjeragShip 0/302","lateranoShip 0/300","maniShip 0/300","miraShip 0/300","preciShip 0/318","raidShip 1/330","sargonShip 0/300","siracusaShip 0/300","skillfulShip 1/340","soloShip 1/304","steadShip 1/343","suntShip 1/300","swiftShip 0/302","victoriaShip 0/300","visiShip 0/300","yanShip 0/300"]
}, },
@@ -1482,7 +1482,7 @@
"title": {"id":"comment_1","name":"卫戍之星","picId":"comment_icon_1","text":"对敌方领袖造成伤害最高(仅胜利时)"}, "title": {"id":"comment_1","name":"卫戍之星","picId":"comment_icon_1","text":"对敌方领袖造成伤害最高(仅胜利时)"},
"trophies": 8, "trophies": 8,
"reward": 425, "reward": 425,
"stats": {"activatedLayers":2334,"bossDamage":12218936,"dmgDealt":34332028,"gold":157,"itemsEquipped":29,"kills":286,"leaks":3,"lpLost":0,"merges":4,"perfectRounds":11,"refreshes":30}, "stats": {"activatedLayers":2334,"bossDamage":12223451,"dmgDealt":34090744,"gold":157,"itemsEquipped":29,"kills":286,"leaks":3,"lpLost":0,"merges":4,"perfectRounds":11,"refreshes":30},
"lineup": ["3_16_a@12,8[3_09_e_b+4_07_e_a]","2_10_a@11,5[3_11_e_a+2_03_e_b]","6_05_a@11,8[3_05_e_b+3_10_e_b]","6_08_a@10,3[3_01_e_b+1_01_e_b]","5_11_a@10,4[4_12_e_a+5_09_e_a]","6_14_a@9,7[4_09_e_a+4_04_e_b]","1_06_b@9,8[1_05_e_b+2_01_e_b]","1_17_b@9,9[2_03_e_b+2_03_e_a]"], "lineup": ["3_16_a@12,8[3_09_e_b+4_07_e_a]","2_10_a@11,5[3_11_e_a+2_03_e_b]","6_05_a@11,8[3_05_e_b+3_10_e_b]","6_08_a@10,3[3_01_e_b+1_01_e_b]","5_11_a@10,4[4_12_e_a+5_09_e_a]","6_14_a@9,7[4_09_e_a+4_04_e_b]","1_06_b@9,8[1_05_e_b+2_01_e_b]","1_17_b@9,9[2_03_e_b+2_03_e_a]"],
"bonds": ["arcaneShip 1/330","deputShip 1/326","egirShip 0/300","emptyShip 0/300","indomShip 0/326","investShip 0/300","kazimierzShip 0/305","kjeragShip 0/300","lateranoShip 0/300","maniShip 0/300","miraShip 0/300","preciShip 2/366","raidShip 0/300","sargonShip 0/300","siracusaShip 0/300","skillfulShip 0/300","soloShip 1/316","steadShip 1/340","suntShip 1/310","swiftShip 0/300","victoriaShip 1/346","visiShip 0/300","yanShip 0/305"] "bonds": ["arcaneShip 1/330","deputShip 1/326","egirShip 0/300","emptyShip 0/300","indomShip 0/326","investShip 0/300","kazimierzShip 0/305","kjeragShip 0/300","lateranoShip 0/300","maniShip 0/300","miraShip 0/300","preciShip 2/366","raidShip 0/300","sargonShip 0/300","siracusaShip 0/300","skillfulShip 0/300","soloShip 1/316","steadShip 1/340","suntShip 1/310","swiftShip 0/300","victoriaShip 1/346","visiShip 0/300","yanShip 0/305"]
} }
+79 -79
View File
@@ -78,50 +78,50 @@
"time": 110, "time": 110,
"ticks": 3300, "ticks": 3300,
"reason": "timeout", "reason": "timeout",
"killed": 28, "killed": 29,
"total": 44, "total": 44,
"unspawned": 0, "unspawned": 0,
"bossHpLeft": null, "bossHpLeft": null,
"rngDraws": 79, "rngDraws": 81,
"errors": {"count":0,"kinds":[]}, "errors": {"count":0,"kinds":[]},
"players": {"p1":{"killed":28,"total":44,"perfect":false,"leaks":16,"leaksUncounted":0,"coins":8,"dmg":224475,"bossDmg":0,"heal":1929,"deaths":15,"layerGains":{}}}, "players": {"p1":{"killed":29,"total":44,"perfect":false,"leaks":15,"leaksUncounted":0,"coins":8,"dmg":231938,"bossDmg":0,"heal":2136,"deaths":15,"layerGains":{}}},
"units": [ "units": [
["p1",1,"op","chess_char_1_02_b",1,"uniequip_002_yak",0,0,3,2,7577,4874,0,22,1], ["p1",1,"op","chess_char_1_02_b",1,"uniequip_002_yak",0,0,3,2,7577,4874,0,22,1],
["p1",2,"op","chess_char_1_20_a",1,null,2857.4,1,1,0,0,0,0,0,0], ["p1",2,"op","chess_char_1_20_a",1,null,2857.4,1,1,0,0,0,0,0,0],
["p1",3,"op","chess_char_1_04_b",1,"uniequip_002_udflow",1414.45,1,4,1,6366,2361,0,8,1], ["p1",3,"op","chess_char_1_04_b",1,"uniequip_002_udflow",2542.65,1,4,1,6366,1233,0,8,1],
["p1",4,"op","chess_char_1_08_b",1,"uniequip_002_texas",0,0,7,0,6483,3473,0,2,2], ["p1",4,"op","chess_char_1_08_b",1,"uniequip_002_texas",0,0,7,0,11371,3473,0,2,3],
["p1",5,"op","chess_char_1_18_a",1,null,0,0,61,2,3473,6928,350,7,2], ["p1",5,"op","chess_char_1_18_a",1,null,0,0,61,2,3473,6928,350,7,2],
["p1",6,"op","chess_char_1_19_a",1,null,0,0,57,0,7018,3853,0,10,1], ["p1",6,"op","chess_char_1_19_a",1,null,0,0,57,0,7018,3853,0,10,1],
["p1",7,"op","chess_char_1_17_a",1,null,0,0,5,0,0,1481,0,0,0], ["p1",7,"op","chess_char_1_17_a",1,null,0,0,5,0,0,1481,0,0,0],
["p1",8,"op","chess_char_1_01_b",1,"uniequip_002_inside",0,0,8,4,51848,2235,0,55,3], ["p1",8,"op","chess_char_1_01_b",1,"uniequip_002_inside",0,0,8,4,52919,2442,0,56,3],
["p1",9,"op","chess_char_1_03_b",1,"uniequip_002_leizi",770.4,1,62,4,30306,2846,0,14,1], ["p1",9,"op","chess_char_1_03_b",1,"uniequip_002_leizi",770.4,1,62,4,31013,2846,0,14,1],
["p1",10,"op","chess_char_1_06_b",1,"uniequip_002_vendla",0,0,60,5,22230,4837,1579,25,2], ["p1",10,"op","chess_char_1_06_b",1,"uniequip_002_vendla",0,0,60,5,22126,4837,1786,25,2],
["p1",11,"op","chess_char_1_07_b",0,"uniequip_002_prove",0,0,59,5,36636,5955,0,25,0], ["p1",11,"op","chess_char_1_07_b",0,"uniequip_002_prove",0,0,59,5,36636,5955,0,25,0],
["p1",12,"op","chess_char_1_09_b",1,"uniequip_002_caper",0,0,2,5,52537,2880,0,41,2] ["p1",12,"op","chess_char_1_09_b",1,"uniequip_002_caper",0,0,2,6,53439,2880,0,42,2]
], ],
"enemies": { "enemies": {
"enemy_1000_gopro_2": [1,1,0,0,2938], "enemy_1000_gopro_2": [1,1,0,0,2938],
"enemy_10065_ftzlc": [1,1,0,0,6566], "enemy_10065_ftzlc": [1,1,0,0,6566],
"enemy_10112_ymgds": [1,1,0,0,8640], "enemy_10112_ymgds": [1,1,0,0,8640],
"enemy_1019_jshoot": [9,3,5,13597,11049], "enemy_1019_jshoot": [9,3,5,13818,11049],
"enemy_1040_bombd": [1,1,0,0,6912], "enemy_1040_bombd": [1,1,0,0,6912],
"enemy_1043_zomsbr": [18,16,2,262,82375], "enemy_1043_zomsbr": [18,17,1,262,83175],
"enemy_1116_liprr": [1,1,0,0,9504], "enemy_1116_liprr": [1,1,0,0,9504],
"enemy_1168_dumage_2": [1,1,0,2185,11232], "enemy_1168_dumage_2": [1,1,0,2185,11232],
"enemy_1199_sfjin": [1,1,0,0,11232], "enemy_1199_sfjin": [1,1,0,0,11232],
"enemy_1200_msfjin": [1,0,1,0,13], "enemy_1200_msfjin": [1,0,1,0,13],
"enemy_1234_dsubrl": [1,0,1,4676,11087], "enemy_1234_dsubrl": [1,0,1,4676,11387],
"enemy_1288_duskls_2": [1,0,1,0,10368], "enemy_1288_duskls_2": [1,0,1,0,10368],
"enemy_1299_ymkilr": [3,1,2,3672,14688], "enemy_1299_ymkilr": [3,1,2,3672,14688],
"enemy_1381_winman_2": [1,1,0,0,13478], "enemy_1381_winman_2": [1,1,0,0,13478],
"enemy_1501_demonk": [1,0,0,8061,12259], "enemy_1501_demonk": [1,0,0,7153,14068],
"enemy_2005_axetro": [1,0,0,5980,10350], "enemy_2005_axetro": [1,0,0,5745,13155],
"enemy_9011_acrefr": [1,0,0,0,1783] "enemy_9011_acrefr": [1,0,0,0,3534]
}, },
"hooks": [1,62,3300,343,343,409,439,3216,43,55,15,18,41,6999,32,10,44,12,1,44,0,0,0], "hooks": [1,62,3300,345,345,420,450,2949,44,55,16,19,42,7204,35,10,44,11,1,45,0,0,0],
"events": {"atk":364,"bounty":4,"deploy":18,"die":43,"dmg":439,"engage":10,"fx":64,"heal":17,"leak":12,"skill":36,"spawn":56,"status":64}, "events": {"atk":367,"bounty":4,"deploy":18,"die":44,"dmg":450,"engage":10,"fx":69,"heal":19,"leak":11,"skill":38,"spawn":56,"status":70},
"fx": {"aoe":4,"counter":3,"crit":20,"displace":10,"dp":2,"ember":1,"pulse":19,"revive":1,"sp":1,"summon":1,"taunt":2}, "fx": {"aoe":5,"counter":5,"crit":21,"displace":10,"dp":3,"ember":1,"pulse":19,"revive":1,"sp":1,"summon":1,"taunt":2},
"snaps": "ccf62e58 0169998c b859efed 32758178 83e51a60 50ce6b41 f75af7ee 51da4e45 7cbeae65 6cf12cc4 68ebbf32" "snaps": "ccf62e58 0169998c b859efed 32758178 83e51a60 ce049a71 a8b23629 f4237c7c 751a3365 161a783e f7c626ae"
}, },
"roster-003": { "roster-003": {
"about": "pass 0 band 2: chess_char_1_10_b chess_char_1_12_b chess_char_1_20_b chess_char_1_18_b chess_char_1_19_b chess_char_1_13_b chess_char_1_14_b chess_char_1_17_b chess_char_2_01_a chess_char_2_02_a chess_char_2_04_a chess_char_2_05_a token_10000_silent_healrb", "about": "pass 0 band 2: chess_char_1_10_b chess_char_1_12_b chess_char_1_20_b chess_char_1_18_b chess_char_1_19_b chess_char_1_13_b chess_char_1_14_b chess_char_1_17_b chess_char_2_01_a chess_char_2_02_a chess_char_2_04_a chess_char_2_05_a token_10000_silent_healrb",
@@ -263,16 +263,16 @@
"bossHpLeft": null, "bossHpLeft": null,
"rngDraws": 333, "rngDraws": 333,
"errors": {"count":0,"kinds":[]}, "errors": {"count":0,"kinds":[]},
"players": {"p1":{"killed":83,"total":84,"perfect":false,"leaks":1,"leaksUncounted":0,"coins":10,"dmg":306697,"bossDmg":0,"heal":36881,"deaths":0,"layerGains":{}}}, "players": {"p1":{"killed":83,"total":84,"perfect":false,"leaks":1,"leaksUncounted":0,"coins":10,"dmg":306697,"bossDmg":0,"heal":36129,"deaths":0,"layerGains":{}}},
"units": [ "units": [
["p1",1,"op","chess_char_2_07_b",1,"uniequip_002_ghost",2664.2,1,2,0,0,1707,1318,0,0], ["p1",1,"op","chess_char_2_07_b",1,"uniequip_002_ghost",2664.2,1,2,0,0,1305,1184,0,0],
["p1",2,"op","chess_char_2_08_b",1,"uniequip_002_bubble",3373,1,4,0,49,1818,0,0,1], ["p1",2,"op","chess_char_2_08_b",1,"uniequip_002_bubble",3373,1,4,0,73,1469,0,0,1],
["p1",3,"op","chess_char_2_09_b",1,"uniequip_002_humus",2133,1,6,28,84020,0,0,59,2], ["p1",3,"op","chess_char_2_09_b",1,"uniequip_002_humus",2133,1,6,28,84020,0,0,59,2],
["p1",4,"op","chess_char_2_11_b",1,"uniequip_002_kazema",2214,1,8,12,91244,15780,0,92,3], ["p1",4,"op","chess_char_2_11_b",1,"uniequip_002_kazema",2214,1,8,12,91220,15780,0,92,3],
["p1",5,"op","chess_char_2_12_b",1,"uniequip_002_gravel",1452,1,10,2,7180,8945,0,129,1], ["p1",5,"op","chess_char_2_12_b",1,"uniequip_002_gravel",1452,1,10,2,7180,8945,0,129,1],
["p1",6,"op","chess_char_2_19_a",1,null,1021.2,1,11,1,14957,1523,407,26,3], ["p1",6,"op","chess_char_2_19_a",1,null,1021.2,1,11,1,14957,1523,407,26,3],
["p1",7,"op","chess_char_2_01_b",1,"uniequip_002_excu",2146,1,12,20,36079,4183,0,22,1], ["p1",7,"op","chess_char_2_01_b",1,"uniequip_002_excu",2146,1,12,20,36079,4183,0,22,1],
["p1",8,"op","chess_char_2_02_b",1,"uniequip_002_silent",1614,1,1,0,0,0,9257,28,5], ["p1",8,"op","chess_char_2_02_b",1,"uniequip_002_silent",1614,1,1,0,0,0,8638,26,5],
["p1",9,"op","chess_char_2_04_b",1,"uniequip_002_grabds",1270,1,3,10,38233,2115,0,53,3], ["p1",9,"op","chess_char_2_04_b",1,"uniequip_002_grabds",1270,1,3,10,38233,2115,0,53,3],
["p1",10,"op","chess_char_2_05_b",1,"uniequip_002_harold",1971.2,1,5,0,0,0,11159,39,2], ["p1",10,"op","chess_char_2_05_b",1,"uniequip_002_harold",1971.2,1,5,0,0,0,11159,39,2],
["p1",11,"op","chess_char_2_06_b",0,"uniequip_002_papyrs",1639,1,7,0,0,0,12883,28,13], ["p1",11,"op","chess_char_2_06_b",0,"uniequip_002_papyrs",1639,1,7,0,0,0,12883,28,13],
@@ -280,7 +280,7 @@
["p1",13,"token","token_10000_silent_healrb",null,null,1000,0,103,0,0,0,1858,18,null] ["p1",13,"token","token_10000_silent_healrb",null,null,1000,0,103,0,0,0,1858,18,null]
], ],
"enemies": { "enemies": {
"enemy_10027_vtsk": [1,0,0,10080,23138], "enemy_10027_vtsk": [1,0,0,9358,23138],
"enemy_1006_shield_2": [1,1,0,0,8000], "enemy_1006_shield_2": [1,1,0,0,8000],
"enemy_10122_uacann_2": [1,1,0,3476,8000], "enemy_10122_uacann_2": [1,1,0,3476,8000],
"enemy_1042_frostd": [1,1,0,0,5200], "enemy_1042_frostd": [1,1,0,0,5200],
@@ -292,13 +292,13 @@
"enemy_1299_ymkilr_2": [1,1,0,1178,8800], "enemy_1299_ymkilr_2": [1,1,0,1178,8800],
"enemy_1328_cbjedi": [6,6,0,8860,48000], "enemy_1328_cbjedi": [6,6,0,8860,48000],
"enemy_1402_tgshd_2": [1,1,0,200,10400], "enemy_1402_tgshd_2": [1,1,0,200,10400],
"enemy_1509_mousek": [1,1,0,7102,17600], "enemy_1509_mousek": [1,1,0,7072,17600],
"enemy_2010_csdcr": [1,1,0,1896,9600] "enemy_2010_csdcr": [1,1,0,1896,9600]
}, },
"hooks": [1,102,4200,702,702,1777,1770,1107,83,89,36,35,0,28577,142,53,84,0,1,83,0,0,0], "hooks": [1,102,4200,700,700,1778,1771,1030,83,89,36,35,0,28577,142,53,84,0,1,83,0,0,0],
"events": {"atk":917,"bounty":5,"deploy":18,"die":89,"dmg":1729,"engage":7,"fx":66,"heal":122,"skill":71,"spawn":97,"status":441}, "events": {"atk":915,"bounty":5,"deploy":18,"die":89,"dmg":1730,"engage":7,"fx":67,"heal":120,"skill":71,"spawn":97,"status":441},
"fx": {"counter":2,"explode":3,"expose":9,"overload":2,"phase":1,"shield":9,"shieldBreak":16,"sleep":7,"summon":5,"telegraph":6,"zone":6}, "fx": {"counter":3,"explode":3,"expose":9,"overload":2,"phase":1,"shield":9,"shieldBreak":16,"sleep":7,"summon":5,"telegraph":6,"zone":6},
"snaps": "de0d6fce aa9dbd18 e5f78211 369608f9 eaf0206b 8ca00225 879ade74 10585017 e8565d0c e354c612 a50e5370 07ad00b4 54071507 c18f3d28" "snaps": "b763a1c1 b98a9d1a 2c94d433 a365844f 78a462a5 a1781573 cd52b6de 59586d21 9e102f1a e7d33928 5c43f32a 8141e997 bbbfc2f0 d722f533"
}, },
"roster-006": { "roster-006": {
"about": "pass 0 band 3: chess_char_2_17_b chess_char_2_18_b chess_char_3_06_a chess_char_2_13_b chess_char_2_16_b chess_char_3_02_a chess_char_3_03_a chess_char_3_04_a chess_char_3_05_a chess_char_2_14_b chess_char_2_19_b chess_char_3_01_a", "about": "pass 0 band 3: chess_char_2_17_b chess_char_2_18_b chess_char_3_06_a chess_char_2_13_b chess_char_2_16_b chess_char_3_02_a chess_char_3_03_a chess_char_3_04_a chess_char_3_05_a chess_char_2_14_b chess_char_2_19_b chess_char_3_01_a",
@@ -523,8 +523,8 @@
"enemy_2025_syufo": [13,3,7,34317,151477] "enemy_2025_syufo": [13,3,7,34317,151477]
}, },
"hooks": [1,130,5100,572,572,1142,1238,383,67,123,21,24,0,10102,74,47,88,33,1,72,14,13,0], "hooks": [1,130,5100,572,572,1142,1238,383,67,123,21,24,0,10102,74,47,88,33,1,72,14,13,0],
"events": {"atk":665,"bounty":4,"deploy":42,"die":90,"dmg":1182,"engage":12,"fx":188,"heal":382,"layer":14,"leak":33,"skill":49,"spawn":119,"status":129}, "events": {"atk":665,"bounty":4,"deploy":42,"die":90,"dmg":1182,"engage":12,"fx":208,"heal":382,"layer":14,"leak":33,"skill":49,"spawn":119,"status":129},
"fx": {"aoe":1,"blink":4,"buff":1,"burst":13,"coin":21,"displace":31,"explode":25,"garrison":9,"layer":5,"pull":31,"revive":5,"shield":1,"shieldBreak":1,"stone":1,"strike":9,"summon":20,"telegraph":1,"volley":9}, "fx": {"aoe":21,"blink":4,"buff":1,"burst":13,"coin":21,"displace":31,"explode":25,"garrison":9,"layer":5,"pull":31,"revive":5,"shield":1,"shieldBreak":1,"stone":1,"strike":9,"summon":20,"telegraph":1,"volley":9},
"snaps": "d491f937 8ffbd7b3 9e67e1b5 7e887872 27c243c0 3f150bd7 8e79d798 8c8aa383 1ace5379 4d15cb2e a4aee685 006dff51 e06c3bae 1719e77c cd00bd64 7ff011a8 21d3419f" "snaps": "d491f937 8ffbd7b3 9e67e1b5 7e887872 27c243c0 3f150bd7 8e79d798 8c8aa383 1ace5379 4d15cb2e a4aee685 006dff51 e06c3bae 1719e77c cd00bd64 7ff011a8 21d3419f"
}, },
"roster-009": { "roster-009": {
@@ -607,10 +607,10 @@
"rngDraws": 78, "rngDraws": 78,
"errors": {"count":0,"kinds":[]}, "errors": {"count":0,"kinds":[]},
"players": { "players": {
"p1": {"killed":34,"total":102,"perfect":false,"leaks":68,"leaksUncounted":0,"coins":6,"dmg":370675,"bossDmg":0,"heal":1763,"deaths":21,"layerGains":{"preciShip":8}} "p1": {"killed":34,"total":102,"perfect":false,"leaks":68,"leaksUncounted":0,"coins":6,"dmg":374265,"bossDmg":0,"heal":1763,"deaths":21,"layerGains":{"preciShip":8}}
}, },
"units": [ "units": [
["p1",1,"op","chess_char_4_17_a",1,null,0,0,5,0,1650,2849,0,12,0], ["p1",1,"op","chess_char_4_17_a",1,null,0,0,5,0,5240,2849,0,12,0],
["p1",2,"op","chess_char_4_18_a",1,null,0,0,6,0,1816,4317,1450,3,3], ["p1",2,"op","chess_char_4_18_a",1,null,0,0,6,0,1816,4317,1450,3,3],
["p1",3,"op","chess_char_4_11_a",1,null,2144,1,128,0,484,2969,0,1,1], ["p1",3,"op","chess_char_4_11_a",1,null,2144,1,128,0,484,2969,0,1,1],
["p1",4,"op","chess_char_4_19_a",2,null,0,0,95,0,12345,3120,0,20,1], ["p1",4,"op","chess_char_4_19_a",2,null,0,0,95,0,12345,3120,0,20,1],
@@ -635,7 +635,7 @@
"enemy_1005_yokai_3": [6,0,5,18350,83393], "enemy_1005_yokai_3": [6,0,5,18350,83393],
"enemy_10083_hlbird": [1,1,0,0,6450], "enemy_10083_hlbird": [1,1,0,0,6450],
"enemy_10144_xdelk_2": [1,0,1,2974,31667], "enemy_10144_xdelk_2": [1,0,1,2974,31667],
"enemy_1050_lslime": [1,0,1,9009,21335], "enemy_1050_lslime": [1,0,1,9009,24925],
"enemy_1158_divman": [1,1,0,305,14189], "enemy_1158_divman": [1,1,0,305,14189],
"enemy_1174_duholy_2": [1,0,1,1192,4347], "enemy_1174_duholy_2": [1,0,1,1192,4347],
"enemy_1204_msfhu_2": [1,1,0,0,6], "enemy_1204_msfhu_2": [1,1,0,0,6],
@@ -646,10 +646,10 @@
"enemy_1516_jakill": [1,0,1,81,0], "enemy_1516_jakill": [1,0,1,81,0],
"enemy_2034_sythef_2": [1,0,1,0,0] "enemy_2034_sythef_2": [1,0,1,0,0]
}, },
"hooks": [1,130,5100,423,423,1014,982,222,55,117,21,22,0,7786,429,11,102,62,1,170,2,0,23], "hooks": [1,130,5100,423,423,1029,997,222,55,117,21,22,0,7786,429,11,102,62,1,170,2,0,23],
"events": {"atk":520,"bounty":3,"deploy":25,"die":55,"dmg":898,"engage":12,"fx":160,"heal":5,"layer":2,"leak":62,"skill":44,"spawn":119,"status":287}, "events": {"atk":520,"bounty":3,"deploy":25,"die":55,"dmg":913,"engage":12,"fx":175,"heal":5,"layer":2,"leak":62,"skill":44,"spawn":119,"status":287},
"fx": {"block":9,"catShield":2,"charge":1,"dilemma":1,"dodge":23,"explode":16,"explosion":2,"featherArrow":1,"flame":1,"frostNova":4,"garrison":2,"garrisonGrant":1,"overclock":1,"phase":1,"pull":1,"riposte":1,"rockslide":3,"shieldBreak":5,"slippery":1,"summon":11,"swordRain":48,"swordStorm":5,"telegraph":2,"thorns":6,"tornado":1,"tornadoPulse":5,"undying":6}, "fx": {"block":9,"catShield":2,"charge":1,"dilemma":1,"dodge":23,"explode":16,"explosion":2,"featherArrow":1,"flame":1,"frostNova":4,"garrison":2,"garrisonGrant":1,"overclock":1,"phase":1,"pull":1,"riposte":1,"rockslide":3,"shieldBreak":5,"slippery":1,"summon":11,"swordRain":48,"swordStorm":5,"telegraph":2,"thorns":21,"tornado":1,"tornadoPulse":5,"undying":6},
"snaps": "57fe2e2f 9740eab7 bc769df4 4b11e270 22996d81 de0a7802 8a9b54fe 11b5d7b3 27f8d1f7 407381fb 454bf8fe fb11d7df adcdf5d5 fac269bf c684cb06 d99688cd 0cfb92e2" "snaps": "57fe2e2f 9740eab7 bc769df4 4b11e270 22996d81 21c4f85b b11a1d11 d9930d54 32c104ad 48940391 2875c690 fa4e30b9 e3c2ed67 439d1b5d 98710bbc 2b3b8707 201d4164"
}, },
"roster-011": { "roster-011": {
"about": "pass 0 band 5: chess_char_4_23_a chess_char_4_01_b chess_char_4_22_a chess_char_4_04_b chess_char_4_07_b chess_char_4_09_b chess_char_4_21_a chess_char_4_24_a chess_char_4_25_a chess_char_4_26_a chess_char_4_02_b chess_char_4_06_b", "about": "pass 0 band 5: chess_char_4_23_a chess_char_4_01_b chess_char_4_22_a chess_char_4_04_b chess_char_4_07_b chess_char_4_09_b chess_char_4_21_a chess_char_4_24_a chess_char_4_25_a chess_char_4_26_a chess_char_4_02_b chess_char_4_06_b",
@@ -730,10 +730,10 @@
"rngDraws": 187, "rngDraws": 187,
"errors": {"count":0,"kinds":[]}, "errors": {"count":0,"kinds":[]},
"players": { "players": {
"p1": {"killed":99,"total":100,"perfect":false,"leaks":1,"leaksUncounted":0,"coins":10,"dmg":983916,"bossDmg":0,"heal":22157,"deaths":7,"layerGains":{"preciShip":8}} "p1": {"killed":99,"total":100,"perfect":false,"leaks":1,"leaksUncounted":0,"coins":10,"dmg":983940,"bossDmg":0,"heal":22157,"deaths":7,"layerGains":{"preciShip":8}}
}, },
"units": [ "units": [
["p1",1,"op","chess_char_4_17_b",1,"uniequip_002_hsguma",3046.73,1,7,0,184,466,0,20,0], ["p1",1,"op","chess_char_4_17_b",1,"uniequip_002_hsguma",3046.73,1,7,0,237,466,0,20,0],
["p1",2,"op","chess_char_4_18_b",1,"uniequip_002_mudrok",6104,1,9,4,57534,2092,2092,32,7], ["p1",2,"op","chess_char_4_18_b",1,"uniequip_002_mudrok",6104,1,9,4,57534,2092,2092,32,7],
["p1",3,"op","chess_char_4_11_b",1,"uniequip_002_cathy",2644,1,124,0,2731,3521,0,3,1], ["p1",3,"op","chess_char_4_11_b",1,"uniequip_002_cathy",2644,1,124,0,2731,3521,0,3,1],
["p1",4,"op","chess_char_4_19_b",2,"uniequip_002_flamtl",0,0,104,4,45091,4236,0,45,3], ["p1",4,"op","chess_char_4_19_b",2,"uniequip_002_flamtl",0,0,104,4,45091,4236,0,45,3],
@@ -743,7 +743,7 @@
["p1",8,"op","chess_char_4_12_b",2,"uniequip_002_glady",2232,1,5,2,6911,557,557,14,2], ["p1",8,"op","chess_char_4_12_b",2,"uniequip_002_glady",2232,1,5,2,6911,557,557,14,2],
["p1",9,"op","chess_char_4_13_b",1,"uniequip_002_gnosis",1989,1,11,20,187170,2441,0,92,38], ["p1",9,"op","chess_char_4_13_b",1,"uniequip_002_gnosis",1989,1,11,20,187170,2441,0,92,38],
["p1",10,"op","chess_char_4_14_b",1,"uniequip_002_lionhd",1576,1,13,44,488221,7756,0,57,23], ["p1",10,"op","chess_char_4_14_b",1,"uniequip_002_lionhd",1576,1,13,44,488221,7756,0,57,23],
["p1",11,"op","chess_char_4_20_b",2,"uniequip_002_fartth",0,0,6,12,86244,1419,0,28,5], ["p1",11,"op","chess_char_4_20_b",2,"uniequip_002_fartth",0,0,6,12,86215,1419,0,28,5],
["p1",12,"op","chess_char_4_21_b",1,"uniequip_002_plosis",1534,1,14,0,0,9049,19146,96,2], ["p1",12,"op","chess_char_4_21_b",1,"uniequip_002_plosis",1534,1,14,0,0,9049,19146,96,2],
["p1",13,"token","token_10041_cathy_catsld",null,null,100,1,17,0,0,0,0,0,null], ["p1",13,"token","token_10041_cathy_catsld",null,null,100,1,17,0,0,0,0,0,null],
["p1",14,"token","token_10041_cathy_catsld",null,null,100,1,16,0,0,0,0,0,null], ["p1",14,"token","token_10041_cathy_catsld",null,null,100,1,16,0,0,0,0,0,null],
@@ -766,13 +766,13 @@
"enemy_1270_nhstlk_2": [15,15,0,6817,276480], "enemy_1270_nhstlk_2": [15,15,0,6817,276480],
"enemy_1325_cbgpro_2": [1,1,0,0,5299], "enemy_1325_cbgpro_2": [1,1,0,0,5299],
"enemy_1425_lrcmra_2": [1,1,0,718,28800], "enemy_1425_lrcmra_2": [1,1,0,718,28800],
"enemy_1525_blkswb": [1,0,1,11702,37587], "enemy_1525_blkswb": [1,0,1,11702,37611],
"enemy_2050_smsha": [1,1,0,1902,46080] "enemy_2050_smsha": [1,1,0,1902,46080]
}, },
"hooks": [1,122,4878,469,469,1415,1416,521,107,110,87,86,0,15601,1813,20,100,1,1,122,1,0,1], "hooks": [1,122,4878,469,469,1417,1418,521,107,110,87,86,0,15601,1813,20,100,1,1,122,1,0,1],
"events": {"atk":626,"bounty":5,"deploy":19,"die":109,"dmg":1408,"engage":10,"fx":238,"heal":213,"layer":1,"leak":1,"skill":175,"spawn":117,"status":929}, "events": {"atk":626,"bounty":5,"deploy":19,"die":109,"dmg":1410,"engage":10,"fx":241,"heal":213,"layer":1,"leak":1,"skill":175,"spawn":117,"status":929},
"fx": {"beam":6,"blink":2,"displace":4,"dodge":1,"explode":4,"explosion":23,"featherArrow":5,"flame":3,"frostNova":38,"garrison":1,"garrisonGrant":1,"healField":2,"overclock":1,"palsy":1,"pull":2,"revive":4,"riposte":1,"rockslide":7,"shieldBreak":8,"slash":23,"summon":1,"swordRain":9,"swordStorm":3,"telegraph":4,"tornado":2,"tornadoPulse":10,"truesilver":3,"zone":69}, "fx": {"beam":6,"blink":2,"displace":4,"dodge":1,"explode":4,"explosion":23,"featherArrow":5,"flame":3,"frostNova":38,"garrison":1,"garrisonGrant":1,"healField":2,"overclock":1,"palsy":1,"pull":2,"revive":4,"riposte":1,"rockslide":7,"shieldBreak":8,"slash":23,"summon":1,"swordRain":9,"swordStorm":3,"telegraph":4,"thorns":3,"tornado":2,"tornadoPulse":10,"truesilver":3,"zone":69},
"snaps": "a9c24b01 43e8c4cb 9f57bc24 f59bb440 6678caa3 a8a8f019 00aa512d 0d1483f9 3218befc 941b711a 42e275ff 71560683 48d17a97 d73abc3a cd6e4828 23a7c2fb ed427a58" "snaps": "a9c24b01 43e8c4cb 9f57bc24 f59bb440 6678caa3 a8a8f019 00aa512d 0d1483f9 2a3527a2 03e0de1a 3bc882ff 0bd6525a bdfd0551 2a029828 bba7125a e653cf29 998295f6"
}, },
"roster-013": { "roster-013": {
"about": "pass 0 band 5: chess_char_4_23_b chess_char_5_08_a chess_char_5_01_a chess_char_5_05_a chess_char_5_06_a chess_char_5_07_a chess_char_4_24_b chess_char_4_25_b chess_char_4_26_b chess_char_5_02_a chess_char_5_03_a chess_char_5_10_a", "about": "pass 0 band 5: chess_char_4_23_b chess_char_5_08_a chess_char_5_01_a chess_char_5_05_a chess_char_5_06_a chess_char_5_07_a chess_char_4_24_b chess_char_4_25_b chess_char_4_26_b chess_char_5_02_a chess_char_5_03_a chess_char_5_10_a",
@@ -1026,26 +1026,26 @@
"leaks": 47, "leaks": 47,
"leaksUncounted": 0, "leaksUncounted": 0,
"coins": 6, "coins": 6,
"dmg": 3625965, "dmg": 3677023,
"bossDmg": 0, "bossDmg": 0,
"heal": 73726, "heal": 75128,
"deaths": 12, "deaths": 12,
"layerGains": {"preciShip":2} "layerGains": {"preciShip":2}
} }
}, },
"units": [ "units": [
["p1",1,"op","chess_char_5_19_b",2,"uniequip_002_mlynar",3907,1,155,9,319089,12578,505,57,4], ["p1",1,"op","chess_char_5_19_b",2,"uniequip_002_mlynar",0,0,151,11,354038,12682,609,62,4],
["p1",2,"op","chess_char_6_03_a",2,null,3649.5,1,153,1,63347,9646,3389,40,2], ["p1",2,"op","chess_char_6_03_a",2,null,3649.5,1,153,1,73038,11404,3450,49,2],
["p1",3,"op","chess_char_6_06_a",2,null,2223,1,141,9,376232,17794,732,73,2], ["p1",3,"op","chess_char_6_06_a",2,null,2223,1,141,8,370574,19209,775,73,2],
["p1",4,"op","chess_char_5_17_b",1,"uniequip_002_f12yin",2738,1,74,6,134249,34756,12617,295,2], ["p1",4,"op","chess_char_5_17_b",1,"uniequip_002_f12yin",2738,1,74,5,134711,33014,11637,295,2],
["p1",5,"op","chess_char_5_20_b",2,"uniequip_002_aglina",1382,1,10,0,114705,1182,705,42,5], ["p1",5,"op","chess_char_5_20_b",2,"uniequip_002_aglina",1382,1,10,0,114705,1182,705,42,5],
["p1",6,"op","chess_char_5_21_b",1,"uniequip_002_sntlla",1629,1,84,0,216022,2324,401,113,3], ["p1",6,"op","chess_char_5_21_b",1,"uniequip_002_sntlla",1629,1,84,0,216022,2324,401,113,3],
["p1",7,"op","chess_char_5_22_b",1,"uniequip_002_nymph",1611,1,1,1,42732,1056,1056,11,4], ["p1",7,"op","chess_char_5_22_b",1,"uniequip_002_nymph",1611,1,1,1,42732,1056,1056,11,4],
["p1",8,"op","chess_char_5_23_b",1,"uniequip_002_reckpr",1610,1,3,0,0,2485,51822,72,4], ["p1",8,"op","chess_char_5_23_b",1,"uniequip_002_reckpr",1610,1,3,0,0,2485,53907,72,4],
["p1",9,"op","chess_char_6_01_a",2,null,1158,1,106,30,645243,1291,81,72,3], ["p1",9,"op","chess_char_6_01_a",2,null,1158,1,106,28,635492,1291,81,72,3],
["p1",10,"op","chess_char_6_02_a",2,null,1687,1,7,20,1384858,7686,498,74,3], ["p1",10,"op","chess_char_6_02_a",2,null,1687,1,7,22,1408611,7686,498,74,3],
["p1",11,"op","chess_char_6_04_a",2,null,1161.9,1,130,1,64654,8281,903,0,3], ["p1",11,"op","chess_char_6_04_a",2,null,1028.54,1,130,1,63251,8281,992,0,3],
["p1",12,"op","chess_char_6_05_a",2,null,1215,1,59,2,264834,2542,1017,68,5], ["p1",12,"op","chess_char_6_05_a",2,null,1215,1,59,2,263849,2542,1017,68,5],
["p1",13,"token","token_10017_skadi2_dedant",null,null,100,0,13,0,0,0,0,0,null], ["p1",13,"token","token_10017_skadi2_dedant",null,null,100,0,13,0,0,0,0,0,null],
["p1","~1","token","token_10017_skadi2_dedant",null,null,100,0,60,0,0,0,0,0,null], ["p1","~1","token","token_10017_skadi2_dedant",null,null,100,0,60,0,0,0,0,0,null],
["p1","~2","token","token_10017_skadi2_dedant",null,null,100,0,131,0,0,0,0,0,null], ["p1","~2","token","token_10017_skadi2_dedant",null,null,100,0,131,0,0,0,0,0,null],
@@ -1054,10 +1054,10 @@
"enemies": { "enemies": {
"enemy_10045_parrot": [1,0,1,0,44064], "enemy_10045_parrot": [1,0,1,0,44064],
"enemy_10098_crhro": [1,0,1,4685,94997], "enemy_10098_crhro": [1,0,1,4685,94997],
"enemy_10124_uashld_2": [12,0,10,34007,659017], "enemy_10124_uashld_2": [12,0,9,32378,701938],
"enemy_1019_jshoot_2": [1,1,0,1861,16718], "enemy_1019_jshoot_2": [1,1,0,1861,16718],
"enemy_1043_zomsbr": [72,54,18,618,974327], "enemy_1043_zomsbr": [72,54,18,366,974908],
"enemy_1061_zomshd": [30,18,12,24836,1664045], "enemy_1061_zomshd": [30,18,12,28253,1673641],
"enemy_1072_dlancer": [1,1,0,2738,37150], "enemy_1072_dlancer": [1,1,0,2738,37150],
"enemy_1165_duhond": [1,1,0,0,17337], "enemy_1165_duhond": [1,1,0,0,17337],
"enemy_1196_msfyin_2": [1,1,0,0,3], "enemy_1196_msfyin_2": [1,1,0,0,3],
@@ -1068,10 +1068,10 @@
"enemy_2001_duckmi_2": [1,0,1,0,9483], "enemy_2001_duckmi_2": [1,0,1,0,9483],
"enemy_9006_actoxi": [1,0,1,0,2384] "enemy_9006_actoxi": [1,0,1,0,2384]
}, },
"hooks": [1,154,6900,951,1017,7281,7430,78804,91,140,40,36,17,35845,1032,57,126,45,1,102,1,7,6], "hooks": [1,153,6900,968,1034,7412,7573,79654,91,139,40,36,17,35794,1056,56,126,44,1,104,1,8,7],
"events": {"atk":2283,"bounty":3,"deploy":28,"die":95,"dmg":7385,"engage":10,"fx":552,"heal":121,"layer":1,"leak":45,"skill":76,"spawn":142,"status":2410}, "events": {"atk":2339,"bounty":3,"deploy":27,"die":95,"dmg":7528,"engage":10,"fx":555,"heal":123,"layer":1,"leak":44,"skill":76,"spawn":142,"status":2465},
"fx": {"aoe":8,"bombard":17,"bombardShell":17,"burst":7,"crit":50,"dodge":6,"explode":40,"firewall":2,"garrison":1,"iceSpike":90,"lightning":148,"lock":17,"lure":3,"revive":1,"snow":82,"soul":1,"sp":1,"storm":5,"talent":2,"telegraph":8,"tide":3,"wanted":38,"weightless":5}, "fx": {"aoe":8,"bombard":17,"bombardShell":17,"burst":8,"crit":49,"dodge":7,"explode":40,"firewall":2,"garrison":1,"iceSpike":90,"lightning":149,"lock":17,"lure":3,"revive":1,"snow":83,"soul":1,"sp":1,"storm":5,"talent":2,"telegraph":8,"tide":3,"wanted":38,"weightless":5},
"snaps": "ee17d257 d832b8ac 2ca210aa 3cd3fc22 022376cf a362140e 0ca09d66 1f446040 29245222 70bfb33a 2b4ce12f 51a65ad5 1216d2fa f2d3b899 86e068de 5a0bbda6 1bb53622 0ef45b3c a98167d6 5245239e eac46280 b7e2f8ef 905be587" "snaps": "ee17d257 d832b8ac 2ca210aa 3cd3fc22 022376cf a362140e 0ca09d66 1f446040 29245222 70bfb33a 2b4ce12f 51a65ad5 ad68ae06 78e22ecb 8e62cd15 d038400f acfbac9b d0d4b34a 15c967a7 7069a3e8 43be52da 702645d3 aab418ba"
}, },
"roster-017": { "roster-017": {
"about": "pass 0 band 6: chess_char_6_15_a chess_char_6_19_a chess_char_6_07_a chess_char_6_17_a chess_char_6_08_a chess_char_6_09_a chess_char_6_11_a chess_char_6_12_a chess_char_6_13_a chess_char_6_14_a chess_char_6_16_a chess_char_6_18_a", "about": "pass 0 band 6: chess_char_6_15_a chess_char_6_19_a chess_char_6_07_a chess_char_6_17_a chess_char_6_08_a chess_char_6_09_a chess_char_6_11_a chess_char_6_12_a chess_char_6_13_a chess_char_6_14_a chess_char_6_16_a chess_char_6_18_a",
@@ -2042,7 +2042,7 @@
"leaks": 132, "leaks": 132,
"leaksUncounted": 0, "leaksUncounted": 0,
"coins": 2, "coins": 2,
"dmg": 346977, "dmg": 349368,
"bossDmg": 0, "bossDmg": 0,
"heal": 42114, "heal": 42114,
"deaths": 24, "deaths": 24,
@@ -2051,8 +2051,8 @@
}, },
"units": [ "units": [
["p1",1,"op","chess_char_5_11_a",0,null,3628.8,1,198,2,15002,7551,4312,30,4], ["p1",1,"op","chess_char_5_11_a",0,null,3628.8,1,198,2,15002,7551,4312,30,4],
["p1",2,"op","chess_char_5_19_a",0,null,2167.52,1,196,3,36237,18040,49,14,3], ["p1",2,"op","chess_char_5_19_a",0,null,2167.52,1,196,3,38727,18040,49,14,3],
["p1",3,"op","chess_char_5_13_a",0,null,0,0,193,5,70464,16349,83,31,1], ["p1",3,"op","chess_char_5_13_a",0,null,0,0,193,5,70364,16349,83,31,1],
["p1",4,"op","chess_char_5_14_a",0,null,1546.99,1,197,1,6713,5581,1527,20,3], ["p1",4,"op","chess_char_5_14_a",0,null,1546.99,1,197,1,6713,5581,1527,20,3],
["p1",5,"op","chess_char_5_06_b",0,"uniequip_003_etlchi",0,0,179,14,123248,17506,7085,33,8], ["p1",5,"op","chess_char_5_06_b",0,"uniequip_003_etlchi",0,0,179,14,123248,17506,7085,33,8],
["p1",6,"op","chess_char_5_17_a",0,null,89.06,1,195,0,5573,17040,199,14,2], ["p1",6,"op","chess_char_5_17_a",0,null,89.06,1,195,0,5573,17040,199,14,2],
@@ -2075,14 +2075,14 @@
"enemy_1196_msfyin": [1,1,0,0,2], "enemy_1196_msfyin": [1,1,0,0,2],
"enemy_1252_lysytb_2": [1,0,1,307,9631], "enemy_1252_lysytb_2": [1,0,1,307,9631],
"enemy_1364_spnaxe_2": [1,0,1,2528,4741], "enemy_1364_spnaxe_2": [1,0,1,2528,4741],
"enemy_1404_msnip": [36,4,32,77857,127526], "enemy_1404_msnip": [36,4,32,77857,129916],
"enemy_1516_jakill": [1,0,1,5154,1320], "enemy_1516_jakill": [1,0,1,5154,1320],
"enemy_9011_acrefr": [1,0,1,0,1527] "enemy_9011_acrefr": [1,0,1,0,1527]
}, },
"hooks": [1,198,6664,961,961,3404,3432,2289,59,192,68,67,0,23204,206,88,167,132,1,65,7,0,3], "hooks": [1,198,6664,961,961,3430,3458,2289,59,192,68,67,0,23204,206,88,167,132,1,65,7,0,3],
"events": {"atk":1050,"bounty":1,"deploy":29,"die":60,"dmg":3390,"engage":12,"fx":119,"heal":451,"layer":7,"leak":132,"skill":135,"spawn":182,"status":264}, "events": {"atk":1050,"bounty":1,"deploy":29,"die":60,"dmg":3416,"engage":12,"fx":119,"heal":451,"layer":7,"leak":132,"skill":135,"spawn":182,"status":264},
"fx": {"aoe":3,"dodge":3,"dollEnd":3,"garrison":7,"healAoe":4,"hpShare":1,"palsy":1,"phase":1,"reborn":3,"revive":6,"shield":39,"sp":10,"substitute":3,"summon":1,"zone":34}, "fx": {"aoe":3,"dodge":3,"dollEnd":3,"garrison":7,"healAoe":4,"hpShare":1,"palsy":1,"phase":1,"reborn":3,"revive":6,"shield":39,"sp":10,"substitute":3,"summon":1,"zone":34},
"snaps": "8b9c3026 e0f96062 a49bbfa8 29d89b05 0acdd66d 607a3e6e e487bee7 925b98be 8d6d2209 5c9e2d74 878a99ae 98ba61a3 429c3a4d 28fa2b80 5f6aa75e 47b6d9dc 12bc9401 62c44e64 d6f464bb de487d8c 7aaa2057 21893dc4 3ac24c00" "snaps": "8b9c3026 e0f96062 a49bbfa8 29d89b05 0acdd66d bf39de85 9e043da7 0a498624 5c13efec 75baddb9 67cc60f9 f89c8ba6 accd5980 82e3a003 3f66378b 9ba9488f cb51d386 8814422f b9132254 1419b8c7 784dfe12 10f61101 8fbaffd9"
}, },
"roster-034": { "roster-034": {
"about": "pass 1 band 6: chess_char_5_08_b chess_char_5_11_b chess_char_5_19_b chess_char_5_13_b chess_char_5_14_b chess_char_5_07_b chess_char_5_17_b chess_char_5_10_b chess_char_5_12_b chess_char_5_15_b chess_char_5_20_b chess_char_5_21_b", "about": "pass 1 band 6: chess_char_5_08_b chess_char_5_11_b chess_char_5_19_b chess_char_5_13_b chess_char_5_14_b chess_char_5_07_b chess_char_5_17_b chess_char_5_10_b chess_char_5_12_b chess_char_5_15_b chess_char_5_20_b chess_char_5_21_b",
@@ -2692,18 +2692,18 @@
"bossHpLeft": null, "bossHpLeft": null,
"rngDraws": 102, "rngDraws": 102,
"errors": {"count":0,"kinds":[]}, "errors": {"count":0,"kinds":[]},
"players": {"p1":{"killed":97,"total":119,"perfect":false,"leaks":22,"leaksUncounted":0,"coins":8,"dmg":3196440,"bossDmg":0,"heal":29602,"deaths":18,"layerGains":{}}}, "players": {"p1":{"killed":97,"total":119,"perfect":false,"leaks":22,"leaksUncounted":0,"coins":8,"dmg":3196490,"bossDmg":0,"heal":29602,"deaths":18,"layerGains":{}}},
"units": [ "units": [
["p1",1,"op","chess_char_5_19_a",1,null,3241,1,167,5,41218,11497,895,29,3], ["p1",1,"op","chess_char_5_19_a",1,null,3241,1,167,5,42811,11497,895,29,3],
["p1",2,"op","chess_char_5_11_b",2,"none",4564.8,1,169,4,21064,21466,23687,40,3], ["p1",2,"op","chess_char_5_11_b",2,"none",4564.8,1,169,4,21064,21466,23687,40,3],
["p1",3,"op","chess_char_5_19_b",1,"uniequip_002_mlynar",0,0,158,4,79275,11893,172,37,4], ["p1",3,"op","chess_char_5_19_b",1,"uniequip_002_mlynar",0,0,158,4,79275,11893,172,37,4],
["p1",4,"op","chess_char_5_13_b",2,"uniequip_004_ghost2",3412.8,1,9,5,146836,18085,143,21,2], ["p1",4,"op","chess_char_5_13_b",2,"uniequip_004_ghost2",3412.8,1,9,5,146836,18085,143,21,2],
["p1",5,"op","chess_char_5_14_b",2,"none",1994,1,168,11,231063,15046,2302,62,5], ["p1",5,"op","chess_char_5_14_b",2,"none",1994,1,168,10,229565,15046,2302,62,5],
["p1",6,"op","chess_char_5_17_b",2,"none",153.59,1,162,2,116401,14251,285,50,5], ["p1",6,"op","chess_char_5_17_b",2,"none",153.59,1,162,2,116401,14251,285,50,5],
["p1",7,"op","chess_char_5_20_a",1,null,1108,1,3,1,43321,1688,368,361,5], ["p1",7,"op","chess_char_5_20_a",1,null,1108,1,3,1,43321,1688,368,361,5],
["p1",8,"op","chess_char_5_22_a",2,null,1237,1,79,5,123577,5289,413,112,3], ["p1",8,"op","chess_char_5_22_a",2,null,1237,1,79,5,123577,5289,413,112,3],
["p1",9,"op","chess_char_5_12_b",2,"uniequip_004_dusk",1667,1,13,8,413532,0,0,63,2], ["p1",9,"op","chess_char_5_12_b",2,"uniequip_004_dusk",1667,1,13,8,413532,0,0,63,2],
["p1",10,"op","chess_char_5_15_b",2,"uniequip_002_thorn2",1170,1,14,38,1500942,0,0,175,6], ["p1",10,"op","chess_char_5_15_b",2,"uniequip_002_thorn2",1170,1,14,39,1500897,0,0,175,6],
["p1",11,"op","chess_char_5_20_b",1,"uniequip_004_aglina",1292,1,5,6,139374,1688,368,513,6], ["p1",11,"op","chess_char_5_20_b",1,"uniequip_004_aglina",1292,1,5,6,139374,1688,368,513,6],
["p1",12,"op","chess_char_5_22_b",2,"none",1511,1,11,8,326656,1913,398,155,3], ["p1",12,"op","chess_char_5_22_b",2,"none",1511,1,11,8,326656,1913,398,155,3],
["-","~1","device","trap_1105_accrate",null,null,100,1,1,0,0,0,0,0,null], ["-","~1","device","trap_1105_accrate",null,null,100,1,1,0,0,0,0,0,null],
@@ -2741,10 +2741,10 @@
"enemy_1502_crowns": [1,1,0,0,17916], "enemy_1502_crowns": [1,1,0,0,17916],
"enemy_2085_skzjxd": [1,0,1,0,27708] "enemy_2085_skzjxd": [1,0,1,0,27708]
}, },
"hooks": [1,169,6392,1856,1856,4793,4802,4572,133,155,47,45,0,25292,2502,134,119,22,1,137,0,0,0], "hooks": [1,169,6392,1856,1856,4806,4815,4572,133,155,47,45,0,25292,2500,134,119,22,1,137,0,0,0],
"events": {"atk":2202,"bounty":4,"deploy":48,"die":133,"dmg":4802,"engage":31,"fx":126,"heal":157,"leak":22,"skill":92,"spawn":152,"status":917}, "events": {"atk":2201,"bounty":4,"deploy":48,"die":133,"dmg":4815,"engage":31,"fx":126,"heal":157,"leak":22,"skill":92,"spawn":152,"status":917},
"fx": {"blink":1,"crit":17,"displace":34,"explode":5,"sp":11,"substitute":4,"summon":19,"swap":3,"teleport":9,"zone":23}, "fx": {"blink":1,"crit":17,"displace":34,"explode":5,"sp":11,"substitute":4,"summon":19,"swap":3,"teleport":9,"zone":23},
"snaps": "a39ea9a8 8c9edc9a a065676e 3404b1b0 c5e48361 e1141ee7 731907d0 35ea8479 ddbaef3d 5482db0f 24f79c23 1a11903e 1f6f9bf4 c6ce73f3 1e9e1c5b 86972b3e 9e39b85b 2ec9de5d e7d5989b 90b52fbd 7a512691 2515b778" "snaps": "a39ea9a8 e80ba854 5a7d8922 937a75f8 63bcd2cc 5b792ef2 74605095 8cde1b64 3d34ce14 0ba6b47a 25291a4a c4759cbb 4f089279 6b4a97f6 a901573a e5a3248f 0e14690a 229cc4f4 ce5e4276 6af66d94 7b8ead38 e61d788d"
}, },
"roster-045": { "roster-045": {
"about": "pass 2 band 6: chess_char_6_03_a chess_char_6_06_a chess_char_6_07_a chess_char_6_01_a chess_char_6_02_a chess_char_6_04_a chess_char_6_05_a chess_char_6_08_a chess_char_6_09_a chess_char_6_11_a chess_char_6_12_a chess_char_6_13_a token_10017_skadi2_dedant", "about": "pass 2 band 6: chess_char_6_03_a chess_char_6_06_a chess_char_6_07_a chess_char_6_01_a chess_char_6_02_a chess_char_6_04_a chess_char_6_05_a chess_char_6_08_a chess_char_6_09_a chess_char_6_11_a chess_char_6_12_a chess_char_6_13_a token_10017_skadi2_dedant",
@@ -0,0 +1,121 @@
// test/sim/feedback5-counters-any-damage.test.js — community report of 2026-10-06 (item 30) 「退行的潮涌者的攻击无法触发菲莱2技能
// 的受击反击(排查其他类似技能的干员)」. The enemy is 深溟巢涌者 / 富营养的巢涌者 (the 退行的巢涌者 of the main story): it makes no
// normal attack — its talent hurts every operator in range once a second (PRTS "无途径法术伤害"; buff_template_data
// enemy_dsubrl_aoe[aura]: an AdvancedApplyDamage with the enemy as its source). The official counters fire on ON_TAKE_DAMAGE —
// 菲莱 S2 philae_s_2 with no filter at all, the others on a source of the other side (inverse_damage — 星熊 S2 —,
// inverse_damage[magic] + nian_s_2 — 年 S2 —, bubble_s_2 / bubble_t_1 — 泡泡 —, vendla_s_2 — 刺玫 S2 —, yu_s_1[inverse_damage] —
// 余 S1 —, hsgma2_s_1 — 斩业星熊 S1 —, mlynar_t_2[inverse] — 玛恩纳 无动于衷) — but the remake took enemy attacks only.
// Now any damage instance from an enemy (kits/shared/tier1.js byEnemyAttack; 菲莱: any instance), never a 流失.
// Run: node --test test/sim/feedback5-counters-any-damage.test.js
import { test } from 'node:test';
import assert from 'node:assert/strict';
import { makeBattle, checkInvariants } from '../helpers/battleHarness.js';
const NEST = 'enemy_1234_dsubrl';
/**
* `units` on the flat field, a parked 深溟巢涌者 on `nestAt` (speed ×0: it pulses every operator within 1.6 every second and
* never attacks); `cast` = the unit whose skill is cast at once. Returns the harness after `seconds`.
*/
function nestFight(units, { cast = null, nestAt = [10, 5], seconds = 8 } = {}) {
const h = makeBattle({ seed: 7, autoFinish: false, timeLimit: 60, captureNoisy: true, hooks: ['damaged', 'attack'], units });
h.step();
const nest = h.spawn(NEST, { pos: nestAt, mods: { speedMul: 0 } });
if (cast) { const u = h.unit(cast); u.skill.gainSp(999, 'test'); if (!u.skill.active) assert.ok(u.skill.activate('test'), `${cast}: cast`); }
h.run(seconds);
checkInvariants(h.b);
return { h, nest };
}
const fromTo = (h, src, tgt, pred) => h.hooksOf('damaged').filter((c) => c.source === src && c.target === tgt && pred(c));
const tagged = (tag) => (c) => (c.dmg?.tags || []).includes(tag);
/** The pulses `u` took (the 巢涌者's arts instances; its 神经损伤 rider is an element 损伤, no counter's business). */
const pulsesOn = (h, nest, u) => fromTo(h, nest, u, (c) => c.type === 'arts').length;
test('the 巢涌者 never attacks — its pulse is the only damage it deals (the operators take it)', () => {
const { h, nest } = nestFight([{ chessId: 'chess_char_4_17_a', row: 10, col: 4, skillIndex: 1 }]);
assert.equal(h.hooksOf('attack').filter((c) => c.attacker === nest).length, 0, 'no normal attack');
const pulses = h.hooksOf('damaged').filter((c) => c.source === nest && c.target.side === 'ally');
assert.ok(pulses.length >= 3, `pulses ${pulses.length}`);
assert.ok(pulses.every((c) => !c.dmg.isAttack), 'not an attack');
});
test('菲莱 S2 冥河诅咒: the pulse sets off her blast (every 2 s at most) — until 0.2.0 it never did', () => {
for (const id of ['chess_char_3_06_a', 'chess_char_3_06_b']) {
const { h, nest } = nestFight([{ chessId: id, row: 10, col: 4, skillIndex: 1 }], { cast: id });
const u = h.unit(id);
const n = pulsesOn(h, nest, u);
const blasts = fromTo(h, u, nest, tagged('counter'));
assert.ok(n >= 4, `${id}: ${n} pulses`);
assert.equal(blasts.length, Math.ceil(n / 2), `${id}: ${blasts.length} blasts for ${n} pulses a second apart (aoe_cd 2 s)`);
}
});
test('星熊 S2 荆棘, 泡泡 “挨打” (+ 尖刺盾), 余 S1, 玛恩纳 无动于衷: each answers the pulse', () => {
const each = (label, f, unitId, pred) => {
const u = f.h.unit(unitId), n = pulsesOn(f.h, f.nest, u);
assert.ok(n >= 4, `${label}: ${n} pulses`);
assert.equal(fromTo(f.h, u, f.nest, pred).length, n, `${label}: one answer per pulse`);
};
each('星熊 S2 荆棘', nestFight([{ chessId: 'chess_char_4_17_a', row: 10, col: 4, skillIndex: 1 }]), 'chess_char_4_17_a', tagged('counter'));
const bb = nestFight([{ chessId: 'chess_char_2_08_a', row: 10, col: 4, skillIndex: 1 }], { cast: 'chess_char_2_08_a' });
each('泡泡 S2 “挨打”', bb, 'chess_char_2_08_a', tagged('counter'));
assert.ok(bb.nest.findBuff('bubble:spike'), '泡泡 尖刺盾 on the pulse\'s source');
// 余 S1 — the 灼燃损伤 rider: once the 巢涌者's gauge bursts, its 爆发冷却 refuses further fills, so count the answers that landed
const yu = nestFight([{ chessId: 'chess_char_6_03_a', row: 10, col: 4, skillIndex: 0 }], { cast: 'chess_char_6_03_a' });
const yuN = fromTo(yu.h, yu.h.unit('chess_char_6_03_a'), yu.nest, (c) => c.type === 'element').length;
assert.ok(yuN >= 3, `余 S1 灼燃损伤: ${yuN} answers`);
each('玛恩纳 无动于衷', nestFight([{ chessId: 'chess_char_5_19_a', row: 10, col: 4 }]), 'chess_char_5_19_a', tagged('reflect'));
});
test('刺玫 S2 荆藤庇荫: a pulse on her protégé is answered (the counter names the protégé for her trait heal)', () => {
const { h, nest } = nestFight([
{ chessId: 'chess_char_1_06_a', row: 10, col: 3, skillIndex: 1 },
{ chessId: 'chess_char_4_17_a', row: 10, col: 4, skillIndex: 0 },
], { cast: 'chess_char_1_06_a' });
const v = h.unit('chess_char_1_06_a'), p = v.mem.protege;
assert.ok(p && p.defId === 'chess_char_4_17_a', 'the protégé');
const hits = fromTo(h, v, nest, tagged('counter'));
const n = pulsesOn(h, nest, p);
assert.ok(n >= 4, `${n} pulses on the protégé`);
assert.equal(hits.length, n, `one counter per pulse on the protégé (${hits.length})`);
assert.ok(hits.every((c) => c.dmg.traitAlly === p));
});
test('自选 年 S2 铜印 and 斩业星熊 S1 恶业苦果 answer the pulse too', () => {
const ni = nestFight([{ diy: { slot: 6, charId: 'char_2014_nian', skillIndex: 1 }, row: 10, col: 4 }]);
const n = ni.h.allies().find((u) => u.def?.charId === 'char_2014_nian' || u.charId === 'char_2014_nian' || /nian/.test(u.def?.diy?.charId ?? ''));
assert.ok(n, '年 fielded');
n.skill.gainSp(999, 'test');
if (!n.skill.active) n.skill.activate('test');
const before = pulsesOn(ni.h, ni.nest, n);
ni.h.run(6);
assert.ok(fromTo(ni.h, n, ni.nest, tagged('counter')).length >= pulsesOn(ni.h, ni.nest, n) - before && pulsesOn(ni.h, ni.nest, n) - before >= 4, '年 S2');
assert.ok(ni.nest.findBuff('silence') || ni.nest.s.flags.silence, '年 S2 silences the source');
const hm = nestFight([{ diy: { slot: 6, charId: 'char_1044_hsgma2', skillIndex: 0 }, row: 10, col: 4 }]);
const s = hm.h.allies()[0];
s.skill.gainSp(999, 'test');
if (!s.skill.active) s.skill.activate('test');
const before2 = pulsesOn(hm.h, hm.nest, s);
hm.h.run(6);
assert.ok(fromTo(hm.h, s, hm.nest, tagged('counter')).length >= pulsesOn(hm.h, hm.nest, s) - before2 && pulsesOn(hm.h, hm.nest, s) - before2 >= 4, '斩业星熊 S1');
});
test('never a 流失: an enemy\'s HP loss on 星熊 sets no 荆棘 off; another counter / reflection does not either', () => {
const h = makeBattle({ seed: 7, autoFinish: false, timeLimit: 60, captureNoisy: true, hooks: ['damaged'],
units: [{ chessId: 'chess_char_4_17_a', row: 10, col: 4, skillIndex: 1 }] });
h.step();
const nest = h.spawn(NEST, { pos: [10, 8], mods: { speedMul: 0 } }); // out of pulse range
const u = h.unit('chess_char_4_17_a');
u.skill.gainSp(999, 'test');
if (!u.skill.active) u.skill.activate('test');
h.step();
h.b.loseHp(u, 10, { source: nest });
h.b.dealDamage(nest, u, { amount: 10, type: 'true', tags: ['counter'] });
h.b.dealDamage(nest, u, { amount: 10, type: 'true', tags: ['reflect'] });
assert.equal(fromTo(h, u, nest, tagged('counter')).length, 0, 'none of the three');
h.b.dealDamage(nest, u, { amount: 10, type: 'true' }); // (true damage: her 战术装甲 negates only phys / arts)
assert.equal(fromTo(h, u, nest, tagged('counter')).length, 1, 'a plain damage instance does');
checkInvariants(h.b);
});