Skip to content

Polish finish-pass + audio crackle fixes#47

Merged
xConde merged 3 commits into
mainfrom
feat/polish-finish-pass
Jun 14, 2026
Merged

Polish finish-pass + audio crackle fixes#47
xConde merged 3 commits into
mainfrom
feat/polish-finish-pass

Conversation

@xConde

@xConde xConde commented Jun 14, 2026

Copy link
Copy Markdown
Owner

Closes the 1.0 polish punch-list (from a code-grounded 11-dimension audit — no P0 blockers found) plus a two-pass fix of the audio crackling. Full suite: 8497 passed / 0 failed / 1 skipped. Build + lint clean.

⚠️ Merge gate — needs a human pass first

  • Listen to the audio. Every audio fix is diagnosed from code + verified by build/lint/suite + a 4-lens review swarm — but nobody has heard it. Confirm the crackle is gone (combat SFX, hub/combat/boss music) and nothing new clicks.
  • Play a run. The finish-pass shifted the gold economy + difficulty baseline (conservative safety nets, but unplaytested). Validate the A0–A5 ramp feels right and a run can't get gold-starved.

Finish-pass (commit f2aed6c)

Boss / arc: Nova Sovereign shield dome re-creates after break+regen; orbiting shards animate; enrage emissive telegraph; distinct death VFX; banner mechanic subtext; per-Act-3-boss epilogue variants. WYRM_ASCENDANT intro banner + eye-glow tint.
Combat / content: Heavy Fog (ENEMY_SLOW) reworked to a fractional-movement accumulator so it actually affects 1-tile movers (mirrored in forward-sim, finite-clamped projection). Card copy fixes (SALVAGE / CONDUIT_BRIDGE / MORTAR_BARRAGE / DETOUR); ENERGY_SURGE rarity; ARCHITECT upgrade copy.
Run flow / meta: event-death routes to run summary (no stranded empty map); endless mode wired as a post-victory continuation (single-run invariant preserved); A14 event-node reduction made effective; profile rank ceiling reachable; dead campaign achievements filtered; currency glyph in run nav; dead start viewMode removed.
UX / a11y: tower-sell feedback; hand-stuck nudge covers gold-exhausted; tutorial explains run-persistent gold; negative gold delta; body.reduce-motion applied on startup + fallbacks across reward/HUD/tutorial/act-transition/event/summary; colorblind enemy-dot shapes.
Balance (conservative, unplaytested): minimum encounter starting-gold floor (anti-soft-lock); per-wave streak-bonus cap. Mortar placerLevel serialized; restore error-path disposes meshes.
Copy / dead-UI: "Ascent Complete" → "Run Complete"; Editor nav link dev-gated; landing version string.

Audio crackle fixes (commit 0cc017b)

SFX bus: master limiter (no combat clipping); click-free attack envelopes; ramped volume/mute (no zipper click).
Music bus: bass attack + bar-aligned release (per-bar click gone); stopMusic() now stops oscillator nodes (fixes zombie pads/bass re-emerging under the next theme); cancelScheduledValues on crossfade/volume restore; generation-guarded teardown; background-tab scheduler clamp (no beat burst on refocus); oscillator-disconnect leak fixes; exponential pluck decay.

Deliberately not done (flagged, not bugs)

  • Pad gain scales with chord size (3-note chord = 3× padGain) → compressor pumps on crossfade. "Fixing" it makes the music quieter than tuned — a mix call for a human ear, left alone.
  • fadePadOut anchor finding — real in theory, inert at the shipped 70–110 BPM tempos; skipped to avoid a riskier cancelScheduledValues change.
  • Audio changes have no new dedicated specs (covered by existing audio suite + build/lint); worth adding as follow-up.

🤖 Generated with Claude Code

xConde and others added 2 commits June 14, 2026 12:45
… lifecycle/race fixes

SFX bus (audio.service.ts):
- Add a DynamicsCompressor limiter on the SFX master so simultaneous combat
  voices no longer sum past 0 dBFS and clip.
- Give every tone/noise envelope a short clamped attack ramp (no onset click).
- Ramp master gain on setVolume/toggleMute instead of writing .gain.value
  directly (no click when adjusting volume or muting mid-sound).

Music bus (music.service.ts):
- Bass drone now ramps in and fades out at the bar boundary instead of an
  instant full-gain start + immediate osc.stop (removed the per-bar click and
  the lookahead-scheduler early cut-off).
- stopMusic() now tears down oscillator nodes (deferred on a fade), fixing
  zombie pads/bass that re-emerged when the next theme restored master gain.
- crossfade/setMusicVolume cancelScheduledValues before restoring level so a
  pending stop-fade can't silence the incoming theme.
- Generation-guarded deferred teardown so a fast theme round-trip can't tear
  down the freshly restarted theme.
- tick() clamps the scheduler forward when behind (no beat burst on tab refocus).
- Disconnect pluck + pad oscillators on stop; exponential pluck decay.

Verified: production build + lint clean; full suite green. Manual listen pending.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…1y, balance, copy

Closes the 1.0 polish punch-list from a code-grounded audit (no P0 blockers
found; this addresses the confirmed P1s + the "looks-unfinished" band).

Boss / arc:
- Nova Sovereign shield dome re-creates after break+regen; orbiting shards
  animate; enrage emissive telegraph; distinct death VFX; mechanic banner
  subtext; per-Act-3-boss epilogue variants. WYRM_ASCENDANT gets an intro
  banner + eye-glow status tint.

Combat / content:
- Heavy Fog (ENEMY_SLOW) reworked to a fractional-movement accumulator so it
  affects 1-tile movers (mirrored in forward-simulation, clamped to a finite
  projection rate). Card description/flavor corrections (SALVAGE, CONDUIT_BRIDGE,
  MORTAR_BARRAGE, DETOUR); ENERGY_SURGE rarity; ARCHITECT upgrade copy.

Run flow / meta:
- Event-death now routes to the run summary (no more stranded empty map).
- Endless mode wired as a post-victory continuation (preserves the single-run
  invariant). A14 event-node reduction made effective. Profile rank ceiling
  reachable; dead campaign achievements filtered; currency glyph in run nav;
  dead 'start' viewMode removed.

UX / a11y:
- Tower-sell feedback; hand-stuck nudge covers gold-exhausted; tutorial explains
  run-persistent gold; negative gold delta. body.reduce-motion applied on
  startup + fallbacks across reward/HUD/tutorial/act-transition/event/summary;
  colorblind enemy-dot shapes.

Balance (conservative safety nets, unplaytested):
- Minimum encounter starting-gold floor (anti-soft-lock); per-wave streak-bonus
  cap. Mortar placerLevel serialized; restore error-path disposes meshes.

Copy / dead-UI: "Ascent Complete" → "Run Complete"; Editor nav link dev-gated;
landing version string. Boss-banner flash() + ForwardSim/Profile/App specs
updated to match.

Full suite: 8497 passed / 0 failed / 1 skipped. Build + lint clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Jun 14, 2026

Copy link
Copy Markdown

Deploying novarise with  Cloudflare Pages  Cloudflare Pages

Latest commit: 07b9e4b
Status:⚡️  Build in progress...

View logs

resolvedCards (card-draft) and relicCards (reward-screen) were getters that
allocated a fresh array of fresh objects on every access, and their *ngFor had
no trackBy. Every change-detection pass therefore gave Angular all-new item
identities and it rebuilt each card's DOM, replaying the entrance animation.
Idle screens never re-run CD so it was invisible — but holding a key (e.g.
Space on the victory screen) fires auto-repeat keydown events, one CD cycle
each, producing an unbounded flicker of the reward cards.

- Memoize both getters on their input array reference so they recompute only
  when the input actually changes (works under both template binding and the
  direct-set test setup, unlike ngOnChanges/ngOnInit).
- Add trackBy (trackByCardId / trackByRelicId) so identity stays stable even if
  a new array arrives.
- Specs: stable reference, recompute-on-change, trackBy keys.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@xConde xConde merged commit cdf15d4 into main Jun 14, 2026
1 of 2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant