Skip to content

Modifier-card feedback: play toast + persistent ACTIVE BUFFS panel#46

Merged
xConde merged 7 commits into
mainfrom
feat/modifier-feedback
Jun 14, 2026
Merged

Modifier-card feedback: play toast + persistent ACTIVE BUFFS panel#46
xConde merged 7 commits into
mainfrom
feat/modifier-feedback

Conversation

@xConde

@xConde xConde commented Jun 13, 2026

Copy link
Copy Markdown
Owner

Fixes the reported gap: playing a modifier card (Damage Boost etc.) gave zero feedback — nothing on the board changes, no toast, no indicator, so it felt like nothing happened and you couldn't see what was active.

Two parts

  1. Instant toast on play — any non-tower card (modifier/spell/utility) now surfaces a notification with the card name + effect summary, e.g. "Damage Boost · All towers +25% for 2 waves". Wired via a new onNonTowerCardPlayed callback (CardPlayService stays decoupled from the notification service).
  2. Persistent "ACTIVE BUFFS" HUD panel — a left-column panel listing every active card modifier with its value + remaining duration (waves / turns / charges), derived from CardEffectService.getActiveModifiers() via a new buff-display model. Only player-facing buffs are shown (archetype/keyword sentinels filtered out). Uses a cheap getter (no observable wiring) consistent with the component's other HUD getters.

8316 specs green (+28), lint clean, build clean.

⚠️ Holding merge for visual sign-off — the BUFFS panel placement (left column, below INCOMING) needs your eyes in the running game. Refresh /play, play a Damage Boost, and check: does the toast read well, and is the panel well-placed / not overlapping?

🤖 Generated with Claude Code

Modifier cards (Damage Boost, Range Extend, Rapid Fire, Enemy Slow, Gold
Interest, Shield Wall, …) applied silently — nothing on the board changes, so
the player got zero indication the card did anything or what is currently
active. Two-part fix:

- Instant toast on play: any non-tower card now fires onNonTowerCardPlayed,
  surfacing a notification with the card name + effect summary
  (e.g. "Damage Boost · All towers +25% for 2 waves").
- Persistent "ACTIVE BUFFS" HUD panel: a left-column panel lists every active
  card modifier with its value and remaining duration (waves / turns /
  charges), derived from CardEffectService.getActiveModifiers() via a new
  buff-display model. Only player-facing buffs are shown; archetype/keyword
  sentinels are filtered out.

8316 specs green (+28), lint clean, build clean.

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

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

Copy link
Copy Markdown

Deploying novarise with  Cloudflare Pages  Cloudflare Pages

Latest commit: ff26b5a
Status: ✅  Deploy successful!
Preview URL: https://7d3edb45.novarise.pages.dev
Branch Preview URL: https://feat-modifier-feedback.novarise.pages.dev

View logs

xConde and others added 6 commits June 13, 2026 21:58
…d-card bug

Experience QA (trace every player action → "what do they see?") found one
functional P0 and a class of silent-action / dead-click / no-feedback gaps,
the same flavor as the modifier-card bug.

P0 — elevation-target cards were dead via the UI: onTilePlace guarded on the
terraform-only getPendingTileTargetCard(), so clicking a tile with Raise
Platform / Cliffside / Gravity Well / King of the Hill / etc. pending fell
through to tower placement and silently did nothing. Now routes both terraform
AND elevation cards to resolveTileTarget (guard: hasPendingCard && !selectedTowerType).
Unit specs missed it because they call resolveTileTarget directly.

Feedback added: blocked-play toasts (non-combat play, salvage/fortify/detonate/
epidemic/conduit with no valid target — now validated before energy spend);
tile-target "click a tile" mode banner + active-card dim + End-Turn disabled
while pending; relic/ascension HUD chips now open the pause menu (were dead
clicks); use-item success/failure feedback; upgrade-while-broke toast; terraform/
elevation success toast; card Leak-Block / Orogeny relic / NOVA Sovereign enrage
toasts (+ enrage screen-shake); rest-site upgrade confirmation; archetype buffs
(Cartographer Seal / Labyrinth Mind / Architect / Hive Mind) now show a persistent
chip; tutorial START_WAVE no longer self-dismisses; victory/defeat music fades
under the overlay; stuck-hand text hint.

Event gamble outcomes now show the REAL win/loss: the panel previews the single
seeded RunService roll (previewEventGamble) which resolveEvent then reuses — one
deterministic roll, display == applied result (was a cosmetic Math.random that
could contradict the seeded outcome).

8379 specs green, lint clean, AOT build clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The grid pinned the version string to the bottom row with a 1fr gap, pushing
the title + menu into the upper-middle with dead space pooling below. Switch
the container to flex centre (both axes) and make the version string an
absolute footer so the content block sits dead-centre.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Angular component hosts default to display:inline; the landing host being
inline let the container be sized by content rather than the viewport,
offsetting the centred title + menu to the right. Add :host{display:block;
width:100%} and an explicit container width:100%.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Root cause (confirmed via headless render): .landing-content is a grid with
only rows defined, so its single implicit column was auto-sized to the
intrinsic width of the NOVARISE wordmark (~930px) and anchored at the box's
left edge — pushing every row right of centre even though the box itself was
centred. grid-template-columns: minmax(0, 1fr) pins the column to the box
width so justify-items:center centres the rows (the wordmark overflows
symmetrically). Combined with the earlier host/flex fixes the title screen is
now centred on both axes.

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

Card-play and combat toasts rendered bottom-right, overlapping the R/V/pause
control cluster and the draw/discard/exhaust pile counters. Move the toast
stack to the open band below the End Turn button (top-centre), clear of every
corner cluster on desktop and mobile.

Visual: replace the washed-out 10%-opacity box (no blur) with real glass — a
dark translucent base, backdrop blur, a defined edge, a depth shadow, and a
type-coloured left accent stripe (purple/gold/violet/cyan) for character
without a glow. Slide-in retargeted to a downward motion; mobile width clamped.
Applies to every in-combat toast.

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

Replace the top-center glass toast with a card-shaped notice that rises
from above the hand and fades over its lifetime. Notched angular frame
(clip-path) with an accent edge over a dark interior, matching the card
silhouette language. Accent color keys off toast type. Rise+fade duration
binds to each toast's own duration so the motion spans its full life.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@xConde xConde merged commit 56fde52 into main Jun 14, 2026
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