#include "global.h" #include "gba/m4a_internal.h" #include "intro.h" #include "data2.h" #include "decompress.h" #include "hall_of_fame.h" #include "intro_credits_graphics.h" #include "libgncmultiboot.h" #include "link.h" #include "m4a.h" #include "main.h" #include "new_game.h" #include "palette.h" #include "rng.h" #include "save.h" #include "songs.h" #include "sound.h" #include "species.h" #include "task.h" #include "title_screen.h" #include "trig.h" #include "unknown_task.h" // define register constants for the inline asm asm(".include \"constants/gba_constants.inc\"\n"); struct UnknownStruct1 { u8 var0_0:4; u8 var0_4:2; u8 var0_6:2; u8 var1; u8 var2; u8 var3; u16 var4; }; extern u8 gUnknown_0841225C; extern u8 gUnknown_084126DC; extern u8 gUnknown_084121FC; extern u8 gUnknown_084128D8; extern u8 gUnknown_08412EB4; extern u8 gUnknown_08412818; extern u8 gUnknown_08413184; extern u8 gUnknown_08413340; extern u8 gUnknown_084139C8; extern u8 gUnknown_08413300; extern u8 gUnknown_08413CCC; extern const struct SpriteTemplate gSpriteTemplate_8416B3C; const extern struct CompressedSpriteSheet gUnknown_08416B54; const extern struct CompressedSpriteSheet gUnknown_08416BDC; extern u16 gUnknown_02039358; extern s16 gUnknown_0203935A; extern s16 gUnknown_0203935C; extern u8 gReservedSpritePaletteCount; void sub_8149248(); void sub_8149264(); void load_intro_part2_graphics(u8 a) { LZ77UnCompVram(&gUnknown_0841225C, (void *)(VRAM + 0x4000)); LZ77UnCompVram(&gUnknown_084126DC, (void *)(VRAM + 0x7800)); LoadPalette(&gUnknown_084121FC, 240, 32); switch (a) { case 0: default: LZ77UnCompVram(&gUnknown_084128D8, (void *)(VRAM)); LZ77UnCompVram(&gUnknown_08412EB4, (void *)(VRAM + 0x3000)); LoadPalette(&gUnknown_08412818, 0, 96); LoadCompressedObjectPic(&gUnknown_08416B54); LoadPalette(&gUnknown_08413184, 256, 32); sub_8149248(); break; case 1: LZ77UnCompVram(&gUnknown_08413340, (void *)(VRAM)); LZ77UnCompVram(&gUnknown_084139C8, (void *)(VRAM + 0x3000)); LoadPalette(&gUnknown_08413300, 0, 32); LoadCompressedObjectPic(&gUnknown_08416BDC); LoadPalette(&gUnknown_08413CCC, 256, 32); sub_8149264(); break; } gUnknown_0203935C = 0; gReservedSpritePaletteCount = 8; } void sub_8148C78(u8 a) { if (a == 1) { REG_BG3CNT = 0x603; REG_BG2CNT = 0x702; REG_BG1CNT = 0xF05; REG_DISPCNT = 0x1E40; } else { REG_BG3CNT = 0x603; REG_BG2CNT = 0x702; REG_BG1CNT = 0xF05; REG_DISPCNT = 0x1E40; } } extern u8 gUnknown_084131C4; extern u8 gUnknown_084131A4; extern u8 gUnknown_0841221C; extern u8 gUnknown_08412878; extern u8 gUnknown_08413320; extern u8 gUnknown_0841223C; extern u8 gUnknown_08413E78; extern u8 gUnknown_08414084; extern u8 gUnknown_08413E38; const extern struct CompressedSpriteSheet gUnknown_08416C70; extern u8 gUnknown_08414064; extern struct UnknownStruct1 gUnknown_08416B94; extern struct UnknownStruct1 gUnknown_08416C10; extern struct UnknownStruct1 gUnknown_08416C8C; const extern union AnimCmd *const gSpriteAnimTable_8416B84; const extern union AnimCmd *const gSpriteAnimTable_8416C04; const extern union AnimCmd *const gSpriteAnimTable_8416C88; const extern struct SpriteTemplate gSpriteTemplate_8416CDC; const extern struct SpriteTemplate gSpriteTemplate_Brendan; const extern struct SpriteTemplate gSpriteTemplate_8416CF4; const extern struct SpriteTemplate gSpriteTemplate_May; const extern struct SpriteTemplate gSpriteTemplate_8416D7C; const extern struct SpriteTemplate gSpriteTemplate_8416D94; void sub_8149280(); void sub_8148CB0(u8 a) { LZ77UnCompVram(&gUnknown_0841225C, (void *)(VRAM + 0x4000)); LZ77UnCompVram(&gUnknown_084126DC, (void *)(VRAM + 0x7800)); switch (a) { case 0: default: LoadPalette(&gUnknown_084121FC, 240, 32); LZ77UnCompVram(&gUnknown_084128D8, (void *)(VRAM)); LZ77UnCompVram(&gUnknown_08412EB4, (void *)(VRAM + 0x3000)); LoadPalette(&gUnknown_08412818, 0, 96); LoadCompressedObjectPic(&gUnknown_08416B54); LZ77UnCompVram(&gUnknown_084131C4, (void *)(VRAM + 0x10000)); LoadPalette(&gUnknown_08413184, 256, 32); sub_8149248(); break; case 1: LoadPalette(&gUnknown_0841221C, 240, 32); LZ77UnCompVram(&gUnknown_084128D8, (void *)(VRAM)); LZ77UnCompVram(&gUnknown_08412EB4, (void *)(VRAM + 0x3000)); LoadPalette(&gUnknown_08412878, 0, 96); LoadCompressedObjectPic(&gUnknown_08416B54); LZ77UnCompVram(&gUnknown_084131C4, (void *)(VRAM + 0x10000)); LoadPalette(&gUnknown_084131A4, 256, 32); sub_8149248(); break; case 2: case 3: LoadPalette(&gUnknown_0841221C, 240, 32); LZ77UnCompVram(&gUnknown_08413340, (void *)(VRAM)); LZ77UnCompVram(&gUnknown_084139C8, (void *)(VRAM + 0x3000)); LoadPalette(&gUnknown_08413320, 0, 32); LoadCompressedObjectPic(&gUnknown_08416BDC); LoadPalette(&gUnknown_08413320, 256, 32); sub_8149264(); break; case 4: LoadPalette(&gUnknown_0841223C, 240, 32); LZ77UnCompVram(&gUnknown_08413E78, (void *)(VRAM)); LZ77UnCompVram(&gUnknown_08414084, (void *)(VRAM + 0x3000)); LoadPalette(&gUnknown_08413E38, 0, 64); LoadCompressedObjectPic(&gUnknown_08416C70); LoadPalette(&gUnknown_08414064, 256, 32); sub_8149280(); break; } gReservedSpritePaletteCount = 8; gUnknown_0203935C = 0; } void sub_8148E90(u8 a) { REG_BG3CNT = 0x603; REG_BG2CNT = 0x702; REG_BG1CNT = 0xF05; REG_DISPCNT = 0x1F40; } u8 sub_8148EC0(u8 a, u16 b, u16 c, u16 d) { u8 taskId = CreateTask(&sub_8148F3C, 0); gTasks[taskId].data[0] = a; gTasks[taskId].data[1] = b; gTasks[taskId].data[2] = 0; gTasks[taskId].data[3] = 0; gTasks[taskId].data[4] = c; gTasks[taskId].data[5] = 0; gTasks[taskId].data[6] = 0; gTasks[taskId].data[7] = d; gTasks[taskId].data[8] = 8; gTasks[taskId].data[9] = 0; sub_8148F3C(taskId); return taskId; } #ifdef NONMATCHING void sub_8148F3C(u8 taskId) { register u32 r4 asm("r4"); s32 r2; r4 = (u16)gTasks[taskId].data[1] << 16; if (r4 != 0) { r2 = (gTasks[taskId].data[2] << 16) + (u16)gTasks[taskId].data[3] - (r4 >> 12); gTasks[taskId].data[2] = r2 >> 16; gTasks[taskId].data[3] = r2; REG_BG1HOFS = gTasks[taskId].data[2]; REG_BG1VOFS = gUnknown_0203935A + gUnknown_02039358; } r4 = (u16)gTasks[taskId].data[4] << 16; if (r4 != 0) { r2 = (gTasks[taskId].data[5] << 16) + (u16)gTasks[taskId].data[6] - (r4 >> 12); gTasks[taskId].data[5] = r2 >> 16; gTasks[taskId].data[3] = r2; REG_BG2HOFS = gTasks[taskId].data[5]; if (gTasks[taskId].data[0] != 0) REG_BG2VOFS = gUnknown_0203935A + gUnknown_02039358; else REG_BG2VOFS = gUnknown_02039358; } r4 = (u16)gTasks[taskId].data[7] << 16; if (r4 != 0) { r2 = (gTasks[taskId].data[8] << 16) + (u16)gTasks[taskId].data[9] - (r4 >> 12);; gTasks[taskId].data[8] = r2 >> 16; gTasks[taskId].data[9] = r2; REG_BG3HOFS = gTasks[taskId].data[8]; REG_BG3VOFS = gUnknown_02039358; } } #else __attribute__((naked)) void sub_8148F3C(u8 taskId) { asm(".syntax unified\n\ push {r4-r6,lr}\n\ lsls r0, 24\n\ lsrs r5, r0, 24\n\ ldr r1, _08148FB4 @ =gTasks\n\ lsls r0, r5, 2\n\ adds r0, r5\n\ lsls r0, 3\n\ adds r3, r0, r1\n\ ldrh r0, [r3, 0xA]\n\ lsls r4, r0, 16\n\ adds r6, r1, 0\n\ cmp r4, 0\n\ beq _08148F7C\n\ movs r1, 0xC\n\ ldrsh r0, [r3, r1]\n\ lsls r0, 16\n\ ldrh r1, [r3, 0xE]\n\ adds r2, r0, r1\n\ lsrs r0, r4, 12\n\ subs r2, r0\n\ asrs r1, r2, 16\n\ strh r1, [r3, 0xC]\n\ strh r2, [r3, 0xE]\n\ ldr r0, _08148FB8 @ =REG_BG1HOFS\n\ strh r1, [r0]\n\ ldr r2, _08148FBC @ =REG_BG1VOFS\n\ ldr r1, _08148FC0 @ =gUnknown_02039358\n\ ldr r0, _08148FC4 @ =gUnknown_0203935A\n\ ldrh r0, [r0]\n\ ldrh r1, [r1]\n\ adds r0, r1\n\ strh r0, [r2]\n\ _08148F7C:\n\ ldrh r0, [r3, 0x10]\n\ lsls r4, r0, 16\n\ cmp r4, 0\n\ beq _08148FD8\n\ movs r1, 0x12\n\ ldrsh r0, [r3, r1]\n\ lsls r0, 16\n\ ldrh r1, [r3, 0x14]\n\ adds r2, r0, r1\n\ lsrs r0, r4, 12\n\ subs r2, r0\n\ asrs r1, r2, 16\n\ strh r1, [r3, 0x12]\n\ strh r2, [r3, 0x14]\n\ ldr r0, _08148FC8 @ =REG_BG2HOFS\n\ strh r1, [r0]\n\ movs r1, 0x8\n\ ldrsh r0, [r3, r1]\n\ cmp r0, 0\n\ beq _08148FD0\n\ ldr r2, _08148FCC @ =REG_BG2VOFS\n\ ldr r1, _08148FC0 @ =gUnknown_02039358\n\ ldr r0, _08148FC4 @ =gUnknown_0203935A\n\ ldrh r0, [r0]\n\ ldrh r1, [r1]\n\ adds r0, r1\n\ strh r0, [r2]\n\ b _08148FD8\n\ .align 2, 0\n\ _08148FB4: .4byte gTasks\n\ _08148FB8: .4byte REG_BG1HOFS\n\ _08148FBC: .4byte REG_BG1VOFS\n\ _08148FC0: .4byte gUnknown_02039358\n\ _08148FC4: .4byte gUnknown_0203935A\n\ _08148FC8: .4byte REG_BG2HOFS\n\ _08148FCC: .4byte REG_BG2VOFS\n\ _08148FD0:\n\ ldr r0, _08149010 @ =REG_BG2VOFS\n\ ldr r1, _08149014 @ =gUnknown_02039358\n\ ldrh r1, [r1]\n\ strh r1, [r0]\n\ _08148FD8:\n\ lsls r0, r5, 2\n\ adds r0, r5\n\ lsls r0, 3\n\ adds r3, r0, r6\n\ ldrh r0, [r3, 0x16]\n\ lsls r4, r0, 16\n\ cmp r4, 0\n\ beq _08149008\n\ movs r1, 0x18\n\ ldrsh r0, [r3, r1]\n\ lsls r0, 16\n\ ldrh r1, [r3, 0x1A]\n\ adds r2, r0, r1\n\ lsrs r0, r4, 12\n\ subs r2, r0\n\ asrs r1, r2, 16\n\ strh r1, [r3, 0x18]\n\ strh r2, [r3, 0x1A]\n\ ldr r0, _08149018 @ =REG_BG3HOFS\n\ strh r1, [r0]\n\ ldr r1, _0814901C @ =REG_BG3VOFS\n\ ldr r0, _08149014 @ =gUnknown_02039358\n\ ldrh r0, [r0]\n\ strh r0, [r1]\n\ _08149008:\n\ pop {r4-r6}\n\ pop {r0}\n\ bx r0\n\ .align 2, 0\n\ _08149010: .4byte REG_BG2VOFS\n\ _08149014: .4byte gUnknown_02039358\n\ _08149018: .4byte REG_BG3HOFS\n\ _0814901C: .4byte REG_BG3VOFS\n\ .syntax divided\n"); } #endif void sub_8149020(u8 mode) { u16 var1; u16 var2; switch (mode) { case 0: default: /* stuff */ if (gMain.vblankCounter1 & 3 || gPaletteFade.active) break; if (gMain.vblankCounter1 & 4) { var1 = gPlttBufferUnfaded[9]; var2 = gPlttBufferUnfaded[10]; } else { var1 = gPlttBufferUnfaded[10]; var2 = gPlttBufferUnfaded[9]; } LoadPalette(&var1, 9, 2); LoadPalette(&var2, 10, 2); break; case 2: if (gMain.vblankCounter1 & 3 || gPaletteFade.active) break; if (gMain.vblankCounter1 & 4) { var1 = 0x3D27; var2 = 0x295; } else { var1 = 0x31C; var2 = 0x3D27; } LoadPalette(&var1, 12, 2); LoadPalette(&var2, 13, 2); break; case 1: break; } } void sub_814910C(struct Sprite *sprite) { if (gUnknown_0203935C) { DestroySprite(sprite); } else { s32 var = ((sprite->pos1.x << 16) | (u16)sprite->data2) + (u16)sprite->data1; sprite->pos1.x = var >> 16; sprite->data2 = var; if (sprite->pos1.x > 255) sprite->pos1.x = 0xFFE0; if (sprite->data0) { sprite->pos2.y = -(gUnknown_02039358 + gUnknown_0203935A); } else { sprite->pos2.y = -gUnknown_02039358; } } } void sub_8149174(u8 a, struct UnknownStruct1 *b, const union AnimCmd *const *c, u8 d) { u8 i; for(i = 0; i < d; i++) { u8 sprite = CreateSprite(&gSpriteTemplate_8416B3C, b[i].var1, b[i].var2, b[i].var3); CalcCenterToCornerVec(&gSprites[sprite], b[i].var0_4, b[i].var0_6, 0); gSprites[sprite].oam.priority = 3; gSprites[sprite].oam.shape = b[i].var0_4; gSprites[sprite].oam.size = b[i].var0_6; gSprites[sprite].oam.paletteNum = 0; gSprites[sprite].anims = c; StartSpriteAnim(&gSprites[sprite], b[i].var0_0); gSprites[sprite].data0 = a; gSprites[sprite].data1 = b[i].var4; gSprites[sprite].data2 = 0; } } void sub_8149248() { sub_8149174(0, &gUnknown_08416B94, &gSpriteAnimTable_8416B84, 9); } void sub_8149264() { sub_8149174(1, &gUnknown_08416C10, &gSpriteAnimTable_8416C04, 12); } void sub_8149280() { sub_8149174(1, &gUnknown_08416C8C, &gSpriteAnimTable_8416C88, 6); } void nullsub_82() { } void sub_81492A0(struct Sprite* sprite) { sprite->invisible = gSprites[sprite->data0].invisible; sprite->pos1.x = gSprites[sprite->data0].pos1.x; sprite->pos1.y = gSprites[sprite->data0].pos1.y + 8; sprite->pos2.x = gSprites[sprite->data0].pos2.x; sprite->pos2.y = gSprites[sprite->data0].pos2.y; } u8 intro_create_brendan_sprite(s16 a, s16 b) { u8 sprite = CreateSprite(&gSpriteTemplate_8416CDC, a, b, 0); u8 brendan = CreateSprite(&gSpriteTemplate_Brendan, a, b + 8, 1); gSprites[brendan].data0 = sprite; return sprite; } u8 intro_create_may_sprite(s16 a, s16 b) { u8 sprite = CreateSprite(&gSpriteTemplate_8416CF4, a, b, 0); u8 may = CreateSprite(&gSpriteTemplate_May, a, b + 8, 1); gSprites[may].data0 = sprite; return sprite; } void nullsub_83() { } void sub_81493C4(struct Sprite* sprite) { sprite->invisible = gSprites[sprite->data0].invisible; sprite->pos1.y = gSprites[sprite->data0].pos1.y; sprite->pos2.x = gSprites[sprite->data0].pos2.x; sprite->pos2.y = gSprites[sprite->data0].pos2.y; } u8 intro_create_latios_sprite(s16 a, s16 b) { u8 sprite = CreateSprite(&gSpriteTemplate_8416D7C, a - 32, b, 2); u8 latios = CreateSprite(&gSpriteTemplate_8416D7C, a + 32, b, 2); gSprites[latios].data0 = sprite; StartSpriteAnim(&gSprites[latios], 1); gSprites[latios].callback = &sub_81493C4; return sprite; } u8 intro_create_latias_sprite(s16 a, s16 b) { u8 sprite = CreateSprite(&gSpriteTemplate_8416D94, a - 32, b, 2); u8 latios = CreateSprite(&gSpriteTemplate_8416D94, a + 32, b, 2); gSprites[latios].data0 = sprite; StartSpriteAnim(&gSprites[latios], 1); gSprites[latios].callback = &sub_81493C4; return sprite; }