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:
parent
3e5ed389b9
commit
7d7c851289
17 changed files with 221 additions and 692 deletions
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue