fix: 修复洛洛 S2 越界续锁与旧弹倍率干扰;Golden 因独立浮游/本体攻击更新 roster-004、roster-005、bond-victoriaShip-low、bond-victoriaShip-high、coop3-ABYSS-5、coop4-FUNNY-6、coop4-ABYSS-7、coop2-NORMAL-8-serverrun、coop2-NORMAL-1-coverage-standins
This commit is contained in:
1 parent
bc50cac01f
commit
f567e8045e
9 files changed
+461
-127
No files matched your search
+1
-1
@@ -1341,7 +1341,7 @@ header of professions.js).
|
|||||||
| loopshooter | 回环射手 (user playtest #3): every attack throws a boomerang (`ai.js throwBoomerang`, projectile `'boomerang'`) out to the target at 15 tiles/s — it hits on arrival — and back to the thrower's current position at 3.75 tiles/s without damage (PRTS 跃跃 "投射物飞行速度15,返回时飞行速度3.75"); attacks only while holding it (every boomerang thrown caught — "必须回收全部回旋投掷物才可以进行下一次攻击", `unit.trait.boomerangsOut`) and with the attack cooldown ready, so the real interval is the longer of the two; a target dead mid-flight is not hit (it still flies to the last position and back); knocked out / withdrawn ⇒ lost, a redeployed thrower holds a fresh one; 跃跃 S2's extra boomerangs share the one flight (cnt hits); each catch fires `boomerangCaught`, and an attack profile's `boomerangOnward(ctx)` flies it on after the first hit before it turns back — ctx `hit` (a hit of the same attack), `comeBack(x, y)` once (a content error sends it back from the hit point): 娜仁图亚 S1 bounces, S2 dashes on and hits on its way back (kits/ops/op-narant.js) |
|
| loopshooter | 回环射手 (user playtest #3): every attack throws a boomerang (`ai.js throwBoomerang`, projectile `'boomerang'`) out to the target at 15 tiles/s — it hits on arrival — and back to the thrower's current position at 3.75 tiles/s without damage (PRTS 跃跃 "投射物飞行速度15,返回时飞行速度3.75"); attacks only while holding it (every boomerang thrown caught — "必须回收全部回旋投掷物才可以进行下一次攻击", `unit.trait.boomerangsOut`) and with the attack cooldown ready, so the real interval is the longer of the two; a target dead mid-flight is not hit (it still flies to the last position and back); knocked out / withdrawn ⇒ lost, a redeployed thrower holds a fresh one; 跃跃 S2's extra boomerangs share the one flight (cnt hits); each catch fires `boomerangCaught`, and an attack profile's `boomerangOnward(ctx)` flies it on after the first hit before it turns back — ctx `hit` (a hit of the same attack), `comeBack(x, y)` once (a content error sends it back from the hit point): 娜仁图亚 S1 bounces, S2 dashes on and hits on its way back (kits/ops/op-narant.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 |
|
| 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 |
|
| 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) |
|
| funnel | drone damage 20 % → +15 %/hit on the same target → 110 % (bb init/delta/max). Rockrock S2 detaches this multiplier from new body shots and inherits the trait ramp in an independent skill tick: `rockr:drone`, arts, `isSkill:true`, `isAttack:false`. Older projectiles cannot change its local ramp. A living selectable lock need not remain in body range; end hands the ramp back and restores the normal multiplier (DESIGN §29.16) |
|
||||||
| 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 |
|
| 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 备注) |
|
| 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) |
|
| physician | heal the lowest HP% injured ally in range (a skill `targeting.maxTargets` widens any heal profile) |
|
||||||
|
|||||||
@@ -167,6 +167,12 @@ Profession traits (default behaviours implemented once in the engine, keyed by `
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
Rockrock S2 releases its trait drone into an independent skill tick (§29.16). Acquisition uses the body's normal
|
||||||
|
target selection; a living selectable lock stays valid outside the body's range. The body retains its own ranged
|
||||||
|
ordinary attacks. The released ramp inherits the trait state but is isolated from older projectiles. Ending the
|
||||||
|
skill returns that ramp to the trait and restores the normal multiplier and overload cap. S1 and other operators'
|
||||||
|
funnel attacks keep their existing paths.
|
||||||
|
|
||||||
## 7. Content modules (server/sim/content + match/effectsMeta handlers)
|
## 7. Content modules (server/sim/content + match/effectsMeta handlers)
|
||||||
|
|
||||||
Each domain file `server/sim/content/{tokens,bonds,garrisons,items,bands,enemies,bosses,devices,choices}.js` exports `install(battle)` (battle side; called once per Battle by `content/index.js → installContent`) and `registerMeta(registry)` (prep side; called once at server boot by `match/effectsMeta.js`, API documented in `docs/META.md`). Kits live one per file in `content/kits/ops/` (`export default { [baseChessId]: (bb, chess, def) => Kit }`), listed in `content/kits/index.js` (guide: `content/kits/README.md`). Content must be **data-driven from blackboards** (numbers never hard-coded when a blackboard key exists). Every effect gets at least one unit test in `test/content/*.test.js` using the `test/helpers/battleHarness.js` harness (provided by sim-core).
|
Each domain file `server/sim/content/{tokens,bonds,garrisons,items,bands,enemies,bosses,devices,choices}.js` exports `install(battle)` (battle side; called once per Battle by `content/index.js → installContent`) and `registerMeta(registry)` (prep side; called once at server boot by `match/effectsMeta.js`, API documented in `docs/META.md`). Kits live one per file in `content/kits/ops/` (`export default { [baseChessId]: (bb, chess, def) => Kit }`), listed in `content/kits/index.js` (guide: `content/kits/README.md`). Content must be **data-driven from blackboards** (numbers never hard-coded when a blackboard key exists). Every effect gets at least one unit test in `test/content/*.test.js` using the `test/helpers/battleHarness.js` harness (provided by sim-core).
|
||||||
|
|||||||
@@ -274,3 +274,27 @@ enemy: picking emitted a unit click with no definition, instead of the tile clic
|
|||||||
engine-canvas regression retains the card/100 HP assertions and also covers another field refresh, live HP loss and
|
engine-canvas regression retains the card/100 HP assertions and also covers another field refresh, live HP loss and
|
||||||
closing the card when the crate is destroyed. Device metadata supplied by the new entry still wins; changing fields
|
closing the card when the crate is destroyed. Device metadata supplied by the new entry still wins; changing fields
|
||||||
does not carry old devices across. Gameplay and allied targeting rules are unchanged.
|
does not carry old devices across. Gameplay and allied targeting rules are unchanged.
|
||||||
|
|
||||||
|
### 29.16 Rockrock S2 drone pursuit
|
||||||
|
|
||||||
|
The official `skill_table.json` entry `skchr_rockr_2`, ranks 4 and 7, keeps a released drone locked until the enemy
|
||||||
|
dies or the skill ends; leaving the operator's range is not a return condition. The old `beforeAttack` callback
|
||||||
|
both replaced the body's target and required the lock to remain in range. With no body candidate, the attack loop
|
||||||
|
never reached that callback at all.
|
||||||
|
|
||||||
|
S2 now ticks one independent arts skill drone (`attack@cnt = 0`, one trait drone). It acquires inside the normal
|
||||||
|
range, keeps a living selectable target after it leaves, and reacquires only after losing that target. The body
|
||||||
|
continues its own in-range attacks. The released drone inherits the trait's target/ramp, resolved module init/delta,
|
||||||
|
live attack interval and overload cap; its multiplier is detached from newly launched body shots during S2 and
|
||||||
|
restored on end. Its local ramp is isolated from older ordinary projectiles and handed back to the trait at end;
|
||||||
|
existing projectiles keep their launch profile. Natural expiry, explicit stop and caster death
|
||||||
|
clear released state; the existing overload buff/cap restoration and stun stay in place. S1, other operators and
|
||||||
|
redeployment ramp rules are unchanged.
|
||||||
|
|
||||||
|
[ASSUMED] Released hits use the existing independent-skill-drone model: no launch-flight delay, and body control
|
||||||
|
does not pause an already released drone. A target becoming hidden or otherwise unselectable releases the lock
|
||||||
|
using the shared target filter. The tables do not settle these details. The kit and PR name these assumptions.
|
||||||
|
Sources: [official skill table](https://github.com/Kengxxiao/ArknightsGameData/blob/master/zh_CN/gamedata/excel/skill_table.json)
|
||||||
|
and [PRTS mode levels](https://prts.wiki/w/卫戍协议:盟约). Controlled regressions cover both forms, leaving/returning,
|
||||||
|
newcomers, combat death, end/stop, module ramp, cadence and overload. A fixed-seed production Match and real headless
|
||||||
|
Chrome normal-input route reproduce the original failure and the repaired pursuit separately.
|
||||||
@@ -1,10 +1,18 @@
|
|||||||
// server/sim/content/kits/ops/chess_char_2_10-rockr.js — 洛洛 (char_4040_rockr) kit, tier 2.
|
// server/sim/content/kits/ops/chess_char_2_10-rockr.js — 洛洛 (char_4040_rockr) kit, tier 2.
|
||||||
// Conventions of the tier-2 kits: ../shared/tier2.js; kit contract and rules: ../README.md.
|
// Conventions of the tier-2 kits: ../shared/tier2.js; kit contract and rules: ../README.md.
|
||||||
|
|
||||||
import { canTargetEnemy } from '../../../targeting.js';
|
import { canTargetEnemy, sortEnemyTargets } from '../../../targeting.js';
|
||||||
import { bodyInKeys } from '../../../body.js';
|
|
||||||
import { num, talentBb, up } from '../shared/tier1.js';
|
import { num, talentBb, up } from '../shared/tier1.js';
|
||||||
import { onDefaultSkill } from '../shared/tier2.js';
|
|
||||||
|
export const DRONE_TAG = 'rockr:drone';
|
||||||
|
|
||||||
|
const firstTarget = (battle, unit) => {
|
||||||
|
const prof = unit.profile;
|
||||||
|
const candidates = battle.enemiesInKeys(unit.rangeKeys, unit, prof);
|
||||||
|
for (const e of battle.blockedTargets(unit, prof)) if (!candidates.includes(e)) candidates.push(e);
|
||||||
|
sortEnemyTargets(battle, unit, candidates, prof.priority);
|
||||||
|
return candidates[0] ?? null;
|
||||||
|
};
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
// ---------------------------------------------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------------------------------------------
|
||||||
@@ -15,7 +23,6 @@ export default {
|
|||||||
// S1 战术咏唱·γ型 (alt): ASPD +attack_speed; the target lock belongs to 自负此轭 only.
|
// S1 战术咏唱·γ型 (alt): ASPD +attack_speed; the target lock belongs to 自负此轭 only.
|
||||||
chess_char_2_10_a: (bb, chess) => {
|
chess_char_2_10_a: (bb, chess) => {
|
||||||
const t = talentBb(chess, 0);
|
const t = talentBb(chess, 0);
|
||||||
const s2 = onDefaultSkill(chess);
|
|
||||||
const endOverload = (battle, unit) => {
|
const endOverload = (battle, unit) => {
|
||||||
if (unit.mem.rockFunnel) { unit.profile.funnel = unit.mem.rockFunnel; unit.mem.rockFunnel = null; }
|
if (unit.mem.rockFunnel) { unit.profile.funnel = unit.mem.rockFunnel; unit.mem.rockFunnel = null; }
|
||||||
battle.removeBuff(unit, 'rockr:overload');
|
battle.removeBuff(unit, 'rockr:overload');
|
||||||
@@ -26,19 +33,52 @@ export default {
|
|||||||
onStart({ battle, unit, skill }) {
|
onStart({ battle, unit, skill }) {
|
||||||
unit.mem.rockOverAt = battle.time + skill.duration / 2;
|
unit.mem.rockOverAt = battle.time + skill.duration / 2;
|
||||||
unit.mem.rockOver = false;
|
unit.mem.rockOver = false;
|
||||||
unit.mem.rockLock = null;
|
// The released drone inherits the trait's ramp; the body still attacks only inside its own range.
|
||||||
|
// `funnelMul` separates the addition; older profiles fold it into `dmgMul`. Keep launched shots unchanged.
|
||||||
|
const key = typeof unit.profile.funnelMul === 'function' ? 'funnelMul' : 'dmgMul';
|
||||||
|
const mul = unit.profile[key];
|
||||||
|
unit.profile = { ...unit.profile, [key]: null };
|
||||||
|
const lock = firstTarget(battle, unit);
|
||||||
|
unit.mem.rockDrone = { lock, cd: 0, key, mul,
|
||||||
|
target: unit.trait.funnelTarget, scale: unit.trait.funnelScale };
|
||||||
|
unit.mem.rockLock = lock;
|
||||||
},
|
},
|
||||||
onTick({ battle, unit }) {
|
onTick({ battle, unit, dt }) {
|
||||||
if (unit.mem.rockOver || battle.time + 1e-9 < unit.mem.rockOverAt) return;
|
if (!unit.mem.rockOver && battle.time + 1e-9 >= unit.mem.rockOverAt) {
|
||||||
unit.mem.rockOver = true;
|
unit.mem.rockOver = true;
|
||||||
|
const f = unit.profile.funnel;
|
||||||
|
if (f) { unit.mem.rockFunnel = f; unit.profile.funnel = { ...f, max: f.max * num(bb.scale, 1) }; }
|
||||||
|
battle.addBuff(unit, { key: 'rockr:overload', mods: { atkPct: num(bb.atk) }, visible: true, tags: ['skill'] });
|
||||||
|
battle.fx('overload', { x: unit.x, y: unit.y, id: unit.id });
|
||||||
|
}
|
||||||
|
const d = unit.mem.rockDrone;
|
||||||
|
if (!d || !unit.alive || !unit.skill.active) return;
|
||||||
|
d.cd = Math.max(0, d.cd - dt);
|
||||||
|
// [ASSUMED] A newly unselectable lock returns under the shared targetability rules.
|
||||||
|
if (d.lock && !canTargetEnemy(unit, d.lock, unit.profile)) d.lock = null;
|
||||||
|
if (!d.lock) d.lock = firstTarget(battle, unit);
|
||||||
|
unit.mem.rockLock = d.lock;
|
||||||
|
if (!d.lock || d.cd > 1e-9) return;
|
||||||
|
d.cd = unit.s.interval;
|
||||||
|
// Official S2 releases one drone (1 + attack@cnt = 1 at both ranks). Keep pre-skill shots from changing its ramp.
|
||||||
|
// [ASSUMED] As the existing independent skill drones, no launch-flight delay; body control does not pause it.
|
||||||
const f = unit.profile.funnel;
|
const f = unit.profile.funnel;
|
||||||
if (f) { unit.mem.rockFunnel = f; unit.profile.funnel = { ...f, max: f.max * num(bb.scale, 1) }; }
|
d.scale = d.target === d.lock.id ? Math.min(f.max, (d.scale ?? f.init) + f.delta) : f.init;
|
||||||
battle.addBuff(unit, { key: 'rockr:overload', mods: { atkPct: num(bb.atk) }, visible: true, tags: ['skill'] });
|
d.target = d.lock.id;
|
||||||
battle.fx('overload', { x: unit.x, y: unit.y, id: unit.id });
|
battle.fx('drone', { x: d.lock.x, y: d.lock.y, id: unit.id });
|
||||||
|
battle.dealDamage(unit, d.lock, { amount: unit.s.atk * unit.s.atkScaleMul * d.scale,
|
||||||
|
type: 'arts', isSkill: true, isAttack: false, tags: ['skill', 'drone', DRONE_TAG] });
|
||||||
},
|
},
|
||||||
onEnd({ battle, unit, reason }) {
|
onEnd({ battle, unit, reason }) {
|
||||||
const over = unit.mem.rockOver ? battle.time - unit.mem.rockOverAt : 0;
|
const over = unit.mem.rockOver ? battle.time - unit.mem.rockOverAt : 0;
|
||||||
|
const d = unit.mem.rockDrone;
|
||||||
|
unit.mem.rockDrone = null;
|
||||||
endOverload(battle, unit);
|
endOverload(battle, unit);
|
||||||
|
if (d) {
|
||||||
|
unit.trait.funnelTarget = d.target;
|
||||||
|
unit.trait.funnelScale = d.scale;
|
||||||
|
unit.profile = { ...unit.profile, [d.key]: d.mul };
|
||||||
|
}
|
||||||
unit.mem.rockOver = false;
|
unit.mem.rockOver = false;
|
||||||
unit.mem.rockLock = null;
|
unit.mem.rockLock = null;
|
||||||
if (over > 0 && reason !== 'death' && unit.alive) battle.applyStatus(unit, 'stun', { duration: over, source: unit });
|
if (over > 0 && reason !== 'death' && unit.alive) battle.applyStatus(unit, 'stun', { duration: over, source: unit });
|
||||||
@@ -46,12 +86,6 @@ export default {
|
|||||||
},
|
},
|
||||||
skills: { 'skcom_magic_rage[3]': { kind: 'duration', mods: { aspd: num(bb.attack_speed) } } },
|
skills: { 'skcom_magic_rage[3]': { kind: 'duration', mods: { aspd: num(bb.attack_speed) } } },
|
||||||
talents: [{ install(battle, unit) {
|
talents: [{ install(battle, unit) {
|
||||||
if (s2) battle.on('beforeAttack', (ctx) => {
|
|
||||||
if (ctx.attacker !== unit || !unit.skill?.active) return;
|
|
||||||
const L = unit.mem.rockLock;
|
|
||||||
if (L && L.alive && bodyInKeys(L, unit.rangeKeySet) && canTargetEnemy(unit, L, ctx.profile || unit.profile)) ctx.targets = [L];
|
|
||||||
else unit.mem.rockLock = ctx.targets[0] ?? null;
|
|
||||||
}, { owner: unit });
|
|
||||||
const iv = num(t.interval), max = Math.floor(num(t.max_stack_cnt)), v = num(t.atk);
|
const iv = num(t.interval), max = Math.floor(num(t.max_stack_cnt)), v = num(t.atk);
|
||||||
if (!(iv > 0) || !(max > 0) || !v) return;
|
if (!(iv > 0) || !(max > 0) || !v) return;
|
||||||
battle.on('tick', () => {
|
battle.on('tick', () => {
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import { makeBattle, enemyRec, chessRec, checkInvariants } from '../helpers/batt
|
|||||||
import { getDefaultSource } from '../../server/sim/simdata.js';
|
import { getDefaultSource } from '../../server/sim/simdata.js';
|
||||||
import { ELEMENT_GAUGE_MAX, PROJECTILE_SPEEDS, BOOMERANG_RETURN_SPEED } from '../../server/sim/constants.js';
|
import { ELEMENT_GAUGE_MAX, PROJECTILE_SPEEDS, BOOMERANG_RETURN_SPEED } from '../../server/sim/constants.js';
|
||||||
import { sortEnemyTargets } from '../../server/sim/targeting.js';
|
import { sortEnemyTargets } from '../../server/sim/targeting.js';
|
||||||
|
import { DRONE_TAG as ROCKROCK_DRONE } from '../../server/sim/content/kits/ops/chess_char_2_10-rockr.js';
|
||||||
|
|
||||||
const ds = getDefaultSource();
|
const ds = getDefaultSource();
|
||||||
const raw = (id) => ds.rawChess(id);
|
const raw = (id) => ds.rawChess(id);
|
||||||
@@ -1341,7 +1342,9 @@ test('2_10 洛洛: 自负此轭 drones stay locked on their target while the ski
|
|||||||
const t0 = h.b.time;
|
const t0 = h.b.time;
|
||||||
h.run(4);
|
h.run(4);
|
||||||
const atks = h.hooksOf('attack').filter((c) => c.attacker === u && c.t > t0);
|
const atks = h.hooksOf('attack').filter((c) => c.attacker === u && c.t > t0);
|
||||||
assert.ok(atks.length > 0 && atks.every((c) => c.targets.length === 1 && c.targets[0] === first), 'locked');
|
assert.ok(atks.length > 0 && atks.every((c) => c.targets.length === 1 && c.targets[0] === other), 'body keeps normal targeting');
|
||||||
|
const drones = h.hooksOf('damaged').filter((c) => c.source === u && c.t > t0 && c.dmg.tags?.includes(ROCKROCK_DRONE));
|
||||||
|
assert.ok(drones.length > 0 && drones.every((c) => c.target === first && c.dmg.isSkill && !c.dmg.isAttack), 'drone stays locked');
|
||||||
done(h);
|
done(h);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,267 @@
|
|||||||
|
// Controlled regression inputs: real kit, seeded Battle, synthetic enemy records and authored routes.
|
||||||
|
// No live enemy movement/HP edits. These cases are distinct from the normal Match/browser route.
|
||||||
|
import { test } from 'node:test';
|
||||||
|
import assert from 'node:assert/strict';
|
||||||
|
import { makeBattle, enemyRec, checkInvariants } from '../helpers/battleHarness.js';
|
||||||
|
import { bodyInKeys } from '../../server/sim/body.js';
|
||||||
|
import { DRONE_TAG } from '../../server/sim/content/kits/ops/chess_char_2_10-rockr.js';
|
||||||
|
import { getDefaultSource } from '../../server/sim/simdata.js';
|
||||||
|
|
||||||
|
const route = {
|
||||||
|
motion: 'FLY', start: [10, 6], end: [9, 2],
|
||||||
|
steps: [{ t: 'wait', s: 3 }, { t: 'move', p: [12, 6] }, { t: 'wait', s: 8 },
|
||||||
|
{ t: 'move', p: [10, 6] }, { t: 'wait', s: 40 }, { t: 'move', p: [9, 2] }],
|
||||||
|
};
|
||||||
|
const stationary = { motion: 'FLY', start: [10, 5], end: [9, 2], steps: [{ t: 'wait', s: 90 }, { t: 'move', p: [9, 2] }] };
|
||||||
|
const setup = (id, { skillIndex = 1, moduleId, newcomer = false, staysOutside = false, fragile = false,
|
||||||
|
outsideHp, stationaryLock = false, killer = false } = {}) => {
|
||||||
|
const lockRoute = staysOutside ? { ...route, steps: [...route.steps.slice(0, 2), { t: 'wait', s: 90 }, { t: 'move', p: [9, 2] }] } : route;
|
||||||
|
const h = makeBattle({ seed: 5, timeLimit: 100, autoFinish: false, captureNoisy: true,
|
||||||
|
hooks: ['damaged', 'attack', 'skillStart', 'skillEnd'],
|
||||||
|
defs: { enemies: {
|
||||||
|
enemy_lock: enemyRec({ key: 'enemy_lock', hp: 1e7, speed: 1, motion: 'FLY' }),
|
||||||
|
enemy_fragile: enemyRec({ key: 'enemy_fragile', hp: 300, speed: 1, motion: 'FLY' }),
|
||||||
|
enemy_outside: enemyRec({ key: 'enemy_outside', hp: outsideHp, speed: 1, motion: 'FLY' }),
|
||||||
|
enemy_killer: enemyRec({ key: 'enemy_killer', hp: 1e7, atk: 1e5, range: 4, motion: 'FLY' }),
|
||||||
|
} },
|
||||||
|
units: [{ chessId: id, row: 10, col: 4, skillIndex, moduleId, carryState: { sp: 999 } }],
|
||||||
|
enemies: [{ key: fragile ? 'enemy_fragile' : outsideHp ? 'enemy_outside' : 'enemy_lock',
|
||||||
|
route: fragile || stationaryLock ? stationary : lockRoute },
|
||||||
|
...(newcomer ? [{ key: 'enemy_lock', route: stationary, time: 7 }] : []),
|
||||||
|
...(killer ? [{ key: 'enemy_killer', route: stationary, time: 7 }] : [])],
|
||||||
|
});
|
||||||
|
h.step();
|
||||||
|
return { h, u: h.unit(id), target: h.enemies()[0] };
|
||||||
|
};
|
||||||
|
const hits = (h, u, target, after) => h.hooksOf('damaged').filter(c => c.source === u && c.target === target && c.t >= after && c.amount > 0);
|
||||||
|
const drone = c => c.dmg.tags?.includes(DRONE_TAG);
|
||||||
|
const approx = (actual, expected) => assert.ok(Math.abs(actual - expected) < 1e-7, `${actual} vs ${expected}`);
|
||||||
|
const done = h => { checkInvariants(h.b); assert.deepEqual(h.b.errors, []); };
|
||||||
|
|
||||||
|
for (const id of ['chess_char_2_10_a', 'chess_char_2_10_b']) {
|
||||||
|
test(`${id} S2: damage continues after a living target leaves the body range`, () => {
|
||||||
|
const { h, u, target } = setup(id);
|
||||||
|
assert.ok(u.skill.active);
|
||||||
|
assert.ok(h.runUntil(() => !bodyInKeys(target, u.rangeKeySet), 10));
|
||||||
|
assert.ok(hits(h, u, target, 0).length > 0, 'the in-range control receives damage before leaving');
|
||||||
|
h.run(2); // discard any projectile already in flight at the boundary
|
||||||
|
const t = h.b.time;
|
||||||
|
const bodyAttacks = u.stats.attacks;
|
||||||
|
h.run(4);
|
||||||
|
assert.ok(target.alive && u.alive && u.skill.active && !bodyInKeys(target, u.rangeKeySet));
|
||||||
|
const outHits = hits(h, u, target, t);
|
||||||
|
assert.ok(outHits.length > 0, 'a living out-of-range lock must still receive drone damage');
|
||||||
|
assert.ok(outHits.every(c => drone(c) && c.type === 'arts' && c.dmg.isSkill && !c.dmg.isAttack), 'pursuit damage must be an independent arts skill drone');
|
||||||
|
assert.equal(u.stats.attacks, bodyAttacks, 'the body cannot make attacks with no enemy in range');
|
||||||
|
done(h);
|
||||||
|
});
|
||||||
|
|
||||||
|
test(`${id} S2: an in-range newcomer cannot steal a living out-of-range drone lock`, () => {
|
||||||
|
const { h, u, target } = setup(id, { newcomer: true });
|
||||||
|
assert.ok(h.runUntil(() => h.enemies().length === 2, 10));
|
||||||
|
assert.ok(target.alive && !bodyInKeys(target, u.rangeKeySet));
|
||||||
|
h.run(2);
|
||||||
|
const t = h.b.time;
|
||||||
|
h.run(3);
|
||||||
|
const outHits = hits(h, u, target, t);
|
||||||
|
assert.ok(outHits.length > 0, 'the original target keeps receiving drone damage with another target in range');
|
||||||
|
assert.ok(outHits.every(c => drone(c) && c.dmg.isSkill && !c.dmg.isAttack), 'the body cannot attack the out-of-range lock');
|
||||||
|
const other = h.enemies().find(e => e !== target);
|
||||||
|
assert.equal(u.mem.rockLock, target);
|
||||||
|
assert.equal(hits(h, u, other, t).filter(drone).length, 0, 'the drone ignores the newcomer');
|
||||||
|
const body = hits(h, u, other, t).filter(c => c.dmg.isAttack);
|
||||||
|
assert.ok(body.length > 0, 'the body still attacks the in-range newcomer');
|
||||||
|
assert.ok(body.every(c => !c.dmg.isSkill && !drone(c)));
|
||||||
|
body.forEach(c => approx(c.amount, u.s.atk * u.s.atkScaleMul));
|
||||||
|
done(h);
|
||||||
|
});
|
||||||
|
|
||||||
|
test(`${id} S2: a target returning into range receives damage`, () => {
|
||||||
|
const { h, u, target } = setup(id);
|
||||||
|
assert.ok(h.runUntil(() => !bodyInKeys(target, u.rangeKeySet), 10));
|
||||||
|
assert.ok(h.runUntil(() => bodyInKeys(target, u.rangeKeySet), 20));
|
||||||
|
const t = h.b.time;
|
||||||
|
h.run(3);
|
||||||
|
const ds = hits(h, u, target, 0).filter(drone);
|
||||||
|
assert.ok(ds.some(c => c.t >= t));
|
||||||
|
assert.equal(u.mem.rockLock, target);
|
||||||
|
ds.slice(1).forEach((c, i) => approx(c.t - ds[i].t, Math.ceil(u.s.interval * 30 - 1e-9) / 30));
|
||||||
|
ds.slice(-3).forEach(c => approx(c.amount, u.s.atk * u.s.atkScaleMul * u.profile.funnel.max));
|
||||||
|
done(h);
|
||||||
|
});
|
||||||
|
|
||||||
|
test(`${id} S2: a target killed by combat releases the lock for another in-range enemy`, () => {
|
||||||
|
const { h, u, target } = setup(id, { fragile: true, newcomer: true });
|
||||||
|
assert.equal(u.mem.rockLock, target);
|
||||||
|
assert.ok(h.runUntil(() => !target.alive, 7));
|
||||||
|
assert.ok(h.runUntil(() => h.enemies().some(e => e !== target && e.alive), 10));
|
||||||
|
const other = h.enemies().find(e => e !== target && e.alive);
|
||||||
|
const t = h.b.time;
|
||||||
|
h.run(3);
|
||||||
|
assert.ok(u.alive && u.skill.active && other.alive);
|
||||||
|
assert.equal(u.mem.rockLock, other);
|
||||||
|
assert.ok(hits(h, u, other, t).length > 0);
|
||||||
|
done(h);
|
||||||
|
});
|
||||||
|
|
||||||
|
test(`${id} S2: the duration end clears the lock and stops out-of-range damage`, () => {
|
||||||
|
const { h, u, target } = setup(id, { staysOutside: true });
|
||||||
|
assert.ok(h.runUntil(() => !bodyInKeys(target, u.rangeKeySet), 10));
|
||||||
|
assert.ok(h.runUntil(() => !u.skill.active, 45));
|
||||||
|
assert.equal(h.hooksOf('skillEnd').find(c => c.unit === u)?.reason, 'duration');
|
||||||
|
assert.equal(u.mem.rockLock, null);
|
||||||
|
h.run(2);
|
||||||
|
const t = h.b.time;
|
||||||
|
h.run(4);
|
||||||
|
assert.ok(target.alive && u.alive && !bodyInKeys(target, u.rangeKeySet));
|
||||||
|
assert.equal(hits(h, u, target, t).length, 0);
|
||||||
|
done(h);
|
||||||
|
});
|
||||||
|
|
||||||
|
test(`${id} S1: damage stops outside the body range`, () => {
|
||||||
|
const { h, u, target } = setup(id, { skillIndex: 0 });
|
||||||
|
assert.ok(u.skill.active);
|
||||||
|
assert.ok(h.runUntil(() => !bodyInKeys(target, u.rangeKeySet), 10));
|
||||||
|
h.run(2);
|
||||||
|
const t = h.b.time;
|
||||||
|
h.run(4);
|
||||||
|
assert.equal(hits(h, u, target, t).length, 0);
|
||||||
|
done(h);
|
||||||
|
});
|
||||||
|
|
||||||
|
test(`${id} S2: an out-of-range combat kill waits for a candidate and restarts the trait ramp`, () => {
|
||||||
|
const { h, u, target } = setup(id, { outsideHp: id.endsWith('_a') ? 4000 : 5000, newcomer: true });
|
||||||
|
assert.ok(h.runUntil(() => !bodyInKeys(target, u.rangeKeySet), 10));
|
||||||
|
assert.ok(target.alive);
|
||||||
|
assert.ok(h.runUntil(() => !target.alive, 10));
|
||||||
|
assert.ok(drone(hits(h, u, target, 0).at(-1)), 'the independent drone delivers the killing blow');
|
||||||
|
if (!h.enemies().some(e => e !== target && e.alive)) {
|
||||||
|
h.step(); assert.equal(u.mem.rockLock, null, 'no out-of-range candidate is acquired');
|
||||||
|
}
|
||||||
|
assert.ok(h.runUntil(() => h.enemies().some(e => e !== target && e.alive), 10));
|
||||||
|
const other = h.enemies().find(e => e !== target && e.alive);
|
||||||
|
assert.ok(h.runUntil(() => hits(h, u, other, 0).some(drone), 2));
|
||||||
|
const first = hits(h, u, other, 0).find(drone);
|
||||||
|
approx(first.amount, u.s.atk * u.s.atkScaleMul * u.profile.funnel.init);
|
||||||
|
assert.equal(u.mem.rockLock, other);
|
||||||
|
done(h);
|
||||||
|
});
|
||||||
|
|
||||||
|
test(`${id} S2: explicit stop restores the normal multiplier and clears released state`, () => {
|
||||||
|
const { h, u, target } = setup(id, { staysOutside: true });
|
||||||
|
const saved = u.mem.rockDrone.mul, key = u.mem.rockDrone.key;
|
||||||
|
assert.ok(h.runUntil(() => !bodyInKeys(target, u.rangeKeySet), 10));
|
||||||
|
u.skill.stop();
|
||||||
|
assert.equal(u.profile[key], saved);
|
||||||
|
assert.equal(u.mem.rockDrone, null); assert.equal(u.mem.rockLock, null);
|
||||||
|
h.run(2); const t = h.b.time; h.run(4);
|
||||||
|
assert.equal(hits(h, u, target, t).length, 0);
|
||||||
|
done(h);
|
||||||
|
});
|
||||||
|
|
||||||
|
test(`${id} S2: caster combat death clears the released state`, () => {
|
||||||
|
const { h, u, target } = setup(id, { killer: true, staysOutside: true });
|
||||||
|
assert.ok(h.runUntil(() => !u.alive, 12));
|
||||||
|
assert.equal(u.skill.active, false); assert.equal(u.mem.rockDrone, null); assert.equal(u.mem.rockLock, null);
|
||||||
|
h.run(2); const t = h.b.time; h.run(3);
|
||||||
|
assert.equal(hits(h, u, target, t).length, 0);
|
||||||
|
done(h);
|
||||||
|
});
|
||||||
|
|
||||||
|
test(`${id} S2: live ASPD controls drone cadence; overload uses the live trait cap`, () => {
|
||||||
|
const { h, u } = setup(id, { stationaryLock: true });
|
||||||
|
const f = { ...u.profile.funnel }, scales = [];
|
||||||
|
h.b.on('damaged', c => { if (c.source === u && drone(c)) scales.push({ t: h.b.time, scale: c.amount / (u.s.atk * u.s.atkScaleMul) }); });
|
||||||
|
h.run(4);
|
||||||
|
h.b.addBuff(u, { key: 'test:aspd', mods: { aspd: 100 } });
|
||||||
|
const interval = u.s.interval, t = h.b.time;
|
||||||
|
h.run(4);
|
||||||
|
const fast = scales.filter(c => c.t > t + 1.3);
|
||||||
|
assert.ok(fast.length > 3);
|
||||||
|
fast.slice(1).forEach((c, i) => approx(c.t - fast[i].t, Math.ceil(interval * 30 - 1e-9) / 30));
|
||||||
|
h.run(15);
|
||||||
|
approx(scales.at(-1).scale, f.max * u.def.skill.bb.scale);
|
||||||
|
u.skill.stop();
|
||||||
|
assert.deepEqual(u.profile.funnel, f);
|
||||||
|
assert.ok(u.s.flags.stun, 'stopping during overload keeps the existing post-overload stun');
|
||||||
|
done(h);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const moduleId of ['none', 'uniequip_002_rockr']) {
|
||||||
|
test(`elite S2 ${moduleId}: the resolved trait supplies initial ramp and increment`, () => {
|
||||||
|
const { h, u, target } = setup('chess_char_2_10_b', { moduleId, stationaryLock: true });
|
||||||
|
const f = u.profile.funnel;
|
||||||
|
h.run(3);
|
||||||
|
hits(h, u, target, 0).filter(drone).forEach((c, i) => approx(c.amount, u.s.atk * u.s.atkScaleMul * (f.init + i * f.delta)));
|
||||||
|
assert.equal(f.init, moduleId === 'none' ? 0.2 : 0.35);
|
||||||
|
done(h);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const sameTarget of [false, true]) {
|
||||||
|
test(`S2: a pre-skill projectile at ${sameTarget ? 'the same' : 'another'} target cannot change the released ramp`, () => {
|
||||||
|
const h = makeBattle({ seed: 5, autoFinish: false, captureNoisy: true, hooks: ['damaged', 'attack'],
|
||||||
|
defs: { enemies: { old: enemyRec({ key: 'old', hp: 1e7, speed: 0, motion: 'FLY' }),
|
||||||
|
preferred: enemyRec({ key: 'preferred', hp: 1e7, speed: 0, motion: 'FLY', taunt: 5 }) } },
|
||||||
|
units: [{ chessId: 'chess_char_2_10_a', row: 10, col: 4, carryState: { sp: 0 } }],
|
||||||
|
enemies: [{ key: 'old', pos: [10, 6] }],
|
||||||
|
});
|
||||||
|
h.step(); // launch an ordinary shot, which has not landed yet
|
||||||
|
const u = h.unit('chess_char_2_10_a'), old = h.enemies()[0];
|
||||||
|
assert.equal(h.hooksOf('attack').length, 1); assert.equal(h.hooksOf('damaged').length, 0);
|
||||||
|
const target = sameTarget ? old : h.spawn('preferred', { pos: [10, 5] });
|
||||||
|
h.step(); // update the spatial index for the second target
|
||||||
|
u.skill.gainSp(999); u.skill.activate('test');
|
||||||
|
assert.equal(u.mem.rockLock, target);
|
||||||
|
h.run(2);
|
||||||
|
assert.ok(hits(h, u, old, 0).some(c => c.dmg.isAttack), 'the old shot really lands');
|
||||||
|
const ds = hits(h, u, target, 0).filter(drone);
|
||||||
|
assert.ok(ds.length >= 3);
|
||||||
|
ds.slice(0, 3).forEach((c, i) => approx(c.amount, u.s.atk * u.s.atkScaleMul * (u.profile.funnel.init + i * u.profile.funnel.delta)));
|
||||||
|
done(h);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
test('S2: the shared targetability filter releases an unselectable lock and acquires a legal candidate', () => {
|
||||||
|
const { h, u, target } = setup('chess_char_2_10_a', { newcomer: true });
|
||||||
|
assert.ok(h.runUntil(() => h.enemies().length === 2, 10));
|
||||||
|
const other = h.enemies().find(e => e !== target);
|
||||||
|
h.b.addBuff(target, { key: 'test:untargetable', flags: { untargetable: true } });
|
||||||
|
h.run(2); const t = h.b.time; h.run(2);
|
||||||
|
assert.equal(hits(h, u, target, t).length, 0);
|
||||||
|
assert.equal(u.mem.rockLock, other);
|
||||||
|
assert.ok(hits(h, u, other, t).some(drone));
|
||||||
|
done(h);
|
||||||
|
});
|
||||||
|
|
||||||
|
for (const [id, moduleId] of [['chess_char_2_10_a', undefined], ['chess_char_2_10_b', 'none'], ['chess_char_2_10_b', 'uniequip_002_rockr']]) {
|
||||||
|
test(`${id} ${moduleId ?? 'normal'}: skill data, DEFAULT trigger, range and talent remain intact`, () => {
|
||||||
|
for (const skillIndex of [0, 1]) {
|
||||||
|
const raw = getDefaultSource().getChess(id, { skillIndex, moduleId }).raw;
|
||||||
|
const h = makeBattle({ seed: 5, autoFinish: false, timeLimit: 100, captureNoisy: true,
|
||||||
|
defs: { enemies: { e: enemyRec({ key: 'e', hp: 1e7, speed: 0 }) } },
|
||||||
|
units: [{ chessId: id, row: 10, col: 4, skillIndex, moduleId, carryState: { sp: 999 } }],
|
||||||
|
});
|
||||||
|
h.run(2);
|
||||||
|
const u = h.unit(id);
|
||||||
|
assert.equal(u.skill.active, false, 'DEFAULT waits for a target despite full SP');
|
||||||
|
assert.deepEqual([u.skill.id, u.skill.rule, u.skill.spCost, u.skill.initSp, u.skill.duration, u.skill.spType],
|
||||||
|
[raw.skill.skillId, raw.skill.trigger.rule, raw.skill.spCost, raw.skill.initSp, raw.skill.duration, 'time']);
|
||||||
|
assert.deepEqual(u.liveRangeGrid, raw.rangeGrid);
|
||||||
|
assert.deepEqual([u.profile.canHitFly, u.profile.dmgType, u.profile.attack, u.s.blockCnt], [true, 'arts', 'ranged', 1]);
|
||||||
|
h.spawn('e', { pos: [10, 6] });
|
||||||
|
assert.ok(h.runUntil(() => u.skill.active, 3));
|
||||||
|
approx(u.s.aspd - u.base.aspd, raw.skill.bb.attack_speed);
|
||||||
|
const t = raw.talents.find(v => v.index === 0).bb;
|
||||||
|
h.runUntil(() => h.b.time >= 15.1, 20);
|
||||||
|
approx(u.findBuff('rockr:rock').stacks, 1);
|
||||||
|
approx(u.findBuff('rockr:rock').mods.atkPct, t.atk);
|
||||||
|
u.skill.stop();
|
||||||
|
assert.deepEqual(u.liveRangeGrid, raw.rangeGrid);
|
||||||
|
h.runUntil(() => h.b.time >= t.interval * (t.max_stack_cnt + 1), 80);
|
||||||
|
assert.equal(u.findBuff('rockr:rock').stacks, t.max_stack_cnt);
|
||||||
|
done(h);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
+26
-26
@@ -1576,8 +1576,8 @@
|
|||||||
"round": 5,
|
"round": 5,
|
||||||
"seed": 4091762637,
|
"seed": 4091762637,
|
||||||
"waveId": "act1autochess_05",
|
"waveId": "act1autochess_05",
|
||||||
"time": 55.83,
|
"time": 51.33,
|
||||||
"ticks": 1675,
|
"ticks": 1540,
|
||||||
"reason": "cleared",
|
"reason": "cleared",
|
||||||
"killed": 17,
|
"killed": 17,
|
||||||
"total": 17,
|
"total": 17,
|
||||||
@@ -1585,16 +1585,16 @@
|
|||||||
"bossHpLeft": null,
|
"bossHpLeft": null,
|
||||||
"rngDraws": 6,
|
"rngDraws": 6,
|
||||||
"errors": {"count":0,"kinds":[]},
|
"errors": {"count":0,"kinds":[]},
|
||||||
"players": {"p1":{"killed":17,"total":17,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":123047,"bossDmg":0,"heal":3612,"deaths":0,"layerGains":{}}},
|
"players": {"p1":{"killed":17,"total":17,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":123165,"bossDmg":0,"heal":3086,"deaths":0,"layerGains":{}}},
|
||||||
"units": [
|
"units": [
|
||||||
["p1",1,"op","chess_char_3_06_a",1,null,3577.42,1,6,0,15374,3173,0,15,1],
|
["p1",1,"op","chess_char_3_06_a",1,null,3577.42,1,6,1,11134,2647,0,15,1],
|
||||||
["p1",2,"op","chess_char_3_02_a",1,null,2102.1,1,7,7,38048,0,0,26,1],
|
["p1",2,"op","chess_char_3_02_a",1,null,2102.1,1,7,5,34859,0,0,25,1],
|
||||||
["p1",3,"op","chess_char_3_03_a",1,null,1515.8,1,5,0,0,0,0,0,0],
|
["p1",3,"op","chess_char_3_03_a",1,null,1515.8,1,5,0,0,0,0,0,0],
|
||||||
["p1",4,"op","chess_char_3_04_a",1,null,2050.4,1,8,1,28010,0,0,0,0],
|
["p1",4,"op","chess_char_3_04_a",1,null,2050.4,1,8,1,28010,0,0,0,0],
|
||||||
["p1",5,"op","chess_char_3_05_a",2,null,5978.83,1,9,4,20606,245,0,18,1],
|
["p1",5,"op","chess_char_3_05_a",2,null,5978.83,1,9,4,21699,245,0,18,1],
|
||||||
["p1",6,"op","chess_char_1_06_a",1,null,1250.7,1,3,4,15626,0,1411,30,1],
|
["p1",6,"op","chess_char_1_06_a",1,null,1250.7,1,3,3,14272,0,1172,27,1],
|
||||||
["p1",7,"op","chess_char_2_05_a",1,null,1552.32,1,4,0,0,0,2201,17,1],
|
["p1",7,"op","chess_char_2_05_a",1,null,1552.32,1,4,0,0,0,1914,15,1],
|
||||||
["p1",8,"op","chess_char_2_10_a",1,null,1185.8,1,10,0,5382,0,0,29,1],
|
["p1",8,"op","chess_char_2_10_a",1,null,1185.8,1,10,1,13191,0,0,29,1],
|
||||||
["-","~1","device","trap_1105_accrate",null,null,100,1,1,0,0,0,0,0,null],
|
["-","~1","device","trap_1105_accrate",null,null,100,1,1,0,0,0,0,0,null],
|
||||||
["-","~2","device","trap_1105_accrate",null,null,100,1,2,0,0,0,0,0,null],
|
["-","~2","device","trap_1105_accrate",null,null,100,1,2,0,0,0,0,0,null],
|
||||||
["p1","~1","token","token_10031_swire2_gdtrap",null,null,1000,0,11,0,0,0,0,0,null],
|
["p1","~1","token","token_10031_swire2_gdtrap",null,null,1000,0,11,0,0,0,0,0,null],
|
||||||
@@ -1615,11 +1615,11 @@
|
|||||||
["p1","~16","token","token_10031_swire2_gdtrap",null,null,1000,0,43,0,0,0,0,0,null],
|
["p1","~16","token","token_10031_swire2_gdtrap",null,null,1000,0,43,0,0,0,0,0,null],
|
||||||
["p1","~17","token","token_10031_swire2_gdtrap",null,null,1000,1,44,0,0,0,0,0,null]
|
["p1","~17","token","token_10031_swire2_gdtrap",null,null,1000,1,44,0,0,0,0,0,null]
|
||||||
],
|
],
|
||||||
"enemies": {"enemy_1116_liprr":[11,11,0,192,69696],"enemy_1116_liprr_2":[4,4,0,199,34560],"enemy_1118_lidbox_2":[2,2,0,3027,21888]},
|
"enemies": {"enemy_1116_liprr":[11,11,0,151,69696],"enemy_1116_liprr_2":[4,4,0,199,34560],"enemy_1118_lidbox_2":[2,2,0,2542,21888]},
|
||||||
"hooks": [1,44,1675,165,165,298,312,28,17,33,6,2,0,6349,15,14,17,0,1,17,0,0,0],
|
"hooks": [1,44,1540,155,155,300,307,25,17,33,6,2,0,6079,15,13,17,0,1,17,0,0,0],
|
||||||
"events": {"atk":165,"deploy":25,"die":33,"dmg":312,"engage":5,"fx":104,"heal":28,"skill":10,"spawn":44,"status":43},
|
"events": {"atk":155,"deploy":25,"die":33,"dmg":307,"engage":5,"fx":118,"heal":25,"skill":10,"spawn":44,"status":43},
|
||||||
"fx": {"aoe":5,"coin":18,"counter":4,"explode":16,"liberate":1,"overload":1,"phase":3,"strike":38,"summon":17,"taunt":1},
|
"fx": {"aoe":2,"coin":17,"counter":4,"drone":23,"explode":16,"liberate":1,"overload":1,"phase":3,"strike":33,"summon":17,"taunt":1},
|
||||||
"snaps": "950a6182 a670e309 094b33b8 126a0a37 d2dc7eef 6d3cae8b"
|
"snaps": "950a6182 a670e309 094b33b8 74d11085 3cad2a4f 6ec399b7"
|
||||||
},
|
},
|
||||||
"bond-victoriaShip-high": {
|
"bond-victoriaShip-high": {
|
||||||
"about": "维多利亚 high: tier 2 layers 999; chess_char_4_11_b chess_char_4_07_b chess_char_1_06_b chess_char_2_05_b chess_char_2_10_b chess_char_3_08_b chess_char_4_13_b chess_char_4_14_b token_10041_cathy_catsld token_10041_cathy_catsld",
|
"about": "维多利亚 high: tier 2 layers 999; chess_char_4_11_b chess_char_4_07_b chess_char_1_06_b chess_char_2_05_b chess_char_2_10_b chess_char_3_08_b chess_char_4_13_b chess_char_4_14_b token_10041_cathy_catsld token_10041_cathy_catsld",
|
||||||
@@ -1630,8 +1630,8 @@
|
|||||||
"round": 10,
|
"round": 10,
|
||||||
"seed": 11223320,
|
"seed": 11223320,
|
||||||
"waveId": "act1autochess_h03",
|
"waveId": "act1autochess_h03",
|
||||||
"time": 62.87,
|
"time": 48.53,
|
||||||
"ticks": 1886,
|
"ticks": 1456,
|
||||||
"reason": "cleared",
|
"reason": "cleared",
|
||||||
"killed": 12,
|
"killed": 12,
|
||||||
"total": 12,
|
"total": 12,
|
||||||
@@ -1639,27 +1639,27 @@
|
|||||||
"bossHpLeft": null,
|
"bossHpLeft": null,
|
||||||
"rngDraws": 0,
|
"rngDraws": 0,
|
||||||
"errors": {"count":0,"kinds":[]},
|
"errors": {"count":0,"kinds":[]},
|
||||||
"players": {"p1":{"killed":12,"total":12,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":141088,"bossDmg":0,"heal":6750,"deaths":0,"layerGains":{}}},
|
"players": {"p1":{"killed":12,"total":12,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":141088,"bossDmg":0,"heal":3463,"deaths":0,"layerGains":{}}},
|
||||||
"units": [
|
"units": [
|
||||||
["p1",1,"op","chess_char_4_11_b",1,"uniequip_002_cathy",2908.4,1,5,0,0,0,0,0,0],
|
["p1",1,"op","chess_char_4_11_b",1,"uniequip_002_cathy",2908.4,1,5,0,0,0,0,0,0],
|
||||||
["p1",2,"op","chess_char_4_07_b",1,"uniequip_002_bpipe",2621.3,1,7,0,0,0,0,0,0],
|
["p1",2,"op","chess_char_4_07_b",1,"uniequip_002_bpipe",2621.3,1,7,0,0,0,0,0,0],
|
||||||
["p1",3,"op","chess_char_1_06_b",1,"uniequip_002_vendla",1542.2,1,8,5,28240,0,1739,7,1],
|
["p1",3,"op","chess_char_1_06_b",1,"uniequip_002_vendla",1542.2,1,8,0,0,0,0,0,0],
|
||||||
["p1",4,"op","chess_char_2_05_b",1,"uniequip_002_harold",17910.32,1,10,0,0,5469,5011,10,1],
|
["p1",4,"op","chess_char_2_05_b",1,"uniequip_002_harold",17910.32,1,10,0,0,2609,3463,7,1],
|
||||||
["p1",5,"op","chess_char_2_10_b",1,"uniequip_002_rockr",1546.6,1,11,7,93826,1281,0,42,1],
|
["p1",5,"op","chess_char_2_10_b",1,"uniequip_002_rockr",1546.6,1,11,12,131060,854,0,25,1],
|
||||||
["p1",6,"op","chess_char_3_08_b",1,"uniequip_002_mint",2184.6,1,4,0,0,0,0,0,0],
|
["p1",6,"op","chess_char_3_08_b",1,"uniequip_002_mint",2184.6,1,4,0,0,0,0,0,0],
|
||||||
["p1",7,"op","chess_char_4_13_b",1,"uniequip_002_gnosis",2187.9,1,6,0,0,0,0,0,0],
|
["p1",7,"op","chess_char_4_13_b",1,"uniequip_002_gnosis",2187.9,1,6,0,0,0,0,0,0],
|
||||||
["p1",8,"op","chess_char_4_14_b",1,"uniequip_002_lionhd",1788.6,1,9,0,19021,0,0,7,6],
|
["p1",8,"op","chess_char_4_14_b",1,"uniequip_002_lionhd",1788.6,1,9,0,10028,0,0,3,4],
|
||||||
["p1",9,"token","token_10041_cathy_catsld",null,null,100,1,12,0,0,0,0,0,null],
|
["p1",9,"token","token_10041_cathy_catsld",null,null,100,1,12,0,0,0,0,0,null],
|
||||||
["p1",10,"token","token_10041_cathy_catsld",null,null,100,1,13,0,0,0,0,0,null],
|
["p1",10,"token","token_10041_cathy_catsld",null,null,100,1,13,0,0,0,0,0,null],
|
||||||
["-","~1","device","trap_1105_accrate",null,null,100,1,1,0,0,0,0,0,null],
|
["-","~1","device","trap_1105_accrate",null,null,100,1,1,0,0,0,0,0,null],
|
||||||
["-","~2","device","trap_1105_accrate",null,null,100,1,2,0,0,0,0,0,null],
|
["-","~2","device","trap_1105_accrate",null,null,100,1,2,0,0,0,0,0,null],
|
||||||
["-","~3","device","trap_1105_accrate",null,null,100,1,3,0,0,0,0,0,null]
|
["-","~3","device","trap_1105_accrate",null,null,100,1,3,0,0,0,0,0,null]
|
||||||
],
|
],
|
||||||
"enemies": {"enemy_1005_yokai_2":[4,4,0,1532,15428],"enemy_1041_lazerd_2":[3,3,0,5218,44790],"enemy_1042_frostd":[5,5,0,0,80870]},
|
"enemies": {"enemy_1005_yokai_2":[4,4,0,854,15428],"enemy_1041_lazerd_2":[3,3,0,2609,44790],"enemy_1042_frostd":[5,5,0,0,80870]},
|
||||||
"hooks": [1,25,1886,79,79,76,76,12,12,12,9,9,0,4756,266,0,12,0,1,12,0,0,0],
|
"hooks": [1,25,1456,42,42,62,62,7,12,12,6,5,0,3272,193,0,12,0,1,12,0,0,0],
|
||||||
"events": {"atk":79,"deploy":10,"die":12,"dmg":76,"engage":3,"fx":10,"heal":12,"skill":18,"spawn":25,"status":17},
|
"events": {"atk":42,"deploy":10,"die":12,"dmg":62,"engage":2,"fx":28,"heal":7,"skill":11,"spawn":25,"status":21},
|
||||||
"fx": {"counter":2,"explosion":6,"overload":1,"taunt":1},
|
"fx": {"drone":23,"explosion":4,"overload":1},
|
||||||
"snaps": "baf019b9 04dccd49 7607a313 d5443e4e 65c3d507 5c447217 1a74a703"
|
"snaps": "baf019b9 824e0c60 89a36c73 fa125449 0a872c85"
|
||||||
},
|
},
|
||||||
"bond-visiShip-low": {
|
"bond-visiShip-low": {
|
||||||
"about": "远见 low: tier 1 layers 1; chess_char_3_12_a chess_char_3_03_a chess_char_2_02_a chess_char_3_08_a chess_char_3_09_a chess_char_3_10_a chess_char_3_11_a chess_char_3_13_a token_10000_silent_healrb",
|
"about": "远见 low: tier 1 layers 1; chess_char_3_12_a chess_char_3_03_a chess_char_2_02_a chess_char_3_08_a chess_char_3_09_a chess_char_3_10_a chess_char_3_11_a chess_char_3_13_a token_10000_silent_healrb",
|
||||||
|
|||||||
+23
-23
@@ -774,7 +774,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"round": 5,
|
"round": 5,
|
||||||
"ai_0": [1,23,10,0,0,3,8,"7d798140",22,"deputShip 1/12, kazimierzShip 0/2, soloShip 1/4, swiftShip 1/6",47,16,6,34],
|
"ai_0": [1,23,10,0,0,3,8,"7d798140",22,"deputShip 1/12, kazimierzShip 0/2, soloShip 1/4, swiftShip 1/6",50,16,3,34],
|
||||||
"ai_1": [1,45,9,0,0,2,8,"255ecf36",11,"kazimierzShip 0/11, lateranoShip 1/0, soloShip 1/0, suntShip 1/0, swiftShip 1/11",53,16,0,31],
|
"ai_1": [1,45,9,0,0,2,8,"255ecf36",11,"kazimierzShip 0/11, lateranoShip 1/0, soloShip 1/0, suntShip 1/0, swiftShip 1/11",53,16,0,31],
|
||||||
"ai_2": [1,27,9,0,0,3,8,"d3b8e94d",12,"deputShip 1/2, siracusaShip 1/2, soloShip 1/8, yanShip 0/1",48,16,5,32]
|
"ai_2": [1,27,9,0,0,3,8,"d3b8e94d",12,"deputShip 1/2, siracusaShip 1/2, soloShip 1/8, yanShip 0/1",48,16,5,32]
|
||||||
},
|
},
|
||||||
@@ -838,7 +838,7 @@
|
|||||||
"title": {"id":"comment_5","name":"万事俱备","picId":"comment_icon_5","text":"装备配发数量最多"},
|
"title": {"id":"comment_5","name":"万事俱备","picId":"comment_icon_5","text":"装备配发数量最多"},
|
||||||
"trophies": 2,
|
"trophies": 2,
|
||||||
"reward": 191,
|
"reward": 191,
|
||||||
"stats": {"activatedLayers":0,"bossDamage":0,"dmgDealt":1764377,"gold":94,"itemsEquipped":10,"kills":219,"leaks":36,"lpLost":25,"merges":4,"perfectRounds":6,"refreshes":9},
|
"stats": {"activatedLayers":0,"bossDamage":0,"dmgDealt":1770279,"gold":94,"itemsEquipped":10,"kills":222,"leaks":33,"lpLost":25,"merges":4,"perfectRounds":6,"refreshes":9},
|
||||||
"lineup": [],
|
"lineup": [],
|
||||||
"bonds": ["deputShip 0/46","emptyShip 0/4","indomShip 0/10","kazimierzShip 0/2","skillfulShip 0/6","soloShip 0/4","suntShip 0/18","swiftShip 0/73","victoriaShip 0/40","visiShip 0/22"]
|
"bonds": ["deputShip 0/46","emptyShip 0/4","indomShip 0/10","kazimierzShip 0/2","skillfulShip 0/6","soloShip 0/4","suntShip 0/18","swiftShip 0/73","victoriaShip 0/40","visiShip 0/22"]
|
||||||
},
|
},
|
||||||
@@ -852,7 +852,7 @@
|
|||||||
"title": {"id":"comment_2","name":"不朽盟约","picId":"comment_icon_2","text":"激活的盟约层数总和最高"},
|
"title": {"id":"comment_2","name":"不朽盟约","picId":"comment_icon_2","text":"激活的盟约层数总和最高"},
|
||||||
"trophies": 3,
|
"trophies": 3,
|
||||||
"reward": 340,
|
"reward": 340,
|
||||||
"stats": {"activatedLayers":239,"bossDamage":1583201,"dmgDealt":6660572,"gold":139,"itemsEquipped":7,"kills":315,"leaks":88,"lpLost":44,"merges":6,"perfectRounds":7,"refreshes":15},
|
"stats": {"activatedLayers":239,"bossDamage":1583201,"dmgDealt":6660559,"gold":139,"itemsEquipped":7,"kills":312,"leaks":88,"lpLost":44,"merges":6,"perfectRounds":7,"refreshes":15},
|
||||||
"lineup": ["6_09_a@12,8","3_21_b@11,7[3_03_e_a+2_04_e_a]","6_08_a@11,8","3_16_b@10,6[5_01_e_a+1_02_e_a]","4_01_a@10,7","6_07_a@10,8[4_07_e_a]","2_17_b@9,6","5_06_a@9,9"],
|
"lineup": ["6_09_a@12,8","3_21_b@11,7[3_03_e_a+2_04_e_a]","6_08_a@11,8","3_16_b@10,6[5_01_e_a+1_02_e_a]","4_01_a@10,7","6_07_a@10,8[4_07_e_a]","2_17_b@9,6","5_06_a@9,9"],
|
||||||
"bonds": ["indomShip 1/26","kazimierzShip 0/11","lateranoShip 1/57","miraShip 0/8","skillfulShip 1/55","soloShip 1/0","steadShip 2/101","suntShip 1/0","swiftShip 0/24","visiShip 0/10"]
|
"bonds": ["indomShip 1/26","kazimierzShip 0/11","lateranoShip 1/57","miraShip 0/8","skillfulShip 1/55","soloShip 1/0","steadShip 2/101","suntShip 1/0","swiftShip 0/24","visiShip 0/10"]
|
||||||
},
|
},
|
||||||
@@ -989,7 +989,7 @@
|
|||||||
"title": {"id":"comment_1","name":"卫戍之星","picId":"comment_icon_1","text":"对敌方领袖造成伤害最高(仅胜利时)"},
|
"title": {"id":"comment_1","name":"卫戍之星","picId":"comment_icon_1","text":"对敌方领袖造成伤害最高(仅胜利时)"},
|
||||||
"trophies": 3,
|
"trophies": 3,
|
||||||
"reward": 250,
|
"reward": 250,
|
||||||
"stats": {"activatedLayers":270,"bossDamage":556049,"dmgDealt":1982068,"gold":135,"itemsEquipped":22,"kills":293,"leaks":0,"lpLost":0,"merges":5,"perfectRounds":13,"refreshes":23},
|
"stats": {"activatedLayers":270,"bossDamage":544037,"dmgDealt":1970056,"gold":135,"itemsEquipped":22,"kills":293,"leaks":0,"lpLost":0,"merges":5,"perfectRounds":13,"refreshes":23},
|
||||||
"lineup": ["4_25_a@11,3","1_06_b@11,6","6_12_a@11,7[2_01_e_a]","3_20_a@10,3[1_05_e_b]","5_14_a@10,4[3_08_e_a+5_02_e_a]","4_22_b@9,4[4_11_e_a+3_02_e_b]","4_14_b@9,8[2_01_e_b+3_01_e_a]","3_11_b@9,9[3_07_e_a+4_03_e_b]"],
|
"lineup": ["4_25_a@11,3","1_06_b@11,6","6_12_a@11,7[2_01_e_a]","3_20_a@10,3[1_05_e_b]","5_14_a@10,4[3_08_e_a+5_02_e_a]","4_22_b@9,4[4_11_e_a+3_02_e_b]","4_14_b@9,8[2_01_e_b+3_01_e_a]","3_11_b@9,9[3_07_e_a+4_03_e_b]"],
|
||||||
"bonds": ["deputShip 1/41","emptyShip 1/4","kjeragShip 1/33","preciShip 2/119","sargonShip 0/11","steadShip 0/8","swiftShip 1/73","victoriaShip 0/21"]
|
"bonds": ["deputShip 1/41","emptyShip 1/4","kjeragShip 1/33","preciShip 2/119","sargonShip 0/11","steadShip 0/8","swiftShip 1/73","victoriaShip 0/21"]
|
||||||
},
|
},
|
||||||
@@ -1031,7 +1031,7 @@
|
|||||||
"title": {"id":"comment_5","name":"万事俱备","picId":"comment_icon_5","text":"装备配发数量最多"},
|
"title": {"id":"comment_5","name":"万事俱备","picId":"comment_icon_5","text":"装备配发数量最多"},
|
||||||
"trophies": 3,
|
"trophies": 3,
|
||||||
"reward": 250,
|
"reward": 250,
|
||||||
"stats": {"activatedLayers":198,"bossDamage":280030,"dmgDealt":1858902,"gold":142,"itemsEquipped":31,"kills":283,"leaks":0,"lpLost":0,"merges":2,"perfectRounds":13,"refreshes":34},
|
"stats": {"activatedLayers":198,"bossDamage":292043,"dmgDealt":1866910,"gold":142,"itemsEquipped":31,"kills":283,"leaks":0,"lpLost":0,"merges":2,"perfectRounds":13,"refreshes":34},
|
||||||
"lineup": ["2_01_b@11,6[3_10_e_a+6_03_e_b]","6_01_a@11,7","4_07_a@11,8[4_11_e_a+2_01_e_a]","4_11_a@10,7[3_11_e_a+4_07_e_a]","6_06_a@10,8[4_06_e_b+5_01_e_a]","2_10_a@9,8","4_14_a@9,9[4_09_e_a+4_04_e_a]"],
|
"lineup": ["2_01_b@11,6[3_10_e_a+6_03_e_b]","6_01_a@11,7","4_07_a@11,8[4_11_e_a+2_01_e_a]","4_11_a@10,7[3_11_e_a+4_07_e_a]","6_06_a@10,8[4_06_e_b+5_01_e_a]","2_10_a@9,8","4_14_a@9,9[4_09_e_a+4_04_e_a]"],
|
||||||
"bonds": ["deputShip 0/10","emptyShip 0/6","indomShip 1/0","preciShip 2/124","siracusaShip 0/6","swiftShip 0/32","victoriaShip 1/14","visiShip 1/60","yanShip 0/1"]
|
"bonds": ["deputShip 0/10","emptyShip 0/6","indomShip 1/0","preciShip 2/124","siracusaShip 0/6","swiftShip 0/32","victoriaShip 1/14","visiShip 1/60","yanShip 0/1"]
|
||||||
}
|
}
|
||||||
@@ -1104,42 +1104,42 @@
|
|||||||
"round": 8,
|
"round": 8,
|
||||||
"ai_0": [1,26,11,0,0,4,8,"c8fd6622",73,"arcaneShip 1/4, kazimierzShip 0/8, kjeragShip 1/12, preciShip 2/24, skillfulShip 0/5, suntShip 1/0, swiftShip 1/33",7,9,2,63],
|
"ai_0": [1,26,11,0,0,4,8,"c8fd6622",73,"arcaneShip 1/4, kazimierzShip 0/8, kjeragShip 1/12, preciShip 2/24, skillfulShip 0/5, suntShip 1/0, swiftShip 1/33",7,9,2,63],
|
||||||
"ai_1": [1,11,11,0,0,4,8,"9a145335",54,"arcaneShip 0/2, deputShip 1/2, kazimierzShip 0/7, kjeragShip 1/11, preciShip 0/2, sargonShip 1/26, siracusaShip 0/6, skillfulShip 1/7, soloShip 1/2, steadShip 1/6, swiftShip 0/13",1,9,8,60],
|
"ai_1": [1,11,11,0,0,4,8,"9a145335",54,"arcaneShip 0/2, deputShip 1/2, kazimierzShip 0/7, kjeragShip 1/11, preciShip 0/2, sargonShip 1/26, siracusaShip 0/6, skillfulShip 1/7, soloShip 1/2, steadShip 1/6, swiftShip 0/13",1,9,8,60],
|
||||||
"ai_2": [1,19,13,0,0,4,8,"b6617ece",118,"arcaneShip 1/8, deputShip 1/27, egirShip 0/6, kazimierzShip 0/2, kjeragShip 0/14, lateranoShip 0/2, raidShip 0/6, soloShip 1/12, steadShip 1/33, suntShip 1/2, swiftShip 0/4, victoriaShip 1/36, yanShip 0/10",8,9,1,66],
|
"ai_2": [1,18,13,0,0,4,8,"b6617ece",118,"arcaneShip 1/8, deputShip 1/27, egirShip 0/6, kazimierzShip 0/2, kjeragShip 0/14, lateranoShip 0/2, raidShip 0/6, soloShip 1/12, steadShip 1/33, suntShip 1/2, swiftShip 0/4, victoriaShip 1/36, yanShip 0/10",7,9,2,66],
|
||||||
"ai_3": [0,0,11,0,0,4,0,"811c9dc5",0,"arcaneShip 0/2, kjeragShip 0/5, preciShip 0/2, sargonShip 0/4, siracusaShip 0/7, skillfulShip 0/5, soloShip 0/12",0,9,9,59]
|
"ai_3": [0,0,11,0,0,4,0,"811c9dc5",0,"arcaneShip 0/2, kjeragShip 0/5, preciShip 0/2, sargonShip 0/4, siracusaShip 0/7, skillfulShip 0/5, soloShip 0/12",0,9,9,59]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"round": 9,
|
"round": 9,
|
||||||
"ai_0": [1,26,12,0,2,4,8,"2ff9d045",108,"arcaneShip 1/8, kazimierzShip 0/8, kjeragShip 1/19, preciShip 2/33, skillfulShip 1/10, suntShip 1/0, swiftShip 1/38",9,19,10,74],
|
"ai_0": [1,25,12,0,2,4,8,"2ff9d045",108,"arcaneShip 1/8, kazimierzShip 0/8, kjeragShip 1/19, preciShip 2/33, skillfulShip 1/10, suntShip 1/0, swiftShip 1/38",9,19,10,74],
|
||||||
"ai_1": [1,10,12,0,0,4,8,"08726f68",90,"arcaneShip 0/2, deputShip 2/6, kazimierzShip 0/7, kjeragShip 1/15, preciShip 0/2, sargonShip 1/48, siracusaShip 0/6, skillfulShip 1/11, soloShip 0/2, steadShip 1/10, swiftShip 0/13",14,19,5,72],
|
"ai_1": [1,10,12,0,0,4,8,"08726f68",90,"arcaneShip 0/2, deputShip 2/6, kazimierzShip 0/7, kjeragShip 1/15, preciShip 0/2, sargonShip 1/48, siracusaShip 0/6, skillfulShip 1/11, soloShip 0/2, steadShip 1/10, swiftShip 0/13",14,19,5,72],
|
||||||
"ai_2": [1,19,12,0,1,4,8,"820dc650",123,"arcaneShip 1/12, deputShip 0/27, egirShip 0/8, indomShip 1/12, kazimierzShip 0/2, kjeragShip 0/20, lateranoShip 0/4, raidShip 0/6, soloShip 1/12, steadShip 1/45, suntShip 1/2, swiftShip 0/4, victoriaShip 1/40, yanShip 0/10",19,19,0,78],
|
"ai_2": [1,18,12,0,1,4,8,"820dc650",123,"arcaneShip 1/12, deputShip 0/27, egirShip 0/8, indomShip 1/12, kazimierzShip 0/2, kjeragShip 0/20, lateranoShip 0/4, raidShip 0/6, soloShip 1/12, steadShip 1/45, suntShip 1/2, swiftShip 0/4, victoriaShip 1/40, yanShip 0/10",19,19,0,78],
|
||||||
"ai_3": [0,0,0,0,0,4,0,"811c9dc5",0,"arcaneShip 0/2, kjeragShip 0/5, preciShip 0/2, sargonShip 0/4, siracusaShip 0/7, skillfulShip 0/5, soloShip 0/12",null,null,null,59]
|
"ai_3": [0,0,0,0,0,4,0,"811c9dc5",0,"arcaneShip 0/2, kjeragShip 0/5, preciShip 0/2, sargonShip 0/4, siracusaShip 0/7, skillfulShip 0/5, soloShip 0/12",null,null,null,59]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"round": 10,
|
"round": 10,
|
||||||
"ai_0": [1,26,14,0,0,5,8,"9a50fda6",139,"arcaneShip 1/8, kazimierzShip 0/8, kjeragShip 1/30, preciShip 2/38, skillfulShip 1/20, suntShip 1/0, swiftShip 1/43",25,25,0,88],
|
"ai_0": [1,25,14,0,0,5,8,"9a50fda6",139,"arcaneShip 1/8, kazimierzShip 0/8, kjeragShip 1/30, preciShip 2/38, skillfulShip 1/20, suntShip 1/0, swiftShip 1/43",25,25,0,88],
|
||||||
"ai_1": [1,10,12,0,0,5,8,"07d01884",128,"arcaneShip 0/2, deputShip 2/10, kazimierzShip 0/7, kjeragShip 1/19, preciShip 0/2, sargonShip 1/70, siracusaShip 0/6, skillfulShip 1/15, soloShip 0/2, steadShip 1/14, swiftShip 0/13",25,25,0,83],
|
"ai_1": [1,10,12,0,0,5,8,"07d01884",128,"arcaneShip 0/2, deputShip 2/10, kazimierzShip 0/7, kjeragShip 1/19, preciShip 0/2, sargonShip 1/70, siracusaShip 0/6, skillfulShip 1/15, soloShip 0/2, steadShip 1/14, swiftShip 0/13",25,25,0,83],
|
||||||
"ai_2": [1,19,13,0,0,5,8,"27c37702",162,"arcaneShip 0/12, deputShip 0/29, egirShip 0/8, indomShip 1/27, investShip 0/2, kazimierzShip 0/2, kjeragShip 1/22, lateranoShip 0/4, raidShip 0/6, soloShip 1/14, steadShip 1/53, suntShip 1/2, swiftShip 0/6, victoriaShip 1/44, yanShip 0/10",25,25,0,90],
|
"ai_2": [1,18,13,0,0,5,8,"27c37702",167,"arcaneShip 0/12, deputShip 0/29, egirShip 0/8, indomShip 1/32, investShip 0/2, kazimierzShip 0/2, kjeragShip 1/22, lateranoShip 0/4, raidShip 0/6, soloShip 1/14, steadShip 1/53, suntShip 1/2, swiftShip 0/6, victoriaShip 1/44, yanShip 0/10",25,25,0,90],
|
||||||
"ai_3": [0,0,0,0,0,4,0,"811c9dc5",0,"arcaneShip 0/2, kjeragShip 0/5, preciShip 0/2, sargonShip 0/4, siracusaShip 0/7, skillfulShip 0/5, soloShip 0/12",null,null,null,59]
|
"ai_3": [0,0,0,0,0,4,0,"811c9dc5",0,"arcaneShip 0/2, kjeragShip 0/5, preciShip 0/2, sargonShip 0/4, siracusaShip 0/7, skillfulShip 0/5, soloShip 0/12",null,null,null,59]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"round": 11,
|
"round": 11,
|
||||||
"ai_0": [1,26,12,0,0,5,8,"3fb16be0",147,"arcaneShip 2/14, kazimierzShip 0/8, kjeragShip 1/42, preciShip 2/43, skillfulShip 0/20, suntShip 1/0, swiftShip 1/48",24,24,0,102],
|
"ai_0": [1,25,12,0,0,5,8,"3fb16be0",147,"arcaneShip 2/14, kazimierzShip 0/8, kjeragShip 1/42, preciShip 2/43, skillfulShip 0/20, suntShip 1/0, swiftShip 1/48",24,24,0,102],
|
||||||
"ai_1": [1,7,12,0,0,5,8,"0f9e40f0",166,"arcaneShip 0/2, deputShip 2/14, kazimierzShip 0/7, kjeragShip 1/23, preciShip 0/2, sargonShip 1/92, siracusaShip 0/6, skillfulShip 1/19, soloShip 0/2, steadShip 1/18, swiftShip 0/13",20,24,4,93],
|
"ai_1": [1,6,12,0,0,5,8,"0f9e40f0",166,"arcaneShip 0/2, deputShip 2/14, kazimierzShip 0/7, kjeragShip 1/23, preciShip 0/2, sargonShip 1/92, siracusaShip 0/6, skillfulShip 1/19, soloShip 0/2, steadShip 1/18, swiftShip 0/13",20,24,4,93],
|
||||||
"ai_2": [1,18,12,0,0,5,8,"170da7d8",171,"arcaneShip 2/20, deputShip 0/31, egirShip 0/8, indomShip 0/27, investShip 0/4, kazimierzShip 0/2, kjeragShip 1/26, lateranoShip 0/6, raidShip 0/6, soloShip 1/14, steadShip 1/59, suntShip 1/2, swiftShip 0/8, victoriaShip 1/50, yanShip 0/10",23,24,1,101],
|
"ai_2": [1,15,12,0,0,5,8,"170da7d8",171,"arcaneShip 2/20, deputShip 0/31, egirShip 0/8, indomShip 0/32, investShip 0/4, kazimierzShip 0/2, kjeragShip 1/26, lateranoShip 0/6, raidShip 0/6, soloShip 1/14, steadShip 1/59, suntShip 1/2, swiftShip 0/8, victoriaShip 1/50, yanShip 0/10",20,24,4,101],
|
||||||
"ai_3": [0,0,0,0,0,4,0,"811c9dc5",0,"arcaneShip 0/2, kjeragShip 0/5, preciShip 0/2, sargonShip 0/4, siracusaShip 0/7, skillfulShip 0/5, soloShip 0/12",null,null,null,59]
|
"ai_3": [0,0,0,0,0,4,0,"811c9dc5",0,"arcaneShip 0/2, kjeragShip 0/5, preciShip 0/2, sargonShip 0/4, siracusaShip 0/7, skillfulShip 0/5, soloShip 0/12",null,null,null,59]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"round": 12,
|
"round": 12,
|
||||||
"ai_0": [1,16,12,0,0,6,8,"73f82373",178,"arcaneShip 1/14, kazimierzShip 0/8, kjeragShip 1/43, preciShip 2/48, skillfulShip 1/20, suntShip 1/0, swiftShip 1/53",9,47,38,113],
|
"ai_0": [1,15,12,0,0,6,8,"73f82373",178,"arcaneShip 1/14, kazimierzShip 0/8, kjeragShip 1/43, preciShip 2/48, skillfulShip 1/20, suntShip 1/0, swiftShip 1/53",9,47,38,113],
|
||||||
"ai_1": [0,0,12,0,0,6,0,"811c9dc5",0,"arcaneShip 0/4, deputShip 0/18, kazimierzShip 0/7, kjeragShip 0/27, preciShip 0/4, sargonShip 0/105, siracusaShip 0/6, skillfulShip 0/23, soloShip 0/2, steadShip 0/22, swiftShip 0/13",12,47,35,104],
|
"ai_1": [0,0,12,0,0,6,0,"811c9dc5",0,"arcaneShip 0/4, deputShip 0/18, kazimierzShip 0/7, kjeragShip 0/27, preciShip 0/4, sargonShip 0/105, siracusaShip 0/6, skillfulShip 0/23, soloShip 0/2, steadShip 0/22, swiftShip 0/13",12,47,35,104],
|
||||||
"ai_2": [1,8,12,0,0,5,8,"1ae72893",224,"arcaneShip 0/22, deputShip 1/35, egirShip 0/8, indomShip 0/27, investShip 0/6, kazimierzShip 0/2, kjeragShip 1/30, lateranoShip 0/6, preciShip 0/2, raidShip 0/6, sargonShip 0/2, soloShip 1/16, steadShip 1/67, suntShip 2/4, swiftShip 1/14, victoriaShip 1/58, yanShip 0/10",12,47,35,113],
|
"ai_2": [1,5,12,0,0,5,8,"1ae72893",224,"arcaneShip 0/22, deputShip 1/35, egirShip 0/8, indomShip 0/32, investShip 0/6, kazimierzShip 0/2, kjeragShip 1/30, lateranoShip 0/6, preciShip 0/2, raidShip 0/6, sargonShip 0/2, soloShip 1/16, steadShip 1/67, suntShip 2/4, swiftShip 1/14, victoriaShip 1/58, yanShip 0/10",14,47,33,113],
|
||||||
"ai_3": [0,0,0,0,0,4,0,"811c9dc5",0,"arcaneShip 0/2, kjeragShip 0/5, preciShip 0/2, sargonShip 0/4, siracusaShip 0/7, skillfulShip 0/5, soloShip 0/12",null,null,null,59]
|
"ai_3": [0,0,0,0,0,4,0,"811c9dc5",0,"arcaneShip 0/2, kjeragShip 0/5, preciShip 0/2, sargonShip 0/4, siracusaShip 0/7, skillfulShip 0/5, soloShip 0/12",null,null,null,59]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"round": 13,
|
"round": 13,
|
||||||
"ai_0": [1,6,12,0,0,6,8,"be1b1985",168,"arcaneShip 2/16, kazimierzShip 0/8, kjeragShip 1/51, preciShip 2/48, skillfulShip 0/20, suntShip 1/0, swiftShip 1/53",18,39,21,123],
|
"ai_0": [1,5,12,0,0,6,8,"be1b1985",168,"arcaneShip 2/16, kazimierzShip 0/8, kjeragShip 1/51, preciShip 2/48, skillfulShip 0/20, suntShip 1/0, swiftShip 1/53",18,39,21,123],
|
||||||
"ai_1": [0,0,0,0,0,6,0,"811c9dc5",0,"arcaneShip 0/4, deputShip 0/18, kazimierzShip 0/7, kjeragShip 0/27, preciShip 0/4, sargonShip 0/105, siracusaShip 0/6, skillfulShip 0/23, soloShip 0/2, steadShip 0/22, swiftShip 0/13",null,null,null,104],
|
"ai_1": [0,0,0,0,0,6,0,"811c9dc5",0,"arcaneShip 0/4, deputShip 0/18, kazimierzShip 0/7, kjeragShip 0/27, preciShip 0/4, sargonShip 0/105, siracusaShip 0/6, skillfulShip 0/23, soloShip 0/2, steadShip 0/22, swiftShip 0/13",null,null,null,104],
|
||||||
"ai_2": [0,0,12,0,0,6,0,"811c9dc5",0,"arcaneShip 0/22, deputShip 0/39, egirShip 0/8, indomShip 0/27, investShip 0/8, kazimierzShip 0/2, kjeragShip 0/36, lateranoShip 0/6, preciShip 0/4, raidShip 0/6, sargonShip 0/4, soloShip 0/18, steadShip 0/75, suntShip 0/6, swiftShip 0/20, victoriaShip 0/66, yanShip 0/10",15,39,24,124],
|
"ai_2": [0,0,12,0,0,6,0,"811c9dc5",0,"arcaneShip 0/22, deputShip 0/39, egirShip 0/8, indomShip 0/32, investShip 0/8, kazimierzShip 0/2, kjeragShip 0/34, lateranoShip 0/6, preciShip 0/4, raidShip 0/6, sargonShip 0/4, soloShip 0/20, steadShip 0/77, suntShip 0/6, swiftShip 0/20, victoriaShip 0/64, yanShip 0/10",18,39,21,124],
|
||||||
"ai_3": [0,0,0,0,0,4,0,"811c9dc5",0,"arcaneShip 0/2, kjeragShip 0/5, preciShip 0/2, sargonShip 0/4, siracusaShip 0/7, skillfulShip 0/5, soloShip 0/12",null,null,null,59]
|
"ai_3": [0,0,0,0,0,4,0,"811c9dc5",0,"arcaneShip 0/2, kjeragShip 0/5, preciShip 0/2, sargonShip 0/4, siracusaShip 0/7, skillfulShip 0/5, soloShip 0/12",null,null,null,59]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -1154,7 +1154,7 @@
|
|||||||
"title": {"id":"comment_2","name":"不朽盟约","picId":"comment_icon_2","text":"激活的盟约层数总和最高"},
|
"title": {"id":"comment_2","name":"不朽盟约","picId":"comment_icon_2","text":"激活的盟约层数总和最高"},
|
||||||
"trophies": 3,
|
"trophies": 3,
|
||||||
"reward": 340,
|
"reward": 340,
|
||||||
"stats": {"activatedLayers":174,"bossDamage":113104,"dmgDealt":5720406,"gold":135,"itemsEquipped":13,"kills":159,"leaks":90,"lpLost":39,"merges":5,"perfectRounds":7,"refreshes":11},
|
"stats": {"activatedLayers":174,"bossDamage":113104,"dmgDealt":5751950,"gold":135,"itemsEquipped":13,"kills":159,"leaks":90,"lpLost":40,"merges":5,"perfectRounds":7,"refreshes":11},
|
||||||
"lineup": ["4_13_b@12,4[3_06_e_a+3_04_e_b]","1_17_b@12,8","4_02_a@11,4","3_11_a@11,8[3_04_e_b]","4_10_a@10,4","4_22_b@10,7[2_04_e_b+5_07_e_b]","1_19_b@10,8","6_05_a@9,3[1_05_e_b]"],
|
"lineup": ["4_13_b@12,4[3_06_e_a+3_04_e_b]","1_17_b@12,8","4_02_a@11,4","3_11_a@11,8[3_04_e_b]","4_10_a@10,4","4_22_b@10,7[2_04_e_b+5_07_e_b]","1_19_b@10,8","6_05_a@9,3[1_05_e_b]"],
|
||||||
"bonds": ["arcaneShip 2/22","kazimierzShip 0/8","kjeragShip 1/51","preciShip 2/48","skillfulShip 0/20","suntShip 1/0","swiftShip 1/53"]
|
"bonds": ["arcaneShip 2/22","kazimierzShip 0/8","kjeragShip 1/51","preciShip 2/48","skillfulShip 0/20","suntShip 1/0","swiftShip 1/53"]
|
||||||
},
|
},
|
||||||
@@ -1168,7 +1168,7 @@
|
|||||||
"title": {"id":"comment_6","name":"挥金如土","picId":"comment_icon_6","text":"消耗资金最多"},
|
"title": {"id":"comment_6","name":"挥金如土","picId":"comment_icon_6","text":"消耗资金最多"},
|
||||||
"trophies": 2,
|
"trophies": 2,
|
||||||
"reward": 255,
|
"reward": 255,
|
||||||
"stats": {"activatedLayers":0,"bossDamage":0,"dmgDealt":4098745,"gold":104,"itemsEquipped":10,"kills":163,"leaks":59,"lpLost":29,"merges":0,"perfectRounds":7,"refreshes":19},
|
"stats": {"activatedLayers":0,"bossDamage":0,"dmgDealt":4098745,"gold":104,"itemsEquipped":10,"kills":163,"leaks":59,"lpLost":30,"merges":0,"perfectRounds":7,"refreshes":19},
|
||||||
"lineup": [],
|
"lineup": [],
|
||||||
"bonds": ["arcaneShip 0/4","deputShip 0/18","kazimierzShip 0/7","kjeragShip 0/27","preciShip 0/4","sargonShip 0/105","siracusaShip 0/6","skillfulShip 0/23","soloShip 0/2","steadShip 0/22","swiftShip 0/13"]
|
"bonds": ["arcaneShip 0/4","deputShip 0/18","kazimierzShip 0/7","kjeragShip 0/27","preciShip 0/4","sargonShip 0/105","siracusaShip 0/6","skillfulShip 0/23","soloShip 0/2","steadShip 0/22","swiftShip 0/13"]
|
||||||
},
|
},
|
||||||
@@ -1182,9 +1182,9 @@
|
|||||||
"title": {"id":"comment_4","name":"精英云集","picId":"comment_icon_4","text":"晋升精锐次数最多"},
|
"title": {"id":"comment_4","name":"精英云集","picId":"comment_icon_4","text":"晋升精锐次数最多"},
|
||||||
"trophies": 3,
|
"trophies": 3,
|
||||||
"reward": 298,
|
"reward": 298,
|
||||||
"stats": {"activatedLayers":0,"bossDamage":0,"dmgDealt":5421510,"gold":124,"itemsEquipped":16,"kills":187,"leaks":75,"lpLost":30,"merges":6,"perfectRounds":5,"refreshes":15},
|
"stats": {"activatedLayers":0,"bossDamage":0,"dmgDealt":5515195,"gold":124,"itemsEquipped":16,"kills":187,"leaks":74,"lpLost":33,"merges":6,"perfectRounds":5,"refreshes":15},
|
||||||
"lineup": [],
|
"lineup": [],
|
||||||
"bonds": ["arcaneShip 0/22","deputShip 0/39","egirShip 0/8","indomShip 0/27","investShip 0/8","kazimierzShip 0/2","kjeragShip 0/36","lateranoShip 0/6","preciShip 0/4","raidShip 0/6","sargonShip 0/4","soloShip 0/18","steadShip 0/75","suntShip 0/6","swiftShip 0/20","victoriaShip 0/66","yanShip 0/10"]
|
"bonds": ["arcaneShip 0/22","deputShip 0/39","egirShip 0/8","indomShip 0/32","investShip 0/8","kazimierzShip 0/2","kjeragShip 0/34","lateranoShip 0/6","preciShip 0/4","raidShip 0/6","sargonShip 0/4","soloShip 0/20","steadShip 0/77","suntShip 0/6","swiftShip 0/20","victoriaShip 0/64","yanShip 0/10"]
|
||||||
},
|
},
|
||||||
"ai_3": {
|
"ai_3": {
|
||||||
"alive": false,
|
"alive": false,
|
||||||
@@ -1307,7 +1307,7 @@
|
|||||||
"title": {"id":"comment_1","name":"卫戍之星","picId":"comment_icon_1","text":"对敌方领袖造成伤害最高(仅胜利时)"},
|
"title": {"id":"comment_1","name":"卫戍之星","picId":"comment_icon_1","text":"对敌方领袖造成伤害最高(仅胜利时)"},
|
||||||
"trophies": 4,
|
"trophies": 4,
|
||||||
"reward": 400,
|
"reward": 400,
|
||||||
"stats": {"activatedLayers":243,"bossDamage":1060837,"dmgDealt":4542277,"gold":130,"itemsEquipped":29,"kills":258,"leaks":15,"lpLost":12,"merges":5,"perfectRounds":11,"refreshes":16},
|
"stats": {"activatedLayers":243,"bossDamage":1060837,"dmgDealt":4533292,"gold":130,"itemsEquipped":29,"kills":258,"leaks":15,"lpLost":12,"merges":5,"perfectRounds":11,"refreshes":16},
|
||||||
"lineup": ["1_06_b@12,3[5_07_e_a+4_03_e_b]","1_02_b@12,4[5_02_e_a+4_11_e_a]","1_17_b@11,6[4_03_e_a+1_01_e_b]","3_11_b@11,7[3_01_e_a+3_02_e_a]","3_20_a@10,3[1_05_e_a+1_05_e_b]","1_10_b@10,8[4_02_e_a+6_11_e_a]","5_11_a@9,4[4_08_e_a+1_02_e_a]","5_12_a@9,9[4_10_e_a]"],
|
"lineup": ["1_06_b@12,3[5_07_e_a+4_03_e_b]","1_02_b@12,4[5_02_e_a+4_11_e_a]","1_17_b@11,6[4_03_e_a+1_01_e_b]","3_11_b@11,7[3_01_e_a+3_02_e_a]","3_20_a@10,3[1_05_e_a+1_05_e_b]","1_10_b@10,8[4_02_e_a+6_11_e_a]","5_11_a@9,4[4_08_e_a+1_02_e_a]","5_12_a@9,9[4_10_e_a]"],
|
||||||
"bonds": ["arcaneShip 1/40","deputShip 1/20","indomShip 0/8","kjeragShip 1/56","preciShip 1/57","soloShip 1/14","steadShip 2/36","suntShip 2/20","victoriaShip 0/12","visiShip 0/8"]
|
"bonds": ["arcaneShip 1/40","deputShip 1/20","indomShip 0/8","kjeragShip 1/56","preciShip 1/57","soloShip 1/14","steadShip 2/36","suntShip 2/20","victoriaShip 0/12","visiShip 0/8"]
|
||||||
}
|
}
|
||||||
@@ -1820,7 +1820,7 @@
|
|||||||
"title": {"id":"comment_1","name":"卫戍之星","picId":"comment_icon_1","text":"对敌方领袖造成伤害最高(仅胜利时)"},
|
"title": {"id":"comment_1","name":"卫戍之星","picId":"comment_icon_1","text":"对敌方领袖造成伤害最高(仅胜利时)"},
|
||||||
"trophies": 4,
|
"trophies": 4,
|
||||||
"reward": 400,
|
"reward": 400,
|
||||||
"stats": {"activatedLayers":159,"bossDamage":409390,"dmgDealt":3091440,"gold":133,"itemsEquipped":13,"kills":358,"leaks":40,"lpLost":16,"merges":3,"perfectRounds":7,"refreshes":27},
|
"stats": {"activatedLayers":159,"bossDamage":409390,"dmgDealt":3096240,"gold":133,"itemsEquipped":13,"kills":358,"leaks":40,"lpLost":16,"merges":3,"perfectRounds":7,"refreshes":27},
|
||||||
"lineup": ["3_20_a@12,5[5_03_e_a]","5_10_a@12,6","6_12_a@12,7[3_08_e_a]","3_11_a@11,8[5_02_e_a]","4_14_a@10,3","2_13_a@10,7[4_04_e_a+4_06_e_a]","4_18_a@10,8[4_11_e_a]","4_13_a@9,7[3_07_e_a+4_03_e_a]"],
|
"lineup": ["3_20_a@12,5[5_03_e_a]","5_10_a@12,6","6_12_a@12,7[3_08_e_a]","3_11_a@11,8[5_02_e_a]","4_14_a@10,3","2_13_a@10,7[4_04_e_a+4_06_e_a]","4_18_a@10,8[4_11_e_a]","4_13_a@9,7[3_07_e_a+4_03_e_a]"],
|
||||||
"bonds": ["emptyShip 1/0","kazimierzShip 0/8","kjeragShip 1/23","miraShip 0/13","preciShip 2/54","siracusaShip 0/16","skillfulShip 1/27","soloShip 1/0","swiftShip 1/55","visiShip 1/0"]
|
"bonds": ["emptyShip 1/0","kazimierzShip 0/8","kjeragShip 1/23","miraShip 0/13","preciShip 2/54","siracusaShip 0/16","skillfulShip 1/27","soloShip 1/0","swiftShip 1/55","visiShip 1/0"]
|
||||||
},
|
},
|
||||||
|
|||||||
+59
-59
@@ -198,25 +198,25 @@
|
|||||||
"time": 110,
|
"time": 110,
|
||||||
"ticks": 3300,
|
"ticks": 3300,
|
||||||
"reason": "timeout",
|
"reason": "timeout",
|
||||||
"killed": 16,
|
"killed": 18,
|
||||||
"total": 36,
|
"total": 36,
|
||||||
"unspawned": 0,
|
"unspawned": 0,
|
||||||
"bossHpLeft": null,
|
"bossHpLeft": null,
|
||||||
"rngDraws": 2,
|
"rngDraws": 2,
|
||||||
"errors": {"count":0,"kinds":[]},
|
"errors": {"count":0,"kinds":[]},
|
||||||
"players": {"p1":{"killed":16,"total":36,"perfect":false,"leaks":20,"leaksUncounted":0,"coins":2,"dmg":156012,"bossDmg":0,"heal":25616,"deaths":13,"layerGains":{}}},
|
"players": {"p1":{"killed":18,"total":36,"perfect":false,"leaks":18,"leaksUncounted":0,"coins":2,"dmg":159502,"bossDmg":0,"heal":27165,"deaths":13,"layerGains":{}}},
|
||||||
"units": [
|
"units": [
|
||||||
["p1",1,"op","chess_char_2_08_a",1,null,0,0,8,2,21911,12843,196,1,1],
|
["p1",1,"op","chess_char_2_08_a",1,null,0,0,8,1,15989,12062,196,1,1],
|
||||||
["p1",2,"op","chess_char_2_17_a",1,null,0,0,6,0,5110,9174,1754,1,2],
|
["p1",2,"op","chess_char_2_17_a",1,null,0,0,6,1,2051,9174,1754,1,2],
|
||||||
["p1",3,"op","chess_char_2_18_a",0,null,0,0,9,3,43723,9313,225,15,1],
|
["p1",3,"op","chess_char_2_18_a",0,null,0,0,9,2,42927,9173,225,15,1],
|
||||||
["p1",4,"op","chess_char_2_07_a",1,null,0,0,10,1,7917,5223,0,9,1],
|
["p1",4,"op","chess_char_2_07_a",1,null,0,0,10,2,9245,7305,0,11,1],
|
||||||
["p1",5,"op","chess_char_2_09_a",1,null,2062.75,1,55,0,9315,6217,2145,22,1],
|
["p1",5,"op","chess_char_2_09_a",1,null,1746.49,1,55,0,9315,6537,2148,22,1],
|
||||||
["p1",6,"op","chess_char_2_11_a",1,null,0,0,12,0,20966,8657,198,27,1],
|
["p1",6,"op","chess_char_2_11_a",1,null,0,0,12,0,20294,8657,198,26,1],
|
||||||
["p1",7,"op","chess_char_2_13_a",1,null,3434.92,1,57,1,11476,4121,66,21,1],
|
["p1",7,"op","chess_char_2_13_a",1,null,3434.92,1,57,1,11476,4121,66,21,1],
|
||||||
["p1",8,"op","chess_char_2_16_a",1,null,3408.27,1,54,1,5941,5437,204,16,0],
|
["p1",8,"op","chess_char_2_16_a",1,null,3408.27,1,54,1,5941,5437,204,16,0],
|
||||||
["p1",9,"op","chess_char_2_12_a",1,null,0,0,52,4,9732,5937,0,25,2],
|
["p1",9,"op","chess_char_2_12_a",1,null,0,0,52,4,10827,5797,0,31,2],
|
||||||
["p1",10,"op","chess_char_2_06_a",0,null,0,0,4,0,0,3019,13905,24,7],
|
["p1",10,"op","chess_char_2_06_a",0,null,0,0,4,0,0,3707,15451,25,8],
|
||||||
["p1",11,"op","chess_char_2_10_a",1,null,0,0,5,0,13772,2892,0,52,1],
|
["p1",11,"op","chess_char_2_10_a",1,null,0,0,5,4,25288,2727,0,54,1],
|
||||||
["p1",12,"op","chess_char_2_14_a",1,null,2344.5,1,56,0,0,4885,6856,11,0],
|
["p1",12,"op","chess_char_2_14_a",1,null,2344.5,1,56,0,0,4885,6856,11,0],
|
||||||
["-","~1","device","trap_1105_accrate",null,null,100,1,1,0,0,0,0,0,null],
|
["-","~1","device","trap_1105_accrate",null,null,100,1,1,0,0,0,0,0,null],
|
||||||
["-","~2","device","trap_1105_accrate",null,null,100,1,2,0,0,0,0,0,null],
|
["-","~2","device","trap_1105_accrate",null,null,100,1,2,0,0,0,0,0,null],
|
||||||
@@ -224,26 +224,26 @@
|
|||||||
["p1","~1","token","token_10022_kazema_shadow",null,null,0,0,26,0,6149,1883,67,6,null]
|
["p1","~1","token","token_10022_kazema_shadow",null,null,0,0,26,0,6149,1883,67,6,null]
|
||||||
],
|
],
|
||||||
"enemies": {
|
"enemies": {
|
||||||
"enemy_1001_bigbo": [1,0,1,7938,5123],
|
"enemy_1001_bigbo": [1,0,1,7938,6359],
|
||||||
"enemy_1006_shield": [1,1,0,3550,10368],
|
"enemy_1006_shield": [1,1,0,3684,10368],
|
||||||
"enemy_10118_ymgprc": [1,0,1,4447,8996],
|
"enemy_10118_ymgprc": [1,0,1,5228,9330],
|
||||||
"enemy_1041_lazerd_2": [1,0,1,8962,6922],
|
"enemy_1041_lazerd_2": [1,0,1,7858,7393],
|
||||||
"enemy_1118_lidbox_2": [1,1,0,5324,16416],
|
"enemy_1118_lidbox_2": [1,1,0,4540,16416],
|
||||||
"enemy_1158_divman": [18,11,7,2847,72154],
|
"enemy_1158_divman": [18,12,6,3784,73679],
|
||||||
"enemy_1160_hvyslr": [3,1,2,4530,27059],
|
"enemy_1160_hvyslr": [3,1,2,4699,23403],
|
||||||
"enemy_1161_tidmag": [3,1,1,7540,12468],
|
"enemy_1161_tidmag": [3,1,1,9394,12608],
|
||||||
"enemy_1169_duphlx_2": [1,0,1,782,7742],
|
"enemy_1169_duphlx_2": [1,1,0,1019,10368],
|
||||||
"enemy_1200_msfjin_2": [1,0,1,0,26],
|
"enemy_1200_msfjin_2": [1,0,1,0,27],
|
||||||
"enemy_1249_lysdb_2": [1,1,0,918,10368],
|
"enemy_1249_lysdb_2": [1,1,0,715,10368],
|
||||||
"enemy_1299_ymkilr": [1,0,1,413,1850],
|
"enemy_1299_ymkilr": [1,0,1,141,3305],
|
||||||
"enemy_1389_winbab_2": [1,0,1,3237,1400],
|
"enemy_1389_winbab_2": [1,0,1,4326,1540],
|
||||||
"enemy_1504_cqbw": [1,0,1,3469,1372],
|
"enemy_1504_cqbw": [1,0,1,2728,1508],
|
||||||
"enemy_2009_csaudc": [1,0,1,0,490]
|
"enemy_2009_csaudc": [1,0,1,0,490]
|
||||||
},
|
},
|
||||||
"hooks": [1,57,3300,430,430,1504,1533,2010,30,49,18,18,0,11091,45,31,36,19,1,37,0,1,0],
|
"hooks": [1,57,3300,445,445,1567,1602,2014,32,49,19,19,0,11565,42,34,36,17,1,36,0,3,0],
|
||||||
"events": {"atk":523,"bounty":1,"deploy":18,"die":30,"dmg":1435,"engage":11,"fx":43,"heal":98,"leak":19,"skill":36,"spawn":52,"status":161},
|
"events": {"atk":541,"bounty":1,"deploy":18,"die":32,"dmg":1502,"engage":11,"fx":88,"heal":101,"leak":17,"skill":38,"spawn":52,"status":170},
|
||||||
"fx": {"aoe":4,"burst":1,"camouflage":2,"counter":21,"dodge":3,"dollEnd":1,"explode":1,"liberate":1,"overload":1,"phase":1,"shield":2,"shieldBreak":1,"substitute":1,"summon":1,"takeoff":1,"telegraph":1},
|
"fx": {"aoe":4,"burst":3,"camouflage":2,"counter":13,"dodge":3,"dollEnd":1,"drone":51,"explode":1,"liberate":1,"overload":1,"phase":1,"shield":2,"shieldBreak":1,"substitute":1,"summon":1,"takeoff":1,"telegraph":1},
|
||||||
"snaps": "a449ec9d ed6b281b add3999f 9cbb2a3b 3709fe31 928ecc43 db354d83 c891dc9d 2a0b06dd c6c94f4c 9afcc9ab"
|
"snaps": "a449ec9d ed6b281b add3999f e496ab4d 47f79015 f56aa952 0f6cee85 23b4af21 f0258fce b943a246 73241cae"
|
||||||
},
|
},
|
||||||
"roster-005": {
|
"roster-005": {
|
||||||
"about": "pass 0 band 3: chess_char_2_07_b chess_char_2_08_b chess_char_2_09_b chess_char_2_11_b chess_char_2_12_b chess_char_2_19_a chess_char_2_01_b chess_char_2_02_b chess_char_2_04_b chess_char_2_05_b chess_char_2_06_b chess_char_2_10_b token_10000_silent_healrb",
|
"about": "pass 0 band 3: chess_char_2_07_b chess_char_2_08_b chess_char_2_09_b chess_char_2_11_b chess_char_2_12_b chess_char_2_19_a chess_char_2_01_b chess_char_2_02_b chess_char_2_04_b chess_char_2_05_b chess_char_2_06_b chess_char_2_10_b token_10000_silent_healrb",
|
||||||
@@ -254,51 +254,51 @@
|
|||||||
"round": 6,
|
"round": 6,
|
||||||
"seed": 4076349243,
|
"seed": 4076349243,
|
||||||
"waveId": "act1autochess_06",
|
"waveId": "act1autochess_06",
|
||||||
"time": 130.93,
|
"time": 131.77,
|
||||||
"ticks": 3928,
|
"ticks": 3953,
|
||||||
"reason": "cleared",
|
"reason": "cleared",
|
||||||
"killed": 84,
|
"killed": 84,
|
||||||
"total": 84,
|
"total": 84,
|
||||||
"unspawned": 0,
|
"unspawned": 0,
|
||||||
"bossHpLeft": null,
|
"bossHpLeft": null,
|
||||||
"rngDraws": 244,
|
"rngDraws": 196,
|
||||||
"errors": {"count":0,"kinds":[]},
|
"errors": {"count":0,"kinds":[]},
|
||||||
"players": {"p1":{"killed":84,"total":84,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":12,"dmg":310935,"bossDmg":0,"heal":28984,"deaths":0,"layerGains":{}}},
|
"players": {"p1":{"killed":84,"total":84,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":12,"dmg":313292,"bossDmg":0,"heal":29016,"deaths":0,"layerGains":{}}},
|
||||||
"units": [
|
"units": [
|
||||||
["p1",1,"op","chess_char_2_07_b",1,"uniequip_002_ghost",2983.9,1,2,0,0,1196,767,0,0],
|
["p1",1,"op","chess_char_2_07_b",1,"uniequip_002_ghost",2983.9,1,2,0,0,1594,1165,0,0],
|
||||||
["p1",2,"op","chess_char_2_08_b",1,"uniequip_002_bubble",3710.3,1,4,0,28,425,0,0,1],
|
["p1",2,"op","chess_char_2_08_b",1,"uniequip_002_bubble",3710.3,1,4,0,433,851,0,0,1],
|
||||||
["p1",3,"op","chess_char_2_09_b",1,"uniequip_002_humus",2346.3,1,6,27,79838,0,0,55,2],
|
["p1",3,"op","chess_char_2_09_b",1,"uniequip_002_humus",2346.3,1,6,15,51975,0,0,40,2],
|
||||||
["p1",4,"op","chess_char_2_11_b",1,"uniequip_002_kazema",2435.4,1,8,16,97508,11256,0,85,3],
|
["p1",4,"op","chess_char_2_11_b",1,"uniequip_002_kazema",2435.4,1,8,25,89051,10159,0,85,3],
|
||||||
["p1",5,"op","chess_char_2_12_b",1,"uniequip_002_gravel",1773.2,1,10,0,7308,6790,0,119,1],
|
["p1",5,"op","chess_char_2_12_b",1,"uniequip_002_gravel",1773.2,1,10,1,9406,6430,0,120,1],
|
||||||
["p1",6,"op","chess_char_2_19_a",1,null,1123.32,1,11,1,16246,1195,209,26,3],
|
["p1",6,"op","chess_char_2_19_a",1,null,1123.32,1,11,1,16246,1408,209,26,3],
|
||||||
["p1",7,"op","chess_char_2_01_b",1,"uniequip_002_excu",2360.6,1,12,20,35604,4195,0,22,1],
|
["p1",7,"op","chess_char_2_01_b",1,"uniequip_002_excu",2360.6,1,12,20,35604,3812,0,22,1],
|
||||||
["p1",8,"op","chess_char_2_02_b",1,"uniequip_002_silent",1775.4,1,1,0,0,0,6631,26,5],
|
["p1",8,"op","chess_char_2_02_b",1,"uniequip_002_silent",1775.4,1,1,0,0,0,7768,26,5],
|
||||||
["p1",9,"op","chess_char_2_04_b",1,"uniequip_002_grabds",1397,1,3,7,33691,2087,0,49,3],
|
["p1",9,"op","chess_char_2_04_b",1,"uniequip_002_grabds",1397,1,3,5,28585,2921,0,36,3],
|
||||||
["p1",10,"op","chess_char_2_05_b",1,"uniequip_002_harold",2168.32,1,5,0,0,405,9392,34,2],
|
["p1",10,"op","chess_char_2_05_b",1,"uniequip_002_harold",2168.32,1,5,0,0,405,10672,40,2],
|
||||||
["p1",11,"op","chess_char_2_06_b",0,"uniequip_002_papyrs",1802.9,1,7,0,0,442,8934,27,13],
|
["p1",11,"op","chess_char_2_06_b",0,"uniequip_002_papyrs",1802.9,1,7,0,0,442,6700,28,14],
|
||||||
["p1",12,"op","chess_char_2_10_b",1,"uniequip_002_rockr",1546.6,1,9,8,40712,993,0,102,2],
|
["p1",12,"op","chess_char_2_10_b",1,"uniequip_002_rockr",1546.6,1,9,11,81993,993,0,103,2],
|
||||||
["p1",13,"token","token_10000_silent_healrb",null,null,1000,0,102,0,0,0,3050,30,null]
|
["p1",13,"token","token_10000_silent_healrb",null,null,1000,0,102,0,0,0,2500,25,null]
|
||||||
],
|
],
|
||||||
"enemies": {
|
"enemies": {
|
||||||
"enemy_10027_vtsk": [1,1,0,6613,24000],
|
"enemy_10027_vtsk": [1,1,0,2556,24000],
|
||||||
"enemy_1006_shield_2": [1,1,0,0,8000],
|
"enemy_1006_shield_2": [1,1,0,0,8000],
|
||||||
"enemy_10122_uacann_2": [1,1,0,4915,8000],
|
"enemy_10122_uacann_2": [1,1,0,4915,8000],
|
||||||
"enemy_1042_frostd": [1,1,0,0,5200],
|
"enemy_1042_frostd": [1,1,0,0,5200],
|
||||||
"enemy_1119_vofsd": [1,1,0,0,8800],
|
"enemy_1119_vofsd": [1,1,0,0,8800],
|
||||||
"enemy_1170_dushld": [1,1,0,168,5600],
|
"enemy_1170_dushld": [1,1,0,0,5600],
|
||||||
"enemy_1202_msfzhi": [1,1,0,0,2],
|
"enemy_1202_msfzhi": [1,1,0,0,2],
|
||||||
"enemy_1249_lysdb_2": [15,15,0,97,72000],
|
"enemy_1249_lysdb_2": [15,15,0,118,72000],
|
||||||
"enemy_1251_lysyta": [52,52,0,37,114400],
|
"enemy_1251_lysyta": [52,52,0,139,114400],
|
||||||
"enemy_1299_ymkilr_2": [1,1,0,1145,8800],
|
"enemy_1299_ymkilr_2": [1,1,0,1346,8800],
|
||||||
"enemy_1328_cbjedi": [6,6,0,4308,48000],
|
"enemy_1328_cbjedi": [6,6,0,6253,48000],
|
||||||
"enemy_1402_tgshd_2": [1,1,0,688,10400],
|
"enemy_1402_tgshd_2": [1,1,0,101,10400],
|
||||||
"enemy_1509_mousek": [1,1,0,6340,17600],
|
"enemy_1509_mousek": [1,1,0,8540,17600],
|
||||||
"enemy_2010_csdcr": [1,1,0,1019,9600]
|
"enemy_2010_csdcr": [1,1,0,1395,9600]
|
||||||
},
|
},
|
||||||
"hooks": [1,102,3928,653,653,1605,1597,597,84,90,36,35,0,27040,116,48,84,0,1,84,0,0,0],
|
"hooks": [1,102,3953,632,632,1591,1579,742,84,90,37,36,0,27164,94,51,84,0,1,84,0,0,0],
|
||||||
"events": {"atk":819,"bounty":6,"deploy":18,"die":90,"dmg":1545,"engage":7,"fx":71,"heal":123,"skill":71,"spawn":97,"status":392},
|
"events": {"atk":764,"bounty":6,"deploy":18,"die":90,"dmg":1516,"engage":7,"fx":153,"heal":128,"skill":73,"spawn":97,"status":370},
|
||||||
"fx": {"counter":1,"explode":4,"expose":16,"overload":2,"phase":1,"shield":8,"shieldBreak":16,"sleep":6,"summon":5,"telegraph":5,"zone":7},
|
"fx": {"counter":2,"drone":79,"explode":4,"expose":20,"overload":2,"phase":1,"shield":5,"shieldBreak":16,"sleep":5,"summon":5,"telegraph":6,"zone":8},
|
||||||
"snaps": "ef546b03 cddbeb04 da6dbc8a 56061bd0 871d7588 425d6cc9 554ecd8b fa1afeca a9ba8e9d 1349294d 9b54b818 bbc6adbc 6ac20ed0"
|
"snaps": "ef546b03 cddbeb04 85340532 1244cc85 93dbff28 11c61273 60a6624f e9e54c53 6590d889 8cfff799 8dd0aa7a ae35884a f9d57170 460ee6b0"
|
||||||
},
|
},
|
||||||
"roster-006": {
|
"roster-006": {
|
||||||
"about": "pass 0 band 3: chess_char_2_17_b chess_char_2_18_b chess_char_3_06_a chess_char_2_13_b chess_char_2_16_b chess_char_3_02_a chess_char_3_03_a chess_char_3_04_a chess_char_3_05_a chess_char_2_14_b chess_char_2_19_b chess_char_3_01_a",
|
"about": "pass 0 band 3: chess_char_2_17_b chess_char_2_18_b chess_char_3_06_a chess_char_2_13_b chess_char_2_16_b chess_char_3_02_a chess_char_3_03_a chess_char_3_04_a chess_char_3_05_a chess_char_2_14_b chess_char_2_19_b chess_char_3_01_a",
|
||||||
|
|||||||
Reference in new issue
Block a user