[Reverse-engineering] [th04/th05] Item structure

Part of P0057, funded by [Anonymous] and -Tom-.
This commit is contained in:
nmlgc 2019-11-09 19:14:29 +01:00
parent 2918e6dbd0
commit 34089cbe3f
5 changed files with 122 additions and 518 deletions

45
th04/item/invalidate.asm Normal file
View File

@ -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

20
th04/item/items.hpp Normal file
View File

@ -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];

23
th04/item/items[bss].asm Normal file
View File

@ -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(<?>)

View File

@ -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 ? ;

View File

@ -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 ?