Myriad Lite Character Editor

ABANDONED PROTOTYPE replaced with Myriad Lite Character Editor

// Myriad_Lite_Character_Editor-v0.0.0-20131219.lsl
// Copyright (c) 2013 by Allen Kerensky (OSG/SL) All Rights Reserved.
// This work is dual-licensed under
// Creative Commons Attribution (CC BY) 3.0 Unported
// http://creativecommons.org/licenses/by/3.0/
// - or -
// Modified BSD License (3-clause)
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
// * Redistributions of source code must retain the above copyright notice, 
//   this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright notice,
//   this list of conditions and the following disclaimer in the documentation
//   and/or other materials provided with the distribution.
// * Neither the name of Myriad Lite nor the names of its contributors may be
//   used to endorse or promote products derived from this software without
//   specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY EXPRESS OR
// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
// NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// The Myriad RPG System was designed, written, and illustrated by Ashok Desai
// Myriad RPG System licensed under:
// Creative Commons Attribution (CC BY) 2.0 UK: England and Wales
// http://creativecommons.org/licenses/by/2.0/uk/
 
// CONSTANTS - DO NOT CHANGE DURING RUN
string BASENAME = "Myriad Lite Character Editor"; // base name of this script without version or date
string VERSION = "0.0.1"; // Allen Kerensky's script version
string VERSIONDATE = "20131219"; // Allen Kerensky's script yyyymmdd
 
// CONSTANTS
list CATEGORIES = [ "STATISTICS","SKILLS","EFFECTS","RESILIENCES","BOONS","FLAWS","CAMPAIGNS","SPECIES","BACKGROUNDS","CAREERS","ITEMS" ];
 
// RUNTIME GLOBALS
list PRIMNAMES;
integer DYNAMIC_CHANNEL;
integer DYNAMIC_HANDLE;
integer NUMCAT; // number of category in CATEGORIES list
string CURCAT; // name of current category
integer NUMITEM; // number of item in current CATLIST 
string CURITEM; // name of current item in current category list
list CATLIST; // CSV list of items in current category - requested from region setting server
integer RENDEZVOUS1 = -999;
integer HANDLE1;
integer RENDEZVOUS2;
integer HANDLE2;
key WHO; // who is using the setup
integer CHANNEL; // for TextBox popup
integer HANDLE; // for TextBox popup
string REQUEST; // current request to dispatch
 
BUY_ITEM() {
}
 
CLEAR() {
    // put prim number/name pairs into list for UPDATE function to write text on prims
    integer i;
    for (i = 0; i <= llGetNumberOfPrims(); i++) {
        string name = llList2String(llGetLinkPrimitiveParams(i,[PRIM_NAME]),0);
        // if ( llGetSubString(name,0,4) == "SHOW " ) llSetLinkPrimitiveParams(i,[PRIM_TEXT,"",<0,0,0>,0]);
        llSetLinkPrimitiveParams(i,[PRIM_TEXT,"",<0,0,0>,0]);
    }
}
 
COMMAND(string in) {
    REQUEST=in;
    if ( in == "SET_NAME" ) { SET_NAME(); return; }
    if ( in == "SET_NICKNAME" ) { SET_NICKNAME(); return; }
    if ( in == "SET_TITLE" ) { SET_TITLE(); return; }
    if ( in == "SET_FACTION" ) { SET_FACTION(); return; }
    // locate category name from list
    if ( llListFindList(CATEGORIES,[in]) != -1 ) {
        CURCAT = in;
        NUMITEM = 0;
        llRegionSay(RENDEZVOUS2,"LIST_"+CURCAT);
        return;
    }
    if ( in == "PREV ITEM" ) { PREV_ITEM(); return; }
    if ( in == "NEXT ITEM" ) { NEXT_ITEM(); return; }
    if ( in == "BUY ITEM" ) { BUY_ITEM(); return; }
    if ( in == "SELL ITEM" ) { SELL_ITEM(); return; }
    if ( in == "RESET" ) { RESET(); return; }
    if ( in == "SAVE" ) { SAVE(); return; }
}
 
 
NEXT_ITEM() {
    NUMITEM++;
    if ( NUMITEM >= llGetListLength(CATLIST) ) NUMITEM = 0;
    CURITEM = llList2String(CATLIST,NUMITEM);
}
 
