diff --git a/docs/SIM.md b/docs/SIM.md index 610e6573..cb082175 100644 --- a/docs/SIM.md +++ b/docs/SIM.md @@ -1186,7 +1186,7 @@ S3 未照耀的荣光 — its CUSTOM_RANGE trigger also counts flyers). A stun / 3.75 back = `BOOMERANG_RETURN_SPEED`, PRTS 跃跃; droneBomb 5 = 暴鸰's bomb, the official projectile_bombd); melee/`none` hits are instant, and so are `'beam'` hits (a 锁定攻击范围 AoE without a projectile — `rangeAoe` profiles: "在攻击前摇结束时选取范围内的全体目标,同时造成伤害", PRTS 作战机制). Kit-settable profile flags beyond the table: `hitSleep` (targets and damages sleeping enemies — "可以攻击沉睡的敌人"), `onEachHit(b, u, victim, hctx)`, `dmgMul`, -`afterHit`, `afterAttack`, `canAttack`, `hitsFn`, `priority` (targeting.js PRIORITY_FNS — `'heaviest'`: the 攻城手 trait +`afterHit`, `afterAttack`, `canAttack`, `hitsFn(b, u, info)`, `storeEnergy` / `releaseEnergy` (the 秘术师 store, below), `priority` (targeting.js PRIORITY_FNS — `'heaviest'`: the 攻城手 trait "优先攻击重量最重的敌人", the highest current 重量等级 first: 早露 / 提丰; `'elite'`: "优先攻击精英或领袖敌人", an ELITE / BOSS rank enemy or a leader first: 薇薇安娜 S3), `blockFly`, `noHeal`, `skipEnemy(e)` (an enemy the unit never selects — its attacks, the enemies it blocks and its skill-trigger targets: targeting.js canTargetEnemy; 嵯峨 "不攻击重伤 @@ -1209,7 +1209,7 @@ header of professions.js). | reaperrange | hits every enemy in range; ×1.5 (bb atk_scale) on the trait front grid (or its own line ahead) — both along its direction | | chain | chain N (trait text/bb max_target) with −15 % per jump (bb chain.atk_scale), 1.7-tile jumps (constants.js CHAIN_RADIUS, PRTS 溅射半径一览: 链术师 1.7; 1.8 until 0.1.1), sluggish on each hit | | funnel | drone damage 20 % → +15 %/hit on the same target → 110 % (bb init/delta/max) | -| mystic | stores up to 3 (bb times) attacks while idle, fires them all at once | +| mystic | 秘术师 (PRTS 分支特性信息 秘术师, GitHub #181): at its attack check (the attack ready, able to act, not disarmed) with no valid target — no target, or its kit's `canAttack` false (深靛 never picks a bound enemy) — it stores one energy (`storeEnergy`, up to bb times: 3, 深靛's MSC-X 4), an attack action: the attack interval restarts; a full store idles with the attack ready. The energies leave with its next attack that happens (`releaseEnergy` in `performAttack`, after `beforeAttack`: an attack cancelled before its shot keeps them) and land with the main hit, one arts attack hit each (`hitsFn` reads the hit's `info.energy`); a redeployment holds none [ASSUMED]. 维伊 / 黑键 plug their own `storeEnergy` (转置能量, elite energies) into the same check | | phalanx | no attack & DEF +200 %, RES +20 (bb) while the skill is off; while on, `rangeAoe`: each attack strikes every selectable enemy on its range at once (blocked enemies included; a stealthed one only when revealed or blocked), the same damage near and far, instant (`'beam'`) — "群体法术伤害" (secondary: Terra Wiki, Phalanx Caster: "attacks hit all enemies within their range"; supporting: PRTS 林 S3 备注 "单次普攻最多触发1次效果" — one normal attack can kill several — the same 锁定攻击范围 shape as the 轰击术师, and PRTS 溅射半径一览 documents no splash radius for it (it omits the 撼地者 too, so this is not proof); no primary source states a target cap; community report E3: it used to be one bolt + a 1.1 splash). 卡涅利安's charged S1 keeps the skill-off trait, 不攻击 included (kit `canAttack`, PRTS 备注) | | physician | heal the lowest HP% injured ally in range (a skill `targeting.maxTargets` widens any heal profile) | | ringhealer | heal 3 allies | diff --git a/server/sim/ai.js b/server/sim/ai.js index 9499d528..435204aa 100644 --- a/server/sim/ai.js +++ b/server/sim/ai.js @@ -79,20 +79,30 @@ export function updateAlly(b, u, dt) { if (prof.noAttackUnlessSkill && !(sk && sk.active)) return; if (u.s.flags.disarm) return; if (u.atkCd > 0) return; - if (prof.canAttack && !prof.canAttack(b, u)) return; + // (a 秘术师's `canAttack` is its own target rule: false = no valid target — 深靛's bound enemies, 维伊's marked ones) + if (prof.canAttack && !prof.canAttack(b, u)) { if (prof.storeEnergy) { u.trait.hadTarget = false; storeEnergy(b, u, prof); } return; } let targets = acquireTargets(b, u, prof); - if (!targets.length) { u.trait.hadTarget = false; return; } + if (!targets.length) { u.trait.hadTarget = false; storeEnergy(b, u, prof); return; } u.trait.hadTarget = true; if (sk && sk.onAboutToAttack()) { prof = effectiveProfile(u); if (prof.noAttack || !u.alive) return; targets = acquireTargets(b, u, prof); - if (!targets.length) return; + if (!targets.length) { storeEnergy(b, u, prof); return; } // the cast left none (a range change): still this check } performAttack(b, u, prof, targets); u.atkCd = Math.max(u.atkCd, u.s.interval); } +/** + * The attack check of a ready unit found no valid target: a 秘术师 profile stores one energy instead (`storeEnergy`, + * professions.js installMystic — PRTS 分支特性信息 秘术师 "若无有效目标且能量储存数未满,则改为储存一份攻击能量(属于攻击 + * 行为)": the attack interval starts again); with a full store it idles, ready to attack. + */ +function storeEnergy(b, u, prof) { + if (prof.storeEnergy && prof.storeEnergy(b, u)) u.atkCd = Math.max(u.atkCd, u.s.interval); +} + /** Release blocked enemies beyond the current block capacity (latest blocked first). */ export function enforceBlockCapacity(b, u) { const cap = u.alive && u.deployed ? u.s.blockCnt : 0; @@ -174,11 +184,13 @@ export function performAttack(b, u, prof, targets, opts = null) { } const ranged = !prof._fortressMelee && prof.attack === 'ranged' && prof.projectile && prof.projectile !== 'none' && prof.projectile !== 'beam'; const vis = prof._fortressMelee ? 'none' : (prof.projectile || 'none'); + // 秘术师: the stored energies leave with this attack, at its main target (professions.js installMystic) + const energy = !isHeal && prof.releaseEnergy ? prof.releaseEnergy(b, u) : 0; for (let i = 0; i < targets.length; i++) { const t = targets[i]; b._ev(['atk', u.id, t.id, vis]); if (isHeal) { doHeal(b, u, prof, t); continue; } - const info = { isSkill, index: i, attackId }; + const info = { isSkill, index: i, attackId, energy: i === 0 ? energy : 0 }; const foe = t.side === 'enemy' || b.isAllyTarget(t); if (ranged && foe && prof.projectile === 'boomerang') { throwBoomerang(b, u, prof, t, info); @@ -260,7 +272,7 @@ export function resolveHit(b, u, prof, target, info, x, y) { if (target && target.alive) { let mulT = skillMul; if (prof.dmgMul) { const m = typeof prof.dmgMul === 'function' ? prof.dmgMul(b, u, target) : prof.dmgMul; if (Number.isFinite(m)) mulT *= m; } - const hits = prof.hitsFn ? prof.hitsFn(b, u) : Math.max(1, prof.hits || 1); + const hits = prof.hitsFn ? prof.hitsFn(b, u, info) : Math.max(1, prof.hits || 1); let dealtMain = 0; for (let h = 0; h < hits && target.alive; h++) { dealtMain += b.dealDamage(u, target, { amount: atk * scale * mulT, type: baseType, isAttack: true, isSkill: info.isSkill, tags: prof.tags || [], attackId }); diff --git a/server/sim/content/kits/ops/chess_char_1_17-indigo.js b/server/sim/content/kits/ops/chess_char_1_17-indigo.js index 2b6e65de..f42ae20d 100644 --- a/server/sim/content/kits/ops/chess_char_1_17-indigo.js +++ b/server/sim/content/kits/ops/chess_char_1_17-indigo.js @@ -11,7 +11,8 @@ export default { // 柔光缚目: attacks bind the target `duration` s with `prob`; bound enemies are never chosen as targets. // Alternate S1 灯塔守卫者: for `duration` s the skill range (4-1), attack interval ×(1 + base_attack_time) (PRTS: // "大幅度缩短(-80%)" ⇒ ×0.2 — a flat −0.8 s on 3 s would be less than S2's "略微缩短 ×0.7"), every attack hits for - // attack@atk_scale × ATK arts. Elite module MSC-X (store 4) is the mystic profile of the module trait (TUNE.mystic). + // attack@atk_scale × ATK arts. Elite module MSC-X (store 4) is the mystic profile of the module trait (TUNE.mystic); + // the store itself is the shared 秘术师 profile (professions.js installMystic: at the attack check, PRTS 分支特性信息). chess_char_1_17_a: (bb, chess, def) => { const t = talentBb(chess, 0); const dScale = num(bb['indigo_s_2[damage].atk_scale']); @@ -28,12 +29,11 @@ export default { }, }, trait: { - // with only bound enemies in range (or blocked by her — always her targets, Battle.blockedTargets) she holds her - // fire (the mystic trait stores the energy meanwhile) + // with only bound enemies in range (or blocked by her — always her targets, Battle.blockedTargets) she has no valid + // target: she holds her fire and the mystic trait stores an energy at the attack check (professions.js + // installMystic; a bind on her only target included) canAttack(battle, u) { - const ok = battle.enemiesInKeys(u.rangeKeys, u, u.profile).some((e) => !bound(e)) || battle.blockedTargets(u, u.profile).some((e) => !bound(e)); - if (!ok) u.trait.hadTarget = false; - return ok; + return battle.enemiesInKeys(u.rangeKeys, u, u.profile).some((e) => !bound(e)) || battle.blockedTargets(u, u.profile).some((e) => !bound(e)); }, afterHit(battle, u, target) { if (!target || !target.alive || target.side !== 'enemy') return; diff --git a/server/sim/content/kits/ops/op-ebnhlz.js b/server/sim/content/kits/ops/op-ebnhlz.js index 5bc3ef9f..f66b3e32 100644 --- a/server/sim/content/kits/ops/op-ebnhlz.js +++ b/server/sim/content/kits/ops/op-ebnhlz.js @@ -12,8 +12,8 @@ // - Trait (秘术师) "攻击造成法术伤害,在找不到攻击目标时可以将攻击能量储存起来之后一齐发射(最多3个)" (bb times; MSC-X 4): // ranged arts bolts, hits air units (分支特性信息 "可对空"), blocks 1, ground enemies target him. The store (分支特性信息: // "能量储存与攻击占用相同的攻击间隔:…若无有效目标且能量储存数未满,则改为储存一份攻击能量(属于攻击行为)"): when his attack is -// ready and he has no valid target he stores one energy and his attack interval starts again — this kit's own store, -// as 维伊's (op-veen.js; the engine's mystic profile stores one interval after the attack is ready). His next attack +// ready and he has no valid target he stores one energy and his attack interval starts again — the shared 秘术师 +// profile (professions.js installMystic) with this kit's `storeEnergy` (his elite energy, S3), as 维伊's. His next attack // releases them at its target ("一齐发射"), each hitting for ATK × the attack's scale × the energy scale (talent 1) as // an arts 普通伤害 attack hit ("由储存能量形成的弹道造成攻击力100%的法术普通伤害"); they land with the main bolt (one // volley to one target [ASSUMED], as 维伊's), the later ones only on a target still alive. [ASSUMED] a redeployment holds @@ -60,9 +60,8 @@ // only elite ones, and at its end at most times_2 stay elite, the rest normal (up to times). "可主动关闭" is a manual // operation (no automatic stop). -import { num, talentBb, moduleBb, traitBb, skillRec, batMod, up, toggleBuff } from '../shared/tier1.js'; +import { num, talentBb, moduleBb, traitBb, skillRec, batMod, toggleBuff } from '../shared/tier1.js'; import { canTargetEnemy, sortEnemyTargets } from '../../../targeting.js'; -import { acquireTargets, effectiveProfile } from '../../../ai.js'; import { hasHp } from '../../../damage.js'; import { COLS } from '../../../constants.js'; @@ -204,21 +203,19 @@ export default { trait: { hitsFn: () => 1, // the engine's main hit only: the stored energies are this kit's (land) onEachHit(battle, unit, victim, hc) { if (hc.kind === 'main' && victim && victim.side === 'enemy') land(battle, unit, victim, hc); }, + // the store (the shared profile calls it at his attack check with no valid target — professions.js installMystic: + // an attack action, the interval restarts): the trait's energies first, then the elite one; during S3 elite ones + // only (false = a full store: he idles) + storeEnergy(battle, unit) { + const v = stateOf(unit); + if (skillOn(unit, S3)) { if (v.n + v.e >= N + E) return false; v.e++; } + else if (v.n < N) v.n++; + else if (v.e < E) v.e++; + else return false; + return true; + }, install(battle, unit) { battle.on('deploy', (ctx) => { if (ctx.unit === unit && !ctx.move) unit.trait.ebn = null; }, { owner: unit }); - // the store: his attack ready and no valid target ⇒ one energy, an attack action (the interval restarts); the - // attack loop ran first this tick (a valid target was attacked instead) - battle.on('tick', () => { - if (!up(unit) || !unit.canAct || unit.s.flags.disarm || unit.atkCd > 0) return; - const prof = effectiveProfile(unit); - if (prof.noAttack || acquireTargets(battle, unit, prof).length) return; - const v = stateOf(unit); - if (skillOn(unit, S3)) { if (v.n + v.e >= N + E) return; v.e++; } - else if (v.n < N) v.n++; - else if (v.e < E) v.e++; - else return; - unit.atkCd = unit.s.interval; - }, { owner: unit }); battle.on('death', (ctx) => { if (ctx.unit && ctx.unit.side === 'enemy') stateOf(unit).q.delete(ctx.unit.id); }, { owner: unit }); }, }, diff --git a/server/sim/content/kits/ops/op-veen.js b/server/sim/content/kits/ops/op-veen.js index 64b018ef..9e15b13f 100644 --- a/server/sim/content/kits/ops/op-veen.js +++ b/server/sim/content/kits/ops/op-veen.js @@ -9,9 +9,9 @@ // - Trait (秘术师) "攻击造成法术伤害,在找不到攻击目标时可以将攻击能量储存起来之后一齐发射" (ranged arts, hits air units, // targetable by ground enemies). PRTS 分支特性信息 秘术师: "能量储存与攻击占用相同的攻击间隔:在进行攻击判定时,若范围内存在 // 有效目标,则进行普通攻击;若无有效目标且能量储存数未满,则改为储存一份攻击能量(属于攻击行为)" — when her attack is ready -// and she has no valid target she stores one energy and her attack interval starts again (this kit replaces the -// engine's mystic profile, which stores one interval after the attack is ready); the energies fly with her next attack, -// at its target ("由储存能量形成的弹道造成攻击力100%的法术普通伤害"). +// and she has no valid target she stores one energy and her attack interval starts again (the shared 秘术师 profile, +// professions.js installMystic, with this kit's `storeEnergy`); the energies fly with her next attack, at its target +// ("由储存能量形成的弹道造成攻击力100%的法术普通伤害"). // T1 “在挥刀之前” "特性储存的能量达到3个时,合成为1个转置能量(至多储存等同于9倍的能量)" (trait bb merge_cnt 3, times 9): // 3 stored make 1 转置能量, at most times / merge_cnt of those, then no more storing (备注 "转置能量数量达到上限时,停止储存 // 攻击能量"); a 转置能量 hits for merge_cnt × ATK (备注 "攻击力300%的法术普通伤害"). Every shot uses the ATK it left with @@ -39,7 +39,7 @@ // preferring an enemy not hit yet by it, else another one, else the same (text "优先不同目标" [ASSUMED order]), each // attack@bounce_atk_scale × the cached ATK arts. The skill ends when the bullets run out. -import { num, talentBb, moduleBb, traitBb, skillRec, batMod, up, toggleBuff } from '../shared/tier1.js'; +import { num, talentBb, moduleBb, traitBb, skillRec, batMod, toggleBuff } from '../shared/tier1.js'; import { canTargetEnemy, sortEnemyTargets } from '../../../targeting.js'; const S1 = 'skchr_veen_1'; @@ -146,23 +146,19 @@ export default { trait: { hitsFn: () => 0, // the volley's hits are the kit's (land) onEachHit(battle, unit, victim, hc) { if (hc.kind === 'main' && victim && victim.side === 'enemy') land(battle, unit, victim, hc.attackId, !!hc.isSkill); }, - // only enemies under her 战争技艺 in range: she holds her fire (and stores energy) - canAttack(battle, u) { - const ok = validTargets(battle, u, u.profile).length > 0; - if (!ok) u.trait.hadTarget = false; - return ok; + // only enemies under her 战争技艺 in range: no valid target — she holds her fire (and stores energy) + canAttack(battle, u) { return validTargets(battle, u, u.profile).length > 0; }, + // the mystic store (the shared profile calls it at her attack check with no valid target — professions.js + // installMystic: an attack action, the interval restarts): one energy, 3 merge into a 转置能量; none once the + // 转置能量 are at their cap (a full store: she idles) + storeEnergy(battle, unit) { + const v = stateOf(unit); + if (v.t >= tMax) return false; + if (++v.s >= merge) { v.s -= merge; v.t++; } + return true; }, install(battle, unit) { battle.on('deploy', (ctx) => { if (ctx.unit === unit) unit.trait.veen = null; }, { owner: unit }); - // the mystic store: her attack ready and no valid target ⇒ one energy, an attack action (the interval restarts); - // 3 merge into a 转置能量 (the attack loop ran first this tick: a valid target was attacked instead) - battle.on('tick', () => { - const v = stateOf(unit); - if (!up(unit) || !unit.canAct || unit.s.flags.disarm || unit.atkCd > 0 || v.t >= tMax) return; - if (validTargets(battle, unit, unit.profile).length) return; - if (++v.s >= merge) { v.s -= merge; v.t++; } - unit.atkCd = unit.s.interval; - }, { owner: unit }); battle.on('death', (ctx) => { if (ctx.unit && ctx.unit.side === 'enemy') stateOf(unit).q.delete(ctx.unit.id); }, { owner: unit }); }, }, diff --git a/server/sim/professions.js b/server/sim/professions.js index 8a8f0fae..5701a638 100644 --- a/server/sim/professions.js +++ b/server/sim/professions.js @@ -24,7 +24,10 @@ // skipEnemy(enemy) → bool (an enemy the unit never selects — targeting.js canTargetEnemy; 嵯峨 "不攻击重伤单位") // healThrough(healer, ally) → bool (a healer that selects and heals that ally through its 禁疗 — Battle // injuredAlliesInKeys, damage.js heal; 凯尔希 on her Mon3tr) -// hitsFn(battle, unit) → n install(battle, unit) — per-unit hooks, called once at setup +// hitsFn(battle, unit, info) → n (info: the hit's { isSkill, index, attackId, energy }) +// install(battle, unit) — per-unit hooks, called once at setup +// storeEnergy(battle, unit) → bool / releaseEnergy(battle, unit) → n (秘术师: the attack check found no valid target ⇒ +// store one energy, false when full; the energies leaving with an attack — installMystic) // dollNoAttack bool (傀儡师: its <替身> makes no normal attack and casts no skill — 归溟幽灵鲨, kit trait) // tb — the unit's trait blackboard (data `trait.bb`), used for tunables (module upgrades included on elites) // Behaviour per subprofession is documented in docs/SIM.md §Professions. Front / side tests use the unit's direction @@ -362,16 +365,23 @@ const installFunnel = (battle, unit) => { unit.trait.funnelScale = unit.profile.funnel?.init ?? 0.2; }; +/** + * 秘术师 (mystic) trait "攻击造成法术伤害,在找不到攻击目标时可以将攻击能量储存起来之后一齐发射(最多3个)" (bb times; 深靛's + * MSC-X 4) with the branch rules of PRTS 分支特性信息 秘术师: "能量储存与攻击占用相同的攻击间隔:在进行攻击判定时,若范围内存在 + * 有效目标,则进行普通攻击;若无有效目标且能量储存数未满,则改为储存一份攻击能量(属于攻击行为);仅没有有效目标,且能量储存数已满的 + * 情况下才进入待机状态". The attack loop (ai.js updateAlly) calls the profile's `storeEnergy` at its attack check — the attack + * ready, the unit able to act and not disarmed (PRTS 异常效果 缴械 "秘术师储存能量同样无法进行") — when it finds no valid target + * (no target, or the profile's `canAttack` false: a 秘术师 kit's own target rule — 深靛 never picks a bound enemy, so a bind + * on her only target is no valid target); a stored energy restarts the attack interval, a full store idles (the next + * valid target is attacked at once). The energies leave with the next attack that happens (`releaseEnergy`, called by + * performAttack after `beforeAttack`: "攻击被打断且弹道未能成功生成的情况下,储存的能量不会被消耗") with its main target and land + * with its main hit, one damage instance each (`hitsFn`; "由储存能量形成的弹道造成攻击力100%的法术普通伤害" — each as the + * main hit). [ASSUMED] a redeployment holds no energy (a free move — 乌尔比安 S3 — keeps them). Kits with their own store + * (维伊's 转置能量, 黑键's elite energies) replace `storeEnergy` and release theirs from an `attack` hook. + */ const installMystic = (battle, unit) => { unit.trait.stored = 0; - const max = unit.profile.storeMax ?? 3; - battle.on('tick', () => { - if (!unit.canAct) return; - if (unit.atkCd <= 0 && !unit.trait.hadTarget && unit.trait.stored < max) { - unit.trait.storeAcc = (unit.trait.storeAcc ?? 0) + battle.dt; - if (unit.trait.storeAcc >= unit.s.interval) { unit.trait.storeAcc = 0; unit.trait.stored++; } - } - }, { owner: unit }); + battle.on('deploy', (ctx) => { if (ctx.unit === unit && !ctx.move) unit.trait.stored = 0; }, { owner: unit }); }; /** Refresh period / lifetime (s) of a bard trait's 生命回复速度 buff: it lapses within BARD_REGEN_DUR once the bard stops. */ @@ -480,7 +490,14 @@ export const SUB = Object.freeze({ return unit.trait.funnelScale; } }), mystic: P({ install: installMystic, - hitsFn: (battle, unit) => { const n = 1 + (unit.trait.stored ?? 0); unit.trait.stored = 0; return n; } }), + storeEnergy: (battle, unit) => { + const n = unit.trait.stored ?? 0; + if (n >= (unit.profile.storeMax ?? 3)) return false; + unit.trait.stored = n + 1; + return true; + }, + releaseEnergy: (battle, unit) => { const n = unit.trait.stored ?? 0; unit.trait.stored = 0; return n; }, + hitsFn: (battle, unit, info) => 1 + (info?.energy ?? 0) }), phalanx: P({ noAttackUnlessSkill: true, rangeAoe: true, install: installPhalanx }), primcaster: P({}), corecaster: P({}), diff --git a/test/golden/bonds.json b/test/golden/bonds.json index eba20f3d..69acd02c 100644 --- a/test/golden/bonds.json +++ b/test/golden/bonds.json @@ -931,14 +931,14 @@ "total": 24, "unspawned": 0, "bossHpLeft": null, - "rngDraws": 21, + "rngDraws": 19, "errors": {"count":0,"kinds":[]}, - "players": {"p1":{"killed":24,"total":24,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":144293,"bossDmg":0,"heal":1227,"deaths":2,"layerGains":{}}}, + "players": {"p1":{"killed":24,"total":24,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":144433,"bossDmg":0,"heal":1227,"deaths":2,"layerGains":{}}}, "units": [ ["p1",1,"op","chess_char_4_11_b",1,"uniequip_002_cathy",1459,1,8,0,0,1837,0,0,1], ["p1",2,"op","chess_char_4_09_b",1,"uniequip_002_mizuki",3992.8,1,6,0,0,0,0,0,0], - ["p1",3,"op","chess_char_1_09_b",1,"uniequip_002_caper",3876.25,1,4,12,50704,0,0,12,1], - ["p1",4,"op","chess_char_1_17_b",1,"uniequip_002_indigo",1356,1,5,0,0,0,0,8,1], + ["p1",3,"op","chess_char_1_09_b",1,"uniequip_002_caper",3876.25,1,4,10,41957,0,0,10,1], + ["p1",4,"op","chess_char_1_17_b",1,"uniequip_002_indigo",1356,1,5,2,8886,0,0,4,1], ["p1",5,"op","chess_char_2_01_b",1,"uniequip_002_excu",0,0,11,6,38016,2146,0,6,1], ["p1",6,"op","chess_char_4_10_b",1,"uniequip_002_aroma",1664,1,7,5,53097,0,0,7,1], ["p1",7,"op","chess_char_4_12_b",2,"uniequip_002_glady",2232,1,9,0,948,1227,1227,2,1], @@ -950,10 +950,10 @@ ["-","~3","device","trap_1105_accrate",null,null,100,1,3,0,0,0,0,0,null] ], "enemies": {"enemy_1019_jshoot_2":[7,7,0,3373,21773],"enemy_1299_ymkilr_2":[3,3,0,1837,38016],"enemy_1422_lrsldr_2":[14,14,0,0,88704]}, - "hooks": [1,37,2071,84,84,166,166,663,26,26,7,6,0,4290,103,10,24,0,1,26,0,0,0], - "events": {"atk":84,"deploy":10,"die":26,"dmg":166,"engage":5,"fx":21,"skill":13,"spawn":37,"status":10}, + "hooks": [1,37,2071,78,78,164,164,663,26,26,7,6,0,4290,103,10,24,0,1,26,0,0,0], + "events": {"atk":78,"deploy":10,"die":26,"dmg":164,"engage":5,"fx":21,"skill":13,"spawn":37,"status":10}, "fx": {"crit":2,"frostNova":1,"levitate":7,"overclock":1,"pull":1,"slippery":1,"strike":2,"tornado":1,"tornadoPulse":5}, - "snaps": "1c35197a b5a550c2 449f2d84 3e5d7032 3c466668 15903287 c2362cab" + "snaps": "1c35197a b5a550c2 449f2d84 3e5d7032 3c466668 eebb398a 6f954892" }, "bond-raidShip-low": { "about": "突袭 low: tier 1 layers 1; chess_char_4_17_a chess_char_4_18_a chess_char_2_09_a chess_char_4_19_a chess_char_1_18_a chess_char_4_13_a chess_char_4_14_a chess_char_4_20_a", diff --git a/test/golden/diy.json b/test/golden/diy.json index 0e37fa91..f28eada4 100644 --- a/test/golden/diy.json +++ b/test/golden/diy.json @@ -1303,10 +1303,10 @@ ["-","~3","device","trap_1105_accrate",null,null,100,1,3,0,0,0,0,0,null] ], "enemies": {"enemy_10124_uashld_2":[12,0,12,1215,103016],"enemy_1043_zomsbr":[72,22,50,4183,401369],"enemy_1061_zomshd":[30,1,29,10796,355420]}, - "hooks": [1,136,6081,591,591,3365,3365,45973,35,126,19,18,39,24319,0,14,114,91,1,35,0,0,0], + "hooks": [1,136,6081,591,591,3365,3365,45970,35,126,19,18,39,24319,0,14,114,91,1,35,0,0,0], "events": {"atk":591,"deploy":19,"die":35,"dmg":3365,"engage":12,"fx":96,"leak":91,"skill":37,"spawn":129}, "fx": {"veenBounce":42,"veenVolley":54}, - "snaps": "10719944 a54473e5 586c12a4 e8572e94 cd658a5e 022bbca2 6875176a 88f39323 fe22255b b8659b38 b3436607 2bff9df5 448c5d3c bae393b0 7569d588 d5f887b5 1075cb4d 45d53303 6b53b401 8529d78b ee4d40ec" + "snaps": "10719944 a54473e5 586c12a4 e8572e94 cd658a5e 022bbca2 6875176a 88f39323 fe22255b b8659b38 b3436607 2bff9df5 448c5d3c 8f75174d 018a491f 6d520745 2a3af51d deab5773 1ce3e091 1f2d9d7b 8058d2fc" }, "diy-033": { "about": "5_diy1_a=zuole/S1 5_diy2_a=zuole/S2 5_diy1_a=zuole/S3 5_diy2_b=zuole/S1 5_diy1_b=zuole/S2 5_diy2_b=zuole/S3 6_diy1_b=veen/S1 6_diy2_b=veen/S2 6_diy1_b=veen/S3 6_diy2_b=veen/S1/002_veen 6_diy1_b=veen/S2/002_veen 6_diy2_b=veen/S3/002_veen", @@ -4905,7 +4905,7 @@ "hooks": [1,218,6170,550,550,2484,2286,0,140,209,72,69,61,11555,18,37,189,65,1,153,0,0,0], "events": {"atk":913,"deploy":26,"die":144,"dmg":2286,"engage":11,"fx":143,"leak":65,"skill":141,"spawn":208,"status":408}, "fx": {"aoe":4,"dash":3,"displace":8,"ember":13,"pull":8,"shieldBreak":37,"summon":36,"takeoff":9,"telegraph":13,"volley":12}, - "snaps": "97d774f4 d56f2c40 38cfa54f 7e2be674 45424794 b549bc6d d02f3886 8eef35d8 186b734d ef22c4fe 6eed958f 1c82384a 2d257b7e e4c0bf84 b322c2f5 561c30ac c139ed4b 0f61007b e04f8bf8 c8e87b59 3c8fbdd4" + "snaps": "97d774f4 d56f2c40 38cfa54f 7e2be674 45424794 b549bc6d d02f3886 8eef35d8 186b734d ef22c4fe 6eed958f 1c82384a 63c04f9f c0a490ec c9ea14b7 fff9beee 565171e7 63cf5cdd 2e3d5bf0 137417b4 ba76aa79" }, "diy-115": { "about": "5_diy1_b=ebnhlz/S1/002_ebnhlz 5_diy2_b=ebnhlz/S2/002_ebnhlz 5_diy1_b=ebnhlz/S3/002_ebnhlz 5_diy2_b=ebnhlz/S1/003_ebnhlz 5_diy1_b=ebnhlz/S2/003_ebnhlz 5_diy2_b=ebnhlz/S3/003_ebnhlz 5_diy1_b=ebnhlz/S1/004_ebnhlz 5_diy2_b=ebnhlz/S2/004_ebnhlz 5_diy1_b=ebnhlz/S3/004_ebnhlz 6_diy1_a=ebnhlz/S1 6_diy2_a=ebnhlz/S2 6_diy1_a=ebnhlz/S3", diff --git a/test/golden/matches.json b/test/golden/matches.json index a371620c..43bdb632 100644 --- a/test/golden/matches.json +++ b/test/golden/matches.json @@ -40,7 +40,7 @@ "title": {"id":"comment_1","name":"卫戍之星","picId":"comment_icon_1","text":"对敌方领袖造成伤害最高(仅胜利时)"}, "trophies": 0, "reward": 113, - "stats": {"activatedLayers":78,"bossDamage":50000,"dmgDealt":542434,"gold":72,"itemsEquipped":10,"kills":160,"leaks":0,"lpLost":0,"merges":2,"perfectRounds":8,"refreshes":14}, + "stats": {"activatedLayers":78,"bossDamage":50000,"dmgDealt":542311,"gold":72,"itemsEquipped":10,"kills":160,"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]"], "bonds": ["deputShip 0/16","emptyShip 1/0","indomShip 0/7","preciShip 1/7","sargonShip 1/28","steadShip 2/38","swiftShip 1/5"] } @@ -168,7 +168,7 @@ "combat": "client", "boost": null, "setup": {"stageId":"act1autochess_m02","bossId":"boss_5","hiddenBossId":"boss_10","factions":["ELEMENT","DOT","REFLECTION"]}, - "end": {"victory":true,"roundsPassed":14,"hiddenReached":false,"hiddenCleared":false,"reason":"victory","teamLp":25,"bossPoolLeft":0,"virtualMs":106900}, + "end": {"victory":true,"roundsPassed":14,"hiddenReached":false,"hiddenCleared":false,"reason":"victory","teamLp":26,"bossPoolLeft":0,"virtualMs":106900}, "rng": {"setup":25,"shop":227,"waves":0,"draft":10,"bots":10157,"meta":82}, "errors": {"engine":0,"logged":0,"sim":0,"dispatcher":0}, "rounds": [ @@ -177,43 +177,43 @@ {"round":3,"ai_0":[1,29,6,0,0,1,7,"10e412bf",2,"kazimierzShip 0/2, kjeragShip 0/4, sargonShip 0/2, steadShip 0/4, swiftShip 1/2",7,7,0,15]}, { "round": 4, - "ai_0": [1,28,7,0,0,2,8,"2c5bb818",11,"arcaneShip 0/2, kazimierzShip 0/2, kjeragShip 0/4, lateranoShip 0/3, preciShip 1/2, sargonShip 0/2, steadShip 1/4, swiftShip 1/5",12,13,1,22] + "ai_0": [1,29,7,0,0,2,8,"2c5bb818",11,"arcaneShip 0/2, kazimierzShip 0/2, kjeragShip 0/4, lateranoShip 0/3, preciShip 1/2, sargonShip 0/2, steadShip 1/4, swiftShip 1/5",13,13,0,22] }, { "round": 5, - "ai_0": [1,25,8,0,0,3,8,"adfde65f",11,"arcaneShip 0/2, kazimierzShip 0/2, kjeragShip 0/4, lateranoShip 0/3, preciShip 1/2, sargonShip 0/2, steadShip 1/4, swiftShip 1/5",16,19,3,30] + "ai_0": [1,26,8,0,0,3,8,"adfde65f",11,"arcaneShip 0/2, kazimierzShip 0/2, kjeragShip 0/4, lateranoShip 0/3, preciShip 1/2, sargonShip 0/2, steadShip 1/4, swiftShip 1/5",16,19,3,30] }, { "round": 6, - "ai_0": [1,25,9,0,1,3,8,"e3b6b0ab",16,"arcaneShip 0/4, kazimierzShip 0/2, kjeragShip 0/4, lateranoShip 0/3, preciShip 1/4, sargonShip 0/2, steadShip 2/4, swiftShip 1/8",21,21,0,38] + "ai_0": [1,26,9,0,1,3,8,"e3b6b0ab",16,"arcaneShip 0/4, kazimierzShip 0/2, kjeragShip 0/4, lateranoShip 0/3, preciShip 1/4, sargonShip 0/2, steadShip 2/4, swiftShip 1/8",21,21,0,38] }, { "round": 7, - "ai_0": [1,25,11,0,2,4,8,"e419f5a0",18,"arcaneShip 0/4, kazimierzShip 1/2, kjeragShip 0/4, lateranoShip 0/3, preciShip 1/4, sargonShip 0/2, soloShip 1/0, steadShip 2/4, swiftShip 1/8",28,28,0,50] + "ai_0": [1,26,11,0,2,4,8,"e419f5a0",18,"arcaneShip 0/4, kazimierzShip 1/2, kjeragShip 0/4, lateranoShip 0/3, preciShip 1/4, sargonShip 0/2, soloShip 1/0, steadShip 2/4, swiftShip 1/8",28,28,0,50] }, { "round": 8, - "ai_0": [1,25,13,0,1,4,8,"2b5d9514",26,"arcaneShip 1/8, kazimierzShip 1/2, kjeragShip 0/8, lateranoShip 0/3, preciShip 0/4, sargonShip 0/2, soloShip 1/0, steadShip 2/8, swiftShip 1/8",20,20,0,62] + "ai_0": [1,26,13,0,1,4,8,"2b5d9514",26,"arcaneShip 1/8, kazimierzShip 1/2, kjeragShip 0/8, lateranoShip 0/3, preciShip 0/4, sargonShip 0/2, soloShip 1/0, steadShip 2/8, swiftShip 1/8",20,20,0,62] }, { "round": 9, - "ai_0": [1,25,13,0,0,4,8,"3198e188",72,"arcaneShip 1/18, kazimierzShip 0/2, kjeragShip 1/13, lateranoShip 0/3, preciShip 2/23, sargonShip 0/2, soloShip 1/0, steadShip 0/8, suntShip 1/0, swiftShip 1/18",16,16,0,76] + "ai_0": [1,26,13,0,0,4,8,"3198e188",72,"arcaneShip 1/18, kazimierzShip 0/2, kjeragShip 1/13, lateranoShip 0/3, preciShip 2/23, sargonShip 0/2, soloShip 1/0, steadShip 0/8, suntShip 1/0, swiftShip 1/18",16,16,0,76] }, { "round": 10, - "ai_0": [1,25,12,0,1,5,8,"e7f7ce74",94,"arcaneShip 1/20, kazimierzShip 0/2, kjeragShip 1/13, lateranoShip 0/3, preciShip 2/33, sargonShip 0/2, soloShip 1/0, steadShip 0/8, suntShip 1/0, swiftShip 1/28, visiShip 1/0",31,31,0,89] + "ai_0": [1,26,12,0,1,5,8,"e7f7ce74",94,"arcaneShip 1/20, kazimierzShip 0/2, kjeragShip 1/13, lateranoShip 0/3, preciShip 2/33, sargonShip 0/2, soloShip 1/0, steadShip 0/8, suntShip 1/0, swiftShip 1/28, visiShip 1/0",31,31,0,89] }, { "round": 11, - "ai_0": [1,25,13,0,2,5,8,"3ce86f2f",144,"arcaneShip 2/26, kazimierzShip 0/2, kjeragShip 1/13, lateranoShip 0/3, preciShip 2/38, raidShip 1/29, sargonShip 0/2, steadShip 0/8, suntShip 1/0, swiftShip 1/33, visiShip 1/5",23,23,0,101] + "ai_0": [1,26,13,0,2,5,8,"3ce86f2f",144,"arcaneShip 2/26, kazimierzShip 0/2, kjeragShip 1/13, lateranoShip 0/3, preciShip 2/38, raidShip 1/29, sargonShip 0/2, steadShip 0/8, suntShip 1/0, swiftShip 1/33, visiShip 1/5",23,23,0,101] }, { "round": 12, - "ai_0": [1,25,14,0,2,6,8,"97ed3953",182,"arcaneShip 2/28, kazimierzShip 0/2, kjeragShip 1/13, lateranoShip 0/3, preciShip 2/43, raidShip 1/50, sargonShip 0/2, steadShip 0/8, suntShip 1/0, swiftShip 1/38, visiShip 1/10",45,45,0,114] + "ai_0": [1,26,14,0,2,6,8,"97ed3953",182,"arcaneShip 2/28, kazimierzShip 0/2, kjeragShip 1/13, lateranoShip 0/3, preciShip 2/43, raidShip 1/50, sargonShip 0/2, steadShip 0/8, suntShip 1/0, swiftShip 1/38, visiShip 1/10",45,45,0,114] }, { "round": 13, - "ai_0": [1,25,14,0,2,6,8,"37aee47d",232,"arcaneShip 2/34, kazimierzShip 0/2, kjeragShip 1/13, lateranoShip 0/3, preciShip 2/48, raidShip 1/79, sargonShip 0/2, steadShip 0/8, suntShip 1/0, swiftShip 1/43, visiShip 1/15",35,35,0,128] + "ai_0": [1,26,14,0,2,6,8,"37aee47d",232,"arcaneShip 2/34, kazimierzShip 0/2, kjeragShip 1/13, lateranoShip 0/3, preciShip 2/48, raidShip 1/79, sargonShip 0/2, steadShip 0/8, suntShip 1/0, swiftShip 1/43, visiShip 1/15",35,35,0,128] } ], "players": { @@ -222,12 +222,12 @@ "victory": true, "roundsPassed": 14, "eliminatedRound": null, - "lp": 25, + "lp": 26, "bandId": "band_ducklord", "title": {"id":"comment_1","name":"卫戍之星","picId":"comment_icon_1","text":"对敌方领袖造成伤害最高(仅胜利时)"}, "trophies": 0, "reward": 400, - "stats": {"activatedLayers":268,"bossDamage":97500,"dmgDealt":2262888,"gold":140,"itemsEquipped":13,"kills":270,"leaks":4,"lpLost":4,"merges":5,"perfectRounds":11,"refreshes":18}, + "stats": {"activatedLayers":268,"bossDamage":97500,"dmgDealt":2262927,"gold":140,"itemsEquipped":13,"kills":271,"leaks":3,"lpLost":3,"merges":5,"perfectRounds":12,"refreshes":18}, "lineup": ["1_17_b@12,5","4_14_b@11,4","3_11_a@11,5[1_05_e_a+3_08_e_a]","5_07_a@11,6[4_02_e_a+4_05_e_a]","4_10_a@10,3","1_02_b@10,4[4_12_e_a+4_06_e_a]","5_14_a@10,5[1_05_e_b+1_05_e_b]","4_04_a@10,6"], "bonds": ["arcaneShip 2/40","kazimierzShip 0/2","kjeragShip 1/13","lateranoShip 0/3","preciShip 2/58","raidShip 1/84","sargonShip 0/2","steadShip 0/8","suntShip 1/0","swiftShip 1/53","visiShip 1/20"] } @@ -312,8 +312,8 @@ "combat": "client", "boost": null, "setup": {"stageId":"act1autochess_m03","bossId":"boss_5","hiddenBossId":"boss_10","factions":["ELEMENT","DOT","REFLECTION"]}, - "end": {"victory":true,"roundsPassed":14,"hiddenReached":false,"hiddenCleared":false,"reason":"victory","teamLp":7,"bossPoolLeft":0,"virtualMs":107800}, - "rng": {"setup":25,"shop":279,"waves":0,"draft":42,"bots":8378,"meta":87}, + "end": {"victory":false,"roundsPassed":12,"hiddenReached":false,"hiddenCleared":false,"reason":"eliminated","teamLp":null,"bossPoolLeft":null,"virtualMs":101900}, + "rng": {"setup":25,"shop":231,"waves":0,"draft":42,"bots":8194,"meta":96}, "errors": {"engine":0,"logged":0,"sim":0,"dispatcher":0}, "rounds": [ {"round":1,"ai_0":[1,29,4,0,0,1,2,"e4d89f1f",0,"",5,5,0,4]}, @@ -341,39 +341,39 @@ }, { "round": 9, - "ai_0": [1,18,13,0,1,4,8,"426b1da9",62,"arcaneShip 1/18, kazimierzShip 1/2, kjeragShip 1/13, lateranoShip 0/3, preciShip 1/13, sargonShip 0/2, soloShip 1/0, steadShip 1/8, suntShip 1/0, swiftShip 1/8",27,32,5,75] + "ai_0": [1,16,13,0,0,4,8,"426b1da9",62,"arcaneShip 1/18, kazimierzShip 1/2, kjeragShip 1/13, lateranoShip 0/3, preciShip 1/13, sargonShip 0/2, soloShip 1/0, steadShip 1/8, suntShip 1/0, swiftShip 1/8",25,32,7,75] }, { "round": 10, - "ai_0": [1,18,13,0,1,5,8,"65d67e3b",72,"arcaneShip 1/24, kazimierzShip 1/4, kjeragShip 1/13, lateranoShip 0/3, preciShip 1/13, sargonShip 0/2, soloShip 1/0, steadShip 1/8, suntShip 1/0, swiftShip 1/10",30,30,0,88] + "ai_0": [1,16,12,0,1,5,8,"65d67e3b",66,"arcaneShip 1/22, kazimierzShip 1/2, kjeragShip 1/13, lateranoShip 0/3, preciShip 1/13, sargonShip 0/2, soloShip 1/0, steadShip 1/8, suntShip 1/0, swiftShip 1/8",30,30,0,86] }, { "round": 11, - "ai_0": [1,9,13,0,1,5,8,"0c556348",74,"arcaneShip 1/28, kazimierzShip 1/8, kjeragShip 1/13, lateranoShip 0/3, preciShip 2/17, sargonShip 0/2, soloShip 1/0, steadShip 1/8, suntShip 1/0, swiftShip 0/10",15,24,9,101] + "ai_0": [1,8,13,0,1,5,8,"0c556348",82,"arcaneShip 1/28, kazimierzShip 1/6, kjeragShip 1/18, lateranoShip 0/3, preciShip 2/22, sargonShip 0/2, soloShip 1/0, steadShip 1/8, suntShip 1/0, swiftShip 0/8, visiShip 1/0",16,24,8,100] }, { "round": 12, - "ai_0": [1,7,13,0,2,6,8,"30f54d4c",162,"arcaneShip 2/34, kazimierzShip 1/36, kjeragShip 1/29, lateranoShip 0/3, preciShip 1/25, sargonShip 0/2, steadShip 1/8, suntShip 1/0, swiftShip 1/30",43,45,2,115] + "ai_0": [1,3,13,0,1,6,8,"5e2eb33c",91,"arcaneShip 1/28, kazimierzShip 1/10, kjeragShip 1/19, lateranoShip 0/3, preciShip 2/26, sargonShip 0/2, soloShip 1/0, steadShip 1/8, suntShip 1/0, swiftShip 0/8, visiShip 1/0",40,45,5,113] }, { "round": 13, - "ai_0": [1,7,14,0,0,6,8,"09807249",200,"arcaneShip 1/40, kazimierzShip 1/48, kjeragShip 1/37, lateranoShip 0/3, preciShip 2/29, sargonShip 0/2, steadShip 1/8, suntShip 1/0, swiftShip 1/38",29,29,0,129] + "ai_0": [0,0,13,0,0,6,0,"811c9dc5",0,"arcaneShip 0/32, kazimierzShip 0/14, kjeragShip 0/19, lateranoShip 0/3, preciShip 0/30, sargonShip 0/2, steadShip 0/8, swiftShip 0/8",21,29,8,126] } ], "players": { "ai_0": { - "alive": true, - "victory": true, - "roundsPassed": 14, - "eliminatedRound": null, - "lp": 7, + "alive": false, + "victory": false, + "roundsPassed": 12, + "eliminatedRound": 13, + "lp": 0, "bandId": "band_ducklord", - "title": {"id":"comment_1","name":"卫戍之星","picId":"comment_icon_1","text":"对敌方领袖造成伤害最高(仅胜利时)"}, + "title": {"id":"comment_4","name":"精英云集","picId":"comment_icon_4","text":"晋升精锐次数最多"}, "trophies": 0, - "reward": 425, - "stats": {"activatedLayers":163,"bossDamage":195000,"dmgDealt":2245026,"gold":141,"itemsEquipped":11,"kills":268,"leaks":22,"lpLost":22,"merges":6,"perfectRounds":9,"refreshes":25}, - "lineup": ["1_17_b@12,5","3_17_a@12,6","4_20_a@12,7","4_10_b@10,3","2_18_a@10,5[4_11_e_a+1_05_e_b]","1_19_b@10,7","6_17_a@10,8[3_07_e_a+3_04_e_a]","6_19_a@9,5[4_02_e_b+5_03_e_a]"], - "bonds": ["arcaneShip 1/48","kazimierzShip 2/48","kjeragShip 0/37","lateranoShip 0/3","preciShip 1/29","sargonShip 0/2","soloShip 1/0","steadShip 0/8","suntShip 1/0","swiftShip 1/38"] + "reward": 298, + "stats": {"activatedLayers":0,"bossDamage":0,"dmgDealt":1867448,"gold":126,"itemsEquipped":10,"kills":249,"leaks":34,"lpLost":34,"merges":4,"perfectRounds":8,"refreshes":20}, + "lineup": [], + "bonds": ["arcaneShip 0/32","kazimierzShip 0/14","kjeragShip 0/19","lateranoShip 0/3","preciShip 0/30","sargonShip 0/2","steadShip 0/8","swiftShip 0/8"] } } }, @@ -418,7 +418,7 @@ }, { "round": 11, - "ai_0": [1,3,12,0,0,5,8,"08ebba3b",174,"arcaneShip 1/20, deputShip 1/12, emptyShip 1/8, kazimierzShip 0/8, kjeragShip 1/32, preciShip 1/28, sargonShip 0/8, siracusaShip 1/61, soloShip 1/13, steadShip 0/17, swiftShip 0/8",16,34,18,97] + "ai_0": [1,3,12,0,0,5,8,"3a802395",174,"arcaneShip 1/20, deputShip 1/12, emptyShip 1/8, kazimierzShip 0/8, kjeragShip 1/32, preciShip 1/28, sargonShip 0/8, siracusaShip 1/61, soloShip 1/13, steadShip 0/17, swiftShip 0/8",21,34,13,97] }, { "round": 12, @@ -436,7 +436,7 @@ "title": {"id":"comment_4","name":"精英云集","picId":"comment_icon_4","text":"晋升精锐次数最多"}, "trophies": 0, "reward": 255, - "stats": {"activatedLayers":0,"bossDamage":0,"dmgDealt":1613113,"gold":109,"itemsEquipped":10,"kills":226,"leaks":58,"lpLost":34,"merges":2,"perfectRounds":8,"refreshes":9}, + "stats": {"activatedLayers":0,"bossDamage":0,"dmgDealt":1655276,"gold":109,"itemsEquipped":10,"kills":231,"leaks":53,"lpLost":34,"merges":2,"perfectRounds":8,"refreshes":9}, "lineup": [], "bonds": ["arcaneShip 0/22","deputShip 0/14","emptyShip 0/10","kazimierzShip 0/8","kjeragShip 0/39","preciShip 0/35","sargonShip 0/8","siracusaShip 0/65","soloShip 0/15","steadShip 0/17","swiftShip 0/8"] } @@ -465,15 +465,15 @@ }, { "round": 5, - "ai_0": [1,19,9,0,0,3,8,"f1511763",11,"arcaneShip 0/2, kazimierzShip 0/2, kjeragShip 0/4, lateranoShip 0/3, preciShip 1/2, sargonShip 0/2, steadShip 1/4, swiftShip 1/5",12,19,7,30] + "ai_0": [1,18,9,0,0,3,8,"f1511763",11,"arcaneShip 0/2, kazimierzShip 0/2, kjeragShip 0/4, lateranoShip 0/3, preciShip 1/2, sargonShip 0/2, steadShip 1/4, swiftShip 1/5",11,19,8,30] }, { "round": 6, - "ai_0": [1,13,9,0,0,3,8,"12a1dcbb",16,"arcaneShip 0/4, kazimierzShip 0/2, kjeragShip 0/4, lateranoShip 0/3, preciShip 1/4, sargonShip 0/2, steadShip 2/4, swiftShip 1/8",15,21,6,38] + "ai_0": [1,12,9,0,0,3,8,"12a1dcbb",16,"arcaneShip 0/4, kazimierzShip 0/2, kjeragShip 0/4, lateranoShip 0/3, preciShip 1/4, sargonShip 0/2, steadShip 2/4, swiftShip 1/8",15,21,6,38] }, { "round": 7, - "ai_0": [1,9,10,0,0,4,8,"932a36c9",18,"arcaneShip 0/4, kazimierzShip 1/2, kjeragShip 0/4, lateranoShip 0/3, preciShip 1/4, sargonShip 0/2, soloShip 1/0, steadShip 2/4, swiftShip 1/8",24,28,4,50] + "ai_0": [1,9,10,0,0,4,8,"932a36c9",18,"arcaneShip 0/4, kazimierzShip 1/2, kjeragShip 0/4, lateranoShip 0/3, preciShip 1/4, sargonShip 0/2, soloShip 1/0, steadShip 2/4, swiftShip 1/8",25,28,3,50] }, { "round": 8, @@ -495,7 +495,7 @@ "title": {"id":"comment_4","name":"精英云集","picId":"comment_icon_4","text":"晋升精锐次数最多"}, "trophies": 0, "reward": 170, - "stats": {"activatedLayers":0,"bossDamage":0,"dmgDealt":950038,"gold":74,"itemsEquipped":7,"kills":118,"leaks":37,"lpLost":31,"merges":2,"perfectRounds":3,"refreshes":4}, + "stats": {"activatedLayers":0,"bossDamage":0,"dmgDealt":964455,"gold":74,"itemsEquipped":7,"kills":118,"leaks":37,"lpLost":31,"merges":2,"perfectRounds":3,"refreshes":4}, "lineup": [], "bonds": ["arcaneShip 0/14","kazimierzShip 0/2","kjeragShip 0/16","lateranoShip 0/3","preciShip 0/13","sargonShip 0/2","steadShip 0/8","swiftShip 0/8"] } @@ -511,7 +511,7 @@ "combat": "client", "boost": null, "setup": {"stageId":"act2autochess_m04","bossId":"boss_3","hiddenBossId":"boss_8","factions":["FLY","TIMES","DOT"]}, - "end": {"victory":true,"roundsPassed":14,"hiddenReached":false,"hiddenCleared":false,"reason":"victory","teamLp":54,"bossPoolLeft":0,"virtualMs":121400}, + "end": {"victory":true,"roundsPassed":14,"hiddenReached":false,"hiddenCleared":false,"reason":"victory","teamLp":59,"bossPoolLeft":0,"virtualMs":118400}, "rng": {"setup":25,"shop":449,"waves":0,"draft":40,"bots":21634,"meta":8}, "errors": {"engine":0,"logged":0,"sim":0,"dispatcher":0}, "rounds": [ @@ -533,7 +533,7 @@ { "round": 4, "ai_0": [1,45,7,0,0,2,8,"ace8bd51",8,"preciShip 0/10, sargonShip 0/10, siracusaShip 0/6, soloShip 1/6, suntShip 1/0, swiftShip 1/2",7,7,0,22], - "ai_1": [1,28,7,0,0,2,8,"8b1c5c6d",2,"arcaneShip 0/2, kazimierzShip 0/2, preciShip 0/12, sargonShip 0/10, soloShip 1/0, swiftShip 1/2",5,7,2,22] + "ai_1": [1,28,7,0,0,2,8,"8b1c5c6d",2,"arcaneShip 0/2, kazimierzShip 0/2, preciShip 0/12, sargonShip 0/10, soloShip 1/0, swiftShip 1/2",7,7,0,22] }, { "round": 5, @@ -553,32 +553,32 @@ { "round": 8, "ai_0": [1,45,13,0,0,4,8,"870d6315",68,"arcaneShip 2/14, preciShip 0/10, sargonShip 0/10, siracusaShip 1/28, skillfulShip 1/4, soloShip 1/6, suntShip 1/0, swiftShip 1/16",19,19,0,63], - "ai_1": [1,28,12,0,0,4,8,"f830dd03",45,"arcaneShip 1/10, kazimierzShip 1/6, lateranoShip 1/0, preciShip 1/19, sargonShip 0/10, soloShip 1/0, swiftShip 1/10",19,19,0,64] + "ai_1": [1,28,12,0,0,4,8,"5e8420e4",53,"arcaneShip 1/10, kazimierzShip 1/6, lateranoShip 1/8, preciShip 1/19, sargonShip 0/10, soloShip 1/0, swiftShip 1/10",19,19,0,64] }, { "round": 9, "ai_0": [1,45,12,0,1,4,8,"b71d708f",86,"arcaneShip 2/22, preciShip 0/10, sargonShip 0/10, siracusaShip 1/34, skillfulShip 1/6, soloShip 1/6, suntShip 1/0, swiftShip 1/18",19,20,1,74], - "ai_1": [1,28,12,0,1,4,8,"b6ef2d78",59,"arcaneShip 2/14, kazimierzShip 1/6, preciShip 1/24, sargonShip 0/10, soloShip 1/0, steadShip 1/0, swiftShip 1/15",20,20,0,76] + "ai_1": [1,28,12,0,1,4,8,"b6ef2d78",59,"arcaneShip 2/14, kazimierzShip 1/6, lateranoShip 0/8, preciShip 1/24, sargonShip 0/10, soloShip 1/0, steadShip 1/0, swiftShip 1/15",20,20,0,76] }, { "round": 10, "ai_0": [1,45,13,0,0,5,8,"e786a445",98,"arcaneShip 2/26, preciShip 0/10, sargonShip 0/10, siracusaShip 1/38, skillfulShip 1/8, soloShip 1/6, suntShip 1/0, swiftShip 1/20",8,8,0,87], - "ai_1": [1,28,13,0,0,5,8,"6b3add69",71,"arcaneShip 2/16, kazimierzShip 1/6, preciShip 1/29, sargonShip 0/10, soloShip 1/0, steadShip 1/0, swiftShip 1/20",7,8,1,89] + "ai_1": [1,28,13,0,0,5,8,"ed80e1d9",71,"arcaneShip 2/16, kazimierzShip 1/6, lateranoShip 0/8, preciShip 1/29, sargonShip 0/10, soloShip 1/0, steadShip 1/0, swiftShip 1/20",7,8,1,89] }, { "round": 11, "ai_0": [1,45,12,0,2,5,8,"360613f3",118,"arcaneShip 2/34, miraShip 1/0, preciShip 0/10, sargonShip 0/10, siracusaShip 1/56, skillfulShip 0/10, soloShip 1/6, suntShip 1/0, swiftShip 1/22",23,23,0,99], - "ai_1": [1,28,12,0,0,5,8,"bfa85f5f",135,"arcaneShip 2/28, kazimierzShip 1/24, kjeragShip 0/8, preciShip 1/40, sargonShip 0/10, steadShip 1/0, suntShip 1/0, swiftShip 1/43",20,23,3,104] + "ai_1": [1,28,12,0,0,5,8,"13f38ed9",131,"arcaneShip 2/28, kazimierzShip 1/22, kjeragShip 0/8, lateranoShip 0/8, preciShip 1/40, sargonShip 0/10, steadShip 1/0, suntShip 1/0, swiftShip 1/41",23,23,0,103] }, { "round": 12, "ai_0": [1,45,14,0,0,6,8,"d434f9ef",168,"arcaneShip 2/46, miraShip 1/6, preciShip 0/10, sargonShip 0/10, siracusaShip 1/68, skillfulShip 1/18, soloShip 1/6, suntShip 1/0, swiftShip 1/24",105,105,0,113], - "ai_1": [1,28,12,0,0,6,8,"a81bef38",161,"arcaneShip 2/28, kazimierzShip 1/32, kjeragShip 0/8, preciShip 1/45, sargonShip 0/10, soloShip 1/0, suntShip 1/0, swiftShip 1/56",105,105,0,115] + "ai_1": [1,28,12,0,0,6,8,"2e4f3094",157,"arcaneShip 2/28, kazimierzShip 1/30, kjeragShip 0/8, lateranoShip 0/8, preciShip 1/45, sargonShip 0/10, steadShip 1/0, suntShip 1/0, swiftShip 1/54",105,105,0,114] }, { "round": 13, "ai_0": [1,36,12,0,2,6,8,"5deeb03a",214,"arcaneShip 2/70, miraShip 1/12, preciShip 0/10, sargonShip 0/10, siracusaShip 1/98, skillfulShip 1/28, soloShip 1/6, suntShip 1/0, swiftShip 0/32",25,34,9,125], - "ai_1": [1,18,12,0,0,6,8,"49c3b995",195,"arcaneShip 2/36, kazimierzShip 1/40, kjeragShip 0/8, preciShip 1/50, sargonShip 0/10, steadShip 1/0, suntShip 1/0, swiftShip 1/69",22,34,12,127] + "ai_1": [1,23,12,0,0,6,8,"3ced4cf9",189,"arcaneShip 2/34, kazimierzShip 1/38, kjeragShip 0/8, lateranoShip 0/8, preciShip 1/50, sargonShip 0/10, steadShip 1/0, suntShip 1/0, swiftShip 1/67",29,34,5,125] } ], "players": { @@ -592,7 +592,7 @@ "title": {"id":"comment_2","name":"不朽盟约","picId":"comment_icon_2","text":"激活的盟约层数总和最高"}, "trophies": 4, "reward": 400, - "stats": {"activatedLayers":250,"bossDamage":287418,"dmgDealt":3012080,"gold":139,"itemsEquipped":12,"kills":333,"leaks":10,"lpLost":9,"merges":5,"perfectRounds":11,"refreshes":23}, + "stats": {"activatedLayers":250,"bossDamage":280128,"dmgDealt":2897139,"gold":139,"itemsEquipped":12,"kills":327,"leaks":10,"lpLost":9,"merges":5,"perfectRounds":11,"refreshes":23}, "lineup": ["3_19_b@11,7[2_04_e_b]","5_12_a@11,8","4_10_a@10,5[1_02_e_b+2_01_e_a]","6_06_a@9,4","1_08_b@9,5","6_16_a@9,7","5_20_a@9,8[3_05_e_a+3_02_e_b]","3_13_b@9,9"], "bonds": ["arcaneShip 2/86","miraShip 1/12","preciShip 0/10","sargonShip 0/10","siracusaShip 1/110","skillfulShip 1/36","soloShip 1/6","suntShip 1/0","swiftShip 0/32"] }, @@ -601,14 +601,14 @@ "victory": true, "roundsPassed": 14, "eliminatedRound": null, - "lp": 18, + "lp": 23, "bandId": "band_dusk", "title": {"id":"comment_1","name":"卫戍之星","picId":"comment_icon_1","text":"对敌方领袖造成伤害最高(仅胜利时)"}, "trophies": 4, "reward": 400, - "stats": {"activatedLayers":205,"bossDamage":421332,"dmgDealt":3034736,"gold":139,"itemsEquipped":16,"kills":312,"leaks":18,"lpLost":10,"merges":5,"perfectRounds":9,"refreshes":13}, - "lineup": ["4_20_a@12,8[4_03_e_b+3_06_e_a]","1_17_b@11,7","4_02_b@11,8[4_08_e_a]","4_01_b@10,7[1_02_e_a]","6_17_a@10,8[1_01_e_b+4_06_e_a]","6_19_a@9,7[1_05_e_a+3_08_e_a]","4_14_a@9,8","5_07_a@9,9"], - "bonds": ["arcaneShip 2/36","kazimierzShip 1/40","kjeragShip 0/8","preciShip 2/55","raidShip 1/0","sargonShip 0/10","suntShip 1/0","swiftShip 1/74"] + "stats": {"activatedLayers":199,"bossDamage":428622,"dmgDealt":3305928,"gold":137,"itemsEquipped":18,"kills":324,"leaks":6,"lpLost":5,"merges":5,"perfectRounds":11,"refreshes":13}, + "lineup": ["4_20_a@12,8[3_06_e_a]","1_17_b@11,7[3_08_e_a]","4_02_b@11,8[3_02_e_a+4_03_e_b]","4_01_b@10,7[4_04_e_a+1_02_e_a]","6_17_a@10,8[4_06_e_a+4_08_e_a]","6_19_a@9,7[1_05_e_a+1_01_e_b]","4_14_a@9,8","5_07_a@9,9"], + "bonds": ["arcaneShip 2/34","kazimierzShip 1/38","kjeragShip 0/8","lateranoShip 0/8","preciShip 2/55","raidShip 1/0","sargonShip 0/10","suntShip 1/0","swiftShip 1/72"] } } }, @@ -659,7 +659,7 @@ { "round": 7, "ai_0": [1,25,10,0,0,4,8,"7dbd16ef",18,"kazimierzShip 1/2, kjeragShip 0/2, raidShip 1/3, skillfulShip 1/3, soloShip 1/3, steadShip 1/5, swiftShip 1/2",28,28,0,51], - "ai_1": [1,24,10,0,2,4,8,"6a9b4c34",2,"arcaneShip 0/2, kazimierzShip 0/2, preciShip 0/2, sargonShip 0/4, skillfulShip 1/0, soloShip 1/0, swiftShip 1/2",24,28,4,53] + "ai_1": [1,24,10,0,2,4,8,"6a9b4c34",2,"arcaneShip 0/2, kazimierzShip 0/2, preciShip 0/2, sargonShip 0/4, skillfulShip 1/0, soloShip 1/0, swiftShip 1/2",27,28,1,53] }, { "round": 8, @@ -703,7 +703,7 @@ "title": {"id":"comment_4","name":"精英云集","picId":"comment_icon_4","text":"晋升精锐次数最多"}, "trophies": 3, "reward": 298, - "stats": {"activatedLayers":0,"bossDamage":0,"dmgDealt":2480376,"gold":126,"itemsEquipped":8,"kills":208,"leaks":86,"lpLost":32,"merges":4,"perfectRounds":9,"refreshes":13}, + "stats": {"activatedLayers":0,"bossDamage":0,"dmgDealt":2454338,"gold":126,"itemsEquipped":8,"kills":205,"leaks":86,"lpLost":32,"merges":4,"perfectRounds":9,"refreshes":13}, "lineup": [], "bonds": ["kazimierzShip 0/45","kjeragShip 0/2","miraShip 0/7","preciShip 0/8","raidShip 0/42","skillfulShip 0/9","soloShip 0/3","steadShip 0/11","swiftShip 0/38","yanShip 0/6"] }, @@ -717,7 +717,7 @@ "title": {"id":"comment_5","name":"万事俱备","picId":"comment_icon_5","text":"装备配发数量最多"}, "trophies": 2, "reward": 255, - "stats": {"activatedLayers":0,"bossDamage":0,"dmgDealt":1339854,"gold":114,"itemsEquipped":11,"kills":156,"leaks":77,"lpLost":33,"merges":3,"perfectRounds":4,"refreshes":19}, + "stats": {"activatedLayers":0,"bossDamage":0,"dmgDealt":1360329,"gold":114,"itemsEquipped":11,"kills":159,"leaks":74,"lpLost":33,"merges":3,"perfectRounds":4,"refreshes":19}, "lineup": [], "bonds": ["arcaneShip 0/2","kazimierzShip 0/2","preciShip 0/59","sargonShip 0/4","siracusaShip 0/8","skillfulShip 0/6","swiftShip 0/23"] } @@ -871,7 +871,7 @@ "combat": "client", "boost": null, "setup": {"stageId":"act1autochess_m01","bossId":"boss_3","hiddenBossId":null,"factions":["TIMES","ELEMENT","REFLECTION"]}, - "end": {"victory":true,"roundsPassed":14,"hiddenReached":false,"hiddenCleared":false,"reason":"victory","teamLp":130,"bossPoolLeft":0,"virtualMs":133000}, + "end": {"victory":true,"roundsPassed":14,"hiddenReached":false,"hiddenCleared":false,"reason":"victory","teamLp":130,"bossPoolLeft":0,"virtualMs":134500}, "rng": {"setup":16,"shop":893,"waves":0,"draft":25,"bots":35892,"meta":29}, "errors": {"engine":0,"logged":0,"sim":0,"dispatcher":0}, "rounds": [ @@ -908,7 +908,7 @@ "ai_0": [1,26,8,0,2,3,8,"9781edeb",18,"deputShip 2/18, kjeragShip 0/2, sargonShip 0/15, steadShip 0/2",16,16,0,30], "ai_1": [1,45,8,0,0,2,8,"b338489c",21,"deputShip 2/14, preciShip 0/2, sargonShip 0/2, siracusaShip 1/7",16,16,0,29], "ai_2": [1,28,8,0,0,3,8,"36b2b83c",6,"sargonShip 0/8, siracusaShip 1/6, yanShip 0/1",16,16,0,30], - "ai_3": [1,31,8,0,0,3,7,"7334b6cc",18,"deputShip 1/4, preciShip 1/14, siracusaShip 0/3, yanShip 0/1",16,16,0,30] + "ai_3": [1,31,8,0,0,3,7,"7334b6cc",18,"deputShip 1/4, preciShip 1/14, siracusaShip 0/3, yanShip 0/1",15,16,1,30] }, { "round": 6, @@ -920,7 +920,7 @@ { "round": 7, "ai_0": [1,26,10,0,0,4,8,"4d10b2d0",52,"deputShip 2/34, kjeragShip 0/2, sargonShip 0/15, steadShip 2/18",29,29,0,52], - "ai_1": [1,45,10,0,0,4,8,"74703cad",45,"deputShip 2/30, preciShip 0/4, sargonShip 0/2, siracusaShip 1/15",28,29,1,49], + "ai_1": [1,45,10,0,0,4,8,"74703cad",45,"deputShip 2/30, preciShip 0/4, sargonShip 0/2, siracusaShip 1/15",26,29,3,49], "ai_2": [1,28,10,0,0,4,8,"15280eab",16,"sargonShip 0/8, siracusaShip 1/16, swiftShip 0/6, visiShip 1/0, yanShip 0/1",29,29,0,50], "ai_3": [1,31,10,0,1,4,8,"53fd121b",82,"deputShip 2/12, emptyShip 1/8, kjeragShip 0/20, preciShip 1/53, siracusaShip 0/3, swiftShip 1/9, yanShip 0/1",29,29,0,50] }, @@ -978,7 +978,7 @@ "title": {"id":"comment_2","name":"不朽盟约","picId":"comment_icon_2","text":"激活的盟约层数总和最高"}, "trophies": 3, "reward": 250, - "stats": {"activatedLayers":485,"bossDamage":46721,"dmgDealt":1671568,"gold":140,"itemsEquipped":25,"kills":325,"leaks":0,"lpLost":0,"merges":5,"perfectRounds":13,"refreshes":21}, + "stats": {"activatedLayers":485,"bossDamage":46721,"dmgDealt":1678627,"gold":140,"itemsEquipped":25,"kills":325,"leaks":0,"lpLost":0,"merges":5,"perfectRounds":13,"refreshes":21}, "lineup": ["6_08_a@11,6[3_03_e_a+3_02_e_a]","6_12_a@11,7[4_08_e_a+6_07_e_b]","2_14_b@10,3","2_17_b@10,4[4_02_e_b+5_01_e_a]","2_08_a@9,3[4_04_e_a+1_01_e_b]","6_06_a@9,4[3_08_e_a+3_01_e_b]","1_06_b@9,8","5_02_b@9,9[5_02_e_a+3_06_e_b]"], "bonds": ["deputShip 1/61","emptyShip 1/6","kjeragShip 0/7","preciShip 2/158","sargonShip 1/172","steadShip 1/88"] }, @@ -992,7 +992,7 @@ "title": {"id":"comment_3","name":"坚若磐石","picId":"comment_icon_3","text":"目标生命值损失最少"}, "trophies": 3, "reward": 250, - "stats": {"activatedLayers":207,"bossDamage":12384,"dmgDealt":1296113,"gold":129,"itemsEquipped":20,"kills":240,"leaks":43,"lpLost":0,"merges":6,"perfectRounds":9,"refreshes":20}, + "stats": {"activatedLayers":207,"bossDamage":12384,"dmgDealt":1292851,"gold":129,"itemsEquipped":20,"kills":239,"leaks":45,"lpLost":0,"merges":6,"perfectRounds":9,"refreshes":20}, "lineup": ["2_14_b@12,3","5_10_a@11,6[4_03_e_b+1_02_e_a]","6_01_a@11,7[3_05_e_a]","5_10_a@11,8[5_09_e_a+4_08_e_b]","6_14_a@10,3","4_16_a@10,8[4_11_e_a+4_04_e_b]","6_05_a@9,8[1_05_e_a+5_03_e_a]","2_16_a@9,9[5_02_e_a+4_05_e_b]"], "bonds": ["deputShip 1/96","emptyShip 1/23","preciShip 1/14","sargonShip 0/2","siracusaShip 1/74","steadShip 0/4"] }, @@ -1020,7 +1020,7 @@ "title": {"id":"comment_1","name":"卫戍之星","picId":"comment_icon_1","text":"对敌方领袖造成伤害最高(仅胜利时)"}, "trophies": 3, "reward": 250, - "stats": {"activatedLayers":309,"bossDamage":155575,"dmgDealt":1741361,"gold":138,"itemsEquipped":36,"kills":284,"leaks":0,"lpLost":0,"merges":3,"perfectRounds":13,"refreshes":23}, + "stats": {"activatedLayers":309,"bossDamage":155575,"dmgDealt":1746418,"gold":138,"itemsEquipped":36,"kills":285,"leaks":1,"lpLost":0,"merges":3,"perfectRounds":12,"refreshes":23}, "lineup": ["3_20_b@12,8[5_02_e_b+6_03_e_a]","6_14_a@11,3","4_13_b@11,6[5_02_e_b+4_07_e_a]","6_01_a@11,7[3_11_e_a+3_04_e_a]","4_14_a@11,8[4_03_e_a+1_02_e_a]","4_22_a@10,8[4_04_e_b+4_02_e_a]","3_11_b@9,8[4_09_e_a+3_07_e_a]","5_14_a@9,9[4_06_e_b+2_01_e_b]"], "bonds": ["deputShip 1/20","emptyShip 0/12","kjeragShip 1/118","preciShip 2/117","siracusaShip 0/3","swiftShip 1/54","yanShip 0/1"] } @@ -1066,7 +1066,7 @@ "ai_0": [1,45,8,0,1,2,8,"822a03c7",6,"arcaneShip 0/8, kazimierzShip 0/4, preciShip 0/8, swiftShip 1/6",10,10,0,23], "ai_1": [1,25,8,0,1,2,8,"f1865800",7,"arcaneShip 1/2, kazimierzShip 0/5, kjeragShip 0/2, preciShip 0/2, sargonShip 0/4, soloShip 1/0, steadShip 0/2, swiftShip 1/5",11,12,1,21], "ai_2": [1,24,8,0,1,2,8,"38880204",9,"deputShip 1/7, kazimierzShip 0/2, kjeragShip 0/10, soloShip 1/2, steadShip 0/4, swiftShip 0/2, victoriaShip 0/10, yanShip 0/4",10,10,0,22], - "ai_3": [1,24,9,0,0,2,8,"00097ea6",4,"arcaneShip 1/3, preciShip 0/2, sargonShip 0/2, siracusaShip 1/0, soloShip 1/1",6,10,4,24] + "ai_3": [1,24,9,0,0,2,8,"2bb61a00",4,"arcaneShip 1/3, preciShip 0/2, sargonShip 0/2, siracusaShip 1/0, soloShip 1/1",6,10,4,24] }, { "round": 5, @@ -1077,7 +1077,7 @@ }, { "round": 6, - "ai_0": [1,35,9,0,2,3,8,"03ec72c2",23,"arcaneShip 0/8, kazimierzShip 0/4, kjeragShip 0/5, preciShip 1/15, swiftShip 1/8",13,14,1,40], + "ai_0": [1,35,9,0,2,3,8,"569d751b",23,"arcaneShip 0/8, kazimierzShip 0/4, kjeragShip 0/5, preciShip 1/15, swiftShip 1/8",13,14,1,40], "ai_1": [1,14,9,0,0,3,8,"390c0bbe",27,"arcaneShip 1/2, kazimierzShip 1/9, kjeragShip 0/2, preciShip 0/2, sargonShip 0/4, siracusaShip 0/6, soloShip 1/0, steadShip 0/2, swiftShip 1/16",13,14,1,39], "ai_2": [1,14,9,0,0,3,8,"259dd8c0",49,"deputShip 1/14, egirShip 0/2, kazimierzShip 0/2, kjeragShip 0/14, raidShip 0/2, soloShip 1/8, steadShip 2/21, swiftShip 1/6, victoriaShip 0/12, yanShip 0/4",14,14,0,40], "ai_3": [1,13,10,0,0,3,8,"22246bd2",20,"arcaneShip 2/7, preciShip 0/2, sargonShip 0/2, siracusaShip 1/9, skillfulShip 1/0, soloShip 1/4",11,14,3,45] @@ -1091,21 +1091,21 @@ }, { "round": 8, - "ai_0": [1,20,11,0,0,4,8,"cdf4cd04",43,"arcaneShip 2/8, kazimierzShip 1/18, kjeragShip 0/10, preciShip 1/17, skillfulShip 0/5, suntShip 1/0, swiftShip 0/14",4,9,5,63], + "ai_0": [1,21,11,0,0,4,8,"cdf4cd04",43,"arcaneShip 2/8, kazimierzShip 1/18, kjeragShip 0/10, preciShip 1/17, skillfulShip 0/5, suntShip 1/0, swiftShip 0/14",5,9,4,63], "ai_1": [0,0,11,0,0,4,0,"811c9dc5",0,"arcaneShip 0/2, deputShip 0/6, kazimierzShip 0/27, kjeragShip 0/2, preciShip 0/2, sargonShip 0/8, siracusaShip 0/6, skillfulShip 0/4, soloShip 0/2, steadShip 0/2, swiftShip 0/34",0,9,9,62], "ai_2": [1,9,11,0,0,4,8,"40e6f752",131,"deputShip 1/20, egirShip 0/4, indomShip 0/2, kazimierzShip 0/2, kjeragShip 1/23, raidShip 0/4, skillfulShip 0/5, soloShip 1/16, steadShip 1/52, suntShip 1/2, swiftShip 0/8, victoriaShip 1/18, visiShip 0/2, yanShip 0/12",5,9,4,62], "ai_3": [0,0,12,0,0,4,0,"811c9dc5",0,"arcaneShip 0/13, deputShip 0/4, preciShip 0/4, sargonShip 0/2, siracusaShip 0/25, skillfulShip 0/4, soloShip 0/8",0,9,9,67] }, { "round": 9, - "ai_0": [1,10,12,0,0,4,8,"4cd81c83",77,"arcaneShip 1/8, kazimierzShip 1/34, kjeragShip 1/10, preciShip 2/25, skillfulShip 0/5, suntShip 1/0, swiftShip 0/14",3,19,16,74], + "ai_0": [1,11,12,0,0,4,8,"4cd81c83",77,"arcaneShip 1/8, kazimierzShip 1/34, kjeragShip 1/10, preciShip 2/25, skillfulShip 0/5, suntShip 1/0, swiftShip 0/14",3,19,16,74], "ai_1": [0,0,0,0,0,4,0,"811c9dc5",0,"arcaneShip 0/2, deputShip 0/6, kazimierzShip 0/27, kjeragShip 0/2, preciShip 0/2, sargonShip 0/8, siracusaShip 0/6, skillfulShip 0/4, soloShip 0/2, steadShip 0/2, swiftShip 0/34",null,null,null,62], "ai_2": [1,9,12,0,2,4,8,"614f615e",185,"deputShip 1/26, egirShip 0/4, indomShip 1/10, investShip 0/2, kazimierzShip 0/2, kjeragShip 1/29, raidShip 0/4, skillfulShip 1/9, soloShip 1/18, steadShip 1/63, suntShip 0/2, swiftShip 0/10, victoriaShip 1/30, visiShip 0/2, yanShip 0/12",19,19,0,74], "ai_3": [0,0,0,0,0,4,0,"811c9dc5",0,"arcaneShip 0/13, deputShip 0/4, preciShip 0/4, sargonShip 0/2, siracusaShip 0/25, skillfulShip 0/4, soloShip 0/8",null,null,null,67] }, { "round": 10, - "ai_0": [1,6,12,0,0,5,8,"51650018",102,"arcaneShip 1/8, kazimierzShip 1/46, kjeragShip 1/15, preciShip 2/33, skillfulShip 0/10, suntShip 1/0, swiftShip 0/14",16,25,9,86], + "ai_0": [1,7,12,0,0,5,8,"51650018",102,"arcaneShip 1/8, kazimierzShip 1/46, kjeragShip 1/15, preciShip 2/33, skillfulShip 0/10, suntShip 1/0, swiftShip 0/14",16,25,9,86], "ai_1": [0,0,0,0,0,4,0,"811c9dc5",0,"arcaneShip 0/2, deputShip 0/6, kazimierzShip 0/27, kjeragShip 0/2, preciShip 0/2, sargonShip 0/8, siracusaShip 0/6, skillfulShip 0/4, soloShip 0/2, steadShip 0/2, swiftShip 0/34",null,null,null,62], "ai_2": [1,9,14,0,2,5,8,"76f0edb3",236,"deputShip 1/30, egirShip 0/4, indomShip 1/22, investShip 0/4, kazimierzShip 0/2, kjeragShip 1/35, raidShip 0/4, skillfulShip 1/11, soloShip 1/20, steadShip 1/72, suntShip 0/2, swiftShip 0/12, victoriaShip 1/46, visiShip 0/4, yanShip 0/12",25,25,0,90], "ai_3": [0,0,0,0,0,4,0,"811c9dc5",0,"arcaneShip 0/13, deputShip 0/4, preciShip 0/4, sargonShip 0/2, siracusaShip 0/25, skillfulShip 0/4, soloShip 0/8",null,null,null,67] @@ -1129,7 +1129,7 @@ "title": {"id":"comment_4","name":"精英云集","picId":"comment_icon_4","text":"晋升精锐次数最多"}, "trophies": 2, "reward": 213, - "stats": {"activatedLayers":0,"bossDamage":0,"dmgDealt":1532699,"gold":99,"itemsEquipped":11,"kills":84,"leaks":78,"lpLost":49,"merges":2,"perfectRounds":4,"refreshes":12}, + "stats": {"activatedLayers":0,"bossDamage":0,"dmgDealt":1529372,"gold":99,"itemsEquipped":11,"kills":85,"leaks":77,"lpLost":48,"merges":2,"perfectRounds":4,"refreshes":12}, "lineup": [], "bonds": ["arcaneShip 0/14","kazimierzShip 0/54","kjeragShip 0/15","preciShip 0/42","skillfulShip 0/10","swiftShip 0/19"] }, @@ -1143,7 +1143,7 @@ "title": null, "trophies": 1, "reward": 149, - "stats": {"activatedLayers":0,"bossDamage":0,"dmgDealt":820341,"gold":62,"itemsEquipped":5,"kills":63,"leaks":34,"lpLost":31,"merges":2,"perfectRounds":3,"refreshes":5}, + "stats": {"activatedLayers":0,"bossDamage":0,"dmgDealt":810614,"gold":62,"itemsEquipped":5,"kills":63,"leaks":34,"lpLost":31,"merges":2,"perfectRounds":3,"refreshes":5}, "lineup": [], "bonds": ["arcaneShip 0/2","deputShip 0/6","kazimierzShip 0/27","kjeragShip 0/2","preciShip 0/2","sargonShip 0/8","siracusaShip 0/6","skillfulShip 0/4","soloShip 0/2","steadShip 0/2","swiftShip 0/34"] }, @@ -1171,7 +1171,7 @@ "title": {"id":"comment_5","name":"万事俱备","picId":"comment_icon_5","text":"装备配发数量最多"}, "trophies": 1, "reward": 149, - "stats": {"activatedLayers":0,"bossDamage":0,"dmgDealt":535076,"gold":67,"itemsEquipped":9,"kills":44,"leaks":49,"lpLost":32,"merges":0,"perfectRounds":3,"refreshes":8}, + "stats": {"activatedLayers":0,"bossDamage":0,"dmgDealt":535536,"gold":67,"itemsEquipped":9,"kills":44,"leaks":49,"lpLost":32,"merges":0,"perfectRounds":3,"refreshes":8}, "lineup": [], "bonds": ["arcaneShip 0/13","deputShip 0/4","preciShip 0/4","sargonShip 0/2","siracusaShip 0/25","skillfulShip 0/4","soloShip 0/8"] } @@ -1188,7 +1188,7 @@ "boost": null, "setup": {"stageId":"act1autochess_m01","bossId":"boss_1","hiddenBossId":"boss_9","factions":["FLY","DOT","REFLECTION"]}, "end": {"victory":true,"roundsPassed":14,"hiddenReached":false,"hiddenCleared":false,"reason":"victory","teamLp":25,"bossPoolLeft":0,"virtualMs":121400}, - "rng": {"setup":25,"shop":535,"waves":0,"draft":34,"bots":18101,"meta":103}, + "rng": {"setup":25,"shop":535,"waves":0,"draft":34,"bots":18100,"meta":103}, "errors": {"engine":0,"logged":0,"sim":0,"dispatcher":0}, "rounds": [ { @@ -1234,12 +1234,12 @@ { "round": 9, "ai_0": [1,19,12,0,2,4,8,"b4babcf7",91,"arcaneShip 1/14, indomShip 0/8, kjeragShip 0/7, miraShip 1/2, preciShip 0/7, siracusaShip 2/58, soloShip 1/11, steadShip 0/2, suntShip 1/0, swiftShip 1/6, victoriaShip 0/8, visiShip 0/8",16,16,0,79], - "ai_1": [1,18,12,0,2,4,8,"3a24956f",64,"arcaneShip 1/12, indomShip 0/8, kjeragShip 0/4, preciShip 2/34, siracusaShip 1/18, soloShip 1/0, steadShip 0/4, victoriaShip 0/8, visiShip 0/8",15,15,0,76] + "ai_1": [1,18,12,0,2,4,8,"3a24956f",66,"arcaneShip 1/12, indomShip 0/8, kjeragShip 0/4, preciShip 2/36, siracusaShip 1/18, soloShip 1/0, steadShip 0/4, victoriaShip 0/8, visiShip 0/8",15,15,0,76] }, { "round": 10, "ai_0": [1,18,14,0,0,5,8,"4991ed8e",108,"arcaneShip 1/16, indomShip 0/8, kjeragShip 0/7, miraShip 1/5, preciShip 0/7, siracusaShip 2/70, soloShip 1/11, steadShip 0/2, suntShip 1/0, swiftShip 1/6, victoriaShip 0/8, visiShip 0/8",23,24,1,93], - "ai_1": [1,17,14,0,0,5,8,"995fa88f",75,"arcaneShip 1/12, emptyShip 1/0, indomShip 0/8, kjeragShip 0/4, preciShip 2/45, siracusaShip 1/18, soloShip 1/0, steadShip 0/4, victoriaShip 0/8, visiShip 0/8",22,23,1,90] + "ai_1": [1,17,14,0,0,5,8,"995fa88f",77,"arcaneShip 1/12, emptyShip 1/0, indomShip 0/8, kjeragShip 0/4, preciShip 2/47, siracusaShip 1/18, soloShip 1/0, steadShip 0/4, victoriaShip 0/8, visiShip 0/8",22,23,1,90] }, { "round": 11, @@ -1253,8 +1253,8 @@ }, { "round": 13, - "ai_0": [1,8,14,0,0,6,8,"953e06bc",186,"arcaneShip 1/31, indomShip 0/8, kjeragShip 0/7, miraShip 1/13, preciShip 0/7, siracusaShip 2/125, soloShip 1/11, steadShip 0/2, suntShip 1/0, swiftShip 1/6, victoriaShip 0/8, visiShip 0/8",32,39,7,132], - "ai_1": [1,17,12,0,0,6,8,"eaf7de57",159,"arcaneShip 2/34, emptyShip 1/0, indomShip 0/8, kjeragShip 0/4, preciShip 2/87, siracusaShip 1/38, soloShip 1/0, steadShip 0/4, victoriaShip 0/8, visiShip 0/8",39,39,0,126] + "ai_0": [1,8,14,0,0,6,8,"e4ffb0a5",186,"arcaneShip 1/31, indomShip 0/8, kjeragShip 0/7, miraShip 1/13, preciShip 0/7, siracusaShip 2/125, soloShip 1/11, steadShip 0/2, suntShip 1/0, swiftShip 1/6, victoriaShip 0/8, visiShip 0/8",32,39,7,132], + "ai_1": [1,17,12,0,0,6,8,"866aa4ca",146,"arcaneShip 2/34, emptyShip 1/0, indomShip 0/8, kjeragShip 0/4, preciShip 2/74, siracusaShip 1/38, soloShip 1/0, steadShip 0/4, victoriaShip 0/8, visiShip 0/8",39,39,0,126] } ], "players": { @@ -1268,7 +1268,7 @@ "title": {"id":"comment_1","name":"卫戍之星","picId":"comment_icon_1","text":"对敌方领袖造成伤害最高(仅胜利时)"}, "trophies": 4, "reward": 400, - "stats": {"activatedLayers":217,"bossDamage":394870,"dmgDealt":3465584,"gold":143,"itemsEquipped":20,"kills":247,"leaks":38,"lpLost":22,"merges":2,"perfectRounds":7,"refreshes":25}, + "stats": {"activatedLayers":217,"bossDamage":384961,"dmgDealt":3450915,"gold":143,"itemsEquipped":20,"kills":248,"leaks":38,"lpLost":22,"merges":2,"perfectRounds":7,"refreshes":25}, "lineup": ["1_17_a@11,6[1_02_e_a+1_05_e_a]","3_19_a@11,7[3_05_e_b+5_01_e_a]","5_20_a@10,3[3_02_e_a+3_03_e_b]","4_10_a@10,4[4_03_e_a+1_01_e_b]","3_18_a@10,7[6_09_e_a+3_11_e_b]","1_08_b@10,8[4_11_e_a+3_08_e_a]","6_05_a@9,8","4_16_a@9,9"], "bonds": ["arcaneShip 1/37","indomShip 0/8","kjeragShip 0/7","miraShip 1/13","preciShip 1/7","raidShip 1/0","siracusaShip 2/143","soloShip 1/11","steadShip 0/2","swiftShip 1/6","victoriaShip 0/8","visiShip 0/8"] }, @@ -1282,9 +1282,9 @@ "title": {"id":"comment_3","name":"坚若磐石","picId":"comment_icon_3","text":"目标生命值损失最少"}, "trophies": 4, "reward": 400, - "stats": {"activatedLayers":193,"bossDamage":280130,"dmgDealt":3810535,"gold":138,"itemsEquipped":20,"kills":267,"leaks":12,"lpLost":11,"merges":3,"perfectRounds":11,"refreshes":25}, - "lineup": ["4_25_a@12,3","6_12_a@11,6[2_01_e_a+1_05_e_b]","1_17_b@11,7[4_08_e_a+1_01_e_a]","5_02_a@10,3","4_10_a@10,7[3_01_e_b+1_02_e_b]","3_18_a@10,8","5_12_a@9,8[1_05_e_a]","1_08_a@9,9[4_10_e_a+5_07_e_a]"], - "bonds": ["arcaneShip 2/49","emptyShip 1/0","indomShip 0/8","kjeragShip 0/8","preciShip 2/87","siracusaShip 1/57","soloShip 1/0","steadShip 0/8","swiftShip 0/6","victoriaShip 0/8","visiShip 0/8"] + "stats": {"activatedLayers":180,"bossDamage":290039,"dmgDealt":3835162,"gold":138,"itemsEquipped":20,"kills":267,"leaks":12,"lpLost":11,"merges":3,"perfectRounds":11,"refreshes":25}, + "lineup": ["4_25_a@11,3","6_12_a@11,6[2_01_e_a+1_05_e_b]","1_17_b@11,7[4_08_e_a+1_01_e_a]","5_02_a@10,3","4_10_a@10,7[3_01_e_b+1_02_e_b]","3_18_a@10,8","5_12_a@9,8[1_05_e_a]","1_08_a@9,9[4_10_e_a+5_07_e_a]"], + "bonds": ["arcaneShip 2/49","emptyShip 1/0","indomShip 0/8","kjeragShip 0/8","preciShip 2/74","siracusaShip 1/57","soloShip 1/0","steadShip 0/8","swiftShip 0/6","victoriaShip 0/8","visiShip 0/8"] } } }, @@ -1366,7 +1366,7 @@ "title": {"id":"comment_1","name":"卫戍之星","picId":"comment_icon_1","text":"对敌方领袖造成伤害最高(仅胜利时)"}, "trophies": 0, "reward": 425, - "stats": {"activatedLayers":2277,"bossDamage":1145000,"dmgDealt":3047851,"gold":175,"itemsEquipped":26,"kills":366,"leaks":1,"lpLost":1,"merges":6,"perfectRounds":12,"refreshes":35}, + "stats": {"activatedLayers":2277,"bossDamage":1145000,"dmgDealt":3047825,"gold":175,"itemsEquipped":26,"kills":366,"leaks":1,"lpLost":1,"merges":6,"perfectRounds":12,"refreshes":35}, "lineup": ["4_02_b@12,7[3_08_e_a+3_03_e_b]","6_01_a@12,8[3_02_e_a]","6_16_a@11,5[1_05_e_b+3_03_e_a]","3_18_a@11,8[4_11_e_a+4_05_e_b]","4_10_b@10,4[4_07_e_a+1_02_e_b]","6_05_a@10,5","4_01_b@10,6[6_03_e_a+4_06_e_a]","1_08_b@9,9"], "bonds": ["arcaneShip 2/395","deputShip 0/300","egirShip 0/300","emptyShip 0/300","indomShip 0/308","investShip 0/300","kazimierzShip 0/308","kjeragShip 0/300","lateranoShip 1/304","maniShip 0/300","miraShip 0/300","preciShip 1/302","raidShip 0/300","sargonShip 0/300","siracusaShip 1/353","skillfulShip 0/343","soloShip 1/307","steadShip 0/300","suntShip 1/300","swiftShip 1/316","victoriaShip 0/300","visiShip 0/300","yanShip 0/300"] } @@ -1423,32 +1423,32 @@ }, { "round": 8, - "ai_0": [1,400,12,0,0,4,8,"d692537c",1552,"arcaneShip 1/312, deputShip 0/304, egirShip 1/304, emptyShip 0/300, indomShip 0/300, investShip 0/300, kazimierzShip 0/302, kjeragShip 0/302, lateranoShip 0/300, maniShip 0/300, miraShip 0/300, preciShip 2/310, raidShip 0/300, sargonShip 0/300, siracusaShip 0/300, skillfulShip 0/300, soloShip 1/304, steadShip 2/322, suntShip 0/300, swiftShip 0/302, victoriaShip 0/300, visiShip 0/300, yanShip 0/300",18,18,0,64], + "ai_0": [1,400,12,0,0,4,8,"d692537c",1558,"arcaneShip 1/315, deputShip 0/304, egirShip 1/307, emptyShip 0/300, indomShip 0/300, investShip 0/300, kazimierzShip 0/302, kjeragShip 0/302, lateranoShip 0/300, maniShip 0/300, miraShip 0/300, preciShip 2/310, raidShip 0/300, sargonShip 0/300, siracusaShip 0/300, skillfulShip 0/300, soloShip 1/304, steadShip 2/322, suntShip 0/300, swiftShip 0/302, victoriaShip 0/300, visiShip 0/300, yanShip 0/300",18,18,0,64], "ai_1": [1,400,11,0,3,4,8,"a8a41789",1261,"arcaneShip 0/302, deputShip 2/314, egirShip 0/300, emptyShip 0/300, indomShip 1/304, investShip 0/300, kazimierzShip 0/300, kjeragShip 0/300, lateranoShip 0/300, maniShip 0/300, miraShip 0/300, preciShip 0/309, raidShip 0/300, sargonShip 0/300, siracusaShip 0/300, skillfulShip 0/300, soloShip 1/314, steadShip 1/329, suntShip 0/300, swiftShip 0/300, victoriaShip 0/305, visiShip 0/300, yanShip 0/305",20,20,0,67] }, { "round": 9, - "ai_0": [1,400,12,0,0,4,8,"8469d2a6",2226,"arcaneShip 2/315, deputShip 0/304, egirShip 1/323, emptyShip 0/300, indomShip 0/300, investShip 0/300, kazimierzShip 1/310, kjeragShip 0/302, lateranoShip 0/300, maniShip 0/300, miraShip 0/300, preciShip 1/314, raidShip 1/330, sargonShip 0/300, siracusaShip 0/300, skillfulShip 0/300, soloShip 1/304, steadShip 1/330, suntShip 0/300, swiftShip 0/306, victoriaShip 0/300, visiShip 0/300, yanShip 0/300",24,24,0,77], + "ai_0": [1,400,12,0,0,4,8,"8469d2a6",2232,"arcaneShip 2/318, deputShip 0/304, egirShip 1/326, emptyShip 0/300, indomShip 0/300, investShip 0/300, kazimierzShip 1/310, kjeragShip 0/302, lateranoShip 0/300, maniShip 0/300, miraShip 0/300, preciShip 1/314, raidShip 1/330, sargonShip 0/300, siracusaShip 0/300, skillfulShip 0/300, soloShip 1/304, steadShip 1/330, suntShip 0/300, swiftShip 0/306, victoriaShip 0/300, visiShip 0/300, yanShip 0/300",24,24,0,77], "ai_1": [1,400,15,0,3,4,8,"59b4a75a",1568,"arcaneShip 0/302, deputShip 1/316, egirShip 0/300, emptyShip 0/300, indomShip 1/306, investShip 0/300, kazimierzShip 0/300, kjeragShip 0/300, lateranoShip 0/300, maniShip 0/300, miraShip 0/300, preciShip 0/309, raidShip 0/300, sargonShip 0/300, siracusaShip 0/300, skillfulShip 1/302, soloShip 0/314, steadShip 1/336, suntShip 0/300, swiftShip 0/300, victoriaShip 1/308, visiShip 0/300, yanShip 0/305",24,24,0,82] }, { "round": 10, - "ai_0": [1,400,12,0,0,5,8,"5e407c98",2262,"arcaneShip 2/320, deputShip 0/304, egirShip 1/334, emptyShip 0/300, indomShip 0/300, investShip 0/300, kazimierzShip 1/314, kjeragShip 0/302, lateranoShip 0/300, maniShip 0/300, miraShip 0/300, preciShip 1/320, raidShip 1/338, sargonShip 0/300, siracusaShip 0/300, skillfulShip 0/300, soloShip 1/304, steadShip 1/332, suntShip 0/300, swiftShip 0/306, victoriaShip 0/300, visiShip 0/300, yanShip 0/300",12,12,0,93], + "ai_0": [1,400,12,0,0,5,8,"5e407c98",2268,"arcaneShip 2/323, deputShip 0/304, egirShip 1/337, emptyShip 0/300, indomShip 0/300, investShip 0/300, kazimierzShip 1/314, kjeragShip 0/302, lateranoShip 0/300, maniShip 0/300, miraShip 0/300, preciShip 1/320, raidShip 1/338, sargonShip 0/300, siracusaShip 0/300, skillfulShip 0/300, soloShip 1/304, steadShip 1/332, suntShip 0/300, swiftShip 0/306, victoriaShip 0/300, visiShip 0/300, yanShip 0/300",12,12,0,93], "ai_1": [1,400,15,0,0,5,8,"1cb9c2e4",1583,"arcaneShip 0/302, deputShip 1/318, egirShip 0/300, emptyShip 0/300, indomShip 1/308, investShip 0/300, kazimierzShip 0/300, kjeragShip 0/300, lateranoShip 0/300, maniShip 0/300, miraShip 0/300, preciShip 0/309, raidShip 0/300, sargonShip 0/300, siracusaShip 0/300, skillfulShip 1/304, soloShip 0/314, steadShip 1/342, suntShip 0/300, swiftShip 0/300, victoriaShip 1/311, visiShip 0/300, yanShip 0/305",12,12,0,97] }, { "round": 11, - "ai_0": [1,400,12,0,2,5,8,"cfd3ac7b",2321,"arcaneShip 1/323, deputShip 0/304, egirShip 1/352, emptyShip 0/300, indomShip 0/300, investShip 0/300, kazimierzShip 1/322, kjeragShip 0/302, lateranoShip 0/300, maniShip 0/300, miraShip 0/300, preciShip 1/324, raidShip 1/360, sargonShip 0/300, siracusaShip 0/300, skillfulShip 0/300, soloShip 1/304, steadShip 1/336, suntShip 0/300, swiftShip 0/310, victoriaShip 0/300, visiShip 0/300, yanShip 0/300",34,34,0,105], + "ai_0": [1,400,12,0,2,5,8,"cfd3ac7b",2327,"arcaneShip 1/326, deputShip 0/304, egirShip 1/355, emptyShip 0/300, indomShip 0/300, investShip 0/300, kazimierzShip 1/322, kjeragShip 0/302, lateranoShip 0/300, maniShip 0/300, miraShip 0/300, preciShip 1/324, raidShip 1/360, sargonShip 0/300, siracusaShip 0/300, skillfulShip 0/300, soloShip 1/304, steadShip 1/336, suntShip 0/300, swiftShip 0/310, victoriaShip 0/300, visiShip 0/300, yanShip 0/300",34,34,0,105], "ai_1": [1,400,12,0,1,6,8,"b6bd931e",2209,"arcaneShip 0/302, deputShip 1/320, egirShip 0/300, emptyShip 0/300, indomShip 1/312, investShip 0/300, kazimierzShip 0/300, kjeragShip 0/300, lateranoShip 0/300, maniShip 0/300, miraShip 0/300, preciShip 0/309, raidShip 0/300, sargonShip 0/300, siracusaShip 0/300, skillfulShip 1/306, soloShip 0/314, steadShip 1/349, suntShip 1/302, swiftShip 0/300, victoriaShip 1/316, visiShip 1/304, yanShip 0/305",34,34,0,120] }, { "round": 12, - "ai_0": [1,400,14,0,0,6,8,"e7a322b8",2348,"arcaneShip 1/323, deputShip 0/304, egirShip 1/353, emptyShip 0/300, indomShip 0/300, investShip 0/300, kazimierzShip 1/330, kjeragShip 0/302, lateranoShip 0/300, maniShip 0/300, miraShip 0/300, preciShip 1/332, raidShip 1/370, sargonShip 0/300, siracusaShip 0/300, skillfulShip 0/300, soloShip 1/304, steadShip 1/336, suntShip 0/300, swiftShip 0/310, victoriaShip 0/300, visiShip 0/300, yanShip 0/300",6,14,8,119], + "ai_0": [1,400,14,0,0,6,8,"e7a322b8",2354,"arcaneShip 1/326, deputShip 0/304, egirShip 1/356, emptyShip 0/300, indomShip 0/300, investShip 0/300, kazimierzShip 1/330, kjeragShip 0/302, lateranoShip 0/300, maniShip 0/300, miraShip 0/300, preciShip 1/332, raidShip 1/370, sargonShip 0/300, siracusaShip 0/300, skillfulShip 0/300, soloShip 1/304, steadShip 1/336, suntShip 0/300, swiftShip 0/310, victoriaShip 0/300, visiShip 0/300, yanShip 0/300",6,14,8,119], "ai_1": [1,400,13,0,1,6,8,"58fdf70d",2235,"arcaneShip 0/302, deputShip 1/322, egirShip 0/300, emptyShip 0/300, indomShip 2/314, investShip 0/300, kazimierzShip 0/300, kjeragShip 0/300, lateranoShip 0/300, maniShip 0/300, miraShip 0/300, preciShip 0/309, raidShip 0/300, sargonShip 0/300, siracusaShip 0/300, skillfulShip 1/308, soloShip 0/314, steadShip 1/357, suntShip 1/304, swiftShip 0/300, victoriaShip 1/324, visiShip 1/306, yanShip 0/310",15,15,0,134] }, { "round": 13, - "ai_0": [1,400,12,0,0,6,8,"feef54ce",2706,"arcaneShip 2/330, deputShip 0/304, egirShip 1/368, emptyShip 0/300, indomShip 0/300, investShip 0/300, kazimierzShip 1/334, kjeragShip 0/302, lateranoShip 0/300, maniShip 0/300, miraShip 0/300, preciShip 1/340, raidShip 1/390, sargonShip 0/300, siracusaShip 0/300, skillfulShip 0/300, soloShip 1/304, steadShip 1/340, suntShip 1/300, swiftShip 0/310, victoriaShip 0/300, visiShip 0/300, yanShip 0/300",41,41,0,133], + "ai_0": [1,400,12,0,0,6,8,"feef54ce",2712,"arcaneShip 2/333, deputShip 0/304, egirShip 1/371, emptyShip 0/300, indomShip 0/300, investShip 0/300, kazimierzShip 1/334, kjeragShip 0/302, lateranoShip 0/300, maniShip 0/300, miraShip 0/300, preciShip 1/340, raidShip 1/390, sargonShip 0/300, siracusaShip 0/300, skillfulShip 0/300, soloShip 1/304, steadShip 1/340, suntShip 1/300, swiftShip 0/310, victoriaShip 0/300, visiShip 0/300, yanShip 0/300",41,41,0,133], "ai_1": [1,400,13,0,2,6,8,"6a6f946a",1962,"arcaneShip 0/302, deputShip 1/324, egirShip 0/300, emptyShip 0/300, indomShip 2/322, investShip 0/300, kazimierzShip 0/300, kjeragShip 0/300, lateranoShip 0/300, maniShip 0/300, miraShip 0/300, preciShip 0/309, raidShip 0/300, sargonShip 0/300, siracusaShip 0/300, skillfulShip 1/310, soloShip 0/314, steadShip 1/366, suntShip 1/306, swiftShip 0/300, victoriaShip 1/334, visiShip 0/306, yanShip 0/310",36,41,5,150] } ], @@ -1463,9 +1463,9 @@ "title": {"id":"comment_1","name":"卫戍之星","picId":"comment_icon_1","text":"对敌方领袖造成伤害最高(仅胜利时)"}, "trophies": 8, "reward": 425, - "stats": {"activatedLayers":2986,"bossDamage":4110836,"dmgDealt":14169113,"gold":158,"itemsEquipped":18,"kills":295,"leaks":8,"lpLost":0,"merges":7,"perfectRounds":12,"refreshes":25}, + "stats": {"activatedLayers":2992,"bossDamage":4116323,"dmgDealt":14177505,"gold":158,"itemsEquipped":18,"kills":295,"leaks":8,"lpLost":0,"merges":7,"perfectRounds":12,"refreshes":25}, "lineup": ["4_09_b@11,5[4_11_e_a+6_09_e_a]","6_11_a@11,8","5_07_a@10,4[1_01_e_b+1_02_e_b]","1_19_b@10,8[5_02_e_a+4_04_e_a]","3_09_b@9,6[3_08_e_a+4_10_e_a]","6_05_a@9,7","4_20_a@9,8[2_01_e_a]","3_05_a@9,9[4_07_e_a+4_06_e_a]"], - "bonds": ["arcaneShip 1/330","deputShip 0/304","egirShip 1/368","emptyShip 0/300","indomShip 0/300","investShip 0/300","kazimierzShip 1/334","kjeragShip 0/302","lateranoShip 0/300","maniShip 1/300","miraShip 0/300","preciShip 1/345","raidShip 1/390","sargonShip 0/300","siracusaShip 0/300","skillfulShip 0/300","soloShip 1/304","steadShip 0/340","suntShip 1/300","swiftShip 1/315","victoriaShip 0/300","visiShip 0/300","yanShip 0/300"] + "bonds": ["arcaneShip 1/333","deputShip 0/304","egirShip 1/371","emptyShip 0/300","indomShip 0/300","investShip 0/300","kazimierzShip 1/334","kjeragShip 0/302","lateranoShip 0/300","maniShip 1/300","miraShip 0/300","preciShip 1/345","raidShip 1/390","sargonShip 0/300","siracusaShip 0/300","skillfulShip 0/300","soloShip 1/304","steadShip 0/340","suntShip 1/300","swiftShip 1/315","victoriaShip 0/300","visiShip 0/300","yanShip 0/300"] }, "ai_1": { "alive": true, @@ -1477,7 +1477,7 @@ "title": {"id":"comment_3","name":"坚若磐石","picId":"comment_icon_3","text":"目标生命值损失最少"}, "trophies": 8, "reward": 425, - "stats": {"activatedLayers":2322,"bossDamage":2829244,"dmgDealt":16856376,"gold":174,"itemsEquipped":28,"kills":280,"leaks":6,"lpLost":0,"merges":4,"perfectRounds":11,"refreshes":40}, + "stats": {"activatedLayers":2322,"bossDamage":2823757,"dmgDealt":16842382,"gold":174,"itemsEquipped":28,"kills":280,"leaks":6,"lpLost":0,"merges":4,"perfectRounds":11,"refreshes":40}, "lineup": ["2_17_a@12,8[3_08_e_a+4_02_e_a]","5_03_a@11,8[3_02_e_a+3_10_e_a]","1_10_b@10,4[4_11_e_a+2_01_e_b]","4_11_a@10,5[2_03_e_b+3_10_e_b]","5_06_a@10,8[3_01_e_b+5_02_e_a]","3_16_a@9,3[2_03_e_b+3_09_e_a]","6_20_a@9,6[1_05_e_a+4_08_e_b]","1_06_b@9,9[3_08_e_b+1_05_e_b]"], "bonds": ["arcaneShip 0/302","deputShip 1/328","egirShip 0/300","emptyShip 0/300","indomShip 1/326","investShip 0/300","kazimierzShip 0/300","kjeragShip 0/300","lateranoShip 0/300","maniShip 0/300","miraShip 0/300","preciShip 0/309","raidShip 0/300","sargonShip 0/300","siracusaShip 0/300","skillfulShip 1/314","soloShip 1/318","steadShip 2/384","suntShip 1/310","swiftShip 0/300","victoriaShip 1/342","visiShip 0/306","yanShip 0/310"] } @@ -1493,7 +1493,7 @@ "combat": "client", "boost": null, "setup": {"stageId":"act1autochess_m01","bossId":"boss_5","hiddenBossId":"boss_10","factions":["DOT","INVISIBLE","REFLECTION"]}, - "end": {"victory":true,"roundsPassed":14,"hiddenReached":false,"hiddenCleared":false,"reason":"victory","teamLp":5,"bossPoolLeft":0,"virtualMs":115050}, + "end": {"victory":true,"roundsPassed":14,"hiddenReached":false,"hiddenCleared":false,"reason":"victory","teamLp":3,"bossPoolLeft":0,"virtualMs":116550}, "rng": {"setup":25,"shop":495,"waves":0,"draft":34,"bots":17791,"meta":11}, "errors": {"engine":0,"logged":0,"sim":0,"dispatcher":0}, "rounds": [ @@ -1534,32 +1534,32 @@ }, { "round": 8, - "h_0": [1,28,13,0,2,4,8,"2bca9c35",63,"arcaneShip 1/7, kazimierzShip 0/8, preciShip 0/4, raidShip 1/48, skillfulShip 1/0, swiftShip 1/8, yanShip 0/1",15,15,0,62], + "h_0": [1,26,13,0,2,4,8,"2bca9c35",63,"arcaneShip 1/7, kazimierzShip 0/8, preciShip 0/4, raidShip 1/48, skillfulShip 1/0, swiftShip 1/8, yanShip 0/1",13,15,2,62], "ai_0": [1,23,12,0,0,4,8,"87633ca6",109,"arcaneShip 0/2, deputShip 2/16, kazimierzShip 0/8, lateranoShip 1/41, preciShip 0/10, sargonShip 0/2, skillfulShip 1/4, suntShip 1/14, swiftShip 1/34",15,15,0,62] }, { "round": 9, - "h_0": [1,26,14,0,0,4,8,"70a00d2f",50,"arcaneShip 1/10, kazimierzShip 1/12, preciShip 1/9, raidShip 0/48, skillfulShip 1/3, soloShip 1/0, swiftShip 1/16, yanShip 0/1",21,23,2,76], + "h_0": [1,24,14,0,0,4,8,"70a00d2f",50,"arcaneShip 1/10, kazimierzShip 1/12, preciShip 1/9, raidShip 0/48, skillfulShip 1/3, soloShip 1/0, swiftShip 1/16, yanShip 0/1",21,23,2,76], "ai_0": [1,22,12,0,0,4,8,"8dc0d798",164,"arcaneShip 0/2, deputShip 1/18, kazimierzShip 0/8, lateranoShip 1/56, preciShip 1/20, sargonShip 0/2, skillfulShip 1/11, suntShip 1/16, swiftShip 1/43",22,23,1,75] }, { "round": 10, - "h_0": [1,26,12,0,0,5,8,"59b986b7",73,"arcaneShip 1/10, kazimierzShip 1/19, preciShip 1/14, raidShip 0/48, skillfulShip 1/6, soloShip 1/3, swiftShip 1/21, yanShip 0/1",31,31,0,87], + "h_0": [1,24,12,0,0,5,8,"59b986b7",76,"arcaneShip 1/13, kazimierzShip 1/19, preciShip 1/14, raidShip 0/48, skillfulShip 1/6, soloShip 1/3, swiftShip 1/21, yanShip 0/1",31,31,0,87], "ai_0": [1,22,12,0,0,5,8,"fa71d132",191,"arcaneShip 0/2, deputShip 0/18, kazimierzShip 0/8, lateranoShip 1/84, preciShip 1/25, sargonShip 0/2, skillfulShip 1/16, suntShip 1/16, swiftShip 1/50",31,31,0,88] }, { "round": 11, - "h_0": [1,22,12,0,0,5,8,"b7278144",146,"arcaneShip 0/10, kazimierzShip 1/34, preciShip 2/19, raidShip 1/61, skillfulShip 0/9, soloShip 1/6, suntShip 1/0, swiftShip 1/26, yanShip 0/1",21,25,4,99], + "h_0": [1,20,12,0,0,5,8,"b7278144",146,"arcaneShip 0/13, kazimierzShip 1/34, preciShip 2/19, raidShip 1/61, skillfulShip 0/9, soloShip 1/6, suntShip 1/0, swiftShip 1/26, yanShip 0/1",21,25,4,99], "ai_0": [1,17,12,0,0,5,8,"e240abda",229,"arcaneShip 0/2, deputShip 0/18, kazimierzShip 0/8, lateranoShip 1/92, preciShip 1/33, raidShip 1/5, sargonShip 0/2, skillfulShip 1/21, suntShip 1/16, swiftShip 1/57, visiShip 1/5",20,25,5,100] }, { "round": 12, - "h_0": [1,15,12,0,0,6,8,"955db8af",172,"arcaneShip 0/10, kazimierzShip 1/42, preciShip 2/24, raidShip 1/69, skillfulShip 0/9, soloShip 1/6, suntShip 1/0, swiftShip 1/31, yanShip 0/1",24,31,7,111], + "h_0": [1,13,12,0,0,6,8,"955db8af",172,"arcaneShip 0/13, kazimierzShip 1/42, preciShip 2/24, raidShip 1/69, skillfulShip 0/9, soloShip 1/6, suntShip 1/0, swiftShip 1/31, yanShip 0/1",24,31,7,111], "ai_0": [1,7,12,0,2,6,8,"3c27819a",267,"arcaneShip 0/2, deputShip 0/18, kazimierzShip 0/8, lateranoShip 1/100, preciShip 1/41, raidShip 1/10, sargonShip 0/2, skillfulShip 1/26, suntShip 1/16, swiftShip 1/64, visiShip 1/10",18,31,13,113] }, { "round": 13, - "h_0": [1,5,12,0,0,6,8,"1bd1e6d0",244,"arcaneShip 1/10, kazimierzShip 1/54, preciShip 2/34, raidShip 1/105, skillfulShip 0/9, soloShip 0/6, suntShip 1/0, swiftShip 1/41, yanShip 0/1",20,57,37,122], + "h_0": [1,3,12,0,0,6,8,"1bd1e6d0",247,"arcaneShip 1/13, kazimierzShip 1/54, preciShip 2/34, raidShip 1/105, skillfulShip 0/9, soloShip 0/6, suntShip 1/0, swiftShip 1/41, yanShip 0/1",20,57,37,122], "ai_0": [0,0,14,0,0,6,0,"811c9dc5",0,"arcaneShip 0/2, deputShip 0/18, kazimierzShip 0/8, lateranoShip 0/108, preciShip 0/49, raidShip 0/15, sargonShip 0/2, skillfulShip 0/31, suntShip 0/16, swiftShip 0/71, visiShip 0/15",15,57,42,126] } ], @@ -1569,14 +1569,14 @@ "victory": true, "roundsPassed": 14, "eliminatedRound": null, - "lp": 5, + "lp": 3, "bandId": "band_amedic", "title": {"id":"comment_1","name":"卫戍之星","picId":"comment_icon_1","text":"对敌方领袖造成伤害最高(仅胜利时)"}, "trophies": 4, "reward": 400, - "stats": {"activatedLayers":276,"bossDamage":390000,"dmgDealt":2834408,"gold":135,"itemsEquipped":23,"kills":257,"leaks":50,"lpLost":23,"merges":5,"perfectRounds":9,"refreshes":21}, + "stats": {"activatedLayers":276,"bossDamage":390000,"dmgDealt":2827606,"gold":135,"itemsEquipped":23,"kills":256,"leaks":52,"lpLost":25,"merges":5,"perfectRounds":8,"refreshes":21}, "lineup": ["6_05_a@12,3[3_08_e_a+3_05_e_a]","4_14_b@11,3[3_11_e_b+6_05_e_a]","1_17_b@10,3","6_19_a@10,4","6_17_a@10,7[4_08_e_a+1_05_e_b]","6_06_a@10,8[1_01_e_a+4_04_e_a]","3_12_a@9,4[4_04_e_b+1_02_e_b]","3_13_b@9,8[2_01_e_a+4_03_e_a]"], - "bonds": ["arcaneShip 0/14","kazimierzShip 1/62","kjeragShip 0/8","preciShip 2/48","raidShip 1/105","sargonShip 1/2","skillfulShip 0/9","soloShip 0/6","suntShip 1/0","swiftShip 1/59","yanShip 0/1"] + "bonds": ["arcaneShip 0/17","kazimierzShip 1/62","kjeragShip 0/8","preciShip 2/48","raidShip 1/105","sargonShip 1/2","skillfulShip 0/9","soloShip 0/6","suntShip 1/0","swiftShip 1/59","yanShip 0/1"] }, "ai_0": { "alive": false, @@ -1588,7 +1588,7 @@ "title": {"id":"comment_6","name":"挥金如土","picId":"comment_icon_6","text":"消耗资金最多"}, "trophies": 3, "reward": 280, - "stats": {"activatedLayers":0,"bossDamage":0,"dmgDealt":2118906,"gold":126,"itemsEquipped":15,"kills":233,"leaks":61,"lpLost":26,"merges":3,"perfectRounds":9,"refreshes":23}, + "stats": {"activatedLayers":0,"bossDamage":0,"dmgDealt":2129726,"gold":126,"itemsEquipped":15,"kills":233,"leaks":61,"lpLost":26,"merges":3,"perfectRounds":9,"refreshes":23}, "lineup": [], "bonds": ["arcaneShip 0/2","deputShip 0/18","kazimierzShip 0/8","lateranoShip 0/108","preciShip 0/49","raidShip 0/15","sargonShip 0/2","skillfulShip 0/31","suntShip 0/16","swiftShip 0/71","visiShip 0/15"] } diff --git a/test/golden/roster.json b/test/golden/roster.json index ff37a261..d6efaf39 100644 --- a/test/golden/roster.json +++ b/test/golden/roster.json @@ -135,27 +135,27 @@ "time": 110, "ticks": 3300, "reason": "timeout", - "killed": 83, + "killed": 82, "total": 85, "unspawned": 0, "bossHpLeft": null, "rngDraws": 65, "errors": {"count":0,"kinds":[]}, "players": { - "p1": {"killed":83,"total":85,"perfect":false,"leaks":2,"leaksUncounted":0,"coins":14,"dmg":118566,"bossDmg":0,"heal":18912,"deaths":4,"layerGains":{"preciShip":3}} + "p1": {"killed":82,"total":85,"perfect":false,"leaks":3,"leaksUncounted":0,"coins":12,"dmg":119937,"bossDmg":0,"heal":18305,"deaths":4,"layerGains":{"preciShip":3}} }, "units": [ - ["p1",1,"op","chess_char_1_10_b",0,"uniequip_002_sunbr",2493,1,5,1,1,0,298,4,3], - ["p1",2,"op","chess_char_1_12_b",1,"uniequip_002_estell",2042.2,1,7,4,1786,818,173,29,2], - ["p1",3,"op","chess_char_1_20_b",1,"uniequip_002_liskam",2697.7,1,10,12,23549,748,0,74,1], - ["p1",4,"op","chess_char_1_18_b",1,"uniequip_002_utage",1059.8,1,11,8,23248,8723,6429,94,1], + ["p1",1,"op","chess_char_1_10_b",0,"uniequip_002_sunbr",2493,1,5,1,1,0,366,5,4], + ["p1",2,"op","chess_char_1_12_b",1,"uniequip_002_estell",1868.8,1,7,4,2973,1059,173,30,2], + ["p1",3,"op","chess_char_1_20_b",1,"uniequip_002_liskam",840.52,1,10,11,23272,2789,0,73,1], + ["p1",4,"op","chess_char_1_18_b",1,"uniequip_002_utage",3354,1,11,7,23856,5745,5745,89,1], ["p1",5,"op","chess_char_1_19_b",1,"uniequip_002_wildmn",0,0,14,8,43612,8315,0,80,2], - ["p1",6,"op","chess_char_1_13_b",1,"uniequip_002_podego",2446.5,1,8,3,3,0,0,2,2], - ["p1",7,"op","chess_char_1_14_b",1,"uniequip_002_greyy",0,0,12,9,874,2612,0,18,1], - ["p1",8,"op","chess_char_1_17_b",1,"uniequip_002_indigo",0,0,15,8,12385,1613,0,14,1], - ["p1",9,"op","chess_char_2_01_a",1,null,1694,1,4,11,4929,0,0,26,1], - ["p1",10,"op","chess_char_2_02_a",1,null,1400,1,6,0,0,0,6455,38,4], - ["p1",11,"op","chess_char_2_04_a",1,null,977,1,9,19,8179,545,0,58,2], + ["p1",6,"op","chess_char_1_13_b",1,"uniequip_002_podego",2446.5,1,8,6,1159,0,0,6,3], + ["p1",7,"op","chess_char_1_14_b",1,"uniequip_002_greyy",0,0,12,8,2471,2981,0,19,1], + ["p1",8,"op","chess_char_1_17_b",1,"uniequip_002_indigo",0,0,15,6,9632,1613,0,7,1], + ["p1",9,"op","chess_char_2_01_a",1,null,1694,1,4,11,4437,0,0,26,1], + ["p1",10,"op","chess_char_2_02_a",1,null,1400,1,6,0,0,0,6463,38,4], + ["p1",11,"op","chess_char_2_04_a",1,null,977,1,9,20,8524,0,0,57,3], ["p1",12,"op","chess_char_2_05_a",1,null,0,0,13,0,0,4616,3219,20,1], ["p1",13,"token","token_10000_silent_healrb",null,null,1000,1,106,0,0,0,2339,37,null], ["-","~1","device","trap_1105_accrate",null,null,100,1,1,0,0,0,0,0,null], @@ -169,22 +169,22 @@ "enemy_1041_lazerd": [1,1,0,418,2430], "enemy_1116_liprr_2": [1,1,0,28,6750], "enemy_1169_duphlx": [1,1,0,11,3600], - "enemy_1195_sfyin": [12,12,0,102,21600], + "enemy_1195_sfyin": [12,12,0,125,21600], "enemy_1196_msfyin": [24,24,0,0,48], - "enemy_1197_sfshu": [9,9,0,437,20250], + "enemy_1197_sfshu": [9,9,0,347,20250], "enemy_1198_msfshu": [27,27,0,0,81], "enemy_1200_msfjin": [1,1,0,0,30], "enemy_1234_dsubrl_2": [1,1,0,7959,12600], - "enemy_1292_duskld": [1,1,0,1152,9010], - "enemy_1387_winshd": [1,0,0,778,9309], + "enemy_1292_duskld": [1,0,0,1408,9924], + "enemy_1387_winshd": [1,0,0,952,9766], "enemy_1502_crowns": [1,1,0,259,5400], - "enemy_2008_flking": [1,0,0,11860,0], + "enemy_2008_flking": [1,0,0,10628,0], "enemy_9016_acstmr": [1,1,0,0,8] }, - "hooks": [1,105,3300,574,574,636,728,216,87,91,21,20,0,15537,205,28,85,0,1,91,1,0,0], - "events": {"atk":638,"bounty":7,"deploy":17,"die":91,"dmg":707,"engage":10,"fx":89,"heal":191,"layer":1,"skill":41,"spawn":101,"status":198}, - "fx": {"aoe":1,"blink":1,"displace":8,"ember":1,"explode":8,"garrison":1,"heal":3,"pulse":31,"reveal":1,"sleep":6,"summon":25,"undying":1,"zone":2}, - "snaps": "ba9efbdf a02eb193 460ac297 ade04e6a 7abe4489 4fa14e24 2d31bcf9 b7f6436a 82e99758 65a1db5b 88f5cc4f" + "hooks": [1,105,3300,572,572,645,737,212,86,90,24,22,0,16965,221,27,85,0,1,90,1,0,0], + "events": {"atk":644,"bounty":6,"deploy":17,"die":90,"dmg":720,"engage":10,"fx":95,"heal":182,"layer":1,"skill":46,"spawn":101,"status":216}, + "fx": {"aoe":1,"blink":1,"displace":8,"ember":1,"explode":8,"garrison":1,"heal":4,"pulse":31,"reveal":1,"revive":1,"sleep":9,"summon":25,"undying":1,"zone":3}, + "snaps": "c29e3835 5fb0366b b546dd37 6a32dfd5 34277801 63ebe110 4c1bc600 26e3b0be 9fb56d80 12d64b27 70d04cf0" }, "roster-004": { "about": "pass 0 band 2: chess_char_2_08_a chess_char_2_17_a chess_char_2_18_a chess_char_2_07_a chess_char_2_09_a chess_char_2_11_a chess_char_2_13_a chess_char_2_16_a chess_char_2_12_a chess_char_2_06_a chess_char_2_10_a chess_char_2_14_a", @@ -1350,29 +1350,29 @@ "round": 4, "seed": 3256727035, "waveId": "act1autochess_04", - "time": 98.07, - "ticks": 2942, + "time": 102.4, + "ticks": 3072, "reason": "cleared", - "killed": 29, + "killed": 28, "total": 29, "unspawned": 0, "bossHpLeft": null, - "rngDraws": 157, + "rngDraws": 141, "errors": {"count":0,"kinds":[]}, - "players": {"p1":{"killed":29,"total":29,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":8,"dmg":238140,"bossDmg":0,"heal":3572,"deaths":3,"layerGains":{}}}, + "players": {"p1":{"killed":28,"total":29,"perfect":false,"leaks":1,"leaksUncounted":0,"coins":8,"dmg":236542,"bossDmg":0,"heal":3433,"deaths":4,"layerGains":{}}}, "units": [ - ["p1",1,"op","chess_char_1_02_b",0,"none",3229.86,1,5,1,1795,1562,779,14,1], - ["p1",2,"op","chess_char_1_20_a",0,null,893.77,1,6,2,6656,1304,0,37,2], + ["p1",1,"op","chess_char_1_02_b",0,"none",3674.03,1,5,0,3262,1093,640,16,1], + ["p1",2,"op","chess_char_1_20_a",0,null,0,0,6,0,2746,2198,0,24,1], ["p1",3,"op","chess_char_1_04_b",0,"none",0,0,11,2,7053,2904,0,33,1], - ["p1",4,"op","chess_char_1_08_b",0,"none",2414.98,1,44,1,11193,3115,0,38,3], + ["p1",4,"op","chess_char_1_08_b",0,"none",2414.98,1,44,1,11193,3115,0,38,4], ["p1",5,"op","chess_char_1_18_a",0,null,2530,1,15,0,20592,2233,2233,45,4], ["p1",6,"op","chess_char_1_19_a",0,null,0,0,9,3,7931,1482,0,31,1], - ["p1",7,"op","chess_char_1_17_a",0,null,1139,1,7,0,11585,0,0,15,2], + ["p1",7,"op","chess_char_1_17_a",0,null,1139,1,7,1,11229,0,0,11,2], ["p1",8,"op","chess_char_1_01_b",0,"none",1341,1,10,4,16855,0,0,83,5], ["p1",9,"op","chess_char_1_03_b",0,"none",1311,1,12,5,69334,0,0,39,2], ["p1",10,"op","chess_char_1_06_b",0,"none",1297,1,14,3,34003,559,559,73,2], - ["p1",11,"op","chess_char_1_07_b",1,"none",1527,1,4,4,29924,0,0,27,1], - ["p1",12,"op","chess_char_1_09_b",0,"none",2085,1,8,4,21218,0,0,75,25], + ["p1",11,"op","chess_char_1_07_b",1,"none",1527,1,4,5,27587,0,0,32,2], + ["p1",12,"op","chess_char_1_09_b",0,"none",2085,1,8,4,24758,0,0,75,25], ["-","~1","device","trap_1105_accrate",null,null,100,0,1,0,0,0,0,0,null], ["-","~2","device","trap_1105_accrate",null,null,100,1,2,0,0,0,0,0,null], ["-","~3","device","trap_1105_accrate",null,null,100,1,3,0,0,0,0,0,null] @@ -1381,19 +1381,19 @@ "enemy_10043_sailor": [1,1,0,0,4950], "enemy_10124_uashld_2": [1,1,0,1427,22500], "enemy_1081_sotisd": [1,1,0,1110,13500], - "enemy_1116_liprr": [12,12,0,384,59400], - "enemy_1116_liprr_2": [6,6,0,307,40500], - "enemy_1121_lifbos": [3,3,0,4543,54000], - "enemy_1174_duholy": [1,1,0,1708,13500], + "enemy_1116_liprr": [12,12,0,130,59400], + "enemy_1116_liprr_2": [6,6,0,373,40500], + "enemy_1121_lifbos": [3,3,0,4950,54000], + "enemy_1174_duholy": [1,1,0,1912,13500], "enemy_1229_darmy_2": [1,1,0,2835,4950], "enemy_1325_cbgpro_2": [1,1,0,55,4140], "enemy_1504_cqbw": [1,1,0,791,9000], - "enemy_2085_skzjxd_2": [1,1,0,0,11700] + "enemy_2085_skzjxd_2": [1,0,1,0,10102] }, - "hooks": [1,45,2942,615,615,727,734,928,32,33,49,47,32,9649,110,27,29,0,1,32,0,0,0], - "events": {"atk":688,"bounty":4,"deploy":13,"die":33,"dmg":726,"engage":12,"fx":41,"heal":32,"skill":96,"spawn":44,"status":256}, - "fx": {"crit":26,"dp":3,"explode":1,"liberate":6,"shield":4,"telegraph":1}, - "snaps": "08475251 060e1404 a77d3fa6 74ab94fb 39ec40a8 4a899aaf 8a49b1ba b7ea4461 d110804c df9fa85e" + "hooks": [1,45,3072,593,593,708,716,789,32,34,50,48,32,10207,109,27,29,1,1,32,0,0,0], + "events": {"atk":666,"bounty":4,"deploy":13,"die":33,"dmg":708,"engage":12,"fx":42,"heal":32,"leak":1,"skill":98,"spawn":44,"status":250}, + "fx": {"crit":29,"dp":4,"explode":1,"liberate":5,"shield":2,"telegraph":1}, + "snaps": "08475251 060e1404 a77d3fa6 74ab94fb 597ed35c b0c3395a 90aa0cea a4456ef2 82f4194a 8213606e 9b3cc85b" }, "roster-022": { "about": "pass 1 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", @@ -1411,18 +1411,18 @@ "total": 28, "unspawned": 0, "bossHpLeft": null, - "rngDraws": 158, + "rngDraws": 157, "errors": {"count":0,"kinds":[]}, "players": {"p1":{"killed":16,"total":28,"perfect":false,"leaks":12,"leaksUncounted":0,"coins":4,"dmg":203302,"bossDmg":0,"heal":19896,"deaths":6,"layerGains":{}}}, "units": [ - ["p1",1,"op","chess_char_1_10_b",1,"none",0,0,7,1,6370,8454,1895,21,2], + ["p1",1,"op","chess_char_1_10_b",1,"none",0,0,7,1,6370,8435,1895,21,2], ["p1",2,"op","chess_char_1_12_b",0,"none",0,0,8,3,27258,5955,714,18,1], ["p1",3,"op","chess_char_1_20_b",0,"none",2872,1,6,1,11594,10327,0,24,8], ["p1",4,"op","chess_char_1_18_b",0,"none",0,0,9,0,4940,7421,2877,6,2], ["p1",5,"op","chess_char_1_19_b",0,"none",0,0,10,2,20108,8644,0,42,1], ["p1",6,"op","chess_char_1_13_b",0,"none",1095,1,3,0,17174,0,3175,49,2], - ["p1",7,"op","chess_char_1_14_b",0,"none",1430,1,4,6,77183,500,0,34,2], - ["p1",8,"op","chess_char_1_17_b",0,"none",1356,1,12,1,18041,1000,0,7,3], + ["p1",7,"op","chess_char_1_14_b",0,"none",1430,1,4,6,75682,500,0,34,2], + ["p1",8,"op","chess_char_1_17_b",0,"none",1356,1,12,1,19542,1000,0,6,3], ["p1",9,"op","chess_char_2_01_a",0,null,677.6,1,35,0,5908,678,0,9,0], ["p1",10,"op","chess_char_2_02_a",0,null,1400,1,5,0,0,1000,8195,45,2], ["p1",11,"op","chess_char_2_04_a",0,null,0,0,11,2,14727,1027,0,25,7], @@ -1433,7 +1433,7 @@ "enemies": { "enemy_1007_slime": [1,1,0,0,950], "enemy_1025_reveng": [1,1,0,556,8640], - "enemy_1116_liprr": [12,9,3,727,95134], + "enemy_1116_liprr": [12,9,3,708,95134], "enemy_1116_liprr_2": [6,4,2,1413,56359], "enemy_1121_lifbos": [3,0,2,1910,16825], "enemy_1160_hvyslr": [1,1,0,2131,17280], @@ -1442,10 +1442,10 @@ "enemy_1404_msnip": [1,0,1,6948,5875], "enemy_2002_bearmi": [1,0,1,9048,2918] }, - "hooks": [1,43,3300,363,363,888,880,767,22,33,31,31,0,12925,98,30,28,11,1,22,0,0,0], - "events": {"atk":382,"bounty":2,"deploy":13,"die":22,"dmg":880,"engage":10,"fx":26,"heal":463,"leak":11,"skill":62,"spawn":42,"status":202}, + "hooks": [1,43,3300,361,361,887,879,766,22,33,31,31,0,12928,98,30,28,11,1,22,0,0,0], + "events": {"atk":380,"bounty":2,"deploy":13,"die":22,"dmg":879,"engage":10,"fx":26,"heal":462,"leak":11,"skill":62,"spawn":42,"status":202}, "fx": {"buff":1,"crit":1,"liberate":4,"shield":16,"zone":4}, - "snaps": "9001a773 d682bb23 8fbcd651 5df53986 07e3ac0f 0f7aa6b9 5acdf417 61e10070 400a77ca 652541a4 8bc87622" + "snaps": "f47a9f8c 4266c760 0e931b86 d24c1ab5 c099f108 f478288e 5ac67dbc 4b7a912c 8be6bdb2 03342f4c 6638335a" }, "roster-023": { "about": "pass 1 band 2: chess_char_2_08_a chess_char_2_17_a chess_char_2_18_a chess_char_2_07_a chess_char_2_09_a chess_char_2_11_a chess_char_2_13_a chess_char_2_16_a chess_char_2_12_a chess_char_2_06_a chess_char_2_10_a chess_char_2_14_a", diff --git a/test/sim/feedback5-mystic-store.test.js b/test/sim/feedback5-mystic-store.test.js new file mode 100644 index 00000000..d9324dc3 --- /dev/null +++ b/test/sim/feedback5-mystic-store.test.js @@ -0,0 +1,118 @@ +// test/sim/feedback5-mystic-store.test.js — the 秘术师 energy store at the attack check (GitHub #181; PRTS 分支特性信息 秘术师 +// "能量储存与攻击占用相同的攻击间隔:在进行攻击判定时,若范围内存在有效目标,则进行普通攻击;若无有效目标且能量储存数未满,则改为储存 +// 一份攻击能量(属于攻击行为);仅没有有效目标,且能量储存数已满的情况下才进入待机状态", "攻击被打断且弹道未能成功生成的情况下,储存的 +// 能量不会被消耗"; PRTS 异常效果 缴械 "秘术师储存能量同样无法进行") — server/sim/professions.js installMystic (storeEnergy / +// releaseEnergy / hitsFn), server/sim/ai.js updateAlly / performAttack, 深靛's kit (a bound enemy is no valid target). +// Run: node --test test/sim/feedback5-mystic-store.test.js + +import { test } from 'node:test'; +import assert from 'node:assert/strict'; +import { makeBattle, enemyRec, checkInvariants } from '../helpers/battleHarness.js'; +import { getDefaultSource } from '../../server/sim/simdata.js'; + +const ds = getDefaultSource(); +const ID = 'chess_char_1_17_a'; // 深靛 (normal: trait times 3) +const ELITE = 'chess_char_1_17_b'; // 深靛 elite (MSC-X: times 4) +const TICK = 1 / 30; +const approx = (a, b, msg, eps = TICK + 1e-6) => assert.ok(Math.abs(a - b) <= eps, `${msg}: ${a} vs ${b}`); +const dummy = (key, o = {}) => enemyRec({ key, hp: 1e9, speed: 0, ...o }); +/** Her record without the talent's random bind (柔光缚目 prob 0): the binds of these tests are placed by hand. */ +const noBind = (id) => { + const r = ds.rawChess(id); + return { [id]: { ...r, talents: r.talents.map((t) => ({ ...t, bb: { ...t.bb, prob: 0 } })) } }; +}; + +function field({ id = ID, enemies = [], setup } = {}) { + return makeBattle({ + seed: 3, autoFinish: false, timeLimit: 300, hooks: ['attack', 'damaged'], captureNoisy: true, setup, + defs: { chess: noBind(id), enemies: { e: dummy('e') } }, units: [{ chessId: id, row: 10, col: 4 }], enemies, + }); +} +const attacksOf = (h, u) => h.hooksOf('attack').filter((c) => c.attacker === u); +const done = (h) => { checkInvariants(h.b); assert.equal(h.b.errors.length, 0, JSON.stringify(h.b.errors[0])); }; + +test('no target: her first attack check stores at once (an attack action: the interval restarts), then one energy per attack interval up to the trait times; full ⇒ idle with the attack ready', () => { + for (const [id, max] of [[ID, 3], [ELITE, 4]]) { + const h = field({ id }); + const u = h.unit(id); + h.step(); + assert.equal(u.trait.stored, 1, `${id}: the attack is ready at deployment — stored at the first check`); + const iv = u.s.interval; + approx(u.atkCd, iv, `${id}: storing took the attack interval`, 1e-9); + let last = h.b.time; + for (let n = 2; n <= max; n++) { + assert.ok(h.runUntil(() => u.trait.stored === n, iv + 1), `${id}: energy ${n}`); + approx(h.b.time - last, iv, `${id}: energy ${n} one interval after the last`); + last = h.b.time; + } + h.run(3 * iv); + assert.equal(u.trait.stored, max, `${id}: at most ${max}`); + assert.equal(u.atkCd, 0, `${id}: full — idle, the attack ready`); + assert.equal(attacksOf(h, u).length, 0); + done(h); + } +}); + +test('a target in range while she holds energies: attacked at once, the energies leave with that attack and land with its main hit, one arts attack hit each', () => { + const h = field({ enemies: [{ key: 'e', pos: [10, 6], time: 12 }] }); + const u = h.unit(ID); + assert.ok(h.runUntil(() => attacksOf(h, u).length === 1, 15)); + approx(h.b.time, 12, 'attacked in the tick the enemy appeared (the full store idled with the attack ready)', 2 * TICK); + assert.equal(u.trait.stored, 0, 'released with the attack (before the bolt lands)'); + h.run(1); + const hits = h.hooksOf('damaged').filter((c) => c.source === u && c.dmg.isAttack); + assert.equal(hits.length, 1 + 3, 'the main hit + 3 energies'); + assert.ok(hits.every((c) => c.type === 'arts' && c.dmg.attackId === hits[0].dmg.attackId), 'arts, one attack'); + assert.ok(hits.every((c) => Math.abs(c.amount - hits[0].amount) < 1e-6), 'each energy hits as the main hit'); + done(h); +}); + +test('a bind on her only target is no valid target: her next attack check stores an energy, and the freed enemy waits for the interval the store took (GitHub #181)', () => { + const h = field({ enemies: [{ key: 'e', pos: [10, 6] }] }); + const u = h.unit(ID); + assert.ok(h.runUntil(() => attacksOf(h, u).length === 1, 2)); + const t0 = h.b.time, iv = u.s.interval; + assert.equal(u.trait.stored, 0); + const [e] = h.enemies(); + h.b.applyStatus(e, 'bind', { duration: 4 }); + assert.ok(h.runUntil(() => u.trait.stored === 1, iv + 1)); + approx(h.b.time - t0, iv, 'stored at her next attack check, during the bind'); + assert.equal(attacksOf(h, u).length, 1, 'no attack at the bound enemy'); + assert.ok(h.runUntil(() => attacksOf(h, u).length === 2, iv + 1)); + approx(h.b.time - t0, 2 * iv, 'the bind ended at +4 s; her next check comes an interval after the store', 2 * TICK + 1e-6); + assert.equal(u.trait.stored, 0, 'the energy left with that attack'); + h.run(1); + const n = h.hooksOf('damaged').filter((c) => c.source === u && c.dmg.isAttack && c.t > t0 + 2 * iv - 0.1).length; + assert.equal(n, 2, 'the main hit + the stored energy'); + done(h); +}); + +test('disarmed (缴械) or stunned: no storing; an attack cancelled before its shot keeps the energies; a redeployment holds none [ASSUMED]', () => { + const h = field(); + const u = h.unit(ID); + h.step(); + assert.equal(u.trait.stored, 1); + h.b.addBuff(u, { key: 'test:disarm', duration: 10, flags: { disarm: true } }); + h.run(9.5); + assert.equal(u.trait.stored, 1, 'disarmed: "秘术师储存能量同样无法进行"'); + h.run(1); + assert.equal(u.trait.stored, 2, 'stored at the first check after the disarm'); + h.b.applyStatus(u, 'stun', { duration: 10 }); + h.run(9.5); + assert.equal(u.trait.stored, 2, 'stunned: no attack check'); + h.run(4); + assert.equal(u.trait.stored, 3); + // an attack whose shot never forms (beforeAttack empties it): the energies stay + let cancel = true; + h.b.on('beforeAttack', (ctx) => { if (ctx.attacker === u && cancel) ctx.targets = []; }); + h.spawn('e', { pos: [10, 6] }); + h.run(0.5); + assert.equal(attacksOf(h, u).length, 0); + assert.equal(u.trait.stored, 3, '"攻击被打断且弹道未能成功生成的情况下,储存的能量不会被消耗"'); + cancel = false; + // knocked out holding them: the redeployment starts empty + h.b.retreat(u); + h.b.redeploy(u, { free: true }); + assert.equal(u.trait.stored, 0, 'a redeployment holds no energy'); + done(h); +});