<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://opensimulator.org/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://opensimulator.org/index.php?action=history&amp;feed=atom&amp;title=User%3AAllen_Kerensky%2FMyriad_Lite_Dev%2FMyriad_Lite-v0.1.7-20120510.lsl</id>
		<title>User:Allen Kerensky/Myriad Lite Dev/Myriad Lite-v0.1.7-20120510.lsl - Revision history</title>
		<link rel="self" type="application/atom+xml" href="http://opensimulator.org/index.php?action=history&amp;feed=atom&amp;title=User%3AAllen_Kerensky%2FMyriad_Lite_Dev%2FMyriad_Lite-v0.1.7-20120510.lsl"/>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/index.php?title=User:Allen_Kerensky/Myriad_Lite_Dev/Myriad_Lite-v0.1.7-20120510.lsl&amp;action=history"/>
		<updated>2026-05-11T06:53:51Z</updated>
		<subtitle>Revision history for this page on the wiki</subtitle>
		<generator>MediaWiki 1.19.9</generator>

	<entry>
		<id>http://opensimulator.org/index.php?title=User:Allen_Kerensky/Myriad_Lite_Dev/Myriad_Lite-v0.1.7-20120510.lsl&amp;diff=29833&amp;oldid=prev</id>
		<title>Allen Kerensky: created</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/index.php?title=User:Allen_Kerensky/Myriad_Lite_Dev/Myriad_Lite-v0.1.7-20120510.lsl&amp;diff=29833&amp;oldid=prev"/>
				<updated>2012-05-20T16:36:22Z</updated>
		
		<summary type="html">&lt;p&gt;created&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Myriad_Lite-v0.1.7-20120510.lsl =&lt;br /&gt;
 &amp;lt;source lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
