Higher/lower channel game

By Qc on Dec 30, 2006

Purpose: provide channels with the classic game to guess a number.

Usage:

  • Start game:
    !start [min-max] [maxplayers] [secs to join] [secs to guess]
    min-max is the numerical range to guess
    maxplayers limits the amount of people that can join
    secs to join is the time people have to join the game
    secs to guess is the time people have to guess, if they fail to guess in that time, they lose their turn.

(all parameters optional)

  • Join game:
    !join
  • Do a guess:
    !guess
  • Stop game:
    !stop
; Higher/lower game by CQ 20060731
on *:TEXT:!guess &:#: { hl_guess $2 }
on *:TEXT:!join:#:{ hl_join }
on *:TEXT:!hl *:#:{ msg $chan $hl_com }
on *:TEXT:!start *:#:{ hl_init $2- }
on *:TEXT:!stop:#:{ hl_stop $network $chan }
on *:INPUT:#:{
  if ($1 == !guess) && ($2) { msg $chan $1- | hl_guess $2 | halt }
  elseif ($1 == !join) { msg $chan $1- | hl_join | halt }
  elseif ($1 == !hl) { msg $chan $1 | msg $chan Use $hl_com | halt }
  elseif ($1 == !start) { msg $chan $1- | hl_init $2- | halt }
  elseif ($1 == !stop) { msg $chan $1- | hl_stop $network $chan | halt }
}
alias hl_init {
  var %range = $1, %players = $2, %secs = $3, %timeout = $4
  if (%range == $null) { var %range = $+(1,-,$calc(100 * $rand(1,100))) }
  else { if ($hl_checkrange(%range) == FAIL) { goto refuse } | var %range = $v1 }
  if (%players !isnum 2-) || ($int(%players) != %players) { var %players = 1, %secs = 0, %timeout = 0 }
  else {
    if (%timeout !isnum 5-60) || ($int(%timeout) != %timeout) { var %timeout = 20 }
    if (%secs !isnum 1-60) || ($int(%secs) != %secs) { var %secs = $calc(%players * 5) }
  }
  tokenize 45 %range
  if ($calc($2 - $1) < 2) {
    describe $chan turns out a leg of $nick($chan,$rand(1,$nick($chan,0))) and slaps $nick $+ 's skull inwards with it. Range %range - is -that- guessing??
    return
  }
  goto ok
  :refuse | msg $chan Please use correct format, $nick $+ : $hl_com | return
  :ok
  var %h = $+(hl_,$network,$chr(44),$chan) | if ($hget(%h)) { hfree %h | .timer $+ $+(hl_*,$chr(44),$network,$chr(44),$chan) OFF }
  hmake %h 30 | hadd %h maxplayers %players | hadd %h range %range | tokenize 45 %range | hadd %h num $rand($1,$2) | hadd %h timeout %timeout
  hadd %h player1, $+ $hl_site $nick
  if (%players > 1) { 
    var %tn = $+(hl_join,$chr(44),$network,$chr(44),$chan) | .timer $+ %tn 1 %secs hl_jointimeout $network $chan
    msg $chan $nick started higher/lower game %range $+ . Max %players players. %secs secs time to sign in with !join. | return
  }
  msg $chan Game started. | hl_next $network $chan
}
alias hl_jointimeout { var %h = $+(hl_,$1,$chr(44),$2) | if ($me ison $2) { hl_start $1 $2 Time to join has passed. Players: } | else { hadd %h start 1 } }
alias hl_join {
  var %h = $+(hl_,$network,$chr(44),$chan) | if (!$hget(%h)) { msg $chan No game started yet! Use $hl_com | return }
  var %site = $hl_site
  if ($hget(%h,next)) {
    var %com = msg $chan Guessing already started, $nick $+ .
    if ($hfind(%h,$+(player*,$chr(44),%site),1,w)) {
      if ($hfind(%h,$+(player,$hget(%h,next),$chr(44),%site),1,w)) { %com It's your turn, please use !guess <number>. }
      elseif ($hfind(%h,$+(player,$hget(%h,next),$chr(44),*),1,w)) { %com It's now $hget(%h,$v1) $+ 's turn. }
      return
    } 
    %com You're too late to join. | return
  }
  if ($hfind(%h,$+(player*,$chr(44),%site),1,w)) { msg $chan You're already in the playerlist, $nick $+ ! | return }
  var %i = 1, %max = 0 | while ($hfind(%h,$+(player*,$chr(44),*),%i,w)) { tokenize 44 $v1 | if ($remove($1,player) > %max) { var %max = $v1 } | inc %i }
  inc %max | hadd %h $+(player,%max,$chr(44),%site) $nick | inc %total
  if (%total < $hget(%h,maxplayers)) { msg $chan Thanks $nick $+ ! %total player(s) signed up so far. | return }
  .timer $+ $+(hl_join,$chr(44),$network,$chr(44),$chan) OFF | msg $chan Red lantern is $nick $+ ! | hl_start $network $chan Players:
}
alias hl_start {
  var %net = $1, %chan = $2, %h = $+(hl_,$1,$chr(44),$2), %i = 1, %chunk = $3-, %i = 1
  while ($hfind(%h,$+(player*,$chr(44),*),%i,w)) {
    var %new = %chunk $hget(%h,$v1) | if ($len(%new) > 400) { msg %chan %chunk | var %chunk } | else { var %chunk = %new }
    inc %i
  }
  if (%chunk != $null) { msg %chan %chunk }
  if ($hfind(%h,$+(player*,$chr(44),*),0,w) > 1) { msg %chan Time available for a guess: $hget(%h,timeout) secs. }
  hl_next %net %chan
}
alias hl_stop { var %h = $+(hl_,$1,$chr(44),$2) | if ($hget(%h)) { hfree %h | .timer $+ $+(hl_*,$chr(44),$1,$chr(44),$2) OFF } }
alias hl_next {
  var %net = $1, %chan = $2, %h = $+(hl_,$1,$chr(44),$2), %i = 1, %w = @hl_temp, %l | window -sh %w
  while ($hfind(%h,$+(player*,$chr(44),*),%i,w)) {
    var %hi = $v1, %nick = $hget(%h,%hi) | if (%nick !ison %chan) { inc %i | continue }
    tokenize 44 %hi | var %nr = $base($remove($1,player),10,10,10) | aline %w %nr %hi | inc %i
  }
  var %l
  if ($hget(%h,next) != $null) {
    var %total = $line(%w,0), %i = 1, %l | while (%i <= %total) { tokenize 32 $line(%w,%i) | if ($1 > $hget(%h,next)) { var %l = %i | break } | inc %i }
  }
  if (!%l) { var %l = 1 } | tokenize 32 $line(%w,%l) | window -c %w | var %hi = $2
  tokenize 44 %hi | hadd %h next $remove($1,player) | tokenize 45 $hget(%h,range)
  if ($1 != $2) { msg %chan $hget(%h,%hi) $+ , number within $hget(%h,range) $+ . }
  else { msg %chan $hget(%h,%hi) $+ , type !guess $1 $+ . }
  if ($hfind(%h,$+(player*,$chr(44),*),0,w) > 1) { .timer $+ $+(hl_wait,$chr(44),%net,$chr(44),%chan) 1 $hget(%h,timeout) hl_guesstimeout %net %chan }
}
alias hl_guesstimeout {
  var %h = $+(hl_,$1,$chr(44),$2) | if ($me !ison $2) { return }
  var %hi = $hfind(%h,$+(player,$hget(%h,next),$chr(44),*),1,w) | msg $2 Time is up, $hget(%h,%hi) $+ . 
  hinc %h timeouts | if ($hget(%h,timeouts) > 20) { msg $2 Too lazy to stop me eh? I'll do it myself! | hl_stop $1 $2 } | else { hl_next $1 $2 }
}
alias hl_guess {
  var %h = $+(hl_,$network,$chr(44),$chan) | if (!$hget(%h)) { msg $chan No game started yet! Use $hl_com | return }
  var %site = $hl_site, %tn = $+(hl_join,$chr(44),$network,$chr(44),$chan)
  if ($timer(%tn)) {
    if (!$hfind(%h,$+(player*,$chr(44),%site),1,w)) { msg $chan Hey you gotta 1) !join 2) !guess. You have $timer(%tn).secs secs left for step 1) }
    else { msg $chan Please wait, $nick $+ , $timer(%tn).secs secs left before starting. Grab a gun to convince people! }
    return
  }
  var %higuess = $hfind(%h,$+(player*,$chr(44),%site),1,w), %hiturn = $hfind(%h,$+(player,$hget(%h,next),$chr(44),*),1,w)
  if (%higuess != %hiturn) { msg $chan Hey $nick $+ , it's $hget(%h,%hiturn) $+ 's turn not yours! | return }
  var %guess = $1 | hinc %h guesscount | hdec %h timeouts | tokenize 45 $hget(%h,range)
  if (%guess !isnum $hget(%h,range)) { 
    if ($1 != $2) { msg $chan Hey $nick $+ , the range is now $hget(%h,range) $+ . You wasted this turn! } | else { describe $chan sighs. }
    goto next
  }
  if (%guess > $hget(%h,num)) { msg $chan LOWER, $nick $+ . | dec %guess | hadd %h range $+($1,-,%guess)  | goto next }
  if (%guess < $hget(%h,num)) { msg $chan HIGHER, $nick $+ . | inc %guess | hadd %h range $+(%guess,-,$2) | goto next }
  msg $chan 04CORRECT $nick $+ ! The number was %guess $+ . Needed $hget(%h,guesscount) guesses. $hl_com | hl_stop $network $chan | return
  :next | hl_next $network $chan
}

