<?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%2FMyriad_Lite-v0.1.11-20120826.lsl</id>
		<title>User:Allen Kerensky/Myriad Lite/Myriad Lite-v0.1.11-20120826.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%2FMyriad_Lite-v0.1.11-20120826.lsl"/>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/index.php?title=User:Allen_Kerensky/Myriad_Lite/Myriad_Lite-v0.1.11-20120826.lsl&amp;action=history"/>
		<updated>2026-06-13T18:15:30Z</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/Myriad_Lite-v0.1.11-20120826.lsl&amp;diff=30528&amp;oldid=prev</id>
		<title>Allen Kerensky: Myriad_Lite-v0.1.11-20120826.lsl</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/index.php?title=User:Allen_Kerensky/Myriad_Lite/Myriad_Lite-v0.1.11-20120826.lsl&amp;diff=30528&amp;oldid=prev"/>
				<updated>2012-08-27T00:02:54Z</updated>
		
		<summary type="html">&lt;p&gt;Myriad_Lite-v0.1.11-20120826.lsl&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Myriad_Lite_v0.1.11-20120826.lsl =&lt;br /&gt;
 &amp;lt;source lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
// Myriad_Lite-v01.1.11-20120826.lsl&lt;br /&gt;
// Copyright (c) 2012 by Allen Kerensky (OSG/SL) All Rights Reserved.&lt;br /&gt;
// This work is dual-licensed under&lt;br /&gt;
// Creative Commons Attribution (CC BY) 3.0 Unported&lt;br /&gt;
// http://creativecommons.org/licenses/by/3.0/&lt;br /&gt;
// - or -&lt;br /&gt;
// Modified BSD License (3-clause)&lt;br /&gt;
// Redistribution and use in source and binary forms, with or without&lt;br /&gt;
// modification, are permitted provided that the following conditions are met:&lt;br /&gt;
// * Redistributions of source code must retain the above copyright notice, &lt;br /&gt;
//   this list of conditions and the following disclaimer.&lt;br /&gt;
// * Redistributions in binary form must reproduce the above copyright notice,&lt;br /&gt;
//   this list of conditions and the following disclaimer in the documentation&lt;br /&gt;
//   and/or other materials provided with the distribution.&lt;br /&gt;
// * Neither the name of Myriad Lite nor the names of its contributors may be&lt;br /&gt;
//   used to endorse or promote products derived from this software without&lt;br /&gt;
//   specific prior written permission.&lt;br /&gt;
//&lt;br /&gt;
// THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY EXPRESS OR&lt;br /&gt;
// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES&lt;br /&gt;
// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN&lt;br /&gt;
// NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,&lt;br /&gt;
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT&lt;br /&gt;
// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,&lt;br /&gt;
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY&lt;br /&gt;
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT&lt;br /&gt;
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF&lt;br /&gt;
// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.&lt;br /&gt;
//&lt;br /&gt;
// The Myriad RPG System was designed, written, and illustrated by Ashok Desai&lt;br /&gt;
// Myriad RPG System licensed under:&lt;br /&gt;
// Creative Commons Attribution (CC BY) 2.0 UK: England and Wales&lt;br /&gt;
// http://creativecommons.org/licenses/by/2.0/uk/&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.11&amp;quot;; // Allen Kerensky's script version&lt;br /&gt;
string VERSIONDATE = &amp;quot;20120826&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 MODULE_RESILIENCE = -8;&lt;br /&gt;
//integer MODULE_PROGRESS = -9;&lt;br /&gt;
//integer MODULE_WELL = -10;&lt;br /&gt;
//integer MODULE_METER = -11;&lt;br /&gt;
//integer MODULE_GOON = -12;&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; // 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 CHANHUD = 0; // dyname channel to HUD object UUID&lt;br /&gt;
integer HANDHUD = 0; // HUD channel handle&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;
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;
&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 ( command == &amp;quot;incapacitated&amp;quot; ) { FLAG_INCAPACITATED = TRUE; return; }&lt;br /&gt;
    if ( command == &amp;quot;dead&amp;quot; ) { FLAG_DEAD = TRUE; return; }&lt;br /&gt;
    if ( command == &amp;quot;alive&amp;quot; ) { FLAG_DEAD = FALSE; return; }&lt;br /&gt;
    if ( command == &amp;quot;revived&amp;quot; ) { FLAG_INCAPACITATED = FALSE; return; }&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;
    if ( llGetSubString(llStringTrim(llToLower(command),STRING_TRIM),0,3) == &amp;quot;roll&amp;quot; ) { ROLL(msg); return; } // roll dice&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;
// 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;
    llMessageLinked(LINK_THIS,MODULE_HUD,&amp;quot;METER&amp;quot;,PLAYERID);&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;RESET&amp;quot;,PLAYERID); // send reset to modules&lt;br /&gt;
    llResetScript(); // now reset this script&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// ROLL DICE&lt;br /&gt;
