summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPikalaxALT <pikalaxalt@gmail.com>2020-02-27 16:19:33 -0500
committerPikalaxALT <pikalaxalt@gmail.com>2020-02-27 16:19:33 -0500
commit701d4635b4880fd9055e0b0f3e5032b5d0353ab1 (patch)
treebe42622a545fa4d15d78b5de0c63cb5db7f922c2 /src
parent0d88e2d1de7135d7cc3d724398fa8d9022831511 (diff)
Pokecenter heal and HOF field effects
Diffstat (limited to 'src')
-rw-r--r--src/field_effect.c531
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);
+}