User:Allen Kerensky/Myriad Lite Preview 5/Module Armor

= Myriad Lite Module: Armor =

The Myriad Lite Module Armor script (below) goes into the Myriad Lite HUD.

More information such as API messages will be in a later Preview release.

Myriad_Lite_Module_Armor-v0.0.5-20120130.lsl
// Myriad_Lite_Module_Armor-v0.0.0-20120125.lsl // Copyright (c) 2012 By Allen Kerensky (OSG/SL) // 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-2012 by Allen Kerensky (OSG/SL) // Baroun's Adventure Machine Copyright (c) 2008-2011 by Baroun Tardis (SL) // Myriad Lite and Baroun's Adventure Machine licensed under the // Creative Commons Attribution-Share Alike-Non-Commercial 3.0 Unported // http://creativecommons.org/licenses/by-nc-sa/3.0/ // You must agree to the terms of this license before making any use of this software. // If you do not agree to this license, simply delete these materials. // There is no warranty, express or implied, for your use of these materials.

key PLAYERID = NULL_KEY; // cached player UUID

integer LM_ATTACHARMOR  = 0x80000000; integer LM_DETACHARMOR  = 0x80000001; integer LM_ARMORCURRENT = 0x80000002; integer LM_ARMORRESET   = 0x80000003; integer LM_ARMORON      = 0x80000004; integer LM_ARMOROFF     = 0x80000005; integer LM_ARMORBATTERY = 0x80000006; integer LM_ARMORRECHARGE = 0x80000007; integer LM_ARMORCHECK   = 0x80000008;

integer MINATTACH = 1; // min valid attach point integer MAXWEAR = 30; // max valid in-world wearable attach point integer MINARMOR = 1; // min armor defense value integer MAXARMOR = 5; // max armor defense value integer CURARMOR = 0; // highest armor value worn out of all armor worn, not a total list ARMOR = []; // string names for each attach point - waste of memory? list ATTACHPOINTS = ["INVALID","chest","head","left shoulder","right shoulder","left hand","right hand","left foot","right foot","back","pelvis","mouth","chin","left ear","right ear","left eye","right eye","nose","right upper arm","right lower arm","left upper arm","left lower arm","right hip","right upper leg","right lower leg","left hip","left upper leg","left lower leg","stomach","left pectoral","right pectoral","HUD Center 2","HUD Top Right","HUD Top","HUD Top Left","HUD Center","HUD Bottom Left","HUD Bottom","HUD Bottom Right" ];

string CHAN_PREFIX = "0x"; // channel prefix for calculating dynamic channels string DIV = "|"; // message field divider integer CHANATTACH = 0; // dynamic channel for attachments

// ERROR - show errors on debug channel with wearer name for sorting ERROR(string emessage) { llSay(DEBUG_CHANNEL,"ERROR ("+llKey2Name(PLAYERID)+"): "+emessage); }

// WEARARMOR - Wearing a piece of armor WEARARMOR(integer waattachpoint,integer waamount,string waname) { if ( waattachpoint < MINATTACH || waattachpoint > MAXWEAR ) { // valid attach point? ERROR("Invalid armor attachment point "+llList2String(ATTACHPOINTS,waattachpoint)); return; }   if ( waamount < MINARMOR || waamount > MAXARMOR ) { // is armor rating valid or legal? ERROR("Invalid armor amount "+(string)waamount+" out of range "+(string)MINARMOR+"-"+(string)MAXARMOR); return; }   // FIXME move ARMOR to 3-element strided list? [attachpoint,value,name?] ARMOR = llListReplaceList(ARMOR,[waamount],waattachpoint,waattachpoint); // insert armor value into armor list llOwnerSay("Armor "+waname+" ("+(string)waamount+") attached to "+llList2String(ATTACHPOINTS,waattachpoint)); RECALCULATE_ARMOR; // find new highest armor value }

// REMOVEARMOR - Removing a piece of armor REMOVEARMOR(integer raattachpoint,integer raamount,string raname) { if ( raattachpoint < MINATTACH || raattachpoint > MAXWEAR ) { // valid attach point? ERROR("Invalid armor detachment point "+llList2String(ATTACHPOINTS,raattachpoint)); return; }   if ( raamount < MINARMOR || raamount > MAXARMOR ) { // is armor rating valid or legal? ERROR("Invalid armor amount "+(string)raamount+" out of range "+(string)MINARMOR+"-"+(string)MAXARMOR); return; }       ARMOR = llListReplaceList(ARMOR,[0],raattachpoint,raattachpoint); // zero out the armor value in armor list llOwnerSay("Armor "+raname+" ("+(string)raamount+") detached from "+llList2String(ATTACHPOINTS,raattachpoint)); RECALCULATE_ARMOR; // find new highest armor value }