PREV_ITEM() {
    NUMITEM--;
    if ( NUMITEM < 0 ) NUMITEM = llGetListLength(CATLIST);
    CURITEM = llList2String(CATLIST,NUMITEM);
}
 
RESET() {
    // do things
    llStopAnimation("turn_180");
    llUnSit(llAvatarOnSitTarget());
    CLEAR();
}
 
SAVE() {
}
 
SELL_ITEM() {
}
 
SET_FACTION() {
    if ( HANDLE == 0 ) {
        CHANNEL = 1+(integer)llFrand(9999.0);
        HANDLE = llListen(CHANNEL,"",NULL_KEY,"");
        llTextBox(llDetectedKey(0),"(Optional) What Is Your Character's Faction?\rYou have 60 seconds to enter a name.",CHANNEL);
        llSetTimerEvent(60.0);
    } else {
        llSay(PUBLIC_CHANNEL,"Tool is already in use, please wait.");
    }
}
 
SET_NAME() {
    if ( HANDLE == 0 ) {
        CHANNEL = 1+(integer)llFrand(9999.0);
        HANDLE = llListen(CHANNEL,"",NULL_KEY,"");
        llTextBox(llDetectedKey(0),"What Is Your Character's First and Last Name?\rYou have 60 seconds to enter a name.",CHANNEL);
        llSetTimerEvent(60.0);
    } else {
        llSay(PUBLIC_CHANNEL,"Tool is already in use, please wait.");
    }
}
 
SET_NICKNAME() {
    if ( HANDLE == 0 ) {
        CHANNEL = 1+(integer)llFrand(9999.0);
        HANDLE = llListen(CHANNEL,"",NULL_KEY,"");
        llTextBox(llDetectedKey(0),"(Optional) What Is Your Character's Nickname?\rYou have 60 seconds to enter a name.",CHANNEL);
        llSetTimerEvent(60.0);
    } else {
        llSay(PUBLIC_CHANNEL,"Tool is already in use, please wait.");
    }
}
 
SET_TITLE() {
    if ( HANDLE == 0 ) {
        CHANNEL = 1+(integer)llFrand(9999.0);
        HANDLE = llListen(CHANNEL,"",NULL_KEY,"");
        llTextBox(llDetectedKey(0),"What Is Your Character's Title?\rExamples: Doctor, Reverend, etc.\rYou have 60 seconds to enter a name.",CHANNEL);
        llSetTimerEvent(60.0);
    } else {
        llSay(PUBLIC_CHANNEL,"Tool is already in use, please wait.");
    }
}
 
SETUP() {
    // llSetText("Myriad Lite Character Editorder (Prototype)\nSit Here To Begin",<1,0,0>,1);
    vector OFFSET = <0,0,1.0>;
    llSitTarget(OFFSET,ZERO_ROTATION);
    llSetSitText("> EDIT <");
 
    // put prim number/name pairs into list for UPDATE function to write text on prims
    integer i;
    for (i = 0; i <= llGetNumberOfPrims(); i++) {
        string name = llList2String(llGetLinkPrimitiveParams(i,[PRIM_NAME]),0);
        PRIMNAMES = PRIMNAMES + [name];
    }
    CLEAR();
 
    // SETUP RENDEZVOUS1 CHANNEL (STATIC) - backward compatible for Preview 6 and earlier
    if ( HANDLE1 != 0 ) llListenRemove(HANDLE1);
    HANDLE1 = llListen(RENDEZVOUS1,"",NULL_KEY,"");
    llSay(PUBLIC_CHANNEL,"Rendezvous1 channel is "+(string)RENDEZVOUS1);
 
    // SETUP RENDEZVOUS2 CHANNEL (DYNAMIC) - new for Preview 7 and later
    list details = llGetParcelDetails(<0,0,0>,[PARCEL_DETAILS_ID]);
    string parcelid = llList2String(details,0);
    RENDEZVOUS2 = (integer)("0x"+llGetSubString(parcelid,0,7));
    if ( HANDLE2 != 0 ) llListenRemove(HANDLE2);
    HANDLE2 = llListen(RENDEZVOUS2,"",NULL_KEY,"");
    llSay(PUBLIC_CHANNEL,"Rendezvous2 channel is "+(string)RENDEZVOUS2);    
 
    // start listener last
    DYNAMIC_CHANNEL = (integer)("0x"+llGetSubString(llGetKey(),0,6));
    if ( DYNAMIC_HANDLE != 0 ) llListenRemove(DYNAMIC_HANDLE);
    DYNAMIC_HANDLE = llListen(DYNAMIC_CHANNEL,"",NULL_KEY,"");
 
    // CURCAT = llList2String(CATEGORIES,NUMCAT);
    // llRegionSay(RENDEZVOUS2,"LIST_"+CURCAT); // request first category
}
 
