diff options
author | PikalaxALT <pikalaxalt@gmail.com> | 2020-02-27 09:18:54 -0500 |
---|---|---|
committer | PikalaxALT <pikalaxalt@gmail.com> | 2020-02-27 09:18:54 -0500 |
commit | 456c817338e3ce899e524eff603f47c583de24aa (patch) | |
tree | 0c959ff3f0ef64112aa886e8cdea350baa787b76 /src | |
parent | 43f66fce5574592ac1c37b9452fe858e482156bb (diff) |
Decompile fldeff hooks
Diffstat (limited to 'src')
-rw-r--r-- | src/field_effect.c | 243 | ||||
-rw-r--r-- | src/fieldmap.c | 2 |
2 files changed, 244 insertions, 1 deletions
diff --git a/src/field_effect.c b/src/field_effect.c new file mode 100644 index 000000000..c9c388966 --- /dev/null +++ b/src/field_effect.c @@ -0,0 +1,243 @@ +#include "global.h" +#include "gflib.h" +#include "field_effect.h" +#include "field_effect_scripts.h" +#include "field_weather.h" +#include "overworld.h" +#include "quest_log.h" + +#define FIELD_EFFECT_COUNT 32 + +static u8 sFieldEffectActiveList[FIELD_EFFECT_COUNT]; + +void FieldEffectActiveListAdd(u8 fldeff); +void FieldEffectScript_LoadTiles(const u8 **script); +void FieldEffectScript_LoadFadedPal(const u8 **script); +void FieldEffectScript_LoadPal(const u8 **script); +void FieldEffectScript_CallNative(const u8 **script, u32 *result); +void FieldEffectFreeTilesIfUnused(u16 tilesTag); +void FieldEffectFreePaletteIfUnused(u8 paletteNum); + +extern bool8 (*const sFldEffScrcmdTable[])(const u8 **script, u32 *result); + +u32 FieldEffectStart(u8 fldeff) +{ + const u8 *script; + u32 result; + FieldEffectActiveListAdd(fldeff); + script = gFieldEffectScriptPointers[fldeff]; + while (sFldEffScrcmdTable[*script](&script, &result)) + ; + return result; +} + +bool8 FieldEffectCmd_loadtiles(const u8 **script, u32 *result) +{ + (*script)++; + FieldEffectScript_LoadTiles(script); + return TRUE; +} + +bool8 FieldEffectCmd_loadfadedpal(const u8 **script, u32 *result) +{ + (*script)++; + FieldEffectScript_LoadFadedPal(script); + return TRUE; +} + +bool8 FieldEffectCmd_loadpal(const u8 **script, u32 *result) +{ + (*script)++; + FieldEffectScript_LoadPal(script); + return TRUE; +} +bool8 FieldEffectCmd_callnative(const u8 **script, u32 *result) +{ + (*script)++; + FieldEffectScript_CallNative(script, result); + return TRUE; +} + +bool8 FieldEffectCmd_end(const u8 **script, u32 *result) +{ + return FALSE; +} + +bool8 FieldEffectCmd_loadgfx_callnative(const u8 **script, u32 *result) +{ + (*script)++; + FieldEffectScript_LoadTiles(script); + FieldEffectScript_LoadFadedPal(script); + FieldEffectScript_CallNative(script, result); + return TRUE; +} + +bool8 FieldEffectCmd_loadtiles_callnative(const u8 **script, u32 *result) +{ + (*script)++; + FieldEffectScript_LoadTiles(script); + FieldEffectScript_CallNative(script, result); + return TRUE; +} + +bool8 FieldEffectCmd_loadfadedpal_callnative(const u8 **script, u32 *result) +{ + (*script)++; + FieldEffectScript_LoadFadedPal(script); + FieldEffectScript_CallNative(script, result); + return TRUE; +} + +u32 FieldEffectScript_ReadWord(const u8 **script) +{ + return T2_READ_32(*script); +} + +void FieldEffectScript_LoadTiles(const u8 **script) +{ + const struct SpriteSheet * spriteSheet = (const struct SpriteSheet *)FieldEffectScript_ReadWord(script); + if (GetSpriteTileStartByTag(spriteSheet->tag) == 0xFFFF) + LoadSpriteSheet(spriteSheet); + *script += sizeof(u32); +} + +void sub_8083598(u8 paletteIdx) +{ + switch (gUnknown_2036E28) + { + case 0: + return; + case 1: + TintPalette_GrayScale(&gPlttBufferUnfaded[(paletteIdx + 16) * 16], 0x10); + break; + case 2: + TintPalette_SepiaTone(&gPlttBufferUnfaded[(paletteIdx + 16) * 16], 0x10); + break; + case 3: + sub_8111F38((paletteIdx + 16) * 16, 0x10); + TintPalette_GrayScale(&gPlttBufferUnfaded[(paletteIdx + 16) * 16], 0x10); + break; + default: + return; + } + CpuFastCopy(&gPlttBufferUnfaded[(paletteIdx + 16) * 16], &gPlttBufferFaded[(paletteIdx + 16) * 16], 0x20); +} + +void FieldEffectScript_LoadFadedPal(const u8 **script) +{ + const struct SpritePalette * spritePalette = (const struct SpritePalette *)FieldEffectScript_ReadWord(script); + u8 idx = IndexOfSpritePaletteTag(spritePalette->tag); + LoadSpritePalette(spritePalette); + if (idx == 0xFF) + sub_8083598(IndexOfSpritePaletteTag(spritePalette->tag)); + sub_807AA8C(IndexOfSpritePaletteTag(spritePalette->tag)); + *script += sizeof(u32); +} + +void FieldEffectScript_LoadPal(const u8 **script) +{ + const struct SpritePalette * spritePalette = (const struct SpritePalette *)FieldEffectScript_ReadWord(script); + u8 idx = IndexOfSpritePaletteTag(spritePalette->tag); + LoadSpritePalette(spritePalette); + if (idx != 0xFF) + sub_8083598(IndexOfSpritePaletteTag(spritePalette->tag)); + *script += sizeof(u32); +} + +void FieldEffectScript_CallNative(const u8 **script, u32 *result) +{ + u32 (*func)(void) = (u32 (*)(void))FieldEffectScript_ReadWord(script); + *result = func(); + *script += sizeof(u32); +} + +void FieldEffectFreeGraphicsResources(struct Sprite * sprite) +{ + u16 tileStart = sprite->sheetTileStart; + u8 paletteNum = sprite->oam.paletteNum; + DestroySprite(sprite); + FieldEffectFreeTilesIfUnused(tileStart); + FieldEffectFreePaletteIfUnused(paletteNum); +} + +void FieldEffectStop(struct Sprite * sprite, u8 fldeff) +{ + FieldEffectFreeGraphicsResources(sprite); + FieldEffectActiveListRemove(fldeff); +} + +void FieldEffectFreeTilesIfUnused(u16 tileStart) +{ + u8 i; + u16 tileTag = GetSpriteTileTagByTileStart(tileStart); + if (tileTag == 0xFFFF) + return; + for (i = 0; i < MAX_SPRITES; i++) + { + if (gSprites[i].inUse && gSprites[i].usingSheet && tileStart == gSprites[i].sheetTileStart) + return; + } + FreeSpriteTilesByTag(tileTag); +} + +void FieldEffectFreePaletteIfUnused(u8 paletteNum) +{ + u8 i; + u16 paletteTag = GetSpritePaletteTagByPaletteNum(paletteNum); + if (paletteTag == 0xFFFF) + return; + for (i = 0; i < MAX_SPRITES; i++) + { + if (gSprites[i].inUse && gSprites[i].oam.paletteNum == paletteNum) + return; + } + FreeSpritePaletteByTag(paletteTag); +} + +void FieldEffectActiveListClear(void) +{ + u8 i; + for (i = 0; i < FIELD_EFFECT_COUNT; i++) + { + sFieldEffectActiveList[i] = 0xFF; + } +} + +void FieldEffectActiveListAdd(u8 fldeff) +{ + u8 i; + for (i = 0; i < FIELD_EFFECT_COUNT; i++) + { + if (sFieldEffectActiveList[i] == 0xFF) + { + sFieldEffectActiveList[i] = fldeff; + return; + } + } +} + +void FieldEffectActiveListRemove(u8 fldeff) +{ + u8 i; + for (i = 0; i < FIELD_EFFECT_COUNT; i++) + { + if (sFieldEffectActiveList[i] == fldeff) + { + sFieldEffectActiveList[i] = 0xFF; + return; + } + } +} + +bool8 FieldEffectActiveListContains(u8 fldeff) +{ + u8 i; + for (i = 0; i < FIELD_EFFECT_COUNT; i++) + { + if (sFieldEffectActiveList[i] == fldeff) + { + return TRUE; + } + } + return FALSE; +} diff --git a/src/fieldmap.c b/src/fieldmap.c index 60ff70f10..c1c0bf15c 100644 --- a/src/fieldmap.c +++ b/src/fieldmap.c @@ -946,7 +946,7 @@ void sub_8059948(u8 a0, u8 a1) TintPalette_SepiaTone(gPlttBufferUnfaded + a0 * 16, a1 * 16); break; case 3: - sub_8111F38(a0 * 16, a1 * 16); + sub_8111F38((a0 * 16), a1 * 16); TintPalette_GrayScale(gPlttBufferUnfaded + a0 * 16, a1 * 16); break; default: |