Commit Graph
61 Commits
Author SHA1 Message Date
sganggs d8aab0a2db 0.2.6: README / DEPLOY give the full bundle's built size (556 MB, about 790 MB extracted; the disk lines' stale 710 MB too) 2026-10-13 16:22:29 +08:00
sganggs 566f3a7cd6 0.2.6: version 0.2.6 — package.json / package-lock.json / APP_VERSION (DEV_BUILD turns false), README release form and current-version line, CHANGELOG 0.2.6 — 2026-10-13, DESIGN versions line and index, §31 header 2026-10-13 16:17:03 +08:00
sganggs 35f4895219 0.2.6-dev: merge the 0.2.5 release's last commit (README / DEPLOY package size) 2026-10-12 18:37:25 +08:00
sganggs cf7a940027 0.2.5: README / DEPLOY give the full bundle's built size (552 MB, about 780 MB extracted) 2026-10-12 18:36:56 +08:00
sganggs 3d5d6b380d 0.2.6-dev: merge claude/bw-l01 — host bandwidth layers 0 and 1 (no BGM download while the music is silent, WebSocket permessage-deflate, lossless WebP 玩法说明 pages, traffic counters, content-hashed asset URLs with immutable caching, brotli q5) on top of the 0.2.5 release; its note becomes DESIGN §31 in docs/history/0.2.6.md, CHANGELOG 0.2.6-dev, version 0.2.6-dev; golden: unchanged 2026-10-12 18:28:50 +08:00
sganggs 88d4b2544b 0.2.5: version 0.2.5 — package.json / package-lock.json / APP_VERSION (DEV_BUILD turns false), README release form and package sizes (the full bundle now carries the battlefield scenes), CHANGELOG 0.2.5 — 2026-10-12 in the usual sections with credits, DESIGN versions line, §30 header 2026-10-12 18:20:53 +08:00
sganggs 893d17e725 0.2.6-dev: /data/assets.json and /data/local-assets.json are served with content-hashed URLs (/assets/~<hash>/…, one hash per Spine model, the committed files unchanged); the ~hash routes of /assets/ /fonts/ /media/ answer immutable when the hash names the file and the current file with no-cache otherwise; content ETags — host bandwidth layer 1.2; golden: unchanged 2026-10-12 16:24:03 +08:00
sganggs 221e6b8dd2 0.2.5-dev: community round 30 and follow-ups
- Stock: fixed trait gifts (缪尔赛思 / 变形者集群 变形同构体, 耶拉 不融冰, 蜜蜡 / 卡涅利安 迅捷作战粮, 诗怀雅 盟约之币) still occupy stock but are granted past the cap; an operator card already shown in the shop or a reward can be taken after the pool runs out and overdraws (GitHub #498, the owner's decision); item buys and item rewards keep the stock check. 洛洛 / 焰尾 sub-pools use the measured weights (PR #497 by @2321Robin; the occupancy idea of PR #496 by @2321Robin re-implemented differently).
- Boss pairs are drawn at random once per match and fixed to battle start; the Hidden Core reuses them; a leaver does not split a full pair (the owner's decision).
- 阿戈尔 in 联防 no longer re-applies the opening devour HP loss or a false revive; Touch's team medic stays for the match after its holder leaves (owner-approved, official lifetime unverified).
- Auto-skill ranges: 司霆惊蛰 S2, 斩业星熊 S3 against air, 予愿安洁莉娜 S3; 自在's post-rebirth invulnerability is also untargetable (#510); Horn / Clementia / catapult / 忍冬 first hit (PR #502 by @Xinglan233); 不融冰 / tear gas trigger on real damage.
- Bond layer-up sound in round start / draft / prep / battle (#482): one channel, a new cue replaces the old, no extra cooldown; a prep update that adds layers and activates a bond plays one cue.
- Client: multi-swing fix (#506), refresh single-flight (PR #507 by @robll-v1), LP tower keeps the settled value with a −N tick (PR #504 by @robll-v1), export with only 潜能 / 练度 changes (PR #503 by @Xinglan233), spectator rosters list DIY members (PR #505 by @Xinglan233), banned members beside bond tooltips (PR #494 by @YuriRestia), recovery action above the away overlay (PR #511 by @RainoutOvO), the /dev/sim-check.html consistency page (PR #492 by @Cloudnyco), Korean (PR #490 by @D-Roote) and English Victoria wording (PR #499 by @YuriRestia).
- golden: 45 of 287 scenarios move against 0.2.4 (roster 17, bonds 3, fields 6, matches 17, standins 2), each attributed in docs/history/0.2.5.md §30.9 / §30.16.
2026-10-12 14:07:08 +08:00
sganggs bc50cac01f 0.2.4: version 0.2.4 — package.json / package-lock.json / APP_VERSION (DEV_BUILD turns false), README release form, CHANGELOG 0.2.4 — 2026-10-11 in the usual sections with credits, DESIGN versions line 2026-10-11 02:04:21 +08:00
sganggs 6bfc08270c 0.2.4-dev: round-29 community fixes and the official shared card pool
- Shared card pool and item stock as in the official mode (the owner's request, from the 路标档案馆 video and public notes): solo low-tier exceptions, co-op operators x2, shared item stock with special-item exceptions, normal / advanced occupancy 1 / 2, re-check on buy, 机变 exhaustion, release on consume / destroy / elimination; 整备 never exceeds stock; invariant held <= cap.
- 突袭: one taunt-first reselect right after a revive (the owner's rule); ordinary polls and redeploys keep the 0.2.3 rule; a revive on an enemy's tile stays. #475: online boss / hidden-boss Raid may land on the empty half (owner-limited scope).
- 浊心斯卡蒂 S1 x 坚守 no longer bounce redirected damage, and the two shares conserve the hit (idea of PR #464 by @HappyTanuki).
- Operator fixes adapted from PRs by @Xinglan233 (#459 哈洛德 S2 elemental trigger, #460 涤火杰西卡 shield on the four adjacent tiles, #461 家族徽章 first hit after stealth, #462 松果 S2 regrow per deploy); 克莱门莎 S2 splash 1.1 / 100% ATK and air auto-trigger (#467); 白面 copying 歌蕾蒂娅 / 余 skips the three-member condition (#473, the owner's video).
- 香槟炸弹 is not chosen by friendly auras / heals (PR #468 / #476 by @Siornya); 琳琅诗怀雅 coin balance (PR #450 by @IceCodeNew); Touch prep display (PR #451 by @YinqiMargatroid); lobby header (PR #471 by @YuriRestia); Japanese UI terms (PR #448 by @scutkane).
- AI-only boss countdown grace, render-failure cache / recovery without restarting a battle, device units kept on a same-field re-entry, DIY detail / skill previews, large-text result buttons.
- golden: battle families equal 0.2.3 except diy-135 / diy-136 (克莱门莎); all 18 release matches move through the shared pool, every flip named in docs/history/0.2.4.md §29.12; two coverage scenarios added.
2026-10-11 01:58:52 +08:00
sganggs 1db8e51023 0.2.3: README current-version line 2026-10-10 03:19:50 +08:00
sganggs c4dc96fff4 0.2.3: version 0.2.3 — package.json / package-lock.json / APP_VERSION (DEV_BUILD turns false), README release form, CHANGELOG 0.2.3 — 2026-10-10 in the usual sections, DESIGN versions line 2026-10-10 03:19:38 +08:00
sganggs f3658a0dd4 0.2.3: prepare follow-up fixes and client features (#407, #408, #410, #413, #431, #435, #436, #440, #444)
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.
2026-10-09 22:55:24 +08:00
sganggs 0b0ce4fbd7 Update expanded roster checks and register Clementia impact visuals 2026-10-09 17:46:07 +08:00
sganggs 35637ff03e Document the 0.2.3 development build and community changes 2026-10-09 17:38:13 +08:00
sganggs 62eb113419 feedback7: version 0.2.2 — package.json / package-lock.json / APP_VERSION (DEV_BUILD turns false), README release form, CHANGELOG 0.2.2 — 2026-10-09, DESIGN versions line 2026-10-09 03:09:33 +08:00
sganggs 9405aae60c feedback7 R23-DRAGSNAP: a dragged operator stands on the tile under the pointer while that is a legal target (a board tile or a bench slot: render/drag.js dragStandTile), as in the official deploy drag (the owner's recording of 2026-10-09), and is held under the pointer elsewhere (an illegal tile, the shop bar); the pick, highlight, tileHover, wheel and drop stay the pointer's tile — the report in PR #403 by @bubububaoshe (not merged); §27.62; golden: unchanged 2026-10-09 01:38:57 +08:00
sganggs e183f2fabd feedback7: merge fb7-stats — the local statistics page (PR #323 by @2321Robin, reworked): a match counts when it reached its result or the player cleared at least one round before quitting; earlier quits stay in the history marked 中途退出 / 不计入统计 (the owner's rule of 2026-10-08)
- Conflict: docs/PLAYING.md — #321's §12 反馈问题 and the stats §12 both added; the stats section is §13 (README anchor
  updated).
- Golden unchanged; broad node --test 5382 (5381 pass, 0 fail, 1 skipped); lint 0 errors.
2026-10-08 20:45:05 +08:00
sganggs 51e0e60b6e feedback7 stats: a match left right away stays in the history but does not count; bounded storage, corrupt-data handling, the page reworked as 干员调配-style tabs, the settlement re-view without the app store (PR #323 by @2321Robin, owner's decision of 2026-10-08); golden: unchanged
Counting rule (ui/stats.js countsTowardStats, the owner's decision of 2026-10-08: do not count the matches entered and left
right away, but keep them in the history): a settled match (m.result arrived) always counts; a match given up (放弃模拟)
counts once at least one of the player's battles had finished — a round cleared (the server's own rule, platform.js
_quit: leaving while round k runs has passed k - 1, in its settlement k) or already eliminated. Anything earlier is
history only: marked 中途退出 and 不计入统计, dimmed, listed in 对局记录, left out of every aggregate (games, wins, win
rate, strategy table, titles, rounds, time, combat totals); 总览 says how many were left out.
- A leaver gets no m.result, so the page records the match itself: quitMatch (放弃模拟) → recordQuit builds an
  `end: 'quit'` record from the app state and a tracker (observeMatch, installed in main.js) that remembers when the page
  first saw the match and the last round the player was seen alive in. No record for a spectator seat, a match with its
  settlement already there, a match the page never saw; matches the server ended and closed tabs are not recorded.

Defects of PR #323 as submitted, reproduced (scratchpad/w7-stats-notes/repro-pr-bugs.mjs, loads-check*.mjs) and fixed:
- the title screen loaded all 16 game data files (5.3 MB) at boot: <StatsHost/> called useGameData() at mount; now the
  host renders nothing until opened, the overview reads config / bands / assets and the settlement re-view loads the rest
  when opened (the title screen loads the same 3 files as before);
- importing a file put the list oldest first (the page shows the first 20 as the newest and the cap would drop the
  newest); the list is newest first everywhere, also when loaded from storage;
- recordResult wrote over the envelope of a NEWER build (a downgrade, against the PR's own rule); it refuses now, as
  saveStats does;
- 1000 four-player records are ~7.2 M characters (the PR's ~1.5 kB/record is a solo match) against a ~2.5 M-character
  quota: MAX_RECORDS 1000 stays, plus a 800 000-character budget (the oldest go first), and only the newest 30 records
  keep their rows (lineup, bonds, teammates' names; the replay needs them) — older ones are compacted to the player's own
  summary row (~620 characters), a refused write retries with half the history; unknown fields and oversized values are
  dropped (a strict schema), import files are bounded (8 MB);
- the re-view clobbered the app store (match.public / match.result, the route, the music); ResultScreen is split into
  ResultScreen (the store) and ResultView (props: result, myId, back label), so the stats page renders a stored match
  itself; a 自选 pick and a 补位 stand-in were dropped from the stored lineup (the replayed card drew the plain
  operator); DIFFICULTY_NAMES were not translated; a band cell was a display:flex <td>; the overlay stayed open when a
  co-op match started; the 清空 two-step blink was replaced by the shared confirm dialog.
- Corrupt storage: unreadable data is moved to sp.pref.stats.damaged and the page says so; damaged rows are dropped and
  counted; duplicates, an oversized or unsorted list are repaired on load; a pre-`end` (PR-era) envelope reads as settled.

UI: a full-screen overlay in the grammar of 干员调配 (top bar with 返回 / four tabs 总览 · 策略 · 战斗累计 · 对局记录 /
导出 导入 清空, a note line saying the data stays in this browser and that teammates' names are stored too), text sizes
with max(.xxrem, N px) for phones in landscape, a 50-row history page with 显示更多, a pass-rate bar, a per-difficulty
table in order; the entries use a new `chart` icon (not the ping bars), the title screen's sits beside the language menu
(the connection row has no room: it squeezed the gear and wrapped the status text), the lobby / room buttons show the
icon alone below 700 px (the room's title ran under the label at 640 px). docs/PLAYING.md §12, README row; 41 + 25 UI
strings in en / ja / ko / zh-TW (the PR's four unused ones removed).

Tests: test/ui/stats.test.js 44 / 44 (counting rule per phase, quit records, bounds, corrupt / old / newer storage,
import order, aggregation, the replay payload); test/ui/stats.e2e.test.js (opt-in SP_E2E=1, real server, headless Chrome:
seeded history on 1920×1080 and 844×390, the re-view, export / import / clear, corrupt and newer storage, and the real
flows: a solo match given up in the briefing is history only, one given up after round 1 counts, a settled match is
recorded once and not again after a reload) 6 / 6; lint 0 errors, i18n extract 0 / check --all --strict clean,
check:imports, typecheck, docs and version tests, golden unchanged.
2026-10-08 20:36:41 +08:00
sganggs fbcbfdffbc feedback7: merge fb7-voices — the 选中干员 line on every tap (prep / shop / hand, official FOCUS_CHAR: priority 10, cooldown 0, no gap restart), the Japanese voice tree (audio.voiceJp, 2674 files, setting 语音语言 中文 / 日本語, CN fallback), the full zip ships both
- Conflict: public/js/ui/settings.js imports (store from #321 + VOICE_LANGS) — both kept. test/ui/playtest6-elite.test.js's
  source pin of the onDetail line allows the new tap counter (bcee737f).
- Grok review: MERGE AFTER FIXES — the three findings fixed on the branch (bcee737f). Golden unchanged; broad node --test
  5334 (the one failure was that source pin, fixed), i18n strict clean, lint 0 errors, typecheck.
2026-10-08 20:35:26 +08:00
sganggs ddf8c39ed0 feedback7 R22-VOICES: the Japanese voice dub as a second tree beside the Chinese one — audio.voiceJp (the same slots and file names from ArknightsAssets2 voice/: 2674 files, 89.4 MB, for the 191 voiced operators), 设置 → 语音语言 中文 / 日本語 (default 中文, not tied to the interface language), a JP line the manifest or the host lacks plays the Chinese one; the full zip ships both dubs (one switch, tools/package.mjs FULL_ZIP_JP_VOICE), the lite zip stays art-free (the owner's request of 2026-10-08 「全套的日配语音」); golden: unchanged
- tools/assets/plan.mjs: one voiceTree() per dub — audio.voice (--voice-lang, cn by default) and audio.voiceJp
  (VOICE_JP_LANG, always the JP dub, audio/voice/jp/<charId>/cn_nnn.mp3); fetch-assets plans and downloads both
  (stats.voiceJpChars), so setup (checkAssets walks every listed URL) fetches both too.
- data/assets.json regenerated with the project's tool (node tools/fetch-assets.mjs --add-only, raw.githubusercontent.com,
  107 s): the only change is audio.voiceJp + stats (+2674 files, +89,388,041 bytes, voiceJpChars 191) + hash — the rest
  is byte-identical; the JP tree is the Chinese one with the folder swapped (191 × 14 files, every file a valid MP3).
  The audio files are not committed (public/assets/ is git-ignored).
- public/js/audio.js voiceLine(): 'jp' draws from voiceJp and falls back to the Chinese line per slot (a JP entry the
  manifest lacks) and per line at play time (the Chinese file of the same name when the host lacks the JP one —
  same token, same gate); operators without voice (stand-ins, 盟约·辅助干员, summons) stay silent. setVoiceLang().
- settings: voiceLang 'cn' | 'jp' (VOICE_LANGS, sanitizeSettings), the 语音语言 row under 干员语音 (each dub named in
  its own language, like the language switch), 语音语言 in the en / ja / ko / zh-TW packs.
- tools/package.mjs FULL_ZIP_JP_VOICE (true): false holds the JP files out of the full zip (and its update zip) —
  not missing, not orphans, never in an update's `removed`; setup then downloads them.
- Sizes measured: art download 548 MiB (was 463), full zip ≈ 505 MB (0.2.1: 428 MiB + 76 MiB of zipped JP voice),
  unzipped 711 MB (package --dry-run); lite zip unchanged. README, DEPLOY, ASSETS, setup's fallback size updated;
  PLAYING voice paragraph; §21.30 "Changed in 0.2.2" note.
Tests: test/feedback7-voices.test.js (new: plan, manifest, settings, package switch), test/ui/audio.test.js (voiceLine,
the manager's dub choice and fallback), test/ui/gameLogic.test.js, test/docs-consistency.test.js — all fail on the parent.
2026-10-08 19:09:52 +08:00
LimitlessHPPK 51c53de189 feedback7 G-TOOLS: listen on :: by default so one socket serves IPv6 and IPv4 (PR #291 by @LimitlessHPPK)
Ported only the dual-stack listen from PR #291 (the change accepted as #188). With HOST unset the server binds :: and, if that fails with EAFNOSUPPORT, EADDRNOTAVAIL or EINVAL, retries 0.0.0.0. An explicit HOST, including 0.0.0.0 and 127.0.0.1, is tried once. The boot banner and doctor list shareable IPv6 addresses in brackets, skip fe80::, and keep one URL per /64. An explicit IPv6 literal in the local URL is bracketed. The Windows service listing no longer drops those bracketed lines.

Not ported: /dev/grant, the settings-default migration, and the firewall scripts. The Docker image stays on 0.0.0.0; the alpine fallback was not booted.

Tests: node --test test/ipv6-bind.test.js test/doctor.test.js test/ci.test.js — 20 pass, 0 fail (8 bind, 4 doctor, 8 ci).
2026-10-08 18:53:24 +08:00
Cloudnyco e8ba091298 feedback7 G-TOOLS: add the battle performance bench under public/dev (PR #198 by @Cloudnyco)
Applied as-is. Captured real battles live in public/dev/perf (including the round-13 联防 on the wide round battlefield), with a browser speed page and a headless benchmark. public/dev stays out of the package. The Chrome benchmark was not run. The numbers in the original pull request are from 0.1.4 and are not quoted here.

Tests: node --test test/perfbench.test.js test/render/battle-perf.browser.test.js — 13 pass, 0 fail; the Chrome suite skipped (RENDER_E2E unset).
2026-10-08 18:48:42 +08:00
sganggs 8ea7a13a4e feedback7: version 0.2.2-dev — 0.2.1 is released; the dev line is marked as before (README warning under the title, an orange dev badge, the 开发版 tag on the title screen, the boot-banner warning)
- Tests: version, i18n-packs, docs-consistency, package.
2026-10-08 17:38:55 +08:00
sganggs 97152828c3 feedback6: version 0.2.1 — package.json / package-lock.json / APP_VERSION (DEV_BUILD turns false: the title-screen dev tag, the boot warning and the package guard go)
- CHANGELOG 0.2.1 (2026-10-07): the streams' lines collected (新功能: the update package and MANIFEST.json; 规则(按官方):
  联防 on the round's battlefield, 突袭 onto a teammate's half, full potential, the replace dialog for consumables,
  the 外勤医疗 Touch, 凋亡, 贾维's 拉普兰德, the 频次 器物 / leader summons; 界面: the collapse arrow, 自选 picks in the bond
  lists, flyers, enemy animations, the Touch card, Esc in the 自选 picker; 联机与大厅: battle messages while a battle
  loads; 工具与开发: the update build, .gitignore), one intro paragraph.
- README: the dev warning under the title removed, the release badge, 「当前版本 0.2.1」; DESIGN's version line names
  0.2.1 (§26) as the state described; §26's intro says when the dev line shipped.
- Tests: version, docs-consistency, docs-paths, package, i18n-packs, update-package, update-boot 80 / 80.
2026-10-07 19:35:30 +08:00
sganggs ee43fb7c14 feedback6: merge fb5-patch-pkg — from 0.2.1 on every release also ships an update zip (only the files changed since the earlier 0.2.x releases; the server checks the install against MANIFEST.json and deletes the files the new version dropped on its first start; manual download, no auto-update — the owner's decision of 2026-10-07); README English summary: both the update-zip sentence and the Languages line kept 2026-10-07 16:47:27 +08:00
sganggs 40cfe2d3d3 feedback6: version 0.2.1-dev — 0.2.0 is released; the dev line is marked as before (README warning under the title, an orange dev badge, the 开发版 tag on the title screen, the boot-banner warning, the package guard: DEV_BUILD from the version) 2026-10-07 16:45:46 +08:00
sganggs 2e91fc9169 feedback5: CHANGELOG / README — the 0.2.0 summary names the five languages; the 日本語、한국어、繁體中文 line describes the interfaces (zh-TW converted with Taiwan usage, ja / ko machine-translated with the official terms, marked in 设置) and the per-language fonts; README English summary: a Languages line 2026-10-07 12:47:36 +08:00
sganggs 79fc442f8e fb5-patch-pkg: docs for the update package — README「方式一」gets the third bullet (Stronghold-Protocol-v<版本>-update.zip from 0.2.1: only the files changed since the earlier 0.2.x, for a full or lite 0.2.x install; stop the server, merge the zip's Stronghold-Protocol folder into the install, start; a mismatched install is refused) and the English summary a clause; DEPLOY §1.5 the bundle update (Expand-Archive / Explorer / unzip -o, not a Finder drag; what the first start does, the refusal, docs-only warnings, lite installs and local art, doctor's row) with the old copy-to-a-new-folder way kept; DEPLOY §7 the maintainer side (--update --from every earlier 0.2.x full zip, MANIFEST.json in every zip, the checks, --keep-stage); ARCHITECTURE names server/update.js and tools/package-update.mjs 2026-10-07 11:30:02 +08:00
sganggs 0b306baa49 feedback5: version 0.2.0 — three stale size / content lines: the README English summary names the 39 summon models the local client provides, DEPLOY §7's comparison with the 0.1.x whole-tree layout re-measured, setup's art-download fallback 270 MB → 460 MB; golden unchanged
- README English summary: the official 3D board, some HUD icons, two enemy models and 39 summon models come from a
  local client; without one the summons show their avatars (as the Chinese 本地客户端素材 line says).
- DEPLOY §7: measured on this tree (cee16a9, both zips built, deleted after): the 0.2.0 full zip 448 534 389 bytes,
  16 031 files; the 0.1.x layout of the same tree (every tracked file plus all of public/assets: the 0.2.0 stage with
  the 602 tracked files it leaves out and the 38 art files nothing lists) 457 108 488 bytes, 16 671 files — about 640
  files, 26 MB unpacked (27 047 047 bytes) and 8 MB of zip less (was ~570 / 25 / 8 from W5U's tree).
- tools/setup.mjs: the download size shown when data/assets.json gives none (missing, unreadable, no stats.bytes) is
  ART_DOWNLOAD_FALLBACK, 460 MB — the 0.2.0 manifest's stats.bytes (463 MB) as README and DEPLOY quote it; the
  manifest's own size is still shown whenever it has one. The header comment says ~460 MB.
- Tests: version 6 / 6, docs-consistency 24 / 24, docs-paths 7 / 7, package 10 / 10, client-static 313 / 313,
  i18n 10 / 10, i18n-data 8 / 8, i18n-packs 12 / 12, i18n-server 5 / 5, doctor 4 / 4, assets 47 / 47,
  asset-network 21 / 21, static-local-art 3 / 3; npm run golden ok; lint 0 errors.
2026-10-07 06:41:06 +08:00
sganggs 6aeee5ff70 feedback5: version 0.2.0 — package.json / package-lock.json / APP_VERSION (DEV_BUILD turns false, so the title-screen dev tag and the boot warning go too), README (the dev-branch warning removed, the badge, the version line), CHANGELOG 0.2.0 dated 2026-10-07, the zip and download sizes re-measured; golden unchanged
- CHANGELOG 0.2.0: the integrator's draft brought up to date with what merged after it (30d9a41..2e83a6b and
  DESIGN §25.13–§25.21): the language packs and the ja / ko / zh-TW game texts (§25.20), the rebindable shortcuts
  (§25.15), the community reports of W5AA (§25.14) and CB1–CB5 (§25.16–§25.19, §25.21) under the draft's sections
  (rules, UI, lobby; the official behaviours and the reports not reproduced under 核实后不是问题), the owner's
  乌尔比安 revive-tile decision of 2026-10-07 under the deviations section (renamed 有意与官方不同的调整, the intro
  points at it); PRs #189 / #191 credited to @2321Robin as reused ideas; the draft's notes block left out.
- Sizes (tools/package.mjs, a real build of both zips, deleted after measuring): full zip 448 525 731 bytes
  (~430 MB, 16 031 files, 625 MB unpacked; was ~400 / 590), lite zip 22 927 271 bytes (~22 MB; was ~21), the setup
  download 463 MB (~460 MB; was ~440: the 自选 voices) — README 方式一 / 方式二 / 系统要求 / English summary,
  DEPLOY §0 / §1.1 / §3, the CHANGELOG's lite size.
- DESIGN §25 intro, §25.19 and §25.19.7: the custom-hotkey request (item 48) was built in §25.15, the battle-history
  request (item 22) stays postponed by the owner; §25.20: with five languages the menu is a list (buttons up to four).
- Tests: version 6 / 6, docs-consistency 24 / 24, docs-paths 7 / 7, package 10 / 10, client-static 313 / 313,
  i18n 10 / 10, i18n-data 8 / 8, i18n-packs 12 / 12, i18n-server 5 / 5; npm run golden ok (roster 49, bonds 46,
  fields 22, matches 18, standins 10, diy 138); lint 0 errors.
2026-10-07 06:41:06 +08:00
sganggs 1ee39a79b5 feedback5 WAD: docs for language packs and content packs — docs/PACKS.md (the manifest, the two layouts, discovery and the index, what is served, the types and how a later type plugs in), docs/I18N.md §5 "Adding a language" (step by step for a translator) with the fallback chain, placeholder validation and plural categories, CONTRIBUTING / README pointers, DEPLOY §7 (packs/ and packs/index.json in the zips), ARCHITECTURE, docs/history/0.2.0.md §25.16; build-i18n --dict (a community dictionary for a language without an official client); the browser check of a pack file and a pack folder dropped in while the server runs (test/ui/i18n.e2e.test.js); golden unchanged 2026-10-07 02:39:11 +08:00
sganggs f1df0d359d feedback5 WAC: docs for the rebindable shortcuts — PLAYING §11 (the shortcut list and how to change it), README 操作 (Q / X added, the settings named), DESIGN §10 (design/client.md), §25.15, I18N's stale hotkey-line example
Golden unchanged (docs only).
2026-10-07 01:56:25 +08:00
sganggs 575333137c feedback5 WX: the 39 summon models no web dump carries come from the local client (extract.py TOKEN_SPINES) and are drawn instead of the avatar diamond when data/local-assets.json lists them
- tools/local-extract/extract.py TOKEN_SPINES (`--only spine/token`): each token's battle prefab in the
  battle token packs (pkgrps/btl_pfb_tokens_*.ab; the Windows build has all 39, the iOS build lacks
  btl_pfb_tokens_0), the skeleton of its Front (or only) Spine renderer, written to
  public/assets/local/spine/token/<id>/ like the enemy models (sized pma atlas, premultiplied pages;
  the newer RGBA pages keep their own alpha). The enemy writer is shared (write_spine; the two enemy
  models re-extract byte for byte). The skinpack job of 乌尔比安's block is gone: it extracted
  nothing, and that token draws no model in the game (nor do 圣聆初雪's, 酒神's, 贝洛内's and
  予愿安洁莉娜's hidden tokens: no Spine renderer, no avatar in either install).
- tools/assets/local-token-spines.json (committed, `fetch-assets --local-spines`) → data/assets.json
  tokens[id].spineLocal for 35 自选 summons, 凯瑟琳's 爬行号·防护单元 and 凛御银灰's three 风雪之眼; the
  manifest is the same with or without the extraction (JSON diff: only the 39 spineLocal entries and
  the hash). spine.mjs LOCAL_SPINE_ROLES maps clips the resolver cannot read (电弧's 戴乌 C_Skill1_*,
  酒神's 本能的召唤 Loop / End, 白铁's platforms End, 战术锚点 on its Default pose) [ASSUMED where named].
- assets.js spineEntry: a token resolves its spineLocal like an enemy (no web model behind it: the
  diamond stays when it is not listed or fails to load). Scale as the web tokens (UNIT.modelScale).
- setup reports an extraction without the summon models; docs: ASSETS.md "Token models from the local
  client", DEPLOY.md §6, DESIGN §13 (design/client.md), README.
- Tests: test/local-token-models.test.js (new), test/local-extract.test.js (job table, prefab walk,
  alpha merge), test/assets.test.js (the local token models load like the client does),
  test/package.test.js (the full zip ships them), test/static-local-art.test.js. Golden unchanged.
2026-10-06 20:16:20 +08:00
sganggs 8ce6d280bd feedback5: merge W5W — DESIGN §25 catch-up (sleep port, board tap, packaging, the owner's 2026-10-06 answers, i18n phase 2, the 自选 voices, the summon-model gap) and the DESIGN split: docs/DESIGN.md is the index, current rules in docs/design/*.md, per-release history in docs/history/*.md, section numbers unchanged (the parts reassemble the old file byte for byte; test/docs-paths.test.js guards the index and every DESIGN §N citation); test/package.test.js builds its fake home path at run time 2026-10-06 19:22:14 +08:00
sganggs a7fbc7da33 feedback5 WW: links after the DESIGN split — README's docs table (DESIGN.md is the index, the rules in docs/design/, the revisions in docs/history/), ARCHITECTURE.md (§5 / §6 / §8 / §9 / §14 link their design/ files; the docs/ and test/helpers/ rows), CONTRIBUTING.md (deviations and rule changes go into docs/design/ with the release's revision in docs/history/; 中文 and English), SIM.md (§5 → design/engine.md), META.md (§6 / §8 → design/match.md, design/network.md), DESIGN §2's docs/ line names the index, its parts and the newer docs; citations "DESIGN §N" stay as they are (the index resolves them) 2026-10-06 19:11:08 +08:00
sganggs 6b08971203 feedback5: the public dev branch is marked as a development build (the owner's decision of 2026-10-06): version 0.2.0-dev (title footer, boot banner, /healthz), a README warning under the title (unstable, not for public servers, how to report, shared browser storage, no release zips), a visible 开发版 tag on the title screen (zh / en), a boot-banner warning for hosts, and tools/package.mjs refuses a dev version without --allow-dev; test/version.test.js checks all of it 2026-10-06 19:05:40 +08:00
sganggs 0f9009954d feedback5 WW: DESIGN §25 catch-up with what merged after e2bb090 — §25.2 i18n phase 2 (W5S: 1 056 literals wrapped, extract 0, server data texts localized, what stays Chinese), §25.9.1 the sleep-unblock port (W5R: feedback5's golden list, 酒神's 迷狂牢笼 skips sleepers; §24.9's heading names the 0.2.0 files), §25.9.2 the board-tap / long-wait port (W4C, PR #149), §25.11 the owner's items of 2026-10-06 and the items the sources settled (W5V: 望's stock, triggers through summon areas, 突袭 prefers blocking tiles, 泥岩 闭锁, 忍冬 / 深靛 / 阿), §25.12 packaging (W5U: package / package:lite, sizes, 焰狐龙梓兰's art dropped, dec-X / WAH-Y) and the 自选 voices (6499f4b), the summons with no Spine model as open polish; §25.10 records the owner's answers (damage-frame swing kept, 望's stock, summon areas, the #148 landing) and drops them from the open list; the intro, §25.1 / §25.4 / §25.5 / §25.7.2 / §25.8.5 / §25.8.8 and §24.2 point to the new items; PLAYING.md: only player names, the reworded multi-round 悬赏 text and texts the EN client lacks stay Chinese; DATA.md: ownedPool has 71 charIds, §18 cites DESIGN §25.3; README lists docs/I18N.md; garrisons/meta.js cites DESIGN §3 (there is no §3.1); golden unchanged 2026-10-06 19:01:28 +08:00
sganggs e01bba6c0a feedback5: merge W5T — docs: ARCHITECTURE.md (a map of the code, every path checked by test/docs-paths.test.js), CONTRIBUTING.md (中文 + English summary), DESIGN §25 "0.2.0" assembled from the stream drafts (after §24.9); the DESIGN split plan and the CHANGELOG 0.2.0 draft stay in the integrator's notes until the last merges 2026-10-06 18:14:11 +08:00
sganggs 65653a21b0 feedback5: merge W5U — packaging: tools/package.mjs (npm run package / package:lite: a runtime-only full zip with the listed art, ~402 MB, and a lite zip without it, ~21 MB; refusal list, personal-path scan, case-collision check, dry-run test), 焰狐龙梓兰's art entries dropped from data/assets.json, one lower-case file per module-icon type (dec-X / dec-x, WAH-Y collided on case-insensitive disks), DEPLOY / README download sections; version lines follow the merged 0.1.4 CHANGELOG (0.1.4 until the 0.2.0 bump); golden unchanged 2026-10-06 18:12:31 +08:00
sganggs d148b3065d feedback5 WU: README and DEPLOY say which zip to pick (完整包 / 精简包) and what setup downloads; DEPLOY §7 packaging
README「方式一」lists the two zips: 完整包 Stronghold-Protocol-v<版本>.zip (about 400 MB, 590 MB unpacked, all the art)
and 精简包 …-lite.zip (about 21 MB: setup downloads the art, Spine models, audio, fonts, emotes and 玩法说明 pages on the
first start, about 440 MB, resumable; the local-client art is not in it), and what both leave out; the disclaimer says
only the full zip carries the art; setup's download is about 440 MB (the 0.2.0 manifest, was 270 MB); the disk row and
the English summary follow.

docs/DEPLOY.md: §0 disk (440 MB of art, 65 MB of runtime dependencies in a zip), §1.1 three ways to get the game (full,
lite, git clone) and what the first start does with each, §1.5 updating with the lite zip, §3 Docker builds from a git
clone (the zips have no Dockerfile; 440 MB), §6 a lite install has no local-client art, §7 the packaging tool for
maintainers: what ships, what is left out and why, the checks, what it needs.

tools/setup.mjs LOCAL_ART_COPY_HINT (shown by doctor): copy the local art from the same version's 整合包(完整包) — the
lite zip has none.
2026-10-06 18:09:21 +08:00
sganggs adaa8695ef feedback5 WT: CONTRIBUTING.md (Chinese, English summary) — setup, targeted / golden / opt-in browser tests, the fidelity rules (official data + PRTS, [ASSUMED], no copyrighted text at length), commit and pull-request conventions, adding a 自选 operator per kits/README.md; ARCHITECTURE and README link it; docs-paths covers it 2026-10-06 17:46:31 +08:00
sganggs 11655e19d6 feedback5 WT: docs/ARCHITECTURE.md — a newcomer's map: the Node server on node:http, the WebSocket protocol, the deterministic sim shared by server and browser, the 0.2.0 directory layout, the data flow (build-data, assets, the i18n overlay), the golden results and import boundaries, where to start for common changes; test/docs-paths.test.js checks every path and link it names; README links it 2026-10-06 17:44:22 +08:00
sganggs 5f0830cdc5 feedback5 R1: docs and comments follow the split — DESIGN §2 layout lists server/http/, the README table names the entry and http/, path comments in shared/media.js, public/js/media.js, buildGuard.js, net.js and three tests point at the new modules; .git-blame-ignore-revs lists the pure-move commit 2026-10-05 16:11:30 +08:00
sganggs 0fa0f958b1 feedback5 WA: golden-result safety net before the 0.2.0 refactor — tools/golden.mjs runs a seeded corpus (49 roster battles: every chess record × skill × module, every stage and enemy kind; 46 bond battles; 22 leader / 联防 fields; 16 bot-only matches) and test/golden.test.js compares its digests with test/golden/*.json field by field (fast subset by default, GOLDEN_FULL=1 for all; npm run golden / golden:update; test/golden/README.md) 2026-10-05 15:49:24 +08:00
sganggs 351ead3603 feedback3: 0.1.3 design notes, changelog and version 2026-10-04 22:13:05 +08:00
sganggs 8707c161b9 feedback3: merge W3E — two spectator seats per co-op room (GitHub-relayed community request #26; a remake feature): watch like an eliminated player, never act, no private data 2026-10-04 17:57:09 +08:00
sganggs 976475efff feedback3 WE: spectator seats in the browser — 观战 in the lobby, the 观战席 strip in the room (host removes, 入座), watch-only match screen; docs (community report #26) 2026-10-04 17:39:30 +08:00
sganggs eb3886760e feedback3 WC: README says the host can remove other players from the room before the match 2026-10-04 17:16:52 +08:00
Lu Ke 50498bbe07 Windows 便携包:只收 git 跟踪的文件、生产依赖、钉死的 Node 版本与许可证 (#30) 2026-10-04 14:20:11 +08:00