summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLucas Shaw <49287729+shawlucas@users.noreply.github.com>2020-12-02 13:00:24 -0700
committerGitHub <noreply@github.com>2020-12-02 15:00:24 -0500
commita9dc74770909068ef23a6a6ad5158cd426794d4e (patch)
tree8985f182808314c8dc73364ae4ba2ab04e8179d3 /src
parenta7b63232280b9820371b6cb135a9921e7c81b302 (diff)
ovl_En_Gm OK (#407)
* im tired so done for tonight * decompiled * z_en_gm remove reloc * added description * weird formatting fixed * MTXMODE_APPLY * Made suggested changes * update * review 2 Co-authored-by: fig <fig02srl@gmail.com>
Diffstat (limited to 'src')
-rw-r--r--src/overlays/actors/ovl_En_Gm/z_en_gm.c307
-rw-r--r--src/overlays/actors/ovl_En_Gm/z_en_gm.h15
2 files changed, 302 insertions, 20 deletions
diff --git a/src/overlays/actors/ovl_En_Gm/z_en_gm.c b/src/overlays/actors/ovl_En_Gm/z_en_gm.c
index 2704d0802..4fabc690d 100644
--- a/src/overlays/actors/ovl_En_Gm/z_en_gm.c
+++ b/src/overlays/actors/ovl_En_Gm/z_en_gm.c
@@ -1,4 +1,11 @@
+/*
+ * File: z_en_gm.c
+ * Overlay: ovl_En_Gm
+ * Description: Medi-Goron
+ */
+
#include "z_en_gm.h"
+#include "vt.h"
#define FLAGS 0x00000019
@@ -7,8 +14,22 @@
void EnGm_Init(Actor* thisx, GlobalContext* globalCtx);
void EnGm_Destroy(Actor* thisx, GlobalContext* globalCtx);
void EnGm_Update(Actor* thisx, GlobalContext* globalCtx);
+void EnGm_Draw(Actor* thisx, GlobalContext* globalCtx);
+
+void func_80A3D838(EnGm* this, GlobalContext* globalCtx);
+void func_80A3DFBC(EnGm* this, GlobalContext* globalCtx);
+void func_80A3DB04(EnGm* this, GlobalContext* globalCtx);
+void func_80A3DC44(EnGm* this, GlobalContext* globalCtx);
+void func_80A3DBF4(EnGm* this, GlobalContext* globalCtx);
+void func_80A3DD7C(EnGm* this, GlobalContext* globalCtx);
+void EnGm_ProcessChoiceIndex(EnGm* this, GlobalContext* globalCtx);
+void func_80A3DF00(EnGm* this, GlobalContext* globalCtx);
+void func_80A3DF60(EnGm* this, GlobalContext* globalCtx);
+
+extern UNK_TYPE D_0600DE80[];
+extern FlexSkeletonHeader D_0600FEF0;
+extern AnimationHeader D_060002B8;
-/*
const ActorInit En_Gm_InitVars = {
ACTOR_EN_GM,
ACTORTYPE_NPC,
@@ -20,37 +41,285 @@ const ActorInit En_Gm_InitVars = {
(ActorFunc)EnGm_Update,
NULL,
};
-*/
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Gm/EnGm_Init.s")
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Gm/EnGm_Destroy.s")
+static ColliderCylinderInit_Set3 sCylinderInit = {
+ { COLTYPE_UNK10, 0x00, 0x00, 0x39, COLSHAPE_CYLINDER },
+ { 0x00, { 0x00000000, 0x00, 0x00 }, { 0x00000000, 0x00, 0x00 }, 0x00, 0x00, 0x01 },
+ { 100, 120, 0, { 0, 0, 0 } },
+};
+
+static InitChainEntry sInitChain[] = {
+ ICHAIN_U8(unk_1F, 5, ICHAIN_CONTINUE),
+ ICHAIN_F32(unk_4C, 30, ICHAIN_STOP),
+};
+
+void EnGm_Init(Actor* thisx, GlobalContext* globalCtx) {
+ EnGm* this = THIS;
+
+ Actor_ProcessInitChain(&this->actor, sInitChain);
+
+ // Medi Goron"
+ osSyncPrintf(VT_FGCOL(GREEN) "%s[%d] : 中ゴロン[%d]" VT_RST "\n", "../z_en_gm.c", 133, this->actor.params);
+
+ this->objGmBankIndex = Object_GetIndex(&globalCtx->objectCtx, OBJECT_GM);
+
+ if (this->objGmBankIndex < 0) {
+ osSyncPrintf(VT_COL(RED, WHITE));
+ // "There is no model bank! !! (Medi Goron)"
+ osSyncPrintf("モデル バンクが無いよ!!(中ゴロン)\n");
+ osSyncPrintf(VT_RST);
+ __assert("0", "../z_en_gm.c", 145);
+ }
+
+ this->updateFunc = func_80A3D838;
+}
+
+void EnGm_Destroy(Actor* thisx, GlobalContext* globalCtx) {
+ EnGm* this = THIS;
+
+ Collider_DestroyCylinder(globalCtx, &this->collider);
+}
+
+s32 func_80A3D7C8(void) {
+ if (LINK_AGE_IN_YEARS == YEARS_CHILD) {
+ return 0;
+ } else if (!(gBitFlags[2] & gSaveContext.inventory.equipment)) {
+ return 1;
+ } else if (gBitFlags[3] & gSaveContext.inventory.equipment) {
+ return 2;
+ } else {
+ return 3;
+ }
+}
+
+void func_80A3D838(EnGm* this, GlobalContext* globalCtx) {
+ if (Object_IsLoaded(&globalCtx->objectCtx, this->objGmBankIndex)) {
+ this->actor.flags &= ~0x10;
+ SkelAnime_InitFlex(globalCtx, &this->skelAnime, &D_0600FEF0, NULL, this->limbDrawTable,
+ this->transitionDrawTable, 18);
+ gSegments[6] = VIRTUAL_TO_PHYSICAL(globalCtx->objectCtx.status[this->objGmBankIndex].segment);
+ SkelAnime_ChangeAnim(&this->skelAnime, &D_060002B8, 1.0f, 0.0f,
+ SkelAnime_GetFrameCount(&D_060002B8.genericHeader), 0, 0.0f);
+ this->actor.draw = EnGm_Draw;
+ Collider_InitCylinder(globalCtx, &this->collider);
+ Collider_SetCylinder_Set3(globalCtx, &this->collider, &this->actor, &sCylinderInit);
+ ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawFunc_Circle, 35.0f);
+ Actor_SetScale(&this->actor, 0.05f);
+ this->actor.colChkInfo.mass = 0xFF;
+ this->eyeTexIndex = 0;
+ this->blinkTimer = 20;
+ this->actor.textId = 0x3049;
+ this->updateFunc = func_80A3DFBC;
+ this->actionFunc = func_80A3DB04;
+ this->actor.speedXZ = 0.0f;
+ this->actor.gravity = -1.0f;
+ this->actor.velocity.y = 0.0f;
+ }
+}
+
+void EnGm_UpdateEye(EnGm* this) {
+ if (this->blinkTimer != 0) {
+ this->blinkTimer--;
+ } else {
+ this->eyeTexIndex++;
+
+ if (this->eyeTexIndex >= 3) {
+ this->eyeTexIndex = 0;
+ this->blinkTimer = Math_Rand_ZeroFloat(60.0f) + 20.0f;
+ }
+ }
+}
+
+void EnGm_SetTextID(EnGm* this) {
+ switch (func_80A3D7C8()) {
+ case 0:
+ if (gSaveContext.infTable[11] & 1) {
+ this->actor.textId = 0x304B;
+ } else {
+ this->actor.textId = 0x304A;
+ }
+ break;
+ case 1:
+ if (gSaveContext.infTable[11] & 2) {
+ this->actor.textId = 0x304F;
+ } else {
+ this->actor.textId = 0x304C;
+ }
+ break;
+ case 2:
+ this->actor.textId = 0x304E;
+ break;
+ case 3:
+ this->actor.textId = 0x304D;
+ break;
+ }
+}
+
+void func_80A3DB04(EnGm* this, GlobalContext* globalCtx) {
+ f32 dx;
+ f32 dz;
+ Player* player = PLAYER;
+
+ dx = this->talkPos.x - player->actor.posRot.pos.x;
+ dz = this->talkPos.z - player->actor.posRot.pos.z;
+
+ if (Flags_GetSwitch(globalCtx, this->actor.params)) {
+ EnGm_SetTextID(this);
+ this->actionFunc = func_80A3DC44;
+ } else if (func_8002F194(&this->actor, globalCtx)) {
+ this->actionFunc = func_80A3DBF4;
+ } else if ((this->collider.base.maskA & 2) || (SQ(dx) + SQ(dz)) < SQ(100.0f)) {
+ this->collider.base.acFlags &= ~2;
+ func_8002F2CC(&this->actor, globalCtx, 415.0f);
+ }
+}
+
+void func_80A3DBF4(EnGm* this, GlobalContext* globalCtx) {
+ if ((func_8010BDBC(&globalCtx->msgCtx) == 6) && func_80106BC8(globalCtx)) {
+ this->actionFunc = func_80A3DB04;
+ }
+}
+
+void func_80A3DC44(EnGm* this, GlobalContext* globalCtx) {
+ f32 dx;
+ f32 dz;
+ s32 pad;
+ Player* player = PLAYER;
+
+ EnGm_SetTextID(this);
+
+ dx = this->talkPos.x - player->actor.posRot.pos.x;
+ dz = this->talkPos.z - player->actor.posRot.pos.z;
+
+ if (func_8002F194(&this->actor, globalCtx)) {
+ switch (func_80A3D7C8()) {
+ case 0:
+ gSaveContext.infTable[11] |= 1;
+ case 3:
+ this->actionFunc = func_80A3DD7C;
+ return;
+ case 1:
+ gSaveContext.infTable[11] |= 2;
+ case 2:
+ this->actionFunc = EnGm_ProcessChoiceIndex;
+ default:
+ return;
+ }
+
+ this->actionFunc = EnGm_ProcessChoiceIndex;
+ }
+ if ((this->collider.base.maskA & 2) || (SQ(dx) + SQ(dz)) < SQ(100.0f)) {
+ this->collider.base.acFlags &= ~2;
+ func_8002F2CC(&this->actor, globalCtx, 415.0f);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Gm/func_80A3D7C8.s")
+void func_80A3DD7C(EnGm* this, GlobalContext* globalCtx) {
+ u8 dialogState = func_8010BDBC(&globalCtx->msgCtx);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Gm/func_80A3D838.s")
+ if ((dialogState == 6 || dialogState == 5) && func_80106BC8(globalCtx)) {
+ this->actionFunc = func_80A3DC44;
+ if (dialogState == 5) {
+ globalCtx->msgCtx.msgMode = 0x36;
+ globalCtx->msgCtx.unk_E3E7 = 4;
+ }
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Gm/func_80A3D9D8.s")
+void EnGm_ProcessChoiceIndex(EnGm* this, GlobalContext* globalCtx) {
+ if (func_8010BDBC(&globalCtx->msgCtx) == 4 && func_80106BC8(globalCtx)) {
+ switch (globalCtx->msgCtx.choiceIndex) {
+ case 0: // yes
+ if (gSaveContext.rupees < 200) {
+ func_8010B720(globalCtx, 0xC8);
+ this->actionFunc = func_80A3DD7C;
+ } else {
+ func_8002F434(&this->actor, globalCtx, GI_SWORD_KNIFE, 415.0f, 10.0f);
+ this->actionFunc = func_80A3DF00;
+ }
+ break;
+ case 1: // no
+ func_8010B720(globalCtx, 0x3050);
+ this->actionFunc = func_80A3DD7C;
+ break;
+ }
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Gm/func_80A3DA50.s")
+void func_80A3DF00(EnGm* this, GlobalContext* globalCtx) {
+ if (Actor_HasParent(&this->actor, globalCtx)) {
+ this->actor.parent = NULL;
+ this->actionFunc = func_80A3DF60;
+ } else {
+ func_8002F434(&this->actor, globalCtx, GI_SWORD_KNIFE, 415.0f, 10.0f);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Gm/func_80A3DB04.s")
+void func_80A3DF60(EnGm* this, GlobalContext* globalCtx) {
+ if ((func_8010BDBC(&globalCtx->msgCtx) == 6) && func_80106BC8(globalCtx)) {
+ Rupees_ChangeBy(-200);
+ this->actionFunc = func_80A3DC44;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Gm/func_80A3DBF4.s")
+void func_80A3DFBC(EnGm* this, GlobalContext* globalCtx) {
+ gSegments[6] = VIRTUAL_TO_PHYSICAL(globalCtx->objectCtx.status[this->objGmBankIndex].segment);
+ this->timer++;
+ this->actionFunc(this, globalCtx);
+ this->actor.posRot2.rot.x = this->actor.posRot.rot.x;
+ this->actor.posRot2.rot.y = this->actor.posRot.rot.y;
+ this->actor.posRot2.rot.z = this->actor.posRot.rot.z;
+ EnGm_UpdateEye(this);
+ SkelAnime_FrameUpdateMatrix(&this->skelAnime);
+ CollisionCheck_SetOC(globalCtx, &globalCtx->colChkCtx, &this->collider.base);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Gm/func_80A3DC44.s")
+void EnGm_Update(Actor* thisx, GlobalContext* globalCtx) {
+ EnGm* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Gm/func_80A3DD7C.s")
+ this->updateFunc(this, globalCtx);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Gm/func_80A3DE10.s")
+void func_80A3E090(EnGm* this) {
+ Vec3f vec1;
+ Vec3f vec2;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Gm/func_80A3DF00.s")
+ Matrix_Push();
+ Matrix_Translate(0.0f, 0.0f, 2600.0f, MTXMODE_APPLY);
+ Matrix_RotateRPY(this->actor.posRot.rot.x, this->actor.posRot.rot.y, this->actor.posRot.rot.z, MTXMODE_APPLY);
+ vec1.x = vec1.y = vec1.z = 0.0f;
+ Matrix_MultVec3f(&vec1, &vec2);
+ this->collider.dim.pos.x = vec2.x;
+ this->collider.dim.pos.y = vec2.y;
+ this->collider.dim.pos.z = vec2.z;
+ Matrix_Pull();
+ Matrix_Push();
+ Matrix_Translate(0.0f, 0.0f, 4300.0f, MTXMODE_APPLY);
+ Matrix_RotateRPY(this->actor.posRot.rot.x, this->actor.posRot.rot.y, this->actor.posRot.rot.z, MTXMODE_APPLY);
+ vec1.x = vec1.y = vec1.z = 0.0f;
+ Matrix_MultVec3f(&vec1, &this->talkPos);
+ Matrix_Pull();
+ Matrix_Translate(0.0f, 0.0f, 3800.0f, MTXMODE_APPLY);
+ Matrix_RotateRPY(this->actor.posRot.rot.x, this->actor.posRot.rot.y, this->actor.posRot.rot.z, MTXMODE_APPLY);
+ vec1.x = vec1.y = vec1.z = 0.0f;
+ Matrix_MultVec3f(&vec1, &this->actor.posRot2.pos);
+ this->actor.posRot2.pos.y += 100.0f;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Gm/func_80A3DF60.s")
+void EnGm_Draw(Actor* thisx, GlobalContext* globalCtx) {
+ static UNK_PTR eyeTextures[] = { 0x0600CE80, 0x0600D280, 0x0600D680 };
+ EnGm* this = THIS;
+ s32 pad;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Gm/func_80A3DFBC.s")
+ OPEN_DISPS(globalCtx->state.gfxCtx, "../z_en_gm.c", 613);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Gm/EnGm_Update.s")
+ func_80093D18(globalCtx->state.gfxCtx);
+ gSPSegment(POLY_OPA_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(eyeTextures[this->eyeTexIndex]));
+ gSPSegment(POLY_OPA_DISP++, 0x09, SEGMENTED_TO_VIRTUAL(D_0600DE80));
+ SkelAnime_DrawFlexOpa(globalCtx, this->skelAnime.skeleton, this->skelAnime.limbDrawTbl, this->skelAnime.dListCount,
+ NULL, NULL, &this->actor);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Gm/func_80A3E090.s")
+ CLOSE_DISPS(globalCtx->state.gfxCtx, "../z_en_gm.c", 629);
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Gm/func_80A3E1EC.s")
+ func_80A3E090(this);
+}
diff --git a/src/overlays/actors/ovl_En_Gm/z_en_gm.h b/src/overlays/actors/ovl_En_Gm/z_en_gm.h
index 4cf1f7885..1701fa0e7 100644
--- a/src/overlays/actors/ovl_En_Gm/z_en_gm.h
+++ b/src/overlays/actors/ovl_En_Gm/z_en_gm.h
@@ -6,9 +6,22 @@
struct EnGm;
+typedef void (*EnGmUpdateFunc)(struct EnGm*, GlobalContext*);
+typedef void (*EnGmActionFunc)(struct EnGm*, GlobalContext*);
+
typedef struct EnGm {
/* 0x0000 */ Actor actor;
- /* 0x014C */ char unk_14C[0x184];
+ /* 0x014C */ SkelAnime skelAnime;
+ /* 0x0190 */ Vec3s limbDrawTable[18];
+ /* 0x01FC */ Vec3s transitionDrawTable[18];
+ /* 0x0268 */ EnGmUpdateFunc updateFunc;
+ /* 0x026C */ EnGmActionFunc actionFunc;
+ /* 0x0270 */ ColliderCylinder collider;
+ /* 0x02BC */ s8 objGmBankIndex;
+ /* 0x02BE */ s16 timer;
+ /* 0x02C0 */ s16 blinkTimer;
+ /* 0x02C2 */ u8 eyeTexIndex;
+ /* 0x02C4 */ Vec3f talkPos;
} EnGm; // size = 0x02D0
extern const ActorInit En_Gm_InitVars;