Overview
Peril Dice is a multiplayer elimination game where each player selects numbers before a die is rolled. If the peril player’s number is rolled, they lose a life. Players are eliminated when they reach zero lives.
🔧 Features
✅ Player System
Max players: 10
Each player starts with 3 lives
Players can Join, Leave, or mark themselves Ready
The first player to join gets a Start Game button
The owner can join the game and also has a special Owner menu
🎲 Dice Scaling
Dice type is automatically chosen to ensure at least 3 picks per player
Dice types supported: d6, d12, d20, d30
Player Count Dice Type
1–2 d6
3–4 d12
5–6 d20
7–10 d30
🧍 Test Players
Owner can add/remove test players (bots)
Test players rez stat floaters at offset positions to prevent overlap
Floater objects follow players and update in real time
🪟 HUD & Stat Floaters
Players receive a floating HUD showing:
Player name
Lives
Picks
Peril status or game state
📦 Modular Architecture
Separated scripts:
Main Controller: Handles core game logic
Dialog Handler: Manages pick dialogs
Dice Selector: Returns dice type based on player count
Stat Float Manager: Rezzes and updates floaters
Stat Float Object: Displays floating text per player
🕹️ Game Flow
Players touch the controller object to join the game
Once 2+ players have joined, the first player gets the option to Start Game
Dice type is selected automatically
Each player is prompted (in order) to select 3 numbers
After all picks are made:
The dice is rolled
The result is compared to each player’s picks
If the peril player’s number is rolled or no one picked it, the peril player loses a life
The system checks for eliminations and starts the next round
🧰 Admin Controls
Owner can:
Join or leave the game
Open a special Owner menu
Add/remove test bots
Reset the game
Debug current state (optional)
Issue Identified:
The main issue was that the floater was showing 0 as the player's pick even after they made a selection, and the correct pick was not being reflected in the float.
Steps Taken:
Improved Data Synchronization: We ensured that the picksData list, which holds player choices, was properly updated and synchronized across all parts of the system.
State Serialization: The game state, including updated picksData, was serialized correctly using the serializeGameState() function. This ensured that the floater was aware of the new state whenever a player's pick changed.
Immediate Float Updates: After updating a player's pick, we immediately sent the new game state (gameSync) to all linked objects to update their floats, ensuring the pick was reflected in the UI.
Key Modifications:
Main Peril Dice Controller: We improved the way we updated picksData and immediately synchronized this update with the floater using MSG_SYNC_GAME_STATE.
StatFloat: Adjustments were made to handle receiving and displaying updated pick data, ensuring that picks were displayed correctly on the float after each update.
Dialog Handling: Proper dialogs were shown to players for pick choices, and feedback on their picks was sent back to update the floats in real-time.
Outcome:
The game now correctly updates and displays the player’s picks on their respective floats immediately after making a choice.
The picks are reflected in the logs as well, with the correct updated pick being shown rather than 0.
Final Result:
The issue of picks not being displayed correctly has been resolved, and the flow of data between the scripts (game state synchronization, float updates, etc.) is working as intended.