Ovl_Bg_Ctower_Rot Ok (#149)

* Ovl_Bg_Ctower_Rot Ok

* Move enum to h file

* Rename D_808E2564 to bgCtowerRotDlists

* Rename D_808E2564 to bgCtowerRotDlists take 2
This commit is contained in:
Derek Hensley 2021-05-20 14:23:23 -07:00 committed by GitHub
parent 25afa196f6
commit e17b05b8fa
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 165 additions and 15 deletions

View File

@ -1754,9 +1754,9 @@ SECTIONS
ovl_Bg_Ctower_Rot : AT(RomLocation)
{
build/src/overlays/actors/ovl_Bg_Ctower_Rot/z_bg_ctower_rot.o(.text)
build/asm/overlays/ovl_Bg_Ctower_Rot_data.o(.data)
build/src/overlays/actors/ovl_Bg_Ctower_Rot/z_bg_ctower_rot.o(.data)
build/src/overlays/actors/ovl_Bg_Ctower_Rot/z_bg_ctower_rot.o(.rodata)
build/asm/overlays/ovl_Bg_Ctower_Rot_rodata.o(.rodata)
build/src/overlays/actors/ovl_Bg_Ctower_Rot/z_bg_ctower_rot_overlay.o(.ovl)
}
SegmentEnd = .;
SegmentSize = SegmentEnd - SegmentStart;

View File

@ -227,6 +227,15 @@ D_06017018 = 0x06017018;
D_06018118 = 0x06018118;
D_06018588 = 0x06018588;
/* z_bg_ctower_rot */
D_060129D0 = 0x060129D0;
D_06012DA0 = 0x06012DA0;
D_060142E8 = 0x060142E8;
D_06017220 = 0x06017220;
D_06017410 = 0x06017410;
D_060174E0 = 0x060174E0;
D_06017650 = 0x06017650;
/* z_en_warp_uzu */
D_06000EC0 = 0x06000EC0;

View File

@ -1,3 +1,9 @@
/*
* File: z_bg_ctower_rot.c
* Overlay: ovl_Bg_CtowerRot
* Description: Twisting path along with the Doors to Clocktower
*/
#include "z_bg_ctower_rot.h"
#define FLAGS 0x00000030
@ -9,7 +15,11 @@ void BgCtowerRot_Destroy(Actor* thisx, GlobalContext* globalCtx);
void BgCtowerRot_Update(Actor* thisx, GlobalContext* globalCtx);
void BgCtowerRot_Draw(Actor* thisx, GlobalContext* globalCtx);
/*
void BgCtowerRot_CorridorRotate(BgCtowerRot* this, GlobalContext* globalCtx);
void BgCtowerRot_DoorDoNothing(BgCtowerRot* this, GlobalContext* globalCtx);
void BgCtowerRot_DoorIdle(BgCtowerRot* this, GlobalContext* globalCtx);
void BgCtowerRot_SetupDoorClose(BgCtowerRot* this, GlobalContext* globalCtx);
const ActorInit Bg_Ctower_Rot_InitVars = {
ACTOR_BG_CTOWER_ROT,
ACTORCAT_BG,
@ -21,22 +31,142 @@ const ActorInit Bg_Ctower_Rot_InitVars = {
(ActorFunc)BgCtowerRot_Update,
(ActorFunc)BgCtowerRot_Draw,
};
*/
#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_Bg_Ctower_Rot_0x808E2070/BgCtowerRot_Init.asm")
extern Gfx D_060129D0[];
#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_Bg_Ctower_Rot_0x808E2070/BgCtowerRot_Destroy.asm")
extern Gfx D_06012DA0[];
#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_Bg_Ctower_Rot_0x808E2070/func_808E21FC.asm")
extern CollisionHeader D_060142E8;
#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_Bg_Ctower_Rot_0x808E2070/func_808E22DC.asm")
extern Gfx D_06017220[];
#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_Bg_Ctower_Rot_0x808E2070/func_808E22EC.asm")
extern CollisionHeader D_06017410;
#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_Bg_Ctower_Rot_0x808E2070/func_808E23D0.asm")
extern Gfx D_060174E0[];
#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_Bg_Ctower_Rot_0x808E2070/func_808E2444.asm")
extern CollisionHeader D_06017650;
#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_Bg_Ctower_Rot_0x808E2070/BgCtowerRot_Update.asm")
static InitChainEntry sInitChain[] = {
ICHAIN_VEC3F_DIV1000(scale, 100, ICHAIN_STOP),
};
#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_Bg_Ctower_Rot_0x808E2070/BgCtowerRot_Draw.asm")
static Gfx* bgCtowerRotDlists[] = { D_06012DA0, D_06017220, D_060174E0 };
void BgCtowerRot_Init(Actor* thisx, GlobalContext* globalCtx) {
BgCtowerRot* this = THIS;
s32 pad;
ActorPlayer* player;
Vec3f offset;
Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
BcCheck3_BgActorInit(&this->dyna, 1);
if (this->dyna.actor.params == CORRIDOR) {
BgCheck3_LoadMesh(globalCtx, &this->dyna, &D_060142E8);
this->actionFunc = BgCtowerRot_CorridorRotate;
return;
}
player = PLAYER;
if (this->dyna.actor.params == MAIN_DOOR) {
BgCheck3_LoadMesh(globalCtx, &this->dyna, &D_06017410);
this->dyna.actor.world.rot.y = this->dyna.actor.shape.rot.y + 0x4000;
} else {
BgCheck3_LoadMesh(globalCtx, &this->dyna, &D_06017650);
this->dyna.actor.world.rot.y = this->dyna.actor.shape.rot.y - 0x4000;
}
Actor_CalcOffsetOrientedToDrawRotation(&this->dyna.actor, &offset, &player->base.world.pos);
if (offset.z < 0.0f) {
this->dyna.actor.world.pos.x = this->dyna.actor.home.pos.x + (Math_SinS(this->dyna.actor.world.rot.y) * 80.0f);
this->dyna.actor.world.pos.z = this->dyna.actor.home.pos.z + (Math_CosS(this->dyna.actor.world.rot.y) * 80.0f);
this->timer = 80.0f;
this->actionFunc = BgCtowerRot_DoorIdle;
} else {
this->actionFunc = BgCtowerRot_DoorDoNothing;
}
}
void BgCtowerRot_Destroy(Actor* thisx, GlobalContext* globalCtx) {
BgCtowerRot* this = THIS;
BgCheck_RemoveActorMesh(globalCtx, &globalCtx->colCtx.dyna, this->dyna.bgId);
}
void BgCtowerRot_CorridorRotate(BgCtowerRot* this, GlobalContext* globalCtx) {
ActorPlayer* player = PLAYER;
Vec3f offset;
f32 rotZ;
f32 offsetDiffZ;
f32 rotZtmp;
Actor_CalcOffsetOrientedToDrawRotation(&this->dyna.actor, &offset, &player->base.world.pos);
if (offset.z > 1100.0f) {
rotZ = 0.0f;
} else {
offsetDiffZ = 1100.0f - offset.z;
rotZtmp = (offsetDiffZ > 1000.0f)
? 1000.0f
: offsetDiffZ; // Removing rotZtmp just causes regalloc issues and a missing instruction
rotZ = rotZtmp;
}
func_800DFAC8(globalCtx->cameraPtrs[0], 0x11);
this->dyna.actor.shape.rot.z = rotZ * 16.384f;
if (globalCtx->csCtx.frames == 0x84) {
play_sound(0x4859);
}
}
void BgCtowerRot_DoorDoNothing(BgCtowerRot* this, GlobalContext* globalCtx) {
}
void BgCtowerRot_DoorClose(BgCtowerRot* this, GlobalContext* globalCtx) {
if (!Math_SmoothStepToF(&this->timer, 0.0f, 0.1f, 15.0f, 0.1f)) {
if (this->dyna.actor.params == MAIN_DOOR) {
Audio_PlayActorSound2(&this->dyna.actor, 0x2893);
ActorCutscene_Stop(this->dyna.actor.cutscene);
}
this->actionFunc = BgCtowerRot_DoorDoNothing;
} else if (this->dyna.actor.params == 1) {
func_800B9010(&this->dyna.actor, 0x201E);
}
this->dyna.actor.world.pos.x =
this->dyna.actor.home.pos.x + (Math_SinS(this->dyna.actor.world.rot.y) * this->timer);
this->dyna.actor.world.pos.z =
this->dyna.actor.home.pos.z + (Math_CosS(this->dyna.actor.world.rot.y) * this->timer);
}
void BgCtowerRot_DoorIdle(BgCtowerRot* this, GlobalContext* globalCtx) {
ActorPlayer* player = PLAYER;
Vec3f offset;
Actor_CalcOffsetOrientedToDrawRotation(&this->dyna.actor, &offset, &player->base.world.pos);
if (offset.z > 30.0f) {
this->unk160 = 0.0f;
ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
this->actionFunc = BgCtowerRot_SetupDoorClose;
}
}
void BgCtowerRot_SetupDoorClose(BgCtowerRot* this, GlobalContext* globalCtx) {
if (ActorCutscene_GetCanPlayNext(this->dyna.actor.cutscene)) {
if (this->dyna.actor.params == MAIN_DOOR) {
ActorCutscene_StartAndSetUnkLinkFields(this->dyna.actor.cutscene, &this->dyna.actor);
}
this->actionFunc = BgCtowerRot_DoorClose;
} else {
ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
}
}
void BgCtowerRot_Update(Actor* thisx, GlobalContext* globalCtx) {
BgCtowerRot* this = THIS;
this->actionFunc(this, globalCtx);
}
void BgCtowerRot_Draw(Actor* thisx, GlobalContext* globalCtx) {
BgCtowerRot* this = THIS;
func_800BDFC0(globalCtx, bgCtowerRotDlists[this->dyna.actor.params]);
if (this->dyna.actor.params == CORRIDOR) {
func_800BE03C(globalCtx, D_060129D0);
}
}

View File

@ -5,9 +5,20 @@
struct BgCtowerRot;
typedef void (*BgCtowerRotActionFunc)(struct BgCtowerRot*, GlobalContext*);
typedef enum {
/* 0 */ CORRIDOR,
/* 1 */ MAIN_DOOR, // Main door controls cutscene flow (updating Link fields and playing sounds). It is the one on
// the left when entering from the Lost Woods
/* 2 */ DOOR,
} BgCtowerRotType;
typedef struct BgCtowerRot {
/* 0x000 */ Actor actor;
/* 0x144 */ char unk_144[0x24];
/* 0x000 */ DynaPolyActor dyna;
/* 0x15C */ BgCtowerRotActionFunc actionFunc;
/* 0x160 */ f32 unk160; // Set to 0 but never used
/* 0x164 */ f32 timer;
} BgCtowerRot; // size = 0x168
extern const ActorInit Bg_Ctower_Rot_InitVars;