summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/field_effect.s576
-rw-r--r--data/field_effect.s4
-rw-r--r--data/field_effect_scripts.s2
-rw-r--r--include/field_effect_scripts.h6
-rw-r--r--include/field_weather.h1
-rw-r--r--include/quest_log.h2
-rw-r--r--ld_script.txt1
-rw-r--r--src/field_effect.c243
-rw-r--r--src/fieldmap.c2
-rw-r--r--sym_bss.txt4
10 files changed, 257 insertions, 584 deletions
diff --git a/asm/field_effect.s b/asm/field_effect.s
index 91ea68461..67215c081 100644
--- a/asm/field_effect.s
+++ b/asm/field_effect.s
@@ -5,582 +5,6 @@
.text
- thumb_func_start FieldEffectStart
-FieldEffectStart: @ 8083444
- push {r4,r5,lr}
- sub sp, 0x8
- adds r4, r0, 0
- lsls r4, 24
- lsrs r4, 24
- adds r0, r4, 0
- bl FieldEffectActiveListAdd
- ldr r0, _08083484 @ =gUnknown_81D96AC
- lsls r4, 2
- adds r4, r0
- ldr r0, [r4]
- str r0, [sp]
- add r4, sp, 0x4
- ldr r5, _08083488 @ =gUnknown_83CBE30
-_08083462:
- ldr r0, [sp]
- ldrb r0, [r0]
- lsls r0, 2
- adds r0, r5
- ldr r2, [r0]
- mov r0, sp
- adds r1, r4, 0
- bl _call_via_r2
- lsls r0, 24
- cmp r0, 0
- bne _08083462
- ldr r0, [sp, 0x4]
- add sp, 0x8
- pop {r4,r5}
- pop {r1}
- bx r1
- .align 2, 0
-_08083484: .4byte gUnknown_81D96AC
-_08083488: .4byte gUnknown_83CBE30
- thumb_func_end FieldEffectStart
-
- thumb_func_start FieldEffectCmd_loadtiles
-FieldEffectCmd_loadtiles: @ 808348C
- push {lr}
- ldr r1, [r0]
- adds r1, 0x1
- str r1, [r0]
- bl FieldEffectScript_LoadTiles
- movs r0, 0x1
- pop {r1}
- bx r1
- thumb_func_end FieldEffectCmd_loadtiles
-
- thumb_func_start FieldEffectCmd_loadfadedpal
-FieldEffectCmd_loadfadedpal: @ 80834A0
- push {lr}
- ldr r1, [r0]
- adds r1, 0x1
- str r1, [r0]
- bl sub_8083614
- movs r0, 0x1
- pop {r1}
- bx r1
- thumb_func_end FieldEffectCmd_loadfadedpal
-
- thumb_func_start FieldEffectCmd_loadpal
-FieldEffectCmd_loadpal: @ 80834B4
- push {lr}
- ldr r1, [r0]
- adds r1, 0x1
- str r1, [r0]
- bl sub_808365C
- movs r0, 0x1
- pop {r1}
- bx r1
- thumb_func_end FieldEffectCmd_loadpal
-
- thumb_func_start FieldEffectCmd_callnative
-FieldEffectCmd_callnative: @ 80834C8
- push {lr}
- ldr r2, [r0]
- adds r2, 0x1
- str r2, [r0]
- bl FieldEffectScript_CallNative
- movs r0, 0x1
- pop {r1}
- bx r1
- thumb_func_end FieldEffectCmd_callnative
-
- thumb_func_start sub_80834DC
-sub_80834DC: @ 80834DC
- movs r0, 0
- bx lr
- thumb_func_end sub_80834DC
-
- thumb_func_start FieldEffectCmd_loadgfx_callnative
-FieldEffectCmd_loadgfx_callnative: @ 80834E0
- push {r4,r5,lr}
- adds r4, r0, 0
- adds r5, r1, 0
- ldr r0, [r4]
- adds r0, 0x1
- str r0, [r4]
- adds r0, r4, 0
- bl FieldEffectScript_LoadTiles
- adds r0, r4, 0
- bl sub_8083614
- adds r0, r4, 0
- adds r1, r5, 0
- bl FieldEffectScript_CallNative
- movs r0, 0x1
- pop {r4,r5}
- pop {r1}
- bx r1
- thumb_func_end FieldEffectCmd_loadgfx_callnative
-
- thumb_func_start FieldEffectCmd_loadtiles_callnative
-FieldEffectCmd_loadtiles_callnative: @ 8083508
- push {r4,r5,lr}
- adds r4, r0, 0
- adds r5, r1, 0
- ldr r0, [r4]
- adds r0, 0x1
- str r0, [r4]
- adds r0, r4, 0
- bl FieldEffectScript_LoadTiles
- adds r0, r4, 0
- adds r1, r5, 0
- bl FieldEffectScript_CallNative
- movs r0, 0x1
- pop {r4,r5}
- pop {r1}
- bx r1
- thumb_func_end FieldEffectCmd_loadtiles_callnative
-
- thumb_func_start FieldEffectCmd_loadfadedpal_callnative
-FieldEffectCmd_loadfadedpal_callnative: @ 808352C
- push {r4,r5,lr}
- adds r4, r0, 0
- adds r5, r1, 0
- ldr r0, [r4]
- adds r0, 0x1
- str r0, [r4]
- adds r0, r4, 0
- bl sub_8083614
- adds r0, r4, 0
- adds r1, r5, 0
- bl FieldEffectScript_CallNative
- movs r0, 0x1
- pop {r4,r5}
- pop {r1}
- bx r1
- thumb_func_end FieldEffectCmd_loadfadedpal_callnative
-
- thumb_func_start FieldEffectScript_ReadWord
-FieldEffectScript_ReadWord: @ 8083550
- ldr r2, [r0]
- ldrb r0, [r2]
- ldrb r1, [r2, 0x1]
- lsls r1, 8
- adds r0, r1
- ldrb r1, [r2, 0x2]
- lsls r1, 16
- adds r0, r1
- ldrb r1, [r2, 0x3]
- lsls r1, 24
- adds r0, r1
- bx lr
- thumb_func_end FieldEffectScript_ReadWord
-
- thumb_func_start FieldEffectScript_LoadTiles
-FieldEffectScript_LoadTiles: @ 8083568
- push {r4,r5,lr}
- adds r4, r0, 0
- bl FieldEffectScript_ReadWord
- adds r5, r0, 0
- ldrh r0, [r5, 0x6]
- bl GetSpriteTileStartByTag
- lsls r0, 16
- ldr r1, _08083594 @ =0xffff0000
- cmp r0, r1
- bne _08083586
- adds r0, r5, 0
- bl LoadSpriteSheet
-_08083586:
- ldr r0, [r4]
- adds r0, 0x4
- str r0, [r4]
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_08083594: .4byte 0xffff0000
- thumb_func_end FieldEffectScript_LoadTiles
-
- thumb_func_start sub_8083598
-sub_8083598: @ 8083598
- push {r4,lr}
- lsls r0, 24
- lsrs r4, r0, 24
- ldr r0, _080835B4 @ =gUnknown_2036E28
- ldrb r0, [r0]
- cmp r0, 0x1
- beq _080835B8
- cmp r0, 0x1
- ble _08083606
- cmp r0, 0x2
- beq _080835CC
- cmp r0, 0x3
- beq _080835E0
- b _08083606
- .align 2, 0
-_080835B4: .4byte gUnknown_2036E28
-_080835B8:
- adds r4, 0x10
- lsls r0, r4, 5
- ldr r1, _080835C8 @ =gPlttBufferUnfaded
- adds r0, r1
- movs r1, 0x10
- bl TintPalette_GrayScale
- b _080835F6
- .align 2, 0
-_080835C8: .4byte gPlttBufferUnfaded
-_080835CC:
- adds r4, 0x10
- lsls r0, r4, 5
- ldr r1, _080835DC @ =gPlttBufferUnfaded
- adds r0, r1
- movs r1, 0x10
- bl TintPalette_SepiaTone
- b _080835F6
- .align 2, 0
-_080835DC: .4byte gPlttBufferUnfaded
-_080835E0:
- adds r4, 0x10
- lsls r0, r4, 4
- movs r1, 0x10
- bl sub_8111F38
- lsls r0, r4, 5
- ldr r1, _0808360C @ =gPlttBufferUnfaded
- adds r0, r1
- movs r1, 0x10
- bl TintPalette_GrayScale
-_080835F6:
- lsls r1, r4, 5
- ldr r0, _0808360C @ =gPlttBufferUnfaded
- adds r0, r1, r0
- ldr r2, _08083610 @ =gPlttBufferFaded
- adds r1, r2
- movs r2, 0x8
- bl CpuFastSet
-_08083606:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_0808360C: .4byte gPlttBufferUnfaded
-_08083610: .4byte gPlttBufferFaded
- thumb_func_end sub_8083598
-
- thumb_func_start sub_8083614
-sub_8083614: @ 8083614
- push {r4-r6,lr}
- adds r6, r0, 0
- bl FieldEffectScript_ReadWord
- adds r5, r0, 0
- ldrh r0, [r5, 0x4]
- bl IndexOfSpritePaletteTag
- adds r4, r0, 0
- lsls r4, 24
- lsrs r4, 24
- adds r0, r5, 0
- bl LoadSpritePalette
- cmp r4, 0xFF
- bne _08083642
- ldrh r0, [r5, 0x4]
- bl IndexOfSpritePaletteTag
- lsls r0, 24
- lsrs r0, 24
- bl sub_8083598
-_08083642:
- ldrh r0, [r5, 0x4]
- bl IndexOfSpritePaletteTag
- lsls r0, 24
- lsrs r0, 24
- bl sub_807AA8C
- ldr r0, [r6]
- adds r0, 0x4
- str r0, [r6]
- pop {r4-r6}
- pop {r0}
- bx r0
- thumb_func_end sub_8083614
-
- thumb_func_start sub_808365C
-sub_808365C: @ 808365C
- push {r4-r6,lr}
- adds r6, r0, 0
- bl FieldEffectScript_ReadWord
- adds r5, r0, 0
- ldrh r0, [r5, 0x4]
- bl IndexOfSpritePaletteTag
- adds r4, r0, 0
- lsls r4, 24
- lsrs r4, 24
- adds r0, r5, 0
- bl LoadSpritePalette
- cmp r4, 0xFF
- beq _0808368A
- ldrh r0, [r5, 0x4]
- bl IndexOfSpritePaletteTag
- lsls r0, 24
- lsrs r0, 24
- bl sub_8083598
-_0808368A:
- ldr r0, [r6]
- adds r0, 0x4
- str r0, [r6]
- pop {r4-r6}
- pop {r0}
- bx r0
- thumb_func_end sub_808365C
-
- thumb_func_start FieldEffectScript_CallNative
-FieldEffectScript_CallNative: @ 8083698
- push {r4,r5,lr}
- adds r4, r0, 0
- adds r5, r1, 0
- bl FieldEffectScript_ReadWord
- bl _call_via_r0
- str r0, [r5]
- ldr r0, [r4]
- adds r0, 0x4
- str r0, [r4]
- pop {r4,r5}
- pop {r0}
- bx r0
- thumb_func_end FieldEffectScript_CallNative
-
- thumb_func_start FieldEffectFreeGraphicsResources
-FieldEffectFreeGraphicsResources: @ 80836B4
- push {r4,r5,lr}
- adds r1, r0, 0
- adds r1, 0x40
- ldrh r5, [r1]
- ldrb r4, [r0, 0x5]
- lsrs r4, 4
- bl DestroySprite
- adds r0, r5, 0
- bl FieldEffectFreeTilesIfUnused
- adds r0, r4, 0
- bl FieldEffectFreePaletteIfUnused
- pop {r4,r5}
- pop {r0}
- bx r0
- thumb_func_end FieldEffectFreeGraphicsResources
-
- thumb_func_start FieldEffectStop
-FieldEffectStop: @ 80836D8
- push {r4,lr}
- lsls r4, r1, 24
- lsrs r4, 24
- bl FieldEffectFreeGraphicsResources
- adds r0, r4, 0
- bl FieldEffectActiveListRemove
- pop {r4}
- pop {r0}
- bx r0
- thumb_func_end FieldEffectStop
-
- thumb_func_start FieldEffectFreeTilesIfUnused
-FieldEffectFreeTilesIfUnused: @ 80836F0
- push {r4,r5,lr}
- lsls r0, 16
- lsrs r4, r0, 16
- adds r0, r4, 0
- bl GetSpriteTileTagByTileStart
- lsls r0, 16
- lsrs r3, r0, 16
- ldr r0, _0808374C @ =0x0000ffff
- cmp r3, r0
- beq _08083744
- movs r2, 0
- ldr r5, _08083750 @ =gSprites
-_0808370A:
- lsls r0, r2, 4
- adds r0, r2
- lsls r0, 2
- adds r1, r0, r5
- adds r0, r1, 0
- adds r0, 0x3E
- ldrb r0, [r0]
- lsls r0, 31
- cmp r0, 0
- beq _08083734
- adds r0, r1, 0
- adds r0, 0x3F
- ldrb r0, [r0]
- lsls r0, 25
- cmp r0, 0
- bge _08083734
- adds r0, r1, 0
- adds r0, 0x40
- ldrh r0, [r0]
- cmp r4, r0
- beq _08083744
-_08083734:
- adds r0, r2, 0x1
- lsls r0, 24
- lsrs r2, r0, 24
- cmp r2, 0x3F
- bls _0808370A
- adds r0, r3, 0
- bl FreeSpriteTilesByTag
-_08083744:
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_0808374C: .4byte 0x0000ffff
-_08083750: .4byte gSprites
- thumb_func_end FieldEffectFreeTilesIfUnused
-
- thumb_func_start FieldEffectFreePaletteIfUnused
-FieldEffectFreePaletteIfUnused: @ 8083754
- push {r4-r6,lr}
- lsls r0, 24
- lsrs r4, r0, 24
- adds r0, r4, 0
- bl GetSpritePaletteTagByPaletteNum
- lsls r0, 16
- lsrs r5, r0, 16
- ldr r0, _080837A4 @ =0x0000ffff
- cmp r5, r0
- beq _0808379C
- movs r2, 0
- ldr r6, _080837A8 @ =gSprites
- adds r3, r4, 0
-_08083770:
- lsls r0, r2, 4
- adds r0, r2
- lsls r0, 2
- adds r1, r0, r6
- adds r0, r1, 0
- adds r0, 0x3E
- ldrb r0, [r0]
- lsls r0, 31
- cmp r0, 0
- beq _0808378C
- ldrb r0, [r1, 0x5]
- lsrs r0, 4
- cmp r0, r3
- beq _0808379C
-_0808378C:
- adds r0, r2, 0x1
- lsls r0, 24
- lsrs r2, r0, 24
- cmp r2, 0x3F
- bls _08083770
- adds r0, r5, 0
- bl FreeSpritePaletteByTag
-_0808379C:
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_080837A4: .4byte 0x0000ffff
-_080837A8: .4byte gSprites
- thumb_func_end FieldEffectFreePaletteIfUnused
-
- thumb_func_start FieldEffectActiveListClear
-FieldEffectActiveListClear: @ 80837AC
- push {r4,lr}
- movs r2, 0
- ldr r4, _080837CC @ =gUnknown_3000FC8
- movs r3, 0xFF
-_080837B4:
- adds r0, r2, r4
- ldrb r1, [r0]
- orrs r1, r3
- strb r1, [r0]
- adds r0, r2, 0x1
- lsls r0, 24
- lsrs r2, r0, 24
- cmp r2, 0x1F
- bls _080837B4
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_080837CC: .4byte gUnknown_3000FC8
- thumb_func_end FieldEffectActiveListClear
-
- thumb_func_start FieldEffectActiveListAdd
-FieldEffectActiveListAdd: @ 80837D0
- push {r4,lr}
- lsls r0, 24
- lsrs r3, r0, 24
- movs r2, 0
- ldr r4, _080837E8 @ =gUnknown_3000FC8
-_080837DA:
- adds r1, r2, r4
- ldrb r0, [r1]
- cmp r0, 0xFF
- bne _080837EC
- strb r3, [r1]
- b _080837F6
- .align 2, 0
-_080837E8: .4byte gUnknown_3000FC8
-_080837EC:
- adds r0, r2, 0x1
- lsls r0, 24
- lsrs r2, r0, 24
- cmp r2, 0x1F
- bls _080837DA
-_080837F6:
- pop {r4}
- pop {r0}
- bx r0
- thumb_func_end FieldEffectActiveListAdd
-
- thumb_func_start FieldEffectActiveListRemove
-FieldEffectActiveListRemove: @ 80837FC
- push {r4,r5,lr}
- lsls r0, 24
- lsrs r3, r0, 24
- movs r2, 0
- ldr r4, _08083818 @ =gUnknown_3000FC8
- movs r5, 0xFF
-_08083808:
- adds r1, r2, r4
- ldrb r0, [r1]
- cmp r0, r3
- bne _0808381C
- orrs r0, r5
- strb r0, [r1]
- b _08083826
- .align 2, 0
-_08083818: .4byte gUnknown_3000FC8
-_0808381C:
- adds r0, r2, 0x1
- lsls r0, 24
- lsrs r2, r0, 24
- cmp r2, 0x1F
- bls _08083808
-_08083826:
- pop {r4,r5}
- pop {r0}
- bx r0
- thumb_func_end FieldEffectActiveListRemove
-
- thumb_func_start FieldEffectActiveListContains
-FieldEffectActiveListContains: @ 808382C
- push {lr}
- lsls r0, 24
- lsrs r2, r0, 24
- movs r1, 0
- ldr r3, _08083844 @ =gUnknown_3000FC8
-_08083836:
- adds r0, r1, r3
- ldrb r0, [r0]
- cmp r0, r2
- bne _08083848
- movs r0, 0x1
- b _08083854
- .align 2, 0
-_08083844: .4byte gUnknown_3000FC8
-_08083848:
- adds r0, r1, 0x1
- lsls r0, 24
- lsrs r1, r0, 24
- cmp r1, 0x1F
- bls _08083836
- movs r0, 0
-_08083854:
- pop {r1}
- bx r1
- thumb_func_end FieldEffectActiveListContains
-
thumb_func_start CreateTrainerSprite
CreateTrainerSprite: @ 8083858
push {r4-r7,lr}
diff --git a/data/field_effect.s b/data/field_effect.s
index 7e797c560..0c76e9d0d 100644
--- a/data/field_effect.s
+++ b/data/field_effect.s
@@ -49,12 +49,12 @@ gUnknown_83CBDB0::
.incbin "graphics/field_effects/unk_83CBDB0.4bpp"
.align 2
-gUnknown_83CBE30:: @ 83CBE30 dataptr
+sFldEffScrcmdTable:: @ 83CBE30 dataptr
.4byte FieldEffectCmd_loadtiles
.4byte FieldEffectCmd_loadfadedpal
.4byte FieldEffectCmd_loadpal
.4byte FieldEffectCmd_callnative
- .4byte sub_80834DC
+ .4byte FieldEffectCmd_end
.4byte FieldEffectCmd_loadgfx_callnative
.4byte FieldEffectCmd_loadtiles_callnative
.4byte FieldEffectCmd_loadfadedpal_callnative
diff --git a/data/field_effect_scripts.s b/data/field_effect_scripts.s
index cac76bea9..fd8681fbf 100644
--- a/data/field_effect_scripts.s
+++ b/data/field_effect_scripts.s
@@ -1,7 +1,7 @@
.include "asm/macros/field_effect_script.inc"
.section script_data, "aw", %progbits
.align 2
-gUnknown_81D96AC:: @ 81D96AC
+gFieldEffectScriptPointers:: @ 81D96AC
.4byte gFldEffScript_ExclamationMarkIcon
.4byte gFldEffScript_UseCutOnGrass
.4byte gFldEffScript_UseCutOnTree
diff --git a/include/field_effect_scripts.h b/include/field_effect_scripts.h
new file mode 100644
index 000000000..fd3609d93
--- /dev/null
+++ b/include/field_effect_scripts.h
@@ -0,0 +1,6 @@
+#ifndef GUARD_FIELD_EFFECT_SCRIPTS_H
+#define GUARD_FIELD_EFFECT_SCRIPTS_H
+
+extern const u8 *const gFieldEffectScriptPointers[];
+
+#endif //GUARD_FIELD_EFFECT_SCRIPTS_H
diff --git a/include/field_weather.h b/include/field_weather.h
index de2543edb..3cb17f9e2 100644
--- a/include/field_weather.h
+++ b/include/field_weather.h
@@ -18,5 +18,6 @@ void SetWeatherScreenFadeOut(void);
void sub_807B070(void);
u8 GetCurrentWeather(void);
void FieldWeather_StartFadingOutCreditsMap(u8, u8, u32);
+void sub_807AA8C(u8 palIdx);
#endif // GUARD_WEATHER_H
diff --git a/include/quest_log.h b/include/quest_log.h
index 25d0d5871..752cb3921 100644
--- a/include/quest_log.h
+++ b/include/quest_log.h
@@ -29,7 +29,7 @@ void sub_811539C(void);
void sub_8115748(u16);
u8 sub_8112CAC(void);
bool8 QuestLog_SchedulePlaybackCB(void (*func)(void));
-void sub_8111F38(u16, u16);
+void sub_8111F38(u16 offset, u16 idx);
void sub_8111134(void);
void DestroyHelpMessageWindow(u8 a0);
u8 CreateHelpMessageWindow(void);
diff --git a/ld_script.txt b/ld_script.txt
index aed18fed9..4e4953097 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -123,6 +123,7 @@ SECTIONS {
asm/cable_club.o(.text);
src/trainer_see.o(.text);
src/wild_encounter.o(.text);
+ src/field_effect.o(.text);
asm/field_effect.o(.text);
src/scanline_effect.o(.text);
src/option_menu.o(.text);
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:
diff --git a/sym_bss.txt b/sym_bss.txt
index ec3d7d947..b877b6532 100644
--- a/sym_bss.txt
+++ b/sym_bss.txt
@@ -60,10 +60,8 @@ gUnknown_3000EA0: @ 3000EA0
.include "src/tileset_anims.o"
.align 2
.include "src/sound.o"
-
.align 2
-gUnknown_3000FC8: @ 3000FC8
- .space 0x20
+ .include "src/field_effect.o"
gUnknown_3000FE8: @ 3000FE8
.space 0x184