diff options
author | Cameron Hall <camthesaxman@users.noreply.github.com> | 2016-11-25 13:32:45 -0600 |
---|---|---|
committer | YamaArashi <YamaArashi@users.noreply.github.com> | 2016-11-25 11:32:45 -0800 |
commit | e30044965f85abdbbcc80e37b1151bb7b7d786cb (patch) | |
tree | d1d0574119a1a7da8ff692a9b84e4345b056fdc5 /src | |
parent | bc912a7a7378dce12ebea75b82bbcf6d7c1e3524 (diff) |
Decompile more intro functions (#108)
* start decompiling intro task
* ignore Thumbs.db
* decompile more code
* actually ignore Thumbs.db
* decompile more functions
* fix sapphire
* sort of fix task_intro_7
* name some functions and variables
* more cleanup
Diffstat (limited to 'src')
-rw-r--r-- | src/decompress.c | 14 | ||||
-rw-r--r-- | src/intro.c | 592 | ||||
-rw-r--r-- | src/sprite.c | 14 |
3 files changed, 587 insertions, 33 deletions
diff --git a/src/decompress.c b/src/decompress.c index adc6798b6..b38acc7b2 100644 --- a/src/decompress.c +++ b/src/decompress.c @@ -10,7 +10,7 @@ extern void *gUnknown_081FAF4C[]; extern void DrawSpindaSpots(u16, u32, void *, u8); -void sub_800D378(struct SpriteSheet *a, u32 b, u32 c, u32 d, void *e, s32 f, u32 g, u32 h); +void sub_800D378(const struct SpriteSheet *a, u32 b, u32 c, u32 d, void *e, s32 f, u32 g, u32 h); void sub_800D238(const void *src, void *dest) { @@ -22,7 +22,7 @@ void LZDecompressVram(const void *src, void *dest) LZ77UnCompVram(src, dest); } -void LoadCompressedObjectPic(struct SpriteSheet *a) +void LoadCompressedObjectPic(const struct SpriteSheet *a) { struct SpriteSheet spriteSheet; @@ -33,7 +33,7 @@ void LoadCompressedObjectPic(struct SpriteSheet *a) LoadSpriteSheet(&spriteSheet); } -void LoadCompressedObjectPicOverrideBuffer(struct SpriteSheet *a, void *buffer) +void LoadCompressedObjectPicOverrideBuffer(const struct SpriteSheet *a, void *buffer) { struct SpriteSheet spriteSheet; @@ -44,7 +44,7 @@ void LoadCompressedObjectPicOverrideBuffer(struct SpriteSheet *a, void *buffer) LoadSpriteSheet(&spriteSheet); } -void LoadCompressedObjectPalette(struct SpritePalette *a) +void LoadCompressedObjectPalette(const struct SpritePalette *a) { struct SpritePalette spritePalette; @@ -54,7 +54,7 @@ void LoadCompressedObjectPalette(struct SpritePalette *a) LoadSpritePalette(&spritePalette); } -void LoadCompressedObjectPaletteOverrideBuffer(struct SpritePalette *a, void *buffer) +void LoadCompressedObjectPaletteOverrideBuffer(const struct SpritePalette *a, void *buffer) { struct SpritePalette spritePalette; @@ -72,7 +72,7 @@ void DecompressPicFromTable_2(const struct SpriteSheet *a, u8 b, u8 c, void *d, LZ77UnCompWram(a->data, e); } -void sub_800D334(struct SpriteSheet *a, u32 b, u32 c, u32 d, void *dest, s32 f, u32 g) +void sub_800D334(const struct SpriteSheet *a, u32 b, u32 c, u32 d, void *dest, s32 f, u32 g) { u32 unk; @@ -83,7 +83,7 @@ void sub_800D334(struct SpriteSheet *a, u32 b, u32 c, u32 d, void *dest, s32 f, sub_800D378(a, b, c, d, dest, f, g, unk); } -void sub_800D378(struct SpriteSheet *a, u32 b, u32 c, u32 d, void *dest, s32 f, u32 g, u32 h) +void sub_800D378(const struct SpriteSheet *a, u32 b, u32 c, u32 d, void *dest, s32 f, u32 g, u32 h) { u8 r7 = h; diff --git a/src/intro.c b/src/intro.c index e103109f9..ac51e456c 100644 --- a/src/intro.c +++ b/src/intro.c @@ -1,8 +1,14 @@ #include "global.h" +#include "link.h" #include "main.h" #include "palette.h" +#include "rng.h" +#include "songs.h" +#include "sound.h" +#include "species.h" +#include "sprite.h" #include "task.h" -#include "link.h" +#include "trig.h" struct GcmbStruct { @@ -10,57 +16,131 @@ struct GcmbStruct u8 gcmb_field_2; }; -extern s32 gUnknown_03005ED0; +extern u16 gUnknown_02039318; +extern u16 gUnknown_0203931A; +extern u16 gUnknown_02039358; +extern u16 gUnknown_0203935A; + +extern u32 gIntroFrameCounter; extern struct GcmbStruct gUnknown_03005EE0; extern u16 gSaveFileStatus; +extern u8 gReservedSpritePaletteCount; + +extern const u16 gUnknown_08406974[]; +extern const u8 gUnknown_08406B74[]; +extern const u8 gUnknown_08406F28[]; +extern const u8 gUnknown_0840725C[]; +extern const u8 gUnknown_0840754C[]; +extern const u8 gUnknown_08407764[]; +extern const u8 gUnknown_084098D4[]; +extern const u8 gUnknown_08409AD4[]; +extern const u8 gUnknown_08409C04[]; +extern const u16 gUnknown_0840A758[]; +extern const u8 gUnknown_0840A778[]; +extern const u8 gUnknown_0840A7E4[]; +extern union AnimCmd *gUnknown_0840AE80[]; +extern const struct SpriteTemplate gSpriteTemplate_840AFF0; +extern const struct SpriteSheet gUnknown_0840B008; +extern const struct SpriteSheet gUnknown_0840B018; +extern const struct SpritePalette gUnknown_0840B028[]; +extern const struct SpriteTemplate gSpriteTemplate_840B1F4; +extern const struct SpriteSheet gUnknown_0840B20C; +extern const struct SpriteSheet gUnknown_0840B21C; +extern const struct SpritePalette gUnknown_0840B22C; +extern const struct SpritePalette gUnknown_0840B23C[]; +extern const struct SpriteSheet gIntro2BrendanSpriteSheet; +extern const struct SpriteSheet gIntro2MaySpriteSheet; +extern const struct SpriteSheet gIntro2BicycleSpriteSheet; +extern const struct SpriteSheet gIntro2LatiosSpriteSheet; +extern const struct SpriteSheet gIntro2LatiasSpriteSheet; +extern const struct SpritePalette gIntro2SpritePalettes[]; extern const u8 gIntroCopyright_Gfx[]; extern const u16 gIntroCopyright_Pal[]; extern const u16 gIntroCopyright_Tilemap[]; +extern void LoadCompressedObjectPic(const struct SpriteSheet *); +extern void LoadCompressedObjectPalette(const struct SpritePalette *); extern void CB2_InitTitleScreen(void); +extern u8 sub_8148EC0(/*TODO: arg types*/); +extern u8 intro_create_brendan_sprite(/*TODO: arg types*/); +extern u8 intro_create_may_sprite(/*TODO: arg types*/); -void CB2_813B7EC(void); -void task_intro_1(u8); +static void MainCB2_EndIntro(void); +static void Task_IntroLoadPart1Graphics(u8); +static void Task_IntroFadeIn(u8); +static void Task_IntroWaterDrops(u8); +static void task_intro_4(u8); +static void task_intro_5(u8); +static void Task_IntroLoadPart2Graphics(u8); +static void Task_IntroStartBikeRide(u8); +static void task_intro_8(u8); +static void task_intro_9(u8); +static void task_intro_10(u8); +static void task_intro_11(u8); +static void task_intro_12(u8); +static void task_intro_13(u8); +static void task_intro_14(u8); +static void task_intro_15(u8); +static void task_intro_16(u8); +static void task_intro_17(u8); +static void Task_IntroPokemonBattle(u8); +static void task_intro_19(u8); +void sub_813CAF4(u8); +void intro_reset_and_hide_bgs(void); +void sub_813CCE8(u8); +void sub_813CE30(u16, u16, u16, u16); +u8 sub_813CE88(/*TODO: arg types*/); +u8 sub_813CFA8(/*TODO: arg types*/); +u8 sub_813D584(/*TODO: arg types*/); +void sub_813D788(struct Sprite *); +void sub_813D880(struct Sprite *); +sub_813D954(/*TODO: arg types*/); +void sub_813DB9C(struct Sprite *); +void sub_813DE70(struct Sprite *); +void sub_813E10C(struct Sprite *); +void sub_813E210(struct Sprite *); +void sub_813E7C0(u8); +void sub_813EB4C(u8); -void sub_813B784(void) +static void VBlankCB_Intro(void) { LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); } -void CB2_813B798(void) +static void MainCB2_Intro(void) { RunTasks(); AnimateSprites(); BuildOamBuffer(); UpdatePaletteFade(); if (gMain.newKeys && !gPaletteFade.active) - SetMainCallback2(CB2_813B7EC); - else if (gUnknown_03005ED0 != -1) - gUnknown_03005ED0++; + SetMainCallback2(MainCB2_EndIntro); + else if (gIntroFrameCounter != -1) + gIntroFrameCounter++; } -void CB2_813B7EC(void) +static void MainCB2_EndIntro(void) { if (!UpdatePaletteFade()) SetMainCallback2(CB2_InitTitleScreen); } -void sub_813B808(u16 a1, u16 a2, u16 a3) +static void LoadCopyrightGraphics(u16 a1, u16 a2, u16 a3) { LZ77UnCompVram(gIntroCopyright_Gfx, (void *)(VRAM + a1)); LoadPalette(gIntroCopyright_Pal, a3, 0x20); CpuCopy16(gIntroCopyright_Tilemap, (void *)(VRAM + a2), 0x500); } -void SerialCb_CopyrightScreen(void) +static void SerialCb_CopyrightScreen(void) { GameCubeMultiBoot_HandleSerialInterrupt(&gUnknown_03005EE0); } -u8 SetUpCopyrightScreen(void) +static u8 SetUpCopyrightScreen(void) { u16 ime; @@ -79,7 +159,7 @@ u8 SetUpCopyrightScreen(void) DmaFill32(3, 0, (void *)OAM, OAM_SIZE); DmaFill16(3, 0, (void *)(PLTT + 2), PLTT_SIZE - 2); ResetPaletteFade(); - sub_813B808(0, 14336, 0); + LoadCopyrightGraphics(0, 14336, 0); remove_some_task(); ResetTasks(); ResetSpriteData(); @@ -90,9 +170,9 @@ u8 SetUpCopyrightScreen(void) REG_IME = 0; REG_IE |= INTR_FLAG_VBLANK; REG_IME = ime; - REG_DISPSTAT |= 8; - SetVBlankCallback(sub_813B784); - REG_DISPCNT = 320; + REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; + SetVBlankCallback(VBlankCB_Intro); + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON; SetSerialCallback(SerialCb_CopyrightScreen); GameCubeMultiBoot_Init(&gUnknown_03005EE0); default: @@ -111,8 +191,8 @@ u8 SetUpCopyrightScreen(void) case 141: if (UpdatePaletteFade()) break; - CreateTask(task_intro_1, 0); - SetMainCallback2(CB2_813B798); + CreateTask(Task_IntroLoadPart1Graphics, 0); + SetMainCallback2(MainCB2_Intro); if (gUnknown_03005EE0.gcmb_field_2) { GameCubeMultiBoot_ExecuteProgram(&gUnknown_03005EE0); @@ -145,3 +225,477 @@ void CB2_InitCopyrightScreen(void) { SetUpCopyrightScreen(); } + +static void Task_IntroLoadPart1Graphics(u8 taskId) +{ + SetVBlankCallback(NULL); + gUnknown_02039318 = Random() & 1; + intro_reset_and_hide_bgs(); + REG_BG3VOFS = 0; + REG_BG2VOFS = 0x50; + REG_BG1VOFS = 0x18; + REG_BG0VOFS = 0x28; + LZ77UnCompVram(gUnknown_08407764, (void *)VRAM); + LZ77UnCompVram(gUnknown_08406B74, (void *)(VRAM + 0x8000)); + DmaClear16(3, VRAM + 0x8800, 0x800); + LZ77UnCompVram(gUnknown_08406F28, (void *)(VRAM + 0x9000)); + DmaClear16(3, VRAM + 0x9800, 0x800); + LZ77UnCompVram(gUnknown_0840725C, (void *)(VRAM + 0xA000)); + DmaClear16(3, VRAM + 0xA800, 0x800); + LZ77UnCompVram(gUnknown_0840754C, (void *)(VRAM + 0xB000)); + DmaClear16(3, VRAM + 0xB800, 0x800); + LoadPalette(gUnknown_08406974, 0, 0x200); + REG_BG3CNT = 0x9603; + REG_BG2CNT = 0x9402; + REG_BG1CNT = 0x9201; + REG_BG0CNT = 0x9000; + LoadCompressedObjectPic(&gUnknown_0840B008); + LoadCompressedObjectPic(&gUnknown_0840B018); + LoadSpritePalettes(gUnknown_0840B028); + CpuCopy16(gPlttBufferUnfaded + 0x100, gPlttBufferUnfaded + 0x1F0, 0x20); + CpuCopy16(gPlttBufferUnfaded + 0x100, gPlttBufferUnfaded + 0x1E1, 0x1E); + CpuCopy16(gPlttBufferUnfaded + 0x100, gPlttBufferUnfaded + 0x1D2, 0x1C); + CpuCopy16(gPlttBufferUnfaded + 0x100, gPlttBufferUnfaded + 0x1C3, 0x1A); + CpuCopy16(gPlttBufferUnfaded + 0x100, gPlttBufferUnfaded + 0x1B4, 0x18); + CpuCopy16(gPlttBufferUnfaded + 0x100, gPlttBufferUnfaded + 0x1A5, 0x16); + CpuCopy16(gPlttBufferUnfaded + 0x100, gPlttBufferUnfaded + 0x196, 0x14); + gTasks[taskId].data[0] = sub_813D584(0xEC, -14, 0x200, 1, 0x78, 0); + gTasks[taskId].func = Task_IntroFadeIn; +} + +static void Task_IntroFadeIn(u8 taskId) +{ + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0); + SetVBlankCallback(VBlankCB_Intro); + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON; + gTasks[taskId].func = Task_IntroWaterDrops; + gIntroFrameCounter = 0; + m4aSongNumStart(0x19E); + ResetSerial(); +} + +static void Task_IntroWaterDrops(u8 taskId) +{ + //start moving rock + if (gIntroFrameCounter == 76) + gSprites[gTasks[taskId].data[0]].data0 = 1; + + //drop rock + if (gIntroFrameCounter == 251) + gSprites[gTasks[taskId].data[0]].data0 = 2; + + //drop two more rocks + if (gIntroFrameCounter == 368) + sub_813D584(0x30, 0, 0x400, 5, 0x70, 1); + if (gIntroFrameCounter == 384) + sub_813D584(0xC8, 0x3C, 0x400, 9, 0x80, 1); + + //show GameFreak logo + if (gIntroFrameCounter == 560) + sub_813D954(0x78, 0x50, CreateTask(sub_813CCE8, 0)); + + if (gIntroFrameCounter > 739) + { + gTasks[taskId].data[1] = 0x50; + gTasks[taskId].data[2] = 0; + gTasks[taskId].data[3] = 0x18; + gTasks[taskId].data[4] = 0; + gTasks[taskId].data[5] = 0x28; + gTasks[taskId].data[6] = 0; + gTasks[taskId].func = task_intro_4; + } +} + +static void task_intro_4(u8 taskId) +{ + if (gIntroFrameCounter < 904) + { + s32 r2; + + //slide backgrounds downward + r2 = (gTasks[taskId].data[1] << 16) + (u16)gTasks[taskId].data[2] - 0xC000; + gTasks[taskId].data[1] = r2 >> 16; + gTasks[taskId].data[2] = r2; + REG_BG2VOFS = gTasks[taskId].data[1]; + r2 = (gTasks[taskId].data[3] << 16) + (u16)gTasks[taskId].data[4] - 0x10000; + gTasks[taskId].data[3] = r2 >> 16; + gTasks[taskId].data[4] = r2; + REG_BG1VOFS = gTasks[taskId].data[3]; + r2 = (gTasks[taskId].data[5] << 16) + (u16)gTasks[taskId].data[6] - 0x18000; + gTasks[taskId].data[5] = r2 >> 16; + gTasks[taskId].data[6] = r2; + REG_BG0VOFS = gTasks[taskId].data[5]; + + //show Lati@s sprite + if (gIntroFrameCounter == 880) + { + u8 spriteId = CreateSprite(&gSpriteTemplate_840AFF0, 0xC8, 0xA0, 10); + + gSprites[spriteId].invisible = 1; + } + } + else + { + //fade to white + if (gIntroFrameCounter > 1007) + { + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0xFFFF); + gTasks[taskId].func = task_intro_5; + } + } +} + +static void task_intro_5(u8 taskId) +{ + if (gIntroFrameCounter > 1026) + gTasks[taskId].func = Task_IntroLoadPart2Graphics; +} + +static void Task_IntroLoadPart2Graphics(u8 taskId) +{ + intro_reset_and_hide_bgs(); + SetVBlankCallback(NULL); + ResetSpriteData(); + FreeAllSpritePalettes(); + gUnknown_02039358 = 0; + gUnknown_0203935A = 0; +#ifdef SAPPHIRE + load_intro_part2_graphics(0); +#else + load_intro_part2_graphics(1); +#endif + gTasks[taskId].func = Task_IntroStartBikeRide; +} + +static void Task_IntroStartBikeRide(u8 taskId) +{ + u8 spriteId; + + if (gUnknown_02039318 == 0) + LoadCompressedObjectPic(&gIntro2BrendanSpriteSheet); + else + LoadCompressedObjectPic(&gIntro2MaySpriteSheet); + LoadCompressedObjectPic(&gIntro2BicycleSpriteSheet); +#ifdef SAPPHIRE + LoadCompressedObjectPic(&gIntro2LatiasSpriteSheet); +#else + LoadCompressedObjectPic(&gIntro2LatiosSpriteSheet); +#endif + LoadSpritePalettes(gIntro2SpritePalettes); + if (gUnknown_02039318 == 0) + spriteId = intro_create_brendan_sprite(0x110, 100); + else + spriteId = intro_create_may_sprite(0x110, 100); + gSprites[spriteId].callback = sub_813D788; + gSprites[spriteId].anims = gUnknown_0840AE80; + gTasks[taskId].data[1] = spriteId; +#ifdef SAPPHIRE + spriteId = intro_create_latias_sprite(-0x40, 0x3C); +#else + spriteId = intro_create_latios_sprite(-0x40, 0x3C); +#endif + gSprites[spriteId].callback = sub_813D880; + gTasks[taskId].data[2] = spriteId; + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0xFFFF); + SetVBlankCallback(VBlankCB_Intro); +#ifdef SAPPHIRE + gTasks[taskId].data[0] = sub_8148EC0(0, 0x4000, 0x40, 0x10); + sub_8148C78(0); +#else + gTasks[taskId].data[0] = sub_8148EC0(1, 0x4000, 0x400, 0x10); + sub_8148C78(1); +#endif + gTasks[taskId].func = task_intro_8; +} + +static void task_intro_8(u8 taskId) +{ + s16 a; + u16 sine; + + if (gIntroFrameCounter > 1823) + { + BeginNormalPaletteFade(0xFFFFFFFF, 0x10, 0, 0x10, 0xFFFF); + gTasks[taskId].func = task_intro_9; + } + if (gIntroFrameCounter == 1109) + gSprites[gTasks[taskId].data[1]].data0 = 1; + if (gIntroFrameCounter == 1214) + gSprites[gTasks[taskId].data[1]].data0 = 0; + if (gIntroFrameCounter == 1394) + gSprites[gTasks[taskId].data[2]].data0 = 1; + if (gIntroFrameCounter == 1398) + gSprites[gTasks[taskId].data[1]].data0 = 2; + if (gIntroFrameCounter == 1586) + gSprites[gTasks[taskId].data[1]].data0 = 3; + if (gIntroFrameCounter == 1727) + gSprites[gTasks[taskId].data[1]].data0 = 4; + + //TODO: Clean this up + a = (((u16)gTasks[taskId].data[3] << 16) >> 18) & 0x7F; + sine = Sin(a, 0x30); + gUnknown_0203935A = sine; + if (gTasks[taskId].data[3] < 0x200) + gTasks[taskId].data[3]++; +#ifdef SAPPHIRE + sub_8149020(0); +#else + sub_8149020(1); +#endif +} + +static void task_intro_9(u8 taskId) +{ + if (gIntroFrameCounter > 2068) + { + DestroyTask(gTasks[taskId].data[0]); + gTasks[taskId].func = task_intro_10; + } +} + +static void task_intro_10(u8 taskId) +{ + intro_reset_and_hide_bgs(); + LZ77UnCompVram(gUnknown_08409C04, (void *)VRAM); + LZ77UnCompVram(gUnknown_08409AD4, (void *)(VRAM + 0x4000)); + LoadPalette(gUnknown_084098D4, 0, 0x200); + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[1] = 0; + gTasks[taskId].data[2] = 0; + gTasks[taskId].data[3] = 0; + sub_813CE30(0x78, 0x50, 0, 0); + ResetSpriteData(); + FreeAllSpritePalettes(); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0xFFFF); + REG_BG2CNT = 0x4883; + REG_DISPCNT = DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG2_ON | DISPCNT_OBJ_ON; + gTasks[taskId].func = task_intro_11; + gIntroFrameCounter = 0; + m4aSongNumStart(0x1BA); +} + +static void task_intro_11(u8 taskId) +{ + gTasks[taskId].data[0] += 0x400; + if (gTasks[taskId].data[1] <= 0x6BF) + { + gTasks[taskId].data[1] += gTasks[taskId].data[2]; + gTasks[taskId].data[2]++; + } + else + { + gTasks[taskId].func = task_intro_12; + } + sub_813CE30(0x78, 0x50, 0x10000 / gTasks[taskId].data[1], gTasks[taskId].data[0]); + if (gIntroFrameCounter == 44) + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0xFFFF); +} + +static void task_intro_12(u8 taskId) +{ + if (gIntroFrameCounter > 59) + gTasks[taskId].func = task_intro_13; +} + +extern u8 unk_2000000[][32]; + +static void task_intro_13(u8 taskId) +{ + u16 i; + void *vram; + + intro_reset_and_hide_bgs(); + for (i = 0; i < 32; i++) + { + unk_2000000[0][i] = 0; + unk_2000000[1][i] = 17; + unk_2000000[2][i] = 34; + } + vram = (void *)VRAM; + DmaCopy16(3, unk_2000000, vram, 0x60); + for (i = 0; i < 0x280; i++) + ((u16 *)(VRAM + 0x3000))[i] = 0xF001; + for (i = 0; i < 0x80; i++) + ((u16 *)(VRAM + 0x3800))[i] = 0xF002; + for (i = 0; i < 0x180; i++) + ((u16 *)(VRAM + 0x3900))[i] = 0xF000; + for (i = 0; i < 0x80; i++) + ((u16 *)(VRAM + 0x3C00))[i] = 0xF002; + gPlttBufferUnfaded[0xF0] = RGB_WHITE; + gPlttBufferFaded[0xF0] = RGB_WHITE; + sub_813D084(1); + gPlttBufferUnfaded[0xF2] = RGB_BLACK; + gPlttBufferFaded[0xF2] = RGB_BLACK; + LZ77UnCompVram(gUnknown_0840A778, (void *)(VRAM + 0x4000)); + LZ77UnCompVram(gUnknown_0840A7E4, (void *)(VRAM + 0x7000)); + LoadPalette(gUnknown_0840A758, 0, 0x20); + ResetSpriteData(); + FreeAllSpritePalettes(); + gReservedSpritePaletteCount = 8; + LoadCompressedObjectPic(&gUnknown_0840B20C); + LoadCompressedObjectPic(&gUnknown_0840B21C); + LoadCompressedObjectPalette(&gUnknown_0840B22C); + LoadSpritePalettes(gUnknown_0840B23C); + gTasks[taskId].func = task_intro_14; +} + +static void task_intro_14(u8 taskId) +{ + u8 newTaskId; + + REG_WIN0H = 0xF0; + REG_WIN0V = 0xA0; + REG_WININ = 0x1C; + REG_WINOUT = 0x1D; + REG_BG3CNT = 0x603; + REG_BG0CNT = 0x700; + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON; + gTasks[taskId].data[15] = CreateTask(sub_813CAF4, 0); + gTasks[gTasks[taskId].data[15]].data[0] = 0; + gTasks[taskId].data[0] = 0; + gTasks[taskId].func = task_intro_15; +} + +static void task_intro_15(u8 taskId) +{ + u16 foo = gTasks[taskId].data[0]; + + if (gTasks[taskId].data[0] != 32) + { + u32 bar; //needed to match for some reason + + gTasks[taskId].data[0] += 4; + REG_WIN0V = (gTasks[taskId].data[0] * 256) - (bar = foo - 0x9C); + } + else + { + REG_WIN0V = 0x2080; + gTasks[taskId].func = task_intro_16; + } +} + +static void task_intro_16(u8 taskId) +{ + gTasks[taskId].func = task_intro_17; +} + +static void task_intro_17(u8 taskId) +{ + gUnknown_0203931A = 0; + gTasks[taskId].func = Task_IntroPokemonBattle; +} + +static void Task_IntroPokemonBattle(u8 taskId) +{ + u8 spriteId; + + if (gIntroFrameCounter == 80) + { + spriteId = sub_813CE88(SPECIES_SHARPEDO, 0xF0, 0xA0, 5, 1); + gSprites[spriteId].callback = sub_813DB9C; + gSprites[spriteId].data1 = 1; + gSprites[spriteId].data2 = 0; + } + if (gIntroFrameCounter == 152) + { + spriteId = sub_813CE88(SPECIES_DUSKULL, 0, 0xA0, 4, 1); + gSprites[spriteId].callback = sub_813DB9C; + gSprites[spriteId].data1 = 2; + gSprites[spriteId].data2 = 1; + } + if (gIntroFrameCounter == 219) + { + sub_813D084(0); + spriteId = sub_813CFA8(gUnknown_02039318, 0x110, 0x60, 6); + gSprites[spriteId].callback = sub_813DE70; + gTasks[taskId].data[1] = spriteId; + } + if (gIntroFrameCounter == 304) + { + gTasks[gTasks[taskId].data[15]].data[0] = 4; + gSprites[gTasks[taskId].data[1]].data0 = 2; + } + if (gIntroFrameCounter == 384) + { + gTasks[gTasks[taskId].data[15]].data[0] = 0; + gSprites[gTasks[taskId].data[1]].data0 = 4; + } + if (gIntroFrameCounter == 400) + { + BeginNormalPaletteFade(0xFF0000, 0, 0x10, 0, 0x7EFF); + } + if (gIntroFrameCounter == 432) + { + gSprites[gTasks[taskId].data[1]].data0 = 5; + } + if (gIntroFrameCounter == 462) + { + gSprites[gTasks[taskId].data[1]].data0 = 6; + gTasks[gTasks[taskId].data[15]].data[0] = 2; + } + if (gIntroFrameCounter == 463) + { + sub_813D084(1); + spriteId = sub_813CE88(SPECIES_SHARPEDO, 0xD0, 8, 5, 1); + gSprites[spriteId].callback = sub_813E10C; + gTasks[taskId].data[2] = spriteId; + sub_813E7C0(spriteId); + } + if (gIntroFrameCounter == 539) + { + spriteId = sub_813CE88(SPECIES_DUSKULL, 0xF8, 0x10, 4, 1); + gSprites[spriteId].callback = sub_813E10C; + gTasks[taskId].data[3] = spriteId; + sub_813E930(spriteId); + } + if (gIntroFrameCounter == 623) + { + gSprites[gTasks[taskId].data[2]].data0 = 2; + gSprites[gTasks[taskId].data[3]].data0 = 2; + gTasks[gTasks[taskId].data[15]].data[0] = 3; + } + if (gIntroFrameCounter == 624) + { + sub_813D084(0); + spriteId = sub_813CE88(SPECIES_MUDKIP, 0x20, 0x98, 0, 0); + gSprites[spriteId].callback = sub_813E210; + gTasks[taskId].data[4] = spriteId; + sub_813EDBC(spriteId); + } + if (gIntroFrameCounter == 700) + { + spriteId = sub_813CE88(SPECIES_TORCHIC, -8, 0x90, 1, 0); + gSprites[spriteId].callback = sub_813E210; + gTasks[taskId].data[5] = spriteId; + sub_813EB4C(spriteId); + } + if (gIntroFrameCounter == 776) + { + gUnknown_0203931A = 1; + gSprites[gTasks[taskId].data[4]].data0 = 2; + gSprites[gTasks[taskId].data[5]].data0 = 2; + gTasks[gTasks[taskId].data[15]].data[0] = 0; + } + if (gIntroFrameCounter == 781) + { + sub_813D084(2); + gSprites[gTasks[taskId].data[2]].data0 = 3; + gSprites[gTasks[taskId].data[3]].data0 = 3; + gSprites[gTasks[taskId].data[4]].data0 = 3; + gSprites[gTasks[taskId].data[5]].data0 = 3; + spriteId = CreateSprite(&gSpriteTemplate_840B1F4, 0x78, 0x50, 15); + gSprites[spriteId].invisible = 1; + } + if (gIntroFrameCounter == 800) + PlaySE(SE_OP_BASYU); + if (gIntroFrameCounter == 850) + BeginNormalPaletteFade(0xFFFFFFFF, 4, 0, 0x10, 0xFFFF); + if (gIntroFrameCounter == 946) + gTasks[taskId].func = task_intro_19; +} + +static void task_intro_19(u8 taskId) +{ + DestroyTask(taskId); + SetMainCallback2(MainCB2_EndIntro); +} diff --git a/src/sprite.c b/src/sprite.c index 12c62145e..c91476f51 100644 --- a/src/sprite.c +++ b/src/sprite.c @@ -57,7 +57,7 @@ static void BuildSpritePriorities(void); static void SortSprites(void); static void CopyMatricesToOamBuffer(void); static void AddSpritesToOamBuffer(void); -static u8 CreateSpriteAt(u8 index, struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority); +static u8 CreateSpriteAt(u8 index, const struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority); static void ClearSpriteCopyRequests(void); static void ResetOamMatrices(void); static void ResetSprite(struct Sprite *sprite); @@ -530,7 +530,7 @@ static void AddSpritesToOamBuffer(void) } } -u8 CreateSprite(struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority) +u8 CreateSprite(const struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority) { u8 i; @@ -541,7 +541,7 @@ u8 CreateSprite(struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority) return MAX_SPRITES; } -u8 CreateSpriteAtEnd(struct SpriteTemplate *template, u16 x, u16 y, u8 subpriority) +u8 CreateSpriteAtEnd(const struct SpriteTemplate *template, u16 x, u16 y, u8 subpriority) { s16 i; @@ -554,7 +554,7 @@ u8 CreateSpriteAtEnd(struct SpriteTemplate *template, u16 x, u16 y, u8 subpriori u8 CreateInvisibleSprite(void (*callback)(struct Sprite *)) { - u8 index = CreateSprite((struct SpriteTemplate *)&gDummySpriteTemplate, 0, 0, 31); + u8 index = CreateSprite(&gDummySpriteTemplate, 0, 0, 31); if (index == MAX_SPRITES) { @@ -568,7 +568,7 @@ u8 CreateInvisibleSprite(void (*callback)(struct Sprite *)) } } -static u8 CreateSpriteAt(u8 index, struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority) +static u8 CreateSpriteAt(u8 index, const struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority) { struct Sprite *sprite = &gSprites[index]; @@ -1635,7 +1635,7 @@ void FreeAllSpritePalettes(void) sSpritePaletteTags[i] = 0xFFFF; } -u8 LoadSpritePalette(struct SpritePalette *palette) +u8 LoadSpritePalette(const struct SpritePalette *palette) { u8 index = IndexOfSpritePaletteTag(palette->tag); @@ -1656,7 +1656,7 @@ u8 LoadSpritePalette(struct SpritePalette *palette) } } -void LoadSpritePalettes(struct SpritePalette *palettes) +void LoadSpritePalettes(const struct SpritePalette *palettes) { u8 i; for (i = 0; palettes[i].data != NULL; i++) |