2017-10-03 02:51:22 +01:00
|
|
|
|
|
|
|
// Includes
|
|
|
|
#include "global.h"
|
2018-05-10 09:02:33 +01:00
|
|
|
#include "field_effect.h"
|
|
|
|
#include "battle_dome_cards.h"
|
|
|
|
#include "decompress.h"
|
|
|
|
#include "field_screen.h"
|
|
|
|
#include "field_weather.h"
|
|
|
|
#include "palette.h"
|
|
|
|
#include "pokemon.h"
|
|
|
|
#include "sound.h"
|
|
|
|
#include "sprite.h"
|
|
|
|
#include "task.h"
|
|
|
|
#include "constants/rgb.h"
|
|
|
|
#include "constants/songs.h"
|
2017-10-03 02:51:22 +01:00
|
|
|
|
|
|
|
// Static type declarations
|
|
|
|
|
|
|
|
// Static RAM declarations
|
|
|
|
|
2018-05-10 09:02:33 +01:00
|
|
|
IWRAM_DATA u8 sActiveList[32];
|
2017-10-03 02:51:22 +01:00
|
|
|
|
|
|
|
// Static ROM declarations
|
|
|
|
|
2018-05-10 09:02:33 +01:00
|
|
|
extern u8 *gFieldEffectScriptPointers[];
|
|
|
|
|
2017-10-03 02:51:22 +01:00
|
|
|
// .rodata
|
|
|
|
|
2018-05-10 09:02:33 +01:00
|
|
|
extern const struct SubspriteTable gUnknown_0855C2AC;// = subsprite_table(Unknown_39F180);
|
|
|
|
|
|
|
|
extern const struct SubspriteTable gUnknown_0855C2C4;// = subsprite_table(Unknown_39F1A8);
|
|
|
|
|
|
|
|
extern const struct SpriteTemplate gSpriteTemplate_855C304/* = {
|
|
|
|
.tileTag = 0xffff,
|
|
|
|
.paletteTag = 4103,
|
|
|
|
.oam = &gOamData_839F0FC,
|
|
|
|
.anims = gSpriteAnimTable_839F1FC,
|
|
|
|
.images = gSpriteImageTable_839F158,
|
|
|
|
.affineAnims = gDummySpriteAffineAnimTable,
|
|
|
|
.callback = SpriteCB_PokeballGlow
|
|
|
|
}*/;
|
|
|
|
|
|
|
|
extern const struct SpriteTemplate gSpriteTemplate_855C31C/* = {
|
|
|
|
.tileTag = 0xffff,
|
|
|
|
.paletteTag = 4100,
|
|
|
|
.oam = &gOamData_839F104,
|
|
|
|
.anims = gSpriteAnimTable_839F1FC,
|
|
|
|
.images = gSpriteImageTable_839F160,
|
|
|
|
.affineAnims = gDummySpriteAffineAnimTable,
|
|
|
|
.callback = SpriteCB_PokecenterMonitor
|
|
|
|
}*/;
|
|
|
|
|
|
|
|
extern const struct SpriteTemplate gSpriteTemplate_855C334/* = {
|
|
|
|
.tileTag = 0xffff,
|
|
|
|
.paletteTag = 4112,
|
|
|
|
.oam = &gOamData_839F104,
|
|
|
|
.anims = gSpriteAnimTable_839F204,
|
|
|
|
.images = gSpriteImageTable_839F170,
|
|
|
|
.affineAnims = gDummySpriteAffineAnimTable,
|
|
|
|
.callback = SpriteCB_HallOfFameMonitor
|
|
|
|
}*/;
|
|
|
|
|
|
|
|
extern const struct SpriteTemplate gSpriteTemplate_855C34C/* = {
|
|
|
|
.tileTag = 0xffff,
|
|
|
|
.paletteTag = 4112,
|
|
|
|
.oam = &gOamData_839F150,
|
|
|
|
.anims = gSpriteAnimTable_839F204,
|
|
|
|
.images = gSpriteImageTable_839F178,
|
|
|
|
.affineAnims = gDummySpriteAffineAnimTable,
|
|
|
|
.callback = SpriteCB_HallOfFameMonitor
|
|
|
|
}*/;
|
|
|
|
|
|
|
|
extern bool8 (*const gFieldEffectScriptFuncs[])(u8 **, u32 *)/* = {
|
|
|
|
FieldEffectCmd_loadtiles,
|
|
|
|
FieldEffectCmd_loadfadedpal,
|
|
|
|
FieldEffectCmd_loadpal,
|
|
|
|
FieldEffectCmd_callnative,
|
|
|
|
FieldEffectCmd_end,
|
|
|
|
FieldEffectCmd_loadgfx_callnative,
|
|
|
|
FieldEffectCmd_loadtiles_callnative,
|
|
|
|
FieldEffectCmd_loadfadedpal_callnative,
|
|
|
|
}*/;
|
|
|
|
|
|
|
|
extern void (*const gUnknown_0855C364[])(struct Task *)/* = {
|
|
|
|
PokecenterHealEffect_0,
|
|
|
|
PokecenterHealEffect_1,
|
|
|
|
PokecenterHealEffect_2,
|
|
|
|
PokecenterHealEffect_3
|
|
|
|
}*/;
|
|
|
|
|
|
|
|
extern void (*const gUnknown_0855C374[])(struct Task *)/* = {
|
|
|
|
HallOfFameRecordEffect_0,
|
|
|
|
HallOfFameRecordEffect_1,
|
|
|
|
HallOfFameRecordEffect_2,
|
|
|
|
HallOfFameRecordEffect_3
|
|
|
|
}*/;
|
|
|
|
|
|
|
|
extern void (*const gUnknown_0855C384[])(struct Sprite *)/* = {
|
|
|
|
PokeballGlowEffect_0,
|
|
|
|
PokeballGlowEffect_1,
|
|
|
|
PokeballGlowEffect_2,
|
|
|
|
PokeballGlowEffect_3,
|
|
|
|
PokeballGlowEffect_4,
|
|
|
|
PokeballGlowEffect_5,
|
|
|
|
PokeballGlowEffect_6,
|
|
|
|
PokeballGlowEffect_7
|
|
|
|
}*/;
|
|
|
|
|
|
|
|
extern const struct Coords16 gUnknown_0855C3A4[]/* = {
|
|
|
|
{.x = 0, .y = 0},
|
|
|
|
{.x = 6, .y = 0},
|
|
|
|
{.x = 0, .y = 4},
|
|
|
|
{.x = 6, .y = 4},
|
|
|
|
{.x = 0, .y = 8},
|
|
|
|
{.x = 6, .y = 8}
|
|
|
|
}*/;
|
|
|
|
|
|
|
|
extern const u8 gUnknown_0855C3BC[];// = {16, 12, 8, 0};
|
|
|
|
extern const u8 gUnknown_0855C3C0[];// = {16, 12, 8, 0};
|
|
|
|
extern const u8 gUnknown_0855C3C4[];// = { 0, 0, 0, 0};
|
|
|
|
|
2017-10-03 02:51:22 +01:00
|
|
|
// .text
|
2018-05-10 09:02:33 +01:00
|
|
|
|
|
|
|
u32 FieldEffectStart(u8 id)
|
|
|
|
{
|
|
|
|
u8 *script;
|
|
|
|
u32 val;
|
|
|
|
|
|
|
|
FieldEffectActiveListAdd(id);
|
|
|
|
|
|
|
|
script = gFieldEffectScriptPointers[id];
|
|
|
|
|
|
|
|
while (gFieldEffectScriptFuncs[*script](&script, &val))
|
|
|
|
;
|
|
|
|
|
|
|
|
return val;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool8 FieldEffectCmd_loadtiles(u8 **script, u32 *val)
|
|
|
|
{
|
|
|
|
(*script)++;
|
|
|
|
FieldEffectScript_LoadTiles(script);
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool8 FieldEffectCmd_loadfadedpal(u8 **script, u32 *val)
|
|
|
|
{
|
|
|
|
(*script)++;
|
|
|
|
FieldEffectScript_LoadFadedPalette(script);
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool8 FieldEffectCmd_loadpal(u8 **script, u32 *val)
|
|
|
|
{
|
|
|
|
(*script)++;
|
|
|
|
FieldEffectScript_LoadPalette(script);
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool8 FieldEffectCmd_callnative(u8 **script, u32 *val)
|
|
|
|
{
|
|
|
|
(*script)++;
|
|
|
|
FieldEffectScript_CallNative(script, val);
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool8 FieldEffectCmd_end(u8 **script, u32 *val)
|
|
|
|
{
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool8 FieldEffectCmd_loadgfx_callnative(u8 **script, u32 *val)
|
|
|
|
{
|
|
|
|
(*script)++;
|
|
|
|
FieldEffectScript_LoadTiles(script);
|
|
|
|
FieldEffectScript_LoadFadedPalette(script);
|
|
|
|
FieldEffectScript_CallNative(script, val);
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool8 FieldEffectCmd_loadtiles_callnative(u8 **script, u32 *val)
|
|
|
|
{
|
|
|
|
(*script)++;
|
|
|
|
FieldEffectScript_LoadTiles(script);
|
|
|
|
FieldEffectScript_CallNative(script, val);
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool8 FieldEffectCmd_loadfadedpal_callnative(u8 **script, u32 *val)
|
|
|
|
{
|
|
|
|
(*script)++;
|
|
|
|
FieldEffectScript_LoadFadedPalette(script);
|
|
|
|
FieldEffectScript_CallNative(script, val);
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
u32 FieldEffectScript_ReadWord(u8 **script)
|
|
|
|
{
|
|
|
|
return (*script)[0]
|
|
|
|
+ ((*script)[1] << 8)
|
|
|
|
+ ((*script)[2] << 16)
|
|
|
|
+ ((*script)[3] << 24);
|
|
|
|
}
|
|
|
|
|
|
|
|
void FieldEffectScript_LoadTiles(u8 **script)
|
|
|
|
{
|
|
|
|
struct SpriteSheet *sheet = (struct SpriteSheet *)FieldEffectScript_ReadWord(script);
|
|
|
|
if (GetSpriteTileStartByTag(sheet->tag) == 0xFFFF)
|
|
|
|
LoadSpriteSheet(sheet);
|
|
|
|
(*script) += 4;
|
|
|
|
}
|
|
|
|
|
|
|
|
void FieldEffectScript_LoadFadedPalette(u8 **script)
|
|
|
|
{
|
|
|
|
struct SpritePalette *palette = (struct SpritePalette *)FieldEffectScript_ReadWord(script);
|
|
|
|
LoadSpritePalette(palette);
|
|
|
|
UpdateSpritePaletteWithWeather(IndexOfSpritePaletteTag(palette->tag));
|
|
|
|
(*script) += 4;
|
|
|
|
}
|
|
|
|
|
|
|
|
void FieldEffectScript_LoadPalette(u8 **script)
|
|
|
|
{
|
|
|
|
struct SpritePalette *palette = (struct SpritePalette *)FieldEffectScript_ReadWord(script);
|
|
|
|
LoadSpritePalette(palette);
|
|
|
|
(*script) += 4;
|
|
|
|
}
|
|
|
|
|
|
|
|
void FieldEffectScript_CallNative(u8 **script, u32 *val)
|
|
|
|
{
|
|
|
|
u32 (*func)(void) = (u32 (*)(void))FieldEffectScript_ReadWord(script);
|
|
|
|
*val = func();
|
|
|
|
(*script) += 4;
|
|
|
|
}
|
|
|
|
|
|
|
|
void FieldEffectFreeGraphicsResources(struct Sprite *sprite)
|
|
|
|
{
|
|
|
|
u16 sheetTileStart = sprite->sheetTileStart;
|
|
|
|
u32 paletteNum = sprite->oam.paletteNum;
|
|
|
|
DestroySprite(sprite);
|
|
|
|
FieldEffectFreeTilesIfUnused(sheetTileStart);
|
|
|
|
FieldEffectFreePaletteIfUnused(paletteNum);
|
|
|
|
}
|
|
|
|
|
|
|
|
void FieldEffectStop(struct Sprite *sprite, u8 id)
|
|
|
|
{
|
|
|
|
FieldEffectFreeGraphicsResources(sprite);
|
|
|
|
FieldEffectActiveListRemove(id);
|
|
|
|
}
|
|
|
|
|
|
|
|
void FieldEffectFreeTilesIfUnused(u16 tileStart)
|
|
|
|
{
|
|
|
|
u8 i;
|
|
|
|
u16 tag = GetSpriteTileTagByTileStart(tileStart);
|
|
|
|
|
|
|
|
if (tag != 0xFFFF)
|
|
|
|
{
|
|
|
|
for (i = 0; i < MAX_SPRITES; i++)
|
|
|
|
if (gSprites[i].inUse && gSprites[i].usingSheet && tileStart == gSprites[i].sheetTileStart)
|
|
|
|
return;
|
|
|
|
FreeSpriteTilesByTag(tag);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void FieldEffectFreePaletteIfUnused(u8 paletteNum)
|
|
|
|
{
|
|
|
|
u8 i;
|
|
|
|
u16 tag = GetSpritePaletteTagByPaletteNum(paletteNum);
|
|
|
|
|
|
|
|
if (tag != 0xFFFF)
|
|
|
|
{
|
|
|
|
for (i = 0; i < MAX_SPRITES; i++)
|
|
|
|
if (gSprites[i].inUse && gSprites[i].oam.paletteNum == paletteNum)
|
|
|
|
return;
|
|
|
|
FreeSpritePaletteByTag(tag);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void FieldEffectActiveListClear(void)
|
|
|
|
{
|
|
|
|
u8 i;
|
|
|
|
for (i = 0; i < ARRAY_COUNT(sActiveList); i++)
|
|
|
|
sActiveList[i] = 0xFF;
|
|
|
|
}
|
|
|
|
|
|
|
|
void FieldEffectActiveListAdd(u8 id)
|
|
|
|
{
|
|
|
|
u8 i;
|
|
|
|
for (i = 0; i < ARRAY_COUNT(sActiveList); i++)
|
|
|
|
{
|
|
|
|
if (sActiveList[i] == 0xFF)
|
|
|
|
{
|
|
|
|
sActiveList[i] = id;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void FieldEffectActiveListRemove(u8 id)
|
|
|
|
{
|
|
|
|
u8 i;
|
|
|
|
for (i = 0; i < ARRAY_COUNT(sActiveList); i++)
|
|
|
|
{
|
|
|
|
if (sActiveList[i] == id)
|
|
|
|
{
|
|
|
|
sActiveList[i] = 0xFF;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bool8 FieldEffectActiveListContains(u8 id)
|
|
|
|
{
|
|
|
|
u8 i;
|
|
|
|
for (i = 0; i < ARRAY_COUNT(sActiveList); i++)
|
|
|
|
if (sActiveList[i] == id)
|
|
|
|
return TRUE;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
u8 CreateTrainerSprite(u8 trainerSpriteID, s16 x, s16 y, u8 subpriority, u8 *buffer)
|
|
|
|
{
|
|
|
|
struct SpriteTemplate spriteTemplate;
|
|
|
|
LoadCompressedObjectPaletteOverrideBuffer(&gTrainerFrontPicPaletteTable[trainerSpriteID], buffer);
|
|
|
|
LoadCompressedObjectPicOverrideBuffer(&gTrainerFrontPicTable[trainerSpriteID], buffer);
|
|
|
|
spriteTemplate.tileTag = gTrainerFrontPicTable[trainerSpriteID].tag;
|
|
|
|
spriteTemplate.paletteTag = gTrainerFrontPicPaletteTable[trainerSpriteID].tag;
|
|
|
|
spriteTemplate.oam = &gNewGameBirchOamAttributes;
|
|
|
|
spriteTemplate.anims = gDummySpriteAnimTable;
|
|
|
|
spriteTemplate.images = NULL;
|
|
|
|
spriteTemplate.affineAnims = gDummySpriteAffineAnimTable;
|
|
|
|
spriteTemplate.callback = SpriteCallbackDummy;
|
|
|
|
return CreateSprite(&spriteTemplate, x, y, subpriority);
|
|
|
|
}
|
|
|
|
|
|
|
|
void LoadTrainerGfx_TrainerCard(u8 gender, u16 palOffset, u8 *dest)
|
|
|
|
{
|
|
|
|
LZDecompressVram(gTrainerFrontPicTable[gender].data, dest);
|
|
|
|
LoadCompressedPalette(gTrainerFrontPicPaletteTable[gender].data, palOffset, 0x20);
|
|
|
|
}
|
|
|
|
|
|
|
|
u8 AddNewGameBirchObject(s16 x, s16 y, u8 subpriority)
|
|
|
|
{
|
|
|
|
LoadSpritePalette(&gNewGameBirchObjectPaletteInfo);
|
|
|
|
return CreateSprite(&gNewGameBirchObjectTemplate, x, y, subpriority);
|
|
|
|
}
|
|
|
|
|
|
|
|
#ifdef NONMATCHING
|
|
|
|
u8 CreateMonSprite_PicBox(u16 species, s16 x, s16 y)
|
|
|
|
{
|
|
|
|
u16 spriteId = sub_818D7D8(species, 0, 0x8000, 1, x, y, 0, gMonPaletteTable[species].tag);
|
|
|
|
PreservePaletteInWeather(IndexOfSpritePaletteTag(gMonPaletteTable[species].tag) + 0x10);
|
|
|
|
if (spriteId == 0xFFFF)
|
|
|
|
return 0x40;
|
|
|
|
|
|
|
|
return spriteId;
|
|
|
|
}
|
|
|
|
#else
|
|
|
|
ASM_DIRECT
|
|
|
|
u8 CreateMonSprite_PicBox(u16 species, s16 x, s16 y)
|
|
|
|
{
|
|
|
|
asm_unified("push {r4,r5,lr}\n\
|
|
|
|
sub sp, 0x10\n\
|
|
|
|
lsls r0, 16\n\
|
|
|
|
lsrs r0, 16\n\
|
|
|
|
movs r3, 0x80\n\
|
|
|
|
lsls r3, 8\n\
|
|
|
|
lsls r1, 16\n\
|
|
|
|
asrs r1, 16\n\
|
|
|
|
str r1, [sp]\n\
|
|
|
|
lsls r2, 16\n\
|
|
|
|
asrs r2, 16\n\
|
|
|
|
str r2, [sp, 0x4]\n\
|
|
|
|
movs r1, 0\n\
|
|
|
|
str r1, [sp, 0x8]\n\
|
|
|
|
ldr r1, =gMonPaletteTable\n\
|
|
|
|
lsls r4, r0, 3\n\
|
|
|
|
adds r4, r1\n\
|
|
|
|
ldrh r1, [r4, 0x4]\n\
|
|
|
|
str r1, [sp, 0xC]\n\
|
|
|
|
movs r1, 0\n\
|
|
|
|
adds r2, r3, 0\n\
|
|
|
|
movs r3, 0x1\n\
|
|
|
|
bl sub_818D7D8\n\
|
|
|
|
lsls r0, 16\n\
|
|
|
|
lsrs r5, r0, 16\n\
|
|
|
|
ldrh r0, [r4, 0x4]\n\
|
|
|
|
bl IndexOfSpritePaletteTag\n\
|
|
|
|
adds r0, 0x10\n\
|
|
|
|
lsls r0, 24\n\
|
|
|
|
lsrs r0, 24\n\
|
|
|
|
bl PreservePaletteInWeather\n\
|
|
|
|
ldr r0, =0x0000ffff\n\
|
|
|
|
cmp r5, r0\n\
|
|
|
|
beq _080B5FDC\n\
|
|
|
|
lsls r0, r5, 24\n\
|
|
|
|
lsrs r0, 24\n\
|
|
|
|
b _080B5FDE\n\
|
|
|
|
.pool\n\
|
|
|
|
_080B5FDC:\n\
|
|
|
|
movs r0, 0x40\n\
|
|
|
|
_080B5FDE:\n\
|
|
|
|
add sp, 0x10\n\
|
|
|
|
pop {r4,r5}\n\
|
|
|
|
pop {r1}\n\
|
|
|
|
bx r1");
|
|
|
|
}
|
|
|
|
#endif //NONMATCHING
|
|
|
|
|
|
|
|
u8 CreateMonSprite_FieldMove(u16 species, u32 d, u32 g, s16 x, s16 y)
|
|
|
|
{
|
|
|
|
const struct CompressedSpritePalette *spritePalette = GetMonSpritePalStructFromOtIdPersonality(species, d, g);
|
|
|
|
u16 spriteId = sub_818D7D8(species, d, g, 1, x, y, 0, spritePalette->tag);
|
|
|
|
PreservePaletteInWeather(IndexOfSpritePaletteTag(spritePalette->tag) + 0x10);
|
|
|
|
if (spriteId == 0xFFFF)
|
|
|
|
return 0x40;
|
|
|
|
|
|
|
|
return spriteId;
|
|
|
|
}
|
|
|
|
|
|
|
|
void FreeResourcesAndDestroySprite(struct Sprite *sprite, u8 spriteId)
|
|
|
|
{
|
|
|
|
ResetPreservedPalettesInWeather();
|
|
|
|
if (sprite->oam.affineMode != 0)
|
|
|
|
{
|
|
|
|
FreeOamMatrix(sprite->oam.matrixNum);
|
|
|
|
}
|
|
|
|
sub_818D820(spriteId);
|
|
|
|
}
|
|
|
|
|
|
|
|
#ifdef NONMATCHING
|
|
|
|
void MultiplyInvertedPaletteRGBComponents(u16 i, u8 r, u8 g, u8 b)
|
|
|
|
{
|
|
|
|
int curRed;
|
|
|
|
int curGreen;
|
|
|
|
int curBlue;
|
|
|
|
|
|
|
|
curRed = gPlttBufferUnfaded[i] & 0x1f;
|
|
|
|
curGreen = (gPlttBufferUnfaded[i] & (0x1f << 5)) >> 5;
|
|
|
|
curBlue = (gPlttBufferUnfaded[i] & (0x1f << 10)) >> 10;
|
|
|
|
curRed += (((0x1f - curRed) * r) >> 4);
|
|
|
|
curGreen += (((0x1f - curGreen) * g) >> 4);
|
|
|
|
curBlue += (((0x1f - curBlue) * b) >> 4);
|
|
|
|
gPlttBufferFaded[i] = RGB(curRed, curGreen, curBlue);
|
|
|
|
}
|
|
|
|
|
|
|
|
void MultiplyPaletteRGBComponents(u16 i, u8 r, u8 g, u8 b)
|
|
|
|
{
|
|
|
|
int curRed;
|
|
|
|
int curGreen;
|
|
|
|
int curBlue;
|
|
|
|
|
|
|
|
curRed = gPlttBufferUnfaded[i] & 0x1f;
|
|
|
|
curGreen = (gPlttBufferUnfaded[i] & (0x1f << 5)) >> 5;
|
|
|
|
curBlue = (gPlttBufferUnfaded[i] & (0x1f << 10)) >> 10;
|
|
|
|
curRed -= ((curRed * r) >> 4);
|
|
|
|
curGreen -= ((curGreen * g) >> 4);
|
|
|
|
curBlue -= ((curBlue * b) >> 4);
|
|
|
|
gPlttBufferFaded[i] = RGB(curRed, curGreen, curBlue);
|
|
|
|
}
|
|
|
|
#else
|
|
|
|
ASM_DIRECT
|
|
|
|
void MultiplyInvertedPaletteRGBComponents(u16 i, u8 r, u8 g, u8 b)
|
|
|
|
{
|
|
|
|
asm(".syntax unified\n"
|
|
|
|
"\tpush {r4-r7,lr}\n"
|
|
|
|
"\tmov r7, r9\n"
|
|
|
|
"\tmov r6, r8\n"
|
|
|
|
"\tpush {r6,r7}\n"
|
|
|
|
"\tlsls r0, 16\n"
|
|
|
|
"\tlsls r1, 24\n"
|
|
|
|
"\tlsrs r1, 24\n"
|
|
|
|
"\tlsls r2, 24\n"
|
|
|
|
"\tlsrs r2, 24\n"
|
|
|
|
"\tlsls r3, 24\n"
|
|
|
|
"\tlsrs r3, 24\n"
|
|
|
|
"\tldr r4, _08085D00 @ =gPlttBufferUnfaded\n"
|
|
|
|
"\tlsrs r0, 15\n"
|
|
|
|
"\tadds r4, r0, r4\n"
|
|
|
|
"\tldrh r4, [r4]\n"
|
|
|
|
"\tmovs r5, 0x1F\n"
|
|
|
|
"\tmov r9, r5\n"
|
|
|
|
"\tmov r8, r4\n"
|
|
|
|
"\tmov r6, r8\n"
|
|
|
|
"\tands r6, r5\n"
|
|
|
|
"\tmov r8, r6\n"
|
|
|
|
"\tmovs r6, 0xF8\n"
|
|
|
|
"\tlsls r6, 2\n"
|
|
|
|
"\tands r6, r4\n"
|
|
|
|
"\tlsrs r6, 5\n"
|
|
|
|
"\tmovs r5, 0xF8\n"
|
|
|
|
"\tlsls r5, 7\n"
|
|
|
|
"\tands r4, r5\n"
|
|
|
|
"\tlsrs r4, 10\n"
|
|
|
|
"\tmov r7, r9\n"
|
|
|
|
"\tmov r5, r8\n"
|
|
|
|
"\tsubs r7, r5\n"
|
|
|
|
"\tmov r12, r7\n"
|
|
|
|
"\tmov r7, r12\n"
|
|
|
|
"\tmuls r7, r1\n"
|
|
|
|
"\tadds r1, r7, 0\n"
|
|
|
|
"\tasrs r1, 4\n"
|
|
|
|
"\tadd r8, r1\n"
|
|
|
|
"\tmov r5, r9\n"
|
|
|
|
"\tsubs r1, r5, r6\n"
|
|
|
|
"\tmuls r1, r2\n"
|
|
|
|
"\tasrs r1, 4\n"
|
|
|
|
"\tadds r6, r1\n"
|
|
|
|
"\tsubs r5, r4\n"
|
|
|
|
"\tmov r9, r5\n"
|
|
|
|
"\tmov r1, r9\n"
|
|
|
|
"\tmuls r1, r3\n"
|
|
|
|
"\tasrs r1, 4\n"
|
|
|
|
"\tadds r4, r1\n"
|
|
|
|
"\tmov r7, r8\n"
|
|
|
|
"\tlsls r7, 16\n"
|
|
|
|
"\tlsls r6, 21\n"
|
|
|
|
"\torrs r6, r7\n"
|
|
|
|
"\tlsls r4, 26\n"
|
|
|
|
"\torrs r4, r6\n"
|
|
|
|
"\tlsrs r4, 16\n"
|
|
|
|
"\tldr r1, _08085D04 @ =gPlttBufferFaded\n"
|
|
|
|
"\tadds r0, r1\n"
|
|
|
|
"\tstrh r4, [r0]\n"
|
|
|
|
"\tpop {r3,r4}\n"
|
|
|
|
"\tmov r8, r3\n"
|
|
|
|
"\tmov r9, r4\n"
|
|
|
|
"\tpop {r4-r7}\n"
|
|
|
|
"\tpop {r0}\n"
|
|
|
|
"\tbx r0\n"
|
|
|
|
"\t.align 2, 0\n"
|
|
|
|
"_08085D00: .4byte gPlttBufferUnfaded\n"
|
|
|
|
"_08085D04: .4byte gPlttBufferFaded\n"
|
|
|
|
".syntax divided");
|
|
|
|
}
|
|
|
|
|
|
|
|
ASM_DIRECT
|
|
|
|
void MultiplyPaletteRGBComponents(u16 i, u8 r, u8 g, u8 b)
|
|
|
|
{
|
|
|
|
asm(".syntax unified\n"
|
|
|
|
"\tpush {r4-r6,lr}\n"
|
|
|
|
"\tmov r6, r8\n"
|
|
|
|
"\tpush {r6}\n"
|
|
|
|
"\tlsls r0, 16\n"
|
|
|
|
"\tlsls r1, 24\n"
|
|
|
|
"\tlsrs r1, 24\n"
|
|
|
|
"\tlsls r2, 24\n"
|
|
|
|
"\tlsrs r2, 24\n"
|
|
|
|
"\tlsls r3, 24\n"
|
|
|
|
"\tlsrs r3, 24\n"
|
|
|
|
"\tldr r4, _08085D78 @ =gPlttBufferUnfaded\n"
|
|
|
|
"\tlsrs r0, 15\n"
|
|
|
|
"\tadds r4, r0, r4\n"
|
|
|
|
"\tldrh r4, [r4]\n"
|
|
|
|
"\tmovs r5, 0x1F\n"
|
|
|
|
"\tmov r8, r5\n"
|
|
|
|
"\tmov r6, r8\n"
|
|
|
|
"\tands r6, r4\n"
|
|
|
|
"\tmov r8, r6\n"
|
|
|
|
"\tmovs r5, 0xF8\n"
|
|
|
|
"\tlsls r5, 2\n"
|
|
|
|
"\tands r5, r4\n"
|
|
|
|
"\tlsrs r5, 5\n"
|
|
|
|
"\tmovs r6, 0xF8\n"
|
|
|
|
"\tlsls r6, 7\n"
|
|
|
|
"\tands r4, r6\n"
|
|
|
|
"\tlsrs r4, 10\n"
|
|
|
|
"\tmov r6, r8\n"
|
|
|
|
"\tmuls r6, r1\n"
|
|
|
|
"\tadds r1, r6, 0\n"
|
|
|
|
"\tasrs r1, 4\n"
|
|
|
|
"\tmov r6, r8\n"
|
|
|
|
"\tsubs r6, r1\n"
|
|
|
|
"\tadds r1, r5, 0\n"
|
|
|
|
"\tmuls r1, r2\n"
|
|
|
|
"\tasrs r1, 4\n"
|
|
|
|
"\tsubs r5, r1\n"
|
|
|
|
"\tadds r1, r4, 0\n"
|
|
|
|
"\tmuls r1, r3\n"
|
|
|
|
"\tasrs r1, 4\n"
|
|
|
|
"\tsubs r4, r1\n"
|
|
|
|
"\tlsls r6, 16\n"
|
|
|
|
"\tlsls r5, 21\n"
|
|
|
|
"\torrs r5, r6\n"
|
|
|
|
"\tlsls r4, 26\n"
|
|
|
|
"\torrs r4, r5\n"
|
|
|
|
"\tlsrs r4, 16\n"
|
|
|
|
"\tldr r1, _08085D7C @ =gPlttBufferFaded\n"
|
|
|
|
"\tadds r0, r1\n"
|
|
|
|
"\tstrh r4, [r0]\n"
|
|
|
|
"\tpop {r3}\n"
|
|
|
|
"\tmov r8, r3\n"
|
|
|
|
"\tpop {r4-r6}\n"
|
|
|
|
"\tpop {r0}\n"
|
|
|
|
"\tbx r0\n"
|
|
|
|
"\t.align 2, 0\n"
|
|
|
|
"_08085D78: .4byte gPlttBufferUnfaded\n"
|
|
|
|
"_08085D7C: .4byte gPlttBufferFaded\n"
|
|
|
|
".syntax divided");
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
void Task_PokecenterHeal(u8 taskId);
|
|
|
|
u8 CreatePokeballGlowSprite(s16, s16, s16, u16);
|
|
|
|
u8 PokecenterHealEffectHelper(s16, s16);
|
|
|
|
|
|
|
|
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] = 0x7c;
|
|
|
|
task->data[5] = 0x18;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Task_PokecenterHeal(u8 taskId)
|
|
|
|
{
|
|
|
|
struct Task *task;
|
|
|
|
task = &gTasks[taskId];
|
|
|
|
gUnknown_0855C364[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], 1);
|
|
|
|
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));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void Task_HallOfFameRecord(u8 taskId);
|
|
|
|
void HallOfFameRecordEffectHelper(s16, s16, s16, u8);
|
|
|
|
|
|
|
|
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] = 0x34;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Task_HallOfFameRecord(u8 taskId)
|
|
|
|
{
|
|
|
|
struct Task *task;
|
|
|
|
task = &gTasks[taskId];
|
|
|
|
gUnknown_0855C374[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], 0);
|
|
|
|
taskId = FindTaskIdByFunc(Task_HallOfFameRecord);
|
|
|
|
HallOfFameRecordEffectHelper(taskId, 0x78, 0x18, 0);
|
|
|
|
HallOfFameRecordEffectHelper(taskId, 0x28, 0x08, 1);
|
|
|
|
HallOfFameRecordEffectHelper(taskId, 0x48, 0x08, 1);
|
|
|
|
HallOfFameRecordEffectHelper(taskId, 0xa8, 0x08, 1);
|
|
|
|
HallOfFameRecordEffectHelper(taskId, 0xc8, 0x08, 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
void HallOfFameRecordEffect_1(struct Task *task)
|
|
|
|
{
|
|
|
|
if (gSprites[task->data[6]].data[0] > 1)
|
|
|
|
{
|
|
|
|
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));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void SpriteCB_PokeballGlowEffect(struct Sprite *);
|
|
|
|
|
|
|
|
u8 CreatePokeballGlowSprite(s16 data6, s16 x, s16 y, u16 data5)
|
|
|
|
{
|
|
|
|
u8 spriteId;
|
|
|
|
struct Sprite *sprite;
|
|
|
|
spriteId = CreateInvisibleSprite(SpriteCB_PokeballGlowEffect);
|
|
|
|
sprite = &gSprites[spriteId];
|
|
|
|
sprite->pos2.x = x;
|
|
|
|
sprite->pos2.y = y;
|
|
|
|
sprite->data[5] = data5;
|
|
|
|
sprite->data[6] = data6;
|
|
|
|
sprite->data[7] = spriteId;
|
|
|
|
return spriteId;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SpriteCB_PokeballGlowEffect(struct Sprite *sprite)
|
|
|
|
{
|
|
|
|
gUnknown_0855C384[sprite->data[0]](sprite);
|
|
|
|
}
|
|
|
|
|
|
|
|
void PokeballGlowEffect_0(struct Sprite *sprite)
|
|
|
|
{
|
|
|
|
u8 endSpriteId;
|
|
|
|
if (sprite->data[1] == 0 || (--sprite->data[1]) == 0)
|
|
|
|
{
|
|
|
|
sprite->data[1] = 25;
|
|
|
|
endSpriteId = CreateSpriteAtEnd(&gSpriteTemplate_855C304, gUnknown_0855C3A4[sprite->data[2]].x + sprite->pos2.x, gUnknown_0855C3A4[sprite->data[2]].y + sprite->pos2.y, 0);
|
|
|
|
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_0855C3BC[phase], gUnknown_0855C3C0[phase], gUnknown_0855C3C4[phase]);
|
|
|
|
phase = (sprite->data[2] + 2) & 3;
|
|
|
|
MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x106, gUnknown_0855C3BC[phase], gUnknown_0855C3C0[phase], gUnknown_0855C3C4[phase]);
|
|
|
|
phase = (sprite->data[2] + 1) & 3;
|
|
|
|
MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x102, gUnknown_0855C3BC[phase], gUnknown_0855C3C0[phase], gUnknown_0855C3C4[phase]);
|
|
|
|
phase = sprite->data[2];
|
|
|
|
MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x105, gUnknown_0855C3BC[phase], gUnknown_0855C3C0[phase], gUnknown_0855C3C4[phase]);
|
|
|
|
MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x103, gUnknown_0855C3BC[phase], gUnknown_0855C3C0[phase], gUnknown_0855C3C4[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_0855C3BC[phase], gUnknown_0855C3C0[phase], gUnknown_0855C3C4[phase]);
|
|
|
|
MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x106, gUnknown_0855C3BC[phase], gUnknown_0855C3C0[phase], gUnknown_0855C3C4[phase]);
|
|
|
|
MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x102, gUnknown_0855C3BC[phase], gUnknown_0855C3C0[phase], gUnknown_0855C3C4[phase]);
|
|
|
|
MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x105, gUnknown_0855C3BC[phase], gUnknown_0855C3C0[phase], gUnknown_0855C3C4[phase]);
|
|
|
|
MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x103, gUnknown_0855C3BC[phase], gUnknown_0855C3C0[phase], gUnknown_0855C3C4[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(s16 x, s16 y)
|
|
|
|
{
|
|
|
|
u8 spriteIdAtEnd;
|
|
|
|
struct Sprite *sprite;
|
|
|
|
spriteIdAtEnd = CreateSpriteAtEnd(&gSpriteTemplate_855C31C, x, y, 0);
|
|
|
|
sprite = &gSprites[spriteIdAtEnd];
|
|
|
|
sprite->oam.priority = 2;
|
|
|
|
sprite->invisible = 1;
|
|
|
|
SetSubspriteTables(sprite, &gUnknown_0855C2AC);
|
|
|
|
return spriteIdAtEnd;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SpriteCB_PokecenterMonitor(struct Sprite *sprite)
|
|
|
|
{
|
|
|
|
if (sprite->data[0] != 0)
|
|
|
|
{
|
|
|
|
sprite->data[0] = 0;
|
|
|
|
sprite->invisible = 0;
|
|
|
|
StartSpriteAnim(sprite, 1);
|
|
|
|
}
|
|
|
|
if (sprite->animEnded)
|
|
|
|
{
|
|
|
|
FieldEffectFreeGraphicsResources(sprite);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void HallOfFameRecordEffectHelper(s16 a0, s16 a1, s16 a2, u8 a3)
|
|
|
|
{
|
|
|
|
u8 spriteIdAtEnd;
|
|
|
|
if (!a3)
|
|
|
|
{
|
|
|
|
spriteIdAtEnd = CreateSpriteAtEnd(&gSpriteTemplate_855C334, a1, a2, 0);
|
|
|
|
SetSubspriteTables(&gSprites[spriteIdAtEnd], &gUnknown_0855C2C4);
|
|
|
|
} else
|
|
|
|
{
|
|
|
|
spriteIdAtEnd = CreateSpriteAtEnd(&gSpriteTemplate_855C34C, a1, a2, 0);
|
|
|
|
}
|
|
|
|
gSprites[spriteIdAtEnd].invisible = 1;
|
|
|
|
gSprites[spriteIdAtEnd].data[0] = a0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SpriteCB_HallOfFameMonitor(struct Sprite *sprite)
|
|
|
|
{
|
|
|
|
if (gTasks[sprite->data[0]].data[15])
|
|
|
|
{
|
|
|
|
if (sprite->data[1] == 0 || (--sprite->data[1]) == 0)
|
|
|
|
{
|
|
|
|
sprite->data[1] = 16;
|
|
|
|
sprite->invisible ^= 1;
|
|
|
|
}
|
|
|
|
sprite->data[2]++;
|
|
|
|
}
|
|
|
|
if (sprite->data[2] > 127)
|
|
|
|
{
|
|
|
|
FieldEffectFreeGraphicsResources(sprite);
|
|
|
|
}
|
|
|
|
}
|