sganggs
1df530f2b9
0.2.6-dev: a piece has no screen rect until it is first drawn — pieceScreenRect returned a just-built view's unprojected (0, 0) record, so a browser test grabbed a piece bought that frame at the canvas corner (the intermittent .fwheel__dia timeout in coop.e2e / real.e2e); the tests' piecePoint waits for a drawn piece that holds still; golden: unchanged
2026-10-13 15:54:40 +08:00
sganggs
2b685011e9
0.2.6-dev: browser tests read the round's real rules — free deploy tiles come from the client's own placement legality (terrain 机变 cards, devices, the boss half) instead of the stage's plain tiles, the facing tour waits for a later round when its purchase merged into an elite, and real.e2e skips its one strategy turn only while 跳过 is enabled (PR #546 ); golden: unchanged
2026-10-13 14:20:02 +08:00
sganggs
a1f0d1bb6e
0.2.6-dev: merge claude/r37-impostor — GitHub #542 : impostor boxes from each skeleton's measured clip bounds (idle core, played clips within limits, the rest drawn directly while they play), every slot drawn inside its own scissor, frozen models posed at their clip's first frame, PIXI's pooled batch buffers (no Apple GPU stall from the per-slot flushes); golden: unchanged
...
# Conflicts:
# CHANGELOG.md
# docs/design/client.md
# docs/history/0.2.6.md
2026-10-13 06:30:53 +08:00
sganggs
47004a3651
0.2.6-dev: impostor review follow-ups ( #542 ) — a skeleton stays in the clip-bounds queue only while an actor uses it (the last one destroyed drops its pending clips, the clip in progress and its scratch skeleton; a later actor queues them again), a clip whose sampling throws is recorded as not measurable and drawn directly while it plays instead of counting as empty, and a frozen model's first update counts as posed only when it succeeded; DESIGN §31.6 updated; golden: unchanged
2026-10-13 06:29:20 +08:00
sganggs
d4cdd567dc
0.2.6-dev: the lobby flood test floods in bursts until the server closes the socket and waits for the close with a timeout — on a heavily loaded machine one burst of 600 could be read over more than the 1 s drop window, the socket was never closed and the unbounded wait hung the whole file; golden: unchanged
2026-10-13 06:18:17 +08:00
sganggs
349debb320
0.2.6-dev: merge claude/r37-ui — PR #416 ported (each round start replays the own board's Start clips and landing sounds in deployment order, as the maintainer confirmed from official play; landings on buy / a new board tile [ASSUMED]; one sound per landing, a landing pool that hands the oldest voice to the newest) and PR #552 ported as the optional 「弹药数量」 setting, default off; golden: unchanged
2026-10-13 06:14:01 +08:00
sganggs
3a6ec26127
0.2.6-dev: the co-op browser test skips its one strategy turn only while 跳过 is enabled — since PR #546 the last player still to pick sees it disabled, which a random draft order gives the guest about one time in three; golden: unchanged
2026-10-13 06:13:39 +08:00
sganggs
0ceb6641ec
0.2.6-dev: PR #416 by Cromemadnd — every landing of a round start is heard: prep landing sounds take a voice of their own pool (LAND_VOICES 3, the oldest fading out over 30 ms) instead of being dropped by the battle limiter, which let only the first two of a chain sound since 192 of 210 operators share the 1.41 s b_char_set (Grok's review); per-piece cooldown, SFX volume and mute kept, the battle sounds' limiting unchanged, the generic files fetched ahead when a match view comes up; DESIGN §31.8; golden: unchanged
2026-10-13 05:46:29 +08:00
sganggs
c973c1a1ad
0.2.6-dev: impostor boxes without the setup-pose floor ( #542 ) — a model frozen before its first update (built while stunned without a stun clip, or dead without a death or idle clip) shows its clip's first frame instead of its setup pose, the box's core is the idle clip (looping clips up to 5× it, one-off clips 2×), and PIXI gets a vertex buffer per batch flush (the per-slot scissor's flushes stalled Apple GPUs: 42–58 → 60 fps for 120 units at 1920 × 1080); golden: unchanged
2026-10-13 05:26:04 +08:00
sganggs
461a7747e1
0.2.6-dev: port PR #552 by IceCodeNew — an optional 「弹药数量」 setting (default off: the official HUD has no such number, the maintainer's decision of 2026-10-13) shows an ammo skill's rounds left / magazine under its bar, from the exact b.snap ammo counts; sanitised with the other settings, applied by the field view live, all four language packs, the diagnostics line; the simplified board has no ammo bar; DESIGN §31.9; golden: unchanged
2026-10-13 04:43:39 +08:00
sganggs
231da0efbc
0.2.6-dev: port PR #416 by Cromemadnd — at every round start the own board's pieces replay their Start clip and landing sound one after another in deployment order (the maintainer's confirmation from official play, 2026-10-13), and a purchase or a move onto / across the board plays them too ([ASSUMED], the PR author's account); one sound per landing, idle prep pieces only, the round marked once the view took the sequence, own board only, timers cleared when prep mode ends and on destroy; DESIGN §31.8; golden: unchanged
2026-10-13 04:36:56 +08:00
sganggs
c45d86f70c
0.2.6-dev: impostor slots sized from every clip a unit plays and clipped to themselves (GitHub #542 by @ImPQlc: in a crowd 野鬃's idle flag, 浊心斯卡蒂's S3 flight and 隐现's pistol were cut, offset or left stray pixels) — spine.js measures each skeleton's clips once within a 2.5 ms frame budget, units.js impostorBox covers the setup pose and the played clips (a clip past 4× / 2× of that core is drawn directly while it plays, the slot kept), impostor.js draws each slot's skeleton under a scissor rect of the slot; golden: unchanged
2026-10-13 03:30:48 +08:00
sganggs
77865e6bc2
0.2.6-dev: merge PR #546 by Xinglan233 — the strategy draft enables 跳过 only while another unpicked player remains (finished players stay in the shown order but are not skip targets)
2026-10-13 01:43:55 +08:00
sganggs
1d55c93e3a
0.2.6-dev: merge PR #547 by Xinglan233 — the scene-asset test resolves the repository root with fileURLToPath (on Windows the URL pathname doubled the drive letter)
2026-10-13 01:43:55 +08:00
sganggs
c5925a76fa
0.2.6-dev: the emote fallback browser test blocks the mirror copies under their content-hashed URLs too (/assets/~<hash>/ui/emoticon/…, host bandwidth layer 1); golden: unchanged
2026-10-13 00:19:44 +08:00
sganggs
909abee0b8
0.2.6-dev: the loadout module-card browser test accepts the content-hash segment the served manifest now puts in local-art URLs (host bandwidth layer 1); golden: unchanged
2026-10-12 21:19:41 +08:00
星闌
7db277b327
test: 修复场景资源测试在 Windows 下的路径解析
2026-10-12 20:24:31 +08:00
星闌
c919794724
fix: 禁用最后一个选策略的玩家的跳过按钮
2026-10-12 19:38:19 +08:00
sganggs
79bb26b317
0.2.6-dev: the maintainer's decisions of 2026-10-12 — the 玩法说明 pages' WebP copies are lossy at quality 90 (25.6 MB of PNG → 4.2 MB; lossless stays a GUIDE_WEBP_MODE away) and /healthz?traffic=1 answers the counters to a loopback or private-network client only (a public visitor, also one a local tunnel or proxy forwards, gets the plain report; TRUST_PROXY applies as for the WebSocket limits); golden: unchanged
2026-10-12 19:09:54 +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
3bb7fef74c
0.2.5-dev: official scenes merge chunks that share a material / lightmap into one mesh at load (draw calls on the 3D board back within budget, e.g. act2autochess_m02 prep 22 → 13); the boss-round real-server test reads the actual random pairing instead of assuming the host on the left half; golden: unchanged
2026-10-12 17:48:31 +08:00
sganggs
409fec90d5
0.2.6-dev: the browser suites load the served manifests' content-hashed URLs (e2e servers wait for the asset index) and check Spine, audio and art through them; the history note of host bandwidth layers 0 and 1 for the next version; golden: unchanged
2026-10-12 16:52:40 +08:00
sganggs
0bb16fd616
0.2.6-dev: brotli (quality 5) on the fly with the existing memory cache for clients that name br, gzip for the rest; separate ETags per encoding (measured against gzip-6: .skel −27 %, data JSON −26 %, vendor −14 %, scripts −5 %) — host bandwidth layer 1.4; golden: unchanged
2026-10-12 16:29:52 +08:00
sganggs
35b09bb63b
0.2.6-dev: the client fetches a served manifest's content-hashed audio as /media/~<hash>/… (download-manager route kept), and the token death sound derived beside charDie drops charDie's hash — host bandwidth layer 1.3; golden: unchanged
2026-10-12 16:25:16 +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
521dd984e7
0.2.6-dev: a background content-hash index of public/assets and public/fonts (SHA-256, 16 hex; cached by path + size + mtime in .cache/asset-hashes.json; Spine models share one hash; SP_ASSET_INDEX=0 turns it off) — host bandwidth layer 1.1; golden: unchanged
2026-10-12 16:20:17 +08:00
sganggs
be8d382c05
0.2.6-dev: traffic counters — HTTP body bytes by category (assets / audio / code / data) and WebSocket wire / payload bytes since the start at GET /healthz?traffic=1, and the page's own downloads (Resource Timing transferSize) as a traffic line in the 问题反馈 diagnostics (host bandwidth layer 0.4); golden: unchanged
2026-10-12 16:05:49 +08:00
sganggs
e2bc005c88
0.2.5-dev: docs — §30 sections renumbered in order after the merges and every reference pointed at its topic; the 0.2.5 CHANGELOG section regrouped under the usual headings (no change to code behaviour)
2026-10-12 16:02:41 +08:00
sganggs
05b0dba8b5
0.2.6-dev: the 19 local 玩法说明 pages get a lossless WebP copy in tools/local-extract (25.6 → 17.4 MB; lossy waits for the owner's comparison) and the guide preloads only the next page (host bandwidth layer 0.3); golden: unchanged
2026-10-12 16:00:08 +08:00
sganggs
8edda589f3
0.2.6-dev: WebSocket permessage-deflate for frames from 1 KB (no server context takeover, 2 KB server window, memLevel 7; a client offering a narrower window connects uncompressed) — host bandwidth layer 0.2; golden: unchanged
2026-10-12 15:57:33 +08:00
sganggs
f1ea116f23
0.2.5-dev: golden matches recomputed on the merged tree — the #523 Touch aggro change and the funnel ports both move full-match scenarios and interact there ( 1 file changed, 11 insertions(+), 11 deletions(-)); roster / bonds / fields / standins / diy equal the branch results
2026-10-12 15:51:45 +08:00
sganggs
3dd2213e47
0.2.5-dev: merge claude/036-sim
...
# Conflicts:
# CHANGELOG.md
# docs/history/0.2.5.md
# test/golden/matches.json
2026-10-12 15:50:42 +08:00
sganggs
a451ddcf6b
0.2.5-dev: 耶拉 S2 (both forms) and 荒芜拉普兰德 S1 keep the operator's own hit next to the drone hit — only drone-only skills skip it (review fix of the funnel port); golden: more funnel scenarios move, attributed in docs/history/0.2.5.md
2026-10-12 15:50:41 +08:00
sganggs
69011d2b54
0.2.6-dev: no BGM download while the music is muted or at BGM volume 0; the wanted track is fetched once it is audible again (host bandwidth layer 0.1); golden: unchanged
2026-10-12 15:45:38 +08:00
sganggs
9b37a68fcf
0.2.5-dev: 萨卡兹枯朽战士 (and every enemy sharing its death fog) leaves no 污秽侵蚀 when it dies silenced — the owner's official-play recall, against the PRTS / in-game wording ( #470 ); the 调度中心 5 / 6 promotion reward includes 自选 operators of the newly reached tier ( #515 , after research; the owner's decision); golden: unchanged
2026-10-12 15:24:07 +08:00
sganggs
a8ff5e7c1d
0.2.5-dev: merge claude/036-touch
...
# Conflicts:
# CHANGELOG.md
# docs/history/0.2.5.md
2026-10-12 15:00:10 +08:00
sganggs
bb88031256
0.2.5-dev: merge claude/036-scene
...
# Conflicts:
# CHANGELOG.md
# docs/history/0.2.5.md
2026-10-12 15:00:10 +08:00
sganggs
537b1ec517
0.2.5-dev: merge claude/036-ui2
...
# Conflicts:
# docs/history/0.2.5.md
2026-10-12 14:59:34 +08:00
sganggs
d482fbb8ba
0.2.5-dev: official battlefield scenes on the 3D board — a local fetch / extract step for the season scene bundles, per-field scene rendering with the metal board as fallback, the full bundle can include the extracted scenes and setup can fetch them (--scenes); nothing official is stored in the repository (PR #533 by @andrew05060414, ported; the owner's decision of 2026-10-12); golden: unchanged
2026-10-12 14:59:20 +08:00
sganggs
a3e8460bb0
0.2.5-dev: an optional 「官方伤害数字」 setting (default off) shows only the numbers the official game shows per the PRTS red-number rule ( #412 , the owner's decision of 2026-10-12); a small link to the project's GitHub repository on the title page ( #543 ); golden: unchanged
2026-10-12 14:59:20 +08:00
sganggs
37e0fffb34
0.2.5-dev: the 外勤医疗 (Touch) reserve medic takes the initial aggro order of PR #523 and its detail opens in the preparation phase (PR #523 by @YinqiMargatroid, ported; the owner's decision of 2026-10-12); golden: one more scenario moves (named in docs/history/0.2.5.md)
2026-10-12 14:59:19 +08:00
sganggs
e0f3771821
0.2.5-dev: 驭械术师 normal attacks keep the operator's own hit plus one drone hit, the drone multiplier and per-target map reset on redeploy, 洛洛 S2 keeps its lock until a kill or the skill ends (PRs #537 / #536 / #535 by @Xinglan233, ported); hit tiles use the official round-half-to-even with an edge inset (PR #520 by @Cloudnyco, ported); bots softly avoid living teammates' opening factions until they are eliminated (PR #518 by @IceCodeNew, ported with changes); golden: 43 more scenarios move, each named in docs/history/0.2.5.md
2026-10-12 14:45:01 +08:00
sganggs
52b70434d0
0.2.5-dev: a restore-defaults loadout sync is never overwritten by an older in-flight sync (PR #540 by @Xinglan233, ported); importing a loadout with ops is refused before writing when the DIY data is missing (PR #538 by @Xinglan233, ported); the player package's package.json keeps only scripts whose files ship ( #531 ) and its docs link unshipped files to the release tag on GitHub ( #530 ); golden: unchanged
2026-10-12 14:45:01 +08:00
sganggs
7fd0478dc0
0.2.5-dev: merge PR #517 by 星闌 — chore: 根据 PR 标题添加类型标签 ( #239 )
2026-10-12 14:08:09 +08:00
sganggs
6e8103e733
0.2.5-dev: merge PR #519 by Cloudnyco — detmath powi: a zero base keeps Math.pow's exact results ((-
2026-10-12 14:08:09 +08:00
sganggs
8d59ad3ef9
0.2.5-dev: merge PR #534 by Andrew Wang — local-extract: derive the board normal map from both layouts
2026-10-12 14:08:09 +08:00
sganggs
c438323596
0.2.5-dev: merge PR #524 by xcdoge — 敌方血条偏高:头顶高度按"原点以上的高度"ç
2026-10-12 14:08:09 +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
Andrew Wang
b92a0bf3c2
local-extract: derive the board normal map from both layouts a client holds — BC5 (R = X) and DXT5nm (A = X, R = 1), read as Unity unpacks them (x = R·A); a client with the older map_autochess bundle got Z = 0 everywhere and a grey 3D board
2026-10-11 19:30:10 -04:00
xcdoge
7b4f512ce9
敌方血条偏高:头顶高度按"原点以上的高度"算(bounds.y + bounds.height),而不是包围盒高度
...
玩家反馈:逐腐兽的血条明显偏高。
原因:单位血条/名字牌的头顶高度用的是 spine setup-pose 包围盒的**高度**(units.js headTilesForUnit 里
`bounds.height × 1/320 × 模型系数 × 0.92`)。这个公式默认包围盒是**脚锚定**的 —— 大多数敌人确实如此
(猎狗pro y=−3.7、大鲍勃 y=−2.6,height 与"脚以上高度"几乎相等)。但有些模型的**原点在身体中间**:
逐腐兽的包围盒是 y=−404.7 / height=722.6,锏是 y=−798 / height=1183 —— 对它们,包围盒高度比可见顶端多出
大半个模型,于是血条被顶到上限 2.2 格(非 Boss)之上,看起来就是"明显偏高"。
改法:定位改用**原点以上的高度**(`Number.isFinite(b.y) ? b.y + b.height : b.height`,仍按 20…900 夹取)。
同时把这段计算从 UnitView 内联代码提成一个纯函数 `headTilesForUnit()`(放 units.js,紧挨 UNIT/EL_BAR 常量),
入参只有 isEnemy / isBoss / spineShown / bounds / modelK / modelKY,便于直接测;UnitView 仍然保留
"没显示 spine 就不看模型"的短路语义。spine.js 的 `height` getter 语义不变(别处也用它,例如替身的纵向拉伸)。
影响面(用真实 bounds 扫过 167 个有模型数据的敌人):
逐腐兽 / 疯狂的逐腐兽 1.85 → 0.81 格(降 1.03)
锏(Boss) 2.59 → 1.11 格(降 1.48)
萨卡兹大剑手 / 组长 1.54 → 1.23 格(降 0.31)
枯朽之种 0.72 → 0.55、萨卡兹百夫长 1.51 → 1.34、妖怪MKII 0.71 → 0.55
其余 103 / 167 个敌人的变化 ≤ 0.02 格(脚锚定模型几乎无感)
测试:
test/render/bar-head.test.js(新增 5 条):用真实的逐腐兽 / 猎狗pro / 大鲍勃 / 锏 包围盒断言新公式、
夹取上限、以及三个回退分支(无 bounds 用 chibi 余量 × 系数、Boss 无模型用 2.2、干员与召唤物用固定余量),
并做源码断言把"y + height"这条规则钉住。
test/render/playtest6-enemies.test.js:两条 prefab 测试的期望值原本写死 `390 × …`(合成夹具的 bounds 是
y=−150 / height=390,即当年就把这个 bug 当成了正确行为),现在改为从**被测 view 自己的 bounds** 推导
(240 而不是 390),夹具本身不动。
test/render 全量 552 项 / 546 通过 / 0 失败;test/ui + test/render 1279 项 / 1265 通过 / 0 失败。
未触碰 server/sim,test/golden 无变动。
2026-10-11 22:49:56 +08:00