1
0
Fork 0
mirror of https://github.com/zeldaret/oot.git synced 2025-07-13 03:14:38 +00:00

ovl_Effect_Ss_Extra (#339)

* ovl_Effect_Ss_Extra

* EffectSsExtra_Spawn

* Typo

* PR review

* PR review
This commit is contained in:
maekclena 2020-09-04 23:22:12 +02:00 committed by GitHub
parent 18775320f8
commit d44dd61cd6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
14 changed files with 86 additions and 341 deletions

View file

@ -4,6 +4,7 @@
#include "overlays/effects/ovl_Effect_Ss_Bomb/z_eff_ss_bomb.h"
#include "overlays/effects/ovl_Effect_Ss_Bomb2/z_eff_ss_bomb2.h"
#include "overlays/effects/ovl_Effect_Ss_Blast/z_eff_ss_blast.h"
#include "overlays/effects/ovl_Effect_Ss_Extra/z_eff_ss_extra.h"
#include "overlays/effects/ovl_Effect_Ss_G_Spk/z_eff_ss_g_spk.h"
#include "overlays/effects/ovl_Effect_Ss_Solder_Srch_Ball/z_eff_ss_solder_srch_ball.h"
#include "overlays/effects/ovl_Effect_Ss_Fhg_Flash/z_eff_ss_fhg_flash.h"
@ -465,7 +466,16 @@ void EffectSsSolderSrchBall_Spawn(GlobalContext* globalCtx, Vec3f* pos, Vec3f* v
// EffectSsExtra Spawn Functions
#pragma GLOBAL_ASM("asm/non_matchings/code/z_effect_soft_sprite_old_init/func_8002A5F4.s")
void EffectSsExtra_Spawn(GlobalContext* globalCtx, Vec3f* pos, Vec3f* velocity, Vec3f* accel, s16 scale, s16 scoreIdx) {
EffectSsExtraInitParams initParams;
Math_Vec3f_Copy(&initParams.pos, pos);
Math_Vec3f_Copy(&initParams.velocity, velocity);
Math_Vec3f_Copy(&initParams.accel, accel);
initParams.scale = scale;
initParams.scoreIdx = scoreIdx;
EffectSs_Spawn(globalCtx, EFFECT_SS_EXTRA, 100, &initParams);
}
// EffectSsFCircle Spawn Functions

View file

@ -1,40 +1,87 @@
/*
* File: z_eff_ss_extra.c
* Overlay: ovl_Effect_Ss_Extra
* Description:
* Description: Minigame Score Points
*/
#include "z_eff_ss_extra.h"
typedef enum {
/* 0x00 */ SS_EXTRA_0,
/* 0x01 */ SS_EXTRA_1,
/* 0x02 */ SS_EXTRA_2,
/* 0x03 */ SS_EXTRA_3,
/* 0x04 */ SS_EXTRA_4,
/* 0x05 */ SS_EXTRA_5,
/* 0x06 */ SS_EXTRA_6,
/* 0x07 */ SS_EXTRA_7,
/* 0x08 */ SS_EXTRA_8,
/* 0x09 */ SS_EXTRA_9,
/* 0x0A */ SS_EXTRA_A,
/* 0x0B */ SS_EXTRA_B,
/* 0x0C */ SS_EXTRA_C,
/* 0x00 */ SS_EXTRA_OBJ_IDX,
/* 0x01 */ SS_EXTRA_TIMER,
/* 0x02 */ SS_EXTRA_SCORE_IDX,
/* 0x03 */ SS_EXTRA_SCALE
} EffectSsExtraRegs;
u32 EffectSsExtra_Init(GlobalContext* globalCtx, u32 index, EffectSs* this, void* initParamsx);
void EffectSsExtra_Draw(GlobalContext* globalCtx, u32 index, EffectSs* this);
void EffectSsExtra_Update(GlobalContext* globalCtx, u32 index, EffectSs* this);
/*
static s16 sScores[] = { 30, 60, 100 };
EffectSsInit Effect_Ss_Extra_InitVars = {
EFFECT_SS_EXTRA,
EffectSsExtra_Init,
};
*/
#pragma GLOBAL_ASM("asm/non_matchings/overlays/effects/ovl_Effect_Ss_Extra/EffectSsExtra_Init.s")
static UNK_PTR D_809A4070[] = { 0x06000000, 0x06000480, 0x06000900 };
#pragma GLOBAL_ASM("asm/non_matchings/overlays/effects/ovl_Effect_Ss_Extra/func_809A3E00.s")
extern Gfx D_06000DC0[];
#pragma GLOBAL_ASM("asm/non_matchings/overlays/effects/ovl_Effect_Ss_Extra/func_809A3FF8.s")
u32 EffectSsExtra_Init(GlobalContext* globalCtx, u32 index, EffectSs* this, void* initParamsx) {
EffectSsExtraInitParams* initParams = (EffectSsExtraInitParams*)initParamsx;
s32 pad;
s32 objBankIndex;
u32 oldSeg6;
objBankIndex = Object_GetIndex(&globalCtx->objectCtx, OBJECT_YABUSAME_POINT);
if ((objBankIndex >= 0) && Object_IsLoaded(&globalCtx->objectCtx, objBankIndex)) {
oldSeg6 = gSegments[6];
gSegments[6] = VIRTUAL_TO_PHYSICAL(globalCtx->objectCtx.status[objBankIndex].segment);
this->pos = initParams->pos;
this->velocity = initParams->velocity;
this->accel = initParams->accel;
this->draw = EffectSsExtra_Draw;
this->update = EffectSsExtra_Update;
this->life = 50;
this->regs[SS_EXTRA_SCORE_IDX] = initParams->scoreIdx;
this->regs[SS_EXTRA_SCALE] = initParams->scale;
this->regs[SS_EXTRA_TIMER] = 5;
this->regs[SS_EXTRA_OBJ_IDX] = objBankIndex;
gSegments[6] = oldSeg6;
return 1;
}
return 0;
}
void EffectSsExtra_Draw(GlobalContext* globalCtx, u32 index, EffectSs* this) {
s32 pad;
f32 scale = this->regs[SS_EXTRA_SCALE] / 100.0f;
void* object = globalCtx->objectCtx.status[this->regs[SS_EXTRA_OBJ_IDX]].segment;
OPEN_DISPS(globalCtx->state.gfxCtx, "../z_eff_ss_extra.c", 168);
gSegments[6] = VIRTUAL_TO_PHYSICAL(object);
gSPSegment(oGfxCtx->polyXlu.p++, 0x06, object);
Matrix_Translate(this->pos.x, this->pos.y, this->pos.z, MTXMODE_NEW);
Matrix_Scale(scale, scale, scale, MTXMODE_APPLY);
func_80093D84(globalCtx->state.gfxCtx);
func_800D1FD4(&globalCtx->mf_11DA0);
gSPMatrix(oGfxCtx->polyXlu.p++, Matrix_NewMtx(globalCtx->state.gfxCtx, "../z_eff_ss_extra.c", 186),
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPSegment(oGfxCtx->polyXlu.p++, 0x08, SEGMENTED_TO_VIRTUAL(D_809A4070[this->regs[SS_EXTRA_SCORE_IDX]]));
gSPDisplayList(oGfxCtx->polyXlu.p++, SEGMENTED_TO_VIRTUAL(D_06000DC0));
CLOSE_DISPS(globalCtx->state.gfxCtx, "../z_eff_ss_extra.c", 194);
}
void EffectSsExtra_Update(GlobalContext* globalCtx, u32 index, EffectSs* this) {
if (this->regs[SS_EXTRA_TIMER] != 0) {
this->regs[SS_EXTRA_TIMER] -= 1;
} else {
this->velocity.y = 0.0f;
}
if (this->regs[SS_EXTRA_TIMER] == 1) {
globalCtx->interfaceCtx.unk_23C = sScores[this->regs[SS_EXTRA_SCORE_IDX]];
}
}

View file

@ -8,6 +8,8 @@ typedef struct {
/* 0x00 */ Vec3f pos;
/* 0x0C */ Vec3f velocity;
/* 0x18 */ Vec3f accel;
} EffectSsExtraInitParams; // size = 0x
/* 0x24 */ s16 scale;
/* 0x26 */ s16 scoreIdx;
} EffectSsExtraInitParams; // size = 0x28
#endif