From b22e26dbd84042ffa35d4ee38f44574550d88c82 Mon Sep 17 00:00:00 2001 From: Rozelette Date: Sat, 27 Mar 2021 19:55:42 -0500 Subject: [PATCH] z_en_item00 (#78) * z_en_item00 WIP 17/21 match, rest close to matching * Split .rodata for z_en_item00 * Item00 documentation, some misc cleanup * Minor cleanup * Fixup for z_collision_check * Address feedback * Delete old file * Fix bad merge --- include/functions.h | 54 +- include/macros.h | 5 + include/segment.h | 54 +- include/variables.h | 18 +- include/z64.h | 9 +- include/z64actor.h | 53 +- include/z64item.h | 50 + linker_scripts/code_script.txt | 6 +- linker_scripts/object_script.txt | 22 +- src/code/z_en_item00.c | 1167 ++++++++++++++++ src/code/z_en_item00.c.ignore | 1237 ----------------- src/code/z_lights.c | 4 +- .../actors/ovl_Arms_Hook/z_arms_hook.c | 1 - .../actors/ovl_En_Scopecoin/z_en_scopecoin.c | 8 +- .../actors/ovl_En_Tubo_Trap/z_en_tubo_trap.c | 35 +- tables/functions.txt | 16 +- tables/variables.txt | 18 +- tools/split_asm.py | 35 +- 18 files changed, 1425 insertions(+), 1367 deletions(-) create mode 100644 include/z64item.h create mode 100644 src/code/z_en_item00.c delete mode 100644 src/code/z_en_item00.c.ignore diff --git a/include/functions.h b/include/functions.h index cbd0fe2c03..22304d5429 100644 --- a/include/functions.h +++ b/include/functions.h @@ -509,27 +509,27 @@ void EnAObj_Update1(ActorEnAObj* this, GlobalContext* ctxt); void EnAObj_Update2(ActorEnAObj* this, GlobalContext* ctxt); void EnAObj_Update(ActorEnAObj* this, GlobalContext* ctxt); void EnAObj_Draw(ActorEnAObj* this, GlobalContext* ctxt); -void EnItem00_UpdateForNewObjectId(ActorEnItem00* this, GlobalContext* ctxt, f32* puParm3, f32* pfParm4); -void EnItem00_Init(ActorEnItem00* this, GlobalContext* ctxt); -void EnItem00_Destroy(ActorEnItem00* this, GlobalContext* ctxt); -void func_800A63A8(ActorEnItem00* this, GlobalContext* ctxt); -void func_800A640C(ActorEnItem00* this); -// void func_800A6650(void); -// void func_800A6780(void); -void EnItem00_Update1(ActorEnItem00* this, GlobalContext* ctxt); -void EnItem00_Update(ActorEnItem00* this, GlobalContext* ctxt); -void EnItem00_Draw(ActorEnItem00* this, GlobalContext* ctxt); -void EnItem00_DrawRupee(ActorEnItem00* this, GlobalContext* ctxt); -void EnItem00_DrawSprite(ActorEnItem00* actor, GlobalContext* ctxt); -void EnItem00_DrawHeartContainer(ActorEnItem00* actor, GlobalContext* ctxt); -// void EnItem00_DrawHeartPiece(void); -// void func_800A7650(void); -void func_800A7730(GlobalContext* globalCtx, Vec3f* spawnPos, u32 params); -// void func_800A7AD4(void); -// void func_800A7D28(void); -s32 func_800A8150(s32 params); -// void func_800A817C(void); -// void func_800A81A4(void); +// void EnItem00_SetObject(EnItem00* this, GlobalContext* globalCtx, f32* shadowOffset, f32* shadowScale); +// void EnItem00_Init(Actor* thisx, GlobalContext* globalCtx); +// void EnItem00_Destroy(Actor* thisx, GlobalContext* globalCtx); +// void EnItem00_WaitForHeartObject(EnItem00* this, GlobalContext* globalCtx); +// void func_800A640C(EnItem00* this, GlobalContext* globalCtx); +// void func_800A6650(EnItem00* this, GlobalContext* globalCtx); +// void func_800A6780(EnItem00* this, GlobalContext* globalCtx); +// void func_800A6A40(EnItem00* this, GlobalContext* globalCtx); +// void EnItem00_Update(Actor* thisx, GlobalContext* globalCtx); +// void EnItem00_Draw(Actor* thisx, GlobalContext* globalCtx); +// void EnItem00_DrawRupee(EnItem00* this, GlobalContext* globalCtx); +// void EnItem00_DrawSprite(EnItem00* this, GlobalContext* globalCtx); +// void EnItem00_DrawHeartContainer(EnItem00* this, GlobalContext* globalCtx); +// void EnItem00_DrawHeartPiece(EnItem00* this, GlobalContext* globalCtx); +// s16 func_800A7650(s16 dropId); +EnItem00* Item_DropCollectible(GlobalContext* globalCtx, Vec3f* spawnPos, u32 params); +Actor* Item_DropCollectible2(GlobalContext* globalCtx, Vec3f* spawnPos, u32 params); +void Item_DropCollectibleRandom(GlobalContext* globalCtx, Actor* fromActor, Vec3f* spawnPos, s16 params); +s32 func_800A8150(s32 index); +s32 func_800A817C(s32 index); +s32 func_800A81A4(GlobalContext* globalCtx, s32 a1, s32 a2); void func_800A81F0(EffectBlure* this, Vec3f* p1, Vec3f* p2); // void func_800A8514(void); void EffectBlure_Initcommon(EffectBlure* params); @@ -786,7 +786,7 @@ void func_800B78B8(GlobalContext* ctxt, Actor* actor, f32 uParm3, f32 uParm4, f3 s32 func_800B7FE0(f32* param_1, f32* param_2, f32* param_3, GraphicsContext* gCtxt); // void func_800B8018(void); void func_800B8050(Actor* actor, GlobalContext* ctxt, s32 iParm3); -// void func_800B8118(void); +void func_800B8118(Actor* actor, GlobalContext* ctxt, s32 iParm3); // void func_800B81E0(void); UNK_PTR func_800B8214(PosRot* param_1, Actor* param_2); f32* func_800B8248(PosRot* param_1, ActorPlayer* param_2); @@ -809,7 +809,7 @@ s32 func_800B8708(GlobalContext* ctxt); void func_800B8898(GlobalContext* ctxt, Actor* actor, UNK_PTR param_3, UNK_PTR param_4); // void func_800B8934(void); u32 Actor_HasParent(Actor* actor, GlobalContext* ctxt); -// UNK_TYPE4 func_800B8A1C(Actor* actor, GlobalContext* ctxt, s32 iParm3, f32 fParm4, f32 param_5); +UNK_TYPE4 func_800B8A1C(Actor* actor, GlobalContext* ctxt, s32 iParm3, f32 fParm4, f32 param_5); // void func_800B8B84(void); // void func_800B8BB0(void); // void func_800B8BD0(void); @@ -1601,7 +1601,7 @@ void func_800EE0CC(Actor* actor, GlobalContext* ctxt, s32 iParm3); u32 func_800EE200(GlobalContext* ctxt, u32 uParm2); u32 func_800EE29C(GlobalContext* ctxt, u32 uParm2); u32 func_800EE2F4(GlobalContext* ctxt); -void func_800EE320(GlobalContext* ctxt, s16 index); +void GetItem_Draw(GlobalContext* ctxt, s16 index); void func_800EE364(GlobalContext* ctxt, s16 index); void func_800EE400(GlobalContext* ctxt, s16 index); void func_800EE5FC(GlobalContext* ctxt, s16 index); @@ -2130,7 +2130,7 @@ void Interface_ChangeAlpha(u16 param_1); // void func_80112B40(void); // void func_80112BE4(void); // void func_80112C0C(void); -u32 func_80112E80(GlobalContext* ctxt, u8 param_2); +u32 Item_Give(GlobalContext* ctxt, u8 param_2); // void func_801143CC(void); // void func_80114978(void); // void func_801149A0(void); @@ -2148,7 +2148,7 @@ u32 func_80112E80(GlobalContext* ctxt, u8 param_2); // void func_801155B4(void); // void func_80115764(void); void func_80115844(GlobalContext* ctxt, s16 param_2); -// void func_80115908(void); +void func_80115908(GlobalContext* ctxt, u8 param_2); void func_801159c0(s16 param_1); // void func_801159EC(void); // void func_80115A14(void); @@ -3000,7 +3000,7 @@ void func_80165438(UNK_PTR param_1); // void func_80165E7C(void); // void func_80165EC0(void); // void func_80166060(void); -// void func_801660B8(GlobalContext* ctxt, UNK_TYPE4 param_2); +UNK_TYPE4 func_801660B8(GlobalContext* ctxt, UNK_TYPE4 param_2); void Play_Fini(GlobalContext* ctxt); // void func_801663C4(void); // void func_80166644(void); diff --git a/include/macros.h b/include/macros.h index 0bcc2cfa47..1d1d0fc03d 100644 --- a/include/macros.h +++ b/include/macros.h @@ -26,6 +26,11 @@ #define PLAYER ((ActorPlayer*)globalCtx->actorCtx.actorList[ACTORCAT_PLAYER].first) +// linkAge still exists in MM, but is always set to 0 (always adult) +// There are remnants of these macros from OOT, but they are essentially useless +//#define LINK_IS_CHILD (gSaveContext.perm.linkAge != 0) +#define LINK_IS_ADULT (gSaveContext.perm.linkAge == 0) + #define SQ(x) ((x)*(x)) #define DECR(x) ((x) == 0 ? 0 : ((x) -= 1)) diff --git a/include/segment.h b/include/segment.h index 8e507760fb..ddea418e90 100644 --- a/include/segment.h +++ b/include/segment.h @@ -3,13 +3,37 @@ #include -extern Gfx D_04029CB0[]; // D_04029CB0 -extern Gfx D_04029CF0[]; // D_04029CF0 +extern Gfx D_040008D0[]; +extern Gfx D_04029CB0[]; +extern Gfx D_04029CF0[]; +extern Gfx D_0405AAB0[]; +extern UNK_TYPE D_0405BEF0; +extern UNK_TYPE D_0405B6F0; +extern UNK_TYPE D_0405C6F0; +extern UNK_TYPE D_0405CEF0; +extern UNK_TYPE D_0405E6F0; +extern Gfx D_0405F6F0[]; +extern UNK_TYPE D_0405F7C0; +extern UNK_TYPE D_0405FFC0; +extern UNK_TYPE D_040607C0; +extern UNK_TYPE D_04060FC0; +extern UNK_TYPE D_040617C0; +extern UNK_TYPE D_04061FC0; +extern UNK_TYPE D_04061FE0; +extern UNK_TYPE D_04062000; +extern UNK_TYPE D_04062020; +extern UNK_TYPE D_04062040; +extern UNK_TYPE D_04062060; +extern Gfx D_040622C0[]; +extern Gfx D_04075A40[]; +extern Gfx D_04075B30[]; +extern Gfx D_04076BC0[]; +extern Gfx D_04077480[]; -//extern Gfx[] D_05018090; // pot break shard displaylist -//extern Gfx[] D_05017EA0; // pot displaylist -extern UNK_TYPE D_05018090; // pot break shard displaylist -extern UNK_TYPE D_05017EA0; // pot displaylist +extern Gfx D_05017EA0[]; // pot displaylist +extern Gfx D_05018090[]; // pot break shard displaylist +extern Gfx D_0501D980[]; +extern Gfx D_050219E0[]; extern UNK_TYPE D_0E000048; extern UNK_TYPE D_0E000088; @@ -23,22 +47,4 @@ extern AnimatedTexture object_ikana_obj_001228[]; extern Gfx object_fu_kaiten_0005D0[]; extern BgMeshHeader object_fu_kaiten_002D30; -extern UNK_PTR D_04061FC0[]; -extern UNK_PTR D_04061FE0[]; -extern UNK_PTR D_04062000[]; -extern UNK_PTR D_04062040[]; -extern UNK_PTR D_04062020[]; -extern UNK_PTR D_04062060[]; -extern UNK_PTR D_04062000[]; -extern Gfx D_040622C0[]; -extern Gfx D_04075A40[]; - -/* z_actor.c */ -extern Gfx D_04076BC0[]; -extern Gfx D_04077480[]; -extern Gfx D_04075B30[]; - -extern Gfx D_0501D980[]; -extern Gfx D_050219E0[]; - #endif diff --git a/include/variables.h b/include/variables.h index a69fd7c333..985ef0d55d 100644 --- a/include/variables.h +++ b/include/variables.h @@ -376,14 +376,14 @@ extern u32 enAObjDisplayLists[2]; extern ActorInit En_Item00_InitVars; extern ColliderCylinderInit enItem00CylinderInit; extern InitChainEntry enItem00InitVars[1]; -// extern UNK_TYPE1 D_801ADF10; -// extern UNK_TYPE1 D_801ADF14; +extern Color_RGBA8 D_801ADF10; +extern Color_RGBA8 D_801ADF14; extern Vec3f D_801ADF18; extern Vec3f D_801ADF24; -// extern UNK_TYPE1 D_801ADF30; -// extern UNK_TYPE1 D_801ADF44; -extern u8 D_801ADF74[272]; -extern u8 D_801AE084[272]; +extern UNK_PTR D_801ADF30[5]; +extern UNK_PTR D_801ADF44[12]; +extern u8 sDropTable[DROP_TABLE_SIZE * DROP_TABLE_NUMBER]; +extern u8 sDropTableAmounts[DROP_TABLE_SIZE * DROP_TABLE_NUMBER]; extern s32 D_801AE194[32]; extern u8 D_801AE214[32]; // extern UNK_TYPE4 D_801AE240; @@ -1444,10 +1444,10 @@ extern UNK_PTR D_801C1E6C; // extern UNK_TYPE1 D_801C1FAC; // extern UNK_TYPE4 D_801C1FE0; // extern UNK_TYPE1 D_801C2054; -// extern UNK_TYPE1 D_801C2078; -// extern UNK_TYPE1 D_801C2079; +extern u8 D_801C2078[1]; // TODO This array is larger than this. How large is it? +extern u8 D_801C2079; // extern UNK_TYPE1 D_801C207A; -// extern UNK_TYPE1 D_801C207E; +extern u8 D_801C207E; // extern UNK_TYPE1 D_801C207F; // extern UNK_TYPE1 D_801C2080; // extern UNK_TYPE1 D_801C2081; diff --git a/include/z64.h b/include/z64.h index a65c0d666a..19f7903e32 100644 --- a/include/z64.h +++ b/include/z64.h @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -364,9 +365,10 @@ typedef struct { /* 0x06 */ UNK_TYPE1 pad6[0xA]; /* 0x10 */ s16 maxLife; /* 0x12 */ s16 currentLife; - /* 0x14 */ UNK_TYPE1 pad14[0x1]; + /* 0x14 */ s8 unk14; /* 0x15 */ s8 currentMagic; - /* 0x16 */ UNK_TYPE1 pad16[0x12]; + /* 0x16 */ s16 unk16; + /* 0x16 */ UNK_TYPE1 pad17[0x10]; } SaveContext_struct1; // size = 0x28 typedef struct { @@ -657,7 +659,8 @@ typedef struct { // Permanent save context, kept in regular save files typedef struct { /* 0x0000 */ u32 entranceIndex; // bits 0-3 : offset; 4-8: spawn index; 9-15: scene index - /* 0x0004 */ UNK_TYPE1 pad4[0x4]; + /* 0x0004 */ UNK_TYPE1 pad4[0x3]; + /* 0x0007 */ u8 linkAge; /* 0x0008 */ s32 cutscene; /* 0x000C */ u16 time; /* 0x000E */ UNK_TYPE1 padE[0x2]; diff --git a/include/z64actor.h b/include/z64actor.h index 55c80a4617..1c90b274e8 100644 --- a/include/z64actor.h +++ b/include/z64actor.h @@ -263,19 +263,58 @@ typedef struct { /* 0xCC4 */ UNK_TYPE1 padCC4[0xB4]; } ActorPlayer; // size = 0xD78 -typedef struct { - /* 0x000 */ Actor base; - /* 0x144 */ ActorFunc update; - /* 0x148 */ s16 collectibleFlagId; +typedef enum { + /* 0x00 */ ITEM00_RUPEE_GREEN, + /* 0x01 */ ITEM00_RUPEE_BLUE, + /* 0x02 */ ITEM00_RUPEE_RED, + /* 0x03 */ ITEM00_HEART, + /* 0x04 */ ITEM00_BOMBS_A, + /* 0x05 */ ITEM00_ARROWS_10, + /* 0x06 */ ITEM00_HEART_PIECE, + /* 0x07 */ ITEM00_HEART_CONTAINER, + /* 0x08 */ ITEM00_ARROWS_30, + /* 0x09 */ ITEM00_ARROWS_40, + /* 0x0A */ ITEM00_ARROWS_50, + /* 0x0B */ ITEM00_BOMBS_B, + /* 0x0C */ ITEM00_NUTS_1, + /* 0x0D */ ITEM00_STICK, + /* 0x0E */ ITEM00_MAGIC_LARGE, + /* 0x0F */ ITEM00_MAGIC_SMALL, + /* 0x10 */ ITEM00_MASK, + /* 0x11 */ ITEM00_SMALL_KEY, + /* 0x12 */ ITEM00_FLEXIBLE, + /* 0x13 */ ITEM00_RUPEE_ORANGE, + /* 0x14 */ ITEM00_RUPEE_PURPLE, + /* 0x15 */ ITEM00_3_HEARTS, + /* 0x16 */ ITEM00_SHIELD_HERO, + /* 0x17 */ ITEM00_NUTS_10, + /* 0x18 */ ITEM00_NOTHING, + /* 0x19 */ ITEM00_BOMBS_0, + /* 0x1A */ ITEM00_BIG_FAIRY, + /* 0x1B */ ITEM00_MAP, + /* 0x1C */ ITEM00_COMPASS, + /* 0x1D */ ITEM00_MUSHROOM_CLOUD, + + /* 0xFF */ ITEM00_NO_DROP = -1 +} Item00Type; + +struct EnItem00; + +typedef void (*EnItem00ActionFunc)(struct EnItem00*, struct GlobalContext*); + +typedef struct EnItem00 { + /* 0x000 */ Actor actor; + /* 0x144 */ EnItem00ActionFunc actionFunc; + /* 0x148 */ s16 collectibleFlag; /* 0x14A */ s16 unk14A; /* 0x14C */ s16 unk14C; /* 0x14E */ s16 unk14E; /* 0x150 */ s16 unk150; /* 0x152 */ s16 unk152; /* 0x154 */ f32 unk154; - /* 0x158 */ ColliderCylinder collision; - /* 0x1A4 */ UNK_TYPE1 pad1A4[0x4]; -} ActorEnItem00; // size = 0x1A8 + /* 0x158 */ ColliderCylinder collider; + /* 0x1A4 */ s8 unk1A4; +} EnItem00; // size = 0x1A8 typedef struct { /* 0x000 */ Actor base; diff --git a/include/z64item.h b/include/z64item.h new file mode 100644 index 0000000000..f4ca2da67c --- /dev/null +++ b/include/z64item.h @@ -0,0 +1,50 @@ +#ifndef _Z64ITEM_H_ +#define _Z64ITEM_H_ + +#define DROP_TABLE_SIZE 16 +#define DROP_TABLE_NUMBER 17 + +// TODO fill out these enums + +typedef enum { + /* 0x78 */ ITEM_KEY_SMALL = 0x78, + /* 0x79 */ ITEM_MAGIC_SMALL = 0x79, + /* 0x7A */ ITEM_MAGIC_LARGE = 0x7A, + /* 0x83 */ ITEM_HEART = 0x83, + /* 0x84 */ ITEM_RUPEE_GREEN = 0x84, + /* 0x85 */ ITEM_RUPEE_BLUE = 0x85, + /* 0x86 */ ITEM_RUPEE_10 = 0x86, + /* 0x87 */ ITEM_RUPEE_RED = 0x87, + /* 0x88 */ ITEM_RUPEE_PURPLE = 0x88, + /* 0x89 */ ITEM_RUPEE_100 = 0x89, + /* 0x8A */ ITEM_RUPEE_ORANGE = 0x8A, + /* 0x8F */ ITEM_BOMBS_5 = 0x8F, + /* 0x90 */ ITEM_BOMBS_10 = 0x90, + /* 0x91 */ ITEM_BOMBS_20 = 0x91, + /* 0x92 */ ITEM_BOMBS_30 = 0x92, + /* 0x93 */ ITEM_ARROWS_10 = 0x93, + /* 0x94 */ ITEM_ARROWS_30 = 0x94, + /* 0x95 */ ITEM_ARROWS_40 = 0x95, + /* 0x96 */ ITEM_ARROWS_50 = 0x96 +} ItemID; + +typedef enum { + /* 0x00 */ GI_NONE, + /* 0x0C */ GI_HEART_PIECE = 0x0C, + /* 0x0D */ GI_HEART_CONTAINER = 0x0D, + /* 0x19 */ GI_STICKS_1 = 0x19, + /* 0x28 */ GI_NUTS_1 = 0x28, + /* 0x2A */ GI_NUTS_10 = 0x2A, + /* 0x32 */ GI_SHIELD_HERO = 0x32, + /* 0x3C */ GI_KEY_SMALL = 0x3C, + /* 0x3E */ GI_MAP = 0x3E, + /* 0x3F */ GI_COMPASS = 0x3F +} GetItemID; + +typedef enum { + /* 0x0A */ GID_COMPASS = 0x0A, + /* 0x1B */ GID_DUNGEON_MAP = 0x1B, + /* 0x27 */ GID_SHIELD_HERO = 0x27 +} GetItemDrawID; + +#endif diff --git a/linker_scripts/code_script.txt b/linker_scripts/code_script.txt index 12896c9166..fa6bccee00 100644 --- a/linker_scripts/code_script.txt +++ b/linker_scripts/code_script.txt @@ -319,7 +319,7 @@ SECTIONS { code_text_start = .; build/src/code/code_0x800A5AC0.o(.text) - build/asm/code/z_en_item00.o(.text) + build/src/code/z_en_item00.o(.text) build/src/code/z_eff_blure.o(.text) build/asm/code/z_eff_shield_particle.o(.text) build/asm/code/z_eff_spark.o(.text) @@ -461,7 +461,7 @@ SECTIONS code_data_start = .; build/asm/code/code_data_0x801AAAB0.o(.data) build/asm/code/code_data_0x800A5AC0.o(.data) - build/asm/code/code_data_z_en_item00.o(.data) + build/src/code/z_en_item00.o(.data) build/asm/code/code_data_z_eff_blure.o(.data) build/asm/code/code_data_z_eff_shield_particle.o(.data) build/src/code/code_0x800AF710.o(.data) @@ -537,7 +537,7 @@ SECTIONS code_data_end = .; code_rodata_start = .; - build/asm/code/code_rodata_z_en_item00.o(.rodata) + build/src/code/z_en_item00.o(.rodata) build/asm/code/code_rodata_z_eff_blure.o(.rodata) build/asm/code/code_rodata_z_eff_shield_particle.o(.rodata) build/asm/code/code_rodata_z_eff_spark.o(.rodata) diff --git a/linker_scripts/object_script.txt b/linker_scripts/object_script.txt index 22f80329bd..e8cc659234 100644 --- a/linker_scripts/object_script.txt +++ b/linker_scripts/object_script.txt @@ -1,14 +1,24 @@ +D_040008D0 = 0x040008D0; D_04029CB0 = 0x04029CB0; D_04029CF0 = 0x04029CF0; -D_040008D0 = 0x040008D0; - +D_0405AAB0 = 0x0405AAB0; +D_0405BEF0 = 0x0405BEF0; +D_0405B6F0 = 0x0405B6F0; +D_0405C6F0 = 0x0405C6F0; +D_0405CEF0 = 0x0405CEF0; +D_0405E6F0 = 0x0405E6F0; +D_0405F6F0 = 0x0405F6F0; +D_0405F7C0 = 0x0405F7C0; +D_0405FFC0 = 0x0405FFC0; +D_040607C0 = 0x040607C0; +D_04060FC0 = 0x04060FC0; +D_040617C0 = 0x040617C0; D_04061FC0 = 0x04061FC0; D_04061FE0 = 0x04061FE0; D_04062000 = 0x04062000; -D_04062040 = 0x04062040; D_04062020 = 0x04062020; +D_04062040 = 0x04062040; D_04062060 = 0x04062060; -D_04062000 = 0x04062000; D_040622C0 = 0x040622C0; D_04076BC0 = 0x04076BC0; D_04075A40 = 0x04075A40; @@ -35,6 +45,10 @@ D_0E0002C8 = 0x0E0002C8; D_06000500 = 0x06000500; +/* z_en_item00 */ +D_06001290 = 0x06001290; +D_06001470 = 0x06001470; + /* z_en_nnh */ D_06001510 = 0x06001510; diff --git a/src/code/z_en_item00.c b/src/code/z_en_item00.c new file mode 100644 index 0000000000..1bdfc3a398 --- /dev/null +++ b/src/code/z_en_item00.c @@ -0,0 +1,1167 @@ +#include +#include + +#define FLAGS 0x00000000 + +#define THIS ((EnItem00*)thisx) + +void EnItem00_Init(Actor* thisx, GlobalContext* globalCtx); +void EnItem00_Destroy(Actor* thisx, GlobalContext* globalCtx); +void EnItem00_Update(Actor* thisx, GlobalContext* globalCtx); +void EnItem00_Draw(Actor* thisx, GlobalContext* globalCtx); + +void EnItem00_WaitForHeartObject(EnItem00* this, GlobalContext* globalCtx); +void func_800A640C(EnItem00* this, GlobalContext* globalCtx); +void func_800A6650(EnItem00* this, GlobalContext* globalCtx); +void func_800A6780(EnItem00* this, GlobalContext* globalCtx); +void func_800A6A40(EnItem00* this, GlobalContext* globalCtx); + +ActorInit En_Item00_InitVars = { + ACTOR_EN_ITEM00, + ACTORCAT_MISC, + FLAGS, + GAMEPLAY_KEEP, + sizeof(EnItem00), + (ActorFunc)EnItem00_Init, + (ActorFunc)EnItem00_Destroy, + (ActorFunc)EnItem00_Update, + (ActorFunc)EnItem00_Draw, +}; + +ColliderCylinderInit enItem00CylinderInit = { + { COLTYPE_NONE, AT_NONE, AC_ON | AT_TYPE_PLAYER, OC1_NONE, OC2_NONE, COLSHAPE_CYLINDER }, + { ELEMTYPE_UNK0, { 0x00000000, 0x00, 0x00 }, { 0x00000010, 0x00, 0x00 }, TOUCH_NONE | TOUCH_SFX_NORMAL, BUMP_ON, OCELEM_NONE }, + { 10, 30, 0, { 0, 0, 0 } }, +}; + +InitChainEntry enItem00InitVars[1] = { + ICHAIN_F32(targetArrowOffset, 2000, ICHAIN_STOP) +}; + +void EnItem00_SetObject(EnItem00* this, GlobalContext* globalCtx, f32* shadowOffset, f32* shadowScale) { + Actor_SetObjectSegment(globalCtx, &this->actor); + Actor_SetScale(&this->actor, 0.5f); + this->unk154 = 0.5f; + *shadowOffset = 0.0f; + *shadowScale = 0.6f; + this->actor.world.rot.x = 0x4000; +} + +void EnItem00_Init(Actor* thisx, GlobalContext* globalCtx) { + EnItem00* this = THIS; + s32 pad; + f32 shadowOffset = 980.0f; + f32 shadowScale = 6.0f; + s32 getItemId = GI_NONE; + s32 sp30 = (this->actor.params & 0x8000) ? 1 : 0; + + this->collectibleFlag = (this->actor.params & 0x7F00) >> 8; + + thisx->params &= 0xFF; // Has to be thisx to match + + if (Actor_GetCollectibleFlag(globalCtx, this->collectibleFlag)) { + if (this->actor.params == ITEM00_HEART_PIECE) { + sp30 = 0; + this->collectibleFlag = 0; + this->actor.params = ITEM00_HEART; + } else { + Actor_MarkForDeath(&this->actor); + return; + } + } + if (this->actor.params == ITEM00_3_HEARTS) { + this->actor.params = ITEM00_HEART; + } + + Actor_ProcessInitChain(&this->actor, enItem00InitVars); + Collider_InitAndSetCylinder(globalCtx, &this->collider, &this->actor, &enItem00CylinderInit); + + this->unk150 = 1; + + switch (this->actor.params) { + case ITEM00_RUPEE_GREEN: + case ITEM00_RUPEE_BLUE: + case ITEM00_RUPEE_RED: + Actor_SetScale(&this->actor, 0.015f); + this->unk154 = 0.015f; + shadowOffset = 750.0f; + break; + case ITEM00_SMALL_KEY: + this->unk150 = 0; + Actor_SetScale(&this->actor, 0.03f); + this->unk154 = 0.03f; + shadowOffset = 350.0f; + break; + case ITEM00_HEART_PIECE: + case ITEM00_HEART_CONTAINER: + this->unk150 = 0; + Actor_SetScale(&this->actor, 0.02f); + this->unk154 = 0.02f; + shadowOffset = 650.0f; + if (this->actor.params == ITEM00_HEART_CONTAINER) { + sp30 = -1; + } + break; + case ITEM00_HEART: + this->actor.home.rot.z = randPlusMinusPoint5Scaled(65535.0f); + shadowOffset = 430.0f; + Actor_SetScale(&this->actor, 0.02f); + this->unk154 = 0.02f; + break; + case ITEM00_ARROWS_10: + case ITEM00_ARROWS_30: + case ITEM00_ARROWS_40: + case ITEM00_ARROWS_50: + Actor_SetScale(&this->actor, 0.035f); + this->unk154 = 0.035f; + shadowOffset = 250.0f; + break; + case ITEM00_BOMBS_A: + case ITEM00_BOMBS_B: + case ITEM00_NUTS_1: + case ITEM00_STICK: + case ITEM00_MAGIC_SMALL: + case ITEM00_NUTS_10: + case ITEM00_BOMBS_0: + Actor_SetScale(&this->actor, 0.03f); + this->unk154 = 0.03f; + shadowOffset = 320.0f; + break; + case ITEM00_MAGIC_LARGE: + Actor_SetScale(&this->actor, 0.044999998f); + this->unk154 = 0.044999998f; + shadowOffset = 320.0f; + break; + case ITEM00_RUPEE_ORANGE: + Actor_SetScale(&this->actor, 0.044999998f); + this->unk154 = 0.044999998f; + shadowOffset = 750.0f; + break; + case ITEM00_RUPEE_PURPLE: + Actor_SetScale(&this->actor, 0.03f); + this->unk154 = 0.03f; + shadowOffset = 750.0f; + break; + case ITEM00_FLEXIBLE: + case ITEM00_BIG_FAIRY: + shadowOffset = 500.0f; + Actor_SetScale(&this->actor, 0.01f); + this->unk154 = 0.01f; + break; + case ITEM00_SHIELD_HERO: + this->actor.objBankIndex = Scene_FindSceneObjectIndex(&globalCtx->sceneContext, OBJECT_GI_SHIELD_2); + EnItem00_SetObject(this, globalCtx, &shadowOffset, &shadowScale); + break; + case ITEM00_MAP: + this->actor.objBankIndex = Scene_FindSceneObjectIndex(&globalCtx->sceneContext, OBJECT_GI_MAP); + EnItem00_SetObject(this, globalCtx, &shadowOffset, &shadowScale); + break; + case ITEM00_COMPASS: + this->actor.objBankIndex = Scene_FindSceneObjectIndex(&globalCtx->sceneContext, OBJECT_GI_COMPASS); + EnItem00_SetObject(this, globalCtx, &shadowOffset, &shadowScale); + break; + default: + break; + } + + this->unk14E = 0; + ActorShape_Init(&this->actor.shape, shadowOffset, func_800B3FC0, shadowScale); + this->actor.shape.shadowAlpha = 180; + this->actor.focus.pos = this->actor.world.pos; + this->unk14A = 0; + + if (sp30 < 0) { + this->actionFunc = EnItem00_WaitForHeartObject; + this->unk152 = -1; + return; + } + if (sp30 == 0) { + this->actionFunc = func_800A640C; + this->unk152 = -1; + return; + } + + this->unk152 = 15; + this->unk14C = 35; + + this->actor.speedXZ = 0.0f; + this->actor.velocity.y = 0.0f; + this->actor.gravity = 0.0f; + + switch (this->actor.params) { + case ITEM00_RUPEE_GREEN: + Item_Give(globalCtx, ITEM_RUPEE_GREEN); + break; + case ITEM00_RUPEE_BLUE: + Item_Give(globalCtx, ITEM_RUPEE_BLUE); + break; + case ITEM00_RUPEE_RED: + Item_Give(globalCtx, ITEM_RUPEE_RED); + break; + case ITEM00_RUPEE_PURPLE: + Item_Give(globalCtx, ITEM_RUPEE_PURPLE); + break; + case ITEM00_RUPEE_ORANGE: + Item_Give(globalCtx, ITEM_RUPEE_ORANGE); + break; + case ITEM00_HEART: + Item_Give(globalCtx, ITEM_HEART); + break; + case ITEM00_FLEXIBLE: + case ITEM00_BIG_FAIRY: + func_80115908(globalCtx, 0x70); + break; + case ITEM00_BOMBS_A: + case ITEM00_BOMBS_B: + Item_Give(globalCtx, ITEM_BOMBS_5); + break; + case ITEM00_ARROWS_10: + Item_Give(globalCtx, ITEM_ARROWS_10); + break; + case ITEM00_ARROWS_30: + Item_Give(globalCtx, ITEM_ARROWS_30); + break; + case ITEM00_ARROWS_40: + Item_Give(globalCtx, ITEM_ARROWS_40); + break; + case ITEM00_ARROWS_50: + Item_Give(globalCtx, ITEM_ARROWS_50); + break; + case ITEM00_MAGIC_LARGE: + Item_Give(globalCtx, ITEM_MAGIC_LARGE); + break; + case ITEM00_MAGIC_SMALL: + Item_Give(globalCtx, ITEM_MAGIC_SMALL); + break; + case ITEM00_SMALL_KEY: + Item_Give(globalCtx, ITEM_KEY_SMALL); + break; + case ITEM00_NUTS_1: + getItemId = GI_NUTS_1; + break; + case ITEM00_NUTS_10: + getItemId = GI_NUTS_10; + break; + default: + break; + } + + if ((getItemId != GI_NONE) && (Actor_HasParent(&this->actor, globalCtx) == 0)) { + func_800B8A1C(&this->actor, globalCtx, getItemId, 50.0f, 20.0f); + } + + this->actionFunc = func_800A6A40; + this->actionFunc(this, globalCtx); +} + +void EnItem00_Destroy(Actor* thisx, GlobalContext* globalCtx) { + EnItem00* this = THIS; + + Collider_DestroyCylinder(globalCtx, &this->collider); +} + +void EnItem00_WaitForHeartObject(EnItem00* this, GlobalContext* globalCtx) { + s32 sp1C; + + sp1C = Scene_FindSceneObjectIndex(&globalCtx->sceneContext, OBJECT_GI_HEARTS); + if (Scene_IsObjectLoaded(&globalCtx->sceneContext, sp1C)) { + this->actor.objBankIndex = sp1C; + this->actionFunc = func_800A640C; + } +} + +void func_800A640C(EnItem00* this, GlobalContext* ctxt) { + if ((this->actor.params <= ITEM00_RUPEE_RED) || ((this->actor.params == ITEM00_HEART) && (this->unk152 < 0)) || (this->actor.params == ITEM00_HEART_PIECE) || (this->actor.params == ITEM00_HEART_CONTAINER)) { + this->actor.shape.rot.y = this->actor.shape.rot.y + 960; + } else if ((this->actor.params >= ITEM00_SHIELD_HERO) && (this->actor.params != ITEM00_NUTS_10) && (this->actor.params < ITEM00_BOMBS_0)) { + if (this->unk152 == -1) { + if (!Math_SmoothScaleMaxMinS(&this->actor.shape.rot.x, this->actor.world.rot.x - 0x4000, 2, 3000, 1500)) { + this->unk152 = -2; + } + } else if (!Math_SmoothScaleMaxMinS(&this->actor.shape.rot.x, -0x4000 - this->actor.world.rot.x, 2, 3000, 1500)) { + this->unk152 = -1; + } + + Math_SmoothScaleMaxMinS(&this->actor.world.rot.x, 0, 2, 2500, 500); + } else if ((this->actor.params == ITEM00_MAP) || (this->actor.params == ITEM00_COMPASS)) { + this->unk152 = -1; + this->actor.shape.rot.y = this->actor.shape.rot.y + 960; + } + + if ((this->actor.params == ITEM00_HEART_PIECE) || (this->actor.params == ITEM00_HEART_CONTAINER)) { + this->actor.shape.yOffset = (Math_SinS(this->actor.shape.rot.y) * 150.0f) + 850.0f; + } + + Math_SmoothScaleMaxMinF(&this->actor.speedXZ, 0.0f, 1.0f, 0.5f, 0.0f); + + if (this->unk14C == 0) { + if ((this->actor.params != ITEM00_SMALL_KEY) && (this->actor.params != ITEM00_HEART_PIECE) && (this->actor.params != ITEM00_HEART_CONTAINER)) { + this->unk14C = -1; + } + } + + if (this->unk152 == 0) { + if ((this->actor.params != ITEM00_SMALL_KEY) && (this->actor.params != ITEM00_HEART_PIECE) && (this->actor.params != ITEM00_HEART_CONTAINER)) { + Actor_MarkForDeath(&this->actor); + } + } + + if ((this->actor.gravity != 0.0f) && ((this->actor.bgCheckFlags & 1) == 0)) { + this->actionFunc = func_800A6650; + } +} + +Color_RGBA8 D_801ADF10 = { 0xFF, 0xFF, 0x7F, 0x00 }; +Color_RGBA8 D_801ADF14 = { 0xFF, 0xFF, 0xFF, 0x00 }; +Vec3f D_801ADF18 = { 0.0f, 0.1f, 0.0f }; +Vec3f D_801ADF24 = { 0.0f, 0.01f, 0.0f }; + +void func_800A6650(EnItem00* this, GlobalContext* globalCtx) { + u32 pad; + Vec3f pos; + + if (this->actor.params <= ITEM00_RUPEE_RED) { + this->actor.shape.rot.y = this->actor.shape.rot.y + 960; + } + if ((globalCtx->unk18840 & 1) != 0) { + pos.x = this->actor.world.pos.x + randPlusMinusPoint5Scaled(10.0f); + pos.y = this->actor.world.pos.y + randPlusMinusPoint5Scaled(10.0f); + pos.z = this->actor.world.pos.z + randPlusMinusPoint5Scaled(10.0f); + EffectSsKiraKira_SpawnSmall(globalCtx, &pos, &D_801ADF18, &D_801ADF24, &D_801ADF10, &D_801ADF14); + } + if ((this->actor.bgCheckFlags & 3) != 0) { + if (this->actor.velocity.y > -2.0f) { + this->actionFunc = func_800A640C; + return; + } + + this->actor.velocity.y = this->actor.velocity.y * -0.8f; + this->actor.bgCheckFlags = this->actor.bgCheckFlags & 0xFFFE; + } +} + +void func_800A6780(EnItem00* this, GlobalContext* globalCtx) { + s32 pad; + Vec3f pos; + s32 var1; + + this->unk152++; + + if (this->actor.params == ITEM00_HEART) { + if (this->actor.velocity.y < 0.0f) { + this->actor.speedXZ = 0.0f; + this->actor.gravity = -0.4f; + if (this->actor.velocity.y < -1.5f) { + this->actor.velocity.y = -1.5f; + } + this->actor.home.rot.z += (s16)((this->actor.velocity.y + 3.0f) * 1000.0f); + this->actor.world.pos.x += (Math_CosS(this->actor.yawTowardsPlayer) * (-3.0f * Math_CosS(this->actor.home.rot.z))); + this->actor.world.pos.z += (Math_SinS(this->actor.yawTowardsPlayer) * (-3.0f * Math_CosS(this->actor.home.rot.z))); + } + } + + if (this->actor.params <= ITEM00_RUPEE_RED) { + this->actor.shape.rot.y += 960; + } else if ((this->actor.params >= ITEM00_SHIELD_HERO) && (this->actor.params != ITEM00_NUTS_10) && (this->actor.params != ITEM00_BOMBS_0)) { + this->actor.world.rot.x -= 700; + this->actor.shape.rot.y += 400; + this->actor.shape.rot.x = this->actor.world.rot.x - 0x4000; + } + + if (this->actor.velocity.y <= 2.0f) { + var1 = (u16)this->actor.shape.rot.z + 10000; + if (var1 < 65535) { + this->actor.shape.rot.z += 10000; + } else { + this->actor.shape.rot.z = -1; + } + } + + if ((globalCtx->unk18840 & 1) == 0) { + pos.x = this->actor.world.pos.x + ((Rand_ZeroOne() - 0.5f) * 10.0f); + pos.y = this->actor.world.pos.y + ((Rand_ZeroOne() - 0.5f) * 10.0f); + pos.z = this->actor.world.pos.z + ((Rand_ZeroOne() - 0.5f) * 10.0f); + EffectSsKiraKira_SpawnSmall(globalCtx, &pos, &D_801ADF18, &D_801ADF24, &D_801ADF10, &D_801ADF14); + } + + if (this->actor.bgCheckFlags & 0x0003) { + this->actionFunc = func_800A640C; + this->actor.shape.rot.z = 0; + this->actor.speedXZ = 0.0f; + } +} + +void func_800A6A40(EnItem00* this, GlobalContext* globalCtx) { + ActorPlayer* player = PLAYER; + + if (this->unk14A != 0) { + if (Actor_HasParent(&this->actor, globalCtx) == 0) { + func_800B8A1C(&this->actor, globalCtx, this->unk14A, 50.0f, 80.0f); + this->unk152++; + } else { + this->unk14A = 0; + } + } + + if (this->unk152 == 0) { + Actor_MarkForDeath(&this->actor); + return; + } + + this->actor.world.pos = player->base.world.pos; + + if (this->actor.params <= ITEM00_RUPEE_RED) { + this->actor.shape.rot.y = this->actor.shape.rot.y + 960; + } else if (this->actor.params == ITEM00_HEART) { + this->actor.shape.rot.y = 0; + } + + this->actor.world.pos.y += (40.0f + (Math_SinS(this->unk152 * 15000) * (this->unk152 * 0.3f))); + + if (LINK_IS_ADULT) { + this->actor.world.pos.y = this->actor.world.pos.y + 20.0f; + } +} + +#ifdef NON_MATCHING +// Minor regalloc issue where it uses v1 instead of v0 +void EnItem00_Update(Actor* thisx, GlobalContext* globalCtx) { + EnItem00* this = THIS; + s32 pad; + ActorPlayer* player = PLAYER; + s32 sp38 = player->unkA74 & 0x1000; + s32 getItemId = GI_NONE; + s32 pad2; + + if (this->unk152 > 0) { + this->unk152--; + } + + if ((this->unk152 > 0) && (this->unk152 <= 40) && (this->unk14C <= 0)) { + this->unk14E = this->unk152; + } + + this->actionFunc(this, globalCtx); + + Math_SmoothScaleMaxMinF(&this->actor.scale.x, this->unk154, 0.1f, this->unk154 * 0.1f, 0.0f); + this->actor.scale.z = this->actor.scale.x; + this->actor.scale.y = this->actor.scale.x; + + if (this->actor.gravity != 0.0f) { + Actor_SetVelocityAndMoveYRotationAndGravity(&this->actor); + func_800B78B8(globalCtx, &this->actor, 20.0f, 15.0f, 15.0f, 0x1D); + + if (this->actor.floorHeight <= -32000.0f) { + Actor_MarkForDeath(&this->actor); + return; + } + } + + Collision_CylinderMoveToActor(&this->actor, &this->collider); + Collision_AddAC(globalCtx, &globalCtx->colCheckCtx, &this->collider.base); + + if ((this->actor.params == ITEM00_SHIELD_HERO) || (this->actor.params == ITEM00_MAP) || (this->actor.params == ITEM00_COMPASS)) { + this->actor.shape.yOffset = fabsf(Math_CosS(this->actor.shape.rot.x) * 37.0f); + } + + if (this->unk14C > 0) { + return; + } + + if (!((sp38 != 0) && (this->actor.xzDistToPlayer <= 60.0f) && (this->actor.yDistToPlayer >= -100.0f) && (this->actor.yDistToPlayer <= 100.0f)) && + !((sp38 == 0) && (this->actor.xzDistToPlayer <= 30.0f) && (this->actor.yDistToPlayer >= -50.0f) && (this->actor.yDistToPlayer <= 50.0f))) { + if (!Actor_HasParent(&this->actor, globalCtx)) { + return; + } + } + + if (globalCtx->unk17000 != 0) { + return; + } + + switch (this->actor.params) { + case ITEM00_RUPEE_GREEN: + this->unk1A4 = 1; + Item_Give(globalCtx, ITEM_RUPEE_GREEN); + break; + case ITEM00_RUPEE_BLUE: + this->unk1A4 = 1; + Item_Give(globalCtx, ITEM_RUPEE_BLUE); + break; + case ITEM00_RUPEE_RED: + this->unk1A4 = 1; + Item_Give(globalCtx, ITEM_RUPEE_RED); + break; + case ITEM00_RUPEE_PURPLE: + this->unk1A4 = 1; + Item_Give(globalCtx, ITEM_RUPEE_PURPLE); + break; + case ITEM00_RUPEE_ORANGE: + this->unk1A4 = 1; + Item_Give(globalCtx, ITEM_RUPEE_ORANGE); + break; + case ITEM00_STICK: + getItemId = GI_STICKS_1; + break; + case ITEM00_NUTS_1: + getItemId = GI_NUTS_1; + break; + case ITEM00_NUTS_10: + getItemId = GI_NUTS_10; + break; + case ITEM00_HEART: + Item_Give(globalCtx, ITEM_HEART); + break; + case ITEM00_FLEXIBLE: + case ITEM00_BIG_FAIRY: + func_80115908(globalCtx, 0x70); + break; + case ITEM00_BOMBS_A: + case ITEM00_BOMBS_B: + Item_Give(globalCtx, ITEM_BOMBS_5); + break; + case ITEM00_ARROWS_10: + Item_Give(globalCtx, ITEM_ARROWS_10); + break; + case ITEM00_ARROWS_30: + Item_Give(globalCtx, ITEM_ARROWS_30); + break; + case ITEM00_ARROWS_40: + Item_Give(globalCtx, ITEM_ARROWS_40); + break; + case ITEM00_ARROWS_50: + Item_Give(globalCtx, ITEM_ARROWS_50); + break; + case ITEM00_SMALL_KEY: + getItemId = GI_KEY_SMALL; + break; + case ITEM00_HEART_PIECE: + getItemId = GI_HEART_PIECE; + break; + case ITEM00_HEART_CONTAINER: + getItemId = GI_HEART_CONTAINER; + break; + case ITEM00_MAGIC_LARGE: + Item_Give(globalCtx, ITEM_MAGIC_LARGE); + break; + case ITEM00_MAGIC_SMALL: + Item_Give(globalCtx, ITEM_MAGIC_SMALL); + break; + case ITEM00_SHIELD_HERO: + getItemId = GI_SHIELD_HERO; + break; + case ITEM00_MAP: + getItemId = GI_MAP; + break; + case ITEM00_COMPASS: + getItemId = GI_COMPASS; + break; + default: + break; + } + + if (getItemId != GI_NONE) { + if (!Actor_HasParent(&this->actor, globalCtx)) { + func_800B8A1C(&this->actor, globalCtx, getItemId, 50.0f, 20.0f); + } + } + + switch (this->actor.params) { + case ITEM00_HEART_PIECE: + case ITEM00_HEART_CONTAINER: + case ITEM00_SMALL_KEY: + case ITEM00_SHIELD_HERO: + case ITEM00_MAP: + case ITEM00_COMPASS: + if (Actor_HasParent(&this->actor, globalCtx)) { + Actor_SetCollectibleFlag(globalCtx, this->collectibleFlag); + Actor_MarkForDeath(&this->actor); + } + return; + default: + break; + } + + if ((this->actor.params <= ITEM00_RUPEE_RED) || (this->actor.params == ITEM00_RUPEE_ORANGE)) { + play_sound(0x4803); + } else if (getItemId != GI_NONE) { + if (Actor_HasParent(&this->actor, globalCtx)) { + Actor_SetCollectibleFlag(globalCtx, this->collectibleFlag); + Actor_MarkForDeath(&this->actor); + } + return; + } else { + play_sound(0x4824); + } + + Actor_SetCollectibleFlag(globalCtx, this->collectibleFlag); + + this->unk152 = 15; + this->unk14C = 35; + this->actor.shape.rot.z = 0; + this->actor.speedXZ = 0.0f; + this->actor.velocity.y = 0.0f; + this->actor.gravity = 0.0f; + + Actor_SetScale(&this->actor, this->unk154); + + this->unk14A = 0; + this->actionFunc = func_800A6A40; +} +#else +#pragma GLOBAL_ASM("./asm/non_matchings/code/z_en_item00/EnItem00_Update.asm") +#endif + +void EnItem00_DrawRupee(EnItem00* this, GlobalContext* globalCtx); +void EnItem00_DrawSprite(EnItem00* this, GlobalContext* globalCtx); +void EnItem00_DrawHeartContainer(EnItem00* this, GlobalContext* globalCtx); +void EnItem00_DrawHeartPiece(EnItem00* this, GlobalContext* globalCtx); + +void EnItem00_Draw(Actor* thisx, GlobalContext* globalCtx) { + s32 pad; + EnItem00* this = THIS; + + if (!(this->unk14E & this->unk150)) { + switch (this->actor.params) { + case ITEM00_RUPEE_GREEN: + case ITEM00_RUPEE_BLUE: + case ITEM00_RUPEE_RED: + case ITEM00_RUPEE_ORANGE: + case ITEM00_RUPEE_PURPLE: + EnItem00_DrawRupee(this, globalCtx); + break; + case ITEM00_HEART_PIECE: + EnItem00_DrawHeartPiece(this, globalCtx); + break; + case ITEM00_HEART_CONTAINER: + EnItem00_DrawHeartContainer(this, globalCtx); + break; + case ITEM00_HEART: + if (this->unk152 < 0) { + if (this->unk152 == -1) { + s8 bankIndex = Scene_FindSceneObjectIndex(&globalCtx->sceneContext, OBJECT_GI_HEART); + if (Scene_IsObjectLoaded(&globalCtx->sceneContext, bankIndex)) { + this->actor.objBankIndex = bankIndex; + Actor_SetObjectSegment(globalCtx, &this->actor); + this->unk152 = -2; + } + } else { + Matrix_Scale(16.0f, 16.0f, 16.0f, 1); + GetItem_Draw(globalCtx, 8); + } + break; + } + case ITEM00_BOMBS_A: + case ITEM00_ARROWS_10: + case ITEM00_ARROWS_30: + case ITEM00_ARROWS_40: + case ITEM00_ARROWS_50: + case ITEM00_BOMBS_B: + case ITEM00_NUTS_1: + case ITEM00_STICK: + case ITEM00_MAGIC_LARGE: + case ITEM00_MAGIC_SMALL: + case ITEM00_SMALL_KEY: + case ITEM00_NUTS_10: + case ITEM00_BOMBS_0: + EnItem00_DrawSprite(this, globalCtx); + break; + case ITEM00_SHIELD_HERO: + GetItem_Draw(globalCtx, GID_SHIELD_HERO); + break; + case ITEM00_MAP: + GetItem_Draw(globalCtx, GID_DUNGEON_MAP); + break; + case ITEM00_COMPASS: + GetItem_Draw(globalCtx, GID_COMPASS); + case ITEM00_MASK: + case ITEM00_FLEXIBLE: + case ITEM00_3_HEARTS: + case ITEM00_NOTHING: + case ITEM00_BIG_FAIRY: + break; + } + } +} + +UNK_PTR D_801ADF30[5] = { + &D_04061FC0, // Green rupee + &D_04061FE0, // Blue rupee + &D_04062000, // Red rupee + &D_04062040, // Orange rupee + &D_04062020 // Purple rupee +}; + +void EnItem00_DrawRupee(EnItem00* this, GlobalContext* globalCtx) { + s32 pad; + s32 iconNb; + + OPEN_DISPS(globalCtx->state.gfxCtx); + + func_8012C28C(globalCtx->state.gfxCtx); + func_800B8050(&this->actor, globalCtx, 0); + + if (this->actor.params <= ITEM00_RUPEE_RED) { + iconNb = this->actor.params; + } else { + iconNb = this->actor.params - 0x10; + } + + gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx), G_MTX_MODELVIEW | G_MTX_LOAD); + + gSPSegment(POLY_OPA_DISP++, 0x08, Lib_PtrSegToVirt(D_801ADF30[iconNb])); + + gSPDisplayList(POLY_OPA_DISP++, &D_040622C0); // TODO symbol + + CLOSE_DISPS(globalCtx->state.gfxCtx); +} + +UNK_PTR D_801ADF44[12] = { + &D_0405E6F0, // Heart (Not used) + &D_0405CEF0, // Bombs (A), Bombs (0) + &D_0405BEF0, // Arrows (10) + &D_0405B6F0, // Arrows (30) + &D_0405C6F0, // Arrows (40), Arrows (50) + &D_0405CEF0, // Bombs (B) + &D_040607C0, // Nuts (1), Nuts (10) + &D_04060FC0, // Sticks (1) + &D_040617C0, // Magic (Large) + &D_0405FFC0, // Magic (Small) + NULL, + &D_0405F7C0 // Small Key +}; + +void EnItem00_DrawSprite(EnItem00* this, GlobalContext* globalCtx) { + s32 iconNb = this->actor.params - 3; + + OPEN_DISPS(globalCtx->state.gfxCtx); + + POLY_OPA_DISP = func_801660B8(globalCtx, POLY_OPA_DISP); + + if (this->actor.params == ITEM00_NUTS_10) { + iconNb = 6; + } else if (this->actor.params == ITEM00_BOMBS_0) { + iconNb = 1; + } else if (this->actor.params >= ITEM00_ARROWS_30) { + iconNb -= 3; + if (this->actor.params < ITEM00_ARROWS_50) { + iconNb++; + } + } + + POLY_OPA_DISP = func_8012C724(POLY_OPA_DISP); + + gSPSegment(POLY_OPA_DISP++, 0x08, Lib_PtrSegToVirt(D_801ADF44[iconNb])); + + gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx), G_MTX_MODELVIEW | G_MTX_LOAD); + + gSPDisplayList(POLY_OPA_DISP++, D_0405F6F0); + + CLOSE_DISPS(globalCtx->state.gfxCtx); +} + +extern Gfx D_06001290[]; +extern Gfx D_06001470[]; + +void EnItem00_DrawHeartContainer(EnItem00* actor, GlobalContext* globalCtx) { + s32 pad; + s32 pad2; + + if (Scene_FindSceneObjectIndex(&globalCtx->sceneContext, OBJECT_GI_HEARTS) == actor->actor.objBankIndex) { + OPEN_DISPS(globalCtx->state.gfxCtx); + + func_8012C2DC(globalCtx->state.gfxCtx); + Matrix_Scale(20.0f, 20.0f, 20.0f, 1); + + gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx), G_MTX_MODELVIEW | G_MTX_LOAD); + + gSPDisplayList(POLY_XLU_DISP++, D_06001290); + gSPDisplayList(POLY_XLU_DISP++, D_06001470); + + CLOSE_DISPS(globalCtx->state.gfxCtx); + } +} + +void EnItem00_DrawHeartPiece(EnItem00* this, GlobalContext* globalCtx) { + s32 pad; + + OPEN_DISPS(globalCtx->state.gfxCtx); + + func_8012C2DC(globalCtx->state.gfxCtx); + func_800B8118(&this->actor, globalCtx, 0); + + gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx), G_MTX_MODELVIEW | G_MTX_LOAD); + + gSPDisplayList(POLY_XLU_DISP++, D_0405AAB0); + + CLOSE_DISPS(globalCtx->state.gfxCtx); +} + +s16 func_800A7650(s16 dropId) { + s16 maxLife; + + if ((((dropId == ITEM00_BOMBS_A) || (dropId == ITEM00_BOMBS_0) || (dropId == ITEM00_BOMBS_B)) && (gSaveContext.perm.inv.items[D_801C207E] == 0xFF)) || + (((dropId == ITEM00_ARROWS_10) || (dropId == ITEM00_ARROWS_30) || (dropId == ITEM00_ARROWS_40) || (dropId == ITEM00_ARROWS_50)) && (gSaveContext.perm.inv.items[D_801C2079] == 0xFF)) || + (((dropId == ITEM00_MAGIC_LARGE) || (dropId == ITEM00_MAGIC_SMALL)) && (gSaveContext.perm.unk24.unk14 == 0))) { + return ITEM00_NO_DROP; + } + + ; + + if (dropId == ITEM00_HEART) { + maxLife = gSaveContext.perm.unk24.maxLife; + if (maxLife == gSaveContext.perm.unk24.currentLife) { + return ITEM00_RUPEE_GREEN; + } + } + + return dropId; +} + +#ifdef NON_MATCHING +// Reordering issues +EnItem00* Item_DropCollectible(GlobalContext* globalCtx, Vec3f* spawnPos, u32 params) { + s32 pad; + EnItem00* spawnedActor = NULL; + s32 pad2; + s32 param10000; + s16 param8000; + s16 param7F00; + s32 param20000; + s32 paramFF; + s32 i; + + param10000 = params & 0x10000; + param8000 = params & 0x8000; + param7F00 = params & 0x7F00; + param20000 = params & 0x20000; + paramFF = params & 0xFF; + + params &= 0x7FFF; + + if (paramFF == ITEM00_3_HEARTS) { + for (i = 0; i != 3; i++) { + spawnedActor = Item_DropCollectible(globalCtx, spawnPos, param7F00 | ITEM00_HEART | param8000); + } + } else if (paramFF == ITEM00_MUSHROOM_CLOUD) { + param7F00 >>= 8; + if (!Actor_GetCollectibleFlag(globalCtx, param7F00)) { + Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_OBJ_KINOKO, spawnPos->x, spawnPos->y, spawnPos->z, 0, 0, 0, param7F00); + } + } else if (((paramFF == ITEM00_FLEXIBLE) || ((params & 0xFF) == ITEM00_BIG_FAIRY)) && (param10000 == 0)) { + if ((params & 0xFF) == ITEM00_FLEXIBLE) { + spawnedActor = Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_EN_ELF, spawnPos->x, spawnPos->y + 40.0f, spawnPos->z, 0, 0, 0, ((((param7F00 >> 8) & 0x7F) << 9) & 0xFE00) | 0x102); + if (!Actor_GetCollectibleFlag(globalCtx, (param7F00 >> 8) & 0x7F)) { + func_800F0568(globalCtx, spawnPos, 0x28, 0x28E7); + } + } else { + spawnedActor = Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_EN_ELFORG, spawnPos->x, spawnPos->y + 40.0f, spawnPos->z, 0, 0, 0, ((((param7F00 >> 8) & 0x7F) & 0x7F) << 9) | 7); + if (param20000 == 0) { + if (!Actor_GetCollectibleFlag(globalCtx, (param7F00 >> 8) & 0x7F)) { + func_800F0568(globalCtx, spawnPos, 0x28, 0x28E7); + } + } + } + } else { + if (param8000 == 0) { + params = func_800A7650(params & 0xFF); + } + if (params != ITEM00_NO_DROP) { + spawnedActor = Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_EN_ITEM00, spawnPos->x, spawnPos->y, spawnPos->z, 0, 0, 0, params | param8000 | param7F00); + if ((spawnedActor != NULL) && (param8000 == 0)) { + if (param10000 == 0) { + spawnedActor->actor.velocity.y = 8.0f; + } else { + spawnedActor->actor.velocity.y = -2.0f; + } + spawnedActor->actor.speedXZ = 2.0f; + spawnedActor->actor.gravity = -0.9f; + spawnedActor->actor.world.rot.y = randPlusMinusPoint5Scaled(65536.0f); + Actor_SetScale(spawnedActor, 0.0f); + spawnedActor->actionFunc = func_800A6780; + spawnedActor->unk152 = 0xDC; + if ((spawnedActor->actor.params != ITEM00_SMALL_KEY) && (spawnedActor->actor.params != ITEM00_HEART_PIECE) && (spawnedActor->actor.params != ITEM00_HEART_CONTAINER)) { + spawnedActor->actor.room = -1; + } + spawnedActor->actor.flags |= 0x0010; + } + } + } + + return spawnedActor; +} +#else +#pragma GLOBAL_ASM("./asm/non_matchings/code/z_en_item00/Item_DropCollectible.asm") +#endif + +#ifdef NON_MATCHING +// Regalloc, minor reordering +Actor* Item_DropCollectible2(GlobalContext* globalCtx, Vec3f* spawnPos, u32 params) { + Actor* spawnedActor = NULL; + u32 pad; + u32 param10000; + s16 param8000; + s16 param7F00; + + param10000 = params & 0x10000; + param8000 = params & 0x8000; + param7F00 = params & 0x7F00; + params &= 0xFF; + + if (params == ITEM00_3_HEARTS) { + return NULL; + } + + if (((params == ITEM00_FLEXIBLE) || (params == ITEM00_BIG_FAIRY)) && (param10000 == 0)) { + if (params == ITEM00_FLEXIBLE) { + spawnedActor = Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_EN_ELF, spawnPos->x, spawnPos->y + 40.0f, spawnPos->z, 0, 0, 0, ((((param7F00 >> 8) & 0x7F) << 9) & 0xFE00) | 0x102); + } else { + spawnedActor = Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_EN_ELFORG, spawnPos->x, spawnPos->y + 40.0f, spawnPos->z, 0, 0, 0, ((((param7F00 >> 8) & 0x7F) & 0x7F) << 9) | 7); + } + if (Actor_GetCollectibleFlag(globalCtx, (param7F00 >> 8) & 0x7F) == 0) { + func_800F0568(globalCtx, spawnPos, 0x28, 0x28E7); + } + } else { + params = func_800A7650(params); + if (params != ITEM00_NO_DROP) { + spawnedActor = Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_EN_ITEM00, spawnPos->x, spawnPos->y, spawnPos->z, 0, 0, 0, params | param8000 | param7F00); + if (spawnedActor != NULL) { + if (param8000 == 0) { + spawnedActor->velocity.y = 0.0f; + spawnedActor->speedXZ = 0.0f; + if (param10000 != 0) { + spawnedActor->gravity = 0.0f; + } else { + spawnedActor->gravity = -0.9f; + } + spawnedActor->world.rot.y = randPlusMinusPoint5Scaled(65536.0f); + spawnedActor->flags |= 0x10; + } + } + } + } + + return spawnedActor; +} +#else +#pragma GLOBAL_ASM("./asm/non_matchings/code/z_en_item00/Item_DropCollectible2.asm") +#endif + +u8 sDropTable[DROP_TABLE_SIZE * DROP_TABLE_NUMBER] = { + ITEM00_RUPEE_GREEN, ITEM00_RUPEE_GREEN, ITEM00_RUPEE_BLUE, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_MASK, ITEM00_MASK, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_BOMBS_A, ITEM00_MAGIC_SMALL, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_HEART, ITEM00_FLEXIBLE, + ITEM00_RUPEE_GREEN, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_MASK, ITEM00_MASK, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_MAGIC_SMALL, ITEM00_NO_DROP, ITEM00_HEART, ITEM00_HEART, ITEM00_HEART, ITEM00_FLEXIBLE, + ITEM00_RUPEE_GREEN, ITEM00_RUPEE_GREEN, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_MASK, ITEM00_MASK, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_BOMBS_A, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_LARGE, ITEM00_MAGIC_LARGE, ITEM00_HEART, ITEM00_HEART, ITEM00_FLEXIBLE, + ITEM00_RUPEE_GREEN, ITEM00_NO_DROP, ITEM00_RUPEE_BLUE, ITEM00_RUPEE_RED, ITEM00_NO_DROP, ITEM00_MASK, ITEM00_MASK, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_BOMBS_A, ITEM00_MAGIC_SMALL, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_HEART, ITEM00_HEART, ITEM00_FLEXIBLE, + ITEM00_MASK, ITEM00_MASK, ITEM00_MASK, ITEM00_MASK, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, + ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, + ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_HEART, ITEM00_HEART, ITEM00_HEART, ITEM00_HEART, ITEM00_HEART, ITEM00_HEART, ITEM00_HEART, ITEM00_HEART, ITEM00_HEART, ITEM00_HEART, ITEM00_HEART, ITEM00_FLEXIBLE, + ITEM00_HEART, ITEM00_HEART, ITEM00_HEART, ITEM00_HEART, ITEM00_HEART, ITEM00_HEART, ITEM00_HEART, ITEM00_HEART, ITEM00_HEART, ITEM00_HEART, ITEM00_HEART, ITEM00_HEART, ITEM00_HEART, ITEM00_HEART, ITEM00_HEART, ITEM00_HEART, + ITEM00_RUPEE_GREEN, ITEM00_RUPEE_GREEN, ITEM00_RUPEE_GREEN, ITEM00_RUPEE_BLUE, ITEM00_RUPEE_BLUE, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, + ITEM00_RUPEE_BLUE, ITEM00_RUPEE_BLUE, ITEM00_RUPEE_BLUE, ITEM00_RUPEE_BLUE, ITEM00_RUPEE_BLUE, ITEM00_RUPEE_BLUE, ITEM00_RUPEE_BLUE, ITEM00_RUPEE_BLUE, ITEM00_RUPEE_BLUE, ITEM00_RUPEE_RED, ITEM00_RUPEE_RED, ITEM00_RUPEE_RED, ITEM00_RUPEE_RED, ITEM00_RUPEE_RED, ITEM00_RUPEE_RED, ITEM00_RUPEE_RED, + ITEM00_ARROWS_10, ITEM00_ARROWS_10, ITEM00_ARROWS_10, ITEM00_ARROWS_10, ITEM00_ARROWS_10, ITEM00_ARROWS_10, ITEM00_ARROWS_10, ITEM00_ARROWS_10, ITEM00_ARROWS_10, ITEM00_ARROWS_10, ITEM00_ARROWS_30, ITEM00_ARROWS_30, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_LARGE, ITEM00_MAGIC_LARGE, + ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_BOMBS_A, ITEM00_BOMBS_A, ITEM00_BOMBS_A, ITEM00_BOMBS_A, ITEM00_BOMBS_A, ITEM00_BOMBS_A, ITEM00_BOMBS_A, ITEM00_BOMBS_A, ITEM00_BOMBS_A, + ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_LARGE, ITEM00_MAGIC_LARGE, + ITEM00_MAGIC_SMALL, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_LARGE, ITEM00_MAGIC_LARGE, ITEM00_MAGIC_LARGE, ITEM00_MAGIC_LARGE, ITEM00_MAGIC_LARGE, ITEM00_MAGIC_LARGE, + ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NUTS_1, ITEM00_NUTS_1, ITEM00_NO_DROP, ITEM00_ARROWS_10, ITEM00_ARROWS_10, ITEM00_ARROWS_10, ITEM00_STICK, ITEM00_STICK, ITEM00_NO_DROP, ITEM00_HEART, ITEM00_HEART, ITEM00_FLEXIBLE, + ITEM00_RUPEE_GREEN, ITEM00_RUPEE_BLUE, ITEM00_RUPEE_BLUE, ITEM00_RUPEE_RED, ITEM00_NO_DROP, ITEM00_ARROWS_10, ITEM00_ARROWS_10, ITEM00_ARROWS_30, ITEM00_BOMBS_A, ITEM00_NO_DROP, ITEM00_STICK, ITEM00_MAGIC_SMALL, ITEM00_MAGIC_LARGE, ITEM00_HEART, ITEM00_HEART, ITEM00_FLEXIBLE, + ITEM00_RUPEE_GREEN, ITEM00_HEART, ITEM00_HEART, ITEM00_MAGIC_SMALL, ITEM00_MASK, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, ITEM00_NO_DROP, +}; + +u8 sDropTableAmounts[DROP_TABLE_SIZE * DROP_TABLE_NUMBER] = { + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x03, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x03, 0x03, 0x01, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x03, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +}; + +#ifdef NON_MATCHING +// Many regalloc and reordering issues +void Item_DropCollectibleRandom(GlobalContext* globalCtx, Actor* fromActor, Vec3f* spawnPos, s16 params) { + EnItem00* spawnedActor; + u8 dropId; + s32 dropQuantity; + s16 dropTableIndex; + s16 param8000; + + dropTableIndex = Rand_ZeroOne() * 16.0f; + param8000 = params & 0x8000; + params &= 0x1F0; + + if (params < 0x101) { + dropId = sDropTable[params + dropTableIndex]; + dropQuantity = sDropTableAmounts[params + dropTableIndex]; + + if (dropId == ITEM00_MASK) { + dropQuantity = 1; + if (gSaveContext.perm.unk20 != 1) { + if (gSaveContext.perm.unk20 != 2) { + if (gSaveContext.perm.unk20 != 4) { + dropId = ITEM00_RUPEE_GREEN; + } else { + dropId = ITEM00_ARROWS_10; + } + } else { + dropId = ITEM00_HEART; + } + } else { + dropId = ITEM00_MAGIC_SMALL; + } + } + + if (fromActor != NULL) { + if (fromActor->dropFlag != 0) { + if ((fromActor->dropFlag & 1) != 0) { + dropId = ITEM00_ARROWS_30; + params = 0x10; + } else if ((fromActor->dropFlag & 2) != 0) { + dropId = ITEM00_HEART; + params = 0x10; + } else if ((fromActor->dropFlag & 0x20) != 0) { + dropId = ITEM00_RUPEE_PURPLE; + } + dropQuantity = 1; + } + } + + if (dropId == ITEM00_FLEXIBLE) { + if (gSaveContext.perm.unk24.currentLife < 0x11) { + Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_EN_ELF, spawnPos->x, spawnPos->y + 40.0f, spawnPos->z, 0, 0, 0, 2); + func_800F0568(globalCtx, spawnPos, 0x28, 0x28E7); + return; + } + + if (gSaveContext.perm.unk24.currentLife < 0x31) { + params = 0x10; + dropId = ITEM00_HEART; + dropQuantity = 3; + } else if (gSaveContext.perm.unk24.currentLife < 0x51) { + params = 0x10; + dropId = ITEM00_HEART; + dropQuantity = 1; + } else if ((gSaveContext.perm.unk24.unk14 != 0) && (gSaveContext.perm.unk24.currentMagic == 0)) { + params = 0xD0; + dropId = ITEM00_MAGIC_LARGE; + dropQuantity = 1; + } else if ((gSaveContext.perm.unk24.unk14 != 0) && ((gSaveContext.perm.unk24.unk14 >> 1) >= gSaveContext.perm.unk24.currentMagic)) { + params = 0xD0; + dropId = ITEM00_MAGIC_LARGE; + dropQuantity = 1; + } else if (gSaveContext.perm.inv.quantities[D_801C2078[1]] < 6) { + params = 0xA0; + dropId = ITEM00_ARROWS_30; + dropQuantity = 1; + } else if (gSaveContext.perm.inv.quantities[D_801C2078[6]] < 6) { + params = 0xB0; + dropId = ITEM00_BOMBS_A; + dropQuantity = 1; + } else if (gSaveContext.perm.unk24.unk16 < 11) { + params = 0xA0; + dropId = ITEM00_RUPEE_RED; + dropQuantity = 1; + } + } + + if (dropId != ITEM00_NO_DROP) { + while (dropQuantity > 0) { + if (param8000 == 0) { + dropId = func_800A7650(dropId); + if (dropId != ITEM00_NO_DROP) { + spawnedActor = Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_EN_ITEM00, spawnPos->x, spawnPos->y, spawnPos->z, 0, 0, 0, dropId); + if ((spawnedActor != 0) && (dropId != ITEM00_NO_DROP)) { + spawnedActor->actor.velocity.y = 8.0f; + spawnedActor->actor.speedXZ = 2.0f; + spawnedActor->actor.gravity = -0.9f; + spawnedActor->actor.world.rot.y = Rand_ZeroOne() * 40000.0f; + Actor_SetScale(spawnedActor, 0.0f); + spawnedActor->actionFunc = func_800A6780; + spawnedActor->actor.flags = spawnedActor->actor.flags | 0x10; + if ((spawnedActor->actor.params != ITEM00_SMALL_KEY) && (spawnedActor->actor.params != ITEM00_HEART_PIECE) && (spawnedActor->actor.params != ITEM00_HEART_CONTAINER)) { + spawnedActor->actor.room = -1; + } + spawnedActor->unk152 = 220; + } + } + } else { + Item_DropCollectible(globalCtx, spawnPos, params | 0x8000); + } + + dropQuantity--; + } + } + } +} +#else +#pragma GLOBAL_ASM("./asm/non_matchings/code/z_en_item00/Item_DropCollectibleRandom.asm") +#endif + +s32 D_801AE194[32] = { + ITEM00_NO_DROP, + ITEM00_RUPEE_GREEN, + ITEM00_RUPEE_BLUE, + ITEM00_NO_DROP, + ITEM00_RUPEE_RED, + ITEM00_RUPEE_PURPLE, + ITEM00_NO_DROP, + ITEM00_RUPEE_ORANGE, + ITEM00_COMPASS, + ITEM00_MUSHROOM_CLOUD, + ITEM00_HEART, + ITEM00_3_HEARTS, + ITEM00_HEART_PIECE, + ITEM00_HEART_CONTAINER, + ITEM00_MAGIC_SMALL, + ITEM00_MAGIC_LARGE, + ITEM00_FLEXIBLE, + ITEM00_BIG_FAIRY, + ITEM00_NO_DROP, + ITEM00_NUTS_10, + ITEM00_NO_DROP, + ITEM00_BOMBS_A, + ITEM00_NO_DROP, + ITEM00_NO_DROP, + ITEM00_NO_DROP, + ITEM00_STICK, + ITEM00_NO_DROP, + ITEM00_NO_DROP, + ITEM00_NO_DROP, + ITEM00_NO_DROP, + ITEM00_ARROWS_10, + ITEM00_ARROWS_30 +}; + +s32 func_800A8150(s32 index) { + if ((index < 0) || (index >= ARRAY_COUNT(D_801AE194))) { + return ITEM00_NO_DROP; + } + + return D_801AE194[index]; +} + +u8 D_801AE214[32] = { + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +}; + +s32 func_800A817C(s32 index) { + if ((index < 0) || (index >= ARRAY_COUNT(D_801AE214))) { + return 0; + } + + return D_801AE214[index]; +} + +s32 func_800A81A4(GlobalContext* globalCtx, s32 a1, s32 a2) { + return (func_800A8150(a1) == ITEM00_BIG_FAIRY) && (!Actor_GetCollectibleFlag(globalCtx, a2)); +} diff --git a/src/code/z_en_item00.c.ignore b/src/code/z_en_item00.c.ignore deleted file mode 100644 index b44d5a5e3d..0000000000 --- a/src/code/z_en_item00.c.ignore +++ /dev/null @@ -1,1237 +0,0 @@ -#include -#include - -extern float fabsf(float); -#pragma intrinsic (fabsf) - -// D_801DBDF0 is start of .rodata - -// This file is most likely En_Item00 -// file name: z_en_item00.c - -static const f32 D_801DBDF0 = 0.6; - -void func_800A5D00(s800A5D00* a0, z_GlobalContext* a1, f32* a2, f32* a3) { - func_800B67FC(a1, a0); - func_800B67E0(a0, 0.5); - - a0->unk154 = 0.5; - *a2 = 0.0; - *a3 = D_801DBDF0; - a0->unk30 = 16384; -} - -void func_800A5D70(s800A5D00* a0, z_GlobalContext* a1) { - UNK_TYPE pad2; - s16 v0; - f32 sp3C; - f32 sp38; - UNK_TYPE sp34; - UNK_TYPE sp30; - UNK_TYPE pad1; - - sp34 = 0; - sp3C = 980; - sp38 = 6; - v0 = a0->unk1C; - - sp30 = ((v0 & 0x8000) != 0)? 1 : 0; - - a0->unk148 = (v0 & 0x7F00) >> 8; - - a0->unk1C &= 0xFF; - - if (func_800B5D6C(a1, a0->unk148) != 0) { - if (a0->unk1C == 6) { - sp30 = 0; - a0->unk148 = 0; - a0->unk1C = 3; - } else { - func_800B670C(a0); - return; - } - } - - if (a0->unk1C == 21) { - a0->unk1C = 3; - } - - func_800FFADC((z_Actor*)a0, (z_ActorCompInitEntry*)&D_801ADF0C); - - func_800E1374(a1, &(a0->unk158), ( z_Actor*)a0, &D_801ADEE0); - - a0->unk150 = 1; - - switch (a0->unk1C) { - case 0: - case 1: - case 2: - // func_800A5E80 - func_800B67E0(a0, 0.015); - a0->unk154 = D_801DBE68; - sp3C = D_801DBE6C; - break; - case 17: - // func_800A5EAC - a0->unk150 = 0; - func_800B67E0(a0, 0.03); - a0->unk154 = D_801DBE70; - sp3C = 350; - break; - case 6: - case 7: - // func_800A5EDC - a0->unk150 = 0; - func_800B67E0(a0, 0.02); - a0->unk154 = D_801DBE74; - sp3C = D_801DBE78; - - if (a0->unk1C == 7) { - sp30 = -1; - } - break; - case 3: - // func_800A5F24 - a0->unk18 = (s16)func_801795C0(D_801DBE7C); - sp3C = 430; - func_800B67E0(a0, 0.02); - a0->unk154 = D_801DBE80; - break; - case 5: - case 8: - case 9: - case 10: - // func_800A5F68 - func_800B67E0(a0, 0.035); - a0->unk154 = D_801DBE84; - sp3C = 250; - break; - case 4: - case 11: - case 12: - case 13: - case 15: - case 23: - case 25: - // func_800A5F94 - func_800B67E0(a0, 0.03); - a0->unk154 = D_801DBE88; - sp3C = 320; - break; - case 14: - // func_800A5FC0 - func_800B67E0(a0, 0.0449999993); //! 0.045 doesn't match - a0->unk154 = D_801DBE8C; - sp3C = 320; - break; - case 19: - // func_800A5FEC - func_800B67E0(a0, 0.0449999993); //! 0.045 doesn't match - a0->unk154 = D_801DBE90; - sp3C = D_801DBE94; - break; - case 20: - // func_800A6018 - func_800B67E0(a0, 0.03); - a0->unk154 = D_801DBE98; - sp3C = D_801DBE9C; - break; - case 18: - case 26: - // func_800A6044 - sp3C = 500; - func_800B67E0(a0, 0.01); - a0->unk154 = D_801DBEA0; - break; - case 22: - // func_800A6070 - a0->unk1E = func_8012F608(&a1->unk17D88, 179); - func_800A5D00(a0, a1, &sp3C, &sp38); - break; - case 27: - // func_800A60A8 - a0->unk1E = func_8012F608(&a1->unk17D88, 160); - func_800A5D00(a0, a1, &sp3C, &sp38); - break; - case 28: - // func_800A60E0 - a0->unk1E = func_8012F608(&a1->unk17D88, 145); - func_800A5D00(a0, a1, &sp3C, &sp38); - break; - case 16: - case 21: - case 24: - default: - // func_800A6110 - break; - } - - a0->unk14E = 0; - - func_800B3BA4(&(a0->unkBC), sp3C, (UNK_PTR)func_800B3FC0, sp38); - - a0->unkD0 = 180; - a0->unk3C = a0->unk24; - a0->unk14A = 0; - - if (sp30 < 0) { - a0->unk144 = (UNK_FUN_ARG)func_800A63A8; - a0->unk152 = -1; - return; - } - - if (sp30 == 0) { - a0->unk144 = (UNK_FUN_ARG)func_800A640C; - a0->unk152 = -1; - return; - } - - a0->unk152 = 15; - a0->unk14C = 35; - a0->unk70 = 0.0; - a0->unk68 = 0.0; - a0->unk74 = 0.0; - - switch (a0->unk1C) { - case 0: - // func_800A61D4 - func_80112E80(a1, 132); - break; - case 1: - // func_800A61E8 - func_80112E80(a1, 133); - break; - case 2: - // func_800A61FC - func_80112E80(a1, 135); - break; - case 20: - // func_800A6210 - func_80112E80(a1, 136); - break; - case 19: - // func_800A6224 - func_80112E80(a1, 138); - break; - case 3: - // func_800A6238 - func_80112E80(a1, 131); - break; - case 18: - case 26: - // func_800A624C - func_80112E80(a1, 112); - break; - case 4: - case 11: - // func_800A6260 - func_80112E80(a1, 143); - break; - case 5: - // func_800A6274 - func_80112E80(a1, 147); - break; - case 8: - // func_800A6288 - func_80112E80(a1, 148); - break; - case 9: - // func_800A629C - func_80112E80(a1, 149); - break; - case 10: - // func_800A62B0 - func_80112E80(a1, 150); - break; - case 14: - // func_800A62C4 - func_80112E80(a1, 122); - break; - case 15: - // func_800A62D8 - func_80112E80(a1, 121); - break; - case 17: - // func_800A62EC - func_80112E80(a1, 120); - break; - case 12: - // func_800A6300 - sp34 = 40; - break; - case 23: - // func_800A630C - sp34 = 42; - break; - case 6: - case 7: - case 13: - case 16: - case 21: - case 22: - case 24: - case 25: - default: - // func_800A6314 - break; - } - - if ((sp34 != 0) && (func_800B89F8(a0, a1) == 0)) { - func_800B8A1C(a0, a1, sp34, 50, 20); - } - - a0->unk144 = (UNK_FUN_ARG)func_800A6A40; - ((UNK_RET(*)(s800A5D00*, z_GlobalContext*))(a0->unk144))(a0, a1); -} - -UNK_RET func_800A637C(s800A5D00* a0, z_GlobalContext* a1) { - UNK_TYPE* a2 = &a0->unk158; - func_800E11EC(a1, a2); -} - -UNK_RET func_800A63A8(s800A5D00* a0, z_GlobalContext* a1) { - u32 sp1C; - - sp1C = func_8012F608(&a1->unk17D88, 150); - - if (func_8012F668(&a1->unk17D88, sp1C) != 0) { - a0->unk1E = sp1C; - a0->unk144 = (UNK_FUN_ARG)func_800A640C; - } -} - -UNK_RET func_800A640C(s800A5D00* a0, z_GlobalContext* a1) { - s16 v1; - - v1 = a0->unk1C; - if ((v1 < 3) || (v1 == 3 && (a0->unk152 < 0)) || (v1 == 6) || (v1 == 7)) { - a0->unkBE += 960; - v1 = a0->unk1C; - } else { - if ((v1 >= 22) && (v1 != 23) && (v1 < 25)) { - if (a0->unk152 == -1) { - if (func_800FFEBC(&(a0->unkBC), a0->unk30 - 16384, 2, 3000, 1500) == 0) { - a0->unk152 = -2; - } - } else { - if (func_800FFEBC(&(a0->unkBC), -16384 - a0->unk30, 2, 3000, 1500) == 0) { - a0->unk152 = -1; - } - } - - func_800FFEBC(&(a0->unk30), 0, 2, 2500, 500); - v1 = a0->unk1C; - } else { - if ((v1 == 27) || (v1 == 28)) { - a0->unk152 = -1; - a0->unkBE += 960; - v1 = a0->unk1C; - } - } - } - - if ((v1 == 6) || (v1 == 7)) { - a0->unkC4 = (func_800FED84(a0->unkBE) * 150) + D_801DBF10; - } - - func_800FFCD8(&(a0->unk70), 0, 1, 0.5, 0); - - if (a0->unk14C == 0) { - v1 = a0->unk1C; - if (v1 != 17 && v1 != 6 && v1 != 7) { - a0->unk14C = -1; - } - } - - if (a0->unk152 == 0) { - v1 = a0->unk1C; - if (v1 != 17 && v1 != 6 && v1 != 7) { - func_800B670C(a0); - } - } - - if (a0->unk74 != 0 && ((a0->unk90) & 0x1) == 0) { - a0->unk144 = (UNK_FUN_ARG)func_800A6650; - } -} - -UNK_RET func_800A6650(s800A5D00* a0, z_GlobalContext* a1) { - UNK_TYPE pad; - z_Vector3D sp30; - - if (a0->unk1C < 3) { - a0->unkBE += 960; - } - - if ((a1->unk18840 & 0x1) != 0) { - sp30.x = a0->unk24.x + func_801795C0(10); - sp30.y = a0->unk24.y + func_801795C0(10); - sp30.z = a0->unk24.z + func_801795C0(10); - - func_800B16B8(a1, &sp30, &D_801ADF18, &D_801ADF24, &D_801ADF10, &D_801ADF14); - } - - if ((a0->unk90 & 0x3) != 0) { - if (a0->unk68 > -2) { - a0->unk144 = (UNK_FUN_ARG)func_800A640C; - } else { - a0->unk68 *= D_801DBF14; - a0->unk90 &= 0xFFFE; - } - } -} - -UNK_RET func_800A6780(s800A5D00* a0, z_GlobalContext* a1) { - s32 v0_2; - z_Vector3D sp40; - s16 v0; - f32 pad; - f32 sp34; - - a0->unk152++; - v0 = a0->unk1C; - if ((v0 == 3) && (a0->unk68 < 0)) { - - a0->unk70 = 0; - a0->unk74 = D_801DBF18; - - if (a0->unk68 < -1.5f) { - a0->unk68 = -1.5; - } - - a0->unk18 += (s16)((a0->unk68 + 3) * 1000); - - sp34 = func_800FED44(a0->unk18); - a0->unk24.x += func_800FED44(a0->unk92) * (-3 * sp34); - - sp34 = func_800FED44(a0->unk18); - a0->unk24.z += func_800FED84(a0->unk92) * (-3 * sp34); - v0 = a0->unk1C; - } - - if (v0 < 3) { - a0->unkBE += 960; - } else if ((v0 >= 22) && (v0 != 23) && (v0 != 25)) { - a0->unk30 -= 700; - a0->unkBE += 400; - a0->unkBC = a0->unk30 - 16384; - } - - if (a0->unk68 <= 2) { - v0_2 = (u16)(a0->unkC0) + 10000; - if (v0_2 < 0xFFFF) { - a0->unkC0 += 10000; - } else { - a0->unkC0 = -1; - } - } - - if ((a1->unk18840 & 0x1) == 0) { - sp40.x = a0->unk24.x + (func_80086FDC() - 0.5f) * 10; - sp40.y = a0->unk24.y + (func_80086FDC() - 0.5f) * 10; - sp40.z = a0->unk24.z + (func_80086FDC() - 0.5f) * 10; - - func_800B16B8(a1, &sp40, &D_801ADF18, &D_801ADF24, &D_801ADF10, &D_801ADF14); - } - - if ((a0->unk90 & 0x3) != 0) { - a0->unk144 = (UNK_FUN_ARG)func_800A640C; - a0->unkC0 = 0; - a0->unk70 = 0; - } -} - -UNK_RET func_800A6A40(s800A5D00* a0, z_GlobalContext* a1) { - sGlobalContext1CCC* sp2C; - s16 v0; - f32 f0; - - sp2C = a1->unk1CCC; - - if (a0->unk14A != 0) { - if (func_800B89F8(a0, a1) == 0) { - func_800B8A1C(a0, a1, a0->unk14A, 50, 80); - a0->unk152++; - } else { - a0->unk14A = 0; - } - } - - if (a0->unk152 == 0) { - func_800B670C(a0); - return; - } - - a0->unk24 = sp2C->unk24; - - v0 = a0->unk1C; - if (v0 < 3) { - a0->unkBE += 960; - } else if (v0 == 3) { - a0->unkBE = 0; - } - - a0->unk24.y += 40 + func_800FED84(a0->unk152 * 15000) * (a0->unk152 * D_801DBF1C); - if (D_801EF677 == 0) { - a0->unk24.y += 20; - } -} - -UNK_RET func_800A6B98(s800A5D00* a0, z_GlobalContext* a1) { - UNK_TYPE pad; - sGlobalContext1CCC* v1; - s16 v1_2; - s16 v0; - UNK_TYPE sp38; - UNK_TYPE sp34; - UNK_TYPE pad2; - - v1 = a1->unk1CCC; - sp38 = v1->unkA74 & 0x1000; - sp34 = 0; - - if (a0->unk152 > 0) { - a0->unk152--; - } - - if ((a0->unk152 > 0) && (a0->unk152 < 41) && (a0->unk14C <= 0)) { - a0->unk14E = a0->unk152; - } - - ((void(*)(s800A5D00* a0, z_GlobalContext* a1))(a0->unk144))(a0, a1); - - func_800FFCD8(&(a0->unk58), a0->unk154, D_801DBF20, a0->unk154 * D_801DBF20, 0); - - // TODO wrong float register is used - a0->unk60 = a0->unk58; - a0->unk5C = a0->unk58; - - if (a0->unk74 != 0) { - func_800B6A88(a0); - func_800B78B8(a1, a0, 20, 15, 15, 29); - - if (a0->unk88 <= -32000) { - func_800B670C(a0); - return; - } - } - - //sp28 = &(a0->unk158); - - func_800E7DF8((z_Actor*)a0, &(a0->unk158)); - - func_800E2740(a1, &(a1->unk18884), &(a0->unk158)); - - v1_2 = a0->unk1C; - - if ((v1_2 == 22) || (v1_2 == 27) || (v1_2 == 28)) { - a0->unkC4 = fabsf(func_800FED44(a0->unkBC) * 37); - } - - if (a0->unk14C > 0) { - return; - } - - if (((sp38 == 0) || !(a0->unk98 <= 60) || !(-100 <= a0->unk9C) || !(a0->unk9C <= 100)) && - ((sp38 != 0) || !(a0->unk98 <= 30) || !(-50 <= a0->unk9C) || (a0->unk9C <= 50))){ - // TODO branch isn't quite right - if (func_800B89F8(a0, a1) == 0) { - return; - } - } - - *(volatile int*)0 = 0; - *(volatile int*)0 = 0; - - if (a1->unk17000 != 0) { - return; - } - - switch (a0->unk1C) { - case 0: - // func_800A6E30 - a0->unk1A4 = 1; - func_80112E80(a1, 132); - break; - case 1: - // func_800A6E4C - a0->unk1A4 = 1; - func_80112E80(a1, 133); - break; - case 2: - // func_800A6E68 - a0->unk1A4 = 1; - func_80112E80(a1, 135); - break; - case 20: - // func_800A6E84 - a0->unk1A4 = 1; - func_80112E80(a1, 136); - break; - case 19: - // func_800A6EA0 - a0->unk1A4 = 1; - func_80112E80(a1, 138); - break; - case 13: - // func_800A6EBC - sp34 = 25; - break; - case 12: - // func_800A6EC8 - sp34 = 40; - break; - case 23: - // func_800A6ED4 - sp34 = 42; - break; - case 3: - // func_800A6EE0 - func_80112E80(a1, 131); - break; - case 18: - case 26: - // func_800A6EF4 - func_80115908(a1, 112); - break; - case 4: - case 11: - // func_800A6F08 - func_80112E80(a1, 143); - break; - case 5: - // func_800A6F1C - func_80112E80(a1, 147); - break; - case 8: - // func_800A6F30 - func_80112E80(a1, 148); - break; - case 9: - // func_800A6F44 - func_80112E80(a1, 149); - break; - case 10: - // func_800A6F58 - func_80112E80(a1, 150); - break; - case 17: - // func_800A6F6C - sp34 = 60; - break; - case 6: - // func_800A6F78 - sp34 = 12; - break; - case 7: - // func_800A6F84 - sp34 = 13; - break; - case 14: - // func_800A6F90 - func_80112E80(a1, 122); - break; - case 15: - // func_800A6FA4 - func_80112E80(a1, 121); - break; - case 22: - // func_800A6FB8 - sp34 = 50; - break; - case 27: - // func_800A6FC4 - sp34 = 62; - break; - case 28: - // func_800A6FD0 - sp34 = 63; - break; - } - - if ((sp34 != 0) && (func_800B89F8(a0, a1) == 0)) { - // TODO loads are correct - func_800B8A1C(a0, a1, sp34, 50, 20); - } - - v0 = a0->unk1C; - - switch (v0) { - case 6: - case 7: - case 17: - case 22: - case 27: - case 28: - // func_800A7040 - if (func_800B89F8(a0, a1) != 0) { - func_800B5DB0(a1, a0->unk148); - func_800B670C(a0); - } - return; - } - - if ((v0 < 3) || (v0 == 19)) { - func_8019F0C8(18435); - } else if (sp34 != 0) { - if (func_800B89F8(a0, a1) == 0) { - return; - } - func_800B5DB0(a1, a0->unk148); - func_800B670C(a0); - return; - } else { - func_8019F0C8(18468); - } - - func_800B5DB0(a1, a0->unk148); - - a0->unk152 = 15; - a0->unk14C = 35; - a0->unkC0 = 0; - a0->unk70 = 0; - a0->unk68 = 0; - a0->unk74 = 0; - - func_800B67E0(a0, a0->unk154); - - a0->unk14A = 0; - a0->unk144 = (UNK_FUN_ARG)func_800A6A40; -} - -UNK_RET func_800A7128(s800A5D00* a0, z_GlobalContext* a1) { - s16 v0; - UNK_TYPE pad; - s8 sp31; - - if ((a0->unk14E & a0->unk150) != 0) { - return; - } - - switch (a0->unk1C) { - case 0: - case 1: - case 2: - case 19: - case 20: - // func_800A7170 - func_800A72AC(a0, a1); - break; - case 6: - // func_800A7184 - func_800A75B8(a0, a1); - break; - case 7: - // func_800A7198 - func_800A74D8(a0, a1); - break; - case 3: - // func_800A71AC - v0 = a0->unk152; - if (v0 < 0) { - if (v0 == -1) { - sp31 = func_8012F608(&(a1->unk17D88), 144); - if (func_8012F668(&(a1->unk17D88), (s32)sp31) == 0) { - return; - } - a0->unk1E = sp31; - func_800B67FC(a1, a0); - a0->unk152 = -2; - // TODO the branch statement is slightly too early - *(volatile int*)0 = 0; - return; - } else { - func_8018039C(16, 16, 16, 1); - func_800EE320(a1, 8); - return; - } - } - // fallthrough - case 4: - case 5: - case 8: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 17: - case 23: - case 25: - // func_800A7254 - func_800A73A0(a0, a1); - break; - case 22: - // func_800A7268 - func_800EE320(a1, 39); - break; - case 27: - // func_800A727C - func_800EE320(a1, 27); - break; - case 28: - // func_800A7290 - func_800EE320(a1, 10); - break; - } -} - -// TODO everything past here needs work - -UNK_RET func_800A72AC(s800A5D00* a0, z_GlobalContext* a1) { - s16 v0; - UNK_TYPE sp30; - u32* v0_2; - z_GraphicsContext* a0_2 = a1->unk0; - u32* sp24; - u32* sp20; - - func_8012C28C(a1->unk0); - func_800B8050(a0, a1, 0); - - v0 = a0->unk1C; - sp30 = (v0 < 3)? v0 : v0 - 16; - - sp24 = a0_2->unk2B0; - a0_2->unk2B0 = sp24 + 2; - sp24[0] = 0xDA380003; - sp24[1] = func_80181A40(a1->unk0); - - sp20 = a0_2->unk2B0; - a0_2->unk2B0 = sp20 + 2; - sp20[0] = 0xDB060020; - sp20[1] = func_80100504(D_801ADF30[sp30]); - - v0_2 = a0_2->unk2B0; - a0_2->unk2B0 = v0_2 + 2; - v0_2[0] = 0xDE000000; - v0_2[1] = 0x040622C0; -} - -UNK_RET func_800A73A0(s800A5D00* a0, z_GlobalContext* a1) { - s16 v1; - s32 sp34; - u32* sp28; - u32* sp24; - u32* v0; - z_GraphicsContext* s0 = a1->unk0; - - sp34 = a0->unk1C; - s0->unk2B0 = func_801660B8(a1, s0->unk2B0, sp34 - 3); - - v1 = a0->unk1C; - if (v1 == 23) { - sp34 = 6; - } else if (v1 == 25) { - sp34 = 1; - } else if (v1 >= 8) { - sp34 -= 3; - if (v1 < 10) { - sp34 += 1; - } - } - - a1->unk0->unk2B0 = func_8012C724(s0->unk2B0); - - sp28 = s0->unk2B0; - s0->unk2B0 = sp28 + 2; - sp28[0] = 0xDB060020; - sp28[1] = func_80100504(D_801ADF44[sp34]); - - sp24 = s0->unk2B0; - s0->unk2B0 = sp24 + 2; - sp24[0] = 0xDA380003; - sp24[1] = func_80181A40(s0); - - v0 = s0->unk2B0; - s0->unk2B0 = v0 + 2; - v0[0] = 0xDE000000; - v0[1] = 0x0405F6F0; -} - -UNK_RET func_800A74D8(s800A5D00* a0, z_GlobalContext* a1) { - u32* sp24; - u32* v0; - - if (func_8012F608(&(a1->unk17D88), 150) != a0->unk1E) { - return; - } - - func_8012C2DC(a1->unk0); - func_8018039C(20, 20, 20, 1); - - sp24 = a1->unk0->unk2C0; - a1->unk0->unk2C0 = sp24 + 2; - sp24[0] = 0xDA380003; - sp24[1] = func_80181A40(a1->unk0); - - v0 = a1->unk0->unk2C0; - a1->unk0->unk2C0 = v0 + 2; - v0[0] = 0xDE000000; - v0[1] = 0x06001290; - - v0 = a1->unk0->unk2C0; - a1->unk0->unk2C0 = v0 + 2; - v0[0] = 0xDE000000; - v0[1] = 0x06001470; -} - -UNK_RET func_800A75B8(s800A5D00* a0, z_GlobalContext* a1) { - u32* sp20; - u32* v0; - - func_8012C2DC(a1->unk0); - func_800B8118(a0, a1, 0); - - sp20 = a1->unk0->unk2C0; - a1->unk0->unk2C0 = sp20 + 2; - sp20[0] = 0xDA380003; - sp20[1] = func_80181A40(a1->unk0); - - v0 = a1->unk0->unk2C0; - a1->unk0->unk2C0 = v0 + 2; - v0[0] = 0xDE000000; - v0[1] = 0x0405AAB0; -} - -s16 func_800A7650(s16 a0) { - if ((((a0 == 4) || (a0 == 25) || (a0 == 11)) && (*((u8*)(D_801EF670[D_801C207E]) + 0x70) == 255)) || - (((a0 == 5) || (a0 == 8) || (a0 == 9) || (a0 == 10)) && (*((u8*)(D_801EF670[D_801C2079]) + 0x70) == 255)) || - (((a0 == 14) || (a0 == 15)) && (D_801EF670[0x38] == 0))) { - return -1; - } - - if (a0 == 3) { - if (D_801EF670[0x34] == D_801EF670[0x36]) { - return 0; - } - } - - return a0; -} - -s800A5D00* func_800A7730(z_GlobalContext* a0, z_Vector3D* a1, s16 a2) { - UNK_TYPE sp58; - s16 sp56; - s16 sp54; - UNK_TYPE sp50; - s16 v0; - UNK_TYPE v1; - s800A5D00* s3; - s16 s0; - UNK_TYPE sp44; - - sp58 = a2 & 0x1; - sp56 = a2 & 0x8000; - sp54 = a2 & 0x7F00; - v0 = a2 & 0xFF; - s3 = NULL; - s0 = a2 & 0x7FFF; - sp50 = a2 & 0x0002; - - if (v0 == 21) { - sp44 = sp54 | 0x03 | sp56; - for (v1 = 0; v1 != 3; v1++) { - s3 = func_800A7730(a0, a1, sp44); - } - return s3; - } - - if (v0 == 29) { - if (func_800B5D6C(a0, (sp54 >> 8)) == 0) { - func_800BAC60(&(a0->unk1CA0), a0, 571, a1->x, a1->y, a1->z, 0, 0, 0, sp54); - } - - return s3; - } - - if (((v0 == 18) || ((s0 & 0xFF) == 26)) && (sp58 == 0)) { - if (18 == (s0 & 0xFF)) { - s3 = (s800A5D00*)func_800BAC60(&(a0->unk1CA0), a0, 16, a1->x, a1->y + 40, a1->z, 0, 0, 0, - ((((sp54 >> 8) & 0x7F) << 9) & 0xFE00) | 0x102); - - if (func_800B5D6C(a0, (((sp54 >> 8) & 0x7F) << 9)) == 0) { - func_800F0568(a0, a1, 40, 10471); - } - - return s3; - } else { - s3 = (s800A5D00*)func_800BAC60(&(a0->unk1CA0), a0, 432, a1->x, a1->y + 40, a1->z, 0, 0, 0, - (((sp54 >> 8) & 0x7F) << 9) | 0x7); - - if (sp50 == 0) { - if (func_800B5D6C(a0, a2) == 0) { - func_800F0568(a0, a1, 40, 10471); - } - - return s3; - } - } - } - - if (sp56 == 0) { - s0 = func_800A7650(s0 & 0xFF); - } - - if (s0 == -1) { - return s3; - } - - s3 = (s800A5D00*)func_800BAC60(&(a0->unk1CA0), a0, 14, a1->x, a1->y, a1->z, 0, 0, 0, s0 | sp56 | sp54); - - if (s3 == NULL) { - return s3; - } - - if (sp56 != 0) { - return s3; - } - - if (sp58 == 0) { - s3->unk68 = 8; - } else { - s3->unk68 = -2; - } - - s3->unk70 = 2; - s3->unk74 = D_801DC068; - - s3->unk32 = func_801795C0(65536); - - func_800B67E0(s3, 0); - - v0 = s3->unk1C; - - s3->unk144 = (UNK_FUN_ARG)func_800A6780; - s3->unk152 = 220; - - if ((v0 != 17) && (v0 != 6) && (v0 != 7)) { - s3->unk3 = -1; - } - - s3->unk4 |= 0x10; - - return s3; -} - -s800A5D00* func_800A7AD4(z_GlobalContext* a0, z_Vector3D* a1, s16 a2) { - s800A5D00* sp4C; // v1 - UNK_TYPE sp44; // t1 - s16 sp42; // t6 - s16 sp40; // t0 - UNK_TYPE v0; - - sp44 = a2 & 0x1; - sp40 = a2 & 0x7F00; - sp42 = a2 & 0x8000; - v0 = a2 & 0xFF; - sp4C = NULL; - - if (v0 == 21) { - return NULL; - } - - if (((v0 == 18) || (v0 == 26)) && (sp44 == 0)) { - if (v0 == 18) { - sp4C = (s800A5D00*)func_800BAC60(&(a0->unk1CA0), a0, 16, a1->x, a1->y + 40, a1->z, 0, 0, 0, - (((((sp40 << 8) & 0x7F) >> 9) & 0xFE00) | 0x102)); - } else { - sp4C = (s800A5D00*)func_800BAC60(&(a0->unk1CA0), a0, 432, a1->x, a1->y + 40, a1->z, 0, 0, 0, - (((sp40 << 8) & 0x7F) >> 9) | 0x7); - } - - if (func_800B5D6C(a0, a2) != 0) { - return sp4C; - } - - func_800F0568(a0, a1, 40, 10471); - - return sp4C; - } - - v0 = func_800A7650(v0); - if (v0 == -1) { - return sp4C; - } - - sp4C = (s800A5D00*)func_800BAC60(&(a0->unk1CA0), a0, 14, a1->x, a1->y, a1->z, 0, 0, 0, v0 | sp42 | sp40); - - if (sp4C == 0) { - return sp4C; - } - - if (sp42 != 0) { - return sp4C; - } - - sp4C->unk68 = 0; - sp4C->unk70 = 0; - - if (sp44 != 0) { - sp4C->unk74 = 0; - } else { - sp4C->unk74 = D_801DC06C; - } - - sp4C->unk32 = func_801795C0(65536); - sp4C->unk4 |= 0x10; - - return sp4C; -} - -void func_800A7D28(z_GlobalContext* a0, s800A5D00* a1, z_Vector3D* a2, s16 a3) { - UNK_TYPE s7; - s16 sp50; // t6 - UNK_TYPE v0; - UNK_TYPE s4; - u8 s3; - u8 s2; - u8 s1; - s800A5D00* s0; - s16 v0_2; - - s7 = a3; - sp50 = s7 & 0x8000; - s7 &= 0x1F0; - - if (s7 > 0x100) { - return; - } - - v0 = s7 + func_80086FDC() * 16; - s3 = D_801AE084[v0]; - s2 = D_801ADF74[v0]; - s4 = 255; - - if (s2 == 16) { - s3 = 1; - s2 = 15; - v0 = D_801EF670[0x20]; - - // TODO switch? - if (v0 != 1) { - if (v0 != 2) { - if (v0 != 4) { - s2 = 0; - } else { - s2 = 5; - } - } else { - s2 = 3; - } - } - } - - if ((a1 != NULL) && (a1->unk11E != 0)) { - if ((a1->unk11E & 0x1) != 0) { - s7 = 16; - s2 = 8; - s3 = 1; - } else if ((a1->unk11E & 0x2) != 0) { - s7 = 16; - s2 = 3; - } else if ((a1->unk11E & 0x20) != 0) { - s2 = 20; - s3 = 1; - } - } - - if (s2 = 18) { - v0 = *((s16*)D_801EF670 + 0x36 / 2); - - if (v0 < 17) { - func_800BAC60(&(a0->unk1CA0), a0, 16, a2->x, a2->y + 40, a2->z, 0, 0, 0, 2); - func_800F0568(a0, a2, 40, 10471); - return; - } - - // TODO wtf even is this - if (v0 < 49) { - s7 = 16; - s2 = 3; - s3 = 3; - s1 = 3; - } else if (v0 < 81) { - s7 = 16; - s2 = 3; - s3 = 1; - s1 = 3; - } else if ((D_801EF670[0x38] != 0) && (s7 = 208, s2 = 14, s3 = 1, D_801EF670[0x39] == 0)) { - s1 = 14; - } else if ((v0 != 0) && (s7 = 208, s2 = 14, D_801EF670[0x39] < (v0 >> 1))) { - s3 = 1; - s1 = 14; - } else if (s7 = 160, s2 = 8, s3 = 1, ((u8*)(D_801EF670[0xA0]))[D_801C2078[1]] < 6) { - s1 = 8; - } else if (s7 = 176, s2 = 4, s3 = 1, ((u8*)(D_801EF670[0xA0]))[D_801C2078[6]] < 6) { - s1 = 4; - } else if (s7 = 160, s2 = 2, s3 = 1, *((s16*)D_801EF670 + 0x3A / 2) < 11) { - s1 = 2; - } - } - - if (s4 == s1) { - return; - } - - while (s3 > 0) { - s2 = func_800A7650(s2); - - if (sp50 == 0) { - if (s4 != s2) { - s1 = s2; - s0 = (s800A5D00*)func_800BAC60(&(a0->unk1CA0), a0, 14, a2->x, a2->y, a2->z, 0, 0, 0, s2); - if ((s0 != NULL) && (s4 != s1)) { - s0->unk68 = 8; - s0->unk70 = 2; - s0->unk74 = D_801DC070; - - s0->unk32 = func_80086FDC() * D_801DC074; - - func_800B67E0(s0, 0); - - s0->unk144 = (UNK_FUN_ARG)func_800A6780; - s0->unk4 |= 0x10; - v0_2 = s0->unk1C; - - if ((v0_2 == 17) || (v0_2 == 6) || (v0_2 == 7)) { - s0->unk3 = -1; - } - s0->unk152 = 220; - } - } - } else { - func_800A7730(a0, a2, s7 | 0x8000); - } - s3--; - } -} - -s32 func_800A8150(UNK_TYPE a0) { - if ((a0 < 0) || (a0 > 31)) { - return -1; - } else { - return D_801AE194[a0]; - } -} - -u8 func_800A817C(UNK_TYPE a0) { - if ((a0 < 0) || (a0 > 31)) { - return 0; - } else { - return D_801AE214[a0]; - } -} - -UNK_TYPE func_800A81A4(z_GlobalContext* ctxt, UNK_TYPE a1, s16 a2) { - UNK_TYPE v0; - v0 = (func_800A8150(a1) ^ 0x1A) < 1; - - if (v0 == 0) { - return v0; - } - - return func_800B5D6C(ctxt, a2) < 1; -} diff --git a/src/code/z_lights.c b/src/code/z_lights.c index 6fb516e7cd..37ade80e37 100644 --- a/src/code/z_lights.c +++ b/src/code/z_lights.c @@ -414,7 +414,7 @@ void Lights_DrawGlow(GlobalContext* globalCtx) { gDPSetCombineLERP(dl++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0); - gSPDisplayList(dl++, &D_04029CB0); + gSPDisplayList(dl++, D_04029CB0); do { if (light->info->type == LIGHT_POINT_GLOW) { @@ -429,7 +429,7 @@ void Lights_DrawGlow(GlobalContext* globalCtx) { gSPMatrix(dl++, Matrix_NewMtx(globalCtx->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - gSPDisplayList(dl++, &D_04029CF0); + gSPDisplayList(dl++, D_04029CF0); } } diff --git a/src/overlays/actors/ovl_Arms_Hook/z_arms_hook.c b/src/overlays/actors/ovl_Arms_Hook/z_arms_hook.c index 7fa00f6280..0e1a520544 100644 --- a/src/overlays/actors/ovl_Arms_Hook/z_arms_hook.c +++ b/src/overlays/actors/ovl_Arms_Hook/z_arms_hook.c @@ -52,7 +52,6 @@ Vec3f D_808C1C40 = { 0.0f, 500.0f, 0.0f }; Vec3f D_808C1C4C = { 0.0f, -500.0f, 0.0f }; extern Gfx D_0601D960[]; -extern Gfx D_040008D0[]; void ArmsHook_SetupAction(ArmsHook* this, ArmsHookActionFunc actionFunc) { this->actionFunc = actionFunc; diff --git a/src/overlays/actors/ovl_En_Scopecoin/z_en_scopecoin.c b/src/overlays/actors/ovl_En_Scopecoin/z_en_scopecoin.c index 1387a51e97..35833f2ce0 100644 --- a/src/overlays/actors/ovl_En_Scopecoin/z_en_scopecoin.c +++ b/src/overlays/actors/ovl_En_Scopecoin/z_en_scopecoin.c @@ -30,7 +30,7 @@ void func_80BFCFA0(EnScopecoin* this, GlobalContext* globalCtx) { void func_80BFCFB8(EnScopecoin* this, GlobalContext* globalCtx) { if (Actor_GetCollectibleFlag(globalCtx, (this->actor.params & 0x7F0) >> 4)) { - func_800A7730(globalCtx, &this->actor.world, 2); + Item_DropCollectible(globalCtx, &this->actor.world, 2); Actor_MarkForDeath(&this->actor); } } @@ -77,14 +77,14 @@ void EnScopecoin_Update(Actor* thisx, GlobalContext* globalCtx) { this->actionFunc(this, globalCtx); } -static UNK_PTR D_80BFD280[] = {D_04061FC0, D_04061FE0, D_04062000, D_04062040, D_04062020, D_04062060, D_04062000}; +static UNK_PTR D_80BFD280[] = {&D_04061FC0, &D_04061FE0, &D_04062000, &D_04062040, &D_04062020, &D_04062060, &D_04062000}; void EnScopecoin_Draw(Actor *thisx, GlobalContext *globalCtx) { EnScopecoin* this = THIS; GraphicsContext* gfxCtx = globalCtx->state.gfxCtx; - + func_8012C28C(globalCtx->state.gfxCtx); - func_800B8050(&this->actor, globalCtx, 0); + func_800B8050(&this->actor, globalCtx, 0); OPEN_DISPS(gfxCtx); gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); diff --git a/src/overlays/actors/ovl_En_Tubo_Trap/z_en_tubo_trap.c b/src/overlays/actors/ovl_En_Tubo_Trap/z_en_tubo_trap.c index 7e45ab0925..850d03597f 100644 --- a/src/overlays/actors/ovl_En_Tubo_Trap/z_en_tubo_trap.c +++ b/src/overlays/actors/ovl_En_Tubo_Trap/z_en_tubo_trap.c @@ -67,10 +67,9 @@ void func_8093089C(EnTuboTrap *this, GlobalContext *globalCtx) { s32 dropCount = func_800A8150(itemParam); if (dropCount >= 0) { - // in OOT this is Item_DropCollectible - func_800A7730(globalCtx, - &this->actor.world, - ((this->actor.params & 0x7F) << 8) | dropCount); + Item_DropCollectible(globalCtx, + &this->actor.world, + ((this->actor.params & 0x7F) << 8) | dropCount); } } @@ -120,10 +119,10 @@ void func_809308F4(EnTuboTrap *this, GlobalContext *globalCtx) { arg5, 0x14, 0, - 0, - ((Rand_ZeroOne() * 85.0f) + 15.0f), 0, - 0, + ((Rand_ZeroOne() * 85.0f) + 15.0f), + 0, + 0, 0x3C, -1, GAMEPLAY_DANGEON_KEEP, @@ -150,7 +149,7 @@ void func_80930B60(EnTuboTrap *this, GlobalContext *globalCtx) { pos = *actorPos; pos.y += this->actor.yDistToWater; - + EffectSsGSplash_Spawn(globalCtx, &pos, NULL, NULL, 0, 0x190); for (i = 0, var = 0; i < 15; i++, var += 20000) { @@ -176,15 +175,15 @@ void func_80930B60(EnTuboTrap *this, GlobalContext *globalCtx) { } EffectSsKakera_Spawn(globalCtx, - &pos, - &vel, + &pos, + &vel, actorPos, - -0xAA, + -0xAA, arg5, - 0x32, 5, 0, + 0x32, 5, 0, ((Rand_ZeroOne() * 85.0f) + 15.0f), - 0, 0, 0x46, - -1, + 0, 0, 0x46, + -1, GAMEPLAY_DANGEON_KEEP, &D_05018090); @@ -195,7 +194,7 @@ void func_80930B60(EnTuboTrap *this, GlobalContext *globalCtx) { void func_80930DDC(EnTuboTrap *this, GlobalContext *globalCtx) { Actor *player = PLAYER; Actor *player2 = PLAYER; - + // in oot func_800F0568 is Audio_PlaySoundAtPosition if (((this->actor.bgCheckFlags & 0x20) != 0) && (this->actor.yDistToWater > 15.0f)) { @@ -240,13 +239,13 @@ void func_80930DDC(EnTuboTrap *this, GlobalContext *globalCtx) { func_8093089C(this, globalCtx); Actor_MarkForDeath(&this->actor); } -} +} #if NON-MATCHING // Wait For Proximity (idle) // NON-MATCHING: wrong register used, v instead of t for the weirdValues[] pointer void func_80931004(EnTuboTrap *this, GlobalContext *globalCtx) { - Actor *player = PLAYER; + Actor *player = PLAYER; f32 currentHeight; s8 weirdvalue; s16 startingRotation; @@ -261,7 +260,7 @@ void func_80931004(EnTuboTrap *this, GlobalContext *globalCtx) { func_800BC154(globalCtx, &globalCtx->actorCtx, this, ACTORCAT_ENEMY); currentHeight = this->actor.world.pos.y; this->actor.flags |= 0x11; // always update and can target - + // hard to know what this value is even used for without knowing what ActorPlayer::unk14B is // wild guess: this is player animation state, height is modified to always point at center of link model weirdvalue = D_8093146C[ ((ActorPlayer*) player)->unk14B & 0xFF]; diff --git a/tables/functions.txt b/tables/functions.txt index 4da091a8e4..672094f4a1 100644 --- a/tables/functions.txt +++ b/tables/functions.txt @@ -499,14 +499,14 @@ 0x800A5C28:("EnAObj_Update2",), 0x800A5C60:("EnAObj_Update",), 0x800A5CB8:("EnAObj_Draw",), - 0x800A5D00:("EnItem00_UpdateForNewObjectId",), + 0x800A5D00:("EnItem00_SetObject",), 0x800A5D70:("EnItem00_Init",), 0x800A637C:("EnItem00_Destroy",), - 0x800A63A8:("func_800A63A8",), + 0x800A63A8:("EnItem00_WaitForHeartObject",), 0x800A640C:("func_800A640C",), 0x800A6650:("func_800A6650",), 0x800A6780:("func_800A6780",), - 0x800A6A40:("EnItem00_Update1",), + 0x800A6A40:("func_800A6A40",), 0x800A6B98:("EnItem00_Update",), 0x800A7128:("EnItem00_Draw",), 0x800A72AC:("EnItem00_DrawRupee",), @@ -514,9 +514,9 @@ 0x800A74D8:("EnItem00_DrawHeartContainer",), 0x800A75B8:("EnItem00_DrawHeartPiece",), 0x800A7650:("func_800A7650",), - 0x800A7730:("func_800A7730",), - 0x800A7AD4:("func_800A7AD4",), - 0x800A7D28:("func_800A7D28",), + 0x800A7730:("Item_DropCollectible",), + 0x800A7AD4:("Item_DropCollectible2",), + 0x800A7D28:("Item_DropCollectibleRandom",), 0x800A8150:("func_800A8150",), 0x800A817C:("func_800A817C",), 0x800A81A4:("func_800A81A4",), @@ -1591,7 +1591,7 @@ 0x800EE200:("func_800EE200",), 0x800EE29C:("func_800EE29C",), 0x800EE2F4:("func_800EE2F4",), - 0x800EE320:("func_800EE320",), + 0x800EE320:("GetItem_Draw",), 0x800EE364:("func_800EE364",), 0x800EE400:("func_800EE400",), 0x800EE5FC:("func_800EE5FC",), @@ -2121,7 +2121,7 @@ 0x80112B40:("func_80112B40",), 0x80112BE4:("func_80112BE4",), 0x80112C0C:("func_80112C0C",), - 0x80112E80:("func_80112E80",), + 0x80112E80:("Item_Give",), 0x801143CC:("func_801143CC",), 0x80114978:("func_80114978",), 0x801149A0:("func_801149A0",), diff --git a/tables/variables.txt b/tables/variables.txt index 17a0f18fcf..cc61fee78d 100644 --- a/tables/variables.txt +++ b/tables/variables.txt @@ -373,14 +373,14 @@ 0x801ADEC0:("En_Item00_InitVars","ActorInit","",0x20), 0x801ADEE0:("enItem00CylinderInit","ColliderCylinderInit","",0x2c), 0x801ADF0C:("enItem00InitVars","ActorInitVar","[1]",0x4), - 0x801ADF10:("D_801ADF10","UNK_TYPE1","",0x1), - 0x801ADF14:("D_801ADF14","UNK_TYPE1","",0x1), + 0x801ADF10:("D_801ADF10","ColorRGBA8","",0x4), + 0x801ADF14:("D_801ADF14","ColorRGBA8","",0x4), 0x801ADF18:("D_801ADF18","Vec3f","",0xc), 0x801ADF24:("D_801ADF24","Vec3f","",0xc), - 0x801ADF30:("D_801ADF30","UNK_TYPE1","",0x1), - 0x801ADF44:("D_801ADF44","UNK_TYPE1","",0x1), - 0x801ADF74:("D_801ADF74","u8","[272]",0x110), - 0x801AE084:("D_801AE084","u8","[272]",0x110), + 0x801ADF30:("D_801ADF30","UNK_PTR","[5]",0x14), + 0x801ADF44:("D_801ADF44","UNK_PTR","[12]",0x30), + 0x801ADF74:("sDropTable","u8","[272]",0x110), + 0x801AE084:("sDropTableAmounts","u8","[272]",0x110), 0x801AE194:("D_801AE194","s32","[32]",0x80), 0x801AE214:("D_801AE214","u8","[32]",0x20), 0x801AE240:("D_801AE240","UNK_TYPE4","",0x4), @@ -1438,10 +1438,10 @@ 0x801C1FAC:("D_801C1FAC","UNK_TYPE1","",0x1), 0x801C1FE0:("D_801C1FE0","UNK_TYPE4","",0x4), 0x801C2054:("D_801C2054","UNK_TYPE1","",0x1), - 0x801C2078:("D_801C2078","UNK_TYPE1","",0x1), - 0x801C2079:("D_801C2079","UNK_TYPE1","",0x1), + 0x801C2078:("D_801C2078","u8","[1]",0x1), + 0x801C2079:("D_801C2079","u8","",0x1), 0x801C207A:("D_801C207A","UNK_TYPE1","",0x1), - 0x801C207E:("D_801C207E","UNK_TYPE1","",0x1), + 0x801C207E:("D_801C207E","u8","",0x1), 0x801C207F:("D_801C207F","UNK_TYPE1","",0x1), 0x801C2080:("D_801C2080","UNK_TYPE1","",0x1), 0x801C2081:("D_801C2081","UNK_TYPE1","",0x1), diff --git a/tools/split_asm.py b/tools/split_asm.py index 0cb44ba91b..48922064de 100755 --- a/tools/split_asm.py +++ b/tools/split_asm.py @@ -16,13 +16,23 @@ def split_asm_and_rodata(): disableRodataConvert = False basename = str(args.input) - - if "0x" in basename: - basename = basename.split("0x")[0] - else: - basename = basename.split(".")[0] - rodataFile = basename + "late_rodata.asm" - + rodataFile = None + + if "ovl_" in basename: + if "0x" in basename: + basename = basename.split("0x")[0] + else: + basename = basename.split(".")[0] + else: # files in code + if "0x" in basename: + basename = basename.split("code_")[-1] + else: + basename = basename.split("/")[-1] + rodataFile = "asm/code/code_rodata_" + basename + + if rodataFile is None: + rodataFile = basename + "late_rodata.asm" + if not os.path.exists(rodataFile): rodataFile = basename + "rodata.asm" @@ -81,7 +91,7 @@ def split_asm_and_rodata(): deleteLine = True break if not deleteLine: - f.writelines([xline]) + f.writelines([xline]) f.close() relevant_rodata = [] @@ -130,7 +140,7 @@ def split_asm_and_rodata(): current_file.write("glabel " + entry[0] + "\n") written_rodata.append(entry[0]) current_file.write(entry[1]) - + if os.path.exists(rodataFile): with open(rodataFile, 'w+') as f: f.truncate() @@ -149,7 +159,7 @@ def split_asm_and_rodata(): if not deleteLine: f.writelines([xline]) f.close() - + relevant_rodata = [] written_rodata = [] current_file.close() @@ -162,6 +172,9 @@ def split_asm_and_rodata(): for name in file_names: f.write('\n#pragma GLOBAL_ASM("{}")\n'.format(name)) +rodata_excluded = ["ovl_Bg_Dkjail_Ivy", "ovl_Bg_Ikana_Mirror", "ovl_Boss_02", "ovl_Boss_07", "ovl_Boss_Hakugin", "ovl_Elf_Msg", "ovl_Elf_Msg2", "ovl_Elf_Msg3", "ovl_Elf_Msg4", "ovl_Elf_Msg5", "ovl_En_Az", "ovl_En_Bigokuta", "ovl_En_Bigpamet", "ovl_En_Bigpo", "ovl_En_Bigslime", "ovl_En_Box", "ovl_En_Butte", "ovl_En_Col_Man", "ovl_En_Crow", "ovl_En_Death", "ovl_En_Elf", "ovl_En_Elforg", "ovl_En_Encount3", "ovl_En_Encount4", "ovl_En_Fish", "ovl_En_Fish2", "ovl_En_Fsn", "ovl_En_Honotrap", "ovl_En_Horse", "ovl_En_Horse_Game", "ovl_En_Invadepoh", "ovl_En_Ishi", "ovl_En_Kame", "ovl_En_Kanban", "ovl_En_Kusa2", "ovl_En_M_Thunder", "ovl_En_Maruta", "ovl_En_Mushi2", "ovl_En_Okuta", "ovl_En_Ossan", "ovl_En_Pametfrog", "ovl_En_Peehat", "ovl_En_Rg", "ovl_En_Ruppecrow", "ovl_En_Slime", "ovl_En_Sob1", "ovl_En_Syateki_Man", "ovl_En_Test7", "ovl_En_Trt", "ovl_En_Wiz_Fire", "ovl_Mir_Ray", "ovl_Obj_Bombiwa", "ovl_Obj_Driftice", "ovl_Obj_Hariko", "ovl_Obj_Iceblock", "ovl_Obj_Mure", "ovl_Obj_Snowball2", "ovl_Obj_Toudai", "ovl_select"] +rodata_included = ["z_en_item00"] + if __name__ == '__main__': parser = argparse.ArgumentParser() @@ -174,7 +187,7 @@ if __name__ == '__main__': file_names = [] - if "ovl_" in str(args.input) and not any(ovlFile in str(args.input) for ovlFile in ["ovl_Bg_Dkjail_Ivy", "ovl_Bg_Ikana_Mirror", "ovl_Boss_02", "ovl_Boss_07", "ovl_Boss_Hakugin", "ovl_Elf_Msg", "ovl_Elf_Msg2", "ovl_Elf_Msg3", "ovl_Elf_Msg4", "ovl_Elf_Msg5", "ovl_En_Az", "ovl_En_Bigokuta", "ovl_En_Bigpamet", "ovl_En_Bigpo", "ovl_En_Bigslime", "ovl_En_Box", "ovl_En_Butte", "ovl_En_Col_Man", "ovl_En_Crow", "ovl_En_Death", "ovl_En_Elf", "ovl_En_Elforg", "ovl_En_Encount3", "ovl_En_Encount4", "ovl_En_Fish", "ovl_En_Fish2", "ovl_En_Fsn", "ovl_En_Honotrap", "ovl_En_Horse", "ovl_En_Horse_Game", "ovl_En_Invadepoh", "ovl_En_Ishi", "ovl_En_Kame", "ovl_En_Kanban", "ovl_En_Kusa2", "ovl_En_M_Thunder", "ovl_En_Maruta", "ovl_En_Mushi2", "ovl_En_Okuta", "ovl_En_Ossan", "ovl_En_Pametfrog", "ovl_En_Peehat", "ovl_En_Rg", "ovl_En_Ruppecrow", "ovl_En_Slime", "ovl_En_Sob1", "ovl_En_Syateki_Man", "ovl_En_Test7", "ovl_En_Trt", "ovl_En_Wiz_Fire", "ovl_Mir_Ray", "ovl_Obj_Bombiwa", "ovl_Obj_Driftice", "ovl_Obj_Hariko", "ovl_Obj_Iceblock", "ovl_Obj_Mure", "ovl_Obj_Snowball2", "ovl_Obj_Toudai", "ovl_select"]): + if ("ovl_" in str(args.input) and not any(file in str(args.input) for file in rodata_excluded)) or any(file in str(args.input) for file in rodata_included): split_asm_and_rodata() exit(0)