317 lines
25 KiB
Markdown
317 lines
25 KiB
Markdown
# DESIGN §30 — 0.2.5-dev
|
||
|
||
Part of [DESIGN.md](../DESIGN.md). Community reports after 0.2.4.
|
||
|
||
## 30. Community follow-up
|
||
|
||
Unreleased. Sources and decisions below describe the candidate behavior, not a published release.
|
||
|
||
### 30.1 Fixed gifts and already displayed operator offers
|
||
|
||
Reports #488/#491/#495, PR #496 by @2321Robin, and the owner's Muelsyse/Yela report: the shared equipment
|
||
cap added in 0.2.4 incorrectly prevented fixed acquisition gifts. [路标档案馆:路标月报#2](https://www.bilibili.com/video/BV1eLXXBqEgF/)
|
||
states both that equipment from any source occupies stock and that these operators' fixed gifts are unlimited.
|
||
The owner confirmed on 2026-10-11: gifts still occupy stock, but exhaustion must never prevent the gift.
|
||
|
||
`GameData.isUnlimitedGiftItem` derives the families from `SERVER_GAIN_EQUIP`. The actual gift passes
|
||
`requirePool:false` through `effectsMeta` to `acquireItem`; only those families bypass availability. Ordinary and
|
||
advanced copies still count as 1/2. This covers Carnelian, Beeswax, Muelsyse, Kjera and Swire, and the same fixed
|
||
family awarded by the Damazti strategy. It does not make every strategy's equipment unlimited. Shop and item
|
||
reward purchases, random grants and 整备 upgrades keep their availability checks. When ownership exceeds the cap,
|
||
removing one copy need not immediately reopen stock. The proposed PR's zero-occupancy model was not adopted.
|
||
|
||
#498: the same video's approximately 2:50–2:57 example describes nine owned 溯光星源 plus one
|
||
already displayed card in each of four shops, allowing thirteen owned copies. Shop operator purchases therefore
|
||
do not recheck availability; `acquireChess` records the full deficit and later rolls still exclude exhausted stock.
|
||
The owner explicitly extended this behavior to already displayed **operator reward** offers; that extension is a
|
||
maintainer decision, not footage directly establishing every reward type. Item purchases/rewards remain bounded.
|
||
Funds, full-hand checks, per-offer sold flags, merge accounting and selling returns retain their ordinary rules.
|
||
|
||
Tests: `test/match/community-round30.test.js`, `shared-stock.test.js`, `garrisons_meta.test.js`.
|
||
Normative rules: META shared inventory and helper contract; design/match economy.
|
||
|
||
### 30.2 Measured acquisition subsets
|
||
|
||
PR #497 by @2321Robin, same original research video's rule table: Rockrock's subset weights are ordinary hammer
|
||
10; tremble/undying/haste/burn hammer 2 each; limited accelerator 1; shield drone 4; laser emitter 4. Flametail's
|
||
subset is Wild Mane 10, Ashlock 10, Fartooth 3. These are weighted subsets, still constrained by shared stock.
|
||
The generator owns these tables; `data/choices.json` is regenerated offline. Tests cover the table and exhausted
|
||
eligibility rather than asserting that subset draws ignore ownership.
|
||
|
||
### 30.3 Damage and target-selection corrections
|
||
|
||
- Clementia S3's erosion-burst listener now requires an enemy target. The generic targetability helper does not
|
||
check allegiance, so a friendly erosion burst previously scheduled a shot. Enemy bursts retain the same behavior;
|
||
the mode's existing boss erosion immunity is unchanged.
|
||
- Horn follows [PRTS 号角](https://prts.wiki/w/号角): blocked targets first, ordinary ranged targets next, then a
|
||
selectable ground target on her own tile. Her skills' automatic target check includes that tile. Other adjacent
|
||
blind tiles do not become valid targets. Ordinary/S1/S3 melee attacks are single-target; S2 explicitly retains
|
||
melee splash. Each shot captures its melee mode, so switching targets cannot remove splash from a shell in flight.
|
||
- The bounty [自制投石机](https://prts.wiki/w/自制投石机) has normal splash radius 1.5 and three hits. The old
|
||
radius 0.5 came from its 入戏 override, not its ordinary attack. Tests cover adjacent/diagonal allies and an outside
|
||
target. No claim is made here about unrelated attack cadence.
|
||
- PR #502 by @Xinglan233: Vulpisfoglia's first qualifying damage instance marks the enemy and also deals 追凶's arts
|
||
addition. Repeated damage does not extend the original window. Source: [PRTS 忍冬](https://prts.wiki/w/忍冬).
|
||
- #489: [PRTS 盟约记录](https://prts.wiki/w/卫戍协议:盟约_下半/PRTS盟约记录) corrects both Kjerag Ice and Tear Gas
|
||
from “攻击时” to “造成伤害时”. Only these handlers move to actual carrier damage, including DoT, skill and splash
|
||
instances; bare attack events, elemental gauge fill, HP loss, zero damage and friendly targets do not trigger them.
|
||
Existing probabilities/durations remain data-driven. Regression uses real Ascalon poison while she is disarmed.
|
||
|
||
Tests: `community-round30.test.js`, `item-damage-procs.test.js`, `vulpis-first-hit.test.js` under test/content,
|
||
plus existing item/operator/fortress suites. Normative rules: SIM and design/engine.
|
||
|
||
### 30.4 Client information and input
|
||
|
||
- PR #503 by @Xinglan233: a loadout containing only operator potential/cultivation changes is exportable.
|
||
- PR #505 by @Xinglan233: spectator `ownerOps` includes resolved DIY selection, so bond members have correct identity.
|
||
- #479 / PR #504 by @robll-v1, owner approved: before settlement, the HP tower shows the current HP and a separate
|
||
pending-loss marker; settlement updates the number. This supersedes the earlier live pre-deduction display choice.
|
||
- #501 / PR #507 by @robll-v1, owner approved: a refresh request in flight disables another button/R request until
|
||
it settles, including errors. This is a client interaction guard, not server-wide request idempotency.
|
||
- #484 / PR #494 by @YuriRestia, owner approved: bond tooltips list this match's banned visible members. Main text
|
||
and list share one viewport-clamped, scrollable container; narrow screens stack the sections. Dynamic member
|
||
changes update an open tooltip even if the displayed count stays equal. Long-press lists persist for reading and
|
||
close on outside tap or Escape; ordinary tooltips keep their short behavior.
|
||
- PR #490 by @D-Roote: Korean UI corrections; the obsolete 3D failure key from the proposal is excluded in favor of
|
||
the current recovery message. PR #499 by @YuriRestia: English Victoria text explicitly applies its bonus per item,
|
||
through a narrow correction layer in the translation generator, retaining all placeholders.
|
||
|
||
Tests: refresh unit/E2E, loadout export E2E, match-info, watch-bonds, round30-tools E2E and i18n checks.
|
||
Normative rules: PLAYING, I18N and design/client.
|
||
|
||
### 30.5 Developer simulation checker
|
||
|
||
PR #492 by @Cloudnyco, owner approved: `/dev/sim-check.html` replays generated BattleSpecs with the real browser
|
||
loader against Node traces. The corpus is the golden battle families, excluding full matches. The CLI generates
|
||
local ignored reference data and can run browser engines or compare an exported state block.
|
||
|
||
Review repairs: reject unknown/empty selections and unfinished runs; recover controls after start/step/result/dump
|
||
errors; preserve negative zero and other special floats across JSON; verify shared content identity for specs,
|
||
reference, runtime and data; reject stale inputs; escape reference text; allow long mobile result lists to scroll.
|
||
Reports state the first **detected interval**, not an exact first divergent frame. State dumps can diagnose only
|
||
their recorded fields; snapshot/deep-only differences may not expose a differing field. The bounded unit-state
|
||
traversal and sampled snapshots do not prove equality of all memory, events or rendered frames. See SIM §11.
|
||
|
||
### 30.6 Rechecked reports without a gameplay change
|
||
|
||
Real browser loading verifies seven different Yan operators plus ordinary/elite Muelsyse carrying the converter
|
||
and Yan item: count 9, tier 3 and two actual 炎佑. All 36 normal/advanced conversion-item pairings retain battle
|
||
membership. The preparation/combat conversion feedback was not reproduced in these cases; this does not exclude
|
||
an unreported configuration. Normal/hidden Helm missile tests confirm the existing shell and its 3×3 stun.
|
||
|
||
Lost Colossus and Zaaro exist in the source catalog, but the fixed bounty draw groups remain based on the earlier
|
||
22-match evidence. The owner chose to retain those groups until direct grouping evidence is found; catalog
|
||
presence alone is insufficient to assign a group or probability. No AI formation change from #452, WebRTC #487
|
||
or built-in HTTPS #478 is included.
|
||
|
||
### 30.7 One visual clip per operator attack
|
||
|
||
#506: a single attack formerly kept an operator's animation looping for 1.4 attack intervals, allowing a second
|
||
visual swing without another simulated attack. The owner approved playing one clip per real attack, retaining
|
||
operator rhythm scaling, enemy speed rules, skill selection and damage timing. A queued wind-up can restart during
|
||
the preceding attack's recovery; its actual attack consumes that preparation rather than replaying the clip.
|
||
After recovery the actor returns to its base/skill-idle clip. With no look-ahead, operators still start at the strike
|
||
frame: completing a late wind-up would delay the visual hit, so that separate policy is deliberately unchanged.
|
||
Tests cover single/continuous fast attacks, real Provence metadata, skill idle and attack interpolation.
|
||
|
||
### 30.8 Xi invincibility and session recovery
|
||
|
||
#510: [PRTS “自在”](https://prts.wiki/w/“自在”) specifies ten seconds of invincibility after its five-second rebirth;
|
||
the linked status also excludes hostile selection. Xi opts into `reborn.invincibleUntargetable` for that same
|
||
window. The general `invulnerable` flag and other enemies' rebirth policies are unchanged. Attacks and
|
||
target-requiring automatic skills wait; presence-only `SKILL_RANGE` and SP-only skills retain their existing
|
||
trigger rules. In-flight damage and elemental fill still deal zero during invincibility. Tests cover all four
|
||
trigger types, projectile arrival and resumed attacks after expiry.
|
||
|
||
PR #511 by @RainoutOvO: the connection recovery banner now sits above the AI-away overlay, so “continue here”
|
||
remains clickable after another page replaces the session. It remains below global modals. Tests use actual
|
||
pointer hit-testing and clicks, including a global confirmation dialog over the recovery button.
|
||
|
||
### 30.9 Golden changes
|
||
|
||
Before the follow-up changes below (§30.11 onward), all 287 scenarios were regenerated, with no additions or deletions;
|
||
45 differed from 0.2.4. This table records that initial candidate. Follow-up changes are recorded separately below.
|
||
Each cause below was checked by an isolated counterfactual rerun: reverting the named change or combination
|
||
restores the old digest exactly. Shared RNG and later economy/target choices can amplify a local correction.
|
||
The two co-op paths involving Rockrock can mask a damage-item effect when each is reverted alone; their combined
|
||
rollback, not mere operator presence, establishes the attribution.
|
||
|
||
| Cause / combination | Changed scenarios |
|
||
|---|---|
|
||
| catapult normal splash radius | `roster-013`, `standin-06` |
|
||
| catapult normal splash radius; Kjerag Ice / Tear Gas damage triggers and resulting RNG order | `roster-040` |
|
||
| Kjerag Ice / Tear Gas damage triggers and resulting RNG order | `bond-maniShip-high`, `boss-boss_2-pair`, `boss-boss_3-pair`, `boss-boss_5-pair`, `coop2-ABYSS-10-boosted`, `coop2-NORMAL-70-diy`, `hidden-boss_8-pair`, `hidden-boss_9-solo`, `roster-005`, `roster-012`, `roster-019`, `roster-033`, `roster-047`, `solo-ABYSS-1`, `solo-FUNNY-1`, `solo-FUNNY-2`, `solo-HARD-1`, `solo-NORMAL-1`, `solo-NORMAL-2`, `standin-07` |
|
||
| Kjerag Ice / Tear Gas damage triggers and resulting RNG order; Fortress own-tile targeting / melee splash | `coop2-HARD-4` |
|
||
| Kjerag Ice / Tear Gas damage triggers and resulting RNG order; Fortress own-tile targeting / melee splash; Rockrock acquisition-subset weights; Vulpisfoglia first-hit addition | `coop3-ABYSS-5`, `coop4-ABYSS-7` |
|
||
| Kjerag Ice / Tear Gas damage triggers and resulting RNG order; Rockrock acquisition-subset weights | `coop2-NORMAL-8-serverrun`, `coop4-FUNNY-6` |
|
||
| Kjerag Ice / Tear Gas damage triggers and resulting RNG order; Rockrock acquisition-subset weights; Vulpisfoglia first-hit addition | `coop2-NORMAL-1-coverage-standins`, `coop2-NORMAL-3` |
|
||
| Kjerag Ice / Tear Gas damage triggers and resulting RNG order; Vulpisfoglia first-hit addition | `coop2-NORMAL-5-coverage-diy`, `roster-026` |
|
||
| Fortress own-tile targeting / melee splash (including Horn and Ashlock) | `boss-boss_5-solo`, `roster-004`, `roster-023`, `roster-032`, `roster-034`, `roster-043`, `solo-HARD-9-boosted` |
|
||
| Vulpisfoglia first-hit addition | `bond-soloShip-low`, `bond-yanShip-low`, `roster-007`, `roster-009`, `roster-039` |
|
||
| Xi post-rebirth hostile selection immunity | `roster-011` |
|
||
|
||
The fixed-gift, displayed-offer overdraw, Flametail-subset and Clementia changes do not move these corpus
|
||
digests individually; their dedicated regressions cover the reported cases. UI, translation and developer-tool
|
||
changes do not alter simulation rules. The 140 DIY-only corpus cases retain their previous digests.
|
||
|
||
### 30.10 Bond-layer audio
|
||
|
||
#482: the client only sounded an increase in active bond count, missing actual layer gains in prep and battle.
|
||
The official audio table maps `ON_ACT1AUTOCHESS_ADD_BOND` to `act1autochess_b_ui_buffup`, with
|
||
`maxSoundAllowed=1` and `popOldest=true`. The supplied [match recording](https://www.bilibili.com/video/BV1VxwNzZEqK/)
|
||
also contains the cue around Matterhorn acquisition and battle layer gains. The maintainer approved that bank's
|
||
single-channel replacement policy with no extra cooldown; the recording alone does not settle every timing edge.
|
||
|
||
Own live prep gains now send an ephemeral `m.layer`; the displayed battle's existing `layer` tuples use the same
|
||
audio channel. One multi-layer gain is one cue, inactive bonds included; capped/zero gains are silent. New cues stop
|
||
the previous source and invalidate its pending decode. Field entry, exit and mute cancel pending/playing cues.
|
||
Snapshots, resync and settlement bookkeeping do not synthesize gains. Existing activation audio shares the channel.
|
||
The change does not affect layer amounts, simulation events or RNG. Tests cover server unicast/phase/cap behavior,
|
||
asynchronous replacement and cancellation, muted/missing audio and late field entry.
|
||
|
||
### 30.11 Automatic skill-area follow-up
|
||
|
||
Reports described Kroos the Keen Glint and Degenbrecher waiting for enemies to reach a smaller range. With full SP,
|
||
normal/elite forms and all four facings, Kroos S1/S2 cast at the outer normal range and Degenbrecher S2/S3 cast in
|
||
their own skill range outside normal attack range. The supplied still image does not establish SP, cooldown or
|
||
the running client version, so those reports are not marked fixed. The documented operation cooldown and Kroos's
|
||
normal-attack timing still apply.
|
||
|
||
The broader real-record audit covered 1,850 manual-skill configurations and 2,232 directional trigger cases.
|
||
It found three independent omissions under the previously approved expanded auto-cast policy:
|
||
|
||
- 司霆惊蛰 S2 has a terrain-derived range with no static rangeId. Its extra trigger now uses the same low-tile
|
||
flood and permanent range extension as the running skill, only when it strictly contains the initial range.
|
||
High ground, field bounds, normal attacks and its SEARCH rule remain unchanged.
|
||
- 斩业星熊 S3 can attack flyers while active, but its trigger inherited the inactive ground-only profile. Its
|
||
actual expanded area now accepts selectable flyers, like the existing 陈 S3 exception.
|
||
- 予愿安洁莉娜 S3's opening area is 3-9 plus the surrounding x-4. Its ACTIVE_RANGE trigger now includes that same
|
||
union, without extending it to a future flight destination or changing its anchored post-move attack area.
|
||
|
||
These changes preserve SP, control and operation cooldown gates and do not admit stealth/sleep/untargetable enemies
|
||
to an ACTIVE_RANGE condition. Tests cover all DIY forms, facings, ground/air targets, permanent extension and gates.
|
||
|
||
### 30.12 Random boss partners, retained for Hidden Core
|
||
|
||
The maintainer requested random pairing each match and explicitly chose to retain partners for the hidden boss.
|
||
A separate seeded shuffle assigns pairs and left/right sides before Final Assault preparation. The same plan
|
||
drives prep previews, legal deployment maps and the actual battle. Hidden Core retains it; a departure keeps intact
|
||
pairs and pairs up the remaining single players. A new Match starts a fresh draw; a repeated seed remains reproducible.
|
||
|
||
`m.public.bossPairs` supplies the actual plan to the client camera, placement and green partner frames; seat-order
|
||
inference survives only as compatibility with older servers missing this field. The audit checks coverage, saved
|
||
pair stability and actual fields instead of recomputing seat pairs. Lowest-seat connected-human authority and
|
||
other-pair watch restrictions are unchanged. Regression includes 2/3/4 players, departures, hidden continuation,
|
||
mirror coordinates, reconnects and real-browser prep-to-battle views.
|
||
|
||
### 30.13 联防 HP/SP restoration and Egir opening devour
|
||
|
||
The report was reproduced through normal BattleResult → `uniteBattleOpts` → a new battle: an Egir survivor's
|
||
carried HP was charged for opening devour again. Some survivors died and revived at full HP, consuming a revival
|
||
slot and resetting SP; others lost HP twice. Two 1% clamps also raised legal low HP, and a 1-HP floor changed the
|
||
ratio when the new maximum was smaller.
|
||
|
||
The maintainer approved reconstructing Egir marks/base-ATK/block attributes without repeating opening devour HP
|
||
loss on a carried survivor. Deployment and battle-start effects establish the new stats, then the living operator's
|
||
exact positive HP ratio and total SP are restored. Forced-down carry still contributes to the attribute chain and
|
||
stays down without spending a revival slot. Summons carry SP only; previous active skills are not resumed. Normal,
|
||
boss and fresh no-carry units keep their usual devour damage, and later knock-outs/redeploys work normally.
|
||
|
||
[PRTS 帮助](https://prts.wiki/w/卫戍协议/帮助) specifies restoring HP ratio and SP after deployment. The detailed
|
||
suppression of repeated opening death/revive effects is the approved implementation of that contract, not a claim
|
||
that the wiki documents each internal callback. Tests include real carry construction, prior full-health food that
|
||
would otherwise die anew, remaining revival slots, values below 1%/1 HP, and ordinary/boss behavior.
|
||
|
||
### 30.14 Touch's team medic after its holder is eliminated
|
||
|
||
On 2026-10-12 the maintainer explicitly approved retaining the implementation, including both elimination and
|
||
voluntary departure after a confirmed selection. This resolves the local policy choice, not the official-evidence gap.
|
||
|
||
The observed loss happens in newly constructed fields and the next preparation, not by removing an already spawned
|
||
medic from a teammate's ongoing battle. Both prep and battle eligibility formerly searched only living holders.
|
||
|
||
[ASSUMED] A confirmed Touch selection grants the team medic for this match even after that player is eliminated
|
||
or leaves. Official data marks the effect initial and unlimited in rounds and describes a medic on every player's
|
||
field, but does not explicitly document the holder's elimination. This local candidate adopts the persistent grant
|
||
under the maintainer's request to make evidence-based local choices pending review. A draft focus is insufficient;
|
||
a confirmed choice followed by departure counts. New matches have no inherited grant. Recipients must be alive.
|
||
|
||
Only Touch is retained in `contentInfo.matchBands`; ordinary teammate contexts and other eliminated strategies
|
||
stay excluded. Prep still displays the reserve medic, with the battle replacing it by Touch at the existing elite
|
||
threshold. Tests cover LP elimination, departure, both medic variants, draft confirmation, fresh matches and the
|
||
normal/unite/boss/hidden BattleSpec paths.
|
||
|
||
### 30.15 Other reports rechecked without changing their rules
|
||
|
||
- 联防 order: [PRTS 帮助](https://prts.wiki/w/卫戍协议/帮助) includes downed operators in deployed headcount. The
|
||
implementation reads deployed count, not deployment capacity. Nine deployed with casualties may rank ahead of
|
||
eight survivors; the active-bond and layer tie-breaks retain their existing documented uncertainty.
|
||
- 乌尔比安 S3: [PRTS 乌尔比安](https://prts.wiki/w/乌尔比安) gives the next tile beyond an occupied anchor landing
|
||
as a fallback before his own tile. The pictured report alone does not contradict this; his existing own-board,
|
||
occupied/downed reservation and return rules remain unchanged.
|
||
- 叙拉古: fixed-layer cases last exactly `32 + 0.4L` game seconds, which is half as many real seconds at 2×. The
|
||
formula tooltip reads current layers while an already deployed buff retains its initial duration/ASPD; a new
|
||
deployment reads the new layers. No direct source settled whether official in-battle gains should extend the old
|
||
buff, so that separate uncertainty is retained; durations are not doubled globally.
|
||
- 塑心: hidden-layer bonds can still receive layers under the documented PRTS rule (§25.21.6). The old exclusion
|
||
was specific to 余's strategy (§27.21), not a global ban. Selecting the highest hidden layer count is retained.
|
||
- Push/pull: 176 force/mass cases and real Degenbrecher boss cases did not reproduce a weight bypass. Mode leaders
|
||
retain their existing displacement guard; an ordinary `rank=BOSS` enemy is not automatically the same as a
|
||
protected mode leader. Weight, static-body and immunity checks remain. 余 S2 can teleport 铳 in one step under its
|
||
separate teleport rules; this is a possible source of the reported movement, not an identification of the screenshot.
|
||
Boss trigger-edge tests distinguish a large rendered model from its actual hit area; the still image alone does
|
||
not establish a missed auto-cast.
|
||
|
||
### 30.16 Follow-up golden changes
|
||
|
||
All 287 scenarios were recomputed after §30.11–30.14. Only five match digests change from the preceding candidate:
|
||
`coop2-NORMAL-3`, `coop4-FUNNY-6`, `coop2-ABYSS-10-boosted`, `coop2-NORMAL-70-diy`, and
|
||
`coop2-NORMAL-5-coverage-diy`. In each, restoring only the old ordered boss pairing in an isolated process reproduces
|
||
the preceding digest exactly; the changed partner/side also changes preparation choices and later combat totals.
|
||
All five already differed from 0.2.4, so the final release-relative total remains 45 scenarios (§30.9 plus these
|
||
additional pairing effects). There are no new corpus cases or removals. The other follow-up fixes do not move this
|
||
corpus; their dedicated regressions cover the reported and newly found cases.
|
||
|
||
### 30.17 Loadout sync preparation
|
||
|
||
PR #540 by @Xinglan233. Restoring defaults while a loadout sync was still waiting on backups.json could put the
|
||
previous skill back on the server. `prepare()` assigned its request number only after the await, so the older
|
||
payload was treated as the newer one. A stale missing-data result or a failed download could also replace a sync
|
||
the reset had already finished.
|
||
|
||
`installPrefSync` now keeps a preparation revision. An edit of a watched field, including restoring defaults, and
|
||
`welcome` increment it before the new flush is scheduled. A preparation that started at an older revision does not
|
||
send and does not change sync status when it finishes, whether it built a payload, found the data missing, or
|
||
failed. Debounce, the close flush, request ordering and the RATE / lock retry stay as they are. The same engine
|
||
covers 干员持有 and 自选编队. Golden unchanged. Tests: `test/ui/loadout-sync-stale.test.js`.
|
||
|
||
### 30.18 Loadout import with ops while backups are missing
|
||
|
||
PR #538 by @Xinglan233. Importing a loadout file that includes `ops` checked only that chess.json was loaded.
|
||
`cultivationCharIds` then dropped 自选 operators, which only backups.json names, and the import still saved. That
|
||
cleared a 练度 the file was not meant to erase. `ops: {}` is the same replacement.
|
||
|
||
After a successful parse, `loadoutOpsImportRefusal` refuses the whole import with the 自选编队 data check
|
||
(`importRefusal('diy')`) before any write. A file with no `ops` still imports skills and modules once chess.json is
|
||
ready and leaves the current 练度 in place. Golden unchanged. Tests: `test/ui/loadout-ops-import.test.js` (node, no
|
||
browser).
|
||
|
||
### 30.19 Player package scripts and doc links
|
||
|
||
GitHub #531 and #530. The player zip copied the repository `package.json`. `npm test` is `node --test`, and `test/`
|
||
is not in the zip, so it reported 0 tests and exited 0. Nine other scripts name files or tools the zip does not
|
||
contain (`golden`, `golden:update`, `build-data`, `check:imports`, `ci`, `package`, `package:lite`, `lint`,
|
||
`typecheck`). README, CHANGELOG, NOTICE, THIRD-PARTY-NOTICES, PLAYING and DEPLOY also keep relative links to
|
||
developer docs, pictures and `../../releases/latest`. Twenty-three of those, in README, PLAYING and DEPLOY, point
|
||
at developer files.
|
||
|
||
The stage rewrites `package.json` only. A script stays when every `node <file>` it names is in the zip and it names
|
||
at least one (`start`, `dev`, `setup`, `doctor`, `launch`, `postinstall`, `vendor`, `assets`). The others are
|
||
removed, so `npm test` is a missing script and exits non-zero. The repository `package.json` is unchanged. The same
|
||
stage rewrites those six Markdown files: a relative link whose target ships stays relative; a picture becomes
|
||
`https://github.com/sganggs/Stronghold-Protocol/raw/v<tag>/<path>`; another file becomes `.../blob/v<tag>/<path>`;
|
||
`../../releases/latest` becomes `.../releases/latest`. The tag is `v` plus the package version with a trailing
|
||
`-dev` removed. [ASSUMED] an unreleased `0.2.5-dev` build points those links at `v0.2.5`, the tag that version will
|
||
use. Source copies in the git checkout stay relative. Golden unchanged. Tests: `test/package-player.test.js`,
|
||
`test/package.test.js`, `test/docs-paths.test.js`.
|