summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDerek Hensley <hensley.derek58@gmail.com>2022-10-02 10:10:31 -0700
committerGitHub <noreply@github.com>2022-10-02 18:10:31 +0100
commitfdfe2842d9daf023c8ccdc8621489a44de3c1786 (patch)
tree23da4ff034f8d8a90311dcef1546ed8cd2ee3e43 /src
parent3d5d39e74d8eca94be52657bacf017de4e9962c2 (diff)
Eff Srchball OK (#1092)
* OK * Some docs and cleanup * flags -> params * Remove todo * Small cleanup * Description and dls * Format * bug tag * Update bug comment * Update src/overlays/effects/ovl_Effect_Ss_Solder_Srch_Ball/z_eff_ss_solder_srch_ball.c Co-authored-by: EllipticEllipsis <elliptic.ellipsis@gmail.com> * Format Co-authored-by: EllipticEllipsis <elliptic.ellipsis@gmail.com>
Diffstat (limited to 'src')
-rw-r--r--src/code/z_effect_soft_sprite_old_init.c10
-rw-r--r--src/overlays/actors/ovl_Demo_Kankyo/z_demo_kankyo.c4
-rw-r--r--src/overlays/actors/ovl_En_Encount2/z_en_encount2.c4
-rw-r--r--src/overlays/actors/ovl_En_Hanabi/z_en_hanabi.c4
-rw-r--r--src/overlays/actors/ovl_En_Look_Nuts/z_en_look_nuts.c8
-rw-r--r--src/overlays/actors/ovl_En_Suttari/z_en_suttari.c19
-rw-r--r--src/overlays/actors/ovl_En_Suttari/z_en_suttari.h2
-rw-r--r--src/overlays/effects/ovl_Effect_Ss_Solder_Srch_Ball/z_eff_ss_solder_srch_ball.c80
-rw-r--r--src/overlays/effects/ovl_Effect_Ss_Solder_Srch_Ball/z_eff_ss_solder_srch_ball.h9
9 files changed, 107 insertions, 33 deletions
diff --git a/src/code/z_effect_soft_sprite_old_init.c b/src/code/z_effect_soft_sprite_old_init.c
index 5fc51b0c3..bbdd528a4 100644
--- a/src/code/z_effect_soft_sprite_old_init.c
+++ b/src/code/z_effect_soft_sprite_old_init.c
@@ -702,16 +702,16 @@ void EffectSsKFire_Spawn(PlayState* play, Vec3f* pos, Vec3f* velocity, Vec3f* ac
// EffectSsSolderSrchBall Spawn Functions
-void EffectSsSolderSrchBall_Spawn(PlayState* play, Vec3f* pos, Vec3f* velocity, Vec3f* accel, s16 unused,
- s16* linkDetected, s16 drawFlag) {
+void EffectSsSolderSrchBall_Spawn(PlayState* play, Vec3f* pos, Vec3f* velocity, Vec3f* accel, s16 scale,
+ s16* playerDetected, s16 flags) {
EffectSsSolderSrchBallInitParams initParams;
Math_Vec3f_Copy(&initParams.pos, pos);
Math_Vec3f_Copy(&initParams.velocity, velocity);
Math_Vec3f_Copy(&initParams.accel, accel);
- initParams.unused = unused;
- initParams.linkDetected = linkDetected;
- initParams.drawFlag = drawFlag;
+ initParams.scale = scale;
+ initParams.playerDetected = playerDetected;
+ initParams.flags = flags;
EffectSs_Spawn(play, EFFECT_SS_SOLDER_SRCH_BALL, 128, &initParams);
}
diff --git a/src/overlays/actors/ovl_Demo_Kankyo/z_demo_kankyo.c b/src/overlays/actors/ovl_Demo_Kankyo/z_demo_kankyo.c
index 12da39288..10b72634a 100644
--- a/src/overlays/actors/ovl_Demo_Kankyo/z_demo_kankyo.c
+++ b/src/overlays/actors/ovl_Demo_Kankyo/z_demo_kankyo.c
@@ -508,7 +508,7 @@ void DemoKakyo_DrawLostWoodsSparkle(Actor* thisx, PlayState* play2) {
POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 20);
gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(gSun1Tex));
- gSPDisplayList(POLY_XLU_DISP++, gameplay_keep_DL_07AB10);
+ gSPDisplayList(POLY_XLU_DISP++, gSunSparkleMaterialDL);
for (i = 0; i < play->envCtx.unk_F2[3]; i++) {
worldPos.x = this->effects[i].posBase.x + this->effects[i].posOffset.x;
@@ -575,7 +575,7 @@ void DemoKakyo_DrawLostWoodsSparkle(Actor* thisx, PlayState* play2) {
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx),
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_XLU_DISP++, gameplay_keep_DL_07AB58);
+ gSPDisplayList(POLY_XLU_DISP++, gSunSparkleModelDL);
}
}
diff --git a/src/overlays/actors/ovl_En_Encount2/z_en_encount2.c b/src/overlays/actors/ovl_En_Encount2/z_en_encount2.c
index d771f3511..b7c698376 100644
--- a/src/overlays/actors/ovl_En_Encount2/z_en_encount2.c
+++ b/src/overlays/actors/ovl_En_Encount2/z_en_encount2.c
@@ -279,14 +279,14 @@ void EnEncount2_DrawEffects(EnEncount2* this, PlayState* play) {
Matrix_Scale(sPtr->scale, sPtr->scale, sPtr->scale, MTXMODE_APPLY);
POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 20);
gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(gSun1Tex));
- gSPDisplayList(POLY_XLU_DISP++, gameplay_keep_DL_07AB10);
+ gSPDisplayList(POLY_XLU_DISP++, gSunSparkleMaterialDL);
gDPPipeSync(POLY_XLU_DISP++);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, 255);
gDPSetEnvColor(POLY_XLU_DISP++, 250, 180, 255, sPtr->alpha);
Matrix_Mult(&play->billboardMtxF, MTXMODE_APPLY);
Matrix_RotateZF(DEGF_TO_RADF(play->state.frames * 20.0f), MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
- gSPDisplayList(POLY_XLU_DISP++, gameplay_keep_DL_07AB58);
+ gSPDisplayList(POLY_XLU_DISP++, gSunSparkleModelDL);
}
}
CLOSE_DISPS(gfxCtx);
diff --git a/src/overlays/actors/ovl_En_Hanabi/z_en_hanabi.c b/src/overlays/actors/ovl_En_Hanabi/z_en_hanabi.c
index f9085e825..0f016f300 100644
--- a/src/overlays/actors/ovl_En_Hanabi/z_en_hanabi.c
+++ b/src/overlays/actors/ovl_En_Hanabi/z_en_hanabi.c
@@ -146,7 +146,7 @@ void func_80B22FA8(EnHanabiStruct* arg0, PlayState* play2) {
POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 20);
gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(gSun1Tex));
- gSPDisplayList(POLY_XLU_DISP++, gameplay_keep_DL_07AB10);
+ gSPDisplayList(POLY_XLU_DISP++, gSunSparkleMaterialDL);
sp53 = 0xFF;
if (sp53) {}
@@ -181,7 +181,7 @@ void func_80B22FA8(EnHanabiStruct* arg0, PlayState* play2) {
D_80B23C2C[arg0->unk_02 + 2], 255);
}
- gSPDisplayList(POLY_XLU_DISP++, gameplay_keep_DL_07AB58);
+ gSPDisplayList(POLY_XLU_DISP++, gSunSparkleModelDL);
}
}
diff --git a/src/overlays/actors/ovl_En_Look_Nuts/z_en_look_nuts.c b/src/overlays/actors/ovl_En_Look_Nuts/z_en_look_nuts.c
index de053c46a..6fd949feb 100644
--- a/src/overlays/actors/ovl_En_Look_Nuts/z_en_look_nuts.c
+++ b/src/overlays/actors/ovl_En_Look_Nuts/z_en_look_nuts.c
@@ -5,6 +5,7 @@
*/
#include "z_en_look_nuts.h"
+#include "overlays/effects/ovl_Effect_Ss_Solder_Srch_Ball/z_eff_ss_solder_srch_ball.h"
#define FLAGS (ACTOR_FLAG_80000000)
@@ -340,13 +341,14 @@ void EnLookNuts_Update(Actor* thisx, PlayState* play) {
Matrix_MultVec3f(&effectVelOffset, &effectVel);
Matrix_Pop();
if (!this->isPlayerDetected) {
- s16 drawFlag = 1;
+ s16 effectFlags = SOLDERSRCHBALL_INVISIBLE;
+
if (gSaveContext.save.isNight) {
- drawFlag = 0;
+ effectFlags = 0;
}
if (Player_GetMask(play) != PLAYER_MASK_STONE) {
EffectSsSolderSrchBall_Spawn(play, &effectPos, &effectVel, &gZeroVec3f, 50, &this->isPlayerDetected,
- drawFlag);
+ effectFlags);
}
}
diff --git a/src/overlays/actors/ovl_En_Suttari/z_en_suttari.c b/src/overlays/actors/ovl_En_Suttari/z_en_suttari.c
index bbce2ee6c..4f3882aa7 100644
--- a/src/overlays/actors/ovl_En_Suttari/z_en_suttari.c
+++ b/src/overlays/actors/ovl_En_Suttari/z_en_suttari.c
@@ -7,6 +7,7 @@
#include "z_en_suttari.h"
#include "overlays/actors/ovl_En_Elf/z_en_elf.h"
#include "overlays/actors/ovl_En_Door/z_en_door.h"
+#include "overlays/effects/ovl_Effect_Ss_Solder_Srch_Ball/z_eff_ss_solder_srch_ball.h"
#include "objects/object_boj/object_boj.h"
#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10)
@@ -444,12 +445,13 @@ void func_80BAAFDC(EnSuttari* this, PlayState* play) {
effectVelOffset.z = 20.0f;
Matrix_MultVec3f(&effectVelOffset, &effectVel);
Matrix_Pop();
- if (this->unk3F0 == 0) {
- EffectSsSolderSrchBall_Spawn(play, &effectPos, &effectVel, &gZeroVec3f, 50, &this->unk3F0, 1);
+ if (!this->playerDetected) {
+ EffectSsSolderSrchBall_Spawn(play, &effectPos, &effectVel, &gZeroVec3f, 50, &this->playerDetected,
+ SOLDERSRCHBALL_INVISIBLE);
}
- if (this->unk3F0 == 1) {
+ if (this->playerDetected == true) {
play_sound(NA_SE_SY_FOUND);
- this->unk3F0 = 0;
+ this->playerDetected = false;
this->actor.speedXZ = 0.0f;
if (this->unk1F4[0] != 0) {
this->unk1F4[0]--;
@@ -476,12 +478,13 @@ void func_80BAB1A0(EnSuttari* this, PlayState* play) {
effectVelOffset.z = 20.0f;
Matrix_MultVec3f(&effectVelOffset, &effectVel);
Matrix_Pop();
- if (this->unk3F0 == 0) {
- EffectSsSolderSrchBall_Spawn(play, &effectPos, &effectVel, &gZeroVec3f, 50, &this->unk3F0, 1);
+ if (!this->playerDetected) {
+ EffectSsSolderSrchBall_Spawn(play, &effectPos, &effectVel, &gZeroVec3f, 50, &this->playerDetected,
+ SOLDERSRCHBALL_INVISIBLE);
}
- if (this->unk3F0 == 1) {
+ if (this->playerDetected == true) {
play_sound(NA_SE_SY_FOUND);
- this->unk3F0 = 0;
+ this->playerDetected = false;
this->actor.speedXZ = 0.0f;
if (this->unk1F4[0] != 0) {
this->unk1F4[0]--;
diff --git a/src/overlays/actors/ovl_En_Suttari/z_en_suttari.h b/src/overlays/actors/ovl_En_Suttari/z_en_suttari.h
index 35a9b6e2e..427f74988 100644
--- a/src/overlays/actors/ovl_En_Suttari/z_en_suttari.h
+++ b/src/overlays/actors/ovl_En_Suttari/z_en_suttari.h
@@ -34,7 +34,7 @@ typedef struct EnSuttari {
/* 0x2FA */ s16 unk2FA[16];
/* 0x31A */ s16 unk31A[16];
/* 0x33A */ UNK_TYPE1 unk_33A[0xB6];
- /* 0x3F0 */ s16 unk3F0;
+ /* 0x3F0 */ s16 playerDetected;
/* 0x3F2 */ s16 unk3F2;
/* 0x3F4 */ s16 unk3F4;
/* 0x3F6 */ s16 unk3F6;
diff --git a/src/overlays/effects/ovl_Effect_Ss_Solder_Srch_Ball/z_eff_ss_solder_srch_ball.c b/src/overlays/effects/ovl_Effect_Ss_Solder_Srch_Ball/z_eff_ss_solder_srch_ball.c
index 04afcba3f..01224dd32 100644
--- a/src/overlays/effects/ovl_Effect_Ss_Solder_Srch_Ball/z_eff_ss_solder_srch_ball.c
+++ b/src/overlays/effects/ovl_Effect_Ss_Solder_Srch_Ball/z_eff_ss_solder_srch_ball.c
@@ -1,27 +1,93 @@
/*
* File: z_eff_ss_solder_srch_ball.c
* Overlay: ovl_Effect_Ss_Solder_Srch_Ball
- * Description:
+ * Description: Vision sphere
*/
#include "z_eff_ss_solder_srch_ball.h"
+#include "objects/gameplay_keep/gameplay_keep.h"
+
+#define rFlags regs[0]
#define PARAMS ((EffectSsSolderSrchBallInitParams*)initParamsx)
-s32 EffectSsSolderSrchBall_Init(PlayState* play, u32 index, EffectSs* this, void* initParamsx);
+u32 EffectSsSolderSrchBall_Init(PlayState* play, u32 index, EffectSs* this, void* initParamsx);
void EffectSsSolderSrchBall_Update(PlayState* play, u32 index, EffectSs* this);
void EffectSsSolderSrchBall_Draw(PlayState* play, u32 index, EffectSs* this);
-#if 0
const EffectSsInit Effect_Ss_Solder_Srch_Ball_InitVars = {
EFFECT_SS_SOLDER_SRCH_BALL,
EffectSsSolderSrchBall_Init,
};
-#endif
+u32 EffectSsSolderSrchBall_Init(PlayState* play, u32 index, EffectSs* this, void* initParamsx) {
+ EffectSsSolderSrchBallInitParams* initParams = PARAMS;
+
+ this->pos = initParams->pos;
+ this->velocity = initParams->velocity;
+ this->accel = initParams->accel;
+ this->update = EffectSsSolderSrchBall_Update;
+ if (!(initParams->flags & SOLDERSRCHBALL_INVISIBLE)) {
+ this->draw = EffectSsSolderSrchBall_Draw;
+ }
+ this->life = 10;
+ this->rgScale = initParams->scale;
+ this->rFlags = initParams->flags;
+
+ //! @bug actor field used to store an s16*
+ // This bug is purely cosmetic. Nothing external will ever read this as an Actor, so there are no unintended
+ // side-effects.
+ this->actor = (Actor*)initParams->playerDetected;
+ return 1;
+}
+
+void EffectSsSolderSrchBall_Draw(PlayState* play, u32 index, EffectSs* this) {
+ s32 pad;
+ GraphicsContext* gfxCtx = play->state.gfxCtx;
+ f32 scale = this->rgScale / 100.0f;
+
+ func_8012C28C(gfxCtx);
+ func_8012C2DC(play->state.gfxCtx);
+
+ OPEN_DISPS(gfxCtx);
+
+ Matrix_Translate(this->pos.x, this->pos.y, this->pos.z, MTXMODE_NEW);
+ Matrix_Scale(scale, scale, scale, MTXMODE_APPLY);
+ POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 20);
+ gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(gSun1Tex));
+ gSPDisplayList(POLY_XLU_DISP++, gSunSparkleMaterialDL);
+ gDPPipeSync(POLY_XLU_DISP++);
+ gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, 255);
+ gDPSetEnvColor(POLY_XLU_DISP++, 250, 180, 255, 255);
+ Matrix_Mult(&play->billboardMtxF, MTXMODE_APPLY);
+ Matrix_RotateZF(DEGF_TO_RADF(20.0f * play->state.frames), MTXMODE_APPLY);
+ gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(POLY_XLU_DISP++, gSunSparkleModelDL);
+
+ CLOSE_DISPS(gfxCtx);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Effect_Ss_Solder_Srch_Ball/EffectSsSolderSrchBall_Init.s")
+void EffectSsSolderSrchBall_Update(PlayState* play, u32 index, EffectSs* this) {
+ s32 pad;
+ f32 diffX;
+ f32 diffY;
+ f32 diffZ;
+ s16* playerDetected = (s16*)this->actor;
+ Player* player = GET_PLAYER(play);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Effect_Ss_Solder_Srch_Ball/EffectSsSolderSrchBall_Draw.s")
+ diffX = player->actor.world.pos.x - this->pos.x;
+ diffY = player->actor.world.pos.y - this->pos.y;
+ diffZ = player->actor.world.pos.z - this->pos.z;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Effect_Ss_Solder_Srch_Ball/EffectSsSolderSrchBall_Update.s")
+ if (this->rFlags >= SOLDERSRCHBALL_SMALL_DETECT_RADIUS) {
+ if ((sqrtf(SQ(diffX) + SQ(diffZ)) < 10.0f) && (sqrtf(SQ(diffY)) < 10.0f)) {
+ *playerDetected = true;
+ }
+ } else if (!BgCheck_SphVsFirstWall(&play->colCtx, &this->pos, 30.0f)) {
+ if ((sqrtf(SQ(diffX) + SQ(diffZ)) < 40.0f) && (sqrtf(SQ(diffY)) < 80.0f)) {
+ *playerDetected = true;
+ }
+ } else if (this->life > 1) {
+ this->life = 1;
+ }
+}
diff --git a/src/overlays/effects/ovl_Effect_Ss_Solder_Srch_Ball/z_eff_ss_solder_srch_ball.h b/src/overlays/effects/ovl_Effect_Ss_Solder_Srch_Ball/z_eff_ss_solder_srch_ball.h
index 24b9f47fc..fb4fb4159 100644
--- a/src/overlays/effects/ovl_Effect_Ss_Solder_Srch_Ball/z_eff_ss_solder_srch_ball.h
+++ b/src/overlays/effects/ovl_Effect_Ss_Solder_Srch_Ball/z_eff_ss_solder_srch_ball.h
@@ -3,13 +3,16 @@
#include "global.h"
+#define SOLDERSRCHBALL_INVISIBLE (1 << 0)
+#define SOLDERSRCHBALL_SMALL_DETECT_RADIUS (1 << 1)
+
typedef struct {
/* 0x00 */ Vec3f pos;
/* 0x0C */ Vec3f velocity;
/* 0x18 */ Vec3f accel;
- /* 0x24 */ s16 unused;
- /* 0x28 */ s16* linkDetected;
- /* 0x2C */ s16 drawFlag;
+ /* 0x24 */ s16 scale;
+ /* 0x28 */ s16* playerDetected;
+ /* 0x2C */ s16 flags;
} EffectSsSolderSrchBallInitParams; // size = 0x30
extern const EffectSsInit Effect_Ss_Solder_Srch_Ball_InitVars;