ampoule_bifocal_stereopticon.lsl
///////////////////////////////////////////////////////////////////////////
//  Copyright (C) Wizardry and Steamworks 2013 - License: GNU GPLv3      //
//  Please see: http://www.gnu.org/licenses/gpl.html for legal details,  //
//  rights of fair usage, the disclaimer and warranty conditions.        //
///////////////////////////////////////////////////////////////////////////
 
///////////////////////////////////////////////////////////////////////////
//    Copyright (C) 2013 Wizardry and Steamworks - License: GNU GPLv3    //
///////////////////////////////////////////////////////////////////////////
string wasKeyValueGet(string var, string kvp) {
    list dVars = llParseString2List(kvp, ["&"], []);
    do {
        list data = llParseString2List(llList2String(dVars, 0), ["="], []);
        string k = llList2String(data, 0);
        if(k != var) jump continue;
        return llList2String(data, 1);
@continue;
        dVars = llDeleteSubList(dVars, 0, 0);
    } while(llGetListLength(dVars));
    return "";
}
 
///////////////////////////////////////////////////////////////////////////
//    Copyright (C) 2013 Wizardry and Steamworks - License: GNU GPLv3    //
///////////////////////////////////////////////////////////////////////////
string wasKeyValueSet(string var, string val, string kvp) {
    list dVars = llParseString2List(kvp, ["&"], []);
    if(llGetListLength(dVars) == 0) return var + "=" + val;
    list result = [];
    do {
        list data = llParseString2List(llList2String(dVars, 0), ["="], []);
        string k = llList2String(data, 0);
        if(k == "") jump continue;
        if(k == var && val == "") jump continue;
        if(k == var) {
            result += k + "=" + val;
            val = "";
            jump continue;
        }
        string v = llList2String(data, 1);
        if(v == "") jump continue;
        result += k + "=" + v;
@continue;
        dVars = llDeleteSubList(dVars, 0, 0);
    } while(llGetListLength(dVars));
    if(val != "") result += var + "=" + val;
    return llDumpList2String(result, "&");
}
 
///////////////////////////////////////////////////////////////////////////
//    Copyright (C) 2013 Wizardry and Steamworks - License: GNU GPLv3    //
///////////////////////////////////////////////////////////////////////////
vector wasStringToVector(string in) {
    list v = llParseString2List(in, ["<", ",", ">"], []);
    return <llList2Float(v, 0), llList2Float(v, 1), llList2Float(v, 2)>;
}
 
///////////////////////////////////////////////////////////////////////////
//    Copyright (C) 2013 Wizardry and Steamworks - License: GNU GPLv3    //
///////////////////////////////////////////////////////////////////////////
integer wasMenuIndex = 0;
list wasDialogMenu(list input, list actions, string direction) {
    integer cut = 11-wasListCountExclude(actions, [""]);
    if(direction == ">" &&  (wasMenuIndex+1)*cut+wasMenuIndex+1 < llGetListLength(input)) {
        ++wasMenuIndex;
        jump slice;
    }
    if(direction == "<" && wasMenuIndex-1 >= 0) {
        --wasMenuIndex;
        jump slice;
    }
@slice;
    integer multiple = wasMenuIndex*cut;
    input = llList2List(input, multiple+wasMenuIndex, multiple+cut+wasMenuIndex);
    input = wasListMerge(input, actions, "");
    return input;
}
 
///////////////////////////////////////////////////////////////////////////
//    Copyright (C) 2013 Wizardry and Steamworks - License: GNU GPLv3    //
///////////////////////////////////////////////////////////////////////////
integer wasListCountExclude(list input, list exclude) {
    if(llGetListLength(input) == 0) return 0;
    if(llListFindList(exclude, (list)llList2String(input, 0)) == -1) 
        return 1 + wasListCountExclude(llDeleteSubList(input, 0, 0), exclude);
    return wasListCountExclude(llDeleteSubList(input, 0, 0), exclude);
}
 
