Commit Graph

111 Commits

Author SHA1 Message Date
Brian Fertig 3fcfbcc921 feat: add speech visualizer and emotion-driven audio cues
- Introduce a canvas-based audio visualizer overlay on opponent portraits that activates during speech playback
- Update `SpeechQueue` to support `onStart` and `onEnd` callbacks for hooking into audio events
- Modify `Portrait` to trigger the visualizer with emotion-specific colors (blue for intro, green for happy, red for upset)
- Add `speech` metadata to `opponents.json` for Ethel and Bernie, defining available intro/happy/upset audio clips
- Ensure proper cleanup of visualizer state and resources on portrait destruction
2026-05-22 19:10:36 -06:00
Brian Fertig f6a4a3fb5d feat: add speech queue system and update audio configuration
- Implement `SpeechQueue` to manage opponent dialogue clips
- Add `speech` configuration to opponent data (Cy-Bro, Victor, Croc) with intro, happy, and upset states
- Trigger random speech clips in `Portrait.js` based on emotion and a 60% probability
- Play intro speech clips when opponent portraits are created
- Update `MusicPlayer` volume to 0.15 and clean up formatting/whitespace
2026-05-22 16:35:46 -06:00
Brian Fertig 4b0551c3cd feat(hearts): enhance card sorting, drag interaction, and pass animations
- Sort player's hand by suit and value for consistent layout
- Implement drag-to-sort functionality for the local hand with visual feedback (slot indicators, card displacement, play zone highlighting)
- Refactor pass confirmation to include multi-phase animation: outgoing cards fly to target, incoming cards animate in from source, flip to reveal, and settle into sorted positions
- Add background to hearts broken indicator for better visibility
- Update card interaction handlers to support both click and drag events
2026-05-21 23:29:52 -06:00
Brian Fertig 3cea4f10b6 feat: add Hearts card game with AI opponents
- Implement Hearts game logic (HeartsLogic.js) with classic rules: passing, trick-taking, scoring, and moon-shooting mechanics
- Add AI opponent logic (HeartsAI.js) with heuristic-based card selection for passing and playing
- Create HeartsGame.js Phaser scene with full UI: card rendering, animations, trick collection, score tracking, and game flow
- Register Hearts in game registry as a 4-player card game
- Integrate Hearts into game routing and menu dispatch
2026-05-21 21:28:31 -06:00
Brian Fertig 4644b8e3af refactor: implement dynamic track layout for overflowing trains
- Replace fixed `TRACK_PITCH` tiling with `computeTrackLayout()` to dynamically fit tiles within track bounds
- Add `tileHalfW()` helper to correctly calculate width for double vs. single tiles
- Add truncation marks ("+N«") when the tile count exceeds visible track space
- Update marker placement, flash effects, and next-tile positioning to use the new dynamic layout coordinates
- Adjust score badge positioning to align relative to portrait radius
2026-05-21 20:52:00 -06:00
Brian Fertig ed7da9fcf0 feat: add railway tracks and score badges to Mexican Train game
- Implement `paintRails()` to render decorative railroad ties and rails along player tracks
- Add `updateScoreBadges()` to display animated score circles for each player with color-coded borders based on score thresholds
- Fix double tile highlighting logic to correctly identify and style open doubles
- Update tile rendering to respect double tile orientation (vertical vs horizontal)
- Adjust track background colors for better visual contrast
2026-05-21 20:38:55 -06:00
Brian Fertig 7602da4cbe feat: improve Mexican Train UI with boneyard interaction and readability
- Add interactive boneyard pile with click-to-draw functionality and animations
- Display opponent hand counts as mini-domino dots next to portraits
- Apply background padding to all UI text elements for improved readability
- Refactor draw animations to support both human and AI tile drawing from the boneyard
2026-05-21 20:09:15 -06:00
Brian Fertig f1fc560cd1 feat: add Mexican Train game with AI and enhanced roulette effects
- Implement Mexican Train game logic, AI opponent, and Phaser UI scene
- Register Mexican Train in server game registry and client dispatch tables
- Add roulette spin sound effect and improved win/lose animations with fireworks
- Update preload scene and sound registry to support new audio assets
2026-05-21 19:43:54 -06:00
Brian Fertig f8d406ab4e feat: enhance Craps roll results with sequential badges and fireworks
Adds animated "Win!" or "Lose" badges that appear sequentially for each player after a roll, accompanied by sound effects. Introduces a colorful fireworks particle animation for wins. Adjusts dice landing positions for better visibility and removes redundant emotion/sound calls in favor of the new sequential result display.
2026-05-21 00:12:02 -06:00
Brian Fertig 327d3d7019 feat: animate AI chip placement in Craps
Adds a staggered slide-and-fade animation for AI bets in Craps, making chips appear to fly from each player's seat to the felt. Updates `renderAiBets` to accept an `animate` flag and triggers the effect only during the betting phase. Removes the call from `beginRound` to avoid redundant rendering.
2026-05-21 00:04:21 -06:00
Brian Fertig 73f50e2106 feat: add Craps AI improvements and new Roulette game
Implements a fully playable Roulette game with American double-zero rules, a spinning wheel animation, and a heuristic AI that assigns distinct betting personalities to opponents. Adds colored identity rings to player portraits in both Craps and Roulette for better visual distinction. Updates Craps to render AI bets directly on the felt with color-coded chips and names, and adjusts dice landing positions.
2026-05-20 23:59:43 -06:00
Brian Fertig 8a801b0f05 feat: add animated emotion feedback to opponent portraits
Introduces pulsing box-shadow animations to opponent portraits to provide visual feedback during gameplay. Opponents now display "happy" (green pulse) or "upset" (red pulse) emotions in response to specific game actions across Go Fish, Phase 10, and Skip Bo. Includes new video assets for Victor and updated sprite sheets.
2026-05-20 21:11:06 -06:00
Brian Fertig 2ee763fb7a feat: add single-player Craps game with AI opponents
Introduce a complete Craps implementation featuring a Phaser-based UI,
deterministic game logic, and heuristic AI players.

