1
0
Fork 0
mirror of https://github.com/zeldaret/oot.git synced 2025-07-03 06:24:30 +00:00

Document object_gndd (Young Ganondorf) (#1353)

This commit is contained in:
Tom Overton 2022-08-29 17:03:29 -07:00 committed by GitHub
parent f5f6f2ef6c
commit fe8d5988b9
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 173 additions and 130 deletions

View file

@ -58,23 +58,23 @@ static EnViewerInitData sInitData[] = {
{ OBJECT_ZL4, OBJECT_OPENING_DEMO1, 1, 0, ENVIEWER_SHADOW_NONE, 10, ENVIEWER_DRAW_ZELDA, &gChildZeldaSkel,
&object_opening_demo1_Anim_000450 },
/* ENVIEWER_TYPE_3_GANONDORF */
{ OBJECT_GNDD, OBJECT_GNDD, 1, -6, ENVIEWER_SHADOW_NONE, 10, ENVIEWER_DRAW_GANONDORF, &object_gndd_Skel_0119E8,
&object_gndd_Anim_002928 },
{ OBJECT_GNDD, OBJECT_GNDD, 1, -6, ENVIEWER_SHADOW_NONE, 10, ENVIEWER_DRAW_GANONDORF, &gYoungGanondorfSkel,
&gYoungGanondorfHorsebackIdleAnim },
/* ENVIEWER_TYPE_4_HORSE_GANONDORF */
{ OBJECT_HORSE_GANON, OBJECT_HORSE_GANON, 1, 0, ENVIEWER_SHADOW_HORSE, 20, ENVIEWER_DRAW_HORSE, &gHorseGanonSkel,
&gHorseGanonRearingAnim },
/* ENVIEWER_TYPE_5_GANONDORF */
{ OBJECT_GNDD, OBJECT_GNDD, 1, -6, ENVIEWER_SHADOW_NONE, 10, ENVIEWER_DRAW_GANONDORF, &object_gndd_Skel_0119E8,
&object_gndd_Anim_0005B4 },
{ OBJECT_GNDD, OBJECT_GNDD, 1, -6, ENVIEWER_SHADOW_NONE, 10, ENVIEWER_DRAW_GANONDORF, &gYoungGanondorfSkel,
&gYoungGanondorfHorsebackRideAnim },
/* ENVIEWER_TYPE_6_HORSE_GANONDORF */
{ OBJECT_HORSE_GANON, OBJECT_HORSE_GANON, 1, 0, ENVIEWER_SHADOW_HORSE, 20, ENVIEWER_DRAW_HORSE, &gHorseGanonSkel,
&gHorseGanonGallopingAnim },
/* ENVIEWER_TYPE_7_GANONDORF */
{ OBJECT_GNDD, OBJECT_GNDD, 1, -6, ENVIEWER_SHADOW_NONE, 10, ENVIEWER_DRAW_GANONDORF, &object_gndd_Skel_0119E8,
&object_gndd_Anim_004260 },
{ OBJECT_GNDD, OBJECT_GNDD, 1, -6, ENVIEWER_SHADOW_NONE, 10, ENVIEWER_DRAW_GANONDORF, &gYoungGanondorfSkel,
&gYoungGanondorfArmsCrossedAnim },
/* ENVIEWER_TYPE_8_GANONDORF */
{ OBJECT_GNDD, OBJECT_GNDD, 1, -6, ENVIEWER_SHADOW_NONE, 10, ENVIEWER_DRAW_GANONDORF, &object_gndd_Skel_0119E8,
&object_gndd_Anim_0050A8 },
{ OBJECT_GNDD, OBJECT_GNDD, 1, -6, ENVIEWER_SHADOW_NONE, 10, ENVIEWER_DRAW_GANONDORF, &gYoungGanondorfSkel,
&gYoungGanondorfWalkAnim },
/* ENVIEWER_TYPE_9_GANONDORF */
{ OBJECT_GANON, OBJECT_GANON, 1, -6, ENVIEWER_SHADOW_NONE, 10, ENVIEWER_DRAW_GANONDORF, &gGanondorfSkel,
&gGanondorfEndingFloatAnim },
@ -282,8 +282,8 @@ void EnViewer_UpdateImpl(EnViewer* this, PlayState* play) {
if (play->csCtx.state != CS_STATE_IDLE && play->csCtx.npcActions[1] != NULL) {
if (play->csCtx.npcActions[1]->action == 2 && sTimer == 0) {
if (type == ENVIEWER_TYPE_3_GANONDORF) {
if (this->skin.skelAnime.animation != &object_gndd_Anim_002928) {
Animation_PlayLoopSetSpeed(&this->skin.skelAnime, &object_gndd_Anim_002928, 1.0f);
if (this->skin.skelAnime.animation != &gYoungGanondorfHorsebackIdleAnim) {
Animation_PlayLoopSetSpeed(&this->skin.skelAnime, &gYoungGanondorfHorsebackIdleAnim, 1.0f);
}
} else if (this->skin.skelAnime.animation != &gHorseGanonIdleAnim) {
Animation_PlayLoopSetSpeed(&this->skin.skelAnime, &gHorseGanonIdleAnim, 1.0f);
@ -291,8 +291,8 @@ void EnViewer_UpdateImpl(EnViewer* this, PlayState* play) {
} else if (play->csCtx.npcActions[1]->action == 1) {
sTimer = 100;
if (type == ENVIEWER_TYPE_3_GANONDORF) {
if (this->skin.skelAnime.animation != &object_gndd_Anim_001D28) {
Animation_PlayLoopSetSpeed(&this->skin.skelAnime, &object_gndd_Anim_001D28, 1.0f);
if (this->skin.skelAnime.animation != &gYoungGanondorfHorsebackRearAnim) {
Animation_PlayLoopSetSpeed(&this->skin.skelAnime, &gYoungGanondorfHorsebackRearAnim, 1.0f);
}
} else if (this->skin.skelAnime.animation != &gHorseGanonRearingAnim) {
Animation_PlayLoopSetSpeed(&this->skin.skelAnime, &gHorseGanonRearingAnim, 1.0f);
@ -301,44 +301,49 @@ void EnViewer_UpdateImpl(EnViewer* this, PlayState* play) {
switch (this->state) {
case 0:
if (play->csCtx.npcActions[1]->action == 4) {
Animation_MorphToPlayOnce(&this->skin.skelAnime, &object_gndd_Anim_000F54, -5.0f);
Animation_MorphToPlayOnce(&this->skin.skelAnime,
&gYoungGanondorfHorsebackLookSidewaysStartAnim, -5.0f);
this->state++;
}
break;
case 1:
if (animationEnded) {
Animation_MorphToLoop(&this->skin.skelAnime, &object_gndd_Anim_0014F4, -5.0f);
Animation_MorphToLoop(&this->skin.skelAnime, &gYoungGanondorfHorsebackLookSidewaysLoopAnim,
-5.0f);
this->state++;
}
break;
case 2:
if (play->csCtx.npcActions[1]->action == 5) {
Animation_MorphToPlayOnce(&this->skin.skelAnime, &object_gndd_Anim_0008A0, -5.0f);
Animation_MorphToPlayOnce(&this->skin.skelAnime,
&gYoungGanondorfHorsebackMagicChargeUpStartAnim, -5.0f);
this->state++;
}
break;
case 3:
if (animationEnded) {
Animation_MorphToLoop(&this->skin.skelAnime, &object_gndd_Anim_000BC8, -5.0f);
Animation_MorphToLoop(&this->skin.skelAnime, &gYoungGanondorfHorsebackMagicChargeUpLoopAnim,
-5.0f);
this->state++;
}
break;
case 4:
if (play->csCtx.npcActions[1]->action == 11) {
Animation_MorphToLoop(&this->skin.skelAnime, &object_gndd_Anim_0014F4, -20.0f);
Animation_MorphToLoop(&this->skin.skelAnime, &gYoungGanondorfHorsebackLookSidewaysLoopAnim,
-20.0f);
this->state++;
}
break;
case 5:
if (play->csCtx.npcActions[1]->action == 8) {
Animation_MorphToLoop(&this->skin.skelAnime, &object_gndd_Anim_002928, -15.0f);
Animation_MorphToLoop(&this->skin.skelAnime, &gYoungGanondorfHorsebackIdleAnim, -15.0f);
this->state++;
}
break;
case 6:
if (play->csCtx.npcActions[1]->action == 12) {
Audio_PlayActorSfx2(&this->actor, NA_SE_EN_GANON_VOICE_DEMO);
Animation_PlayLoopSetSpeed(&this->skin.skelAnime, &object_gndd_Anim_0005B4, 3.0f);
Animation_PlayLoopSetSpeed(&this->skin.skelAnime, &gYoungGanondorfHorsebackRideAnim, 3.0f);
this->state++;
}
break;
@ -433,13 +438,13 @@ void EnViewer_UpdateImpl(EnViewer* this, PlayState* play) {
play->csCtx.npcActions[1]->action == 7) {
Audio_PlaySfxGeneral(NA_SE_EN_GANON_LAUGH, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale,
&gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
Animation_MorphToPlayOnce(&this->skin.skelAnime, &object_gndd_Anim_004534, -5.0f);
Animation_MorphToPlayOnce(&this->skin.skelAnime, &gYoungGanondorfLaughStartAnim, -5.0f);
this->state++;
}
break;
case 1:
if (animationEnded) {
Animation_MorphToLoop(&this->skin.skelAnime, &object_gndd_Anim_0048B0, -5.0f);
Animation_MorphToLoop(&this->skin.skelAnime, &gYoungGanondorfLaughLoopAnim, -5.0f);
this->state++;
}
break;
@ -449,26 +454,26 @@ void EnViewer_UpdateImpl(EnViewer* this, PlayState* play) {
case 0:
if (play->csCtx.state != CS_STATE_IDLE) {
if (play->csCtx.npcActions[1] != NULL && play->csCtx.npcActions[1]->action == 9) {
Animation_PlayLoopSetSpeed(&this->skin.skelAnime, &object_gndd_Anim_0050A8, 1.0f);
Animation_PlayLoopSetSpeed(&this->skin.skelAnime, &gYoungGanondorfWalkAnim, 1.0f);
this->state++;
}
}
break;
case 1:
if (play->csCtx.npcActions[1]->action == 10) {
Animation_MorphToPlayOnce(&this->skin.skelAnime, &object_gndd_Anim_003284, -10.0f);
Animation_MorphToPlayOnce(&this->skin.skelAnime, &gYoungGanondorfKneelStartAnim, -10.0f);
this->state++;
}
break;
case 2:
if (animationEnded) {
Animation_MorphToLoop(&this->skin.skelAnime, &object_gndd_Anim_003D84, -5.0f);
Animation_MorphToLoop(&this->skin.skelAnime, &gYoungGanondorfKneelLoopAnim, -5.0f);
this->state++;
}
break;
case 3:
if (play->csCtx.npcActions[1]->action == 4) {
Animation_MorphToPlayOnce(&this->skin.skelAnime, &object_gndd_Anim_003428, -5.0f);
Animation_MorphToPlayOnce(&this->skin.skelAnime, &gYoungGanondorfKneelLookSidewaysAnim, -5.0f);
this->state++;
}
break;
@ -490,14 +495,14 @@ s32 EnViewer_Ganondorf3OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dL
void* thisx) {
if (gSaveContext.sceneLayer == 4) {
if (play->csCtx.frames >= 400) {
if (limbIndex == 5) {
*dList = object_gndd_DL_00E1A8;
if (limbIndex == YOUNG_GANONDORF_LIMB_LEFT_HAND) {
*dList = gYoungGanondorfOpenLeftHandDL;
}
}
} else {
if (play->csCtx.frames >= 1510 && play->csCtx.frames <= 1650) {
if (limbIndex == 5) {
*dList = object_gndd_DL_00E1A8;
if (limbIndex == YOUNG_GANONDORF_LIMB_LEFT_HAND) {
*dList = gYoungGanondorfOpenLeftHandDL;
}
}
}
@ -518,7 +523,7 @@ void EnViewer_Ganondorf9PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList
void EnViewer_GanondorfPostLimbDrawUpdateCapeVec(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, void* thisx) {
static Vec3f zeroVec = { 0.0f, 0.0f, 0.0f };
if (limbIndex == 15) {
if (limbIndex == YOUNG_GANONDORF_LIMB_HEAD) {
Matrix_MultVec3f(&zeroVec, &sGanondorfNeckWorldPos);
}
}
@ -536,20 +541,20 @@ void EnViewer_DrawGanondorf(EnViewer* this, PlayState* play) {
}
if (frames + 1127 >= play->csCtx.frames) {
gSPSegment(POLY_OPA_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(&object_gndd_Tex_00F178));
gSPSegment(POLY_OPA_DISP++, 0x09, SEGMENTED_TO_VIRTUAL(&object_gndd_Tex_00F178));
gSPSegment(POLY_OPA_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(&gYoungGanondorfEyeOpenTex));
gSPSegment(POLY_OPA_DISP++, 0x09, SEGMENTED_TO_VIRTUAL(&gYoungGanondorfEyeOpenTex));
} else if (frames + 1128 >= play->csCtx.frames) {
gSPSegment(POLY_OPA_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(&object_gndd_Tex_00F378));
gSPSegment(POLY_OPA_DISP++, 0x09, SEGMENTED_TO_VIRTUAL(&object_gndd_Tex_00F378));
gSPSegment(POLY_OPA_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(&gYoungGanondorfEyeHalfTex));
gSPSegment(POLY_OPA_DISP++, 0x09, SEGMENTED_TO_VIRTUAL(&gYoungGanondorfEyeHalfTex));
} else if (frames + 1129 >= play->csCtx.frames) {
gSPSegment(POLY_OPA_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(&object_gndd_Tex_00F578));
gSPSegment(POLY_OPA_DISP++, 0x09, SEGMENTED_TO_VIRTUAL(&object_gndd_Tex_00F578));
gSPSegment(POLY_OPA_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(&gYoungGanondorfEyeClosedTex));
gSPSegment(POLY_OPA_DISP++, 0x09, SEGMENTED_TO_VIRTUAL(&gYoungGanondorfEyeClosedTex));
} else {
gSPSegment(POLY_OPA_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(&object_gndd_Tex_00F778));
gSPSegment(POLY_OPA_DISP++, 0x09, SEGMENTED_TO_VIRTUAL(&object_gndd_Tex_00F778));
gSPSegment(POLY_OPA_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(&gYoungGanondorfEyeLookingDownTex));
gSPSegment(POLY_OPA_DISP++, 0x09, SEGMENTED_TO_VIRTUAL(&gYoungGanondorfEyeLookingDownTex));
}
} else if (type == ENVIEWER_TYPE_9_GANONDORF) {
gSPSegment(POLY_XLU_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(&gGanondorfCrazedEyeTex));

View file

@ -58,6 +58,34 @@ typedef struct {
/* 0x30 */ u8 state;
} EnViewerFireEffect; // size = 0x34
typedef enum {
/* 0 */ YOUNG_GANONDORF_LIMB_NONE,
/* 1 */ YOUNG_GANONDORF_LIMB_ROOT,
/* 2 */ YOUNG_GANONDORF_LIMB_TORSO,
/* 3 */ YOUNG_GANONDORF_LIMB_LEFT_UPPER_ARM,
/* 4 */ YOUNG_GANONDORF_LIMB_LEFT_FOREARM,
/* 5 */ YOUNG_GANONDORF_LIMB_LEFT_HAND,
/* 6 */ YOUNG_GANONDORF_LIMB_RIGHT_UPPER_ARM,
/* 7 */ YOUNG_GANONDORF_LIMB_RIGHT_FOREARM,
/* 8 */ YOUNG_GANONDORF_LIMB_RIGHT_HAND,
/* 9 */ YOUNG_GANONDORF_LIMB_JEWEL,
/* 10 */ YOUNG_GANONDORF_LIMB_LEFT_UPPER_LIP,
/* 11 */ YOUNG_GANONDORF_LIMB_JAW,
/* 12 */ YOUNG_GANONDORF_LIMB_CHIN,
/* 13 */ YOUNG_GANONDORF_LIMB_RIGHT_UPPER_LIP,
/* 14 */ YOUNG_GANONDORF_LIMB_TEETH,
/* 15 */ YOUNG_GANONDORF_LIMB_HEAD,
/* 16 */ YOUNG_GANONDORF_LIMB_PELVIS,
/* 17 */ YOUNG_GANONDORF_LIMB_LEFT_THIGH,
/* 18 */ YOUNG_GANONDORF_LIMB_LEFT_SHIN,
/* 19 */ YOUNG_GANONDORF_LIMB_LEFT_FOOT,
/* 20 */ YOUNG_GANONDORF_LIMB_KNIFE,
/* 21 */ YOUNG_GANONDORF_LIMB_RIGHT_THIGH,
/* 22 */ YOUNG_GANONDORF_LIMB_RIGHT_SHIN,
/* 23 */ YOUNG_GANONDORF_LIMB_RIGHT_FOOT,
/* 24 */ YOUNG_GANONDORF_LIMB_MAX
} YoungGanondorfLimb;
typedef struct EnViewer {
/* 0x0000 */ Actor actor;
/* 0x014C */ Skin skin;