diff options
author | PikalaxALT <pikalaxalt@gmail.com> | 2020-02-27 16:19:33 -0500 |
---|---|---|
committer | PikalaxALT <pikalaxalt@gmail.com> | 2020-02-27 16:19:33 -0500 |
commit | 701d4635b4880fd9055e0b0f3e5032b5d0353ab1 (patch) | |
tree | be42622a545fa4d15d78b5de0c63cb5db7f922c2 /src | |
parent | 0d88e2d1de7135d7cc3d724398fa8d9022831511 (diff) |
Pokecenter heal and HOF field effects
Diffstat (limited to 'src')
-rw-r--r-- | src/field_effect.c | 531 |
1 files changed, 531 insertions, 0 deletions
diff --git a/src/field_effect.c b/src/field_effect.c index 35a56389a..b7498d316 100644 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -7,8 +7,11 @@ #include "field_weather.h" #include "overworld.h" #include "quest_log.h" +#include "task.h" #include "trainer_pokemon_sprites.h" +#include "constants/songs.h" +#define subsprite_table(ptr) {.subsprites = ptr, .subspriteCount = (sizeof ptr) / (sizeof(struct Subsprite))} #define FIELD_EFFECT_COUNT 32 static u8 sFieldEffectActiveList[FIELD_EFFECT_COUNT]; @@ -28,6 +31,10 @@ void FieldEffectScript_LoadPal(const u8 **script); void FieldEffectScript_CallNative(const u8 **script, u32 *result); void FieldEffectFreeTilesIfUnused(u16 tilesTag); void FieldEffectFreePaletteIfUnused(u8 paletteNum); +void Task_PokecenterHeal(u8 taskId); +void SpriteCB_PokeballGlow(struct Sprite * sprite); +void SpriteCB_PokecenterMonitor(struct Sprite * sprite); +void SpriteCB_HallOfFameMonitor(struct Sprite * sprite); const u16 sNewGameOakObjectSpriteTiles[] = INCBIN_U16("graphics/field_effects/unk_83CA770.4bpp"); const u16 sNewGameOakObjectPals[] = INCBIN_U16("graphics/field_effects/unk_83CAF70.gbapal"); @@ -130,6 +137,187 @@ const struct SpriteTemplate gNewGameOakObjectTemplate = { .callback = SpriteCallbackDummy }; +const struct SpritePalette gUnknown_83CBE9C = { + gUnknown_83CAFB0, 4103 +}; + +const struct SpritePalette gUnknown_83CBEA4 = { + gUnknown_83CB3D0, 4112 +}; + +const struct OamData gOamData_83CBEAC = { + .y = 0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .mosaic = FALSE, + .bpp = ST_OAM_4BPP, + .shape = SPRITE_SHAPE(32x16), + .x = 0, + .matrixNum = 0, + .size = SPRITE_SIZE(32x16), + .tileNum = 0x000, + .priority = 0, + .paletteNum = 0x0, + .affineParam = 0 +}; + +const struct SpriteFrameImage gUnknown_83CBEB4[] = { + {gUnknown_83CAF90, 0x20} +}; + +const struct SpriteFrameImage gUnknown_83CBEBC[] = { + {gUnknown_83CAFD0 + 0x000, 0x100}, + {gUnknown_83CAFD0 + 0x080, 0x100}, + {gUnknown_83CAFD0 + 0x100, 0x100}, + {gUnknown_83CAFD0 + 0x180, 0x100} +}; + +const struct SpriteFrameImage gUnknown_83CBEDC[] = { + {gUnknown_83CB3F0 + 0x00, 0x80}, + {gUnknown_83CB3F0 + 0x40, 0x80}, + {gUnknown_83CB3F0 + 0x80, 0x80}, + {gUnknown_83CB3F0 + 0xC0, 0x80} +}; + +const struct Subsprite gUnknown_83CBEFC[] = +{ + { + .x = -12, + .y = -8, + .shape = SPRITE_SHAPE(16x8), + .size = SPRITE_SIZE(16x8), + .tileOffset = 0, + .priority = 2 + }, { + .x = 4, + .y = -8, + .shape = SPRITE_SHAPE(8x8), + .size = SPRITE_SIZE(8x8), + .tileOffset = 2, + .priority = 2 + }, { + .x = -12, + .y = 0, + .shape = SPRITE_SHAPE(16x8), + .size = SPRITE_SIZE(16x8), + .tileOffset = 3, + .priority = 2 + }, { + .x = 4, + .y = 0, + .shape = SPRITE_SHAPE(8x8), + .size = SPRITE_SIZE(8x8), + .tileOffset = 5, + .priority = 2 + } +}; + +const struct SubspriteTable gUnknown_83CBF0C = subsprite_table(gUnknown_83CBEFC); + +const struct Subsprite gUnknown_83CBF14[] = +{ + { + .x = -32, + .y = -8, + .shape = SPRITE_SHAPE(32x8), + .size = SPRITE_SIZE(32x8), + .tileOffset = 0, + .priority = 2 + }, { + .x = 0, + .y = -8, + .shape = SPRITE_SHAPE(32x8), + .size = SPRITE_SIZE(32x8), + .tileOffset = 4, + .priority = 2 + }, { + .x = -32, + .y = 0, + .shape = SPRITE_SHAPE(32x8), + .size = SPRITE_SIZE(32x8), + .tileOffset = 8, + .priority = 2 + }, { + .x = 0, + .y = 0, + .shape = SPRITE_SHAPE(32x8), + .size = SPRITE_SIZE(32x8), + .tileOffset = 12, + .priority = 2 + } +}; + +const struct SubspriteTable gUnknown_83CBF24 = subsprite_table(gUnknown_83CBF14); + +const union AnimCmd gUnknown_83CBF2C[] = { + ANIMCMD_FRAME(0, 1), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gUnknown_83CBF34[] = { + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(2, 5), + ANIMCMD_FRAME(3, 7), + ANIMCMD_FRAME(2, 5), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_LOOP(3), + ANIMCMD_END +}; + +const union AnimCmd *const gUnknown_83CBF54[] = { + gUnknown_83CBF2C, + gUnknown_83CBF34 +}; + +const union AnimCmd gUnknown_83CBF5C[] = { + ANIMCMD_FRAME(3, 8), + ANIMCMD_FRAME(2, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(2, 8), + ANIMCMD_LOOP(2), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_END +}; + +const union AnimCmd *const gUnknown_83CBF84[] = { + gUnknown_83CBF5C +}; + +const struct SpriteTemplate gUnknown_83CBF88 = { + .tileTag = 65535, + .paletteTag = 4103, + .oam = &gOamData_83CBE58, + .anims = gUnknown_83CBF54, + .images = gUnknown_83CBEB4, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_PokeballGlow +}; + +const struct SpriteTemplate gUnknown_83CBFA0 = { + .tileTag = 65535, + .paletteTag = 4103, + .oam = &gOamData_83CBEAC, + .anims = gUnknown_83CBF54, + .images = gUnknown_83CBEBC, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_PokecenterMonitor +}; + +const struct SpriteTemplate gUnknown_83CBFB8 = { + .tileTag = 65535, + .paletteTag = 4112, + .oam = &gOamData_83CBE60, + .anims = gUnknown_83CBF84, + .images = gUnknown_83CBEDC, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_HallOfFameMonitor +}; + + u32 FieldEffectStart(u8 fldeff) { const u8 *script; @@ -451,3 +639,346 @@ void MultiplyPaletteRGBComponents(u16 i, u8 r, u8 g, u8 b) outPal |= curBlue << 10; gPlttBufferFaded[i] = outPal; } + +void PokecenterHealEffect_0(struct Task * task); +void PokecenterHealEffect_1(struct Task * task); +void PokecenterHealEffect_2(struct Task * task); +void PokecenterHealEffect_3(struct Task * task); +void HallOfFameRecordEffect_0(struct Task * task); +void HallOfFameRecordEffect_1(struct Task * task); +void HallOfFameRecordEffect_2(struct Task * task); +void HallOfFameRecordEffect_3(struct Task * task); +void Task_HallOfFameRecord(u8 taskId); +u8 CreatePokeballGlowSprite(s16 duration, s16 x, s16 y, bool16 fanfare); +void SpriteCB_PokeballGlowEffect(struct Sprite * sprite); +void PokeballGlowEffect_0(struct Sprite * sprite); +void PokeballGlowEffect_1(struct Sprite * sprite); +void PokeballGlowEffect_2(struct Sprite * sprite); +void PokeballGlowEffect_3(struct Sprite * sprite); +void PokeballGlowEffect_4(struct Sprite * sprite); +void PokeballGlowEffect_5(struct Sprite * sprite); +void PokeballGlowEffect_6(struct Sprite * sprite); +void PokeballGlowEffect_7(struct Sprite * sprite); +u8 PokecenterHealEffectHelper(s32 x, s32 y); +void HallOfFameRecordEffectHelper(s32 x, s32 y); + +void (*const sPokecenterHealTaskCBTable[])(struct Task *) = { + PokecenterHealEffect_0, + PokecenterHealEffect_1, + PokecenterHealEffect_2, + PokecenterHealEffect_3 +}; + +void (*const sHallOfFameRecordTaskCBTable[])(struct Task *) = { + HallOfFameRecordEffect_0, + HallOfFameRecordEffect_1, + HallOfFameRecordEffect_2, + HallOfFameRecordEffect_3 +}; + +void (*const sPokeballGlowSpriteCBTable[])(struct Sprite *) = { + PokeballGlowEffect_0, + PokeballGlowEffect_1, + PokeballGlowEffect_2, + PokeballGlowEffect_3, + PokeballGlowEffect_4, + PokeballGlowEffect_5, + PokeballGlowEffect_6, + PokeballGlowEffect_7 +}; + +bool8 FldEff_PokecenterHeal(void) +{ + u8 nPokemon; + struct Task *task; + + nPokemon = CalculatePlayerPartyCount(); + task = &gTasks[CreateTask(Task_PokecenterHeal, 0xff)]; + task->data[1] = nPokemon; + task->data[2] = 0x5d; + task->data[3] = 0x24; + task->data[4] = 0x80; + task->data[5] = 0x18; + return FALSE; +} + +void Task_PokecenterHeal(u8 taskId) +{ + struct Task * task = &gTasks[taskId]; + sPokecenterHealTaskCBTable[task->data[0]](task); +} + +void PokecenterHealEffect_0(struct Task *task) +{ + task->data[0]++; + task->data[6] = CreatePokeballGlowSprite(task->data[1], task->data[2], task->data[3], TRUE); + task->data[7] = PokecenterHealEffectHelper(task->data[4], task->data[5]); +} + +void PokecenterHealEffect_1(struct Task *task) +{ + if (gSprites[task->data[6]].data[0] > 1) + { + gSprites[task->data[7]].data[0]++; + task->data[0]++; + } +} + +void PokecenterHealEffect_2(struct Task *task) +{ + if (gSprites[task->data[6]].data[0] > 4) + { + task->data[0]++; + } +} + +void PokecenterHealEffect_3(struct Task *task) +{ + if (gSprites[task->data[6]].data[0] > 6) + { + DestroySprite(&gSprites[task->data[6]]); + FieldEffectActiveListRemove(FLDEFF_POKECENTER_HEAL); + DestroyTask(FindTaskIdByFunc(Task_PokecenterHeal)); + } +} + + +bool8 FldEff_HallOfFameRecord(void) +{ + u8 nPokemon; + struct Task *task; + + nPokemon = CalculatePlayerPartyCount(); + task = &gTasks[CreateTask(Task_HallOfFameRecord, 0xff)]; + task->data[1] = nPokemon; + task->data[2] = 0x75; + task->data[3] = 0x3C; + return FALSE; +} + +void Task_HallOfFameRecord(u8 taskId) +{ + struct Task *task; + task = &gTasks[taskId]; + sHallOfFameRecordTaskCBTable[task->data[0]](task); +} + +void HallOfFameRecordEffect_0(struct Task *task) +{ + u8 taskId; + task->data[0]++; + task->data[6] = CreatePokeballGlowSprite(task->data[1], task->data[2], task->data[3], FALSE); +} + +void HallOfFameRecordEffect_1(struct Task *task) +{ + if (gSprites[task->data[6]].data[0] > 1) + { + HallOfFameRecordEffectHelper(0x78, 0x19); + task->data[15]++; // was this ever initialized? is this ever used? + task->data[0]++; + } +} + +void HallOfFameRecordEffect_2(struct Task *task) +{ + if (gSprites[task->data[6]].data[0] > 4) + { + task->data[0]++; + } +} + +void HallOfFameRecordEffect_3(struct Task *task) +{ + if (gSprites[task->data[6]].data[0] > 6) + { + DestroySprite(&gSprites[task->data[6]]); + FieldEffectActiveListRemove(FLDEFF_HALL_OF_FAME_RECORD); + DestroyTask(FindTaskIdByFunc(Task_HallOfFameRecord)); + } +} + +u8 CreatePokeballGlowSprite(s16 duration, s16 x, s16 y, bool16 fanfare) +{ + u8 spriteId; + struct Sprite *sprite; + spriteId = CreateInvisibleSprite(SpriteCB_PokeballGlowEffect); + sprite = &gSprites[spriteId]; + sprite->pos2.x = x; + sprite->pos2.y = y; + sprite->subpriority = 0xFF; + sprite->data[5] = fanfare; + sprite->data[6] = duration; + sprite->data[7] = spriteId; + return spriteId; +} + +void SpriteCB_PokeballGlowEffect(struct Sprite * sprite) +{ + sPokeballGlowSpriteCBTable[sprite->data[0]](sprite); +} + +const struct Coords16 gUnknown_83CC010[] = { + {0, 0}, + {6, 0}, + {0, 4}, + {6, 4}, + {0, 8}, + {6, 8} +}; + +const u8 gUnknown_83CC028[] = {16, 12, 8, 0}; +const u8 gUnknown_83CC02C[] = {16, 12, 8, 0}; +const u8 gUnknown_83CC030[] = { 0, 0, 0, 0}; + +void PokeballGlowEffect_0(struct Sprite *sprite) +{ + u8 endSpriteId; + if (sprite->data[1] == 0 || (--sprite->data[1]) == 0) + { + sprite->data[1] = 25; + endSpriteId = CreateSpriteAtEnd(&gUnknown_83CBF88, gUnknown_83CC010[sprite->data[2]].x + sprite->pos2.x, gUnknown_83CC010[sprite->data[2]].y + sprite->pos2.y, 0xFF); + gSprites[endSpriteId].oam.priority = 2; + gSprites[endSpriteId].data[0] = sprite->data[7]; + sprite->data[2]++; + sprite->data[6]--; + PlaySE(SE_BOWA); + } + if (sprite->data[6] == 0) + { + sprite->data[1] = 32; + sprite->data[0]++; + } +} + +void PokeballGlowEffect_1(struct Sprite *sprite) +{ + if ((--sprite->data[1]) == 0) + { + sprite->data[0]++; + sprite->data[1] = 8; + sprite->data[2] = 0; + sprite->data[3] = 0; + if (sprite->data[5]) + { + PlayFanfare(MUS_ME_ASA); + } + } +} + +void PokeballGlowEffect_2(struct Sprite *sprite) +{ + u8 phase; + if ((--sprite->data[1]) == 0) + { + sprite->data[1] = 8; + sprite->data[2]++; + sprite->data[2] &= 3; + if (sprite->data[2] == 0) + { + sprite->data[3]++; + } + } + phase = (sprite->data[2] + 3) & 3; + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x108, gUnknown_83CC028[phase], gUnknown_83CC02C[phase], gUnknown_83CC030[phase]); + phase = (sprite->data[2] + 2) & 3; + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x106, gUnknown_83CC028[phase], gUnknown_83CC02C[phase], gUnknown_83CC030[phase]); + phase = (sprite->data[2] + 1) & 3; + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x102, gUnknown_83CC028[phase], gUnknown_83CC02C[phase], gUnknown_83CC030[phase]); + phase = sprite->data[2]; + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x105, gUnknown_83CC028[phase], gUnknown_83CC02C[phase], gUnknown_83CC030[phase]); + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x103, gUnknown_83CC028[phase], gUnknown_83CC02C[phase], gUnknown_83CC030[phase]); + if (sprite->data[3] > 2) + { + sprite->data[0]++; + sprite->data[1] = 8; + sprite->data[2] = 0; + } +} + +void PokeballGlowEffect_3(struct Sprite *sprite) +{ + u8 phase; + if ((--sprite->data[1]) == 0) + { + sprite->data[1] = 8; + sprite->data[2]++; + sprite->data[2] &= 3; + if (sprite->data[2] == 3) + { + sprite->data[0]++; + sprite->data[1] = 30; + } + } + phase = sprite->data[2]; + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x108, gUnknown_83CC028[phase], gUnknown_83CC02C[phase], gUnknown_83CC030[phase]); + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x106, gUnknown_83CC028[phase], gUnknown_83CC02C[phase], gUnknown_83CC030[phase]); + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x102, gUnknown_83CC028[phase], gUnknown_83CC02C[phase], gUnknown_83CC030[phase]); + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x105, gUnknown_83CC028[phase], gUnknown_83CC02C[phase], gUnknown_83CC030[phase]); + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x103, gUnknown_83CC028[phase], gUnknown_83CC02C[phase], gUnknown_83CC030[phase]); +} + +void PokeballGlowEffect_4(struct Sprite *sprite) +{ + if ((--sprite->data[1]) == 0) + { + sprite->data[0]++; + } +} + +void PokeballGlowEffect_5(struct Sprite *sprite) +{ + sprite->data[0]++; +} + +void PokeballGlowEffect_6(struct Sprite *sprite) +{ + if (sprite->data[5] == 0 || IsFanfareTaskInactive()) + { + sprite->data[0]++; + } +} + +void PokeballGlowEffect_7(struct Sprite *sprite) +{ +} + +void SpriteCB_PokeballGlow(struct Sprite * sprite) +{ + if (gSprites[sprite->data[0]].data[0] > 4) + FieldEffectFreeGraphicsResources(sprite); +} + +u8 PokecenterHealEffectHelper(s32 x, s32 y) +{ + u8 spriteId; + struct Sprite * sprite; + spriteId = CreateSpriteAtEnd(&gUnknown_83CBFA0, x, y, 0); + sprite = &gSprites[spriteId]; + sprite->oam.priority = 2; + sprite->invisible = TRUE; + return spriteId; +} + +void SpriteCB_PokecenterMonitor(struct Sprite * sprite) +{ + if (sprite->data[0] != 0) + { + sprite->data[0] = 0; + sprite->invisible = FALSE; + StartSpriteAnim(sprite, 1); + } + if (sprite->animEnded) + FieldEffectFreeGraphicsResources(sprite); +} + +void HallOfFameRecordEffectHelper(s32 x, s32 y) +{ + CreateSpriteAtEnd(&gUnknown_83CBFB8, x, y, 0); +} + +void SpriteCB_HallOfFameMonitor(struct Sprite * sprite) +{ + if (sprite->animEnded) + FieldEffectFreeGraphicsResources(sprite); +} |