Unhardcode startinfo
Thanks a lot to @Learath2 for explaining the int packer to me <3
This commit is contained in:
parent
2919feb529
commit
2c8e6aeb8f
62
lib/packer.rb
Normal file
62
lib/packer.rb
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
class Packer
|
||||||
|
# poor mans int packer
|
||||||
|
# homebrew not covering
|
||||||
|
# the full tw fancyness
|
||||||
|
#
|
||||||
|
# Format: ESDDDDDD EDDDDDDD EDD... Extended, Data, Sign
|
||||||
|
def self.pack_int(num)
|
||||||
|
if num > 63 || num < -63
|
||||||
|
# the first byte can fit 6 bits
|
||||||
|
# because the first two bits are extended and sign
|
||||||
|
# so if you have a number bigger than 63
|
||||||
|
# it needs two bytes
|
||||||
|
# which are also least significant byte first etc
|
||||||
|
# so we do not support that YET
|
||||||
|
#
|
||||||
|
# the first too big number 64 is represented as those bits
|
||||||
|
# 10000000 00000001
|
||||||
|
# ^^^ ^ ^ ^
|
||||||
|
# ||\ / \ /
|
||||||
|
# || \ / \ /
|
||||||
|
# || \ \/
|
||||||
|
# || \ /
|
||||||
|
# || \ /
|
||||||
|
# || \ /
|
||||||
|
# || \/
|
||||||
|
# || /\
|
||||||
|
# || / \
|
||||||
|
# || / \
|
||||||
|
# || 00000001 000000
|
||||||
|
# || |
|
||||||
|
# || v
|
||||||
|
# || 64
|
||||||
|
# ||
|
||||||
|
# |positive
|
||||||
|
# extended
|
||||||
|
raise "Numbers greater than 63 are not supported yet"
|
||||||
|
end
|
||||||
|
sign = '0'
|
||||||
|
if num.negative?
|
||||||
|
sign = '1'
|
||||||
|
num += 1
|
||||||
|
end
|
||||||
|
num = num.abs
|
||||||
|
ext = '0'
|
||||||
|
bits = ext + sign + num.to_s(2).rjust(6, '0')
|
||||||
|
[bits.to_i(2)]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def todo_make_this_rspec_test
|
||||||
|
p Packer.pack_int(1) == [1]
|
||||||
|
p Packer.pack_int(16) == [16]
|
||||||
|
p Packer.pack_int(63) == [63]
|
||||||
|
|
||||||
|
p Packer.pack_int(3) == [3]
|
||||||
|
p Packer.pack_int(-1) == [64]
|
||||||
|
p Packer.pack_int(-2) == [65]
|
||||||
|
|
||||||
|
# todo
|
||||||
|
# p Packer.pack_int(64) == [64]
|
||||||
|
end
|
||||||
|
|
|
@ -10,6 +10,7 @@ require_relative 'packet'
|
||||||
require_relative 'chunk'
|
require_relative 'chunk'
|
||||||
require_relative 'server_info'
|
require_relative 'server_info'
|
||||||
require_relative 'net_base'
|
require_relative 'net_base'
|
||||||
|
require_relative 'packer'
|
||||||
|
|
||||||
class TwClient
|
class TwClient
|
||||||
attr_reader :state
|
attr_reader :state
|
||||||
|
@ -102,13 +103,48 @@ class TwClient
|
||||||
end
|
end
|
||||||
|
|
||||||
def send_msg_startinfo()
|
def send_msg_startinfo()
|
||||||
# todo: build startinfo chunk here
|
start_info = {
|
||||||
|
name: "ruby gamer",
|
||||||
|
clan: "",
|
||||||
|
country: 1,
|
||||||
|
body: "spiky",
|
||||||
|
marking: "duodonny",
|
||||||
|
decoration: "",
|
||||||
|
hands: "standard",
|
||||||
|
feet: "standard",
|
||||||
|
eyes: "standard",
|
||||||
|
custom_color_body: 0,
|
||||||
|
custom_color_marking: 0,
|
||||||
|
custom_color_decoration: 0,
|
||||||
|
custom_color_hands: 0,
|
||||||
|
custom_color_feet: 0,
|
||||||
|
custom_color_eyes: 0,
|
||||||
|
color_body: 0,
|
||||||
|
color_marking: 0,
|
||||||
|
color_decoration: 0,
|
||||||
|
color_hands: 0,
|
||||||
|
color_feet: 0,
|
||||||
|
color_eyes: 0
|
||||||
|
}
|
||||||
|
|
||||||
# create unused chunk just to bump
|
data = []
|
||||||
# the sequence number ._.
|
|
||||||
NetChunk.create_vital_header({vital: true}, 1)
|
|
||||||
|
|
||||||
@netbase.send_packet(MSG_STARTINFO)
|
start_info.each do |key, value|
|
||||||
|
if value.class == String
|
||||||
|
data += value.chars.map(&:ord) + [0x00]
|
||||||
|
elsif value.class == Integer
|
||||||
|
data += Packer.pack_int(value)
|
||||||
|
else
|
||||||
|
puts "Error: invalid startinfo #{key}: #{value}"
|
||||||
|
exit 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
@netbase.send_packet(
|
||||||
|
NetChunk.create_vital_header({vital: true}, data.size + 1) +
|
||||||
|
[pack_msg_id(NETMSGTYPE_CL_STARTINFO, system: false)] +
|
||||||
|
data
|
||||||
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
def send_msg_ready()
|
def send_msg_ready()
|
||||||
|
|
Loading…
Reference in a new issue