From fb84cabd4a25efaf26087084c3695773305ff906 Mon Sep 17 00:00:00 2001 From: Derek Hensley Date: Wed, 2 Jun 2021 15:33:16 -0700 Subject: [PATCH] Ovl_En_Toto OK (#163) * Lots of progress * OK * Removed casts * Run format.sh * cleanup * More cleanup * Minor Doc * More cleanup * Format * Add header description * PR comments * Convert raw pointers * Update to new gSaveContext * PR suggestions --- include/functions.h | 18 +- include/z64.h | 4 +- linker_scripts/code_script.txt | 4 +- linker_scripts/object_script.txt | 18 + src/overlays/actors/ovl_En_Toto/z_en_toto.c | 741 ++++++++++++++++++-- src/overlays/actors/ovl_En_Toto/z_en_toto.h | 34 +- tables/variables.txt | 2 - 7 files changed, 763 insertions(+), 58 deletions(-) diff --git a/include/functions.h b/include/functions.h index b4a7ced1f9..6b34f61288 100644 --- a/include/functions.h +++ b/include/functions.h @@ -795,7 +795,7 @@ f32* func_800B8248(PosRot* param_1, ActorPlayer* param_2); // void func_800B83BC(void); // void func_800B83F8(void); s32 func_800B84D0(Actor* actor, GlobalContext* globalCtx); -// UNK_TYPE4 func_800B8500(Actor* actor, GlobalContext* globalCtx, f32 fParm3, f32 fParm4, s32 param_5); +s32 func_800B8500(Actor* actor, GlobalContext* globalCtx, f32 fParm3, f32 fParm4, s32 param_5); void func_800B85E0(Actor* actor, GlobalContext* globalCtx, f32 uParm3, s32 uParm4); void func_800B8614(Actor* actor, GlobalContext* globalCtx, f32 uParm3); void func_800B863C(Actor* actor, GlobalContext* globalCtx); @@ -866,7 +866,7 @@ Actor* func_800BB498(ActorContext* actCtxt, Actor* actor, GlobalContext* globalC // void func_800BB8EC(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5); void func_800BBA88(GlobalContext* globalCtx, Actor* iParm2); // void func_800BBAC0(void); -// void func_800BBB74(void); +void func_800BBB74(s16* arg1, UNK_TYPE1 arg2, UNK_TYPE1 arg3, UNK_TYPE4 arg4); // void func_800BBC20(void); // void func_800BBCEC(void); // void func_800BBDAC(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6, UNK_TYPE2 param_7, UNK_TYPE2 param_8, UNK_TYPE1 param_9); @@ -2194,7 +2194,7 @@ s32 func_801224E0(s32 param_1, s16 param_2, s16 param_3); // UNK_TYPE4 func_80122670(s32* param_1, Input* input); // void func_801226E0(void); // void func_80122744(void); -// void func_80122760(void); +s32 func_80122760(GlobalContext* globalCtx, UNK_PTR arg1, f32 arg2); void func_80122868(GlobalContext* globalCtx, ActorPlayer* player); void func_801229A0(GlobalContext* globalCtx, ActorPlayer* player); // void func_801229EC(void); @@ -2872,12 +2872,12 @@ void func_80150D08(GlobalContext* globalCtx, u32 uParm2); void func_801518B0(GlobalContext* globalCtx, u32 uParm2, Actor* uParm3); void func_80151938(GlobalContext* globalCtx, u16 param_2); void func_80151A68(GlobalContext* globalCtx, u16 param_2); -void func_80151BB4(s32 iParm1, u32 uParm2); +void func_80151BB4(GlobalContext* globalCtx, u32 uParm2); // void func_80151C9C(void); // void func_80151DA4(void); -// void func_80152434(void); +void func_80152434(GlobalContext* globalCtx, u16 arg2); // void func_80152464(void); -// UNK_TYPE4 func_80152498(MessageContext* msgCtx); +UNK_TYPE4 func_80152498(MessageContext* msgCtx); // void func_8015268C(void); // void func_80152C64(void); // void func_80152CAC(void); @@ -3836,7 +3836,7 @@ void play_sound(u16 param_1); void func_8019F128(u16 param_1); // void func_8019F170(void); void func_8019F1C0(Vec3f* pos, u16 sfxId); -// void func_8019F208(void); +void func_8019F208(void); void func_8019F230(void); // void func_8019F258(void); // void func_8019F300(void); @@ -3910,7 +3910,7 @@ void func_801A246C(u8 param_1, u8 param_2); // void func_801A2C44(void); // void func_801A2C88(void); // void func_801A2D54(void); -// void func_801A2DE0(void); +s32 func_801A2DE0(UNK_TYPE4 arg1); // void func_801A2E54(void); // void func_801A2ED8(void); // void func_801A2F88(void); @@ -3918,7 +3918,7 @@ void func_801A246C(u8 param_1, u8 param_2); // void func_801A3038(void); // void func_801A3098(void); // void func_801A312C(void); -// void func_801A31EC(void); +void func_801A31EC(UNK_TYPE1 arg1, UNK_TYPE4 arg2, u8 arg3); // void func_801A3238(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE1 param_5); // void func_801A32CC(void); // void func_801A3590(void); diff --git a/include/z64.h b/include/z64.h index 697a27f408..cb8b4f0dae 100644 --- a/include/z64.h +++ b/include/z64.h @@ -932,7 +932,9 @@ typedef struct { /* 0x12020 */ u8 unk12020; /* 0x12021 */ u8 unk12021; /* 0x12022 */ u8 choiceIndex; - /* 0x12023 */ UNK_TYPE1 pad12023[0x21]; + /* 0x12023 */ UNK_TYPE1 pad12023[0x7]; + /* 0x1202A */ u16 unk1202A; + /* 0x1202C */ UNK_TYPE1 pad1202B[0x18]; /* 0x12044 */ s16 unk12044; /* 0x12046 */ UNK_TYPE1 pad12046[0x24]; /* 0x1206A */ s16 unk1206A; diff --git a/linker_scripts/code_script.txt b/linker_scripts/code_script.txt index 14d6fe8238..fa24accc7b 100644 --- a/linker_scripts/code_script.txt +++ b/linker_scripts/code_script.txt @@ -7639,9 +7639,9 @@ SECTIONS ovl_En_Toto : AT(RomLocation) { build/src/overlays/actors/ovl_En_Toto/z_en_toto.o(.text) - build/asm/overlays/ovl_En_Toto_data.o(.data) + build/src/overlays/actors/ovl_En_Toto/z_en_toto.o(.data) build/src/overlays/actors/ovl_En_Toto/z_en_toto.o(.rodata) - build/asm/overlays/ovl_En_Toto_rodata.o(.rodata) + build/src/overlays/actors/ovl_En_Toto/z_en_toto_overlay.o(.ovl) } SegmentEnd = .; SegmentSize = SegmentEnd - SegmentStart; diff --git a/linker_scripts/object_script.txt b/linker_scripts/object_script.txt index ae27805e3e..1800002d24 100644 --- a/linker_scripts/object_script.txt +++ b/linker_scripts/object_script.txt @@ -109,6 +109,24 @@ D_06009120 = 0x06009120; D_06005458 = 0x06005458; D_0600788C = 0x0600788C; +/* z_en_toto */ +D_06000C80 = 0x06000C80; +D_06001324 = 0x06001324; +D_060016A4 = 0x060016A4; +D_06001DF0 = 0x06001DF0; +D_060022C8 = 0x060022C8; +D_060028B8 = 0x060028B8; +D_06002F20 = 0x06002F20; +D_06003AA8 = 0x06003AA8; +D_06008AE8 = 0x06008AE8; +D_0600A068 = 0x0600A068; +D_0600A468 = 0x0600A468; +D_0600A978 = 0x0600A978; +D_0600B3E0 = 0x0600B3E0; +D_0600B894 = 0x0600B894; +D_0600BC08 = 0x0600BC08; +D_0600C880 = 0x0600C880; + /* en_ginko_man */ object_ginko_skeleton = 0x0600C240; object_ginko_limb15_dlist = 0x0600B1D8; diff --git a/src/overlays/actors/ovl_En_Toto/z_en_toto.c b/src/overlays/actors/ovl_En_Toto/z_en_toto.c index 41253bcd26..59fdf35ed4 100644 --- a/src/overlays/actors/ovl_En_Toto/z_en_toto.c +++ b/src/overlays/actors/ovl_En_Toto/z_en_toto.c @@ -1,15 +1,54 @@ +/* + * File: z_en_toto.c + * Overlay: ovl_En_Toto + * Description: Toto + */ + #include "z_en_toto.h" #define FLAGS 0x00000009 #define THIS ((EnToto*)thisx) +#define ENTOTO_WEEK_EVENT_FLAGS (gSaveContext.weekEventReg[50] & 1 || gSaveContext.weekEventReg[51] & 0x80) + void EnToto_Init(Actor* thisx, GlobalContext* globalCtx); void EnToto_Destroy(Actor* thisx, GlobalContext* globalCtx); void EnToto_Update(Actor* thisx, GlobalContext* globalCtx); void EnToto_Draw(Actor* thisx, GlobalContext* globalCtx); -/* +void func_80BA3930(EnToto* this, GlobalContext* globalCtx); +void func_80BA39C8(EnToto* this, GlobalContext* globalCtx); +void func_80BA3DBC(EnToto* this, GlobalContext* globalCtx); +void func_80BA3BFC(EnToto* this, GlobalContext* globalCtx); +void func_80BA3CC4(EnToto* this, GlobalContext* globalCtx); +void func_80BA3D38(EnToto* this, GlobalContext* globalCtx); +s32 func_80BA3EC0(EnToto* this, GlobalContext* globalCtx); +s32 func_80BA3ED4(EnToto* this, GlobalContext* globalCtx); +s32 func_80BA3EE8(EnToto* this, GlobalContext* globalCtx); +s32 func_80BA3F2C(EnToto* this, GlobalContext* globalCtx); +s32 func_80BA3FB0(EnToto* this, GlobalContext* globalCtx); +s32 func_80BA3FCC(EnToto* this, GlobalContext* globalCtx); +s32 func_80BA402C(EnToto* this, GlobalContext* globalCtx); +s32 func_80BA407C(EnToto* this, GlobalContext* globalCtx); +s32 func_80BA40D4(EnToto* this, GlobalContext* globalCtx); +s32 func_80BA4128(EnToto* this, GlobalContext* globalCtx); +s32 func_80BA415C(EnToto* this, GlobalContext* globalCtx); +s32 func_80BA4204(EnToto* this, GlobalContext* globalCtx); +s32 func_80BA42BC(EnToto* this, GlobalContext* globalCtx); +s32 func_80BA43F4(EnToto* this, GlobalContext* globalCtx); +s32 func_80BA445C(EnToto* this, GlobalContext* globalCtx); +s32 func_80BA44A0(EnToto* this, GlobalContext* globalCtx); +s32 func_80BA4530(EnToto* this, GlobalContext* globalCtx); +s32 func_80BA46D8(EnToto* this, GlobalContext* globalCtx); +s32 func_80BA4740(EnToto* this, GlobalContext* globalCtx); +s32 func_80BA47E0(EnToto* this, GlobalContext* globalCtx); +s32 func_80BA49A4(EnToto* this, GlobalContext* globalCtx); +s32 func_80BA4A00(EnToto* this, GlobalContext* globalCtx); +s32 func_80BA4B24(EnToto* this, GlobalContext* globalCtx); +s32 func_80BA4C0C(EnToto* this, GlobalContext* globalCtx); +s32 func_80BA4C44(EnToto* this, GlobalContext* globalCtx); + const ActorInit En_Toto_InitVars = { ACTOR_EN_TOTO, ACTORCAT_NPC, @@ -21,86 +60,702 @@ const ActorInit En_Toto_InitVars = { (ActorFunc)EnToto_Update, (ActorFunc)EnToto_Draw, }; -*/ -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Toto_0x80BA36C0/func_80BA36C0.asm") +extern AnimationHeader D_06000C80; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Toto_0x80BA36C0/EnToto_Init.asm") +extern AnimationHeader D_06001324; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Toto_0x80BA36C0/EnToto_Destroy.asm") +extern AnimationHeader D_060016A4; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Toto_0x80BA36C0/func_80BA383C.asm") +extern AnimationHeader D_06001DF0; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Toto_0x80BA36C0/func_80BA3930.asm") +extern AnimationHeader D_060022C8; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Toto_0x80BA36C0/func_80BA397C.asm") +extern AnimationHeader D_060028B8; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Toto_0x80BA36C0/func_80BA39C8.asm") +extern AnimationHeader D_06002F20; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Toto_0x80BA36C0/func_80BA3BFC.asm") +extern AnimationHeader D_06003AA8; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Toto_0x80BA36C0/func_80BA3C88.asm") +extern UNK_TYPE D_06008AE8; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Toto_0x80BA36C0/func_80BA3CC4.asm") +extern UNK_TYPE D_0600A068; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Toto_0x80BA36C0/func_80BA3D38.asm") +extern UNK_TYPE D_0600A468; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Toto_0x80BA36C0/func_80BA3DBC.asm") +extern FlexSkeletonHeader D_0600A978; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Toto_0x80BA36C0/func_80BA3EC0.asm") +extern AnimationHeader D_0600B3E0; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Toto_0x80BA36C0/func_80BA3ED4.asm") +extern AnimationHeader D_0600B894; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Toto_0x80BA36C0/func_80BA3EE8.asm") +extern AnimationHeader D_0600BC08; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Toto_0x80BA36C0/func_80BA3F2C.asm") +extern AnimationHeader D_0600C880; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Toto_0x80BA36C0/func_80BA3FB0.asm") +static ColliderCylinderInit sCylinderInit = { + { + COLTYPE_METAL, + AT_NONE, + AC_ON | AC_HARD | AC_TYPE_PLAYER, + OC1_ON | OC1_TYPE_ALL, + OC2_TYPE_2, + COLSHAPE_CYLINDER, + }, + { + ELEMTYPE_UNK2, + { 0x00100000, 0x00, 0x00 }, + { 0x01000202, 0x00, 0x00 }, + TOUCH_NONE | TOUCH_SFX_NORMAL, + BUMP_ON | BUMP_HOOKABLE, + OCELEM_ON, + }, + { 20, 60, 0, { 0, 0, 0 } }, +}; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Toto_0x80BA36C0/func_80BA3FCC.asm") +static EnTotoActionFunc D_80BA501C[] = { + func_80BA3930, + func_80BA3BFC, + func_80BA3D38, +}; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Toto_0x80BA36C0/func_80BA402C.asm") +static InitChainEntry sInitChain[] = { + ICHAIN_U8(targetMode, 1, ICHAIN_STOP), +}; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Toto_0x80BA36C0/func_80BA407C.asm") +static EnTotoText D_80BA502C[] = { + { 0, 0, 0x2B21 }, + { 3, 2, 0 }, +}; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Toto_0x80BA36C0/func_80BA40D4.asm") +static EnTotoText D_80BA5034[] = { + { 0, 0, 0x2B23 }, +}; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Toto_0x80BA36C0/func_80BA4128.asm") +static EnTotoText D_80BA5038[] = { + { 2, 1, 0x2B24 }, + { 4, 0, 0x2B25 }, + { 3, 2, 0 }, +}; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Toto_0x80BA36C0/func_80BA415C.asm") +static EnTotoText D_80BA5044[] = { + { 4, 0, 0x2B25 }, +}; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Toto_0x80BA36C0/func_80BA4204.asm") +static EnTotoText D_80BA5048[] = { + { 16, 0, 0x2A94 }, { 0, 0, 0x2A95 }, { 4, 0, 0x2A96 }, { 4, 0, 0x2A97 }, + { 0, 0, 0x2A98 }, { 0, 0, 0x2A99 }, { 4, 0, 0x2A9A }, { 4, 0, 0x2A9B }, +}; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Toto_0x80BA36C0/func_80BA42BC.asm") +static EnTotoText D_80BA5068[] = { + { 0, 0, 0x2AE1 }, + { 0, 0, 0x2AE2 }, + { 4, 0, 0x2AE3 }, +}; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Toto_0x80BA36C0/func_80BA43F4.asm") +static EnTotoText D_80BA5074[] = { + { 4, 0, 0x2AE4 }, +}; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Toto_0x80BA36C0/func_80BA445C.asm") +static AnimationHeader* D_80BA5078[] = { &D_060028B8, &D_0600B894, &D_06002F20, &D_0600BC08 }; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Toto_0x80BA36C0/func_80BA44A0.asm") +static EnTotoText D_80BA5088[] = { + { 5, 0, 0 }, { 6, 20, 0 }, { 7, 0, 0 }, { 8, 9, 0 }, { 9, 10, 0 }, { 1, 0, 0 }, { 10, 0, 0 }, + { 11, 0, 0 }, { 12, 0, 0 }, { 13, 0, 0 }, { 15, 0, 0 }, { 17, 1, 0 }, { 17, 0, 0 }, +}; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Toto_0x80BA36C0/func_80BA44D4.asm") +static EnTotoText D_80BA50BC[] = { + { 5, 0, 0 }, { 6, 20, 0 }, { 8, 5, 0 }, { 12, 0, 0 }, { 13, 0, 0 }, { 14, 20, 0x2B22 }, { 1, 0, 0 }, { 17, 0, 0 }, +}; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Toto_0x80BA36C0/func_80BA4530.asm") +static EnTotoUnkStruct2 D_80BA50DC[] = { + { 0x2B2F, 0x2B30, 0X2B31, { 0xFF96, 0x0016, 0xFE16 } }, + { 0x2B26, 0x2B27, 0x2B28, { 0x0072, 0x0016, 0xFE3C } }, + { 0x2B29, 0x2B2A, 0x2B2B, { 0xFF67, 0x0016, 0xFE6E } }, + { 0x2B2C, 0x2B2D, 0x2B2E, { 0xFFF1, 0x0016, 0xFE74 } }, +}; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Toto_0x80BA36C0/func_80BA46D8.asm") +static Vec3s D_80BA510C[] = { + { 0xFF46, 0xFFF8, 0xFF40 }, + { 0xFF21, 0xFFFD, 0xFF04 }, + { 0xFF64, 0x0016, 0xFE7E }, +}; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Toto_0x80BA36C0/func_80BA4740.asm") +static u16 D_80BA5120[] = { 67, 68, 69, 70 }; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Toto_0x80BA36C0/func_80BA47E0.asm") +static u8 D_80BA5128[] = { 8, 4, 2, 1 }; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Toto_0x80BA36C0/func_80BA49A4.asm") +static EnTotoUnkFunc D_80BA512C[] = { + func_80BA3F2C, func_80BA3ED4, func_80BA3F2C, func_80BA3F2C, func_80BA3F2C, func_80BA3ED4, + func_80BA42BC, func_80BA3ED4, func_80BA44A0, func_80BA3FB0, func_80BA402C, func_80BA46D8, + func_80BA47E0, func_80BA49A4, func_80BA3FB0, func_80BA402C, func_80BA3F2C, func_80BA3EC0, +}; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Toto_0x80BA36C0/func_80BA4A00.asm") +static EnTotoUnkFunc D_80BA5174[] = { + func_80BA40D4, func_80BA4128, func_80BA415C, func_80BA3EE8, func_80BA3EE8, func_80BA407C, + func_80BA43F4, func_80BA445C, func_80BA4530, func_80BA4204, func_80BA407C, func_80BA4740, + func_80BA407C, func_80BA4A00, func_80BA3FCC, func_80BA407C, func_80BA4B24, +}; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Toto_0x80BA36C0/func_80BA4B24.asm") +static EnTotoActionFunc D_80BA51B8[] = { + func_80BA39C8, + func_80BA3CC4, + func_80BA3DBC, +}; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Toto_0x80BA36C0/func_80BA4C0C.asm") +void func_80BA36C0(EnToto* this, GlobalContext* globalCtx, s32 index) { + this->unk2B7 = 0; + this->actionFuncIndex = index; + D_80BA501C[this->actionFuncIndex](this, globalCtx); +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Toto_0x80BA36C0/func_80BA4C44.asm") +void EnToto_Init(Actor* thisx, GlobalContext* globalCtx) { + EnToto* this = THIS; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Toto_0x80BA36C0/func_80BA4CB4.asm") + Actor_ProcessInitChain(&this->actor, sInitChain); + Collider_InitAndSetCylinder(globalCtx, &this->collider, &this->actor, &sCylinderInit); + if (globalCtx->sceneNum == 0x15 && (gSaveContext.time >= 0x4000 && gSaveContext.time < 0xE555)) { + Actor_MarkForDeath(&this->actor); + return; + } + ActorShape_Init(&this->actor.shape, 0.0f, func_800B3FC0, 30.0f); + this->actor.bgCheckFlags |= 0x400; + SkelAnime_InitSV(globalCtx, &this->skelAnime, &D_0600A978, globalCtx->sceneNum == 0x12 ? &D_06003AA8 : &D_0600C880, + this->limbDrawTbl, this->transitionDrawTbl, 18); + func_80BA36C0(this, globalCtx, 0); + this->actor.shape.rot.x = 0; +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Toto_0x80BA36C0/EnToto_Update.asm") +void EnToto_Destroy(Actor* thisx, GlobalContext* globalCtx) { + EnToto* this = THIS; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Toto_0x80BA36C0/EnToto_Draw.asm") + Collider_DestroyCylinder(globalCtx, &this->collider); +} + +void func_80BA383C(EnToto* this, GlobalContext* globalCtx) { + if (SkelAnime_FrameUpdateMatrix(&this->skelAnime) && this->actionFuncIndex == 1 && + this->skelAnime.animCurrentSeg != &D_06000C80) { + if (globalCtx->msgCtx.unk11F04 != 0x2A98 && globalCtx->msgCtx.unk11F04 != 0x2A99) { + if (this->unk2B4 & 1 || Rand_ZeroOne() > 0.5f) { + this->unk2B4 = (this->unk2B4 + 1) & 3; + } + } + SkelAnime_ChangeAnimDefaultStop(&this->skelAnime, D_80BA5078[this->unk2B4]); + } + func_800BBB74(&this->unk260, 0x14, 0x50, 3); +} + +void func_80BA3930(EnToto* this, GlobalContext* globalCtx) { + AnimationHeader* animationHeader = &D_0600C880; + + if (globalCtx->sceneNum == 0x12) { + animationHeader = &D_06003AA8; + } + SkelAnime_ChangeAnimTransitionRepeat(&this->skelAnime, animationHeader, -4.0f); +} + +s32 func_80BA397C(EnToto* this, s16 arg1) { + s16 diff; + + diff = this->actor.yawTowardsPlayer - this->actor.home.rot.y; + if (ABS_ALT(diff) < arg1) { + return 1; + } + return 0; +} + +void func_80BA39C8(EnToto* this, GlobalContext* globalCtx) { + ActorPlayer* player = PLAYER; + + func_80BA383C(this, globalCtx); + if (func_800B84D0(&this->actor, globalCtx) != 0) { + func_80BA36C0(this, globalCtx, 1); + if (globalCtx->sceneNum != 0x12) { + Actor_SetSwitchFlag(globalCtx, this->actor.params & 0x7F); + } else if (player->unk14B == 3) { + Actor_SetSwitchFlag(globalCtx, this->actor.home.rot.x); + } + this->unk2B6 = 0; + return; + } + if ((globalCtx->sceneNum == 0x15 && !(gSaveContext.time >= 0x4000 && gSaveContext.time < 0xED02)) || + (globalCtx->sceneNum != 0x15 && func_80BA397C(this, 0x2000))) { + if (this->unk2B6 != 0) { + this->text = D_80BA5044; + this->actor.flags |= 0x10000; + func_800B8500(&this->actor, globalCtx, 9999.9f, 9999.9f, 0); + } else { + this->actor.flags &= ~0x10000; + func_800B8614(&this->actor, globalCtx, 50.0f); + if (globalCtx->sceneNum == 0x12) { + if (player->unk14B == 3) { + if (!Flags_GetSwitch(globalCtx, this->actor.home.rot.x)) { + this->text = D_80BA5068; + } else { + this->text = D_80BA5074; + } + } else { + this->text = D_80BA5048; + } + } else if (ENTOTO_WEEK_EVENT_FLAGS) { + this->text = D_80BA502C; + } else if (!Flags_GetSwitch(globalCtx, this->actor.params & 0x7F)) { + this->text = D_80BA5034; + } else { + this->text = D_80BA5038; + } + } + this->actor.textId = this->text->textId; + } +} + +void func_80BA3BFC(EnToto* this, GlobalContext* globalCtx) { + if (globalCtx->sceneNum == 0x12) { + SkelAnime_ChangeAnimTransitionStop(&this->skelAnime, &D_06000C80, -4.0f); + this->unk2B4 = 0; + } else { + if (this->text->unk0 == 4) { + func_80151BB4(globalCtx, 9); + } + SkelAnime_ChangeAnimTransitionRepeat(&this->skelAnime, &D_0600B3E0, -4.0f); + } +} + +void func_80BA3C88(EnToto* this) { + Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 4, 4000, 800); +} + +void func_80BA3CC4(EnToto* this, GlobalContext* globalCtx) { + func_80BA383C(this, globalCtx); + func_80BA3C88(this); + if (func_800B867C(&this->actor, globalCtx)) { + func_80BA36C0(this, globalCtx, this->text->unk1); + } else { + func_80BA4C44(this, globalCtx); + } +} + +void func_80BA3D38(EnToto* this, GlobalContext* globalCtx) { + this->cutscene = this->actor.cutscene; + this->text = ENTOTO_WEEK_EVENT_FLAGS ? D_80BA50BC : D_80BA5088; + func_80BA4C0C(this, globalCtx); + globalCtx->actorCtx.unk5 |= 0x20; + this->unk260 = 0; +} + +void func_80BA3DBC(EnToto* this, GlobalContext* globalCtx) { + ActorPlayer* player; + + func_80BA383C(this, globalCtx); + if (this->unk2B7 == 0) { + if (!func_80BA4C44(this, globalCtx)) { + return; + } + if (this->text->unk1 != 0 && ENTOTO_WEEK_EVENT_FLAGS) { + this->unk2B7 = 1; + return; + } + } else { + player = PLAYER; + if (player->stateFlags1 & 0x400 && player->unkAE7 != 0) { + func_80151BB4(globalCtx, 48); + func_80151BB4(globalCtx, 9); + func_80151BB4(globalCtx, 10); + } else { + return; + } + } + func_80BA36C0(this, globalCtx, 0); + ActorCutscene_Stop(this->cutscene); + globalCtx->actorCtx.unk5 &= ~0x20; +} + +s32 func_80BA3EC0(EnToto* this, GlobalContext* globalCtx) { + return 1; +} + +s32 func_80BA3ED4(EnToto* this, GlobalContext* globalCtx) { + return 0; +} + +s32 func_80BA3EE8(EnToto* this, GlobalContext* globalCtx) { + if (this->text->unk1 == 2) { + func_800B7298(globalCtx, 0, 7); + } + return 0; +} + +s32 func_80BA3F2C(EnToto* this, GlobalContext* globalCtx) { + if (this->text->textId != 0) { + func_80151938(globalCtx, this->text->textId); + } else { + func_801477B4(globalCtx); + func_80BA3EE8(this, globalCtx); + } + if (this->text->unk0 == 4) { + func_80151BB4(globalCtx, 9); + } + return 0; +} + +s32 func_80BA3FB0(EnToto* this, GlobalContext* globalCtx) { + this->unk2B1 = this->text->unk1; + return 0; +} + +s32 func_80BA3FCC(EnToto* this, GlobalContext* globalCtx) { + if (DECR(this->unk2B1) == 0) { + func_801518B0(globalCtx, this->text->textId, NULL); + return 1; + } + return 0; +} + +s32 func_80BA402C(EnToto* this, GlobalContext* globalCtx) { + s16 prevCutscene = this->cutscene; + + this->cutscene = ActorCutscene_GetAdditionalCutscene(this->cutscene); + ActorCutscene_SetIntentToPlay(this->cutscene); + ActorCutscene_Stop(prevCutscene); + return 0; +} + +s32 func_80BA407C(EnToto* this, GlobalContext* globalCtx) { + if (ActorCutscene_GetCanPlayNext(this->cutscene)) { + ActorCutscene_StartAndSetUnkLinkFields(this->cutscene, &PLAYER->base); + return 1; + } + ActorCutscene_SetIntentToPlay(this->cutscene); + return 0; +} + +s32 func_80BA40D4(EnToto* this, GlobalContext* globalCtx) { + if (func_80152498(&globalCtx->msgCtx) == 5 && func_80147624(globalCtx)) { + return 1; + } + return 0; +} + +s32 func_80BA4128(EnToto* this, GlobalContext* globalCtx) { + if (func_80152498(&globalCtx->msgCtx) == 2) { + return 1; + } + return 0; +} + +s32 func_80BA415C(EnToto* this, GlobalContext* globalCtx) { + if (func_80152498(&globalCtx->msgCtx) == 4 && func_80147624(globalCtx)) { + if (globalCtx->msgCtx.choiceIndex != 0) { + func_8019F230(); + } else { + func_8019F208(); + } + return (globalCtx->msgCtx.choiceIndex != 0 ? 0 : this->text->unk1) + 1; // Possible msg MACRO + } + return 0; +} + +s32 func_80BA4204(EnToto* this, GlobalContext* globalCtx) { + EnTotoUnkStruct2* temp_v1_2; + + if (DECR(this->unk2B1) == 0) { + if (!ENTOTO_WEEK_EVENT_FLAGS) { + temp_v1_2 = &D_80BA50DC[gSaveContext.playerForm - 1]; + func_801518B0(globalCtx, (this->text->unk0 == 6 ? temp_v1_2->unk0 : temp_v1_2->unk4) & 0xFFFF, NULL); + } + return 1; + } + return 0; +} + +s32 func_80BA42BC(EnToto* this, GlobalContext* globalCtx) { + ActorPlayer* player = PLAYER; + u32 phi_s0 = 0; + Vec3s* end = &D_80BA510C[3]; + + func_80BA3FB0(this, globalCtx); + func_800B7298(globalCtx, 0, 6); + if (player->base.world.pos.z > -310.0f) { + if ((player->base.world.pos.x > -150.0f) || (player->base.world.pos.z > -172.0f)) { + phi_s0 = 3; + } else { + if (player->base.world.pos.z > -232.0f) { + phi_s0 = 2; + } else { + phi_s0 = 1; + } + } + } + func_80122744(globalCtx, this->unk2BC, phi_s0, end - phi_s0); + this->unk2C4 = Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_DM_CHAR07, 0.0f, 0.0f, 0.0f, 0, 0, 0, 0xF02); + return 0; +} + +s32 func_80BA43F4(EnToto* this, GlobalContext* globalCtx) { + func_80BA3C88(this); + if (func_80122760(globalCtx, this->unk2BC, 60.0f)) { + func_800B7298(globalCtx, 0, 0x13); + return func_80BA4204(this, globalCtx); + } + return 0; +} + +s32 func_80BA445C(EnToto* this, GlobalContext* globalCtx) { + if (func_80BA4128(this, globalCtx)) { + func_800B7298(globalCtx, 0, 6); + return 1; + } + return 0; +} + +s32 func_80BA44A0(EnToto* this, GlobalContext* globalCtx) { + ActorCutscene_Stop(this->cutscene); + this->unk2B1 = 0; + return 0; +} + +s32 func_80BA44D4(EnTotoUnkStruct2* arg0, ActorPlayer* player) { + Vec3f unk6; + + Math_Vec3s_ToVec3f(&unk6, &arg0->unk6); + if (Math_Vec3f_DistXZ(&player->base.world.pos, &unk6) < 10.0f) { + return 1; + } + return 0; +} + +s32 func_80BA4530(EnToto* this, GlobalContext* globalCtx) { + ActorPlayer* player = PLAYER; + EnTotoUnkStruct2* temp_s0; + s32 i; + u16 tmp; + + func_80BA3C88(this); + if (player->base.world.pos.z > -270.0f) { + if (this->unk2C4 != NULL) { + Actor_MarkForDeath(this->unk2C4); + } + this->unk2B6 = 1; + return this->text->unk1; + } + if (player->base.bgCheckFlags & 1) { + temp_s0 = &D_80BA50DC[gSaveContext.playerForm - 1]; + if (func_80BA44D4(temp_s0, player)) { + Math_Vec3s_ToVec3f(&player->base.world.pos, &temp_s0->unk6); + player->base.shape.rot.y = 0; + player->unkAD4 = 0; + return func_80BA407C(this, globalCtx); + } + if (!ENTOTO_WEEK_EVENT_FLAGS) { + for (i = 0; i < 4; i++) { + if (func_80BA44D4(&D_80BA50DC[i], player)) { + if (this->unk2B1 < 10) { + this->unk2B1++; + if (this->unk2B1 >= 10) { + tmp = gSaveContext.playerForm; // Needed for regalloc possible FAKE MATCH + func_801518B0(globalCtx, D_80BA50DC[tmp - 1].unk2, NULL); + } + } + return 0; + } + } + this->unk2B1 = 0; + } + } + return 0; +} + +s32 func_80BA46D8(EnToto* this, GlobalContext* globalCtx) { + func_800B7298(globalCtx, 0, 0x44); + func_80152434(globalCtx, D_80BA5120[gSaveContext.playerForm == 4 ? 0 : gSaveContext.playerForm]); + return 0; +} + +s32 func_80BA4740(EnToto* this, GlobalContext* globalCtx) { + if (globalCtx->msgCtx.unk1202A == 4) { + if (gSaveContext.playerForm == 4) { + gSaveContext.weekEventReg[56] |= 0x10; + } + if (gSaveContext.playerForm == 3) { + gSaveContext.weekEventReg[56] |= 0x20; + } + if (gSaveContext.playerForm == 2) { + gSaveContext.weekEventReg[56] |= 0x40; + } + if (gSaveContext.playerForm == 1) { + gSaveContext.weekEventReg[56] |= 0x80; + } + return 1; + } + return 0; +} + +s32 func_80BA47E0(EnToto* this, GlobalContext* globalCtx) { + Vec3f spawnPos; + s32 i; + + this->unk2B3 = 0; + if (gSaveContext.weekEventReg[56] & 0x10) { + this->unk2B3 += 1; + } + if (gSaveContext.weekEventReg[56] & 0x20) { + this->unk2B3 += 2; + } + if (gSaveContext.weekEventReg[56] & 0x40) { + this->unk2B3 += 4; + } + if (gSaveContext.weekEventReg[56] & 0x80) { + this->unk2B3 += 8; + } + for (i = 0; i < 4; i++) { + if (gSaveContext.playerForm != (i + 1) && (D_80BA5128[i] & this->unk2B3)) { + Math_Vec3s_ToVec3f(&spawnPos, &D_80BA50DC[i].unk6); + Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_PLAYER, spawnPos.x, spawnPos.y, spawnPos.z, i + 2, 0, 0, + -1); + } + } + func_80BA402C(this, globalCtx); + if (ENTOTO_WEEK_EVENT_FLAGS) { + func_80BA402C(this, globalCtx); + } + return 0; +} + +s32 func_80BA49A4(EnToto* this, GlobalContext* globalCtx) { + func_800B7298(globalCtx, 0, 0x44); + func_801A31EC(0x54, 4, this->unk2B3 ^ 0xF); + this->unk2B1 = 4; + return 0; +} + +s32 func_80BA4A00(EnToto* this, GlobalContext* globalCtx) { + Actor* actor; + + if (DECR(this->unk2B1) == 0) { + if (!func_801A2DE0(0x54)) { + actor = (Actor*)PLAYER; // Needed for regalloc, possible FAKE MATCH + actor = actor->next; + while (actor != NULL) { + Actor_MarkForDeath(actor); + actor = actor->next; + } + if (this->unk2C4 != NULL) { + Actor_MarkForDeath(this->unk2C4); + } + func_800B7298(globalCtx, 0, 0x45); + if (this->unk2B3 == 0xF) { + if (CURRENT_DAY == 1) { + gSaveContext.weekEventReg[50] |= 1; + } else { + gSaveContext.weekEventReg[51] |= 0x80; + } + } else { + func_80BA402C(this, globalCtx); + } + return 1; + } + } + return 0; +} + +s32 func_80BA4B24(EnToto* this, GlobalContext* globalCtx) { + ActorPlayer* player; + + if (func_80BA40D4(this, globalCtx)) { + player = PLAYER; + SkelAnime_ChangeAnimTransitionStop(&this->skelAnime, &D_060028B8, -4.0f); + if (player->unk14B == 2) { + if (!Flags_GetSwitch(globalCtx, this->actor.params & 0x7F)) { + Actor_SetSwitchFlag(globalCtx, this->actor.params & 0x7F); + return 1; + } else { + return 3; + } + } else { + if (!Flags_GetSwitch(globalCtx, (this->actor.params >> 7) & 0x7F)) { + Actor_SetSwitchFlag(globalCtx, (this->actor.params >> 7) & 0x7F); + return 4; + } else { + return 7; + } + } + } + return 0; +} + +s32 func_80BA4C0C(EnToto* this, GlobalContext* globalCtx) { + return D_80BA512C[this->text->unk0](this, globalCtx); +} + +s32 func_80BA4C44(EnToto* this, GlobalContext* globalCtx) { + s32 ret; + + ret = D_80BA5174[this->text->unk0](this, globalCtx); + if (ret != 0) { + this->text += ret; + return func_80BA4C0C(this, globalCtx); + } + return 0; +} + +void func_80BA4CB4(EnToto* this, GlobalContext* globalCtx) { + CsCmdActorAction* action; + + action = globalCtx->csCtx.actorActions[func_800EE200(globalCtx, 0x20D)]; + if (this->unk2B5 != action->unk0) { + this->unk2B5 = action->unk0; + if (this->unk2B5 != 4) { + if (this->unk2B5 == 3) { + SkelAnime_ChangeAnimTransitionStop(&this->skelAnime, &D_06001DF0, -4.0f); + } else { + SkelAnime_ChangeAnimDefaultStop(&this->skelAnime, this->unk2B5 == 1 ? &D_060016A4 : &D_060022C8); + if (this->unk2B5 == 2 && this->unk2B3 != 0xF) { + func_80151BB4(globalCtx, 9); + func_80151BB4(globalCtx, 10); + } + } + } + } + Math_ScaledStepToS(&this->actor.shape.rot.y, this->actor.home.rot.y, 0x320); + if (SkelAnime_FrameUpdateMatrix(&this->skelAnime)) { + if (this->unk2B5 != 3) { + SkelAnime_ChangeAnimDefaultRepeat(&this->skelAnime, this->unk2B5 == 1 ? &D_0600C880 : &D_06001324); + } + } + if (this->unk2B5 == 4 && !Actor_HasParent(&this->actor, globalCtx)) { + func_800B8A1C(&this->actor, globalCtx, 0x83, 9999.9f, 9999.9f); + } +} + +void EnToto_Update(Actor* thisx, GlobalContext* globalCtx) { + EnToto* this = THIS; + s32 pad; + + if (func_800EE29C(globalCtx, 0x20D)) { + func_80BA4CB4(this, globalCtx); + } else { + D_80BA51B8[this->actionFuncIndex](this, globalCtx); + } + + Collider_ResetCylinderAC(globalCtx, &this->collider.base); + Collider_UpdateCylinder(&this->actor, &this->collider); + CollisionCheck_SetOC(globalCtx, &globalCtx->colCheckCtx, &this->collider.base); + CollisionCheck_SetAC(globalCtx, &globalCtx->colCheckCtx, &this->collider.base); + Actor_SetHeight(&this->actor, 40.0f); +} + +void EnToto_Draw(Actor* thisx, GlobalContext* globalCtx) { + void* sp4C[] = { &D_06008AE8, &D_0600A068, &D_0600A468 }; + EnToto* this = THIS; + s32 pad; + + OPEN_DISPS(globalCtx->state.gfxCtx); + + func_8012C28C(globalCtx->state.gfxCtx); + gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sp4C[this->unk260])); + Scene_SetRenderModeXlu(globalCtx, 0, 1); + SkelAnime_DrawSV(globalCtx, this->skelAnime.skeleton, this->skelAnime.limbDrawTbl, this->skelAnime.dListCount, NULL, + NULL, &this->actor); + + CLOSE_DISPS(globalCtx->state.gfxCtx); +} diff --git a/src/overlays/actors/ovl_En_Toto/z_en_toto.h b/src/overlays/actors/ovl_En_Toto/z_en_toto.h index faa91cd792..04a76da1d6 100644 --- a/src/overlays/actors/ovl_En_Toto/z_en_toto.h +++ b/src/overlays/actors/ovl_En_Toto/z_en_toto.h @@ -5,9 +5,41 @@ struct EnToto; +typedef void (*EnTotoActionFunc)(struct EnToto*, GlobalContext*); +typedef s32 (*EnTotoUnkFunc)(struct EnToto*, GlobalContext*); + +typedef struct EnTotoText { + /* 0x0 */ u8 unk0; + /* 0x1 */ u8 unk1; + /* 0x2 */ u16 textId; +} EnTotoText; // size = 0x4 + +typedef struct EnTotoUnkStruct2 { + /* 0x0 */ u16 unk0; + /* 0x2 */ u16 unk2; + /* 0x4 */ u16 unk4; + /* 0x6 */ Vec3s unk6; +} EnTotoUnkStruct2; // size = 0xC + typedef struct EnToto { /* 0x000 */ Actor actor; - /* 0x144 */ char unk_144[0x188]; + /* 0x144 */ SkelAnime skelAnime; + /* 0x188 */ Vec3s limbDrawTbl[18]; + /* 0x1F4 */ Vec3s transitionDrawTbl[18]; + /* 0x260 */ s16 unk260; + /* 0x264 */ ColliderCylinder collider; + /* 0x2B0 */ u8 actionFuncIndex; + /* 0x2B1 */ u8 unk2B1; + /* 0x2B2 */ s8 cutscene; + /* 0x2B3 */ u8 unk2B3; + /* 0x2B4 */ u8 unk2B4; + /* 0x2B5 */ u8 unk2B5; + /* 0x2B6 */ u8 unk2B6; + /* 0x2B7 */ u8 unk2B7; + /* 0x2B8 */ EnTotoText* text; + /* 0x2BC */ char unk2BC[0x8]; // Some z_player_lib struct size 0x8 more info from func_80122744 and func_80122760 + /* 0x2C4 */ Actor* unk2C4; + /* 0x2C8 */ s32 pad2C8; } EnToto; // size = 0x2CC extern const ActorInit En_Toto_InitVars; diff --git a/tables/variables.txt b/tables/variables.txt index d763d396da..9a610c1ba1 100644 --- a/tables/variables.txt +++ b/tables/variables.txt @@ -17245,10 +17245,8 @@ 0x80BA5078:("D_80BA5078","UNK_TYPE1","",0x1), 0x80BA5088:("D_80BA5088","UNK_TYPE1","",0x1), 0x80BA50BC:("D_80BA50BC","UNK_TYPE1","",0x1), - 0x80BA50D2:("D_80BA50D2","UNK_TYPE2","",0x2), 0x80BA50DC:("D_80BA50DC","UNK_TYPE1","",0x1), 0x80BA510C:("D_80BA510C","UNK_TYPE1","",0x1), - 0x80BA511E:("D_80BA511E","UNK_TYPE1","",0x1), 0x80BA5120:("D_80BA5120","UNK_TYPE2","",0x2), 0x80BA5128:("D_80BA5128","UNK_TYPE1","",0x1), 0x80BA512C:("D_80BA512C","UNK_PTR","",0x4),