Files
ark-stronghold-protocol/docs/history/0.2.4.md
T

25 KiB
Raw Blame History

DESIGN §29 — 0.2.4

Part of DESIGN.md. This chapter records 0.2.4, released on 2026-10-11.

29. Community follow-up

29.1 Boss overtime and Raid revival

  • The maintainer requested the extra Final Assault / Hidden Core overtime grace only for teams with an AI teammate. At fight start, a non-departed AI seat preserves the configured 150 real seconds; otherwise the threshold is the visible level countdown (120 real seconds). The decision stays fixed during that fight. The first deduction is at the following whole real second, at one team LP per real second. overtimeAt uses that same threshold.
  • Ordinary Raid polls keep the 0.2.3 order: own field first, then remaining route distance and stable id, and they still jump only when the skill is ready or the member has been idle long enough and the range is empty. The maintainer confirmed one reselect immediately after a revive. That reselect alone orders by taunt, then remaining route distance, then id, and it jumps while the operator is not blocking, even if another enemy is already in range. Standing on an enemy's tile is blocking: the 0.25 s poll runs before that tick's block pass, so the reselect refreshes contact before it decides to stay. A retreat, a move, a redeploy that waited out its timer, the initial deployment and a Raid jump do not arm it. [ASSUMED] A revive is recognised as a knock-out redeploy that returns before respawnAt; the bond text does not name that timer split.
  • Regression: boss-ai-grace.test.js covers both final fights with/without AI; community-round29.test.js covers Texas S2 with local enemies, remote taunt/route priority, blocked revival and no repeated self-trigger.

29.2 Operator, item and sharing corrections

  • #462, Pinecone S2: PRTS's growth is per deployment. A deployment-local use count resets on redeploy; the runtime's lifetime activation sequence is unchanged. Normal and elite variants are covered.
  • #459, Harold S2: a healer that can heal elemental injury considers elemental-only injury when deciding to cast. Full HP plus an elemental gauge can trigger; a wholly uninjured ally cannot.
  • #461, family crest: the first damage after stealth ends consumes the accumulated bonus immediately, including damage before the next growth poll. A synchronous equipment combo cannot consume it repeatedly; the current hit and combo retain the attack value that triggered them.
  • #464, Skadi S1 / Stead sharing: redirected damage carries both existing redirect ancestry markers, so neither mechanism revisits its own output and the transfer tree stays bounded. Both shares are taken from the pre-redirect hit and the victim keeps 1 − R − S (1000 true with the official 0.4 and 0.5 leaves the victim 100, the three members 400 together and Skadi 500, including the one cross-application the ancestry tags already allow). A single effect is unchanged: Stead alone leaves 600 + 400, Skadi alone leaves 500 + 500. [ASSUMED] The two ratios add as shares of the original hit; no official source says they multiply. The same split does not depend on which damaged handler runs first. Hook registration order remains otherwise unchanged.
  • Sources: PRTS 松果, 哈洛德, mode item descriptions and the existing sharing contracts. community-round29.test.js includes before/after reproductions.