///////////////////////////////////////////////////////////////////////////
//    Copyright (C) 2013 Wizardry and Steamworks - License: GNU GPLv3    //
///////////////////////////////////////////////////////////////////////////
list wasListMerge(list l, list m, string merge) {
    if(llGetListLength(l) == 0 && llGetListLength(m) == 0) return [];
    string a = llList2String(m, 0);
    if(a != merge) return [ a ] + wasListMerge(l, llDeleteSubList(m, 0, 0), merge);
    return [ llList2String(l, 0) ] + wasListMerge(llDeleteSubList(l, 0, 0), llDeleteSubList(m, 0, 0), merge);
}
 
///////////////////////////////////////////////////////////////////////////
//    Copyright (C) 2011 Wizardry and Steamworks - License: GNU GPLv3    //
///////////////////////////////////////////////////////////////////////////
string wasProgress(integer percent, integer length, list symbols) {
    percent /= (integer)((float)100.0/(length));
    string p = llList2String(symbols,0);
    integer itra = 0;
    do {
        if(itra>percent-1) p += llList2String(symbols,2);
        else p += llList2String(symbols,1);
    } while(++itra<length);
    return p + llList2String(symbols,3);
}
 
///////////////////////////////////////////////////////////////////////////
//    Copyright (C) 2013 Wizardry and Steamworks - License: GNU GPLv3    //
///////////////////////////////////////////////////////////////////////////
vector wasPercentToGradient(float percent, string rgb) {
    if(llStringLength(rgb) != 2) {
        llSay(DEBUG_CHANNEL, "Assert failed, rgb parameter must consist of a pair of either r, g, or b.");
        return ZERO_VECTOR;
    }
    string a = llGetSubString(rgb, 0, 0);
    string b = llGetSubString(rgb, 1, 1);
    list col = [ "r", "g", "b" ];
    integer ax = llListFindList(col, (list)a);
    integer bx = llListFindList(col, (list)b);
    if(ax == -1 || bx == -1) {
        llSay(DEBUG_CHANNEL, "Asset failed, rgb parameters must contain either r, g, or b letters.");
        return ZERO_VECTOR;
    }
    col = llListReplaceList(col, (list)((100-percent)/100), ax, ax);
    col = llListReplaceList(col, (list)(percent/100), bx, bx);
    return 2*<llList2Float(col, 0), llList2Float(col, 1), llList2Float(col, 2)>;
}
 
ABS(key id) {
    if(id != NULL_KEY && llGetAttached() != 0) {
        vector n = llList2Vector(llGetLinkPrimitiveParams(48, [PRIM_COLOR, ALL_SIDES]), 0);
        llOwnerSay("@setenv_ambientr:" + (string)n.x + "=force");
        llOwnerSay("@setenv_ambientg:" + (string)n.y + "=force");
        llOwnerSay("@setenv_ambientb:" + (string)n.z + "=force");
        return;
    }
    llOwnerSay("@setenv_daytime:-1=force");
}
 
integer i = 0;
integer channel = 0;
key toucher = NULL_KEY;
list monogram = [];
 
