User:Allen Kerensky/Myriad Lite Preview 5/Resiliences Server
From OpenSimulator
< User:Allen Kerensky | Myriad Lite Preview 5
Revision as of 14:59, 6 February 2012 by Allen Kerensky (Talk | contribs)
Myriad Lite Resiliences Server
Myriad_Lite_Resiliences_Server-v0.0.0-2011105.lsl
// Myriad_Lite_Resilience_Server-v0.0.0-20111005.lsl // The Myriad RPG System was designed, written, and illustrated by Ashok Desai // Myriad RPG licensed under the Creative Commons Attribution 2.0 UK: England and Wales // http://creativecommons.org/licenses/by/2.0/uk/ // Myriad Lite software Copyright (c) 2011 by Allen Kerensky (OSG/SL) // Myriad Lite licensed under the // Creative Commons Attribution-Share Alike-Non-Commercial 3.0 Unported // http://creativecommons.org/licenses/by-nc-sa/3.0/ // CONSTANTS - DO NOT CHANGE DURING RUN string VERSION = "0.0.0"; // Allen Kerensky's script version string VERSIONDATE = "20111005"; // Allen Kerensky's script yyyymmdd integer CHAN_MYRIAD = -999; // regionwide channel for Myriad events string CARD = "Myriad_Lite_Resiliences-v0.0.0-20111005.csv"; // notecard data table // RUNTIME GLOBALS - CAN CHANGE DURING RUN integer HAND_MYRIAD; // llListenRemove handle for Myriad regional channel list RESILIENCES; // names of resiliences list BASE_STATS; // stat this resilience is based on, indexed by name order list TYPES; // critical or noncritical, indexed by name order list ACTIONS; // actions when crit stat goes zero, indexed by name order list DESCRIPTIONS; // description. indexed by name order integer LINE = 0; // reading line number key QUERY = NULL_KEY; // track notecard queries // DEBUG - show debug messages DEBUG(string dmessage) { llOwnerSay("DEBUG: "+dmessage); } // SETUP - begin SETUP() { if ( HAND_MYRIAD != 0 ) llListenRemove(HAND_MYRIAD); // is there already a listener? clear it HAND_MYRIAD = llListen(CHAN_MYRIAD,"",NULL_KEY,""); // start region channel listener DEBUG("Resilience server "+VERSION+" "+VERSIONDATE+" loading Resiliences. Please wait..."); // tell player we're waiting for data server QUERY = llGetNotecardLine(CARD,LINE++); // ask for line from notecard and advance to next line } // RESET - reload RESET() { llResetScript(); // now reset } LIST_RESILIENCES(key id) { integer replyto = (integer)("0x"+llGetSubString((string)id,0,6)); // calculate requestor-specific chat channel to reply to // we have to work around llRegionSay max string length 1023 characters integer items = llGetListLength(RESILIENCES); // how many total items to send? integer count; // which item are we processing now? string out = "RESILIENCES|"; // start an output list integer firstflag = TRUE; // is this first item in new list? while (count < items ) { // do we still have items in list to send? string name = llList2String(RESILIENCES,count); // get the name of current item if ( llStringLength(out+","+name) <= 1016) { // is our output list under the string length limit? if ( firstflag == TRUE ) { // first item in list does not need a comma prefix out += name; // add this item as first in the output list firstflag = FALSE; // turn off first flag since next item won't be } else { // not first item in list, prefix with comma out += ","+name; // add a comma and this resilience to existing list } } else { // output string > 1016 chars long llRegionSay(replyto,out); // send current output string out = "RESILIENCES|"+name; // start a new one and add current item to that } count++; // done putting this item in a list, set counter to next } llRegionSay(replyto,out); // say last line of output } GET_RESILIENCE(key id,string msg) { integer replyto = (integer)("0x"+llGetSubString((string)id,0,6)); // calculate requestor-specific chat channel to reply to list tokens = llParseString2List(msg,["|"],[]); // split msg into list around pipe symbols string resilience = llList2String(tokens,1); // the name of the item to get integer listpos = llListFindList(RESILIENCES,[resilience]); // get the position of that item in the list string reply = "RESILIENCE"; // start output item data NO PLURAL here - we're sending 1 resilience if ( listpos != -1 ) { // was item name in the list? reply += "|RESILIENCE="+llList2String(RESILIENCES,listpos); // add resilience name to output reply += "|BASE_STAT="+llList2String(BASE_STATS,listpos); // add resilience base stat to output reply += "|TYPE="+llList2String(TYPES,listpos); // add resilience type to output reply += "|ACTION="+llList2String(ACTIONS,listpos); // add resilience action to output reply += "|DESCRIPTION="+llList2String(DESCRIPTIONS,listpos); // add resilience description to output llRegionSay(replyto,reply); // send it to requestor FIXME what if output greater than 1016 chars? } else { llRegionSay(replyto,"RESILIENCE|ERROR=Requested Resilience("+resilience+") not found"); // item requested does not exist, return an error } } SET_RESILIENCE() { // FIXME - do we need this? } // DEFAULT STATE default { // STATE ENTRY - called on Reset state_entry() { SETUP(); // show credits and start notecard data load } // on_rez - when rezzed to ground or from inventory as attachment during login on_rez(integer params) { params = 0; // LSLINT RESET(); // force to go through state entry } // attach - when attached or detached from inventory or during login attach(key id) { id = NULL_KEY; // LSLINT RESET(); // force to go through state entry } // dataserver called for each line of notecard requested dataserver(key queryid,string data) { if ( queryid == QUERY ) { // dataserver gave us line we asked for? if ( data != EOF ) { // we're not at end of notecard file? if ( llGetSubString(data,0,0) == "#" ) { // does this line start with comment mark? QUERY = llGetNotecardLine(CARD,LINE++); // ignore comment and ask for the next line return; } // Parse non-comment lines in keyword = value[,value,...] format list fields = llParseString2List(data,[","],[]); // break line of text into = delimited fields RESILIENCES = RESILIENCES + [llStringTrim(llList2String(fields,0),STRING_TRIM)]; // add resilience name field to list BASE_STATS = BASE_STATS + [llStringTrim(llList2String(fields,1),STRING_TRIM)]; // add resilience base stat field to list TYPES = TYPES + [llStringTrim(llList2String(fields,2),STRING_TRIM)]; // add resilience type field to list ACTIONS = ACTIONS + [llStringTrim(llList2String(fields,3),STRING_TRIM)]; // add resilience actions field to list DESCRIPTIONS = DESCRIPTIONS + [llStringTrim(llList2String(fields,4),STRING_TRIM)]; // add resilience description field to list QUERY = llGetNotecardLine(CARD,LINE++); // finished with known keywords, get next line } else { // end of notecard DEBUG("Resiliences Loaded. Server ready. Free Memory: "+(string)llGetFreeMemory()); // done, ready to serve } // end if data not equal eof } // end if query id equal } // end if data server event listen(integer channel,string name,key id,string msg) { channel = 0; // LSLINT name = ""; // LSLINT list tokens = llParseString2List(msg,["|"],[ ]); // split msg into list around pipe symbols string command = llList2String(tokens,0); // first field is some sort of command if ( command == "LIST_RESILIENCES" ) { // is this a list all resiliences request? LIST_RESILIENCES(id); // call it return; // return early instead of processing more } if ( command == "GET_RESILIENCE" ) { // GET_RESILIENCE|string resiliencename GET_RESILIENCE(id,msg); // call it return; // return early instead of processing more } if ( command == "SET_RESILIENCE" ) { SET_RESILIENCE(); // call it return; // return early in case we add more later } } } // end default state