[riah] ;who are the roommates? exten => s,1,set(__ROWS=6) ;the number of players exten => s,n,set(__TRIES=1) exten => s,n,set(__ROOMMATE1=Brad) exten => s,n,set(__ROOMMATE2=Brian) exten => s,n,set(__ROOMMATE3=James) exten => s,n,set(__ROOMMATE4=Jeff) exten => s,n,set(__ROOMMATE5=Marc) exten => s,n,set(__ROOMMATE6=Aubrey) exten => s,n,set(__PRIZES=2) ;how many winners we can have exten => s,n,set(__TRUNC=0) ;in the event of a tie, can i trim of the front of the sorted list? exten => s,n,set(__CROP=0) ;.... " .... can i trim of the back? exten => s,n,set(__COUNT=0) ;dont need to do this exten => s,n,set(__TOTALSCORE=0) ;or this exten => s,n,set(__EXITLOOP=0) ;this is probably ok ;;;;;;;;;;;;;;;;;;;;;;;;;;GET THE WEIGHT OF EACH PLAYER OR SET THEM ALL TO THE SAME;;;;;;;;;;;;;;;;;;;;;; exten => s,n,set(__COUNT=$[${TRUNC} + 1]) ;set roommate counter exten => s,n,while($[${COUNT} <= ${ROWS}]) ;while we havent assigned a weight... exten => s,n(reask),background(beep) ;prompt with a tone... exten => s,n,waitexten(5) ;and givem five seconds to enter an extension 0-9 exten => s,n(incr),set(__COUNT=$[${COUNT}+1]) ;then increment the counter exten => s,n,endwhile exten => s,n(dontask),noop() ;(break: dontask if we are on the last player) set the number of players ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CALIBRATE SCORES;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; exten => s,n(repeat),set(__COUNT=$[${TRUNC} + 1]) ;Start a counter ;**CALIBRATE ARRAY TO 100 AND INCREMENT**; exten => s,n,while($[${COUNT} <= ${ROWS}]) ;while we havent counted all the players exten => s,n,set(__MATEWEIGHT${COUNT}=${MATH(${MATEWEIGHT${COUNT}}*100,int)}) exten => s,n,set(__MATEWEIGHT${COUNT}=${MATH(${MATEWEIGHT${COUNT}}/${TOTALSCORE},int)}) exten => s,n,set(__COUNT=$[${COUNT} + 1]) ;**CALIBRATE ARRAY TO 100 & INCREMENT**; exten => s,n,endwhile ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;DRAW RANDOMLY & USE # OF TRIES TO PICK A WINNER;;;;;;;;;;;;;;;;;;;;;;;; exten => s,n,set(__COUNT=$[${TRUNC} + 1]) ;RESET COUNT ;**WHILE WE HAVENT CHECKED EVERYONE WELL START TO DRAW**; exten => s,n,while($[${COUNT} <= ${ROWS}]) exten => s,n(iloop),while($[${EXITLOOP} != 1]) ;start a boolean loop exten => s,n,random(${MATEWEIGHT${COUNT}}:s,finalscore) ;draw based on score till you win exten => s,n,set(__TRIES=$[${TRIES} + 1]) ;if failed draw again exten => s,n,goto(iloop) ;and end loop exten => s,n(finalscore),set(__MATEWEIGHT${COUNT}=${TRIES}) ;score based on tries exten => s,n,set(__EXITLOOP=1) ;exit the loop exten => s,n,endwhile exten => s,n,set(EXITLOOP=0) ;reset boolean var exten => s,n,set(__COUNT=$[${COUNT}+1]) ;increment parent count exten => s,n,set(__TRIES=1) ;reset tries exten => s,n,endwhile ;check next roomate ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;BUBBLE SORT THE ARRAY, "WINNERS" FIRST;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; exten => s,n,set(__COUNT=$[${TRUNC} + 1]) ;a counter exten => s,n,set(__SUBCOUNT=1) ;a subcounter exten => s,n,while($[${COUNT} < ${ROWS}]) ;checked every spot exten => s,n,while($[${SUBCOUNT} < $[${ROWS} - $[${COUNT} - 1]]]) ;as few times as possible ;**HANDY DANDY SORT MACRO**; exten => s,n,macroif($[${MATEWEIGHT${SUBCOUNT}} > ${MATEWEIGHT$[${SUBCOUNT} + 1]}]?sort|${MATEWEIGHT${SUBCOUNT}},${MATEWEIGHT$[${SUBCOUNT} + 1]},${ROOMMATE${SUBCOUNT}},${ROOMMATE$[${SUBCOUNT} + 1]},${SUBCOUNT},1) exten => s,n(incr2),set(__SUBCOUNT=$[${SUBCOUNT} + 1]) ;increment subroutine exten => s,n,endwhile exten => s,n,set(__COUNT=$[${COUNT} + 1]) ;increment parent loop exten => s,n,set(__SUBCOUNT=1) ;reset subroutine counter exten => s,n,endwhile exten => s,n,set(__COUNT=${PRIZES}) ;Set the counter to the last winning spot ;**DO WE ALREADY HAVE WINNERS? ELSE TRIM IF SOMEONE ISNT TIED FOR A SPOT OR SOMEONE IS DEFINATELY OUT**; exten => s,n,gotoif($[$[${MATEWEIGHT${COUNT}} != ${MATEWEIGHT$[${COUNT} + 1]}] | $[${PRIZES} >= ${ROWS}]]?winners,1:trunc,1) ;;;;;;;;;;;:;;;LEAVE THE COUNTER AND COUNT BACKWARDS TO SPIT OUT THE WINNERS WHEN WE WIN;;;;;;;;;;;;;;;;;; exten => winners,1,while($[${COUNT} > 0]) ;Count backwards exten => winners,n,noop(${ROOMMATE${COUNT}} is a winner) ;Spit out winner. Festival instead? exten => winners,n,set(__COUNT=$[${COUNT} -1]) ;Check the next winning spot exten => winners,n,endwhile exten => winners,n,hangup ;beautiful friend, the end ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GET WEIGHT AND CHECK TOTAL;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; exten => _X,1,set(__MATEWEIGHT${COUNT}=${EXTEN}) ;give each roommate a relative weight using the counter exten => _X,n,set(__TOTALSCORE=$[${TOTALSCORE} + ${MATEWEIGHT${COUNT}}]) ;increment totalscore exten => _X,n,gotoif($[${MATEWEIGHT${COUNT}} = 0]?zerocrop) ;to count 0's (no chance) exten => _X,n,goto(s,incr) ;else go to next roommate ;*IF WE GET A ZERO STICK IT AT THE BACK OF THE LIST AND INCREMENT CROP VAR SO WE DONT TEST 0% CHANCE*; ;*USE HANDY MACRO TO REARRANGE LIST STICKING PLAYERS WITH NO CHANCE AT THE BACK CROP THEM OFF ARRAY*; exten => _X,n(zerocrop),macro(sort|${MATEWEIGHT${COUNT}},${MATEWEIGHT${ROWS}},${ROOMMATE${COUNT}},${ROOMMATE${ROWS}},${COUNT},0) exten => _X,n,set(__CROP=$[${CROP} + 1]) exten => _X,n,set(__ROWS=$[${ROWS} - 1]) ;then keep track of places to crop exten => _X,n,noop(${ROOMMATE1} ${ROOMMATE2} ${ROOMMATE3} ${ROOMMATE4} ${ROOMMATE5} ${ROOMMATE6}) exten => _X,n,wait(3) exten => _X,n,gotoif($[${COUNT} > ${ROWS}]?s,dontask) ;the last guy is already in the right spot exten => _X,n,goto(s,reask) ;fill this spot with a # other than zero exten => trunc,1,while($[${COUNT} > 1]) ;Count for definate winners exten => trunc,n,gotoif($[${MATEWEIGHT${COUNT}} != ${MATEWEIGHT$[${COUNT} - 1]}]?posttrunc) ;check = next exten => trunc,n,set(__COUNT=$[${COUNT} - 1]) ;else keep looking for definites exten => trunc,n,endwhile exten => trunc,n(posttrunc),set(__TRUNC=$[${PRIZES} - ${COUNT}]) ;dont test actual winners again exten => trunc,n,set(__COUNT=${PRIZES}+1) ;start from spot we haven't checked exten => trunc,n,while($[${COUNT} <= ${ROWS}]) ;count up exten => trunc,n,gotoif($[${MATEWEIGHT${COUNT}} != ${MATEWEIGHT$[${COUNT} + 1]}]?postcrop) ;!=? we can crop exten => trunc,n,set(__COUNT=$[${COUNT} + 1]) ;if no count up and check again exten => trunc,n,endwhile exten => trunc,n(postcrop),set(__ROWS=$[${ROWS} - ${COUNT}]) ;if so less players for next round exten => trunc,n,goto(s,repeat) ;do it again ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;HANDY DANDY SORT MACRO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; [macro-sort] exten => s,1,set(__TEMP=${ARG2}) ;move exten => s,n,set(__MATEWEIGHT$[${ARG5} + ${ARG6}]=${ARG1}) ;the exten => s,n,set(__MATEWEIGHT${ARG5}=${TEMP}) ;scores exten => s,n,set(__TEMP=${ARG4}) ;move exten => s,n,set(__ROOMMATE$[${ARG5} + ${ARG6}]=${ARG3}) ;the exten => s,n,set(__ROOMMATE${ARG5}=${TEMP}) ;names ;(ARG6 will allow us to count backwards);