summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorYamaArashi <shadow962@live.com>2016-11-18 16:35:47 -0800
committerYamaArashi <shadow962@live.com>2016-11-18 16:37:29 -0800
commit5b4e2d3f18f8c3896503abdebd288cf503fbad1e (patch)
treea7f77d693b3736a384fb0c1eeae3bd068ae66903 /src
parenta07e8aa2f473ffe4217e0d48c20c14c67b9e9d99 (diff)
decompile field_effect.c
Diffstat (limited to 'src')
-rw-r--r--src/field_effect.c218
1 files changed, 218 insertions, 0 deletions
diff --git a/src/field_effect.c b/src/field_effect.c
new file mode 100644
index 000000000..97301ab50
--- /dev/null
+++ b/src/field_effect.c
@@ -0,0 +1,218 @@
+#include "global.h"
+#include "sprite.h"
+
+typedef bool8 (*FldEffCmd)(u8 **, u32 *);
+
+static u8 sActiveList[32];
+
+extern u8 *gFieldEffectScriptPointers[];
+
+extern FldEffCmd gFieldEffectScriptFuncs[];
+
+void FieldEffectScript_LoadTiles(u8 **script);
+void FieldEffectScript_LoadFadedPalette(u8 **script);
+void FieldEffectScript_LoadPalette(u8 **script);
+void FieldEffectScript_CallNative(u8 **script, u32 *val);
+void FieldEffectFreeGraphicsResources(struct Sprite *sprite);
+void FieldEffectStop(struct Sprite *sprite, u8 id);
+void FieldEffectFreeTilesIfUnused(u16 tileStart);
+void FieldEffectFreePaletteIfUnused(u8 paletteNum);
+void FieldEffectActiveListClear(void);
+void FieldEffectActiveListAdd(u8 id);
+void FieldEffectActiveListRemove(u8 id);
+
+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);
+ sub_807D78C(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;
+}