diff --git a/assets/xml/objects/gameplay_keep.xml b/assets/xml/objects/gameplay_keep.xml
index 22626d302f..41b144120f 100644
--- a/assets/xml/objects/gameplay_keep.xml
+++ b/assets/xml/objects/gameplay_keep.xml
@@ -1053,15 +1053,15 @@
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
diff --git a/include/functions.h b/include/functions.h
index 522fac1546..d15fbbbfa2 100644
--- a/include/functions.h
+++ b/include/functions.h
@@ -572,7 +572,7 @@ void EffectSsHahen_SpawnBurst(GlobalContext* globalCtx, Vec3f* pos, f32 burstSca
// void EffectSsStick_Spawn(UNK_TYPE4 uParm1, UNK_PTR puParm2, UNK_TYPE2 uParm3);
// void EffectSsSibuki_Spawn(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE2 param_5, UNK_TYPE2 param_6, UNK_TYPE2 param_7);
void EffectSsSibuki_SpawnBurst(GlobalContext* globalCtx, Vec3f* pos);
-void EffectSsStone1_Spawn(GlobalContext* globalCtx, Vec3f* arg1, s32 arg2);
+void EffectSsStone1_Spawn(GlobalContext* globalCtx, Vec3f* pos, s32 reg0);
// void EffectSsHitMark_Spawn(UNK_TYPE4 uParm1, UNK_TYPE4 uParm2, UNK_TYPE2 uParm3, Vec3f* pzParm4);
void EffectSsHitMark_SpawnFixedScale(GlobalContext* globalCtx, s32 type, Vec3f* pos);
void EffectSsHitMark_SpawnCustomScale(GlobalContext* globalCtx, s32 type, s16 scale, Vec3f* pos);
diff --git a/spec b/spec
index 3a3d2f8ff8..8328eaa435 100644
--- a/spec
+++ b/spec
@@ -1910,8 +1910,7 @@ beginseg
name "ovl_Effect_Ss_Stone1"
compress
include "build/src/overlays/effects/ovl_Effect_Ss_Stone1/z_eff_ss_stone1.o"
- include "build/data/ovl_Effect_Ss_Stone1/ovl_Effect_Ss_Stone1.data.o"
- include "build/data/ovl_Effect_Ss_Stone1/ovl_Effect_Ss_Stone1.reloc.o"
+ include "build/src/overlays/effects/ovl_Effect_Ss_Stone1/ovl_Effect_Ss_Stone1_reloc.o"
endseg
beginseg
diff --git a/src/code/z_effect_soft_sprite_old_init.c b/src/code/z_effect_soft_sprite_old_init.c
index 3f868ecc36..0300144e10 100644
--- a/src/code/z_effect_soft_sprite_old_init.c
+++ b/src/code/z_effect_soft_sprite_old_init.c
@@ -625,11 +625,11 @@ void EffectSsSibuki_SpawnBurst(GlobalContext* globalCtx, Vec3f* pos) {
// EffectSsStone1 Spawn Functions
-void EffectSsStone1_Spawn(GlobalContext* globalCtx, Vec3f* pos, s32 arg2) {
+void EffectSsStone1_Spawn(GlobalContext* globalCtx, Vec3f* pos, s32 reg0) {
EffectSsStone1InitParams initParams;
initParams.pos = *pos;
- initParams.unk_C = arg2;
+ initParams.reg0 = reg0;
EffectSs_Spawn(globalCtx, EFFECT_SS_STONE1, 128, &initParams);
}
diff --git a/src/overlays/effects/ovl_Effect_Ss_Stone1/z_eff_ss_stone1.c b/src/overlays/effects/ovl_Effect_Ss_Stone1/z_eff_ss_stone1.c
index 714ce0b8ca..06cfa5b18d 100644
--- a/src/overlays/effects/ovl_Effect_Ss_Stone1/z_eff_ss_stone1.c
+++ b/src/overlays/effects/ovl_Effect_Ss_Stone1/z_eff_ss_stone1.c
@@ -5,23 +5,78 @@
*/
#include "z_eff_ss_stone1.h"
+#include "objects/gameplay_keep/gameplay_keep.h"
#define PARAMS ((EffectSsStone1InitParams*)initParamsx)
-s32 EffectSsStone1_Init(GlobalContext* globalCtx, u32 index, EffectSs* this, void* initParamsx);
+#define rReg0 regs[0]
+
+u32 EffectSsStone1_Init(GlobalContext* globalCtx, u32 index, EffectSs* this, void* initParamsx);
void EffectSsStone1_Update(GlobalContext* globalCtx, u32 index, EffectSs* this);
void EffectSsStone1_Draw(GlobalContext* globalCtx, u32 index, EffectSs* this);
-#if 0
const EffectSsInit Effect_Ss_Stone1_InitVars = {
EFFECT_SS_STONE1,
EffectSsStone1_Init,
};
-#endif
+typedef struct {
+ /* 0x00 */ TexturePtr texture;
+ /* 0x04 */ Color_RGBA8 primColor;
+ /* 0x08 */ Color_RGBA8 envColor;
+} EffStoneDrawInfo;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Effect_Ss_Stone1/EffectSsStone1_Init.s")
+static EffStoneDrawInfo sDrawInfo[] = {
+ { gEffStone8Tex, { 200, 0, 0, 255 }, { 0, 0, 0, 255 } },
+ { gEffStone7Tex, { 255, 100, 0, 255 }, { 100, 0, 0, 255 } },
+ { gEffStone6Tex, { 255, 200, 0, 255 }, { 200, 0, 0, 255 } },
+ { gEffStone5Tex, { 255, 255, 0, 255 }, { 255, 0, 0, 255 } },
+ { gEffStone4Tex, { 255, 255, 150, 255 }, { 255, 150, 0, 255 } },
+ { gEffStone3Tex, { 255, 255, 255, 255 }, { 255, 255, 0, 255 } },
+ { gEffStone2Tex, { 255, 255, 255, 255 }, { 0, 255, 0, 255 } },
+ { gEffStone1Tex, { 255, 255, 255, 255 }, { 0, 255, 255, 255 } },
+};
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Effect_Ss_Stone1/EffectSsStone1_Draw.s")
+u32 EffectSsStone1_Init(GlobalContext* globalCtx, u32 index, EffectSs* this, void* initParamsx) {
+ EffectSsStone1InitParams* initParams = PARAMS;
+ Vec3f pos = initParams->pos;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Effect_Ss_Stone1/EffectSsStone1_Update.s")
+ this->pos = pos;
+ this->vec = pos;
+ this->life = 8;
+ this->rReg0 = initParams->reg0;
+ this->draw = EffectSsStone1_Draw;
+ this->update = EffectSsStone1_Update;
+
+ return 1;
+}
+
+void EffectSsStone1_Draw(GlobalContext* globalCtx, u32 index, EffectSs* this) {
+ GraphicsContext* gfxCtx = globalCtx->state.gfxCtx;
+ EffStoneDrawInfo* drawParams = &sDrawInfo[this->life];
+ Vec3f mfVec;
+ f32 mfW;
+ f32 scale;
+
+ OPEN_DISPS(gfxCtx);
+
+ SkinMatrix_Vec3fMtxFMultXYZW(&globalCtx->viewProjectionMtxF, &this->pos, &mfVec, &mfW);
+ scale = (mfW < 1500.0f) ? 3.0f : (mfW / 1500.0f) * 3.0f;
+ Matrix_InsertTranslation(this->pos.x, this->pos.y, this->pos.z, MTXMODE_NEW);
+ Matrix_Scale(scale, scale, scale, MTXMODE_APPLY);
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ func_8012C9BC(gfxCtx);
+ gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(drawParams->texture));
+ gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, drawParams->primColor.r, drawParams->primColor.g, drawParams->primColor.b,
+ 255);
+ gDPSetEnvColor(POLY_XLU_DISP++, drawParams->envColor.r, drawParams->envColor.g, drawParams->envColor.b, 255);
+ gSPDisplayList(POLY_XLU_DISP++, gEffStoneDL);
+
+ CLOSE_DISPS(gfxCtx);
+}
+
+void EffectSsStone1_Update(GlobalContext* globalCtx, u32 index, EffectSs* this) {
+ if ((this->life == 6) && (this->rReg0 != 0)) {
+ iREG(50) = 0;
+ }
+}
diff --git a/src/overlays/effects/ovl_Effect_Ss_Stone1/z_eff_ss_stone1.h b/src/overlays/effects/ovl_Effect_Ss_Stone1/z_eff_ss_stone1.h
index 566811a8a5..365585a8e7 100644
--- a/src/overlays/effects/ovl_Effect_Ss_Stone1/z_eff_ss_stone1.h
+++ b/src/overlays/effects/ovl_Effect_Ss_Stone1/z_eff_ss_stone1.h
@@ -5,7 +5,7 @@
typedef struct {
/* 0x00 */ Vec3f pos;
- /* 0x00 */ s32 unk_C;
+ /* 0x0C */ s32 reg0;
} EffectSsStone1InitParams; // size = 0x10
extern const EffectSsInit Effect_Ss_Stone1_InitVars;
diff --git a/undefined_syms.txt b/undefined_syms.txt
index 296d6273e8..bf08aa3564 100644
--- a/undefined_syms.txt
+++ b/undefined_syms.txt
@@ -430,7 +430,6 @@ D_040367B0 = 0x040367B0;
D_040377B0 = 0x040377B0;
D_04037850 = 0x04037850;
D_0403A0F0 = 0x0403A0F0;
-D_0403C190 = 0x0403C190;
D_0403F230 = 0x0403F230;
D_04044300 = 0x04044300;
D_0404F250 = 0x0404F250;