Merge pull request #572 from GriffinRichards/sync-mgfitview

Sync wonder card / news screens
This commit is contained in:
GriffinR
2022-11-01 16:20:36 -04:00
committed by GitHub
60 changed files with 1010 additions and 842 deletions
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

Binary file not shown.

After

Width:  |  Height:  |  Size: 318 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 311 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 279 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 545 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 534 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 167 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 225 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 160 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 204 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 223 B

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"