diff --git a/docs/history/0.2.0.md b/docs/history/0.2.0.md index 75182290..bebe39b6 100644 --- a/docs/history/0.2.0.md +++ b/docs/history/0.2.0.md @@ -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 `` (`--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.