mirror of
https://github.com/zeldaret/oot.git
synced 2025-08-06 06:10:21 +00:00
Gerudo3 OK and documented (#593)
* Ge3: OK and data migrated * Functions and most variables named * finished enums for limbs, inlined data * spec updated, asm deleted * fix dists * changes * changes Co-authored-by: Fig02 <fig02srl@gmail.com>
This commit is contained in:
parent
badb1d9d5e
commit
1fbc0f1943
24 changed files with 305 additions and 909 deletions
|
@ -5,6 +5,7 @@
|
|||
*/
|
||||
|
||||
#include "z_en_ge3.h"
|
||||
#include "objects/object_geldb/object_geldb.h"
|
||||
|
||||
#define FLAGS 0x00000019
|
||||
|
||||
|
@ -15,10 +16,10 @@ void EnGe3_Destroy(Actor* thisx, GlobalContext* globalCtx);
|
|||
void EnGe3_Update(Actor* thisx, GlobalContext* globalCtx);
|
||||
void EnGe3_Draw(Actor* thisx, GlobalContext* globalCtx);
|
||||
|
||||
extern UNK_TYPE D_0600A458;
|
||||
extern UNK_TYPE D_0600B07C;
|
||||
void EnGe3_WaitLookAtPlayer(EnGe3* this, GlobalContext* globalCtx);
|
||||
void EnGe3_ForceTalk(EnGe3* this, GlobalContext* globalCtx);
|
||||
void EnGe3_UpdateWhenNotTalking(Actor* thisx, GlobalContext* globalCtx);
|
||||
|
||||
/*
|
||||
const ActorInit En_Ge3_InitVars = {
|
||||
ACTOR_EN_GE3,
|
||||
ACTORCAT_NPC,
|
||||
|
@ -31,7 +32,7 @@ const ActorInit En_Ge3_InitVars = {
|
|||
(ActorFunc)EnGe3_Draw,
|
||||
};
|
||||
|
||||
static ColliderCylinderInit D_80A35190 = {
|
||||
static ColliderCylinderInit sCylinderInit = {
|
||||
{
|
||||
COLTYPE_NONE,
|
||||
AT_NONE,
|
||||
|
@ -50,37 +51,248 @@ static ColliderCylinderInit D_80A35190 = {
|
|||
},
|
||||
{ 20, 50, 0, { 0, 0, 0 } },
|
||||
};
|
||||
*/
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Ge3/func_80A34620.s")
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Ge3/EnGe3_Init.s")
|
||||
static EnGe3ActionFunc sActionFuncs[] = { EnGe3_WaitLookAtPlayer };
|
||||
static AnimationHeader* sAnimations[] = { &gGerudoRedStandAnim }; // Idle with right hand on hip and left over mouth
|
||||
static u8 sAnimationModes[] = { ANIMMODE_LOOP };
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Ge3/EnGe3_Destroy.s")
|
||||
void EnGe3_ChangeAction(EnGe3* this, s32 i) {
|
||||
this->actionFunc = sActionFuncs[i];
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Ge3/func_80A347F4.s")
|
||||
Animation_Change(&this->skelAnime, sAnimations[i], 1.0f, 0.0f, (f32)Animation_GetLastFrame(sAnimations[i]),
|
||||
sAnimationModes[i], -8.0f);
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Ge3/func_80A3490C.s")
|
||||
this->unk_30C &= ~2;
|
||||
}
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Ge3/func_80A34A20.s")
|
||||
void EnGe3_Init(Actor* thisx, GlobalContext* globalCtx2) {
|
||||
EnGe3* this = THIS;
|
||||
GlobalContext* globalCtx = globalCtx2;
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Ge3/func_80A34A80.s")
|
||||
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 36.0f);
|
||||
SkelAnime_InitFlex(globalCtx, &this->skelAnime, &gGerudoRedSkel, NULL, this->jointTable, this->morphTable,
|
||||
GELDB_LIMB_MAX);
|
||||
Animation_PlayLoop(&this->skelAnime, &gGerudoRedStandAnim);
|
||||
Collider_InitCylinder(globalCtx, &this->collider);
|
||||
Collider_SetCylinder(globalCtx, &this->collider, &this->actor, &sCylinderInit);
|
||||
this->actor.colChkInfo.mass = MASS_IMMOVABLE;
|
||||
Actor_SetScale(&this->actor, 0.01f);
|
||||
this->actor.world.rot.z = 0;
|
||||
this->actor.shape.rot.z = 0;
|
||||
EnGe3_ChangeAction(this, 0);
|
||||
this->actionFunc = EnGe3_ForceTalk;
|
||||
this->unk_30C = 0;
|
||||
this->actor.targetMode = 6;
|
||||
this->actor.minVelocityY = -4.0f;
|
||||
this->actor.gravity = -1.0f;
|
||||
}
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Ge3/func_80A34AA0.s")
|
||||
void EnGe3_Destroy(Actor* thisx, GlobalContext* globalCtx) {
|
||||
EnGe3* this = THIS;
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Ge3/func_80A34B00.s")
|
||||
Collider_DestroyCylinder(globalCtx, &this->collider);
|
||||
}
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Ge3/func_80A34B90.s")
|
||||
void EnGe3_TurnToFacePlayer(EnGe3* this, GlobalContext* globalCtx) {
|
||||
s32 pad;
|
||||
s16 angleDiff = this->actor.yawTowardsPlayer - this->actor.shape.rot.y;
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Ge3/func_80A34C40.s")
|
||||
if (ABS(angleDiff) <= 0x4000) {
|
||||
Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 6, 4000, 100);
|
||||
this->actor.world.rot.y = this->actor.shape.rot.y;
|
||||
func_80038290(globalCtx, &this->actor, &this->headRot, &this->unk_306, this->actor.focus.pos);
|
||||
} else {
|
||||
if (angleDiff < 0) {
|
||||
Math_SmoothStepToS(&this->headRot.y, -0x2000, 6, 6200, 0x100);
|
||||
} else {
|
||||
Math_SmoothStepToS(&this->headRot.y, 0x2000, 6, 6200, 0x100);
|
||||
}
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Ge3/func_80A34CE4.s")
|
||||
Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 12, 1000, 100);
|
||||
this->actor.world.rot.y = this->actor.shape.rot.y;
|
||||
}
|
||||
}
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Ge3/func_80A34D68.s")
|
||||
void EnGe3_LookAtPlayer(EnGe3* this, GlobalContext* globalCtx) {
|
||||
if ((ABS((s16)(this->actor.yawTowardsPlayer - this->actor.shape.rot.y)) <= 0x2300) &&
|
||||
(this->actor.xzDistToPlayer < 100.0f)) {
|
||||
func_80038290(globalCtx, &this->actor, &this->headRot, &this->unk_306, this->actor.focus.pos);
|
||||
} else {
|
||||
Math_SmoothStepToS(&this->headRot.x, 0, 6, 6200, 100);
|
||||
Math_SmoothStepToS(&this->headRot.y, 0, 6, 6200, 100);
|
||||
Math_SmoothStepToS(&this->unk_306.x, 0, 6, 6200, 100);
|
||||
Math_SmoothStepToS(&this->unk_306.y, 0, 6, 6200, 100);
|
||||
}
|
||||
}
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Ge3/EnGe3_Update.s")
|
||||
void EnGe3_Wait(EnGe3* this, GlobalContext* globalCtx) {
|
||||
if (func_8002F334(&this->actor, globalCtx)) {
|
||||
this->actionFunc = EnGe3_WaitLookAtPlayer;
|
||||
this->actor.update = EnGe3_UpdateWhenNotTalking;
|
||||
this->actor.flags &= ~0x10000;
|
||||
}
|
||||
EnGe3_TurnToFacePlayer(this, globalCtx);
|
||||
}
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Ge3/func_80A34E58.s")
|
||||
void EnGe3_WaitLookAtPlayer(EnGe3* this, GlobalContext* globalCtx) {
|
||||
EnGe3_LookAtPlayer(this, globalCtx);
|
||||
}
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Ge3/func_80A35004.s")
|
||||
void EnGe3_WaitTillCardGiven(EnGe3* this, GlobalContext* globalCtx) {
|
||||
if (Actor_HasParent(&this->actor, globalCtx)) {
|
||||
this->actor.parent = NULL;
|
||||
this->actionFunc = EnGe3_Wait;
|
||||
} else {
|
||||
func_8002F434(&this->actor, globalCtx, GI_GERUDO_CARD, 10000.0f, 50.0f);
|
||||
}
|
||||
}
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Ge3/EnGe3_Draw.s")
|
||||
void EnGe3_GiveCard(EnGe3* this, GlobalContext* globalCtx) {
|
||||
if ((func_8010BDBC(&globalCtx->msgCtx) == 5) && (func_80106BC8(globalCtx) != 0)) {
|
||||
func_80106CCC(globalCtx);
|
||||
this->actor.flags &= ~0x10000;
|
||||
this->actionFunc = EnGe3_WaitTillCardGiven;
|
||||
func_8002F434(&this->actor, globalCtx, GI_GERUDO_CARD, 10000.0f, 50.0f);
|
||||
}
|
||||
}
|
||||
|
||||
void EnGe3_ForceTalk(EnGe3* this, GlobalContext* globalCtx) {
|
||||
if (func_8002F194(&this->actor, globalCtx)) {
|
||||
this->actionFunc = EnGe3_GiveCard;
|
||||
} else {
|
||||
if (!(this->unk_30C & 4)) {
|
||||
func_8002DF54(globalCtx, &this->actor, 7);
|
||||
this->unk_30C |= 4;
|
||||
}
|
||||
this->actor.textId = 0x6004;
|
||||
this->actor.flags |= 0x10000;
|
||||
func_8002F1C4(&this->actor, globalCtx, 300.0f, 300.0f, 0);
|
||||
}
|
||||
EnGe3_LookAtPlayer(this, globalCtx);
|
||||
}
|
||||
|
||||
void EnGe3_UpdateCollision(EnGe3* this, GlobalContext* globalCtx) {
|
||||
s32 pad;
|
||||
s32 pad2;
|
||||
|
||||
Collider_UpdateCylinder(&this->actor, &this->collider);
|
||||
CollisionCheck_SetOC(globalCtx, &globalCtx->colChkCtx, &this->collider.base);
|
||||
Actor_UpdateBgCheckInfo(globalCtx, &this->actor, 40.0f, 25.0f, 40.0f, 5);
|
||||
|
||||
if (!(this->unk_30C & 2) && SkelAnime_Update(&this->skelAnime)) {
|
||||
this->unk_30C |= 2;
|
||||
}
|
||||
}
|
||||
|
||||
void EnGe3_MoveAndBlink(EnGe3* this, GlobalContext* globalCtx) {
|
||||
|
||||
Actor_MoveForward(&this->actor);
|
||||
|
||||
if (DECR(this->blinkTimer) == 0) {
|
||||
this->blinkTimer = Rand_S16Offset(60, 60);
|
||||
}
|
||||
|
||||
this->eyeIndex = this->blinkTimer;
|
||||
|
||||
if (this->eyeIndex >= 3) {
|
||||
this->eyeIndex = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void EnGe3_UpdateWhenNotTalking(Actor* thisx, GlobalContext* globalCtx) {
|
||||
EnGe3* this = THIS;
|
||||
|
||||
EnGe3_UpdateCollision(this, globalCtx);
|
||||
this->actionFunc(this, globalCtx);
|
||||
|
||||
if (func_8002F194(&this->actor, globalCtx)) {
|
||||
this->actionFunc = EnGe3_Wait;
|
||||
this->actor.update = EnGe3_Update;
|
||||
} else {
|
||||
this->actor.textId = 0x6005;
|
||||
if (this->actor.xzDistToPlayer < 100.0f) {
|
||||
func_8002F2CC(&this->actor, globalCtx, 100.0f);
|
||||
}
|
||||
}
|
||||
|
||||
EnGe3_MoveAndBlink(this, globalCtx);
|
||||
}
|
||||
|
||||
void EnGe3_Update(Actor* thisx, GlobalContext* globalCtx) {
|
||||
EnGe3* this = THIS;
|
||||
|
||||
EnGe3_UpdateCollision(this, globalCtx);
|
||||
this->actionFunc(this, globalCtx);
|
||||
EnGe3_MoveAndBlink(this, globalCtx);
|
||||
}
|
||||
|
||||
s32 EnGe3_OverrideLimbDraw(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, void* thisx) {
|
||||
EnGe3* this = THIS;
|
||||
|
||||
switch (limbIndex) {
|
||||
// Hide swords and veil from object_geldb
|
||||
case GELDB_LIMB_VEIL:
|
||||
case GELDB_LIMB_R_SWORD:
|
||||
case GELDB_LIMB_L_SWORD:
|
||||
*dList = NULL;
|
||||
return false;
|
||||
// Turn head
|
||||
case GELDB_LIMB_HEAD:
|
||||
rot->x += this->headRot.y;
|
||||
|
||||
// This is a hack to fix the color-changing clothes this Gerudo has on N64 versions
|
||||
default:
|
||||
OPEN_DISPS(globalCtx->state.gfxCtx, "../z_en_ge3.c", 547);
|
||||
switch (limbIndex) {
|
||||
case GELDB_LIMB_NECK:
|
||||
break;
|
||||
case GELDB_LIMB_HEAD:
|
||||
gDPPipeSync(POLY_OPA_DISP++);
|
||||
gDPSetEnvColor(POLY_OPA_DISP++, 80, 60, 10, 255);
|
||||
break;
|
||||
case GELDB_LIMB_R_SWORD:
|
||||
case GELDB_LIMB_L_SWORD:
|
||||
gDPPipeSync(POLY_OPA_DISP++);
|
||||
gDPSetEnvColor(POLY_OPA_DISP++, 140, 170, 230, 255);
|
||||
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255);
|
||||
break;
|
||||
default:
|
||||
gDPPipeSync(POLY_OPA_DISP++);
|
||||
gDPSetEnvColor(POLY_OPA_DISP++, 140, 0, 0, 255);
|
||||
break;
|
||||
}
|
||||
CLOSE_DISPS(globalCtx->state.gfxCtx, "../z_en_ge3.c", 566);
|
||||
break;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void EnGe3_PostLimbDraw(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3s* rot, void* thisx) {
|
||||
EnGe3* this = THIS;
|
||||
Vec3f D_80A351C8 = { 600.0f, 700.0f, 0.0f };
|
||||
|
||||
if (limbIndex == GELDB_LIMB_HEAD) {
|
||||
Matrix_MultVec3f(&D_80A351C8, &this->actor.focus.pos);
|
||||
}
|
||||
}
|
||||
|
||||
static u64* sEyeTextures[] = {
|
||||
0x06005FE8, // Half-open
|
||||
0x060065A8, // Quarter-open
|
||||
0x06006D28, // Closed
|
||||
};
|
||||
|
||||
void EnGe3_Draw(Actor* thisx, GlobalContext* globalCtx2) {
|
||||
EnGe3* this = THIS;
|
||||
GlobalContext* globalCtx = globalCtx2;
|
||||
|
||||
OPEN_DISPS(globalCtx->state.gfxCtx, "../z_en_ge3.c", 614);
|
||||
|
||||
func_800943C8(globalCtx->state.gfxCtx);
|
||||
gSPSegment(POLY_OPA_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(sEyeTextures[this->eyeIndex]));
|
||||
func_8002EBCC(&this->actor, globalCtx, 0);
|
||||
SkelAnime_DrawFlexOpa(globalCtx, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
|
||||
EnGe3_OverrideLimbDraw, EnGe3_PostLimbDraw, this);
|
||||
|
||||
CLOSE_DISPS(globalCtx->state.gfxCtx, "../z_en_ge3.c", 631);
|
||||
}
|
||||
|
|
|
@ -3,12 +3,24 @@
|
|||
|
||||
#include "ultra64.h"
|
||||
#include "global.h"
|
||||
#include "overlays/actors/ovl_En_GeldB/z_en_geldb.h"
|
||||
|
||||
struct EnGe3;
|
||||
|
||||
typedef void (*EnGe3ActionFunc)(struct EnGe3*, GlobalContext*);
|
||||
|
||||
typedef struct EnGe3 {
|
||||
/* 0x0000 */ Actor actor;
|
||||
/* 0x014C */ char unk_14C[0x1C8];
|
||||
/* 0x014C */ ColliderCylinder collider;
|
||||
/* 0x0198 */ SkelAnime skelAnime;
|
||||
/* 0x01DC */ Vec3s jointTable[GELDB_LIMB_MAX];
|
||||
/* 0x026C */ Vec3s morphTable[GELDB_LIMB_MAX];
|
||||
/* 0x02FC */ s16 eyeIndex;
|
||||
/* 0x02FE */ s16 blinkTimer;
|
||||
/* 0x0300 */ Vec3s headRot;
|
||||
/* 0x0306 */ Vec3s unk_306;
|
||||
/* 0x030C */ u16 unk_30C;
|
||||
/* 0x0310 */ EnGe3ActionFunc actionFunc;
|
||||
} EnGe3; // size = 0x0314
|
||||
|
||||
extern const ActorInit En_Ge3_InitVars;
|
||||
|
|
|
@ -229,7 +229,7 @@ void EnGeldB_Init(Actor* thisx, GlobalContext* globalCtx) {
|
|||
this->blinkState = 0;
|
||||
this->unkFloat = 10.0f;
|
||||
SkelAnime_InitFlex(globalCtx, &this->skelAnime, &gGerudoRedSkel, &gGerudoRedNeutralAnim, this->jointTable,
|
||||
this->morphTable, 24);
|
||||
this->morphTable, GELDB_LIMB_MAX);
|
||||
Collider_InitCylinder(globalCtx, &this->bodyCollider);
|
||||
Collider_SetCylinder(globalCtx, &this->bodyCollider, thisx, &sBodyCylInit);
|
||||
Collider_InitTris(globalCtx, &this->blockCollider);
|
||||
|
@ -366,8 +366,8 @@ void EnGeldB_Wait(EnGeldB* this, GlobalContext* globalCtx) {
|
|||
this->actor.focus.pos = this->actor.world.pos;
|
||||
this->actor.bgCheckFlags &= ~2;
|
||||
this->actor.velocity.y = 0.0f;
|
||||
func_80033260(globalCtx, &this->actor, &this->rightFootPos, 3.0f, 2, 2.0f, 0, 0, 0);
|
||||
func_80033260(globalCtx, &this->actor, &this->leftFootPos, 3.0f, 2, 2.0f, 0, 0, 0);
|
||||
func_80033260(globalCtx, &this->actor, &this->rightFootPos, 3.0f, 2, 2.0f, 0, 0, 0);
|
||||
}
|
||||
if (SkelAnime_Update(&this->skelAnime)) {
|
||||
EnGeldB_SetupReady(this);
|
||||
|
@ -391,8 +391,8 @@ void EnGeldB_Flee(EnGeldB* this, GlobalContext* globalCtx) {
|
|||
}
|
||||
if (this->skelAnime.curFrame == 2.0f) {
|
||||
this->actor.gravity = 0.0f;
|
||||
func_80033260(globalCtx, &this->actor, &this->rightFootPos, 3.0f, 2, 2.0f, 0, 0, 0);
|
||||
func_80033260(globalCtx, &this->actor, &this->leftFootPos, 3.0f, 2, 2.0f, 0, 0, 0);
|
||||
func_80033260(globalCtx, &this->actor, &this->rightFootPos, 3.0f, 2, 2.0f, 0, 0, 0);
|
||||
}
|
||||
if (SkelAnime_Update(&this->skelAnime)) {
|
||||
Math_SmoothStepToF(&this->actor.world.pos.y, this->actor.floorHeight + 300.0f, 1.0f, 20.5f, 0.0f);
|
||||
|
@ -923,8 +923,8 @@ void EnGeldB_SpinAttack(EnGeldB* this, GlobalContext* globalCtx) {
|
|||
if ((s32)this->skelAnime.curFrame < 9) {
|
||||
this->actor.shape.rot.y = this->actor.world.rot.y = this->actor.yawTowardsPlayer;
|
||||
} else if ((s32)this->skelAnime.curFrame == 13) {
|
||||
func_80033260(globalCtx, &this->actor, &this->rightFootPos, 3.0f, 2, 2.0f, 0, 0, 0);
|
||||
func_80033260(globalCtx, &this->actor, &this->leftFootPos, 3.0f, 2, 2.0f, 0, 0, 0);
|
||||
func_80033260(globalCtx, &this->actor, &this->rightFootPos, 3.0f, 2, 2.0f, 0, 0, 0);
|
||||
this->swordState = 1;
|
||||
this->actor.speedXZ = 10.0f;
|
||||
Audio_PlayActorSound2(&this->actor, NA_SE_EN_GERUDOFT_ATTACK);
|
||||
|
@ -1089,8 +1089,8 @@ void EnGeldB_SetupJump(EnGeldB* this) {
|
|||
void EnGeldB_Jump(EnGeldB* this, GlobalContext* globalCtx) {
|
||||
Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 1, 0xFA0, 1);
|
||||
if (this->actor.velocity.y >= 5.0f) {
|
||||
func_800355B8(globalCtx, &this->rightFootPos);
|
||||
func_800355B8(globalCtx, &this->leftFootPos);
|
||||
func_800355B8(globalCtx, &this->rightFootPos);
|
||||
}
|
||||
if (SkelAnime_Update(&this->skelAnime) && (this->actor.bgCheckFlags & 3)) {
|
||||
this->actor.world.rot.y = this->actor.shape.rot.y = this->actor.yawTowardsPlayer;
|
||||
|
@ -1428,14 +1428,14 @@ s32 EnGeldB_OverrideLimbDraw(GlobalContext* globalCtx, s32 limbIndex, Gfx** dLis
|
|||
EnGeldB* this = THIS;
|
||||
|
||||
OPEN_DISPS(globalCtx->state.gfxCtx, "../z_en_geldB.c", 2507);
|
||||
if (limbIndex == 3) {
|
||||
if (limbIndex == GELDB_LIMB_NECK) {
|
||||
rot->z += this->headRot.x;
|
||||
rot->x += this->headRot.y;
|
||||
rot->y += this->headRot.z;
|
||||
} else if (limbIndex == 6) {
|
||||
} else if (limbIndex == GELDB_LIMB_HEAD) {
|
||||
gDPPipeSync(POLY_OPA_DISP++);
|
||||
gDPSetEnvColor(POLY_OPA_DISP++, 80, 60, 10, 255);
|
||||
} else if ((limbIndex == 11) || (limbIndex == 16)) {
|
||||
} else if ((limbIndex == GELDB_LIMB_R_SWORD) || (limbIndex == GELDB_LIMB_L_SWORD)) {
|
||||
gDPPipeSync(POLY_OPA_DISP++);
|
||||
gDPSetEnvColor(POLY_OPA_DISP++, 140, 170, 230, 255);
|
||||
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255);
|
||||
|
@ -1461,7 +1461,7 @@ void EnGeldB_PostLimbDraw(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList,
|
|||
EnGeldB* this = THIS;
|
||||
s32 bodyPart = -1;
|
||||
|
||||
if (limbIndex == 11) {
|
||||
if (limbIndex == GELDB_LIMB_R_SWORD) {
|
||||
Matrix_MultVec3f(&swordQuadOffset1, &this->swordCollider.dim.quad[1]);
|
||||
Matrix_MultVec3f(&swordQuadOffset0, &this->swordCollider.dim.quad[0]);
|
||||
Matrix_MultVec3f(&swordQuadOffset3, &this->swordCollider.dim.quad[3]);
|
||||
|
@ -1479,45 +1479,48 @@ void EnGeldB_PostLimbDraw(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList,
|
|||
EffectBlure_AddVertex(Effect_GetByIndex(this->blureIndex), &swordTip, &swordHilt);
|
||||
}
|
||||
} else {
|
||||
Actor_SetFeetPos(&this->actor, limbIndex, 19, &footOffset, 22, &footOffset);
|
||||
Actor_SetFeetPos(&this->actor, limbIndex, GELDB_LIMB_L_FOOT, &footOffset, GELDB_LIMB_R_FOOT, &footOffset);
|
||||
}
|
||||
if (limbIndex == 19) {
|
||||
Matrix_MultVec3f(&footOffset, &this->rightFootPos);
|
||||
} else if (limbIndex == 22) {
|
||||
|
||||
if (limbIndex == GELDB_LIMB_L_FOOT) {
|
||||
Matrix_MultVec3f(&footOffset, &this->leftFootPos);
|
||||
} else if (limbIndex == GELDB_LIMB_R_FOOT) {
|
||||
Matrix_MultVec3f(&footOffset, &this->rightFootPos);
|
||||
}
|
||||
|
||||
if (this->iceTimer != 0) {
|
||||
switch (limbIndex) {
|
||||
case 3:
|
||||
case GELDB_LIMB_NECK:
|
||||
bodyPart = 0;
|
||||
break;
|
||||
case 16:
|
||||
case GELDB_LIMB_L_SWORD:
|
||||
bodyPart = 1;
|
||||
break;
|
||||
case 11:
|
||||
case GELDB_LIMB_R_SWORD:
|
||||
bodyPart = 2;
|
||||
break;
|
||||
case 12:
|
||||
case GELDB_LIMB_L_UPPER_ARM:
|
||||
bodyPart = 3;
|
||||
break;
|
||||
case 7:
|
||||
case GELDB_LIMB_R_UPPER_ARM:
|
||||
bodyPart = 4;
|
||||
break;
|
||||
case 2:
|
||||
case GELDB_LIMB_TORSO:
|
||||
bodyPart = 5;
|
||||
break;
|
||||
case 23:
|
||||
case GELDB_LIMB_WAIST:
|
||||
bodyPart = 6;
|
||||
break;
|
||||
case 19:
|
||||
case GELDB_LIMB_L_FOOT:
|
||||
bodyPart = 7;
|
||||
break;
|
||||
case 22:
|
||||
case GELDB_LIMB_R_FOOT:
|
||||
bodyPart = 8;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (bodyPart >= 0) {
|
||||
Vec3f limbPos;
|
||||
|
||||
|
|
|
@ -6,14 +6,42 @@
|
|||
|
||||
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
|
||||
} EnGeldBLimb;
|
||||
|
||||
typedef void (*EnGeldBActionFunc)(struct EnGeldB*, GlobalContext*);
|
||||
|
||||
typedef struct EnGeldB {
|
||||
/* 0x0000 */ Actor actor;
|
||||
/* 0x014C */ Vec3s bodyPartsPos[10];
|
||||
/* 0x0188 */ SkelAnime skelAnime;
|
||||
/* 0x01CC */ Vec3s jointTable[24];
|
||||
/* 0x025C */ Vec3s morphTable[24];
|
||||
/* 0x01CC */ Vec3s jointTable[GELDB_LIMB_MAX];
|
||||
/* 0x025C */ Vec3s morphTable[GELDB_LIMB_MAX];
|
||||
/* 0x02EC */ s32 action;
|
||||
/* 0x02F0 */ char unk_2F0[4];
|
||||
/* 0x02F4 */ EnGeldBActionFunc actionFunc;
|
||||
|
@ -36,8 +64,8 @@ typedef struct EnGeldB {
|
|||
/* 0x036C */ ColliderQuad swordCollider;
|
||||
/* 0x03EC */ ColliderTris blockCollider;
|
||||
/* 0x040C */ ColliderTrisElement blockElements[2];
|
||||
/* 0x04C4 */ Vec3f leftFootPos;
|
||||
/* 0x04D0 */ Vec3f rightFootPos;
|
||||
/* 0x04C4 */ Vec3f rightFootPos;
|
||||
/* 0x04D0 */ Vec3f leftFootPos;
|
||||
/* 0x04DC */ Vec3s headRot;
|
||||
} EnGeldB; // size = 0x04E4
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue