From 594a3ceaffa055dd015dd878dbe6bcf124567f9d Mon Sep 17 00:00:00 2001 From: Derek Hensley Date: Mon, 19 Jul 2021 16:26:47 -0700 Subject: [PATCH] Ovl_En_Fsn Ok and Documented (#204) * First decomp pass: Matched everything w/ data * Minor cleanup of func_80AE2F78 * Documented * Format * Some cleanup and PR suggestions * Format * Add the word player to a few functions to specify it is the player trying to buy * Add controller macros * Move common shopkeeper defines * name unk274 and add note to unk27A * Remove macros and just use flag defines * Convert Controller Macros to take globalCtx * Fix merge conflicts --- include/functions.h | 14 +- include/macros.h | 5 + include/variables.h | 2 +- include/z64.h | 3 +- include/z64item.h | 12 +- linker_scripts/code_script.txt | 4 +- linker_scripts/object_script.txt | 23 + src/code/code_0x800E8EA0.c | 18 +- src/code/code_0x8012EC80.c | 2 +- .../actors/ovl_Arms_Hook/z_arms_hook.c | 2 +- src/overlays/actors/ovl_Dm_Nb/z_dm_nb.c | 6 +- src/overlays/actors/ovl_En_Fsn/z_en_fsn.c | 1614 ++++++++++++++++- src/overlays/actors/ovl_En_Fsn/z_en_fsn.h | 64 +- src/overlays/actors/ovl_En_GirlA/z_en_girla.c | 54 +- src/overlays/actors/ovl_En_GirlA/z_en_girla.h | 79 +- .../actors/ovl_En_Invadepoh/z_en_invadepoh.c | 2 +- src/overlays/actors/ovl_En_Toto/z_en_toto.c | 2 +- .../actors/ovl_Obj_Ghaka/z_obj_ghaka.c | 7 +- tables/functions.txt | 118 +- tables/variables.txt | 6 +- 20 files changed, 1846 insertions(+), 191 deletions(-) diff --git a/include/functions.h b/include/functions.h index e7a50b7aa4..1801183bca 100644 --- a/include/functions.h +++ b/include/functions.h @@ -824,7 +824,7 @@ s32 func_800B8708(GlobalContext* globalCtx); // void func_800B8804(void); // void func_800B882C(void); // void func_800B886C(void); -void func_800B8898(GlobalContext* globalCtx, Actor* actor, UNK_PTR param_3, UNK_PTR param_4); +void func_800B8898(GlobalContext* globalCtx, Actor* actor, s16* arg2, s16* arg3); s32 func_800B8934(GlobalContext* globalCtx, Actor* actor); u32 Actor_HasParent(Actor* actor, GlobalContext* globalCtx); UNK_TYPE4 func_800B8A1C(Actor* actor, GlobalContext* globalCtx, s32 iParm3, f32 fParm4, f32 param_5); @@ -2164,7 +2164,7 @@ UNK_TYPE func_80114E90(void); // void func_801152B8(void); // void func_801153C8(void); // void func_80115428(void); -// void func_8011552C(void); +void func_8011552C(GlobalContext* globalCtx, s16 arg1); // void func_801155B4(void); // void func_80115764(void); void func_80115844(GlobalContext* globalCtx, s16 param_2); @@ -2238,14 +2238,14 @@ u32 func_801233E4(GlobalContext* globalCtx); // void func_801234D4(void); s32 func_80123590(GlobalContext* globalCtx, Actor* actor); // void func_8012364C(void); -// void func_80123810(void); +s32 func_80123810(GlobalContext* globalCtx); // void func_80123960(void); // void func_801239AC(void); // void func_80123AA4(void); // void func_80123BD4(void); // void func_80123C58(void); // void func_80123C90(void); -// void func_80123D50(void); +void func_80123D50(GlobalContext* globalCtx, Player* player, UNK_TYPE arg2, UNK_TYPE arg3); void func_80123DA4(Player* player); // void func_80123DC0(void); // void func_80123E90(void); @@ -2706,7 +2706,7 @@ void func_8013AED4(u16* param_1, u16 param_2, u16 param_3); // void func_8013B878(void); // void func_8013BB34(void); // void func_8013BB7C(void); -UNK_TYPE func_8013BC6C(SkelAnime* skelAnime, UNK_PTR arg1, s32 arg2); +UNK_TYPE func_8013BC6C(SkelAnime* skelAnime, ActorAnimationEntryS* arg1, s32 arg2); // void func_8013BD40(void); // void func_8013BEDC(void); // void func_8013C068(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5); @@ -2888,7 +2888,7 @@ void func_8014ADBC(GlobalContext* globalCtx, UNK_PTR puParm2); // void func_80150A84(void); void func_80150D08(GlobalContext* globalCtx, u32 uParm2); // void func_801514B0(void); -void func_801518B0(GlobalContext* globalCtx, u32 uParm2, Actor* uParm3); +void func_801518B0(GlobalContext* globalCtx, u16 textId, Actor* Actor); void func_80151938(GlobalContext* globalCtx, u16 textId); void func_80151A68(GlobalContext* globalCtx, u16 param_2); void func_80151BB4(GlobalContext* globalCtx, u32 uParm2); @@ -2896,7 +2896,7 @@ void func_80151BB4(GlobalContext* globalCtx, u32 uParm2); // void func_80151DA4(void); void func_80152434(GlobalContext* globalCtx, u16 arg2); // void func_80152464(void); -s32 func_80152498(MessageContext* msgCtx); +u8 func_80152498(MessageContext* msgCtx); // void func_8015268C(void); // void func_80152C64(void); // void func_80152CAC(void); diff --git a/include/macros.h b/include/macros.h index 8122b98a85..15fe7de0c0 100644 --- a/include/macros.h +++ b/include/macros.h @@ -52,6 +52,11 @@ #define CAPACITY(upg, value) gUpgradeCapacities[upg][value] #define CUR_CAPACITY(upg) CAPACITY(upg, CUR_UPG_VALUE(upg) - 4) +#define CONTROLLER1(globalCtx) (&(globalCtx)->state.input[0]) +#define CONTROLLER2(globalCtx) (&(globalCtx)->state.input[1]) +#define CONTROLLER3(globalCtx) (&(globalCtx)->state.input[2]) +#define CONTROLLER4(globalCtx) (&(globalCtx)->state.input[3]) + #define CHECK_BTN_ALL(state, combo) (~((state) | ~(combo)) == 0) #define CHECK_BTN_ANY(state, combo) (((state) & (combo)) != 0) diff --git a/include/variables.h b/include/variables.h index 2cc2836cd1..f32aefdfc4 100644 --- a/include/variables.h +++ b/include/variables.h @@ -1403,7 +1403,7 @@ extern u32 gGsFlagsMask[]; extern u32 gGsFlagsShift[]; extern void* gItemIcons[]; extern u8 gItemSlots[]; -extern u16 gItemPrices[]; +extern s16 gItemPrices[]; extern u16 gScenesPerRegion[11][27]; extern u32 D_801C2410[]; extern s16 gLinkFormObjectIndexes[8]; diff --git a/include/z64.h b/include/z64.h index c71f8230a3..ea158b1543 100644 --- a/include/z64.h +++ b/include/z64.h @@ -949,7 +949,8 @@ typedef struct { /* 0x11F10 */ s32 unk11F10; /* 0x11F14 */ UNK_TYPE1 pad11F14[0xE]; /* 0x11F22 */ u8 unk11F22; - /* 0x11F23 */ UNK_TYPE1 pad11F23[0xFE]; + /* 0x11F23 */ UNK_TYPE1 pad11F23[0xFD]; + /* 0x12020 */ u8 unk12020; /* 0x12021 */ u8 choiceIndex; /* 0x12022 */ UNK_TYPE1 unk12022; /* 0x12023 */ s8 unk12023; diff --git a/include/z64item.h b/include/z64item.h index 7682e7f136..a049b6635b 100644 --- a/include/z64item.h +++ b/include/z64item.h @@ -31,7 +31,8 @@ typedef enum { /* 0x15 */ ITEM_POTION_BLUE, /* 0x16 */ ITEM_FAIRY, /* 0x38 */ ITEM_MASK_ALL_NIGHT = 0x38, - /* 0x3B */ ITEM_MASK_GARO = 0x3B, + /* 0x3A */ ITEM_MASK_KEATON = 0x3A, + /* 0x3B */ ITEM_MASK_GARO, /* 0x46 */ ITEM_MASK_BREMEN = 0x46, /* 0x4D */ ITEM_SWORD_KOKIRI = 0x4D, /* 0x4E */ ITEM_SWORD_RAZOR, @@ -68,6 +69,13 @@ typedef enum { typedef enum { /* 0x00 */ GI_NONE, + /* 0x01 */ GI_RUPEE_GREEN, + /* 0x02 */ GI_RUPEE_BLUE, + /* 0x03 */ GI_RUPEE_10, + /* 0x04 */ GI_RUPEE_RED, + /* 0x05 */ GI_RUPEE_PURPLE, + /* 0x06 */ GI_RUPEE_SILVER, + /* 0x07 */ GI_RUPEE_GOLD, /* 0x0C */ GI_HEART_PIECE = 0x0C, /* 0x0D */ GI_HEART_CONTAINER, /* 0x16 */ GI_BOMBS_10 = 0x16, @@ -92,12 +100,14 @@ typedef enum { /* 0x5E */ GI_FAIRY, /* 0x60 */ GI_MILK_BOTTLE = 0x60, /* 0x7E */ GI_MASK_ALL_NIGHT = 0x7E, + /* 0x80 */ GI_MASK_KEATON = 0x80, /* 0x8C */ GI_MASK_BREMEN = 0x8C, /* 0x9B */ GI_SWORD_GREAT_FAIRY = 0x9B, /* 0x9C */ GI_SWORD_KOKIRI, /* 0x9D */ GI_SWORD_RAZOR, /* 0x9E */ GI_SWORD_GILDED, /* 0x9F */ GI_SHIELD_HERO_2, // Code that treats this as hero's shield is unused, so take with a grain of salt + /* 0xA1 */ GI_LETTER_TO_MAMA = 0xA1, /* 0xA9 */ GI_BOTTLE = 0xA9 } GetItemID; diff --git a/linker_scripts/code_script.txt b/linker_scripts/code_script.txt index 91ed4ee521..1b9f99f455 100644 --- a/linker_scripts/code_script.txt +++ b/linker_scripts/code_script.txt @@ -6119,9 +6119,9 @@ SECTIONS ovl_En_Fsn : AT(RomLocation) { build/src/overlays/actors/ovl_En_Fsn/z_en_fsn.o(.text) - build/asm/overlays/ovl_En_Fsn_data.o(.data) + build/src/overlays/actors/ovl_En_Fsn/z_en_fsn.o(.data) build/src/overlays/actors/ovl_En_Fsn/z_en_fsn.o(.rodata) - build/asm/overlays/ovl_En_Fsn_rodata.o(.rodata) + build/src/overlays/actors/ovl_En_Fsn/z_en_fsn_overlay.o(.ovl) } SegmentEnd = .; SegmentSize = SegmentEnd - SegmentStart; diff --git a/linker_scripts/object_script.txt b/linker_scripts/object_script.txt index e1af6574a6..896e0ddcbf 100644 --- a/linker_scripts/object_script.txt +++ b/linker_scripts/object_script.txt @@ -43,6 +43,9 @@ D_0408EBE0 = 0x0408EBE0; D_0408EFE0 = 0x0408EFE0; D_0408F3E0 = 0x0408F3E0; D_0408F7E0 = 0x0408F7E0; +D_0401F740 = 0x0401F740; +D_0401F7C0 = 0x0401F7C0; +D_0401F8C0 = 0x0401F8C0; /* gameplay_dangeon_keep (segment 05) */ @@ -288,6 +291,26 @@ D_060018B8 = 0x060018B8; D_0600017C = 0x0600017C; D_06001678 = 0x06001678; +/* z_en_fsn */ +D_06012C34 = 0x06012C34; +D_06013320 = 0x06013320; +D_060131FC = 0x060131FC; +D_0600C58C = 0x0600C58C; +D_0600E3EC = 0x0600E3EC; +D_0600F00C = 0x0600F00C; +D_0600CB3C = 0x0600CB3C; +D_0600D354 = 0x0600D354; +D_060138B0 = 0x060138B0; +D_0601430C = 0x0601430C; +D_0600B9D8 = 0x0600B9D8; +D_0600C26C = 0x0600C26C; +D_0600DE34 = 0x0600DE34; +D_06005BC0 = 0x06005BC0; +D_06006D40 = 0x06006D40; +D_06007140 = 0x06007140; +D_0600F180 = 0x0600F180; +D_0600F218 = 0x0600F218; + /* z_en_ginko_man */ object_ginko_skeleton = 0x0600C240; object_ginko_limb15_dlist = 0x0600B1D8; diff --git a/src/code/code_0x800E8EA0.c b/src/code/code_0x800E8EA0.c index 145701240e..d140bde7c0 100644 --- a/src/code/code_0x800E8EA0.c +++ b/src/code/code_0x800E8EA0.c @@ -37,19 +37,19 @@ s32 func_800E8FA4(Actor* actor, Vec3f* param_2, Vec3s* param_3, Vec3s* param_4) targetYaw = Math_Vec3f_Yaw(&actor->focus.pos, param_2) - actor->world.rot.y; Math_SmoothStepToS(¶m_3->x, targetPitch, 6, 2000, 1); - param_3->x = (param_3->x < -6000) ? -6000 : ((6000 < param_3->x) ? 6000 : param_3->x); + param_3->x = CLAMP(param_3->x, -6000, 6000); yawDiffFromTarget = Math_SmoothStepToS(¶m_3->y, targetYaw, 6, 2000, 1); - param_3->y = (param_3->y < -8000) ? -8000 : ((8000 < param_3->y) ? 8000 : param_3->y); + param_3->y = CLAMP(param_3->y, -8000, 8000); if (yawDiffFromTarget != 0) { - if ((param_3->y < 0 ? -param_3->y : param_3->y) < 8000) { + if (ABS_ALT(param_3->y) < 8000) { return 0; } } Math_SmoothStepToS(¶m_4->y, targetYaw - param_3->y, 4, 2000, 1); - param_4->y = (param_4->y < -12000) ? -12000 : ((12000 < param_4->y) ? 12000 : param_4->y); + param_4->y = CLAMP(param_4->y, -12000, 12000); return 1; } @@ -58,14 +58,15 @@ s32 func_800E9138(GlobalContext* globalCtx, Actor* actor, Vec3s* param_3, Vec3s* Player* player = PLAYER; s16 sVar3; Vec3f local_14; + s16 sVar3A; actor->focus.pos = actor->world.pos; actor->focus.pos.y += param_5; if (((globalCtx->csCtx).state == 0) && (D_801D0D50 == 0)) { sVar3 = actor->yawTowardsPlayer - actor->shape.rot.y; - // TODO is this shifting because of a missing cast? - if (0x42ff < (sVar3 < 0 ? ((-sVar3 << 0x10) >> 0x10) : ((sVar3 << 0x10) >> 0x10))) { + sVar3A = ABS_ALT(sVar3); + if (sVar3A >= 0x4300) { func_800E8F08(param_3, param_4); return 0; } @@ -86,13 +87,14 @@ s32 func_800E9250(GlobalContext* globalCtx, Actor* actor, Vec3s* param_3, Vec3s* Player* player = PLAYER; s16 sVar3; Vec3f local_14; + s16 sVar3A; actor->focus.pos = param_5; if (((globalCtx->csCtx).state == 0) && (D_801D0D50 == 0)) { sVar3 = actor->yawTowardsPlayer - actor->shape.rot.y; - // TODO is this shifting because of a missing cast? - if (0x42ff < (sVar3 < 0 ? ((-sVar3 << 0x10) >> 0x10) : ((sVar3 << 0x10) >> 0x10))) { + sVar3A = ABS_ALT(sVar3); + if (sVar3A >= 0x4300) { func_800E8F08(param_3, param_4); return 0; } diff --git a/src/code/code_0x8012EC80.c b/src/code/code_0x8012EC80.c index 2be7a0db10..092b7214a5 100644 --- a/src/code/code_0x8012EC80.c +++ b/src/code/code_0x8012EC80.c @@ -61,7 +61,7 @@ u8 gItemSlots[] = { 0x1C, 0x2B, 0x21, 0x2A, 0x2D, 0x1B, 0x1F, 0x1A, 0x22, 0x2E, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, }; -u16 gItemPrices[] = { +s16 gItemPrices[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 20, 20, 20, 0, 20, 5, 20, 20, 50, 50, 200, 20, 20, 20, 200, 5, 0, 200, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; diff --git a/src/overlays/actors/ovl_Arms_Hook/z_arms_hook.c b/src/overlays/actors/ovl_Arms_Hook/z_arms_hook.c index a8e7244a58..ac175b7e4e 100644 --- a/src/overlays/actors/ovl_Arms_Hook/z_arms_hook.c +++ b/src/overlays/actors/ovl_Arms_Hook/z_arms_hook.c @@ -262,7 +262,7 @@ void ArmsHook_Shoot(ArmsHook* this, GlobalContext* globalCtx) { func_8019F1C0(&this->actor.projectedPos, NA_SE_IT_HOOKSHOT_REFLECT); } } else { - if (CHECK_BTN_ANY(globalCtx->state.input[0].press.button, + if (CHECK_BTN_ANY(CONTROLLER1(globalCtx)->press.button, BTN_A | BTN_B | BTN_R | BTN_CUP | BTN_CLEFT | BTN_CRIGHT | BTN_CDOWN)) { s32 pad; this->timer = 1; diff --git a/src/overlays/actors/ovl_Dm_Nb/z_dm_nb.c b/src/overlays/actors/ovl_Dm_Nb/z_dm_nb.c index cf9b8a1b37..742b89dc06 100644 --- a/src/overlays/actors/ovl_Dm_Nb/z_dm_nb.c +++ b/src/overlays/actors/ovl_Dm_Nb/z_dm_nb.c @@ -27,19 +27,19 @@ const ActorInit Dm_Nb_InitVars = { (ActorFunc)DmNb_Draw, }; -extern UNK_TYPE D_06000990; +extern AnimationHeader D_06000990; extern FlexSkeletonHeader D_06008C40; // Probably the same struct as ActorAnimationEntryS, need more info from func_8013BC6C -static UNK_TYPE D_80C1E200[] = { &D_06000990, 0x3F800000, 0x0000FFFF, 0x00000000 }; +static ActorAnimationEntryS D_80C1E200[] = { &D_06000990, 1.0f, 0, -1, 0, 0}; s32 func_80C1DED0(DmNb* this, s32 arg1) { s32 ret = 0; if (arg1 != this->unk1F0) { this->unk1F0 = arg1; - ret = func_8013BC6C(&this->skelAnime, &D_80C1E200, arg1); + ret = func_8013BC6C(&this->skelAnime, D_80C1E200, arg1); } return ret; } diff --git a/src/overlays/actors/ovl_En_Fsn/z_en_fsn.c b/src/overlays/actors/ovl_En_Fsn/z_en_fsn.c index 9b2fddc809..b64e5df9a3 100644 --- a/src/overlays/actors/ovl_En_Fsn/z_en_fsn.c +++ b/src/overlays/actors/ovl_En_Fsn/z_en_fsn.c @@ -1,15 +1,72 @@ +/* + * File: z_en_fsn.c + * Overlay: ovl_En_Fsn + * Description: Curiosity Shop Man + */ + #include "z_en_fsn.h" #define FLAGS 0x00000019 #define THIS ((EnFsn*)thisx) +#define SI_NONE 0 + +#define ENFSN_END_CONVERSATION (1 << 0) +#define ENFSN_GIVE_ITEM (1 << 1) +#define ENFSN_GAVE_KEATONS_MASK (1 << 2) +#define ENFSN_GAVE_LETTER_TO_MAMA (1 << 3) + void EnFsn_Init(Actor* thisx, GlobalContext* globalCtx); void EnFsn_Destroy(Actor* thisx, GlobalContext* globalCtx); void EnFsn_Update(Actor* thisx, GlobalContext* globalCtx); void EnFsn_Draw(Actor* thisx, GlobalContext* globalCtx); -/* +void EnFsn_Idle(EnFsn* this, GlobalContext* globalCtx); +void EnFsn_ConverseBackroom(EnFsn* this, GlobalContext* globalCtx); +void EnFsn_Haggle(EnFsn* this, GlobalContext* globalCtx); +void EnFsn_BeginInteraction(EnFsn* this, GlobalContext* globalCtx); +void EnFsn_GiveItem(EnFsn* this, GlobalContext* globalCtx); +void EnFsn_AskBuyOrSell(EnFsn* this, GlobalContext* globalCtx); +void EnFsn_StartBuying(EnFsn* this, GlobalContext* globalCtx); +void EnFsn_SetupEndInteractionImmediately(EnFsn* this, GlobalContext* globalCtx); +void EnFsn_SetupResumeInteraction(EnFsn* this, GlobalContext* globalCtx); +void EnFsn_FaceShopkeeperSelling(EnFsn* this, GlobalContext* globalCtx); +void EnFsn_DeterminePrice(EnFsn* this, GlobalContext* globalCtx); +void EnFsn_SetupDeterminePrice(EnFsn* this, GlobalContext* globalCtx); +void EnFsn_SetupEndInteraction(EnFsn* this, GlobalContext* globalCtx); +void EnFsn_MakeOffer(EnFsn* this, GlobalContext* globalCtx); +void EnFsn_ResumeInteraction(EnFsn* this, GlobalContext* globalCtx); +void EnFsn_BrowseShelf(EnFsn* this, GlobalContext* globalCtx); +void EnFsn_ResumeShoppingInteraction(EnFsn* this, GlobalContext* globalCtx); +void EnFsn_AskCanBuyMore(EnFsn* this, GlobalContext* globalCtx); +void EnFsn_AskCanBuyAterRunningOutOfItems(EnFsn* this, GlobalContext* globalCtx); +void EnFsn_SelectItem(EnFsn* this, GlobalContext* globalCtx); +void EnFsn_LookToShopkeeperFromShelf(EnFsn* this, GlobalContext* globalCtx); +void EnFsn_PlayerCannotBuy(EnFsn* this, GlobalContext* globalCtx); + +extern UNK_TYPE D_0401F740; +extern UNK_TYPE D_0401F8C0; +extern UNK_TYPE D_0401F7C0; +extern AnimationHeader D_06012C34; +extern AnimationHeader D_060131FC; +extern AnimationHeader D_0600C58C; +extern AnimationHeader D_0600E3EC; +extern AnimationHeader D_0600F00C; +extern AnimationHeader D_0600CB3C; +extern AnimationHeader D_0600D354; +extern AnimationHeader D_060138B0; +extern AnimationHeader D_0601430C; +extern AnimationHeader D_0600B9D8; +extern AnimationHeader D_0600C26C; +extern AnimationHeader D_0600DE34; +extern FlexSkeletonHeader D_06013320; +extern UNK_TYPE D_06005BC0; +extern UNK_TYPE D_06006D40; +extern UNK_TYPE D_06007140; +extern Gfx D_0600F180[]; +extern Gfx D_0600F218[]; + const ActorInit En_Fsn_InitVars = { ACTOR_EN_FSN, ACTORCAT_NPC, @@ -21,130 +78,1557 @@ const ActorInit En_Fsn_InitVars = { (ActorFunc)EnFsn_Update, (ActorFunc)EnFsn_Draw, }; -*/ -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Fsn_0x80AE1B70/func_80AE1B70.asm") +ActorAnimationEntryS sAnimations[] = { + { &D_06012C34, 1.0f, 0, -1, 0, 0 }, { &D_060131FC, 1.0f, 0, -1, 0, 0 }, { &D_0600C58C, 1.0f, 0, -1, 2, 0 }, + { &D_0600C58C, -1.0f, 0, -1, 2, 0 }, { &D_0600E3EC, 1.0f, 0, -1, 2, 0 }, { &D_0600F00C, 1.0f, 0, -1, 0, 0 }, + { &D_0600CB3C, 1.0f, 0, -1, 2, 0 }, { &D_0600D354, 1.0f, 0, -1, 0, 0 }, { &D_060138B0, 1.0f, 0, -1, 2, 0 }, + { &D_0601430C, 1.0f, 0, -1, 0, 0 }, { &D_0600B9D8, 1.0f, 0, -1, 2, 0 }, { &D_0600C26C, 1.0f, 0, -1, 0, 0 }, + { &D_0600DE34, 1.0f, 0, -1, 2, 0 }, +}; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Fsn_0x80AE1B70/func_80AE1BF0.asm") +static ColliderCylinderInit sCylinderInit = { + { + COLTYPE_NONE, + AT_NONE, + AC_ON | AC_TYPE_PLAYER, + OC1_ON | OC1_TYPE_ALL, + OC2_TYPE_1, + COLSHAPE_CYLINDER, + }, + { + ELEMTYPE_UNK1, + { 0x00000000, 0x00, 0x00 }, + { 0xF7CFFFFF, 0x00, 0x00 }, + TOUCH_NONE | TOUCH_SFX_NORMAL, + BUMP_ON, + OCELEM_ON, + }, + { 18, 64, 0, { 0, 0, 0 } }, +}; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Fsn_0x80AE1B70/func_80AE1C54.asm") +static Vec3f sShopItemPositions[3] = { + { -5.0f, 35.0f, -95.0f }, + { 13.0f, 35.0f, -95.0f }, + { 31.0f, 35.0f, -95.0f }, +}; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Fsn_0x80AE1B70/func_80AE1E58.asm") +s32 EnFsn_TestItemSelected(GlobalContext* globalCtx) { + MessageContext* msgCtx = &globalCtx->msgCtx; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Fsn_0x80AE1B70/func_80AE1EF4.asm") + if (msgCtx->unk12020 == 0x10 || msgCtx->unk12020 == 0x11) { + return CHECK_BTN_ALL(CONTROLLER1(globalCtx)->press.button, BTN_A); + } + return CHECK_BTN_ALL(CONTROLLER1(globalCtx)->press.button, BTN_A) || + CHECK_BTN_ALL(CONTROLLER1(globalCtx)->press.button, BTN_B) || + CHECK_BTN_ALL(CONTROLLER1(globalCtx)->press.button, BTN_CUP); +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Fsn_0x80AE1B70/func_80AE1F5C.asm") +u16 EnFsn_GetWelcome(GlobalContext* globalCtx) { + switch (Player_GetMask(globalCtx)) { + case PLAYER_MASK_NONE: + return 0x29CC; + case PLAYER_MASK_DEKU_MASK: + return 0x29FC; + case PLAYER_MASK_GORON_MASK: + case PLAYER_MASK_ZORA_MASK: + return 0x29FD; + case PLAYER_MASK_KAFEIS_MASK: + return 0x2364; + default: + return 0x29FE; + } +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Fsn_0x80AE1B70/func_80AE2028.asm") +void EnFsn_HandleConversationBackroom(EnFsn* this, GlobalContext* globalCtx) { + switch (this->textId) { + case 0: + if (!(gSaveContext.weekEventReg[0x50] & 0x10)) { + this->textId = 0x29E0; + break; + } else { + this->textId = 0x29E4; + this->flags |= ENFSN_END_CONVERSATION; + break; + } + case 0x29E0: + if (INV_CONTENT(ITEM_MASK_KEATON) == ITEM_MASK_KEATON) { + this->flags |= ENFSN_GIVE_ITEM; + this->flags |= ENFSN_GAVE_LETTER_TO_MAMA; + this->getItemId = GI_LETTER_TO_MAMA; + gSaveContext.weekEventReg[0x50] |= 0x10; + this->textId = 0x29F1; + break; + } else { + this->textId = 0x29E1; + break; + } + case 0x29E1: + this->textId = 0x29E2; + break; + case 0x29E2: + this->flags |= ENFSN_GIVE_ITEM; + this->flags |= ENFSN_GAVE_KEATONS_MASK; + this->getItemId = GI_MASK_KEATON; + this->textId = 0x29E3; + break; + case 0x29E3: + this->flags |= ENFSN_GIVE_ITEM; + this->flags |= ENFSN_GAVE_LETTER_TO_MAMA; + this->getItemId = GI_LETTER_TO_MAMA; + gSaveContext.weekEventReg[0x50] |= 0x10; + this->textId = 0x29F1; + break; + case 0x29F1: + this->textId = 0x29E4; + this->flags |= ENFSN_END_CONVERSATION; + break; + } + func_801518B0(globalCtx, this->textId, &this->actor); + if (this->flags & ENFSN_END_CONVERSATION) { + if (this->flags & ENFSN_GAVE_LETTER_TO_MAMA) { + this->flags &= ~ENFSN_GAVE_LETTER_TO_MAMA; + func_80151BB4(globalCtx, 34); + } + if (this->flags & ENFSN_GAVE_KEATONS_MASK) { + this->flags &= ~ENFSN_GAVE_KEATONS_MASK; + func_80151BB4(globalCtx, 33); + } + func_80151BB4(globalCtx, 3); + } +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Fsn_0x80AE1B70/func_80AE2074.asm") +void EnFsn_HandleSetupResumeInteraction(EnFsn* this, GlobalContext* globalCtx) { + if (func_80152498(&globalCtx->msgCtx) == 6 && func_80147624(globalCtx) && this->cutsceneState == 0) { + func_800B84D0(&this->actor, globalCtx); + func_800B85E0(&this->actor, globalCtx, 400.0f, -1); + if (ENFSN_IS_SHOP(&this->actor)) { + this->actor.textId = 0; + } + this->actionFunc = EnFsn_ResumeInteraction; + } +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Fsn_0x80AE1B70/func_80AE21C8.asm") +void EnFsn_UpdateCollider(EnFsn* this, GlobalContext* globalCtx) { + this->collider.dim.pos.x = this->actor.world.pos.x; + this->collider.dim.pos.y = this->actor.world.pos.y; + this->collider.dim.pos.z = this->actor.world.pos.z; + CollisionCheck_SetOC(globalCtx, &globalCtx->colChkCtx, &this->collider.base); +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Fsn_0x80AE1B70/func_80AE2234.asm") +void EnFsn_HandleLookToShopkeeperBuyingCutscene(EnFsn* this) { + if (this->cutsceneState == 2 && this->lookToShopkeeperBuyingCutscene != this->cutscene && + this->actor.textId == 0x29CE) { + ActorCutscene_Stop(this->cutscene); + if (ActorCutscene_GetCurrentIndex() == 0x7C) { + ActorCutscene_Stop(0x7C); + } + this->cutscene = this->lookToShopkeeperBuyingCutscene; + ActorCutscene_SetIntentToPlay(this->cutscene); + this->cutsceneState = 1; + } else if (this->cutsceneState == 1) { + if (ActorCutscene_GetCanPlayNext(this->cutscene)) { + ActorCutscene_Start(this->cutscene, &this->actor); + this->cutsceneState = 2; + } else { + ActorCutscene_SetIntentToPlay(this->cutscene); + } + } +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Fsn_0x80AE1B70/func_80AE2298.asm") +u8 EnFsn_SetCursorIndexFromNeutral(EnFsn* this) { + if (this->itemIds[0] != -1) { + return 0; + } + if (this->itemIds[1] != -1) { + return 1; + } + if (this->itemIds[2] != -1) { + return 2; + } + return CURSOR_INVALID; +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Fsn_0x80AE1B70/func_80AE2340.asm") +void EnFsn_CursorLeftRight(EnFsn* this) { + u8 cursorScan = this->cursorIdx; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Fsn_0x80AE1B70/func_80AE2438.asm") + if (this->stickAccumX > 0) { + if (cursorScan != this->totalSellingItems - 1) { + while (cursorScan != this->totalSellingItems - 1) { + cursorScan++; + if (this->itemIds[cursorScan] != -1) { + this->cursorIdx = cursorScan; + break; + } + } + } else if (this->itemIds[cursorScan] != -1) { + this->cursorIdx = cursorScan; + } + } else if (this->stickAccumX < 0) { + if (cursorScan != 0) { + while (cursorScan != 0) { + cursorScan--; + if (this->itemIds[cursorScan] != -1) { + this->cursorIdx = cursorScan; + break; + } else if (cursorScan == 0) { + play_sound(NA_SE_SY_CURSOR); + this->drawCursor = 0; + this->actionFunc = EnFsn_LookToShopkeeperFromShelf; + break; + } + } + } else { + play_sound(NA_SE_SY_CURSOR); + this->drawCursor = 0; + this->actionFunc = EnFsn_LookToShopkeeperFromShelf; + if (this->itemIds[cursorScan] != -1) { + this->cursorIdx = cursorScan; + } + } + } +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Fsn_0x80AE1B70/func_80AE2524.asm") +s16 EnFsn_GetThirdDayItemId(void) { + if (!(gSaveContext.weekEventReg[0x21] & 4) && CURRENT_DAY == 3) { + if (!(gSaveContext.weekEventReg[0x21] & 8) && !(gSaveContext.weekEventReg[0x4F] & 0x40)) { + return SI_BOMB_BAG_30_1; + } + return SI_MASK_ALL_NIGHT; + } + return SI_NONE; +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Fsn_0x80AE1B70/func_80AE25D4.asm") +s16 EnFsn_GetStolenItemId(u32 stolenItem) { + switch (stolenItem) { + case ITEM_BOTTLE: + return SI_BOTTLE; + case ITEM_SWORD_GREAT_FAIRY: + return SI_SWORD_GREAT_FAIRY; + case ITEM_SWORD_KOKIRI: + return SI_SWORD_KOKIRI; + case ITEM_SWORD_RAZOR: + return SI_SWORD_RAZOR; + case ITEM_SWORD_GILDED: + return SI_SWORD_GILDED; + } + return SI_NONE; +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Fsn_0x80AE1B70/func_80AE2670.asm") +s32 EnFsn_HasItemsToSell(void) { + if (CURRENT_DAY != 3) { + if (((gSaveContext.roomInf[126][5] & 0xFF000000) >> 0x18) || + ((gSaveContext.roomInf[126][5] & 0xFF0000) >> 0x10)) { + return true; + } + return false; + } else { + if (((gSaveContext.roomInf[126][5] & 0xFF000000) >> 0x18) || + ((gSaveContext.roomInf[126][5] & 0xFF0000) >> 0x10) || !(gSaveContext.weekEventReg[0x21] & 4)) { + return true; + } + return false; + } +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Fsn_0x80AE1B70/func_80AE26D4.asm") +void EnFsn_GetShopItemIds(EnFsn* this) { + u32 stolenItem1 = (gSaveContext.roomInf[126][5] & 0xFF000000) >> 0x18; + u32 stolenItem2 = (gSaveContext.roomInf[126][5] & 0xFF0000) >> 0x10; + s16 itemId; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Fsn_0x80AE1B70/func_80AE2760.asm") + this->stolenItem1 = this->stolenItem2 = 0; + this->itemIds[0] = this->itemIds[1] = this->itemIds[2] = 0; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Fsn_0x80AE1B70/func_80AE28B0.asm") + itemId = EnFsn_GetThirdDayItemId(); + this->itemIds[this->totalSellingItems] = itemId; + if (itemId != SI_NONE) { + this->totalSellingItems++; + } + itemId = EnFsn_GetStolenItemId(stolenItem1); + this->itemIds[this->totalSellingItems] = itemId; + if (itemId != SI_NONE) { + this->stolenItem1 = this->totalSellingItems; + this->totalSellingItems++; + } + itemId = EnFsn_GetStolenItemId(stolenItem2); + this->itemIds[this->totalSellingItems] = itemId; + if (itemId != SI_NONE) { + this->stolenItem2 = this->totalSellingItems; + this->totalSellingItems++; + } + this->numSellingItems = this->totalSellingItems; +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Fsn_0x80AE1B70/func_80AE2974.asm") +void EnFsn_SpawnShopItems(EnFsn* this, GlobalContext* globalCtx) { + s32 i; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Fsn_0x80AE1B70/func_80AE2A98.asm") + EnFsn_GetShopItemIds(this); + for (i = 0; i < this->totalSellingItems; i++) { + if (this->itemIds[i] < 0) { + this->items[i] = NULL; + } else { + this->items[i] = + (EnGirlA*)Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_EN_GIRLA, sShopItemPositions[i].x, + sShopItemPositions[i].y, sShopItemPositions[i].z, 0, 0, 0, this->itemIds[i]); + } + } +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Fsn_0x80AE1B70/func_80AE2B44.asm") +void EnFsn_EndInteraction(EnFsn* this, GlobalContext* globalCtx) { + if (this->cutsceneState == 2) { + ActorCutscene_Stop(this->cutscene); + this->cutsceneState = 0; + } + func_800B84D0(&this->actor, globalCtx); + globalCtx->msgCtx.unk11F22 = 0x43; + globalCtx->msgCtx.unk12023 = 4; + Interface_ChangeAlpha(50); + this->drawCursor = 0; + this->stickLeftPrompt.isEnabled = false; + this->stickRightPrompt.isEnabled = false; + globalCtx->interfaceCtx.unk_222 = 0; + globalCtx->interfaceCtx.unk_224 = 0; + this->actor.textId = 0; + this->actionFunc = EnFsn_Idle; +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Fsn_0x80AE1B70/func_80AE2BE0.asm") +s32 EnFsn_TestEndInteraction(EnFsn* this, GlobalContext* globalCtx, Input* input) { + if (CHECK_BTN_ALL(input->press.button, BTN_B)) { + this->actor.textId = (CURRENT_DAY == 3) ? 0x29DF : 0x29D1; + func_801518B0(globalCtx, this->actor.textId, &this->actor); + func_80151BB4(globalCtx, 3); + this->actionFunc = EnFsn_SetupEndInteraction; + return true; + } + return false; +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Fsn_0x80AE1B70/func_80AE2C6C.asm") +s32 EnFsn_TestCancelOption(EnFsn* this, GlobalContext* globalCtx, Input* input) { + if (CHECK_BTN_ALL(input->press.button, BTN_B)) { + this->actionFunc = this->tmpActionFunc; + func_80151938(globalCtx, this->items[this->cursorIdx]->actor.textId); + return true; + } + return false; +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Fsn_0x80AE1B70/func_80AE2CFC.asm") +void EnFsn_UpdateCursorPos(EnFsn* this, GlobalContext* globalCtx) { + s16 sp2E; + s16 sp2C; + f32 xOffset = 0.0f; + f32 yOffset = 17.0f; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Fsn_0x80AE1B70/func_80AE2DC8.asm") + func_800B8898(globalCtx, &this->items[this->cursorIdx]->actor, &sp2E, &sp2C); + this->cursorX = sp2E + xOffset; + this->cursorY = sp2C + yOffset; + this->cursorZ = 1.2f; +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Fsn_0x80AE1B70/func_80AE2F78.asm") +s32 EnFsn_FacingShopkeeperDialogResult(EnFsn* this, GlobalContext* globalCtx) { + switch (globalCtx->msgCtx.choiceIndex) { + case 0: + func_8019F208(); + if (CURRENT_DAY != 3) { + this->actor.textId = 0x29FB; + } else if (gSaveContext.weekEventReg[0x21] & 4) { + this->actor.textId = 0x29FF; + } else if (!(gSaveContext.weekEventReg[0x21] & 8) && !(gSaveContext.weekEventReg[0x4F] & 0x40)) { + this->actor.textId = 0x29D7; + } else { + this->actor.textId = 0x29D8; + } + func_801518B0(globalCtx, this->actor.textId, &this->actor); + return true; + case 1: + func_8019F230(); + this->actor.textId = (CURRENT_DAY == 3) ? 0x29DF : 0x29D1; + func_801518B0(globalCtx, this->actor.textId, &this->actor); + func_80151BB4(globalCtx, 3); + this->actionFunc = EnFsn_SetupEndInteraction; + return true; + } + return false; +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Fsn_0x80AE1B70/func_80AE30F8.asm") +s32 EnFsn_HasPlayerSelectedItem(EnFsn* this, GlobalContext* globalCtx, Input* input) { + if (EnFsn_TestEndInteraction(this, globalCtx, input)) { + return true; + } + if (EnFsn_TestItemSelected(globalCtx)) { + if (!this->items[this->cursorIdx]->isOutOfStock) { + this->tmpActionFunc = this->actionFunc; + func_80151938(globalCtx, this->items[this->cursorIdx]->choiceTextId); + play_sound(NA_SE_SY_DECIDE); + this->stickLeftPrompt.isEnabled = false; + this->stickRightPrompt.isEnabled = false; + this->drawCursor = 0; + this->actionFunc = EnFsn_SelectItem; + } else { + play_sound(NA_SE_SY_ERROR); + } + return true; + } + return false; +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Fsn_0x80AE1B70/func_80AE32D4.asm") +void EnFsn_UpdateJoystickInputState(EnFsn* this, GlobalContext* globalCtx) { + s8 stickX = CONTROLLER1(globalCtx)->rel.stick_x; + s8 stickY = CONTROLLER1(globalCtx)->rel.stick_y; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Fsn_0x80AE1B70/func_80AE3474.asm") + if (this->stickAccumX == 0) { + if (stickX > 30 || stickX < -30) { + this->stickAccumX = stickX; + } + } else if (stickX <= 30 && stickX >= -30) { + this->stickAccumX = 0; + } else if ((this->stickAccumX * stickX) < 0) { // Stick has swapped directions + this->stickAccumX = stickX; + } else { + this->stickAccumX += stickX; + if (this->stickAccumX > 2000) { + this->stickAccumX = 2000; + } else if (this->stickAccumX < -2000) { + this->stickAccumX = -2000; + } + } + if (this->stickAccumY == 0) { + if (stickY > 30 || stickY < -30) { + this->stickAccumY = stickY; + } + } else if (stickY <= 30 && stickY >= -30) { + this->stickAccumY = 0; + } else if ((this->stickAccumY * stickY) < 0) { // Stick has swapped directions + this->stickAccumY = stickY; + } else { + this->stickAccumY += stickY; + if (this->stickAccumY > 2000) { + this->stickAccumY = 2000; + } else if (this->stickAccumY < -2000) { + this->stickAccumY = -2000; + } + } +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Fsn_0x80AE1B70/func_80AE352C.asm") +void EnFsn_PositionSelectedItem(EnFsn* this) { + Vec3f selectedItemPosition = { 13.0f, 38.0f, -71.0f }; + u8 i = this->cursorIdx; + EnGirlA* item = this->items[i]; + Vec3f worldPos; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Fsn_0x80AE1B70/func_80AE3644.asm") + VEC3F_LERPIMPDST(&worldPos, &sShopItemPositions[i], &selectedItemPosition, this->shopItemSelectedTween); -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Fsn_0x80AE1B70/func_80AE3880.asm") + item->actor.world.pos.x = worldPos.x; + item->actor.world.pos.y = worldPos.y; + item->actor.world.pos.z = worldPos.z; +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Fsn_0x80AE1B70/func_80AE38E0.asm") +/* + * Returns true if animation has completed + */ +s32 EnFsn_TakeItemOffShelf(EnFsn* this) { + Math_ApproachF(&this->shopItemSelectedTween, 1.0f, 1.0f, 0.15f); + if (this->shopItemSelectedTween >= 0.85f) { + this->shopItemSelectedTween = 1.0f; + } + EnFsn_PositionSelectedItem(this); + if (this->shopItemSelectedTween == 1.0f) { + return true; + } + return false; +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Fsn_0x80AE1B70/func_80AE3A68.asm") +/* + * Returns true if animation has completed + */ +s32 EnFsn_ReturnItemToShelf(EnFsn* this) { + Math_ApproachF(&this->shopItemSelectedTween, 0.0f, 1.0f, 0.15f); + if (this->shopItemSelectedTween <= 0.15f) { + this->shopItemSelectedTween = 0.0f; + } + EnFsn_PositionSelectedItem(this); + if (this->shopItemSelectedTween == 0.0f) { + return true; + } + return false; +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Fsn_0x80AE1B70/func_80AE3BC4.asm") +void EnFsn_UpdateItemSelectedProperty(EnFsn* this) { + EnGirlA** items; + s32 i; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Fsn_0x80AE1B70/func_80AE3CF0.asm") + for (items = this->items, i = 0; i < this->totalSellingItems; items++, i++) { + if (this->actionFunc != EnFsn_SelectItem && this->actionFunc != EnFsn_PlayerCannotBuy && this->drawCursor == 0) { + (*items)->isSelected = false; + } else { + (*items)->isSelected = (i == this->cursorIdx) ? true : false; + } + } +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Fsn_0x80AE1B70/func_80AE3D50.asm") +void EnFsn_UpdateCursorAnim(EnFsn* this) { + f32 t = this->cursorAnimTween; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Fsn_0x80AE1B70/func_80AE3E4C.asm") + if (this->cursorAnimState == 0) { + t += 0.05f; + if (t >= 1.0f) { + t = 1.0f; + this->cursorAnimState = 1; + } + } else { + t -= 0.05f; + if (t <= 0.0f) { + t = 0.0f; + this->cursorAnimState = 0; + } + } + this->cursorColorR = COL_CHAN_MIX(0, 0.0f, t); + this->cursorColorG = COL_CHAN_MIX(80, 80.0f, t); + this->cursorColorB = COL_CHAN_MIX(255, 0.0f, t); + this->cursorColorA = COL_CHAN_MIX(255, 0.0f, t); + this->cursorAnimTween = t; +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Fsn_0x80AE1B70/func_80AE3F40.asm") +void EnFsn_UpdateStickDirectionPromptAnim(EnFsn* this) { + f32 arrowAnimTween = this->arrowAnimTween; + f32 stickAnimTween = this->stickAnimTween; + s32 maxColor = 255; + f32 tmp; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Fsn_0x80AE1B70/func_80AE4028.asm") + if (this->arrowAnimState == 0) { + arrowAnimTween += 0.05f; + if (arrowAnimTween > 1.0f) { + arrowAnimTween = 1.0f; + this->arrowAnimState = 1; + } + } else { + arrowAnimTween -= 0.05f; + if (arrowAnimTween < 0.0f) { + arrowAnimTween = 0.0f; + this->arrowAnimState = 0; + } + } + this->arrowAnimTween = arrowAnimTween; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Fsn_0x80AE1B70/func_80AE4120.asm") + if (this->stickAnimState == 0) { + stickAnimTween += 0.1f; + if (stickAnimTween > 1.0f) { + stickAnimTween = 1.0f; + this->stickAnimState = 1; + } + } else { + stickAnimTween = 0.0f; + this->stickAnimState = 0; + } -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Fsn_0x80AE1B70/func_80AE41FC.asm") + tmp = 155.0f * arrowAnimTween; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Fsn_0x80AE1B70/func_80AE4424.asm") + this->stickAnimTween = stickAnimTween; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Fsn_0x80AE1B70/func_80AE44DC.asm") + this->stickLeftPrompt.arrowColorR = COL_CHAN_MIX(255, 155.0f, arrowAnimTween); + this->stickLeftPrompt.arrowColorG = COL_CHAN_MIX(maxColor, 155.0f, arrowAnimTween); + this->stickLeftPrompt.arrowColorB = COL_CHAN_MIX(0, -100, arrowAnimTween); + this->stickLeftPrompt.arrowColorA = COL_CHAN_MIX(200, 50.0f, arrowAnimTween); -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Fsn_0x80AE1B70/func_80AE45C4.asm") + this->stickRightPrompt.arrowColorR = (maxColor - ((s32)tmp)) & 0xFF; + this->stickRightPrompt.arrowColorG = (255 - ((s32)tmp)) & 0xFF; + this->stickRightPrompt.arrowColorB = COL_CHAN_MIX(0, -100.0f, arrowAnimTween); + this->stickRightPrompt.arrowColorA = COL_CHAN_MIX(200, 50.0f, arrowAnimTween); -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Fsn_0x80AE1B70/func_80AE4638.asm") + this->stickRightPrompt.arrowTexX = 290.0f; + this->stickLeftPrompt.arrowTexX = 33.0f; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Fsn_0x80AE1B70/func_80AE4828.asm") + this->stickRightPrompt.stickTexX = 274.0f; + this->stickRightPrompt.stickTexX += 8.0f * stickAnimTween; + this->stickLeftPrompt.stickTexX = 49.0f; + this->stickLeftPrompt.stickTexX -= 8.0f * stickAnimTween; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Fsn_0x80AE1B70/func_80AE4A1C.asm") + this->stickLeftPrompt.arrowTexY = this->stickRightPrompt.arrowTexY = 91.0f; + this->stickLeftPrompt.stickTexY = this->stickRightPrompt.stickTexY = 95.0f; +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Fsn_0x80AE1B70/func_80AE4B20.asm") +void EnFsn_InitShop(EnFsn* this, GlobalContext* globalCtx) { + EnFsn* this2; + s32 maxColor = 255; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Fsn_0x80AE1B70/func_80AE4B70.asm") + if (EnFsn_HasItemsToSell()) { + EnFsn_SpawnShopItems(this, globalCtx); -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Fsn_0x80AE1B70/func_80AE4BF4.asm") + this2 = this; + this2->cursorX = 100.0f; + this2->cursorY = 100.0f; + this2->stickAccumY = 0; + this2->stickAccumX = 0; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Fsn_0x80AE1B70/func_80AE4CD8.asm") + this->cursorZ = 1.2f; + this->cursorColorR = 0; + this->cursorColorG = 80; + this->cursorColorB = maxColor; + this->cursorColorA = maxColor; + this->cursorAnimState = 0; + this->drawCursor = 0; + this->cursorAnimTween = 0.0f; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Fsn_0x80AE1B70/func_80AE4D28.asm") + this->stickLeftPrompt.stickColorR = 200; + this->stickLeftPrompt.stickColorG = 200; + this->stickLeftPrompt.stickColorB = 200; + this->stickLeftPrompt.stickColorA = 180; + this->stickLeftPrompt.stickTexX = 49.0f; + this->stickLeftPrompt.stickTexY = 95.0f; + this->stickLeftPrompt.arrowColorR = maxColor; + this->stickLeftPrompt.arrowColorG = maxColor; + this->stickLeftPrompt.arrowColorB = 0; + this->stickLeftPrompt.arrowColorA = 200; + this->stickLeftPrompt.arrowTexX = 33.0f; + this->stickLeftPrompt.arrowTexY = 91.0f; + this->stickLeftPrompt.texZ = 1.0f; + this->stickLeftPrompt.isEnabled = 0; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Fsn_0x80AE1B70/EnFsn_Init.asm") + this->stickRightPrompt.stickColorR = 200; + this->stickRightPrompt.stickColorG = 200; + this->stickRightPrompt.stickColorB = 200; + this->stickRightPrompt.stickColorA = 180; + this->stickRightPrompt.stickTexX = 274.0f; + this->stickRightPrompt.stickTexY = 95.0f; + this->stickRightPrompt.arrowColorR = maxColor; + this->stickRightPrompt.arrowColorG = 0; + this->stickRightPrompt.arrowColorB = 0; + this->stickRightPrompt.arrowColorA = 200; + this->stickRightPrompt.arrowTexX = 290.0f; + this->stickRightPrompt.arrowTexY = 91.0f; + this->stickRightPrompt.texZ = 1.0f; + this->stickRightPrompt.isEnabled = 0; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Fsn_0x80AE1B70/EnFsn_Destroy.asm") + this->arrowAnimState = 0; + this->stickAnimState = 0; + this->stickAnimTween = this->arrowAnimTween = 0.0f; + } + this->blinkTimer = 20; + this->animationIdx = 4; + this->eyeTextureIdx = 0; + func_8013BC6C(&this->skelAnime, sAnimations, this->animationIdx); + this->actionFunc = EnFsn_Idle; +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Fsn_0x80AE1B70/EnFsn_Update.asm") +void EnFsn_Idle(EnFsn* this, GlobalContext* globalCtx) { + Player* player = PLAYER; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Fsn_0x80AE1B70/func_80AE502C.asm") + if (this->animationIdx == 4) { + s16 curFrame = this->skelAnime.animCurrentFrame; + s16 frameCount = SkelAnime_GetFrameCount(&sAnimations[this->animationIdx].animationSeg->common); + if (curFrame == frameCount) { + this->animationIdx = 5; + func_8013BC6C(&this->skelAnime, sAnimations, this->animationIdx); + } + } else if (this->flags & ENFSN_HAGGLE) { + dummy:; + this->actionFunc = EnFsn_Haggle; + } else { + dummy2:; + if (func_800B84D0(&this->actor, globalCtx)) { + if (this->cutsceneState == 0) { + if (ActorCutscene_GetCurrentIndex() == 0x7C) { + ActorCutscene_Stop(0x7C); + } + this->cutscene = this->lookToShopkeeperCutscene; + ActorCutscene_SetIntentToPlay(this->cutscene); + this->cutsceneState = 1; + } + this->actor.textId = EnFsn_GetWelcome(globalCtx); + func_801518B0(globalCtx, this->actor.textId, &this->actor); + player->actor.world.pos.x = 1.0f; + player->actor.world.pos.z = -34.0f; + this->actionFunc = EnFsn_BeginInteraction; + } else if (((player->actor.world.pos.x >= -50.0f) && (player->actor.world.pos.x <= 15.0f)) && + (player->actor.world.pos.y > 0.0f) && + ((player->actor.world.pos.z >= -35.0f) && (player->actor.world.pos.z <= -20.0f))) { + func_800B8614(&this->actor, globalCtx, 400.0f); + } + } +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Fsn_0x80AE1B70/func_80AE52A4.asm") +void EnFsn_Haggle(EnFsn* this, GlobalContext* globalCtx) { + s16 curFrame = this->skelAnime.animCurrentFrame; + s16 frameCount = SkelAnime_GetFrameCount(&sAnimations[this->animationIdx].animationSeg->common); -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Fsn_0x80AE1B70/func_80AE5440.asm") + if (this->flags & ENFSN_ANGRY) { + this->flags &= ~ENFSN_ANGRY; + this->animationIdx = 11; + func_8013BC6C(&this->skelAnime, sAnimations, this->animationIdx); + } else { + if (this->animationIdx == 11 && func_801378B8(&this->skelAnime, 18.0f)) { + Audio_PlayActorSound2(&this->actor, NA_SE_EV_HANKO); + } + if (this->flags & ENFSN_CALM_DOWN) { + this->flags &= ~ENFSN_CALM_DOWN; + this->animationIdx = 5; + func_8013BC6C(&this->skelAnime, sAnimations, this->animationIdx); + } else if (this->flags & ENFSN_OFFER_FINAL_PRICE) { + this->flags &= ~ENFSN_OFFER_FINAL_PRICE; + this->animationIdx = 12; + func_8013BC6C(&this->skelAnime, sAnimations, this->animationIdx); + } else { + if (this->animationIdx == 12) { + if (curFrame == frameCount) { + this->animationIdx = 5; + func_8013BC6C(&this->skelAnime, sAnimations, this->animationIdx); + } else { + if (func_801378B8(&this->skelAnime, 28.0f)) { + Audio_PlayActorSound2(&this->actor, NA_SE_EV_HANKO); + } + return; + } + } + if (!(this->flags & ENFSN_HAGGLE)) { + this->actionFunc = EnFsn_Idle; + } + } + } +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Fsn_0x80AE1B70/func_80AE57E8.asm") +void EnFsn_BeginInteraction(EnFsn* this, GlobalContext* globalCtx) { + if (this->cutsceneState == 1) { + if (ActorCutscene_GetCanPlayNext(this->cutscene)) { + ActorCutscene_StartAndSetFlag(this->cutscene, &this->actor); + this->cutsceneState = 2; + if (Player_GetMask(globalCtx) == PLAYER_MASK_NONE) { + func_8011552C(globalCtx, 16); + if (EnFsn_HasItemsToSell()) { + this->actionFunc = EnFsn_AskBuyOrSell; + } else { + this->isSelling = false; + this->actionFunc = EnFsn_StartBuying; + } + } else { + this->actionFunc = EnFsn_SetupEndInteractionImmediately; + } + } else { + ActorCutscene_SetIntentToPlay(this->cutscene); + } + } +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Fsn_0x80AE1B70/func_80AE5910.asm") +void EnFsn_StartBuying(EnFsn* this, GlobalContext* globalCtx) { + u8 talkState = func_80152498(&globalCtx->msgCtx); + Player* player = PLAYER; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Fsn_0x80AE1B70/EnFsn_Draw.asm") + EnFsn_HandleLookToShopkeeperBuyingCutscene(this); + if (talkState == 5 && func_80147624(globalCtx)) { + switch (this->actor.textId) { + case 0x29CC: + this->actor.textId = 0x29CD; + func_801518B0(globalCtx, this->actor.textId, &this->actor); + break; + case 0x29CD: + this->actor.textId = 0x29CE; + EnFsn_HandleLookToShopkeeperBuyingCutscene(this); + func_801518B0(globalCtx, this->actor.textId, &this->actor); + break; + case 0x29CE: + this->actor.textId = 0xFF; + func_801518B0(globalCtx, this->actor.textId, &this->actor); + this->actionFunc = EnFsn_DeterminePrice; + break; + case 0x29CF: + player->unk_A87 = 0; + this->actionFunc = EnFsn_SetupDeterminePrice; + break; + } + } +} + +void EnFsn_AskBuyOrSell(EnFsn* this, GlobalContext* globalCtx) { + u8 talkState = func_80152498(&globalCtx->msgCtx); + + if (talkState == 5) { + if (func_80147624(globalCtx)) { + switch (this->actor.textId) { + case 0x29CC: + if (CURRENT_DAY != 3) { + this->actor.textId = 0x29FA; + } else { + this->actor.textId = 0x29D2; + } + func_801518B0(globalCtx, this->actor.textId, &this->actor); + break; + case 0x29D2: + if (gSaveContext.weekEventReg[0x21] & 4) { + this->actor.textId = 0x2A01; + } else if (!(gSaveContext.weekEventReg[0x21] & 8) && !(gSaveContext.weekEventReg[0x4F] & 0x40)) { + this->actor.textId = 0x29D3; + } else { + this->actor.textId = 0x29D4; + } + func_801518B0(globalCtx, this->actor.textId, &this->actor); + break; + case 0x29D3: + case 0x29D4: + case 0x29FA: + case 0x2A01: + this->actor.textId = 0x29D5; + func_801518B0(globalCtx, this->actor.textId, &this->actor); + break; + } + } + } else if (talkState == 4) { + func_8011552C(globalCtx, 6); + if (!EnFsn_TestEndInteraction(this, globalCtx, CONTROLLER1(globalCtx)) && func_80147624(globalCtx)) { + u32 trueTmp = true; + switch (globalCtx->msgCtx.choiceIndex) { + case 0: + func_8019F208(); + this->isSelling = trueTmp; + this->stickLeftPrompt.isEnabled = false; + this->stickRightPrompt.isEnabled = trueTmp; + this->actor.textId = 0x29D6; + func_801518B0(globalCtx, this->actor.textId, &this->actor); + this->actionFunc = EnFsn_FaceShopkeeperSelling; + break; + case 1: + func_8019F208(); + this->isSelling = false; + this->actor.textId = 0x29CE; + EnFsn_HandleLookToShopkeeperBuyingCutscene(this); + func_801518B0(globalCtx, this->actor.textId, &this->actor); + this->actionFunc = EnFsn_StartBuying; + break; + } + } + } +} + +void EnFsn_SetupDeterminePrice(EnFsn* this, GlobalContext* globalCtx) { + if (func_800B84D0(&this->actor, globalCtx)) { + this->actor.textId = 0xFF; + func_801518B0(globalCtx, this->actor.textId, &this->actor); + this->actionFunc = EnFsn_DeterminePrice; + } +} + +void EnFsn_DeterminePrice(EnFsn* this, GlobalContext* globalCtx) { + Player* player = PLAYER; + s32 itemGiven; + u8 buttonItem; + + if (func_80152498(&globalCtx->msgCtx) == 16) { + itemGiven = func_80123810(globalCtx); + if (itemGiven > 0) { + if (player->heldItemButton == 0) { + buttonItem = + gSaveContext.equips + .buttonItems[(gSaveContext.playerForm == PLAYER_FORM_HUMAN) ? 0 : gSaveContext.playerForm] + [player->heldItemButton]; + } else { + buttonItem = gSaveContext.equips.buttonItems[0][player->heldItemButton]; + } + this->price = (buttonItem < 40) ? gItemPrices[buttonItem] : 0; + if (this->price > 0) { + player->actor.textId = 0x29EF; + player->unk_A87 = buttonItem; + this->actionFunc = EnFsn_MakeOffer; + } else { + player->actor.textId = 0x29CF; + this->actionFunc = EnFsn_StartBuying; + } + this->actor.textId = player->actor.textId; + func_801477B4(globalCtx); + } else if (itemGiven < 0) { + if (CURRENT_DAY == 3) { + this->actor.textId = 0x29DF; + } else { + this->actor.textId = 0x29D1; + } + func_801518B0(globalCtx, this->actor.textId, &this->actor); + func_80151BB4(globalCtx, 3); + this->actionFunc = EnFsn_SetupEndInteraction; + } + } +} + +void EnFsn_MakeOffer(EnFsn* this, GlobalContext* globalCtx) { + u8 talkState = func_80152498(&globalCtx->msgCtx); + Player* player = PLAYER; + + if (talkState == 4 && func_80147624(globalCtx)) { + switch (globalCtx->msgCtx.choiceIndex) { + case 0: + func_8019F208(); + globalCtx->msgCtx.unk11F22 = 0x43; + globalCtx->msgCtx.unk12023 = 4; + if (this->cutsceneState == 2) { + ActorCutscene_Stop(this->cutscene); + this->cutsceneState = 0; + } + switch (this->price) { + case 5: + this->getItemId = GI_RUPEE_BLUE; + break; + case 10: + this->getItemId = GI_RUPEE_10; + break; + case 20: + this->getItemId = GI_RUPEE_RED; + break; + case 50: + this->getItemId = GI_RUPEE_PURPLE; + break; + case 200: + this->getItemId = GI_RUPEE_GOLD; + break; + } + this->actionFunc = EnFsn_GiveItem; + break; + case 1: + func_8019F230(); + player->unk_A87 = 0; + this->actionFunc = EnFsn_SetupDeterminePrice; + break; + } + } +} + +void EnFsn_GiveItem(EnFsn* this, GlobalContext* globalCtx) { + if (Actor_HasParent(&this->actor, globalCtx)) { + if (this->isSelling == true && this->items[this->cursorIdx]->getItemId == GI_MASK_ALL_NIGHT) { + func_80151BB4(globalCtx, 45); + func_80151BB4(globalCtx, 3); + } + this->actor.parent = NULL; + if (ENFSN_IS_SHOP(&this->actor) && !this->isSelling) { + func_80123D50(globalCtx, PLAYER, 18, 21); + } + this->actionFunc = EnFsn_SetupResumeInteraction; + } else if (this->isSelling == true) { + func_800B8A1C(&this->actor, globalCtx, this->items[this->cursorIdx]->getItemId, 300.0f, 300.0f); + } else { + func_800B8A1C(&this->actor, globalCtx, this->getItemId, 300.0f, 300.0f); + } +} + +void EnFsn_SetupResumeInteraction(EnFsn* this, GlobalContext* globalCtx) { + if (((void)0, gSaveContext.inventory.questItems) & gBitFlags[18]) { + if (globalCtx->msgCtx.unk120B1 == 0) { + EnFsn_HandleSetupResumeInteraction(this, globalCtx); + } + } else { + EnFsn_HandleSetupResumeInteraction(this, globalCtx); + } +} + +void EnFsn_ResumeInteraction(EnFsn* this, GlobalContext* globalCtx) { + if (func_800B84D0(&this->actor, globalCtx)) { + if (ENFSN_IS_SHOP(&this->actor)) { + if (!this->isSelling) { + this->cutscene = this->lookToShopkeeperBuyingCutscene; + this->actor.textId = 0x29D0; + } else { + this->cutscene = this->lookToShopkeeperCutscene; + this->actor.textId = (this->numSellingItems <= 0) ? 0x29DE : 0x29D6; + } + func_801518B0(globalCtx, this->actor.textId, &this->actor); + if (ActorCutscene_GetCurrentIndex() == 0x7C) { + ActorCutscene_Stop(0x7C); + } + ActorCutscene_SetIntentToPlay(this->cutscene); + this->actionFunc = EnFsn_ResumeShoppingInteraction; + } else { + EnFsn_HandleConversationBackroom(this, globalCtx); + this->actionFunc = EnFsn_ConverseBackroom; + } + } else { + func_800B85E0(&this->actor, globalCtx, 400.0f, -1); + } +} + +void EnFsn_ResumeShoppingInteraction(EnFsn* this, GlobalContext* globalCtx) { + if (this->cutsceneState == 0) { + if (ActorCutscene_GetCanPlayNext(this->cutscene)) { + ActorCutscene_StartAndSetFlag(this->cutscene, &this->actor); + this->cutsceneState = 2; + if (!this->isSelling) { + this->actionFunc = EnFsn_AskCanBuyMore; + } else if (this->actor.textId != 0x29D6) { + this->actionFunc = EnFsn_AskCanBuyAterRunningOutOfItems; + } else { + func_8011552C(globalCtx, 6); + this->stickLeftPrompt.isEnabled = false; + this->stickRightPrompt.isEnabled = true; + this->actionFunc = EnFsn_FaceShopkeeperSelling; + } + } else { + if (ActorCutscene_GetCurrentIndex() == 0x7C) { + ActorCutscene_Stop(0x7C); + } + this->cutscene = !this->isSelling ? this->lookToShopkeeperBuyingCutscene : this->lookToShopkeeperCutscene; + ActorCutscene_SetIntentToPlay(this->cutscene); + } + } +} + +void EnFsn_LookToShelf(EnFsn* this, GlobalContext* globalCtx) { + if (this->cutsceneState == 2) { + ActorCutscene_Stop(this->cutscene); + if (ActorCutscene_GetCurrentIndex() == 0x7C) { + ActorCutscene_Stop(0x7C); + } + this->cutscene = this->lookToShelfCutscene; + ActorCutscene_SetIntentToPlay(this->cutscene); + this->cutsceneState = 1; + } else if (this->cutsceneState == 1) { + if (ActorCutscene_GetCanPlayNext(this->cutscene) != 0) { + ActorCutscene_StartAndSetFlag(this->cutscene, &this->actor); + this->cutsceneState = 2; + EnFsn_UpdateCursorPos(this, globalCtx); + this->actionFunc = EnFsn_BrowseShelf; + func_80151938(globalCtx, this->items[this->cursorIdx]->actor.textId); + } else { + ActorCutscene_SetIntentToPlay(this->cutscene); + } + } +} + +void EnFsn_BrowseShelf(EnFsn* this, GlobalContext* globalCtx) { + u8 talkstate = func_80152498(&globalCtx->msgCtx); + s32 pad; + u8 prevCursorIdx = this->cursorIdx; + + if (!EnFsn_ReturnItemToShelf(this)) { + this->delayTimer = 3; + } else if (this->delayTimer != 0) { + this->delayTimer--; + } else { + this->drawCursor = 0xFF; + this->stickLeftPrompt.isEnabled = true; + EnFsn_UpdateCursorPos(this, globalCtx); + if (talkstate == 5) { + func_8011552C(globalCtx, 6); + if (!EnFsn_HasPlayerSelectedItem(this, globalCtx, CONTROLLER1(globalCtx))) { + EnFsn_CursorLeftRight(this); + if (this->cursorIdx != prevCursorIdx) { + play_sound(NA_SE_SY_CURSOR); + func_80151938(globalCtx, this->items[this->cursorIdx]->actor.textId); + } + } + } + } +} + +void EnFsn_LookToShopkeeperFromShelf(EnFsn* this, GlobalContext* globalCtx) { + if (this->cutsceneState == 2) { + ActorCutscene_Stop(this->cutscene); + if (ActorCutscene_GetCurrentIndex() == 0x7C) { + ActorCutscene_Stop(0x7C); + } + this->cutscene = this->lookToShopkeeperFromShelfCutscene; + ActorCutscene_SetIntentToPlay(this->cutscene); + this->cutsceneState = 1; + } else if (this->cutsceneState == 1) { + if (ActorCutscene_GetCanPlayNext(this->cutscene)) { + ActorCutscene_StartAndSetFlag(this->cutscene, &this->actor); + this->cutsceneState = 2; + this->stickLeftPrompt.isEnabled = false; + this->stickRightPrompt.isEnabled = true; + this->actor.textId = 0x29D6; + func_80151938(globalCtx, this->actor.textId); + this->actionFunc = EnFsn_FaceShopkeeperSelling; + } else { + ActorCutscene_SetIntentToPlay(this->cutscene); + } + } +} + +void EnFsn_HandleCanPlayerBuyItem(EnFsn* this, GlobalContext* globalCtx) { + EnGirlA* item = this->items[this->cursorIdx]; + + switch (item->canBuyFunc(globalCtx, item)) { + case CANBUY_RESULT_SUCCESS_2: + func_8019F208(); + gSaveContext.weekEventReg[0x21] |= 4; + case CANBUY_RESULT_SUCCESS_1: + if (this->cutsceneState == 2) { + ActorCutscene_Stop(this->cutscene); + this->cutsceneState = 0; + } + func_8019F208(); + item = this->items[this->cursorIdx]; + item->buyFanfareFunc(globalCtx, item); + func_800B8A1C(&this->actor, globalCtx, this->items[this->cursorIdx]->getItemId, 300.0f, 300.0f); + globalCtx->msgCtx.unk11F22 = 0x43; + globalCtx->msgCtx.unk12023 = 4; + Interface_ChangeAlpha(50); + this->drawCursor = 0; + this->shopItemSelectedTween = 0.0f; + item = this->items[this->cursorIdx]; + item->boughtFunc(globalCtx, item); + if (this->stolenItem1 == this->cursorIdx) { + gSaveContext.roomInf[126][5] &= ~0xFF000000; + } else if (this->stolenItem2 == this->cursorIdx) { + gSaveContext.roomInf[126][5] &= ~0xFF0000; + } + this->numSellingItems--; + this->itemIds[this->cursorIdx] = -1; + this->actionFunc = EnFsn_GiveItem; + break; + case CANBUY_RESULT_NEED_RUPEES: + play_sound(NA_SE_SY_ERROR); + func_80151938(globalCtx, 0x29F0); + this->actionFunc = EnFsn_PlayerCannotBuy; + break; + case CANBUY_RESULT_CANNOT_GET_NOW: + play_sound(NA_SE_SY_ERROR); + func_80151938(globalCtx, 0x29DD); + this->actionFunc = EnFsn_PlayerCannotBuy; + break; + } +} + +void EnFsn_SetupEndInteraction(EnFsn* this, GlobalContext* globalCtx) { + u8 talkState = func_80152498(&globalCtx->msgCtx); + + if ((talkState == 5 || talkState == 6) && func_80147624(globalCtx)) { + if (((void)0, gSaveContext.inventory.questItems) & gBitFlags[18]) { + if (globalCtx->msgCtx.unk120B1 == 0) { + EnFsn_EndInteraction(this, globalCtx); + } else { + globalCtx->msgCtx.unk11F22 = 0x43; + globalCtx->msgCtx.unk12023 = 4; + } + } else { + EnFsn_EndInteraction(this, globalCtx); + } + } +} + +void EnFsn_SelectItem(EnFsn* this, GlobalContext* globalCtx) { + u8 talkState = func_80152498(&globalCtx->msgCtx); + + if (EnFsn_TakeItemOffShelf(this) && talkState == 4) { + func_8011552C(globalCtx, 6); + if (!EnFsn_TestCancelOption(this, globalCtx, CONTROLLER1(globalCtx)) && func_80147624(globalCtx)) { + switch (globalCtx->msgCtx.choiceIndex) { + case 0: + EnFsn_HandleCanPlayerBuyItem(this, globalCtx); + break; + case 1: + func_8019F230(); + this->actionFunc = this->tmpActionFunc; + func_80151938(globalCtx, this->items[this->cursorIdx]->actor.textId); + } + } + } +} + +void EnFsn_PlayerCannotBuy(EnFsn* this, GlobalContext* globalCtx) { + if (func_80152498(&globalCtx->msgCtx) == 5 && func_80147624(globalCtx)) { + this->actionFunc = this->tmpActionFunc; + func_80151938(globalCtx, this->items[this->cursorIdx]->actor.textId); + } +} + +void EnFsn_AskCanBuyMore(EnFsn* this, GlobalContext* globalCtx) { + u8 talkState = func_80152498(&globalCtx->msgCtx); + + if (this->cutsceneState == 0) { + if (ActorCutscene_GetCanPlayNext(this->cutscene)) { + ActorCutscene_StartAndSetFlag(this->cutscene, &this->actor); + this->cutsceneState = 2; + } else { + if (ActorCutscene_GetCurrentIndex() == 0x7C) { + ActorCutscene_Stop(0x7C); + } + this->cutscene = this->lookToShopkeeperCutscene; + ActorCutscene_SetIntentToPlay(this->cutscene); + } + } + if (talkState == 4) { + if (func_80147624(globalCtx)) { + switch (globalCtx->msgCtx.choiceIndex) { + case 0: + func_8019F208(); + this->actor.textId = 0xFF; + func_801518B0(globalCtx, this->actor.textId, &this->actor); + this->actionFunc = EnFsn_DeterminePrice; + break; + case 1: + func_8019F230(); + this->actor.textId = (CURRENT_DAY == 3) ? 0x29DF : 0x29D1; + func_801518B0(globalCtx, this->actor.textId, &this->actor); + func_80151BB4(globalCtx, 3); + break; + } + } + } else if ((talkState == 5 || talkState == 6) && func_80147624(globalCtx)) { + if (((void)0, gSaveContext.inventory.questItems) & gBitFlags[18]) { + if (globalCtx->msgCtx.unk120B1 == 0) { + EnFsn_EndInteraction(this, globalCtx); + } else { + globalCtx->msgCtx.unk11F22 = 0x43; + globalCtx->msgCtx.unk12023 = 4; + } + } else { + EnFsn_EndInteraction(this, globalCtx); + } + } +} + +void EnFsn_AskCanBuyAterRunningOutOfItems(EnFsn* this, GlobalContext* globalCtx) { + u8 talkState = func_80152498(&globalCtx->msgCtx); + + if (this->cutsceneState == 0) { + if (ActorCutscene_GetCanPlayNext(this->cutscene)) { + ActorCutscene_StartAndSetFlag(this->cutscene, &this->actor); + this->cutsceneState = 2; + } else { + if (ActorCutscene_GetCurrentIndex() == 0x7C) { + ActorCutscene_Stop(0x7C); + } + this->cutscene = this->lookToShopkeeperCutscene; + ActorCutscene_SetIntentToPlay(this->cutscene); + } + } + if (talkState == 4) { + if (func_80147624(globalCtx)) { + switch (globalCtx->msgCtx.choiceIndex) { + case 0: + func_8019F208(); + this->isSelling = false; + this->actor.textId = 0x29CE; + func_801518B0(globalCtx, this->actor.textId, &this->actor); + this->actionFunc = EnFsn_StartBuying; + break; + case 1: + func_8019F230(); + this->actor.textId = (CURRENT_DAY == 3) ? 0x29DF : 0x29D1; + func_801518B0(globalCtx, this->actor.textId, &this->actor); + func_80151BB4(globalCtx, 3); + break; + } + } + } else if ((talkState == 5 || talkState == 6) && func_80147624(globalCtx)) { + if (((void)0, gSaveContext.inventory.questItems) & gBitFlags[18]) { + if (globalCtx->msgCtx.unk120B1 == 0) { + EnFsn_EndInteraction(this, globalCtx); + } else { + globalCtx->msgCtx.unk11F22 = 0x43; + globalCtx->msgCtx.unk12023 = 4; + } + } else { + EnFsn_EndInteraction(this, globalCtx); + } + } +} + +void EnFsn_FaceShopkeeperSelling(EnFsn* this, GlobalContext* globalCtx) { + u8 talkState = func_80152498(&globalCtx->msgCtx); + u8 cursorIdx; + + if (talkState == 4) { + func_8011552C(globalCtx, 6); + if (!EnFsn_TestEndInteraction(this, globalCtx, CONTROLLER1(globalCtx)) && + (!func_80147624(globalCtx) || !EnFsn_FacingShopkeeperDialogResult(this, globalCtx)) && + this->stickAccumX > 0) { + cursorIdx = EnFsn_SetCursorIndexFromNeutral(this); + if (cursorIdx != CURSOR_INVALID) { + this->cursorIdx = cursorIdx; + this->actionFunc = EnFsn_LookToShelf; + func_8011552C(globalCtx, 6); + this->stickRightPrompt.isEnabled = false; + play_sound(NA_SE_SY_CURSOR); + } + } + } else if (talkState == 5 && func_80147624(globalCtx)) { + this->actor.textId = 0x29D6; + func_801518B0(globalCtx, this->actor.textId, &this->actor); + if (globalCtx) {} + } +} + +void EnFsn_SetupEndInteractionImmediately(EnFsn* this, GlobalContext* globalCtx) { + if (func_80152498(&globalCtx->msgCtx) == 5 && func_80147624(globalCtx)) { + EnFsn_EndInteraction(this, globalCtx); + } +} + +void EnFsn_IdleBackroom(EnFsn* this, GlobalContext* globalCtx) { + if (func_800B84D0(&this->actor, globalCtx)) { + this->textId = 0; + EnFsn_HandleConversationBackroom(this, globalCtx); + this->actionFunc = EnFsn_ConverseBackroom; + } else if (this->actor.xzDistToPlayer < 100.0f || this->actor.isTargeted) { + func_800B8614(&this->actor, globalCtx, 100.0f); + } +} + +void EnFsn_ConverseBackroom(EnFsn* this, GlobalContext* globalCtx) { + if (func_80152498(&globalCtx->msgCtx) == 5 && func_80147624(globalCtx)) { + if (this->flags & ENFSN_END_CONVERSATION) { + this->flags &= ~ENFSN_END_CONVERSATION; + globalCtx->msgCtx.unk11F22 = 0x43; + globalCtx->msgCtx.unk12023 = 4; + this->actionFunc = EnFsn_IdleBackroom; + } else if (this->flags & ENFSN_GIVE_ITEM) { + this->flags &= ~ENFSN_GIVE_ITEM; + globalCtx->msgCtx.unk11F22 = 0x43; + globalCtx->msgCtx.unk12023 = 4; + this->actionFunc = EnFsn_GiveItem; + } else { + EnFsn_HandleConversationBackroom(this, globalCtx); + } + } +} + +void EnFsn_GetCutscenes(EnFsn* this) { + this->lookToShopkeeperCutscene = this->actor.cutscene; + this->lookToShelfCutscene = ActorCutscene_GetAdditionalCutscene(this->lookToShopkeeperCutscene); + this->lookToShopkeeperFromShelfCutscene = ActorCutscene_GetAdditionalCutscene(this->lookToShelfCutscene); + this->lookToShopkeeperBuyingCutscene = ActorCutscene_GetAdditionalCutscene(this->lookToShopkeeperFromShelfCutscene); +} + +void EnFsn_Blink(EnFsn* this) { + s16 decr = this->blinkTimer - 1; + + if (decr >= 3) { + this->eyeTextureIdx = 0; + this->blinkTimer = decr; + } else if (decr == 0) { + this->eyeTextureIdx = 2; + this->blinkTimer = (s32)(Rand_ZeroOne() * 60.0f) + 20; + } else { + this->eyeTextureIdx = 1; + this->blinkTimer = decr; + } +} + +void EnFsn_Init(Actor* thisx, GlobalContext* globalCtx) { + EnFsn* this = THIS; + s32 pad; + + ActorShape_Init(&this->actor.shape, 0.0f, func_800B3FC0, 20.0f); + SkelAnime_InitSV(globalCtx, &this->skelAnime, &D_06013320, &D_06012C34, this->limbDrawTable, + this->transitionDrawTable, 19); + if (ENFSN_IS_SHOP(&this->actor)) { + this->actor.shape.rot.y = BINANG_ROT180(this->actor.shape.rot.y); + this->actor.flags &= ~1; + EnFsn_GetCutscenes(this); + EnFsn_InitShop(this, globalCtx); + } else { + if ((gSaveContext.weekEventReg[0x21] & 8) || (gSaveContext.weekEventReg[0x4F] & 0x40)) { + Actor_MarkForDeath(&this->actor); + return; + } + Collider_InitCylinder(globalCtx, &this->collider); + Collider_InitAndSetCylinder(globalCtx, &this->collider, &this->actor, &sCylinderInit); + this->blinkTimer = 20; + this->eyeTextureIdx = 0; + this->actor.flags |= 1; + this->actor.targetMode = 0; + this->animationIdx = 0; + func_8013BC6C(&this->skelAnime, sAnimations, this->animationIdx); + this->actionFunc = EnFsn_IdleBackroom; + } +} + +void EnFsn_Destroy(Actor* thisx, GlobalContext* globalCtx) { + EnFsn* this = THIS; + + Collider_DestroyCylinder(globalCtx, &this->collider); +} + +void EnFsn_Update(Actor* thisx, GlobalContext* globalCtx) { + EnFsn* this = THIS; + + this->actionFunc(this, globalCtx); + Actor_SetVelocityAndMoveYRotationAndGravity(&this->actor); + func_800E9250(globalCtx, &this->actor, &this->headRot, &this->unk27A, this->actor.focus.pos); + func_8013D9C8(globalCtx, this->limbRotYTable, this->limbRotZTable, 19); + EnFsn_Blink(this); + if (ENFSN_IS_SHOP(&this->actor) && EnFsn_HasItemsToSell()) { + EnFsn_UpdateJoystickInputState(this, globalCtx); + EnFsn_UpdateItemSelectedProperty(this); + EnFsn_UpdateStickDirectionPromptAnim(this); + EnFsn_UpdateCursorAnim(this); + } + SkelAnime_FrameUpdateMatrix(&this->skelAnime); + if (ENFSN_IS_BACKROOM(&this->actor)) { + EnFsn_UpdateCollider(this, globalCtx); + } +} + +void EnFsn_DrawCursor(EnFsn* this, GlobalContext* globalCtx, f32 x, f32 y, f32 z, u8 drawCursor) { + s32 ulx, uly, lrx, lry; + f32 w; + s32 dsdx; + s32 pad; + + OPEN_DISPS(globalCtx->state.gfxCtx); + if (drawCursor != 0) { + func_8012C654(globalCtx->state.gfxCtx); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, this->cursorColorR, this->cursorColorG, this->cursorColorB, + this->cursorColorA); + gDPLoadTextureBlock_4b(OVERLAY_DISP++, &D_0401F740, G_IM_FMT_IA, 16, 16, 0, G_TX_MIRROR | G_TX_WRAP, + G_TX_MIRROR | G_TX_WRAP, 4, 4, G_TX_NOLOD, G_TX_NOLOD); + w = 16.0f * z; + ulx = (x - w) * 4.0f; + uly = (y - w + -12.0f) * 4.0f; + lrx = (x + w) * 4.0f; + lry = (y + w + -12.0f) * 4.0f; + dsdx = (1.0f / z) * 1024.0f; + gSPTextureRectangle(OVERLAY_DISP++, ulx, uly, lrx, lry, G_TX_RENDERTILE, 0, 0, dsdx, dsdx); + } + CLOSE_DISPS(globalCtx->state.gfxCtx); +} + +void EnFsn_DrawTextRec(GlobalContext* globalCtx, s32 r, s32 g, s32 b, s32 a, f32 x, f32 y, f32 z, s32 s, s32 t, f32 dx, + f32 dy) { + f32 unk; + s32 ulx, uly, lrx, lry; + f32 w, h; + s32 dsdx, dtdy; + + OPEN_DISPS(globalCtx->state.gfxCtx); + gDPPipeSync(OVERLAY_DISP++); + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, r, g, b, a); + + w = 8.0f * z; + ulx = (x - w) * 4.0f; + lrx = (x + w) * 4.0f; + + h = 12.0f * z; + uly = (y - h) * 4.0f; + lry = (y + h) * 4.0f; + + unk = 1024 * (1.0f / z); + dsdx = unk * dx; + dtdy = dy * unk; + + gSPTextureRectangle(OVERLAY_DISP++, ulx, uly, lrx, lry, G_TX_RENDERTILE, s, t, dsdx, dtdy); + CLOSE_DISPS(globalCtx->state.gfxCtx); +} + +void EnFsn_DrawStickDirectionPrompts(EnFsn* this, GlobalContext* globalCtx) { + s32 drawStickRightPrompt = this->stickLeftPrompt.isEnabled; + s32 drawStickLeftPrompt = this->stickRightPrompt.isEnabled; + + OPEN_DISPS(globalCtx->state.gfxCtx); + if (drawStickRightPrompt || drawStickLeftPrompt) { + func_8012C654(globalCtx->state.gfxCtx); + gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); + gDPSetTextureImage(OVERLAY_DISP++, G_IM_FMT_IA, G_IM_SIZ_16b, 1, &D_0401F8C0); + gDPSetTile(OVERLAY_DISP++, G_IM_FMT_IA, G_IM_SIZ_16b, 0, 0x0000, G_TX_LOADTILE, 0, G_TX_NOMIRROR | G_TX_WRAP, + G_TX_NOMASK, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_WRAP, 4, G_TX_NOLOD); + gDPLoadSync(OVERLAY_DISP++); + gDPLoadBlock(OVERLAY_DISP++, G_TX_LOADTILE, 0, 0, 191, 1024); + gDPPipeSync(OVERLAY_DISP++); + gDPSetTile(OVERLAY_DISP++, G_IM_FMT_IA, G_IM_SIZ_8b, 2, 0x0000, G_TX_RENDERTILE, 0, G_TX_NOMIRROR | G_TX_WRAP, + G_TX_NOMASK, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_WRAP, 4, G_TX_NOLOD); + gDPSetTileSize(OVERLAY_DISP++, G_TX_RENDERTILE, 0, 0, 15 * 4, 23 * 4); + if (drawStickRightPrompt) { + EnFsn_DrawTextRec(globalCtx, this->stickLeftPrompt.arrowColorR, this->stickLeftPrompt.arrowColorG, + this->stickLeftPrompt.arrowColorB, this->stickLeftPrompt.arrowColorA, + this->stickLeftPrompt.arrowTexX, this->stickLeftPrompt.arrowTexY, + this->stickLeftPrompt.texZ, 0, 0, -1.0f, 1.0f); + } + if (drawStickLeftPrompt) { + EnFsn_DrawTextRec(globalCtx, this->stickRightPrompt.arrowColorR, this->stickRightPrompt.arrowColorG, + this->stickRightPrompt.arrowColorB, this->stickRightPrompt.arrowColorA, + this->stickRightPrompt.arrowTexX, this->stickRightPrompt.arrowTexY, + this->stickRightPrompt.texZ, 0, 0, 1.0f, 1.0f); + } + gDPSetTextureImage(OVERLAY_DISP++, G_IM_FMT_IA, G_IM_SIZ_16b, 1, &D_0401F7C0); + gDPSetTile(OVERLAY_DISP++, G_IM_FMT_IA, G_IM_SIZ_16b, 0, 0x0000, G_TX_LOADTILE, 0, G_TX_NOMIRROR | G_TX_WRAP, + G_TX_NOMASK, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_WRAP, 4, G_TX_NOLOD); + gDPLoadSync(OVERLAY_DISP++); + gDPLoadBlock(OVERLAY_DISP++, G_TX_LOADTILE, 0, 0, 127, 1024); + gDPPipeSync(OVERLAY_DISP++); + gDPSetTile(OVERLAY_DISP++, G_IM_FMT_IA, G_IM_SIZ_8b, 2, 0x0000, G_TX_RENDERTILE, 0, G_TX_NOMIRROR | G_TX_WRAP, + G_TX_NOMASK, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_WRAP, 4, G_TX_NOLOD); + gDPSetTileSize(OVERLAY_DISP++, G_TX_RENDERTILE, 0, 0, 15 * 4, 15 * 4); + if (drawStickRightPrompt) { + EnFsn_DrawTextRec(globalCtx, this->stickLeftPrompt.stickColorR, this->stickLeftPrompt.stickColorG, + this->stickLeftPrompt.stickColorB, this->stickLeftPrompt.stickColorA, + this->stickLeftPrompt.stickTexX, this->stickLeftPrompt.stickTexY, + this->stickLeftPrompt.texZ, 0, 0, -1.0f, 1.0f); + } + if (drawStickLeftPrompt) { + EnFsn_DrawTextRec(globalCtx, this->stickRightPrompt.stickColorR, this->stickRightPrompt.stickColorG, + this->stickRightPrompt.stickColorB, this->stickRightPrompt.stickColorA, + this->stickRightPrompt.stickTexX, this->stickRightPrompt.stickTexY, + this->stickRightPrompt.texZ, 0, 0, 1.0f, 1.0f); + } + } + CLOSE_DISPS(globalCtx->state.gfxCtx); +} + +s32 EnFsn_OverrideLimbDraw(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) { + EnFsn* this = THIS; + s16 tmp; + s32 limbRotTableIdx; + + if (limbIndex == 16) { + SysMatrix_InsertXRotation_s(this->headRot.y, MTXMODE_APPLY); + } + if (ENFSN_IS_BACKROOM(&this->actor)) { + switch (limbIndex) { + case 8: + limbRotTableIdx = 0; + break; + case 11: + limbRotTableIdx = 1; + break; + case 16: + limbRotTableIdx = 2; + break; + default: + limbRotTableIdx = 9; + break; + } + if (limbRotTableIdx < 9) { + tmp = (s32)(Math_SinS(this->limbRotYTable[limbRotTableIdx]) * 200.0f); + rot->y += tmp; + tmp = (s32)(Math_CosS(this->limbRotZTable[limbRotTableIdx]) * 200.0f); + rot->z += tmp; + } + } + if (limbIndex == 17) { + *dList = NULL; + } + return 0; +} + +void EnFsn_PostLimbDraw(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) { + EnFsn* this = THIS; + + if (limbIndex == 16) { + this->actor.focus.pos.x = this->actor.world.pos.x; + this->actor.focus.pos.y = this->actor.world.pos.y + 60.0f; + this->actor.focus.pos.z = this->actor.world.pos.z; + + OPEN_DISPS(globalCtx->state.gfxCtx); + gSPDisplayList(POLY_OPA_DISP++, D_0600F180); + gSPDisplayList(POLY_OPA_DISP++, D_0600F218); + CLOSE_DISPS(globalCtx->state.gfxCtx); + } +} + +void EnFsn_Draw(Actor* thisx, GlobalContext* globalCtx) { + static void* sEyeTextures[] = { &D_06005BC0, &D_06006D40, &D_06007140 }; + EnFsn* this = THIS; + s32 pad; + s16 i; + + OPEN_DISPS(globalCtx->state.gfxCtx); + func_8012C5B0(globalCtx->state.gfxCtx); + gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(sEyeTextures[this->eyeTextureIdx])); + gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(sEyeTextures[this->eyeTextureIdx])); + SkelAnime_DrawSV(globalCtx, this->skelAnime.skeleton, this->skelAnime.limbDrawTbl, this->skelAnime.dListCount, + EnFsn_OverrideLimbDraw, EnFsn_PostLimbDraw, &this->actor); + + for (i = 0; i < this->totalSellingItems; i++) { + this->items[i]->actor.scale.x = 0.2f; + this->items[i]->actor.scale.y = 0.2f; + this->items[i]->actor.scale.z = 0.2f; + } + + EnFsn_DrawCursor(this, globalCtx, this->cursorX, this->cursorY, this->cursorZ, this->drawCursor); + EnFsn_DrawStickDirectionPrompts(this, globalCtx); + CLOSE_DISPS(globalCtx->state.gfxCtx); +} diff --git a/src/overlays/actors/ovl_En_Fsn/z_en_fsn.h b/src/overlays/actors/ovl_En_Fsn/z_en_fsn.h index a6936afb68..50e546e73e 100644 --- a/src/overlays/actors/ovl_En_Fsn/z_en_fsn.h +++ b/src/overlays/actors/ovl_En_Fsn/z_en_fsn.h @@ -2,12 +2,74 @@ #define Z_EN_FSN_H #include +#include "overlays/actors/ovl_En_GirlA/z_en_girla.h" + +#define ENFSN_IS_BACKROOM(thisx) ((thisx)->params & 1) +#define ENFSN_IS_SHOP(thisx) (!((thisx)->params & 1)) + +#define ENFSN_OFFER_FINAL_PRICE (1 << 6) +#define ENFSN_HAGGLE (1 << 7) +#define ENFSN_ANGRY (1 << 8) +#define ENFSN_CALM_DOWN (1 << 9) struct EnFsn; +typedef void (*EnFsnActionFunc)(struct EnFsn*, GlobalContext*); + typedef struct EnFsn { /* 0x000 */ Actor actor; - /* 0x144 */ char unk_144[0x30C]; + /* 0x144 */ UNK_TYPE1 pad144[0x4C]; + /* 0x190 */ SkelAnime skelAnime; + /* 0x1D4 */ EnFsnActionFunc actionFunc; + /* 0x1D8 */ EnFsnActionFunc tmpActionFunc; // Used to return to correct browsing function + /* 0x1DC */ ColliderCylinder collider; + /* 0x228 */ s16 limbRotYTable[19]; + /* 0x24E */ s16 limbRotZTable[19]; + /* 0x274 */ Vec3s headRot; + /* 0x27A */ Vec3s unk27A; // Set but never used + /* 0x280 */ Vec3s limbDrawTable[19]; + /* 0x2F2 */ Vec3s transitionDrawTable[19]; + /* 0x364 */ s16 eyeTextureIdx; + /* 0x366 */ s16 blinkTimer; + /* 0x368 */ s16 cutsceneState; + /* 0x36A */ s16 cutscene; + /* 0x36C */ s16 lookToShopkeeperCutscene; + /* 0x36E */ s16 lookToShelfCutscene; + /* 0x370 */ s16 lookToShopkeeperFromShelfCutscene; + /* 0x372 */ s16 lookToShopkeeperBuyingCutscene; + /* 0x374 */ s16 price; + /* 0x376 */ u16 textId; + /* 0x378 */ u8 isSelling; + /* 0x379 */ u8 cursorIdx; + /* 0x37C */ s32 getItemId; + /* 0x380 */ s16 stolenItem1; + /* 0x382 */ s16 stolenItem2; + /* 0x384 */ s16 itemIds[3]; + /* 0x38A */ s16 totalSellingItems; + /* 0x38C */ s16 numSellingItems; + /* 0x390 */ EnGirlA* items[3]; + /* 0x39C */ s16 delayTimer; + /* 0x3A0 */ s32 stickAccumX; + /* 0x3A4 */ s32 stickAccumY; + /* 0x3A8 */ f32 cursorX; + /* 0x3AC */ f32 cursorY; + /* 0x3B0 */ f32 cursorZ; + /* 0x3B4 */ s32 cursorColorR; + /* 0x3B8 */ s32 cursorColorG; + /* 0x3BC */ s32 cursorColorB; + /* 0x3C0 */ s32 cursorColorA; + /* 0x3C4 */ f32 cursorAnimTween; + /* 0x3C8 */ u8 cursorAnimState; + /* 0x3C9 */ u8 drawCursor; + /* 0x3CC */ StickDirectionPrompt stickLeftPrompt; + /* 0x404 */ StickDirectionPrompt stickRightPrompt; + /* 0x43C */ f32 arrowAnimTween; + /* 0x440 */ f32 stickAnimTween; + /* 0x444 */ u8 arrowAnimState; + /* 0x445 */ u8 stickAnimState; + /* 0x448 */ f32 shopItemSelectedTween; + /* 0x44C */ s16 animationIdx; + /* 0x44E */ u16 flags; } EnFsn; // size = 0x450 extern const ActorInit En_Fsn_InitVars; diff --git a/src/overlays/actors/ovl_En_GirlA/z_en_girla.c b/src/overlays/actors/ovl_En_GirlA/z_en_girla.c index a15988845a..7e7f7e7d4c 100644 --- a/src/overlays/actors/ovl_En_GirlA/z_en_girla.c +++ b/src/overlays/actors/ovl_En_GirlA/z_en_girla.c @@ -191,7 +191,7 @@ s32 EnGirlA_CanBuyPotionRed(GlobalContext* globalCtx, EnGirlA* this) { if (gSaveContext.rupees < globalCtx->msgCtx.unk1206C) { return CANBUY_RESULT_NEED_RUPEES; } - return CANBUY_RESULT_SUCCESS; + return CANBUY_RESULT_SUCCESS_2; } s32 EnGirlA_CanBuyPotionGreen(GlobalContext* globalCtx, EnGirlA* this) { @@ -201,36 +201,36 @@ s32 EnGirlA_CanBuyPotionGreen(GlobalContext* globalCtx, EnGirlA* this) { if (gSaveContext.rupees < globalCtx->msgCtx.unk1206C) { return CANBUY_RESULT_NEED_RUPEES; } - return CANBUY_RESULT_SUCCESS; + return CANBUY_RESULT_SUCCESS_2; } s32 EnGirlA_CanBuyPotionBlue(GlobalContext* globalCtx, EnGirlA* this) { if (!(gSaveContext.weekEventReg[53] & 8)) { - return CANBUY_RESULT_CANT_GET_NOW; + return CANBUY_RESULT_CANNOT_GET_NOW; } if (!func_80114E90()) { return CANBUY_RESULT_NEED_EMPTY_BOTTLE; } if (!(gSaveContext.weekEventReg[53] & 0x10)) { - return CANBUY_RESULT_SUCCESS; + return CANBUY_RESULT_SUCCESS_2; } if (gSaveContext.rupees < globalCtx->msgCtx.unk1206C) { return CANBUY_RESULT_NEED_RUPEES; } - return CANBUY_RESULT_SUCCESS; + return CANBUY_RESULT_SUCCESS_2; } s32 EnGirlA_CanBuyArrows(GlobalContext* globalCtx, EnGirlA* this) { if (CUR_UPG_VALUE_VOID(UPG_QUIVER) == 0) { - return CANBUY_RESULT_NO_ROOM_2; + return CANBUY_RESULT_CANNOT_GET_NOW_2; } if (AMMO(ITEM_BOW) >= CUR_CAPACITY(UPG_QUIVER)) { - return CANBUY_RESULT_NO_ROOM_3; + return CANBUY_RESULT_NO_ROOM_2; } if (gSaveContext.rupees < globalCtx->msgCtx.unk1206C) { return CANBUY_RESULT_NEED_RUPEES; } - return CANBUY_RESULT_SUCCESS; + return CANBUY_RESULT_SUCCESS_2; } s32 EnGirlA_CanBuyNuts(GlobalContext* globalCtx, EnGirlA* this) { @@ -241,9 +241,9 @@ s32 EnGirlA_CanBuyNuts(GlobalContext* globalCtx, EnGirlA* this) { return CANBUY_RESULT_NEED_RUPEES; } if (func_80114978(ITEM_NUT) == ITEM_NONE) { - return CANBUY_RESULT_SUCCESS_FANFARE; + return CANBUY_RESULT_SUCCESS_1; } - return CANBUY_RESULT_SUCCESS; + return CANBUY_RESULT_SUCCESS_2; } s32 EnGirlA_CanBuyShieldHero(GlobalContext* globalCtx, EnGirlA* this) { @@ -253,7 +253,7 @@ s32 EnGirlA_CanBuyShieldHero(GlobalContext* globalCtx, EnGirlA* this) { if (gSaveContext.rupees < globalCtx->msgCtx.unk1206C) { return CANBUY_RESULT_NEED_RUPEES; } - return CANBUY_RESULT_SUCCESS_FANFARE; + return CANBUY_RESULT_SUCCESS_1; } s32 EnGirlA_CanBuyStick(GlobalContext* globalCtx, EnGirlA* this) { @@ -264,26 +264,26 @@ s32 EnGirlA_CanBuyStick(GlobalContext* globalCtx, EnGirlA* this) { return CANBUY_RESULT_NEED_RUPEES; } if (func_80114978(ITEM_STICK) == ITEM_NONE) { - return CANBUY_RESULT_SUCCESS_FANFARE; + return CANBUY_RESULT_SUCCESS_1; } - return CANBUY_RESULT_SUCCESS; + return CANBUY_RESULT_SUCCESS_2; } s32 EnGirlA_CanBuyMaskAllNight(GlobalContext* globalCtx, EnGirlA* this) { if (gSaveContext.rupees < globalCtx->msgCtx.unk1206C) { return CANBUY_RESULT_NEED_RUPEES; } - return CANBUY_RESULT_SUCCESS; + return CANBUY_RESULT_SUCCESS_2; } s32 EnGirlA_CanBuyBombBagCuriosityShop(GlobalContext* globalCtx, EnGirlA* this) { if (CUR_UPG_VALUE_VOID(UPG_BOMB_BAG) >= 2) { - return CANBUY_RESULT_CANT_GET_NOW; + return CANBUY_RESULT_CANNOT_GET_NOW; } if (gSaveContext.rupees < globalCtx->msgCtx.unk1206C) { return CANBUY_RESULT_NEED_RUPEES; } - return CANBUY_RESULT_SUCCESS; + return CANBUY_RESULT_SUCCESS_2; } s32 EnGirlA_CanBuyBombBag20BombShop(GlobalContext* globalCtx, EnGirlA* this) { @@ -296,7 +296,7 @@ s32 EnGirlA_CanBuyBombBag20BombShop(GlobalContext* globalCtx, EnGirlA* this) { if (gSaveContext.rupees < globalCtx->msgCtx.unk1206C) { return CANBUY_RESULT_NEED_RUPEES; } - return CANBUY_RESULT_SUCCESS_FANFARE; + return CANBUY_RESULT_SUCCESS_1; } s32 EnGirlA_CanBuyBombBag30BombShop(GlobalContext* globalCtx, EnGirlA* this) { @@ -309,12 +309,12 @@ s32 EnGirlA_CanBuyBombBag30BombShop(GlobalContext* globalCtx, EnGirlA* this) { if (gSaveContext.rupees < globalCtx->msgCtx.unk1206C) { return CANBUY_RESULT_NEED_RUPEES; } - return CANBUY_RESULT_SUCCESS_FANFARE; + return CANBUY_RESULT_SUCCESS_1; } s32 EnGirlA_CanBuyBombchus(GlobalContext* globalCtx, EnGirlA* this) { if (CUR_UPG_VALUE_VOID(UPG_BOMB_BAG) == 0) { - return CANBUY_RESULT_CANT_GET_NOW; + return CANBUY_RESULT_CANNOT_GET_NOW; } if (AMMO(ITEM_BOMBCHU) >= CUR_CAPACITY(UPG_BOMB_BAG)) { return CANBUY_RESULT_NO_ROOM; @@ -323,14 +323,14 @@ s32 EnGirlA_CanBuyBombchus(GlobalContext* globalCtx, EnGirlA* this) { return CANBUY_RESULT_NEED_RUPEES; } if (func_80114978(ITEM_BOMBCHU) == ITEM_NONE) { - return CANBUY_RESULT_SUCCESS_FANFARE; + return CANBUY_RESULT_SUCCESS_1; } - return CANBUY_RESULT_SUCCESS; + return CANBUY_RESULT_SUCCESS_2; } s32 EnGirlA_CanBuyBombs(GlobalContext* globalCtx, EnGirlA* this) { if (CUR_UPG_VALUE_VOID(UPG_BOMB_BAG) == 0) { - return CANBUY_RESULT_CANT_GET_NOW; + return CANBUY_RESULT_CANNOT_GET_NOW; } if (AMMO(ITEM_BOMB) >= CUR_CAPACITY(UPG_BOMB_BAG)) { return CANBUY_RESULT_NO_ROOM; @@ -338,21 +338,21 @@ s32 EnGirlA_CanBuyBombs(GlobalContext* globalCtx, EnGirlA* this) { if (gSaveContext.rupees < globalCtx->msgCtx.unk1206C) { return CANBUY_RESULT_NEED_RUPEES; } - return CANBUY_RESULT_SUCCESS; + return CANBUY_RESULT_SUCCESS_2; } s32 EnGirlA_CanBuyBottle(GlobalContext* globalCtx, EnGirlA* this) { if (gSaveContext.rupees < globalCtx->msgCtx.unk1206C) { return CANBUY_RESULT_NEED_RUPEES; } - return CANBUY_RESULT_SUCCESS_FANFARE; + return CANBUY_RESULT_SUCCESS_1; } s32 EnGirlA_CanBuySword(GlobalContext* globalCtx, EnGirlA* this) { if (gSaveContext.rupees < globalCtx->msgCtx.unk1206C) { return CANBUY_RESULT_NEED_RUPEES; } - return CANBUY_RESULT_SUCCESS_FANFARE; + return CANBUY_RESULT_SUCCESS_1; } s32 EnGirlA_CanBuyShieldMirror(GlobalContext* globalCtx, EnGirlA* this) { @@ -362,7 +362,7 @@ s32 EnGirlA_CanBuyShieldMirror(GlobalContext* globalCtx, EnGirlA* this) { if (gSaveContext.rupees < globalCtx->msgCtx.unk1206C) { return CANBUY_RESULT_NEED_RUPEES; } - return CANBUY_RESULT_SUCCESS_FANFARE; + return CANBUY_RESULT_SUCCESS_1; } s32 EnGirlA_CanBuyFairy(GlobalContext* globalCtx, EnGirlA* this) { @@ -372,7 +372,7 @@ s32 EnGirlA_CanBuyFairy(GlobalContext* globalCtx, EnGirlA* this) { if (gSaveContext.rupees < globalCtx->msgCtx.unk1206C) { return CANBUY_RESULT_NEED_RUPEES; } - return CANBUY_RESULT_SUCCESS; + return CANBUY_RESULT_SUCCESS_2; } void EnGirlA_BuyBottleItem(GlobalContext* globalCtx, EnGirlA* this) { diff --git a/src/overlays/actors/ovl_En_GirlA/z_en_girla.h b/src/overlays/actors/ovl_En_GirlA/z_en_girla.h index b4ad8ba70e..c9a06e9a95 100644 --- a/src/overlays/actors/ovl_En_GirlA/z_en_girla.h +++ b/src/overlays/actors/ovl_En_GirlA/z_en_girla.h @@ -48,18 +48,87 @@ typedef struct EnGirlA { } EnGirlA; // size = 0x1CC typedef enum { - /* 0 */ CANBUY_RESULT_SUCCESS_FANFARE, - /* 1 */ CANBUY_RESULT_SUCCESS, + /* 0 */ CANBUY_RESULT_SUCCESS_1, + /* 1 */ CANBUY_RESULT_SUCCESS_2, /* 2 */ CANBUY_RESULT_NO_ROOM, /* 3 */ CANBUY_RESULT_NEED_EMPTY_BOTTLE, /* 4 */ CANBUY_RESULT_NEED_RUPEES, - /* 5 */ CANBUY_RESULT_CANT_GET_NOW, - /* 6 */ CANBUY_RESULT_NO_ROOM_2, - /* 7 */ CANBUY_RESULT_NO_ROOM_3, + /* 5 */ CANBUY_RESULT_CANNOT_GET_NOW, + /* 6 */ CANBUY_RESULT_CANNOT_GET_NOW_2, + /* 7 */ CANBUY_RESULT_NO_ROOM_2, /* 8 */ CANBUY_RESULT_ALREADY_HAVE, /* 9 */ CANBUY_RESULT_HAVE_BETTER } EnGirlACanBuyResult; +typedef enum { + /* 00 */ SI_POTION_RED_1, + /* 01 */ SI_POTION_GREEN_1, + /* 02 */ SI_POTION_BLUE, + /* 03 */ SI_FAIRY_1, + /* 04 */ SI_ARROWS_LARGE_1, + /* 05 */ SI_POTION_GREEN_2, + /* 06 */ SI_SHIELD_HERO_1, + /* 07 */ SI_STICK_1, + /* 08 */ SI_ARROWS_MEDIUM_1, + /* 09 */ SI_NUTS_1, + /* 10 */ SI_POTION_RED_2, + /* 11 */ SI_FAIRY_2, + /* 12 */ SI_ARROWS_MEDIUM_2, + /* 13 */ SI_ARROWS_LARGE_2, + /* 14 */ SI_POTION_GREEN_3, + /* 15 */ SI_NUTS_2, + /* 16 */ SI_STICK_2, + /* 17 */ SI_SHIELD_HERO_2, + /* 18 */ SI_POTION_RED_3, + /* 19 */ SI_MASK_ALL_NIGHT, + /* 20 */ SI_BOMB_BAG_20_1, + /* 21 */ SI_BOMB_BAG_30_1, + /* 22 */ SI_BOMB_BAG_40, + /* 23 */ SI_BOMB_BAG_20_2, + /* 24 */ SI_BOMB_BAG_30_2, + /* 25 */ SI_BOMBCHU, + /* 26 */ SI_BOMB_1, + /* 27 */ SI_SHIELD_HERO_3, + /* 28 */ SI_ARROWS_SMALL_1, + /* 29 */ SI_POTION_RED_4, + /* 30 */ SI_BOMB_2, + /* 31 */ SI_ARROWS_SMALL_2, + /* 32 */ SI_POTION_RED_5, + /* 33 */ SI_BOMB_3, + /* 34 */ SI_ARROWS_SMALL_3, + /* 35 */ SI_POTION_RED_6, + /* 36 */ SI_BOTTLE, + /* 37 */ SI_SWORD_GREAT_FAIRY, + /* 38 */ SI_SWORD_KOKIRI, + /* 39 */ SI_SWORD_RAZOR, + /* 40 */ SI_SWORD_GILDED, + /* 41 */ SI_SHIELD_HERO_4, + /* 42 */ SI_SHIELD_MIRROR, +} EnGirlAShopItemId; + extern const ActorInit En_GirlA_InitVars; +/* +* Shopkeeper Common Defines +*/ +#define CURSOR_INVALID 0xFF +#define COL_CHAN_MIX(c1, c2, m) (c1 - (s32)(c2 * m)) & 0xFF + +typedef struct { + /* 0x00 */ u32 stickColorR; + /* 0x04 */ u32 stickColorG; + /* 0x08 */ u32 stickColorB; + /* 0x0C */ u32 stickColorA; + /* 0x10 */ f32 stickTexX; + /* 0x14 */ f32 stickTexY; + /* 0x18 */ u32 arrowColorR; + /* 0x1C */ u32 arrowColorG; + /* 0x20 */ u32 arrowColorB; + /* 0x24 */ u32 arrowColorA; + /* 0x28 */ f32 arrowTexX; + /* 0x2C */ f32 arrowTexY; + /* 0x30 */ f32 texZ; // Used for both stickTexZ and arrowTexZ + /* 0x34 */ s32 isEnabled; +} StickDirectionPrompt; // size = 0x38 + #endif // Z_EN_GIRLA_H diff --git a/src/overlays/actors/ovl_En_Invadepoh/z_en_invadepoh.c b/src/overlays/actors/ovl_En_Invadepoh/z_en_invadepoh.c index b5349054dd..31c5bd3bfb 100644 --- a/src/overlays/actors/ovl_En_Invadepoh/z_en_invadepoh.c +++ b/src/overlays/actors/ovl_En_Invadepoh/z_en_invadepoh.c @@ -1400,7 +1400,7 @@ s32 func_80B45550(EnInvadepoh* this, GlobalContext* globalCtx, f32 range, s32 ar void EnInvadepoh_SetTextID(EnInvadepoh* this, GlobalContext* globalCtx, u16 arg2) { this->textId = arg2; - func_801518B0(globalCtx, arg2 & 0xFFFF, &this->actor); + func_801518B0(globalCtx, arg2, &this->actor); } void func_80B45648(EnInvadepoh* this) { 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 27e5edd855..dd59557af5 100644 --- a/src/overlays/actors/ovl_En_Toto/z_en_toto.c +++ b/src/overlays/actors/ovl_En_Toto/z_en_toto.c @@ -465,7 +465,7 @@ s32 func_80BA4204(EnToto* this, GlobalContext* globalCtx) { 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); + func_801518B0(globalCtx, (this->text->unk0 == 6 ? temp_v1_2->unk0 : temp_v1_2->unk4), NULL); } return 1; } diff --git a/src/overlays/actors/ovl_Obj_Ghaka/z_obj_ghaka.c b/src/overlays/actors/ovl_Obj_Ghaka/z_obj_ghaka.c index 96a172e5aa..26322a2eb9 100644 --- a/src/overlays/actors/ovl_Obj_Ghaka/z_obj_ghaka.c +++ b/src/overlays/actors/ovl_Obj_Ghaka/z_obj_ghaka.c @@ -97,16 +97,15 @@ void func_80B3C39C(ObjGhaka* this, GlobalContext* globalCtx) { } void func_80B3C4E0(ObjGhaka* this, GlobalContext* globalCtx) { - s32 temp_v0 = func_80152498(&globalCtx->msgCtx); + s32 talkState = func_80152498(&globalCtx->msgCtx); - if (temp_v0 == 5) { + if (talkState == 5) { if (func_80147624(globalCtx)) { globalCtx->msgCtx.unk11F22 = 0x43; globalCtx->msgCtx.unk12023 = 4; func_80B3C260(this); } - // Could be fake, but helps match - } else if ((temp_v0 & 0xFFFFFFFF) == 4) { + } else if (talkState == 4) { if (func_80147624(globalCtx)) { switch (globalCtx->msgCtx.choiceIndex) { case 0: diff --git a/tables/functions.txt b/tables/functions.txt index fe75be6f46..174602b89e 100644 --- a/tables/functions.txt +++ b/tables/functions.txt @@ -12409,68 +12409,68 @@ 0x80AE1874:("func_80AE1874",), 0x80AE18B4:("func_80AE18B4",), 0x80AE19B8:("EnDs2n_Draw",), - 0x80AE1B70:("func_80AE1B70",), - 0x80AE1BF0:("func_80AE1BF0",), - 0x80AE1C54:("func_80AE1C54",), - 0x80AE1E58:("func_80AE1E58",), - 0x80AE1EF4:("func_80AE1EF4",), - 0x80AE1F5C:("func_80AE1F5C",), - 0x80AE2028:("func_80AE2028",), - 0x80AE2074:("func_80AE2074",), - 0x80AE21C8:("func_80AE21C8",), - 0x80AE2234:("func_80AE2234",), - 0x80AE2298:("func_80AE2298",), - 0x80AE2340:("func_80AE2340",), - 0x80AE2438:("func_80AE2438",), - 0x80AE2524:("func_80AE2524",), - 0x80AE25D4:("func_80AE25D4",), - 0x80AE2670:("func_80AE2670",), - 0x80AE26D4:("func_80AE26D4",), - 0x80AE2760:("func_80AE2760",), - 0x80AE28B0:("func_80AE28B0",), - 0x80AE2974:("func_80AE2974",), - 0x80AE2A98:("func_80AE2A98",), - 0x80AE2B44:("func_80AE2B44",), - 0x80AE2BE0:("func_80AE2BE0",), - 0x80AE2C6C:("func_80AE2C6C",), - 0x80AE2CFC:("func_80AE2CFC",), - 0x80AE2DC8:("func_80AE2DC8",), - 0x80AE2F78:("func_80AE2F78",), - 0x80AE30F8:("func_80AE30F8",), - 0x80AE32D4:("func_80AE32D4",), - 0x80AE3474:("func_80AE3474",), - 0x80AE352C:("func_80AE352C",), - 0x80AE3644:("func_80AE3644",), - 0x80AE3880:("func_80AE3880",), - 0x80AE38E0:("func_80AE38E0",), - 0x80AE3A68:("func_80AE3A68",), - 0x80AE3BC4:("func_80AE3BC4",), - 0x80AE3CF0:("func_80AE3CF0",), - 0x80AE3D50:("func_80AE3D50",), - 0x80AE3E4C:("func_80AE3E4C",), - 0x80AE3F40:("func_80AE3F40",), - 0x80AE4028:("func_80AE4028",), - 0x80AE4120:("func_80AE4120",), - 0x80AE41FC:("func_80AE41FC",), - 0x80AE4424:("func_80AE4424",), - 0x80AE44DC:("func_80AE44DC",), - 0x80AE45C4:("func_80AE45C4",), - 0x80AE4638:("func_80AE4638",), - 0x80AE4828:("func_80AE4828",), - 0x80AE4A1C:("func_80AE4A1C",), - 0x80AE4B20:("func_80AE4B20",), - 0x80AE4B70:("func_80AE4B70",), - 0x80AE4BF4:("func_80AE4BF4",), - 0x80AE4CD8:("func_80AE4CD8",), - 0x80AE4D28:("func_80AE4D28",), + 0x80AE1B70:("EnFsn_TestItemSelected",), + 0x80AE1BF0:("EnFsn_GetWelcome",), + 0x80AE1C54:("EnFsn_HandleConversationBackroom",), + 0x80AE1E58:("EnFsn_HandleSetupResumeInteraction",), + 0x80AE1EF4:("EnFsn_UpdateCollider",), + 0x80AE1F5C:("EnFsn_HandleLookToShopkeeperBuyingCutscene",), + 0x80AE2028:("EnFsn_SetCursorIndexFromNeutral",), + 0x80AE2074:("EnFsn_CursorLeftRight",), + 0x80AE21C8:("EnFsn_GetThirdDayItemId",), + 0x80AE2234:("EnFsn_GetStolenItemId",), + 0x80AE2298:("EnFsn_HasItemsToSell",), + 0x80AE2340:("EnFsn_GetShopItemIds",), + 0x80AE2438:("EnFsn_SpawnShopItems",), + 0x80AE2524:("EnFsn_EndInteraction",), + 0x80AE25D4:("EnFsn_TestEndInteraction",), + 0x80AE2670:("EnFsn_TestCancelOption",), + 0x80AE26D4:("EnFsn_UpdateCursorPos",), + 0x80AE2760:("EnFsn_FacingShopkeeperDialogResult",), + 0x80AE28B0:("EnFsn_HasPlayerSelectedItem",), + 0x80AE2974:("EnFsn_UpdateJoystickInputState",), + 0x80AE2A98:("EnFsn_PositionSelectedItem",), + 0x80AE2B44:("EnFsn_TakeItemOffShelf",), + 0x80AE2BE0:("EnFsn_ReturnItemToShelf",), + 0x80AE2C6C:("EnFsn_UpdateItemSelectedProperty",), + 0x80AE2CFC:("EnFsn_UpdateCursorAnim",), + 0x80AE2DC8:("EnFsn_UpdateStickDirectionPromptAnim",), + 0x80AE2F78:("EnFsn_InitShop",), + 0x80AE30F8:("EnFsn_Idle",), + 0x80AE32D4:("EnFsn_Haggle",), + 0x80AE3474:("EnFsn_BeginInteraction",), + 0x80AE352C:("EnFsn_StartBuying",), + 0x80AE3644:("EnFsn_AskBuyOrSell",), + 0x80AE3880:("EnFsn_SetupDeterminePrice",), + 0x80AE38E0:("EnFsn_DeterminePrice",), + 0x80AE3A68:("EnFsn_MakeOffer",), + 0x80AE3BC4:("EnFsn_GiveItem",), + 0x80AE3CF0:("EnFsn_SetupResumeInteraction",), + 0x80AE3D50:("EnFsn_ResumeInteraction",), + 0x80AE3E4C:("EnFsn_ResumeShoppingInteraction",), + 0x80AE3F40:("EnFsn_LookToShelf",), + 0x80AE4028:("EnFsn_BrowseShelf",), + 0x80AE4120:("EnFsn_LookToShopkeeperFromShelf",), + 0x80AE41FC:("EnFsn_HandleCanPlayerBuyItem",), + 0x80AE4424:("EnFsn_SetupEndInteraction",), + 0x80AE44DC:("EnFsn_SelectItem",), + 0x80AE45C4:("EnFsn_PlayerCannotBuy",), + 0x80AE4638:("EnFsn_AskCanBuyMore",), + 0x80AE4828:("EnFsn_AskCanBuyAterRunningOutOfItems",), + 0x80AE4A1C:("EnFsn_FaceShopkeeperSelling",), + 0x80AE4B20:("EnFsn_SetupEndInteractionImmediately",), + 0x80AE4B70:("EnFsn_IdleBackroom",), + 0x80AE4BF4:("EnFsn_ConverseBackroom",), + 0x80AE4CD8:("EnFsn_GetCutscenes",), + 0x80AE4D28:("EnFsn_Blink",), 0x80AE4DB0:("EnFsn_Init",), 0x80AE4F10:("EnFsn_Destroy",), 0x80AE4F3C:("EnFsn_Update",), - 0x80AE502C:("func_80AE502C",), - 0x80AE52A4:("func_80AE52A4",), - 0x80AE5440:("func_80AE5440",), - 0x80AE57E8:("func_80AE57E8",), - 0x80AE5910:("func_80AE5910",), + 0x80AE502C:("EnFsn_DrawCursor",), + 0x80AE52A4:("EnFsn_DrawTextRec",), + 0x80AE5440:("EnFsn_DrawStickDirectionPrompts",), + 0x80AE57E8:("EnFsn_OverrideLimbDraw",), + 0x80AE5910:("EnFsn_PostLimbDraw",), 0x80AE5990:("EnFsn_Draw",), 0x80AE6130:("func_80AE6130",), 0x80AE615C:("func_80AE615C",), diff --git a/tables/variables.txt b/tables/variables.txt index 4f59fb8009..17d1c5c492 100644 --- a/tables/variables.txt +++ b/tables/variables.txt @@ -14679,11 +14679,11 @@ 0x80AE1B14:("enDs2nOverlayRelocations","u32","[20]",0x50), 0x80AE1B6C:("enDs2nOverlayInfoOffset","u32","",0x4), 0x80AE5B00:("En_Fsn_InitVars","UNK_TYPE1","",0x1), - 0x80AE5B20:("D_80AE5B20","UNK_TYPE1","",0x1), + 0x80AE5B20:("sAnimations","UNK_TYPE1","",0x1), 0x80AE5BF0:("D_80AE5BF0","UNK_TYPE1","",0x1), - 0x80AE5C1C:("D_80AE5C1C","UNK_TYPE4","",0x4), + 0x80AE5C1C:("sShopItemPositions","UNK_TYPE4","",0x4), 0x80AE5C40:("D_80AE5C40","UNK_TYPE4","",0x4), - 0x80AE5C4C:("D_80AE5C4C","UNK_TYPE1","",0x1), + 0x80AE5C4C:("sEyeTextures","UNK_TYPE1","",0x1), 0x80AE5C60:("jtbl_D_80AE5C60","UNK_PTR","",0x4), 0x80AE5CC4:("jtbl_D_80AE5CC4","UNK_PTR","",0x4), 0x80AE5D0C:("D_80AE5D0C","f32","",0x4),