1
0
Fork 0
mirror of https://github.com/zeldaret/oot.git synced 2025-08-07 23:10:22 +00:00

Bg_Mori_Kaitenkabe (#410)

* Darkmeiro decompilation

Bg_Gnd_Darkmeiro decompiled, matched, and documented.

* give this a shot

* fix conflict

* one more try

* spinny wall

* cleanup

* wait for mori tex

* merge and better (?) names
This commit is contained in:
petrie911 2020-10-03 21:18:41 -05:00 committed by GitHub
parent e270cd96bf
commit 686b44d8f8
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
16 changed files with 164 additions and 510 deletions

View file

@ -1,3 +1,9 @@
/*
* File: z_bg_mori_kaitenkabe.c
* Overlay: ovl_Bg_Mori_Kaitenkabe
* Description: Rotating wall in Forest Temple basement
*/
#include "z_bg_mori_kaitenkabe.h"
#define FLAGS 0x00000000
@ -7,8 +13,17 @@
void BgMoriKaitenkabe_Init(Actor* thisx, GlobalContext* globalCtx);
void BgMoriKaitenkabe_Destroy(Actor* thisx, GlobalContext* globalCtx);
void BgMoriKaitenkabe_Update(Actor* thisx, GlobalContext* globalCtx);
void BgMoriKaitenkabe_Draw(Actor* thisx, GlobalContext* globalCtx);
void BgMoriKaitenkabe_WaitForMoriTex(BgMoriKaitenkabe* this, GlobalContext* globalCtx);
void BgMoriKaitenkabe_SetupWait(BgMoriKaitenkabe* this);
void BgMoriKaitenkabe_Wait(BgMoriKaitenkabe* this, GlobalContext* globalCtx);
void BgMoriKaitenkabe_SetupRotate(BgMoriKaitenkabe* this);
void BgMoriKaitenkabe_Rotate(BgMoriKaitenkabe* this, GlobalContext* globalCtx);
extern ColHeader D_060063B8;
extern Gfx D_060056B0[];
/*
const ActorInit Bg_Mori_Kaitenkabe_InitVars = {
ACTOR_BG_MORI_KAITENKABE,
ACTORTYPE_BG,
@ -20,23 +35,145 @@ const ActorInit Bg_Mori_Kaitenkabe_InitVars = {
(ActorFunc)BgMoriKaitenkabe_Update,
NULL,
};
*/
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Mori_Kaitenkabe/func_808A4DC0.s")
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Mori_Kaitenkabe/BgMoriKaitenkabe_Init.s")
static InitChainEntry sInitChain[] = {
ICHAIN_F32(uncullZoneForward, 1000, ICHAIN_CONTINUE),
ICHAIN_F32(uncullZoneScale, 1000, ICHAIN_CONTINUE),
ICHAIN_F32(uncullZoneDownward, 1000, ICHAIN_CONTINUE),
ICHAIN_VEC3F_DIV1000(scale, 1000, ICHAIN_STOP),
};
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Mori_Kaitenkabe/BgMoriKaitenkabe_Destroy.s")
void BgMoriKaitenkabe_CrossProduct(Vec3f* dest, Vec3f* v1, Vec3f* v2) {
dest->x = (v1->y * v2->z) - (v1->z * v2->y);
dest->y = (v1->z * v2->x) - (v1->x * v2->z);
dest->z = (v1->x * v2->y) - (v1->y * v2->x);
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Mori_Kaitenkabe/func_808A4F3C.s")
void BgMoriKaitenkabe_Init(Actor* thisx, GlobalContext* globalCtx) {
s32 pad;
BgMoriKaitenkabe* this = THIS;
ColHeader* colHeader = NULL;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Mori_Kaitenkabe/func_808A4F90.s")
// Forest Temple object 【Rotating Wall (arg_data: 0x% 04x)】 appears
osSyncPrintf("◯◯◯森の神殿オブジェクト【回転壁(arg_data : 0x%04x)】出現 \n", this->dyna.actor.params);
Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
DynaPolyInfo_SetActorMove(&this->dyna, 0);
DynaPolyInfo_Alloc(&D_060063B8, &colHeader);
this->dyna.dynaPolyId =
DynaPolyInfo_RegisterActor(globalCtx, &globalCtx->colCtx.dyna, &this->dyna.actor, colHeader);
this->moriTexObjIndex = Object_GetIndex(&globalCtx->objectCtx, OBJECT_MORI_TEX);
if (this->moriTexObjIndex < 0) {
Actor_Kill(&this->dyna.actor);
// 【Rotating wall】 Bank danger!
osSyncPrintf("【回転壁】 バンク危険!(%s %d)\n", "../z_bg_mori_kaitenkabe.c", 176);
} else {
this->actionFunc = BgMoriKaitenkabe_WaitForMoriTex;
}
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Mori_Kaitenkabe/func_808A4FA4.s")
void BgMoriKaitenkabe_Destroy(Actor* thisx, GlobalContext* globalCtx) {
s32 pad;
BgMoriKaitenkabe* this = THIS;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Mori_Kaitenkabe/func_808A5104.s")
DynaPolyInfo_Free(globalCtx, &globalCtx->colCtx.dyna, this->dyna.dynaPolyId);
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Mori_Kaitenkabe/func_808A5120.s")
void BgMoriKaitenkabe_WaitForMoriTex(BgMoriKaitenkabe* this, GlobalContext* globalCtx) {
if (Object_IsLoaded(&globalCtx->objectCtx, this->moriTexObjIndex)) {
BgMoriKaitenkabe_SetupWait(this);
this->dyna.actor.draw = BgMoriKaitenkabe_Draw;
}
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Mori_Kaitenkabe/BgMoriKaitenkabe_Update.s")
void BgMoriKaitenkabe_SetupWait(BgMoriKaitenkabe* this) {
this->actionFunc = BgMoriKaitenkabe_Wait;
this->timer = 0;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Mori_Kaitenkabe/func_808A52AC.s")
void BgMoriKaitenkabe_Wait(BgMoriKaitenkabe* this, GlobalContext* globalCtx) {
Vec3f push;
Vec3f leverArm;
Vec3f torque;
Player* player = PLAYER;
if (this->dyna.unk_150 > 0.001f) {
this->timer++;
if ((this->timer > 28) && !Player_InCsMode(globalCtx)) {
BgMoriKaitenkabe_SetupRotate(this);
func_8002DF54(globalCtx, &this->dyna.actor, 8);
Math_Vec3f_Copy(&this->lockedPlayerPos, &player->actor.posRot.pos);
push.x = Math_Sins(this->dyna.unk_158);
push.y = 0.0f;
push.z = Math_Coss(this->dyna.unk_158);
leverArm.x = this->dyna.actor.posRot.pos.x - player->actor.posRot.pos.x;
leverArm.y = 0.0f;
leverArm.z = this->dyna.actor.posRot.pos.z - player->actor.posRot.pos.z;
BgMoriKaitenkabe_CrossProduct(&torque, &push, &leverArm);
this->rotDirection = (torque.y > 0.0f) ? 1.0f : -1.0f;
}
} else {
this->timer = 0;
}
if (fabsf(this->dyna.unk_150) > 0.001f) {
this->dyna.unk_150 = 0.0f;
player->stateFlags2 &= ~0x10;
}
}
void BgMoriKaitenkabe_SetupRotate(BgMoriKaitenkabe* this) {
this->actionFunc = BgMoriKaitenkabe_Rotate;
this->rotSpeed = 0.0f;
this->rotYdeg = 0.0f;
}
void BgMoriKaitenkabe_Rotate(BgMoriKaitenkabe* this, GlobalContext* globalCtx) {
Player* player = PLAYER;
Actor* thisx = &this->dyna.actor;
s16 rotY;
Math_ApproxF(&this->rotSpeed, 0.6f, 0.02f);
if (Math_ApproxF(&this->rotYdeg, this->rotDirection * 45.0f, this->rotSpeed)) {
BgMoriKaitenkabe_SetupWait(this);
func_8002DF54(globalCtx, thisx, 7);
if (this->rotDirection > 0.0f) {
thisx->initPosRot.rot.y += 0x2000;
} else {
thisx->initPosRot.rot.y -= 0x2000;
}
thisx->posRot.rot.y = thisx->shape.rot.y = thisx->initPosRot.rot.y;
func_800788CC(NA_SE_EV_STONEDOOR_STOP);
} else {
rotY = this->rotYdeg * (0x10000 / 360.0f);
thisx->posRot.rot.y = thisx->shape.rot.y = thisx->initPosRot.rot.y + rotY;
func_800788CC(NA_SE_EV_WALL_SLIDE - SFX_FLAG);
}
if (fabsf(this->dyna.unk_150) > 0.001f) {
this->dyna.unk_150 = 0.0f;
player->stateFlags2 &= ~0x10;
}
Math_Vec3f_Copy(&player->actor.posRot.pos, &this->lockedPlayerPos);
}
void BgMoriKaitenkabe_Update(Actor* thisx, GlobalContext* globalCtx) {
s32 pad;
BgMoriKaitenkabe* this = THIS;
this->actionFunc(this, globalCtx);
}
void BgMoriKaitenkabe_Draw(Actor* thisx, GlobalContext* globalCtx) {
s32 pad;
BgMoriKaitenkabe* this = THIS;
OPEN_DISPS(globalCtx->state.gfxCtx, "../z_bg_mori_kaitenkabe.c", 347);
func_80093D18(globalCtx->state.gfxCtx);
gSPSegment(oGfxCtx->polyOpa.p++, 0x08, globalCtx->objectCtx.status[this->moriTexObjIndex].segment);
gSPMatrix(oGfxCtx->polyOpa.p++, Matrix_NewMtx(globalCtx->state.gfxCtx, "../z_bg_mori_kaitenkabe.c", 352),
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(oGfxCtx->polyOpa.p++, D_060056B0);
CLOSE_DISPS(globalCtx->state.gfxCtx, "../z_bg_mori_kaitenkabe.c", 356);
}

View file

@ -6,9 +6,17 @@
struct BgMoriKaitenkabe;
typedef void (*BgMoriKaitenkabeActionFunc)(struct BgMoriKaitenkabe*, GlobalContext*);
typedef struct BgMoriKaitenkabe {
/* 0x0000 */ Actor actor;
/* 0x014C */ char unk_14C[0x3C];
/* 0x0000 */ DynaPolyActor dyna;
/* 0x0164 */ BgMoriKaitenkabeActionFunc actionFunc;
/* 0x0168 */ s32 timer;
/* 0x016C */ f32 rotDirection;
/* 0x0170 */ f32 rotSpeed;
/* 0x0174 */ f32 rotYdeg;
/* 0x0178 */ Vec3f lockedPlayerPos;
/* 0x0184 */ s8 moriTexObjIndex;
} BgMoriKaitenkabe; // size = 0x0188
extern const ActorInit Bg_Mori_Kaitenkabe_InitVars;