From 97f0e4a475eccd7ea280b1195601ffc7204480a0 Mon Sep 17 00:00:00 2001 From: Tara Date: Sun, 25 Dec 2022 12:39:58 -0700 Subject: [PATCH] Began process to make the game more stable --- SOURCE/LSL/Card.lsl | 2 +- SOURCE/LSL/HUD.lsl | 29 ++++-- SOURCE/LSL/{CAH.lsl => Table.lsl} | 146 ++++++++++++++++++++++++++++-- SOURCE/LSL/UserCard.lsl | 102 +++++++++++++++++++++ 4 files changed, 262 insertions(+), 17 deletions(-) rename SOURCE/LSL/{CAH.lsl => Table.lsl} (69%) create mode 100644 SOURCE/LSL/UserCard.lsl diff --git a/SOURCE/LSL/Card.lsl b/SOURCE/LSL/Card.lsl index 2af4bbe..1f14365 100644 --- a/SOURCE/LSL/Card.lsl +++ b/SOURCE/LSL/Card.lsl @@ -25,7 +25,7 @@ default }else{ llListenRemove(genericListen); genericListen = llListen(card_channel, "", "", ""); - llSay(0, "Card is trying to find a table"); + //llSay(0, "Card is trying to find a table"); llListen(t, "", "", ""); g_iStart=t; llSay(card_channel, llList2Json(JSON_OBJECT, ["type", "alive", "boot", t])); diff --git a/SOURCE/LSL/HUD.lsl b/SOURCE/LSL/HUD.lsl index 8bbf93d..bb23761 100644 --- a/SOURCE/LSL/HUD.lsl +++ b/SOURCE/LSL/HUD.lsl @@ -1,6 +1,8 @@ integer g_iStartParam; key g_kUser; key g_kTable; +key g_kActualTable; +integer DEBUG=FALSE; integer card_channel = -32988199; integer hud_channel = -328478727; @@ -15,9 +17,13 @@ Cards(){ integer e = 10; integer CurCard = 1; integer NCard = 0; + + if(DEBUG)llSay(0, "CARD LIST: "+llDumpList2String(g_lCards, " - ")); + for(x=0;x x){ string card_params = llList2String(g_lCards,x); + if(DEBUG)llSay(0,"Card Parameters: "+card_params); llMessageLinked(LINK_SET,0,llJsonGetValue(card_params,["text"]), "fw_data : card_text"+(string)CurCard); } else { NCard++; @@ -30,21 +36,25 @@ Cards(){ if(NCard>0){ integer CardsToRequest = NCard; + if(CardsToRequest>0)CardsToRequest=1; if(CardsToRequest == 0)return; else { - llRegionSayTo(g_kTable,hud_channel, llList2Json(JSON_OBJECT, ["type","card_request","count", CardsToRequest])); + llOwnerSay("Drawing "+(string)CardsToRequest+" cards"); + llRegionSayTo(g_kActualTable,hud_channel, llList2Json(JSON_OBJECT, ["type","card_request","count", CardsToRequest])); } } } - +integer g_iVis=0; POS(){ if(!llGetAttached())return; + g_iVis=1; vector local = <0.02395, 0.47113, -0.15166>; llSetPrimitiveParams([PRIM_POS_LOCAL, local]); } POS2(){ if(!llGetAttached())return; + g_iVis=0; vector local = <0.02395, 1.77734, -0.15166>; llSetPrimitiveParams([PRIM_POS_LOCAL, local]); } @@ -122,10 +132,12 @@ default } listen(integer c,string n,key i,string m){ + if(DEBUG)llSay(0, m); if(g_iStartParam == c){ // listen for the UUID of who to attach the HUD to! if(llJsonGetValue(m,["type"])=="activate"){ g_kTable = (key)llJsonGetValue(m,["table"]); + g_kActualTable = i; llWhisper(0, "HUD now activating..."); key g_kUser = (key)llJsonGetValue(m, ["user"]); llRequestPermissions(g_kUser, PERMISSION_ATTACH); @@ -138,13 +150,16 @@ default if(llGetListLength(g_lCards)<10 && llListFindList(g_lCards,[llJsonGetValue(m,["card"])])==-1){ g_lCards += llJsonGetValue(m,["card"]); s("Added card: "+llJsonGetValue(m,["card", "text"])); + Cards(); } } } else if(llJsonGetValue(m,["type"]) == "select"){ + if(g_kTable != (key)llJsonGetValue(m,["table"]))return; if(llJsonGetValue(m,["czar"]) == (string)g_kUser){ s("You are the Card Czar, hiding the HUD"); POS2(); g_iCanSelect=0; + Cards(); } else { g_iSelectNum = (integer)llJsonGetValue(m,["sel_count"]); POS(); @@ -156,6 +171,7 @@ default g_iCanSelect=1; } } else if(llJsonGetValue(m,["type"]) == "judging"){ + if(g_kTable != (key)llJsonGetValue(m,["table"]))return; s("Judging begun. HUD hidden!"); POS2(); g_lSelected=[]; @@ -167,7 +183,7 @@ default g_iChan=0; } } else if(llJsonGetValue(m,["type"])=="die"){ - llSay(0, "(DEBUG)\nm: "+m+"\n-> Table: "+(string)g_kTable+"\n-> User: "+(string)g_kUser); + if(DEBUG)llSay(0, "(DEBUG)\nm: "+m+"\n-> Table: "+(string)g_kTable+"\n-> User: "+(string)g_kUser); if(llJsonGetValue(m,["table"])==(string)g_kTable){ if(llJsonGetValue(m,["avatar"])==(string)g_kUser || llJsonGetValue(m,["avatar"])==(string)NULL_KEY || llJsonGetValue(m,["avatar"])==""){ llSay(0, "Deactivating HUD"); @@ -193,6 +209,7 @@ default integer CardNum = llList2Integer(g_lSelected, x); string CardQuery = llList2String(g_lCards, (CardNum-1)); lToRemove += CardQuery; + CardQuery = llJsonSetValue(CardQuery, ["user"], g_kUser); sActualCardData = llJsonSetValue(sActualCardData, [x], CardQuery); } x=0; @@ -210,7 +227,7 @@ default Highlight(); Cards(); //llSay(0, "(DEBUG) Sending card(s) to table: "+sActualCardData); - llRegionSayTo(g_kTable, hud_channel, llList2Json(JSON_OBJECT, ["type", "cards", "cards", sActualCardData])); + llRegionSayTo(g_kActualTable, hud_channel, llList2Json(JSON_OBJECT, ["type", "cards", "cards", sActualCardData])); POS2(); } } @@ -232,7 +249,7 @@ default attach(key id){ if(id == NULL_KEY){ llWhisper(0, "HUD is deactivating..."); - llRegionSayTo(g_kTable, hud_channel, llList2Json(JSON_OBJECT, ["type", "leave", "avatar", g_kUser])); + llRegionSayTo(g_kActualTable, hud_channel, llList2Json(JSON_OBJECT, ["type", "leave", "avatar", g_kUser])); //llRemoveInventory(llGetScriptName()); } else { g_kUser=id; @@ -306,7 +323,7 @@ state detach state_entry(){ integer i=0; integer end = llGetNumberOfPrims(); - for(i=1;i<=end;i++){ + for(i=2;i<=end;i++){ llSetLinkPrimitiveParamsFast(i,[PRIM_SIZE,ZERO_VECTOR,PRIM_POS_LOCAL,ZERO_VECTOR,PRIM_ROT_LOCAL,ZERO_ROTATION]); } llSleep(2); diff --git a/SOURCE/LSL/CAH.lsl b/SOURCE/LSL/Table.lsl similarity index 69% rename from SOURCE/LSL/CAH.lsl rename to SOURCE/LSL/Table.lsl index 2f72e18..6282d7c 100644 --- a/SOURCE/LSL/CAH.lsl +++ b/SOURCE/LSL/Table.lsl @@ -6,6 +6,7 @@ integer card_channel = -32988199; integer hud_channel = -328478727; list g_lPoints; +integer g_iStarted; GiveUserPoint(key kUser){ // point list - user, num of points integer index = llListFindList(g_lPoints,[kUser]); @@ -16,10 +17,38 @@ GiveUserPoint(key kUser){ curPoint++; g_lPoints=llListReplaceList(g_lPoints,[curPoint], index+1,index+1); } + UpScores(); } + +UpScores(){ + + integer i=0; + integer iScores; + integer end = llGetNumberOfPrims(); + for(i=0;i<=end;i++){ + string name = llGetLinkName(i); + if(name == "Scores"){ + iScores=i; + jump outScore; + } + } + @outScore; + i=0; + end=llGetListLength(g_lPoints); + string sScores; + for(i=0;i,1]); +} + +list g_lJudgePile; +integer g_iTotalJudgeUsers; + string g_sVersion = "1.0.0.0000"; key g_kToken; integer DEBUG = FALSE; +float offset; list g_lReqs; string URL = "https://api.zontreck.dev/ls_bionics"; Send(string Req,string method){ @@ -142,11 +171,14 @@ key g_kID; integer g_iBlockRez = 0; key g_kCurrentBlackCard; list g_lPendingCards; + default { state_entry() { + llSitTarget(ZERO_VECTOR,ZERO_ROTATION); Chairs=[]; + UpScores(); //llSay(0, "Activating Setup Mode"); //llSay(0, "Scanning linkset for positions of prims"); integer i=0; @@ -246,12 +278,13 @@ state active g_iBlockRez=0; g_lPending=[]; + llSay(card_channel, llList2Json(JSON_OBJECT, ["type", "die", "table", g_kID])); llListen(hud_channel, "", "", ""); llListen(card_channel, "", "", "");/* integer chan = llRound(llFrand(548378)); g_lPendingCards += [chan, "null|black"]; llRezObject("Playing Card [LS]", llGetPos(), ZERO_VECTOR, ZERO_ROTATION, chan);*/ - llSitTarget(<0,0,1>, ZERO_ROTATION); + } http_response(key r,integer s,list m,string b){ @@ -260,14 +293,16 @@ state active g_lReqs = llDeleteSubList(g_lReqs,0,1); list lTmp = llParseString2List(b,[";;",";"],[]); + if(DEBUG)llSay(0, "HTTP REPLY: "+b); string Script = llList2String(lTmp,0); if(Script == "Modify_Deck"){ llSay(0, "Deck generated!"); } else if(Script == "Get_Card"){ key Sender = (key)llList2String(lTmp,1); - list Params = llJson2List(llBase64ToString(llList2String(lTmp,2)));//llParseString2List(llBase64ToString(llList2String(lTmp,2)), ["|"],[]); - if(DEBUG)llSay(0, "HTTP REPLY: "+b); + list Params = llJson2List(llBase64ToString(llList2String(lTmp,2))); if(DEBUG)llSay(0, "PARAMETER LIST: "+llList2CSV(Params)); + + //llParseString2List(llBase64ToString(llList2String(lTmp,2)), ["|"],[]); integer i=0; integer end = llGetListLength(Params); for(i=0;iiLastHigh){ + iLastHigh=points; + kLastHigh = User; + } + } + + llSay(0, "WINNER IS: secondlife:///app/agent/"+(string)kLastHigh+"/about with "+(string)iLastHigh+" points total!!"); + llResetScript(); } @@ -324,24 +387,62 @@ state active llRegionSayTo(i,llList2Integer(g_lPending,index+1), llList2Json(JSON_OBJECT, ["type", "activate", "user", llList2String(g_lPending,index), "table", g_kID])); g_lPending = llDeleteSubList(g_lPending, index,index+1); } + } else if(llJsonGetValue(m,["type"]) == "cards"){ + list lCards = llJson2List(llJsonGetValue(m,["cards"])); + g_lJudgePile += lCards; + g_iTotalJudgeUsers++; + + if(g_iTotalJudgeUsers == llGetListLength(Players)-1){ + llSay(hud_channel, llList2Json(JSON_OBJECT, ["type", "judging", "table", g_kID])); + llSay(0, "Card Czar: Pick the card you want!"); + // Initiate the rezzing procedure + integer x =0; + integer e = llGetListLength(g_lJudgePile); + for(x=0;x])); + if(llList2String(lCmd,0) == "null"){ + offset = 0.0; + } + llRegionSayTo(i, card_channel, llList2Json(JSON_OBJECT, ["type", "position", "pos", llGetPos()+<0,offset,0.75>])); if(DEBUG)llSay(0, "Alive request on the Cards Channel: "+m); - Send("/Modify_Card.php?TYPE_OVERRIDE=GET_CARD&TABLE_ID="+(string)g_kID+"&COLOR=1&DRAW_COUNT=1&SENDER="+(string)i+"&REZZED=1", "POST"); + + string color = "1"; + offset += 0.25; + string cmd= "GET_CARD"; + if(llList2String(lCmd,1) != "black"){ + //cmd = "SEARCH&CARD_TEXT="+llStringToBase64(llList2String(lCmd,1))+"&AVATAR="+llList2String(lCmd,0); + color="0"; + llRegionSayTo(i, card_channel, llList2Json(JSON_OBJECT, ["type", "set","card", llList2Json(JSON_OBJECT, ["text", llList2String(lCmd,1), "color", 0, "num", 0, "czar", llList2String(Players, g_iCzar), "user", llList2String(lCmd,0)])])); + return; + } + Send("/Modify_Card.php?TYPE_OVERRIDE="+cmd+"&TABLE_ID="+(string)g_kID+"&COLOR="+color+"&DRAW_COUNT=1&SENDER="+(string)i+"&REZZED=1", "POST"); + + } else if(llJsonGetValue(m,["type"]) == "final"){ key kUser = (key)llJsonGetValue(m,["user"]); @@ -351,6 +452,19 @@ state active llSay(card_channel, llList2Json(JSON_OBJECT, ["type", "die", "table", g_kID])); // Start next round! // Load the next black card to trigger selection mode + integer boot = llRound(llFrand(5483758)); + g_lPendingCards += [boot, "null|black"]; + + integer x =0; + integer ends = llGetListLength(g_lJudgePile); + g_iTotalJudgeUsers = 0; + for(x=0;x 1)){ llSay(0, "Must have more than 1 player to start!"); + return; } // Begin the game loop + llSetTimerEvent(5); integer chan = llRound(llFrand(548378)); g_lPendingCards += [chan, "null|black"]; llRezObject("Playing Card [LS]", llGetPos(), ZERO_VECTOR, ZERO_ROTATION, chan); @@ -398,6 +519,11 @@ state active llDialog(i, "Are you male or female?", ["Female", "Male"], rnd); llRequestPermissions(i, PERMISSION_TRIGGER_ANIMATION); + } else if(name == "STOP"){ + if(g_iStarted){ + Send("/Modify_Card.php?TYPE_OVERRIDE=NULCARD&TABLE_ID="+(string)g_kID,"GET"); + llSay(0, "Stopping the game please wait..."); + } } } } \ No newline at end of file diff --git a/SOURCE/LSL/UserCard.lsl b/SOURCE/LSL/UserCard.lsl new file mode 100644 index 0000000..e8090b5 --- /dev/null +++ b/SOURCE/LSL/UserCard.lsl @@ -0,0 +1,102 @@ +string g_sPath; +integer g_iColor; +integer g_iNum; +string g_sText; +key g_kAuthor; + +integer g_iChan; +integer g_iLstn; +default +{ + state_entry() + { + llMessageLinked(LINK_SET,0,"","fw_reset"); + } + + changed(integer x){ + if(x&CHANGED_REGION_START){ + llResetScript(); + } + } + + on_rez(integer t){ + if(t == 0){ + llResetScript(); + } + } + + link_message(integer s,integer n,string m,key i){ + if(n==0){ + if(i=="fw_ready"){ + g_sPath = "/"; + llMessageLinked(LINK_SET,0,"c=black", "fw_conf : card_text"); + llMessageLinked(LINK_SET,0,"c=black", "fw_conf : card_helpertext"); + llSetLinkColor(LINK_ROOT, <1,1,1>, 0); + llSetLinkColor(LINK_ROOT, <1,1,1>, 1); + g_iChan = llRound(llFrand(54738577)); + g_iLstn = llListen(g_iChan, "", llGetOwner(), ""); + llDialog(llGetOwner(), "[Playing Card]\n\nIs this card supposed to be a black card or a white card?", ["White", "Black"], g_iChan); + } + } + } + + listen(integer c,string n,key i,string m){ + if(g_sPath == "/"){ + if(m == "White"){ + g_iColor=0; + llMessageLinked(LINK_SET,0,"Cards Against Humanity", "fw_data : card_helpertext"); + llTextBox(llGetOwner(), "[Playing Card]\n\nWhat text should be on the card?", g_iChan); + g_sPath = "/text"; + } else if(m == "Black"){ + g_iColor=1; + llMessageLinked(LINK_SET,0,"c=white","fw_conf : card_text"); + llMessageLinked(LINK_SET,0,"c=white","fw_conf : card_helpertext"); + llSetLinkColor(LINK_ROOT,<0.2,0.2,0.2>,1); + llSetLinkColor(LINK_ROOT,<0.2,0.2,0.2>,0); + + g_sPath = "/num_req"; + llDialog(llGetOwner(), "[Playing Card]\n\nHow many cards do you want to require the player to draw?", ["1","2", "3","4","5","6","7","8","9","10"], g_iChan); + } + } else if(g_sPath == "/text"){ + llMessageLinked(LINK_SET,0,m,"fw_data : card_text"); + g_sText = m; + g_sPath = "/confirm"; + llDialog(llGetOwner(), "Does this card look correct?\n\nIf you select yes, your card will be uploaded to the community deck for this year. If you decide you no longer wish your card to be uploaded, you will need to contact LS Bionics Support", ["Yes", "No"], g_iChan); + } else if(g_sPath == "/num_req"){ + g_iNum = (integer)m; + g_sPath = "/text"; + if(g_iNum == 1){ + llMessageLinked(LINK_SET,0,"Cards Against Humanity", "fw_data : card_helpertext"); + }else llMessageLinked(LINK_SET,0,"Pick ("+(string)g_iNum+")\nDraw ("+(string)g_iNum+")", "fw_data : card_helpertext"); + llTextBox(llGetOwner(), "What text do you want on this card?", g_iChan); + } else if(g_sPath == "/confirm"){ + if(m == "Yes"){ + llSay(0, "Uploading card..."); + list dat = llParseString2List(llGetDate(),["-"],[]); + llSetObjectName("CAH: "+llList2String(dat,0)+" Playing Card [LS]"); + llSetObjectDesc("Card created by: "+llKey2Name(llGetOwner())); + g_kAuthor = llGetOwner(); + string CARD_ID = (string)llGetOwner()+"-"+(string)llGetUnixTime(); + llHTTPRequest("https://api.zontreck.dev/ls_bionics/Modify_Card.php", [HTTP_METHOD, "POST", HTTP_MIMETYPE, "application/x-www-form-urlencoded"], "DECK="+llList2String(dat,0)+"&CARD_TEXT="+llStringToBase64(g_sText)+"&COLOR="+(string)g_iColor+"&DRAW_COUNT="+(string)g_iNum+"&CARD_ID="+llEscapeURL(CARD_ID)); + state myCard; + } else if(m == "No"){ + llSay(0, "Card creation cancelled! Deleting temp data"); + llResetScript(); + } + } + } +} + +state myCard +{ + state_entry(){ + llRemoveInventory("FURWARE text v2.0.1"); + llSay(0, "You now have the only permanent physical copy of this card on the grid as you are the card's creator!"); + llSay(0, "You can play with this card if you have this year's community deck purchased."); + llSay(0, "NOTE: If you decide to remove this card from play in the community deck, you will need to send this physical card object to the LS support representative."); + llSay(0, "(This card is now read-only. The required script for modification of the mesh text has been removed)"); + } + touch_start(integer t){ + llSay(0, "/me created by secondlife:///app/agent/"+(string)g_kAuthor+"/about"); + } +} \ No newline at end of file