#include "global.h" #include "sprite.h" #include "trig.h" #include "rng.h" #include "decompress.h" #include "task.h" #include "sound.h" #include "songs.h" #include "palette.h" // this file's functions static void EvoTask_BeginPreSet1_FadeAndPlaySE(u8 taskID); static void EvoTask_CreatePreEvoSparkleSet1(u8 taskID); static void EvoTask_WaitForPre1SparklesToGoUp(u8 taskID); static void EvoTask_BeginPreSparklesSet2(u8 taskID); static void EvoTask_CreatePreEvoSparklesSet2(u8 taskID); static void EvoTask_DestroyPreSet2Task(u8 taskID); static void EvoTask_BeginPostSparklesSet1(u8 taskID); static void EvoTask_CreatePostEvoSparklesSet1(u8 taskID); static void EvoTask_DestroyPostSet1Task(u8 taskID); static void EvoTask_BeginPostSparklesSet2_AndFlash(u8 taskID); static void EvoTask_CreatePostEvoSparklesSet2_AndFlash(u8 taskID); static void EvoTask_BeginPostSparklesSet2_AndFlash_Trade(u8 taskID); static void EvoTask_CreatePostEvoSparklesSet2_AndFlash_Trade(u8 taskID); static void EvoTask_DestroyPostSet2AndFlashTask(u8 taskID); extern const s16 gUnknown_08416ED0[]; extern const struct SpriteTemplate gSpriteTemplate_8416EB8; extern const struct CompressedSpriteSheet gUnknown_08416E84; extern const struct SpritePalette gUnknown_08416E94[]; void nullsub_84(struct Sprite* sprite) { } static void sub_8149520(void) { u16 i; for (i = 0; i < 12; i++) { SetOamMatrix(20 + i, gUnknown_08416ED0[i], 0, 0, gUnknown_08416ED0[i]); } } static void SpriteCB_PreEvoSparkleSet1(struct Sprite* sprite) { if (sprite->pos1.y > 8) { u8 matrixNum; sprite->pos1.y = 88 - (sprite->data7 * sprite->data7) / 80; sprite->pos2.y = Sin((u8)(sprite->data6), sprite->data5) / 4; sprite->pos2.x = Cos((u8)(sprite->data6), sprite->data5); sprite->data6 += 4; if (sprite->data7 & 1) sprite->data5--; sprite->data7++; if (sprite->pos2.y > 0) sprite->subpriority = 1; else sprite->subpriority = 20; matrixNum = sprite->data5 / 4 + 20; if (matrixNum > 31) matrixNum = 31; sprite->oam.matrixNum = matrixNum; } else DestroySprite(sprite); } static void CreatePreEvoSparkleSet1(u8 arg0) { u8 spriteID = CreateSprite(&gSpriteTemplate_8416EB8, 120, 88, 0); if (spriteID != MAX_SPRITES) { gSprites[spriteID].data5 = 48; gSprites[spriteID].data6 = arg0; gSprites[spriteID].data7 = 0; gSprites[spriteID].oam.affineMode = 1; gSprites[spriteID].oam.matrixNum = 31; gSprites[spriteID].callback = SpriteCB_PreEvoSparkleSet1; } } static void SpriteCB_PreEvoSparkleSet2(struct Sprite* sprite) { if (sprite->pos1.y < 88) { sprite->pos1.y = 8 + (sprite->data7 * sprite->data7) / 5; sprite->pos2.y = Sin((u8)(sprite->data6), sprite->data5) / 4; sprite->pos2.x = Cos((u8)(sprite->data6), sprite->data5); sprite->data5 = 8 + Sin((u8)(sprite->data7 * 4), 40); sprite->data7++; } else DestroySprite(sprite); } static void CreatePreEvoSparkleSet2(u8 arg0) { u8 spriteID = CreateSprite(&gSpriteTemplate_8416EB8, 120, 8, 0); if (spriteID != MAX_SPRITES) { gSprites[spriteID].data5 = 8; gSprites[spriteID].data6 = arg0; gSprites[spriteID].data7 = 0; gSprites[spriteID].oam.affineMode = 1; gSprites[spriteID].oam.matrixNum = 25; gSprites[spriteID].subpriority = 1; gSprites[spriteID].callback = SpriteCB_PreEvoSparkleSet2; } } static void SpriteCB_PostEvoSparkleSet1(struct Sprite* sprite) { if (sprite->data5 > 8) { sprite->pos2.y = Sin((u8)(sprite->data6), sprite->data5); sprite->pos2.x = Cos((u8)(sprite->data6), sprite->data5); sprite->data5 -= sprite->data3; sprite->data6 += 4; } else DestroySprite(sprite); } static void CreatePostEvoSparkleSet1(u8 arg0, u8 arg1) { u8 spriteID = CreateSprite(&gSpriteTemplate_8416EB8, 120, 56, 0); if (spriteID != MAX_SPRITES) { gSprites[spriteID].data3 = arg1; gSprites[spriteID].data5 = 120; gSprites[spriteID].data6 = arg0; gSprites[spriteID].data7 = 0; gSprites[spriteID].oam.affineMode = 1; gSprites[spriteID].oam.matrixNum = 31; gSprites[spriteID].subpriority = 1; gSprites[spriteID].callback = SpriteCB_PostEvoSparkleSet1; } } static void SpriteCB_PostEvoSparkleSet2(struct Sprite* sprite) { if (!(sprite->data7 & 3)) sprite->pos1.y++; if (sprite->data6 < 128) { u8 matrixNum; sprite->pos2.y = -Sin((u8)(sprite->data6), sprite->data5); sprite->pos1.x = 120 + (sprite->data3 * sprite->data7) / 3; sprite->data6++; matrixNum = 31 - (sprite->data6 * 12 / 128); if (sprite->data6 > 64) sprite->subpriority = 1; else { sprite->invisible = 0; sprite->subpriority = 20; if (sprite->data6 > 112 && sprite->data6 & 1) sprite->invisible = 1; } if (matrixNum < 20) matrixNum = 20; sprite->oam.matrixNum = matrixNum; sprite->data7++; } else DestroySprite(sprite); } void CreatePostEvoSparkleSet2(u8 arg0) { u8 spriteID = CreateSprite(&gSpriteTemplate_8416EB8, 120, 56, 0); if (spriteID != MAX_SPRITES) { gSprites[spriteID].data3 = 3 - (Random() % 7); gSprites[spriteID].data5 = 48 + (Random() & 0x3F); gSprites[spriteID].data7 = 0; gSprites[spriteID].oam.affineMode = 1; gSprites[spriteID].oam.matrixNum = 31; gSprites[spriteID].subpriority = 20; gSprites[spriteID].callback = SpriteCB_PostEvoSparkleSet2; } } void sub_8149954(void) { LoadCompressedObjectPic(&gUnknown_08416E84); LoadSpritePalettes(gUnknown_08416E94); } u8 LaunchTask_PreEvoSparklesSet1(u16 arg0) { u8 taskID = CreateTask(EvoTask_BeginPreSet1_FadeAndPlaySE, 0); gTasks[taskID].data[1] = arg0; return taskID; } #define tFrameCounter data[15] static void EvoTask_BeginPreSet1_FadeAndPlaySE(u8 taskID) { sub_8149520(); gTasks[taskID].tFrameCounter = 0; BeginNormalPaletteFade(3 << gTasks[taskID].data[1], 0xA, 0, 0x10, 0x7FFF); gTasks[taskID].func = EvoTask_CreatePreEvoSparkleSet1; PlaySE(SE_W025); } static void EvoTask_CreatePreEvoSparkleSet1(u8 taskID) { if (gTasks[taskID].tFrameCounter < 64) { if (!(gTasks[taskID].tFrameCounter & 7)) { u8 i; for (i = 0; i < 4; i++) CreatePreEvoSparkleSet1((0x78 & gTasks[taskID].tFrameCounter) * 2 + i * 64); } gTasks[taskID].tFrameCounter++; } else { gTasks[taskID].tFrameCounter = 96; gTasks[taskID].func = EvoTask_WaitForPre1SparklesToGoUp; } } static void EvoTask_WaitForPre1SparklesToGoUp(u8 taskID) { if (gTasks[taskID].tFrameCounter != 0) gTasks[taskID].tFrameCounter--; else DestroyTask(taskID); } u8 LaunchTask_PreEvoSparklesSet2(void) { return CreateTask(EvoTask_BeginPreSparklesSet2, 0); } static void EvoTask_BeginPreSparklesSet2(u8 taskID) { sub_8149520(); gTasks[taskID].tFrameCounter = 0; gTasks[taskID].func = EvoTask_CreatePreEvoSparklesSet2; PlaySE(SE_W062B); } static void EvoTask_CreatePreEvoSparklesSet2(u8 taskID) { if (gTasks[taskID].tFrameCounter < 96) { if (gTasks[taskID].tFrameCounter < 6) { u8 i; for (i = 0; i < 9; i++) CreatePreEvoSparkleSet2(i * 16); } gTasks[taskID].tFrameCounter++; } else gTasks[taskID].func = EvoTask_DestroyPreSet2Task; } static void EvoTask_DestroyPreSet2Task(u8 taskID) { DestroyTask(taskID); } u8 LaunchTask_PostEvoSparklesSet1(void) { return CreateTask(EvoTask_BeginPostSparklesSet1, 0); } static void EvoTask_BeginPostSparklesSet1(u8 taskID) { sub_8149520(); gTasks[taskID].tFrameCounter = 0; gTasks[taskID].func = EvoTask_CreatePostEvoSparklesSet1; PlaySE(SE_REAPOKE); } static void EvoTask_CreatePostEvoSparklesSet1(u8 taskID) { if (gTasks[taskID].tFrameCounter < 48) { if (gTasks[taskID].tFrameCounter == 0) { u8 i; for (i = 0; i < 16; i++) CreatePostEvoSparkleSet1(i * 16, 4); } if (gTasks[taskID].tFrameCounter == 32) { u8 i; for (i = 0; i < 16; i++) CreatePostEvoSparkleSet1(i * 16, 8); } gTasks[taskID].tFrameCounter++; } else gTasks[taskID].func = EvoTask_DestroyPostSet1Task; } static void EvoTask_DestroyPostSet1Task(u8 taskID) { DestroyTask(taskID); } u8 LaunchTask_PostEvoSparklesSet2AndFlash(u16 arg0) { u8 taskID = CreateTask(EvoTask_BeginPostSparklesSet2_AndFlash, 0); gTasks[taskID].data[2] = arg0; return taskID; } static void EvoTask_BeginPostSparklesSet2_AndFlash(u8 taskID) { sub_8149520(); gTasks[taskID].tFrameCounter = 0; CpuSet(&gPlttBufferFaded[0x20], &gPlttBufferUnfaded[0x20], 0x30); BeginNormalPaletteFade(0xFFF9001C, 0, 0, 0x10, 0x7FFF); gTasks[taskID].func = EvoTask_CreatePostEvoSparklesSet2_AndFlash; PlaySE(SE_W080); } static void EvoTask_CreatePostEvoSparklesSet2_AndFlash(u8 taskID) { if (gTasks[taskID].tFrameCounter < 128) { u8 i; switch (gTasks[taskID].tFrameCounter) { default: if (gTasks[taskID].tFrameCounter < 50) CreatePostEvoSparkleSet2(Random() & 7); break; case 0: for (i = 0; i < 8; i++) CreatePostEvoSparkleSet2(i); break; case 32: BeginNormalPaletteFade(0xFFFF001C, 0x10, 0x10, 0, 0x7FFF); break; } gTasks[taskID].tFrameCounter++; } else gTasks[taskID].func = EvoTask_DestroyPostSet2AndFlashTask; } static void EvoTask_DestroyPostSet2AndFlashTask(u8 taskID) { if (!gPaletteFade.active) DestroyTask(taskID); } u8 LaunchTask_PostEvoSparklesSet2AndFlash_Trade(u16 arg0) { u8 taskID = CreateTask(EvoTask_BeginPostSparklesSet2_AndFlash_Trade, 0); gTasks[taskID].data[2] = arg0; return taskID; } static void EvoTask_BeginPostSparklesSet2_AndFlash_Trade(u8 taskID) { sub_8149520(); gTasks[taskID].tFrameCounter = 0; CpuSet(&gPlttBufferFaded[0x20], &gPlttBufferUnfaded[0x20], 0x30); BeginNormalPaletteFade(0xFFF90001, 0, 0, 0x10, 0x7FFF); gTasks[taskID].func = EvoTask_CreatePostEvoSparklesSet2_AndFlash_Trade; PlaySE(SE_W080); } static void EvoTask_CreatePostEvoSparklesSet2_AndFlash_Trade(u8 taskID) { if (gTasks[taskID].tFrameCounter < 128) { u8 i; switch (gTasks[taskID].tFrameCounter) { default: if (gTasks[taskID].tFrameCounter < 50) CreatePostEvoSparkleSet2(Random() & 7); break; case 0: for (i = 0; i < 8; i++) CreatePostEvoSparkleSet2(i); break; case 32: BeginNormalPaletteFade(0xFFFF0001, 0x10, 0x10, 0, 0x7FFF); break; } gTasks[taskID].tFrameCounter++; } else gTasks[taskID].func = EvoTask_DestroyPostSet2AndFlashTask; }