things
local null_mobj = 0x88888888 -- no object at that index
local out_of_bounds = 0xFFFFFFFF -- no such index
local last_size = 0
-- sizes in bytes
local short = 2
local int = 4
local pointer = 8
local mobj_t = 512 -- sizeof(mobj_t) is 464, but we padded it for niceness
local rl = memory.read_u32_le
local rw = memory.read_u16_le
local rb = memory.read_u8_le
-- mobj member offsets in bytes
local off = {}
function add_offset(size, name)
off[name] = last_size
-- print(name, string.format("%X \t\t %X", size, last_size))
last_size = size + last_size
end
--[[--
thinker 30 0
x 4 30
y 4 34
z 4 38
snext 8 3C
sprev 8 44
angle 4 4C
sprite 4 50
frame 4 54
bnext 8 58
bprev 8 60
subsector 8 68
floorz 4 70
ceilingz 4 74
dropoffz 4 78
radius 4 7C
height 4 80
momx 4 84
momy 4 88
momz 4 8C
validcount 4 90
type 4 94
info 8 98
tics 4 A0
state 8 A4
flags 8 AC
intflags 4 B4
health 4 B8
movedir 2 BC
movecount 2 BE
strafecount 2 C0
target 8 C2
reactiontime 2 CA
threshold 2 CC
pursuecount 2 CE
gear 2 D0
player 8 D2
lastlook 2 DA
spawnpoint 3A DC
tracer 8 116
lastenemy 8 11E
friction 4 126
movefactor 4 12A
touching_sectorlist 8 12E
PrevX 4 136
PrevY 4 13A
PrevZ 4 13E
pitch 4 142
index 4 146
patch_width 2 14A
iden_nums 4 14C
--]]--
add_offset(48, "thinker")
add_offset(int, "x")
add_offset(int, "y")
add_offset(int, "z")
add_offset(int, "padding1")
add_offset(pointer, "snext")
add_offset(pointer, "sprev")
add_offset(int, "angle")
add_offset(int, "sprite")
add_offset(int, "frame")
add_offset(int, "padding2")
add_offset(pointer, "bnext")
add_offset(pointer, "bprev")
add_offset(pointer, "subsector")
add_offset(int, "floorz")
add_offset(int, "ceilingz")
add_offset(int, "dropoffz")
add_offset(int, "radius")
add_offset(int, "height")
add_offset(int, "momx")
add_offset(int, "momy")
add_offset(int, "momz")
add_offset(int, "validcount")
add_offset(int, "type")
add_offset(pointer, "info")
add_offset(int, "tics")
add_offset(int, "padding3")
add_offset(pointer, "state")
add_offset(8, "flags")
add_offset(int, "intflags")
add_offset(int, "health")
add_offset(short, "movedir")
add_offset(short, "movecount")
add_offset(short, "strafecount")
add_offset(short, "padding4")
add_offset(pointer, "target")
add_offset(short, "reactiontime")
add_offset(short, "threshold")
add_offset(short, "pursuecount")
add_offset(short, "gear")
add_offset(pointer, "player")
add_offset(short, "lastlook")
add_offset(58, "spawnpoint")
add_offset(int, "padding5") -- unsure where this one should be exactly
add_offset(pointer, "tracer")
add_offset(pointer, "lastenemy")
add_offset(int, "friction")
add_offset(int, "movefactor")
add_offset(pointer, "touching_sectorlist")
add_offset(int, "PrevX")
add_offset(int, "PrevY")
add_offset(int, "PrevZ")
add_offset(int, "pitch")
add_offset(int, "index")
add_offset(short, "patch_width")
add_offset(int, "iden_nums")
-- the rest are non-doom
-- print(off)
local mobjtype = {
-- "NULL" = -1,
-- "ZERO",
-- "PLAYER = ZERO",
"POSSESSED",
"SHOTGUY",
"VILE",
"FIRE",
"UNDEAD",
"TRACER",
"SMOKE",
"FATSO",
"FATSHOT",
"CHAINGUY",
"TROOP",
"SERGEANT",
"SHADOWS",
"HEAD",
"BRUISER",
"BRUISERSHOT",
"KNIGHT",
"SKULL",
"SPIDER",
"BABY",
"CYBORG",
"PAIN",
"WOLFSS",
"KEEN",
"BOSSBRAIN",
"BOSSSPIT",
"BOSSTARGET",
"SPAWNSHOT",
"SPAWNFIRE",
"BARREL",
"TROOPSHOT",
"HEADSHOT",
"ROCKET",
"PLASMA",
"BFG",
"ARACHPLAZ",
"PUFF",
"BLOOD",
"TFOG",
"IFOG",
"TELEPORTMAN",
"EXTRABFG",
"MISC0",
"MISC1",
"MISC2",
"MISC3",
"MISC4",
"MISC5",
"MISC6",
"MISC7",
"MISC8",
"MISC9",
"MISC10",
"MISC11",
"MISC12",
"INV",
"MISC13",
"INS",
"MISC14",
"MISC15",
"MISC16",
"MEGA",
"CLIP",
"MISC17",
"MISC18",
"MISC19",
"MISC20",
"MISC21",
"MISC22",
"MISC23",
"MISC24",
"MISC25",
"CHAINGUN",
"MISC26",
"MISC27",
"MISC28",
"SHOTGUN",
"SUPERSHOTGUN",
"MISC29",
"MISC30",
"MISC31",
"MISC32",
"MISC33",
"MISC34",
"MISC35",
"MISC36",
"MISC37",
"MISC38",
"MISC39",
"MISC40",
"MISC41",
"MISC42",
"MISC43",
"MISC44",
"MISC45",
"MISC46",
"MISC47",
"MISC48",
"MISC49",
"MISC50",
"MISC51",
"MISC52",
"MISC53",
"MISC54",
"MISC55",
"MISC56",
"MISC57",
"MISC58",
"MISC59",
"MISC60",
"MISC61",
"MISC62",
"MISC63",
"MISC64",
"MISC65",
"MISC66",
"MISC67",
"MISC68",
"MISC69",
"MISC70",
"MISC71",
"MISC72",
"MISC73",
"MISC74",
"MISC75",
"MISC76",
"MISC77",
"MISC78",
"MISC79",
"MISC80",
"MISC81",
"MISC82",
"MISC83",
"MISC84",
"MISC85",
"MISC86",
"PUSH",
"PULL",
"DOGS",
"PLASMA1",
"PLASMA2"
}
local spritenum = {
-- "TROO",
"SHTG",
"PUNG",
"PISG",
"PISF",
"SHTF",
"SHT2",
"CHGG",
"CHGF",
"MISG",
"MISF",
"SAWG",
"PLSG",
"PLSF",
"BFGG",
"BFGF",
"BLUD",
"PUFF",
"BAL1",
"BAL2",
"PLSS",
"PLSE",
"MISL",
"BFS1",
"BFE1",
"BFE2",
"TFOG",
"IFOG",
"PLAY",
"POSS",
"SPOS",
"VILE",
"FIRE",
"FATB",
"FBXP",
"SKEL",
"MANF",
"FATT",
"CPOS",
"SARG",
"HEAD",
"BAL7",
"BOSS",
"BOS2",
"SKUL",
"SPID",
"BSPI",
"APLS",
"APBX",
"CYBR",
"PAIN",
"SSWV",
"KEEN",
"BBRN",
"BOSF",
"ARM1",
"ARM2",
"BAR1",
"BEXP",
"FCAN",
"BON1",
"BON2",
"BKEY",
"RKEY",
"YKEY",
"BSKU",
"RSKU",
"YSKU",
"STIM",
"MEDI",
"SOUL",
"PINV",
"PSTR",
"PINS",
"MEGA",
"SUIT",
"PMAP",
"PVIS",
"CLIP",
"AMMO",
"ROCK",
"BROK",
"CELL",
"CELP",
"SHEL",
"SBOX",
"BPAK",
"BFUG",
"MGUN",
"CSAW",
"LAUN",
"PLAS",
"SHOT",
"SGN2",
"COLU",
"SMT2",
"GOR1",
"POL2",
"POL5",
"POL4",
"POL3",
"POL1",
"POL6",
"GOR2",
"GOR3",
"GOR4",
"GOR5",
"SMIT",
"COL1",
"COL2",
"COL3",
"COL4",
"CAND",
"CBRA",
"COL6",
"TRE1",
"TRE2",
"ELEC",
"CEYE",
"FSKU",
"COL5",
"TBLU",
"TGRN",
"TRED",
"SMBT",
"SMGT",
"SMRT",
"HDB1",
"HDB2",
"HDB3",
"HDB4",
"HDB5",
"HDB6",
"POB1",
"POB2",
"BRS1",
"TLMP",
"TLP2",
"TNT1",
"DOGS",
"PLS1",
"PLS2",
"BON3",
"BON4",
"BLD2"
}
local function iterate()
for index = 0, 100000 do
local addr = index * mobj_t
if addr > 0xFFFFFF then return end
local thinker = rl(addr) & 0xFFFFFFFF -- just to check if mobj is there
if thinker == out_of_bounds then return end
--[ [--
if thinker ~= null_mobj then
local x = (rl(addr + off.x) >> 16) / 3
local y = ((rl(addr + off.y) >> 16) - 62000) / 2
local z = rl(addr + off.z) >> 16
local type = rl(addr + off.type)
local sprite = rl(addr + off.sprite)
local i = rl(addr + off.index)
local tics = rl(addr + off.tics)
-- if type > 0 and type < 0x8d then
-- print(string.format("%d %f %f %02X", index, x, y, type))
gui.text(x, y, mobjtype[type])
-- end
end
--]]--
end
end
gui.defaultPixelFont("fceux")
while true do
iterate()
emu.frameadvance()
end