Script porta quiz per opensim

Parte 1: Script da infilare dentro la porta col quiz

// By Salahzar Stenvaag
// Licenza Creative Commons by, nc, sa (http://creativecommons.org/licenses/by-nc-sa/2.5/)
list lines;
list avatars=[];
list flags=[]; // per ogni avatar segno 1 se ha risposto esatto oppure -1 -2 se ha sbagliato n volte
integer MAXERRORS=-2; // massimo numero di volte

integer i=0;

string question;
list answers;
integer correct;

opendoor()
{
    llSay(0,"La porta si apre...");
    llSetPrimitiveParams([ PRIM_TYPE, PRIM_TYPE_CYLINDER, 0, <0.250000, 0.750000, 0.0>, 0.950000, ZERO_VECTOR, <1.0, 1.0, 0.0>, ZERO_VECTOR ]);
    llSetTimerEvent(10);
}
closedoor()

{
    llSay(0,"La porta si chiude...");
    llSetPrimitiveParams([PRIM_TYPE, PRIM_TYPE_CYLINDER, 0, <0.250000, 0.750000, 0.0>, 0.0, ZERO_VECTOR, <1.0, 1.0, 0.0>, ZERO_VECTOR, PRIM_SIZE, <5.165601, 3.618627, 0.010000>]);
}

default
{
    state_entry()
    {
        //llSay(0,llList2CSV(llGetPrimitiveParams([PRIM_TYPE])));
        llSetStatus(STATUS_PHANTOM,FALSE);
        closedoor();
        llSetText("Reading notecard...",<1,1,1>,1);
        lines=[];
        i=0;
        llGetNotecardLine(llGetInventoryName(INVENTORY_NOTECARD,0),i);

    }

    dataserver(key id, string data)
    {
        //llSay(0,"data: "+data);
        if(data==EOF) state ready;
        lines+=[data];
        i++;
        llGetNotecardLine(llGetInventoryName(INVENTORY_NOTECARD,0),i);

    }
}
state ready
{
    state_entry()
    {
        llSetText(".",<1,1,1>,1);
        question=llList2String(lines,0);
        integer c=1;
        for(c=1;c<llGetListLength(lines);c++)
        {
            string l=llList2String(lines,c);
            if(llGetSubString(l,0,0)=="*")
            {
                l=llGetSubString(l,1,-1);
                correct=c;
                //llSay(0,"corretta: "+(string)correct);

            }
            //llSay(0,"adding "+l+" to array ");
            answers+= [l];
        }

        llSetText(" " /* "Ready ("+(string)llGetListLength(answers)+")"*/ ,<1,1,1>,1);
        //llVolumeDetect(TRUE);
        llListen(-1,"",NULL_KEY,"");
        llSetStatus(STATUS_PHANTOM,FALSE);

    }
    listen(integer channel, string name, key id, string str)
    {
        integer av=llListFindList(avatars,[id]);
        if(av<0) return;

        integer position=llListFindList(answers,[str])+1;
        llSay(0,"position: "+(string)position+" correct: "+(string)correct);
        if(position==correct)
        {
            flags=llListReplaceList(flags,[1],av,av);
            llSay(0,name+" hai risposto correttamente");
            opendoor();
            return;
        }

        llSay((integer)("0x"+(string)id),(string)id+" -10");
        integer flag=(integer)llList2String(flags,av)-1;
        flags=llListReplaceList(flags,[  flag ],av,av);

        llSay(0,name+" penalità di 10 punti flag: "+(string)flag);

    }
    touch_start(integer count)
    {
        integer c;
        for(c=0;c<count;c++)
        {
            string name=llDetectedName(c);
            key av=llDetectedKey(c);

            integer found=0;
            if((found=llListFindList(avatars,[ av ]))<0)
            {
                // non c'era prima aggiungi
                avatars+= [ av ];
                flags+= [ 0 ];
                found=llGetListLength(avatars)-1;
            }
            integer flag=(integer)llList2String(flags,found);
            //llSay(0,(string)flag);
            if(flag<=MAXERRORS)
            {
                llSay(0,name+" non puoi più hai già fatto troppi tentativi");
                return;
            }
            if(flag>0)
            {
                opendoor();
                return;
            }
            llSay(0,"Domanda per "+name);
            llDialog(av,question,answers,-1);
        }

    }
    timer()
    {
        llSetTimerEvent(0);
        closedoor();
    }
}

Parte II: Script da mettere dentro il box trasparente da indossare in testa:

// questo deve essere indossato in testa
// risponde alle porte

integer channel;
integer points=100;
display()
{
    string prefix="";
    if(points<0)
    {
        prefix="Morto";

    }
    llSetText(prefix+" "+(string)points+"%",<1,1,1>,1);
    if(points<0)llTeleportAgentHome(llGetOwner());
}
default
{
    // dialog con le "porte"
    state_entry()
    {
        channel=(integer)("0x"+(string)llGetOwner());
        llListen(channel,"",NULL_KEY,"");
        llSay(0,"listening on "+(string)channel+ " av: "+(string)llGetOwner());
        display();
    }
    on_rez(integer rez)
    {
        llResetScript();
    }

    listen(integer channel, string name, key id, string str)
    {
        // To be sure we are really that avatar we need that
        // sender adds the key so if two avatars have the same key
        // they don't mess up
        list bits=llParseStringKeepNulls(str,[" "],[]);
        key k=(key)llList2String(bits,0);
        if(k!=llGetOwner()) return;

        // it's surely me!!!
        integer p=(integer)llList2String(bits,1);

        points+=p;

        display();
    }

}

Esempio di QUIZ:

Di che colore è il cavallo di Napoleone?
*Rosso
Verde
Giallo

I commenti sono chiusi.