[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);