From 34089cbe3f7f7c9af6ddaa643e9d62e568440cdc Mon Sep 17 00:00:00 2001 From: nmlgc Date: Sat, 9 Nov 2019 19:14:29 +0100 Subject: [PATCH] [Reverse-engineering] [th04/th05] Item structure Part of P0057, funded by [Anonymous] and -Tom-. --- th04/item/invalidate.asm | 45 ++++++ th04/item/items.hpp | 20 +++ th04/item/items[bss].asm | 23 +++ th04_main.asm | 256 +++------------------------------ th05_main.asm | 296 +++------------------------------------ 5 files changed, 122 insertions(+), 518 deletions(-) create mode 100644 th04/item/invalidate.asm create mode 100644 th04/item/items.hpp create mode 100644 th04/item/items[bss].asm diff --git a/th04/item/invalidate.asm b/th04/item/invalidate.asm new file mode 100644 index 00000000..b70f9f56 --- /dev/null +++ b/th04/item/invalidate.asm @@ -0,0 +1,45 @@ +public ITEMS_INVALIDATE +items_invalidate proc near + push si + push di + mov _tile_invalidate_box, (ITEM_W shl 16) or ITEM_H + mov si, offset _items +if GAME eq 5 + ; ZUN bug! ITEM_COUNT was 32 in TH04 and is 40 in TH05. This is the only + ; function in TH05 that still has 32. + mov di, 32 +else + mov di, ITEM_COUNT +endif + +@@item_loop: + cmp [si+item_t.flag], 0 + jz short @@item_next + call tiles_invalidate_around pascal, large dword ptr [si+item_t.pos.prev] + +@@item_next: + add si, size item_t + dec di + jnz short @@item_loop + mov si, offset _item_splashes + mov di, ITEM_SPLASH_COUNT + +@@item_splash_loop: + cmp [si+item_splash_t.flag], 0 + jz short @@item_splash_next + mov ax, [si+item_splash_t.radius_prev] + shr ax, 3 + inc ax + mov _tile_invalidate_box.x, ax + mov _tile_invalidate_box.y, ax + call tiles_invalidate_around pascal, large dword ptr [si+item_splash_t.center] + +@@item_splash_next: + add si, size item_splash_t + dec di + jnz short @@item_splash_loop + pop di + pop si + retn +items_invalidate endp + nop diff --git a/th04/item/items.hpp b/th04/item/items.hpp new file mode 100644 index 00000000..b233b7a4 --- /dev/null +++ b/th04/item/items.hpp @@ -0,0 +1,20 @@ +struct item_t { + char flag; + char unused; + motion_t pos; + unsigned char type; + char unknown; + int patnum; // Assumed to be a 16×16 sprite. + int pulled_to_player; // Yup, a 16-bit bool. +}; + +#define ITEM_W 16 +#define ITEM_H 16 + +#if GAME == 5 +# define ITEM_COUNT 40 +#else +# define ITEM_COUNT 32 +#endif + +extern item_t items[ITEM_COUNT]; diff --git a/th04/item/items[bss].asm b/th04/item/items[bss].asm new file mode 100644 index 00000000..d7633326 --- /dev/null +++ b/th04/item/items[bss].asm @@ -0,0 +1,23 @@ +item_t struc + flag db ? + db ? + pos motion_t + ITEM_type db ? + ITEM_unknown db ? + ITEM_patnum dw ? + pulled_to_player dw ? +item_t ends + +ITEM_W = 16 +ITEM_H = 16 + +if GAME eq 5 +ITEM_COUNT = 40 +else +ITEM_COUNT = 32 +endif + +public _items +_items item_t ITEM_COUNT dup() +; 4 additional unused one, for some reason? + item_t 4 dup() diff --git a/th04_main.asm b/th04_main.asm index fc09927d..59540cfa 100644 --- a/th04_main.asm +++ b/th04_main.asm @@ -2504,50 +2504,7 @@ sub_C09A endp ; --------------------------------------------------------------------------- nop - -; =============== S U B R O U T I N E ======================================= - - -sub_C0FC proc near - push si - push di - mov _tile_invalidate_box, (16 shl 16) or 16 - mov si, 0AF34h - mov di, 20h ; ' ' - -loc_C10D: - cmp byte ptr [si], 0 - jz short loc_C119 - call main_01:tiles_invalidate_around pascal, large dword ptr [si+6] - -loc_C119: - add si, 14h - dec di - jnz short loc_C10D - mov si, offset _item_splashes - mov di, ITEM_SPLASH_COUNT - -@@item_splash_loop: - cmp [si+item_splash_t.flag], 0 - jz short @@item_splash_next - mov ax, [si+item_splash_t.radius_prev] - shr ax, 3 - inc ax - mov _tile_invalidate_box.x, ax - mov _tile_invalidate_box.y, ax - call tiles_invalidate_around pascal, large dword ptr [si+item_splash_t.center] - -@@item_splash_next: - add si, size item_splash_t - dec di - jnz short @@item_splash_loop - pop di - pop si - retn -sub_C0FC endp - -; --------------------------------------------------------------------------- - nop +include th04/item/invalidate.asm ; =============== S U B R O U T I N E ======================================= @@ -3381,7 +3338,7 @@ sub_CB58 proc near call main_01:sub_10444 call main_01:sub_C74C call main_01:sub_CA98 - call main_01:sub_C0FC + call items_invalidate call sparks_invalidate call main_01:sub_BCBE call _midboss_invalidate? @@ -12893,8 +12850,8 @@ sub_11ECB proc near push offset _circles push size _circles / 4 call main_01:sub_C34E - push 0AF34h - push 0A0h + push offset _items + push size _items / 4 call main_01:sub_C34E push 9634h push 640h @@ -14864,7 +14821,7 @@ sub_12DF0 proc near mov ax, GRAM_400 mov es, ax call main_01:item_splashes_render - mov si, 0AF34h + mov si, offset _items xor di, di jmp short loc_12E2E ; --------------------------------------------------------------------------- @@ -14886,10 +14843,10 @@ loc_12E04: loc_12E2A: inc di - add si, 14h + add si, size item_t loc_12E2E: - cmp di, 20h ; ' ' + cmp di, ITEM_COUNT jl short loc_12E04 pop di pop si @@ -34207,7 +34164,7 @@ arg_0 = byte ptr 4 mov [bp+arg_0], al loc_1DA6F: - mov si, 0AF34h + mov si, offset _items xor di, di jmp short loc_1DAC3 ; --------------------------------------------------------------------------- @@ -34238,10 +34195,10 @@ loc_1DA76: loc_1DABF: inc di - add si, 14h + add si, size item_t loc_1DAC3: - cmp di, 20h ; ' ' + cmp di, ITEM_COUNT jl short loc_1DA76 loc_1DAC8: @@ -34295,7 +34252,7 @@ loc_1DB07: loc_1DB0C: xor di, di - mov si, 0AF34h + mov si, offset _items mov [bp+var_2], 0 jmp loc_1DBA2 ; --------------------------------------------------------------------------- @@ -34355,10 +34312,10 @@ loc_1DB80: loc_1DB9C: inc [bp+var_2] - add si, 14h + add si, size item_t loc_1DBA2: - cmp [bp+var_2], 20h ; ' ' + cmp [bp+var_2], ITEM_COUNT jl loc_1DB19 loc_1DBAA: @@ -34699,7 +34656,7 @@ var_1 = byte ptr -1 enter 2, 0 push si push di - mov si, 0AF34h + mov si, offset _items cmp byte_236E0, 0 jz short loc_1DE74 mov byte_21CC8, 1 @@ -34804,10 +34761,10 @@ loc_1DF47: loc_1DF4A: inc di - add si, 14h + add si, size item_t loc_1DF4E: - cmp di, 20h ; ' ' + cmp di, ITEM_COUNT jl loc_1DE7E call item_splashes_update mov byte_21CC8, 0 @@ -46437,186 +46394,7 @@ include th04/circles[bss].asm dd ? ; dd ? ; dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; +include th04/item/items[bss].asm dd ? ; dd ? ; dd ? ; diff --git a/th05_main.asm b/th05_main.asm index cf24cee7..83a64d55 100644 --- a/th05_main.asm +++ b/th05_main.asm @@ -2021,7 +2021,7 @@ sub_BEE6 proc near call sub_123AD call sub_E41C call sub_E5EE - call sub_E696 + call items_invalidate call sparks_invalidate call sub_C2AA call _midboss_invalidate? @@ -6694,50 +6694,7 @@ loc_E68D: retn sub_E5EE endp - -; =============== S U B R O U T I N E ======================================= - - -sub_E696 proc near - push si - push di - mov _tile_invalidate_box, (16 shl 16) or 16 - mov si, 0AF20h - mov di, 20h ; ' ' - -loc_E6A7: - cmp byte ptr [si], 0 - jz short loc_E6B3 - call tiles_invalidate_around pascal, large dword ptr [si+6] - -loc_E6B3: - add si, 14h - dec di - jnz short loc_E6A7 - mov si, offset _item_splashes - mov di, ITEM_SPLASH_COUNT - -@@item_splash_loop: - cmp [si+item_splash_t.flag], 0 - jz short @@item_splash_next - mov ax, [si+item_splash_t.radius_prev] - shr ax, 3 - inc ax - mov _tile_invalidate_box.x, ax - mov _tile_invalidate_box.y, ax - call tiles_invalidate_around pascal, large dword ptr [si+item_splash_t.center] - -@@item_splash_next: - add si, size item_splash_t - dec di - jnz short @@item_splash_loop - pop di - pop si - retn -sub_E696 endp - -; --------------------------------------------------------------------------- - nop +include th04/item/invalidate.asm include th04/hardware/grcg_modecol.asm ; =============== S U B R O U T I N E ======================================= @@ -7149,8 +7106,8 @@ sub_EACE proc near push offset _circles push size _circles / 4 call sub_E708 - push 0AF20h - push 0C8h + push offset _items + push size _items / 4 call sub_E708 push 9DA0h push 460h @@ -8347,7 +8304,7 @@ sub_F7A5 proc near mov es, ax assume es:nothing call item_splashes_render - mov si, 0AF20h + mov si, offset _items xor di, di jmp short loc_F7E3 ; --------------------------------------------------------------------------- @@ -8369,10 +8326,10 @@ loc_F7B9: loc_F7DF: inc di - add si, 14h + add si, size item_t loc_F7E3: - cmp di, 28h ; '(' + cmp di, ITEM_COUNT jl short loc_F7B9 pop di pop si @@ -17717,7 +17674,7 @@ loc_16DA0: mov [bp+arg_0], al loc_16DCA: - mov si, 0AF20h + mov si, offset _items xor di, di jmp short loc_16E1E ; --------------------------------------------------------------------------- @@ -17748,10 +17705,10 @@ loc_16DD1: loc_16E1A: inc di - add si, 14h + add si, size item_t loc_16E1E: - cmp di, 28h ; '(' + cmp di, ITEM_COUNT jl short loc_16DD1 loc_16E23: @@ -17805,7 +17762,7 @@ loc_16E62: loc_16E67: xor di, di - mov si, 0AF20h + mov si, offset _items mov [bp+var_2], 0 jmp loc_16EF9 ; --------------------------------------------------------------------------- @@ -17864,10 +17821,10 @@ loc_16ED7: loc_16EF3: inc [bp+var_2] - add si, 14h + add si, size item_t loc_16EF9: - cmp [bp+var_2], 28h ; '(' + cmp [bp+var_2], ITEM_COUNT jl loc_16E74 loc_16F01: @@ -18241,7 +18198,7 @@ var_1 = byte ptr -1 enter 2, 0 push si push di - mov si, 0AF20h + mov si, offset _items xor di, di jmp loc_172EC ; --------------------------------------------------------------------------- @@ -18336,10 +18293,10 @@ loc_172E5: loc_172E8: inc di - add si, 14h + add si, size item_t loc_172EC: - cmp di, 28h ; '(' + cmp di, ITEM_COUNT jl loc_1721C call item_splashes_update mov byte_21762, 0 @@ -40622,226 +40579,7 @@ include th04/circles[bss].asm dd ? ; dd ? ; dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; - dd ? ; +include th04/item/items[bss].asm byte_2BC70 db ? word_2BC71 dw ? db ?