Merge pull request #407 from mudskipper13/doc/accessory-shop
Some checks are pending
build / build (push) Waiting to run

Document Accessory Shop (ov7_0224BE9C)
This commit is contained in:
RavePossum
2025-03-02 09:21:30 -05:00
committed by GitHub
16 changed files with 938 additions and 920 deletions

View File

@@ -3275,7 +3275,7 @@
.short \destVarID
.endm
.macro ScrCmd_257
.macro ShowAccessoryShop
.short 599
.endm

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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);

View File

@@ -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
}

View File

@@ -63,7 +63,7 @@ _00A9:
PlayFanfare SEQ_SE_CONFIRM
LockAll
FacePlayer
ScrCmd_257
ShowAccessoryShop
ReleaseAll
End

View File

@@ -17,67 +17,67 @@
<attribute name="window_context_name">used</attribute>
<language name="English">Use that Sprayduck to water the soil\nwhere you’ve planted Berries.\rYou should also water Berry plants\nwhile they are growing.</language>
</row>
<row id="pl_msg_00000572_00004" index="4">
<row id="flower_shop_greet" index="4">
<attribute name="window_context_name">used</attribute>
<language name="English">Hello!\rWould you like to exchange your\nBerries for some Accessories?</language>
</row>
<row id="pl_msg_00000572_00005" index="5">
<row id="flower_shop_thanks" index="5">
<attribute name="window_context_name">used</attribute>
<language name="English">Thank you so much for trading us so\nmany Berries!</language>
</row>
<row id="pl_msg_00000572_00006" index="6">
<row id="flower_shop_purchase" index="6">
<attribute name="window_context_name">used</attribute>
<language name="English">Which Accessory would you like?</language>
</row>
<row id="pl_msg_00000572_00007" index="7">
<row id="flower_shop_confirm_purchase" index="7">
<attribute name="window_context_name">used</attribute>
<language name="English">Exchange {STRVAR_1 52, 1, 0} {STRVAR_1 8, 0, 0}\nfor the {STRVAR_1 31, 2, 0}?</language>
</row>
<row id="pl_msg_00000572_00008" index="8">
<row id="flower_shop_purchase_success" index="8">
<attribute name="window_context_name">used</attribute>
<language name="English">Thank you!</language>
</row>
<row id="pl_msg_00000572_00009" index="9">
<row id="flower_shop_not_enough_berries" index="9">
<attribute name="window_context_name">used</attribute>
<language name="English">You don’t have enough Berries.</language>
</row>
<row id="pl_msg_00000572_00010" index="10">
<row id="flower_shop_cant_carry_more_accessories" index="10">
<attribute name="window_context_name">used</attribute>
<language name="English">Oh, you can’t carry any more\nthan that.</language>
</row>
<row id="pl_msg_00000572_00011" index="11">
<row id="flower_shop_please_come_again" index="11">
<attribute name="window_context_name">used</attribute>
<language name="English">Please come again!</language>
</row>
<row id="pl_msg_00000572_00012" index="12">
<row id="flower_shop_purchase_post_success" index="12">
<attribute name="window_context_name">used</attribute>
<language name="English">You got the {STRVAR_1 31, 2, 0} in return\nfor {STRVAR_1 52, 1, 0} {STRVAR_1 8, 0, 0}.</language>
</row>
<row id="pl_msg_00000572_00013" index="13">
<row id="flower_shop_traded_all_accessories" index="13">
<attribute name="window_context_name">used</attribute>
<language name="English">Wow! I traded away every single\nAccessory I had!</language>
</row>
<row id="pl_msg_00000572_00014" index="14">
<row id="flower_shop_yes" index="14">
<attribute name="window_context_name">used</attribute>
<language name="English">YES</language>
</row>
<row id="pl_msg_00000572_00015" index="15">
<row id="flower_shop_no" index="15">
<attribute name="window_context_name">used</attribute>
<language name="English">NO</language>
</row>
<row id="pl_msg_00000572_00016" index="16">
<row id="flower_shop_berry_name_format" index="16">
<attribute name="window_context_name">used</attribute>
<language name="English">{STRVAR_1 8, 0, 0}</language>
</row>
<row id="pl_msg_00000572_00017" index="17">
<row id="flower_shop_needed_berries" index="17">
<attribute name="window_context_name">used</attribute>
<language name="English">Needed: {STRVAR_1 52, 1, 0} </language>
</row>
<row id="pl_msg_00000572_00018" index="18">
<row id="flower_shop_berries_in_bag" index="18">
<attribute name="window_context_name">used</attribute>
<language name="English">In Bag: {STRVAR_1 52, 2, 0}</language>
</row>
<row id="pl_msg_00000572_00019" index="19">
<row id="flower_shop_exit" index="19">
<attribute name="window_context_name">used</attribute>
<language name="English">EXIT</language>
</row>

