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
This commit is contained in:
Derek Hensley 2021-06-02 15:33:16 -07:00 committed by GitHub
parent f0bad10668
commit fb84cabd4a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 763 additions and 58 deletions

View File

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

View File

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

View File

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

View File

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

View File

@ -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);
}

View File

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

View File

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