29.3 Ptilopsis copying Yu / Gladiia (#473)

The original-game recording around 2:30–2:38 shows and explains that Ptilopsis's copies of Yu and Gladiia bypass the three-in-row prerequisite. The maintainer approved reproducing only these two exceptions. Preparation-start gifts from these copied traits skip the row condition; original owners, Saria, other traits and other events retain their conditions. The dispatcher records the copied origin in source.copiedFrom; eight original/copier-row combinations are tested in garrisons_meta.test.js.

29.4 Clementia S2 and final-boss erosion

PRTS 克莱门莎, checked 2026-10-10, now specifies S2 ordinary-attack splash: radius 1.1 with collision testing, at most four extra ground targets, each taking 100% ATK physical damage. This replaces the launch-day assumed 1.5 centre radius and copied main-hit multiplier. The primary target retains the skill's own attack multiplier; the vortex remains radius 1.5. Normal/elite numeric, radius and large-body regressions live in op_clemnt.test.js. The unresolved launch-day carriage/bomb timing assumptions remain documented in §28.1.

The PRTS mode record's tips explicitly state that Final Assault leaders do not receive erosion injury. The existing mode-specific immunity remains. All ten final-leader definitions were compared against all five injury types: erosion was blocked, the other four could burst. Main-game constants give leaders a 2,000 erosion threshold, so main-game boss identity alone is not general erosion immunity; that does not override the mode tip or prove every scripted boss phase susceptible. Pith's current three named injury types are unchanged. No unannounced future-season behavior is inferred.

29.5 Shield placement and original champagne art

  • #460: Jessica's placeable shield uses the four orthogonally adjacent tiles stated by her talent. Preview, server validation, owner movement and swaps use a shared placement grid, independent of skill, facing or module. jessica-placement.test.js covers legal/illegal moves, swaps, bots and other summons.
  • #468: the original champagne-bomb model is extracted from the local official token bundle through the existing extraction/build pipeline. There are now 40 local token metadata records. Only this token's spineLocal and the generated asset hash change; the web fallback remains. No game art enters Git.

29.6 UI and recovery

  • DIY selection reuses the roster's LoadoutStats component, showing the chosen ordinary/elite stats, attack range, trait, talents, potential and cultivation. Skill descriptions/SP labels follow the same preview level. The list uses aligned roster-style rows; list and details scroll independently, leaving Confirm reachable.
  • #450: Swire's skill coins show as current/cap, including zero. Optional coins: [[id, balance, cap]] comes from valid live-unit state, is stepped between snapshots and clears when absent. It changes no earning/spending rule.
  • #471: lobby tools are grouped at the left; the player chip opens statistics. Responsive title allocation prevents overlap with long names, translated text, resume and install controls; a narrow header puts its title on a new row.
  • #458: settlement summary scrolls independently from its return button. Enlarged text no longer pushes the button outside the viewport.
  • Transient failed images and board packs can retry on a later useful event. Three.js failed imports use two bounded fresh URLs because browsers cache module failures. A failed field engine may remount on online/visibility events, with cleanup and at most two consecutive retries; explicit fallback/2D choices remain respected. Real Chrome tests abort actual resource requests and verify recovery, single canvas ownership and unmount cleanup. This does not establish the cause of every reported device/GPU failure.
  • #469's repeated “甄选干员干员” was a result validator replacing a DIY operator's name with its empty slot's name. It now resolves DIY and stand-in names from the authoritative BattleSpec; client-supplied names remain ignored.
  • #448: Japanese UI terms are corrected, including 自然回復 and 完璧な作戦, consistent with official Japanese data.

29.7 Verified reports and pending proposals

Muelsyse's deployed Harmony correctly adds one member to existing core bonds, without counting a benched copy or stacking duplicate traits. Six Kazimierz stuns nearby hovering enemies and makes them land; the radius remains 0.8. Targeted real-socket tests cover eliminated host/guest departures in prep/combat/unite and survivor reconnection. These checks did not reproduce the reported generic Harmony/room failures; no speculative rule change was made.

The plugin groundwork remains the existing content-pack manifest/language implementation; a runtime plugin API is not added. Additional dub languages remain deferred until supported resources exist. Other rule/AI proposals require explicit decisions and evidence; open PRs are not blanket approval for their implementations.

Validation and intended golden moves are recorded in §29.12.

29.8 Shared inventory (#466, #430; approved after reviewing the source video)

The maintainer requested the measured rules in 路标档案馆's original 路标月报 #2 (2026-03-29): single-player operators around 0:30–1:00, equipment around 1:30, co-op operators around 2:00, ownership/special grants around 2:30–4:00. Official client tables supply identities, tiers and merge recipes; PRTS mode help supplies equipment return/merge and hand rules.

Stock Base counts by tier I–VI Exceptions
Single-player operators 12 / 14 / 18 / 16 / 8 / 5 I: 普罗旺斯、德克萨斯、跃跃、古米、格雷伊 = 10; II: 风丸 = 8, 赫默、休谟斯、砾、蒂比、调香师 = 12
Co-op shared operators twice the single-player counts exceptions doubled too; independent of seat count
Shared shop equipment 4 / 6 / 7 / 8 / 7 / 3 简易通讯机 = 5; 蜂鸣器、防暴盾、浓缩嗅盐 = 6; 寻呼模块、伪装服、拉特兰桥夹 = 7; 商业包装方案 = 2
  • This explicit decision supersedes the old blanket shared counts and Muelsyse override. Private DIY stock keeps its per-player 8/5 capacities; the video's multiplier describes the shared pool.
  • Normal/elite operators occupy 1/3 copies by every gain route. Kazemaru still merges two normals, but the elite occupies three. Promotion also occupies the full three. Grants beyond capacity keep a negative internal balance: selling one copy cannot expose stock while ownership remains above the cap. Public availability and sampling are clamped at zero; raw balance + owned copies = capacity remains invariant.
  • Mimic samples eligible identities rather than remaining copies and can exceed stock, including the third-copy branch. This supersedes #207's old empty-pool failure. Other pool-weighted grants keep their selection rules.
  • Equipment across every player's hand, temporary area and equipped slots is counted live: normal 1, upgraded 2. Shop/choice displays reserve nothing. Exhausted purchases fail before charging or marking the offer taken; draft duplicates become unavailable when an earlier choice empties stock, and automatic picks skip them. Equipment returned from a sold/merged operator still occupies stock in the hand. 整备 upgrades the bought item only when another copy is still free (the purchase already took one, and a golden takes two). Otherwise the item stays normal and the 整备 charge is not spent. An uncapped item may still be upgraded. Held copies of every capped shop item stay within that cap.
  • [ASSUMED] Consumption/destruction/removal by elimination ends ownership and therefore releases equipment stock; the video does not separately document every removal path. A third lifetime purchase is possible after a prior copy leaves ownership. Non-shop effect-only equipment has no shared shop cap, consistent with unlimited special gifts. This never becomes a two-appearance or two-purchase limit for commercial packaging.
  • Stock counts alone do not establish probabilities. Existing shop tier shares, uniform item selection and explicit effect-pool weights remain, filtered for availability. No new probability curve is inferred from the table.
  • shared-stock.test.js covers exceptions, shared ownership, stale offers, reacquisition after destruction, upgraded occupancy, consumption, duplicate draft exhaustion and Mimic overdraw/release.

29.9 Ember proposal (#465) — current behavior preserved

The history in §22.8 and the 0.1.2 changelog records the chosen compromise for queued 深池逐火 enemies. Comparing the current code with the proposed phase-order swap reproduces that risk: after a blocker takes the next warrior, the three husk types can be finished by ranged hits in the current reveal window; the proposal hides them throughout that window and they stand up again. Reveal or spare blocking capacity defeats them in either version. This is not absolute invulnerability, but it removes the previously chosen counterplay window. The proposal is not adopted; the existing phase-order assumption remains pending a better official comparison.

29.10 Approved scope additions

  • #467: Clementia S2 includes selectable airborne targets in the expanded skill attack grid when deciding to cast, like Chen S3. Normal attacks stay ground-only. [ASSUMED] No mode recording establishes a separate trigger shape for this new operator. Tier/form, range, stealth/sleep, stun and operation-cooldown regressions cover it.
  • #451: the reserve medic appears in preparation, scouting and boss-half views as a read-only map character, including fallback rendering. Touch replaces it when battle starts. Initial aggro order remains unchanged.

29.11 Champagne selection follow-up (#476, replaces #468)

PRTS 香槟炸弹 identifies it as a device, normally excluded from ordinary allied selection. Both bomb creation paths now share the internal isolated selection barrier: Angelina auras and Skadi inspiration no longer select it, while ordinary unhealable summons remain selectable. HP protection, no-heal behavior and detonation retain the previous rules. The new source is PR #476 by Siornya; its original-art portion was first proposed in #468. Both creation paths, ordinary-summon controls and existing aged/contact detonations are tested.

29.12 Validation and golden changes

Full regeneration after the post-revive Raid reselect, the shared-damage split and the 整备 stock check. The corpus is 287 scenarios. No release scenario was removed. Two scenarios were added.

265 of the 285 release scenarios keep the 0.2.3 digest (1db8e510): roster 49/49, bonds 46/46, fields 22/22, stand-ins 10/10, and 138 of 140 DIY battles. The taunt order applies only to the one reselect after a revive, and these battle digests stay on the release result.

diy-135 and diy-136 move because their fields include Clementia. op-clemnt.js is the only operator kit on either field that differs from 0.2.3; the Mon3tr kit, and the defender, guard and sniper kits on diy-136, are the release kits. The splash and airborne-cast changes are §29.4 and §29.10.

  • diy-135 (Clementia S1–S3 and Mon3tr): cleared at 198.03 s, 150 kills, 0 leaks, perfect, 1 death becomes timeout at 230 s (5,941 → 6,900 ticks), 149 kills, 1 leak, not perfect, 0 deaths. Damage dealt 1,661,420 → 1,648,194. The first unit row that moves is Clementia S1 (chess_char_5_diy1_a), kills 1 → 0.
  • diy-136 (Clementia S1–S3 with defenders, guards and snipers): still cleared at 212.4 s, still not perfect. Kills 13 → 12, leaks 110 → 111, damage dealt 651,626 → 540,205. Clementia S2 (chess_char_6_diy2_a) kills 7 → 6 and damage 383,594 → 320,372.

All 18 release matches move. Every one changes its shop-draw count, and the first settle row that differs changes the board hash (operator, tile and equipment). That is the shared-stock lineup change in §29.8. solo-HARD-9-boosted is the only match whose first differing row also changes kills and leaks; its board and bonds change on that same row.

The ending class changes:

  • solo-FUNNY-2: defeat at round 8, team LP 0, boss HP left 17,162 becomes victory at round 9, team LP 2, boss cleared. Shop draws 123 → 154. The round-1 board changes and gains yanShip 0/1.
  • solo-HARD-1: victory at round 14, team LP 12, boss cleared becomes defeat at round 13, team LP 0, boss HP left 341,377. Shop draws 201 → 215. The round-3 board changes.
  • solo-HARD-2: defeat at round 13, team LP 0, boss HP left 66,239 becomes victory at round 14, team LP 28, boss cleared. Shop draws 279 → 283. The round-1 board changes.
  • solo-ABYSS-1: eliminated in round 13 after 12 rounds becomes defeat at round 13, still alive, team LP 0, boss HP left 2,832,671, hidden boss unreached. Shop draws 138 → 215. The round-3 board changes.
  • solo-ABYSS-2: eliminated in round 12 after 11 rounds becomes defeat at round 13, still alive, team LP 0, boss HP left 2,823,834, hidden boss unreached. Shop draws 179 → 280. The round-1 board changes.
  • coop3-ABYSS-5: eliminated at round 11 becomes defeat at round 13, team LP 0, boss HP left 2,616,799, hidden boss unreached. ai_0 stays eliminated in round 10. ai_1 is no longer eliminated in round 12 and passes 13 rounds. ai_2 is eliminated in round 11 after 10 rounds, previously round 10 after 9. Shop draws 531 → 506. The round-2 board changes.
  • coop4-ABYSS-7: eliminated at round 12 becomes defeat at round 13, team LP 0, boss HP left 3,486,896, hidden boss unreached. ai_0 is no longer eliminated in round 13 and passes 13 rounds. ai_1 passes 8 → 11 rounds and is eliminated in round 12 instead of 9. ai_2 passes 11 → 12 rounds and is eliminated in round 13 instead of 12. ai_3 stays eliminated in round 8 after 7 rounds. Shop draws 539 → 645. Round-4 boards, bonds, pending gold and layer counts change.

Same victory and reason, team LP changes:

  • solo-FUNNY-1: victory at round 9, team LP 27 → 16. Shop draws 142 → 87. The round-1 board drops sargonShip.
  • solo-NORMAL-2: victory at round 14, team LP 25 → 15. Shop draws 227 → 226. The round-1 board changes.
  • coop2-NORMAL-3: victory at round 14, team LP 68 → 51 (ai_0 41 → 34, ai_1 27 → 17). Shop draws 449 → 487. The round-3 ai_1 board changes.
  • coop2-NORMAL-8-serverrun: victory at round 14, team LP 58 → 26 (ai_0 30 → 10, ai_1 28 → 16). Shop draws 485 → 482. The round-1 ai_1 board changes and preciShip goes from tier 1 to tier 0.
  • coop2-NORMAL-14-standins: victory at round 14, team LP 30 → 31 (human 17 → 18). Shop draws 428 → 403. The round-4 boards change and the human's raidShip 1/8 is gone. Stand-ins were fielded in 10 of 13 settle rows at 0.2.3 and in 0 of 13 now.
  • coop2-ABYSS-10-boosted: victory at round 15 with the hidden boss cleared, team LP 630 → 704 (ai_0 315 → 354, ai_1 315 → 350). Shop draws 591 → 649. The round-1 boards change.

Same victory, reason, rounds and team LP:

  • solo-NORMAL-1: defeat at round 13, team LP 0. Boss HP left 884 → 50,897. Shop draws 207 → 159. The round-3 board changes.
  • solo-HARD-9-boosted: victory at round 15, team LP 399, hidden boss cleared. Shop draws 346 → 343. Round 8 changes the board, the bonds, gold, kills 18 → 19 and leaks 1 → 0 together; that row's LP is 399 → 400 and the final team LP stays 399.
  • coop2-HARD-4: eliminated at round 12. Shop draws 419 → 417. The round-3 boards and bonds change (ai_0 gains arcaneShip and preciShip; ai_1 loses sargonShip).
  • coop2-NORMAL-70-diy: victory at round 14, team LP 55. Shop draws 503 → 586. The round-3 boards change and the human's bonds become miraShip and yanShip. DIY operators were fielded in 6 of 13 settle rows at 0.2.3 and in 0 of 13 now. Virtual duration 121,400 → 118,400 ms.
  • coop4-FUNNY-6: victory at round 14, team LP 130. Shop draws 832 → 952. The round-1 ai_2 board, layers and bonds change. Virtual duration 130,000 → 127,000 ms.

Added coverage, both victories at round 14:

  • coop2-NORMAL-1-coverage-standins: team LP 37 (human 11, bot 26). Stand-ins are fielded in 6 of 13 settle rows.
  • coop2-NORMAL-5-coverage-diy: team LP 30 (human 23, bot 7). DIY operators are fielded in 5 of 13 settle rows.

Seeds 14 and 70 keep their outcome rows and, under these lineups, field no stand-in and no DIY operator. The two added seeds carry those paths.

Replacing a field renderer also resets the game screen's entered-view identity. Frames are buffered while the replacement loads; after subscribing, the local runner re-shows full current metadata/snapshot, or the server resends the watched field. Real local and server-streamed battles preserve the same simulation object and clock through recovery, including enemies spawned before the new renderer existed. A refresh of the same field whose metadata lists no device keeps crates and turrets already noted from their one spawn event; metadata that names devices replaces that list. A different field does not keep the previous battle's devices.

29.13 Multiplayer boss Raid landing (#475)

The maintainer approved a narrow revision to §26.1 on 2026-10-10 after the report of three remaining multiplayer seats leaving one boss field unpaired. Only Raid in mode_multi_* Final Assault / Hidden Core battles may use the empty half's normal deployment area (rows 2–5, cols 2–18). This is an explicit maintainer decision on the community report, not a claim of independently verified official footage. Hand row 0, temporary row 1, single-player mode's empty boss half and lone-helper 联防's empty half stay closed. Terrain, field bounds, living/downed reservations, target ordering and attack reach retain their checks. The exception is local to Raid; general board membership, Ulpian S3 movement, summons and preparation placement do not expand.

feedback5-raid-own-board.test.js reproduces the eight left/right, melee/ranged, boss/hidden blocked cases before the fix, and checks actual solo modes, hand/temp/side margins, terrain and living/downed reservations afterward. All 287 golden scenarios were regenerated and verified with no additional digest changes. A fresh 80-match sample also had zero errors and unchanged wins, completed rounds and final LP versus the preceding candidate. Two co-op HARD runs changed round-14 counters: seed 33's unpaired player killed 22 enemies instead of 26; seed 39's unpaired player killed 5 instead of 6 and leaked 1 instead of 0. Opening more landing tiles does not guarantee better outcomes.

29.14 Device cards after field refresh

Re-entering the same battle with metadata that omits once-spawned devices now restores the remembered device records to the renderer as well as to the detail-card lookup. Otherwise an HP snapshot recreated the crate as an unknown enemy: picking emitted a unit click with no definition, instead of the tile click needed by the device card. The engine-canvas regression retains the card/100 HP assertions and also covers another field refresh, live HP loss and closing the card when the crate is destroyed. Device metadata supplied by the new entry still wins; changing fields does not carry old devices across. Gameplay and allied targeting rules are unchanged.

29.15 Prepared 外勤医疗 target order (follow-up to #451)

PR #451 made 预备干员-医疗 visible in preparation but deliberately left its initial aggro order unchanged. In the user-provided 卫戍协议 recording, the right-side 联防 board at 19:13 has Touch and 哈洛德 inside the same flying 守墓石像's attack range when it locks its target, yet the attack selects 哈洛德. The 17:01 preparation frame shows 哈洛德 with no equipment, and his position makes him the right player's first ordinary deployment under the current column scan. The 19:36 clip supplies another targeting comparison. These observations support an effective priority earlier than ordinary operators for the prepared 外勤医疗 slot; they do not expose the official game's unit identity or exact deployment counters.

The battle sim creates the selected map-character variant at battleStart, after deploying the board. [ASSUMED] The prepared slot retains an earlier effective targeting order whether it stays 预备干员-医疗 or is replaced by Touch. Only aggroSeq gets a negative, pre-initial value; deploySeq remains the actual spawn's identity for deployment hooks and scheduled effects. [ASSUMED] If several players have prepared slots, their relative order follows the existing player order. A map character spawned ad hoc after battle start keeps normal summon order. The real flying 守墓石像 tests check both variants at target-lock time, a right-side 联防 Touch, and the higher-taunt exception.

The owner's further official preparation screenshot at 0:17 shows 预备干员-医疗 selected, with its detail card and attack range visible before combat. This proves an inspection affordance, but does not establish that the official game already simulates the medic as a combat entity. The client now lets the existing read-only preparation view open its operator-style card and board-space range by tap, including on the mirrored boss half and in the flat fallback renderer. It remains immovable and the battle creation point is unchanged. The same click path accepts another map-character variant if one is ever included in prepMapChars.

npm run golden:update recomputed all 287 scenarios. Only coop2-NORMAL-14-standins changed: its human seat uses band_amedic, and combat differences first appear in round 11. The match remains a round-14 victory with team LP 31; that seat's final kills move 272 → 273 and leaks 44 → 43. Its boss damage moves 193,091 → 189,876, while the partner's moves 586,909 → 590,124. All other golden scenarios retain their prior result.