default {
    state_entry() {
        if(wasKeyValueGet("auto", llList2String(llGetLinkPrimitiveParams(13, [PRIM_DESC]), 0)) == "on") llSensorRepeat("", "", AGENT, 3, TWO_PI, 3);
        ABS(llGetOwner());
        if(toucher == NULL_KEY) return;
        llListen(channel, "", toucher, "");
        llDialog(toucher, "\nWelcome to the Ampoule Bifocal Stereopticon.\nCreated in 2013 by Wizardry and Steamworks\n                 16 Nov 2013: Version: 1.0\n\nFocal: " + wasKeyValueGet("auto", llList2String(llGetLinkPrimitiveParams(13, [PRIM_DESC]), 0)), ["◯ Open", "◉ Closed", "⎙ Options"], channel);
    }
    touch_start(integer total_number) {
        toucher = llDetectedKey(0);
        channel = (integer)("0x8" + llGetSubString(toucher, 0, 6));
        llListen(channel, "", toucher, "");
        llDialog(toucher, "\nWelcome to the Ampoule Bifocal Stereopticon.\nCreated in 2013 by Wizardry and Steamworks\n                 16 Nov 2013: Version: 1.0\n\nFocal: " + wasKeyValueGet("auto", llList2String(llGetLinkPrimitiveParams(13, [PRIM_DESC]), 0)), ["◯ Open", "◉ Closed", "⎙ Options"], channel);
    }
    listen(integer channel, string name, key toucher, string message) {
        if(message == "◯ Open") {
            if(wasKeyValueGet("status", llList2String(llGetLinkPrimitiveParams(13, [PRIM_DESC]), 0)) == "open") return;
            llRequestPermissions(llGetOwner(), PERMISSION_TRIGGER_ANIMATION);
            llSetTimerEvent(.5);
            llListenRemove(i);
            return;
        }
        if(message == "◉ Closed") {
            if(wasKeyValueGet("status", llList2String(llGetLinkPrimitiveParams(13, [PRIM_DESC]), 0)) == "closed") return;
            llRequestPermissions(llGetOwner(), PERMISSION_TRIGGER_ANIMATION);
            llSetTimerEvent(.5);
            llListenRemove(i);
            return;
        }
// REGION: OWNER
        if(toucher != llGetOwner()) {
            llInstantMessage(toucher, "Sorry, this option is restricted to the owner.");
            llListenRemove(i);
            return;
        }
        if(message == "⎙ Options") state options;
// REGION: OWNER
    }
    sensor(integer num) {
        if(wasKeyValueGet("status", llList2String(llGetLinkPrimitiveParams(13, [PRIM_DESC]), 0)) == "closed") return;
        llRequestPermissions(llGetOwner(), PERMISSION_TRIGGER_ANIMATION);
        llSetTimerEvent(.5);
    }
    no_sensor() {
        if(wasKeyValueGet("status", llList2String(llGetLinkPrimitiveParams(13, [PRIM_DESC]), 0)) == "open") return;
        llRequestPermissions(llGetOwner(), PERMISSION_TRIGGER_ANIMATION);
        llSetTimerEvent(.5);
    }
    run_time_permissions(integer perm) {
        if(!(perm & PERMISSION_TRIGGER_ANIMATION)) return;
        if(llGetInventoryType("Glasses") != INVENTORY_ANIMATION) return;
        llStartAnimation("Glasses");
    }
    timer() {
        if(wasKeyValueGet("status", llList2String(llGetLinkPrimitiveParams(13, [PRIM_DESC]), 0)) == "open") {
            llSetLinkPrimitiveParamsFast(2, [PRIM_TYPE, PRIM_TYPE_CYLINDER, PRIM_HOLE_CIRCLE, <0, 1, 0>, 0, ZERO_VECTOR, <1, 1, 0>, ZERO_VECTOR, PRIM_SLICE, <0, .1, 0>]);
            llSetLinkPrimitiveParamsFast(13, [PRIM_DESC, wasKeyValueSet("status", "closed", llList2String(llGetLinkPrimitiveParams(13, [PRIM_DESC]), 0))]);
            jump reset;
        }
        llSetLinkPrimitiveParamsFast(2, [PRIM_TYPE, PRIM_TYPE_CYLINDER, PRIM_HOLE_CIRCLE, <0, 1, 0>, .85, ZERO_VECTOR, <1, 1, 0>, ZERO_VECTOR,PRIM_SLICE, <0, .1, 0>]);
        llSetLinkPrimitiveParamsFast(13, [PRIM_DESC, wasKeyValueSet("status", "open", llList2String(llGetLinkPrimitiveParams(13, [PRIM_DESC]), 0))]);
@reset;
        llResetScript();
    }
    changed(integer change) {
        if(change & CHANGED_REGION)  llResetScript(); 
    }
    attach(key id) { ABS(id); }
}
 
