// Number Grid Texture UUID key texture = "fa16bd77-af56-4149-b9d4-75f6ceda8448"; key creatorKey; float PotPercentage = 0.10; float creatorPercentage = 0.01; list lPay = ["P$5", "P$10", "P$25", "P$50", "P$75", "P$100", "P$250", "P$500", "P$750", "P$1000"]; vector lineColor = <1.0, 0.0, 0.0>; list lMummy = [0.20, 0.30, 0.40, 0.50]; integer TotalNumbers = 25; integer totalRounds = 5; integer roundTime = 25; integer pointsSingleField = 200; integer pointsLine = 1000; integer pointsBlues = 5000; integer pointsAll = 10000; integer pointsCash = 1000; integer pointsPharao = 1000; integer EMPTY = 1; integer FILLED = 2; integer CASH = 4; integer DOUBLE = 8; integer BLUE = 16; //string cmdFloatText = "FloatText"; string cmdConfig = "Admin"; string cmdFloatOn = "Float ON"; string cmdFloatOff = "Float OFF"; string cmdTimeOn = "Time ON"; string cmdCurrentOn = "Current ON"; string cmdCurrentOff = "Current OFF"; string cmdTimeOff = "Time OFF"; string cmdPrevOn = "Prev ON"; string cmdPrevOff = "Prev OFF"; string cmdFreeYes = "Free YES"; string cmdFreeNo = "Free NO"; string cmdFreeOnly = "Free Only"; string cmdOn = "ON"; string cmdOff = "OFF"; string cmdDebug = "Debug Toggle"; //string cmdStatistics = "Statistics"; string cmdResetStats = "Reset Machine"; string cmdFreePlay = "FreePlay"; string cmdNote = "Help"; list lNumbers; list lFields; integer iBlues; integer bCheckAll; integer bCheckBlues; integer iPoints = 0; integer bCash = TRUE; integer bDouble = FALSE; integer bGame = TRUE; integer freePlay = 0; integer dialogChannel; integer playing = FALSE; key player; string gameValueName; key GameServer = "f77c9eb4-4d0a-48a3-8157-613b9f8342a7"; // UUID of Game Server Prim in Server Cabinet key SecurityKey = "3d7b1a28-f547-4d10-8924-7a2b771739f4"; // Security Key for Secure Communication. Currently my UUID key GameEventDBServer = "508e0211-5cfe-4bda-acbe-8576b02dc00e"; // UUID of Game Event Logger Database Server key GameDBServer = "5d9b8231-ed73-4aa5-b3c8-a7b0a88b1aa6"; // UUID of Game Database Server in Server Cabinet integer ServerComChannel = -63473672; // Game Server Communication Channel integer EventDBServerComChannel = -260002; // Game Event Database Server Communication Channel integer ServerComHandle; list RoundLengthList = []; integer DebugMode = FALSE; string AskForKeys = "TheKeyIs(Mq=h/c2)"; list AdminMenuUsers = []; string DiagMode; list ssCreateMenu(string menu) { if (menu == "main") return [cmdConfig]; //if (menu == cmdFloatText) return [cmdFloatOn, cmdFloatOff, cmdTimeOn, cmdCurrentOn, cmdCurrentOff, cmdTimeOff, cmdPrevOn, cmdPrevOff]; if (menu == cmdConfig) return [cmdFreeYes, cmdFreeNo, cmdFreeOnly, cmdOff, cmdDebug, cmdResetStats]; if (menu == "pay") { if (freePlay == 0) return order_buttons(lPay + [cmdNote]); if (freePlay == 1) return order_buttons([cmdFreePlay] + lPay + [cmdNote]); if (freePlay == 2) return [cmdFreePlay, cmdNote]; } return []; } list order_buttons(list buttons) { //From the wiki By Redux integer offset; list fixt; while((offset = llGetListLength(buttons))) { offset = -3 * (offset > 3); fixt = fixt + llList2List(buttons, offset, -1); // fixt += llList2List(buttons, offset = -3 * (offset > 3), -1); buttons = llDeleteSubList(buttons, offset, -1); } return fixt; } integer ssRandomChannel() { integer n = llRound(llFrand(-1 * (DEBUG_CHANNEL - 1))); if (n > -1000) return ssRandomChannel(); else return n; } ssGenerateNumbers() { bDouble = FALSE; llMessageLinked(LINK_ALL_OTHERS, totalRounds, "totalRounds", NULL_KEY); llSleep(0.1); llMessageLinked(LINK_ALL_OTHERS, roundTime, "roundTime", NULL_KEY); bCheckBlues = bCheckAll = TRUE; iPoints = 0; integer num; lNumbers = lFields = []; integer blue = 1; integer double; integer cash; // find 2x double = (integer)llFrand(TotalNumbers); if (bCash = !bCash) { // find cash do { cash = (integer)llFrand(TotalNumbers); } while (cash == double); } while (num < 25) { integer fieldValue = EMPTY; vector offset = ZERO_VECTOR; integer random; integer isBlue = FALSE; integer extra = (num / 5) * 15; if (iBlues & blue) { fieldValue = fieldValue + BLUE; isBlue = TRUE; } blue = blue << 1; do { random = extra + (integer)llFrand(DEBUG_CHANNEL) % 15; } while (llListFindList(lNumbers, (list)random) != -1); lNumbers = lNumbers + random; llMessageLinked( LINK_ALL_OTHERS , num , llDumpList2String(["startGame", (string)random, (string)isBlue], "~~") , player ); if (num == double) fieldValue += DOUBLE; if (bCash && num == cash) fieldValue += CASH; lFields += fieldValue; ++num; } llMessageLinked(LINK_ALL_OTHERS, -1, "startGame", player); } integer ssCheckLines(integer num) { integer i; integer points = 0; integer n = 0; list lined = []; string say; //Horizontal check while (n < 5) { i = (num % 5) + n * 5; if (llList2Integer(lFields, i) & EMPTY) jump away1; ++n; } n = -1; while(++n < 5) { integer x = ((num % 5) + n * 5); if (llListFindList(lined, (list)x) == -1) lined += x; } points = points + pointsLine; @away1; //Vertical check n = 0; while (n < 5) { i = (num / 5) * 5 + n; if (llList2Integer(lFields, i) & EMPTY) jump away2; ++n; } n = -1; while(++n < 5) { integer x = ((num / 5) * 5 + n); if (llListFindList(lined, (list)x) == -1) lined += x; } points = points + pointsLine; @away2; //Diagonal -> \ n = 0; if (num % 6 == 0) { while (n < 5) { i = 6 * n; if (llList2Integer(lFields, i) & EMPTY) jump away3; ++n; } n = -1; while(++n < 5) { integer x = (6 * n); if (llListFindList(lined, (list)x) == -1) lined += x; } points = points + pointsLine; } @away3; //Diagonal -> / n = 0; if (num && num % 4 == 0 && num < 24) { while (n < 5) { ++n; i = 4 * n; if (llList2Integer(lFields, i) & EMPTY) jump away4; } n = -1; while(++n < 5) { integer x = (4 * n + 4); if (llListFindList(lined, (list)x) == -1) lined += x; } points = points + pointsLine; } @away4; //check blue fields n = 0; if (bCheckBlues) { while(n < 25) { integer test = llList2Integer(lFields, n); if ((test & BLUE) && (test & EMPTY)) jump away5; ++n; } bCheckBlues = FALSE; points = points + pointsBlues; say = "Hurray! You filled the pattern! " + (string)pointsBlues + " extra points!"; if (bDouble) say = "Hurray! You filled the pattern! " + (string)(pointsBlues * 2) + " extra points!"; llWhisper(0, say); } @away5; //check if all numbers are filled n = 0; if (bCheckAll) { while(n < 25) { if (llList2Integer(lFields, n) & EMPTY) jump away6; ++n; } bCheckAll = FALSE; points = points + pointsAll; say = "Hurray! You found all numbers! " + (string)pointsAll + " extra points!"; if (bDouble) say = "Hurray! You found all numbers! " +(string)(pointsAll * 2) + " extra points!"; llWhisper(0, say); llMessageLinked(LINK_THIS, 0, "gameOver", ""); } @away6; integer total = lined != []; n = -1; while(++n < total) llMessageLinked(LINK_SET, llList2Integer(lined, n), "line", (string)lineColor); return points; } default { state_entry() { creatorKey = llGetCreator(); llRequestPermissions(llGetOwner(), PERMISSION_DEBIT); llListenRemove(ServerComHandle); ServerComHandle = llListen(ServerComChannel, "", "", ""); if(DebugMode){ llOwnerSay("Booted Main Script"); } //llRequestPermissions(llGetOwner(), PERMISSION_DEBIT); } run_time_permissions(integer perm){ if(PERMISSION_DEBIT & perm){ llRegionSay(ServerComChannel, AskForKeys); } } listen(integer chan, string name, key id, string msg){ if(DebugMode){ llOwnerSay("Listen Msg: "+msg); } if(llList2String(llParseString2List(msg, "||", ""), 1)==AskForKeys){ list NewKeys = llParseString2List(msg, "||", ""); if(llList2String(NewKeys, 0)!=SecurityKey){ if(DebugMode){ llOwnerSay("Invalid Security Key Received during SERVER Key Update!"); } return; } // UUIDS of Game Servers GameServer = llList2Key(NewKeys, 2); GameDBServer = llList2Key(NewKeys, 3); GameEventDBServer = llList2Key(NewKeys, 4); // Game Configuration Directives lMummy = llList2List(NewKeys, 5, 8); roundTime = llList2Integer(NewKeys, 9); pointsSingleField = llList2Integer(NewKeys, 10); pointsLine = llList2Integer(NewKeys, 11); pointsBlues = llList2Integer(NewKeys, 12); pointsAll = llList2Integer(NewKeys, 13); pointsCash = llList2Integer(NewKeys, 14); pointsPharao = llList2Integer(NewKeys, 15); PotPercentage = llList2Float(NewKeys, 16) / 100; DiagMode = llList2String(NewKeys, 17); if( llGetListLength(lMummy)>0 && roundTime>0 && pointsSingleField>0 && pointsLine>0 && pointsBlues>0 && pointsAll>0 && pointsCash>0 && pointsPharao>0 && PotPercentage>0 ){ llOwnerSay("Game Configured!"); if(DiagMode=="TRUE"){ llOwnerSay("Diagnostic Mode Active!"); } }else{ llOwnerSay("Game Configureation ERROR!"); } integer i; list TempList = llList2List(NewKeys, 24, -1); if(DebugMode){ llOwnerSay("Loading Admin Menu Users..."); } for(i=0;i, 1.0); RoundLengthList = [] + [llList2Integer(Inputs, 1), llList2Integer(Inputs, 2), llList2Integer(Inputs, 3), llList2Integer(Inputs, 4), llList2Integer(Inputs, 5), llList2Integer(Inputs, 6), llList2Integer(Inputs, 7), llList2Integer(Inputs, 8), llList2Integer(Inputs, 9), llList2Integer(Inputs, 10)]; state Ready; } } state_exit(){ llListenRemove(ServerComHandle); } } state Ready { state_entry() { llOwnerSay("State Ready"); //llSetText("", <1,1,1>, 0.0); llSetClickAction(CLICK_ACTION_TOUCH); llMessageLinked(LINK_SET, -1, "setTexture", texture); dialogChannel = ssRandomChannel(); llListen(dialogChannel, "", NULL_KEY, ""); llSetPayPrice(PAY_HIDE, [PAY_HIDE, PAY_HIDE, PAY_HIDE, PAY_HIDE]); } touch_start(integer n) { if (!playing) { key id = llDetectedKey(0); // Calls User Menu to Select Game Cost if (bGame) llDialog(id, "Game price:", ssCreateMenu("pay"), dialogChannel); // Calls Admin Menu if (llListFindList(AdminMenuUsers, [id])!=-1) { llSleep(2.0); llDialog(id, "Admin menu:", ssCreateMenu("main"), dialogChannel); } } } listen(integer channel, string name, key id, string message) { if (channel == dialogChannel) { // Listen for Dialog Response if (id == llGetOwner()) { // If Owner is using Menu if (message == cmdConfig) {llDialog(id, "Config menu:", ssCreateMenu(message), dialogChannel); return;} // Show Config Menu //if (message == cmdFloatText) {llDialog(id, "Floating Text menu:", ssCreateMenu(message), dialogChannel); return;} // Show FloatText Menu if (message == cmdFreeNo) { // Disables Free Play Option freePlay = 0; llOwnerSay("FreePlay disabled."); return; } if (message == cmdFreeYes) { // Enables Free Play Option freePlay = 1; llOwnerSay("FreePlay enabled."); return; } if (message == cmdFreeOnly) { // Makes game ONLY Free to Play freePlay = 2; llOwnerSay("FreePlay only."); return; } if (message == cmdOn) { // Turns System On bGame = TRUE; llSetText("Game Ready!\nClick MENU to select Price!", <1.0, 1.0, 1.0>, 1.0); return; } if (message == cmdOff) { // Turns System Off bGame = FALSE; llSetText("Game Offline!", <1.0, 0,0>, 1.0); llMessageLinked(LINK_SET, -1, "stopGame", NULL_KEY); return; } if(message == cmdDebug) { if(DebugMode){ DebugMode = FALSE; llMessageLinked(LINK_THIS, -34, "debugOFF", NULL_KEY); }else{ DebugMode = TRUE; llMessageLinked(LINK_THIS, -34, "debugON", NULL_KEY); } } if(message==cmdResetStats){ bGame = FALSE; if(DebugMode){ llOwnerSay("Rebooting Machine..."); } llMessageLinked(LINK_SET, -420, "stopGame", NULL_KEY); llSleep(1.0); llMessageLinked(LINK_SET, -420, "Reboot", NULL_KEY); string ScriptName = llGetScriptName(); // Get Current Script integer ScriptTotal = llGetInventoryNumber(INVENTORY_SCRIPT); // Get Total Number of Scripts in Inventory integer i; for(i=0;i, 1); if (text != "") llWhisper(0, text); } timer() { llSetTimerEvent(0.0); llSetPayPrice(PAY_HIDE, [PAY_HIDE, PAY_HIDE, PAY_HIDE, PAY_HIDE]); llSetClickAction(CLICK_ACTION_TOUCH); } on_rez(integer p) { llResetScript(); } changed(integer c) { if (c & CHANGED_OWNER) llResetScript(); } }