alias hl_checkrange {
  if ($left($1,1) !isnum) || ($numtok($1,45) > 2) { return FAIL }
  var %n1 = $gettok($1,1,45), %n2 = $gettok($1,2,45)
  if (%n1 < 0) { return FAIL }
  if (%n2 == $null) { var %n2 = %n1 }
  if (%n1 !isnum) || (%n2 !isnum) || ($int(%n1) != %n1) || ($int(%n2) != %n2) { return FAIL }
  if (%n2 < %n1) { var %t = %n1, %n1 = %n2, %n2 = %t }
  return $+(%n1,-,%n2)
}
alias hl_site { if ($nick != $me) { return $site } | else { return $gettok($address($me,2),2,64) } }
alias hl_com { return !start [min-max] [maxplayers] [secs to join] [secs to guess] }
alias hl_netcid {
  var %total = $scon(0), %i = 1
  while (%i <= %total) { if ($scon(%i).network) == $1) && ($scon(%i).status == connected) { return $scon(%i) } | inc %i }
  return NOTCON 
}
on *:JOIN:#: { 
  var %h = $+(hl_,$network,$chr(44),$chan) | if (!$hget(%h)) { return }
  if ($nick == $me) { if (!$chan($chan).inwho) { who $chan | hadd %h inwho 1 } }
  if ($hfind(%h,$+(player*,$chr(44),$site),1,w) == $null) { return }
  var %hi = $v1 | if ($hget(%h,%hi) != $nick) { hadd %h %hi $nick }
  var %hi = $hfind(%h,$+(player,$hget(%h,next),$chr(44),*),1,w)), %nick = $hget(%h,%hi)
  if (%nick == $nick) { msg $chan Welcome back $nick $+ , it's your turn, number within $hget(%h,range) $+ . }
  else { msg $chan Welcome back $nick $+ , it's now %nick $+ 's turn. }
}
RAW 352:*:{ var %h = $+(hl_,$network,$chr(44),$2) | if ($hget(%h,inwho)) { haltdef } }
RAW 315:*:{ 
  var %h = $+(hl_,$network,$chr(44),$2) | if (!$hget(%h,inwho)) || ($me !ison $2) { return } 
  haltdef | hdel %h inwho | if ($hget(%h,start)) { hl_start $network $2 | hdel %h %hi start | return }
  var %hi = $hfind(%h,$+(player,$hget(%h,next),$chr(44),*),1,w)) | if (%hi == $null) { return }
  if ($hget(%h,%hi) != $me) {

    var %tn = $+(hl_wait,$chr(44),$network,$chr(44),$2) | if (!$timer(%tn)) { hl_next $network $2 }
  }
}
on *:NICK: {
  var %i = 1
  while ($comchan($newnick,%i)) {
    var %chan = $v1, %h = $+(hl_,$network,$chr(44),%chan) | if (!$hget(%h)) { inc %i | continue }
    if ($hfind(%h,$+(player*,$chr(44),$site),1,w) == $null) { inc %i | continue }
    var %hi = $v1 | if ($hget(%h,%hi) != $newnick) { hadd %h %hi $newnick }
    inc %i
  }
}
on *:QUIT: {
  var %i = 1
  while ($comchan($nick,%i)) {
    var %chan = $v1, %h = $+(hl_,$network,$chr(44),%chan) | if (!$hget(%h)) { inc %i | continue }
    if ($hfind(%h,$+(player,$hget(%h,next),$chr(44),$site),1,w) != $null) { hl_next $network %chan }
    inc %i
  }
}

Comments

Sign in to comment.
dma   -  Nov 12, 2015

good game I had to learn from my mistakes ..thanks for the game

 Respond  
Are you sure you want to unfollow this person?
Are you sure you want to delete this?
Click "Unsubscribe" to stop receiving notices pertaining to this post.
Click "Subscribe" to resume notices pertaining to this post.