diff options
Diffstat (limited to 'src/credits.c')
-rw-r--r-- | src/credits.c | 2124 |
1 files changed, 1835 insertions, 289 deletions
diff --git a/src/credits.c b/src/credits.c index 665279f8e..7685a033d 100644 --- a/src/credits.c +++ b/src/credits.c @@ -1,15 +1,30 @@ #include "global.h" +#include "asm.h" +#include "decompress.h" #include "m4a.h" #include "main.h" #include "menu.h" #include "palette.h" #include "songs.h" #include "sound.h" -#include "sprite.h" -#include "task.h" -#include "text.h" -enum { +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"); + +u32 NationalPokedexNumToSpecies(u16 nationalNum); + +struct MonCoords +{ + u8 x, y; +}; + +extern void *species_and_otid_get_pal(u32, u16, u16); + +enum +{ PAGE_TITLE, PAGE_DIRECTOR, PAGE_ART_DIRECTOR, @@ -71,11 +86,15 @@ enum { #define COLOR_DARK_GREEN 0x1967 #define COLOR_LIGHT_GREEN 0x328D -enum { +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, @@ -90,30 +109,45 @@ enum { TDB_3 = 3, TDC_0 = 0, - - TDD_0 = 0, - TDD_1 = 1, + 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, -struct Unk201C000 { - u8 pad_00[0x88]; - u16 var_88; - u16 var_8A; - u16 var_8C; + TDE_0 = 0, + TDE_1 = 1, + TDE_TASK_A_ID = 2, }; -struct HallOfFame { - u8 sheet0[0x800]; - u8 sheet1[0x800]; - u8 sheet2[0x800]; +struct Unk201C000 +{ + u16 unk0[8]; + u8 pad_10[0x78]; + u16 unk88; + u16 unk8A; + u16 unk8C; + u16 unk8E; }; -struct CreditsEntry { +struct CreditsEntry +{ u8 var_0; u8 *text; }; +extern u8 unk_2000000[]; + +#define EWRAM_1F800 ((u16 *)(unk_2000000 + 0x1F800)) +#define HALL_OF_FAME_SHEET_0 ((u8 *)(unk_2000000 + 0x1E000)) +#define HALL_OF_FAME_SHEET_1 ((u8 *)(unk_2000000 + 0x1E800)) +#define HALL_OF_FAME_SHEET_2 ((u8 *)(unk_2000000 + 0x1F000)) + extern struct Unk201C000 unk_201C000; extern struct HallOfFame gHallOfFame; @@ -121,30 +155,62 @@ extern u8 unk_201e800[0x800]; extern u8 unk_201f000[0x800]; extern u16 unk_201f800[]; +extern struct SpriteTemplate gUnknown_02024E8C; + extern s16 gUnknown_02039320; extern u16 gUnknown_02039322; // TASK A extern u8 gUnknown_02039324; extern u8 gUnknown_02039325; -extern u16 gUnknown_0203935C; +extern u16 gUnknown_02039358; +extern u16 gUnknown_0203935A; +extern s16 gUnknown_0203935C; extern u8 gReservedSpritePaletteCount; +// data/data2 +extern struct MonCoords gMonFrontPicCoords[]; +extern struct SpriteSheet gMonFrontPicTable[]; + // data/starter_choose extern u16 gBirchBagGrassPal[32]; -extern u8 gBirchBagTilemap[]; +extern u8 gBirchGrassTilemap[]; extern u8 gBirchHelpGfx[]; -// data/credits -extern u16 gUnknown_0840B7BC[32]; -extern u16 gUnknown_0840B7FC[32]; +// 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; + +// data/intro_credits_graphics +extern const struct SpriteSheet gIntro2BrendanSpriteSheet; +extern const struct SpriteSheet gIntro2MaySpriteSheet; +extern const struct SpriteSheet gIntro2BicycleSpriteSheet; +extern const struct SpritePalette gIntro2SpritePalettes[]; +extern const struct SpriteSheet gUnknown_08416E24; +extern const struct SpriteSheet gUnknown_08416E34; + +// graphics +extern u8 gCreditsCopyrightEnd_Gfx[]; +extern u16 gIntroCopyright_Pal[16]; static void task_a_8143B38(u8 taskIdA); -void task_a_8143B68(u8 taskIdA); +static void task_a_8143B68(u8 taskIdA); static void task_a_8143BFC(u8 taskIdA); -static void task_a_080C9BFC(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); @@ -157,21 +223,25 @@ 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); - -void task_d_8144514(u8 taskIdD); -u8 sub_8144ECC(u8 data, u8 taskIdA); -void sub_81450AC(u8 taskIdA); +static void task_d_8144514(u8 taskIdD); +static bool8 sub_8144ECC(u8 data, u8 taskIdA); +static void sub_81450AC(u8 taskIdA); void sub_8145128(u16, u16, u16); -void sub_81452D0(int, int); +static void sub_81452D0(u16 arg0, u16 arg1); +static void spritecb_player_8145378(struct Sprite *sprite); +static void spritecb_rival_8145420(struct Sprite *sprite); +u8 sub_81456B4(u16 nationalNum, u16 x, u16 y, u16 arg3); void sub_81458DC(void); -static void vblank_8143948(void) { +static void vblank_8143948(void) +{ LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); } -static void sub_814395C(void) { +static void sub_814395C(void) +{ RunTasks(); AnimateSprites(); BuildOamBuffer(); @@ -200,7 +270,8 @@ static void sub_814395C(void) { gUnknown_02039325 = 1; } -void sub_81439D0(void) { +void sub_81439D0(void) +{ u8 taskIdA; s16 taskIdC; u8 taskIdB; @@ -234,7 +305,7 @@ void sub_81439D0(void) { InitMenuWindow(&gWindowConfig_81E7208); LoadPalette(&gUnknown_0840B7BC, 0x80, sizeof(gUnknown_0840B7BC)); - CpuCopy16(&gUnknown_0840B7FC, (void *) (VRAM + 0xBEE0), sizeof(gUnknown_0840B7FC)); + CpuCopy16(&gUnknown_0840B7FC, (void *)(VRAM + 0xBEE0), sizeof(gUnknown_0840B7FC)); REG_BG0VOFS = 0xFFFC; @@ -245,7 +316,6 @@ void sub_81439D0(void) { BeginNormalPaletteFade(-1, 0, 16, 0, 0); - savedIme = REG_IME; REG_IME = 0; REG_IE |= INTR_FLAG_VBLANK; @@ -262,14 +332,15 @@ void sub_81439D0(void) { sub_81458DC(); - c000->var_88 = 0; - c000->var_8A = 0; - c000->var_8C = 0; + c000->unk88 = 0; + c000->unk8A = 0; + c000->unk8C = 0; gUnknown_02039322 = taskIdA; } -void task_a_8143B38(u8 taskIdA) { +static void task_a_8143B38(u8 taskIdA) +{ if (gPaletteFade.active) { return; @@ -278,7 +349,8 @@ void task_a_8143B38(u8 taskIdA) { gTasks[taskIdA].func = task_a_8143B68; } -void task_a_8143B68(u8 taskIdA) { +static void task_a_8143B68(u8 taskIdA) +{ u16 data11; if (gTasks[taskIdA].data[TDA_4]) @@ -312,7 +384,8 @@ void task_a_8143B68(u8 taskIdA) { } } -static void task_a_8143BFC(u8 taskIdA) { +static void task_a_8143BFC(u8 taskIdA) +{ if (gPaletteFade.active) { return; @@ -320,10 +393,11 @@ static void task_a_8143BFC(u8 taskIdA) { REG_DISPCNT = 0; sub_81450AC(taskIdA); - gTasks[taskIdA].func = task_a_080C9BFC; + gTasks[taskIdA].func = task_a_80C9BFC; } -static void task_a_080C9BFC(u8 taskIdA) { +static void task_a_80C9BFC(u8 taskIdA) +{ u16 backup; SetVBlankCallback(NULL); @@ -345,7 +419,8 @@ static void task_a_080C9BFC(u8 taskIdA) { gTasks[taskIdA].func = task_a_8143B38; } -static void task_a_8143CC0(u8 taskIdA) { +static void task_a_8143CC0(u8 taskIdA) +{ if (gPaletteFade.active) { return; @@ -356,36 +431,33 @@ static void task_a_8143CC0(u8 taskIdA) { gTasks[taskIdA].func = task_a_8143D04; } -#ifdef NONMATCHING -static void task_a_8143D04(u8 taskIdA) { - switch (gMain.state) { +void task_a_8143D04(u8 taskIdA) +{ + switch (gMain.state) + { default: - case 0: { + case 0: + { u16 i; ResetSpriteData(); FreeAllSpritePalettes(); gReservedSpritePaletteCount = 8; - LZ77UnCompVram(&gBirchHelpGfx, (void *) VRAM); - LZ77UnCompVram(&gBirchBagTilemap, (void *) (VRAM + 0x3800)); - LoadPalette(gBirchBagGrassPal + 2, 1, 31 * 2); - - for (i = 0; i < 0x800; i++) { - gHallOfFame.sheet0[i] = 0x11; - } - - for (i = 0; i < 0x800; i++) { - gHallOfFame.sheet1[i] = 0x22; - } - - for (i = 0; i < 0x800; i++) { - gHallOfFame.sheet2[i] = 0x33; - } - - unk_201f800[0] = 0; - unk_201f800[1] = 0x53FF; // light yellow - unk_201f800[2] = 0x529F; // light red - unk_201f800[3] = 0x7E94; // light blue + LZ77UnCompVram(&gBirchHelpGfx, (void *)VRAM); + LZ77UnCompVram(&gBirchGrassTilemap, (void *)(VRAM + 0x3800)); + LoadPalette(gBirchBagGrassPal + 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); @@ -393,11 +465,10 @@ static void task_a_8143D04(u8 taskIdA) { gMain.state += 1; break; } - - case 1: { + case 1: gTasks[taskIdA].data[TDA_TASK_D_ID] = CreateTask(task_d_8144514, 0); - gTasks[gTasks[taskIdA].data[TDA_TASK_D_ID]].data[TDD_0] = 1; - gTasks[gTasks[taskIdA].data[TDA_TASK_D_ID]].data[TDD_1] = taskIdA; + 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); @@ -411,210 +482,10 @@ static void task_a_8143D04(u8 taskIdA) { gTasks[taskIdA].func = task_a_8143B38; break; } - } } -#else -__attribute__((naked)) -static void task_a_8143D04(u8 taskId) { - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r9\n\ - mov r6, r8\n\ - push {r6,r7}\n\ - sub sp, 0x4\n\ - lsls r0, 24\n\ - lsrs r6, r0, 24\n\ - ldr r0, _08143DC8 @ =gMain\n\ - ldr r1, _08143DCC @ =0x0000043c\n\ - adds r1, r0\n\ - mov r8, r1\n\ - ldrb r7, [r1]\n\ - cmp r7, 0\n\ - beq _08143D24\n\ - cmp r7, 0x1\n\ - beq _08143E0C\n\ -_08143D24:\n\ - bl ResetSpriteData\n\ - bl FreeAllSpritePalettes\n\ - ldr r1, _08143DD0 @ =gReservedSpritePaletteCount\n\ - movs r0, 0x8\n\ - strb r0, [r1]\n\ - ldr r0, _08143DD4 @ =gBirchHelpGfx\n\ - movs r1, 0xC0\n\ - lsls r1, 19\n\ - bl LZ77UnCompVram\n\ - ldr r0, _08143DD8 @ =gBirchGrassTilemap\n\ - ldr r1, _08143DDC @ =0x06003800\n\ - bl LZ77UnCompVram\n\ - ldr r0, _08143DE0 @ =gBirchBagGrassPal + 2\n\ - movs r1, 0x1\n\ - movs r2, 0x3E\n\ - bl LoadPalette\n\ - movs r1, 0\n\ - ldr r4, _08143DE4 @ =0x0201e000\n\ - movs r3, 0x11\n\ - ldr r2, _08143DE8 @ =0x000007ff\n\ -_08143D56:\n\ - adds r0, r1, r4\n\ - strb r3, [r0]\n\ - adds r0, r1, 0x1\n\ - lsls r0, 16\n\ - lsrs r1, r0, 16\n\ - cmp r1, r2\n\ - bls _08143D56\n\ - movs r1, 0\n\ - ldr r2, _08143DEC @ =0x0201f800\n\ - ldr r6, _08143DF0 @ =gUnknown_0840CAA0\n\ - ldr r0, _08143DF4 @ =0xfffff000\n\ - adds r5, r2, r0\n\ - movs r4, 0x22\n\ - ldr r3, _08143DE8 @ =0x000007ff\n\ -_08143D72:\n\ - adds r0, r1, r5\n\ - strb r4, [r0]\n\ - adds r0, r1, 0x1\n\ - lsls r0, 16\n\ - lsrs r1, r0, 16\n\ - cmp r1, r3\n\ - bls _08143D72\n\ - movs r1, 0\n\ - ldr r5, _08143DF8 @ =0x0201f000\n\ - movs r4, 0x33\n\ - ldr r3, _08143DE8 @ =0x000007ff\n\ -_08143D88:\n\ - adds r0, r1, r5\n\ - strb r4, [r0]\n\ - adds r0, r1, 0x1\n\ - lsls r0, 16\n\ - lsrs r1, r0, 16\n\ - cmp r1, r3\n\ - bls _08143D88\n\ - movs r0, 0\n\ - strh r0, [r2]\n\ - ldr r1, _08143DFC @ =0x000053ff\n\ - adds r0, r1, 0\n\ - strh r0, [r2, 0x2]\n\ - ldr r1, _08143E00 @ =0x0000529f\n\ - adds r0, r1, 0\n\ - strh r0, [r2, 0x4]\n\ - ldr r1, _08143E04 @ =0x00007e94\n\ - adds r0, r1, 0\n\ - strh r0, [r2, 0x6]\n\ - adds r0, r6, 0\n\ - bl LoadSpriteSheet\n\ - ldr r0, _08143E08 @ =gUnknown_0840CAB0\n\ - bl LoadSpritePalette\n\ - ldr r1, _08143DC8 @ =gMain\n\ - ldr r2, _08143DCC @ =0x0000043c\n\ - adds r1, r2\n\ - ldrb r0, [r1]\n\ - adds r0, 0x1\n\ - strb r0, [r1]\n\ - b _08143E90\n\ - .align 2, 0\n\ -_08143DC8: .4byte gMain\n\ -_08143DCC: .4byte 0x0000043c\n\ -_08143DD0: .4byte gReservedSpritePaletteCount\n\ -_08143DD4: .4byte gBirchHelpGfx\n\ -_08143DD8: .4byte gBirchGrassTilemap\n\ -_08143DDC: .4byte 0x06003800\n\ -_08143DE0: .4byte gBirchBagGrassPal + 2\n\ -_08143DE4: .4byte 0x0201e000\n\ -_08143DE8: .4byte 0x000007ff\n\ -_08143DEC: .4byte 0x0201f800\n\ -_08143DF0: .4byte gUnknown_0840CAA0\n\ -_08143DF4: .4byte 0xfffff000\n\ -_08143DF8: .4byte 0x0201f000\n\ -_08143DFC: .4byte 0x000053ff\n\ -_08143E00: .4byte 0x0000529f\n\ -_08143E04: .4byte 0x00007e94\n\ -_08143E08: .4byte gUnknown_0840CAB0\n\ -_08143E0C:\n\ - ldr r0, _08143EA0 @ =task_d_8144514\n\ - movs r1, 0\n\ - bl CreateTask\n\ - ldr r2, _08143EA4 @ =gTasks\n\ - lsls r4, r6, 2\n\ - adds r4, r6\n\ - lsls r4, 3\n\ - adds r4, r2\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - movs r1, 0\n\ - mov r9, r1\n\ - movs r5, 0\n\ - strh r0, [r4, 0xE]\n\ - movs r0, 0xE\n\ - ldrsh r1, [r4, r0]\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - lsls r0, 3\n\ - adds r0, r2\n\ - strh r7, [r0, 0x8]\n\ - movs r0, 0xE\n\ - ldrsh r1, [r4, r0]\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - lsls r0, 3\n\ - adds r0, r2\n\ - strh r6, [r0, 0xA]\n\ - movs r0, 0xE\n\ - ldrsh r1, [r4, r0]\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - lsls r0, 3\n\ - adds r0, r2\n\ - ldrh r1, [r4, 0x16]\n\ - strh r1, [r0, 0xC]\n\ - movs r0, 0x1\n\ - negs r0, r0\n\ - str r5, [sp]\n\ - movs r1, 0\n\ - movs r2, 0x10\n\ - movs r3, 0\n\ - bl BeginNormalPaletteFade\n\ - ldr r0, _08143EA8 @ =REG_BG3HOFS\n\ - strh r5, [r0]\n\ - ldr r1, _08143EAC @ =REG_BG3VOFS\n\ - movs r0, 0x20\n\ - strh r0, [r1]\n\ - subs r1, 0x10\n\ - ldr r2, _08143EB0 @ =0x00000703\n\ - adds r0, r2, 0\n\ - strh r0, [r1]\n\ - subs r1, 0xE\n\ - movs r2, 0xCA\n\ - lsls r2, 5\n\ - adds r0, r2, 0\n\ - strh r0, [r1]\n\ - mov r1, r9\n\ - mov r0, r8\n\ - strb r1, [r0]\n\ - ldr r0, _08143EB4 @ =gUnknown_0203935C\n\ - strh r5, [r0]\n\ - ldr r0, _08143EB8 @ =sub_8143B38\n\ - str r0, [r4]\n\ -_08143E90:\n\ - add sp, 0x4\n\ - pop {r3,r4}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_08143EA0: .4byte task_d_8144514\n\ -_08143EA4: .4byte gTasks\n\ -_08143EA8: .4byte 0x4000000 + 0x1c\n\ -_08143EAC: .4byte 0x4000000 + 0x1e\n\ -_08143EB0: .4byte 0x00000703\n\ -_08143EB4: .4byte gUnknown_0203935C\n\ -_08143EB8: .4byte task_a_8143B38\n\ - .syntax divided\n"); -} -#endif -static void task_a_8143EBC(u8 taskIdA) { +static void task_a_8143EBC(u8 taskIdA) +{ if (gTasks[taskIdA].data[TDA_12]) { gTasks[taskIdA].data[TDA_12] -= 1; @@ -625,7 +496,8 @@ static void task_a_8143EBC(u8 taskIdA) { gTasks[taskIdA].func = task_a_8143F04; } -static void task_a_8143F04(u8 taskIdA) { +static void task_a_8143F04(u8 taskIdA) +{ if (gPaletteFade.active) { return; @@ -635,7 +507,8 @@ static void task_a_8143F04(u8 taskIdA) { gTasks[taskIdA].func = task_a_8143F3C; } -static void task_a_8143F3C(u8 taskIdA) { +static void task_a_8143F3C(u8 taskIdA) +{ u16 backup; sub_8144130(); @@ -657,7 +530,8 @@ static void task_a_8143F3C(u8 taskIdA) { gTasks[taskIdA].func = task_a_8143FDC; } -static void task_a_8143FDC(u8 taskIdA) { +static void task_a_8143FDC(u8 taskIdA) +{ if (gTasks[taskIdA].data[TDA_0]) { gTasks[taskIdA].data[TDA_0] -= 1; @@ -668,7 +542,8 @@ static void task_a_8143FDC(u8 taskIdA) { gTasks[taskIdA].func = task_a_8144024; } -static void task_a_8144024(u8 taskIdA) { +static void task_a_8144024(u8 taskIdA) +{ if (gPaletteFade.active) { return; @@ -681,7 +556,8 @@ static void task_a_8144024(u8 taskIdA) { gTasks[taskIdA].func = task_a_8144080; } -static void task_a_8144080(u8 taskIdA) { +static void task_a_8144080(u8 taskIdA) +{ if (gPaletteFade.active) { return; @@ -716,7 +592,8 @@ static void task_a_8144080(u8 taskIdA) { gTasks[taskIdA].data[TDA_0] -= 1; } -static void task_a_8144114(u8 taskIdA) { +static void task_a_8144114(u8 taskIdA) +{ if (gPaletteFade.active) { return; @@ -725,7 +602,8 @@ static void task_a_8144114(u8 taskIdA) { SoftReset(0xFF); } -static void sub_8144130(void) { +static void sub_8144130(void) +{ REG_DISPCNT = 0; REG_BG3HOFS = 0; @@ -741,12 +619,13 @@ static void sub_8144130(void) { 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); + 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) { +static void task_b_81441B8(u8 taskIdB) +{ u16 i; switch (gTasks[taskIdB].data[TDB_0]) @@ -788,7 +667,7 @@ static void task_b_81441B8(u8 taskIdB) { for (i = 0; i < 5; i++) { sub_8072BD8(gCreditsEntryPointerTable[gTasks[taskIdB].data[TDB_CURRENT_PAGE]][i]->text, 0, - 9 + i * 2, 240); + 9 + i * 2, 240); } gTasks[taskIdB].data[TDB_CURRENT_PAGE] += 1; @@ -834,7 +713,7 @@ static void task_b_81441B8(u8 taskIdB) { return; } - if (sub_8144454((u8) gTasks[taskIdB].data[TDB_CURRENT_PAGE], (u8) gTasks[taskIdB].data[TDB_TASK_A_ID])) + 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; @@ -872,7 +751,8 @@ static void task_b_81441B8(u8 taskIdB) { #define LAST_PAGE (PAGE_TEXT_EDITOR) -static u8 sub_8144454(u8 page, u8 taskIdA) { +static u8 sub_8144454(u8 page, u8 taskIdA) +{ // Starts with bike + ocean + morning if (page == PAGE_PROGRAMMERS_1) @@ -935,3 +815,1669 @@ static u8 sub_8144454(u8 page, u8 taskIdA) { return FALSE; } + +#define UNK_DEFINE_44 (0x44) + +#define EWRAM_1C000 (*(struct Unk201C000 *)(unk_2000000 + 0x1C000)) + +static void task_d_8144514(u8 taskIdD) +{ + struct Unk201C000 *r6 = &EWRAM_1C000; + 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 == UNK_DEFINE_44 || 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; + } +} + +__attribute__((naked)) +void task_c_8144664(u8 taskIdC) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + ldr r1, _0814468C @ =gTasks\n\ + lsls r0, r5, 2\n\ + adds r0, r5\n\ + lsls r0, 3\n\ + adds r0, r1\n\ + movs r2, 0x8\n\ + ldrsh r0, [r0, r2]\n\ + adds r6, r1, 0\n\ + cmp r0, 0x32\n\ + bls _08144680\n\ + b _0814492C\n\ +_08144680:\n\ + lsls r0, 2\n\ + ldr r1, _08144690 @ =_08144694\n\ + adds r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ + .align 2, 0\n\ +_0814468C: .4byte gTasks\n\ +_08144690: .4byte _08144694\n\ + .align 2, 0\n\ +_08144694:\n\ + .4byte _08144760\n\ + .4byte _08144784\n\ + .4byte _081447D8\n\ + .4byte _081447F0\n\ + .4byte _0814482C\n\ + .4byte _08144850\n\ + .4byte _0814489C\n\ + .4byte _0814492C\n\ + .4byte _0814492C\n\ + .4byte _0814492C\n\ + .4byte _081448A8\n\ + .4byte _0814492C\n\ + .4byte _0814492C\n\ + .4byte _0814492C\n\ + .4byte _0814492C\n\ + .4byte _0814492C\n\ + .4byte _0814492C\n\ + .4byte _0814492C\n\ + .4byte _0814492C\n\ + .4byte _0814492C\n\ + .4byte _081448C8\n\ + .4byte _0814492C\n\ + .4byte _0814492C\n\ + .4byte _0814492C\n\ + .4byte _0814492C\n\ + .4byte _0814492C\n\ + .4byte _0814492C\n\ + .4byte _0814492C\n\ + .4byte _0814492C\n\ + .4byte _0814492C\n\ + .4byte _081448EC\n\ + .4byte _0814492C\n\ + .4byte _0814492C\n\ + .4byte _0814492C\n\ + .4byte _0814492C\n\ + .4byte _0814492C\n\ + .4byte _0814492C\n\ + .4byte _0814492C\n\ + .4byte _0814492C\n\ + .4byte _0814492C\n\ + .4byte _0814492C\n\ + .4byte _0814492C\n\ + .4byte _0814492C\n\ + .4byte _0814492C\n\ + .4byte _0814492C\n\ + .4byte _0814492C\n\ + .4byte _0814492C\n\ + .4byte _0814492C\n\ + .4byte _0814492C\n\ + .4byte _0814492C\n\ + .4byte _08144920\n\ +_08144760:\n\ + lsls r4, r5, 2\n\ + adds r4, r5\n\ + lsls r4, 3\n\ + adds r4, r6\n\ + ldrh r0, [r4, 0x12]\n\ + lsls r0, 16\n\ + asrs r0, 17\n\ + movs r1, 0x7F\n\ + ands r0, r1\n\ + movs r1, 0xC\n\ + bl Sin\n\ + ldr r1, _08144780 @ =gUnknown_0203935A\n\ + strh r0, [r1]\n\ + b _081447A8\n\ + .align 2, 0\n\ +_08144780: .4byte gUnknown_0203935A\n\ +_08144784:\n\ + ldr r7, _081447B0 @ =gUnknown_0203935A\n\ + movs r3, 0\n\ + ldrsh r4, [r7, r3]\n\ + cmp r4, 0\n\ + beq _081447B4\n\ + lsls r4, r5, 2\n\ + adds r4, r5\n\ + lsls r4, 3\n\ + adds r4, r6\n\ + ldrh r0, [r4, 0x12]\n\ + lsls r0, 16\n\ + asrs r0, 17\n\ + movs r1, 0x7F\n\ + ands r0, r1\n\ + movs r1, 0xC\n\ + bl Sin\n\ + strh r0, [r7]\n\ +_081447A8:\n\ + ldrh r0, [r4, 0x12]\n\ + adds r0, 0x1\n\ + strh r0, [r4, 0x12]\n\ + b _0814492C\n\ + .align 2, 0\n\ +_081447B0: .4byte gUnknown_0203935A\n\ +_081447B4:\n\ + ldr r3, _081447D4 @ =gSprites\n\ + lsls r1, r5, 2\n\ + adds r1, r5\n\ + lsls r1, 3\n\ + adds r1, r6\n\ + movs r0, 0xC\n\ + ldrsh r2, [r1, r0]\n\ + lsls r0, r2, 4\n\ + adds r0, r2\n\ + lsls r0, 2\n\ + adds r0, r3\n\ + movs r2, 0x2\n\ + strh r2, [r0, 0x2E]\n\ + strh r4, [r1, 0x12]\n\ + b _08144848\n\ + .align 2, 0\n\ +_081447D4: .4byte gSprites\n\ +_081447D8:\n\ + lsls r0, r5, 2\n\ + adds r0, r5\n\ + lsls r0, 3\n\ + adds r1, r0, r6\n\ + ldrh r2, [r1, 0x12]\n\ + movs r3, 0x12\n\ + ldrsh r0, [r1, r3]\n\ + cmp r0, 0x3F\n\ + bgt _08144848\n\ + adds r0, r2, 0x1\n\ + strh r0, [r1, 0x12]\n\ + b _08144866\n\ +_081447F0:\n\ + ldr r3, _08144828 @ =gSprites\n\ + lsls r2, r5, 2\n\ + adds r2, r5\n\ + lsls r2, 3\n\ + adds r2, r6\n\ + movs r0, 0xC\n\ + ldrsh r1, [r2, r0]\n\ + lsls r0, r1, 4\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + adds r0, r3\n\ + movs r1, 0x3\n\ + strh r1, [r0, 0x2E]\n\ + movs r0, 0xE\n\ + ldrsh r1, [r2, r0]\n\ + lsls r0, r1, 4\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + adds r0, r3\n\ + movs r1, 0x1\n\ + strh r1, [r0, 0x2E]\n\ + movs r0, 0x78\n\ + strh r0, [r2, 0x10]\n\ + ldrh r0, [r2, 0x8]\n\ + adds r0, 0x1\n\ + strh r0, [r2, 0x8]\n\ + b _0814492C\n\ + .align 2, 0\n\ +_08144828: .4byte gSprites\n\ +_0814482C:\n\ + lsls r0, r5, 2\n\ + adds r0, r5\n\ + lsls r0, 3\n\ + adds r1, r0, r6\n\ + ldrh r2, [r1, 0x10]\n\ + movs r3, 0x10\n\ + ldrsh r0, [r1, r3]\n\ + cmp r0, 0\n\ + beq _08144844\n\ + subs r0, r2, 0x1\n\ + strh r0, [r1, 0x10]\n\ + b _0814492C\n\ +_08144844:\n\ + movs r0, 0x40\n\ + strh r0, [r1, 0x12]\n\ +_08144848:\n\ + ldrh r0, [r1, 0x8]\n\ + adds r0, 0x1\n\ + strh r0, [r1, 0x8]\n\ + b _0814492C\n\ +_08144850:\n\ + lsls r0, r5, 2\n\ + adds r0, r5\n\ + lsls r0, 3\n\ + adds r4, r0, r6\n\ + ldrh r1, [r4, 0x12]\n\ + movs r2, 0x12\n\ + ldrsh r0, [r4, r2]\n\ + cmp r0, 0\n\ + ble _0814487C\n\ + subs r0, r1, 0x1\n\ + strh r0, [r4, 0x12]\n\ +_08144866:\n\ + movs r1, 0x7F\n\ + ands r0, r1\n\ + movs r1, 0x14\n\ + bl Sin\n\ + ldr r1, _08144878 @ =gUnknown_0203935A\n\ + strh r0, [r1]\n\ + b _0814492C\n\ + .align 2, 0\n\ +_08144878: .4byte gUnknown_0203935A\n\ +_0814487C:\n\ + ldr r2, _08144898 @ =gSprites\n\ + movs r3, 0xC\n\ + ldrsh r1, [r4, r3]\n\ + lsls r0, r1, 4\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + adds r0, r2\n\ + movs r1, 0x1\n\ + strh r1, [r0, 0x2E]\n\ + ldrh r0, [r4, 0x8]\n\ + adds r0, 0x1\n\ + strh r0, [r4, 0x8]\n\ + b _0814492C\n\ + .align 2, 0\n\ +_08144898: .4byte gSprites\n\ +_0814489C:\n\ + lsls r0, r5, 2\n\ + adds r0, r5\n\ + lsls r0, 3\n\ + adds r0, r6\n\ + movs r1, 0x32\n\ + b _0814492A\n\ +_081448A8:\n\ + ldr r3, _081448C4 @ =gSprites\n\ + lsls r1, r5, 2\n\ + adds r1, r5\n\ + lsls r1, 3\n\ + adds r1, r6\n\ + movs r0, 0xE\n\ + ldrsh r2, [r1, r0]\n\ + lsls r0, r2, 4\n\ + adds r0, r2\n\ + lsls r0, 2\n\ + adds r0, r3\n\ + movs r2, 0x2\n\ + b _081448E0\n\ + .align 2, 0\n\ +_081448C4: .4byte gSprites\n\ +_081448C8:\n\ + ldr r3, _081448E8 @ =gSprites\n\ + lsls r1, r5, 2\n\ + adds r1, r5\n\ + lsls r1, 3\n\ + adds r1, r6\n\ + movs r0, 0xC\n\ + ldrsh r2, [r1, r0]\n\ + lsls r0, r2, 4\n\ + adds r0, r2\n\ + lsls r0, 2\n\ + adds r0, r3\n\ + movs r2, 0x4\n\ +_081448E0:\n\ + strh r2, [r0, 0x2E]\n\ + movs r0, 0x32\n\ + strh r0, [r1, 0x8]\n\ + b _0814492C\n\ + .align 2, 0\n\ +_081448E8: .4byte gSprites\n\ +_081448EC:\n\ + ldr r3, _0814491C @ =gSprites\n\ + lsls r2, r5, 2\n\ + adds r2, r5\n\ + lsls r2, 3\n\ + adds r2, r6\n\ + movs r0, 0xC\n\ + ldrsh r1, [r2, r0]\n\ + lsls r0, r1, 4\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + adds r0, r3\n\ + movs r1, 0x5\n\ + strh r1, [r0, 0x2E]\n\ + movs r0, 0xE\n\ + ldrsh r1, [r2, r0]\n\ + lsls r0, r1, 4\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + adds r0, r3\n\ + movs r1, 0x3\n\ + strh r1, [r0, 0x2E]\n\ + movs r0, 0x32\n\ + strh r0, [r2, 0x8]\n\ + b _0814492C\n\ + .align 2, 0\n\ +_0814491C: .4byte gSprites\n\ +_08144920:\n\ + lsls r0, r5, 2\n\ + adds r0, r5\n\ + lsls r0, 3\n\ + adds r0, r6\n\ + movs r1, 0\n\ +_0814492A:\n\ + strh r1, [r0, 0x8]\n\ +_0814492C:\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .syntax divided\n"); +} + +#define UNK_DEF_1F3 (499) + +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; + } +} + +#define UNK_DEFINE_45 (0x45) + +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; +} + +__attribute__((naked)) +void sub_8145128(u16 arg0, u16 arg1, u16 arg2) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + adds r3, r0, 0\n\ + adds r4, r2, 0\n\ + lsls r3, 16\n\ + lsrs r3, 16\n\ + lsls r1, 16\n\ + lsrs r7, r1, 16\n\ + lsls r4, 16\n\ + lsrs r5, r4, 16\n\ + ldr r0, _081451EC @ =gCreditsCopyrightEnd_Gfx\n\ + movs r6, 0xC0\n\ + lsls r6, 19\n\ + adds r3, r6\n\ + adds r1, r3, 0\n\ + bl LZ77UnCompVram\n\ + ldr r0, _081451F0 @ =gIntroCopyright_Pal\n\ + adds r1, r5, 0\n\ + movs r2, 0x20\n\ + bl LoadPalette\n\ + lsrs r4, 20\n\ + lsls r4, 28\n\ + lsrs r4, 16\n\ + movs r2, 0\n\ + adds r1, r4, 0x1\n\ + ldr r3, _081451F4 @ =0x000003ff\n\ +_0814515E:\n\ + lsls r0, r2, 1\n\ + adds r0, r7\n\ + adds r0, r6\n\ + strh r1, [r0]\n\ + adds r0, r2, 0x1\n\ + lsls r0, 16\n\ + lsrs r2, r0, 16\n\ + cmp r2, r3\n\ + bls _0814515E\n\ + movs r2, 0\n\ + adds r0, r4, 0x2\n\ + adds r6, r4, 0\n\ + adds r6, 0x17\n\ + movs r1, 0x2B\n\ + adds r1, r4\n\ + mov r12, r1\n\ + adds r4, 0x42\n\ + ldr r5, _081451F8 @ =0x060001c8\n\ + adds r3, r0, 0\n\ +_08145184:\n\ + lsls r0, r2, 1\n\ + adds r0, r7\n\ + adds r0, r5\n\ + adds r1, r2, r3\n\ + strh r1, [r0]\n\ + adds r0, r2, 0x1\n\ + lsls r0, 16\n\ + lsrs r2, r0, 16\n\ + cmp r2, 0x14\n\ + bls _08145184\n\ + movs r2, 0\n\ + ldr r5, _081451FC @ =0x06000248\n\ + adds r3, r6, 0\n\ +_0814519E:\n\ + lsls r0, r2, 1\n\ + adds r0, r7\n\ + adds r0, r5\n\ + adds r1, r2, r3\n\ + strh r1, [r0]\n\ + adds r0, r2, 0x1\n\ + lsls r0, 16\n\ + lsrs r2, r0, 16\n\ + cmp r2, 0x13\n\ + bls _0814519E\n\ + movs r2, 0\n\ + ldr r5, _08145200 @ =0x060002c8\n\ + mov r3, r12\n\ +_081451B8:\n\ + lsls r0, r2, 1\n\ + adds r0, r7\n\ + adds r0, r5\n\ + adds r1, r2, r3\n\ + strh r1, [r0]\n\ + adds r0, r2, 0x1\n\ + lsls r0, 16\n\ + lsrs r2, r0, 16\n\ + cmp r2, 0x16\n\ + bls _081451B8\n\ + movs r2, 0\n\ + ldr r3, _08145204 @ =0x06000348\n\ +_081451D0:\n\ + lsls r0, r2, 1\n\ + adds r0, r7\n\ + adds r0, r3\n\ + adds r1, r2, r4\n\ + strh r1, [r0]\n\ + adds r0, r2, 0x1\n\ + lsls r0, 16\n\ + lsrs r2, r0, 16\n\ + cmp r2, 0xB\n\ + bls _081451D0\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_081451EC: .4byte gCreditsCopyrightEnd_Gfx\n\ +_081451F0: .4byte gIntroCopyright_Pal\n\ +_081451F4: .4byte 0x000003ff\n\ +_081451F8: .4byte 0x060001c8\n\ +_081451FC: .4byte 0x06000248\n\ +_08145200: .4byte 0x060002c8\n\ +_08145204: .4byte 0x06000348\n\ + .syntax divided\n"); +} + +u16 sub_8145208(u8 arg0) +{ + + u16 out = (arg0 & 0x3F) + 80; + + if (arg0 == 0xFF) + { + return 1; + } + + if (arg0 & (1 << 7)) + { + out |= 0x800; + } + + if (arg0 & (1 << 6)) + { + out |= 0x400; + } + + return out; +} + +__attribute__((naked)) +void sub_814524C(void *arg0, u8 arg1, u8 arg2, u16 arg3, int arg4) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0xC\n\ + str r0, [sp]\n\ + ldr r0, [sp, 0x2C]\n\ + lsls r1, 24\n\ + lsrs r1, 24\n\ + mov r10, r1\n\ + lsls r2, 24\n\ + lsrs r2, 24\n\ + str r2, [sp, 0x4]\n\ + lsls r3, 16\n\ + lsrs r3, 16\n\ + str r3, [sp, 0x8]\n\ + lsls r0, 16\n\ + lsrs r0, 20\n\ + lsls r0, 28\n\ + lsrs r0, 16\n\ + mov r9, r0\n\ + movs r5, 0\n\ +_0814527A:\n\ + movs r4, 0\n\ + lsls r7, r5, 1\n\ + ldr r1, [sp, 0x4]\n\ + adds r0, r1, r5\n\ + adds r2, r5, 0x1\n\ + mov r8, r2\n\ + lsls r0, 6\n\ + ldr r1, [sp, 0x8]\n\ + adds r6, r0, r1\n\ +_0814528C:\n\ + adds r0, r7, r5\n\ + adds r0, r4\n\ + ldr r2, [sp]\n\ + adds r0, r2, r0\n\ + ldrb r0, [r0]\n\ + bl sub_8145208\n\ + mov r2, r10\n\ + adds r1, r2, r4\n\ + lsls r1, 1\n\ + adds r1, r6\n\ + movs r2, 0xC0\n\ + lsls r2, 19\n\ + adds r1, r2\n\ + add r0, r9\n\ + strh r0, [r1]\n\ + adds r0, r4, 0x1\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ + cmp r4, 0x2\n\ + bls _0814528C\n\ + mov r1, r8\n\ + lsls r0, r1, 24\n\ + lsrs r5, r0, 24\n\ + cmp r5, 0x4\n\ + bls _0814527A\n\ + add sp, 0xC\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .syntax divided\n"); +} + +static void sub_81452D0(u16 arg0, u16 arg1) +{ + u16 i; + u16 foo = arg1 / 16; + u16 bar = foo * 4096; + + for (i = 0; i < 0x400; i++) + ((u16 *)(VRAM + arg0))[i] = bar + 1; + + sub_814524C(&gUnknown_0840B83C, 3, 7, arg0, arg1); + sub_814524C(&gUnknown_0840B84B, 7, 7, arg0, arg1); + sub_814524C(&gUnknown_0840B85A, 11, 7, arg0, arg1); + sub_814524C(&gUnknown_0840B85A, 16, 7, arg0, arg1); + sub_814524C(&gUnknown_0840B869, 20, 7, arg0, arg1); + sub_814524C(&gUnknown_0840B878, 24, 7, arg0, arg1); +} + +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; + + + } +} + +__attribute__((naked)) +void spritecb_81454E0(struct Sprite *sprite) +{ + asm(".syntax unified\n\ + push {r4,r5,lr}\n\ + sub sp, 0x4\n\ + adds r5, r0, 0\n\ + ldr r0, _081454F8 @ =gUnknown_0203935C\n\ + movs r1, 0\n\ + ldrsh r0, [r0, r1]\n\ + cmp r0, 0\n\ + beq _081454FC\n\ + adds r0, r5, 0\n\ + bl DestroySprite\n\ + b _081456A6\n\ + .align 2, 0\n\ +_081454F8: .4byte gUnknown_0203935C\n\ +_081454FC:\n\ + ldrh r0, [r5, 0x3C]\n\ + adds r0, 0x1\n\ + strh r0, [r5, 0x3C]\n\ + movs r2, 0x2E\n\ + ldrsh r0, [r5, r2]\n\ + cmp r0, 0xA\n\ + bhi _08145544\n\ + lsls r0, 2\n\ + ldr r1, _08145514 @ =_08145518\n\ + adds r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ + .align 2, 0\n\ +_08145514: .4byte _08145518\n\ + .align 2, 0\n\ +_08145518:\n\ + .4byte _08145544\n\ + .4byte _0814559E\n\ + .4byte _08145620\n\ + .4byte _08145660\n\ + .4byte _08145544\n\ + .4byte _08145544\n\ + .4byte _08145544\n\ + .4byte _08145544\n\ + .4byte _08145544\n\ + .4byte _08145544\n\ + .4byte _08145696\n\ +_08145544:\n\ + ldrb r1, [r5, 0x1]\n\ + movs r0, 0x4\n\ + negs r0, r0\n\ + ands r0, r1\n\ + movs r1, 0x1\n\ + orrs r0, r1\n\ + strb r0, [r5, 0x1]\n\ + movs r0, 0x30\n\ + ldrsh r1, [r5, r0]\n\ + movs r0, 0x1F\n\ + ands r1, r0\n\ + lsls r1, 1\n\ + ldrb r2, [r5, 0x3]\n\ + movs r0, 0x3F\n\ + negs r0, r0\n\ + ands r0, r2\n\ + orrs r0, r1\n\ + strb r0, [r5, 0x3]\n\ + movs r0, 0x10\n\ + strh r0, [r5, 0x32]\n\ + ldrh r4, [r5, 0x30]\n\ + lsls r4, 24\n\ + lsrs r4, 24\n\ + movs r0, 0x80\n\ + lsls r0, 9\n\ + movs r1, 0x10\n\ + bl __divsi3\n\ + adds r1, r0, 0\n\ + str r1, [sp]\n\ + adds r0, r4, 0\n\ + movs r2, 0\n\ + movs r3, 0\n\ + bl SetOamMatrix\n\ + adds r2, r5, 0\n\ + adds r2, 0x3E\n\ + ldrb r1, [r2]\n\ + movs r0, 0x5\n\ + negs r0, r0\n\ + ands r0, r1\n\ + strb r0, [r2]\n\ + movs r0, 0x1\n\ + strh r0, [r5, 0x2E]\n\ + b _081456A6\n\ +_0814559E:\n\ + ldrh r1, [r5, 0x32]\n\ + movs r2, 0x32\n\ + ldrsh r0, [r5, r2]\n\ + cmp r0, 0xFF\n\ + bgt _081455D4\n\ + adds r0, r1, 0\n\ + adds r0, 0x8\n\ + strh r0, [r5, 0x32]\n\ + ldrh r4, [r5, 0x30]\n\ + lsls r4, 24\n\ + lsrs r4, 24\n\ + movs r0, 0x32\n\ + ldrsh r1, [r5, r0]\n\ + movs r0, 0x80\n\ + lsls r0, 9\n\ + bl __divsi3\n\ + adds r1, r0, 0\n\ + lsls r1, 16\n\ + lsrs r1, 16\n\ + str r1, [sp]\n\ + adds r0, r4, 0\n\ + movs r2, 0\n\ + movs r3, 0\n\ + bl SetOamMatrix\n\ + b _081455DA\n\ +_081455D4:\n\ + ldrh r0, [r5, 0x2E]\n\ + adds r0, 0x1\n\ + strh r0, [r5, 0x2E]\n\ +_081455DA:\n\ + movs r2, 0x30\n\ + ldrsh r1, [r5, r2]\n\ + cmp r1, 0x2\n\ + beq _081456A6\n\ + cmp r1, 0x2\n\ + bgt _081455EC\n\ + cmp r1, 0x1\n\ + beq _081455F2\n\ + b _081456A6\n\ +_081455EC:\n\ + cmp r1, 0x3\n\ + beq _0814560A\n\ + b _081456A6\n\ +_081455F2:\n\ + ldrh r1, [r5, 0x3C]\n\ + movs r0, 0x3\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _08145602\n\ + ldrh r0, [r5, 0x22]\n\ + adds r0, 0x1\n\ + strh r0, [r5, 0x22]\n\ +_08145602:\n\ + ldrh r0, [r5, 0x20]\n\ + subs r0, 0x2\n\ + strh r0, [r5, 0x20]\n\ + b _081456A6\n\ +_0814560A:\n\ + ldrh r0, [r5, 0x3C]\n\ + ands r1, r0\n\ + cmp r1, 0\n\ + bne _08145618\n\ + ldrh r0, [r5, 0x22]\n\ + adds r0, 0x1\n\ + strh r0, [r5, 0x22]\n\ +_08145618:\n\ + ldrh r0, [r5, 0x20]\n\ + adds r0, 0x2\n\ + strh r0, [r5, 0x20]\n\ + b _081456A6\n\ +_08145620:\n\ + ldrh r1, [r5, 0x34]\n\ + movs r2, 0x34\n\ + ldrsh r0, [r5, r2]\n\ + cmp r0, 0\n\ + beq _08145630\n\ + subs r0, r1, 0x1\n\ + strh r0, [r5, 0x34]\n\ + b _081456A6\n\ +_08145630:\n\ + ldr r1, _0814565C @ =REG_BLDCNT\n\ + movs r2, 0xF4\n\ + lsls r2, 4\n\ + adds r0, r2, 0\n\ + strh r0, [r1]\n\ + adds r1, 0x2\n\ + movs r0, 0x10\n\ + strh r0, [r1]\n\ + ldrb r1, [r5, 0x1]\n\ + movs r0, 0xD\n\ + negs r0, r0\n\ + ands r0, r1\n\ + movs r1, 0x4\n\ + orrs r0, r1\n\ + strb r0, [r5, 0x1]\n\ + movs r0, 0x10\n\ + strh r0, [r5, 0x34]\n\ + ldrh r0, [r5, 0x2E]\n\ + adds r0, 0x1\n\ + strh r0, [r5, 0x2E]\n\ + b _081456A6\n\ + .align 2, 0\n\ +_0814565C: .4byte REG_BLDCNT\n\ +_08145660:\n\ + ldrh r1, [r5, 0x34]\n\ + movs r2, 0x34\n\ + ldrsh r0, [r5, r2]\n\ + cmp r0, 0\n\ + beq _08145684\n\ + subs r1, 0x1\n\ + strh r1, [r5, 0x34]\n\ + ldr r3, _08145680 @ =REG_BLDALPHA\n\ + movs r0, 0x34\n\ + ldrsh r2, [r5, r0]\n\ + movs r0, 0x10\n\ + subs r0, r2\n\ + lsls r0, 8\n\ + adds r1, r0\n\ + strh r1, [r3]\n\ + b _081456A6\n\ + .align 2, 0\n\ +_08145680: .4byte REG_BLDALPHA\n\ +_08145684:\n\ + adds r2, r5, 0\n\ + adds r2, 0x3E\n\ + ldrb r0, [r2]\n\ + movs r1, 0x4\n\ + orrs r0, r1\n\ + strb r0, [r2]\n\ + movs r0, 0xA\n\ + strh r0, [r5, 0x2E]\n\ + b _081456A6\n\ +_08145696:\n\ + ldr r0, _081456B0 @ =REG_BLDCNT\n\ + movs r1, 0\n\ + strh r1, [r0]\n\ + adds r0, 0x2\n\ + strh r1, [r0]\n\ + adds r0, r5, 0\n\ + bl DestroySprite\n\ +_081456A6:\n\ + add sp, 0x4\n\ + pop {r4,r5}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_081456B0: .4byte REG_BLDCNT\n\ + .syntax divided\n"); +} + +#ifdef NONMATCHING +u8 sub_81456B4(u16 nationalNum, u16 x, u16 y, u16 arg3) +{ + u32 species; + u32 personality; + void *palette; + u8 spriteId; + u8 spriteId2; + + species = NationalPokedexNumToSpecies(nationalNum); + switch (species) + { + case SPECIES_UNOWN: + personality = gSaveBlock2.pokedex.unownPersonality; + break; + + case SPECIES_SPINDA: + personality = gSaveBlock2.pokedex.spindaPersonality; + break; + + default: + personality = 0; + break; + } + + LoadSpecialPokePic( + &gMonFrontPicTable[species], + gMonFrontPicCoords[species].x, + gMonFrontPicCoords[species].y, + 0x2000000, + gUnknown_0840B5A0[arg3], + species, + personality, + 1 + ); + + palette = species_and_otid_get_pal(species, 0, 0xFFFF); + LoadCompressedPalette(palette, 0x100 + (arg3 * 16), 0x20); + sub_8143648(arg3, arg3); + + spriteId = CreateSprite(&gUnknown_02024E8C, x, y, 0); + gSprites[spriteId].oam.paletteNum = arg3; + gSprites[spriteId].oam.priority = 1; + gSprites[spriteId].data1 = arg3 + 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], arg3); + + return spriteId; +} +#else +__attribute__((naked)) +u8 sub_81456B4(u16 nationalNum, u16 x, u16 y, u16 arg3) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x14\n\ + lsls r0, 16\n\ + lsrs r6, r0, 16\n\ + lsls r1, 16\n\ + lsrs r1, 16\n\ + mov r10, r1\n\ + lsls r2, 16\n\ + lsrs r2, 16\n\ + str r2, [sp, 0x10]\n\ + lsls r3, 16\n\ + lsrs r3, 16\n\ + mov r9, r3\n\ + adds r0, r6, 0\n\ + bl NationalPokedexNumToSpecies\n\ + adds r6, r0, 0\n\ + cmp r6, 0xC9\n\ + beq _081456F8\n\ + movs r0, 0x9A\n\ + lsls r0, 1\n\ + cmp r6, r0\n\ + beq _081456EE\n\ + movs r7, 0\n\ + b _081456FC\n\ +_081456EE:\n\ + ldr r0, _081456F4 @ =gSaveBlock2\n\ + ldr r7, [r0, 0x20]\n\ + b _081456FC\n\ + .align 2, 0\n\ +_081456F4: .4byte gSaveBlock2\n\ +_081456F8:\n\ + ldr r0, _081457E8 @ =gSaveBlock2\n\ + ldr r7, [r0, 0x1C]\n\ +_081456FC:\n\ + lsls r0, r6, 3\n\ + ldr r1, _081457EC @ =gMonFrontPicTable\n\ + adds r0, r1\n\ + ldr r1, _081457F0 @ =gMonFrontPicCoords\n\ + lsls r2, r6, 2\n\ + adds r2, r1\n\ + ldrb r1, [r2]\n\ + ldrb r2, [r2, 0x1]\n\ + movs r3, 0x80\n\ + lsls r3, 18\n\ + ldr r4, _081457F4 @ =gUnknown_0840B5A0\n\ + mov r8, r4\n\ + mov r5, r9\n\ + lsls r4, r5, 2\n\ + add r4, r8\n\ + ldr r4, [r4]\n\ + str r4, [sp]\n\ + str r6, [sp, 0x4]\n\ + str r7, [sp, 0x8]\n\ + movs r4, 0x1\n\ + str r4, [sp, 0xC]\n\ + bl LoadSpecialPokePic\n\ + ldr r2, _081457F8 @ =0x0000ffff\n\ + adds r0, r6, 0\n\ + movs r1, 0\n\ + bl species_and_otid_get_pal\n\ + lsls r5, 4\n\ + mov r8, r5\n\ + movs r1, 0x80\n\ + lsls r1, 1\n\ + add r1, r8\n\ + lsls r1, 16\n\ + lsrs r1, 16\n\ + movs r2, 0x20\n\ + bl LoadCompressedPalette\n\ + mov r7, r9\n\ + lsls r6, r7, 24\n\ + lsrs r6, 24\n\ + mov r0, r9\n\ + adds r1, r6, 0\n\ + bl sub_8143648\n\ + ldr r0, _081457FC @ =gUnknown_02024E8C\n\ + mov r2, r10\n\ + lsls r1, r2, 16\n\ + asrs r1, 16\n\ + ldr r3, [sp, 0x10]\n\ + lsls r2, r3, 16\n\ + asrs r2, 16\n\ + movs r3, 0\n\ + bl CreateSprite\n\ + adds r4, r0, 0\n\ + lsls r4, 24\n\ + lsrs r4, 24\n\ + ldr r5, _08145800 @ =gSprites\n\ + lsls r2, r4, 4\n\ + adds r2, r4\n\ + lsls r2, 2\n\ + adds r3, r2, r5\n\ + ldrb r1, [r3, 0x5]\n\ + movs r0, 0xF\n\ + ands r0, r1\n\ + mov r7, r8\n\ + orrs r0, r7\n\ + movs r1, 0xD\n\ + negs r1, r1\n\ + ands r0, r1\n\ + movs r1, 0x4\n\ + orrs r0, r1\n\ + strb r0, [r3, 0x5]\n\ + mov r0, r9\n\ + adds r0, 0x1\n\ + strh r0, [r3, 0x30]\n\ + movs r0, 0x3E\n\ + adds r0, r3\n\ + mov r8, r0\n\ + ldrb r0, [r0]\n\ + orrs r0, r1\n\ + mov r1, r8\n\ + strb r0, [r1]\n\ + adds r0, r5, 0\n\ + adds r0, 0x1C\n\ + adds r2, r0\n\ + ldr r0, _08145804 @ =spritecb_81454E0\n\ + str r0, [r2]\n\ + ldr r0, _08145808 @ =gSpriteTemplate_840CAEC\n\ + movs r2, 0x20\n\ + ldrsh r1, [r3, r2]\n\ + movs r7, 0x22\n\ + ldrsh r2, [r3, r7]\n\ + movs r3, 0x1\n\ + bl CreateSprite\n\ + adds r1, r0, 0\n\ + lsls r1, 24\n\ + lsrs r1, 24\n\ + lsls r0, r1, 4\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + adds r0, r5\n\ + strh r4, [r0, 0x2E]\n\ + adds r1, r6, 0\n\ + bl StartSpriteAnimIfDifferent\n\ + adds r0, r4, 0\n\ + add sp, 0x14\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r1}\n\ + bx r1\n\ + .align 2, 0\n\ +_081457E8: .4byte gSaveBlock2\n\ +_081457EC: .4byte gMonFrontPicTable\n\ +_081457F0: .4byte gMonFrontPicCoords\n\ +_081457F4: .4byte gUnknown_0840B5A0\n\ +_081457F8: .4byte 0x0000ffff\n\ +_081457FC: .4byte gUnknown_02024E8C\n\ +_08145800: .4byte gSprites\n\ +_08145804: .4byte spritecb_81454E0\n\ +_08145808: .4byte gSpriteTemplate_840CAEC\n\ + .syntax divided\n"); +} +#endif + +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; +} + +__attribute__((naked)) +void sub_81458DC(void) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x4\n\ + ldr r7, _0814597C @ =0x0201c000\n\ + ldr r0, _08145980 @ =0x00004023\n\ + bl VarGet\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + bl GetStarterPokemon\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + bl SpeciesToNationalPokedexNum\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + mov r10, r0\n\ + movs r4, 0x1\n\ + movs r5, 0\n\ + ldr r0, _08145984 @ =0x00000181\n\ + mov r8, r0\n\ +_0814590E:\n\ + adds r0, r4, 0\n\ + movs r1, 0x1\n\ + bl sub_8090D90\n\ + lsls r0, 24\n\ + adds r6, r7, 0\n\ + adds r6, 0x90\n\ + cmp r0, 0\n\ + beq _0814592C\n\ + lsls r0, r5, 1\n\ + adds r0, r6, r0\n\ + strh r4, [r0]\n\ + adds r0, r5, 0x1\n\ + lsls r0, 16\n\ + lsrs r5, r0, 16\n\ +_0814592C:\n\ + adds r0, r4, 0x1\n\ + lsls r0, 16\n\ + lsrs r4, r0, 16\n\ + cmp r4, r8\n\ + bls _0814590E\n\ + adds r4, r5, 0\n\ + ldr r0, _08145984 @ =0x00000181\n\ + lsls r1, r4, 16\n\ + mov r9, r1\n\ + movs r2, 0x8E\n\ + adds r2, r7\n\ + mov r8, r2\n\ + adds r1, r7, 0\n\ + adds r1, 0x86\n\ + str r1, [sp]\n\ + cmp r4, r0\n\ + bhi _08145964\n\ + adds r1, r6, 0\n\ + movs r3, 0\n\ + adds r2, r0, 0\n\ +_08145954:\n\ + lsls r0, r4, 1\n\ + adds r0, r1, r0\n\ + strh r3, [r0]\n\ + adds r0, r4, 0x1\n\ + lsls r0, 16\n\ + lsrs r4, r0, 16\n\ + cmp r4, r2\n\ + bls _08145954\n\ +_08145964:\n\ + movs r2, 0xE5\n\ + lsls r2, 2\n\ + adds r0, r7, r2\n\ + strh r5, [r0]\n\ + mov r1, r9\n\ + lsrs r0, r1, 16\n\ + cmp r0, 0x43\n\ + bhi _08145988\n\ + mov r2, r8\n\ + strh r5, [r2]\n\ + b _0814598E\n\ + .align 2, 0\n\ +_0814597C: .4byte 0x0201c000\n\ +_08145980: .4byte 0x00004023\n\ +_08145984: .4byte 0x00000181\n\ +_08145988:\n\ + movs r0, 0x44\n\ + mov r1, r8\n\ + strh r0, [r1]\n\ +_0814598E:\n\ + movs r5, 0\n\ + movs r2, 0xE5\n\ + lsls r2, 2\n\ + adds r4, r7, r2\n\ + mov r9, r5\n\ + b _0814599E\n\ +_0814599A:\n\ + cmp r5, 0x43\n\ + bhi _081459EE\n\ +_0814599E:\n\ + bl Random\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + ldrh r1, [r4]\n\ + bl __umodsi3\n\ + lsls r0, 16\n\ + lsrs r2, r0, 16\n\ + lsls r1, r5, 1\n\ + adds r1, r7, r1\n\ + lsls r0, r2, 1\n\ + adds r3, r6, r0\n\ + ldrh r0, [r3]\n\ + strh r0, [r1]\n\ + adds r0, r5, 0x1\n\ + lsls r0, 16\n\ + lsrs r5, r0, 16\n\ + mov r0, r9\n\ + strh r0, [r3]\n\ + ldrh r0, [r4]\n\ + subs r0, 0x1\n\ + strh r0, [r4]\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + cmp r2, r0\n\ + beq _081459E8\n\ + ldrh r0, [r4]\n\ + lsls r0, 1\n\ + adds r0, r6, r0\n\ + ldrh r0, [r0]\n\ + strh r0, [r3]\n\ + ldrh r0, [r4]\n\ + lsls r0, 1\n\ + adds r0, r6, r0\n\ + mov r1, r9\n\ + strh r1, [r0]\n\ +_081459E8:\n\ + ldrh r0, [r4]\n\ + cmp r0, 0\n\ + bne _0814599A\n\ +_081459EE:\n\ + mov r2, r8\n\ + ldrh r0, [r2]\n\ + cmp r0, 0x43\n\ + bhi _08145A26\n\ + adds r5, r0, 0\n\ + movs r2, 0\n\ + cmp r5, 0x43\n\ + bhi _08145A5C\n\ + mov r3, r8\n\ +_08145A00:\n\ + lsls r1, r5, 1\n\ + adds r1, r7, r1\n\ + lsls r0, r2, 1\n\ + adds r0, r7, r0\n\ + ldrh r0, [r0]\n\ + strh r0, [r1]\n\ + adds r0, r2, 0x1\n\ + lsls r0, 16\n\ + lsrs r2, r0, 16\n\ + ldrh r0, [r3]\n\ + cmp r2, r0\n\ + bne _08145A1A\n\ + movs r2, 0\n\ +_08145A1A:\n\ + adds r0, r5, 0x1\n\ + lsls r0, 16\n\ + lsrs r5, r0, 16\n\ + cmp r5, 0x43\n\ + bls _08145A00\n\ + b _08145A5C\n\ +_08145A26:\n\ + movs r4, 0\n\ + ldrh r0, [r7]\n\ + cmp r0, r10\n\ + beq _08145A42\n\ +_08145A2E:\n\ + adds r0, r4, 0x1\n\ + lsls r0, 16\n\ + lsrs r4, r0, 16\n\ + lsls r0, r4, 1\n\ + adds r0, r7, r0\n\ + ldrh r0, [r0]\n\ + cmp r0, r10\n\ + beq _08145A42\n\ + cmp r4, 0x43\n\ + bls _08145A2E\n\ +_08145A42:\n\ + mov r1, r8\n\ + ldrh r0, [r1]\n\ + subs r0, 0x1\n\ + cmp r4, r0\n\ + bge _08145A5C\n\ + lsls r0, r4, 1\n\ + adds r0, r7, r0\n\ + ldr r2, [sp]\n\ + ldrh r1, [r2]\n\ + strh r1, [r0]\n\ + mov r0, r10\n\ + strh r0, [r2]\n\ + b _08145A62\n\ +_08145A5C:\n\ + mov r2, r10\n\ + ldr r1, [sp]\n\ + strh r2, [r1]\n\ +_08145A62:\n\ + movs r0, 0x44\n\ + mov r1, r8\n\ + strh r0, [r1]\n\ + add sp, 0x4\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .syntax divided\n"); +} |