1
0
Fork 0
mirror of https://github.com/zeldaret/oot.git synced 2024-12-27 07:07:09 +00:00

Fully document object_goma (#872)

This commit is contained in:
Dragorn421 2021-08-11 19:17:00 +02:00 committed by GitHub
parent 70ec8c42fc
commit d95639b993
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 331 additions and 117 deletions

View file

@ -3,37 +3,160 @@
<!-- Skeleton --> <!-- Skeleton -->
<Skeleton Name="gGohmaSkel" Type="Normal" LimbType="Standard" Offset="0x1DCF8"/> <Skeleton Name="gGohmaSkel" Type="Normal" LimbType="Standard" Offset="0x1DCF8"/>
<!-- Limbs -->
<Limb Name="gGohmaRoot1Limb" LimbType="Standard" Offset="0x1D7A8"/>
<Limb Name="gGohmaRoot2Limb" LimbType="Standard" Offset="0x1D7B4"/>
<Limb Name="gGohmaBodyLimb" LimbType="Standard" Offset="0x1D7C0"/>
<Limb Name="gGohmaBodyShellLimb" LimbType="Standard" Offset="0x1D7CC"/>
<Limb Name="gGohmaEyeLimb" LimbType="Standard" Offset="0x1D7D8"/>
<Limb Name="gGohmaTailRootLimb" LimbType="Standard" Offset="0x1D7E4"/>
<Limb Name="gGohmaTail1RootLimb" LimbType="Standard" Offset="0x1D7F0"/>
<Limb Name="gGohmaTail2RootLimb" LimbType="Standard" Offset="0x1D7FC"/>
<Limb Name="gGohmaTail3RootLimb" LimbType="Standard" Offset="0x1D808"/>
<Limb Name="gGohmaTail4RootLimb" LimbType="Standard" Offset="0x1D814"/>
<Limb Name="gGohmaTail4Limb" LimbType="Standard" Offset="0x1D820"/>
<Limb Name="gGohmaTail3Limb" LimbType="Standard" Offset="0x1D82C"/>
<Limb Name="gGohmaTail2Limb" LimbType="Standard" Offset="0x1D838"/>
<Limb Name="gGohmaTail1Limb" LimbType="Standard" Offset="0x1D844"/>
<Limb Name="gGohmaRightLegRootLimb" LimbType="Standard" Offset="0x1D850"/>
<Limb Name="gGohmaRightThighRootLimb" LimbType="Standard" Offset="0x1D85C"/>
<Limb Name="gGohmaRightLegLowerRootLimb" LimbType="Standard" Offset="0x1D868"/>
<Limb Name="gGohmaRightFeetRootLimb" LimbType="Standard" Offset="0x1D874"/>
<Limb Name="gGohmaRightFeetBackRoot1Limb" LimbType="Standard" Offset="0x1D880"/>
<Limb Name="gGohmaRightFeetBackRoot2Limb" LimbType="Standard" Offset="0x1D88C"/>
<Limb Name="gGohmaRightFeetBackLimb" LimbType="Standard" Offset="0x1D898"/>
<Limb Name="gGohmaRightFeetLimb" LimbType="Standard" Offset="0x1D8A4"/>
<Limb Name="gGohmaRightShinLimb" LimbType="Standard" Offset="0x1D8B0"/>
<Limb Name="gGohmaRightKneeRoot1Limb" LimbType="Standard" Offset="0x1D8BC"/>
<Limb Name="gGohmaRightKneeRoot2Limb" LimbType="Standard" Offset="0x1D8C8"/>
<Limb Name="gGohmaRightKneeLimb" LimbType="Standard" Offset="0x1D8D4"/>
<Limb Name="gGohmaRightThighShellRoot1Limb" LimbType="Standard" Offset="0x1D8E0"/>
<Limb Name="gGohmaRightThighShellRoot2Limb" LimbType="Standard" Offset="0x1D8EC"/>
<Limb Name="gGohmaRightThighShellLimb" LimbType="Standard" Offset="0x1D8F8"/>
<Limb Name="gGohmaRightThighLimb" LimbType="Standard" Offset="0x1D904"/>
<Limb Name="gGohmaEyeLidBottomRoot1Limb" LimbType="Standard" Offset="0x1D910"/>
<Limb Name="gGohmaEyeLidBottomRoot2Limb" LimbType="Standard" Offset="0x1D91C"/>
<Limb Name="gGohmaEyeLidBottomLimb" LimbType="Standard" Offset="0x1D928"/>
<Limb Name="gGohmaEyeLidTopRoot1Limb" LimbType="Standard" Offset="0x1D934"/>
<Limb Name="gGohmaEyeLidTopRoot2Limb" LimbType="Standard" Offset="0x1D940"/>
<Limb Name="gGohmaEyeLidTopLimb" LimbType="Standard" Offset="0x1D94C"/>
<Limb Name="gGohmaIrisRoot1Limb" LimbType="Standard" Offset="0x1D958"/>
<Limb Name="gGohmaIrisRoot2Limb" LimbType="Standard" Offset="0x1D964"/>
<Limb Name="gGohmaIrisLimb" LimbType="Standard" Offset="0x1D970"/>
<Limb Name="gGohmaMandiblesRoot1Limb" LimbType="Standard" Offset="0x1D97C"/>
<Limb Name="gGohmaMandiblesRoot2Limb" LimbType="Standard" Offset="0x1D988"/>
<Limb Name="gGohmaMandiblesBodyLimb" LimbType="Standard" Offset="0x1D994"/>
<Limb Name="gGohmaLeftMandiblesRootLimb" LimbType="Standard" Offset="0x1D9A0"/>
<Limb Name="gGohmaLeftMandibles1RootLimb" LimbType="Standard" Offset="0x1D9AC"/>
<Limb Name="gGohmaLeftMandibles2RootLimb" LimbType="Standard" Offset="0x1D9B8"/>
<Limb Name="gGohmaLeftMandibles2Limb" LimbType="Standard" Offset="0x1D9C4"/>
<Limb Name="gGohmaLeftMandibles1Limb" LimbType="Standard" Offset="0x1D9D0"/>
<Limb Name="gGohmaRightMandiblesRootLimb" LimbType="Standard" Offset="0x1D9DC"/>
<Limb Name="gGohmaRightMandibles1RootLimb" LimbType="Standard" Offset="0x1D9E8"/>
<Limb Name="gGohmaRightMandibles2RootLimb" LimbType="Standard" Offset="0x1D9F4"/>
<Limb Name="gGohmaRightMandibles2Limb" LimbType="Standard" Offset="0x1DA00"/>
<Limb Name="gGohmaRightMandibles1Limb" LimbType="Standard" Offset="0x1DA0C"/>
<Limb Name="gGohmaLeftAntennaRootLimb" LimbType="Standard" Offset="0x1DA18"/>
<Limb Name="gGohmaLeftAntennaBodyRootLimb" LimbType="Standard" Offset="0x1DA24"/>
<Limb Name="gGohmaLeftAntennaShellRootLimb" LimbType="Standard" Offset="0x1DA30"/>
<Limb Name="gGohmaLeftAntennaClawRootLimb" LimbType="Standard" Offset="0x1DA3C"/>
<Limb Name="gGohmaLeftAntennaClawLimb" LimbType="Standard" Offset="0x1DA48"/>
<Limb Name="gGohmaLeftAntennaShellLimb" LimbType="Standard" Offset="0x1DA54"/>
<Limb Name="gGohmaLeftAntennaBodyLimb" LimbType="Standard" Offset="0x1DA60"/>
<Limb Name="gGohmaRightAntennaRootLimb" LimbType="Standard" Offset="0x1DA6C"/>
<Limb Name="gGohmaRightAntennaBodyRootLimb" LimbType="Standard" Offset="0x1DA78"/>
<Limb Name="gGohmaRightAntennaShellRootLimb" LimbType="Standard" Offset="0x1DA84"/>
<Limb Name="gGohmaRightAntennaClawRootLimb" LimbType="Standard" Offset="0x1DA90"/>
<Limb Name="gGohmaRightAntennaClawLimb" LimbType="Standard" Offset="0x1DA9C"/>
<Limb Name="gGohmaRightAntennaShellLimb" LimbType="Standard" Offset="0x1DAA8"/>
<Limb Name="gGohmaRightAntennaBodyLimb" LimbType="Standard" Offset="0x1DAB4"/>
<Limb Name="gGohmaLeftLegRootLimb" LimbType="Standard" Offset="0x1DAC0"/>
<Limb Name="gGohmaLeftThighRootLimb" LimbType="Standard" Offset="0x1DACC"/>
<Limb Name="gGohmaLeftLegLowerRootLimb" LimbType="Standard" Offset="0x1DAD8"/>
<Limb Name="gGohmaLeftFeetRootLimb" LimbType="Standard" Offset="0x1DAE4"/>
<Limb Name="gGohmaLeftFeetBackRoot1Limb" LimbType="Standard" Offset="0x1DAF0"/>
<Limb Name="gGohmaLeftFeetBackRoot2Limb" LimbType="Standard" Offset="0x1DAFC"/>
<Limb Name="gGohmaLeftFeetBackLimb" LimbType="Standard" Offset="0x1DB08"/>
<Limb Name="gGohmaLeftFeetLimb" LimbType="Standard" Offset="0x1DB14"/>
<Limb Name="gGohmaLeftShinLimb" LimbType="Standard" Offset="0x1DB20"/>
<Limb Name="gGohmaLeftKneeRoot1Limb" LimbType="Standard" Offset="0x1DB2C"/>
<Limb Name="gGohmaLeftKneeRoot2Limb" LimbType="Standard" Offset="0x1DB38"/>
<Limb Name="gGohmaLeftKneeLimb" LimbType="Standard" Offset="0x1DB44"/>
<Limb Name="gGohmaLeftThighShellRoot1Limb" LimbType="Standard" Offset="0x1DB50"/>
<Limb Name="gGohmaLeftThighShellRoot2Limb" LimbType="Standard" Offset="0x1DB5C"/>
<Limb Name="gGohmaLeftThighShellLimb" LimbType="Standard" Offset="0x1DB68"/>
<Limb Name="gGohmaLeftThighLimb" LimbType="Standard" Offset="0x1DB74"/>
<Limb Name="gGohmaBodyShellBackRoot1Limb" LimbType="Standard" Offset="0x1DB80"/>
<Limb Name="gGohmaBodyShellBackRoot2Limb" LimbType="Standard" Offset="0x1DB8C"/>
<Limb Name="gGohmaBodyShellBackLimb" LimbType="Standard" Offset="0x1DB98"/>
<!-- Display Lists-->
<DList Name="gGohmaBodyDL" Offset="0x13A60"/>
<DList Name="gGohmaBodyShellDL" Offset="0x14298"/>
<DList Name="gGohmaEyeDL" Offset="0x14A10"/>
<DList Name="gGohmaTail4DL" Offset="0x17D80"/>
<DList Name="gGohmaTail3DL" Offset="0x17B08"/>
<DList Name="gGohmaTail2DL" Offset="0x17960"/>
<DList Name="gGohmaTail1DL" Offset="0x17768"/>
<DList Name="gGohmaRightFeetBackDL" Offset="0x15F28"/>
<DList Name="gGohmaRightFeetDL" Offset="0x15168"/>
<DList Name="gGohmaRightShinDL" Offset="0x17500"/>
<DList Name="gGohmaRightKneeDL" Offset="0x15B28"/>
<DList Name="gGohmaRightThighShellDL" Offset="0x147D0"/>
<DList Name="gGohmaRightThighDL" Offset="0x167A0"/>
<DList Name="gGohmaEyeLidBottomDL" Offset="0x16DA0"/>
<DList Name="gGohmaEyeLidTopDL" Offset="0x16AB8"/>
<DList Name="gGohmaIrisDL" Offset="0x15338"/>
<DList Name="gGohmaMandiblesBodyDL" Offset="0x16FE8"/>
<DList Name="gGohmaLeftMandibles2DL" Offset="0x13750"/>
<DList Name="gGohmaLeftMandibles1DL" Offset="0x135F0"/>
<DList Name="gGohmaRightMandibles2DL" Offset="0x13480"/>
<DList Name="gGohmaRightMandibles1DL" Offset="0x13320"/>
<DList Name="gGohmaLeftAntennaClawDL" Offset="0x18008"/>
<DList Name="gGohmaLeftAntennaShellDL" Offset="0x12AF8"/>
<DList Name="gGohmaLeftAntennaBodyDL" Offset="0x12770"/>
<DList Name="gGohmaRightAntennaClawDL" Offset="0x18290"/>
<DList Name="gGohmaRightAntennaShellDL" Offset="0x13128"/>
<DList Name="gGohmaRightAntennaBodyDL" Offset="0x12D70"/>
<DList Name="gGohmaLeftFeetBackDL" Offset="0x15D48"/>
<DList Name="gGohmaLeftFeetDL" Offset="0x14DC0"/>
<DList Name="gGohmaLeftShinDL" Offset="0x17268"/>
<DList Name="gGohmaLeftKneeDL" Offset="0x156D8"/>
<DList Name="gGohmaLeftThighShellDL" Offset="0x14640"/>
<DList Name="gGohmaLeftThighDL" Offset="0x16348"/>
<DList Name="gGohmaBodyShellBackDL" Offset="0x144B0"/>
<!-- Animations --> <!-- Animations -->
<Animation Name="gGohmaAnim_000AE8" Offset="0xAE8"/> <!-- standing up, wiggle (first encounter?) --> <Animation Name="gGohmaStandAnim" Offset="0xAE8"/>
<Animation Name="gGohmaAnim_00193C" Offset="0x193C"/> <!-- stretched, looking up (would make more sense with 0x8000 x rot?) --> <Animation Name="gGohmaHangAnim" Offset="0x193C"/> <!-- hang from the ceiling -->
<Animation Name="gGohmaAnim_002360" Offset="0x2360"/> <!-- running --> <Animation Name="gGohmaWalkAnim" Offset="0x2360"/>
<Animation Name="gGohmaAnim_0029F0" Offset="0x29F0"/> <!-- standing up, shaking --> <Animation Name="gGohmaPrepareEggsAnim" Offset="0x29F0"/> <!-- hanging, shaking -->
<Animation Name="gGohmaAnim_004318" Offset="0x4318"/> <!-- attack (or land?) --> <Animation Name="gGohmaAttackAnim" Offset="0x4318"/>
<Animation Name="gGohmaAnim_004A20" Offset="0x4A20"/> <!-- briefly look up (rotX 0x8000?) --> <Animation Name="gGohmaRestAfterAttackAnim" Offset="0x4A20"/>
<Animation Name="gGohmaAnim_005330" Offset="0x5330"/> <!-- get up and close eye --> <Animation Name="gGohmaRecoverAfterAttackAnim" Offset="0x5330"/>
<Animation Name="gGohmaAnim_0058C0" Offset="0x58C0"/> <!-- lying on ground, shook (when hit?) --> <Animation Name="gGohmaCrashAnim" Offset="0x58C0"/> <!-- when struck down from the ceiling -->
<Animation Name="gGohmaAnim_005F28" Offset="0x5F28"/> <!-- briefly crouch, eye halfclosed --> <Animation Name="gGohmaLandAnim" Offset="0x5F28"/> <!-- when jumping down from the ceiling -->
<Animation Name="gGohmaAnim_0066DC" Offset="0x66DC"/> <!-- running, head facing down --> <Animation Name="gGohmaClimbAnim" Offset="0x66DC"/> <!-- when climbing a wall -->
<Animation Name="gGohmaAnim_006E60" Offset="0x6E60"/> <!-- lying on ground, shook, rolling eye (when hit?) --> <Animation Name="gGohmaDamageAnim" Offset="0x6E60"/>
<Animation Name="gGohmaAnim_00B2FC" Offset="0xB2FC"/> <!-- get up, shake, fall, get up, fall (death animation?) --> <Animation Name="gGohmaDeathAnim" Offset="0xB2FC"/>
<Animation Name="gGohmaAnim_00C468" Offset="0xC468"/> <!-- open eye, stretch/get up, blink, "attack posture" (first encounter?) --> <Animation Name="gGohmaPrepareAttackAnim" Offset="0xC468"/>
<Animation Name="gGohmaAnim_00CCD8" Offset="0xCCD8"/> <!-- on ground, eye and limbs shaking a bit --> <Animation Name="gGohmaStunnedAnim" Offset="0xCCD8"/>
<Animation Name="gGohmaAnim_00F70C" Offset="0xF70C"/> <!-- blink, get up, take "attack posture" --> <Animation Name="gGohmaInitialLandingAnim" Offset="0xF70C"/> <!-- when landing in the pre-fight cutscene -->
<Animation Name="gGohmaAnim_010918" Offset="0x10918"/> <!-- standing up, roll eye --> <Animation Name="gGohmaEyeRollAnim" Offset="0x10918"/>
<Animation Name="gGohmaAnim_0113BC" Offset="0x113BC"/> <!-- eye half closed, standing up, kind of briefly crouch and agitate limbs --> <Animation Name="gGohmaLayEggsAnim" Offset="0x113BC"/>
<Animation Name="gGohmaAnim_012678" Offset="0x12678"/> <!-- eye half closed, one step ahead, one step back (menacing) --> <Animation Name="gGohmaIdleCrouchedAnim" Offset="0x12678"/>
<Animation Name="gGohmaAnim_01EB4C" Offset="0x1EB4C"/> <!-- eye half closed, walk (cautiously?) --> <Animation Name="gGohmaWalkCrouchedAnim" Offset="0x1EB4C"/>
<!-- Unused animations --> <!-- Unused animations -->
<Animation Name="gGohmaAnim_0039D0" Offset="0x39D0"/> <!-- unused attack animation --> <Animation Name="gGohmaViolentAttackAnim" Offset="0x39D0"/>
<!-- Limb textures --> <!-- Limb textures -->
<Texture Name="gGohmaTex_0183A8" OutName="gohma_tex_0183A8" Format="rgba16" Width="16" Height="16" Offset="0x183A8"/> <Texture Name="gGohmaBodyTex" OutName="gohma_body" Format="rgba16" Width="16" Height="16" Offset="0x183A8"/>
<Texture Name="gGohmaTex_0185A8" OutName="gohma_tex_0185A8" Format="rgba16" Width="16" Height="16" Offset="0x185A8"/> <Texture Name="gGohmaShellUndersideTex" OutName="gohma_shell_underside" Format="rgba16" Width="16" Height="16" Offset="0x185A8"/>
<Texture Name="gGohmaTex_0187A8" OutName="gohma_tex_0187A8" Format="rgba16" Width="16" Height="16" Offset="0x187A8"/> <Texture Name="gGohmaDarkShellTex" OutName="gohma_dark_shell" Format="rgba16" Width="16" Height="16" Offset="0x187A8"/>
<Texture Name="gGohmaTex_0189A8" OutName="gohma_tex_0189A8" Format="rgba16" Width="32" Height="32" Offset="0x189A8"/> <Texture Name="gGohmaShellTex" OutName="gohma_shell" Format="rgba16" Width="32" Height="32" Offset="0x189A8"/>
<Texture Name="gGohmaTex_0191A8" OutName="gohma_tex_0191A8" Format="rgba16" Width="16" Height="16" Offset="0x191A8"/> <Texture Name="gGohmaEyeTex" OutName="gohma_eye" Format="rgba16" Width="16" Height="16" Offset="0x191A8"/>
<Texture Name="gGohmaTex_0193A8" OutName="gohma_tex_0193A8" Format="rgba16" Width="32" Height="32" Offset="0x193A8"/> <Texture Name="gGohmaIrisTex" OutName="gohma_iris" Format="rgba16" Width="32" Height="32" Offset="0x193A8"/>
<!-- Boss title card --> <!-- Boss title card -->
<Texture Name="gGohmaTitleCardTex" OutName="gohma_title_card" Format="i8" Width="128" Height="120" Offset="0x19BA8"/> <Texture Name="gGohmaTitleCardTex" OutName="gohma_title_card" Format="i8" Width="128" Height="120" Offset="0x19BA8"/>
@ -41,5 +164,6 @@
<!-- Door --> <!-- Door -->
<DList Name="gGohmaDoorDL" Offset="0x1EC20"/> <DList Name="gGohmaDoorDL" Offset="0x1EC20"/>
<Collision Name="gGohmaDoorCol" Offset="0x1EDD0"/> <Collision Name="gGohmaDoorCol" Offset="0x1EDD0"/>
<Texture Name="gGohmaDoorTex" OutName="door" Format="rgba16" Width="32" Height="32" Offset="0x1EE00"/>
</File> </File>
</Root> </Root>

View file

@ -72,7 +72,7 @@ static ColliderJntSphElementInit sColliderJntSphElementInit[13] = {
BUMP_ON, BUMP_ON,
OCELEM_ON, OCELEM_ON,
}, },
{ 5, { { 0, 0, 1200 }, 20 }, 100 }, { BOSSGOMA_LIMB_EYE, { { 0, 0, 1200 }, 20 }, 100 },
}, },
{ {
{ {
@ -83,7 +83,7 @@ static ColliderJntSphElementInit sColliderJntSphElementInit[13] = {
BUMP_ON, BUMP_ON,
OCELEM_ON, OCELEM_ON,
}, },
{ 11, { { 0, 0, 0 }, 20 }, 100 }, { BOSSGOMA_LIMB_TAIL4, { { 0, 0, 0 }, 20 }, 100 },
}, },
{ {
{ {
@ -94,7 +94,7 @@ static ColliderJntSphElementInit sColliderJntSphElementInit[13] = {
BUMP_ON, BUMP_ON,
OCELEM_ON, OCELEM_ON,
}, },
{ 12, { { 0, 0, 0 }, 15 }, 100 }, { BOSSGOMA_LIMB_TAIL3, { { 0, 0, 0 }, 15 }, 100 },
}, },
{ {
{ {
@ -105,7 +105,7 @@ static ColliderJntSphElementInit sColliderJntSphElementInit[13] = {
BUMP_ON, BUMP_ON,
OCELEM_ON, OCELEM_ON,
}, },
{ 13, { { 0, 0, 0 }, 12 }, 100 }, { BOSSGOMA_LIMB_TAIL2, { { 0, 0, 0 }, 12 }, 100 },
}, },
{ {
{ {
@ -116,7 +116,7 @@ static ColliderJntSphElementInit sColliderJntSphElementInit[13] = {
BUMP_ON, BUMP_ON,
OCELEM_ON, OCELEM_ON,
}, },
{ 14, { { 0, 0, 0 }, 25 }, 100 }, { BOSSGOMA_LIMB_TAIL1, { { 0, 0, 0 }, 25 }, 100 },
}, },
{ {
{ {
@ -127,7 +127,7 @@ static ColliderJntSphElementInit sColliderJntSphElementInit[13] = {
BUMP_ON, BUMP_ON,
OCELEM_ON, OCELEM_ON,
}, },
{ 22, { { 0, 0, 0 }, 30 }, 100 }, { BOSSGOMA_LIMB_R_FEET, { { 0, 0, 0 }, 30 }, 100 },
}, },
{ {
{ {
@ -138,7 +138,7 @@ static ColliderJntSphElementInit sColliderJntSphElementInit[13] = {
BUMP_ON, BUMP_ON,
OCELEM_ON, OCELEM_ON,
}, },
{ 23, { { 0, 0, 0 }, 15 }, 100 }, { BOSSGOMA_LIMB_R_SHIN, { { 0, 0, 0 }, 15 }, 100 },
}, },
{ {
{ {
@ -149,7 +149,7 @@ static ColliderJntSphElementInit sColliderJntSphElementInit[13] = {
BUMP_ON, BUMP_ON,
OCELEM_ON, OCELEM_ON,
}, },
{ 29, { { 0, 0, 0 }, 15 }, 100 }, { BOSSGOMA_LIMB_R_THIGH_SHELL, { { 0, 0, 0 }, 15 }, 100 },
}, },
{ {
{ {
@ -160,7 +160,7 @@ static ColliderJntSphElementInit sColliderJntSphElementInit[13] = {
BUMP_ON, BUMP_ON,
OCELEM_ON, OCELEM_ON,
}, },
{ 57, { { 0, 0, 0 }, 20 }, 100 }, { BOSSGOMA_LIMB_L_ANTENNA_CLAW, { { 0, 0, 0 }, 20 }, 100 },
}, },
{ {
{ {
@ -171,7 +171,7 @@ static ColliderJntSphElementInit sColliderJntSphElementInit[13] = {
BUMP_ON, BUMP_ON,
OCELEM_ON, OCELEM_ON,
}, },
{ 64, { { 0, 0, 0 }, 20 }, 100 }, { BOSSGOMA_LIMB_R_ANTENNA_CLAW, { { 0, 0, 0 }, 20 }, 100 },
}, },
{ {
{ {
@ -182,7 +182,7 @@ static ColliderJntSphElementInit sColliderJntSphElementInit[13] = {
BUMP_ON, BUMP_ON,
OCELEM_ON, OCELEM_ON,
}, },
{ 74, { { 0, 0, 0 }, 30 }, 100 }, { BOSSGOMA_LIMB_L_FEET, { { 0, 0, 0 }, 30 }, 100 },
}, },
{ {
{ {
@ -193,7 +193,7 @@ static ColliderJntSphElementInit sColliderJntSphElementInit[13] = {
BUMP_ON, BUMP_ON,
OCELEM_ON, OCELEM_ON,
}, },
{ 75, { { 0, 0, 0 }, 15 }, 100 }, { BOSSGOMA_LIMB_L_SHIN, { { 0, 0, 0 }, 15 }, 100 },
}, },
{ {
{ {
@ -204,7 +204,7 @@ static ColliderJntSphElementInit sColliderJntSphElementInit[13] = {
BUMP_ON, BUMP_ON,
OCELEM_ON, OCELEM_ON,
}, },
{ 81, { { 0, 0, 0 }, 15 }, 100 }, { BOSSGOMA_LIMB_L_THIGH_SHELL, { { 0, 0, 0 }, 15 }, 100 },
}, },
}; };
@ -322,13 +322,13 @@ void BossGoma_ClearPixels32x32Rgba16(s16* rgba16image, u8* clearPixelTable, s16
* Clear pixels from Gohma's textures * Clear pixels from Gohma's textures
*/ */
void BossGoma_ClearPixels(u8* clearPixelTable, s16 i) { void BossGoma_ClearPixels(u8* clearPixelTable, s16 i) {
BossGoma_ClearPixels16x16Rgba16(SEGMENTED_TO_VIRTUAL(gGohmaTex_0183A8), clearPixelTable, i); BossGoma_ClearPixels16x16Rgba16(SEGMENTED_TO_VIRTUAL(gGohmaBodyTex), clearPixelTable, i);
BossGoma_ClearPixels16x16Rgba16(SEGMENTED_TO_VIRTUAL(gGohmaTex_0185A8), clearPixelTable, i); BossGoma_ClearPixels16x16Rgba16(SEGMENTED_TO_VIRTUAL(gGohmaShellUndersideTex), clearPixelTable, i);
BossGoma_ClearPixels16x16Rgba16(SEGMENTED_TO_VIRTUAL(gGohmaTex_0187A8), clearPixelTable, i); BossGoma_ClearPixels16x16Rgba16(SEGMENTED_TO_VIRTUAL(gGohmaDarkShellTex), clearPixelTable, i);
BossGoma_ClearPixels16x16Rgba16(SEGMENTED_TO_VIRTUAL(gGohmaTex_0191A8), clearPixelTable, i); BossGoma_ClearPixels16x16Rgba16(SEGMENTED_TO_VIRTUAL(gGohmaEyeTex), clearPixelTable, i);
BossGoma_ClearPixels32x32Rgba16(SEGMENTED_TO_VIRTUAL(gGohmaTex_0189A8), clearPixelTable, i); BossGoma_ClearPixels32x32Rgba16(SEGMENTED_TO_VIRTUAL(gGohmaShellTex), clearPixelTable, i);
BossGoma_ClearPixels32x32Rgba16(SEGMENTED_TO_VIRTUAL(gGohmaTex_0193A8), clearPixelTable, i); BossGoma_ClearPixels32x32Rgba16(SEGMENTED_TO_VIRTUAL(gGohmaIrisTex), clearPixelTable, i);
} }
static InitChainEntry sInitChain[] = { static InitChainEntry sInitChain[] = {
@ -343,8 +343,8 @@ void BossGoma_Init(Actor* thisx, GlobalContext* globalCtx) {
Actor_ProcessInitChain(&this->actor, sInitChain); Actor_ProcessInitChain(&this->actor, sInitChain);
ActorShape_Init(&this->actor.shape, 4000.0f, ActorShadow_DrawCircle, 150.0f); ActorShape_Init(&this->actor.shape, 4000.0f, ActorShadow_DrawCircle, 150.0f);
SkelAnime_Init(globalCtx, &this->skelanime, &gGohmaSkel, &gGohmaAnim_012678, NULL, NULL, 0); SkelAnime_Init(globalCtx, &this->skelanime, &gGohmaSkel, &gGohmaIdleCrouchedAnim, NULL, NULL, 0);
Animation_PlayLoop(&this->skelanime, &gGohmaAnim_012678); Animation_PlayLoop(&this->skelanime, &gGohmaIdleCrouchedAnim);
this->actor.shape.rot.x = -0x8000; // upside-down this->actor.shape.rot.x = -0x8000; // upside-down
this->eyeIrisScaleX = 1.0f; this->eyeIrisScaleX = 1.0f;
this->eyeIrisScaleY = 1.0f; this->eyeIrisScaleY = 1.0f;
@ -395,7 +395,7 @@ void BossGoma_Destroy(Actor* thisx, GlobalContext* globalCtx) {
* When Gohma is hit and its health drops to 0 * When Gohma is hit and its health drops to 0
*/ */
void BossGoma_SetupDefeated(BossGoma* this, GlobalContext* globalCtx) { void BossGoma_SetupDefeated(BossGoma* this, GlobalContext* globalCtx) {
Animation_Change(&this->skelanime, &gGohmaAnim_00B2FC, 1.0f, 0.0f, Animation_GetLastFrame(&gGohmaAnim_00B2FC), Animation_Change(&this->skelanime, &gGohmaDeathAnim, 1.0f, 0.0f, Animation_GetLastFrame(&gGohmaDeathAnim),
ANIMMODE_ONCE, -2.0f); ANIMMODE_ONCE, -2.0f);
this->actionFunc = BossGoma_Defeated; this->actionFunc = BossGoma_Defeated;
this->disableGameplayLogic = true; this->disableGameplayLogic = true;
@ -414,9 +414,9 @@ void BossGoma_SetupDefeated(BossGoma* this, GlobalContext* globalCtx) {
* Initial action setup, with Gohma waiting on the ceiling for the fight to start. * Initial action setup, with Gohma waiting on the ceiling for the fight to start.
*/ */
void BossGoma_SetupEncounter(BossGoma* this, GlobalContext* globalCtx) { void BossGoma_SetupEncounter(BossGoma* this, GlobalContext* globalCtx) {
f32 lastFrame = Animation_GetLastFrame(&gGohmaAnim_002360); f32 lastFrame = Animation_GetLastFrame(&gGohmaWalkAnim);
Animation_Change(&this->skelanime, &gGohmaAnim_002360, 1.0f, 0.0f, lastFrame, ANIMMODE_LOOP, -15.0f); Animation_Change(&this->skelanime, &gGohmaWalkAnim, 1.0f, 0.0f, lastFrame, ANIMMODE_LOOP, -15.0f);
this->actionFunc = BossGoma_Encounter; this->actionFunc = BossGoma_Encounter;
this->actionState = 0; this->actionState = 0;
this->disableGameplayLogic = true; this->disableGameplayLogic = true;
@ -428,10 +428,10 @@ void BossGoma_SetupEncounter(BossGoma* this, GlobalContext* globalCtx) {
* On the floor and not doing anything for 20-30 frames, before going back to BossGoma_FloorMain * On the floor and not doing anything for 20-30 frames, before going back to BossGoma_FloorMain
*/ */
void BossGoma_SetupFloorIdle(BossGoma* this) { void BossGoma_SetupFloorIdle(BossGoma* this) {
f32 lastFrame = Animation_GetLastFrame(&gGohmaAnim_012678); f32 lastFrame = Animation_GetLastFrame(&gGohmaIdleCrouchedAnim);
this->framesUntilNextAction = Rand_S16Offset(20, 30); this->framesUntilNextAction = Rand_S16Offset(20, 30);
Animation_Change(&this->skelanime, &gGohmaAnim_012678, 1.0f, 0.0f, lastFrame, ANIMMODE_LOOP, -5.0f); Animation_Change(&this->skelanime, &gGohmaIdleCrouchedAnim, 1.0f, 0.0f, lastFrame, ANIMMODE_LOOP, -5.0f);
this->actionFunc = BossGoma_FloorIdle; this->actionFunc = BossGoma_FloorIdle;
} }
@ -440,7 +440,7 @@ void BossGoma_SetupFloorIdle(BossGoma* this) {
*/ */
void BossGoma_SetupCeilingIdle(BossGoma* this) { void BossGoma_SetupCeilingIdle(BossGoma* this) {
this->framesUntilNextAction = Rand_S16Offset(20, 30); this->framesUntilNextAction = Rand_S16Offset(20, 30);
Animation_Change(&this->skelanime, &gGohmaAnim_00193C, 1.0f, 0.0f, Animation_GetLastFrame(&gGohmaAnim_00193C), Animation_Change(&this->skelanime, &gGohmaHangAnim, 1.0f, 0.0f, Animation_GetLastFrame(&gGohmaHangAnim),
ANIMMODE_LOOP, -5.0f); ANIMMODE_LOOP, -5.0f);
this->actionFunc = BossGoma_CeilingIdle; this->actionFunc = BossGoma_CeilingIdle;
} }
@ -449,7 +449,7 @@ void BossGoma_SetupCeilingIdle(BossGoma* this) {
* When the player killed all children gohmas * When the player killed all children gohmas
*/ */
void BossGoma_SetupFallJump(BossGoma* this) { void BossGoma_SetupFallJump(BossGoma* this) {
Animation_Change(&this->skelanime, &gGohmaAnim_005F28, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -5.0f); Animation_Change(&this->skelanime, &gGohmaLandAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -5.0f);
this->actionFunc = BossGoma_FallJump; this->actionFunc = BossGoma_FallJump;
this->actor.speedXZ = 0.0f; this->actor.speedXZ = 0.0f;
this->actor.velocity.y = 0.0f; this->actor.velocity.y = 0.0f;
@ -460,7 +460,7 @@ void BossGoma_SetupFallJump(BossGoma* this) {
* When the player successfully hits Gohma on the ceiling * When the player successfully hits Gohma on the ceiling
*/ */
void BossGoma_SetupFallStruckDown(BossGoma* this) { void BossGoma_SetupFallStruckDown(BossGoma* this) {
Animation_Change(&this->skelanime, &gGohmaAnim_0058C0, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -5.0f); Animation_Change(&this->skelanime, &gGohmaCrashAnim, 1.0f, 0.0f, 0.0f, ANIMMODE_ONCE, -5.0f);
this->actionFunc = BossGoma_FallStruckDown; this->actionFunc = BossGoma_FallStruckDown;
this->actor.speedXZ = 0.0f; this->actor.speedXZ = 0.0f;
this->actor.velocity.y = 0.0f; this->actor.velocity.y = 0.0f;
@ -468,21 +468,21 @@ void BossGoma_SetupFallStruckDown(BossGoma* this) {
} }
void BossGoma_SetupCeilingSpawnGohmas(BossGoma* this) { void BossGoma_SetupCeilingSpawnGohmas(BossGoma* this) {
Animation_Change(&this->skelanime, &gGohmaAnim_0113BC, 1.0f, 0.0f, Animation_GetLastFrame(&gGohmaAnim_0113BC), Animation_Change(&this->skelanime, &gGohmaLayEggsAnim, 1.0f, 0.0f, Animation_GetLastFrame(&gGohmaLayEggsAnim),
ANIMMODE_LOOP, -15.0f); ANIMMODE_LOOP, -15.0f);
this->actionFunc = BossGoma_CeilingSpawnGohmas; this->actionFunc = BossGoma_CeilingSpawnGohmas;
this->spawnGohmasActionTimer = 0; this->spawnGohmasActionTimer = 0;
} }
void BossGoma_SetupCeilingPrepareSpawnGohmas(BossGoma* this) { void BossGoma_SetupCeilingPrepareSpawnGohmas(BossGoma* this) {
Animation_Change(&this->skelanime, &gGohmaAnim_0029F0, 1.0f, 0.0f, Animation_GetLastFrame(&gGohmaAnim_0029F0), Animation_Change(&this->skelanime, &gGohmaPrepareEggsAnim, 1.0f, 0.0f,
ANIMMODE_LOOP, -10.0f); Animation_GetLastFrame(&gGohmaPrepareEggsAnim), ANIMMODE_LOOP, -10.0f);
this->actionFunc = BossGoma_CeilingPrepareSpawnGohmas; this->actionFunc = BossGoma_CeilingPrepareSpawnGohmas;
this->framesUntilNextAction = 70; this->framesUntilNextAction = 70;
} }
void BossGoma_SetupWallClimb(BossGoma* this) { void BossGoma_SetupWallClimb(BossGoma* this) {
Animation_Change(&this->skelanime, &gGohmaAnim_0066DC, 1.0f, 0.0f, Animation_GetLastFrame(&gGohmaAnim_0066DC), Animation_Change(&this->skelanime, &gGohmaClimbAnim, 1.0f, 0.0f, Animation_GetLastFrame(&gGohmaClimbAnim),
ANIMMODE_LOOP, -10.0f); ANIMMODE_LOOP, -10.0f);
this->actionFunc = BossGoma_WallClimb; this->actionFunc = BossGoma_WallClimb;
this->actor.speedXZ = 0.0f; this->actor.speedXZ = 0.0f;
@ -494,7 +494,7 @@ void BossGoma_SetupWallClimb(BossGoma* this) {
* Gohma either reached the ceiling after climbing a wall, or is waiting for the player to kill the (children) Gohmas. * Gohma either reached the ceiling after climbing a wall, or is waiting for the player to kill the (children) Gohmas.
*/ */
void BossGoma_SetupCeilingMoveToCenter(BossGoma* this) { void BossGoma_SetupCeilingMoveToCenter(BossGoma* this) {
Animation_Change(&this->skelanime, &gGohmaAnim_002360, 1.0f, 0.0f, Animation_GetLastFrame(&gGohmaAnim_002360), Animation_Change(&this->skelanime, &gGohmaWalkAnim, 1.0f, 0.0f, Animation_GetLastFrame(&gGohmaWalkAnim),
ANIMMODE_LOOP, -5.0f); ANIMMODE_LOOP, -5.0f);
this->actionFunc = BossGoma_CeilingMoveToCenter; this->actionFunc = BossGoma_CeilingMoveToCenter;
this->actor.speedXZ = 0.0f; this->actor.speedXZ = 0.0f;
@ -507,8 +507,8 @@ void BossGoma_SetupCeilingMoveToCenter(BossGoma* this) {
* Root action when on the floor, leads to attacking or climbing. * Root action when on the floor, leads to attacking or climbing.
*/ */
void BossGoma_SetupFloorMain(BossGoma* this) { void BossGoma_SetupFloorMain(BossGoma* this) {
Animation_Change(&this->skelanime, &gGohmaAnim_01EB4C, 1.0f, 0.0f, Animation_GetLastFrame(&gGohmaAnim_01EB4C), Animation_Change(&this->skelanime, &gGohmaWalkCrouchedAnim, 1.0f, 0.0f,
ANIMMODE_LOOP, -5.0f); Animation_GetLastFrame(&gGohmaWalkCrouchedAnim), ANIMMODE_LOOP, -5.0f);
this->actionFunc = BossGoma_FloorMain; this->actionFunc = BossGoma_FloorMain;
this->framesUntilNextAction = Rand_S16Offset(70, 110); this->framesUntilNextAction = Rand_S16Offset(70, 110);
} }
@ -517,28 +517,28 @@ void BossGoma_SetupFloorMain(BossGoma* this) {
* Gohma jumped to the floor on its own, after the player has killed its children Gohmas. * Gohma jumped to the floor on its own, after the player has killed its children Gohmas.
*/ */
void BossGoma_SetupFloorLand(BossGoma* this) { void BossGoma_SetupFloorLand(BossGoma* this) {
Animation_Change(&this->skelanime, &gGohmaAnim_005F28, 1.0f, 0.0f, Animation_GetLastFrame(&gGohmaAnim_005F28), Animation_Change(&this->skelanime, &gGohmaLandAnim, 1.0f, 0.0f, Animation_GetLastFrame(&gGohmaLandAnim),
ANIMMODE_ONCE, -2.0f); ANIMMODE_ONCE, -2.0f);
this->actionFunc = BossGoma_FloorLand; this->actionFunc = BossGoma_FloorLand;
this->currentAnimFrameCount = Animation_GetLastFrame(&gGohmaAnim_005F28); this->currentAnimFrameCount = Animation_GetLastFrame(&gGohmaLandAnim);
} }
/** /**
* Gohma was shot by the player down from the ceiling. * Gohma was shot by the player down from the ceiling.
*/ */
void BossGoma_SetupFloorLandStruckDown(BossGoma* this) { void BossGoma_SetupFloorLandStruckDown(BossGoma* this) {
Animation_Change(&this->skelanime, &gGohmaAnim_0058C0, 1.0f, 0.0f, Animation_GetLastFrame(&gGohmaAnim_0058C0), Animation_Change(&this->skelanime, &gGohmaCrashAnim, 1.0f, 0.0f, Animation_GetLastFrame(&gGohmaCrashAnim),
ANIMMODE_ONCE, -2.0f); ANIMMODE_ONCE, -2.0f);
this->currentAnimFrameCount = Animation_GetLastFrame(&gGohmaAnim_0058C0); this->currentAnimFrameCount = Animation_GetLastFrame(&gGohmaCrashAnim);
this->actionFunc = BossGoma_FloorLandStruckDown; this->actionFunc = BossGoma_FloorLandStruckDown;
this->currentAnimFrameCount = Animation_GetLastFrame(&gGohmaAnim_0058C0); this->currentAnimFrameCount = Animation_GetLastFrame(&gGohmaCrashAnim);
} }
/** /**
* Gohma is vulnerable, from being struck down from the ceiling or on the ground. * Gohma is vulnerable, from being struck down from the ceiling or on the ground.
*/ */
void BossGoma_SetupFloorStunned(BossGoma* this) { void BossGoma_SetupFloorStunned(BossGoma* this) {
Animation_Change(&this->skelanime, &gGohmaAnim_00CCD8, 1.0f, 0.0f, Animation_GetLastFrame(&gGohmaAnim_00CCD8), Animation_Change(&this->skelanime, &gGohmaStunnedAnim, 1.0f, 0.0f, Animation_GetLastFrame(&gGohmaStunnedAnim),
ANIMMODE_LOOP, -2.0f); ANIMMODE_LOOP, -2.0f);
this->actionFunc = BossGoma_FloorStunned; this->actionFunc = BossGoma_FloorStunned;
} }
@ -547,8 +547,8 @@ void BossGoma_SetupFloorStunned(BossGoma* this) {
* Take an attack posture, when the player is close enough. * Take an attack posture, when the player is close enough.
*/ */
void BossGoma_SetupFloorAttackPosture(BossGoma* this) { void BossGoma_SetupFloorAttackPosture(BossGoma* this) {
Animation_Change(&this->skelanime, &gGohmaAnim_00C468, 1.0f, 0.0f, Animation_GetLastFrame(&gGohmaAnim_00C468), Animation_Change(&this->skelanime, &gGohmaPrepareAttackAnim, 1.0f, 0.0f,
ANIMMODE_ONCE, -10.0f); Animation_GetLastFrame(&gGohmaPrepareAttackAnim), ANIMMODE_ONCE, -10.0f);
this->actionFunc = BossGoma_FloorAttackPosture; this->actionFunc = BossGoma_FloorAttackPosture;
} }
@ -556,14 +556,14 @@ void BossGoma_SetupFloorAttackPosture(BossGoma* this) {
* Leads to BossGoma_FloorAttack after 1 frame * Leads to BossGoma_FloorAttack after 1 frame
*/ */
void BossGoma_SetupFloorPrepareAttack(BossGoma* this) { void BossGoma_SetupFloorPrepareAttack(BossGoma* this) {
Animation_Change(&this->skelanime, &gGohmaAnim_000AE8, 1.0f, 0.0f, Animation_GetLastFrame(&gGohmaAnim_000AE8), Animation_Change(&this->skelanime, &gGohmaStandAnim, 1.0f, 0.0f, Animation_GetLastFrame(&gGohmaStandAnim),
ANIMMODE_LOOP, -10.0f); ANIMMODE_LOOP, -10.0f);
this->actionFunc = BossGoma_FloorPrepareAttack; this->actionFunc = BossGoma_FloorPrepareAttack;
this->framesUntilNextAction = 0; this->framesUntilNextAction = 0;
} }
void BossGoma_SetupFloorAttack(BossGoma* this) { void BossGoma_SetupFloorAttack(BossGoma* this) {
Animation_Change(&this->skelanime, &gGohmaAnim_004318, 1.0f, 0.0f, Animation_GetLastFrame(&gGohmaAnim_004318), Animation_Change(&this->skelanime, &gGohmaAttackAnim, 1.0f, 0.0f, Animation_GetLastFrame(&gGohmaAttackAnim),
ANIMMODE_ONCE, -10.0f); ANIMMODE_ONCE, -10.0f);
this->actionFunc = BossGoma_FloorAttack; this->actionFunc = BossGoma_FloorAttack;
this->actionState = 0; this->actionState = 0;
@ -576,7 +576,7 @@ void BossGoma_SetupFloorAttack(BossGoma* this) {
* as the stun duration * as the stun duration
*/ */
void BossGoma_SetupFloorDamaged(BossGoma* this) { void BossGoma_SetupFloorDamaged(BossGoma* this) {
Animation_Change(&this->skelanime, &gGohmaAnim_006E60, 1.0f, 0.0f, Animation_GetLastFrame(&gGohmaAnim_006E60), Animation_Change(&this->skelanime, &gGohmaDamageAnim, 1.0f, 0.0f, Animation_GetLastFrame(&gGohmaDamageAnim),
ANIMMODE_ONCE, -2.0f); ANIMMODE_ONCE, -2.0f);
this->actionFunc = BossGoma_FloorDamaged; this->actionFunc = BossGoma_FloorDamaged;
} }
@ -633,9 +633,9 @@ void BossGoma_SetupEncounterState4(BossGoma* this, GlobalContext* globalCtx) {
this->subCameraId = Gameplay_CreateSubCamera(globalCtx); this->subCameraId = Gameplay_CreateSubCamera(globalCtx);
Gameplay_ChangeCameraStatus(globalCtx, 0, 3); Gameplay_ChangeCameraStatus(globalCtx, 0, 3);
Gameplay_ChangeCameraStatus(globalCtx, this->subCameraId, 7); Gameplay_ChangeCameraStatus(globalCtx, this->subCameraId, 7);
Animation_Change(&this->skelanime, &gGohmaAnim_010918, 1.0f, 0.0f, Animation_GetLastFrame(&gGohmaAnim_010918), Animation_Change(&this->skelanime, &gGohmaEyeRollAnim, 1.0f, 0.0f, Animation_GetLastFrame(&gGohmaEyeRollAnim),
ANIMMODE_ONCE, 0.0f); ANIMMODE_ONCE, 0.0f);
this->currentAnimFrameCount = Animation_GetLastFrame(&gGohmaAnim_010918); this->currentAnimFrameCount = Animation_GetLastFrame(&gGohmaEyeRollAnim);
// room center (todo: defines for hardcoded positions relative to room center) // room center (todo: defines for hardcoded positions relative to room center)
this->actor.world.pos.x = -150.0f; this->actor.world.pos.x = -150.0f;
@ -821,8 +821,8 @@ void BossGoma_Encounter(BossGoma* this, GlobalContext* globalCtx) {
if (Animation_OnFrame(&this->skelanime, this->currentAnimFrameCount)) { if (Animation_OnFrame(&this->skelanime, this->currentAnimFrameCount)) {
this->actionState = 5; this->actionState = 5;
Animation_Change(&this->skelanime, &gGohmaAnim_002360, 2.0f, 0.0f, Animation_Change(&this->skelanime, &gGohmaWalkAnim, 2.0f, 0.0f,
Animation_GetLastFrame(&gGohmaAnim_002360), ANIMMODE_LOOP, -5.0f); Animation_GetLastFrame(&gGohmaWalkAnim), ANIMMODE_LOOP, -5.0f);
this->framesUntilNextAction = 30; this->framesUntilNextAction = 30;
this->subCameraFollowSpeed = 0.0f; this->subCameraFollowSpeed = 0.0f;
} }
@ -851,8 +851,8 @@ void BossGoma_Encounter(BossGoma* this, GlobalContext* globalCtx) {
} }
if (this->framesUntilNextAction == 0) { if (this->framesUntilNextAction == 0) {
Animation_Change(&this->skelanime, &gGohmaAnim_00193C, 1.0f, 0.0f, Animation_Change(&this->skelanime, &gGohmaHangAnim, 1.0f, 0.0f, Animation_GetLastFrame(&gGohmaHangAnim),
Animation_GetLastFrame(&gGohmaAnim_00193C), ANIMMODE_LOOP, -5.0f); ANIMMODE_LOOP, -5.0f);
} }
if (this->framesUntilNextAction == 0) { if (this->framesUntilNextAction == 0) {
@ -860,8 +860,8 @@ void BossGoma_Encounter(BossGoma* this, GlobalContext* globalCtx) {
this->actor.speedXZ = 0.0f; this->actor.speedXZ = 0.0f;
this->actor.velocity.y = 0.0f; this->actor.velocity.y = 0.0f;
this->actor.gravity = -2.0f; this->actor.gravity = -2.0f;
Animation_Change(&this->skelanime, &gGohmaAnim_00F70C, 1.0f, 0.0f, Animation_Change(&this->skelanime, &gGohmaInitialLandingAnim, 1.0f, 0.0f,
Animation_GetLastFrame(&gGohmaAnim_00F70C), ANIMMODE_ONCE, -5.0f); Animation_GetLastFrame(&gGohmaInitialLandingAnim), ANIMMODE_ONCE, -5.0f);
player->actor.world.pos.x = 0.0f; player->actor.world.pos.x = 0.0f;
player->actor.world.pos.z = -30.0f; player->actor.world.pos.z = -30.0f;
} }
@ -884,9 +884,9 @@ void BossGoma_Encounter(BossGoma* this, GlobalContext* globalCtx) {
if (this->actor.bgCheckFlags & 1) { if (this->actor.bgCheckFlags & 1) {
this->actionState = 130; this->actionState = 130;
this->actor.velocity.y = 0.0f; this->actor.velocity.y = 0.0f;
Animation_Change(&this->skelanime, &gGohmaAnim_00F70C, 1.0f, 0.0f, Animation_Change(&this->skelanime, &gGohmaInitialLandingAnim, 1.0f, 0.0f,
Animation_GetLastFrame(&gGohmaAnim_00F70C), ANIMMODE_ONCE, -2.0f); Animation_GetLastFrame(&gGohmaInitialLandingAnim), ANIMMODE_ONCE, -2.0f);
this->currentAnimFrameCount = Animation_GetLastFrame(&gGohmaAnim_00F70C); this->currentAnimFrameCount = Animation_GetLastFrame(&gGohmaInitialLandingAnim);
BossGoma_PlayEffectsAndSfx(this, globalCtx, 0, 5); BossGoma_PlayEffectsAndSfx(this, globalCtx, 0, 5);
this->framesUntilNextAction = 15; this->framesUntilNextAction = 15;
func_800A9F6C(0.0f, 0xC8, 0x14, 0x14); func_800A9F6C(0.0f, 0xC8, 0x14, 0x14);
@ -927,8 +927,8 @@ void BossGoma_Encounter(BossGoma* this, GlobalContext* globalCtx) {
if (Animation_OnFrame(&this->skelanime, this->currentAnimFrameCount)) { if (Animation_OnFrame(&this->skelanime, this->currentAnimFrameCount)) {
this->actionState = 140; this->actionState = 140;
Animation_Change(&this->skelanime, &gGohmaAnim_000AE8, 1.0f, 0.0f, Animation_Change(&this->skelanime, &gGohmaStandAnim, 1.0f, 0.0f,
Animation_GetLastFrame(&gGohmaAnim_000AE8), ANIMMODE_LOOP, -10.0f); Animation_GetLastFrame(&gGohmaStandAnim), ANIMMODE_LOOP, -10.0f);
this->framesUntilNextAction = 20; this->framesUntilNextAction = 20;
} }
break; break;
@ -1025,7 +1025,7 @@ void BossGoma_Defeated(BossGoma* this, GlobalContext* globalCtx) {
//! @bug this 0-indexes into this->defeatedLimbPositions which is initialized with //! @bug this 0-indexes into this->defeatedLimbPositions which is initialized with
// this->defeatedLimbPositions[limb], but limb is 1-indexed in skelanime callbacks, this means effects // this->defeatedLimbPositions[limb], but limb is 1-indexed in skelanime callbacks, this means effects
// should spawn at this->defeatedLimbPositions[0] too, which is uninitialized, so map origin? // should spawn at this->defeatedLimbPositions[0] too, which is uninitialized, so map origin?
j = (s16)(Rand_ZeroOne() * 85); j = (s16)(Rand_ZeroOne() * (BOSSGOMA_LIMB_MAX - 1));
if (this->defeatedLimbPositions[j].y < 10000.0f) { if (this->defeatedLimbPositions[j].y < 10000.0f) {
pos.x = Rand_CenteredFloat(20.0f) + this->defeatedLimbPositions[j].x; pos.x = Rand_CenteredFloat(20.0f) + this->defeatedLimbPositions[j].x;
pos.y = Rand_CenteredFloat(10.0f) + this->defeatedLimbPositions[j].y; pos.y = Rand_CenteredFloat(10.0f) + this->defeatedLimbPositions[j].y;
@ -1036,7 +1036,7 @@ void BossGoma_Defeated(BossGoma* this, GlobalContext* globalCtx) {
for (i = 0; i < 15; i++) { for (i = 0; i < 15; i++) {
//! @bug same as above //! @bug same as above
j = (s16)(Rand_ZeroOne() * 85); j = (s16)(Rand_ZeroOne() * (BOSSGOMA_LIMB_MAX - 1));
if (this->defeatedLimbPositions[j].y < 10000.0f) { if (this->defeatedLimbPositions[j].y < 10000.0f) {
pos.x = Rand_CenteredFloat(20.0f) + this->defeatedLimbPositions[j].x; pos.x = Rand_CenteredFloat(20.0f) + this->defeatedLimbPositions[j].x;
pos.y = Rand_CenteredFloat(10.0f) + this->defeatedLimbPositions[j].y; pos.y = Rand_CenteredFloat(10.0f) + this->defeatedLimbPositions[j].y;
@ -1259,7 +1259,7 @@ void BossGoma_FloorAttackPosture(BossGoma* this, GlobalContext* globalCtx) {
Math_ApproachS(&this->actor.world.rot.y, Actor_WorldYawTowardActor(&this->actor, &PLAYER->actor), 3, 0xBB8); Math_ApproachS(&this->actor.world.rot.y, Actor_WorldYawTowardActor(&this->actor, &PLAYER->actor), 3, 0xBB8);
} }
if (Animation_OnFrame(&this->skelanime, Animation_GetLastFrame(&gGohmaAnim_00C468))) { if (Animation_OnFrame(&this->skelanime, Animation_GetLastFrame(&gGohmaPrepareAttackAnim))) {
if (this->actor.xzDistToPlayer < 250.0f) { if (this->actor.xzDistToPlayer < 250.0f) {
BossGoma_SetupFloorPrepareAttack(this); BossGoma_SetupFloorPrepareAttack(this);
} else { } else {
@ -1309,10 +1309,10 @@ void BossGoma_FloorAttack(BossGoma* this, GlobalContext* globalCtx) {
func_80033E88(&this->actor, globalCtx, 5, 15); func_80033E88(&this->actor, globalCtx, 5, 15);
} }
if (Animation_OnFrame(&this->skelanime, Animation_GetLastFrame(&gGohmaAnim_004318))) { if (Animation_OnFrame(&this->skelanime, Animation_GetLastFrame(&gGohmaAttackAnim))) {
this->actionState = 1; this->actionState = 1;
Animation_Change(&this->skelanime, &gGohmaAnim_004A20, 1.0f, 0.0f, Animation_Change(&this->skelanime, &gGohmaRestAfterAttackAnim, 1.0f, 0.0f,
Animation_GetLastFrame(&gGohmaAnim_004A20), ANIMMODE_LOOP, -1.0f); Animation_GetLastFrame(&gGohmaRestAfterAttackAnim), ANIMMODE_LOOP, -1.0f);
if (this->framesUntilNextAction == 0) { if (this->framesUntilNextAction == 0) {
this->timer = (s16)(Rand_ZeroOne() * 30.0f) + 30; this->timer = (s16)(Rand_ZeroOne() * 30.0f) + 30;
@ -1327,13 +1327,13 @@ void BossGoma_FloorAttack(BossGoma* this, GlobalContext* globalCtx) {
if (this->timer == 0) { if (this->timer == 0) {
this->actionState = 2; this->actionState = 2;
Animation_Change(&this->skelanime, &gGohmaAnim_005330, 1.0f, 0.0f, Animation_Change(&this->skelanime, &gGohmaRecoverAfterAttackAnim, 1.0f, 0.0f,
Animation_GetLastFrame(&gGohmaAnim_005330), ANIMMODE_ONCE, -5.0f); Animation_GetLastFrame(&gGohmaRecoverAfterAttackAnim), ANIMMODE_ONCE, -5.0f);
} }
break; break;
case 2: case 2:
if (Animation_OnFrame(&this->skelanime, Animation_GetLastFrame(&gGohmaAnim_005330))) { if (Animation_OnFrame(&this->skelanime, Animation_GetLastFrame(&gGohmaRecoverAfterAttackAnim))) {
BossGoma_SetupFloorIdle(this); BossGoma_SetupFloorIdle(this);
} }
break; break;
@ -1349,7 +1349,7 @@ void BossGoma_FloorAttack(BossGoma* this, GlobalContext* globalCtx) {
void BossGoma_FloorDamaged(BossGoma* this, GlobalContext* globalCtx) { void BossGoma_FloorDamaged(BossGoma* this, GlobalContext* globalCtx) {
SkelAnime_Update(&this->skelanime); SkelAnime_Update(&this->skelanime);
if (Animation_OnFrame(&this->skelanime, Animation_GetLastFrame(&gGohmaAnim_006E60))) { if (Animation_OnFrame(&this->skelanime, Animation_GetLastFrame(&gGohmaDamageAnim))) {
BossGoma_SetupFloorStunned(this); BossGoma_SetupFloorStunned(this);
this->patienceTimer = 0; this->patienceTimer = 0;
} }
@ -1468,19 +1468,19 @@ void BossGoma_CeilingSpawnGohmas(BossGoma* this, GlobalContext* globalCtx) {
switch (this->spawnGohmasActionTimer) { switch (this->spawnGohmasActionTimer) {
case 24: case 24:
// limb 14, the tail limb closest to the body // BOSSGOMA_LIMB_TAIL1, the tail limb closest to the body
this->tailLimbsScaleTimers[3] = 10; this->tailLimbsScaleTimers[3] = 10;
break; break;
case 32: case 32:
// limb 13 // BOSSGOMA_LIMB_TAIL2
this->tailLimbsScaleTimers[2] = 10; this->tailLimbsScaleTimers[2] = 10;
break; break;
case 40: case 40:
// limb 12 // BOSSGOMA_LIMB_TAIL3
this->tailLimbsScaleTimers[1] = 10; this->tailLimbsScaleTimers[1] = 10;
break; break;
case 48: case 48:
// limb 11, the furthest from the body // BOSSGOMA_LIMB_TAIL4, the furthest from the body
this->tailLimbsScaleTimers[0] = 10; this->tailLimbsScaleTimers[0] = 10;
break; break;
} }
@ -1958,7 +1958,7 @@ s32 BossGoma_OverrideLimbDraw(GlobalContext* globalCtx, s32 limbIndex, Gfx** dLi
} }
switch (limbIndex) { switch (limbIndex) {
case 5: // eye (lens) case BOSSGOMA_LIMB_EYE:
if (this->eyeState == EYESTATE_IRIS_FOLLOW_BONUS_IFRAMES && this->eyeLidBottomRotX < -0xA8C) { if (this->eyeState == EYESTATE_IRIS_FOLLOW_BONUS_IFRAMES && this->eyeLidBottomRotX < -0xA8C) {
*dList = NULL; *dList = NULL;
} else if (this->invincibilityFrames != 0) { } else if (this->invincibilityFrames != 0) {
@ -1970,20 +1970,20 @@ s32 BossGoma_OverrideLimbDraw(GlobalContext* globalCtx, s32 limbIndex, Gfx** dLi
} }
break; break;
case 32: // eyelid (bottom) case BOSSGOMA_LIMB_EYE_LID_BOTTOM_ROOT2:
rot->x += this->eyeLidBottomRotX; rot->x += this->eyeLidBottomRotX;
break; break;
case 35: // eyelid (top) case BOSSGOMA_LIMB_EYE_LID_TOP_ROOT2:
rot->x += this->eyeLidTopRotX; rot->x += this->eyeLidTopRotX;
break; break;
case 38: // eye (iris) (parent of 39) case BOSSGOMA_LIMB_IRIS_ROOT2:
rot->x += this->eyeIrisRotX; rot->x += this->eyeIrisRotX;
rot->y += this->eyeIrisRotY; rot->y += this->eyeIrisRotY;
break; break;
case 39: // eye (iris) case BOSSGOMA_LIMB_IRIS:
if (this->eyeState == EYESTATE_IRIS_FOLLOW_BONUS_IFRAMES && this->eyeLidBottomRotX < -0xA8C) { if (this->eyeState == EYESTATE_IRIS_FOLLOW_BONUS_IFRAMES && this->eyeLidBottomRotX < -0xA8C) {
*dList = NULL; *dList = NULL;
} else { } else {
@ -2008,17 +2008,17 @@ s32 BossGoma_OverrideLimbDraw(GlobalContext* globalCtx, s32 limbIndex, Gfx** dLi
} }
break; break;
// tail parts case BOSSGOMA_LIMB_TAIL4:
case 11: case BOSSGOMA_LIMB_TAIL3:
case 12: case BOSSGOMA_LIMB_TAIL2:
case 13: case BOSSGOMA_LIMB_TAIL1:
case 14:
Matrix_JointPosition(pos, rot); Matrix_JointPosition(pos, rot);
if (*dList != NULL) { if (*dList != NULL) {
Matrix_Push(); Matrix_Push();
Matrix_Scale(this->tailLimbsScale[limbIndex - 11], this->tailLimbsScale[limbIndex - 11], Matrix_Scale(this->tailLimbsScale[limbIndex - BOSSGOMA_LIMB_TAIL4],
this->tailLimbsScale[limbIndex - 11], MTXMODE_APPLY); this->tailLimbsScale[limbIndex - BOSSGOMA_LIMB_TAIL4],
this->tailLimbsScale[limbIndex - BOSSGOMA_LIMB_TAIL4], MTXMODE_APPLY);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx, "../z_boss_goma.c", 4836), gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx, "../z_boss_goma.c", 4836),
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, *dList); gSPDisplayList(POLY_OPA_DISP++, *dList);
@ -2046,15 +2046,15 @@ void BossGoma_PostLimbDraw(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList,
s32 pad; s32 pad;
MtxF mtx; MtxF mtx;
if (limbIndex == 11) { // tail end/last part if (limbIndex == BOSSGOMA_LIMB_TAIL4) { // tail end/last part
Matrix_MultVec3f(&tailZero, &this->lastTailLimbWorldPos); Matrix_MultVec3f(&tailZero, &this->lastTailLimbWorldPos);
} else if (limbIndex == 14) { // tail start/first part } else if (limbIndex == BOSSGOMA_LIMB_TAIL1) { // tail start/first part
Matrix_MultVec3f(&tailZero, &this->firstTailLimbWorldPos); Matrix_MultVec3f(&tailZero, &this->firstTailLimbWorldPos);
} else if (limbIndex == 5) { // eye (lens) } else if (limbIndex == BOSSGOMA_LIMB_EYE) {
Matrix_MultVec3f(&focusEyeLocalPos, &this->actor.focus.pos); Matrix_MultVec3f(&focusEyeLocalPos, &this->actor.focus.pos);
} else if (limbIndex == 21) { // back of right claw/hand } else if (limbIndex == BOSSGOMA_LIMB_R_FEET_BACK) {
Matrix_MultVec3f(&clawBackLocalPos, &this->rightHandBackLimbWorldPos); Matrix_MultVec3f(&clawBackLocalPos, &this->rightHandBackLimbWorldPos);
} else if (limbIndex == 73) { // back of left claw/hand } else if (limbIndex == BOSSGOMA_LIMB_L_FEET_BACK) {
Matrix_MultVec3f(&clawBackLocalPos, &this->leftHandBackLimbWorldPos); Matrix_MultVec3f(&clawBackLocalPos, &this->leftHandBackLimbWorldPos);
} }

View file

@ -8,6 +8,96 @@ struct BossGoma;
typedef void (*BossGomaActionFunc)(struct BossGoma*, GlobalContext*); typedef void (*BossGomaActionFunc)(struct BossGoma*, GlobalContext*);
typedef enum {
/* 0 */ BOSSGOMA_LIMB_NONE,
/* 1 */ BOSSGOMA_LIMB_ROOT1,
/* 2 */ BOSSGOMA_LIMB_ROOT2,
/* 3 */ BOSSGOMA_LIMB_BODY,
/* 4 */ BOSSGOMA_LIMB_BODY_SHELL,
/* 5 */ BOSSGOMA_LIMB_EYE,
/* 6 */ BOSSGOMA_LIMB_TAIL_ROOT,
/* 7 */ BOSSGOMA_LIMB_TAIL1_ROOT,
/* 8 */ BOSSGOMA_LIMB_TAIL2_ROOT,
/* 9 */ BOSSGOMA_LIMB_TAIL3_ROOT,
/* 10 */ BOSSGOMA_LIMB_TAIL4_ROOT,
/* 11 */ BOSSGOMA_LIMB_TAIL4,
/* 12 */ BOSSGOMA_LIMB_TAIL3,
/* 13 */ BOSSGOMA_LIMB_TAIL2,
/* 14 */ BOSSGOMA_LIMB_TAIL1,
/* 15 */ BOSSGOMA_LIMB_R_LEG_ROOT,
/* 16 */ BOSSGOMA_LIMB_R_THIGH_ROOT,
/* 17 */ BOSSGOMA_LIMB_R_LEG_LOWER_ROOT,
/* 18 */ BOSSGOMA_LIMB_R_FEET_ROOT,
/* 19 */ BOSSGOMA_LIMB_R_FEET_BACK_ROOT1,
/* 20 */ BOSSGOMA_LIMB_R_FEET_BACK_ROOT2,
/* 21 */ BOSSGOMA_LIMB_R_FEET_BACK,
/* 22 */ BOSSGOMA_LIMB_R_FEET,
/* 23 */ BOSSGOMA_LIMB_R_SHIN,
/* 24 */ BOSSGOMA_LIMB_R_KNEE_ROOT1,
/* 25 */ BOSSGOMA_LIMB_R_KNEE_ROOT2,
/* 26 */ BOSSGOMA_LIMB_R_KNEE,
/* 27 */ BOSSGOMA_LIMB_R_THIGH_SHELL_ROOT1,
/* 28 */ BOSSGOMA_LIMB_R_THIGH_SHELL_ROOT2,
/* 29 */ BOSSGOMA_LIMB_R_THIGH_SHELL,
/* 30 */ BOSSGOMA_LIMB_R_THIGH,
/* 31 */ BOSSGOMA_LIMB_EYE_LID_BOTTOM_ROOT1,
/* 32 */ BOSSGOMA_LIMB_EYE_LID_BOTTOM_ROOT2,
/* 33 */ BOSSGOMA_LIMB_EYE_LID_BOTTOM,
/* 34 */ BOSSGOMA_LIMB_EYE_LID_TOP_ROOT1,
/* 35 */ BOSSGOMA_LIMB_EYE_LID_TOP_ROOT2,
/* 36 */ BOSSGOMA_LIMB_EYE_LID_TOP,
/* 37 */ BOSSGOMA_LIMB_IRIS_ROOT1,
/* 38 */ BOSSGOMA_LIMB_IRIS_ROOT2,
/* 39 */ BOSSGOMA_LIMB_IRIS,
/* 40 */ BOSSGOMA_LIMB_MANDIBLES_ROOT1,
/* 41 */ BOSSGOMA_LIMB_MANDIBLES_ROOT2,
/* 42 */ BOSSGOMA_LIMB_MANDIBLES_BODY,
/* 43 */ BOSSGOMA_LIMB_L_MANDIBLES_ROOT,
/* 44 */ BOSSGOMA_LIMB_L_MANDIBLES1_ROOT,
/* 45 */ BOSSGOMA_LIMB_L_MANDIBLES2_ROOT,
/* 46 */ BOSSGOMA_LIMB_L_MANDIBLES2,
/* 47 */ BOSSGOMA_LIMB_L_MANDIBLES1,
/* 48 */ BOSSGOMA_LIMB_R_MANDIBLES_ROOT,
/* 49 */ BOSSGOMA_LIMB_R_MANDIBLES1_ROOT,
/* 50 */ BOSSGOMA_LIMB_R_MANDIBLES2_ROOT,
/* 51 */ BOSSGOMA_LIMB_R_MANDIBLES2,
/* 52 */ BOSSGOMA_LIMB_R_MANDIBLES1,
/* 53 */ BOSSGOMA_LIMB_L_ANTENNA_ROOT,
/* 54 */ BOSSGOMA_LIMB_L_ANTENNA_BODY_ROOT,
/* 55 */ BOSSGOMA_LIMB_L_ANTENNA_SHELL_ROOT,
/* 56 */ BOSSGOMA_LIMB_L_ANTENNA_CLAW_ROOT,
/* 57 */ BOSSGOMA_LIMB_L_ANTENNA_CLAW,
/* 58 */ BOSSGOMA_LIMB_L_ANTENNA_SHELL,
/* 59 */ BOSSGOMA_LIMB_L_ANTENNA_BODY,
/* 60 */ BOSSGOMA_LIMB_R_ANTENNA_ROOT,
/* 61 */ BOSSGOMA_LIMB_R_ANTENNA_BODY_ROOT,
/* 62 */ BOSSGOMA_LIMB_R_ANTENNA_SHELL_ROOT,
/* 63 */ BOSSGOMA_LIMB_R_ANTENNA_CLAW_ROOT,
/* 64 */ BOSSGOMA_LIMB_R_ANTENNA_CLAW,
/* 65 */ BOSSGOMA_LIMB_R_ANTENNA_SHELL,
/* 66 */ BOSSGOMA_LIMB_R_ANTENNA_BODY,
/* 67 */ BOSSGOMA_LIMB_L_LEG_ROOT,
/* 68 */ BOSSGOMA_LIMB_L_THIGH_ROOT,
/* 69 */ BOSSGOMA_LIMB_L_LEG_LOWER_ROOT,
/* 70 */ BOSSGOMA_LIMB_L_FEET_ROOT,
/* 71 */ BOSSGOMA_LIMB_L_FEET_BACK_ROOT1,
/* 72 */ BOSSGOMA_LIMB_L_FEET_BACK_ROOT2,
/* 73 */ BOSSGOMA_LIMB_L_FEET_BACK,
/* 74 */ BOSSGOMA_LIMB_L_FEET,
/* 75 */ BOSSGOMA_LIMB_L_SHIN,
/* 76 */ BOSSGOMA_LIMB_L_KNEE_ROOT1,
/* 77 */ BOSSGOMA_LIMB_L_KNEE_ROOT2,
/* 78 */ BOSSGOMA_LIMB_L_KNEE,
/* 79 */ BOSSGOMA_LIMB_L_THIGH_SHELL_ROOT1,
/* 80 */ BOSSGOMA_LIMB_L_THIGH_SHELL_ROOT2,
/* 81 */ BOSSGOMA_LIMB_L_THIGH_SHELL,
/* 82 */ BOSSGOMA_LIMB_L_THIGH,
/* 83 */ BOSSGOMA_LIMB_BODY_SHELL_BACK_ROOT1,
/* 84 */ BOSSGOMA_LIMB_BODY_SHELL_BACK_ROOT2,
/* 85 */ BOSSGOMA_LIMB_BODY_SHELL_BACK,
/* 86 */ BOSSGOMA_LIMB_MAX
} BossGomaLimb;
typedef struct BossGoma { typedef struct BossGoma {
/* 0x0000 */ Actor actor; /* 0x0000 */ Actor actor;
/* 0x014C */ SkelAnime skelanime; /* 0x014C */ SkelAnime skelanime;