state options {
    state_entry() {
        llListen(channel, "", toucher, "");
        llDialog(toucher, "\nWelcome to the Ampoule Bifocal Stereopticon.\nCreated in 2013 by Wizardry and Steamworks\n                 16 Nov 2013: Version: 1.0", ["⏏ Exit", "⎙ Color", "⎙ Opacity", "⎙ Bright", "⎙ Glow", "⎙ Size", "⎙ Focal", "⎙ Stamp"], channel);
    }
    touch_start(integer num) {
        if(llDetectedKey(0) != llGetOwner()) return;
        llListen(channel, "", toucher, "");
        llDialog(toucher, "\nWelcome to the Ampoule Bifocal Stereopticon.\nCreated in 2013 by Wizardry and Steamworks\n                 16 Nov 2013: Version: 1.0", ["⏏ Exit", "⎙ Color", "⎙ Opacity", "⎙ Bright", "⎙ Glow", "⎙ Size", "⎙ Focal", "⎙ Stamp"], channel);
    }
    listen(integer channel, string name, key toucher, string message) {
        if(message == "⏏ Exit") state default;
        if(message == "⎙ Color") state color;
        if(message == "⎙ Opacity") state opacity;
        if(message == "⎙ Bright") state bright;
        if(message == "⎙ Glow") state glow;
        if(message == "⎙ Size") state size;
        if(message == "⎙ Focal") state auto;
        if(message == "⎙ Stamp") state read_monogram;
    }
    changed(integer change) {
        if(change & CHANGED_REGION)  llResetScript(); 
    }
    attach(key id) { ABS(id); }
}
 
state color {
    state_entry() {
        llListen(channel, "", toucher, "");
        llDialog(toucher, "\nWelcome to the Ampoule Bifocal Stereopticon.\nCreated in 2013 by Wizardry and Steamworks\n                 16 Nov 2013: Version: 1.0", ["R ▼", "G ▼", "B ▼", "R ▲", "G ▲", "B ▲", "⏏ Exit"], channel);
    }
    touch_start(integer num) {
        if(llDetectedKey(0) != llGetOwner()) return;
        llListen(channel, "", toucher, "");
        llDialog(toucher, "\nWelcome to the Ampoule Bifocal Stereopticon.\nCreated in 2013 by Wizardry and Steamworks\n                 16 Nov 2013: Version: 1.0", ["R ▼", "G ▼", "B ▼", "R ▲", "G ▲", "B ▲", "⏏ Exit"], channel);
    }
    listen(integer channel, string name, key toucher, string message) {
        if(message == "⏏ Exit") state options;
        list params = llGetLinkPrimitiveParams(48, [PRIM_COLOR, ALL_SIDES]);
        vector color = llList2Vector(params, 0);
        float alpha = llList2Float(params, 1);
        vector n = ZERO_VECTOR;
        if(message == "R ▼") {
            n = color-<.1,0,0>;
            llSetLinkPrimitiveParamsFast(48, [PRIM_COLOR, ALL_SIDES, n, alpha]);
            llSetLinkPrimitiveParamsFast(45, [PRIM_COLOR, ALL_SIDES, n, alpha]);
            jump set;
        }
        if(message == "R ▲") {
            n = color+<.1,0,0>;
            llSetLinkPrimitiveParamsFast(48, [PRIM_COLOR, ALL_SIDES, n, alpha]);
            llSetLinkPrimitiveParamsFast(45, [PRIM_COLOR, ALL_SIDES, n, alpha]);
            jump set;
        }
        if(message == "G ▼") {
            n = color-<0,.1,0>;
            llSetLinkPrimitiveParamsFast(48, [PRIM_COLOR, ALL_SIDES, n, alpha]);
            llSetLinkPrimitiveParamsFast(45, [PRIM_COLOR, ALL_SIDES, n, alpha]);
            jump set;
        }
        if(message == "G ▲") {
            n = color+<0,.1,0>;
            llSetLinkPrimitiveParamsFast(48, [PRIM_COLOR, ALL_SIDES, n, alpha]);
            llSetLinkPrimitiveParamsFast(45, [PRIM_COLOR, ALL_SIDES, n, alpha]);
            jump set;
        }
        if(message == "B ▼") {
            n = color-<0,0,.1>;
            llSetLinkPrimitiveParamsFast(48, [PRIM_COLOR, ALL_SIDES, n, alpha]);
            llSetLinkPrimitiveParamsFast(45, [PRIM_COLOR, ALL_SIDES, n, alpha]);
            jump set;
        }
        if(message == "B ▲") {
            n = color+<0,0,.1>;
            llSetLinkPrimitiveParamsFast(48, [PRIM_COLOR, ALL_SIDES, n, alpha]);
            llSetLinkPrimitiveParamsFast(45, [PRIM_COLOR, ALL_SIDES, n, alpha]);
            jump set;
        }
@set;
        llOwnerSay("@setenv_ambientr:" + (string)n.x + "=force");
        llOwnerSay("@setenv_ambientg:" + (string)n.y + "=force");
        llOwnerSay("@setenv_ambientb:" + (string)n.z + "=force");
        llDialog(toucher, "\nWelcome to the Ampoule Bifocal Stereopticon.\nCreated in 2013 by Wizardry and Steamworks\n                 16 Nov 2013: Version: 1.0", ["R ▼", "G ▼", "B ▼", "R ▲", "G ▲", "B ▲", "⏏ Exit"], channel);
    }
    changed(integer change) {
        if(change & CHANGED_REGION)  llResetScript(); 
    }
    attach(key id) { ABS(id); }
}
 
