From 1205336a2794d6916c5d5ef69833a1c20a1eed20 Mon Sep 17 00:00:00 2001 From: sganggs Date: Thu, 8 Oct 2026 21:05:18 +0800 Subject: [PATCH] =?UTF-8?q?feedback7=20R22-FIELDS:=20an=20enemy=20whose=20?= =?UTF-8?q?route=20ends=20on=20a=20corner=20portal=20stays=20hidden=203=20?= =?UTF-8?q?s=20inside=20it=20before=20it=20comes=20out=20of=20[5,10],=20li?= =?UTF-8?q?ke=20the=20explicit=20crossings=20of=20the=20same=20tiles=20(re?= =?UTF-8?q?view=20of=20the=20#337=20commit);=20golden:=207=20fields,=204?= =?UTF-8?q?=20matches=20=E2=80=94=20solo-NORMAL-1's=20Hidden=20Core=20stil?= =?UTF-8?q?l=20fails?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Grok review of fb7-fields (MEDIUM): portalPickup spliced DISAPPEAR and APPEAR with nothing between, so the enemy vanished on [1,3] / [1,17] and stood on [5,10] in the same tick, targetable at once, while the data's explicit crossings of the same tiles hide it: WAIT 3 s in 85 of the 95, 5 s in 9, 1 s in 1. portalPickup now splices a 3 s WAIT (PORTAL_WAIT, the modal explicit wait) between them; [ASSUMED] the 3 s, no source times this crossing. Docs: the SIM.md sentence and the portalPickup comment. Tests: test/sim/portal-appear.test.js — the two route-end tests record the test enemy's hidden spans: one crossing, entrance → [5,10], hidden 3 s (± a tick); both fail on the parent (0.000 s). 9/9. Golden (against the 0 s version; the rounds of every match unchanged): - matches solo-NORMAL-1 (Hidden Core boss_8 胄, act1autochess_h08_01_s): still failed — hiddenCleared false, team LP 0, 14 rounds — with the leader left at 63897 instead of 99894 (cleared with 26 LP in 0.2.1). The same course as with 0 s: the third vtsk, which leaked at the portal at 105 s in 0.2.1, comes out of [5,10] 3 s later, walks through the team's line and leaks at the door at 185.5 s (170.2 s before); 0–2 of the 8 operators stand between 100 and 320 s, the leader stalls near 108000 from 280 s, the overtime drain from 300 game s takes the 25 LP left by 350 s while the redeployed operators bring the leader to 63897 (notes trace-hidden*.mjs). - matches solo-HARD-1 (Hidden Core failed as before): pool left 2839368 → 2982555; solo-HARD-9-boosted (cleared): team LP 361 → 376 (383 in 0.2.1); coop2-NORMAL-14-standins (Final Assault lost as before): pool left 97588 → 108473. - fields boss-boss_2-solo (leader left 2763024 → 2757148), boss-boss_4-solo (3759921 → 3757752), boss-boss_6-pair (killed 6 → 5, one hllevi_2 still walking at the 200 s cap, both players still perfect; leader 6972383 → 6932482), boss-boss_6-solo (3904791 → 3907393), hidden-boss_8-pair (the vtsk that comes back near the cap is still inside the portal at 200 s: one appear fewer, the last snapshot hash), hidden-boss_8-solo (killed 8 → 6, leaks 10 → 12), hidden-boss_10-solo (killed 11 → 10, leader left 7323370 → 7333760). - unchanged by the wait: solo-FUNNY-2, coop2-ABYSS-10-boosted, the other fields, and the roster / bonds / standins / diy families. --- docs/SIM.md | 4 +- server/sim/ai.js | 15 ++- test/golden/fields.json | 236 ++++++++++++++++----------------- test/golden/matches.json | 20 +-- test/sim/portal-appear.test.js | 23 ++++ 5 files changed, 161 insertions(+), 137 deletions(-) diff --git a/docs/SIM.md b/docs/SIM.md index c5651787..d326279f 100644 --- a/docs/SIM.md +++ b/docs/SIM.md @@ -193,8 +193,8 @@ twins spell the `appear` out), so normalizeRoute re-inserts the exit `appear` ah 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). +of the data) after 3 s hidden inside — the wait of the explicit crossings (85 of 95) — and walks on to the blue door +on the entrance's side, where it leaks (ai.js portalPickup; [ASSUMED] the pairing and the 3 s). 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 diff --git a/server/sim/ai.js b/server/sim/ai.js index db73ed83..a078eb9c 100644 --- a/server/sim/ai.js +++ b/server/sim/ai.js @@ -701,13 +701,14 @@ function advanceRoute(b, e, dt, R, standing = false) { * 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). + * Appends vanish → wait → 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. Inside the + * portal the enemy stays hidden PORTAL_WAIT s, the wait of the explicit crossings of the same tiles (WAIT 3 s in 85 of + * the 95; 5 s in 9, 1 s in 1). [ASSUMED] the pairing (no tile carries a link) and the 3 s (no source times this one). */ +const PORTAL_WAIT = 3; 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; @@ -716,7 +717,7 @@ function portalPickup(b, e) { 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] }); + R.legs.splice(R.legIdx + 1, 0, { t: 'disappear' }, { t: 'wait', time: PORTAL_WAIT }, { 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)); diff --git a/test/golden/fields.json b/test/golden/fields.json index f9dd682a..836b19a7 100644 --- a/test/golden/fields.json +++ b/test/golden/fields.json @@ -227,27 +227,27 @@ "killed": 5, "total": 7, "unspawned": 0, - "bossHpLeft": 2763024, - "rngDraws": 127, + "bossHpLeft": 2757148, + "rngDraws": 130, "errors": {"count":0,"kinds":[]}, - "players": {"p1":{"killed":5,"total":7,"perfect":false,"leaks":2,"leaksUncounted":0,"coins":0,"dmg":453723,"bossDmg":230580,"heal":40581,"deaths":1,"layerGains":{}}}, + "players": {"p1":{"killed":5,"total":7,"perfect":false,"leaks":2,"leaksUncounted":0,"coins":0,"dmg":451604,"bossDmg":236418,"heal":39582,"deaths":1,"layerGains":{}}}, "units": [ - ["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",1,"op","chess_char_4_17_b",1,"uniequip_002_hsguma",2383.55,1,18,0,5154,18917,15557,82,0], + ["p1",2,"op","chess_char_4_18_b",1,"uniequip_002_mudrok",6104,1,4,0,89239,0,0,82,4], + ["p1",3,"op","chess_char_4_23_b",2,"uniequip_002_gvial2",2811,1,6,0,89910,6115,3639,104,4], + ["p1",4,"op","chess_char_4_19_b",2,"uniequip_002_flamtl",2118,1,7,1,23474,7108,1915,82,7], ["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",6,"op","chess_char_4_20_b",2,"uniequip_002_fartth",1419,1,9,0,23155,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,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] + ["p1",8,"op","chess_char_4_24_b",1,"uniequip_002_billro",2178,1,1,0,58453,0,1107,75,5], + ["p1",9,"op","chess_char_4_25_b",2,"uniequip_002_cetsyr",1671,1,3,0,0,0,574,0,3], + ["p1",10,"op","chess_char_4_26_b",0,"uniequip_002_bldsk",1522,1,5,0,0,0,16224,34,3] ], - "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" + "enemies": {"enemy_1249_lysdb_2":[5,5,0,8138,107495],"enemy_1430_lrrook":[2,0,2,0,112690],"enemy_9017_achunt":[1,0,0,21742,242852]}, + "hooks": [1,19,6000,595,595,1368,1966,5211,6,8,32,32,0,15401,91,5,8,2,1,8,0,6,2], + "events": {"atk":638,"deploy":11,"die":6,"dmg":1956,"engage":7,"fx":289,"heal":37,"leak":2,"skill":67,"spawn":18,"status":465}, + "fx": {"appear":2,"bandage":3,"block":10,"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,"shieldBreak":15,"slash":38,"spGift":5,"thorns":20,"truesilver":3}, + "snaps": "a42f06d2 4a40e022 e95a4901 abb693b9 1c238b4b afb89449 d6c6b3df c846d6b3 7c93c566 120f2baa 5eba2341 475bd0e1 a82180cf 2ec0f97d b5acfe2a 942750af b2587ba1 f8bb84fe 0dee9c0d c305f7f7" }, "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": 3759921, - "rngDraws": 90, + "bossHpLeft": 3757752, + "rngDraws": 87, "errors": {"count":0,"kinds":[]}, - "players": {"p1":{"killed":5,"total":7,"perfect":false,"leaks":2,"leaksUncounted":0,"coins":0,"dmg":732206,"bossDmg":440079,"heal":93600,"deaths":7,"layerGains":{}}}, + "players": {"p1":{"killed":5,"total":7,"perfect":false,"leaks":2,"leaksUncounted":0,"coins":0,"dmg":731117,"bossDmg":442248,"heal":91813,"deaths":7,"layerGains":{}}}, "units": [ - ["p1",1,"op","chess_char_4_17_b",1,"uniequip_002_hsguma",2710.93,1,23,2,19548,12098,13170,21,0], + ["p1",1,"op","chess_char_4_17_b",1,"uniequip_002_hsguma",2762.76,1,23,2,19548,11760,12983,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,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",3,"op","chess_char_4_23_b",2,"uniequip_002_gvial2",2811,1,21,3,202794,41516,12121,43,1], + ["p1",4,"op","chess_char_4_19_b",2,"uniequip_002_flamtl",2350.14,1,9,0,785,9979,0,1,1], + ["p1",5,"op","chess_char_4_22_b",2,"uniequip_002_svrash",2061.88,1,24,0,177744,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], + ["p1",7,"op","chess_char_4_21_b",1,"uniequip_002_plosis",1545.34,1,11,0,0,4444,18376,28,2], + ["p1",8,"op","chess_char_4_24_b",1,"uniequip_002_billro",1748.63,1,26,0,53649,7314,487,76,5], + ["p1",9,"op","chess_char_4_25_b",2,"uniequip_002_cetsyr",1394.71,1,3,0,0,6735,7186,0,3], + ["p1",10,"op","chess_char_4_26_b",0,"uniequip_002_bldsk",1522,1,5,0,0,4444,26024,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,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" + "enemies": {"enemy_1010_demon_2":[2,2,0,5940,107495],"enemy_1438_dspred":[5,3,2,34519,181373],"enemy_1521_dslily":[1,0,0,69256,442248]}, + "hooks": [1,26,6000,551,551,949,1120,8051,12,14,30,30,0,13414,126,18,8,2,1,17,0,28,2], + "events": {"atk":754,"deploy":16,"die":12,"dmg":1102,"engage":7,"fx":339,"heal":91,"leak":2,"skill":63,"spawn":20,"status":479}, + "fx": {"appear":2,"bandage":5,"block":15,"burst":28,"camouflage":1,"disappear":2,"dodge":2,"featherArrow":5,"flame":1,"garrisonGrant":1,"grow":1,"healField":2,"jungleSoul":1,"mote":61,"redistribute":45,"reweave":3,"riposte":1,"rockfall":18,"rockslide":5,"sandChains":5,"shieldBreak":18,"slash":50,"spGift":4,"tentacle":6,"thorns":48,"tide":5,"truesilver":3,"undying":1}, + "snaps": "b3cecd10 d3d68301 c10d8554 c91066bb 2ac0bbdd cb65c8b1 e357c87a 1cfd4db1 842efc1f 73ccb5e1 7cbe283e 83895aff b84dfc8e 65315bfe 89187e2c 11947687 dc8072f3 31f16379 3c0d78cb cf38d801" }, "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": 6, + "killed": 5, "total": 6, "unspawned": 0, - "bossHpLeft": 6972383, - "rngDraws": 697, + "bossHpLeft": 6932482, + "rngDraws": 708, "errors": {"count":0,"kinds":[]}, "players": { - "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":{}} + "p1": {"killed":5,"total":6,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":1096623,"bossDmg":528737,"heal":2876,"deaths":5,"layerGains":{}}, + "p2": {"killed":0,"total":0,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":1199975,"bossDmg":498782,"heal":580,"deaths":19,"layerGains":{}} }, "units": [ ["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,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,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",5,"op","chess_char_5_15_b",1,"uniequip_002_thorn2",1170,1,7,1,407448,0,551,83,18], + ["p1",6,"op","chess_char_5_20_b",2,"uniequip_002_aglina",1382,1,13,0,198029,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], + ["p1",10,"op","chess_char_4_02_b",2,"uniequip_002_mostma",1695,1,9,0,66114,0,0,47,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,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,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",15,"op","chess_char_4_09_b",1,"uniequip_002_mizuki",2777.6,1,14,0,201953,0,0,114,6], + ["p2",16,"op","chess_char_4_06_b",1,"uniequip_002_kroos2",1561,1,8,1,634150,0,0,182,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,48350,2232,0,106,5], + ["p2",18,"op","chess_char_4_12_b",2,"uniequip_002_glady",2232,1,47,0,40597,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,24 +739,24 @@ ], "enemies": { "enemy_10028_vtswd": [3,3,0,0,0], - "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_10029_vtshld": [5,5,0,0,0], + "enemy_10030_vtwand": [5,5,0,0,0], + "enemy_10085_hllevi_2": [2,1,0,0,1068467], "enemy_1010_demon": [4,4,0,12402,200612], - "enemy_9032_aclionk": [1,0,0,47314,987617] + "enemy_9032_aclionk": [1,0,0,47314,1027518] }, - "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}, + "hooks": [1,65,6000,1150,1164,2296,2310,359,42,44,106,101,0,32028,744,8,20,0,1,30,0,2,0], + "events": {"atk":1232,"deploy":45,"die":44,"dmg":2254,"engage":15,"fx":761,"heal":11,"skill":207,"spawn":42,"status":1102}, "fx": { "aoe": 44, "appear": 6, "blink": 2, "burst": 2, - "crit": 108, + "crit": 109, "dilemma": 6, "disappear": 6, "displace": 19, - "equip": 17, + "equip": 18, "explosion": 4, "frostNova": 9, "garrisonGrant": 1, @@ -770,7 +770,7 @@ "shadowWeave": 5, "shield": 1, "soul": 2, - "sp": 16, + "sp": 19, "stealth": 6, "sword": 1, "swordRain": 26, @@ -778,11 +778,11 @@ "telegraph": 21, "tornado": 5, "tornadoPulse": 20, - "vest": 6, + "vest": 5, "weightless": 6, - "zone": 312 + "zone": 339 }, - "snaps": "8ef2441b ee06d28e 0f318fc5 8e4156fd 466da928 f03b4c62 86a1deba 85583d64 215fecf5 ccd39d46 4a08d997 af901ca4 08ece609 e3643313 6f0df0ee 63a32534 86450a7b fdbbbdc8 f239ab01 bac8ff90" + "snaps": "8ef2441b ee06d28e 0f318fc5 8e4156fd 466da928 f03b4c62 86a1deba 85583d64 215fecf5 ccd39d46 4a08d997 af901ca4 08ece609 c016740f f58ba6a3 18374633 a5ab4ed2 c4cfd501 44869d7f c8302bc8" }, "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", @@ -799,21 +799,21 @@ "killed": 8, "total": 10, "unspawned": 0, - "bossHpLeft": 3904791, - "rngDraws": 52, + "bossHpLeft": 3907393, + "rngDraws": 54, "errors": {"count":0,"kinds":[]}, - "players": {"p1":{"killed":8,"total":10,"perfect":false,"leaks":2,"leaksUncounted":0,"coins":0,"dmg":195265,"bossDmg":75209,"heal":6651,"deaths":17,"layerGains":{}}}, + "players": {"p1":{"killed":8,"total":10,"perfect":false,"leaks":2,"leaksUncounted":0,"coins":0,"dmg":164010,"bossDmg":72607,"heal":1088,"deaths":18,"layerGains":{}}}, "units": [ - ["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",1,"op","chess_char_4_17_b",1,"uniequip_002_hsguma",3513,1,10,2,10,0,0,10,0], + ["p1",2,"op","chess_char_4_18_b",1,"uniequip_002_mudrok",6104,1,11,1,8,0,0,8,1], + ["p1",3,"op","chess_char_4_23_b",2,"uniequip_002_gvial2",2811,1,12,2,8987,35,35,17,2], + ["p1",4,"op","chess_char_4_19_b",2,"uniequip_002_flamtl",0,0,48,1,790,10590,0,30,2], + ["p1",5,"op","chess_char_4_22_b",2,"uniequip_002_svrash",0,0,46,1,87664,18412,943,31,4], + ["p1",6,"op","chess_char_4_20_b",2,"uniequip_002_fartth",1419,1,7,1,59955,0,0,53,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",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], + ["p1",8,"op","chess_char_4_24_b",1,"uniequip_002_billro",0,0,43,0,6596,8712,0,7,2], + ["p1",9,"op","chess_char_4_25_b",2,"uniequip_002_cetsyr",0,0,49,0,0,8465,110,0,0], + ["p1",10,"op","chess_char_4_26_b",0,"uniequip_002_bldsk",1522,1,9,0,0,0,0,0,0], ["-","~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], @@ -823,17 +823,17 @@ ], "enemies": { "enemy_10028_vtswd": [3,3,0,0,0], - "enemy_10029_vtshld": [5,5,0,0,0], + "enemy_10029_vtshld": [4,4,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_10085_hllevi_2": [2,0,2,0,73421], + "enemy_1197_sfshu": [2,2,0,383,17916], "enemy_1198_msfshu": [6,6,0,0,66], - "enemy_9032_aclionk": [1,0,0,52638,75209] + "enemy_9032_aclionk": [1,0,0,45814,72607] }, - "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" + "hooks": [1,50,6000,169,169,290,488,922,35,37,18,18,0,5924,10,2,20,2,1,27,0,0,2], + "events": {"atk":212,"deploy":24,"die":35,"dmg":238,"engage":7,"fx":94,"leak":2,"skill":38,"spawn":36,"status":77}, + "fx": {"appear":5,"disappear":5,"dodge":2,"equip":11,"featherArrow":7,"flame":2,"garrisonGrant":1,"jungleSoul":2,"mote":6,"riposte":1,"rockslide":1,"sandChains":2,"slash":22,"spGift":1,"summon":2,"sword":3,"telegraph":13,"truesilver":4,"vest":4}, + "snaps": "3e08ed3d 2a259699 77c4f1c2 4c892736 5fd1d086 3f7ba93d 93347cb4 ca27755e 08b50f0d 6ce4db08 7c1cd809 d606de7e 2d3ad538 1b4509ed 6b654423 70fbad66 91d8190b 63b4149b 78cf40b8 0e5a361a" }, "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", @@ -1000,10 +1000,10 @@ "enemy_9016_acstmr": [8,7,0,0,150] }, "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}, + "events": {"atk":1083,"deploy":56,"die":74,"dmg":3143,"engage":18,"fx":652,"heal":136,"skill":208,"spawn":58,"status":990}, "fx": { "aoe": 42, - "appear": 8, + "appear": 7, "beam": 48, "blink": 16, "burst": 5, @@ -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 4fc6091d" + "snaps": "cac31b2c d1e28667 87626189 11a56b43 640cf8cf 9a92be69 12784d9a 195ea951 99de9374 65451b7e 90846f89 9bcf64aa 0cf3dfb9 5737ca93 68f962d8 98c8303b e5af0a0e 3c947908 ce14aa80 a7bc36d6" }, "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,23 +1058,23 @@ "time": 200, "ticks": 6000, "reason": "forced", - "killed": 8, + "killed": 6, "total": 19, "unspawned": 0, - "bossHpLeft": 7008424, + "bossHpLeft": 7007993, "rngDraws": 122, "errors": {"count":0,"kinds":[]}, - "players": {"p1":{"killed":8,"total":19,"perfect":false,"leaks":10,"leaksUncounted":0,"coins":0,"dmg":237408,"bossDmg":191576,"heal":29339,"deaths":24,"layerGains":{}}}, + "players": {"p1":{"killed":6,"total":19,"perfect":false,"leaks":12,"leaksUncounted":0,"coins":0,"dmg":236889,"bossDmg":192007,"heal":29302,"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,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",2,"op","chess_char_4_18_b",1,"uniequip_002_mudrok",0,0,35,1,12200,18678,6470,12,5], + ["p1",3,"op","chess_char_4_23_b",2,"uniequip_002_gvial2",0,0,7,0,10,2811,0,8,1], + ["p1",4,"op","chess_char_4_19_b",2,"uniequip_002_flamtl",0,0,59,2,97,11660,0,13,1], + ["p1",5,"op","chess_char_4_22_b",2,"uniequip_002_svrash",0,0,11,3,187439,3191,140,63,1], + ["p1",6,"op","chess_char_4_20_b",2,"uniequip_002_fartth",0,0,29,0,3718,2838,0,6,0], + ["p1",7,"op","chess_char_4_21_b",1,"uniequip_002_plosis",0,0,60,0,0,8933,12476,37,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,57,0,0,11646,3157,0,1], + ["p1",9,"op","chess_char_4_25_b",2,"uniequip_002_cetsyr",0,0,57,0,0,11657,3168,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], @@ -1082,19 +1082,19 @@ ["-","~4","device","trap_1105_accrate",null,null,100,1,4,0,0,0,0,0,null] ], "enemies": { - "enemy_10027_vtsk": [3,0,3,35787,17457], + "enemy_10027_vtsk": [3,0,3,34423,16521], "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_1197_sfshu": [3,3,0,649,26874], + "enemy_1198_msfshu": [9,2,7,0,43], + "enemy_9013_acstmk_2": [1,0,0,36456,192007], "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,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" + "hooks": [1,63,6000,241,241,391,386,909,42,54,17,18,0,3782,53,7,35,12,1,36,0,0,0], + "events": {"atk":287,"deploy":24,"die":42,"dmg":379,"engage":7,"fx":174,"heal":78,"leak":12,"skill":36,"spawn":49,"status":159}, + "fx": {"appear":11,"bandage":1,"beam":32,"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 4b92b2c1 1f4271d1 92c37ba3 871b7c96 b1b343a4 34726b3b 63978219 c0f49c1c 4446319f 390d9c72 1bba6c43 dcd75026 5d623cac 07a7e407 a4443c8e a1aa7067" }, "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", @@ -1372,36 +1372,36 @@ "time": 200, "ticks": 6000, "reason": "forced", - "killed": 11, + "killed": 10, "total": 13, "unspawned": 0, - "bossHpLeft": 7323370, - "rngDraws": 166, + "bossHpLeft": 7333760, + "rngDraws": 139, "errors": {"count":0,"kinds":[]}, - "players": {"p1":{"killed":11,"total":13,"perfect":false,"leaks":1,"leaksUncounted":0,"coins":0,"dmg":464694,"bossDmg":276630,"heal":131305,"deaths":14,"layerGains":{}}}, + "players": {"p1":{"killed":10,"total":13,"perfect":false,"leaks":1,"leaksUncounted":0,"coins":0,"dmg":448196,"bossDmg":266240,"heal":121244,"deaths":16,"layerGains":{}}}, "units": [ - ["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] + ["p1",1,"op","chess_char_4_17_b",1,"uniequip_002_hsguma",0,0,29,6,69,7026,0,24,0], + ["p1",2,"op","chess_char_4_18_b",1,"uniequip_002_mudrok",0,0,25,0,30,21486,9278,25,5], + ["p1",3,"op","chess_char_4_23_b",2,"uniequip_002_gvial2",0,0,26,1,135024,23127,1337,137,3], + ["p1",4,"op","chess_char_4_19_b",2,"uniequip_002_flamtl",0,0,34,1,24,20162,0,21,1], + ["p1",5,"op","chess_char_4_22_b",2,"uniequip_002_svrash",3905.8,1,35,1,190029,35166,2983,92,3], + ["p1",6,"op","chess_char_4_20_b",2,"uniequip_002_fartth",0,0,30,0,76234,2838,0,53,6], + ["p1",7,"op","chess_char_4_21_b",1,"uniequip_002_plosis",2920.8,1,24,0,0,20473,74171,95,2], + ["p1",8,"op","chess_char_4_24_b",1,"uniequip_002_billro",343.79,1,31,1,46787,6392,468,62,4], + ["p1",9,"op","chess_char_4_25_b",2,"uniequip_002_cetsyr",1671,1,23,0,0,26222,3713,0,2], + ["p1",10,"op","chess_char_4_26_b",0,"uniequip_002_bldsk",0,0,3,0,0,7174,29294,42,11] ], "enemies": { - "enemy_1005_yokai_3": [1,0,1,18035,101682], + "enemy_1005_yokai_3": [1,0,1,18962,95601], "enemy_9010_acpupp": [2,2,0,19404,86026], - "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] + "enemy_9021_acduml_2": [1,0,0,4772,266240], + "enemy_9022_acdumm": [1,0,0,2812,0], + "enemy_9023_acdums": [10,8,0,122384,328] }, - "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" + "hooks": [1,35,6000,629,629,2222,2669,4675,26,27,37,36,0,8979,144,19,15,1,1,63,0,28,5], + "events": {"atk":938,"deploy":20,"die":26,"dmg":2659,"engage":7,"fx":895,"heal":257,"leak":1,"skill":75,"spawn":25,"status":361}, + "fx": {"appear":2,"bandage":11,"beam":21,"block":26,"burst":28,"disappear":2,"dodge":5,"ember":2,"explode":497,"featherArrow":6,"flame":1,"garrisonGrant":1,"healField":2,"jungleSoul":3,"mote":48,"phase":56,"redistribute":29,"reweave":2,"riposte":3,"rockslide":5,"sandChains":1,"sandChainsCharged":3,"shieldBreak":17,"slash":51,"spGift":1,"summon":8,"telegraph":2,"thorns":58,"truesilver":3,"undying":1}, + "snaps": "65ab7720 4d0f9bc6 b175a7ad decfc6d9 b1fdbc1b 7b25f64c 74154bc4 6da4a2dc 96949f94 e0447098 98bf97c3 a16b4f8c 3e2f8172 69c051ba b1a16f74 1174eaca e5178290 04548081 b5216a94 9870af27" }, "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", diff --git a/test/golden/matches.json b/test/golden/matches.json index 54abcd9f..4d93c7a7 100644 --- a/test/golden/matches.json +++ b/test/golden/matches.json @@ -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":14,"hiddenReached":true,"hiddenCleared":false,"reason":"victory","teamLp":0,"bossPoolLeft":99894,"virtualMs":112800}, + "end": {"victory":true,"roundsPassed":14,"hiddenReached":true,"hiddenCleared":false,"reason":"victory","teamLp":0,"bossPoolLeft":63897,"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": [ @@ -155,7 +155,7 @@ "title": {"id":"comment_1","name":"卫戍之星","picId":"comment_icon_1","text":"对敌方领袖造成伤害最高(仅胜利时)"}, "trophies": 0, "reward": 400, - "stats": {"activatedLayers":398,"bossDamage":1227606,"dmgDealt":3258313,"gold":144,"itemsEquipped":16,"kills":388,"leaks":0,"lpLost":0,"merges":4,"perfectRounds":13,"refreshes":18}, + "stats": {"activatedLayers":398,"bossDamage":1263603,"dmgDealt":3322495,"gold":144,"itemsEquipped":16,"kills":389,"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":2839368,"virtualMs":113700}, + "end": {"victory":true,"roundsPassed":14,"hiddenReached":true,"hiddenCleared":false,"reason":"victory","teamLp":0,"bossPoolLeft":2982555,"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":1540632,"dmgDealt":3524500,"gold":151,"itemsEquipped":18,"kills":422,"leaks":0,"lpLost":0,"merges":4,"perfectRounds":13,"refreshes":21}, + "stats": {"activatedLayers":512,"bossDamage":1397445,"dmgDealt":3385108,"gold":151,"itemsEquipped":18,"kills":420,"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":361,"bossPoolLeft":0,"virtualMs":113700}, + "end": {"victory":true,"roundsPassed":15,"hiddenReached":true,"hiddenCleared":true,"reason":"victory","teamLp":376,"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": 361, + "lp": 376, "bandId": "band_paganini", "title": {"id":"comment_1","name":"卫戍之星","picId":"comment_icon_1","text":"对敌方领袖造成伤害最高(仅胜利时)"}, "trophies": 0, "reward": 425, - "stats": {"activatedLayers":2528,"bossDamage":4580000,"dmgDealt":6435323,"gold":174,"itemsEquipped":21,"kills":391,"leaks":1,"lpLost":1,"merges":6,"perfectRounds":12,"refreshes":34}, + "stats": {"activatedLayers":2528,"bossDamage":4580000,"dmgDealt":6435314,"gold":174,"itemsEquipped":21,"kills":390,"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"] } @@ -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":97588,"virtualMs":119900}, + "end": {"victory":false,"roundsPassed":13,"hiddenReached":false,"hiddenCleared":false,"reason":"defeat","teamLp":0,"bossPoolLeft":108473,"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":249655,"dmgDealt":2602313,"gold":145,"itemsEquipped":18,"kills":245,"leaks":69,"lpLost":10,"merges":6,"perfectRounds":9,"refreshes":24}, + "stats": {"activatedLayers":219,"bossDamage":244606,"dmgDealt":2624755,"gold":145,"itemsEquipped":18,"kills":247,"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":432757,"dmgDealt":3761884,"gold":141,"itemsEquipped":21,"kills":274,"leaks":47,"lpLost":10,"merges":6,"perfectRounds":12,"refreshes":19}, + "stats": {"activatedLayers":163,"bossDamage":426921,"dmgDealt":3756514,"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"] } diff --git a/test/sim/portal-appear.test.js b/test/sim/portal-appear.test.js index e318c48e..ed62b8ee 100644 --- a/test/sim/portal-appear.test.js +++ b/test/sim/portal-appear.test.js @@ -16,6 +16,21 @@ const REAL = { skip: !hasGeneratedData() && 'no generated data' }; 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'); +/** The test enemy's hidden spans: [{ from: [r,c], to: [r,c], dt }] (vanish tile, reappear tile, seconds hidden). */ +function hiddenSpans(h) { + const spans = []; + let open = null; + const set = h.b._setHidden.bind(h.b); + h.b._setHidden = (e, on) => { + if (e.defId === 'enemy_test_portal' && on !== !!e.hidden) { + const at = [Math.round(e.y), Math.round(e.x)]; + if (on) open = { at, t: h.b.time }; + else if (open) { spans.push({ from: open.at, to: at, dt: h.b.time - open.t }); open = null; } + } + return set(e, on); + }; + return spans; +} test('normalizeRoute: DISAPPEAR → WAIT → MOVE gains the twin APPEAR at the move target', () => { const r = normalizeRoute({ @@ -81,6 +96,7 @@ for (const [tplId, routeIdx, motion] of CASES) { // ([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. +// Inside the portal it stays hidden for 3 s, as the explicit crossings of the same tiles (WAIT 3 in 85 of the 95). 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 }, @@ -89,6 +105,7 @@ test('solo boss: a route ending on the left portal entrance leaks at the left bl enemies: [{ key: 'enemy_test_portal', route: 0 }], autoFinish: true, timeLimit: 300, hooks: ['enemyLeak'], }); + const spans = hiddenSpans(h); 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]'); @@ -97,6 +114,9 @@ test('solo boss: a route ending on the left portal entrance leaks at the left bl 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'); + assert.equal(spans.length, 1, 'one portal crossing'); + assert.deepEqual([spans[0].from, spans[0].to], [[1, 3], [5, 10]], 'hidden from the entrance to the exit'); + assert.ok(Math.abs(spans[0].dt - 3) < h.TICK * 1.5, `hidden 3 s inside the portal (${spans[0].dt.toFixed(3)} s)`); }); test('a route ending on the right portal entrance mirrors: leak at the right blue door', REAL, () => { @@ -106,9 +126,12 @@ test('a route ending on the right portal entrance mirrors: leak at the right blu enemies: [{ key: 'enemy_test_portal', route: { motion: 'WALK', start: [2, 10], end: [1, 17], checkpoints: [] } }], autoFinish: true, timeLimit: 300, hooks: ['enemyLeak'], }); + const spans = hiddenSpans(h); 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'); + assert.deepEqual(spans.map((x) => [x.from, x.to]), [[[1, 17], [5, 10]]], 'one crossing, entrance to exit'); + assert.ok(Math.abs(spans[0].dt - 3) < h.TICK * 1.5, `hidden 3 s inside the portal (${spans[0].dt.toFixed(3)} s)`); });