UPDATE() {
    integer prim = llListFindList(PRIMNAMES,["SHOW CATEGORY"]);
    if ( prim != -1 && CURCAT != "" ) llSetLinkPrimitiveParams(prim,[PRIM_TEXT,CURCAT,<1,1,1>,1.0]);
 
    prim = llListFindList(PRIMNAMES,["SHOW ITEM"]);
    if ( prim != -1 && CURITEM != "" ) llSetLinkPrimitiveParams(prim,[PRIM_TEXT,CURITEM,<1,1,1>,1.0]);
 
    // update item cost
    // update character point pool left
    // update name
    // update faction
    // update species
    // update background
    // update career
}
 
default {
 
    changed(integer change) {
        if ( change & CHANGED_LINK ) { // someone sits or stands up
            WHO = llAvatarOnSitTarget();
            if ( WHO == NULL_KEY ) RESET(); // stood up - reset
            if ( WHO != NULL_KEY ) {
                llRequestPermissions(WHO,PERMISSION_TRIGGER_ANIMATION);
            }
        }
    }
 
    listen(integer channel, string name, key id, string message) {
        if ( channel == CHANNEL ) {
            integer chan = (integer)("0x"+llGetSubString((string)id,0,6));
            if ( REQUEST == "SET_NAME" ) llRegionSay(chan,"SET_NAME|NAME="+message);
            if ( REQUEST == "SET_NICKNAME" ) llRegionSay(chan,"SET_NICKNAME|NICKNAME="+message);
            if ( REQUEST == "SET_TITLE" ) llRegionSay(chan,"SET_TITLE|TITLE="+message);
            if ( REQUEST == "SET_FACTION" ) llRegionSay(chan,"SET_FACTION|FACTION="+message);
            if ( HANDLE != 0 ) llListenRemove(HANDLE);
            llSetTimerEvent(0.0);
            HANDLE = 0;
            return;
        }
 
        string prefix = llList2String( llParseString2List(message,["|"],[]) ,0); // get the field before the first |
        if ( llListFindList(CATEGORIES,[prefix]) ) { // if that field is a category name, this is a reply to a LIST_ request
            CATLIST = llCSV2List( llList2String( llParseString2List(message,["|"],[]) ,1) ); // get the CSV list from response
            CURITEM = llList2String(CATLIST,NUMITEM);
            UPDATE();
            return;
        }
    }
 
    run_time_permissions(integer perm) {
        if ( perm & PERMISSION_TRIGGER_ANIMATION ) llStartAnimation("turn_180");
    }
 
    state_entry() {
        SETUP();
    }
 
    timer() {
        if ( HANDLE != 0 ) llListenRemove(HANDLE);
        llSay(PUBLIC_CHANNEL,"Time expired. Please try again when ready.");
        HANDLE = 0;
    }
 
    touch_start(integer num_detected) {
        if ( WHO == NULL_KEY) return; // if no one on sit target, ignore clicks
        string action = llGetLinkName(llDetectedLinkNumber(0)); // get name of prim clicked in link set
        if ( action != "" && action != llGetObjectName() ) { // someone clicked a named button prim on this linkset
            COMMAND(action); // try that prim name as a command
            return;
        }
    }    
}