sganggs
8a43624935
feedback5 WE: 联防 is played on its own map, the escaped template level (GitHub #41 , item 3) — act2autochess constData escapedBattleTemplateMapSinglePlayer / MultiPlayer = level_act1autochess_escaped_single / _multi name the level of the 联防 battle, and its map is the field: two road halves (cols 3–9 and 11–17, rows 9–12) joined at col 10, no water, crates or devices (until 0.1.3 the round's stage, opened to both halves). tools/build-data.mjs builds both into data/stages.json after the 11 battle stages (kind 'unite', helpers 1 / 2, weight 0, inactive, no modes, the name 联防阵地(N名玩家) the remake's own label [ASSUMED]; validation ties config.unite.templates to them); regenerated offline, a JSON compare shows only the two added records. unite.js uniteStageId picks the map of the helper count (escaped_single's routes enter at col 10, escaped_multi's at col 18 through (9,10)); match/unitePhase.js fields the 联防 battle on it (the round's stage only with data that lacks it); each helper on its prep tiles, the first of two shifted 8 columns onto the right half as before (the official halves; player_map_lr_offset 8). Client: screens/game.js draws the shown field's own map and restores the board's on leaving it (a 2-line change in a file of the R5 split; render/app.js enterBattle already loads m.field stageId); the dev mock's 联防 follows. The 联防 BGM (PR #110 ) is unchanged. Tests: test/match/feedback5-unite-map.test.js (both combat modes, 1 and 2 helpers, degraded data), test/data.test.js, test/render/tiles.test.js. Docs: DATA §12, META §4, DESIGN §3, PLAYING §5. Golden: fields unite-1 / unite-2 (the battle's stage → the 联防 map) and the 6 co-op match scenarios with a 联防 round (coop2-NORMAL-3, coop2-HARD-4, coop3-ABYSS-5, coop4-FUNNY-6, coop4-ABYSS-7, coop2-NORMAL-8-serverrun); roster / bonds unchanged (tools/golden.mjs leaves the 联防 maps out of its stage list)
2026-10-05 18:17:08 +08:00
sganggs
db1b44bb71
feedback5 WE: the 整备区 rules of PRTS 卫戍协议/帮助 §手牌区 (GitHub #82 , second part) — a full regular hand refuses every purchase and reward pick, also one whose copy would complete a merge at once ("当常规手牌区全满无空位时,玩家将无法执行使手牌溢出的操作" — "例如招募/购入等通常情况下会增加手牌的操作"; BWIKI 盟约 says the same with no exception; the reporter checked it in the official game), and a free regular slot pulls the 临时整备区 in at once ("常规手牌区出现空位时自动移入"): PlayerState._fillHandFromTemp runs in every recompute, the temp row right to left (the order it fills, [ASSUMED]) into the hand's free slots right to left — after a sale, a deployment from the hand, a merge that consumed hand copies, an item equipped / destroyed / used, a summon stack removed with its owner. invariants.js: temp holds pieces only while the hand is full. The client's refusal path follows (gameLogic.shopBlockReason: 整备区已满 on every card — a one-line change in a file the R5 split moves). Bots: a full hand never tries a purchase, an affordable third copy of a held pair sheds the weakest hand single first (never one of this prep), resolveTemp decides temp right to left. Tests: test/match/feedback5-hand.test.js; merge / hardening / playtest6-elite-to-board / economy / prep-bench / uiFixes updated to the rule. Docs: META §1 Hand, DESIGN §6, PLAYING §3, research 00-INDEX / 01 (the old "a merge-completing purchase is allowed" corrected). Golden: 3 match scenarios moved (coop2-NORMAL-3, solo-HARD-9-boosted, coop2-ABYSS-10-boosted — bot seats that reached a full hand: the merge-completing purchase refused or a single shed first, temp pieces moving in by themselves); every battle digest unchanged
2026-10-05 18:17:08 +08:00
sganggs
b1ec04b58c
feedback5: merge R2 — server/match/Match.js split into server/match/match/* and PlayerState.js into server/match/player/* (fixed install order, same exports); golden unchanged
2026-10-05 17:24:48 +08:00
sganggs
cea593561a
feedback5 R2: after the move — match/bossRounds.js imports finalAssault.js once (Match.js had two import lines for it), match/watch.js drops the stale first doc line of _prepScoutSig (superseded in the review of PR #129 )
2026-10-05 17:18:54 +08:00
sganggs
d9750d8aba
feedback5 R2: docs and comments follow the split — DESIGN §2 and META list server/match/match/ and server/match/player/ (the classes: constructor + method install), research 09 / 11 name the new homes (Match.watch in match/watch.js, the settle in match/settle.js, the facing changes in player/placement.js / items.js), code comments that pointed at moved code say where it lives now (shared constants, client bandDraft / observe / result / hud / teamPanel / underframe / game-mock, test comments); .git-blame-ignore-revs lists the two pure-move commits. DESIGN §17–§23 history citations, the "before" column and the proposal of research 11, tools/build-data.mjs (Match.js still exports BAND_TURN_SECONDS) and public/js/ui/gameLogic.js (in the client stream R5) are left as they are
2026-10-05 17:18:22 +08:00
sganggs
64443b4aab
feedback5 R2: PlayerState.js → server/match/player/*.js, a pure move — the 87 class members (82 methods and the isHumanActive / botControlled / deployCap / deployCount / tempEmpty getters), verbatim with their comments, go to 9 per-concern method containers (basics, pieces, acquire, economy, placement, items, prep, round, views) that PlayerState.js installs on PlayerState.prototype in a fixed order with class-method descriptors (a name defined twice throws); HAND_SIZE, TEMP_SIZE, MAX_OFFER_SLOTS, OK and fail go to player/common.js; PlayerState.js keeps the header (+ a code-layout paragraph), the class with its constructor and the FIELD re-export. Section-header comments are replaced by the module headers. docs-consistency reads the method modules (playerText), pins layerGainRoom in player/economy.js and checks that no Match / PlayerState module has a layerRoom
2026-10-05 17:15:37 +08:00
sganggs
1ca4936f0a
feedback5 R2: Match.js → server/match/match/*.js, a pure move — the 167 class members (166 methods and the soloUntimed getter), verbatim with their comments, go to 16 per-concern method containers (platform, infra, messaging, views, watch, intents, pause, phases, spDraft, prep, combat, clientCombat, reports, unitePhase, bossRounds, settle) that Match.js installs on Match.prototype in a fixed order with class-method descriptors (a name defined twice throws); the constants the modules share go to match/common.js (FLOW_TICKER_PRIORITY, DELAYS, BAND_TURN_SECONDS re-exported by Match.js; OK, fail, BOSS_CLOCK_MS), GAME_TYPES to platform.js, the boss-round budgets / rates to bossRounds.js; Match.js keeps the header (+ a code-layout paragraph), the constructor-only constants and the class with its constructor. Section-header comments are replaced by the module headers. docs-consistency reads the method modules (matchText) and pins layerGainRoom in match/settle.js
2026-10-05 17:10:38 +08:00
sganggs
8ab6d021da
feedback5: merge feedback4 — PR #129 , the lobby ERR import
2026-10-05 16:48:02 +08:00
sganggs
f2440d4fd7
feedback4: merge master — PR #129 (watching a teammate shows hand, temp, equipment, strategy, effects)
2026-10-05 16:47:54 +08:00
Luo Xingyu
bce182703b
Watching a teammate shows their hand, 临时整备区, equipment, strategy and effects ( #129 )
...
The prep scout of another player's board carries their 整备区 hand and 临时整备区 as units on the bench rows (like the own prep bench), the equipped items of their operators, their strategy in the drawer and their effects column (the official mode shows a teammate's hand too). The scout signature includes the hand / temp slots, so a moved card refreshes the watcher. Closes #128 . Contributed by @2321Robin.
2026-10-05 16:47:33 +08:00
sganggs
dcce7858c2
feedback5: shared/standIn.js JSDoc marks the selection's skillIndex optional and documents diyRecord, so the checkJs slice passes
2026-10-05 16:35:33 +08:00
sganggs
3288afc787
feedback5: merge R6 (tooling) — correctness-only ESLint, a first checkJs slice + core typedefs, tools/check-imports.mjs, tools/package.mjs (+ --lite), CI tooling job
2026-10-05 16:34:01 +08:00
sganggs
e1de092b74
feedback4: the lobby imports ERR, so a failed 观战 join shows its toast instead of throwing (PR #119 's error path; found by the 0.2.0 lint)
2026-10-05 16:32:44 +08:00
sganggs
6a7a23765a
feedback5: merge R4 — operator kits one file per chess (kits/ops/*, kits/shared/*, kits/index.js in the old registry order) + kits/README.md with the fidelity checklist; golden unchanged
...
# Conflicts:
# .git-blame-ignore-revs
# test/docs-consistency.test.js
2026-10-05 16:30:29 +08:00
sganggs
920624e743
feedback5 R4: kits/README.md — how a kit file is built, what it may use (shared helpers, the battle API of docs/SIM.md), naming, registration, tests, the fidelity rule and a ten-item fidelity checklist per operator with example kits and tests (for the stand-ins, self-select 6★ operators and GitHub #136 ); test/content/kits_layout.test.js checks that every ops/ file is listed in kits/index.js, named after its chess id and charId, registers exactly its kit, and imports nothing Node-only or server-only and no clock / Math.random
2026-10-05 16:26:29 +08:00
sganggs
4dff116c19
feedback5 R6: run lint, import check and typecheck in CI
...
One extra Ubuntu job. The existing test matrix is unchanged. Lint warnings are allowed.
2026-10-05 16:23:54 +08:00
sganggs
b6c9918c46
feedback5 R6: add a player package tool with a lite dry-run
...
tools/package.mjs packs git-tracked runtime files and production dependencies. --lite leaves out local art, fonts and the local asset manifest. --dry-run lists the files and the uncompressed sizes and does not write a zip.
2026-10-05 16:23:47 +08:00
sganggs
95842cef6e
feedback5: merge R3 — server/sim/Battle.js split into server/sim/battle/* (prototype methods in fixed order) and content/enemies.js into content/enemies/* (same KITS order); golden unchanged
...
# Conflicts:
# .git-blame-ignore-revs
2026-10-05 16:23:17 +08:00
sganggs
014259b75f
feedback5 R6: check that sim and match stay off the net and the client
...
tools/check-imports.mjs lists boundary hits and exits 1 only with --strict. The current hit is the Node data loader's node:fs, node:path and node:url. server/data.js stays allowed.
2026-10-05 16:20:55 +08:00
sganggs
5024559028
feedback5 R3: docs and comments follow the split — DESIGN §2 and SIM.md list server/sim/battle/ and content/enemies/, SIM.md and research 08 name the new homes (archetypes.js frontGuard / ep / dmgZone / pollution, helpers.js areaAllies / zone / setForm, fly.js kitShell), code comments that pointed at moved code say where it lives now (enemies.js header, battle/blocking.js, battle/queries.js, sim constants / snapshot / units / ai / targeting / devices / bosses, shared constants / protocol, render style / interp); .git-blame-ignore-revs lists the two pure-move commits
2026-10-05 16:20:06 +08:00
sganggs
37b1c0a644
feedback5 R4: paths after the kit split — DESIGN §7 and SIM.md (layout, §7.2 kit contract, kit citations), research 09, code comments (content/generic, tokens, items/battle, shared/loadoutRecord, render fx / demo), test comments, and the kits' own comments that named tierN.js; DESIGN §17–§23 history citations are left as they are
2026-10-05 16:18:58 +08:00
sganggs
64a7f48efa
feedback5 R6: add a small checkJs slice and core typedefs
...
tsc checks shared (except protocol.js and bandBonds.js), the sim rng/dir/constants helpers, and types/core.js. strict stays off. types/README.md says how to widen the slice.
2026-10-05 16:18:28 +08:00
sganggs
babc35b72a
feedback5 R6: add a correctness-only eslint
...
Flat config for Node and the browser, with unused names as warnings. The run is clean of errors after three small fixes: the lobby spectate path imports ERR, a disable comment for a rule that is not installed is gone, and two atlas regexes spell the BOM as an escape.
2026-10-05 16:16:45 +08:00
sganggs
560328cacc
feedback5 R3: content/enemies.js → content/enemies/*.js, a pure move — every declaration verbatim with its comments: helpers.js (shared constants, per-battle state, ability bookkeeping, selection / damage helpers), archetypes.js (ability archetypes and the archetype kits reused by several keys), one file per kit family with its kit-only constants and its part of KITS (invisible, times, element, dot, reflection, fly, special, leaders — the kitLeaderMisc entries that closed the SPECIAL section open the leaders part, so the order stands); enemies.js keeps the header, the dispatch hooks and dispatchers, STATS_ONLY and the chalice share, builds KITS from the parts (188 keys, same order, same functions) and re-exports all 43 names it exported before. docs-consistency pins kitMace's inR in enemies/leaders.js
2026-10-05 16:16:37 +08:00
sganggs
7adf46b033
feedback5 R4: .git-blame-ignore-revs lists the kit split (a pure move), so blame skips it
2026-10-05 16:14:48 +08:00
sganggs
8924007e55
feedback5 R4: content/index.js takes the kit registry from kits/index.js (one guarded import per kit file) instead of loading the six tier shims; KITS is the same object kits/index.js exports — same keys, order and builders, golden unchanged
2026-10-05 16:14:39 +08:00
sganggs
1169102d46
feedback5 R4: one file per operator kit — kits/tier1..6.js split into kits/ops/<chessId>-<codename>.js (129 kits), kits/shared/tier1..6.js (the helpers two or more kits of a tier use, and each tier's header notes) and kits/index.js (the registry, same keys in the same order); the tier files become re-export shims
...
Pure move: every line of a kit, of a helper and of the tier headers is copied verbatim (only the headers' first
line names the new file); a helper used by one kit moved into that kit's file. Glue only: the generated imports,
`export default { … }` around each registry entry, `export { … }` lists in shared/tier2..6.js, and tier4's
`(bb, chess, def)` default-argument wrapper as shared/tier4.js `withDefaults` (applied in each tier-4 kit file).
kits/index.js loads every kit file with a guarded dynamic import (browser-safe, no directory listing); tierN.js
re-export the tier registry (TIER_KITS) and their old named exports (tier1 helpers + tinmanKit, tier6
PITHST_ELEMENTS). The merged registry, every tier default and named export have the same keys, order, frozenness
and function sources as before. test/docs-consistency.test.js reads the moved code at its new paths.
Golden: GOLDEN_FULL=1 node --test test/golden.test.js unchanged.
2026-10-05 16:13:56 +08:00
sganggs
13224f9483
feedback5 R3: Battle.js → server/sim/battle/*.js, a pure move — the 131 methods, verbatim with their comments, go to 14 per-concern method containers (players, lifecycle, hooks, spawns, deploy, blocking, status, combat, queries, summons, tiles, displacement, economy, events; fin / clone in util.js) that Battle.js installs on Battle.prototype in a fixed order with class-method descriptors; Battle.js keeps the header, the constructor and the class, and re-exports pushTiles. docs-consistency reads the method modules (battleText) and pins layerGainRoom in battle/economy.js
2026-10-05 16:13:25 +08:00
sganggs
aef8caef3f
feedback5: merge R1 — server/index.js split into server/http/* modules on plain node:http (same exports, headers and responses)
2026-10-05 16:13:20 +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
1b38e30819
feedback5 R1: startServer and main become wiring — PORT / HOST / TRUST_PROXY and the option picks go to http/config.js, the session stack and the /ws upgrade to http/websocket.js, the request listener and /healthz to http/routes.js (new), the security headers and the clientError 400 to http/common.js, the banner, signals and entry check to http/boot.js
...
Same order of construction, listeners and headers as before; a scripted fingerprint (export list, 51 HTTP requests'
status / header order / body hash, raw upgrade and malformed-request replies) and the process run (banner, port in
use, SIGINT) match the pre-split server exactly. test/version.test.js reads the banner and /healthz from their new
files; module headers describe each piece.
2026-10-05 16:08:41 +08:00
sganggs
b48a67caec
feedback5 R1: pure move — the top-level code of server/index.js goes to server/http/ (config, common, files, static, media, buildTag, websocket, boot) verbatim; index.js imports it and re-exports the same 15 names, startServer and main are untouched
...
Only changes besides the move: `export` on helpers another module now needs (sendError, sendJson, splitUrl, GzipCache,
isNotModified, serveFile, serveMedia, noopLog, makeLogger), ROOT resolves two levels up from server/http/config.js
(same path), and short headers on the new files.
2026-10-05 16:02:33 +08:00
sganggs
67ca229d44
feedback5: merge W5B — stand-in (补位) and self-select (自选编队) data: chess backup fields, data/backups.json (17 stand-ins, 4 DIY slots, picks, faction bonds), shared/standIn.js
2026-10-05 16:02:25 +08:00
sganggs
73a30148b6
feedback5 WB: DATA.md documents chess.json backup and data/backups.json (§18); research 02 / 03 name the DIY faction rule (mainPower + every subPower)
2026-10-05 15:58:17 +08:00
sganggs
4b1d9606d2
feedback5 WB: the data of 补位 and 自选 — chess.json keeps the official backup fields, data/backups.json builds the 17 stand-ins and the DIY picks
...
chess.json: every record carries the shop row's backupCharId / backupTmplId / backupCharSkillIndex /
backupCharUniEquipId / backupCharPotRank verbatim as `backup` (both forms; nothing else changed).
data/backups.json: units = the 17 原型干员 with a form per status they fight at (43 forms: stats, trait,
talents, every unlocked skill, modules), diy = the 4 slots, the prototype picks per tier (9 6★ at 5 and 6,
six 4★ at 5), the 78 owned-6★ picks and their faction bonds (mainPower + subPower vs powerIdList, else 协防).
shared/standIn.js composes a stand-in (or a DIY prototype) into a chess-shaped record; the build fails when
the form builder cannot give back every PRESET chess field for field. test/backups.test.js (10 tests).
2026-10-05 15:58:10 +08:00
sganggs
6b489b1776
feedback4: merge W5A — golden-result safety net (tools/golden.mjs, test/golden: every chess loadout, enemy, bond, field and bot match, fixed seeds)
2026-10-05 15:50:16 +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
305b524df2
feedback4: a bond card's layer-scaled chance (不屈, 迅捷, 奇迹) stops at 100 % like the sim's (GitHub #108 : 124 % at 266 layers)
2026-10-05 14:37:23 +08:00
sganggs
723755e3a5
feedback4: 引星棘刺 S1 度算浪波 (an AUTO skill thrown at an ally) fires as soon as its SP is full, with no enemy around (GitHub #124 )
2026-10-05 14:37:23 +08:00
sganggs
2519a23a55
feedback4: merge master — PRs #114 #119 #127 #115 #110
2026-10-05 14:35:00 +08:00
Convey123
bd892a4dd6
联防 plays the official escaped stage's own corrosion BGM ( #110 )
...
The 联防 phase plays m_bat_corrosion (intro + loop), the track of the official escaped stages, instead of carrying on with the round's battle music; without the downloaded track it falls back to the battle music. Asset plan, manifest entry (audio.bgm.unite), audio.js and tests. Contributed by @Convey123.
2026-10-05 14:34:42 +08:00
sganggs
bcd916eb61
feedback4: the real-browser e2e suites confirm the leftover-funds prompt on the Space path too (coop.e2e 4/4, real.e2e 2/2)
2026-10-05 14:28:47 +08:00
shanzhaikabi
763e224b8d
A 咒愈师's trait heals on every damage she deals; 收割者 / 武者 heal on their skill hits too ( #115 )
...
The official trait buffs fire on output damage, not only on a normal attack (buff_template_data vendla_tr / reed2_tr / titi_tr ON_AFTER_OUTPUT_DAMAGE; etlchi_trait etc. ON_OUTPUT_DAMAGE, attackType BUFF filtered for 隐德来希). Skill damage now heals: 缇缇's 凝固的时光 ticks, 焰影苇草 S2 fireballs and 刺玫 S2's counter heal the one ally the skill names (DamageInfo.traitAlly); 隐德来希's S2 blood sickles heal her, capped at her block count per instant. PRTS 分支特性信息 §咒愈师: the heal depends only on the damage value. Contributed by @shanzhaikabi.
2026-10-05 14:20:59 +08:00
Convey123
bbff3514a8
Emote browser tests run with the fetched emote art too ( #127 )
...
The emote E2E suite accepts either the local-client extraction or the copies tools/fetch-assets.mjs downloads (public/assets/ui/emoticon), and checks the wheel's official cell sprite only when the local ui/battle art is present. Contributed by @Convey123.
2026-10-05 14:20:12 +08:00
saltfish
7bea774f01
The 观战 and 加入 buttons send the typed key, not the click event ( #119 )
...
Preact hands the click event to onClick handlers, so the 0.1.3 spectate button normalised an element into the key "OBJE" and every spectate request failed. codeArg() takes only a string key and otherwise falls back to the input field; spectate errors now say what went wrong; a recent-key chip fills the field instead of joining at once. Contributed by @salt-fishes.
2026-10-05 14:20:08 +08:00
Chun'an Shi
3f05c65dec
Q / X hotkeys retreat and sell the selected operator in prep ( #114 )
...
Q retreats and X sells the selected operator during prep, through the same buttons (never an item, never while typing in a field); the buttons show [Q] / [X]. Contributed by @SpiritedAwayCN.
2026-10-05 14:18:44 +08:00
sganggs
8aa41d9c1c
feedback4: real.e2e confirms the leftover-funds prompt on ready; DESIGN's §23.f4 references point to §23.23; the 0.1.3 changelog names the 不屈 source and fixes 手牌
2026-10-05 14:03:32 +08:00
sganggs
a0a5419eb8
feedback3: the mock prep test confirms the leftover-funds prompt
2026-10-04 22:35:13 +08:00
sganggs
a5c31cbcb4
feedback3: browser tests accept the leftover-funds prompt when they press ready
2026-10-04 22:31:55 +08:00
sganggs
9f3785636a
feedback3: a prep-end item may sit unmerged through the fight, and bonds.json matches the offline build
2026-10-04 22:20:20 +08:00