All pastes #458495 Raw Edit

tiko

public text v1 · immutable
#458495 ·published 2007-04-25 22:30 UTC
rendered paste body
;Rogue Server :DDDD
alias restart {
  hfree -sw *
  sockclose *
  rstart
}
alias rstart {
  window @daemon
  set %rogue.defaultmap nethack
  set %rogue.port 23
  set %rogue.count 1
  socklisten rogue %rogue.port
  aline @daemon Started up!
}
alias fixcursor {
  if (!$hget($1,cursor) || $hget($1,cursor) == self) {
    sockwrite $1 $chr(27) $+ [ $+ $calc($hget($1,y) + 2) $+ ; $+ $hget($1,x) $+ H $+ $chr(27) $+ [s
  }
  elseif ($hget($1,cursor) == prompt) {
    if (!$hget($1,inputpos)) {
      var %inputpos = 1
    }
    else {
      var %inputpos = $hget($1,inputpos) 
    }
    sockwrite $1 $chr(27) $+ [21; $+ $calc(1 + %inputpos) $+ H
  }
  else {
    aline @daemon Error: Unknown cursor return value, check function fixcursor and $sockname,state
  }
}

alias debugmap {
  var %limit $hget($1 $+ .map,0).item
  var %count 1
  while (%count < %limit) {
    aline @daemon $hget($1 $+ .map,%count)
    inc %count
  }
}
alias testhash {
  var %limit $calc($hget($1,0).item + 1)
  var %count 1
  while (%count < %limit) {
    aline @daemon $hget($1,%count).item = $hget($1,$hget($1,%count).item)
    inc %count
  }
}
alias sendmap {
  hfree -w $1 $+ .tmp
  hmake $1 $+ .tmp 100
  set %countf 1
  set %limitf $calc($hget($1 $+ .map,0).item + 1)
  while (%countf < %limitf) {
    hadd $1 $+ .tmp %countf $hget($1 $+ .map,%countf)
    inc %countf
  }
  set %count 1
  set %limit $calc($hget($1 $+ .objn,0).item + 1)
  while (%count < %limit) {
    set %x $gettok($hget($1 $+ .objn,$hget($1 $+ .objn,%count).item),2,32)
    set %y $gettok($hget($1 $+ .objn,$hget($1 $+ .objn,%count).item),3,32)
    set %glyph $gettok($hget($1 $+ .objn,$hget($1 $+ .objn,%count).item),1,32)
    if ($calc(%x - 1) > 0) {
      hadd $1 $+ .tmp %y $mid($hget($1 $+ .tmp,%y),0,$calc(%x - 1)) $+ %glyph $+ $mid($hget($1 $+ .tmp,%y),$calc(%x + 1),$calc($len($hget($1 $+ .tmp,%y)) + %x))}
    }
    else {
      hadd $1 $+ .tmp %y %glyph $+ $mid($hget($1 $+ .tmp,%y),$calc(%x + 1),$calc($len($hget($1 $+ .tmp,%y)) + %x))}
    }
    inc %count
  }

  if ($2 != all) {
    set %countm 1
    set %limitm $calc($hget($1 $+ .users,0).item + 1)
    while (%countm < %limitm) {
      sockwrite $hget($1 $+ .users,%countm).item $chr(27) $+ [ $+ $calc($2 + 2) $+ ; $+ 1 $+ H $+ $replace($hget($1 $+ .tmp,$2),$chr(160),$chr(27) $+ [1C)
      sockwrite $hget($1 $+ .users,%countm).item $chr(27) $+ [ $+ $calc($3 + 2) $+ ; $+ 1 $+ H $+ $replace($hget($1 $+ .tmp,$3),$chr(160),$chr(27) $+ [1C)
      sockwrite $hget($1 $+ .users,%countm).item $chr(27) $+ [ $+ u
      inc %countm
    }
  }
  elseif ($2 == all) {
    set %countx 1
    set %limitx $calc($hget($1 $+ .tmp,0).item + 1)
    while (%countx < %limitx) {
      sockwrite $3 $chr(27) $+ [ $+ $calc(%countx + 2) $+ ; $+ 1 $+ H $+ $replace($hget($1 $+ .tmp,%countx),$chr(160),$chr(27) $+ [1C)
      inc %countx
    }
  }
  inc %map.count
}

alias loadup {
  if (!$hget($1 $+ .map,0).item) {
    hmake $1 $+ .objx 50    
    hmake $1 $+ .objy 50    
    hmake $1 $+ .objn 50    
    hmake $1 $+ .map 100
    var %count 1
    while (%count < $calc($lines(maps/ $+ $1 $+ .map) + 1)) {
      hadd $1 $+ .map %count $replace($read(maps/ $+ $1 $+ .map,%count),$chr(32),$chr(160))
      ;hmake $1 $+ l $+ %count 5
      inc %count
    }
    hmake $1 $+ .boundries 100
    var %count2 1
    while (%count2 < $calc($lines(maps/ $+ $1 $+ .boundries) + 1)) {
      ;hadd $1 $+ .boundries %count2 $replace($read(maps/ $+ $1 $+ .boundries,%count2),$chr(32),$chr(160))
      var %line = $replace($read(maps/ $+ $1 $+ .boundries,%count2),$chr(32),$chr(160))
      var %limitnig $count(%line,$chr(35))
      var %countnig 1
      while (%countnig < %limitnig) {
        hadd $1 $+ .boundries $pos(%line,$chr(35),%countnig) $+ , $+ %count2 $chr(35)
        inc %countnig
      }
      inc %count2
    }
    hmake $1 $+ .users 100
    hmake $1 $+ .meta 10
    hadd $1 $+ .meta mapname $gettok($read(maps/ $+ $1 $+ .meta,1),1,44)
    ;    hadd $1 $+ .meta version $gettok($read(maps/ $+ $1 $+ .meta,1),2,44)
    hadd $1 $+ .meta version $crc(maps/ $+ $1 $+ .map)
    hadd $1 $+ .meta startx $gettok($read(maps/ $+ $1 $+ .meta,1),3,44)
    hadd $1 $+ .meta starty $gettok($read(maps/ $+ $1 $+ .meta,1),4,44)
    hadd $1 $+ .meta maxx $gettok($read(maps/ $+ $1 $+ .meta,1),5,44)
    hadd $1 $+ .meta maxy $gettok($read(maps/ $+ $1 $+ .meta,1),6,44)
  }
}

on *:SOCKLISTEN:rogue*:{
  var %sockname rogue $+ %rogue.count
  sockaccept %sockname
  bset &out1 1 255 252 34
  bset &out2 1 255 251 1
  bset &out3 1 255 251 3
  bset &out4 1 255 253 3
  bset &out5 1 255 253 1
  sockwrite %sockname &out1
  sockwrite %sockname &out2
  sockwrite %sockname &out3
  sockwrite %sockname &out4
  sockwrite %sockname &out5
  loadup %rogue.defaultmap
  hmake %sockname 10
  hadd %sockname glyph @
  hadd %sockname map %rogue.defaultmap
  hadd %rogue.defaultmap $+ .users %sockname %sockname
  aline @daemon %sockname joined
  var %count 1
  var %limit $calc($hget($hget(%sockname,map) $+ .users,0).item + 1)
  while (%count < %limit) {
    sockwrite -n $hget($hget(%sockname,map) $+ .users,%count).item $chr(27) $+ [H $+ $chr(27) $+ [0K %sockname joins
    inc %count
  }
  ;  sockwrite -n %sockname NEWMAP $hget(%rogue.defaultmap $+ .meta,mapname)
  ;sockwrite -n %sockname NEWMAP %rogue.defaultmap $hget(%rogue.defaultmap $+ .meta,version)
  ;  sockwrite -n %sockname MAPVER $hget(%rogue.defaultmap $+ .meta,version)
  inc %rogue.count
  hadd %sockname x $hget($hget(%sockname,map) $+ .meta,startx)
  hadd %sockname y $hget($hget(%sockname,map) $+ .meta,starty)
  sockwrite -n %sockname $chr(27) $+ [21;1H> $chr(27) $+ [f
  ;hadd $hget(%sockname,map) $+ l $+ $hget(%sockname,y) %sockname %sockname
  ;sockwrite -n %sockname UPDATE $calc($hget(%sockname,y) + 2) $mid($hget($hget(%sockname,map),$hget(%sockname,y)),0,$calc($hget(%sockname,x) - 1)) $+ 4@ $+ $mid($hget($hget(%sockname,map),$hget(%sockname,y)),$calc($hget(%sockname,x) + 1),$calc($len($hget($hget(%sockname,map),$hget(%sockname,y))) + $hget(%sockname,x)))
  ;aline @daemon     sockwrite -n %sockname $calc($hget(%sockname,y) + 2) $mid($hget($hget(%sockname,map),$hget(%sockname,y)),0,$calc($hget(%sockname,x) - 1)) $+ 4@ $+ $mid($hget($hget(%sockname,map),$hget(%sockname,y)),$calc($hget(%sockname,x) + 1),$calc($len($hget($hget(%sockname,map),$hget(%sockname,y))) + $hget(%sockname,x)))
  hadd $hget(%sockname,map) $+ .objy $hget($hget(%sockname,map) $+ .meta,defaulty) %sockname
  hadd $hget(%sockname,map) $+ .objx $hget($hget(%sockname,map) $+ .meta,defaultx) %sockname
  hadd $hget(%sockname,map) $+ .objn %sockname @ $hget(%sockname,x) $hget(%sockname,y)
  hadd %sockname cursor self
  sendmap $hget(%sockname,map) all %sockname
  fixcursor
}

on *:sockclose:rogue*:{
  hdel $hget($sockname,map) $+ .users $sockname
  hdel $hget($sockname,map) $+ .objn $sockname
  hfree $sockname
  aline @daemon $sockname quit
}
on *:sockread:rogue*:{
  if ($sockerr > 0) return
  :nextread
  sockread &temp
  if ($sockbr == 0) return
  ;  tokenize 32 %temp

  var %char = $bvar(&temp,1-)
  aline @daemon read f %char
  sockwrite $sockname $chr(27) $+ [ $+ $calc($hget($sockname,y) + 2) $+ ; $+ $hget($sockname,x) $+ H $+ $chr(27) $+ [s
  if ($hget($sockname,state) != prompt) {  
    if (%char == 116) {
      hadd $sockname state prompt
      hadd $sockname prompt talk
      ;    sockwrite $sockname $chr(27) $+ [21;2H
      hadd $sockname cursor prompt
      fixcursor $sockname
      hadd $sockname input $null
      hadd $sockname inputpos 1
    }
    if (%char == 27 91 65 || %char == 27 91 67 || %char == 27 91 66 || %char == 27 91 68) {
      var %oldx $hget($sockname,x)
      var %oldy $hget($sockname,y) 
      hdel $hget($sockname,map) $+ .boundries $hget($sockname,x) $+ , $+ $hget($sockname,y)  
      if (%char == 27 91 65) {
        hadd $sockname y $calc($hget($sockname,y) - 1)
      }
      if (%char == 27 91 66) {
        hadd $sockname y $calc($hget($sockname,y) + 1)
      }
      if (%char == 27 91 67) {
        hadd $sockname x $calc($hget($sockname,x) + 1)
      }
      if (%char == 27 91 68) {
        hadd $sockname x $calc($hget($sockname,x) - 1)
      }
      aline @daemon $sockname is trying to move to a square marked $hget($hget($sockname,map) $+ .boundries,$hget($sockname,x) $+ $chr(44) $+ $hget($sockname,y)) at coordinates $hget($sockname,x) $+ , $+ $hget($sockname,y)
      if ($hget($hget($sockname,map) $+ .boundries, $hget($sockname,x) $+ $chr(44) $+ $hget($sockname,y)) == $chr(35) || $hget($hget($sockname,map) $+ .boundries, $hget($sockname,x) $+ $chr(44) $+ $hget($sockname,y)) == @ || $hget($sockname,x) < 1 || $hget($sockname,y) < 1) {
        hadd $sockname x %oldx
        hadd $sockname y %oldy      
      }
      else {
        hadd $hget($sockname,map) $+ .objn $sockname $hget($sockname,glyph) $hget($sockname,x) $hget($sockname,y)
        aline @daemon       sendmap $hget($sockname,map) %oldy $hget($sockname,y)

        sendmap $hget($sockname,map) %oldy $hget($sockname,y)
      }
      hadd $hget($sockname,map) $+ .boundries $hget($sockname,x) $+ , $+ $hget($sockname,y) @
      hadd $sockname cursor self
      ;sockwrite $sockname $chr(27) $+ [ $+ $calc($hget($sockname,y) + 2) $+ ; $+ $hget($sockname,x) $+ H $+ $chr(27) $+ [s
      fixcursor $sockname
    }
  }
  else {
    if (%char == 127) {
      hadd $sockname input $left($hget($sockname,input),-1)
      hadd $sockname inputpos $calc($hget($sockname,inputpos) - 1)
      fixcursor $sockname
      sockwrite $sockname $chr(27) $+ [0K
    }
    else {
      hadd $sockname input $hget($sockname,input) $+ $chr(%char)
      hadd $sockname inputpos $calc($hget($sockname,inputpos) + 1)
      fixcursor $sockname
      if (%char == 32) {
        sockwrite $sockname $chr(27) $+ [1C
      } 
      else {
        sockwrite $sockname $chr(%char)
      }
    }
  }
  ;  fixcursor $sockname
  goto nextread
}