summaryrefslogtreecommitdiff
path: root/src/scene/credits.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/scene/credits.c')
-rw-r--r--src/scene/credits.c1496
1 files changed, 1496 insertions, 0 deletions
diff --git a/src/scene/credits.c b/src/scene/credits.c
new file mode 100644
index 000000000..cf10137c1
--- /dev/null
+++ b/src/scene/credits.c
@@ -0,0 +1,1496 @@
+#include "global.h"
+#include "data2.h"
+#include "decompress.h"
+#include "event_data.h"
+#include "hall_of_fame.h"
+#include "intro_credits_graphics.h"
+#include "m4a.h"
+#include "main.h"
+#include "menu.h"
+#include "palette.h"
+#include "pokedex.h"
+#include "rng.h"
+#include "songs.h"
+#include "sound.h"
+#include "species.h"
+#include "starter_choose.h"
+#include "task.h"
+#include "trig.h"
+
+asm(".set REG_BASE, 0x4000000");
+asm(".set OFFSET_REG_BLDCNT, 0x50");
+asm(".set OFFSET_REG_BLDALPHA, 0x52");
+asm(".set REG_BLDCNT, REG_BASE + OFFSET_REG_BLDCNT");
+asm(".set REG_BLDALPHA, REG_BASE + OFFSET_REG_BLDALPHA");
+
+enum
+{
+ PAGE_TITLE,
+ PAGE_DIRECTOR,
+ PAGE_ART_DIRECTOR,
+ PAGE_BATTLE_DIRECTOR,
+ PAGE_MAIN_PROGRAMMER,
+ PAGE_BATTLE_SYSTEM_PROGRAMMER,
+ PAGE_PROGRAMMERS_1,
+ PAGE_PROGRAMMERS_2,
+ PAGE_PROGRAMMERS_3,
+ PAGE_MAIN_GRAHPICS_DESIGNER,
+ PAGE_POKEMON_GRAHPIC_DESIGNERS_1,
+ PAGE_POKEMON_GRAHPIC_DESIGNERS_2,
+ PAGE_POKEMON_GRAHPIC_DESIGNERS_3,
+ PAGE_POKEMON_DESIGNERS_1,
+ PAGE_POKEMON_DESIGNERS_2,
+ PAGE_MUSIC_COMPOSITION,
+ PAGE_SOUND_EFFECTS,
+ PAGE_GAME_DESIGNERS_1,
+ PAGE_GAME_DESIGNERS_2,
+ PAGE_GAME_DESIGNERS_3,
+ PAGE_PLOT_SCENARIO,
+ PAGE_GAME_SCENARIO,
+ PAGE_SCRIPT_DESIGNERS,
+ PAGE_MAP_DESIGNERS,
+ PAGE_MAP_DATA_DESIGNERS,
+ PAGE_PARAMETRIC_DESIGNERS,
+ PAGE_POKEDEX_TEXT,
+ PAGE_ENVIRONMENT_TOOLS,
+ PAGE_PRODUCT_TESTING,
+ PAGE_SPECIAL_THANKS,
+ PAGE_SPECIAL_THANKS_1,
+ PAGE_SPECIAL_THANKS_2,
+ PAGE_SPECIAL_THANKS_3,
+ PAGE_INFORMATION_SUPERVISORS,
+ PAGE_COORDINATORS,
+ PAGE_TASK_MANAGERS,
+ PAGE_PRODUCERS,
+ PAGE_EXECUTIVE_DIRECTOR,
+ PAGE_EXECUTIVE_PRODUCERS_1,
+ PAGE_EXECUTIVE_PRODUCERS_2,
+ PAGE_TRANSLATION_COORDINATOR,
+ PAGE_TRANSLATORS,
+ PAGE_PROGRAMMERS,
+ PAGE_GRAPHIC_DESIGNERS,
+ PAGE_PRODUCT_SUPPORT,
+
+#if ENGLISH
+ PAGE_ARTWORK,
+ PAGE_TEXT_EDITOR,
+ PAGE_NOA_TESTING,
+ PAGE_BRAILLE_CODE_CHECK_1,
+ PAGE_BRAILLE_CODE_CHECK_2,
+#elif GERMAN
+ PAGE_NOE_TESTING,
+ PAGE_BRAILLE_CODE_CHECK_1,
+#endif
+
+ PAGE_SPECIAL_THANKS_4,
+ PAGE_SPECIAL_THANKS_5,
+
+ PAGE_COUNT
+};
+
+#if ENGLISH
+#define POKEMON_TILE_COUNT 68
+#define LAST_PAGE (PAGE_TEXT_EDITOR)
+#define UNK_DEFINE_45 (0x45)
+#define UNK_DEFINE_82 (0x82)
+#define UNK_DEF_1F3 (499)
+#elif GERMAN
+#define POKEMON_TILE_COUNT 65
+#define LAST_PAGE (PAGE_NOE_TESTING)
+#define UNK_DEFINE_45 (8)
+#define UNK_DEFINE_82 (0x8D)
+#define UNK_DEF_1F3 (554)
+#endif
+
+#define COLOR_DARK_GREEN 0x1967
+#define COLOR_LIGHT_GREEN 0x328D
+
+enum
+{
+ TDA_0 = 0,
+ TDA_TASK_C_ID = 1,
+ TDA_TASK_E_ID = 2,
+ TDA_TASK_D_ID = 3,
+ TDA_4 = 4,
+ TDA_PLAYER_CYCLIST = 5,
+ TDA_RIVAL_CYCLIST = 6,
+ TDA_7 = 7, // Has something to do with the bike scene
+ TDA_11 = 11, // Gets set depending on whether the bike or the grass scene should be shown
+ TDA_12 = 12,
+ TDA_13 = 13,
+ TDA_14 = 14,
+ TDA_TASK_B_ID = 15,
+
+ // Appears to be responsible for text
+ TDB_0 = 0,
+ TDB_TASK_A_ID = 1,
+ TDB_CURRENT_PAGE = 2,
+ TDB_3 = 3,
+
+ TDC_0 = 0,
+ TDC_1 = 1,
+ TDC_2 = 2,
+ TDC_3 = 3,
+ TDC_4 = 4,
+ TDC_5 = 5,
+
+ TDD_STATE = 0,
+ TDD_TASK_A_ID = 1,
+ TDD_2 = 2,
+ TDD_3 = 3,
+
+ TDE_0 = 0,
+ TDE_1 = 1,
+ TDE_TASK_A_ID = 2,
+};
+
+
+struct Unk201C000
+{
+ u16 unk0[POKEMON_TILE_COUNT];
+ u16 unk88;
+ u16 unk8A;
+ u16 unk8C;
+ u16 unk8E;
+ u16 unk90[386];
+ u16 unk394;
+};
+
+struct CreditsEntry
+{
+ u8 var_0;
+ u8 *text;
+};
+
+extern u8 ewram[];
+
+#define EWRAM_1F800 ((u16 *)(ewram + 0x1F800))
+#define HALL_OF_FAME_SHEET_0 ((u8 *)(ewram + 0x1E000))
+#define HALL_OF_FAME_SHEET_1 ((u8 *)(ewram + 0x1E800))
+#define HALL_OF_FAME_SHEET_2 ((u8 *)(ewram + 0x1F000))
+#define ewram1c000 (*(struct Unk201C000 *)(ewram + 0x1C000))
+
+extern struct HallOfFame gHallOfFame;
+extern u8 unk_201e800[0x800];
+extern u8 unk_201f000[0x800];
+extern u16 unk_201f800[];
+
+extern struct SpriteTemplate gUnknown_02024E8C;
+
+extern u16 gUnknown_02039358;
+extern s16 gUnknown_0203935A;
+extern s16 gUnknown_0203935C;
+
+static EWRAM_DATA s16 gUnknown_02039320 = 0;
+static EWRAM_DATA u16 gUnknown_02039322 = 0; // TASK A
+EWRAM_DATA u8 gUnknown_02039324 = 0;
+static EWRAM_DATA u8 gUnknown_02039325 = 0;
+
+extern u8 gReservedSpritePaletteCount;
+
+// data/hall_of_fame
+extern void *gUnknown_0840B5A0[];
+
+// data/credits
+const u16 gUnknown_0840B7BC[] = INCBIN_U16("graphics/credits/palette_1.gbapal");
+const u8 gUnknown_0840B7FC[] = INCBIN_U8("graphics/credits/ampersand.4bpp");
+extern u8 gUnknown_0840B83C[];
+extern u8 gUnknown_0840B84B[];
+extern u8 gUnknown_0840B85A[];
+extern u8 gUnknown_0840B869[];
+extern u8 gUnknown_0840B878[];
+extern struct CreditsEntry *gCreditsEntryPointerTable[][5];
+extern u8 gUnknown_0840CA00[][2];
+extern struct SpriteSheet gUnknown_0840CAA0;
+extern struct SpritePalette gUnknown_0840CAB0;
+extern const union AnimCmd *const gSpriteAnimTable_0840CA54[];
+extern const union AnimCmd *const gSpriteAnimTable_0840CA94[];
+extern struct SpriteTemplate gSpriteTemplate_840CAEC;
+
+// graphics
+extern u8 gCreditsCopyrightEnd_Gfx[];
+extern u16 gIntroCopyright_Pal[16];
+
+static void task_a_8143B38(u8 taskIdA);
+static void task_a_8143B68(u8 taskIdA);
+static void task_a_8143BFC(u8 taskIdA);
+static void task_a_80C9BFC(u8 taskIdA);
+static void task_a_8143CC0(u8 taskIdA);
+static void task_a_8143D04(u8 taskIdA);
+static void task_a_8143EBC(u8 taskIdA);
+static void task_a_8143F04(u8 taskIdA);
+static void task_a_8143F3C(u8 taskIdA);
+static void task_a_8143FDC(u8 taskIdA);
+static void task_a_8144024(u8 taskIdA);
+static void task_a_8144080(u8 taskIdA);
+static void task_a_8144114(u8 taskIdA);
+static void sub_8144130(void);
+static void task_b_81441B8(u8 taskIdB);
+static u8 sub_8144454(u8 page, u8 taskIdA);
+static void task_d_8144514(u8 taskIdD);
+static bool8 sub_8144ECC(u8 data, u8 taskIdA);
+static void sub_81450AC(u8 taskIdA);
+static void sub_8145128(u16, u16, u16);
+static void sub_81452D0(u16 arg0, u16 palette);
+static void spritecb_player_8145378(struct Sprite *sprite);
+static void spritecb_rival_8145420(struct Sprite *sprite);
+static u8 sub_81456B4(u16 species, u16 x, u16 y, u16 position);
+static void sub_81458DC(void);
+
+static void vblank_8143948(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+}
+
+static void sub_814395C(void)
+{
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+
+ if ((gMain.heldKeys & B_BUTTON)
+ && gUnknown_02039324 != 0
+ && gTasks[gUnknown_02039322].func == task_a_8143B68)
+ {
+ vblank_8143948();
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+ gUnknown_02039325 = 1;
+ }
+}
+
+void sub_81439D0(void)
+{
+ u8 taskIdA;
+ s16 taskIdC;
+ u8 taskIdB;
+ u16 savedIme;
+ struct Unk201C000 *c000;
+
+ sub_8144130();
+ SetVBlankCallback(NULL);
+ ResetPaletteFade();
+ ResetTasks();
+
+ taskIdA = CreateTask(task_a_8143B38, 0);
+
+ gTasks[taskIdA].data[TDA_4] = 0;
+ gTasks[taskIdA].data[TDA_7] = 0;
+ gTasks[taskIdA].data[TDA_11] = 0;
+ gTasks[taskIdA].data[TDA_13] = 1;
+
+ while (TRUE)
+ {
+ if (sub_8144ECC(0, taskIdA))
+ break;
+ }
+
+ taskIdC = gTasks[taskIdA].data[TDA_TASK_C_ID];
+ gTasks[taskIdC].data[TDC_0] = 40;
+
+ SetUpWindowConfig(&gWindowConfig_81E7208);
+ InitMenuWindow(&gWindowConfig_81E7208);
+ LoadPalette(&gUnknown_0840B7BC, 0x80, sizeof(gUnknown_0840B7BC));
+
+ CpuCopy16(&gUnknown_0840B7FC, (void *)(VRAM + 0xBEE0), sizeof(gUnknown_0840B7FC));
+
+ REG_BG0VOFS = 0xFFFC;
+
+ taskIdB = CreateTask(task_b_81441B8, 0);
+
+ gTasks[taskIdB].data[TDB_TASK_A_ID] = taskIdA;
+ gTasks[taskIdA].data[TDA_TASK_B_ID] = taskIdB;
+
+ BeginNormalPaletteFade(-1, 0, 16, 0, 0);
+
+ savedIme = REG_IME;
+ REG_IME = 0;
+ REG_IE |= INTR_FLAG_VBLANK;
+ REG_IME = savedIme;
+ REG_DISPSTAT |= DISPSTAT_VBLANK_INTR;
+
+
+ SetVBlankCallback(vblank_8143948);
+ m4aSongNumStart(BGM_THANKFOR);
+ SetMainCallback2(sub_814395C);
+ gUnknown_02039325 = 0;
+
+ c000 = &ewram1c000;
+
+ sub_81458DC();
+
+ c000->unk88 = 0;
+ c000->unk8A = 0;
+ c000->unk8C = 0;
+
+ gUnknown_02039322 = taskIdA;
+}
+
+static void task_a_8143B38(u8 taskIdA)
+{
+ if (!gPaletteFade.active)
+ gTasks[taskIdA].func = task_a_8143B68;
+}
+
+static void task_a_8143B68(u8 taskIdA)
+{
+ u16 data11;
+
+ if (gTasks[taskIdA].data[TDA_4])
+ {
+ s16 taskIdC;
+
+ taskIdC = gTasks[taskIdA].data[TDA_TASK_C_ID];
+ gTasks[taskIdC].data[TDC_0] = 30;
+
+ gTasks[taskIdA].data[TDA_12] = 0x100;
+ gTasks[taskIdA].func = task_a_8143EBC;
+ return;
+ }
+
+ gUnknown_02039320 = 0;
+ data11 = gTasks[taskIdA].data[TDA_11];
+
+ if (gTasks[taskIdA].data[TDA_11] == 1)
+ {
+ gTasks[taskIdA].data[TDA_13] = data11;
+ gTasks[taskIdA].data[TDA_11] = 0;
+ BeginNormalPaletteFade(-1, 0, 0, 16, 0);
+ gTasks[taskIdA].func = task_a_8143BFC;
+ }
+ else if (gTasks[taskIdA].data[TDA_11] == 2)
+ {
+ gTasks[taskIdA].data[TDA_13] = data11;
+ gTasks[taskIdA].data[TDA_11] = 0;
+ BeginNormalPaletteFade(-1, 0, 0, 16, 0);
+ gTasks[taskIdA].func = task_a_8143CC0;
+ }
+}
+
+static void task_a_8143BFC(u8 taskIdA)
+{
+ if (!gPaletteFade.active)
+ {
+ REG_DISPCNT = 0;
+ sub_81450AC(taskIdA);
+ gTasks[taskIdA].func = task_a_80C9BFC;
+ }
+}
+
+static void task_a_80C9BFC(u8 taskIdA)
+{
+ u16 backup;
+
+ SetVBlankCallback(NULL);
+
+ if (sub_8144ECC(gTasks[taskIdA].data[TDA_7], taskIdA))
+ {
+ BeginNormalPaletteFade(-1, 0, 16, 0, 0);
+
+ backup = REG_IME;
+ REG_IME = 0;
+ REG_IE |= INTR_FLAG_VBLANK;
+ REG_IME = backup;
+ REG_DISPSTAT |= DISPSTAT_VBLANK_INTR;
+
+ SetVBlankCallback(vblank_8143948);
+ gTasks[taskIdA].func = task_a_8143B38;
+ }
+}
+
+static void task_a_8143CC0(u8 taskIdA)
+{
+ if (!gPaletteFade.active)
+ {
+ REG_DISPCNT = 0;
+ sub_81450AC(taskIdA);
+ gTasks[taskIdA].func = task_a_8143D04;
+ }
+}
+
+void task_a_8143D04(u8 taskIdA)
+{
+ switch (gMain.state)
+ {
+ default:
+ case 0:
+ {
+ u16 i;
+
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ gReservedSpritePaletteCount = 8;
+ LZ77UnCompVram(&gBirchHelpGfx, (void *)VRAM);
+ LZ77UnCompVram(&gBirchGrassTilemap, (void *)(VRAM + 0x3800));
+ LoadPalette(gBirchBagGrassPal[0] + 1, 1, 31 * 2);
+
+ for (i = 0; i < 0x800; i++)
+ HALL_OF_FAME_SHEET_0[i] = 0x11;
+ for (i = 0; i < 0x800; i++)
+ HALL_OF_FAME_SHEET_1[i] = 0x22;
+ for (i = 0; i < 0x800; i++)
+ HALL_OF_FAME_SHEET_2[i] = 0x33;
+
+ EWRAM_1F800[0] = 0;
+ EWRAM_1F800[1] = 0x53FF; // light yellow
+ EWRAM_1F800[2] = 0x529F; // light red
+ EWRAM_1F800[3] = 0x7E94; // light blue
+
+ LoadSpriteSheet(&gUnknown_0840CAA0);
+ LoadSpritePalette(&gUnknown_0840CAB0);
+
+ gMain.state += 1;
+ break;
+ }
+ case 1:
+ gTasks[taskIdA].data[TDA_TASK_D_ID] = CreateTask(task_d_8144514, 0);
+ gTasks[gTasks[taskIdA].data[TDA_TASK_D_ID]].data[TDD_STATE] = 1;
+ gTasks[gTasks[taskIdA].data[TDA_TASK_D_ID]].data[TDD_TASK_A_ID] = taskIdA;
+ gTasks[gTasks[taskIdA].data[TDA_TASK_D_ID]].data[TDD_2] = gTasks[taskIdA].data[TDA_7];
+
+ BeginNormalPaletteFade(-1, 0, 16, 0, 0);
+ REG_BG3HOFS = 0;
+ REG_BG3VOFS = 32;
+ REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(7) | BGCNT_16COLOR | BGCNT_TXT256x256;
+ REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON;
+
+ gMain.state = 0;
+ gUnknown_0203935C = 0;
+ gTasks[taskIdA].func = task_a_8143B38;
+ break;
+ }
+}
+
+static void task_a_8143EBC(u8 taskIdA)
+{
+ if (gTasks[taskIdA].data[TDA_12])
+ {
+ gTasks[taskIdA].data[TDA_12] -= 1;
+ return;
+ }
+
+ BeginNormalPaletteFade(-1, 12, 0, 16, 0);
+ gTasks[taskIdA].func = task_a_8143F04;
+}
+
+static void task_a_8143F04(u8 taskIdA)
+{
+ if (!gPaletteFade.active)
+ {
+ sub_81450AC(taskIdA);
+ gTasks[taskIdA].func = task_a_8143F3C;
+ }
+}
+
+static void task_a_8143F3C(u8 taskIdA)
+{
+ u16 backup;
+
+ sub_8144130();
+ ResetPaletteFade();
+ sub_8145128(0, 0x3800, 0);
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ BeginNormalPaletteFade(-1, 8, 16, 0, 0);
+
+ REG_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(7) | BGCNT_16COLOR | BGCNT_TXT256x256;
+ backup = REG_IME;
+ REG_IME = 0;
+ REG_IE |= INTR_FLAG_VBLANK;
+ REG_IME = backup;
+ REG_DISPSTAT |= DISPSTAT_VBLANK_INTR;
+ REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON;
+
+ gTasks[taskIdA].data[TDA_0] = 0x100;
+ gTasks[taskIdA].func = task_a_8143FDC;
+}
+
+static void task_a_8143FDC(u8 taskIdA)
+{
+ if (gTasks[taskIdA].data[TDA_0])
+ {
+ gTasks[taskIdA].data[TDA_0] -= 1;
+ return;
+ }
+
+ BeginNormalPaletteFade(-1, 6, 0, 16, 0);
+ gTasks[taskIdA].func = task_a_8144024;
+}
+
+static void task_a_8144024(u8 taskIdA)
+{
+ if (!gPaletteFade.active)
+ {
+ sub_81452D0(0x3800, 0);
+
+ BeginNormalPaletteFade(-1, 0, 0, 0, 0);
+ gTasks[taskIdA].data[TDA_0] = 7200;
+ gTasks[taskIdA].func = task_a_8144080;
+ }
+}
+
+static void task_a_8144080(u8 taskIdA)
+{
+ if (!gPaletteFade.active)
+ {
+ if (gTasks[taskIdA].data[TDA_0] == 0)
+ {
+ FadeOutBGM(4);
+ BeginNormalPaletteFade(-1, 8, 0, 16, 0xFFFF);
+ gTasks[taskIdA].func = task_a_8144114;
+ return;
+ }
+
+ if (gMain.newKeys)
+ {
+ FadeOutBGM(4);
+ BeginNormalPaletteFade(-1, 8, 0, 16, 0xFFFF);
+ gTasks[taskIdA].func = task_a_8144114;
+ return;
+ }
+
+ if (gTasks[taskIdA].data[TDA_0] == 7144)
+ {
+ FadeOutBGM(8);
+ }
+
+ if (gTasks[taskIdA].data[TDA_0] == 6840)
+ m4aSongNumStart(BGM_END);
+
+ gTasks[taskIdA].data[TDA_0] -= 1;
+ }
+}
+
+static void task_a_8144114(u8 taskIdA)
+{
+ if (!gPaletteFade.active)
+ SoftReset(0xFF);
+}
+
+static void sub_8144130(void)
+{
+ REG_DISPCNT = 0;
+
+ REG_BG3HOFS = 0;
+ REG_BG3VOFS = 0;
+ REG_BG2HOFS = 0;
+ REG_BG2VOFS = 0;
+ REG_BG1HOFS = 0;
+ REG_BG1VOFS = 0;
+ REG_BG0HOFS = 0;
+ REG_BG0VOFS = 0;
+
+ REG_BLDCNT = 0;
+ REG_BLDALPHA = 0;
+ REG_BLDY = 0;
+
+ DmaFill16(3, 0, (void *)VRAM, VRAM_SIZE);
+ DmaFill32(3, 0, (void *)OAM, OAM_SIZE);
+ DmaFill16(3, 0, (void *)(PLTT + 2), PLTT_SIZE - 2);
+}
+
+static void task_b_81441B8(u8 taskIdB)
+{
+ u16 i;
+
+ switch (gTasks[taskIdB].data[TDB_0])
+ {
+ case 0:
+ case 6:
+ case 7:
+ case 8:
+ case 9:
+ default:
+ if (!gPaletteFade.active)
+ {
+ gTasks[taskIdB].data[TDB_0] = 1;
+ gTasks[taskIdB].data[TDB_3] = 0x58;
+ gTasks[gTasks[taskIdB].data[TDB_TASK_A_ID]].data[TDA_14] = 0;
+ gUnknown_02039320 = 0;
+ }
+ return;
+ case 1:
+ if (gTasks[taskIdB].data[TDB_3] != 0)
+ {
+ gTasks[taskIdB].data[TDB_3] -= 1;
+ return;
+ }
+ gTasks[taskIdB].data[TDB_0] += 1;
+ return;
+ case 2:
+ REG_DISPCNT &= ~DISPCNT_BG0_ON;
+ if (gTasks[gTasks[taskIdB].data[TDB_TASK_A_ID]].func == task_a_8143B68)
+ {
+ if (gTasks[taskIdB].data[TDB_CURRENT_PAGE] < PAGE_COUNT)
+ {
+ for (i = 0; i < 5; i++)
+ sub_8072BD8(gCreditsEntryPointerTable[gTasks[taskIdB].data[TDB_CURRENT_PAGE]][i]->text, 0, 9 + i * 2, 240);
+
+ gTasks[taskIdB].data[TDB_CURRENT_PAGE] += 1;
+ gTasks[taskIdB].data[TDB_0] += 1;
+
+ gTasks[gTasks[taskIdB].data[TDB_TASK_A_ID]].data[TDA_14] = 1;
+
+ if (gTasks[gTasks[taskIdB].data[TDB_TASK_A_ID]].data[TDA_13] == 1)
+ BeginNormalPaletteFade(0x300, 0, 16, 0, COLOR_LIGHT_GREEN);
+ else
+ BeginNormalPaletteFade(0x300, 0, 16, 0, COLOR_DARK_GREEN);
+ return;
+ }
+ gTasks[taskIdB].data[TDB_0] = 10;
+ return;
+ }
+ gTasks[gTasks[taskIdB].data[TDB_TASK_A_ID]].data[TDA_14] = 0;
+ return;
+ case 3:
+ REG_DISPCNT |= DISPCNT_BG0_ON;
+ if (!gPaletteFade.active)
+ {
+ gTasks[taskIdB].data[TDB_3] = UNK_DEFINE_82;
+ gTasks[taskIdB].data[TDB_0] += 1;
+ }
+ return;
+ case 4:
+ if (gTasks[taskIdB].data[TDB_3] != 0)
+ {
+ gTasks[taskIdB].data[TDB_3] -= 1;
+ return;
+ }
+
+ if (sub_8144454((u8)gTasks[taskIdB].data[TDB_CURRENT_PAGE], (u8)gTasks[taskIdB].data[TDB_TASK_A_ID]))
+ {
+ gTasks[taskIdB].data[TDB_0] += 1;
+ return;
+ }
+ gTasks[taskIdB].data[TDB_0] += 1;
+ if (gTasks[gTasks[taskIdB].data[TDB_TASK_A_ID]].data[TDA_13] == 1)
+ BeginNormalPaletteFade(0x300, 0, 0, 16, COLOR_LIGHT_GREEN);
+ else
+ BeginNormalPaletteFade(0x300, 0, 0, 16, COLOR_DARK_GREEN);
+ return;
+ case 5:
+ if (!gPaletteFade.active)
+ {
+ MenuZeroFillWindowRect(0, 9, 29, 19);
+ gTasks[taskIdB].data[TDB_0] = 2;
+ }
+ return;
+
+ case 10:
+ gTasks[gTasks[taskIdB].data[TDB_TASK_A_ID]].data[TDA_4] = 1;
+ DestroyTask(taskIdB);
+ return;
+ }
+}
+
+static u8 sub_8144454(u8 page, u8 taskIdA)
+{
+ // Starts with bike + ocean + morning
+
+ if (page == PAGE_PROGRAMMERS_1)
+ {
+ // Grass patch
+ gTasks[taskIdA].data[TDA_11] = 2;
+ }
+
+ if (page == PAGE_POKEMON_GRAHPIC_DESIGNERS_3)
+ {
+ // Bike + ocean + sunset
+ gTasks[taskIdA].data[TDA_7] = 1;
+ gTasks[taskIdA].data[TDA_11] = 1;
+ }
+
+ if (page == PAGE_GAME_DESIGNERS_2)
+ {
+ // Grass patch
+ gTasks[taskIdA].data[TDA_11] = 2;
+ }
+
+ if (page == PAGE_MAP_DATA_DESIGNERS)
+ {
+ // Bike + forest + sunset
+ gTasks[taskIdA].data[TDA_7] = 2;
+ gTasks[taskIdA].data[TDA_11] = 1;
+ }
+
+ if (page == PAGE_SPECIAL_THANKS_1)
+ {
+ // Grass patch
+ gTasks[taskIdA].data[TDA_11] = 2;
+ }
+
+ if (page == PAGE_TASK_MANAGERS)
+ {
+ // Bike + forest + sunset
+ gTasks[taskIdA].data[TDA_7] = 3;
+ gTasks[taskIdA].data[TDA_11] = 1;
+ }
+
+ if (page == PAGE_TRANSLATION_COORDINATOR)
+ {
+ // Grass patch
+ gTasks[taskIdA].data[TDA_11] = 2;
+ }
+
+ if (page == LAST_PAGE)
+ {
+ // Bike + town + night
+ gTasks[taskIdA].data[TDA_7] = 4;
+ gTasks[taskIdA].data[TDA_11] = 1;
+ }
+
+ if (gTasks[taskIdA].data[TDA_11] != 0)
+ {
+ // Returns true if changed?
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static void task_d_8144514(u8 taskIdD)
+{
+ struct Unk201C000 *r6 = &ewram1c000;
+ u8 r2;
+
+ switch (gTasks[taskIdD].data[TDD_STATE])
+ {
+ case 0:
+ break;
+ case 1:
+ if (r6->unk8A == 0 && gTasks[gTasks[taskIdD].data[TDD_TASK_A_ID]].data[TDA_14] == 0)
+ break;
+ gTasks[gTasks[taskIdD].data[TDD_TASK_A_ID]].data[TDA_14] = 0;
+ gTasks[taskIdD].data[TDD_STATE]++;
+ break;
+ case 2:
+ if (r6->unk88 == POKEMON_TILE_COUNT || gTasks[gTasks[taskIdD].data[TDD_TASK_A_ID]].func != task_a_8143B68)
+ break;
+ r2 = sub_81456B4(r6->unk0[r6->unk8C], gUnknown_0840CA00[r6->unk8A][0], gUnknown_0840CA00[r6->unk8A][1], r6->unk8A);
+ if (r6->unk8C < r6->unk8E - 1)
+ {
+ r6->unk8C++;
+ gSprites[r2].data3 = 50;
+ }
+ else
+ {
+ r6->unk8C = 0;
+ gSprites[r2].data3 = 512;
+ }
+ r6->unk88++;
+ if (r6->unk8A == 2)
+ r6->unk8A = 0;
+ else
+ r6->unk8A++;
+ gTasks[taskIdD].data[TDD_3] = 50;
+ gTasks[taskIdD].data[TDD_STATE]++;
+ break;
+ case 3:
+ if (gTasks[taskIdD].data[TDD_3] != 0)
+ gTasks[taskIdD].data[TDD_3]--;
+ else
+ gTasks[taskIdD].data[TDD_STATE] = 1;
+ break;
+ }
+}
+
+void task_c_8144664(u8 taskIdC)
+{
+ switch (gTasks[taskIdC].data[TDC_0])
+ {
+ case 0:
+ gUnknown_0203935A = Sin((gTasks[taskIdC].data[TDC_5] >> 1) & 0x7F, 12);
+ gTasks[taskIdC].data[TDC_5]++;
+ break;
+ case 1:
+ if (gUnknown_0203935A != 0)
+ {
+ gUnknown_0203935A = Sin((gTasks[taskIdC].data[TDC_5] >> 1) & 0x7F, 12);
+ gTasks[taskIdC].data[TDC_5]++;
+ }
+ else
+ {
+ gSprites[gTasks[taskIdC].data[TDC_2]].data0 = 2;
+ gTasks[taskIdC].data[TDC_5] = 0;
+ gTasks[taskIdC].data[TDC_0]++;
+ }
+ break;
+ case 2:
+ if (gTasks[taskIdC].data[TDC_5] < 64)
+ {
+ gTasks[taskIdC].data[TDC_5]++;
+ gUnknown_0203935A = Sin(gTasks[taskIdC].data[TDC_5] & 0x7F, 20);
+ }
+ else
+ {
+ gTasks[taskIdC].data[TDC_0]++;
+ }
+ break;
+ case 3:
+ gSprites[gTasks[taskIdC].data[TDC_2]].data0 = 3;
+ gSprites[gTasks[taskIdC].data[TDC_3]].data0 = 1;
+ gTasks[taskIdC].data[TDC_4] = 120;
+ gTasks[taskIdC].data[TDC_0]++;
+ break;
+ case 4:
+ if (gTasks[taskIdC].data[TDC_4] != 0)
+ {
+ gTasks[taskIdC].data[TDC_4]--;
+ }
+ else
+ {
+ gTasks[taskIdC].data[TDC_5] = 64;
+ gTasks[taskIdC].data[TDC_0]++;
+ }
+ break;
+ case 5:
+ if (gTasks[taskIdC].data[TDC_5] > 0)
+ {
+ gTasks[taskIdC].data[TDC_5]--;
+ gUnknown_0203935A = Sin(gTasks[taskIdC].data[TDC_5] & 0x7F, 20);
+ }
+ else
+ {
+ gSprites[gTasks[taskIdC].data[TDC_2]].data0 = 1;
+ gTasks[taskIdC].data[TDC_0]++;
+ }
+ break;
+ case 6:
+ gTasks[taskIdC].data[TDC_0] = 50;
+ break;
+ case 10:
+ gSprites[gTasks[taskIdC].data[TDC_3]].data0 = 2;
+ gTasks[taskIdC].data[TDC_0] = 50;
+ break;
+ case 20:
+ gSprites[gTasks[taskIdC].data[TDC_2]].data0 = 4;
+ gTasks[taskIdC].data[TDC_0] = 50;
+ break;
+ case 30:
+ gSprites[gTasks[taskIdC].data[TDC_2]].data0 = 5;
+ gSprites[gTasks[taskIdC].data[TDC_3]].data0 = 3;
+ gTasks[taskIdC].data[TDC_0] = 50;
+ break;
+ case 50:
+ gTasks[taskIdC].data[TDC_0] = 0;
+ break;
+ }
+}
+
+void task_e_8144934(u8 taskIdE)
+{
+ s16 taskIdC;
+
+ switch (gTasks[taskIdE].data[TDE_0])
+ {
+ default:
+ case 0:
+ if (gTasks[taskIdE].data[TDE_1] != 0x7FFF)
+ {
+
+ if (gTasks[gTasks[gTasks[taskIdE].data[TDE_TASK_A_ID]].data[TDA_TASK_B_ID]].data[TDB_CURRENT_PAGE] == PAGE_ART_DIRECTOR)
+ {
+ gTasks[gTasks[gTasks[taskIdE].data[TDE_TASK_A_ID]].data[TDA_TASK_C_ID]].data[TDC_0] = 20;
+ gTasks[taskIdE].data[TDE_1] = 0x7FFF;
+ }
+ }
+ sub_8149020(0);
+ break;
+ case 1:
+ sub_8149020(0);
+ break;
+ case 2:
+ if (gTasks[taskIdE].data[TDE_1] != 0x7FFF)
+ {
+ taskIdC = gTasks[gTasks[taskIdE].data[TDE_TASK_A_ID]].data[TDA_TASK_C_ID];
+
+ // Floor to multiple of 128
+ if ((gTasks[taskIdC].data[TDC_5] & -128) == 640)
+ {
+ gTasks[taskIdC].data[TDC_0] = 1;
+ gTasks[taskIdE].data[TDE_1] = 0x7FFF;
+ }
+ }
+ sub_8149020(1);
+ break;
+ case 3:
+ if (gTasks[taskIdE].data[TDE_1] != 0x7FFF)
+ {
+
+ if (gTasks[taskIdE].data[TDE_1] == UNK_DEF_1F3)
+ {
+ gTasks[gTasks[gTasks[taskIdE].data[TDE_TASK_A_ID]].data[TDA_TASK_C_ID]].data[TDC_0] = 10;
+ gTasks[taskIdE].data[TDE_1] = 0x7FFF;
+ }
+ else
+ {
+ gTasks[taskIdE].data[TDE_1] += 1;
+ }
+ }
+ sub_8149020(1);
+ break;
+ case 4:
+ sub_8149020(2);
+ break;
+ }
+}
+
+static void sub_8144A68(u8 data, u8 taskIdA)
+{
+ switch (data)
+ {
+ case 0:
+ gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].invisible = 0;
+ gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].invisible = 0;
+ gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.x = 272;
+ gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.x = 272;
+ gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.y = 46;
+ gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.y = 46;
+ gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].data0 = 0;
+ gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].data0 = 0;
+ gTasks[taskIdA].data[TDA_0] = sub_8148EC0(0, 0x2000, 0x20, 8);
+ break;
+ case 1:
+ gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].invisible = 0;
+ gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].invisible = 0;
+ gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.x = 120;
+ gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.x = 272;
+ gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.y = 46;
+ gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.y = 46;
+ gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].data0 = 0;
+ gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].data0 = 0;
+ gTasks[taskIdA].data[TDA_0] = sub_8148EC0(0, 0x2000, 0x20, 8);
+ break;
+ case 2:
+ gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].invisible = 0;
+ gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].invisible = 0;
+ gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.x = 120;
+ gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.x = 272;
+ gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.y = 46;
+ gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.y = 46;
+ gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].data0 = 0;
+ gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].data0 = 0;
+ gTasks[taskIdA].data[TDA_0] = sub_8148EC0(1, 0x2000, 0x200, 8);
+ break;
+ case 3:
+ gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].invisible = 0;
+ gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].invisible = 0;
+ gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.x = 120;
+ gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.x = -32;
+ gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.y = 46;
+ gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.y = 46;
+ gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].data0 = 0;
+ gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].data0 = 0;
+ gTasks[taskIdA].data[TDA_0] = sub_8148EC0(1, 0x2000, 0x200, 8);
+ break;
+ case 4:
+ gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].invisible = 0;
+ gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].invisible = 0;
+ gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.x = 88;
+ gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.x = 152;
+ gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.y = 46;
+ gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.y = 46;
+ gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].data0 = 0;
+ gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].data0 = 0;
+ gTasks[taskIdA].data[TDA_0] = sub_8148EC0(2, 0x2000, 0x200, 8);
+ break;
+ }
+
+ gTasks[taskIdA].data[TDA_TASK_E_ID] = CreateTask(task_e_8144934, 0);
+ gTasks[gTasks[taskIdA].data[TDA_TASK_E_ID]].data[TDE_0] = data;
+ gTasks[gTasks[taskIdA].data[TDA_TASK_E_ID]].data[TDE_1] = 0;
+ gTasks[gTasks[taskIdA].data[TDA_TASK_E_ID]].data[TDE_TASK_A_ID] = taskIdA;
+
+ gTasks[taskIdA].data[TDA_TASK_C_ID] = CreateTask(task_c_8144664, 0);
+ gTasks[gTasks[taskIdA].data[TDA_TASK_C_ID]].data[TDC_0] = 0;
+ gTasks[gTasks[taskIdA].data[TDA_TASK_C_ID]].data[TDC_1] = taskIdA;
+ gTasks[gTasks[taskIdA].data[TDA_TASK_C_ID]].data[TDC_2] = gTasks[taskIdA].data[TDA_PLAYER_CYCLIST];
+ gTasks[gTasks[taskIdA].data[TDA_TASK_C_ID]].data[TDC_3] = gTasks[taskIdA].data[TDA_RIVAL_CYCLIST];
+ gTasks[gTasks[taskIdA].data[TDA_TASK_C_ID]].data[TDC_4] = 0;
+
+ if (data == 2)
+ gTasks[gTasks[taskIdA].data[TDA_TASK_C_ID]].data[TDC_5] = UNK_DEFINE_45;
+}
+
+static bool8 sub_8144ECC(u8 data, u8 taskIdA)
+{
+ u8 spriteId;
+
+ switch (gMain.state)
+ {
+ default:
+ case 0:
+ REG_DISPCNT = 0;
+ REG_BG3HOFS = 8;
+ REG_BG3VOFS = 0;
+ REG_BG2HOFS = 0;
+ REG_BG2VOFS = 0;
+ REG_BG1HOFS = 0;
+ REG_BG1VOFS = 0;
+ REG_BLDCNT = 0;
+ REG_BLDALPHA = 0;
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ gMain.state = 1;
+ break;
+ case 1:
+ gUnknown_02039358 = 34;
+ gUnknown_0203935A = 0;
+ sub_8148CB0(data);
+ gMain.state += 1;
+ break;
+ case 2:
+ if (gSaveBlock2.playerGender == MALE)
+ {
+ LoadCompressedObjectPic(&gIntro2BrendanSpriteSheet);
+ LoadCompressedObjectPic(&gUnknown_08416E34);
+ LoadCompressedObjectPic(&gIntro2BicycleSpriteSheet);
+ LoadSpritePalettes(gIntro2SpritePalettes);
+
+ spriteId = intro_create_brendan_sprite(120, 46);
+ gTasks[taskIdA].data[TDA_PLAYER_CYCLIST] = spriteId;
+ gSprites[spriteId].callback = spritecb_player_8145378;
+ gSprites[spriteId].anims = gSpriteAnimTable_0840CA54;
+
+ spriteId = intro_create_may_sprite(272, 46);
+ gTasks[taskIdA].data[TDA_RIVAL_CYCLIST] = spriteId;
+ gSprites[spriteId].callback = spritecb_rival_8145420;
+ gSprites[spriteId].anims = gSpriteAnimTable_0840CA94;
+ }
+ else
+ {
+ LoadCompressedObjectPic(&gIntro2MaySpriteSheet);
+ LoadCompressedObjectPic(&gUnknown_08416E24);
+ LoadCompressedObjectPic(&gIntro2BicycleSpriteSheet);
+ LoadSpritePalettes(gIntro2SpritePalettes);
+
+ spriteId = intro_create_may_sprite(120, 46);
+ gTasks[taskIdA].data[TDA_PLAYER_CYCLIST] = spriteId;
+ gSprites[spriteId].callback = spritecb_player_8145378;
+ gSprites[spriteId].anims = gSpriteAnimTable_0840CA54;
+
+ spriteId = intro_create_brendan_sprite(272, 46);
+ gTasks[taskIdA].data[TDA_RIVAL_CYCLIST] = spriteId;
+ gSprites[spriteId].callback = spritecb_rival_8145420;
+ gSprites[spriteId].anims = gSpriteAnimTable_0840CA94;
+ };
+ gMain.state += 1;
+ break;
+ case 3:
+ sub_8144A68(data, taskIdA);
+ sub_8148E90(data);
+ gMain.state = 0;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void sub_81450AC(u8 taskIdA)
+{
+ if (gTasks[taskIdA].data[TDA_0] != 0)
+ {
+ DestroyTask(gTasks[taskIdA].data[TDA_0]);
+ gTasks[taskIdA].data[TDA_0] = 0;
+ }
+
+ if (gTasks[taskIdA].data[TDA_TASK_C_ID] != 0)
+ {
+ DestroyTask(gTasks[taskIdA].data[TDA_TASK_C_ID]);
+ gTasks[taskIdA].data[TDA_TASK_C_ID] = 0;
+ }
+
+ if (gTasks[taskIdA].data[TDA_TASK_E_ID] != 0)
+ {
+ DestroyTask(gTasks[taskIdA].data[TDA_TASK_E_ID]);
+ gTasks[taskIdA].data[TDA_TASK_E_ID] = 0;
+ }
+
+ if (gTasks[taskIdA].data[TDA_TASK_D_ID] != 0)
+ {
+ DestroyTask(gTasks[taskIdA].data[TDA_TASK_D_ID]);
+ gTasks[taskIdA].data[TDA_TASK_D_ID] = 0;
+ }
+
+ gUnknown_0203935C = 1;
+}
+
+static void sub_8145128(u16 arg0, u16 arg1, u16 arg2)
+{
+ u16 baseTile;
+ u16 i;
+
+ LZ77UnCompVram(gCreditsCopyrightEnd_Gfx, (void *) (VRAM + arg0));
+ LoadPalette(gIntroCopyright_Pal, arg2, sizeof(gIntroCopyright_Pal));
+
+ baseTile = (arg2 / 16) << 12;
+
+ for (i = 0; i < 32 * 32; i++)
+ ((u16 *) (VRAM + arg1))[i] = baseTile + 1;
+
+ for (i = 0; i < 21; i++)
+ ((u16 *) (VRAM + arg1))[7 * 32 + 4 + i] = i + 2 + baseTile;
+
+ for (i = 0; i < 20; i++)
+ ((u16 *) (VRAM + arg1))[9 * 32 + 4 + i] = i + 23 + baseTile;
+
+ for (i = 0; i < 23; i++)
+ ((u16 *) (VRAM + arg1))[11 * 32 + 4 + i] = i + 43 + baseTile;
+
+ for (i = 0; i < 12; i++)
+ ((u16 *) (VRAM + arg1))[13 * 32 + 4 + i] = i + 66 + baseTile;
+}
+
+u16 sub_8145208(u8 arg0)
+{
+ u16 out = (arg0 & 0x3F) + 80;
+
+ if (arg0 == 0xFF)
+ return 1;
+
+ if (arg0 & (1 << 7))
+ out |= 1 << 11;
+ if (arg0 & (1 << 6))
+ out |= 1 << 10;
+
+ return out;
+}
+
+void sub_814524C(u8 arg0[], u8 baseX, u8 baseY, u16 arg3, u16 palette)
+{
+ u8 y, x;
+ const u16 tileOffset = (palette / 16) << 12;
+
+ for (y = 0; y < 5; y++)
+ {
+ for (x = 0; x < 3; x++)
+ ((u16 *) (VRAM + arg3 + (baseY + y) * 64))[baseX + x] = tileOffset + sub_8145208(arg0[y * 3 + x]);
+ }
+}
+
+static void sub_81452D0(u16 arg0, u16 palette)
+{
+ u16 pos;
+ u16 baseTile = (palette / 16) << 12;
+
+ for (pos = 0; pos < 32 * 32; pos++)
+ ((u16 *) (VRAM + arg0))[pos] = baseTile + 1;
+
+#if ENGLISH
+ sub_814524C(gUnknown_0840B83C, 3, 7, arg0, palette);
+ sub_814524C(gUnknown_0840B84B, 7, 7, arg0, palette);
+ sub_814524C(gUnknown_0840B85A, 11, 7, arg0, palette);
+ sub_814524C(gUnknown_0840B85A, 16, 7, arg0, palette);
+ sub_814524C(gUnknown_0840B869, 20, 7, arg0, palette);
+ sub_814524C(gUnknown_0840B878, 24, 7, arg0, palette);
+#elif GERMAN
+ sub_814524C(gUnknown_0840B85A, 7, 7, arg0, palette);
+ sub_814524C(gUnknown_0840B869, 11, 7, arg0, palette);
+ sub_814524C(gUnknown_0840B878, 15, 7, arg0, palette);
+ sub_814524C(gUnknown_0840B85A, 19, 7, arg0, palette);
+#endif
+}
+
+static void spritecb_player_8145378(struct Sprite *sprite)
+{
+ if (gUnknown_0203935C != 0)
+ {
+ DestroySprite(sprite);
+ return;
+ }
+
+ switch (sprite->data0)
+ {
+ case 0:
+ StartSpriteAnimIfDifferent(sprite, 0);
+ break;
+ case 1:
+ StartSpriteAnimIfDifferent(sprite, 1);
+ if (sprite->pos1.x > -32)
+ sprite->pos1.x -= 1;
+ break;
+ case 2:
+ StartSpriteAnimIfDifferent(sprite, 2);
+ break;
+ case 3:
+ StartSpriteAnimIfDifferent(sprite, 3);
+ break;
+ case 4:
+ StartSpriteAnimIfDifferent(sprite, 0);
+ if (sprite->pos1.x > 120)
+ sprite->pos1.x -= 1;
+ break;
+ case 5:
+ StartSpriteAnimIfDifferent(sprite, 0);
+ if (sprite->pos1.x > -32)
+ sprite->pos1.x -= 1;
+ break;
+ }
+}
+
+static void spritecb_rival_8145420(struct Sprite *sprite)
+{
+ if (gUnknown_0203935C != 0)
+ {
+ DestroySprite(sprite);
+ return;
+ }
+
+ switch (sprite->data0)
+ {
+ case 0:
+ sprite->pos2.y = 0;
+ StartSpriteAnimIfDifferent(sprite, 0);
+ break;
+ case 1:
+ if (sprite->pos1.x > 200)
+ StartSpriteAnimIfDifferent(sprite, 1);
+ else
+ StartSpriteAnimIfDifferent(sprite, 2);
+ if (sprite->pos1.x > -32)
+ sprite->pos1.x -= 2;
+ sprite->pos2.y = -gUnknown_0203935A;
+ break;
+ case 2:
+ sprite->data7 += 1;
+ StartSpriteAnimIfDifferent(sprite, 0);
+ if ((sprite->data7 & 3) == 0)
+ sprite->pos1.x += 1;
+ break;
+ case 3:
+ StartSpriteAnimIfDifferent(sprite, 0);
+ if (sprite->pos1.x > -32)
+ sprite->pos1.x -= 1;
+ break;
+ }
+}
+
+void spritecb_81454E0(struct Sprite *sprite)
+{
+ if (gUnknown_0203935C)
+ {
+ DestroySprite(sprite);
+ return;
+ }
+
+ sprite->data7 += 1;
+ switch (sprite->data0)
+ {
+ case 0:
+ default:
+ sprite->oam.affineMode = 1;
+ sprite->oam.matrixNum = sprite->data1;
+ sprite->data2 = 16;
+ SetOamMatrix(sprite->data1, 0x10000 / sprite->data2, 0, 0, 0x10000 / sprite->data2);
+ sprite->invisible = FALSE;
+ sprite->data0 = 1;
+ break;
+ case 1:
+ if (sprite->data2 < 256)
+ {
+ sprite->data2 += 8;
+ SetOamMatrix(sprite->data1, 0x10000 / sprite->data2, 0, 0, 0x10000 / sprite->data2);
+ }
+ else
+ {
+ sprite->data0 += 1;
+ }
+ switch (sprite->data1)
+ {
+ case 1:
+ if ((sprite->data7 & 3) == 0)
+ sprite->pos1.y += 1;
+ sprite->pos1.x -= 2;
+ break;
+ case 2:
+ break;
+ case 3:
+ if ((sprite->data7 & 3) == 0)
+ sprite->pos1.y += 1;
+ sprite->pos1.x += 2;
+ break;
+ }
+ break;
+ case 2:
+ if (sprite->data3 != 0)
+ {
+ sprite->data3 -= 1;
+ }
+ else
+ {
+ REG_BLDCNT = 0xF40;
+ REG_BLDALPHA = 0x10;
+ sprite->oam.objMode = 1;
+ sprite->data3 = 16;
+ sprite->data0 += 1;
+ }
+ break;
+ case 3:
+ if (sprite->data3 != 0)
+ {
+ int data3;
+ vu16 *reg;
+
+ sprite->data3 -= 1;
+
+ reg = &REG_BLDALPHA;
+ data3 = 16 - sprite->data3;
+ *reg = (data3 << 8) + sprite->data3;
+ }
+ else
+ {
+ sprite->invisible = TRUE;
+ sprite->data0 = 10;
+ }
+ break;
+ case 10:
+ REG_BLDCNT = 0;
+ REG_BLDALPHA = 0;
+ DestroySprite(sprite);
+ break;
+ }
+}
+
+static u8 sub_81456B4(u16 species, u16 x, u16 y, u16 position)
+{
+ u32 personality;
+ const u8 *lzPaletteData;
+ u8 spriteId;
+ u8 spriteId2;
+
+ species = NationalPokedexNumToSpecies(species);
+ switch (species)
+ {
+ default:
+ personality = 0;
+ break;
+ case SPECIES_SPINDA:
+ personality = gSaveBlock2.pokedex.spindaPersonality;
+ break;
+ case SPECIES_UNOWN:
+ personality = gSaveBlock2.pokedex.unownPersonality;
+ break;
+ }
+
+ LoadSpecialPokePic(
+ &gMonFrontPicTable[species],
+ gMonFrontPicCoords[species].coords,
+ gMonFrontPicCoords[species].y_offset,
+ 0x2000000,
+ gUnknown_0840B5A0[position],
+ species,
+ personality,
+ 1
+ );
+
+ lzPaletteData = GetMonSpritePalFromOtIdPersonality(species, 0, 0xFFFF);
+ LoadCompressedPalette(lzPaletteData, 0x100 + (position * 16), 0x20);
+ sub_8143648(position, position);
+
+ spriteId = CreateSprite(&gUnknown_02024E8C, x, y, 0);
+ gSprites[spriteId].oam.paletteNum = position;
+ gSprites[spriteId].oam.priority = 1;
+ gSprites[spriteId].data1 = position + 1;
+ gSprites[spriteId].invisible = TRUE;
+ gSprites[spriteId].callback = spritecb_81454E0;
+
+ spriteId2 = CreateSprite(&gSpriteTemplate_840CAEC, gSprites[spriteId].pos1.x, gSprites[spriteId].pos1.y, 1);
+ gSprites[spriteId2].data0 = spriteId;
+
+ StartSpriteAnimIfDifferent(&gSprites[spriteId2], position);
+
+ return spriteId;
+}
+
+void spritecb_814580C(struct Sprite *sprite)
+{
+ if (gSprites[sprite->data0].data0 == 10 || gUnknown_0203935C)
+ {
+ DestroySprite(sprite);
+ return;
+ }
+
+ sprite->invisible = gSprites[sprite->data0].invisible;
+ sprite->oam.objMode = gSprites[sprite->data0].oam.objMode;
+ sprite->oam.affineMode = gSprites[sprite->data0].oam.affineMode;
+ sprite->oam.matrixNum = gSprites[sprite->data0].oam.matrixNum;
+ sprite->pos1.x = gSprites[sprite->data0].pos1.x;
+ sprite->pos1.y = gSprites[sprite->data0].pos1.y;
+}
+
+static void sub_81458DC(void)
+{
+ struct Unk201C000 *unk201C000 = &ewram1c000;
+ u16 starter = SpeciesToNationalPokedexNum(GetStarterPokemon(VarGet(VAR_FIRST_POKE)));
+ u16 seenTypesCount;
+ u16 page;
+ u16 dexNum;
+ u16 j;
+
+ for (dexNum = 1, seenTypesCount = 0; dexNum < 386; dexNum++)
+ {
+ if (GetSetPokedexFlag(dexNum, 1))
+ {
+ unk201C000->unk90[seenTypesCount] = dexNum;
+ seenTypesCount++;
+ }
+ }
+
+ for (dexNum = seenTypesCount; dexNum < 386; dexNum++)
+ unk201C000->unk90[dexNum] = 0;
+
+ unk201C000->unk394 = seenTypesCount;
+ if (unk201C000->unk394 < POKEMON_TILE_COUNT)
+ unk201C000->unk8E = seenTypesCount;
+ else
+ unk201C000->unk8E = POKEMON_TILE_COUNT;
+
+ j = 0;
+ do
+ {
+ page = Random() % unk201C000->unk394;
+ unk201C000->unk0[j] = unk201C000->unk90[page];
+
+ j++;
+ unk201C000->unk90[page] = 0;
+ unk201C000->unk394--;
+ if (page != unk201C000->unk394)
+ {
+ unk201C000->unk90[page] = unk201C000->unk90[unk201C000->unk394];
+ unk201C000->unk90[unk201C000->unk394] = 0;
+ }
+ }
+ while (unk201C000->unk394 != 0 && j < POKEMON_TILE_COUNT);
+
+ if (unk201C000->unk8E < POKEMON_TILE_COUNT)
+ {
+ for (j = unk201C000->unk8E, page = 0; j < POKEMON_TILE_COUNT; j++)
+ {
+ unk201C000->unk0[j] = unk201C000->unk0[page];
+
+ page++;
+ if (page == unk201C000->unk8E)
+ page = 0;
+ }
+ unk201C000->unk0[POKEMON_TILE_COUNT - 1] = starter;
+ }
+ else
+ {
+ for (dexNum = 0; unk201C000->unk0[dexNum] != starter && dexNum < POKEMON_TILE_COUNT; dexNum++);
+
+ if (dexNum < unk201C000->unk8E - 1)
+ {
+ unk201C000->unk0[dexNum] = unk201C000->unk0[POKEMON_TILE_COUNT - 1];
+ unk201C000->unk0[POKEMON_TILE_COUNT - 1] = starter;
+ }
+ else
+ {
+ unk201C000->unk0[POKEMON_TILE_COUNT - 1] = starter;
+ }
+ }
+ unk201C000->unk8E = POKEMON_TILE_COUNT;
+}