====== Myriad Lite Module Rumors ====== // Myriad_Lite_Module_Rumors-v0.0.3-20131026.lsl // Copyright (c) 2013 by Allen Kerensky (OSG/SL) All Rights Reserved. // This work is dual-licensed under // Creative Commons Attribution (CC BY) 3.0 Unported // http://creativecommons.org/licenses/by/3.0/ // - or - // Modified BSD License (3-clause) // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // * Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // * Neither the name of Myriad Lite nor the names of its contributors may be // used to endorse or promote products derived from this software without // specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY EXPRESS OR // IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES // OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN // NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, // INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF // THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // The Myriad RPG System was designed, written, and illustrated by Ashok Desai // Myriad RPG System licensed under: // Creative Commons Attribution (CC BY) 2.0 UK: England and Wales // http://creativecommons.org/licenses/by/2.0/uk/ // FIXME - add RPEVENT // FIXME - add HELP // CONSTANTS - DO NOT CHANGE DURING RUN string BASENAME = "Myriad Lite Module Rumors"; string VERSION = "0.0.3"; // Allen Kerensky's script version string VERSIONDATE = "20131026"; // Allen Kerensky's script yyyymmdd // Module to Module Messaging Constants integer MODULE_RUMORS = -5; // Which Module Link Message number do I listen for? integer LM_SENDTOATTACHMENT = 0x80000000; integer RENDEZVOUS1 = -999; // regionwide rendezvous channel // RUNTIME GLOBALS - CAN CHANGE DURING RUN integer CHANOBJ; // channel of thing we're talking to string RUMOR; // the current rumor we've heard // // PPMA GET_VAL // string KEY_NOT_FOUND = "[KEY_NOT_FOUND]"; string GET_VAL(string dbkey,string field) { //OWNERSAY("GET_VAL KEY=["+dbkey+"] FIELD=["+field+"]"); string out = KEY_NOT_FOUND; integer i; string name; string desc; for ( i = 2; i <= llGetNumberOfPrims(); i++ ) { name = llList2String(llGetLinkPrimitiveParams(i,[PRIM_NAME]),0); desc = llList2String(llGetLinkPrimitiveParams(i,[PRIM_DESC]),0); if ( llToLower(name) == llToLower(dbkey) && llToLower(desc) == llToLower(field) ) { out = llList2String(llGetLinkPrimitiveParams(i,[PRIM_TEXT]),0); //DEBUG("GET_VAL RETURN=["+out+"]"); return out; // bail on first match? } } //OWNERSAY("GET_VAL RETURN=["+out+"]"); return out; } //SET_VAL(string dbkey, string field, string val) { // //OWNERSAY("SET_VAL KEY=["+dbkey+"] FIELD=["+field+"] VAL=["+val+"]"); // integer i; // string name; // string desc; // integer written = FALSE; // for ( i = 2; i <= llGetNumberOfPrims(); i++ ) { // name = llStringTrim(llList2String(llGetLinkPrimitiveParams(i,[PRIM_NAME]),0),STRING_TRIM); // desc = llStringTrim(llList2String(llGetLinkPrimitiveParams(i,[PRIM_DESC]),0),STRING_TRIM); // if ( ( llToLower(name) == llToLower(dbkey) && llToLower(desc) == llToLower(field) ) && written == FALSE ) { // //OWNERSAY("SET_VAL UPDATE RECORD=["+(string)i+"] DBKEY=["+dbkey+"] DESC=["+field+"] VAL=["+val+"]"); // llSetLinkPrimitiveParamsFast(i,[PRIM_NAME,dbkey,PRIM_DESC,field,PRIM_TEXT,val,ZERO_VECTOR,0.0]); // written = TRUE; // we did an update, remember it // } // } // if ( written == TRUE ) { // //OWNERSAY("SET_VAL UPDATE COMPLETE."); // return; // } // // data hasn't been written, scan for free prim // for ( i = 2; i <= llGetNumberOfPrims(); i++ ) { // name = llStringTrim(llList2String(llGetLinkPrimitiveParams(i,[PRIM_NAME]),0),STRING_TRIM); // desc = llStringTrim(llList2String(llGetLinkPrimitiveParams(i,[PRIM_DESC]),0),STRING_TRIM); // if ( ( name == "" && desc == "" ) && written == FALSE ) { // //OWNERSAY("SET_VAL INSERT RECORD=["+(string)i+"] DBKEY=["+dbkey+"] DESC=["+field+"] VAL=["+val+"]"); // llSetLinkPrimitiveParamsFast(i,[PRIM_NAME,dbkey,PRIM_DESC,field,PRIM_TEXT,val,ZERO_VECTOR,0.0]); // written = TRUE; // we did an update, remember it // } // } // if ( written == TRUE ) { // //OWNERSAY("SET_VAL INSERT COMPLETED."); // return; // } // //OWNERSAY("SET_VAL NO FREE RECORD FOUND TO INSERT INTO! DATA LOST"); //} ////////////////////////////////////////////////////////////////////////////// // FLAG FUNCTIONS // INCAPACITATED - lost wounds // DEAD - lost critical wounds // DEBUG - show debug messages or not // IDEA: INDECISION - lost resolve? // LMIM: SET_FLAG|= // PPMA: FLAG,, // LMOUT: FLAG|= // LMERR: FIXME integer GET_FLAG(string flag) { string val = GET_VAL("FLAG",llToUpper(flag)); if ( val == KEY_NOT_FOUND ) { ERROR("Flag ["+flag+"] does not exist."); } if ( val != "0" && val != "1") { ERROR("Flag: "+flag+" invalid value ["+val+"]"); } integer bool = (integer)val; return bool; } // SET_FLAG // LMIM: SET_FLAG|= // PPMA: FLAG,, // LMOUT: SET_FLAG|= // LMERR: FIXME //SET_FLAG(string flag,integer value) { // if ( flag == "" ) return; // FIXME add error // if ( value != TRUE && value != FALSE ) return; // FIXME add err // SET_VAL("FLAG",llToUpper(flag),(string)value); //} // DEBUG DEBUG(string debugmsg) { if ( GET_FLAG("DEBUG") == TRUE ) llMessageLinked(LINK_THIS,MODULE_RUMORS,"DEBUG|"+debugmsg,llGetOwner()); } // // ERROR // ERROR(string msg) { llMessageLinked(LINK_THIS,MODULE_RUMORS,"ERROR|"+msg,llGetOwner()); } // MEMORY GET_MEMORY() { OWNERSAY(BASENAME+" free memory: "+(string)llGetFreeMemory()); // show this module's free memory info } // GETVERSION GET_VERSION() { OWNERSAY(BASENAME+" v"+VERSION+"-"+VERSIONDATE); // show this module's version info } // // OWNERSAY // OWNERSAY(string msg) { llMessageLinked(LINK_THIS,MODULE_RUMORS,"OWNERSAY|"+msg,llGetOwner()); } // RESET - shut down running animations then reset the script to reload character sheet RESET() { // do any pre-shutddown cleanup first llResetScript(); // now reset } // SETUP - begin bringing the HUD online SETUP() { llRegionSay(RENDEZVOUS1,"RUMOR_SERVER_FIND"); OWNERSAY("Rumor module active."); } // DEFAULT STATE - load character sheet default { // LINK MESSAGE - commands to and from other prims in HUD link_message(integer sender,integer sending_module,string message, key speakerid) { if ( sending_module == MODULE_RUMORS || sending_module == LM_SENDTOATTACHMENT ) return; // ignore our own link messages // break down the commands and messages into units we can work with list fields = llParseString2List(message,["|"],[]); // break into list of fields based on "|"ider string command = llToUpper(llList2String(fields,0)); // assume the first field is a Myriad Lite command if ( command == "DEBUG" || command == "ERROR" || command == "HELP" || command == "OWNERSAY" || command == "REPEVENT" ) return; // ignore WELL commands //string data1 = llList2String(fields,1); //string data2 = llList2String(fields,2); //string data3 = llList2String(fields,3); // General Myriad Module Commnads if ( command == "MEMORY" ) { GET_MEMORY(); return;} // get memory info if ( command == "RESET" ) { RESET(); return;} // reset when told if ( command == "VERSION" ) { GET_VERSION(); return;} // get version when needed // only show link message debugs for module-specific stuff... DEBUG("EVENT: link_message("+(string)sender+","+(string)sending_module+","+message+","+(string)speakerid+")"); if ( command == "RUMOR_SERVER_FIND" ) { llRegionSay(RENDEZVOUS1,"RUMOR_FIND_SERVER"); return; } if ( command == "RUMOR_SERVER_FOUND" ) { // calculate dynamic channel of item/player talking to us CHANOBJ = (integer)("0x" + llGetSubString((string)speakerid,0,6)); OWNERSAY("This region supports Myriad Lite rumors."); return; } if ( command == "RUMOR_GET" ) { // does player want to get a rumor from system? llRegionSay(CHANOBJ,"RUMOR_GET|"+(string)llGetKey()); return; } if ( command == "RUMOR_SHOW" ) { // incoming rumor from the system RUMOR = ""; RUMOR = llGetSubString(message,llSubStringIndex(message,"|"),-1); OWNERSAY("You hear a rumor, \""+RUMOR+"\""); return; } if ( command == "RUMOR_MAIN" ) { // ask for rumor main menu (admins only) llRegionSay(CHANOBJ,"RUMOR_MAIN" ); return; } if ( command == "RUMOR_MODERATE" ) { // ask for first rumor to moderate (admins only) llRegionSay(CHANOBJ,"RUMOR_MODERATE" ); return; } if ( command == "RUMOR_YES" ) { // approve rumor (for admins only) llRegionSay(CHANOBJ,"RUMOR_LIST" ); return; } if ( command == "RUMOR_LIST" ) { // ask for list of all rumors in system (for admins only) llRegionSay(CHANOBJ,"RUMOR_LIST" ); return; } if ( command == "RUMOR_PENDING" ) { // ask for next pending rumor llRegionSay(CHANOBJ,"RUMOR_PENDING"); return; } if ( command == "RUMOR_NONE_PENDING" ) { // none left OWNERSAY("No rumors pending"); } if ( command == "RUMOR_APPROVE" ) { // approve a pending rumor (for admins only) llRegionSay(CHANOBJ,"RUMOR_APPROVE"); return; } if ( command == "RUMOR_APPROVED" ) { // confirmed OWNERSAY("Rumor approved."); return; } if ( command == "RUMOR_REMOVE" ) { // remove a pending llRegionSay(CHANOBJ,"RUMOR_REMOVE"); return; } if ( command == "RUMOR_REMOVED" ) { // confirmed OWNERSAY("Rumor Removed"); return; } if ( command == "RUMOR_PUT" ) { // does player want to put a rumor into system? llRegionSay(CHANOBJ,"RUMOR_PUT|"+llKey2Name(llGetOwner())+"|"+llList2String(fields,1)); return; } } // end listen // STATE ENTRY - called on Reset state_entry() { SETUP(); // show credits and start character sheet load } } // end state running // END