diff --git a/asm/macros/scrcmd.inc b/asm/macros/scrcmd.inc index 11a5974702..3df64e668b 100644 --- a/asm/macros/scrcmd.inc +++ b/asm/macros/scrcmd.inc @@ -3275,7 +3275,7 @@ .short \destVarID .endm - .macro ScrCmd_257 + .macro ShowAccessoryShop .short 599 .endm diff --git a/include/constants/items.h b/include/constants/items.h index 18b42091a7..c15c556dae 100644 --- a/include/constants/items.h +++ b/include/constants/items.h @@ -98,4 +98,6 @@ #define ITEM_RETURN_ID 0xFFFF #define SHOP_ITEM_END (ITEM_RETURN_ID) +#define BERRY_ID(itemId) (ITEM_##itemId##_BERRY - FIRST_BERRY_IDX) + #endif // POKEPLATINUM_CONSTANTS_ITEMS_H diff --git a/include/overlay007/accessory_shop.h b/include/overlay007/accessory_shop.h new file mode 100644 index 0000000000..f05876cee0 --- /dev/null +++ b/include/overlay007/accessory_shop.h @@ -0,0 +1,136 @@ +#ifndef POKEPLATINUM_ACCESSORY_SHOP_H +#define POKEPLATINUM_ACCESSORY_SHOP_H + +#include "constants/heap.h" + +#include "struct_decls/struct_02029D04_decl.h" + +#include "bag.h" +#include "bg_window.h" +#include "list_menu.h" +#include "menu.h" +#include "savedata.h" +#include "sprite.h" +#include "sprite_resource.h" +#include "sprite_transfer.h" +#include "sprite_util.h" +#include "strbuf.h" +#include "string_template.h" + +enum AccessoryShopState { + ACCESSORY_SHOP_STATE_LOAD_GREET_MSG = 0, + ACCESSORY_SHOP_STATE_INIT_ITEM_LIST, + ACCESSORY_SHOP_STATE_INIT_INTERFACE, + ACCESSORY_SHOP_STATE_LOAD_BUY_MSG, + ACCESSORY_SHOP_STATE_SELECT_ITEM_LIST, + ACCESSORY_SHOP_STATE_INIT_YES_NO_CHOICE, + ACCESSORY_SHOP_STATE_SELECT_YES_NO_CHOICE, + ACCESSORY_SHOP_STATE_CONFIRM_PURCHASE, + // player traded everything in the shop + ACCESSORY_SHOP_STATE_LOAD_SHOCKED_MSG, + ACCESSORY_SHOP_STATE_LOAD_THANKS_MSG, + ACCESSORY_SHOP_STATE_WAIT_MSGBOX, + ACCESSORY_SHOP_STATE_WAIT_AB_INPUT, + ACCESSORY_SHOP_STATE_FREE_INTERFACE, +}; + +enum AccessoryShopSpriteResourceIdx { + ACCESSORY_SHOP_RES_IDX_TILES = 0, + ACCESSORY_SHOP_RES_IDX_PALETTE, + ACCESSORY_SHOP_RES_IDX_CELL, + ACCESSORY_SHOP_RES_IDX_ANIM, + + ACCESSORY_SHOP_RES_IDX_COUNT, +}; + +enum AccessoryShopStaticSprite { + ACCESSORY_SHOP_SPRITE_SCROLL_ARROW_TOP = 0, + ACCESSORY_SHOP_SPRITE_SCROLL_ARROW_BOTTOM, + + ACCESSORY_SHOP_SPRITE_COUNT, +}; + +#define ACCESSORY_SHOP_ITEM_LIST_COUNT 22 +#define ACCESSORY_SHOP_FORMAT_STRS 3 + +typedef struct AccessoryShopItem { + u32 accessoryID; + u32 itemBerryID; + u32 totalAmount; +} AccessoryShopItem; + +typedef void (*AccessoryShopUpdateFunc)(void *, u32); + +typedef struct AccessoryShopMessageBox { + BOOL active; + Window *window; + u32 renderDelay; + u32 printerID; + Strbuf *strbuf; +} AccessoryShopMessageBox; + +typedef struct AccessoryShopDescBox { + BOOL active; + Window *window; + StringTemplate *strTemplate; + Strbuf *strbuf; + Strbuf *fmtString[ACCESSORY_SHOP_FORMAT_STRS]; +} AccessoryShopDescBox; + +typedef struct AccessoryShopItemList { + BOOL active; + Window *window; + ListMenu *listMenu; + StringList strList[ACCESSORY_SHOP_ITEM_LIST_COUNT + 1]; + Strbuf *strbuf[ACCESSORY_SHOP_ITEM_LIST_COUNT + 1]; + s32 maxListItems; + StringTemplate *strTemplate; + Strbuf *tempStrbuf; + u16 cursorPos; + u16 unused; + void *unk_130; + AccessoryShopUpdateFunc updateFunc; + SpriteResourceCollection *spriteResCollections[ACCESSORY_SHOP_RES_IDX_COUNT]; + SpriteResource *spriteResources[ACCESSORY_SHOP_RES_IDX_COUNT]; + Sprite *sprites[ACCESSORY_SHOP_SPRITE_COUNT]; +} AccessoryShopItemList; + +typedef struct AccessoryShopYesNoChoice { + BOOL active; + Menu *menu; + enum HeapId heapID; +} AccessoryShopYesNoChoice; + +typedef struct AccessoryShopDataPtrs { + enum HeapId heapID; + BgConfig *bgConfig; + AccessoryShopDescBox *descBox; + const AccessoryShopItem *items; + Bag *bag; +} AccessoryShopDataPtrs; + +typedef struct AccessoryShop { + enum AccessoryShopState state; + enum AccessoryShopState nextState; + SaveData *saveData; + UnkStruct_02029D04 *unk_0C; + Bag *bag; + BgConfig *bgConfig; + enum HeapId heapID; + SpriteList *spriteList; + G2dRenderer g2dRenderer; + MessageLoader *msgLoader; + u32 msgBoxFrame; + u32 renderDelay; + AccessoryShopMessageBox msgbox; + AccessoryShopDescBox descBox; + AccessoryShopItemList itemList; + AccessoryShopYesNoChoice yesNoChoice; + AccessoryShopDataPtrs dataPtr; +} AccessoryShop; + +AccessoryShop *AccessoryShop_New(enum HeapId heapID, SaveData *saveData, BgConfig *bgConfig); +void AccessoryShop_Free(AccessoryShop *shop); +BOOL AccessoryShop_Main(AccessoryShop *shop); + +#endif // POKEPLATINUM_ACCESSORY_SHOP_H diff --git a/include/overlay007/ov7_0224BE9C.h b/include/overlay007/ov7_0224BE9C.h deleted file mode 100644 index 06e88855ef..0000000000 --- a/include/overlay007/ov7_0224BE9C.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef POKEPLATINUM_OV7_0224BE9C_H -#define POKEPLATINUM_OV7_0224BE9C_H - -#include "overlay007/struct_ov7_0224BEFC_decl.h" - -#include "bg_window.h" -#include "savedata.h" - -UnkStruct_ov7_0224BEFC *ov7_0224BE9C(u32 param0, SaveData *param1, BgConfig *param2); -void ov7_0224BEFC(UnkStruct_ov7_0224BEFC *param0); -BOOL ov7_0224BF2C(UnkStruct_ov7_0224BEFC *param0); - -#endif // POKEPLATINUM_OV7_0224BE9C_H diff --git a/include/overlay007/struct_ov7_0224BEFC_decl.h b/include/overlay007/struct_ov7_0224BEFC_decl.h deleted file mode 100644 index fb78ab2ae7..0000000000 --- a/include/overlay007/struct_ov7_0224BEFC_decl.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef POKEPLATINUM_STRUCT_OV7_0224BEFC_DECL_H -#define POKEPLATINUM_STRUCT_OV7_0224BEFC_DECL_H - -typedef struct UnkStruct_ov7_0224BEFC_t UnkStruct_ov7_0224BEFC; - -#endif // POKEPLATINUM_STRUCT_OV7_0224BEFC_DECL_H diff --git a/include/scrcmd_shop.h b/include/scrcmd_shop.h index abad5f76eb..c77cf78218 100644 --- a/include/scrcmd_shop.h +++ b/include/scrcmd_shop.h @@ -7,6 +7,6 @@ BOOL ScrCmd_PokeMartCommon(ScriptContext *ctx); BOOL ScrCmd_PokeMartSpecialties(ScriptContext *ctx); BOOL ScrCmd_PokeMartDecor(ScriptContext *ctx); BOOL ScrCmd_PokeMartSeal(ScriptContext *ctx); -BOOL ScrCmd_257(ScriptContext *param0); +BOOL ScrCmd_ShowAccessoryShop(ScriptContext *ctx); #endif // POKEPLATINUM_SCRCMD_SHOP_H diff --git a/include/unk_0203D1B8.h b/include/unk_0203D1B8.h index 6ab49c5798..9da84bd969 100644 --- a/include/unk_0203D1B8.h +++ b/include/unk_0203D1B8.h @@ -84,7 +84,7 @@ void sub_0203E2D4(FieldSystem *fieldSystem, void *param1); void sub_0203E2FC(FieldSystem *fieldSystem); BOOL sub_0203E348(FieldSystem *fieldSystem, UnkStruct_0203E348 *param1); void sub_0203E414(FieldTask *param0, int param1); -void sub_0203E518(FieldTask *param0); +void AccessoryShop_Init(FieldTask *task); void *sub_0203E53C(FieldSystem *fieldSystem, int param1, int param2); void *sub_0203E564(FieldSystem *fieldSystem, u8 param1, u8 param2, u16 param3, int param4); PartyManagementData *sub_0203E598(FieldSystem *fieldSystem, int param1, int param2); diff --git a/platinum.us/main.lsf b/platinum.us/main.lsf index 829a8a28d3..98fa0dc8b9 100644 --- a/platinum.us/main.lsf +++ b/platinum.us/main.lsf @@ -601,7 +601,7 @@ Overlay overlay7 After overlay6 Object main.nef.p/src_overlay007_communication_club.c.o Object main.nef.p/src_overlay007_ov7_0224B4E8.c.o - Object main.nef.p/src_overlay007_ov7_0224BE9C.c.o + Object main.nef.p/src_overlay007_accessory_shop.c.o Object main.nef.p/src_overlay007_shop_menu.c.o } diff --git a/res/field/scripts/scripts_flower_shop.s b/res/field/scripts/scripts_flower_shop.s index 435c994a58..2cfc17e0bf 100644 --- a/res/field/scripts/scripts_flower_shop.s +++ b/res/field/scripts/scripts_flower_shop.s @@ -63,7 +63,7 @@ _00A9: PlayFanfare SEQ_SE_CONFIRM LockAll FacePlayer - ScrCmd_257 + ShowAccessoryShop ReleaseAll End diff --git a/res/text/flower_shop.gmm b/res/text/flower_shop.gmm index 31dc77a9d3..c5f1838f75 100644 --- a/res/text/flower_shop.gmm +++ b/res/text/flower_shop.gmm @@ -17,67 +17,67 @@ used Use that Sprayduck to water the soil\nwhere you’ve planted Berries.\rYou should also water Berry plants\nwhile they are growing. - + used Hello!\rWould you like to exchange your\nBerries for some Accessories? - + used Thank you so much for trading us so\nmany Berries! - + used Which Accessory would you like? - + used Exchange {STRVAR_1 52, 1, 0} {STRVAR_1 8, 0, 0}\nfor the {STRVAR_1 31, 2, 0}? - + used Thank you! - + used You don’t have enough Berries. - + used Oh, you can’t carry any more\nthan that. - + used Please come again! - + used You got the {STRVAR_1 31, 2, 0} in return\nfor {STRVAR_1 52, 1, 0} {STRVAR_1 8, 0, 0}. - + used Wow! I traded away every single\nAccessory I had! - + used YES - + used NO - + used {STRVAR_1 8, 0, 0} - + used Needed: {STRVAR_1 52, 1, 0} - + used In Bag: {STRVAR_1 52, 2, 0} - + used EXIT diff --git a/src/meson.build b/src/meson.build index fc3bb96cf3..07ed9a3ba8 100644 --- a/src/meson.build +++ b/src/meson.build @@ -485,7 +485,7 @@ pokeplatinum_c = files( 'overlay006/ov6_022489E4.c', 'overlay007/communication_club.c', 'overlay007/ov7_0224B4E8.c', - 'overlay007/ov7_0224BE9C.c', + 'overlay007/accessory_shop.c', 'overlay007/shop_menu.c', 'overlay008/ov8_02249960.c', 'overlay009/ov9_02249960.c', diff --git a/src/overlay007/accessory_shop.c b/src/overlay007/accessory_shop.c new file mode 100644 index 0000000000..d0c7aa58cb --- /dev/null +++ b/src/overlay007/accessory_shop.c @@ -0,0 +1,764 @@ +#include "overlay007/accessory_shop.h" + +#include +#include + +#include "constants/field/window.h" +#include "constants/scrcmd.h" +#include "generated/sdat.h" +#include "generated/text_banks.h" + +#include "overlay007/shop_menu.h" + +#include "bg_window.h" +#include "field_message.h" +#include "font.h" +#include "game_options.h" +#include "graphics.h" +#include "heap.h" +#include "message.h" +#include "narc.h" +#include "render_window.h" +#include "save_player.h" +#include "savedata.h" +#include "string_list.h" +#include "system.h" +#include "text.h" +#include "unk_02005474.h" +#include "unk_020298BC.h" + +#include "res/graphics/shop_menu/shop_gra.naix" +#include "res/text/bank/flower_shop.h" + +static const AccessoryShopItem sAccessoryShop_ItemLists[ACCESSORY_SHOP_ITEM_LIST_COUNT] = { + { 0x32, BERRY_ID(CHERI), 1 }, + { 0x33, BERRY_ID(CHESTO), 1 }, + { 0x34, BERRY_ID(PECHA), 1 }, + { 0x35, BERRY_ID(ORAN), 1 }, + { 0x36, BERRY_ID(RAWST), 1 }, + { 0x37, BERRY_ID(ASPEAR), 1 }, + { 0x38, BERRY_ID(LEPPA), 1 }, + { 0x39, BERRY_ID(PERSIM), 1 }, + { 0x3A, BERRY_ID(RAZZ), 10 }, + { 0x3B, BERRY_ID(BLUK), 10 }, + { 0x3C, BERRY_ID(NANAB), 10 }, + { 0x3D, BERRY_ID(WEPEAR), 10 }, + { 0x3E, BERRY_ID(PINAP), 10 }, + { 0x3F, BERRY_ID(CORNN), 50 }, + { 0x40, BERRY_ID(PAMTRE), 100 }, + { 0x41, BERRY_ID(MAGOST), 50 }, + { 0x42, BERRY_ID(WATMEL), 100 }, + { 0x43, BERRY_ID(RABUTA), 50 }, + { 0x44, BERRY_ID(NOMEL), 50 }, + { 0x45, BERRY_ID(DURIN), 100 }, + { 0x46, BERRY_ID(SPELON), 100 }, + { 0x47, BERRY_ID(BELUE), 100 } +}; + +static void AccessoryShop_LoadGraphics(AccessoryShop *shop); +static void AccessoryShop_ClearInterface(AccessoryShop *shop); +static void AccessoryShop_InitSpriteList(AccessoryShop *shop); +static void AccessoryShop_DeleteSpriteList(AccessoryShop *shop); +static void AccessoryShop_LoadOptions(AccessoryShop *shop); +static void AccessoryShop_ShowMsgBox(AccessoryShopMessageBox *msgbox, BgConfig *bgConfig, enum HeapId heapID, u32 renderDelay); +static void AccessoryShop_DeleteMsgBox(AccessoryShopMessageBox *msgbox); +static void AccessoryShop_PrintStrbufToMsgBox(AccessoryShopMessageBox *msgbox, Strbuf *strbuf, enum HeapId heapID); +static BOOL AccessoryShop_HasMsgBoxFinishedPrinting(AccessoryShopMessageBox *msgbox); +static void AccessoryShop_LoadConfirmPurchaseMsg(AccessoryShopMessageBox *msgbox, MessageLoader *msgLoader, enum HeapId heapID, const AccessoryShopItem *items, u32 idx); +static void AccessoryShop_LoadSuccessfulPurchaseMsg(AccessoryShopMessageBox *msgbox, MessageLoader *msgLoader, enum HeapId heapID, const AccessoryShopItem *items, u32 idx); +static void AccessoryShop_ShowDescBox(AccessoryShopDescBox *descBox, BgConfig *bgConfig, MessageLoader *msgLoader, enum HeapId heapID); +static void AccessoryShop_DeleteDescBox(AccessoryShopDescBox *descBox); +static void AccessoryShop_UpdateDescBox(AccessoryShopDescBox *descBox, u32 berryId, u32 totalAmount, u32 inBagAmount); +static void AccessoryShop_ShowItemList(AccessoryShopItemList *itemList, BgConfig *bgConfig, enum HeapId heapID, const AccessoryShopItem *items, u32 maxItems, MessageLoader *msgLoader, void *param6, AccessoryShopUpdateFunc updateFunc, SpriteList *spriteList); +static void AccessoryShop_DeleteItemList(AccessoryShopItemList *itemList); +static u32 AccessoryShop_SelectItemListMenu(AccessoryShopItemList *itemList); +static void AccessoryShop_UpdateItemListMenu(AccessoryShopItemList *itemList); +static void AccessoryShop_HideScrollArrows(AccessoryShopItemList *itemList); +static void AccessoryShop_LoadScrollArrowGfx(SpriteResourcesHeader *scrollArrowResource, AccessoryShopItemList *itemList, enum HeapId heapID); +static void AccessoryShop_UnloadScrollArrowGfx(AccessoryShopItemList *itemList); +static void AccessoryShop_UpdateScrollArrowsVisibility(AccessoryShopItemList *itemList); +static void AccessoryShop_ShowYesNoChoice(AccessoryShopYesNoChoice *yesNoChoice, BgConfig *bgConfig, enum HeapId heapID); +static void AccessoryShop_DeleteYesNoChoice(AccessoryShopYesNoChoice *yesNoChoice); +static u32 AccessoryShop_SelectYesNoChoice(AccessoryShopYesNoChoice *yesNoChoice); +static void AccessoryShop_SetDataPointers(AccessoryShopDataPtrs *dataPtr, AccessoryShopDescBox *descBox, const AccessoryShopItem *items, Bag *bag, enum HeapId heapID, BgConfig *bgConfig); +static void AccessoryShop_Update(void *ptr, u32 cursorPos); +static BOOL AccessoryShop_HasAllAccessories(const UnkStruct_02029D04 *param0, const AccessoryShopItem *items, u32 maxItems); +static BOOL AccessoryShop_HasEnoughBerries(Bag *bag, const AccessoryShopItem *items, u32 idx, enum HeapId heapID); +static BOOL ov7_0224CCE4(const UnkStruct_02029D04 *param0, const AccessoryShopItem *items, u32 idx); +static void AccessoryShop_DoPurchase(UnkStruct_02029D04 *param0, Bag *bag, const AccessoryShopItem *items, u32 idx, enum HeapId heapID); + +AccessoryShop *AccessoryShop_New(enum HeapId heapID, SaveData *saveData, BgConfig *bgConfig) +{ + AccessoryShop *shop = Heap_AllocFromHeap(heapID, sizeof(AccessoryShop)); + + memset(shop, 0, sizeof(AccessoryShop)); + + shop->heapID = heapID; + shop->bgConfig = bgConfig; + shop->saveData = saveData; + shop->unk_0C = sub_02029D04(sub_0202A750(shop->saveData)); + shop->bag = SaveData_GetBag(saveData); + shop->msgLoader = MessageLoader_Init(MESSAGE_LOADER_BANK_HANDLE, NARC_INDEX_MSGDATA__PL_MSG, TEXT_BANK_FLOWER_SHOP, shop->heapID); + + AccessoryShop_LoadOptions(shop); + AccessoryShop_LoadGraphics(shop); + AccessoryShop_InitSpriteList(shop); + + return shop; +} + +void AccessoryShop_Free(AccessoryShop *shop) +{ + MessageLoader_Free(shop->msgLoader); + + AccessoryShop_ClearInterface(shop); + AccessoryShop_DeleteSpriteList(shop); + + memset(shop, 0, sizeof(AccessoryShop)); + Heap_FreeToHeap(shop); +} + +BOOL AccessoryShop_Main(AccessoryShop *shop) +{ + Strbuf *strbuf; + u32 input; + + switch (shop->state) { + case ACCESSORY_SHOP_STATE_LOAD_GREET_MSG: + AccessoryShop_ShowMsgBox(&shop->msgbox, shop->bgConfig, shop->heapID, shop->renderDelay); + strbuf = MessageLoader_GetNewStrbuf(shop->msgLoader, flower_shop_greet); + AccessoryShop_PrintStrbufToMsgBox(&shop->msgbox, strbuf, shop->heapID); + Strbuf_Free(strbuf); + shop->state = ACCESSORY_SHOP_STATE_WAIT_AB_INPUT; + shop->nextState = ACCESSORY_SHOP_STATE_INIT_ITEM_LIST; + break; + case ACCESSORY_SHOP_STATE_INIT_ITEM_LIST: + if (AccessoryShop_HasAllAccessories(shop->unk_0C, sAccessoryShop_ItemLists, ACCESSORY_SHOP_ITEM_LIST_COUNT)) { + strbuf = MessageLoader_GetNewStrbuf(shop->msgLoader, flower_shop_thanks); + AccessoryShop_PrintStrbufToMsgBox(&shop->msgbox, strbuf, shop->heapID); + Strbuf_Free(strbuf); + shop->state = ACCESSORY_SHOP_STATE_WAIT_AB_INPUT; + shop->nextState = ACCESSORY_SHOP_STATE_FREE_INTERFACE; + } else { + shop->state = ACCESSORY_SHOP_STATE_INIT_INTERFACE; + } + break; + case ACCESSORY_SHOP_STATE_INIT_INTERFACE: + AccessoryShop_ShowDescBox(&shop->descBox, shop->bgConfig, shop->msgLoader, shop->heapID); + AccessoryShop_SetDataPointers(&shop->dataPtr, &shop->descBox, sAccessoryShop_ItemLists, shop->bag, shop->heapID, shop->bgConfig); + AccessoryShop_ShowItemList(&shop->itemList, shop->bgConfig, shop->heapID, sAccessoryShop_ItemLists, ACCESSORY_SHOP_ITEM_LIST_COUNT, shop->msgLoader, &shop->dataPtr, AccessoryShop_Update, shop->spriteList); + // fallthrough + case ACCESSORY_SHOP_STATE_LOAD_BUY_MSG: + AccessoryShop_UpdateItemListMenu(&shop->itemList); + strbuf = MessageLoader_GetNewStrbuf(shop->msgLoader, flower_shop_purchase); + AccessoryShop_PrintStrbufToMsgBox(&shop->msgbox, strbuf, shop->heapID); + Strbuf_Free(strbuf); + shop->state = ACCESSORY_SHOP_STATE_WAIT_MSGBOX; + shop->nextState = ACCESSORY_SHOP_STATE_SELECT_ITEM_LIST; + break; + case ACCESSORY_SHOP_STATE_SELECT_ITEM_LIST: + input = AccessoryShop_SelectItemListMenu(&shop->itemList); + + if (input != LIST_NOTHING_CHOSEN && input != LIST_CANCEL) { + Bg_FillTilemapRect(shop->bgConfig, BG_LAYER_MAIN_3, 0, 0, 0, 32, 18, 17); + + AccessoryShop_HideScrollArrows(&shop->itemList); + AccessoryShop_LoadConfirmPurchaseMsg(&shop->msgbox, shop->msgLoader, shop->heapID, sAccessoryShop_ItemLists, shop->itemList.cursorPos); + + shop->state = ACCESSORY_SHOP_STATE_WAIT_MSGBOX; + shop->nextState = ACCESSORY_SHOP_STATE_INIT_YES_NO_CHOICE; + + Sound_PlayEffect(SEQ_SE_CONFIRM); + } else if (input == LIST_CANCEL) { + strbuf = MessageLoader_GetNewStrbuf(shop->msgLoader, flower_shop_please_come_again); + AccessoryShop_PrintStrbufToMsgBox(&shop->msgbox, strbuf, shop->heapID); + Strbuf_Free(strbuf); + shop->state = ACCESSORY_SHOP_STATE_WAIT_AB_INPUT; + shop->nextState = ACCESSORY_SHOP_STATE_FREE_INTERFACE; + Sound_PlayEffect(SEQ_SE_CONFIRM); + } + break; + case ACCESSORY_SHOP_STATE_INIT_YES_NO_CHOICE: + AccessoryShop_ShowYesNoChoice(&shop->yesNoChoice, shop->bgConfig, shop->heapID); + shop->state = ACCESSORY_SHOP_STATE_SELECT_YES_NO_CHOICE; + break; + case ACCESSORY_SHOP_STATE_SELECT_YES_NO_CHOICE: + input = AccessoryShop_SelectYesNoChoice(&shop->yesNoChoice); + + if (input == MENU_YES) { + if (AccessoryShop_HasEnoughBerries(shop->bag, sAccessoryShop_ItemLists, shop->itemList.cursorPos, shop->heapID) == FALSE) { + strbuf = MessageLoader_GetNewStrbuf(shop->msgLoader, flower_shop_not_enough_berries); + AccessoryShop_PrintStrbufToMsgBox(&shop->msgbox, strbuf, shop->heapID); + Strbuf_Free(strbuf); + shop->state = ACCESSORY_SHOP_STATE_WAIT_AB_INPUT; + shop->nextState = ACCESSORY_SHOP_STATE_LOAD_BUY_MSG; + AccessoryShop_DeleteYesNoChoice(&shop->yesNoChoice); + break; + } + + if (ov7_0224CCE4(shop->unk_0C, sAccessoryShop_ItemLists, shop->itemList.cursorPos) == FALSE) { + strbuf = MessageLoader_GetNewStrbuf(shop->msgLoader, flower_shop_cant_carry_more_accessories); + AccessoryShop_PrintStrbufToMsgBox(&shop->msgbox, strbuf, shop->heapID); + Strbuf_Free(strbuf); + AccessoryShop_DeleteYesNoChoice(&shop->yesNoChoice); + shop->state = ACCESSORY_SHOP_STATE_WAIT_AB_INPUT; + shop->nextState = ACCESSORY_SHOP_STATE_LOAD_BUY_MSG; + break; + } + + strbuf = MessageLoader_GetNewStrbuf(shop->msgLoader, flower_shop_purchase_success); + AccessoryShop_PrintStrbufToMsgBox(&shop->msgbox, strbuf, shop->heapID); + Strbuf_Free(strbuf); + AccessoryShop_DeleteYesNoChoice(&shop->yesNoChoice); + + shop->state = ACCESSORY_SHOP_STATE_WAIT_AB_INPUT; + shop->nextState = ACCESSORY_SHOP_STATE_CONFIRM_PURCHASE; + } else if (input == MENU_CANCELED) { + AccessoryShop_DeleteYesNoChoice(&shop->yesNoChoice); + shop->state = ACCESSORY_SHOP_STATE_LOAD_BUY_MSG; + } + break; + case ACCESSORY_SHOP_STATE_CONFIRM_PURCHASE: + AccessoryShop_DoPurchase(shop->unk_0C, shop->bag, sAccessoryShop_ItemLists, shop->itemList.cursorPos, shop->heapID); + AccessoryShop_LoadSuccessfulPurchaseMsg(&shop->msgbox, shop->msgLoader, shop->heapID, sAccessoryShop_ItemLists, shop->itemList.cursorPos); + + if (AccessoryShop_HasAllAccessories(shop->unk_0C, sAccessoryShop_ItemLists, ACCESSORY_SHOP_ITEM_LIST_COUNT)) { + shop->state = ACCESSORY_SHOP_STATE_WAIT_AB_INPUT; + shop->nextState = ACCESSORY_SHOP_STATE_LOAD_SHOCKED_MSG; + } else { + shop->state = ACCESSORY_SHOP_STATE_WAIT_AB_INPUT; + shop->nextState = ACCESSORY_SHOP_STATE_LOAD_BUY_MSG; + } + break; + case ACCESSORY_SHOP_STATE_LOAD_SHOCKED_MSG: + strbuf = MessageLoader_GetNewStrbuf(shop->msgLoader, flower_shop_traded_all_accessories); + AccessoryShop_PrintStrbufToMsgBox(&shop->msgbox, strbuf, shop->heapID); + Strbuf_Free(strbuf); + shop->state = ACCESSORY_SHOP_STATE_WAIT_AB_INPUT; + shop->nextState = ACCESSORY_SHOP_STATE_LOAD_THANKS_MSG; + break; + case ACCESSORY_SHOP_STATE_LOAD_THANKS_MSG: + strbuf = MessageLoader_GetNewStrbuf(shop->msgLoader, flower_shop_thanks); + AccessoryShop_PrintStrbufToMsgBox(&shop->msgbox, strbuf, shop->heapID); + Strbuf_Free(strbuf); + shop->state = ACCESSORY_SHOP_STATE_WAIT_AB_INPUT; + shop->nextState = ACCESSORY_SHOP_STATE_FREE_INTERFACE; + break; + case ACCESSORY_SHOP_STATE_WAIT_MSGBOX: + if (AccessoryShop_HasMsgBoxFinishedPrinting(&shop->msgbox)) { + shop->state = shop->nextState; + } + break; + case ACCESSORY_SHOP_STATE_WAIT_AB_INPUT: + if (AccessoryShop_HasMsgBoxFinishedPrinting(&shop->msgbox)) { + if (JOY_NEW(PAD_BUTTON_A | PAD_BUTTON_B)) { + shop->state = shop->nextState; + } + } + break; + case ACCESSORY_SHOP_STATE_FREE_INTERFACE: + AccessoryShop_DeleteMsgBox(&shop->msgbox); + AccessoryShop_DeleteDescBox(&shop->descBox); + AccessoryShop_DeleteItemList(&shop->itemList); + AccessoryShop_DeleteYesNoChoice(&shop->yesNoChoice); + return TRUE; + } + + SpriteList_Update(shop->spriteList); + + return FALSE; +} + +static void AccessoryShop_LoadOptions(AccessoryShop *shop) +{ + Options *options = SaveData_Options(shop->saveData); + + shop->msgBoxFrame = Options_Frame(options); + shop->renderDelay = Options_TextFrameDelay(options); +} + +static void AccessoryShop_LoadGraphics(AccessoryShop *shop) +{ + LoadMessageBoxGraphics(shop->bgConfig, BG_LAYER_MAIN_3, 1, 10, shop->msgBoxFrame, shop->heapID); + Font_LoadScreenIndicatorsPalette(PAL_LOAD_MAIN_BG, PLTT_OFFSET(12), shop->heapID); + LoadStandardWindowGraphics(shop->bgConfig, BG_LAYER_MAIN_3, (1 + (18 + 12)), FIELD_WINDOW_PALETTE_INDEX, 0, shop->heapID); + Font_LoadTextPalette(PAL_LOAD_MAIN_BG, PLTT_OFFSET(FIELD_MESSAGE_PALETTE_INDEX), shop->heapID); + Bg_ClearTilemap(shop->bgConfig, BG_LAYER_MAIN_3); +} + +static void AccessoryShop_ClearInterface(AccessoryShop *shop) +{ + Bg_ClearTilemap(shop->bgConfig, BG_LAYER_MAIN_3); + FieldMessage_LoadTextPalettes(PAL_LOAD_MAIN_BG, TRUE); +} + +static void AccessoryShop_InitSpriteList(AccessoryShop *shop) +{ + shop->spriteList = SpriteList_InitRendering(2, &shop->g2dRenderer, shop->heapID); +} + +static void AccessoryShop_DeleteSpriteList(AccessoryShop *shop) +{ + SpriteList_Delete(shop->spriteList); +} + +static void AccessoryShop_ShowMsgBox(AccessoryShopMessageBox *msgbox, BgConfig *bgConfig, enum HeapId heapID, u32 renderDelay) +{ + if (msgbox->active == TRUE) { + return; + } + + msgbox->renderDelay = renderDelay; + msgbox->window = Window_New(heapID, 1); + + Window_Add(bgConfig, msgbox->window, BG_LAYER_MAIN_3, 2, 19, 27, 4, 12, ((1 + (18 + 12)) + 9)); + Window_FillTilemap(msgbox->window, 15); + Window_DrawMessageBoxWithScrollCursor(msgbox->window, FALSE, 1, 10); + + msgbox->active = TRUE; +} + +static void AccessoryShop_DeleteMsgBox(AccessoryShopMessageBox *msgbox) +{ + if (msgbox->active == FALSE) { + return; + } + + Window_ClearAndCopyToVRAM(msgbox->window); + Window_Remove(msgbox->window); + Windows_Delete(msgbox->window, 1); + + msgbox->active = FALSE; +} + +static void AccessoryShop_PrintStrbufToMsgBox(AccessoryShopMessageBox *msgbox, Strbuf *strbuf, enum HeapId heapID) +{ + GF_ASSERT(msgbox->strbuf == NULL); + + Window_FillTilemap(msgbox->window, 15); + + msgbox->strbuf = Strbuf_Clone(strbuf, heapID); + msgbox->printerID = Text_AddPrinterWithParamsAndColor(msgbox->window, FONT_MESSAGE, msgbox->strbuf, 0, 0, msgbox->renderDelay, TEXT_COLOR(1, 2, 15), NULL); + + Window_CopyToVRAM(msgbox->window); +} + +static BOOL AccessoryShop_HasMsgBoxFinishedPrinting(AccessoryShopMessageBox *msgbox) +{ + if (Text_IsPrinterActive(msgbox->printerID) == FALSE) { + if (msgbox->strbuf != NULL) { + Strbuf_Free(msgbox->strbuf); + msgbox->strbuf = NULL; + } + + return TRUE; + } + + return FALSE; +} + +static void AccessoryShop_LoadConfirmPurchaseMsg(AccessoryShopMessageBox *msgbox, MessageLoader *msgLoader, enum HeapId heapID, const AccessoryShopItem *items, u32 idx) +{ + Strbuf *fmtString, *strbuf; + StringTemplate *strTemplate; + + strTemplate = StringTemplate_Default(heapID); + strbuf = Strbuf_Init(200, heapID); + fmtString = MessageLoader_GetNewStrbuf(msgLoader, flower_shop_confirm_purchase); + + if (items[idx].totalAmount == 1) { + StringTemplate_SetItemName(strTemplate, 0, items[idx].itemBerryID + FIRST_BERRY_IDX); + } else { + StringTemplate_SetItemNamePlural(strTemplate, 0, items[idx].itemBerryID + FIRST_BERRY_IDX); + } + + StringTemplate_SetNumber(strTemplate, 1, items[idx].totalAmount, 3, PADDING_MODE_NONE, CHARSET_MODE_EN); + StringTemplate_SetContestAccessoryName(strTemplate, 2, items[idx].accessoryID); + StringTemplate_Format(strTemplate, strbuf, fmtString); + + AccessoryShop_PrintStrbufToMsgBox(msgbox, strbuf, heapID); + + StringTemplate_Free(strTemplate); + Strbuf_Free(strbuf); + Strbuf_Free(fmtString); +} + +static void AccessoryShop_LoadSuccessfulPurchaseMsg(AccessoryShopMessageBox *msgbox, MessageLoader *msgLoader, enum HeapId heapID, const AccessoryShopItem *items, u32 idx) +{ + Strbuf *fmtString, *strbuf; + StringTemplate *strTemplate; + + strTemplate = StringTemplate_Default(heapID); + strbuf = Strbuf_Init(200, heapID); + fmtString = MessageLoader_GetNewStrbuf(msgLoader, flower_shop_purchase_post_success); + + if (items[idx].totalAmount == 1) { + StringTemplate_SetItemName(strTemplate, 0, items[idx].itemBerryID + FIRST_BERRY_IDX); + } else { + StringTemplate_SetItemNamePlural(strTemplate, 0, items[idx].itemBerryID + FIRST_BERRY_IDX); + } + + StringTemplate_SetNumber(strTemplate, 1, items[idx].totalAmount, 3, PADDING_MODE_NONE, CHARSET_MODE_EN); + StringTemplate_SetContestAccessoryName(strTemplate, 2, items[idx].accessoryID); + StringTemplate_Format(strTemplate, strbuf, fmtString); + + AccessoryShop_PrintStrbufToMsgBox(msgbox, strbuf, heapID); + + StringTemplate_Free(strTemplate); + Strbuf_Free(strbuf); + Strbuf_Free(fmtString); +} + +static void AccessoryShop_ShowDescBox(AccessoryShopDescBox *descBox, BgConfig *bgConfig, MessageLoader *msgLoader, enum HeapId heapID) +{ + if (descBox->active == TRUE) { + return; + } + + descBox->window = Window_New(heapID, 1); + Window_Add(bgConfig, descBox->window, BG_LAYER_MAIN_3, 1, 11, 14, 6, FIELD_MESSAGE_PALETTE_INDEX, (((1 + (18 + 12)) + 9) + (27 * 4))); + descBox->strTemplate = StringTemplate_Default(heapID); + + for (int i = 0; i < ACCESSORY_SHOP_FORMAT_STRS; i++) { + descBox->fmtString[i] = MessageLoader_GetNewStrbuf(msgLoader, flower_shop_berry_name_format + i); + } + + descBox->strbuf = Strbuf_Init(32, heapID); + Window_FillTilemap(descBox->window, 15); + descBox->active = TRUE; +} + +static void AccessoryShop_DeleteDescBox(AccessoryShopDescBox *descBox) +{ + if (descBox->active == FALSE) { + return; + } + + for (int i = 0; i < ACCESSORY_SHOP_FORMAT_STRS; i++) { + Strbuf_Free(descBox->fmtString[i]); + } + + Strbuf_Free(descBox->strbuf); + StringTemplate_Free(descBox->strTemplate); + Window_ClearAndCopyToVRAM(descBox->window); + Window_Remove(descBox->window); + Windows_Delete(descBox->window, 1); + + descBox->active = FALSE; +} + +static void AccessoryShop_UpdateDescBox(AccessoryShopDescBox *descBox, u32 berryId, u32 totalAmount, u32 inBagAmount) +{ + StringTemplate_SetItemName(descBox->strTemplate, 0, berryId + FIRST_BERRY_IDX); + StringTemplate_SetNumber(descBox->strTemplate, 1, totalAmount, 3, PADDING_MODE_SPACES, CHARSET_MODE_EN); + StringTemplate_SetNumber(descBox->strTemplate, 2, inBagAmount, 3, PADDING_MODE_SPACES, CHARSET_MODE_EN); + Window_FillTilemap(descBox->window, 15); + + for (int i = 0; i < ACCESSORY_SHOP_FORMAT_STRS; i++) { + StringTemplate_Format(descBox->strTemplate, descBox->strbuf, descBox->fmtString[i]); + Text_AddPrinterWithParamsAndColor(descBox->window, FONT_SYSTEM, descBox->strbuf, 0, 16 * i, TEXT_SPEED_NO_TRANSFER, TEXT_COLOR(1, 2, 15), NULL); + } + + Window_DrawStandardFrame(descBox->window, FALSE, (1 + (18 + 12)), FIELD_WINDOW_PALETTE_INDEX); +} + +static void AccessoryShop_ShowItemList(AccessoryShopItemList *itemList, BgConfig *bgConfig, enum HeapId heapID, const AccessoryShopItem *items, u32 maxItems, MessageLoader *msgLoader, void *param6, AccessoryShopUpdateFunc updateFunc, SpriteList *spriteList) +{ + int i; + Strbuf *fmtString; + SpriteResourcesHeader scrollArrowResource; + SpriteListTemplate scrollArrowCellParams; + static const u8 scrollArrowsYPos[ACCESSORY_SHOP_SPRITE_COUNT] = { + 8, 136 + }; + static ListMenuTemplate listTemplate = { + .choices = NULL, + .cursorCallback = NULL, + .printCallback = NULL, + .window = NULL, + .count = 0, + .maxDisplay = MAX_ITEM_SHOWN, + .headerXOffset = 0, + .textXOffset = 16, + .cursorXOffset = 0, + .yOffset = 8, + .textColorFg = 1, + .textColorBg = 15, + .textColorShadow = 2, + .letterSpacing = 0, + .lineSpacing = 0, + .pagerMode = PAGER_MODE_NONE, + .fontID = FONT_SYSTEM, + .cursorType = 0, + .parent = NULL + }; + + if (itemList->active == TRUE) { + return; + } + + itemList->active = TRUE; + itemList->maxListItems = maxItems + 1; + itemList->unk_130 = param6; + itemList->updateFunc = updateFunc; + itemList->window = Window_New(heapID, 1); + + Window_Add(bgConfig, itemList->window, BG_LAYER_MAIN_3, 17, 1, 14, 16, FIELD_MESSAGE_PALETTE_INDEX, ((((1 + (18 + 12)) + 9) + (27 * 4)) + (14 * 6))); + + itemList->strTemplate = StringTemplate_Default(heapID); + itemList->tempStrbuf = Strbuf_Init(32, heapID); + + fmtString = MessageLoader_GetNewStrbuf(msgLoader, flower_shop_berry_name_format); + + for (i = 0; i < maxItems; i++) { + StringTemplate_SetContestAccessoryName(itemList->strTemplate, 0, items[i].accessoryID); + StringTemplate_Format(itemList->strTemplate, itemList->tempStrbuf, fmtString); + + itemList->strbuf[i] = Strbuf_Clone(itemList->tempStrbuf, heapID); + itemList->strList[i].entry = itemList->strbuf[i]; + itemList->strList[i].index = i; + } + + itemList->strbuf[maxItems] = MessageLoader_GetNewStrbuf(msgLoader, flower_shop_exit); + itemList->strList[maxItems].entry = itemList->strbuf[maxItems]; + itemList->strList[maxItems].index = maxItems; + + StringTemplate_Free(itemList->strTemplate); + Strbuf_Free(itemList->tempStrbuf); + Strbuf_Free(fmtString); + + listTemplate.window = itemList->window; + listTemplate.count = itemList->maxListItems; + listTemplate.choices = itemList->strList; + + itemList->listMenu = ListMenu_New(&listTemplate, 0, 0, heapID); + + Window_DrawStandardFrame(itemList->window, FALSE, (1 + (18 + 12)), FIELD_WINDOW_PALETTE_INDEX); + + for (i = 0; i < ACCESSORY_SHOP_RES_IDX_COUNT; i++) { + itemList->spriteResCollections[i] = SpriteResourceCollection_New(1, i, heapID); + } + + AccessoryShop_LoadScrollArrowGfx(&scrollArrowResource, itemList, heapID); + + scrollArrowCellParams.list = spriteList; + scrollArrowCellParams.resourceData = &scrollArrowResource; + scrollArrowCellParams.priority = 0; + scrollArrowCellParams.vramType = NNS_G2D_VRAM_TYPE_2DMAIN; + scrollArrowCellParams.heapID = heapID; + scrollArrowCellParams.position.x = 192 * FX32_ONE; + + for (i = 0; i < ACCESSORY_SHOP_SPRITE_COUNT; i++) { + scrollArrowCellParams.position.y = scrollArrowsYPos[i] * FX32_ONE; + itemList->sprites[i] = SpriteList_Add(&scrollArrowCellParams); + + Sprite_SetAnim(itemList->sprites[i], i); + Sprite_SetAnimateFlag(itemList->sprites[i], TRUE); + } +} + +static void AccessoryShop_DeleteItemList(AccessoryShopItemList *itemList) +{ + int i; + + if (itemList->active == FALSE) { + return; + } + + for (i = 0; i < ACCESSORY_SHOP_SPRITE_COUNT; i++) { + Sprite_Delete(itemList->sprites[i]); + } + + AccessoryShop_UnloadScrollArrowGfx(itemList); + + for (i = 0; i < itemList->maxListItems; i++) { + Strbuf_Free(itemList->strbuf[i]); + } + + ListMenu_Free(itemList->listMenu, NULL, NULL); + Window_ClearAndCopyToVRAM(itemList->window); + Window_Remove(itemList->window); + Windows_Delete(itemList->window, 1); + + itemList->active = TRUE; // a mistake? +} + +static u32 AccessoryShop_SelectItemListMenu(AccessoryShopItemList *itemList) +{ + u16 cursorPos; + u32 input = ListMenu_ProcessInput(itemList->listMenu); + + if (input == LIST_NOTHING_CHOSEN) { + ListMenu_CalcTrueCursorPos(itemList->listMenu, &cursorPos); + + if (itemList->cursorPos != cursorPos) { + itemList->cursorPos = cursorPos; + itemList->updateFunc(itemList->unk_130, itemList->cursorPos); + + Sound_PlayEffect(SEQ_SE_CONFIRM); + AccessoryShop_UpdateScrollArrowsVisibility(itemList); + } + } else if (input != LIST_CANCEL) { + if (itemList->cursorPos == (itemList->maxListItems - 1)) { + input = LIST_CANCEL; + } + } + + return input; +} + +static void AccessoryShop_UpdateItemListMenu(AccessoryShopItemList *itemList) +{ + itemList->updateFunc(itemList->unk_130, itemList->cursorPos); + + Window_DrawStandardFrame(itemList->window, FALSE, (1 + (18 + 12)), FIELD_WINDOW_PALETTE_INDEX); + AccessoryShop_UpdateScrollArrowsVisibility(itemList); +} + +static void AccessoryShop_HideScrollArrows(AccessoryShopItemList *itemList) +{ + Sprite_SetDrawFlag(itemList->sprites[ACCESSORY_SHOP_SPRITE_SCROLL_ARROW_TOP], FALSE); + Sprite_SetDrawFlag(itemList->sprites[ACCESSORY_SHOP_SPRITE_SCROLL_ARROW_BOTTOM], FALSE); +} + +static void AccessoryShop_LoadScrollArrowGfx(SpriteResourcesHeader *scrollArrowResource, AccessoryShopItemList *itemList, enum HeapId heapID) +{ + NARC *narc = NARC_ctor(NARC_INDEX_GRAPHIC__SHOP_GRA, heapID); + + itemList->spriteResources[ACCESSORY_SHOP_RES_IDX_TILES] = SpriteResourceCollection_AddTilesFrom(itemList->spriteResCollections[ACCESSORY_SHOP_RES_IDX_TILES], narc, scroll_arrow_NCGR, FALSE, 5000, NNS_G2D_VRAM_TYPE_2DMAIN, heapID); + itemList->spriteResources[ACCESSORY_SHOP_RES_IDX_PALETTE] = SpriteResourceCollection_AddPaletteFrom(itemList->spriteResCollections[ACCESSORY_SHOP_RES_IDX_PALETTE], narc, sprites_NCLR, FALSE, 5000, NNS_G2D_VRAM_TYPE_2DMAIN, 1, heapID); + itemList->spriteResources[ACCESSORY_SHOP_RES_IDX_CELL] = SpriteResourceCollection_AddFrom(itemList->spriteResCollections[ACCESSORY_SHOP_RES_IDX_CELL], narc, scroll_arrow_cell_NCER, FALSE, 5000, 2, heapID); + itemList->spriteResources[ACCESSORY_SHOP_RES_IDX_ANIM] = SpriteResourceCollection_AddFrom(itemList->spriteResCollections[ACCESSORY_SHOP_RES_IDX_ANIM], narc, scroll_arrow_anim_NANR, FALSE, 5000, 3, heapID); + + NARC_dtor(narc); + SpriteTransfer_RequestCharAtEnd(itemList->spriteResources[ACCESSORY_SHOP_RES_IDX_TILES]); + SpriteTransfer_RequestPlttFreeSpace(itemList->spriteResources[ACCESSORY_SHOP_RES_IDX_PALETTE]); + SpriteResourcesHeader_Init(scrollArrowResource, 5000, 5000, 5000, 5000, -1, -1, 0, 0, itemList->spriteResCollections[ACCESSORY_SHOP_RES_IDX_TILES], itemList->spriteResCollections[ACCESSORY_SHOP_RES_IDX_PALETTE], itemList->spriteResCollections[ACCESSORY_SHOP_RES_IDX_CELL], itemList->spriteResCollections[ACCESSORY_SHOP_RES_IDX_ANIM], NULL, NULL); +} + +static void AccessoryShop_UnloadScrollArrowGfx(AccessoryShopItemList *itemList) +{ + SpriteTransfer_ResetCharTransfer(itemList->spriteResources[ACCESSORY_SHOP_RES_IDX_TILES]); + SpriteTransfer_ResetPlttTransfer(itemList->spriteResources[ACCESSORY_SHOP_RES_IDX_PALETTE]); + + for (int i = 0; i < ACCESSORY_SHOP_RES_IDX_COUNT; i++) { + SpriteResourceCollection_Delete(itemList->spriteResCollections[i]); + } +} + +static void AccessoryShop_UpdateScrollArrowsVisibility(AccessoryShopItemList *itemList) +{ + u16 listPos; + + ListMenu_GetListAndCursorPos(itemList->listMenu, &listPos, NULL); + + if (listPos <= 0) { + Sprite_SetDrawFlag(itemList->sprites[ACCESSORY_SHOP_SPRITE_SCROLL_ARROW_TOP], FALSE); + } else { + Sprite_SetDrawFlag(itemList->sprites[ACCESSORY_SHOP_SPRITE_SCROLL_ARROW_TOP], TRUE); + } + + if (listPos >= (itemList->maxListItems - MAX_ITEM_SHOWN)) { + Sprite_SetDrawFlag(itemList->sprites[ACCESSORY_SHOP_SPRITE_SCROLL_ARROW_BOTTOM], FALSE); + } else { + Sprite_SetDrawFlag(itemList->sprites[ACCESSORY_SHOP_SPRITE_SCROLL_ARROW_BOTTOM], TRUE); + } +} + +static void AccessoryShop_SetDataPointers(AccessoryShopDataPtrs *dataPtr, AccessoryShopDescBox *descBox, const AccessoryShopItem *items, Bag *bag, enum HeapId heapID, BgConfig *bgConfig) +{ + dataPtr->bgConfig = bgConfig; + dataPtr->descBox = descBox; + dataPtr->items = items; + dataPtr->bag = bag; + dataPtr->heapID = heapID; +} + +static void AccessoryShop_Update(void *ptr, u32 cursorPos) +{ + AccessoryShopDataPtrs *dataPtr = ptr; + u32 inBagAmount; + + if (cursorPos < ACCESSORY_SHOP_ITEM_LIST_COUNT) { + inBagAmount = Bag_GetItemQuantity(dataPtr->bag, dataPtr->items[cursorPos].itemBerryID + FIRST_BERRY_IDX, dataPtr->heapID); + AccessoryShop_UpdateDescBox(dataPtr->descBox, dataPtr->items[cursorPos].itemBerryID, dataPtr->items[cursorPos].totalAmount, inBagAmount); + } else { + Bg_FillTilemapRect(dataPtr->bgConfig, BG_LAYER_MAIN_3, 0, 0, 10, 16, 8, 17); + Bg_CopyTilemapBufferToVRAM(dataPtr->bgConfig, BG_LAYER_MAIN_3); + } +} + +static void AccessoryShop_ShowYesNoChoice(AccessoryShopYesNoChoice *yesNoChoice, BgConfig *bgConfig, enum HeapId heapID) +{ + static const WindowTemplate winTemplate = { + .bgLayer = BG_LAYER_MAIN_3, + .tilemapLeft = 24, + .tilemapTop = 13, + .width = 7, + .height = 4, + .palette = FIELD_MESSAGE_PALETTE_INDEX, + .baseTile = (((((1 + (18 + 12)) + 9) + (27 * 4)) + (14 * 6)) + (14 * 16)) + }; + + if (yesNoChoice->active == TRUE) { + return; + } + + yesNoChoice->menu = Menu_MakeYesNoChoice(bgConfig, &winTemplate, (1 + (18 + 12)), FIELD_WINDOW_PALETTE_INDEX, heapID); + yesNoChoice->heapID = heapID; + yesNoChoice->active = TRUE; +} + +static void AccessoryShop_DeleteYesNoChoice(AccessoryShopYesNoChoice *yesNoChoice) +{ + if (yesNoChoice->active == FALSE) { + return; + } + + yesNoChoice->active = FALSE; +} + +static u32 AccessoryShop_SelectYesNoChoice(AccessoryShopYesNoChoice *yesNoChoice) +{ + return Menu_ProcessInputAndHandleExit(yesNoChoice->menu, yesNoChoice->heapID); +} + +static BOOL AccessoryShop_HasAllAccessories(const UnkStruct_02029D04 *param0, const AccessoryShopItem *items, u32 maxItems) +{ + for (int i = 0; i < maxItems; i++) { + if (sub_02029D50(param0, items[i].accessoryID, 1) == TRUE) { + return FALSE; + } + } + + return TRUE; +} + +static BOOL AccessoryShop_HasEnoughBerries(Bag *bag, const AccessoryShopItem *items, u32 idx, enum HeapId heapID) +{ + u32 inBagAmount = Bag_GetItemQuantity(bag, items[idx].itemBerryID + FIRST_BERRY_IDX, heapID); + + if (inBagAmount >= items[idx].totalAmount) { + return TRUE; + } + + return FALSE; +} + +static BOOL ov7_0224CCE4(const UnkStruct_02029D04 *param0, const AccessoryShopItem *items, u32 idx) +{ + return sub_02029D50(param0, items[idx].accessoryID, 1); +} + +static void AccessoryShop_DoPurchase(UnkStruct_02029D04 *param0, Bag *bag, const AccessoryShopItem *items, u32 idx, enum HeapId heapID) +{ + u32 accessoryID = items[idx].accessoryID; + u32 itemId = items[idx].itemBerryID + FIRST_BERRY_IDX; + u32 count = items[idx].totalAmount; + BOOL res; + + sub_02029E2C(param0, accessoryID, 1); + res = Bag_TryRemoveItem(bag, itemId, count, heapID); + + GF_ASSERT(res == TRUE); +} diff --git a/src/overlay007/ov7_0224BE9C.c b/src/overlay007/ov7_0224BE9C.c deleted file mode 100644 index b4e345b3d9..0000000000 --- a/src/overlay007/ov7_0224BE9C.c +++ /dev/null @@ -1,863 +0,0 @@ -#include "overlay007/ov7_0224BE9C.h" - -#include -#include - -#include "struct_decls/struct_02029D04_decl.h" - -#include "overlay007/struct_ov7_0224BEFC_decl.h" - -#include "bag.h" -#include "bg_window.h" -#include "field_message.h" -#include "font.h" -#include "game_options.h" -#include "heap.h" -#include "list_menu.h" -#include "menu.h" -#include "message.h" -#include "narc.h" -#include "render_window.h" -#include "save_player.h" -#include "savedata.h" -#include "sprite.h" -#include "sprite_resource.h" -#include "sprite_transfer.h" -#include "sprite_util.h" -#include "strbuf.h" -#include "string_list.h" -#include "string_template.h" -#include "system.h" -#include "text.h" -#include "unk_02005474.h" -#include "unk_020298BC.h" - -typedef struct { - u32 unk_00; - u32 unk_04; - u32 unk_08; -} UnkStruct_ov7_0224F1B4; - -static const UnkStruct_ov7_0224F1B4 Unk_ov7_0224F1B4[22] = { - { 0x32, 0x0, 0x1 }, - { 0x33, 0x1, 0x1 }, - { 0x34, 0x2, 0x1 }, - { 0x35, 0x6, 0x1 }, - { 0x36, 0x3, 0x1 }, - { 0x37, 0x4, 0x1 }, - { 0x38, 0x5, 0x1 }, - { 0x39, 0x7, 0x1 }, - { 0x3A, 0xF, 0xA }, - { 0x3B, 0x10, 0xA }, - { 0x3C, 0x11, 0xA }, - { 0x3D, 0x12, 0xA }, - { 0x3E, 0x13, 0xA }, - { 0x3F, 0x1A, 0x32 }, - { 0x40, 0x1F, 0x64 }, - { 0x41, 0x1B, 0x32 }, - { 0x42, 0x20, 0x64 }, - { 0x43, 0x1C, 0x32 }, - { 0x44, 0x1D, 0x32 }, - { 0x45, 0x21, 0x64 }, - { 0x46, 0x1E, 0x64 }, - { 0x47, 0x22, 0x64 } -}; - -typedef struct { - u32 unk_00; - Window *unk_04; - u32 unk_08; - u32 unk_0C; - Strbuf *unk_10; -} UnkStruct_ov7_0224C3EC; - -typedef struct { - u32 unk_00; - Window *unk_04; - StringTemplate *unk_08; - Strbuf *unk_0C; - Strbuf *unk_10[3]; -} UnkStruct_ov7_0224C620; - -typedef struct { - u32 unk_00; - Window *unk_04; - ListMenu *unk_08; - StringList unk_0C[23]; - Strbuf *unk_C4[23]; - s32 unk_120; - StringTemplate *unk_124; - Strbuf *unk_128; - u16 unk_12C; - u16 unk_12E; - void *unk_130; - void (*unk_134)(void *, u32); - SpriteResourceCollection *unk_138[4]; - SpriteResource *unk_148[4]; - Sprite *unk_158[2]; -} UnkStruct_ov7_0224C768; - -typedef void (*UnkFuncPtr_ov7_0224C768)(void *, u32); - -typedef struct { - u32 unk_00; - Menu *unk_04; - u32 unk_08; -} UnkStruct_ov7_0224CC44; - -typedef struct { - u32 unk_00; - BgConfig *unk_04; - UnkStruct_ov7_0224C620 *unk_08; - const UnkStruct_ov7_0224F1B4 *unk_0C; - Bag *unk_10; -} UnkStruct_ov7_0224CBE4; - -typedef struct UnkStruct_ov7_0224BEFC_t { - u32 unk_00; - u32 unk_04; - SaveData *unk_08; - UnkStruct_02029D04 *unk_0C; - Bag *unk_10; - BgConfig *unk_14; - u32 unk_18; - SpriteList *unk_1C; - G2dRenderer unk_20; - MessageLoader *unk_1AC; - u32 unk_1B0; - u32 unk_1B4; - UnkStruct_ov7_0224C3EC unk_1B8; - UnkStruct_ov7_0224C620 unk_1CC; - UnkStruct_ov7_0224C768 unk_1E8; - UnkStruct_ov7_0224CC44 unk_348; - UnkStruct_ov7_0224CBE4 unk_354; -}; - -static void ov7_0224C35C(UnkStruct_ov7_0224BEFC *param0); -static void ov7_0224C3B8(UnkStruct_ov7_0224BEFC *param0); -static void ov7_0224C3CC(UnkStruct_ov7_0224BEFC *param0); -static void ov7_0224C3E0(UnkStruct_ov7_0224BEFC *param0); -static void ov7_0224C338(UnkStruct_ov7_0224BEFC *param0); -static void ov7_0224C3EC(UnkStruct_ov7_0224C3EC *param0, BgConfig *param1, u32 param2, u32 param3); -static void ov7_0224C444(UnkStruct_ov7_0224C3EC *param0); -static void ov7_0224C468(UnkStruct_ov7_0224C3EC *param0, Strbuf *param1, u32 param2); -static BOOL ov7_0224C4B8(UnkStruct_ov7_0224C3EC *param0); -static void ov7_0224C4E0(UnkStruct_ov7_0224C3EC *param0, MessageLoader *param1, u32 param2, const UnkStruct_ov7_0224F1B4 *param3, u32 param4); -static void ov7_0224C580(UnkStruct_ov7_0224C3EC *param0, MessageLoader *param1, u32 param2, const UnkStruct_ov7_0224F1B4 *param3, u32 param4); -static void ov7_0224C620(UnkStruct_ov7_0224C620 *param0, BgConfig *param1, MessageLoader *param2, u32 param3); -static void ov7_0224C698(UnkStruct_ov7_0224C620 *param0); -static void ov7_0224C6DC(UnkStruct_ov7_0224C620 *param0, u32 param1, u32 param2, u32 param3); -static void ov7_0224C768(UnkStruct_ov7_0224C768 *param0, BgConfig *param1, u32 param2, const UnkStruct_ov7_0224F1B4 *param3, u32 param4, MessageLoader *param5, void *param6, UnkFuncPtr_ov7_0224C768 param7, SpriteList *param8); -static void ov7_0224C934(UnkStruct_ov7_0224C768 *param0); -static u32 ov7_0224C9A4(UnkStruct_ov7_0224C768 *param0); -static void ov7_0224CA0C(UnkStruct_ov7_0224C768 *param0); -static void ov7_0224CA34(UnkStruct_ov7_0224C768 *param0); -static void ov7_0224CA54(SpriteResourcesHeader *param0, UnkStruct_ov7_0224C768 *param1, u32 param2); -static void ov7_0224CB40(UnkStruct_ov7_0224C768 *param0); -static void ov7_0224CB70(UnkStruct_ov7_0224C768 *param0); -static void ov7_0224CC44(UnkStruct_ov7_0224CC44 *param0, BgConfig *param1, u32 param2); -static void ov7_0224CC6C(UnkStruct_ov7_0224CC44 *param0); -static u32 ov7_0224CC78(UnkStruct_ov7_0224CC44 *param0); -static void ov7_0224CBD0(UnkStruct_ov7_0224CBE4 *param0, UnkStruct_ov7_0224C620 *param1, const UnkStruct_ov7_0224F1B4 *param2, Bag *param3, u32 param4, BgConfig *param5); -static void ov7_0224CBE4(void *param0, u32 param1); -static BOOL ov7_0224CC88(const UnkStruct_02029D04 *param0, const UnkStruct_ov7_0224F1B4 *param1, u32 param2); -static BOOL ov7_0224CCB8(Bag *param0, const UnkStruct_ov7_0224F1B4 *param1, u32 param2, u32 param3); -static BOOL ov7_0224CCE4(const UnkStruct_02029D04 *param0, const UnkStruct_ov7_0224F1B4 *param1, u32 param2); -static void ov7_0224CCF4(UnkStruct_02029D04 *param0, Bag *param1, const UnkStruct_ov7_0224F1B4 *param2, u32 param3, u32 param4); - -UnkStruct_ov7_0224BEFC *ov7_0224BE9C(u32 param0, SaveData *param1, BgConfig *param2) -{ - UnkStruct_ov7_0224BEFC *v0 = Heap_AllocFromHeap(param0, sizeof(UnkStruct_ov7_0224BEFC)); - - memset(v0, 0, sizeof(UnkStruct_ov7_0224BEFC)); - - v0->unk_18 = param0; - v0->unk_14 = param2; - v0->unk_08 = param1; - v0->unk_0C = sub_02029D04(sub_0202A750(v0->unk_08)); - v0->unk_10 = SaveData_GetBag(param1); - v0->unk_1AC = MessageLoader_Init(0, 26, 572, v0->unk_18); - - ov7_0224C338(v0); - ov7_0224C35C(v0); - ov7_0224C3CC(v0); - - return v0; -} - -void ov7_0224BEFC(UnkStruct_ov7_0224BEFC *param0) -{ - MessageLoader_Free(param0->unk_1AC); - - ov7_0224C3B8(param0); - ov7_0224C3E0(param0); - - memset(param0, 0, sizeof(UnkStruct_ov7_0224BEFC)); - Heap_FreeToHeap(param0); -} - -BOOL ov7_0224BF2C(UnkStruct_ov7_0224BEFC *param0) -{ - Strbuf *v0; - BOOL v1; - - switch (param0->unk_00) { - case 0: - ov7_0224C3EC(¶m0->unk_1B8, param0->unk_14, param0->unk_18, param0->unk_1B4); - v0 = MessageLoader_GetNewStrbuf(param0->unk_1AC, 4); - ov7_0224C468(¶m0->unk_1B8, v0, param0->unk_18); - Strbuf_Free(v0); - param0->unk_00 = 11; - param0->unk_04 = 1; - break; - case 1: - if (ov7_0224CC88(param0->unk_0C, Unk_ov7_0224F1B4, 22)) { - v0 = MessageLoader_GetNewStrbuf(param0->unk_1AC, 5); - ov7_0224C468(¶m0->unk_1B8, v0, param0->unk_18); - Strbuf_Free(v0); - param0->unk_00 = 11; - param0->unk_04 = 12; - } else { - param0->unk_00 = 2; - } - break; - case 2: - ov7_0224C620(¶m0->unk_1CC, param0->unk_14, param0->unk_1AC, param0->unk_18); - ov7_0224CBD0(¶m0->unk_354, ¶m0->unk_1CC, Unk_ov7_0224F1B4, param0->unk_10, param0->unk_18, param0->unk_14); - ov7_0224C768(¶m0->unk_1E8, param0->unk_14, param0->unk_18, Unk_ov7_0224F1B4, 22, param0->unk_1AC, ¶m0->unk_354, ov7_0224CBE4, param0->unk_1C); - case 3: - ov7_0224CA0C(¶m0->unk_1E8); - v0 = MessageLoader_GetNewStrbuf(param0->unk_1AC, 6); - ov7_0224C468(¶m0->unk_1B8, v0, param0->unk_18); - Strbuf_Free(v0); - param0->unk_00 = 10; - param0->unk_04 = 4; - break; - case 4: - v1 = ov7_0224C9A4(¶m0->unk_1E8); - - if ((v1 != 0xffffffff) && (v1 != 0xfffffffe)) { - Bg_FillTilemapRect(param0->unk_14, 3, 0, 0, 0, 32, 18, 17); - - ov7_0224CA34(¶m0->unk_1E8); - ov7_0224C4E0(¶m0->unk_1B8, param0->unk_1AC, param0->unk_18, Unk_ov7_0224F1B4, param0->unk_1E8.unk_12C); - - param0->unk_00 = 10; - param0->unk_04 = 5; - - Sound_PlayEffect(1500); - } else if (v1 == 0xfffffffe) { - v0 = MessageLoader_GetNewStrbuf(param0->unk_1AC, 11); - ov7_0224C468(¶m0->unk_1B8, v0, param0->unk_18); - Strbuf_Free(v0); - param0->unk_00 = 11; - param0->unk_04 = 12; - Sound_PlayEffect(1500); - } - break; - case 5: - ov7_0224CC44(¶m0->unk_348, param0->unk_14, param0->unk_18); - param0->unk_00 = 6; - break; - case 6: - v1 = ov7_0224CC78(¶m0->unk_348); - - if (v1 == 0) { - if (ov7_0224CCB8(param0->unk_10, Unk_ov7_0224F1B4, param0->unk_1E8.unk_12C, param0->unk_18) == 0) { - v0 = MessageLoader_GetNewStrbuf(param0->unk_1AC, 9); - ov7_0224C468(¶m0->unk_1B8, v0, param0->unk_18); - Strbuf_Free(v0); - param0->unk_00 = 11; - param0->unk_04 = 3; - ov7_0224CC6C(¶m0->unk_348); - break; - } - - if (ov7_0224CCE4(param0->unk_0C, Unk_ov7_0224F1B4, param0->unk_1E8.unk_12C) == 0) { - v0 = MessageLoader_GetNewStrbuf(param0->unk_1AC, 10); - ov7_0224C468(¶m0->unk_1B8, v0, param0->unk_18); - Strbuf_Free(v0); - ov7_0224CC6C(¶m0->unk_348); - param0->unk_00 = 11; - param0->unk_04 = 3; - break; - } - - v0 = MessageLoader_GetNewStrbuf(param0->unk_1AC, 8); - - ov7_0224C468(¶m0->unk_1B8, v0, param0->unk_18); - Strbuf_Free(v0); - ov7_0224CC6C(¶m0->unk_348); - - param0->unk_00 = 11; - param0->unk_04 = 7; - } else if (v1 == 0xfffffffe) { - ov7_0224CC6C(¶m0->unk_348); - param0->unk_00 = 3; - } - break; - case 7: - ov7_0224CCF4(param0->unk_0C, param0->unk_10, Unk_ov7_0224F1B4, param0->unk_1E8.unk_12C, param0->unk_18); - ov7_0224C580(¶m0->unk_1B8, param0->unk_1AC, param0->unk_18, Unk_ov7_0224F1B4, param0->unk_1E8.unk_12C); - - if (ov7_0224CC88(param0->unk_0C, Unk_ov7_0224F1B4, 22)) { - param0->unk_00 = 11; - param0->unk_04 = 8; - } else { - param0->unk_00 = 11; - param0->unk_04 = 3; - } - break; - case 8: - v0 = MessageLoader_GetNewStrbuf(param0->unk_1AC, 13); - ov7_0224C468(¶m0->unk_1B8, v0, param0->unk_18); - Strbuf_Free(v0); - param0->unk_00 = 11; - param0->unk_04 = 9; - break; - case 9: - v0 = MessageLoader_GetNewStrbuf(param0->unk_1AC, 5); - ov7_0224C468(¶m0->unk_1B8, v0, param0->unk_18); - Strbuf_Free(v0); - param0->unk_00 = 11; - param0->unk_04 = 12; - break; - case 10: - if (ov7_0224C4B8(¶m0->unk_1B8)) { - param0->unk_00 = param0->unk_04; - } - break; - case 11: - if (ov7_0224C4B8(¶m0->unk_1B8)) { - if (gSystem.pressedKeys & (PAD_BUTTON_A | PAD_BUTTON_B)) { - param0->unk_00 = param0->unk_04; - } - } - break; - case 12: - ov7_0224C444(¶m0->unk_1B8); - ov7_0224C698(¶m0->unk_1CC); - ov7_0224C934(¶m0->unk_1E8); - ov7_0224CC6C(¶m0->unk_348); - return 1; - default: - break; - } - - SpriteList_Update(param0->unk_1C); - - return 0; -} - -static void ov7_0224C338(UnkStruct_ov7_0224BEFC *param0) -{ - Options *v0 = SaveData_Options(param0->unk_08); - - param0->unk_1B0 = Options_Frame(v0); - param0->unk_1B4 = Options_TextFrameDelay(v0); -} - -static void ov7_0224C35C(UnkStruct_ov7_0224BEFC *param0) -{ - LoadMessageBoxGraphics(param0->unk_14, 3, 1, 10, param0->unk_1B0, param0->unk_18); - Font_LoadScreenIndicatorsPalette(0, 12 * 32, param0->unk_18); - LoadStandardWindowGraphics(param0->unk_14, 3, (1 + (18 + 12)), 11, 0, param0->unk_18); - Font_LoadTextPalette(0, 13 * 32, param0->unk_18); - Bg_ClearTilemap(param0->unk_14, 3); -} - -static void ov7_0224C3B8(UnkStruct_ov7_0224BEFC *param0) -{ - Bg_ClearTilemap(param0->unk_14, 3); - FieldMessage_LoadTextPalettes(0, TRUE); -} - -static void ov7_0224C3CC(UnkStruct_ov7_0224BEFC *param0) -{ - param0->unk_1C = SpriteList_InitRendering(2, ¶m0->unk_20, param0->unk_18); -} - -static void ov7_0224C3E0(UnkStruct_ov7_0224BEFC *param0) -{ - SpriteList_Delete(param0->unk_1C); -} - -static void ov7_0224C3EC(UnkStruct_ov7_0224C3EC *param0, BgConfig *param1, u32 param2, u32 param3) -{ - if (param0->unk_00 == 1) { - return; - } - - param0->unk_08 = param3; - param0->unk_04 = Window_New(param2, 1); - - Window_Add(param1, param0->unk_04, 3, 2, 19, 27, 4, 12, ((1 + (18 + 12)) + 9)); - Window_FillTilemap(param0->unk_04, 15); - Window_DrawMessageBoxWithScrollCursor(param0->unk_04, 0, 1, 10); - - param0->unk_00 = 1; -} - -static void ov7_0224C444(UnkStruct_ov7_0224C3EC *param0) -{ - if (param0->unk_00 == 0) { - return; - } - - Window_ClearAndCopyToVRAM(param0->unk_04); - Window_Remove(param0->unk_04); - Windows_Delete(param0->unk_04, 1); - - param0->unk_00 = 0; -} - -static void ov7_0224C468(UnkStruct_ov7_0224C3EC *param0, Strbuf *param1, u32 param2) -{ - GF_ASSERT(param0->unk_10 == NULL); - - Window_FillTilemap(param0->unk_04, 15); - - param0->unk_10 = Strbuf_Clone(param1, param2); - param0->unk_0C = Text_AddPrinterWithParamsAndColor(param0->unk_04, FONT_MESSAGE, param0->unk_10, 0, 0, param0->unk_08, TEXT_COLOR(1, 2, 15), NULL); - - Window_CopyToVRAM(param0->unk_04); -} - -static BOOL ov7_0224C4B8(UnkStruct_ov7_0224C3EC *param0) -{ - if (Text_IsPrinterActive(param0->unk_0C) == 0) { - if (param0->unk_10 != NULL) { - Strbuf_Free(param0->unk_10); - param0->unk_10 = NULL; - } - - return 1; - } - - return 0; -} - -static void ov7_0224C4E0(UnkStruct_ov7_0224C3EC *param0, MessageLoader *param1, u32 param2, const UnkStruct_ov7_0224F1B4 *param3, u32 param4) -{ - Strbuf *v0; - Strbuf *v1; - StringTemplate *v2; - - v2 = StringTemplate_Default(param2); - v1 = Strbuf_Init(200, param2); - v0 = MessageLoader_GetNewStrbuf(param1, 7); - - if (param3[param4].unk_08 == 1) { - StringTemplate_SetItemName(v2, 0, param3[param4].unk_04 + 149); - } else { - StringTemplate_SetItemNamePlural(v2, 0, param3[param4].unk_04 + 149); - } - - StringTemplate_SetNumber(v2, 1, param3[param4].unk_08, 3, 0, 1); - StringTemplate_SetContestAccessoryName(v2, 2, param3[param4].unk_00); - StringTemplate_Format(v2, v1, v0); - - ov7_0224C468(param0, v1, param2); - - StringTemplate_Free(v2); - Strbuf_Free(v1); - Strbuf_Free(v0); -} - -static void ov7_0224C580(UnkStruct_ov7_0224C3EC *param0, MessageLoader *param1, u32 param2, const UnkStruct_ov7_0224F1B4 *param3, u32 param4) -{ - Strbuf *v0; - Strbuf *v1; - StringTemplate *v2; - - v2 = StringTemplate_Default(param2); - v1 = Strbuf_Init(200, param2); - v0 = MessageLoader_GetNewStrbuf(param1, 12); - - if (param3[param4].unk_08 == 1) { - StringTemplate_SetItemName(v2, 0, param3[param4].unk_04 + 149); - } else { - StringTemplate_SetItemNamePlural(v2, 0, param3[param4].unk_04 + 149); - } - - StringTemplate_SetNumber(v2, 1, param3[param4].unk_08, 3, 0, 1); - StringTemplate_SetContestAccessoryName(v2, 2, param3[param4].unk_00); - StringTemplate_Format(v2, v1, v0); - - ov7_0224C468(param0, v1, param2); - - StringTemplate_Free(v2); - Strbuf_Free(v1); - Strbuf_Free(v0); -} - -static void ov7_0224C620(UnkStruct_ov7_0224C620 *param0, BgConfig *param1, MessageLoader *param2, u32 param3) -{ - int v0; - - if (param0->unk_00 == 1) { - return; - } - - param0->unk_04 = Window_New(param3, 1); - Window_Add(param1, param0->unk_04, 3, 1, 11, 14, 6, 13, (((1 + (18 + 12)) + 9) + (27 * 4))); - param0->unk_08 = StringTemplate_Default(param3); - - for (v0 = 0; v0 < 3; v0++) { - param0->unk_10[v0] = MessageLoader_GetNewStrbuf(param2, 16 + v0); - } - - param0->unk_0C = Strbuf_Init(32, param3); - Window_FillTilemap(param0->unk_04, 15); - param0->unk_00 = 1; -} - -static void ov7_0224C698(UnkStruct_ov7_0224C620 *param0) -{ - int v0; - - if (param0->unk_00 == 0) { - return; - } - - for (v0 = 0; v0 < 3; v0++) { - Strbuf_Free(param0->unk_10[v0]); - } - - Strbuf_Free(param0->unk_0C); - StringTemplate_Free(param0->unk_08); - Window_ClearAndCopyToVRAM(param0->unk_04); - Window_Remove(param0->unk_04); - Windows_Delete(param0->unk_04, 1); - - param0->unk_00 = 0; -} - -static void ov7_0224C6DC(UnkStruct_ov7_0224C620 *param0, u32 param1, u32 param2, u32 param3) -{ - int v0; - - StringTemplate_SetItemName(param0->unk_08, 0, param1 + 149); - StringTemplate_SetNumber(param0->unk_08, 1, param2, 3, 1, 1); - StringTemplate_SetNumber(param0->unk_08, 2, param3, 3, 1, 1); - Window_FillTilemap(param0->unk_04, 15); - - for (v0 = 0; v0 < 3; v0++) { - StringTemplate_Format(param0->unk_08, param0->unk_0C, param0->unk_10[v0]); - Text_AddPrinterWithParamsAndColor(param0->unk_04, FONT_SYSTEM, param0->unk_0C, 0, 16 * v0, TEXT_SPEED_NO_TRANSFER, TEXT_COLOR(1, 2, 15), NULL); - } - - Window_DrawStandardFrame(param0->unk_04, 0, (1 + (18 + 12)), 11); -} - -static void ov7_0224C768(UnkStruct_ov7_0224C768 *param0, BgConfig *param1, u32 param2, const UnkStruct_ov7_0224F1B4 *param3, u32 param4, MessageLoader *param5, void *param6, UnkFuncPtr_ov7_0224C768 param7, SpriteList *param8) -{ - int v0; - Strbuf *v1; - SpriteResourcesHeader v2; - SpriteListTemplate v3; - static const u8 v4[2] = { - 8, 136 - }; - static ListMenuTemplate v5 = { - NULL, - NULL, - NULL, - NULL, - 0, - 7, - 0, - 16, - 0, - 8, - 1, - 15, - 2, - 0, - 0, - 0, - 0, - 0, - NULL - }; - - if (param0->unk_00 == 1) { - return; - } - - param0->unk_00 = 1; - param0->unk_120 = param4 + 1; - param0->unk_130 = param6; - param0->unk_134 = param7; - param0->unk_04 = Window_New(param2, 1); - - Window_Add(param1, param0->unk_04, 3, 17, 1, 14, 16, 13, ((((1 + (18 + 12)) + 9) + (27 * 4)) + (14 * 6))); - - param0->unk_124 = StringTemplate_Default(param2); - param0->unk_128 = Strbuf_Init(32, param2); - - v1 = MessageLoader_GetNewStrbuf(param5, 16); - - for (v0 = 0; v0 < param4; v0++) { - StringTemplate_SetContestAccessoryName(param0->unk_124, 0, param3[v0].unk_00); - StringTemplate_Format(param0->unk_124, param0->unk_128, v1); - - param0->unk_C4[v0] = Strbuf_Clone(param0->unk_128, param2); - param0->unk_0C[v0].entry = param0->unk_C4[v0]; - param0->unk_0C[v0].index = v0; - } - - param0->unk_C4[param4] = MessageLoader_GetNewStrbuf(param5, 19); - param0->unk_0C[param4].entry = param0->unk_C4[param4]; - param0->unk_0C[param4].index = param4; - - StringTemplate_Free(param0->unk_124); - Strbuf_Free(param0->unk_128); - Strbuf_Free(v1); - - v5.window = param0->unk_04; - v5.count = param0->unk_120; - v5.choices = param0->unk_0C; - - param0->unk_08 = ListMenu_New(&v5, 0, 0, param2); - - Window_DrawStandardFrame(param0->unk_04, 0, (1 + (18 + 12)), 11); - - for (v0 = 0; v0 < 4; v0++) { - param0->unk_138[v0] = SpriteResourceCollection_New(1, v0, param2); - } - - ov7_0224CA54(&v2, param0, param2); - - v3.list = param8; - v3.resourceData = &v2; - v3.priority = 0; - v3.vramType = NNS_G2D_VRAM_TYPE_2DMAIN; - v3.heapID = param2; - v3.position.x = 192 * FX32_ONE; - - for (v0 = 0; v0 < 2; v0++) { - v3.position.y = v4[v0] * FX32_ONE; - param0->unk_158[v0] = SpriteList_Add(&v3); - - Sprite_SetAnim(param0->unk_158[v0], v0); - Sprite_SetAnimateFlag(param0->unk_158[v0], 1); - } -} - -static void ov7_0224C934(UnkStruct_ov7_0224C768 *param0) -{ - int v0; - - if (param0->unk_00 == 0) { - return; - } - - for (v0 = 0; v0 < 2; v0++) { - Sprite_Delete(param0->unk_158[v0]); - } - - ov7_0224CB40(param0); - - for (v0 = 0; v0 < param0->unk_120; v0++) { - Strbuf_Free(param0->unk_C4[v0]); - } - - ListMenu_Free(param0->unk_08, NULL, NULL); - Window_ClearAndCopyToVRAM(param0->unk_04); - Window_Remove(param0->unk_04); - Windows_Delete(param0->unk_04, 1); - - param0->unk_00 = 1; -} - -static u32 ov7_0224C9A4(UnkStruct_ov7_0224C768 *param0) -{ - u32 v0; - u16 v1; - - v0 = ListMenu_ProcessInput(param0->unk_08); - - if (v0 == 0xffffffff) { - ListMenu_CalcTrueCursorPos(param0->unk_08, &v1); - - if (param0->unk_12C != v1) { - param0->unk_12C = v1; - param0->unk_134(param0->unk_130, param0->unk_12C); - - Sound_PlayEffect(1500); - ov7_0224CB70(param0); - } - } else if (v0 != 0xfffffffe) { - if (param0->unk_12C == (param0->unk_120 - 1)) { - v0 = 0xfffffffe; - } - } - - return v0; -} - -static void ov7_0224CA0C(UnkStruct_ov7_0224C768 *param0) -{ - param0->unk_134(param0->unk_130, param0->unk_12C); - - Window_DrawStandardFrame(param0->unk_04, 0, (1 + (18 + 12)), 11); - ov7_0224CB70(param0); -} - -static void ov7_0224CA34(UnkStruct_ov7_0224C768 *param0) -{ - Sprite_SetDrawFlag(param0->unk_158[0], 0); - Sprite_SetDrawFlag(param0->unk_158[1], 0); -} - -static void ov7_0224CA54(SpriteResourcesHeader *param0, UnkStruct_ov7_0224C768 *param1, u32 param2) -{ - NARC *v0 = NARC_ctor(NARC_INDEX_GRAPHIC__SHOP_GRA, param2); - - param1->unk_148[0] = SpriteResourceCollection_AddTilesFrom(param1->unk_138[0], v0, 4, 0, 5000, NNS_G2D_VRAM_TYPE_2DMAIN, param2); - param1->unk_148[1] = SpriteResourceCollection_AddPaletteFrom(param1->unk_138[1], v0, 10, 0, 5000, NNS_G2D_VRAM_TYPE_2DMAIN, 1, param2); - param1->unk_148[2] = SpriteResourceCollection_AddFrom(param1->unk_138[2], v0, 5, 0, 5000, 2, param2); - param1->unk_148[3] = SpriteResourceCollection_AddFrom(param1->unk_138[3], v0, 6, 0, 5000, 3, param2); - - NARC_dtor(v0); - SpriteTransfer_RequestCharAtEnd(param1->unk_148[0]); - SpriteTransfer_RequestPlttFreeSpace(param1->unk_148[1]); - SpriteResourcesHeader_Init(param0, 5000, 5000, 5000, 5000, 0xffffffff, 0xffffffff, 0, 0, param1->unk_138[0], param1->unk_138[1], param1->unk_138[2], param1->unk_138[3], NULL, NULL); -} - -static void ov7_0224CB40(UnkStruct_ov7_0224C768 *param0) -{ - int v0; - - SpriteTransfer_ResetCharTransfer(param0->unk_148[0]); - SpriteTransfer_ResetPlttTransfer(param0->unk_148[1]); - - for (v0 = 0; v0 < 4; v0++) { - SpriteResourceCollection_Delete(param0->unk_138[v0]); - } -} - -static void ov7_0224CB70(UnkStruct_ov7_0224C768 *param0) -{ - u16 v0; - - ListMenu_GetListAndCursorPos(param0->unk_08, &v0, NULL); - - if (v0 <= 0) { - Sprite_SetDrawFlag(param0->unk_158[0], 0); - } else { - Sprite_SetDrawFlag(param0->unk_158[0], 1); - } - - if (v0 >= (param0->unk_120 - 7)) { - Sprite_SetDrawFlag(param0->unk_158[1], 0); - } else { - Sprite_SetDrawFlag(param0->unk_158[1], 1); - } -} - -static void ov7_0224CBD0(UnkStruct_ov7_0224CBE4 *param0, UnkStruct_ov7_0224C620 *param1, const UnkStruct_ov7_0224F1B4 *param2, Bag *param3, u32 param4, BgConfig *param5) -{ - param0->unk_04 = param5; - param0->unk_08 = param1; - param0->unk_0C = param2; - param0->unk_10 = param3; - param0->unk_00 = param4; -} - -static void ov7_0224CBE4(void *param0, u32 param1) -{ - UnkStruct_ov7_0224CBE4 *v0 = param0; - u32 v1; - - if (param1 < 22) { - v1 = Bag_GetItemQuantity(v0->unk_10, v0->unk_0C[param1].unk_04 + 149, v0->unk_00); - ov7_0224C6DC(v0->unk_08, v0->unk_0C[param1].unk_04, v0->unk_0C[param1].unk_08, v1); - } else { - Bg_FillTilemapRect(v0->unk_04, 3, 0, 1 - 1, 11 - 1, 14 + 2, 6 + 2, 17); - Bg_CopyTilemapBufferToVRAM(v0->unk_04, 3); - } -} - -static void ov7_0224CC44(UnkStruct_ov7_0224CC44 *param0, BgConfig *param1, u32 param2) -{ - static const WindowTemplate v0 = { - 3, - 24, - 13, - 7, - 4, - 13, - (((((1 + (18 + 12)) + 9) + (27 * 4)) + (14 * 6)) + (14 * 16)) - }; - - if (param0->unk_00 == 1) { - return; - } - - param0->unk_04 = Menu_MakeYesNoChoice(param1, &v0, (1 + (18 + 12)), 11, param2); - param0->unk_08 = param2; - param0->unk_00 = 1; -} - -static void ov7_0224CC6C(UnkStruct_ov7_0224CC44 *param0) -{ - if (param0->unk_00 == 0) { - return; - } - - param0->unk_00 = 0; -} - -static u32 ov7_0224CC78(UnkStruct_ov7_0224CC44 *param0) -{ - u32 v0; - - v0 = Menu_ProcessInputAndHandleExit(param0->unk_04, param0->unk_08); - return v0; -} - -static BOOL ov7_0224CC88(const UnkStruct_02029D04 *param0, const UnkStruct_ov7_0224F1B4 *param1, u32 param2) -{ - int v0; - - for (v0 = 0; v0 < param2; v0++) { - if (sub_02029D50(param0, param1[v0].unk_00, 1) == 1) { - return 0; - } - } - - return 1; -} - -static BOOL ov7_0224CCB8(Bag *param0, const UnkStruct_ov7_0224F1B4 *param1, u32 param2, u32 param3) -{ - u32 v0; - - v0 = Bag_GetItemQuantity(param0, param1[param2].unk_04 + 149, param3); - - if (v0 >= param1[param2].unk_08) { - return 1; - } - - return 0; -} - -static BOOL ov7_0224CCE4(const UnkStruct_02029D04 *param0, const UnkStruct_ov7_0224F1B4 *param1, u32 param2) -{ - return sub_02029D50(param0, param1[param2].unk_00, 1); -} - -static void ov7_0224CCF4(UnkStruct_02029D04 *param0, Bag *param1, const UnkStruct_ov7_0224F1B4 *param2, u32 param3, u32 param4) -{ - u32 v0 = param2[param3].unk_00; - u32 v1 = param2[param3].unk_04 + 149; - u32 v2 = param2[param3].unk_08; - BOOL v3; - - sub_02029E2C(param0, v0, 1); - v3 = Bag_TryRemoveItem(param1, v1, v2, param4); - - GF_ASSERT(v3 == 1); -} diff --git a/src/scrcmd.c b/src/scrcmd.c index 9bcdac2455..22b3265f74 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -1363,7 +1363,7 @@ const ScrCmdFunc Unk_020EAC58[] = { ScrCmd_254, ScrCmd_255, ScrCmd_CalcCatchingShowPoints, - ScrCmd_257, + ScrCmd_ShowAccessoryShop, ScrCmd_258, ScrCmd_259, ScrCmd_25A, diff --git a/src/scrcmd_shop.c b/src/scrcmd_shop.c index 28aaeb1a40..8ec06eb47f 100644 --- a/src/scrcmd_shop.c +++ b/src/scrcmd_shop.c @@ -120,9 +120,8 @@ BOOL ScrCmd_PokeMartSeal(ScriptContext *ctx) return TRUE; } -// does NOT use shop_menu, but it is a shop of sort -BOOL ScrCmd_257(ScriptContext *param0) +BOOL ScrCmd_ShowAccessoryShop(ScriptContext *ctx) { - sub_0203E518(param0->fieldSystem->task); + AccessoryShop_Init(ctx->fieldSystem->task); return TRUE; } diff --git a/src/unk_0203D1B8.c b/src/unk_0203D1B8.c index f0112794a8..60816efdda 100644 --- a/src/unk_0203D1B8.c +++ b/src/unk_0203D1B8.c @@ -49,8 +49,7 @@ #include "library_tv/library_tv.h" #include "overlay005/ov5_021E622C.h" #include "overlay006/struct_ov6_02246254.h" -#include "overlay007/ov7_0224BE9C.h" -#include "overlay007/struct_ov7_0224BEFC_decl.h" +#include "overlay007/accessory_shop.h" #include "overlay019/ov19_021D0D80.h" #include "overlay020/ov20_021D0D80.h" #include "overlay021/pokedex_main.h" @@ -1639,24 +1638,24 @@ static u8 sub_0203E484(SaveData *param0, u8 param1) return v3[param1]; } -static BOOL sub_0203E4F8(FieldTask *param0) +static BOOL FieldTask_AccessoryShop(FieldTask *task) { - UnkStruct_ov7_0224BEFC *v0 = FieldTask_GetEnv(param0); + AccessoryShop *shop = FieldTask_GetEnv(task); - if (ov7_0224BF2C(v0) == 1) { - ov7_0224BEFC(v0); - return 1; + if (AccessoryShop_Main(shop) == TRUE) { + AccessoryShop_Free(shop); + return TRUE; } - return 0; + return FALSE; } -void sub_0203E518(FieldTask *param0) +void AccessoryShop_Init(FieldTask *task) { - FieldSystem *fieldSystem = FieldTask_GetFieldSystem(param0); - UnkStruct_ov7_0224BEFC *v1 = ov7_0224BE9C(4, fieldSystem->saveData, fieldSystem->bgConfig); + FieldSystem *fieldSystem = FieldTask_GetFieldSystem(task); + AccessoryShop *shop = AccessoryShop_New(HEAP_ID_FIELD, fieldSystem->saveData, fieldSystem->bgConfig); - FieldTask_InitCall(param0, sub_0203E4F8, v1); + FieldTask_InitCall(task, FieldTask_AccessoryShop, shop); } void *sub_0203E53C(FieldSystem *fieldSystem, int param1, int param2)