on *:text:*:#:{
  var %t = $left($1,1),%1 = $right($1,-1)
  if (%t !isalnum) {
    if (%1 == register) {
      var %c = $adduser($nick,$2)
      if ($gettok(%c,3,32) == now) {
        login $nick
        _msg $nick You're now registered, your password is $u.pass($nick) 
      }
      else _msg $nick %c
    }
    if (%1 == stats) _stats $nick $2-
    if (%1 == gstats) _gstats $nick $2-
    if (%1 == drop) && ($hget($nick)) _msg $nick $deluser($nick) 
    if (%1 == punch) punch $nick $$2
    if (%1 == kick) kick $nick $$2
    if (%1 == shoot) $+($u.cgun($nick)) $nick $2
    ; if (%1 == fighting) _msg $nick In combat: $iif(%fighting,$v1,N/A)
    /*
    if ($istok(enter fight combat play,%1,32)) {
      if ($hget($nick)) {
        if (!$istok(%fighting,$nick,32)) {
          set %fighting $addtok(%fighting,$nick,32)
          .signal -n 110 $nick
          .amsg * $_nick($nick) enters combat!
        }
        else _msg $nick You're already in combat
      }
    }
    if ($istok(leave exit done run,%1,32)) {
      if ($hget($nick)) {
        if ($istok(%fighting,$nick,32)) {
          .amsg * $_nick($nick) attempts to leave combat..
          .signal -n 112 $nick
          $+(.timer,tleave,.,$nick) 1 $r(3,10) tleave $nick
        }
        else _msg $nick You're not in combat
      }
    }
    */
  }
}
on *:text:*:?:{
  close -m $nick
  var %t = $left($1,1),%1 = $right($1,-1)
  if (%t !isalnum) {
    if (%1 == register) {
      var %c = $adduser($nick,$2)
      if ($gettok(%c,3,32) == now) {
        login $nick $readini(Users.ini,$nick,pass)
        _msg $nick You're now registered; your password is $+(,$u.pass($nick),) $+ . To change your password type $+(,%t,set pass <password>)
      }
      else _msg $nick %c
    }
    if (%1 == stats) _stats $nick $2-
    if (%1 == gstats) _gstats $nick $2-
    if (%1 == set) {
      if ($left($2,4) == pass) && ($2 isin password) { 
        if ($hget($nick)) {
          hadd $nick pass $$3
          _msg $nick Changed password to $+(,$3,) $+ .
        }
      }
      elseif ($2 == output) {
        if ($hget($nick)) {
          hadd $nick output $iif($3 == notice,notice,msg)
          _msg $nick Changed output to $+(,$u.out($nick),) $+ .
        }
      }
      else _msg $nick Error, invalid setting.     
    }
    if (%1 == drop) && ($hget($nick)) _msg $nick $deluser($nick) 
    if (%1 == logout) _msg $nick $logout($nick)
    if (%1 == login) _msg $nick $login($nick,$2)
  }
}
alias _stats {
  var %2 = $iif($2 == -a,$3,$2)
  var %n = $iif($hget(%2),%2,$1)
  if ($hget(%n)) {
    _msg $1 Name: $u.name(%n) Level: $u.level(%n) HP: $+($u.hp(%n),/,$u.fhp(%n)) Strength: $u.str(%n) Toughness: $u.tuff(%n) EXP: $+($u.exp(%n),/,$u.nexp(%n))
    if ($2 == -a) _msg $1 $iif($u.name(%n) == NPC,NPC: True,In Combat: $iif($istok(%fighting,%n,32),03true,04false)) Kills: $iif($hget(%n,kills),$v1,0) $iif($u.cgun(%n),Gun: $v1) $&
      $iif($u.ch2h(%n),Weapon: $v1) Money: $+($chr(36),$bytes($u.mon(%n),bd))
  }
  else _msg $1 You're not registered/logged in
}
alias _gstats {
  var %n = $iif($hget($2),$2,$1),%g = $iif($3,$3,$2)
  if (!%g) var %g = $u.cgun(%n)
  if ($hget(%n)) {
    if ($istok($u.guns(%n),%g,44)) {
      var %num = 1,%stats,%m = $+(gun.,%g,.*)
      while ($hfind(%n,%m,%num,w)) {
        var %stats = %stats $+($gettok($v1,$numtok($v1,46),46),=,$hget(%n,$v1))
        inc %num
      }
      if (%stats) {
        var %o.ammo = $+($gettok($wildtok(%stats,clip=*,1,32),2,61),/,$gettok($wildtok(%stats,clips=*,1,32),2,61))
        var %o.damage = $gettok($wildtok(%stats,damage=*,1,32),2,61)
        var %o.rate = $gettok($wildtok(%stats,rate=*,1,32),2,61)
        _msg $1 Gun: %g Ammo (clip/s): %o.ammo Damage: %o.damage Rate of fire: %o.rate
      }
      else _msg $1 Error getting stats for $qt(%g) 
    }
    else _msg $1 You don't have that weapon
  }
  else echo -a _msg $1 You're not registered/logged in
}
on !*:nick:{
  if ($comchan($newnick,1)) && ($hget($nick)) _msg $newnick $logout($nick) because of your nick change.
  if ($istok(%fighting,$nick,32)) set %fighting $remtok(%fighting,$nick,1,32)
}
on !*:quit:{
  if ($comchan($nick,1)) && ($hget($nick)) logout $nick
  if ($istok(%fighting,$nick,32)) set %fighting $remtok(%fighting,$nick,1,32)
}
on *:exit:unset %fighting

; /PUNCH <ATTACKER> <TARGET>
alias punch {
  if ($istok($u.h2h($1),punch,44)) {
    var %acc = $u.acc($1),%admg = $r(5,10)
    ; Attack Strength
    var %atkstr = $calc($u.str($1) + ($u.level($1) * %admg))
    if ($hget($1,item.brassknuckles)) var %atkstr = $calc(%atkstr + $r(4,10))
    ; Toughness
    var %tuffdef = $calc($u.tuff($2) + ($u.level($2) * (%admg / 2)))
    ; Damage
    var %dmg = $ceil($calc(%atkstr - %tuffdef)),%exp = $calc($ceil($u.level($2) /2) + %admg)
    if (%dmg < 1) { 
      var %::dmg = $r(1,4)
      if (%::dmg != 2) var %dmg = 0,%exp = 0
      else var %dmg = $r(1,20)
    }
    hadd $1 exp $calc($u.exp($1) + %exp)
    hadd $2 hp $ceil($calc($u.hp($2) - %dmg))
    if (%dmg == 0) var %atkmsg = * $_nick($1) 04,01missed a punch at $_nick($2) $+ .
    else var %atkmsg = * $_nick($1) delivers a haymaker to $_nick($2) doing %dmg damage.,%extmsg = $_nick($1) gains %exp experience. 
    if ($hget($1,item.brassknuckles)) var %atkmsg = * $_nick($1) slugs $_nick($2) with 07BrassKnuckles doing %dmg damage.
    ;DEATH CHECK
    var %dcheck = $_dcheck($1,$2),%atk.exp = $gettok(%dcheck,1,32),%atk.money = $gettok(%dcheck,2,32)
    .signal -n 106 $1 $2
    if (%atk.exp) && (%atk.money) {
      hadd $1 exp $calc($u.exp($1) + %atk.exp)
      hadd $1 money $calc($u.mon($1) + %atk.money)
      var %extmsg = $_nick($1) 04knocks $_nick($2) the fuck 04out of combat. $_nick($1) gains $calc(%exp + %atk.exp) $& 
        experience and $+($chr(36),$bytes(%atk.money,bd),!)
      .signal 105 $1 $2

      .timernextturn. $+ $1 1 2 tb.next.turn

    }
    .amsg %atkmsg %extmsg
    _lcheck $1
  }
}
; /KICK <ATTACKER> <TARGET>
alias kick {
  if ($istok($u.h2h($1),kick,44)) {
    var %acc = $u.acc($1),%admg = $r(10,15)
    ; Attack Strength
    var %atkstr = $calc($u.str($1) + ($u.level($1) * %admg))
    ; Toughness
    var %tuffdef = $calc($u.tuff($2) + ($u.level($2) * (%admg / 2)))
    ; Damage
    var %dmg = $ceil($calc(%atkstr - %tuffdef)),%exp = $calc($ceil($u.level($2) /2) + %admg)
    if (%dmg < 1) { 
      var %::dmg = $r(1,4)
      if (%::dmg != 2) {
        var %dmg = 0
        var %exp = 0
      }
      else var %dmg = $r(1,20)
    }
    hadd $1 exp $calc($u.exp($1) + %exp)
    hadd $2 hp $ceil($calc($u.hp($2) - %dmg))
    if (%dmg == 0) var %atkmsg = * $_nick($1) 04,01missed a kick at $_nick($2) $+ .
    else var %atkmsg = * $_nick($1) crashes their leg into $_nick($2) doing %dmg damage.,%extmsg = $_nick($1) gains %exp experience. 
    ;DEATH CHECK
    var %dcheck = $_dcheck($1,$2),%atk.exp = $gettok(%dcheck,1,32),%atk.money = $gettok(%dcheck,2,32)
    .signal -n 107 $1 $2

    .timernextturn. $+ $1 1 2 tb.next.turn

    if (%atk.exp) && (%atk.money) {
      hadd $1 exp $calc($u.exp($1) + %atk.exp)
      hadd $1 money $calc($u.mon($1) + %atk.money)
      var %extmsg = $_nick($1) 04knocks $_nick($2) the fuck 04out of combat. $_nick($1) gains $calc(%exp + %atk.exp) $& 
        experience and $+($chr(36),$bytes(%atk.money,bd),!)
      .signal 105 $1 $2
    }
    .amsg %atkmsg %extmsg
  }
}
; /_DCHECK <ATTACKER> <TARGET> [see /punch]
alias _dcheck {
  if ($u.hp($2) <= 0) {
    ; attacker shit
    var %atk.exp = $ceil($calc(($u.level($2) * $r(50,100)) /2))
    var %atk.money = $ceil($calc(($u.level($2) * $r(75,150)) /.5))
    set %fighting $remtok(%fighting,$2,1,32)
    hadd $2 hp $u.fhp($2)
    hinc $1 kills
    return %atk.exp %atk.money
  }
}
alias _lcheck {
  if ($u.exp($1) >= $u.nexp($1)) {
    hinc $1 level
    var %leftover = $calc($u.exp($1) - $u.nexp($1))
    var %hp = $r(1,5),%str = $r(1,5),%tuff = $r(1,5)
    ;var %acc = $r(1,3)
    var %money = $ceil( $calc( ($u.level($1) * $r(100,200)) /.25) )
    hadd $1 exp %leftover
    hadd $1 nexp $calc($u.nexp($1) + ($r(200,300) * $ceil($u.level($1) / .75)))
    hadd $1 fhp $calc($u.fhp($1) + %hp)
    hadd $1 hp $u.fhp($1)
    hadd $1 toughness $calc($u.tuff($1) + %tuff)
    hadd $1 strength $calc($u.str($1) + %str)
    hadd $1 money $calc($u.money($1) + %money)
    .amsg ! $_nick($1) has level'd up! $+(+,%hp,hp) $+(+,%str,str) $+(+,%tuff,tuff) $+(+,$chr(36),,$bytes(%money,bd),)
    .signal -n 104 $1
  }
}
alias tleave {
  .amsg * $_nick($1) has left combat...
  hadd $1 hp $u.fhp($1)
  .signal -n 111 $1
  set %fighting $remtok(%fighting,$1,1,32)
}
alias _write writeini -n Users.ini $1 $2 $$3-
alias _rem remini Users.ini $1 $2
alias _read return $readini(Users.ini,$1,$$2) 
alias _ini return $iif($2,$ini(Users.ini,$1,$2),$ini(Users.ini,$1))
alias _msg {
  var %op = $iif($u.out($1),$v1,msg)
  $+(.,%op) $1 $2-
}
alias _nick return $+($1,( $+ $u.name($1) $+ ))

; USER ALIASES
alias u.name return $hget($1,name)
alias u.hp return $hget($1,hp)
alias u.fhp return $hget($1,fhp)
alias u.acc return $hget($1,accuracy)
alias u.str return $hget($1,strength)
alias u.tuff return $hget($1,toughness)
alias u.exp return $hget($1,exp)
alias u.nexp return $hget($1,nexp)
alias u.out return $hget($1,output)
alias u.mon return $hget($1,money)
alias u.pass return $hget($1,pass)
alias u.h2h return $hget($1,melee)
alias u.ch2h return $hget($1,cmelee)
alias u.guns return $hget($1,guns)
alias u.cgun return $hget($1,currentgun)
alias u.items return $hget($1,items)
alias u.level return $hget($1,level)
; END
alias login {
  if ($_ini($1)) {
    if (!$hget($1)) { 
      hmake $1
      var %n = 1
      while ($_ini($1,%n)) {
        hadd $1 $v1 $_read($1,$v1)
        inc %n
      }
      if ($u.pass($1) == $2) { .signal -n 102 $1 | return $1 is logged in }
      else {
        hfree $1
        return $iif($2,Invalid password ( $+ $2 $+ ),Password required)
      }
    }
    else return $1 is already logged in
  }
  else return $1 is not registered
}
alias logout {
  if ($_ini($1)) {
    if ($hget($1)) {
      var %n = 1
      while (%n <= $hget($1,0).item) {
        var %item = $hget($1,%n).item
        _write $1 %item $hget($1,%item)
        inc %n
      }
      hfree $1
      .signal -n 103 $1
      return $1 is logged out
    }
    else return $1 is not logged in
  }
  else return $1 is not registered
}
alias qp return $+($r(a,z),$r(a,z),$r(a,z),$r(0,9),$r(0,9))
alias adduser {
  if (!$_ini($1)) {
    if ($2) {
      _write $1 name $2
      _write $1 pass $qp
      _write $1 fhp 100
      _write $1 hp 100
      _write $1 accuracy $r(1,5)
      _write $1 strength $r(2,8)
      _write $1 toughness $r(2,8)
      _write $1 nexp 100
      _write $1 exp 0
      _write $1 output msg
      _write $1 money $r(15,30)
      _write $1 level 1
      _write $1 melee punch,kick
      .signal -n 100 $1
      return $1 is now registered
    }
    else return You must specify a character name
  }
  else return $1 is already registered
}
alias deluser {
  if ($_ini($1)) {
    if ($hget($1)) logout $1
    _rem $1
    .signal -n 101 $1
    return $1 is no longer registered
  }
  else return $1 is not registered
}
; ===============================
; = SIGNAL system, for full control
; = Allows for detailed AI, as well
; ===============================

