diff --git a/asm/macros/event.inc b/asm/macros/event.inc index bd7ce9be16e6..fdfc0c28cecd 100644 --- a/asm/macros/event.inc +++ b/asm/macros/event.inc @@ -1206,10 +1206,20 @@ @ Opens the Pokemart system, offering the specified products for sale. @ Products should be a list of .2byte item values preceded by an .align 2 - .macro pokemart products:req, useVariablePrices=FALSE + .macro pokemart products:req, shopType=SHOP_TYPE_NORMAL .byte SCR_OP_POKEMART .4byte \products - .2byte \useVariablePrices + .2byte \shopType + .endm + + @ Pokemart using coins for currency + .macro coinmart products:req + pokemart \products, SHOP_TYPE_COIN + .endm + + @ Pokemart using battle points for currency + .macro battlepointmart products:req + pokemart \products, SHOP_TYPE_POINTS .endm @ Used as the endpoint for a Pokemart item list diff --git a/graphics/new_shop/menu_bp.png b/graphics/new_shop/menu_bp.png new file mode 100644 index 000000000000..a71c448f3536 Binary files /dev/null and b/graphics/new_shop/menu_bp.png differ diff --git a/graphics/new_shop/menu_coin.png b/graphics/new_shop/menu_coin.png new file mode 100644 index 000000000000..96fc13e807bd Binary files /dev/null and b/graphics/new_shop/menu_coin.png differ diff --git a/graphics/new_shop/sellers/jennie/menu_bp.png b/graphics/new_shop/sellers/jennie/menu_bp.png new file mode 100644 index 000000000000..a71c448f3536 Binary files /dev/null and b/graphics/new_shop/sellers/jennie/menu_bp.png differ diff --git a/graphics/new_shop/sellers/jennie/menu_coin.png b/graphics/new_shop/sellers/jennie/menu_coin.png new file mode 100644 index 000000000000..96fc13e807bd Binary files /dev/null and b/graphics/new_shop/sellers/jennie/menu_coin.png differ diff --git a/graphics/new_shop/sellers/jerry/menu_bp.png b/graphics/new_shop/sellers/jerry/menu_bp.png new file mode 100644 index 000000000000..a71c448f3536 Binary files /dev/null and b/graphics/new_shop/sellers/jerry/menu_bp.png differ diff --git a/graphics/new_shop/sellers/jerry/menu_coin.png b/graphics/new_shop/sellers/jerry/menu_coin.png new file mode 100644 index 000000000000..96fc13e807bd Binary files /dev/null and b/graphics/new_shop/sellers/jerry/menu_coin.png differ diff --git a/include/coins.h b/include/coins.h index 6190ebbab5db..7a2f17b6fe95 100644 --- a/include/coins.h +++ b/include/coins.h @@ -8,5 +8,6 @@ u16 GetCoins(void); void SetCoins(u16 coinAmount); bool8 AddCoins(u16 toAdd); bool8 RemoveCoins(u16 toSub); +bool8 IsEnoughCoins(u16 cost); #endif // GUARD_COINS_H diff --git a/include/config/general.h b/include/config/general.h index 3e31eb688852..35038989bfcc 100644 --- a/include/config/general.h +++ b/include/config/general.h @@ -91,4 +91,11 @@ // Config to toggle using the new shop menu. #define MUDSKIP_SHOP_UI +// Some defines for specific type of shop used + +#define SHOP_TYPE_NORMAL 0 +#define SHOP_TYPE_VARIABLE 1 +#define SHOP_TYPE_COINS 2 +#define SHOP_TYPE_POINTS 3 + #endif // GUARD_CONFIG_GENERAL_H diff --git a/include/frontier_util.h b/include/frontier_util.h index 0d617782a34b..668a1ff10484 100644 --- a/include/frontier_util.h +++ b/include/frontier_util.h @@ -25,5 +25,9 @@ u8 GetFrontierBrainMonNature(u8 monId); u8 GetFrontierBrainMonEvs(u8 monId, u8 evStatId); s32 GetFronterBrainSymbol(void); void ClearEnemyPartyAfterChallenge(void); +u16 GetBattlePoints(void); +bool8 IsEnoughBattlePoints(u16 cost); +void SetBattlePoints(u16 pointAmount); +bool8 RemoveBattlePoints(u16 toSub); #endif // GUARD_FRONTIER_UTIL_H diff --git a/include/item.h b/include/item.h index b99a6f30c2ea..55845c56e701 100644 --- a/include/item.h +++ b/include/item.h @@ -25,6 +25,8 @@ struct Item u8 type; u8 battleUsage; u8 flingPower; + u16 coinPrice; + u16 bpPrice; const u32 *iconPic; const u32 *iconPalette; }; @@ -84,6 +86,8 @@ u32 ItemId_GetSecondaryId(u32 itemId); u32 ItemId_GetFlingPower(u32 itemId); u32 GetItemStatus1Mask(u16 itemId); u32 GetItemStatus2Mask(u16 itemId); +u32 ItemId_GetCoinPrice(u16 itemId); +u32 ItemId_GetBpPrice(u16 itemId); /* Expands to: * enum diff --git a/include/new_shop.h b/include/new_shop.h index 430fdad2ce5c..d422c49322c8 100644 --- a/include/new_shop.h +++ b/include/new_shop.h @@ -12,6 +12,8 @@ void NewShop_CreateOutfitShopMenu(const u16 *); #endif // MUDSKIP_OUTFIT_SYSTEM void NewShop_CreateVariablePokemartMenu(const u16 *); +void NewShop_CreateCoinPokemartMenu(const u16 *); +void NewShop_CreatePointsPokemartMenu(const u16 *); #endif // MUDSKIP_SHOP_UI diff --git a/src/coins.c b/src/coins.c index 4c4739999b75..8da00c83b616 100644 --- a/src/coins.c +++ b/src/coins.c @@ -80,3 +80,11 @@ bool8 RemoveCoins(u16 toSub) } return FALSE; } + +bool8 IsEnoughCoins(u16 cost) +{ + if (GetCoins() >= cost) + return TRUE; + else + return FALSE; +} diff --git a/src/frontier_util.c b/src/frontier_util.c index ab6dc867fd44..cb83ab44d691 100644 --- a/src/frontier_util.c +++ b/src/frontier_util.c @@ -2649,3 +2649,32 @@ void ClearEnemyPartyAfterChallenge() ZeroEnemyPartyMons(); } } + +u16 GetBattlePoints(void) +{ + return gSaveBlock2Ptr->frontier.battlePoints; +} + +bool8 IsEnoughBattlePoints(u16 cost) +{ + if (GetBattlePoints() >= cost) + return TRUE; + else + return FALSE; +} + +void SetBattlePoints(u16 pointAmount) +{ + gSaveBlock2Ptr->frontier.battlePoints = pointAmount; +} + +bool8 RemoveBattlePoints(u16 toSub) +{ + u16 ownedBp = GetBattlePoints(); + if (ownedBp >= toSub) + { + SetBattlePoints(ownedBp - toSub); + return TRUE; + } + return FALSE; +} diff --git a/src/item.c b/src/item.c index b0135d8f833b..1fc3d3891202 100644 --- a/src/item.c +++ b/src/item.c @@ -1013,3 +1013,13 @@ u32 GetItemStatus2Mask(u16 itemId) else return 0; } + +u32 ItemId_GetCoinPrice(u16 itemId) +{ + return gItemsInfo[SanitizeItemId(itemId)].coinPrice; +} + +u32 ItemId_GetBpPrice(u16 itemId) +{ + return gItemsInfo[SanitizeItemId(itemId)].bpPrice; +} diff --git a/src/new_shop.c b/src/new_shop.c index 56527d90b9f0..a733f7b6ebb6 100644 --- a/src/new_shop.c +++ b/src/new_shop.c @@ -1,5 +1,6 @@ #include "global.h" #include "bg.h" +#include "coins.h" #include "data.h" #include "decompress.h" #include "decoration.h" @@ -9,6 +10,7 @@ #include "field_screen_effect.h" #include "field_weather.h" #include "fieldmap.h" +#include "frontier_util.h" #include "gpu_regs.h" #include "graphics.h" #include "international_string_util.h" @@ -78,12 +80,14 @@ enum { enum { MART_TYPE_NORMAL, - #ifdef MUDSKIP_OUTFIT_SYSTEM - MART_TYPE_OUTFIT, - #endif // MUDSKIP_OUTFIT_SYSTEM MART_TYPE_VARIABLE, + MART_TYPE_COINS, + MART_TYPE_POINTS, MART_TYPE_DECOR, MART_TYPE_DECOR2, + #ifdef MUDSKIP_OUTFIT_SYSTEM + MART_TYPE_OUTFIT, + #endif // MUDSKIP_OUTFIT_SYSTEM }; // seller id @@ -99,14 +103,23 @@ enum Seller_MessageIds { SELLER_MSG_RETURN_TO_FIELD = 0, SELLER_MSG_BUY_PROMPT, + SELLER_MSG_BUY_COIN_PROMPT, + SELLER_MSG_BUY_BP_PROMPT, SELLER_MSG_BUY_PROMPT_PLURAL, SELLER_MSG_BUY_CONFIRM, + SELLER_MSG_BUY_COIN_CONFIRM, + SELLER_MSG_BUY_POINT_CONFIRM, SELLER_MSG_BUY_SUCCESS, SELLER_MSG_BUY_FAIL_NO_SPACE, SELLER_MSG_BUY_FAIL_NO_MONEY, + SELLER_MSG_BUY_FAIL_NO_COINS, + SELLER_MSG_BUY_FAIL_NO_POINTS, SELLER_MSG_BUY_FAIL_SOLD_OUT, SELLER_MGS_BUY_PREMIER_BONUS, SELLER_MSG_BUY_PREMIER_BONUS_PLURAL, + #ifdef MUDSKIP_OUTFIT_SYSTEM + SELLER_MSG_BUY_OUTFIT_PROMPT, + #endif // MUDSKIP_OUTFIT_SYSTEM SELLER_MSG_COUNT, }; @@ -162,6 +175,8 @@ struct Seller u32 menuTileOffset; const u32 *menuGfx; + const u32 *menuCoinGfx; + const u32 *menuPointGfx; const u32 *menuPal; const u32 *menuMap; @@ -187,17 +202,26 @@ const u8 sText_ReturnToField[] = _("Return to Field"); const u8 sText_ThatItemIsSoldOut[] = _("I'm sorry, but\nthat item is\nsold out."); const u8 sText_Var1CertainlyHowMany[] = _("{STR_VAR_1}?\nCertainly. How\nmany?"); const u8 sText_Var1AndYouWantedVar2[] = _("So you wanted\n{STR_VAR_2} {STR_VAR_1}?\nThat'll be ¥{STR_VAR_3}."); +const u8 sText_Var1AndYouWantedVar2Coins[] = _("So you wanted\n{STR_VAR_2} {STR_VAR_1}?\nThat'll be {STR_VAR_3} Coins."); +const u8 sText_Var1AndYouWantedVar2BP[] = _("So you wanted\n{STR_VAR_2} {STR_VAR_1}?\nThat'll be {STR_VAR_3} BP."); const u8 sText_YouWantedVar1ThatllBeVar2[] = _("You wanted the\n{STR_VAR_1}?\nThat'll be ¥{STR_VAR_2}."); +const u8 sText_YouWantedVar1ThatllBeVar2Coins[] = _("You wanted the\n{STR_VAR_1}?\nThat'll be {STR_VAR_2} Coins."); +const u8 sText_YouWantedVar1ThatllBeVar2BP[] = _("You wanted the\n{STR_VAR_1}?\nThat'll be {STR_VAR_2} BP."); +const u8 sText_YouWantedVar1OutfitThatllBeVar2[] = _("You wanted that {STR_VAR_1} Outfit?\nThat'll be ¥{STR_VAR_2}. Will that be okay?"); const u8 sText_HereYouGoThankYou[] = _("Here you go!\nThank you very much."); const u8 sText_ThankYouIllSendItHome[] = _("Thank you!\nI'll send it to\nyour home PC."); const u8 sText_ThanksIllSendItHome[] = _("Thanks!\nI'll send it to your\nPC at home."); const u8 sText_YouDontHaveMoney[] = _("You don't have\nenough money."); +const u8 sText_YouDontHaveCoins[] = _("You don't have\nenough Coins.{PAUSE_UNTIL_PRESS}"); +const u8 sText_YouDontHaveBP[] = _("You don't have\nenough Battle Points.{PAUSE_UNTIL_PRESS}"); const u8 sText_NoMoreRoomForThis[] = _("You have no more\nroom for this\nitem."); const u8 sText_SpaceForVar1Full[] = _("The space for\n{STR_VAR_1}\nis full."); const u8 sText_ThrowInPremierBall[] = _("I'll throw in\na PREMIER BALL,\ntoo."); const u8 sText_ThrowInPremierBalls[] = _("I'll throw in\n{STR_VAR_1} PREMIER BALLS,\ntoo."); const u32 sNewShopMenu_DefaultMenuGfx[] = INCBIN_U32("graphics/new_shop/menu.4bpp.lz"); +const u32 sNewShopMenu_DefaultMenuCoinGfx[] = INCBIN_U32("graphics/new_shop/menu_coin.4bpp.lz"); +const u32 sNewShopMenu_DefaultMenuPointGfx[] = INCBIN_U32("graphics/new_shop/menu_bp.4bpp.lz"); const u32 sNewShopMenu_DefaultMenuPal[] = INCBIN_U32("graphics/new_shop/menu.gbapal.lz"); const u32 sNewShopMenu_DefaultMenuTilemap[] = INCBIN_U32("graphics/new_shop/menu.bin.lz"); const u32 sNewShopMenu_DefaultScrollGfx[] = INCBIN_U32("graphics/new_shop/scroll.4bpp.lz"); @@ -207,6 +231,8 @@ const u16 sNewShopMenu_DefaultCursorGfx[] = INCBIN_U16("graphics/new_shop/cursor const u8 sNewShopMenu_SellerMugshotGfx_Jerry[] = INCBIN_U8("graphics/new_shop/sellers/jerry/mugshot.4bpp"); const u16 sNewShopMenu_SellerMugshotPal_Jerry[] = INCBIN_U16("graphics/new_shop/sellers/jerry/mugshot.gbapal"); const u32 sNewShopMenu_SellerMenuGfx_Jerry[] = INCBIN_U32("graphics/new_shop/sellers/jerry/menu.4bpp.lz"); +const u32 sNewShopMenu_SellerMenuCoinGfx_Jerry[] = INCBIN_U32("graphics/new_shop/sellers/jerry/menu_coin.4bpp.lz"); +const u32 sNewShopMenu_SellerMenuPointsGfx_Jerry[] = INCBIN_U32("graphics/new_shop/sellers/jerry/menu_bp.4bpp.lz"); const u32 sNewShopMenu_SellerMenuPal_Jerry[] = INCBIN_U32("graphics/new_shop/sellers/jerry/menu.gbapal.lz"); const u32 sNewShopMenu_SellerMenuMap_Jerry[] = INCBIN_U32("graphics/new_shop/sellers/jerry/menu.bin.lz"); const u32 sNewShopMenu_SellerScrollGfx_Jerry[] = INCBIN_U32("graphics/new_shop/sellers/jerry/scroll.4bpp.lz"); @@ -218,6 +244,8 @@ const u32 sNewShopMenu_SellerCursorPal_Jerry[] = INCBIN_U32("graphics/new_shop/s const u8 sNewShopMenu_SellerMugshotGfx_Jennie[] = INCBIN_U8("graphics/new_shop/sellers/jennie/mugshot.4bpp"); const u16 sNewShopMenu_SellerMugshotPal_Jennie[] = INCBIN_U16("graphics/new_shop/sellers/jennie/mugshot.gbapal"); const u32 sNewShopMenu_SellerMenuGfx_Jennie[] = INCBIN_U32("graphics/new_shop/sellers/jennie/menu.4bpp.lz"); +const u32 sNewShopMenu_SellerMenuCoinGfx_Jennie[] = INCBIN_U32("graphics/new_shop/sellers/jennie/menu_coin.4bpp.lz"); +const u32 sNewShopMenu_SellerMenuBpGfx_Jennie[] = INCBIN_U32("graphics/new_shop/sellers/jennie/menu_bp.4bpp.lz"); const u32 sNewShopMenu_SellerMenuPal_Jennie[] = INCBIN_U32("graphics/new_shop/sellers/jennie/menu.gbapal.lz"); const u32 sNewShopMenu_SellerMenuMap_Jennie[] = INCBIN_U32("graphics/new_shop/sellers/jennie/menu.bin.lz"); const u32 sNewShopMenu_SellerScrollGfx_Jennie[] = INCBIN_U32("graphics/new_shop/sellers/jennie/scroll.4bpp.lz"); @@ -253,7 +281,7 @@ static void RecordItemPurchase(u8 taskId); static void Task_ReturnToItemListAfterItemPurchase(u8 taskId); static void Task_HandleShopMenuBuy(u8 taskId); static void Task_HandleShopMenuSell(u8 taskId); -static void PrintMoneyLocal(u8 windowId, u8 y, u32 amount, u8 width, u8 colorIdx, bool32 copy); +static void PrintMoneyLocal(u8 windowId, u8 x, u8 y, u32 amount, u8 width, u8 colorIdx, bool32 copy); static void UpdateItemData(void); static void Task_ReturnToItemListWaitMsg(u8 taskId); @@ -459,6 +487,8 @@ static const struct Seller sSellers[] = { .mugshotPal = sNewShopMenu_SellerMugshotPal_Jerry, .menuTileOffset = 9, .menuGfx = sNewShopMenu_SellerMenuGfx_Jerry, + .menuCoinGfx = sNewShopMenu_SellerMenuCoinGfx_Jerry, + .menuPointGfx = sNewShopMenu_SellerMenuPointsGfx_Jerry, .menuPal = sNewShopMenu_SellerMenuPal_Jerry, .menuMap = sNewShopMenu_SellerMenuMap_Jerry, .scrollGfx = sNewShopMenu_SellerScrollGfx_Jerry, @@ -470,14 +500,23 @@ static const struct Seller sSellers[] = { .message = { [SELLER_MSG_RETURN_TO_FIELD] = gText_AnythingElseICanHelp, [SELLER_MSG_BUY_PROMPT] = sText_YouWantedVar1ThatllBeVar2, + [SELLER_MSG_BUY_COIN_PROMPT] = sText_YouWantedVar1ThatllBeVar2Coins, + [SELLER_MSG_BUY_BP_PROMPT] = sText_YouWantedVar1ThatllBeVar2BP, [SELLER_MSG_BUY_PROMPT_PLURAL] = sText_Var1CertainlyHowMany, [SELLER_MSG_BUY_CONFIRM] = sText_Var1AndYouWantedVar2, + [SELLER_MSG_BUY_COIN_CONFIRM] = sText_Var1AndYouWantedVar2Coins, + [SELLER_MSG_BUY_POINT_CONFIRM] = sText_Var1AndYouWantedVar2BP, [SELLER_MSG_BUY_SUCCESS] = sText_HereYouGoThankYou, [SELLER_MSG_BUY_FAIL_NO_SPACE] = sText_NoMoreRoomForThis, [SELLER_MSG_BUY_FAIL_NO_MONEY] = sText_YouDontHaveMoney, + [SELLER_MSG_BUY_FAIL_NO_COINS] = sText_YouDontHaveCoins, + [SELLER_MSG_BUY_FAIL_NO_POINTS] = sText_YouDontHaveBP, [SELLER_MSG_BUY_FAIL_SOLD_OUT] = sText_ThatItemIsSoldOut, [SELLER_MGS_BUY_PREMIER_BONUS] = sText_ThrowInPremierBall, [SELLER_MSG_BUY_PREMIER_BONUS_PLURAL] = sText_ThrowInPremierBalls, + #ifdef MUDSKIP_OUTFIT_SYSTEM + [SELLER_MSG_BUY_OUTFIT_PROMPT] = sText_YouWantedVar1OutfitThatllBeVar2, + #endif // MUDSKIP_OUTFIT_SYSTEM }, }, [SELLER_JENNIE] = { @@ -486,6 +525,8 @@ static const struct Seller sSellers[] = { .mugshotPal = sNewShopMenu_SellerMugshotPal_Jennie, .menuTileOffset = 9, .menuGfx = sNewShopMenu_SellerMenuGfx_Jennie, + .menuCoinGfx = sNewShopMenu_SellerMenuCoinGfx_Jennie, + .menuPointGfx = sNewShopMenu_SellerMenuBpGfx_Jennie, .menuPal = sNewShopMenu_SellerMenuPal_Jennie, .menuMap = sNewShopMenu_SellerMenuMap_Jennie, .scrollGfx = sNewShopMenu_SellerScrollGfx_Jennie, @@ -496,6 +537,40 @@ static const struct Seller sSellers[] = { }, }; +static inline bool32 IsMartTypePoints(u8 martType) +{ + return martType == MART_TYPE_POINTS; +} + +static inline bool32 IsMartTypeCoin(u8 martType) +{ + return martType == MART_TYPE_COINS; +} + +static inline bool32 IsMartTypeMoney(u8 martType) +{ + return !IsMartTypePoints(martType) && !IsMartTypeCoin(martType); +} + +static inline bool32 IsMartTypeItem(u8 martType) +{ + return martType <= MART_TYPE_POINTS; +} + +#ifdef MUDSKIP_OUTFIT_SYSTEM +static inline bool32 IsMartTypeOutfit(u8 martType) +{ + return martType == MART_TYPE_OUTFIT; +} +#endif // MUDSKIP_OUTFIT_SYSTEM + +// This only exist because of the Slateport sale +static inline bool32 IsMartTypeMoneyItem(u8 martType) +{ + return martType == MART_TYPE_NORMAL + || martType == MART_TYPE_VARIABLE; +} + static u8 CreateShopMenu(u8 martType) { int numMenuItems; @@ -505,7 +580,7 @@ static u8 CreateShopMenu(u8 martType) switch (martType) { - case MART_TYPE_DECOR ... MART_TYPE_DECOR2: + default: { struct WindowTemplate winTemplate = sShopMenuWindowTemplates[WIN_BUY_QUIT]; winTemplate.width = GetMaxWidthInMenuTable(sShopMenuActions_BuyQuit, ARRAY_COUNT(sShopMenuActions_BuyQuit)); @@ -514,7 +589,8 @@ static u8 CreateShopMenu(u8 martType) numMenuItems = ARRAY_COUNT(sShopMenuActions_BuyQuit); break; } - default: + case MART_TYPE_NORMAL: + case MART_TYPE_VARIABLE: { struct WindowTemplate winTemplate = sShopMenuWindowTemplates[WIN_BUY_SELL_QUIT]; winTemplate.width = GetMaxWidthInMenuTable(sShopMenuActions_BuySellQuit, ARRAY_COUNT(sShopMenuActions_BuySellQuit)); @@ -668,8 +744,12 @@ static const void *Shop_GetSellerGraphics(enum Seller_GraphicsIds gfxId) break; case SELLER_GFX_MENU_GFX: - return seller->menuGfx != NULL ? seller->menuGfx : sNewShopMenu_DefaultMenuGfx; - break; + if (IsMartTypeCoin(sMartInfo.martType)) + return seller->menuCoinGfx != NULL ? seller->menuCoinGfx : sNewShopMenu_DefaultMenuCoinGfx; + else if (IsMartTypePoints(sMartInfo.martType)) + return seller->menuPointGfx != NULL ? seller->menuPointGfx : sNewShopMenu_DefaultMenuPointGfx; + else // if (IsMartTypeMoney(sMartInfo.martType)) + return seller->menuGfx != NULL ? seller->menuGfx : sNewShopMenu_DefaultMenuGfx; case SELLER_GFX_MENU_PAL: return seller->menuPal != NULL ? seller->menuPal : sNewShopMenu_DefaultMenuPal; break; @@ -1020,7 +1100,12 @@ static void BuyMenuDecompressBgGraphics(void) u32 i = sMartInfo.sellerId; if (gSpecialVar_LastTalked == 0 || i == SELLER_NONE) { - DecompressAndCopyTileDataToVram(2, sNewShopMenu_DefaultMenuGfx, 0, DEFAULT_MENU_TILE_OFFSET, 0); + if (IsMartTypeCoin(sMartInfo.martType)) + DecompressAndCopyTileDataToVram(2, sNewShopMenu_DefaultMenuCoinGfx, 0, DEFAULT_MENU_TILE_OFFSET, 0); + else if (IsMartTypePoints(sMartInfo.martType)) + DecompressAndCopyTileDataToVram(2, sNewShopMenu_DefaultMenuPointGfx, 0, DEFAULT_MENU_TILE_OFFSET, 0); + else // if (IsMartTypeMoney(sMartInfo.martType)) + DecompressAndCopyTileDataToVram(2, sNewShopMenu_DefaultMenuGfx, 0, DEFAULT_MENU_TILE_OFFSET, 0); DecompressAndCopyTileDataToVram(2, sNewShopMenu_DefaultScrollGfx, 0, 0, 0); LZDecompressWram(sNewShopMenu_DefaultMenuTilemap, sShopData->tilemapBuffers[0]); LZDecompressWram(sNewShopMenu_DefaultScrollTilemap, sShopData->tilemapBuffers[1]); @@ -1088,6 +1173,10 @@ static inline u32 BuyMenuGetItemPrice(u32 id) // custom case MART_TYPE_VARIABLE: return SearchItemListForPrice(sMartInfo.itemList[id]); + case MART_TYPE_COINS: + return ItemId_GetCoinPrice(sMartInfo.itemList[id]); + case MART_TYPE_POINTS: + return ItemId_GetBpPrice(sMartInfo.itemList[id]); #ifdef MUDSKIP_OUTFIT_SYSTEM case MART_TYPE_OUTFIT: return GetOutfitPrice(sMartInfo.itemList[id]); @@ -1182,9 +1271,9 @@ static void BuyMenuInitWindows(void) } if (ItemId_GetImportance(item) && (CheckBagHasItem(item, 1) || CheckPCHasItem(item, 1))) - BuyMenuPrint(WIN_MULTI, sText_ThatItemIsSoldOut, GetStringRightAlignXOffset(FONT_SMALL, sText_ThatItemIsSoldOut, 80), 2*8, TEXT_SKIP_DRAW, COLORID_BLACK, FALSE); + BuyMenuPrint(WIN_MULTI, sText_SoldOut, GetStringRightAlignXOffset(FONT_SMALL, sText_SoldOut, 80), 2*8, TEXT_SKIP_DRAW, COLORID_BLACK, FALSE); else - PrintMoneyLocal(WIN_MULTI, 2*8, price, 84, COLORID_BLACK, FALSE); + PrintMoneyLocal(WIN_MULTI, 41, 2*8, price, 84, COLORID_BLACK, FALSE); ConvertIntToDecimalStringN(gStringVar3, quantity, STR_CONV_MODE_RIGHT_ALIGN, 4); BuyMenuPrint(WIN_MULTI, gStringVar3, GetStringRightAlignXOffset(FONT_SMALL, gStringVar3, 80), 4*8, TEXT_SKIP_DRAW, COLORID_BLACK, FALSE); @@ -1192,10 +1281,18 @@ static void BuyMenuInitWindows(void) } #ifdef MUDSKIP_OUTFIT_SYSTEM case MART_TYPE_OUTFIT: + { + u32 outfit = sMartInfo.itemList[0]; + if (GetOutfitStatus(outfit)) + BuyMenuPrint(WIN_MULTI, sText_SoldOut, GetStringRightAlignXOffset(FONT_SMALL, sText_SoldOut, 80), 2*8, TEXT_SKIP_DRAW, COLORID_NORMAL, FALSE); + else + PrintMoneyLocal(WIN_MULTI, 41, 2*8, price, 84, COLORID_NORMAL, FALSE); + break; + } #endif // MUDSKIP_OUTFIT_SYSTEM case MART_TYPE_DECOR ... MART_TYPE_DECOR2: { - PrintMoneyLocal(WIN_MULTI, 2*8, price, 84, COLORID_BLACK, FALSE); + PrintMoneyLocal(WIN_MULTI, 41, 2*8, price, 84, COLORID_BLACK, FALSE); break; } } @@ -1260,22 +1357,34 @@ static void BuyMenuPrint(u8 windowId, const u8 *text, u8 x, u8 y, s8 speed, u8 c CopyWindowToVram(windowId, COPYWIN_FULL); } -static void PrintMoneyLocal(u8 windowId, u8 y, u32 amount, u8 width, u8 colorIdx, bool32 copy) +const u8 sText_CoinsVar1[] = _("{STR_VAR_1}"); +const u8 sText_PokedollarVar1[] = _("¥{STR_VAR_1}"); +const u8 sText_BattlePointsVar1[] = _("BP {STR_VAR_1}"); +// Tried adding in support for more than 6 max digits, but only success so far is supporting 7 digits +static void PrintMoneyLocal(u8 windowId, u8 x, u8 y, u32 amount, u8 width, u8 colorIdx, bool32 copy) { u8 *txtPtr; - s32 strLength; - s32 x; + //s32 strLength; + //s32 temp; + u32 numDigits = CountDigits(amount); + u32 maxDigits = (numDigits > 7) ? MAX_MONEY_DIGITS: 7; - ConvertIntToDecimalStringN(gStringVar1, amount, STR_CONV_MODE_RIGHT_ALIGN, 6); + if (IsMartTypePoints(sMartInfo.martType)) + maxDigits = 5; - strLength = 6 - StringLength(gStringVar1); - txtPtr = gStringVar4; + ConvertIntToDecimalStringN(gStringVar1, amount, STR_CONV_MODE_RIGHT_ALIGN, maxDigits); - while (strLength-- > 0) - *(txtPtr++) = CHAR_SPACER; + txtPtr = gStringVar4; - StringExpandPlaceholders(txtPtr, gText_PokedollarVar1); - x = GetStringRightAlignXOffset(FONT_NORMAL, txtPtr, width); + if (IsMartTypeCoin(sMartInfo.martType)) + StringExpandPlaceholders(txtPtr, sText_CoinsVar1); + else if (IsMartTypePoints(sMartInfo.martType)) + StringExpandPlaceholders(txtPtr, sText_BattlePointsVar1); + else + StringExpandPlaceholders(txtPtr, sText_PokedollarVar1); + //temp = GetStringRightAlignXOffset(FONT_NORMAL, txtPtr, width); + if (numDigits > 7) + PrependFontIdToFit(gStringVar4, txtPtr + 1 + numDigits, FONT_SMALL, width); AddTextPrinterParameterized4(windowId, FONT_SMALL, x, y, 0, 0, sShopBuyMenuTextColors[colorIdx], TEXT_SKIP_DRAW, gStringVar4); PutWindowTilemap(windowId); if (copy) @@ -1284,7 +1393,12 @@ static void PrintMoneyLocal(u8 windowId, u8 y, u32 amount, u8 width, u8 colorIdx static void BuyMenuDrawGraphics(void) { - PrintMoneyLocal(WIN_MONEY, 0, GetMoney(&gSaveBlock1Ptr->money), 84, COLORID_NORMAL, TRUE); + if (IsMartTypeCoin(sMartInfo.martType)) + PrintMoneyLocal(WIN_MONEY, 37, 0, GetCoins(), 84, COLORID_NORMAL, TRUE); + else if (IsMartTypePoints(sMartInfo.martType)) + PrintMoneyLocal(WIN_MONEY, 37, 0, GetBattlePoints(), 84, COLORID_NORMAL, TRUE); + else // if (IsMartTypeMoney(sMartInfo.martType)) + PrintMoneyLocal(WIN_MONEY, 37, 0, GetMoney(&gSaveBlock1Ptr->money), 84, COLORID_NORMAL, TRUE); ScheduleBgCopyTilemapToVram(0); ScheduleBgCopyTilemapToVram(1); ScheduleBgCopyTilemapToVram(2); @@ -1305,7 +1419,7 @@ static void UpdateItemData(void) BuyMenuPrint(WIN_MULTI, COMPOUND_STRING("Return to Field"), 0, 0, TEXT_SKIP_DRAW, COLORID_BLACK, FALSE); BuyMenuPrint(WIN_MULTI, strip, GetStringRightAlignXOffset(FONT_SMALL, strip, 80), 2*8, TEXT_SKIP_DRAW, COLORID_BLACK, FALSE); - if (sMartInfo.martType < MART_TYPE_DECOR) + if (IsMartTypeItem(sMartInfo.martType)) { BuyMenuPrint(WIN_MULTI, strip, GetStringRightAlignXOffset(FONT_SMALL, strip, 80), 4*8, TEXT_SKIP_DRAW, COLORID_BLACK, FALSE); } @@ -1334,9 +1448,9 @@ static void UpdateItemData(void) } if (ItemId_GetImportance(item) && (CheckBagHasItem(item, 1) || CheckPCHasItem(item, 1))) - BuyMenuPrint(WIN_MULTI, sText_ThatItemIsSoldOut, GetStringRightAlignXOffset(FONT_SMALL, sText_ThatItemIsSoldOut, 80), 2*8, TEXT_SKIP_DRAW, COLORID_BLACK, FALSE); + BuyMenuPrint(WIN_MULTI, sText_SoldOut, GetStringRightAlignXOffset(FONT_SMALL, sText_SoldOut, 80), 2*8, TEXT_SKIP_DRAW, COLORID_BLACK, FALSE); else - PrintMoneyLocal(WIN_MULTI, 2*8, BuyMenuGetItemPrice(i), 84, COLORID_BLACK, FALSE); + PrintMoneyLocal(WIN_MULTI, 41, 2*8, BuyMenuGetItemPrice(i), 84, COLORID_BLACK, FALSE); ConvertIntToDecimalStringN(gStringVar3, quantity, STR_CONV_MODE_RIGHT_ALIGN, 4); BuyMenuPrint(WIN_MULTI, gStringVar3, GetStringRightAlignXOffset(FONT_SMALL, gStringVar3, 80), 4*8, TEXT_SKIP_DRAW, COLORID_BLACK, FALSE); @@ -1344,10 +1458,18 @@ static void UpdateItemData(void) } #ifdef MUDSKIP_OUTFIT_SYSTEM case MART_TYPE_OUTFIT: + { + u32 outfit = item; + if (GetOutfitStatus(outfit)) + BuyMenuPrint(WIN_MULTI, sText_SoldOut, GetStringRightAlignXOffset(FONT_SMALL, sText_SoldOut, 80), 2*8, TEXT_SKIP_DRAW, COLORID_BLACK, FALSE); + else + PrintMoneyLocal(WIN_MULTI, 41, 2*8, BuyMenuGetItemPrice(i), 84, COLORID_BLACK, FALSE); + break; + } #endif // MUDSKIP_OUTFIT_SYSTEM case MART_TYPE_DECOR ... MART_TYPE_DECOR2: { - PrintMoneyLocal(WIN_MULTI, 2*8, BuyMenuGetItemPrice(i), 84, COLORID_BLACK, FALSE); + PrintMoneyLocal(WIN_MULTI, 41, 2*8, BuyMenuGetItemPrice(i), 84, COLORID_BLACK, FALSE); break; } } @@ -1382,14 +1504,14 @@ static void Task_BuyMenuTryBuyingItem(u8 taskId) s16 *data = gTasks[taskId].data; u32 cost = BuyMenuGetItemPrice(GridMenu_SelectedIndex(sShopData->gridItems)); const u8 *str; - if (sMartInfo.martType < MART_TYPE_DECOR) + if (IsMartTypeMoneyItem(sMartInfo.martType)) sShopData->totalCost = (cost >> IsPokeNewsActive(POKENEWS_SLATEPORT)); else sShopData->totalCost = cost; FillWindowPixelBuffer(WIN_ITEM_DESCRIPTION, PIXEL_FILL(0)); - if (sMartInfo.martType < MART_TYPE_DECOR) + if (IsMartTypeItem(sMartInfo.martType)) { if (ItemId_GetImportance(sShopData->currentItemId) && (CheckBagHasItem(sShopData->currentItemId, 1) || CheckPCHasItem(sShopData->currentItemId, 1))) { @@ -1400,15 +1522,45 @@ static void Task_BuyMenuTryBuyingItem(u8 taskId) } } - if (!IsEnoughMoney(&gSaveBlock1Ptr->money, sShopData->totalCost)) + #ifdef MUDSKIP_OUTFIT_SYSTEM + if (IsMartTypeOutfit(sMartInfo.martType)) + { + if (GetOutfitStatus(sShopData->currentItemId)) + { + PlaySE(SE_BOO); + str = Shop_GetSellerMessage(SELLER_MSG_BUY_FAIL_SOLD_OUT); + BuyMenuDisplayMessage(taskId, str, Task_ReturnToItemListWaitMsg); + return; + } + } + #endif // MUDSKIP_OUTFIT_SYSTEM + + if (!IsEnoughMoney(&gSaveBlock1Ptr->money, sShopData->totalCost) && IsMartTypeMoney(sMartInfo.martType)) { PlaySE(SE_BOO); str = Shop_GetSellerMessage(SELLER_MSG_BUY_FAIL_NO_MONEY); BuyMenuDisplayMessage(taskId, str, Task_ReturnToItemListWaitMsg); } + else if (!IsEnoughCoins(sShopData->totalCost) && IsMartTypeCoin(sMartInfo.martType)) + { + PlaySE(SE_BOO); + str = Shop_GetSellerMessage(SELLER_MSG_BUY_FAIL_NO_COINS); + BuyMenuDisplayMessage(taskId, str, Task_ReturnToItemListWaitMsg); + } + else if (!IsEnoughBattlePoints(sShopData->totalCost) && IsMartTypePoints(sMartInfo.martType)) + { + PlaySE(SE_BOO); + str = Shop_GetSellerMessage(SELLER_MSG_BUY_FAIL_NO_POINTS); + BuyMenuDisplayMessage(taskId, str, Task_ReturnToItemListWaitMsg); + } else { - str = Shop_GetSellerMessage(SELLER_MSG_BUY_PROMPT); + if (IsMartTypeCoin(sMartInfo.martType)) + str = Shop_GetSellerMessage(SELLER_MSG_BUY_COIN_PROMPT); + else if (IsMartTypePoints(sMartInfo.martType)) + str = Shop_GetSellerMessage(SELLER_MSG_BUY_BP_PROMPT); + else // if (IsMartTypeMoney(sMartInfo.martType)) + str = Shop_GetSellerMessage(SELLER_MSG_BUY_PROMPT); PlaySE(SE_SELECT); switch (sMartInfo.martType) { @@ -1417,11 +1569,20 @@ static void Task_BuyMenuTryBuyingItem(u8 taskId) CopyItemName(sShopData->currentItemId, gStringVar1); if (ItemId_GetImportance(sShopData->currentItemId)) { - u32 price = BuyMenuGetItemPrice(GridMenu_SelectedIndex(sShopData->gridItems)); - ConvertIntToDecimalStringN(gStringVar2, sShopData->totalCost, STR_CONV_MODE_LEFT_ALIGN, 6); - tItemCount = 1; - sShopData->totalCost = (price >> IsPokeNewsActive(POKENEWS_SLATEPORT)) * tItemCount; - BuyMenuDisplayMessage(taskId, str, BuyMenuConfirmPurchase); + if (IsMartTypeMoney(sMartInfo.martType)) + { + u32 price = BuyMenuGetItemPrice(GridMenu_SelectedIndex(sShopData->gridItems)); + ConvertIntToDecimalStringN(gStringVar2, sShopData->totalCost, STR_CONV_MODE_LEFT_ALIGN, MAX_MONEY_DIGITS); + tItemCount = 1; + sShopData->totalCost = (price >> IsPokeNewsActive(POKENEWS_SLATEPORT)) * tItemCount; + BuyMenuDisplayMessage(taskId, str, BuyMenuConfirmPurchase); + } + else + { + ConvertIntToDecimalStringN(gStringVar2, sShopData->totalCost, STR_CONV_MODE_LEFT_ALIGN, 6); + tItemCount = 1; + BuyMenuDisplayMessage(taskId, str, BuyMenuConfirmPurchase); + } } else { @@ -1433,7 +1594,7 @@ static void Task_BuyMenuTryBuyingItem(u8 taskId) case MART_TYPE_DECOR ... MART_TYPE_DECOR2: { StringCopy(gStringVar1, gDecorations[sShopData->currentItemId].name); - ConvertIntToDecimalStringN(gStringVar2, sShopData->totalCost, STR_CONV_MODE_LEFT_ALIGN, 6); + ConvertIntToDecimalStringN(gStringVar2, sShopData->totalCost, STR_CONV_MODE_LEFT_ALIGN, MAX_MONEY_DIGITS); BuyMenuDisplayMessage(taskId, str, BuyMenuConfirmPurchase); break; } @@ -1441,9 +1602,9 @@ static void Task_BuyMenuTryBuyingItem(u8 taskId) case MART_TYPE_OUTFIT: { BufferOutfitStrings(gStringVar1, sShopData->currentItemId, OUTFIT_BUFFER_NAME); - ConvertIntToDecimalStringN(gStringVar2, sShopData->totalCost, STR_CONV_MODE_LEFT_ALIGN, 6); - StringExpandPlaceholders(gStringVar4, str); - BuyMenuDisplayMessage(taskId, gStringVar4, BuyMenuConfirmPurchase); + ConvertIntToDecimalStringN(gStringVar2, sShopData->totalCost, STR_CONV_MODE_LEFT_ALIGN, MAX_MONEY_DIGITS); + str = Shop_GetSellerMessage(SELLER_MSG_BUY_OUTFIT_PROMPT); + BuyMenuDisplayMessage(taskId, str, BuyMenuConfirmPurchase); break; } #endif // MUDSKIP_OUTFIT_SYSTEM @@ -1491,7 +1652,15 @@ static void Task_BuyHowManyDialogueInit(u8 taskId) BuyMenuPrintItemQuantityAndPrice(taskId); ScheduleBgCopyTilemapToVram(0); - maxQuantity = GetMoney(&gSaveBlock1Ptr->money) / sShopData->totalCost; + // Avoid division by zero in-case something costs 0 pokedollars. + if (sShopData->totalCost == 0) + maxQuantity = MAX_BAG_ITEM_CAPACITY; + else if (IsMartTypeCoin(sMartInfo.martType)) + maxQuantity = GetCoins() / sShopData->totalCost; + else if (IsMartTypePoints(sMartInfo.martType)) + maxQuantity = GetBattlePoints() / sShopData->totalCost; + else // if (IsMartTypeMoney(sMartInfo.martType)) + maxQuantity = GetMoney(&gSaveBlock1Ptr->money) / sShopData->totalCost; if (maxQuantity > MAX_BAG_ITEM_CAPACITY) sShopData->maxQuantity = MAX_BAG_ITEM_CAPACITY; @@ -1508,7 +1677,10 @@ static void Task_BuyHowManyDialogueHandleInput(u8 taskId) if (AdjustQuantityAccordingToDPadInput(&tItemCount, sShopData->maxQuantity) == TRUE) { u32 price = BuyMenuGetItemPrice(GridMenu_SelectedIndex(sShopData->gridItems)); - sShopData->totalCost = (price >> IsPokeNewsActive(POKENEWS_SLATEPORT)) * tItemCount; + if (IsMartTypeMoneyItem(sMartInfo.martType)) + sShopData->totalCost = (price >> IsPokeNewsActive(POKENEWS_SLATEPORT)) * tItemCount; + else + sShopData->totalCost = price * tItemCount; BuyMenuPrintItemQuantityAndPrice(taskId); } else @@ -1519,14 +1691,19 @@ static void Task_BuyHowManyDialogueHandleInput(u8 taskId) ClearWindowTilemap(WIN_QUANTITY_PRICE); CopyItemName(sShopData->currentItemId, gStringVar1); ConvertIntToDecimalStringN(gStringVar2, tItemCount, STR_CONV_MODE_LEFT_ALIGN, MAX_ITEM_DIGITS); - ConvertIntToDecimalStringN(gStringVar3, sShopData->totalCost, STR_CONV_MODE_LEFT_ALIGN, 6); + ConvertIntToDecimalStringN(gStringVar3, sShopData->totalCost, STR_CONV_MODE_LEFT_ALIGN, MAX_MONEY_DIGITS); FillWindowPixelBuffer(WIN_ITEM_DESCRIPTION, PIXEL_FILL(0)); if (tItemCount >= 2) CopyItemNameHandlePlural(sShopData->currentItemId, gStringVar1, tItemCount); else CopyItemName(sShopData->currentItemId, gStringVar1); - BuyMenuDisplayMessage(taskId, Shop_GetSellerMessage(SELLER_MSG_BUY_CONFIRM), BuyMenuConfirmPurchase); + if (IsMartTypeCoin(sMartInfo.martType)) + BuyMenuDisplayMessage(taskId, Shop_GetSellerMessage(SELLER_MSG_BUY_COIN_CONFIRM), BuyMenuConfirmPurchase); + else if (IsMartTypePoints(sMartInfo.martType)) + BuyMenuDisplayMessage(taskId, Shop_GetSellerMessage(SELLER_MSG_BUY_POINT_CONFIRM), BuyMenuConfirmPurchase); + else // if (IsMartTypeMoney(sMartInfo.martType)) + BuyMenuDisplayMessage(taskId, Shop_GetSellerMessage(SELLER_MSG_BUY_CONFIRM), BuyMenuConfirmPurchase); } else if (JOY_NEW(B_BUTTON)) { @@ -1556,6 +1733,7 @@ static void BuyMenuTryMakePurchase(u8 taskId) if (AddBagItem(sShopData->currentItemId, tItemCount) == TRUE) { str = Shop_GetSellerMessage(SELLER_MSG_BUY_SUCCESS); + GetSetItemObtained(sShopData->currentItemId, FLAG_SET_ITEM_OBTAINED); BuyMenuDisplayMessage(taskId, str, BuyMenuSubtractMoney); RecordItemPurchase(taskId); } @@ -1598,10 +1776,27 @@ static void BuyMenuTryMakePurchase(u8 taskId) static void BuyMenuSubtractMoney(u8 taskId) { IncrementGameStat(GAME_STAT_SHOPPED); - RemoveMoney(&gSaveBlock1Ptr->money, sShopData->totalCost); - PlaySE(SE_SHOP); - FillWindowPixelBuffer(WIN_MONEY, PIXEL_FILL(0)); - PrintMoneyLocal(WIN_MONEY, 0, GetMoney(&gSaveBlock1Ptr->money), 84, COLORID_NORMAL, TRUE); + if (IsMartTypeCoin(sMartInfo.martType)) + { + RemoveCoins(sShopData->totalCost); + PlaySE(SE_SHOP); + FillWindowPixelBuffer(WIN_MONEY, PIXEL_FILL(0)); + PrintMoneyLocal(WIN_MONEY, 37, 0, GetCoins(), 84, COLORID_NORMAL, TRUE); + } + else if (IsMartTypePoints(sMartInfo.martType)) + { + RemoveBattlePoints(sShopData->totalCost); + PlaySE(SE_SHOP); + FillWindowPixelBuffer(WIN_MONEY, PIXEL_FILL(0)); + PrintMoneyLocal(WIN_MONEY, 37, 0, GetBattlePoints(), 84, COLORID_NORMAL, TRUE); + } + else //if (IsMartTypeMoney(sMartInfo.martType)) + { + RemoveMoney(&gSaveBlock1Ptr->money, sShopData->totalCost); + PlaySE(SE_SHOP); + FillWindowPixelBuffer(WIN_MONEY, PIXEL_FILL(0)); + PrintMoneyLocal(WIN_MONEY, 37, 0, GetMoney(&gSaveBlock1Ptr->money), 84, COLORID_NORMAL, TRUE); + } switch (sMartInfo.martType) { @@ -1695,7 +1890,7 @@ static void BuyMenuPrintItemQuantityAndPrice(u8 taskId) s16 *data = gTasks[taskId].data; FillWindowPixelBuffer(WIN_QUANTITY_PRICE, PIXEL_FILL(0)); - PrintMoneyLocal(WIN_QUANTITY_PRICE, 13, sShopData->totalCost, 56, COLORID_BLACK, FALSE); + PrintMoneyLocal(WIN_QUANTITY_PRICE, 13, 13, sShopData->totalCost, 56, COLORID_BLACK, FALSE); ConvertIntToDecimalStringN(gStringVar1, tItemCount, STR_CONV_MODE_LEADING_ZEROS, MAX_ITEM_DIGITS); StringExpandPlaceholders(gStringVar4, gText_xVar1); BuyMenuPrint(WIN_QUANTITY_PRICE, gStringVar4, 29, 3, TEXT_SKIP_DRAW, COLORID_BLACK, FALSE); @@ -1773,7 +1968,7 @@ void NewShop_CreateDecorationShop2Menu(const u16 *itemsForSale) #ifdef MUDSKIP_OUTFIT_SYSTEM void NewShop_CreateOutfitShopMenu(const u16 *itemsForSale) { - CreateNewShopMenu(MART_TYPE_OUTFIT); + CreateShopMenu(MART_TYPE_OUTFIT); SetShopItemsForSale(itemsForSale); SetShopMenuCallback(ScriptContext_Enable); } @@ -1787,4 +1982,20 @@ void NewShop_CreateVariablePokemartMenu(const u16 *itemsForSale) SetShopMenuCallback(ScriptContext_Enable); } +void NewShop_CreateCoinPokemartMenu(const u16 *itemsForSale) +{ + CreateShopMenu(MART_TYPE_COINS); + SetShopItemsForSale(itemsForSale); + ClearItemPurchases(); + SetShopMenuCallback(ScriptContext_Enable); +} + +void NewShop_CreatePointsPokemartMenu(const u16 *itemsForSale) +{ + CreateShopMenu(MART_TYPE_POINTS); + SetShopItemsForSale(itemsForSale); + ClearItemPurchases(); + SetShopMenuCallback(ScriptContext_Enable); +} + #endif // MUDSKIP_SHOP_UI diff --git a/src/scrcmd.c b/src/scrcmd.c index ed53d966e370..9068210853a4 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -2492,17 +2492,24 @@ bool8 ScrCmd_dowildbattle(struct ScriptContext *ctx) bool8 ScrCmd_pokemart(struct ScriptContext *ctx) { const void *ptr = (void *)ScriptReadWord(ctx); - bool16 useVariablePrices = ScriptReadHalfword(ctx); + u16 shopType = ScriptReadHalfword(ctx); Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); - if (useVariablePrices) + switch (shopType) { + case SHOP_TYPE_VARIABLE: NewShop_CreateVariablePokemartMenu(ptr); - } - else - { + break; + case SHOP_TYPE_COINS: + NewShop_CreateCoinPokemartMenu(ptr); + break; + case SHOP_TYPE_POINTS: + NewShop_CreatePointsPokemartMenu(ptr); + break; + default: NewShop_CreatePokemartMenu(ptr); + break; } ScriptContext_Stop(); return TRUE;