1
0
Fork 0
mirror of https://github.com/zeldaret/oot.git synced 2025-08-06 14:20:11 +00:00

ovl_En_Heishi3 OK (#121)

* almost done with heishi3

* heishi3 ok

* Added function names to heishi3

* EnHeishi3 OK

* Made some suggested changes. Still have questions about others

* Made suggsted changes

* fixed formatting

* fixed formatting
This commit is contained in:
Lucas Shaw 2020-05-10 16:19:27 -07:00 committed by GitHub
parent 3e5ed389b9
commit 7d7c851289
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
17 changed files with 221 additions and 692 deletions

View file

@ -5,6 +5,7 @@
*/
#include "z_en_heishi3.h"
#include <vt.h>
#define FLAGS 0x00000000
@ -15,7 +16,20 @@ void EnHeishi3_Destroy(Actor* thisx, GlobalContext* globalCtx);
void EnHeishi3_Update(Actor* thisx, GlobalContext* globalCtx);
void EnHeishi3_Draw(Actor* thisx, GlobalContext* globalCtx);
/*
void EnHeishi3_SetupGuardType(EnHeishi3* this, GlobalContext* globalCtx);
void EnHeishi3_StandSentinelInGrounds(EnHeishi3* this, GlobalContext* globalCtx);
void EnHeishi3_StandSentinelInCastle(EnHeishi3* this, GlobalContext* globalCtx);
void EnHeishi3_CatchStart(EnHeishi3* this, GlobalContext* globalCtx);
void EnHeishi3_ResetAnimationToIdle(EnHeishi3* this, GlobalContext* globalCtx);
void func_80A55D00(EnHeishi3* this, GlobalContext* globalCtx);
void func_80A55BD4(EnHeishi3* this, GlobalContext* globalCtx);
extern SkeletonHeader D_0600BAC8;
extern AnimationHeader D_06005C30; // EnHeishi3_IdleAnimation
extern AnimationHeader D_06005880; // EnHeishi3_WalkAnimation
static s16 sPlayerCaught = 0;
const ActorInit En_Heishi3_InitVars = {
ACTOR_EN_HEISHI3,
ACTORTYPE_NPC,
@ -27,27 +41,196 @@ const ActorInit En_Heishi3_InitVars = {
(ActorFunc)EnHeishi3_Update,
(ActorFunc)EnHeishi3_Draw,
};
*/
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Heishi3/EnHeishi3_Init.s")
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Heishi3/EnHeishi3_Destroy.s")
static ColliderCylinderInit cylinderInit = {
{ COLTYPE_UNK10, 0x00, 0x00, 0x39, 0x20, COLSHAPE_CYLINDER },
{ 0x00, { 0x00000000, 0x00, 0x00 }, { 0x00000000, 0x00, 0x00 }, 0x00, 0x00, 0x01 },
{ 15, 70, 0, { 0, 0, 0 } },
};
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Heishi3/func_80A557A0.s")
void EnHeishi3_Init(Actor* thisx, GlobalContext* globalCtx) {
EnHeishi3* this = THIS;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Heishi3/func_80A55850.s")
sPlayerCaught = 0;
if (this->actor.params <= 0) {
this->unk_278 = 0;
} else {
this->unk_278 = 1;
if (this->actor.posRot.pos.x < -290.0f) {
this->unk_278 = 2;
}
}
Actor_SetScale(&this->actor, 0.01f);
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawFunc_Circle, 30.0f);
SkelAnime_Init(globalCtx, &this->skelAnime, &D_0600BAC8, &D_06005C30, this->limbDrawTable,
this->transitionDrawTable, 17);
this->actor.colChkInfo.mass = -1;
this->actor.unk_1F = 6;
Collider_InitCylinder(globalCtx, &this->collider);
Collider_SetCylinder(globalCtx, &this->collider, &this->actor, &cylinderInit);
// "Castle Gate Soldier - Power Up"
osSyncPrintf(VT_FGCOL(GREEN) "☆☆☆☆☆ 城門兵パワーアップ ☆☆☆☆☆ \n" VT_RST);
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Heishi3/func_80A559B4.s")
this->actor.gravity = -3.0f;
this->actor.posRot2.pos = this->actor.posRot.pos;
this->actionFunc = EnHeishi3_SetupGuardType;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Heishi3/func_80A55B2C.s")
void EnHeishi3_Destroy(Actor* thisx, GlobalContext* globalCtx) {
EnHeishi3* this = THIS;
Collider_DestroyCylinder(globalCtx, &this->collider);
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Heishi3/func_80A55BD4.s")
void EnHeishi3_SetupGuardType(EnHeishi3* this, GlobalContext* globalCtx) {
f32 frames = SkelAnime_GetFrameCount(&D_06005C30.genericHeader);
SkelAnime_ChangeAnim(&this->skelAnime, &D_06005C30, 1.0f, 0.0f, (s16)(f32)frames, 0, -10.0f);
if (this->unk_278 == 0) {
this->actionFunc = EnHeishi3_StandSentinelInGrounds;
} else {
this->actionFunc = EnHeishi3_StandSentinelInCastle;
}
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Heishi3/func_80A55C6C.s")
/**
* Handles the guards standing on Hyrule Castle Grounds.
**/
void EnHeishi3_StandSentinelInGrounds(EnHeishi3* this, GlobalContext* globalCtx) {
Player* player;
s16 yawDiff;
s16 yawDiffNew;
f32 sightRange;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Heishi3/func_80A55D00.s")
player = PLAYER;
SkelAnime_FrameUpdateMatrix(&this->skelAnime);
yawDiff = this->actor.rotTowardsLinkY - this->actor.shape.rot.y;
yawDiffNew = ABS(yawDiff);
if (yawDiffNew < 0x4300) {
if (gSaveContext.nightFlag == 0) {
sightRange = 250.0f;
} else {
sightRange = 200.0f;
}
} else {
if (gSaveContext.nightFlag == 0) {
sightRange = 150.0f;
} else {
sightRange = 100.0f;
}
}
if ((this->actor.xzDistanceFromLink < sightRange) &&
(fabsf(player->actor.posRot.pos.y - this->actor.posRot.pos.y) < 100.0f) && (sPlayerCaught == 0)) {
sPlayerCaught = 1;
func_8010B680(globalCtx, 0x702D, &this->actor); // "Hey you! Stop! You, kid, over there!"
func_80078884(NA_SE_SY_FOUND);
osSyncPrintf(VT_FGCOL(GREEN) "☆☆☆☆☆ 発見! ☆☆☆☆☆ \n" VT_RST); // "Discovered!"
func_8002DF54(globalCtx, &this->actor, 1);
this->actionFunc = EnHeishi3_CatchStart;
}
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Heishi3/EnHeishi3_Update.s")
/**
* Handles the guards standing in front of Hyrule Castle.
**/
void EnHeishi3_StandSentinelInCastle(EnHeishi3* this, GlobalContext* globalCtx) {
Player* player = PLAYER;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Heishi3/func_80A55E88.s")
SkelAnime_FrameUpdateMatrix(&this->skelAnime);
if ((player->actor.posRot.pos.x < -190.0f) && (player->actor.posRot.pos.x > -380.0f) &&
(fabsf(player->actor.posRot.pos.y - this->actor.posRot.pos.y) < 100.0f) &&
(player->actor.posRot.pos.z < 1020.0f) && (player->actor.posRot.pos.z > 700.0f) && (sPlayerCaught == 0)) {
if (this->unk_278 == 1) {
if ((player->actor.posRot.pos.x < -290.0f)) {
return;
}
} else {
if (player->actor.posRot.pos.x > -290.0f) {
return;
}
}
sPlayerCaught = 1;
func_8010B680(globalCtx, 0x702D, &this->actor); // "Hey you! Stop! You, kid, over there!"
func_80078884(NA_SE_SY_FOUND);
osSyncPrintf(VT_FGCOL(GREEN) "☆☆☆☆☆ 発見! ☆☆☆☆☆ \n" VT_RST); // "Discovered!"
func_8002DF54(globalCtx, &this->actor, 1);
this->actionFunc = EnHeishi3_CatchStart;
}
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Heishi3/EnHeishi3_Draw.s")
void EnHeishi3_CatchStart(EnHeishi3* this, GlobalContext* globalCtx) {
f32 frames = SkelAnime_GetFrameCount(&D_06005880.genericHeader);
SkelAnime_ChangeAnim(&this->skelAnime, &D_06005880, 1.0f, 0.0f, (s16)(f32)frames, 0, -10.0f);
this->caughtTimer = 20;
this->actionFunc = func_80A55BD4;
this->actor.speedXZ = 2.5f;
}
void func_80A55BD4(EnHeishi3* this, GlobalContext* globalCtx) {
SkelAnime_FrameUpdateMatrix(&this->skelAnime);
if ((func_800A56C8(&this->skelAnime, 1.0f) != 0) || (func_800A56C8(&this->skelAnime, 17.0f) != 0)) {
Audio_PlayActorSound2(&this->actor, NA_SE_EV_KNIGHT_WALK);
}
if (this->caughtTimer == 0) {
this->actionFunc = EnHeishi3_ResetAnimationToIdle;
this->actor.speedXZ = 0.0f;
} else {
Math_SmoothScaleMaxMinS(&this->actor.posRot.rot.y, this->actor.rotTowardsLinkY, 5, 3000, 0);
}
}
void EnHeishi3_ResetAnimationToIdle(EnHeishi3* this, GlobalContext* globalCtx) {
f32 frames = SkelAnime_GetFrameCount(&D_06005C30.genericHeader);
SkelAnime_ChangeAnim(&this->skelAnime, &D_06005C30, 1.0f, 0.0f, (s16)(f32)frames, 0, -10.0f);
this->actionFunc = func_80A55D00;
}
// This function initiates the respawn after the player gets caught.
void func_80A55D00(EnHeishi3* this, GlobalContext* globalCtx) {
SkelAnime_FrameUpdateMatrix(&this->skelAnime);
if ((func_8010BDBC(&globalCtx->msgCtx) == 5) && (func_80106BC8(globalCtx) != 0) && (this->respawnFlag == 0)) {
gSaveContext.eventChkInf[4] |= 0x4000;
globalCtx->nextEntranceIndex = 0x47E; // Hyrule Castle from Guard Capture (outside)
globalCtx->sceneLoadFlag = 0x14;
this->respawnFlag = 1;
globalCtx->fadeTransition = 0x2E;
gSaveContext.nextTransition = 0x2E;
}
}
void EnHeishi3_Update(Actor* thisx, GlobalContext* globalCtx) {
EnHeishi3* this = THIS;
s32 pad;
Actor_SetHeight(&this->actor, 60.0f);
this->unk_274 += 1;
if (this->caughtTimer != 0) {
this->caughtTimer -= 1;
}
this->actionFunc(this, globalCtx);
this->actor.shape.rot = this->actor.posRot.rot;
Actor_MoveForward(&this->actor);
func_8002E4B4(globalCtx, &this->actor, 20.0f, 20.0f, 50.0f, 0x1C);
Collider_CylinderUpdate(&this->actor, &this->collider);
CollisionCheck_SetOC(globalCtx, &globalCtx->colChkCtx, &this->collider);
}
s32 EnHeishi3_OverrideLimbDraw(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot,
Actor* thisx) {
EnHeishi3* this = THIS;
if (limbIndex == 9) {
rot->x += this->unk_26E;
}
if (limbIndex == 16) {
rot->x += this->unk_262;
rot->z += this->unk_264;
}
return 0;
}
void EnHeishi3_Draw(Actor* thisx, GlobalContext* globalCtx) {
EnHeishi3* this = THIS;
func_80093D18(globalCtx->state.gfxCtx);
SkelAnime_Draw(globalCtx, this->skelAnime.skeleton, this->skelAnime.limbDrawTbl, EnHeishi3_OverrideLimbDraw, NULL,
&this->actor);
}

View file

@ -6,9 +6,26 @@
struct EnHeishi3;
typedef void (*EnHeishi3ActionFunc)(struct EnHeishi3*, GlobalContext*);
typedef struct EnHeishi3 {
/* 0x0000 */ Actor actor;
/* 0x014C */ char unk_14C[0x17C];
/* 0x014C */ SkelAnime skelAnime;
/* 0x0190 */ Vec3s limbDrawTable[17];
/* 0x01F6 */ Vec3s transitionDrawTable[17];
/* 0x025C */ EnHeishi3ActionFunc actionFunc;
/* 0x0260 */ char unk_260[0x2];
/* 0x0262 */ s16 unk_262;
/* 0x0264 */ s16 unk_264;
/* 0x0266 */ char unk_266[0x8];
/* 0x026E */ s16 unk_26E; // All these s16 are probably part of a Vec3s
/* 0x0270 */ char unk_270[0x2];
/* 0x0272 */ s16 caughtTimer;
/* 0x0274 */ s16 unk_274;
/* 0x0276 */ u8 respawnFlag; // set to 1 when reloading area after being thrown out
/* 0x0278 */ s16 unk_278;
/* 0x027A */ char unk_27A[0x2];
/* 0x027C */ ColliderCylinder collider;
} EnHeishi3; // size = 0x02C8
extern const ActorInit En_Heishi3_InitVars;