feedback5: DESIGN §25.22 covers the community reports too (header, intro, 25.22.1–8 in order), §25.23 the Japanese, Korean and Traditional Chinese interfaces, the §25 intro list and decisions of 2026-10-07

This commit is contained in:
sganggs committed 2026-10-07 13:09:23 +08:00
1 parent b942ff2e71
commit f24d2a9016
1 file changed
+143 -84
+143 -84
View File
@@ -47,7 +47,9 @@ language is a file in the language folder) → §25.20; the last stream of that
谢拉格 wind's endless freeze, 埃芒加德's and M3茧甲's 复活 as a knock-out and a free redeploy, 佩佩's paid refresh, the 炎佑 on
the medic's slot, 凯瑟琳's offer, the hidden layers on the result card; the official behaviours pinned) → §25.21; and, before the release, four GitHub reports of round 19 (a stunned or frozen enemy blocked by contact, #232; the
round-start banner of an eliminated player or a spectator seat, #236; 干员调配 without its game data, #173; the official
result box and battle-over sounds of the approved PR #112, #235) → §25.22.
result box and battle-over sounds of the approved PR #112, #235) and four community reports of 2026-10-07 (the
5-阿戈尔 revive order, an enemy's attack clip after its strike and the 鸭爵 swap's re-stealth, 蕾缪安's S3, the 整备区
layers pinned) → §25.22; the Japanese, Korean and Traditional Chinese interfaces → §25.23.
Decisions of the owner: 2026-10-04 — the server stays on plain `node:http` + `ws`, no web framework (§25.1);
2026-10-05 — the 补位 plan (§25.3); the 自选编队 rules, the collab operators out of the pool, ISW-A refused (§25.4);
@@ -66,7 +68,10 @@ Traditional Chinese ship with the official game texts and fallback UIs — the T
(§25.20); 乌尔比安 knocked
out during his S3 comes back on his deployment tile, a deliberate deviation from PRTS's "where it fell" (§25.17.3);
烛煌's 绝处重燃 before 坚固维式重锤's lock and the official tier cap of 寻呼模块 / 简易通讯机 kept as they are (§25.21.1,
§25.21.10).
§25.21.10); 0.2.0 held for round 19's four reports and four more community reports (§25.22); the 5-阿戈尔
battle-start revives by board position, replacing §24.3's knock-out order for that batch (§25.22.5); the 鸭爵 swap's
流泪小子 hides again 1 s after a block ends (§25.22.6); the three new interfaces completed — zh-TW converted, ja / ko
machine-translated with the official terms, marked as such (§25.23).
### 25.1 Refactor and tooling: the big files split, golden results, lint, types, import boundaries (refactor plan; owner's decision of 2026-10-04: no web framework) — `server/http/`, `server/match/match/`, `server/match/player/`, `server/sim/battle/`, `content/enemies/`, `kits/ops/`, `public/js/ui/gameLogic/`, `render/fx/`, `render/app/`, `screens/game/`, `tools/golden.mjs`, `tools/check-imports.mjs`, `eslint.config.js`, `jsconfig.json`
@@ -1859,10 +1864,16 @@ are.
and an 进阶 set; and the pair counts once toward the 3 members.
- Pinned: `test/content/feedback5-cb1-pins.test.js`.
### 25.22 GitHub round 19, fixed before the release (the owner's decision of 2026-10-07) — `sim/ai.js updateEnemy`, `ui/gameLogic/phases.js`, `screens/game.js`, `screens/loadout.js`, `match/settle.js`, `match/views.js`, `ui/components.js ResultDialog`
### 25.22 GitHub round 19 and the community reports of 2026-10-07, fixed before the release (the owner's decisions of 2026-10-07) — `sim/ai.js updateEnemy` / `enemyAttack`, `ui/gameLogic/phases.js`, `screens/game.js`, `screens/loadout.js`, `match/settle.js`, `match/views.js`, `ui/components.js ResultDialog`, `content/bonds/core.js egirReviveScan`, `content/enemies/helpers.js`, `kits/ops/chess_char_6_01-lemuen.js`
The owner held 0.2.0 for the new GitHub reports of 2026-10-06 (#214–#251, triaged in round 19): the four real ones are fixed
here, each reproduced first; the rest were answered (not a bug, already fixed in 0.2.0, or left for 0.2.1).
The owner held 0.2.0 for the new GitHub reports of 2026-10-06 (#214–#251, triaged in round 19) and then for four more
community reports relayed on 2026-10-07. Each was reproduced first. Real and fixed: a stunned or frozen enemy blocked by
contact (#232, §25.22.1), the round-start banner of an eliminated player or a spectator seat (#236, §25.22.2), 干员调配
without its game data (#173, §25.22.3), the official result box and battle-over sounds of the approved PR #112 (#235,
§25.22.4), the 5-阿戈尔 batch revive by board position (§25.22.5), an enemy finishing its attack clip after a strike
(§25.22.6, with the owner's 1 s re-stealth for the 鸭爵 swap's 流泪小子, a deliberate deviation), and 蕾缪安's S3 that
waits for targets (§25.22.8). Official as it was: 拉普兰德's and 赫默's layers from the 整备区 (§25.22.7). The rest of
round 19 was answered (not a bug, already fixed in 0.2.0, or left for 0.2.1).
#### 25.22.1 GitHub #232 「再部署之后的干员无法阻挡破隐被冰冻的隐身怪」 (@ccyl; the repro and the cause by @kukiC): a stunned or frozen enemy is blocked by contact — `sim/ai.js updateEnemy`
@@ -1947,6 +1958,7 @@ here, each reproduced first; the rest were answered (not a bug, already fixed in
- Golden: unchanged (client only). Tests: `test/ui/feedback5-loadout-data-missing.test.js` (4, all fail on the parent:
the tab's files, the refusals, the screen's guard order, the message in Chinese and English); loadout, loadout-stats,
module-trait, moduleIcons, diy-ui and standin-ui tests pass unchanged.
#### 25.22.4 「提问:联防结算播报没了」 (GitHub #235; PR #112 by @Convey123, approved, never merged): the official 「作战结束」 box and the three BATTLEOVER sounds at settlement — `match/settle.js`, `match/views.js`, `ui/gameLogic/phases.js`, `ui/components.js ResultDialog`, `screens/game.js`
- **Seen**: 0.1.4 and 0.2.0 have no result box and never play the battle-over sounds. A co-op 联防 round run to SETTLE
@@ -1981,85 +1993,6 @@ here, each reproduced first; the rest were answered (not a bug, already fixed in
settled, no result ticker, gone in the next phase), SP_E2E `test/ui/resultbox.e2e.test.js` (3, mock variants
`unite[,through][,helper|,dead]`). Docs: PLAYING.md §1 / §5, design/network.md, design/client.md, design/match.md.
#### 25.22.8 Community report 「蕾缪安3技能范围里没人好像会自动结束」 (relayed by the owner): 蕾缪安's S3 waits with its bullets while nothing is in her range — `kits/ops/chess_char_6_01-lemuen.js`, `render/fx/locks.js`
- **Seen** (a script on the parent 0255afd: S3 cast with 5 bullets, the locked enemy killed by someone else after 2
locks, another enemy alive outside her range): the skill ended at the next lock tick
(1.00 s, `skillEnd` reason `ammo`), 3 bullets thrown away, 2 shells; an enemy that came into her range 3 s later found
it over. A locked walker leaving her range ended it the same way (4 locks, 1 bullet thrown away). In golden the elite
蕾缪安 of roster-018 ended three of her five casts early (2 / 6, 5 / 9 and 6 / 9 bullets left).
- **Official**: the skill text 「每0.5秒消耗1发子弹依次锁定敌人……攻击装有5发弹药,打完后结束(可随时停止技能)」: an ammo
skill ends when its bullets are spent or when the player stops it. PRTS 卫戍协议/帮助 §作战阶段 技能操作: 「可执行的技能
操作包括开启/关闭技能,通常不会自动关闭技能」 — the only automatic close is 玛露希尔's 召唤使魔; 蕾缪安's S3 is on the
basic strategy. The client (charpack char_4193_lemuen, battle/buff_template_data.json): the S3 mode's lock is an attack
that needs a target (`_minTargetNum` 1, `_allowNoTarget` 0, cooldown `aim_interval`); the skill buff `lemuen_s_3`
switches to the S3_End mode (the bombardment) on `ON_BUFF_FINISH` only, and nothing ends it for want of a target. PRTS
S3 note: a mark follows its target and stays where the target left.
- **Cause**: the kit's lock tick ended the skill when `pickLock` found nobody and anyone had been locked —
`if (!e) { if (m.lemLocks.length) skill.end('ammo'); return; }` (chess_char_6_01-lemuen.js:169 on the parent), there
since the initial import with no decision behind it.
- **Now**: with nothing to lock the skill waits, bullets and locks kept — the marks follow their enemies (out of her range
too) or stay where they left — with its lock ready: the next enemy that comes into her range (or is 通缉) is locked on
the next tick, then every `aim_interval` s. The skill ends when the bullets are spent and the shells fall on every mark
in lock order, as before. While it waits she gains no SP (a running ammo skill holds it, as before); knocked out or
withdrawn, no bombardment (unchanged); a battle that ends meanwhile ends without shells (nothing left to hit). The S3
`lock` fx carry `hold`: render/fx/locks.js keeps such a reticle while the shooter's view has the skill bit (UF.SKILL)
and counts its LOCK_T (5 game s) from the skill's end — without it the reticles faded 5 s into a wait. S2's aim lock
(no `hold`) keeps its timeout.
- Unchanged and noted: the client lock's 0.1 s pre-delay is not modelled (the lock lands on its tick, as before).
- Seen on the way, not changed (S2, not this report): 归乡邀约 spends a bullet on every normal attack (5 of its 6 gone in
8 s of attacks on an enemy that is not 通缉), while PRTS's S2 note says only the aimed snipe at a 通缉 target spends one
(「若目标为被通缉状态,则攻击改为消耗1发弹药的瞄准狙击,否则不消耗弹药」) — left to the owner: fixed, S2 would hold its
buff until 通缉 enemies come, a large change.
- Golden: 3 scenarios — traced on both trees with an instrumented copy (SkillRuntime start / end logged, the round's
fields and the carried SP); in each the first divergence is an S3 the parent ended with bullets left and nothing in her
range:
- roster-018: the elite 蕾缪安's first S3 (7.63 s) ended at 9.63 s with 2 of 6 bullets left; now the 6th goes at
12.00 s (first differing snapshot window 0–10 s).
- boss-boss_3-pair: her second S3 (27.8 s) ended at 30.3 s with 4 of 9 left; now all 9 by 34.43 s (window 30–40 s); the
boss now falls at 199.53 s (before: `forced` at the 200 s cap with 145080 HP left).
- coop2-NORMAL-14-standins: ai_0's 蕾缪安 (her own kit) — in round 11's battle her S3 ended at 17.2 s (6 of 8 left) and
77.97 s (7 of 9); now all bullets are spent and the third cast does not come, so she enters the round's 联防 with
25.96 SP instead of 10.27, casts S3 there and kills one more of h_0's leaked enemies: h_0 loses 1 LP less (rounds
11–12 LP 18 → 19, 8 → 9; lpLost 30 → 29; ai_0 kills +1, dmgDealt +288).
- bonds, standins and diy unchanged.
- Tests: `test/sim/feedback5-lemuen-s3-wait.test.js` (3: the killed target and the walker who leaves fail on the parent —
the skill ended —; the battle that ends while she waits passes on both), `test/render/fxproj.test.js` +1 (a held lock
stays while the shooter's skill bit is on, then LOCK_T after; an unheld one times out — fails on the parent's
renderer); `test/content/kits_t6.test.js`, `kits_alt_t6.test.js`, `test/sim/feedback3-ammo-bar.test.js` pass unchanged.
#### 25.22.7 「小拉和赫默有概率在备战区叠不上叙拉古和远见」 (community report, relayed by the owner on 2026-10-07): not a bug — 拉普兰德 stacks from the 整备区 when 【叙拉古】 is active, 赫默's trait works only deployed (official data) — no code change; `docs/PLAYING.md` §6
- **Seen**: 「有的时候在备战区的干员不能100%叠层…小拉和赫默有概率在备战区叠不上叙拉古和远见」. 备战区 is the players' word
for the 整备区 (community guides: 「远见奇迹干员不需要了就放备战区」). Reproduced through the match paths: a matrix of 26
cases (the 整备区, the board, the 临时整备区; bought before / after the refresh, two copies, an elite merged this round, a
full hand, a 机变 round, a pending reward, the shop frozen, a free refresh, a reconnect, a bot), and 115 whole matches
(60 solo, 40 co-op, 15 co-op with client-run combat; a random human and the bots) checked against an oracle written
from the official text: 11 951 refreshes and 3 640 round starts, no difference. Every case without layers is one of
four rules, nothing random: (1) 【叙拉古】 is inactive — it counts different 叙拉古 deployed, and 拉普兰德 on the bench is
not one of the three (普罗旺斯 + 德克萨斯 deployed, her in the 整备区: 2/3); (2) her trait fires on the first manual
refresh she sees each round, so a refresh made while 叙拉古 is inactive spends it — deploying the third 叙拉古 and
refreshing again adds nothing until the next round (in the random matches 440 of the 675 first refreshes a bench
拉普兰德 saw were of this kind, the other 235 stacked); (3) in the 临时整备区 she neither fires nor counts, and fires on
her first refresh once a free slot pulls her into the 整备区; (4) 赫默 in the 整备区 never fires, 远见 active or not
(204 such round starts).
- **Official**: garrison_123 「<刷新时>若为本回合首次主动刷新,使已激活的【叙拉古】层数+4,此干员在整备区时也有效」 (elite +8, no
condition key); 叙拉古 activeCondition BOARD (「在场」). garrison_80 「<进入休整期时>使自身已激活的盟约层数+2」 (elite +4) has
no such clause, and its blackboard carries conditionkey `character_target_inboard`: deployed only. In the act2autochess
garrison table every 进入休整期时 / 休整期结束时 / 刷新时 trait that works in the 整备区 says so and has no condition key —
拉普兰德 123, 调香师 81, 波登可 102, 琳琅诗怀雅 98 (「若已激活【炎】/【投资人】此特质在整备区也有效」); every other one is
`character_target_inboard`, or a row / tile-in-front condition only a deployed operator meets. 远见's
「整备区的【远见】干员也可用于激活盟约」 counts bench members for the bond; it moves no trait to the bench. The in-game tips
name the overflow 「临时整备区」 apart from the 整备区 (「处于临时整备区的调度资源,在进入下一回合后会自动销毁」).
- **Now**: unchanged. Prep traits run for deployed operators and, unless `character_target_inboard`, for the 10 整备区
slots (`effectsMeta.js _garrisons`), never for the 临时整备区 (§21.1, like the 远见 / 奇迹 / 投资人 count). PLAYING.md §6
now says where a 特质 works, that 「使已激活的…」 needs the bond active, and what 拉普兰德's refresh needs.
- [ASSUMED] (unchanged since §21.1): a refresh made while 叙拉古 is inactive spends her trait for the round (the literal
「若为本回合首次主动刷新」, counted per copy); the 临时整备区 is not the 整备区; a free refresh is a manual refresh. Open for
the owner: fire on her first refresh with 叙拉古 active instead — no source either way.
- Golden: unchanged (no code change). Tests: `test/match/feedback5-bench-traits.test.js` (6 pins: the official data rule;
+4 / +8 in the 整备区 with the hand full, the shop frozen, a free refresh, a reward pending, a reconnect, in a 机变 round,
for a bot; the inactive bond and the spent refresh; the 临时整备区; a copy bought after the first refresh and 普罗旺斯's
free refresh; 赫默 deployed vs in the 整备区).
#### 25.22.5 「阿戈尔盟约的二阶复活逻辑应该有些bug」 (a community report the owner relayed on 2026-10-07, two screenshots not yet seen): the 5-阿戈尔 revives of the battle-start devour's knock-outs go by board position once the devour is over — `content/bonds/core.js installEgir` (`egirReviveScan`, `egirStart`)
- **Seen**: the player's model of the official game: 「原作里是第一步给所有鱼加盟约的血量,第二步是开始一个个大鱼吃小鱼,
@@ -2122,6 +2055,7 @@ here, each reproduced first; the rest were answered (not a bug, already fixed in
`build-data --offline`; only `tiers[0]` / `tiers[2]` / `algorithm[3]` / `assumed[0]` changed — the stale assumption
「5000 physical 流失 ignores DEF and shields」, wrong since 0.1.1, gave way to the scan reading), DESIGN §5's `death` row
(design/engine.md), docs/SIM.md (`death` hook), the core.js comments; §24.3's title points here.
#### 25.22.6 「ai的鸭爵分队真的好阴…哭狗瞬间隐匿没有后摇马上就到下一格干员的脸上秒抬手秒晕」 (community report of 2026-10-07) and GitHub #214 「鸭爵技能生成的泪眼汪汪没有反隐直接一路顺畅走进蓝门」 (@FrogThai; PR #243 by @TsangAsuna declined): an enemy finishes its attack clip after its block ends — `sim/ai.js enemyAttack`, `sim/battle/displacement.js displace`
- **Seen**: 泪眼汪汪 / 哭狗 / 隐匿狗 is 流泪小子 (`enemy_2034_sythef_2`, 「唯唯诺诺的佩洛」 — no enemy is named 泪眼汪汪), the
@@ -2188,3 +2122,128 @@ here, each reproduced first; the rest were answered (not a bug, already fixed in
ends in a victory instead of a defeat; the other 282 scenarios are unchanged. Tests:
`test/content/feedback5-duck-restealth.test.js` (3; the swap's 1 s and the band path fail before it, the 0 s guard
for the same enemy elsewhere passes on both).
#### 25.22.7 「小拉和赫默有概率在备战区叠不上叙拉古和远见」 (community report, relayed by the owner on 2026-10-07): not a bug — 拉普兰德 stacks from the 整备区 when 【叙拉古】 is active, 赫默's trait works only deployed (official data) — no code change; `docs/PLAYING.md` §6
- **Seen**: 「有的时候在备战区的干员不能100%叠层…小拉和赫默有概率在备战区叠不上叙拉古和远见」. 备战区 is the players' word
for the 整备区 (community guides: 「远见奇迹干员不需要了就放备战区」). Reproduced through the match paths: a matrix of 26
cases (the 整备区, the board, the 临时整备区; bought before / after the refresh, two copies, an elite merged this round, a
full hand, a 机变 round, a pending reward, the shop frozen, a free refresh, a reconnect, a bot), and 115 whole matches
(60 solo, 40 co-op, 15 co-op with client-run combat; a random human and the bots) checked against an oracle written
from the official text: 11 951 refreshes and 3 640 round starts, no difference. Every case without layers is one of
four rules, nothing random: (1) 【叙拉古】 is inactive — it counts different 叙拉古 deployed, and 拉普兰德 on the bench is
not one of the three (普罗旺斯 + 德克萨斯 deployed, her in the 整备区: 2/3); (2) her trait fires on the first manual
refresh she sees each round, so a refresh made while 叙拉古 is inactive spends it — deploying the third 叙拉古 and
refreshing again adds nothing until the next round (in the random matches 440 of the 675 first refreshes a bench
拉普兰德 saw were of this kind, the other 235 stacked); (3) in the 临时整备区 she neither fires nor counts, and fires on
her first refresh once a free slot pulls her into the 整备区; (4) 赫默 in the 整备区 never fires, 远见 active or not
(204 such round starts).
- **Official**: garrison_123 「<刷新时>若为本回合首次主动刷新,使已激活的【叙拉古】层数+4,此干员在整备区时也有效」 (elite +8, no
condition key); 叙拉古 activeCondition BOARD (「在场」). garrison_80 「<进入休整期时>使自身已激活的盟约层数+2」 (elite +4) has
no such clause, and its blackboard carries conditionkey `character_target_inboard`: deployed only. In the act2autochess
garrison table every 进入休整期时 / 休整期结束时 / 刷新时 trait that works in the 整备区 says so and has no condition key —
拉普兰德 123, 调香师 81, 波登可 102, 琳琅诗怀雅 98 (「若已激活【炎】/【投资人】此特质在整备区也有效」); every other one is
`character_target_inboard`, or a row / tile-in-front condition only a deployed operator meets. 远见's
「整备区的【远见】干员也可用于激活盟约」 counts bench members for the bond; it moves no trait to the bench. The in-game tips
name the overflow 「临时整备区」 apart from the 整备区 (「处于临时整备区的调度资源,在进入下一回合后会自动销毁」).
- **Now**: unchanged. Prep traits run for deployed operators and, unless `character_target_inboard`, for the 10 整备区
slots (`effectsMeta.js _garrisons`), never for the 临时整备区 (§21.1, like the 远见 / 奇迹 / 投资人 count). PLAYING.md §6
now says where a 特质 works, that 「使已激活的…」 needs the bond active, and what 拉普兰德's refresh needs.
- [ASSUMED] (unchanged since §21.1): a refresh made while 叙拉古 is inactive spends her trait for the round (the literal
「若为本回合首次主动刷新」, counted per copy); the 临时整备区 is not the 整备区; a free refresh is a manual refresh. Open for
the owner: fire on her first refresh with 叙拉古 active instead — no source either way.
- Golden: unchanged (no code change). Tests: `test/match/feedback5-bench-traits.test.js` (6 pins: the official data rule;
+4 / +8 in the 整备区 with the hand full, the shop frozen, a free refresh, a reward pending, a reconnect, in a 机变 round,
for a bot; the inactive bond and the spent refresh; the 临时整备区; a copy bought after the first refresh and 普罗旺斯's
free refresh; 赫默 deployed vs in the 整备区).
#### 25.22.8 Community report 「蕾缪安3技能范围里没人好像会自动结束」 (relayed by the owner): 蕾缪安's S3 waits with its bullets while nothing is in her range — `kits/ops/chess_char_6_01-lemuen.js`, `render/fx/locks.js`
- **Seen** (a script on the parent 0255afd: S3 cast with 5 bullets, the locked enemy killed by someone else after 2
locks, another enemy alive outside her range): the skill ended at the next lock tick
(1.00 s, `skillEnd` reason `ammo`), 3 bullets thrown away, 2 shells; an enemy that came into her range 3 s later found
it over. A locked walker leaving her range ended it the same way (4 locks, 1 bullet thrown away). In golden the elite
蕾缪安 of roster-018 ended three of her five casts early (2 / 6, 5 / 9 and 6 / 9 bullets left).
- **Official**: the skill text 「每0.5秒消耗1发子弹依次锁定敌人……攻击装有5发弹药,打完后结束(可随时停止技能)」: an ammo
skill ends when its bullets are spent or when the player stops it. PRTS 卫戍协议/帮助 §作战阶段 技能操作: 「可执行的技能
操作包括开启/关闭技能,通常不会自动关闭技能」 — the only automatic close is 玛露希尔's 召唤使魔; 蕾缪安's S3 is on the
basic strategy. The client (charpack char_4193_lemuen, battle/buff_template_data.json): the S3 mode's lock is an attack
that needs a target (`_minTargetNum` 1, `_allowNoTarget` 0, cooldown `aim_interval`); the skill buff `lemuen_s_3`
switches to the S3_End mode (the bombardment) on `ON_BUFF_FINISH` only, and nothing ends it for want of a target. PRTS
S3 note: a mark follows its target and stays where the target left.
- **Cause**: the kit's lock tick ended the skill when `pickLock` found nobody and anyone had been locked —
`if (!e) { if (m.lemLocks.length) skill.end('ammo'); return; }` (chess_char_6_01-lemuen.js:169 on the parent), there
since the initial import with no decision behind it.
- **Now**: with nothing to lock the skill waits, bullets and locks kept — the marks follow their enemies (out of her range
too) or stay where they left — with its lock ready: the next enemy that comes into her range (or is 通缉) is locked on
the next tick, then every `aim_interval` s. The skill ends when the bullets are spent and the shells fall on every mark
in lock order, as before. While it waits she gains no SP (a running ammo skill holds it, as before); knocked out or
withdrawn, no bombardment (unchanged); a battle that ends meanwhile ends without shells (nothing left to hit). The S3
`lock` fx carry `hold`: render/fx/locks.js keeps such a reticle while the shooter's view has the skill bit (UF.SKILL)
and counts its LOCK_T (5 game s) from the skill's end — without it the reticles faded 5 s into a wait. S2's aim lock
(no `hold`) keeps its timeout.
- Unchanged and noted: the client lock's 0.1 s pre-delay is not modelled (the lock lands on its tick, as before).
- Seen on the way, not changed (S2, not this report): 归乡邀约 spends a bullet on every normal attack (5 of its 6 gone in
8 s of attacks on an enemy that is not 通缉), while PRTS's S2 note says only the aimed snipe at a 通缉 target spends one
(「若目标为被通缉状态,则攻击改为消耗1发弹药的瞄准狙击,否则不消耗弹药」) — left to the owner: fixed, S2 would hold its
buff until 通缉 enemies come, a large change.
- Golden: 3 scenarios — traced on both trees with an instrumented copy (SkillRuntime start / end logged, the round's
fields and the carried SP); in each the first divergence is an S3 the parent ended with bullets left and nothing in her
range:
- roster-018: the elite 蕾缪安's first S3 (7.63 s) ended at 9.63 s with 2 of 6 bullets left; now the 6th goes at
12.00 s (first differing snapshot window 0–10 s).
- boss-boss_3-pair: her second S3 (27.8 s) ended at 30.3 s with 4 of 9 left; now all 9 by 34.43 s (window 30–40 s); the
boss now falls at 199.53 s (before: `forced` at the 200 s cap with 145080 HP left).
- coop2-NORMAL-14-standins: ai_0's 蕾缪安 (her own kit) — in round 11's battle her S3 ended at 17.2 s (6 of 8 left) and
77.97 s (7 of 9); now all bullets are spent and the third cast does not come, so she enters the round's 联防 with
25.96 SP instead of 10.27, casts S3 there and kills one more of h_0's leaked enemies: h_0 loses 1 LP less (rounds
11–12 LP 18 → 19, 8 → 9; lpLost 30 → 29; ai_0 kills +1, dmgDealt +288).
- bonds, standins and diy unchanged.
- Tests: `test/sim/feedback5-lemuen-s3-wait.test.js` (3: the killed target and the walker who leaves fail on the parent —
the skill ended —; the battle that ends while she waits passes on both), `test/render/fxproj.test.js` +1 (a held lock
stays while the shooter's skill bit is on, then LOCK_T after; an unheld one times out — fails on the parent's
renderer); `test/content/kits_t6.test.js`, `kits_alt_t6.test.js`, `test/sim/feedback3-ammo-bar.test.js` pass unchanged.
### 25.23 The Japanese, Korean and Traditional Chinese interfaces (UI-JA, UI-KO, UI-TW; the owner's decision of 2026-10-07) — `public/i18n/ja.json`, `ko.json`, `zh-TW.json`, `shared/packs.js`, `shared/i18nPacks.js`, `shared/i18n.js`, `public/js/ui/lang.js machineTranslationNote`, `public/js/ui/settings.js`, `tools/build-i18n.mjs` (`untranslated: 'native'`, `nativeCharset`), `data/i18n/*.json`, `public/css/theme.css` (`--cjk-faces`, `:lang()`), `public/js/screens/lobby.js`, docs/I18N.md, docs/PACKS.md
- **Seen**: the owner tested 0.2.0 — 「新版本日语韩语繁体中文实测切换没有生效,只有中文英文生效」. The switch worked (the game texts
changed: 能天使 → エクシア / 엑시아, 陈 → 陳), but §25.20 had shipped the three packs with a `_meta` and no interface
strings, so ja / ko showed the English interface and zh-TW the Simplified Chinese one — every title, button and menu.
**Decision** (the owner's, 2026-10-07): complete all three interfaces for 0.2.0 — zh-TW converted from the Simplified
Chinese (Taiwan usage), ja / ko translated with the official JP / KR game terms, marked as machine translation,
corrections from the community welcome.
- **Now**: every msgid of `en.json` in all three packs (`node tools/i18n.mjs check ja ko zh-TW --strict`: 1028 used, 1028
translated, 0 errors), each `complete: true`.
- zh-TW: OpenCC (cn → twp, Taiwan phrases; a tool run outside the repository, no dependency), then the TW client's own
word where it differs (97 terms from the TW tables walked beside the zh ones — 调度中心 stays 調度中心, not twp's
排程中心; 刷新 → 更新; 重装 → 重裝), then a manual pass over the whole pack (只 / 隻, 重新整理 only for a page reload,
廣告攔截擴充功能 where twp's 外掛 reads as "cheat"). Its fallback stays the Simplified Chinese (the owner's
「繁中缺的字回落到简中」).
- ja: a 93-term glossary from the JP client data (単独演算 / 連合演算, 管理センター, 整備エリア, 防衛支援, 最終防衛段階,
標準 / 逆境 / 死地 / 究極; the mode's JP title 堅守協定:盟約), then a translation of every msgid in short UI Japanese;
eight strings shortened after a screenshot pass (the title-screen name field, the hotkey row, the room's ready lines,
the emote button …).
- ko: a 102-term glossary from the KR client data (위수 협의: 맹약, 독립 / 동맹 시뮬레이션, 보급센터, 정비 구역, 연합 방어,
표준 / 험지 / 극한 / 초월), 합니다체 like the KR client's tips; one hotkey label shortened.
- The mark: `_meta.machineTranslated: true`, a new optional manifest field (docs/PACKS.md; shared/packs.js validates it
as a boolean and copies it into the pack index entry like `complete`); 设置 shows 「当前语言的界面文字为机器翻译,可能不够
准确,欢迎在 GitHub 上指正。」 under the language switch when the current pack has it (ui/lang.js
`machineTranslationNote`).
- The game texts the JP client writes exactly like the Chinese (炎, 不屈, 助力, 速射手 …) were dropped by build-i18n as
untranslated ('same'), so the Japanese interface showed the bonds 炎 / 不屈 / 助力 by their English names. ja's test is
now 'native': a text identical to the Chinese is the client's own when every Han character of it appears in the
client's translated texts (`nativeCharset`); one with a character the client never writes (甄选干员) is still
untranslated. data/i18n/ja.json 96.5 % → 97.5 % (bonds 100 %); ko.json and zh-TW.json rebuilt for the UI packs'
emote names (ko 97.5 %, zh-TW 91.2 %).
- The CJK font stack follows `<html lang>` (`--cjk-faces`; `:root:lang(ja / ko / zh-TW)`): Japanese kanji, Traditional
Chinese and Hangul take their own faces instead of the Simplified Chinese glyph forms. The lobby's difficulty lines
drop the JP bullet ・ like the Chinese ·.
- Known limits (for later): the remake's composed stage names (战场#01 …) have no Japanese / Korean / Traditional
wording in data/i18n, so ja / ko show the English name and zh-TW the Simplified one where the stage name comes from the
data; 冻结 is one msgid for the shop button and the frozen status (Korean 동결 for both; the official status word is
빙결 — a context key would split them).
- Tests: `test/i18n-packs.test.js` (the field, its warning, the shipped manifests, the note shown / hidden),
`test/i18n-data.test.js` (the 'native' test, the shipped ja names 炎 / 不屈 / 助力), `test/ui/i18n.e2e.test.js` (SP_E2E;
reads its expected strings from the pack files and checks the note), `test/i18n.test.js` (placeholders of every pack).
Screenshots of every screen in each language (title, settings, lobby, room, 干员调配, briefing, band draft, prep,
combat, results) were checked by each stream.