Commit Graph
100 Commits
Author SHA1 Message Date
sganggs 42920c62c5 feedback5 WH: golden family diy — 6 battles of 自选 pieces through the BattleSpec path: 推进之王 in every form of tiers 5 / 6 (normal; elite with no module, SOL-X, SOL-Y) under each skill, and every kitted prototype at its locked selection, normal and elite; fast subset diy-001 (operator kit) and diy-003 (prototypes)
A new family (test/golden/diy.json): no existing scenario moved (roster 49, bonds 46, fields 22, matches 16 identical); determinism checked with --twice.
2026-10-05 19:57:55 +08:00
sganggs ee74401901 feedback5 WH: the first 自选 operator kit, 推进之王 (kits/ops/op-siege.js, registered in OPERATOR_KIT_FILES) — S1 冲锋号令·γ型 +12 DP at full SP, S2 跃空锤 next attack 250 / 280 % ATK on every ground enemy of her x-5 + 3 DP (2 / 3 charges), S3 碎颅击 interval +1.0 s with 290 / 320 % ATK and 40 % stun 0.8 / 1.1 s; T1 万兽之王 field 【先锋】 ATK / DEF +8 % (SOL-X stage 3: her own +8 % more), T2 粉碎 +1 SP per enemy falling on her x-5 (flyers, under 阻回; SOL-Y stage 3: +3 and +1 to another 先锋); SOL-X trait ATK / DEF +8 % while blocking; SOL-Y's 首次部署 −4 has no battle effect; tests in test/content/op_siege.test.js over every form (tiers 5 / 6, normal / elite × none / SOL-X / SOL-Y)
No golden scenario moved (none fields a 自选 piece).
2026-10-05 19:54:32 +08:00
sganggs 2b72d4deb0 feedback5 WH: 自选 pieces in the sim — shared/diy.js (diyPool, checkDiyPick, diyRecord / diyRecordOf, validateDiyPicks: the legal picks per tier, prototypes skill-locked to their 补位 rows, owned picks any skill / module at the slot's stage, no 特质, derived bonds, one slot per owned operator, distinct picks per tier, unkitted operators refused); simdata getChess(slotId, { diy }) builds the 自选 def (diyFor, charId, loadout.diy, tokenOwner) and getToken resolves its summons from backups.json tokens; Battle, BattleSpec and the loadout view carry the PlayerBattleInput diy pick (a DIY slot without a legal pick fields nothing); kitOf takes KITS[charId] for a 自选 piece as for a stand-in; kits/index.js OPERATOR_KIT_FILES (op-<codename>.js, empty for now), GENERIC_KIT_CHARS, KITTED_CHARS; the harness fields units[].diy
No golden scenario moved (none fields a 自选 piece).
2026-10-05 19:51:40 +08:00
sganggs c278eafa52 feedback5 WH: 自选 data — data/backups.json gets the 72 owned 6★ picks as units (a form at every DIY slot status: E2 Lv1 rank 4 without a module, E2 Lv60 rank 7 with every module at stage 1 and at stage 3; all three skills, talents, trait, ranges), their summons (backups.json tokens, variants keyed by owner form <charId>@<statusKey>) and each prototype's locked skill / module per tier (diy.locked: its 补位 rows' selection, 预备干员-医疗 S3 assumed); the 6 collab operators (teams rainbow / action4 / mujica / sees / laios) leave the data and the pool, the owner's decision of 2026-10-05
backups.json 171,616 → 1,884,868 bytes (gzip ≈ 142 KB); every other data file is byte-identical (buildTokens' record head moved into summonRecord, shared with the DIY summons). No golden scenario moved (none fields a 自选 piece).
2026-10-05 19:37:49 +08:00
sganggs a98b02477d feedback5: merge feedback4 — the mock scouting-pen test expects the 'prep' camera after a teammate's pen (PR #129) 2026-10-05 19:05:17 +08:00
sganggs 17d9960fb4 feedback5: merge W5F — ACTIVE_RANGE also replaces SEARCH rows and covers 深巡 S2, 纯烬艾雅法拉 S1 at full SP, 伺夜 S1 only with his pack on the field
Golden regenerated on the merged code (only test/golden/matches.json conflicted): against feedback5 it moves exactly W5F's scenarios (roster-001/002/016/026/027/028/038/041/042/044, bond-egirShip-low, bond-suntShip-high, boss-boss_2-pair, boss-boss_6-pair, solo-NORMAL-1, coop2-NORMAL-3, coop4-FUNNY-6, coop2-NORMAL-8-serverrun); against fb5-bugs3 exactly W5E's (unite-1/2 and the 8 match scenarios of the 联防 map and the full-hand rule). data/ equals an offline build of the merged tools/build-data.mjs.
2026-10-05 19:05:06 +08:00
sganggs a252d48add feedback4: the mock scouting-pen test expects the 'prep' camera on the way back from a teammate's pen (PR #129 frames a scouted prep board like the own prep) 2026-10-05 19:02:31 +08:00
sganggs e89901f64f feedback5 WF: 伺夜 S1 领袖的呼唤 fires only while his pack is on the field (PRTS 备注 「仅场上存在狼群时可触发技能」, the owner's decision of 2026-10-05)
The kit sets trigger NEVER on skchr_vigil_1 and casts it itself, like S2: a tick check (installCall) — ready, 伺夜 able
to act and not silenced, the pack (kit pack or the prep-phase 狼群 piece) alive. Without a pack the SP waits full and
no DP is paid; the cast still gives +cost DP and one more 狼影. [ASSUMED]: the kit has no 战术点形态, so a knocked-out
pack is waited for (PRTS ① would bring it back at once with one 狼影) and at the 狼影 cap the cast only pays its DP (PRTS
③ resets the pack's HP) — open for the owner. Data unchanged. Docs: DESIGN §5.6's SP_FULL list, PLAYING's 自动触发
sentence, kits/shared/tier3.js.

Tests: kits_alt_t3 "3_19 伺夜 S1 领袖的呼唤: PRTS 备注 … — no pack, no cast …" (new) and the S1 test (rule NEVER).

Golden: roster-028 (伺夜 elite with S1): his DP comes later while the pack is down.
2026-10-05 18:53:08 +08:00
sganggs f3e7919225 feedback5 WF: 纯烬艾雅法拉 S1 无声润物, an AUTO toggle that acts on her allies only, turns on as soon as its SP is full (the owner's decision of 2026-10-05)
The kit sets trigger SP_FULL on skchr_agoat2_1, like 浊心斯卡蒂 S2 and 引星棘刺 S1 (data unchanged: an AUTO skill takes
no 技能策略 row, so its trigger stays DEFAULT there). Before, the DEFAULT heal rule kept it off until an ally of her range
lost HP, so its 元素损伤 recovery never ran on a field without HP damage. Docs: DESIGN §5.6's SP_FULL list (AUTO skills
on allies: 引星棘刺 S1, 浊心斯卡蒂 S2, 纯烬艾雅法拉 S1), PLAYING's 自动触发 sentence.

Tests: kits_alt_t6 "6_20 纯烬艾雅法拉 S1 无声润物 (自动触发, effects on her allies only): on as soon as its SP is full …".

Golden: roster-038 (纯烬艾雅法拉 elite with S1) — the snapshot chain from 40 s: the toggle comes on earlier.
2026-10-05 18:48:42 +08:00
sganggs 383fe4a49e feedback5 WF: ACTIVE_RANGE also replaces the SEARCH row and covers 深巡 S2 — a skill whose running range strictly contains the own one casts with an enemy inside it (the owner's decisions of 2026-10-05)
tools/build-data.mjs resolveTrigger: a MANUAL operator skill on DEFAULT (no row, or a DEFAULT entry of the deviation
tables) or on the SEARCH row ("在初始攻击范围内存在敌人时释放技能": 解放者 / 阵法术师 / 安洁莉娜 — ACTIVE_RANGE_OVER) whose
running range strictly contains its own is ACTIVE_RANGE on that range, rawRule the official row; validateAll accepts a
DEFAULT deviation resolved to ACTIVE_RANGE (chess and stand-in tables) and ACTIVE_RANGE over SEARCH. Data rebuilt
offline, JSON-compared: only skills[].trigger rule / customRangeGrid of 薄绿 S1 (x-2), 蜜蜡 S1 (x-2), 卡涅利安 S3 (x-2),
玛恩纳 S2 (2-3), 安洁莉娜 S3 (y-4) — rawRule SEARCH — and 深巡 S2 (3-2, rawRule TAKE_DAMAGE), normal + elite (32
leaves); backups.json unchanged. Kits: 薄绿 S1 drops its DEFAULT trigger and 深巡 S2 PR #12's DEFAULT line, both read the
data now (雷蛇 S2 keeps PR #12's line). The sim needs no change (SEARCH was the DEFAULT condition on the initial range
every tick; ACTIVE_RANGE is the same on the running range). Docs: DESIGN §5.6 and the §21.20 flip row, DATA, SIM,
PLAYING, kits README, shared tier comments, skills.js header.

Tests: data (78 records / 39 skills, the five from SEARCH, the SEARCH skills that stay), feedback5-active-range (安洁莉娜
S3 on its y-4, S2 keeps SEARCH), feedback1-tank-triggers and kits_t1t2 (深巡 S2 on its 3-2, before any hit), kits_alt_t3
(薄绿 S1 on its x-2), feedback1f-fence (the idle measure uses the interval of the cooldown still running: the S2 now casts
between two attacks), docs-consistency (one PR #12 kit line left).

Golden: roster-001 / 002 (深巡), roster-016 / 044 (玛恩纳, 安洁莉娜), roster-026 / 027 (薄绿), roster-041 / 042 (卡涅利安),
bond-egirShip-low / bond-suntShip-high (深巡), boss-boss_2-pair / boss-boss_6-pair (玛恩纳, 安洁莉娜), matches solo-NORMAL-1,
coop2-NORMAL-3, coop4-FUNNY-6, coop2-NORMAL-8-serverrun — each fields one of the six skills, which now casts when an
enemy enters its running range.
2026-10-05 18:45:13 +08:00
sganggs 7d20695adf feedback5: merge R5 — client split: ui/gameLogic/*, render/fx/*, render/app/* (prelude), screens/game/* (same exports)
# Conflicts:
#	.git-blame-ignore-revs
#	public/js/ui/gameLogic.js
2026-10-05 18:38:43 +08:00
sganggs 211b909282 feedback5: merge K2 — stand-in kits Stormeye, Pith, Raidian (+ applyStatus stackAs for Raidian S3's 虚弱)
# Conflicts:
#	server/sim/content/kits/index.js
2026-10-05 18:36:01 +08:00
sganggs f317adf003 feedback5 K2: stand-in kits for Stormeye, Pith and Raidian — every skill, talent and module at every form
Stormeye (char_611_acnipe; 空弦, 莫斯提马, 百炼嘉维尔 / 妮芙, 蕾缪安 / 异客): 风坠 rolls on every attack instance
(acnipe_t_1: ATK × atk_scale before DEF; S3 talent@prob), 风雨欲来 +0.2 SP/s after `delay` s without an attack
[ASSUMED reading], S1 ATK / ASPD / 100 DEF ignored, S2 an endless toggle (ATK +5 %, 2 targets), S3 3 targets × double
hit plus one physical ATK × 1.0 instance on a target at >= 90 % HP on the attack's first hit (acnipe_s_3[extra], no
风坠 / MAR-X on it); MAR-X stays the fastshot profile's flyScale.

Pith (char_612_accast; 烛煌, 焰影苇草 / 迷迭香 / 荒芜拉普兰德): splash from the trait blackboard, 12 RES ignored, ATK
+10 / +20 % on herself and the 【术师】 of the 4 tiles next to her, S1 ASPD + splash 1.5, S2 ASPD + ATK on every 【术师】,
S3 one ATK × atk_scale_aoe arts hit on every enemy of her range at the cast, then 2 targets, ASPD, splash 1.2 (PRTS
备注); SPC-X range (moduleRangeUp).

Raidian (char_614_acsupo; 灵知, 夕 / 安洁莉娜, 浊心斯卡蒂 / 仇白): 同调 on herself and the operators next to her (×
talent_scale in S3), 诱引 per PRTS 命中率 — one roll per enemy attack in her range, a miss cancels the whole attack
before the enemy riders (hit priority 300), S1 / S2 from the blackboards (S2 flat −0.1 / −0.2 s, 停顿 1.1 / 1.2 s), S3
y-4 + ATK + 脆弱 / 虚弱 aura with the 虚弱 stacking as 90 / 80 % (stackAs); S3 casts by the data's ACTIVE_RANGE;
DEC-X +0.2 SP/s with an enemy in range.

Triggers stay the data's (AUTO attack buffs Stormeye S2 / Pith S1 keep DEFAULT, as the W5C AUTO audit). No golden
scenario fields a stand-in: digests unchanged. Tests: test/content/standin_acnipe / _accast / _acsupo (27).
2026-10-05 18:34:46 +08:00
sganggs acbb70dc6b feedback5: merge K3 — stand-in kits 郁金香, Mechanist, Touch (Touch shares the 外勤医疗 code; every skill on every form)
# Conflicts:
#	server/sim/content/kits/index.js
2026-10-05 18:28:54 +08:00
sganggs e2be2012e3 feedback5 K3: the 郁金香 stand-in kit (standin-acpion.js) — 无垠之心 / 浪潮之心, S1 钻心, S2 迅瞬 (1 DP every interval), S3 只余芬芳 (8 slashes on her Spine clip's events, 无敌 / 无法阻挡 / 眩晕冻结免疫, 可对空 — PRTS 备注 of the same skill), module SOL-X 2026-10-05 18:27:09 +08:00
sganggs d82511286c feedback5 K3: the Mechanist stand-in kit (standin-acfend.js) — 精研材料 / 反馈装甲 with PRTS's 0.1 s checks (the ASPD cut lasts while anyone blocks the enemy), S1 结构稳定, S2 不变性原理 (×2 / ×3 反馈装甲), S3 应力倒置 (per-second arts to the enemies she blocks), module PRO-X; the data's 重装 trigger kept 2026-10-05 18:26:49 +08:00
sganggs 55f53fdcb0 feedback5 K3: the Touch stand-in kit (standin-acmedc.js) — S1 慨赠, S2 宛如天启, module PHY-X; S3 恳切福音 and 攫升 / 超脱 run the 外勤医疗 strategy's Touch code, now exported from content/tokens.js (touchGospel, mapCharTalents; the strategy unchanged, golden identical) 2026-10-05 18:26:21 +08:00
sganggs 5090ac1ed3 feedback5: merge K1 — stand-in kits Sharp, 领主·Sharp, Misery (every skill on every form; PRTS-checked) 2026-10-05 18:25:17 +08:00
sganggs cb05592a06 feedback5 K1: Misery's stand-in kit (char_615_acspec, for 缄默德克萨斯 / 山 / 新约能天使 / 锏) — the three ON_DEPLOY passives at every deployment (S1 dodge / double-hit chance, S2 ATK / ASPD for 10 s, S3 burst then drag and 停顿 on unblocked ground enemies, on a redeploy), 二象命末 double hits, 四维分离, EXE-X 2026-10-05 18:23:51 +08:00
sganggs 199d3d73bf feedback5 K1: 领主·Sharp's stand-in kit (char_617_sharp2, for 水月 / 玛恩纳 / 维娜·维多利亚 / 妮芙) — S1 沉默的爆发 (ATK / ASPD up, two targets, ranged attacks at full ATK), both talents, LOR-X as the 10 % ATK arts 流失 PRTS describes (no RES, shield or invulnerability) 2026-10-05 18:23:51 +08:00
sganggs 558fcedf90 feedback5 K1: Sharp's stand-in kit (char_609_acguad, for 忍冬 / 银灰 / 百炼嘉维尔 / 隐德来希 / 归溟幽灵鲨 / 佩佩) — S1 快刀 double hits, S2 亮剑 DEF to 0 / max HP / 160-180 % attacks, S3 力战不竭 layers (one before each attack, reset on a new target) and HP never below 1, both talents, DRE-X 115 % on blocked enemies 2026-10-05 18:23:51 +08:00
sganggs eac9b9737d feedback5 K2: applyStatus stackAs — a 同名效果取最高 status can compete with another strength than its effect (Raidian S3's 虚弱, PRTS 备注 "在叠加时视为90%…的虚弱,仅影响叠加优先级"); no caller passes it yet, golden unchanged 2026-10-05 18:20:48 +08:00
sganggs ece75b6853 feedback5: merge W5E — a full hand refuses buys and reward picks, temp pieces fill freed slots (#82); 联防 plays on the official escaped maps (#41)
# Conflicts:
#	test/golden/fields.json
#	test/golden/matches.json
2026-10-05 18:19:36 +08:00
sganggs 8a43624935 feedback5 WE: 联防 is played on its own map, the escaped template level (GitHub #41, item 3) — act2autochess constData escapedBattleTemplateMapSinglePlayer / MultiPlayer = level_act1autochess_escaped_single / _multi name the level of the 联防 battle, and its map is the field: two road halves (cols 3–9 and 11–17, rows 9–12) joined at col 10, no water, crates or devices (until 0.1.3 the round's stage, opened to both halves). tools/build-data.mjs builds both into data/stages.json after the 11 battle stages (kind 'unite', helpers 1 / 2, weight 0, inactive, no modes, the name 联防阵地(N名玩家) the remake's own label [ASSUMED]; validation ties config.unite.templates to them); regenerated offline, a JSON compare shows only the two added records. unite.js uniteStageId picks the map of the helper count (escaped_single's routes enter at col 10, escaped_multi's at col 18 through (9,10)); match/unitePhase.js fields the 联防 battle on it (the round's stage only with data that lacks it); each helper on its prep tiles, the first of two shifted 8 columns onto the right half as before (the official halves; player_map_lr_offset 8). Client: screens/game.js draws the shown field's own map and restores the board's on leaving it (a 2-line change in a file of the R5 split; render/app.js enterBattle already loads m.field stageId); the dev mock's 联防 follows. The 联防 BGM (PR #110) is unchanged. Tests: test/match/feedback5-unite-map.test.js (both combat modes, 1 and 2 helpers, degraded data), test/data.test.js, test/render/tiles.test.js. Docs: DATA §12, META §4, DESIGN §3, PLAYING §5. Golden: fields unite-1 / unite-2 (the battle's stage → the 联防 map) and the 6 co-op match scenarios with a 联防 round (coop2-NORMAL-3, coop2-HARD-4, coop3-ABYSS-5, coop4-FUNNY-6, coop4-ABYSS-7, coop2-NORMAL-8-serverrun); roster / bonds unchanged (tools/golden.mjs leaves the 联防 maps out of its stage list) 2026-10-05 18:17:08 +08:00
sganggs db1b44bb71 feedback5 WE: the 整备区 rules of PRTS 卫戍协议/帮助 §手牌区 (GitHub #82, second part) — a full regular hand refuses every purchase and reward pick, also one whose copy would complete a merge at once ("当常规手牌区全满无空位时,玩家将无法执行使手牌溢出的操作" — "例如招募/购入等通常情况下会增加手牌的操作"; BWIKI 盟约 says the same with no exception; the reporter checked it in the official game), and a free regular slot pulls the 临时整备区 in at once ("常规手牌区出现空位时自动移入"): PlayerState._fillHandFromTemp runs in every recompute, the temp row right to left (the order it fills, [ASSUMED]) into the hand's free slots right to left — after a sale, a deployment from the hand, a merge that consumed hand copies, an item equipped / destroyed / used, a summon stack removed with its owner. invariants.js: temp holds pieces only while the hand is full. The client's refusal path follows (gameLogic.shopBlockReason: 整备区已满 on every card — a one-line change in a file the R5 split moves). Bots: a full hand never tries a purchase, an affordable third copy of a held pair sheds the weakest hand single first (never one of this prep), resolveTemp decides temp right to left. Tests: test/match/feedback5-hand.test.js; merge / hardening / playtest6-elite-to-board / economy / prep-bench / uiFixes updated to the rule. Docs: META §1 Hand, DESIGN §6, PLAYING §3, research 00-INDEX / 01 (the old "a merge-completing purchase is allowed" corrected). Golden: 3 match scenarios moved (coop2-NORMAL-3, solo-HARD-9-boosted, coop2-ABYSS-10-boosted — bot seats that reached a full hand: the merge-completing purchase refused or a single shed first, temp pieces moving in by themselves); every battle digest unchanged 2026-10-05 18:17:08 +08:00
sganggs 65ac4afbd8 feedback5: merge W5C — 琳琅诗怀雅 S2 bomb on x-6 (#116), 新硎 / 沉沙 one 断刃 layer (#107), the owner's ACTIVE_RANGE trigger rule, AUTO-skill audit (伺夜 S2, 浊心斯卡蒂 S2)
# Conflicts:
#	data/backups.json
#	tools/build-data.mjs
2026-10-05 17:51:44 +08:00
sganggs 8a123f6b11 feedback5: the browser battle loads data/backups.json too, so a stand-in fights the same in the browser as on the server 2026-10-05 17:48:10 +08:00
sganggs 1576842641 feedback5 WC: 伺夜 S2 and 浊心斯卡蒂 S2, AUTO skills that act on allies, fire without an enemy (audit after GitHub #124)
Audit of every AUTO time-SP skill with no enemy on the field: 35 never fired. Two need no target and are fixed: 伺夜
S2 领袖的馈赠 — PRTS 备注 「仅场上存在狼群,且狼群未获得此技能的充能时可触发技能」: the kit casts it when ready while the pack
stands and holds no unused gift (it waited for 伺夜's own next attack and could overwrite an unused gift);
浊心斯卡蒂 S2 同葬无光之愿 (鼓舞 on allies + trait heal, a toggle) is SP_FULL like 魔王 S1. The rest correctly wait for a
target (next-attack / next-heal skills, attack modes, enemy-targeted effects) or are left for the owner (赫默 S2 /
巫恋 S2 summon releases, 纯烬艾雅法拉 S1); the list is in the 0.2.0 doc draft.

Golden: roster-039 / roster-040 (伺夜 with S2, normal and elite) moved: S2 now casts whenever the pack holds no gift.
2026-10-05 17:48:07 +08:00
sganggs cbe545c96b feedback5: merge W5D — stand-in battle plumbing (kit by stand-in charId, getChess standIn, harness standIn: true), generic ON_DEPLOY / 冲锋号令 / stat talents, 重装 rule for 预备干员-重装 and Mechanist 2026-10-05 17:47:22 +08:00
sganggs ed2b679f83 feedback5 WD: the sim fields a 补位 stand-in — getChess(id, { standIn: true }) over data/backups.json, PlayerBattleInput standIn: true, kits by the stand-in's charId (never the replaced operator's), kits/ops/standin-<codename>.js registry, harness standIn
- simdata: DataSource keeps `backups` (rawBackups follows the fallback chain); getStandIn = shared/standIn.js
  standInRecord normalised (the chess's ids / bonds / 特质 / tier, the stand-in's body, def.standInFor); a PRESET / DIY
  chess or a source without backups fields itself; the per-battle view maps id-only lookups.
- spec.js keeps `standIn` only when exactly true (never on a token); Battle passes it to getChess; syncUnitLoadout
  carries it; UnitInfo `standInFor`.
- content/index.js kitOf: a stand-in's kit is KITS[def.charId] only; no default skill (a stand-in kit writes `skills`);
  without a kit the generic kit plus genericTalents. kits/index.js STANDIN_KIT_FILES / STANDIN_KITS, merged after the
  tier groups (old keys keep their order; golden unchanged).
- server/data.js and tools/setup.mjs expect backups.json.
- test/content/standin.test.js: the plumbing and the eight 预备干员 on all 28 chess records they replace.
2026-10-05 17:44:58 +08:00
sganggs 286a34064f feedback5 WD: the 重装 exception for the stand-ins — tools/build-data.mjs STANDIN_TRIGGER_DEVIATIONS: every skill of 预备干员-重装 and Mechanist casts with an enemy in range (DEFAULT, rawRule TAKE_DAMAGE) on every form
The owner's decision of 2026-10-05 (the approved 补位 plan). Keyed by the stand-in's charId, because a form belongs to
no chess; validateAll fails the build when an entry stops meeting a TAKE_DAMAGE row. build-data --offline changed only
those 15 trigger rules in data/backups.json.
2026-10-05 17:44:43 +08:00
sganggs 01fddd3021 feedback5 WC: a MANUAL skill whose running attack range strictly contains the own range casts as soon as an enemy is inside it (ACTIVE_RANGE, the owner's rule of 2026-10-05)
A deliberate deviation from the official 技能策略 (community report: skills with a larger range waited for the normal
range). tools/build-data.mjs resolveTrigger: a MANUAL operator skill still on the basic strategy (no class row, no
TRIGGER_DEVIATIONS entry) whose running range (its rangeId grid, or the own range grown by
ability_range_forward_extend; never 被动效果:攻击范围扩大) strictly contains the operator's range gets rule ACTIVE_RANGE,
customRangeGrid = that range, rawRule the official DEFAULT; validateAll checks it. server/sim/skills.js: ACTIVE_RANGE
checks the DEFAULT condition (a targetable enemy or a blocked one; a heal skill an injured ally) on that range, grown by
the permanent rangeExtend, every tick. Data rebuilt offline: only skills[].trigger changed (33 skills, 66 chess records,
9 stand-in form records). 深巡 S2 (§21.29), 重装 TAKE_DAMAGE, the SEARCH / CUSTOM_RANGE / SP_FULL rows, 烛煌 S2 / S3
(not containing her 3-1) and 引星棘刺 S3 keep their rule. Docs: DESIGN §5.6, DATA, SIM, PLAYING, kits README, notes.
Tests: new test/sim/feedback5-active-range.test.js; data, playtest6-skills (银灰 S3), kits_alt_t2 (蒂比 S1), kits_t5
(百炼嘉维尔 S2) updated; feedback1-transform's fixtures move 莫斯提马 one tile (her S3 now casts on its 3-15).

Golden: 27 roster, 25 bond, 21 field and 14 match scenarios moved — every one fields an operator with one of the 33
skills, which now casts when an enemy enters its running range instead of the initial range.
2026-10-05 17:44:33 +08:00
sganggs a325fb41ad feedback5 WD: generic kit — an ON_DEPLOY passive without a duration key lasts the skill's own duration from every deployment (一击即退, 10 s), 冲锋号令 gives its DP at full SP, genericTalents for the stand-ins without a kit
Every pool skill these rules meet already has a hand-authored spec (checked over all 266 chess records x skills and the
22 tokens), so only the 补位 stand-ins change; golden fast and full unchanged.
2026-10-05 17:44:33 +08:00
sganggs ebfda7e657 feedback5 WC: 沉沙 / 新硎 断刃 give one ATK layer while a blade is held and lose it with the last one (GitHub #107)
PRTS 天赋: 「攻击力+80%,持有4个【断刃】 / 每次成功攻击后消耗1个【断刃】,攻击结束时若已耗尽【断刃】,则立刻切换为无断刃模式并
失去攻击力加成」 (the switch clears the attack interval: it attacks again at once). The kit stacked one more layer per
attack and never removed any (新硎 1350 → 3510 after two hits). Now one layer of AtkUp.atk 0.8 (新硎) / Atkup.atk 0.7
(沉沙, blackboard over the PRTS page's 80 %) from the spawn, removed by the 4th attack, whose cooldown is cleared; the
death spawn (max(1, unspent blades)) is unchanged.

Golden: roster-011 / -012 / -025 / -048 and bond-soloShip-high (their waves bring 沉沙 or 新硎), coop3-ABYSS-5,
coop2-NORMAL-8-serverrun and coop2-ABYSS-10-boosted (matches whose waves bring them) moved: different ATK over time.
2026-10-05 17:29:34 +08:00
sganggs e9b6f7e706 feedback5 WC: 琳琅诗怀雅 S2 见面礼 throws its champagne bomb on range x-6, onto an enemy's tile, with no enemy needed (GitHub #116 item 2)
PRTS 技能2 备注: placement range x-6 (range_table "x-6": her tile and two tiles in each of the four directions); "若放置
范围内存在敌人,则按攻击索敌规律放置香槟至其所在地块,否则随机放置香槟至可部署的地块". The client charpack (char_1033_swire2,
mode S2) makes her attack a priority composite: SpawnToken (Skill_2) when a free x-6 tile exists and she holds a coin,
else the normal attack. So a coin plus a free x-6 tile takes her attack's turn whether or not an enemy is near; the
tile is the first ground enemy's on a free x-6 tile in her attack target order, else a random free tile. Until now
every attack dropped a bomb at random on her 1-1 attack range. [ASSUMED] the throw costs her attack one tick.

Golden: roster-006 / roster-008, bond-investShip-low, bond-kjeragShip-low, bond-siracusaShip-low,
bond-victoriaShip-low, bond-yanShip-high (each fields 琳琅诗怀雅 with S2) and coop4-ABYSS-7 (a bot fields her from
round 6) moved: her bombs land on x-6 / enemy tiles and are thrown without an enemy.
2026-10-05 17:27:03 +08:00
sganggs 29b0ccb962 feedback5 R5: point the layout docs at the split client modules
DESIGN §2 names gameLogic/, render/app/, render/fx/ and screens/game/.
§9, SIM and ASSETS name renderInfo and keepEarly in the modules that hold
them. Blame ignores the four move commits.
2026-10-05 17:26:08 +08:00
sganggs b1ec04b58c feedback5: merge R2 — server/match/Match.js split into server/match/match/* and PlayerState.js into server/match/player/* (fixed install order, same exports); golden unchanged 2026-10-05 17:24:48 +08:00
sganggs dd07dc1ec1 feedback5 R5: split the match screen's standalone pieces out
The match-ended plate, the solo pause plate, the highlight styles and
keepEarly now live in public/js/screens/game/*.js. game.js stays the screen
entry. MatchScreen stays one component. Imports only those pieces used moved
with them. Two source pins follow the lines that moved.
2026-10-05 17:24:20 +08:00
sganggs aaef748ad9 feedback5 R5: split the field-view helpers out of the render app
PIXI loading, pick records, tunables, view kind, unit info and the asset / GL
host now live in public/js/render/app/*.js. createFieldView stays in app.js,
unchanged, and every name the file used to export is re-exported. One
pixiPromise. Two source pins follow the lines that moved.
2026-10-05 17:22:20 +08:00
sganggs cea593561a feedback5 R2: after the move — match/bossRounds.js imports finalAssault.js once (Match.js had two import lines for it), match/watch.js drops the stale first doc line of _prepScoutSig (superseded in the review of PR #129) 2026-10-05 17:18:54 +08:00
sganggs d9750d8aba feedback5 R2: docs and comments follow the split — DESIGN §2 and META list server/match/match/ and server/match/player/ (the classes: constructor + method install), research 09 / 11 name the new homes (Match.watch in match/watch.js, the settle in match/settle.js, the facing changes in player/placement.js / items.js), code comments that pointed at moved code say where it lives now (shared constants, client bandDraft / observe / result / hud / teamPanel / underframe / game-mock, test comments); .git-blame-ignore-revs lists the two pure-move commits. DESIGN §17–§23 history citations, the "before" column and the proposal of research 11, tools/build-data.mjs (Match.js still exports BAND_TURN_SECONDS) and public/js/ui/gameLogic.js (in the client stream R5) are left as they are 2026-10-05 17:18:22 +08:00
sganggs 64443b4aab feedback5 R2: PlayerState.js → server/match/player/*.js, a pure move — the 87 class members (82 methods and the isHumanActive / botControlled / deployCap / deployCount / tempEmpty getters), verbatim with their comments, go to 9 per-concern method containers (basics, pieces, acquire, economy, placement, items, prep, round, views) that PlayerState.js installs on PlayerState.prototype in a fixed order with class-method descriptors (a name defined twice throws); HAND_SIZE, TEMP_SIZE, MAX_OFFER_SLOTS, OK and fail go to player/common.js; PlayerState.js keeps the header (+ a code-layout paragraph), the class with its constructor and the FIELD re-export. Section-header comments are replaced by the module headers. docs-consistency reads the method modules (playerText), pins layerGainRoom in player/economy.js and checks that no Match / PlayerState module has a layerRoom 2026-10-05 17:15:37 +08:00
sganggs c1b8292f92 feedback5 R5: split the battle effect system into modules
public/js/render/fx.js becomes a re-export barrel. Speeds, camera heights, fonts, the kind table and the shared tunables move verbatim into public/js/render/fx/*.js. FxSystem keeps its constructor, clear, update, counts and destroy; the other methods move verbatim into container classes installed on FxSystem.prototype in source order. simSpeeds and fontsReady each stay one instance. The dynamic import of /sim/constants.js stays next to setSimProjectileSpeeds.
2026-10-05 17:13:07 +08:00
sganggs 1ca4936f0a feedback5 R2: Match.js → server/match/match/*.js, a pure move — the 167 class members (166 methods and the soloUntimed getter), verbatim with their comments, go to 16 per-concern method containers (platform, infra, messaging, views, watch, intents, pause, phases, spDraft, prep, combat, clientCombat, reports, unitePhase, bossRounds, settle) that Match.js installs on Match.prototype in a fixed order with class-method descriptors (a name defined twice throws); the constants the modules share go to match/common.js (FLOW_TICKER_PRIORITY, DELAYS, BAND_TURN_SECONDS re-exported by Match.js; OK, fail, BOSS_CLOCK_MS), GAME_TYPES to platform.js, the boss-round budgets / rates to bossRounds.js; Match.js keeps the header (+ a code-layout paragraph), the constructor-only constants and the class with its constructor. Section-header comments are replaced by the module headers. docs-consistency reads the method modules (matchText) and pins layerGainRoom in match/settle.js 2026-10-05 17:10:38 +08:00
sganggs eb04f5dfa4 feedback5 R5: split the in-match UI logic into modules
public/js/ui/gameLogic.js becomes a re-export barrel. The bodies move verbatim into public/js/ui/gameLogic/*.js (shared, phases, camera, watch, bonds, shop, placement, draft, enemies, format, shortcuts, settings, result, loadout, panel). The barrel re-exports the same 96 names in the same order. isObj and int gain export on shared.js so sibling modules can import them; they stay off the barrel. No importer changes.
2026-10-05 17:06:45 +08:00
sganggs 8ab6d021da feedback5: merge feedback4 — PR #129, the lobby ERR import 2026-10-05 16:48:02 +08:00
sganggs f2440d4fd7 feedback4: merge master — PR #129 (watching a teammate shows hand, temp, equipment, strategy, effects) 2026-10-05 16:47:54 +08:00
sganggs dcce7858c2 feedback5: shared/standIn.js JSDoc marks the selection's skillIndex optional and documents diyRecord, so the checkJs slice passes 2026-10-05 16:35:33 +08:00
sganggs 3288afc787 feedback5: merge R6 (tooling) — correctness-only ESLint, a first checkJs slice + core typedefs, tools/check-imports.mjs, tools/package.mjs (+ --lite), CI tooling job 2026-10-05 16:34:01 +08:00
sganggs e1de092b74 feedback4: the lobby imports ERR, so a failed 观战 join shows its toast instead of throwing (PR #119's error path; found by the 0.2.0 lint) 2026-10-05 16:32:44 +08:00
sganggs 6a7a23765a feedback5: merge R4 — operator kits one file per chess (kits/ops/*, kits/shared/*, kits/index.js in the old registry order) + kits/README.md with the fidelity checklist; golden unchanged
# Conflicts:
#	.git-blame-ignore-revs
#	test/docs-consistency.test.js
2026-10-05 16:30:29 +08:00
sganggs 920624e743 feedback5 R4: kits/README.md — how a kit file is built, what it may use (shared helpers, the battle API of docs/SIM.md), naming, registration, tests, the fidelity rule and a ten-item fidelity checklist per operator with example kits and tests (for the stand-ins, self-select 6★ operators and GitHub #136); test/content/kits_layout.test.js checks that every ops/ file is listed in kits/index.js, named after its chess id and charId, registers exactly its kit, and imports nothing Node-only or server-only and no clock / Math.random 2026-10-05 16:26:29 +08:00
sganggs 4dff116c19 feedback5 R6: run lint, import check and typecheck in CI
One extra Ubuntu job. The existing test matrix is unchanged. Lint warnings are allowed.
2026-10-05 16:23:54 +08:00
sganggs b6c9918c46 feedback5 R6: add a player package tool with a lite dry-run
tools/package.mjs packs git-tracked runtime files and production dependencies. --lite leaves out local art, fonts and the local asset manifest. --dry-run lists the files and the uncompressed sizes and does not write a zip.
2026-10-05 16:23:47 +08:00
sganggs 95842cef6e feedback5: merge R3 — server/sim/Battle.js split into server/sim/battle/* (prototype methods in fixed order) and content/enemies.js into content/enemies/* (same KITS order); golden unchanged
# Conflicts:
#	.git-blame-ignore-revs
2026-10-05 16:23:17 +08:00
sganggs 014259b75f feedback5 R6: check that sim and match stay off the net and the client
tools/check-imports.mjs lists boundary hits and exits 1 only with --strict. The current hit is the Node data loader's node:fs, node:path and node:url. server/data.js stays allowed.
2026-10-05 16:20:55 +08:00
sganggs 5024559028 feedback5 R3: docs and comments follow the split — DESIGN §2 and SIM.md list server/sim/battle/ and content/enemies/, SIM.md and research 08 name the new homes (archetypes.js frontGuard / ep / dmgZone / pollution, helpers.js areaAllies / zone / setForm, fly.js kitShell), code comments that pointed at moved code say where it lives now (enemies.js header, battle/blocking.js, battle/queries.js, sim constants / snapshot / units / ai / targeting / devices / bosses, shared constants / protocol, render style / interp); .git-blame-ignore-revs lists the two pure-move commits 2026-10-05 16:20:06 +08:00
sganggs 37b1c0a644 feedback5 R4: paths after the kit split — DESIGN §7 and SIM.md (layout, §7.2 kit contract, kit citations), research 09, code comments (content/generic, tokens, items/battle, shared/loadoutRecord, render fx / demo), test comments, and the kits' own comments that named tierN.js; DESIGN §17–§23 history citations are left as they are 2026-10-05 16:18:58 +08:00
sganggs 64a7f48efa feedback5 R6: add a small checkJs slice and core typedefs
tsc checks shared (except protocol.js and bandBonds.js), the sim rng/dir/constants helpers, and types/core.js. strict stays off. types/README.md says how to widen the slice.
2026-10-05 16:18:28 +08:00
sganggs babc35b72a feedback5 R6: add a correctness-only eslint
Flat config for Node and the browser, with unused names as warnings. The run is clean of errors after three small fixes: the lobby spectate path imports ERR, a disable comment for a rule that is not installed is gone, and two atlas regexes spell the BOM as an escape.
2026-10-05 16:16:45 +08:00
sganggs 560328cacc feedback5 R3: content/enemies.js → content/enemies/*.js, a pure move — every declaration verbatim with its comments: helpers.js (shared constants, per-battle state, ability bookkeeping, selection / damage helpers), archetypes.js (ability archetypes and the archetype kits reused by several keys), one file per kit family with its kit-only constants and its part of KITS (invisible, times, element, dot, reflection, fly, special, leaders — the kitLeaderMisc entries that closed the SPECIAL section open the leaders part, so the order stands); enemies.js keeps the header, the dispatch hooks and dispatchers, STATS_ONLY and the chalice share, builds KITS from the parts (188 keys, same order, same functions) and re-exports all 43 names it exported before. docs-consistency pins kitMace's inR in enemies/leaders.js 2026-10-05 16:16:37 +08:00
sganggs 7adf46b033 feedback5 R4: .git-blame-ignore-revs lists the kit split (a pure move), so blame skips it 2026-10-05 16:14:48 +08:00
sganggs 8924007e55 feedback5 R4: content/index.js takes the kit registry from kits/index.js (one guarded import per kit file) instead of loading the six tier shims; KITS is the same object kits/index.js exports — same keys, order and builders, golden unchanged 2026-10-05 16:14:39 +08:00
sganggs 1169102d46 feedback5 R4: one file per operator kit — kits/tier1..6.js split into kits/ops/<chessId>-<codename>.js (129 kits), kits/shared/tier1..6.js (the helpers two or more kits of a tier use, and each tier's header notes) and kits/index.js (the registry, same keys in the same order); the tier files become re-export shims
Pure move: every line of a kit, of a helper and of the tier headers is copied verbatim (only the headers' first
line names the new file); a helper used by one kit moved into that kit's file. Glue only: the generated imports,
`export default { … }` around each registry entry, `export { … }` lists in shared/tier2..6.js, and tier4's
`(bb, chess, def)` default-argument wrapper as shared/tier4.js `withDefaults` (applied in each tier-4 kit file).
kits/index.js loads every kit file with a guarded dynamic import (browser-safe, no directory listing); tierN.js
re-export the tier registry (TIER_KITS) and their old named exports (tier1 helpers + tinmanKit, tier6
PITHST_ELEMENTS). The merged registry, every tier default and named export have the same keys, order, frozenness
and function sources as before. test/docs-consistency.test.js reads the moved code at its new paths.
Golden: GOLDEN_FULL=1 node --test test/golden.test.js unchanged.
2026-10-05 16:13:56 +08:00
sganggs 13224f9483 feedback5 R3: Battle.js → server/sim/battle/*.js, a pure move — the 131 methods, verbatim with their comments, go to 14 per-concern method containers (players, lifecycle, hooks, spawns, deploy, blocking, status, combat, queries, summons, tiles, displacement, economy, events; fin / clone in util.js) that Battle.js installs on Battle.prototype in a fixed order with class-method descriptors; Battle.js keeps the header, the constructor and the class, and re-exports pushTiles. docs-consistency reads the method modules (battleText) and pins layerGainRoom in battle/economy.js 2026-10-05 16:13:25 +08:00
sganggs aef8caef3f feedback5: merge R1 — server/index.js split into server/http/* modules on plain node:http (same exports, headers and responses) 2026-10-05 16:13:20 +08:00
sganggs 5f0830cdc5 feedback5 R1: docs and comments follow the split — DESIGN §2 layout lists server/http/, the README table names the entry and http/, path comments in shared/media.js, public/js/media.js, buildGuard.js, net.js and three tests point at the new modules; .git-blame-ignore-revs lists the pure-move commit 2026-10-05 16:11:30 +08:00
sganggs 1b38e30819 feedback5 R1: startServer and main become wiring — PORT / HOST / TRUST_PROXY and the option picks go to http/config.js, the session stack and the /ws upgrade to http/websocket.js, the request listener and /healthz to http/routes.js (new), the security headers and the clientError 400 to http/common.js, the banner, signals and entry check to http/boot.js
Same order of construction, listeners and headers as before; a scripted fingerprint (export list, 51 HTTP requests'
status / header order / body hash, raw upgrade and malformed-request replies) and the process run (banner, port in
use, SIGINT) match the pre-split server exactly. test/version.test.js reads the banner and /healthz from their new
files; module headers describe each piece.
2026-10-05 16:08:41 +08:00
sganggs b48a67caec feedback5 R1: pure move — the top-level code of server/index.js goes to server/http/ (config, common, files, static, media, buildTag, websocket, boot) verbatim; index.js imports it and re-exports the same 15 names, startServer and main are untouched
Only changes besides the move: `export` on helpers another module now needs (sendError, sendJson, splitUrl, GzipCache,
isNotModified, serveFile, serveMedia, noopLog, makeLogger), ROOT resolves two levels up from server/http/config.js
(same path), and short headers on the new files.
2026-10-05 16:02:33 +08:00
sganggs 67ca229d44 feedback5: merge W5B — stand-in (补位) and self-select (自选编队) data: chess backup fields, data/backups.json (17 stand-ins, 4 DIY slots, picks, faction bonds), shared/standIn.js 2026-10-05 16:02:25 +08:00
sganggs 73a30148b6 feedback5 WB: DATA.md documents chess.json backup and data/backups.json (§18); research 02 / 03 name the DIY faction rule (mainPower + every subPower) 2026-10-05 15:58:17 +08:00
sganggs 4b1d9606d2 feedback5 WB: the data of 补位 and 自选 — chess.json keeps the official backup fields, data/backups.json builds the 17 stand-ins and the DIY picks
chess.json: every record carries the shop row's backupCharId / backupTmplId / backupCharSkillIndex /
backupCharUniEquipId / backupCharPotRank verbatim as `backup` (both forms; nothing else changed).
data/backups.json: units = the 17 原型干员 with a form per status they fight at (43 forms: stats, trait,
talents, every unlocked skill, modules), diy = the 4 slots, the prototype picks per tier (9 6★ at 5 and 6,
six 4★ at 5), the 78 owned-6★ picks and their faction bonds (mainPower + subPower vs powerIdList, else 协防).
shared/standIn.js composes a stand-in (or a DIY prototype) into a chess-shaped record; the build fails when
the form builder cannot give back every PRESET chess field for field. test/backups.test.js (10 tests).
2026-10-05 15:58:10 +08:00
sganggs 6b489b1776 feedback4: merge W5A — golden-result safety net (tools/golden.mjs, test/golden: every chess loadout, enemy, bond, field and bot match, fixed seeds) 2026-10-05 15:50:16 +08:00
sganggs 0fa0f958b1 feedback5 WA: golden-result safety net before the 0.2.0 refactor — tools/golden.mjs runs a seeded corpus (49 roster battles: every chess record × skill × module, every stage and enemy kind; 46 bond battles; 22 leader / 联防 fields; 16 bot-only matches) and test/golden.test.js compares its digests with test/golden/*.json field by field (fast subset by default, GOLDEN_FULL=1 for all; npm run golden / golden:update; test/golden/README.md) 2026-10-05 15:49:24 +08:00
sganggs 305b524df2 feedback4: a bond card's layer-scaled chance (不屈, 迅捷, 奇迹) stops at 100 % like the sim's (GitHub #108: 124 % at 266 layers) 2026-10-05 14:37:23 +08:00
sganggs 723755e3a5 feedback4: 引星棘刺 S1 度算浪波 (an AUTO skill thrown at an ally) fires as soon as its SP is full, with no enemy around (GitHub #124) 2026-10-05 14:37:23 +08:00
sganggs 2519a23a55 feedback4: merge master — PRs #114 #119 #127 #115 #110 2026-10-05 14:35:00 +08:00
sganggs bcd916eb61 feedback4: the real-browser e2e suites confirm the leftover-funds prompt on the Space path too (coop.e2e 4/4, real.e2e 2/2) 2026-10-05 14:28:47 +08:00
sganggs 8aa41d9c1c feedback4: real.e2e confirms the leftover-funds prompt on ready; DESIGN's §23.f4 references point to §23.23; the 0.1.3 changelog names the 不屈 source and fixes 手牌 2026-10-05 14:03:32 +08:00
sganggs a0a5419eb8 feedback3: the mock prep test confirms the leftover-funds prompt 2026-10-04 22:35:13 +08:00
sganggs a5c31cbcb4 feedback3: browser tests accept the leftover-funds prompt when they press ready 2026-10-04 22:31:55 +08:00
sganggs 9f3785636a feedback3: a prep-end item may sit unmerged through the fight, and bonds.json matches the offline build 2026-10-04 22:20:20 +08:00
sganggs 351ead3603 feedback3: 0.1.3 design notes, changelog and version 2026-10-04 22:13:05 +08:00
sganggs c9dd2a6392 feedback3: merge WJ — 高台 only for elite 歌蕾蒂娅 with HOK-Y, live prep watch, silenced 折射, grant toasts, emote timeout glyph 2026-10-04 21:26:46 +08:00
sganggs 1005754bf3 feedback3: merge WH — ground operators are melee-position, 叙拉古 rolls on every normal hit, off bonds show as disabled, prep-end items merge next prep 2026-10-04 21:26:10 +08:00
sganggs a3ebca0ddf feedback3: merge WI — 乌尔比安 S3 move and return are free redeploys, 波登可's spore radius is 0.9, 琳琅诗怀雅 S3 shoots at 10 coins when an enemy is in her attack range 2026-10-04 21:25:44 +08:00
sganggs 3500ef2d32 feedback3: merge WG — nest enemies pulse instead of attacking, children carry no bounty, a 隐匿 blocker is skipped by areas, stacked cold freezes for the longer duration 2026-10-04 21:25:40 +08:00
sganggs 7e711582b0 feedback3 WJ: the bot places elite 歌蕾蒂娅 with HOK-Y on a 高台 that covers the road 2026-10-04 21:11:41 +08:00
sganggs 627bb6d4c1 feedback3 WI: 琳琅诗怀雅 S3 shoots at 10 coins only when an enemy is in her attack range 2026-10-04 21:11:41 +08:00
sganggs ee9fc83207 feedback3: merge WF — 阿戈尔 revives by position, 傀儡师 switches at full HP, 联防 uses the layers the combat reached, deployment is column-major 2026-10-04 21:05:40 +08:00
sganggs ab56ea01b1 feedback3 WI: 琳琅诗怀雅 S3 shoots her coins when the purse reaches 10 2026-10-04 21:05:23 +08:00
sganggs 54680cc891 feedback3 WJ: emote manifest timeout falls back to the glyph 2026-10-04 20:47:49 +08:00
sganggs 5e4fe8ae60 feedback3 WJ: toast when a bond grants a chess, and flash the new card
歌蕾蒂娅:获得X, and the same line for 余 and every other silent grantChess. A new hand or temp card uses the existing deploy flash.
2026-10-04 20:41:46 +08:00
sganggs 2723a3daea feedback3 WJ: grey the 折射 line and drop its icon while silenced
The RES bonus was already off. The enemy card now greys a SILENCE-format line from the live silenced flag, and the status row leaves the 折射 icon out while silence is up.
2026-10-04 20:38:26 +08:00
sganggs 473b8eb5b0 feedback3 WI: 琳琅诗怀雅 S3 does not close itself when her coins are full (GitHub #89) 2026-10-04 20:35:50 +08:00
sganggs 365ebf6cbd feedback3 WG: a 冻结 from stacked 寒冷 lasts the longer of the two colds, not a fixed 3 s 2026-10-04 20:35:14 +08:00
sganggs 6e59b5e4dd feedback3 WJ: prep watch of another board updates when it changes
A scout stays subscribed to n:<pid> and gets a new prep field when that board moves, including a spectator. A shop change does not push one.
2026-10-04 20:34:32 +08:00
sganggs 9aaba7708c feedback3 WH: an item gained as prep ends waits in hand and merges at the next prep start 2026-10-04 20:34:03 +08:00
sganggs f9e2c49954 feedback3 WI: 波登可's spore cloud radius is 0.9, as the PRTS note says 2026-10-04 20:33:54 +08:00
sganggs 13e71fccba feedback3 WG: a 隐匿 blocker is hit only by the blocked enemy's attacks, not by its areas, zones or auras (GitHub #97) 2026-10-04 20:33:35 +08:00