Animation Cleanup Part 1: Dm Actors (#1290)

* DM cleanup

* cleanup

* fix pointer

* rm unused anim enum

* PR Suggestions

* spacing

* missed one

* More PR Suggestions

* oops
This commit is contained in:
engineer124 2023-07-11 00:00:42 +10:00 committed by GitHub
parent b3eae0e5b7
commit 82318a1c1b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
33 changed files with 1209 additions and 767 deletions

View File

@ -640,7 +640,7 @@ s32 Npc_UpdateTalking(PlayState* play, Actor* actor, s16* talkState, f32 interac
void Npc_TrackPoint(Actor* actor, NpcInteractInfo* interactInfo, s16 presetIndex, s16 trackingMode);
void func_800BD9E0(PlayState* play, SkelAnime* skelAnime, OverrideLimbDraw overrideLimbDraw, PostLimbDraw postLimbDraw, Actor* actor, s16 alpha);
void func_800BDAA0(PlayState* play, SkelAnime* skelAnime, OverrideLimbDraw overrideLimbDraw, PostLimbDraw postLimbDraw, Actor* actor, s16 alpha);
void Actor_ChangeAnimationByInfo(SkelAnime* skelAnime, AnimationInfo* animationInfo, s32 animIndex);
void Actor_ChangeAnimationByInfo(SkelAnime* skelAnime, AnimationInfo* animInfo, s32 animIndex);
void Actor_Noop(Actor* actor, PlayState* play);
void Gfx_DrawDListOpa(PlayState* play, Gfx* dlist);

View File

@ -4451,18 +4451,19 @@ s16 func_800BDB6C(Actor* actor, PlayState* play, s16 arg2, f32 arg3) {
return arg2;
}
void Actor_ChangeAnimationByInfo(SkelAnime* skelAnime, AnimationInfo* animationInfo, s32 animIndex) {
f32 frameCount;
void Actor_ChangeAnimationByInfo(SkelAnime* skelAnime, AnimationInfo* animInfo, s32 animIndex) {
f32 endFrame;
animationInfo += animIndex;
if (animationInfo->frameCount > 0.0f) {
frameCount = animationInfo->frameCount;
animInfo += animIndex;
if (animInfo->frameCount > 0.0f) {
endFrame = animInfo->frameCount;
} else {
frameCount = Animation_GetLastFrame(&animationInfo->animation->common);
endFrame = Animation_GetLastFrame(&animInfo->animation->common);
}
Animation_Change(skelAnime, animationInfo->animation, animationInfo->playSpeed, animationInfo->startFrame,
frameCount, animationInfo->mode, animationInfo->morphFrames);
Animation_Change(skelAnime, animInfo->animation, animInfo->playSpeed, animInfo->startFrame, endFrame,
animInfo->mode, animInfo->morphFrames);
}
/**

View File

@ -27,19 +27,26 @@ ActorInit Dm_Ah_InitVars = {
(ActorFunc)DmAh_Draw,
};
static AnimationInfoS sAnimations[] = {
{ &object_ah_Anim_001860, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
{ &object_ah_Anim_000DDC, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
typedef enum {
/* -1 */ DMAH_ANIM_NONE = -1,
/* 0 */ DMAH_ANIM_0,
/* 1 */ DMAH_ANIM_1,
/* 2 */ DMAH_ANIM_MAX
} DmAhAnimation;
static AnimationInfoS sAnimationInfo[DMAH_ANIM_MAX] = {
{ &object_ah_Anim_001860, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // DMAH_ANIM_0
{ &object_ah_Anim_000DDC, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // DMAH_ANIM_1
};
s32 func_80C1D410(DmAh* this, s32 animationIndex) {
s32 ret = false;
s32 DmAh_ChangeAnim(DmAh* this, s32 animIndex) {
s32 didAnimChange = false;
if (animationIndex != this->animationIndex) {
this->animationIndex = animationIndex;
ret = SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimations, animationIndex);
if (this->animIndex != animIndex) {
this->animIndex = animIndex;
didAnimChange = SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, animIndex);
}
return ret;
return didAnimChange;
}
void func_80C1D458(DmAh* this) {
@ -122,52 +129,54 @@ Actor* func_80C1D78C(PlayState* play) {
return foundActor;
}
void func_80C1D7FC(DmAh* this, PlayState* play) {
s32 D_80C1DE00[] = { 0, 0, 0, 0, 0 };
void DmAh_HandleCutscene(DmAh* this, PlayState* play) {
s32 csAnimIndex[] = {
DMAH_ANIM_0, DMAH_ANIM_0, DMAH_ANIM_0, DMAH_ANIM_0, DMAH_ANIM_0,
};
u16 cueId;
s32 cueChannel;
if (play->csCtx.state != CS_STATE_IDLE) {
if (!this->unk_29C) {
if (!this->isCutscenePlaying) {
this->cueId = 255;
this->unk_29C = true;
this->animationIndex2 = this->animationIndex;
this->isCutscenePlaying = true;
this->prevAnimIndex = this->animIndex;
}
if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_562)) {
cueChannel = Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_562);
cueId = play->csCtx.actorCues[cueChannel]->id;
if (this->cueId != (u8)cueId) {
this->cueId = cueId;
func_80C1D410(this, D_80C1DE00[cueId]);
DmAh_ChangeAnim(this, csAnimIndex[cueId]);
}
Cutscene_ActorTranslateAndYaw(&this->actor, play, cueChannel);
}
} else if (this->unk_29C) {
this->unk_29C = false;
func_80C1D410(this, this->animationIndex2);
} else if (this->isCutscenePlaying) {
this->isCutscenePlaying = false;
DmAh_ChangeAnim(this, this->prevAnimIndex);
}
}
void func_80C1D92C(DmAh* this, PlayState* play) {
void DmAh_DoNothing(DmAh* this, PlayState* play) {
}
void DmAh_Init(Actor* thisx, PlayState* play) {
DmAh* this = THIS;
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 20.0f);
SkelAnime_InitFlex(play, &this->skelAnime, &object_ah_Skel_009E70, NULL, this->morphTable, this->jointTable,
SkelAnime_InitFlex(play, &this->skelAnime, &object_ah_Skel_009E70, NULL, this->jointTable, this->morphTable,
OBJECT_AH_LIMB_MAX);
this->animationIndex = -1;
func_80C1D410(this, 0);
this->animIndex = DMAH_ANIM_NONE;
DmAh_ChangeAnim(this, DMAH_ANIM_0);
this->actor.flags &= ~ACTOR_FLAG_1;
Actor_SetScale(&this->actor, 0.01f);
this->unk_27C |= 1;
if ((play->sceneId == SCENE_YADOYA) && (play->curSpawn == 4)) {
this->unk_280 = func_80C1D78C(play);
func_80C1D410(this, 1);
this->actionFunc = func_80C1D92C;
DmAh_ChangeAnim(this, DMAH_ANIM_1);
this->actionFunc = DmAh_DoNothing;
} else {
this->actionFunc = func_80C1D7FC;
this->actionFunc = DmAh_HandleCutscene;
}
}

View File

@ -16,8 +16,8 @@ typedef struct DmAh {
/* 0x198 */ Vec3f unk_198;
/* 0x1A4 */ Vec3s unk_1A4;
/* 0x1AA */ Vec3s unk_1AA;
/* 0x1B0 */ Vec3s morphTable[OBJECT_AH_LIMB_MAX];
/* 0x216 */ Vec3s jointTable[OBJECT_AH_LIMB_MAX];
/* 0x1B0 */ Vec3s jointTable[OBJECT_AH_LIMB_MAX];
/* 0x216 */ Vec3s morphTable[OBJECT_AH_LIMB_MAX];
/* 0x27C */ u16 unk_27C;
/* 0x27E */ u8 cueId;
/* 0x280 */ Actor* unk_280;
@ -28,9 +28,9 @@ typedef struct DmAh {
/* 0x28C */ s16 unk_28C;
/* 0x28E */ s16 unk_28E;
/* 0x290 */ s16 unk_290;
/* 0x294 */ s32 animationIndex;
/* 0x298 */ s32 animationIndex2;
/* 0x29C */ s32 unk_29C;
/* 0x294 */ s32 animIndex;
/* 0x298 */ s32 prevAnimIndex;
/* 0x29C */ s32 isCutscenePlaying;
} DmAh; // size = 0x2A0
#endif // Z_DM_AH_H

View File

@ -28,47 +28,51 @@ ActorInit Dm_Al_InitVars = {
};
typedef enum {
/* 0 */ MADAME_AROMA_ANIM_0,
/* 1 */ MADAME_AROMA_ANIM_1
/* -1 */ MADAME_AROMA_ANIM_NONE = -1,
/* 0 */ MADAME_AROMA_ANIM_0,
/* 1 */ MADAME_AROMA_ANIM_MAX
} DmAlAnimation;
static AnimationInfoS sAnimationInfo[] = {
{ &object_al_Anim_00DBE0, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
static AnimationInfoS sAnimationInfo[MADAME_AROMA_ANIM_MAX] = {
{ &object_al_Anim_00DBE0, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // MADAME_AROMA_ANIM_0
};
s32 DmAl_ChangeAnim(DmAl* this, s32 animIndex) {
s32 didAnimationChange = false;
s32 didAnimChange = false;
if (animIndex != this->animIndex) {
if (this->animIndex != animIndex) {
this->animIndex = animIndex;
didAnimationChange = SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, animIndex);
didAnimChange = SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, animIndex);
}
return didAnimationChange;
return didAnimChange;
}
void func_80C1BDD8(DmAl* this, PlayState* play) {
s32 D_80C1C280[] = { 0, 0, 0, 0, 0 };
void DmAl_HandleCutscene(DmAl* this, PlayState* play) {
s32 csAnimIndex[] = {
MADAME_AROMA_ANIM_0, MADAME_AROMA_ANIM_0, MADAME_AROMA_ANIM_0, MADAME_AROMA_ANIM_0, MADAME_AROMA_ANIM_0,
};
u16 cueId;
s32 cueChannel;
if (play->csCtx.state != CS_STATE_IDLE) {
if (!this->unk_45C) {
if (!this->isCutscenePlaying) {
this->cueId = 255;
this->unk_45C = true;
this->animIndex2 = this->animIndex;
this->isCutscenePlaying = true;
this->prevAnimIndex = this->animIndex;
}
if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_562)) {
cueChannel = Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_562);
cueId = play->csCtx.actorCues[cueChannel]->id;
if (this->cueId != (u8)cueId) {
this->cueId = cueId;
DmAl_ChangeAnim(this, D_80C1C280[cueId]);
DmAl_ChangeAnim(this, csAnimIndex[cueId]);
}
Cutscene_ActorTranslateAndYaw(&this->actor, play, cueChannel);
}
} else if (this->unk_45C) {
this->unk_45C = false;
DmAl_ChangeAnim(this, this->animIndex2);
} else if (this->isCutscenePlaying) {
this->isCutscenePlaying = false;
DmAl_ChangeAnim(this, this->prevAnimIndex);
}
}
@ -78,11 +82,11 @@ void DmAl_Init(Actor* thisx, PlayState* play) {
ActorShape_Init(&this->actor.shape, 0.0f, NULL, 0.0f);
SkelAnime_InitFlex(play, &this->skelAnime, &gMadameAromaSkel, NULL, this->jointTable, this->morphTable,
MADAME_AROMA_LIMB_MAX);
this->animIndex = -1;
this->animIndex = MADAME_AROMA_ANIM_NONE;
DmAl_ChangeAnim(this, MADAME_AROMA_ANIM_0);
this->actor.flags &= ~ACTOR_FLAG_1;
Actor_SetScale(&this->actor, 0.01f);
this->actionFunc = func_80C1BDD8;
this->actionFunc = DmAl_HandleCutscene;
}
void DmAl_Destroy(Actor* thisx, PlayState* play) {
@ -106,6 +110,9 @@ s32 DmAl_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* ro
case MADAME_AROMA_LIMB_SHAWL_RIGHT_LOWER:
*dList = NULL;
break;
default:
break;
}
return false;
}
@ -117,21 +124,27 @@ void DmAl_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
case MADAME_AROMA_LIMB_SHAWL_MIDDLE:
Matrix_Get(&this->shawlMatrices[0]);
break;
case MADAME_AROMA_LIMB_SHAWL_UPPER:
Matrix_Get(&this->shawlMatrices[1]);
break;
case MADAME_AROMA_LIMB_SHAWL_LEFT_LOWER_MIDDLE:
Matrix_Get(&this->shawlMatrices[2]);
break;
case MADAME_AROMA_LIMB_SHAWL_LEFT_LOWER:
Matrix_Get(&this->shawlMatrices[3]);
break;
case MADAME_AROMA_LIMB_SHAWL_RIGHT_LOWER_MIDDLE:
Matrix_Get(&this->shawlMatrices[4]);
break;
case MADAME_AROMA_LIMB_SHAWL_RIGHT_LOWER:
Matrix_Get(&this->shawlMatrices[5]);
break;
default:
break;
}

View File

@ -17,13 +17,8 @@ typedef struct DmAl {
/* 0x3AE */ Vec3s morphTable[MADAME_AROMA_LIMB_MAX];
/* 0x450 */ u8 cueId;
/* 0x454 */ s32 animIndex;
/* 0x458 */ s32 animIndex2;
/* 0x45C */ s32 unk_45C;
/* 0x458 */ s32 prevAnimIndex;
/* 0x45C */ s32 isCutscenePlaying;
} DmAl; // size = 0x460
typedef enum {
/* 0 */ MADAME_AROMA_ANIMATION_0,
/* 1 */ MADAME_AROMA_ANIMATION_1
} DmAlAnimations;
#endif // Z_DM_AL_H

View File

@ -17,8 +17,8 @@ void DmAn_Destroy(Actor* thisx, PlayState* play);
void DmAn_Update(Actor* thisx, PlayState* play);
void func_80C1C958(DmAn* this, PlayState* play);
void func_80C1CAB0(DmAn* this, PlayState* play);
void func_80C1CC80(DmAn* this, PlayState* play);
void DmAn_HandleCutscene(DmAn* this, PlayState* play);
void DmAn_DoNothing(DmAn* this, PlayState* play);
void func_80C1D0B0(Actor* thisx, PlayState* play);
ActorInit Dm_An_InitVars = {
@ -33,29 +33,48 @@ ActorInit Dm_An_InitVars = {
(ActorFunc)NULL,
};
static AnimationInfoS sAnimationInfo[] = {
{ &object_an1_Anim_007E08, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
{ &object_an1_Anim_0071E8, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
{ &object_an4_Anim_006CC0, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
{ &object_an1_Anim_013E1C, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
{ &object_an4_Anim_007E3C, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
{ &object_an4_Anim_0088C0, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
{ &object_an4_Anim_0013C8, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
{ &object_an4_Anim_002550, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
{ &object_an4_Anim_00353C, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
{ &object_an4_Anim_004498, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
{ &object_an4_Anim_0060B4, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
{ &object_an4_Anim_00041C, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
{ &object_an4_Anim_004A78, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
{ &object_an4_Anim_00506C, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
typedef enum {
/* -1 */ DMAN_ANIM_NONE = -1,
/* 0x0 */ DMAN_ANIM_0,
/* 0x1 */ DMAN_ANIM_1,
/* 0x2 */ DMAN_ANIM_2,
/* 0x3 */ DMAN_ANIM_3,
/* 0x4 */ DMAN_ANIM_4,
/* 0x5 */ DMAN_ANIM_5,
/* 0x6 */ DMAN_ANIM_6,
/* 0x7 */ DMAN_ANIM_7,
/* 0x8 */ DMAN_ANIM_8,
/* 0x9 */ DMAN_ANIM_9,
/* 0xA */ DMAN_ANIM_10,
/* 0xB */ DMAN_ANIM_11,
/* 0xC */ DMAN_ANIM_12,
/* 0xD */ DMAN_ANIM_13,
/* 0xE */ DMAN_ANIM_MAX
} DmAnAnimation;
static AnimationInfoS sAnimationInfo[DMAN_ANIM_MAX] = {
{ &object_an1_Anim_007E08, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // DMAN_ANIM_0
{ &object_an1_Anim_0071E8, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // DMAN_ANIM_1
{ &object_an4_Anim_006CC0, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // DMAN_ANIM_2
{ &object_an1_Anim_013E1C, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // DMAN_ANIM_3
{ &object_an4_Anim_007E3C, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // DMAN_ANIM_4
{ &object_an4_Anim_0088C0, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // DMAN_ANIM_5
{ &object_an4_Anim_0013C8, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // DMAN_ANIM_6
{ &object_an4_Anim_002550, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // DMAN_ANIM_7
{ &object_an4_Anim_00353C, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // DMAN_ANIM_8
{ &object_an4_Anim_004498, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // DMAN_ANIM_9
{ &object_an4_Anim_0060B4, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // DMAN_ANIM_10
{ &object_an4_Anim_00041C, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // DMAN_ANIM_11
{ &object_an4_Anim_004A78, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // DMAN_ANIM_12
{ &object_an4_Anim_00506C, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // DMAN_ANIM_13
};
s32 func_80C1C410(DmAn* this, PlayState* play) {
s32 DmAn_UpdateSkelAnime(DmAn* this, PlayState* play) {
s8 objectIndex = this->actor.objBankIndex;
s8 objectIndex2;
s32 ret = false;
s32 isAnimFinished = false;
if (this->unk_2C8 < 2) {
if (this->animIndex <= DMAN_ANIM_1) {
objectIndex2 = this->actor.objBankIndex;
} else {
objectIndex2 = this->unk_2AC;
@ -63,30 +82,32 @@ s32 func_80C1C410(DmAn* this, PlayState* play) {
if (objectIndex2 >= 0) {
gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[objectIndex2].segment);
ret = SkelAnime_Update(&this->skelAnime);
isAnimFinished = SkelAnime_Update(&this->skelAnime);
gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[objectIndex].segment);
}
return ret;
return isAnimFinished;
}
s32 func_80C1C4D8(DmAn* this, PlayState* play, s32 arg2) {
s32 DmAn_ChangeAnim(DmAn* this, PlayState* play, s32 animIndex) {
s8 objectIndex = this->actor.objBankIndex;
s8 objectIndex2;
s32 ret = false;
s32 didAnimChange = false;
if (arg2 < 2) {
if (animIndex <= DMAN_ANIM_1) {
objectIndex2 = this->actor.objBankIndex;
} else {
objectIndex2 = this->unk_2AC;
}
if ((objectIndex2 >= 0) && (arg2 != this->unk_2C8)) {
if ((objectIndex2 >= 0) && (this->animIndex != animIndex)) {
gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[objectIndex2].segment);
this->unk_2C8 = arg2;
ret = SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, arg2);
this->animIndex = animIndex;
didAnimChange = SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, animIndex);
gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[objectIndex].segment);
}
return ret;
return didAnimChange;
}
void func_80C1C5B4(DmAn* this) {
@ -176,8 +197,8 @@ void func_80C1C958(DmAn* this, PlayState* play) {
SkelAnime_InitFlex(play, &this->skelAnime, &object_an1_Skel_012618, NULL, this->jointTable, this->morphTable,
OBJECT_AN1_LIMB_MAX);
this->unk_2C8 = -1;
func_80C1C4D8(this, play, 0);
this->animIndex = DMAN_ANIM_NONE;
DmAn_ChangeAnim(this, play, DMAN_ANIM_0);
this->actor.flags &= ~ACTOR_FLAG_1;
Actor_SetScale(&this->actor, 0.01f);
this->unk_2AE |= 1;
@ -185,25 +206,28 @@ void func_80C1C958(DmAn* this, PlayState* play) {
if ((play->sceneId == SCENE_YADOYA) && (play->curSpawn == 4)) {
this->unk_2B4 = func_80C1C8E8(play);
func_80C1C4D8(this, play, 1);
this->actionFunc = func_80C1CC80;
DmAn_ChangeAnim(this, play, DMAN_ANIM_1);
this->actionFunc = DmAn_DoNothing;
} else {
this->actionFunc = func_80C1CAB0;
this->actionFunc = DmAn_HandleCutscene;
}
}
}
void func_80C1CAB0(DmAn* this, PlayState* play) {
s32 sp28[] = { 0, 0, 12, 2, 4, 6, 8, 10, 11, 3 };
void DmAn_HandleCutscene(DmAn* this, PlayState* play) {
s32 csAnimIndex[] = {
DMAN_ANIM_0, DMAN_ANIM_0, DMAN_ANIM_12, DMAN_ANIM_2, DMAN_ANIM_4,
DMAN_ANIM_6, DMAN_ANIM_8, DMAN_ANIM_10, DMAN_ANIM_11, DMAN_ANIM_3,
};
u16 cueId;
s32 cueChannel;
if (play->csCtx.state != CS_STATE_IDLE) {
if (this->unk_2D0 == 0) {
if (!this->isCutscenePlaying) {
this->cueId = 255;
this->unk_2D0 = 1;
this->unk_2D4 = 0;
this->unk_2CC = this->unk_2C8;
this->isCutscenePlaying = true;
this->didAnimChangeInCs = false;
this->prevAnimIndex = this->animIndex;
}
if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_557)) {
@ -212,8 +236,8 @@ void func_80C1CAB0(DmAn* this, PlayState* play) {
if (this->cueId != (u8)cueId) {
this->cueId = cueId;
this->unk_2D4 = 1;
func_80C1C4D8(this, play, sp28[cueId]);
this->didAnimChangeInCs = true;
DmAn_ChangeAnim(this, play, csAnimIndex[cueId]);
}
switch (this->cueId) {
@ -223,9 +247,10 @@ void func_80C1CAB0(DmAn* this, PlayState* play) {
case 6:
case 7:
case 8:
if ((this->unk_2C8 == 12) || (this->unk_2C8 == 4) || (this->unk_2C8 == 6) || (this->unk_2C8 == 8)) {
if ((this->animIndex == DMAN_ANIM_12) || (this->animIndex == DMAN_ANIM_4) ||
(this->animIndex == DMAN_ANIM_6) || (this->animIndex == DMAN_ANIM_8)) {
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
func_80C1C4D8(this, play, this->unk_2C8 + 1);
DmAn_ChangeAnim(this, play, this->animIndex + 1);
}
}
break;
@ -235,14 +260,14 @@ void func_80C1CAB0(DmAn* this, PlayState* play) {
}
Cutscene_ActorTranslateAndYaw(&this->actor, play, cueChannel);
}
} else if (this->unk_2D0 != 0) {
this->unk_2D0 = 0;
this->unk_2D4 = 0;
func_80C1C4D8(this, play, this->unk_2CC);
} else if (this->isCutscenePlaying) {
this->isCutscenePlaying = false;
this->didAnimChangeInCs = false;
DmAn_ChangeAnim(this, play, this->prevAnimIndex);
}
}
void func_80C1CC80(DmAn* this, PlayState* play) {
void DmAn_DoNothing(DmAn* this, PlayState* play) {
}
void DmAn_Init(Actor* thisx, PlayState* play) {
@ -264,7 +289,7 @@ void DmAn_Update(Actor* thisx, PlayState* play) {
func_80C1C83C(this, play);
if (this->actor.draw != NULL) {
func_80C1C410(this, play);
DmAn_UpdateSkelAnime(this, play);
func_80C1C5B4(this);
}
Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 12.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
@ -280,7 +305,7 @@ void func_80C1CD80(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Acto
s8 sp2B = this->actor.objBankIndex;
s8 sp2A = this->unk_2AD;
if ((limbIndex == OBJECT_AN1_LIMB_05) && (this->unk_2D4 != 0)) {
if ((limbIndex == OBJECT_AN1_LIMB_05) && this->didAnimChangeInCs) {
OPEN_DISPS(play->state.gfxCtx);
Matrix_Push();

View File

@ -30,10 +30,10 @@ typedef struct DmAn {
/* 0x2C0 */ s16 unk_2C0;
/* 0x2C2 */ s16 unk_2C2;
/* 0x2C4 */ s16 unk_2C4;
/* 0x2C8 */ s32 unk_2C8;
/* 0x2CC */ s32 unk_2CC;
/* 0x2D0 */ s32 unk_2D0;
/* 0x2D4 */ s32 unk_2D4;
/* 0x2C8 */ s32 animIndex;
/* 0x2CC */ s32 prevAnimIndex;
/* 0x2D0 */ s32 isCutscenePlaying;
/* 0x2D4 */ s32 didAnimChangeInCs;
} DmAn; // size = 0x2D8
#endif // Z_DM_AN_H

View File

@ -30,21 +30,40 @@ ActorInit Dm_Bal_InitVars = {
(ActorFunc)DmBal_Draw,
};
static AnimationInfo sAnimationInfo[] = {
{ &object_bal_Anim_0005FC, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -8.0f },
{ &object_bal_Anim_000840, 1.5f, 0.0f, 0.0f, ANIMMODE_LOOP, -8.0f },
{ &object_bal_Anim_000840, 1.5f, 0.0f, 0.0f, ANIMMODE_ONCE, -4.0f },
{ &object_bal_Anim_00A7DC, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -4.0f },
{ &object_bal_Anim_00B1E8, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -8.0f },
{ &object_bal_Anim_00B604, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -8.0f },
{ &object_bal_Anim_00C498, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -8.0f },
{ &object_bal_Anim_00C8D8, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -8.0f },
{ &object_bal_Anim_00C8D8, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -8.0f },
{ &object_bal_Anim_00C498, 1.0f, 23.0f, 0.0f, ANIMMODE_ONCE, -8.0f },
{ &object_bal_Anim_00D530, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -8.0f },
{ &object_bal_Anim_000C78, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -2.0f },
{ &object_bal_Anim_00CB78, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -2.0f },
{ &object_bal_Anim_001804, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -2.0f },
typedef enum {
/* -1 */ DMBAL_ANIM_NONE = -1,
/* 0x0 */ DMBAL_ANIM_0,
/* 0x1 */ DMBAL_ANIM_1,
/* 0x2 */ DMBAL_ANIM_2,
/* 0x3 */ DMBAL_ANIM_3,
/* 0x4 */ DMBAL_ANIM_4,
/* 0x5 */ DMBAL_ANIM_5,
/* 0x6 */ DMBAL_ANIM_6,
/* 0x7 */ DMBAL_ANIM_7,
/* 0x8 */ DMBAL_ANIM_8,
/* 0x9 */ DMBAL_ANIM_9,
/* 0xA */ DMBAL_ANIM_10,
/* 0xB */ DMBAL_ANIM_11,
/* 0xC */ DMBAL_ANIM_12,
/* 0xD */ DMBAL_ANIM_13,
/* 0xE */ DMBAL_ANIM_MAX
} DmBalAnimation;
static AnimationInfo sAnimationInfo[DMBAL_ANIM_MAX] = {
{ &object_bal_Anim_0005FC, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -8.0f }, // DMBAL_ANIM_0
{ &object_bal_Anim_000840, 1.5f, 0.0f, 0.0f, ANIMMODE_LOOP, -8.0f }, // DMBAL_ANIM_1
{ &object_bal_Anim_000840, 1.5f, 0.0f, 0.0f, ANIMMODE_ONCE, -4.0f }, // DMBAL_ANIM_2
{ &object_bal_Anim_00A7DC, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -4.0f }, // DMBAL_ANIM_3
{ &object_bal_Anim_00B1E8, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -8.0f }, // DMBAL_ANIM_4
{ &object_bal_Anim_00B604, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -8.0f }, // DMBAL_ANIM_5
{ &object_bal_Anim_00C498, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -8.0f }, // DMBAL_ANIM_6
{ &object_bal_Anim_00C8D8, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -8.0f }, // DMBAL_ANIM_7
{ &object_bal_Anim_00C8D8, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -8.0f }, // DMBAL_ANIM_8
{ &object_bal_Anim_00C498, 1.0f, 23.0f, 0.0f, ANIMMODE_ONCE, -8.0f }, // DMBAL_ANIM_9
{ &object_bal_Anim_00D530, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -8.0f }, // DMBAL_ANIM_10
{ &object_bal_Anim_000C78, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -2.0f }, // DMBAL_ANIM_11
{ &object_bal_Anim_00CB78, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -2.0f }, // DMBAL_ANIM_12
{ &object_bal_Anim_001804, 1.0f, 0.0f, 0.0f, ANIMMODE_LOOP, -2.0f }, // DMBAL_ANIM_13
};
void DmBal_Init(Actor* thisx, PlayState* play) {
@ -73,7 +92,7 @@ void DmBal_SetupDoNothing(DmBal* this) {
void DmBal_DoNothing(DmBal* this, PlayState* play) {
}
void func_80C1EAE8(DmBal* this, PlayState* play) {
void DmBal_HandleCutscene(DmBal* this, PlayState* play) {
static u16 sCueId = 99;
s32 cueChannel;
@ -86,14 +105,19 @@ void func_80C1EAE8(DmBal* this, PlayState* play) {
case 1:
this->keepEyesShut = false;
this->eyeIndex = 0;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 0);
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, DMBAL_ANIM_0);
break;
case 2:
this->keepEyesShut = true;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 12);
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, DMBAL_ANIM_12);
break;
case 3:
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, 13);
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, DMBAL_ANIM_13);
break;
default:
break;
}
} else if (sCueId == 3) {
@ -165,7 +189,7 @@ void DmBal_Update(Actor* thisx, PlayState* play) {
DmBal_SpawnPaper(this, play, &pos, &vel, -0.5f);
}
this->actionFunc(this, play);
func_80C1EAE8(this, play);
DmBal_HandleCutscene(this, play);
func_80C1EC60(this, play);
DmBal_UpdateEyes(this);
SkelAnime_Update(&this->skelAnime);
@ -175,7 +199,7 @@ s32 DmBal_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* p
DmBal* this = THIS;
Vec3s rots;
if (limbIndex == 6) {
if (limbIndex == OBJECT_BAL_LIMB_06) {
rots.x = Math_SinS(this->unk_33A) * (0x10000 / 18);
rots.z = Math_CosS(this->unk_33A) * (0x10000 / 18);
Matrix_RotateZYX(rots.x, 0, rots.z, MTXMODE_APPLY);

View File

@ -32,92 +32,182 @@ ActorInit Dm_Char00_InitVars = {
(ActorFunc)DmChar00_Draw,
};
static AnimationInfo sAnimationInfo[] = {
{ &gameplay_keep_Anim_02B2E8, 1.0f, 0.0f, -1.0f, 0, 0.0f },
{ &gameplay_keep_Anim_029140, 1.0f, 0.0f, -1.0f, 0, 0.0f },
{ &object_delf_Anim_004FF4, 1.0f, 0.0f, -1.0f, 2, 0.0f },
{ &object_delf_Anim_0053A4, 1.0f, 0.0f, -1.0f, 2, 0.0f },
{ &object_delf_Anim_005B68, 1.0f, 0.0f, -1.0f, 2, 0.0f },
{ &object_delf_Anim_006328, 1.0f, 0.0f, -1.0f, 2, 0.0f },
{ &object_delf_Anim_00FB30, 1.0f, 0.0f, -1.0f, 2, 0.0f },
{ &object_delf_Anim_010590, 1.0f, 0.0f, -1.0f, 2, 0.0f },
{ &object_delf_Anim_005B68, 1.0f, 37.0f, 56.0f, 4, 0.0f },
{ &object_delf_Anim_006328, 1.0f, 37.0f, 56.0f, 4, 0.0f },
{ &object_delf_Anim_00E024, 1.0f, 0.0f, -1.0f, 2, 0.0f },
{ &object_delf_Anim_00F0D0, 1.0f, 0.0f, -1.0f, 0, 0.0f },
{ &object_delf_Anim_011C70, 1.0f, 0.0f, -1.0f, 0, 0.0f },
{ &object_delf_Anim_011FE0, 1.0f, 0.0f, -1.0f, 0, 0.0f },
{ &object_delf_Anim_011088, 1.0f, 0.0f, -1.0f, 2, 0.0f },
{ &object_delf_Anim_0118FC, 1.0f, 0.0f, -1.0f, 2, 0.0f },
{ &object_delf_Anim_012388, 1.0f, 0.0f, -1.0f, 0, 0.0f },
{ &object_delf_Anim_012738, 1.0f, 0.0f, -1.0f, 0, 0.0f },
{ &object_delf_Anim_013BE0, 1.0f, 0.0f, -1.0f, 2, 0.0f },
{ &object_delf_Anim_013E80, 1.0f, 0.0f, -1.0f, 0, 0.0f },
{ &object_delf_Anim_007B04, 1.0f, 0.0f, -1.0f, 2, 0.0f },
{ &object_delf_Anim_0080A4, 1.0f, 0.0f, -1.0f, 2, 0.0f },
{ &object_delf_Anim_00859C, 1.0f, 0.0f, -1.0f, 0, 0.0f },
{ &object_delf_Anim_008A44, 1.0f, 0.0f, -1.0f, 0, 0.0f },
{ &object_delf_Anim_00EB18, 1.0f, 0.0f, -1.0f, 2, 0.0f },
{ &object_delf_Anim_00EBB0, 1.0f, 0.0f, -1.0f, 2, 0.0f },
{ &object_delf_Anim_00EE30, 1.0f, 0.0f, -1.0f, 0, 0.0f },
{ &object_delf_Anim_012BBC, 1.0f, 0.0f, -1.0f, 2, 0.0f },
{ &object_delf_Anim_012EF8, 1.0f, 0.0f, -1.0f, 0, 0.0f },
{ &object_delf_Anim_00C248, 1.0f, 0.0f, -1.0f, 2, 0.0f },
{ &object_delf_Anim_00C588, 1.0f, 0.0f, -1.0f, 0, 0.0f },
{ &object_delf_Anim_00BDFC, 1.0f, 0.0f, -1.0f, 2, 0.0f },
{ &object_delf_Anim_00C0BC, 1.0f, 0.0f, -1.0f, 0, 0.0f },
{ &object_delf_Anim_013040, 1.0f, 0.0f, -1.0f, 2, 0.0f },
{ &object_delf_Anim_013378, 1.0f, 0.0f, -1.0f, 0, 0.0f },
{ &object_delf_Anim_0091BC, 1.0f, 0.0f, -1.0f, 2, 0.0f },
{ &object_delf_Anim_0094B0, 1.0f, 0.0f, -1.0f, 0, 0.0f },
{ &object_delf_Anim_009C4C, 1.0f, 0.0f, -1.0f, 2, 0.0f },
{ &object_delf_Anim_009F40, 1.0f, 0.0f, -1.0f, 0, 0.0f },
{ &object_delf_Anim_009010, 1.0f, 0.0f, -1.0f, 2, 0.0f },
{ &object_delf_Anim_0097C4, 1.0f, 0.0f, -1.0f, 0, 0.0f },
{ &object_delf_Anim_00A7B4, 1.0f, 0.0f, -1.0f, 2, 0.0f },
{ &object_delf_Anim_00C588, 1.0f, 0.0f, -1.0f, 0, -10.0f },
{ &object_delf_Anim_004FF4, 1.0f, 0.0f, -1.0f, 2, -10.0f },
{ &object_delf_Anim_011C70, 1.0f, 0.0f, -1.0f, 0, -10.0f },
{ &object_delf_Anim_006B28, 1.0f, 0.0f, -1.0f, 2, 0.0f },
{ &object_delf_Anim_014190, 1.0f, 0.0f, -1.0f, 2, 0.0f },
{ &object_delf_Anim_01447C, 1.0f, 0.0f, -1.0f, 0, 0.0f },
{ &object_delf_Anim_003FAC, 1.0f, 0.0f, -1.0f, 2, 0.0f },
{ &object_delf_Anim_004798, 1.0f, 0.0f, -1.0f, 0, 0.0f },
{ &object_delf_Anim_0042E8, 1.0f, 0.0f, -1.0f, 2, 0.0f },
{ &object_delf_Anim_004C44, 1.0f, 0.0f, -1.0f, 0, 0.0f },
{ &object_delf_Anim_01088C, 1.0f, 0.0f, -1.0f, 0, 0.0f },
{ &object_delf_Anim_01498C, 1.0f, 0.0f, -1.0f, 2, 0.0f },
{ &object_delf_Anim_014E9C, 1.0f, 0.0f, -1.0f, 0, 0.0f },
{ &object_delf_Anim_00CEE0, 1.0f, 0.0f, -1.0f, 2, 0.0f },
{ &object_delf_Anim_00D260, 1.0f, 0.0f, -1.0f, 0, 0.0f },
{ &object_delf_Anim_00C690, 1.0f, 0.0f, -1.0f, 0, 0.0f },
{ &object_delf_Anim_00C790, 1.0f, 0.0f, -1.0f, 0, 0.0f },
{ &object_delf_Anim_00AF78, 1.0f, 0.0f, -1.0f, 2, 0.0f },
{ &object_delf_Anim_00B2B8, 1.0f, 0.0f, -1.0f, 0, 0.0f },
{ &object_delf_Anim_00BCD8, 1.0f, 0.0f, -1.0f, 2, 0.0f },
{ &object_delf_Anim_006D74, 1.0f, 0.0f, -1.0f, 2, 0.0f },
{ &object_delf_Anim_00706C, 1.0f, 0.0f, -1.0f, 0, 0.0f },
{ &object_delf_Anim_0072B0, 1.0f, 0.0f, -1.0f, 2, 0.0f },
{ &object_delf_Anim_007570, 1.0f, 0.0f, -1.0f, 0, 0.0f },
{ &object_delf_Anim_00A2A4, 1.0f, 0.0f, -1.0f, 2, 0.0f },
{ &object_delf_Anim_00A4B4, 1.0f, 0.0f, -1.0f, 0, 0.0f },
{ &object_delf_Anim_006614, 1.0f, 0.0f, -1.0f, 0, 0.0f },
{ &object_delf_Anim_015114, 1.0f, 0.0f, -1.0f, 0, 0.0f },
{ &object_delf_Anim_00CCD4, 1.0f, 0.0f, -1.0f, 2, 0.0f },
{ &object_delf_Anim_00046C, 1.0f, 0.0f, -1.0f, 2, 0.0f },
{ &object_delf_Anim_00065C, 1.0f, 0.0f, -1.0f, 0, 0.0f },
{ &object_delf_Anim_00377C, 1.0f, 0.0f, -1.0f, 0, 0.0f },
{ &object_delf_Anim_003148, 1.0f, 0.0f, -1.0f, 0, 0.0f },
{ &object_delf_Anim_001410, 1.0f, 0.0f, -1.0f, 2, 0.0f },
{ &object_delf_Anim_0010F8, 1.0f, 0.0f, -1.0f, 0, 0.0f },
{ &object_delf_Anim_00199C, 1.0f, 0.0f, -1.0f, 2, 0.0f },
{ &object_delf_Anim_003BB4, 1.0f, 0.0f, -1.0f, 0, 0.0f },
{ &object_delf_Anim_001754, 1.0f, 0.0f, -1.0f, 0, 0.0f },
{ &object_delf_Anim_0008E0, 1.0f, 0.0f, -1.0f, 2, 0.0f },
{ &object_delf_Anim_000A94, 1.0f, 0.0f, -1.0f, 0, 0.0f },
{ &object_delf_Anim_001ED4, 1.0f, 0.0f, -1.0f, 0, 0.0f },
{ &object_delf_Anim_001B28, 1.0f, 0.0f, -1.0f, 2, 0.0f },
{ &object_delf_Anim_000E44, 1.0f, 0.0f, -1.0f, 0, 0.0f },
typedef enum {
/* -1 */ DMCHAR00_ANIM_NONE = -1,
/* 0x00 */ DMCHAR00_ANIM_0,
/* 0x01 */ DMCHAR00_ANIM_1,
/* 0x02 */ DMCHAR00_ANIM_2,
/* 0x03 */ DMCHAR00_ANIM_3,
/* 0x04 */ DMCHAR00_ANIM_4,
/* 0x05 */ DMCHAR00_ANIM_5,
/* 0x06 */ DMCHAR00_ANIM_6,
/* 0x07 */ DMCHAR00_ANIM_7,
/* 0x08 */ DMCHAR00_ANIM_8,
/* 0x09 */ DMCHAR00_ANIM_9,
/* 0x0A */ DMCHAR00_ANIM_10,
/* 0x0B */ DMCHAR00_ANIM_11,
/* 0x0C */ DMCHAR00_ANIM_12,
/* 0x0D */ DMCHAR00_ANIM_13,
/* 0x0E */ DMCHAR00_ANIM_14,
/* 0x0F */ DMCHAR00_ANIM_15,
/* 0x10 */ DMCHAR00_ANIM_16,
/* 0x11 */ DMCHAR00_ANIM_17,
/* 0x12 */ DMCHAR00_ANIM_18,
/* 0x13 */ DMCHAR00_ANIM_19,
/* 0x14 */ DMCHAR00_ANIM_20,
/* 0x15 */ DMCHAR00_ANIM_21,
/* 0x16 */ DMCHAR00_ANIM_22,
/* 0x17 */ DMCHAR00_ANIM_23,
/* 0x18 */ DMCHAR00_ANIM_24,
/* 0x19 */ DMCHAR00_ANIM_25,
/* 0x1A */ DMCHAR00_ANIM_26,
/* 0x1B */ DMCHAR00_ANIM_27,
/* 0x1C */ DMCHAR00_ANIM_28,
/* 0x1D */ DMCHAR00_ANIM_29,
/* 0x1E */ DMCHAR00_ANIM_30,
/* 0x1F */ DMCHAR00_ANIM_31,
/* 0x20 */ DMCHAR00_ANIM_32,
/* 0x21 */ DMCHAR00_ANIM_33,
/* 0x22 */ DMCHAR00_ANIM_34,
/* 0x23 */ DMCHAR00_ANIM_35,
/* 0x24 */ DMCHAR00_ANIM_36,
/* 0x25 */ DMCHAR00_ANIM_37,
/* 0x26 */ DMCHAR00_ANIM_38,
/* 0x27 */ DMCHAR00_ANIM_39,
/* 0x28 */ DMCHAR00_ANIM_40,
/* 0x29 */ DMCHAR00_ANIM_41,
/* 0x2A */ DMCHAR00_ANIM_42,
/* 0x2B */ DMCHAR00_ANIM_43,
/* 0x2C */ DMCHAR00_ANIM_44,
/* 0x2D */ DMCHAR00_ANIM_45,
/* 0x2E */ DMCHAR00_ANIM_46,
/* 0x2F */ DMCHAR00_ANIM_47,
/* 0x30 */ DMCHAR00_ANIM_48,
/* 0x31 */ DMCHAR00_ANIM_49,
/* 0x32 */ DMCHAR00_ANIM_50,
/* 0x33 */ DMCHAR00_ANIM_51,
/* 0x34 */ DMCHAR00_ANIM_52,
/* 0x35 */ DMCHAR00_ANIM_53,
/* 0x36 */ DMCHAR00_ANIM_54,
/* 0x37 */ DMCHAR00_ANIM_55,
/* 0x38 */ DMCHAR00_ANIM_56,
/* 0x39 */ DMCHAR00_ANIM_57,
/* 0x3A */ DMCHAR00_ANIM_58,
/* 0x3B */ DMCHAR00_ANIM_59,
/* 0x3C */ DMCHAR00_ANIM_60,
/* 0x3D */ DMCHAR00_ANIM_61,
/* 0x3E */ DMCHAR00_ANIM_62,
/* 0x3F */ DMCHAR00_ANIM_63,
/* 0x40 */ DMCHAR00_ANIM_64,
/* 0x41 */ DMCHAR00_ANIM_65,
/* 0x42 */ DMCHAR00_ANIM_66,
/* 0x43 */ DMCHAR00_ANIM_67,
/* 0x44 */ DMCHAR00_ANIM_68,
/* 0x45 */ DMCHAR00_ANIM_69,
/* 0x46 */ DMCHAR00_ANIM_70,
/* 0x47 */ DMCHAR00_ANIM_71,
/* 0x48 */ DMCHAR00_ANIM_72,
/* 0x49 */ DMCHAR00_ANIM_73,
/* 0x4A */ DMCHAR00_ANIM_74,
/* 0x4B */ DMCHAR00_ANIM_75,
/* 0x4C */ DMCHAR00_ANIM_76,
/* 0x4D */ DMCHAR00_ANIM_77,
/* 0x4E */ DMCHAR00_ANIM_78,
/* 0x4F */ DMCHAR00_ANIM_79,
/* 0x50 */ DMCHAR00_ANIM_80,
/* 0x51 */ DMCHAR00_ANIM_81,
/* 0x52 */ DMCHAR00_ANIM_82,
/* 0x53 */ DMCHAR00_ANIM_83,
/* 0x54 */ DMCHAR00_ANIM_84,
/* 0x55 */ DMCHAR00_ANIM_MAX
} DmChar00Animation;
static AnimationInfo sAnimationInfo[DMCHAR00_ANIM_MAX] = {
{ &gameplay_keep_Anim_02B2E8, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_0
{ &gameplay_keep_Anim_029140, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_1
{ &object_delf_Anim_004FF4, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_2
{ &object_delf_Anim_0053A4, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_3
{ &object_delf_Anim_005B68, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_4
{ &object_delf_Anim_006328, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_5
{ &object_delf_Anim_00FB30, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_6
{ &object_delf_Anim_010590, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_7
{ &object_delf_Anim_005B68, 1.0f, 37.0f, 56.0f, ANIMMODE_LOOP_PARTIAL, 0.0f }, // DMCHAR00_ANIM_8
{ &object_delf_Anim_006328, 1.0f, 37.0f, 56.0f, ANIMMODE_LOOP_PARTIAL, 0.0f }, // DMCHAR00_ANIM_9
{ &object_delf_Anim_00E024, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_10
{ &object_delf_Anim_00F0D0, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_11
{ &object_delf_Anim_011C70, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_12
{ &object_delf_Anim_011FE0, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_13
{ &object_delf_Anim_011088, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_14
{ &object_delf_Anim_0118FC, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_15
{ &object_delf_Anim_012388, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_16
{ &object_delf_Anim_012738, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_17
{ &object_delf_Anim_013BE0, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_18
{ &object_delf_Anim_013E80, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_19
{ &object_delf_Anim_007B04, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_20
{ &object_delf_Anim_0080A4, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_21
{ &object_delf_Anim_00859C, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_22
{ &object_delf_Anim_008A44, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_23
{ &object_delf_Anim_00EB18, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_24
{ &object_delf_Anim_00EBB0, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_25
{ &object_delf_Anim_00EE30, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_26
{ &object_delf_Anim_012BBC, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_27
{ &object_delf_Anim_012EF8, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_28
{ &object_delf_Anim_00C248, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_29
{ &object_delf_Anim_00C588, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_30
{ &object_delf_Anim_00BDFC, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_31
{ &object_delf_Anim_00C0BC, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_32
{ &object_delf_Anim_013040, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_33
{ &object_delf_Anim_013378, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_34
{ &object_delf_Anim_0091BC, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_35
{ &object_delf_Anim_0094B0, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_36
{ &object_delf_Anim_009C4C, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_37
{ &object_delf_Anim_009F40, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_38
{ &object_delf_Anim_009010, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_39
{ &object_delf_Anim_0097C4, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_40
{ &object_delf_Anim_00A7B4, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_41
{ &object_delf_Anim_00C588, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, -10.0f }, // DMCHAR00_ANIM_42
{ &object_delf_Anim_004FF4, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, -10.0f }, // DMCHAR00_ANIM_43
{ &object_delf_Anim_011C70, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, -10.0f }, // DMCHAR00_ANIM_44
{ &object_delf_Anim_006B28, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_45
{ &object_delf_Anim_014190, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_46
{ &object_delf_Anim_01447C, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_47
{ &object_delf_Anim_003FAC, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_48
{ &object_delf_Anim_004798, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_49
{ &object_delf_Anim_0042E8, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_50
{ &object_delf_Anim_004C44, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_51
{ &object_delf_Anim_01088C, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_52
{ &object_delf_Anim_01498C, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_53
{ &object_delf_Anim_014E9C, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_54
{ &object_delf_Anim_00CEE0, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_55
{ &object_delf_Anim_00D260, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_56
{ &object_delf_Anim_00C690, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_57
{ &object_delf_Anim_00C790, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_58
{ &object_delf_Anim_00AF78, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_59
{ &object_delf_Anim_00B2B8, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_60
{ &object_delf_Anim_00BCD8, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_61
{ &object_delf_Anim_006D74, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_62
{ &object_delf_Anim_00706C, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_63
{ &object_delf_Anim_0072B0, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_64
{ &object_delf_Anim_007570, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_65
{ &object_delf_Anim_00A2A4, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_66
{ &object_delf_Anim_00A4B4, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_67
{ &object_delf_Anim_006614, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_68
{ &object_delf_Anim_015114, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_69
{ &object_delf_Anim_00CCD4, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_70
{ &object_delf_Anim_00046C, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_71
{ &object_delf_Anim_00065C, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_72
{ &object_delf_Anim_00377C, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_73
{ &object_delf_Anim_003148, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_74
{ &object_delf_Anim_001410, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_75
{ &object_delf_Anim_0010F8, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_76
{ &object_delf_Anim_00199C, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_77
{ &object_delf_Anim_003BB4, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_78
{ &object_delf_Anim_001754, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_79
{ &object_delf_Anim_0008E0, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_80
{ &object_delf_Anim_000A94, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_81
{ &object_delf_Anim_001ED4, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_82
{ &object_delf_Anim_001B28, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR00_ANIM_83
{ &object_delf_Anim_000E44, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR00_ANIM_84
};
Color_RGBAf D_80AA77A8[] = {
@ -134,18 +224,19 @@ Color_RGBAf D_80AA77D8[] = {
Vec3f D_80AA7808 = { 0.0f, 0.0f, 0.0f };
void func_80AA5580(SkelAnime* skelAnime, AnimationInfo* animation, u16 idx) {
f32 phi_f2;
void DmChar00_ChangeAnim(SkelAnime* skelAnime, AnimationInfo* animInfo, u16 animIndex) {
f32 endFrame;
animation += idx;
animInfo += animIndex;
if (animation->frameCount < 0.0f) {
phi_f2 = Animation_GetLastFrame(animation->animation);
if (animInfo->frameCount < 0.0f) {
endFrame = Animation_GetLastFrame(animInfo->animation);
} else {
phi_f2 = animation->frameCount;
endFrame = animInfo->frameCount;
}
Animation_Change(skelAnime, animation->animation, animation->playSpeed, animation->startFrame, phi_f2,
animation->mode, animation->morphFrames);
Animation_Change(skelAnime, animInfo->animation, animInfo->playSpeed, animInfo->startFrame, endFrame,
animInfo->mode, animInfo->morphFrames);
}
void func_80AA561C(DmChar00* this, PlayState* play) {
@ -167,6 +258,9 @@ void func_80AA561C(DmChar00* this, PlayState* play) {
case 2043:
Actor_PlaySfx(&this->actor, NA_SE_EV_FAIRY_SURPRISE);
break;
default:
break;
}
} else {
switch (play->csCtx.curFrame + 20) {
@ -183,6 +277,9 @@ void func_80AA561C(DmChar00* this, PlayState* play) {
case 2043:
Actor_PlaySfx(&this->actor, NA_SE_EV_MONDO_SURPRISE);
break;
default:
break;
}
}
}
@ -226,6 +323,9 @@ void func_80AA575C(DmChar00* this, PlayState* play) {
case 972:
Actor_PlaySfx(&this->actor, NA_SE_EV_BELL_BRAKE);
break;
default:
break;
}
} else if (play->csCtx.curFrame == 660) {
Actor_PlaySfx(&this->actor, NA_SE_EV_MONDO_SURPRISE);
@ -253,6 +353,9 @@ void func_80AA58CC(DmChar00* this, PlayState* play) {
case 534:
Actor_PlaySfx(&this->actor, NA_SE_EV_FAIRY_ATTACK);
break;
default:
break;
}
}
}
@ -275,6 +378,9 @@ void func_80AA5960(DmChar00* this, PlayState* play) {
case 244:
Actor_PlaySfx(&this->actor, NA_SE_EV_FAIRY_ATTACK);
break;
default:
break;
}
}
}
@ -290,6 +396,9 @@ void func_80AA59E4(DmChar00* this, PlayState* play) {
Actor_PlaySfx(&this->actor, NA_SE_EV_WHITE_FAIRY_DASH);
Actor_PlaySfx(&this->actor, NA_SE_SY_WHITE_OUT_INTO_MOON);
break;
default:
break;
}
} else if (play->csCtx.curFrame == 125) {
Actor_PlaySfx(&this->actor, NA_SE_EV_BLACK_FAIRY_DASH);
@ -307,6 +416,9 @@ void func_80AA5A6C(DmChar00* this, PlayState* play) {
Actor_PlaySfx(&this->actor, NA_SE_EV_WHITE_FAIRY_DASH);
Actor_PlaySfx(&this->actor, NA_SE_SY_WHITE_OUT_INTO_MOON);
break;
default:
break;
}
} else if (play->csCtx.curFrame == 44) {
Actor_PlaySfx(&this->actor, NA_SE_EV_BLACK_FAIRY_DASH);
@ -328,6 +440,9 @@ void func_80AA5AF4(DmChar00* this, PlayState* play) {
case 550:
Actor_PlaySfx(&this->actor, NA_SE_EV_BELL_BRAKE);
break;
default:
break;
}
} else {
switch (play->csCtx.curFrame) {
@ -339,6 +454,9 @@ void func_80AA5AF4(DmChar00* this, PlayState* play) {
case 454:
Actor_PlaySfx(&this->actor, NA_SE_EV_BLACK_FAIRY_DASH);
break;
default:
break;
}
if ((play->csCtx.curFrame >= 500) && (play->csCtx.curFrame < 602)) {
@ -356,6 +474,9 @@ void func_80AA5BF8(DmChar00* this, PlayState* play) {
case 797:
Actor_PlaySfx(&this->actor, NA_SE_EV_WHITE_FAIRY_DASH);
break;
default:
break;
}
} else {
switch (play->csCtx.curFrame) {
@ -366,10 +487,13 @@ void func_80AA5BF8(DmChar00* this, PlayState* play) {
case 797:
Actor_PlaySfx(&this->actor, NA_SE_EV_BLACK_FAIRY_DASH);
break;
default:
break;
}
}
if ((this->unk_261 == 53) && Animation_OnFrame(&this->skelAnime, 16.0f)) {
if ((this->animIndex == DMCHAR00_ANIM_53) && Animation_OnFrame(&this->skelAnime, 16.0f)) {
Actor_PlaySfx(&this->actor, NA_SE_EV_BLACK_FAIRY_DASH);
}
}
@ -390,6 +514,9 @@ void func_80AA5D10(DmChar00* this, PlayState* play) {
case 130:
Actor_PlaySfx(&this->actor, NA_SE_EV_NAVY_VANISH);
break;
default:
break;
}
}
}
@ -405,6 +532,9 @@ void func_80AA5D6C(DmChar00* this, PlayState* play) {
case 31:
Actor_PlaySfx(&this->actor, NA_SE_EV_FAIRY_SURPRISE);
break;
default:
break;
}
}
}
@ -421,6 +551,9 @@ void func_80AA5DC8(DmChar00* this, PlayState* play) {
case 130:
Actor_PlaySfx(&this->actor, NA_SE_EV_NAVY_VANISH);
break;
default:
break;
}
}
}
@ -443,6 +576,9 @@ void func_80AA5E2C(DmChar00* this, PlayState* play) {
case 215:
Actor_PlaySfx(&this->actor, NA_SE_EV_DIVE_INTO_WEED);
break;
default:
break;
}
}
}
@ -519,6 +655,9 @@ void func_80AA5EBC(DmChar00* this, PlayState* play) {
func_80AA5D6C(this, play);
}
break;
default:
break;
}
}
}
@ -540,9 +679,9 @@ void DmChar00_Init(Actor* thisx, PlayState* play) {
ActorShape_Init(&thisx->shape, 0.0f, ActorShadow_DrawCircle, 24.0f);
SkelAnime_Init(play, &this->skelAnime, &gameplay_keep_Skel_02AF58.sh, &gameplay_keep_Anim_029140, this->jointTable,
this->morphTable, 7);
this->morphTable, FAIRY_LIMB_MAX);
ActorShape_Init(&thisx->shape, 0.0f, NULL, 15.0f);
func_80AA5580(&this->skelAnime, sAnimationInfo, 0);
DmChar00_ChangeAnim(&this->skelAnime, &sAnimationInfo[DMCHAR00_ANIM_0], 0);
Actor_SetScale(thisx, 0.01f);
this->actionFunc = func_80AA67F8;
}
@ -550,7 +689,7 @@ void DmChar00_Init(Actor* thisx, PlayState* play) {
void DmChar00_Destroy(Actor* thisx, PlayState* play) {
}
void func_80AA62FC(DmChar00* this, PlayState* play) {
void DmChar00_HandleCutscene(DmChar00* this, PlayState* play) {
u16 cueType = CS_CMD_ACTOR_CUE_113 + DMCHAR00_GET(&this->actor);
s32 cueChannel;
s32 pad;
@ -564,87 +703,87 @@ void func_80AA62FC(DmChar00* this, PlayState* play) {
switch (play->csCtx.actorCues[cueChannel]->id) {
case 0x1:
this->unk_261 = 0;
this->animIndex = DMCHAR00_ANIM_0;
break;
case 0x2:
this->unk_261 = 2;
this->animIndex = DMCHAR00_ANIM_2;
break;
case 0x3:
this->unk_261 = 3;
this->animIndex = DMCHAR00_ANIM_3;
break;
case 0x4:
this->unk_261 = 4;
this->animIndex = DMCHAR00_ANIM_4;
break;
case 0x5:
this->unk_261 = 5;
this->animIndex = DMCHAR00_ANIM_5;
break;
case 0x6:
this->unk_261 = 6;
this->animIndex = DMCHAR00_ANIM_6;
break;
case 0x7:
this->unk_261 = 7;
this->animIndex = DMCHAR00_ANIM_7;
break;
case 0x8:
this->unk_261 = 20;
this->animIndex = DMCHAR00_ANIM_20;
break;
case 0x9:
this->unk_261 = 21;
this->animIndex = DMCHAR00_ANIM_21;
break;
case 0xA:
this->unk_261 = 14;
this->animIndex = DMCHAR00_ANIM_14;
break;
case 0xB:
this->unk_261 = 15;
this->animIndex = DMCHAR00_ANIM_15;
break;
case 0xC:
this->unk_261 = 18;
this->animIndex = DMCHAR00_ANIM_18;
break;
case 0xD:
this->unk_261 = 25;
this->animIndex = DMCHAR00_ANIM_25;
break;
case 0xE:
this->unk_261 = 27;
this->animIndex = DMCHAR00_ANIM_27;
break;
case 0xF:
this->unk_261 = 24;
this->animIndex = DMCHAR00_ANIM_24;
break;
case 0x10:
this->unk_261 = 10;
this->animIndex = DMCHAR00_ANIM_10;
break;
case 0x11:
this->unk_261 = 12;
this->animIndex = DMCHAR00_ANIM_12;
break;
case 0x12:
this->unk_261 = 13;
this->animIndex = DMCHAR00_ANIM_13;
break;
case 0x13:
this->unk_261 = 29;
this->animIndex = DMCHAR00_ANIM_29;
break;
case 0x14:
this->unk_261 = 31;
this->animIndex = DMCHAR00_ANIM_31;
break;
case 0x15:
this->unk_261 = 33;
this->animIndex = DMCHAR00_ANIM_33;
break;
case 0x16:
@ -652,138 +791,138 @@ void func_80AA62FC(DmChar00* this, PlayState* play) {
break;
case 0x17:
this->unk_261 = 35;
this->animIndex = DMCHAR00_ANIM_35;
break;
case 0x18:
this->unk_261 = 37;
this->animIndex = DMCHAR00_ANIM_37;
break;
case 0x19:
this->unk_261 = 39;
this->animIndex = DMCHAR00_ANIM_39;
break;
case 0x1A:
this->unk_261 = 41;
this->animIndex = DMCHAR00_ANIM_41;
break;
case 0x1B:
this->unk_261 = 45;
this->animIndex = DMCHAR00_ANIM_45;
break;
case 0x1C:
this->unk_261 = 46;
this->animIndex = DMCHAR00_ANIM_46;
break;
case 0x1E:
this->unk_261 = 48;
this->animIndex = DMCHAR00_ANIM_48;
break;
case 0x1F:
this->unk_261 = 50;
this->animIndex = DMCHAR00_ANIM_50;
break;
case 0x20:
this->unk_261 = 52;
this->animIndex = DMCHAR00_ANIM_52;
break;
case 0x21:
this->unk_261 = 53;
this->animIndex = DMCHAR00_ANIM_53;
break;
case 0x23:
this->unk_261 = 55;
this->animIndex = DMCHAR00_ANIM_55;
break;
case 0x24:
this->unk_261 = 57;
this->animIndex = DMCHAR00_ANIM_57;
break;
case 0x25:
this->unk_261 = 58;
this->animIndex = DMCHAR00_ANIM_58;
break;
case 0x26:
this->unk_261 = 59;
this->animIndex = DMCHAR00_ANIM_59;
break;
case 0x27:
this->unk_261 = 61;
this->animIndex = DMCHAR00_ANIM_61;
break;
case 0x28:
this->unk_261 = 62;
this->animIndex = DMCHAR00_ANIM_62;
break;
case 0x29:
this->unk_261 = 64;
this->animIndex = DMCHAR00_ANIM_64;
break;
case 0x2A:
this->unk_261 = 66;
this->animIndex = DMCHAR00_ANIM_66;
break;
case 0x2B:
this->unk_261 = 68;
this->animIndex = DMCHAR00_ANIM_68;
break;
case 0x2C:
this->unk_261 = 69;
this->animIndex = DMCHAR00_ANIM_69;
break;
case 0x2D:
this->unk_261 = 70;
this->animIndex = DMCHAR00_ANIM_70;
break;
case 0x2E:
this->unk_261 = 67;
this->animIndex = DMCHAR00_ANIM_67;
break;
case 0x2F:
this->unk_261 = 71;
this->animIndex = DMCHAR00_ANIM_71;
break;
case 0x30:
this->unk_261 = 73;
this->animIndex = DMCHAR00_ANIM_73;
break;
case 0x31:
this->unk_261 = 74;
this->animIndex = DMCHAR00_ANIM_74;
break;
case 0x32:
this->unk_261 = 75;
this->animIndex = DMCHAR00_ANIM_75;
break;
case 0x33:
this->unk_261 = 77;
this->animIndex = DMCHAR00_ANIM_77;
break;
case 0x34:
this->unk_261 = 78;
this->animIndex = DMCHAR00_ANIM_78;
break;
case 0x35:
this->unk_261 = 79;
this->animIndex = DMCHAR00_ANIM_79;
break;
case 0x36:
this->unk_261 = 80;
this->animIndex = DMCHAR00_ANIM_80;
break;
case 0x37:
this->unk_261 = 82;
this->animIndex = DMCHAR00_ANIM_82;
break;
case 0x38:
this->unk_261 = 83;
this->animIndex = DMCHAR00_ANIM_83;
break;
default:
this->unk_261 = 0;
this->animIndex = DMCHAR00_ANIM_0;
break;
}
func_80AA5580(&this->skelAnime, &sAnimationInfo[this->unk_261], 0);
DmChar00_ChangeAnim(&this->skelAnime, &sAnimationInfo[this->animIndex], 0);
}
}
Cutscene_ActorTranslateAndYaw(&this->actor, play, cueChannel);
@ -792,59 +931,62 @@ void func_80AA62FC(DmChar00* this, PlayState* play) {
}
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
switch (this->unk_261) {
case 0x4:
case 0x5:
this->unk_261 += 4;
func_80AA5580(&this->skelAnime, &sAnimationInfo[this->unk_261], 0);
switch (this->animIndex) {
case DMCHAR00_ANIM_4:
case DMCHAR00_ANIM_5:
this->animIndex += 4;
DmChar00_ChangeAnim(&this->skelAnime, &sAnimationInfo[this->animIndex], 0);
this->skelAnime.curFrame = 37.0f;
break;
case 0xE:
case 0xF:
case 0x14:
case 0x15:
this->unk_261 += 2;
func_80AA5580(&this->skelAnime, &sAnimationInfo[this->unk_261], 0);
case DMCHAR00_ANIM_14:
case DMCHAR00_ANIM_15:
case DMCHAR00_ANIM_20:
case DMCHAR00_ANIM_21:
this->animIndex += 2;
DmChar00_ChangeAnim(&this->skelAnime, &sAnimationInfo[this->animIndex], 0);
break;
case 0xA:
case 0x12:
case 0x19:
case 0x1B:
case 0x1D:
case 0x1F:
case 0x21:
case 0x23:
case 0x25:
case 0x27:
case 0x2B:
case 0x2E:
case 0x30:
case 0x32:
case 0x35:
case 0x37:
case 0x3B:
case 0x3E:
case 0x40:
case 0x42:
case 0x47:
case 0x4B:
case 0x50:
case 0x53:
this->unk_261 += 1;
func_80AA5580(&this->skelAnime, &sAnimationInfo[this->unk_261], 0);
case DMCHAR00_ANIM_10:
case DMCHAR00_ANIM_18:
case DMCHAR00_ANIM_25:
case DMCHAR00_ANIM_27:
case DMCHAR00_ANIM_29:
case DMCHAR00_ANIM_31:
case DMCHAR00_ANIM_33:
case DMCHAR00_ANIM_35:
case DMCHAR00_ANIM_37:
case DMCHAR00_ANIM_39:
case DMCHAR00_ANIM_43:
case DMCHAR00_ANIM_46:
case DMCHAR00_ANIM_48:
case DMCHAR00_ANIM_50:
case DMCHAR00_ANIM_53:
case DMCHAR00_ANIM_55:
case DMCHAR00_ANIM_59:
case DMCHAR00_ANIM_62:
case DMCHAR00_ANIM_64:
case DMCHAR00_ANIM_66:
case DMCHAR00_ANIM_71:
case DMCHAR00_ANIM_75:
case DMCHAR00_ANIM_80:
case DMCHAR00_ANIM_83:
this->animIndex += 1;
DmChar00_ChangeAnim(&this->skelAnime, &sAnimationInfo[this->animIndex], 0);
break;
case 0x2D:
this->unk_261 = 19;
func_80AA5580(&this->skelAnime, &sAnimationInfo[this->unk_261], 0);
case DMCHAR00_ANIM_45:
this->animIndex = DMCHAR00_ANIM_19;
DmChar00_ChangeAnim(&this->skelAnime, &sAnimationInfo[this->animIndex], 0);
break;
case 0x46:
case 0x4D:
this->unk_261 = 0;
func_80AA5580(&this->skelAnime, &sAnimationInfo[this->unk_261], 0);
case DMCHAR00_ANIM_70:
case DMCHAR00_ANIM_77:
this->animIndex = DMCHAR00_ANIM_0;
DmChar00_ChangeAnim(&this->skelAnime, &sAnimationInfo[this->animIndex], 0);
break;
default:
break;
}
}
@ -854,9 +996,9 @@ void func_80AA67F8(DmChar00* this, PlayState* play) {
Player* player = GET_PLAYER(play);
if ((play->csCtx.state == CS_STATE_IDLE) && (gSaveContext.sceneLayer == 0) && (play->csCtx.scriptIndex == 1)) {
if (this->unk_261 != 42) {
this->unk_261 = 42;
func_80AA5580(&this->skelAnime, &sAnimationInfo[this->unk_261], 0);
if (this->animIndex != DMCHAR00_ANIM_42) {
this->animIndex = DMCHAR00_ANIM_42;
DmChar00_ChangeAnim(&this->skelAnime, &sAnimationInfo[this->animIndex], 0);
}
Math_SmoothStepToF(&this->actor.world.pos.x, 0.0f, 0.5f, 0.5f, 0.001f);
@ -864,8 +1006,8 @@ void func_80AA67F8(DmChar00* this, PlayState* play) {
Math_SmoothStepToF(&this->actor.world.pos.z, -560.0f, 0.5f, 20.0f, 0.001f);
if (player->actor.world.pos.z < -625.0f) {
this->unk_261 = 43;
func_80AA5580(&this->skelAnime, &sAnimationInfo[this->unk_261], 0);
this->animIndex = DMCHAR00_ANIM_43;
DmChar00_ChangeAnim(&this->skelAnime, &sAnimationInfo[this->animIndex], 0);
this->actionFunc = func_80AA695C;
this->skelAnime.playSpeed = 1.5f;
}
@ -873,7 +1015,7 @@ void func_80AA67F8(DmChar00* this, PlayState* play) {
}
void func_80AA695C(DmChar00* this, PlayState* play) {
if (this->unk_261 == 44) {
if (this->animIndex == DMCHAR00_ANIM_44) {
Math_SmoothStepToF(&this->actor.world.pos.x, 0.0f, 0.5f, 0.5f, 0.001f);
Math_SmoothStepToF(&this->actor.world.pos.y, 30.0f, 0.5f, 0.5f, 0.001f);
Math_SmoothStepToF(&this->actor.world.pos.z, -680.0f, 0.5f, 10.0f, 0.001f);
@ -889,7 +1031,7 @@ void DmChar00_Update(Actor* thisx, PlayState* play) {
this->unk_262++;
func_80AA5EBC(this, play);
func_80AA62FC(this, play);
DmChar00_HandleCutscene(this, play);
}
s32 DmChar00_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx,
@ -898,7 +1040,7 @@ s32 DmChar00_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f
f32 sp28;
Vec3f sp1C;
if (limbIndex == 6) {
if (limbIndex == FAIRY_LIMB_6) {
sp28 = ((Math_SinS(this->unk_262 * 0x1000) * 0.1f) + 1.0f) * 0.012f * (this->actor.scale.x * (1.0f / 0.008f));
Matrix_MultVec3f(&D_80AA7808, &sp1C);
Matrix_Translate(sp1C.x, sp1C.y, sp1C.z, MTXMODE_NEW);

View File

@ -2,6 +2,7 @@
#define Z_DM_CHAR00_H
#include "global.h"
#include "objects/gameplay_keep/gameplay_keep.h"
struct DmChar00;
@ -16,15 +17,15 @@ typedef void (*DmChar00ActionFunc)(struct DmChar00*, PlayState*);
typedef struct DmChar00 {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
/* 0x188 */ Vec3s jointTable[7];
/* 0x188 */ Vec3s jointTable[FAIRY_LIMB_MAX];
/* 0x1B2 */ UNK_TYPE1 unk_1B2[0x30];
/* 0x1E2 */ Vec3s morphTable[7];
/* 0x1E2 */ Vec3s morphTable[FAIRY_LIMB_MAX];
/* 0x20C */ UNK_TYPE1 unk_20C[0x30];
/* 0x23C */ DmChar00ActionFunc actionFunc;
/* 0x240 */ Color_RGBAf unk_240;
/* 0x250 */ Color_RGBAf unk_250;
/* 0x260 */ u8 cueId;
/* 0x261 */ u8 unk_261;
/* 0x261 */ u8 animIndex;
/* 0x262 */ u16 unk_262;
} DmChar00; // size = 0x264

View File

@ -16,7 +16,7 @@ void DmChar02_Destroy(Actor* thisx, PlayState* play);
void DmChar02_Update(Actor* thisx, PlayState* play);
void DmChar02_Draw(Actor* thisx, PlayState* play);
void DmChar02_PerformCutsceneActions(DmChar02* this, PlayState* play);
void DmChar02_HandleCutscene(DmChar02* this, PlayState* play);
ActorInit Dm_Char02_InitVars = {
ACTOR_DM_CHAR02,
@ -35,29 +35,30 @@ typedef enum {
/* 0 */ DMCHAR02_ANIM_HIT_GROUND,
/* 1 */ DMCHAR02_ANIM_TURN_AROUND,
/* 2 */ DMCHAR02_ANIM_JUGGLE,
/* 3 */ DMCHAR02_ANIM_FALL
/* 3 */ DMCHAR02_ANIM_FALL,
/* 4 */ DMCHAR02_ANIM_MAX
} DmChar02Animation;
static AnimationInfo sAnimationInfo[] = {
{ &gClockTowerOcarinaOfTimeHitGroundAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
{ &gClockTowerOcarinaOfTimeTurnAroundAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
{ &gClockTowerOcarinaOfTimeJuggleAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
{ &gClockTowerOcarinaOfTimeFallAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
static AnimationInfo sAnimationInfo[DMCHAR02_ANIM_MAX] = {
{ &gClockTowerOcarinaOfTimeHitGroundAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR02_ANIM_HIT_GROUND
{ &gClockTowerOcarinaOfTimeTurnAroundAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR02_ANIM_TURN_AROUND
{ &gClockTowerOcarinaOfTimeJuggleAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR02_ANIM_JUGGLE
{ &gClockTowerOcarinaOfTimeFallAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR02_ANIM_FALL
};
void DmChar02_ChangeAnim(SkelAnime* skelAnime, AnimationInfo* animationInfo, u16 animIndex) {
f32 frameCount;
void DmChar02_ChangeAnim(SkelAnime* skelAnime, AnimationInfo* animInfo, u16 animIndex) {
f32 endFrame;
animationInfo += animIndex;
animInfo += animIndex;
if (animationInfo->frameCount < 0.0f) {
frameCount = Animation_GetLastFrame(animationInfo->animation);
if (animInfo->frameCount < 0.0f) {
endFrame = Animation_GetLastFrame(animInfo->animation);
} else {
frameCount = animationInfo->frameCount;
endFrame = animInfo->frameCount;
}
Animation_Change(skelAnime, animationInfo->animation, animationInfo->playSpeed, animationInfo->startFrame,
frameCount, animationInfo->mode, animationInfo->morphFrames);
Animation_Change(skelAnime, animInfo->animation, animInfo->playSpeed, animInfo->startFrame, endFrame,
animInfo->mode, animInfo->morphFrames);
}
void DmChar02_PlaySfxForDroppingOcarinaCutscene(DmChar02* this, PlayState* play) {
@ -88,9 +89,9 @@ void DmChar02_Init(Actor* thisx, PlayState* play) {
this->actor.targetArrowOffset = 3000.0f;
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 24.0f);
SkelAnime_InitFlex(play, &this->skelAnime, &gClockTowerOcarinaOfTimeSkel, NULL, NULL, NULL, 0);
DmChar02_ChangeAnim(&this->skelAnime, sAnimationInfo, 0);
DmChar02_ChangeAnim(&this->skelAnime, &sAnimationInfo[DMCHAR02_ANIM_HIT_GROUND], 0);
Actor_SetScale(&this->actor, 0.01f);
this->actionFunc = DmChar02_PerformCutsceneActions;
this->actionFunc = DmChar02_HandleCutscene;
} else {
Actor_Kill(&this->actor);
}
@ -99,7 +100,7 @@ void DmChar02_Init(Actor* thisx, PlayState* play) {
void DmChar02_Destroy(Actor* thisx, PlayState* play) {
}
void DmChar02_PerformCutsceneActions(DmChar02* this, PlayState* play) {
void DmChar02_HandleCutscene(DmChar02* this, PlayState* play) {
u8 shouldChangeAnimation = true;
s32 cueChannel;

View File

@ -32,33 +32,38 @@ ActorInit Dm_Char03_InitVars = {
(ActorFunc)DmChar03_Draw,
};
AnimationInfo sAnimationInfo[] = {
{ &gDekuMaskFallOverAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
typedef enum {
/* 0 */ DMCHAR03_ANIM_FALL_OVER,
/* 1 */ DMCHAR03_ANIM_MAX
} DmChar03Animation;
AnimationInfo sAnimationInfo[DMCHAR03_ANIM_MAX] = {
{ &gDekuMaskFallOverAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR03_ANIM_FALL_OVER
};
void DmChar03_ChangeAnim(SkelAnime* skelAnime, AnimationInfo* animationInfo, u16 animIndex) {
f32 frame;
void DmChar03_ChangeAnim(SkelAnime* skelAnime, AnimationInfo* animInfo, u16 animIndex) {
f32 endFrame;
animationInfo += animIndex;
animInfo += animIndex;
if (animationInfo->frameCount < 0.0f) {
frame = Animation_GetLastFrame(animationInfo->animation);
if (animInfo->frameCount < 0.0f) {
endFrame = Animation_GetLastFrame(animInfo->animation);
} else {
frame = animationInfo->frameCount;
endFrame = animInfo->frameCount;
}
Animation_Change(skelAnime, animationInfo->animation, animationInfo->playSpeed, animationInfo->startFrame, frame,
animationInfo->mode, animationInfo->morphFrames);
Animation_Change(skelAnime, animInfo->animation, animInfo->playSpeed, animInfo->startFrame, endFrame,
animInfo->mode, animInfo->morphFrames);
}
void DmChar03_Init(Actor* thisx, PlayState* play) {
DmChar03* this = THIS;
this->animIndex = 0;
this->animIndex = DMCHAR03_ANIM_FALL_OVER;
this->actor.targetArrowOffset = 3000.0f;
this->unk_18E = false;
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 24.0f);
SkelAnime_InitFlex(play, &this->skelAnime, &gDekuMaskSkel, NULL, NULL, NULL, 0);
DmChar03_ChangeAnim(&this->skelAnime, sAnimationInfo, 0);
DmChar03_ChangeAnim(&this->skelAnime, &sAnimationInfo[DMCHAR03_ANIM_FALL_OVER], 0);
Actor_SetScale(&this->actor, 0.01f);
this->actionFunc = DmChar03_DoNothing;
}
@ -92,7 +97,7 @@ void DmChar03_DoNothing(DmChar03* this, PlayState* play) {
}
void func_80AAB710(DmChar03* this, PlayState* play) {
u8 shouldChangeAnim = true;
u8 changeAnim = true;
if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_136)) {
s32 cueChannel = Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_136);
@ -100,27 +105,31 @@ void func_80AAB710(DmChar03* this, PlayState* play) {
if (play->csCtx.curFrame == play->csCtx.actorCues[cueChannel]->startFrame) {
switch (play->csCtx.actorCues[cueChannel]->id) {
case 1:
shouldChangeAnim = false;
changeAnim = false;
break;
case 2:
this->animIndex = 0;
this->animIndex = DMCHAR03_ANIM_FALL_OVER;
break;
case 3:
this->unk_18E = false;
shouldChangeAnim = false;
changeAnim = false;
Actor_Kill(&this->actor);
break;
case 4:
Item_Give(play, ITEM_MASK_DEKU);
shouldChangeAnim = false;
changeAnim = false;
this->actionFunc = func_80AAB5F8;
break;
default:
shouldChangeAnim = false;
changeAnim = false;
break;
}
if (shouldChangeAnim) {
if (changeAnim) {
DmChar03_ChangeAnim(&this->skelAnime, &sAnimationInfo[this->animIndex], 0);
}
}

View File

@ -16,7 +16,7 @@ void DmChar04_Destroy(Actor* thisx, PlayState* play);
void DmChar04_Update(Actor* thisx, PlayState* play);
void DmChar04_Draw(Actor* thisx, PlayState* play);
void func_80AABE34(DmChar04* this, PlayState* play);
void DmChar04_HandleCutscene(DmChar04* this, PlayState* play);
ActorInit Dm_Char04_InitVars = {
ACTOR_DM_CHAR04,
@ -30,31 +30,38 @@ ActorInit Dm_Char04_InitVars = {
(ActorFunc)DmChar04_Draw,
};
void DmChar04_ChangeAnim(SkelAnime* skelAnime, AnimationInfo* animation, u16 animIndex) {
f32 endFrame;
typedef enum {
/* 0 */ DMCHAR04_ANIM_0,
/* 1 */ DMCHAR04_ANIM_1,
/* 2 */ DMCHAR04_ANIM_MAX
} DmChar04Animation;
animation += animIndex;
if (animation->frameCount < 0.0f) {
endFrame = Animation_GetLastFrame(animation->animation);
} else {
endFrame = animation->frameCount;
}
Animation_Change(skelAnime, animation->animation, animation->playSpeed, animation->startFrame, endFrame,
animation->mode, animation->morphFrames);
}
static AnimationInfo sAnimationInfo[] = {
{ &gameplay_keep_Anim_02B2E8, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
{ &gameplay_keep_Anim_029140, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
static AnimationInfo sAnimationInfo[DMCHAR04_ANIM_MAX] = {
{ &gameplay_keep_Anim_02B2E8, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR04_ANIM_0
{ &gameplay_keep_Anim_029140, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR04_ANIM_1
};
Color_RGBAf sPrimColors[] = {
void DmChar04_ChangeAnim(SkelAnime* skelAnime, AnimationInfo* animInfo, u16 animIndex) {
f32 endFrame;
animInfo += animIndex;
if (animInfo->frameCount < 0.0f) {
endFrame = Animation_GetLastFrame(animInfo->animation);
} else {
endFrame = animInfo->frameCount;
}
Animation_Change(skelAnime, animInfo->animation, animInfo->playSpeed, animInfo->startFrame, endFrame,
animInfo->mode, animInfo->morphFrames);
}
static Color_RGBAf sPrimColors[] = {
{ 250.0f, 255.0f, 230.0f, 255.0f },
{ 10.0f, 10.0f, 40.0f, 255.0f },
{ 255.0f, 235.0f, 220.0f, 255.0f },
};
Color_RGBAf sEnvColors[] = {
static Color_RGBAf sEnvColors[] = {
{ 220.0f, 160.0f, 80.0f, 255.0f },
{ 120.0f, 255.0f, 255.0f, 255.0f },
{ 255.0f, 235.0f, 220.0f, 255.0f },
@ -70,17 +77,17 @@ void DmChar04_Init(Actor* thisx, PlayState* play) {
this->timer = this->actor.params << 0xB;
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 24.0f);
SkelAnime_Init(play, &this->skelAnime, &gameplay_keep_Skel_02AF58.sh, &gameplay_keep_Anim_029140, this->jointTable,
this->morphTable, 7);
this->morphTable, FAIRY_LIMB_MAX);
ActorShape_Init(&this->actor.shape, 0.0f, NULL, 15.0f);
DmChar04_ChangeAnim(&this->skelAnime, sAnimationInfo, 0);
DmChar04_ChangeAnim(&this->skelAnime, &sAnimationInfo[DMCHAR04_ANIM_0], 0);
Actor_SetScale(&this->actor, 0.01f);
this->actionFunc = func_80AABE34;
this->actionFunc = DmChar04_HandleCutscene;
}
void DmChar04_Destroy(Actor* thisx, PlayState* play) {
}
void func_80AABE34(DmChar04* this, PlayState* play) {
void DmChar04_HandleCutscene(DmChar04* this, PlayState* play) {
u16 cueType = CS_CMD_ACTOR_CUE_113 + this->actor.params;
if (Cutscene_IsCueInChannel(play, cueType)) {
@ -90,9 +97,9 @@ void func_80AABE34(DmChar04* this, PlayState* play) {
if (this->cueId != play->csCtx.actorCues[cueChannel]->id) {
this->cueId = play->csCtx.actorCues[cueChannel]->id;
if (play->csCtx.actorCues[cueChannel]->id == 1) {
this->animIndex = 0;
this->animIndex = DMCHAR04_ANIM_0;
} else {
this->animIndex = 0;
this->animIndex = DMCHAR04_ANIM_0;
}
DmChar04_ChangeAnim(&this->skelAnime, &sAnimationInfo[this->animIndex], 0);
}
@ -119,8 +126,8 @@ s32 DmChar04_OverrideLimbDraw(PlayState* play2, s32 limbIndex, Gfx** dList, Vec3
Vec3f sp1C;
DmChar04* this = THIS;
if (limbIndex == 6) {
sp28 = ((Math_SinS(this->timer << 0xC) * 0.1f) + 1.0f) * 0.012f * (this->actor.scale.x * (1.0f / 0.008f));
if (limbIndex == FAIRY_LIMB_6) {
sp28 = ((Math_SinS(this->timer * 0x1000) * 0.1f) + 1.0f) * 0.012f * (this->actor.scale.x * (1.0f / 0.008f));
Matrix_MultVec3f(&D_80AAC4F0, &sp1C);
Matrix_Translate(sp1C.x, sp1C.y, sp1C.z, MTXMODE_NEW);
Matrix_Scale(sp28, sp28, sp28, MTXMODE_APPLY);
@ -152,5 +159,6 @@ void DmChar04_Draw(Actor* thisx, PlayState* play) {
gDPSetDither(POLY_XLU_DISP++, G_CD_BAYER);
POLY_XLU_DISP = SkelAnime_Draw(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
DmChar04_OverrideLimbDraw, NULL, &this->actor, POLY_XLU_DISP);
CLOSE_DISPS(play->state.gfxCtx);
}

View File

@ -2,6 +2,7 @@
#define Z_DM_CHAR04_H
#include "global.h"
#include "objects/gameplay_keep/gameplay_keep.h"
struct DmChar04;
@ -10,9 +11,11 @@ typedef void (*DmChar04ActionFunc)(struct DmChar04*, PlayState*);
typedef struct DmChar04 {
/* 0x0000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
/* 0x188 */ Vec3s jointTable[15];
/* 0x1E2 */ Vec3s morphTable[15];
/* 0x023C */ DmChar04ActionFunc actionFunc;
/* 0x188 */ Vec3s jointTable[FAIRY_LIMB_MAX];
/* 0x1B2 */ UNK_TYPE1 unk_1B2[0x30];
/* 0x1E2 */ Vec3s morphTable[FAIRY_LIMB_MAX];
/* 0x20C */ UNK_TYPE1 unk_20C[0x30];
/* 0x23C */ DmChar04ActionFunc actionFunc;
/* 0x240 */ Color_RGBAf primColors;
/* 0x250 */ Color_RGBAf envColors;
/* 0x260 */ u8 cueId;

View File

@ -47,27 +47,37 @@ ActorInit Dm_Char05_InitVars = {
(ActorFunc)DmChar05_Draw,
};
static AnimationInfo sAnimationInfo[] = {
{ &object_dmask_Anim_001090, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
{ &object_dmask_Anim_004288, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
{ &object_dmask_Anim_0001A8, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
{ &object_dmask_Anim_00017C, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
{ &object_dmask_Anim_0011A0, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
{ &object_dmask_Anim_0013A4, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
typedef enum {
/* 0 */ DMCHAR05_ANIM_0,
/* 1 */ DMCHAR05_ANIM_1,
/* 2 */ DMCHAR05_ANIM_2,
/* 3 */ DMCHAR05_ANIM_3,
/* 4 */ DMCHAR05_ANIM_4,
/* 5 */ DMCHAR05_ANIM_5,
/* 6 */ DMCHAR05_ANIM_MAX
} DmChar05Animation;
static AnimationInfo sAnimationInfo[DMCHAR05_ANIM_MAX] = {
{ &object_dmask_Anim_001090, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR05_ANIM_0
{ &object_dmask_Anim_004288, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR05_ANIM_1
{ &object_dmask_Anim_0001A8, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR05_ANIM_2
{ &object_dmask_Anim_00017C, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR05_ANIM_3
{ &object_dmask_Anim_0011A0, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // DMCHAR05_ANIM_4
{ &object_dmask_Anim_0013A4, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR05_ANIM_5
};
void func_80AAC5A0(SkelAnime* skelAnime, AnimationInfo* animation, u16 arg2) {
f32 phi_f2;
void DmChar05_ChangeAnim(SkelAnime* skelAnime, AnimationInfo* animInfo, u16 animIndex) {
f32 endFrame;
animation += arg2;
animInfo += animIndex;
if (animation->frameCount < 0.0f) {
phi_f2 = Animation_GetLastFrame(animation->animation);
if (animInfo->frameCount < 0.0f) {
endFrame = Animation_GetLastFrame(animInfo->animation);
} else {
phi_f2 = animation->frameCount;
endFrame = animInfo->frameCount;
}
Animation_Change(skelAnime, animation->animation, animation->playSpeed, animation->startFrame, phi_f2,
animation->mode, animation->morphFrames);
Animation_Change(skelAnime, animInfo->animation, animInfo->playSpeed, animInfo->startFrame, endFrame,
animInfo->mode, animInfo->morphFrames);
}
void func_80AAC63C(Actor* thisx, PlayState* play) {
@ -76,9 +86,9 @@ void func_80AAC63C(Actor* thisx, PlayState* play) {
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 24.0f);
SkelAnime_Init(play, &this->skelAnime, &object_dmask_Skel_010B0, NULL, NULL, NULL, 0);
if (DMCHAR05_GET(&this->actor) == DMCHAR05_0) {
func_80AAC5A0(&this->skelAnime, &sAnimationInfo[0], 0);
DmChar05_ChangeAnim(&this->skelAnime, &sAnimationInfo[DMCHAR05_ANIM_0], 0);
} else {
func_80AAC5A0(&this->skelAnime, &sAnimationInfo[1], 0);
DmChar05_ChangeAnim(&this->skelAnime, &sAnimationInfo[DMCHAR05_ANIM_1], 0);
}
this->actionFunc = func_80AACC48;
}
@ -88,7 +98,7 @@ void func_80AAC6E4(Actor* thisx, PlayState* play) {
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 24.0f);
SkelAnime_Init(play, &this->skelAnime, &object_dmask_Skel_042B0, NULL, NULL, NULL, 0);
func_80AAC5A0(&this->skelAnime, &sAnimationInfo[1], 0);
DmChar05_ChangeAnim(&this->skelAnime, &sAnimationInfo[DMCHAR05_ANIM_1], 0);
this->actionFunc = func_80AACC48;
}
@ -97,7 +107,7 @@ void func_80AAC770(Actor* thisx, PlayState* play) {
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 24.0f);
SkelAnime_InitFlex(play, &this->skelAnime, &object_dmask_Skel_001D0, NULL, NULL, NULL, 0);
func_80AAC5A0(&this->skelAnime, &sAnimationInfo[3], 0);
DmChar05_ChangeAnim(&this->skelAnime, &sAnimationInfo[DMCHAR05_ANIM_3], 0);
this->actionFunc = func_80AACC48;
}
@ -106,7 +116,7 @@ void func_80AAC7FC(Actor* thisx, PlayState* play) {
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 24.0f);
SkelAnime_Init(play, &this->skelAnime, &object_dmask_Skel_013D0, NULL, NULL, NULL, 0);
func_80AAC5A0(&this->skelAnime, &sAnimationInfo[4], 0);
DmChar05_ChangeAnim(&this->skelAnime, &sAnimationInfo[DMCHAR05_ANIM_4], 0);
this->actionFunc = func_80AACC48;
}
@ -119,7 +129,7 @@ void func_80AAC888(Actor* thisx, PlayState* play) {
void DmChar05_Init(Actor* thisx, PlayState* play) {
DmChar05* this = THIS;
this->unk_18C = 0;
this->animIndex = DMCHAR05_ANIM_0;
this->unk_18E = 0;
this->unk_19C = 0;
this->unk_1A0 = 0;
@ -308,7 +318,7 @@ void func_80AACE5C(DmChar05* this, PlayState* play) {
}
void func_80AACF04(DmChar05* this, PlayState* play) {
u8 sp2F = true;
u8 changeAnim = true;
s32 cueChannel;
switch (DMCHAR05_GET(&this->actor)) {
@ -319,7 +329,7 @@ void func_80AACF04(DmChar05* this, PlayState* play) {
if (play->csCtx.curFrame == play->csCtx.actorCues[cueChannel]->startFrame) {
switch (play->csCtx.actorCues[cueChannel]->id) {
case 1:
sp2F = false;
changeAnim = false;
break;
case 2:
@ -327,27 +337,27 @@ void func_80AACF04(DmChar05* this, PlayState* play) {
break;
case 3:
this->unk_18C = 0;
this->animIndex = DMCHAR05_ANIM_0;
break;
case 4:
Item_Give(play, ITEM_MASK_GORON);
sp2F = false;
changeAnim = false;
this->actionFunc = func_80AAC990;
break;
case 5:
sp2F = false;
changeAnim = false;
Actor_Kill(&this->actor);
break;
default:
sp2F = false;
changeAnim = false;
break;
}
if (sp2F) {
func_80AAC5A0(&this->skelAnime, &sAnimationInfo[this->unk_18C], 0);
if (changeAnim) {
DmChar05_ChangeAnim(&this->skelAnime, &sAnimationInfo[this->animIndex], 0);
}
}
@ -362,36 +372,36 @@ void func_80AACF04(DmChar05* this, PlayState* play) {
if (play->csCtx.curFrame == play->csCtx.actorCues[cueChannel]->startFrame) {
switch (play->csCtx.actorCues[cueChannel]->id) {
case 1:
sp2F = false;
changeAnim = false;
break;
case 2:
this->unk_18C = 1;
this->animIndex = DMCHAR05_ANIM_1;
this->unk_1B4 = 1;
break;
case 3:
this->unk_18C = 1;
this->animIndex = DMCHAR05_ANIM_1;
break;
case 4:
Item_Give(play, ITEM_MASK_ZORA);
sp2F = false;
changeAnim = false;
this->actionFunc = func_80AACD1C;
break;
case 5:
sp2F = false;
changeAnim = false;
Actor_Kill(&this->actor);
break;
default:
sp2F = false;
changeAnim = false;
break;
}
if (sp2F) {
func_80AAC5A0(&this->skelAnime, &sAnimationInfo[this->unk_18C], 0);
if (changeAnim) {
DmChar05_ChangeAnim(&this->skelAnime, &sAnimationInfo[this->animIndex], 0);
}
}
@ -406,35 +416,35 @@ void func_80AACF04(DmChar05* this, PlayState* play) {
if (play->csCtx.curFrame == play->csCtx.actorCues[cueChannel]->startFrame) {
switch (play->csCtx.actorCues[cueChannel]->id) {
case 1:
sp2F = false;
changeAnim = false;
break;
case 2:
this->unk_18C = 3;
this->animIndex = DMCHAR05_ANIM_3;
break;
case 3:
this->unk_18C = 2;
this->animIndex = DMCHAR05_ANIM_2;
break;
case 4:
Item_Give(play, ITEM_MASK_GIBDO);
sp2F = false;
changeAnim = false;
this->actionFunc = func_80AACE10;
break;
case 5:
sp2F = false;
changeAnim = false;
Actor_Kill(&this->actor);
break;
default:
sp2F = false;
changeAnim = false;
break;
}
if (sp2F) {
func_80AAC5A0(&this->skelAnime, &sAnimationInfo[this->unk_18C], 0);
if (changeAnim) {
DmChar05_ChangeAnim(&this->skelAnime, &sAnimationInfo[this->animIndex], 0);
}
}
@ -449,28 +459,28 @@ void func_80AACF04(DmChar05* this, PlayState* play) {
if (play->csCtx.curFrame == play->csCtx.actorCues[cueChannel]->startFrame) {
switch (play->csCtx.actorCues[cueChannel]->id) {
default:
sp2F = false;
changeAnim = false;
break;
case 1:
sp2F = false;
changeAnim = false;
break;
case 2:
this->unk_18C = 4;
this->animIndex = DMCHAR05_ANIM_4;
break;
case 3:
this->unk_18C = 5;
this->animIndex = DMCHAR05_ANIM_5;
break;
case 4:
this->unk_18C = 5;
this->animIndex = DMCHAR05_ANIM_5;
break;
}
if (sp2F) {
func_80AAC5A0(&this->skelAnime, &sAnimationInfo[this->unk_18C], 0);
if (changeAnim) {
DmChar05_ChangeAnim(&this->skelAnime, &sAnimationInfo[this->animIndex], 0);
}
}
@ -482,9 +492,9 @@ void func_80AACF04(DmChar05* this, PlayState* play) {
}
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
if (this->unk_18C == 4) {
this->unk_18C++;
func_80AAC5A0(&this->skelAnime, &sAnimationInfo[this->unk_18C], 0);
if (this->animIndex == DMCHAR05_ANIM_4) {
this->animIndex++;
DmChar05_ChangeAnim(&this->skelAnime, &sAnimationInfo[this->animIndex], 0);
}
}
break;

View File

@ -29,7 +29,7 @@ typedef struct DmChar05 {
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
/* 0x188 */ DmChar05ActionFunc actionFunc;
/* 0x18C */ s16 unk_18C;
/* 0x18C */ s16 animIndex;
/* 0x18E */ u8 unk_18E;
/* 0x18F */ u8 unk_18F;
/* 0x190 */ Vec3f unk_190;

View File

@ -16,7 +16,7 @@ void DmChar06_Update(Actor* thisx, PlayState* play);
void DmChar06_Draw(Actor* thisx, PlayState* play);
void DmChar06_SetupAction(DmChar06* this, DmChar06ActionFunc actionFunc);
void func_80AAE6F0(DmChar06* this, PlayState* play);
void DmChar06_HandleCutscene(DmChar06* this, PlayState* play);
ActorInit Dm_Char06_InitVars = {
ACTOR_DM_CHAR06,
@ -40,13 +40,13 @@ void DmChar06_Init(Actor* thisx, PlayState* play) {
SET_WEEKEVENTREG(WEEKEVENTREG_CLEARED_SNOWHEAD_TEMPLE);
Actor_SetScale(&this->actor, 1.0f);
this->alpha = 255;
DmChar06_SetupAction(this, func_80AAE6F0);
DmChar06_SetupAction(this, DmChar06_HandleCutscene);
}
void DmChar06_Destroy(Actor* thisx, PlayState* play) {
}
void func_80AAE6F0(DmChar06* this, PlayState* play) {
void DmChar06_HandleCutscene(DmChar06* this, PlayState* play) {
if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_463)) {
s32 cueChannel = Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_463);

View File

@ -81,6 +81,7 @@ void DmChar07_Draw(Actor* thisx, PlayState* play) {
case DMCHAR07_STAGE:
gSPDisplayList(POLY_OPA_DISP++, object_milkbar_DL_002CD0);
break;
case DMCHAR07_CREDITS_STAGE:
AnimatedMat_Draw(play, Lib_SegmentedToVirtual(object_milkbar_Matanimheader_0105F8));
gSPDisplayList(POLY_OPA_DISP++, object_milkbar_DL_007918);
@ -90,6 +91,7 @@ void DmChar07_Draw(Actor* thisx, PlayState* play) {
gSPDisplayList(POLY_OPA_DISP++, object_milkbar_DL_001210);
gSPDisplayList(POLY_OPA_DISP++, object_milkbar_DL_0016B8);
break;
case DMCHAR07_SPOTLIGHTS:
if (this->spotlightFlags & DMCHAR07_STAGE_RIGHT_SPOTLIGHT) {
gSPDisplayList(POLY_OPA_DISP++, object_milkbar_DL_000240);
@ -107,17 +109,23 @@ void DmChar07_Draw(Actor* thisx, PlayState* play) {
gSPDisplayList(POLY_OPA_DISP++, object_milkbar_DL_0016B8);
}
break;
case DMCHAR07_DISHES:
gSPDisplayList(POLY_OPA_DISP++, object_milkbar_DL_010D68);
break;
default:
break;
}
Gfx_SetupDL25_Xlu(play->state.gfxCtx);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
switch (this->dyna.actor.params) {
case DMCHAR07_STAGE:
gSPDisplayList(POLY_XLU_DISP++, object_milkbar_DL_002BA0);
break;
case DMCHAR07_CREDITS_STAGE:
gSPDisplayList(POLY_XLU_DISP++, object_milkbar_DL_0076A0);
gSPDisplayList(POLY_XLU_DISP++, object_milkbar_DL_000100);
@ -126,6 +134,7 @@ void DmChar07_Draw(Actor* thisx, PlayState* play) {
gSPDisplayList(POLY_XLU_DISP++, object_milkbar_DL_0010D0);
gSPDisplayList(POLY_XLU_DISP++, object_milkbar_DL_0015E0);
break;
case DMCHAR07_SPOTLIGHTS:
if (this->spotlightFlags & DMCHAR07_STAGE_RIGHT_SPOTLIGHT) {
gSPDisplayList(POLY_OPA_DISP++, object_milkbar_DL_000100);
@ -143,8 +152,12 @@ void DmChar07_Draw(Actor* thisx, PlayState* play) {
gSPDisplayList(POLY_OPA_DISP++, object_milkbar_DL_0015E0);
}
break;
case DMCHAR07_DISHES:
break;
default:
break;
}
CLOSE_DISPS(play->state.gfxCtx);

View File

@ -26,9 +26,9 @@ void DmChar08_SetupAppearCs(DmChar08* this, PlayState* play);
void func_80AAF884(DmChar08* this, PlayState* play);
void func_80AAFB04(DmChar08* this, PlayState* play);
void func_80AAFB94(DmChar08* this, PlayState* play);
void func_80AAFE88(DmChar08* this, PlayState* play);
void DmChar08_HandleCutscene(DmChar08* this, PlayState* play);
void func_80AB023C(DmChar08* this, PlayState* play);
void func_80AB01E8(DmChar08* this, PlayState* play);
void DmChar08_UpdateAnim(DmChar08* this, PlayState* play);
void DmChar08_SpawnBubbles(DmChar08* this, PlayState* play);
void func_80AAFCCC(DmChar08* this, PlayState* play);
@ -41,16 +41,6 @@ typedef enum {
/* 5 */ TURTLE_EYEMODE_LOOK_RIGHT
} TurtleEyeMode;
typedef enum {
/* 0 */ TURTLE_ANIM_IDLE,
/* 1 */ TURTLE_ANIM_SWIM,
/* 2 */ TURTLE_ANIM_FLOAT,
/* 3 */ TURTLE_ANIM_SPEAK1,
/* 4 */ TURTLE_ANIM_COUGH,
/* 5 */ TURTLE_ANIM_SPEAK2,
/* 6 */ TURTLE_ANIM_YAWN
} TurtleAnimation;
ActorInit Dm_Char08_InitVars = {
ACTOR_DM_CHAR08,
ACTORCAT_BG,
@ -65,14 +55,26 @@ ActorInit Dm_Char08_InitVars = {
#include "overlays/ovl_Dm_Char08/ovl_Dm_Char08.c"
static AnimationInfo sAnimationInfo[] = {
{ &gTurtleIdleAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, -24.0f },
{ &gTurtleSwimAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, -24.0f },
{ &gTurtleFloatAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, -24.0f },
{ &gTurtleSpeak1Anim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, -24.0f },
{ &gTurtleCoughAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, -24.0f },
{ &gTurtleSpeak2Anim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, -24.0f },
{ &gTurtleYawnAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, -24.0f },
typedef enum {
/* 0 */ TURTLE_ANIM_IDLE,
/* 1 */ TURTLE_ANIM_SWIM,
/* 2 */ TURTLE_ANIM_FLOAT,
/* 3 */ TURTLE_ANIM_SPEAK1,
/* 4 */ TURTLE_ANIM_COUGH,
/* 5 */ TURTLE_ANIM_SPEAK2,
/* 6 */ TURTLE_ANIM_YAWN,
/* 7 */ TURTLE_ANIM_MAX,
/* 99 */ TURTLE_ANIM_NONE = 99
} TurtleAnimation;
static AnimationInfo sAnimationInfo[TURTLE_ANIM_MAX] = {
{ &gTurtleIdleAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, -24.0f }, // TURTLE_ANIM_IDLE
{ &gTurtleSwimAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, -24.0f }, // TURTLE_ANIM_SWIM
{ &gTurtleFloatAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, -24.0f }, // TURTLE_ANIM_FLOAT
{ &gTurtleSpeak1Anim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, -24.0f }, // TURTLE_ANIM_SPEAK1
{ &gTurtleCoughAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, -24.0f }, // TURTLE_ANIM_COUGH
{ &gTurtleSpeak2Anim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, -24.0f }, // TURTLE_ANIM_SPEAK2
{ &gTurtleYawnAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, -24.0f }, // TURTLE_ANIM_YAWN
};
static InitChainEntry sInitChain[] = {
@ -130,17 +132,19 @@ void DmChar08_UpdateEyes(DmChar08* this) {
}
}
void DmChar08_ChangeAnim(SkelAnime* skelAnime, AnimationInfo* animationInfo, u16 animIndex) {
void DmChar08_ChangeAnim(SkelAnime* skelAnime, AnimationInfo* animInfo, u16 animIndex) {
f32 endFrame;
animationInfo += animIndex;
if (animationInfo->frameCount < 0.0f) {
endFrame = Animation_GetLastFrame(animationInfo->animation);
animInfo += animIndex;
if (animInfo->frameCount < 0.0f) {
endFrame = Animation_GetLastFrame(animInfo->animation);
} else {
endFrame = animationInfo->frameCount;
endFrame = animInfo->frameCount;
}
Animation_Change(skelAnime, animationInfo->animation, animationInfo->playSpeed, animationInfo->startFrame, endFrame,
animationInfo->mode, animationInfo->morphFrames);
Animation_Change(skelAnime, animInfo->animation, animInfo->playSpeed, animInfo->startFrame, endFrame,
animInfo->mode, animInfo->morphFrames);
}
void DmChar08_Init(Actor* thisx, PlayState* play2) {
@ -198,7 +202,7 @@ void DmChar08_Init(Actor* thisx, PlayState* play2) {
this->unk_1F0 = 1.0f;
this->unk_1FF = 2;
this->animIndex = TURTLE_ANIM_FLOAT;
this->unk_203 = 0x63;
this->prevAnimIndex = TURTLE_ANIM_NONE;
this->eyeMode = TURTLE_EYEMODE_BLINK_STRAIGHT;
this->unk_207 = 0;
this->unk_208 = 0;
@ -217,7 +221,7 @@ void DmChar08_Init(Actor* thisx, PlayState* play2) {
case SCENE_SEA:
this->unk_1FF = 2;
this->animIndex = TURTLE_ANIM_FLOAT;
this->unk_203 = 0x63;
this->prevAnimIndex = TURTLE_ANIM_NONE;
this->eyeMode = TURTLE_EYEMODE_BLINK_LEFT;
this->unk_207 = 0;
this->unk_208 = 0;
@ -229,13 +233,16 @@ void DmChar08_Init(Actor* thisx, PlayState* play2) {
case SCENE_KONPEKI_ENT:
this->unk_1FF = 2;
this->animIndex = TURTLE_ANIM_FLOAT;
this->unk_203 = 0x63;
this->prevAnimIndex = TURTLE_ANIM_NONE;
this->eyeMode = TURTLE_EYEMODE_BLINK_LEFT;
this->unk_207 = 0;
this->unk_208 = 0;
this->actionFunc = DmChar08_DoNothing;
this->unk_1F0 = 1.0f;
break;
default:
break;
}
DmChar08_ChangeAnim(&this->skelAnime, &sAnimationInfo[this->animIndex], 0);
}
@ -454,7 +461,7 @@ void func_80AAFCCC(DmChar08* this, PlayState* play) {
void DmChar08_DoNothing(DmChar08* this, PlayState* play) {
}
void func_80AAFE88(DmChar08* this, PlayState* play) {
void DmChar08_HandleCutscene(DmChar08* this, PlayState* play) {
s32 cueChannel;
s32 pad;
f32 phi_f12;
@ -512,6 +519,9 @@ void func_80AAFE88(DmChar08* this, PlayState* play) {
Actor_PlaySfx(&this->dyna.actor, NA_SE_EV_BIG_TORTOISE_ROLL);
this->animIndex = TURTLE_ANIM_FLOAT;
break;
default:
break;
}
}
switch (play->csCtx.actorCues[cueChannel]->id) {
@ -556,9 +566,9 @@ void func_80AAFE88(DmChar08* this, PlayState* play) {
}
}
void func_80AB01E8(DmChar08* this, PlayState* play) {
if (this->animIndex != this->unk_203) {
this->unk_203 = this->animIndex;
void DmChar08_UpdateAnim(DmChar08* this, PlayState* play) {
if (this->animIndex != this->prevAnimIndex) {
this->prevAnimIndex = this->animIndex;
DmChar08_ChangeAnim(&this->skelAnime, &sAnimationInfo[this->animIndex], 0);
}
}
@ -619,6 +629,9 @@ void func_80AB023C(DmChar08* this, PlayState* play) {
case 0x1030: // Return to sleep
this->unk_207 = 4;
break;
default:
break;
}
}
}
@ -641,6 +654,9 @@ void func_80AB032C(DmChar08* this, PlayState* play) {
this->unk_208 = 0;
}
break;
default:
break;
}
break;
@ -668,6 +684,9 @@ void func_80AB032C(DmChar08* this, PlayState* play) {
this->unk_208 = 0;
}
break;
default:
break;
}
break;
@ -723,6 +742,9 @@ void func_80AB032C(DmChar08* this, PlayState* play) {
this->unk_208 = 0;
}
break;
default:
break;
}
break;
@ -757,6 +779,9 @@ void func_80AB032C(DmChar08* this, PlayState* play) {
this->unk_208 = 0;
}
break;
default:
break;
}
break;
@ -782,6 +807,9 @@ void func_80AB032C(DmChar08* this, PlayState* play) {
this->unk_208 = 0;
}
break;
default:
break;
}
break;
@ -809,6 +837,9 @@ void func_80AB032C(DmChar08* this, PlayState* play) {
this->unk_208 = 0;
}
break;
default:
break;
}
break;
@ -856,8 +887,12 @@ void func_80AB032C(DmChar08* this, PlayState* play) {
this->unk_208 = 0;
}
break;
default:
break;
}
break;
case 10:
switch (this->unk_208) {
case 0:
@ -865,6 +900,7 @@ void func_80AB032C(DmChar08* this, PlayState* play) {
this->eyeMode = TURTLE_EYEMODE_BLINK_LEFT;
this->unk_208++;
break;
case 1:
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
this->animIndex = TURTLE_ANIM_SPEAK2;
@ -872,6 +908,7 @@ void func_80AB032C(DmChar08* this, PlayState* play) {
this->unk_208++;
}
break;
case 2:
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
this->animIndex = TURTLE_ANIM_SPEAK1;
@ -879,6 +916,7 @@ void func_80AB032C(DmChar08* this, PlayState* play) {
this->unk_208++;
}
break;
case 3:
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
this->animIndex = TURTLE_ANIM_FLOAT;
@ -887,8 +925,14 @@ void func_80AB032C(DmChar08* this, PlayState* play) {
this->unk_208 = 0;
}
break;
default:
break;
}
break;
default:
break;
}
}
@ -979,10 +1023,10 @@ void DmChar08_Update(Actor* thisx, PlayState* play) {
DmChar08_UpdateEyes(this);
this->actionFunc(this, play);
func_80AAFE88(this, play);
DmChar08_HandleCutscene(this, play);
func_80AB023C(this, play);
func_80AB032C(this, play);
func_80AB01E8(this, play);
DmChar08_UpdateAnim(this, play);
SkelAnime_Update(&this->skelAnime);
DmChar08_SpawnBubbles(this, play);
this->dyna.actor.world.pos.y = this->targetYPos;
@ -1079,6 +1123,9 @@ void DmChar08_TransformLimbDraw(PlayState* play, s32 limbIndex, Actor* thisx) {
Matrix_Scale((this->unk_1F0 * 0.55f) + 0.45f, (this->unk_1F0 * 0.2f) + 0.8f,
(this->unk_1F0 * 0.55f) + 0.45f, MTXMODE_APPLY);
break;
default:
break;
}
}

View File

@ -31,7 +31,7 @@ typedef struct DmChar08 {
/* 0x200 */ u8 eyeMode;
/* 0x201 */ u8 eyeIndex;
/* 0x202 */ u8 animIndex;
/* 0x203 */ u8 unk_203;
/* 0x203 */ u8 prevAnimIndex;
/* 0x204 */ UNK_TYPE1 unk_204;
/* 0x205 */ u8 alpha;
/* 0x206 */ u8 unk_206;

View File

@ -16,7 +16,7 @@ void DmChar09_Update(Actor* thisx, PlayState* play);
void DmChar09_Draw(Actor* thisx, PlayState* play);
void DmChar09_DoNothing(DmChar09* this, PlayState* play);
void func_80AB2268(DmChar09* this, PlayState* play);
void DmChar09_HandleCutscene(DmChar09* this, PlayState* play);
ActorInit Dm_Char09_InitVars = {
ACTOR_DM_CHAR09,
@ -30,23 +30,28 @@ ActorInit Dm_Char09_InitVars = {
(ActorFunc)DmChar09_Draw,
};
static AnimationInfo sAnimationInfo[] = {
{ &gBeeFlyingAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
typedef enum {
/* 0 */ DMCHAR09_ANIM_FLYING,
/* 1 */ DMCHAR09_ANIM_MAX
} DmChar09Animation;
static AnimationInfo sAnimationInfo[DMCHAR09_ANIM_MAX] = {
{ &gBeeFlyingAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // DMCHAR09_ANIM_FLYING
};
void DmChar09_ChangeAnim(SkelAnime* skelAnime, AnimationInfo* animationInfo, u16 animIndex) {
f32 frameCount;
void DmChar09_ChangeAnim(SkelAnime* skelAnime, AnimationInfo* animInfo, u16 animIndex) {
f32 endFrame;
animationInfo += animIndex;
animInfo += animIndex;
if (animationInfo->frameCount < 0.0f) {
frameCount = Animation_GetLastFrame(animationInfo->animation);
if (animInfo->frameCount < 0.0f) {
endFrame = Animation_GetLastFrame(animInfo->animation);
} else {
frameCount = animationInfo->frameCount;
endFrame = animInfo->frameCount;
}
Animation_Change(skelAnime, animationInfo->animation, animationInfo->playSpeed, animationInfo->startFrame,
frameCount, animationInfo->mode, animationInfo->morphFrames);
Animation_Change(skelAnime, animInfo->animation, animInfo->playSpeed, animInfo->startFrame, endFrame,
animInfo->mode, animInfo->morphFrames);
}
void DmChar09_Init(Actor* thisx, PlayState* play) {
@ -55,7 +60,7 @@ void DmChar09_Init(Actor* thisx, PlayState* play) {
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 19.0f);
SkelAnime_Init(play, &this->skelAnime, &gBeeSkel, &gBeeFlyingAnim, this->jointTable, this->morphTable,
OBJECT_BEE_LIMB_MAX);
DmChar09_ChangeAnim(&this->skelAnime, sAnimationInfo, 0);
DmChar09_ChangeAnim(&this->skelAnime, &sAnimationInfo[DMCHAR09_ANIM_FLYING], 0);
Actor_SetScale(&this->actor, 0.01f);
this->unk_228 = Rand_ZeroOne() * 65535.0f;
this->unk_22A = Rand_ZeroOne() * 65535.0f;
@ -109,7 +114,7 @@ void func_80AB1FDC(DmChar09* this, PlayState* play) {
this->unk_220 = 1;
} else {
phi_a1 = false;
this->actionFunc = func_80AB2268;
this->actionFunc = DmChar09_HandleCutscene;
}
}
if (phi_a1) {
@ -123,7 +128,7 @@ void func_80AB1FDC(DmChar09* this, PlayState* play) {
void DmChar09_DoNothing(DmChar09* this, PlayState* play) {
}
void func_80AB2268(DmChar09* this, PlayState* play) {
void DmChar09_HandleCutscene(DmChar09* this, PlayState* play) {
Path* path;
s32 pad;
s32 i;
@ -148,15 +153,21 @@ void func_80AB2268(DmChar09* this, PlayState* play) {
case 2:
max = 0;
break;
case 3:
max = 1;
break;
case 4:
max = 2;
break;
case 5:
max = 3;
break;
default:
break;
}
if (play->csCtx.actorCues[cueChannel]->id >= 2) {
@ -200,7 +211,7 @@ void DmChar09_Update(Actor* thisx, PlayState* play) {
SkelAnime_Update(&this->skelAnime);
this->actionFunc(this, play);
func_80AB2268(this, play);
DmChar09_HandleCutscene(this, play);
func_80AB24BC(this, play);
if ((play->csCtx.state != CS_STATE_IDLE) && this->unk_22E && DMCHAR09_GET_100(thisx)) {
Actor_PlaySfx(&this->actor, NA_SE_EV_POSTMAN_WALK + SFX_FLAG);

View File

@ -17,8 +17,8 @@ void DmGm_Destroy(Actor* thisx, PlayState* play);
void DmGm_Update(Actor* thisx, PlayState* play);
void func_80C248A8(DmGm* this, PlayState* play);
void func_80C24A00(DmGm* this, PlayState* play);
void func_80C24BD0(DmGm* this, PlayState* play);
void DmGm_HandleCutscene(DmGm* this, PlayState* play);
void DmGm_DoNothing(DmGm* this, PlayState* play);
void func_80C25000(Actor* thisx, PlayState* play);
ActorInit Dm_Gm_InitVars = {
@ -33,29 +33,48 @@ ActorInit Dm_Gm_InitVars = {
(ActorFunc)NULL,
};
static AnimationInfoS sAnimationInfo[] = {
{ &object_an1_Anim_007E08, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
{ &object_an1_Anim_0071E8, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
{ &object_an4_Anim_006CC0, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
{ &object_an1_Anim_013E1C, 1.0f, 0, -1, ANIMMODE_LOOP, -4 },
{ &object_an4_Anim_007E3C, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
{ &object_an4_Anim_0088C0, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
{ &object_an4_Anim_0013C8, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
{ &object_an4_Anim_002550, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
{ &object_an4_Anim_00353C, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
{ &object_an4_Anim_004498, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
{ &object_an4_Anim_0060B4, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
{ &object_an4_Anim_00041C, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
{ &object_an4_Anim_004A78, 1.0f, 0, -1, ANIMMODE_ONCE, 0 },
{ &object_an4_Anim_00506C, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
typedef enum {
/* -1 */ DMGM_ANIM_NONE = -1,
/* 0x0 */ DMGM_ANIM_0,
/* 0x1 */ DMGM_ANIM_1,
/* 0x2 */ DMGM_ANIM_2,
/* 0x3 */ DMGM_ANIM_3,
/* 0x4 */ DMGM_ANIM_4,
/* 0x5 */ DMGM_ANIM_5,
/* 0x6 */ DMGM_ANIM_6,
/* 0x7 */ DMGM_ANIM_7,
/* 0x8 */ DMGM_ANIM_8,
/* 0x9 */ DMGM_ANIM_9,
/* 0xA */ DMGM_ANIM_10,
/* 0xB */ DMGM_ANIM_11,
/* 0xC */ DMGM_ANIM_12,
/* 0xD */ DMGM_ANIM_13,
/* 0xE */ DMGM_ANIM_MAX
} DmGmAnimation;
static AnimationInfoS sAnimationInfo[DMGM_ANIM_MAX] = {
{ &object_an1_Anim_007E08, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // DMGM_ANIM_0
{ &object_an1_Anim_0071E8, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // DMGM_ANIM_1
{ &object_an4_Anim_006CC0, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // DMGM_ANIM_2
{ &object_an1_Anim_013E1C, 1.0f, 0, -1, ANIMMODE_LOOP, -4 }, // DMGM_ANIM_3
{ &object_an4_Anim_007E3C, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // DMGM_ANIM_4
{ &object_an4_Anim_0088C0, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // DMGM_ANIM_5
{ &object_an4_Anim_0013C8, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // DMGM_ANIM_6
{ &object_an4_Anim_002550, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // DMGM_ANIM_7
{ &object_an4_Anim_00353C, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // DMGM_ANIM_8
{ &object_an4_Anim_004498, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // DMGM_ANIM_9
{ &object_an4_Anim_0060B4, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // DMGM_ANIM_10
{ &object_an4_Anim_00041C, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // DMGM_ANIM_11
{ &object_an4_Anim_004A78, 1.0f, 0, -1, ANIMMODE_ONCE, 0 }, // DMGM_ANIM_12
{ &object_an4_Anim_00506C, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // DMGM_ANIM_13
};
s32 func_80C24360(DmGm* this, PlayState* play) {
s32 DmGm_UpdateSkelAnime(DmGm* this, PlayState* play) {
s8 objectIndex = this->actor.objBankIndex;
s8 objectIndex2;
s32 ret = false;
s32 isAnimFinished = false;
if (this->unk_2C8 < 2) {
if (this->animIndex <= DMGM_ANIM_1) {
objectIndex2 = this->actor.objBankIndex;
} else {
objectIndex2 = this->unk_2AC;
@ -63,30 +82,32 @@ s32 func_80C24360(DmGm* this, PlayState* play) {
if (objectIndex2 >= 0) {
gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[objectIndex2].segment);
ret = SkelAnime_Update(&this->skelAnime);
isAnimFinished = SkelAnime_Update(&this->skelAnime);
gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[objectIndex].segment);
}
return ret;
return isAnimFinished;
}
s32 func_80C24428(DmGm* this, PlayState* play, s32 arg2) {
s32 DmGm_ChangeAnim(DmGm* this, PlayState* play, s32 animIndex) {
s8 objectIndex = this->actor.objBankIndex;
s8 objectIndex2;
s32 ret = false;
s32 didAnimChange = false;
if (arg2 < 2) {
if (animIndex <= DMGM_ANIM_1) {
objectIndex2 = this->actor.objBankIndex;
} else {
objectIndex2 = this->unk_2AC;
}
if ((objectIndex2 >= 0) && (arg2 != this->unk_2C8)) {
if ((objectIndex2 >= 0) && (this->animIndex != animIndex)) {
gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[objectIndex2].segment);
this->unk_2C8 = arg2;
ret = SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, arg2);
this->animIndex = animIndex;
didAnimChange = SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, animIndex);
gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[objectIndex].segment);
}
return ret;
return didAnimChange;
}
void func_80C24504(DmGm* this) {
@ -176,8 +197,8 @@ void func_80C248A8(DmGm* this, PlayState* play) {
SkelAnime_InitFlex(play, &this->skelAnime, &object_an1_Skel_012618, NULL, this->jointTable, this->morphTable,
OBJECT_AN1_LIMB_MAX);
this->unk_2C8 = -1;
func_80C24428(this, play, 0);
this->animIndex = DMGM_ANIM_NONE;
DmGm_ChangeAnim(this, play, DMGM_ANIM_0);
this->actor.flags &= ~ACTOR_FLAG_1;
Actor_SetScale(&this->actor, 0.01f);
this->unk_2AE |= 1;
@ -185,25 +206,28 @@ void func_80C248A8(DmGm* this, PlayState* play) {
if ((play->sceneId == SCENE_YADOYA) && (play->curSpawn == 4)) {
this->unk_2B4 = func_80C24838(play);
func_80C24428(this, play, 1);
this->actionFunc = func_80C24BD0;
DmGm_ChangeAnim(this, play, DMGM_ANIM_1);
this->actionFunc = DmGm_DoNothing;
} else {
this->actionFunc = func_80C24A00;
this->actionFunc = DmGm_HandleCutscene;
}
}
}
void func_80C24A00(DmGm* this, PlayState* play) {
s32 sp28[] = { 0, 0, 12, 2, 4, 6, 8, 10, 11, 3 };
void DmGm_HandleCutscene(DmGm* this, PlayState* play) {
s32 csAnimIndex[] = {
DMGM_ANIM_0, DMGM_ANIM_0, DMGM_ANIM_12, DMGM_ANIM_2, DMGM_ANIM_4,
DMGM_ANIM_6, DMGM_ANIM_8, DMGM_ANIM_10, DMGM_ANIM_11, DMGM_ANIM_3,
};
u16 cueId;
s32 cueChannel;
if (play->csCtx.state != CS_STATE_IDLE) {
if (this->unk_2D0 == 0) {
if (!this->isCutscenePlaying) {
this->cueId = 255;
this->unk_2D0 = 1;
this->unk_2D4 = 0;
this->unk_2CC = this->unk_2C8;
this->isCutscenePlaying = true;
this->didAnimChangeInCs = false;
this->prevAnimIndex = this->animIndex;
}
if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_557)) {
@ -212,8 +236,8 @@ void func_80C24A00(DmGm* this, PlayState* play) {
if (this->cueId != (u8)cueId) {
this->cueId = cueId;
this->unk_2D4 = 1;
func_80C24428(this, play, sp28[cueId]);
this->didAnimChangeInCs = true;
DmGm_ChangeAnim(this, play, csAnimIndex[cueId]);
}
switch (this->cueId) {
@ -223,9 +247,10 @@ void func_80C24A00(DmGm* this, PlayState* play) {
case 6:
case 7:
case 8:
if ((this->unk_2C8 == 12) || (this->unk_2C8 == 4) || (this->unk_2C8 == 6) || (this->unk_2C8 == 8)) {
if ((this->animIndex == DMGM_ANIM_12) || (this->animIndex == DMGM_ANIM_4) ||
(this->animIndex == DMGM_ANIM_6) || (this->animIndex == DMGM_ANIM_8)) {
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
func_80C24428(this, play, this->unk_2C8 + 1);
DmGm_ChangeAnim(this, play, this->animIndex + 1);
}
}
break;
@ -235,14 +260,14 @@ void func_80C24A00(DmGm* this, PlayState* play) {
}
Cutscene_ActorTranslateAndYaw(&this->actor, play, cueChannel);
}
} else if (this->unk_2D0 != 0) {
this->unk_2D0 = 0;
this->unk_2D4 = 0;
func_80C24428(this, play, this->unk_2CC);
} else if (this->isCutscenePlaying) {
this->isCutscenePlaying = false;
this->didAnimChangeInCs = false;
DmGm_ChangeAnim(this, play, this->prevAnimIndex);
}
}
void func_80C24BD0(DmGm* this, PlayState* play) {
void DmGm_DoNothing(DmGm* this, PlayState* play) {
}
void DmGm_Init(Actor* thisx, PlayState* play) {
@ -264,7 +289,7 @@ void DmGm_Update(Actor* thisx, PlayState* play) {
func_80C2478C(this, play);
if (this->actor.draw != NULL) {
func_80C24360(this, play);
DmGm_UpdateSkelAnime(this, play);
func_80C24504(this);
}
Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 12.0f, 0.0f, UPDBGCHECKINFO_FLAG_4);
@ -280,7 +305,7 @@ void DmGm_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot,
s8 sp2B = this->actor.objBankIndex;
s8 sp2A = this->unk_2AD;
if ((limbIndex == OBJECT_AN1_LIMB_05) && (this->unk_2D4 != 0)) {
if ((limbIndex == OBJECT_AN1_LIMB_05) && this->didAnimChangeInCs) {
OPEN_DISPS(play->state.gfxCtx);
Matrix_Push();

View File

@ -30,10 +30,10 @@ typedef struct DmGm {
/* 0x2C0 */ s16 unk_2C0;
/* 0x2C2 */ s16 unk_2C2;
/* 0x2C4 */ s16 unk_2C4;
/* 0x2C8 */ s32 unk_2C8;
/* 0x2CC */ s32 unk_2CC;
/* 0x2D0 */ s32 unk_2D0;
/* 0x2D4 */ s32 unk_2D4;
/* 0x2C8 */ s32 animIndex;
/* 0x2CC */ s32 prevAnimIndex;
/* 0x2D0 */ s32 isCutscenePlaying;
/* 0x2D4 */ s32 didAnimChangeInCs;
} DmGm; // size = 0x2D8
#endif // Z_DM_GM_H

View File

@ -27,43 +27,52 @@ ActorInit Dm_Nb_InitVars = {
(ActorFunc)DmNb_Draw,
};
static AnimationInfoS sAnimationInfo[] = {
{ &gNbIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 },
typedef enum {
/* -1 */ DMNB_ANIM_NONE = -1,
/* 0 */ DMNB_ANIM_0,
/* 1 */ DMNB_ANIM_MAX
} DmNbAnimation;
static AnimationInfoS sAnimationInfo[DMNB_ANIM_MAX] = {
{ &gNbIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, // DMNB_ANIM_0
};
s32 func_80C1DED0(DmNb* this, s32 arg1) {
s32 ret = false;
s32 DmNb_ChangeAnim(DmNb* this, s32 animIndex) {
s32 didAnimChange = false;
if (arg1 != this->unk1F0) {
this->unk1F0 = arg1;
ret = SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, arg1);
if (this->animIndex != animIndex) {
this->animIndex = animIndex;
didAnimChange = SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfo, animIndex);
}
return ret;
return didAnimChange;
}
void func_80C1DF18(DmNb* this, PlayState* play) {
s32 sp2C[] = { 0, 0, 0, 0, 0 };
void DmNb_HandleCutscene(DmNb* this, PlayState* play) {
s32 csAnimIndex[] = {
DMNB_ANIM_0, DMNB_ANIM_0, DMNB_ANIM_0, DMNB_ANIM_0, DMNB_ANIM_0,
};
u16 cueId;
s32 cueChannel;
if (play->csCtx.state != CS_STATE_IDLE) {
if (this->unk1F8 == 0) {
if (!this->isCutscenePlaying) {
this->cueId = 255;
this->unk1F8 = 1;
this->unk1F4 = this->unk1F0;
this->isCutscenePlaying = true;
this->prevAnimIndex = this->animIndex;
}
if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_562)) {
cueChannel = Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_562);
cueId = play->csCtx.actorCues[cueChannel]->id;
if (this->cueId != (u8)cueId) {
this->cueId = cueId;
func_80C1DED0(this, sp2C[cueId]);
DmNb_ChangeAnim(this, csAnimIndex[cueId]);
}
Cutscene_ActorTranslateAndYaw(&this->actor, play, cueChannel);
}
} else if (this->unk1F8 != 0) {
this->unk1F8 = 0;
func_80C1DED0(this, this->unk1F4);
} else if (this->isCutscenePlaying) {
this->isCutscenePlaying = false;
DmNb_ChangeAnim(this, this->prevAnimIndex);
}
}
@ -72,11 +81,11 @@ void DmNb_Init(Actor* thisx, PlayState* play) {
ActorShape_Init(&this->actor.shape, 0.0f, NULL, 0.0f);
SkelAnime_InitFlex(play, &this->skelAnime, &gNbSkel, NULL, this->jointTable, this->morphTable, NB_LIMB_MAX);
this->unk1F0 = -1;
func_80C1DED0(this, 0);
this->animIndex = DMNB_ANIM_NONE;
DmNb_ChangeAnim(this, DMNB_ANIM_0);
this->actor.flags &= ~ACTOR_FLAG_1;
Actor_SetScale(&this->actor, 0.01f);
this->actionFunc = func_80C1DF18;
this->actionFunc = DmNb_HandleCutscene;
}
void DmNb_Destroy(Actor* thisx, PlayState* play) {

View File

@ -15,9 +15,9 @@ typedef struct DmNb {
/* 0x18C */ Vec3s jointTable[NB_LIMB_MAX];
/* 0x1BC */ Vec3s morphTable[NB_LIMB_MAX];
/* 0x1EC */ u8 cueId;
/* 0x1F0 */ s32 unk1F0;
/* 0x1F4 */ s32 unk1F4;
/* 0x1F8 */ s32 unk1F8;
/* 0x1F0 */ s32 animIndex;
/* 0x1F4 */ s32 prevAnimIndex;
/* 0x1F8 */ s32 isCutscenePlaying;
} DmNb; // size = 0x1FC
#endif // Z_DM_NB_H

View File

@ -16,7 +16,7 @@ void DmOpstage_Destroy(Actor* thisx, PlayState* play);
void DmOpstage_Update(Actor* thisx, PlayState* play);
void DmOpstage_Draw(Actor* thisx, PlayState* play);
void DmOpstage_FollowCutsceneScript(DmOpstage* this, PlayState* play);
void DmOpstage_HandleCutscene(DmOpstage* this, PlayState* play);
ActorInit Dm_Opstage_InitVars = {
ACTOR_DM_OPSTAGE,
@ -42,7 +42,7 @@ void DmOpstage_Init(Actor* thisx, PlayState* play) {
DmOpstage* this = THIS;
Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
DmOpstage_SetupAction(this, DmOpstage_FollowCutsceneScript);
DmOpstage_SetupAction(this, DmOpstage_HandleCutscene);
Actor_SetScale(&this->dyna.actor, 0.1f);
if (DMOPSTAGE_GET_TYPE(&this->dyna.actor) == DMOPSTAGE_TYPE_GROUND) {
@ -69,7 +69,7 @@ void DmOpstage_Destroy(Actor* thisx, PlayState* play) {
}
}
void DmOpstage_FollowCutsceneScript(DmOpstage* this, PlayState* play) {
void DmOpstage_HandleCutscene(DmOpstage* this, PlayState* play) {
s32 cueChannel;
if (DMOPSTAGE_GET_TYPE(&this->dyna.actor) == DMOPSTAGE_TYPE_GROUND) {
@ -134,5 +134,8 @@ void DmOpstage_Draw(Actor* thisx, PlayState* play) {
Gfx_DrawDListOpa(play, gKeikokuDemoTallTreeStraightDL);
Gfx_DrawDListXlu(play, gKeikokuDemoTallTreeStraightEmptyDL);
break;
default:
break;
}
}

View File

@ -55,9 +55,10 @@ void DmRavine_Update(Actor* thisx, PlayState* play) {
DmRavine* this = THIS;
RoomContext* roomCtx;
switch ((DmRavineState)this->state) {
switch (this->state) {
case DM_RAVINE_STATE_INITIALIZED:
return;
break;
case DM_RAVINE_STATE_ACTIVE:
this->isActive = true;
play->roomCtx.unk7A[1]++;
@ -70,9 +71,13 @@ void DmRavine_Update(Actor* thisx, PlayState* play) {
}
}
break;
case DM_RAVINE_STATE_PENDING_DEATH:
Actor_Kill(&this->actor);
break;
default:
break;
}
}

View File

@ -30,19 +30,29 @@ ActorInit Dm_Sa_InitVars = {
(ActorFunc)DmSa_Draw,
};
static AnimationInfo sAnimationInfo[] = { { &gSkullKidTPoseAnim, 1.0f, 0, -1.0f, ANIMMODE_LOOP, 0 } };
typedef enum {
/* -1 */ DMSA_ANIM_NONE = -1,
/* 0 */ DMSA_ANIM_T_POSE,
/* 1 */ DMSA_ANIM_MAX
} DmSaAnimation;
void func_80A2E960(SkelAnime* arg0, AnimationInfo* animations, u16 index) {
f32 frameCount;
static AnimationInfo sAnimationInfo[DMSA_ANIM_MAX] = {
{ &gSkullKidTPoseAnim, 1.0f, 0, -1.0f, ANIMMODE_LOOP, 0 }, // DMSA_ANIM_T_POSE
};
animations += index;
if (animations->frameCount < 0.0f) {
frameCount = Animation_GetLastFrame(animations->animation);
void DmSa_ChangeAnim(SkelAnime* skelAnime, AnimationInfo* animInfo, u16 animIndex) {
f32 endFrame;
animInfo += animIndex;
if (animInfo->frameCount < 0.0f) {
endFrame = Animation_GetLastFrame(animInfo->animation);
} else {
frameCount = animations->frameCount;
endFrame = animInfo->frameCount;
}
Animation_Change(arg0, animations->animation, animations->playSpeed, animations->startFrame, frameCount,
animations->mode, animations->morphFrames);
Animation_Change(skelAnime, animInfo->animation, animInfo->playSpeed, animInfo->startFrame, endFrame,
animInfo->mode, animInfo->morphFrames);
}
void DmSa_Init(Actor* thisx, PlayState* play) {
@ -53,7 +63,7 @@ void DmSa_Init(Actor* thisx, PlayState* play) {
this->actor.targetArrowOffset = 3000.0f;
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 24.0f);
SkelAnime_InitFlex(play, &this->skelAnime, &gSkullKidSkel, NULL, NULL, NULL, 0);
func_80A2E960(&this->skelAnime, sAnimationInfo, 0);
DmSa_ChangeAnim(&this->skelAnime, &sAnimationInfo[DMSA_ANIM_T_POSE], 0);
Actor_SetScale(&this->actor, 0.01f);
this->actionFunc = DmSa_DoNothing;
}

View File

@ -108,7 +108,8 @@ typedef enum {
/* 68 */ SK_ANIM_LOOK_LEFT_START,
/* 69 */ SK_ANIM_LOOK_LEFT_LOOP,
/* 70 */ SK_ANIM_SNIFF,
/* 71 */ SK_ANIM_LAUGH_AFTER_SNIFF
/* 71 */ SK_ANIM_LAUGH_AFTER_SNIFF,
/* 72 */ SK_ANIM_LAUGH_AFTER_MAX
} SkullKidAnimation;
typedef enum {
@ -219,79 +220,87 @@ static DamageTable sDamageTable = {
/* Powder Keg */ DMG_ENTRY(1, 0xF),
};
static AnimationInfo sAnimationInfo[] = {
{ &gSkullKidShakeHeadAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
{ &gSkullKidWalkAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
{ &gSkullKidLookAroundAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
{ &gSkullKidIdleAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
{ &gSkullKidIdleAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
{ &gSkullKidBentOverHeadTwitchAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
{ &gSkullKidGlitchyHorseRideStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
{ &gSkullKidRecliningFloatAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
{ &gSkullKidCurseStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
{ &gSkullKidCurseLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
{ &gSkullKidLaughStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
{ &gSkullKidLaughLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
{ &gSkullKidHideOcarinaStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
{ &gSkullKidHideOcarinaLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
static AnimationInfo sAnimationInfo[SK_ANIM_LAUGH_AFTER_MAX] = {
{ &gSkullKidShakeHeadAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_SHAKE_HEAD
{ &gSkullKidWalkAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_WALK
{ &gSkullKidLookAroundAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // SK_ANIM_LOOK_AROUND
{ &gSkullKidIdleAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_IDLE
{ &gSkullKidIdleAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_UNUSED_IDLE
{ &gSkullKidBentOverHeadTwitchAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_BENT_OVER_HEAD_TWITCH
{ &gSkullKidGlitchyHorseRideStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_GLITCHY_HORSE_RIDE_START
{ &gSkullKidRecliningFloatAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_RECLINING_FLOAT
{ &gSkullKidCurseStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // SK_ANIM_CURSE_START
{ &gSkullKidCurseLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_CURSE_LOOP
{ &gSkullKidLaughStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // SK_ANIM_LAUGH_START
{ &gSkullKidLaughLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_LAUGH_LOOP
{ &gSkullKidHideOcarinaStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // SK_ANIM_HIDE_OCARINA_START
{ &gSkullKidHideOcarinaLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_HIDE_OCARINA_LOOP
// SK_ANIM_PICK_UP_OCARINA_AND_START_PLAYING
{ &gSkullKidPickUpOcarinaAndStartPlayingAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
{ &gSkullKidPlayOcarinaAndLaughAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
{ &gSkullKidPickUpOcarinaAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
{ &gSkullKidLookAtOcarinaAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
{ &gSkullKidKickOverLinkAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
{ &gSkullKidSearchLinkAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
{ &gSkullKidKickOverLinkAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
{ &gSkullKidSearchLinkAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
{ &gSkullKidHorseRideStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
{ &gSkullKidHorseRideLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
{ &gSkullKidRaiseMaskStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
{ &gSkullKidRaiseMaskLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
{ &gSkullKidLowerMaskAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
{ &gSkullKidPlayOcarinaAndLaughAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_PLAY_OCARINA_AND_LAUGH
{ &gSkullKidPickUpOcarinaAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // SK_ANIM_PICK_UP_OCARINA
{ &gSkullKidLookAtOcarinaAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_LOOK_AT_OCARINA
{ &gSkullKidKickOverLinkAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // SK_ANIM_KICK_OVER_LINK
{ &gSkullKidSearchLinkAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_SEARCH_LINK
{ &gSkullKidKickOverLinkAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // SK_ANIM_UNUSED_KICK_OVER_LINK
{ &gSkullKidSearchLinkAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_UNUSED_SEARCH_LINK
{ &gSkullKidHorseRideStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // SK_ANIM_HORSE_RIDE_START
{ &gSkullKidHorseRideLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_HORSE_RIDE_LOOP
{ &gSkullKidRaiseMaskStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // SK_ANIM_RAISE_MASK_START
{ &gSkullKidRaiseMaskLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_RAISE_MASK_LOOP
{ &gSkullKidLowerMaskAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // SK_ANIM_LOWER_MASK
// SK_ANIM_JUMP_WHILE_HIDING_OCARINA
{ &gSkullKidJumpWhileHidingOcarinaAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
{ &gSkullKidHorseRideAndRotateAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
{ &gSkullKidHorseRideAndRotateAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // SK_ANIM_HORSE_RIDE_AND_ROTATE
// SK_ANIM_PLAY_OCARINA_WHILE_FLOATING
{ &gSkullKidPlayOcarinaWhileFloatingAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
{ &gSkullKidFloatingTurnAroundAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
{ &gSkullKidOcarinaJuggleAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
{ &gSkullKidCallDownMoonStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
{ &gSkullKidCallDownMoonLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
{ &gSkullKidSmackFairyStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
{ &gSkullKidSmackFairyLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
{ &gSkullKidHitByBubbleAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
{ &gSkullKidDropOcarinaAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
{ &gSkullKidFloatingArmsCrossedAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
{ &gSkullKidDeflectAttackAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
{ &gSkullKidTelescopeLookUpStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
{ &gSkullKidTelescopeLookUpLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
{ &gSkullKidSurpriseStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
{ &gSkullKidSurpriseLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
{ &gSkullKidFloatingTurnAroundAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // SK_ANIM_FLOATING_TURN_AROUND
{ &gSkullKidOcarinaJuggleAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_OCARINA_JUGGLE
{ &gSkullKidCallDownMoonStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // SK_ANIM_CALL_DOWN_MOON_START
{ &gSkullKidCallDownMoonLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_CALL_DOWN_MOON_LOOP
{ &gSkullKidSmackFairyStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // SK_ANIM_SMACK_FAIRY_START
{ &gSkullKidSmackFairyLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_SMACK_FAIRY_LOOP
{ &gSkullKidHitByBubbleAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // SK_ANIM_HIT_BY_BUBBLE
{ &gSkullKidDropOcarinaAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // SK_ANIM_DROP_OCARINA
{ &gSkullKidFloatingArmsCrossedAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_FLOATING_ARMS_CROSSED
{ &gSkullKidDeflectAttackAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // SK_ANIM_DEFLECT_ATTACK
{ &gSkullKidTelescopeLookUpStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // SK_ANIM_TELESCOPE_LOOK_UP_START
{ &gSkullKidTelescopeLookUpLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_TELESCOPE_LOOK_UP_LOOP
{ &gSkullKidSurpriseStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // SK_ANIM_SURPRISE_START
{ &gSkullKidSurpriseLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_SURPRISE_LOOP
// SK_ANIM_LOOK_AROUND_FOR_GIANTS_START
{ &gSkullKidLookAroundForGiantsStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
// SK_ANIM_LOOK_AROUND_FOR_GIANTS_LOOP
{ &gSkullKidLookAroundForGiantsLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
{ &gSkullKidHoldHeadAndShakeStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
{ &gSkullKidHoldHeadAndShakeLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
{ &gSkullKidHoldHeadAndShakeStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE,
0.0f }, // SK_ANIM_HOLD_HEAD_AND_SHAKE_START
{ &gSkullKidHoldHeadAndShakeLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_HOLD_HEAD_AND_SHAKE_LOOP
// SK_ANIM_HOLD_HEAD_AND_SCREAM_START
{ &gSkullKidHoldHeadAndScreamStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
// SK_ANIM_HOLD_HEAD_AND_SCREAM_LOOP
{ &gSkullKidHoldHeadAndScreamLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
{ &gSkullKidHuddleWithFairiesAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
{ &gSkullKidSearchMaskSalesmanAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
{ &gSkullKidHoldUpMaskStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
{ &gSkullKidHoldUpMaskLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
{ &gSkullKidShiverAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
{ &gSkullKidDrawAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
{ &gSkullKidBentOverLookUpAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
{ &gSkullKidSpankAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
{ &gSkullKidHipShakeAndJumpAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
{ &gSkullKidPlayFluteAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
{ &gSkullKidCartwheelAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
{ &gSkullKidDangleFromMaskStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
{ &gSkullKidDangleFromMaskStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
{ &gSkullKidDangleFromMaskLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
{ &gSkullKidDroppedFromMaskAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
{ &gSkullKidLookUpAtGiantsAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
{ &gSkullKidAshamedStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
{ &gSkullKidAshamedLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
{ &gSkullKidLookLeftStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
{ &gSkullKidLookLeftLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
{ &gSkullKidSniffAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f },
{ &gSkullKidLaughAfterSniffAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f },
{ &gSkullKidHuddleWithFairiesAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_HUDDLE_WITH_FAIRIES
{ &gSkullKidSearchMaskSalesmanAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_SEARCH_MASK_SALESMAN
{ &gSkullKidHoldUpMaskStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // SK_ANIM_HOLD_UP_MASK_START
{ &gSkullKidHoldUpMaskLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_HOLD_UP_MASK_LOOP
{ &gSkullKidShiverAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_SHIVER
{ &gSkullKidDrawAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // SK_ANIM_DRAW
{ &gSkullKidBentOverLookUpAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // SK_ANIM_BENT_OVER_LOOK_UP
{ &gSkullKidSpankAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_SPANK
{ &gSkullKidHipShakeAndJumpAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // SK_ANIM_HIP_SHAKE_AND_JUMP
{ &gSkullKidPlayFluteAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_PLAY_FLUTE
{ &gSkullKidCartwheelAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // SK_ANIM_CARTWHEEL
{ &gSkullKidDangleFromMaskStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // SK_ANIM_LIE_FLAT
{ &gSkullKidDangleFromMaskStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // SK_ANIM_DANGLE_FROM_MASK_START
{ &gSkullKidDangleFromMaskLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_DANGLE_FROM_MASK_LOOP
{ &gSkullKidDroppedFromMaskAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // SK_ANIM_DROPPED_FROM_MASK
{ &gSkullKidLookUpAtGiantsAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_LOOK_UP_AT_GIANTS
{ &gSkullKidAshamedStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // SK_ANIM_ASHAMED_START
{ &gSkullKidAshamedLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_ASHAMED_LOOP
{ &gSkullKidLookLeftStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // SK_ANIM_LOOK_LEFT_START
{ &gSkullKidLookLeftLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_LOOK_LEFT_LOOP
{ &gSkullKidSniffAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, 0.0f }, // SK_ANIM_SNIFF
{ &gSkullKidLaughAfterSniffAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, 0.0f }, // SK_ANIM_LAUGH_AFTER_SNIFF
};
/**
@ -315,19 +324,21 @@ void DmStk_LoadObjectForAnimation(DmStk* this, PlayState* play) {
}
}
/**
* This function is always called with unusedExtraOffset = 0.
*/
void DmStk_ChangeAnim(DmStk* this, PlayState* play, SkelAnime* skelAnime, AnimationInfo* animationInfo,
u16 unusedExtraOffset) {
void DmStk_ChangeAnim(DmStk* this, PlayState* play, SkelAnime* skelAnime, AnimationInfo* animInfo, u16 animIndex) {
f32 endFrame;
DmStk_LoadObjectForAnimation(this, play);
animationInfo += unusedExtraOffset;
animInfo += animIndex;
Animation_Change(skelAnime, animationInfo->animation, animationInfo->playSpeed, animationInfo->startFrame,
(animationInfo->frameCount < 0.0f) ? Animation_GetLastFrame(animationInfo->animation)
: animationInfo->frameCount,
animationInfo->mode, animationInfo->morphFrames);
if (animInfo->frameCount < 0.0f) {
endFrame = Animation_GetLastFrame(animInfo->animation);
} else {
endFrame = animInfo->frameCount;
}
Animation_Change(skelAnime, animInfo->animation, animInfo->playSpeed, animInfo->startFrame, endFrame,
animInfo->mode, animInfo->morphFrames);
}
/**
@ -418,6 +429,9 @@ void DmStk_PlaySfxForIntroCutsceneFirstPart(DmStk* this, PlayState* play) {
case 2530:
Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_RIDE);
break;
default:
break;
}
}
@ -461,6 +475,9 @@ void DmStk_PlaySfxForIntroCutsceneSecondPart(DmStk* this, PlayState* play) {
case 173:
Actor_PlaySfx(&this->actor, NA_SE_EN_STAL03_LAUGH_BIG);
break;
default:
break;
}
}
@ -481,6 +498,9 @@ void DmStk_PlaySfxForObtainingMajorasMaskCutscene(DmStk* this, PlayState* play)
case 142:
Actor_PlaySfx(&this->actor, NA_SE_EN_EVIL_POWER);
break;
default:
break;
}
}
@ -507,6 +527,9 @@ void DmStk_PlaySfxForCurseCutsceneFirstPart(DmStk* this, PlayState* play) {
case 890:
Actor_PlaySfx(&this->actor, NA_SE_EN_STAL21_PSYCHO_VOICE);
break;
default:
break;
}
}
@ -554,9 +577,10 @@ void DmStk_PlaySfxForCurseCutsceneSecondPart(DmStk* this, PlayState* play) {
case 217:
Actor_PlaySfx(&player->actor, NA_SE_VO_DUMMY_136);
break;
}
if (player) {}
default:
break;
}
if ((play->csCtx.curFrame >= 263) && (play->csCtx.curFrame < 698)) {
Actor_PlaySfx(&player->actor, NA_SE_EN_STALKIDS_BODY_LEV - SFX_FLAG);
@ -592,6 +616,9 @@ void DmStk_PlaySfxForClockTowerIntroCutsceneVersion1(DmStk* this, PlayState* pla
case 678:
Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_STRETCH);
break;
default:
break;
}
if ((this->animIndex == SK_ANIM_OCARINA_JUGGLE) && (play->csCtx.curFrame < 700)) {
@ -659,6 +686,9 @@ void DmStk_PlaySfxForPlayingWithFairiesCutscene(DmStk* this, PlayState* play) {
case 230:
Actor_PlaySfx(&this->actor, NA_SE_EN_STAL22_LAUGH_KID_L);
break;
default:
break;
}
}
@ -676,6 +706,9 @@ void DmStk_PlaySfxForEndingCutsceneFirstPart(DmStk* this, PlayState* play) {
case 660:
Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_SHAKEHEAD);
break;
default:
break;
}
}
@ -731,6 +764,9 @@ void DmStk_PlaySfxForEndingCutsceneSecondPart(DmStk* this, PlayState* play) {
AudioSfx_MuteBanks((1 << BANK_PLAYER) | (1 << BANK_ITEM) | (1 << BANK_ENV) | (1 << BANK_ENEMY) |
(1 << BANK_SYSTEM) | (1 << BANK_OCARINA) | (1 << BANK_VOICE));
break;
default:
break;
}
if (this->animIndex == SK_ANIM_SHAKE_HEAD) {
@ -777,6 +813,9 @@ void DmStk_PlaySfxForClockTowerIntroCutsceneVersion2(DmStk* this, PlayState* pla
case 388:
Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_STRETCH);
break;
default:
break;
}
if (play->csCtx.curFrame >= 408) {
@ -888,6 +927,9 @@ void DmStk_PlaySfxForMoonWarpCutsceneVersion1(DmStk* this, PlayState* play) {
Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_MASK_ON);
Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_ONGND);
break;
default:
break;
}
}
@ -910,6 +952,9 @@ void DmStk_PlaySfxForMoonWarpCutsceneVersion2(DmStk* this, PlayState* play) {
Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_MASK_ON);
Actor_PlaySfx(&this->actor, NA_SE_EN_STALKIDS_ONGND);
break;
default:
break;
}
}
@ -980,6 +1025,9 @@ void DmStk_PlaySfxForCutscenes(DmStk* this, PlayState* play) {
}
}
break;
default:
break;
}
}
@ -1306,7 +1354,7 @@ void DmStk_ClockTower_WaitForDeflectionToEnd(DmStk* this, PlayState* play) {
* Updates a variety of states based on Skull Kid's current cutscene, including his current
* animation, his hand/mask type, his fade in/fade out state, and his current cutscene action.
*/
void DmStk_UpdateCutscenes(DmStk* this, PlayState* play) {
void DmStk_HandleCutscene(DmStk* this, PlayState* play) {
s32 pad;
s32 cueChannel;
@ -1676,6 +1724,9 @@ void DmStk_UpdateCutscenes(DmStk* this, PlayState* play) {
this->handType = SK_HAND_TYPE_DEFAULT;
DmStk_ChangeAnim(this, play, &this->skelAnime, &sAnimationInfo[this->animIndex], 0);
break;
default:
break;
}
}
@ -1781,7 +1832,7 @@ void DmStk_Update(Actor* thisx, PlayState* play) {
DmStk_UpdateCollision(this, play);
}
DmStk_UpdateCutscenes(this, play);
DmStk_HandleCutscene(this, play);
DmStk_PlaySfxForCutscenes(this, play);
// This handles the cutscene where the player takes out the Deku Pipes for the first time.
@ -1809,6 +1860,9 @@ void DmStk_Update(Actor* thisx, PlayState* play) {
this->dekuPipesCutsceneState = SK_DEKU_PIPES_CS_STATE_END;
}
break;
default:
break;
}
// This code is responsible for making in-game time pass while using the telescope in the Astral Observatory.
@ -1854,6 +1908,9 @@ s32 DmStk_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* p
*dList = NULL;
}
break;
default:
break;
}
} else if (limbIndex == SKULL_KID_LIMB_HEAD) {
*dList = NULL;
@ -1924,6 +1981,9 @@ void DmStk_PostLimbDraw2(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot
Matrix_Pop();
}
break;
default:
break;
}
CLOSE_DISPS(play->state.gfxCtx);
@ -1964,6 +2024,9 @@ void DmStk_PostLimbDraw2(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, gSkullKidMajorasMask1DL);
break;
default:
break;
}
CLOSE_DISPS(play->state.gfxCtx);
@ -2008,6 +2071,9 @@ void DmStk_PostLimbDraw2(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot
gSPDisplayList(POLY_OPA_DISP++, gSkullKidOpenLeftHand);
}
break;
default:
break;
}
CLOSE_DISPS(play->state.gfxCtx);

View File

@ -15,7 +15,7 @@ void DmTag_Destroy(Actor* thisx, PlayState* play);
void DmTag_Update(Actor* thisx, PlayState* play);
void func_80C229AC(DmTag* this, PlayState* play);
void func_80C229EC(DmTag* this, PlayState* play);
void DmTag_DoNothing(DmTag* this, PlayState* play);
void func_80C229FC(DmTag* this, PlayState* play);
ActorInit Dm_Tag_InitVars = {
@ -162,6 +162,9 @@ s32 func_80C224D8(DmTag* this, PlayState* play) {
gSaveContext.nextTransitionType = TRANS_TYPE_FADE_BLACK_SLOW;
this->unk_1A4++;
break;
default:
break;
}
return ret;
}
@ -190,9 +193,13 @@ s32* func_80C22880(DmTag* this, PlayState* play) {
return D_80C22BF0;
}
return D_80C22C30;
case 2:
this->msgEventCallback = func_80C224D8;
return D_80C22BFC;
default:
break;
}
return NULL;
}
@ -217,7 +224,7 @@ void func_80C229AC(DmTag* this, PlayState* play) {
this->actor.flags |= ACTOR_FLAG_1;
}
void func_80C229EC(DmTag* this, PlayState* play) {
void DmTag_DoNothing(DmTag* this, PlayState* play) {
}
void func_80C229FC(DmTag* this, PlayState* play) {
@ -241,7 +248,7 @@ void DmTag_Init(Actor* thisx, PlayState* play) {
this->unk_18C = 0;
SubS_UpdateFlags(&this->unk_18C, 4, 7);
this->actor.flags &= ~ACTOR_FLAG_1;
this->actionFunc = func_80C229EC;
this->actionFunc = DmTag_DoNothing;
} else if (this->actor.room == 2) {
Actor_Kill(&this->actor);
} else {

View File

@ -29,16 +29,6 @@ ActorInit Dm_Zl_InitVars = {
(ActorFunc)DmZl_Draw,
};
static AnimationInfo sAnimationInfo[] = {
{ &gDmZl4FacingAwayHandsOverEmblemLoop, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, -10.0f },
{ &gDmZl4TurningAround2Anim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, -10.0f },
{ &gDmZl4HandsOverEmblemLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, -10.0f },
{ &gDmZl4GivingItemStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, -10.0f },
{ &gDmZl4GivingItemLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, -10.0f },
{ &gDmZl4RaisingOcarinaToPlayAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, -10.0f },
{ &gDmZl4PlayingOcarinaAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, -10.0f },
};
typedef enum {
/* 0 */ ZELDA_ANIM_FACING_AWAY,
/* 1 */ ZELDA_ANIM_TURNING_TOWARD_PLAYER,
@ -50,6 +40,16 @@ typedef enum {
/* 7 */ ZELDA_ANIM_MAX
} DmZlAnimation;
static AnimationInfo sAnimationInfo[ZELDA_ANIM_MAX] = {
{ &gDmZl4FacingAwayHandsOverEmblemLoop, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, -10.0f }, // ZELDA_ANIM_FACING_AWAY
{ &gDmZl4TurningAround2Anim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, -10.0f }, // ZELDA_ANIM_TURNING_TOWARD_PLAYER
{ &gDmZl4HandsOverEmblemLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, -10.0f }, // ZELDA_ANIM_FACING_PLAYER
{ &gDmZl4GivingItemStartAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, -10.0f }, // ZELDA_ANIM_GIVING_OCARINA_START
{ &gDmZl4GivingItemLoopAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, -10.0f }, // ZELDA_ANIM_GIVING_OCARINA
{ &gDmZl4RaisingOcarinaToPlayAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_ONCE, -10.0f }, // ZELDA_ANIM_PLAYING_OCARINA_START
{ &gDmZl4PlayingOcarinaAnim, 1.0f, 0.0f, -1.0f, ANIMMODE_LOOP, -10.0f }, // ZELDA_ANIM_PLAYING_OCARINA
};
static TexturePtr sMouthTextures[] = {
gZl4MouthNeutralTex,
gZl4MouthOpenSmilingTex,
@ -95,18 +95,19 @@ typedef enum {
/* 6 */ ZELDA_EYE_STATE_CLOSED2
} DmZlEyeStates;
/**
* This function is always called with unusedExtraOffset = 0.
*/
void DmZl_ChangeAnimation(SkelAnime* skelAnime, AnimationInfo animationInfo[], u16 unusedExtraOffset) {
void DmZl_ChangeAnim(SkelAnime* skelAnime, AnimationInfo* animInfo, u16 animIndex) {
f32 endFrame;
animationInfo += unusedExtraOffset;
endFrame = (animationInfo->frameCount < 0.0f) ? Animation_GetLastFrame(animationInfo->animation)
: animationInfo->frameCount;
animInfo += animIndex;
Animation_Change(skelAnime, animationInfo->animation, animationInfo->playSpeed, animationInfo->startFrame, endFrame,
animationInfo->mode, animationInfo->morphFrames);
if (animInfo->frameCount < 0.0f) {
endFrame = Animation_GetLastFrame(animInfo->animation);
} else {
endFrame = animInfo->frameCount;
}
Animation_Change(skelAnime, animInfo->animation, animInfo->playSpeed, animInfo->startFrame, endFrame,
animInfo->mode, animInfo->morphFrames);
}
void DmZl_Init(Actor* thisx, PlayState* play) {
@ -119,7 +120,7 @@ void DmZl_Init(Actor* thisx, PlayState* play) {
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 24.0f);
// these three set to NULL should mean they are dynamically allocated
SkelAnime_InitFlex(play, &this->skelAnime, &gZl4Skeleton, NULL, NULL, NULL, 0);
DmZl_ChangeAnimation(&this->skelAnime, &sAnimationInfo[this->animIndex], 0);
DmZl_ChangeAnim(&this->skelAnime, &sAnimationInfo[this->animIndex], 0);
Actor_SetScale(&this->actor, 0.01f);
this->actionFunc = DmZl_DoNothing;
}
@ -130,32 +131,36 @@ void DmZl_Destroy(Actor* thisx, PlayState* play) {
void DmZl_DoNothing(DmZl* this, PlayState* play) {
}
void DmZl_UpdateCutscene(DmZl* this, PlayState* play) {
s32 cueChannel; // reused as animIndex
void DmZl_HandleCutscene(DmZl* this, PlayState* play) {
s32 cueChannel;
s32 animIndex;
if (Cutscene_IsCueInChannel(play, CS_CMD_ACTOR_CUE_102)) {
cueChannel = Cutscene_GetCueChannel(play, CS_CMD_ACTOR_CUE_102);
if (play->csCtx.curFrame == play->csCtx.actorCues[cueChannel]->startFrame) {
s16 nextAnimIndex = ZELDA_ANIM_FACING_AWAY;
animIndex = ZELDA_ANIM_FACING_AWAY;
switch (play->csCtx.actorCues[cueChannel]->id) {
default:
case 1:
break;
case 2:
nextAnimIndex = ZELDA_ANIM_TURNING_TOWARD_PLAYER;
animIndex = ZELDA_ANIM_TURNING_TOWARD_PLAYER;
break;
case 3:
nextAnimIndex = ZELDA_ANIM_GIVING_OCARINA_START;
animIndex = ZELDA_ANIM_GIVING_OCARINA_START;
break;
case 4:
nextAnimIndex = ZELDA_ANIM_PLAYING_OCARINA_START;
animIndex = ZELDA_ANIM_PLAYING_OCARINA_START;
break;
}
if (nextAnimIndex != this->animIndex) {
this->animIndex = nextAnimIndex;
DmZl_ChangeAnimation(&this->skelAnime, &sAnimationInfo[this->animIndex], 0);
if (this->animIndex != animIndex) {
this->animIndex = animIndex;
DmZl_ChangeAnim(&this->skelAnime, &sAnimationInfo[this->animIndex], 0);
}
}
@ -163,13 +168,13 @@ void DmZl_UpdateCutscene(DmZl* this, PlayState* play) {
}
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
cueChannel = this->animIndex;
animIndex = cueChannel = this->animIndex;
if ((cueChannel == ZELDA_ANIM_TURNING_TOWARD_PLAYER) || (cueChannel == ZELDA_ANIM_GIVING_OCARINA_START) ||
(cueChannel == ZELDA_ANIM_PLAYING_OCARINA_START)) {
if ((animIndex == ZELDA_ANIM_TURNING_TOWARD_PLAYER) || (animIndex == ZELDA_ANIM_GIVING_OCARINA_START) ||
(animIndex == ZELDA_ANIM_PLAYING_OCARINA_START)) {
// these animations don't loop at the end, they lead into the next animation
this->animIndex++;
DmZl_ChangeAnimation(&this->skelAnime, &sAnimationInfo[this->animIndex], 0);
DmZl_ChangeAnim(&this->skelAnime, &sAnimationInfo[this->animIndex], 0);
}
}
}
@ -256,7 +261,7 @@ void DmZl_Update(Actor* thisx, PlayState* play) {
DmZl_UpdateFace(this);
SkelAnime_Update(&this->skelAnime);
DmZl_UpdateCutscene(this, play);
DmZl_HandleCutscene(this, play);
this->actionFunc(this, play);
}

View File

@ -10113,7 +10113,7 @@
0x80A2E838:("DmRavine_DoNothing",),
0x80A2E848:("DmRavine_Update",),
0x80A2E8F4:("DmRavine_Draw",),
0x80A2E960:("func_80A2E960",),
0x80A2E960:("DmSa_ChangeAnim",),
0x80A2E9FC:("DmSa_Init",),
0x80A2EAAC:("DmSa_Destroy",),
0x80A2EABC:("DmSa_DoNothing",),
@ -10244,11 +10244,11 @@
0x80A37EE0:("ObjShutter_Destroy",),
0x80A37EF0:("ObjShutter_Update",),
0x80A3803C:("ObjShutter_Draw",),
0x80A38190:("DmZl_ChangeAnimation",),
0x80A38190:("DmZl_ChangeAnim",),
0x80A3822C:("DmZl_Init",),
0x80A382EC:("DmZl_Destroy",),
0x80A382FC:("DmZl_DoNothing",),
0x80A3830C:("DmZl_UpdateCutscene",),
0x80A3830C:("DmZl_HandleCutscene",),
0x80A38468:("DmZl_UpdateFace",),
0x80A385D4:("DmZl_Update",),
0x80A3862C:("DmZl_OverrideLimbDraw",),
@ -11497,7 +11497,7 @@
0x80AA1AF8:("DmStk_ClockTower_AdjustHeightAndRotation",),
0x80AA1B9C:("DmStk_ClockTower_DeflectHit",),
0x80AA1C64:("DmStk_ClockTower_WaitForDeflectionToEnd",),
0x80AA1D1C:("DmStk_UpdateCutscenes",),
0x80AA1D1C:("DmStk_HandleCutscene",),
0x80AA26CC:("DmStk_UpdateCollision",),
0x80AA2720:("DmStk_ClockTower_IdleWithOcarina",),
0x80AA27EC:("DmStk_ClockTower_Idle",),
@ -11506,7 +11506,7 @@
0x80AA2BC0:("DmStk_PostLimbDraw2",),
0x80AA33A4:("DmStk_PostLimbDraw",),
0x80AA33CC:("DmStk_Draw",),
0x80AA5580:("func_80AA5580",),
0x80AA5580:("DmChar00_ChangeAnim",),
0x80AA561C:("func_80AA561C",),
0x80AA5720:("func_80AA5720",),
0x80AA575C:("func_80AA575C",),
@ -11526,7 +11526,7 @@
0x80AA5EBC:("func_80AA5EBC",),
0x80AA6178:("DmChar00_Init",),
0x80AA62EC:("DmChar00_Destroy",),
0x80AA62FC:("func_80AA62FC",),
0x80AA62FC:("DmChar00_HandleCutscene",),
0x80AA67F8:("func_80AA67F8",),
0x80AA695C:("func_80AA695C",),
0x80AA6A04:("DmChar00_Update",),
@ -11552,7 +11552,7 @@
0x80AAAF2C:("DmChar02_PlaySfxForCutscenes",),
0x80AAAF78:("DmChar02_Init",),
0x80AAB03C:("DmChar02_Destroy",),
0x80AAB04C:("DmChar02_PerformCutsceneActions",),
0x80AAB04C:("DmChar02_HandleCutscene",),
0x80AAB19C:("DmChar02_Update",),
0x80AAB23C:("DmChar02_OverrideLimbDraw",),
0x80AAB258:("DmChar02_PostLimbDraw",),
@ -11575,11 +11575,11 @@
0x80AABC40:("DmChar04_ChangeAnim",),
0x80AABCDC:("DmChar04_Init",),
0x80AABE24:("DmChar04_Destroy",),
0x80AABE34:("func_80AABE34",),
0x80AABE34:("DmChar04_HandleCutscene",),
0x80AABF28:("DmChar04_Update",),
0x80AABF74:("DmChar04_OverrideLimbDraw",),
0x80AAC03C:("DmChar04_Draw",),
0x80AAC5A0:("func_80AAC5A0",),
0x80AAC5A0:("DmChar05_ChangeAnim",),
0x80AAC63C:("func_80AAC63C",),
0x80AAC6E4:("func_80AAC6E4",),
0x80AAC770:("func_80AAC770",),
@ -11620,7 +11620,7 @@
0x80AAE680:("DmChar06_SetupAction",),
0x80AAE68C:("DmChar06_Init",),
0x80AAE6E0:("DmChar06_Destroy",),
0x80AAE6F0:("func_80AAE6F0",),
0x80AAE6F0:("DmChar06_HandleCutscene",),
0x80AAE854:("DmChar06_Update",),
0x80AAE878:("DmChar06_Draw",),
0x80AAE9C0:("DmChar07_SetupAction",),
@ -11645,8 +11645,8 @@
0x80AAFBA4:("DmChar08_SpawnBubbles",),
0x80AAFCCC:("func_80AAFCCC",),
0x80AAFE78:("DmChar08_DoNothing",),
0x80AAFE88:("func_80AAFE88",),
0x80AB01E8:("func_80AB01E8",),
0x80AAFE88:("DmChar08_HandleCutscene",),
0x80AB01E8:("DmChar08_UpdateAnim",),
0x80AB023C:("func_80AB023C",),
0x80AB032C:("func_80AB032C",),
0x80AB096C:("func_80AB096C",),
@ -11662,7 +11662,7 @@
0x80AB1FA0:("func_80AB1FA0",),
0x80AB1FDC:("func_80AB1FDC",),
0x80AB2258:("DmChar09_DoNothing",),
0x80AB2268:("func_80AB2268",),
0x80AB2268:("DmChar09_HandleCutscene",),
0x80AB24BC:("func_80AB24BC",),
0x80AB2544:("DmChar09_Update",),
0x80AB25D8:("DmChar09_OverrideLimbDraw",),
@ -16931,7 +16931,7 @@
0x80C1BAC8:("EnFall2_Update",),
0x80C1BAEC:("EnFall2_Draw",),
0x80C1BD90:("DmAl_ChangeAnim",),
0x80C1BDD8:("func_80C1BDD8",),
0x80C1BDD8:("DmAl_HandleCutscene",),
0x80C1BF08:("DmAl_Init",),
0x80C1BFB8:("DmAl_Destroy",),
0x80C1BFC8:("DmAl_Update",),
@ -16939,36 +16939,36 @@
0x80C1C064:("DmAl_PostLimbDraw",),
0x80C1C11C:("DmAl_TransformLimbDraw",),
0x80C1C130:("DmAl_Draw",),
0x80C1C410:("func_80C1C410",),
0x80C1C4D8:("func_80C1C4D8",),
0x80C1C410:("DmAn_UpdateSkelAnime",),
0x80C1C4D8:("DmAn_ChangeAnim",),
0x80C1C5B4:("func_80C1C5B4",),
0x80C1C62C:("func_80C1C62C",),
0x80C1C83C:("func_80C1C83C",),
0x80C1C8E8:("func_80C1C8E8",),
0x80C1C958:("func_80C1C958",),
0x80C1CAB0:("func_80C1CAB0",),
0x80C1CC80:("func_80C1CC80",),
0x80C1CAB0:("DmAn_HandleCutscene",),
0x80C1CC80:("DmAn_DoNothing",),
0x80C1CC90:("DmAn_Init",),
0x80C1CCE4:("DmAn_Destroy",),
0x80C1CCF4:("DmAn_Update",),
0x80C1CD80:("func_80C1CD80",),
0x80C1CEFC:("func_80C1CEFC",),
0x80C1D0B0:("func_80C1D0B0",),
0x80C1D410:("func_80C1D410",),
0x80C1D410:("DmAh_ChangeAnim",),
0x80C1D458:("func_80C1D458",),
0x80C1D4D0:("func_80C1D4D0",),
0x80C1D6E0:("func_80C1D6E0",),
0x80C1D78C:("func_80C1D78C",),
0x80C1D7FC:("func_80C1D7FC",),
0x80C1D92C:("func_80C1D92C",),
0x80C1D7FC:("DmAh_HandleCutscene",),
0x80C1D92C:("DmAh_DoNothing",),
0x80C1D93C:("DmAh_Init",),
0x80C1DA48:("DmAh_Destroy",),
0x80C1DA58:("DmAh_Update",),
0x80C1DAD4:("DmAh_PostLimbDraw",),
0x80C1DB24:("DmAh_TransformLimbDraw",),
0x80C1DCD8:("DmAh_Draw",),
0x80C1DED0:("func_80C1DED0",),
0x80C1DF18:("func_80C1DF18",),
0x80C1DED0:("DmNb_ChangeAnim",),
0x80C1DF18:("DmNb_HandleCutscene",),
0x80C1E048:("DmNb_Init",),
0x80C1E0F8:("DmNb_Destroy",),
0x80C1E108:("DmNb_Update",),
@ -16992,7 +16992,7 @@
0x80C1EAB4:("DmBal_Destroy",),
0x80C1EAC4:("DmBal_SetupDoNothing",),
0x80C1EAD8:("DmBal_DoNothing",),
0x80C1EAE8:("func_80C1EAE8",),
0x80C1EAE8:("DmBal_HandleCutscene",),
0x80C1EC60:("func_80C1EC60",),
0x80C1ED0C:("DmBal_UpdateEyes",),
0x80C1ED64:("DmBal_SpawnPaper",),
@ -17057,7 +17057,7 @@
0x80C22880:("func_80C22880",),
0x80C2291C:("func_80C2291C",),
0x80C229AC:("func_80C229AC",),
0x80C229EC:("func_80C229EC",),
0x80C229EC:("DmTag_DoNothing",),
0x80C229FC:("func_80C229FC",),
0x80C22A40:("DmTag_Init",),
0x80C22B30:("DmTag_Destroy",),
@ -17100,15 +17100,15 @@
0x80C23E44:("EnEndingHero6_Update",),
0x80C23F14:("func_80C23F14",),
0x80C23F6C:("EnEndingHero6_Draw",),
0x80C24360:("func_80C24360",),
0x80C24428:("func_80C24428",),
0x80C24360:("DmGm_UpdateSkelAnime",),
0x80C24428:("DmGm_ChangeAnim",),
0x80C24504:("func_80C24504",),
0x80C2457C:("func_80C2457C",),
0x80C2478C:("func_80C2478C",),
0x80C24838:("func_80C24838",),
0x80C248A8:("func_80C248A8",),
0x80C24A00:("func_80C24A00",),
0x80C24BD0:("func_80C24BD0",),
0x80C24A00:("DmGm_HandleCutscene",),
0x80C24BD0:("DmGm_DoNothing",),
0x80C24BE0:("DmGm_Init",),
0x80C24C34:("DmGm_Destroy",),
0x80C24C44:("DmGm_Update",),