Merge pull request #572 from GriffinRichards/sync-mgfitview
Sync wonder card / news screens
|
Before Width: | Height: | Size: 330 B |
|
Before Width: | Height: | Size: 314 B |
|
Before Width: | Height: | Size: 288 B |
|
Before Width: | Height: | Size: 558 B |
|
Before Width: | Height: | Size: 551 B |
|
Before Width: | Height: | Size: 116 B |
|
Before Width: | Height: | Size: 169 B |
|
Before Width: | Height: | Size: 103 B |
|
Before Width: | Height: | Size: 146 B |
|
Before Width: | Height: | Size: 173 B |
|
Before Width: | Height: | Size: 173 B |
|
After Width: | Height: | Size: 318 B |
|
After Width: | Height: | Size: 311 B |
|
After Width: | Height: | Size: 279 B |
|
After Width: | Height: | Size: 545 B |
|
After Width: | Height: | Size: 534 B |
|
After Width: | Height: | Size: 167 B |
|
After Width: | Height: | Size: 225 B |
|
After Width: | Height: | Size: 160 B |
|
After Width: | Height: | Size: 204 B |
|
After Width: | Height: | Size: 223 B |
|
After Width: | Height: | Size: 223 B |
@@ -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
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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"
|
||||
|
||||