state opacity {
    state_entry() {
        llListen(channel, "", toucher, "");
        llDialog(toucher, "\nWelcome to the Ampoule Bifocal Stereopticon.\nCreated in 2013 by Wizardry and Steamworks\n                 16 Nov 2013: Version: 1.0", ["⏏ Exit", "Opacity ▼", "Opacity ▲"], channel);
    }
    touch_start(integer num) {
        if(llDetectedKey(0) != llGetOwner()) return;
        llListen(channel, "", toucher, "");
        llDialog(toucher, "\nWelcome to the Ampoule Bifocal Stereopticon.\nCreated in 2013 by Wizardry and Steamworks\n                 16 Nov 2013: Version: 1.0", ["⏏ Exit", "Opacity ▼", "Opacity ▲"], channel);
    }
    listen(integer channel, string name, key toucher, string message) {
        if(message == "⏏ Exit") state options;
        list params = llGetLinkPrimitiveParams(48, [PRIM_COLOR, ALL_SIDES]);
        vector color = llList2Vector(params, 0);
        float alpha = llList2Float(params, 1);
        if(message == "Opacity ▼") {
            llSetLinkPrimitiveParamsFast(48, [PRIM_COLOR, ALL_SIDES, color, alpha-.1]);
            llSetLinkPrimitiveParamsFast(45, [PRIM_COLOR, ALL_SIDES, color, alpha-.1]);
            jump menu;
        }
        if(message == "Opacity ▲") {
            llSetLinkPrimitiveParamsFast(48, [PRIM_COLOR, ALL_SIDES, color, alpha+.1]);
            llSetLinkPrimitiveParamsFast(45, [PRIM_COLOR, ALL_SIDES, color, alpha+.1]);
            jump menu;
        }
@menu;
        llDialog(toucher, "\nWelcome to the Ampoule Bifocal Stereopticon.\nCreated in 2013 by Wizardry and Steamworks\n                 16 Nov 2013: Version: 1.0", ["⏏ Exit", "Opacity ▼", "Opacity ▲"], channel);
    }
    changed(integer change) {
        if(change & CHANGED_REGION)  llResetScript(); 
    }
    attach(key id) { ABS(id); }
}
 
