feedback1 integrate: docs name the skipped change clip of a late form fx

This commit is contained in:
sganggs committed 2026-10-03 08:36:26 +08:00
1 parent 4bab58e508
commit 87f5135318
2 files changed
+3 -3

No files matched your search

+2 -2
View File
@@ -1162,7 +1162,7 @@ Eighteen workstreams (WA–WR, each on its own branch from master 7f13473) were
- **#5 now**: A_Die_B / _C / _D, then B_* / D_* / C_*; no HP lost before the change (an HP loss stops at 1); the armed forms attack through `ai.js enemyAttack` (`e.profile`).
- **Kill accounting**: a survived knock-out gives no kill, credit, bounty, die event or death hook; wave completion and 联防 counters see the enemy standing; a bounty coin is paid once, at the final death.
- **重生** (PRTS §重生 "清空自身身上除白名单外所有Buff"): `rebirthCleanse` removes ally-sourced buffs and source-less statuses, keeping `persist` talents, enemy-given buffs (锏's 抵抗) and source-less field state; its skills restart from their initial cooldown when it ends (§21.19).
- **Forms on the client**: `setForm` keeps `e.form` (UnitInfo `form`) and puts `form` on its fx (`fxForm`, the 'phase' fx too, so barrier / charge phases are no forms). No client stage drops a form fx: runner catch-up frames (`keepsState`), the hidden-tab backlog of the battle on screen (`hold`; past `HELD_MAX` superseded status / skill toggles are compacted away, `compactHeld`, and only a backlog still past it re-enters the view from the field meta), a battle that ended while hidden (delivered when the tab is shown), the game screen's pre-entry buffer (`keepEarly`, also while a re-sent field meta re-enters the field on screen) and the render engine's queue (`render/interp.js isCosmeticEvent`: a form fx is never dropped as stale nor shed; one handed out late switches the model without its telegraph, its closing clip shortened — the last three since the integration, §21.19). Late views: `renderInfo` keeps `form`. Closing clips are timed from the fx `dur` and keep the current form's death clip until the next form's fx.
- **Forms on the client**: `setForm` keeps `e.form` (UnitInfo `form`) and puts `form` on its fx (`fxForm`, the 'phase' fx too, so barrier / charge phases are no forms). No client stage drops a form fx: runner catch-up frames (`keepsState`), the hidden-tab backlog of the battle on screen (`hold`; past `HELD_MAX` superseded status / skill toggles are compacted away, `compactHeld`, and only a backlog still past it re-enters the view from the field meta), a battle that ended while hidden (delivered when the tab is shown), the game screen's pre-entry buffer (`keepEarly`, also while a re-sent field meta re-enters the field on screen) and the render engine's queue (`render/interp.js isCosmeticEvent`: a form fx is never dropped as stale nor shed; one handed out late switches the model without its telegraph or a change clip that would already have ended, its closing clip shortened — the last three since the integration, §21.19). Late views: `renderInfo` keeps `form`. Closing clips are timed from the fx `dur` and keep the current form's death clip until the next form's fx.
- **Audit**: 锏 / 扎罗 had #5's look (fixed: their 重生 clips); 杰斯顿 → C2_*; 守墓石像 per PRTS (statue, then flight, §21.9); 再生: 1 s 重生, then shields within 1.8. No unit stays untargetable. “余音” stays unmapped (no source says which form is A).
- [ASSUMED]: the translator is immobile during its change and stays damage-cancelled; the HP-loss floor 1; form letters B / C / D; the 特战术师 form also hits flyers (the standalone PRTS 特战术师 "不会攻击飞行单位" may carry over — one line, `canTarget: (u) => !u.isFlying`); the ember's 10 s counts from the end of the 重生; 再生's 傀儡 walks; the statue does not attack (clip Sleep); 隐匿 returns at once after a block (PRTS: 3 s); the 重生 whitelist.
- Tests: `test/sim/feedback1-transform.test.js`, `test/match/feedback1-runner-forms.test.js` (stalls, hidden tabs, a battle ending while hidden, compaction, the runner feeding the render buffer), `test/render/interp.test.js`, `test/render/forms.test.js`, `test/content/enemies_bosses.test.js`; opt-in `test/render/feedback1-forms.browser.test.js` (`RENDER_E2E=1`; blocking 1 s long tasks).
@@ -1300,7 +1300,7 @@ Eighteen workstreams (WA–WR, each on its own branch from master 7f13473) were
### 21.19 Integration follow-ups (`feedback1`) — `render/interp.js`, `render/app.js`, `battle/runner.js`, `screens/game.js`, `sim/Battle.js foesInRadius`, `sim/professions.js`, `sim/constants.js CHAIN_RADIUS`, kits tier1–6, `content/{enemies,tokens,generic}.js`, `content/items/battle.js`, `content/bonds/core.js`, `ui/ticker.js`, `match/Match.js`, `match/bot.js`
The last review of §21.4's client fix, the cross-workstream notes and the last review rounds were checked on the merged branch; the worthwhile items with a primary source are done here (the rest: §21.20):
- **Form fx in the render engine** (review of the final §21.4 fix, major): `render/interp.js isCosmeticEvent` counted every 'fx' as cosmetic, so `processEvents` dropped one stamped > 1.5 game s behind the render clock and a full queue shed it — after a main-thread stall over ≈ 0.78 s real at 2×, on a watched replica after a hidden tab (catch-up frames of 8 game s), after Chrome's intensive throttling, and for the game screen's replayed early buffer (stamped 0). Reproduced in headless Chrome: 转译基底·α ended `dead:null:B_Die` — report #5's look. **Now** a form fx is state for the queue too; one handed out late switches the model without its telegraph and with its closing clip shortened by the lateness. The runner compacts an overflowing hidden-tab backlog (`compactHeld`) instead of re-entering the view, flushes the backlog and a last snapshot of a battle that ended while the tab was hidden, and the game screen buffers the frames of a re-sent field meta for the field on screen until it re-enters it. The browser test stalls the main thread (blocking 1 s long tasks; the old `sleep` left the renderer's ticker running).
- **Form fx in the render engine** (review of the final §21.4 fix, major): `render/interp.js isCosmeticEvent` counted every 'fx' as cosmetic, so `processEvents` dropped one stamped > 1.5 game s behind the render clock and a full queue shed it — after a main-thread stall over ≈ 0.78 s real at 2×, on a watched replica after a hidden tab (catch-up frames of 8 game s), after Chrome's intensive throttling, and for the game screen's replayed early buffer (stamped 0). Reproduced in headless Chrome: 转译基底·α ended `dead:null:B_Die` — report #5's look. **Now** a form fx is state for the queue too; one handed out late switches the model without its telegraph, with its closing clip shortened by the lateness and without a change clip that would already have ended. The runner compacts an overflowing hidden-tab backlog (`compactHeld`) instead of re-entering the view, flushes the backlog and a last snapshot of a battle that ended while the tab was hidden, and the game screen buffers the frames of a re-sent field meta for the field on screen until it re-enters it. The browser test stalls the main thread (blocking 1 s long tasks; the old `sleep` left the renderer's ticker running).
- **Area damage and 隐匿** (PRTS 作战机制 §AOE伤害判定 "AOE的判定是对攻击范围内的每个可以被选中的敌人进行判定"; 隐匿 "隐匿状态下的单位一般无法被敌方的索敌机制和Buff选择器选中为目标"): an operator's radius area effects — profession splash, aftershocks, skill circles and zones, counting conditions — use `Battle.foesInRadius` (no untargetable, no unblocked unrevealed 隐匿 enemy); enemy-side auras / heals and physical collisions keep `enemiesInRadius`. The 逐火 embers and every 隐匿 enemy take less splash than in 0.1.0 (officially they took none).
- **Splash radii** (PRTS 溅射半径一览, 特性 / 特殊): 投掷手 0.9 (was 1.0), 链术师 jumps 1.7 (1.8; `CHAIN_RADIUS`), 格雷伊 1.0 (1.1); 迷迭香 S2 末梢阻断 1.5 (the table's skill row; was ×1.3 [ASSUMED]).
- **阿罗玛's 非首次标记** (PRTS 阿罗玛 天赋 备注 "…自身离场时移除自身已施加的标记,不同阿罗玛之间的非首次标记通用"): one mark per enemy (`aroma:bubbled`, the setter as source) shared by every 阿罗玛, removed when its setter leaves (two used to trigger on one enemy; E3 made it show).
+1 -1
View File
@@ -284,7 +284,7 @@ skill toggles, and a battle that ended while hidden delivers it when the tab is
buffered before a field is entered (`screens/game.js keepEarly`, also while a re-sent field meta re-enters the field on
screen) and the render engine's event queue (`render/interp.js isCosmeticEvent`: a form fx is never dropped as stale,
more than 1.5 game s behind the render clock, nor shed from a full queue; one handed out late switches the model
without its telegraph); dropping them was report #5's look again after a stall or a background tab.
without its telegraph or a change clip that would already have ended); dropping them was report #5's look again after a stall or a background tab.
**Ownership** (`enemy.ownerId`, used for `killed/total` and leak attribution): `ownerPlayerId` if given, else the
player whose half contains the spawn tile (cols ≥ 11 = right half / player with colOffset 8 or side R). A leak is