7.6 KiB
Onboarding System Implementation Summary
Overview
A comprehensive, non-intrusive onboarding system has been implemented for both Blackjack and Baccarat games. The system provides a great first-time user experience without annoying experienced players.
Components Created (in CasinoKit)
1. OnboardingState.swift
- Tracks first-time user progress
- Manages which hints have been shown
- Persists state to UserDefaults
- Supports tutorial mode (replay hints)
- Game-specific identifiers (separate state per game)
Key Methods:
shouldShowHint(key:)- Check if hint should be displayedmarkHintShown(key:)- Mark hint as seen (persisted)completeWelcome()- Mark welcome sheet as completedstartTutorialMode()/endTutorialMode()- Enable/disable tutorial replayreset()- Clear all onboarding data (for testing)
2. WelcomeSheet.swift
- First-launch welcome screen
- Lists key features with icons
- Two CTAs: "Show Me How" (tutorial) or "Start Playing" (skip)
- Automatically shows game emoji (🃏 for Blackjack, 🎴 for Baccarat)
- Fully localized
3. ContextualTooltip.swift
- In-game hint tooltips
- Appears at the right moment
- "Got it" button to dismiss
- Animated entry/exit
- Automatically marks hint as shown on dismiss
- View modifier for easy integration
4. PulsingModifier.swift
- Visual pulse animation to draw attention
- Optional enhancement for interactive elements
- Configurable color and scale
- Currently available but not actively used (can be added later)
Integration in Games
Blackjack
Welcome Sheet Features:
- Beat the Dealer - Get closer to 21
- Learn Strategy - Built-in hints
- Practice Free - Start with $1,000
- Customize Rules - Change settings
Contextual Hints:
- Betting Zone: "Tap chips, then tap here to bet" (when entering betting phase for first time)
- Deal Button: "Tap Deal to start the round" (after placing first bet)
- Player Actions: "Choose your action based on the hint above" (during first player turn)
Baccarat
Welcome Sheet Features:
- Bet on Player, Banker, or Tie
- Track Patterns - Road maps show history
- Practice Free - Start with $1,000
- Customize Settings - Change table limits
Contextual Hints:
- Betting Zone: "Tap chips, then tap a betting zone" (when entering betting phase for first time)
- Deal Button: "Tap Deal to start the round" (after placing first bet)
- Result Display: "Results appear here, then in the road maps below" (after first round completes)
Settings Changes
Both games now default to more beginner-friendly settings:
| Setting | Old Default | New Default |
|---|---|---|
| Table Limits | Low Stakes ($10-$1,000) | Casual ($5-$500) |
| Starting Balance | $10,000 | $1,000 |
Rationale:
- Lower minimum bet ($5) is less intimidating for beginners
- $1,000 balance creates more meaningful decisions (not too much/little)
- Still allows ~200 hands at $5/hand for good learning experience
- Users can always increase in settings
Bug Fix
Blackjack Late Surrender:
- Fixed inconsistency where
resetToDefaults()set it totruebut Vegas preset overrode tofalse - Now correctly defaults to
falseto match Vegas rules
User Flow
First Launch:
- App loads
- Welcome sheet appears automatically after 500ms delay
- User chooses:
- "Show Me How": Enables tutorial mode, shows contextual hints during first round
- "Start Playing": Skips tutorial, hints still appear once naturally during gameplay
Subsequent Launches:
- Welcome sheet never shows again
- Contextual hints appear once at the right moment
- Each hint only shows once per hint key
- Completely transparent to returning users
Tutorial Mode:
- User can replay tutorial by tapping "Show Me How" on welcome
- All hints re-enabled for that session
- Tutorial mode doesn't persist across app launches
Technical Details
Hint Timing
- Hints are shown with delays using
Task.sleep(for:)on MainActor - Animations use spring duration for smooth transitions
- onChange modifiers trigger hints based on game state changes
Persistence
- Uses UserDefaults with game-specific keys
- Format:
"onboarding.{gameIdentifier}.{property}" - Examples:
"onboarding.blackjack.hasLaunched","onboarding.baccarat.hintsShown"
Thread Safety
- All onboarding state is @MainActor
- Safe to use from SwiftUI views
- No threading concerns
Documentation Updates
Blackjack README
- Added "First-Time User Experience" section at top of features
- Documents welcome sheet, tutorial mode, and contextual hints
Baccarat README
- Added "First-Time User Experience" section at top of features
- Same structure as Blackjack for consistency
CasinoKit README
- New "Onboarding & Tutorials" section with full API documentation
- Code examples for WelcomeSheet, ContextualTooltip, OnboardingState
- Updated file structure to show new components
- Added Blackjack to "Apps Using CasinoKit" list
Best Practices Followed
✅ Non-intrusive: All onboarding is skippable ✅ One-time only: Hints never show twice (unless tutorial mode) ✅ Right moment: Hints appear contextually, not all at once ✅ Short & visual: Messages are concise with icons ✅ Localized: All strings use String Catalog ✅ Accessible: Uses standard SwiftUI components ✅ Persistent: User's progress is saved ✅ Game-specific: Each game has independent onboarding state
Testing Recommendations
Manual Testing:
- Fresh install: Delete app, reinstall, verify welcome sheet appears
- Tutorial mode: Tap "Show Me How", verify hints appear in sequence
- Skip mode: Tap "Start Playing", verify hints still appear once naturally
- Second launch: Relaunch app, verify welcome doesn't show again
- Settings reset: Check if onboarding can be reset (could add to settings)
Reset for Testing:
Add this to a development menu if needed:
Button("Reset Onboarding") {
gameState.onboarding.reset()
}
Future Enhancements (Not Implemented)
These could be added later if desired:
-
Progressive discovery hints: Tips after 5/10/20 hands
- "Enable card counting in settings" (Blackjack)
- "Side bets offer bigger payouts" (both games)
-
Onboarding analytics: Track which hints are most helpful
-
User-requested replay: "Show tutorial again" in settings
-
Pulsing hints: Use PulsingModifier on interactive elements during tutorial
-
Accessibility announcements: Post VoiceOver announcements for key moments
Files Created
CasinoKit/Sources/CasinoKit/
├── Models/OnboardingState.swift
└── Views/
├── ContextualTooltip.swift
├── WelcomeSheet.swift
└── PulsingModifier.swift
Files Modified
Blackjack/
├── Models/GameSettings.swift (defaults changed, bug fix)
├── Engine/GameState.swift (added onboarding property)
└── Views/Game/GameTableView.swift (integrated onboarding UI)
Baccarat/
├── Models/GameSettings.swift (defaults changed)
├── Engine/GameState.swift (added onboarding property)
└── Views/Game/GameTableView.swift (integrated onboarding UI)
README Files:
├── Blackjack/README.md
├── Baccarat/README.md
└── CasinoKit/README.md
Conclusion
The onboarding system provides a polished first-time user experience that:
- Helps new users understand the game quickly
- Never annoys experienced players
- Maintains the premium feel of the apps
- Follows iOS best practices
- Is fully reusable for future casino games
All code follows the project's Swift/SwiftUI guidelines, uses design constants, and includes proper accessibility support.