feedback5: merge feedback4 (7ee815e) — W4D ported: a sleeping enemy cannot be blocked and takes no block slot (_checkBlock in server/sim/battle/blocking.js, the applyStatus release in battle/status.js, the plain-buff release re-applied to ai.js updateEnemy's cannot-act branch after WE1's swing cut, 瑕光's comment in kits/ops/chess_char_3_12-blemsh.js, buffs.js; 酒神's 迷狂牢笼 skips a sleeper too); golden: roster-003 / 005 / 013 / 032 / 038 / 039 / 042, bond-maniShip-high, solo-FUNNY-1, coop4-FUNNY-6, coop4-ABYSS-7, coop2-NORMAL-8-serverrun, coop2-NORMAL-70-diy, diy-131 / 132 moved

New on feedback4 since the last merge: W4D (bbe59b9, merged as 7ee815e) and the 0.1.4 version commit (30e7ace).
feedback5 keeps its own package.json / package-lock.json / APP_VERSION / README / DEPLOY version lines (0.2.0 sets
its own version later) and takes feedback4's CHANGELOG 0.1.4 entry, with W4D's line in it.

- Port (PRTS 异常效果 SLEEPING 沉睡 = 无法行动+无敌+不可阻挡; GitHub #140; the owner's decision of 2026-10-06):
  `_checkBlock` refuses `flags.sleep` (battle/blocking.js) and `applyStatus` releases an enemy that falls asleep
  (battle/status.js). Battle.js stays feedback5's façade, and tier3.js stays deleted (the 瑕光 comment is in her kits/ops
  file). ai.js: WE1 (89f730d) cuts a swing before enemyAttack on a stun / freeze / sleep. The cannot-act branch is still
  there, and a plain-buff `flags.sleep` still makes the enemy `stun` (units.js), so the plain-buff release stays in that
  branch, after the cut, with its comment rewritten for the new order.
- New on feedback5: 酒神's 迷狂牢笼 (kits/ops/op-phatm2.js cageBlock, O22) duplicated the old three-flag 不可阻挡 check.
  It now skips a sleeper too. No golden scenario spawns a 牢笼 over a sleeper: the corpus is identical with that line
  reverted. 予愿安洁莉娜's S3 helper is unchanged, since canTargetEnemy already drops sleepers.
- Readers that follow without code: blockedTargets (blocked-first targeting, the DEFAULT trigger, hitAllBlocked), the 要塞
  branch of acquireTargets (u.blocking), “庞贝”'s clock (blockedBy), the snapshot's UF.BLOCKED and the client's block
  marker (render/units.js). 死芒 S2 折朽 (自选) lets go a linked enemy that her 悲叹的仆役 held.
