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)