diff --git a/graphics/mevent/gfx_46718C.png b/graphics/mevent/gfx_46718C.png deleted file mode 100644 index bf52445e6..000000000 Binary files a/graphics/mevent/gfx_46718C.png and /dev/null differ diff --git a/graphics/mevent/gfx_46737C.png b/graphics/mevent/gfx_46737C.png deleted file mode 100644 index 1a23f8b94..000000000 Binary files a/graphics/mevent/gfx_46737C.png and /dev/null differ diff --git a/graphics/mevent/gfx_467558.png b/graphics/mevent/gfx_467558.png deleted file mode 100644 index c28edd891..000000000 Binary files a/graphics/mevent/gfx_467558.png and /dev/null differ diff --git a/graphics/mevent/gfx_467700.png b/graphics/mevent/gfx_467700.png deleted file mode 100644 index f31385746..000000000 Binary files a/graphics/mevent/gfx_467700.png and /dev/null differ diff --git a/graphics/mevent/gfx_467A7C.png b/graphics/mevent/gfx_467A7C.png deleted file mode 100644 index f94b6c50f..000000000 Binary files a/graphics/mevent/gfx_467A7C.png and /dev/null differ diff --git a/graphics/mevent/gfx_467EF4.png b/graphics/mevent/gfx_467EF4.png deleted file mode 100644 index 51a1aeb0c..000000000 Binary files a/graphics/mevent/gfx_467EF4.png and /dev/null differ diff --git a/graphics/mevent/gfx_4680C0.png b/graphics/mevent/gfx_4680C0.png deleted file mode 100644 index 1a27f3213..000000000 Binary files a/graphics/mevent/gfx_4680C0.png and /dev/null differ diff --git a/graphics/mevent/gfx_46821C.png b/graphics/mevent/gfx_46821C.png deleted file mode 100644 index aab27d16c..000000000 Binary files a/graphics/mevent/gfx_46821C.png and /dev/null differ diff --git a/graphics/mevent/gfx_46830C.png b/graphics/mevent/gfx_46830C.png deleted file mode 100644 index 3c2b8e6d1..000000000 Binary files a/graphics/mevent/gfx_46830C.png and /dev/null differ diff --git a/graphics/mevent/gfx_468448.png b/graphics/mevent/gfx_468448.png deleted file mode 100644 index 137dbe9f3..000000000 Binary files a/graphics/mevent/gfx_468448.png and /dev/null differ diff --git a/graphics/mevent/gfx_4685B4.png b/graphics/mevent/gfx_4685B4.png deleted file mode 100644 index 137dbe9f3..000000000 Binary files a/graphics/mevent/gfx_4685B4.png and /dev/null differ diff --git a/graphics/mevent/tilemap_467288.bin b/graphics/wonder_card/bg0.bin similarity index 100% rename from graphics/mevent/tilemap_467288.bin rename to graphics/wonder_card/bg0.bin diff --git a/graphics/mevent/pal_46708C.pal b/graphics/wonder_card/bg0.pal similarity index 100% rename from graphics/mevent/pal_46708C.pal rename to graphics/wonder_card/bg0.pal diff --git a/graphics/wonder_card/bg0.png b/graphics/wonder_card/bg0.png new file mode 100644 index 000000000..924a46dac Binary files /dev/null and b/graphics/wonder_card/bg0.png differ diff --git a/graphics/mevent/tilemap_467470.bin b/graphics/wonder_card/bg1.bin similarity index 100% rename from graphics/mevent/tilemap_467470.bin rename to graphics/wonder_card/bg1.bin diff --git a/graphics/mevent/pal_4670AC.pal b/graphics/wonder_card/bg1.pal similarity index 100% rename from graphics/mevent/pal_4670AC.pal rename to graphics/wonder_card/bg1.pal diff --git a/graphics/wonder_card/bg1.png b/graphics/wonder_card/bg1.png new file mode 100644 index 000000000..8ea8b1a41 Binary files /dev/null and b/graphics/wonder_card/bg1.png differ diff --git a/graphics/mevent/tilemap_46762C.bin b/graphics/wonder_card/bg2.bin similarity index 100% rename from graphics/mevent/tilemap_46762C.bin rename to graphics/wonder_card/bg2.bin diff --git a/graphics/mevent/pal_4670CC.pal b/graphics/wonder_card/bg2.pal similarity index 100% rename from graphics/mevent/pal_4670CC.pal rename to graphics/wonder_card/bg2.pal diff --git a/graphics/wonder_card/bg2.png b/graphics/wonder_card/bg2.png new file mode 100644 index 000000000..96a3252a4 Binary files /dev/null and b/graphics/wonder_card/bg2.png differ diff --git a/graphics/mevent/pal_4670EC.pal b/graphics/wonder_card/bg3.pal similarity index 100% rename from graphics/mevent/pal_4670EC.pal rename to graphics/wonder_card/bg3.pal diff --git a/graphics/mevent/pal_46710C.pal b/graphics/wonder_card/bg4.pal similarity index 100% rename from graphics/mevent/pal_46710C.pal rename to graphics/wonder_card/bg4.pal diff --git a/graphics/mevent/pal_46712C.pal b/graphics/wonder_card/bg5.pal similarity index 100% rename from graphics/mevent/pal_46712C.pal rename to graphics/wonder_card/bg5.pal diff --git a/graphics/mevent/tilemap_467934.bin b/graphics/wonder_card/bg6.bin similarity index 100% rename from graphics/mevent/tilemap_467934.bin rename to graphics/wonder_card/bg6.bin diff --git a/graphics/mevent/pal_46714C.pal b/graphics/wonder_card/bg6.pal similarity index 100% rename from graphics/mevent/pal_46714C.pal rename to graphics/wonder_card/bg6.pal diff --git a/graphics/wonder_card/bg6.png b/graphics/wonder_card/bg6.png new file mode 100644 index 000000000..f534b555e Binary files /dev/null and b/graphics/wonder_card/bg6.png differ diff --git a/graphics/mevent/tilemap_467CAC.bin b/graphics/wonder_card/bg7.bin similarity index 100% rename from graphics/mevent/tilemap_467CAC.bin rename to graphics/wonder_card/bg7.bin diff --git a/graphics/mevent/pal_46716C.pal b/graphics/wonder_card/bg7.pal similarity index 100% rename from graphics/mevent/pal_46716C.pal rename to graphics/wonder_card/bg7.pal diff --git a/graphics/wonder_card/bg7.png b/graphics/wonder_card/bg7.png new file mode 100644 index 000000000..90890ded9 Binary files /dev/null and b/graphics/wonder_card/bg7.png differ diff --git a/graphics/wonder_card/stamp_shadow.png b/graphics/wonder_card/stamp_shadow.png new file mode 100644 index 000000000..ae1c92a93 Binary files /dev/null and b/graphics/wonder_card/stamp_shadow.png differ diff --git a/graphics/mevent/pal_467DF4.pal b/graphics/wonder_card/stamp_shadow_0.pal similarity index 100% rename from graphics/mevent/pal_467DF4.pal rename to graphics/wonder_card/stamp_shadow_0.pal diff --git a/graphics/mevent/pal_467E14.pal b/graphics/wonder_card/stamp_shadow_1.pal similarity index 100% rename from graphics/mevent/pal_467E14.pal rename to graphics/wonder_card/stamp_shadow_1.pal diff --git a/graphics/mevent/pal_467E34.pal b/graphics/wonder_card/stamp_shadow_2.pal similarity index 100% rename from graphics/mevent/pal_467E34.pal rename to graphics/wonder_card/stamp_shadow_2.pal diff --git a/graphics/mevent/pal_467E54.pal b/graphics/wonder_card/stamp_shadow_3.pal similarity index 100% rename from graphics/mevent/pal_467E54.pal rename to graphics/wonder_card/stamp_shadow_3.pal diff --git a/graphics/mevent/pal_467E74.pal b/graphics/wonder_card/stamp_shadow_4.pal similarity index 100% rename from graphics/mevent/pal_467E74.pal rename to graphics/wonder_card/stamp_shadow_4.pal diff --git a/graphics/mevent/pal_467E94.pal b/graphics/wonder_card/stamp_shadow_5.pal similarity index 100% rename from graphics/mevent/pal_467E94.pal rename to graphics/wonder_card/stamp_shadow_5.pal diff --git a/graphics/mevent/pal_467EB4.pal b/graphics/wonder_card/stamp_shadow_6.pal similarity index 100% rename from graphics/mevent/pal_467EB4.pal rename to graphics/wonder_card/stamp_shadow_6.pal diff --git a/graphics/mevent/pal_467ED4.pal b/graphics/wonder_card/stamp_shadow_7.pal similarity index 100% rename from graphics/mevent/pal_467ED4.pal rename to graphics/wonder_card/stamp_shadow_7.pal diff --git a/graphics/mevent/tilemap_468140.bin b/graphics/wonder_news/bg0.bin similarity index 100% rename from graphics/mevent/tilemap_468140.bin rename to graphics/wonder_news/bg0.bin diff --git a/graphics/mevent/pal_468060.pal b/graphics/wonder_news/bg0.pal similarity index 100% rename from graphics/mevent/pal_468060.pal rename to graphics/wonder_news/bg0.pal diff --git a/graphics/wonder_news/bg0.png b/graphics/wonder_news/bg0.png new file mode 100644 index 000000000..1c227c7ec Binary files /dev/null and b/graphics/wonder_news/bg0.png differ diff --git a/graphics/mevent/tilemap_46824C.bin b/graphics/wonder_news/bg1.bin similarity index 100% rename from graphics/mevent/tilemap_46824C.bin rename to graphics/wonder_news/bg1.bin diff --git a/graphics/wonder_news/bg1.png b/graphics/wonder_news/bg1.png new file mode 100644 index 000000000..6a269f861 Binary files /dev/null and b/graphics/wonder_news/bg1.png differ diff --git a/graphics/mevent/tilemap_46837C.bin b/graphics/wonder_news/bg2.bin similarity index 100% rename from graphics/mevent/tilemap_46837C.bin rename to graphics/wonder_news/bg2.bin diff --git a/graphics/wonder_news/bg2.png b/graphics/wonder_news/bg2.png new file mode 100644 index 000000000..518283c86 Binary files /dev/null and b/graphics/wonder_news/bg2.png differ diff --git a/graphics/mevent/tilemap_4684D8.bin b/graphics/wonder_news/bg6.bin similarity index 100% rename from graphics/mevent/tilemap_4684D8.bin rename to graphics/wonder_news/bg6.bin diff --git a/graphics/mevent/pal_468080.pal b/graphics/wonder_news/bg6.pal similarity index 100% rename from graphics/mevent/pal_468080.pal rename to graphics/wonder_news/bg6.pal diff --git a/graphics/wonder_news/bg6.png b/graphics/wonder_news/bg6.png new file mode 100644 index 000000000..6e26cdc06 Binary files /dev/null and b/graphics/wonder_news/bg6.png differ diff --git a/graphics/mevent/tilemap_468644.bin b/graphics/wonder_news/bg7.bin similarity index 100% rename from graphics/mevent/tilemap_468644.bin rename to graphics/wonder_news/bg7.bin diff --git a/graphics/mevent/pal_4680A0.pal b/graphics/wonder_news/bg7.pal similarity index 100% rename from graphics/mevent/pal_4680A0.pal rename to graphics/wonder_news/bg7.pal diff --git a/graphics/wonder_news/bg7.png b/graphics/wonder_news/bg7.png new file mode 100644 index 000000000..f224e1845 Binary files /dev/null and b/graphics/wonder_news/bg7.png differ diff --git a/include/constants/mystery_gift.h b/include/constants/mystery_gift.h new file mode 100644 index 000000000..8ff71c3aa --- /dev/null +++ b/include/constants/mystery_gift.h @@ -0,0 +1,47 @@ +#ifndef GUARD_CONSTANTS_MYSTERY_GIFT_H +#define GUARD_CONSTANTS_MYSTERY_GIFT_H + +#define GET_NUM_STAMPS 0 +#define GET_MAX_STAMPS 1 +#define GET_CARD_BATTLES_WON 2 +#define GET_CARD_BATTLES_LOST 3 +#define GET_CARD_NUM_TRADES 4 + +#define CARD_STAT_BATTLES_WON 0 +#define CARD_STAT_BATTLES_LOST 1 +#define CARD_STAT_NUM_TRADES 2 +#define CARD_STAT_NUM_STAMPS 3 +#define CARD_STAT_MAX_STAMPS 4 + +// Values for the type field of Wonder Card +#define CARD_TYPE_GIFT 0 // Normal "Wonder Card" +#define CARD_TYPE_STAMP 1 // "Stamp Card" +#define CARD_TYPE_LINK_STAT 2 // Referred to as the "Battle Card", shows battle and trade stats +#define CARD_TYPE_COUNT 3 + +// Values for the sendType field of Wonder Card/News +#define SEND_TYPE_DISALLOWED 0 +#define SEND_TYPE_ALLOWED 1 +#define SEND_TYPE_ALLOWED_ALWAYS 2 + +// Return values for MysteryGift_CompareCardFlags, handled by gMysteryGiftServerScript_SendWonderCard +#define HAS_NO_CARD 0 +#define HAS_SAME_CARD 1 +#define HAS_DIFF_CARD 2 + +// The number of battles needed to be recorded on a Battle Card to win a prize +#define REQUIRED_CARD_BATTLES 3 + +// Stamps are 32 bits. The first 16 bits are the species +// and the second 16 bits are a number (presumably an ID of some kind) +#define STAMP_SPECIES 0 +#define STAMP_ID 1 + +// Number of different types/colors of Wonder Card and News backgrounds +#define NUM_WONDER_BGS 8 + +#define MAX_WONDER_CARD_STAT 999 + +#define WONDER_CARD_FLAG_OFFSET 1000 + +#endif //GUARD_CONSTANTS_MYSTERY_GIFT_H diff --git a/include/mevent.h b/include/mevent.h index 8a75dde65..9a273a872 100644 --- a/include/mevent.h +++ b/include/mevent.h @@ -9,6 +9,14 @@ #define CARD_STAT_NUM_STAMPS 3 #define CARD_STAT_MAX_STAMPS 4 +enum { + NEWS_INPUT_A, + NEWS_INPUT_B, + NEWS_INPUT_SCROLL_UP, + NEWS_INPUT_SCROLL_DOWN, + NEWS_INPUT_NONE = 0xFF +}; + struct MEventClientHeaderStruct { u32 unk_00; @@ -39,12 +47,12 @@ struct MEvent_Str_2 u8 fill_00[0x40]; }; -struct UnkStruct_8467FB8 +struct WonderGraphics { - u8 textPal1:4; - u8 textPal2:4; - u8 textPal3:4; - u8 index:4; + u8 titleTextPal:4; + u8 bodyTextPal:4; + u8 footerTextPal:4; + u8 stampShadowPal:4; const u8 * tiles; const u8 * map; const u16 * pal; @@ -73,22 +81,22 @@ u32 sub_8144418(const u16 * a0, const struct MEventClientHeaderStruct * a1, void u32 MEvent_CanPlayerReceiveDistributionMon(const u16 * a0, const struct MEventClientHeaderStruct * a1, void *unused); bool32 sub_8144474(const struct MEventClientHeaderStruct * a0, const u16 * a1); u16 sub_81444B0(const struct MEventClientHeaderStruct * a0, u32 command); -bool32 InitWonderCardResources(struct WonderCard * r5, struct WonderCardMetadata * r6); -bool32 InitWonderNewsResources(const struct WonderNews * a0); -s32 FadeToWonderCardMenu(void); -s32 FadeToWonderNewsMenu(void); +bool32 WonderCard_Init(struct WonderCard * card, struct WonderCardMetadata * metadata); +bool32 WonderNews_Init(const struct WonderNews * news); +s32 WonderCard_Enter(void); +s32 WonderNews_Enter(void); void DestroyWonderCard(void); void DestroyWonderNews(void); -void DestroyWonderCardResources(void); -void DestroyWonderNewsResources(void); -s32 FadeOutFromWonderCard(bool32 flag); -s32 FadeOutFromWonderNews(bool32 flag); +void WonderCard_Destroy(void); +void WonderNews_Destroy(void); +s32 WonderCard_Exit(bool32 flag); +s32 WonderNews_Exit(bool32 flag); bool32 CheckReceivedGiftFromWonderCard(void); -void MENews_AddScrollIndicatorArrowPair(void); -void MENews_RemoveScrollIndicatorArrowPair(void); +void WonderNews_AddScrollIndicatorArrowPair(void); +void WonderNews_RemoveScrollIndicatorArrowPair(void); bool32 WonderNews_Test_Unk_02(void); bool32 WonderCard_Test_Unk_08_6(void); -u32 MENews_GetInput(u16 input); +u32 WonderNews_GetInput(u16 input); void InitMEventData(void); u16 MEvent_GetBattleCardCount(u32 command); void MysteryGift_TryIncrementStat(u32 eventId, u32 trainerId); diff --git a/ld_script.txt b/ld_script.txt index 46b7d0e7b..546f6b5fe 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -279,8 +279,8 @@ SECTIONS { src/mevent_server_helpers.o(.text); src/mevent_client.o(.text); src/mevent_server.o(.text); - src/mevent_show_card.o(.text); - src/mevent_show_news.o(.text); + src/mystery_gift_show_card.o(.text); + src/mystery_gift_show_news.o(.text); src/menews_jisan.o(.text); src/seagallop.o(.text); src/pokemon_jump.o(.text); @@ -572,8 +572,8 @@ SECTIONS { src/mevent_server_helpers.o(.rodata); src/mevent_client.o(.rodata); src/mevent_server.o(.rodata); - src/mevent_show_card.o(.rodata); - src/mevent_show_news.o(.rodata); + src/mystery_gift_show_card.o(.rodata); + src/mystery_gift_show_news.o(.rodata); src/mevent_scripts.o(.rodata); src/menews_jisan.o(.rodata); src/menews_jisan.o(.rodata.str1.4); diff --git a/src/mevent_show_card.c b/src/mevent_show_card.c deleted file mode 100644 index 8d3ce4895..000000000 --- a/src/mevent_show_card.c +++ /dev/null @@ -1,452 +0,0 @@ -#include "global.h" -#include "gflib.h" -#include "decompress.h" -#include "menu.h" -#include "new_menu_helpers.h" -#include "pokemon_icon.h" -#include "mystery_gift_menu.h" -#include "mevent.h" -#include "battle_anim.h" - -struct MEventScreenMgr_02DC -{ - u8 nDigits; - u8 nameTxt[41]; - u8 numberTxt[4]; -}; - -struct MEventScreenMgr -{ - /*0000*/ struct WonderCard wonderCard; - /*014c*/ struct WonderCardMetadata buff3430Sub; - /*0170*/ const struct UnkStruct_8467FB8 * bgSpec; - /*0174*/ u8 state; - /*0175*/ u8 recordIdx; - /*0176*/ u16 windowIds[3]; - /*017C*/ u8 monIconId; - /*017D*/ u8 cardIconAndShadowSprites[7][2]; - /*018B*/ u8 title[41]; - /*01B4*/ u8 subtitle[41]; - /*01DD*/ u8 unk_01DD[7]; - /*01E4*/ u8 mainMessageLines[4][41]; - /*0288*/ u8 instructionsLine1[41]; - /*02B1*/ u8 instructionsLine2[41]; - /*02DC*/ struct MEventScreenMgr_02DC recordStrings[8]; - /*045C*/ u8 buffer_045C[0x1000]; -}; - -static EWRAM_DATA struct MEventScreenMgr * sMEventScreenData = NULL; - -static void sub_8145A98(void); -static void sub_8145D18(u8 whichWindow); -static void sub_8146060(void); -static void sub_81461D8(void); - -static const u8 gUnknown_8467068[][3] = { - {0, 2, 3}, - {0, 1, 2} -}; - -static const u8 ALIGNED(4) sTextYCoords[3] = {7, 4, 7}; - -static const struct WindowTemplate sWindowTemplates[] = { - { - .bg = 1, - .tilemapLeft = 1, - .tilemapTop = 1, - .width = 25, - .height = 4, - .paletteNum = 15, - .baseBlock = 0x29c}, - { - .bg = 1, - .tilemapLeft = 1, - .tilemapTop = 6, - .width = 28, - .height = 8, - .paletteNum = 15, - .baseBlock = 0x1bc}, - { - .bg = 1, - .tilemapLeft = 1, - .tilemapTop = 14, - .width = 28, - .height = 5, - .paletteNum = 15, - .baseBlock = 0x130} -}; - -static const u16 sCard0Pal[] = INCBIN_U16("graphics/mevent/pal_46708C.gbapal"); -const u16 gCard1Pal[] = INCBIN_U16("graphics/mevent/pal_4670AC.gbapal"); -const u16 gCard2Pal[] = INCBIN_U16("graphics/mevent/pal_4670CC.gbapal"); -const u16 gCard3Pal[] = INCBIN_U16("graphics/mevent/pal_4670EC.gbapal"); -const u16 gCard4Pal[] = INCBIN_U16("graphics/mevent/pal_46710C.gbapal"); -const u16 gCard5Pal[] = INCBIN_U16("graphics/mevent/pal_46712C.gbapal"); -static const u16 sCard6Pal[] = INCBIN_U16("graphics/mevent/pal_46714C.gbapal"); -static const u16 sCard7Pal[] = INCBIN_U16("graphics/mevent/pal_46716C.gbapal"); -static const u8 sCard0Gfx[] = INCBIN_U8("graphics/mevent/gfx_46718C.4bpp.lz"); -static const u8 sCard0Map[] = INCBIN_U8("graphics/mevent/tilemap_467288.bin.lz"); -static const u8 sCard1Gfx[] = INCBIN_U8("graphics/mevent/gfx_46737C.4bpp.lz"); -static const u8 sCard1Map[] = INCBIN_U8("graphics/mevent/tilemap_467470.bin.lz"); -static const u8 sCard2Gfx[] = INCBIN_U8("graphics/mevent/gfx_467558.4bpp.lz"); -static const u8 sCard2Map[] = INCBIN_U8("graphics/mevent/tilemap_46762C.bin.lz"); -static const u8 sCard6Gfx[] = INCBIN_U8("graphics/mevent/gfx_467700.4bpp.lz"); -static const u8 sCard6Map[] = INCBIN_U8("graphics/mevent/tilemap_467934.bin.lz"); -static const u8 sCard7Gfx[] = INCBIN_U8("graphics/mevent/gfx_467A7C.4bpp.lz"); -static const u8 sCard7Map[] = INCBIN_U8("graphics/mevent/tilemap_467CAC.bin.lz"); -static const u16 sUnknown_8467DF4[] = INCBIN_U16("graphics/mevent/pal_467DF4.gbapal"); -static const u16 sUnknown_8467E14[] = INCBIN_U16("graphics/mevent/pal_467E14.gbapal"); -static const u16 sUnknown_8467E34[] = INCBIN_U16("graphics/mevent/pal_467E34.gbapal"); -static const u16 sUnknown_8467E54[] = INCBIN_U16("graphics/mevent/pal_467E54.gbapal"); -static const u16 sUnknown_8467E74[] = INCBIN_U16("graphics/mevent/pal_467E74.gbapal"); -static const u16 sUnknown_8467E94[] = INCBIN_U16("graphics/mevent/pal_467E94.gbapal"); -static const u16 sUnknown_8467EB4[] = INCBIN_U16("graphics/mevent/pal_467EB4.gbapal"); -static const u16 sUnknown_8467ED4[] = INCBIN_U16("graphics/mevent/pal_467ED4.gbapal"); -static const u32 sUnknown_8467EF4[] = INCBIN_U32("graphics/mevent/gfx_467EF4.4bpp.lz"); - -static const struct CompressedSpriteSheet sShadowSpriteSheet = { - sUnknown_8467EF4, 0x100, 0x8000 -}; - -static const struct SpritePalette sShadowSpritePalettes[] = { - {sUnknown_8467DF4, 0x8000}, - {sUnknown_8467E14, 0x8000}, - {sUnknown_8467E34, 0x8000}, - {sUnknown_8467E54, 0x8000}, - {sUnknown_8467E74, 0x8000}, - {sUnknown_8467E94, 0x8000}, - {sUnknown_8467EB4, 0x8000}, - {sUnknown_8467ED4, 0x8000} -}; - -static const struct SpriteTemplate sShadowSpriteTemplate = { - 0x8000, 0x8000, &gOamData_AffineOff_ObjNormal_32x16, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy -}; - -static const struct UnkStruct_8467FB8 sCardGfxPtrs[8] = { - {1, 0, 0, 0, sCard0Gfx, sCard0Map, sCard0Pal}, - {1, 0, 0, 1, sCard1Gfx, sCard1Map, gCard1Pal}, - {1, 0, 0, 2, sCard2Gfx, sCard2Map, gCard2Pal}, - {1, 0, 0, 3, sCard2Gfx, sCard2Map, gCard3Pal}, - {1, 0, 0, 4, sCard2Gfx, sCard2Map, gCard4Pal}, - {1, 0, 0, 5, sCard2Gfx, sCard2Map, gCard5Pal}, - {1, 0, 0, 6, sCard6Gfx, sCard6Map, sCard6Pal}, - {1, 0, 0, 7, sCard7Gfx, sCard7Map, sCard7Pal} -}; - -bool32 InitWonderCardResources(struct WonderCard * card, struct WonderCardMetadata * b3430sub) -{ - if (card == NULL || b3430sub == NULL) - return FALSE; - sMEventScreenData = AllocZeroed(sizeof(struct MEventScreenMgr)); - if (sMEventScreenData == NULL) - return FALSE; - sMEventScreenData->wonderCard = *card; - sMEventScreenData->buff3430Sub = *b3430sub; - if (sMEventScreenData->wonderCard.bgType >= NELEMS(sCardGfxPtrs)) - sMEventScreenData->wonderCard.bgType = 0; - if (sMEventScreenData->wonderCard.type >= NELEMS(sTextYCoords)) - sMEventScreenData->wonderCard.type = 0; - if (sMEventScreenData->wonderCard.maxStamps > NELEMS(sMEventScreenData->cardIconAndShadowSprites)) - sMEventScreenData->wonderCard.maxStamps = 0; - sMEventScreenData->bgSpec = &sCardGfxPtrs[sMEventScreenData->wonderCard.bgType]; - return TRUE; -} - -void DestroyWonderCardResources(void) -{ - if (sMEventScreenData != NULL) - { - *sMEventScreenData = (struct MEventScreenMgr){}; - Free(sMEventScreenData); - sMEventScreenData = NULL; - } -} - -s32 FadeToWonderCardMenu(void) -{ - if (sMEventScreenData == NULL) - return -1; - switch(sMEventScreenData->state) - { - case 0: - BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); - break; - case 1: - if (UpdatePaletteFade()) - return 0; - break; - case 2: - FillBgTilemapBufferRect_Palette0(0, 0x000, 0, 0, 30, 20); - FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 30, 20); - FillBgTilemapBufferRect_Palette0(2, 0x000, 0, 0, 30, 20); - CopyBgTilemapBufferToVram(0); - CopyBgTilemapBufferToVram(1); - CopyBgTilemapBufferToVram(2); - DecompressAndCopyTileDataToVram(2, sMEventScreenData->bgSpec->tiles, 0, 0x008, 0); - sMEventScreenData->windowIds[0] = AddWindow(&sWindowTemplates[0]); - sMEventScreenData->windowIds[1] = AddWindow(&sWindowTemplates[1]); - sMEventScreenData->windowIds[2] = AddWindow(&sWindowTemplates[2]); - break; - case 3: - if (FreeTempTileDataBuffersIfPossible()) - return 0; - gPaletteFade.bufferTransferDisabled = TRUE; - LoadPalette(sMEventScreenData->bgSpec->pal, 0x10, 0x20); - LZ77UnCompWram(sMEventScreenData->bgSpec->map, sMEventScreenData->buffer_045C); - CopyRectToBgTilemapBufferRect(2, sMEventScreenData->buffer_045C, 0, 0, 30, 20, 0, 0, 30, 20, 1, 0x008, 0); - CopyBgTilemapBufferToVram(2); - break; - case 4: - sub_8145A98(); - break; - case 5: - sub_8145D18(0); - sub_8145D18(1); - sub_8145D18(2); - CopyBgTilemapBufferToVram(1); - break; - case 6: - LoadMonIconPalettes(); - break; - case 7: - ShowBg(1); - ShowBg(2); - gPaletteFade.bufferTransferDisabled = FALSE; - sub_8146060(); - BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); - UpdatePaletteFade(); - break; - default: - if (UpdatePaletteFade()) - return 0; - sMEventScreenData->state = 0; - return 1; - } - ++sMEventScreenData->state; - return 0; -} - -s32 FadeOutFromWonderCard(bool32 flag) -{ - if (sMEventScreenData == NULL) - return -1; - switch (sMEventScreenData->state) - { - case 0: - BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); - break; - case 1: - if (UpdatePaletteFade()) - return 0; - break; - case 2: - FillBgTilemapBufferRect_Palette0(0, 0x000, 0, 0, 30, 20); - FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 30, 20); - FillBgTilemapBufferRect_Palette0(2, 0x000, 0, 0, 30, 20); - CopyBgTilemapBufferToVram(0); - CopyBgTilemapBufferToVram(1); - CopyBgTilemapBufferToVram(2); - break; - case 3: - HideBg(1); - HideBg(2); - RemoveWindow(sMEventScreenData->windowIds[2]); - RemoveWindow(sMEventScreenData->windowIds[1]); - RemoveWindow(sMEventScreenData->windowIds[0]); - break; - case 4: - sub_81461D8(); - FreeMonIconPalettes(); - break; - case 5: - PrintMysteryGiftOrEReaderTopMenu(gGiftIsFromEReader, flag); - break; - case 6: - CopyBgTilemapBufferToVram(0); - BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); - break; - default: - if (UpdatePaletteFade()) - return 0; - sMEventScreenData->state = 0; - return 1; - } - ++sMEventScreenData->state; - return 0; -} - -static void sub_8145A98(void) -{ - u16 i = 0; - u16 r6; - u16 sp0[3] = {0, 0, 0}; - - memcpy(sMEventScreenData->title, sMEventScreenData->wonderCard.titleText, 40); - sMEventScreenData->title[40] = EOS; - memcpy(sMEventScreenData->subtitle, sMEventScreenData->wonderCard.subtitleText, 40); - sMEventScreenData->subtitle[40] = EOS; - if (sMEventScreenData->wonderCard.idNumber > 999999) - sMEventScreenData->wonderCard.idNumber = 999999; - ConvertIntToDecimalStringN(sMEventScreenData->unk_01DD, sMEventScreenData->wonderCard.idNumber, STR_CONV_MODE_LEFT_ALIGN, 6); - for (i = 0; i < 4; i++) - { - memcpy(sMEventScreenData->mainMessageLines[i], sMEventScreenData->wonderCard.bodyText[i], 40); - sMEventScreenData->mainMessageLines[i][40] = EOS; - } - memcpy(sMEventScreenData->instructionsLine1, sMEventScreenData->wonderCard.footerLine1Text, 40); - sMEventScreenData->instructionsLine1[40] = EOS; - switch (sMEventScreenData->wonderCard.type) - { - case 0: - memcpy(sMEventScreenData->instructionsLine2, sMEventScreenData->wonderCard.footerLine2Text, 40); - sMEventScreenData->instructionsLine2[40] = EOS; - break; - case 1: - sMEventScreenData->instructionsLine2[00] = EOS; - break; - case 2: - sMEventScreenData->instructionsLine2[00] = EOS; - sp0[0] = sMEventScreenData->buff3430Sub.battlesWon < 999 ? sMEventScreenData->buff3430Sub.battlesWon : 999; - sp0[1] = sMEventScreenData->buff3430Sub.battlesLost < 999 ? sMEventScreenData->buff3430Sub.battlesLost : 999; - sp0[2] = sMEventScreenData->buff3430Sub.numTrades < 999 ? sMEventScreenData->buff3430Sub.numTrades : 999; - for (i = 0; i < 8; i++) - { - memset(sMEventScreenData->recordStrings[i].numberTxt, EOS, 4); - memset(sMEventScreenData->recordStrings[i].nameTxt, EOS, 41); - } - for (i = 0, r6 = 0; i < 40; i++) - { - if (sMEventScreenData->wonderCard.footerLine2Text[i] != CHAR_DYNAMIC_PLACEHOLDER) - { - sMEventScreenData->recordStrings[sMEventScreenData->recordIdx].nameTxt[r6] = sMEventScreenData->wonderCard.footerLine2Text[i]; - r6++; - } - else - { - u8 r3 = sMEventScreenData->wonderCard.footerLine2Text[i + 1]; - if (r3 > 2) - { - i += 2; - } - else - { - ConvertIntToDecimalStringN(sMEventScreenData->recordStrings[sMEventScreenData->recordIdx].numberTxt, sp0[r3], STR_CONV_MODE_LEADING_ZEROS, 3); - sMEventScreenData->recordStrings[sMEventScreenData->recordIdx].nDigits = sMEventScreenData->wonderCard.footerLine2Text[i + 2]; - sMEventScreenData->recordIdx++; - if (sMEventScreenData->recordIdx > 7) - break; - r6 = 0; - i += 2; - } - } - } - } -} - -static void sub_8145D18(u8 whichWindow) -{ - s8 sp0C = 0; - s32 windowId = sMEventScreenData->windowIds[whichWindow]; - PutWindowTilemap(windowId); - FillWindowPixelBuffer(windowId, 0); - switch (whichWindow) - { - case 0: - { - s32 x; - AddTextPrinterParameterized3(windowId, FONT_3, 0, 1, gUnknown_8467068[sMEventScreenData->bgSpec->textPal1], 0, sMEventScreenData->title); - x = 160 - GetStringWidth(FONT_3, sMEventScreenData->subtitle, GetFontAttribute(FONT_3, FONTATTR_LETTER_SPACING)); - if (x < 0) - x = 0; - AddTextPrinterParameterized3(windowId, FONT_3, x, 17, gUnknown_8467068[sMEventScreenData->bgSpec->textPal1], 0, sMEventScreenData->subtitle); - if (sMEventScreenData->wonderCard.idNumber != 0) - { - AddTextPrinterParameterized3(windowId, FONT_2, 166, 17, gUnknown_8467068[sMEventScreenData->bgSpec->textPal1], 0, sMEventScreenData->unk_01DD); - } - break; - } - case 1: - for (; sp0C < 4; sp0C++) - { - AddTextPrinterParameterized3(windowId, FONT_3, 0, 16 * sp0C + 2, gUnknown_8467068[sMEventScreenData->bgSpec->textPal2], 0, sMEventScreenData->mainMessageLines[sp0C]); - } - break; - case 2: - AddTextPrinterParameterized3(windowId, FONT_3, 0, sTextYCoords[sMEventScreenData->wonderCard.type], gUnknown_8467068[sMEventScreenData->bgSpec->textPal3], 0, sMEventScreenData->instructionsLine1); - if (sMEventScreenData->wonderCard.type != 2) - { - AddTextPrinterParameterized3(windowId, FONT_3, 0, 16 + sTextYCoords[sMEventScreenData->wonderCard.type], gUnknown_8467068[sMEventScreenData->bgSpec->textPal3], 0, sMEventScreenData->instructionsLine2); - } - else - { - s32 x = 0; - s32 y = sTextYCoords[sMEventScreenData->wonderCard.type] + 16; - s32 spacing = GetFontAttribute(FONT_3, FONTATTR_LETTER_SPACING); - for (; sp0C < sMEventScreenData->recordIdx; sp0C++) - { - AddTextPrinterParameterized3(windowId, FONT_3, x, y, gUnknown_8467068[sMEventScreenData->bgSpec->textPal3], 0, sMEventScreenData->recordStrings[sp0C].nameTxt); - if (sMEventScreenData->recordStrings[sp0C].numberTxt[0] != EOS) - { - x += GetStringWidth(FONT_3, sMEventScreenData->recordStrings[sp0C].nameTxt, spacing); - AddTextPrinterParameterized3(windowId, FONT_2, x, y, gUnknown_8467068[sMEventScreenData->bgSpec->textPal3], 0, sMEventScreenData->recordStrings[sp0C].numberTxt); - x += GetStringWidth(FONT_3, sMEventScreenData->recordStrings[sp0C].numberTxt, spacing) + sMEventScreenData->recordStrings[sp0C].nDigits; - } - } - } - break; - } - CopyWindowToVram(windowId, COPYWIN_FULL); -} - -static void sub_8146060(void) -{ - u8 r7 = 0; - sMEventScreenData->monIconId = 0xFF; - if (sMEventScreenData->buff3430Sub.iconSpecies != SPECIES_NONE) - { - sMEventScreenData->monIconId = CreateMonIcon_HandleDeoxys(MailSpeciesToIconSpecies(sMEventScreenData->buff3430Sub.iconSpecies), SpriteCallbackDummy, 0xDC, 0x14, 0, FALSE); - gSprites[sMEventScreenData->monIconId].oam.priority = 2; - } - if (sMEventScreenData->wonderCard.maxStamps != 0 && sMEventScreenData->wonderCard.type == 1) - { - LoadCompressedSpriteSheetUsingHeap(&sShadowSpriteSheet); - LoadSpritePalette(&sShadowSpritePalettes[sMEventScreenData->bgSpec->index]); - for (; r7 < sMEventScreenData->wonderCard.maxStamps; r7++) - { - sMEventScreenData->cardIconAndShadowSprites[r7][0] = 0xFF; - sMEventScreenData->cardIconAndShadowSprites[r7][1] = 0xFF; - sMEventScreenData->cardIconAndShadowSprites[r7][0] = CreateSprite(&sShadowSpriteTemplate, 0xd8 - 32 * r7, 0x90, 8); - if (sMEventScreenData->buff3430Sub.stampData[0][r7] != 0) - { - sMEventScreenData->cardIconAndShadowSprites[r7][1] = CreateMonIcon_HandleDeoxys(MailSpeciesToIconSpecies(sMEventScreenData->buff3430Sub.stampData[0][r7]), SpriteCallbackDummy, 0xd8 - 32 * r7, 0x88, 0, 0); - gSprites[sMEventScreenData->cardIconAndShadowSprites[r7][1]].oam.priority = 2; - } - } - } -} - -static void sub_81461D8(void) -{ - u8 r6 = 0; - if (sMEventScreenData->monIconId != 0xFF) - DestroyMonIcon(&gSprites[sMEventScreenData->monIconId]); - if (sMEventScreenData->wonderCard.maxStamps != 0 && sMEventScreenData->wonderCard.type == 1) - { - for (; r6 < sMEventScreenData->wonderCard.maxStamps; r6++) - { - if (sMEventScreenData->cardIconAndShadowSprites[r6][0] != 0xFF) - { - DestroySprite(&gSprites[sMEventScreenData->cardIconAndShadowSprites[r6][0]]); - // This might be a typo. Uncomment the next line, and comment the one that follows, to get the presumed intended behavior. - // if (sMEventScreenData->cardIconAndShadowSprites[r6][1] != 0xFF) - if (sMEventScreenData->cardIconAndShadowSprites[r6][0] != 0xFF) - { - DestroyMonIcon(&gSprites[sMEventScreenData->cardIconAndShadowSprites[r6][1]]); - } - } - } - FreeSpriteTilesByTag(0x8000); - FreeSpritePaletteByTag(0x8000); - } -} diff --git a/src/mevent_show_news.c b/src/mevent_show_news.c deleted file mode 100644 index 088f00f11..000000000 --- a/src/mevent_show_news.c +++ /dev/null @@ -1,357 +0,0 @@ -#include "global.h" -#include "gflib.h" -#include "menu_indicators.h" -#include "new_menu_helpers.h" -#include "mevent.h" -#include "mystery_gift_menu.h" -#include "menu.h" -#include "link_rfu.h" - -struct UnkStruct_203F3CC -{ - /*0000*/ struct WonderNews wonderNews; - /*01bc*/ const struct UnkStruct_8467FB8 * bgSpec; - /*01c0*/ u8 verticalScrollDisabled:1; - u8 state:7; - /*01c1*/ u8 menuIndicatorsId; - /*01c2*/ u8 unk_01C2_0:1; - u8 unk_01C2_1:7; - /*01c3*/ u8 scrollDirection:1; - u8 unk_01C3_1:7; - /*01c4*/ u16 numMails; - /*01c6*/ u16 scrollOffset; - /*01c8*/ u16 windowIds[2]; - /*01cc*/ u8 filler_01CC[2]; - /*01ce*/ u8 title[41]; - /*01f7*/ u8 messages[10][41]; - /*0394*/ struct ScrollArrowsTemplate scrollArrowsTemplate; - /*03a4*/ u8 buffer_03A4[0x1000]; -}; - -static EWRAM_DATA struct UnkStruct_203F3CC * sWork = NULL; - -static void sub_8146980(void); -static void sub_8146A30(void); -static void sub_8146B58(void); - -static const u8 sTextPals[][3] = { - {0, 2, 3}, - {0, 1, 2} -}; -static const struct WindowTemplate gUnknown_8468040[] = { - {0, 1, 0, 28, 3, 15, 0x000}, - {2, 1, 3, 28, 20, 15, 0x000} -}; -static const struct ScrollArrowsTemplate sScrollArrowsTemplate = { - 0x02, 0xe8, 0x18, 0x03, 0xe8, 0x98, - 0x0000, 0x0002, 0x1000, 0x1000, 0x0, -}; - -static const u16 sNews1Pal[] = INCBIN_U16("graphics/mevent/pal_468060.gbapal"); -static const u16 sNews6Pal[] = INCBIN_U16("graphics/mevent/pal_468080.gbapal"); -static const u16 sNews7Pal[] = INCBIN_U16("graphics/mevent/pal_4680A0.gbapal"); -static const u8 sNews0Gfx[] = INCBIN_U8("graphics/mevent/gfx_4680C0.4bpp.lz"); -static const u8 sNews0Map[] = INCBIN_U8("graphics/mevent/tilemap_468140.bin.lz"); -static const u8 sNews1Gfx[] = INCBIN_U8("graphics/mevent/gfx_46821C.4bpp.lz"); -static const u8 sNews1Map[] = INCBIN_U8("graphics/mevent/tilemap_46824C.bin.lz"); -static const u8 sNews2Gfx[] = INCBIN_U8("graphics/mevent/gfx_46830C.4bpp.lz"); -static const u8 sNews2Map[] = INCBIN_U8("graphics/mevent/tilemap_46837C.bin.lz"); -static const u8 sNews6Gfx[] = INCBIN_U8("graphics/mevent/gfx_468448.4bpp.lz"); -static const u8 sNews6Map[] = INCBIN_U8("graphics/mevent/tilemap_4684D8.bin.lz"); -static const u8 sNews7Gfx[] = INCBIN_U8("graphics/mevent/gfx_4685B4.4bpp.lz"); -static const u8 sNews7Map[] = INCBIN_U8("graphics/mevent/tilemap_468644.bin.lz"); - -static const struct UnkStruct_8467FB8 sBgSpecs[] = { - {1, 0, 0, 0, sNews0Gfx, sNews0Map, sNews1Pal}, - {1, 0, 0, 0, sNews1Gfx, sNews1Map, gCard1Pal}, - {1, 0, 0, 0, sNews2Gfx, sNews2Map, gCard2Pal}, - {1, 0, 0, 0, sNews2Gfx, sNews2Map, gCard3Pal}, - {1, 0, 0, 0, sNews2Gfx, sNews2Map, gCard4Pal}, - {1, 0, 0, 0, sNews2Gfx, sNews2Map, gCard5Pal}, - {1, 0, 0, 0, sNews6Gfx, sNews6Map, sNews6Pal}, - {1, 0, 0, 0, sNews7Gfx, sNews7Map, sNews7Pal} -}; - -bool32 InitWonderNewsResources(const struct WonderNews * news) -{ - if (news == NULL) - return FALSE; - sWork = AllocZeroed(sizeof(struct UnkStruct_203F3CC)); - if (sWork == NULL) - return FALSE; - sWork->wonderNews = *news; - if (sWork->wonderNews.bgType >= NELEMS(sBgSpecs)) - sWork->wonderNews.bgType = 0; - sWork->bgSpec = &sBgSpecs[sWork->wonderNews.bgType]; - sWork->menuIndicatorsId = 0xFF; - return TRUE; -} - -void DestroyWonderNewsResources(void) -{ - if (sWork != NULL) - { - *sWork = (struct UnkStruct_203F3CC){}; - Free(sWork); - sWork = NULL; - } -} - -s32 FadeToWonderNewsMenu(void) -{ - if (sWork == NULL) - return -1; - - switch (sWork->state) - { - case 0: - BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); - break; - case 1: - if (UpdatePaletteFade()) - return 0; - ChangeBgY(0, 0, 0); - ChangeBgY(1, 0, 0); - ChangeBgY(2, 0, 0); - ChangeBgY(3, 0, 0); - SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, 240)); - SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(26, 152)); - SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ); - SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ); - SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); - break; - case 2: - FillBgTilemapBufferRect_Palette0(0, 0x000, 0, 0, 30, 20); - FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 30, 20); - FillBgTilemapBufferRect_Palette0(2, 0x000, 0, 0, 30, 20); - FillBgTilemapBufferRect_Palette0(3, 0x000, 0, 0, 30, 20); - CopyBgTilemapBufferToVram(0); - CopyBgTilemapBufferToVram(1); - CopyBgTilemapBufferToVram(2); - CopyBgTilemapBufferToVram(3); - DecompressAndCopyTileDataToVram(3, sWork->bgSpec->tiles, 0, 8, 0); - sWork->windowIds[0] = AddWindow(&gUnknown_8468040[0]); - sWork->windowIds[1] = AddWindow(&gUnknown_8468040[1]); - break; - case 3: - if (FreeTempTileDataBuffersIfPossible()) - return 0; - gPaletteFade.bufferTransferDisabled = TRUE; - LoadPalette(sWork->bgSpec->pal, 0x10, 0x20); - LZ77UnCompWram(sWork->bgSpec->map, sWork->buffer_03A4); - CopyRectToBgTilemapBufferRect(1, sWork->buffer_03A4, 0, 0, 30, 3, 0, 0, 30, 3, 1, 8, 0); - CopyRectToBgTilemapBufferRect(3, sWork->buffer_03A4, 0, 3, 30, 23, 0, 3, 30, 23, 1, 8, 0); - CopyBgTilemapBufferToVram(1); - CopyBgTilemapBufferToVram(3); - break; - case 4: - sub_8146980(); - break; - case 5: - sub_8146A30(); - CopyBgTilemapBufferToVram(0); - CopyBgTilemapBufferToVram(2); - break; - case 6: - ShowBg(1); - ShowBg(2); - ShowBg(3); - gPaletteFade.bufferTransferDisabled = FALSE; - sWork->menuIndicatorsId = AddScrollIndicatorArrowPair(&sWork->scrollArrowsTemplate, &sWork->scrollOffset); - BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); - UpdatePaletteFade(); - break; - default: - if (UpdatePaletteFade()) - return 0; - sWork->state = 0; - return 1; - } - - ++sWork->state; - return 0; -} - -s32 FadeOutFromWonderNews(bool32 flag) -{ - if (sWork == NULL) - return -1; - switch (sWork->state) - { - case 0: - BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); - break; - case 1: - if (UpdatePaletteFade()) - return 0; - ChangeBgY(2, 0, 0); - SetGpuReg(REG_OFFSET_WIN0H, 0); - SetGpuReg(REG_OFFSET_WIN0V, 0); - SetGpuReg(REG_OFFSET_WININ, 0); - SetGpuReg(REG_OFFSET_WINOUT, 0); - ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); - break; - case 2: - FillBgTilemapBufferRect_Palette0(0, 0x000, 0, 0, 30, 20); - FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 30, 20); - FillBgTilemapBufferRect_Palette0(2, 0x000, 0, 0, 30, 24); - FillBgTilemapBufferRect_Palette0(3, 0x000, 0, 0, 30, 24); - CopyBgTilemapBufferToVram(0); - CopyBgTilemapBufferToVram(1); - CopyBgTilemapBufferToVram(2); - CopyBgTilemapBufferToVram(3); - break; - case 3: - HideBg(1); - HideBg(2); - RemoveWindow(sWork->windowIds[1]); - RemoveWindow(sWork->windowIds[0]); - break; - case 4: - ChangeBgY(2, 0, 0); - ChangeBgY(3, 0, 0); - if (sWork->menuIndicatorsId != 0xFF) - { - RemoveScrollIndicatorArrowPair(sWork->menuIndicatorsId); - sWork->menuIndicatorsId = 0xFF; - } - break; - case 5: - PrintMysteryGiftOrEReaderTopMenu(gGiftIsFromEReader, flag); - break; - case 6: - MG_DrawCheckerboardPattern(); - CopyBgTilemapBufferToVram(0); - CopyBgTilemapBufferToVram(3); - BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); - break; - default: - if (UpdatePaletteFade()) - return 0; - sWork->state = 0; - return 1; - } - ++sWork->state; - return 0; -} - -void MENews_RemoveScrollIndicatorArrowPair(void) -{ - if (!sWork->verticalScrollDisabled && sWork->menuIndicatorsId != 0xFF) - { - RemoveScrollIndicatorArrowPair(sWork->menuIndicatorsId); - sWork->menuIndicatorsId = 0xFF; - sWork->verticalScrollDisabled = TRUE; - } -} - - -void MENews_AddScrollIndicatorArrowPair(void) -{ - if (sWork->verticalScrollDisabled) - { - sWork->menuIndicatorsId = AddScrollIndicatorArrowPair(&sWork->scrollArrowsTemplate, &sWork->scrollOffset); - sWork->verticalScrollDisabled = FALSE; - } -} - -u32 MENews_GetInput(u16 input) -{ - if (sWork->unk_01C2_0) - { - sub_8146B58(); - return 0xFF; - } - switch (input) - { - case A_BUTTON: - return 0; - case B_BUTTON: - return 1; - case DPAD_UP: - if (sWork->scrollOffset == 0) - return 0xFF; - if (sWork->verticalScrollDisabled) - return 0xFF; - sWork->scrollDirection = FALSE; - break; - case DPAD_DOWN: - if (sWork->scrollOffset == sWork->numMails) - return 0xFF; - if (sWork->verticalScrollDisabled) - return 0xFF; - sWork->scrollDirection = TRUE; - break; - default: - return 0xFF; - } - sWork->unk_01C2_0 = TRUE; - sWork->unk_01C2_1 = 2; - sWork->unk_01C3_1 = 0; - if (sWork->scrollDirection == FALSE) - return 2; - else - return 3; -} - -static void sub_8146980(void) -{ - u8 i = 0; - memcpy(sWork->title, sWork->wonderNews.titleText, 40); - sWork->title[40] = EOS; - for (; i < 10; ++i) - { - memcpy(sWork->messages[i], sWork->wonderNews.bodyText[i], 40); - sWork->messages[i][40] = EOS; - if (i > 7 && sWork->messages[i][0] != EOS) - ++sWork->numMails; - } - sWork->scrollArrowsTemplate = sScrollArrowsTemplate; - sWork->scrollArrowsTemplate.fullyDownThreshold = sWork->numMails; -} - -static void sub_8146A30(void) -{ - u8 i = 0; - s32 x; - PutWindowTilemap(sWork->windowIds[0]); - PutWindowTilemap(sWork->windowIds[1]); - FillWindowPixelBuffer(sWork->windowIds[0], 0); - FillWindowPixelBuffer(sWork->windowIds[1], 0); - x = (0xe0 - GetStringWidth(FONT_3, sWork->title, GetFontAttribute(FONT_3, FONTATTR_LETTER_SPACING))) / 2; - if (x < 0) - x = 0; - AddTextPrinterParameterized3(sWork->windowIds[0], FONT_3, x, 6, sTextPals[sWork->bgSpec->textPal1], 0, sWork->title); - for (; i < 10; ++i) - { - AddTextPrinterParameterized3(sWork->windowIds[1], FONT_3, 0, 16 * i + 2, sTextPals[sWork->bgSpec->textPal2], 0, sWork->messages[i]); - } - CopyWindowToVram(sWork->windowIds[0], COPYWIN_FULL); - CopyWindowToVram(sWork->windowIds[1], COPYWIN_FULL); -} - -static void sub_8146B58(void) -{ - u16 r4 = sWork->unk_01C2_1; - r4 <<= 8; - if (sWork->scrollDirection) - { - ChangeBgY(2, r4, 1); - ChangeBgY(3, r4, 1); - } - else - { - ChangeBgY(2, r4, 2); - ChangeBgY(3, r4, 2); - } - sWork->unk_01C3_1 += sWork->unk_01C2_1; - if (sWork->unk_01C3_1 > 15) - { - if (sWork->scrollDirection) - ++sWork->scrollOffset; - else - --sWork->scrollOffset; - sWork->unk_01C2_0 = FALSE; - sWork->unk_01C3_1 = 0; - } -} diff --git a/src/mystery_gift_menu.c b/src/mystery_gift_menu.c index e21cd6724..d71aebd6a 100644 --- a/src/mystery_gift_menu.c +++ b/src/mystery_gift_menu.c @@ -802,18 +802,18 @@ bool32 HandleLoadWonderCardOrNews(u8 * state, bool32 cardOrNews) case 0: if (cardOrNews == 0) { - InitWonderCardResources(GetSavedWonderCard(), sav1_get_mevent_buffer_2()); + WonderCard_Init(GetSavedWonderCard(), sav1_get_mevent_buffer_2()); } else { - InitWonderNewsResources(GetSavedWonderNews()); + WonderNews_Init(GetSavedWonderNews()); } (*state)++; break; case 1: if (cardOrNews == 0) { - v0 = FadeToWonderCardMenu(); + v0 = WonderCard_Enter(); check: if (v0 != 0) { @@ -823,7 +823,7 @@ bool32 HandleLoadWonderCardOrNews(u8 * state, bool32 cardOrNews) } else { - v0 = FadeToWonderNewsMenu(); + v0 = WonderNews_Enter(); goto check; } done: @@ -851,9 +851,9 @@ bool32 TearDownCardOrNews_ReturnToTopMenu(bool32 cardOrNews, bool32 arg1) { if (cardOrNews == 0) { - if (FadeOutFromWonderCard(arg1) != 0) + if (WonderCard_Exit(arg1) != 0) { - DestroyWonderCardResources(); + WonderCard_Destroy(); return TRUE; } else @@ -863,9 +863,9 @@ bool32 TearDownCardOrNews_ReturnToTopMenu(bool32 cardOrNews, bool32 arg1) } else { - if (FadeOutFromWonderNews(arg1) != 0) + if (WonderNews_Exit(arg1) != 0) { - DestroyWonderNewsResources(); + WonderNews_Destroy(); return TRUE; } else @@ -1456,10 +1456,10 @@ void task00_mystery_gift(u8 taskId) } else { - switch (MENews_GetInput(gMain.newKeys)) + switch (WonderNews_GetInput(gMain.newKeys)) { case 0: - MENews_RemoveScrollIndicatorArrowPair(); + WonderNews_RemoveScrollIndicatorArrowPair(); data->state = 21; break; case 1: @@ -1507,7 +1507,7 @@ void task00_mystery_gift(u8 taskId) case -2u: if (data->IsCardOrNews == 1) { - MENews_AddScrollIndicatorArrowPair(); + WonderNews_AddScrollIndicatorArrowPair(); } data->state = 20; break; diff --git a/src/mystery_gift_show_card.c b/src/mystery_gift_show_card.c new file mode 100644 index 000000000..c462bda76 --- /dev/null +++ b/src/mystery_gift_show_card.c @@ -0,0 +1,518 @@ +#include "global.h" +#include "gflib.h" +#include "decompress.h" +#include "menu.h" +#include "new_menu_helpers.h" +#include "pokemon_icon.h" +#include "mystery_gift_menu.h" +#include "mevent.h" +#include "battle_anim.h" +#include "constants/mystery_gift.h" + +enum { + WIN_HEADER, + WIN_BODY, + WIN_FOOTER, + WIN_COUNT +}; + +#define TAG_STAMP_SHADOW 0x8000 + +struct CardStatTextData +{ + u8 width; + u8 statText[WONDER_CARD_TEXT_LENGTH + 1]; + u8 statNumberText[4]; +}; + +struct WonderCardData +{ + /*0000*/ struct WonderCard card; + /*014c*/ struct WonderCardMetadata cardMetadata; + /*0170*/ const struct WonderGraphics * gfx; + /*0174*/ u8 enterExitState; + /*0175*/ u8 recordIdx; + /*0176*/ u16 windowIds[WIN_COUNT]; + /*017C*/ u8 monIconSpriteId; + /*017D*/ u8 stampSpriteIds[MAX_STAMP_CARD_STAMPS][2]; // 2 sprites each, 1 for the shadow and 1 for the Pokémon + /*018B*/ u8 titleText[WONDER_CARD_TEXT_LENGTH + 1]; + /*01B4*/ u8 subtitleText[WONDER_CARD_TEXT_LENGTH + 1]; + /*01DD*/ u8 idNumberText[7]; + /*01E4*/ u8 bodyText[WONDER_CARD_BODY_TEXT_LINES][WONDER_CARD_TEXT_LENGTH + 1]; + /*0288*/ u8 footerLine1Text[WONDER_CARD_TEXT_LENGTH + 1]; + /*02B1*/ u8 footerLine2Text[WONDER_CARD_TEXT_LENGTH + 1]; + /*02DC*/ struct CardStatTextData statTextData[8]; + /*045C*/ u8 bgTilemapBuffer[0x1000]; +}; + +static EWRAM_DATA struct WonderCardData * sWonderCardData = NULL; + +static void BufferCardText(void); +static void DrawCardWindow(u8 whichWindow); +static void CreateCardSprites(void); +static void DestroyCardSprites(void); + +static const u8 sTextColorTable[][3] = { + {0, 2, 3}, + {0, 1, 2} +}; + +static const u8 ALIGNED(4) sFooterTextOffsets[CARD_TYPE_COUNT] = +{ + [CARD_TYPE_GIFT] = 7, + [CARD_TYPE_STAMP] = 4, + [CARD_TYPE_LINK_STAT] = 7 +}; + +static const struct WindowTemplate sWindowTemplates[] = { + [WIN_HEADER] = { + .bg = 1, + .tilemapLeft = 1, + .tilemapTop = 1, + .width = 25, + .height = 4, + .paletteNum = 15, + .baseBlock = 0x29c + }, + [WIN_BODY] = { + .bg = 1, + .tilemapLeft = 1, + .tilemapTop = 6, + .width = 28, + .height = 8, + .paletteNum = 15, + .baseBlock = 0x1bc + }, + [WIN_FOOTER] = { + .bg = 1, + .tilemapLeft = 1, + .tilemapTop = 14, + .width = 28, + .height = 5, + .paletteNum = 15, + .baseBlock = 0x130 + } +}; + +static const u16 sCard0Pal[] = INCBIN_U16("graphics/wonder_card/bg0.gbapal"); +const u16 gCard1Pal[] = INCBIN_U16("graphics/wonder_card/bg1.gbapal"); +const u16 gCard2Pal[] = INCBIN_U16("graphics/wonder_card/bg2.gbapal"); +const u16 gCard3Pal[] = INCBIN_U16("graphics/wonder_card/bg3.gbapal"); +const u16 gCard4Pal[] = INCBIN_U16("graphics/wonder_card/bg4.gbapal"); +const u16 gCard5Pal[] = INCBIN_U16("graphics/wonder_card/bg5.gbapal"); +static const u16 sCard6Pal[] = INCBIN_U16("graphics/wonder_card/bg6.gbapal"); +static const u16 sCard7Pal[] = INCBIN_U16("graphics/wonder_card/bg7.gbapal"); +static const u8 sCard0Gfx[] = INCBIN_U8("graphics/wonder_card/bg0.4bpp.lz"); +static const u8 sCard0Map[] = INCBIN_U8("graphics/wonder_card/bg0.bin.lz"); +static const u8 sCard1Gfx[] = INCBIN_U8("graphics/wonder_card/bg1.4bpp.lz"); +static const u8 sCard1Map[] = INCBIN_U8("graphics/wonder_card/bg1.bin.lz"); +static const u8 sCard2Gfx[] = INCBIN_U8("graphics/wonder_card/bg2.4bpp.lz"); +static const u8 sCard2Map[] = INCBIN_U8("graphics/wonder_card/bg2.bin.lz"); +static const u8 sCard6Gfx[] = INCBIN_U8("graphics/wonder_card/bg6.4bpp.lz"); +static const u8 sCard6Map[] = INCBIN_U8("graphics/wonder_card/bg6.bin.lz"); +static const u8 sCard7Gfx[] = INCBIN_U8("graphics/wonder_card/bg7.4bpp.lz"); +static const u8 sCard7Map[] = INCBIN_U8("graphics/wonder_card/bg7.bin.lz"); +static const u16 sStampShadowPal0[] = INCBIN_U16("graphics/wonder_card/stamp_shadow_0.gbapal"); +static const u16 sStampShadowPal1[] = INCBIN_U16("graphics/wonder_card/stamp_shadow_1.gbapal"); +static const u16 sStampShadowPal2[] = INCBIN_U16("graphics/wonder_card/stamp_shadow_2.gbapal"); +static const u16 sStampShadowPal3[] = INCBIN_U16("graphics/wonder_card/stamp_shadow_3.gbapal"); +static const u16 sStampShadowPal4[] = INCBIN_U16("graphics/wonder_card/stamp_shadow_4.gbapal"); +static const u16 sStampShadowPal5[] = INCBIN_U16("graphics/wonder_card/stamp_shadow_5.gbapal"); +static const u16 sStampShadowPal6[] = INCBIN_U16("graphics/wonder_card/stamp_shadow_6.gbapal"); +static const u16 sStampShadowPal7[] = INCBIN_U16("graphics/wonder_card/stamp_shadow_7.gbapal"); +static const u32 sStampShadowGfx[] = INCBIN_U32("graphics/wonder_card/stamp_shadow.4bpp.lz"); + +static const struct CompressedSpriteSheet sSpriteSheet_StampShadow = { + sStampShadowGfx, 0x100, TAG_STAMP_SHADOW +}; + +static const struct SpritePalette sSpritePalettes_StampShadow[] = { + {sStampShadowPal0, TAG_STAMP_SHADOW}, + {sStampShadowPal1, TAG_STAMP_SHADOW}, + {sStampShadowPal2, TAG_STAMP_SHADOW}, + {sStampShadowPal3, TAG_STAMP_SHADOW}, + {sStampShadowPal4, TAG_STAMP_SHADOW}, + {sStampShadowPal5, TAG_STAMP_SHADOW}, + {sStampShadowPal6, TAG_STAMP_SHADOW}, + {sStampShadowPal7, TAG_STAMP_SHADOW} +}; + +static const struct SpriteTemplate sSpriteTemplate_StampShadow = { + .tileTag = TAG_STAMP_SHADOW, + .paletteTag = TAG_STAMP_SHADOW, + .oam = &gOamData_AffineOff_ObjNormal_32x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy +}; + +static const struct WonderGraphics sCardGraphics[NUM_WONDER_BGS] = { + {.titleTextPal = 1, .bodyTextPal = 0, .footerTextPal = 0, .stampShadowPal = 0, .tiles = sCard0Gfx, .map = sCard0Map, .pal = sCard0Pal}, + {.titleTextPal = 1, .bodyTextPal = 0, .footerTextPal = 0, .stampShadowPal = 1, .tiles = sCard1Gfx, .map = sCard1Map, .pal = gCard1Pal}, + {.titleTextPal = 1, .bodyTextPal = 0, .footerTextPal = 0, .stampShadowPal = 2, .tiles = sCard2Gfx, .map = sCard2Map, .pal = gCard2Pal}, + {.titleTextPal = 1, .bodyTextPal = 0, .footerTextPal = 0, .stampShadowPal = 3, .tiles = sCard2Gfx, .map = sCard2Map, .pal = gCard3Pal}, + {.titleTextPal = 1, .bodyTextPal = 0, .footerTextPal = 0, .stampShadowPal = 4, .tiles = sCard2Gfx, .map = sCard2Map, .pal = gCard4Pal}, + {.titleTextPal = 1, .bodyTextPal = 0, .footerTextPal = 0, .stampShadowPal = 5, .tiles = sCard2Gfx, .map = sCard2Map, .pal = gCard5Pal}, + {.titleTextPal = 1, .bodyTextPal = 0, .footerTextPal = 0, .stampShadowPal = 6, .tiles = sCard6Gfx, .map = sCard6Map, .pal = sCard6Pal}, + {.titleTextPal = 1, .bodyTextPal = 0, .footerTextPal = 0, .stampShadowPal = 7, .tiles = sCard7Gfx, .map = sCard7Map, .pal = sCard7Pal} +}; + +bool32 WonderCard_Init(struct WonderCard * card, struct WonderCardMetadata * metadata) +{ + if (card == NULL || metadata == NULL) + return FALSE; + sWonderCardData = AllocZeroed(sizeof(*sWonderCardData)); + if (sWonderCardData == NULL) + return FALSE; + sWonderCardData->card = *card; + sWonderCardData->cardMetadata = *metadata; + if (sWonderCardData->card.bgType >= NUM_WONDER_BGS) + sWonderCardData->card.bgType = 0; + if (sWonderCardData->card.type >= CARD_TYPE_COUNT) + sWonderCardData->card.type = 0; + if (sWonderCardData->card.maxStamps > MAX_STAMP_CARD_STAMPS) + sWonderCardData->card.maxStamps = 0; + sWonderCardData->gfx = &sCardGraphics[sWonderCardData->card.bgType]; + return TRUE; +} + +void WonderCard_Destroy(void) +{ + if (sWonderCardData != NULL) + { + *sWonderCardData = (struct WonderCardData){}; + FREE_AND_SET_NULL(sWonderCardData); + } +} + +s32 WonderCard_Enter(void) +{ + if (sWonderCardData == NULL) + return -1; + switch(sWonderCardData->enterExitState) + { + case 0: + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); + break; + case 1: + if (UpdatePaletteFade()) + return 0; + break; + case 2: + FillBgTilemapBufferRect_Palette0(0, 0x000, 0, 0, 30, 20); + FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 30, 20); + FillBgTilemapBufferRect_Palette0(2, 0x000, 0, 0, 30, 20); + CopyBgTilemapBufferToVram(0); + CopyBgTilemapBufferToVram(1); + CopyBgTilemapBufferToVram(2); + DecompressAndCopyTileDataToVram(2, sWonderCardData->gfx->tiles, 0, 0x008, 0); + sWonderCardData->windowIds[WIN_HEADER] = AddWindow(&sWindowTemplates[WIN_HEADER]); + sWonderCardData->windowIds[WIN_BODY] = AddWindow(&sWindowTemplates[WIN_BODY]); + sWonderCardData->windowIds[WIN_FOOTER] = AddWindow(&sWindowTemplates[WIN_FOOTER]); + break; + case 3: + if (FreeTempTileDataBuffersIfPossible()) + return 0; + gPaletteFade.bufferTransferDisabled = TRUE; + LoadPalette(sWonderCardData->gfx->pal, 0x10, 0x20); + LZ77UnCompWram(sWonderCardData->gfx->map, sWonderCardData->bgTilemapBuffer); + CopyRectToBgTilemapBufferRect(2, sWonderCardData->bgTilemapBuffer, 0, 0, 30, 20, 0, 0, 30, 20, 1, 0x008, 0); + CopyBgTilemapBufferToVram(2); + break; + case 4: + BufferCardText(); + break; + case 5: + DrawCardWindow(WIN_HEADER); + DrawCardWindow(WIN_BODY); + DrawCardWindow(WIN_FOOTER); + CopyBgTilemapBufferToVram(1); + break; + case 6: + LoadMonIconPalettes(); + break; + case 7: + ShowBg(1); + ShowBg(2); + gPaletteFade.bufferTransferDisabled = FALSE; + CreateCardSprites(); + BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); + UpdatePaletteFade(); + break; + default: + if (UpdatePaletteFade()) + return 0; + sWonderCardData->enterExitState = 0; + return 1; + } + sWonderCardData->enterExitState++; + return 0; +} + +s32 WonderCard_Exit(bool32 useCancel) +{ + if (sWonderCardData == NULL) + return -1; + switch (sWonderCardData->enterExitState) + { + case 0: + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); + break; + case 1: + if (UpdatePaletteFade()) + return 0; + break; + case 2: + FillBgTilemapBufferRect_Palette0(0, 0x000, 0, 0, 30, 20); + FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 30, 20); + FillBgTilemapBufferRect_Palette0(2, 0x000, 0, 0, 30, 20); + CopyBgTilemapBufferToVram(0); + CopyBgTilemapBufferToVram(1); + CopyBgTilemapBufferToVram(2); + break; + case 3: + HideBg(1); + HideBg(2); + RemoveWindow(sWonderCardData->windowIds[WIN_FOOTER]); + RemoveWindow(sWonderCardData->windowIds[WIN_BODY]); + RemoveWindow(sWonderCardData->windowIds[WIN_HEADER]); + break; + case 4: + DestroyCardSprites(); + FreeMonIconPalettes(); + break; + case 5: + PrintMysteryGiftOrEReaderTopMenu(gGiftIsFromEReader, useCancel); + break; + case 6: + CopyBgTilemapBufferToVram(0); + BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); + break; + default: + if (UpdatePaletteFade()) + return 0; + sWonderCardData->enterExitState = 0; + return 1; + } + sWonderCardData->enterExitState++; + return 0; +} + +static void BufferCardText(void) +{ + u16 i = 0; + u16 charsUntilStat; + u16 stats[3] = {0, 0, 0}; + + // Copy title/subtitle text + memcpy(sWonderCardData->titleText, sWonderCardData->card.titleText, WONDER_CARD_TEXT_LENGTH); + sWonderCardData->titleText[WONDER_CARD_TEXT_LENGTH] = EOS; + memcpy(sWonderCardData->subtitleText, sWonderCardData->card.subtitleText, WONDER_CARD_TEXT_LENGTH); + sWonderCardData->subtitleText[WONDER_CARD_TEXT_LENGTH] = EOS; + + // Copy card id number + if (sWonderCardData->card.idNumber > 999999) + sWonderCardData->card.idNumber = 999999; + ConvertIntToDecimalStringN(sWonderCardData->idNumberText, sWonderCardData->card.idNumber, STR_CONV_MODE_LEFT_ALIGN, 6); + + // Copy body text + for (i = 0; i < WONDER_CARD_BODY_TEXT_LINES; i++) + { + memcpy(sWonderCardData->bodyText[i], sWonderCardData->card.bodyText[i], WONDER_CARD_TEXT_LENGTH); + sWonderCardData->bodyText[i][WONDER_CARD_TEXT_LENGTH] = EOS; + } + + // Copy footer line 1 + memcpy(sWonderCardData->footerLine1Text, sWonderCardData->card.footerLine1Text, WONDER_CARD_TEXT_LENGTH); + sWonderCardData->footerLine1Text[WONDER_CARD_TEXT_LENGTH] = EOS; + + // Copy footer line 2 + switch (sWonderCardData->card.type) + { + case CARD_TYPE_GIFT: + memcpy(sWonderCardData->footerLine2Text, sWonderCardData->card.footerLine2Text, WONDER_CARD_TEXT_LENGTH); + sWonderCardData->footerLine2Text[WONDER_CARD_TEXT_LENGTH] = EOS; + break; + case CARD_TYPE_STAMP: + sWonderCardData->footerLine2Text[0] = EOS; + break; + case CARD_TYPE_LINK_STAT: + sWonderCardData->footerLine2Text[0] = EOS; + + // Load stats + stats[0] = sWonderCardData->cardMetadata.battlesWon < MAX_WONDER_CARD_STAT ? sWonderCardData->cardMetadata.battlesWon : MAX_WONDER_CARD_STAT; + stats[1] = sWonderCardData->cardMetadata.battlesLost < MAX_WONDER_CARD_STAT ? sWonderCardData->cardMetadata.battlesLost : MAX_WONDER_CARD_STAT; + stats[2] = sWonderCardData->cardMetadata.numTrades < MAX_WONDER_CARD_STAT ? sWonderCardData->cardMetadata.numTrades : MAX_WONDER_CARD_STAT; + + // Init stat text arrays + for (i = 0; i < ARRAY_COUNT(sWonderCardData->statTextData); i++) + { + memset(sWonderCardData->statTextData[i].statNumberText, EOS, sizeof(sWonderCardData->statTextData[i].statNumberText)); + memset(sWonderCardData->statTextData[i].statText, EOS, sizeof(sWonderCardData->statTextData[i].statText)); + } + + // Copy stat texts + for (i = 0, charsUntilStat = 0; i < WONDER_CARD_TEXT_LENGTH; i++) + { + if (sWonderCardData->card.footerLine2Text[i] != CHAR_DYNAMIC_PLACEHOLDER) + { + // Regular text, just copy as is + sWonderCardData->statTextData[sWonderCardData->recordIdx].statText[charsUntilStat] = sWonderCardData->card.footerLine2Text[i]; + charsUntilStat++; + } + else + { + // Dynamic char encountered + // These are used to give the id of which stat to print + u8 id = sWonderCardData->card.footerLine2Text[i + 1]; + if (id >= ARRAY_COUNT(stats)) + { + // Invalid stat id, skip ahead + i += 2; + } + else + { + // Copy stat number + ConvertIntToDecimalStringN(sWonderCardData->statTextData[sWonderCardData->recordIdx].statNumberText, stats[id], STR_CONV_MODE_LEADING_ZEROS, 3); + sWonderCardData->statTextData[sWonderCardData->recordIdx].width = sWonderCardData->card.footerLine2Text[i + 2]; + sWonderCardData->recordIdx++; + if (sWonderCardData->recordIdx >= ARRAY_COUNT(sWonderCardData->statTextData)) + break; + charsUntilStat = 0; + i += 2; + } + } + } + } +} + +static void DrawCardWindow(u8 whichWindow) +{ + s8 i = 0; + s32 windowId = sWonderCardData->windowIds[whichWindow]; + PutWindowTilemap(windowId); + FillWindowPixelBuffer(windowId, 0); + switch (whichWindow) + { + case WIN_HEADER: + { + // Print card title/subtitle + s32 x; + AddTextPrinterParameterized3(windowId, FONT_3, 0, 1, sTextColorTable[sWonderCardData->gfx->titleTextPal], 0, sWonderCardData->titleText); + x = 160 - GetStringWidth(FONT_3, sWonderCardData->subtitleText, GetFontAttribute(FONT_3, FONTATTR_LETTER_SPACING)); + if (x < 0) + x = 0; + AddTextPrinterParameterized3(windowId, FONT_3, x, 17, sTextColorTable[sWonderCardData->gfx->titleTextPal], 0, sWonderCardData->subtitleText); + + // Print id number + if (sWonderCardData->card.idNumber != 0) + AddTextPrinterParameterized3(windowId, FONT_2, 166, 17, sTextColorTable[sWonderCardData->gfx->titleTextPal], 0, sWonderCardData->idNumberText); + break; + } + case WIN_BODY: + // Print body text + for (; i < WONDER_CARD_BODY_TEXT_LINES; i++) + AddTextPrinterParameterized3(windowId, FONT_3, 0, 16 * i + 2, sTextColorTable[sWonderCardData->gfx->bodyTextPal], 0, sWonderCardData->bodyText[i]); + break; + case WIN_FOOTER: + // Print footer line 1 + AddTextPrinterParameterized3(windowId, FONT_3, 0, + sFooterTextOffsets[sWonderCardData->card.type], + sTextColorTable[sWonderCardData->gfx->footerTextPal], + 0, sWonderCardData->footerLine1Text); + + // Print footer line 2 + if (sWonderCardData->card.type != CARD_TYPE_LINK_STAT) + { + // Print gift text + // Odd that CARD_TYPE_STAMP is not ignored, it has empty text for this + AddTextPrinterParameterized3(windowId, FONT_3, 0, + 16 + sFooterTextOffsets[sWonderCardData->card.type], + sTextColorTable[sWonderCardData->gfx->footerTextPal], + 0, sWonderCardData->footerLine2Text); + } + else + { + s32 x = 0; + s32 y = sFooterTextOffsets[sWonderCardData->card.type] + 16; + s32 spacing = GetFontAttribute(FONT_3, FONTATTR_LETTER_SPACING); + for (; i < sWonderCardData->recordIdx; i++) + { + // Print stat text + AddTextPrinterParameterized3(windowId, FONT_3, x, y, sTextColorTable[sWonderCardData->gfx->footerTextPal], 0, sWonderCardData->statTextData[i].statText); + if (sWonderCardData->statTextData[i].statNumberText[0] != EOS) + { + // Print stat number + x += GetStringWidth(FONT_3, sWonderCardData->statTextData[i].statText, spacing); + AddTextPrinterParameterized3(windowId, FONT_2, x, y, + sTextColorTable[sWonderCardData->gfx->footerTextPal], + 0, sWonderCardData->statTextData[i].statNumberText); + x += GetStringWidth(FONT_3, sWonderCardData->statTextData[i].statNumberText, spacing) + sWonderCardData->statTextData[i].width; + } + } + } + break; + } + CopyWindowToVram(windowId, COPYWIN_FULL); +} + +static void CreateCardSprites(void) +{ + u8 i = 0; + sWonderCardData->monIconSpriteId = SPRITE_NONE; + + // Create icon sprite + if (sWonderCardData->cardMetadata.iconSpecies != SPECIES_NONE) + { + sWonderCardData->monIconSpriteId = CreateMonIcon_HandleDeoxys(MailSpeciesToIconSpecies(sWonderCardData->cardMetadata.iconSpecies), SpriteCallbackDummy, 220, 20, 0, FALSE); + gSprites[sWonderCardData->monIconSpriteId].oam.priority = 2; + } + + // Create stamp sprites + if (sWonderCardData->card.maxStamps != 0 && sWonderCardData->card.type == CARD_TYPE_STAMP) + { + LoadCompressedSpriteSheetUsingHeap(&sSpriteSheet_StampShadow); + LoadSpritePalette(&sSpritePalettes_StampShadow[sWonderCardData->gfx->stampShadowPal]); + for (; i < sWonderCardData->card.maxStamps; i++) + { + sWonderCardData->stampSpriteIds[i][0] = SPRITE_NONE; + sWonderCardData->stampSpriteIds[i][1] = SPRITE_NONE; + sWonderCardData->stampSpriteIds[i][0] = CreateSprite(&sSpriteTemplate_StampShadow, 216 - 32 * i, 0x90, 8); + if (sWonderCardData->cardMetadata.stampData[0][i] != 0) + { + sWonderCardData->stampSpriteIds[i][1] = CreateMonIcon_HandleDeoxys(MailSpeciesToIconSpecies(sWonderCardData->cardMetadata.stampData[0][i]), SpriteCallbackDummy, 216 - 32 * i, 136, 0, 0); + gSprites[sWonderCardData->stampSpriteIds[i][1]].oam.priority = 2; + } + } + } +} + +static void DestroyCardSprites(void) +{ + u8 i = 0; + + // Destroy icon sprite + if (sWonderCardData->monIconSpriteId != SPRITE_NONE) + DestroyMonIcon(&gSprites[sWonderCardData->monIconSpriteId]); + + // Destroy stamp sprites + if (sWonderCardData->card.maxStamps != 0 && sWonderCardData->card.type == CARD_TYPE_STAMP) + { + for (; i < sWonderCardData->card.maxStamps; i++) + { + if (sWonderCardData->stampSpriteIds[i][0] != SPRITE_NONE) + { + DestroySprite(&gSprites[sWonderCardData->stampSpriteIds[i][0]]); + #ifdef BUGFIX + if (sWonderCardData->stampSpriteIds[i][1] != SPRITE_NONE) + #else + if (sWonderCardData->stampSpriteIds[i][0] != SPRITE_NONE) + #endif + DestroyMonIcon(&gSprites[sWonderCardData->stampSpriteIds[i][1]]); + } + } + FreeSpriteTilesByTag(TAG_STAMP_SHADOW); + FreeSpritePaletteByTag(TAG_STAMP_SHADOW); + } +} diff --git a/src/mystery_gift_show_news.c b/src/mystery_gift_show_news.c new file mode 100644 index 000000000..b97e74c8c --- /dev/null +++ b/src/mystery_gift_show_news.c @@ -0,0 +1,404 @@ +#include "global.h" +#include "gflib.h" +#include "menu_indicators.h" +#include "new_menu_helpers.h" +#include "mevent.h" +#include "mystery_gift_menu.h" +#include "menu.h" +#include "link_rfu.h" +#include "list_menu.h" +#include "constants/mystery_gift.h" + +enum { + WIN_TITLE, + WIN_BODY, + WIN_COUNT +}; + +#define TAG_ARROWS 0x1000 + +struct WonderNewsData +{ + struct WonderNews news; + const struct WonderGraphics * gfx; + bool8 verticalScrollDisabled:1; + u8 enterExitState:7; + u8 arrowTaskId; + bool8 scrolling:1; + u8 scrollIncrement:7; + bool8 scrollingDown:1; + u8 scrollTotal:7; + u16 scrollEnd; + u16 scrollOffset; + u16 windowIds[WIN_COUNT]; + u8 unused[2]; + u8 titleText[WONDER_NEWS_TEXT_LENGTH + 1]; + u8 bodyText[WONDER_NEWS_BODY_TEXT_LINES][WONDER_NEWS_TEXT_LENGTH + 1]; + struct ScrollArrowsTemplate arrowsTemplate; + u8 bgTilemapBuffer[0x1000]; +}; + +static EWRAM_DATA struct WonderNewsData * sWonderNewsData = NULL; + +static void BufferNewsText(void); +static void DrawNewsWindows(void); +static void UpdateNewsScroll(void); + +static const u8 sTextColorTable[][3] = { + {0, 2, 3}, + {0, 1, 2} +}; +static const struct WindowTemplate sWindowTemplates[] = { + [WIN_TITLE] = { + .bg = 0, + .tilemapLeft = 1, + .tilemapTop = 0, + .width = 28, + .height = 3, + .paletteNum = 15, + .baseBlock = 0x000 + }, + [WIN_BODY] = { + .bg = 2, + .tilemapLeft = 1, + .tilemapTop = 3, + .width = 28, + .height = 20, + .paletteNum = 15, + .baseBlock = 0x000 + } +}; +static const struct ScrollArrowsTemplate sArrowsTemplate = { + .firstArrowType = SCROLL_ARROW_UP, + .firstX = 232, + .firstY = 24, + .secondArrowType = SCROLL_ARROW_DOWN, + .secondX = 232, + .secondY = 152, + .fullyUpThreshold = 0, + .fullyDownThreshold = 2, + .tileTag = TAG_ARROWS, + .palTag = TAG_ARROWS, + .palNum = 0 +}; + +static const u16 sNews0Pal[] = INCBIN_U16("graphics/wonder_news/bg0.gbapal"); +static const u16 sNews6Pal[] = INCBIN_U16("graphics/wonder_news/bg6.gbapal"); +static const u16 sNews7Pal[] = INCBIN_U16("graphics/wonder_news/bg7.gbapal"); +static const u8 sNews0Gfx[] = INCBIN_U8("graphics/wonder_news/bg0.4bpp.lz"); +static const u8 sNews0Map[] = INCBIN_U8("graphics/wonder_news/bg0.bin.lz"); +static const u8 sNews1Gfx[] = INCBIN_U8("graphics/wonder_news/bg1.4bpp.lz"); +static const u8 sNews1Map[] = INCBIN_U8("graphics/wonder_news/bg1.bin.lz"); +static const u8 sNews2Gfx[] = INCBIN_U8("graphics/wonder_news/bg2.4bpp.lz"); +static const u8 sNews2Map[] = INCBIN_U8("graphics/wonder_news/bg2.bin.lz"); +static const u8 sNews6Gfx[] = INCBIN_U8("graphics/wonder_news/bg6.4bpp.lz"); +static const u8 sNews6Map[] = INCBIN_U8("graphics/wonder_news/bg6.bin.lz"); +static const u8 sNews7Gfx[] = INCBIN_U8("graphics/wonder_news/bg7.4bpp.lz"); +static const u8 sNews7Map[] = INCBIN_U8("graphics/wonder_news/bg7.bin.lz"); + +static const struct WonderGraphics sNewsGraphics[NUM_WONDER_BGS] = { + {.titleTextPal = 1, .bodyTextPal = 0, .tiles = sNews0Gfx, .map = sNews0Map, .pal = sNews0Pal}, + {.titleTextPal = 1, .bodyTextPal = 0, .tiles = sNews1Gfx, .map = sNews1Map, .pal = gCard1Pal}, + {.titleTextPal = 1, .bodyTextPal = 0, .tiles = sNews2Gfx, .map = sNews2Map, .pal = gCard2Pal}, + {.titleTextPal = 1, .bodyTextPal = 0, .tiles = sNews2Gfx, .map = sNews2Map, .pal = gCard3Pal}, + {.titleTextPal = 1, .bodyTextPal = 0, .tiles = sNews2Gfx, .map = sNews2Map, .pal = gCard4Pal}, + {.titleTextPal = 1, .bodyTextPal = 0, .tiles = sNews2Gfx, .map = sNews2Map, .pal = gCard5Pal}, + {.titleTextPal = 1, .bodyTextPal = 0, .tiles = sNews6Gfx, .map = sNews6Map, .pal = sNews6Pal}, + {.titleTextPal = 1, .bodyTextPal = 0, .tiles = sNews7Gfx, .map = sNews7Map, .pal = sNews7Pal} +}; + +bool32 WonderNews_Init(const struct WonderNews * news) +{ + if (news == NULL) + return FALSE; + sWonderNewsData = AllocZeroed(sizeof(*sWonderNewsData)); + if (sWonderNewsData == NULL) + return FALSE; + sWonderNewsData->news = *news; + if (sWonderNewsData->news.bgType >= NUM_WONDER_BGS) + sWonderNewsData->news.bgType = 0; + sWonderNewsData->gfx = &sNewsGraphics[sWonderNewsData->news.bgType]; + sWonderNewsData->arrowTaskId = TASK_NONE; + return TRUE; +} + +void WonderNews_Destroy(void) +{ + if (sWonderNewsData != NULL) + { + *sWonderNewsData = (struct WonderNewsData){}; + FREE_AND_SET_NULL(sWonderNewsData); + } +} + +s32 WonderNews_Enter(void) +{ + if (sWonderNewsData == NULL) + return -1; + + switch (sWonderNewsData->enterExitState) + { + case 0: + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); + break; + case 1: + if (UpdatePaletteFade()) + return 0; + ChangeBgY(0, 0, BG_COORD_SET); + ChangeBgY(1, 0, BG_COORD_SET); + ChangeBgY(2, 0, BG_COORD_SET); + ChangeBgY(3, 0, BG_COORD_SET); + SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, DISPLAY_WIDTH)); + SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(26, 152)); + SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ); + SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ); + SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); + break; + case 2: + FillBgTilemapBufferRect_Palette0(0, 0x000, 0, 0, 30, 20); + FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 30, 20); + FillBgTilemapBufferRect_Palette0(2, 0x000, 0, 0, 30, 20); + FillBgTilemapBufferRect_Palette0(3, 0x000, 0, 0, 30, 20); + CopyBgTilemapBufferToVram(0); + CopyBgTilemapBufferToVram(1); + CopyBgTilemapBufferToVram(2); + CopyBgTilemapBufferToVram(3); + DecompressAndCopyTileDataToVram(3, sWonderNewsData->gfx->tiles, 0, 8, 0); + sWonderNewsData->windowIds[WIN_TITLE] = AddWindow(&sWindowTemplates[WIN_TITLE]); + sWonderNewsData->windowIds[WIN_BODY] = AddWindow(&sWindowTemplates[WIN_BODY]); + break; + case 3: + if (FreeTempTileDataBuffersIfPossible()) + return 0; + gPaletteFade.bufferTransferDisabled = TRUE; + LoadPalette(sWonderNewsData->gfx->pal, 0x10, 0x20); + LZ77UnCompWram(sWonderNewsData->gfx->map, sWonderNewsData->bgTilemapBuffer); + CopyRectToBgTilemapBufferRect(1, sWonderNewsData->bgTilemapBuffer, 0, 0, 30, 3, 0, 0, 30, 3, 1, 8, 0); + CopyRectToBgTilemapBufferRect(3, sWonderNewsData->bgTilemapBuffer, 0, 3, 30, 23, 0, 3, 30, 23, 1, 8, 0); + CopyBgTilemapBufferToVram(1); + CopyBgTilemapBufferToVram(3); + break; + case 4: + BufferNewsText(); + break; + case 5: + DrawNewsWindows(); + CopyBgTilemapBufferToVram(0); + CopyBgTilemapBufferToVram(2); + break; + case 6: + ShowBg(1); + ShowBg(2); + ShowBg(3); + gPaletteFade.bufferTransferDisabled = FALSE; + sWonderNewsData->arrowTaskId = AddScrollIndicatorArrowPair(&sWonderNewsData->arrowsTemplate, &sWonderNewsData->scrollOffset); + BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); + UpdatePaletteFade(); + break; + default: + if (UpdatePaletteFade()) + return 0; + sWonderNewsData->enterExitState = 0; + return 1; + } + + sWonderNewsData->enterExitState++; + return 0; +} + +s32 WonderNews_Exit(bool32 useCancel) +{ + if (sWonderNewsData == NULL) + return -1; + switch (sWonderNewsData->enterExitState) + { + case 0: + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); + break; + case 1: + if (UpdatePaletteFade()) + return 0; + ChangeBgY(2, 0, BG_COORD_SET); + SetGpuReg(REG_OFFSET_WIN0H, 0); + SetGpuReg(REG_OFFSET_WIN0V, 0); + SetGpuReg(REG_OFFSET_WININ, 0); + SetGpuReg(REG_OFFSET_WINOUT, 0); + ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); + break; + case 2: + FillBgTilemapBufferRect_Palette0(0, 0x000, 0, 0, 30, 20); + FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 30, 20); + FillBgTilemapBufferRect_Palette0(2, 0x000, 0, 0, 30, 24); + FillBgTilemapBufferRect_Palette0(3, 0x000, 0, 0, 30, 24); + CopyBgTilemapBufferToVram(0); + CopyBgTilemapBufferToVram(1); + CopyBgTilemapBufferToVram(2); + CopyBgTilemapBufferToVram(3); + break; + case 3: + HideBg(1); + HideBg(2); + RemoveWindow(sWonderNewsData->windowIds[WIN_BODY]); + RemoveWindow(sWonderNewsData->windowIds[WIN_TITLE]); + break; + case 4: + ChangeBgY(2, 0, BG_COORD_SET); + ChangeBgY(3, 0, BG_COORD_SET); + if (sWonderNewsData->arrowTaskId != TASK_NONE) + { + RemoveScrollIndicatorArrowPair(sWonderNewsData->arrowTaskId); + sWonderNewsData->arrowTaskId = TASK_NONE; + } + break; + case 5: + PrintMysteryGiftOrEReaderTopMenu(gGiftIsFromEReader, useCancel); + break; + case 6: + MG_DrawCheckerboardPattern(); + CopyBgTilemapBufferToVram(0); + CopyBgTilemapBufferToVram(3); + BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); + break; + default: + if (UpdatePaletteFade()) + return 0; + sWonderNewsData->enterExitState = 0; + return 1; + } + ++sWonderNewsData->enterExitState; + return 0; +} + +void WonderNews_RemoveScrollIndicatorArrowPair(void) +{ + if (!sWonderNewsData->verticalScrollDisabled && sWonderNewsData->arrowTaskId != TASK_NONE) + { + RemoveScrollIndicatorArrowPair(sWonderNewsData->arrowTaskId); + sWonderNewsData->arrowTaskId = TASK_NONE; + sWonderNewsData->verticalScrollDisabled = TRUE; + } +} + + +void WonderNews_AddScrollIndicatorArrowPair(void) +{ + if (sWonderNewsData->verticalScrollDisabled) + { + sWonderNewsData->arrowTaskId = AddScrollIndicatorArrowPair(&sWonderNewsData->arrowsTemplate, &sWonderNewsData->scrollOffset); + sWonderNewsData->verticalScrollDisabled = FALSE; + } +} + +u32 WonderNews_GetInput(u16 input) +{ + if (sWonderNewsData->scrolling) + { + UpdateNewsScroll(); + return NEWS_INPUT_NONE; + } + switch (input) + { + case A_BUTTON: + return NEWS_INPUT_A; + case B_BUTTON: + return NEWS_INPUT_B; + case DPAD_UP: + if (sWonderNewsData->scrollOffset == 0) + return NEWS_INPUT_NONE; + if (sWonderNewsData->verticalScrollDisabled) + return NEWS_INPUT_NONE; + sWonderNewsData->scrollingDown = FALSE; + break; + case DPAD_DOWN: + if (sWonderNewsData->scrollOffset == sWonderNewsData->scrollEnd) + return NEWS_INPUT_NONE; + if (sWonderNewsData->verticalScrollDisabled) + return NEWS_INPUT_NONE; + sWonderNewsData->scrollingDown = TRUE; + break; + default: + return NEWS_INPUT_NONE; + } + + // Init scroll + sWonderNewsData->scrolling = TRUE; + sWonderNewsData->scrollIncrement = 2; + sWonderNewsData->scrollTotal = 0; + if (!sWonderNewsData->scrollingDown) + return NEWS_INPUT_SCROLL_UP; + else + return NEWS_INPUT_SCROLL_DOWN; +} + +static void BufferNewsText(void) +{ + u8 i = 0; + + // Copy title text + memcpy(sWonderNewsData->titleText, sWonderNewsData->news.titleText, WONDER_NEWS_TEXT_LENGTH); + sWonderNewsData->titleText[WONDER_NEWS_TEXT_LENGTH] = EOS; + + // Copy body text + for (; i < WONDER_NEWS_BODY_TEXT_LINES; i++) + { + memcpy(sWonderNewsData->bodyText[i], sWonderNewsData->news.bodyText[i], WONDER_NEWS_TEXT_LENGTH); + sWonderNewsData->bodyText[i][WONDER_NEWS_TEXT_LENGTH] = EOS; + if (i > 7 && sWonderNewsData->bodyText[i][0] != EOS) + sWonderNewsData->scrollEnd++; + } + sWonderNewsData->arrowsTemplate = sArrowsTemplate; + sWonderNewsData->arrowsTemplate.fullyDownThreshold = sWonderNewsData->scrollEnd; +} + +static void DrawNewsWindows(void) +{ + u8 i = 0; + s32 x; + PutWindowTilemap(sWonderNewsData->windowIds[WIN_TITLE]); + PutWindowTilemap(sWonderNewsData->windowIds[WIN_BODY]); + FillWindowPixelBuffer(sWonderNewsData->windowIds[WIN_TITLE], 0); + FillWindowPixelBuffer(sWonderNewsData->windowIds[WIN_BODY], 0); + + // Print title text + x = (224 - GetStringWidth(FONT_3, sWonderNewsData->titleText, GetFontAttribute(FONT_3, FONTATTR_LETTER_SPACING))) / 2; + if (x < 0) + x = 0; + AddTextPrinterParameterized3(sWonderNewsData->windowIds[WIN_TITLE], FONT_3, x, 6, sTextColorTable[sWonderNewsData->gfx->titleTextPal], 0, sWonderNewsData->titleText); + + // Print body text + for (; i < WONDER_NEWS_BODY_TEXT_LINES; ++i) + { + AddTextPrinterParameterized3(sWonderNewsData->windowIds[WIN_BODY], FONT_3, 0, + 16 * i + 2, + sTextColorTable[sWonderNewsData->gfx->bodyTextPal], + 0, sWonderNewsData->bodyText[i]); + } + CopyWindowToVram(sWonderNewsData->windowIds[WIN_TITLE], COPYWIN_FULL); + CopyWindowToVram(sWonderNewsData->windowIds[WIN_BODY], COPYWIN_FULL); +} + +static void UpdateNewsScroll(void) +{ + u16 bgMove = sWonderNewsData->scrollIncrement; + bgMove *= 256; + if (sWonderNewsData->scrollingDown) + { + ChangeBgY(2, bgMove, BG_COORD_ADD); + ChangeBgY(3, bgMove, BG_COORD_ADD); + } + else + { + ChangeBgY(2, bgMove, BG_COORD_SUB); + ChangeBgY(3, bgMove, BG_COORD_SUB); + } + sWonderNewsData->scrollTotal += sWonderNewsData->scrollIncrement; + if (sWonderNewsData->scrollTotal > 15) + { + if (sWonderNewsData->scrollingDown) + sWonderNewsData->scrollOffset++; + else + sWonderNewsData->scrollOffset--; + sWonderNewsData->scrolling = FALSE; + sWonderNewsData->scrollTotal = 0; + } +} diff --git a/sym_ewram.txt b/sym_ewram.txt index ef48abffa..0dc0544c1 100644 --- a/sym_ewram.txt +++ b/sym_ewram.txt @@ -125,8 +125,8 @@ .include "src/mevent_server_helpers.o" .include "src/mevent_client.o" .include "src/mevent_server.o" - .include "src/mevent_show_card.o" - .include "src/mevent_show_news.o" + .include "src/mystery_gift_show_card.o" + .include "src/mystery_gift_show_news.o" .include "src/seagallop.o" .include "src/pokemon_jump.o" .include "src/berry_crush.o"