View File

@@ -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',

View File

@@ -0,0 +1,764 @@
#include "overlay007/accessory_shop.h"
#include <nitro.h>
#include <string.h>
#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);
}

View File

@@ -1,863 +0,0 @@
#include "overlay007/ov7_0224BE9C.h"
#include <nitro.h>
#include <string.h>
#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(&param0->unk_1B8, param0->unk_14, param0->unk_18, param0->unk_1B4);
v0 = MessageLoader_GetNewStrbuf(param0->unk_1AC, 4);
ov7_0224C468(&param0->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(&param0->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(&param0->unk_1CC, param0->unk_14, param0->unk_1AC, param0->unk_18);
ov7_0224CBD0(&param0->unk_354, &param0->unk_1CC, Unk_ov7_0224F1B4, param0->unk_10, param0->unk_18, param0->unk_14);
ov7_0224C768(&param0->unk_1E8, param0->unk_14, param0->unk_18, Unk_ov7_0224F1B4, 22, param0->unk_1AC, &param0->unk_354, ov7_0224CBE4, param0->unk_1C);
case 3:
ov7_0224CA0C(&param0->unk_1E8);
v0 = MessageLoader_GetNewStrbuf(param0->unk_1AC, 6);
ov7_0224C468(&param0->unk_1B8, v0, param0->unk_18);
Strbuf_Free(v0);
param0->unk_00 = 10;
param0->unk_04 = 4;
break;
case 4:
v1 = ov7_0224C9A4(&param0->unk_1E8);
if ((v1 != 0xffffffff) && (v1 != 0xfffffffe)) {
Bg_FillTilemapRect(param0->unk_14, 3, 0, 0, 0, 32, 18, 17);
ov7_0224CA34(&param0->unk_1E8);
ov7_0224C4E0(&param0->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(&param0->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(&param0->unk_348, param0->unk_14, param0->unk_18);
param0->unk_00 = 6;
break;
case 6:
v1 = ov7_0224CC78(&param0->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(&param0->unk_1B8, v0, param0->unk_18);
Strbuf_Free(v0);
param0->unk_00 = 11;
param0->unk_04 = 3;
ov7_0224CC6C(&param0->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(&param0->unk_1B8, v0, param0->unk_18);
Strbuf_Free(v0);
ov7_0224CC6C(&param0->unk_348);
param0->unk_00 = 11;
param0->unk_04 = 3;
break;
}
v0 = MessageLoader_GetNewStrbuf(param0->unk_1AC, 8);
ov7_0224C468(&param0->unk_1B8, v0, param0->unk_18);
Strbuf_Free(v0);
ov7_0224CC6C(&param0->unk_348);
param0->unk_00 = 11;
param0->unk_04 = 7;
} else if (v1 == 0xfffffffe) {
ov7_0224CC6C(&param0->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(&param0->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(&param0->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(&param0->unk_1B8, v0, param0->unk_18);
Strbuf_Free(v0);
param0->unk_00 = 11;
param0->unk_04 = 12;
break;
case 10:
if (ov7_0224C4B8(&param0->unk_1B8)) {
param0->unk_00 = param0->unk_04;
}
break;
case 11:
if (ov7_0224C4B8(&param0->unk_1B8)) {
if (gSystem.pressedKeys & (PAD_BUTTON_A | PAD_BUTTON_B)) {
param0->unk_00 = param0->unk_04;
}
}
break;
case 12:
ov7_0224C444(&param0->unk_1B8);
ov7_0224C698(&param0->unk_1CC);
ov7_0224C934(&param0->unk_1E8);
ov7_0224CC6C(&param0->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, &param0->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);
}

View File

@@ -1363,7 +1363,7 @@ const ScrCmdFunc Unk_020EAC58[] = {
ScrCmd_254,
ScrCmd_255,
ScrCmd_CalcCatchingShowPoints,
ScrCmd_257,
ScrCmd_ShowAccessoryShop,
ScrCmd_258,
ScrCmd_259,
ScrCmd_25A,

View File

@@ -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;
}

View File

@@ -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)