Pokecenter heal and HOF field effects

This commit is contained in:
PikalaxALT
2020-02-27 16:19:33 -05:00
parent 0d88e2d1de
commit 701d4635b4
3 changed files with 531 additions and 1101 deletions
+531
View File
@@ -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);
}