Key changes:
- CrapsLogic.js: Pure-state rules engine handling Pass/Don't Pass, Place,
  Come/Don't Come, Field bets, odds, and full resolution logic.
- CrapsAI.js: Stateless AI personalities (conservative, balanced, aggressive,
  gambler) derived from player names to drive betting behavior.
- CrapsGame.js: Phaser scene with animated dice rolls, chip tray, dynamic
  bet zones, portrait-based opponents, and persistence via profile API.
- Wire Craps into the game registry, main scene loader, and GameRoom dispatcher.
2026-05-20 20:16:15 -06:00
Brian Fertig cc6544f44e feat(gofish): add matches panel and refill animations
- Add a "Matches so far" panel to the HUD that tracks paired ranks and remaining matches.
- Introduce `animateRefill` to visually animate cards flying from the pool to an empty hand.
- Refactor turn flow to use `playRefillsThenFinish` for sequential refill animations after pairing or empty-hand draws.
- Update `GoFishLogic` to capture refill events in `lastAsk.refills` for the animation system.
2026-05-20 19:27:11 -06:00
Brian Fertig fcee81a9d6 feat: enhance GoFish and Parchisi game UX with initial pair animations and pawn movement hints
- GoFish: Display animated banners when players are dealt starting pairs at the beginning of the game.
- Parchisi: Add pulsing glow and expanding ripple visual cues to indicate movable pawns.
- Parchisi: Implement click-outside dismissal for pawn selection highlights to improve interaction clarity.
2026-05-20 18:57:58 -06:00
Brian Fertig 9c3774fb1f refactor: remove multiplayer and Socket.IO in favor of single-player AI games
- Remove Socket.IO dependency, server multiplayer logic (lobby, room management), and client-side socket service
- Replace multiplayer-only flow with single-player AI gameplay; add `OpponentSelectScene` for AI configuration
- Simplify game registry to use `minOpponents`/`maxOpponents` instead of `supportsMultiplayer`/`multiplayerOnly`
- Update game registration to remove multiplayer flags and adjust `games` table schema to hardcode `supports_multiplayer = 0`
- Remove `SOCKET_IO_CORS_ORIGIN` from environment configuration
- Update documentation to reflect single-player architecture and simplified game creation process
- Fix minor UI issues: add width to buttons in auth scenes, fix auth listener cleanup in LandingScene, restore DOM layer visibility in Modal
2026-05-20 18:57:41 -06:00
Brian Fertig afd8c78253 Refactor Uno game state transitions to use callback-based animation sequencing
- Update `handleLogEffects` to accept an `onDone` callback, ensuring post-state logic (unblocking input, updating UI) only executes after visual effects complete.
- Introduce `animateForcedDraw` to display a prominent "+N" banner and animate card draws with custom timing parameters.
- Refactor `animateBatchDraw` to support configurable `flyDuration` and `stagger` via a `timing` object.
- Apply the new callback pattern across all move execution paths (`playCard`, `drawCard`, AI moves) to prevent race conditions and ensure consistent animation flow.
2026-05-19 20:34:37 -06:00
Brian Fertig 6b819e00b0 add visual skip overlay for skipped opponents
- Create a red "X" overlay that animates onto the portrait of a skipped opponent
- Implement `showSkipOverlay` to render the effect using Phaser DOM objects
- Trigger the overlay when a player is skipped to provide clearer visual feedback
2026-05-19 20:17:23 -06:00
Brian Fertig d6588405a4 enhance uno game animations and emotional feedback
- Add opponent emotion reactions (upset/happy) for specific game events like skips, draws, and wild card plays
- Differentiate animation durations and effects between local player and opponents
- Implement showcase animation for opponent's played cards with a grow/shrink effect
- Adjust card fly and stagger timings for opponent animations to improve visual clarity
2026-05-19 20:01:22 -06:00
Brian Fertig 85dff94613 feat(uno): enable drag-and-drop playing of cards to discard pile
- Add visual highlight for discard zone when card is dragged over it
- Implement logic to detect valid plays against current discard pile
- Trigger play execution (including wild color picker) when dropped on discard
- Refactor `endCardDrag` to handle both reordering and playing paths
2026-05-19 19:35:51 -06:00
Brian Fertig f829ecf93b feat(uno): implement drag-to-sort for player hand
- Add `pointermove`, `pointerup`, and `pointerdown` handlers for smooth card dragging
- Implement visual feedback including card tilt, scale, and insertion slot indicators
- Update hand array order and re-render layout upon drop completion
- Refactor hover/click logic to support both interaction modes
2026-05-19 19:28:18 -06:00
Brian Fertig 3d5c49d325 feat: add Uno card game support
- Import and register UnoGame in the frontend client
- Add Uno to the game slug dispatch mapping in GameRoomScene
- Register Uno in the server game registry with card game configuration
2026-05-19 19:21:12 -06:00
Brian Fertig cc75ff1862 fix: correct Go Fish card animation positioning and face-up state
- Use existing card sprites for target hand animations to prevent duplicates
- Respect `handFaceUp` layout setting when flipping target cards
- Calculate precise destination coordinates for drawn cards based on hand axis and index
- Simplify `animateFishDraw` signature to accept explicit destination coordinates
- Fix tween completion logic to properly trigger callbacks
2026-05-19 18:17:37 -06:00
Brian Fertig 27c13a57d4 Animation improvements 2026-05-19 18:07:03 -06:00
Brian Fertig 975ee6ea25 refactor: fix card visibility and animation sequence in GoFish
- Pass live sprites from `animateAsk` to `animatePairedCards` to prevent premature destruction.
- Update `animateAsk` to fan collected cards into the asker's show zone instead of hiding them.
- Update `animatePairedCards` to accept pre-existing sprites for seamless pair animation.
- Remove `canAsk` check in `applyAsk` to ensure turn advances correctly after any ask.
2026-05-18 23:56:59 -06:00
Brian Fertig b63bf1b651 refactor: enhance GoFish ask animation with fishing line effect
Refactor the ask sequence in GoFishGame.js to introduce a visual fishing line
animation between the asker and target before revealing the result.

