diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/field_effect.c | 909 | 
1 files changed, 908 insertions, 1 deletions
| diff --git a/src/field_effect.c b/src/field_effect.c index 628dc776a..4c5c7cf54 100644 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -1,15 +1,922 @@  // Includes  #include "global.h" +#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"  // Static type declarations  // Static RAM declarations -IWRAM_DATA u8 gUnknown_03000F58[32]; +IWRAM_DATA u8 sActiveList[32];  // Static ROM declarations +extern u8 *gFieldEffectScriptPointers[]; +  // .rodata +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}; +  // .text + +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); +    } +} | 
