feat(engine): contextual one-time tips — stall hint + radial teach (Phase I complete) #181

Merged
funman300 merged 1 commits from feat/contextual-tips into master 2026-07-14 01:43:51 +00:00
Owner

Stacked on #180 (branched from feat/whats-new-card; once #180 merges this PR shows only the tips commit). Together they complete Phase I.

Two situation-fired teaches, each shown exactly once

  • Stall tip. 45 s with no board change in an active, started game → info toast pointing at Hint ("Press H" on desktop / "Tap Hint in the bottom bar" on touch). The clock freezes — doesn't reset — while paused or under a modal, and resets on every StateChangedEvent, so only genuine staring triggers it.
  • Radial-menu teach. A player 15 moves into a game who has never opened the radial menu gets the long-press / right-click tip. Opening the radial organically marks the tip done silently — nobody is taught what they already know.

Both flags live in Settings (shown_stall_hint_tip, shown_radial_menu_tip) like shown_achievement_onboarding, and the tips ride the queued InfoToastEvent path — they land in the unified toast stack and never interrupt play.

Tests

5 new — one-shot firing + flag persistence, untouched-deal/won-game suppression, clock reset on state change, engaged-player radial fire, organic-use suppression. Full workspace + clippy green.

With this and #180, Phase I is complete. Remaining redesign backlog: J (keyboard completeness), K (UI scale), L (empty/loading states), M.

🤖 Generated with Claude Code

**Stacked on #180** (branched from feat/whats-new-card; once #180 merges this PR shows only the tips commit). Together they complete Phase I. ## Two situation-fired teaches, each shown exactly once - **Stall tip.** 45 s with no board change in an active, started game → info toast pointing at Hint ("Press H" on desktop / "Tap Hint in the bottom bar" on touch). The clock freezes — doesn't reset — while paused or under a modal, and resets on every `StateChangedEvent`, so only genuine staring triggers it. - **Radial-menu teach.** A player 15 moves into a game who has *never* opened the radial menu gets the long-press / right-click tip. Opening the radial organically marks the tip done silently — nobody is taught what they already know. Both flags live in Settings (`shown_stall_hint_tip`, `shown_radial_menu_tip`) like `shown_achievement_onboarding`, and the tips ride the queued `InfoToastEvent` path — they land in the unified toast stack and never interrupt play. ## Tests 5 new — one-shot firing + flag persistence, untouched-deal/won-game suppression, clock reset on state change, engaged-player radial fire, organic-use suppression. Full workspace + clippy green. With this and #180, **Phase I is complete**. Remaining redesign backlog: J (keyboard completeness), K (UI scale), L (empty/loading states), M. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
funman300 added 2 commits 2026-07-14 01:17:19 +00:00
feat(engine): one-shot What's-new card after updates (Phase I)
Test / fmt (pull_request) Successful in 5s
Test / test (pull_request) Successful in 5m0s
25f1fd27d9
ObtainX updates install silently, so shipped features went unnoticed.
On the first launch where the running release differs from the new
Settings::last_seen_whats_new, a dismissible card summarises the
latest CHANGELOG.md section (embedded; its top version doubles as the
app's release identity — no build-time version plumbing). Internal
sections are dropped and bullets reduce to their bold lead sentence.

Launch beat: splash -> onboarding (first run) -> what's-new -> Home;
spawn_home_on_launch waits on the new WhatsNewPending resource. Fresh
installs never see the card — onboarding completion stamps the current
version silently. The seen-stamp persists on spawn, not dismissal, so
the card can never nag twice.

8 new tests (changelog parsing incl. the real embedded file, upgrade/
seen/fresh-install gating, dismissal). Workspace + clippy green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
feat(engine): contextual one-time tips — stall hint, radial menu teach (Phase I)
Test / fmt (pull_request) Successful in 4s
Test / test (pull_request) Successful in 4m15s
65913de2cb
Two situation-fired teaches, each shown exactly once and recorded in
Settings like shown_achievement_onboarding:

- Stall tip: 45s with no board change in an active, started game
  (clock frozen while paused / a modal is open) points at Hint with
  platform-correct copy (H on desktop, bottom-bar Hint on touch).
- Radial teach: a player 15 moves into a game who has never opened the
  radial menu learns the long-press / right-click gesture. Organic
  radial use marks the tip done silently — nobody is taught what they
  already know.

Tips ride the queued InfoToastEvent path, so they render in the unified
toast stack and never interrupt play. This completes Phase I.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
funman300 merged commit 513dee8fa9 into master 2026-07-14 01:43:51 +00:00
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: funman300/Ferrous-Solitaire#181