0.2.4-dev: round-29 community fixes and the official shared card pool

- Shared card pool and item stock as in the official mode (the owner's request, from the 路标档案馆 video and public notes): solo low-tier exceptions, co-op operators x2, shared item stock with special-item exceptions, normal / advanced occupancy 1 / 2, re-check on buy, 机变 exhaustion, release on consume / destroy / elimination; 整备 never exceeds stock; invariant held <= cap.
- 突袭: one taunt-first reselect right after a revive (the owner's rule); ordinary polls and redeploys keep the 0.2.3 rule; a revive on an enemy's tile stays. #475: online boss / hidden-boss Raid may land on the empty half (owner-limited scope).
- 浊心斯卡蒂 S1 x 坚守 no longer bounce redirected damage, and the two shares conserve the hit (idea of PR #464 by @HappyTanuki).
- Operator fixes adapted from PRs by @Xinglan233 (#459 哈洛德 S2 elemental trigger, #460 涤火杰西卡 shield on the four adjacent tiles, #461 家族徽章 first hit after stealth, #462 松果 S2 regrow per deploy); 克莱门莎 S2 splash 1.1 / 100% ATK and air auto-trigger (#467); 白面 copying 歌蕾蒂娅 / 余 skips the three-member condition (#473, the owner's video).
- 香槟炸弹 is not chosen by friendly auras / heals (PR #468 / #476 by @Siornya); 琳琅诗怀雅 coin balance (PR #450 by @IceCodeNew); Touch prep display (PR #451 by @YinqiMargatroid); lobby header (PR #471 by @YuriRestia); Japanese UI terms (PR #448 by @scutkane).
- AI-only boss countdown grace, render-failure cache / recovery without restarting a battle, device units kept on a same-field re-entry, DIY detail / skill previews, large-text result buttons.
- golden: battle families equal 0.2.3 except diy-135 / diy-136 (克莱门莎); all 18 release matches move through the shared pool, every flip named in docs/history/0.2.4.md §29.12; two coverage scenarios added.
This commit is contained in:
sganggs committed 2026-10-11 01:58:52 +08:00
1 parent 1db8e51023
commit 6bfc08270c
129 files changed
+3477 -1011

No files matched your search

+3 -1
View File
@@ -17,7 +17,7 @@ through.
| `roster` | 49 battles: every visible chess record (normal and elite) with every selectable skill and module (DESIGN §16), 12 operators per battle on a real stage (all 11 in turn) against the round's real wave three times over, every non-leader enemy kind of `data/enemies.json` as extra spawns (half of them bounties), placeable summons on the board, every equipment item, band, battle-side 机变 card and stage map card in turn, bonds from the board |
| `bonds` | 46 battles: every bond at its activation threshold (1 layer) and at its top tier (999 layers) |
| `fields` | 22 battles: every Final Assault / Hidden Core leader on a pair and a solo template (shared pool, 200 s cap) and the 联防 field with 1 and 2 helpers on the round's stage, both halves (carried HP / SP, a knocked-out operator, two leakers' enemies) |
| `matches` | 18 matches to the end in virtual time: 16 bot-only (solo 标准 / 险境 / 绝境 / 终极 × 2 seeds, co-op 2 / 3 / 4, one server-run combat match, two runs boosted to the Hidden Core), one co-op match whose human seat (AI 托管, offline) does not own 9 NORMAL chess — they fight as their 补位 stand-ins (its digest lists them per round, `standIns`) — and one whose human seat slots 自选 picks (推进之王 and prototypes) with its 调度中心 at level 5 from the first prep: its own shop draws them and its AI fields 推进之王 (its digest lists per round the 自选 shop draws and the fielded pieces, `diy`) |
| `matches` | 20 matches to the end in virtual time: 16 bot-only (solo 标准 / 险境 / 绝境 / 终极 × 2 seeds, co-op 2 / 3 / 4, one server-run combat match, two runs boosted to the Hidden Core), one co-op match whose human seat (AI 托管, offline) does not own 9 NORMAL chess — they fight as their 补位 stand-ins (its digest lists them per round, `standIns`) — and one whose human seat slots 自选 picks (推进之王 and prototypes) with its 调度中心 at level 5 from the first prep: its own shop draws them and its AI fields 推进之王 (its digest lists per round the 自选 shop draws and the fielded pieces, `diy`) |
| `standins` | 10 battles: every NORMAL chess record (normal and elite, 110) fielded as its 补位 stand-in (`standIn: true`: the stand-in's body, backup skill / module and kit — all 17 stand-ins, every skill a chess names for them), 12 per battle by strength band, laid out by the stand-in's position on a real stage, against the round's real wave three times over plus 8 ground enemy kinds (melee stand-ins always meet an enemy), an item each, bonds from the board |
| `diy` | battles of 自选 pieces (a DIY slot with its `diy` pick, `shared/diy.js`): every owned 6★ with an operator kit (`kits/index.js OPERATOR_KITS`) in each form of tiers 5 and 6 (normal; elite with no module and with each module) under each skill, then every prototype pick with a kit at its locked selection, normal and elite, 12 per battle against the round's real wave; a new operator kit adds its scenarios (the battle count grows with the kits) |
@@ -58,3 +58,5 @@ node tools/golden.mjs --twice # determinism: the corpus twice
- A new engine hook, event or chess record does not change the digests of the existing scenarios by itself — the
hook list is frozen in the tool and the corpus is regenerated only on `golden:update` — but new data records do join
the corpus there (the roster family enumerates `data/chess.json`).
After the measured shared-stock update (DESIGN §29.8), the original stand-in / DIY seeds remain as outcome regressions even when they field no such operator. Companion seeds `coop2-NORMAL-1-coverage-standins` and `coop2-NORMAL-5-coverage-diy` exercise those full paths; the corpus now contains 287 scenarios.
+39 -39
View File
@@ -5850,38 +5850,38 @@
"round": 13,
"seed": 3994643046,
"waveId": "act1autochess_h06",
"time": 198.03,
"ticks": 5941,
"reason": "cleared",
"killed": 150,
"time": 230,
"ticks": 6900,
"reason": "timeout",
"killed": 149,
"total": 150,
"unspawned": 0,
"bossHpLeft": null,
"rngDraws": 1626,
"rngDraws": 1637,
"errors": {"count":0,"kinds":[]},
"players": {"p1":{"killed":150,"total":150,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":1661420,"bossDmg":0,"heal":56685,"deaths":1,"layerGains":{}}},
"players": {"p1":{"killed":149,"total":150,"perfect":false,"leaks":1,"leaksUncounted":0,"coins":0,"dmg":1648194,"bossDmg":0,"heal":65699,"deaths":0,"layerGains":{}}},
"units": [
["p1",1,"op","chess_char_5_diy1_a",0,null,2244,1,5,1,6436,260,0,9,2],
["p1",2,"op","chess_char_5_diy2_a",1,null,2244,1,7,29,321186,4202,0,103,5],
["p1",3,"op","chess_char_5_diy1_a",2,null,2244,1,10,42,323043,24114,0,196,2],
["p1",4,"op","chess_char_5_diy2_b",0,"none",2740.1,1,11,0,17637,2190,0,32,8],
["p1",5,"op","chess_char_5_diy1_b",1,"none",2740.1,1,13,54,636268,3391,0,191,6],
["p1",6,"op","chess_char_5_diy2_b",2,"none",1833.1,1,145,24,356851,9329,0,109,2],
["p1",1,"op","chess_char_5_diy1_a",0,null,2244,1,5,0,795,0,0,2,0],
["p1",2,"op","chess_char_5_diy2_a",1,null,2244,1,7,17,177136,4652,0,104,5],
["p1",3,"op","chess_char_5_diy1_a",2,null,2244,1,10,26,292321,14630,0,171,2],
["p1",4,"op","chess_char_5_diy2_b",0,"none",2740.1,1,11,1,23925,219,0,21,5],
["p1",5,"op","chess_char_5_diy1_b",1,"none",2740.1,1,13,44,563489,2024,0,171,6],
["p1",6,"op","chess_char_5_diy2_b",2,"none",2677.81,1,15,61,590529,13446,0,162,2],
["p1",7,"op","chess_char_6_diy1_b",0,"none",1818.3,1,8,0,0,0,0,0,0],
["p1",8,"op","chess_char_6_diy2_b",1,"none",1818.3,1,12,0,0,0,0,0,0],
["p1",9,"op","chess_char_6_diy1_b",2,"none",1818.3,1,14,0,0,0,0,0,0],
["p1",10,"op","chess_char_6_diy2_b",0,"uniequip_002_monstr",1818.3,1,4,0,0,0,24672,66,16],
["p1",11,"op","chess_char_6_diy1_b",1,"uniequip_002_monstr",1818.3,1,6,0,0,0,22077,56,2],
["p1",12,"op","chess_char_6_diy2_b",2,"uniequip_002_monstr",1818.3,1,9,0,0,16846,9935,34,0],
["p1",10,"op","chess_char_6_diy2_b",0,"uniequip_002_monstr",1818.3,1,4,0,0,0,38426,75,18],
["p1",11,"op","chess_char_6_diy1_b",1,"uniequip_002_monstr",1818.3,1,6,0,0,0,17126,50,2],
["p1",12,"op","chess_char_6_diy2_b",2,"uniequip_002_monstr",1818.3,1,9,0,0,30791,10147,31,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]
],
"enemies": {"enemy_1249_lysdb_2":[60,60,0,22385,671846],"enemy_1251_lysyta":[51,51,0,170,261740],"enemy_1329_cbshld":[39,39,0,37777,727834]},
"hooks": [1,166,5941,1054,1054,2053,2565,473,151,151,43,39,24,10083,0,64,150,0,1,151,0,47,0],
"events": {"atk":1558,"deploy":13,"die":151,"dmg":2565,"engage":6,"fx":855,"heal":194,"skill":82,"spawn":165,"status":97},
"fx": {"anchor":11,"blast":72,"burst":47,"lock":24,"shieldBreak":60,"teleport":630,"tide":11},
"snaps": "b5491880 3d470ed3 e24470a9 9efdac52 682ba7c7 5053e7b1 372bc538 4f6990b6 78e9810f 2e63af8e c036a7f6 85430b6a f0f306e0 83b41054 a23bd5e0 216b4871 ad7483be 0e1ae0c5 b71814eb 25d90322"
"enemies": {"enemy_1249_lysdb_2":[60,60,0,13932,671846],"enemy_1251_lysyta":[51,51,0,261,261740],"enemy_1329_cbshld":[39,38,0,51568,714608]},
"hooks": [1,165,6900,1038,1038,2096,2633,480,149,149,40,38,30,12173,0,68,150,0,1,149,0,46,0],
"events": {"atk":1587,"deploy":12,"die":149,"dmg":2633,"engage":6,"fx":973,"heal":194,"skill":78,"spawn":165,"status":93},
"fx": {"anchor":11,"blast":90,"burst":46,"lock":30,"shieldBreak":60,"teleport":725,"tide":11},
"snaps": "d4a56f82 64456d40 69d788a6 1a64a697 4c406731 aced5db8 c80b4ecb b75d0c6b d00450e6 c01e3305 a7cf048f b62cb632 1d43a004 027135f0 c43aadd9 edcbe0cc f2c9091e 7ca44db3 1842ebec c818f908 8b4dc80f 94959613 0d364901"
},
"diy-136": {
"about": "5_diy1_a=cdfend 5_diy2_b=cdfend 6_diy1_a=clemnt/S1 6_diy2_a=clemnt/S2 6_diy1_a=clemnt/S3 6_diy2_b=clemnt/S1 6_diy1_b=clemnt/S2 6_diy2_b=clemnt/S3 5_diy1_a=cguard 5_diy2_b=cguard 5_diy1_a=csnipe 5_diy2_b=csnipe",
@@ -5895,35 +5895,35 @@
"time": 212.4,
"ticks": 6372,
"reason": "cleared",
"killed": 13,
"killed": 12,
"total": 123,
"unspawned": 0,
"bossHpLeft": null,
"rngDraws": 358,
"rngDraws": 336,
"errors": {"count":0,"kinds":[]},
"players": {"p1":{"killed":13,"total":123,"perfect":false,"leaks":110,"leaksUncounted":0,"coins":0,"dmg":651626,"bossDmg":0,"heal":0,"deaths":20,"layerGains":{}}},
"players": {"p1":{"killed":12,"total":123,"perfect":false,"leaks":111,"leaksUncounted":0,"coins":0,"dmg":540205,"bossDmg":0,"heal":0,"deaths":20,"layerGains":{}}},
"units": [
["p1",1,"op","chess_char_5_diy1_a",2,null,0,0,107,0,28,4256,0,2,1],
["p1",2,"op","chess_char_5_diy2_b",2,"none",0,0,127,0,702,5816,0,6,1],
["p1",3,"op","chess_char_6_diy1_a",0,null,0,0,136,0,7472,4488,0,8,1],
["p1",4,"op","chess_char_6_diy2_a",1,null,0,0,147,7,383594,4488,0,38,1],
["p1",5,"op","chess_char_6_diy1_a",2,null,0,0,86,0,1871,4488,0,7,0],
["p1",6,"op","chess_char_6_diy2_b",0,"none",0,0,82,1,26868,5480,0,25,5],
["p1",7,"op","chess_char_6_diy1_b",1,"none",0,0,79,5,136419,5480,0,15,1],
["p1",8,"op","chess_char_6_diy2_b",2,"none",0,0,74,0,11047,5480,0,15,0],
["p1",1,"op","chess_char_5_diy1_a",2,null,0,0,107,0,41,4256,0,3,1],
["p1",2,"op","chess_char_5_diy2_b",2,"none",0,0,127,0,686,5816,0,5,1],
["p1",3,"op","chess_char_6_diy1_a",0,null,0,0,136,0,5820,4488,0,8,1],
["p1",4,"op","chess_char_6_diy2_a",1,null,0,0,147,6,320372,4488,0,38,1],
["p1",5,"op","chess_char_6_diy1_a",2,null,0,0,87,0,2545,4488,0,10,0],
["p1",6,"op","chess_char_6_diy2_b",0,"none",0,0,82,1,7708,5480,0,16,3],
["p1",7,"op","chess_char_6_diy1_b",1,"none",0,0,79,5,121380,5480,0,14,1],
["p1",8,"op","chess_char_6_diy2_b",2,"none",0,0,74,0,9062,5480,0,15,0],
["p1",9,"op","chess_char_5_diy1_a",2,null,0,0,91,0,6214,5128,0,11,1],
["p1",10,"op","chess_char_5_diy2_b",2,"none",3334,1,149,0,469,6668,0,8,1],
["p1",11,"op","chess_char_5_diy1_a",2,null,1271,1,4,0,36941,0,0,186,3],
["p1",12,"op","chess_char_5_diy2_b",2,"none",1510,1,5,0,40002,0,0,191,3],
["p1",10,"op","chess_char_5_diy2_b",2,"none",3334,1,149,0,494,6668,0,8,2],
["p1",11,"op","chess_char_5_diy1_a",2,null,1271,1,4,0,31537,0,0,186,3],
["p1",12,"op","chess_char_5_diy2_b",2,"none",1510,1,5,0,34346,0,0,191,3],
["-","~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]
],
"enemies": {"enemy_1006_shield_3":[21,0,21,21703,200406],"enemy_1043_zomsbr":[66,13,53,7416,374461],"enemy_1402_tgshd_2":[36,0,36,20624,172729]},
"hooks": [1,149,6372,612,612,2274,2370,18794,33,143,18,18,0,15658,0,43,123,110,1,33,0,12,0],
"events": {"atk":612,"deploy":23,"die":33,"dmg":2370,"engage":12,"fx":298,"leak":110,"skill":36,"spawn":138,"status":104},
"fx": {"anchor":2,"burst":12,"expose":254,"teleport":28,"tide":2},
"snaps": "86776e30 c1bad963 559e3264 46aa7ee9 3425ff8c 70c737e8 aa3c0e2a 1d8b3ed4 c6110eba 814d43d6 e77ad147 812eda91 095ac019 ef11e0a6 6c647700 5b7d036c ee81eb83 3567cf14 ae42e2ad 3b143a2e 94d57690 805579e9"
"enemies": {"enemy_1006_shield_3":[21,0,21,23335,174202],"enemy_1043_zomsbr":[66,12,54,6877,334513],"enemy_1402_tgshd_2":[36,0,36,19209,128930]},
"hooks": [1,149,6372,593,593,2269,2376,18508,32,143,17,17,0,15626,0,43,123,111,1,32,0,16,0],
"events": {"atk":593,"deploy":23,"die":32,"dmg":2376,"engage":12,"fx":302,"leak":111,"skill":34,"spawn":138,"status":112},
"fx": {"anchor":2,"burst":16,"expose":254,"teleport":28,"tide":2},
"snaps": "c41bdf1e ba9689e9 95a94805 6a5c07f5 6a39faef baaf84d6 c789d836 720ae281 580554e9 16c94931 4134a0d2 14068077 5c33c2f3 7c5d0f33 12b17543 7301d5e3 93e46c21 91620dab e2816266 67997963 515c8b4e b7f90d0f"
},
"diy-137": {
"about": "5_diy1_a=acfend 5_diy2_b=acfend 5_diy1_a=acpion 5_diy2_b=acpion 5_diy1_a=acguad 5_diy2_b=acguad 5_diy1_a=ccast 5_diy2_b=ccast 5_diy1_a=cmedic 5_diy2_b=cmedic 5_diy1_a=csuppo 5_diy2_b=csuppo",
+795 -569
View File
File diff suppressed because it is too large. Load diff