feedback7 R22-FIELDS: boss-field portals teleport — a route ending on a portal entrance comes out of the far exit and leaks at that side's blue door, the four appear-less crossings reappear at the exit (GitHub #336, PR #337 by @2321Robin); golden: 8 fields, 6 matches

PR #337 by @2321Robin (GitHub #336, both with a recording of the official game), applied with small changes: the exit
distance uses detmath hypot (PR #373 bans Math.hypot in the sim), comments cite the data counts as measured here
(137 routes end on [1,3] / [1,17]; 95 explicit DISAPPEAR / APPEAR pairs, all → [5,10]), the end-teleport's zero wait
is marked [ASSUMED] beside the pairing, and the test reads the test enemy's own leaks (the templates' escorts leak too)
and checks the entrance itself is no leak.

- simdata.js portalAppear: act1autochess_h07_02 #4, act1autochess_h08_02 #5 / #9 and act2autochess_h07_05 #6 write
  DISAPPEAR → WAIT → MOVE[5,10] with no APPEAR (the level files too); the exit APPEAR is inserted before that move.
  Before, the enemy walked the rest of its route hidden and leaked unseen.
- ai.js portalPickup: a route that ends on tile_telin (the boss / Hidden Core circuits) vanishes the enemy, brings it
  out of the farthest telout ([5,10]) and walks it to the nearest blue door ([2,2] / [2,18]), where it leaks. Before,
  stepping into the corner portal was the leak. Mid-route crossings are unchanged (every MOVE onto an entrance in the
  data is followed by an explicit DISAPPEAR).

Golden — only boss / Hidden Core fields and the matches' final rounds move (no round row of any match moves):
- fields boss-boss_2-solo (铳): the 2 lrrook escorts still leak, now at the door after the portal, and take 120652
  damage instead of 66943; leader left 2761255 → 2763024.
- fields boss-boss_4-solo (昆图斯): the 2 dspred leaks now happen at the door; one more operator death (6 → 7);
  leader left 3759559 → 3759921.
- fields boss-boss_6-pair (阿利斯泰尔): the 2 hllevi_2 that leaked at the portals are killed on the way back:
  killed 4 → 6, both players perfect (1 leak each → 0); leader left 7017881 → 6972383.
- fields boss-boss_6-solo: killed 5 → 8, leaks 5 → 2 (the 3 msfshu that leaked are killed; the 2 hllevi_2 leak at the
  door); leader damage 105194 → 75209.
- fields hidden-boss_8-pair (胄): p2's one vtsk leak is gone — that vtsk is still walking to the door at the 200 s
  cap; p2 perfect.
- fields hidden-boss_8-solo: killed 3 → 8, total 13 → 19 (more sfshu die, so more msfshu split off: 3 → 9), leaks
  10 → 10; leader damage 402606 → 191576 (the escorts that come back out of [5,10] draw the fire).
- fields hidden-boss_9-pair (铳): from portalAppear alone — h08_02's routes #5 / #9 no longer count the portal hop as
  8 tiles of walking, so the targeting order of those escorts changes; leader left 3570058 → 3511007.
- fields hidden-boss_10-solo (管): the yokai_3 escort crosses back (taken 68252 → 101682), 4 more operator deaths;
  leader left 7323878 → 7323370.
- matches solo-FUNNY-2 (boss_5 Final Assault, lost at 8 rounds): pool left 94860 → 94412, kills 143 → 144.
- matches solo-NORMAL-1 (m03, hidden boss_8 胄, act1autochess_h08_01_s): the Hidden Core goes from cleared to failed
  (hiddenCleared true → false, team LP 26 → 0, roundsPassed 15 → 14, pool left 0 → 99894; victory stays true — the
  Final Assault was won). The fight is identical until 105 s, when the third vtsk escort reaches the corner portal
  [1,3]: before, it leaked there (27 → 26 LP) and the leader died at 214 s. Now it comes out of [5,10], walks through
  the team's line to the blue door [2,2] and leaks at 170 s; meanwhile only 0–2 of the 8 operators stand (2–4 before),
  the leader stalls near 120000 HP, the fight passes the 150 real-second mark (300 game s) and the overtime drain (1 LP
  per real second) plus two drone leaks at the door take the last 25 LP at 348 s with 99894 HP left.
- matches solo-HARD-1 (m03, hidden boss_8): still failed at 0 LP after 14 rounds; pool left 3046117 → 2839368, kills
  419 → 422.
- matches solo-HARD-9-boosted (hidden boss_10 管): still cleared; team LP 383 → 361 — the 管 echoes (acdums) leaked
  7 times at the portal before and once at the door now, but the longer fight pays 37 overtime LP instead of 9.
- matches coop2-ABYSS-10-boosted (hidden boss_9 铳): from portalAppear alone (the remaining-distance change above);
  still cleared at 800 LP, the two seats' leader damage shifts (6609998 / 7282442 → 7523075 / 6369365) and their
  titles swap (坚若磐石 / 卫戍之星 → 卫戍之星 / 不朽盟约).
- matches coop2-NORMAL-14-standins (boss_5 Final Assault, lost at 13 rounds): pool left 107915 → 97588.

Tests: test/sim/portal-appear.test.js (new, 9; 7 fail on the parent: the APPEAR insertion, the four real routes,
the two route-end portals).
This commit is contained in:
2321Robin authored and sganggs committed 2026-10-08 19:00:50 +08:00
1 parent ae22335cfe
commit a87cc1e9fd
6 files changed
+414 -233

No files matched your search

+8 -1
View File
@@ -187,7 +187,14 @@ bounty?:{coins, ownerPlayerId}, tag?:'boss'|'part'|'escort'|'bounty', ownerPlaye
`RouteSpec` accepts data/waves.json routes (`{motion, start, end, checkpoints:[[r,c]…], steps:[{t:'move',p},{t:'wait',s},{t:'disappear'},{t:'appear',p}]}`)
and research routes (`{m, s, e, cp:[['MOVE',r,c]…]}`). `spawnsFromTemplate(waveEntry, {mods})` (simdata.js) converts a
template into `{ routes, spawns, maxPlayTime, overrides, extraRoutes }` (non-spawn `action` entries are skipped; `unharmful`
and `tag:'part'` spawns don't count in `total`).
and `tag:'part'` spawns don't count in `total`). The boss templates' 传送门 reads as "reappear on the far side" (GitHub
#336, PR #337): four official routes write the crossing as `disappear → wait → move` to the exit with no `appear` (their
twins spell the `appear` out), so normalizeRoute re-inserts the exit `appear` ahead of that move — otherwise the enemy
walks the rest of its route hidden and leaks unseen (test/sim/portal-appear.test.js). A route that ENDS on an entrance
(`tile_telin`; the boss / Hidden Core circuits end on [1,3] / [1,17]) does not leak there: the enemy vanishes, comes
out of the far exit (`tile_telout`; both entrances feed [5,10], the pairing of every explicit `disappear`/`appear` pair
of the data) and walks on to the blue door on the entrance's side, where it leaks (ai.js portalPickup; [ASSUMED] the
pairing and no wait inside this portal).
A `bounty` pays `coins` once, when the enemy really dies (not a knock-out it survives; a leak pays nothing), to
`Battle._bountyPayee`: the player of the operator or summon that dealt the blow, if that player is in the battle; any
+44 -6
View File
@@ -28,10 +28,11 @@
// (PRTS 状态机: an enemy's COMBAT state ends with its attack, not with its blocker); the candidates pass the
// enemy's own rule (`e.profile.canTarget`) and are ordered
// blocker → taunt → latest deployed (targeting.js sortAllyTargets). An enemy's damage type is its data's unless content
// arms it (`e.profile.dmgType`: 转译基底's forms, whose data never attacks). Reaching the final leg's end = leak. A `fear` (恐惧) status suspends the route: the
// enemy runs between random checkpoints away from the fear's source (fear.js moveFeared; a self-inflicted fear
// flutters inside its own tile); an `attract` (诱导) status walks it to the status point instead (moveAttracted);
// both re-plan the route when released (恐惧 outranks 诱导).
// arms it (`e.profile.dmgType`: 转译基底's forms, whose data never attacks). Reaching the final leg's end = leak — on a
// portal entrance it is a teleport to the far exit and a walk to that side's blue door instead (portalPickup). A `fear`
// (恐惧) status suspends the route: the enemy runs between random checkpoints away from the fear's source (fear.js
// moveFeared; a self-inflicted fear flutters inside its own tile); an `attract` (诱导) status walks it to the status
// point instead (moveAttracted); both re-plan the route when released (恐惧 outranks 诱导).
import { ATTACK_PAUSE, ALLY_COLLIDER_RADIUS, MOVE_SCALE, PROJECTILE_SPEEDS, PROJECTILE_SPEED, BOOMERANG_RETURN_SPEED, COLS, CHAIN_RADIUS } from './constants.js';
import { sortEnemyTargets, sortAllyTargets, canTargetEnemy, canTargetAlly, tileKeyOf } from './targeting.js';
@@ -633,7 +634,10 @@ function advanceRoute(b, e, dt, R, standing = false) {
let guard = 16;
while (budget > 1e-9 && guard-- > 0 && e.alive) {
const leg = R.legs[R.legIdx];
if (!leg) { b.leak(e); return; }
if (!leg) {
if (!portalPickup(b, e)) { b.leak(e); return; }
continue;
}
if (leg.t === 'wait') {
if (R.waitLeft == null) R.waitLeft = leg.time;
const use = Math.min(budget, R.waitLeft);
@@ -682,13 +686,47 @@ function advanceRoute(b, e, dt, R, standing = false) {
}
budget = dist / speed;
if (R.pts && R.ptIdx >= R.pts.length) {
if (leg.final) { b.leak(e); return; }
if (leg.final) {
if (!portalPickup(b, e)) { b.leak(e); return; }
}
R.legIdx++;
R.pts = null;
}
}
}
/**
* Boss-field portal pickup (tile_telin / tile_telout; GitHub #336, PR #337 by @2321Robin, both with a recording of the
* official game): a route that ENDS on a portal entrance does not leak there — the enemy is teleported out of the far
* exit and walks on to the blue door on the entrance's side, where it leaks. The boss / Hidden Core circuits end on
* an entrance ([1,3] / [1,17]; 137 routes of data/waves.json); their mid-route crossings are the routes' own DISAPPEAR /
* WAIT / APPEAR steps, every MOVE onto an entrance being followed by a DISAPPEAR, so only the route's end needs this.
* Appends vanish → reappear → walk-to-door legs to the live route and returns true (false: not on an entrance, or no
* exit in the field). The exit is the telout farthest from the entrance, the door the end tile nearest to it: every
* explicit pair of the data (95, routes and extra routes) reads [1,3] / [1,17] → [5,10] — the farther of the two
* telouts [5,10] / [2,10] of the battle stages — and the doors [2,2] / [2,18] stand beside the entrances.
* [ASSUMED] the pairing (no tile carries a link) and no wait inside this portal (the explicit crossings write their
* own: 3 s in 85 of the 95, 5 s in 9, 1 s in 1).
*/
function portalPickup(b, e) {
const r = Math.round(e.y), c = Math.round(e.x);
if (!b.grid.inBounds(r, c) || b.grid.tile(r, c).special !== 'telin') return false;
const outs = b.grid.specialTiles('telout');
if (!outs.length) return false;
const dist = (p) => hypot(p[0] - r, p[1] - c);
const out = outs.reduce((a, x) => (dist(x) > dist(a) ? x : a));
const R = e.route;
R.legs.splice(R.legIdx + 1, 0, { t: 'disappear' }, { t: 'appear', r: out[0], c: out[1] });
const ends = b.grid.specialTiles('end');
if (ends.length) {
const door = ends.reduce((a, x) => (dist(x) < dist(a) ? x : a));
R.legs.push({ t: 'move', r: door[0], c: door[1], final: true });
}
R.pts = null;
R.tailVersion = -1; // the appended tail invalidates the cached remaining-distance suffixes
return true;
}
/**
* How long an enemy stands for one attack: an unblocked ranged enemy for its whole clip (GitHub #58 — the owner's
* decision of 2026-10-04 from first-hand memory of the official game: a ranged enemy stops for each attack's animation
+21
View File
@@ -394,6 +394,7 @@ export function normalizeRoute(r) {
const t = String(st.t ?? st.type ?? 'move').toUpperCase();
cps.push({ type: normCpType(t), pos: pairOf(st.p ?? st.pos) ?? [0, 0], time: num(st.s ?? st.time, 0) });
}
portalAppear(cps);
return { motion, start, end, checkpoints: cps };
}
for (const cp of r.checkpoints ?? r.cp ?? []) {
@@ -406,9 +407,29 @@ export function normalizeRoute(r) {
cps.push({ type: normCpType(cp.type), pos: pairOf(cp.pos ?? cp.position ?? [cp.row, cp.col]) ?? [0, 0], time: num(cp.time ?? cp.t, 0) });
}
}
portalAppear(cps);
return { motion, start, end, checkpoints: cps };
}
/**
* The boss / Hidden Core templates' 传送门 (GitHub #336, PR #337 by @2321Robin): the twin routes spell a crossing as
* DISAPPEAR → WAIT → APPEAR[exit], but four official routes leave the APPEAR out and go straight to MOVE-to-the-exit
* (act1autochess_h07_02 #4, act1autochess_h08_02 #5 / #9, act2autochess_h07_05 #6; the level files themselves have no
* APPEAR_AT_POS there). Taken literally, such a route walks the enemy's whole remaining run hidden (untargetable,
* unblockable) and it leaks unseen — the crossing must read "reappear on the far side". Re-insert the exit APPEAR
* ahead of that MOVE, at the MOVE's own target, where the twins appear ([5,10]; the leftover MOVE becomes a
* zero-length hop, and the hop no longer counts as walking distance for the targeting order). A DISAPPEAR followed by
* an APPEAR, or by no MOVE, stays as it is; idempotent.
*/
function portalAppear(cps) {
for (let i = 0; i < cps.length; i++) {
if (cps[i].type !== 'DISAPPEAR') continue;
let j = i + 1;
while (j < cps.length && cps[j].type === 'WAIT') j++;
if (cps[j] && cps[j].type === 'MOVE') cps.splice(j, 0, { type: 'APPEAR', pos: cps[j].pos.slice(), time: 0 });
}
}
function normCpType(t) {
const s = String(t ?? 'MOVE').toUpperCase();
if (s.includes('DISAPPEAR')) return 'DISAPPEAR';
+209 -208
View File
@@ -227,27 +227,27 @@
"killed": 5,
"total": 7,
"unspawned": 0,
"bossHpLeft": 2761255,
"bossHpLeft": 2763024,
"rngDraws": 127,
"errors": {"count":0,"kinds":[]},
"players": {"p1":{"killed":5,"total":7,"perfect":false,"leaks":2,"leaksUncounted":0,"coins":0,"dmg":401784,"bossDmg":232315,"heal":40581,"deaths":1,"layerGains":{}}},
"players": {"p1":{"killed":5,"total":7,"perfect":false,"leaks":2,"leaksUncounted":0,"coins":0,"dmg":453723,"bossDmg":230580,"heal":40581,"deaths":1,"layerGains":{}}},
"units": [
["p1",1,"op","chess_char_4_17_b",1,"uniequip_002_hsguma",2383.55,1,18,0,4821,19443,15985,82,0],
["p1",1,"op","chess_char_4_17_b",1,"uniequip_002_hsguma",2383.55,1,18,0,5388,19443,15985,82,0],
["p1",2,"op","chess_char_4_18_b",1,"uniequip_002_mudrok",6104,1,4,0,86351,0,0,79,4],
["p1",3,"op","chess_char_4_23_b",2,"uniequip_002_gvial2",2811,1,6,0,77745,6115,3711,91,4],
["p1",4,"op","chess_char_4_19_b",2,"uniequip_002_flamtl",2118,1,7,1,23391,7108,1936,80,7],
["p1",5,"op","chess_char_4_22_b",2,"uniequip_002_svrash",2569,1,8,4,131322,8759,0,69,2],
["p1",6,"op","chess_char_4_20_b",2,"uniequip_002_fartth",1419,1,9,0,16118,0,0,11,0],
["p1",5,"op","chess_char_4_22_b",2,"uniequip_002_svrash",2569,1,8,4,162219,8759,0,75,3],
["p1",6,"op","chess_char_4_20_b",2,"uniequip_002_fartth",1419,1,9,0,23153,0,0,12,2],
["p1",7,"op","chess_char_4_21_b",1,"uniequip_002_plosis",1584,1,10,0,0,1263,566,2,1],
["p1",8,"op","chess_char_4_24_b",1,"uniequip_002_billro",2178,1,1,0,62036,0,1129,85,6],
["p1",8,"op","chess_char_4_24_b",1,"uniequip_002_billro",2178,1,1,0,75476,0,1129,89,6],
["p1",9,"op","chess_char_4_25_b",2,"uniequip_002_cetsyr",695.86,1,3,0,0,1448,1057,0,3],
["p1",10,"op","chess_char_4_26_b",0,"uniequip_002_bldsk",1522,1,5,0,0,0,16195,34,3]
],
"enemies": {"enemy_1249_lysdb_2":[5,5,0,8138,107495],"enemy_1430_lrrook":[2,0,2,0,66943],"enemy_9017_achunt":[1,0,0,23716,238745]},
"hooks": [1,19,6000,580,580,1299,1898,5497,6,8,30,29,0,13846,99,5,8,2,1,8,0,6,2],
"events": {"atk":615,"deploy":11,"die":6,"dmg":1888,"engage":7,"fx":277,"heal":37,"leak":2,"skill":62,"spawn":18,"status":481},
"fx": {"bandage":3,"block":9,"burst":6,"charge":7,"dodge":2,"flame":7,"garrisonGrant":1,"healField":1,"jungleSoul":4,"mote":102,"redistribute":45,"reweave":3,"riposte":2,"rockslide":4,"sandChains":5,"sandChainsCharged":1,"shieldBreak":15,"slash":32,"spGift":5,"thorns":21,"truesilver":2},
"snaps": "a42f06d2 4a40e022 e95a4901 abb693b9 1c238b4b afb89449 d6c6b3df c846d6b3 fa04e7ce c4d85f2e 4a6790c9 effed23a 72e8e203 8146bf98 e8dfb61c 69d1b960 6d949949 0310d38f a1429900 b8610bee"
"enemies": {"enemy_1249_lysdb_2":[5,5,0,8138,107495],"enemy_1430_lrrook":[2,0,2,0,120652],"enemy_9017_achunt":[1,0,0,23716,236976]},
"hooks": [1,19,6000,591,591,1390,1989,5497,6,8,33,32,0,15126,113,5,8,2,1,8,0,6,2],
"events": {"atk":642,"deploy":11,"die":6,"dmg":1979,"engage":7,"fx":290,"heal":37,"leak":2,"skill":68,"spawn":18,"status":509},
"fx": {"appear":2,"bandage":3,"block":9,"burst":6,"charge":7,"disappear":2,"dodge":2,"featherArrow":2,"flame":7,"garrisonGrant":1,"healField":1,"jungleSoul":4,"mote":102,"redistribute":45,"reweave":3,"riposte":2,"rockslide":4,"sandChains":5,"sandChainsCharged":1,"shieldBreak":15,"slash":38,"spGift":5,"thorns":21,"truesilver":3},
"snaps": "a42f06d2 4a40e022 e95a4901 abb693b9 1c238b4b afb89449 d6c6b3df c846d6b3 f0cff710 d31f361e 6222a056 6c7abdc9 c7c74721 0757ffc7 91acf075 8e9b73d0 f30d9021 dae03804 f0c86afa 248b5f7a"
},
"boss-boss_3-pair": {
"about": "假想敌:管 pair pool 4000000: chess_char_6_03_b chess_char_6_06_b chess_char_6_07_b chess_char_6_01_b chess_char_6_02_b chess_char_6_04_b chess_char_6_05_b chess_char_6_08_b chess_char_6_09_b chess_char_6_11_b token_10017_skadi2_dedant | chess_char_6_15_b chess_char_6_19_b chess_char_5_01_b chess_char_6_17_b chess_char_6_12_b chess_char_6_13_b chess_char_6_14_b chess_char_6_16_b chess_char_6_18_b chess_char_6_20_b",
@@ -516,29 +516,29 @@
"killed": 5,
"total": 7,
"unspawned": 0,
"bossHpLeft": 3759559,
"rngDraws": 84,
"bossHpLeft": 3759921,
"rngDraws": 90,
"errors": {"count":0,"kinds":[]},
"players": {"p1":{"killed":5,"total":7,"perfect":false,"leaks":2,"leaksUncounted":0,"coins":0,"dmg":713408,"bossDmg":440441,"heal":95170,"deaths":6,"layerGains":{}}},
"players": {"p1":{"killed":5,"total":7,"perfect":false,"leaks":2,"leaksUncounted":0,"coins":0,"dmg":732206,"bossDmg":440079,"heal":93600,"deaths":7,"layerGains":{}}},
"units": [
["p1",1,"op","chess_char_4_17_b",1,"uniequip_002_hsguma",2497.84,1,23,2,19548,11293,12704,21,0],
["p1",1,"op","chess_char_4_17_b",1,"uniequip_002_hsguma",2710.93,1,23,2,19548,12098,13170,21,0],
["p1",2,"op","chess_char_4_18_b",1,"uniequip_002_mudrok",5981.62,1,22,0,42568,20827,14636,11,5],
["p1",3,"op","chess_char_4_23_b",2,"uniequip_002_gvial2",2811,1,21,3,202794,41516,12031,43,1],
["p1",4,"op","chess_char_4_19_b",2,"uniequip_002_flamtl",3350.14,1,9,0,0,7920,0,0,0],
["p1",5,"op","chess_char_4_22_b",2,"uniequip_002_svrash",2541.58,1,10,0,162116,8875,0,135,3],
["p1",6,"op","chess_char_4_20_b",2,"uniequip_002_fartth",0,0,24,0,234028,2838,0,104,5],
["p1",7,"op","chess_char_4_21_b",1,"uniequip_002_plosis",1584,1,11,0,0,4444,24160,29,2],
["p1",8,"op","chess_char_4_24_b",1,"uniequip_002_billro",2178,1,25,0,52353,7314,487,76,5],
["p1",9,"op","chess_char_4_25_b",2,"uniequip_002_cetsyr",1394.71,1,3,0,0,5589,5880,0,3],
["p1",10,"op","chess_char_4_26_b",0,"uniequip_002_bldsk",1522,1,5,0,0,4444,25271,28,4],
["p1",3,"op","chess_char_4_23_b",2,"uniequip_002_gvial2",2811,1,21,3,202794,41516,12403,43,1],
["p1",4,"op","chess_char_4_19_b",2,"uniequip_002_flamtl",2350.14,1,9,0,2748,11517,0,5,1],
["p1",5,"op","chess_char_4_22_b",2,"uniequip_002_svrash",2061.88,1,24,0,175575,6029,0,120,3],
["p1",6,"op","chess_char_4_20_b",2,"uniequip_002_fartth",0,0,25,0,234028,2838,0,104,5],
["p1",7,"op","chess_char_4_21_b",1,"uniequip_002_plosis",1545.34,1,11,0,0,4444,19915,29,2],
["p1",8,"op","chess_char_4_24_b",1,"uniequip_002_billro",1748.63,1,26,0,54944,7314,487,76,5],
["p1",9,"op","chess_char_4_25_b",2,"uniequip_002_cetsyr",1394.71,1,3,0,0,6735,7448,0,3],
["p1",10,"op","chess_char_4_26_b",0,"uniequip_002_bldsk",1522,1,5,0,0,4444,25541,27,5],
["-","~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]
],
"enemies": {"enemy_1010_demon_2":[2,2,0,5940,107495],"enemy_1438_dspred":[5,3,2,31950,165472],"enemy_1521_dslily":[1,0,0,71001,440441]},
"hooks": [1,25,6000,565,565,958,1133,7303,11,13,28,28,0,13157,125,16,8,2,1,16,0,29,1],
"events": {"atk":770,"deploy":15,"die":11,"dmg":1115,"engage":6,"fx":335,"heal":105,"leak":2,"skill":59,"spawn":20,"status":479},
"fx": {"bandage":4,"block":15,"burst":29,"camouflage":1,"dodge":1,"featherArrow":5,"garrisonGrant":1,"grow":1,"healField":2,"jungleSoul":1,"mote":61,"redistribute":45,"reweave":3,"rockfall":18,"rockslide":5,"sandChains":5,"shieldBreak":18,"slash":53,"spGift":4,"tentacle":6,"thorns":48,"tide":5,"truesilver":3,"undying":1},
"snaps": "b3cecd10 d3d68301 c10d8554 c91066bb 2ac0bbdd cb65c8b1 e357c87a 1cfd4db1 1a8bd8d8 e639cb94 69f98f4a 92de5c02 51bb18c2 a8b02c45 54b09843 f60538cb 94407072 8c567dae 4c15135e a957f119"
"enemies": {"enemy_1010_demon_2":[2,2,0,5940,107495],"enemy_1438_dspred":[5,3,2,36058,184632],"enemy_1521_dslily":[1,0,0,69595,440079]},
"hooks": [1,26,6000,558,558,958,1130,8107,12,14,30,30,0,13499,128,20,8,2,1,17,0,28,3],
"events": {"atk":764,"deploy":16,"die":12,"dmg":1112,"engage":7,"fx":339,"heal":93,"leak":2,"skill":63,"spawn":20,"status":483},
"fx": {"appear":2,"bandage":5,"block":15,"burst":28,"camouflage":1,"disappear":2,"dodge":3,"featherArrow":5,"flame":1,"garrisonGrant":1,"grow":1,"healField":2,"jungleSoul":1,"mote":61,"redistribute":45,"reweave":3,"riposte":2,"rockfall":18,"rockslide":5,"sandChains":5,"shieldBreak":18,"slash":48,"spGift":4,"tentacle":6,"thorns":48,"tide":5,"truesilver":3,"undying":1},
"snaps": "b3cecd10 d3d68301 c10d8554 c91066bb 2ac0bbdd cb65c8b1 e357c87a 1cfd4db1 fbb2d966 235fafe1 061ad690 dabccf6c b8e37a8a 8618ace2 44fc44ec 4fbab63c 309205ea 3215de21 1ce4f962 d787882b"
},
"boss-boss_5-pair": {
"about": "卢西恩,“猩红血钻” pair pool 1560000: chess_char_6_03_b chess_char_6_06_b chess_char_6_07_b chess_char_6_01_b chess_char_6_02_b chess_char_6_04_b chess_char_6_05_b chess_char_6_08_b chess_char_6_09_b chess_char_6_11_b token_10017_skadi2_dedant token_10030_mlyss_wtrman | chess_char_6_15_b chess_char_6_19_b chess_char_5_01_b chess_char_6_17_b chess_char_6_12_b chess_char_6_13_b chess_char_6_14_b chess_char_6_16_b chess_char_6_18_b chess_char_6_20_b",
@@ -703,35 +703,35 @@
"time": 200,
"ticks": 6000,
"reason": "forced",
"killed": 4,
"killed": 6,
"total": 6,
"unspawned": 0,
"bossHpLeft": 7017881,
"rngDraws": 570,
"bossHpLeft": 6972383,
"rngDraws": 697,
"errors": {"count":0,"kinds":[]},
"players": {
"p1": {"killed":4,"total":6,"perfect":false,"leaks":1,"leaksUncounted":0,"coins":0,"dmg":869760,"bossDmg":436648,"heal":2876,"deaths":5,"layerGains":{}},
"p2": {"killed":0,"total":0,"perfect":false,"leaks":1,"leaksUncounted":0,"coins":0,"dmg":1033990,"bossDmg":505471,"heal":580,"deaths":19,"layerGains":{}}
"p1": {"killed":6,"total":6,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":1061526,"bossDmg":492176,"heal":2876,"deaths":5,"layerGains":{}},
"p2": {"killed":0,"total":0,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":1196635,"bossDmg":495441,"heal":580,"deaths":19,"layerGains":{}}
},
"units": [
["p1",1,"op","chess_char_5_19_b",2,"uniequip_002_mlynar",3907,1,3,1,147578,0,0,30,2],
["p1",1,"op","chess_char_5_19_b",2,"uniequip_002_mlynar",3907,1,3,1,211527,0,0,46,3],
["p1",2,"op","chess_char_4_01_b",2,"uniequip_002_rmixer",3537,1,1,0,0,0,0,0,0],
["p1",3,"op","chess_char_5_14_b",1,"none",2174,1,5,1,25423,0,0,0,10],
["p1",3,"op","chess_char_5_14_b",1,"none",2174,1,5,1,39624,0,0,0,16],
["p1",4,"op","chess_char_5_17_b",1,"uniequip_002_f12yin",4654.6,1,11,1,4568,0,0,6,1],
["p1",5,"op","chess_char_5_15_b",1,"uniequip_002_thorn2",1170,1,7,1,303339,0,551,64,13],
["p1",6,"op","chess_char_5_20_b",2,"uniequip_002_aglina",1382,1,13,0,179149,0,0,76,6],
["p1",7,"op","chess_char_5_21_b",1,"uniequip_002_sntlla",1629,1,66,0,19506,1629,0,43,2],
["p1",8,"op","chess_char_5_22_b",1,"uniequip_002_nymph",1611,1,67,0,135206,3222,0,46,14],
["p1",9,"op","chess_char_5_23_b",1,"uniequip_002_reckpr",1610,1,65,0,2158,3220,2325,3,1],
["p1",10,"op","chess_char_4_02_b",2,"uniequip_002_mostma",1695,1,9,0,52833,0,0,38,2],
["p1",5,"op","chess_char_5_15_b",1,"uniequip_002_thorn2",1170,1,7,1,373439,0,551,84,16],
["p1",6,"op","chess_char_5_20_b",2,"uniequip_002_aglina",1382,1,13,0,197565,0,0,73,6],
["p1",7,"op","chess_char_5_21_b",1,"uniequip_002_sntlla",1629,1,66,0,24193,1629,0,43,2],
["p1",8,"op","chess_char_5_22_b",1,"uniequip_002_nymph",1611,1,67,0,140802,3222,0,46,15],
["p1",9,"op","chess_char_5_23_b",1,"uniequip_002_reckpr",1610,1,65,0,4316,3220,2325,3,1],
["p1",10,"op","chess_char_4_02_b",2,"uniequip_002_mostma",1695,1,9,1,65490,0,0,48,3],
["p2",11,"op","chess_char_4_11_b",1,"uniequip_002_cathy",2644,1,49,0,4798,9646,260,10,1],
["p2",12,"op","chess_char_4_04_b",1,"uniequip_002_ines",190.91,1,63,0,118842,15240,280,209,6],
["p2",12,"op","chess_char_4_04_b",1,"uniequip_002_ines",190.91,1,63,0,134122,15240,280,209,6],
["p2",13,"op","chess_char_4_07_b",1,"uniequip_002_bpipe",2383,1,6,0,0,0,0,0,0],
["p2",14,"op","chess_char_4_16_b",2,"uniequip_002_texas2",0,0,61,0,58463,13682,40,128,7],
["p2",15,"op","chess_char_4_09_b",1,"uniequip_002_mizuki",2777.6,1,14,0,205534,0,0,117,6],
["p2",16,"op","chess_char_4_06_b",1,"uniequip_002_kroos2",1561,1,8,0,493990,0,0,140,2],
["p2",14,"op","chess_char_4_16_b",2,"uniequip_002_texas2",0,0,61,0,60730,13682,40,128,7],
["p2",15,"op","chess_char_4_09_b",1,"uniequip_002_mizuki",2777.6,1,14,0,200340,0,0,114,6],
["p2",16,"op","chess_char_4_06_b",1,"uniequip_002_kroos2",1561,1,8,1,624669,0,0,180,3],
["p2",17,"op","chess_char_4_10_b",1,"uniequip_002_aroma",1664,1,12,0,0,0,0,0,0],
["p2",18,"op","chess_char_4_12_b",2,"uniequip_002_glady",2232,1,47,0,28737,2232,0,110,5],
["p2",18,"op","chess_char_4_12_b",2,"uniequip_002_glady",2232,1,47,0,48350,2232,0,106,5],
["p2",19,"op","chess_char_4_13_b",1,"uniequip_002_gnosis",0,0,58,0,47100,5967,0,39,9],
["p2",20,"op","chess_char_4_14_b",1,"uniequip_002_lionhd",0,0,59,0,76526,4878,0,22,4],
["p2",21,"token","token_10041_cathy_catsld",null,null,100,1,21,0,0,0,0,0,null],
@@ -739,50 +739,50 @@
],
"enemies": {
"enemy_10028_vtswd": [3,3,0,0,0],
"enemy_10029_vtshld": [5,5,0,0,0],
"enemy_10030_vtwand": [5,5,0,0,0],
"enemy_10085_hllevi_2": [2,0,2,0,761019],
"enemy_10029_vtshld": [6,6,0,0,0],
"enemy_10030_vtwand": [4,4,0,0,0],
"enemy_10085_hllevi_2": [2,2,0,0,1069932],
"enemy_1010_demon": [4,4,0,12402,200612],
"enemy_9032_aclionk": [1,0,0,47314,942119]
"enemy_9032_aclionk": [1,0,0,47314,987617]
},
"hooks": [1,65,6000,1074,1088,2031,2044,359,41,45,91,88,0,30474,660,8,20,2,1,29,0,2,0],
"events": {"atk":1139,"deploy":45,"die":43,"dmg":1988,"engage":15,"fx":618,"heal":11,"leak":2,"skill":179,"spawn":42,"status":942},
"hooks": [1,65,6000,1150,1164,2276,2290,359,43,45,104,99,0,32169,744,8,20,0,1,31,0,2,0],
"events": {"atk":1233,"deploy":45,"die":45,"dmg":2222,"engage":15,"fx":730,"heal":11,"skill":203,"spawn":42,"status":1113},
"fx": {
"aoe": 30,
"appear": 4,
"aoe": 44,
"appear": 6,
"blink": 2,
"burst": 2,
"crit": 81,
"crit": 108,
"dilemma": 6,
"disappear": 4,
"disappear": 6,
"displace": 19,
"equip": 18,
"equip": 17,
"explosion": 4,
"frostNova": 9,
"garrisonGrant": 1,
"iceSpike": 33,
"overclock": 1,
"pull": 4,
"quadShot": 2,
"quadShot": 3,
"revive": 2,
"ripple": 18,
"ripple": 25,
"sentry": 4,
"shadowWeave": 4,
"shadowWeave": 5,
"shield": 1,
"soul": 2,
"sp": 13,
"sp": 16,
"stealth": 6,
"sword": 1,
"swordRain": 25,
"swordRain": 26,
"swordStorm": 7,
"telegraph": 19,
"telegraph": 21,
"tornado": 5,
"tornadoPulse": 20,
"vest": 5,
"vest": 6,
"weightless": 6,
"zone": 260
"zone": 312
},
"snaps": "8ef2441b ee06d28e 0f318fc5 8e4156fd 466da928 f03b4c62 86a1deba 85583d64 215fecf5 ccd39d46 4a08d997 af901ca4 08ece609 76458391 47fbc660 009a9bbe 48624b1a 42116d05 63ab6257 f103fa00"
"snaps": "8ef2441b ee06d28e 0f318fc5 8e4156fd 466da928 f03b4c62 86a1deba 85583d64 215fecf5 ccd39d46 4a08d997 af901ca4 08ece609 e3643313 6f0df0ee 63a32534 86450a7b fdbbbdc8 f239ab01 bac8ff90"
},
"boss-boss_6-solo": {
"about": "阿利斯泰尔,帝国余晖 solo pool 3980000: chess_char_4_17_b chess_char_4_18_b chess_char_4_23_b chess_char_4_19_b chess_char_4_22_b chess_char_4_20_b chess_char_4_21_b chess_char_4_24_b chess_char_4_25_b chess_char_4_26_b",
@@ -796,24 +796,24 @@
"time": 200,
"ticks": 6000,
"reason": "forced",
"killed": 5,
"killed": 8,
"total": 10,
"unspawned": 0,
"bossHpLeft": 3874806,
"rngDraws": 45,
"bossHpLeft": 3904791,
"rngDraws": 52,
"errors": {"count":0,"kinds":[]},
"players": {"p1":{"killed":5,"total":10,"perfect":false,"leaks":5,"leaksUncounted":0,"coins":0,"dmg":152625,"bossDmg":105194,"heal":1783,"deaths":16,"layerGains":{}}},
"players": {"p1":{"killed":8,"total":10,"perfect":false,"leaks":2,"leaksUncounted":0,"coins":0,"dmg":195265,"bossDmg":75209,"heal":6651,"deaths":17,"layerGains":{}}},
"units": [
["p1",1,"op","chess_char_4_17_b",1,"uniequip_002_hsguma",3513,1,10,2,8,0,0,8,0],
["p1",2,"op","chess_char_4_18_b",1,"uniequip_002_mudrok",6104,1,11,0,6,0,0,6,1],
["p1",3,"op","chess_char_4_23_b",2,"uniequip_002_gvial2",2811,1,12,1,8984,35,35,15,2],
["p1",4,"op","chess_char_4_19_b",2,"uniequip_002_flamtl",2118,1,48,0,1033,8472,0,40,3],
["p1",5,"op","chess_char_4_22_b",2,"uniequip_002_svrash",0,0,46,0,52228,18906,1436,38,4],
["p1",6,"op","chess_char_4_20_b",2,"uniequip_002_fartth",1419,1,7,2,88481,0,0,50,7],
["p1",1,"op","chess_char_4_17_b",1,"uniequip_002_hsguma",3513,1,10,3,9,0,0,9,0],
["p1",2,"op","chess_char_4_18_b",1,"uniequip_002_mudrok",6104,1,11,0,9,0,0,9,1],
["p1",3,"op","chess_char_4_23_b",2,"uniequip_002_gvial2",2811,1,12,2,12627,35,847,19,2],
["p1",4,"op","chess_char_4_19_b",2,"uniequip_002_flamtl",0,0,48,0,465,10590,0,34,3],
["p1",5,"op","chess_char_4_22_b",2,"uniequip_002_svrash",0,0,49,0,70149,22768,931,30,5],
["p1",6,"op","chess_char_4_20_b",2,"uniequip_002_fartth",1419,1,7,2,58468,0,0,52,7],
["p1",7,"op","chess_char_4_21_b",1,"uniequip_002_plosis",2772,1,8,0,0,0,0,0,0],
["p1",8,"op","chess_char_4_24_b",1,"uniequip_002_billro",2178,1,49,0,1884,8712,0,10,3],
["p1",9,"op","chess_char_4_25_b",2,"uniequip_002_cetsyr",0,0,44,0,0,6995,311,0,0],
["p1",10,"op","chess_char_4_26_b",0,"uniequip_002_bldsk",1522,1,9,0,0,0,0,0,0],
["p1",8,"op","chess_char_4_24_b",1,"uniequip_002_billro",0,0,45,1,53539,9209,114,41,3],
["p1",9,"op","chess_char_4_25_b",2,"uniequip_002_cetsyr",0,0,46,0,0,10071,1886,0,1],
["p1",10,"op","chess_char_4_26_b",0,"uniequip_002_bldsk",1522,1,9,0,0,0,2872,4,1],
["-","~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],
["-","~3","device","trap_1105_accrate",null,null,100,1,3,0,0,0,0,0,null],
@@ -822,18 +822,18 @@
["-","~6","device","trap_1105_accrate",null,null,100,1,6,0,0,0,0,0,null]
],
"enemies": {
"enemy_10028_vtswd": [4,4,0,0,0],
"enemy_10029_vtshld": [3,3,0,0,0],
"enemy_10030_vtwand": [1,1,0,0,0],
"enemy_10085_hllevi_2": [2,0,2,0,29468],
"enemy_10028_vtswd": [3,3,0,0,0],
"enemy_10029_vtshld": [5,5,0,0,0],
"enemy_10030_vtwand": [2,2,0,0,0],
"enemy_10085_hllevi_2": [2,0,2,0,102074],
"enemy_1197_sfshu": [2,2,0,17,17916],
"enemy_1198_msfshu": [6,3,3,0,47],
"enemy_9032_aclionk": [1,0,0,43085,105194]
"enemy_1198_msfshu": [6,6,0,0,66],
"enemy_9032_aclionk": [1,0,0,52638,75209]
},
"hooks": [1,49,6000,179,179,275,472,1334,29,34,20,20,0,6463,12,1,19,5,1,21,0,0,3],
"events": {"atk":205,"deploy":24,"die":29,"dmg":201,"engage":7,"fx":91,"leak":5,"skill":42,"spawn":35,"status":73},
"fx": {"dodge":3,"equip":9,"featherArrow":7,"flame":3,"garrisonGrant":1,"jungleSoul":2,"mote":8,"riposte":3,"rockslide":1,"sandChains":3,"slash":29,"summon":2,"sword":3,"telegraph":10,"truesilver":4,"vest":3},
"snaps": "3e08ed3d 2a259699 77c4f1c2 a547c8e8 80cdbe94 5387ac7c ac8acb26 e405b502 b8cb4679 62dee17d 6a983199 49974232 ee10619f d218a36a 29eef739 77b2f124 b45c9755 95f6faee a7fcd01a edbf901f"
"hooks": [1,50,6000,211,211,362,559,1264,35,37,23,23,0,6727,100,1,21,2,1,25,0,0,3],
"events": {"atk":298,"deploy":23,"die":35,"dmg":273,"engage":7,"fx":104,"heal":5,"leak":2,"skill":48,"spawn":37,"status":274},
"fx": {"appear":4,"bandage":1,"disappear":4,"dodge":3,"equip":12,"featherArrow":7,"flame":3,"garrisonGrant":1,"jungleSoul":2,"mote":10,"redistribute":4,"reweave":1,"rockslide":1,"sandChains":3,"slash":19,"summon":2,"sword":3,"telegraph":14,"truesilver":5,"vest":5},
"snaps": "3e08ed3d 2a259699 77c4f1c2 f8300f5c 0da728a3 74bd5834 472e12a4 7db18cf8 403525d1 cc9436e7 8b639112 609ef73d 54e889e7 f8c0662d 8e3f01be 58e300b6 a655b3e3 6e779450 0f89e048 cb188754"
},
"boss-boss_7-pair": {
"about": "“萨米的意志” pair pool 4000000: chess_char_6_03_b chess_char_6_06_b chess_char_6_07_b chess_char_6_01_b chess_char_6_02_b chess_char_6_04_b chess_char_6_05_b chess_char_6_08_b chess_char_6_09_b chess_char_6_11_b token_10017_skadi2_dedant token_10030_mlyss_wtrman | chess_char_6_15_b chess_char_6_19_b chess_char_5_01_b chess_char_6_17_b chess_char_6_12_b chess_char_6_13_b chess_char_6_14_b chess_char_6_16_b chess_char_6_18_b chess_char_6_20_b",
@@ -964,7 +964,7 @@
"errors": {"count":0,"kinds":[]},
"players": {
"p1": {"killed":16,"total":18,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":2677042,"bossDmg":1550396,"heal":69312,"deaths":17,"layerGains":{}},
"p2": {"killed":0,"total":0,"perfect":false,"leaks":1,"leaksUncounted":0,"coins":0,"dmg":560253,"bossDmg":262771,"heal":9942,"deaths":25,"layerGains":{}}
"p2": {"killed":0,"total":0,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":560253,"bossDmg":262771,"heal":9942,"deaths":25,"layerGains":{}}
},
"units": [
["p1",1,"op","chess_char_5_19_b",2,"uniequip_002_mlynar",7814,1,90,1,335665,24097,655,20,3],
@@ -991,7 +991,7 @@
["p2",22,"token","token_10041_cathy_catsld",null,null,100,1,22,0,0,0,0,0,null]
],
"enemies": {
"enemy_10027_vtsk": [6,4,1,138057,1019681],
"enemy_10027_vtsk": [6,4,0,138057,1019681],
"enemy_1005_yokai": [4,4,0,0,10699],
"enemy_1229_darmy_2": [8,8,0,6104,294231],
"enemy_9013_acstmk_2": [1,0,0,63941,1814230],
@@ -999,11 +999,11 @@
"enemy_9015_acstmb": [3,2,0,9688,83569],
"enemy_9016_acstmr": [8,7,0,0,150]
},
"hooks": [1,92,6000,904,910,2960,3146,7480,72,75,107,101,6,25061,1027,17,36,1,1,61,0,5,9],
"events": {"atk":1083,"deploy":56,"die":74,"dmg":3143,"engage":18,"fx":651,"heal":136,"leak":1,"skill":208,"spawn":58,"status":990},
"hooks": [1,92,6000,904,910,2960,3146,7480,72,74,107,101,6,25061,1027,17,36,0,1,61,0,5,9],
"events": {"atk":1083,"deploy":56,"die":74,"dmg":3143,"engage":18,"fx":653,"heal":136,"skill":208,"spawn":58,"status":990},
"fx": {
"aoe": 42,
"appear": 7,
"appear": 8,
"beam": 48,
"blink": 16,
"burst": 5,
@@ -1011,7 +1011,7 @@
"counter": 6,
"crit": 59,
"dilemma": 3,
"disappear": 7,
"disappear": 8,
"displace": 1,
"dodge": 9,
"explode": 10,
@@ -1044,7 +1044,7 @@
"weightless": 3,
"zone": 180
},
"snaps": "cac31b2c d1e28667 87626189 11a56b43 640cf8cf 9a92be69 12784d9a 195ea951 99de9374 65451b7e 90846f89 9bcf64aa 0cf3dfb9 5737ca93 68f962d8 98c8303b e5af0a0e 3c947908 ce14aa80 61dc2e23"
"snaps": "cac31b2c d1e28667 87626189 11a56b43 640cf8cf 9a92be69 12784d9a 195ea951 99de9374 65451b7e 90846f89 9bcf64aa 0cf3dfb9 5737ca93 68f962d8 98c8303b e5af0a0e 3c947908 ce14aa80 4fc6091d"
},
"hidden-boss_8-solo": {
"about": "假想敌:胄 solo pool 7200000: chess_char_4_17_b chess_char_4_18_b chess_char_4_23_b chess_char_4_19_b chess_char_4_22_b chess_char_4_20_b chess_char_4_21_b chess_char_4_24_b chess_char_4_25_b chess_char_4_26_b",
@@ -1058,43 +1058,43 @@
"time": 200,
"ticks": 6000,
"reason": "forced",
"killed": 3,
"total": 13,
"killed": 8,
"total": 19,
"unspawned": 0,
"bossHpLeft": 6797394,
"rngDraws": 227,
"bossHpLeft": 7008424,
"rngDraws": 122,
"errors": {"count":0,"kinds":[]},
"players": {"p1":{"killed":3,"total":13,"perfect":false,"leaks":10,"leaksUncounted":0,"coins":0,"dmg":450453,"bossDmg":402606,"heal":28293,"deaths":23,"layerGains":{}}},
"players": {"p1":{"killed":8,"total":19,"perfect":false,"leaks":10,"leaksUncounted":0,"coins":0,"dmg":237408,"bossDmg":191576,"heal":29339,"deaths":24,"layerGains":{}}},
"units": [
["p1",1,"op","chess_char_4_17_b",1,"uniequip_002_hsguma",0,0,6,0,264,7875,0,4,0],
["p1",2,"op","chess_char_4_18_b",1,"uniequip_002_mudrok",0,0,32,1,13954,18678,6470,10,5],
["p1",3,"op","chess_char_4_23_b",2,"uniequip_002_gvial2",0,0,7,0,0,2811,0,0,0],
["p1",4,"op","chess_char_4_19_b",2,"uniequip_002_flamtl",0,0,53,0,0,10739,0,0,0],
["p1",5,"op","chess_char_4_22_b",2,"uniequip_002_svrash",2569,1,11,2,397515,0,140,154,3],
["p1",6,"op","chess_char_4_20_b",2,"uniequip_002_fartth",0,0,29,0,5558,2838,0,6,0],
["p1",7,"op","chess_char_4_21_b",1,"uniequip_002_plosis",0,0,55,0,0,8993,10992,37,6],
["p1",2,"op","chess_char_4_18_b",1,"uniequip_002_mudrok",0,0,35,3,12364,18678,6470,13,5],
["p1",3,"op","chess_char_4_23_b",2,"uniequip_002_gvial2",0,0,7,1,20,2811,0,12,1],
["p1",4,"op","chess_char_4_19_b",2,"uniequip_002_flamtl",0,0,59,1,99,11440,0,15,1],
["p1",5,"op","chess_char_4_22_b",2,"uniequip_002_svrash",0,0,11,3,189596,3399,140,65,1],
["p1",6,"op","chess_char_4_20_b",2,"uniequip_002_fartth",0,0,29,0,1903,2838,0,6,0],
["p1",7,"op","chess_char_4_21_b",1,"uniequip_002_plosis",0,0,60,0,0,8993,12523,39,6],
["p1",8,"op","chess_char_4_24_b",1,"uniequip_002_billro",0,0,13,0,33161,6074,939,21,1],
["p1",9,"op","chess_char_4_25_b",2,"uniequip_002_cetsyr",0,0,52,0,0,12130,3641,0,1],
["p1",10,"op","chess_char_4_26_b",0,"uniequip_002_bldsk",0,0,50,0,0,5960,6111,15,1],
["p1",9,"op","chess_char_4_25_b",2,"uniequip_002_cetsyr",0,0,57,0,0,11646,3157,0,1],
["p1",10,"op","chess_char_4_26_b",0,"uniequip_002_bldsk",0,0,55,0,0,5960,6111,15,1],
["-","~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],
["-","~3","device","trap_1105_accrate",null,null,100,1,3,0,0,0,0,0,null],
["-","~4","device","trap_1105_accrate",null,null,100,1,4,0,0,0,0,0,null]
],
"enemies": {
"enemy_10027_vtsk": [3,0,3,29903,18989],
"enemy_1005_yokai": [4,2,2,0,2867],
"enemy_1197_sfshu": [3,1,2,27,17625],
"enemy_1198_msfshu": [3,0,3,0,7],
"enemy_9013_acstmk_2": [1,0,0,37240,402606],
"enemy_9014_acstma": [3,2,0,0,7972],
"enemy_9015_acstmb": [4,3,0,6587,340],
"enemy_9016_acstmr": [7,6,0,0,47]
"enemy_10027_vtsk": [3,0,3,35787,17457],
"enemy_1005_yokai": [4,1,2,0,1433],
"enemy_1197_sfshu": [3,3,0,856,26874],
"enemy_1198_msfshu": [9,4,5,0,57],
"enemy_9013_acstmk_2": [1,0,0,34921,191576],
"enemy_9014_acstma": [4,3,0,0,0],
"enemy_9015_acstmb": [4,3,0,5808,0],
"enemy_9016_acstmr": [7,6,0,0,11]
},
"hooks": [1,56,6000,303,303,564,576,1204,37,47,17,17,0,5895,50,3,28,10,1,29,0,0,0],
"events": {"atk":360,"deploy":24,"die":37,"dmg":569,"engage":5,"fx":188,"heal":76,"leak":10,"skill":35,"spawn":42,"status":149},
"fx": {"bandage":1,"beam":34,"blink":11,"block":6,"charge":6,"explode":11,"garrisonGrant":1,"healField":6,"mote":4,"redistribute":5,"reweave":1,"rockslide":5,"sandChains":1,"shell":7,"shieldBreak":7,"slash":58,"spGift":2,"summon":5,"telegraph":3,"thorns":11,"truesilver":3},
"snaps": "cf292ec5 7036981d ce112fc3 25f0eb93 7e29d0f3 a4667973 30a2224e 8827f472 5ed6aeed 09c8a1e1 a4c3c74f 484ec38d cf5610d2 28371e20 bee6b488 d24d7a86 3e0c2516 47741f73 949b25ac 7b412345"
"hooks": [1,63,6000,254,254,409,404,904,44,54,17,18,0,3859,54,7,35,10,1,39,0,0,0],
"events": {"atk":306,"deploy":24,"die":44,"dmg":397,"engage":7,"fx":173,"heal":80,"leak":10,"skill":36,"spawn":49,"status":162},
"fx": {"appear":11,"bandage":1,"beam":31,"blink":12,"block":6,"charge":6,"disappear":11,"explode":12,"flame":1,"garrisonGrant":1,"healField":6,"jungleSoul":1,"mote":4,"redistribute":5,"reweave":1,"rockslide":5,"sandChains":1,"shell":7,"shieldBreak":7,"slash":20,"spGift":2,"summon":7,"telegraph":3,"thorns":11,"truesilver":1},
"snaps": "cf292ec5 7036981d ce112fc3 25f0eb93 70c3bccc e26c17f4 00a4d474 544cd08f aa7be5f8 c5be8afe f91d2b31 046a0906 0349b50e e6ee0388 5018349f 33803746 6f6b44c6 61b9c230 1fc2a162 0c040988"
},
"hidden-boss_9-pair": {
"about": "假想敌:铳 pair pool 5600000: chess_char_6_03_b chess_char_6_06_b chess_char_6_07_b chess_char_6_01_b chess_char_6_02_b chess_char_6_04_b chess_char_6_05_b chess_char_6_08_b chess_char_6_09_b chess_char_6_11_b token_10017_skadi2_dedant token_10030_mlyss_wtrman | chess_char_6_15_b chess_char_6_19_b chess_char_5_01_b chess_char_6_17_b chess_char_6_12_b chess_char_6_13_b chess_char_6_14_b chess_char_6_16_b chess_char_6_18_b chess_char_6_20_b",
@@ -1111,106 +1111,107 @@
"killed": 8,
"total": 8,
"unspawned": 0,
"bossHpLeft": 3570058,
"rngDraws": 1579,
"bossHpLeft": 3511007,
"rngDraws": 1705,
"errors": {"count":0,"kinds":[]},
"players": {
"p1": {"killed":8,"total":8,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":1989162,"bossDmg":803960,"heal":23383,"deaths":4,"layerGains":{}},
"p2": {"killed":0,"total":0,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":3240431,"bossDmg":1176195,"heal":126751,"deaths":10,"layerGains":{}}
"p1": {"killed":8,"total":8,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":1689940,"bossDmg":698535,"heal":15297,"deaths":5,"layerGains":{}},
"p2": {"killed":0,"total":0,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":3810677,"bossDmg":1348791,"heal":109383,"deaths":7,"layerGains":{}}
},
"units": [
["p1",1,"op","chess_char_6_03_b",2,"uniequip_002_yu",5343.08,1,15,0,1906,10482,12401,28,3],
["p1",2,"op","chess_char_6_06_b",2,"uniequip_002_pepe",2910.14,1,11,0,19692,205,0,21,1],
["p1",3,"op","chess_char_6_07_b",2,"uniequip_002_siege2",1761.93,1,17,0,50071,1601,0,31,2],
["p1",4,"op","chess_char_6_01_b",2,"uniequip_002_lemuen",0,0,7,2,1548110,3561,0,55,8],
["p1",5,"op","chess_char_6_02_b",2,"uniequip_002_sbell2",1074.65,1,9,0,33675,10123,0,46,2],
["p1",6,"op","chess_char_6_04_b",2,"uniequip_002_skadi2",463.12,1,55,0,25244,10860,954,0,4],
["p1",7,"op","chess_char_6_05_b",2,"uniequip_002_pasngr",2451.4,1,13,1,90440,0,0,0,11],
["p1",8,"op","chess_char_6_08_b",2,"uniequip_002_reed2",1668,1,19,1,42621,0,7847,77,2],
["p1",9,"op","chess_char_6_09_b",0,"uniequip_002_cello",0,0,21,1,144190,13392,0,29,29],
["p1",10,"op","chess_char_6_11_b",2,"uniequip_002_mlyss",1893,1,63,1,24647,9390,349,66,2],
["p1",1,"op","chess_char_6_03_b",2,"uniequip_002_yu",6348.28,1,67,0,9,7512,6537,1,3],
["p1",2,"op","chess_char_6_06_b",2,"uniequip_002_pepe",2695.89,1,11,0,8762,1179,0,9,1],
["p1",3,"op","chess_char_6_07_b",2,"uniequip_002_siege2",1406.57,1,17,0,35012,3869,0,15,2],
["p1",4,"op","chess_char_6_01_b",2,"uniequip_002_lemuen",1165.15,1,7,2,1312507,1285,0,58,8],
["p1",5,"op","chess_char_6_02_b",2,"uniequip_002_sbell2",0,0,9,0,19135,12418,0,23,1],
["p1",6,"op","chess_char_6_04_b",2,"uniequip_002_skadi2",1104.58,1,55,0,35830,11463,444,0,4],
["p1",7,"op","chess_char_6_05_b",2,"uniequip_002_pasngr",2451.4,1,13,0,67894,0,0,0,10],
["p1",8,"op","chess_char_6_08_b",2,"uniequip_002_reed2",1668,1,19,0,30095,0,7111,86,3],
["p1",9,"op","chess_char_6_09_b",0,"uniequip_002_cello",0,0,21,1,150260,13231,0,28,28],
["p1",10,"op","chess_char_6_11_b",2,"uniequip_002_mlyss",1893,1,60,0,22306,8566,349,73,3],
["p1",11,"token","token_10017_skadi2_dedant",null,null,138,0,28,0,0,0,0,0,null],
["p1",12,"token","token_10030_mlyss_wtrman",null,null,0,0,24,0,0,1640,318,4,1],
["p2",13,"op","chess_char_6_15_b",2,"uniequip_002_qiubai",0,0,62,1,459553,38345,0,197,3],
["p2",14,"op","chess_char_6_19_b",2,"uniequip_002_blkkgt",0,0,60,0,497307,16632,0,66,5],
["p2",15,"op","chess_char_5_01_b",1,"uniequip_002_excu2",0,0,66,0,13781,7737,2820,42,2],
["p2",16,"op","chess_char_6_17_b",2,"uniequip_002_nearl2",1302.59,1,61,0,512511,25088,0,68,3],
["p2",17,"op","chess_char_6_12_b",1,"uniequip_002_rosmon",765.29,1,8,0,477111,13038,0,78,3],
["p2",18,"op","chess_char_6_13_b",1,"uniequip_002_angel2",2215,1,14,0,969378,5435,3408,291,6],
["p2",19,"op","chess_char_6_14_b",2,"uniequip_002_lumen",3038.4,1,20,0,0,0,24080,78,1],
["p2",20,"op","chess_char_6_16_b",2,"uniequip_002_halo2",1439,1,10,0,98857,0,0,131,4],
["p2",21,"op","chess_char_6_18_b",2,"uniequip_002_whitw2",1695.1,1,59,1,183585,13999,0,2,5],
["p2",22,"op","chess_char_6_20_b",2,"uniequip_002_agoat2",1592.1,1,25,0,0,14000,96443,80,2],
["p2",13,"op","chess_char_6_15_b",2,"uniequip_002_qiubai",0,0,66,4,730725,36055,0,338,3],
["p2",14,"op","chess_char_6_19_b",2,"uniequip_002_blkkgt",203.08,1,58,0,450324,11985,0,58,5],
["p2",15,"op","chess_char_5_01_b",1,"uniequip_002_excu2",0,0,65,0,41071,8230,3308,52,2],
["p2",16,"op","chess_char_6_17_b",2,"uniequip_002_nearl2",3430.93,1,59,1,771816,24776,0,77,3],
["p2",17,"op","chess_char_6_12_b",1,"uniequip_002_rosmon",2886.8,1,8,0,378435,1696,0,78,3],
["p2",18,"op","chess_char_6_13_b",1,"uniequip_002_angel2",2215,1,14,0,1014033,6744,2745,288,6],
["p2",19,"op","chess_char_6_14_b",2,"uniequip_002_lumen",3038.4,1,20,0,0,0,7939,78,1],
["p2",20,"op","chess_char_6_16_b",2,"uniequip_002_halo2",1439,1,10,0,105424,0,0,132,4],
["p2",21,"op","chess_char_6_18_b",2,"uniequip_002_whitw2",1690.1,1,41,0,234825,7508,0,60,4],
["p2",22,"op","chess_char_6_20_b",2,"uniequip_002_agoat2",1592.1,1,25,0,0,14000,95391,82,2],
["-","~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],
["-","~3","device","trap_1105_accrate",null,null,100,1,3,0,0,0,0,0,null],
["-","~4","device","trap_1105_accrate",null,null,100,1,4,0,0,0,0,0,null],
["-","~5","device","trap_1105_accrate",null,null,100,1,5,0,0,0,0,0,null],
["-","~6","device","trap_1105_accrate",null,null,100,1,6,0,0,0,0,0,null],
["p2","~1","token","token_10019_nearl2_sword",null,null,2280.4,0,47,0,6744,6000,0,5,null],
["p1","~1","token","token_10030_mlyss_wtrman",null,null,1322,1,48,0,1766,2370,1514,30,1],
["p1","~2","token","token_10030_mlyss_wtrman",null,null,1102.65,0,49,0,595,675,0,11,null],
["p1","~3","token","token_10030_mlyss_wtrman",null,null,0,0,51,0,661,1322,0,10,null],
["p1","~4","token","token_10030_mlyss_wtrman",null,null,0,0,53,0,794,1322,0,12,null],
["p1","~1","token","token_10040_siege2_vlion",null,null,3730,0,54,0,4750,270,0,10,null],
["p2","~1","token","token_10019_nearl2_sword",null,null,4710.39,0,47,0,6744,3570,0,5,null],
["p1","~1","token","token_10030_mlyss_wtrman",null,null,0,0,48,0,1670,1538,0,22,1],
["p1","~2","token","token_10030_mlyss_wtrman",null,null,0,0,49,0,220,3142,0,9,null],
["p1","~3","token","token_10030_mlyss_wtrman",null,null,0,0,51,0,463,1322,0,7,null],
["p1","~1","token","token_10040_siege2_vlion",null,null,3730,0,53,0,4750,270,0,10,null],
["p1","~1","token","token_10017_skadi2_dedant",null,null,138,0,56,0,0,0,0,0,null],
["p2","~2","token","token_10019_nearl2_sword",null,null,0,0,57,0,21605,6600,0,12,null],
["p1","~2","token","token_10017_skadi2_dedant",null,null,100,0,64,0,0,0,0,0,null],
["p1","~2","token","token_10040_siege2_vlion",null,null,3926.59,0,65,0,0,97,0,0,null],
["p1","~3","token","token_10017_skadi2_dedant",null,null,100,1,67,0,0,0,0,0,null]
["p2","~2","token","token_10019_nearl2_sword",null,null,0,0,57,0,68925,6922,0,11,null],
["p1","~4","token","token_10030_mlyss_wtrman",null,null,1172,1,61,0,1025,710,538,7,1],
["p1","~2","token","token_10017_skadi2_dedant",null,null,100,0,62,0,0,0,0,0,null],
["p1","~2","token","token_10040_siege2_vlion",null,null,3942.24,0,63,0,0,76,0,0,null],
["p2","~3","token","token_10019_nearl2_sword",null,null,3290.4,0,64,0,8355,3008,0,21,null],
["p1","~3","token","token_10017_skadi2_dedant",null,null,100,1,68,0,0,0,0,0,null]
],
"enemies": {
"enemy_1267_nhpbr_2": [6,6,0,5992,141894],
"enemy_9007_acelem": [2,2,0,22960,309587],
"enemy_9017_achunt_2": [2,0,0,57558,2029942],
"enemy_9018_actrpa": [1,0,0,42972,765851],
"enemy_9019_actrpb": [1,0,0,26761,756394],
"enemy_9020_actrpc": [1,0,0,18223,1328263]
"enemy_1267_nhpbr_2": [6,6,0,1800,141894],
"enemy_9007_acelem": [2,2,0,15725,309587],
"enemy_9017_achunt_2": [2,0,0,54791,2088993],
"enemy_9018_actrpa": [1,0,0,30160,855522],
"enemy_9019_actrpb": [1,0,0,29590,798033],
"enemy_9020_actrpc": [1,0,0,20449,1384683]
},
"hooks": [1,65,6000,1653,1653,7414,13693,3721,26,37,100,94,326,46845,2814,18,13,0,1,27,0,18,0],
"events": {"atk":2008,"deploy":46,"die":37,"dmg":13203,"engage":24,"fx":2168,"heal":883,"skill":194,"spawn":52,"status":833},
"hooks": [1,66,6000,1799,1799,6944,13382,2834,25,37,99,90,326,47765,2836,14,13,0,1,26,0,13,0],
"events": {"atk":2246,"deploy":47,"die":37,"dmg":12926,"engage":25,"fx":2188,"heal":930,"skill":189,"spawn":53,"status":849},
"fx": {
"airstrike": 117,
"airstrike": 123,
"beam": 31,
"blessing": 1,
"blink": 4,
"bombard": 68,
"bombardShell": 68,
"burst": 18,
"blink": 5,
"bombard": 72,
"bombardShell": 72,
"burst": 13,
"camouflage": 1,
"copy": 2,
"copy": 3,
"dash": 24,
"displace": 24,
"dp": 2,
"drone": 275,
"droneLock": 15,
"drones": 5,
"extraAttack": 12,
"displace": 1,
"dp": 3,
"drone": 320,
"droneLock": 14,
"drones": 4,
"extraAttack": 16,
"finale": 5,
"firewall": 3,
"garrisonGrant": 1,
"lightning": 119,
"lightning": 116,
"link": 1141,
"lock": 72,
"lure": 2,
"phase": 11,
"radiantSword": 2,
"lure": 1,
"phase": 12,
"radiantSword": 3,
"revive": 3,
"scorchBurst": 3,
"shieldBreak": 9,
"scorchBurst": 1,
"shieldBreak": 10,
"slash": 55,
"snow": 25,
"split": 3,
"snow": 15,
"split": 2,
"steal": 6,
"storm": 11,
"summon": 4,
"storm": 10,
"summon": 5,
"sunBurst": 3,
"talent": 7,
"talent": 5,
"tide": 4,
"wanted": 6,
"zone": 6
},
"snaps": "2a921421 d160972c 4e5b9396 7b13edd2 689bae2b f9a15be0 67150ecd 3a4286df 13119f08 b1b42c22 b5c0b449 f4bddab7 22e104fd fd2f838a b7964c3e 83e4b794 62994daa 16b9850d 3f3a5054 498cda94"
"snaps": "2a921421 57801ce9 151fd5ae 264faece f8920de3 cef81b6f 47f4a450 cc0a8289 6b7ac4fb 81b93e22 d10e889f 97a33a13 a796916b 202ae19b 16aa629d c7afee38 08c75624 11b64823 c1f874f3 b92e528f"
},
"hidden-boss_9-solo": {
"about": "假想敌:铳 solo pool 2800000: chess_char_5_08_b chess_char_5_11_b chess_char_5_05_b chess_char_5_06_b chess_char_5_13_b chess_char_5_07_b chess_char_5_02_b chess_char_5_03_b chess_char_5_10_b chess_char_5_12_b",
@@ -1377,33 +1378,33 @@
"killed": 11,
"total": 13,
"unspawned": 0,
"bossHpLeft": 7323878,
"rngDraws": 102,
"bossHpLeft": 7323370,
"rngDraws": 166,
"errors": {"count":0,"kinds":[]},
"players": {"p1":{"killed":11,"total":13,"perfect":false,"leaks":1,"leaksUncounted":0,"coins":0,"dmg":430741,"bossDmg":276122,"heal":148595,"deaths":10,"layerGains":{}}},
"players": {"p1":{"killed":11,"total":13,"perfect":false,"leaks":1,"leaksUncounted":0,"coins":0,"dmg":464694,"bossDmg":276630,"heal":131305,"deaths":14,"layerGains":{}}},
"units": [
["p1",1,"op","chess_char_4_17_b",1,"uniequip_002_hsguma",3123.26,1,29,5,45,3903,0,19,0],
["p1",2,"op","chess_char_4_18_b",1,"uniequip_002_mudrok",1092.31,1,24,0,36,24428,13312,31,6],
["p1",3,"op","chess_char_4_23_b",2,"uniequip_002_gvial2",0,0,28,0,140999,24118,1514,143,3],
["p1",4,"op","chess_char_4_19_b",2,"uniequip_002_flamtl",3600.6,1,31,0,13,10454,0,12,0],
["p1",5,"op","chess_char_4_22_b",2,"uniequip_002_svrash",0,0,22,3,176153,57886,6009,118,2],
["p1",6,"op","chess_char_4_20_b",2,"uniequip_002_fartth",1419,1,30,1,87204,1419,0,56,6],
["p1",7,"op","chess_char_4_21_b",1,"uniequip_002_plosis",1584,1,25,0,0,20837,92999,101,2],
["p1",8,"op","chess_char_4_24_b",1,"uniequip_002_billro",2178,1,2,2,26292,3463,0,38,4],
["p1",9,"op","chess_char_4_25_b",2,"uniequip_002_cetsyr",1671,1,23,0,0,33782,4919,0,1],
["p1",10,"op","chess_char_4_26_b",0,"uniequip_002_bldsk",1522,1,3,0,0,2358,29841,56,9]
["p1",1,"op","chess_char_4_17_b",1,"uniequip_002_hsguma",0,0,29,5,86,7026,0,29,0],
["p1",2,"op","chess_char_4_18_b",1,"uniequip_002_mudrok",0,0,25,1,24,20856,8648,22,3],
["p1",3,"op","chess_char_4_23_b",2,"uniequip_002_gvial2",3972.12,1,36,1,135461,22114,1894,138,3],
["p1",4,"op","chess_char_4_19_b",2,"uniequip_002_flamtl",2794.81,1,30,1,24,19328,0,20,2],
["p1",5,"op","chess_char_4_22_b",2,"uniequip_002_svrash",3905.8,1,35,1,190741,38172,6349,92,3],
["p1",6,"op","chess_char_4_20_b",2,"uniequip_002_fartth",0,0,31,0,91309,2838,0,56,6],
["p1",7,"op","chess_char_4_21_b",1,"uniequip_002_plosis",2920.8,1,24,0,0,22500,76891,97,2],
["p1",8,"op","chess_char_4_24_b",1,"uniequip_002_billro",1857.76,1,2,2,47049,4356,390,63,5],
["p1",9,"op","chess_char_4_25_b",2,"uniequip_002_cetsyr",1671,1,23,0,0,30194,6136,0,2],
["p1",10,"op","chess_char_4_26_b",0,"uniequip_002_bldsk",1522,1,34,0,0,6414,30997,45,11]
],
"enemies": {
"enemy_1005_yokai_3": [1,0,1,11629,68252],
"enemy_1005_yokai_3": [1,0,1,18035,101682],
"enemy_9010_acpupp": [2,2,0,19404,86026],
"enemy_9021_acduml_2": [1,0,0,6962,276122],
"enemy_9022_acdumm": [1,0,0,3379,0],
"enemy_9023_acdums": [10,9,0,138776,342]
"enemy_9021_acduml_2": [1,0,0,5561,276630],
"enemy_9022_acdumm": [1,0,0,3192,0],
"enemy_9023_acdums": [10,9,0,126299,357]
},
"hooks": [1,33,6000,650,650,2402,2852,7246,21,22,33,33,0,9568,105,16,15,1,1,65,0,27,2],
"events": {"atk":973,"deploy":18,"die":21,"dmg":2838,"engage":7,"fx":844,"heal":298,"leak":1,"skill":69,"spawn":25,"status":303},
"fx": {"bandage":9,"beam":21,"block":14,"burst":27,"dodge":2,"ember":2,"explode":500,"featherArrow":6,"garrisonGrant":1,"healField":2,"jungleSoul":3,"mote":52,"phase":55,"redistribute":15,"reweave":1,"riposte":1,"rockslide":6,"sandChains":1,"sandChainsCharged":3,"shieldBreak":21,"slash":40,"spGift":2,"summon":8,"telegraph":2,"thorns":47,"truesilver":2,"undying":1},
"snaps": "65ab7720 4d0f9bc6 b175a7ad decfc6d9 b1fdbc1b 7b25f64c 67b47291 502d1b71 8861598b 7112c963 3170b708 8e72387d c384da93 0d0d33a6 19ea6be5 8daa9858 108f2f2f 471283be f8dc4d37 8c04e516"
"hooks": [1,36,6000,638,638,2467,2898,4848,25,26,37,36,0,9821,145,20,15,1,1,67,0,28,9],
"events": {"atk":954,"deploy":21,"die":25,"dmg":2888,"engage":7,"fx":947,"heal":263,"leak":1,"skill":75,"spawn":25,"status":338},
"fx": {"appear":2,"bandage":11,"beam":21,"block":35,"burst":28,"disappear":2,"dodge":9,"ember":2,"explode":516,"featherArrow":6,"flame":2,"garrisonGrant":1,"healField":2,"jungleSoul":3,"mote":47,"phase":59,"redistribute":29,"reweave":2,"riposte":4,"rockslide":3,"sandChains":1,"sandChainsCharged":4,"shieldBreak":18,"slash":52,"spGift":1,"summon":8,"telegraph":2,"thorns":73,"truesilver":3,"undying":1},
"snaps": "65ab7720 4d0f9bc6 b175a7ad decfc6d9 b1fdbc1b 7b25f64c ed1f9251 983f7608 cca2598e 0fd58d49 527eb26a dd8fcf46 aba72471 d9ca8e66 de4bc95b 4aff4604 6433c156 9f47302e d9d4b49d f50d18d6"
},
"unite-1": {
"about": "联防 1 helper(s), 11 leaked: chess_char_6_03_b chess_char_6_06_b chess_char_6_07_b chess_char_6_01_b chess_char_6_02_b chess_char_6_04_b chess_char_6_05_b chess_char_6_08_b token_10017_skadi2_dedant",
+18 -18
View File
@@ -59,7 +59,7 @@
"combat": "client",
"boost": null,
"setup": {"stageId":"act1autochess_m01","bossId":"boss_5","hiddenBossId":null,"factions":["ELEMENT","DOT","REFLECTION"]},
"end": {"victory":false,"roundsPassed":8,"hiddenReached":false,"hiddenCleared":false,"reason":"defeat","teamLp":0,"bossPoolLeft":94860,"virtualMs":68100},
"end": {"victory":false,"roundsPassed":8,"hiddenReached":false,"hiddenCleared":false,"reason":"defeat","teamLp":0,"bossPoolLeft":94412,"virtualMs":68100},
"rng": {"setup":16,"shop":161,"waves":0,"draft":0,"bots":5205,"meta":43},
"errors": {"engine":0,"logged":0,"sim":0,"dispatcher":0},
"rounds": [
@@ -83,7 +83,7 @@
"title": {"id":"comment_2","name":"不朽盟约","picId":"comment_icon_2","text":"激活的盟约层数总和最高"},
"trophies": 0,
"reward": 100,
"stats": {"activatedLayers":128,"bossDamage":105140,"dmgDealt":663269,"gold":78,"itemsEquipped":16,"kills":143,"leaks":0,"lpLost":0,"merges":0,"perfectRounds":8,"refreshes":18},
"stats": {"activatedLayers":128,"bossDamage":105588,"dmgDealt":664772,"gold":78,"itemsEquipped":16,"kills":144,"leaks":0,"lpLost":0,"merges":0,"perfectRounds":8,"refreshes":18},
"lineup": ["3_20_a@12,3[4_07_e_a+3_04_e_b]","2_14_a@12,4","2_05_a@12,6","3_10_a@11,3","4_14_a@11,8[4_02_e_a+4_08_e_a]","1_06_a@10,3[5_02_e_a+2_03_e_a]","1_02_a@10,4[3_08_e_a+2_01_e_b]","4_11_a@10,8[4_04_e_a+1_01_e_a]"],
"bonds": ["deputShip 2/40","emptyShip 1/12","kjeragShip 1/28","steadShip 0/26","swiftShip 1/18","victoriaShip 1/30"]
}
@@ -99,7 +99,7 @@
"combat": "client",
"boost": null,
"setup": {"stageId":"act1autochess_m03","bossId":"boss_5","hiddenBossId":"boss_8","factions":["TIMES","DOT","INVISIBLE"]},
"end": {"victory":true,"roundsPassed":15,"hiddenReached":true,"hiddenCleared":true,"reason":"victory","teamLp":26,"bossPoolLeft":0,"virtualMs":112800},
"end": {"victory":true,"roundsPassed":14,"hiddenReached":true,"hiddenCleared":false,"reason":"victory","teamLp":0,"bossPoolLeft":99894,"virtualMs":112800},
"rng": {"setup":25,"shop":233,"waves":0,"draft":10,"bots":8919,"meta":6},
"errors": {"engine":0,"logged":0,"sim":0,"dispatcher":0},
"rounds": [
@@ -148,14 +148,14 @@
"ai_0": {
"alive": true,
"victory": true,
"roundsPassed": 15,
"roundsPassed": 14,
"eliminatedRound": null,
"lp": 26,
"lp": 0,
"bandId": "band_ermengard",
"title": {"id":"comment_1","name":"卫戍之星","picId":"comment_icon_1","text":"对敌方领袖造成伤害最高(仅胜利时)"},
"trophies": 0,
"reward": 400,
"stats": {"activatedLayers":398,"bossDamage":1327500,"dmgDealt":3388979,"gold":144,"itemsEquipped":16,"kills":388,"leaks":0,"lpLost":0,"merges":4,"perfectRounds":13,"refreshes":18},
"stats": {"activatedLayers":398,"bossDamage":1227606,"dmgDealt":3258313,"gold":144,"itemsEquipped":16,"kills":388,"leaks":0,"lpLost":0,"merges":4,"perfectRounds":13,"refreshes":18},
"lineup": ["6_08_a@12,8","1_17_b@11,7","4_14_a@11,8[5_03_e_a]","6_18_a@10,4[3_02_e_a+3_05_e_a]","6_02_a@10,5","4_10_a@10,6[3_02_e_b+3_08_e_b]","1_19_b@10,8[4_05_e_a]","1_08_a@9,9[1_01_e_a+1_02_e_b]"],
"bonds": ["arcaneShip 2/34","kazimierzShip 0/10","kjeragShip 0/2","miraShip 1/3","preciShip 2/79","sargonShip 0/8","siracusaShip 1/224","soloShip 1/3","steadShip 0/2","suntShip 1/0","swiftShip 1/55","yanShip 0/6"]
}
@@ -246,7 +246,7 @@
"combat": "client",
"boost": null,
"setup": {"stageId":"act1autochess_m03","bossId":"boss_5","hiddenBossId":"boss_8","factions":["TIMES","DOT","INVISIBLE"]},
"end": {"victory":true,"roundsPassed":14,"hiddenReached":true,"hiddenCleared":false,"reason":"victory","teamLp":0,"bossPoolLeft":3046117,"virtualMs":113700},
"end": {"victory":true,"roundsPassed":14,"hiddenReached":true,"hiddenCleared":false,"reason":"victory","teamLp":0,"bossPoolLeft":2839368,"virtualMs":113700},
"rng": {"setup":25,"shop":254,"waves":0,"draft":42,"bots":8253,"meta":13},
"errors": {"engine":0,"logged":0,"sim":0,"dispatcher":0},
"rounds": [
@@ -302,7 +302,7 @@
"title": {"id":"comment_1","name":"卫戍之星","picId":"comment_icon_1","text":"对敌方领袖造成伤害最高(仅胜利时)"},
"trophies": 0,
"reward": 425,
"stats": {"activatedLayers":512,"bossDamage":1333883,"dmgDealt":3325553,"gold":151,"itemsEquipped":18,"kills":419,"leaks":0,"lpLost":0,"merges":4,"perfectRounds":13,"refreshes":21},
"stats": {"activatedLayers":512,"bossDamage":1540632,"dmgDealt":3524500,"gold":151,"itemsEquipped":18,"kills":422,"leaks":0,"lpLost":0,"merges":4,"perfectRounds":13,"refreshes":21},
"lineup": ["4_14_b@12,8[5_01_e_a+2_01_e_b]","3_19_a@11,7[3_02_e_b]","4_20_b@11,8[3_11_e_b+3_06_e_a]","4_10_a@10,6","6_17_a@10,8[4_10_e_b+4_05_e_a]","1_08_a@9,5[1_01_e_a+1_02_e_a]","5_07_a@9,6","1_19_b@9,9[3_08_e_a+3_01_e_a]"],
"bonds": ["arcaneShip 1/18","kazimierzShip 1/104","kjeragShip 0/2","miraShip 1/3","preciShip 1/80","raidShip 1/134","sargonShip 0/8","siracusaShip 1/119","soloShip 1/1","steadShip 0/10","suntShip 1/0","swiftShip 1/53"]
}
@@ -1320,7 +1320,7 @@
"combat": "client",
"boost": {"lp":400,"layers":300},
"setup": {"stageId":"act1autochess_m02","bossId":"boss_5","hiddenBossId":"boss_10","factions":["TIMES","ELEMENT","DOT"]},
"end": {"victory":true,"roundsPassed":15,"hiddenReached":true,"hiddenCleared":true,"reason":"victory","teamLp":383,"bossPoolLeft":0,"virtualMs":113700},
"end": {"victory":true,"roundsPassed":15,"hiddenReached":true,"hiddenCleared":true,"reason":"victory","teamLp":361,"bossPoolLeft":0,"virtualMs":113700},
"rng": {"setup":25,"shop":352,"waves":0,"draft":42,"bots":10368,"meta":2},
"errors": {"engine":0,"logged":0,"sim":0,"dispatcher":0},
"rounds": [
@@ -1383,12 +1383,12 @@
"victory": true,
"roundsPassed": 15,
"eliminatedRound": null,
"lp": 383,
"lp": 361,
"bandId": "band_paganini",
"title": {"id":"comment_1","name":"卫戍之星","picId":"comment_icon_1","text":"对敌方领袖造成伤害最高(仅胜利时)"},
"trophies": 0,
"reward": 425,
"stats": {"activatedLayers":2528,"bossDamage":4580000,"dmgDealt":6435237,"gold":174,"itemsEquipped":21,"kills":384,"leaks":1,"lpLost":1,"merges":6,"perfectRounds":12,"refreshes":34},
"stats": {"activatedLayers":2528,"bossDamage":4580000,"dmgDealt":6435323,"gold":174,"itemsEquipped":21,"kills":391,"leaks":1,"lpLost":1,"merges":6,"perfectRounds":12,"refreshes":34},
"lineup": ["2_01_a@12,6","4_02_b@12,7[5_02_e_a+1_02_e_b]","6_11_a@12,8","1_17_b@11,5[3_08_e_b+2_01_e_b]","1_19_b@11,8[1_05_e_b]","4_14_b@10,4[4_03_e_b+2_01_e_b]","2_18_b@10,5[1_02_e_a+3_04_e_a]","4_07_b@9,9[6_09_e_a+1_02_e_b]"],
"bonds": ["arcaneShip 1/314","deputShip 0/300","egirShip 0/300","emptyShip 0/300","indomShip 0/300","investShip 0/300","kazimierzShip 1/308","kjeragShip 0/310","lateranoShip 1/300","maniShip 1/300","miraShip 0/300","preciShip 2/338","raidShip 0/300","sargonShip 0/300","siracusaShip 0/306","skillfulShip 0/316","soloShip 0/307","steadShip 1/313","suntShip 2/300","swiftShip 1/355","victoriaShip 0/300","visiShip 0/300","yanShip 0/300"]
}
@@ -1482,10 +1482,10 @@
"eliminatedRound": null,
"lp": 400,
"bandId": "band_sarkazb",
"title": {"id":"comment_3","name":"坚若磐石","picId":"comment_icon_3","text":"目标生命值损失最少"},
"title": {"id":"comment_1","name":"卫戍之星","picId":"comment_icon_1","text":"对敌方领袖造成伤害最高(仅胜利时)"},
"trophies": 8,
"reward": 425,
"stats": {"activatedLayers":2267,"bossDamage":6609998,"dmgDealt":23342655,"gold":149,"itemsEquipped":23,"kills":290,"leaks":0,"lpLost":0,"merges":6,"perfectRounds":13,"refreshes":16},
"stats": {"activatedLayers":2267,"bossDamage":7523075,"dmgDealt":26462402,"gold":149,"itemsEquipped":23,"kills":290,"leaks":0,"lpLost":0,"merges":6,"perfectRounds":13,"refreshes":16},
"lineup": ["3_16_b@12,8[3_01_e_a+1_01_e_b]","4_09_b@11,5","3_11_b@11,8[3_02_e_a+6_06_e_a]","1_02_b@10,4[1_02_e_a+4_02_e_a]","5_14_a@10,8[3_03_e_a+1_05_e_a]","6_20_a@9,6","3_20_a@9,8[3_07_e_a+3_08_e_a]","6_05_a@9,9[2_04_e_a+5_02_e_b]"],
"bonds": ["arcaneShip 0/316","deputShip 1/312","egirShip 0/300","emptyShip 0/300","indomShip 0/300","investShip 0/300","kazimierzShip 0/302","kjeragShip 1/343","lateranoShip 0/300","maniShip 0/300","miraShip 0/300","preciShip 1/343","raidShip 0/300","sargonShip 0/300","siracusaShip 0/300","skillfulShip 0/319","soloShip 1/310","steadShip 1/341","suntShip 1/310","swiftShip 1/308","victoriaShip 0/300","visiShip 0/300","yanShip 0/300"]
},
@@ -1496,10 +1496,10 @@
"eliminatedRound": null,
"lp": 400,
"bandId": "band_doberm",
"title": {"id":"comment_1","name":"卫戍之星","picId":"comment_icon_1","text":"对敌方领袖造成伤害最高(仅胜利时)"},
"title": {"id":"comment_2","name":"不朽盟约","picId":"comment_icon_2","text":"激活的盟约层数总和最高"},
"trophies": 8,
"reward": 425,
"stats": {"activatedLayers":2301,"bossDamage":7282442,"dmgDealt":25059114,"gold":165,"itemsEquipped":31,"kills":276,"leaks":0,"lpLost":0,"merges":5,"perfectRounds":13,"refreshes":38},
"stats": {"activatedLayers":2301,"bossDamage":6369365,"dmgDealt":22481097,"gold":165,"itemsEquipped":31,"kills":276,"leaks":0,"lpLost":0,"merges":5,"perfectRounds":13,"refreshes":38},
"lineup": ["2_10_a@11,5[2_03_e_b+3_09_e_a]","5_03_a@11,8[1_02_e_a+5_02_e_a]","1_06_a@10,3[1_05_e_a+3_02_e_a]","3_16_a@10,4[3_03_e_b+4_04_e_b]","5_06_a@10,8[3_09_e_b+3_09_e_b]","4_21_b@9,6[4_06_e_a+3_10_e_b]","5_02_a@9,8[4_09_e_a+3_06_e_b]","1_17_b@9,9[3_08_e_a+1_01_e_a]"],
"bonds": ["arcaneShip 1/327","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 1/404","raidShip 0/300","sargonShip 0/300","siracusaShip 0/300","skillfulShip 1/308","soloShip 0/310","steadShip 0/323","suntShip 1/304","swiftShip 0/300","victoriaShip 1/332","visiShip 0/300","yanShip 0/305"]
}
@@ -1515,7 +1515,7 @@
"combat": "client",
"boost": null,
"setup": {"stageId":"act1autochess_m01","bossId":"boss_5","hiddenBossId":"boss_10","factions":["DOT","INVISIBLE","REFLECTION"]},
"end": {"victory":false,"roundsPassed":13,"hiddenReached":false,"hiddenCleared":false,"reason":"defeat","teamLp":0,"bossPoolLeft":107915,"virtualMs":119900},
"end": {"victory":false,"roundsPassed":13,"hiddenReached":false,"hiddenCleared":false,"reason":"defeat","teamLp":0,"bossPoolLeft":97588,"virtualMs":119900},
"rng": {"setup":25,"shop":511,"waves":0,"draft":34,"bots":18074,"meta":23},
"errors": {"engine":0,"logged":0,"sim":0,"dispatcher":0},
"rounds": [
@@ -1596,7 +1596,7 @@
"title": {"id":"comment_2","name":"不朽盟约","picId":"comment_icon_2","text":"激活的盟约层数总和最高"},
"trophies": 3,
"reward": 320,
"stats": {"activatedLayers":219,"bossDamage":248468,"dmgDealt":2618336,"gold":145,"itemsEquipped":18,"kills":245,"leaks":69,"lpLost":10,"merges":6,"perfectRounds":9,"refreshes":24},
"stats": {"activatedLayers":219,"bossDamage":249655,"dmgDealt":2602313,"gold":145,"itemsEquipped":18,"kills":245,"leaks":69,"lpLost":10,"merges":6,"perfectRounds":9,"refreshes":24},
"lineup": ["3_13_b@12,3","5_10_a@12,7[1_02_e_b]","5_15_a@11,3[3_11_e_a]","5_02_a@11,8","3_19_b@10,3[6_01_e_b]","1_08_b@10,7[4_11_e_b+4_02_e_a]","4_16_a@10,8[4_03_e_b+3_07_e_a]","6_05_a@9,8[3_01_e_a+1_01_e_a]"],
"bonds": ["arcaneShip 0/11","kazimierzShip 0/16","kjeragShip 0/8","miraShip 1/30","preciShip 1/52","sargonShip 1/24","siracusaShip 1/44","soloShip 1/0","suntShip 1/0","swiftShip 1/69","yanShip 0/13"]
},
@@ -1610,7 +1610,7 @@
"title": {"id":"comment_3","name":"坚若磐石","picId":"comment_icon_3","text":"目标生命值损失最少"},
"trophies": 3,
"reward": 320,
"stats": {"activatedLayers":163,"bossDamage":423617,"dmgDealt":3743301,"gold":141,"itemsEquipped":21,"kills":274,"leaks":47,"lpLost":10,"merges":6,"perfectRounds":12,"refreshes":19},
"stats": {"activatedLayers":163,"bossDamage":432757,"dmgDealt":3761884,"gold":141,"itemsEquipped":21,"kills":274,"leaks":47,"lpLost":10,"merges":6,"perfectRounds":12,"refreshes":19},
"lineup": ["6_12_a@12,3","5_10_a@12,7","3_21_b@11,3[1_05_e_b+4_08_e_b]","5_20_a@11,8[3_08_e_b+3_07_e_b]","3_01_b@10,3[5_09_e_a+6_05_e_a]","4_16_a@10,7[4_11_e_a+4_02_e_a]","6_06_a@10,8","6_01_a@9,8"],
"bonds": ["arcaneShip 0/2","deputShip 0/32","emptyShip 1/0","kazimierzShip 0/8","lateranoShip 1/79","miraShip 1/6","preciShip 1/2","raidShip 0/2","sargonShip 0/2","siracusaShip 1/62","skillfulShip 0/68","suntShip 1/14","swiftShip 0/55","visiShip 1/0"]
}
+114
View File
@@ -0,0 +1,114 @@
// The 传送门 (portal) of the boss / hidden-core templates (GitHub #336, PR #337 by @2321Robin): an enemy flies or walks
// into the portal and reappears on the far side. Four official routes spell the crossing as DISAPPEAR → WAIT → MOVE-to-the-exit with no APPEAR step
// (act1autochess_h07_02 route #4, act1autochess_h08_02 routes #5/#9, act2autochess_h07_05 route #6), while their twin
// routes in the same templates write it out as DISAPPEAR → WAIT → APPEAR[exit]. Taken literally, an appear-less route
// made the enemy walk its whole remaining route invisible and then leak unseen — the blue door takes the leak and the
// team never sees who or how (user report: 打 boss 时小怪进传送门后被判定进蓝门,全程隐身). normalizeRoute re-inserts
// the exit APPEAR ahead of that MOVE — at the MOVE's own target, which is exactly where the twins appear.
import { test } from 'node:test';
import assert from 'node:assert/strict';
import { normalizeRoute, hasGeneratedData } from '../../server/sim/simdata.js';
import { makeBattle, enemyRec } from '../helpers/battleHarness.js';
const REAL = { skip: !hasGeneratedData() && 'no generated data' };
/** Leg signature of a normalized route: `MOVE[r,c]` / `APPEAR[r,c]` / `DISAPPEAR` / `WAIT`. */
const sig = (r) => r.checkpoints.map((c) => c.type + (c.type === 'MOVE' || c.type === 'APPEAR' ? `[${c.pos[0]},${c.pos[1]}]` : ''));
/** The test enemy's leaks (the templates' own spawns leak too). */
const leaksOf = (h) => h.hooksOf('enemyLeak').filter((l) => l.enemy.defId === 'enemy_test_portal');
test('normalizeRoute: DISAPPEAR → WAIT → MOVE gains the twin APPEAR at the move target', () => {
const r = normalizeRoute({
motion: 'FLY', start: [2, 10], end: [1, 3],
steps: [
{ t: 'move', p: [2, 11] }, { t: 'move', p: [1, 17] }, { t: 'disappear' }, { t: 'wait', s: 3 },
{ t: 'move', p: [5, 10] }, { t: 'move', p: [5, 9] },
],
});
assert.deepEqual(sig(r), ['MOVE[2,11]', 'MOVE[1,17]', 'DISAPPEAR', 'WAIT', 'APPEAR[5,10]', 'MOVE[5,10]', 'MOVE[5,9]']);
});
test('normalizeRoute: a DISAPPEAR the data does spell out with an APPEAR is kept as the only one', () => {
const r = normalizeRoute({
motion: 'FLY', start: [2, 10], end: [1, 17],
steps: [
{ t: 'move', p: [1, 3] }, { t: 'disappear' }, { t: 'wait', s: 3 }, { t: 'appear', p: [5, 10] }, { t: 'move', p: [5, 13] },
],
});
assert.equal(r.checkpoints.filter((c) => c.type === 'APPEAR').length, 1);
assert.deepEqual(sig(r), ['MOVE[1,3]', 'DISAPPEAR', 'WAIT', 'APPEAR[5,10]', 'MOVE[5,13]']);
});
test('normalizeRoute: idempotent — a second pass over a fixed route changes nothing', () => {
const once = normalizeRoute({
motion: 'FLY', start: [2, 10], end: [1, 3],
steps: [{ t: 'move', p: [1, 17] }, { t: 'disappear' }, { t: 'wait', s: 3 }, { t: 'move', p: [5, 10] }],
});
assert.deepEqual(normalizeRoute(once), once);
});
// The four official appear-less routes on their real templates: after the portal the enemy must be back in the open
// at the exit [5,10] (where the twins appear) and the route's leak at the blue door must happen VISIBLE.
const PORTAL_EXIT = [5, 10];
const CASES = [
['act1autochess_h07_02', 4, 'FLY'],
['act1autochess_h08_02', 5, 'WALK'],
['act1autochess_h08_02', 9, 'WALK'],
['act2autochess_h07_05', 6, 'FLY'],
];
for (const [tplId, routeIdx, motion] of CASES) {
test(`${tplId} route #${routeIdx}: portal crossing reappears at [${PORTAL_EXIT}] and leaks visible`, REAL, () => {
const h = makeBattle({
kind: 'boss', waveTemplate: tplId, content: 'none',
defs: { enemies: { enemy_test_portal: enemyRec({ key: 'enemy_test_portal', hp: 1e6, speed: 3, motion }) } },
enemies: [{ key: 'enemy_test_portal', route: routeIdx }],
autoFinish: true, timeLimit: 400, hooks: ['enemyLeak'],
});
const e = () => h.enemy('enemy_test_portal');
assert.ok(h.runUntil(() => e() && e().hidden, 400), 'reaches the portal (disappears)');
assert.ok(h.runUntil(() => e() && !e().hidden, 400), 'reappears after the portal');
assert.deepEqual([Math.round(e().y), Math.round(e().x)], PORTAL_EXIT, 'reappears at the portal exit');
h.runToEnd(400);
const [leak, ...more] = leaksOf(h);
assert.ok(leak, 'the route still ends in its leak');
assert.equal(more.length, 0, 'one leak');
assert.equal(leak.enemy.hidden, false, 'the leak is visible');
});
}
// A route that ENDS on a portal entrance does not leak there: the entrance teleports the enemy out of the far exit
// ([5,10] — the same pairing every explicit DISAPPEAR / APPEAR pair in the data reads) and it walks on to the blue
// door on that side of the field, where the leak happens (GitHub #336: 打 boss 小怪第一次进传送门就被判定进蓝门,
// 官方是传送后走向蓝门). The solo boss routes are exactly this shape: straight from the centre into the corner portal.
test('solo boss: a route ending on the left portal entrance leaks at the left blue door, not the portal', REAL, () => {
const h = makeBattle({
kind: 'boss', stageId: 'act1autochess_m01', rect: { r0: 0, r1: 5, c0: 0, c1: 20 },
waveTemplate: 'act1autochess_h07_02_s', content: 'none',
defs: { enemies: { enemy_test_portal: enemyRec({ key: 'enemy_test_portal', hp: 1e6, speed: 3 }) } },
enemies: [{ key: 'enemy_test_portal', route: 0 }],
autoFinish: true, timeLimit: 300, hooks: ['enemyLeak'],
});
const e = () => h.enemy('enemy_test_portal');
assert.ok(h.runUntil(() => e() && Math.round(e().y) === 1 && Math.round(e().x) === 3, 300), 'reaches the portal entrance [1,3]');
assert.ok(h.runUntil(() => e() && Math.round(e().y) === 5 && Math.round(e().x) === 10, 300), 'teleports out of the exit [5,10]');
h.runToEnd(400);
const [leak, ...more] = leaksOf(h);
assert.ok(leak, 'leaks eventually');
assert.deepEqual([Math.round(leak.enemy.y), Math.round(leak.enemy.x)], [2, 2], 'the leak is at the left blue door [2,2]');
assert.equal(more.length, 0, 'stepping into the portal entrance is no leak of its own');
});
test('a route ending on the right portal entrance mirrors: leak at the right blue door', REAL, () => {
const h = makeBattle({
kind: 'boss', stageId: 'act1autochess_m01', rect: { r0: 0, r1: 5, c0: 0, c1: 20 }, content: 'none',
defs: { enemies: { enemy_test_portal: enemyRec({ key: 'enemy_test_portal', hp: 1e6, speed: 3 }) } },
enemies: [{ key: 'enemy_test_portal', route: { motion: 'WALK', start: [2, 10], end: [1, 17], checkpoints: [] } }],
autoFinish: true, timeLimit: 300, hooks: ['enemyLeak'],
});
h.runToEnd(400);
const [leak, ...more] = leaksOf(h);
assert.ok(leak, 'leaks eventually');
assert.deepEqual([Math.round(leak.enemy.y), Math.round(leak.enemy.x)], [2, 18], 'the leak is at the right blue door [2,18]');
assert.equal(more.length, 0, 'stepping into the portal entrance is no leak of its own');
});