feedback2 WE: README, DEPLOY.md (new §6), setup and doctor say what falls back without the local-client art instead of 不影响游戏, and that a server without the client can copy public/assets/local + data/local-assets.json from the same version's bundle; DESIGN §22.5 (#42)
This commit is contained in:
1 parent
db7b2b1404
commit
2f0a980b2e
10 files changed
+87
-25
No files matched your search
+13
-5
@@ -516,11 +516,11 @@ Audio: autochess BGM per phase, UI SFX (buy/sell/refresh/level/merge/ready/timer
|
||||
|
||||
## 13. Local-client art (optional, host-side)
|
||||
|
||||
`tools/local-extract/extract.py` (Python: UnityPy + lz4 + Pillow; decodes Arknights' custom **LZ4AK** bundle compression via `aklz4.py`) extracts art that no web source has from a locally installed client (CrossOver Windows build or PlayCover iOS build) into `public/assets/local/**` and writes `data/local-assets.json` (`{ groups: { '<subdir>': { name: { path, w, h, kind } } } }`). Everything here is **optional**: clients must render correctly when the file or any entry is missing (fall back to the web assets / procedural art).
|
||||
`tools/local-extract/extract.py` (Python: UnityPy + lz4 + Pillow; decodes Arknights' custom **LZ4AK** bundle compression via `aklz4.py`) extracts art that no web source has from a locally installed client (CrossOver Windows build or PlayCover iOS build) into `public/assets/local/**` and writes `data/local-assets.json` (`{ groups: { '<subdir>': { name: { path, w, h, kind } } } }`). Everything here is **optional**: clients must render correctly when the file or any entry is missing (fall back to the web assets / procedural art). The emotes and the guide pages below are on the public mirror too (§22.5): fetch-assets downloads them (data/assets.json `ui['emoticon/<dir>/<picId>']`, `ui['guide/<key>']`) and the client shows the local copy first, then that one (`data.js artUrls`); docs/DEPLOY.md §6 lists what still needs the client.
|
||||
- `map/autochess/TX_autochessi_*` — the real autochess board atlas (`_D` diffuse 2048² with floor tiles, gold-framed high-ground plates, REINFORCEMENTS bench pads, EQUIPMENTS pads, crates, gates; `_N/_M/_E` normal/mask/emission; `common_D` device icons; `BG` backdrop). `map/autochesssand/*` — the sand-theme variant.
|
||||
- `ui/{common,battle,outer}/*` — every sprite of the three official autochess UI bundles (tier chips I–VI, bond disc rings, frames, banners, HUD pieces, badges, backgrounds, mode art).
|
||||
- `emoticon/{basic,basic_2}/pic_<id>_battle.png` — the 12 official battle emotes (`shared/constants.js → EMOTES`, `emoteArtPath`).
|
||||
- `guide/autochess_{home,shop,handbook}_N.png` — the official tutorial pages; stored squashed to 1024² — **display at 16:9**.
|
||||
- `emoticon/<dir>/<picId>.png` — the 36 official battle emotes, 6 themes (`shared/constants.js → EMOTE_THEMES / EMOTES`, `emoteArtPath`; data/emotes.json); also downloaded from the mirror (§22.5).
|
||||
- `guide/autochess_{home,shop,handbook}_N.png` — the 19 official tutorial pages; stored squashed to 1024² — **display at 16:9** (the mirror copies too, §22.5).
|
||||
- `projectiles/*` — battle projectile sprites.
|
||||
- `spine/enemy/<id>/` — enemy models no web dump carries (灼热 / 炽焰源石虫, `extract.py ENEMY_SPINES`): manifest `enemies[id].spineLocal` (metadata from the committed `tools/assets/local-enemy-spines.json`); drawn instead of the tinted web alias when every file is listed (§21.14).
|
||||
- `module/<TYPE>` — the official module (uniequip) TYPE icons (white glyphs; keys are the client's mixed-case file names, e.g. `PRI-X`, `mar-x`, `isw-a`), matched **case-insensitively** against a ModuleRecord's `typeName` by `assetUrls.moduleTypeIconUrl(local, typeName)` (Greek type letters map to the file's Latin letter: `ISW-α` → `isw-a`) — shown on the 干员调配 module cards / module info, the detail panel's 模组 row and the shop card's module tag; lettered tiles / type text without them.
|
||||
@@ -1482,9 +1482,17 @@ TBD-22.3
|
||||
TBD-22.4
|
||||
|
||||
|
||||
### 22.5 Emotes and guide pages without a local client; deployment docs (#42); the English title (#38)
|
||||
### 22.5 Emotes and guide pages without a local client; deployment docs (#42); the English title (#38) — `tools/assets/plan.mjs UI_EXTRAS / GUIDE_PAGES`, data/assets.json `ui['emoticon/<dir>/<picId>']` / `ui['guide/<key>']`, `data.js artUrls / nextArtUrl`, `ui/emotes.js emoteArtUrls / EmoteArt`, `ui/guide.js guidePages / GuideHost`, `tools/setup.mjs LOCAL_ART_FALLBACK / LOCAL_ART_COPY_HINT`, `tools/doctor.mjs`, README, docs/DEPLOY.md §6, `server/index.js` banner, package.json `name`
|
||||
|
||||
TBD-22.5
|
||||
- **#42 seen**: "游玩时左下角的六页表情全部显示为默认图标" — a Linux server deployed from source (git clone, setup with the asset download, Node 22); copying `public/assets/local/` and `data/local-assets.json` from the release bundle fixed it. **Real**: both are extracted from a locally installed client (§13; setup extracts only when it finds one), and the emote art and the 玩法说明 pages came from there only, so a source deploy without the client drew the neutral glyph for all 36 emotes and the official tips text instead of the 19 pages. README, DEPLOY.md, setup and doctor said the local art did not matter ("不影响游戏", "其他功能不受影响") — wrong: the 3D board, part of the official HUD art and two enemy models fall back too.
|
||||
- **Source**: the mirror the pipeline already uses (ArknightsAssets2 `cn`, assets/dyn) has all 55 files — the six theme bundles' `ui/emoticon/theme/[uc]<themeId>/icon/<picId>.png` (the 36 battle sprites, keyed by display_meta_table picId) and `arts/guidebookpages/[pack]autochess/autochess_{home 1–9, shop 1–6, handbook 1–4}.png`. Checked 2026-10-03: every URL answers 200 on raw.githubusercontent.com and on the jsDelivr fallback; the same pictures at the same sizes as the local extraction (emotes 120×120 / ≈113×115, pages 1024² squashed — still shown at 16:9), pixel differences only from the platforms' texture compression.
|
||||
- **Now**: the asset plan downloads them like any other UI sprite (UI_EXTRAS, built from shared/constants.js EMOTE_CATALOG and GUIDE_PAGES — a test keeps GUIDE_PAGES equal to guide.js GUIDE_CHAPTERS), keyed by the data/local-assets.json group and name: `ui['emoticon/<dir>/<picId>']` → `/assets/ui/emoticon/<dir>/<picId>.png`, `ui['guide/<key>']` → `/assets/ui/guide/<key>.png` (55 files, 21.3 MiB; the download ≈ 270 MB, was ≈ 250 MB). The committed data/assets.json lists them (regenerated by a real fetch-assets run: only these 55 entries, `hash` and `stats` changed), so `npm run setup` — which the start scripts run on every start — on an install made before them finds 55 files missing and runs fetch-assets; §21.25's conventions hold: ledger, retries, the jsDelivr fallback, and a run where they fail keeps the committed manifest (shrink guard), so the next setup tries again. The client looks both manifests up by the same names (`data.js artUrls`): the local-client picture first, then the mirror copy; `EmoteArt` and the guide viewer move to the next URL when an image fails to load (`nextArtUrl`: a copied data/local-assets.json without its files falls through to the mirror copy), and with neither keep today's fallback (the glyph; the tips text). `localAsset` stays local-only.
|
||||
- **Docs now**: README, docs/DEPLOY.md (new §6 本地客户端素材, the 排错 rows), docs/PLAYING.md, docs/ASSETS.md and the setup / doctor messages say what still needs the client — the official 3D board (→ the 2D board with procedural tiles), part of the official HUD art (the emote button and panel frames, the pause plate, the equip-replace dialog, the loadout screen, the team status and miss tags, module type icons … → CSS look-alikes, icons or text) and 灼热 / 炽焰源石虫's models (→ the tinted web alias, §21.14) — and that a server without the client can copy `public/assets/local/` and `data/local-assets.json` from the release bundle of the **same version** (both are read per request: no restart). The Docker parts are unchanged (deferred by the owner).
|
||||
- **Not done here**: the mirror also has most sprites of the three autochess UI bundles that the local `ui/battle` / `ui/common` / `ui/outer` groups hold (by name 377 / 389, 137 / 160 and 659 / 659 under `ui/autochess/[uc]autochess{battle,common,outer}/**`; the emote panel frames, `matte_pause` and `bg_miss_enemy` checked at the local sizes), so the HUD row of DEPLOY §6 could shrink in a follow-up.
|
||||
- **#38, the English title** — **official**: EN client data, activity_table `basicInfo.act2autochess.name` = "Stronghold Protocol: Alliance" (CN 卫戍协议:盟约; ArknightsAssets/ArknightsGamedata `en/gamedata/excel/activity_table.json`, 2026-09-29 — Kengxxiao/ArknightsGameData_YoStar stops at EN client 31.5.80, 2025-11-13, before this season, with act1vautochess "Stronghold Protocol" only). **Now**: the README title and English summary, the server start-up banner and the package name (`stronghold-protocol-alliance`, package.json and the lockfile) say Alliance instead of "Covenant"; the Chinese title 卫戍协议:盟约 and the repository name stay. "Covenant" remains only in 新约能天使's official appellation ("Exusiai the New Covenant") and its buff key `angel2:covenant`.
|
||||
- **PR #27 follow-up**: tools/doctor.mjs's comment now says directly that tun0 / tap0 are matched first by VPN_IF (substring `tun\d` / `tap`) and classed as vpn — it spoke of no longer listing `^tun\d`, which master's VIRTUAL_IF never had; comment only.
|
||||
- [ASSUMED]: none.
|
||||
- Tests: `test/assets.test.js` (the 55 plan entries and URLs, a rebuilt manifest, the committed manifest lists them), `test/ui/localArt.test.js` (the lookup order, a server without the client, GUIDE_PAGES = GUIDE_CHAPTERS), `test/fetch-assets-shrink.test.js` (a failed mirror run keeps the manifest), `test/static-local-art.test.js` (the docs and messages), `test/version.test.js` (the English title), `test/doctor.test.js`.
|
||||
|
||||
|
||||
### 22.6 钩索师 and 推击手 on 高台 (#32 item 4)
|
||||
|
||||
Reference in new issue
Block a user