diff --git a/include/functions.h b/include/functions.h index 4a9235e787..0fae8867d3 100644 --- a/include/functions.h +++ b/include/functions.h @@ -924,7 +924,7 @@ void func_800BE03C(GlobalContext* globalCtx, Gfx* dl); // void func_800BE0B8(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5); // void func_800BE184(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE2 param_5, UNK_TYPE2 param_6); u8 func_800BE22C(Actor* actor); -// void func_800BE258(void); +void func_800BE258(Actor* actor, UNK_PTR arg1); // void func_800BE2B8(void); // void func_800BE33C(void); // void func_800BE3D0(void); diff --git a/include/macros.h b/include/macros.h index 15fe7de0c0..a4a7a7fefe 100644 --- a/include/macros.h +++ b/include/macros.h @@ -21,7 +21,7 @@ #define SET_NEXT_GAMESTATE(curState, newInit, newStruct) \ (curState)->nextGameStateInit = (GameStateFunc)newInit; \ - (curState)->nextGameStateSize = sizeof(newStruct); + (curState)->nextGameStateSize = sizeof(newStruct) #define PLAYER ((Player*)globalCtx->actorCtx.actorList[ACTORCAT_PLAYER].first) @@ -72,7 +72,7 @@ extern GraphicsContext* __gfxCtx; #define OPEN_DISPS(gfxCtx) \ { \ GraphicsContext* __gfxCtx = gfxCtx; \ - s32 __dispPad; + s32 __dispPad #define CLOSE_DISPS(gfxCtx) \ } \ diff --git a/include/z64item.h b/include/z64item.h index a049b6635b..9a7330adc6 100644 --- a/include/z64item.h +++ b/include/z64item.h @@ -33,6 +33,7 @@ typedef enum { /* 0x38 */ ITEM_MASK_ALL_NIGHT = 0x38, /* 0x3A */ ITEM_MASK_KEATON = 0x3A, /* 0x3B */ ITEM_MASK_GARO, + /* 0x3C */ ITEM_MASK_ROMANIS, /* 0x46 */ ITEM_MASK_BREMEN = 0x46, /* 0x4D */ ITEM_SWORD_KOKIRI = 0x4D, /* 0x4E */ ITEM_SWORD_RAZOR, @@ -101,6 +102,7 @@ typedef enum { /* 0x60 */ GI_MILK_BOTTLE = 0x60, /* 0x7E */ GI_MASK_ALL_NIGHT = 0x7E, /* 0x80 */ GI_MASK_KEATON = 0x80, + /* 0x82 */ GI_MASK_ROMANIS = 0x82, /* 0x8C */ GI_MASK_BREMEN = 0x8C, /* 0x9B */ GI_SWORD_GREAT_FAIRY = 0x9B, /* 0x9C */ GI_SWORD_KOKIRI, diff --git a/linker_scripts/code_script.txt b/linker_scripts/code_script.txt index b4e9475140..f422280565 100644 --- a/linker_scripts/code_script.txt +++ b/linker_scripts/code_script.txt @@ -7356,9 +7356,9 @@ SECTIONS ovl_En_Ma_Yto : AT(RomLocation) { build/src/overlays/actors/ovl_En_Ma_Yto/z_en_ma_yto.o(.text) - build/asm/overlays/ovl_En_Ma_Yto_data.o(.data) + build/src/overlays/actors/ovl_En_Ma_Yto/z_en_ma_yto.o(.data) build/src/overlays/actors/ovl_En_Ma_Yto/z_en_ma_yto.o(.rodata) - build/asm/overlays/ovl_En_Ma_Yto_rodata.o(.rodata) + build/src/overlays/actors/ovl_En_Ma_Yto/z_en_ma_yto_overlay.o(.ovl) } SegmentEnd = .; SegmentSize = SegmentEnd - SegmentStart; diff --git a/linker_scripts/object_script.txt b/linker_scripts/object_script.txt index 0500d1cae3..b7a90c95e6 100644 --- a/linker_scripts/object_script.txt +++ b/linker_scripts/object_script.txt @@ -448,6 +448,43 @@ D_06016720 = 0x06016720; /* z_en_jc_mato */ D_06000390 = 0x06000390; +/* z_en_ma_yto */ +D_06007E28 = 0x06007E28; +D_06003D54 = 0x06003D54; +D_0600A174 = 0x0600A174; +D_060070EC = 0x060070EC; +D_06003D54 = 0x06003D54; +D_06015C28 = 0x06015C28; +D_06005430 = 0x06005430; +D_0600AF7C = 0x0600AF7C; +D_06014AD8 = 0x06014AD8; +D_06014ED8 = 0x06014ED8; +D_060152D8 = 0x060152D8; +D_060156D8 = 0x060156D8; +D_06001FD0 = 0x06001FD0; +D_06014AD8 = 0x06014AD8; +D_06014ED8 = 0x06014ED8; +D_060152D8 = 0x060152D8; +D_060156D8 = 0x060156D8; +D_06011AD8 = 0x06011AD8; +D_060122D8 = 0x060122D8; +D_06012AD8 = 0x06012AD8; +D_060132D8 = 0x060132D8; +D_06013AD8 = 0x06013AD8; +D_060142D8 = 0x060142D8; +D_0600A174 = 0x0600A174; +D_0600AF7C = 0x0600AF7C; +D_06000CC0 = 0x06000CC0; +D_06016720 = 0x06016720; +D_06005314 = 0x06005314; +D_060093E8 = 0x060093E8; +D_06007E28 = 0x06007E28; +D_060070EC = 0x060070EC; +D_06003D54 = 0x06003D54; +D_06001FD0 = 0x06001FD0; +D_060030B4 = 0x060030B4; +D_06004370 = 0x06004370; + /* z_en_ma_yts */ D_06009E58 = 0x06009E58; D_06007D98 = 0x06007D98; @@ -486,6 +523,32 @@ D_06010FC8 = 0x06010FC8; D_060117C8 = 0x060117C8; D_06011FC8 = 0x06011FC8; +/* z_en_ma4 */ +D_060003B0 = 0x060003B0; +D_06007328 = 0x06007328; +D_06002A8C = 0x06002A8C; +D_06015B7C = 0x06015B7C; +D_06013928 = 0x06013928; +D_0600FFC8 = 0x0600FFC8; +D_060107C8 = 0x060107C8; +D_06010FC8 = 0x06010FC8; +D_060117C8 = 0x060117C8; +D_06011FC8 = 0x06011FC8; +D_060127C8 = 0x060127C8; +D_06012BC8 = 0x06012BC8; +D_06012FC8 = 0x06012FC8; +D_060133C8 = 0x060133C8; +D_06009E58 = 0x06009E58; +D_06002A8C = 0x06002A8C; +D_06018948 = 0x06018948; +D_0601B76C = 0x0601B76C; +D_06007328 = 0x06007328; +D_06014088 = 0x06014088; +D_06015B7C = 0x06015B7C; +D_06007D98 = 0x06007D98; +D_0600852C = 0x0600852C; +D_06008F6C = 0x06008F6C; + /* z_en_minifrog */ D_060007BC = 0x060007BC; D_06001534 = 0x06001534; @@ -549,32 +612,6 @@ D_04048DF0 = 0x04048DF0; D_04057B10 = 0x04057B10; D_04089070 = 0x04089070; -/* z_en_ma4 */ -D_060003B0 = 0x060003B0; -D_06007328 = 0x06007328; -D_06002A8C = 0x06002A8C; -D_06015B7C = 0x06015B7C; -D_06013928 = 0x06013928; -D_0600FFC8 = 0x0600FFC8; -D_060107C8 = 0x060107C8; -D_06010FC8 = 0x06010FC8; -D_060117C8 = 0x060117C8; -D_06011FC8 = 0x06011FC8; -D_060127C8 = 0x060127C8; -D_06012BC8 = 0x06012BC8; -D_06012FC8 = 0x06012FC8; -D_060133C8 = 0x060133C8; -D_06009E58 = 0x06009E58; -D_06002A8C = 0x06002A8C; -D_06018948 = 0x06018948; -D_0601B76C = 0x0601B76C; -D_06007328 = 0x06007328; -D_06014088 = 0x06014088; -D_06015B7C = 0x06015B7C; -D_06007D98 = 0x06007D98; -D_0600852C = 0x0600852C; -D_06008F6C = 0x06008F6C; - /* z_en_toto */ D_06000C80 = 0x06000C80; D_06001324 = 0x06001324; diff --git a/src/overlays/actors/ovl_En_Ginko_Man/z_en_ginko_man.c b/src/overlays/actors/ovl_En_Ginko_Man/z_en_ginko_man.c index 93ba8a7802..f370600a2b 100644 --- a/src/overlays/actors/ovl_En_Ginko_Man/z_en_ginko_man.c +++ b/src/overlays/actors/ovl_En_Ginko_Man/z_en_ginko_man.c @@ -36,46 +36,11 @@ const ActorInit En_Ginko_Man_InitVars = { }; ActorAnimationEntry animations[] = { - { - object_ginko_floorsmacking_anim, - 1.0f, - 0.0f, - 0.0f, - 0, - -4.0f, - }, - { - object_ginko_sitting_anim, - 1.0f, - 0.0f, - 0.0f, - 0, - -4.0f, - }, - { - object_ginko_stamp_reach_anim, - 1.0f, - 0.0f, - 0.0f, - 2, - -4.0f, - }, - { - object_ginko_advertising_anim, - 1.0f, - 0.0f, - 0.0f, - 0, - -4.0f, - }, // looking around for customers - { - object_ginko_amazed_anim, - 1.0f, - 0.0f, - 0.0f, - 0, - -4.0f, - }, + { object_ginko_floorsmacking_anim, 1.0f, 0.0f, 0.0f, 0, -4.0f }, + { object_ginko_sitting_anim, 1.0f, 0.0f, 0.0f, 0, -4.0f }, + { object_ginko_stamp_reach_anim, 1.0f, 0.0f, 0.0f, 2, -4.0f }, + { object_ginko_advertising_anim, 1.0f, 0.0f, 0.0f, 0, -4.0f }, // looking around for customers + { object_ginko_amazed_anim, 1.0f, 0.0f, 0.0f, 0, -4.0f }, }; void EnGinkoMan_Init(Actor* thisx, GlobalContext* globalCtx) { diff --git a/src/overlays/actors/ovl_En_Ma_Yto/z_en_ma_yto.c b/src/overlays/actors/ovl_En_Ma_Yto/z_en_ma_yto.c index 652bba2d6c..04c1e060fc 100644 --- a/src/overlays/actors/ovl_En_Ma_Yto/z_en_ma_yto.c +++ b/src/overlays/actors/ovl_En_Ma_Yto/z_en_ma_yto.c @@ -1,3 +1,9 @@ +/* + * File: z_en_ma_yto.c + * Overlay: ovl_En_Ma_Yto + * Description: Cremia + */ + #include "z_en_ma_yto.h" #define FLAGS 0x02100009 @@ -9,7 +15,63 @@ void EnMaYto_Destroy(Actor* thisx, GlobalContext* globalCtx); void EnMaYto_Update(Actor* thisx, GlobalContext* globalCtx); void EnMaYto_Draw(Actor* thisx, GlobalContext* globalCtx); -/* +s32 EnMaYto_CheckValidSpawn(EnMaYto* this, GlobalContext* globalCtx); +void EnMaYto_InitAnimation(EnMaYto* this, GlobalContext* globalCtx); +void EnMaYto_ChooseAction(EnMaYto* this, GlobalContext* globalCtx); +s32 EnMaYto_TryFindRomani(EnMaYto* this, GlobalContext* globalCtx); +void EnMaYto_SetupKeepLookingForRomani(EnMaYto* this); +void EnMaYto_KeepLookingForRomani(EnMaYto* this, GlobalContext* globalCtx); + +void EnMaYto_SetupDefaultWait(EnMaYto* this); +void EnMaYto_DefaultWait(EnMaYto* this, GlobalContext* globalCtx); +void EnMaYto_SetupDefaultDialogueHandler(EnMaYto* this); +void EnMaYto_DefaultDialogueHandler(EnMaYto* this, GlobalContext* globalCtx); +void EnMaYto_DefaultHandlePlayerChoice(EnMaYto* this, GlobalContext* globalCtx); +void EnMaYto_DefaultChooseNextDialogue(EnMaYto* this, GlobalContext* globalCtx); +void EnMaYto_SetupDinnerWait(EnMaYto* this); +void EnMaYto_DinnerWait(EnMaYto* this, GlobalContext* globalCtx); +void EnMaYto_SetupDinnerDialogueHandler(EnMaYto* this); +void EnMaYto_DinnerDialogueHandler(EnMaYto* this, GlobalContext* globalCtx); +void EnMaYto_DinnerHandlePlayerChoice(EnMaYto* this, GlobalContext* globalCtx); +void EnMaYto_DinnerChooseNextDialogue(EnMaYto* this, GlobalContext* globalCtx); +void EnMaYto_SetupBarnWait(EnMaYto* this); +void EnMaYto_BarnWait(EnMaYto* this, GlobalContext* globalCtx); +void EnMaYto_SetupBarnDialogueHandler(EnMaYto* this); +void EnMaYto_BarnDialogueHandler(EnMaYto* this, GlobalContext* globalCtx); +void EnMaYto_BarnChooseNextDialogue(EnMaYto* this, GlobalContext* globalCtx); +void EnMaYto_SetupAfterMilkRunInit(EnMaYto* this); +void EnMaYto_AfterMilkRunInit(EnMaYto* this, GlobalContext* globalCtx); +void EnMaYto_SetupAfterMilkRunDialogueHandler(EnMaYto* this); +void EnMaYto_AfterMilkRunDialogueHandler(EnMaYto* this, GlobalContext* globalCtx); + +void EnMaYto_AfterMilkRunChooseNextDialogue(EnMaYto* this, GlobalContext* globalCtx); +void EnMaYto_SetupPostMilkRunGiveReward(EnMaYto* this); +void EnMaYto_PostMilkRunGiveReward(EnMaYto* this, GlobalContext* globalCtx); +void EnMaYto_SetupPostMilkRunExplainReward(EnMaYto* this); +void EnMaYto_PostMilkRunExplainReward(EnMaYto* this, GlobalContext* globalCtx); +void EnMaYto_SetupBeginWarmFuzzyFeelingCs(EnMaYto* this); +void EnMaYto_BeginWarmFuzzyFeelingCs(EnMaYto* this, GlobalContext* globalCtx); +void EnMaYto_SetupWarmFuzzyFeelingCs(EnMaYto* this); + +void EnMaYto_WarmFuzzyFeelingCs(EnMaYto* this, GlobalContext* globalCtx); +void EnMaYto_SetupPostMilkRunWaitDialogueEnd(EnMaYto* this); +void EnMaYto_PostMilkRunWaitDialogueEnd(EnMaYto* this, GlobalContext* globalCtx); +void EnMaYto_SetupPostMilkRunEnd(EnMaYto* this); +void EnMaYto_PostMilkRunEnd(EnMaYto* this, GlobalContext* globalCtx); +void EnMaYto_DefaultStartDialogue(EnMaYto* this, GlobalContext* globalCtx); +void EnMaYto_DinnerStartDialogue(EnMaYto* this, GlobalContext* globalCtx); +void EnMaYto_BarnStartDialogue(EnMaYto* this, GlobalContext* globalCtx); +void EnMaYto_ChangeAnim(EnMaYto* this, s32 index); +void EnMaYto_UpdateEyes(EnMaYto* this); +void func_80B90E50(EnMaYto* this, s16); +void EnMaYto_SetRomaniFaceExpression(EnMaYto* this, s16 overrideEyeTexIndex, s16 mouthTexIndex); +void EnMaYto_SetFaceExpression(EnMaYto* this, s16 overrideEyeTexIndex, s16 mouthIndex); +void EnMaYto_InitFaceExpression(EnMaYto* this); +s32 EnMaYto_HasSpokeToPlayerToday(); + +s32 EnMaYto_HasSpokeToPlayer(void); +void EnMaYto_SetTalkedFlag(void); + const ActorInit En_Ma_Yto_InitVars = { ACTOR_EN_MA_YTO, ACTORCAT_NPC, @@ -21,126 +83,1424 @@ const ActorInit En_Ma_Yto_InitVars = { (ActorFunc)EnMaYto_Update, (ActorFunc)EnMaYto_Draw, }; -*/ -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Ma_Yto_0x80B8E520/EnMaYto_Init.asm") +static ColliderCylinderInit sCylinderInit = { + { + COLTYPE_NONE, + AT_NONE, + AC_NONE, + OC1_ON | OC1_TYPE_ALL, + OC2_TYPE_2, + COLSHAPE_CYLINDER, + }, + { + ELEMTYPE_UNK0, + { 0x00000000, 0x00, 0x00 }, + { 0x00000000, 0x00, 0x00 }, + TOUCH_NONE | TOUCH_SFX_NORMAL, + BUMP_NONE, + OCELEM_ON, + }, + { 18, 46, 0, { 0, 0, 0 } }, +}; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Ma_Yto_0x80B8E520/func_80B8E6E0.asm") +static CollisionCheckInfoInit2 sColChkInfoInit2 = { + 0, 0, 0, 0, MASS_IMMOVABLE, +}; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Ma_Yto_0x80B8E520/func_80B8E84C.asm") +extern FlexSkeletonHeader D_06015C28; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Ma_Yto_0x80B8E520/func_80B8E938.asm") +extern AnimationHeader D_0600A174; +extern AnimationHeader D_0600AF7C; +extern AnimationHeader D_06000CC0; +extern AnimationHeader D_06016720; +extern AnimationHeader D_06005314; +extern AnimationHeader D_060093E8; +extern AnimationHeader D_06007E28; +extern AnimationHeader D_060070EC; +extern AnimationHeader D_06003D54; +extern AnimationHeader D_06001FD0; +extern AnimationHeader D_060030B4; +extern AnimationHeader D_06004370; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Ma_Yto_0x80B8E520/func_80B8EA38.asm") +extern void* D_06014AD8[]; +extern void* D_06014ED8[]; +extern void* D_060152D8[]; +extern void* D_060156D8[]; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Ma_Yto_0x80B8E520/func_80B8EABC.asm") +extern void* D_06011AD8[]; +extern void* D_060122D8[]; +extern void* D_06012AD8[]; +extern void* D_060132D8[]; +extern void* D_06013AD8[]; +extern void* D_060142D8[]; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Ma_Yto_0x80B8E520/EnMaYto_Destroy.asm") +// gCremiaWoodenBox +extern Gfx D_06005430[]; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Ma_Yto_0x80B8E520/func_80B8EBDC.asm") +static struct_80B8E1A8 sAnimationInfo[] = { + { &D_0600A174, 1.0f, 0, 0.0f }, { &D_0600A174, 1.0f, 0, -6.0f }, // + { &D_0600AF7C, 1.0f, 2, 0.0f }, { &D_0600AF7C, 1.0f, 2, -6.0f }, // + { &D_06000CC0, 1.0f, 0, 0.0f }, { &D_06000CC0, 1.0f, 0, -6.0f }, // + { &D_06016720, 1.0f, 0, 0.0f }, { &D_06016720, 1.0f, 0, -8.0f }, // + { &D_06005314, 1.0f, 0, 0.0f }, { &D_06005314, 1.0f, 0, -8.0f }, // + { &D_060093E8, 1.0f, 0, 0.0f }, { &D_060093E8, 1.0f, 0, -10.0f }, // + { &D_06007E28, 1.0f, 0, 0.0f }, { &D_06007E28, 1.0f, 0, -8.0f }, // + { &D_060070EC, 1.0f, 0, 0.0f }, { &D_060070EC, 1.0f, 0, -8.0f }, // + { &D_06003D54, 1.0f, 0, 0.0f }, { &D_06003D54, 1.0f, 0, -8.0f }, // + { &D_06001FD0, 1.0f, 0, 0.0f }, { &D_06001FD0, 1.0f, 0, -8.0f }, // + { &D_060030B4, 1.0f, 0, 0.0f }, { &D_060030B4, 1.0f, 0, -8.0f }, // + { &D_06004370, 1.0f, 0, 0.0f }, { &D_06004370, 1.0f, 0, -8.0f }, // +}; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Ma_Yto_0x80B8E520/func_80B8EBF0.asm") +static void* sMouthTextures[] = { + D_06014AD8, + D_06014ED8, + D_060152D8, + D_060156D8, +}; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Ma_Yto_0x80B8E520/func_80B8EC30.asm") +static void* sEyesTextures[] = { + D_06011AD8, D_060122D8, D_06012AD8, D_060132D8, D_06013AD8, D_060142D8, +}; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Ma_Yto_0x80B8E520/func_80B8ECAC.asm") +void EnMaYto_Init(Actor* thisx, GlobalContext* globalCtx) { + EnMaYto* this = THIS; + s32 pad; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Ma_Yto_0x80B8E520/func_80B8ED8C.asm") + this->actor.targetMode = 0; + this->unk200 = 0; + this->unk310 = 0; + this->unk320 = 0; + this->eyeTexIndex = 0; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Ma_Yto_0x80B8E520/func_80B8EDC8.asm") + if (CURRENT_DAY == 1 || (gSaveContext.weekEventReg[0x16] & 1)) { + EnMaYto_SetFaceExpression(this, 0, 1); + } else { + EnMaYto_SetFaceExpression(this, 5, 2); + } -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Ma_Yto_0x80B8E520/func_80B8EEAC.asm") + this->unk31E = 0; + this->blinkTimer = 100; + this->type = EN_MA_YTO_PARSE_TYPE(this->actor.params); + if (!EnMaYto_CheckValidSpawn(this, globalCtx)) { + Actor_MarkForDeath(&this->actor); + return; + } -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Ma_Yto_0x80B8E520/func_80B8EF4C.asm") + ActorShape_Init(&this->actor.shape, 0.0f, func_800B3FC0, 18.0f); + SkelAnime_InitSV(globalCtx, &this->skelAnime, &D_06015C28, NULL, this->limbDrawTbl, this->transitionDrawTbl, + MA2_LIMB_MAX); + EnMaYto_InitAnimation(this, globalCtx); -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Ma_Yto_0x80B8E520/func_80B8F074.asm") + Collider_InitCylinder(globalCtx, &this->collider); + Collider_SetCylinder(globalCtx, &this->collider, &this->actor, &sCylinderInit); + CollisionCheck_SetInfo2(&this->actor.colChkInfo, DamageTable_Get(0x16), &sColChkInfoInit2); + Actor_UpdateBgCheckInfo(globalCtx, &this->actor, 0.0f, 0.0f, 0.0f, 4); -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Ma_Yto_0x80B8E520/func_80B8F108.asm") + if (EnMaYto_TryFindRomani(this, globalCtx) == 1) { + EnMaYto_SetupKeepLookingForRomani(this); + } else { + EnMaYto_ChooseAction(this, globalCtx); + } +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Ma_Yto_0x80B8E520/func_80B8F254.asm") +s32 EnMaYto_CheckValidSpawn(EnMaYto* this, GlobalContext* globalCtx) { + switch (this->type) { + case MA_YTO_TYPE_DEFAULT: + if (CURRENT_DAY == 3 && !(gSaveContext.weekEventReg[0x16] & 1)) { + return false; + } + break; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Ma_Yto_0x80B8E520/func_80B8F2D8.asm") + case MA_YTO_TYPE_DINNER: + if (CURRENT_DAY != 1 && (gSaveContext.weekEventReg[0x16] & 1)) { + return false; + } + break; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Ma_Yto_0x80B8E520/func_80B8F360.asm") + case MA_YTO_TYPE_BARN: + if (gSaveContext.weekEventReg[0x16] & 1) { + if (((this->actor.params & 0x0F00) >> 8) != 0) { + return false; + } + } else if (((this->actor.params & 0x0F00) >> 8) == 0) { + return false; + } + if (gSaveContext.time >= CLOCK_TIME(20, 0) && CURRENT_DAY == 3) { + return false; + } + break; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Ma_Yto_0x80B8E520/func_80B8F400.asm") + case MA_YTO_TYPE_AFTERMILKRUN: + // if (!(ProtectedCremia) && !(gSaveContext.weekEventReg[0x34] & 2)) || (PlayedMilkMinigame)) + if ((!(gSaveContext.weekEventReg[0x34] & 1) && !(gSaveContext.weekEventReg[0x34] & 2)) || + (gSaveContext.weekEventReg[0xE] & 1)) { + return false; + } + break; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Ma_Yto_0x80B8E520/func_80B8F744.asm") + case MA_YTO_TYPE_4: + break; + } -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Ma_Yto_0x80B8E520/func_80B8F7F4.asm") + return true; +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Ma_Yto_0x80B8E520/func_80B8F918.asm") +void EnMaYto_InitAnimation(EnMaYto* this, GlobalContext* globalCtx) { + switch (this->type) { + case MA_YTO_TYPE_DEFAULT: + EnMaYto_ChangeAnim(this, 10); + break; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Ma_Yto_0x80B8E520/func_80B8F998.asm") + case MA_YTO_TYPE_DINNER: + if (CURRENT_DAY == 1) { + EnMaYto_ChangeAnim(this, 14); + } else { + EnMaYto_ChangeAnim(this, 16); + } + break; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Ma_Yto_0x80B8E520/func_80B8FA14.asm") + case MA_YTO_TYPE_BARN: + // if (AliensDefeated) + if (gSaveContext.weekEventReg[0x16] & 1) { + EnMaYto_ChangeAnim(this, 12); + } else { + EnMaYto_ChangeAnim(this, 8); + } + break; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Ma_Yto_0x80B8E520/func_80B8FE04.asm") + case MA_YTO_TYPE_AFTERMILKRUN: + EnMaYto_ChangeAnim(this, 0); + break; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Ma_Yto_0x80B8E520/func_80B8FE74.asm") + case MA_YTO_TYPE_4: + EnMaYto_ChangeAnim(this, 0); + break; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Ma_Yto_0x80B8E520/func_80B8FF80.asm") + default: + EnMaYto_ChangeAnim(this, 0); + break; + } +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Ma_Yto_0x80B8E520/func_80B8FF94.asm") +void EnMaYto_ChooseAction(EnMaYto* this, GlobalContext* globalCtx) { + switch (this->type) { + case MA_YTO_TYPE_DEFAULT: + EnMaYto_SetupDefaultWait(this); + break; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Ma_Yto_0x80B8E520/func_80B9000C.asm") + case MA_YTO_TYPE_DINNER: + this->actor.targetMode = 6; + EnMaYto_SetupDinnerWait(this); + break; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Ma_Yto_0x80B8E520/func_80B900AC.asm") + case MA_YTO_TYPE_BARN: + EnMaYto_SetupBarnWait(this); + break; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Ma_Yto_0x80B8E520/func_80B900C0.asm") + case MA_YTO_TYPE_AFTERMILKRUN: + this->unk310 = 0; + if (INV_CONTENT(ITEM_MASK_ROMANIS) == ITEM_MASK_ROMANIS && (gSaveContext.weekEventReg[0x34] & 1) && + (Rand_Next() & 0x80)) { + EnMaYto_SetupBeginWarmFuzzyFeelingCs(this); + } else { + EnMaYto_SetupAfterMilkRunInit(this); + } + break; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Ma_Yto_0x80B8E520/func_80B90170.asm") + case MA_YTO_TYPE_4: + this->actor.flags |= 0x10; + EnMaYto_SetupWarmFuzzyFeelingCs(this); + break; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Ma_Yto_0x80B8E520/func_80B90184.asm") + default: + EnMaYto_SetupDefaultWait(this); + break; + } +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Ma_Yto_0x80B8E520/func_80B902B8.asm") +s32 EnMaYto_SearchRomani(EnMaYto* this, GlobalContext* globalCtx) { + Actor* npcActor = globalCtx->actorCtx.actorList[ACTORCAT_NPC].first; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Ma_Yto_0x80B8E520/func_80B902CC.asm") + while (npcActor != NULL) { + if (npcActor->id == ACTOR_EN_MA_YTS) { + EnMaYts* romani = (EnMaYts*)npcActor; + s16 romaniType = EN_MA_YTS_PARSE_TYPE(&romani->actor); -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Ma_Yto_0x80B8E520/func_80B90340.asm") + if ((this->type == MA_YTO_TYPE_DINNER && romaniType == MA_YTS_TYPE_SITTING) || + (this->type == MA_YTO_TYPE_BARN && romaniType == MA_YTS_TYPE_BARN)) { + this->actor.child = &romani->actor; + romani->actor.parent = &this->actor; + return true; + } else { + npcActor = npcActor->next; + continue; + } + } + npcActor = npcActor->next; + } -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Ma_Yto_0x80B8E520/func_80B9037C.asm") + return false; +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Ma_Yto_0x80B8E520/func_80B904D0.asm") +/** + * Returns: + * - 2: Romani was found. + * - 1: Romani was not found. + * - 0: There's no need to find Romani. + */ +s32 EnMaYto_TryFindRomani(EnMaYto* this, GlobalContext* globalCtx) { + switch (this->type) { + case MA_YTO_TYPE_DEFAULT: + return 0; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Ma_Yto_0x80B8E520/func_80B904E4.asm") + case MA_YTO_TYPE_DINNER: + if (!(gSaveContext.weekEventReg[0x16] & 1) && CURRENT_DAY == 2) { + return 0; + } + if (EnMaYto_SearchRomani(this, globalCtx)) { + return 2; + } + return 1; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Ma_Yto_0x80B8E520/func_80B9059C.asm") + case MA_YTO_TYPE_BARN: + // if (AliensDefeated) + if (gSaveContext.weekEventReg[0x16] & 1) { + if (EnMaYto_SearchRomani(this, globalCtx)) { + return 2; + } + return 1; + } + return 0; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Ma_Yto_0x80B8E520/func_80B905B0.asm") + case MA_YTO_TYPE_AFTERMILKRUN: + return 0; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Ma_Yto_0x80B8E520/func_80B9061C.asm") + case MA_YTO_TYPE_4: + return 0; + } -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Ma_Yto_0x80B8E520/func_80B9083C.asm") + return 0; +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Ma_Yto_0x80B8E520/func_80B90A78.asm") +void EnMaYto_Destroy(Actor* thisx, GlobalContext* globalCtx) { + EnMaYto* this = THIS; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Ma_Yto_0x80B8E520/func_80B90C08.asm") + Collider_DestroyCylinder(globalCtx, &this->collider); +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Ma_Yto_0x80B8E520/func_80B90C78.asm") +void EnMaYto_SetupKeepLookingForRomani(EnMaYto* this) { + this->actionFunc = EnMaYto_KeepLookingForRomani; +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Ma_Yto_0x80B8E520/func_80B90D98.asm") +void EnMaYto_KeepLookingForRomani(EnMaYto* this, GlobalContext* globalCtx) { + if (EnMaYto_TryFindRomani(this, globalCtx) == 2) { + EnMaYto_ChooseAction(this, globalCtx); + } +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Ma_Yto_0x80B8E520/func_80B90DF0.asm") +void EnMaYto_SetupDefaultWait(EnMaYto* this) { + if (this->actor.shape.rot.y == this->actor.home.rot.y) { + this->currentAnim = 11; + EnMaYto_ChangeAnim(this, 11); + } else { + this->currentAnim = 1; + EnMaYto_ChangeAnim(this, 1); + } -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Ma_Yto_0x80B8E520/func_80B90E50.asm") + EnMaYto_InitFaceExpression(this); + this->unk31E = 2; + this->actionFunc = EnMaYto_DefaultWait; +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Ma_Yto_0x80B8E520/func_80B90E84.asm") +void EnMaYto_DefaultWait(EnMaYto* this, GlobalContext* globalCtx) { + s16 rotY = this->actor.home.rot.y - 0x8000; + s16 direction; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Ma_Yto_0x80B8E520/func_80B90EC8.asm") + direction = rotY - this->actor.yawTowardsPlayer; + if (Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.home.rot.y, 5, 0x3000, 0x100) == 0 && + this->currentAnim == 1) { + this->currentAnim = 11; + EnMaYto_ChangeAnim(this, 11); + } -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Ma_Yto_0x80B8E520/func_80B90EF0.asm") + if (func_800B84D0(&this->actor, globalCtx)) { + EnMaYto_DefaultStartDialogue(this, globalCtx); + EnMaYto_SetupDefaultDialogueHandler(this); + } else if (ABS_ALT(direction) < 0x1555) { + func_800B8614(&this->actor, globalCtx, 100.0f); + } +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Ma_Yto_0x80B8E520/func_80B90F84.asm") +void EnMaYto_SetupDefaultDialogueHandler(EnMaYto* this) { + EnMaYto_ChangeAnim(this, 1); + this->unk31E = 2; + this->actionFunc = EnMaYto_DefaultDialogueHandler; +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Ma_Yto_0x80B8E520/func_80B91014.asm") +void EnMaYto_DefaultDialogueHandler(EnMaYto* this, GlobalContext* globalCtx) { + switch (func_80152498(&globalCtx->msgCtx)) { + case 4: + EnMaYto_DefaultHandlePlayerChoice(this, globalCtx); + break; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Ma_Yto_0x80B8E520/func_80B9109C.asm") + case 5: + EnMaYto_DefaultChooseNextDialogue(this, globalCtx); + break; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Ma_Yto_0x80B8E520/EnMaYto_Update.asm") + case 6: + if (func_80147624(globalCtx)) { + this->unk31E = 0; + EnMaYto_SetupDefaultWait(this); + } + break; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Ma_Yto_0x80B8E520/func_80B91154.asm") + case 0: + case 1: + case 2: + case 3: + break; + } -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Ma_Yto_0x80B8E520/func_80B91250.asm") + Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 5, 0x3000, 0x100); + if (this->textId == 0x3395 && this->skelAnime.animCurrentSeg == &D_0600AF7C && + func_801378B8(&this->skelAnime, this->skelAnime.animFrameCount)) { + EnMaYto_ChangeAnim(this, 4); + } +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Ma_Yto_0x80B8E520/EnMaYto_Draw.asm") +void EnMaYto_DefaultHandlePlayerChoice(EnMaYto* this, GlobalContext* globalCtx) { + if (func_80147624(globalCtx)) { + if (globalCtx->msgCtx.choiceIndex == 0) { // Yes + func_8019F208(); + EnMaYto_SetFaceExpression(this, 0, 3); + // "Milk Road is fixed!" + func_801518B0(globalCtx, 0x3392, &this->actor); + this->textId = 0x3392; + } else { // No + func_8019F230(); + // "Don't lie!" + func_801518B0(globalCtx, 0x3391, &this->actor); + this->textId = 0x3391; + } + } +} + +void EnMaYto_DefaultChooseNextDialogue(EnMaYto* this, GlobalContext* globalCtx) { + if (func_80147624(globalCtx)) { + switch (this->textId) { + case 0x3391: + EnMaYto_SetFaceExpression(this, 0, 3); + func_801518B0(globalCtx, 0x3392, &this->actor); + this->textId = 0x3392; + break; + + case 0x3392: + EnMaYto_SetFaceExpression(this, 3, 1); + func_801518B0(globalCtx, 0x3393, &this->actor); + this->textId = 0x3393; + func_80151BB4(globalCtx, 6); + break; + + case 0x3394: + EnMaYto_ChangeAnim(this, 2); + func_801518B0(globalCtx, 0x3395, &this->actor); + this->textId = 0x3395; + break; + + case 0x3395: + EnMaYto_ChangeAnim(this, 1); + func_801518B0(globalCtx, 0x3396, &this->actor); + this->textId = 0x3396; + func_80151BB4(globalCtx, 6); + break; + } + } +} + +void EnMaYto_SetupDinnerWait(EnMaYto* this) { + if (CURRENT_DAY == 1 || (gSaveContext.weekEventReg[0x16] & 1)) { + func_80B90E50(this, 0); + this->unk31E = 0; + } else { + func_80B90E50(this, 2); + this->unk31E = 2; + } + + EnMaYto_InitFaceExpression(this); + this->actionFunc = EnMaYto_DinnerWait; +} + +void EnMaYto_DinnerWait(EnMaYto* this, GlobalContext* globalCtx) { + s16 direction = this->actor.shape.rot.y - this->actor.yawTowardsPlayer; + + if (func_800B84D0(&this->actor, globalCtx)) { + EnMaYto_DinnerStartDialogue(this, globalCtx); + EnMaYto_SetupDinnerDialogueHandler(this); + } else { + Actor* child = this->actor.child; + + if (child != NULL && func_800B84D0(child, globalCtx)) { + func_800B86C8(&this->actor, globalCtx, &this->actor); + EnMaYto_DinnerStartDialogue(this, globalCtx); + EnMaYto_SetupDinnerDialogueHandler(this); + } else if (ABS_ALT(direction) < 0x4000) { + func_800B8614(&this->actor, globalCtx, 120.0f); + + child = this->actor.child; + if (child != NULL && CURRENT_DAY != 2) { + s16 childDirection = child->shape.rot.y - child->yawTowardsPlayer; + + if (ABS_ALT(childDirection) < 0x4000) { + func_800B8614(child, globalCtx, 120.0f); + } + } + } + } +} + +void EnMaYto_SetupDinnerDialogueHandler(EnMaYto* this) { + if (CURRENT_DAY == 1 || (gSaveContext.weekEventReg[0x16] & 1)) { + func_80B90E50(this, 1); + } else { + func_80B90E50(this, 2); + } + + this->unk31E = 0; + this->actionFunc = EnMaYto_DinnerDialogueHandler; +} + +void EnMaYto_DinnerDialogueHandler(EnMaYto* this, GlobalContext* globalCtx) { + switch (func_80152498(&globalCtx->msgCtx)) { + case 4: + EnMaYto_DinnerHandlePlayerChoice(this, globalCtx); + break; + + case 5: + EnMaYto_DinnerChooseNextDialogue(this, globalCtx); + break; + + case 6: + if (func_80147624(globalCtx)) { + EnMaYto_SetupDinnerWait(this); + } + break; + + case 0: + case 1: + case 2: + case 3: + break; + } +} + +void EnMaYto_DinnerHandlePlayerChoice(EnMaYto* this, GlobalContext* globalCtx) { + if (func_80147624(globalCtx)) { + if (globalCtx->msgCtx.choiceIndex == 0) { // Yes + func_8019F208(); + EnMaYto_SetFaceExpression(this, 0, 3); + // "Milk Road is fixed!" + func_801518B0(globalCtx, 0x3399, &this->actor); + this->textId = 0x3399; + } else { // No + func_8019F230(); + // "Don't lie!" + func_801518B0(globalCtx, 0x3398, &this->actor); + this->textId = 0x3398; + } + } +} + +void EnMaYto_DinnerChooseNextDialogue(EnMaYto* this, GlobalContext* globalCtx) { + if (func_80147624(globalCtx)) { + switch (this->textId) { + case 0x3398: + EnMaYto_SetFaceExpression(this, 0, 3); + func_801518B0(globalCtx, 0x3399, &this->actor); + this->textId = 0x3399; + break; + + case 0x3399: + EnMaYto_SetFaceExpression(this, 3, 1); + func_801518B0(globalCtx, 0x339A, &this->actor); + this->textId = 0x339A; + break; + + case 0x339A: + this->unk31E = 1; + EnMaYto_SetFaceExpression(this, 0, 1); + func_801518B0(globalCtx, 0x339B, &this->actor); + this->textId = 0x339B; + break; + + case 0x339B: + func_800B86C8(&this->actor, globalCtx, this->actor.child); + func_80B90E50(this, 0); + EnMaYto_SetRomaniFaceExpression(this, 3, 3); + func_801518B0(globalCtx, 0x339C, &this->actor); + this->textId = 0x339C; + break; + + case 0x339C: + this->unk31E = 1; + func_800B86C8(&this->actor, globalCtx, &this->actor); + EnMaYto_SetFaceExpression(this, 0, 2); + func_801518B0(globalCtx, 0x339D, &this->actor); + this->textId = 0x339D; + break; + + case 0x339D: + func_80B90E50(this, 1); + func_800B86C8(&this->actor, globalCtx, this->actor.child); + EnMaYto_SetRomaniFaceExpression(this, 0, 1); + func_801518B0(globalCtx, 0x339E, &this->actor); + this->textId = 0x339E; + func_80151BB4(globalCtx, 6); + func_80151BB4(globalCtx, 5); + break; + + case 0x339F: + this->unk31E = 0; + func_801518B0(globalCtx, 0x33A0, &this->actor); + this->textId = 0x33A0; + break; + + case 0x33A0: + func_801518B0(globalCtx, 0x33A1, &this->actor); + this->textId = 0x33A1; + break; + + case 0x33A1: + func_80B90E50(this, 1); + func_800B86C8(&this->actor, globalCtx, this->actor.child); + EnMaYto_SetRomaniFaceExpression(this, 0, 2); + func_801518B0(globalCtx, 0x33A2, &this->actor); + this->textId = 0x33A2; + break; + + case 0x33A2: + this->unk31E = 1; + func_800B86C8(&this->actor, globalCtx, &this->actor); + EnMaYto_SetFaceExpression(this, 4, 3); + func_801518B0(globalCtx, 0x33A3, &this->actor); + this->textId = 0x33A3; + break; + + case 0x33A3: + this->unk31E = 0; + EnMaYto_SetFaceExpression(this, 3, 3); + func_801518B0(globalCtx, 0x33A4, &this->actor); + this->textId = 0x33A4; + func_80151BB4(globalCtx, 6); + func_80151BB4(globalCtx, 5); + break; + + case 0x33A5: + func_801518B0(globalCtx, 0x33A6, &this->actor); + this->textId = 0x33A6; + func_80151BB4(globalCtx, 6); + break; + + case 0x33A7: + func_801518B0(globalCtx, 0x33A8, &this->actor); + this->textId = 0x33A8; + func_80151BB4(globalCtx, 6); + break; + } + } +} + +void EnMaYto_SetupBarnWait(EnMaYto* this) { + if (CURRENT_DAY == 1 || (gSaveContext.weekEventReg[0x16] & 1)) { + EnMaYto_ChangeAnim(this, 13); + func_80B90E50(this, 0); + this->unk31E = 0; + } else { + this->unk320 = 0; + EnMaYto_ChangeAnim(this, 9); + func_80B90E50(this, 2); + this->unk31E = 2; + } + EnMaYto_InitFaceExpression(this); + this->actionFunc = EnMaYto_BarnWait; +} + +void EnMaYto_BarnWait(EnMaYto* this, GlobalContext* globalCtx) { + s16 direction = this->actor.shape.rot.y + 0x471C; + + direction -= this->actor.yawTowardsPlayer; + if (func_800B84D0(&this->actor, globalCtx)) { + EnMaYto_BarnStartDialogue(this, globalCtx); + EnMaYto_SetupBarnDialogueHandler(this); + } else { + Actor* child = this->actor.child; + + if (child != NULL && func_800B84D0(child, globalCtx)) { + func_800B86C8(&this->actor, globalCtx, &this->actor); + EnMaYto_BarnStartDialogue(this, globalCtx); + EnMaYto_SetupBarnDialogueHandler(this); + } else if (!(gSaveContext.weekEventReg[0x16] & 1) || ABS_ALT(direction) < 0x2000) { + func_800B8614(&this->actor, globalCtx, 100.0f); + + child = this->actor.child; + if (child != NULL) { + func_800B8614(child, globalCtx, 100.0f); + } + } + } +} + +void EnMaYto_SetupBarnDialogueHandler(EnMaYto* this) { + if (CURRENT_DAY == 1 || (gSaveContext.weekEventReg[0x16] & 1)) { + func_80B90E50(this, 1); + } else { + func_80B90E50(this, 2); + } + + this->actionFunc = EnMaYto_BarnDialogueHandler; +} + +void EnMaYto_BarnDialogueHandler(EnMaYto* this, GlobalContext* globalCtx) { + switch (func_80152498(&globalCtx->msgCtx)) { + case 5: + EnMaYto_BarnChooseNextDialogue(this, globalCtx); + break; + + case 6: + if (func_80147624(globalCtx)) { + this->unk31E = 0; + EnMaYto_SetupBarnWait(this); + } + break; + + case 0: + case 1: + case 2: + case 3: + case 4: + break; + } +} + +void EnMaYto_BarnChooseNextDialogue(EnMaYto* this, GlobalContext* globalCtx) { + if (func_80147624(globalCtx)) { + switch (this->textId) { + case 0x33A9: + func_80B90E50(this, 0); + func_800B86C8(&this->actor, globalCtx, this->actor.child); + EnMaYto_SetRomaniFaceExpression(this, 0, 3); + func_801518B0(globalCtx, 0x33AA, &this->actor); + this->textId = 0x33AA; + break; + + case 0x33AA: + func_800B86C8(&this->actor, globalCtx, &this->actor); + this->unk31E = 1; + func_801518B0(globalCtx, 0x33AB, &this->actor); + this->textId = 0x33AB; + break; + + case 0x33AB: + func_80B90E50(this, 1); + func_800B86C8(&this->actor, globalCtx, this->actor.child); + EnMaYto_SetRomaniFaceExpression(this, 0, 1); + func_801518B0(globalCtx, 0x33AC, &this->actor); + this->textId = 0x33AC; + break; + + case 0x33AC: + this->unk31E = 0; + func_800B86C8(&this->actor, globalCtx, &this->actor); + func_801518B0(globalCtx, 0x33AD, &this->actor); + this->textId = 0x33AD; + func_80151BB4(globalCtx, 6); + func_80151BB4(globalCtx, 5); + break; + + case 0x33AE: + func_80B90E50(this, 1); + func_800B86C8(&this->actor, globalCtx, this->actor.child); + EnMaYto_SetRomaniFaceExpression(this, 4, 2); + func_801518B0(globalCtx, 0x33AF, &this->actor); + this->textId = 0x33AF; + break; + + case 0x33AF: + this->unk31E = 1; + func_800B86C8(&this->actor, globalCtx, &this->actor); + EnMaYto_SetFaceExpression(this, 4, 2); + func_801518B0(globalCtx, 0x33B0, &this->actor); + this->textId = 0x33B0; + func_80151BB4(globalCtx, 6); + func_80151BB4(globalCtx, 5); + break; + + case 0x33B1: + this->unk31E = 2; + EnMaYto_SetFaceExpression(this, 5, 3); + // "I should had believed what Romani said" + func_801518B0(globalCtx, 0x33B2, &this->actor); + this->textId = 0x33B2; + func_80151BB4(globalCtx, 6); + break; + + case 0x33C6: + func_800B86C8(&this->actor, globalCtx, this->actor.child); + this->unk31E = 0; + EnMaYto_SetFaceExpression(this, 0, 1); + func_801518B0(globalCtx, 0x33C7, &this->actor); + this->textId = 0x33C7; + break; + + case 0x33C7: + func_800B86C8(&this->actor, globalCtx, &this->actor); + this->unk31E = 1; + EnMaYto_SetFaceExpression(this, 0, 1); + func_801518B0(globalCtx, 0x33C8, &this->actor); + this->textId = 0x33C8; + break; + + case 0x33C8: + func_800B86C8(&this->actor, globalCtx, this->actor.child); + func_80B90E50(this, 1); + EnMaYto_SetRomaniFaceExpression(this, 0, 2); + func_801518B0(globalCtx, 0x33C9, &this->actor); + this->textId = 0x33C9; + break; + + case 0x33C9: + func_800B86C8(&this->actor, globalCtx, &this->actor); + this->unk31E = 1; + EnMaYto_SetFaceExpression(this, 3, 1); + func_801518B0(globalCtx, 0x33CA, &this->actor); + this->textId = 0x33CA; + break; + + case 0x33CA: + this->unk31E = 1; + func_801518B0(globalCtx, 0x33CB, &this->actor); + this->textId = 0x33CB; + break; + + case 0x33CB: + func_800B86C8(&this->actor, globalCtx, this->actor.child); + func_80B90E50(this, 1); + EnMaYto_SetRomaniFaceExpression(this, 3, 3); + func_801518B0(globalCtx, 0x33CC, &this->actor); + this->textId = 0x33CC; + func_80151BB4(globalCtx, 6); + func_80151BB4(globalCtx, 5); + break; + + default: + break; + } + } +} + +void EnMaYto_SetupAfterMilkRunInit(EnMaYto* this) { + if (gSaveContext.weekEventReg[0x34] & 1) { // if (ProtectedCremia) + EnMaYto_SetFaceExpression(this, 3, 1); + } else { + func_801A3098(9); + EnMaYto_SetFaceExpression(this, 5, 2); + } + this->actionFunc = EnMaYto_AfterMilkRunInit; +} + +void EnMaYto_AfterMilkRunInit(EnMaYto* this, GlobalContext* globalCtx) { + this->actor.flags |= 0x10000; + + if (func_800B84D0(&this->actor, globalCtx)) { + this->actor.flags &= ~0x10000; + + if (gSaveContext.weekEventReg[0x34] & 1) { // if (ProtectedCremia) + func_801518B0(globalCtx, 0x33C1, &this->actor); + this->textId = 0x33C1; + } else { + // Fails milk minigame + EnMaYto_SetFaceExpression(this, 5, 2); + func_801518B0(globalCtx, 0x33C0, &this->actor); + this->textId = 0x33C0; + // Attempted Cremia Cart Ride + gSaveContext.weekEventReg[0xE] |= 0x1; + this->unk310 = 4; + EnMaYto_SetupPostMilkRunWaitDialogueEnd(this); + func_80151BB4(globalCtx, 6); + return; + } + + EnMaYto_SetupAfterMilkRunDialogueHandler(this); + } else { + func_800B8614(&this->actor, globalCtx, 200.0f); + } +} + +void EnMaYto_SetupAfterMilkRunDialogueHandler(EnMaYto* this) { + this->actionFunc = EnMaYto_AfterMilkRunDialogueHandler; +} + +void EnMaYto_AfterMilkRunDialogueHandler(EnMaYto* this, GlobalContext* globalCtx) { + switch (func_80152498(&globalCtx->msgCtx)) { + case 0: + case 1: + case 2: + case 3: + case 4: + case 6: + break; + + case 5: + EnMaYto_AfterMilkRunChooseNextDialogue(this, globalCtx); + break; + } + + Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 5, 0x71C, 0xB6); +} + +void EnMaYto_AfterMilkRunChooseNextDialogue(EnMaYto* this, GlobalContext* globalCtx) { + if (func_80147624(globalCtx)) { + switch (this->textId) { + case 0x33C1: + EnMaYto_SetFaceExpression(this, 3, 1); + // "Thank you. You were cool back there." + func_801518B0(globalCtx, 0x33C2, &this->actor); + this->textId = 0x33C2; + break; + + case 0x33C2: + func_801477B4(globalCtx); + EnMaYto_SetupPostMilkRunGiveReward(this); + EnMaYto_PostMilkRunGiveReward(this, globalCtx); + break; + } + } +} + +void EnMaYto_SetupPostMilkRunGiveReward(EnMaYto* this) { + this->actionFunc = EnMaYto_PostMilkRunGiveReward; +} + +void EnMaYto_PostMilkRunGiveReward(EnMaYto* this, GlobalContext* globalCtx) { + if (Actor_HasParent(&this->actor, globalCtx)) { + EnMaYto_SetupPostMilkRunExplainReward(this); + } else if (INV_CONTENT(ITEM_MASK_ROMANIS) == ITEM_MASK_ROMANIS) { + func_800B8A1C(&this->actor, globalCtx, GI_RUPEE_GOLD, 500.0f, 100.0f); + this->unk310 = 2; + } else { + func_800B8A1C(&this->actor, globalCtx, GI_MASK_ROMANIS, 500.0f, 100.0f); + this->unk310 = 1; + } +} + +void EnMaYto_SetupPostMilkRunExplainReward(EnMaYto* this) { + this->actionFunc = EnMaYto_PostMilkRunExplainReward; +} + +void EnMaYto_PostMilkRunExplainReward(EnMaYto* this, GlobalContext* globalCtx) { + if (func_800B84D0(&this->actor, globalCtx)) { + if (this->unk310 == 1) { + // Romani's mask explanation + EnMaYto_SetFaceExpression(this, 0, 1); + func_801518B0(globalCtx, 0x33C3, &this->actor); + this->textId = 0x33C3; + // Attempted Cremia Cart Ride + gSaveContext.weekEventReg[0xE] |= 0x1; + this->unk310 = 3; + func_80151BB4(globalCtx, 0x20); + func_80151BB4(globalCtx, 0x1F); + func_80151BB4(globalCtx, 6); + EnMaYto_SetupPostMilkRunWaitDialogueEnd(this); + } else { + // You already have the mask + EnMaYto_SetFaceExpression(this, 0, 1); + func_801518B0(globalCtx, 0x33D0, &this->actor); + this->textId = 0x33D0; + // Attempted Cremia Cart Ride + gSaveContext.weekEventReg[0xE] |= 0x1; + this->unk310 = 3; + func_80151BB4(globalCtx, 6); + EnMaYto_SetupPostMilkRunWaitDialogueEnd(this); + } + } else { + func_800B85E0(&this->actor, globalCtx, 200.0f, -1); + } +} + +void EnMaYto_SetupBeginWarmFuzzyFeelingCs(EnMaYto* this) { + this->actionFunc = EnMaYto_BeginWarmFuzzyFeelingCs; +} + +void EnMaYto_BeginWarmFuzzyFeelingCs(EnMaYto* this, GlobalContext* globalCtx) { + if (ActorCutscene_GetCanPlayNext(this->actor.cutscene)) { + ActorCutscene_Start(this->actor.cutscene, &this->actor); + EnMaYto_SetupWarmFuzzyFeelingCs(this); + } else { + if (ActorCutscene_GetCurrentIndex() == 0x7C) { + ActorCutscene_Stop(0x7C); + } + ActorCutscene_SetIntentToPlay(this->actor.cutscene); + } +} + +void EnMaYto_SetupWarmFuzzyFeelingCs(EnMaYto* this) { + EnMaYto_SetFaceExpression(this, 0, 1); + this->actionFunc = EnMaYto_WarmFuzzyFeelingCs; +} + +static u16 D_80B915F0 = 99; + +void EnMaYto_WarmFuzzyFeelingCs(EnMaYto* this, GlobalContext* globalCtx) { + if (func_800EE29C(globalCtx, 0x22C) != 0) { + u32 csActionIndex = func_800EE200(globalCtx, 0x22C); + + if (globalCtx->csCtx.frames == globalCtx->csCtx.npcActions[csActionIndex]->startFrame) { + u16 action = globalCtx->csCtx.npcActions[csActionIndex]->unk0; + + if (1) {} + + if (action != D_80B915F0) { + D_80B915F0 = action; + switch (action) { + case 1: + EnMaYto_ChangeAnim(this, 0); + break; + + case 2: + // Attempted Cremia Cart Ride + gSaveContext.weekEventReg[0xE] |= 1; + EnMaYto_ChangeAnim(this, 18); + break; + + case 3: + EnMaYto_ChangeAnim(this, 22); + break; + } + } + } + + func_800EDF24(&this->actor, globalCtx, csActionIndex); + if (D_80B915F0 == 2 && this->skelAnime.animCurrentSeg == &D_06001FD0 && + func_801378B8(&this->skelAnime, this->skelAnime.animFrameCount)) { + EnMaYto_ChangeAnim(this, 20); + } + } else { + D_80B915F0 = 99; + } +} + +void EnMaYto_SetupPostMilkRunWaitDialogueEnd(EnMaYto* this) { + this->actionFunc = EnMaYto_PostMilkRunWaitDialogueEnd; +} + +void EnMaYto_PostMilkRunWaitDialogueEnd(EnMaYto* this, GlobalContext* globalCtx) { + if (func_80152498(&globalCtx->msgCtx) == 6 || func_80152498(&globalCtx->msgCtx) == 5) { + if (func_80147624(globalCtx) && func_80152498(&globalCtx->msgCtx) == 5) { + func_800B7298(globalCtx, &this->actor, 7); + func_801477B4(globalCtx); + } + } + + if (func_80152498(&globalCtx->msgCtx) == 0 && globalCtx->msgCtx.unk120B1 == 0) { + EnMaYto_SetupPostMilkRunEnd(this); + } +} + +void EnMaYto_SetupPostMilkRunEnd(EnMaYto* this) { + this->actionFunc = EnMaYto_PostMilkRunEnd; +} + +void EnMaYto_PostMilkRunEnd(EnMaYto* this, GlobalContext* globalCtx) { + if (this->unk310 == 3) { + // Termina Field + globalCtx->nextEntranceIndex = 0x54D0; + } else { + // Romani Ranch + globalCtx->nextEntranceIndex = 0x6480; + } + gSaveContext.unk_3F4A = 0; + globalCtx->sceneLoadFlag = 0x14; + globalCtx->unk_1887F = 0x50; + gSaveContext.nextTransition = 3; +} + +void EnMaYto_DefaultStartDialogue(EnMaYto* this, GlobalContext* globalCtx) { + if (CURRENT_DAY == 1) { + if (Player_GetMask(globalCtx) != PLAYER_MASK_NONE && gSaveContext.playerForm == PLAYER_FORM_HUMAN) { + switch (Player_GetMask(globalCtx)) { + case PLAYER_MASK_ROMANIS_MASK: + func_801518B0(globalCtx, 0x235D, &this->actor); + this->textId = 0x235D; + break; + + case PLAYER_MASK_CIRCUS_LEADERS_MASK: + EnMaYto_SetFaceExpression(this, 1, 3); + func_801518B0(globalCtx, 0x235E, &this->actor); + this->textId = 0x235E; + break; + + case PLAYER_MASK_KAFEIS_MASK: + EnMaYto_SetFaceExpression(this, 1, 2); + func_801518B0(globalCtx, 0x235F, &this->actor); + this->textId = 0x235F; + break; + + case PLAYER_MASK_COUPLES_MASK: + func_801518B0(globalCtx, 0x2360, &this->actor); + this->textId = 0x2360; + break; + + default: + func_801518B0(globalCtx, 0x2361, &this->actor); + this->textId = 0x2361; + break; + } + } else { + if (EnMaYto_HasSpokeToPlayer()) { + func_801518B0(globalCtx, 0x3394, &this->actor); + this->textId = 0x3394; + } else { + EnMaYto_SetTalkedFlag(); + // Asks the player if he came from town. + func_801518B0(globalCtx, 0x3390, &this->actor); + this->textId = 0x3390; + } + } + } else if (CURRENT_DAY == 3) { + if (EnMaYto_HasSpokeToPlayerToday()) { + EnMaYto_SetFaceExpression(this, 0, 3); + func_801518B0(globalCtx, 0x33C5, &this->actor); + this->textId = 0x33C5; + func_80151BB4(globalCtx, 6); + } else { + EnMaYto_SetTalkedFlag(); + EnMaYto_SetFaceExpression(this, 0, 3); + func_801518B0(globalCtx, 0x33C4, &this->actor); + this->textId = 0x33C4; + func_80151BB4(globalCtx, 6); + } + } +} + +void EnMaYto_DinnerStartDialogue(EnMaYto* this, GlobalContext* globalCtx) { + switch (CURRENT_DAY) { + case 1: + if (Player_GetMask(globalCtx) != PLAYER_MASK_NONE && gSaveContext.playerForm == PLAYER_FORM_HUMAN) { + switch (Player_GetMask(globalCtx)) { + case PLAYER_MASK_ROMANIS_MASK: + func_801518B0(globalCtx, 0x235D, &this->actor); + this->textId = 0x235D; + break; + + case PLAYER_MASK_CIRCUS_LEADERS_MASK: + func_801518B0(globalCtx, 0x235E, &this->actor); + this->textId = 0x235E; + break; + + case PLAYER_MASK_KAFEIS_MASK: + func_801518B0(globalCtx, 0x235F, &this->actor); + this->textId = 0x235F; + break; + + case PLAYER_MASK_COUPLES_MASK: + func_801518B0(globalCtx, 0x2360, &this->actor); + this->textId = 0x2360; + break; + + default: + func_801518B0(globalCtx, 0x2361, &this->actor); + this->textId = 0x2361; + break; + } + } else { + if (EnMaYto_HasSpokeToPlayer()) { + func_801518B0(globalCtx, 0x339F, &this->actor); + this->textId = 0x339F; + } else { + EnMaYto_SetTalkedFlag(); + func_801518B0(globalCtx, 0x3397, &this->actor); + this->textId = 0x3397; + } + } + break; + + case 2: + if (EnMaYto_HasSpokeToPlayer()) { + func_801518B0(globalCtx, 0x33A6, &this->actor); + this->textId = 0x33A6; + func_80151BB4(globalCtx, 6); + } else { + EnMaYto_SetTalkedFlag(); + func_801518B0(globalCtx, 0x33A5, &this->actor); + this->textId = 0x33A5; + } + break; + + case 3: + if (EnMaYto_HasSpokeToPlayer()) { + func_801518B0(globalCtx, 0x33A8, &this->actor); + this->textId = 0x33A8; + func_80151BB4(globalCtx, 6); + } else { + EnMaYto_SetTalkedFlag(); + func_801518B0(globalCtx, 0x33A7, &this->actor); + this->textId = 0x33A7; + } + break; + } +} + +void EnMaYto_BarnStartDialogue(EnMaYto* this, GlobalContext* globalCtx) { + // if (AliensDefeated) + if (gSaveContext.weekEventReg[0x16] & 1) { + if (CURRENT_DAY == 2) { + if (this->unk310 == 1) { + func_801518B0(globalCtx, 0x33AE, &this->actor); + this->textId = 0x33AE; + } else { + this->unk310 = 1; + EnMaYto_SetTalkedFlag(); + func_801518B0(globalCtx, 0x33A9, &this->actor); + this->textId = 0x33A9; + } + } else if (CURRENT_DAY == 3) { + if (this->unk310 == 1) { + func_801518B0(globalCtx, 0x33CB, &this->actor); + this->textId = 0x33CB; + } else { + this->unk310 = 1; + EnMaYto_SetTalkedFlag(); + EnMaYto_SetFaceExpression(this, 0, 1); + func_801518B0(globalCtx, 0x33C6, &this->actor); + this->textId = 0x33C6; + } + } + } else { + if (EnMaYto_HasSpokeToPlayer()) { + this->unk31E = 2; + EnMaYto_SetFaceExpression(this, 5, 3); + func_801518B0(globalCtx, 0x33B3, &this->actor); + this->textId = 0x33B3; + func_80151BB4(globalCtx, 6); + } else { + EnMaYto_SetTalkedFlag(); + EnMaYto_SetFaceExpression(this, 5, 3); + func_801518B0(globalCtx, 0x33B1, &this->actor); + this->textId = 0x33B1; + } + } +} + +void EnMaYto_ChangeAnim(EnMaYto* this, s32 index) { + SkelAnime_ChangeAnim(&this->skelAnime, sAnimationInfo[index].animationSeg, 1.0f, 0.0f, + SkelAnime_GetFrameCount(&sAnimationInfo[index].animationSeg->common), + sAnimationInfo[index].mode, sAnimationInfo[index].transitionRate); +} + +void func_80B90C78(EnMaYto* this, GlobalContext* globalCtx) { + Player* player = PLAYER; + s16 flag; + + SkelAnime_FrameUpdateMatrix(&this->skelAnime); + flag = this->unk31E == 2 ? true : false; + + if (this->unk31E == 0) { + this->unk_1D8.unk_18 = player->actor.world.pos; + this->unk_1D8.unk_14 = 0.0f; + } else if (this->unk31E == 1) { + Math_Vec3f_StepTo(&this->unk_1D8.unk_18, &this->actor.child->world.pos, 8.0f); + this->unk_1D8.unk_14 = 0.0f; + } + + if (this->unk320 == 0) { + if (this->actionFunc == EnMaYto_WarmFuzzyFeelingCs) { + this->unk_1D8.unk_08.y = 0; + this->unk_1D8.unk_08.x = 0; + } else { + func_800BD888(&this->actor, &this->unk_1D8, 0xD, flag); + } + } else { + Math_SmoothStepToS(&this->unk_1D8.unk_08.y, 0, 3, 0x71C, 0xB6); + Math_SmoothStepToS(&this->unk_1D8.unk_08.x, 0x18E3, 5, 0x71C, 0xB6); + } + + EnMaYto_UpdateEyes(this); +} + +void EnMaYto_UpdateCollision(EnMaYto* this, GlobalContext* globalCtx) { + if (this->actionFunc != EnMaYto_WarmFuzzyFeelingCs) { + Collider_UpdateCylinder(&this->actor, &this->collider); + CollisionCheck_SetOC(globalCtx, &globalCtx->colChkCtx, &this->collider.base); + } +} + +void EnMaYto_UpdateEyes(EnMaYto* this) { + if (this->overrideEyeTexIndex != 0) { + this->eyeTexIndex = this->overrideEyeTexIndex; + } else if (this->blinkTimer == 100) { + if (this->eyeTexIndex == 0) { + this->blinkTimer = 0; + } else { + this->eyeTexIndex--; + } + } else { + this->blinkTimer++; + if (this->blinkTimer == 100) { + this->eyeTexIndex = 2; + } + } +} + +// EnMaYto_SetRomani... something +void func_80B90E50(EnMaYto* this, s16 arg1) { + EnMaYts* romani = (EnMaYts*)this->actor.child; + + if (romani != NULL && romani->actor.id == ACTOR_EN_MA_YTS) { + romani->unk_32C = arg1; + } +} + +void EnMaYto_SetRomaniFaceExpression(EnMaYto* this, s16 overrideEyeTexIndex, s16 mouthTexIndex) { + EnMaYts* romani = (EnMaYts*)this->actor.child; + + if ((romani != NULL) && (romani->actor.id == ACTOR_EN_MA_YTS)) { + romani->overrideEyeTexIndex = overrideEyeTexIndex; + romani->mouthTexIndex = mouthTexIndex; + } +} + +void EnMaYto_SetFaceExpression(EnMaYto* this, s16 overrideEyeTexIndex, s16 mouthIndex) { + this->overrideEyeTexIndex = overrideEyeTexIndex; + this->mouthTexIndex = mouthIndex; +} + +void EnMaYto_InitFaceExpression(EnMaYto* this) { + if (CURRENT_DAY == 1 || (gSaveContext.weekEventReg[0x16] & 1)) { + EnMaYto_SetFaceExpression(this, 0, 1); + EnMaYto_SetRomaniFaceExpression(this, 0, 0); + } else { + EnMaYto_SetFaceExpression(this, 5, 2); + EnMaYto_SetRomaniFaceExpression(this, 1, 2); + } +} + +s32 EnMaYto_HasSpokeToPlayerToday(void) { + switch (CURRENT_DAY) { + case 1: + if (gSaveContext.weekEventReg[0xD] & 0x4) { + return true; + } + break; + + case 2: + if (gSaveContext.weekEventReg[0xD] & 0x8) { + return true; + } + break; + + case 3: + if (gSaveContext.weekEventReg[0xD] & 0x10) { + return true; + } + break; + } + return false; +} + +s32 EnMaYto_HasSpokeToPlayer(void) { + // Please note each case doesn't have their respective `break`s. + switch (CURRENT_DAY) { + case 3: + if (gSaveContext.weekEventReg[0xD] & 0x10) { + return true; + } + + case 2: + if (gSaveContext.weekEventReg[0xD] & 0x8) { + return true; + } + + case 1: + if (gSaveContext.weekEventReg[0xD] & 0x4) { + return true; + } + } + return false; +} + +void EnMaYto_SetTalkedFlag(void) { + switch (CURRENT_DAY) { + case 1: + gSaveContext.weekEventReg[0xD] |= 0x4; + break; + + case 2: + gSaveContext.weekEventReg[0xD] |= 0x8; + break; + + case 3: + gSaveContext.weekEventReg[0xD] |= 0x10; + break; + } +} + +void EnMaYto_Update(Actor* thisx, GlobalContext* globalCtx) { + EnMaYto* this = THIS; + + this->actionFunc(this, globalCtx); + EnMaYto_UpdateCollision(this, globalCtx); + func_80B90C78(this, globalCtx); +} + +s32 EnMaYto_OverrideLimbDraw(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, + Actor* thisx) { + EnMaYto* this = THIS; + Vec3s sp4; + + if (limbIndex == MA2_LIMB_HEAD) { + sp4 = this->unk_1D8.unk_08; + + rot->x += sp4.y; + rot->z += sp4.x; + } else if (limbIndex == MA2_LIMB_TORSO) { + if (this->skelAnime.animCurrentSeg != &D_06007E28 && this->skelAnime.animCurrentSeg != &D_06003D54) { + sp4 = this->unk_1D8.unk_0E; + + rot->x += sp4.y; + if (this->skelAnime.animCurrentSeg == &D_0600A174 || this->skelAnime.animCurrentSeg == &D_060070EC || + this->skelAnime.animCurrentSeg == &D_06003D54) { + rot->z += sp4.x; + } + } + } + return 0; +} + +void EnMaYto_PostLimbDraw(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) { + EnMaYto* this = THIS; + + if (limbIndex == MA2_LIMB_HEAD) { + SysMatrix_GetStateTranslation(&this->actor.focus.pos); + } +} + +void EnMaYto_Draw(Actor* thisx, GlobalContext* globalCtx) { + EnMaYto* this = THIS; + s32 pad; + + OPEN_DISPS(globalCtx->state.gfxCtx); + if (this->type == MA_YTO_TYPE_BARN && (gSaveContext.weekEventReg[0x16] & 1)) { // Alieans defeated + gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, D_06005430); + } + func_8012C28C(globalCtx->state.gfxCtx); + + gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(sMouthTextures[this->mouthTexIndex])); + gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyesTextures[this->eyeTexIndex])); + + SkelAnime_DrawSV(globalCtx, this->skelAnime.skeleton, this->skelAnime.limbDrawTbl, this->skelAnime.dListCount, + EnMaYto_OverrideLimbDraw, EnMaYto_PostLimbDraw, &this->actor); + + CLOSE_DISPS(globalCtx->state.gfxCtx); +} diff --git a/src/overlays/actors/ovl_En_Ma_Yto/z_en_ma_yto.h b/src/overlays/actors/ovl_En_Ma_Yto/z_en_ma_yto.h index 9dd8229ec2..faf53ecb34 100644 --- a/src/overlays/actors/ovl_En_Ma_Yto/z_en_ma_yto.h +++ b/src/overlays/actors/ovl_En_Ma_Yto/z_en_ma_yto.h @@ -2,14 +2,71 @@ #define Z_EN_MA_YTO_H #include +#include "overlays/actors/ovl_En_Ma_Yts/z_en_ma_yts.h" struct EnMaYto; +typedef void (*EnMaYtoActionFunc)(struct EnMaYto*, GlobalContext*); + +typedef enum { + /* 00 */ MA2_LIMB_NONE, + /* 01 */ MA2_LIMB_ROOT, + /* 02 */ MA2_LIMB_TORSO, + /* 03 */ MA2_LIMB_ARM_LEFT, + /* 04 */ MA2_LIMB_FOREARM_LEFT, + /* 05 */ MA2_LIMB_HAND_LEFT, + /* 06 */ MA2_LIMB_ARM_RIGHT, + /* 07 */ MA2_LIMB_FOREARM_RIGHT, + /* 08 */ MA2_LIMB_HAND_RIGHT, + /* 09 */ MA2_LIMB_HEAD, + /* 10 */ MA2_LIMB_HAIR, + /* 11 */ MA2_LIMB_PELVIS, + /* 12 */ MA2_LIMB_TIGHT_LEFT, + /* 13 */ MA2_LIMB_LEG_LEFT, + /* 14 */ MA2_LIMB_FOOT_LEFT, + /* 15 */ MA2_LIMB_TIGHT_RIGHT, + /* 16 */ MA2_LIMB_LEG_RIGHT, + /* 17 */ MA2_LIMB_FOOT_RIGHT, + /* 18 */ MA2_LIMB_DRESS_0, + /* 19 */ MA2_LIMB_DRESS_1, + /* 20 */ MA2_LIMB_DRESS_2, + /* 21 */ MA2_LIMB_DRESS_3, + /* 22 */ MA2_LIMB_MAX +} ObjectMa2Limbs; + typedef struct EnMaYto { /* 0x000 */ Actor actor; - /* 0x144 */ char unk_144[0x1E0]; + /* 0x144 */ SkelAnime skelAnime; + /* 0x188 */ EnMaYtoActionFunc actionFunc; + /* 0x18C */ ColliderCylinder collider; + /* 0x1D8 */ struct_800BD888_arg1 unk_1D8; + /* 0x200 */ s32 unk200; // unused + /* 0x204 */ s32 type; + /* 0x208 */ Vec3s limbDrawTbl[MA2_LIMB_MAX]; + /* 0x28C */ Vec3s transitionDrawTbl[MA2_LIMB_MAX]; + /* 0x310 */ s16 unk310; // state? + /* 0x312 */ UNK_TYPE1 unk_312[0x2]; + /* 0x314 */ s16 currentAnim; // Used only in DefaultWait + /* 0x316 */ s16 overrideEyeTexIndex; // If non-zero, then this index will be used instead of eyeTexIndex + /* 0x318 */ s16 mouthTexIndex; + /* 0x31A */ s16 eyeTexIndex; + /* 0x31C */ s16 blinkTimer; + /* 0x31E */ s16 unk31E; + /* 0x320 */ s16 unk320; + /* 0x322 */ u16 textId; } EnMaYto; // size = 0x324 extern const ActorInit En_Ma_Yto_InitVars; +typedef enum { + /* 0 */ MA_YTO_TYPE_DEFAULT, // Strokes cow on day 1 + /* 1 */ MA_YTO_TYPE_BARN, + /* 2 */ MA_YTO_TYPE_DINNER, + /* 3 */ MA_YTO_TYPE_AFTERMILKRUN, // After Milk Run minigame + /* 4 */ MA_YTO_TYPE_4 // HugCutscene? Doesn't seem to work properly in-game +} EnMaYtoType; + +#define EN_MA_YTO_PARSE_TYPE(params) (((params)&0xF000) >> 12) +#define EN_MA_YTO_PARAM(enMaYtsType, arg1) (((enMaYtsType) << 12) | ((arg1) << 8)) + #endif // Z_EN_MA_YTO_H diff --git a/src/overlays/actors/ovl_En_Ma_Yts/z_en_ma_yts.c b/src/overlays/actors/ovl_En_Ma_Yts/z_en_ma_yts.c index 3021f5c5e3..5588db382b 100644 --- a/src/overlays/actors/ovl_En_Ma_Yts/z_en_ma_yts.c +++ b/src/overlays/actors/ovl_En_Ma_Yts/z_en_ma_yts.c @@ -146,7 +146,7 @@ void func_80B8D12C(EnMaYts* this, GlobalContext* globalCtx) { Player* player = PLAYER; s16 flag = this->unk_32C == 2 ? true : false; - if ((this->unk_32C == 0) || (this->actor.parent == NULL)) { + if (this->unk_32C == 0 || this->actor.parent == NULL) { this->unk_1D8.unk_18 = player->actor.world.pos; this->unk_1D8.unk_18.y -= -10.0f; } else { @@ -218,7 +218,7 @@ s32 EnMaYts_CheckValidSpawn(EnMaYts* this, GlobalContext* globalCtx) { // Failing the alien invasion if (!(gSaveContext.weekEventReg[0x16] & 1)) { return false; - } else if ((gSaveContext.time >= 0xD555) && (CURRENT_DAY == 3)) { + } else if (gSaveContext.time >= CLOCK_TIME(20, 0) && CURRENT_DAY == 3) { return false; } break; diff --git a/src/overlays/actors/ovl_En_Ma_Yts/z_en_ma_yts.h b/src/overlays/actors/ovl_En_Ma_Yts/z_en_ma_yts.h index 449eb33746..f03b2ddc1a 100644 --- a/src/overlays/actors/ovl_En_Ma_Yts/z_en_ma_yts.h +++ b/src/overlays/actors/ovl_En_Ma_Yts/z_en_ma_yts.h @@ -7,7 +7,6 @@ struct EnMaYts; typedef void (*EnMaYtsActionFunc)(struct EnMaYts*, GlobalContext*); -// Limbs of OBJECT_MA1 typedef enum { /* 00 */ MA1_LIMB_NONE, /* 01 */ MA1_LIMB_ROOT, diff --git a/src/overlays/actors/ovl_En_Nutsball/z_en_nutsball.c b/src/overlays/actors/ovl_En_Nutsball/z_en_nutsball.c index 00f5941f21..f59d378b53 100644 --- a/src/overlays/actors/ovl_En_Nutsball/z_en_nutsball.c +++ b/src/overlays/actors/ovl_En_Nutsball/z_en_nutsball.c @@ -162,7 +162,7 @@ void EnNutsball_Update(Actor* thisx, GlobalContext* globalCtx) { void EnNutsball_Draw(Actor* thisx, GlobalContext* globalCtx) { EnNutsball* this = THIS; - OPEN_DISPS(globalCtx->state.gfxCtx) + OPEN_DISPS(globalCtx->state.gfxCtx); func_8012C28C(globalCtx->state.gfxCtx); SysMatrix_InsertMatrix(&globalCtx->mf_187FC, 1); SysMatrix_InsertZRotation_s(this->actor.home.rot.z, 1); 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 dd59557af5..4de89490a4 100644 --- a/src/overlays/actors/ovl_En_Toto/z_en_toto.c +++ b/src/overlays/actors/ovl_En_Toto/z_en_toto.c @@ -383,7 +383,7 @@ s32 func_80BA3ED4(EnToto* this, GlobalContext* globalCtx) { s32 func_80BA3EE8(EnToto* this, GlobalContext* globalCtx) { if (this->text->unk1 == 2) { - func_800B7298(globalCtx, 0, 7); + func_800B7298(globalCtx, NULL, 7); } return 0; } @@ -478,7 +478,7 @@ s32 func_80BA42BC(EnToto* this, GlobalContext* globalCtx) { Vec3s* end = &D_80BA510C[3]; func_80BA3FB0(this, globalCtx); - func_800B7298(globalCtx, 0, 6); + func_800B7298(globalCtx, NULL, 6); if (player->actor.world.pos.z > -310.0f) { if ((player->actor.world.pos.x > -150.0f) || (player->actor.world.pos.z > -172.0f)) { phi_s0 = 3; @@ -498,7 +498,7 @@ s32 func_80BA42BC(EnToto* this, GlobalContext* globalCtx) { s32 func_80BA43F4(EnToto* this, GlobalContext* globalCtx) { func_80BA3C88(this); if (func_80122760(globalCtx, this->unk2BC, 60.0f)) { - func_800B7298(globalCtx, 0, 0x13); + func_800B7298(globalCtx, NULL, 0x13); return func_80BA4204(this, globalCtx); } return 0; @@ -506,7 +506,7 @@ s32 func_80BA43F4(EnToto* this, GlobalContext* globalCtx) { s32 func_80BA445C(EnToto* this, GlobalContext* globalCtx) { if (func_80BA4128(this, globalCtx)) { - func_800B7298(globalCtx, 0, 6); + func_800B7298(globalCtx, NULL, 6); return 1; } return 0; @@ -570,7 +570,7 @@ s32 func_80BA4530(EnToto* this, GlobalContext* globalCtx) { } s32 func_80BA46D8(EnToto* this, GlobalContext* globalCtx) { - func_800B7298(globalCtx, 0, 0x44); + func_800B7298(globalCtx, NULL, 0x44); func_80152434(globalCtx, D_80BA5120[gSaveContext.playerForm == 4 ? 0 : gSaveContext.playerForm]); return 0; } @@ -626,7 +626,7 @@ s32 func_80BA47E0(EnToto* this, GlobalContext* globalCtx) { } s32 func_80BA49A4(EnToto* this, GlobalContext* globalCtx) { - func_800B7298(globalCtx, 0, 0x44); + func_800B7298(globalCtx, NULL, 0x44); func_801A31EC(0x54, 4, this->unk2B3 ^ 0xF); this->unk2B1 = 4; return 0; @@ -646,7 +646,7 @@ s32 func_80BA4A00(EnToto* this, GlobalContext* globalCtx) { if (this->spotlights != NULL) { Actor_MarkForDeath(this->spotlights); } - func_800B7298(globalCtx, 0, 0x45); + func_800B7298(globalCtx, NULL, 0x45); if (this->unk2B3 == 0xF) { if (CURRENT_DAY == 1) { gSaveContext.weekEventReg[50] |= 1; diff --git a/src/overlays/actors/ovl_Obj_Dinner/z_obj_dinner.c b/src/overlays/actors/ovl_Obj_Dinner/z_obj_dinner.c index e4caabd73e..604d1dbbe1 100644 --- a/src/overlays/actors/ovl_Obj_Dinner/z_obj_dinner.c +++ b/src/overlays/actors/ovl_Obj_Dinner/z_obj_dinner.c @@ -39,10 +39,11 @@ void ObjDinner_Update(Actor* thisx, GlobalContext* globalCtx) { } void ObjDinner_Draw(Actor* thisx, GlobalContext* globalCtx) { - GraphicsContext* gfxCtx = globalCtx->state.gfxCtx; - s32 pad; + OPEN_DISPS(globalCtx->state.gfxCtx); + func_8012C28C(globalCtx->state.gfxCtx); - func_8012C28C(gfxCtx); - gSPMatrix(gfxCtx->polyOpa.p++, Matrix_NewMtx(globalCtx->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - gSPDisplayList(gfxCtx->polyOpa.p++, D_060011E0); + gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, D_060011E0); + + CLOSE_DISPS(globalCtx->state.gfxCtx); } diff --git a/tables/functions.txt b/tables/functions.txt index 37eb7a2c59..ca8fa5777f 100644 --- a/tables/functions.txt +++ b/tables/functions.txt @@ -14768,65 +14768,65 @@ 0x80B8DF9C:("EnMaYts_Draw",), 0x80B8E0BC:("EnMaYts_DrawSleeping",), 0x80B8E520:("EnMaYto_Init",), - 0x80B8E6E0:("func_80B8E6E0",), - 0x80B8E84C:("func_80B8E84C",), - 0x80B8E938:("func_80B8E938",), - 0x80B8EA38:("func_80B8EA38",), - 0x80B8EABC:("func_80B8EABC",), + 0x80B8E6E0:("EnMaYto_CheckValidSpawn",), + 0x80B8E84C:("EnMaYto_InitAnimation",), + 0x80B8E938:("EnMaYto_ChooseAction",), + 0x80B8EA38:("EnMaYto_SearchRomani",), + 0x80B8EABC:("EnMaYto_TryFindRomani",), 0x80B8EBB0:("EnMaYto_Destroy",), - 0x80B8EBDC:("func_80B8EBDC",), - 0x80B8EBF0:("func_80B8EBF0",), - 0x80B8EC30:("func_80B8EC30",), - 0x80B8ECAC:("func_80B8ECAC",), - 0x80B8ED8C:("func_80B8ED8C",), - 0x80B8EDC8:("func_80B8EDC8",), - 0x80B8EEAC:("func_80B8EEAC",), - 0x80B8EF4C:("func_80B8EF4C",), - 0x80B8F074:("func_80B8F074",), - 0x80B8F108:("func_80B8F108",), - 0x80B8F254:("func_80B8F254",), - 0x80B8F2D8:("func_80B8F2D8",), - 0x80B8F360:("func_80B8F360",), - 0x80B8F400:("func_80B8F400",), - 0x80B8F744:("func_80B8F744",), - 0x80B8F7F4:("func_80B8F7F4",), - 0x80B8F918:("func_80B8F918",), - 0x80B8F998:("func_80B8F998",), - 0x80B8FA14:("func_80B8FA14",), - 0x80B8FE04:("func_80B8FE04",), - 0x80B8FE74:("func_80B8FE74",), - 0x80B8FF80:("func_80B8FF80",), - 0x80B8FF94:("func_80B8FF94",), - 0x80B9000C:("func_80B9000C",), - 0x80B900AC:("func_80B900AC",), - 0x80B900C0:("func_80B900C0",), - 0x80B90170:("func_80B90170",), - 0x80B90184:("func_80B90184",), - 0x80B902B8:("func_80B902B8",), - 0x80B902CC:("func_80B902CC",), - 0x80B90340:("func_80B90340",), - 0x80B9037C:("func_80B9037C",), - 0x80B904D0:("func_80B904D0",), - 0x80B904E4:("func_80B904E4",), - 0x80B9059C:("func_80B9059C",), - 0x80B905B0:("func_80B905B0",), - 0x80B9061C:("func_80B9061C",), - 0x80B9083C:("func_80B9083C",), - 0x80B90A78:("func_80B90A78",), - 0x80B90C08:("func_80B90C08",), + 0x80B8EBDC:("EnMaYto_SetupKeepLookingForRomani",), + 0x80B8EBF0:("EnMaYto_KeepLookingForRomani",), + 0x80B8EC30:("EnMaYto_SetupDefaultWait",), + 0x80B8ECAC:("EnMaYto_DefaultWait",), + 0x80B8ED8C:("EnMaYto_SetupDefaultDialogueHandler",), + 0x80B8EDC8:("EnMaYto_DefaultDialogueHandler",), + 0x80B8EEAC:("EnMaYto_DefaultHandlePlayerChoice",), + 0x80B8EF4C:("EnMaYto_DefaultChooseNextDialogue",), + 0x80B8F074:("EnMaYto_SetupDinnerWait",), + 0x80B8F108:("EnMaYto_DinnerWait",), + 0x80B8F254:("EnMaYto_SetupDinnerDialogueHandler",), + 0x80B8F2D8:("EnMaYto_DinnerDialogueHandler",), + 0x80B8F360:("EnMaYto_DinnerHandlePlayerChoice",), + 0x80B8F400:("EnMaYto_DinnerChooseNextDialogue",), + 0x80B8F744:("EnMaYto_SetupBarnWait",), + 0x80B8F7F4:("EnMaYto_BarnWait",), + 0x80B8F918:("EnMaYto_SetupBarnDialogueHandler",), + 0x80B8F998:("EnMaYto_BarnDialogueHandler",), + 0x80B8FA14:("EnMaYto_BarnChooseNextDialogue",), + 0x80B8FE04:("EnMaYto_SetupAfterMilkRunInit",), + 0x80B8FE74:("EnMaYto_AfterMilkRunInit",), + 0x80B8FF80:("EnMaYto_SetupAfterMilkRunDialogueHandler",), + 0x80B8FF94:("EnMaYto_AfterMilkRunDialogueHandler",), + 0x80B9000C:("EnMaYto_AfterMilkRunChooseNextDialogue",), + 0x80B900AC:("EnMaYto_SetupPostMilkRunGiveReward",), + 0x80B900C0:("EnMaYto_PostMilkRunGiveReward",), + 0x80B90170:("EnMaYto_SetupPostMilkRunExplainReward",), + 0x80B90184:("EnMaYto_PostMilkRunExplainReward",), + 0x80B902B8:("EnMaYto_SetupBeginWarmFuzzyFeelingCs",), + 0x80B902CC:("EnMaYto_BeginWarmFuzzyFeelingCs",), + 0x80B90340:("EnMaYto_SetupWarmFuzzyFeelingCs",), + 0x80B9037C:("EnMaYto_WarmFuzzyFeelingCs",), + 0x80B904D0:("EnMaYto_SetupPostMilkRunWaitDialogueEnd",), + 0x80B904E4:("EnMaYto_PostMilkRunWaitDialogueEnd",), + 0x80B9059C:("EnMaYto_SetupPostMilkRunEnd",), + 0x80B905B0:("EnMaYto_PostMilkRunEnd",), + 0x80B9061C:("EnMaYto_DefaultStartDialogue",), + 0x80B9083C:("EnMaYto_DinnerStartDialogue",), + 0x80B90A78:("EnMaYto_BarnStartDialogue",), + 0x80B90C08:("EnMaYto_ChangeAnim",), 0x80B90C78:("func_80B90C78",), - 0x80B90D98:("func_80B90D98",), - 0x80B90DF0:("func_80B90DF0",), + 0x80B90D98:("EnMaYto_UpdateCollision",), + 0x80B90DF0:("EnMaYto_UpdateEyes",), 0x80B90E50:("func_80B90E50",), - 0x80B90E84:("func_80B90E84",), - 0x80B90EC8:("func_80B90EC8",), - 0x80B90EF0:("func_80B90EF0",), - 0x80B90F84:("func_80B90F84",), - 0x80B91014:("func_80B91014",), - 0x80B9109C:("func_80B9109C",), + 0x80B90E84:("EnMaYto_SetRomaniFaceExpression",), + 0x80B90EC8:("EnMaYto_SetFaceExpression",), + 0x80B90EF0:("EnMaYto_InitFaceExpression",), + 0x80B90F84:("EnMaYto_HasSpokeToPlayerToday",), + 0x80B91014:("EnMaYto_HasSpokeToPlayer",), + 0x80B9109C:("EnMaYto_SetTalkedFlag",), 0x80B9110C:("EnMaYto_Update",), - 0x80B91154:("func_80B91154",), - 0x80B91250:("func_80B91250",), + 0x80B91154:("EnMaYto_OverrideLimbDraw",), + 0x80B91250:("EnMaYto_PostLimbDraw",), 0x80B91288:("EnMaYto_Draw",), 0x80B91CC0:("ObjTokeiTurret_Init",), 0x80B91D80:("ObjTokeiTurret_Destroy",), diff --git a/tables/variables.txt b/tables/variables.txt index fe9738ada0..b5d80f19b1 100644 --- a/tables/variables.txt +++ b/tables/variables.txt @@ -16937,8 +16937,6 @@ 0x80B91410:("D_80B91410","UNK_TYPE1","",0x1), 0x80B9143C:("D_80B9143C","UNK_TYPE1","",0x1), 0x80B91448:("D_80B91448","UNK_TYPE1","",0x1), - 0x80B915C8:("D_80B915C8","UNK_TYPE1","",0x1), - 0x80B915D8:("D_80B915D8","UNK_TYPE1","",0x1), 0x80B915F0:("D_80B915F0","UNK_TYPE2","",0x2), 0x80B91600:("jtbl_D_80B91600","UNK_PTR","",0x4), 0x80B91614:("jtbl_D_80B91614","UNK_PTR","",0x4),