First workin snap item parser
Thanks a lot to @Learath2 for explaining in irc
And for the awesome libtw2 docs by @heinrich5991
48a2573af6/doc/snapshot.md
This commit is contained in:
parent
f98ad6ae30
commit
948aafb749
|
@ -300,34 +300,36 @@ class GameClient
|
||||||
end
|
end
|
||||||
|
|
||||||
item_delta = u.get_int
|
item_delta = u.get_int
|
||||||
item_bits = item_delta.to_s(2).rjust(32, '0')
|
while item_delta
|
||||||
item_id_bits = item_bits[0...16]
|
# item_bits = item_delta.to_s(2).rjust(32, '0')
|
||||||
item_type_bits = item_bits[16..]
|
item_type = item_delta
|
||||||
item_id = item_id_bits.to_i(2)
|
# item_id_bits = item_bits[0...16]
|
||||||
item_type = item_type_bits.to_i(2)
|
# item_type_bits = item_bits[16..]
|
||||||
item_meta = @snap_items[item_type]
|
# item_id = item_id_bits.to_i(2)
|
||||||
item_name = item_meta[:name]
|
# item_type = item_type_bits.to_i(2)
|
||||||
# { name: 'obj_game_data', size: 3, fields: [
|
item_meta = @snap_items[item_type]
|
||||||
# { type: 'int', name: 'start_tick' },
|
item_name = item_meta[:name]
|
||||||
|
# { name: 'obj_game_data', size: 3, fields: [
|
||||||
|
# { type: 'int', name: 'start_tick' },
|
||||||
|
|
||||||
p = u.parsed.last
|
|
||||||
notes.push([:green, p[:pos], p[:len],
|
|
||||||
"\n id = #{item_id_bits} -> #{item_id}" \
|
|
||||||
"\n type = #{item_type_bits} -> #{item_type} #{item_name}"])
|
|
||||||
|
|
||||||
who = u.get_int
|
|
||||||
p = u.parsed.last
|
|
||||||
notes.push([:cyan, p[:pos], p[:len], "who are you mr #{who} ?"])
|
|
||||||
|
|
||||||
size = item_meta[:size]
|
|
||||||
(0...size).each do |i|
|
|
||||||
val = u.get_int
|
|
||||||
p = u.parsed.last
|
p = u.parsed.last
|
||||||
color = (i % 2).zero? ? :yellow : :pink
|
notes.push([:green, p[:pos], p[:len], "type = #{item_type} #{item_name}"])
|
||||||
fields = item_meta[:fields]
|
|
||||||
desc = ''
|
item_id = u.get_int
|
||||||
desc = fields[i][:name] unless fields.nil? || fields[i].nil?
|
p = u.parsed.last
|
||||||
notes.push([color, p[:pos], p[:len], "data[#{i}]=#{val} #{desc}"])
|
notes.push([:cyan, p[:pos], p[:len], "id=#{item_id}"])
|
||||||
|
|
||||||
|
size = item_meta[:size]
|
||||||
|
(0...size).each do |i|
|
||||||
|
val = u.get_int
|
||||||
|
p = u.parsed.last
|
||||||
|
color = (i % 2).zero? ? :yellow : :pink
|
||||||
|
fields = item_meta[:fields]
|
||||||
|
desc = ''
|
||||||
|
desc = fields[i][:name] unless fields.nil? || fields[i].nil?
|
||||||
|
notes.push([color, p[:pos], p[:len], "data[#{i}]=#{val} #{desc}"])
|
||||||
|
end
|
||||||
|
item_delta = u.get_int
|
||||||
end
|
end
|
||||||
|
|
||||||
# skip = 0
|
# skip = 0
|
||||||
|
|
|
@ -135,6 +135,7 @@ class Unpacker
|
||||||
|
|
||||||
def get_int
|
def get_int
|
||||||
return nil if @data.nil?
|
return nil if @data.nil?
|
||||||
|
return nil if @data.empty?
|
||||||
|
|
||||||
# TODO: make this more performant
|
# TODO: make this more performant
|
||||||
# it should not read in ALL bytes
|
# it should not read in ALL bytes
|
||||||
|
|
|
@ -49,6 +49,13 @@ describe 'Unpacker', :unpacker do
|
||||||
expect(u.get_int).to eq(2)
|
expect(u.get_int).to eq(2)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it 'Should return nil if no more int is found' do
|
||||||
|
u = Unpacker.new([0x01, 0x02])
|
||||||
|
expect(u.get_int).to eq(1)
|
||||||
|
expect(u.get_int).to eq(2)
|
||||||
|
expect(u.get_int).to eq(nil)
|
||||||
|
end
|
||||||
|
|
||||||
it 'Should unpack negative integers' do
|
it 'Should unpack negative integers' do
|
||||||
u = Unpacker.new([0x40, 0x41, 0x42])
|
u = Unpacker.new([0x40, 0x41, 0x42])
|
||||||
# 0x40 => 1000 0000
|
# 0x40 => 1000 0000
|
||||||
|
|
Loading…
Reference in a new issue