// RECALCULATE_ARMOR - sets CURARMOR to highest armor value worn after attach or detach RECALCULATE_ARMOR { CURARMOR = 0; // start with zero armor integer racount = llGetListLength(ARMOR); // how long is armor list? while (racount--) { // look at each list item from last to first integer rapoints = llList2Integer(ARMOR,racount); // what is armor value at this point in list? if ( rapoints > CURARMOR ) { // is this armor value higher than current max? CURARMOR = rapoints; // yes, save new highest amount }   }    llOwnerSay("Armor Rating is "+(string)CURARMOR); llMessageLinked(LINK_THIS,LM_ARMORCURRENT,"ARMORCURRENT|"+(string)CURARMOR,PLAYERID); // FIXME tell world too? }

// ARMOR ON ARMORON { llWhisper(CHANATTACH,"ARMORON"); }

// ARMOROFF ARMOROFF { llWhisper(CHANATTACH,"ARMOROFF"); }

// CHECKBATTERY CHECKBATTERY { llWhisper(CHANATTACH,"CHECKBATTERY"); }

// RECHARGE RECHARGE { llWhisper(CHANATTACH,"RECHARGE"); }

// SETUP - begin SETUP { PLAYERID = llGetOwner; // remember the owner's UUID integer attachpoints = 37; // counting from 0 to 37 while ( attachpoints-- ) { ARMOR = ARMOR + [0]; // create 38 empty armor slots - avoids SL stack depth error and LSLINT warning }   CHANATTACH = (integer)(CHAN_PREFIX+llGetSubString((string)PLAYERID,1,7)); // attachment-specific channel }

// RESET - shut down running animations then reset the script to reload character sheet RESET { llResetScript; // now reset }

default { state_entry { SETUP; }   on_rez(integer params) { params = 0; // LSLINT RESET; }   attach(key id) { id = NULL_KEY; // LSLINT RESET; }   // CHANGED - triggered for many changes to the avatar // TODO reload sim-specific settings on region change changed(integer changes) { if ( changes & CHANGED_INVENTORY ) { // inventory changed somehow? RESET; }       if ( changes & CHANGED_REGION || changes & CHANGED_TELEPORT ) { RESET; }   }    // LINK MESSAGE - commands to and from other prims in HUD link_message(integer sender,integer num,string cmd, key id) { sender = 0 ; // LSLINT id = NULL_KEY; // LSLINT // break down the commands and messages into units we can work with list fields = llParseString2List(cmd,[DIV],[]); // break into list of fields based on DIVider string command = llToLower(llStringTrim(llList2String(fields,0),STRING_TRIM)); // assume the first field is a Myriad Lite command if ( num == LM_ATTACHARMOR || command == "attacharmor" ) { integer armorrating = llList2Integer(fields,1); // get armor value integer attachpoint = llList2Integer(fields,2); // get armor location string armorname = llList2String(fields,3); // get armor's name WEARARMOR(attachpoint,armorrating,armorname); // add armor to set of armor worn return; }       if ( num == LM_DETACHARMOR || command == "detacharmor" ) { integer armorrating = llList2Integer(fields,1); // get armor value integer attachpoint = llList2Integer(fields,2); // get armor location string armorname = llList2String(fields,3); // get armor's name REMOVEARMOR(attachpoint,armorrating,armorname); // detach armor from set of armor worn return; }       if ( num == LM_ARMOROFF || command == "armoroff" ) { ARMOROFF; return;} // turn off power armor if ( num == LM_ARMORON || command == "armoron" ) { ARMORON; return;} // turn on power armor if ( num == LM_ARMORCHECK || command == "checkarmor" ) { RECALCULATE_ARMOR; return; } // check our current armor value if ( num == LM_ARMORBATTERY || command == "checkbattery") { CHECKBATTERY; return;} // check power armor battery if ( num == LM_ARMORRECHARGE || command == "recharge" ) { RECHARGE; return;} // recharge power armor battery if ( num == LM_ARMORRESET || command == "armorreset" ) { RESET; return;} // reset HUD } }