////////////////////////////////////////////////////////// // (C) Wizardry and Steamworks 2011, license: GPLv3 // // License at: http://www.gnu.org/licenses/gpl.html // ////////////////////////////////////////////////////////// list QT = [ "default:100", "c:20|a:80", "b:100", "c:100", "a:100", "b:100", "default:50|b:50", "a:100" ]; // A quicksort, providing a stable map between two sets of elements. list dualQuicksort(list a, list b) { if(llGetListLength(a) <= 1) return a+b; float pivot_a = llList2Float(a, llGetListLength(a)/2); string pivot_b = llList2String(b, llGetListLength(b)/2); a = llDeleteSubList(a, llGetListLength(a)/2, llGetListLength(a)/2); b = llDeleteSubList(b, llGetListLength(b)/2, llGetListLength(b)/2); list less = []; list less_b = []; list more = []; list more_b = []; integer i = 0; do { if(llList2Float(a, i) > pivot_a) { less += llList2List(a, i, i); less_b += llList2List(b, i, i); } else { more += llList2List(a, i, i); more_b += llList2List(b, i, i); } } while(++i= rnd) { if(llList2String(sName, 0) == "default") state default; if(llList2String(sName, 0) == "a") state a; if(llList2String(sName, 0) == "b") state b; if(llList2String(sName, 0) == "c") state c; } } while(--itra>=0); } } state a { state_entry() { llOwnerSay("state: a"); QT = llDeleteSubList(QT, 0, 0); list P = llParseString2List(llList2String(QT, 0), [":", "|"], []); list sName = llList2ListStrided(llDeleteSubList(P, 0, 0), 0, llGetListLength(P)-1, 2); list sChance = llList2ListStrided(P, 0, llGetListLength(P)-1, 2); list sQT = dualQuicksort(sName, sChance); sName = llList2ListStrided(llDeleteSubList(sQT, 0, 0), 0, llGetListLength(sQT)-1, 2); sChance = llList2ListStrided(sQT, 0, llGetListLength(sQT)-1, 2); float rnd = llFrand(100); float cum = 0; integer itra=llGetListLength(sName)-1; do { cum += llList2Float(sChance, itra); if(cum >= rnd) { if(llList2String(sName, 0) == "default") state default; if(llList2String(sName, 0) == "a") state a; if(llList2String(sName, 0) == "b") state b; if(llList2String(sName, 0) == "c") state c; } } while(--itra>=0); } } state b { state_entry() { llOwnerSay("state: b"); QT = llDeleteSubList(QT, 0, 0); list P = llParseString2List(llList2String(QT, 0), [":", "|"], []); list sName = llList2ListStrided(llDeleteSubList(P, 0, 0), 0, llGetListLength(P)-1, 2); list sChance = llList2ListStrided(P, 0, llGetListLength(P)-1, 2); list sQT = dualQuicksort(sName, sChance); sName = llList2ListStrided(llDeleteSubList(sQT, 0, 0), 0, llGetListLength(sQT)-1, 2); sChance = llList2ListStrided(sQT, 0, llGetListLength(sQT)-1, 2); float rnd = llFrand(100); float cum = 0; integer itra=llGetListLength(sName)-1; do { cum += llList2Float(sChance, itra); if(cum >= rnd) { if(llList2String(sName, 0) == "default") state default; if(llList2String(sName, 0) == "a") state a; if(llList2String(sName, 0) == "b") state b; if(llList2String(sName, 0) == "c") state c; } } while(--itra>=0); } } state c { state_entry() { llOwnerSay("state: c"); QT = llDeleteSubList(QT, 0, 0); list P = llParseString2List(llList2String(QT, 0), [":", "|"], []); list sName = llList2ListStrided(llDeleteSubList(P, 0, 0), 0, llGetListLength(P)-1, 2); list sChance = llList2ListStrided(P, 0, llGetListLength(P)-1, 2); list sQT = dualQuicksort(sName, sChance); sName = llList2ListStrided(llDeleteSubList(sQT, 0, 0), 0, llGetListLength(sQT)-1, 2); sChance = llList2ListStrided(sQT, 0, llGetListLength(sQT)-1, 2); float rnd = llFrand(100); float cum = 0; integer itra=llGetListLength(sName)-1; do { cum += llList2Float(sChance, itra); if(cum >= rnd) { if(llList2String(sName, 0) == "default") state default; if(llList2String(sName, 0) == "a") state a; if(llList2String(sName, 0) == "b") state b; if(llList2String(sName, 0) == "c") state c; } } while(--itra>=0); } }