- Docs: DESIGN §24.9, its §24 intro entry, the §5.5 Blocking sentence (on feedback5's 阻挡半径倍率 text) and §22.8's
  "(since §24.9)", all as on feedback4; SIM.md as on feedback4 (the plain-buff sentence merged with feedback5's
  noNewBlock / undying text).
- Golden: a probe (counting successful sleeps on a blocked enemy, plain-buff sleeps and 牢笼 spawns over sleepers) ran
  over all 283 scenarios. Every scenario that moved sleeps blocked enemies; the counts are in brackets:
  roster-003 (小满 S2 [5]: same fight, blocked 27 → 29, snapshot hashes); roster-005 (elite 小满 S2 [3]: the 140 s
  timeout with 83 kills and 1 leak, where it used to clear at 135.43 s with 84); roster-013 (缇缇 S3 [11]: same kills,
  blocked 22 → 33); roster-032 (缇缇 S1 [10]: 71 kills instead of 68, 8 leaks instead of 11, 4 knock-outs instead of 8,
  萨尔贡 layers 41 → 35); roster-038 (elite 缇缇 S2 [1]: ends at 197.40 s instead of 197.27 s); roster-039 (瑕光 S2
  normal + elite [31 + 12]: same kills and counted leaks, the 窃贼 gets away, blocked 53 → 87); roster-042 (缇缇 S2 [3]:
  ends at 168.77 s instead of 166.93 s); bond-maniShip-high (小满 [1]: blocked 29 → 30, snapshot hashes); solo-FUNNY-1
  (ai_0's 缇缇 [3]: only ai_0's damage dealt); coop4-FUNNY-6 (ai_0's 缇缇 [15 + 56]: from round 9 ai_0's 精准 / 萨尔贡
  layers and boss damage move, ai_1 loses no LP from round 11, team LP 124 → 130); coop4-ABYSS-7 (ai_2's 小满 [18]: ai_2
  one kill fewer, ai_0 one more LP lost in round 9); coop2-NORMAL-8-serverrun (ai_1's 缇缇 [83]: only ai_1's damage dealt;
  WE1 had already turned this match into a loss); coop2-NORMAL-70-diy (the 自选 seat h_0's 缇缇 [171], ai_0's 缇缇 [74]
  and 小满 [19 + 21]: h_0's layers move from round 4, then its AI 托管 buys differently (boards from round 7); ai_0 246
  kills instead of 233, same end); diy-131 (死芒 S2 at tiers 5 and 6 [1 + 1]: snapshot hashes only); diy-132 (elite
  死芒 S2 [2]: ends at 199.50 s instead of 198.13 s, same kills). One scenario sleeps a blocked enemy and did not move:
  coop2-HARD-4 [1]. ai_1's 小满 lets go the enemy it holds; another enemy takes the slot; the sleeper wakes with no room
  and is blocked further on by 2_16_a. The match digest has no snapshot hashes, and its kills, leaks, damage and funds
  are identical. fields and standins did not move. Most outcomes differ from feedback4's list because feedback5's
  baselines differ (WE1's damage frame, etc.).
- Tests: test/sim/feedback4-sleep-unblock.test.js (from feedback4) passes 5/5 on the split layout. Every case fails with
  the three sim hunks reverted, and case 3 (plain buff) fails with only the ai.js release reverted. Targeted sim tests
  pass 184/184 (blocking, block targets, enemy swing, feedback2-enemy-attack-stand, combat / statuses, robustness,
  stun SP, professions, healers, fidelity …). Content tests plus kits_layout and docs-consistency pass 658/658 (kits
  t1t2 / t3 / t5 and alt t2 / t3 / t5 for 小满 / 瑕光 / 缇缇, 酒神, 死芒, garrisons, bosses, items). Stealth / liftoff /
  enemies pass 36/36. npm run golden: all 283 match. GOLDEN_FULL=1 test/golden.test.js passes 9/9 (no stored engine
  error). lint 0 errors, check:imports and typecheck clean.
This commit is contained in:
sganggs committed 2026-10-06 17:49:10 +08:00
commit ac6454d171
14 files changed
+558 -261

No files matched your search

+49 -51
View File
@@ -5693,7 +5693,7 @@
"hooks": [1,181,5641,1140,1140,1749,1921,274,136,158,79,78,0,53126,39,91,135,0,1,136,0,12,0],
"events": {"atk":1140,"deploy":43,"die":158,"dmg":1921,"engage":25,"fx":503,"heal":78,"skill":157,"spawn":180,"status":109},
"fx": {"aoe":148,"burst":12,"grow":274,"phase":17,"sleep":22,"summon":30},
"snaps": "a2b6d681 a161dbba c8c77c2a e1ca6bcb 8a95ec41 de00e2b2 05566395 20db1c00 410a04db 8a3729a8 6098ba0c 704b60ae f781b8ab 17e5d22a cfb7925a b00e17a6 0d7b4086 15ca0ae7 2fd1162d"
"snaps": "a2b6d681 a161dbba c8c77c2a e1ca6bcb 8a95ec41 de00e2b2 05566395 20db1c00 1a3f3737 feef3ad4 e4e5afe0 32f2a66a 4844c1a7 1adafe3e be28c9ee f51e131a 8ec3e3ca 39395053 208fb6d1"
},
"diy-132": {
"about": "6_diy1_b=necras/S1 6_diy2_b=necras/S2 6_diy1_b=necras/S3 6_diy2_b=necras/S1/002_necras 6_diy1_b=necras/S2/002_necras 6_diy2_b=necras/S3/002_necras 5_diy1_a=kalts2/S1 5_diy2_a=kalts2/S2 5_diy1_a=kalts2/S3 5_diy2_b=kalts2/S1 5_diy1_b=kalts2/S2 5_diy2_b=kalts2/S3",
@@ -5704,74 +5704,72 @@
"round": 13,
"seed": 326579774,
"waveId": "act1autochess_h06",
"time": 198.13,
"ticks": 5944,
"time": 199.5,
"ticks": 5985,
"reason": "cleared",
"killed": 123,
"total": 123,
"unspawned": 0,
"bossHpLeft": null,
"rngDraws": 27,
"rngDraws": 30,
"errors": {"count":0,"kinds":[]},
"players": {"p1":{"killed":123,"total":123,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":1102059,"bossDmg":0,"heal":61381,"deaths":0,"layerGains":{}}},
"players": {"p1":{"killed":123,"total":123,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":1102819,"bossDmg":0,"heal":56852,"deaths":0,"layerGains":{}}},
"units": [
["p1",1,"op","chess_char_6_diy1_b",0,"none",1762,1,3,2,8973,0,0,13,2],
["p1",2,"op","chess_char_6_diy2_b",1,"none",1762,1,4,1,53157,0,0,4,3],
["p1",3,"op","chess_char_6_diy1_b",2,"none",1762,1,11,4,43088,0,0,49,5],
["p1",4,"op","chess_char_6_diy2_b",0,"uniequip_002_necras",1962,1,13,9,60369,2143,22,52,6],
["p1",5,"op","chess_char_6_diy1_b",1,"uniequip_002_necras",1962,1,5,4,33420,0,0,10,4],
["p1",6,"op","chess_char_6_diy2_b",2,"uniequip_002_necras",1962,1,8,43,267110,0,0,108,9],
["p1",1,"op","chess_char_6_diy1_b",0,"none",1762,1,3,0,1486,0,0,4,2],
["p1",2,"op","chess_char_6_diy2_b",1,"none",1762,1,4,1,35265,0,0,3,2],
["p1",3,"op","chess_char_6_diy1_b",2,"none",1762,1,11,4,37867,0,0,46,5],
["p1",4,"op","chess_char_6_diy2_b",0,"uniequip_002_necras",1962,1,13,8,56850,2143,22,48,6],
["p1",5,"op","chess_char_6_diy1_b",1,"uniequip_002_necras",1962,1,5,2,3502,0,0,0,2],
["p1",6,"op","chess_char_6_diy2_b",2,"uniequip_002_necras",1962,1,8,39,303779,0,0,112,8],
["p1",7,"op","chess_char_5_diy1_a",0,null,1741.25,1,12,0,0,0,939,4,1],
["p1",8,"op","chess_char_5_diy2_a",1,null,1741.25,1,14,7,77755,0,473,12,1],
["p1",8,"op","chess_char_5_diy2_a",1,null,1741.25,1,14,7,85738,0,473,12,1],
["p1",9,"op","chess_char_5_diy1_a",2,null,1741.25,1,9,0,0,0,0,0,0],
["p1",10,"op","chess_char_5_diy2_b",0,"none",1928.75,1,6,0,0,0,0,0,0],
["p1",11,"op","chess_char_5_diy1_b",1,"none",1928.75,1,7,7,52418,0,0,10,1],
["p1",11,"op","chess_char_5_diy1_b",1,"none",1928.75,1,7,3,32429,0,0,8,1],
["p1",12,"op","chess_char_5_diy2_b",2,"none",1928.75,1,10,0,0,0,709,3,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],
["p1","~1","token","token_10043_necras_skeltn",null,null,1814.64,0,24,1,4296,4225,2924,10,null],
["p1","~2","token","token_10043_necras_skeltn",null,null,0,0,29,0,462,1744,0,2,null],
["p1","~3","token","token_10043_necras_skeltn",null,null,0,0,32,0,231,1744,0,1,null],
["p1","~4","token","token_10043_necras_skeltn",null,null,3488,1,35,0,555,0,0,2,null],
["p1","~5","token","token_10043_necras_skeltn",null,null,0,0,36,1,11636,5232,0,6,1],
["p1","~2","token","token_10043_necras_skeltn",null,null,0,0,29,0,231,1744,0,1,null],
["p1","~3","token","token_10043_necras_skeltn",null,null,1744,0,32,0,0,0,0,0,null],
["p1","~4","token","token_10043_necras_skeltn",null,null,3488,1,35,0,0,0,0,0,null],
["p1","~5","token","token_10043_necras_skeltn",null,null,0,0,36,1,3826,5232,0,5,0],
["p1","~6","token","token_10043_necras_skeltn",null,null,3488,1,37,0,0,0,0,0,null],
["p1","~7","token","token_10043_necras_skeltn",null,null,3488,1,38,0,0,0,0,0,null],
["p1","~8","token","token_10043_necras_skeltn",null,null,0,0,39,0,3665,8985,5497,8,0],
["p1","~9","token","token_10043_necras_skeltn",null,null,3488,1,45,0,2404,3777,4709,5,null],
["p1","~10","token","token_10043_necras_skeltn",null,null,3488,0,46,0,647,0,0,2,0],
["p1","~8","token","token_10043_necras_skeltn",null,null,0,0,39,0,1630,3488,0,4,0],
["p1","~9","token","token_10043_necras_skeltn",null,null,3488,0,42,0,1988,837,837,4,0],
["p1","~10","token","token_10043_necras_skeltn",null,null,2651.32,0,44,0,3560,5879,5042,7,0],
["p1","~11","token","token_10043_necras_skeltn",null,null,3431.01,0,47,0,2821,2567,2510,5,null],
["p1","~12","token","token_10043_necras_skeltn",null,null,811.72,0,50,0,786,932,0,3,0],
["p1","~13","token","token_10043_necras_skeltn",null,null,13603.2,1,52,39,435375,23977,26686,40,7],
["p1","~14","token","token_10043_necras_skeltn",null,null,3431.01,0,53,1,5149,1301,1740,13,0],
["p1","~15","token","token_10043_necras_skeltn",null,null,0,0,55,0,231,1744,0,1,0],
["p1","~16","token","token_10043_necras_skeltn",null,null,3488,0,56,1,2329,75,75,7,0],
["p1","~17","token","token_10043_necras_skeltn",null,null,0,0,67,0,2035,3488,0,4,0],
["p1","~18","token","token_10043_necras_skeltn",null,null,3384.16,0,71,1,4596,690,586,10,null],
["p1","~19","token","token_10043_necras_skeltn",null,null,3488,0,76,0,0,0,0,0,0],
["p1","~20","token","token_10043_necras_skeltn",null,null,3412.65,0,91,0,1838,462,387,5,0],
["p1","~21","token","token_10043_necras_skeltn",null,null,3431.01,0,95,0,1283,2902,2845,3,null],
["p1","~22","token","token_10043_necras_skeltn",null,null,0,0,96,0,694,3641,277,2,0],
["p1","~23","token","token_10043_necras_skeltn",null,null,3488,0,98,0,462,114,114,1,0],
["p1","~24","token","token_10043_necras_skeltn",null,null,3402.51,1,101,0,1803,85,0,5,null],
["p1","~25","token","token_10043_necras_skeltn",null,null,3488,0,109,0,231,124,248,1,0],
["p1","~26","token","token_10043_necras_skeltn",null,null,3488,0,110,0,0,114,114,0,0],
["p1","~27","token","token_10043_necras_skeltn",null,null,3384.16,0,121,1,4596,690,586,10,null],
["p1","~28","token","token_10043_necras_skeltn",null,null,3488,0,131,0,231,28,28,1,0],
["p1","~29","token","token_10043_necras_skeltn",null,null,0,0,132,0,2035,3516,28,4,0],
["p1","~30","token","token_10043_necras_skeltn",null,null,3488,1,145,0,3225,4518,4518,6,null],
["p1","~31","token","token_10043_necras_skeltn",null,null,3459.5,0,150,0,647,334,553,2,0],
["p1","~32","token","token_10043_necras_skeltn",null,null,1744,0,152,0,231,0,0,1,0],
["p1","~33","token","token_10043_necras_skeltn",null,null,3384.16,0,153,0,6335,3714,3610,13,0],
["p1","~34","token","token_10043_necras_skeltn",null,null,3488,0,155,0,0,0,0,0,0],
["p1","~35","token","token_10043_necras_skeltn",null,null,3488,0,163,1,4477,1201,1201,11,0],
["p1","~36","token","token_10043_necras_skeltn",null,null,3488,0,166,0,0,0,0,0,0],
["p1","~37","token","token_10043_necras_skeltn",null,null,3488,1,174,0,462,0,0,1,0]
["p1","~12","token","token_10043_necras_skeltn",null,null,13603.2,1,50,54,484229,22551,23493,43,7],
["p1","~13","token","token_10043_necras_skeltn",null,null,2565.83,0,52,1,6327,6902,5980,14,0],
["p1","~14","token","token_10043_necras_skeltn",null,null,3488,0,54,0,2266,0,0,4,0],
["p1","~15","token","token_10043_necras_skeltn",null,null,0,0,66,0,1988,3488,0,4,0],
["p1","~16","token","token_10043_necras_skeltn",null,null,3402.51,0,67,0,832,199,114,2,0],
["p1","~17","token","token_10043_necras_skeltn",null,null,3384.16,0,70,1,4596,690,586,10,null],
["p1","~18","token","token_10043_necras_skeltn",null,null,3488,0,82,0,0,0,0,0,0],
["p1","~19","token","token_10043_necras_skeltn",null,null,3431.01,0,93,0,1283,2902,2845,3,null],
["p1","~20","token","token_10043_necras_skeltn",null,null,0,0,95,0,1526,3516,28,3,0],
["p1","~21","token","token_10043_necras_skeltn",null,null,3488,0,98,0,0,0,0,0,0],
["p1","~22","token","token_10043_necras_skeltn",null,null,3488,0,101,0,0,57,57,0,0],
["p1","~23","token","token_10043_necras_skeltn",null,null,3459.5,0,109,0,347,210,305,1,0],
["p1","~24","token","token_10043_necras_skeltn",null,null,3488,0,112,0,0,0,0,0,0],
["p1","~25","token","token_10043_necras_skeltn",null,null,3384.16,0,119,1,4596,690,586,10,null],
["p1","~26","token","token_10043_necras_skeltn",null,null,0,0,132,0,4138,4341,853,10,0],
["p1","~27","token","token_10043_necras_skeltn",null,null,3488,0,135,0,0,0,0,0,0],
["p1","~28","token","token_10043_necras_skeltn",null,null,3488,1,143,0,1283,2845,2845,3,null],
["p1","~29","token","token_10043_necras_skeltn",null,null,1744,0,150,0,231,0,0,1,0],
["p1","~30","token","token_10043_necras_skeltn",null,null,3488,0,151,0,8300,4581,4581,16,0],
["p1","~31","token","token_10043_necras_skeltn",null,null,3488,0,152,0,1526,0,0,4,0],
["p1","~32","token","token_10043_necras_skeltn",null,null,1744,1,154,0,0,0,0,0,null],
["p1","~33","token","token_10043_necras_skeltn",null,null,1744,1,155,0,0,0,0,0,null],
["p1","~34","token","token_10043_necras_skeltn",null,null,3431.01,1,167,0,4081,808,1123,9,0],
["p1","~35","token","token_10043_necras_skeltn",null,null,3488,1,169,0,0,0,0,0,0]
],
"enemies": {"enemy_1019_jshoot_2":[57,57,0,8639,255302],"enemy_1299_ymkilr_2":[27,27,0,72081,492687],"enemy_1422_lrsldr_2":[39,39,0,3348,355830]},
"hooks": [1,174,5944,840,840,1293,1293,213,131,152,40,39,20,29951,48,127,123,0,1,131,0,0,0],
"events": {"atk":840,"deploy":49,"die":152,"dmg":1292,"engage":39,"fx":369,"heal":80,"skill":79,"spawn":174,"status":44},
"fx": {"aoe":126,"grow":150,"healAoe":20,"shield":23,"sleep":7,"summon":37,"takeoff":6},
"snaps": "84c34497 3ba00c17 23904482 05a48a6a 5c8edcc9 e3901661 b182f761 9164cbb2 af7418a9 f60eb6cc 35935c64 86c45aae 689f94d2 fc485851 4d80d363 25842ab6 4b72339c d025887f d04447e8 8fd2db5a"
"enemies": {"enemy_1019_jshoot_2":[57,57,0,7920,255302],"enemy_1299_ymkilr_2":[27,27,0,69593,492687],"enemy_1422_lrsldr_2":[39,39,0,2382,355830]},
"hooks": [1,172,5985,781,781,1168,1168,189,129,149,35,34,18,26850,44,130,123,0,1,129,0,0,0],
"events": {"atk":781,"deploy":47,"die":149,"dmg":1167,"engage":30,"fx":343,"heal":78,"skill":69,"spawn":172,"status":31},
"fx": {"aoe":123,"grow":134,"healAoe":18,"shield":23,"sleep":4,"summon":35,"takeoff":6},
"snaps": "84c34497 8a3fd98c 7ef5badd e49f0e0f 5636bc92 044d1776 80c0d96c 76a2965c 4721a4ad 499bee66 525bcd3a 2d11913f 0e842ba4 12c8f78e b5520f0d c2a44cb7 27962480 c897b4ed 5da90a45 53e377fa"
},
"diy-133": {
"about": "6_diy1_a=kalts2/S1 6_diy2_a=kalts2/S2 6_diy1_a=kalts2/S3 6_diy2_b=kalts2/S1 6_diy1_b=kalts2/S2 6_diy2_b=kalts2/S3 5_diy1_a=monstr/S1 5_diy2_a=monstr/S2 5_diy1_a=monstr/S3 5_diy2_b=monstr/S1 5_diy1_b=monstr/S2 5_diy2_b=monstr/S3",