Merge pull request #572 from GriffinRichards/sync-mgfitview

Sync wonder card / news screens
This commit is contained in:
GriffinR authored and GitHub committed 2022-11-01 16:20:36 -04:00
commit 2abdb6aa41
60 files changed
+1010 -842

No files matched your search

Binary file not shown.

Before

Width:  |  Height:  |  Size: 330 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 314 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 288 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 558 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 551 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 116 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 169 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 103 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 146 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 173 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 173 B

File renamed without changes.
File renamed without changes.
Binary file not shown.

After

Width:  |  Height:  |  Size: 318 B

File renamed without changes.
File renamed without changes.
Binary file not shown.

After

Width:  |  Height:  |  Size: 311 B

File renamed without changes.
File renamed without changes.
Binary file not shown.

After

Width:  |  Height:  |  Size: 279 B

File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
Binary file not shown.

After

Width:  |  Height:  |  Size: 545 B

File renamed without changes.
File renamed without changes.
Binary file not shown.

After

Width:  |  Height:  |  Size: 534 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 167 B

File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
Binary file not shown.

After

Width:  |  Height:  |  Size: 225 B

File renamed without changes.
Binary file not shown.

After

Width:  |  Height:  |  Size: 160 B

File renamed without changes.
Binary file not shown.

After

Width:  |  Height:  |  Size: 204 B

File renamed without changes.
File renamed without changes.
Binary file not shown.

After

Width:  |  Height:  |  Size: 223 B

File renamed without changes.
File renamed without changes.
Binary file not shown.

After

Width:  |  Height:  |  Size: 223 B

+47
View File
@@ -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
+24 -16
View File
@@ -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);
+4 -4
View File
@@ -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);
-452
View File
@@ -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);
}
}
-357
View File
@@ -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;
}
}
+11 -11
View File
@@ -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;
+518
View File
@@ -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);
}
}
+404
View File
@@ -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;
}
}
+2 -2
View File
@@ -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"