fix: reduce active celebration workload and restore node and navigation feedback

This commit is contained in:
toshiocn
2026-10-23 16:41:53 +08:00
parent 0cefce44ef
commit 6abbc37399
22 changed files with 277 additions and 80 deletions
@@ -0,0 +1,130 @@
> numberswipe-main@1.0.0 check
> npm run build && npm test && npm run smoke
> numberswipe-main@1.0.0 build
> node build.mjs
Built campaign-200-r2: 200 levels
> numberswipe-main@1.0.0 test
> node --test *.test.mjs
✔ 手机没有浏览器音频接口时,原生播放器仍能播放全部 36 步和六类反馈音 (5.9102ms)
✔ 关闭音效停止播放;再次开启会试听并保存偏好;后台中断停止所有播放器 (0.8733ms)
✔ 延迟通关音在静音或进入后台时取消,不在返回后突然播放 (46.9464ms)
✔ 音频错误可诊断,不再静默吞掉 (0.7341ms)
✔ 所有音频均为非静音 PCM;原版第13步比第1步高一个八度 (37.8488ms)
✔ 教学和组合规则用具体动作及奇偶例子解释,没有未解释的术语 (23.6071ms)
✔ 过关提示同步使用实际播放起点,非请求时间 (0.8329ms)
✔ 过关短句使用用户提供的3秒WAV,不与旧和弦叠加 (2.4877ms)
✔ jingle end, cancellation and playback error restore BGM without restarting (8.08ms)
✔ muted effects never duck BGM and unrelated effect errors cannot end jingle ducking (0.5505ms)
✔ hide and music preference do not revive playback through a late jingle callback (0.7296ms)
✔ BGMB is absent from the runtime manifest and music package (1.0822ms)
✔ merged irregular outlines retain holes and never draw internal unit edges (91.9791ms)
✔ all 200 boards fit four screen budgets with stable safe anchors and real shared entrances (993.2033ms)
✔ guides through every irregular block stay inside its occupied shape (55.1344ms)
✔ visited, conflicting and hinted category cells retain their material identity (17.1667ms)
✔ five font subsets match their manifest and fit the package budget (5.7186ms)
✔ upstream adapter fails closed if the inspected render seams change (2.9204ms)
✔ procedural cushion pixels preserve holes and light the upper bevel without a border (32.5702ms)
✔ visible glyph bounds are centered independently of font ascent and side bearings (2.2832ms)
✔ stage with zero depth casts alpha shadows without painting a solid backing (9.4926ms)
✔ native width-only TextMetrics still centers the rasterized glyph ink (5.6814ms)
✔ fixed channels remain anchored at their block centers after number enlargement (1574.5104ms)
✔ checkpoint ribbons trigger on correct arrival only and never duplicate per frame (5.6473ms)
✔ checkpoint pulse is small, centered in time and settles without looping (0.6263ms)
✔ event batches preserve every landing and sequence but commit only highest audio and haptic (5.1006ms)
✔ completion waits at most 120ms and ignores late audio callbacks (1.0139ms)
✔ light haptics are limited, checkpoint replaces light, and completion adds only one delayed short pulse (1.1484ms)
✔ unsupported graded haptic falls back to one short pulse, never long vibration (0.9185ms)
✔ haptic disable, preview and lifecycle cancellation suppress delayed or expired work (1.7776ms)
✔ late failed haptic requests cannot revive old pulses and ungraded completion falls back once (0.5243ms)
✔ rectangles, concave shapes and hexagons require geometric inward distance without treating internal seams as walls (1.8735ms)
✔ one high-speed native move records all intermediate cells and completion without duplicate final node (225.2218ms)
✔ legal but off-solution moves use public rules, while invalid clues only produce error (107.8661ms)
✔ drag near a previous-block boundary cannot undo; deeper entry can, and undo button remains immediate (118.274ms)
✔ tutorial, redraw, hint and restored saved routes do not generate player feedback (151.5673ms)
✔ pressure and rebound have bounded amplitude and duration (0.8228ms)
✔ interpolation cannot duplicate the same failed-cell event within one native movement (0.4525ms)
✔ nodes are driven by explicit events even when multiple arrive before rendering; at most two ribbons survive (47.005ms)
✔ audio fast moves merge to latest pitch and completion stops the whole four-channel pool (3.1293ms)
✔ settings persist haptic preference independently and chapter cards always use three columns (121.6619ms)
✔ original audio is preserved and high pitches lose energy rather than growing sharper (14.463ms)
✔ empty, partial and wrong routes reveal the first incomplete full segment (3.2962ms)
✔ completion hides the hint; repeat clicks cannot skip; undo and restart return to earlier segments (0.7181ms)
✔ all 200 levels reveal consecutive segments without changing the player path (2441.6873ms)
✔ hint draws skip player edges and mask visited cells on their own layer; compositing is restored (1.7172ms)
✔ parity is a segment anchor; colour is not; flow moves continuously across cells (0.6727ms)
✔ coral teaching ribbon preserves visited masks and offers direction in reduced motion (2.9315ms)
✔ hint rounds shared guide junctions and keeps separate runs disconnected (0.6576ms)
✔ 实际教学关动画:basic (10.2107ms)
✔ 实际教学关动画:walls (1.4202ms)
✔ 实际教学关动画:straight (6.6802ms)
✔ 实际教学关动画:vertical (3.9633ms)
✔ 实际教学关动画:corner (1.5938ms)
✔ 实际教学关动画:colour (0.8024ms)
✔ 实际教学关动画:parity (0.8455ms)
✔ 实际教学关动画:rhythm-door (1.0885ms)
✔ 实际教学关动画:hex (0.8294ms)
✔ 实际教学关动画:unknown-start (1.8172ms)
✔ 200关的组合规则均能找到对应真实教学关 (147.4251ms)
✔ 教学减速,结束停留1秒后自动循环 (8.2263ms)
✔ music loops independently, persists mute and cancels in background (5.8993ms)
✔ old arrows retain distance, rush to endpoint and fresh arrows move at base speed (0.9877ms)
✔ settings have exactly three independent preferences, and hint has its own cue (236.4223ms)
✔ actual fixed numeric node uses checkpoint pitch, final cell uses complete chord (195.7976ms)
✔ selected menu and BGMA loop are stereo PCM WAV with complete musical durations (10.0711ms)
✔ selected runtime WAVs retain the original durations after sample-rate adaptation (28.814ms)
✔ gameplay ambient uses lower scene volume and keeps independent mute and resume behavior (0.753ms)
✔ all 200 levels: valid numeric, parity and direction arrivals play checkpoint pitch; final arrival only completes (31077.6635ms)
✔ drag back and undo button both vibrate lightly; disabling vibration suppresses both (52.4789ms)
✔ haptic cadence is approximately 15 percent denser without changing light or medium grades (1.176ms)
✔ regular and special scale settle at 90ms with a larger special peak (0.1979ms)
✔ rendered undo target and nonnumeric checkpoint animate immediately without adding ribbons (6.4606ms)
✔ quick undo cancels removed node rebound, including last-step removal (1.8244ms)
✔ navigation buttons use the same selection cue and settings include uniform colons (38.8292ms)
✔ early next during confetti cancels warming; settled ceremony reuses its background (174.7924ms)
✔ font corpus includes every settings label including music le glyph (0.6513ms)
✔ first launch goes directly to gameplay (123.2517ms)
✔ resume unfinished route after exit from gameplay (261.6998ms)
✔ resume unfinished route after exit from selection (197.5838ms)
✔ completed level resumes next unfinished, including leaving from cleared screen (142.5187ms)
✔ replaying a cleared level does not replace the unfinished save (123.7502ms)
✔ legacy saves, malformed data and full completion have valid startup targets (97.8607ms)
✔ selection pages expose fifteen cards and fit phone safe areas (336.2497ms)
✔ hint-only frames reuse static UI, and player input invalidates it (77.9032ms)
✔ hint curves are cached and distance lookup is stable at boundaries (1.2382ms)
✔ new-mechanic lesson reuses the board while the continuous cursor advances (69.3608ms)
✔ BGMA stays continuous across level changes and completion redraws (2.4107ms)
✔ subpackage completion never plays a stale scene after hiding, muting, or clearing (0.7081ms)
✔ music load failure is silent and one real resume can retry; muted pending loads stay silent (0.4878ms)
✔ runtime uses supplied WAV hashes and ships music as a subpackage with a small main bundle (181.1113ms)
✔ title is centered and selection settings share the progress and level-range row (350.0215ms)
✔ completion ducks BGMA until jingle ends and next level never restarts it (171.2163ms)
✔ title artwork is a transparent, high resolution PNG packaged locally (4.8826ms)
✔ asynchronous native image load requests a repaint and draws the artwork without a font substitute (0.9964ms)
✔ artwork stays above progress pills and clear of settings; fifteen cards still fit all phone sizes (477.1889ms)
✔ undo button reverses seven played steps as 7,6,5,4,3,2,1 (272.0277ms)
✔ drag reverses seven played steps as 7,6,5,4,3,2,1 (195.1025ms)
✔ completion amplitude is reduced 15 percent while node, undo and restart volumes stay unchanged (1.5768ms)
✔ fast reverse coalesces to the latest descending pitch and cannot replay an old forward note (2.1951ms)
✔ all prepared routes match the immutable level hash and public rules (25.8434ms)
✔ entering next level draws the live board once and preserves the running BGMA player (1930.219ms)
✔ next-board warming advances one item per frame and cancels on deadline, replacement or hide (0.9028ms)
✔ idle material warming never changes the player path or emits sound and vibration (106.5281ms)
ℹ tests 104
ℹ suites 0
ℹ pass 104
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 31744.7934
> numberswipe-main@1.0.0 smoke
> node smoke.mjs
PASS 200/200: r2源文件哈希一致、唯一解、微信发布包触摸通关、撤销/重开/指路、存档/音效设置恢复、前后台切换。