// Trixie's regular cape. Just does a fast fade in and out - the ice cape
// does the magic effects.
// Collar is the same as the cape without the communication responses

// this script also handles the alicorn amulet, but ice is in a separate script

integer channel = -7;
float speed = 0.025;
float visibility;
integer alicorn = 0;
integer amuletprim = 2;
integer gemprim = 3;

setVisibility(float vis)
{
    llSetLinkAlpha(1, vis, ALL_SIDES);
    llSetLinkAlpha(6, vis, ALL_SIDES);
}

default
{
    on_rez(integer x)
    {
        llResetScript();
    }
    
    state_entry()
    {
        state visible;
    }
}

state visible
{
    on_rez(integer x)
    {
        llResetScript();
    }
    
    state_entry()
    {
        setVisibility(1.0);
        llSetLinkPrimitiveParamsFast(amuletprim, [ PRIM_GLOW, ALL_SIDES, 0.0 ]);
        llSetLinkAlpha(amuletprim, 0.0, ALL_SIDES);   // amulet
        llSetLinkAlpha(gemprim, 1.0, ALL_SIDES);      // gem
        alicorn = 0;                                  // just a flag
        llListen(channel, "", NULL_KEY, "");
    }

    listen(integer channel, string name, key id, string msg) 
    {
        if (msg == "capestarayt") {
            // no answer, but no error either
        } else if (msg == "capeiceayt") {
            // no answer, but no error either
        } else if (msg == "capetuxayt") {
            // no answer, but no error either
        } else if (msg == "capegoice") {
            state fadeout;
        } else if (msg == "capegostars") {
            if (alicorn) {
                // explode the alicorn amulet and snap back to the gem
                llLinkParticleSystem(amuletprim, [
                    PSYS_PART_FLAGS, PSYS_PART_EMISSIVE_MASK|PSYS_PART_INTERP_COLOR_MASK|PSYS_PART_INTERP_SCALE_MASK,
                    PSYS_SRC_PATTERN, PSYS_SRC_PATTERN_EXPLODE,
                    PSYS_SRC_BURST_RADIUS, 0.1,
                    PSYS_PART_START_COLOR, <1.0,1.0,1.0>,
                    PSYS_PART_END_COLOR, <0.5, 0.8, 0.8>,
                    PSYS_PART_START_ALPHA, 1.0,
                    PSYS_PART_END_ALPHA, 0.1,
                    PSYS_PART_START_SCALE, <0.2, 0.2, 0.2>,
                    PSYS_PART_END_SCALE, <0.01, 0.01, 0.01>,
                    PSYS_PART_START_GLOW, 0.1,
                    PSYS_SRC_MAX_AGE, 0.3,
                    PSYS_SRC_BURST_RATE, 0.1,
                    PSYS_SRC_BURST_PART_COUNT, 100,
                    PSYS_SRC_BURST_SPEED_MIN, 0.2,
                    PSYS_SRC_BURST_SPEED_MAX, 1.0
                ]);
                llSetLinkPrimitiveParamsFast(amuletprim, [ PRIM_GLOW, ALL_SIDES, 0.0 ]);
                llSetLinkAlpha(amuletprim, 0.0, ALL_SIDES);   // amulet
                llSetLinkAlpha(gemprim, 1.0, ALL_SIDES);      // gem
                llSleep(0.2);
                llLinkParticleSystem(amuletprim, [] );
                alicorn = 0;
            } else {
                llOwnerSay("Got 'capegostars' in state visible");
            }
        } else if (msg == "capegoalicorn") {
            if (alicorn == 0) {
                integer idx;
                llSetLinkPrimitiveParamsFast(gemprim, [ PRIM_GLOW, ALL_SIDES, 1.0 ]);
                for (idx = 0; idx <= 10; idx++) {
                    llSetLinkAlpha(amuletprim, (float)idx/10.0, ALL_SIDES);     // amulet
                    llSetLinkAlpha(gemprim, 1.0-((float)idx/10.0), ALL_SIDES);  // gem
                    if (idx < 5) {
                        llSetLinkPrimitiveParamsFast(amuletprim, [ PRIM_GLOW, ALL_SIDES, (float)idx/5.0 ]);
                    }
                    llSleep(0.08);
                }
                llSetLinkPrimitiveParamsFast(gemprim, [ PRIM_GLOW, ALL_SIDES, 0.02 ]);
                for (idx = 0; idx<10; idx++) {
                    llSetLinkPrimitiveParamsFast(amuletprim, [ PRIM_GLOW, ALL_SIDES, 1.0-((float)idx/10.0) ]);
                    llSleep(0.02);
                }
                alicorn = 1;
            } else {
                llOwnerSay("goalicorn when already active");
            }
        } else if (msg == "capegotux") {
            state invisible;
        } else if (msg == "capearm1") {
            // no answer, but no error either
        } else if (msg == "capearm2") {
            // no answer, but no error either
        } else if (msg == "capearm3") {
            // no answer, but no error either
        } else if (msg == "capearm4") {
            // no answer, but no error either
        } else {
            llOwnerSay("Got bad message '" + msg + "' in state visible");
        }
    }
}

state fadeout
{
    on_rez(integer x)
    {
        llResetScript();
    }
    
    state_entry()
    {
        visibility=1.0;
        llSetTimerEvent(0.1);
    }
    
    timer()
    {
        visibility -= speed;
        if (visibility <= 0.0) {
            llSetTimerEvent(0.0);
            state invisible;
        }
        setVisibility(visibility);
    }
}

state invisible
{
    on_rez(integer x)
    {
        llResetScript();
    }
    
    state_entry()
    {
        setVisibility(0.0);
        llListen(channel, "", NULL_KEY, "");
    }

    listen(integer channel, string name, key id, string msg) 
    {
        if (msg == "capestarayt") {
            // no answer, but no error either, but, reset
            state visible;
        } else if (msg == "capeiceayt") {
            // no answer, but no error either, but, reset
            state visible;
        } else if (msg == "capetuxayt") {
            // no answer, but no error either, but, reset
            state visible;
        } else if (msg == "capegostars") {
            state fadein;
        } else if (msg == "capegoice") {
            // no answer, but no error either
        } else if (msg == "capegotux") {
            // no answer, but no error either
        } else if (msg == "capegoalicorn") {
            llOwnerSay("goalicorn in wrong mode, need star cape");
        } else if (msg == "capearm1") {
            // no answer, but no error either
        } else if (msg == "capearm2") {
            // no answer, but no error either
        } else if (msg == "capearm3") {
            // no answer, but no error either
        } else if (msg == "capearm4") {
            // no answer, but no error either
        } else {
            llOwnerSay("Got bad message '" + msg + "' in state invisible");
        }
    }
}

    
state fadein
{
    on_rez(integer x)
    {
        llResetScript();
    }
    
    state_entry()
    {
        visibility=0.0;
        llSetTimerEvent(0.1);
    }
    
    timer()
    {
        visibility += speed;
        if (visibility >= 1.0) {
            llSetTimerEvent(0.0);
            state visible;
        }
        setVisibility(visibility);
    }
}

