research/hhe/dump-mobjinfo

106 lines
1.6 KiB
Plaintext
Raw Normal View History

#!/usr/bin/env ruby
require "scanf"
require "common.rb"
filename = ARGV[0]
set_config(ARGV[1])
def read_int(file)
c1 = file.getc
c2 = file.getc
c3 = file.getc
c4 = file.getc
c1 | (c2 << 8) | (c3 << 16) | (c4 << 24)
end
def read_mobj(file)
result = []
24.times do
i = read_int(file)
result.push(i)
end
result
end
def parse_flags(value, flagnames)
flags = []
for i in 0...32
if (value & (1 << i)) != 0
flags.push(flagnames[i])
end
end
if flags.length == 0
return "0"
else
return flags.join(" | ")
end
end
def print_field(state, index)
field_name = MOBJINFO_FIELDS[index]
value = state[index]
if field_name =~ /sound$/
value = SOUND_EFFECTS[value]
elsif field_name == "doomednum"
if value > (1 << 31)
value -= (1 << 32)
end
elsif field_name =~ /speed|radius|height/ # fixed_t
if value != 0 and ((value % 65536) == 0)
value /= 65536
value = sprintf("%i * FRACUNIT", value)
end
elsif field_name == "flags"
value = parse_flags(value, THING_FLAGS1)
elsif field_name == "flags2"
value = parse_flags(value, THING_FLAGS2)
end
s = sprintf(" %s,", value)
printf "%s", s
if s.length < 32
printf " " * (32 - s.length)
else
printf " "
end
printf "// %s\n", field_name
end
states = []
File.open(filename) do |file|
file.seek(MOBJINFO_OFFSET)
NUM_MOBJS.times do
states.push(read_mobj(file))
end
end
puts "mobjinfo_t mobjinfo[] = {"
puts
for state in states
printf " {\n"
for i in 0...24
print_field(state, i)
end
printf " },\n"
puts
end
puts "};"
puts