switched timeing configs to Peril_Constants file
This commit is contained in:
parent
5b8b9d0a7b
commit
5816e7cce2
12 changed files with 78 additions and 53 deletions
|
|
@ -41,7 +41,7 @@ integer LISTEN_CHANNEL; // Will be set dynamically
|
||||||
integer listenHandle = -1;
|
integer listenHandle = -1;
|
||||||
|
|
||||||
// Bot timing configuration to prevent dialog system overload
|
// Bot timing configuration to prevent dialog system overload
|
||||||
#define BOT_RESPONSE_DELAY 1.5 // Delay before bot responds to commands
|
// BOT_RESPONSE_DELAY defined in Peril_Constants.lsl
|
||||||
|
|
||||||
// Memory monitoring
|
// Memory monitoring
|
||||||
#define MEMORY_WARNING_THRESHOLD 0.8 // Warn when using >80% of memory
|
#define MEMORY_WARNING_THRESHOLD 0.8 // Warn when using >80% of memory
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,5 @@
|
||||||
|
#include "Peril_Constants.lsl"
|
||||||
|
|
||||||
// ====================================================================
|
// ====================================================================
|
||||||
// Enhanced Link Scanner for Peril Dice Linkset
|
// Enhanced Link Scanner for Peril Dice Linkset
|
||||||
// ====================================================================
|
// ====================================================================
|
||||||
|
|
@ -65,7 +67,7 @@ performFullScan() {
|
||||||
|
|
||||||
// Add delays to prevent spam
|
// Add delays to prevent spam
|
||||||
if (i % 15 == 0) {
|
if (i % 15 == 0) {
|
||||||
llSleep(1.5);
|
llSleep(DELAY_SCAN_LINKSET);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -31,7 +31,7 @@ default {
|
||||||
dbg("📋 [Leaderboard] Leaderboard Communication Script ready! (Virtual Multi-Column)");
|
dbg("📋 [Leaderboard] Leaderboard Communication Script ready! (Virtual Multi-Column)");
|
||||||
|
|
||||||
// Wait for engine to be ready, then register virtual columns
|
// Wait for engine to be ready, then register virtual columns
|
||||||
llSleep(1.0);
|
llSleep(DELAY_LEADERBOARD_SYNC);
|
||||||
|
|
||||||
// Registering virtual columns inside the physical "Leaderboard" mesh
|
// Registering virtual columns inside the physical "Leaderboard" mesh
|
||||||
// Format: fw_addbox:NewName:ParentName:x,y,w,h
|
// Format: fw_addbox:NewName:ParentName:x,y,w,h
|
||||||
|
|
@ -43,7 +43,7 @@ default {
|
||||||
|
|
||||||
// --- STARTUP HANDSHAKE ---
|
// --- STARTUP HANDSHAKE ---
|
||||||
// Wait a moment for the engine to process ADD_BOX, then ask Scoreboard for a fresh update
|
// Wait a moment for the engine to process ADD_BOX, then ask Scoreboard for a fresh update
|
||||||
llSleep(0.5);
|
llSleep(DELAY_LEADERBOARD_READY);
|
||||||
llMessageLinked(LINK_SET, MSG_DISPLAY_LEADERBOARD, "REFRESH_STARTUP", NULL_KEY);
|
llMessageLinked(LINK_SET, MSG_DISPLAY_LEADERBOARD, "REFRESH_STARTUP", NULL_KEY);
|
||||||
|
|
||||||
// Start with blank display
|
// Start with blank display
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,7 @@ default {
|
||||||
dbg("📊 [Status Bridge] Status Display Bridge ready!");
|
dbg("📊 [Status Bridge] Status Display Bridge ready!");
|
||||||
|
|
||||||
// Wait a tiny bit for Furware to be ready, then set initial text
|
// Wait a tiny bit for Furware to be ready, then set initial text
|
||||||
llSleep(1.0);
|
llSleep(DELAY_BRIDGE_READY);
|
||||||
updateStatusDisplay("PERIL DICE GAME\nWaiting for players...");
|
updateStatusDisplay("PERIL DICE GAME\nWaiting for players...");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -173,7 +173,7 @@ default {
|
||||||
|
|
||||||
integer ch = FLOATER_BASE_CHANNEL + channelIdx;
|
integer ch = FLOATER_BASE_CHANNEL + channelIdx;
|
||||||
llRezObject("StatFloat", pos, ZERO_VECTOR, ZERO_ROTATION, ch);
|
llRezObject("StatFloat", pos, ZERO_VECTOR, ZERO_ROTATION, ch);
|
||||||
llSleep(0.2);
|
llSleep(DELAY_FLOATER_REZ);
|
||||||
llRegionSay(ch, "SET_NAME:" + name);
|
llRegionSay(ch, "SET_NAME:" + name);
|
||||||
|
|
||||||
// --- HUD UPGRADE: Attach to Humans ---
|
// --- HUD UPGRADE: Attach to Humans ---
|
||||||
|
|
@ -363,7 +363,7 @@ default {
|
||||||
|
|
||||||
// Redundant broadcast for total coverage
|
// Redundant broadcast for total coverage
|
||||||
llRegionSay(chTarget, "CLEANUP");
|
llRegionSay(chTarget, "CLEANUP");
|
||||||
llSleep(0.05);
|
llSleep(DELAY_FLOATER_UPDATE);
|
||||||
}
|
}
|
||||||
// Clear ALL registries to allow fresh re-registration via Rez Guard
|
// Clear ALL registries to allow fresh re-registration via Rez Guard
|
||||||
allPlayerNames = [];
|
allPlayerNames = [];
|
||||||
|
|
|
||||||
|
|
@ -12,11 +12,6 @@ string getPlayerName(key id) {
|
||||||
return displayName;
|
return displayName;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Game timing settings
|
|
||||||
#define BOT_PICK_DELAY 2.0
|
|
||||||
#define HUMAN_PICK_DELAY 1.0
|
|
||||||
#define DIALOG_DELAY 1.5
|
|
||||||
#define STATUS_DISPLAY_TIME 8.0
|
|
||||||
// Game state - synced from Main Controller
|
// Game state - synced from Main Controller
|
||||||
list players = [];
|
list players = [];
|
||||||
list names = [];
|
list names = [];
|
||||||
|
|
@ -163,13 +158,13 @@ integer continueCurrentRound() {
|
||||||
llMessageLinked(LINK_SET, MSG_STATUS_TEXT, "PREPARING ROUND...\nCalculating dice size...", NULL_KEY);
|
llMessageLinked(LINK_SET, MSG_STATUS_TEXT, "PREPARING ROUND...\nCalculating dice size...", NULL_KEY);
|
||||||
|
|
||||||
// Dramatic pause to let the preparation message be read
|
// Dramatic pause to let the preparation message be read
|
||||||
llSleep(4.0);
|
llSleep(DELAY_LONG_SYNC);
|
||||||
|
|
||||||
// NEW: Update status bar for new round with colored highlight
|
// NEW: Update status bar for new round with colored highlight
|
||||||
llMessageLinked(LINK_SET, MSG_STATUS_TEXT, "NEW ROUND STARTING!\nPeril: <!c=red>" + perilPlayer, NULL_KEY);
|
llMessageLinked(LINK_SET, MSG_STATUS_TEXT, "NEW ROUND STARTING!\nPeril: <!c=red>" + perilPlayer, NULL_KEY);
|
||||||
|
|
||||||
// Dramatic pause to let the peril player be seen before the dice type is shown
|
// Dramatic pause to let the peril player be seen before the dice type is shown
|
||||||
llSleep(4.0);
|
llSleep(DELAY_LONG_SYNC);
|
||||||
|
|
||||||
// Note: showNextPickerDialog() will be called when dice type result is received
|
// Note: showNextPickerDialog() will be called when dice type result is received
|
||||||
return 0;
|
return 0;
|
||||||
|
|
@ -224,7 +219,7 @@ integer startNextRound() {
|
||||||
// Sync state to floater manager first, then update floaters to show new peril player immediately
|
// Sync state to floater manager first, then update floaters to show new peril player immediately
|
||||||
dbg("🔄 [Game Manager] Syncing state and updating floaters for new peril player: " + perilPlayer);
|
dbg("🔄 [Game Manager] Syncing state and updating floaters for new peril player: " + perilPlayer);
|
||||||
syncStateToMain(); // Sync the peril player to all modules first
|
syncStateToMain(); // Sync the peril player to all modules first
|
||||||
llSleep(0.1); // Brief delay to ensure sync propagates
|
llSleep(DELAY_SHORT_SYNC); // Brief delay to ensure sync propagates
|
||||||
integer startJ;
|
integer startJ;
|
||||||
for (startJ = 0; startJ < llGetListLength(names); startJ++) {
|
for (startJ = 0; startJ < llGetListLength(names); startJ++) {
|
||||||
string startPlayerName = llList2String(names, startJ);
|
string startPlayerName = llList2String(names, startJ);
|
||||||
|
|
@ -235,7 +230,7 @@ integer startNextRound() {
|
||||||
llMessageLinked(LINK_SET, MSG_STATUS_TEXT, "ROUND STARTING!\nPeril: <!c=red>" + perilPlayer, NULL_KEY);
|
llMessageLinked(LINK_SET, MSG_STATUS_TEXT, "ROUND STARTING!\nPeril: <!c=red>" + perilPlayer, NULL_KEY);
|
||||||
|
|
||||||
// Dramatic pause to let the first peril player be seen before round prep begins
|
// Dramatic pause to let the first peril player be seen before round prep begins
|
||||||
llSleep(4.0);
|
llSleep(DELAY_LONG_SYNC);
|
||||||
}
|
}
|
||||||
|
|
||||||
picksData = [];
|
picksData = [];
|
||||||
|
|
@ -261,7 +256,7 @@ integer startNextRound() {
|
||||||
llMessageLinked(LINK_SET, MSG_STATUS_TEXT, "PREPARING ROUND...\nCalculating dice size...", NULL_KEY);
|
llMessageLinked(LINK_SET, MSG_STATUS_TEXT, "PREPARING ROUND...\nCalculating dice size...", NULL_KEY);
|
||||||
|
|
||||||
// Dramatic pause to let the preparation message be read
|
// Dramatic pause to let the preparation message be read
|
||||||
llSleep(4.0);
|
llSleep(DELAY_LONG_SYNC);
|
||||||
|
|
||||||
dbg("🎯 Game Manager round setup complete, requesting dice type...");
|
dbg("🎯 Game Manager round setup complete, requesting dice type...");
|
||||||
return 0;
|
return 0;
|
||||||
|
|
@ -406,7 +401,7 @@ integer showNextPickerDialog() {
|
||||||
string dialogPayload = firstName + "|" + (string)diceType + "|" + (string)humanPicksNeeded + "|" + humanAvoidListStr;
|
string dialogPayload = firstName + "|" + (string)diceType + "|" + (string)humanPicksNeeded + "|" + humanAvoidListStr;
|
||||||
|
|
||||||
dbg("🎯 Showing pick dialog for " + firstName);
|
dbg("🎯 Showing pick dialog for " + firstName);
|
||||||
llSleep(0.5); // Brief delay to prevent spam
|
llSleep(DELAY_ANTI_SPAM); // Brief delay to prevent spam
|
||||||
|
|
||||||
// Send dialog request through Player_RegistrationManager (it has the correct player keys)
|
// Send dialog request through Player_RegistrationManager (it has the correct player keys)
|
||||||
string dialogRequest = "SHOW_DIALOG|" + firstName + "|" + dialogPayload;
|
string dialogRequest = "SHOW_DIALOG|" + firstName + "|" + dialogPayload;
|
||||||
|
|
@ -677,7 +672,7 @@ default {
|
||||||
llMessageLinked(LINK_SET, MSG_STATUS_TEXT, "DICE READY!\nRolling a d" + str + " this round", NULL_KEY);
|
llMessageLinked(LINK_SET, MSG_STATUS_TEXT, "DICE READY!\nRolling a d" + str + " this round", NULL_KEY);
|
||||||
|
|
||||||
// Dramatic pause to let players see the dice type before picking starts
|
// Dramatic pause to let players see the dice type before picking starts
|
||||||
llSleep(4.0);
|
llSleep(DELAY_LONG_SYNC);
|
||||||
|
|
||||||
// Start dialog if round has been started and we have a queue
|
// Start dialog if round has been started and we have a queue
|
||||||
if (roundStarted && currentPickerIdx < llGetListLength(pickQueue) && llGetListLength(pickQueue) > 0 && diceType > 0) {
|
if (roundStarted && currentPickerIdx < llGetListLength(pickQueue) && llGetListLength(pickQueue) > 0 && diceType > 0) {
|
||||||
|
|
@ -697,7 +692,7 @@ default {
|
||||||
|
|
||||||
if (!alreadyHasPicks) {
|
if (!alreadyHasPicks) {
|
||||||
dbg("🎯 Starting picks for " + currentPlayerName);
|
dbg("🎯 Starting picks for " + currentPlayerName);
|
||||||
llSleep(0.5);
|
llSleep(DELAY_ANTI_SPAM);
|
||||||
showNextPickerDialog();
|
showNextPickerDialog();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -820,7 +815,7 @@ default {
|
||||||
llList2CSV(names), NULL_KEY);
|
llList2CSV(names), NULL_KEY);
|
||||||
|
|
||||||
// Brief delay to ensure sync reaches Floater Manager before update request
|
// Brief delay to ensure sync reaches Floater Manager before update request
|
||||||
llSleep(0.1);
|
llSleep(DELAY_SHORT_SYNC);
|
||||||
|
|
||||||
// Now update the floater
|
// Now update the floater
|
||||||
llMessageLinked(LINK_SET, MSG_UPDATE_FLOAT, playerName, llList2Key(players, idx));
|
llMessageLinked(LINK_SET, MSG_UPDATE_FLOAT, playerName, llList2Key(players, idx));
|
||||||
|
|
@ -840,7 +835,7 @@ default {
|
||||||
// CRITICAL: Sync the updated picks data to all modules before roll phase
|
// CRITICAL: Sync the updated picks data to all modules before roll phase
|
||||||
dbg("🔄 [Game Manager] Syncing final picks data before roll phase...");
|
dbg("🔄 [Game Manager] Syncing final picks data before roll phase...");
|
||||||
syncStateToMain();
|
syncStateToMain();
|
||||||
llSleep(1.0); // Longer delay to ensure sync propagates to all modules
|
llSleep(DELAY_MEDIUM_SYNC); // Longer delay to ensure sync propagates to all modules
|
||||||
|
|
||||||
// Send roll dialog through Player_RegistrationManager
|
// Send roll dialog through Player_RegistrationManager
|
||||||
dbg("🎯 [Game Manager] Sending roll dialog request for: " + perilPlayer);
|
dbg("🎯 [Game Manager] Sending roll dialog request for: " + perilPlayer);
|
||||||
|
|
@ -896,7 +891,7 @@ default {
|
||||||
// CRITICAL: Sync the updated picks data to all modules before roll phase
|
// CRITICAL: Sync the updated picks data to all modules before roll phase
|
||||||
dbg("🔄 [Game Manager] Syncing final picks data before roll phase...");
|
dbg("🔄 [Game Manager] Syncing final picks data before roll phase...");
|
||||||
syncStateToMain();
|
syncStateToMain();
|
||||||
llSleep(1.0); // Longer delay to ensure sync propagates to all modules
|
llSleep(DELAY_MEDIUM_SYNC); // Longer delay to ensure sync propagates to all modules
|
||||||
|
|
||||||
// Force close any active number picker dialogs
|
// Force close any active number picker dialogs
|
||||||
dbg("🚫 [Game Manager] Sending CLOSE_ALL_DIALOGS command");
|
dbg("🚫 [Game Manager] Sending CLOSE_ALL_DIALOGS command");
|
||||||
|
|
@ -969,7 +964,7 @@ default {
|
||||||
llList2CSV(names), NULL_KEY);
|
llList2CSV(names), NULL_KEY);
|
||||||
|
|
||||||
// Brief delay to ensure sync reaches Floater Manager before update request
|
// Brief delay to ensure sync reaches Floater Manager before update request
|
||||||
llSleep(0.1);
|
llSleep(DELAY_SHORT_SYNC);
|
||||||
|
|
||||||
// Now update the floater
|
// Now update the floater
|
||||||
llMessageLinked(LINK_SET, MSG_UPDATE_FLOAT, playerName, NULL_KEY);
|
llMessageLinked(LINK_SET, MSG_UPDATE_FLOAT, playerName, NULL_KEY);
|
||||||
|
|
@ -1006,7 +1001,7 @@ default {
|
||||||
// CRITICAL: Sync the updated picks data to all modules before roll phase
|
// CRITICAL: Sync the updated picks data to all modules before roll phase
|
||||||
dbg("🔄 [Game Manager] Syncing final picks data before roll phase...");
|
dbg("🔄 [Game Manager] Syncing final picks data before roll phase...");
|
||||||
syncStateToMain();
|
syncStateToMain();
|
||||||
llSleep(0.2); // Brief delay to ensure sync propagates
|
llSleep(DELAY_DIALOG_REFRESH); // Brief delay to ensure sync propagates
|
||||||
|
|
||||||
// Force close any active number picker dialogs
|
// Force close any active number picker dialogs
|
||||||
dbg("🚫 [Game Manager] Sending CLOSE_ALL_DIALOGS command");
|
dbg("🚫 [Game Manager] Sending CLOSE_ALL_DIALOGS command");
|
||||||
|
|
|
||||||
|
|
@ -698,7 +698,7 @@ integer updatePlayerDisplay(string playerName, integer lives, string profileUUID
|
||||||
]);
|
]);
|
||||||
|
|
||||||
// Remove the glow after a moment to make it normal
|
// Remove the glow after a moment to make it normal
|
||||||
llSleep(0.1);
|
llSleep(DELAY_SCOREBOARD_REFRESH);
|
||||||
llSetLinkPrimitiveParamsFast(updateProfilePrimIndex, [
|
llSetLinkPrimitiveParamsFast(updateProfilePrimIndex, [
|
||||||
PRIM_GLOW, ALL_SIDES, 0.0 // Remove glow
|
PRIM_GLOW, ALL_SIDES, 0.0 // Remove glow
|
||||||
]);
|
]);
|
||||||
|
|
@ -903,7 +903,7 @@ default {
|
||||||
]);
|
]);
|
||||||
|
|
||||||
// Remove the glow after a moment to make it normal
|
// Remove the glow after a moment to make it normal
|
||||||
llSleep(0.1);
|
llSleep(DELAY_SCOREBOARD_REFRESH);
|
||||||
llSetLinkPrimitiveParamsFast(profilePrimIndex, [
|
llSetLinkPrimitiveParamsFast(profilePrimIndex, [
|
||||||
PRIM_GLOW, ALL_SIDES, 0.0 // Remove glow
|
PRIM_GLOW, ALL_SIDES, 0.0 // Remove glow
|
||||||
]);
|
]);
|
||||||
|
|
|
||||||
|
|
@ -91,10 +91,6 @@ list pendingRegistrations = []; // Keys of players who have registration in pro
|
||||||
|
|
||||||
key currentPicker;
|
key currentPicker;
|
||||||
|
|
||||||
// Game timing settings
|
|
||||||
#define BOT_PICK_DELAY 2.0
|
|
||||||
#define HUMAN_PICK_DELAY 1.0
|
|
||||||
#define DIALOG_DELAY 1.5
|
|
||||||
integer gameTimer = 0;
|
integer gameTimer = 0;
|
||||||
|
|
||||||
// Dynamic channel system for floaters and dialogs (still needed for external communication)
|
// Dynamic channel system for floaters and dialogs (still needed for external communication)
|
||||||
|
|
@ -295,9 +291,9 @@ resetGame() {
|
||||||
// Let Floater Manager handle cleanup intelligently
|
// Let Floater Manager handle cleanup intelligently
|
||||||
// Always request cleanup on a reset to ensure no orphans are left behind
|
// Always request cleanup on a reset to ensure no orphans are left behind
|
||||||
llMessageLinked(LINK_SET, MSG_CLEANUP_ALL_FLOATERS, "RESET", NULL_KEY);
|
llMessageLinked(LINK_SET, MSG_CLEANUP_ALL_FLOATERS, "RESET", NULL_KEY);
|
||||||
llSleep(0.5);
|
llSleep(DELAY_STATE_TRANSITION);
|
||||||
|
|
||||||
llSleep(0.5);
|
llSleep(DELAY_STATE_TRANSITION);
|
||||||
|
|
||||||
players = names = lives = picksData = globalPickedNumbers = readyPlayers = [];
|
players = names = lives = picksData = globalPickedNumbers = readyPlayers = [];
|
||||||
floaterChannels = [];
|
floaterChannels = [];
|
||||||
|
|
@ -330,7 +326,7 @@ resetGame() {
|
||||||
// NEW: Update status bar for idle state
|
// NEW: Update status bar for idle state
|
||||||
sendStatusMessage("PERIL DICE GAME\nTouch to Join!");
|
sendStatusMessage("PERIL DICE GAME\nTouch to Join!");
|
||||||
|
|
||||||
llSleep(0.5);
|
llSleep(DELAY_STATE_TRANSITION);
|
||||||
llSetTimerEvent(0);
|
llSetTimerEvent(0);
|
||||||
|
|
||||||
initListeners();
|
initListeners();
|
||||||
|
|
@ -659,11 +655,11 @@ default {
|
||||||
|
|
||||||
// Direct floater update to ensure eliminated status is displayed
|
// Direct floater update to ensure eliminated status is displayed
|
||||||
llMessageLinked(LINK_SET, MSG_UPDATE_FLOAT, eliminatedPlayer, llList2Key(players, idx));
|
llMessageLinked(LINK_SET, MSG_UPDATE_FLOAT, eliminatedPlayer, llList2Key(players, idx));
|
||||||
llSleep(2.0); // Give floater time to show eliminated status with red display
|
llSleep(DELAY_ELIMINATION_NOTICE); // Give floater time to show eliminated status with red display
|
||||||
|
|
||||||
if (willCauseVictory) {
|
if (willCauseVictory) {
|
||||||
// If this elimination will cause victory, give extra time for 0 hearts display
|
// If this elimination will cause victory, give extra time for 0 hearts display
|
||||||
llSleep(1.5); // Additional time for victory scenarios
|
llSleep(DELAY_VICTORY_NOTICE); // Additional time for victory scenarios
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHANGED: Don't cleanup floaters during elimination - let them show eliminated status
|
// CHANGED: Don't cleanup floaters during elimination - let them show eliminated status
|
||||||
|
|
@ -713,7 +709,7 @@ default {
|
||||||
// ENHANCED: Give eliminated player's floater time to show eliminated status
|
// ENHANCED: Give eliminated player's floater time to show eliminated status
|
||||||
// before declaring victory and cleaning up
|
// before declaring victory and cleaning up
|
||||||
dbg("⏳ [Main Controller] Final elimination detected - allowing display time before victory");
|
dbg("⏳ [Main Controller] Final elimination detected - allowing display time before victory");
|
||||||
llSleep(2.0); // Give final eliminated player time to show red eliminated status
|
llSleep(DELAY_ELIMINATION_NOTICE); // Give final eliminated player time to show red eliminated status
|
||||||
|
|
||||||
// CRITICAL: Set victory flag immediately to prevent sync processing
|
// CRITICAL: Set victory flag immediately to prevent sync processing
|
||||||
victoryInProgress = TRUE;
|
victoryInProgress = TRUE;
|
||||||
|
|
@ -783,7 +779,7 @@ default {
|
||||||
// Optimized to avoid large temporary string variables
|
// Optimized to avoid large temporary string variables
|
||||||
llMessageLinked(LINK_SET, MSG_SYNC_GAME_STATE,
|
llMessageLinked(LINK_SET, MSG_SYNC_GAME_STATE,
|
||||||
llList2CSV(lives) + "~EMPTY~" + perilPlayer + "~" + llList2CSV(names), NULL_KEY);
|
llList2CSV(lives) + "~EMPTY~" + perilPlayer + "~" + llList2CSV(names), NULL_KEY);
|
||||||
llSleep(0.5); // Give sync time to propagate
|
llSleep(DELAY_SYNC_PROPAGATION); // Give sync time to propagate
|
||||||
|
|
||||||
// Continue the game with the new peril player - delegate to Game Manager
|
// Continue the game with the new peril player - delegate to Game Manager
|
||||||
llMessageLinked(LINK_SET, 998, perilPlayer, NULL_KEY);
|
llMessageLinked(LINK_SET, 998, perilPlayer, NULL_KEY);
|
||||||
|
|
@ -801,7 +797,7 @@ default {
|
||||||
dbg("🚨 [Main Controller] Emergency reset triggered - sending emergency reset to all scripts");
|
dbg("🚨 [Main Controller] Emergency reset triggered - sending emergency reset to all scripts");
|
||||||
// Signal all scripts to emergency reset
|
// Signal all scripts to emergency reset
|
||||||
llMessageLinked(LINK_SET, MSG_EMERGENCY_RESET, "EMERGENCY_RESET", NULL_KEY);
|
llMessageLinked(LINK_SET, MSG_EMERGENCY_RESET, "EMERGENCY_RESET", NULL_KEY);
|
||||||
llSleep(0.5);
|
llSleep(DELAY_SYNC_PROPAGATION);
|
||||||
// Then do full reset
|
// Then do full reset
|
||||||
resetGame();
|
resetGame();
|
||||||
return;
|
return;
|
||||||
|
|
@ -814,7 +810,7 @@ default {
|
||||||
string winner = llList2String(parts, 1);
|
string winner = llList2String(parts, 1);
|
||||||
// Send dice roll winner message using LINK_SET
|
// Send dice roll winner message using LINK_SET
|
||||||
llMessageLinked(LINK_SET, MSG_DICE_ROLL, winner + "|WON", NULL_KEY);
|
llMessageLinked(LINK_SET, MSG_DICE_ROLL, winner + "|WON", NULL_KEY);
|
||||||
llSleep(2.0);
|
llSleep(DELAY_GAME_RESET);
|
||||||
resetGame();
|
resetGame();
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
|
|
@ -1165,7 +1161,7 @@ default {
|
||||||
string playerName = llList2String(names, i);
|
string playerName = llList2String(names, i);
|
||||||
key playerKey = llList2Key(players, i);
|
key playerKey = llList2Key(players, i);
|
||||||
llMessageLinked(LINK_SET, MSG_REZ_FLOAT, playerName, playerKey);
|
llMessageLinked(LINK_SET, MSG_REZ_FLOAT, playerName, playerKey);
|
||||||
llSleep(0.3);
|
llSleep(DELAY_GENERIC_TICK);
|
||||||
}
|
}
|
||||||
dbg("✅ Floater creation requests sent for all players!");
|
dbg("✅ Floater creation requests sent for all players!");
|
||||||
|
|
||||||
|
|
@ -1249,7 +1245,7 @@ default {
|
||||||
sendStatusMessage("GAME STARTING!\nAll players are ready!");
|
sendStatusMessage("GAME STARTING!\nAll players are ready!");
|
||||||
|
|
||||||
// Dramatic pause to let the start announcement be read before round prep begins
|
// Dramatic pause to let the start announcement be read before round prep begins
|
||||||
llSleep(4.0);
|
llSleep(DELAY_LONG_SYNC);
|
||||||
|
|
||||||
// For game start, use empty peril player - Game Manager will select one
|
// For game start, use empty peril player - Game Manager will select one
|
||||||
llMessageLinked(LINK_SET, 998, "", NULL_KEY);
|
llMessageLinked(LINK_SET, 998, "", NULL_KEY);
|
||||||
|
|
|
||||||
|
|
@ -149,3 +149,35 @@ key EXPERIENCE_ID = "06926390-26e6-11f1-a452-0242ac110003"; // Final Girlz I.N.C
|
||||||
// --- Helper Functions Support ---
|
// --- Helper Functions Support ---
|
||||||
#define MSG_GET_PICKS_REQUIRED 1002
|
#define MSG_GET_PICKS_REQUIRED 1002
|
||||||
#define MSG_GET_PICKER_INDEX 1003
|
#define MSG_GET_PICKER_INDEX 1003
|
||||||
|
|
||||||
|
// --- Timing & Delays ---
|
||||||
|
#define DELAY_SCAN_LINKSET 1.5 // Link scanner delay
|
||||||
|
#define DELAY_DIALOG_REFRESH 0.2 // Brief delay before refreshing/showing dialog (0.2s)
|
||||||
|
#define DELAY_BRIDGE_READY 1.0 // Delay for bridge initialization (1.0s)
|
||||||
|
#define DELAY_LEADERBOARD_SYNC 1.0 // Delay for leaderboard synchronization (1.0s)
|
||||||
|
#define DELAY_LEADERBOARD_READY 0.5 // Delay for leaderboard system readiness (0.5s)
|
||||||
|
#define DELAY_FLOATER_REZ 0.2 // Delay between floater rezzing (0.2s)
|
||||||
|
#define DELAY_FLOATER_UPDATE 0.05 // Very brief delay for floater updates (0.05s)
|
||||||
|
#define DELAY_SCOREBOARD_REFRESH 0.1 // Scoreboard refresh delay (0.1s)
|
||||||
|
#define DELAY_STATE_TRANSITION 0.5 // Generic state transition sleep (0.5s)
|
||||||
|
#define DELAY_ELIMINATION_NOTICE 2.0 // Time given to show eliminated status (2.0s)
|
||||||
|
#define DELAY_VICTORY_NOTICE 1.5 // Additional time for victory scenarios (1.5s)
|
||||||
|
#define DELAY_SYNC_PROPAGATION 0.5 // Time for linked messages to propagate (0.5s)
|
||||||
|
#define DELAY_GAME_RESET 2.0 // Delay during full system reset (2.0s)
|
||||||
|
#define DELAY_GENERIC_TICK 0.3 // Generic tick delay (0.3s)
|
||||||
|
#define DELAY_LONG_SYNC 4.0 // Long dramatic pause or heavy sync (4.0s)
|
||||||
|
#define DELAY_SHORT_SYNC 0.1 // Very short sync buffer (0.1s)
|
||||||
|
#define DELAY_MEDIUM_SYNC 1.0 // Medium sync buffer (1.0s)
|
||||||
|
#define DELAY_ANTI_SPAM 0.5 // Delay to prevent message loops/spam (0.5s)
|
||||||
|
#define DELAY_CONFETTI_START 2.0 // Delay before confetti effects (2.0s)
|
||||||
|
#define DELAY_CONFETTI_DURATION 4.0 // Duration confetti stays active (4.0s)
|
||||||
|
#define DELAY_CONFETTI_TICK 0.2 // Confetti particle interval (0.2s)
|
||||||
|
#define DELAY_CONFETTI_PREP 0.5 // Confetti preparation delay (0.5s)
|
||||||
|
#define DELAY_FLOAT_UPDATE 0.1 // Floater status update delay (0.1s)
|
||||||
|
|
||||||
|
// --- Game Timing Settings (Originals relocated here) ---
|
||||||
|
#define BOT_PICK_DELAY 2.0 // Bot picking decision time (2.0s)
|
||||||
|
#define HUMAN_PICK_DELAY 1.0 // Human picking buffer (1.0s)
|
||||||
|
#define DIALOG_DELAY 1.5 // Base dialog presentation delay (1.5s)
|
||||||
|
#define STATUS_DISPLAY_TIME 8.0 // How long status text stays on display (8.0s)
|
||||||
|
#define BOT_RESPONSE_DELAY 1.5 // Bot response timing (1.5s)
|
||||||
|
|
|
||||||
|
|
@ -93,7 +93,7 @@ default {
|
||||||
dbg("🧹 [Status Float] CLEANUP signal received. Detaching from avatar...");
|
dbg("🧹 [Status Float] CLEANUP signal received. Detaching from avatar...");
|
||||||
llDetachFromAvatar();
|
llDetachFromAvatar();
|
||||||
// Fallback for non-attachments
|
// Fallback for non-attachments
|
||||||
llSleep(0.1);
|
llSleep(DELAY_FLOAT_UPDATE);
|
||||||
llDie();
|
llDie();
|
||||||
}
|
}
|
||||||
else if (llSubStringIndex(message, "ATTACH_TO:") == 0) {
|
else if (llSubStringIndex(message, "ATTACH_TO:") == 0) {
|
||||||
|
|
|
||||||
|
|
@ -681,7 +681,7 @@ default {
|
||||||
string pick = llGetSubString(msg, 8, -1);
|
string pick = llGetSubString(msg, 8, -1);
|
||||||
string payload = "REMOVE_PICK~" + currentPickTarget + "|" + pick;
|
string payload = "REMOVE_PICK~" + currentPickTarget + "|" + pick;
|
||||||
llMessageLinked(LINK_THIS, MSG_PICK_ACTION, payload, id);
|
llMessageLinked(LINK_THIS, MSG_PICK_ACTION, payload, id);
|
||||||
llSleep(0.2);
|
llSleep(DELAY_DIALOG_REFRESH);
|
||||||
llMessageLinked(LINK_THIS, MSG_OWNER_PICK_MANAGER, currentPickTarget, id);
|
llMessageLinked(LINK_THIS, MSG_OWNER_PICK_MANAGER, currentPickTarget, id);
|
||||||
}
|
}
|
||||||
// Handle kick player selection
|
// Handle kick player selection
|
||||||
|
|
@ -720,7 +720,7 @@ default {
|
||||||
}
|
}
|
||||||
string payload = "ADD_PICK~" + currentPickTarget + "|" + msg;
|
string payload = "ADD_PICK~" + currentPickTarget + "|" + msg;
|
||||||
llMessageLinked(LINK_THIS, MSG_PICK_ACTION, payload, id);
|
llMessageLinked(LINK_THIS, MSG_PICK_ACTION, payload, id);
|
||||||
llSleep(0.2);
|
llSleep(DELAY_DIALOG_REFRESH);
|
||||||
llMessageLinked(LINK_THIS, MSG_OWNER_PICK_MANAGER, currentPickTarget, id);
|
llMessageLinked(LINK_THIS, MSG_OWNER_PICK_MANAGER, currentPickTarget, id);
|
||||||
}
|
}
|
||||||
// Handle position scan responses from follower displays
|
// Handle position scan responses from follower displays
|
||||||
|
|
|
||||||
|
|
@ -267,7 +267,7 @@ default {
|
||||||
dbg("🎲 [Roll Module] 🤖 " + str + " (bot) is requesting dice type for auto-roll...");
|
dbg("🎲 [Roll Module] 🤖 " + str + " (bot) is requesting dice type for auto-roll...");
|
||||||
|
|
||||||
// Give a moment for "DICE IN THE AIR" message to be seen for bots
|
// Give a moment for "DICE IN THE AIR" message to be seen for bots
|
||||||
llSleep(2.0);
|
llSleep(DELAY_CONFETTI_START);
|
||||||
|
|
||||||
rollInProgress = TRUE; // Set roll in progress for bot
|
rollInProgress = TRUE; // Set roll in progress for bot
|
||||||
shouldRoll = TRUE; // Set flag to perform roll when dice type is received
|
shouldRoll = TRUE; // Set flag to perform roll when dice type is received
|
||||||
|
|
@ -343,7 +343,7 @@ default {
|
||||||
llMessageLinked(LINK_SET, MSG_STATUS_TEXT, "DICE SETTLED!\n" + perilPlayer + " rolled a " + resultStr + "!", NULL_KEY);
|
llMessageLinked(LINK_SET, MSG_STATUS_TEXT, "DICE SETTLED!\n" + perilPlayer + " rolled a " + resultStr + "!", NULL_KEY);
|
||||||
|
|
||||||
// Dramatic pause to let the roll result be seen before the win/loss outcome pops up
|
// Dramatic pause to let the roll result be seen before the win/loss outcome pops up
|
||||||
llSleep(4.0);
|
llSleep(DELAY_LONG_SYNC);
|
||||||
|
|
||||||
string newPeril = "";
|
string newPeril = "";
|
||||||
integer matched = FALSE;
|
integer matched = FALSE;
|
||||||
|
|
@ -389,7 +389,7 @@ default {
|
||||||
llMessageLinked(LINK_SCOREBOARD, MSG_UPDATE_PERIL_PLAYER, newPeril, NULL_KEY); // MSG_UPDATE_PERIL_PLAYER
|
llMessageLinked(LINK_SCOREBOARD, MSG_UPDATE_PERIL_PLAYER, newPeril, NULL_KEY); // MSG_UPDATE_PERIL_PLAYER
|
||||||
|
|
||||||
// Add delay to let status display before next phase
|
// Add delay to let status display before next phase
|
||||||
llSleep(4.0);
|
llSleep(DELAY_LONG_SYNC);
|
||||||
|
|
||||||
// Update floaters immediately to show correct peril player before sync
|
// Update floaters immediately to show correct peril player before sync
|
||||||
llMessageLinked(LINK_SET, MSG_UPDATE_FLOAT, newPeril, NULL_KEY);
|
llMessageLinked(LINK_SET, MSG_UPDATE_FLOAT, newPeril, NULL_KEY);
|
||||||
|
|
@ -425,20 +425,20 @@ default {
|
||||||
llMessageLinked(LINK_SCOREBOARD, MSG_GAME_STATUS, "Direct Hit", NULL_KEY);
|
llMessageLinked(LINK_SCOREBOARD, MSG_GAME_STATUS, "Direct Hit", NULL_KEY);
|
||||||
llMessageLinked(LINK_SET, MSG_STATUS_TEXT, "DIRECT HIT!\n<!c=red>" + perilPlayer + " matched!", NULL_KEY);
|
llMessageLinked(LINK_SET, MSG_STATUS_TEXT, "DIRECT HIT!\n<!c=red>" + perilPlayer + " matched!", NULL_KEY);
|
||||||
// Add delay to let status display before next phase
|
// Add delay to let status display before next phase
|
||||||
llSleep(4.0);
|
llSleep(DELAY_LONG_SYNC);
|
||||||
} else if (!matched) {
|
} else if (!matched) {
|
||||||
llSay(0, "🩸 NO SHIELD! Nobody picked " + resultStr + " - " + perilPlayer + " takes the hit from the d" + (string)diceType + "! 🩸");
|
llSay(0, "🩸 NO SHIELD! Nobody picked " + resultStr + " - " + perilPlayer + " takes the hit from the d" + (string)diceType + "! 🩸");
|
||||||
// Direct scoreboard status update (texture and text)
|
// Direct scoreboard status update (texture and text)
|
||||||
llMessageLinked(LINK_SCOREBOARD, MSG_GAME_STATUS, "No Shield", NULL_KEY);
|
llMessageLinked(LINK_SCOREBOARD, MSG_GAME_STATUS, "No Shield", NULL_KEY);
|
||||||
llMessageLinked(LINK_SET, MSG_STATUS_TEXT, "NO SHIELD!\n<!c=red>" + perilPlayer + " took the hit!", NULL_KEY);
|
llMessageLinked(LINK_SET, MSG_STATUS_TEXT, "NO SHIELD!\n<!c=red>" + perilPlayer + " took the hit!", NULL_KEY);
|
||||||
// Add delay to let status display before next phase
|
// Add delay to let status display before next phase
|
||||||
llSleep(4.0);
|
llSleep(DELAY_LONG_SYNC);
|
||||||
} else {
|
} else {
|
||||||
// This should never happen in normal game flow since Plot Twist case is handled above
|
// This should never happen in normal game flow since Plot Twist case is handled above
|
||||||
// But if it does, it means someone else picked it - this should have been Plot Twist
|
// But if it does, it means someone else picked it - this should have been Plot Twist
|
||||||
dbg("🎲 [Roll Module] ⚠️ LOGIC ERROR: Someone picked " + resultStr + " but not handled as Plot Twist!");
|
dbg("🎲 [Roll Module] ⚠️ LOGIC ERROR: Someone picked " + resultStr + " but not handled as Plot Twist!");
|
||||||
llSay(0, "🩸 SHIELD FAILED! " + perilPlayer + " takes the hit despite someone picking " + resultStr + "! 🩸");
|
llSay(0, "🩸 SHIELD FAILED! " + perilPlayer + " takes the hit despite someone picking " + resultStr + "! 🩸");
|
||||||
llSleep(2.0);
|
llSleep(DELAY_ELIMINATION_NOTICE);
|
||||||
}
|
}
|
||||||
|
|
||||||
llMessageLinked(LINK_SET, MSG_UPDATE_FLOAT, perilPlayer, NULL_KEY);
|
llMessageLinked(LINK_SET, MSG_UPDATE_FLOAT, perilPlayer, NULL_KEY);
|
||||||
|
|
@ -490,7 +490,7 @@ default {
|
||||||
llDumpList2String(picksData, "^") + "~" +
|
llDumpList2String(picksData, "^") + "~" +
|
||||||
perilForSync + "~" +
|
perilForSync + "~" +
|
||||||
llList2CSV(names), NULL_KEY);
|
llList2CSV(names), NULL_KEY);
|
||||||
llSleep(0.2);
|
llSleep(DELAY_DIALOG_REFRESH);
|
||||||
|
|
||||||
// Additional floater updates to ensure correct peril player display
|
// Additional floater updates to ensure correct peril player display
|
||||||
dbg("🎲 [Roll Module] 🔄 Updating all floaters with new peril player: " + perilPlayer);
|
dbg("🎲 [Roll Module] 🔄 Updating all floaters with new peril player: " + perilPlayer);
|
||||||
|
|
@ -504,7 +504,7 @@ default {
|
||||||
dbg("🎲 [Roll Module] 🎯 Round complete - sending continuation directly to Game Manager");
|
dbg("🎲 [Roll Module] 🎯 Round complete - sending continuation directly to Game Manager");
|
||||||
|
|
||||||
// Brief delay to ensure sync propagates
|
// Brief delay to ensure sync propagates
|
||||||
llSleep(0.5);
|
llSleep(DELAY_SYNC_PROPAGATION);
|
||||||
|
|
||||||
// Send continuation directly to Game Manager (more efficient than through Main Controller)
|
// Send continuation directly to Game Manager (more efficient than through Main Controller)
|
||||||
// For non-elimination cases, continue with current peril player
|
// For non-elimination cases, continue with current peril player
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue