1-4 Script Resizer

Written by Kitsune
key kOwner;
integer iLinkAmount;
integer iScriptAmount=1;
integer iScriptID=1;
integer iTemp;
integer iTemp2;
integer iListener;
integer iCurrentSize=100;
integer iFlags; // 1 - setup done, 2 - setting up, 4 - resizing, 8 - listening, 16 - added
string sScript;
list lTemp;
list lButtons=["Delete","Reset","Size","Custom","+25","-25","+10","-10","+5","-5","+1","-1"];
vector vTemp;
setFlag(integer flag)
{
    if(!(iFlags & flag))
       iFlags+=flag; 
}
unsetFlag(integer flag)
{
    if(iFlags & flag)
       iFlags-=flag; 
}
doResize(integer percentage)
{
    setFlag(4);
    if(iScriptID==1)
        llMessageLinked(LINK_THIS,12121,(string)percentage,NULL_KEY);
    vTemp=llGetPos();
    ;
    if(!(iTemp2=((iTemp=(llCeil((float)iLinkAmount / (float)iScriptAmount))*iScriptID)) - llCeil((float)iLinkAmount / (float)iScriptAmount)))
        iTemp2=1;
    if(percentage != 0)
    {
        iCurrentSize=percentage+iCurrentSize;
        if(iScriptID==1)
            llOwnerSay("Resizing to: "+(string)iCurrentSize+"% ("+(string)percentage+"%)");
    }
    else
    {
        iCurrentSize=100;
        if(iScriptID==1)
            llOwnerSay("Resetting size.");
    }    
    do
    {
        llSetLinkPrimitiveParams(iTemp,[PRIM_POSITION,(((vector)llList2String(lTemp=llParseString2List(llList2String(llGetObjectDetails(llGetLinkKey(iTemp),[OBJECT_DESC]),0),["#"],[""]),1))/100)*iCurrentSize,PRIM_SIZE,((((vector)llList2String(lTemp,0))/100)*iCurrentSize)]);
    }
    while((iTemp=~-iTemp) != iTemp2);
    if(iTemp2==1)
    {
        llSetScale((((vector)llList2String(llParseString2List(llList2String(llGetObjectDetails(llGetLinkKey(iTemp),[OBJECT_DESC]),0),["#"],[""]),0))/100)*iCurrentSize);
        if(!percentage)
            llOwnerSay("Resize operation finished. Object resized to original scale.");
        else
            llOwnerSay("Resize operation finished. Object resized to "+(string)(iCurrentSize)+"%");
    }
    unsetFlag(4);
}
default
{
    state_entry()
    {
        if((iLinkAmount=llGetObjectPrimCount(llGetKey())) > 1)
        {
            if(llGetLinkNumber() > 1)
            {
                llSetObjectDesc((string)llGetScale()+"#"+(string)llGetLocalPos());
                llMessageLinked(LINK_ROOT,45454,"",NULL_KEY);
                llRemoveInventory(llGetScriptName());
            }
            else
            {
                llMessageLinked(LINK_THIS,34343,"",NULL_KEY);
                llOwnerSay("Please wait...");
                llSetTimerEvent(2);
                kOwner=llGetOwner();
                sScript=llGetScriptName();
            }
        }
    }
    on_rez(integer foo)
    {
        if(kOwner!=llGetOwner())
            kOwner=llGetOwner();
    }
    changed(integer change)
    {
        if(change & CHANGED_OWNER)
            kOwner=llGetOwner();
        else if(change & CHANGED_LINK)
        {
            if(iScriptID!=1)
                llRemoveInventory(sScript);
            else if(iFlags)
            {
                llOwnerSay("Changed link configuration. Resetting myself.");
                llResetScript();
            }
        }
    }
    touch_start(integer foo)
    {
        if(iScriptID==1)
        {
            if(iFlags & 8)
            {
                llSetTimerEvent(0);
                llListenRemove(iListener);
                unsetFlag(8);
            }
            if(iFlags & 1)
            {
                setFlag(8);
                iListener=llListen(iTemp=llFloor(llFrand(2137483647)+10000000),"",kOwner,"");
                llDialog(kOwner,"Choose:",lButtons,iTemp);
                llSetTimerEvent(10);
            }
        }
    }
    link_message(integer sender, integer num, string str,key id)
    {
        if(num==34343 && iFlags)
        {
            ++iScriptAmount;
            llMessageLinked(LINK_THIS,23232,"",NULL_KEY);
        }
        if(num==12121 && !(iFlags & 4) && iScriptID!=1)
            doResize((integer)str);
        else if(num == 23232 && !(iFlags & 16))
        {
            if((iScriptID=-~iScriptID) >4)
            {
                llOwnerSay("There are already 4 resize scripts in the object. Deleting myself.");
                llMessageLinked(LINK_THIS,78787,"",NULL_KEY);
                llRemoveInventory(sScript);
            }
            else
                llSetTimerEvent(2);
        }
        else if((num==45454) && (iScriptID == 1))
        {
            if(iFlags & 2)
                if((iTemp=-~iTemp)==(iLinkAmount-1))
                {
                    setFlag(1);
                    llOwnerSay("The resizer is set up and ready to use. The current object will take approximately "+(string)(iLinkAmount*0.2)+" seconds to resize.");
                    llOwnerSay("Add more copies of this script to the object to speed up the operation. Touch the object to get a menu.");
                }
        }
        else if(num==67676)
            llRemoveInventory(sScript);
        else if(num==78787)
            iScriptAmount=~-iScriptAmount;
    }
    listen(integer channel,string name, key id, string message)
    {
        if(iFlags & 8)
        {
            if(iTemp==1)
            {
                llSetTimerEvent(0);
                llListenRemove(iListener);
                doResize((integer)message);
            }
            else if((iTemp=llListFindList(lButtons,[message])) != -1)
            {
                llSetTimerEvent(0);
                llListenRemove(iListener);
                if(!iTemp)
                {
                    llOwnerSay("Deleting resizer.");
                    llMessageLinked(LINK_THIS,67676,"",NULL_KEY);
                    llRemoveInventory(sScript);
                }
                else if(iTemp==1)
                    doResize(0);
                else if(iTemp==2)
                    llOwnerSay("Current size is: "+(string)iCurrentSize+"%");
                else if(iTemp==3)
                {
                    llOwnerSay("Say your custom size offset in percent on channel 1.");
                    iListener=llListen(iTemp=1,"",kOwner,"");
                }
                else
                    doResize((integer)message);
            }
        }
    }
    timer()
    {
        llSetTimerEvent(0);
        if(!iFlags)
        {

            if(iScriptID == 1)
            {
                setFlag(2);
                setFlag(16);
                llOwnerSay("Spreading temporary scripts in object's prims. Please wait til the process finishes...");
                iTemp=iLinkAmount;
                do
                    llGiveInventory(llGetLinkKey(iTemp),sScript);
                while(iTemp=~-iTemp);
                llSetObjectDesc((string)llGetScale()+"#"+(string)llGetLocalPos());
                llOwnerSay("Scripts spread. Please take this object into inventory, rez or wear it again, and select 'tools -> set all scripts to running in selection'");
            }
            else
            {
                setFlag(16);
                llOwnerSay((string)(iScriptAmount=iScriptID)+" resize scripts inserted. It will take approximately "+(string)((iLinkAmount * 0.2) / iScriptID)+" seconds to resize the object now.");
            }
        }
        else
        {
            llListenRemove(iListener);
            setFlag(1);
            llOwnerSay("Menu timed out.");
        }
    }
}