From 64f8bf912acb5193a1ca34f4d83ced3451f41475 Mon Sep 17 00:00:00 2001 From: sganggs Date: Wed, 7 Oct 2026 02:20:10 +0800 Subject: [PATCH] =?UTF-8?q?feedback5=20CB2:=20=E8=B5=AB=E9=BB=98's=20S2=20?= =?UTF-8?q?=E5=8C=BB=E7=96=97=E6=97=A0=E4=BA=BA=E6=9C=BA=20casts=20the=20m?= =?UTF-8?q?oment=20its=20SP=20is=20full=20=E2=80=94=20the=20placed=20drone?= =?UTF-8?q?=20takes=20the=20field=20at=20once,=20injured=20ally=20or=20not?= =?UTF-8?q?;=20her=20SP=20stops=20while=20the=20stock=20is=20full=20(commu?= =?UTF-8?q?nity=20report=20of=202026-10-06=20=E3=80=8C=E8=B5=AB=E9=BB=98?= =?UTF-8?q?=E7=9A=84=E6=97=A0=E4=BA=BA=E6=9C=BA=E5=9C=A82=E6=8A=80?= =?UTF-8?q?=E8=83=BD=E5=A5=BD=E4=BA=86=E4=B9=8B=E5=90=8E=E5=BA=94=E8=AF=A5?= =?UTF-8?q?=E7=A7=92=E6=94=BE=E3=80=8D)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Official: the client skill skchr_silent_2 (AUTO) has no `_trigger`, `_allowNoTarget` 1, `_checkHasTargetBeforeDoCast` 0 and a RechargeToken action — no cast condition; `_stopSpWhenTokenIsFull` 1 = PRTS S2 备注 「医疗探机库存达到上限后赫默获得 阻回,直到库存被消耗为止」. Cause: kits/ops/chess_char_2_02-silent.js left the data's DEFAULT rule with `heal`, so the cast waited for an injured ally in her range (SP full at 26 s with nobody hurt: no cast, no drone). Now: trigger SP_FULL; a refreshed 阻回 (noSp) while her stock holds `cnt` drones. Golden: roster-003 / roster-005 (赫默 and her placed drone: the drone comes back at each full SP), bond-visiShip-low / -high (赫默 on the 远见 team, same). Tests: test/content/feedback5-silent-drone.test.js (2, fail on the parent). --- .../kits/ops/chess_char_2_02-silent.js | 14 +++++ test/content/feedback5-silent-drone.test.js | 52 ++++++++++++++++ test/golden/bonds.json | 18 +++--- test/golden/roster.json | 62 +++++++++---------- 4 files changed, 106 insertions(+), 40 deletions(-) create mode 100644 test/content/feedback5-silent-drone.test.js diff --git a/server/sim/content/kits/ops/chess_char_2_02-silent.js b/server/sim/content/kits/ops/chess_char_2_02-silent.js index 16396ef2..bfa215d3 100644 --- a/server/sim/content/kits/ops/chess_char_2_02-silent.js +++ b/server/sim/content/kits/ops/chess_char_2_02-silent.js @@ -12,6 +12,11 @@ export default { // battle start — user playtest #4; not placed ⇒ no drone); it heals around itself and self-destructs after 10 s (token // kit). 强化注射: every 【医疗】 operator on the field ASPD +attack_speed. Elite module (PHY-Y): heals on ground units // ×heal_scale (module 'none': no bonus). + // The cast: as soon as the SP is full — the AUTO skill has no cast condition (client skill skchr_silent_2: no + // `_trigger`, `_allowNoTarget` 1, `_checkHasTargetBeforeDoCast` 0, a RechargeToken action), so the placed drone takes the + // field the moment S2 is ready (community report of 2026-10-06 「赫默的无人机在2技能好了之后应该秒放」; until 0.2.0 the data's + // DEFAULT rule with `heal` waited for an injured ally in her range). While the stock is full her SP stops (阻回) until + // one is spent: `_stopSpWhenTokenIsFull` 1, PRTS 备注 「医疗探机库存达到上限后赫默获得阻回,直到库存被消耗为止」. // S1 治疗强化·γ型 (alt): ATK +atk for its duration (no drone). chess_char_2_02_a: (bb, chess) => { const tokId = chess?.skill?.overrideTokenKey ?? (chess?.tokens ?? [])[0] ?? 'token_10000_silent_healrb'; @@ -21,8 +26,17 @@ export default { return { skill: { kind: 'instant', heal: true, + trigger: { rule: 'SP_FULL' }, onStart({ battle, unit }) { releaseSkillSummon(battle, unit, tokId, { cap: cnt }); }, }, + install(battle, unit) { + if (unit.def?.skill?.id !== 'skchr_silent_2') return; + // 阻回 while the stock is full (refreshed every tick; gone a tick after a drone takes the field) + battle.on('tick', () => { + if (!unit.alive || !unit.deployed || !((unit.mem.summonStock?.[tokId] ?? 0) >= cnt)) return; + battle.addBuff(unit, { key: 'silent:stockFull', duration: 2 * battle.dt, refresh: 'extend', flags: { noSp: true } }); + }, { owner: unit }); + }, skills: { 'skcom_heal_up[3]': { kind: 'duration', heal: true, mods: { atkPct: num(bb.atk) } } }, talents: [{ install(battle, unit) { const v = num(t.attack_speed); diff --git a/test/content/feedback5-silent-drone.test.js b/test/content/feedback5-silent-drone.test.js new file mode 100644 index 00000000..da95b601 --- /dev/null +++ b/test/content/feedback5-silent-drone.test.js @@ -0,0 +1,52 @@ +// test/content/feedback5-silent-drone.test.js — 赫默 S2 医疗无人机 casts as soon as its SP is full (community report of +// 2026-10-06 「赫默的无人机在2技能好了之后应该秒放」): the AUTO skill has no cast condition — client skill skchr_silent_2: no +// `_trigger`, `_allowNoTarget` 1, `_checkHasTargetBeforeDoCast` 0, a RechargeToken action —, so the placed 医疗探机 takes the +// field the moment S2 is ready, injured ally or not. While the stock is full her SP stops (阻回) until it is spent +// (`_stopSpWhenTokenIsFull` 1; PRTS 赫默 S2 备注). Until 0.2.0 the data's DEFAULT rule (+ `heal`) waited for an injured ally. +// Run: node --test test/content/feedback5-silent-drone.test.js + +import { test } from 'node:test'; +import assert from 'node:assert/strict'; +import { makeBattle, checkInvariants } from '../helpers/battleHarness.js'; + +const SILENT = 'chess_char_2_02_a', DRONE = 'token_10000_silent_healrb'; + +function field() { + const h = makeBattle({ + units: [{ chessId: SILENT, row: 10, col: 3 }, { kind: 'token', tokenId: DRONE, row: 11, col: 3, ownerUid: 1 }, { chessId: 'chess_char_1_02_a', row: 10, col: 4 }], + autoFinish: false, timeLimit: 120, seed: 3, + }); + const drones = [], casts = []; + h.b.on('deploy', (c) => { if (c.unit.defId === DRONE) drones.push(h.b.time); }); + h.b.on('skillStart', (c) => { if (c.unit.defId === SILENT) casts.push(h.b.time); }); + return { h, s: h.unit(SILENT), drones, casts }; +} + +test('S2 casts the tick its SP is full with nobody injured, and the drone takes the field at once', () => { + const { h, s, drones, casts } = field(); + h.run(0.1); + assert.deepEqual(drones.length, 1, 'the placed drone deploys with the board (SKILL_SUMMON_START_DEPLOY)'); + // (the cast comes in the very tick the SP fills: from 0 at the deployment, spCost / spRecovery seconds later) + const fullAt = s.skill.spCost / s.s.spRecovery; + h.run(40); + assert.ok(h.b.allyUnits.every((a) => !a.alive || a.hp >= a.s.maxHp), 'nobody was injured'); + assert.ok(casts.length >= 1, 'it casts with no injured ally anywhere'); + assert.ok(Math.abs(casts[0] - fullAt) < 0.1, `at full SP (${fullAt.toFixed(2)} s; cast ${casts[0].toFixed(2)} s)`); + assert.ok(drones.some((t) => Math.abs(t - casts[0]) < 0.1), 'the drone deploys at the cast'); + checkInvariants(h.b); + assert.equal(h.b.errors.length, 0); +}); + +test('while the stock is full (the previous drone still up) her SP stops; it runs again once the drone deployed', () => { + const { h, s, drones, casts } = field(); + h.run(5); + s.skill.sp = s.skill.spCost; + h.step(2); + assert.equal(casts.length, 1, 'cast at once'); + assert.equal(s.mem.summonStock[DRONE], 1, 'the drone is still up (10 s): one in stock'); + h.run(6); + assert.equal(s.skill.sp, 0, '阻回: no SP while the stock is full'); + assert.ok(h.runUntil(() => drones.length >= 2, 10), 'the stocked drone deploys once the first is gone and ready again'); + h.run(3); + assert.ok(s.skill.sp > 2, `SP runs again (${s.skill.sp.toFixed(2)})`); +}); diff --git a/test/golden/bonds.json b/test/golden/bonds.json index d182e0da..66062058 100644 --- a/test/golden/bonds.json +++ b/test/golden/bonds.json @@ -1709,10 +1709,10 @@ ["p1",9,"token","token_10000_silent_healrb",null,null,1000,1,29,0,0,0,1372,18,null] ], "enemies": {"enemy_1116_liprr":[11,11,0,2221,54450],"enemy_1116_liprr_2":[4,4,0,932,27000],"enemy_1118_lidbox_2":[2,1,1,5466,16462]}, - "hooks": [1,28,1790,191,191,208,208,32,18,21,16,16,0,8079,3,27,17,1,1,18,0,0,0], + "hooks": [1,28,1790,191,191,208,208,32,18,21,16,16,0,8141,3,27,17,1,1,18,0,0,0], "events": {"atk":226,"deploy":11,"die":20,"dmg":208,"engage":6,"fx":54,"heal":32,"leak":1,"skill":32,"spawn":26,"status":26}, "fx": {"aoe":1,"displace":19,"liberate":3,"phase":4,"pull":19,"strike":3,"summon":2,"volley":3}, - "snaps": "4f49e250 3e34819c 91d6de66 5985f2e5 1e121271 ece611fe" + "snaps": "4f49e250 3e34819c f8f00406 187f8d75 6cef4054 31a272c7" }, "bond-visiShip-high": { "about": "远见 high: tier 1 layers 999; chess_char_4_17_b chess_char_4_18_b chess_char_3_03_b chess_char_4_19_b chess_char_4_16_b chess_char_2_02_b chess_char_4_20_b chess_char_4_21_b token_10000_silent_healrb", @@ -1738,19 +1738,19 @@ ["p1",2,"op","chess_char_4_18_b",1,"uniequip_002_mudrok",6104,1,4,0,0,0,0,0,0], ["p1",3,"op","chess_char_3_03_b",1,"uniequip_002_swire",1898,1,5,7,23102,0,0,23,1], ["p1",4,"op","chess_char_4_19_b",2,"uniequip_002_flamtl",157.8,1,8,2,31781,1960,0,27,3], - ["p1",5,"op","chess_char_4_16_b",2,"uniequip_002_texas2",0,0,31,6,46796,3266,28,41,4], - ["p1",6,"op","chess_char_2_02_b",1,"uniequip_002_silent",1614,1,6,0,0,1084,3098,8,2], + ["p1",5,"op","chess_char_4_16_b",2,"uniequip_002_texas2",0,0,32,6,46796,3266,28,41,4], + ["p1",6,"op","chess_char_2_02_b",1,"uniequip_002_silent",1614,1,6,0,0,1084,3098,8,5], ["p1",7,"op","chess_char_4_20_b",2,"uniequip_002_fartth",1419,1,7,3,35639,1704,0,22,1], ["p1",8,"op","chess_char_4_21_b",1,"uniequip_002_plosis",1584,1,10,0,0,2478,2168,14,1], - ["p1",9,"token","token_10000_silent_healrb",null,null,1000,0,25,0,0,0,0,0,null], + ["p1",9,"token","token_10000_silent_healrb",null,null,1000,0,35,0,0,0,0,0,null], ["-","~1","device","trap_1105_accrate",null,null,100,1,1,0,0,0,0,0,null], ["-","~2","device","trap_1105_accrate",null,null,100,1,2,0,0,0,0,0,null] ], "enemies": {"enemy_1234_dsubrl_2":[2,2,0,9884,32256],"enemy_1433_dsbasi_2":[16,16,0,608,105062]}, - "hooks": [1,32,2169,158,158,244,298,40,22,23,12,11,0,2963,17,18,18,0,1,22,0,0,9], - "events": {"atk":162,"deploy":12,"die":23,"dmg":298,"engage":4,"fx":90,"heal":23,"skill":25,"spawn":29,"status":31}, - "fx": {"dodge":9,"featherArrow":1,"flame":3,"garrisonGrant":1,"healField":1,"pulse":43,"riposte":9,"summon":2,"swordRain":17,"swordStorm":4}, - "snaps": "8108fcf3 f23c307f e1e3d738 bfea4fc4 5bc63ae6 522694d6 ea7f43e4 25faa0a1" + "hooks": [1,34,2169,158,158,244,298,40,22,25,15,14,0,3657,17,18,18,0,1,22,0,0,9], + "events": {"atk":162,"deploy":14,"die":25,"dmg":298,"engage":4,"fx":92,"heal":23,"skill":31,"spawn":29,"status":31}, + "fx": {"dodge":9,"featherArrow":1,"flame":3,"garrisonGrant":1,"healField":1,"pulse":43,"riposte":9,"summon":4,"swordRain":17,"swordStorm":4}, + "snaps": "8108fcf3 523bf24b 4a55bea2 c6042705 c8db73ef 3aeb96c2 7a035fd1 8b9f2773" }, "bond-yanShip-low": { "about": "炎 low: tier 1 layers 1; chess_char_3_16_a chess_char_3_03_a chess_char_3_18_a chess_char_1_03_a chess_char_2_04_a chess_char_3_14_a chess_char_3_17_a chess_char_3_19_a token_10028_vigil_wolf", diff --git a/test/golden/roster.json b/test/golden/roster.json index f0e3c2cd..10e7e3c8 100644 --- a/test/golden/roster.json +++ b/test/golden/roster.json @@ -142,22 +142,22 @@ "rngDraws": 61, "errors": {"count":0,"kinds":[]}, "players": { - "p1": {"killed":82,"total":85,"perfect":false,"leaks":3,"leaksUncounted":0,"coins":12,"dmg":120882,"bossDmg":0,"heal":19617,"deaths":4,"layerGains":{"preciShip":3}} + "p1": {"killed":82,"total":85,"perfect":false,"leaks":3,"leaksUncounted":0,"coins":12,"dmg":120882,"bossDmg":0,"heal":19883,"deaths":4,"layerGains":{"preciShip":3}} }, "units": [ ["p1",1,"op","chess_char_1_10_b",0,"uniequip_002_sunbr",2493,1,5,0,0,0,974,5,5], ["p1",2,"op","chess_char_1_12_b",1,"uniequip_002_estell",2389,1,7,7,2525,974,0,25,1], - ["p1",3,"op","chess_char_1_20_b",1,"uniequip_002_liskam",1341.87,1,10,13,22082,1550,0,71,1], + ["p1",3,"op","chess_char_1_20_b",1,"uniequip_002_liskam",1526.37,1,10,13,22082,1550,0,71,1], ["p1",4,"op","chess_char_1_18_b",1,"uniequip_002_utage",0,0,11,9,22181,9241,5887,85,1], - ["p1",5,"op","chess_char_1_19_b",1,"uniequip_002_wildmn",1173.24,1,14,7,45433,9423,0,88,2], + ["p1",5,"op","chess_char_1_19_b",1,"uniequip_002_wildmn",1116.24,1,14,7,45433,9668,0,88,2], ["p1",6,"op","chess_char_1_13_b",1,"uniequip_002_podego",2446.5,1,8,5,1001,0,0,8,3], ["p1",7,"op","chess_char_1_14_b",1,"uniequip_002_greyy",0,0,12,8,2627,1505,0,14,1], ["p1",8,"op","chess_char_1_17_b",1,"uniequip_002_indigo",0,0,15,7,9634,1613,0,9,1], ["p1",9,"op","chess_char_2_01_a",1,null,1694,1,4,11,5662,0,0,22,1], - ["p1",10,"op","chess_char_2_02_a",1,null,1400,1,6,0,0,0,7356,38,4], + ["p1",10,"op","chess_char_2_02_a",1,null,1400,1,6,0,0,0,7016,38,4], ["p1",11,"op","chess_char_2_04_a",1,null,977,1,9,15,9737,0,0,57,3], - ["p1",12,"op","chess_char_2_05_a",1,null,0,0,13,0,0,5284,2522,22,1], - ["p1",13,"token","token_10000_silent_healrb",null,null,1000,1,106,0,0,0,2877,48,null], + ["p1",12,"op","chess_char_2_05_a",1,null,0,0,13,0,0,5179,2449,22,1], + ["p1",13,"token","token_10000_silent_healrb",null,null,1000,1,106,0,0,0,3557,59,null], ["-","~1","device","trap_1105_accrate",null,null,100,1,1,0,0,0,0,0,null], ["-","~2","device","trap_1105_accrate",null,null,100,1,2,0,0,0,0,0,null], ["-","~3","device","trap_1105_accrate",null,null,100,1,3,0,0,0,0,0,null] @@ -174,17 +174,17 @@ "enemy_1197_sfshu": [9,9,0,430,20250], "enemy_1198_msfshu": [27,27,0,0,81], "enemy_1200_msfjin": [1,1,0,0,30], - "enemy_1234_dsubrl_2": [1,1,0,9581,12600], + "enemy_1234_dsubrl_2": [1,1,0,9819,12600], "enemy_1292_duskld": [1,0,0,1504,10609], "enemy_1387_winshd": [1,0,0,540,9673], "enemy_1502_crowns": [1,1,0,144,5400], - "enemy_2008_flking": [1,0,0,11413,353], + "enemy_2008_flking": [1,0,0,11315,353], "enemy_9016_acstmr": [1,1,0,0,8] }, - "hooks": [1,105,3300,569,569,689,804,222,86,90,24,23,0,16353,226,29,85,0,1,94,1,0,0], - "events": {"atk":670,"bounty":6,"deploy":17,"die":90,"dmg":774,"engage":9,"fx":109,"heal":192,"layer":1,"skill":47,"spawn":101,"status":223}, + "hooks": [1,105,3300,580,580,689,804,233,86,90,24,23,0,16480,226,29,85,0,1,90,1,0,0], + "events": {"atk":681,"bounty":6,"deploy":17,"die":90,"dmg":774,"engage":9,"fx":109,"heal":203,"layer":1,"skill":47,"spawn":101,"status":221}, "fx": {"aoe":1,"blink":1,"displace":8,"ember":1,"explode":10,"garrison":1,"heal":5,"phase":1,"pulse":42,"reveal":1,"revive":1,"sleep":8,"summon":25,"undying":1,"zone":3}, - "snaps": "c29e3835 28b841b8 3ea22a73 67a6b520 35d0349a 97ef8a6d 86c3dbf5 9d20d292 f19b1a3f 70f1741b 20c76bb6" + "snaps": "c29e3835 28b841b8 6caebbf9 58f57d98 6a790fcb 928cecdc 15ff1081 552544af 00dc4f61 848f1a18 310f6b34" }, "roster-004": { "about": "pass 0 band 2: chess_char_2_08_a chess_char_2_17_a chess_char_2_18_a chess_char_2_07_a chess_char_2_09_a chess_char_2_11_a chess_char_2_13_a chess_char_2_16_a chess_char_2_12_a chess_char_2_06_a chess_char_2_10_a chess_char_2_14_a", @@ -261,26 +261,26 @@ "total": 84, "unspawned": 0, "bossHpLeft": null, - "rngDraws": 333, + "rngDraws": 334, "errors": {"count":0,"kinds":[]}, - "players": {"p1":{"killed":83,"total":84,"perfect":false,"leaks":1,"leaksUncounted":0,"coins":10,"dmg":306697,"bossDmg":0,"heal":36881,"deaths":0,"layerGains":{}}}, + "players": {"p1":{"killed":83,"total":84,"perfect":false,"leaks":1,"leaksUncounted":0,"coins":10,"dmg":306697,"bossDmg":0,"heal":37320,"deaths":0,"layerGains":{}}}, "units": [ ["p1",1,"op","chess_char_2_07_b",1,"uniequip_002_ghost",2664.2,1,2,0,0,1707,1318,0,0], ["p1",2,"op","chess_char_2_08_b",1,"uniequip_002_bubble",3373,1,4,0,49,1818,0,0,1], ["p1",3,"op","chess_char_2_09_b",1,"uniequip_002_humus",2133,1,6,28,84020,0,0,59,2], - ["p1",4,"op","chess_char_2_11_b",1,"uniequip_002_kazema",2214,1,8,12,91244,15780,0,92,3], - ["p1",5,"op","chess_char_2_12_b",1,"uniequip_002_gravel",1452,1,10,2,7180,8945,0,129,1], - ["p1",6,"op","chess_char_2_19_a",1,null,1021.2,1,11,1,14957,1523,407,26,3], - ["p1",7,"op","chess_char_2_01_b",1,"uniequip_002_excu",2146,1,12,20,36079,4183,0,22,1], - ["p1",8,"op","chess_char_2_02_b",1,"uniequip_002_silent",1614,1,1,0,0,0,9257,28,5], + ["p1",4,"op","chess_char_2_11_b",1,"uniequip_002_kazema",2214,1,8,12,91244,15658,0,92,3], + ["p1",5,"op","chess_char_2_12_b",1,"uniequip_002_gravel",1452,1,10,2,7180,9327,0,129,1], + ["p1",6,"op","chess_char_2_19_a",1,null,1021.2,1,11,1,14957,1433,314,26,3], + ["p1",7,"op","chess_char_2_01_b",1,"uniequip_002_excu",2146,1,12,20,36079,4363,0,22,1], + ["p1",8,"op","chess_char_2_02_b",1,"uniequip_002_silent",1614,1,1,0,0,0,9366,28,6], ["p1",9,"op","chess_char_2_04_b",1,"uniequip_002_grabds",1270,1,3,10,38233,2115,0,53,3], - ["p1",10,"op","chess_char_2_05_b",1,"uniequip_002_harold",1971.2,1,5,0,0,0,11159,39,2], - ["p1",11,"op","chess_char_2_06_b",0,"uniequip_002_papyrs",1639,1,7,0,0,0,12883,28,13], - ["p1",12,"op","chess_char_2_10_b",1,"uniequip_002_rockr",1406,1,9,5,34936,810,0,113,2], - ["p1",13,"token","token_10000_silent_healrb",null,null,1000,0,103,0,0,0,1858,18,null] + ["p1",10,"op","chess_char_2_05_b",1,"uniequip_002_harold",1971.2,1,5,0,0,0,11081,40,2], + ["p1",11,"op","chess_char_2_06_b",0,"uniequip_002_papyrs",1639,1,7,0,0,0,12106,27,13], + ["p1",12,"op","chess_char_2_10_b",1,"uniequip_002_rockr",1406,1,9,5,34936,900,0,113,2], + ["p1",13,"token","token_10000_silent_healrb",null,null,1000,1,104,0,0,0,3137,30,null] ], "enemies": { - "enemy_10027_vtsk": [1,0,0,10080,23138], + "enemy_10027_vtsk": [1,0,0,10462,23138], "enemy_1006_shield_2": [1,1,0,0,8000], "enemy_10122_uacann_2": [1,1,0,3476,8000], "enemy_1042_frostd": [1,1,0,0,5200], @@ -290,15 +290,15 @@ "enemy_1249_lysdb_2": [15,15,0,372,72000], "enemy_1251_lysyta": [52,52,0,50,114400], "enemy_1299_ymkilr_2": [1,1,0,1178,8800], - "enemy_1328_cbjedi": [6,6,0,8860,48000], - "enemy_1402_tgshd_2": [1,1,0,200,10400], - "enemy_1509_mousek": [1,1,0,7102,17600], - "enemy_2010_csdcr": [1,1,0,1896,9600] + "enemy_1328_cbjedi": [6,6,0,8950,48000], + "enemy_1402_tgshd_2": [1,1,0,20,10400], + "enemy_1509_mousek": [1,1,0,7192,17600], + "enemy_2010_csdcr": [1,1,0,1986,9600] }, - "hooks": [1,102,4200,702,702,1650,1643,1107,83,89,36,35,0,28577,142,53,84,0,1,83,0,0,0], - "events": {"atk":917,"bounty":5,"deploy":18,"die":89,"dmg":1602,"engage":7,"fx":66,"heal":122,"skill":71,"spawn":97,"status":441}, - "fx": {"counter":2,"explode":3,"expose":9,"overload":2,"phase":1,"shield":9,"shieldBreak":16,"sleep":7,"summon":5,"telegraph":6,"zone":6}, - "snaps": "de0d6fce aa9dbd18 e5f78211 369608f9 eaf0206b 8ca00225 879ade74 10585017 e8565d0c e354c612 a50e5370 07ad00b4 54071507 c18f3d28" + "hooks": [1,103,4200,714,714,1650,1643,1085,83,89,37,36,0,29028,143,53,84,0,1,83,0,0,0], + "events": {"atk":928,"bounty":5,"deploy":19,"die":89,"dmg":1603,"engage":7,"fx":66,"heal":134,"skill":73,"spawn":97,"status":439}, + "fx": {"counter":2,"explode":3,"expose":9,"overload":2,"phase":1,"shield":8,"shieldBreak":16,"sleep":7,"summon":6,"telegraph":6,"zone":6}, + "snaps": "de0d6fce aa9dbd18 71199952 51ab68f4 a5c1cf26 39c299cd 389a7224 beb950e8 500c1fa6 c0a3a103 d99c8758 679ff285 e0d2bbaf 675fa07e" }, "roster-006": { "about": "pass 0 band 3: chess_char_2_17_b chess_char_2_18_b chess_char_3_06_a chess_char_2_13_b chess_char_2_16_b chess_char_3_02_a chess_char_3_03_a chess_char_3_04_a chess_char_3_05_a chess_char_2_14_b chess_char_2_19_b chess_char_3_01_a",