;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 }