diff options
| author | Lucas Shaw <49287729+shawlucas@users.noreply.github.com> | 2020-12-02 13:00:24 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-12-02 15:00:24 -0500 |
| commit | a9dc74770909068ef23a6a6ad5158cd426794d4e (patch) | |
| tree | 8985f182808314c8dc73364ae4ba2ab04e8179d3 /src | |
| parent | a7b63232280b9820371b6cb135a9921e7c81b302 (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.c | 307 | ||||
| -rw-r--r-- | src/overlays/actors/ovl_En_Gm/z_en_gm.h | 15 |
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; |