Key changes:
- Extract target slot/layout calculations outside conditional blocks for clarity.
- Add `animateFishingLine` method to draw a dynamic hook arc with barb that
  extends from asker to target over 1 second.
- Reorganize animation timing: reveal asker's card first, then cast fishing line,
  then handle catch/fail outcomes.
- Simplify catch/fail logic by unifying post-line animation flows.
- Improve visual feedback with staggered card appearances and smoother transitions.
2026-05-18 23:40:26 -06:00
Brian Fertig 55ff4a3e00 feat(gofish): reveal drawn card to local player during go-fish
When the local player picks a card from the scattered pool, the card is now flipped face-up in place for 700ms before flying to their hand. This provides visual feedback on the drawn card. AI draws remain hidden and fly directly to the hand.
2026-05-18 23:31:45 -06:00
Brian Fertig 4364181041 feat(gofish): implement interactive scattered pool for go-fish draws
Replace the static deck pile with a scattered pool of face-down cards in the center of the table. When a player goes fishing, the game now pauses in a 'pick' phase, allowing the local player to click a card or the AI to randomly select one. This adds visual variety and interactive gameplay to the go-fish mechanic.
2026-05-18 23:27:51 -06:00
Brian Fertig 9469440122 Additional Animations 2026-05-18 23:09:06 -06:00
Brian Fertig 53db492c83 feat(gofish): add animated card dealing and pair collection effects
- Implement round-robin card dealing animation from the pool to player hands.
- Add visual feedback for collecting pairs with card placement animations.
- Integrate fireworks particle effects when new pairs are formed.
- Update game logic to track paired cards for animation purposes.
- Improve game flow with staggered animations and delayed state updates.
2026-05-18 22:58:10 -06:00
Brian Fertig dcb8503219 refactor GoFishGame: align portrait/chip positions and add status text background 2026-05-18 22:32:19 -06:00
Brian Fertig d46de05b48 feat: add Go Fish card game with AI and UI
- Implement Go Fish game logic in GoFishLogic.js with state management, turn handling, and pair scoring
- Create GoFishAI.js with memory-based opponent that tracks card distribution and makes strategic decisions
- Build GoFishGame.js scene with Phaser UI including card rendering, seat layouts, animations, and game flow
- Register Go Fish in gameRegistry with 'cards' category and multiplayer support (1-4 players)
- Update GameMenuScene to display 'Cards' column for card games
- Wire up GoFishGame in GameRoomScene slug dispatch and main.js scene registry
2026-05-17 20:56:40 -06:00
Brian Fertig 356a2e98c5 feat: add Chinese Checkers game with 6-player AI and Phaser rendering
- Implement complete game logic (ChineseCheckersLogic.js) with hex board,
  move generation (steps/jump chains), and rule enforcement.
