Mouse

Written by Kitsune
vector last_vel;
vector last_pos;
integer STAYING = 1;
integer FOLLOWING = 2;
integer mouse_state = FOLLOWING;
integer total = 0;

play_sound()
{
    integer num = llGetInventoryNumber(INVENTORY_SOUND);
    integer rand = (integer)(llFrand(num));
    llTriggerSound(llGetInventoryName(INVENTORY_SOUND, rand), 1.0);
}

default
{
    on_rez(integer p)
    {
        llSetStatus(STATUS_ROTATE_X | STATUS_ROTATE_Y, FALSE);
        llSetStatus(STATUS_DIE_AT_EDGE | STATUS_PHYSICS, TRUE);
        llSensorRepeat("", llGetOwner(), AGENT, 50.0, PI, 5.0);
        llListen(0, "", llGetOwner(), "");
        llSetTimerEvent(1.0);
    }
    
    listen(integer channel, string name, key id, string message)
    {
        if (message == "stay")
        {
            mouse_state = STAYING;
        }
        else if (message == "follow")
        {
            mouse_state = FOLLOWING;
        }
    }

    sensor(integer total_number)
    {
        llSetTimerEvent(1.0);
        last_vel = llDetectedVel(0);
        last_pos = llDetectedPos(0);
        vector direction = last_pos - llGetPos();
        float distance = llVecMag(direction);
        direction = llVecNorm(direction);
        float frot = llFrand(TWO_PI);
        rotation rot = llEuler2Rot(<0,0,frot>);
        llRotLookAt(rot, 0.1, 0.1);
        if (llVecMag(last_vel) < 0.25)
        {
            last_vel = direction;
        }
        else
        {
            last_vel = llVecNorm(last_vel);
            last_vel.z += 1.0;   
        }
        if (distance > 10.0)
        {
            direction += last_vel;
            direction.z += 3.0;
        }
        else if (distance > 2.0)
        {
            direction.z += 1.0;
            direction *= 0.75;
        }
        else
        {
            direction = <0,0,1>;
        }
        if (mouse_state == FOLLOWING)
            llApplyImpulse(direction*0.1, FALSE);
        else
            llApplyImpulse(<0,0,0.1>, FALSE);
    }
    
    timer()
    {
        if (total > 10)
        {
            while (llEdgeOfWorld(llGetPos(), last_vel))
            {
                last_vel = ;
            }
            float frot = llFrand(TWO_PI);
            rotation rot = llEuler2Rot(<0,0,frot>);
            llRotLookAt(rot, 0.1, 0.1);
            if (mouse_state == FOLLOWING)
                llApplyImpulse(last_vel*0.1, FALSE);
            else
                llApplyImpulse(<0,0,0.1>, FALSE);
            total = 0;
        }
        else
        {
            total += 1;
            if (llFrand(1.0) > 0.75)
            {
                play_sound();
            }
        }
    }
}