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

Gerudo objects (#757)

* object_ge1

* more stuff named

* object_gla OK, symbols added to C

* eff fire fix in gameplay_keep

* object_nb OK, fixed gameplay_keep

* replaced symbols in EnNb, limb enums

* Change EnGeldB limb enums to hex

* Use enum in header too

* Add descriptions to EnGe2 and EnNb, rearrange xml

* Reorder xml

* review changes
This commit is contained in:
EllipticEllipsis 2021-04-10 17:25:03 +01:00 committed by GitHub
parent c04806fc66
commit 8d2a2a8e46
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 466 additions and 160 deletions

View file

@ -1,5 +1,12 @@
/*
* File: z_en_ge1.c
* Overlay: ovl_En_Ge1
* Description: White-clothed Gerudo
*/
#include "z_en_ge1.h"
#include "vt.h"
#include "objects/object_ge1/object_ge1.h"
#define FLAGS 0x00000009
@ -13,7 +20,7 @@
typedef enum {
/* 00 */ GE1_HAIR_BOB,
/* 01 */ GE1_HAIR_STRAIGHT,
/* 02 */ GE1_HAIR_SPIKEY
/* 02 */ GE1_HAIR_SPIKY
} EnGe1Hairstyle;
void EnGe1_Init(Actor* thisx, GlobalContext* globalCtx);
@ -67,36 +74,31 @@ static ColliderCylinderInit sCylinderInit = {
};
static Gfx* sHairstyleDLists[] = {
0x06009198, // Bob
0x06009430, // Straight with fringe
0x06009690, // Spikey
gGerudoWhiteHairstyleBobDL,
gGerudoWhiteHairstyleStraightFringeDL,
gGerudoWhiteHairstyleSpikyDL,
};
static Vec3f D_80A327A8 = { 600.0f, 700.0f, 0.0f };
static u64* sEyeTextures[] = {
0x06000708, // Mostly Open
0x06000F08, // Half
0x06001708, // Closed
gGerudoWhiteEyeOpenTex,
gGerudoWhiteEyeHalfTex,
gGerudoWhiteEyeClosedTex,
};
extern AnimationHeader D_06000228; // Idle, arms crossed
extern FlexSkeletonHeader D_06000330;
extern AnimationHeader D_0600A048; // Clap
extern AnimationHeader D_0600A498; // Dismissive gesture
void EnGe1_Init(Actor* thisx, GlobalContext* globalCtx) {
s32 pad;
EnGe1* this = THIS;
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 30.0f);
SkelAnime_InitFlex(globalCtx, &this->skelAnime, &D_06000330, &D_06000228, this->jointTable, this->morphTable,
GE1_LIMB_MAX);
Animation_PlayOnce(&this->skelAnime, &D_06000228);
SkelAnime_InitFlex(globalCtx, &this->skelAnime, &gGerudoWhiteSkel, &gGerudoWhiteIdleAnim, this->jointTable,
this->morphTable, GE1_LIMB_MAX);
Animation_PlayOnce(&this->skelAnime, &gGerudoWhiteIdleAnim);
Collider_InitCylinder(globalCtx, &this->collider);
Collider_SetCylinder(globalCtx, &this->collider, &this->actor, &sCylinderInit);
this->actor.colChkInfo.mass = MASS_IMMOVABLE;
this->animation = &D_06000228;
this->animation = &gGerudoWhiteIdleAnim;
this->animFunc = EnGe1_CueUpAnimation;
this->actor.targetMode = 6;
Actor_SetScale(&this->actor, 0.01f);
@ -107,12 +109,13 @@ void EnGe1_Init(Actor* thisx, GlobalContext* globalCtx) {
switch (this->actor.params & 0xFF) {
case GE1_TYPE_GATE_GUARD:
this->hairstyle = GE1_HAIR_SPIKEY;
this->hairstyle = GE1_HAIR_SPIKY;
this->actionFunc = EnGe1_GetReaction_GateGuard;
break;
case GE1_TYPE_GATE_OPERATOR:
this->hairstyle = GE1_HAIR_STRAIGHT;
if (EnGe1_CheckCarpentersFreed()) {
this->actionFunc = EnGe1_CheckGate_GateOp;
} else {
@ -122,6 +125,7 @@ void EnGe1_Init(Actor* thisx, GlobalContext* globalCtx) {
case GE1_TYPE_NORMAL:
this->hairstyle = GE1_HAIR_STRAIGHT;
if (EnGe1_CheckCarpentersFreed()) {
this->actionFunc = EnGe1_SetNormalText;
} else {
@ -169,6 +173,7 @@ void EnGe1_Init(Actor* thisx, GlobalContext* globalCtx) {
}
break;
}
this->stateFlags = 0;
}
@ -183,23 +188,25 @@ s32 EnGe1_SetTalkAction(EnGe1* this, GlobalContext* globalCtx, u16 textId, f32 a
this->actionFunc = actionFunc;
this->animFunc = EnGe1_StopFidget;
this->stateFlags &= ~GE1_STATE_IDLE_ANIM;
this->animation = &D_06000228;
Animation_Change(&this->skelAnime, &D_06000228, 1.0f, 0.0f, Animation_GetLastFrame(&D_06000228), ANIMMODE_ONCE,
-8.0f);
this->animation = &gGerudoWhiteIdleAnim;
Animation_Change(&this->skelAnime, &gGerudoWhiteIdleAnim, 1.0f, 0.0f,
Animation_GetLastFrame(&gGerudoWhiteIdleAnim), ANIMMODE_ONCE, -8.0f);
return true;
}
this->actor.textId = textId;
if (this->actor.xzDistToPlayer < arg3) {
func_8002F2CC(&this->actor, globalCtx, arg3);
}
return false;
}
void EnGe1_SetAnimationIdle(EnGe1* this) {
Animation_Change(&this->skelAnime, &D_06000228, -1.0f, Animation_GetLastFrame(&D_06000228), 0.0f, ANIMMODE_ONCE,
8.0f);
this->animation = &D_06000228;
Animation_Change(&this->skelAnime, &gGerudoWhiteIdleAnim, -1.0f, Animation_GetLastFrame(&gGerudoWhiteIdleAnim),
0.0f, ANIMMODE_ONCE, 8.0f);
this->animation = &gGerudoWhiteIdleAnim;
this->animFunc = EnGe1_CueUpAnimation;
}
@ -225,7 +232,7 @@ void EnGe1_KickPlayer(EnGe1* this, GlobalContext* globalCtx) {
if ((INV_CONTENT(ITEM_HOOKSHOT) == ITEM_NONE) || (INV_CONTENT(ITEM_LONGSHOT) == ITEM_NONE)) {
globalCtx->nextEntranceIndex = 0x1A5;
} else if (gSaveContext.eventChkInf[12] & 0x80) {
} else if (gSaveContext.eventChkInf[12] & 0x80) { // Caught previously
globalCtx->nextEntranceIndex = 0x5F8;
} else {
globalCtx->nextEntranceIndex = 0x3B4;
@ -254,6 +261,7 @@ void EnGe1_WatchForPlayerFrontOnly(EnGe1* this, GlobalContext* globalCtx) {
if (this->collider.base.acFlags & AC_HIT) {
EnGe1_SpotPlayer(this, globalCtx);
}
CollisionCheck_SetAC(globalCtx, &globalCtx->colChkCtx, &this->collider.base);
}
@ -265,13 +273,16 @@ void EnGe1_ChooseActionFromTextId(EnGe1* this, GlobalContext* globalCtx) {
case 0x6001:
this->actionFunc = EnGe1_SetNormalText;
break;
case 0x601A:
case 0x6019:
this->actionFunc = EnGe1_GetReaction_ValleyFloor;
break;
case 0x6018:
this->actionFunc = EnGe1_CheckGate_GateOp;
break;
default:
this->actionFunc = EnGe1_GetReaction_ValleyFloor;
break;
@ -333,9 +344,9 @@ void EnGe1_Open_GTGGuard(EnGe1* this, GlobalContext* globalCtx) {
void EnGe1_SetupOpen_GTGGuard(EnGe1* this, GlobalContext* globalCtx) {
if ((func_8010BDBC(&globalCtx->msgCtx) == 5) && func_80106BC8(globalCtx)) {
this->actionFunc = EnGe1_Open_GTGGuard;
Animation_Change(&this->skelAnime, &D_0600A048, 1.0f, 0.0f, Animation_GetLastFrame(&D_0600A048), ANIMMODE_ONCE,
-3.0f);
this->animation = &D_0600A048;
Animation_Change(&this->skelAnime, &gGerudoWhiteClapAnim, 1.0f, 0.0f,
Animation_GetLastFrame(&gGerudoWhiteClapAnim), ANIMMODE_ONCE, -3.0f);
this->animation = &gGerudoWhiteClapAnim;
this->animFunc = EnGe1_StopFidget;
this->stateFlags &= ~GE1_STATE_IDLE_ANIM;
}
@ -428,9 +439,9 @@ void EnGe1_SetupOpenGate_GateOp(EnGe1* this, GlobalContext* globalCtx) {
if ((func_8010BDBC(&globalCtx->msgCtx) == 5) && func_80106BC8(globalCtx)) {
this->actionFunc = EnGe1_OpenGate_GateOp;
Animation_Change(&this->skelAnime, &D_0600A048, 1.0f, 0.0f, Animation_GetLastFrame(&D_0600A048), ANIMMODE_ONCE,
-3.0f);
this->animation = &D_0600A048;
Animation_Change(&this->skelAnime, &gGerudoWhiteClapAnim, 1.0f, 0.0f,
Animation_GetLastFrame(&gGerudoWhiteClapAnim), ANIMMODE_ONCE, -3.0f);
this->animation = &gGerudoWhiteClapAnim;
this->animFunc = EnGe1_StopFidget;
this->stateFlags &= ~GE1_STATE_IDLE_ANIM;
}
@ -466,9 +477,9 @@ void EnGe1_GetReaction_GateGuard(EnGe1* this, GlobalContext* globalCtx) {
if (EnGe1_SetTalkAction(this, globalCtx, reactionText, 100.0f, EnGe1_Talk_GateGuard)) {
this->animFunc = EnGe1_CueUpAnimation;
this->animation = &D_0600A498;
Animation_Change(&this->skelAnime, &D_0600A498, 1.0f, 0.0f, Animation_GetLastFrame(&D_0600A498), ANIMMODE_ONCE,
-8.0f);
this->animation = &gGerudoWhiteDismissiveAnim;
Animation_Change(&this->skelAnime, &gGerudoWhiteDismissiveAnim, 1.0f, 0.0f,
Animation_GetLastFrame(&gGerudoWhiteDismissiveAnim), ANIMMODE_ONCE, -8.0f);
}
}
@ -516,6 +527,7 @@ void EnGe1_BeginGiveItem_Archery(EnGe1* this, GlobalContext* globalCtx) {
this->actor.flags &= ~0x10000;
this->actionFunc = EnGe1_WaitTillItemGiven_Archery;
}
if (this->stateFlags & GE1_STATE_GIVE_QUIVER) {
switch (CUR_UPG_VALUE(UPG_QUIVER)) {
//! @bug Asschest: the compiler inserts a default assigning *(sp+0x24) to getItemId, which is junk data left
@ -532,6 +544,7 @@ void EnGe1_BeginGiveItem_Archery(EnGe1* this, GlobalContext* globalCtx) {
} else {
getItemId = GI_HEART_PIECE;
}
func_8002F434(&this->actor, globalCtx, getItemId, 10000.0f, 50.0f);
}
@ -586,9 +599,11 @@ void EnGe1_BeginGame_Archery(EnGe1* this, GlobalContext* globalCtx) {
horse->freezeTimer = 1200;
}
}
this->actionFunc = EnGe1_WaitDoNothing;
}
break;
case 1:
this->actionFunc = EnGe1_Wait_Archery;
func_80106CCC(globalCtx);
@ -615,11 +630,11 @@ void EnGe1_TalkNoPrize_Archery(EnGe1* this, GlobalContext* globalCtx) {
void EnGe1_TalkAfterGame_Archery(EnGe1* this, GlobalContext* globalCtx) {
gSaveContext.eventInf[0] &= ~0x100;
LOG_NUM("z_common_data.yabusame_total", gSaveContext.minigameScore, "../z_en_ge1.c", 1110);
LOG_NUM("z_common_data.memory.information.room_inf[127][ 0 ]", gSaveContext.highScores[0], "../z_en_ge1.c", 1111);
LOG_NUM("z_common_data.memory.information.room_inf[127][ 0 ]", gSaveContext.highScores[HS_HBA], "../z_en_ge1.c", 1111);
this->actor.flags |= 0x10000;
if (gSaveContext.highScores[0] < gSaveContext.minigameScore) {
gSaveContext.highScores[0] = gSaveContext.minigameScore;
if (gSaveContext.highScores[HS_HBA] < gSaveContext.minigameScore) {
gSaveContext.highScores[HS_HBA] = gSaveContext.minigameScore;
}
if (gSaveContext.minigameScore < 1000) {
@ -776,10 +791,12 @@ void EnGe1_PostLimbDraw(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Ve
EnGe1* this = THIS;
OPEN_DISPS(globalCtx->state.gfxCtx, "../z_en_ge1.c", 1419);
if (limbIndex == GE1_LIMB_HEAD) {
gSPDisplayList(POLY_OPA_DISP++, sHairstyleDLists[this->hairstyle]);
Matrix_MultVec3f(&D_80A327A8, &this->actor.focus.pos);
}
CLOSE_DISPS(globalCtx->state.gfxCtx, "../z_en_ge1.c", 1427);
}
@ -788,9 +805,11 @@ void EnGe1_Draw(Actor* thisx, GlobalContext* globalCtx) {
EnGe1* this = THIS;
OPEN_DISPS(globalCtx->state.gfxCtx, "../z_en_ge1.c", 1442);
func_800943C8(globalCtx->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(sEyeTextures[this->eyeIndex]));
SkelAnime_DrawFlexOpa(globalCtx, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnGe1_OverrideLimbDraw, EnGe1_PostLimbDraw, this);
CLOSE_DISPS(globalCtx->state.gfxCtx, "../z_en_ge1.c", 1459);
}

View file

@ -1,6 +1,12 @@
/*
* File: z_en_ge2.c
* Overlay: ovl_En_Ge2
* Description: Purple-clothed Gerudo
*/
#include "z_en_ge2.h"
#include "vt.h"
#include "objects/object_gla/object_gla.h"
#define FLAGS 0x00000019
@ -90,13 +96,9 @@ static EnGe2ActionFunc sActionFuncs[] = {
};
static AnimationHeader* sAnimations[] = {
0x06009ED4, // Walking, spear on shoulder
0x060098AC, // Standing, looking left and right
0x060098AC,
0x060011F4, // Falling to ground
0x060098AC,
0x06008D60, // Runnng, spear in attack position
0x060098AC, 0x060098AC, 0x060098AC,
&gGerudoPurpleWalkingAnim, &gGerudoPurpleLookingAboutAnim, &gGerudoPurpleLookingAboutAnim,
&gGerudoPurpleFallingToGroundAnim, &gGerudoPurpleLookingAboutAnim, &gGerudoPurpleChargingAnim,
&gGerudoPurpleLookingAboutAnim, &gGerudoPurpleLookingAboutAnim, &gGerudoPurpleLookingAboutAnim,
};
static u8 sAnimModes[] = {
@ -104,9 +106,6 @@ static u8 sAnimModes[] = {
ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_ONCE,
};
extern FlexSkeletonHeader D_06008968;
extern AnimationHeader D_06009ED4;
void EnGe2_ChangeAction(EnGe2* this, s32 i) {
this->actionFunc = sActionFuncs[i];
Animation_Change(&this->skelAnime, sAnimations[i], 1.0f, 0.0f, Animation_GetLastFrame(sAnimations[i]),
@ -119,8 +118,8 @@ void EnGe2_Init(Actor* thisx, GlobalContext* globalCtx) {
EnGe2* this = THIS;
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 36.0f);
SkelAnime_InitFlex(globalCtx, &this->skelAnime, &D_06008968, NULL, this->jointTable, this->morphTable, 22);
Animation_PlayLoop(&this->skelAnime, &D_06009ED4);
SkelAnime_InitFlex(globalCtx, &this->skelAnime, &gGerudoPurpleSkel, NULL, this->jointTable, this->morphTable, 22);
Animation_PlayLoop(&this->skelAnime, &gGerudoPurpleWalkingAnim);
Collider_InitCylinder(globalCtx, &this->collider);
Collider_SetCylinder(globalCtx, &this->collider, &this->actor, &sCylinderInit);
this->actor.colChkInfo.mass = MASS_IMMOVABLE;
@ -644,9 +643,9 @@ void EnGe2_PostLimbDraw(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Ve
}
static u64* sEyeTextures[] = {
0x06004F78, // Half-open
0x06005578, // Quarter-open
0x06005BF8, // Closed
gGerudoPurpleEyeOpenTex,
gGerudoPurpleEyeHalfTex,
gGerudoPurpleEyeClosedTex,
};
void EnGe2_Draw(Actor* thisx, GlobalContext* globalCtx) {

View file

@ -7,31 +7,31 @@
struct EnGeldB;
typedef enum {
/* 00 */ GELDB_LIMB_NONE,
/* 01 */ GELDB_LIMB_ROOT,
/* 02 */ GELDB_LIMB_TORSO,
/* 03 */ GELDB_LIMB_NECK,
/* 04 */ GELDB_LIMB_PONYTAIL,
/* 05 */ GELDB_LIMB_VEIL,
/* 06 */ GELDB_LIMB_HEAD,
/* 07 */ GELDB_LIMB_R_UPPER_ARM,
/* 08 */ GELDB_LIMB_R_FOREARM,
/* 09 */ GELDB_LIMB_R_WRIST,
/* 10 */ GELDB_LIMB_R_HAND,
/* 11 */ GELDB_LIMB_R_SWORD,
/* 12 */ GELDB_LIMB_L_UPPER_ARM,
/* 13 */ GELDB_LIMB_L_FOREARM,
/* 14 */ GELDB_LIMB_L_WRIST,
/* 15 */ GELDB_LIMB_L_HAND,
/* 16 */ GELDB_LIMB_L_SWORD,
/* 17 */ GELDB_LIMB_L_THIGH,
/* 18 */ GELDB_LIMB_L_SHIN,
/* 19 */ GELDB_LIMB_L_FOOT,
/* 20 */ GELDB_LIMB_R_THIGH,
/* 21 */ GELDB_LIMB_R_SHIN,
/* 22 */ GELDB_LIMB_R_FOOT,
/* 23 */ GELDB_LIMB_WAIST,
/* 24 */ GELDB_LIMB_MAX
/* 0x00 */ GELDB_LIMB_NONE,
/* 0x01 */ GELDB_LIMB_ROOT,
/* 0x02 */ GELDB_LIMB_TORSO,
/* 0x03 */ GELDB_LIMB_NECK,
/* 0x04 */ GELDB_LIMB_PONYTAIL,
/* 0x05 */ GELDB_LIMB_VEIL,
/* 0x06 */ GELDB_LIMB_HEAD,
/* 0x07 */ GELDB_LIMB_R_UPPER_ARM,
/* 0x08 */ GELDB_LIMB_R_FOREARM,
/* 0x09 */ GELDB_LIMB_R_WRIST,
/* 0x0A */ GELDB_LIMB_R_HAND,
/* 0x0B */ GELDB_LIMB_R_SWORD,
/* 0x0C */ GELDB_LIMB_L_UPPER_ARM,
/* 0x0D */ GELDB_LIMB_L_FOREARM,
/* 0x0E */ GELDB_LIMB_L_WRIST,
/* 0x0F */ GELDB_LIMB_L_HAND,
/* 0x10 */ GELDB_LIMB_L_SWORD,
/* 0x11 */ GELDB_LIMB_L_THIGH,
/* 0x12 */ GELDB_LIMB_L_SHIN,
/* 0x13 */ GELDB_LIMB_L_FOOT,
/* 0x14 */ GELDB_LIMB_R_THIGH,
/* 0x15 */ GELDB_LIMB_R_SHIN,
/* 0x16 */ GELDB_LIMB_R_FOOT,
/* 0x17 */ GELDB_LIMB_WAIST,
/* 0x18 */ GELDB_LIMB_MAX
} EnGeldBLimb;
typedef void (*EnGeldBActionFunc)(struct EnGeldB*, GlobalContext*);

View file

@ -1,5 +1,12 @@
/*
* File: z_en_nb.c
* Overlay: ovl_En_Nb
* Description: Nabooru
*/
#include "z_en_nb.h"
#include "vt.h"
#include "objects/object_nb/object_nb.h"
#define FLAGS 0x00000010
@ -52,32 +59,6 @@ void EnNb_Destroy(Actor* thisx, GlobalContext* globalCtx);
void EnNb_Update(Actor* thisx, GlobalContext* globalCtx);
void EnNb_Draw(Actor* thisx, GlobalContext* globalCtx);
extern FlexSkeletonHeader D_060181C8;
extern AnimationHeader D_06004BB4; // standing up hands on hips
extern AnimationHeader D_06006E78;
extern AnimationHeader D_06004E60; // getting up from crawlspace
extern AnimationHeader D_06004BB4;
extern AnimationHeader D_06009238;
extern AnimationHeader D_06009694; // hands on hips standing
extern AnimationHeader D_0600274C; // raising both arms up transition (giving medallion to link ?)
extern AnimationHeader D_06002B4C; // raising both arms up stable (giving medallion to link ?)
extern AnimationHeader D_06000410; // clasping hands together
extern AnimationHeader D_06001E7C; // looking around ?
extern AnimationHeader D_06001350; // i think this is the animation where she is in the purple thing
extern AnimationHeader D_06001104; // transition to raising arm up in purple portal
extern AnimationHeader D_06008BD0; // falls to the ground
extern AnimationHeader D_060046A8; // looking in crawlspace ?
extern AnimationHeader D_06003954; // on ground getting up ??
extern AnimationHeader D_06004030; // looking behind her to the right
extern AnimationHeader D_06002DBC; // freaking out
extern AnimationHeader D_060035A8; // looking behind her
extern AnimationHeader D_06006320; // sees unk from behind, turns and runs
extern AnimationHeader D_06000BC0; // crossed legs
extern AnimationHeader D_06005CA4; // crossed legs, turns head and looks behind to the right
extern AnimationHeader D_06005614; // crossed legs, looking behind to the right
extern Gfx D_06013158[];
extern UNK_TYPE D_0600D8E8;
static ColliderCylinderInitType1 sCylinderInit = {
{
COLTYPE_HIT0,
@ -97,10 +78,10 @@ static ColliderCylinderInitType1 sCylinderInit = {
{ 25, 80, 0, { 0, 0, 0 } },
};
static UNK_PTR sEyeTextures[] = {
0x0600B428,
0x0600D0E8,
0x0600D4E8,
static u64* sEyeTextures[] = {
gNabooruEyeOpenTex,
gNabooruEyeHalfTex,
gNabooruEyeClosedTex,
};
static s32 D_80AB4318 = 0;
@ -322,7 +303,7 @@ void EnNb_SetCurrentAnim(EnNb* this, AnimationHeader* animation, u8 mode, f32 tr
}
void EnNb_SetChamberAnim(EnNb* this, GlobalContext* globalCtx) {
EnNb_SetCurrentAnim(this, &D_06009694, 0, 0, 0);
EnNb_SetCurrentAnim(this, &gNabooruStandingHandsOnHipsChamberOfSagesAnim, 0, 0, 0);
this->actor.shape.yOffset = -10000.0f;
}
@ -385,7 +366,7 @@ void EnNb_SetupDefaultChamberIdle(EnNb* this) {
}
void EnNb_SetupArmRaise(EnNb* this, GlobalContext* globalCtx) {
AnimationHeader* animation = &D_0600274C;
AnimationHeader* animation = &gNabooruRaisingArmsGivingMedallionAnim;
CsCmdActorAction* csCmdNPCAction;
if (globalCtx->csCtx.state != CS_STATE_IDLE) {
@ -399,7 +380,7 @@ void EnNb_SetupArmRaise(EnNb* this, GlobalContext* globalCtx) {
}
void EnNb_SetupRaisedArmTransition(EnNb* this, s32 animFinished) {
AnimationHeader* animation = &D_06002B4C;
AnimationHeader* animation = &gNabooruArmsRaisedGivingMedallionAnim;
if (animFinished) {
Animation_Change(&this->skelAnime, animation, 1.0f, 0.0f, Animation_GetLastFrame(animation), ANIMMODE_LOOP,
@ -466,7 +447,7 @@ void func_80AB19FC(EnNb* this, GlobalContext* globalCtx) {
}
void EnNb_SetupLightArrowOrSealingCs(EnNb* this, GlobalContext* globalCtx) {
EnNb_SetCurrentAnim(this, &D_06000410, 2, 0.0f, 0);
EnNb_SetCurrentAnim(this, &gNabooruPuttingHandsTogetherCastingMagicAnim, 2, 0.0f, 0);
this->action = NB_ACTION_7;
this->actor.shape.shadowAlpha = 0;
}
@ -579,7 +560,7 @@ void EnNb_DrawTransparency(EnNb* this, GlobalContext* globalCtx) {
}
void EnNb_InitKidnap(EnNb* this, GlobalContext* globalCtx) {
EnNb_SetCurrentAnim(this, &D_06001E7C, 0, 0.0f, 0);
EnNb_SetCurrentAnim(this, &gNabooruTrappedInVortexPushingGroundAnim, 0, 0.0f, 0);
this->action = NB_KIDNAPPED;
this->actor.shape.shadowAlpha = 0;
gSaveContext.eventChkInf[9] |= 0x20;
@ -627,7 +608,7 @@ void EnNb_SetupCaptureCutsceneState(EnNb* this, GlobalContext* globalCtx) {
}
void EnNb_SetRaisedArmCaptureAnim(EnNb* this, s32 animFinished) {
AnimationHeader* animation = &D_06001350;
AnimationHeader* animation = &gNabooruSuckedByVortexAnim;
if (animFinished) {
Animation_Change(&this->skelAnime, animation, 1.0f, 0.0f, Animation_GetLastFrame(animation), ANIMMODE_LOOP,
@ -636,7 +617,7 @@ void EnNb_SetRaisedArmCaptureAnim(EnNb* this, s32 animFinished) {
}
void EnNb_SetupLookAroundInKidnap(EnNb* this) {
AnimationHeader* animation = &D_06001E7C;
AnimationHeader* animation = &gNabooruTrappedInVortexPushingGroundAnim;
Animation_Change(&this->skelAnime, animation, 1.0f, 0.0f, Animation_GetLastFrame(animation), ANIMMODE_LOOP, -8.0f);
this->action = NB_KIDNAPPED_LOOK_AROUND;
@ -644,7 +625,7 @@ void EnNb_SetupLookAroundInKidnap(EnNb* this) {
}
void EnNb_SetupKidnap(EnNb* this) {
AnimationHeader* animation = &D_06001104;
AnimationHeader* animation = &gNabooruTrappedInVortexRaisingArmAnim;
Animation_Change(&this->skelAnime, animation, 1.0f, 0.0f, Animation_GetLastFrame(animation), ANIMMODE_ONCE, -8.0f);
this->action = NB_PORTAL_FALLTHROUGH;
@ -707,7 +688,7 @@ void EnNb_SuckedInByPortal(EnNb* this, GlobalContext* globalCtx) {
}
void EnNb_SetupConfrontation(EnNb* this, GlobalContext* globalCtx) {
AnimationHeader* animation = &D_06008BD0;
AnimationHeader* animation = &gNabooruCollapseFromStandingToKneelingTransitionAnim;
EnNb_SetCurrentAnim(this, animation, 0, 0.0f, 0);
this->action = NB_IN_CONFRONTATION;
@ -766,28 +747,28 @@ void func_80AB26C8(EnNb* this) {
void func_80AB26DC(EnNb* this, GlobalContext* globalCtx) {
s32 pad;
AnimationHeader* animation = &D_06008BD0;
f32 frames = Animation_GetLastFrame(animation);
AnimationHeader* animation = &gNabooruCollapseFromStandingToKneelingTransitionAnim;
f32 lastFrame = Animation_GetLastFrame(animation);
EnNb_SetupCsPosRot(this, globalCtx, 1);
Animation_Change(&this->skelAnime, animation, 1.0f, 0.0f, frames, ANIMMODE_ONCE, 0.0f);
Animation_Change(&this->skelAnime, animation, 1.0f, 0.0f, lastFrame, ANIMMODE_ONCE, 0.0f);
this->action = NB_ACTION_14;
this->drawMode = NB_DRAW_KNEEL;
this->actor.shape.shadowAlpha = 0xFF;
}
void EnNb_SetupKneel(EnNb* this) {
AnimationHeader* animation = &D_06008BD0;
f32 frames = Animation_GetLastFrame(animation);
AnimationHeader* animation = &gNabooruCollapseFromStandingToKneelingTransitionAnim;
f32 lastFrame = Animation_GetLastFrame(animation);
Animation_Change(&this->skelAnime, animation, 1.0f, 0.0f, frames, ANIMMODE_ONCE, 0.0f);
Animation_Change(&this->skelAnime, animation, 1.0f, 0.0f, lastFrame, ANIMMODE_ONCE, 0.0f);
this->action = NB_KNEEL;
this->drawMode = NB_DRAW_KNEEL;
this->actor.shape.shadowAlpha = 0xFF;
}
void EnNb_CheckIfKneeling(EnNb* this, s32 animFinished) {
AnimationHeader* animation = &D_060046A8;
AnimationHeader* animation = &gNabooruOnAllFoursAnim;
if (animFinished) {
Animation_Change(&this->skelAnime, animation, 1.0f, 0.0f, Animation_GetLastFrame(animation), ANIMMODE_LOOP,
@ -797,17 +778,17 @@ void EnNb_CheckIfKneeling(EnNb* this, s32 animFinished) {
}
void EnNb_SetupLookRight(EnNb* this) {
AnimationHeader* animation = &D_06003954;
f32 frames = Animation_GetLastFrame(animation);
AnimationHeader* animation = &gNabooruOnAllFoursToOnOneKneeLookingRightTransitionAnim;
f32 lastFrame = Animation_GetLastFrame(animation);
Animation_Change(&this->skelAnime, animation, 1.0f, 0.0f, frames, ANIMMODE_ONCE, -8.0f);
Animation_Change(&this->skelAnime, animation, 1.0f, 0.0f, lastFrame, ANIMMODE_ONCE, -8.0f);
this->action = NB_LOOK_RIGHT;
this->drawMode = NB_DRAW_DEFAULT;
this->actor.shape.shadowAlpha = 0xFF;
}
void EnNb_CheckIfLookingRight(EnNb* this, s32 animFinished) {
AnimationHeader* animation = &D_06004030;
AnimationHeader* animation = &gNabooruOnOneKneeLookingRightAnim;
if (animFinished) {
Animation_Change(&this->skelAnime, animation, 1.0f, 0.0f, Animation_GetLastFrame(animation), ANIMMODE_LOOP,
@ -817,17 +798,17 @@ void EnNb_CheckIfLookingRight(EnNb* this, s32 animFinished) {
}
void EnNb_SetupLookLeft(EnNb* this) {
AnimationHeader* animation = &D_06002DBC;
f32 frames = Animation_GetLastFrame(animation);
AnimationHeader* animation = &gNabooruOnOneKneeTurningHeadRightToLeftTransitionAnim;
f32 lastFrame = Animation_GetLastFrame(animation);
Animation_Change(&this->skelAnime, animation, 1.0f, 0.0f, frames, ANIMMODE_ONCE, -8.0f);
Animation_Change(&this->skelAnime, animation, 1.0f, 0.0f, lastFrame, ANIMMODE_ONCE, -8.0f);
this->action = NB_LOOK_LEFT;
this->drawMode = NB_DRAW_LOOK_DIRECTION;
this->actor.shape.shadowAlpha = 0xFF;
}
void EnNb_CheckIfLookLeft(EnNb* this, s32 animFinished) {
AnimationHeader* animation = &D_060035A8;
AnimationHeader* animation = &gNabooruOnOneKneeLookingLeftAnim;
if (animFinished) {
Animation_Change(&this->skelAnime, animation, 1.0f, 0.0f, Animation_GetLastFrame(animation), ANIMMODE_LOOP,
@ -843,10 +824,10 @@ void EnNb_SetupDemo6KInConfrontation(EnNb* this, GlobalContext* globalCtx, s32 a
}
void EnNb_SetupRun(EnNb* this) {
AnimationHeader* animation = &D_06006320;
f32 frames = Animation_GetLastFrame(animation);
AnimationHeader* animation = &gNabooruKneeingToRunningToHitAnim;
f32 lastFrame = Animation_GetLastFrame(animation);
Animation_Change(&this->skelAnime, animation, 1.0f, 0.0f, frames, ANIMMODE_ONCE, -8.0f);
Animation_Change(&this->skelAnime, animation, 1.0f, 0.0f, lastFrame, ANIMMODE_ONCE, -8.0f);
this->action = NB_RUN;
this->drawMode = NB_DRAW_LOOK_DIRECTION;
this->actor.shape.shadowAlpha = 0xFF;
@ -975,8 +956,8 @@ void func_80AB2E70(EnNb* this, GlobalContext* globalCtx) {
OPEN_DISPS(globalCtx->state.gfxCtx, "../z_en_nb_inConfrontion.c", 572);
func_80093D18(globalCtx->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(&D_0600D8E8));
gSPSegment(POLY_OPA_DISP++, 0x09, SEGMENTED_TO_VIRTUAL(&D_0600D8E8));
gSPSegment(POLY_OPA_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(&gNabooruEyeWideTex));
gSPSegment(POLY_OPA_DISP++, 0x09, SEGMENTED_TO_VIRTUAL(&gNabooruEyeWideTex));
gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255);
gSPSegment(POLY_OPA_DISP++, 0x0C, &D_80116280[2]);
SkelAnime_DrawFlexOpa(globalCtx, skelAnime->skeleton, skelAnime->jointTable, skelAnime->dListCount, NULL, NULL,
@ -988,8 +969,8 @@ void func_80AB2E70(EnNb* this, GlobalContext* globalCtx) {
s32 func_80AB2FC0(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, void* thisx) {
EnNb* this = THIS;
if (limbIndex == 15) {
*dList = D_06013158;
if (limbIndex == NB_LIMB_HEAD) {
*dList = gNabooruHeadMouthOpenDL;
}
return 0;
@ -1016,7 +997,7 @@ void func_80AB2FE4(EnNb* this, GlobalContext* globalCtx) {
}
void EnNb_SetupCreditsSpawn(EnNb* this, GlobalContext* globalCtx) {
EnNb_SetCurrentAnim(this, &D_06000BC0, 0, 0.0f, 0);
EnNb_SetCurrentAnim(this, &gNabooruSittingCrossLeggedAnim, 0, 0.0f, 0);
this->action = NB_CREDITS_INIT;
this->drawMode = NB_DRAW_NOTHING;
this->actor.shape.shadowAlpha = 0;
@ -1030,7 +1011,7 @@ void EnNb_SetAlphaInCredits(EnNb* this) {
if ((kREG(17) + 10.0f) <= this->alphaTimer) {
this->alpha = 255;
this->actor.shape.shadowAlpha = 0xFF;
this->actor.shape.shadowAlpha = 255;
} else {
alpha = (*alphaTimer / (kREG(17) + 10.0f)) * 255.0f;
this->alpha = alpha;
@ -1052,13 +1033,13 @@ void EnNb_SetupCreditsSit(EnNb* this) {
}
void EnNb_SetupCreditsHeadTurn(EnNb* this) {
EnNb_SetCurrentAnim(this, &D_06005CA4, 2, -8.0f, 0);
EnNb_SetCurrentAnim(this, &gNabooruSittingCrossLeggedTurningToLookUpRightTransitionAnim, 2, -8.0f, 0);
this->action = NB_CREDITS_HEAD_TURN;
}
void EnNb_CheckIfLookingUp(EnNb* this, s32 animFinished) {
if (animFinished) {
EnNb_SetCurrentAnim(this, &D_06005614, 0, 0.0f, 0);
EnNb_SetCurrentAnim(this, &gNabooruSittingCrossLeggedLookingUpRightAnim, 0, 0.0f, 0);
}
}
@ -1122,11 +1103,11 @@ void EnNb_CrawlspaceSpawnCheck(EnNb* this, GlobalContext* globalCtx) {
// looking into crawlspace
if (!(gSaveContext.eventChkInf[9] & 0x10)) {
EnNb_SetCurrentAnim(this, &D_06006E78, 0, 0.0f, 0);
EnNb_SetCurrentAnim(this, &gNabooruKneeingAtCrawlspaceAnim, 0, 0.0f, 0);
this->action = NB_CROUCH_CRAWLSPACE;
this->drawMode = NB_DRAW_DEFAULT;
} else {
EnNb_SetCurrentAnim(this, &D_06004BB4, 0, 0.0f, 0);
EnNb_SetCurrentAnim(this, &gNabooruStandingHandsOnHipsAnim, 0, 0.0f, 0);
this->headTurnFlag = 1;
this->actor.flags |= 9;
this->actor.world.pos = this->finalPos;
@ -1195,7 +1176,7 @@ void func_80AB36DC(EnNb* this, GlobalContext* globalCtx) {
void EnNb_CheckNoticed(EnNb* this, GlobalContext* globalCtx) {
if (EnNb_GetNoticedStatus(this, globalCtx)) {
EnNb_SetCurrentAnim(this, &D_06004E60, 2, -8.0f, 0);
EnNb_SetCurrentAnim(this, &gNabooruStandingToWalkingTransitionAnim, 2, -8.0f, 0);
this->action = NB_NOTICE_PLAYER;
EnNb_SetNoticeSFX(this);
}
@ -1203,7 +1184,7 @@ void EnNb_CheckNoticed(EnNb* this, GlobalContext* globalCtx) {
void EnNb_SetupIdleCrawlspace(EnNb* this, s32 animFinished) {
if (animFinished) {
EnNb_SetCurrentAnim(this, &D_06004BB4, 0, -8.0f, 0);
EnNb_SetCurrentAnim(this, &gNabooruStandingHandsOnHipsAnim, 0, -8.0f, 0);
this->headTurnFlag = 1;
this->actor.flags |= 9;
this->action = NB_IDLE_CRAWLSPACE;
@ -1227,7 +1208,7 @@ void func_80AB3838(EnNb* this, GlobalContext* globalCtx) {
}
void EnNb_SetupPathMovement(EnNb* this, GlobalContext* globalCtx) {
EnNb_SetCurrentAnim(this, &D_06004E60, 2, -8.0f, 0);
EnNb_SetCurrentAnim(this, &gNabooruStandingToWalkingTransitionAnim, 2, -8.0f, 0);
gSaveContext.eventChkInf[9] |= 0x10;
this->action = NB_IN_PATH;
this->actor.flags &= ~9;
@ -1292,12 +1273,12 @@ void EnNb_SetTextIdAsChild(EnNb* this, GlobalContext* globalCtx) {
void func_80AB3A7C(EnNb* this, GlobalContext* globalCtx, s32 animFinished) {
u16 movementTimer = this->movementTimer;
if ((u16)(kREG(17) + 0x19) > movementTimer) {
if ((u16)(kREG(17) + 25) > movementTimer) {
if (animFinished) {
EnNb_SetCurrentAnim(this, &D_06009238, 0, 0.0f, 0);
EnNb_SetCurrentAnim(this, &gNabooruWalkingAnim, 0, 0.0f, 0);
}
} else {
EnNb_SetCurrentAnim(this, &D_06004BB4, 0, -8.0f, 0);
EnNb_SetCurrentAnim(this, &gNabooruStandingHandsOnHipsAnim, 0, -8.0f, 0);
this->action = NB_IDLE_AFTER_TALK;
}
}
@ -1443,7 +1424,7 @@ void EnNb_Init(Actor* thisx, GlobalContext* globalCtx) {
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 30.0f);
EnNb_SetupCollider(thisx, globalCtx);
SkelAnime_InitFlex(globalCtx, &this->skelAnime, &D_060181C8, NULL, this->jointTable, this->morphTable, 19);
SkelAnime_InitFlex(globalCtx, &this->skelAnime, &gNabooruSkel, NULL, this->jointTable, this->morphTable, NB_LIMB_MAX);
switch (EnNb_GetType(this)) {
case NB_TYPE_DEMO02:
@ -1473,11 +1454,11 @@ s32 EnNb_OverrideLimbDraw(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList,
s32 ret = false;
if (this->headTurnFlag != 0) {
if (limbIndex == 8) {
if (limbIndex == NB_LIMB_TORSO) {
rot->x += unk_300->unk_0E.y;
rot->y -= unk_300->unk_0E.x;
ret = false;
} else if (limbIndex == 15) {
} else if (limbIndex == NB_LIMB_HEAD) {
rot->x += unk_300->unk_08.y;
rot->z += unk_300->unk_08.x;
ret = false;
@ -1490,7 +1471,7 @@ s32 EnNb_OverrideLimbDraw(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList,
void EnNb_PostLimbDraw(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3s* rot, void* thisx) {
EnNb* this = THIS;
if (limbIndex == 15) {
if (limbIndex == NB_LIMB_HEAD) {
Vec3f vec1 = { 0.0f, 10.0f, 0.0f };
Vec3f vec2;

View file

@ -6,14 +6,37 @@
struct EnNb;
typedef enum {
/* 0x00 */ NB_LIMB_NONE,
/* 0x01 */ NB_LIMB_ROOT,
/* 0x02 */ NB_LIMB_L_THIGH,
/* 0x03 */ NB_LIMB_L_SHIN,
/* 0x04 */ NB_LIMB_L_FOOT,
/* 0x05 */ NB_LIMB_R_THIGH,
/* 0x06 */ NB_LIMB_R_SHIN,
/* 0x07 */ NB_LIMB_R_FOOT,
/* 0x08 */ NB_LIMB_TORSO,
/* 0x09 */ NB_LIMB_L_UPPER_ARM,
/* 0x0A */ NB_LIMB_L_FOREARM,
/* 0x0B */ NB_LIMB_L_HAND,
/* 0x0C */ NB_LIMB_R_UPPER_ARM,
/* 0x0D */ NB_LIMB_R_FOREARM,
/* 0x0E */ NB_LIMB_R_HAND,
/* 0x0F */ NB_LIMB_HEAD,
/* 0x10 */ NB_LIMB_BLANK,
/* 0x11 */ NB_LIMB_PONYTAIL,
/* 0x12 */ NB_LIMB_WAIST,
/* 0x13 */ NB_LIMB_MAX
} EnNbLimb;
typedef void (*EnNbActionFunc)(struct EnNb*, GlobalContext*);
typedef void (*EnNbDrawFunc)(struct EnNb*, GlobalContext*);
typedef struct EnNb {
/* 0x0000 */ Actor actor;
/* 0x014C */ SkelAnime skelAnime;
/* 0x0190 */ Vec3s jointTable[19];
/* 0x0202 */ Vec3s morphTable[19];
/* 0x0190 */ Vec3s jointTable[NB_LIMB_MAX];
/* 0x0202 */ Vec3s morphTable[NB_LIMB_MAX];
/* 0x0274 */ s16 eyeIdx;
/* 0x0276 */ s16 blinkTimer;
/* 0x0278 */ s32 action;