ovl_En_GirlA OK and documented (#182)

* EnGirlA Matches

* Convert func to boolean

* Cleanup

* missed a little cleanup

* Update with new MACRO

* revert z_en_item00.c macro, and add one more macro

* Documented

* Format macros.h

* Fix VTX format

* rename isBought to isOutOfStock

* PR suggestions

* Document a bug

* PR comments
This commit is contained in:
Derek Hensley
2021-06-15 05:45:19 -07:00
committed by GitHub
parent c203b9b606
commit 74e418f24f
10 changed files with 791 additions and 152 deletions
+4 -6
View File
@@ -816,16 +816,14 @@ s16 func_800A7650(s16 dropId) {
s16 healthCapacity;
if ((((dropId == ITEM00_BOMBS_A) || (dropId == ITEM00_BOMBS_0) || (dropId == ITEM00_BOMBS_B)) &&
(gSaveContext.inventory.items[gItemSlots[6]] == 0xFF)) ||
(INV_CONTENT(ITEM_BOMB) == ITEM_NONE)) ||
(((dropId == ITEM00_ARROWS_10) || (dropId == ITEM00_ARROWS_30) || (dropId == ITEM00_ARROWS_40) ||
(dropId == ITEM00_ARROWS_50)) &&
(gSaveContext.inventory.items[gItemSlots[1]] == 0xFF)) ||
(INV_CONTENT(ITEM_BOW) == ITEM_NONE)) ||
(((dropId == ITEM00_MAGIC_LARGE) || (dropId == ITEM00_MAGIC_SMALL)) && (gSaveContext.magicLevel == 0))) {
return ITEM00_NO_DROP;
}
;
if (dropId == ITEM00_HEART) {
healthCapacity = gSaveContext.healthCapacity;
if (healthCapacity == gSaveContext.health) {
@@ -1125,11 +1123,11 @@ void Item_DropCollectibleRandom(GlobalContext* globalCtx, Actor* fromActor, Vec3
params = 0xD0;
dropId = ITEM00_MAGIC_LARGE;
dropQuantity = 1;
} else if (gSaveContext.inventory.ammo[gItemSlots[1]] < 6) {
} else if (AMMO(ITEM_BOW) < 6) {
params = 0xA0;
dropId = ITEM00_ARROWS_30;
dropQuantity = 1;
} else if (gSaveContext.inventory.ammo[gItemSlots[6]] < 6) {
} else if (AMMO(ITEM_BOMB) < 6) {
params = 0xB0;
dropId = ITEM00_BOMBS_A;
dropQuantity = 1;
@@ -424,7 +424,7 @@ void EnGinkoMan_WaitForDialogueInput(EnGinkoMan* this, GlobalContext* globalCtx)
func_800BDC5C(&this->skelAnime, animations, GINKO_FLOORSMACKING);
func_801518B0(globalCtx, 0x476, &this->actor);
this->curTextId = 0x476; // you dont have enough deposited to withdrawl
} else if (D_801C1E2C[(gSaveContext.inventory.upgrades & gUpgradeMasks[4]) >> gUpgradeShifts[4]] < (globalCtx->msgCtx.bankRupeesSelected + gSaveContext.rupees)) {
} else if (D_801C1E2C[CUR_UPG_VALUE(UPG_WALLET)] < (globalCtx->msgCtx.bankRupeesSelected + gSaveContext.rupees)) {
// check if wallet is big enough
play_sound(NA_SE_SY_ERROR);
func_801518B0(globalCtx, 0x475, &this->actor);
@@ -532,7 +532,7 @@ void EnGinkoMan_BankAward(EnGinkoMan* this, GlobalContext* globalCtx) {
EnGinkoMan_SetupBankAward2(this);
} else if (this->curTextId == 0x45B) { // "Whats this, you already saved up 200?"
if (!(gSaveContext.weekEventReg[10] & 8)) {
func_800B8A1C(&this->actor, globalCtx, ((u32)(gSaveContext.inventory.upgrades & gUpgradeMasks[4]) >> gUpgradeShifts[4]) + 8, 500.0f, 100.0f);
func_800B8A1C(&this->actor, globalCtx, CUR_UPG_VALUE(UPG_WALLET) + 8, 500.0f, 100.0f);
} else {
func_800B8A1C(&this->actor, globalCtx, 2, 500.0f, 100.0f);
}
+541 -45
View File
@@ -1,3 +1,9 @@
/*
* File: z_en_girla.c
* Overlay: obj_En_Girla
* Description: Shop Items
*/
#include "z_en_girla.h"
#define FLAGS 0x00000019
@@ -7,8 +13,44 @@
void EnGirlA_Init(Actor* thisx, GlobalContext* globalCtx);
void EnGirlA_Destroy(Actor* thisx, GlobalContext* globalCtx);
void EnGirlA_Update(Actor* thisx, GlobalContext* globalCtx);
void EnGirlA_Draw(Actor* thisx, GlobalContext* globalCtx);
void EnGirlA_InitalUpdate(EnGirlA* this, GlobalContext* globalCtx);
void EnGirlA_Update2(EnGirlA* this, GlobalContext* globalCtx);
s32 EnGirlA_CanBuyPotionRed(GlobalContext* globalCtx, EnGirlA* this);
s32 EnGirlA_CanBuyPotionGreen(GlobalContext* globalCtx, EnGirlA* this);
s32 EnGirlA_CanBuyPotionBlue(GlobalContext* globalCtx, EnGirlA* this);
s32 EnGirlA_CanBuyArrows(GlobalContext* globalCtx, EnGirlA* this);
s32 EnGirlA_CanBuyNuts(GlobalContext* globalCtx, EnGirlA* this);
s32 EnGirlA_CanBuyShieldHero(GlobalContext* globalCtx, EnGirlA* this);
s32 EnGirlA_CanBuyStick(GlobalContext* globalCtx, EnGirlA* this);
s32 EnGirlA_CanBuyMaskAllNight(GlobalContext* globalCtx, EnGirlA* this);
s32 EnGirlA_CanBuyBombBagCuriosityShop(GlobalContext* globalCtx, EnGirlA* this);
s32 EnGirlA_CanBuyBombBag20BombShop(GlobalContext* globalCtx, EnGirlA* this);
s32 EnGirlA_CanBuyBombBag30BombShop(GlobalContext* globalCtx, EnGirlA* this);
s32 EnGirlA_CanBuyBombchus(GlobalContext* globalCtx, EnGirlA* this);
s32 EnGirlA_CanBuyBombs(GlobalContext* globalCtx, EnGirlA* this);
s32 EnGirlA_CanBuyBottle(GlobalContext* globalCtx, EnGirlA* this);
s32 EnGirlA_CanBuySword(GlobalContext* globalCtx, EnGirlA* this);
s32 EnGirlA_CanBuyShieldMirror(GlobalContext* globalCtx, EnGirlA* this);
s32 EnGirlA_CanBuyFairy(GlobalContext* globalCtx, EnGirlA* this);
void EnGirlA_BuyBottleItem(GlobalContext* globalCtx, EnGirlA* this);
void EnGirlA_BuyArrows(GlobalContext* globalCtx, EnGirlA* this);
void EnGirlA_BuyNuts(GlobalContext* globalCtx, EnGirlA* this);
void EnGirlA_BuyShieldHero(GlobalContext* globalCtx, EnGirlA* this);
void EnGirlA_BuyStick(GlobalContext* globalCtx, EnGirlA* this);
void EnGirlA_BuyMaskAllNight(GlobalContext* globalCtx, EnGirlA* this);
void EnGirlA_BuyBombBag(GlobalContext* globalCtx, EnGirlA* this);
void EnGirlA_BuyBombchus(GlobalContext* globalCtx, EnGirlA* this);
void EnGirlA_BuyBombs(GlobalContext* globalCtx, EnGirlA* this);
void EnGirlA_BuyBottle(GlobalContext* globalCtx, EnGirlA* this);
void EnGirlA_BuySword(GlobalContext* globalCtx, EnGirlA* this);
void EnGirlA_BuyShieldMirror(GlobalContext* globalCtx, EnGirlA* this);
void EnGirlA_BuyFanfare(GlobalContext* globalCtx, EnGirlA* this);
/*
const ActorInit En_GirlA_InitVars = {
ACTOR_EN_GIRLA,
ACTORCAT_PROP,
@@ -20,90 +62,544 @@ const ActorInit En_GirlA_InitVars = {
(ActorFunc)EnGirlA_Update,
(ActorFunc)NULL,
};
*/
#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_GirlA_0x80863870/func_80863870.asm")
static ShopItemEntry sShopItemEntries[] = {
{ OBJECT_GI_LIQUID, GID_POTION_RED, func_800B8050, 1, 0X083F, 0X0840, GI_POTION_RED, EnGirlA_CanBuyPotionRed,
EnGirlA_BuyBottleItem, EnGirlA_BuyFanfare },
{ OBJECT_GI_LIQUID, GID_POTION_GREEN, func_800B8050, 1, 0X0841, 0X0842, GI_POTION_GREEN, EnGirlA_CanBuyPotionGreen,
EnGirlA_BuyBottleItem, EnGirlA_BuyFanfare },
{ OBJECT_GI_LIQUID, GID_POTION_BLUE, func_800B8050, 1, 0X0843, 0X0844, GI_POTION_BLUE, EnGirlA_CanBuyPotionBlue,
EnGirlA_BuyBottleItem, EnGirlA_BuyFanfare },
{ OBJECT_GI_BOTTLE_04, GID_FAIRY, func_800B8050, 1, 0X06B6, 0X06B7, GI_FAIRY, EnGirlA_CanBuyFairy,
EnGirlA_BuyBottleItem, EnGirlA_BuyFanfare },
{ OBJECT_GI_ARROW, GID_ARROWS_LARGE, func_800B8050, 50, 0X06BA, 0X06BB, GI_ARROWS_LARGE, EnGirlA_CanBuyArrows,
EnGirlA_BuyArrows, EnGirlA_BuyFanfare },
{ OBJECT_GI_LIQUID, GID_POTION_GREEN, func_800B8050, 1, 0X06B2, 0X06B3, GI_POTION_GREEN, EnGirlA_CanBuyPotionGreen,
EnGirlA_BuyBottleItem, EnGirlA_BuyFanfare },
{ OBJECT_GI_SHIELD_2, GID_SHIELD_HERO, func_800B8050, 1, 0X06AE, 0X06AF, GI_SHIELD_HERO, EnGirlA_CanBuyShieldHero,
EnGirlA_BuyShieldHero, EnGirlA_BuyFanfare },
{ OBJECT_GI_STICK, GID_STICK, NULL, 1, 0X06B4, 0X06B5, GI_STICKS_1, EnGirlA_CanBuyStick, EnGirlA_BuyStick,
EnGirlA_BuyFanfare },
{ OBJECT_GI_ARROW, GID_ARROWS_MEDIUM, func_800B8050, 30, 0X06B8, 0X06B9, GI_ARROWS_MEDIUM, EnGirlA_CanBuyArrows,
EnGirlA_BuyArrows, EnGirlA_BuyFanfare },
{ OBJECT_GI_NUTS, GID_NUTS, func_800B8118, 10, 0X06B0, 0X06B1, GI_NUTS_10, EnGirlA_CanBuyNuts, EnGirlA_BuyNuts,
EnGirlA_BuyFanfare },
{ OBJECT_GI_LIQUID, GID_POTION_RED, func_800B8050, 1, 0X06AC, 0X06AD, GI_POTION_RED, EnGirlA_CanBuyPotionRed,
EnGirlA_BuyBottleItem, EnGirlA_BuyFanfare },
{ OBJECT_GI_BOTTLE_04, GID_FAIRY, func_800B8050, 1, 0X06D3, 0X06D4, GI_FAIRY, EnGirlA_CanBuyFairy,
EnGirlA_BuyBottleItem, EnGirlA_BuyFanfare },
{ OBJECT_GI_ARROW, GID_ARROWS_MEDIUM, func_800B8050, 30, 0X06D5, 0X06D6, GI_ARROWS_MEDIUM, EnGirlA_CanBuyArrows,
EnGirlA_BuyArrows, EnGirlA_BuyFanfare },
{ OBJECT_GI_ARROW, GID_ARROWS_LARGE, func_800B8050, 50, 0X06D7, 0X06D8, GI_ARROWS_LARGE, EnGirlA_CanBuyArrows,
EnGirlA_BuyArrows, EnGirlA_BuyFanfare },
{ OBJECT_GI_LIQUID, GID_POTION_GREEN, func_800B8050, 1, 0X06CF, 0X06D0, GI_POTION_GREEN, EnGirlA_CanBuyPotionGreen,
EnGirlA_BuyBottleItem, EnGirlA_BuyFanfare },
{ OBJECT_GI_NUTS, GID_NUTS, func_800B8118, 10, 0X06CD, 0X06CE, GI_NUTS_10, EnGirlA_CanBuyNuts, EnGirlA_BuyNuts,
EnGirlA_BuyFanfare },
{ OBJECT_GI_STICK, GID_STICK, NULL, 1, 0X06D1, 0X06D2, GI_STICKS_1, EnGirlA_CanBuyStick, EnGirlA_BuyStick,
EnGirlA_BuyFanfare },
{ OBJECT_GI_SHIELD_2, GID_SHIELD_HERO, func_800B8050, 1, 0X06CB, 0X06CC, GI_SHIELD_HERO, EnGirlA_CanBuyShieldHero,
EnGirlA_BuyShieldHero, EnGirlA_BuyFanfare },
{ OBJECT_GI_LIQUID, GID_POTION_RED, func_800B8050, 1, 0X06C9, 0X06CA, GI_POTION_RED, EnGirlA_CanBuyPotionRed,
EnGirlA_BuyBottleItem, EnGirlA_BuyFanfare },
{ OBJECT_GI_MASK06, GID_MASK_ALL_NIGHT, func_800B8050, 1, 0X29D9, 0X29DA, GI_MASK_ALL_NIGHT,
EnGirlA_CanBuyMaskAllNight, EnGirlA_BuyMaskAllNight, EnGirlA_BuyFanfare },
{ OBJECT_GI_BOMBPOUCH, GID_BOMB_BAG_20, func_800B8050, 1, 0X29DB, 0X29DC, GI_BOMB_BAG_20,
EnGirlA_CanBuyBombBagCuriosityShop, EnGirlA_BuyBombBag, EnGirlA_BuyFanfare },
{ OBJECT_GI_BOMBPOUCH, GID_BOMB_BAG_30, func_800B8050, 2, 0X29DB, 0X29DC, GI_BOMB_BAG_30,
EnGirlA_CanBuyBombBagCuriosityShop, EnGirlA_BuyBombBag, EnGirlA_BuyFanfare },
{ OBJECT_GI_BOMBPOUCH, GID_BOMB_BAG_40, func_800B8050, 3, 0X29DB, 0X29DC, GI_BOMB_BAG_40,
EnGirlA_CanBuyBombBagCuriosityShop, EnGirlA_BuyBombBag, EnGirlA_BuyFanfare },
{ OBJECT_GI_BOMBPOUCH, GID_BOMB_BAG_20, func_800B8050, 1, 0X0654, 0X0655, GI_BOMB_BAG_20,
EnGirlA_CanBuyBombBag20BombShop, EnGirlA_BuyBombBag, EnGirlA_BuyFanfare },
{ OBJECT_GI_BOMBPOUCH, GID_BOMB_BAG_30, func_800B8050, 2, 0X0656, 0X0657, GI_BOMB_BAG_30,
EnGirlA_CanBuyBombBag30BombShop, EnGirlA_BuyBombBag, EnGirlA_BuyFanfare },
{ OBJECT_GI_BOMB_2, GID_BOMBCHU, func_800B8050, 10, 0X0652, 0X0653, GI_BOMBCHUS_10, EnGirlA_CanBuyBombchus,
EnGirlA_BuyBombchus, EnGirlA_BuyFanfare },
{ OBJECT_GI_BOMB_1, GID_BOMB, func_800B8050, 10, 0X0650, 0X0651, GI_BOMBS_10, EnGirlA_CanBuyBombs, EnGirlA_BuyBombs,
EnGirlA_BuyFanfare },
{ OBJECT_GI_SHIELD_2, GID_SHIELD_HERO, func_800B8050, 1, 0X12DB, 0X12DC, GI_SHIELD_HERO, EnGirlA_CanBuyShieldHero,
EnGirlA_BuyShieldHero, EnGirlA_BuyFanfare },
{ OBJECT_GI_ARROW, GID_ARROWS_SMALL, func_800B8050, 10, 0X12DD, 0X12DE, GI_ARROWS_SMALL, EnGirlA_CanBuyArrows,
EnGirlA_BuyArrows, EnGirlA_BuyFanfare },
{ OBJECT_GI_LIQUID, GID_POTION_RED, func_800B8050, 1, 0X12DF, 0X12E0, GI_POTION_RED, EnGirlA_CanBuyPotionRed,
EnGirlA_BuyBottleItem, EnGirlA_BuyFanfare },
{ OBJECT_GI_BOMB_1, GID_BOMB, func_800B8050, 10, 0X0BC5, 0X0BC6, GI_BOMBS_10, EnGirlA_CanBuyBombs, EnGirlA_BuyBombs,
EnGirlA_BuyFanfare },
{ OBJECT_GI_ARROW, GID_ARROWS_SMALL, func_800B8050, 10, 0X0BC7, 0X0BC8, GI_ARROWS_SMALL, EnGirlA_CanBuyArrows,
EnGirlA_BuyArrows, EnGirlA_BuyFanfare },
{ OBJECT_GI_LIQUID, GID_POTION_RED, func_800B8050, 1, 0X0BC9, 0X0BCA, GI_POTION_RED, EnGirlA_CanBuyPotionRed,
EnGirlA_BuyBottleItem, EnGirlA_BuyFanfare },
{ OBJECT_GI_BOMB_1, GID_BOMB, func_800B8050, 10, 0X0BCB, 0X0BCC, GI_BOMBS_10, EnGirlA_CanBuyBombs, EnGirlA_BuyBombs,
EnGirlA_BuyFanfare },
{ OBJECT_GI_ARROW, GID_ARROWS_SMALL, func_800B8050, 10, 0X0BCD, 0X0BCE, GI_ARROWS_SMALL, EnGirlA_CanBuyArrows,
EnGirlA_BuyArrows, EnGirlA_BuyFanfare },
{ OBJECT_GI_LIQUID, GID_POTION_RED, func_800B8050, 1, 0X0BCF, 0X0BD0, GI_POTION_RED, EnGirlA_CanBuyPotionRed,
EnGirlA_BuyBottleItem, EnGirlA_BuyFanfare },
{ OBJECT_GI_BOTTLE, GID_BOTTLE, func_800B8050, 1, 0X29F8, 0X29F9, GI_BOTTLE, EnGirlA_CanBuyBottle,
EnGirlA_BuyBottle, EnGirlA_BuyFanfare },
{ OBJECT_GI_SWORD_4, GID_SWORD_GREAT_FAIRY, func_800B8050, 4, 0X29F2, 0X29F3, GI_SWORD_GREAT_FAIRY,
EnGirlA_CanBuySword, EnGirlA_BuySword, EnGirlA_BuyFanfare },
{ OBJECT_GI_SWORD_1, GID_SWORD_KOKIRI, func_800B8050, 1, 0X29F4, 0X29F5, GI_SWORD_KOKIRI, EnGirlA_CanBuySword,
EnGirlA_BuySword, EnGirlA_BuyFanfare },
{ OBJECT_GI_SWORD_2, GID_SWORD_RAZOR, func_800B8050, 2, 0X29F4, 0X29F5, GI_SWORD_RAZOR, EnGirlA_CanBuySword,
EnGirlA_BuySword, EnGirlA_BuyFanfare },
{ OBJECT_GI_SWORD_3, GID_SWORD_GILDED, func_800B8050, 3, 0X29F4, 0X29F5, GI_SWORD_GILDED, EnGirlA_CanBuySword,
EnGirlA_BuySword, EnGirlA_BuyFanfare },
{ OBJECT_GI_SHIELD_2, GID_SHIELD_HERO, func_800B8050, 1, 0X29F6, 0X29F7, GI_SHIELD_HERO_2, EnGirlA_CanBuyShieldHero,
EnGirlA_BuyShieldHero, EnGirlA_BuyFanfare },
{ OBJECT_GI_SHIELD_3, GID_SHIELD_MIRROR, func_800B8050, 1, 0X29F6, 0X29F7, GI_SHIELD_MIRROR,
EnGirlA_CanBuyShieldMirror, EnGirlA_BuyShieldMirror, EnGirlA_BuyFanfare },
};
#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_GirlA_0x80863870/func_8086387C.asm")
void EnGirlA_SetupAction(EnGirlA* this, EnGirlAActionFunc action) {
this->actionFunc = action;
}
#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_GirlA_0x80863870/EnGirlA_Init.asm")
void EnGirlA_InitObjIndex(EnGirlA* this, GlobalContext* globalCtx) {
s16 params = this->actor.params;
#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_GirlA_0x80863870/EnGirlA_Destroy.asm")
//! @bug: Condition is impossible
if (params >= 43 && params < 0) {
Actor_MarkForDeath(&this->actor);
return;
}
#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_GirlA_0x80863870/func_80863950.asm")
this->objIndex = Object_GetIndex(&globalCtx->objectCtx, sShopItemEntries[params].objectId);
if (this->objIndex < 0) {
Actor_MarkForDeath(&this->actor);
return;
}
#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_GirlA_0x80863870/func_808639B0.asm")
this->actor.params = params;
this->mainActionFunc = EnGirlA_InitalUpdate;
}
#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_GirlA_0x80863870/func_80863A10.asm")
void EnGirlA_Init(Actor* thisx, GlobalContext* globalCtx) {
EnGirlA* this = THIS;
#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_GirlA_0x80863870/func_80863AAC.asm")
EnGirlA_InitObjIndex(this, globalCtx);
}
#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_GirlA_0x80863870/func_80863B4C.asm")
void EnGirlA_Destroy(Actor* thisx, GlobalContext* globalCtx) {
}
#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_GirlA_0x80863870/func_80863C08.asm")
s32 EnGirlA_CanBuyPotionRed(GlobalContext* globalCtx, EnGirlA* this) {
if (!func_80114E90()) {
return CANBUY_RESULT_NEED_EMPTY_BOTTLE;
}
if (gSaveContext.rupees < globalCtx->msgCtx.unk1206C) {
return CANBUY_RESULT_NEED_RUPEES;
}
return CANBUY_RESULT_SUCCESS;
}
#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_GirlA_0x80863870/func_80863C6C.asm")
s32 EnGirlA_CanBuyPotionGreen(GlobalContext* globalCtx, EnGirlA* this) {
if (!func_80114E90()) {
return CANBUY_RESULT_NEED_EMPTY_BOTTLE;
}
if (gSaveContext.rupees < globalCtx->msgCtx.unk1206C) {
return CANBUY_RESULT_NEED_RUPEES;
}
return CANBUY_RESULT_SUCCESS;
}
#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_GirlA_0x80863870/func_80863D28.asm")
s32 EnGirlA_CanBuyPotionBlue(GlobalContext* globalCtx, EnGirlA* this) {
if (!(gSaveContext.weekEventReg[53] & 8)) {
return CANBUY_RESULT_CANT_GET_NOW;
}
if (!func_80114E90()) {
return CANBUY_RESULT_NEED_EMPTY_BOTTLE;
}
if (!(gSaveContext.weekEventReg[53] & 0x10)) {
return CANBUY_RESULT_SUCCESS;
}
if (gSaveContext.rupees < globalCtx->msgCtx.unk1206C) {
return CANBUY_RESULT_NEED_RUPEES;
}
return CANBUY_RESULT_SUCCESS;
}
#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_GirlA_0x80863870/func_80863D60.asm")
s32 EnGirlA_CanBuyArrows(GlobalContext* globalCtx, EnGirlA* this) {
if (CUR_UPG_VALUE_VOID(UPG_QUIVER) == 0) {
return CANBUY_RESULT_NO_ROOM_2;
}
if (AMMO(ITEM_BOW) >= CUR_CAPACITY(UPG_QUIVER)) {
return CANBUY_RESULT_NO_ROOM_3;
}
if (gSaveContext.rupees < globalCtx->msgCtx.unk1206C) {
return CANBUY_RESULT_NEED_RUPEES;
}
return CANBUY_RESULT_SUCCESS;
}
#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_GirlA_0x80863870/func_80863DC8.asm")
s32 EnGirlA_CanBuyNuts(GlobalContext* globalCtx, EnGirlA* this) {
if (CUR_CAPACITY(UPG_NUTS) != 0 && AMMO(ITEM_NUT) >= CUR_CAPACITY(UPG_NUTS)) {
return CANBUY_RESULT_NO_ROOM;
}
if (gSaveContext.rupees < globalCtx->msgCtx.unk1206C) {
return CANBUY_RESULT_NEED_RUPEES;
}
if (func_80114978(ITEM_NUT) == ITEM_NONE) {
return CANBUY_RESULT_SUCCESS_FANFARE;
}
return CANBUY_RESULT_SUCCESS;
}
#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_GirlA_0x80863870/func_80863E48.asm")
s32 EnGirlA_CanBuyShieldHero(GlobalContext* globalCtx, EnGirlA* this) {
if (CUR_EQUIP_VALUE_VOID(EQUIP_SHIELD) != 0) {
return CANBUY_RESULT_NO_ROOM;
}
if (gSaveContext.rupees < globalCtx->msgCtx.unk1206C) {
return CANBUY_RESULT_NEED_RUPEES;
}
return CANBUY_RESULT_SUCCESS_FANFARE;
}
#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_GirlA_0x80863870/func_80863EC8.asm")
s32 EnGirlA_CanBuyStick(GlobalContext* globalCtx, EnGirlA* this) {
if (CUR_CAPACITY(UPG_STICK) != 0 && AMMO(ITEM_STICK) >= CUR_CAPACITY(UPG_STICK)) {
return CANBUY_RESULT_NO_ROOM;
}
if (gSaveContext.rupees < globalCtx->msgCtx.unk1206C) {
return CANBUY_RESULT_NEED_RUPEES;
}
if (func_80114978(ITEM_STICK) == ITEM_NONE) {
return CANBUY_RESULT_SUCCESS_FANFARE;
}
return CANBUY_RESULT_SUCCESS;
}
#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_GirlA_0x80863870/func_80863F94.asm")
s32 EnGirlA_CanBuyMaskAllNight(GlobalContext* globalCtx, EnGirlA* this) {
if (gSaveContext.rupees < globalCtx->msgCtx.unk1206C) {
return CANBUY_RESULT_NEED_RUPEES;
}
return CANBUY_RESULT_SUCCESS;
}
#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_GirlA_0x80863870/func_80864034.asm")
s32 EnGirlA_CanBuyBombBagCuriosityShop(GlobalContext* globalCtx, EnGirlA* this) {
if (CUR_UPG_VALUE_VOID(UPG_BOMB_BAG) >= 2) {
return CANBUY_RESULT_CANT_GET_NOW;
}
if (gSaveContext.rupees < globalCtx->msgCtx.unk1206C) {
return CANBUY_RESULT_NEED_RUPEES;
}
return CANBUY_RESULT_SUCCESS;
}
#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_GirlA_0x80863870/func_8086406C.asm")
s32 EnGirlA_CanBuyBombBag20BombShop(GlobalContext* globalCtx, EnGirlA* this) {
if (CUR_UPG_VALUE_VOID(UPG_BOMB_BAG) == 1) {
return CANBUY_RESULT_ALREADY_HAVE;
}
if (CUR_UPG_VALUE_VOID(UPG_BOMB_BAG) >= 2) {
return CANBUY_RESULT_HAVE_BETTER;
}
if (gSaveContext.rupees < globalCtx->msgCtx.unk1206C) {
return CANBUY_RESULT_NEED_RUPEES;
}
return CANBUY_RESULT_SUCCESS_FANFARE;
}
#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_GirlA_0x80863870/func_808640A4.asm")
s32 EnGirlA_CanBuyBombBag30BombShop(GlobalContext* globalCtx, EnGirlA* this) {
if (CUR_UPG_VALUE_VOID(UPG_BOMB_BAG) == 2) {
return CANBUY_RESULT_ALREADY_HAVE;
}
if (CUR_UPG_VALUE_VOID(UPG_BOMB_BAG) == 3) {
return CANBUY_RESULT_HAVE_BETTER;
}
if (gSaveContext.rupees < globalCtx->msgCtx.unk1206C) {
return CANBUY_RESULT_NEED_RUPEES;
}
return CANBUY_RESULT_SUCCESS_FANFARE;
}
#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_GirlA_0x80863870/func_80864108.asm")
s32 EnGirlA_CanBuyBombchus(GlobalContext* globalCtx, EnGirlA* this) {
if (CUR_UPG_VALUE_VOID(UPG_BOMB_BAG) == 0) {
return CANBUY_RESULT_CANT_GET_NOW;
}
if (AMMO(ITEM_BOMBCHU) >= CUR_CAPACITY(UPG_BOMB_BAG)) {
return CANBUY_RESULT_NO_ROOM;
}
if (gSaveContext.rupees < globalCtx->msgCtx.unk1206C) {
return CANBUY_RESULT_NEED_RUPEES;
}
if (func_80114978(ITEM_BOMBCHU) == ITEM_NONE) {
return CANBUY_RESULT_SUCCESS_FANFARE;
}
return CANBUY_RESULT_SUCCESS;
}
#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_GirlA_0x80863870/func_80864168.asm")
s32 EnGirlA_CanBuyBombs(GlobalContext* globalCtx, EnGirlA* this) {
if (CUR_UPG_VALUE_VOID(UPG_BOMB_BAG) == 0) {
return CANBUY_RESULT_CANT_GET_NOW;
}
if (AMMO(ITEM_BOMB) >= CUR_CAPACITY(UPG_BOMB_BAG)) {
return CANBUY_RESULT_NO_ROOM;
}
if (gSaveContext.rupees < globalCtx->msgCtx.unk1206C) {
return CANBUY_RESULT_NEED_RUPEES;
}
return CANBUY_RESULT_SUCCESS;
}
#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_GirlA_0x80863870/func_80864210.asm")
s32 EnGirlA_CanBuyBottle(GlobalContext* globalCtx, EnGirlA* this) {
if (gSaveContext.rupees < globalCtx->msgCtx.unk1206C) {
return CANBUY_RESULT_NEED_RUPEES;
}
return CANBUY_RESULT_SUCCESS_FANFARE;
}
#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_GirlA_0x80863870/func_8086425C.asm")
s32 EnGirlA_CanBuySword(GlobalContext* globalCtx, EnGirlA* this) {
if (gSaveContext.rupees < globalCtx->msgCtx.unk1206C) {
return CANBUY_RESULT_NEED_RUPEES;
}
return CANBUY_RESULT_SUCCESS_FANFARE;
}
#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_GirlA_0x80863870/func_808642D4.asm")
s32 EnGirlA_CanBuyShieldMirror(GlobalContext* globalCtx, EnGirlA* this) {
if (CUR_EQUIP_VALUE_VOID(EQUIP_SHIELD) != 0) {
return CANBUY_RESULT_NO_ROOM;
}
if (gSaveContext.rupees < globalCtx->msgCtx.unk1206C) {
return CANBUY_RESULT_NEED_RUPEES;
}
return CANBUY_RESULT_SUCCESS_FANFARE;
}
#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_GirlA_0x80863870/func_80864320.asm")
s32 EnGirlA_CanBuyFairy(GlobalContext* globalCtx, EnGirlA* this) {
if (!func_80114E90()) {
return CANBUY_RESULT_NEED_EMPTY_BOTTLE;
}
if (gSaveContext.rupees < globalCtx->msgCtx.unk1206C) {
return CANBUY_RESULT_NEED_RUPEES;
}
return CANBUY_RESULT_SUCCESS;
}
#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_GirlA_0x80863870/func_8086436C.asm")
void EnGirlA_BuyBottleItem(GlobalContext* globalCtx, EnGirlA* this) {
switch (this->actor.params) {
case 0:
case 10:
case 18:
case 29:
case 32:
case 35:
Item_Give(globalCtx, ITEM_POTION_RED);
break;
case 1:
case 5:
case 14:
Item_Give(globalCtx, ITEM_POTION_GREEN);
break;
case 2:
Item_Give(globalCtx, ITEM_POTION_BLUE);
break;
case 3:
case 11:
Item_Give(globalCtx, ITEM_FAIRY);
break;
}
func_801159EC(-globalCtx->msgCtx.unk1206C);
}
#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_GirlA_0x80863870/func_808643B8.asm")
void EnGirlA_BuyArrows(GlobalContext* globalCtx, EnGirlA* this) {
func_80115A14(ITEM_BOW, this->itemParams);
func_801159EC(-globalCtx->msgCtx.unk1206C);
}
#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_GirlA_0x80863870/func_8086444C.asm")
void EnGirlA_BuyNuts(GlobalContext* globalCtx, EnGirlA* this) {
switch (this->itemParams) {
case 5:
Item_Give(globalCtx, ITEM_NUTS_5);
break;
case 10:
Item_Give(globalCtx, ITEM_NUTS_10);
break;
}
func_801159EC(-globalCtx->msgCtx.unk1206C);
}
#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_GirlA_0x80863870/func_808644A4.asm")
void EnGirlA_BuyShieldHero(GlobalContext* globalCtx, EnGirlA* this) {
Item_Give(globalCtx, ITEM_SHIELD_HERO);
func_801159EC(-globalCtx->msgCtx.unk1206C);
}
#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_GirlA_0x80863870/func_80864558.asm")
void EnGirlA_BuyStick(GlobalContext* globalCtx, EnGirlA* this) {
Item_Give(globalCtx, ITEM_STICK);
func_801159EC(-globalCtx->msgCtx.unk1206C);
}
#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_GirlA_0x80863870/func_808645A4.asm")
void EnGirlA_BuyMaskAllNight(GlobalContext* globalCtx, EnGirlA* this) {
Item_Give(globalCtx, ITEM_MASK_ALL_NIGHT);
func_801159EC(-globalCtx->msgCtx.unk1206C);
}
#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_GirlA_0x80863870/func_80864658.asm")
void EnGirlA_BuyBombBag(GlobalContext* globalCtx, EnGirlA* this) {
//! @bug: Bomb Bag parameters in sShopItemEntries are 1 2 3, not 20 21 22
switch (this->itemParams) {
case 20:
Item_Give(globalCtx, ITEM_BOMB_BAG_20);
break;
case 21:
Item_Give(globalCtx, ITEM_BOMB_BAG_30);
break;
case 22:
Item_Give(globalCtx, ITEM_BOMB_BAG_40);
break;
}
func_801159EC(-globalCtx->msgCtx.unk1206C);
}
#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_GirlA_0x80863870/func_808646A4.asm")
void EnGirlA_BuyBombchus(GlobalContext* globalCtx, EnGirlA* this) {
if (this->itemParams == 10) {
Item_Give(globalCtx, ITEM_BOMBCHUS_10);
}
func_801159EC(-globalCtx->msgCtx.unk1206C);
}
#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_GirlA_0x80863870/func_808646E4.asm")
void EnGirlA_BuyBombs(GlobalContext* globalCtx, EnGirlA* this) {
switch (this->itemParams) {
case 5:
Item_Give(globalCtx, ITEM_BOMBS_5);
break;
case 10:
Item_Give(globalCtx, ITEM_BOMBS_10);
break;
case 20:
Item_Give(globalCtx, ITEM_BOMBS_20);
break;
case 30:
Item_Give(globalCtx, ITEM_BOMBS_30);
break;
}
func_801159EC(-globalCtx->msgCtx.unk1206C);
}
#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_GirlA_0x80863870/func_808646F4.asm")
void EnGirlA_BuyBottle(GlobalContext* globalCtx, EnGirlA* this) {
Item_Give(globalCtx, ITEM_BOTTLE);
func_801159EC(-globalCtx->msgCtx.unk1206C);
}
#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_GirlA_0x80863870/func_8086472C.asm")
void EnGirlA_BuySword(GlobalContext* globalCtx, EnGirlA* this) {
switch (this->itemParams) {
case 1:
Item_Give(globalCtx, ITEM_SWORD_KOKIRI);
break;
case 2:
Item_Give(globalCtx, ITEM_SWORD_RAZOR);
break;
case 3:
Item_Give(globalCtx, ITEM_SWORD_GILDED);
break;
case 4:
Item_Give(globalCtx, ITEM_SWORD_GREAT_FAIRY);
break;
}
func_801159EC(-globalCtx->msgCtx.unk1206C);
}
#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_GirlA_0x80863870/func_80864744.asm")
void EnGirlA_BuyShieldMirror(GlobalContext* globalCtx, EnGirlA* this) {
Item_Give(globalCtx, ITEM_SHIELD_MIRROR);
func_801159EC(-globalCtx->msgCtx.unk1206C);
}
#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_GirlA_0x80863870/func_80864760.asm")
// Fanfare is handled by ovl_en_ossan
void EnGirlA_BuyFanfare(GlobalContext* globalCtx, EnGirlA* this) {
func_801159EC(-globalCtx->msgCtx.unk1206C);
}
#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_GirlA_0x80863870/func_80864774.asm")
void EnGirlA_DoNothing(EnGirlA* this, GlobalContext* globalCtx) {
}
#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_GirlA_0x80863870/func_808648F8.asm")
void EnGirlA_InitItem(GlobalContext* globalCtx, EnGirlA* this) {
ShopItemEntry* shopItem = &sShopItemEntries[this->actor.params];
#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_GirlA_0x80863870/EnGirlA_Update.asm")
this->actor.textId = shopItem->descriptionTextId;
this->isOutOfStock = false;
this->actor.draw = EnGirlA_Draw;
}
#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_GirlA_0x80863870/func_808649C8.asm")
void EnGirlA_Bought(GlobalContext* globalCtx, EnGirlA* this) {
this->isOutOfStock = true;
this->actor.draw = NULL;
}
void EnGirlA_Restock(GlobalContext* globalCtx, EnGirlA* this) {
this->isOutOfStock = false;
this->actor.draw = EnGirlA_Draw;
}
// Left over from OOT
s32 EnGirlA_TrySetMaskItemDescription(EnGirlA* this, GlobalContext* globalCtx) {
return false;
}
void EnGirlA_InitalUpdate(EnGirlA* this, GlobalContext* globalCtx) {
s16 params = this->actor.params;
ShopItemEntry* shopItem = &sShopItemEntries[params];
if (Object_IsLoaded(&globalCtx->objectCtx, this->objIndex)) {
this->actor.flags &= ~0x10;
this->actor.objBankIndex = this->objIndex;
this->actor.textId = shopItem->descriptionTextId;
this->choiceTextId = shopItem->choiceTextId;
// EnGirlA_TrySetMaskItemDescription always returns false
if (!EnGirlA_TrySetMaskItemDescription(this, globalCtx)) {
EnGirlA_InitItem(globalCtx, this);
}
this->boughtFunc = EnGirlA_Bought;
this->restockFunc = EnGirlA_Restock;
this->getItemId = shopItem->getItemId;
this->canBuyFunc = shopItem->canBuyFunc;
this->buyFunc = shopItem->buyFunc;
this->buyFanfareFunc = shopItem->buyFanfareFunc;
this->unk1C0 = 0;
this->itemParams = shopItem->params;
this->drawFunc = shopItem->drawFunc;
this->getItemDrawId = shopItem->getItemDrawId;
this->actor.flags &= ~1;
Actor_SetScale(&this->actor, 0.25f);
this->actor.shape.yOffset = 24.0f;
this->actor.shape.shadowScale = 4.0f;
this->actor.floorHeight = this->actor.home.pos.y;
this->actor.gravity = 0.0f;
EnGirlA_SetupAction(this, EnGirlA_DoNothing);
this->isInitialized = true;
this->mainActionFunc = EnGirlA_Update2;
this->isSelected = false;
this->rotY = 0;
this->initialRotY = this->actor.shape.rot.y;
}
}
void EnGirlA_Update2(EnGirlA* this, GlobalContext* globalCtx) {
Actor_SetScale(&this->actor, 0.25f);
this->actor.shape.yOffset = 24.0f;
this->actor.shape.shadowScale = 4.0f;
EnGirlA_TrySetMaskItemDescription(this, globalCtx);
this->actionFunc(this, globalCtx);
Actor_SetHeight(&this->actor, 5.0f);
this->actor.shape.rot.x = 0;
if (this->isSelected) {
this->rotY += 0x1F4;
} else {
Math_SmoothStepToS(&this->rotY, 0, 0xA, 0x7D0, 0);
}
}
void EnGirlA_Update(Actor* thisx, GlobalContext* globalCtx) {
EnGirlA* this = THIS;
this->mainActionFunc(this, globalCtx);
}
void EnGirlA_Draw(Actor* thisx, GlobalContext* globalCtx) {
EnGirlA* this = THIS;
Matrix_RotateY(this->rotY, MTXMODE_APPLY);
if (this->drawFunc != NULL) {
this->drawFunc(&this->actor, globalCtx, 0);
}
GetItem_Draw(globalCtx, this->getItemDrawId);
}
+51 -1
View File
@@ -5,11 +5,61 @@
struct EnGirlA;
typedef void (*EnGirlAActionFunc)(struct EnGirlA*, GlobalContext*);
typedef void (*EnGirlADrawFunc)(struct Actor*, GlobalContext*, s32);
typedef s32 (*EnGirlACanBuyFunc)(GlobalContext*, struct EnGirlA*);
typedef void (*EnGirlAShopActionFunc)(GlobalContext*, struct EnGirlA*); // Buying/Restocking
typedef struct ShopItemEntry {
/* 0x00 */ s16 objectId;
/* 0x02 */ s16 getItemDrawId;
/* 0x04 */ EnGirlADrawFunc drawFunc;
/* 0x08 */ s16 params;
/* 0x0A */ u16 descriptionTextId;
/* 0x0C */ u16 choiceTextId;
/* 0x10 */ s32 getItemId;
/* 0x14 */ EnGirlACanBuyFunc canBuyFunc;
/* 0x18 */ EnGirlAShopActionFunc buyFunc;
/* 0x1C */ EnGirlAShopActionFunc buyFanfareFunc;
} ShopItemEntry; // size = 0x20
typedef struct EnGirlA {
/* 0x000 */ Actor actor;
/* 0x144 */ char unk_144[0x88];
/* 0x144 */ char unk144[0x44];
/* 0x188 */ EnGirlAActionFunc actionFunc;
/* 0x18C */ s8 objIndex;
/* 0x190 */ EnGirlAActionFunc mainActionFunc;
/* 0x194 */ s32 isInitialized;
/* 0x198 */ u16 choiceTextId;
/* 0x19C */ s32 getItemId;
/* 0x1A0 */ s16 isOutOfStock;
/* 0x1A4 */ EnGirlAShopActionFunc boughtFunc;
/* 0x1A8 */ EnGirlAShopActionFunc restockFunc;
/* 0x1AC */ s16 isSelected;
/* 0x1AE */ s16 initialRotY;
/* 0x1B0 */ s16 rotY;
/* 0x1B4 */ EnGirlACanBuyFunc canBuyFunc;
/* 0x1B8 */ EnGirlAShopActionFunc buyFunc;
/* 0x1BC */ EnGirlAShopActionFunc buyFanfareFunc;
/* 0x1C0 */ s16 unk1C0;
/* 0x1C2 */ s16 itemParams;
/* 0x1C4 */ s16 getItemDrawId;
/* 0x1C8 */ EnGirlADrawFunc drawFunc;
} EnGirlA; // size = 0x1CC
typedef enum {
/* 0 */ CANBUY_RESULT_SUCCESS_FANFARE,
/* 1 */ CANBUY_RESULT_SUCCESS,
/* 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,
/* 8 */ CANBUY_RESULT_ALREADY_HAVE,
/* 9 */ CANBUY_RESULT_HAVE_BETTER
} EnGirlACanBuyResult;
extern const ActorInit En_GirlA_InitVars;
#endif // Z_EN_GIRLA_H
+2 -2
View File
@@ -894,7 +894,7 @@ s32 func_808F4414(GlobalContext* globalCtx, EnIn* this, s32 arg2) {
case 0x347A:
func_808F30B0(&this->skelAnime, 1);
func_808F30B0(&this->unk4A4->skelAnime, 7);
if (gSaveContext.inventory.items[gItemSlots[59]] == 59) {
if (INV_CONTENT(ITEM_MASK_GARO) == ITEM_MASK_GARO) {
func_800E8EA0(globalCtx, &this->actor, 0x347E);
ret = false;
} else {
@@ -1085,7 +1085,7 @@ s32 func_808F4414(GlobalContext* globalCtx, EnIn* this, s32 arg2) {
case 0x349D:
func_808F30B0(&this->skelAnime, 1);
func_808F30B0(&this->unk4A4->skelAnime, 7);
if (gSaveContext.inventory.items[gItemSlots[59]] == 59) {
if (INV_CONTENT(ITEM_MASK_GARO) == ITEM_MASK_GARO) {
func_800E8EA0(globalCtx, &this->actor, 0x34A1);
ret = false;
} else {