<?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_Module_Meter-Preview6.lsl</id>
		<title>User:Allen Kerensky/Myriad Lite/Myriad Lite Module Meter-Preview6.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_Module_Meter-Preview6.lsl"/>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/index.php?title=User:Allen_Kerensky/Myriad_Lite/Myriad_Lite_Module_Meter-Preview6.lsl&amp;action=history"/>
		<updated>2026-06-13T21:17:42Z</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_Module_Meter-Preview6.lsl&amp;diff=30323&amp;oldid=prev</id>
		<title>Allen Kerensky: Myriad_Lite_Module_Meter-Preview6.lsl</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/index.php?title=User:Allen_Kerensky/Myriad_Lite/Myriad_Lite_Module_Meter-Preview6.lsl&amp;diff=30323&amp;oldid=prev"/>
				<updated>2012-08-12T01:52:22Z</updated>
		
		<summary type="html">&lt;p&gt;Myriad_Lite_Module_Meter-Preview6.lsl&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Myriad_Lite_Module_Meter-Preview6.lsl =&lt;br /&gt;
 &amp;lt;source lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
// Myriad_Lite_Module_Meter-Preview6.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;
string  VERSION = &amp;quot;0.0.0&amp;quot;; // version number&lt;br /&gt;
string  VERDATE = &amp;quot;20120810&amp;quot;; // version date&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 RESILIENCES = [];&lt;br /&gt;
list CURRENT_RESILIENCES = [];&lt;br /&gt;
&lt;br /&gt;
integer CHANATTACH = 0; // dynamic channel for attachments&lt;br /&gt;
&lt;br /&gt;
integer METERWORN; // using meter?&lt;br /&gt;
&lt;br /&gt;
integer CHANMYRIAD = -999;&lt;br /&gt;
integer MODULE_METER = -11;&lt;br /&gt;
string  DIV = &amp;quot;|&amp;quot;;&lt;br /&gt;
integer FLAG_INCAPACITATED; // incapacitated by wounds?&lt;br /&gt;
integer FLAG_DEAD; // killed by critical wounds?&lt;br /&gt;
integer MINRESILIENCE = 1; // min value for resilience&lt;br /&gt;
integer MAXRESILIENCE = 20; // max value for resilience&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;
// 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;
// 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+DIV+SPECIES+DIV+BACKGROUND+DIV+CAREER;&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_METER,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;
// RESET&lt;br /&gt;
RESET() {&lt;br /&gt;
    llResetScript(); // now reset&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;
    PLAYERID = llGetOwner(); // remember the owner's UUID&lt;br /&gt;
    PLAYERNAME = llKey2Name(PLAYERID); // remember the owner's legacy name&lt;br /&gt;
    CHANATTACH = (integer)(&amp;quot;0x&amp;quot;+llGetSubString((string)PLAYERID,1,7)); // attachment-specific channel    &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;
        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_REGION || changes &amp;amp; CHANGED_TELEPORT ) {&lt;br /&gt;
            RESET();&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_METER ) return; // ignore our own link messages&lt;br /&gt;
        DEBUG(&amp;quot;Module Meter 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;
        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_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;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;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; ) { METERWORN = FALSE; return; }&lt;br /&gt;
        if ( command == &amp;quot;meter&amp;quot; ) { METER(); return; }&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;
    }&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;
    // STATE ENTRY&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        SETUP();        &lt;br /&gt;
    }&lt;br /&gt;
} // end default state&lt;br /&gt;
// END&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Allen Kerensky</name></author>	</entry>

	</feed>