on *:SIGNAL:*:{
  if ($signal isnum 100-200) {
    var %! = echo $color(info) !<SignalSystem>!
    if ($signal == 100) {
      ; NEW ACCOUNT
      ; %! $1 has made an account
    }
    elseif ($signal == 101) {
      ; DELETED ACCOUNT
      ; %! $1 $+ 's account has been deleted
    }
    elseif ($signal == 102) {
      ; USER LOGIN 
      ; %! $1 has logged in
    }
    elseif ($signal == 103) {
      ; USER LOGOUT
      ; %! $1 has logged out
    }
    elseif ($signal == 104) {
      ; User level'd up
    }
    elseif ($signal == 105) {
      ; Determined dead
    }
    elseif ($signal == 106) {
      ; $1 punch'd $2
    }
    elseif ($signal == 107) {
      ; $1 kick'd $2
    }
  }
}

####################
# Not used: !fight/!leave
####################

/*
if ($istok(enter fight combat play,%1,32)) {
  if (!$istok(%fighting,$nick,32)) {
    set %fighting $addtok(%fighting,$nick,32)
    _msg $chan * $_nick($nick) enters combat!
  }
  else _msg $nick You're already in combat
}
if ($istok(leave exit done run,%1,32)) {
  if ($istok(%fighting,$nick,32)) {
    $+(timer,tleave,.,$nick) 1 $r(3,10) tleave $nick $chan
  }
  else _msg $nick You're not in combat
}

on *:part:#:{
  if ($hget($nick)) timerpartlogout. $+ $nick 1 30 _msg $nick $logout($nick) because of your absence
}
on *:join:#:{
  if ($hget($nick)) {
    var %t = $+(partlogout.,$nick)
    if ($timer(%t)) $+(timer,%t) off
  }
}
*/