- Add single-ply heuristic AI (ChineseCheckersAI.js) that prioritizes pulling
  laggard pegs forward and entering the target triangle.
- Build Phaser-based UI (ChineseCheckersGame.js) with radial portraits,
  animated peg moves, and turn indicators.
- Register the game in the server registry and frontend routing.
2026-05-17 20:22:19 -06:00
Brian Fertig d9bf0432a6 Button Fix 2026-05-17 19:13:48 -06:00
Brian Fertig e171be7c10 fix: ensure modal buttons render above overlay and add Yatzi playfield background 2026-05-17 18:35:07 -06:00
Brian Fertig 366a6b095b feat: add background music system and improve card game interactions
- Introduce `MusicPlayer` class for in-game music with shuffle, skip, and mute controls
- Add `MenuMusic` utility for background music in menu scenes
- Load music tracks and metadata via `music.json`
- Implement drag-and-drop for SkipBo cards with visual feedback
- Add card flight animations for Phase 10 AI actions and player draws
- Update Phase 10 AI turn timing and reduce delays for smoother gameplay
2026-05-17 16:38:36 -06:00
Brian Fertig 731937bb82 refactor(Phase10Game): remove trailing whitespace and align object properties
- Remove trailing whitespace throughout the file.
- Align object properties and ternary operators for improved readability.
- Adjust button positioning offset in staging laydown UI.
2026-05-17 14:53:01 -06:00
Brian Fertig 238c744e93 refactor(phase10): manage staging buttons via dedicated lifecycle methods
- Extract button creation and destruction into `_createStagingButtons` and `_destroyStagingButtons`.
- Ensure buttons are properly destroyed when staging is cleared, submitted, or when turn conditions change.
- Prevent memory leaks and stale UI state by centralizing button lifecycle management.
- Add piece click sound effect in Backgammon on landing.
2026-05-17 14:44:45 -06:00
Brian Fertig 208645246c feat(phase10): replace static "Lay Down" button with interactive staging area
- Remove the hardcoded "Lay Down Phase" button and `findLaydown` auto-complete.
- Add a dynamic staging area at the bottom of the screen that renders empty slots for each phase group.
- Enable drag-and-drop of hand cards into staging slots to manually build phases.
- Add "Submit Phase" and "Clear" buttons to commit or reset the staged layout.
- Implement validation using `validateLaydown` before submitting.
- Fix Button hit area coordinates to ensure reliable click detection.
- Update status text rendering with a background graphic for better visibility.
2026-05-17 14:37:42 -06:00
Brian Fertig 3e64c2dafd refactor: adjust laid card positions for all players in Phase 10
- Update `laidStart` coordinates for top, bottom, left, and right slots to reposition laid cards
- Changes aim to improve card visibility and spacing during gameplay
2026-05-17 13:33:52 -06:00
Brian Fertig 7b817ea3a4 refactor: reposition player UI elements and add chip rotation for Phase 10
- Update portrait and nameLabel coordinates for top, bottom, left, and right slots to improve layout alignment
- Adjust chip positions for left and right slots to better fit the new UI design
- Add chipRotation property to left and right slot layouts to rotate phase chips appropriately
- Apply chip rotation in makeSeatChip when layout.chipRotation is defined
2026-05-17 13:27:21 -06:00
Brian Fertig a4c8f659ee feat: enable drag-to-discard and drag-to-hit in Phase10
- Allow dragging local hand cards to discard pile or valid hit targets.
- Add visual feedback with action highlights for discard (red) and hit (gold) zones.
- Handle drag state transitions, including settling cards and animating to target.
- Support 'skip' card drag with immediate modal opening.
- Refactor drop target detection and group center calculation for reuse.
- Adjust portrait and button positions for better layout alignment.
2026-05-17 13:15:51 -06:00
Brian Fertig d5a12ae559 feat: add drag-and-drop reordering for Phase10 hand cards
- Implement pointer-based drag handlers for Phase10 player hand.
- Add visual feedback including card scaling, rotation tilt, shadow, and slot indicators during drag.
- Reorder hand array and animate cards to new positions on drop.
- Prevent conflicts by ending active drags during scene transitions or state updates.
2026-05-17 12:59:57 -06:00
Brian Fertig 83ada10456 feat: add drag-and-drop reordering for Phase10 hand cards
- Implement pointer-based drag handlers for Phase10 player hand.
- Add visual feedback including card scaling, rotation tilt, shadow, and slot indicators during drag.
- Reorder hand array and animate cards to new positions on drop.
- Prevent conflicts by ending active drags during scene transitions or state updates.
2026-05-17 12:51:31 -06:00
Brian Fertig 5b65134ecc fix: reposition player chips in Phase10 slot layouts
- Update chip coordinates for bottom, top, left, and right slots to improve visual alignment and prevent overlap with other UI elements.
2026-05-17 12:35:02 -06:00
Brian Fertig fcfff62a15 feat: add sound effects, backgrounds, and enhance OpponentSelect UI
- Introduce `Sounds.js` utility and load new audio assets (dice, cards, chips, casino).
- Play appropriate sound effects in Backgammon, Blackjack, Holdem, Parchisi, Phase10, SkipBo, and Yatzi.
- Add `background-casino.png` and `background-room.png` to PreloadScene.
- Update OpponentSelectScene with new backgrounds, styled title/subtitle pills, and improved Start/Back buttons.
- Enhance opponent selection with gradient backgrounds and shadows via `applyOpponentStyle`.
- Implement `highlightTile` for better visual feedback in option selectors.
- Randomly select a card back for card games in OpponentSelectScene.
2026-05-17 12:34:46 -06:00
Brian Fertig 792fd35fd4 feat: implement auto-pass and draw handling for SkipBo
- Add `isPlayerStuck` and `applyAutoPass` logic to SkipBoLogic.
- Handle stuck players by automatically passing their turn.
- Detect draw conditions when all players are stuck consecutively.
- Update UI to display appropriate messages for auto-passes and draws.
- Pass subtitle text to `showGameOverPanel` for clearer win/loss/draw context.
2026-05-17 11:33:01 -06:00
Brian Fertig 70573a8ddd feat: deselect card on empty space click in SkipBo
- Add pointerdown listener to clear selectedSource and highlights when clicking empty space.
- Improves UX by allowing players to easily cancel card selection.
2026-05-17 11:23:07 -06:00
Brian Fertig a397302942 fix: refine card back rendering and update SkipBo layout coordinates
- Clip diagonal stripes in Phase10 and SkipBo card backs to prevent overflow.
- Adjust slot coordinates for stock, discards, hand, and labels in SkipBo.
- Add background rectangle to SkipBo stock count badge.
- Apply consistent code formatting (spacing) across SkipBoGame.
2026-05-17 11:12:55 -06:00
Brian Fertig 639b37c354 fix: adjust SkipBo slot coordinates for improved layout alignment
- Shift stock, discard, hand, portrait, and label positions for 'bottom' and 'top' slots in `slotLayout`.
- Ensures elements are correctly centered and spaced on the game board.
2026-05-17 10:49:16 -06:00