state bright {
    state_entry() {
        llListen(channel, "", toucher, "");
        llDialog(toucher, "\nWelcome to the Ampoule Bifocal Stereopticon.\nCreated in 2013 by Wizardry and Steamworks\n                 16 Nov 2013: Version: 1.0", ["⏏ Exit", "◉ ON", "◯ OFF"], channel);
    }
    touch_start(integer num) {
        if(llDetectedKey(0) != llGetOwner()) return;
        llListen(channel, "", toucher, "");
        llDialog(toucher, "\nWelcome to the Ampoule Bifocal Stereopticon.\nCreated in 2013 by Wizardry and Steamworks\n                 16 Nov 2013: Version: 1.0", ["⏏ Exit", "◉ ON", "◯ OFF"], channel);
    }
    listen(integer channel, string name, key toucher, string message) {
        if(message == "⏏ Exit") state options;
        if(message == "◉ ON") {
            llSetLinkPrimitiveParamsFast(48, [PRIM_FULLBRIGHT, ALL_SIDES, TRUE]);
            llSetLinkPrimitiveParamsFast(45, [PRIM_FULLBRIGHT, ALL_SIDES, TRUE]);
            jump menu;
        }
        if(message == "◯ OFF") {
            llSetLinkPrimitiveParamsFast(48, [PRIM_FULLBRIGHT, ALL_SIDES, FALSE]);
            llSetLinkPrimitiveParamsFast(45, [PRIM_FULLBRIGHT, ALL_SIDES, FALSE]);
        }
@menu;
        llDialog(toucher, "\nWelcome to the Ampoule Bifocal Stereopticon.\nCreated in 2013 by Wizardry and Steamworks\n                 16 Nov 2013: Version: 1.0", ["⏏ Exit", "◉ ON", "◯ OFF"], channel);
    }
    changed(integer change) {
        if(change & CHANGED_REGION)  llResetScript(); 
    }
    attach(key id) { ABS(id); }
}
 
state glow {
    state_entry() {
        llListen(channel, "", toucher, "");
        llDialog(toucher, "\nWelcome to the Ampoule Bifocal Stereopticon.\nCreated in 2013 by Wizardry and Steamworks\n                 16 Nov 2013: Version: 1.0", ["⏏ Exit", "Glow ▼", "Glow ▲"], channel);
    }
    touch_start(integer num) {
        if(llDetectedKey(0) != llGetOwner()) return;
        llListen(channel, "", toucher, "");
        llDialog(toucher, "\nWelcome to the Ampoule Bifocal Stereopticon.\nCreated in 2013 by Wizardry and Steamworks\n                 16 Nov 2013: Version: 1.0", ["⏏ Exit", "Glow ▼", "Glow ▲"], channel);
    }
    listen(integer channel, string name, key toucher, string message) {
        if(message == "⏏ Exit") state options;
        list params = llGetLinkPrimitiveParams(48, [PRIM_GLOW, ALL_SIDES]);
        float glow = llList2Float(params, 0);
        if(message == "Glow ▼") {
            if(glow - .01 < 0) jump menu;
            llSetLinkPrimitiveParamsFast(48, [PRIM_GLOW, ALL_SIDES, glow-.01]);
            llSetLinkPrimitiveParamsFast(45, [PRIM_GLOW, ALL_SIDES, glow-.01]);
            jump menu;
        }
        if(message == "Glow ▲") {
            if(glow + .01 > 1) jump menu;
            llSetLinkPrimitiveParamsFast(48, [PRIM_GLOW, ALL_SIDES, glow+.01]);
            llSetLinkPrimitiveParamsFast(45, [PRIM_GLOW, ALL_SIDES, glow+.01]);
            jump menu;
        }
@menu;
        llDialog(toucher, "\nWelcome to the Ampoule Bifocal Stereopticon.\nCreated in 2013 by Wizardry and Steamworks\n                 16 Nov 2013: Version: 1.0", ["⏏ Exit", "Glow ▼", "Glow ▲"], channel);
    }
    changed(integer change) {
        if(change & CHANGED_REGION)  llResetScript(); 
    }
    attach(key id) { ABS(id); }
}
 
