Add special-target activation without bypassing attack cadence, cooperative card preferences and emotes, skill sound banks, per-operator voice choices, text sizing, install prompts, closed-tab recovery and unanimous setup rerolls. Retain late deployment elapsed time and resolve echo/counter pulses without recursive hook overflow. Independent final review remains pending. Golden: roster-016, roster-035, roster-036, roster-045; boss-boss_1-pair, boss-boss_3-pair, boss-boss_5-pair, boss-boss_7-pair, hidden-boss_9-pair; solo-HARD-9-boosted: Lemuen attack cadence. diy-132: Necras extra activation targets. coop2-NORMAL-14-standins: cooperative purchase preference and simulation fixes. hidden-boss_10-solo: echo pulse FIFO resolution. See DESIGN 28.13-28.24 for assumptions, sources and contributor credit.
347 lines
28 KiB
Markdown
347 lines
28 KiB
Markdown
# DESIGN §28 — 0.2.3
|
||
|
||
Part of [DESIGN.md](../DESIGN.md) (the index; section numbers are global).
|
||
|
||
## 28. New content and community fixes
|
||
|
||
This chapter describes the development version, not a published release. Numerical content is rebuilt from
|
||
CN client 2.7.81, ArknightsGameData commit `17759cc8cdf37388414145d16262a3a06f3ab25e` (2026-10-08),
|
||
with mechanism notes from PRTS checked on 2026-10-09. Launch-day descriptions may receive corrections.
|
||
|
||
### 28.1 克莱门莎 — `sim/content/kits/ops/op-clemnt.js`
|
||
|
||
- **Source:** [PRTS 克莱门莎](https://prts.wiki/w/克莱门莎) and the official character, skill and range tables.
|
||
The non-collaboration 6★ roster gains Clementia (`char_4231_clemnt`), a 本源近卫: 72 DIY operators,
|
||
89 backup units including stand-ins, 259 selectable forms. All three skills are selectable in the existing
|
||
tier-5 / tier-6 DIY slots at their existing skill-rank rules; potential and cultivation follow the player's settings.
|
||
She has no launch module. Her bonds follow the existing faction mapping, including 阿戈尔.
|
||
- **Talents:** each physical hit independently rolls 生死定夺's pre-DEF ATK multiplier; an enemy with current
|
||
DEF below its initial DEF uses the higher probability. 习得性防御 reduces physical / Arts damage from the
|
||
forward half-plane (including its boundary) or an enemy she blocks; 海怪 uses its separate reduction.
|
||
Both talents take their potential-sensitive values from the generated data.
|
||
- **S1:** the charged attack applies its ATK scale and inflicts 侵蚀损伤 proportional to actual HP damage.
|
||
**S2:** the cabin travels forwards at 2 tiles/s, up to 3 tiles, carrying up to 15 ground enemies with a total
|
||
weight of 8. Its collision square is 1.1 × 1.1. Impassable terrain stops it; self-bound / teleport-immune
|
||
units cannot ride. Its actual stopping position becomes a radius-1.5 vortex that can affect air, slows by 70%, and each
|
||
second deals 200 erosion damage plus the skill's physical damage. Erosion follows the engine's normal
|
||
resistance, burst cooldown and mode-leader immunity rules.
|
||
Ordinary skill attacks hit their main ground target and up to four neighbours.
|
||
- **S3:** attacks select up to three ground enemies and add erosion based on actual HP damage without spending
|
||
ammunition. A selectable ground enemy's erosion burst anywhere in the current battle marks it for 1 s.
|
||
The closest mark consumes one of 10 bombardments: three physical + elemental hits in the target tile's
|
||
five-tile cross. A tile with an outstanding projectile cannot be selected again for 5 s. Values are taken
|
||
from the skill rank, not inferred from the final rank's description.
|
||
- **[ASSUMED], pending PRTS confirmation:** S2 ordinary splash radius 1.5 and stable spawn-order tie breaks;
|
||
放逐 presently prevents walking, attacking and blocking while keeping the passenger damageable; cabin
|
||
movement updates every sim tick, stops 0.4 tiles before an impassable edge, and the vortex ends with S2.
|
||
S3's first impact is 0.5 s after launch, the others 1 s apart; launched projectiles finish after skill end.
|
||
These are local kit assumptions, not changes to displacement or targeting rules for other operators.
|
||
- **Tests:** `test/content/op_clemnt.test.js` covers available forms, potential, crit probabilities, directional
|
||
defence, S1 cadence, S2 capacity / immunity / terrain / air vortex / target cap, and S3 ammo / global marks /
|
||
mixed damage. Golden changes and the final integration verification are recorded below once complete.
|
||
|
||
Clementia S3 currently uses the shared blast visual as an explicit `[ASSUMED]` placeholder;
|
||
this preserves the previous fallback appearance, not a claim to reproduce her official effect assets.
|
||
|
||
### 28.2 New modules — 黍「好时节」and 乌尔比安「前路」
|
||
|
||
- **Sources:** [PRTS 黍](https://prts.wiki/w/黍), [PRTS 乌尔比安](https://prts.wiki/w/乌尔比安), official
|
||
`uniequip_table` and `battle_equip_table` from the same CN revision. Regenerating data adds GUA-Y
|
||
(`uniequip_003_shu`) and CRU-Y (`uniequip_003_ulpia`) to their existing forms, including the anchor's
|
||
module lookup. The day's new 5★ operators stay outside the established non-collaboration 6★ DIY pool.
|
||
- **黍:** GUA-Y's trait gives 15% damage reduction. The upgraded 天有四时 takes the improved HP / ASPD /
|
||
four-Sui squad bonuses from the module blackboard. Satisfying at least two of the three conditions grants
|
||
the separate additional ATK bonus (3% / 5% at module levels 2 / 3); it expires when the conditions stop holding.
|
||
- **乌尔比安:** CRU-Y increases damage to an enemy blocked by any ally by 10%. Its upgraded talent also counts another
|
||
深海猎人's credited kills (including delayed hits after that hunter leaves) while 乌尔比安 is deployed, shares the module's specified HP / ATK proportion,
|
||
and adds one block at 9 stacks. Potential's extra maximum stack is retained. The mode's tier-5 elite form
|
||
still uses module level 1; support for upgraded talent blackboards does not change that established rule.
|
||
- **Tests:** `test/content/new-modules-023.test.js`, plus existing 黍 and tier-5 kit cases. The level-3 talent
|
||
fixture is sourced from the official module blackboard; it is not exposed as a new tier-5 loadout.
|
||
|
||
### Content verification checkpoint
|
||
|
||
The new content's targeted tests passed 16/16; existing Shu / tier-5 coverage passed 120/120. An independent
|
||
interaction pass checked retreat cleanup, sleeping passengers, a real rebirth enemy, hit-count life,
|
||
post-retreat bombardments and delayed hunter kill credit. It found and corrected vortex-position rounding,
|
||
an unsupported elemental-resistance bypass and an unnecessary on-field check on the credited hunter.
|
||
All 285 golden scenarios were regenerated: only `roster` and `diy` changed, (`roster-019`, `roster-038`, `diy-059`–`diy-140`), because the added module expands
|
||
loadout coverage and the added DIY operator / Shu module expand and regroup the DIY scenarios. `bonds`,
|
||
`fields`, `matches` and `standins` remained byte-identical. Full integration and browser checks follow separately.
|
||
|
||
### 28.3 Clipboard export inside dialogs — #433
|
||
|
||
Reported by @RushFTK: exporting settings over an insecure/LAN connection focused the language selector and
|
||
reported success without copying the export. The fallback textarea was appended outside the active dialog,
|
||
whose focus trap redirected selection before `execCommand('copy')`.
|
||
|
||
`ui/clipboard.js` now selects its temporary textarea inside the active dialog/guide, validates focus and the
|
||
whole selection before copying, and always removes it and restores focus, including after exceptions.
|
||
The secure Clipboard API remains first choice; a failed fallback returns false for the existing manual-copy UI.
|
||
Shared invite/loadout copying uses the same helper. Device tests passed 16/16; independent interaction probes
|
||
passed 12/12. The real nested-dialog regression is included in `test/ui/modal.e2e.test.js` for integration testing.
|
||
|
||
### 28.4 蕾缪安's wanted range also triggers skills — #428
|
||
|
||
Reported by @CurlyZhu. Marked enemies' tiles extended normal targeting, but were absent from the skill's
|
||
initial trigger range: full SP could sit idle while she attacked a remote wanted enemy. Her kit now registers
|
||
those tiles through the existing `addTriggerRange` contract, retaining target selectability and operation cooldown.
|
||
[PRTS 蕾缪安](https://prts.wiki/w/蕾缪安) also clarifies that a new detection timer needs a selectable target,
|
||
a timer already attached continues while sleeping within detection range, and the source leaving clears its
|
||
timers and marks. Each source now tracks its own progress; one Lemuen leaving does not erase another's marks.
|
||
The focused 12 tests cover all three skills, cross-player detection in a joint field, sleep/wake, multiple sources,
|
||
redeployment (including immediate range cleanup before the next attack) and the existing S3 waiting/late-bombardment behavior. Independent review passed after fixing that cleanup.
|
||
|
||
Golden: all 285 scenarios recomputed. `roster-016/018/035/036/045`, `boss-boss_1/3/5/7-pair`,
|
||
`hidden-boss_9-pair` and `solo-HARD-9-boosted` move because wanted marks now drive skill casts and
|
||
source-owned detection/cleanup; allies and kill timing consequently change. Bonds, stand-ins and DIY are unchanged.
|
||
|
||
### 28.5 远牙's granted trait on substitute switches — #415 / PR #429
|
||
|
||
Ported from [PR #429](https://github.com/sganggs/Stronghold-Protocol/pull/429) by @CXUtk; reported and
|
||
original-mode interaction confirmed by @rosexxxp. The official activity table supplies the amounts:
|
||
`garrison_148_a/b` grants `garrison_108_a/b`, +4/+8 to active 卡西米尔 and 精准, capped at 24/48 per battle.
|
||
Only that granted trait additionally listens to `dollSwap`, in both directions, through the existing gain function.
|
||
Deployment and switches share the original cap, active-bond checks and grant deduplication. Other deployment
|
||
traits keep their existing triggers. The 7 regression cases cover both real dollkeepers, natural and S2 returns,
|
||
shared caps, duplicate grant holders, inactive bonds and unrelated timed windows.
|
||
|
||
### 28.6 Asset download visibility — PR #421
|
||
|
||
Ported from [PR #421](https://github.com/sganggs/Stronghold-Protocol/pull/421) by @LimitlessHPPK.
|
||
The asset resolver records every planned leaf with no alternative on disk as `droppedLeaves` in its report;
|
||
the terminal prints a bounded summary. `--strict` / `SP_ASSETS_STRICT=1` returns exit 1 for those omissions.
|
||
The default remains a warning, and the existing manifest shrink guard remains in force. Strict mode changes
|
||
the outcome code; it is not a transaction and does not roll back a manifest already written. Temporary test
|
||
assets are cleaned up after each case. This is an opt-in tool check, not an added packaging requirement.
|
||
|
||
### 28.7 Korean wording and contribution template — PRs #414 / #432
|
||
|
||
[PR #414](https://github.com/sganggs/Stronghold-Protocol/pull/414) by @D-Roote improves 292 existing Korean
|
||
interface strings. Only its message values are ported; later keys and the pack's translation metadata remain.
|
||
[PR #432](https://github.com/sganggs/Stronghold-Protocol/pull/432) by @Xinglan233 supplies a contribution
|
||
checklist covering the problem, source evidence, assumptions, actual checks and golden changes. The template
|
||
is installed at `.github/pull_request_template.md`, the default template location, so GitHub can offer it
|
||
without a named-template query parameter. No gameplay rules change.
|
||
|
||
### 28.8 Stop recalculating held Spine poses — PR #434
|
||
|
||
Ported from [PR #434](https://github.com/sganggs/Stronghold-Protocol/pull/434) by @Cloudnyco. A finished,
|
||
non-looping, unmixed death pose or frozen model can reuse its posed skeleton and cached pixels while its
|
||
clock advances. First poses, new clips, tint changes, mixing, multiple tracks, pending wind-ups / closing clips,
|
||
clipping switches, dirty textures and zoom rescaling still update. Redeployment resumes normal animation.
|
||
Redeploy countdown labels share rasterized textures keyed by text, colour and resolution; late web fonts refresh
|
||
them in place. The 64 targeted renderer tests passed. The author's performance measurements are not reproduced
|
||
here; real Pixi checks are part of the integration pass. No battle rule or golden result is intentionally changed.
|
||
|
||
Real Chrome verification additionally renders one actual Spine death against continual forced updates through
|
||
mixing and the held final frame (40 pixel comparisons over 600 frames), checks revival and the actor clock under the held-update policy,
|
||
and reloads Bender after a shared label was rasterised. The label updates in place and DPR variants stay separate.
|
||
This verifies correctness on that model; it is not a new performance benchmark or a full-roster pixel claim.
|
||
|
||
### 28.9 Preserve facing during pushes and pulls — #418 / PR #427
|
||
|
||
Ported from [PR #427](https://github.com/sganggs/Stronghold-Protocol/pull/427) by @YinqiMargatroid.
|
||
Successful pushes/pulls mark their displacement events `keepFacing` so the renderer retains pre-hit facing
|
||
while waiting for the endpoint snapshot and throughout the slide. Raw displacement and explicit
|
||
`keepFacing: false` retain the old directional behavior. Position, distance and unbalance time are unchanged.
|
||
The contributor's source clips and their limitations are retained in research 13; those observations were not
|
||
independently replayed for this port. **[ASSUMED]** other push sources and pulls against the target's old facing
|
||
share the examples' display behavior; the drag template alone cannot establish that engine rule.
|
||
Tests cover real push/pull skill paths, default/override metadata, snapshot reversal, and an earlier attack
|
||
arriving after slide prestart in either field direction. Golden metadata deliberately omits the display flag.
|
||
|
||
### 28.10 Charged guardian heals and mixed-skill activation — #406
|
||
|
||
Reported by @ChengCC0101. 塞雷娅 / 黍 S1 previously required an enemy to supply the attack that their charged heal
|
||
replaces. [PRTS 塞雷娅](https://prts.wiki/w/塞雷娅) and [黍](https://prts.wiki/w/黍) describe an eligible ally at
|
||
half HP or below, with the normal attack cadence. `updateAlly` now checks this alternate target after its cooldown
|
||
and control/disarm checks; an enemy is unnecessary. An invalid pending heal still returns its charge. This corrects
|
||
the enemy requirement inferred in historical §27.31; that earlier conclusion is superseded.
|
||
|
||
[PRTS 凯尔希·思衡托](https://prts.wiki/w/凯尔希·思衡托) S2 can attack enemies and heal allies. Its automatic
|
||
activation now accepts either target kind on its expanded range, under the existing player-approved range strategy
|
||
and operation cooldown. S1/S3 keep their existing trigger rules. This addresses the healing/activation parts of #406;
|
||
the separate fatal-hit/silence report still needs an independently justified damage-order fix.
|
||
|
||
Verification: 104 targeted tests pass. Independent interaction review found and verified fixes for a one-frame
|
||
cadence delay and premature charge use while disarmed; normal/100-ASPD intervals are exactly 1.2/0.6 s.
|
||
Sleep, silence, no-heal targets, charge refunds, cooperative healing and S2 target selectability remain covered.
|
||
|
||
Golden: all 285 scenarios recomputed; `diy-059`, `diy-133` change because
|
||
charged heals now act without enemy targets and S2 can open for enemies. Other scenarios remain byte-identical.
|
||
|
||
### 28.11 Integration checks for the expanded roster
|
||
|
||
The fixed roster assertions now include 72 owned DIY operators, 259 forms, 192 voiced operators and 2688 Japanese
|
||
lines; the official-table comparison still checks every potential, skill and module. Clementia adds one 阿戈尔 pick.
|
||
The official EN overlay has no launch-day Clementia talents yet: overall coverage remains ≥97%, with the measured
|
||
talent floor explicitly updated to 94.9%; untranslated text keeps its Chinese fallback. The old Saria no-enemy
|
||
assertion is corrected to require actual healing, and development builds retain the standard top-of-README notice.
|
||
|
||
|
||
## §28.12 浏览器验收退出时释放自有日志管道
|
||
|
||
完整浏览器验收中,真实对局与观战的断言已经全部通过,但 Chrome 的崩溃报告/更新辅助进程继承了日志管道,测试进程仍在等待读取结束。共用测试客户端现在在浏览器子进程明确退出后释放它的 stdio;关闭失败、子进程仍活着时不关闭管道,也不操作其他浏览器进程。游戏运行时代码与战斗规则不变。
|
||
|
||
新增真实子进程继承 stderr 的回归,以及关闭失败/信号退出的边界检查;验收要求原异常文件单独重跑并确认正常结束。首轮异常与复测结果分别保留在本轮验收记录中。
|
||
|
||
同一轮的版本重连测试在刻意停服时,Chrome 可能报告连接拒绝、连接重置或未连接的 socket。测试只在主动停服至恢复握手的窗口内排除这些已知传输日志;正常运行期间仍检查它们,脚本异常始终保留,所有版本指纹、重连及换局刷新断言不变。
|
||
|
||
### 28.13 Special targets respect DEFAULT attack timing — #438–440
|
||
|
||
Seen: 死芒's normal attack reaches enemies blocked by his own summons, but S1/S2 did not open for those targets.
|
||
The earlier 蕾缪安 fix also registered a per-tick trigger, allowing an early cast before her attack countdown elapsed.
|
||
The [PRTS mode help](https://prts.wiki/w/卫戍协议/帮助) describes DEFAULT activation at the next ordinary attack.
|
||
`addTriggerRange` now accepts `attackOnly`; both operators use it, while existing summon-area triggers retain their
|
||
per-tick behavior. Only live owned summons / wanted marks contribute selectable targets. S2's actual link range is
|
||
unchanged. PR #438 by @YinqiMargatroid addresses the same wanted-target symptom; the existing registration API is
|
||
extended instead of introducing a second targeting flag. SIM.md and design/engine.md contain the current contract.
|
||
|
||
Tests: real summoned-bone blocking, S1/S2 and united fields, attack countdown, sleep/ownership, wanted-target S1–S3,
|
||
plus existing 令 / 麦哲伦 trigger regressions. The combined operator checks pass 27 tests; the additional area-trigger
|
||
and champagne controls also pass. Golden movement is recorded below.
|
||
|
||
### 28.14 Interface text size — #435 / PR #446
|
||
|
||
Adapted from @7eLaryn: four persisted text sizes use `--t` without changing the rem layout root. All shipped language
|
||
packs retain their current translations. Added the missing explanatory note and fixed English XL settings overflow:
|
||
segmented controls and header actions wrap within their available width. Long briefing alliance labels size and wrap
|
||
with their cards instead of overlapping neighboring names. Default sm preserves the previous sizes.
|
||
|
||
Tests: settings / text-unit checks, phone landscape growth and unchanged board/canvas/shop geometry, reload persistence,
|
||
and XL settings in Chinese, English, Japanese, Korean and Traditional Chinese. The first multilingual check exposed
|
||
English overflow; the corrected browser suite passes. Current behavior is in design/client.md and PLAYING.md.
|
||
|
||
### 28.15 Cooperative card purchasing — PR #407
|
||
|
||
Adapted from @IceCodeNew. [ASSUMED] A tier V/VI shared-pool card matching another living teammate's active opening
|
||
bond receives one 18-point buying-score penalty. It is a soft preference, not reserved stock; normal/elite and DIY
|
||
stock semantics remain unchanged. Humans and bots receive the same cooperation. This does not add persona presets.
|
||
|
||
Tests: 14 targeted bot tests; 40-seed solo:HARD and coop4:HARD before/after benchmark is part of integration evidence.
|
||
The comparison includes the special-target timing changes of §28.13, so it must not be interpreted as an isolated
|
||
measurement of the purchasing heuristic. Current rule: design/match.md §6.6 and its follow-up contract.
|
||
|
||
### 28.16 AI teammate emotes — PR #444
|
||
|
||
Event wiring from @DDDarkstar, with corrected dispatch semantics. [ASSUMED] Cosmetic reactions are enabled only in
|
||
mixed human/AI matches, under the existing emote whitelist and cooldown; `SP_BOT_EMOTES=0` disables all hooks.
|
||
Responses skip cooling bots and stop after one reply. MVP uses this round's kills and damage, with stable order for
|
||
ties; settlement reacts once per round. Only the third chess merge reacts, then resets for the next round. A gift uses
|
||
its source playerId rather than a display-name heuristic. No RNG, gameplay decisions or timers are introduced.
|
||
|
||
Tests cover whitelist/cooldown, no human impersonation or recursive AI reply, pure-AI silence, round statistics,
|
||
settlement/merge limits, gift identities, the disable switch and actual emote/acquisition hooks. README, META.md and
|
||
design/match.md document the switch and boundary.
|
||
|
||
### 28.17 Active skill attack and impact sounds — PR #410
|
||
|
||
Adapted from @Convey123's updated PR. The current official `audio_data.json` gives 司霆惊蛰 mode attack banks and
|
||
赤刃明霄陈 S3 separate swing/impact banks. The generator adds per-slot `attacks` / `hits`, each with its own optional
|
||
`attackMix` / `hitMix`. It preserves the selected bank's chance and volume rather than applying the normal attack's
|
||
mix. A late impact keeps the mode at launch; an end before spawn cancels a pending start. Snapshot restoration and
|
||
ordinary-mode fallback remain supported. JP voices and current roster assets survive regeneration.
|
||
|
||
[ASSUMED] Where no activation sound names the mode, slot 1/2/3 is inferred as d/h/s. Bank selection prefers START to
|
||
ON and then plain/numeric order; this approximates an ability graph and is not independently established for every
|
||
operator. Mixed-letter banks are rejected. Instant effects that emit no normal attack event remain outside this
|
||
mechanism. ASSETS.md and design/client.md specify the manifest/runtime contract.
|
||
|
||
Tests: 85 audio, manifest, official-mix and JP-voice checks, including independent mode gain, delayed impacts,
|
||
end-before-spawn, late join and field reset. Regeneration is additive; no existing manifest leaf was removed. Four
|
||
unresolved upstream candidate icon/avatar leaves still make strict asset fetching report failure; they are not new
|
||
sound failures or deletions of existing entries. Packaging must retain this limitation visibly.
|
||
|
||
### 28.18 Per-operator voice language — #436
|
||
|
||
Roster details and selected DIY cards offer 中文 / 日本語 / 跟随全局. Settings persist a sanitized charId map locally;
|
||
normal/elite/DIY forms of that charId share the choice. Existing profiles migrate to an empty map, so global language
|
||
continues to apply. Deleting an override restores the current global choice. Missing Japanese slots / files keep the
|
||
existing Chinese fallback. No room protocol or exported combat-loadout data changes.
|
||
|
||
Tests cover malformed/inherited entries, persistence, changing the global default, deleting an override and fallback;
|
||
a real phone-sized browser changes the control, reloads and resets it. Current contract: design/client.md / PLAYING.md.
|
||
|
||
### 28.19 Browser installation — PR #413
|
||
|
||
Based on @Cromemadnd's proposal, with a one-use install controller. Buttons appear only after a browser install offer;
|
||
standalone/fullscreen and installed sessions hide them. Accept, dismiss, failure and duplicate clicks all consume the
|
||
same offer once. See [the prompt API](https://developer.mozilla.org/en-US/docs/Web/API/BeforeInstallPromptEvent/prompt)
|
||
and [installability requirements](https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps/Guides/Making_PWAs_installable).
|
||
The existing original fortress favicon supplies correctly sized 192/512 px icons, shipped outside optional game art.
|
||
No service worker or offline cache is installed; the server is still required.
|
||
|
||
Tests: offer lifecycle/disposal, actual PNG dimensions, real Chrome manifest and installability checks, and a synthetic
|
||
dismissed offer through the actual button. Initial incognito rejection was a test-environment limitation; the real
|
||
installability check runs in Chrome's ordinary temporary profile. Native OS installation itself is not performed.
|
||
|
||
### 28.20 Recover a closed local match window — #431
|
||
|
||
Reproduced with an idle window retaining its own session while a second match window closes. The title/lobby now
|
||
lists local saved match seats using bounded metadata beside the existing recent-token ring. Explicit selection asks
|
||
live tabs to claim the chosen token again before adopting it and reloading. An active tab is never deliberately
|
||
replaced; names/IP are not authentication. Missing BroadcastChannel refuses recovery. A server-generated replacement
|
||
token or leaving clears obsolete metadata. No server API changes; normal automatic startup selection is preserved.
|
||
|
||
Tests: live tab protection, closed-tab recovery, simultaneous claim arbitration, no channel/unknown id, malformed
|
||
storage and expired metadata; a real two-window browser restores the identical server playerId and room after closing
|
||
the match tab. The existing identity/static suite also passes. Current contract: design/client.md and network.md.
|
||
|
||
### 28.21 Unanimous opening reroll — #77 / PR #408
|
||
|
||
Adapted from @Siornya, excluding the unrelated result-screen redesign. [ASSUMED] This remake feature is host-proposed,
|
||
requires every connected human's consent, and pauses confirmation while voting. Bots/spectators do not vote; autoplay
|
||
humans still do. Single-human matches refresh immediately. Refusal, cancellation, disconnect or leave restores the
|
||
old setup and remaining confirmation time. Success preserves room/seats/settings, resets Ready and restarts the full
|
||
normal timer; fixed stages/bans remain fixed. The random result may repeat.
|
||
|
||
A dedicated seed-derived reroll stream does not advance the original shop/draft/meta streams. A 300 ms anti-burst guard,
|
||
setup revision and vote id reject stale actions. Opening data and every player's DIY stock are prepared before any
|
||
mutation; a forced failure on the second player's stock leaves all previous state intact. Current contracts are in
|
||
META.md, design/match.md, design/network.md and PLAYING.md; all four translation packs have the new messages.
|
||
|
||
Tests: 13 match checks including real four-player sockets, permission/spectator checks, cancellation/disconnect,
|
||
reconnect, last-second and queued-Ready timers, outdated messages, one human with bots, fixed rules, fuzzed requests
|
||
and transactional failure. Final browser/integration validation supplements these targeted checks.
|
||
|
||
### 28.22 Late-loading deployment animation — part of PR #416
|
||
|
||
@Cromemadnd's proposal exposed a real missing case: onDeploy arrived before the model, so Start was never played.
|
||
The view now retains elapsed game time until the model arrives and continues the existing clip at that point. A clip
|
||
already over is not restarted; an intervening attack/death cancels the pending entrance. Existing Front/Back transfer
|
||
and single-source deployment audio remain unchanged. The proposed repeated phase/purchase sound sequence is not part
|
||
of this fix: its timing and duplication need separate visual evidence.
|
||
|
||
Tests: delayed load, simulation rate, load after clip end, attack/death supersession, destroyed view and existing
|
||
UnitView behavior, 48 checks passing. No simulation/golden change from this visual fix.
|
||
|
||
### 28.23 Follow-up golden movement
|
||
|
||
Recomputed all 285 scenarios from the integrated code; never copied PR baselines. The DEFAULT cadence correction moves
|
||
`roster-016`, `roster-035`, `roster-036`, `roster-045`; paired fields `boss-boss_1-pair`, `boss-boss_3-pair`,
|
||
`boss-boss_5-pair`, `boss-boss_7-pair`, `hidden-boss_9-pair`; and match `solo-HARD-9-boosted`. 死芒's added activation
|
||
condition moves `diy-132`. `coop2-NORMAL-14-standins` includes both cooperative purchasing and the corrected simulation.
|
||
The pulse queue correction of §28.24 additionally moves `hidden-boss_10-solo`. The bonds and standins families are unchanged. Cosmetic emotes, preferences, installation and opening rerolls that
|
||
are not requested do not intentionally alter those games. The validation record lists any outcome flips and measured
|
||
benchmark changes; the independent final review remains pending.
|
||
|
||
### 28.24 Echo / counter recursion found by the cooperative benchmark
|
||
|
||
The 40-seed benchmark exposed existing hook-depth errors in co-op seeds 3 and 29, plus seed 14 after the purchasing
|
||
change. In all three, “余音” damage pulses and 刺玫 / 泡泡 counters synchronously called each other. A scaled echo can
|
||
have 67 hit-count HP; the generic 32-hook guard cut off effects before the legitimate chain finished. The same chain
|
||
could also enter another hit while zero HP was waiting for death bookkeeping.
|
||
|
||
[PRTS “余音”](https://prts.wiki/w/“余音”) establishes the hit-count and damage-pulse behavior. [ASSUMED] The exact nested
|
||
ordering is not documented: each echo now queues recursively earned pulses and resolves them FIFO in the same call,
|
||
after the current pulse finishes. Every earned pulse retains its attack value, including the lethal hit's pulse. No
|
||
extra tick, RNG draw, global hook-depth increase or arbitrary pulse suppression is introduced. Death prevents further
|
||
counter targeting normally. This local scheduling choice needs final fidelity review.
|
||
|
||
Tests use real elite 刺玫 and 泡泡 against 67-hit echoes: all 67 pulses resolve, the echo dies, no engine error is logged,
|
||
and the queue clears. Both tests fail against the previous implementation. Together with the existing enemy/boss and
|
||
刺玫 healing suites, 273 tests pass. The benchmark now writes actual diagnostic messages beside nonzero error counts,
|
||
so failures cannot be mistaken for ordinary performance results. Recomputed golden and final benchmark results are
|
||
recorded with the candidate; do not reuse the earlier, erroneous benchmark as a clean result.
|