From 9f73d8daf345e39388bc08a98d947628d95dea08 Mon Sep 17 00:00:00 2001 From: kalimag Date: Tue, 23 Sep 2025 05:18:40 +0200 Subject: [PATCH 01/49] Split definitions into reusable module --- Assets/Lua/Doom/dsda-data.lua | 457 +++++++++++++++++++++++ Assets/Lua/Doom/things-lines.lua | 607 +------------------------------ 2 files changed, 467 insertions(+), 597 deletions(-) create mode 100644 Assets/Lua/Doom/dsda-data.lua diff --git a/Assets/Lua/Doom/dsda-data.lua b/Assets/Lua/Doom/dsda-data.lua new file mode 100644 index 00000000000..bdd0917f647 --- /dev/null +++ b/Assets/Lua/Doom/dsda-data.lua @@ -0,0 +1,457 @@ +local dsda = {} + + + +-- Constants --- + +dsda.MAX_PLAYERS = 4 +-- sizes in bytes +dsda.LINE_SIZE = 256 -- sizeof(line_t) is 232, but we padded it for niceness +dsda.MOBJ_SIZE = 512 -- sizeof(mobj_t) is 464, but we padded it for niceness +dsda.PLAYER_SIZE = 1024 -- sizeof(player_t) is 729, but we padded it for niceness + + + +-- Structs --- + +function dsda.struct_layout(struct) + struct = struct or {} + struct.size = 0 + struct.offsets = {} + + function struct.add(name, size, alignment) + if alignment == true then alignment = size end + struct.align(alignment) + --print(string.format("%-19s %3X %3X", name, size, struct.size)); emu.yield() + struct.offsets[name] = struct.size + struct.size = struct.size + size + struct.align(alignment) -- add padding to structs + return struct + end + function struct.align(alignment) + if alignment and struct.size % alignment > 0 then + --print(string.format("%i bytes padding", alignment - (struct.size % alignment))) + struct.pad(alignment - (struct.size % alignment)) + end + end + function struct.pad(size) + struct.size = struct.size + size + return struct + end + function struct.s8 (name) return struct.add(name, 1, true) end + function struct.s16 (name) return struct.add(name, 2, true) end + function struct.s32 (name) return struct.add(name, 4, true) end + function struct.u8 (name) return struct.add(name, 1, true) end + function struct.u32 (name) return struct.add(name, 4, true) end + function struct.u64 (name) return struct.add(name, 8, true) end + function struct.ptr (name) return struct.u64(name) end + function struct.bool (name) return struct.s32(name) end + function struct.array(name, type, count, ...) + for i = 1, count do + struct[type](name .. i, ...) + end + return struct + end + + return struct +end + +dsda.player = dsda.struct_layout() + .ptr ("mobj") + .s32 ("playerstate") + .add ("cmd", 14, 2) + .s32 ("viewz") + .s32 ("viewheight") + .s32 ("deltaviewheight") + .s32 ("bob") + .s32 ("health") + .array("armorpoints", "s32", 4) + .s32 ("armortype") + .array("powers", "s32", 12) + .array("cards", "bool", 11) + .bool ("backpack") + .array("frags", "s32", 8) + .s32 ("readyweapon") + .s32 ("pendingweapon") + .array("weaponowned", "bool", 9) + .array("ammo", "s32", 6) + .array("maxammo", "s32", 6) + .s32 ("attackdown") + .s32 ("usedown") + .s32 ("cheats") + .s32 ("refire") + .s32 ("killcount") + .s32 ("itemcount") + .s32 ("secretcount") + .s32 ("damagecount") + .s32 ("bonuscount") + .ptr ("attacker") + .s32 ("extralight") + .s32 ("fixedcolormap") + .s32 ("colormap") + .add ("psprites", 24*2, 8) + .bool ("didsecret") + .s32 ("momx") + .s32 ("mony") + .s32 ("maxkilldiscount") + .s32 ("prev_viewz") + .u32 ("prev_viewangle") + .u32 ("prev_viewpitch") + -- the rest are non-doom + +dsda.mobj = dsda.struct_layout() + .add("thinker", 44, 8) + .s32("x") + .s32("y") + .s32("z") + .ptr("snext") + .ptr("sprev") + .u32("angle") + .s32("sprite") + .s32("frame") + .ptr("bnext") + .ptr("bprev") + .ptr("subsector") + .s32("floorz") + .s32("ceilingz") + .s32("dropoffz") + .s32("radius") + .s32("height") + .s32("momx") + .s32("momy") + .s32("momz") + .s32("validcount") + .s32("type") + .ptr("info") + .s32("tics") + .ptr("state") + .u64("flags") + .s32("intflags") + .s32("health") + .s16("movedir") + .s16("movecount") + .s16("strafecount") + .ptr("target") + .s16("reactiontime") + .s16("threshold") + .s16("pursuecount") + .s16("gear") + .ptr("player") + .s16("lastlook") + .add("spawnpoint", 58, 4) + .ptr("tracer") + .ptr("lastenemy") + .s32("friction") + .s32("movefactor") + .ptr("touching_sectorlist") + .s32("PrevX") + .s32("PrevY") + .s32("PrevZ") + .u32("pitch") + .s32("index") + .s16("patch_width") + .s32("iden_nums") + -- the rest are non-doom + + + +-- Enums --- + +dsda.doom = {} + +dsda.doom.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" +} + +dsda.doom.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" +} + +return dsda; diff --git a/Assets/Lua/Doom/things-lines.lua b/Assets/Lua/Doom/things-lines.lua index c40cccd78d9..0d756e78978 100644 --- a/Assets/Lua/Doom/things-lines.lua +++ b/Assets/Lua/Doom/things-lines.lua @@ -1,5 +1,7 @@ -- feos, 2025 +local dsda = require("dsda-data") + -- CONSTANTS local NULL_OBJECT = 0x88888888 -- no object at that index local OUT_OF_BOUNDS = 0xFFFFFFFF -- no such index @@ -10,11 +12,6 @@ local CHAR_WIDTH = 10 local CHAR_HEIGHT = 16 local NEGATIVE_MAXIMUM = 1 << 63 local POSITIVE_MAXIMUM = ~NEGATIVE_MAXIMUM -local MAX_PLAYERS = 4 --- sizes in bytes -local LINE_SIZE = 256 -- sizeof(line_t) is 232, but we padded it for niceness -local MOBJ_SIZE = 512 -- sizeof(mobj_t) is 464, but we padded it for niceness -local PLAYER_SIZE = 1024 -- sizeof(player_t) is 729, but we padded it for niceness -- shortcuts local rl = memory.read_u32_le local rw = memory.read_u16_le @@ -48,10 +45,10 @@ local LastScreenSize = { h = client.screenheight() } -- forward declarations -local PlayerOffsets = {}-- player member offsets in bytes -local MobjOffsets = {} -- mobj member offsets in bytes -local MobjType = {} -local SpriteNumber = {} +local PlayerOffsets = dsda.player.offsets-- player member offsets in bytes +local MobjOffsets = dsda.mobj.offsets-- mobj member offsets in bytes +local MobjType = dsda.doom.mobjtype +local SpriteNumber = dsda.doom.spritenum local Objects = {} --gui.defaultPixelFont("fceux") @@ -133,8 +130,8 @@ local function iterate_players() local total_itemcount = 0 local total_secretcount = 0 local stats = " HP Armr Kill Item Secr\n" - for i = 1, MAX_PLAYERS do - local addr = PLAYER_SIZE * (i - 1) + for i = 1, dsda.MAX_PLAYERS do + local addr = dsda.PLAYER_SIZE * (i - 1) local mobj = rl(addr + PlayerOffsets.mobj, "Players") if mobj ~= NULL_OBJECT then @@ -191,7 +188,7 @@ local function iterate() end for i = 0, 100000 do - local addr = i * LINE_SIZE + local addr = i * dsda.LINE_SIZE if addr > 0xFFFFFF then break end local id = rl(addr, "Lines") & 0xFFFFFFFF @@ -215,7 +212,7 @@ end local function init_objects() for i = 0, 100000 do - local addr = i * MOBJ_SIZE + local addr = i * dsda.MOBJ_SIZE if addr > 0xFFFFFF then break end local thinker = rl(addr, "Things") & 0xFFFFFFFF -- just to check if mobj is there @@ -299,591 +296,7 @@ local function make_button(x, y, name, func) text(textX, textY, name, colors[colorIndex] | 0xff000000) -- full alpha end -local function struct_layout(struct) - struct = struct or {} - struct.size = 0 - struct.offsets = {} - - function struct.add(name, size, alignment) - if alignment == true then alignment = size end - struct.align(alignment) - --print(string.format("%-19s %3X %3X", name, size, struct.size)); emu.yield() - struct.offsets[name] = struct.size - struct.size = struct.size + size - struct.align(alignment) -- add padding to structs - return struct - end - function struct.align(alignment) - if alignment and struct.size % alignment > 0 then - --print(string.format("%i bytes padding", alignment - (struct.size % alignment))) - struct.pad(alignment - (struct.size % alignment)) - end - end - function struct.pad(size) - struct.size = struct.size + size - return struct - end - function struct.s8 (name) return struct.add(name, 1, true) end - function struct.s16 (name) return struct.add(name, 2, true) end - function struct.s32 (name) return struct.add(name, 4, true) end - function struct.u8 (name) return struct.add(name, 1, true) end - function struct.u32 (name) return struct.add(name, 4, true) end - function struct.u64 (name) return struct.add(name, 8, true) end - function struct.ptr (name) return struct.u64(name) end - function struct.bool (name) return struct.s32(name) end - function struct.array(name, type, count, ...) - for i = 1, count do - struct[type](name .. i, ...) - end - return struct - end - - return struct -end - ---[[ -player_t https://github.com/TASEmulators/dsda-doom/blob/master/prboom2/src/d_player.h -mobj 8 0 -playerstate 4 8 -cmd E C -viewz 4 1C -viewheight 4 20 -deltaviewheight 4 24 -bob 4 28 -health 4 2C -armorpoints1 4 30 -armorpoints2 4 34 -armorpoints3 4 38 -armorpoints4 4 3C -armortype 4 40 -powers1 4 44 -powers2 4 48 -powers3 4 4C -powers4 4 50 -powers5 4 54 -powers6 4 58 -powers7 4 5C -powers8 4 60 -powers9 4 64 -powers10 4 68 -powers11 4 6C -powers12 4 70 -cards1 4 74 -cards2 4 78 -cards3 4 7C -cards4 4 80 -cards5 4 84 -cards6 4 88 -cards7 4 8C -cards8 4 90 -cards9 4 94 -cards10 4 98 -cards11 4 9C -backpack 4 A0 -frags1 4 A4 -frags2 4 A8 -frags3 4 AC -frags4 4 B0 -frags5 4 B4 -frags6 4 B8 -frags7 4 BC -frags8 4 C0 -readyweapon 4 C4 -pendingweapon 4 C8 -weaponowned1 4 CC -weaponowned2 4 D0 -weaponowned3 4 D4 -weaponowned4 4 D8 -weaponowned5 4 DC -weaponowned6 4 E0 -weaponowned7 4 E4 -weaponowned8 4 E8 -weaponowned9 4 EC -ammo1 4 F0 -ammo2 4 F4 -ammo3 4 F8 -ammo4 4 FC -ammo5 4 100 -ammo6 4 104 -maxammo1 4 108 -maxammo2 4 10C -maxammo3 4 110 -maxammo4 4 114 -maxammo5 4 118 -maxammo6 4 11C -attackdown 4 120 -usedown 4 124 -cheats 4 128 -refire 4 12C -killcount 4 130 -itemcount 4 134 -secretcount 4 138 -damagecount 4 13C -bonuscount 4 140 -attacker 8 148 -extralight 4 150 -fixedcolormap 4 154 -colormap 4 158 -psprites 30 160 -didsecret 4 190 -momx 4 194 -mony 4 198 -maxkilldiscount 4 19C -prev_viewz 4 1A0 -prev_viewangle 4 1A4 -prev_viewpitch 4 1A8 -(padding omitted) -]] - -PlayerOffsets = struct_layout() - .ptr ("mobj") - .s32 ("playerstate") - .add ("cmd", 14, 2) - .s32 ("viewz") - .s32 ("viewheight") - .s32 ("deltaviewheight") - .s32 ("bob") - .s32 ("health") - .array("armorpoints", "s32", 4) - .s32 ("armortype") - .array("powers", "s32", 12) - .array("cards", "bool", 11) - .bool ("backpack") - .array("frags", "s32", 8) - .s32 ("readyweapon") - .s32 ("pendingweapon") - .array("weaponowned", "bool", 9) - .array("ammo", "s32", 6) - .array("maxammo", "s32", 6) - .s32 ("attackdown") - .s32 ("usedown") - .s32 ("cheats") - .s32 ("refire") - .s32 ("killcount") - .s32 ("itemcount") - .s32 ("secretcount") - .s32 ("damagecount") - .s32 ("bonuscount") - .ptr ("attacker") - .s32 ("extralight") - .s32 ("fixedcolormap") - .s32 ("colormap") - .add ("psprites", 24*2, 8) - .bool ("didsecret") - .s32 ("momx") - .s32 ("mony") - .s32 ("maxkilldiscount") - .s32 ("prev_viewz") - .u32 ("prev_viewangle") - .u32 ("prev_viewpitch") - -- the rest are non-doom - .offsets - ---[[ -mobj_t https://github.com/TASEmulators/dsda-doom/blob/master/prboom2/src/p_mobj.h -thinker 2C 0 -x 4 30 -y 4 34 -z 4 38 -snext 8 40 -sprev 8 48 -angle 4 50 -sprite 4 54 -frame 4 58 -bnext 8 60 -bprev 8 68 -subsector 8 70 -floorz 4 78 -ceilingz 4 7C -dropoffz 4 80 -radius 4 84 -height 4 88 -momx 4 8C -momy 4 90 -momz 4 94 -validcount 4 98 -type 4 9C -info 8 A0 -tics 4 A8 -state 8 B0 -flags 8 B8 -intflags 4 C0 -health 4 C4 -movedir 2 C8 -movecount 2 CA -strafecount 2 CC -target 8 D0 -reactiontime 2 D8 -threshold 2 DA -pursuecount 2 DC -gear 2 DE -player 8 E0 -lastlook 2 E8 -spawnpoint 3A EC -tracer 8 128 -lastenemy 8 130 -friction 4 138 -movefactor 4 13C -touching_sectorlist 8 140 -PrevX 4 148 -PrevY 4 14C -PrevZ 4 150 -pitch 4 154 -index 4 158 -patch_width 2 15C -iden_nums 4 160 -(padding omitted) ---]]-- -MobjOffsets = struct_layout() - .add("thinker", 44, 8) - .s32("x") - .s32("y") - .s32("z") - .ptr("snext") - .ptr("sprev") - .u32("angle") - .s32("sprite") - .s32("frame") - .ptr("bnext") - .ptr("bprev") - .ptr("subsector") - .s32("floorz") - .s32("ceilingz") - .s32("dropoffz") - .s32("radius") - .s32("height") - .s32("momx") - .s32("momy") - .s32("momz") - .s32("validcount") - .s32("type") - .ptr("info") - .s32("tics") - .ptr("state") - .u64("flags") - .s32("intflags") - .s32("health") - .s16("movedir") - .s16("movecount") - .s16("strafecount") - .ptr("target") - .s16("reactiontime") - .s16("threshold") - .s16("pursuecount") - .s16("gear") - .ptr("player") - .s16("lastlook") - .add("spawnpoint", 58, 4) - .ptr("tracer") - .ptr("lastenemy") - .s32("friction") - .s32("movefactor") - .ptr("touching_sectorlist") - .s32("PrevX") - .s32("PrevY") - .s32("PrevZ") - .u32("pitch") - .s32("index") - .s16("patch_width") - .s32("iden_nums") - -- the rest are non-doom - .offsets - -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" -} - -SpriteNumber = { --- "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" -} while true do if Init then init_objects() end From b4074413a8a789d147a7887c66f621e1f90fcb18 Mon Sep 17 00:00:00 2001 From: kalimag Date: Tue, 23 Sep 2025 17:36:40 +0200 Subject: [PATCH 02/49] Add 0 values to enums --- Assets/Lua/Doom/dsda-data.lua | 7 +++---- Assets/Lua/Doom/things-lines.lua | 10 ++-------- 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/Assets/Lua/Doom/dsda-data.lua b/Assets/Lua/Doom/dsda-data.lua index bdd0917f647..f5872c653e8 100644 --- a/Assets/Lua/Doom/dsda-data.lua +++ b/Assets/Lua/Doom/dsda-data.lua @@ -160,9 +160,8 @@ dsda.mobj = dsda.struct_layout() dsda.doom = {} dsda.doom.mobjtype = { --- "NULL" = -1, --- "ZERO", --- "PLAYER = ZERO", +-- [-1] = "NULL", + [ 0] = "PLAYER", "POSSESSED", "SHOTGUY", "VILE", @@ -307,7 +306,7 @@ dsda.doom.mobjtype = { } dsda.doom.spritenum = { --- "TROO", + [0] = "TROO", "SHTG", "PUNG", "PISG", diff --git a/Assets/Lua/Doom/things-lines.lua b/Assets/Lua/Doom/things-lines.lua index 0d756e78978..4238bcb2e74 100644 --- a/Assets/Lua/Doom/things-lines.lua +++ b/Assets/Lua/Doom/things-lines.lua @@ -169,10 +169,7 @@ local function iterate() local pos = { x = mapify_x(x), y = mapify_y(y) } local color = "white" - if type == 0 - then type = "PLAYER" - else type = MobjType[type] - end + type = MobjType[type] if health <= 0 then color = "red" end --[[-- local z = rls(addr + Offsets.z) / 0xffff @@ -223,11 +220,8 @@ local function init_objects() local y = rls(addr + MobjOffsets.y, "Things") / 0xffff * -1 local type = rl (addr + MobjOffsets.type, "Things") - if type == 0 - then type = "PLAYER" - else type = MobjType[type] - end -- print(string.format("%d %f %f %02X", index, x, y, type)) + type = MobjType[type] if type and not string.find(type, "MISC") then From 0e99148d504b46e9cfb4b4e44d0de2d049cc13cd Mon Sep 17 00:00:00 2001 From: kalimag Date: Wed, 24 Sep 2025 01:17:35 +0200 Subject: [PATCH 03/49] Make `struct.align` chainable --- Assets/Lua/Doom/dsda-data.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/Assets/Lua/Doom/dsda-data.lua b/Assets/Lua/Doom/dsda-data.lua index f5872c653e8..b435d1b04e2 100644 --- a/Assets/Lua/Doom/dsda-data.lua +++ b/Assets/Lua/Doom/dsda-data.lua @@ -33,6 +33,7 @@ function dsda.struct_layout(struct) --print(string.format("%i bytes padding", alignment - (struct.size % alignment))) struct.pad(alignment - (struct.size % alignment)) end + return struct end function struct.pad(size) struct.size = struct.size + size From 6bc8ab0ee3b4092a20ef3b0228365fd65cec2467 Mon Sep 17 00:00:00 2001 From: kalimag Date: Wed, 24 Sep 2025 01:18:40 +0200 Subject: [PATCH 04/49] Add `u16` and `float` --- Assets/Lua/Doom/dsda-data.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Assets/Lua/Doom/dsda-data.lua b/Assets/Lua/Doom/dsda-data.lua index b435d1b04e2..e1de977c655 100644 --- a/Assets/Lua/Doom/dsda-data.lua +++ b/Assets/Lua/Doom/dsda-data.lua @@ -43,8 +43,10 @@ function dsda.struct_layout(struct) function struct.s16 (name) return struct.add(name, 2, true) end function struct.s32 (name) return struct.add(name, 4, true) end function struct.u8 (name) return struct.add(name, 1, true) end + function struct.u16 (name) return struct.add(name, 2, true) end function struct.u32 (name) return struct.add(name, 4, true) end function struct.u64 (name) return struct.add(name, 8, true) end + function struct.float(name) return struct.add(name, 4, true) end function struct.ptr (name) return struct.u64(name) end function struct.bool (name) return struct.s32(name) end function struct.array(name, type, count, ...) From 1350e5eb9450806118798484849c55b918df830e Mon Sep 17 00:00:00 2001 From: kalimag Date: Wed, 24 Sep 2025 01:44:30 +0200 Subject: [PATCH 05/49] Add sector and line definitions --- Assets/Lua/Doom/dsda-data.lua | 121 +++++++++++++++++++++++++++++++ Assets/Lua/Doom/things-lines.lua | 10 +-- 2 files changed, 126 insertions(+), 5 deletions(-) diff --git a/Assets/Lua/Doom/dsda-data.lua b/Assets/Lua/Doom/dsda-data.lua index e1de977c655..86fa1c20f27 100644 --- a/Assets/Lua/Doom/dsda-data.lua +++ b/Assets/Lua/Doom/dsda-data.lua @@ -9,6 +9,7 @@ dsda.MAX_PLAYERS = 4 dsda.LINE_SIZE = 256 -- sizeof(line_t) is 232, but we padded it for niceness dsda.MOBJ_SIZE = 512 -- sizeof(mobj_t) is 464, but we padded it for niceness dsda.PLAYER_SIZE = 1024 -- sizeof(player_t) is 729, but we padded it for niceness +dsda.SECTOR_SIZE = 512 -- sizeof(sector_t) is 344, but we padded it for niceness @@ -156,6 +157,126 @@ dsda.mobj = dsda.struct_layout() .s32("iden_nums") -- the rest are non-doom +-- sector_t https://github.com/TASEmulators/dsda-doom/blob/5608ee441410ecae10a17ecdbe1940bd4e1a2856/prboom2/src/r_defs.h#L124-L213 +dsda.sector = dsda.struct_layout() + .s32 ("iSectorID") + .u32 ("flags") + .s32 ("floorheight") + .s32 ("ceilingheight") + .u8 ("soundtraversed") + .ptr ("soundtarget") + .array("blockbox", "s32", 4) +-- .array("bbox", "s32", 4) + .s32 ("bbox_top") + .s32 ("bbox_bottom") + .s32 ("bbox_left") + .s32 ("bbox_right") + .add ("soundorg", 60, 8) -- degenmobj_t; + .s32 ("validcount") + .s32 ("gl_validcount") + .ptr ("thinglist") + .s32 ("friction") + .s32 ("movefactor") + .ptr ("floordata") + .ptr ("ceilingdata") + .ptr ("lightingdata") + .s8 ("stairlock") + .s32 ("prevsec") + .s32 ("nextsec") + .s32 ("heightsec") + .s16 ("bottommap") + .s16 ("midmapmap") + .s16 ("topmap") + .s16 ("colormap") + .ptr ("touching_thinglist") + .s32 ("linecount") + .ptr ("lines") + .s32 ("floorsky") + .s32 ("ceilingsky") + .s32 ("floor_xoffs") + .s32 ("floor_yoffs") + .s32 ("ceiling_xoffs") + .s32 ("ceiling_yoffs") + .s32 ("floorlightsec") + .s32 ("ceilinglightsec") + .s16 ("floorpic") + .s16 ("ceilingpic") + .s16 ("lightlevel") + .s16 ("special") + .s16 ("tag") + .s32 ("cachedheight") + .s32 ("scaleindex") + -- e6y + .s32 ("INTERP_SectorFloor") + .s32 ("INTERP_SectorCeiling") + .s32 ("INTERP_FloorPanning") + .s32 ("INTERP_CeilingPanning") + .array("fakegroup", "s32", 2) + -- hexen + .s32 ("seqType") -- seqtype_t + -- zdoom + .s32 ("gravity") + -- begin damage_t + .s16 ("damage_amount") + .u8 ("damage_leakrate") + .u8 ("damage_interval") + .align(2) + -- end damage_t + .s16 ("lightlevel_floor") + .s16 ("lightlevel_ceiling") + .u32 ("floor_rotation") + .u32 ("ceiling_rotation") + .s32 ("floor_xscale") + .s32 ("floor_yscale") + .s32 ("ceiling_xscale") + .s32 ("ceiling_yscale") + +-- line_t https://github.com/TASEmulators/dsda-doom/blob/5608ee441410ecae10a17ecdbe1940bd4e1a2856/prboom2/src/r_defs.h#L312-L347 +-- followed by v1, v2 coords +dsda.line = dsda.struct_layout() + .s32 ("iLineID") + .ptr ("v1") + .ptr ("v2") + .s32 ("dx") + .s32 ("dy") + .float("texel_length") + .u32 ("flags") + .s16 ("special") + .s16 ("tag") + .array("sidenum", "u16", 2) +-- .array("bbox", "s32", 4) + .s32 ("bbox_top") + .s32 ("bbox_bottom") + .s32 ("bbox_left") + .s32 ("bbox_right") + .s32 ("slopetype") -- slopetype_t + .ptr ("frontsector") + .ptr ("backsector") + .s32 ("validcount") + .s32 ("validcount2") + .ptr ("specialdata") + .s32 ("r_validcount") + .u8 ("r_flags") + .add ("soundorg", 60, 8) -- degenmobj_t; + -- dsda + .u8 ("player_activation") + -- hexen + .array("special_args", "u32", 5) + -- zdoom + .u16 ("activation") + .u8 ("locknumber") + .s32 ("automap_style") -- automap_style_t + .s32 ("health") + .s32 ("healthgroup") + .ptr ("tranmap") + .float("alpha") + .align(8) + -- BizHawk + .s32 ("v1_x") + .s32 ("v1_y") + .s32 ("v2_x") + .s32 ("v2_y") + -- Enums --- diff --git a/Assets/Lua/Doom/things-lines.lua b/Assets/Lua/Doom/things-lines.lua index 4238bcb2e74..12e3f0f8928 100644 --- a/Assets/Lua/Doom/things-lines.lua +++ b/Assets/Lua/Doom/things-lines.lua @@ -47,6 +47,7 @@ local LastScreenSize = { -- forward declarations local PlayerOffsets = dsda.player.offsets-- player member offsets in bytes local MobjOffsets = dsda.mobj.offsets-- mobj member offsets in bytes +local LineOffsets = dsda.line.offsets-- line member offsets in bytes local MobjType = dsda.doom.mobjtype local SpriteNumber = dsda.doom.spritenum local Objects = {} @@ -192,11 +193,10 @@ local function iterate() if id == OUT_OF_BOUNDS then break end if id ~= NULL_OBJECT then - local vertices_offset = 0xe8 - local v1 = { x = rls(addr+vertices_offset , "Lines"), - y = -rls(addr+vertices_offset+ 4, "Lines") } - local v2 = { x = rls(addr+vertices_offset+ 8, "Lines"), - y = -rls(addr+vertices_offset+12, "Lines") } + local v1 = { x = rls(addr+LineOffsets.v1_x, "Lines"), + y = -rls(addr+LineOffsets.v1_y, "Lines") } + local v2 = { x = rls(addr+LineOffsets.v2_x, "Lines"), + y = -rls(addr+LineOffsets.v2_y, "Lines") } line( mapify_x(v1.x), mapify_y(v1.y), From 0e46c1bf3a37478b9553c045dd4db08111af2df1 Mon Sep 17 00:00:00 2001 From: kalimag Date: Wed, 24 Sep 2025 01:51:04 +0200 Subject: [PATCH 06/49] Add links to source --- Assets/Lua/Doom/dsda-data.lua | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Assets/Lua/Doom/dsda-data.lua b/Assets/Lua/Doom/dsda-data.lua index 86fa1c20f27..28535ce8382 100644 --- a/Assets/Lua/Doom/dsda-data.lua +++ b/Assets/Lua/Doom/dsda-data.lua @@ -60,6 +60,7 @@ function dsda.struct_layout(struct) return struct end +-- player_t https://github.com/TASEmulators/dsda-doom/blob/5608ee441410ecae10a17ecdbe1940bd4e1a2856/prboom2/src/d_player.h#L143-L267 dsda.player = dsda.struct_layout() .ptr ("mobj") .s32 ("playerstate") @@ -103,6 +104,7 @@ dsda.player = dsda.struct_layout() .u32 ("prev_viewpitch") -- the rest are non-doom +-- mobj_t https://github.com/TASEmulators/dsda-doom/blob/5608ee441410ecae10a17ecdbe1940bd4e1a2856/prboom2/src/p_mobj.h#L277-L413 dsda.mobj = dsda.struct_layout() .add("thinker", 44, 8) .s32("x") @@ -283,6 +285,7 @@ dsda.line = dsda.struct_layout() dsda.doom = {} +-- mobjtype_t https://github.com/TASEmulators/dsda-doom/blob/5608ee441410ecae10a17ecdbe1940bd4e1a2856/prboom2/src/info.h#L5778-L6498 dsda.doom.mobjtype = { -- [-1] = "NULL", [ 0] = "PLAYER", @@ -429,6 +432,7 @@ dsda.doom.mobjtype = { "PLASMA2" } +-- spritenum_t https://github.com/TASEmulators/dsda-doom/blob/5608ee441410ecae10a17ecdbe1940bd4e1a2856/prboom2/src/info.h#L50-L632 dsda.doom.spritenum = { [0] = "TROO", "SHTG", From c53f8e92072aac640ebed0fe050e82c31e841c0c Mon Sep 17 00:00:00 2001 From: kalimag Date: Wed, 24 Sep 2025 02:05:17 +0200 Subject: [PATCH 07/49] Highlight special lines --- Assets/Lua/Doom/things-lines.lua | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Assets/Lua/Doom/things-lines.lua b/Assets/Lua/Doom/things-lines.lua index 12e3f0f8928..090d094eb1f 100644 --- a/Assets/Lua/Doom/things-lines.lua +++ b/Assets/Lua/Doom/things-lines.lua @@ -193,16 +193,21 @@ local function iterate() if id == OUT_OF_BOUNDS then break end if id ~= NULL_OBJECT then + local special = rws(addr+LineOffsets.special, "Lines") local v1 = { x = rls(addr+LineOffsets.v1_x, "Lines"), y = -rls(addr+LineOffsets.v1_y, "Lines") } local v2 = { x = rls(addr+LineOffsets.v2_x, "Lines"), y = -rls(addr+LineOffsets.v2_y, "Lines") } + + local color + if special ~= 0 then color = 0xffcc00ff end + line( mapify_x(v1.x), mapify_y(v1.y), mapify_x(v2.x), mapify_y(v2.y), - 0xffcccccc) + color or 0xffcccccc) end end end From db6b1822444cebbab8188df0f90198b3dfa9b6df Mon Sep 17 00:00:00 2001 From: kalimag Date: Wed, 24 Sep 2025 15:59:12 +0200 Subject: [PATCH 08/49] Complete player and mobj defs --- Assets/Lua/Doom/dsda-data.lua | 59 +++++++++++++++++++++++++++++------ 1 file changed, 50 insertions(+), 9 deletions(-) diff --git a/Assets/Lua/Doom/dsda-data.lua b/Assets/Lua/Doom/dsda-data.lua index 28535ce8382..5ce32be411e 100644 --- a/Assets/Lua/Doom/dsda-data.lua +++ b/Assets/Lua/Doom/dsda-data.lua @@ -63,7 +63,7 @@ end -- player_t https://github.com/TASEmulators/dsda-doom/blob/5608ee441410ecae10a17ecdbe1940bd4e1a2856/prboom2/src/d_player.h#L143-L267 dsda.player = dsda.struct_layout() .ptr ("mobj") - .s32 ("playerstate") + .s32 ("playerstate") -- playerstate_t .add ("cmd", 14, 2) .s32 ("viewz") .s32 ("viewheight") @@ -76,8 +76,8 @@ dsda.player = dsda.struct_layout() .array("cards", "bool", 11) .bool ("backpack") .array("frags", "s32", 8) - .s32 ("readyweapon") - .s32 ("pendingweapon") + .s32 ("readyweapon") -- weapontype_t + .s32 ("pendingweapon") -- weapontype_t .array("weaponowned", "bool", 9) .array("ammo", "s32", 6) .array("maxammo", "s32", 6) @@ -94,7 +94,7 @@ dsda.player = dsda.struct_layout() .s32 ("extralight") .s32 ("fixedcolormap") .s32 ("colormap") - .add ("psprites", 24*2, 8) + .add ("psprites", 24*2, 8) -- pspdef_t[2] .bool ("didsecret") .s32 ("momx") .s32 ("mony") @@ -102,7 +102,31 @@ dsda.player = dsda.struct_layout() .s32 ("prev_viewz") .u32 ("prev_viewangle") .u32 ("prev_viewpitch") - -- the rest are non-doom + -- heretic + .s32 ("flyheight") + .s32 ("lookdir") + .bool ("centering") + .array("inventory", "s32", 33*2) -- inventory_t { int type, int count } + .s32 ("readyArtifact") -- artitype_t + .s32 ("artifactCount") + .s32 ("inventorySlotNum") + .s32 ("flamecount") + .s32 ("chickenTics") + .s32 ("chickenPeck") + .ptr ("rain1") + .ptr ("rain2") + -- hexen + .s32 ("pclass") -- pclass_t + .s32 ("morphTics") + .s32 ("pieces") + .s16 ("yellowMessage") + .s32 ("poisoncount") + .ptr ("poisoner") + .u32 ("jumpTics") + .u32 ("worldTimer") + -- zdoom + .s32 ("hazardcount") + .u8 ("hazardinterval") -- mobj_t https://github.com/TASEmulators/dsda-doom/blob/5608ee441410ecae10a17ecdbe1940bd4e1a2856/prboom2/src/p_mobj.h#L277-L413 dsda.mobj = dsda.struct_layout() @@ -113,7 +137,7 @@ dsda.mobj = dsda.struct_layout() .ptr("snext") .ptr("sprev") .u32("angle") - .s32("sprite") + .s32("sprite") -- spritenum_t .s32("frame") .ptr("bnext") .ptr("bprev") @@ -127,7 +151,7 @@ dsda.mobj = dsda.struct_layout() .s32("momy") .s32("momz") .s32("validcount") - .s32("type") + .s32("type") -- mobjtype_t .ptr("info") .s32("tics") .ptr("state") @@ -144,7 +168,7 @@ dsda.mobj = dsda.struct_layout() .s16("gear") .ptr("player") .s16("lastlook") - .add("spawnpoint", 58, 4) + .add("spawnpoint", 58, 4) -- mapthing_t .ptr("tracer") .ptr("lastenemy") .s32("friction") @@ -157,7 +181,24 @@ dsda.mobj = dsda.struct_layout() .s32("index") .s16("patch_width") .s32("iden_nums") - -- the rest are non-doom + -- heretic + .s32 ("damage") + .u64 ("flags2") + .add ("special1", 16, 8) -- specialval_t + .add ("special2", 16, 8) -- specialval_t + -- hexen + .s32 ("floorpic") + .s32 ("floorclip") + .s32 ("archiveNum") + .s16 ("tid") + .s32 ("special") + .array("special_args", "s32", 5) + -- zdoom + .s32 ("gravity") + .float("alpha") + -- misc + .u8 ("color") + .ptr ("tranmap") -- sector_t https://github.com/TASEmulators/dsda-doom/blob/5608ee441410ecae10a17ecdbe1940bd4e1a2856/prboom2/src/r_defs.h#L124-L213 dsda.sector = dsda.struct_layout() From 132322c3562c1544ea3c8826c9f3810bed1a0f65 Mon Sep 17 00:00:00 2001 From: kalimag Date: Wed, 24 Sep 2025 16:01:26 +0200 Subject: [PATCH 09/49] Spacing --- Assets/Lua/Doom/dsda-data.lua | 102 +++++++++++++++++----------------- 1 file changed, 51 insertions(+), 51 deletions(-) diff --git a/Assets/Lua/Doom/dsda-data.lua b/Assets/Lua/Doom/dsda-data.lua index 5ce32be411e..f2db0cfd687 100644 --- a/Assets/Lua/Doom/dsda-data.lua +++ b/Assets/Lua/Doom/dsda-data.lua @@ -130,57 +130,57 @@ dsda.player = dsda.struct_layout() -- mobj_t https://github.com/TASEmulators/dsda-doom/blob/5608ee441410ecae10a17ecdbe1940bd4e1a2856/prboom2/src/p_mobj.h#L277-L413 dsda.mobj = dsda.struct_layout() - .add("thinker", 44, 8) - .s32("x") - .s32("y") - .s32("z") - .ptr("snext") - .ptr("sprev") - .u32("angle") - .s32("sprite") -- spritenum_t - .s32("frame") - .ptr("bnext") - .ptr("bprev") - .ptr("subsector") - .s32("floorz") - .s32("ceilingz") - .s32("dropoffz") - .s32("radius") - .s32("height") - .s32("momx") - .s32("momy") - .s32("momz") - .s32("validcount") - .s32("type") -- mobjtype_t - .ptr("info") - .s32("tics") - .ptr("state") - .u64("flags") - .s32("intflags") - .s32("health") - .s16("movedir") - .s16("movecount") - .s16("strafecount") - .ptr("target") - .s16("reactiontime") - .s16("threshold") - .s16("pursuecount") - .s16("gear") - .ptr("player") - .s16("lastlook") - .add("spawnpoint", 58, 4) -- mapthing_t - .ptr("tracer") - .ptr("lastenemy") - .s32("friction") - .s32("movefactor") - .ptr("touching_sectorlist") - .s32("PrevX") - .s32("PrevY") - .s32("PrevZ") - .u32("pitch") - .s32("index") - .s16("patch_width") - .s32("iden_nums") + .add ("thinker", 44, 8) + .s32 ("x") + .s32 ("y") + .s32 ("z") + .ptr ("snext") + .ptr ("sprev") + .u32 ("angle") + .s32 ("sprite") -- spritenum_t + .s32 ("frame") + .ptr ("bnext") + .ptr ("bprev") + .ptr ("subsector") + .s32 ("floorz") + .s32 ("ceilingz") + .s32 ("dropoffz") + .s32 ("radius") + .s32 ("height") + .s32 ("momx") + .s32 ("momy") + .s32 ("momz") + .s32 ("validcount") + .s32 ("type") -- mobjtype_t + .ptr ("info") + .s32 ("tics") + .ptr ("state") + .u64 ("flags") + .s32 ("intflags") + .s32 ("health") + .s16 ("movedir") + .s16 ("movecount") + .s16 ("strafecount") + .ptr ("target") + .s16 ("reactiontime") + .s16 ("threshold") + .s16 ("pursuecount") + .s16 ("gear") + .ptr ("player") + .s16 ("lastlook") + .add ("spawnpoint", 58, 4) -- mapthing_t + .ptr ("tracer") + .ptr ("lastenemy") + .s32 ("friction") + .s32 ("movefactor") + .ptr ("touching_sectorlist") + .s32 ("PrevX") + .s32 ("PrevY") + .s32 ("PrevZ") + .u32 ("pitch") + .s32 ("index") + .s16 ("patch_width") + .s32 ("iden_nums") -- heretic .s32 ("damage") .u64 ("flags2") From 8b41bb1f018a8afaf4562c1d1e98d767d2827494 Mon Sep 17 00:00:00 2001 From: kalimag Date: Fri, 26 Sep 2025 18:09:05 +0200 Subject: [PATCH 10/49] Add Heretic and Hexen enum values --- Assets/Lua/Doom/dsda-data.lua | 1030 +++++++++++++++++++++++++++++- Assets/Lua/Doom/things-lines.lua | 2 +- 2 files changed, 1026 insertions(+), 6 deletions(-) diff --git a/Assets/Lua/Doom/dsda-data.lua b/Assets/Lua/Doom/dsda-data.lua index f2db0cfd687..97dd91a8413 100644 --- a/Assets/Lua/Doom/dsda-data.lua +++ b/Assets/Lua/Doom/dsda-data.lua @@ -1,4 +1,8 @@ -local dsda = {} +local dsda = { + doom = {}, + heretic = {}, + hexen = {}, +} @@ -324,10 +328,21 @@ dsda.line = dsda.struct_layout() -- Enums --- -dsda.doom = {} +-- Assign (v, k) for every (k, v) so that the enums can be accessed by name, e.g. `mobjtype.PLAYER` +local function assign_keys(table, from, to) + for i = from or 0, to or math.huge do + local name = table[i] + if name ~= nil then + --assert(table[name] == nil, "duplicate name "..name) + table[name] = i + elseif to == nil then + return + end + end +end -- mobjtype_t https://github.com/TASEmulators/dsda-doom/blob/5608ee441410ecae10a17ecdbe1940bd4e1a2856/prboom2/src/info.h#L5778-L6498 -dsda.doom.mobjtype = { +dsda.mobjtype = { -- [-1] = "NULL", [ 0] = "PLAYER", "POSSESSED", @@ -470,8 +485,574 @@ dsda.doom.mobjtype = { "PULL", "DOGS", "PLASMA1", - "PLASMA2" + "PLASMA2", + "SCEPTRE", + "BIBLE", + "MUSICSOURCE", + "DOOM_NUMMOBJTYPES", + "HERETIC_MISC0", + "HERETIC_ITEMSHIELD1", + "HERETIC_ITEMSHIELD2", + "HERETIC_MISC1", + "HERETIC_MISC2", + "HERETIC_ARTIINVISIBILITY", + "HERETIC_MISC3", + "HERETIC_ARTIFLY", + "HERETIC_ARTIINVULNERABILITY", + "HERETIC_ARTITOMEOFPOWER", + "HERETIC_ARTIEGG", + "HERETIC_EGGFX", + "HERETIC_ARTISUPERHEAL", + "HERETIC_MISC4", + "HERETIC_MISC5", + "HERETIC_FIREBOMB", + "HERETIC_ARTITELEPORT", + "HERETIC_POD", + "HERETIC_PODGOO", + "HERETIC_PODGENERATOR", + "HERETIC_SPLASH", + "HERETIC_SPLASHBASE", + "HERETIC_LAVASPLASH", + "HERETIC_LAVASMOKE", + "HERETIC_SLUDGECHUNK", + "HERETIC_SLUDGESPLASH", + "HERETIC_SKULLHANG70", + "HERETIC_SKULLHANG60", + "HERETIC_SKULLHANG45", + "HERETIC_SKULLHANG35", + "HERETIC_CHANDELIER", + "HERETIC_SERPTORCH", + "HERETIC_SMALLPILLAR", + "HERETIC_STALAGMITESMALL", + "HERETIC_STALAGMITELARGE", + "HERETIC_STALACTITESMALL", + "HERETIC_STALACTITELARGE", + "HERETIC_MISC6", + "HERETIC_BARREL", + "HERETIC_MISC7", + "HERETIC_MISC8", + "HERETIC_MISC9", + "HERETIC_MISC10", + "HERETIC_MISC11", + "HERETIC_KEYGIZMOBLUE", + "HERETIC_KEYGIZMOGREEN", + "HERETIC_KEYGIZMOYELLOW", + "HERETIC_KEYGIZMOFLOAT", + "HERETIC_MISC12", + "HERETIC_VOLCANOBLAST", + "HERETIC_VOLCANOTBLAST", + "HERETIC_TELEGLITGEN", + "HERETIC_TELEGLITGEN2", + "HERETIC_TELEGLITTER", + "HERETIC_TELEGLITTER2", + "HERETIC_TFOG", + "HERETIC_TELEPORTMAN", + "HERETIC_STAFFPUFF", + "HERETIC_STAFFPUFF2", + "HERETIC_BEAKPUFF", + "HERETIC_MISC13", + "HERETIC_GAUNTLETPUFF1", + "HERETIC_GAUNTLETPUFF2", + "HERETIC_MISC14", + "HERETIC_BLASTERFX1", + "HERETIC_BLASTERSMOKE", + "HERETIC_RIPPER", + "HERETIC_BLASTERPUFF1", + "HERETIC_BLASTERPUFF2", + "HERETIC_WMACE", + "HERETIC_MACEFX1", + "HERETIC_MACEFX2", + "HERETIC_MACEFX3", + "HERETIC_MACEFX4", + "HERETIC_WSKULLROD", + "HERETIC_HORNRODFX1", + "HERETIC_HORNRODFX2", + "HERETIC_RAINPLR1", + "HERETIC_RAINPLR2", + "HERETIC_RAINPLR3", + "HERETIC_RAINPLR4", + "HERETIC_GOLDWANDFX1", + "HERETIC_GOLDWANDFX2", + "HERETIC_GOLDWANDPUFF1", + "HERETIC_GOLDWANDPUFF2", + "HERETIC_WPHOENIXROD", + "HERETIC_PHOENIXFX1", + "HERETIC_PHOENIXFX_REMOVED", + "HERETIC_PHOENIXPUFF", + "HERETIC_PHOENIXFX2", + "HERETIC_MISC15", + "HERETIC_CRBOWFX1", + "HERETIC_CRBOWFX2", + "HERETIC_CRBOWFX3", + "HERETIC_CRBOWFX4", + "HERETIC_BLOOD", + "HERETIC_BLOODSPLATTER", + "HERETIC_PLAYER", + "HERETIC_BLOODYSKULL", + "HERETIC_CHICPLAYER", + "HERETIC_CHICKEN", + "HERETIC_FEATHER", + "HERETIC_MUMMY", + "HERETIC_MUMMYLEADER", + "HERETIC_MUMMYGHOST", + "HERETIC_MUMMYLEADERGHOST", + "HERETIC_MUMMYSOUL", + "HERETIC_MUMMYFX1", + "HERETIC_BEAST", + "HERETIC_BEASTBALL", + "HERETIC_BURNBALL", + "HERETIC_BURNBALLFB", + "HERETIC_PUFFY", + "HERETIC_SNAKE", + "HERETIC_SNAKEPRO_A", + "HERETIC_SNAKEPRO_B", + "HERETIC_HEAD", + "HERETIC_HEADFX1", + "HERETIC_HEADFX2", + "HERETIC_HEADFX3", + "HERETIC_WHIRLWIND", + "HERETIC_CLINK", + "HERETIC_WIZARD", + "HERETIC_WIZFX1", + "HERETIC_IMP", + "HERETIC_IMPLEADER", + "HERETIC_IMPCHUNK1", + "HERETIC_IMPCHUNK2", + "HERETIC_IMPBALL", + "HERETIC_KNIGHT", + "HERETIC_KNIGHTGHOST", + "HERETIC_KNIGHTAXE", + "HERETIC_REDAXE", + "HERETIC_SORCERER1", + "HERETIC_SRCRFX1", + "HERETIC_SORCERER2", + "HERETIC_SOR2FX1", + "HERETIC_SOR2FXSPARK", + "HERETIC_SOR2FX2", + "HERETIC_SOR2TELEFADE", + "HERETIC_MINOTAUR", + "HERETIC_MNTRFX1", + "HERETIC_MNTRFX2", + "HERETIC_MNTRFX3", + "HERETIC_AKYY", + "HERETIC_BKYY", + "HERETIC_CKEY", + "HERETIC_AMGWNDWIMPY", + "HERETIC_AMGWNDHEFTY", + "HERETIC_AMMACEWIMPY", + "HERETIC_AMMACEHEFTY", + "HERETIC_AMCBOWWIMPY", + "HERETIC_AMCBOWHEFTY", + "HERETIC_AMSKRDWIMPY", + "HERETIC_AMSKRDHEFTY", + "HERETIC_AMPHRDWIMPY", + "HERETIC_AMPHRDHEFTY", + "HERETIC_AMBLSRWIMPY", + "HERETIC_AMBLSRHEFTY", + "HERETIC_SOUNDWIND", + "HERETIC_SOUNDWATERFALL", + "HERETIC_NUMMOBJTYPES", + "HEXEN_MAPSPOT", + "HEXEN_MAPSPOTGRAVITY", + "HEXEN_FIREBALL1", + "HEXEN_ARROW", + "HEXEN_DART", + "HEXEN_POISONDART", + "HEXEN_RIPPERBALL", + "HEXEN_PROJECTILE_BLADE", + "HEXEN_ICESHARD", + "HEXEN_FLAME_SMALL_TEMP", + "HEXEN_FLAME_LARGE_TEMP", + "HEXEN_FLAME_SMALL", + "HEXEN_FLAME_LARGE", + "HEXEN_HEALINGBOTTLE", + "HEXEN_HEALTHFLASK", + "HEXEN_ARTIFLY", + "HEXEN_ARTIINVULNERABILITY", + "HEXEN_SUMMONMAULATOR", + "HEXEN_SUMMON_FX", + "HEXEN_THRUSTFLOOR_UP", + "HEXEN_THRUSTFLOOR_DOWN", + "HEXEN_TELEPORTOTHER", + "HEXEN_TELOTHER_FX1", + "HEXEN_TELOTHER_FX2", + "HEXEN_TELOTHER_FX3", + "HEXEN_TELOTHER_FX4", + "HEXEN_TELOTHER_FX5", + "HEXEN_DIRT1", + "HEXEN_DIRT2", + "HEXEN_DIRT3", + "HEXEN_DIRT4", + "HEXEN_DIRT5", + "HEXEN_DIRT6", + "HEXEN_DIRTCLUMP", + "HEXEN_ROCK1", + "HEXEN_ROCK2", + "HEXEN_ROCK3", + "HEXEN_FOGSPAWNER", + "HEXEN_FOGPATCHS", + "HEXEN_FOGPATCHM", + "HEXEN_FOGPATCHL", + "HEXEN_QUAKE_FOCUS", + "HEXEN_SGSHARD1", + "HEXEN_SGSHARD2", + "HEXEN_SGSHARD3", + "HEXEN_SGSHARD4", + "HEXEN_SGSHARD5", + "HEXEN_SGSHARD6", + "HEXEN_SGSHARD7", + "HEXEN_SGSHARD8", + "HEXEN_SGSHARD9", + "HEXEN_SGSHARD0", + "HEXEN_ARTIEGG", + "HEXEN_EGGFX", + "HEXEN_ARTISUPERHEAL", + "HEXEN_ZWINGEDSTATUENOSKULL", + "HEXEN_ZGEMPEDESTAL", + "HEXEN_ARTIPUZZSKULL", + "HEXEN_ARTIPUZZGEMBIG", + "HEXEN_ARTIPUZZGEMRED", + "HEXEN_ARTIPUZZGEMGREEN1", + "HEXEN_ARTIPUZZGEMGREEN2", + "HEXEN_ARTIPUZZGEMBLUE1", + "HEXEN_ARTIPUZZGEMBLUE2", + "HEXEN_ARTIPUZZBOOK1", + "HEXEN_ARTIPUZZBOOK2", + "HEXEN_ARTIPUZZSKULL2", + "HEXEN_ARTIPUZZFWEAPON", + "HEXEN_ARTIPUZZCWEAPON", + "HEXEN_ARTIPUZZMWEAPON", + "HEXEN_ARTIPUZZGEAR", + "HEXEN_ARTIPUZZGEAR2", + "HEXEN_ARTIPUZZGEAR3", + "HEXEN_ARTIPUZZGEAR4", + "HEXEN_ARTITORCH", + "HEXEN_FIREBOMB", + "HEXEN_ARTITELEPORT", + "HEXEN_ARTIPOISONBAG", + "HEXEN_POISONBAG", + "HEXEN_POISONCLOUD", + "HEXEN_THROWINGBOMB", + "HEXEN_SPEEDBOOTS", + "HEXEN_BOOSTMANA", + "HEXEN_BOOSTARMOR", + "HEXEN_BLASTRADIUS", + "HEXEN_HEALRADIUS", + "HEXEN_SPLASH", + "HEXEN_SPLASHBASE", + "HEXEN_LAVASPLASH", + "HEXEN_LAVASMOKE", + "HEXEN_SLUDGECHUNK", + "HEXEN_SLUDGESPLASH", + "HEXEN_MISC0", + "HEXEN_MISC1", + "HEXEN_MISC2", + "HEXEN_MISC3", + "HEXEN_MISC4", + "HEXEN_MISC5", + "HEXEN_MISC6", + "HEXEN_MISC7", + "HEXEN_MISC8", + "HEXEN_TREEDESTRUCTIBLE", + "HEXEN_MISC9", + "HEXEN_MISC10", + "HEXEN_MISC11", + "HEXEN_MISC12", + "HEXEN_MISC13", + "HEXEN_MISC14", + "HEXEN_MISC15", + "HEXEN_MISC16", + "HEXEN_MISC17", + "HEXEN_MISC18", + "HEXEN_MISC19", + "HEXEN_MISC20", + "HEXEN_MISC21", + "HEXEN_MISC22", + "HEXEN_MISC23", + "HEXEN_MISC24", + "HEXEN_MISC25", + "HEXEN_MISC26", + "HEXEN_MISC27", + "HEXEN_MISC28", + "HEXEN_MISC29", + "HEXEN_MISC30", + "HEXEN_MISC31", + "HEXEN_MISC32", + "HEXEN_MISC33", + "HEXEN_MISC34", + "HEXEN_MISC35", + "HEXEN_MISC36", + "HEXEN_MISC37", + "HEXEN_MISC38", + "HEXEN_MISC39", + "HEXEN_MISC40", + "HEXEN_MISC41", + "HEXEN_MISC42", + "HEXEN_MISC43", + "HEXEN_MISC44", + "HEXEN_MISC45", + "HEXEN_MISC46", + "HEXEN_MISC47", + "HEXEN_MISC48", + "HEXEN_MISC49", + "HEXEN_MISC50", + "HEXEN_MISC51", + "HEXEN_MISC52", + "HEXEN_MISC53", + "HEXEN_MISC54", + "HEXEN_MISC55", + "HEXEN_MISC56", + "HEXEN_MISC57", + "HEXEN_MISC58", + "HEXEN_MISC59", + "HEXEN_MISC60", + "HEXEN_MISC61", + "HEXEN_MISC62", + "HEXEN_MISC63", + "HEXEN_MISC64", + "HEXEN_MISC65", + "HEXEN_MISC66", + "HEXEN_MISC67", + "HEXEN_MISC68", + "HEXEN_MISC69", + "HEXEN_MISC70", + "HEXEN_MISC71", + "HEXEN_MISC72", + "HEXEN_MISC73", + "HEXEN_MISC74", + "HEXEN_MISC75", + "HEXEN_MISC76", + "HEXEN_POTTERY1", + "HEXEN_POTTERY2", + "HEXEN_POTTERY3", + "HEXEN_POTTERYBIT1", + "HEXEN_MISC77", + "HEXEN_ZLYNCHED_NOHEART", + "HEXEN_MISC78", + "HEXEN_CORPSEBIT", + "HEXEN_CORPSEBLOODDRIP", + "HEXEN_BLOODPOOL", + "HEXEN_MISC79", + "HEXEN_MISC80", + "HEXEN_LEAF1", + "HEXEN_LEAF2", + "HEXEN_ZTWINEDTORCH", + "HEXEN_ZTWINEDTORCH_UNLIT", + "HEXEN_BRIDGE", + "HEXEN_BRIDGEBALL", + "HEXEN_ZWALLTORCH", + "HEXEN_ZWALLTORCH_UNLIT", + "HEXEN_ZBARREL", + "HEXEN_ZSHRUB1", + "HEXEN_ZSHRUB2", + "HEXEN_ZBUCKET", + "HEXEN_ZPOISONSHROOM", + "HEXEN_ZFIREBULL", + "HEXEN_ZFIREBULL_UNLIT", + "HEXEN_FIRETHING", + "HEXEN_BRASSTORCH", + "HEXEN_ZSUITOFARMOR", + "HEXEN_ZARMORCHUNK", + "HEXEN_ZBELL", + "HEXEN_ZBLUE_CANDLE", + "HEXEN_ZIRON_MAIDEN", + "HEXEN_ZXMAS_TREE", + "HEXEN_ZCAULDRON", + "HEXEN_ZCAULDRON_UNLIT", + "HEXEN_ZCHAINBIT32", + "HEXEN_ZCHAINBIT64", + "HEXEN_ZCHAINEND_HEART", + "HEXEN_ZCHAINEND_HOOK1", + "HEXEN_ZCHAINEND_HOOK2", + "HEXEN_ZCHAINEND_SPIKE", + "HEXEN_ZCHAINEND_SKULL", + "HEXEN_TABLE_SHIT1", + "HEXEN_TABLE_SHIT2", + "HEXEN_TABLE_SHIT3", + "HEXEN_TABLE_SHIT4", + "HEXEN_TABLE_SHIT5", + "HEXEN_TABLE_SHIT6", + "HEXEN_TABLE_SHIT7", + "HEXEN_TABLE_SHIT8", + "HEXEN_TABLE_SHIT9", + "HEXEN_TABLE_SHIT10", + "HEXEN_TFOG", + "HEXEN_MISC81", + "HEXEN_TELEPORTMAN", + "HEXEN_PUNCHPUFF", + "HEXEN_FW_AXE", + "HEXEN_AXEPUFF", + "HEXEN_AXEPUFF_GLOW", + "HEXEN_AXEBLOOD", + "HEXEN_FW_HAMMER", + "HEXEN_HAMMER_MISSILE", + "HEXEN_HAMMERPUFF", + "HEXEN_FSWORD_MISSILE", + "HEXEN_FSWORD_FLAME", + "HEXEN_CW_SERPSTAFF", + "HEXEN_CSTAFF_MISSILE", + "HEXEN_CSTAFFPUFF", + "HEXEN_CW_FLAME", + "HEXEN_CFLAMEFLOOR", + "HEXEN_FLAMEPUFF", + "HEXEN_FLAMEPUFF2", + "HEXEN_CIRCLEFLAME", + "HEXEN_CFLAME_MISSILE", + "HEXEN_HOLY_FX", + "HEXEN_HOLY_TAIL", + "HEXEN_HOLY_PUFF", + "HEXEN_HOLY_MISSILE", + "HEXEN_HOLY_MISSILE_PUFF", + "HEXEN_MWANDPUFF", + "HEXEN_MWANDSMOKE", + "HEXEN_MWAND_MISSILE", + "HEXEN_MW_LIGHTNING", + "HEXEN_LIGHTNING_CEILING", + "HEXEN_LIGHTNING_FLOOR", + "HEXEN_LIGHTNING_ZAP", + "HEXEN_MSTAFF_FX", + "HEXEN_MSTAFF_FX2", + "HEXEN_FW_SWORD1", + "HEXEN_FW_SWORD2", + "HEXEN_FW_SWORD3", + "HEXEN_CW_HOLY1", + "HEXEN_CW_HOLY2", + "HEXEN_CW_HOLY3", + "HEXEN_MW_STAFF1", + "HEXEN_MW_STAFF2", + "HEXEN_MW_STAFF3", + "HEXEN_SNOUTPUFF", + "HEXEN_MW_CONE", + "HEXEN_SHARDFX1", + "HEXEN_BLOOD", + "HEXEN_BLOODSPLATTER", + "HEXEN_GIBS", + "HEXEN_PLAYER_FIGHTER", + "HEXEN_BLOODYSKULL", + "HEXEN_PLAYER_SPEED", + "HEXEN_ICECHUNK", + "HEXEN_PLAYER_CLERIC", + "HEXEN_PLAYER_MAGE", + "HEXEN_PIGPLAYER", + "HEXEN_PIG", + "HEXEN_CENTAUR", + "HEXEN_CENTAURLEADER", + "HEXEN_CENTAUR_FX", + "HEXEN_CENTAUR_SHIELD", + "HEXEN_CENTAUR_SWORD", + "HEXEN_DEMON", + "HEXEN_DEMONCHUNK1", + "HEXEN_DEMONCHUNK2", + "HEXEN_DEMONCHUNK3", + "HEXEN_DEMONCHUNK4", + "HEXEN_DEMONCHUNK5", + "HEXEN_DEMONFX1", + "HEXEN_DEMON2", + "HEXEN_DEMON2CHUNK1", + "HEXEN_DEMON2CHUNK2", + "HEXEN_DEMON2CHUNK3", + "HEXEN_DEMON2CHUNK4", + "HEXEN_DEMON2CHUNK5", + "HEXEN_DEMON2FX1", + "HEXEN_WRAITHB", + "HEXEN_WRAITH", + "HEXEN_WRAITHFX1", + "HEXEN_WRAITHFX2", + "HEXEN_WRAITHFX3", + "HEXEN_WRAITHFX4", + "HEXEN_WRAITHFX5", + "HEXEN_MINOTAUR", + "HEXEN_MNTRFX1", + "HEXEN_MNTRFX2", + "HEXEN_MNTRFX3", + "HEXEN_MNTRSMOKE", + "HEXEN_MNTRSMOKEEXIT", + "HEXEN_SERPENT", + "HEXEN_SERPENTLEADER", + "HEXEN_SERPENTFX", + "HEXEN_SERPENT_HEAD", + "HEXEN_SERPENT_GIB1", + "HEXEN_SERPENT_GIB2", + "HEXEN_SERPENT_GIB3", + "HEXEN_BISHOP", + "HEXEN_BISHOP_PUFF", + "HEXEN_BISHOPBLUR", + "HEXEN_BISHOPPAINBLUR", + "HEXEN_BISH_FX", + "HEXEN_DRAGON", + "HEXEN_DRAGON_FX", + "HEXEN_DRAGON_FX2", + "HEXEN_ARMOR_1", + "HEXEN_ARMOR_2", + "HEXEN_ARMOR_3", + "HEXEN_ARMOR_4", + "HEXEN_MANA1", + "HEXEN_MANA2", + "HEXEN_MANA3", + "HEXEN_KEY1", + "HEXEN_KEY2", + "HEXEN_KEY3", + "HEXEN_KEY4", + "HEXEN_KEY5", + "HEXEN_KEY6", + "HEXEN_KEY7", + "HEXEN_KEY8", + "HEXEN_KEY9", + "HEXEN_KEYA", + "HEXEN_KEYB", + "HEXEN_SOUNDWIND", + "HEXEN_SOUNDWATERFALL", + "HEXEN_ETTIN", + "HEXEN_ETTIN_MACE", + "HEXEN_FIREDEMON", + "HEXEN_FIREDEMON_SPLOTCH1", + "HEXEN_FIREDEMON_SPLOTCH2", + "HEXEN_FIREDEMON_FX1", + "HEXEN_FIREDEMON_FX2", + "HEXEN_FIREDEMON_FX3", + "HEXEN_FIREDEMON_FX4", + "HEXEN_FIREDEMON_FX5", + "HEXEN_FIREDEMON_FX6", + "HEXEN_ICEGUY", + "HEXEN_ICEGUY_FX", + "HEXEN_ICEFX_PUFF", + "HEXEN_ICEGUY_FX2", + "HEXEN_ICEGUY_BIT", + "HEXEN_ICEGUY_WISP1", + "HEXEN_ICEGUY_WISP2", + "HEXEN_FIGHTER_BOSS", + "HEXEN_CLERIC_BOSS", + "HEXEN_MAGE_BOSS", + "HEXEN_SORCBOSS", + "HEXEN_SORCBALL1", + "HEXEN_SORCBALL2", + "HEXEN_SORCBALL3", + "HEXEN_SORCFX1", + "HEXEN_SORCFX2", + "HEXEN_SORCFX2_T1", + "HEXEN_SORCFX3", + "HEXEN_SORCFX3_EXPLOSION", + "HEXEN_SORCFX4", + "HEXEN_SORCSPARK1", + "HEXEN_BLASTEFFECT", + "HEXEN_WATER_DRIP", + "HEXEN_KORAX", + "HEXEN_KORAX_SPIRIT1", + "HEXEN_KORAX_SPIRIT2", + "HEXEN_KORAX_SPIRIT3", + "HEXEN_KORAX_SPIRIT4", + "HEXEN_KORAX_SPIRIT5", + "HEXEN_KORAX_SPIRIT6", + "HEXEN_DEMON_MASH", + "HEXEN_DEMON2_MASH", + "HEXEN_ETTIN_MASH", + "HEXEN_CENTAUR_MASH", + "HEXEN_KORAX_BOLT", + "HEXEN_BAT_SPAWNER", + "HEXEN_BAT", + "HEXEN_NUMMOBJTYPES", } +assign_keys(dsda.mobjtype) -- spritenum_t https://github.com/TASEmulators/dsda-doom/blob/5608ee441410ecae10a17ecdbe1940bd4e1a2856/prboom2/src/info.h#L50-L632 dsda.doom.spritenum = { @@ -619,7 +1200,446 @@ dsda.doom.spritenum = { "PLS2", "BON3", "BON4", - "BLD2" + "BLD2", +} +assign_keys(dsda.doom.spritenum) + +dsda.heretic.spritenum = { + [0] = "IMPX", + "ACLO", + "PTN1", + "SHLD", + "SHD2", + "BAGH", + "SPMP", + "INVS", + "PTN2", + "SOAR", + "INVU", + "PWBK", + "EGGC", + "EGGM", + "FX01", + "SPHL", + "TRCH", + "FBMB", + "XPL1", + "ATLP", + "PPOD", + "AMG1", + "SPSH", + "LVAS", + "SLDG", + "SKH1", + "SKH2", + "SKH3", + "SKH4", + "CHDL", + "SRTC", + "SMPL", + "STGS", + "STGL", + "STCS", + "STCL", + "KFR1", + "BARL", + "BRPL", + "MOS1", + "MOS2", + "WTRH", + "HCOR", + "KGZ1", + "KGZB", + "KGZG", + "KGZY", + "VLCO", + "VFBL", + "VTFB", + "SFFI", + "TGLT", + "TELE", + "STFF", + "PUF3", + "PUF4", + "BEAK", + "WGNT", + "GAUN", + "PUF1", + "WBLS", + "BLSR", + "FX18", + "FX17", + "WMCE", + "MACE", + "FX02", + "WSKL", + "HROD", + "FX00", + "FX20", + "FX21", + "FX22", + "FX23", + "GWND", + "PUF2", + "WPHX", + "PHNX", + "FX04", + "FX08", + "FX09", + "WBOW", + "CRBW", + "FX03", + "BLOD", + "PLAY", + "FDTH", + "BSKL", + "CHKN", + "MUMM", + "FX15", + "BEAS", + "FRB1", + "SNKE", + "SNFX", + "HEAD", + "FX05", + "FX06", + "FX07", + "CLNK", + "WZRD", + "FX11", + "FX10", + "KNIG", + "SPAX", + "RAXE", + "SRCR", + "FX14", + "SOR2", + "SDTH", + "FX16", + "MNTR", + "FX12", + "FX13", + "AKYY", + "BKYY", + "CKYY", + "AMG2", + "AMM1", + "AMM2", + "AMC1", + "AMC2", + "AMS1", + "AMS2", + "AMP1", + "AMP2", + "AMB1", + "AMB2", +} +assign_keys(dsda.heretic.spritenum) + +dsda.hexen.spritenum = { + [0] = "MAN1", + "ACLO", + "TLGL", + "FBL1", + "XPL1", + "ARRW", + "DART", + "RIPP", + "CFCF", + "BLAD", + "SHRD", + "FFSM", + "FFLG", + "PTN1", + "PTN2", + "SOAR", + "INVU", + "SUMN", + "TSPK", + "TELO", + "TRNG", + "ROCK", + "FOGS", + "FOGM", + "FOGL", + "SGSA", + "SGSB", + "PORK", + "EGGM", + "FHFX", + "SPHL", + "STWN", + "GMPD", + "ASKU", + "ABGM", + "AGMR", + "AGMG", + "AGG2", + "AGMB", + "AGB2", + "ABK1", + "ABK2", + "ASK2", + "AFWP", + "ACWP", + "AMWP", + "AGER", + "AGR2", + "AGR3", + "AGR4", + "TRCH", + "PSBG", + "ATLP", + "THRW", + "SPED", + "BMAN", + "BRAC", + "BLST", + "HRAD", + "SPSH", + "LVAS", + "SLDG", + "STTW", + "RCK1", + "RCK2", + "RCK3", + "RCK4", + "CDLR", + "TRE1", + "TRDT", + "TRE2", + "TRE3", + "STM1", + "STM2", + "STM3", + "STM4", + "MSH1", + "MSH2", + "MSH3", + "MSH4", + "MSH5", + "MSH6", + "MSH7", + "MSH8", + "SGMP", + "SGM1", + "SGM2", + "SGM3", + "SLC1", + "SLC2", + "SLC3", + "MSS1", + "MSS2", + "SWMV", + "CPS1", + "CPS2", + "TMS1", + "TMS2", + "TMS3", + "TMS4", + "TMS5", + "TMS6", + "TMS7", + "CPS3", + "STT2", + "STT3", + "STT4", + "STT5", + "GAR1", + "GAR2", + "GAR3", + "GAR4", + "GAR5", + "GAR6", + "GAR7", + "GAR8", + "GAR9", + "BNR1", + "TRE4", + "TRE5", + "TRE6", + "TRE7", + "LOGG", + "ICT1", + "ICT2", + "ICT3", + "ICT4", + "ICM1", + "ICM2", + "ICM3", + "ICM4", + "RKBL", + "RKBS", + "RKBK", + "RBL1", + "RBL2", + "RBL3", + "VASE", + "POT1", + "POT2", + "POT3", + "PBIT", + "CPS4", + "CPS5", + "CPS6", + "CPB1", + "CPB2", + "CPB3", + "CPB4", + "BDRP", + "BDSH", + "BDPL", + "CNDL", + "LEF1", + "LEF3", + "LEF2", + "TWTR", + "WLTR", + "BARL", + "SHB1", + "SHB2", + "BCKT", + "SHRM", + "FBUL", + "FSKL", + "BRTR", + "SUIT", + "BBLL", + "CAND", + "IRON", + "XMAS", + "CDRN", + "CHNS", + "TST1", + "TST2", + "TST3", + "TST4", + "TST5", + "TST6", + "TST7", + "TST8", + "TST9", + "TST0", + "TELE", + "TSMK", + "FPCH", + "WFAX", + "FAXE", + "WFHM", + "FHMR", + "FSRD", + "FSFX", + "CMCE", + "WCSS", + "CSSF", + "WCFM", + "CFLM", + "CFFX", + "CHLY", + "SPIR", + "MWND", + "WMLG", + "MLNG", + "MLFX", + "MLF2", + "MSTF", + "MSP1", + "MSP2", + "WFR1", + "WFR2", + "WFR3", + "WCH1", + "WCH2", + "WCH3", + "WMS1", + "WMS2", + "WMS3", + "WPIG", + "WMCS", + "CONE", + "SHEX", + "BLOD", + "GIBS", + "PLAY", + "FDTH", + "BSKL", + "ICEC", + "CLER", + "MAGE", + "PIGY", + "CENT", + "CTXD", + "CTFX", + "CTDP", + "DEMN", + "DEMA", + "DEMB", + "DEMC", + "DEMD", + "DEME", + "DMFX", + "DEM2", + "DMBA", + "DMBB", + "DMBC", + "DMBD", + "DMBE", + "D2FX", + "WRTH", + "WRT2", + "WRBL", + "MNTR", + "FX12", + "FX13", + "MNSM", + "SSPT", + "SSDV", + "SSXD", + "SSFX", + "BISH", + "BPFX", + "DRAG", + "DRFX", + "ARM1", + "ARM2", + "ARM3", + "ARM4", + "MAN2", + "MAN3", + "KEY1", + "KEY2", + "KEY3", + "KEY4", + "KEY5", + "KEY6", + "KEY7", + "KEY8", + "KEY9", + "KEYA", + "KEYB", + "ETTN", + "ETTB", + "FDMN", + "FDMB", + "ICEY", + "ICPR", + "ICWS", + "SORC", + "SBMP", + "SBS4", + "SBMB", + "SBS3", + "SBMG", + "SBS1", + "SBS2", + "SBFX", + "RADE", + "WATR", + "KORX", + "ABAT", } +assign_keys(dsda.hexen.spritenum) + + return dsda; diff --git a/Assets/Lua/Doom/things-lines.lua b/Assets/Lua/Doom/things-lines.lua index 090d094eb1f..fc9d73eba10 100644 --- a/Assets/Lua/Doom/things-lines.lua +++ b/Assets/Lua/Doom/things-lines.lua @@ -48,7 +48,7 @@ local LastScreenSize = { local PlayerOffsets = dsda.player.offsets-- player member offsets in bytes local MobjOffsets = dsda.mobj.offsets-- mobj member offsets in bytes local LineOffsets = dsda.line.offsets-- line member offsets in bytes -local MobjType = dsda.doom.mobjtype +local MobjType = dsda.mobjtype local SpriteNumber = dsda.doom.spritenum local Objects = {} From 1c7ba6df7cbcb1987f24b3595d21311b32df31d5 Mon Sep 17 00:00:00 2001 From: kalimag Date: Mon, 29 Sep 2025 19:16:34 +0200 Subject: [PATCH 11/49] Enhance struct helper to encapsulate memory reading --- Assets/Lua/Doom/dsda-data.lua | 155 +++++++++++++++++++++++++++++----- 1 file changed, 136 insertions(+), 19 deletions(-) diff --git a/Assets/Lua/Doom/dsda-data.lua b/Assets/Lua/Doom/dsda-data.lua index 97dd91a8413..48a6c9b7bb4 100644 --- a/Assets/Lua/Doom/dsda-data.lua +++ b/Assets/Lua/Doom/dsda-data.lua @@ -1,3 +1,7 @@ +-- Core must be loaded to get memory domain sizes +-- Throw an error so Lua doesn't cache the module in an invalid state +assert(emu.getsystemid() == "Doom", "Doom core not loaded") + local dsda = { doom = {}, heretic = {}, @@ -7,6 +11,8 @@ local dsda = { -- Constants --- +local NULL_OBJECT = 0x88888888 -- no object at that index +local OUT_OF_BOUNDS = 0xFFFFFFFF -- no such index dsda.MAX_PLAYERS = 4 -- sizes in bytes @@ -17,20 +23,64 @@ dsda.SECTOR_SIZE = 512 -- sizeof(sector_t) is 344, but we padded it for nicenes +-- Utilities --- + +local function assertf(condition, format, ...) + if not condition then + error(string.format(format, ...), 2) + end +end + +function dsda.read_u64_le(addr, domain) + return memory.read_u32_le(addr, domain) | memory.read_u32_le(addr + 4, domain) << 32 +end + +function dsda.read_bool(addr, domain) + return memory.read_u32_le(addr, domain) ~= 0 +end + +local function read_float_le(addr, domain) + return memory.readfloat(addr, false, domain) +end + + + -- Structs --- -function dsda.struct_layout(struct) +function dsda.struct_layout(struct, padded_size, domain, max_count) struct = struct or {} + struct.padded_size = padded_size + struct.domain = domain struct.size = 0 struct.offsets = {} + struct.items = {} -- This should be iterated with pairs() + + max_count = max_count or math.floor(memory.getmemorydomainsize(domain) / padded_size) + local max_address = (max_count - 1) * padded_size + struct.max_count = max_count + struct.max_address = max_address + + local items_meta = {} + local item_props = {} + local item_meta = {} + setmetatable(struct.items, items_meta) + + function struct.add(name, size, alignment, read_func) + assertf(struct.offsets[name] == nil, "Duplicate %s name %s", domain, name) - function struct.add(name, size, alignment) if alignment == true then alignment = size end struct.align(alignment) - --print(string.format("%-19s %3X %3X", name, size, struct.size)); emu.yield() - struct.offsets[name] = struct.size - struct.size = struct.size + size + local offset = struct.size + struct.offsets[name] = offset + struct.size = offset + size struct.align(alignment) -- add padding to structs + --print(string.format("%-19s %3X %3X", name, size, offset)); + + if read_func then + item_props[name] = function(self) + return read_func(self._address + offset, domain) + end + end return struct end function struct.align(alignment) @@ -44,28 +94,96 @@ function dsda.struct_layout(struct) struct.size = struct.size + size return struct end - function struct.s8 (name) return struct.add(name, 1, true) end - function struct.s16 (name) return struct.add(name, 2, true) end - function struct.s32 (name) return struct.add(name, 4, true) end - function struct.u8 (name) return struct.add(name, 1, true) end - function struct.u16 (name) return struct.add(name, 2, true) end - function struct.u32 (name) return struct.add(name, 4, true) end - function struct.u64 (name) return struct.add(name, 8, true) end - function struct.float(name) return struct.add(name, 4, true) end + function struct.s8 (name) return struct.add(name, 1, true, memory.read_s8) end + function struct.s16 (name) return struct.add(name, 2, true, memory.read_s16_le) end + function struct.s32 (name) return struct.add(name, 4, true, memory.read_s32_le) end + function struct.u8 (name) return struct.add(name, 1, true, memory.read_u8) end + function struct.u16 (name) return struct.add(name, 2, true, memory.read_u16_le) end + function struct.u32 (name) return struct.add(name, 4, true, memory.read_u32_le) end + function struct.u64 (name) return struct.add(name, 8, true, dsda.read_u64_le) end + function struct.float(name) return struct.add(name, 4, true, read_float_le) end function struct.ptr (name) return struct.u64(name) end - function struct.bool (name) return struct.s32(name) end + function struct.bool (name) return struct.add(name, 4, true, dsda.read_bool) end function struct.array(name, type, count, ...) + --console.log("array", type, count, ...) for i = 1, count do struct[type](name .. i, ...) end return struct end + + local function get_item(address) + assertf(address >= 0 and address <= max_address and address % padded_size == 0, + "Invalid %s address %X", domain, address) + + local peek = memory.read_u32_le(address, domain) + if peek == NULL_OBJECT then + --print("NULL_OBJECT", domain, bizstring.hex(address)) + return nil + elseif peek == OUT_OF_BOUNDS then + --print("OUT_OF_BOUNDS", domain, bizstring.hex(address)) + return false + end + + local item = { + _address = address, + } + setmetatable(item, item_meta) + return item + end + + -- iterator for each instance of the struct in the domain + local function next_item(_, address) + address = address and address + padded_size or 0 + while address <= max_address do + local item = get_item(address) + if item then + return address, item + elseif item == false then -- OUT_OF_BOUNDS + break + else -- NULL_OBJECT + address = address + padded_size + end + end + end + + -- iterator for each readable field in the struct + local function next_item_prop(item, key) + local next_key = next(item_props, key) + return next_key, item[next_key] + end + + function struct.from_address(address) + return get_item(address) or nil + end + + function struct.from_index(index) + return get_item((index - 1) * padded_size) or nil + end + + function items_meta:__index(index) + return struct.from_address(index) + end + + function items_meta:__pairs() + return next_item + end + + function item_meta:__index(name) + local prop = item_props[name] + if prop then return prop(self) end + end + + function item_meta:__pairs() + return next_item_prop, self, nil + end + return struct end -- player_t https://github.com/TASEmulators/dsda-doom/blob/5608ee441410ecae10a17ecdbe1940bd4e1a2856/prboom2/src/d_player.h#L143-L267 -dsda.player = dsda.struct_layout() +dsda.player = dsda.struct_layout(nil, dsda.PLAYER_SIZE, "Players", dsda.MAX_PLAYERS) .ptr ("mobj") .s32 ("playerstate") -- playerstate_t .add ("cmd", 14, 2) @@ -133,7 +251,7 @@ dsda.player = dsda.struct_layout() .u8 ("hazardinterval") -- mobj_t https://github.com/TASEmulators/dsda-doom/blob/5608ee441410ecae10a17ecdbe1940bd4e1a2856/prboom2/src/p_mobj.h#L277-L413 -dsda.mobj = dsda.struct_layout() +dsda.mobj = dsda.struct_layout(nil, dsda.MOBJ_SIZE, "Things") .add ("thinker", 44, 8) .s32 ("x") .s32 ("y") @@ -205,7 +323,7 @@ dsda.mobj = dsda.struct_layout() .ptr ("tranmap") -- sector_t https://github.com/TASEmulators/dsda-doom/blob/5608ee441410ecae10a17ecdbe1940bd4e1a2856/prboom2/src/r_defs.h#L124-L213 -dsda.sector = dsda.struct_layout() +dsda.sector = dsda.struct_layout(nil, dsda.SECTOR_SIZE, "Sectors") .s32 ("iSectorID") .u32 ("flags") .s32 ("floorheight") @@ -253,7 +371,6 @@ dsda.sector = dsda.struct_layout() .s16 ("tag") .s32 ("cachedheight") .s32 ("scaleindex") - -- e6y .s32 ("INTERP_SectorFloor") .s32 ("INTERP_SectorCeiling") .s32 ("INTERP_FloorPanning") @@ -280,7 +397,7 @@ dsda.sector = dsda.struct_layout() -- line_t https://github.com/TASEmulators/dsda-doom/blob/5608ee441410ecae10a17ecdbe1940bd4e1a2856/prboom2/src/r_defs.h#L312-L347 -- followed by v1, v2 coords -dsda.line = dsda.struct_layout() +dsda.line = dsda.struct_layout(nil, dsda.LINE_SIZE, "Lines") .s32 ("iLineID") .ptr ("v1") .ptr ("v2") From 70526879b07a5d8bd87f321eb8f538595e66bf2b Mon Sep 17 00:00:00 2001 From: kalimag Date: Mon, 29 Sep 2025 19:37:36 +0200 Subject: [PATCH 12/49] Use dsda-data to iterate --- Assets/Lua/Doom/things-lines.lua | 107 +++++++++++++------------------ 1 file changed, 43 insertions(+), 64 deletions(-) diff --git a/Assets/Lua/Doom/things-lines.lua b/Assets/Lua/Doom/things-lines.lua index fc9d73eba10..904e0965e8c 100644 --- a/Assets/Lua/Doom/things-lines.lua +++ b/Assets/Lua/Doom/things-lines.lua @@ -21,7 +21,7 @@ local rws = memory.read_s16_le local rbs = memory.read_s8 local text = gui.text local box = gui.drawBox -local line = gui.drawLine +local drawline = gui.drawLine --local text = gui.pixelText -- INSANELY SLOW -- TOP LEVEL VARIABLES @@ -131,25 +131,20 @@ local function iterate_players() local total_itemcount = 0 local total_secretcount = 0 local stats = " HP Armr Kill Item Secr\n" - for i = 1, dsda.MAX_PLAYERS do - local addr = dsda.PLAYER_SIZE * (i - 1) - local mobj = rl(addr + PlayerOffsets.mobj, "Players") + for addr, player in pairs(dsda.player.items) do + playercount = playercount + 1 + local health = rls(addr + PlayerOffsets.health, "Players") + local armor = rls(addr + PlayerOffsets.armorpoints1, "Players") + local killcount = rls(addr + PlayerOffsets.killcount, "Players") + local itemcount = rls(addr + PlayerOffsets.itemcount, "Players") + local secretcount = rls(addr + PlayerOffsets.secretcount, "Players") - if mobj ~= NULL_OBJECT then - playercount = playercount + 1 - local health = rls(addr + PlayerOffsets.health, "Players") - local armor = rls(addr + PlayerOffsets.armorpoints1, "Players") - local killcount = rls(addr + PlayerOffsets.killcount, "Players") - local itemcount = rls(addr + PlayerOffsets.itemcount, "Players") - local secretcount = rls(addr + PlayerOffsets.secretcount, "Players") + total_killcount = total_killcount + killcount + total_itemcount = total_itemcount + itemcount + total_secretcount = total_secretcount + secretcount - total_killcount = total_killcount + killcount - total_itemcount = total_itemcount + itemcount - total_secretcount = total_secretcount + secretcount - - stats = string.format("%s P%i %4i %4i %4i %4i %4i\n", - stats, i, health, armor, killcount, itemcount, secretcount) - end + stats = string.format("%s P%i %4i %4i %4i %4i %4i\n", + stats, playercount, health, armor, killcount, itemcount, secretcount) end if playercount > 1 then stats = string.format("%s %-12s %4i %4i %4i\n", stats, "All", total_killcount, total_itemcount, total_secretcount) @@ -185,58 +180,42 @@ local function iterate() end end - for i = 0, 100000 do - local addr = i * dsda.LINE_SIZE - if addr > 0xFFFFFF then break end - - local id = rl(addr, "Lines") & 0xFFFFFFFF - if id == OUT_OF_BOUNDS then break end - - if id ~= NULL_OBJECT then - local special = rws(addr+LineOffsets.special, "Lines") - local v1 = { x = rls(addr+LineOffsets.v1_x, "Lines"), - y = -rls(addr+LineOffsets.v1_y, "Lines") } - local v2 = { x = rls(addr+LineOffsets.v2_x, "Lines"), - y = -rls(addr+LineOffsets.v2_y, "Lines") } + for addr, line in pairs(dsda.line.items) do + local special = rws(addr+LineOffsets.special, "Lines") + local v1 = { x = rls(addr+LineOffsets.v1_x, "Lines"), + y = -rls(addr+LineOffsets.v1_y, "Lines") } + local v2 = { x = rls(addr+LineOffsets.v2_x, "Lines"), + y = -rls(addr+LineOffsets.v2_y, "Lines") } - local color - if special ~= 0 then color = 0xffcc00ff end + local color + if special ~= 0 then color = 0xffcc00ff end - line( - mapify_x(v1.x), - mapify_y(v1.y), - mapify_x(v2.x), - mapify_y(v2.y), - color or 0xffcccccc) - end + drawline( + mapify_x(v1.x), + mapify_y(v1.y), + mapify_x(v2.x), + mapify_y(v2.y), + color or 0xffcccccc) end end local function init_objects() - for i = 0, 100000 do - local addr = i * dsda.MOBJ_SIZE - if addr > 0xFFFFFF then break end - - local thinker = rl(addr, "Things") & 0xFFFFFFFF -- just to check if mobj is there - if thinker == OUT_OF_BOUNDS then break end - - if thinker ~= NULL_OBJECT then - local x = rls(addr + MobjOffsets.x, "Things") / 0xffff - local y = rls(addr + MobjOffsets.y, "Things") / 0xffff * -1 - local type = rl (addr + MobjOffsets.type, "Things") - - -- print(string.format("%d %f %f %02X", index, x, y, type)) - type = MobjType[type] - if type - and not string.find(type, "MISC") - then - if x < OB.left then OB.left = x end - if x > OB.right then OB.right = x end - if y < OB.top then OB.top = y end - if y > OB.bottom then OB.bottom = y end - -- cache the Objects we need - table.insert(Objects, addr) - end + for addr, mobj in pairs(dsda.mobj.items) do + local x = rls(addr + MobjOffsets.x, "Things") / 0xffff + local y = rls(addr + MobjOffsets.y, "Things") / 0xffff * -1 + local type = rl (addr + MobjOffsets.type, "Things") + + -- print(string.format("%d %f %f %02X", index, x, y, type)) + type = MobjType[type] + if type + and not string.find(type, "MISC") + then + if x < OB.left then OB.left = x end + if x > OB.right then OB.right = x end + if y < OB.top then OB.top = y end + if y > OB.bottom then OB.bottom = y end + -- cache the Objects we need + table.insert(Objects, addr) end end end From b80b63315e3c61c10d7e56aba25e1d8485ee8e26 Mon Sep 17 00:00:00 2001 From: kalimag Date: Mon, 29 Sep 2025 22:04:25 +0200 Subject: [PATCH 13/49] Use dsda-data to replace memory reads --- Assets/Lua/Doom/things-lines.lua | 54 ++++++++++++++------------------ 1 file changed, 24 insertions(+), 30 deletions(-) diff --git a/Assets/Lua/Doom/things-lines.lua b/Assets/Lua/Doom/things-lines.lua index 904e0965e8c..ae6d6803de7 100644 --- a/Assets/Lua/Doom/things-lines.lua +++ b/Assets/Lua/Doom/things-lines.lua @@ -133,18 +133,16 @@ local function iterate_players() local stats = " HP Armr Kill Item Secr\n" for addr, player in pairs(dsda.player.items) do playercount = playercount + 1 - local health = rls(addr + PlayerOffsets.health, "Players") - local armor = rls(addr + PlayerOffsets.armorpoints1, "Players") - local killcount = rls(addr + PlayerOffsets.killcount, "Players") - local itemcount = rls(addr + PlayerOffsets.itemcount, "Players") - local secretcount = rls(addr + PlayerOffsets.secretcount, "Players") + local killcount = player.killcount + local itemcount = player.itemcount + local secretcount = player.secretcount total_killcount = total_killcount + killcount total_itemcount = total_itemcount + itemcount total_secretcount = total_secretcount + secretcount stats = string.format("%s P%i %4i %4i %4i %4i %4i\n", - stats, playercount, health, armor, killcount, itemcount, secretcount) + stats, playercount, player.health, player.armorpoints1, killcount, itemcount, secretcount) end if playercount > 1 then stats = string.format("%s %-12s %4i %4i %4i\n", stats, "All", total_killcount, total_itemcount, total_secretcount) @@ -154,23 +152,19 @@ end local function iterate() if Init then return end - - for _, addr in ipairs(Objects) do - local x = rls(addr + MobjOffsets.x, "Things") - local y = rls(addr + MobjOffsets.y, "Things") * -1 - local health = rls(addr + MobjOffsets.health, "Things") - local radius = math.floor ((rls(addr + MobjOffsets.radius, "Things") >> 16) * Zoom) - local sprite = SpriteNumber[rls(addr + MobjOffsets.sprite, "Things")] - local type = rl(addr + MobjOffsets.type, "Things") - local pos = { x = mapify_x(x), y = mapify_y(y) } + + for _, mobj in ipairs(Objects) do + local pos = { x = mapify_x(mobj.x), y = mapify_y(-mobj.y) } + local radius = math.floor ((mobj.radius >> 16) * Zoom) + --local sprite = SpriteNumber[mobj.sprite] + local type = MobjType[mobj.type] local color = "white" - - type = MobjType[type] - if health <= 0 then color = "red" end + + if mobj.health <= 0 then color = "red" end --[[-- - local z = rls(addr + Offsets.z) / 0xffff - local index = rl (addr + Offsets.index) - local tics = rl (addr + Offsets.tics) + local z = mobj.z + local index = mobj.index + local tics = mobj.tics --]]-- if in_range(pos.x, 0, client.screenwidth()) and in_range(pos.y, 0, client.screenheight()) @@ -181,11 +175,11 @@ local function iterate() end for addr, line in pairs(dsda.line.items) do - local special = rws(addr+LineOffsets.special, "Lines") - local v1 = { x = rls(addr+LineOffsets.v1_x, "Lines"), - y = -rls(addr+LineOffsets.v1_y, "Lines") } - local v2 = { x = rls(addr+LineOffsets.v2_x, "Lines"), - y = -rls(addr+LineOffsets.v2_y, "Lines") } + local special = line.special + local v1 = { x = line.v1_x, + y = -line.v1_y, } + local v2 = { x = line.v2_x, + y = -line.v2_y } local color if special ~= 0 then color = 0xffcc00ff end @@ -201,9 +195,9 @@ end local function init_objects() for addr, mobj in pairs(dsda.mobj.items) do - local x = rls(addr + MobjOffsets.x, "Things") / 0xffff - local y = rls(addr + MobjOffsets.y, "Things") / 0xffff * -1 - local type = rl (addr + MobjOffsets.type, "Things") + local x = mobj.x / 0xffff + local y = mobj.y / 0xffff * -1 + local type = mobj.type -- print(string.format("%d %f %f %02X", index, x, y, type)) type = MobjType[type] @@ -215,7 +209,7 @@ local function init_objects() if y < OB.top then OB.top = y end if y > OB.bottom then OB.bottom = y end -- cache the Objects we need - table.insert(Objects, addr) + table.insert(Objects, mobj) end end end From 97d2ae66e30a3f865e5fc815513ab4aace15457b Mon Sep 17 00:00:00 2001 From: kalimag Date: Wed, 1 Oct 2025 22:47:13 +0200 Subject: [PATCH 14/49] Suppress firing while clicking on map buttons --- Assets/Lua/Doom/things-lines.lua | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/Assets/Lua/Doom/things-lines.lua b/Assets/Lua/Doom/things-lines.lua index ae6d6803de7..bd00d4fe566 100644 --- a/Assets/Lua/Doom/things-lines.lua +++ b/Assets/Lua/Doom/things-lines.lua @@ -12,6 +12,7 @@ local CHAR_WIDTH = 10 local CHAR_HEIGHT = 16 local NEGATIVE_MAXIMUM = 1 << 63 local POSITIVE_MAXIMUM = ~NEGATIVE_MAXIMUM +local MAP_CLICK_BLOCK = "P1 Fire" -- prevent this input while clicking on map buttons -- shortcuts local rl = memory.read_u32_le local rw = memory.read_u16_le @@ -259,6 +260,9 @@ local function make_button(x, y, name, func) if in_range(mousePos.x, x, x+boxWidth) and in_range(mousePos.y, y-boxHeight, y ) then if mouse.Left then + if MAP_CLICK_BLOCK and MAP_CLICK_BLOCK ~= "" then + joypad.set({ [MAP_CLICK_BLOCK] = false }) + end colorIndex = 3 func() else colorIndex = 2 end @@ -268,13 +272,8 @@ local function make_button(x, y, name, func) text(textX, textY, name, colors[colorIndex] | 0xff000000) -- full alpha end - - -while true do - if Init then init_objects() end - iterate() - iterate_players() - update_zoom() +event.onframestart(function() + -- do this before the frame to stop button clicks counting as game inputs make_button( 10, client.screenheight()-70, "Zoom\nIn", zoom_in ) make_button( 10, client.screenheight()-10, "Zoom\nOut", zoom_out ) make_button( 80, client.screenheight()-40, "Pan\nLeft", pan_left ) @@ -282,6 +281,13 @@ while true do make_button(150, client.screenheight()-10, "Pan\nDown", pan_down ) make_button(220, client.screenheight()-40, "Pan\nRight", pan_right ) make_button(300, client.screenheight()-10, "Reset\nView", reset_view) +end) + +while true do + if Init then init_objects() end + iterate() + iterate_players() + update_zoom() text(10, client.screenheight()-170, string.format( "Zoom: %.4f\nPanX: %s\nPanY: %s", Zoom, Pan.x, Pan.y), 0xffbbddff) From 814b0c14074e3b4d902ea749bea4cd644709649a Mon Sep 17 00:00:00 2001 From: kalimag Date: Wed, 1 Oct 2025 22:50:13 +0200 Subject: [PATCH 15/49] Clear drawings when script is disabled --- Assets/Lua/Doom/things-lines.lua | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Assets/Lua/Doom/things-lines.lua b/Assets/Lua/Doom/things-lines.lua index bd00d4fe566..d16c45b6a38 100644 --- a/Assets/Lua/Doom/things-lines.lua +++ b/Assets/Lua/Doom/things-lines.lua @@ -283,6 +283,10 @@ event.onframestart(function() make_button(300, client.screenheight()-10, "Reset\nView", reset_view) end) +event.onexit(function() + gui.clearGraphics() +end) + while true do if Init then init_objects() end iterate() From 4a32c59226d5172f5011a7ec77f4176d0c2bf9c8 Mon Sep 17 00:00:00 2001 From: kalimag Date: Thu, 2 Oct 2025 18:29:55 +0200 Subject: [PATCH 16/49] Stop caching mobjs --- Assets/Lua/Doom/things-lines.lua | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/Assets/Lua/Doom/things-lines.lua b/Assets/Lua/Doom/things-lines.lua index d16c45b6a38..a4f7e750e0a 100644 --- a/Assets/Lua/Doom/things-lines.lua +++ b/Assets/Lua/Doom/things-lines.lua @@ -51,7 +51,6 @@ local MobjOffsets = dsda.mobj.offsets-- mobj member offsets in bytes local LineOffsets = dsda.line.offsets-- line member offsets in bytes local MobjType = dsda.mobjtype local SpriteNumber = dsda.doom.spritenum -local Objects = {} --gui.defaultPixelFont("fceux") gui.use_surface("client") @@ -154,10 +153,10 @@ end local function iterate() if Init then return end - for _, mobj in ipairs(Objects) do + for addr, mobj in pairs(dsda.mobj.items) do local pos = { x = mapify_x(mobj.x), y = mapify_y(-mobj.y) } local radius = math.floor ((mobj.radius >> 16) * Zoom) - --local sprite = SpriteNumber[mobj.sprite] + -- local sprite = SpriteNumber[mobj.sprite] local type = MobjType[mobj.type] local color = "white" @@ -169,6 +168,8 @@ local function iterate() --]]-- if in_range(pos.x, 0, client.screenwidth()) and in_range(pos.y, 0, client.screenheight()) + and type + and not string.find(type, "MISC") then text(pos.x, pos.y, string.format("%s", type), color) box(pos.x - radius, pos.y - radius, pos.x + radius, pos.y + radius, color) @@ -198,20 +199,12 @@ local function init_objects() for addr, mobj in pairs(dsda.mobj.items) do local x = mobj.x / 0xffff local y = mobj.y / 0xffff * -1 - local type = mobj.type + if x < OB.left then OB.left = x end + if x > OB.right then OB.right = x end + if y < OB.top then OB.top = y end + if y > OB.bottom then OB.bottom = y end + end - -- print(string.format("%d %f %f %02X", index, x, y, type)) - type = MobjType[type] - if type - and not string.find(type, "MISC") - then - if x < OB.left then OB.left = x end - if x > OB.right then OB.right = x end - if y < OB.top then OB.top = y end - if y > OB.bottom then OB.bottom = y end - -- cache the Objects we need - table.insert(Objects, mobj) - end end end From 42d870763f657e069c596426d8752cda64aaf48b Mon Sep 17 00:00:00 2001 From: kalimag Date: Thu, 2 Oct 2025 18:35:17 +0200 Subject: [PATCH 17/49] Cache lines --- Assets/Lua/Doom/things-lines.lua | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/Assets/Lua/Doom/things-lines.lua b/Assets/Lua/Doom/things-lines.lua index a4f7e750e0a..57a274a7b52 100644 --- a/Assets/Lua/Doom/things-lines.lua +++ b/Assets/Lua/Doom/things-lines.lua @@ -51,6 +51,7 @@ local MobjOffsets = dsda.mobj.offsets-- mobj member offsets in bytes local LineOffsets = dsda.line.offsets-- line member offsets in bytes local MobjType = dsda.mobjtype local SpriteNumber = dsda.doom.spritenum +local Lines = {} --gui.defaultPixelFont("fceux") gui.use_surface("client") @@ -176,12 +177,20 @@ local function iterate() end end - for addr, line in pairs(dsda.line.items) do - local special = line.special - local v1 = { x = line.v1_x, - y = -line.v1_y, } - local v2 = { x = line.v2_x, - y = -line.v2_y } + for _, line in ipairs(Lines) do + -- Line positions need to be updated for polyobjects + -- No way to tell if a line is part of a polyobject, but they update validcount + -- when moving so this is a decent way of cutting down on memory reads + local validcount = line.validcount + if validcount ~= line._validcount then + line._validcount = validcount + line._v1 = { x = line.v1_x, + y = -line.v1_y, } + line._v2 = { x = line.v2_x, + y = -line.v2_y, } + end + local v1, v2 = line._v1, line._v2 + local special = line.special local color if special ~= 0 then color = 0xffcc00ff end @@ -205,6 +214,9 @@ local function init_objects() if y > OB.bottom then OB.bottom = y end end + Lines = {} + for addr, line in pairs(dsda.line.items) do + table.insert(Lines, line) end end From 6d59166ac61509c12cecc8c294a7d82801214eda Mon Sep 17 00:00:00 2001 From: feos Date: Thu, 2 Oct 2025 18:56:43 +0300 Subject: [PATCH 18/49] fix maybe_swap() to return a tuple instead of doing nothing --- Assets/Lua/Doom/things-lines.lua | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/Assets/Lua/Doom/things-lines.lua b/Assets/Lua/Doom/things-lines.lua index 57a274a7b52..e0ffbc56275 100644 --- a/Assets/Lua/Doom/things-lines.lua +++ b/Assets/Lua/Doom/things-lines.lua @@ -99,12 +99,11 @@ local function pan_down() Pan.y = Pan.y - PAN_FACTOR/Zoom/2 end -function maybe_swap(left, right) - if left > right then - local smallest = right - right = left - left = smallest +function maybe_swap(smaller, bigger) + if smaller > bigger then + return bigger, smaller end + return smaller, bigger end local function get_line_count(str) @@ -232,8 +231,8 @@ function update_zoom() and OB.bottom ~= NEGATIVE_MAXIMUM and not emu.islagged() then - maybe_swap(OB.right, OB.left) - maybe_swap(OB.top, OB.bottom) + OB.left, OB.right = maybe_swap(OB.left, OB.right) + OB.top, OB.bottom = maybe_swap(OB.top, OB.bottom) local span = { x = OB.right-OB.left+200, y = OB.bottom-OB.top+200 } local scale = { x = client.screenwidth()/span.x, y = client.screenheight()/span.y } local spanCenter = { x = OB.left+span.x/2, y = OB.top+span.y/2 } From 75d7a2e9792eafa1243d9e5d200fc3d581ec2ae8 Mon Sep 17 00:00:00 2001 From: feos Date: Thu, 2 Oct 2025 21:01:21 +0300 Subject: [PATCH 19/49] work while paused --- Assets/Lua/Doom/things-lines.lua | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/Assets/Lua/Doom/things-lines.lua b/Assets/Lua/Doom/things-lines.lua index e0ffbc56275..d2c1797590e 100644 --- a/Assets/Lua/Doom/things-lines.lua +++ b/Assets/Lua/Doom/things-lines.lua @@ -276,8 +276,15 @@ local function make_button(x, y, name, func) text(textX, textY, name, colors[colorIndex] | 0xff000000) -- full alpha end -event.onframestart(function() - -- do this before the frame to stop button clicks counting as game inputs +event.onexit(function() + gui.clearGraphics() + gui.cleartext() +end) + +while true do + if Init then init_objects() end + gui.clearGraphics() + gui.cleartext() make_button( 10, client.screenheight()-70, "Zoom\nIn", zoom_in ) make_button( 10, client.screenheight()-10, "Zoom\nOut", zoom_out ) make_button( 80, client.screenheight()-40, "Pan\nLeft", pan_left ) @@ -285,14 +292,6 @@ event.onframestart(function() make_button(150, client.screenheight()-10, "Pan\nDown", pan_down ) make_button(220, client.screenheight()-40, "Pan\nRight", pan_right ) make_button(300, client.screenheight()-10, "Reset\nView", reset_view) -end) - -event.onexit(function() - gui.clearGraphics() -end) - -while true do - if Init then init_objects() end iterate() iterate_players() update_zoom() @@ -301,5 +300,5 @@ while true do Zoom, Pan.x, Pan.y), 0xffbbddff) LastScreenSize.w = client.screenwidth() LastScreenSize.h = client.screenheight() - emu.frameadvance() + emu.yield() end \ No newline at end of file From fb5bbe958c648e4e0d9c26f23b43b207848f4f80 Mon Sep 17 00:00:00 2001 From: feos Date: Thu, 2 Oct 2025 21:59:40 +0300 Subject: [PATCH 20/49] center out zooming --- Assets/Lua/Doom/things-lines.lua | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/Assets/Lua/Doom/things-lines.lua b/Assets/Lua/Doom/things-lines.lua index d2c1797590e..22af8c2aee7 100644 --- a/Assets/Lua/Doom/things-lines.lua +++ b/Assets/Lua/Doom/things-lines.lua @@ -73,30 +73,34 @@ local function reset_view() update_zoom() end -local function zoom_out() - local newZoom = Zoom * (1 - ZOOM_FACTOR) - if newZoom < MINIMAL_ZOOM then return end - Zoom = newZoom +local function pan_left(divider) + Pan.x = Pan.x + PAN_FACTOR/Zoom/(divider or 2) end -local function zoom_in() - Zoom = Zoom * (1 + ZOOM_FACTOR) +local function pan_right(divider) + Pan.x = Pan.x - PAN_FACTOR/Zoom/(divider or 2) end -local function pan_left() - Pan.x = Pan.x + PAN_FACTOR/Zoom/2 +local function pan_up(divider) + Pan.y = Pan.y + PAN_FACTOR/Zoom/(divider or 2) end -local function pan_right() - Pan.x = Pan.x - PAN_FACTOR/Zoom/2 +local function pan_down(divider) + Pan.y = Pan.y - PAN_FACTOR/Zoom/(divider or 2) end -local function pan_up() - Pan.y = Pan.y + PAN_FACTOR/Zoom/2 +local function zoom_out() + local newZoom = Zoom * (1 - ZOOM_FACTOR) + if newZoom < MINIMAL_ZOOM then return end + Zoom = newZoom + pan_left(1) + pan_up(1.4) end -local function pan_down() - Pan.y = Pan.y - PAN_FACTOR/Zoom/2 +local function zoom_in() + Zoom = Zoom * (1 + ZOOM_FACTOR) + pan_right(1) + pan_down(1.4) end function maybe_swap(smaller, bigger) From 4138e3aa6c7dae975d295663d7c2b951e2cb77f5 Mon Sep 17 00:00:00 2001 From: feos Date: Thu, 2 Oct 2025 22:31:12 +0300 Subject: [PATCH 21/49] wheel zoom! cleanup --- Assets/Lua/Doom/things-lines.lua | 104 +++++++++++++++++++------------ 1 file changed, 64 insertions(+), 40 deletions(-) diff --git a/Assets/Lua/Doom/things-lines.lua b/Assets/Lua/Doom/things-lines.lua index 22af8c2aee7..67a35d46d86 100644 --- a/Assets/Lua/Doom/things-lines.lua +++ b/Assets/Lua/Doom/things-lines.lua @@ -3,31 +3,33 @@ local dsda = require("dsda-data") -- CONSTANTS -local NULL_OBJECT = 0x88888888 -- no object at that index -local OUT_OF_BOUNDS = 0xFFFFFFFF -- no such index -local MINIMAL_ZOOM = 0.0001 -- ??? -local ZOOM_FACTOR = 0.02 -local PAN_FACTOR = 10 -local CHAR_WIDTH = 10 -local CHAR_HEIGHT = 16 -local NEGATIVE_MAXIMUM = 1 << 63 -local POSITIVE_MAXIMUM = ~NEGATIVE_MAXIMUM -local MAP_CLICK_BLOCK = "P1 Fire" -- prevent this input while clicking on map buttons +local NULL_OBJECT = 0x88888888 -- no object at that index +local OUT_OF_BOUNDS = 0xFFFFFFFF -- no such index +local MINIMAL_ZOOM = 0.0001 -- ??? +local ZOOM_FACTOR = 0.02 +local WHEEL_ZOOM_FACTOR = 4 +local PAN_FACTOR = 10 +local CHAR_WIDTH = 10 +local CHAR_HEIGHT = 16 +local NEGATIVE_MAXIMUM = 1 << 63 +local POSITIVE_MAXIMUM = ~NEGATIVE_MAXIMUM +local MAP_CLICK_BLOCK = "P1 Fire" -- prevent this input while clicking on map buttons -- shortcuts -local rl = memory.read_u32_le -local rw = memory.read_u16_le -local rb = memory.read_u8 -local rls = memory.read_s32_le -local rws = memory.read_s16_le -local rbs = memory.read_s8 -local text = gui.text -local box = gui.drawBox +local rl = memory.read_u32_le +local rw = memory.read_u16_le +local rb = memory.read_u8 +local rls = memory.read_s32_le +local rws = memory.read_s16_le +local rbs = memory.read_s8 +local text = gui.text +local box = gui.drawBox local drawline = gui.drawLine --local text = gui.pixelText -- INSANELY SLOW -- TOP LEVEL VARIABLES -local Zoom = 1 -local Init = true +local LastWheel = 0 +local Zoom = 1 +local Init = true -- tables -- view offset local Pan = { @@ -46,9 +48,9 @@ local LastScreenSize = { h = client.screenheight() } -- forward declarations -local PlayerOffsets = dsda.player.offsets-- player member offsets in bytes -local MobjOffsets = dsda.mobj.offsets-- mobj member offsets in bytes -local LineOffsets = dsda.line.offsets-- line member offsets in bytes +local PlayerOffsets = dsda.player.offsets -- player member offsets in bytes +local MobjOffsets = dsda.mobj.offsets -- mobj member offsets in bytes +local LineOffsets = dsda.line.offsets -- line member offsets in bytes local MobjType = dsda.mobjtype local SpriteNumber = dsda.doom.spritenum local Lines = {} @@ -89,18 +91,22 @@ local function pan_down(divider) Pan.y = Pan.y - PAN_FACTOR/Zoom/(divider or 2) end -local function zoom_out() - local newZoom = Zoom * (1 - ZOOM_FACTOR) - if newZoom < MINIMAL_ZOOM then return end - Zoom = newZoom - pan_left(1) - pan_up(1.4) +local function zoom_out(times) + for i=0, (times or 1) do + local newZoom = Zoom * (1 - ZOOM_FACTOR) + if newZoom < MINIMAL_ZOOM then return end + Zoom = newZoom + pan_left(1) + pan_up(1.4) + end end -local function zoom_in() - Zoom = Zoom * (1 + ZOOM_FACTOR) - pan_right(1) - pan_down(1.4) +local function zoom_in(times) + for i=0, (times or 1) do + Zoom = Zoom * (1 + ZOOM_FACTOR) + pan_right(1) + pan_down(1.4) + end end function maybe_swap(smaller, bigger) @@ -224,6 +230,13 @@ local function init_objects() end function update_zoom() + local newWheel = math.floor(input.getmouse().Wheel/120) + local wheelDelta = newWheel - LastWheel + if wheelDelta > 0 then zoom_in ( wheelDelta * WHEEL_ZOOM_FACTOR) + elseif wheelDelta < 0 then zoom_out(-wheelDelta * WHEEL_ZOOM_FACTOR) + end + LastWheel = newWheel + if not Init and LastScreenSize.w == client.screenwidth() and LastScreenSize.h == client.screenheight() @@ -280,6 +293,16 @@ local function make_button(x, y, name, func) text(textX, textY, name, colors[colorIndex] | 0xff000000) -- full alpha end +function make_buttons() + make_button( 10, client.screenheight()-70, "Zoom\nIn", zoom_in ) + make_button( 10, client.screenheight()-10, "Zoom\nOut", zoom_out ) + make_button( 80, client.screenheight()-40, "Pan\nLeft", pan_left ) + make_button(150, client.screenheight()-70, "Pan \nUp", pan_up ) + make_button(150, client.screenheight()-10, "Pan\nDown", pan_down ) + make_button(220, client.screenheight()-40, "Pan\nRight", pan_right ) + make_button(300, client.screenheight()-10, "Reset\nView", reset_view) +end + event.onexit(function() gui.clearGraphics() gui.cleartext() @@ -287,22 +310,23 @@ end) while true do if Init then init_objects() end + gui.clearGraphics() gui.cleartext() - make_button( 10, client.screenheight()-70, "Zoom\nIn", zoom_in ) - make_button( 10, client.screenheight()-10, "Zoom\nOut", zoom_out ) - make_button( 80, client.screenheight()-40, "Pan\nLeft", pan_left ) - make_button(150, client.screenheight()-70, "Pan \nUp", pan_up ) - make_button(150, client.screenheight()-10, "Pan\nDown", pan_down ) - make_button(220, client.screenheight()-40, "Pan\nRight", pan_right ) - make_button(300, client.screenheight()-10, "Reset\nView", reset_view) + + make_buttons() iterate() iterate_players() update_zoom() + + --[[-- text(10, client.screenheight()-170, string.format( "Zoom: %.4f\nPanX: %s\nPanY: %s", Zoom, Pan.x, Pan.y), 0xffbbddff) + --]]-- + LastScreenSize.w = client.screenwidth() LastScreenSize.h = client.screenheight() + emu.yield() end \ No newline at end of file From d92f291d4decb436ef09b8b3c2729247aef1a09e Mon Sep 17 00:00:00 2001 From: feos Date: Thu, 2 Oct 2025 23:57:36 +0300 Subject: [PATCH 22/49] mouse dragging (requires shift key) --- Assets/Lua/Doom/things-lines.lua | 33 ++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/Assets/Lua/Doom/things-lines.lua b/Assets/Lua/Doom/things-lines.lua index 67a35d46d86..1136cc2f422 100644 --- a/Assets/Lua/Doom/things-lines.lua +++ b/Assets/Lua/Doom/things-lines.lua @@ -8,6 +8,7 @@ local OUT_OF_BOUNDS = 0xFFFFFFFF -- no such index local MINIMAL_ZOOM = 0.0001 -- ??? local ZOOM_FACTOR = 0.02 local WHEEL_ZOOM_FACTOR = 4 +local DRAG_FACTOR = 10 local PAN_FACTOR = 10 local CHAR_WIDTH = 10 local CHAR_HEIGHT = 16 @@ -47,6 +48,11 @@ local LastScreenSize = { w = client.screenwidth(), h = client.screenheight() } +local LastMouse = { + x = 0, + y = 0, + wheel = 0 +} -- forward declarations local PlayerOffsets = dsda.player.offsets -- player member offsets in bytes local MobjOffsets = dsda.mobj.offsets -- mobj member offsets in bytes @@ -230,12 +236,30 @@ local function init_objects() end function update_zoom() - local newWheel = math.floor(input.getmouse().Wheel/120) - local wheelDelta = newWheel - LastWheel + local mouse = input.getmouse() + local mousePos = client.transformPoint(mouse.X, mouse.Y) + local deltaX = mousePos.x - LastMouse.x + local deltaY = mousePos.y - LastMouse.y + local newWheel = math.floor(mouse.Wheel/120) + local wheelDelta = newWheel - LastMouse.wheel + if wheelDelta > 0 then zoom_in ( wheelDelta * WHEEL_ZOOM_FACTOR) elseif wheelDelta < 0 then zoom_out(-wheelDelta * WHEEL_ZOOM_FACTOR) end - LastWheel = newWheel + + if mouse.Left and input.get()["Shift"] then + if deltaX > 0 then pan_left ( DRAG_FACTOR/deltaX) + elseif deltaX < 0 then pan_right(-DRAG_FACTOR/deltaX) + end + if deltaY > 0 then pan_up ( DRAG_FACTOR/deltaY) + elseif deltaY < 0 then pan_down(-DRAG_FACTOR/deltaY) + end + end + + LastMouse.x = mousePos.x + LastMouse.y = mousePos.y + LastMouse.left = mouse.Left + LastMouse.wheel = newWheel if not Init and LastScreenSize.w == client.screenwidth() @@ -279,7 +303,8 @@ local function make_button(x, y, name, func) local mousePos = client.transformPoint(mouse.X, mouse.Y) if in_range(mousePos.x, x, x+boxWidth) - and in_range(mousePos.y, y-boxHeight, y ) then + and in_range(mousePos.y, y-boxHeight, y ) + and not input.get()["Shift"] then if mouse.Left then if MAP_CLICK_BLOCK and MAP_CLICK_BLOCK ~= "" then joypad.set({ [MAP_CLICK_BLOCK] = false }) From dbbeea27a02874015ef26561c837ac4e400fd732 Mon Sep 17 00:00:00 2001 From: feos Date: Fri, 3 Oct 2025 00:04:51 +0300 Subject: [PATCH 23/49] account for merged modifiers --- Assets/Lua/Doom/things-lines.lua | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Assets/Lua/Doom/things-lines.lua b/Assets/Lua/Doom/things-lines.lua index 1136cc2f422..9695b16ee8d 100644 --- a/Assets/Lua/Doom/things-lines.lua +++ b/Assets/Lua/Doom/things-lines.lua @@ -247,7 +247,9 @@ function update_zoom() elseif wheelDelta < 0 then zoom_out(-wheelDelta * WHEEL_ZOOM_FACTOR) end - if mouse.Left and input.get()["Shift"] then + if mouse.Left + and (input.get()["Shift"] + or input.get()["LeftShift"]) then if deltaX > 0 then pan_left ( DRAG_FACTOR/deltaX) elseif deltaX < 0 then pan_right(-DRAG_FACTOR/deltaX) end @@ -304,7 +306,8 @@ local function make_button(x, y, name, func) if in_range(mousePos.x, x, x+boxWidth) and in_range(mousePos.y, y-boxHeight, y ) - and not input.get()["Shift"] then + and not input.get()["Shift"] + and not input.get()["LeftShift"] then if mouse.Left then if MAP_CLICK_BLOCK and MAP_CLICK_BLOCK ~= "" then joypad.set({ [MAP_CLICK_BLOCK] = false }) From 07ff75745f42fb664dc7fff9cb98be3406c7ed4e Mon Sep 17 00:00:00 2001 From: kalimag Date: Sat, 4 Oct 2025 17:23:44 +0200 Subject: [PATCH 24/49] Add mobjflags enum --- Assets/Lua/Doom/dsda-data.lua | 48 +++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/Assets/Lua/Doom/dsda-data.lua b/Assets/Lua/Doom/dsda-data.lua index 48a6c9b7bb4..040e6d6f66e 100644 --- a/Assets/Lua/Doom/dsda-data.lua +++ b/Assets/Lua/Doom/dsda-data.lua @@ -1758,5 +1758,53 @@ dsda.hexen.spritenum = { assign_keys(dsda.hexen.spritenum) +-- MF_* https://github.com/TASEmulators/dsda-doom/blob/7f03360ce0e9000c394fb99869d78adf4603ade5/prboom2/src/p_mobj.h#L121-L233 +dsda.mobjflags = { + SPECIAL = 0x1, + SOLID = 0x2, + SHOOTABLE = 0x4, + NOSECTOR = 0x8, + NOBLOCKMAP = 0x10, + AMBUSH = 0x20, + JUSTHIT = 0x40, + JUSTATTACKED = 0x80, + SPAWNCEILING = 0x100, + NOGRAVITY = 0x200, + DROPOFF = 0x400, + PICKUP = 0x800, + NOCLIP = 0x1000, + SLIDE = 0x2000, + FLOAT = 0x4000, + TELEPORT = 0x8000, + MISSILE = 0x10000, + DROPPED = 0x20000, + SHADOW = 0x40000, + NOBLOOD = 0x80000, + CORPSE = 0x100000, + INFLOAT = 0x200000, + COUNTKILL = 0x400000, + COUNTITEM = 0x800000, + SKULLFLY = 0x1000000, + NOTDMATCH = 0x2000000, + TRANSLATION = 0xc000000, + TRANSLATION1 = 0x4000000, + TRANSLATION2 = 0x8000000, + UNUSED2 = 0x10000000, + UNUSED3 = 0x20000000, + TRANSLUCENT = 0x40000000, + TOUCHY = 0x100000000, + BOUNCES = 0x200000000, + FRIEND = 0x400000000, + RESSURECTED = 0x1000000000, + NO_DEPTH_TEST = 0x2000000000, + FOREGROUND = 0x4000000000, + PLAYERSPRITE = 0x8000000000, + NOTARGET = 0x10000000000, + FLY = 0x20000000000, + ALTSHADOW = 0x40000000000, + ICECORPSE = 0x80000000000, +} + + return dsda; From 0190cf177e6805a2dff1be82916a3371be467510 Mon Sep 17 00:00:00 2001 From: kalimag Date: Sat, 4 Oct 2025 17:36:29 +0200 Subject: [PATCH 25/49] Color mobjs by type Also reorder code to minimize reads for mobjs that aren't displayed --- Assets/Lua/Doom/things-lines.lua | 80 ++++++++++++++++++++++---------- 1 file changed, 55 insertions(+), 25 deletions(-) diff --git a/Assets/Lua/Doom/things-lines.lua b/Assets/Lua/Doom/things-lines.lua index 9695b16ee8d..a0ca306561d 100644 --- a/Assets/Lua/Doom/things-lines.lua +++ b/Assets/Lua/Doom/things-lines.lua @@ -15,6 +15,18 @@ local CHAR_HEIGHT = 16 local NEGATIVE_MAXIMUM = 1 << 63 local POSITIVE_MAXIMUM = ~NEGATIVE_MAXIMUM local MAP_CLICK_BLOCK = "P1 Fire" -- prevent this input while clicking on map buttons + +-- Map colors (0xAARRGGBB or "name" or false) +local ENEMY_COLOR = 0xFFFF0000 +local ENEMY_WAIT_COLOR = 0xFFCC0000 +local CORPSE_COLOR = false -- 0x80CC0000 +local MISSILE_COLOR = 0xFFFF8000 +local PLAYER_COLOR = 0xFF0080FF +local COUNTITEM_COLOR = false -- 0xA0FFFFFF +local ITEM_COLOR = false -- 0xA0FFFFFF +local MISC_COLOR = false -- 0xFFFFFFFF +local INERT_COLOR = false -- 0x80808080 + -- shortcuts local rl = memory.read_u32_le local rw = memory.read_u16_le @@ -27,8 +39,14 @@ local box = gui.drawBox local drawline = gui.drawLine --local text = gui.pixelText -- INSANELY SLOW +local PlayerOffsets = dsda.player.offsets -- player member offsets in bytes +local MobjOffsets = dsda.mobj.offsets -- mobj member offsets in bytes +local LineOffsets = dsda.line.offsets -- line member offsets in bytes +local MobjType = dsda.mobjtype +local SpriteNumber = dsda.doom.spritenum +local MobjFlags = dsda.mobjflags + -- TOP LEVEL VARIABLES -local LastWheel = 0 local Zoom = 1 local Init = true -- tables @@ -54,11 +72,6 @@ local LastMouse = { wheel = 0 } -- forward declarations -local PlayerOffsets = dsda.player.offsets -- player member offsets in bytes -local MobjOffsets = dsda.mobj.offsets -- mobj member offsets in bytes -local LineOffsets = dsda.line.offsets -- line member offsets in bytes -local MobjType = dsda.mobjtype -local SpriteNumber = dsda.doom.spritenum local Lines = {} --gui.defaultPixelFont("fceux") @@ -141,6 +154,21 @@ local function get_line_count(str) return lines, longest end +local function get_mobj_color(mobj) + local flags = mobj.flags + if flags & (MobjFlags.PICKUP | MobjFlags.FRIEND) ~= 0 then return PLAYER_COLOR end + if flags & (MobjFlags.COUNTKILL | MobjFlags.SKULLFLY) ~= 0 then + if flags & MobjFlags.CORPSE ~= 0 and flags & MobjFlags.RESSURECTED == 0 then return CORPSE_COLOR end + if flags & MobjFlags.AMBUSH ~= 0 or mobj.target == 0 then return ENEMY_WAIT_COLOR end + return ENEMY_COLOR + end + if flags & MobjFlags.COUNTITEM ~= 0 then return COUNTITEM_COLOR end + if flags & MobjFlags.SPECIAL ~= 0 then return ITEM_COLOR end + if flags & MobjFlags.MISSILE ~= 0 then return MISSILE_COLOR end + if flags & MobjFlags.SHOOTABLE ~= 0 then return MISC_COLOR end + return INERT_COLOR +end + local function iterate_players() local playercount = 0 local total_killcount = 0 @@ -170,25 +198,27 @@ local function iterate() if Init then return end for addr, mobj in pairs(dsda.mobj.items) do - local pos = { x = mapify_x(mobj.x), y = mapify_y(-mobj.y) } - local radius = math.floor ((mobj.radius >> 16) * Zoom) - -- local sprite = SpriteNumber[mobj.sprite] - local type = MobjType[mobj.type] - local color = "white" - - if mobj.health <= 0 then color = "red" end - --[[-- - local z = mobj.z - local index = mobj.index - local tics = mobj.tics - --]]-- - if in_range(pos.x, 0, client.screenwidth()) - and in_range(pos.y, 0, client.screenheight()) - and type - and not string.find(type, "MISC") - then - text(pos.x, pos.y, string.format("%s", type), color) - box(pos.x - radius, pos.y - radius, pos.x + radius, pos.y + radius, color) + local color = get_mobj_color(mobj) + if color then -- not hidden + local pos = { x = mapify_x(mobj.x), y = mapify_y(-mobj.y) } + + if in_range(pos.x, 0, client.screenwidth()) + and in_range(pos.y, 0, client.screenheight()) + then + local type = mobj.type + local radius = math.floor ((mobj.radius >> 16) * Zoom) + --[[-- + local z = mobj.z + local index = mobj.index + local tics = mobj.tics + local health = mobj.health + local sprite = SpriteNumber[mobj.sprite] + --]]-- + + type = MobjType[type] + text(pos.x, pos.y, string.format("%s", type), color) + box(pos.x - radius, pos.y - radius, pos.x + radius, pos.y + radius, color) + end end end From 0a949889446bb2ece0e96ecaa601b940c3bea518 Mon Sep 17 00:00:00 2001 From: kalimag Date: Sun, 5 Oct 2025 01:14:03 +0200 Subject: [PATCH 26/49] Fix corpse color --- Assets/Lua/Doom/things-lines.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Assets/Lua/Doom/things-lines.lua b/Assets/Lua/Doom/things-lines.lua index a0ca306561d..26c05ed3566 100644 --- a/Assets/Lua/Doom/things-lines.lua +++ b/Assets/Lua/Doom/things-lines.lua @@ -158,7 +158,7 @@ local function get_mobj_color(mobj) local flags = mobj.flags if flags & (MobjFlags.PICKUP | MobjFlags.FRIEND) ~= 0 then return PLAYER_COLOR end if flags & (MobjFlags.COUNTKILL | MobjFlags.SKULLFLY) ~= 0 then - if flags & MobjFlags.CORPSE ~= 0 and flags & MobjFlags.RESSURECTED == 0 then return CORPSE_COLOR end + if flags & MobjFlags.CORPSE ~= 0 then return CORPSE_COLOR end if flags & MobjFlags.AMBUSH ~= 0 or mobj.target == 0 then return ENEMY_WAIT_COLOR end return ENEMY_COLOR end From acd9b3c1d9e1c44059abfbc29d15caa714252475 Mon Sep 17 00:00:00 2001 From: kalimag Date: Mon, 6 Oct 2025 18:37:02 +0200 Subject: [PATCH 27/49] Rename u64 -to s64 Lua doesn't have unsigned longs, but the signedness doesn't matter for flags and pointers anyway --- Assets/Lua/Doom/dsda-data.lua | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Assets/Lua/Doom/dsda-data.lua b/Assets/Lua/Doom/dsda-data.lua index 040e6d6f66e..ce1e190e755 100644 --- a/Assets/Lua/Doom/dsda-data.lua +++ b/Assets/Lua/Doom/dsda-data.lua @@ -31,8 +31,8 @@ local function assertf(condition, format, ...) end end -function dsda.read_u64_le(addr, domain) return memory.read_u32_le(addr, domain) | memory.read_u32_le(addr + 4, domain) << 32 +function dsda.read_s64_le(addr, domain) end function dsda.read_bool(addr, domain) @@ -100,9 +100,9 @@ function dsda.struct_layout(struct, padded_size, domain, max_count) function struct.u8 (name) return struct.add(name, 1, true, memory.read_u8) end function struct.u16 (name) return struct.add(name, 2, true, memory.read_u16_le) end function struct.u32 (name) return struct.add(name, 4, true, memory.read_u32_le) end - function struct.u64 (name) return struct.add(name, 8, true, dsda.read_u64_le) end + function struct.s64 (name) return struct.add(name, 8, true, dsda.read_s64_le) end function struct.float(name) return struct.add(name, 4, true, read_float_le) end - function struct.ptr (name) return struct.u64(name) end + function struct.ptr (name) return struct.s64(name) end function struct.bool (name) return struct.add(name, 4, true, dsda.read_bool) end function struct.array(name, type, count, ...) --console.log("array", type, count, ...) @@ -277,7 +277,7 @@ dsda.mobj = dsda.struct_layout(nil, dsda.MOBJ_SIZE, "Things") .ptr ("info") .s32 ("tics") .ptr ("state") - .u64 ("flags") + .s64 ("flags") .s32 ("intflags") .s32 ("health") .s16 ("movedir") @@ -305,7 +305,7 @@ dsda.mobj = dsda.struct_layout(nil, dsda.MOBJ_SIZE, "Things") .s32 ("iden_nums") -- heretic .s32 ("damage") - .u64 ("flags2") + .s64 ("flags2") .add ("special1", 16, 8) -- specialval_t .add ("special2", 16, 8) -- specialval_t -- hexen From 08127c2c12e9d1078198af0143915c1fbf483bb8 Mon Sep 17 00:00:00 2001 From: kalimag Date: Mon, 6 Oct 2025 18:41:29 +0200 Subject: [PATCH 28/49] Local mem functions --- Assets/Lua/Doom/dsda-data.lua | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/Assets/Lua/Doom/dsda-data.lua b/Assets/Lua/Doom/dsda-data.lua index ce1e190e755..688eaf05dc2 100644 --- a/Assets/Lua/Doom/dsda-data.lua +++ b/Assets/Lua/Doom/dsda-data.lua @@ -23,6 +23,12 @@ dsda.SECTOR_SIZE = 512 -- sizeof(sector_t) is 344, but we padded it for nicenes +-- Locals +local read_u8 = memory.read_u8 +local read_u24 = memory.read_u24_le +local read_u32 = memory.read_u32_le +local readfloat = memory.readfloat + -- Utilities --- local function assertf(condition, format, ...) @@ -31,16 +37,16 @@ local function assertf(condition, format, ...) end end - return memory.read_u32_le(addr, domain) | memory.read_u32_le(addr + 4, domain) << 32 function dsda.read_s64_le(addr, domain) + return read_u32(addr, domain) | read_u32(addr + 4, domain) << 32 end function dsda.read_bool(addr, domain) - return memory.read_u32_le(addr, domain) ~= 0 + return read_u32(addr, domain) ~= 0 end local function read_float_le(addr, domain) - return memory.readfloat(addr, false, domain) + return readfloat(addr, false, domain) end @@ -117,7 +123,7 @@ function dsda.struct_layout(struct, padded_size, domain, max_count) assertf(address >= 0 and address <= max_address and address % padded_size == 0, "Invalid %s address %X", domain, address) - local peek = memory.read_u32_le(address, domain) + local peek = read_u32(address, domain) if peek == NULL_OBJECT then --print("NULL_OBJECT", domain, bizstring.hex(address)) return nil From 132c897ffffa950f701b0715289b60d97017f4d5 Mon Sep 17 00:00:00 2001 From: kalimag Date: Mon, 6 Oct 2025 18:42:55 +0200 Subject: [PATCH 29/49] Track overall struct alignment --- Assets/Lua/Doom/dsda-data.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Assets/Lua/Doom/dsda-data.lua b/Assets/Lua/Doom/dsda-data.lua index 688eaf05dc2..65e37c61e0a 100644 --- a/Assets/Lua/Doom/dsda-data.lua +++ b/Assets/Lua/Doom/dsda-data.lua @@ -58,6 +58,7 @@ function dsda.struct_layout(struct, padded_size, domain, max_count) struct.padded_size = padded_size struct.domain = domain struct.size = 0 + struct.alignment = 1 struct.offsets = {} struct.items = {} -- This should be iterated with pairs() @@ -90,6 +91,7 @@ function dsda.struct_layout(struct, padded_size, domain, max_count) return struct end function struct.align(alignment) + struct.alignment = math.max(struct.alignment, alignment or 1) if alignment and struct.size % alignment > 0 then --print(string.format("%i bytes padding", alignment - (struct.size % alignment))) struct.pad(alignment - (struct.size % alignment)) From 1914ea5213d2560f92d9f85bdb8d7db4c8ceed64 Mon Sep 17 00:00:00 2001 From: kalimag Date: Mon, 6 Oct 2025 18:47:17 +0200 Subject: [PATCH 30/49] Support reading structs from system bus --- Assets/Lua/Doom/dsda-data.lua | 62 +++++++++++++++++++++++++++-------- 1 file changed, 49 insertions(+), 13 deletions(-) diff --git a/Assets/Lua/Doom/dsda-data.lua b/Assets/Lua/Doom/dsda-data.lua index 65e37c61e0a..e97dbc6f5f3 100644 --- a/Assets/Lua/Doom/dsda-data.lua +++ b/Assets/Lua/Doom/dsda-data.lua @@ -11,8 +11,10 @@ local dsda = { -- Constants --- -local NULL_OBJECT = 0x88888888 -- no object at that index -local OUT_OF_BOUNDS = 0xFFFFFFFF -- no such index +local NULL_OBJECT = 0x88888888 -- no object at that index +local OUT_OF_BOUNDS = 0xFFFFFFFF -- no such index +local WBX_POINTER_HI = 0x36F +local BusDomain = "System Bus" dsda.MAX_PLAYERS = 4 -- sizes in bytes @@ -41,6 +43,11 @@ function dsda.read_s64_le(addr, domain) return read_u32(addr, domain) | read_u32(addr + 4, domain) << 32 end +-- Returns the lower 4 bytes of an 8 byte pointer +function dsda.read_ptr(addr, domain) + return read_u32(addr, domain) +end + function dsda.read_bool(addr, domain) return read_u32(addr, domain) ~= 0 end @@ -62,10 +69,17 @@ function dsda.struct_layout(struct, padded_size, domain, max_count) struct.offsets = {} struct.items = {} -- This should be iterated with pairs() - max_count = max_count or math.floor(memory.getmemorydomainsize(domain) / padded_size) - local max_address = (max_count - 1) * padded_size - struct.max_count = max_count - struct.max_address = max_address + assert((padded_size ~= nil) == (domain ~= nil), "padded_size and domain must be specified together") + + local max_address + if domain then + max_count = max_count or math.floor(memory.getmemorydomainsize(domain) / padded_size) + max_address = (max_count - 1) * padded_size + struct.max_count = max_count + struct.max_address = max_address + else + max_address = 0xFFFFFFFF + end local items_meta = {} local item_props = {} @@ -119,9 +133,27 @@ function dsda.struct_layout(struct, padded_size, domain, max_count) end return struct end + function struct.ptrto(name, target_struct) + local size = struct.size + struct.ptr(name .. "_ptr") + struct.size = size + struct.add(name, 8, true, function(addr, domain) + local ptr = dsda.read_ptr(addr, domain) + return target_struct.from_pointer(ptr) + end) + return struct + end - + local function create_item(address, domain) + local item = { + _address = address, + _domain = domain, + } + setmetatable(item, item_meta) + return item + end local function get_item(address) + assert(domain ~= nil, "Struct can only be accessed by pointer") assertf(address >= 0 and address <= max_address and address % padded_size == 0, "Invalid %s address %X", domain, address) @@ -134,11 +166,7 @@ function dsda.struct_layout(struct, padded_size, domain, max_count) return false end - local item = { - _address = address, - } - setmetatable(item, item_meta) - return item + return create_item(address, domain) end -- iterator for each instance of the struct in the domain @@ -162,12 +190,20 @@ function dsda.struct_layout(struct, padded_size, domain, max_count) return next_key, item[next_key] end + -- Get a struct instance from its dedicated memory domain function struct.from_address(address) return get_item(address) or nil end + -- Get a struct instance from its dedicated memory domain function struct.from_index(index) - return get_item((index - 1) * padded_size) or nil + return get_item((index - 1) * (padded_size or 0)) or nil + end + + -- Get a struct instance from the system bus + function struct.from_pointer(pointer) + assertf(pointer % struct.alignment == 0, "Unaligned pointer %X", pointer) + return create_item(pointer, BusDomain) end function items_meta:__index(index) From 04c4ee36ccc8584b9802f1ce4873b280462e5d06 Mon Sep 17 00:00:00 2001 From: kalimag Date: Mon, 6 Oct 2025 18:54:25 +0200 Subject: [PATCH 31/49] Add debug flag for pointer correctness --- Assets/Lua/Doom/dsda-data.lua | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Assets/Lua/Doom/dsda-data.lua b/Assets/Lua/Doom/dsda-data.lua index e97dbc6f5f3..15fb0bd0a80 100644 --- a/Assets/Lua/Doom/dsda-data.lua +++ b/Assets/Lua/Doom/dsda-data.lua @@ -8,6 +8,9 @@ local dsda = { hexen = {}, } + -- Read the high word of every pointer and check that it matches the expected base address (for debugging) +dsda.check_pointers = false + -- Constants --- @@ -45,6 +48,9 @@ end -- Returns the lower 4 bytes of an 8 byte pointer function dsda.read_ptr(addr, domain) + if dsda.check_pointers and read_u32(addr + 4, domain) ~= WBX_POINTER_HI then + error(string.format("Invalid pointer 0x%016X at %s 0x%X", dsda.read_s64_le(addr, domain), domain, addr)) + end return read_u32(addr, domain) end From 56267ec2ff862eb0b1194a599036bb17f452f273 Mon Sep 17 00:00:00 2001 From: kalimag Date: Mon, 6 Oct 2025 18:56:26 +0200 Subject: [PATCH 32/49] Read line vertices from system bus --- Assets/Lua/Doom/dsda-data.lua | 18 +++++++++--------- Assets/Lua/Doom/things-lines.lua | 9 +++++---- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/Assets/Lua/Doom/dsda-data.lua b/Assets/Lua/Doom/dsda-data.lua index 15fb0bd0a80..648654642c4 100644 --- a/Assets/Lua/Doom/dsda-data.lua +++ b/Assets/Lua/Doom/dsda-data.lua @@ -445,12 +445,18 @@ dsda.sector = dsda.struct_layout(nil, dsda.SECTOR_SIZE, "Sectors") .s32 ("ceiling_xscale") .s32 ("ceiling_yscale") +-- vertex_t https://github.com/TASEmulators/dsda-doom/blob/623068c33f6bf21239c6c6941f221011b08b6bb9/prboom2/src/r_defs.h#L70-L80 +dsda.vertex = dsda.struct_layout() + .s32 ("x") + .s32 ("y") + .s32 ("px") + .s32 ("py") + -- line_t https://github.com/TASEmulators/dsda-doom/blob/5608ee441410ecae10a17ecdbe1940bd4e1a2856/prboom2/src/r_defs.h#L312-L347 --- followed by v1, v2 coords dsda.line = dsda.struct_layout(nil, dsda.LINE_SIZE, "Lines") .s32 ("iLineID") - .ptr ("v1") - .ptr ("v2") + .ptrto("v1", dsda.vertex) + .ptrto("v2", dsda.vertex) .s32 ("dx") .s32 ("dy") .float("texel_length") @@ -484,12 +490,6 @@ dsda.line = dsda.struct_layout(nil, dsda.LINE_SIZE, "Lines") .s32 ("healthgroup") .ptr ("tranmap") .float("alpha") - .align(8) - -- BizHawk - .s32 ("v1_x") - .s32 ("v1_y") - .s32 ("v2_x") - .s32 ("v2_y") diff --git a/Assets/Lua/Doom/things-lines.lua b/Assets/Lua/Doom/things-lines.lua index 26c05ed3566..97cb63a5390 100644 --- a/Assets/Lua/Doom/things-lines.lua +++ b/Assets/Lua/Doom/things-lines.lua @@ -228,11 +228,12 @@ local function iterate() -- when moving so this is a decent way of cutting down on memory reads local validcount = line.validcount if validcount ~= line._validcount then + local v1, v2 = line.v1, line.v2 line._validcount = validcount - line._v1 = { x = line.v1_x, - y = -line.v1_y, } - line._v2 = { x = line.v2_x, - y = -line.v2_y, } + line._v1 = { x = v1.x, + y = -v1.y, } + line._v2 = { x = v2.x, + y = -v2.y, } end local v1, v2 = line._v1, line._v2 local special = line.special From 6d9c1a5afcd41904a8c4d30a2cf384fbfe237c87 Mon Sep 17 00:00:00 2001 From: kalimag Date: Mon, 6 Oct 2025 20:44:43 +0200 Subject: [PATCH 33/49] Fix reading from the wrong domain --- Assets/Lua/Doom/dsda-data.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Assets/Lua/Doom/dsda-data.lua b/Assets/Lua/Doom/dsda-data.lua index 648654642c4..8405afa6061 100644 --- a/Assets/Lua/Doom/dsda-data.lua +++ b/Assets/Lua/Doom/dsda-data.lua @@ -105,7 +105,7 @@ function dsda.struct_layout(struct, padded_size, domain, max_count) if read_func then item_props[name] = function(self) - return read_func(self._address + offset, domain) + return read_func(self._address + offset, self._domain) end end return struct From 0a9a94cb8a55f2f1685b4d7637f76c273e70b1b9 Mon Sep 17 00:00:00 2001 From: kalimag Date: Mon, 6 Oct 2025 20:45:05 +0200 Subject: [PATCH 34/49] Return nil for null pointers --- Assets/Lua/Doom/dsda-data.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/Assets/Lua/Doom/dsda-data.lua b/Assets/Lua/Doom/dsda-data.lua index 8405afa6061..fc997cd3379 100644 --- a/Assets/Lua/Doom/dsda-data.lua +++ b/Assets/Lua/Doom/dsda-data.lua @@ -208,6 +208,7 @@ function dsda.struct_layout(struct, padded_size, domain, max_count) -- Get a struct instance from the system bus function struct.from_pointer(pointer) + if pointer == 0 then return nil end assertf(pointer % struct.alignment == 0, "Unaligned pointer %X", pointer) return create_item(pointer, BusDomain) end From 82b418415fbe9bf8865299252807631e699600cc Mon Sep 17 00:00:00 2001 From: kalimag Date: Mon, 6 Oct 2025 20:52:46 +0200 Subject: [PATCH 35/49] More typed pointers --- Assets/Lua/Doom/dsda-data.lua | 37 +++++++++++++++++--------------- Assets/Lua/Doom/things-lines.lua | 2 +- 2 files changed, 21 insertions(+), 18 deletions(-) diff --git a/Assets/Lua/Doom/dsda-data.lua b/Assets/Lua/Doom/dsda-data.lua index fc997cd3379..4d49a544a38 100644 --- a/Assets/Lua/Doom/dsda-data.lua +++ b/Assets/Lua/Doom/dsda-data.lua @@ -233,9 +233,12 @@ function dsda.struct_layout(struct, padded_size, domain, max_count) return struct end +-- mobj_t https://github.com/TASEmulators/dsda-doom/blob/5608ee441410ecae10a17ecdbe1940bd4e1a2856/prboom2/src/p_mobj.h#L277-L413 +dsda.mobj = dsda.struct_layout(nil, dsda.MOBJ_SIZE, "Things") + -- player_t https://github.com/TASEmulators/dsda-doom/blob/5608ee441410ecae10a17ecdbe1940bd4e1a2856/prboom2/src/d_player.h#L143-L267 dsda.player = dsda.struct_layout(nil, dsda.PLAYER_SIZE, "Players", dsda.MAX_PLAYERS) - .ptr ("mobj") + .ptrto("mo", dsda.mobj) .s32 ("playerstate") -- playerstate_t .add ("cmd", 14, 2) .s32 ("viewz") @@ -263,7 +266,7 @@ dsda.player = dsda.struct_layout(nil, dsda.PLAYER_SIZE, "Players", dsda.MAX_PLAY .s32 ("secretcount") .s32 ("damagecount") .s32 ("bonuscount") - .ptr ("attacker") + .ptrto("attacker", dsda.mobj) .s32 ("extralight") .s32 ("fixedcolormap") .s32 ("colormap") @@ -286,15 +289,15 @@ dsda.player = dsda.struct_layout(nil, dsda.PLAYER_SIZE, "Players", dsda.MAX_PLAY .s32 ("flamecount") .s32 ("chickenTics") .s32 ("chickenPeck") - .ptr ("rain1") - .ptr ("rain2") + .ptrto("rain1", dsda.mobj) + .ptrto("rain2", dsda.mobj) -- hexen .s32 ("pclass") -- pclass_t .s32 ("morphTics") .s32 ("pieces") .s16 ("yellowMessage") .s32 ("poisoncount") - .ptr ("poisoner") + .ptrto("poisoner", dsda.mobj) .u32 ("jumpTics") .u32 ("worldTimer") -- zdoom @@ -302,13 +305,13 @@ dsda.player = dsda.struct_layout(nil, dsda.PLAYER_SIZE, "Players", dsda.MAX_PLAY .u8 ("hazardinterval") -- mobj_t https://github.com/TASEmulators/dsda-doom/blob/5608ee441410ecae10a17ecdbe1940bd4e1a2856/prboom2/src/p_mobj.h#L277-L413 -dsda.mobj = dsda.struct_layout(nil, dsda.MOBJ_SIZE, "Things") +dsda.mobj .add ("thinker", 44, 8) .s32 ("x") .s32 ("y") .s32 ("z") - .ptr ("snext") - .ptr ("sprev") + .ptrto("snext", dsda.mobj) + .ptr ("sprev") -- pointer to pointer .u32 ("angle") .s32 ("sprite") -- spritenum_t .s32 ("frame") @@ -334,16 +337,16 @@ dsda.mobj = dsda.struct_layout(nil, dsda.MOBJ_SIZE, "Things") .s16 ("movedir") .s16 ("movecount") .s16 ("strafecount") - .ptr ("target") + .ptrto("target", dsda.mobj) .s16 ("reactiontime") .s16 ("threshold") .s16 ("pursuecount") .s16 ("gear") - .ptr ("player") + .ptrto("player", dsda.player) .s16 ("lastlook") .add ("spawnpoint", 58, 4) -- mapthing_t - .ptr ("tracer") - .ptr ("lastenemy") + .ptrto("tracer", dsda.mobj) + .ptrto("lastenemy", dsda.mobj) .s32 ("friction") .s32 ("movefactor") .ptr ("touching_sectorlist") @@ -380,7 +383,7 @@ dsda.sector = dsda.struct_layout(nil, dsda.SECTOR_SIZE, "Sectors") .s32 ("floorheight") .s32 ("ceilingheight") .u8 ("soundtraversed") - .ptr ("soundtarget") + .ptrto("soundtarget", dsda.mobj) .array("blockbox", "s32", 4) -- .array("bbox", "s32", 4) .s32 ("bbox_top") @@ -390,7 +393,7 @@ dsda.sector = dsda.struct_layout(nil, dsda.SECTOR_SIZE, "Sectors") .add ("soundorg", 60, 8) -- degenmobj_t; .s32 ("validcount") .s32 ("gl_validcount") - .ptr ("thinglist") + .ptrto("thinglist", dsda.mobj) -- start of snext linked list .s32 ("friction") .s32 ("movefactor") .ptr ("floordata") @@ -406,7 +409,7 @@ dsda.sector = dsda.struct_layout(nil, dsda.SECTOR_SIZE, "Sectors") .s16 ("colormap") .ptr ("touching_thinglist") .s32 ("linecount") - .ptr ("lines") + .ptr ("lines") -- pointer to pointer .s32 ("floorsky") .s32 ("ceilingsky") .s32 ("floor_xoffs") @@ -471,8 +474,8 @@ dsda.line = dsda.struct_layout(nil, dsda.LINE_SIZE, "Lines") .s32 ("bbox_left") .s32 ("bbox_right") .s32 ("slopetype") -- slopetype_t - .ptr ("frontsector") - .ptr ("backsector") + .ptrto("frontsector", dsda.sector) + .ptrto("backsector", dsda.sector) .s32 ("validcount") .s32 ("validcount2") .ptr ("specialdata") diff --git a/Assets/Lua/Doom/things-lines.lua b/Assets/Lua/Doom/things-lines.lua index 97cb63a5390..ce8b392d1a4 100644 --- a/Assets/Lua/Doom/things-lines.lua +++ b/Assets/Lua/Doom/things-lines.lua @@ -159,7 +159,7 @@ local function get_mobj_color(mobj) if flags & (MobjFlags.PICKUP | MobjFlags.FRIEND) ~= 0 then return PLAYER_COLOR end if flags & (MobjFlags.COUNTKILL | MobjFlags.SKULLFLY) ~= 0 then if flags & MobjFlags.CORPSE ~= 0 then return CORPSE_COLOR end - if flags & MobjFlags.AMBUSH ~= 0 or mobj.target == 0 then return ENEMY_WAIT_COLOR end + if flags & MobjFlags.AMBUSH ~= 0 or mobj.target_ptr == 0 then return ENEMY_WAIT_COLOR end return ENEMY_COLOR end if flags & MobjFlags.COUNTITEM ~= 0 then return COUNTITEM_COLOR end From 7e43323a606881fb4aad2c31194932ddbfadcda4 Mon Sep 17 00:00:00 2001 From: kalimag Date: Mon, 6 Oct 2025 23:46:08 +0200 Subject: [PATCH 36/49] Pad structs, verify expected size --- Assets/Lua/Doom/dsda-data.lua | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/Assets/Lua/Doom/dsda-data.lua b/Assets/Lua/Doom/dsda-data.lua index 4d49a544a38..759a55e562c 100644 --- a/Assets/Lua/Doom/dsda-data.lua +++ b/Assets/Lua/Doom/dsda-data.lua @@ -149,6 +149,10 @@ function dsda.struct_layout(struct, padded_size, domain, max_count) end) return struct end + function struct.done() + struct.align(struct.alignment) + return struct + end local function create_item(address, domain) local item = { @@ -303,6 +307,7 @@ dsda.player = dsda.struct_layout(nil, dsda.PLAYER_SIZE, "Players", dsda.MAX_PLAY -- zdoom .s32 ("hazardcount") .u8 ("hazardinterval") + .done () -- mobj_t https://github.com/TASEmulators/dsda-doom/blob/5608ee441410ecae10a17ecdbe1940bd4e1a2856/prboom2/src/p_mobj.h#L277-L413 dsda.mobj @@ -375,6 +380,7 @@ dsda.mobj -- misc .u8 ("color") .ptr ("tranmap") + .done () -- sector_t https://github.com/TASEmulators/dsda-doom/blob/5608ee441410ecae10a17ecdbe1940bd4e1a2856/prboom2/src/r_defs.h#L124-L213 dsda.sector = dsda.struct_layout(nil, dsda.SECTOR_SIZE, "Sectors") @@ -448,6 +454,7 @@ dsda.sector = dsda.struct_layout(nil, dsda.SECTOR_SIZE, "Sectors") .s32 ("floor_yscale") .s32 ("ceiling_xscale") .s32 ("ceiling_yscale") + .done () -- vertex_t https://github.com/TASEmulators/dsda-doom/blob/623068c33f6bf21239c6c6941f221011b08b6bb9/prboom2/src/r_defs.h#L70-L80 dsda.vertex = dsda.struct_layout() @@ -455,6 +462,7 @@ dsda.vertex = dsda.struct_layout() .s32 ("y") .s32 ("px") .s32 ("py") + .done () -- line_t https://github.com/TASEmulators/dsda-doom/blob/5608ee441410ecae10a17ecdbe1940bd4e1a2856/prboom2/src/r_defs.h#L312-L347 dsda.line = dsda.struct_layout(nil, dsda.LINE_SIZE, "Lines") @@ -494,6 +502,12 @@ dsda.line = dsda.struct_layout(nil, dsda.LINE_SIZE, "Lines") .s32 ("healthgroup") .ptr ("tranmap") .float("alpha") + .done () + +assert(dsda.line.size == 232, "line.size does not match sizeof(line_t)") +assert(dsda.mobj.size == 464, "mobj.size does not match sizeof(mobj_t)") +assert(dsda.player.size == 792, "player.size does not match sizeof(player_t)") +assert(dsda.sector.size == 344, "sector.size does not match sizeof(sector_t)") From 432919e17a7a1cd4615e7a895168232a3801356b Mon Sep 17 00:00:00 2001 From: kalimag Date: Mon, 6 Oct 2025 23:47:52 +0200 Subject: [PATCH 37/49] Remove size consts They're still available through `line.padded_size` etc. --- Assets/Lua/Doom/dsda-data.lua | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/Assets/Lua/Doom/dsda-data.lua b/Assets/Lua/Doom/dsda-data.lua index 759a55e562c..7a06cc42387 100644 --- a/Assets/Lua/Doom/dsda-data.lua +++ b/Assets/Lua/Doom/dsda-data.lua @@ -20,11 +20,6 @@ local WBX_POINTER_HI = 0x36F local BusDomain = "System Bus" dsda.MAX_PLAYERS = 4 --- sizes in bytes -dsda.LINE_SIZE = 256 -- sizeof(line_t) is 232, but we padded it for niceness -dsda.MOBJ_SIZE = 512 -- sizeof(mobj_t) is 464, but we padded it for niceness -dsda.PLAYER_SIZE = 1024 -- sizeof(player_t) is 729, but we padded it for niceness -dsda.SECTOR_SIZE = 512 -- sizeof(sector_t) is 344, but we padded it for niceness @@ -238,10 +233,10 @@ function dsda.struct_layout(struct, padded_size, domain, max_count) end -- mobj_t https://github.com/TASEmulators/dsda-doom/blob/5608ee441410ecae10a17ecdbe1940bd4e1a2856/prboom2/src/p_mobj.h#L277-L413 -dsda.mobj = dsda.struct_layout(nil, dsda.MOBJ_SIZE, "Things") +dsda.mobj = dsda.struct_layout(nil, 512, "Things") -- player_t https://github.com/TASEmulators/dsda-doom/blob/5608ee441410ecae10a17ecdbe1940bd4e1a2856/prboom2/src/d_player.h#L143-L267 -dsda.player = dsda.struct_layout(nil, dsda.PLAYER_SIZE, "Players", dsda.MAX_PLAYERS) +dsda.player = dsda.struct_layout(nil, 1024, "Players", dsda.MAX_PLAYERS) .ptrto("mo", dsda.mobj) .s32 ("playerstate") -- playerstate_t .add ("cmd", 14, 2) @@ -383,7 +378,7 @@ dsda.mobj .done () -- sector_t https://github.com/TASEmulators/dsda-doom/blob/5608ee441410ecae10a17ecdbe1940bd4e1a2856/prboom2/src/r_defs.h#L124-L213 -dsda.sector = dsda.struct_layout(nil, dsda.SECTOR_SIZE, "Sectors") +dsda.sector = dsda.struct_layout(nil, 512, "Sectors") .s32 ("iSectorID") .u32 ("flags") .s32 ("floorheight") @@ -465,7 +460,7 @@ dsda.vertex = dsda.struct_layout() .done () -- line_t https://github.com/TASEmulators/dsda-doom/blob/5608ee441410ecae10a17ecdbe1940bd4e1a2856/prboom2/src/r_defs.h#L312-L347 -dsda.line = dsda.struct_layout(nil, dsda.LINE_SIZE, "Lines") +dsda.line = dsda.struct_layout(nil, 256, "Lines") .s32 ("iLineID") .ptrto("v1", dsda.vertex) .ptrto("v2", dsda.vertex) From d73a61d1dfdaae3a37b1896f72f4a3c8898e566f Mon Sep 17 00:00:00 2001 From: kalimag Date: Tue, 7 Oct 2025 01:39:00 +0200 Subject: [PATCH 38/49] Add mobjinfo struct --- Assets/Lua/Doom/dsda-data.lua | 44 +++++++++++++++++++++++++++++++++-- 1 file changed, 42 insertions(+), 2 deletions(-) diff --git a/Assets/Lua/Doom/dsda-data.lua b/Assets/Lua/Doom/dsda-data.lua index 7a06cc42387..a3484e02348 100644 --- a/Assets/Lua/Doom/dsda-data.lua +++ b/Assets/Lua/Doom/dsda-data.lua @@ -304,6 +304,46 @@ dsda.player = dsda.struct_layout(nil, 1024, "Players", dsda.MAX_PLAYERS) .u8 ("hazardinterval") .done () +-- mobjinfo_t https://github.com/TASEmulators/dsda-doom/blob/623068c33f6bf21239c6c6941f221011b08b6bb9/prboom2/src/info.h#L6525-L6589 +dsda.mobjinfo = dsda.struct_layout() + .s32 ("doomednum") + .s32 ("spawnstate") + .s32 ("spawnhealth") + .s32 ("seestate") + .s32 ("seesound") + .s32 ("reactiontime") + .s32 ("attacksound") + .s32 ("painstate") + .s32 ("painchance") + .s32 ("painsound") + .s32 ("meleestate") + .s32 ("missilestate") + .s32 ("deathstate") + .s32 ("xdeathstate") + .s32 ("deathsound") + .s32 ("speed") + .s32 ("radius") + .s32 ("height") + .s32 ("mass") + .s32 ("damage") + .s32 ("activesound") + .s64 ("flags") -- mobjflags + .s32 ("raisestate") + .s32 ("droppeditem") -- mobjtype_t + -- heretic + .s32 ("crashstate") + .s64 ("flags2") + -- mbf21 + .s32 ("infighting_group") + .s32 ("projectile_group") + .s32 ("splash_group") + .s32 ("ripsound") + .s32 ("altspeed") + .s32 ("meleerange") + -- misc + .s32 ("bloodcolor") + .s32 ("visibility") + -- mobj_t https://github.com/TASEmulators/dsda-doom/blob/5608ee441410ecae10a17ecdbe1940bd4e1a2856/prboom2/src/p_mobj.h#L277-L413 dsda.mobj .add ("thinker", 44, 8) @@ -328,10 +368,10 @@ dsda.mobj .s32 ("momz") .s32 ("validcount") .s32 ("type") -- mobjtype_t - .ptr ("info") + .ptrto("info", dsda.mobjinfo) .s32 ("tics") .ptr ("state") - .s64 ("flags") + .s64 ("flags") -- mobjflags .s32 ("intflags") .s32 ("health") .s16 ("movedir") From 1c520c65ef79cc015e9955768566763941be75e1 Mon Sep 17 00:00:00 2001 From: kalimag Date: Tue, 7 Oct 2025 05:44:36 +0200 Subject: [PATCH 39/49] Another typed pointer, comments --- Assets/Lua/Doom/dsda-data.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Assets/Lua/Doom/dsda-data.lua b/Assets/Lua/Doom/dsda-data.lua index a3484e02348..0ab42a238a2 100644 --- a/Assets/Lua/Doom/dsda-data.lua +++ b/Assets/Lua/Doom/dsda-data.lua @@ -351,12 +351,12 @@ dsda.mobj .s32 ("y") .s32 ("z") .ptrto("snext", dsda.mobj) - .ptr ("sprev") -- pointer to pointer + .ptr ("sprev") -- pointer to pointer to mobj .u32 ("angle") .s32 ("sprite") -- spritenum_t .s32 ("frame") - .ptr ("bnext") - .ptr ("bprev") + .ptrto("bnext", dsda.mobj) + .ptr ("bprev") -- pointer to pointer to mobj .ptr ("subsector") .s32 ("floorz") .s32 ("ceilingz") @@ -450,7 +450,7 @@ dsda.sector = dsda.struct_layout(nil, 512, "Sectors") .s16 ("colormap") .ptr ("touching_thinglist") .s32 ("linecount") - .ptr ("lines") -- pointer to pointer + .ptr ("lines") -- pointer to pointer to line .s32 ("floorsky") .s32 ("ceilingsky") .s32 ("floor_xoffs") From 71562ce2fd91467c8c140e442289ff803a22a559 Mon Sep 17 00:00:00 2001 From: kalimag Date: Tue, 7 Oct 2025 17:53:34 +0200 Subject: [PATCH 40/49] Fix pointer check for null pointers --- Assets/Lua/Doom/dsda-data.lua | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Assets/Lua/Doom/dsda-data.lua b/Assets/Lua/Doom/dsda-data.lua index 0ab42a238a2..2713b1e330c 100644 --- a/Assets/Lua/Doom/dsda-data.lua +++ b/Assets/Lua/Doom/dsda-data.lua @@ -43,10 +43,12 @@ end -- Returns the lower 4 bytes of an 8 byte pointer function dsda.read_ptr(addr, domain) - if dsda.check_pointers and read_u32(addr + 4, domain) ~= WBX_POINTER_HI then - error(string.format("Invalid pointer 0x%016X at %s 0x%X", dsda.read_s64_le(addr, domain), domain, addr)) + local lo = read_u32(addr, domain) + if dsda.check_pointers then + local hi = read_u32(addr + 4, domain) + assertf(hi == WBX_POINTER_HI or hi | lo == 0, "Invalid pointer 0x%08X%08X at %s 0x%X", hi, lo, domain, addr) end - return read_u32(addr, domain) + return lo end function dsda.read_bool(addr, domain) From a50b6e61b0812a2196ada9ddbb26ddc6230e61ef Mon Sep 17 00:00:00 2001 From: kalimag Date: Tue, 7 Oct 2025 17:58:46 +0200 Subject: [PATCH 41/49] More lenient 32bit/64bit pointer handling --- Assets/Lua/Doom/dsda-data.lua | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Assets/Lua/Doom/dsda-data.lua b/Assets/Lua/Doom/dsda-data.lua index 2713b1e330c..eaa65a1b1a4 100644 --- a/Assets/Lua/Doom/dsda-data.lua +++ b/Assets/Lua/Doom/dsda-data.lua @@ -127,7 +127,7 @@ function dsda.struct_layout(struct, padded_size, domain, max_count) function struct.u32 (name) return struct.add(name, 4, true, memory.read_u32_le) end function struct.s64 (name) return struct.add(name, 8, true, dsda.read_s64_le) end function struct.float(name) return struct.add(name, 4, true, read_float_le) end - function struct.ptr (name) return struct.s64(name) end + function struct.ptr (name) return struct.add(name, 8, true, dsda.read_ptr) end function struct.bool (name) return struct.add(name, 4, true, dsda.read_bool) end function struct.array(name, type, count, ...) --console.log("array", type, count, ...) @@ -210,8 +210,9 @@ function dsda.struct_layout(struct, padded_size, domain, max_count) -- Get a struct instance from the system bus function struct.from_pointer(pointer) if pointer == 0 then return nil end + assertf(pointer >> 32 == 0 or pointer >> 32 == WBX_POINTER_HI, "Invalid pointer %X", pointer) assertf(pointer % struct.alignment == 0, "Unaligned pointer %X", pointer) - return create_item(pointer, BusDomain) + return create_item(pointer & 0xFFFFFFFF, BusDomain) end function items_meta:__index(index) From f96175db7bbf800226d224cfd463d720366097c2 Mon Sep 17 00:00:00 2001 From: kalimag Date: Tue, 7 Oct 2025 17:59:54 +0200 Subject: [PATCH 42/49] Support adding "properties" and functions to struct instances --- Assets/Lua/Doom/dsda-data.lua | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Assets/Lua/Doom/dsda-data.lua b/Assets/Lua/Doom/dsda-data.lua index eaa65a1b1a4..5fc6b885618 100644 --- a/Assets/Lua/Doom/dsda-data.lua +++ b/Assets/Lua/Doom/dsda-data.lua @@ -86,6 +86,7 @@ function dsda.struct_layout(struct, padded_size, domain, max_count) local items_meta = {} local item_props = {} + local item_funcs = {} local item_meta = {} setmetatable(struct.items, items_meta) @@ -150,6 +151,14 @@ function dsda.struct_layout(struct, padded_size, domain, max_count) struct.align(struct.alignment) return struct end + function struct.prop(name, func) + item_props[name] = func + return struct + end + function struct.func(name, func) + item_funcs[name] = func + return struct + end local function create_item(address, domain) local item = { @@ -226,6 +235,8 @@ function dsda.struct_layout(struct, padded_size, domain, max_count) function item_meta:__index(name) local prop = item_props[name] if prop then return prop(self) end + local func = item_funcs[name] + if func then return func end end function item_meta:__pairs() From 98d149396bf0ccb374877994bb3d69aaa5246d5f Mon Sep 17 00:00:00 2001 From: kalimag Date: Tue, 7 Oct 2025 23:24:32 +0200 Subject: [PATCH 43/49] Add state and msecnode structs --- Assets/Lua/Doom/dsda-data.lua | 37 ++++++++++++++++++++++++++++++----- 1 file changed, 32 insertions(+), 5 deletions(-) diff --git a/Assets/Lua/Doom/dsda-data.lua b/Assets/Lua/Doom/dsda-data.lua index 5fc6b885618..d62c88b6df5 100644 --- a/Assets/Lua/Doom/dsda-data.lua +++ b/Assets/Lua/Doom/dsda-data.lua @@ -249,6 +249,33 @@ end -- mobj_t https://github.com/TASEmulators/dsda-doom/blob/5608ee441410ecae10a17ecdbe1940bd4e1a2856/prboom2/src/p_mobj.h#L277-L413 dsda.mobj = dsda.struct_layout(nil, 512, "Things") +-- sector_t https://github.com/TASEmulators/dsda-doom/blob/5608ee441410ecae10a17ecdbe1940bd4e1a2856/prboom2/src/r_defs.h#L124-L213 +dsda.sector = dsda.struct_layout(nil, 512, "Sectors") + +-- msecnode_t https://github.com/TASEmulators/dsda-doom/blob/623068c33f6bf21239c6c6941f221011b08b6bb9/prboom2/src/r_defs.h#L373-L382 +dsda.msecnode = dsda.struct_layout() +dsda.msecnode + .ptrto("m_sector", dsda.sector) + .ptrto("m_thing", dsda.mobj) + .ptrto("m_tprev", dsda.msecnode) + .ptrto("m_tnext", dsda.msecnode) + .ptrto("m_sprev", dsda.msecnode) + .ptrto("m_snext", dsda.msecnode) + .bool ("visited") + .done () + +-- state_t https://github.com/TASEmulators/dsda-doom/blob/623068c33f6bf21239c6c6941f221011b08b6bb9/prboom2/src/info.h#L5757-L5767 +dsda.state = dsda.struct_layout() + .s32 ("sprite") -- spritenum_t + .s64 ("frame") + .s64 ("tics") + .ptr ("action") + .s32 ("nextstate") + .s64 ("misc1") + .s64 ("misc2") + .array("args", "s64", 8) + .s32 ("flags") + -- player_t https://github.com/TASEmulators/dsda-doom/blob/5608ee441410ecae10a17ecdbe1940bd4e1a2856/prboom2/src/d_player.h#L143-L267 dsda.player = dsda.struct_layout(nil, 1024, "Players", dsda.MAX_PLAYERS) .ptrto("mo", dsda.mobj) @@ -384,7 +411,7 @@ dsda.mobj .s32 ("type") -- mobjtype_t .ptrto("info", dsda.mobjinfo) .s32 ("tics") - .ptr ("state") + .ptrto("state", dsda.state) -- state_t .s64 ("flags") -- mobjflags .s32 ("intflags") .s32 ("health") @@ -403,7 +430,7 @@ dsda.mobj .ptrto("lastenemy", dsda.mobj) .s32 ("friction") .s32 ("movefactor") - .ptr ("touching_sectorlist") + .ptrto("touching_sectorlist", dsda.msecnode) -- start of msecnode.m_tnext linked list .s32 ("PrevX") .s32 ("PrevY") .s32 ("PrevZ") @@ -432,7 +459,7 @@ dsda.mobj .done () -- sector_t https://github.com/TASEmulators/dsda-doom/blob/5608ee441410ecae10a17ecdbe1940bd4e1a2856/prboom2/src/r_defs.h#L124-L213 -dsda.sector = dsda.struct_layout(nil, 512, "Sectors") +dsda.sector .s32 ("iSectorID") .u32 ("flags") .s32 ("floorheight") @@ -448,7 +475,7 @@ dsda.sector = dsda.struct_layout(nil, 512, "Sectors") .add ("soundorg", 60, 8) -- degenmobj_t; .s32 ("validcount") .s32 ("gl_validcount") - .ptrto("thinglist", dsda.mobj) -- start of snext linked list + .ptrto("thinglist", dsda.mobj) -- start of mobj.snext linked list .s32 ("friction") .s32 ("movefactor") .ptr ("floordata") @@ -462,7 +489,7 @@ dsda.sector = dsda.struct_layout(nil, 512, "Sectors") .s16 ("midmapmap") .s16 ("topmap") .s16 ("colormap") - .ptr ("touching_thinglist") + .ptrto("touching_thinglist", dsda.msecnode) -- start of msecnode.m_snext linked list .s32 ("linecount") .ptr ("lines") -- pointer to pointer to line .s32 ("floorsky") From 6cbe7e4a356fe2442bc3a7aa5aa9d9f84017b1c3 Mon Sep 17 00:00:00 2001 From: kalimag Date: Tue, 7 Oct 2025 23:25:08 +0200 Subject: [PATCH 44/49] Add functions for iterating linked lists --- Assets/Lua/Doom/dsda-data.lua | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/Assets/Lua/Doom/dsda-data.lua b/Assets/Lua/Doom/dsda-data.lua index d62c88b6df5..f1669935cbb 100644 --- a/Assets/Lua/Doom/dsda-data.lua +++ b/Assets/Lua/Doom/dsda-data.lua @@ -59,6 +59,21 @@ local function read_float_le(addr, domain) return readfloat(addr, false, domain) end +local function next_linked(state, prev) + local next + if prev == nil then + next = state.start + else + next = prev[state.key] + end + local value = state.value + return next, next and value and next[value] +end + +function dsda.links(start, key, value) + return next_linked, { start = start, key = key, value = value } +end + -- Structs --- @@ -457,6 +472,9 @@ dsda.mobj .u8 ("color") .ptr ("tranmap") .done () + .func ("iterate_touching_sectorlist", function (self) + return dsda.links(self.touching_sectorlist, "m_tnext", "m_sector") + end) -- sector_t https://github.com/TASEmulators/dsda-doom/blob/5608ee441410ecae10a17ecdbe1940bd4e1a2856/prboom2/src/r_defs.h#L124-L213 dsda.sector @@ -531,6 +549,12 @@ dsda.sector .s32 ("ceiling_xscale") .s32 ("ceiling_yscale") .done () + .func ("iterate_thinglist", function (self) + return dsda.links(self.thinglist, "snext") + end) + .func ("iterate_touching_thinglist", function (self) + return dsda.links(self.touching_thinglist, "m_snext", "m_thing") + end) -- vertex_t https://github.com/TASEmulators/dsda-doom/blob/623068c33f6bf21239c6c6941f221011b08b6bb9/prboom2/src/r_defs.h#L70-L80 dsda.vertex = dsda.struct_layout() From 3c25b2544d95cef54906cedf955321fea1589acf Mon Sep 17 00:00:00 2001 From: kalimag Date: Wed, 8 Oct 2025 03:22:23 +0200 Subject: [PATCH 45/49] Add subsector struct --- Assets/Lua/Doom/dsda-data.lua | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Assets/Lua/Doom/dsda-data.lua b/Assets/Lua/Doom/dsda-data.lua index f1669935cbb..4b45e4ce84b 100644 --- a/Assets/Lua/Doom/dsda-data.lua +++ b/Assets/Lua/Doom/dsda-data.lua @@ -267,6 +267,14 @@ dsda.mobj = dsda.struct_layout(nil, 512, "Things") -- sector_t https://github.com/TASEmulators/dsda-doom/blob/5608ee441410ecae10a17ecdbe1940bd4e1a2856/prboom2/src/r_defs.h#L124-L213 dsda.sector = dsda.struct_layout(nil, 512, "Sectors") +-- subsector_t https://github.com/TASEmulators/dsda-doom/blob/623068c33f6bf21239c6c6941f221011b08b6bb9/prboom2/src/r_defs.h#L422-L431 +dsda.subsector = dsda.struct_layout() + .ptrto("sector", dsda.sector) + .s32 ("numlines") + .s32 ("firstline") + .ptr ("poly") -- polyobj_t + .done () + -- msecnode_t https://github.com/TASEmulators/dsda-doom/blob/623068c33f6bf21239c6c6941f221011b08b6bb9/prboom2/src/r_defs.h#L373-L382 dsda.msecnode = dsda.struct_layout() dsda.msecnode @@ -413,7 +421,7 @@ dsda.mobj .s32 ("frame") .ptrto("bnext", dsda.mobj) .ptr ("bprev") -- pointer to pointer to mobj - .ptr ("subsector") + .ptrto("subsector", dsda.subsector) .s32 ("floorz") .s32 ("ceilingz") .s32 ("dropoffz") From 0ea9c0ffed64623c8357f7074e247e4e1f75376c Mon Sep 17 00:00:00 2001 From: kalimag Date: Wed, 8 Oct 2025 05:11:34 +0200 Subject: [PATCH 46/49] Color table, minimum zoom levels for mobjs --- Assets/Lua/Doom/things-lines.lua | 67 +++++++++++++++++++------------- 1 file changed, 41 insertions(+), 26 deletions(-) diff --git a/Assets/Lua/Doom/things-lines.lua b/Assets/Lua/Doom/things-lines.lua index ce8b392d1a4..62a57f8b6ff 100644 --- a/Assets/Lua/Doom/things-lines.lua +++ b/Assets/Lua/Doom/things-lines.lua @@ -16,16 +16,17 @@ local NEGATIVE_MAXIMUM = 1 << 63 local POSITIVE_MAXIMUM = ~NEGATIVE_MAXIMUM local MAP_CLICK_BLOCK = "P1 Fire" -- prevent this input while clicking on map buttons --- Map colors (0xAARRGGBB or "name" or false) -local ENEMY_COLOR = 0xFFFF0000 -local ENEMY_WAIT_COLOR = 0xFFCC0000 -local CORPSE_COLOR = false -- 0x80CC0000 -local MISSILE_COLOR = 0xFFFF8000 -local PLAYER_COLOR = 0xFF0080FF -local COUNTITEM_COLOR = false -- 0xA0FFFFFF -local ITEM_COLOR = false -- 0xA0FFFFFF -local MISC_COLOR = false -- 0xFFFFFFFF -local INERT_COLOR = false -- 0x80808080 +-- Map colors (0xAARRGGBB or "name") +local MapPrefs = { + player = { color = 0xFF60A0FF, radius_min_zoom = 0.00, text_min_zoom = 0.20, }, + enemy = { color = 0xFFF00000, radius_min_zoom = 0.00, text_min_zoom = 0.20, }, + corpse = { color = 0x80AA0000, radius_min_zoom = 0.00, text_min_zoom = 0.30, }, + missile = { color = 0xFFFF8000, radius_min_zoom = 0.00, text_min_zoom = 0.25, }, + shootable = { color = 0xFFFFDD00, radius_min_zoom = 0.05, text_min_zoom = 0.50, }, + countitem = { color = 0xFF8060FF, radius_min_zoom = 0.05, text_min_zoom = 0.75, }, + item = { color = 0xFF8060FF, radius_min_zoom = 0.05, text_min_zoom = 0.75, }, + inert = { color = 0x80808080, radius_min_zoom = 0.75, text_min_zoom = 1.00, }, +} -- shortcuts local rl = memory.read_u32_le @@ -154,19 +155,30 @@ local function get_line_count(str) return lines, longest end -local function get_mobj_color(mobj) +local function get_mobj_pref(mobj) local flags = mobj.flags - if flags & (MobjFlags.PICKUP | MobjFlags.FRIEND) ~= 0 then return PLAYER_COLOR end + if flags & (MobjFlags.PICKUP | MobjFlags.FRIEND) ~= 0 then return MapPrefs.player end if flags & (MobjFlags.COUNTKILL | MobjFlags.SKULLFLY) ~= 0 then - if flags & MobjFlags.CORPSE ~= 0 then return CORPSE_COLOR end - if flags & MobjFlags.AMBUSH ~= 0 or mobj.target_ptr == 0 then return ENEMY_WAIT_COLOR end - return ENEMY_COLOR + if flags & MobjFlags.CORPSE ~= 0 then return MapPrefs.corpse end + return MapPrefs.enemy end - if flags & MobjFlags.COUNTITEM ~= 0 then return COUNTITEM_COLOR end - if flags & MobjFlags.SPECIAL ~= 0 then return ITEM_COLOR end - if flags & MobjFlags.MISSILE ~= 0 then return MISSILE_COLOR end - if flags & MobjFlags.SHOOTABLE ~= 0 then return MISC_COLOR end - return INERT_COLOR + if flags & MobjFlags.COUNTITEM ~= 0 then return MapPrefs.countitem end + if flags & MobjFlags.SPECIAL ~= 0 then return MapPrefs.item end + if flags & MobjFlags.MISSILE ~= 0 then return MapPrefs.missile end + if flags & MobjFlags.SHOOTABLE ~= 0 then return MapPrefs.shootable end + return MapPrefs.inert +end + +local function get_mobj_color(mobj) + local pref = get_mobj_pref(mobj) + if not pref then return end + local color = pref.color + if not color or color < 0x01000000 then return end + local radius_min_zoom = pref.radius_min_zoom or math.huge + local text_min_zoom = pref.text_min_zoom or math.huge + local radius_color = Zoom >= radius_min_zoom and color or nil + local text_color = Zoom >= text_min_zoom and color or nil + return radius_color, text_color end local function iterate_players() @@ -198,8 +210,8 @@ local function iterate() if Init then return end for addr, mobj in pairs(dsda.mobj.items) do - local color = get_mobj_color(mobj) - if color then -- not hidden + local radius_color, text_color = get_mobj_color(mobj) + if radius_color or text_color then -- not hidden local pos = { x = mapify_x(mobj.x), y = mapify_y(-mobj.y) } if in_range(pos.x, 0, client.screenwidth()) @@ -214,10 +226,13 @@ local function iterate() local health = mobj.health local sprite = SpriteNumber[mobj.sprite] --]]-- - - type = MobjType[type] - text(pos.x, pos.y, string.format("%s", type), color) - box(pos.x - radius, pos.y - radius, pos.x + radius, pos.y + radius, color) + if text_color then + type = MobjType[type] + text(pos.x, pos.y, string.format("%s", type), text_color) + end + if radius_color then + box(pos.x - radius, pos.y - radius, pos.x + radius, pos.y + radius, radius_color) + end end end end From a9085a72e4fae658ffe9f2b3188aeefe229f0fc4 Mon Sep 17 00:00:00 2001 From: kalimag Date: Wed, 8 Oct 2025 07:42:34 +0200 Subject: [PATCH 47/49] Add more categories, filter some mobjs by type --- Assets/Lua/Doom/things-lines.lua | 106 ++++++++++++++++++++++++++++--- 1 file changed, 97 insertions(+), 9 deletions(-) diff --git a/Assets/Lua/Doom/things-lines.lua b/Assets/Lua/Doom/things-lines.lua index 62a57f8b6ff..4763e1110c7 100644 --- a/Assets/Lua/Doom/things-lines.lua +++ b/Assets/Lua/Doom/things-lines.lua @@ -19,13 +19,16 @@ local MAP_CLICK_BLOCK = "P1 Fire" -- prevent this input while clicking on map -- Map colors (0xAARRGGBB or "name") local MapPrefs = { player = { color = 0xFF60A0FF, radius_min_zoom = 0.00, text_min_zoom = 0.20, }, - enemy = { color = 0xFFF00000, radius_min_zoom = 0.00, text_min_zoom = 0.20, }, + enemy = { color = 0xFFF00000, radius_min_zoom = 0.00, text_min_zoom = 0.25, }, corpse = { color = 0x80AA0000, radius_min_zoom = 0.00, text_min_zoom = 0.30, }, missile = { color = 0xFFFF8000, radius_min_zoom = 0.00, text_min_zoom = 0.25, }, shootable = { color = 0xFFFFDD00, radius_min_zoom = 0.05, text_min_zoom = 0.50, }, - countitem = { color = 0xFF8060FF, radius_min_zoom = 0.05, text_min_zoom = 0.75, }, - item = { color = 0xFF8060FF, radius_min_zoom = 0.05, text_min_zoom = 0.75, }, - inert = { color = 0x80808080, radius_min_zoom = 0.75, text_min_zoom = 1.00, }, + countitem = { color = 0xFF8060FF, radius_min_zoom = 0.75, text_min_zoom = 1.50, }, + item = { color = 0xFF8060FF, radius_min_zoom = 0.75, text_min_zoom = 1.50, }, + misc = { color = 0xFFA0A0A0, radius_min_zoom = 0.75, text_min_zoom = 1.00, }, + solid = { color = 0xFF505050, radius_min_zoom = 0.75, text_min_zoom = false, }, +-- inert = { color = 0x80808080, radius_min_zoom = 0.75, text_min_zoom = false, }, + highlight = { color = 0xFFFF00FF, radius_min_zoom = 0.00, text_min_zoom = 0.20, }, } -- shortcuts @@ -74,6 +77,11 @@ local LastMouse = { } -- forward declarations local Lines = {} +local PlayerTypes +local EnemyTypes +local MissileTypes +local MiscTypes +local InertTypes --gui.defaultPixelFont("fceux") gui.use_surface("client") @@ -155,10 +163,24 @@ local function get_line_count(str) return lines, longest end -local function get_mobj_pref(mobj) +local function to_lookup(table) + local lookup = {} + for k, v in pairs(table) do + lookup[v] = k + end + return lookup +end + +local function get_mobj_pref(mobj, mobjtype) + if HighlightTypes[mobjtype] then return MapPrefs.highlight end + if InertTypes[mobjtype] then return MapPrefs.inert end + if MiscTypes[mobjtype] then return MapPrefs.misc end + if MissileTypes[mobjtype] then return MapPrefs.missile end + if PlayerTypes[mobjtype] then return MapPrefs.player end + local flags = mobj.flags if flags & (MobjFlags.PICKUP | MobjFlags.FRIEND) ~= 0 then return MapPrefs.player end - if flags & (MobjFlags.COUNTKILL | MobjFlags.SKULLFLY) ~= 0 then + if flags & MobjFlags.COUNTKILL ~= 0 or EnemyTypes[mobjtype] then if flags & MobjFlags.CORPSE ~= 0 then return MapPrefs.corpse end return MapPrefs.enemy end @@ -166,11 +188,12 @@ local function get_mobj_pref(mobj) if flags & MobjFlags.SPECIAL ~= 0 then return MapPrefs.item end if flags & MobjFlags.MISSILE ~= 0 then return MapPrefs.missile end if flags & MobjFlags.SHOOTABLE ~= 0 then return MapPrefs.shootable end + if flags & MobjFlags.SOLID ~= 0 then return MapPrefs.solid end return MapPrefs.inert end -local function get_mobj_color(mobj) - local pref = get_mobj_pref(mobj) +local function get_mobj_color(mobj, mobjtype) + local pref = get_mobj_pref(mobj, mobjtype) if not pref then return end local color = pref.color if not color or color < 0x01000000 then return end @@ -210,7 +233,8 @@ local function iterate() if Init then return end for addr, mobj in pairs(dsda.mobj.items) do - local radius_color, text_color = get_mobj_color(mobj) + local type = mobj.type + local radius_color, text_color = get_mobj_color(mobj, type) if radius_color or text_color then -- not hidden local pos = { x = mapify_x(mobj.x), y = mapify_y(-mobj.y) } @@ -377,6 +401,70 @@ function make_buttons() make_button(300, client.screenheight()-10, "Reset\nView", reset_view) end +-- Additional types that are not identifiable by flags alone +HighlightTypes = to_lookup({ + +}) +PlayerTypes = to_lookup({ + MobjType.PLAYER, + MobjType.HERETIC_PLAYER, + MobjType.HERETIC_CHICPLAYER, + MobjType.HEXEN_PLAYER_FIGHTER, + MobjType.HEXEN_PLAYER_CLERIC, + MobjType.HEXEN_PLAYER_MAGE, + MobjType.HEXEN_PIGPLAYER, + +}) +EnemyTypes = to_lookup({ + MobjType.SKULL, +}) +MissileTypes = to_lookup({ + MobjType.HEXEN_THROWINGBOMB, + MobjType.HERETIC_FIREBOMB, MobjType.HEXEN_FIREBOMB, + MobjType.HEXEN_POISONBAG, MobjType.HEXEN_POISONCLOUD, + MobjType.HEXEN_DRAGON_FX2, + MobjType.HEXEN_SUMMON_FX, +}) +MiscTypes = to_lookup({ + MobjType.BOSSTARGET, + MobjType.TELEPORTMAN, MobjType.HERETIC_TELEPORTMAN, MobjType.HEXEN_TELEPORTMAN, + MobjType.PUSH, MobjType.PULL, + MobjType.HERETIC_PODGENERATOR, + MobjType.HEXEN_MAPSPOT, MobjType.HEXEN_MAPSPOTGRAVITY, + MobjType.HEXEN_THRUSTFLOOR_UP, MobjType.HEXEN_THRUSTFLOOR_DOWN, + MobjType.HEXEN_QUAKE_FOCUS, + MobjType.HEXEN_ZPOISONSHROOM, +}) +InertTypes = to_lookup({ + MobjType.HERETIC_BLOODSPLATTER, + MobjType.HERETIC_FEATHER, + MobjType.HERETIC_PODGOO, + MobjType.HERETIC_SPLASH, + MobjType.HERETIC_SLUDGECHUNK, + MobjType.HERETIC_TELEGLITTER, MobjType.HERETIC_TELEGLITTER2, + MobjType.HEXEN_BLOODSPLATTER, + MobjType.HEXEN_CORPSEBLOODDRIP, + MobjType.HEXEN_LEAF1, MobjType.HEXEN_LEAF2, + MobjType.HEXEN_SPLASH, + MobjType.HEXEN_SLUDGECHUNK, + MobjType.HEXEN_WATER_DRIP, + MobjType.HEXEN_DIRT1, MobjType.HEXEN_DIRT2, MobjType.HEXEN_DIRT3, + MobjType.HEXEN_DIRT4, MobjType.HEXEN_DIRT5, MobjType.HEXEN_DIRT6, + MobjType.HEXEN_FIREDEMON_FX1, MobjType.HEXEN_FIREDEMON_FX2, MobjType.HEXEN_FIREDEMON_FX3, + MobjType.HEXEN_FIREDEMON_FX4, MobjType.HEXEN_FIREDEMON_FX5, + MobjType.HEXEN_ICEGUY_WISP1, MobjType.HEXEN_ICEGUY_WISP2, + MobjType.HEXEN_KORAX_SPIRIT1, MobjType.HEXEN_KORAX_SPIRIT2, MobjType.HEXEN_KORAX_SPIRIT3, + MobjType.HEXEN_KORAX_SPIRIT4, MobjType.HEXEN_KORAX_SPIRIT5, MobjType.HEXEN_KORAX_SPIRIT6, + MobjType.HEXEN_POTTERYBIT1, + MobjType.HEXEN_SGSHARD0, MobjType.HEXEN_SGSHARD1, MobjType.HEXEN_SGSHARD2, + MobjType.HEXEN_SGSHARD3, MobjType.HEXEN_SGSHARD4, MobjType.HEXEN_SGSHARD5, + MobjType.HEXEN_SGSHARD6, MobjType.HEXEN_SGSHARD7, MobjType.HEXEN_SGSHARD8, + MobjType.HEXEN_SGSHARD9, + MobjType.HEXEN_WRAITHFX3, +}) + + + event.onexit(function() gui.clearGraphics() gui.cleartext() From 50545f2ec41fd5c47982fa59ecab967d77750cdf Mon Sep 17 00:00:00 2001 From: kalimag Date: Wed, 8 Oct 2025 08:36:15 +0200 Subject: [PATCH 48/49] More caching, workaround for double execution --- Assets/Lua/Doom/things-lines.lua | 51 ++++++++++++++++++++++++++------ 1 file changed, 42 insertions(+), 9 deletions(-) diff --git a/Assets/Lua/Doom/things-lines.lua b/Assets/Lua/Doom/things-lines.lua index 4763e1110c7..131d7ad0f10 100644 --- a/Assets/Lua/Doom/things-lines.lua +++ b/Assets/Lua/Doom/things-lines.lua @@ -15,6 +15,7 @@ local CHAR_HEIGHT = 16 local NEGATIVE_MAXIMUM = 1 << 63 local POSITIVE_MAXIMUM = ~NEGATIVE_MAXIMUM local MAP_CLICK_BLOCK = "P1 Fire" -- prevent this input while clicking on map buttons +local VANILLA_DOOM = false -- cache values that won't change in vanilla Doom, but can with advanced features (e.g. polyobjects) -- Map colors (0xAARRGGBB or "name") local MapPrefs = { @@ -75,6 +76,7 @@ local LastMouse = { y = 0, wheel = 0 } +local LastFramecount = -1 -- forward declarations local Lines = {} local PlayerTypes @@ -265,7 +267,7 @@ local function iterate() -- Line positions need to be updated for polyobjects -- No way to tell if a line is part of a polyobject, but they update validcount -- when moving so this is a decent way of cutting down on memory reads - local validcount = line.validcount + local validcount = not VANILLA_DOOM and line.validcount if validcount ~= line._validcount then local v1, v2 = line.v1, line.v2 line._validcount = validcount @@ -289,7 +291,7 @@ local function iterate() end end -local function init_objects() +local function init_mobj_bounds() for addr, mobj in pairs(dsda.mobj.items) do local x = mobj.x / 0xffff local y = mobj.y / 0xffff * -1 @@ -298,9 +300,25 @@ local function init_objects() if y < OB.top then OB.top = y end if y > OB.bottom then OB.bottom = y end end +end +local function init_cache() Lines = {} for addr, line in pairs(dsda.line.items) do + -- selectively cache certain properties. by assigning them manually the read function won't be called again + -- TODO: invalidate cache on map change + + -- assumption: lines can't become special, except for CmdSetLineSpecial + -- try to exclude lines that may have had a line id set (and therefore can be targeted by CmdSetLineSpecial) + -- this should only happen in Hexen+ + if line.special == 0 and line.special_args1 == 0 then + line.special = 0 + end + + -- assumption: the vertex pointers never change (even if the vertex coordinates do) + line.v1 = line.v1 + line.v2 = line.v2 + table.insert(Lines, line) end end @@ -471,24 +489,39 @@ event.onexit(function() end) while true do - if Init then init_objects() end - + local framecount = emu.framecount() + local paused = client.ispaused() + + if Init then init_mobj_bounds() end + + -- re-init cache after state load, rewind, etc. + -- TODO: does this work with TAStudio seeking etc? + if framecount ~= LastFramecount and framecount ~= LastFramecount + 1 then + init_cache() + end + gui.clearGraphics() gui.cleartext() make_buttons() - iterate() - iterate_players() + + -- workaround: prevent multiple execution per frame because of emu.yield(), except when paused + if framecount ~= LastFramecount or paused then + iterate() + iterate_players() + end + update_zoom() - + --[[-- text(10, client.screenheight()-170, string.format( "Zoom: %.4f\nPanX: %s\nPanY: %s", Zoom, Pan.x, Pan.y), 0xffbbddff) --]]-- - + LastScreenSize.w = client.screenwidth() LastScreenSize.h = client.screenheight() - + LastFramecount = framecount + emu.yield() end \ No newline at end of file From 64c841f33cd49576580ceaa2fd50ac2ce094b4d5 Mon Sep 17 00:00:00 2001 From: kalimag Date: Wed, 8 Oct 2025 08:38:03 +0200 Subject: [PATCH 49/49] Remove unused locals --- Assets/Lua/Doom/dsda-data.lua | 2 -- 1 file changed, 2 deletions(-) diff --git a/Assets/Lua/Doom/dsda-data.lua b/Assets/Lua/Doom/dsda-data.lua index 4b45e4ce84b..35e1700fb77 100644 --- a/Assets/Lua/Doom/dsda-data.lua +++ b/Assets/Lua/Doom/dsda-data.lua @@ -24,8 +24,6 @@ dsda.MAX_PLAYERS = 4 -- Locals -local read_u8 = memory.read_u8 -local read_u24 = memory.read_u24_le local read_u32 = memory.read_u32_le local readfloat = memory.readfloat