// FIXME/TODO: some variables should be scoped, and some other variables // combined in an array, with a very specific name, to avoid // collisions. The script as a whole should be optimized to // take advangage of magic-v3 function|script|MultiQuiz { if((getarraysize(@quiz_answers$[0]) != getarraysize(@quiz_questions$[0])) || (@quiz_answers$[0] == "") || (@quiz_questions$[0] == "")) goto L_ArrayError; set @setindex, 1; set @index, rand(0,(getarraysize(@quiz_answers$[0]) - 1)); set @question$, @quiz_questions$[@index]; mes "\""+ @question$ + "\""; next; mes "Pick the correct answer."; callfunc "Quiz"; return; L_ArrayError: if(@quiz_answers$[0] == "") debugmes "@quiz_answers$ is empty"; if(@quiz_questions$[0] == "") debugmes "@quiz_questions$ is empty"; if(getarraysize(@quiz_answers$[0]) != getarraysize(@quiz_questions$[0])) debugmes "Size of @quiz_answers$ is not equal to size of @quiz_questions$"; close; } function|script|Quiz { if((@choices_nr < 1) || (@choices_nr > 8)) set @choices_nr, 3; if(@choices_nr > getarraysize(@quiz_answers$[0])) set @choices_nr, getarraysize(@quiz_answers$[0]); if(@quiz_answers$[0] == "") goto L_ArrayError; set @success, 0; if(@setindex < 1) set @index, @answer; set @good, rand(0,(@choices_nr - 1)); cleararray @choices$, "", getarraysize(@choices$[0]); set @loop, 0; goto L_Shuffle; L_Shuffle: set @nindex, rand(0,(getarraysize(@quiz_answers$[0]) - 1)); if(@nindex == @index) goto L_Shuffle; // do not get the good definition set @loop2, 0; goto L_Search; L_Search: if(@choices$[@loop2] == @quiz_answers$[@nindex]) goto L_Shuffle; // array is already populated with this choice if(@loop2 >= (@choices_nr - 1)) goto L_Shuffle2; set @loop2, @loop2 + 1; goto L_Search; L_Shuffle2: set @choices$[@loop], @quiz_answers$[@nindex]; if(@loop >= (@choices_nr - 1)) goto L_Answer; set @loop, @loop + 1; goto L_Shuffle; L_Answer: set @choices$[@good], @quiz_answers$[@index]; // set the good definition menu @choices$[0], L_Enter, @choices$[1], L_Enter, @choices$[2], L_Enter, @choices$[3], L_Enter, @choices$[4], L_Enter, @choices$[5], L_Enter, @choices$[6], L_Enter, @choices$[7], L_Enter; L_Enter: if(@menu != (@good + 1)) goto L_Shift; set @success, 1; goto L_Shift; L_Shift: if(@shift < @index) set @shift, @index; if(@shift == @index) set @quiz_answers$[@index], ""; // do not allow twice the same question if((@quiz_questions$[0] != "") && (@shift == @index)) set @quiz_questions$[@index], ""; if((@quiz_questions$[0] != "") && (@quiz_questions$[(@shift + 1)] != "")) set @quiz_questions$[@shift], @quiz_questions$[(@shift + 1)]; if((@quiz_questions$[0] != "") && (@quiz_questions$[(@shift + 1)] != "")) set @quiz_questions$[(@shift + 1)], ""; if(@quiz_answers$[(@shift + 1)] != "") set @quiz_answers$[@shift], @quiz_answers$[(@shift + 1)]; if(@quiz_answers$[(@shift + 1)] != "") set @quiz_answers$[(@shift + 1)], ""; set @shift, @shift + 1; if(@quiz_answers$[(@shift + 1)] != "") goto L_Shift; set @shift, 0; goto L_Close; L_Close: set @answer, 0; return; L_ArrayError: if(@quiz_answers$[0] == "") debugmes "@quiz_answers$ is empty"; mapexit; }