integer ingredient_channel = -8392888; integer containerChannel = -8392891; integer updater_channel = 15418070; integer card_channel = -32988199; integer hud_channel = -328478727; integer g_iSelectNum; list g_lPoints; integer g_iStarted; integer g_iExpectDeckLoad; list StrideOfList(list src, integer stride, integer start, integer end) { list l = []; integer ll = llGetListLength(src); if(start < 0)start += ll; if(end < 0)end += ll; if(end < start) return llList2List(src, start, start); while(start <= end) { l += llList2List(src, start, start); start += stride; } return l; } GiveUserPoint(key kUser){ // point list - user, num of points integer index = llListFindList(g_lPoints,[(string)kUser]); if(llListFindList(Players,[kUser])==-1)return;// User may have left game, dont give point to dead users if(index == -1){ g_lPoints += [(string)kUser, 1]; }else { integer curPoint = llList2Integer(g_lPoints,index+1); curPoint++; g_lPoints=llListReplaceList(g_lPoints,[curPoint], index+1,index+1); } UpScores(); } DeductPoint(key kUser){ integer index = llListFindList(g_lPoints,[(string)kUser]); if(llListFindList(Players,[kUser])==-1)return; if(index==-1)return; integer points = llList2Integer(g_lPoints, index+1); points--; g_lPoints = llListReplaceList(g_lPoints,[points], index+1,index+1); UpScores(); } integer GetUserPoints(key kUser) { integer index = llListFindList(g_lPoints,[(string)kUser]); if(llListFindList(Players,[kUser])==-1)return 0; if(index==-1)return 0; return llList2Integer(g_lPoints,index+1); } SetupDeck(){ string deckStr; list decks; integer i=0; integer end = llGetListLength(g_lSelectedDecks); for(i=0;i,1]); } list g_lJudgePile; integer g_iTotalJudgeUsers; list g_lSelectedDecks = ["OFFICIAL",1]; integer g_iCzar; string g_sVersion = "1.0.0.0008"; key g_kToken; float offset; integer DEBUG = FALSE; list g_lReqs; string URL = "https://api.zontreck.dev/zni"; Send(string Req,string method){ g_lReqs += [Req,method]; Sends(); } Sends(){ if(g_kCurrentReq == NULL_KEY){ DoNextRequest(); } //g_lReqs += [llHTTPRequest(URL + llList2String(lTmp,0), [HTTP_METHOD, "POST", HTTP_MIMETYPE, "application/x-www-form-urlencoded"], llDumpList2String(llList2List(lTmp,1,-1), "?"))]; } key g_kCurrentReq = NULL_KEY; DoNextRequest(){ if(llGetListLength(g_lReqs)==0)return; list lTmp = llParseString2List(llList2String(g_lReqs,0),["?"],[]); //if(DEBUG)llSay(0, "SENDING "+llList2String(g_lReqs,1)+" REQUEST: "+URL+llList2String(g_lReqs,0)); string append = ""; if(llList2String(g_lReqs,1) == "GET")append = "?"+llDumpList2String(llList2List(lTmp,1,-1),"?"); g_kCurrentReq = llHTTPRequest(URL + llList2String(lTmp,0) + append, [HTTP_METHOD, llList2String(g_lReqs,1), HTTP_MIMETYPE, "application/x-www-form-urlencoded"], llDumpList2String(llList2List(lTmp,1,-1),"?")); } integer Dice(integer NTimes, integer Max, integer Test1, integer Test2){ integer i=0; integer LTotal=0; for(i=0;i Test1&&Mean < Test2)return TRUE; else return FALSE; } list g_lListener; list g_lPending; REZ(key i){ if(g_iBlockRez)return; integer chan = llRound(llFrand(548937)); llRezObject("Cards Against Humanity HUD [ZNI]", llGetPos(), ZERO_VECTOR, ZERO_ROTATION, chan); g_lPending += [i, chan]; integer rnd = llRound(llFrand(5843758)); g_lListener += [i,rnd,llListen(rnd,"",i,"")]; llDialog(i, "Are you male or female?", ["Female", "Male"], rnd); llRequestPermissions(i, PERMISSION_TRIGGER_ANIMATION); } Rescan(){ list OldPlayers = Players; Players=[]; integer i=0; integer end = llGetNumberOfPrims(); integer ChairNumber = 0; //llSay(0, "Simulating player count"); list ToEvict = []; for(i=0;i<=end;i++){ vector Scale = llGetAgentSize(llGetLinkKey(i)); if(Scale != ZERO_VECTOR){ // This is an avatar integer Chair = llList2Integer(Chairs,ChairNumber); if(ChairNumber > llGetListLength(Chairs)) ToEvict += [llGetLinkKey(i)]; ChairNumber++; //llSay(0, "Discover: Avatar ID : secondlife:///app/agent/"+(string)llGetLinkKey(i)+"/about"); list ChairParams = llGetLinkPrimitiveParams(Chair, [PRIM_POS_LOCAL, PRIM_DESC]); list ChairData = llParseString2List(llList2String(ChairParams,1), ["`"],[]); if(llListFindList(OldPlayers, [llGetLinkKey(i)])==-1){ if(g_iJudging || !g_iStarted){ llMessageLinked(LINK_SET, 50, (string)llGetLinkKey(i), "9"); llInstantMessage(llGetLinkKey(i), "Rezzing a HUD. Please accept attachment permissions"); REZ(llGetLinkKey(i)); Players += llGetLinkKey(i); }else{ llMessageLinked(LINK_SET,50, (string)llGetLinkKey(i), "25"); ToEvict += [llGetLinkKey(i)]; //return; } }else Players += llGetLinkKey(i); llSetLinkPrimitiveParams(i, [PRIM_POS_LOCAL, llList2Vector(ChairParams,0)+<0,0,1>+(vector)llList2String(ChairData,1), PRIM_ROT_LOCAL, llEuler2Rot((vector)llList2String(ChairData,0)*DEG_TO_RAD)]); } } Compare(OldPlayers); Evict(ToEvict); if(llGetListLength(Players)==0 && llGetListLength(OldPlayers)!=0){ llMessageLinked(LINK_SET, 50, "", "10"); llSleep(1); llResetScript(); } } list Chairs=[]; list Players; Compare(list OldList){ // Check for who has left the game, then deactivate their HUD integer i=0; integer end = llGetListLength(OldList); for(i=0;i, "card": { "text": "data" } } if(!g_iHaiku){ integer boot = llRound(llFrand(43857483)); g_lPendingCards = [boot,"null|black"]; while(llGetListLength(g_lJudgePile)){ // send card back to server Send("/Modify_Card.php?TYPE_OVERRIDE=INSERT&CARD_TEXT="+llEscapeURL(llJsonGetValue(llList2String(g_lJudgePile, 0), ["card", "text"]))+"&TABLE_ID="+(string)g_kID, "POST"); g_lJudgePile = llDeleteSubList(g_lJudgePile, 0,0); } llRezObject("Playing Card [ZNI]", llGetPos(), ZERO_VECTOR,ZERO_ROTATION,boot); }else{ llMessageLinked(LINK_SET, 50, "", "21"); llSay(hud_channel, llList2Json(JSON_OBJECT, ["type", "die", "table", g_kID, "avatar", llList2Key(OldList,i)])); } } llSay(hud_channel, llList2Json(JSON_OBJECT, ["type","die","table",g_kID,"avatar", llList2Key(OldList,i)])); } } } Evict(list lLst){ integer i=0; integer end = llGetListLength(lLst); for(i=0;i= llGetListLength(Players)){ g_iCzar = 0; } } key czar = llList2String(Players,g_iCzar); llMessageLinked(LINK_SET, 50, (string)czar, "18"); llRegionSay(hud_channel, llList2Json(JSON_OBJECT, ["type", "select", "czar", czar, "sel_count", num_req, "table", g_kID, "points", llList2Json(JSON_OBJECT, g_lPoints)])); llMessageLinked(LINK_SET, 50, card_text, "19"); if(card_text == "Make a haiku.")g_iHaiku=1; if(g_iHaiku){ llMessageLinked(LINK_SET, 50, "", "20"); } llRegionSay(hud_channel, llList2Json(JSON_OBJECT, ["type", "czar", "card", card_text, "num", num_req])); g_iSelectNum = num_req; } llRegionSayTo(Sender, card_channel, llList2Json(JSON_OBJECT, ["type", "set", "card", llList2Json(JSON_OBJECT, ["text", card_text, "color", color, "num", num_req, "czar", llList2String(Players,g_iCzar), "user", llList2String(lTmp,3)])])); } } } else if(Script == "No More Cards"){ llMessageLinked(LINK_SET, 50, "", "21"); integer iLastHigh; key kLastHigh; integer x=0; integer xe = llGetListLength(g_lPoints); for(x=0;xiLastHigh){ iLastHigh=points; kLastHigh = User; } } llSay(0, "WINNER IS: secondlife:///app/agent/"+(string)kLastHigh+"/about with "+(string)iLastHigh+" points total!!"); llMessageLinked(LINK_SET, -30, (string)iLastHigh, kLastHigh); //llResetScript(); } else if(Script == "Modify_Product"){ if(llList2String(lTmp,1)=="Cards Against Humanity [ZNI]"){ if(g_sVersion != llList2String(lTmp,2)){ AddLogEntry(llKey2Name(llGetOwner()), "SYSTEM", 0, "Request delivery of product update: "+llGetObjectName()); llRegionSayTo(g_kToken,updater_channel,(string)g_kToken); Send("/Get_Server_URL.php?NAME=Products","GET"); llMessageLinked(LINK_SET, 50, "", "22"); } else { llRegionSayTo(g_kToken, updater_channel, "no_update"); llWhisper(0, "I am up to date"); } } } else if(Script == "Get_Server_URL"){ if(llList2String(lTmp,1)=="Products"){ llHTTPRequest(llList2String(lTmp,2), [HTTP_METHOD,"POST", HTTP_MIMETYPE, "application/x-www-form-urlencoded"], llList2Json(JSON_OBJECT, ["creator", llGetInventoryCreator(llGetScriptName()), "owner", llGetOwner(), "product", "Cards Against Humanity [ZNI]"])); state ingred; } } Sends(); } } listen(integer c,string n,key i, string m){ //if(DEBUG) llSay(0, "LISTEN: "+llDumpList2String([c,n,i,m], " - ")); if(c==hud_channel){ if(llJsonGetValue(m,["type"])=="card_request"){ integer card_count = (integer)llJsonGetValue(m,["count"]); Send("/Modify_Card.php?TYPE_OVERRIDE=GET_CARD&TABLE_ID="+(string)g_kID+"&COLOR=0&DRAW_COUNT="+(string)card_count+"&SENDER="+(string)i+"&REZZED=0", "POST"); } else if(llJsonGetValue(m,["type"])=="alive"){ integer index = llListFindList(g_lPending,[(integer)llJsonGetValue(m,["boot"])]); if(index==-1)return; else { // Boot the HUD //if(DEBUG)llSay(0, "Sending HUD Activation signal"); index--; 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++; CheckForJudging(); } else if(llJsonGetValue(m,["type"])=="use_point"){ //list lCards = llJson2List(llJsonGetValue(m,["cards"])); llMessageLinked(LINK_SET, -12, llJsonGetValue(m,["cards"]), ""); key user = (key)llJsonGetValue(llList2String(llJson2List(llJsonGetValue(m,["cards"])),0),["user"]); //UploadCards(lCards); DeductPoint(user); } } else if(c==card_channel){ if(llJsonGetValue(m,["type"])=="alive"){ //llSay(0, "IN ALIVE BLOCK"); integer index = llListFindList(g_lPendingCards,[(integer)llJsonGetValue(m,["boot"])]); if(index==-1){ //llWhisper(0, "Bootup value not found: "+llJsonGetValue(m,["boot"])); return; } string pendingCommand = llList2String(g_lPendingCards,index+1); list lCmd = llParseString2List(pendingCommand, ["|"],[]); g_lPendingCards = llDeleteSubList(g_lPendingCards,index,index+1); //g_lPendingCards = llListRandomize(g_lPendingCards, 2); // Calculate position offset if(llList2String(lCmd,0) == "null"){ offset = 0.0; } vector relativeBase = <-0.43321, -0.44624, 0.54937>; float addtlRowOffset = 0.3; if(g_iSelectNum>1){ if(g_iCurRow == 1)addtlRowOffset=0; else addtlRowOffset = addtlRowOffset * (g_iCurRow-1); } else addtlRowOffset = 0; vector relativePos = relativeBase; relativePos.y += offset; relativePos.x += addtlRowOffset; relativePos = relativePos * llGetLocalRot(); relativePos += llGetPos(); //llWhisper(0, "Rez card to position for boot ("+llJsonGetValue(m,["boot"])+") : "+(string)relativePos); llRegionSayTo(i, (integer)llJsonGetValue(m,["boot"]), llList2Json(JSON_OBJECT, ["type", "activate", "table", g_kID, "pos", relativePos, "rot", llGetRot()])); //if(DEBUG)llSay(0, "Alive request on the Cards Channel: "+m); string color = "1"; if(g_iSelectNum > 1){ if(g_iCurRow >= g_iSelectNum || g_iCurRow == 4){ offset += 0.2; g_iCurRow = 1; } else { g_iCurRow++; } } else offset += 0.25; string cmd= "GET_CARD"; llSleep(3); 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)])])); //Send("/Modify_Card.php?TYPE_OVERRIDE=INSERT&TABLE_ID="+(string)g_kID+"&CARD_TEXT="+llEscapeURL(llStringToBase64(llList2String(lCmd,1))), "POST"); // remove this card from judge pile 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"]); GiveUserPoint(kUser); g_iSelectNum--; g_iCurRow=1; if(g_iSelectNum == 0){ g_iJudging=0; llMessageLinked(LINK_SET, 50, (string)kUser, "23"); llSay(card_channel, llList2Json(JSON_OBJECT, ["type", "die", "table", g_kID])); // Start next round! // Load the next black card to trigger selection mode if(!g_iHaiku){ 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 llMessageLinked(LINK_SET,-11,"",""); llSetTimerEvent(5); integer chan = llRound(llFrand(548378)); g_lPendingCards += [chan, "null|black"]; llRezObject("Playing Card [ZNI]", llGetPos(), ZERO_VECTOR, ZERO_ROTATION, chan); } else if(name == "ANIM"){ key i = llDetectedKey(0); integer rnd = llRound(llFrand(5843758)); g_lListener += [i,rnd,llListen(rnd,"",i,"")]; 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..."); } } } link_message(integer s,integer n,string m,key i){ if(n==-2){ llResetScript(); } else if(n == 999){ SetupDeck(); } } } state ingred { state_entry(){ llSetTimerEvent(0); llListen(ingredient_channel, "", "", ""); llSetText("Cards Against Humanity Settings\n----\nQuantity: 1", <0,1,0>,1); } on_rez(integer t){ llListen(ingredient_channel, "", "", ""); } changed(integer c){ if(c&CHANGED_REGION_START){ llListen(ingredient_channel, "", "", ""); } } listen(integer c,string n,key i,string m){ if(m == "scan"){ llRegionSayTo(i,ingredient_channel+1, "CAH_TABLE"); }else if(m == (string)llGetKey()){ llDie(); } } touch_start(integer t){ llSay(0, "Cards Against Humanity Settings\n___\nQuantity: 1"); llSay(ingredient_channel+1, "CAH_TABLE"); } }