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