summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPikalaxALT <pikalaxalt@gmail.com>2019-09-24 14:00:40 -0400
committerPikalaxALT <pikalaxalt@gmail.com>2019-09-24 14:00:40 -0400
commit7f0c7528f732c650736b97e623c933ddaed00774 (patch)
treedf200b3d882e46442fe105523b6ef74c393672e0 /src
parent89c98f2ab74e6097fd85b05b64965c10c9941b5b (diff)
Finish credits decomp and data dump
Diffstat (limited to 'src')
-rw-r--r--src/credits.c954
1 files changed, 942 insertions, 12 deletions
diff --git a/src/credits.c b/src/credits.c
index 0329bf7c3..fff0a502b 100644
--- a/src/credits.c
+++ b/src/credits.c
@@ -1,5 +1,6 @@
#include "global.h"
#include "malloc.h"
+#include "bg.h"
#include "palette.h"
#include "gpu_regs.h"
#include "task.h"
@@ -7,9 +8,13 @@
#include "event_data.h"
#include "window.h"
#include "new_menu_helpers.h"
-#include "menu.h"
+#include "decompress.h"
+#include "graphics.h"
#include "strings.h"
-#include "field_weather.h"
+#include "trainer_pokemon_sprites.h"
+#include "sound.h"
+#include "constants/species.h"
+#include "constants/maps.h"
struct CreditsResources
{
@@ -22,7 +27,9 @@ struct CreditsResources
u8 unk_09;
u8 unk_0A;
bool8 unk_0B;
- u8 filler_0C[16];
+ u16 unk_0C;
+ u16 unk_0E;
+ u8 filler_10[12];
u8 unk_1C;
u8 unk_1D;
};
@@ -41,6 +48,24 @@ struct UnkStruct_84145BC
u8 unk_8;
};
+struct CompressedGraphicsHeader
+{
+ const u8 * tiles;
+ const u8 * map;
+ const u16 * palette;
+};
+
+struct CreditsTaskData
+{
+ u8 field_00;
+ u8 field_01;
+ u16 field_02;
+ u16 field_04;
+ u8 field_06;
+ u16 field_08;
+ u16 field_0A;
+};
+
EWRAM_DATA struct CreditsResources * gUnknown_203AB40 = NULL;
void sub_80F39E8(void);
@@ -50,7 +75,246 @@ bool32 sub_80F4674(void);
void sub_80F48D0(void);
void sub_80F4930(u8 a0);
-/*
+const struct BgTemplate gUnknown_840C5A4[] = {
+ {
+ .bg = 0,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 15,
+ .screenSize = 0,
+ .paletteMode = FALSE,
+ .priority = 0,
+ .baseTile = 0x0
+ }, {
+ .bg = 1,
+ .charBaseIndex = 2,
+ .mapBaseIndex = 23,
+ .screenSize = 0,
+ .paletteMode = FALSE,
+ .priority = 1,
+ .baseTile = 0x0
+ }, {
+ .bg = 2,
+ .charBaseIndex = 3,
+ .mapBaseIndex = 31,
+ .screenSize = 1,
+ .paletteMode = TRUE,
+ .priority = 2,
+ .baseTile = 0x0
+ }
+};
+
+const struct WindowTemplate gUnknown_840C5B0[] = {
+ {
+ .bg = 0x00,
+ .tilemapLeft = 0x0b,
+ .tilemapTop = 0x06,
+ .width = 0x08,
+ .height = 0x08,
+ .paletteNum = 0x0a,
+ .baseBlock = 0x0008
+ }, {
+ .bg = 0x00,
+ .tilemapLeft = 0x0a,
+ .tilemapTop = 0x05,
+ .width = 0x0a,
+ .height = 0x0a,
+ .paletteNum = 0x0a,
+ .baseBlock = 0x0048
+ }, {
+ .bg = 0x00,
+ .tilemapLeft = 0x09,
+ .tilemapTop = 0x03,
+ .width = 0x0c,
+ .height = 0x0d,
+ .paletteNum = 0x0a,
+ .baseBlock = 0x00ac
+ }, DUMMY_WIN_TEMPLATE
+};
+
+const struct WindowTemplate gUnknown_840C5D0[] = {
+ {
+ .bg = 0x00,
+ .tilemapLeft = 0x0b,
+ .tilemapTop = 0x06,
+ .width = 0x08,
+ .height = 0x08,
+ .paletteNum = 0x0a,
+ .baseBlock = 0x0008
+ }, {
+ .bg = 0x00,
+ .tilemapLeft = 0x0a,
+ .tilemapTop = 0x05,
+ .width = 0x0a,
+ .height = 0x0a,
+ .paletteNum = 0x0a,
+ .baseBlock = 0x0048
+ }, {
+ .bg = 0x00,
+ .tilemapLeft = 0x09,
+ .tilemapTop = 0x05,
+ .width = 0x0c,
+ .height = 0x0a,
+ .paletteNum = 0x0a,
+ .baseBlock = 0x00ac
+ }, DUMMY_WIN_TEMPLATE
+};
+
+const struct WindowTemplate gUnknown_840C5F0[] = {
+ {
+ .bg = 0x00,
+ .tilemapLeft = 0x0b,
+ .tilemapTop = 0x06,
+ .width = 0x08,
+ .height = 0x08,
+ .paletteNum = 0x0a,
+ .baseBlock = 0x0008
+ }, {
+ .bg = 0x00,
+ .tilemapLeft = 0x0a,
+ .tilemapTop = 0x05,
+ .width = 0x0a,
+ .height = 0x0a,
+ .paletteNum = 0x0a,
+ .baseBlock = 0x0048
+ }, {
+ .bg = 0x00,
+ .tilemapLeft = 0x0a,
+ .tilemapTop = 0x04,
+ .width = 0x0a,
+ .height = 0x0c,
+ .paletteNum = 0x0a,
+ .baseBlock = 0x00ac
+ }, DUMMY_WIN_TEMPLATE
+};
+
+const struct WindowTemplate gUnknown_840C610[] = {
+ {
+ .bg = 0x00,
+ .tilemapLeft = 0x0b,
+ .tilemapTop = 0x06,
+ .width = 0x08,
+ .height = 0x08,
+ .paletteNum = 0x0a,
+ .baseBlock = 0x0008
+ }, {
+ .bg = 0x00,
+ .tilemapLeft = 0x0a,
+ .tilemapTop = 0x05,
+ .width = 0x0a,
+ .height = 0x0a,
+ .paletteNum = 0x0a,
+ .baseBlock = 0x0048
+ }, {
+ .bg = 0x00,
+ .tilemapLeft = 0x09,
+ .tilemapTop = 0x04,
+ .width = 0x0c,
+ .height = 0x0c,
+ .paletteNum = 0x0a,
+ .baseBlock = 0x00ac
+ }, DUMMY_WIN_TEMPLATE
+};
+
+const u16 gUnknown_840C630[] = INCBIN_U16("data/credits/unk_840C630.gbapal");
+const u32 gUnknown_840C650[] = INCBIN_U32("data/credits/unk_840C650.8bpp.lz");
+const u32 gUnknown_840CA54[] = INCBIN_U32("data/credits/unk_840CA54.bin.lz");
+const u32 gUnknown_840CB8C[] = INCBIN_U32("data/credits/unk_840CB8C.bin.lz");
+const u32 gUnknown_840D228[] = INCBIN_U32("data/credits/unk_840D228.bin.lz");
+const u32 gUnknown_840E158[] = INCBIN_U32("data/credits/unk_840E158.bin.lz");
+const u32 gUnknown_840E904[] = INCBIN_U32("data/credits/unk_840E904.bin.lz");
+const u32 gUnknown_840F240[] = INCBIN_U32("data/credits/unk_840F240.bin.lz");
+const u32 gUnknown_840F944[] = INCBIN_U32("data/credits/unk_840F944.bin.lz");
+const u32 gUnknown_8410198[] = INCBIN_U32("data/credits/unk_8410198.bin.lz");
+const u32 gUnknown_84105B4[] = INCBIN_U32("data/credits/unk_84105B4.bin.lz");
+
+const u32 filler_8410AFC = 0xF0;
+
+const u16 gUnknown_8410B00[] = INCBIN_U16("data/credits/unk_8410B20.gbapal");
+const u8 gUnknown_8410B20[] = INCBIN_U8("data/credits/unk_8410B20.4bpp.lz");
+const u8 gUnknown_8410B94[] = INCBIN_U8("data/credits/unk_8410B20.bin.lz");
+
+const struct CompressedGraphicsHeader gUnknown_8410CDC[] = {
+ {
+ .tiles = gUnknown_8EAE548,
+ .map = gUnknown_8EAE900,
+ .palette = gUnknown_8EAE528
+ }, {
+ .tiles = gUnknown_8410B20,
+ .map = gUnknown_8410B94,
+ .palette = gUnknown_8410B00
+ }
+};
+
+const struct UnkStruct_8410CF4 gUnknown_8410CF4[] = {
+ { 1, 0, 16 },
+ { 0, 0, 300 },
+ { 0, 1, 300 },
+ { 0, 2, 300 },
+ { 0, 42, 60 },
+ { 1, 1, 0 },
+ { 0, 3, 211 },
+ { 0, 4, 211 },
+ { 0, 5, 211 },
+ { 1, 2, 0 },
+ { 0, 6, 211 },
+ { 0, 7, 210 },
+ { 0, 8, 210 },
+ { 3, 0, 0 },
+ { 2, 3, 16 },
+ { 0, 9, 211 },
+ { 0, 10, 210 },
+ { 0, 11, 210 },
+ { 1, 4, 16 },
+ { 0, 12, 211 },
+ { 0, 13, 210 },
+ { 0, 14, 210 },
+ { 1, 5, 16 },
+ { 0, 15, 211 },
+ { 0, 16, 210 },
+ { 0, 17, 210 },
+ { 3, 1, 0 },
+ { 2, 6, 16 },
+ { 0, 18, 211 },
+ { 0, 19, 210 },
+ { 0, 20, 210 },
+ { 1, 7, 16 },
+ { 0, 21, 221 },
+ { 0, 22, 221 },
+ { 0, 23, 221 },
+ { 0, 24, 221 },
+ { 0, 42, 51 },
+ { 1, 8, 16 },
+ { 0, 25, 211 },
+ { 0, 26, 210 },
+ { 0, 27, 210 },
+ { 3, 2, 0 },
+ { 2, 9, 16 },
+ { 0, 28, 331 },
+ { 0, 29, 331 },
+ { 0, 30, 331 },
+ { 1, 10, 16 },
+ { 0, 31, 221 },
+ { 0, 32, 221 },
+ { 0, 33, 221 },
+ { 0, 34, 221 },
+ { 0, 42, 52 },
+ { 1, 11, 16 },
+ { 0, 41, 210 },
+ { 0, 35, 210 },
+ { 0, 36, 211 },
+ { 3, 3, 0 },
+ { 2, 12, 16 },
+ { 0, 37, 221 },
+ { 0, 40, 221 },
+ { 0, 38, 221 },
+ { 0, 39, 221 },
+ { 0, 42, 52 },
+ { 4, 0, 224 },
+ { 4, 1, 240 },
+ { 5, 0, 600 }
+};
+
+const ALIGNED(4) u8 gUnknown_8410FFC[3] = {0, 1, 2};
const ALIGNED(4) u8 gUnknown_8410E00[3] = {0, 5, 2};
const ALIGNED(4) u8 gUnknown_8410E04[3] = {0, 1, 2};
@@ -63,17 +327,274 @@ const struct WindowTemplate gUnknown_8410E08 = {
.paletteNum = 15,
.baseBlock = 0x008
};
- */
-extern const struct UnkStruct_8410CF4 gUnknown_8410CF4[];
-extern const u8 gUnknown_8410E00[3];
-extern const u8 gUnknown_8410E04[3];
-extern const struct WindowTemplate gUnknown_8410E08;
+const u16 gUnknown_8410E10[] = INCBIN_U16("data/credits/unk_8410E10.gbapal");
+const u32 gUnknown_8410E30[] = INCBIN_U32("data/credits/unk_8410E30.4bpp.lz");
+const u16 gUnknown_8411BF8[] = INCBIN_U16("data/credits/unk_8411BF8.gbapal");
+const u32 gUnknown_8411C18[] = INCBIN_U32("data/credits/unk_8411C18.4bpp.lz");
+const u16 gUnknown_84129A0[] = INCBIN_U16("data/credits/unk_84129A0.gbapal");
+const u32 gUnknown_84129C0[] = INCBIN_U32("data/credits/unk_84129C0.4bpp.lz");
+const u16 gUnknown_8413318[] = INCBIN_U16("data/credits/unk_8413318.gbapal");
+const u32 gUnknown_8413338[] = INCBIN_U32("data/credits/unk_8413338.4bpp.lz");
+const u16 gUnknown_8413854[] = INCBIN_U16("data/credits/unk_8413854.gbapal");
+const u32 gUnknown_8413874[] = INCBIN_U32("data/credits/unk_8413874.4bpp.lz");
+const u16 gUnknown_8413D98[] = INCBIN_U16("data/credits/unk_8413D98.gbapal");
+const u32 gUnknown_8413DB8[] = INCBIN_U32("data/credits/unk_8413DB8.4bpp.lz");
+
+const u16 gUnknown_841431C[][3] = {
+ { 0, 3, 1 },
+ { 0, 2, 0 },
+ { 0, 3, 0 },
+ { 1, 1, 2 },
+ { 0, 0, 3 }
+};
+
+const struct OamData gOamData_841433C = {
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .mosaic = FALSE,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .bpp = ST_OAM_4BPP,
+ .shape = ST_OAM_SQUARE,
+ .size = ST_OAM_SIZE_3,
+ .tileNum = 0x000,
+ .priority = 0,
+ .paletteNum = 15
+};
+
+const union AnimCmd gAnimCmds_8414344[] = {
+ ANIMCMD_FRAME(0x000, 8),
+ ANIMCMD_FRAME(0x040, 8),
+ ANIMCMD_FRAME(0x080, 8),
+ ANIMCMD_FRAME(0x0C0, 8),
+ ANIMCMD_FRAME(0x100, 8),
+ ANIMCMD_FRAME(0x140, 8),
+ ANIMCMD_JUMP(0)
+};
+
+const union AnimCmd *const gAnimCmdTable_8414360[] = {
+ gAnimCmds_8414344
+};
+
+const struct SpriteTemplate gUnknown_8414364 = {
+ .oam = &gOamData_841433C,
+ .anims = gAnimCmdTable_8414360,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy
+};
+
+const struct OamData gOamData_841437C = {
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .mosaic = FALSE,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .bpp = ST_OAM_4BPP,
+ .shape = ST_OAM_H_RECTANGLE,
+ .size = ST_OAM_SIZE_3,
+ .tileNum = 0x000,
+ .priority = 0,
+ .paletteNum = 14
+};
+
+const union AnimCmd gAnimCmds_8414384[] = {
+ ANIMCMD_FRAME(0x00, 8),
+ ANIMCMD_FRAME(0x20, 8),
+ ANIMCMD_FRAME(0x40, 8),
+ ANIMCMD_FRAME(0x60, 8),
+ ANIMCMD_FRAME(0x80, 8),
+ ANIMCMD_FRAME(0xA0, 8),
+ ANIMCMD_FRAME(0xC0, 8),
+ ANIMCMD_FRAME(0xE0, 8),
+ ANIMCMD_JUMP(0)
+};
+
+const union AnimCmd gAnimCmds_84143A8[] = {
+ ANIMCMD_FRAME(0x00, 8),
+ ANIMCMD_JUMP(0)
+};
+
+const union AnimCmd *const gAnimCmdTable_84143B0[] = {
+ gAnimCmds_8414384
+};
+
+const union AnimCmd *const gAnimCmdTable_84143B4[] = {
+ gAnimCmds_84143A8
+};
+
+const struct SpriteTemplate gUnknown_84143B8 = {
+ .oam = &gOamData_841437C,
+ .anims = gAnimCmdTable_84143B0,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy
+};
-extern const char * gUnknown_8414588[];
-extern const struct UnkStruct_84145BC gUnknown_84145BC[];
+const struct SpriteTemplate gUnknown_84143D0 = {
+ .oam = &gOamData_841437C,
+ .anims = gAnimCmdTable_84143B4,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy
+};
+
+const struct CreditsOverworldCmd gUnknown_84143E8[] = {
+ { 0x00fe, MAP_GROUP(ROUTE23), MAP_NUM(ROUTE23) },
+ { 0x000b, 0x006b, 0x0001 },
+ { 0x0000, 0x0001, 0x0500 }, // Scroll down
+ { 0x00fd, 0x00fd, 0x00fd }
+};
+
+const struct CreditsOverworldCmd gUnknown_8414408[] = {
+ { 0x00fe, MAP_GROUP(VIRIDIAN_CITY), MAP_NUM(VIRIDIAN_CITY) },
+ { 0x001e, 0x0022, 0x0001 },
+ { 0x0000, 0xffff, 0x0500 }, // Scroll up
+ { 0x00fd, 0x00fd, 0x00fd }
+};
+
+const struct CreditsOverworldCmd gUnknown_8414428[] = {
+ { 0x00fe, MAP_GROUP(PEWTER_CITY), MAP_NUM(PEWTER_CITY) },
+ { 0x0014, 0x001a, 0x0001 },
+ { 0x0000, 0xffff, 0x0500 }, // Scroll up
+ { 0x00fd, 0x00fd, 0x00fd }
+};
-void sub_80F39B4(void)
+// Charizard
+
+const struct CreditsOverworldCmd gUnknown_8414448[] = {
+ { 0x00fe, MAP_GROUP(CERULEAN_CITY), MAP_NUM(CERULEAN_CITY) },
+ { 0x0008, 0x0006, 0x0001 },
+ { 0x0001, 0x0001, 0x0500 }, // Scroll right and down
+ { 0x00fd, 0x00fd, 0x00fd }
+};
+
+const struct CreditsOverworldCmd gUnknown_8414468[] = {
+ { 0x00fe, MAP_GROUP(ROUTE25), MAP_NUM(ROUTE25) },
+ { 0x0019, 0x0006, 0x0001 },
+ { 0x0001, 0x0000, 0x0500 }, // Scroll right
+ { 0x00fd, 0x00fd, 0x00fd }
+};
+
+const struct CreditsOverworldCmd gUnknown_8414488[] = {
+ { 0x00fe, MAP_GROUP(VERMILION_CITY), MAP_NUM(VERMILION_CITY) },
+ { 0x0009, 0x0007, 0x0001 },
+ { 0x0001, 0x0001, 0x0500 }, // Scroll right and down
+ { 0x00fd, 0x00fd, 0x00fd }
+};
+
+// Venusaur
+
+const struct CreditsOverworldCmd gUnknown_84144A8[] = {
+ { 0x00fe, MAP_GROUP(ROUTE10), MAP_NUM(ROUTE10) },
+ { 0x000b, 0x0044, 0x0001 },
+ { 0x0000, 0x0001, 0x0500 }, // Scroll down
+ { 0x00fd, 0x00fd, 0x00fd }
+};
+
+const struct CreditsOverworldCmd gUnknown_84144C8[] = {
+ { 0x00fe, MAP_GROUP(CELADON_CITY), MAP_NUM(CELADON_CITY) },
+ { 0x0030, 0x0010, 0x0001 },
+ { 0xffff, 0x0000, 0x0500 }, // Scroll left
+ { 0x00fd, 0x00fd, 0x00fd }
+};
+
+const struct CreditsOverworldCmd gUnknown_84144E8[] = {
+ { 0x00fe, MAP_GROUP(SAFFRON_CITY_DUPLICATE), MAP_NUM(SAFFRON_CITY_DUPLICATE) },
+ { 0x0027, 0x0005, 0x0001 },
+ { 0x0000, 0x0001, 0x0500 }, // Scroll down
+ { 0x00fd, 0x00fd, 0x00fd }
+};
+
+// Blastoise
+
+const struct CreditsOverworldCmd gUnknown_8414508[] = {
+ { 0x00fe, MAP_GROUP(ROUTE17), MAP_NUM(ROUTE17) },
+ { 0x0007, 0x002b, 0x0001 },
+ { 0x0000, 0x0001, 0x0500 }, // Scroll down
+ { 0x00fd, 0x00fd, 0x00fd }
+};
+
+const struct CreditsOverworldCmd gUnknown_8414528[] = {
+ { 0x00fe, MAP_GROUP(FUCHSIA_CITY), MAP_NUM(FUCHSIA_CITY) },
+ { 0x001c, 0x0005, 0x0001 },
+ { 0x0000, 0x0001, 0x0500 }, // Scroll down
+ { 0x00fd, 0x00fd, 0x00fd }
+};
+
+const struct CreditsOverworldCmd gUnknown_8414548[] = {
+ { 0x00fe, MAP_GROUP(CINNABAR_ISLAND), MAP_NUM(CINNABAR_ISLAND) },
+ { 0x000d, 0x0011, 0x0001 },
+ { 0x0000, 0xffff, 0x0500 }, // Scroll up
+ { 0x00fd, 0x00fd, 0x00fd }
+};
+
+// Pikachu
+
+const struct CreditsOverworldCmd gUnknown_8414568[] = {
+ { 0x00fe, MAP_GROUP(ROUTE21_NORTH), MAP_NUM(ROUTE21_NORTH) },
+ { 0x0008, 0x0014, 0x0001 },
+ { 0x0000, 0xffff, 0x0500 }, // Scroll up
+ { 0x00fd, 0x00fd, 0x00fd },
+};
+
+const struct CreditsOverworldCmd *const gUnknown_8414588[] = {
+ gUnknown_84143E8,
+ gUnknown_8414408,
+ gUnknown_8414428,
+ gUnknown_8414448,
+ gUnknown_8414468,
+ gUnknown_8414488,
+ gUnknown_84144A8,
+ gUnknown_84144C8,
+ gUnknown_84144E8,
+ gUnknown_8414508,
+ gUnknown_8414528,
+ gUnknown_8414548,
+ gUnknown_8414568
+};
+
+const struct UnkStruct_84145BC gUnknown_84145BC[] = {
+ { gUnknown_841D1D8, gUnknown_841D1E8, 0 },
+ { gUnknown_841D200, gUnknown_841D224, 0 },
+ { gUnknown_841D248, gUnknown_841D284, 0 },
+ { gUnknown_841D2B4, gUnknown_841D2C8, 0 },
+ { gUnknown_841D314, gUnknown_841D330, 1 },
+ { gUnknown_841D370, gUnknown_841D388, 1 },
+ { gUnknown_841D3C0, gUnknown_841D3D8, 1 },
+ { gUnknown_841D3FC, gUnknown_841D414, 1 },
+ { gUnknown_841D434, gUnknown_841D448, 0 },
+ { gUnknown_841D45C, gUnknown_841D474, 0 },
+ { gUnknown_841D4A4, gUnknown_841D4BC, 0 },
+ { gUnknown_841D4F0, gUnknown_841D504, 1 },
+ { gUnknown_841D524, gUnknown_841D548, 0 },
+ { gUnknown_841D56C, gUnknown_841D588, 0 },
+ { gUnknown_841D5B8, gUnknown_841D5CC, 0 },
+ { gUnknown_841D5E4, gUnknown_841D5FC, 1 },
+ { gUnknown_841D640, gUnknown_841D658, 0 },
+ { gUnknown_841D698, gUnknown_841D6B0, 1 },
+ { gUnknown_841D6EC, gUnknown_841D708, 0 },
+ { gUnknown_841D74C, gUnknown_841D768, 0 },
+ { gUnknown_841D784, gUnknown_841D79C, 0 },
+ { gUnknown_841D7DC, gUnknown_841D7F4, 0 },
+ { gUnknown_841D834, gUnknown_841D84C, 0 },
+ { gUnknown_841D894, gUnknown_841D8B0, 0 },
+ { gUnknown_841D8CC, gUnknown_841D8EC, 0 },
+ { gUnknown_841D938, gUnknown_841D94C, 0 },
+ { gUnknown_841D98C, gUnknown_841D9A0, 1 },
+ { gUnknown_841D9C4, gUnknown_841D9D4, 0 },
+ { gUnknown_841DA08, gUnknown_841DA24, 0 },
+ { gUnknown_841DA3C, gUnknown_841DA58, 0 },
+ { gUnknown_841DA6C, gUnknown_841DA88, 0 },
+ { gUnknown_841DAA0, gUnknown_841DAC4, 0 },
+ { gUnknown_841DAE8, gUnknown_841DB04, 0 },
+ { gUnknown_841DB28, gUnknown_841DB3C, 0 },
+ { gUnknown_841DB7C, gUnknown_841DBA4, 1 },
+ { gUnknown_841DBDC, gUnknown_841DBF8, 1 },
+ { gUnknown_841DC2C, gUnknown_841DC48, 1 },
+ { gUnknown_841DCAC, gUnknown_841DCC8, 1 },
+ { gUnknown_841DD08, gUnknown_841DD20, 0 },
+ { gUnknown_841DD64, gUnknown_841DD7C, 0 },
+ { gUnknown_841DDC8, gUnknown_841DDE4, 0 },
+ { gUnknown_841DE24, gUnknown_841DE3C, 0 },
+ { gUnknown_84161CD, gUnknown_84161CD, 0 }
+};
+
+void Special_Credits(void)
{
gUnknown_203AB40 = AllocZeroed(sizeof(*gUnknown_203AB40));
ResetTasks();
@@ -1114,3 +1635,412 @@ s32 sub_80F3BD0(void)
"_080F418C: .4byte gPaletteFade");
}
#endif //NONMATCHING
+
+void sub_80F4190(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+}
+
+void sub_80F41A4(u8 a0)
+{
+ switch (a0)
+ {
+ case 0:
+ InitWindows(gUnknown_840C5B0);
+ FillWindowPixelBuffer(0, PIXEL_FILL(0));
+ sub_810C228(SPECIES_CHARIZARD, 8, 0, TRUE, 10, 0);
+ CopyToWindowPixelBuffer(1, (const void *)gUnknown_840CB8C, 0, 0);
+ CopyToWindowPixelBuffer(2, (const void *)gUnknown_840D228, 0, 0);
+ break;
+ case 1:
+ InitWindows(gUnknown_840C5D0);
+ FillWindowPixelBuffer(0, PIXEL_FILL(0));
+ sub_810C228(SPECIES_VENUSAUR, 8, 0, TRUE, 10, 0);
+ CopyToWindowPixelBuffer(1, (const void *)gUnknown_840E158, 0, 0);
+ CopyToWindowPixelBuffer(2, (const void *)gUnknown_840E904, 0, 0);
+ break;
+ case 2:
+ InitWindows(gUnknown_840C5F0);
+ FillWindowPixelBuffer(0, PIXEL_FILL(0));
+ sub_810C228(SPECIES_BLASTOISE, 8, 0, TRUE, 10, 0);
+ CopyToWindowPixelBuffer(1, (const void *)gUnknown_840F240, 0, 0);
+ CopyToWindowPixelBuffer(2, (const void *)gUnknown_840F944, 0, 0);
+ break;
+ case 3:
+ InitWindows(gUnknown_840C610);
+ FillWindowPixelBuffer(0, PIXEL_FILL(0));
+ sub_810C228(SPECIES_PIKACHU, 8, 0, TRUE, 10, 0);
+ CopyToWindowPixelBuffer(1, (const void *)gUnknown_8410198, 0, 0);
+ CopyToWindowPixelBuffer(2, (const void *)gUnknown_84105B4, 0, 0);
+ break;
+ }
+ CopyWindowToVram(0, 2);
+ CopyWindowToVram(1, 2);
+ CopyWindowToVram(2, 2);
+}
+
+u16 sub_80F42F0(u8 a0)
+{
+ switch (a0)
+ {
+ case 0:
+ return SPECIES_CHARIZARD;
+ case 1:
+ return SPECIES_VENUSAUR;
+ case 2:
+ return SPECIES_BLASTOISE;
+ case 3:
+ return SPECIES_PIKACHU;
+ default:
+ return SPECIES_NONE;
+ }
+}
+
+bool32 sub_80F4328(void)
+{
+ switch (gUnknown_203AB40->unk_01)
+ {
+ case 0:
+ SetVBlankCallback(NULL);
+ SetHBlankCallback(NULL);
+ ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON | DISPCNT_WIN1_ON);
+ SetGpuReg(REG_OFFSET_WININ, 0);
+ SetGpuReg(REG_OFFSET_WINOUT, 0);
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ SetGpuReg(REG_OFFSET_BLDY, 0);
+ ResetPaletteFade();
+ ResetSpriteData();
+ ResetTasks();
+ ResetBgsAndClearDma3BusyFlags(1);
+ InitBgsFromTemplates(1, gUnknown_840C5A4, NELEMS(gUnknown_840C5A4));
+ SetBgTilemapBuffer(0, Alloc(BG_SCREEN_SIZE));
+ ChangeBgX(0, 0, 0);
+ ChangeBgY(0, 0, 0);
+ ChangeBgX(1, 0, 0);
+ ChangeBgY(1, 0, 0);
+ gUnknown_203AB40->unk_0C = 0;
+ gUnknown_203AB40->unk_0E = 0;
+ SetBgAffine(2, 0x8000, 0x8000, 0x78, 0x50, gUnknown_203AB40->unk_0C, gUnknown_203AB40->unk_0C, 0);
+ DecompressAndLoadBgGfxUsingHeap(1, gUnknown_8EAAB98, 0x2000, 0, 0);
+ DecompressAndLoadBgGfxUsingHeap(2, gUnknown_840C650, 0x2000, 0, 0);
+ DecompressAndLoadBgGfxUsingHeap(1, gUnknown_8EAB30C, 0x500, 0, 1);
+ DecompressAndLoadBgGfxUsingHeap(2, gUnknown_840CA54, 0x400, 0, 1);
+ LoadPalette(gUnknown_8EAAB18[gUnknown_203AB40->unk_09], 0, 0x20);
+ LoadPalette(gUnknown_840C630, 0xF0, 0x20);
+ sub_80F41A4(gUnknown_203AB40->unk_09);
+ SetVBlankCallback(sub_80F4190);
+ EnableInterrupts(INTR_FLAG_VBLANK);
+ gUnknown_203AB40->unk_01++;
+ break;
+ case 1:
+ FillBgTilemapBufferRect(0, 0, 0, 0, 32, 32, PIXEL_FILL(1));
+ PutWindowTilemap(0);
+ CopyBgTilemapBufferToVram(2);
+ CopyBgTilemapBufferToVram(1);
+ CopyBgTilemapBufferToVram(0);
+ gUnknown_203AB40->unk_01++;
+ break;
+ case 2:
+ ShowBg(2);
+ ShowBg(0);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK);
+ gUnknown_203AB40->unk_0C = 0x28;
+ gUnknown_203AB40->unk_01++;
+ break;
+ case 3:
+ if (gUnknown_203AB40->unk_0C != 0)
+ gUnknown_203AB40->unk_0C--;
+ else
+ gUnknown_203AB40->unk_01++;
+ break;
+ case 4:
+ if (!gPaletteFade.active)
+ {
+ gUnknown_203AB40->unk_0C = 8;
+ gUnknown_203AB40->unk_0E = 1;
+ gUnknown_203AB40->unk_01++;
+ }
+ break;
+ case 5:
+ if (gUnknown_203AB40->unk_0C != 0)
+ gUnknown_203AB40->unk_0C--;
+ else
+ {
+ if (gUnknown_203AB40->unk_0E < 3)
+ {
+ PutWindowTilemap(gUnknown_203AB40->unk_0E);
+ CopyBgTilemapBufferToVram(0);
+ gUnknown_203AB40->unk_0C = 4;
+ gUnknown_203AB40->unk_0E++;
+ }
+ else
+ gUnknown_203AB40->unk_01++;
+ }
+ break;
+ case 6:
+ if (gUnknown_203AB40->unk_0C < 256)
+ {
+ gUnknown_203AB40->unk_0C += 16;
+ SetBgAffine(2, 0x8000, 0x8000, 0x78, 0x50, gUnknown_203AB40->unk_0C, gUnknown_203AB40->unk_0C, 0);
+ }
+ else
+ {
+ SetBgAffine(2, 0x8000, 0x8000, 0x78, 0x50, 0x100, 0x100, 0);
+ gUnknown_203AB40->unk_0C = 32;
+ gUnknown_203AB40->unk_01++;
+ }
+ break;
+ case 7:
+ if (gUnknown_203AB40->unk_0C != 0)
+ gUnknown_203AB40->unk_0C--;
+ else
+ {
+ HideBg(2);
+ ShowBg(1);
+ PlayCry2(sub_80F42F0(gUnknown_203AB40->unk_09), 0, 125, 10);
+ gUnknown_203AB40->unk_0C = 128;
+ gUnknown_203AB40->unk_01++;
+ }
+ break;
+ case 8:
+ if (gUnknown_203AB40->unk_0C != 0)
+ gUnknown_203AB40->unk_0C--;
+ else
+ {
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
+ gUnknown_203AB40->unk_01++;
+ }
+ break;
+ case 9:
+ if (!gPaletteFade.active)
+ {
+ FreeAllWindowBuffers();
+ Free(GetBgTilemapBuffer(0));
+ gUnknown_203AB40->unk_01 = 0;
+ return TRUE;
+ }
+ break;
+ }
+ return FALSE;
+}
+
+bool32 sub_80F4674(void)
+{
+ switch (gUnknown_203AB40->unk_01)
+ {
+ case 0:
+ SetVBlankCallback(NULL);
+ SetHBlankCallback(NULL);
+ ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON | DISPCNT_WIN1_ON);
+ SetGpuReg(REG_OFFSET_WININ, 0);
+ SetGpuReg(REG_OFFSET_WINOUT, 0);
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ SetGpuReg(REG_OFFSET_BLDY, 0);
+ ResetPaletteFade();
+ ResetSpriteData();
+ ResetTasks();
+ ResetBgsAndClearDma3BusyFlags(1);
+ InitBgsFromTemplates(0, gUnknown_840C5A4, 1);
+ ChangeBgX(0, 0, 0);
+ ChangeBgY(0, 0, 0);
+ DecompressAndLoadBgGfxUsingHeap(0, gUnknown_8410CDC[gUnknown_203AB40->unk_09].tiles, 0x2000, 0, 0);
+ DecompressAndLoadBgGfxUsingHeap(0, gUnknown_8410CDC[gUnknown_203AB40->unk_09].map, 0x800, 0, 1);
+ LoadPalette(gUnknown_8410CDC[gUnknown_203AB40->unk_09].palette, 0x00, 0x200);
+ SetVBlankCallback(sub_80F4190);
+ EnableInterrupts(INTR_FLAG_VBLANK);
+ gUnknown_203AB40->unk_01++;
+ break;
+ case 1:
+ CopyBgTilemapBufferToVram(0);
+ gUnknown_203AB40->unk_01++;
+ break;
+ case 2:
+ ShowBg(0);
+ if (gUnknown_203AB40->unk_09 != 0)
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0, RGB_BLACK);
+ else
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK);
+ gUnknown_203AB40->unk_01++;
+ break;
+ case 3:
+ if (!gPaletteFade.active)
+ {
+ gUnknown_203AB40->unk_01 = 0;
+ return TRUE;
+ }
+ break;
+ }
+ return FALSE;
+}
+
+void sub_80F47F8(u8 taskId)
+{
+ struct CreditsTaskData * data = (void *)gTasks[taskId].data;
+ switch (data->field_00)
+ {
+ case 0:
+ break;
+ case 1:
+ if (gSprites[data->field_01].pos1.x != 0xD0)
+ {
+ gSprites[data->field_01].pos1.x--;
+ gSprites[data->field_06].pos1.x--;
+ }
+ else
+ {
+ data->field_00 = 0;
+ }
+ break;
+ case 2:
+ if (gUnknown_203AB40->unk_1D & 1)
+ {
+ if (gSprites[data->field_01].pos1.y != 0x50)
+ {
+ gSprites[data->field_01].pos1.y--;
+ gSprites[data->field_06].pos1.y--;
+ }
+ else
+ {
+ data->field_00 = 0;
+ }
+ }
+ break;
+ case 3:
+ if (gUnknown_203AB40->unk_00 == 15)
+ {
+ gSprites[data->field_01].pos1.x--;
+ gSprites[data->field_06].pos1.x--;
+ }
+ break;
+ }
+}
+
+void sub_80F48D0(void)
+{
+ if (gUnknown_203AB40->unk_02 != 0xFF)
+ {
+ struct CreditsTaskData * data = (void *)gTasks[gUnknown_203AB40->unk_02].data;
+ FreeSpriteTilesByTag(data->field_02);
+ DestroySprite(&gSprites[data->field_01]);
+ FreeSpriteTilesByTag(data->field_08);
+ DestroySprite(&gSprites[data->field_06]);
+ DestroyTask(gUnknown_203AB40->unk_02);
+ gUnknown_203AB40->unk_02 = 0xFF;
+ }
+}
+
+void sub_80F4930(u8 a0)
+{
+ u8 taskId;
+ struct CreditsTaskData * data;
+ s32 r4, r9;
+ struct SpriteTemplate sp00;
+ struct CompressedSpriteSheet sp18;
+
+ if (gUnknown_203AB40->unk_02 == 0xFF)
+ {
+ taskId = CreateTask(sub_80F47F8, 0);
+ data = (void *)gTasks[taskId].data;
+ gUnknown_203AB40->unk_02 = taskId;
+ switch (gUnknown_841431C[a0][2])
+ {
+ default:
+ case 0:
+ r4 = 0xd0;
+ r9 = 0x50;
+ break;
+ case 1:
+ r4 = 0x110;
+ r9 = 0x50;
+ break;
+ case 2:
+ r4 = 0xd0;
+ r9 = 0xa0;
+ break;
+ }
+ data->field_00 = gUnknown_841431C[a0][2];
+ data->field_02 = 0x2000;
+ data->field_04 = 0xFFFF;
+ switch (gUnknown_841431C[a0][0])
+ {
+ case 0:
+ // Player
+ if (gSaveBlock2Ptr->playerGender == MALE)
+ {
+ sp18.data = gUnknown_8410E30;
+ sp18.size = 0x3000;
+ sp18.tag = data->field_02;
+ LoadCompressedSpriteSheet(&sp18);
+ LoadPalette(gUnknown_8410E10, 0x1F0, 0x20);
+ }
+ else
+ {
+ sp18.data = gUnknown_8411C18;
+ sp18.size = 0x3000;
+ sp18.tag = data->field_02;
+ LoadCompressedSpriteSheet(&sp18);
+ LoadPalette(gUnknown_8411BF8, 0x1F0, 0x20);
+ }
+ break;
+ case 1:
+ // Rival
+ sp18.data = gUnknown_84129C0;
+ sp18.size = 0x3000;
+ sp18.tag = data->field_02;
+ LoadCompressedSpriteSheet(&sp18);
+ LoadPalette(gUnknown_84129A0, 0x1F0, 0x20);
+ break;
+ }
+ sp00 = gUnknown_8414364;
+ sp00.tileTag = data->field_02;
+ data->field_01 = CreateSprite(&sp00, r4, r9, 0);
+ gSprites[data->field_01].oam.paletteNum = 0xF;
+ gSprites[data->field_01].subpriority = 0;
+
+ data->field_08 = 0x2001;
+ data->field_0A = 0xFFFF;
+ switch (gUnknown_841431C[a0][1])
+ {
+ case 0:
+ sp18.data = gUnknown_8413338;
+ sp18.size = 0x3000;
+ sp18.tag = data->field_08;
+ LoadCompressedSpriteSheet(&sp18);
+ LoadPalette(gUnknown_8413318, 0x1E0, 0x20);
+ sp00 = gUnknown_84143B8;
+ break;
+ case 1:
+ sp18.data = gUnknown_8413338;
+ sp18.size = 0x3000;
+ sp18.tag = data->field_08;
+ LoadCompressedSpriteSheet(&sp18);
+ LoadPalette(gUnknown_8413318, 0x1E0, 0x20);
+ sp00 = gUnknown_84143D0;
+ break;
+ case 2:
+ sp18.data = gUnknown_8413874;
+ sp18.size = 0x3000;
+ sp18.tag = data->field_08;
+ LoadCompressedSpriteSheet(&sp18);
+ LoadPalette(gUnknown_8413854, 0x1E0, 0x20);
+ sp00 = gUnknown_84143B8;
+ break;
+ case 3:
+ sp18.data = gUnknown_8413DB8;
+ sp18.size = 0x3000;
+ sp18.tag = data->field_08;
+ LoadCompressedSpriteSheet(&sp18);
+ LoadPalette(gUnknown_8413D98, 0x1E0, 0x20);
+ sp00 = gUnknown_84143B8;
+ break;
+ }
+ sp00.tileTag = data->field_08;
+ data->field_06 = CreateSprite(&sp00, r4, r9 + 0x26, 0);
+ gSprites[data->field_06].oam.paletteNum = 0xE;
+ gSprites[data->field_06].subpriority = 1;
+ }
+}