state size {
    state_entry() {
        llListen(channel, "", toucher, "");
        llDialog(toucher, "\nWelcome to the Ampoule Bifocal Stereopticon.\nCreated in 2013 by Wizardry and Steamworks\n                 16 Nov 2013: Version: 1.0", ["-.01", "-.02", "-.05", "+.01", "+.02", "+.05", "⏏ Exit"], channel);
    }
    touch_start(integer num) {
        if(llDetectedKey(0) != llGetOwner()) return;
        llListen(channel, "", toucher, "");
        llDialog(toucher, "\nWelcome to the Ampoule Bifocal Stereopticon.\nCreated in 2013 by Wizardry and Steamworks\n                 16 Nov 2013: Version: 1.0", ["-.01", "-.02", "-.05", "+.01", "+.02", "+.05", "⏏ Exit"], channel);
    }
    listen(integer channel, string name, key toucher, string message) {
        if(message == "⏏ Exit") state options;
        if((float)message == 0) return;
        float scale = 1 + (float)message;
        integer i = llGetNumberOfPrims();
        do {
            vector linkScale = llList2Vector(llGetLinkPrimitiveParams(i, [PRIM_SIZE]), 0);
            vector linkPos = llList2Vector(llGetLinkPrimitiveParams(i, [PRIM_POS_LOCAL]), 0);
            llSetLinkPrimitiveParamsFast(i, [PRIM_SIZE, scale * linkScale, PRIM_POSITION, scale * linkPos]);
        } while(--i>1);
        llDialog(toucher, "\nWelcome to the Ampoule Bifocal Stereopticon.\nCreated in 2013 by Wizardry and Steamworks\n                 16 Nov 2013: Version: 1.0", ["-.01", "-.02", "-.05", "+.01", "+.02", "+.05", "⏏ Exit"], channel);
    }
    changed(integer change) {
        if(change & CHANGED_REGION)  llResetScript(); 
    }
    attach(key id) { ABS(id); }
}
 
state auto {
    state_entry() {
        llListen(channel, "", toucher, "");
        llDialog(toucher, "\nWelcome to the Ampoule Bifocal Stereopticon.\nCreated in 2013 by Wizardry and Steamworks\n                 16 Nov 2013: Version: 1.0\n\nTurning this option on will automatically tilt the glasses up once you are standing close to an avatar and put them back down again when you move away from avatars.", ["⏏ Exit", "◉ ON", "◯ OFF" ], channel);
    }
    touch_start(integer num) {
        if(llDetectedKey(0) != llGetOwner()) return;
        llListen(channel, "", toucher, "");
        llDialog(toucher, "\nWelcome to the Ampoule Bifocal Stereopticon.\nCreated in 2013 by Wizardry and Steamworks\n                 16 Nov 2013: Version: 1.0\n\nTurning this option on will automatically tilt the glasses up once you are standing close to an avatar and put them back down again when you move away from avatars.", ["⏏ Exit", "◉ ON", "◯ OFF" ], channel);
    }
    listen(integer channel, string name, key toucher, string message) {
        if(message == "◉ ON") {
            llSetLinkPrimitiveParamsFast(13, [PRIM_DESC, wasKeyValueSet("auto", "on", llList2String(llGetLinkPrimitiveParams(13, [PRIM_DESC]), 0))]);
            jump options;
        }
        if(message == "◯ OFF") llSetLinkPrimitiveParamsFast(13, [PRIM_DESC, wasKeyValueSet("auto", "off", llList2String(llGetLinkPrimitiveParams(13, [PRIM_DESC]), 0))]);
@options;
        state options;
    }
    changed(integer change) {
        if(change & CHANGED_REGION)  llResetScript(); 
    }
    attach(key id) { ABS(id); }
}
 
