diff --git a/assets/xml/objects/object_tr.xml b/assets/xml/objects/object_tr.xml
index e84d0896dc..986a88cc5c 100644
--- a/assets/xml/objects/object_tr.xml
+++ b/assets/xml/objects/object_tr.xml
@@ -1,149 +1,166 @@
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_tw.xml b/assets/xml/objects/object_tw.xml
index ac05ccd0aa..b48c974872 100644
--- a/assets/xml/objects/object_tw.xml
+++ b/assets/xml/objects/object_tw.xml
@@ -1,144 +1,156 @@
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
-
-
-
+
+
+
-
-
+
+
-
+
-
-
-
-
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -229,34 +241,35 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/overlays/actors/ovl_Boss_Tw/z_boss_tw.c b/src/overlays/actors/ovl_Boss_Tw/z_boss_tw.c
index 05377207cf..5ca4737e3a 100644
--- a/src/overlays/actors/ovl_Boss_Tw/z_boss_tw.c
+++ b/src/overlays/actors/ovl_Boss_Tw/z_boss_tw.c
@@ -511,7 +511,7 @@ void BossTw_Init(Actor* thisx, PlayState* play2) {
if (this->actor.params == TW_KOTAKE) {
Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInitKoumeKotake);
this->actor.naviEnemyId = NAVI_ENEMY_TWINROVA_KOTAKE;
- SkelAnime_InitFlex(play, &this->skelAnime, &object_tw_Skel_0070E0, &object_tw_Anim_006F28, NULL, NULL, 0);
+ SkelAnime_InitFlex(play, &this->skelAnime, &gTwinrovaKotakeSkel, &gTwinrovaKotakeKoumeFlyAnim, NULL, NULL, 0);
if (GET_EVENTCHKINF(EVENTCHKINF_75)) {
// began twinrova battle
@@ -524,12 +524,12 @@ void BossTw_Init(Actor* thisx, PlayState* play2) {
BossTw_SetupCSWait(this, play);
}
- Animation_MorphToLoop(&this->skelAnime, &object_tw_Anim_006F28, -3.0f);
+ Animation_MorphToLoop(&this->skelAnime, &gTwinrovaKotakeKoumeFlyAnim, -3.0f);
this->visible = true;
} else if (this->actor.params == TW_KOUME) {
Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInitKoumeKotake);
this->actor.naviEnemyId = NAVI_ENEMY_TWINROVA_KOUME;
- SkelAnime_InitFlex(play, &this->skelAnime, &object_tw_Skel_01F888, &object_tw_Anim_006F28, NULL, NULL, 0);
+ SkelAnime_InitFlex(play, &this->skelAnime, &gTwinrovaKoumeSkel, &gTwinrovaKotakeKoumeFlyAnim, NULL, NULL, 0);
if (GET_EVENTCHKINF(EVENTCHKINF_75)) {
// began twinrova battle
@@ -541,7 +541,7 @@ void BossTw_Init(Actor* thisx, PlayState* play2) {
BossTw_SetupCSWait(this, play);
}
- Animation_MorphToLoop(&this->skelAnime, &object_tw_Anim_006F28, -3.0f);
+ Animation_MorphToLoop(&this->skelAnime, &gTwinrovaKotakeKoumeFlyAnim, -3.0f);
this->visible = true;
} else {
// Twinrova
@@ -649,7 +649,7 @@ void BossTw_SetupFlyTo(BossTw* this, PlayState* play) {
this->actor.flags |= ACTOR_FLAG_0;
this->actionFunc = BossTw_FlyTo;
this->rotateSpeed = 0.0f;
- Animation_MorphToLoop(&this->skelAnime, &object_tw_Anim_006F28, -10.0f);
+ Animation_MorphToLoop(&this->skelAnime, &gTwinrovaKotakeKoumeFlyAnim, -10.0f);
if ((Rand_ZeroOne() < 0.5f) && (otherTw != NULL && otherTw->actionFunc == BossTw_ShootBeam)) {
// Other Sister is shooting a beam, go near them.
this->targetPos.x = otherTw->actor.world.pos.x + Rand_CenteredFloat(200.0f);
@@ -710,8 +710,8 @@ void BossTw_SetupShootBeam(BossTw* this, PlayState* play) {
Player* player = GET_PLAYER(play);
this->actionFunc = BossTw_ShootBeam;
- Animation_MorphToPlayOnce(&this->skelAnime, &object_tw_Anim_007688, -5.0f);
- this->workf[ANIM_SW_TGT] = Animation_GetLastFrame(&object_tw_Anim_007688);
+ Animation_MorphToPlayOnce(&this->skelAnime, &gTwinrovaKotakeKoumeChargeUpAttackStartAnim, -5.0f);
+ this->workf[ANIM_SW_TGT] = Animation_GetLastFrame(&gTwinrovaKotakeKoumeChargeUpAttackStartAnim);
this->timers[1] = 70;
this->targetPos = player->actor.world.pos;
this->csState1 = 0;
@@ -1051,13 +1051,13 @@ void BossTw_ShootBeam(BossTw* this, PlayState* play) {
}
if (Animation_OnFrame(&this->skelAnime, this->workf[ANIM_SW_TGT])) {
- Animation_MorphToLoop(&this->skelAnime, &object_tw_Anim_009398, 0.0f);
+ Animation_MorphToLoop(&this->skelAnime, &gTwinrovaKotakeKoumeChargeUpAttackLoopAnim, 0.0f);
this->workf[ANIM_SW_TGT] = 10000.0f;
}
if (this->timers[1] == 1) {
- Animation_MorphToPlayOnce(&this->skelAnime, &object_tw_Anim_003614, 0.0f);
- this->workf[ANIM_SW_TGT] = Animation_GetLastFrame(&object_tw_Anim_003614);
+ Animation_MorphToPlayOnce(&this->skelAnime, &gTwinrovaKotakeKoumeAttackStartAnim, 0.0f);
+ this->workf[ANIM_SW_TGT] = Animation_GetLastFrame(&gTwinrovaKotakeKoumeAttackStartAnim);
this->unk_4DC = 0.0f;
this->spawnPortalAlpha = 0.0f;
this->flameAlpha = 0.0f;
@@ -1065,7 +1065,7 @@ void BossTw_ShootBeam(BossTw* this, PlayState* play) {
}
} else {
if (Animation_OnFrame(&this->skelAnime, this->workf[ANIM_SW_TGT])) {
- Animation_MorphToLoop(&this->skelAnime, &object_tw_Anim_003E34, 0.0f);
+ Animation_MorphToLoop(&this->skelAnime, &gTwinrovaKotakeKoumeAttackLoopAnim, 0.0f);
this->workf[ANIM_SW_TGT] = 10000.0f;
}
@@ -1319,8 +1319,8 @@ void BossTw_ShootBeam(BossTw* this, PlayState* play) {
void BossTw_SetupFinishBeamShoot(BossTw* this, PlayState* play) {
this->actionFunc = BossTw_FinishBeamShoot;
- Animation_MorphToPlayOnce(&this->skelAnime, &object_tw_Anim_004548, 0.0f);
- this->workf[ANIM_SW_TGT] = Animation_GetLastFrame(&object_tw_Anim_004548);
+ Animation_MorphToPlayOnce(&this->skelAnime, &gTwinrovaKotakeKoumeAttackEndAnim, 0.0f);
+ this->workf[ANIM_SW_TGT] = Animation_GetLastFrame(&gTwinrovaKotakeKoumeAttackEndAnim);
}
void BossTw_FinishBeamShoot(BossTw* this, PlayState* play) {
@@ -1340,7 +1340,7 @@ void BossTw_FinishBeamShoot(BossTw* this, PlayState* play) {
void BossTw_SetupHitByBeam(BossTw* this, PlayState* play) {
this->actionFunc = BossTw_HitByBeam;
- Animation_MorphToPlayOnce(&this->skelAnime, &object_tw_Anim_00578C, 0.0f);
+ Animation_MorphToPlayOnce(&this->skelAnime, &gTwinrovaKotakeKoumeDamageStartAnim, 0.0f);
this->timers[0] = 53;
this->actor.speedXZ = 0.0f;
@@ -1394,8 +1394,8 @@ void BossTw_HitByBeam(BossTw* this, PlayState* play) {
}
if (this->timers[0] == 1) {
- Animation_MorphToPlayOnce(&this->skelAnime, &object_tw_Anim_006530, 0.0f);
- this->workf[ANIM_SW_TGT] = Animation_GetLastFrame(&object_tw_Anim_006530);
+ Animation_MorphToPlayOnce(&this->skelAnime, &gTwinrovaKotakeKoumeDamageEndAnim, 0.0f);
+ this->workf[ANIM_SW_TGT] = Animation_GetLastFrame(&gTwinrovaKotakeKoumeDamageEndAnim);
}
if ((this->timers[0] == 0) && Animation_OnFrame(&this->skelAnime, this->workf[ANIM_SW_TGT])) {
@@ -1405,8 +1405,8 @@ void BossTw_HitByBeam(BossTw* this, PlayState* play) {
void BossTw_SetupLaugh(BossTw* this, PlayState* play) {
this->actionFunc = BossTw_Laugh;
- Animation_MorphToPlayOnce(&this->skelAnime, &object_tw_Anim_0088C8, 0.0f);
- this->workf[ANIM_SW_TGT] = Animation_GetLastFrame(&object_tw_Anim_0088C8);
+ Animation_MorphToPlayOnce(&this->skelAnime, &gTwinrovaKotakeKoumeLaughAnim, 0.0f);
+ this->workf[ANIM_SW_TGT] = Animation_GetLastFrame(&gTwinrovaKotakeKoumeLaughAnim);
this->actor.speedXZ = 0.0f;
}
@@ -1428,8 +1428,8 @@ void BossTw_Laugh(BossTw* this, PlayState* play) {
void BossTw_SetupSpin(BossTw* this, PlayState* play) {
this->actionFunc = BossTw_Spin;
- Animation_MorphToPlayOnce(&this->skelAnime, &object_tw_Anim_007CA8, -3.0f);
- this->workf[ANIM_SW_TGT] = Animation_GetLastFrame(&object_tw_Anim_007CA8);
+ Animation_MorphToPlayOnce(&this->skelAnime, &gTwinrovaKotakeKoumeSpinAnim, -3.0f);
+ this->workf[ANIM_SW_TGT] = Animation_GetLastFrame(&gTwinrovaKotakeKoumeSpinAnim);
this->actor.speedXZ = 0.0f;
SkelAnime_Update(&this->skelAnime);
this->timers[0] = 20;
@@ -1457,7 +1457,7 @@ void BossTw_SetupMergeCS(BossTw* this, PlayState* play) {
this->actionFunc = BossTw_MergeCS;
this->rotateSpeed = 0.0f;
this->actor.speedXZ = 0.0f;
- Animation_MorphToLoop(&this->skelAnime, &object_tw_Anim_006F28, -10.0f);
+ Animation_MorphToLoop(&this->skelAnime, &gTwinrovaKotakeKoumeFlyAnim, -10.0f);
}
void BossTw_MergeCS(BossTw* this, PlayState* play) {
@@ -1726,7 +1726,7 @@ void BossTw_TwinrovaMergeCS(BossTw* this, PlayState* play) {
void BossTw_SetupDeathCS(BossTw* this, PlayState* play) {
this->actionFunc = BossTw_DeathCS;
- Animation_MorphToLoop(&this->skelAnime, &object_tw_Anim_0004A4, -3.0f);
+ Animation_MorphToLoop(&this->skelAnime, &gTwinrovaKotakeKoumeIdleLoopAnim, -3.0f);
this->unk_5F8 = 0;
this->work[CS_TIMER_2] = Rand_ZeroFloat(20.0f);
}
@@ -1852,7 +1852,7 @@ void BossTw_TwinrovaIntroCS(BossTw* this, PlayState* play) {
if (this->work[CS_TIMER_1] >= 236) {
this->csState2 = 2;
sKoumePtr->visible = 1;
- Animation_MorphToLoop(&sKoumePtr->skelAnime, &object_tw_Anim_0004A4, 0.0f);
+ Animation_MorphToLoop(&sKoumePtr->skelAnime, &gTwinrovaKotakeKoumeIdleLoopAnim, 0.0f);
sKoumePtr->actor.world.pos.x = 0.0f;
sKoumePtr->actor.world.pos.y = 80.0f;
sKoumePtr->actor.world.pos.z = 600.0f;
@@ -1932,8 +1932,8 @@ void BossTw_TwinrovaIntroCS(BossTw* this, PlayState* play) {
this->subCamAtVel.z = fabsf(this->subCamAtNext.z - this->subCamAt.z);
this->subCamUpdateRate = 0.0f;
this->subCamDistStep = 0.05f;
- Animation_MorphToPlayOnce(&sKoumePtr->skelAnime, &object_tw_Anim_000AAC, 0.0f);
- this->workf[ANIM_SW_TGT] = Animation_GetLastFrame(&object_tw_Anim_000AAC);
+ Animation_MorphToPlayOnce(&sKoumePtr->skelAnime, &gTwinrovaKotakeKoumeIdleEndAnim, 0.0f);
+ this->workf[ANIM_SW_TGT] = Animation_GetLastFrame(&gTwinrovaKotakeKoumeIdleEndAnim);
this->work[CS_TIMER_1] = 0;
}
break;
@@ -1980,8 +1980,8 @@ void BossTw_TwinrovaIntroCS(BossTw* this, PlayState* play) {
1.0f, 0.005f);
} else {
if (this->work[CS_TIMER_1] == 50) {
- Animation_MorphToPlayOnce(&sKoumePtr->skelAnime, &object_tw_Anim_0088C8, -5);
- this->workf[ANIM_SW_TGT] = Animation_GetLastFrame(&object_tw_Anim_0088C8);
+ Animation_MorphToPlayOnce(&sKoumePtr->skelAnime, &gTwinrovaKotakeKoumeLaughAnim, -5);
+ this->workf[ANIM_SW_TGT] = Animation_GetLastFrame(&gTwinrovaKotakeKoumeLaughAnim);
}
if (this->work[CS_TIMER_1] == 60) {
@@ -1989,7 +1989,7 @@ void BossTw_TwinrovaIntroCS(BossTw* this, PlayState* play) {
}
if (Animation_OnFrame(&sKoumePtr->skelAnime, this->workf[ANIM_SW_TGT])) {
- Animation_MorphToLoop(&sKoumePtr->skelAnime, &object_tw_Anim_006F28, 0.f);
+ Animation_MorphToLoop(&sKoumePtr->skelAnime, &gTwinrovaKotakeKoumeFlyAnim, 0.f);
this->workf[ANIM_SW_TGT] = 1000.0f;
}
@@ -2005,7 +2005,7 @@ void BossTw_TwinrovaIntroCS(BossTw* this, PlayState* play) {
this->work[CS_TIMER_1] = 0;
this->subCamYawStep = 0.0f;
sKotakePtr->visible = 1;
- Animation_MorphToLoop(&sKotakePtr->skelAnime, &object_tw_Anim_0004A4, 0.0f);
+ Animation_MorphToLoop(&sKotakePtr->skelAnime, &gTwinrovaKotakeKoumeIdleLoopAnim, 0.0f);
sKotakePtr->actor.world.pos.x = 0.0f;
sKotakePtr->actor.world.pos.y = 80.0f;
sKotakePtr->actor.world.pos.z = -600.0f;
@@ -2033,7 +2033,7 @@ void BossTw_TwinrovaIntroCS(BossTw* this, PlayState* play) {
Math_ApproachF(&this->subCamYawStep, 12288.0f, 1.0f, 384.0f);
if (Animation_OnFrame(&sKoumePtr->skelAnime, this->workf[ANIM_SW_TGT])) {
- Animation_MorphToLoop(&sKoumePtr->skelAnime, &object_tw_Anim_006F28, 0.0f);
+ Animation_MorphToLoop(&sKoumePtr->skelAnime, &gTwinrovaKotakeKoumeFlyAnim, 0.0f);
this->workf[ANIM_SW_TGT] = 1000.0f;
}
}
@@ -2095,8 +2095,8 @@ void BossTw_TwinrovaIntroCS(BossTw* this, PlayState* play) {
this->subCamAtVel.z = fabsf(this->subCamAtNext.z - this->subCamAt.z);
this->subCamUpdateRate = 0;
this->subCamDistStep = 0.05f;
- Animation_MorphToPlayOnce(&sKotakePtr->skelAnime, &object_tw_Anim_000AAC, 0);
- this->workf[ANIM_SW_TGT] = Animation_GetLastFrame(&object_tw_Anim_000AAC);
+ Animation_MorphToPlayOnce(&sKotakePtr->skelAnime, &gTwinrovaKotakeKoumeIdleEndAnim, 0);
+ this->workf[ANIM_SW_TGT] = Animation_GetLastFrame(&gTwinrovaKotakeKoumeIdleEndAnim);
this->work[CS_TIMER_1] = 0;
}
break;
@@ -2141,8 +2141,8 @@ void BossTw_TwinrovaIntroCS(BossTw* this, PlayState* play) {
1.0f, 0.005f);
} else {
if (this->work[CS_TIMER_1] == 50) {
- Animation_MorphToPlayOnce(&sKotakePtr->skelAnime, &object_tw_Anim_0088C8, -5.0f);
- this->workf[ANIM_SW_TGT] = Animation_GetLastFrame(&object_tw_Anim_0088C8);
+ Animation_MorphToPlayOnce(&sKotakePtr->skelAnime, &gTwinrovaKotakeKoumeLaughAnim, -5.0f);
+ this->workf[ANIM_SW_TGT] = Animation_GetLastFrame(&gTwinrovaKotakeKoumeLaughAnim);
}
if (this->work[CS_TIMER_1] == 60) {
@@ -2150,7 +2150,7 @@ void BossTw_TwinrovaIntroCS(BossTw* this, PlayState* play) {
}
if (Animation_OnFrame(&sKotakePtr->skelAnime, this->workf[ANIM_SW_TGT])) {
- Animation_MorphToLoop(&sKotakePtr->skelAnime, &object_tw_Anim_006F28, 0.0f);
+ Animation_MorphToLoop(&sKotakePtr->skelAnime, &gTwinrovaKotakeKoumeFlyAnim, 0.0f);
this->workf[ANIM_SW_TGT] = 1000.0f;
}
@@ -2193,7 +2193,7 @@ void BossTw_TwinrovaIntroCS(BossTw* this, PlayState* play) {
Math_ApproachF(&this->subCamYawStep, 12288.0f, 1.0f, 384.0f);
if (Animation_OnFrame(&sKotakePtr->skelAnime, this->workf[ANIM_SW_TGT])) {
- Animation_MorphToLoop(&sKotakePtr->skelAnime, &object_tw_Anim_006F28, 0.0f);
+ Animation_MorphToLoop(&sKotakePtr->skelAnime, &gTwinrovaKotakeKoumeFlyAnim, 0.0f);
this->workf[ANIM_SW_TGT] = 1000.0f;
}
}
@@ -2544,31 +2544,31 @@ void BossTw_DeathCSMsgSfx(BossTw* this, PlayState* play) {
switch (kotakeAnim) {
case 1:
- Animation_MorphToLoop(&sKotakePtr->skelAnime, &object_tw_Anim_00230C, -5.0f);
+ Animation_MorphToLoop(&sKotakePtr->skelAnime, &gTwinrovaKotakeKoumeShakeHandAnim, -5.0f);
break;
case 2:
- Animation_MorphToLoop(&sKotakePtr->skelAnime, &object_tw_Anim_001D10, -5.0f);
+ Animation_MorphToLoop(&sKotakePtr->skelAnime, &gTwinrovaKotakeKoumeFloatLookForwardAnim, -5.0f);
break;
case 3:
- Animation_MorphToLoop(&sKotakePtr->skelAnime, &object_tw_Anim_0017E0, -5.0f);
+ Animation_MorphToLoop(&sKotakePtr->skelAnime, &gTwinrovaKotakeKoumeFloatLookUpAnim, -5.0f);
break;
case 4:
- Animation_MorphToLoop(&sKotakePtr->skelAnime, &object_tw_Anim_0012A4, -5.0f);
+ Animation_MorphToLoop(&sKotakePtr->skelAnime, &gTwinrovaKotakeKoumeBickerAnim, -5.0f);
break;
}
switch (koumeAnim) {
case 1:
- Animation_MorphToLoop(&sKoumePtr->skelAnime, &object_tw_Anim_00230C, -5.0f);
+ Animation_MorphToLoop(&sKoumePtr->skelAnime, &gTwinrovaKotakeKoumeShakeHandAnim, -5.0f);
break;
case 2:
- Animation_MorphToLoop(&sKoumePtr->skelAnime, &object_tw_Anim_001D10, -5.0f);
+ Animation_MorphToLoop(&sKoumePtr->skelAnime, &gTwinrovaKotakeKoumeFloatLookForwardAnim, -5.0f);
break;
case 3:
- Animation_MorphToLoop(&sKoumePtr->skelAnime, &object_tw_Anim_0017E0, -5.0f);
+ Animation_MorphToLoop(&sKoumePtr->skelAnime, &gTwinrovaKotakeKoumeFloatLookUpAnim, -5.0f);
break;
case 4:
- Animation_MorphToLoop(&sKoumePtr->skelAnime, &object_tw_Anim_0012A4, -5.0f);
+ Animation_MorphToLoop(&sKoumePtr->skelAnime, &gTwinrovaKotakeKoumeBickerAnim, -5.0f);
break;
}
@@ -3178,24 +3178,24 @@ void BossTw_TwinrovaUpdate(Actor* thisx, PlayState* play2) {
s32 BossTw_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, void* thisx) {
BossTw* this = (BossTw*)thisx;
- if (limbIndex == 21) {
+ if (limbIndex == TWINROVA_KOTAKE_KOUME_LIMB_HEAD) {
if (this->unk_5F8 == 0) {
if (this->actor.params == TW_KOTAKE) {
- *dList = object_tw_DL_012CE0;
+ *dList = gTwinrovaKotakeHeadDL;
} else {
- *dList = object_tw_DL_0134B8;
+ *dList = gTwinrovaKoumeHeadDL;
}
}
}
- if (limbIndex == 14) {
+ if (limbIndex == TWINROVA_KOTAKE_KOUME_LIMB_BROOM) {
if (this->actionFunc == BossTw_DeathCS) {
*dList = NULL;
} else if (this->scepterAlpha == 0.0f) {
if (this->actor.params == TW_KOTAKE) {
- *dList = object_tw_DL_012B38;
+ *dList = gTwinrovaKotakeBroomDL;
} else {
- *dList = object_tw_DL_013310;
+ *dList = gTwinrovaKoumeBroomDL;
}
}
}
@@ -3215,7 +3215,7 @@ void BossTw_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot
OPEN_DISPS(play->state.gfxCtx, "../z_boss_tw.c", 6168);
switch (limbIndex) {
- case 21:
+ case TWINROVA_KOTAKE_KOUME_LIMB_HEAD:
Matrix_MultVec3f(&D_8094A944, &this->actor.focus.pos);
Matrix_MultVec3f(&D_8094A950, &this->crownPos);
@@ -3223,13 +3223,14 @@ void BossTw_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, "../z_boss_tw.c", 6190),
G_MTX_LOAD | G_MTX_MODELVIEW | G_MTX_NOPUSH);
if (this->actor.params == TW_KOTAKE) {
- gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(object_tw_DL_013AE8));
+ gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(gTwinrovaKotakeIceHairDL));
} else {
- gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(object_tw_DL_013D68));
+ gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(gTwinrovaKoumeFireHairDL));
}
}
break;
- case 14:
+
+ case TWINROVA_KOTAKE_KOUME_LIMB_BROOM:
Matrix_MultVec3f(&D_8094A95C[0], &this->scepterFlamePos[0]);
Matrix_MultVec3f(&D_8094A95C[1], &this->scepterFlamePos[1]);
Matrix_MultVec3f(&D_8094A95C[2], &this->scepterFlamePos[2]);
@@ -3241,14 +3242,14 @@ void BossTw_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot
G_MTX_LOAD | G_MTX_MODELVIEW | G_MTX_NOPUSH);
if (this->actor.params == TW_KOTAKE) {
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 225, 255, (s16)this->scepterAlpha);
- gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(object_tw_DL_013E98));
+ gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(gTwinrovaKotakeIceBroomHeadDL));
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 195, 225, 235, (s16)this->scepterAlpha);
- gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(object_tw_DL_013F98));
+ gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(gTwinrovaKotakeIceBroomHeadOuterDL));
} else {
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 100, 20, 0, (s16)this->scepterAlpha);
- gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(object_tw_DL_014070));
+ gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(gTwinrovaKotakeFireBroomHeadDL));
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 70, 0, (s16)this->scepterAlpha);
- gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(object_tw_DL_014158));
+ gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(gTwinrovaKotakeFireBroomHeadOuterDL));
}
}
break;
@@ -3478,9 +3479,9 @@ void func_80943028(Actor* thisx, PlayState* play) {
}
static void* sEyeTextures[] = {
- object_tw_Tex_00A438,
- object_tw_Tex_00B238,
- object_tw_Tex_00B638,
+ gTwinrovaKotakeKoumeEyeOpenTex,
+ gTwinrovaKotakeKoumeEyeHalfTex,
+ gTwinrovaKotakeKoumeEyeClosedTex,
};
void BossTw_Draw(Actor* thisx, PlayState* play2) {
diff --git a/src/overlays/actors/ovl_Boss_Tw/z_boss_tw.h b/src/overlays/actors/ovl_Boss_Tw/z_boss_tw.h
index 9007ea93b4..14190e917c 100644
--- a/src/overlays/actors/ovl_Boss_Tw/z_boss_tw.h
+++ b/src/overlays/actors/ovl_Boss_Tw/z_boss_tw.h
@@ -55,6 +55,37 @@ typedef enum {
/* 26 */ FWORK_MAX
} TwFwork;
+typedef enum {
+ /* 0 */ TWINROVA_KOTAKE_KOUME_LIMB_NONE,
+ /* 1 */ TWINROVA_KOTAKE_KOUME_LIMB_PELVIS,
+ /* 2 */ TWINROVA_KOTAKE_KOUME_LIMB_LEFT_THIGH,
+ /* 3 */ TWINROVA_KOTAKE_KOUME_LIMB_LEFT_SHIN,
+ /* 4 */ TWINROVA_KOTAKE_KOUME_LIMB_LEFT_FOOT,
+ /* 5 */ TWINROVA_KOTAKE_KOUME_LIMB_RIGH_THIGH,
+ /* 6 */ TWINROVA_KOTAKE_KOUME_LIMB_RIGHT_SHIN,
+ /* 7 */ TWINROVA_KOTAKE_KOUME_LIMB_RIGHT_FOOT,
+ /* 8 */ TWINROVA_KOTAKE_KOUME_LIMB_TORSO_LIMB,
+ /* 9 */ TWINROVA_KOTAKE_KOUME_LIMB_LEFT_SLEEVE_START,
+ /* 10 */ TWINROVA_KOTAKE_KOUME_LIMB_LEFT_SLEEVE_MID,
+ /* 11 */ TWINROVA_KOTAKE_KOUME_LIMB_LEFT_SLEEVE_END,
+ /* 12 */ TWINROVA_KOTAKE_KOUME_LIMB_LEFT_SLEEVE_FRONT,
+ /* 13 */ TWINROVA_KOTAKE_KOUME_LIMB_LEFT_HAND,
+ /* 14 */ TWINROVA_KOTAKE_KOUME_LIMB_BROOM,
+ /* 15 */ TWINROVA_KOTAKE_KOUME_LIMB_RIGHT_SLEEVE_START,
+ /* 16 */ TWINROVA_KOTAKE_KOUME_LIMB_RIGHT_SLEEVE_MID,
+ /* 17 */ TWINROVA_KOTAKE_KOUME_LIMB_RIGHT_SLEEVE_END,
+ /* 18 */ TWINROVA_KOTAKE_KOUME_LIMB_RIGHT_SLEEVE_FRONT,
+ /* 19 */ TWINROVA_KOTAKE_KOUME_LIMB_RIGHT_HAND,
+ /* 20 */ TWINROVA_KOTAKE_KOUME_LIMB_NECK,
+ /* 21 */ TWINROVA_KOTAKE_KOUME_LIMB_HEAD,
+ /* 22 */ TWINROVA_KOTAKE_KOUME_LIMB_RIGHT_HAIR_PIECE_START,
+ /* 23 */ TWINROVA_KOTAKE_KOUME_LIMB_RIGHT_HAIR_PIECE_END,
+ /* 24 */ TWINROVA_KOTAKE_KOUME_LIMB_TEETH,
+ /* 25 */ TWINROVA_KOTAKE_KOUME_LIMB_LEFT_HAIR_PIECE_START,
+ /* 26 */ TWINROVA_KOTAKE_KOUME_LIMB_LEFT_HAIR_PIECE_END,
+ /* 27 */ TWINROVA_KOTAKE_KOUME_LIMB_MAX
+} TwinrovaKotakeKoumeLimb;
+
typedef enum {
/* 0 */ TWINROVA_LIMB_NONE,
/* 1 */ TWINROVA_LIMB_PELVIS,
diff --git a/src/overlays/actors/ovl_En_Tr/z_en_tr.c b/src/overlays/actors/ovl_En_Tr/z_en_tr.c
index cbda77d046..17bd2b523d 100644
--- a/src/overlays/actors/ovl_En_Tr/z_en_tr.c
+++ b/src/overlays/actors/ovl_En_Tr/z_en_tr.c
@@ -38,28 +38,28 @@ ActorInit En_Tr_InitVars = {
// The first elements of these animation arrays are for Koume, the second for Kotake
static AnimationHeader* unused[] = {
- &object_tr_Anim_003FC8,
- &object_tr_Anim_001CDC,
+ &gKotakeKoumeStandingBroomOverRightShoulderAnim,
+ &gKotakeKoumeStandingBroomOverLeftShoulderAnim,
};
static AnimationHeader* D_80B24368[] = {
- &object_tr_Anim_002BC4,
- &object_tr_Anim_000BFC,
+ &gKotakeKoumeLookOverLeftShoulderAnim,
+ &gKotakeKoumeLookOverRightShoulderAnim,
};
static AnimationHeader* D_80B24370[] = {
- &object_tr_Anim_0035CC,
- &object_tr_Anim_0013CC,
+ &gKotakeKoumeLookingOverLeftShoulderAnim,
+ &gKotakeKoumeLookingOverRightShoulderAnim,
};
static AnimationHeader* D_80B24378[] = {
- &object_tr_Anim_0049C8,
- &object_tr_Anim_0049C8,
+ &gKotakeKoumeFlyAnim,
+ &gKotakeKoumeFlyAnim,
};
static AnimationHeader* D_80B24380[] = {
- &object_tr_Anim_012E1C,
- &object_tr_Anim_012E1C,
+ &gKotakeKoumeCastMagicAnim,
+ &gKotakeKoumeCastMagicAnim,
};
static f32 D_80B24388[] = { 0.0f, 20.0f, -30.0f, 20.0f, -20.0f, -20.0f, 30.0f };
@@ -75,9 +75,9 @@ static Color_RGBA8 D_80B243C0[4] = {
};
static void* sEyeTextures[] = {
- object_tr_Tex_0086D8,
- object_tr_Tex_0094D8,
- object_tr_Tex_0098D8,
+ gKotakeKoumeEyeOpenTex,
+ gKotakeKoumeEyeHalfTex,
+ gKotakeKoumeEyeClosedTex,
};
void EnTr_SetupAction(EnTr* this, EnTrActionFunc actionFunc) {
@@ -95,18 +95,18 @@ void EnTr_Init(Actor* thisx, PlayState* play) {
switch (this->actor.params) {
case TR_KOUME:
- SkelAnime_InitFlex(play, &this->skelAnime, &object_tr_Skel_011688, &object_tr_Anim_003FC8, this->jointTable,
- this->morphTable, 27);
- Animation_PlayOnce(&this->skelAnime, &object_tr_Anim_003FC8);
+ SkelAnime_InitFlex(play, &this->skelAnime, &gKoumeSkel, &gKotakeKoumeStandingBroomOverRightShoulderAnim,
+ this->jointTable, this->morphTable, KOTAKE_KOUME_LIMB_MAX);
+ Animation_PlayOnce(&this->skelAnime, &gKotakeKoumeStandingBroomOverRightShoulderAnim);
this->animation = NULL;
EnTr_SetupAction(this, EnTr_ChooseAction1);
this->actionIndex = 3;
break;
case TR_KOTAKE:
- SkelAnime_InitFlex(play, &this->skelAnime, &object_tr_Skel_00C530, &object_tr_Anim_001CDC, this->jointTable,
- this->morphTable, 27);
- Animation_PlayOnce(&this->skelAnime, &object_tr_Anim_001CDC);
+ SkelAnime_InitFlex(play, &this->skelAnime, &gKotakeSkel, &gKotakeKoumeStandingBroomOverLeftShoulderAnim,
+ this->jointTable, this->morphTable, KOTAKE_KOUME_LIMB_MAX);
+ Animation_PlayOnce(&this->skelAnime, &gKotakeKoumeStandingBroomOverLeftShoulderAnim);
this->animation = NULL;
EnTr_SetupAction(this, EnTr_ChooseAction1);
this->actionIndex = 2;
@@ -301,7 +301,7 @@ void EnTr_WaitToReappear(EnTr* this, PlayState* play) {
this->timer = 34;
EnTr_SetStartPosRot(this, play, this->actionIndex);
EnTr_SetupAction(this, EnTr_Reappear);
- Animation_PlayLoop(&this->skelAnime, &object_tr_Anim_0049C8);
+ Animation_PlayLoop(&this->skelAnime, &gKotakeKoumeFlyAnim);
this->animation = NULL;
Actor_SetScale(&this->actor, 0.003f);
}
@@ -350,7 +350,7 @@ void EnTr_ChooseAction1(EnTr* this, PlayState* play) {
case 3:
EnTr_SetStartPosRot(this, play, this->actionIndex);
EnTr_SetupAction(this, EnTr_ChooseAction2);
- Animation_PlayLoop(&this->skelAnime, &object_tr_Anim_0049C8);
+ Animation_PlayLoop(&this->skelAnime, &gKotakeKoumeFlyAnim);
this->animation = NULL;
break;
@@ -361,7 +361,7 @@ void EnTr_ChooseAction1(EnTr* this, PlayState* play) {
case 7:
EnTr_SetupAction(this, EnTr_FlyKidnapCutscene);
- Animation_PlayLoop(&this->skelAnime, &object_tr_Anim_0049C8);
+ Animation_PlayLoop(&this->skelAnime, &gKotakeKoumeFlyAnim);
this->animation = NULL;
this->timer =
((this->actor.params != TR_KOUME) ? ((u8)frames * 0x400) + 0x8000 : (u8)frames * 0x400);
@@ -380,17 +380,18 @@ void EnTr_Update(Actor* thisx, PlayState* play) {
if (SkelAnime_Update(&this->skelAnime)) {
if (this->animation != NULL) {
- if ((this->animation == &object_tr_Anim_0035CC) || (this->animation == &object_tr_Anim_0013CC)) {
+ if ((this->animation == &gKotakeKoumeLookingOverLeftShoulderAnim) ||
+ (this->animation == &gKotakeKoumeLookingOverRightShoulderAnim)) {
if (this->actor.params != TR_KOUME) {
Audio_PlayActorSfx2(&this->actor, NA_SE_EN_TWINROBA_LAUGH2);
} else {
Audio_PlayActorSfx2(&this->actor, NA_SE_EN_TWINROBA_LAUGH);
}
Animation_PlayLoop(&this->skelAnime, this->animation);
- } else if (this->animation == &object_tr_Anim_0049C8) {
+ } else if (this->animation == &gKotakeKoumeFlyAnim) {
EnTr_SetupAction(this, EnTr_ChooseAction2);
- Animation_Change(&this->skelAnime, &object_tr_Anim_0049C8, 1.0f, 0.0f,
- Animation_GetLastFrame(&object_tr_Anim_0049C8), ANIMMODE_LOOP, -5.0f);
+ Animation_Change(&this->skelAnime, &gKotakeKoumeFlyAnim, 1.0f, 0.0f,
+ Animation_GetLastFrame(&gKotakeKoumeFlyAnim), ANIMMODE_LOOP, -5.0f);
} else {
Animation_PlayLoop(&this->skelAnime, this->animation);
}
@@ -416,7 +417,7 @@ s32 EnTr_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* po
EnTr* this = (EnTr*)thisx;
Actor* child = this->actor.child;
- if ((child != NULL) && (limbIndex == 19)) {
+ if ((child != NULL) && (limbIndex == KOTAKE_KOUME_LIMB_RIGHT_HAND)) {
Matrix_MultVec3f(&src, &dest);
dest.x -= (10.0f * Math_SinS(Camera_GetCamDirYaw(GET_ACTIVE_CAM(play))));
dest.z -= (10.0f * Math_CosS(Camera_GetCamDirYaw(GET_ACTIVE_CAM(play))));
diff --git a/src/overlays/actors/ovl_En_Tr/z_en_tr.h b/src/overlays/actors/ovl_En_Tr/z_en_tr.h
index 57dbf78ec5..656ab2f17e 100644
--- a/src/overlays/actors/ovl_En_Tr/z_en_tr.h
+++ b/src/overlays/actors/ovl_En_Tr/z_en_tr.h
@@ -8,11 +8,42 @@ struct EnTr;
typedef void (*EnTrActionFunc)(struct EnTr*, PlayState*);
+typedef enum {
+ /* 0 */ KOTAKE_KOUME_LIMB_NONE,
+ /* 1 */ KOTAKE_KOUME_LIMB_PELVIS,
+ /* 2 */ KOTAKE_KOUME_LIMB_LEFT_THIGH,
+ /* 3 */ KOTAKE_KOUME_LIMB_LEFT_SHIN,
+ /* 4 */ KOTAKE_KOUME_LIMB_LEFT_FOOT,
+ /* 5 */ KOTAKE_KOUME_LIMB_RIGH_THIGH,
+ /* 6 */ KOTAKE_KOUME_LIMB_RIGHT_SHIN,
+ /* 7 */ KOTAKE_KOUME_LIMB_RIGHT_FOOT,
+ /* 8 */ KOTAKE_KOUME_LIMB_TORSO_LIMB,
+ /* 9 */ KOTAKE_KOUME_LIMB_LEFT_SLEEVE_START,
+ /* 10 */ KOTAKE_KOUME_LIMB_LEFT_SLEEVE_MID,
+ /* 11 */ KOTAKE_KOUME_LIMB_LEFT_SLEEVE_END,
+ /* 12 */ KOTAKE_KOUME_LIMB_LEFT_SLEEVE_FRONT,
+ /* 13 */ KOTAKE_KOUME_LIMB_LEFT_HAND,
+ /* 14 */ KOTAKE_KOUME_LIMB_BROOM,
+ /* 15 */ KOTAKE_KOUME_LIMB_RIGHT_SLEEVE_START,
+ /* 16 */ KOTAKE_KOUME_LIMB_RIGHT_SLEEVE_MID,
+ /* 17 */ KOTAKE_KOUME_LIMB_RIGHT_SLEEVE_END,
+ /* 18 */ KOTAKE_KOUME_LIMB_RIGHT_SLEEVE_FRONT,
+ /* 19 */ KOTAKE_KOUME_LIMB_RIGHT_HAND,
+ /* 20 */ KOTAKE_KOUME_LIMB_NECK,
+ /* 21 */ KOTAKE_KOUME_LIMB_HEAD,
+ /* 22 */ KOTAKE_KOUME_LIMB_RIGHT_HAIR_PIECE_START,
+ /* 23 */ KOTAKE_KOUME_LIMB_RIGHT_HAIR_PIECE_END,
+ /* 24 */ KOTAKE_KOUME_LIMB_TEETH,
+ /* 25 */ KOTAKE_KOUME_LIMB_LEFT_HAIR_PIECE_START,
+ /* 26 */ KOTAKE_KOUME_LIMB_LEFT_HAIR_PIECE_END,
+ /* 27 */ KOTAKE_KOUME_LIMB_MAX
+} KotakeKoumeLimb;
+
typedef struct EnTr {
/* 0x0000 */ Actor actor;
/* 0x014C */ SkelAnime skelAnime;
- /* 0x0190 */ Vec3s jointTable[27];
- /* 0x0232 */ Vec3s morphTable[27];
+ /* 0x0190 */ Vec3s jointTable[KOTAKE_KOUME_LIMB_MAX];
+ /* 0x0232 */ Vec3s morphTable[KOTAKE_KOUME_LIMB_MAX];
/* 0x02D4 */ s16 unk_2D4;
/* 0x02D6 */ u16 timer; // Also used as an angle
/* 0x02D8 */ s16 actionIndex;