Merge pull request #365 from Henny022p/droptables

DeathFx, EnemyUtil
This commit is contained in:
notyourav 2022-02-10 20:00:24 -08:00 committed by GitHub
commit 2e6ccdea74
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 684 additions and 693 deletions

View File

@ -1,426 +0,0 @@
.include "asm/macros.inc"
.include "constants/constants.inc"
.syntax unified
.text
thumb_func_start sub_0804A720
sub_0804A720: @ 0x0804A720
push {r4, r5, r6, lr}
adds r2, r0, #0
adds r0, #0x6d
ldrb r1, [r0]
movs r0, #4
ands r0, r1
cmp r0, #0
bne _0804A7D0
ldrb r0, [r2, #9]
lsls r0, r0, #1
ldr r1, _0804A76C @ =gUnk_080D3D94
adds r3, r0, r1
adds r4, r2, #0
adds r4, #0x68
ldrb r1, [r4, #0x16]
cmp r1, #0
bne _0804A744
ldrb r1, [r3]
_0804A744:
adds r0, r2, #0
adds r0, #0x6e
strb r1, [r0]
adds r5, r0, #0
ldrb r1, [r4, #0x17]
cmp r1, #0
bne _0804A754
ldrb r1, [r3, #1]
_0804A754:
adds r0, r2, #0
adds r0, #0x6f
strb r1, [r0]
adds r6, r0, #0
ldrh r1, [r4, #0x1c]
adds r3, r1, #0
cmp r3, #0
beq _0804A774
ldr r0, _0804A770 @ =gRoomControls
ldrh r0, [r0, #6]
adds r0, r1, r0
b _0804A784
.align 2, 0
_0804A76C: .4byte gUnk_080D3D94
_0804A770: .4byte gRoomControls
_0804A774:
ldrb r0, [r5]
lsls r1, r0, #2
movs r5, #0x2e
ldrsh r0, [r2, r5]
cmp r0, r1
blt _0804A78C
ldrh r0, [r2, #0x2e]
subs r0, r0, r1
_0804A784:
adds r1, r2, #0
adds r1, #0x70
strh r0, [r1]
b _0804A792
_0804A78C:
adds r0, r2, #0
adds r0, #0x70
strh r3, [r0]
_0804A792:
ldrh r1, [r4, #0x1e]
adds r3, r1, #0
cmp r3, #0
beq _0804A7A8
ldr r0, _0804A7A4 @ =gRoomControls
ldrh r0, [r0, #8]
adds r0, r1, r0
b _0804A7B8
.align 2, 0
_0804A7A4: .4byte gRoomControls
_0804A7A8:
ldrb r0, [r6]
lsls r1, r0, #2
movs r4, #0x32
ldrsh r0, [r2, r4]
cmp r0, r1
blt _0804A7C0
ldrh r0, [r2, #0x32]
subs r0, r0, r1
_0804A7B8:
adds r1, r2, #0
adds r1, #0x72
strh r0, [r1]
b _0804A7C6
_0804A7C0:
adds r0, r2, #0
adds r0, #0x72
strh r3, [r0]
_0804A7C6:
adds r2, #0x6d
ldrb r1, [r2]
movs r0, #4
orrs r0, r1
strb r0, [r2]
_0804A7D0:
pop {r4, r5, r6, pc}
.align 2, 0
thumb_func_start sub_0804A7D4
sub_0804A7D4: @ 0x0804A7D4
push {lr}
ldrb r1, [r0, #9]
movs r2, #0
bl CreateDeathFx
pop {pc}
thumb_func_start CreateDeathFx
CreateDeathFx: @ 0x0804A7E0
push {r4, r5, r6, r7, lr}
mov r7, sl
mov r6, sb
mov r5, r8
push {r5, r6, r7}
adds r5, r0, #0
mov sb, r1
mov sl, r2
adds r6, r5, #0
adds r6, #0x6d
ldrb r1, [r6]
movs r7, #1
adds r0, r7, #0
ands r0, r1
cmp r0, #0
beq _0804A864
movs r0, #2
ands r0, r1
cmp r0, #0
beq _0804A80A
b _0804A982
_0804A80A:
ldrb r1, [r5, #9]
movs r0, #1
movs r2, #0
bl CreateObject
adds r4, r0, #0
cmp r4, #0
bne _0804A81C
b _0804A982
_0804A81C:
adds r0, #0x6c
strb r7, [r0]
adds r0, r5, #0
adds r1, r4, #0
movs r2, #0
movs r3, #1
bl PositionRelative
str r5, [r4, #0x50]
ldrb r1, [r6]
movs r0, #2
orrs r0, r1
strb r0, [r6]
ldrb r0, [r5, #9]
cmp r0, #0x37
bne _0804A84A
ldr r0, _0804A85C @ =gRoomTransition
adds r0, #0x39
ldrb r0, [r0]
cmp r0, #0
beq _0804A84A
bl DeleteThisEntity
_0804A84A:
bl sub_0807CD9C
ldr r0, _0804A860 @ =0x80100000
bl SoundReq
bl DeleteThisEntity
b _0804A982
.align 2, 0
_0804A85C: .4byte gRoomTransition
_0804A860: .4byte 0x80100000
_0804A864:
adds r4, r5, #0
adds r4, #0x3a
ldrb r1, [r4]
movs r0, #2
ands r0, r1
lsls r0, r0, #0x18
lsrs r0, r0, #0x18
mov r8, r0
cmp r0, #0
bne _0804A934
adds r0, r5, #0
bl sub_08049CF4
ldr r1, _0804A8E8 @ =gSave
ldr r0, [r1, #0x50]
adds r0, #1
str r0, [r1, #0x50]
ldrb r0, [r4]
movs r7, #0
movs r1, #2
orrs r0, r1
strb r0, [r4]
movs r0, #0xff
strb r0, [r5, #0xe]
adds r0, r5, #0
movs r1, #3
bl SetDefaultPriority
ldrb r1, [r5, #9]
movs r0, #1
movs r2, #0
bl CreateObject
adds r4, r0, #0
cmp r4, #0
beq _0804A8CA
adds r0, #0x6c
mov r2, r8
strb r2, [r0]
adds r0, #1
mov r1, sb
strb r1, [r0]
adds r0, #1
mov r2, sl
strb r2, [r0]
str r5, [r4, #0x50]
str r5, [r4, #0x54]
adds r0, r5, #0
adds r1, r4, #0
bl CopyPosition
_0804A8CA:
ldrb r1, [r6]
movs r0, #8
ands r0, r1
cmp r0, #0
beq _0804A8EC
adds r0, r4, #0
adds r0, #0x6c
ldrb r1, [r0]
movs r2, #8
orrs r1, r2
strb r1, [r0]
adds r0, r5, #0
bl DeleteEntity
b _0804A982
.align 2, 0
_0804A8E8: .4byte gSave
_0804A8EC:
adds r0, r5, #0
adds r0, #0x41
ldrb r1, [r0]
movs r0, #0x7f
ands r0, r1
cmp r0, #0x13
bne _0804A934
ldrb r0, [r5, #0x1c]
movs r1, #0xf
ands r1, r0
cmp r1, #1
beq _0804A91A
cmp r1, #2
bne _0804A92A
cmp r4, #0
beq _0804A92A
adds r1, r4, #0
adds r1, #0x6c
ldrb r0, [r1]
movs r2, #2
orrs r0, r2
strb r0, [r1]
b _0804A92A
_0804A91A:
cmp r4, #0
beq _0804A92A
adds r0, r4, #0
adds r0, #0x6c
ldrb r1, [r0]
movs r2, #4
orrs r1, r2
strb r1, [r0]
_0804A92A:
movs r0, #0
str r0, [r4, #0x50]
bl DeleteThisEntity
b _0804A982
_0804A934:
ldrb r0, [r5, #0xe]
cmp r0, #0
bne _0804A940
bl DeleteThisEntity
b _0804A982
_0804A940:
subs r1, r0, #1
strb r1, [r5, #0xe]
lsls r0, r1, #0x18
cmp r0, #0
bne _0804A95E
ldrb r1, [r5, #0x18]
movs r0, #4
rsbs r0, r0, #0
ands r0, r1
strb r0, [r5, #0x18]
adds r0, r5, #0
movs r1, #0
bl SetDefaultPriority
b _0804A982
_0804A95E:
lsls r0, r1, #0x18
lsrs r0, r0, #0x18
cmp r0, #8
bhi _0804A982
ldrb r1, [r5, #0x18]
lsls r0, r1, #0x1e
cmp r0, #0
beq _0804A976
movs r0, #4
rsbs r0, r0, #0
ands r0, r1
b _0804A980
_0804A976:
movs r0, #4
rsbs r0, r0, #0
ands r0, r1
movs r1, #1
orrs r0, r1
_0804A980:
strb r0, [r5, #0x18]
_0804A982:
pop {r3, r4, r5}
mov r8, r3
mov sb, r4
mov sl, r5
pop {r4, r5, r6, r7, pc}
thumb_func_start CreateProjectileWithParent
CreateProjectileWithParent: @ 0x0804A98C
push {r4, r5, r6, lr}
adds r6, r0, #0
adds r0, r1, #0
adds r5, r2, #0
bl CreateProjectile
adds r4, r0, #0
cmp r4, #0
beq _0804A9A8
strb r5, [r4, #0xa]
adds r0, r6, #0
adds r1, r4, #0
bl CopyPosition
_0804A9A8:
adds r0, r4, #0
pop {r4, r5, r6, pc}
thumb_func_start SetChildOffset
SetChildOffset: @ 0x0804A9AC
push {r4, r5, r6, r7, lr}
adds r5, r0, #0
adds r6, r1, #0
adds r7, r2, #0
mov ip, r3
ldr r4, [r5, #0x68]
cmp r4, #0
beq _0804A9FA
ldrb r2, [r5, #0x19]
lsrs r2, r2, #6
lsls r2, r2, #6
ldrb r3, [r4, #0x19]
movs r1, #0x3f
adds r0, r1, #0
ands r0, r3
orrs r0, r2
strb r0, [r4, #0x19]
ldrb r0, [r5, #0x1b]
lsrs r0, r0, #6
lsls r0, r0, #6
ldrb r2, [r4, #0x1b]
ands r1, r2
orrs r1, r0
strb r1, [r4, #0x1b]
ldrh r0, [r5, #0x2e]
adds r0, r0, r6
strh r0, [r4, #0x2e]
ldrh r0, [r5, #0x32]
adds r0, r0, r7
strh r0, [r4, #0x32]
ldrh r0, [r5, #0x36]
add r0, ip
strh r0, [r4, #0x36]
adds r0, r5, #0
adds r0, #0x38
ldrb r1, [r0]
adds r0, r4, #0
adds r0, #0x38
strb r1, [r0]
_0804A9FA:
pop {r4, r5, r6, r7, pc}
thumb_func_start sub_0804A9FC
sub_0804A9FC: @ 0x0804A9FC
push {r4, lr}
adds r4, r0, #0
ldr r0, [r4, #0x68]
cmp r0, #0
bne _0804AA16
adds r0, r4, #0
movs r2, #0
bl CreateFx
cmp r0, #0
beq _0804AA16
str r0, [r4, #0x68]
b _0804AA18
_0804AA16:
movs r0, #0
_0804AA18:
pop {r4, pc}
.align 2, 0
thumb_func_start sub_0804AA1C
sub_0804AA1C: @ 0x0804AA1C
push {lr}
adds r2, r0, #0
ldr r1, [r2, #0x68]
cmp r1, #0
beq _0804AA2C
movs r0, #0
str r0, [r1, #0x50]
str r0, [r2, #0x68]
_0804AA2C:
pop {pc}
.align 2, 0

View File

@ -0,0 +1,101 @@
.syntax unified
push {r4, r5, r6, lr}
adds r2, r0, #0
adds r0, #0x6d
ldrb r1, [r0]
movs r0, #4
ands r0, r1
cmp r0, #0
bne _0804A7D0
ldrb r0, [r2, #9]
lsls r0, r0, #1
ldr r1, _0804A76C @ =gUnk_080D3D94
adds r3, r0, r1
adds r4, r2, #0
adds r4, #0x68
ldrb r1, [r4, #0x16]
cmp r1, #0
bne _0804A744
ldrb r1, [r3]
_0804A744:
adds r0, r2, #0
adds r0, #0x6e
strb r1, [r0]
adds r5, r0, #0
ldrb r1, [r4, #0x17]
cmp r1, #0
bne _0804A754
ldrb r1, [r3, #1]
_0804A754:
adds r0, r2, #0
adds r0, #0x6f
strb r1, [r0]
adds r6, r0, #0
ldrh r1, [r4, #0x1c]
adds r3, r1, #0
cmp r3, #0
beq _0804A774
ldr r0, _0804A770 @ =gRoomControls
ldrh r0, [r0, #6]
adds r0, r1, r0
b _0804A784
.align 2, 0
_0804A76C: .4byte gUnk_080D3D94
_0804A770: .4byte gRoomControls
_0804A774:
ldrb r0, [r5]
lsls r1, r0, #2
movs r5, #0x2e
ldrsh r0, [r2, r5]
cmp r0, r1
blt _0804A78C
ldrh r0, [r2, #0x2e]
subs r0, r0, r1
_0804A784:
adds r1, r2, #0
adds r1, #0x70
strh r0, [r1]
b _0804A792
_0804A78C:
adds r0, r2, #0
adds r0, #0x70
strh r3, [r0]
_0804A792:
ldrh r1, [r4, #0x1e]
adds r3, r1, #0
cmp r3, #0
beq _0804A7A8
ldr r0, _0804A7A4 @ =gRoomControls
ldrh r0, [r0, #8]
adds r0, r1, r0
b _0804A7B8
.align 2, 0
_0804A7A4: .4byte gRoomControls
_0804A7A8:
ldrb r0, [r6]
lsls r1, r0, #2
movs r4, #0x32
ldrsh r0, [r2, r4]
cmp r0, r1
blt _0804A7C0
ldrh r0, [r2, #0x32]
subs r0, r0, r1
_0804A7B8:
adds r1, r2, #0
adds r1, #0x72
strh r0, [r1]
b _0804A7C6
_0804A7C0:
adds r0, r2, #0
adds r0, #0x72
strh r3, [r0]
_0804A7C6:
adds r2, #0x6d
ldrb r1, [r2]
movs r0, #4
orrs r0, r1
strb r0, [r2]
_0804A7D0:
pop {r4, r5, r6, pc}
.align 2, 0
.syntax divided

View File

@ -16,9 +16,9 @@ _0805453A:
adds r0, r1, r0
ldrb r1, [r0]
lsls r0, r1, #5
ldr r1, _0805455C @ =gUnk_080015BC
ldr r1, _0805455C @ =gAreaDroptables
adds r0, r0, r1
ldr r1, _08054560 @ =gUnk_02034398
ldr r1, _08054560 @ =gRoomVars+0x48
movs r2, #0x20
bl MemCopy
pop {pc}
@ -26,6 +26,6 @@ _0805453A:
_08054550: .4byte gArea
_08054554: .4byte gRoomTransition
_08054558: .4byte gUnk_080FE1C6
_0805455C: .4byte gUnk_080015BC
_08054560: .4byte gUnk_02034398
_0805455C: .4byte gAreaDroptables
_08054560: .4byte gRoomVars+0x48
.syntax divided

View File

@ -21,7 +21,7 @@ DeathFx: @ 0x0808161C
_08081630: .4byte gUnk_0811EBFC
thumb_func_start sub_08081634
sub_08081634: @ 0x08081634
DeathFx_Action0: @ 0x08081634
push {r4, r5, lr}
adds r4, r0, #0
adds r0, #0x6c
@ -136,7 +136,7 @@ _08081718: .4byte gUnk_0811EC08
_0808171C: .4byte gUnk_0811EC20
thumb_func_start sub_08081720
sub_08081720: @ 0x08081720
DeathFx_Action1: @ 0x08081720
push {r4, lr}
adds r4, r0, #0
bl GetNextFrame
@ -170,7 +170,7 @@ _0808175E:
pop {r4, pc}
thumb_func_start sub_08081760
sub_08081760: @ 0x08081760
DeathFx_Action2: @ 0x08081760
push {r4, lr}
adds r4, r0, #0
bl UpdateAnimationSingleFrame
@ -228,7 +228,7 @@ _080817C6:
_080817C8: .4byte gUnk_0811EC24
thumb_func_start sub_080817CC
sub_080817CC: @ 0x080817CC
DeathFx_DropRandom9: @ 0x080817CC
push {lr}
movs r1, #9
bl CreateRandomItemDrop
@ -236,7 +236,7 @@ sub_080817CC: @ 0x080817CC
.align 2, 0
thumb_func_start sub_080817D8
sub_080817D8: @ 0x080817D8
DeathFx_DropRandom13: @ 0x080817D8
push {lr}
movs r1, #0xd
bl CreateRandomItemDrop
@ -244,7 +244,7 @@ sub_080817D8: @ 0x080817D8
.align 2, 0
thumb_func_start sub_080817E4
sub_080817E4: @ 0x080817E4
DeathFx_DropRandom14: @ 0x080817E4
push {lr}
movs r1, #0xe
bl CreateRandomItemDrop
@ -252,7 +252,7 @@ sub_080817E4: @ 0x080817E4
.align 2, 0
thumb_func_start sub_080817F0
sub_080817F0: @ 0x080817F0
DeathFx_DropRandom1: @ 0x080817F0
push {lr}
movs r1, #1
bl CreateRandomItemDrop
@ -260,7 +260,7 @@ sub_080817F0: @ 0x080817F0
.align 2, 0
thumb_func_start sub_080817FC
sub_080817FC: @ 0x080817FC
DeathFx_DropFixedItem: @ 0x080817FC
push {lr}
adds r1, r0, #0
adds r1, #0x6e
@ -270,7 +270,7 @@ sub_080817FC: @ 0x080817FC
pop {pc}
thumb_func_start sub_0808180C
sub_0808180C: @ 0x0808180C
DeathFx_Delete: @ 0x0808180C
push {lr}
bl DeleteThisEntity
pop {pc}

View File

@ -1,37 +0,0 @@
.include "asm/macros.inc"
.include "constants/constants.inc"
.section .rodata
.align 2
gUnk_0811EBFC:: @ 0811EBFC
.4byte sub_08081634
.4byte sub_08081720
.4byte sub_08081760
gUnk_0811EC08:: @ 0811EC08
.incbin "deathFx/gUnk_0811EC08.bin"
gUnk_0811EC20:: @ 0811EC20
.incbin "deathFx/gUnk_0811EC20.bin"
gUnk_0811EC24:: @ 0811EC24
.4byte sub_080817CC
.4byte sub_080817D8
.4byte sub_080817F0
.4byte sub_080817E4
.4byte sub_080817CC
.4byte sub_080817CC
.4byte sub_080817CC
.4byte sub_080817CC
.4byte sub_080817CC
.4byte sub_080817CC
.4byte sub_080817CC
.4byte sub_080817CC
.4byte sub_080817CC
.4byte sub_080817CC
.4byte sub_080817CC
.4byte sub_080817FC
gUnk_0811EC64:: @ 0811EC64
.incbin "deathFx/gUnk_0811EC64.bin"

View File

@ -24,11 +24,15 @@ typedef union {
} Droptable;
static_assert(sizeof(Droptable) == 0x20);
extern const Droptable gUnk_0800137C[];
extern const Droptable gUnk_0800143C[];
extern const Droptable gUnk_080015BC[];
extern const Droptable gUnk_0800161C[];
extern const Droptable gEnemyDroptables[];
extern const Droptable gAreaDroptables[];
extern const Droptable gObjectDroptables[];
extern const Droptable gUnk_0800191C[];
extern const Droptable gUnk_08001A1C[];
enum {
DROPTABLE_NONE,
DROPTABLE_NO_SHELLS,
DROPTABLE_NO_KINSTONES,
};
extern const Droptable gDroptableModifiers[];
#endif // TMC_DROPTABLES_H

17
include/object/deathFx.h Normal file
View File

@ -0,0 +1,17 @@
#ifndef TMC_DEATHFX_H
#define TMC_DEATHFX_H
#ifndef NENT_DEPRECATED
#error "deathFx.h requires new entities"
#endif
#include "entity.h"
typedef struct {
Entity base;
int filler68;
u8 unk6c;
u8 parentId;
u8 item;
} DeathFxObject;
#endif // TMC_DEATHFX_H

View File

@ -3,6 +3,7 @@
#include "global.h"
#include "entity.h"
#include "droptables.h"
enum RoomTransition {
TRANSITION_DEFAULT,
@ -72,8 +73,8 @@ typedef struct {
/* 0x10 */ u8 unk_10[4];
/* 0x14 */ u32 flags;
/* 0x18 */ u32 unk3;
/* 0x1c */ u8 filler4[48];
/* 0x4c */ u8 filler5[28];
/* 0x1c */ u8 filler4[44];
/* 0x48 */ Droptable currentAreaDroptable;
/* 0x68 */ u32 animFlags;
/* 0x6c */ void* field_0x6c[8];
/* 0x8c */ void* field_0x8c[8];

View File

@ -124,6 +124,7 @@ extern const char gUnk_0811E470[];
}
*/
void UpdateGlobalProgress(void);
void sub_0807CD9C(void);
#ifdef DEMO_USA
extern const u8* const demoPointers[];

View File

@ -116,7 +116,6 @@ SECTIONS {
. = 0x000342F8; gUnk_020342F8 = .;
. = 0x00034330; gUnk_02034330 = .;
. = 0x00034350; gRoomVars = .;
. = 0x00034398; gUnk_02034398 = .;
. = 0x00034480; gUnk_02034480 = .;
. = 0x00034490; gUnk_02034490 = .;
. = 0x00034492; gUnk_02034492 = .;
@ -433,7 +432,6 @@ SECTIONS {
src/code_08049CD4.o(.text); /* enemyUtils.c */
asm/code_08049D30.o(.text);
src/enemyUtils.o(.text);
asm/enemyUtils.o(.text);
src/createEnemy.o(.text);
src/enterPortalSubtask.o(.text);
asm/enterPortalSubtask.o(.text);
@ -646,7 +644,7 @@ SECTIONS {
asm/code_0808091C.o(.text); /* scroll.c */
/* objects */
src/object/itemOnGround.o(.text);
asm/object/deathFx.o(.text);
src/object/deathFx.o(.text);
asm/object/itemForSale.o(.text);
src/object/button.o(.text);
asm/object/minishEmoticon.o(.text);
@ -1358,7 +1356,7 @@ SECTIONS {
src/script.o(.rodata);
data/data_0811E750.o(.rodata);
data/const/object/itemOnGround.o(.rodata);
data/const/object/deathFx.o(.rodata);
src/object/deathFx.o(.rodata);
data/animations/object/deathFx.o(.rodata);
data/const/object/itemForSale.o(.rodata);
data/const/object/button.o(.rodata);

View File

@ -20,7 +20,32 @@ extern struct_080FD5B4 gUnk_080FD5B4[];
extern u8 gUnk_0200AF13;
extern u8 gUnk_0200AF14;
extern u8 gUnk_080FE1C6[];
extern Droptable gUnk_02034398;
/*{
0u,
0x1u,
0x2u,
0x3u,
0x4u,
0x5u,
0x6u,
0x7u,
0x8u,
0x9u,
0x8u,
0x9u,
0xau,
0xau,
0xbu,
0xcu,
0xdu,
0xeu,
0xfu,
0x8u,
0xfu,
0x1u,
0x8u,
};
*/
extern void (*const gUnk_080FE2A0[])(void);
void ForceEquipItem(u32, u8);
@ -158,7 +183,7 @@ NONMATCH("asm/non_matching/sub_08054524.inc", void sub_08054524(void)) {
bVar1 = 0;
}
MemCopy(&gUnk_080015BC[0] + gUnk_080FE1C6[bVar1] * 0x8, &gUnk_02034398, 0x20);
MemCopy(&gAreaDroptables[0] + gUnk_080FE1C6[bVar1] * 0x8, &gRoomVars.currentAreaDroptable, 0x20);
}
END_NONMATCH
@ -170,8 +195,6 @@ void sub_08054570(void) {
gRoomVars.field_0x2 = 0;
}
// BUG?
extern const Droptable gUnk_080014e4[];
extern void sub_08000F14(s16*, const s16*, const s16*, const s16*);
extern u32 sub_08000F2C(s16*, const s16*, const s16*, const s16*);
u32 CreateItemDrop(Entity* arg0, u32 itemID, u32 itemParameter);
@ -182,17 +205,17 @@ u32 CreateRandomItemDrop(Entity* arg0, u32 arg1) {
ITEM_ENEMY_BEETLE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE,
}*/;
int r0, r1, r2, r4, r5;
int r0, r1, rand, summOdds, item;
u32 r3;
const Droptable *ptr2, *ptr3, *ptr4;
Droptable s0;
Droptable droptable;
r3 = arg1;
if (gRoomVars.field_0x2 != 1) {
ptr2 = &gUnk_08001A1C[0];
ptr4 = 0;
ptr2 = &gDroptableModifiers[DROPTABLE_NONE];
ptr4 = NULL;
switch (r3) {
case 1 ... 12:
ptr4 = &gUnk_0800137C[r3];
ptr4 = &gEnemyDroptables[r3];
break;
#ifndef EU
case 24:
@ -208,9 +231,9 @@ u32 CreateRandomItemDrop(Entity* arg0, u32 arg1) {
#ifdef EU
case 24:
#endif
ptr2 = &gUnk_0800161C[r3];
ptr2 = &gObjectDroptables[r3 - 16];
case 15:
ptr4 = &gUnk_02034398;
ptr4 = &gRoomVars.currentAreaDroptable;
break;
case 0:
default:
@ -218,59 +241,59 @@ u32 CreateRandomItemDrop(Entity* arg0, u32 arg1) {
}
if (ptr4 != 0) {
if ((r1 = gSave.stats.unkB) == 0) {
ptr3 = &gUnk_08001A1C[0];
// nop
ptr3 = &gDroptableModifiers[DROPTABLE_NONE];
} else {
#ifdef EU
ptr3 = &gUnk_0800143C[r1 + 3];
ptr3 = &gEnemyDroptables[r1 + 9];
#else
ptr3 = &gUnk_0800143C[r1];
ptr3 = &gEnemyDroptables[r1 + 6];
#endif
}
// vector addition, s0 = ptr4 + ptr2 + ptr3
sub_08000F14(s0.a, ptr4->a, ptr2->a, ptr3->a);
sub_08000F14(droptable.a, ptr4->a, ptr2->a, ptr3->a);
if (gSave.stats.health <= 8) {
s0.s.hearts += 5;
droptable.s.hearts += 5;
}
if (gSave.stats.bombCount == 0) {
s0.s.bombs += 3;
droptable.s.bombs += 3;
}
if (gSave.stats.arrowCount == 0) {
s0.s.arrows += 3;
droptable.s.arrows += 3;
}
if (gSave.stats.rupees <= 10) {
s0.s.rupee5 += 1;
droptable.s.rupee5 += 1;
}
ptr2 = &gUnk_08001A1C[0];
ptr2 = &gDroptableModifiers[DROPTABLE_NONE];
r0 = gSave.stats.hasAllFigurines;
ptr3 = ptr2;
ptr3 = &gDroptableModifiers[DROPTABLE_NONE];
// don't drop shells anymore
if (r0 != 0) {
ptr2++;
ptr2 = &gDroptableModifiers[DROPTABLE_NO_SHELLS];
}
// don't drop kinstones anymore
if (gSave.didAllFusions != 0) {
ptr3 += 2;
ptr3 = &gDroptableModifiers[DROPTABLE_NO_KINSTONES];
}
// vector addition, s0 = s0 + ptr2 + ptr3
// resulting values are clamped to be >= 0
// returns sum over s0
r4 = sub_08000F2C(s0.a, s0.a, ptr2->a, ptr3->a);
r2 = Random();
r5 = (r2 >> 0x18);
r5 &= 0xF;
r2 = r2 % r4;
summOdds = sub_08000F2C(droptable.a, droptable.a, ptr2->a, ptr3->a);
rand = Random();
item = (rand >> 0x18);
item &= 0xF;
rand = rand % summOdds;
{
u32 r3;
for (r3 = 0, r1 = 0; r3 < 0x10; r3++, r5 = (r5 + 1) & 0xF) {
if ((r1 += s0.a[r5]) > r2) {
for (r3 = 0, r1 = 0; r3 < 0x10; r3++, item = (item + 1) & 0xF) {
if ((r1 += droptable.a[item]) > rand) {
break;
}
}
}
r1 = gUnk_080FE1B4[r5];
if (r1 != 0) {
r2 = 0;
return CreateItemDrop(arg0, r1, r2);
r1 = gUnk_080FE1B4[item];
if (r1 != ITEM_NONE) {
return CreateItemDrop(arg0, r1, 0);
}
}
}
@ -311,10 +334,10 @@ u32 CreateItemDrop(Entity* arg0, u32 itemID, u32 itemParameter) {
u32 rand;
if (GetInventoryValue(ITEM_KINSTONE_BAG) == 0) {
return 0;
return ITEM_NONE;
}
if (3 < gRoomVars.filler1[0]) {
return 0;
return ITEM_NONE;
}
if (itemID != ITEM_KINSTONE) {
@ -362,91 +385,6 @@ u32 CreateItemDrop(Entity* arg0, u32 itemID, u32 itemParameter) {
}
return itemID;
}
/*
extern u8 gUnk_080FE1DD[];
u32 CreateItemDrop(Entity* arg0, u32 itemID, u32 itemParameter) {
u32 prereqID;
u32 adjustedParam;
u32 uVar1;
Entity* itemEntity;
adjustedParam = (u8)itemParameter;
switch (adjustedParam) {
case 0x3f:
if (!GetInventoryValue(0x40)) {
return 0;
}
if (itemParameter == 0) {
adjustedParam = 1;
}
case 0x5d:
if (!GetInventoryValue(0x65)) {
return 0;
}
break;
case 0x5e:
if (!GetInventoryValue(0x9)) {
return 0;
}
break;
case 0x5c:
case 0xfc ... 0xfe:
if (GetInventoryValue(0x67) == 0) {
return 0;
}
if (3 < gRoomVars.filler[5]) {
return 0;
}
if (itemID != 0x5c) {
adjustedParam = gUnk_080FE1DD[(Random() & 0x3f) + (itemID - 0xfc) * 0x40];
if (adjustedParam == 0) {
itemID = 0;
}
else {
itemID = 0x5c;
}
}
break;
case 0xff:
if (!GetInventoryValue(0x1)) {
return 0;
}
}
if (itemID != 0) {
if (itemID == 0xff) {
itemEntity = CreateEnemy(BEETLE, 0);
if (itemEntity != NULL) {
itemEntity->x.HALF.HI = arg0->x.HALF.HI;
itemEntity->y.HALF.HI = arg0->y.HALF.HI;
itemEntity->collisionLayer = arg0->collisionLayer;
UpdateSpriteOrderAndFlip(itemEntity);
}
} else {
itemEntity = CreateObject(GROUND_ITEM, itemID, adjustedParam);
if (itemEntity != NULL) {
if (arg0 == &gPlayerEntity) {
itemEntity->actionDelay = 1;
} else {
itemEntity->actionDelay = 0;
}
if (arg0->kind == OBJECT) {
if (arg0->id == 99) {
arg0->child = itemEntity;
} else if (arg0->id == 0x1e) {
itemEntity->direction = arg0->animationState << 3 | 0x80;
itemEntity->speed = 0xc0;
itementity->zVelocity = 0x18000;
}
}
CopyPosition(arg0, itemEntity);
}
}
}
return itemID;
}
*/
void Subtask_WorldEvent(void) {
#if !(defined(DEMO_USA) || defined(DEMO_JP))

View File

@ -1,8 +1,8 @@
#include "global.h"
#include "droptables.h"
const Droptable gUnk_0800137C[] = {
{ {
const Droptable gEnemyDroptables[] = {
[0] = { {
.none = -999,
.rupee1 = -999,
.rupee5 = -999,
@ -20,7 +20,7 @@ const Droptable gUnk_0800137C[] = {
.none4 = 0,
.none5 = 0,
} },
{ {
[1] = { {
.none = 300,
.rupee1 = -999,
.rupee5 = -999,
@ -38,7 +38,7 @@ const Droptable gUnk_0800137C[] = {
.none4 = 0,
.none5 = 0,
} },
{ {
[2] = { {
.none = -999,
.rupee1 = -999,
.rupee5 = -999,
@ -56,7 +56,7 @@ const Droptable gUnk_0800137C[] = {
.none4 = 0,
.none5 = 0,
} },
{ {
[3] = { {
.none = 36,
.rupee1 = 28,
.rupee5 = 20,
@ -74,7 +74,7 @@ const Droptable gUnk_0800137C[] = {
.none4 = 0,
.none5 = 0,
} },
{ {
[4] = { {
.none = 74,
.rupee1 = 10,
.rupee5 = 5,
@ -92,7 +92,7 @@ const Droptable gUnk_0800137C[] = {
.none4 = 0,
.none5 = 0,
} },
{ {
[5] = { {
.none = 100,
.rupee1 = 0,
.rupee5 = 0,
@ -110,10 +110,7 @@ const Droptable gUnk_0800137C[] = {
.none4 = 0,
.none5 = 0,
} },
};
// not 100% sure
const Droptable gUnk_0800143C[] = {
{ {
[6] = { {
.none = 73,
.rupee1 = 25,
.rupee5 = -999,
@ -131,7 +128,7 @@ const Droptable gUnk_0800143C[] = {
.none4 = 0,
.none5 = 0,
} },
{ {
[7] = { {
.none = 55,
.rupee1 = -999,
.rupee5 = 70,
@ -149,7 +146,7 @@ const Droptable gUnk_0800143C[] = {
.none4 = 0,
.none5 = 0,
} },
{ {
[8] = { {
.none = 50,
.rupee1 = -999,
.rupee5 = 26,
@ -167,7 +164,7 @@ const Droptable gUnk_0800143C[] = {
.none4 = 0,
.none5 = 0,
} },
{ {
[9] = { {
.none = 45,
.rupee1 = -999,
.rupee5 = -999,
@ -185,7 +182,7 @@ const Droptable gUnk_0800143C[] = {
.none4 = 0,
.none5 = 0,
} },
{ {
[10] = { {
.none = 300,
.rupee1 = -999,
.rupee5 = -999,
@ -203,7 +200,7 @@ const Droptable gUnk_0800143C[] = {
.none4 = 0,
.none5 = 0,
} },
{ {
[11] = { {
.none = 60,
.rupee1 = 10,
.rupee5 = -999,
@ -221,7 +218,7 @@ const Droptable gUnk_0800143C[] = {
.none4 = 0,
.none5 = 0,
} },
{ {
[12] = { {
.none = 70,
.rupee1 = 0,
.rupee5 = -999,
@ -239,7 +236,7 @@ const Droptable gUnk_0800143C[] = {
.none4 = 0,
.none5 = 0,
} },
{ {
[13] = { {
.none = 63,
.rupee1 = 10,
.rupee5 = 20,
@ -257,7 +254,7 @@ const Droptable gUnk_0800143C[] = {
.none4 = 0,
.none5 = 0,
} },
{ {
[14] = { {
.none = 50,
.rupee1 = 10,
.rupee5 = 20,
@ -275,7 +272,7 @@ const Droptable gUnk_0800143C[] = {
.none4 = 0,
.none5 = 0,
} },
{ {
[15] = { {
.none = 0,
.rupee1 = 0,
.rupee5 = 0,
@ -293,7 +290,7 @@ const Droptable gUnk_0800143C[] = {
.none4 = 0,
.none5 = 0,
} },
{ {
[16] = { {
.none = 0,
.rupee1 = 0,
.rupee5 = 0,
@ -311,7 +308,7 @@ const Droptable gUnk_0800143C[] = {
.none4 = 0,
.none5 = 0,
} },
{ {
[17] = { {
.none = 0,
.rupee1 = 40,
.rupee5 = 24,
@ -330,9 +327,9 @@ const Droptable gUnk_0800143C[] = {
.none5 = 0,
} },
};
// not 100% sure
const Droptable gUnk_080015BC[] = {
{ {
const Droptable gAreaDroptables[] = {
[0] = { {
.none = 920,
.rupee1 = 15,
.rupee5 = 5,
@ -350,7 +347,7 @@ const Droptable gUnk_080015BC[] = {
.none4 = 0,
.none5 = 0,
} },
{ {
[1] = { {
.none = 900,
.rupee1 = 0,
.rupee5 = 0,
@ -368,7 +365,7 @@ const Droptable gUnk_080015BC[] = {
.none4 = 0,
.none5 = 0,
} },
{ {
[2] = { {
.none = 920,
.rupee1 = 11,
.rupee5 = 3,
@ -386,9 +383,7 @@ const Droptable gUnk_080015BC[] = {
.none4 = 0,
.none5 = 0,
} },
};
const Droptable gUnk_0800161C[] = {
{ {
[3] = { {
.none = 920,
.rupee1 = 30,
.rupee5 = 1,
@ -406,7 +401,7 @@ const Droptable gUnk_0800161C[] = {
.none4 = 0,
.none5 = 0,
} },
{ {
[4] = { {
.none = 920,
.rupee1 = 6,
.rupee5 = 1,
@ -424,7 +419,7 @@ const Droptable gUnk_0800161C[] = {
.none4 = 0,
.none5 = 0,
} },
{ {
[5] = { {
.none = 920,
.rupee1 = 55,
.rupee5 = 7,
@ -442,7 +437,7 @@ const Droptable gUnk_0800161C[] = {
.none4 = 0,
.none5 = 0,
} },
{ {
[6] = { {
.none = 920,
.rupee1 = 23,
.rupee5 = 5,
@ -460,7 +455,7 @@ const Droptable gUnk_0800161C[] = {
.none4 = 0,
.none5 = 0,
} },
{ {
[7] = { {
.none = 920,
.rupee1 = 20,
.rupee5 = 3,
@ -478,7 +473,7 @@ const Droptable gUnk_0800161C[] = {
.none4 = 0,
.none5 = 0,
} },
{ {
[8] = { {
.none = 920,
.rupee1 = 25,
.rupee5 = 6,
@ -496,7 +491,7 @@ const Droptable gUnk_0800161C[] = {
.none4 = 0,
.none5 = 0,
} },
{ {
[9] = { {
.none = 920,
.rupee1 = 18,
.rupee5 = 2,
@ -514,7 +509,7 @@ const Droptable gUnk_0800161C[] = {
.none4 = 0,
.none5 = 0,
} },
{ {
[0xa] = { {
.none = 920,
.rupee1 = 30,
.rupee5 = 1,
@ -536,7 +531,7 @@ const Droptable gUnk_0800161C[] = {
.none4 = 0,
.none5 = 0,
} },
{ {
[0xb] = { {
.none = 900,
.rupee1 = 16,
.rupee5 = 4,
@ -554,7 +549,7 @@ const Droptable gUnk_0800161C[] = {
.none4 = 0,
.none5 = 0,
} },
{ {
[0xc] = { {
.none = 920,
.rupee1 = 23,
.rupee5 = 15,
@ -572,7 +567,7 @@ const Droptable gUnk_0800161C[] = {
.none4 = 0,
.none5 = 0,
} },
{ {
[0xd] = { {
.none = 920,
.rupee1 = 25,
.rupee5 = 25,
@ -590,7 +585,7 @@ const Droptable gUnk_0800161C[] = {
.none4 = 0,
.none5 = 0,
} },
{ {
[0xe] = { {
.none = 920,
.rupee1 = 25,
.rupee5 = 1,
@ -608,7 +603,7 @@ const Droptable gUnk_0800161C[] = {
.none4 = 0,
.none5 = 0,
} },
{ {
[0xf] = { {
.none = 800,
.rupee1 = 60,
.rupee5 = 15,
@ -626,7 +621,7 @@ const Droptable gUnk_0800161C[] = {
.none4 = 0,
.none5 = 0,
} },
{ {
[0x10] = { {
.none = 920,
.rupee1 = 15,
.rupee5 = 5,
@ -644,7 +639,7 @@ const Droptable gUnk_0800161C[] = {
.none4 = 0,
.none5 = 0,
} },
{ {
[0x11] = { {
.none = 920,
.rupee1 = 15,
.rupee5 = 5,
@ -662,7 +657,7 @@ const Droptable gUnk_0800161C[] = {
.none4 = 0,
.none5 = 0,
} },
{ {
[0x12] = { {
.none = 920,
.rupee1 = 15,
.rupee5 = 5,
@ -680,7 +675,9 @@ const Droptable gUnk_0800161C[] = {
.none4 = 0,
.none5 = 0,
} },
{ {
};
const Droptable gObjectDroptables[] = {
[0] = { {
.none = 0,
.rupee1 = 10,
.rupee5 = 0,
@ -698,7 +695,7 @@ const Droptable gUnk_0800161C[] = {
.none4 = 0,
.none5 = 0,
} },
{ {
[1] = { {
.none = 0,
.rupee1 = 3,
.rupee5 = 0,
@ -716,7 +713,7 @@ const Droptable gUnk_0800161C[] = {
.none4 = 0,
.none5 = 0,
} },
{ {
[2] = { {
.none = 0,
.rupee1 = 100,
.rupee5 = 20,
@ -734,7 +731,7 @@ const Droptable gUnk_0800161C[] = {
.none4 = 0,
.none5 = 0,
} },
{ {
[3] = { {
.none = 0,
.rupee1 = 300,
.rupee5 = 50,
@ -752,7 +749,7 @@ const Droptable gUnk_0800161C[] = {
.none4 = 0,
.none5 = 0,
} },
{ {
[4] = { {
.none = 0,
.rupee1 = -999,
.rupee5 = -999,
@ -770,7 +767,7 @@ const Droptable gUnk_0800161C[] = {
.none4 = 0,
.none5 = 0,
} },
{ {
[5] = { {
.none = 0,
.rupee1 = 2,
.rupee5 = 2,
@ -1068,7 +1065,7 @@ const Droptable gUnk_0800191C[] = {
};
// special treatment for shells and kinstones after finishing figurines/fusions
const Droptable gUnk_08001A1C[] = {
const Droptable gDroptableModifiers[] = {
// nop
{ {
.none = 0,

View File

@ -1,7 +1,13 @@
#define NENT_DEPRECATED
#include "entity.h"
#include "definitions.h"
#include "functions.h"
#include "object.h"
#include "save.h"
#include "projectile.h"
#include "object/deathFx.h"
extern void sub_08049CF4(Entity*);
extern EnemyDefinition gEnemyDefinitions[];
@ -17,45 +23,45 @@ const EnemyDefinition* GetEnemyDefinition(Entity* entity) {
return definition;
}
bool32 EnemyInit(Entity* this) {
if ((this->flags & ENT_DID_INIT) == 0) {
const EnemyDefinition* definition = GetEnemyDefinition(this);
if (LoadEnemySprite(this, definition) == FALSE) {
bool32 EnemyInit(GenericEntity* this) {
if ((super->flags & ENT_DID_INIT) == 0) {
const EnemyDefinition* definition = GetEnemyDefinition(super);
if (LoadEnemySprite(super, definition) == FALSE) {
return FALSE;
}
this->flags |= ENT_DID_INIT;
super->flags |= ENT_DID_INIT;
if (definition->spriteFlags.collision != 0) {
COLLISION_ON(this);
COLLISION_ON(super);
}
this->spriteIndex = definition->spriteIndex;
if (this->spriteSettings.draw == 0) {
this->spriteSettings.draw = definition->spriteFlags.draw;
super->spriteIndex = definition->spriteIndex;
if (super->spriteSettings.draw == 0) {
super->spriteSettings.draw = definition->spriteFlags.draw;
}
this->spritePriority.b1 = definition->spriteFlags.spritePriority;
this->spriteSettings.shadow = definition->spriteFlags.shadow;
if (this->speed == 0) {
this->speed = definition->speed;
super->spritePriority.b1 = definition->spriteFlags.spritePriority;
super->spriteSettings.shadow = definition->spriteFlags.shadow;
if (super->speed == 0) {
super->speed = definition->speed;
}
this->flags2 = definition->flags2;
this->hitType = definition->damageType;
this->hitbox = (Hitbox*)definition->ptr.hitbox;
this->health = definition->health;
if (this->hurtType == 0) {
this->hurtType = 0x41;
super->flags2 = definition->flags2;
super->hitType = definition->damageType;
super->hitbox = (Hitbox*)definition->ptr.hitbox;
super->health = definition->health;
if (super->hurtType == 0) {
super->hurtType = 0x41;
}
UpdateSpriteForCollisionLayer(this);
UpdateSpriteForCollisionLayer(super);
if ((this->field_0x6c.HALF.HI & 0x20) != 0) {
u32 uVar4 = gUnk_080D3E74[this->id >> 3] >> ((this->id & 7) << 1) & 3;
u32 uVar4 = gUnk_080D3E74[super->id >> 3] >> ((super->id & 7) << 1) & 3;
if (uVar4 != 0) {
Entity* object = CreateObject(OBJECT_A9, uVar4 - 1, 0);
if (object != NULL) {
object->actionDelay = this->flags;
object->field_0xf = this->spriteSettings.draw;
object->actionDelay = super->flags;
object->field_0xf = super->spriteSettings.draw;
object->spritePriority.b0 = 3;
object->parent = this;
CopyPosition(this, object);
this->flags &= ~ENT_COLLIDE;
this->spriteSettings.draw = 0;
object->parent = super;
CopyPosition(super, object);
super->flags &= ~ENT_COLLIDE;
super->spriteSettings.draw = 0;
this->field_0x6c.HALF.HI |= 0x10;
}
}
@ -86,3 +92,139 @@ bool32 LoadEnemySprite(Entity* entity, const EnemyDefinition* definition) {
LoadObjPalette(entity, definition->paletteIndex);
return TRUE;
}
ASM_FUNC("asm/non_matching/enemyUtils/sub_0804A720.inc", void sub_0804A720(Entity* this))
void CreateDeathFx(GenericEntity* parent, u32 parentId, u32 fixedItem);
void sub_0804A7D4(Entity* this) {
CreateDeathFx((GenericEntity*)this, this->id, 0);
}
void CreateDeathFx(GenericEntity* parent, u32 parentId, u32 fixedItem) {
DeathFxObject* deathFx;
DeathFxObject* deathFx2;
u8 bVar3;
if ((parent->field_0x6c.HALF.HI & 1) != 0) {
if ((parent->field_0x6c.HALF.HI & 2) != 0) {
return;
}
deathFx = (DeathFxObject*)CreateObject(DEATH_FX, parent->base.id, 0);
if (deathFx == NULL) {
return;
}
deathFx->unk6c = 1;
PositionRelative(&(parent->base), &(deathFx->base), 0, 1);
deathFx->base.parent = &(parent->base);
parent->field_0x6c.HALF.HI |= 2;
if ((parent->base.id == 0x37) && (gRoomTransition.field_0x39 != 0)) {
DeleteThisEntity();
}
sub_0807CD9C();
SoundReq(SONG_STOP_BGM);
DeleteThisEntity();
return;
} else {
int tmp = parent->base.field_0x3a & 2;
if (tmp == 0) {
sub_08049CF4(&(parent->base));
gSave.unk50 += 1;
parent->base.field_0x3a |= 2;
parent->base.actionDelay = 0xff;
SetDefaultPriority(&(parent->base), 3);
deathFx2 = (DeathFxObject*)CreateObject(DEATH_FX, parent->base.id, 0);
if (deathFx2 != NULL) {
deathFx2->unk6c = tmp;
deathFx2->parentId = parentId;
deathFx2->item = fixedItem;
deathFx2->base.parent = &(parent->base);
deathFx2->base.child = &(parent->base);
CopyPosition(&(parent->base), &(deathFx2->base));
}
if ((parent->field_0x6c.HALF.HI & 8) != 0) {
deathFx2->unk6c |= 8;
DeleteEntity(&(parent->base));
return;
}
if ((parent->base.bitfield & 0x7f) == 0x13) {
bVar3 = parent->base.field_0x1c & 0xf;
if (bVar3 != 1) {
if ((bVar3 == 2) && (deathFx2 != NULL)) {
deathFx2->unk6c |= 2;
}
} else {
if (deathFx2 != NULL) {
deathFx2->unk6c |= 4;
}
}
deathFx2->base.parent = NULL;
DeleteThisEntity();
return;
}
}
if (parent->base.actionDelay == 0) {
DeleteThisEntity();
} else {
if (--parent->base.actionDelay == 0) {
parent->base.spriteSettings.draw = 0;
SetDefaultPriority(&(parent->base), 0);
} else {
if (parent->base.actionDelay < 9) {
if (parent->base.spriteSettings.draw) {
parent->base.spriteSettings.draw = 0;
} else {
parent->base.spriteSettings.draw = 1;
}
}
}
}
return;
}
}
Entity* CreateProjectileWithParent(Entity* parent, u32 projectileId, u32 projectileType) {
Entity* projectile;
projectile = CreateProjectile(projectileId);
if (projectile != NULL) {
projectile->type = projectileType;
CopyPosition(parent, projectile);
}
return projectile;
}
void SetChildOffset(Entity* entity, s32 xOffset, s32 yOffset, s32 zOffset) {
Entity* other;
GenericEntity* this = (GenericEntity*)entity;
other = *(Entity**)&this->field_0x68;
if (other != NULL) {
other->spriteRendering.b3 = super->spriteRendering.b3;
other->spriteOrientation.flipY = super->spriteOrientation.flipY;
other->x.HALF.HI = super->x.HALF.HI + xOffset;
other->y.HALF.HI = super->y.HALF.HI + yOffset;
other->z.HALF.HI = super->z.HALF.HI + zOffset;
other->collisionLayer = super->collisionLayer;
}
}
Entity* sub_0804A9FC(Entity* parent, u32 fxType) {
Entity* fx;
GenericEntity* this = (GenericEntity*)parent;
if ((*(Entity**)&this->field_0x68 == NULL) && (fx = CreateFx(super, fxType, 0), fx != NULL)) {
*(Entity**)&this->field_0x68 = fx;
} else {
fx = NULL;
}
return fx;
}
void sub_0804AA1C(Entity* entity) {
GenericEntity* this = (GenericEntity*)entity;
if (*(Entity**)&this->field_0x68 != NULL) {
(*(Entity**)&this->field_0x68)->parent = NULL;
*(Entity**)&this->field_0x68 = NULL;
}
}

260
src/object/deathFx.c Normal file
View File

@ -0,0 +1,260 @@
#include "global.h"
#define NENT_DEPRECATED
#include "entity.h"
#include "sound.h"
#include "functions.h"
#include "object/deathFx.h"
#include "enemy.h"
void sub_08081790(DeathFxObject* this);
void DeathFx_Delete(DeathFxObject* this);
void DeathFx_Action0(DeathFxObject* this);
void DeathFx_Action1(DeathFxObject* this);
void DeathFx_Action2(DeathFxObject* this);
void DeathFx(Entity* this) {
static void (*const DeathFx_Actions[])(DeathFxObject*) = {
DeathFx_Action0,
DeathFx_Action1,
DeathFx_Action2,
};
DeathFx_Actions[this->action]((DeathFxObject*)this);
}
void DeathFx_Action0(DeathFxObject* this) {
static const u8 gUnk_0811EC08[] = {
0, 64, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
};
static const u8 gUnk_0811EC20[] = {
26,
14,
26,
26,
};
Entity* parent;
int uVar4;
u32 tmp;
if (this->unk6c & 1) {
super->spriteIndex = 0x65;
super->action = 2;
super->direction = 0;
super->speed = 0x40;
super->collisionLayer = 2;
UpdateSpriteForCollisionLayer(&this->base);
super->spriteRendering.b0 = 3;
if (super->actionDelay == 0) {
tmp = 0x80;
} else {
tmp = super->actionDelay;
super->actionDelay = 0;
}
sub_0805EC9C(super, tmp, tmp, 0);
LoadSwapGFX(super, 4, 0);
InitAnimationForceUpdate(super, 0);
SoundReq(SFX_BOSS_EXPLODE);
} else {
if (this->unk6c & 0xc) {
sub_08081790(this);
DeathFx_Delete(this);
} else {
if (this->unk6c & 2) {
InitializeAnimation(&this->base, 2);
} else {
super->spritePriority.b0 = 3;
uVar4 = gUnk_0811EC08[super->type >> 2];
uVar4 >>= ((super->type % 4) << 1);
uVar4 &= 3;
parent = super->parent;
if (parent != NULL) {
parent->actionDelay = gUnk_0811EC20[uVar4];
}
InitializeAnimation(&this->base, uVar4);
}
}
super->action = 1;
EnqueueSFX(SFX_FF);
}
SetDefaultPriority(super, 3);
}
void DeathFx_Action1(DeathFxObject* this) {
GetNextFrame(super);
if (super->frame & 0x80) {
sub_08081790(this);
DeathFx_Delete(this);
} else {
if ((super->frame & 1) != 0) {
super->spritePriority.b0 = 4;
}
}
}
void DeathFx_Action2(DeathFxObject* this) {
UpdateAnimationSingleFrame(super);
if (super->frame & 0x80) {
DeathFx_Delete(this);
} else {
if ((super->frame & 1) != 0) {
LinearMoveUpdate(super);
}
}
}
void DeathFx_DropRandom9(DeathFxObject* this);
void DeathFx_DropRandom13(DeathFxObject* this);
void DeathFx_DropRandom1(DeathFxObject* this);
void DeathFx_DropRandom14(DeathFxObject* this);
void DeathFx_DropFixedItem(DeathFxObject* this);
void sub_08081790(DeathFxObject* this) {
static void (*const DeathFx_DropFunctions[])(DeathFxObject*) = {
DeathFx_DropRandom9, DeathFx_DropRandom13, DeathFx_DropRandom1, DeathFx_DropRandom14,
DeathFx_DropRandom9, DeathFx_DropRandom9, DeathFx_DropRandom9, DeathFx_DropRandom9,
DeathFx_DropRandom9, DeathFx_DropRandom9, DeathFx_DropRandom9, DeathFx_DropRandom9,
DeathFx_DropRandom9, DeathFx_DropRandom9, DeathFx_DropRandom9, DeathFx_DropFixedItem,
};
static const u8 DeathFx_EnemyDroptables[] = {
[OCTOROK] = 6,
[CHUCHU] = 6,
[LEEVER] = 6,
[PEAHAT] = 6,
[ROLLOBITE] = 0,
[DARK_NUT] = 11,
[HANGING_SEED] = 0,
[BEETLE] = 6,
[KEESE] = 6,
[DOOR_MIMIC] = 0,
[ROCK_CHUCHU] = 10,
[SPINY_CHUCHU] = 6,
[CUCCO_CHICK_AGGR] = 6,
[MOLDORM] = 7,
[ENEMY_E] = 6,
[MOLDWORM] = 6,
[SLUGGULA] = 6,
[PESTO] = 0,
[PUFFSTOOL] = 6,
[CHUCHU_BOSS] = 6,
[LIKE_LIKE] = 6,
[SPEAR_MOBLIN] = 8,
[BUSINESS_SCRUB] = 0,
[RUPEE_LIKE] = 8,
[MADDERPILLAR] = 6,
[WATER_DROP] = 6,
[WALL_MASTER] = 8,
[BOMB_PEAHAT] = 10,
[SPARK] = 6,
[CHASER] = 0,
[SPIKED_BEETLE] = 6,
[SENSOR_BLADE_TRAP] = 0,
[HELMASAUR] = 6,
[FALLING_BOULDER] = 0,
[BOBOMB] = 10,
[WALL_MASTER_2] = 8,
[GLEEROK] = 6,
[VAATI_EYES_MACRO] = 0,
[TEKTITE] = 6,
[WIZZROBE_WIND] = 6,
[WIZZROBE_FIRE] = 6,
[WIZZROBE_ICE] = 6,
[ARMOS] = 11,
[EYEGORE] = 9,
[ROPE] = 6,
[SMALL_PESTO] = 1,
[ACRO_BANDIT] = 6,
[BLADE_TRAP] = 0,
[KEATON] = 7,
[CROW] = 6,
[MULLDOZER] = 6,
[BOMBAROSSA] = 6,
[WISP] = 0,
[SPINY_BEETLE] = 6,
[MAZAAL_HEAD] = 6,
[MAZAAL_MACRO] = 6,
[MAZAAL_HAND] = 6,
[OCTOROK_BOSS] = 6,
[FLYING_POT] = 6,
[GOBDO] = 6,
[OCTOROK_GOLDEN] = 6,
[TEKTITE_GOLDEN] = 6,
[ROPE_GOLDEN] = 6,
[CLOUD_PIRANHA] = 6,
[SCISSORS_BEETLE] = 7,
[CUCCO_AGGR] = 6,
[STALFOS] = 7,
[FLYING_SKULL] = 6,
[MAZAAL_BRACELET] = 6,
[TAKKURI] = 6,
[BOW_MOBLIN] = 8,
[LAKITU] = 6,
[LAKITU_CLOUD] = 6,
[TORCH_TRAP] = 6,
[VAATI_REBORN_ENEMY] = 6,
[VAATI_PROJECTILE] = 6,
[BALL_CHAIN_SOLIDER] = 8,
[ENEMY_4D] = 8,
[GHINI] = 6,
[VAATI_TRANSFIGURED] = 6,
[ENEMY_50] = 6,
[VAATI_WRATH] = 6,
[VAATI_ARM] = 12,
[DUST] = 0,
[VAATI_BALL] = 6,
[OCTOROK2] = 6,
[SLIME] = 6,
[MINI_SLIME] = 6,
[FIREBALL_GUY] = 6,
[MINI_FIREBALL_GUY] = 6,
[VAATI_TRANSFIGURED_EYE] = 6,
[BUSINESS_SCRUB_PROLOGUE] = 0,
[GYORG_FEMALE] = 6,
[GYORG_MALE] = 6,
[CURTAIN] = 0,
[VAATI_WRATH_EYE] = 6,
[GYORG_CHILD] = 12,
[GYORG_FEMALE_EYE] = 6,
[GYORG_MALE_EYE] = 6,
[GYORG_FEMALE_MOUTH] = 6,
[ENEMY_64] = 6,
[TREE_ITEM] = 6,
[ENEMY_66] = 6,
6,
6,
6,
6,
6,
6,
6,
6,
6,
};
if (this->parentId < 0xf0) {
CreateRandomItemDrop(super, DeathFx_EnemyDroptables[this->parentId]);
} else {
DeathFx_DropFunctions[this->parentId - 0xf0](this);
}
}
void DeathFx_DropRandom9(DeathFxObject* this) {
CreateRandomItemDrop(super, 9);
}
void DeathFx_DropRandom13(DeathFxObject* this) {
CreateRandomItemDrop(super, 13);
}
void DeathFx_DropRandom14(DeathFxObject* this) {
CreateRandomItemDrop(super, 14);
}
void DeathFx_DropRandom1(DeathFxObject* this) {
CreateRandomItemDrop(super, 1);
}
u32 CreateItemDrop(Entity* arg0, u32 itemID, u32 itemParameter);
void DeathFx_DropFixedItem(DeathFxObject* this) {
CreateItemDrop(super, this->item, 0);
}
void DeathFx_Delete(DeathFxObject* this) {
DeleteThisEntity();
}

View File

@ -39,11 +39,6 @@ static void LoadDestructibleTile(TileEntity*);
static void LoadGrassDropTile(TileEntity*);
static void LoadLocationTile(TileEntity*);
typedef struct {
u8 filler[0x20];
} VarStruct;
extern VarStruct gUnk_080015BC[];
void LoadRoomEntityList(EntityData* listPtr) {
if (listPtr != NULL) {
while (listPtr->kind != 0xFF) {
@ -302,7 +297,7 @@ void LoadRoomTileEntities(TileEntity* list) {
}
static void LoadGrassDropTile(TileEntity* tile) {
MemCopy(&gUnk_080015BC[tile->_1], &gRoomVars.filler4[44], 0x20);
MemCopy(&gAreaDroptables[tile->_1], &gRoomVars.currentAreaDroptable, 0x20);
}
static void LoadLocationTile(TileEntity* tile) {