summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEthan Roseman <ethteck@gmail.com>2020-07-19 16:36:18 -0400
committerGitHub <noreply@github.com>2020-07-19 16:36:18 -0400
commit71e65af9b7b8823c58e2d08d5cdbf62844b90fd2 (patch)
tree51f1ada7bd7c979f478bc4da8a55c9f49b1ae4be /src
parent3d36fe510f23a2f2072ab96c5b74b0bd15860e56 (diff)
Decompiled ovl_Door_Gerudo (#274)
* Decompiled ovl_Door_Gerudo * Update include/z64actor.h Co-authored-by: Roman971 <32455037+Roman971@users.noreply.github.com> * Update src/overlays/actors/ovl_Door_Gerudo/z_door_gerudo.c Co-authored-by: Roman971 <32455037+Roman971@users.noreply.github.com> * Update src/overlays/actors/ovl_Door_Gerudo/z_door_gerudo.c Co-authored-by: Roman971 <32455037+Roman971@users.noreply.github.com> * Update include/z64actor.h Co-authored-by: Roman971 <32455037+Roman971@users.noreply.github.com> Co-authored-by: Roman971 <32455037+Roman971@users.noreply.github.com>
Diffstat (limited to 'src')
-rw-r--r--src/overlays/actors/ovl_Door_Gerudo/z_door_gerudo.c144
-rw-r--r--src/overlays/actors/ovl_Door_Gerudo/z_door_gerudo.h8
2 files changed, 139 insertions, 13 deletions
diff --git a/src/overlays/actors/ovl_Door_Gerudo/z_door_gerudo.c b/src/overlays/actors/ovl_Door_Gerudo/z_door_gerudo.c
index f1f59edd6..28d581330 100644
--- a/src/overlays/actors/ovl_Door_Gerudo/z_door_gerudo.c
+++ b/src/overlays/actors/ovl_Door_Gerudo/z_door_gerudo.c
@@ -15,7 +15,11 @@ void DoorGerudo_Destroy(Actor* thisx, GlobalContext* globalCtx);
void DoorGerudo_Update(Actor* thisx, GlobalContext* globalCtx);
void DoorGerudo_Draw(Actor* thisx, GlobalContext* globalCtx);
-/*
+void func_8099485C(DoorGerudo* this, GlobalContext* globalCtx);
+s32 func_80994750(DoorGerudo* this, GlobalContext* globalCtx);
+void func_8099496C(DoorGerudo* this, GlobalContext* globalCtx);
+void func_809949C8(DoorGerudo* this, GlobalContext* globalCtx);
+
const ActorInit Door_Gerudo_InitVars = {
ACTOR_DOOR_GERUDO,
ACTORTYPE_ITEMACTION,
@@ -27,21 +31,139 @@ const ActorInit Door_Gerudo_InitVars = {
(ActorFunc)DoorGerudo_Update,
(ActorFunc)DoorGerudo_Draw,
};
-*/
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Door_Gerudo/DoorGerudo_Init.s")
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Door_Gerudo/DoorGerudo_Destroy.s")
+static InitChainEntry sInitChain[] = {
+ ICHAIN_VEC3F(scale, 1, ICHAIN_STOP),
+};
+
+extern Gfx D_06000040[];
+extern UNK_TYPE D_06000170;
+extern UNK_TYPE D_80994B70;
+
+void DoorGerudo_Init(Actor* thisx, GlobalContext* globalCtx) {
+ s32 pad;
+ DoorGerudo* this = THIS;
+ s32 localC = 0;
+
+ Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
+ DynaPolyInfo_Alloc(&D_06000170, &localC);
+ this->dyna.dynaPolyId = DynaPolyInfo_RegisterActor(globalCtx, &globalCtx->colCtx.dyna, thisx, localC);
+
+ if (Flags_GetSwitch(globalCtx, thisx->params & 0x3F)) {
+ this->actionFunc = func_8099485C;
+ thisx->posRot.pos.y = thisx->initPosRot.pos.y + 200.0f;
+ } else {
+ this->actionFunc = func_8099485C;
+ this->unk_166 = 10;
+ }
+}
+
+void DoorGerudo_Destroy(Actor* thisx, GlobalContext* globalCtx) {
+ DoorGerudo* this = THIS;
+
+ DynaPolyInfo_Free(globalCtx, &globalCtx->colCtx.dyna, this->dyna.dynaPolyId);
+}
+
+f32 func_809946BC(GlobalContext* globalCtx, DoorGerudo* this, f32 arg2, f32 arg3, f32 arg4) {
+ Player* player = PLAYER;
+ Vec3f playerPos;
+ Vec3f sp1C;
+
+ playerPos.x = player->actor.posRot.pos.x;
+ playerPos.y = player->actor.posRot.pos.y + arg2;
+ playerPos.z = player->actor.posRot.pos.z;
+ func_8002DBD0(&this->dyna.actor, &sp1C, &playerPos);
+
+ if ((arg3 < fabsf(sp1C.x)) || (arg4 < fabsf(sp1C.y))) {
+ return FLT_MAX;
+ } else {
+ return sp1C.z;
+ }
+}
+
+s32 func_80994750(DoorGerudo* this, GlobalContext* globalCtx) {
+ Player* player = PLAYER;
+ f32 temp_f0;
+ s16 rotYDiff;
+
+ if (!func_8008E988(globalCtx)) {
+ temp_f0 = func_809946BC(globalCtx, this, 0.0f, 20.0f, 15.0f);
+ if (fabsf(temp_f0) < 40.0f) {
+ rotYDiff = player->actor.shape.rot.y - this->dyna.actor.shape.rot.y;
+ if (temp_f0 > 0.0f) {
+ rotYDiff = 0x8000 - rotYDiff;
+ }
+ if (ABS(rotYDiff) < 0x2000) {
+ return (temp_f0 >= 0.0f) ? 1.0f : -1.0f;
+ }
+ }
+ }
+ return 0;
+}
+
+void func_8099485C(DoorGerudo* this, GlobalContext* globalCtx) {
+ s32 temp_v0;
+ Player* player;
+
+ if (this->unk_164 != 0) {
+ this->actionFunc = func_8099496C;
+ gSaveContext.dungeonKeys[gSaveContext.mapIndex] -= 1;
+ Flags_SetSwitch(globalCtx, this->dyna.actor.params & 0x3F);
+ Audio_PlayActorSound2(&this->dyna.actor, NA_SE_EV_CHAIN_KEY_UNLOCK);
+ } else {
+ temp_v0 = func_80994750(this, globalCtx);
+ if (temp_v0 != 0) {
+ player = PLAYER;
+ if (gSaveContext.dungeonKeys[gSaveContext.mapIndex] <= 0) {
+ player->naviMessageId = -0x203;
+ } else if (!Flags_GetCollectible(globalCtx, (this->dyna.actor.params >> 8) & 0x1F)) {
+ player->naviMessageId = -0x225;
+ } else {
+ player->unk_42C = 2;
+ player->unk_42D = temp_v0;
+ player->unk_430 = &this->dyna.actor;
+ player->unk_42E = 10;
+ }
+ }
+ }
+}
+
+void func_8099496C(DoorGerudo* this, GlobalContext* globalCtx) {
+ if (DECR(this->unk_166) == 0) {
+ Audio_PlayActorSound2(&this->dyna.actor, NA_SE_EV_SLIDE_DOOR_OPEN);
+ this->actionFunc = func_809949C8;
+ }
+}
+
+void func_809949C8(DoorGerudo* this, GlobalContext* globalCtx) {
+ Math_ApproxF(&this->dyna.actor.velocity.y, 15.0f, 3.0f);
+ Math_ApproxF(&this->dyna.actor.posRot.pos.y, this->dyna.actor.initPosRot.pos.y + 200.0f,
+ this->dyna.actor.velocity.y);
+}
+
+void DoorGerudo_Update(Actor* thisx, GlobalContext* globalCtx) {
+ DoorGerudo* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Door_Gerudo/func_809946BC.s")
+ this->actionFunc(this, globalCtx);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Door_Gerudo/func_80994750.s")
+void DoorGerudo_Draw(Actor* thisx, GlobalContext* globalCtx) {
+ DoorGerudo* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Door_Gerudo/func_8099485C.s")
+ GraphicsContext* gfxCtx = globalCtx->state.gfxCtx;
+ Gfx* dispRefs[4];
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Door_Gerudo/func_8099496C.s")
+ Graph_OpenDisps(dispRefs, globalCtx->state.gfxCtx, "../z_door_gerudo.c", 361);
+ func_80093D18(globalCtx->state.gfxCtx);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Door_Gerudo/func_809949C8.s")
+ gSPMatrix(gfxCtx->polyOpa.p++, Matrix_NewMtx(globalCtx->state.gfxCtx, "../z_door_gerudo.c", 365),
+ G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ gSPDisplayList(gfxCtx->polyOpa.p++, D_06000040);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Door_Gerudo/DoorGerudo_Update.s")
+ if (this->unk_166 != 0) {
+ Matrix_Scale(0.01f, 0.01f, 0.025f, MTXMODE_APPLY);
+ func_80033F54(globalCtx, this->unk_166, 0);
+ }
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Door_Gerudo/DoorGerudo_Draw.s")
+ Graph_CloseDisps(dispRefs, globalCtx->state.gfxCtx, "../z_door_gerudo.c", 377);
+}
diff --git a/src/overlays/actors/ovl_Door_Gerudo/z_door_gerudo.h b/src/overlays/actors/ovl_Door_Gerudo/z_door_gerudo.h
index 95670506c..9ae55f6d6 100644
--- a/src/overlays/actors/ovl_Door_Gerudo/z_door_gerudo.h
+++ b/src/overlays/actors/ovl_Door_Gerudo/z_door_gerudo.h
@@ -6,9 +6,13 @@
struct DoorGerudo;
+typedef void (*DoorGerudoActionFunc)(struct DoorGerudo*, GlobalContext*);
+
typedef struct DoorGerudo {
- /* 0x0000 */ Actor actor;
- /* 0x014C */ char unk_14C[0x20];
+ /* 0x0000 */ DynaPolyActor dyna;
+ /* 0x0164 */ s16 unk_164;
+ /* 0x0166 */ u8 unk_166;
+ /* 0x0168 */ DoorGerudoActionFunc actionFunc;
} DoorGerudo; // size = 0x016C
extern const ActorInit Door_Gerudo_InitVars;