Decompile obj_wturn (#564)

* Decompile obj_wturn

* Format

* Rename struct member

* Make suggestions

* Format

* Fix warning

Co-authored-by: Elliptic Ellipsis <elliptic.ellipsis@gmail.com>
This commit is contained in:
quaantuum 2022-03-27 08:14:55 -07:00 committed by GitHub
parent 4f3202fd7e
commit 95c6ddbcc8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 98 additions and 24 deletions

3
spec
View File

@ -957,8 +957,7 @@ beginseg
name "ovl_Obj_Wturn" name "ovl_Obj_Wturn"
compress compress
include "build/src/overlays/actors/ovl_Obj_Wturn/z_obj_wturn.o" include "build/src/overlays/actors/ovl_Obj_Wturn/z_obj_wturn.o"
include "build/data/ovl_Obj_Wturn/ovl_Obj_Wturn.data.o" include "build/src/overlays/actors/ovl_Obj_Wturn/ovl_Obj_Wturn_reloc.o"
include "build/data/ovl_Obj_Wturn/ovl_Obj_Wturn.reloc.o"
endseg endseg
beginseg beginseg

View File

@ -13,42 +13,116 @@
void ObjWturn_Init(Actor* thisx, GlobalContext* globalCtx); void ObjWturn_Init(Actor* thisx, GlobalContext* globalCtx);
void ObjWturn_Update(Actor* thisx, GlobalContext* globalCtx); void ObjWturn_Update(Actor* thisx, GlobalContext* globalCtx);
void func_808A7954(ObjWturn* this);
void func_808A7968(ObjWturn* this, GlobalContext* globalCtx); void func_808A7968(ObjWturn* this, GlobalContext* globalCtx);
void func_808A7A24(ObjWturn* this);
void func_808A7A5C(ObjWturn* this, GlobalContext* globalCtx); void func_808A7A5C(ObjWturn* this, GlobalContext* globalCtx);
void func_808A7AAC(ObjWturn* this, GlobalContext* globalCtx);
void func_808A7BA0(ObjWturn* this, GlobalContext* globalCtx); void func_808A7BA0(ObjWturn* this, GlobalContext* globalCtx);
void func_808A7C04(ObjWturn* this, GlobalContext* globalCtx);
void func_808A7C78(ObjWturn* this, GlobalContext* globalCtx); void func_808A7C78(ObjWturn* this, GlobalContext* globalCtx);
#if 0
const ActorInit Obj_Wturn_InitVars = { const ActorInit Obj_Wturn_InitVars = {
ACTOR_OBJ_WTURN, ACTOR_OBJ_WTURN, ACTORCAT_ITEMACTION, FLAGS,
ACTORCAT_ITEMACTION, GAMEPLAY_KEEP, sizeof(ObjWturn), (ActorFunc)ObjWturn_Init,
FLAGS, (ActorFunc)Actor_Noop, (ActorFunc)ObjWturn_Update, (ActorFunc)NULL,
GAMEPLAY_KEEP,
sizeof(ObjWturn),
(ActorFunc)ObjWturn_Init,
(ActorFunc)Actor_Noop,
(ActorFunc)ObjWturn_Update,
(ActorFunc)NULL,
}; };
#endif void ObjWturn_Init(Actor* thisx, GlobalContext* globalCtx) {
ObjWturn* this = THIS;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Wturn/ObjWturn_Init.s") func_808A7954(this);
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Wturn/func_808A7954.s") void func_808A7954(ObjWturn* this) {
this->actionFunc = func_808A7968;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Wturn/func_808A7968.s") void func_808A7968(ObjWturn* this, GlobalContext* globalCtx) {
if (globalCtx->msgCtx.ocarinaMode >= 28 && globalCtx->msgCtx.ocarinaMode < 39) {
Flags_UnsetSwitch(globalCtx, this->actor.params);
Actor_MarkForDeath(&this->actor);
} else if ((Flags_GetSwitch(globalCtx, this->actor.params) && (globalCtx->sceneNum == SCENE_F40)) ||
(!Flags_GetSwitch(globalCtx, this->actor.params) && (globalCtx->sceneNum == SCENE_F41))) {
func_808A7A24(this);
}
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Wturn/func_808A7A24.s") void func_808A7A24(ObjWturn* this) {
ActorCutscene_SetIntentToPlay(this->actor.cutscene);
this->actionFunc = func_808A7A5C;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Wturn/func_808A7A5C.s") void func_808A7A5C(ObjWturn* this, GlobalContext* globalCtx) {
if (ActorCutscene_GetCanPlayNext(this->actor.cutscene)) {
func_808A7AAC(this, globalCtx);
} else {
ActorCutscene_SetIntentToPlay(this->actor.cutscene);
}
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Wturn/func_808A7AAC.s") void func_808A7AAC(ObjWturn* this, GlobalContext* globalCtx) {
Player* player = GET_PLAYER(globalCtx);
Vec3f eye;
Vec3f at;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Wturn/func_808A7BA0.s") ActorCutscene_StartAndSetUnkLinkFields(this->actor.cutscene, &this->actor);
func_8016566C(140);
this->camId = ActorCutscene_GetCurrentCamera(this->actor.cutscene);
func_800B7298(globalCtx, &this->actor, 21);
at.x = player->actor.focus.pos.x;
at.z = player->actor.focus.pos.z;
at.y = player->actor.focus.pos.y;
eye.x = (Math_SinS(this->actor.shape.rot.y) * 150.0f) + at.x;
eye.z = (Math_CosS(this->actor.shape.rot.y) * 150.0f) + at.z;
eye.y = at.y + 4.0f;
Play_CameraSetAtEye(globalCtx, this->camId, &at, &eye);
this->actionFunc = func_808A7BA0;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Wturn/func_808A7C04.s") void func_808A7BA0(ObjWturn* this, GlobalContext* globalCtx) {
if (Math_ScaledStepToS(&this->actor.shape.rot.z, -0x8000, 0x0200)) {
func_808A7C04(this, globalCtx);
}
func_800B8FE8(&this->actor, NA_SE_EV_EARTHQUAKE - SFX_FLAG);
Play_CameraSetRoll(globalCtx, this->camId, this->actor.shape.rot.z);
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Wturn/func_808A7C78.s") void func_808A7C04(ObjWturn* this, GlobalContext* globalCtx) {
Player* player = GET_PLAYER(globalCtx);
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Wturn/ObjWturn_Update.s") this->actor.world.pos.y += this->actor.playerHeightRel;
player->actor.shape.shadowAlpha = 0;
func_800B7298(globalCtx, &this->actor, 0x54);
func_800B8E58(player, NA_SE_VO_NAVY_ENEMY);
this->unk_14A = 0;
func_80165690();
this->actionFunc = func_808A7C78;
}
void func_808A7C78(ObjWturn* this, GlobalContext* globalCtx) {
static Vec3f D_808A7DC0 = { 0.0f, -1.0f, 0.0f };
Camera* camera = Play_GetCamera(globalCtx, this->camId);
Player* player = GET_PLAYER(globalCtx);
this->unk_14A++;
player->actor.world.pos.y = this->actor.world.pos.y + this->unk_14A * 4.0f;
Play_CameraSetAtEyeUp(globalCtx, this->camId, &player->actor.focus.pos, &camera->eye, &D_808A7DC0);
if (this->unk_14A == 1) {
globalCtx->unk_1887F = 0x40;
gSaveContext.nextTransition = 3;
gSaveContext.nextCutsceneIndex = 0;
if (globalCtx->sceneNum == 0x58) {
globalCtx->nextEntranceIndex = 0xAC00;
} else {
globalCtx->nextEntranceIndex = 0xAA10;
}
globalCtx->sceneLoadFlag = 0x14;
}
}
void ObjWturn_Update(Actor* thisx, GlobalContext* globalCtx) {
ObjWturn* this = THIS;
this->actionFunc(this, globalCtx);
}

View File

@ -10,7 +10,8 @@ typedef void (*ObjWturnActionFunc)(struct ObjWturn*, GlobalContext*);
typedef struct ObjWturn { typedef struct ObjWturn {
/* 0x0000 */ Actor actor; /* 0x0000 */ Actor actor;
/* 0x0144 */ ObjWturnActionFunc actionFunc; /* 0x0144 */ ObjWturnActionFunc actionFunc;
/* 0x0148 */ char unk_148[0x4]; /* 0x0148 */ s16 camId;
/* 0x014A */ s16 unk_14A;
} ObjWturn; // size = 0x14C } ObjWturn; // size = 0x14C
extern const ActorInit Obj_Wturn_InitVars; extern const ActorInit Obj_Wturn_InitVars;