// Trixie's ice cape. Fades in and out, fading in, it also does
// a transitional sparkle effect. Hopefully.

integer channel = -7;
float speed = 0.025;
// sparkle particles
key image = "bdd55733-13dd-df5b-9128-90c3b13f6570";
// link id of the particle sphere (no longer really needed, but that's okay)
integer sphere=2;
// delay between sleeves
float sleevedelay=0.7;

float visibility;

setVisibility(float vis)
{
    integer idx;
    integer max=llGetNumberOfPrims();
    for (idx=1; idx<=max; idx++) {
        llSetLinkAlpha(idx, vis, ALL_SIDES);
    }        
}

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

state visible
{
    on_rez(integer x)
    {
        llResetScript();
    }
    
    state_entry()
    {
        setVisibility(1.0);
        llLinkParticleSystem(sphere,[]);
        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 invisible;
        } else if (msg == "capeiceayt") {
            llWhisper(-10, "capeiceok");
            state invisible;
        } else if (msg == "capetuxayt") {
            // no answer, but no error either, but reset
            state invisible;
        } else if (msg == "capegoice") {
            llOwnerSay("Got 'capegoice' in state visible");
        } else if (msg == "capegostars") {
            state fadeout;
        } else if (msg == "capegotux") {
            state fadeout;
        } 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);
        llLinkParticleSystem(sphere,[]);
        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") {
            llWhisper(-10, "capeiceok");
        } else if (msg == "capetuxayt") {
            // no answer, but no error either
        } else if (msg == "capegostars") {
            // no answer, but no error either
        } else if (msg == "capegoice") {
            state fadein;
        } else if (msg == "capegotux") {
            // no answer, but no error either
        } 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 sleeves
{
    on_rez(integer x)
    {
        llResetScript();
    }
    
    state_entry()
    {
        // very simple state - command each sleeve to appear with a delay
        // TODO: we need to apply the animation poses for each one too
        setVisibility(1.0);
        // start the first sleeve right away for apparent overlap
        llWhisper(channel, "capearm1");
        llLinkParticleSystem(sphere,[]);
        llSleep(sleevedelay);
        llWhisper(channel, "capearm2");
        llSleep(sleevedelay);
        llWhisper(channel, "capearm3");
        llSleep(sleevedelay);
        llWhisper(channel, "capearm4");
        state visible;
    }
}    
    
state fadein
{
    on_rez(integer x)
    {
        llResetScript();
    }
    
    state_entry()
    {
        visibility=0.0;
        llSetTimerEvent(0.1);

        llLinkParticleSystem(sphere, [
            PSYS_PART_FLAGS,    PSYS_PART_EMISSIVE_MASK |
                                PSYS_PART_INTERP_COLOR_MASK |
                                PSYS_PART_INTERP_SCALE_MASK,
            PSYS_SRC_PATTERN,   PSYS_SRC_PATTERN_ANGLE_CONE,
            PSYS_SRC_ANGLE_BEGIN,   0.0,
            PSYS_SRC_ANGLE_END,     1.0,
            PSYS_PART_START_COLOR,  <1.0, 1.0, 1.0>,
            PSYS_PART_END_COLOR,    <1.0, 1.0, 1.0>,
            PSYS_SRC_BURST_PART_COUNT, 20,
            PSYS_SRC_BURST_RATE,    0.02,
            PSYS_SRC_BURST_RADIUS,  0.27,
            PSYS_SRC_BURST_SPEED_MIN, 0.3,
            PSYS_SRC_BURST_SPEED_MAX, 1.5,
            PSYS_PART_START_SCALE,  <0.3, 0.3, 0.3>,
            PSYS_PART_END_SCALE,    <0.1, 0.1, 0.1>,
            PSYS_PART_START_ALPHA,  1.0,
            PSYS_PART_END_ALPHA,    0.5,
            PSYS_PART_MAX_AGE,      0.5,
            PSYS_SRC_TEXTURE,       image,
            PSYS_SRC_ACCEL,         <0.0, 0.0, -1.5>,
            
            PSYS_PART_BLEND_FUNC_DEST, PSYS_PART_BF_ONE
        ]);                                
    }
    
    timer()
    {
        visibility += speed;
        if (visibility >= 1.0) {
            llSetTimerEvent(0.0);
            state sleeves;
        }

        setVisibility(visibility);
    }
}

