From e9b6f7e706aaa52c8daf098ae6adef66680cb220 Mon Sep 17 00:00:00 2001 From: sganggs Date: Mon, 5 Oct 2026 17:27:03 +0800 Subject: [PATCH] =?UTF-8?q?feedback5=20WC:=20=E7=90=B3=E7=90=85=E8=AF=97?= =?UTF-8?q?=E6=80=80=E9=9B=85=20S2=20=E8=A7=81=E9=9D=A2=E7=A4=BC=20throws?= =?UTF-8?q?=20its=20champagne=20bomb=20on=20range=20x-6,=20onto=20an=20ene?= =?UTF-8?q?my's=20tile,=20with=20no=20enemy=20needed=20(GitHub=20#116=20it?= =?UTF-8?q?em=202)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PRTS 技能2 备注: placement range x-6 (range_table "x-6": her tile and two tiles in each of the four directions); "若放置 范围内存在敌人,则按攻击索敌规律放置香槟至其所在地块,否则随机放置香槟至可部署的地块". The client charpack (char_1033_swire2, mode S2) makes her attack a priority composite: SpawnToken (Skill_2) when a free x-6 tile exists and she holds a coin, else the normal attack. So a coin plus a free x-6 tile takes her attack's turn whether or not an enemy is near; the tile is the first ground enemy's on a free x-6 tile in her attack target order, else a random free tile. Until now every attack dropped a bomb at random on her 1-1 attack range. [ASSUMED] the throw costs her attack one tick. Golden: roster-006 / roster-008, bond-investShip-low, bond-kjeragShip-low, bond-siracusaShip-low, bond-victoriaShip-low, bond-yanShip-high (each fields 琳琅诗怀雅 with S2) and coop4-ABYSS-7 (a bot fields her from round 6) moved: her bombs land on x-6 / enemy tiles and are thrown without an enemy. --- .../kits/ops/chess_char_3_04-swire2.js | 96 +++++--- test/content/kits_t3.test.js | 90 ++++++-- test/content/summon_loadout_conflicts.test.js | 6 +- test/golden/bonds.json | 206 +++++++++++------- test/golden/matches.json | 20 +- test/golden/roster.json | 133 +++++++---- 6 files changed, 363 insertions(+), 188 deletions(-) diff --git a/server/sim/content/kits/ops/chess_char_3_04-swire2.js b/server/sim/content/kits/ops/chess_char_3_04-swire2.js index 3646bcf9..784f79f4 100644 --- a/server/sim/content/kits/ops/chess_char_3_04-swire2.js +++ b/server/sim/content/kits/ops/chess_char_3_04-swire2.js @@ -11,6 +11,13 @@ import { /** 琳琅诗怀雅 S3's coin range (PRTS 备注 "前方范围2-4"; range_table "2-4", facing right). */ const SWIRE2_COIN_GRID = Object.freeze([[1, 1], [0, 0], [0, 1], [0, 2], [-1, 1]]); +/** + * 琳琅诗怀雅 S2 “见面礼”'s placement range: range_table "x-6" — her tile and the two tiles beyond it in each of the four + * directions (symmetric: her facing does not matter). PRTS 备注 "香槟炸弹放置范围:x-6"; the client charpack (char_1033_swire2, + * mode S2) gives its SpawnToken selector `_rangeId` "x-6". The skill's own rangeId (1-1) is her attack range, not this. + */ +const SWIRE2_BOMB_GRID = Object.freeze([[2, 0], [1, 0], [0, -2], [0, -1], [0, 0], [0, 1], [0, 2], [-1, 0], [-2, 0]]); + /** Merchant trait with a callback on every successful DP payment (琳琅诗怀雅 大买家). Same rules as professions.js. */ function merchantInstall(onPay) { return (battle, unit) => { @@ -30,7 +37,8 @@ function merchantInstall(onPay) { } export default { - // ---- 3_04 琳琅诗怀雅 · 行商 — S2 “见面礼” (passive): each attack spends a coin to drop a champagne bomb in range; + // ---- 3_04 琳琅诗怀雅 · 行商 — S2 “见面礼” (passive): with a coin and a free tile of range x-6 her attack's turn + // throws a champagne bomb instead (onto an enemy's tile when one stands there; installS2); // 大买家: coin at skill start + coin & ATK stack per trait payment; 破财消灾: DP-paid revive (cost doubles) // S1 仗义疏财 (passive, 2 coins): a coin heals the most injured ally (< 70 % HP) of the 8 surrounding tiles for // attack@heal_scale × ATK — on her attack, or with no enemy to attack on her own attack timer (owner's decision @@ -118,6 +126,53 @@ export default { battle.on('attack', (ctx) => { if (ctx.attacker === unit) tryHeal(); }, { owner: unit, priority: -10 }); battle.on('tick', () => { if (unit.deployed && unit.canAct && !unit.trait?.hadTarget) tryHeal(); }, { owner: unit }); }; + /** + * “见面礼” — 「消耗一枚金币在范围内一个可放置且可通行的地面放置香槟炸弹」. The client charpack (char_1033_swire2, mode S2) + * makes her attack a priority composite: first the SpawnToken ability (animation Skill_2) whose trigger needs BOTH a + * tile of its selector (range x-6; melee-buildable, walkable, low ground — the tile options of the selector) and her + * coin buff (swire2_can_use_gold), else her normal attack (which needs a target). So a bomb takes her attack's turn, + * enemies or not: with no enemy around she still spends her coins on the free tiles of x-6 (PRTS 备注 「否则随机放置香槟 + * 至可部署的地块」), and only a full x-6 (or no coin) lets her coins pile up to the cap. Tile (PRTS 备注 「放置香槟动画进行 + * 前若放置范围内存在敌人,则按攻击索敌规律放置香槟至其所在地块」; the selector's `_targetMotion` WALK): the ground enemies + * standing on a free tile of x-6, in her attack's target order (blocked first, …, nearest the goal) — the first one's + * tile; with none, a random free tile of x-6. A free tile: inside the field, nobody on it, no knocked-out operator's + * tile (freeTile; an enemy on it does not count), walkable ground a melee unit may stand on (groundTile). + * [ASSUMED] timing: the throw is instant and costs her attack one tick (PRTS 备注 「每次放置香槟时若正在攻击敌人,会短暂 + * 延长攻击抬手间隔」 — the composite clears its cooldown when the throw ends; the length of the Skill_2 animation is in + * no table): `canAttack` holds her attack back while a throw is due and the 'tick' hook (after the attacks) throws + * when her attack is ready. Until 0.2.0 every attack also dropped a bomb on her 1-1 range, at random. + */ + const bombTiles = (battle, unit) => { + const out = []; + for (const k of gridKeys(SWIRE2_BOMB_GRID, unit)) { + const r = (k / COLS) | 0, c = k % COLS; + if (freeTile(battle, r, c) && groundTile(battle, r, c)) out.push(k); + } + return out; + }; + // (`bombHold`: a refused spawn — a tile freeTile let through — never holds her attack back for longer than one cycle) + const hasCoin = (battle, unit) => (unit.mem.coins ?? 0) >= coinCost && !(battle.time < (unit.mem.bombHold ?? -1)); + const throwDue = (battle, unit) => hasCoin(battle, unit) && bombTiles(battle, unit).length > 0; + const installS2 = (battle, unit) => { + const switchT = num(battle.tokenDef(tokenId, unit)?.skill?.bb?.duration_switch, 3); + const ground = { ...unit.profile, canHitFly: false }; + battle.on('tick', () => { + if (!alive(unit) || !unit.canAct || unit.atkCd > 1e-9 || unit.s.flags.disarm || !hasCoin(battle, unit)) return; + const keys = bombTiles(battle, unit); + if (!keys.length) return; + const free = new Set(keys); + let key = null; + for (const e of enemiesOn(battle, unit, keys, 0, ground)) { + const k = Math.round(e.y) * COLS + Math.round(e.x); + if (!e.isFlying && free.has(k)) { key = k; break; } + } + if (key == null) key = battle.rng.pick(keys); + const bomb = battle.spawnToken(unit, tokenId, (key / COLS) | 0, key % COLS, { untargetable: true, kit: bombKit(unit, switchT) }); + if (!bomb) { unit.mem.bombHold = battle.time + unit.s.interval; return; } + unit.mem.coins -= coinCost; + fx(battle, 'summon', bomb, { src: unit.id, token: tokenId, coins: unit.mem.coins }); + }, { owner: unit }); + }; const installS3 = (battle, unit) => { // 千金一掷: "击倒敌人时获得一枚金币" battle.on('kill', (ctx) => { if (ctx.killer === unit && ctx.victim.side === 'enemy' && unit.skill?.active) addCoins(battle, unit, 1); @@ -171,35 +226,24 @@ export default { }; }, }), - trait: { install: merchantInstall((battle, unit) => { - // MER-Y "每次特性消耗费用时攻击力+4%,最多可以叠加5次" (any time, not only during the skill) - if (modTal && num(modTal.atk) > 0) { - battle.addBuff(unit, { key: 'trait:swire2_module', refresh: 'stack', stacks: 1, maxStacks: Math.max(1, num(modTal.max_stack_cnt, 5)), mods: { atkPct: num(modTal.atk) } }); - } - if (!unit.skill?.active) return; // "技能期间" - addCoins(battle, unit, num(t0.trait_sp, 1)); - battle.addBuff(unit, { key: 'talent:swire2_buyer', refresh: 'stack', stacks: 1, maxStacks: Math.max(1, num(t0.max_stack_cnt, 8)), mods: { atkPct: num(t0.atk) } }); - }) }, + trait: { + // S2: a throw due takes her attack's turn (installS2) + ...(sel === S2 || sel == null ? { canAttack: (battle, unit) => !throwDue(battle, unit) } : {}), + install: merchantInstall((battle, unit) => { + // MER-Y "每次特性消耗费用时攻击力+4%,最多可以叠加5次" (any time, not only during the skill) + if (modTal && num(modTal.atk) > 0) { + battle.addBuff(unit, { key: 'trait:swire2_module', refresh: 'stack', stacks: 1, maxStacks: Math.max(1, num(modTal.max_stack_cnt, 5)), mods: { atkPct: num(modTal.atk) } }); + } + if (!unit.skill?.active) return; // "技能期间" + addCoins(battle, unit, num(t0.trait_sp, 1)); + battle.addBuff(unit, { key: 'talent:swire2_buyer', refresh: 'stack', stacks: 1, maxStacks: Math.max(1, num(t0.max_stack_cnt, 8)), mods: { atkPct: num(t0.atk) } }); + }), + }, install(battle, unit) { if (sel === S1) { installS1(battle, unit); return; } if (sel === S3) { installS3(battle, unit); return; } if (sel !== S2 && sel != null) return; - const switchT = num(battle.tokenDef(tokenId, unit)?.skill?.bb?.duration_switch, 3); - battle.on('attack', (ctx) => { - if (ctx.attacker !== unit || !alive(unit) || (unit.mem.coins ?? 0) < coinCost) return; - const tiles = []; - for (const k of gridKeys(skillGrid ?? unit.rangeGrid, unit)) { - const r = (k / COLS) | 0, c = k % COLS; - // (never on the home tile of a dead operator: it could not redeploy until an enemy triggers the bomb) - if (freeTile(battle, r, c) && groundTile(battle, r, c)) tiles.push([r, c]); - } - const tile = battle.rng.pick(tiles); - if (!tile) return; - const bomb = battle.spawnToken(unit, tokenId, tile[0], tile[1], { untargetable: true, kit: bombKit(unit, switchT) }); - if (!bomb) return; - unit.mem.coins -= coinCost; - fx(battle, 'summon', bomb, { src: unit.id, token: tokenId, coins: unit.mem.coins }); - }, { owner: unit, priority: -10 }); + installS2(battle, unit); }, talents: [ { install(battle, unit) { // 大买家: "开启技能时获得1枚金币" (a passive starts at every deployment, S3 when cast) diff --git a/test/content/kits_t3.test.js b/test/content/kits_t3.test.js index f2d5e461..a416456a 100644 --- a/test/content/kits_t3.test.js +++ b/test/content/kits_t3.test.js @@ -6,6 +6,7 @@ import { makeBattle, enemyRec, checkInvariants } from '../helpers/battleHarness. import { getDefaultSource } from '../../server/sim/simdata.js'; import { effectiveProfile } from '../../server/sim/ai.js'; import KITS from '../../server/sim/content/kits/tier3.js'; +import { COLS } from '../../server/sim/constants.js'; const ds = getDefaultSource(); const D = (id) => ds.getChess(id); @@ -110,23 +111,38 @@ test('3_03 诗怀雅: 近距离作战指导 melee ATK aura, ×talent_scale durin done(h); }); -test('3_04 琳琅诗怀雅: coins → champagne bomb (ATK% + 停顿), 大买家 coin/ATK per DP payment, 破财消灾 DP revive', () => { +/** 琳琅诗怀雅 S2's placement range x-6 (range_table; PRTS 备注 "香槟炸弹放置范围:x-6") — symmetric, so facing does not matter. */ +const SWIRE_X6 = [[2, 0], [1, 0], [0, -2], [0, -1], [0, 0], [0, 1], [0, 2], [-1, 0], [-2, 0]]; +const TRAP = 'token_10031_swire2_gdtrap'; +const trapsOf = (h) => h.b.allyUnits.filter((t) => t.alive && t.defId === TRAP); +const x6Keys = (r, c) => new Set(SWIRE_X6.map(([dr, dc]) => (r + dr) * COLS + c + dc)); +/** Flat stage where the only free placeable tile of x-6 around (9,5) is (9,6): the others are walkable 'R' road. */ +const ONE_TILE = { rows: { 9: '##ERRrrRrrSrrrrrrrS##', 10: '##hrrRrrrrfrrrrrrrf##', 11: '##hrrRrrrrfrrrrrrrf##' } }; + +test('3_04 琳琅诗怀雅: coins → champagne bombs on range x-6 with no enemy needed (ATK% + 停顿), 大买家 coin/ATK per DP payment, 破财消灾 DP revive', () => { const id = 'chess_char_3_04_a', bb = BB(id), t0 = TB(id, 0), t1 = TB(id, 1); const booms = []; const h = makeBattle({ defs: { enemies: { enemy_w: enemyRec({ key: 'enemy_w', hp: 1e6, speed: 1, def: 0, atk: 0 }) } }, timeLimit: 60, hooks: ['damaged', 'deploy'], captureNoisy: true, - units: [{ chessId: id, row: 9, col: 5 }], enemies: [{ key: 'enemy_w', route: 0 }], + units: [{ chessId: id, row: 9, col: 5 }], enemies: [{ key: 'enemy_w', route: 0, time: 8 }], setup: (b) => b.on('damaged', (c) => { if (c.dmg?.tags?.includes('trap')) booms.push({ amount: c.amount, atk: c.source.s.atk, t: b.time }); }), }); const u = h.unit(id); + const x6 = x6Keys(9, 5); h.step(); - assert.equal(u.mem.coins, t0.sp, '开启技能 coin'); + // the 开启技能 coin (大买家) is thrown at once — her attack's turn, nobody on the field (client charpack: the S2 attack is + // [SpawnToken if a free x-6 tile and a coin, else Attack]; PRTS 备注 "否则随机放置香槟至可部署的地块") + assert.equal(trapsOf(h).length, t0.sp, 'the deployment coin became a bomb with no enemy around'); + assert.equal(u.mem.coins, 0); h.run(3.1); - assert.equal(u.mem.coins, t0.sp + t0.trait_sp, 'coin from the first trait payment'); - assert.equal(u.findBuff('talent:swire2_buyer')?.stacks, 1); + assert.equal(u.findBuff('talent:swire2_buyer')?.stacks, 1, 'first trait payment: an ATK stack'); approx(u.s.atk, u.base.atk * (1 + t0.atk)); - assert.ok(h.runUntil(() => booms.length > 0, 20), 'bomb exploded'); - assert.ok(h.hooksOf('deploy').some((c) => c.unit.defId === 'token_10031_swire2_gdtrap'), 'bomb token placed'); + assert.equal(trapsOf(h).length, t0.sp + t0.trait_sp, '… and its coin another bomb'); + for (const t of trapsOf(h)) { + assert.ok(x6.has(t.tileR * COLS + t.tileC), `bomb (${t.tileR},${t.tileC}) on range x-6`); + assert.ok(h.b.grid.groundPassable(t.tileR, t.tileC) && h.b.grid.canStand(t.tileR, t.tileC), 'on walkable ground a melee unit may stand on'); + } + assert.ok(h.runUntil(() => booms.length > 0, 30), 'bomb exploded'); approx(booms[0].amount, booms[0].atk * bb.atk_scale, 1e-6, 'bomb damage'); const e = h.enemy('enemy_w'); assert.ok(e.findBuff('sluggish'), '停顿'); @@ -846,33 +862,37 @@ test('3_02 断崖: 浮游刃 blades hit enemies blocked by the allies around her done(h); }); -test('3_04 琳琅诗怀雅 精锐: MER-X drain, coin cap, armed bomb hits twice; bombs never land on a dead operator’s tile', () => { +test('3_04 琳琅诗怀雅 精锐: MER-X drain; no enemy ⇒ coins fill every free tile of x-6, then pile up to the cap; armed bomb hits twice; never on a dead operator’s tile', () => { const gid = 'chess_char_3_04_b', bb = BB(gid), t0 = TB(gid, 0), tb = TR(gid); - // drain + coin cap (no enemy: no attack spends a coin) - const q = makeBattle({ units: [{ chessId: gid, row: 9, col: 5 }], timeLimit: 60, flags: { dpPerSec: 0 } }); + // drain; no enemy: every coin becomes a bomb on a free tile of x-6 until none is left, then the coins pile up to the cap + const q = makeBattle({ units: [{ chessId: gid, row: 9, col: 5 }], timeLimit: 90, flags: { dpPerSec: 0 } }); const s = q.unit(gid); q.step(); - q.b.getPlayer('p1').dp = 50; + q.b.getPlayer('p1').dp = 90; q.run(3.1); - approx(q.b.getPlayer('p1').dp, 50 - Math.abs(tb.cost), 1e-6, 'module: 2 DP per payment'); - q.run(tb.interval * (bb.sp + 1)); + approx(q.b.getPlayer('p1').dp, 90 - Math.abs(tb.cost), 1e-6, 'module: 2 DP per payment'); + // the flat field around (9,5): x-6 has 6 free placeable tiles (row 9 cols 3/4/6/7, (10,5), (11,5); rows 7/8 are no field) + const free = [...x6Keys(9, 5)].filter((k) => { const r = (k / COLS) | 0, c = k % COLS; return !(r === 9 && c === 5) && q.b.grid.groundPassable(r, c) && q.b.grid.canStand(r, c); }); + assert.equal(free.length, 6); + q.run(tb.interval * (free.length + bb.sp + 1)); + assert.deepEqual(trapsOf(q).map((t) => t.tileR * COLS + t.tileC).sort((a, b) => a - b), free.sort((a, b) => a - b), 'a bomb on every free tile of x-6'); const paid = Math.floor((q.b.time + 1e-9) / tb.interval); - assert.equal(s.mem.coins, bb.sp, 'coin cap = bb.sp'); + assert.equal(s.mem.coins, bb.sp, 'x-6 full: coin cap = bb.sp'); assert.equal(s.findBuff('talent:swire2_buyer').stacks, Math.min(t0.max_stack_cnt, paid), 'ATK stack per payment (coins capped, stacks not)'); done(q); - // a bomb that stayed duration_switch s on the field hits twice + // a bomb that stayed duration_switch s on the field hits twice (only (9,6) is free: the walker comes to it after 3 s) const booms = []; const h = makeBattle({ + flat: ONE_TILE, defs: { enemies: { enemy_d: dummy('enemy_d'), enemy_w: enemyRec({ key: 'enemy_w', hp: 1e6, speed: 1, def: 0, atk: 0 }) } }, timeLimit: 60, units: [{ chessId: gid, row: 9, col: 5 }], enemies: [{ key: 'enemy_d', pos: [9, 5] }, { key: 'enemy_w', route: 0, time: 1 }], setup: (b) => b.on('damaged', (c) => { if (c.dmg?.tags?.includes('trap')) booms.push({ target: c.target.defId, amount: c.amount, atk: c.source.s.atk, t: b.time }); }), }); - const u = h.unit(gid); - const switchT = ds.getToken('token_10031_swire2_gdtrap', gid).skill.bb.duration_switch; - assert.ok(h.runUntil(() => h.b.allyUnits.some((t) => t.alive && t.defId === 'token_10031_swire2_gdtrap'), 5), 'bomb placed in front of her'); - const bomb = h.b.allyUnits.find((t) => t.alive && t.defId === 'token_10031_swire2_gdtrap'); - assert.deepEqual([bomb.tileR, bomb.tileC], [9, 6]); + const switchT = ds.getToken(TRAP, gid).skill.bb.duration_switch; + assert.ok(h.runUntil(() => trapsOf(h).length > 0, 5), 'bomb placed'); + const bomb = trapsOf(h)[0]; + assert.deepEqual([bomb.tileR, bomb.tileC], [9, 6], 'the one free tile of x-6'); assert.ok(h.runUntil(() => booms.length > 0, 30), 'the walker triggered it'); assert.ok(booms[0].t - bomb.deployedAt >= switchT); assert.equal(booms.length, 2, 'armed bomb: one extra hit'); @@ -880,8 +900,9 @@ test('3_04 琳琅诗怀雅 精锐: MER-X drain, coin cap, armed bomb hits twice; assert.ok(h.enemy('enemy_w').findBuff('sluggish')); done(h); - // the tile in front belongs to a dead operator waiting to redeploy: no bomb there (no coin spent) + // that one tile belongs to a dead operator waiting to redeploy: no bomb anywhere, no coin spent, and she attacks on const k = makeBattle({ + flat: ONE_TILE, defs: { enemies: { enemy_d: dummy('enemy_d') } }, timeLimit: 30, units: [{ chessId: gid, row: 9, col: 5 }, { chessId: 'chess_char_3_16_a', row: 9, col: 6 }], enemies: [{ key: 'enemy_d', pos: [9, 5], time: 0.5 }], }); @@ -892,11 +913,36 @@ test('3_04 琳琅诗怀雅 精锐: MER-X drain, coin cap, armed bomb hits twice; const coins = v.mem.coins; k.run(5); assert.ok(v.stats.attacks >= 2, 'she kept attacking'); - assert.equal(k.b.allyUnits.filter((t) => t.defId === 'token_10031_swire2_gdtrap').length, 0, 'no bomb on the dead operator’s tile'); + assert.equal(k.b.allyUnits.filter((t) => t.defId === TRAP).length, 0, 'no bomb on the dead operator’s tile'); assert.ok(v.mem.coins >= coins, 'no coin spent'); done(k); }); +test('3_04 琳琅诗怀雅 S2 见面礼: an enemy on a free tile of x-6 gets the bomb on its tile — ground only, in her attack target order; outside her 1-1 attack range too', () => { + const id = 'chess_char_3_04_a'; + const bombAt = (enemies) => { + const h = makeBattle({ + defs: { enemies: { enemy_d: dummy('enemy_d'), enemy_f: dummy('enemy_f', { motion: 'FLY' }) } }, timeLimit: 10, autoFinish: false, + units: [{ chessId: id, row: 9, col: 5 }], enemies, + }); + const u = h.unit(id); + h.step(); + for (const t of trapsOf(h)) h.b.retreat(t, { reason: 'expired', permanent: true }); // the deployment coin's bomb + h.step(2); + u.mem.coins = 1; + assert.ok(h.runUntil(() => trapsOf(h).length > 0, 2), 'a bomb'); + const t = trapsOf(h)[0]; + done(h); + return [t.tileR, t.tileC]; + }; + // (9,7): two tiles ahead — x-6 but outside her attack range 1-1 + assert.deepEqual(bombAt([{ key: 'enemy_d', pos: [9, 7] }]), [9, 7]); + // two ground enemies: the one nearer the goal (9,2) first (her attack target order: blocked → … → remaining distance) + assert.deepEqual(bombAt([{ key: 'enemy_d', pos: [9, 7] }, { key: 'enemy_d', pos: [9, 4] }]), [9, 4]); + // a flyer is no target of the selector (its `_targetMotion` WALK): the ground enemy farther from the goal gets it + assert.deepEqual(bombAt([{ key: 'enemy_d', pos: [9, 7] }, { key: 'enemy_f', pos: [9, 4], route: 2 }]), [9, 7]); +}); + test('3_07 见行者: 惊爆射击 fires on an enemy inside the skill range only; 精锐 refund only on a ranged tile', () => { const id = 'chess_char_3_07_a', bb = BB(id); const h = makeBattle({ diff --git a/test/content/summon_loadout_conflicts.test.js b/test/content/summon_loadout_conflicts.test.js index 2af5b0ff..c309317e 100644 --- a/test/content/summon_loadout_conflicts.test.js +++ b/test/content/summon_loadout_conflicts.test.js @@ -125,8 +125,10 @@ test('琳琅诗怀雅: a 香槟炸弹 arms after its owner\'s module variant of chessId: SWIRE, lo, tokens, row: 9, col: 5, enemies: { enemy_d: dummy('enemy_d') }, spawns: [{ key: 'enemy_d', pos: [9, 5] }, { key: 'enemy_d', pos: [9, 13] }], }); - for (const u of ops) { u.mem.coins = 5; u.player.dp = 99; } - // the moment a bomb stands, an enemy steps on it (the bomb is < 1 tick old) + // each threw its deployment coin's bomb in duel's first step (S2 needs no enemy); no other coin before the 3 s payment, + // so every trap hit below is that bomb's + for (const u of ops) { u.mem.coins = 0; u.player.dp = 99; } + // the moment a bomb stands, an enemy steps on it (the bomb is a tick old) const bombs = [null, null]; for (let i = 0; i < 30 * 10 && bombs.some((x) => !x); i++) { h.step(); diff --git a/test/golden/bonds.json b/test/golden/bonds.json index c7173f90..20358332 100644 --- a/test/golden/bonds.json +++ b/test/golden/bonds.json @@ -404,33 +404,49 @@ "round": 5, "seed": 411444759, "waveId": "act1autochess_05", - "time": 74, - "ticks": 2220, + "time": 83.27, + "ticks": 2498, "reason": "cleared", "killed": 18, "total": 18, "unspawned": 0, "bossHpLeft": null, - "rngDraws": 19, + "rngDraws": 31, "errors": {"count":0,"kinds":[]}, - "players": {"p1":{"killed":18,"total":18,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":67950,"bossDmg":0,"heal":2256,"deaths":2,"layerGains":{}}}, + "players": {"p1":{"killed":18,"total":18,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":67950,"bossDmg":0,"heal":731,"deaths":2,"layerGains":{}}}, "units": [ ["p1",1,"op","chess_char_4_17_a",1,null,2849,1,3,0,0,0,0,0,0], - ["p1",2,"op","chess_char_4_18_a",1,null,4587.2,1,4,0,3682,0,0,9,1], - ["p1",3,"op","chess_char_5_14_a",1,null,1440.77,1,5,2,9885,1432,1321,28,5], - ["p1",4,"op","chess_char_4_19_a",2,null,0,0,8,0,1476,1560,0,15,1], - ["p1",5,"op","chess_char_3_04_a",1,null,976.8,1,9,1,6666,3012,0,28,0], - ["p1",6,"op","chess_char_4_16_a",2,null,938,1,29,6,21523,1609,55,22,0], - ["p1",7,"op","chess_char_2_19_a",1,null,593.08,1,6,4,12320,1153,880,25,2], - ["p1",8,"op","chess_char_4_20_a",2,null,1217,1,7,5,12397,155,0,20,1], + ["p1",2,"op","chess_char_4_18_a",1,null,4587.2,1,4,1,5089,0,0,14,1], + ["p1",3,"op","chess_char_5_14_a",1,null,1388,1,5,0,8599,895,731,29,5], + ["p1",4,"op","chess_char_4_19_a",2,null,487.76,1,8,2,3429,1072,0,21,1], + ["p1",5,"op","chess_char_3_04_a",1,null,667.08,1,9,4,17229,2310,0,29,0], + ["p1",6,"op","chess_char_4_16_a",2,null,1246,1,42,4,11741,1246,0,20,0], + ["p1",7,"op","chess_char_2_19_a",1,null,0,0,6,4,9565,1021,0,24,1], + ["p1",8,"op","chess_char_4_20_a",2,null,1009.8,1,7,3,12298,207,0,17,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] + ["-","~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,1,11,0,0,0,0,0,null], + ["p1","~2","token","token_10031_swire2_gdtrap",null,null,1000,0,13,0,0,0,0,0,null], + ["p1","~3","token","token_10031_swire2_gdtrap",null,null,1000,0,14,0,0,0,0,0,null], + ["p1","~4","token","token_10031_swire2_gdtrap",null,null,1000,0,16,0,0,0,0,0,null], + ["p1","~5","token","token_10031_swire2_gdtrap",null,null,1000,0,19,0,0,0,0,0,null], + ["p1","~6","token","token_10031_swire2_gdtrap",null,null,1000,0,22,0,0,0,0,0,null], + ["p1","~7","token","token_10031_swire2_gdtrap",null,null,1000,0,24,0,0,0,0,0,null], + ["p1","~8","token","token_10031_swire2_gdtrap",null,null,1000,0,27,0,0,0,0,0,null], + ["p1","~9","token","token_10031_swire2_gdtrap",null,null,1000,0,29,0,0,0,0,0,null], + ["p1","~10","token","token_10031_swire2_gdtrap",null,null,1000,0,32,0,0,0,0,0,null], + ["p1","~11","token","token_10031_swire2_gdtrap",null,null,1000,0,34,0,0,0,0,0,null], + ["p1","~12","token","token_10031_swire2_gdtrap",null,null,1000,0,36,0,0,0,0,0,null], + ["p1","~13","token","token_10031_swire2_gdtrap",null,null,1000,0,39,0,0,0,0,0,null], + ["p1","~14","token","token_10031_swire2_gdtrap",null,null,1000,0,43,0,0,0,0,0,null], + ["p1","~15","token","token_10031_swire2_gdtrap",null,null,1000,1,44,0,0,0,0,0,null], + ["p1","~16","token","token_10031_swire2_gdtrap",null,null,1000,1,45,0,0,0,0,0,null] ], - "enemies": {"enemy_1158_divman":[15,15,0,1502,44550],"enemy_1160_hvyslr":[2,2,0,4278,18000],"enemy_1161_tidmag":[1,1,0,3141,5400]}, - "hooks": [1,29,2220,218,218,320,333,873,22,20,10,11,0,6407,56,13,18,0,1,24,0,1,4], - "events": {"atk":230,"deploy":9,"die":20,"dmg":330,"fx":56,"heal":15,"skill":20,"spawn":28,"status":91}, - "fx": {"aoe":6,"burst":1,"coin":3,"dodge":4,"featherArrow":1,"flame":1,"garrisonGrant":1,"revive":2,"riposte":2,"rockslide":1,"shieldBreak":3,"sp":1,"swordRain":24,"swordStorm":4,"zone":2}, - "snaps": "2c541cfb 0ae48a43 925d647c 53a13217 eac29867 1fbdf53e c6fbac92 c060336e" + "enemies": {"enemy_1158_divman":[15,15,0,1399,44550],"enemy_1160_hvyslr":[2,2,0,3890,18000],"enemy_1161_tidmag":[1,1,0,1463,5400]}, + "hooks": [1,45,2498,223,223,306,307,478,21,33,9,10,0,6503,44,10,18,0,1,22,0,0,9], + "events": {"atk":234,"deploy":25,"die":33,"dmg":303,"fx":89,"skill":18,"spawn":44,"status":70}, + "fx": {"aoe":6,"coin":19,"dodge":9,"explode":13,"featherArrow":1,"flame":1,"garrisonGrant":1,"revive":1,"riposte":7,"rockslide":1,"shieldBreak":4,"summon":16,"swordRain":6,"swordStorm":3,"zone":1}, + "snaps": "df1c09b6 c5c9f7d2 71bce589 e2853803 32ae9ac8 34b10ae9 82dae7e0 86ec8e63 94c9fbcb" }, "bond-investShip-high": { "about": "投资人 high: tier 1 layers 999; chess_char_5_14_b chess_char_5_05_b chess_char_5_06_b chess_char_3_04_b chess_char_5_07_b chess_char_2_19_b chess_char_5_02_b chess_char_5_03_b", @@ -556,39 +572,43 @@ "round": 5, "seed": 478830708, "waveId": "act1autochess_05", - "time": 43.93, - "ticks": 1318, + "time": 43.83, + "ticks": 1315, "reason": "cleared", "killed": 27, "total": 27, "unspawned": 0, "bossHpLeft": null, - "rngDraws": 19, + "rngDraws": 23, "errors": {"count":0,"kinds":[]}, "players": {"p1":{"killed":27,"total":27,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":58590,"bossDmg":0,"heal":0,"deaths":0,"layerGains":{"miraShip":1}}}, "units": [ ["p1",1,"op","chess_char_1_02_a",1,null,2216,1,4,0,0,0,0,0,0], ["p1",2,"op","chess_char_3_02_a",1,null,1911,1,5,0,0,0,0,0,0], ["p1",3,"op","chess_char_3_03_a",1,null,1378,1,8,3,8357,0,0,12,0], - ["p1",4,"op","chess_char_3_04_a",1,null,1864,1,10,9,8386,0,0,9,0], + ["p1",4,"op","chess_char_3_04_a",1,null,1864,1,10,13,11264,0,0,9,0], ["p1",5,"op","chess_char_2_05_a",1,null,1411.2,1,6,0,0,0,0,0,0], - ["p1",6,"op","chess_char_3_11_a",1,null,1447.6,1,7,6,4085,0,0,5,2], + ["p1",6,"op","chess_char_3_11_a",1,null,1447.6,1,7,2,1207,0,0,4,2], ["p1",7,"op","chess_char_4_26_a",0,null,1368,1,9,0,0,0,0,0,0], ["p1",8,"op","chess_char_3_01_a",2,null,1471.8,1,11,9,37762,0,0,38,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], - ["p1","~1","token","token_10031_swire2_gdtrap",null,null,1000,0,15,0,0,0,0,0,null], - ["p1","~2","token","token_10031_swire2_gdtrap",null,null,1000,0,33,0,0,0,0,0,null], - ["p1","~3","token","token_10031_swire2_gdtrap",null,null,1000,0,37,0,0,0,0,0,null], - ["p1","~4","token","token_10031_swire2_gdtrap",null,null,1000,0,38,0,0,0,0,0,null], - ["p1","~5","token","token_10031_swire2_gdtrap",null,null,1000,1,41,0,0,0,0,0,null] + ["p1","~1","token","token_10031_swire2_gdtrap",null,null,1000,0,12,0,0,0,0,0,null], + ["p1","~2","token","token_10031_swire2_gdtrap",null,null,1000,0,14,0,0,0,0,0,null], + ["p1","~3","token","token_10031_swire2_gdtrap",null,null,1000,0,15,0,0,0,0,0,null], + ["p1","~4","token","token_10031_swire2_gdtrap",null,null,1000,0,19,0,0,0,0,0,null], + ["p1","~5","token","token_10031_swire2_gdtrap",null,null,1000,0,35,0,0,0,0,0,null], + ["p1","~6","token","token_10031_swire2_gdtrap",null,null,1000,0,39,0,0,0,0,0,null], + ["p1","~7","token","token_10031_swire2_gdtrap",null,null,1000,0,41,0,0,0,0,0,null], + ["p1","~8","token","token_10031_swire2_gdtrap",null,null,1000,0,42,0,0,0,0,0,null], + ["p1","~9","token","token_10031_swire2_gdtrap",null,null,1000,1,43,0,0,0,0,0,null] ], "enemies": {"enemy_1000_gopro_2":[19,19,0,0,29070],"enemy_1325_cbgpro":[5,5,0,0,17100],"enemy_1325_cbgpro_2":[3,3,0,0,12420]}, - "hooks": [1,43,1318,64,64,120,120,0,27,31,3,3,0,5234,1,0,27,0,1,27,1,0,0], - "events": {"atk":64,"deploy":13,"die":31,"dmg":120,"fx":37,"layer":1,"skill":6,"spawn":43,"status":2}, - "fx": {"buff":1,"coin":8,"explode":4,"garrison":1,"garrisonGrant":1,"spGift":13,"strike":2,"summon":5,"volley":2}, - "snaps": "75591eda 13ef5faa 3682393e a23e5fa6 5d4daa5d" + "hooks": [1,47,1315,63,63,120,120,0,27,35,3,3,0,5130,1,0,27,0,1,27,1,0,0], + "events": {"atk":63,"deploy":17,"die":35,"dmg":120,"fx":50,"layer":1,"skill":6,"spawn":47,"status":2}, + "fx": {"buff":1,"coin":12,"explode":8,"garrison":1,"garrisonGrant":1,"spGift":14,"strike":2,"summon":9,"volley":2}, + "snaps": "907cbf77 fce5049b cd63c811 19d26f73 4b87ef36" }, "bond-kjeragShip-high": { "about": "谢拉格 high: tier 2 layers 999; chess_char_1_02_b chess_char_5_11_b chess_char_2_05_b chess_char_3_11_b chess_char_3_14_b chess_char_3_20_b chess_char_4_13_b chess_char_5_12_b", @@ -1104,31 +1124,32 @@ "round": 5, "seed": 3227754780, "waveId": "act1autochess_05", - "time": 73.8, - "ticks": 2214, + "time": 75.87, + "ticks": 2276, "reason": "cleared", "killed": 19, "total": 19, "unspawned": 0, "bossHpLeft": null, - "rngDraws": 17, + "rngDraws": 18, "errors": {"count":0,"kinds":[]}, "players": {"p1":{"killed":19,"total":19,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":91584,"bossDmg":0,"heal":0,"deaths":5,"layerGains":{}}}, "units": [ ["p1",1,"op","chess_char_3_06_a",1,null,0,0,2,0,7305,3246,0,1,1], ["p1",2,"op","chess_char_1_08_a",1,null,0,0,5,0,4798,2056,0,10,1], ["p1",3,"op","chess_char_2_16_a",1,null,0,0,6,1,10272,1791,0,27,0], - ["p1",4,"op","chess_char_3_02_a",1,null,0,0,3,4,15777,1911,0,32,1], + ["p1",4,"op","chess_char_3_02_a",1,null,0,0,3,3,16017,1911,0,32,1], ["p1",5,"op","chess_char_3_03_a",1,null,0,0,7,3,11972,1378,0,26,0], - ["p1",6,"op","chess_char_3_04_a",1,null,995.2,1,4,2,2522,869,0,5,0], - ["p1",7,"op","chess_char_3_05_a",2,null,489.26,1,8,7,27192,2807,0,27,1], - ["p1",8,"op","chess_char_1_07_a",0,null,1215,1,1,2,11747,0,0,17,0] + ["p1",6,"op","chess_char_3_04_a",1,null,657.2,1,4,2,3765,1207,0,7,0], + ["p1",7,"op","chess_char_3_05_a",2,null,264.46,1,8,7,27192,2807,0,27,1], + ["p1",8,"op","chess_char_1_07_a",0,null,1215,1,1,3,10265,0,0,17,0], + ["p1","~1","token","token_10031_swire2_gdtrap",null,null,1000,1,9,0,0,0,0,0,null] ], - "enemies": {"enemy_1010_demon":[3,3,0,7576,25920],"enemy_1010_demon_2":[1,1,0,5601,17280],"enemy_1071_dftman":[15,15,0,880,48384]}, - "hooks": [1,27,2214,233,233,292,318,0,24,24,4,3,0,4409,27,28,19,0,1,24,0,0,0], - "events": {"atk":233,"deploy":8,"die":24,"dmg":318,"fx":50,"skill":7,"spawn":27,"status":53}, - "fx": {"aoe":8,"coin":3,"crit":7,"dp":1,"strike":31}, - "snaps": "a194c978 d501eda8 b671f9fb e2590e39 2ab25c9c 6714c2bf ff63f649 9794310b" + "enemies": {"enemy_1010_demon":[3,3,0,7576,25920],"enemy_1010_demon_2":[1,1,0,5939,17280],"enemy_1071_dftman":[15,15,0,880,48384]}, + "hooks": [1,28,2276,236,236,295,321,0,24,24,4,4,0,4463,27,28,19,0,1,24,0,0,0], + "events": {"atk":236,"deploy":9,"die":24,"dmg":321,"fx":49,"skill":8,"spawn":28,"status":53}, + "fx": {"aoe":8,"coin":4,"crit":4,"dp":1,"strike":31,"summon":1}, + "snaps": "d4f0d969 5a4a40d8 3c484b76 f753e450 fed0cb7c d3cbad3a dfeb64fc 00fe3b71" }, "bond-siracusaShip-high": { "about": "叙拉古 high: tier 2 layers 999; chess_char_1_08_b chess_char_2_16_b chess_char_3_18_b chess_char_5_01_b chess_char_1_07_b chess_char_3_19_b chess_char_4_10_b chess_char_4_26_b token_10028_vigil_wolf", @@ -1569,33 +1590,50 @@ "round": 5, "seed": 4091762637, "waveId": "act1autochess_05", - "time": 63.57, - "ticks": 1907, + "time": 66.17, + "ticks": 1985, "reason": "cleared", - "killed": 15, + "killed": 17, "total": 17, "unspawned": 0, "bossHpLeft": null, - "rngDraws": 0, + "rngDraws": 6, "errors": {"count":0,"kinds":[]}, - "players": {"p1":{"killed":15,"total":17,"perfect":false,"leaks":2,"leaksUncounted":0,"coins":0,"dmg":118546,"bossDmg":0,"heal":4259,"deaths":4,"layerGains":{}}}, + "players": {"p1":{"killed":17,"total":17,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":122744,"bossDmg":0,"heal":5709,"deaths":1,"layerGains":{}}}, "units": [ - ["p1",1,"op","chess_char_3_06_a",1,null,0,0,6,2,22919,5544,0,17,1], - ["p1",2,"op","chess_char_3_02_a",1,null,0,0,7,3,33118,2951,0,26,1], - ["p1",3,"op","chess_char_3_03_a",1,null,0,0,5,1,3193,1378,0,7,0], - ["p1",4,"op","chess_char_3_04_a",1,null,0,0,8,1,7355,3834,0,12,0], - ["p1",5,"op","chess_char_3_05_a",2,null,5435.3,1,9,4,32993,212,0,27,1], - ["p1",6,"op","chess_char_1_06_a",1,null,1137,1,3,4,14550,0,1503,32,1], - ["p1",7,"op","chess_char_2_05_a",1,null,1411.2,1,4,0,0,0,2757,18,1], + ["p1",1,"op","chess_char_3_06_a",1,null,363.83,1,6,4,23398,6256,0,17,1], + ["p1",2,"op","chess_char_3_02_a",1,null,0,0,7,5,35248,2988,0,25,1], + ["p1",3,"op","chess_char_3_03_a",1,null,1378,1,5,0,0,0,0,0,0], + ["p1",4,"op","chess_char_3_04_a",1,null,1864,1,8,1,21821,0,0,0,0], + ["p1",5,"op","chess_char_3_05_a",2,null,5435.3,1,9,5,20785,1251,0,21,1], + ["p1",6,"op","chess_char_1_06_a",1,null,1137,1,3,2,17074,0,2564,36,1], + ["p1",7,"op","chess_char_2_05_a",1,null,1411.2,1,4,0,0,0,3145,22,1], ["p1",8,"op","chess_char_2_10_a",1,null,1078,1,10,0,4419,0,0,29,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] + ["-","~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","~2","token","token_10031_swire2_gdtrap",null,null,1000,0,16,0,0,0,0,0,null], + ["p1","~3","token","token_10031_swire2_gdtrap",null,null,1000,0,17,0,0,0,0,0,null], + ["p1","~4","token","token_10031_swire2_gdtrap",null,null,1000,0,18,0,0,0,0,0,null], + ["p1","~5","token","token_10031_swire2_gdtrap",null,null,1000,0,20,0,0,0,0,0,null], + ["p1","~6","token","token_10031_swire2_gdtrap",null,null,1000,0,23,0,0,0,0,0,null], + ["p1","~7","token","token_10031_swire2_gdtrap",null,null,1000,0,25,0,0,0,0,0,null], + ["p1","~8","token","token_10031_swire2_gdtrap",null,null,1000,0,27,0,0,0,0,0,null], + ["p1","~9","token","token_10031_swire2_gdtrap",null,null,1000,0,31,0,0,0,0,0,null], + ["p1","~10","token","token_10031_swire2_gdtrap",null,null,1000,0,34,0,0,0,0,0,null], + ["p1","~11","token","token_10031_swire2_gdtrap",null,null,1000,0,36,0,0,0,0,0,null], + ["p1","~12","token","token_10031_swire2_gdtrap",null,null,1000,0,37,0,0,0,0,0,null], + ["p1","~13","token","token_10031_swire2_gdtrap",null,null,1000,0,40,0,0,0,0,0,null], + ["p1","~14","token","token_10031_swire2_gdtrap",null,null,1000,0,41,0,0,0,0,0,null], + ["p1","~15","token","token_10031_swire2_gdtrap",null,null,1000,0,42,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] ], - "enemies": {"enemy_1116_liprr":[11,11,0,389,69696],"enemy_1116_liprr_2":[4,4,0,319,34560],"enemy_1118_lidbox_2":[2,0,2,13211,18290]}, - "hooks": [1,27,1907,236,236,388,417,42,19,21,6,5,0,6837,0,20,17,2,1,20,0,0,0], - "events": {"atk":236,"deploy":8,"die":19,"dmg":417,"fx":57,"heal":32,"leak":2,"skill":10,"spawn":27,"status":30}, - "fx": {"aoe":7,"coin":3,"counter":3,"liberate":5,"overload":1,"revive":1,"strike":36,"taunt":1}, - "snaps": "0e312a6e 45b64065 23e7a18c 93f3311a 14f12d67 80b532e0 88f0c499" + "enemies": {"enemy_1116_liprr":[11,11,0,305,69696],"enemy_1116_liprr_2":[4,4,0,429,34560],"enemy_1118_lidbox_2":[2,2,0,9762,21888]}, + "hooks": [1,44,1985,210,210,367,394,52,18,34,6,3,0,6985,15,16,17,0,1,18,0,1,0], + "events": {"atk":210,"deploy":25,"die":34,"dmg":394,"fx":114,"heal":42,"skill":9,"spawn":44,"status":48}, + "fx": {"aoe":10,"burst":1,"coin":20,"counter":5,"explode":16,"liberate":3,"overload":1,"strike":40,"summon":17,"taunt":1}, + "snaps": "3a6154e2 bbed839c a9f7e3a7 6188d11f 10942c2a 87afa844 aaba7e24" }, "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", @@ -1759,42 +1797,48 @@ "round": 10, "seed": 3858016853, "waveId": "act1autochess_h03", - "time": 79.27, - "ticks": 2378, + "time": 75.67, + "ticks": 2270, "reason": "cleared", "killed": 21, "total": 21, "unspawned": 0, "bossHpLeft": null, - "rngDraws": 4, + "rngDraws": 10, "errors": {"count":0,"kinds":[]}, - "players": {"p1":{"killed":21,"total":21,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":262471,"bossDmg":0,"heal":3055,"deaths":0,"layerGains":{}}}, + "players": {"p1":{"killed":21,"total":21,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":263171,"bossDmg":0,"heal":6273,"deaths":0,"layerGains":{}}}, "units": [ ["p1",1,"op","chess_char_4_17_b",1,"uniequip_002_hsguma",3513,1,8,0,0,0,0,0,0], - ["p1",2,"op","chess_char_6_03_b",2,"uniequip_002_yu",3430,1,6,0,0,0,927,0,1], + ["p1",2,"op","chess_char_6_03_b",2,"uniequip_002_yu",3430,1,6,0,0,0,0,0,0], ["p1",3,"op","chess_char_3_03_b",1,"uniequip_002_swire",1898,1,9,0,0,0,0,0,0], - ["p1",4,"op","chess_char_3_04_b",1,"uniequip_002_swire2",2323,1,11,8,63747,0,0,4,0], + ["p1",4,"op","chess_char_3_04_b",1,"uniequip_002_swire2",2323,1,11,8,64447,0,0,0,0], ["p1",5,"op","chess_char_1_03_b",1,"uniequip_002_leizi",1391,1,4,0,0,0,0,4,1], ["p1",6,"op","chess_char_2_04_b",1,"uniequip_002_grabds",1270,1,5,0,0,0,0,0,0], - ["p1",7,"op","chess_char_5_03_b",2,"uniequip_002_blaze2",1472,1,12,3,51006,1935,1007,9,1], + ["p1",7,"op","chess_char_5_03_b",2,"uniequip_002_blaze2",1374.38,1,12,3,51006,1471,1373,8,1], ["p1",8,"op","chess_char_5_12_b",0,"uniequip_002_dusk",1787,1,7,4,68403,0,0,4,4], - ["p1",9,"op","chess_char_5_23_b",1,"uniequip_002_reckpr",1610,1,10,0,0,0,1120,8,1], + ["p1",9,"op","chess_char_5_23_b",1,"uniequip_002_reckpr",1610,1,10,0,0,0,4900,26,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], - ["p1","~1","token","enemy_9012_acloon",null,null,17109.42,1,13,4,50019,499,0,2,2], - ["p1","~2","token","enemy_9012_acloon",null,null,12965.57,1,14,2,28865,4643,0,1,1], - ["p1","~1","token","token_10031_swire2_gdtrap",null,null,860,0,27,0,0,210,0,0,null], - ["p1","~2","token","token_10031_swire2_gdtrap",null,null,860,0,32,0,0,210,0,0,null], - ["p1","~1","token","token_10015_dusk_drgn",null,null,0,0,34,0,430,1997,0,1,null], - ["p1","~3","token","token_10031_swire2_gdtrap",null,null,1000,0,39,0,0,0,0,0,null], - ["p1","~4","token","token_10031_swire2_gdtrap",null,null,860,0,40,0,0,1120,0,0,null] + ["p1","~1","token","enemy_9012_acloon",null,null,17189.24,1,13,4,50019,419,0,2,2], + ["p1","~2","token","enemy_9012_acloon",null,null,13523.97,1,14,2,28865,4084,0,1,1], + ["p1","~1","token","token_10031_swire2_gdtrap",null,null,1000,0,15,0,0,0,0,0,null], + ["p1","~2","token","token_10031_swire2_gdtrap",null,null,860,1,18,0,0,5040,0,0,null], + ["p1","~3","token","token_10031_swire2_gdtrap",null,null,1000,0,27,0,0,0,0,0,null], + ["p1","~4","token","token_10031_swire2_gdtrap",null,null,1000,0,30,0,0,0,0,0,null], + ["p1","~5","token","token_10031_swire2_gdtrap",null,null,1000,0,33,0,0,0,0,0,null], + ["p1","~6","token","token_10031_swire2_gdtrap",null,null,1000,0,36,0,0,0,0,0,null], + ["p1","~1","token","token_10015_dusk_drgn",null,null,0,0,38,0,430,1997,0,1,null], + ["p1","~7","token","token_10031_swire2_gdtrap",null,null,1000,0,41,0,0,0,0,0,null], + ["p1","~8","token","token_10031_swire2_gdtrap",null,null,1000,0,42,0,0,0,0,0,null], + ["p1","~9","token","token_10031_swire2_gdtrap",null,null,1000,0,43,0,0,0,0,0,null], + ["p1","~10","token","token_10031_swire2_gdtrap",null,null,1000,1,46,0,0,0,0,0,null] ], - "enemies": {"enemy_1019_jshoot_2":[7,7,0,1544,47029],"enemy_1381_winman":[9,9,0,0,129890],"enemy_1389_winbab_2":[5,5,0,5384,87091]}, - "hooks": [1,40,2378,128,128,168,212,1108,22,26,11,11,6,5334,1,8,21,0,1,23,0,0,0], - "events": {"atk":128,"deploy":16,"die":26,"dmg":209,"fx":31,"heal":8,"skill":22,"spawn":40,"status":3}, - "fx": {"coin":8,"downed":1,"explode":4,"firewall":1,"revive":1,"splash":6,"summon":5,"yanyouFlame":3,"yanyouSummon":2}, - "snaps": "9de1a377 006ae259 36d64b47 07539063 05e6c9d6 a572b9f9 d780cb71 6f89109e" + "enemies": {"enemy_1019_jshoot_2":[7,7,0,1075,47029],"enemy_1381_winman":[9,9,0,0,129890],"enemy_1389_winbab_2":[5,5,0,5215,87091]}, + "hooks": [1,46,2270,120,120,188,222,1034,22,30,11,9,5,5355,1,4,21,0,1,23,0,0,0], + "events": {"atk":120,"deploy":22,"die":30,"dmg":222,"fx":44,"heal":26,"skill":20,"spawn":46,"status":2}, + "fx": {"coin":14,"downed":1,"explode":8,"splash":5,"summon":11,"yanyouFlame":3,"yanyouSummon":2}, + "snaps": "b2b94c31 1e5707be a1b26ab3 10db4b56 bcd4d5e3 2c5a291d 646238a4 8471a2e0" } } } diff --git a/test/golden/matches.json b/test/golden/matches.json index f968a6b2..a23ee393 100644 --- a/test/golden/matches.json +++ b/test/golden/matches.json @@ -1072,49 +1072,49 @@ { "round": 6, "ai_0": [1,35,9,0,0,3,8,"844b219a",33,"arcaneShip 0/8, kazimierzShip 0/4, kjeragShip 0/5, preciShip 2/20, suntShip 1/0, swiftShip 1/13",14,14,0,41], - "ai_1": [1,16,9,0,1,3,8,"3e9da7ea",26,"arcaneShip 1/2, kazimierzShip 1/11, kjeragShip 0/2, preciShip 0/2, sargonShip 0/4, siracusaShip 0/6, soloShip 1/0, steadShip 0/2, swiftShip 1/13",11,14,3,40], + "ai_1": [1,16,9,0,1,3,8,"3e9da7ea",25,"arcaneShip 1/2, kazimierzShip 1/10, kjeragShip 0/2, preciShip 0/2, sargonShip 0/4, siracusaShip 0/6, soloShip 1/0, steadShip 0/2, swiftShip 1/13",9,14,5,40], "ai_2": [1,21,9,0,0,3,8,"524a7cff",51,"deputShip 1/12, egirShip 0/2, kazimierzShip 0/4, kjeragShip 0/12, raidShip 0/2, skillfulShip 0/4, soloShip 1/6, steadShip 2/18, swiftShip 1/15, victoriaShip 0/10, yanShip 0/4",14,14,0,41], "ai_3": [1,16,10,0,0,3,8,"ae19c686",28,"arcaneShip 2/9, deputShip 1/2, preciShip 0/2, sargonShip 0/2, siracusaShip 1/11, soloShip 1/6",8,14,6,45] }, { "round": 7, "ai_0": [1,25,10,0,0,4,8,"fa19dc02",65,"arcaneShip 0/8, kazimierzShip 1/14, kjeragShip 0/5, preciShip 2/27, suntShip 1/0, swiftShip 1/24",7,21,14,52], - "ai_1": [1,6,11,0,0,4,8,"bad83463",33,"arcaneShip 2/2, kazimierzShip 1/18, kjeragShip 0/2, preciShip 0/2, sargonShip 0/8, siracusaShip 0/6, steadShip 0/2, swiftShip 1/13",5,21,16,51], + "ai_1": [1,6,11,0,0,4,8,"bad83463",32,"arcaneShip 2/2, kazimierzShip 1/17, kjeragShip 0/2, preciShip 0/2, sargonShip 0/8, siracusaShip 0/6, steadShip 0/2, swiftShip 1/13",5,21,16,51], "ai_2": [1,18,10,0,2,4,8,"3c8cf7f7",81,"deputShip 1/16, egirShip 0/4, kazimierzShip 0/4, kjeragShip 0/12, raidShip 0/4, skillfulShip 0/4, soloShip 1/10, steadShip 2/36, swiftShip 1/19, victoriaShip 0/12, yanShip 0/4",18,21,3,51], "ai_3": [1,6,11,0,0,4,8,"7ba63894",45,"arcaneShip 2/14, deputShip 1/4, preciShip 0/2, sargonShip 0/2, siracusaShip 1/19, soloShip 1/8",2,21,19,56] }, { "round": 8, "ai_0": [1,18,11,0,0,4,8,"78106ce5",96,"arcaneShip 2/11, kazimierzShip 1/22, kjeragShip 0/5, preciShip 2/34, suntShip 1/0, swiftShip 1/29",2,9,7,63], - "ai_1": [0,0,11,0,0,4,0,"811c9dc5",0,"arcaneShip 0/2, kazimierzShip 0/25, kjeragShip 0/7, preciShip 0/2, sargonShip 0/8, siracusaShip 0/12, skillfulShip 0/5, steadShip 0/2, swiftShip 0/19",0,9,9,62], + "ai_1": [0,0,11,0,0,4,0,"811c9dc5",0,"arcaneShip 0/2, kazimierzShip 0/24, kjeragShip 0/7, preciShip 0/2, sargonShip 0/8, siracusaShip 0/12, skillfulShip 0/5, steadShip 0/2, swiftShip 0/19",0,9,9,62], "ai_2": [1,15,13,0,0,4,8,"eff86771",116,"deputShip 1/20, egirShip 0/6, kazimierzShip 0/4, kjeragShip 0/12, lateranoShip 0/2, raidShip 0/6, skillfulShip 0/4, soloShip 1/14, steadShip 2/49, swiftShip 1/33, victoriaShip 0/14, yanShip 0/4",6,9,3,64], "ai_3": [0,0,12,0,0,4,0,"811c9dc5",0,"arcaneShip 0/18, deputShip 0/6, miraShip 0/4, preciShip 0/4, sargonShip 0/2, siracusaShip 0/31, skillfulShip 0/2, soloShip 0/10",2,9,7,68] }, { "round": 9, "ai_0": [1,18,12,0,1,4,8,"a359f7ee",124,"arcaneShip 1/11, indomShip 1/2, kazimierzShip 1/34, kjeragShip 0/5, preciShip 2/43, suntShip 1/0, swiftShip 1/34",6,19,13,76], - "ai_1": [0,0,0,0,0,4,0,"811c9dc5",0,"arcaneShip 0/2, kazimierzShip 0/25, kjeragShip 0/7, preciShip 0/2, sargonShip 0/8, siracusaShip 0/12, skillfulShip 0/5, steadShip 0/2, swiftShip 0/19",null,null,null,62], + "ai_1": [0,0,0,0,0,4,0,"811c9dc5",0,"arcaneShip 0/2, kazimierzShip 0/24, kjeragShip 0/7, preciShip 0/2, sargonShip 0/8, siracusaShip 0/12, skillfulShip 0/5, steadShip 0/2, swiftShip 0/19",null,null,null,62], "ai_2": [1,15,12,0,1,4,8,"8df12b45",146,"deputShip 0/22, egirShip 0/6, kazimierzShip 0/4, kjeragShip 0/12, lateranoShip 0/2, preciShip 0/2, raidShip 0/6, skillfulShip 1/6, soloShip 1/14, steadShip 1/54, suntShip 1/0, swiftShip 1/47, victoriaShip 1/25, yanShip 0/13",19,19,0,76], "ai_3": [0,0,0,0,0,4,0,"811c9dc5",0,"arcaneShip 0/18, deputShip 0/6, miraShip 0/4, preciShip 0/4, sargonShip 0/2, siracusaShip 0/31, skillfulShip 0/2, soloShip 0/10",null,null,null,68] }, { "round": 10, "ai_0": [1,18,13,0,0,5,8,"1c690635",148,"arcaneShip 1/11, indomShip 1/4, kazimierzShip 1/42, kjeragShip 0/5, preciShip 2/52, suntShip 1/0, swiftShip 1/39",16,25,9,88], - "ai_1": [0,0,0,0,0,4,0,"811c9dc5",0,"arcaneShip 0/2, kazimierzShip 0/25, kjeragShip 0/7, preciShip 0/2, sargonShip 0/8, siracusaShip 0/12, skillfulShip 0/5, steadShip 0/2, swiftShip 0/19",null,null,null,62], + "ai_1": [0,0,0,0,0,4,0,"811c9dc5",0,"arcaneShip 0/2, kazimierzShip 0/24, kjeragShip 0/7, preciShip 0/2, sargonShip 0/8, siracusaShip 0/12, skillfulShip 0/5, steadShip 0/2, swiftShip 0/19",null,null,null,62], "ai_2": [1,15,13,0,0,5,8,"0e4a12ab",176,"deputShip 0/24, egirShip 0/6, kazimierzShip 0/4, kjeragShip 0/12, lateranoShip 0/4, preciShip 0/2, raidShip 0/6, skillfulShip 1/10, soloShip 1/14, steadShip 1/60, suntShip 1/0, swiftShip 1/61, victoriaShip 1/31, yanShip 0/15",25,25,0,89], "ai_3": [0,0,0,0,0,4,0,"811c9dc5",0,"arcaneShip 0/18, deputShip 0/6, miraShip 0/4, preciShip 0/4, sargonShip 0/2, siracusaShip 0/31, skillfulShip 0/2, soloShip 0/10",null,null,null,68] }, { "round": 11, "ai_0": [1,8,12,0,1,5,8,"88de4e65",216,"arcaneShip 1/11, indomShip 0/4, kazimierzShip 1/68, kjeragShip 0/5, preciShip 2/74, raidShip 1/12, suntShip 1/0, swiftShip 1/51",13,25,12,100], - "ai_1": [0,0,0,0,0,4,0,"811c9dc5",0,"arcaneShip 0/2, kazimierzShip 0/25, kjeragShip 0/7, preciShip 0/2, sargonShip 0/8, siracusaShip 0/12, skillfulShip 0/5, steadShip 0/2, swiftShip 0/19",null,null,null,62], + "ai_1": [0,0,0,0,0,4,0,"811c9dc5",0,"arcaneShip 0/2, kazimierzShip 0/24, kjeragShip 0/7, preciShip 0/2, sargonShip 0/8, siracusaShip 0/12, skillfulShip 0/5, steadShip 0/2, swiftShip 0/19",null,null,null,62], "ai_2": [1,5,12,0,0,5,8,"052cd291",171,"deputShip 0/24, egirShip 0/6, kazimierzShip 0/4, kjeragShip 0/16, lateranoShip 0/4, preciShip 0/4, raidShip 0/6, skillfulShip 1/12, soloShip 1/14, steadShip 0/62, suntShip 1/0, swiftShip 1/75, victoriaShip 1/37, yanShip 1/33",4,25,21,100], "ai_3": [0,0,0,0,0,4,0,"811c9dc5",0,"arcaneShip 0/18, deputShip 0/6, miraShip 0/4, preciShip 0/4, sargonShip 0/2, siracusaShip 0/31, skillfulShip 0/2, soloShip 0/10",null,null,null,68] }, { "round": 12, "ai_0": [0,0,13,0,0,6,0,"811c9dc5",0,"arcaneShip 0/11, indomShip 0/4, kazimierzShip 0/84, kjeragShip 0/5, preciShip 0/83, raidShip 0/24, swiftShip 0/56",14,47,33,114], - "ai_1": [0,0,0,0,0,4,0,"811c9dc5",0,"arcaneShip 0/2, kazimierzShip 0/25, kjeragShip 0/7, preciShip 0/2, sargonShip 0/8, siracusaShip 0/12, skillfulShip 0/5, steadShip 0/2, swiftShip 0/19",null,null,null,62], + "ai_1": [0,0,0,0,0,4,0,"811c9dc5",0,"arcaneShip 0/2, kazimierzShip 0/24, kjeragShip 0/7, preciShip 0/2, sargonShip 0/8, siracusaShip 0/12, skillfulShip 0/5, steadShip 0/2, swiftShip 0/19",null,null,null,62], "ai_2": [0,0,12,0,0,6,0,"811c9dc5",0,"deputShip 0/26, egirShip 0/6, kazimierzShip 0/4, kjeragShip 0/18, lateranoShip 0/4, preciShip 0/6, raidShip 0/6, skillfulShip 0/14, soloShip 0/14, steadShip 0/62, swiftShip 0/89, victoriaShip 0/45, yanShip 0/35",10,47,37,113], "ai_3": [0,0,0,0,0,4,0,"811c9dc5",0,"arcaneShip 0/18, deputShip 0/6, miraShip 0/4, preciShip 0/4, sargonShip 0/2, siracusaShip 0/31, skillfulShip 0/2, soloShip 0/10",null,null,null,68] } @@ -1144,9 +1144,9 @@ "title": null, "trophies": 1, "reward": 149, - "stats": {"activatedLayers":0,"bossDamage":0,"dmgDealt":650327,"gold":62,"itemsEquipped":3,"kills":57,"leaks":41,"lpLost":29,"merges":1,"perfectRounds":3,"refreshes":5}, + "stats": {"activatedLayers":0,"bossDamage":0,"dmgDealt":643611,"gold":62,"itemsEquipped":2,"kills":55,"leaks":43,"lpLost":29,"merges":1,"perfectRounds":3,"refreshes":5}, "lineup": [], - "bonds": ["arcaneShip 0/2","kazimierzShip 0/25","kjeragShip 0/7","preciShip 0/2","sargonShip 0/8","siracusaShip 0/12","skillfulShip 0/5","steadShip 0/2","swiftShip 0/19"] + "bonds": ["arcaneShip 0/2","kazimierzShip 0/24","kjeragShip 0/7","preciShip 0/2","sargonShip 0/8","siracusaShip 0/12","skillfulShip 0/5","steadShip 0/2","swiftShip 0/19"] }, "ai_2": { "alive": false, @@ -1158,7 +1158,7 @@ "title": {"id":"comment_5","name":"万事俱备","picId":"comment_icon_5","text":"装备配发数量最多"}, "trophies": 2, "reward": 255, - "stats": {"activatedLayers":0,"bossDamage":0,"dmgDealt":4175013,"gold":113,"itemsEquipped":11,"kills":170,"leaks":75,"lpLost":33,"merges":3,"perfectRounds":5,"refreshes":9}, + "stats": {"activatedLayers":0,"bossDamage":0,"dmgDealt":4200543,"gold":113,"itemsEquipped":11,"kills":172,"leaks":75,"lpLost":33,"merges":3,"perfectRounds":5,"refreshes":9}, "lineup": [], "bonds": ["deputShip 0/26","egirShip 0/6","kazimierzShip 0/4","kjeragShip 0/18","lateranoShip 0/4","preciShip 0/6","raidShip 0/6","skillfulShip 0/14","soloShip 0/14","steadShip 0/62","swiftShip 0/89","victoriaShip 0/45","yanShip 0/35"] }, diff --git a/test/golden/roster.json b/test/golden/roster.json index cebadeef..2020b0c2 100644 --- a/test/golden/roster.json +++ b/test/golden/roster.json @@ -316,32 +316,50 @@ "total": 77, "unspawned": 0, "bossHpLeft": null, - "rngDraws": 24, + "rngDraws": 27, "errors": {"count":0,"kinds":[]}, "players": { - "p1": {"killed":77,"total":77,"perfect":true,"leaks":0,"leaksUncounted":1,"coins":10,"dmg":306542,"bossDmg":0,"heal":7835,"deaths":0,"layerGains":{"steadShip":1}} + "p1": {"killed":77,"total":77,"perfect":true,"leaks":0,"leaksUncounted":1,"coins":10,"dmg":306545,"bossDmg":0,"heal":5933,"deaths":0,"layerGains":{"steadShip":1}} }, "units": [ ["p1",1,"op","chess_char_2_17_b",1,"uniequip_002_branch",7137.76,1,2,0,0,504,504,0,2], - ["p1",2,"op","chess_char_2_18_b",0,"uniequip_002_ashlok",3981.61,1,7,1,38567,736,0,23,2], + ["p1",2,"op","chess_char_2_18_b",0,"uniequip_002_ashlok",3981.61,1,7,1,40011,736,0,23,2], ["p1",3,"op","chess_char_3_06_a",1,null,5603.08,1,9,0,0,160,0,0,1], ["p1",4,"op","chess_char_2_13_b",1,"none",2789.02,1,12,36,76353,1058,0,66,3], - ["p1",5,"op","chess_char_2_16_b",1,"uniequip_002_whitew",2907.65,1,8,10,53361,193,0,62,2], + ["p1",5,"op","chess_char_2_16_b",1,"uniequip_002_whitew",2907.65,1,8,11,47986,193,0,61,2], ["p1",6,"op","chess_char_3_02_a",1,null,3844.93,1,10,4,24853,205,0,65,1], ["p1",7,"op","chess_char_3_03_a",1,null,1739.04,1,11,0,0,384,0,0,0], - ["p1",8,"op","chess_char_3_04_a",1,null,2352.37,1,4,0,1375,0,0,1,0], - ["p1",9,"op","chess_char_3_05_a",2,null,3707.76,1,6,3,22546,4302,0,20,1], - ["p1",10,"op","chess_char_2_14_b",1,"uniequip_002_flower",1948.53,1,1,0,0,0,5560,10,1], - ["p1",11,"op","chess_char_2_19_b",1,"uniequip_002_tinman",1978.82,1,3,9,30023,0,1772,27,7], - ["p1",12,"op","chess_char_3_01_a",2,null,2491.36,1,5,14,59464,268,0,84,2] + ["p1",8,"op","chess_char_3_04_a",1,null,2352.37,1,4,3,20595,0,0,1,0], + ["p1",9,"op","chess_char_3_05_a",2,null,3707.76,1,6,2,17979,2395,0,17,1], + ["p1",10,"op","chess_char_2_14_b",1,"uniequip_002_flower",1948.53,1,1,0,0,0,3973,8,1], + ["p1",11,"op","chess_char_2_19_b",1,"uniequip_002_tinman",1978.82,1,3,7,21894,0,1455,25,6], + ["p1",12,"op","chess_char_3_01_a",2,null,2491.36,1,5,13,56874,268,0,83,2], + ["p1","~1","token","token_10031_swire2_gdtrap",null,null,1000,0,13,0,0,0,0,0,null], + ["p1","~2","token","token_10031_swire2_gdtrap",null,null,1000,1,15,0,0,0,0,0,null], + ["p1","~3","token","token_10031_swire2_gdtrap",null,null,1000,0,32,0,0,0,0,0,null], + ["p1","~4","token","token_10031_swire2_gdtrap",null,null,1000,0,33,0,0,0,0,0,null], + ["p1","~5","token","token_10031_swire2_gdtrap",null,null,1000,0,34,0,0,0,0,0,null], + ["p1","~6","token","token_10031_swire2_gdtrap",null,null,1000,0,37,0,0,0,0,0,null], + ["p1","~7","token","token_10031_swire2_gdtrap",null,null,1000,0,40,0,0,0,0,0,null], + ["p1","~8","token","token_10031_swire2_gdtrap",null,null,1000,0,44,0,0,0,0,0,null], + ["p1","~9","token","token_10031_swire2_gdtrap",null,null,1000,0,46,0,0,0,0,0,null], + ["p1","~10","token","token_10031_swire2_gdtrap",null,null,1000,0,50,0,0,0,0,0,null], + ["p1","~11","token","token_10031_swire2_gdtrap",null,null,1000,0,55,0,0,0,0,0,null], + ["p1","~12","token","token_10031_swire2_gdtrap",null,null,1000,0,80,0,0,0,0,0,null], + ["p1","~13","token","token_10031_swire2_gdtrap",null,null,1000,0,81,0,0,0,0,0,null], + ["p1","~14","token","token_10031_swire2_gdtrap",null,null,1000,0,82,0,0,0,0,0,null], + ["p1","~15","token","token_10031_swire2_gdtrap",null,null,1000,0,86,0,0,0,0,0,null], + ["p1","~16","token","token_10031_swire2_gdtrap",null,null,1000,0,87,0,0,0,0,0,null], + ["p1","~17","token","token_10031_swire2_gdtrap",null,null,1000,0,89,0,0,0,0,0,null], + ["p1","~18","token","token_10031_swire2_gdtrap",null,null,1000,1,93,0,0,0,0,0,null] ], "enemies": { "enemy_10028_vtswd": [1,0,0,0,0], "enemy_1005_yokai": [48,48,0,0,36864], - "enemy_1006_shield_3": [1,1,0,660,38400], - "enemy_10124_uashld_2": [1,1,0,1045,24000], + "enemy_1006_shield_3": [1,1,0,0,38400], + "enemy_10124_uashld_2": [1,1,0,429,24000], "enemy_1017_defdrn": [15,15,0,0,57600], - "enemy_1043_zomsbr": [1,1,0,0,2560], + "enemy_1043_zomsbr": [1,1,0,0,2549], "enemy_1121_lifbos": [1,1,0,204,19200], "enemy_1170_dushld_2": [1,1,0,257,8640], "enemy_1202_msfzhi_2": [1,1,0,0,4], @@ -349,13 +367,13 @@ "enemy_1302_ymtro_2": [1,1,0,0,28800], "enemy_1355_mrfly_2": [3,3,0,0,28800], "enemy_1404_msnip": [1,1,0,422,5760], - "enemy_1511_mdrock": [1,1,0,1871,43242], + "enemy_1511_mdrock": [1,1,0,1240,43255], "enemy_2017_csphts": [1,1,0,1838,9600] }, - "hooks": [1,90,4200,372,372,658,640,177,77,77,22,22,0,20005,55,36,78,0,1,77,1,0,4], - "events": {"atk":383,"bounty":5,"deploy":12,"die":77,"dmg":640,"fx":33,"heal":115,"layer":1,"skill":44,"spawn":90,"status":35}, - "fx": {"aoe":2,"buff":1,"coin":3,"dodge":9,"explode":2,"garrison":1,"phase":2,"shieldBreak":1,"sp":2,"takeoff":3,"zone":7}, - "snaps": "7e2ad48a 6bd6d5ab b9d597a4 5d6f961e 1e4c04e2 525f85c6 9bf96317 42a8fa26 f1af39d5 66b9f6f3 bca33a7f 56cc754e 896ae641 1111820a" + "hooks": [1,108,4200,360,360,645,631,154,77,93,21,21,0,19948,63,35,78,0,1,77,1,0,4], + "events": {"atk":368,"bounty":5,"deploy":30,"die":93,"dmg":631,"fx":83,"heal":96,"layer":1,"skill":42,"spawn":108,"status":47}, + "fx": {"aoe":2,"buff":1,"coin":21,"dodge":9,"explode":18,"garrison":1,"phase":2,"shieldBreak":1,"sp":1,"summon":18,"takeoff":3,"zone":6}, + "snaps": "79c25635 2c57e2ca b98e04a2 b1d010b9 886e8083 f08b478b 1f082480 2836dc7f 23b4a8f7 1a783f2b ba4fee21 0b394bd9 40cec98d 86f41954" }, "roster-007": { "about": "pass 0 band 3: chess_char_3_12_a chess_char_3_16_a chess_char_3_18_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 chess_char_3_14_a chess_char_3_17_a chess_char_3_19_a chess_char_3_20_a token_10028_vigil_wolf", @@ -431,21 +449,21 @@ "time": 170, "ticks": 5100, "reason": "timeout", - "killed": 36, + "killed": 38, "total": 87, "unspawned": 0, "bossHpLeft": null, - "rngDraws": 13, + "rngDraws": 20, "errors": {"count":0,"kinds":[]}, "players": { "p1": { - "killed": 36, + "killed": 38, "total": 87, "perfect": false, - "leaks": 51, + "leaks": 49, "leaksUncounted": 1, "coins": 8, - "dmg": 374500, + "dmg": 412296, "bossDmg": 0, "heal": 5204, "deaths": 18, @@ -453,39 +471,60 @@ } }, "units": [ - ["p1",1,"op","chess_char_3_06_b",1,"uniequip_002_philae",0,0,6,0,1892,7078,0,4,1], - ["p1",2,"op","chess_char_3_12_b",2,"uniequip_002_blemsh",0,0,19,6,32008,6013,5204,18,1], - ["p1",3,"op","chess_char_3_02_b",1,"uniequip_002_ayer",0,0,10,1,26273,2911,0,37,1], - ["p1",4,"op","chess_char_3_03_b",1,"uniequip_002_swire",0,0,105,2,22220,5092,0,25,1], - ["p1",5,"op","chess_char_3_04_b",1,"uniequip_002_swire2",0,0,109,3,33237,15510,0,43,0], - ["p1",6,"op","chess_char_3_05_b",2,"uniequip_002_skadi",0,0,14,9,47733,13898,0,28,1], - ["p1",7,"op","chess_char_3_21_a",2,null,0,0,2,0,14448,1464,0,11,1], - ["p1",8,"op","chess_char_3_01_b",2,"uniequip_002_angel",0,0,3,3,34648,2037,0,41,1], - ["p1",9,"op","chess_char_3_08_b",1,"uniequip_002_mint",0,0,4,2,25495,6186,0,6,1], - ["p1",10,"op","chess_char_3_09_b",1,"uniequip_002_haini",0,0,102,1,31313,2754,0,28,1], - ["p1",11,"op","chess_char_3_10_b",1,"uniequip_002_pinecn",0,0,1,4,18773,2420,0,9,1], - ["p1",12,"op","chess_char_3_11_b",1,"uniequip_002_snhunt",0,0,5,5,86460,2000,0,31,8] + ["p1",1,"op","chess_char_3_06_b",1,"uniequip_002_philae",0,0,6,0,1997,7128,0,4,1], + ["p1",2,"op","chess_char_3_12_b",2,"uniequip_002_blemsh",0,0,20,6,32008,6013,5204,18,1], + ["p1",3,"op","chess_char_3_02_b",1,"uniequip_002_ayer",0,0,10,1,27431,2861,0,37,1], + ["p1",4,"op","chess_char_3_03_b",1,"uniequip_002_swire",0,0,122,2,24154,5092,0,25,1], + ["p1",5,"op","chess_char_3_04_b",1,"uniequip_002_swire2",0,0,126,6,69447,15476,0,41,0], + ["p1",6,"op","chess_char_3_05_b",2,"uniequip_002_skadi",0,0,15,9,47733,13898,0,28,1], + ["p1",7,"op","chess_char_3_21_a",2,null,0,0,2,0,17820,1464,0,13,1], + ["p1",8,"op","chess_char_3_01_b",2,"uniequip_002_angel",0,0,3,2,29291,2037,0,39,1], + ["p1",9,"op","chess_char_3_08_b",1,"uniequip_002_mint",0,0,4,4,28387,6186,0,6,1], + ["p1",10,"op","chess_char_3_09_b",1,"uniequip_002_haini",0,0,119,1,30941,2604,0,28,1], + ["p1",11,"op","chess_char_3_10_b",1,"uniequip_002_pinecn",0,0,1,2,21588,2470,0,8,1], + ["p1",12,"op","chess_char_3_11_b",1,"uniequip_002_snhunt",0,0,5,5,81499,1950,0,31,8], + ["p1","~1","token","token_10031_swire2_gdtrap",null,null,1000,0,13,0,0,0,0,0,null], + ["p1","~2","token","token_10031_swire2_gdtrap",null,null,1000,0,43,0,0,0,0,0,null], + ["p1","~3","token","token_10031_swire2_gdtrap",null,null,1000,0,45,0,0,0,0,0,null], + ["p1","~4","token","token_10031_swire2_gdtrap",null,null,1000,0,46,0,0,0,0,0,null], + ["p1","~5","token","token_10031_swire2_gdtrap",null,null,1000,0,48,0,0,0,0,0,null], + ["p1","~6","token","token_10031_swire2_gdtrap",null,null,1000,0,49,0,0,0,0,0,null], + ["p1","~7","token","token_10031_swire2_gdtrap",null,null,1000,0,52,0,0,0,0,0,null], + ["p1","~8","token","token_10031_swire2_gdtrap",null,null,1000,0,55,0,0,0,0,0,null], + ["p1","~9","token","token_10031_swire2_gdtrap",null,null,1000,0,59,0,0,0,0,0,null], + ["p1","~10","token","token_10031_swire2_gdtrap",null,null,1000,0,62,0,0,0,0,0,null], + ["p1","~11","token","token_10031_swire2_gdtrap",null,null,1000,0,84,0,0,0,0,0,null], + ["p1","~12","token","token_10031_swire2_gdtrap",null,null,1000,0,88,0,0,0,0,0,null], + ["p1","~13","token","token_10031_swire2_gdtrap",null,null,1000,0,90,0,0,0,0,0,null], + ["p1","~14","token","token_10031_swire2_gdtrap",null,null,1000,0,92,0,0,0,0,0,null], + ["p1","~15","token","token_10031_swire2_gdtrap",null,null,1000,0,111,0,0,0,0,0,null], + ["p1","~16","token","token_10031_swire2_gdtrap",null,null,1000,0,113,0,0,0,0,0,null], + ["p1","~17","token","token_10031_swire2_gdtrap",null,null,1000,0,116,0,0,0,0,0,null], + ["p1","~18","token","token_10031_swire2_gdtrap",null,null,1000,0,127,0,0,0,0,0,null], + ["p1","~19","token","token_10031_swire2_gdtrap",null,null,1000,0,128,0,0,0,0,0,null], + ["p1","~20","token","token_10031_swire2_gdtrap",null,null,1000,0,129,0,0,0,0,0,null], + ["p1","~21","token","token_10031_swire2_gdtrap",null,null,1000,1,130,0,0,0,0,0,null] ], "enemies": { "enemy_10030_vtwand": [1,0,0,0,0], "enemy_1007_slime": [1,1,0,0,950], "enemy_10138_xdsnow": [1,1,0,27,9504], - "enemy_1045_hammer_2": [1,0,1,11317,12489], + "enemy_1045_hammer_2": [1,0,1,11317,11045], "enemy_1148_dssbr": [1,1,0,0,4838], - "enemy_1172_dugago_2": [1,0,1,1356,15419], - "enemy_1203_sfhu_2": [1,1,0,14247,15120], + "enemy_1172_dugago_2": [1,0,1,937,21038], + "enemy_1203_sfhu_2": [1,1,0,13373,15120], "enemy_1204_msfhu_2": [4,0,4,0,0], - "enemy_1254_lypa_2": [1,1,0,6401,17280], - "enemy_1305_mhslim_2": [1,1,0,720,3110], - "enemy_1415_mmkabi_2": [1,0,1,0,11499], - "enemy_1513_dekght": [1,0,1,0,0], - "enemy_2021_syfish": [60,29,30,2215,222507], - "enemy_2025_syufo": [13,1,9,22002,61781] + "enemy_1254_lypa_2": [1,1,0,7386,17280], + "enemy_1305_mhslim_2": [1,1,0,614,3110], + "enemy_1415_mmkabi_2": [1,0,1,0,17402], + "enemy_1513_dekght": [1,0,1,0,652], + "enemy_2021_syfish": [60,31,29,1948,244588], + "enemy_2025_syufo": [13,1,9,22098,66768] }, - "hooks": [1,109,5100,467,467,816,888,338,54,104,18,22,0,6770,54,39,88,47,1,58,11,8,0], - "events": {"atk":517,"bounty":4,"deploy":21,"die":57,"dmg":887,"fx":98,"heal":337,"layer":11,"leak":47,"skill":36,"spawn":100,"status":84}, - "fx": {"blink":2,"buff":1,"burst":8,"coin":15,"displace":11,"explode":16,"garrison":6,"layer":5,"pull":11,"revive":4,"shield":1,"shieldBreak":1,"strike":8,"summon":1,"volley":8}, - "snaps": "a90ffeac d57612e4 e8d10948 88e75de1 e4c4862e 99ffec22 42d6df71 787805d3 8509084c 62cebe35 3ecdb395 419f753d 70a4b54a 555aa325 72b287c5 1bd11f0b a6987cb5" + "hooks": [1,130,5100,460,460,841,911,335,56,125,18,22,0,6766,71,39,88,46,1,61,11,8,0], + "events": {"atk":523,"bounty":4,"deploy":42,"die":79,"dmg":900,"fx":149,"heal":334,"layer":11,"leak":46,"skill":36,"spawn":121,"status":116}, + "fx": {"blink":2,"buff":1,"burst":8,"coin":23,"displace":12,"explode":34,"garrison":6,"layer":5,"pull":12,"revive":5,"shield":1,"shieldBreak":1,"stone":1,"strike":8,"summon":22,"volley":8}, + "snaps": "6bb6de80 3da36926 90077a97 54527095 2ea8e804 b96395a8 945c6c5b c0ade45d 6877f7d8 47624149 8910be5a 0a85d46b aac810fe 1091eb1c d3666120 8cc8b007 ec23f220" }, "roster-009": { "about": "pass 0 band 4: chess_char_3_16_b chess_char_4_01_a chess_char_3_18_b chess_char_4_04_a chess_char_3_13_b chess_char_3_14_b chess_char_3_17_b chess_char_3_19_b chess_char_3_20_b chess_char_3_21_b chess_char_4_02_a chess_char_4_06_a token_10028_vigil_wolf",