// Myriad_Lite-v0.1.7-20120510.lsl&lt;br /&gt;
// Copyright (c) 2012 By Allen Kerensky (OSG/SL)&lt;br /&gt;
// The Myriad RPG System was designed, written, and illustrated by Ashok Desai&lt;br /&gt;
// Myriad RPG licensed under the Creative Commons Attribution 2.0 UK: England and Wales&lt;br /&gt;
// http://creativecommons.org/licenses/by/2.0/uk/&lt;br /&gt;
// Myriad Lite software Copyright (c) 2011-2012 by Allen Kerensky (OSG/SL)&lt;br /&gt;
// Baroun's Adventure Machine Copyright (c) 2008-2011 by Baroun Tardis (SL)&lt;br /&gt;
// Myriad Lite and Baroun's Adventure Machine licensed under the&lt;br /&gt;
// Creative Commons Attribution-Share Alike-Non-Commercial 3.0 Unported&lt;br /&gt;
// http://creativecommons.org/licenses/by-nc-sa/3.0/&lt;br /&gt;
// You must agree to the terms of this license before making any use of this software.&lt;br /&gt;
// If you do not agree to this license, simply delete these materials.&lt;br /&gt;
// There is no warranty, express or implied, for your use of these materials.&lt;br /&gt;
&lt;br /&gt;
// CONSTANTS - DO NOT CHANGE DURING RUN&lt;br /&gt;
string BASENAME = &amp;quot;Myriad Lite&amp;quot;; // base name of this script without version or date&lt;br /&gt;
string VERSION = &amp;quot;0.1.7&amp;quot;; // Allen Kerensky's script version&lt;br /&gt;
string VERSIONDATE = &amp;quot;20120510&amp;quot;; // Allen Kerensky's script yyyymmdd&lt;br /&gt;
string TRUENAME; // name to reset item to after talker/emoter use&lt;br /&gt;
integer MINSTAT = 1; // min value for statistics&lt;br /&gt;
integer MAXSTAT = 5; // max human value for a statistic/attribute&lt;br /&gt;
integer MINRESILIENCE = 1; // min value for resilience&lt;br /&gt;
integer MAXRESILIENCE = 20; // max value for resilience&lt;br /&gt;
integer MINSKILL = 1; // min value for skill rank&lt;br /&gt;
integer MAXSKILL = 5; // max value for skill rank&lt;br /&gt;
integer CHANMYRIAD = -999; // chat sent to ALL Myriad players in region&lt;br /&gt;
integer CHANCOMMAND = 5; // chat sent by player to their meter&lt;br /&gt;
string DIV = &amp;quot;|&amp;quot;; // message field divider&lt;br /&gt;
string CHAN_PREFIX = &amp;quot;0x&amp;quot;; // channel prefix for calculating dynamic channels&lt;br /&gt;
integer MAXARMOR = 5; // max legal armor rating&lt;br /&gt;
&lt;br /&gt;
// Module to Module Messaging Constants&lt;br /&gt;
integer MODULE_HUD = -1;&lt;br /&gt;
//integer MODULE_CHARSHEET = -2;&lt;br /&gt;
//integer MODULE_ARMOR = -3;&lt;br /&gt;
//integer MODULE_BAM = -4;&lt;br /&gt;
//integer MODULE_RUMORS = -5;&lt;br /&gt;
//integer MODULE_CLOSE = -6;&lt;br /&gt;
//integer MODULE_RANGED = -7;&lt;br /&gt;
integer LM_SENDTOATTACHMENT = 0x80000000;&lt;br /&gt;
&lt;br /&gt;
// RUNTIME GLOBALS - CAN CHANGE DURING RUN&lt;br /&gt;
integer FLAG_DEBUG = FALSE; // see debug messages?&lt;br /&gt;
key PLAYERID = NULL_KEY; // cached player UUID&lt;br /&gt;
string PLAYERNAME = &amp;quot;&amp;quot;; // cached player name&lt;br /&gt;
string NAME = &amp;quot;&amp;quot;; // character name&lt;br /&gt;
string SPECIES = &amp;quot;&amp;quot;; // character species&lt;br /&gt;
string BACKGROUND = &amp;quot;&amp;quot;; // character childhood history&lt;br /&gt;
string CAREER = &amp;quot;&amp;quot;; // character career or faction&lt;br /&gt;
list STATISTICS = [];&lt;br /&gt;
list RESILIENCES = [];&lt;br /&gt;
list CURRENT_RESILIENCES = [];&lt;br /&gt;
list SKILLS = []; // skills [ string SkillName, integer SkillRank ]&lt;br /&gt;
&lt;br /&gt;
integer HANDMYRIAD = 0; // Myriad channel handle&lt;br /&gt;
integer CHANPLAYER = 0; // dynamic channel to one player's UUID&lt;br /&gt;
integer HANDPLAYER = 0; // player channel handle&lt;br /&gt;
integer CHANOBJECT = 0; // dynamic channel to one object's UUID&lt;br /&gt;
integer HANDCOMMAND = 0; // command channel handle&lt;br /&gt;
integer HANDATTACH = 0; // attachment channel handle&lt;br /&gt;
integer CHANATTACH = 0; // dynamic channel for attachments&lt;br /&gt;
integer CHANBAM = 0; // dynamic channel for BAM quests&lt;br /&gt;
integer HANDBAM = 0; // BAM channel update&lt;br /&gt;
&lt;br /&gt;
// Talker/Emoter&lt;br /&gt;
integer CHANNEL_OOCCHAT = 22;&lt;br /&gt;
integer CHANNEL_OOCEMOTE = 23;&lt;br /&gt;
integer CHANNEL_ICCHAT = 44;&lt;br /&gt;
integer CHANNEL_ICTHINK = 45;&lt;br /&gt;
integer CHANNEL_ICEMOTE = 66;&lt;br /&gt;
integer CHANNEL_NARRATE = 88;&lt;br /&gt;
integer HANDLE_OOCCHAT; // callback handle for llListen&lt;br /&gt;
integer HANDLE_OOCEMOTE; // callback handle for llListen&lt;br /&gt;
integer HANDLE_ICCHAT; // callback handle for llListen&lt;br /&gt;
integer HANDLE_ICTHINK; // callback handle for llListen&lt;br /&gt;
integer HANDLE_ICEMOTE; // callback handle for llListen&lt;br /&gt;
integer HANDLE_NARRATE; // callback handle for llListen&lt;br /&gt;
string OOCPREFIX=&amp;quot;((&amp;quot;; // what to put before OOC messages&lt;br /&gt;
string OOCSUFFIX=&amp;quot;))&amp;quot;; // what to put after OOC messages&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
integer FLAG_ANIMATE; //&lt;br /&gt;
integer FLAG_INCAPACITATED; // incapacitated by wounds?&lt;br /&gt;
integer FLAG_DEAD; // killed by critical wounds?&lt;br /&gt;
integer CURARMOR = 0; // highest armor value worn out of all armor worn, not a total&lt;br /&gt;
integer METERWORN; // using meter?&lt;br /&gt;
&lt;br /&gt;
// ABILITY TEST&lt;br /&gt;
// Requires ATTRIBUTE NAME, SKILL NAME&lt;br /&gt;
// Returns the ability test score for use by success fail, opposed rolls, etc&lt;br /&gt;
// See Myriad PDF page 18, Myriad Special Edition page 24&lt;br /&gt;
integer ABILITY_TEST(integer attribute,integer skill) {&lt;br /&gt;
    integer highroll = 0; // clear out the highest roll&lt;br /&gt;
    while( attribute-- ) { // roll a dice for each point of the attribute&lt;br /&gt;
        integer roll = 1+(integer)llFrand(5.0); // roll this d6&lt;br /&gt;
        if ( roll &amp;gt; highroll) highroll = roll; // if this is highest roll so far, remember it&lt;br /&gt;
    } // finished rolling a dice for each point of the base attribute&lt;br /&gt;
    return highroll + skill; // now, return the total of highest dice roll + skill value&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// CHECK AMMO&lt;br /&gt;
CHECKAMMO() {&lt;br /&gt;
    llWhisper(CHANATTACH,&amp;quot;CHECKAMMO&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// COMBATOFF - turn off fist fighter&lt;br /&gt;
COMBATOFF() {&lt;br /&gt;
    llMessageLinked(LINK_THIS,MODULE_HUD,&amp;quot;COMBATOFF&amp;quot;,llGetOwner());&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// COMBATON - turn on fist fighter&lt;br /&gt;
COMBATON() {&lt;br /&gt;
    llMessageLinked(LINK_THIS,MODULE_HUD,&amp;quot;COMBATON&amp;quot;,llGetOwner());&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// COMMAND - process chat and link message commands together&lt;br /&gt;
COMMAND(string msg) {&lt;br /&gt;
    // break down the commands and messages into units we can work with&lt;br /&gt;
    list fields = llParseString2List(msg,[DIV],[]); // break into list of fields based on DIVider&lt;br /&gt;
    string command = llToLower(llStringTrim(llList2String(fields,0),STRING_TRIM)); // assume the first field is a Myriad Lite command&lt;br /&gt;
    if ( command == &amp;quot;checkammo&amp;quot; ) { CHECKAMMO(); return;} // check ammo in weapons&lt;br /&gt;
    if ( command == &amp;quot;combatoff&amp;quot;) { COMBATOFF(); return; } // turn off fist fighter&lt;br /&gt;
    if ( command == &amp;quot;combaton&amp;quot; ) { COMBATON(); return; } // turn on the fist fighter&lt;br /&gt;
    if ( command == &amp;quot;credits&amp;quot; ) { CREDITS(); return;} // show the credits including version number&lt;br /&gt;
    if ( command == &amp;quot;debugoff&amp;quot; ) { DEBUGOFF(); return; } // player turn off debugging&lt;br /&gt;
    if ( command == &amp;quot;debugon&amp;quot; ) { DEBUGON(); return;} // player turn on debugging&lt;br /&gt;
    if ( command == &amp;quot;drawboth&amp;quot; ) { DRAW(&amp;quot;both&amp;quot;); return; } // draw both weapons&lt;br /&gt;
    if ( command == &amp;quot;drawleft&amp;quot; ) { DRAW(&amp;quot;left&amp;quot;); return; } // draw weapon in left hand&lt;br /&gt;
    if ( command == &amp;quot;drawright&amp;quot; ) { DRAW(&amp;quot;right&amp;quot;); return; } // draw weapon using right hand&lt;br /&gt;
    if ( command == &amp;quot;holsterboth&amp;quot; ) { HOLSTER(&amp;quot;both&amp;quot;); return; } // holster both weapons&lt;br /&gt;
    if ( command == &amp;quot;holsterleft&amp;quot; ) { HOLSTER(&amp;quot;left&amp;quot;); return; } // holster weapon in left hand&lt;br /&gt;
    if ( command == &amp;quot;holsterright&amp;quot; ) { HOLSTER(&amp;quot;right&amp;quot;); return; } // holster weapon in right hand&lt;br /&gt;
    if ( command == &amp;quot;quest&amp;quot; ) { QUEST(); return; } // check our current quest status&lt;br /&gt;
    if ( command == &amp;quot;reload&amp;quot; ) { RELOAD(); return;}  // reload weapons&lt;br /&gt;
    if ( command == &amp;quot;reset&amp;quot; ) { RESET(); return;} // reset HUD&lt;br /&gt;
    //if ( command == &amp;quot;rumor&amp;quot; ) { RUMOR(msg); return;} // rumors&lt;br /&gt;
    if ( command == &amp;quot;safetyoff&amp;quot; ) { SAFETYOFF(); return;} // unsafe the weapons&lt;br /&gt;
    if ( command == &amp;quot;safetyon&amp;quot; ) { SAFETYON(); return;} // safe the weapons&lt;br /&gt;
    if ( command == &amp;quot;sheatheboth&amp;quot; ) { SHEATHE(&amp;quot;both&amp;quot;); return; } // sheathe both weapons&lt;br /&gt;
    if ( command == &amp;quot;sheatheleft&amp;quot; ) { SHEATHE(&amp;quot;left&amp;quot;); return; } // sheathe weapon in left hand&lt;br /&gt;
    if ( command == &amp;quot;sheatheright&amp;quot; ) { SHEATHE(&amp;quot;right&amp;quot;); return; } // sheathe weapon in right hand&lt;br /&gt;
    if ( command == &amp;quot;version&amp;quot; ) { CREDITS(); return;} // show the credits including version number&lt;br /&gt;
    if ( llGetSubString(llStringTrim(llToLower(command),STRING_TRIM),0,4) == &amp;quot;armor&amp;quot; ) { SENDTOMODULE(msg,PLAYERID); return; }&lt;br /&gt;
    if ( llGetSubString(llStringTrim(llToLower(command),STRING_TRIM),0,4) == &amp;quot;rumor&amp;quot; ) { RUMOR(msg); return; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// CREDITS comply with Myriad RPG Creative Common-Attribution legal requirement&lt;br /&gt;
CREDITS() {&lt;br /&gt;
    llOwnerSay(&amp;quot;The Myriad RPG System was designed, written, and illustrated by Ashok Desai.&amp;quot;);&lt;br /&gt;
    llOwnerSay(&amp;quot;RPG System licensed under the Creative Commons Attribution 2.0 UK: England and Wales.&amp;quot;);&lt;br /&gt;
    llOwnerSay(&amp;quot;Myriad Lite v&amp;quot;+VERSION+&amp;quot; &amp;quot;+VERSIONDATE+&amp;quot; Copyright (c) 2011 by Allen Kerensky (OSG/SL)&amp;quot;);&lt;br /&gt;
    llOwnerSay(&amp;quot;Licensed under Creative Commons Attribution-Share Alike-Non-Commercial 3.0 Unported.&amp;quot;);&lt;br /&gt;
    llMessageLinked(LINK_THIS,MODULE_HUD,&amp;quot;VERSION&amp;quot;,llGetOwner());&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// DEBUG - show debug chat with wearer name for sorting&lt;br /&gt;
DEBUG(string dmessage) {&lt;br /&gt;
    if ( FLAG_DEBUG == TRUE ) { // are we debugging?&lt;br /&gt;
        llSay(DEBUG_CHANNEL,&amp;quot;(&amp;quot;+llKey2Name(PLAYERID)+&amp;quot;) HUD: &amp;quot;+dmessage);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// DEBUGOFF - turn off the DEBUG flag&lt;br /&gt;
DEBUGOFF() {&lt;br /&gt;
    FLAG_DEBUG = FALSE; // set debug flag to FALSE&lt;br /&gt;
    llOwnerSay(&amp;quot;Debug Mode Deactivated&amp;quot;);&lt;br /&gt;
    llMessageLinked(LINK_THIS,MODULE_HUD,&amp;quot;DEBUGOFF&amp;quot;,llGetOwner());    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// DEBUGON - turn on the DEBUG flag&lt;br /&gt;
DEBUGON() {&lt;br /&gt;
    FLAG_DEBUG = TRUE; // set debug flag TRUE&lt;br /&gt;
    llOwnerSay(&amp;quot;Debug Mode Activated&amp;quot;);&lt;br /&gt;
    llMessageLinked(LINK_THIS,MODULE_HUD,&amp;quot;DEBUGON&amp;quot;,llGetOwner());    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// DRAW weapons&lt;br /&gt;
DRAW(string hand) {&lt;br /&gt;
    if ( hand == &amp;quot;left&amp;quot; ) { llWhisper(CHANATTACH,&amp;quot;DRAWLEFT&amp;quot;); return; } // draw left-hand weapon&lt;br /&gt;
    if ( hand == &amp;quot;right&amp;quot; ) { llWhisper(CHANATTACH,&amp;quot;DRAWRIGHT&amp;quot;); return; } // draw right-hand weapon&lt;br /&gt;
    if ( hand == &amp;quot;both&amp;quot; ) { llWhisper(CHANATTACH,&amp;quot;DRAWBOTH&amp;quot;); return; } // draw both weapons&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// ERROR - show errors on debug channel with wearer name for sorting&lt;br /&gt;
ERROR(string emessage) {&lt;br /&gt;
    llSay(DEBUG_CHANNEL,&amp;quot;ERROR (&amp;quot;+llKey2Name(PLAYERID)+&amp;quot;): &amp;quot;+emessage);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// GET_MAX_RESILIENCE&lt;br /&gt;
integer GET_MAX_RESILIENCE(string name) {&lt;br /&gt;
    integer pos = llListFindList(RESILIENCES,[name]);&lt;br /&gt;
    if ( pos &amp;gt;= 0 ) {&lt;br /&gt;
        return llList2Integer(RESILIENCES,pos + 1);&lt;br /&gt;
    }&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// GET_RESILIENCE&lt;br /&gt;
integer GET_RESILIENCE(string name) {&lt;br /&gt;
    integer pos = llListFindList(CURRENT_RESILIENCES,[name]);&lt;br /&gt;
    if ( pos &amp;gt;= 0 ) {&lt;br /&gt;
        return llList2Integer(CURRENT_RESILIENCES,pos + 1);&lt;br /&gt;
    }&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// HOLSTER weapons&lt;br /&gt;
HOLSTER(string hand) {&lt;br /&gt;
    if ( hand == &amp;quot;left&amp;quot; ) { llWhisper(CHANATTACH,&amp;quot;HOLSTERLEFT&amp;quot;); return; } // holster left-hand weapon&lt;br /&gt;
    if ( hand == &amp;quot;right&amp;quot; ) { llWhisper(CHANATTACH,&amp;quot;HOLSTERRIGHT&amp;quot;); return; } // holster right-hand weapon&lt;br /&gt;
    if ( hand == &amp;quot;both&amp;quot; ) { llWhisper(CHANATTACH,&amp;quot;HOLSTERBOTH&amp;quot;); return; } // holster both weapons&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// METER - update a hovertext health meter or HUD bar graph&lt;br /&gt;
METER() {&lt;br /&gt;
    if ( METERWORN == FALSE ) return;&lt;br /&gt;
    integer curwounds = GET_RESILIENCE(&amp;quot;Wounds&amp;quot;);&lt;br /&gt;
    integer maxwounds = GET_MAX_RESILIENCE(&amp;quot;Wounds&amp;quot;);&lt;br /&gt;
    integer curcritical = GET_RESILIENCE(&amp;quot;Critical&amp;quot;);&lt;br /&gt;
    integer maxcritical = GET_MAX_RESILIENCE(&amp;quot;Critical&amp;quot;);&lt;br /&gt;
    // create a meter message packet&lt;br /&gt;
    string message = &amp;quot;METER&amp;quot;+DIV+PLAYERNAME+DIV+NAME+DIV+(string)curwounds+DIV+(string)maxwounds+DIV+(string)curcritical+DIV+(string)maxcritical+DIV+(string)FLAG_DEAD+DIV+(string)FLAG_INCAPACITATED;&lt;br /&gt;
    llRegionSay(CHANMYRIAD,message); // send the update to region for scorekeepers, etc&lt;br /&gt;
    llWhisper(CHANATTACH,message); // whisper to the wearer's actual meter&lt;br /&gt;
    llMessageLinked(LINK_THIS,MODULE_HUD,message,llGetOwner()); // send meter updates to bus&lt;br /&gt;
    DEBUG(&amp;quot;Wounds: &amp;quot;+(string)curwounds+&amp;quot; of &amp;quot;+(string)maxwounds+&amp;quot; wound boxes. Critical: &amp;quot;+(string)curcritical+&amp;quot; of &amp;quot;+(string)maxcritical+&amp;quot; critical wound boxes.&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// QUEST STATUS&lt;br /&gt;
QUEST() {&lt;br /&gt;
    llMessageLinked(LINK_THIS,MODULE_HUD,&amp;quot;BAMSTATUS&amp;quot;,PLAYERID); // send a status request to BAM Modules&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// RELOAD&lt;br /&gt;
RELOAD() {&lt;br /&gt;
    llWhisper(CHANATTACH,&amp;quot;RELOAD&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// RESET - shut down running animations then reset the script to reload character sheet&lt;br /&gt;
RESET() {&lt;br /&gt;
    if ( FLAG_DEAD == TRUE || FLAG_INCAPACITATED == TRUE ) { // don't allow reset if already on respawn timer&lt;br /&gt;
        llOwnerSay(&amp;quot;Cannot reset while incapacitated or dead. You will respawn in a few moments.&amp;quot;);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    llOwnerSay(&amp;quot;Resetting Myriad Lite. Please wait...&amp;quot;);&lt;br /&gt;
    // stop all running animations&lt;br /&gt;
    if ( FLAG_ANIMATE == TRUE ) { // do we have permission to animate?&lt;br /&gt;
        list anims = llGetAnimationList(PLAYERID); // get list of current animations for owner&lt;br /&gt;
        integer animcount = llGetListLength(anims); // count the number of animations in the list&lt;br /&gt;
        while (animcount--) { // step from end of animation list to beginning&lt;br /&gt;
            llStopAnimation(llList2String(anims,animcount)); // stopping each animation&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    llMessageLinked(LINK_THIS,MODULE_HUD,&amp;quot;ARMORRESET&amp;quot;,PLAYERID); // send reset to armor module&lt;br /&gt;
    llMessageLinked(LINK_THIS,MODULE_HUD,&amp;quot;BAMRESET&amp;quot;,PLAYERID); // reset the BAM module too&lt;br /&gt;
    llMessageLinked(LINK_THIS,MODULE_HUD,&amp;quot;RESET&amp;quot;,PLAYERID); // send reset to armor module    &lt;br /&gt;
    llResetScript(); // now reset&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// RPEVENT&lt;br /&gt;
RPEVENT(string rpevent) {&lt;br /&gt;
    string oldname = llGetObjectName(); // save the current object name&lt;br /&gt;
    llSetObjectName(&amp;quot;Myriad RP Event&amp;quot;); // change the object name to&lt;br /&gt;
    llOwnerSay(rpevent); // now tell the owner the rest of the RPEVENT| message&lt;br /&gt;
    llRegionSay(CHANMYRIAD,&amp;quot;RPEVENT|&amp;quot;+NAME+&amp;quot; (&amp;quot;+PLAYERNAME+&amp;quot;) &amp;quot;+rpevent);&lt;br /&gt;
    llSetObjectName(oldname); // restore the HUD back to its original name&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// RUMOR CONTROL&lt;br /&gt;
RUMOR(string cmdrumor) {&lt;br /&gt;
    DEBUG(&amp;quot;Sending to rumor module: &amp;quot;+cmdrumor);&lt;br /&gt;
    llMessageLinked(LINK_THIS,MODULE_HUD,cmdrumor,PLAYERID); // relay rumor commands to module&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// SAFETY OFF&lt;br /&gt;
SAFETYOFF() {&lt;br /&gt;
    llWhisper(CHANATTACH, &amp;quot;SAFETYOFF&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// SAFETY ON&lt;br /&gt;
SAFETYON() {&lt;br /&gt;
    llWhisper(CHANATTACH, &amp;quot;SAFETYON&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// SENDTOATTACHMENT&lt;br /&gt;
SENDTOATTACHMENT(string msg) {&lt;br /&gt;
    DEBUG(&amp;quot;SENDTOATTACHMENT(&amp;quot;+msg+&amp;quot;)&amp;quot;);&lt;br /&gt;
    llWhisper(CHANATTACH,msg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// SENDTOMODULE&lt;br /&gt;
SENDTOMODULE(string msg,key speaker) {&lt;br /&gt;
    DEBUG(&amp;quot;SENDTOMODULE(&amp;quot;+msg+&amp;quot;)&amp;quot;);&lt;br /&gt;
    llMessageLinked(LINK_THIS,MODULE_HUD,msg,speaker);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// SETUP - begin bringing the HUD online&lt;br /&gt;
SETUP() {&lt;br /&gt;
    CREDITS(); // show Myriad credits as required by the Creative Commons - Attribution license&lt;br /&gt;
    PLAYERID = llGetOwner(); // remember the owner's UUID&lt;br /&gt;
    PLAYERNAME = llKey2Name(PLAYERID); // remember the owner's legacy name&lt;br /&gt;
    llSetText(&amp;quot;&amp;quot;,&amp;lt;0,0,0&amp;gt;,0); // clear any previous hovertext&lt;br /&gt;
    llMessageLinked(LINK_THIS,MODULE_HUD,&amp;quot;BAMRESET&amp;quot;,NULL_KEY); // reset the BAM module too&lt;br /&gt;
    llMessageLinked(LINK_THIS,MODULE_HUD,&amp;quot;ARMORRESET&amp;quot;,PLAYERID); // send reset to armor module&lt;br /&gt;
    // Talker/Emoter setup&lt;br /&gt;
    TRUENAME = BASENAME + &amp;quot; &amp;quot; + VERSION + &amp;quot; &amp;quot; + VERSIONDATE; // put together full item name for talker/emoter&lt;br /&gt;
    llSetObjectName(TRUENAME); // force object title back if the talker/emoter messed it up&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// SHEATHE weapons&lt;br /&gt;
SHEATHE(string hand) {&lt;br /&gt;
    if ( hand == &amp;quot;left&amp;quot; ) { llWhisper(CHANATTACH,&amp;quot;SHEATHELEFT&amp;quot;); return; } // sheathe left-hand weapon&lt;br /&gt;
    if ( hand == &amp;quot;right&amp;quot; ) { llWhisper(CHANATTACH,&amp;quot;SHEATHERIGHT&amp;quot;); return; } // sheathe right-hand weapon&lt;br /&gt;
    if ( hand == &amp;quot;both&amp;quot; ) { llWhisper(CHANATTACH,&amp;quot;SHEATHEBOTH&amp;quot;); return; } // sheathe both weapons&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// An Unopposed Ability Test - Myriad PDF p. 19, Myriad Special Edition p. 25&lt;br /&gt;
// Requires TargetNumber, Attribute Name, Skill Name&lt;br /&gt;
// Returns TRUE for Success and False for Fail&lt;br /&gt;
integer UNOPPOSED_TEST(integer targetnum,integer tattribute,integer tskill ) {&lt;br /&gt;
    integer check = ABILITY_TEST(tattribute,tskill); // calculate the player's ability test value&lt;br /&gt;
    if ( check &amp;gt;= targetnum ) return TRUE; // player won the ability test&lt;br /&gt;
    return FALSE; // player lost the ability test&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// DEFAULT STATE - load character sheet&lt;br /&gt;
default {&lt;br /&gt;
&lt;br /&gt;
    // STATE ENTRY - called on Reset&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        SETUP(); // show credits and start character sheet load&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // on_rez - when rezzed to ground or from inventory as attachment during login&lt;br /&gt;
    on_rez(integer params) {&lt;br /&gt;
        params = 0; // LSLINT&lt;br /&gt;
        RESET(); // force to go through state entry&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // attach - when attached or detached from inventory or during login&lt;br /&gt;
    attach(key id) {&lt;br /&gt;
        id = NULL_KEY; // LSLINT&lt;br /&gt;
        RESET(); // force to go through state entry&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    link_message(integer sender_num,integer sender,string data,key id) {&lt;br /&gt;
        if ( sender == MODULE_HUD ) return; // ignore our own messages&lt;br /&gt;
        DEBUG(&amp;quot;HUD Link Message: &amp;quot;+data);        &lt;br /&gt;
        sender_num = 0; // LSLINT&lt;br /&gt;
        id = NULL_KEY; // LSLINT&lt;br /&gt;
        list FIELDS = llParseString2List(data,[&amp;quot;|&amp;quot;],[]); // break line of text into = delimited fields&lt;br /&gt;
        string CMD = llStringTrim(llList2String(FIELDS,0),STRING_TRIM); // field zero is the &amp;quot;command&amp;quot;&lt;br /&gt;
        string DATA = llStringTrim(llList2String(FIELDS,1),STRING_TRIM); // field one is the data&lt;br /&gt;
        list SUBFIELDS = llParseString2List(DATA,[&amp;quot;=&amp;quot;],[]); // break data field into comma-delimited subfields if needed&lt;br /&gt;
        if ( CMD == &amp;quot;SET_NAME&amp;quot; ) {&lt;br /&gt;
            NAME = llList2String(SUBFIELDS,1); // set the name&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if ( CMD == &amp;quot;SET_SPECIES&amp;quot; ) {&lt;br /&gt;
            SPECIES = llList2String(SUBFIELDS,1); // set the species;&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if ( CMD == &amp;quot;SET_BACKGROUND&amp;quot; ) {&lt;br /&gt;
            BACKGROUND = llList2String(SUBFIELDS,1); // set the species;&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if ( CMD == &amp;quot;SET_CAREER&amp;quot; ) {&lt;br /&gt;
            CAREER = llList2String(SUBFIELDS,1); // set the species;&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if ( CMD == &amp;quot;SET_STATISTIC&amp;quot; ) {&lt;br /&gt;
            string statname = llList2String(SUBFIELDS,0); // find the boon name&lt;br /&gt;
            integer statrank = llList2Integer(SUBFIELDS,1); // find the boon rank value&lt;br /&gt;
            // TODO how to verify stat names are valid?&lt;br /&gt;
            if ( statrank &amp;gt;= MINSTAT &amp;amp;&amp;amp; statrank &amp;lt;= MAXSTAT ) { // rank valid?&lt;br /&gt;
                STATISTICS = [statname,statrank] + STATISTICS; // add statistic to list&lt;br /&gt;
            } else { // invalid, report it&lt;br /&gt;
                ERROR(&amp;quot;STATISTIC &amp;quot;+statname+&amp;quot; rank &amp;quot;+(string)statrank+&amp;quot; value out of allowed range: &amp;quot;+(string)MINSTAT+&amp;quot;-&amp;quot;+(string)MAXSTAT);&lt;br /&gt;
            }&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if ( CMD == &amp;quot;SET_RESILIENCE&amp;quot; ) {&lt;br /&gt;
            string resname = llList2String(SUBFIELDS,0); // find the boon name&lt;br /&gt;
            integer resrank = llList2Integer(SUBFIELDS,1); // find the boon rank value&lt;br /&gt;
            // TODO how to verify resilience names are valid?&lt;br /&gt;
            if ( resrank &amp;gt;= MINRESILIENCE &amp;amp;&amp;amp; resrank &amp;lt;= MAXRESILIENCE ) { // rank valid?&lt;br /&gt;
                RESILIENCES = [resname,resrank] + RESILIENCES; // add resilience to list&lt;br /&gt;
                CURRENT_RESILIENCES = [resname,resrank] + CURRENT_RESILIENCES; // add to current list too&lt;br /&gt;
            } else { // invalid, report it&lt;br /&gt;
                ERROR(&amp;quot;RESILIENCE &amp;quot;+resname+&amp;quot; rank &amp;quot;+(string)resrank+&amp;quot; value out of allowed range: &amp;quot;+(string)MINRESILIENCE+&amp;quot;-&amp;quot;+(string)MAXRESILIENCE);&lt;br /&gt;
            }&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if ( CMD == &amp;quot;SET_SKILL&amp;quot; ) {&lt;br /&gt;
            string skillname = llList2String(SUBFIELDS,0); // find the skill name&lt;br /&gt;
            integer skillrank = llList2Integer(SUBFIELDS,1); // find the skill rank&lt;br /&gt;
            // TODO how to verify skill names are valid?&lt;br /&gt;
            if ( skillrank &amp;gt;= MINSKILL &amp;amp;&amp;amp; skillrank &amp;lt;= MAXSKILL ) { // skill rank valid?&lt;br /&gt;
                SKILLS = [skillname,skillrank] + SKILLS; // add skill to list&lt;br /&gt;
            } else { // invalid, report it&lt;br /&gt;
                ERROR(&amp;quot;SKILL &amp;quot;+skillname+&amp;quot; rank &amp;quot;+(string)skillrank+&amp;quot; value out of allowed range: &amp;quot;+(string)MINSKILL+&amp;quot;-&amp;quot;+(string)MAXSKILL);&lt;br /&gt;
            }&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if ( CMD == &amp;quot;CHARACTER_LOADED&amp;quot; ) {&lt;br /&gt;
            state running; // we're out of notecard, so character sheet is loaded - start playing&lt;br /&gt;
        }&lt;br /&gt;
    } // end of link_message event&lt;br /&gt;
} // end default state&lt;br /&gt;
&lt;br /&gt;
// STATE RUNNING - character sheet loaded - player is active in the game&lt;br /&gt;
state running {&lt;br /&gt;
&lt;br /&gt;
    // STATE ENTRY&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        llOwnerSay(&amp;quot;Character Sheet loaded. You are now ready to roleplay.&amp;quot;);&lt;br /&gt;
        if ( HANDMYRIAD != 0 ) llListenRemove(HANDMYRIAD);&lt;br /&gt;
        HANDMYRIAD = llListen(CHANMYRIAD,&amp;quot;&amp;quot;,NULL_KEY,&amp;quot;&amp;quot;); // setup listener for Myriad RP events&lt;br /&gt;
        if ( HANDCOMMAND != 0 ) llListenRemove(HANDCOMMAND);&lt;br /&gt;
        HANDCOMMAND = llListen(CHANCOMMAND,&amp;quot;&amp;quot;,PLAYERID,&amp;quot;&amp;quot;); // listen to chat commands from owner&lt;br /&gt;
        CHANPLAYER = (integer)(&amp;quot;0x&amp;quot;+llGetSubString((string)PLAYERID,0,6)); // calculate a player-specfic dynamic chat channel&lt;br /&gt;
        if ( HANDPLAYER != 0 ) llListenRemove(HANDPLAYER);&lt;br /&gt;
        HANDPLAYER = llListen(CHANPLAYER,&amp;quot;&amp;quot;,NULL_KEY,&amp;quot;&amp;quot;); // listen on the player dynamic chat channel&lt;br /&gt;
        CHANATTACH = (integer)(&amp;quot;0x&amp;quot;+llGetSubString((string)PLAYERID,1,7)); // attachment-specific channel&lt;br /&gt;
        if ( HANDATTACH != 0 ) llListenRemove(HANDATTACH);&lt;br /&gt;
        HANDATTACH = llListen(CHANATTACH,&amp;quot;&amp;quot;,NULL_KEY,&amp;quot;&amp;quot;); // listen for messages from attachments&lt;br /&gt;
        CHANBAM = (integer)(CHAN_PREFIX + llGetSubString((string)PLAYERID,-7,-1));&lt;br /&gt;
        if ( HANDBAM != 0 ) llListenRemove(HANDBAM);&lt;br /&gt;
        HANDBAM = llListen(CHANBAM,&amp;quot;&amp;quot;,NULL_KEY,&amp;quot;&amp;quot;); // start listener with listenremove handle&lt;br /&gt;
        &lt;br /&gt;
        // Talker/Emoter&lt;br /&gt;
        if ( HANDLE_OOCCHAT != 0 ) llListenRemove(HANDLE_OOCCHAT);&lt;br /&gt;
        HANDLE_OOCCHAT = llListen(CHANNEL_OOCCHAT,&amp;quot;&amp;quot;,PLAYERID,&amp;quot;&amp;quot;);&lt;br /&gt;
        if ( HANDLE_OOCEMOTE != 0 ) llListenRemove(HANDLE_OOCEMOTE);&lt;br /&gt;
        HANDLE_OOCEMOTE = llListen(CHANNEL_OOCEMOTE,&amp;quot;&amp;quot;,PLAYERID,&amp;quot;&amp;quot;);&lt;br /&gt;
        if ( HANDLE_ICCHAT != 0 ) llListenRemove(HANDLE_ICCHAT);&lt;br /&gt;
        HANDLE_ICCHAT  = llListen(CHANNEL_ICCHAT,&amp;quot;&amp;quot;,PLAYERID,&amp;quot;&amp;quot;);&lt;br /&gt;
        if ( HANDLE_ICTHINK != 0 ) llListenRemove(HANDLE_ICTHINK);&lt;br /&gt;
        HANDLE_ICTHINK  = llListen(CHANNEL_ICTHINK,&amp;quot;&amp;quot;,PLAYERID,&amp;quot;&amp;quot;);&lt;br /&gt;
        if ( HANDLE_ICEMOTE != 0 ) llListenRemove(HANDLE_ICEMOTE);&lt;br /&gt;
        HANDLE_ICEMOTE = llListen(CHANNEL_ICEMOTE,&amp;quot;&amp;quot;,PLAYERID,&amp;quot;&amp;quot;);&lt;br /&gt;
        if ( HANDLE_NARRATE != 0 ) llListenRemove(HANDLE_NARRATE);&lt;br /&gt;
        HANDLE_NARRATE = llListen(CHANNEL_NARRATE,&amp;quot;&amp;quot;,PLAYERID,&amp;quot;&amp;quot;);&lt;br /&gt;
        &lt;br /&gt;
        llOwnerSay(&amp;quot;Registering any Myriad Lite-compatible attachments...&amp;quot;);&lt;br /&gt;
        llWhisper(CHANATTACH,&amp;quot;REGISTERATTACHMENTS&amp;quot;); // ask for attachments on their dynamic channel&lt;br /&gt;
        llRequestPermissions(PLAYERID,PERMISSION_TRIGGER_ANIMATION); // request perms to run stop all animation code if needed&lt;br /&gt;
        // calculate player's dynamic BAM channel&lt;br /&gt;
        METER(); // update hovertext&lt;br /&gt;
        RUMOR(&amp;quot;RUMOR_RESET&amp;quot;); // reset the rumor module to load new rumor server UUID if needed&lt;br /&gt;
        QUEST(); // update the BAM Module&lt;br /&gt;
        llOwnerSay(&amp;quot;HUD startup complete. &amp;quot;+(string)llGetFreeMemory()+&amp;quot; bytes free.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // ON_REZ - logged in with meter, or worn from inventory while running&lt;br /&gt;
    on_rez(integer param) {&lt;br /&gt;
        param = 0; // LSLINT&lt;br /&gt;
        RESET(); // a reset to reload character&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // ATTACH - logged in with meter or worn from inventory/ground while running&lt;br /&gt;
    attach(key id) {&lt;br /&gt;
        id = NULL_KEY; // LSLINT&lt;br /&gt;
        RESET(); // a reset to reload character&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // CHANGED - triggered for many changes to the avatar&lt;br /&gt;
    // TODO reload sim-specific settings on region change&lt;br /&gt;
    changed(integer changes) {&lt;br /&gt;
        if ( changes &amp;amp; CHANGED_INVENTORY ) { // inventory changed somehow?&lt;br /&gt;
            llOwnerSay(&amp;quot;Inventory changed. Reloading.&amp;quot;);&lt;br /&gt;
            RESET(); // saved a new character sheet? - reset and re-read it.&lt;br /&gt;
        }&lt;br /&gt;
        if ( changes &amp;amp; CHANGED_REGION || changes &amp;amp; CHANGED_TELEPORT ) {&lt;br /&gt;
            llRequestPermissions(PLAYERID,PERMISSION_TRIGGER_ANIMATION);&lt;br /&gt;
            METER(); // update the meter after a shift&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // TOUCH_START - touch HUD for adventure update&lt;br /&gt;
    touch_start(integer total_number) {&lt;br /&gt;
        total_number = 0; // LSLINT&lt;br /&gt;
        string action = llGetLinkName(llDetectedLinkNumber(0)); // get name of prim clicked in link set&lt;br /&gt;
        if ( action != &amp;quot;&amp;quot; &amp;amp;&amp;amp; action != llGetObjectName() ) { // someone clicked a named button prim on this linkset&lt;br /&gt;
            COMMAND(action); // try that prim name as a command&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        METER();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // LINK MESSAGE - commands to and from other prims in HUD&lt;br /&gt;
    link_message(integer sender,integer sending_module,string str, key id) {&lt;br /&gt;
        if ( sending_module == MODULE_HUD ) return; // ignore our own link messages&lt;br /&gt;
        DEBUG(&amp;quot;HUD Link Message: &amp;quot;+str);&lt;br /&gt;
        sender = 0; // LSLINT&lt;br /&gt;
        id = NULL_KEY; // LSLINT&lt;br /&gt;
        list fields = llParseString2List(str,[DIV],[]); // break into list of fields based on DIVider&lt;br /&gt;
        string command = llToLower(llStringTrim(llList2String(fields,0),STRING_TRIM)); // assume the first field is a Myriad Lite command&lt;br /&gt;
        if ( command == &amp;quot;armorcurrent&amp;quot; ) { // ARMORCURRENT|integer newcurrentarmor&lt;br /&gt;
            integer rating = llList2Integer(fields,1);&lt;br /&gt;
            if ( rating &amp;gt;= 0 &amp;amp;&amp;amp; rating &amp;lt;= MAXARMOR ) {&lt;br /&gt;
                CURARMOR = rating;&lt;br /&gt;
            }&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if ( llGetSubString(command,0,4) == &amp;quot;armor&amp;quot; ) { SENDTOATTACHMENT(str); return; } // process armor messages&lt;br /&gt;
        if ( sending_module == LM_SENDTOATTACHMENT ) { SENDTOATTACHMENT(str); return; } // send module messages to attachments&lt;br /&gt;
        if ( command == &amp;quot;rpevent&amp;quot; ) { RPEVENT(llList2String(fields,1)); return; }&lt;br /&gt;
        COMMAND(str); // send to shared command processor for chat and link messages&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // LISTEN - the main Myriad Lite message processor for RP events and player commands&lt;br /&gt;
    listen(integer channel, string speakername, key speakerid, string message) {&lt;br /&gt;
        DEBUG(&amp;quot;HUD Listen: channel=[&amp;quot;+(string)channel+&amp;quot;] name=[&amp;quot;+speakername+&amp;quot;] id=[&amp;quot;+(string)speakerid+&amp;quot;] message=[&amp;quot;+message+&amp;quot;]&amp;quot;);&lt;br /&gt;
        speakername = &amp;quot;&amp;quot;; // LSLINT&lt;br /&gt;
        // calculate the dynamic channel of who is speaking in case we need to return commands&lt;br /&gt;
        CHANOBJECT = (integer)(CHAN_PREFIX+llGetSubString((string)speakerid,0,6));&lt;br /&gt;
&lt;br /&gt;
        // break down the commands and messages into units we can work with&lt;br /&gt;
        list fields = llParseString2List(message,[DIV],[]); // break into list of fields based on DIVider&lt;br /&gt;
        string command = llList2String(fields,0); // assume the first field is a Myriad Lite command&lt;br /&gt;
&lt;br /&gt;
        // --- PLAYER COMMAND CHANNEL&lt;br /&gt;
        if ( channel == CHANCOMMAND ) { // handle player chat commands&lt;br /&gt;
            COMMAND(message); // send to shared command processor for chat and link messages&lt;br /&gt;
            return;&lt;br /&gt;
        } // end of if channel == player commands&lt;br /&gt;
&lt;br /&gt;
        // --- BAM CHANNEL&lt;br /&gt;
        if ( channel == CHANBAM ) {&lt;br /&gt;
            SENDTOMODULE(message,speakerid); // send BAM to Module&lt;br /&gt;
            return;&lt;br /&gt;
        } // end if channel BAMCHAN&lt;br /&gt;
&lt;br /&gt;
        // --- Myriad Lite regionwide messages&lt;br /&gt;
        if ( channel == CHANMYRIAD ) { // handle Myriad system messages&lt;br /&gt;
            if ( command == &amp;quot;RPEVENT&amp;quot; ) { // Myriad Lite RPEVENT - roleplay events everyone might find interesting&lt;br /&gt;
                RPEVENT(llList2String(fields,1));&lt;br /&gt;
                return;&lt;br /&gt;
            } // end if RPEVENT&lt;br /&gt;
            return;&lt;br /&gt;
        } // end if channel == CHANMYRIAD&lt;br /&gt;
&lt;br /&gt;
        // --- ATTACHMENT CHANNEL&lt;br /&gt;
        if ( channel == CHANATTACH ) { // handle the attachment commands&lt;br /&gt;
            if ( FLAG_DEAD == TRUE || FLAG_INCAPACITATED == TRUE ) return; // can't mess with attachments while down&lt;br /&gt;
            if ( llToLower(llGetSubString(llStringTrim(command,STRING_TRIM),0,4)) == &amp;quot;armor&amp;quot; ) { SENDTOMODULE(message,PLAYERID); return; } // process armor messages&lt;br /&gt;
            if ( command == &amp;quot;ATTACHMELEE&amp;quot; || command == &amp;quot;ATTACHRANGED&amp;quot; ) { // holding a weapon rather than using fists?&lt;br /&gt;
                llMessageLinked(LINK_THIS,MODULE_HUD,message,PLAYERID);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if ( command == &amp;quot;DETACHMELEE&amp;quot; || command == &amp;quot;DETACHRANGED&amp;quot; ) { // are we going back to fists?&lt;br /&gt;
                llMessageLinked(LINK_THIS,MODULE_HUD,message,PLAYERID);            &lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if ( command == &amp;quot;ATTACHMETER&amp;quot; ) {&lt;br /&gt;
                METERWORN = TRUE; // we need to send meter events&lt;br /&gt;
                METER(); // send update&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if ( command == &amp;quot;DETACHMETER&amp;quot; ) {&lt;br /&gt;
                METERWORN = FALSE;&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        // --- CHANPLAYER&lt;br /&gt;
        if ( channel == CHANPLAYER ) { // handle player dynamic commands&lt;br /&gt;
            if ( command == &amp;quot;RPEVENT&amp;quot; ) { // Myriad Lite RPEVENT - roleplay events everyone might find interesting&lt;br /&gt;
                string oldname = llGetObjectName(); // save the current object name&lt;br /&gt;
                llSetObjectName(&amp;quot;Myriad RP Event (Private)&amp;quot;); // change the object name to&lt;br /&gt;
                llOwnerSay(llList2String(fields,1)); // now tell the owner the rest of the RPEVENT| message&lt;br /&gt;
                llSetObjectName(oldname); // restore the HUD back to its original name&lt;br /&gt;
                return;&lt;br /&gt;
            } // end if RPEVENT&lt;br /&gt;
            // incoming message from rumor server?&lt;br /&gt;
            if ( llGetSubString(llToLower(llStringTrim(command,STRING_TRIM)),0,4) == &amp;quot;rumor&amp;quot; ) {&lt;br /&gt;
                llMessageLinked(LINK_THIS,MODULE_HUD,message,speakerid); // send message and key of speaker to rumors&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if ( command == &amp;quot;UNOPPOSED_CHECK&amp;quot; ) { // object in sim wants a simple skill check&lt;br /&gt;
                integer targetnum = llList2Integer(fields,1); // what is unopposed check target num?&lt;br /&gt;
                integer tattrib = llList2Integer(fields,2); // target attribute&lt;br /&gt;
                integer tskill = llList2Integer(fields,3); // target skill&lt;br /&gt;
                UNOPPOSED_TEST(targetnum,tattrib,tskill);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            // we've been hit and have to make an opposed ability test to avoid it&lt;br /&gt;
            if ( command == &amp;quot;CLOSEHIT&amp;quot; ) {&lt;br /&gt;
                llMessageLinked(LINK_THIS,MODULE_HUD,message,llGetOwner());&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if ( command == &amp;quot;RANGEDHIT&amp;quot; ) { // mortal combat attack message?&lt;br /&gt;
                llMessageLinked(LINK_THIS,MODULE_HUD,message,llGetOwner());&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            // Heal Some Damage&lt;br /&gt;
            if ( command == &amp;quot;HEALPARTIAL&amp;quot; ) { // only a partial heal&lt;br /&gt;
                llMessageLinked(LINK_THIS,MODULE_HUD,message,llGetOwner());                &lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if ( command == &amp;quot;HEALFULL&amp;quot; ) { // full heal, reset state&lt;br /&gt;
                llMessageLinked(LINK_THIS,MODULE_HUD,message,llGetOwner());&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            // Actions NOT Allowed When Dead/Incapacitated go below here&lt;br /&gt;
            if ( FLAG_DEAD == TRUE || FLAG_INCAPACITATED == TRUE ) return;&lt;br /&gt;
            // If Your Bullet has hit, fire a hitcheck regionwide at targetplayer's channel&lt;br /&gt;
            if ( command == &amp;quot;CLOSECOMBAT&amp;quot; ) {&lt;br /&gt;
                llMessageLinked(LINK_THIS,MODULE_HUD,message,llGetOwner());&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if ( command == &amp;quot;RANGEDCOMBAT&amp;quot; || command == &amp;quot;TOHIT&amp;quot; ) {&lt;br /&gt;
                llMessageLinked(LINK_THIS,MODULE_HUD,message,llGetOwner());&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
        } // end if channel CHANPLAYER&lt;br /&gt;
        // Handle Out-Of-Character speaking&lt;br /&gt;
        if ( channel == CHANNEL_OOCCHAT ) {&lt;br /&gt;
            llSetObjectName(OOCPREFIX+PLAYERNAME);&lt;br /&gt;
            llSay(PUBLIC_CHANNEL,&amp;quot;/me says, \&amp;quot;&amp;quot;+message+&amp;quot;\&amp;quot;&amp;quot;+OOCSUFFIX);&lt;br /&gt;
            llSetObjectName(TRUENAME);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        // Handle Out-Of-Character emotes&lt;br /&gt;
        if ( channel == CHANNEL_OOCEMOTE ) {&lt;br /&gt;
            llSetObjectName(OOCPREFIX+PLAYERNAME);&lt;br /&gt;
            llSay(PUBLIC_CHANNEL,&amp;quot;/me &amp;quot;+message+OOCSUFFIX);&lt;br /&gt;
            llSetObjectName(TRUENAME);&lt;br /&gt;
            return;&lt;br /&gt;
        }        &lt;br /&gt;
        // Handle In-Character speaking&lt;br /&gt;
        if ( channel == CHANNEL_ICCHAT ) {&lt;br /&gt;
            llSetObjectName(NAME);&lt;br /&gt;
            llSay(PUBLIC_CHANNEL,&amp;quot;/me says, \&amp;quot;&amp;quot;+message+&amp;quot;\&amp;quot;&amp;quot;);&lt;br /&gt;
            llSetObjectName(TRUENAME);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        // Handle In-Character thinking&lt;br /&gt;
        if ( channel == CHANNEL_ICTHINK ) {&lt;br /&gt;
            llSetObjectName(NAME);&lt;br /&gt;
            llSay(PUBLIC_CHANNEL,&amp;quot;/me thinks, \'&amp;quot;+message+&amp;quot;\'&amp;quot;);&lt;br /&gt;
            llSetObjectName(TRUENAME);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        // Handle In-Character emotes&lt;br /&gt;
        if ( channel == CHANNEL_ICEMOTE ) {&lt;br /&gt;
            llSetObjectName(NAME);&lt;br /&gt;
            llSay(PUBLIC_CHANNEL,&amp;quot;/me &amp;quot;+message);&lt;br /&gt;
            llSetObjectName(TRUENAME);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        // Handle Narration&lt;br /&gt;
        if ( channel == CHANNEL_NARRATE ) {&lt;br /&gt;
            llSetObjectName(&amp;quot;&amp;quot;);&lt;br /&gt;
            llSay(PUBLIC_CHANNEL,&amp;quot;/me &amp;quot;+message);&lt;br /&gt;
            llSetObjectName(TRUENAME);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    } // end listen&lt;br /&gt;
} // end state running&lt;br /&gt;
// END&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Allen Kerensky</name></author>	</entry>

	</feed>