mirror of https://github.com/zeldaret/mm.git
ovl_Oceff_Spot OK (#1004)
* ovl_Oceff_Spot decompiled * format * renamings and pr review * pr review * pr review
This commit is contained in:
parent
e47dc7da25
commit
33f7ede84f
|
@ -0,0 +1,7 @@
|
|||
<Root>
|
||||
<File Name="ovl_Oceff_Spot" BaseAddress="0x80972680" RangeStart="0x720" RangeEnd="0xDF8">
|
||||
<Texture Name="sSunSongEffectTex" OutName="sun_song_effect" Format="i8" Width="32" Height="32" Offset="0x720"/>
|
||||
<DList Name="sSunSongEffectCylinderMaterialDL" Offset="0xCD0"/>
|
||||
<DList Name="sSunSongEffectCylinderModelDL" Offset="0xD68"/>
|
||||
</File>
|
||||
</Root>
|
3
spec
3
spec
|
@ -1694,8 +1694,7 @@ beginseg
|
|||
name "ovl_Oceff_Spot"
|
||||
compress
|
||||
include "build/src/overlays/actors/ovl_Oceff_Spot/z_oceff_spot.o"
|
||||
include "build/data/ovl_Oceff_Spot/ovl_Oceff_Spot.data.o"
|
||||
include "build/data/ovl_Oceff_Spot/ovl_Oceff_Spot.reloc.o"
|
||||
include "build/src/overlays/actors/ovl_Oceff_Spot/ovl_Oceff_Spot_reloc.o"
|
||||
endseg
|
||||
|
||||
beginseg
|
||||
|
|
|
@ -10,17 +10,17 @@
|
|||
|
||||
#define THIS ((OceffSpot*)thisx)
|
||||
|
||||
void OceffSpot_Init(Actor* thisx, PlayState* play);
|
||||
void OceffSpot_Destroy(Actor* thisx, PlayState* play);
|
||||
void OceffSpot_Init(Actor* thisx, PlayState* play2);
|
||||
void OceffSpot_Destroy(Actor* thisx, PlayState* play2);
|
||||
void OceffSpot_Update(Actor* thisx, PlayState* play);
|
||||
void OceffSpot_Draw(Actor* thisx, PlayState* play);
|
||||
|
||||
void func_809728F8(OceffSpot* this, PlayState* play);
|
||||
void func_80972934(OceffSpot* this, PlayState* play);
|
||||
void OceffSpot_Wait(OceffSpot* this, PlayState* play);
|
||||
void OceffSpot_GrowCylinder(OceffSpot* this, PlayState* play);
|
||||
void OceffSpot_End(OceffSpot* this, PlayState* play);
|
||||
|
||||
void OceffSpot_SetupAction(OceffSpot* this, OceffSpotActionFunc actionFunc);
|
||||
|
||||
#if 0
|
||||
const ActorInit Oceff_Spot_InitVars = {
|
||||
ACTOR_OCEFF_SPOT,
|
||||
ACTORCAT_ITEMACTION,
|
||||
|
@ -33,28 +33,140 @@ const ActorInit Oceff_Spot_InitVars = {
|
|||
(ActorFunc)OceffSpot_Draw,
|
||||
};
|
||||
|
||||
// static InitChainEntry sInitChain[] = {
|
||||
static InitChainEntry D_80973478[] = {
|
||||
#include "assets/overlays/ovl_Oceff_Spot/ovl_Oceff_Spot.c"
|
||||
|
||||
static InitChainEntry sInitChain[] = {
|
||||
ICHAIN_VEC3F_DIV1000(scale, 0, ICHAIN_CONTINUE),
|
||||
ICHAIN_F32(uncullZoneForward, 1500, ICHAIN_STOP),
|
||||
};
|
||||
|
||||
#endif
|
||||
void OceffSpot_SetupAction(OceffSpot* this, OceffSpotActionFunc actionFunc) {
|
||||
this->actionFunc = actionFunc;
|
||||
}
|
||||
|
||||
extern InitChainEntry D_80973478[];
|
||||
void OceffSpot_Init(Actor* thisx, PlayState* play2) {
|
||||
PlayState* play = play2;
|
||||
OceffSpot* this = THIS;
|
||||
Player* player = GET_PLAYER(play);
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Oceff_Spot/OceffSpot_SetupAction.s")
|
||||
Actor_ProcessInitChain(&this->actor, sInitChain);
|
||||
OceffSpot_SetupAction(this, OceffSpot_GrowCylinder);
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Oceff_Spot/OceffSpot_Init.s")
|
||||
Lights_PointNoGlowSetInfo(&this->lightInfo1, this->actor.world.pos.x, this->actor.world.pos.y,
|
||||
this->actor.world.pos.z, 0, 0, 0, 0);
|
||||
this->lightNode1 = LightContext_InsertLight(play, &play->lightCtx, &this->lightInfo1);
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Oceff_Spot/OceffSpot_Destroy.s")
|
||||
Lights_PointNoGlowSetInfo(&this->lightInfo2, this->actor.world.pos.x, this->actor.world.pos.y,
|
||||
this->actor.world.pos.z, 0, 0, 0, 0);
|
||||
this->lightNode2 = LightContext_InsertLight(play, &play->lightCtx, &this->lightInfo2);
|
||||
this->actor.scale.y = 0.3f;
|
||||
this->unk16C = 0.0f;
|
||||
this->actor.world.pos.y = player->actor.world.pos.y;
|
||||
this->actor.world.pos.x = player->bodyPartsPos[0].x;
|
||||
this->actor.world.pos.z = player->bodyPartsPos[0].z;
|
||||
}
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Oceff_Spot/func_80972844.s")
|
||||
void OceffSpot_Destroy(Actor* thisx, PlayState* play2) {
|
||||
PlayState* play = play2;
|
||||
OceffSpot* this = THIS;
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Oceff_Spot/func_809728F8.s")
|
||||
LightContext_RemoveLight(play, &play->lightCtx, this->lightNode1);
|
||||
LightContext_RemoveLight(play, &play->lightCtx, this->lightNode2);
|
||||
func_80115D5C(&play->state);
|
||||
}
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Oceff_Spot/func_80972934.s")
|
||||
void OceffSpot_End(OceffSpot* this, PlayState* play) {
|
||||
if (this->unk16C > 0.0f) {
|
||||
this->unk16C -= 0.05f;
|
||||
} else {
|
||||
Actor_MarkForDeath(&this->actor);
|
||||
if ((REG(15) != 0x190) && (play->msgCtx.unk12046 == 0)) {
|
||||
if ((play->msgCtx.ocarinaAction != 0x39) || (play->msgCtx.ocarinaMode != 0xA)) {
|
||||
gSaveContext.sunsSongState = SUNSSONG_START;
|
||||
}
|
||||
} else {
|
||||
play->msgCtx.ocarinaMode = 4;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Oceff_Spot/OceffSpot_Update.s")
|
||||
void OceffSpot_Wait(OceffSpot* this, PlayState* play) {
|
||||
if (this->timer > 0) {
|
||||
this->timer--;
|
||||
} else {
|
||||
OceffSpot_SetupAction(this, OceffSpot_End);
|
||||
}
|
||||
}
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Oceff_Spot/OceffSpot_Draw.s")
|
||||
void OceffSpot_GrowCylinder(OceffSpot* this, PlayState* play) {
|
||||
if (this->unk16C < 1.0f) {
|
||||
this->unk16C += 0.05f;
|
||||
} else {
|
||||
OceffSpot_SetupAction(this, OceffSpot_Wait);
|
||||
this->timer = 60;
|
||||
}
|
||||
}
|
||||
|
||||
void OceffSpot_Update(Actor* thisx, PlayState* play) {
|
||||
f32 scale;
|
||||
s32 pad;
|
||||
Player* player = GET_PLAYER(play);
|
||||
f32 temp;
|
||||
OceffSpot* this = THIS;
|
||||
|
||||
temp = (1.0f - cosf(this->unk16C * M_PI)) * 0.5f;
|
||||
this->actionFunc(this, play);
|
||||
|
||||
switch (gSaveContext.save.playerForm) {
|
||||
default:
|
||||
scale = 1.0f;
|
||||
break;
|
||||
|
||||
case PLAYER_FORM_DEKU:
|
||||
scale = 1.3f;
|
||||
break;
|
||||
|
||||
case PLAYER_FORM_ZORA:
|
||||
scale = 1.2f;
|
||||
break;
|
||||
|
||||
case PLAYER_FORM_GORON:
|
||||
scale = 2.0f;
|
||||
break;
|
||||
}
|
||||
|
||||
this->actor.scale.z = (scale * 0.42f) * temp;
|
||||
this->actor.scale.x = (scale * 0.42f) * temp;
|
||||
|
||||
this->actor.world.pos = player->actor.world.pos;
|
||||
this->actor.world.pos.y = this->actor.world.pos.y + 5.0f;
|
||||
|
||||
temp = (2.0f - this->unk16C) * this->unk16C;
|
||||
|
||||
func_800FD2B4(play, temp * 0.5f, 880.0f, 0.2f, 0.9f);
|
||||
|
||||
Lights_PointNoGlowSetInfo(&this->lightInfo1, this->actor.world.pos.x, this->actor.world.pos.y + 55.0f,
|
||||
this->actor.world.pos.z, (s32)(255.0f * temp), (s32)(255.0f * temp), (s32)(200.0f * temp),
|
||||
100.0f * temp);
|
||||
Lights_PointNoGlowSetInfo(
|
||||
&this->lightInfo2, this->actor.world.pos.x + (Math_SinS(player->actor.shape.rot.y) * 20.0f),
|
||||
this->actor.world.pos.y + 20.0f, this->actor.world.pos.z + (Math_CosS(player->actor.shape.rot.y) * 20.0f),
|
||||
(s32)(255.0f * temp), (s32)(255.0f * temp), (s32)(200.0f * temp), 100.0f * temp);
|
||||
}
|
||||
|
||||
void OceffSpot_Draw(Actor* thisx, PlayState* play) {
|
||||
OceffSpot* this = THIS;
|
||||
u32 scroll = play->state.frames & 0xFFFF;
|
||||
|
||||
OPEN_DISPS(play->state.gfxCtx);
|
||||
|
||||
func_8012C2DC(play->state.gfxCtx);
|
||||
|
||||
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
|
||||
gSPDisplayList(POLY_XLU_DISP++, &sSunSongEffectCylinderMaterialDL);
|
||||
gSPDisplayList(POLY_XLU_DISP++, Gfx_TwoTexScroll(play->state.gfxCtx, 0, scroll * 2, scroll * -2, 0x20, 0x20, 1, 0,
|
||||
scroll * -8, 0x20, 0x20));
|
||||
gSPDisplayList(POLY_XLU_DISP++, &sSunSongEffectCylinderModelDL);
|
||||
|
||||
CLOSE_DISPS(play->state.gfxCtx);
|
||||
}
|
||||
|
|
|
@ -9,7 +9,12 @@ typedef void (*OceffSpotActionFunc)(struct OceffSpot*, PlayState*);
|
|||
|
||||
typedef struct OceffSpot {
|
||||
/* 0x000 */ Actor actor;
|
||||
/* 0x144 */ char unk_144[0x30];
|
||||
/* 0x144 */ LightNode* lightNode1;
|
||||
/* 0x148 */ LightInfo lightInfo1;
|
||||
/* 0x158 */ LightNode* lightNode2;
|
||||
/* 0x15C */ LightInfo lightInfo2;
|
||||
/* 0x16C */ f32 unk16C;
|
||||
/* 0x170 */ u16 timer;
|
||||
/* 0x174 */ OceffSpotActionFunc actionFunc;
|
||||
} OceffSpot; // size = 0x178
|
||||
|
||||
|
|
|
@ -8057,9 +8057,9 @@
|
|||
0x80972680:("OceffSpot_SetupAction",),
|
||||
0x8097268C:("OceffSpot_Init",),
|
||||
0x809727EC:("OceffSpot_Destroy",),
|
||||
0x80972844:("func_80972844",),
|
||||
0x809728F8:("func_809728F8",),
|
||||
0x80972934:("func_80972934",),
|
||||
0x80972844:("OceffSpot_End",),
|
||||
0x809728F8:("OceffSpot_Wait",),
|
||||
0x80972934:("OceffSpot_GrowCylinder",),
|
||||
0x80972998:("OceffSpot_Update",),
|
||||
0x80972C54:("OceffSpot_Draw",),
|
||||
0x80973550:("EnTorch_Init",),
|
||||
|
|
Loading…
Reference in New Issue