-
Notifications
You must be signed in to change notification settings - Fork 6
/
client.rb
137 lines (128 loc) · 4.65 KB
/
client.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
require 'socket'
require 'zlib'
TCPSocket.open(ARGV[0] || 'localhost', 1234) { |socket|
class << socket
alias_method :orig_read, :read
attr_accessor :traffic
attr_accessor :compress
attr_accessor :zstream
attr_accessor :buf
def read(x)
if @compress
while @buf.size < x
@buf << @zstream.inflate(orig_read(1))
@traffic += 1
end
ret = @buf[0...x]
@buf = @buf[x..-1]
else
ret = orig_read(x)
@traffic += x
end
ret
end
def read8
read(1)[0]
end
def read16
ret = read8
ret = ret & 0x7F | read8 << 7 if ret & 0x80 != 0
ret
end
def read32
read(4).unpack("N")[0]
end
def readXX(len)
read(len).unpack("A*")[0]
end
end
socket.traffic = 0
socket.buf = ""
socket.compress = false
socket.zstream = Zlib::Inflate.new
Thread.start do
last = socket.traffic
loop do
print "TRAFFIC: % dbyte/sec" % [socket.traffic - last]
if socket.compress
puts " (%d => %d)" % [socket.zstream.total_in, socket.zstream.total_out]
else
puts
end
last = socket.traffic
sleep 1
end
end
loop do
len = socket.read8
type = socket.read8
print "type=%3d len=%3d " % [type, len]
case type
when 0:
print "player upd: "
print "pno=%d " % socket.read8
print "mask=%d " % mask = socket.read8
print "alive=%s " % [socket.read8.zero? ? "quit" : "joined"] if mask & 1 != 0
print "name=%s " % socket.readXX(socket.read8) if mask & 2 != 0
print "color=%d " % socket.read8 if mask & 4 != 0
print "cpu=%d " % socket.read8 if mask & 8 != 0
print "score=%d " % (socket.read16 - 500) if mask & 16 != 0
puts
when 1:
puts "%d, %d => %d %d " % [socket.read8, socket.read8, socket.read8, socket.read8]
when 2:
puts "msg: %s " % socket.readXX(len)
when 3:
print "creature upd: "
print "cno=%d " % socket.read16
print "mask=%d " % mask = socket.read8
if mask & 1 != 0
print "alive=%s " % [socket.read8 == 0xFF ?
"dead" :
"spawned %d %d,%d" % [socket.read16, socket.read16, socket.read16] ]
end
print "type=%d " % socket.read8 if mask & 2 != 0
if mask & 4 != 0
fh = socket.read8
print "food=%d, health=%d " % [ fh >> 4, fh & 0x0F ]
end
print "state=%d " % socket.read8 if mask & 8 != 0
if mask & 16 != 0
dx, dy = socket.read16, socket.read16
x = ((dx & 1) == 1 ? -1 : 1) * (dx >> 1)
y = ((dy & 1) == 1 ? -1 : 1) * (dy >> 1)
print "path=%d,%d => %d,%d " % [dx, dy, x, y]
end
print "target=%d " % socket.read16 if mask & 32 != 0
print "message=%s " % socket.readXX(socket.read8) if mask & 64 != 0
print "speed=%d " % socket.read8 if mask &128 != 0
puts
when 4:
puts "quit msg: %s " % socket.readXX(len)
break
when 5:
puts "king: %d " % socket.read8
when 6:
puts "world info %dx%d koth: %d,%d" % [socket.read8, socket.read8, socket.read8, socket.read8]
when 7:
puts "smile %d" % socket.read16
when 8:
puts "game info time:%d" % socket.read32
when 9:
puts "round tick, delta=%d" % socket.read8
when 10:
puts "intermission: %s" % socket.readXX(len)
when 32:
socket.write("guiclient\n")
puts "welcome: %s" % socket.read(len).delete("\n").strip
when 254:
puts "compression start"
socket.compress = true
when 255:
puts "server protocol version %d" % socket.read8
else
puts "???: unknown packet type #{type}"
socket.readXX(len)
end
end
}