diff --git a/assets/xml/objects/gameplay_keep.xml b/assets/xml/objects/gameplay_keep.xml
index 1e42a845f1..7e30cfdb19 100644
--- a/assets/xml/objects/gameplay_keep.xml
+++ b/assets/xml/objects/gameplay_keep.xml
@@ -1004,15 +1004,15 @@
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
diff --git a/spec b/spec
index 53b6cbf8f3..f4fd4589f2 100644
--- a/spec
+++ b/spec
@@ -1823,8 +1823,7 @@ beginseg
name "ovl_Effect_Ss_G_Fire"
compress
include "build/src/overlays/effects/ovl_Effect_Ss_G_Fire/z_eff_ss_g_fire.o"
- include "build/data/ovl_Effect_Ss_G_Fire/ovl_Effect_Ss_G_Fire.data.o"
- include "build/data/ovl_Effect_Ss_G_Fire/ovl_Effect_Ss_G_Fire.reloc.o"
+ include "build/src/overlays/effects/ovl_Effect_Ss_G_Fire/ovl_Effect_Ss_G_Fire_reloc.o"
endseg
beginseg
diff --git a/src/overlays/effects/ovl_Effect_Ss_G_Fire/z_eff_ss_g_fire.c b/src/overlays/effects/ovl_Effect_Ss_G_Fire/z_eff_ss_g_fire.c
index 65b8a76ac2..7bc2d6966e 100644
--- a/src/overlays/effects/ovl_Effect_Ss_G_Fire/z_eff_ss_g_fire.c
+++ b/src/overlays/effects/ovl_Effect_Ss_G_Fire/z_eff_ss_g_fire.c
@@ -1,27 +1,59 @@
/*
* File: z_eff_ss_g_fire.c
* Overlay: ovl_Effect_Ss_G_Fire
- * Description:
+ * Description: Flame Footprints
*/
#include "z_eff_ss_g_fire.h"
+#include "objects/gameplay_keep/gameplay_keep.h"
#define PARAMS ((EffectSsGFireInitParams*)initParamsx)
-s32 EffectSsGFire_Init(PlayState* play, u32 index, EffectSs* this, void* initParamsx);
+u32 EffectSsGFire_Init(PlayState* play, u32 index, EffectSs* this, void* initParamsx);
void EffectSsGFire_Update(PlayState* play, u32 index, EffectSs* this);
void EffectSsGFire_Draw(PlayState* play, u32 index, EffectSs* this);
-#if 0
const EffectSsInit Effect_Ss_G_Fire_InitVars = {
EFFECT_SS_G_FIRE,
EffectSsGFire_Init,
};
-#endif
+u32 EffectSsGFire_Init(PlayState* play, u32 index, EffectSs* this, void* initParamsx) {
+ EffectSsGFireInitParams* initParams = PARAMS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Effect_Ss_G_Fire/EffectSsGFire_Init.s")
+ Math_Vec3f_Copy(&this->velocity, &gZeroVec3f);
+ Math_Vec3f_Copy(&this->accel, &gZeroVec3f);
+ Math_Vec3f_Copy(&this->pos, &initParams->pos);
+ this->draw = EffectSsGFire_Draw;
+ this->update = EffectSsGFire_Update;
+ this->gfx = gEffFireFootprintDL;
+ this->life = 8;
+ this->flags = 0;
+ this->rgScale = 200;
+ this->rgTexIndex = 0;
+ this->rgTexIndexStep = 50;
+ this->rgPrimColorR = 255;
+ this->rgPrimColorG = 220;
+ this->rgPrimColorB = 80;
+ this->rgPrimColorA = 255;
+ this->rgEnvColorR = 130;
+ this->rgEnvColorG = 30;
+ this->rgEnvColorB = 0;
+ this->rgEnvColorA = 0;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Effect_Ss_G_Fire/EffectSsGFire_Draw.s")
+ return 1;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Effect_Ss_G_Fire/EffectSsGFire_Update.s")
+void EffectSsGFire_Draw(PlayState* play, u32 index, EffectSs* this) {
+ TexturePtr fireFootprintTextures[] = {
+ gEffFireFootprint1Tex, gEffFireFootprint2Tex, gEffFireFootprint3Tex, gEffFireFootprint4Tex,
+ gEffFireFootprint5Tex, gEffFireFootprint6Tex, gEffFireFootprint7Tex, gEffFireFootprint8Tex,
+ };
+ s16 texIndex = (this->rgTexIndex / 100) % 7;
+
+ EffectSs_DrawGEffect(play, this, fireFootprintTextures[texIndex]);
+}
+
+void EffectSsGFire_Update(PlayState* play, u32 index, EffectSs* this) {
+ this->rgTexIndex += this->rgTexIndexStep;
+}
diff --git a/undefined_syms.txt b/undefined_syms.txt
index a033b9f367..bde45d6f32 100644
--- a/undefined_syms.txt
+++ b/undefined_syms.txt
@@ -423,7 +423,6 @@ D_0402F028 = 0x0402F028;
D_0402F0EC = 0x0402F0EC;
D_04030100 = 0x04030100;
D_040301B0 = 0x040301B0;
-D_04032270 = 0x04032270;
D_040367B0 = 0x040367B0;
D_040377B0 = 0x040377B0;
D_04037850 = 0x04037850;