state read_monogram {
    state_entry() {
        i = llGetInventoryNumber(INVENTORY_NOTECARD)-1;
        do {
            if(llGetInventoryName(INVENTORY_NOTECARD, i) == "Monogram")
            jump found_notecard;
        } while(--i>-1);
        llSay(DEBUG_CHANNEL, "Failed to find Monogram notecard.");
        return;
@found_notecard;
        i = 0;
        llGetNotecardLine("Monogram", i);
    }
    dataserver(key id, string data) {
        if(data == EOF) {
            llSetText("", <0,0,0>, .0);
            state monogram_menu;
        }
        if(data != "") monogram += data;
        integer percent = 100 * i/26;
        llSetText("Please wait, loading menu...\n" + wasProgress(percent, 10, ["[", "█", "░", "]"]) + "\n Memory: " + (string)llGetFreeMemory() + "\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n", wasPercentToGradient(percent, "rg"), 1);
        llGetNotecardLine("Monogram", ++i);
    }
    changed(integer change) {
        if(change & CHANGED_REGION)  llResetScript(); 
    }
    attach(key id) { ABS(id); }
}
 
state monogram_menu {
    state_entry() {
        wasMenuIndex = 0;
        llListen(channel, "", toucher, "");
        llDialog(toucher, "\nWelcome to the Ampoule Bifocal Stereopticon.\nCreated in 2013 by Wizardry and Steamworks\n                 16 Nov 2013: Version: 1.0", wasDialogMenu(["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"], ["⏏ Exit", "⟻ Back", "Next ⟼"], ""), channel);
    }
    touch_start(integer num) {
        if(llDetectedKey(0) != llGetOwner()) return;
        llListen(channel, "", toucher, "");
        llDialog(toucher, "\nWelcome to the Ampoule Bifocal Stereopticon.\nCreated in 2013 by Wizardry and Steamworks\n                 16 Nov 2013: Version: 1.0", wasDialogMenu(["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"], ["⏏ Exit", "⟻ Back", "Next ⟼"], ""), channel);
    }
    listen(integer channel, string name, key toucher, string message) {
        if(message == "⏏ Exit") {
            monogram = [];
            state options;
        }
        if(message == "⟻ Back") {
            llDialog(toucher, "\nWelcome to the Ampoule Bifocal Stereopticon.\nCreated in 2013 by Wizardry and Steamworks\n                 16 Nov 2013: Version: 1.0", wasDialogMenu(["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"], ["⏏ Exit", "⟻ Back", "Next ⟼"], "<"), channel);
            return;
        }
        if(message == "Next ⟼") {
            llDialog(toucher, "\nWelcome to the Ampoule Bifocal Stereopticon.\nCreated in 2013 by Wizardry and Steamworks\n                 16 Nov 2013: Version: 1.0", wasDialogMenu(["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"], ["⏏ Exit", "⟻ Back", "Next ⟼"], ">"), channel);
            return;
        }
        i = llGetListLength(monogram)-1;
        do {
            list m = llParseString2List(llList2String(monogram, i), ["="], []);
            if(message == llList2String(m, 0)) {
                llSetLinkPrimitiveParamsFast(9, [PRIM_TYPE, PRIM_TYPE_SCULPT, llList2String(m, 1), PRIM_SCULPT_TYPE_SPHERE]);
                llDialog(toucher, "\nWelcome to the Ampoule Bifocal Stereopticon.\nCreated in 2013 by Wizardry and Steamworks\n                 16 Nov 2013: Version: 1.0", wasDialogMenu(["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"], ["⏏ Exit", "⟻ Back", "Next ⟼"], ""), channel);
                return;
            }
        } while(--i>-1);
    }
    changed(integer change) {
        if(change & CHANGED_REGION)  llResetScript(); 
    }
    attach(key id) { ABS(id); }
}

secondlife/glasses/ampoule_bifocal_stereopticon.txt · Last modified: 2022/11/24 07:46 by 127.0.0.1

Access website using Tor Access website using i2p Wizardry and Steamworks PGP Key


For the contact, copyright, license, warranty and privacy terms for the usage of this website please see the contact, license, privacy, copyright.