summaryrefslogtreecommitdiff
path: root/src/mevent_show_news.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mevent_show_news.c')
-rw-r--r--src/mevent_show_news.c357
1 files changed, 357 insertions, 0 deletions
diff --git a/src/mevent_show_news.c b/src/mevent_show_news.c
new file mode 100644
index 000000000..44b19b130
--- /dev/null
+++ b/src/mevent_show_news.c
@@ -0,0 +1,357 @@
+#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 MEWonderNewsData 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("data/graphics/mevent/pal_468060.gbapal");
+static const u16 sNews6Pal[] = INCBIN_U16("data/graphics/mevent/pal_468080.gbapal");
+static const u16 sNews7Pal[] = INCBIN_U16("data/graphics/mevent/pal_4680A0.gbapal");
+static const u8 sNews0Gfx[] = INCBIN_U8("data/graphics/mevent/gfx_4680C0.4bpp.lz");
+static const u8 sNews0Map[] = INCBIN_U8("data/graphics/mevent/tilemap_468140.bin.lz");
+static const u8 sNews1Gfx[] = INCBIN_U8("data/graphics/mevent/gfx_46821C.4bpp.lz");
+static const u8 sNews1Map[] = INCBIN_U8("data/graphics/mevent/tilemap_46824C.bin.lz");
+static const u8 sNews2Gfx[] = INCBIN_U8("data/graphics/mevent/gfx_46830C.4bpp.lz");
+static const u8 sNews2Map[] = INCBIN_U8("data/graphics/mevent/tilemap_46837C.bin.lz");
+static const u8 sNews6Gfx[] = INCBIN_U8("data/graphics/mevent/gfx_468448.4bpp.lz");
+static const u8 sNews6Map[] = INCBIN_U8("data/graphics/mevent/tilemap_4684D8.bin.lz");
+static const u8 sNews7Gfx[] = INCBIN_U8("data/graphics/mevent/gfx_4685B4.4bpp.lz");
+static const u8 sNews7Map[] = INCBIN_U8("data/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 MEWonderNewsData * news)
+{
+ if (news == NULL)
+ return FALSE;
+ sWork = AllocZeroed(sizeof(struct UnkStruct_203F3CC));
+ if (sWork == NULL)
+ return FALSE;
+ sWork->wonderNews = *news;
+ if (sWork->wonderNews.unk_03 >= NELEMS(sBgSpecs))
+ sWork->wonderNews.unk_03 = 0;
+ sWork->bgSpec = &sBgSpecs[sWork->wonderNews.unk_03];
+ 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(0xFFFFFFFF, 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(0xFFFFFFFF, 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(0xFFFFFFFF, 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(0xFFFFFFFF, 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.unk_04, 40);
+ sWork->title[40] = EOS;
+ for (; i < 10; ++i)
+ {
+ memcpy(sWork->messages[i], sWork->wonderNews.unk_2C[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(3, sWork->title, GetFontAttribute(3, 2))) / 2;
+ if (x < 0)
+ x = 0;
+ AddTextPrinterParameterized3(sWork->windowIds[0], 3, x, 6, sTextPals[sWork->bgSpec->textPal1], 0, sWork->title);
+ for (; i < 10; ++i)
+ {
+ AddTextPrinterParameterized3(sWork->windowIds[1], 3, 0, 16 * i + 2, sTextPals[sWork->bgSpec->textPal2], 0, sWork->messages[i]);
+ }
+ CopyWindowToVram(sWork->windowIds[0], 3);
+ CopyWindowToVram(sWork->windowIds[1], 3);
+}
+
+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;
+ }
+}