ROLL(string message) {&lt;br /&gt;
    list input = llParseString2List(message, [&amp;quot; &amp;quot;,&amp;quot;d&amp;quot;],[] );&lt;br /&gt;
    string command = llList2String(input,0);&lt;br /&gt;
    integer numberOfDice = llList2Integer(input,1);&lt;br /&gt;
    integer numberOfSides = llList2Integer(input,2);&lt;br /&gt;
    string output = &amp;quot;&amp;quot;;&lt;br /&gt;
    integer total = 0;&lt;br /&gt;
    if ( command == &amp;quot;roll&amp;quot; ) {&lt;br /&gt;
        if ( numberOfDice &amp;gt;= 1 &amp;amp;&amp;amp; numberOfDice &amp;lt;= 20 ) {&lt;br /&gt;
            if ( numberOfSides &amp;gt; 1 &amp;amp;&amp;amp; numberOfSides &amp;lt;= 100 ) {&lt;br /&gt;
                integer index;&lt;br /&gt;
                for( index = 1; index &amp;lt;= numberOfDice; index++) {&lt;br /&gt;
                    integer roll = (integer)((llFrand(1.0) * numberOfSides)+1);&lt;br /&gt;
                    output += (string)roll;&lt;br /&gt;
                    output += &amp;quot;, &amp;quot;;&lt;br /&gt;
                    total += roll;                          &lt;br /&gt;
                }&lt;br /&gt;
                string objname = llGetObjectName();&lt;br /&gt;
                llSetObjectName(&amp;quot;((&amp;quot;+llKey2Name(llGetOwner()));&lt;br /&gt;
                llWhisper(PUBLIC_CHANNEL,&amp;quot;/me rolls &amp;quot;+(string)numberOfDice+&amp;quot;d&amp;quot;+(string)numberOfSides+&amp;quot; resulting in &amp;quot;+output+&amp;quot; totalling &amp;quot;+(string)total+&amp;quot;.))&amp;quot;);&lt;br /&gt;
                llSetObjectName(objname);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        llOwnerSay(&amp;quot;To roll, say /5 roll #d# or /5 roll #d#. For example, saying /5 roll 1d20 in chat rolls one 20-sided dice.\&amp;quot;&amp;quot;);&lt;br /&gt;
    }&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;
    FLAG_DEBUG = FALSE;&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;
    // 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;
    //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;
    CHANHUD = (integer)(&amp;quot;0x&amp;quot;+llGetSubString((string)llGetKey(),0,6)); // calculate a player-specfic dynamic chat channel&lt;br /&gt;
    if ( HANDHUD != 0 ) llListenRemove(HANDHUD);&lt;br /&gt;
    HANDHUD = llListen(CHANHUD,&amp;quot;&amp;quot;,NULL_KEY,&amp;quot;&amp;quot;); // listen on the HUD object dynamic chat channel&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;
    QUEST(); // update the BAM Module&lt;br /&gt;
    llOwnerSay(&amp;quot;Myriad Lite HUD startup complete.&amp;quot;);&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;
    // ATTACH - logged in with meter or worn from inventory/ground while running&lt;br /&gt;
    attach(key id) {&lt;br /&gt;
        if ( id != NULL_KEY ) {&lt;br /&gt;
            RESET();&lt;br /&gt;
        }&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 character sheet.&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;
    // 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;EVENT: link_message(&amp;quot;+(string)sender+&amp;quot;,&amp;quot;+(string)sending_module+&amp;quot;,&amp;quot;+str+&amp;quot;,&amp;quot;+(string)id+&amp;quot;)&amp;quot;);&lt;br /&gt;
        &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;
        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 ( command == &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 ( command == &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 ( command == &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 ( command == &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 ( command == &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 ( command == &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 ( command == &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 ( command == &amp;quot;character_loaded&amp;quot; ) {&lt;br /&gt;
            METER();&lt;br /&gt;
            return; // we're out of notecard, so character sheet is loaded - start playing&lt;br /&gt;
        }&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; || command == &amp;quot;DETACHMETER&amp;quot; ) {&lt;br /&gt;
                llMessageLinked(LINK_THIS,MODULE_HUD,message,PLAYERID);&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;
        }&lt;br /&gt;
        // --- CHANHUD - get region settings messages&lt;br /&gt;
        if ( channel == CHANHUD ) {&lt;br /&gt;
            llMessageLinked(LINK_THIS,MODULE_HUD,message,speakerid);&lt;br /&gt;
            return; // done with the HUD dynamic channel message processing, return            &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;
            if ( (command == &amp;quot;CLOSECOMBAT&amp;quot; || command == &amp;quot;RANGEDCOMBAT&amp;quot;) &amp;amp;&amp;amp; (FLAG_DEAD == TRUE || FLAG_INCAPACITATED == TRUE ) ) return; // can't fight when dead&lt;br /&gt;
            // The last action of the PLAYER CHAN processing is to put the message on the link-message bus&lt;br /&gt;
            // the speakerid is sent as the uuid field in case the modules need to send a message back out to another dynamic channel object&lt;br /&gt;
            // Incoming messages that go onto the bus to get handled by modules include:&lt;br /&gt;
            // CLOSEHIT - we've been hit and have to make an opposed ability test to avoid it&lt;br /&gt;
            // RANGEDHIT - mortal combat ranged combat attack message&lt;br /&gt;
            // HEALPARTIAL - heal some number of boxes of resilience&lt;br /&gt;
            // HEALFULL - heal 100 boxes of resilience&lt;br /&gt;
            // DUMP_PROGRESS - request from character builder to dump progress since last character build/progress session&lt;br /&gt;
            // GET_XP&lt;br /&gt;
            // SET_XP&lt;br /&gt;
            // GET_XPLEVEL&lt;br /&gt;
            // SET_XPLEVEL&lt;br /&gt;
            // GET_STAT&lt;br /&gt;
            // GET_RESILIENCE&lt;br /&gt;
            // GET_MAXRESILIENCE&lt;br /&gt;
            // SET_RESILIENCE&lt;br /&gt;
            llMessageLinked(LINK_THIS,MODULE_HUD,message,speakerid);&lt;br /&gt;
            return; // done with the player channel message processing, return&lt;br /&gt;
        } // end of 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;
&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;
    // STATE ENTRY&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        SETUP();        &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;
        QUEST();&lt;br /&gt;
    }&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>