1
0
mirror of https://github.com/zeldaret/oot.git synced 2024-09-21 04:24:43 +00:00

Document all non-Koume/Kotake parts of object_tw (#1401)

* Document all non-Koume/Kotake parts of object_tw

* Fix the names of two textures I accidentally swapped
This commit is contained in:
Tom Overton 2022-10-12 12:56:28 -07:00 committed by GitHub
parent a6276fb5c1
commit c3dc299448
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 457 additions and 335 deletions

View File

@ -1,17 +1,18 @@
<Root>
<File Name="object_tw" Segment="6">
<Animation Name="object_tw_Anim_0004A4" Offset="0x4A4"/>
<Animation Name="object_tw_Anim_000AAC" Offset="0xAAC"/>
<Animation Name="object_tw_Anim_0012A4" Offset="0x12A4"/>
<Animation Name="object_tw_Anim_0017E0" Offset="0x17E0"/>
<Animation Name="object_tw_Anim_001D10" Offset="0x1D10"/>
<Animation Name="object_tw_Anim_00230C" Offset="0x230C"/>
<Animation Name="object_tw_Anim_003614" Offset="0x3614"/>
<Animation Name="object_tw_Anim_003E34" Offset="0x3E34"/>
<Animation Name="object_tw_Anim_004548" Offset="0x4548"/>
<Animation Name="object_tw_Anim_00578C" Offset="0x578C"/>
<Animation Name="object_tw_Anim_006530" Offset="0x6530"/>
<Animation Name="object_tw_Anim_006F28" Offset="0x6F28"/>
<Animation Name="object_tw_Anim_0004A4" Offset="0x4A4"/> <!-- Original name is "btT_DEMOwait" -->
<Animation Name="object_tw_Anim_000AAC" Offset="0xAAC"/> <!-- Original name is "btT_DEMOwait_to_fly" -->
<Animation Name="object_tw_Anim_0012A4" Offset="0x12A4"/> <!-- Original name is "btT_EDikari" ("anger; rage; fury") -->
<Animation Name="object_tw_Anim_0017E0" Offset="0x17E0"/> <!-- Original name is "btT_EDmiage" ("to look up at; to raise one's eyes") -->
<Animation Name="object_tw_Anim_001D10" Offset="0x1D10"/> <!-- Original name is "btT_EDwait" -->
<Animation Name="object_tw_Anim_00230C" Offset="0x230C"/> <!-- Original name is "btT_EDyaruki" ("drive; motivation; enthusiasm") -->
<Animation Name="object_tw_Anim_003614" Offset="0x3614"/> <!-- Original name is "btT_atack" -->
<Animation Name="object_tw_Anim_003E34" Offset="0x3E34"/> <!-- Original name is "btT_beeem" -->
<Animation Name="object_tw_Anim_004548" Offset="0x4548"/> <!-- Original name is "btT_beeem_to_fly" -->
<Animation Name="object_tw_Anim_00578C" Offset="0x578C"/> <!-- Original name is "btT_damage01" -->
<Animation Name="object_tw_Anim_006530" Offset="0x6530"/> <!-- Original name is "btT_damage02" -->
<Animation Name="object_tw_Anim_006F28" Offset="0x6F28"/> <!-- Original name is "btT_fly" -->
<Limb Name="object_tw_Limb_006F40" LimbType="Standard" Offset="0x6F40"/>
<Limb Name="object_tw_Limb_006F4C" LimbType="Standard" Offset="0x6F4C"/>
<Limb Name="object_tw_Limb_006F58" LimbType="Standard" Offset="0x6F58"/>
@ -38,37 +39,40 @@
<Limb Name="object_tw_Limb_007054" LimbType="Standard" Offset="0x7054"/>
<Limb Name="object_tw_Limb_007060" LimbType="Standard" Offset="0x7060"/>
<Limb Name="object_tw_Limb_00706C" LimbType="Standard" Offset="0x706C"/>
<Skeleton Name="object_tw_Skel_0070E0" Type="Flex" LimbType="Standard" Offset="0x70E0"/>
<Animation Name="object_tw_Anim_007688" Offset="0x7688"/>
<Animation Name="object_tw_Anim_007CA8" Offset="0x7CA8"/>
<Animation Name="object_tw_Anim_0088C8" Offset="0x88C8"/>
<Animation Name="object_tw_Anim_009398" Offset="0x9398"/>
<Animation Name="object_tw_Anim_007688" Offset="0x7688"/> <!-- Original name is "btT_fly_to_tame" -->
<Animation Name="object_tw_Anim_007CA8" Offset="0x7CA8"/> <!-- Original name is "btT_guard" -->
<Animation Name="object_tw_Anim_0088C8" Offset="0x88C8"/> <!-- Original name is "btT_hihihi" -->
<Animation Name="object_tw_Anim_009398" Offset="0x9398"/> <!-- Original name is "btT_tame" ("to amass; to accumulate") -->
<Animation Name="object_tw_Anim_00947C" Offset="0x947C"/>
<!--Blob Name="object_tw_Blob_00948C" Size="0x4" Offset="0x948C" /-->
<Texture Name="object_tw_TLUT_009490" OutName="tlut_009490" Format="rgba16" Width="53" Height="4" Offset="0x9490"/>
<Texture Name="object_tw_Tex_009638" OutName="tex_009638" Format="rgba16" Width="32" Height="32" Offset="0x9638"/>
<Texture Name="object_tw_Tex_009E38" OutName="tex_009E38" Format="rgba16" Width="16" Height="16" Offset="0x9E38"/>
<Texture Name="object_tw_Tex_00A038" OutName="tex_00A038" Format="rgba16" Width="16" Height="16" Offset="0xA038"/>
<Texture Name="object_tw_Tex_00A238" OutName="tex_00A238" Format="rgba16" Width="16" Height="16" Offset="0xA238"/>
<Texture Name="gTwinrovaKotakeGerudoFabricTex" OutName="twinrova_kotake_gerudo_fabric" Format="rgba16" Width="32" Height="32" Offset="0x9638"/>
<Texture Name="gTwinrovaKotakeRobeTex" OutName="twinrova_kotake_robe" Format="rgba16" Width="16" Height="16" Offset="0x9E38"/>
<Texture Name="gTwinrovaRobePatternTex" OutName="twinrova_robe_pattern" Format="rgba16" Width="16" Height="16" Offset="0xA038"/>
<Texture Name="gTwinrovaRobeTrimTex" OutName="twinrova_robe_trim" Format="rgba16" Width="16" Height="16" Offset="0xA238"/>
<Texture Name="object_tw_Tex_00A438" OutName="tex_00A438" Format="ci8" Width="32" Height="32" Offset="0xA438" TlutOffset="0x9490"/>
<Texture Name="object_tw_Tex_00A838" OutName="tex_00A838" Format="ci8" Width="16" Height="8" Offset="0xA838" TlutOffset="0x9490"/>
<Texture Name="object_tw_Tex_00A8B8" OutName="tex_00A8B8" Format="ci8" Width="8" Height="8" Offset="0xA8B8" TlutOffset="0x9490"/>
<Texture Name="object_tw_Tex_00A8F8" OutName="tex_00A8F8" Format="rgba16" Width="8" Height="32" Offset="0xA8F8"/>
<Texture Name="object_tw_Tex_00A838" OutName="tex_00A838" Format="ci8" Width="16" Height="8" Offset="0xA838" TlutOffset="0x9490"/>
<Texture Name="object_tw_Tex_00A8B8" OutName="tex_00A8B8" Format="ci8" Width="8" Height="8" Offset="0xA8B8" TlutOffset="0x9490"/>
<Texture Name="gTwinrovaHairTex" OutName="twinrova_hair" Format="rgba16" Width="8" Height="32" Offset="0xA8F8"/>
<Texture Name="object_tw_Tex_00AAF8" OutName="tex_00AAF8" Format="ci8" Width="8" Height="8" Offset="0xAAF8" TlutOffset="0x9490"/>
<Texture Name="object_tw_Tex_00AB38" OutName="tex_00AB38" Format="ci8" Width="8" Height="16" Offset="0xAB38" TlutOffset="0x9490"/>
<Texture Name="object_tw_Tex_00ABB8" OutName="tex_00ABB8" Format="rgba16" Width="8" Height="8" Offset="0xABB8"/>
<Texture Name="object_tw_Tex_00AC38" OutName="tex_00AC38" Format="rgba16" Width="16" Height="32" Offset="0xAC38"/>
<Texture Name="gTwinrovaBroomHandleTex" OutName="twinrova_broom_handle" Format="rgba16" Width="8" Height="8" Offset="0xABB8"/>
<Texture Name="gTwinrovaBroomHeadTex" OutName="twinrova_broom_head" Format="rgba16" Width="16" Height="32" Offset="0xAC38"/>
<Texture Name="object_tw_Tex_00B038" OutName="tex_00B038" Format="rgba16" Width="16" Height="8" Offset="0xB038"/>
<Texture Name="object_tw_Tex_00B138" OutName="tex_00B138" Format="rgba16" Width="8" Height="8" Offset="0xB138"/>
<Texture Name="object_tw_Tex_00B1B8" OutName="tex_00B1B8" Format="ci8" Width="8" Height="8" Offset="0xB1B8" TlutOffset="0x9490"/>
<Texture Name="object_tw_Tex_00B1F8" OutName="tex_00B1F8" Format="ci8" Width="8" Height="8" Offset="0xB1F8" TlutOffset="0x9490"/>
<Texture Name="gTwinrovaKotakeJewelTex" OutName="twinrova_kotake_jewel" Format="rgba16" Width="8" Height="8" Offset="0xB138"/>
<Texture Name="object_tw_Tex_00B1B8" OutName="tex_00B1B8" Format="ci8" Width="8" Height="8" Offset="0xB1B8" TlutOffset="0x9490"/>
<Texture Name="object_tw_Tex_00B1F8" OutName="tex_00B1F8" Format="ci8" Width="8" Height="8" Offset="0xB1F8" TlutOffset="0x9490"/>
<Texture Name="object_tw_Tex_00B238" OutName="tex_00B238" Format="ci8" Width="32" Height="32" Offset="0xB238" TlutOffset="0x9490"/>
<Texture Name="object_tw_Tex_00B638" OutName="tex_00B638" Format="ci8" Width="32" Height="32" Offset="0xB638" TlutOffset="0x9490"/>
<Texture Name="object_tw_Tex_00BA38" OutName="tex_00BA38" Format="i8" Width="32" Height="32" Offset="0xBA38"/>
<Texture Name="object_tw_Tex_00BE38" OutName="tex_00BE38" Format="i4" Width="32" Height="64" Offset="0xBE38"/>
<Texture Name="object_tw_Tex_00C238" OutName="tex_00C238" Format="rgba16" Width="32" Height="32" Offset="0xC238"/>
<Texture Name="object_tw_Tex_00CA38" OutName="tex_00CA38" Format="rgba16" Width="8" Height="8" Offset="0xCA38"/>
<Texture Name="object_tw_Tex_00CAB8" OutName="tex_00CAB8" Format="rgba16" Width="16" Height="16" Offset="0xCAB8"/>
<Texture Name="gTwinrovaEffectTex" OutName="twinrova_effect" Format="i8" Width="32" Height="32" Offset="0xBA38"/>
<Texture Name="gTwinrovaEffectMaskTex" OutName="twinrova_effect_mask" Format="i4" Width="32" Height="64" Offset="0xBE38"/>
<Texture Name="gTwinrovaKoumeGerudoFabricTex" OutName="twinrova_koume_gerudo_fabric" Format="rgba16" Width="32" Height="32" Offset="0xC238"/>
<Texture Name="gTwinrovaKoumeJewelTex" OutName="twinrova_koume_jewel" Format="rgba16" Width="8" Height="8" Offset="0xCA38"/>
<Texture Name="gTwinrovaKoumeRobeTex" OutName="twinrova_koume_robe" Format="rgba16" Width="16" Height="16" Offset="0xCAB8"/>
<DList Name="object_tw_DL_0110A8" Offset="0x110A8"/>
<DList Name="object_tw_DL_0116A0" Offset="0x116A0"/>
<DList Name="object_tw_DL_011C98" Offset="0x11C98"/>
@ -115,8 +119,8 @@
<DList Name="object_tw_DL_0164C0" Offset="0x164C0"/>
<DList Name="object_tw_DL_0164C8" Offset="0x164C8"/>
<DList Name="object_tw_DL_0164D0" Offset="0x164D0"/>
<Texture Name="object_tw_Tex_016650" OutName="tex_016650" Format="rgba16" Width="8" Height="8" Offset="0x16650"/>
<Texture Name="object_tw_Tex_0166D0" OutName="tex_0166D0" Format="rgba16" Width="4" Height="8" Offset="0x166D0"/>
<Texture Name="gTwinrovaBraidEndTex" OutName="twinrova_braid_end" Format="rgba16" Width="8" Height="8" Offset="0x16650"/>
<Texture Name="gTwinrovaLeftFootTex" OutName="twinrova_left_foot" Format="rgba16" Width="4" Height="8" Offset="0x166D0"/>
<!--Blob Name="object_tw_Blob_0176D0" Size="0x60" Offset="0x176D0" /-->
<DList Name="object_tw_DL_017910" Offset="0x17910"/>
<DList Name="object_tw_DL_017A08" Offset="0x17A08"/>
@ -135,51 +139,96 @@
<DList Name="object_tw_DL_018990" Offset="0x18990"/>
<DList Name="object_tw_DL_018998" Offset="0x18998"/>
<DList Name="object_tw_DL_0189A0" Offset="0x189A0"/>
<Texture Name="object_tw_Tex_018B20" OutName="tex_018B20" Format="rgba16" Width="4" Height="8" Offset="0x18B20"/>
<Texture Name="object_tw_Tex_018B60" OutName="tex_018B60" Format="i4" Width="32" Height="64" Offset="0x18B60"/>
<DList Name="object_tw_DL_018FC0" Offset="0x18FC0"/> <!-- Koume Ground Smoke -->
<Texture Name="object_tw_Tex_019078" OutName="tex_019078" Format="i8" Width="32" Height="32" Offset="0x19078"/>
<Texture Name="object_tw_Tex_019478" OutName="tex_019478" Format="i4" Width="32" Height="64" Offset="0x19478"/>
<DList Name="object_tw_DL_019938" Offset="0x19938"/> <!-- koume Ground Flame -->
<Texture Name="object_tw_Tex_019A20" OutName="tex_019A20" Format="i4" Width="32" Height="32" Offset="0x19A20"/>
<DList Name="object_tw_DL_019D40" Offset="0x19D40"/> <!-- Koume Ground Crater -->
<Texture Name="object_tw_Tex_019E00" OutName="tex_019E00" Format="i4" Width="32" Height="64" Offset="0x19E00"/>
<Texture Name="object_tw_Tex_01A200" OutName="tex_01A200" Format="i4" Width="32" Height="32" Offset="0x1A200"/>
<DList Name="object_tw_DL_01A430" Offset="0x1A430"/>
<DList Name="object_tw_DL_01A528" Offset="0x1A528"/>
<DList Name="object_tw_DL_01A5A8" Offset="0x1A5A8"/>
<Texture Name="object_tw_Tex_01A5C0" OutName="tex_01A5C0" Format="i8" Width="16" Height="16" Offset="0x1A5C0"/>
<DList Name="object_tw_DL_01A790" Offset="0x1A790"/>
<DList Name="object_tw_DL_01A8A0" Offset="0x1A8A0"/>
<DList Name="object_tw_DL_01A998" Offset="0x1A998"/>
<DList Name="object_tw_DL_01AA50" Offset="0x1AA50"/>
<DList Name="object_tw_DL_01AB00" Offset="0x1AB00"/>
<Texture Name="object_tw_Tex_01AB20" OutName="tex_01AB20" Format="i8" Width="64" Height="64" Offset="0x1AB20"/>
<!--Blob Name="object_tw_Blob_01BB20" Size="0x40" Offset="0x1BB20" /-->
<DList Name="object_tw_DL_01BC00" Offset="0x1BC00"/>
<Texture Name="object_tw_Tex_01BCA0" OutName="tex_01BCA0" Format="i4" Width="32" Height="64" Offset="0x1BCA0"/>
<Texture Name="object_tw_Tex_01C0A0" OutName="tex_01C0A0" Format="i4" Width="16" Height="16" Offset="0x1C0A0"/>
<DList Name="object_tw_DL_01C1C0" Offset="0x1C1C0"/>
<Texture Name="object_tw_Tex_01C2A0" OutName="tex_01C2A0" Format="i4" Width="32" Height="64" Offset="0x1C2A0"/>
<Texture Name="object_tw_Tex_01C6A0" OutName="tex_01C6A0" Format="i4" Width="64" Height="64" Offset="0x1C6A0"/>
<DList Name="object_tw_DL_01CEE0" Offset="0x1CEE0"/>
<Texture Name="object_tw_Tex_01CFA8" OutName="tex_01CFA8" Format="i4" Width="32" Height="64" Offset="0x1CFA8"/>
<Texture Name="object_tw_Tex_01D3A8" OutName="tex_01D3A8" Format="i4" Width="64" Height="64" Offset="0x1D3A8"/>
<DList Name="object_tw_DL_01DBE8" Offset="0x1DBE8"/>
<DList Name="object_tw_DL_01DDF0" Offset="0x1DDF0"/>
<DList Name="object_tw_DL_01E020" Offset="0x1E020"/>
<DList Name="object_tw_DL_01E0E0" Offset="0x1E0E0"/>
<DList Name="object_tw_DL_01E2C0" Offset="0x1E2C0"/>
<DList Name="object_tw_DL_01E3A0" Offset="0x1E3A0"/>
<Texture Name="object_tw_Tex_01E430" OutName="tex_01E430" Format="i4" Width="32" Height="32" Offset="0x1E430"/>
<DList Name="object_tw_DL_01E9F0" Offset="0x1E9F0"/>
<Texture Name="object_tw_Tex_01EB28" OutName="tex_01EB28" Format="i8" Width="16" Height="16" Offset="0x1EB28"/>
<DList Name="object_tw_DL_01EC68" Offset="0x1EC68"/>
<Texture Name="object_tw_Tex_01ECF0" OutName="tex_01ECF0" Format="i4" Width="16" Height="16" Offset="0x1ECF0"/>
<DList Name="object_tw_DL_01EEB0" Offset="0x1EEB0"/>
<DList Name="object_tw_DL_01F238" Offset="0x1F238"/>
<DList Name="object_tw_DL_01F390" Offset="0x1F390"/>
<DList Name="object_tw_DL_01F608" Offset="0x1F608"/>
<Texture Name="gTwinrovaRightFootTex" OutName="twinrova_right_foot" Format="rgba16" Width="4" Height="8" Offset="0x18B20"/>
<!-- Assets for the smoke that comes off of the big flame -->
<Texture Name="gTwinrovaFireSmokeTex" OutName="twinrova_fire_smoke" Format="i4" Width="32" Height="64" Offset="0x18B60"/>
<DList Name="gTwinrovaFireSmokeDL" Offset="0x18FC0"/> <!-- Original name is "bt_firesmoke_modelT" -->
<!-- Assets for the big flame that appears when Koume's beam or Twinrova's fire attack hits the ground -->
<Texture Name="gTwinrovaBigFlameTex" OutName="twinrova_big_flame" Format="i8" Width="32" Height="32" Offset="0x19078"/>
<Texture Name="gTwinrovaBigFlameMaskTex" OutName="twinrova_big_flame_mask" Format="i4" Width="32" Height="64" Offset="0x19478"/>
<DList Name="gTwinrovaBigFlameDL" Offset="0x19938"/> <!-- Original name is "bt_firewall_modelT" -->
<!-- Texture for both the pool of fire and the effect when the Mirror Shield has absorbed an attack. -->
<Texture Name="gTwinrovaFirePoolAndShieldChargeCenterTex" OutName="twinrova_fire_pool_and_shield_charge_center" Format="i4" Width="32" Height="32" Offset="0x19A20"/>
<!-- DisplayList for the pool of fire that forms when Koume's beam or Twinrova's fire attack hits the ground -->
<DList Name="gTwinrovaFirePoolDL" Offset="0x19D40"/> <!-- Original name is "bt_firefloor_modelT" -->
<!-- Assets for the fire effect that appears in various places -->
<Texture Name="gTwinrovaFireTex" OutName="twinrova_fire" Format="i4" Width="32" Height="64" Offset="0x19E00"/>
<Texture Name="gTwinrovaFireMaskTex" OutName="twinrova_fire_mask" Format="i4" Width="32" Height="32" Offset="0x1A200"/>
<DList Name="gTwinrovaFireDL" Offset="0x1A430"/> <!-- Original name is "bt_fireball_modelT" -->
<!-- Assets for the magic particles that fly off of Koume, Kotake, and Twinrova's head -->
<DList Name="gTwinrovaMagicParticleMaterialDL" Offset="0x1A528"/>
<DList Name="gTwinrovaMagicParticleModelDL" Offset="0x1A5A8"/> <!-- Original name is "bt_hinoko_modelT" ("sparks") -->
<Texture Name="gTwinrovaMagicParticleTex" OutName="twinrova_magic_particle" Format="i8" Width="16" Height="16" Offset="0x1A5C0"/>
<!-- DisplayList for the wave of cold air that comes from the ice pool and the effect that appears on the shield when the player reflects a beam -->
<DList Name="gTwinrovaEffectHaloDL" Offset="0x1A790"/> <!-- Original name is "bt_coolwave_modelT" -->
<!-- DisplayLists for various ice effects -->
<DList Name="gTwinrovaUnusedIceSteamCloudDL" Offset="0x1A8A0"/>
<DList Name="gTwinrovaIceMaterialDL" Offset="0x1A998"/>
<DList Name="gTwinrovaIceSurroundingPlayerMaterialDL" Offset="0x1AA50"/>
<DList Name="gTwinrovaIceModelDL" Offset="0x1AB00"/> <!-- Original name is "bt_coolball_modelT" -->
<!-- Texture for the ice pool -->
<Texture Name="gTwinrovaIcePoolTex" OutName="twinrova_ice_pool" Format="i8" Width="64" Height="64" Offset="0x1AB20"/>
<!-- Unused vertices. Based on its placement, this may have been originally used with the ice pool. -->
<Array Name="gTwinrovaUnusedVtx" Count="4" Offset="0x1BB20">
<Vtx/>
</Array>
<!-- DisplayList for the ice pool -->
<DList Name="gTwinrovaIcePoolDL" Offset="0x1BC00"/> <!-- Not present in OoT3D, but MM's Wizrobe has an identical DList called "wiz_icefloor03_modelT" -->
<!-- Assets for the gleam on top of the ice pool-->
<Texture Name="gTwinrovaIcePoolShineTex" OutName="twinrova_ice_pool_shine" Format="i4" Width="32" Height="64" Offset="0x1BCA0"/>
<Texture Name="gTwinrovaIcePoolShineMaskTex" OutName="twinrova_ice_pool_shine_mask" Format="i4" Width="16" Height="16" Offset="0x1C0A0"/>
<DList Name="gTwinrovaIcePoolShineDL" Offset="0x1C1C0"/> <!-- Original name is "bt_icefloor03_pika_modelT" ("pika" = onomatopoeic for "sparkle, glisten") -->
<!-- Assets for the magical sigils that appear when Kotake/Koume spawn or charge up an attack. -->
<Texture Name="gTwinrovaKotakeMagicSigilMaskTex" OutName="twinrova_kotake_magic_sigil_mask" Format="i4" Width="32" Height="64" Offset="0x1C2A0"/>
<Texture Name="gTwinrovaKotakeMagicSigilTex" OutName="twinrova_kotake_magic_sigil" Format="i4" Width="64" Height="64" Offset="0x1C6A0"/>
<DList Name="gTwinrovaKotakeMagicSigilDL" Offset="0x1CEE0"/> <!-- Original name is "btT_mahoujin_modelT" ("summoning circle; magic circle") -->
<Texture Name="gTwinrovaKoumeMagicSigilMaskTex" OutName="twinrova_koume_magic_sigil_mask" Format="i4" Width="32" Height="64" Offset="0x1CFA8"/>
<Texture Name="gTwinrovaKoumeMagicSigilTex" OutName="twinrova_koume_magic_sigil" Format="i4" Width="64" Height="64" Offset="0x1D3A8"/>
<DList Name="gTwinrovaKoumeMagicSigilDL" Offset="0x1DBE8"/> <!-- Original name is "btU_mahoujin_modelT" -->
<!-- DisplayList for Koume and Kotake's beam -->
<DList Name="gTwinrovaBeamDL" Offset="0x1DDF0"/> <!-- Original name is "bt_firebeam_modelT" -->
<!-- DisplayLists for various Mirror Shield effects -->
<DList Name="gTwinrovaMirrorShieldFireChargeCenterDL" Offset="0x1E020"/>
<DList Name="gTwinrovaMirrorShieldFireChargeSidesDL" Offset="0x1E0E0"/>
<DList Name="gTwinrovaMirrorShieldIceChargeCenterDL" Offset="0x1E2C0"/>
<DList Name="gTwinrovaMirrorShieldIceChargeSidesDL" Offset="0x1E3A0"/>
<!-- Texture for the clouds of ice -->
<Texture Name="gTwinrovaCloudMaskTex" OutName="twinrova_cloud_mask" Format="i4" Width="32" Height="32" Offset="0x1E430"/>
<!-- DisplayList for the effect that appears when the Mirror Shield absorbs Twinrova's attack, or when it unleashes a charged attack -->
<DList Name="gTwinrovaShieldAbsorbAndReflectEffectDL" Offset="0x1E9F0"/> <!-- Original name is "btW_bacuuuum_modelT" -->
<!-- Texture of a circle, used for the spawn portal shadow and the circle of light -->
<Texture Name="gTwinrovaCircleTex" OutName="twinrova_circle" Format="i8" Width="16" Height="16" Offset="0x1EB28"/>
<!-- DisplayList for the "shadow" under Koume and Kotake's spawn portal -->
<DList Name="gTwinrovaSpawnPortalShadowDL" Offset="0x1EC68"/> <!-- Original name is "bt_under_mjin_modelT" -->
<!-- Texture for the light pillar and the halo that appear when Twinrova is defeated -->
<Texture Name="gTwinrovaLightPillarAndHaloTex" OutName="twinrova_light_pillar_and_halo" Format="i4" Width="16" Height="16" Offset="0x1ECF0"/>
<!-- DisplayLists for various effects that appear when Twinrova is defeated -->
<DList Name="gTwinrovaLightPillarDL" Offset="0x1EEB0"/> <!-- Original name is "bt_heavenroad_modelT" -->
<DList Name="gTwinrovaLightRaysDL" Offset="0x1F238"/> <!-- Original name is "bt_gokou_modelT" ("halo; aureole; aureola") -->
<DList Name="gTwinrovaLightCircleDL" Offset="0x1F390"/> <!-- Original name is "bt_heavensgate_modelT" -->
<DList Name="gTwinrovaHaloDL" Offset="0x1F608"/> <!-- Original name is "bt_angelring_model" -->
<Limb Name="object_tw_Limb_01F6E8" LimbType="Standard" Offset="0x1F6E8"/>
<Limb Name="object_tw_Limb_01F6F4" LimbType="Standard" Offset="0x1F6F4"/>
<Limb Name="object_tw_Limb_01F700" LimbType="Standard" Offset="0x1F700"/>
@ -206,127 +255,150 @@
<Limb Name="object_tw_Limb_01F7FC" LimbType="Standard" Offset="0x1F7FC"/>
<Limb Name="object_tw_Limb_01F808" LimbType="Standard" Offset="0x1F808"/>
<Limb Name="object_tw_Limb_01F814" LimbType="Standard" Offset="0x1F814"/>
<Skeleton Name="object_tw_Skel_01F888" Type="Flex" LimbType="Standard" Offset="0x1F888"/>
<Texture Name="object_tw_Tex_02A070" OutName="tex_02A070" Format="ci8" Width="32" Height="32" Offset="0x2A070" TlutOffset="0x29E50"/>
<Animation Name="object_tw_Anim_0216DC" Offset="0x216DC"/>
<Animation Name="object_tw_Anim_022700" Offset="0x22700"/>
<Animation Name="object_tw_Anim_023750" Offset="0x23750"/>
<Animation Name="object_tw_Anim_024374" Offset="0x24374"/>
<Animation Name="object_tw_Anim_0244B4" Offset="0x244B4"/>
<Texture Name="object_tw_Tex_0244D0" OutName="tex_0244D0" Format="rgba16" Width="4" Height="8" Offset="0x244D0"/>
<Texture Name="object_tw_Tex_024510" OutName="tex_024510" Format="rgba16" Width="16" Height="16" Offset="0x24510"/>
<Texture Name="object_tw_Tex_024710" OutName="tex_024710" Format="rgba16" Width="16" Height="16" Offset="0x24710"/>
<Texture Name="object_tw_Tex_024910" OutName="tex_024910" Format="rgba16" Width="16" Height="16" Offset="0x24910"/>
<Texture Name="object_tw_Tex_024B10" OutName="tex_024B10" Format="rgba16" Width="16" Height="16" Offset="0x24B10"/>
<DList Name="object_tw_DL_027720" Offset="0x27720"/>
<DList Name="object_tw_DL_027820" Offset="0x27820"/>
<DList Name="object_tw_DL_027970" Offset="0x27970"/>
<DList Name="object_tw_DL_027A60" Offset="0x27A60"/>
<DList Name="object_tw_DL_027B78" Offset="0x27B78"/>
<DList Name="object_tw_DL_027C98" Offset="0x27C98"/>
<DList Name="object_tw_DL_027DE8" Offset="0x27DE8"/>
<DList Name="object_tw_DL_027EE0" Offset="0x27EE0"/>
<DList Name="object_tw_DL_027FE8" Offset="0x27FE8"/>
<DList Name="object_tw_DL_028100" Offset="0x28100"/>
<DList Name="object_tw_DL_028220" Offset="0x28220"/>
<DList Name="object_tw_DL_028370" Offset="0x28370"/>
<DList Name="object_tw_DL_028468" Offset="0x28468"/>
<DList Name="object_tw_DL_028570" Offset="0x28570"/>
<DList Name="object_tw_DL_028668" Offset="0x28668"/>
<DList Name="object_tw_DL_028778" Offset="0x28778"/>
<DList Name="object_tw_DL_028870" Offset="0x28870"/>
<DList Name="object_tw_DL_028980" Offset="0x28980"/>
<DList Name="object_tw_DL_028B78" Offset="0x28B78"/>
<DList Name="object_tw_DL_028D70" Offset="0x28D70"/>
<DList Name="object_tw_DL_029268" Offset="0x29268"/>
<DList Name="object_tw_DL_0293E0" Offset="0x293E0"/>
<DList Name="object_tw_DL_029530" Offset="0x29530"/>
<DList Name="object_tw_DL_029620" Offset="0x29620"/>
<DList Name="object_tw_DL_029738" Offset="0x29738"/>
<DList Name="object_tw_DL_029900" Offset="0x29900"/>
<DList Name="object_tw_DL_0299F8" Offset="0x299F8"/>
<DList Name="object_tw_DL_029B10" Offset="0x29B10"/>
<Texture Name="object_tw_TLUT_029E50" OutName="tlut_029E50" Format="rgba16" Width="29" Height="8" Offset="0x29E50"/>
<Texture Name="object_tw_TLUT_02A020" OutName="tlut_02A020" Format="rgba16" Width="8" Height="5" Offset="0x2A020"/>
<Texture Name="object_tw_Tex_02A470" OutName="tex_02A470" Format="ci8" Width="32" Height="32" Offset="0x2A470" TlutOffset="0x29E50"/>
<Texture Name="object_tw_Tex_02A870" OutName="tex_02A870" Format="ci8" Width="16" Height="16" Offset="0x2A870" TlutOffset="0x29e50"/>
<Texture Name="object_tw_Tex_02A970" OutName="tex_02A970" Format="rgba16" Width="8" Height="4" Offset="0x2A970"/>
<Texture Name="object_tw_Tex_02A9B0" OutName="tex_02A9B0" Format="ci8" Width="32" Height="32" Offset="0x2A9B0" TlutOffset="0x29E50"/>
<Texture Name="object_tw_Tex_02ADB0" OutName="tex_02ADB0" Format="i8" Width="8" Height="8" Offset="0x2ADB0"/>
<Texture Name="object_tw_Tex_02ADF0" OutName="tex_02ADF0" Format="ci8" Width="8" Height="8" Offset="0x2ADF0" TlutOffset="0x2A020"/>
<Texture Name="object_tw_Tex_02AE30" OutName="tex_02AE30" Format="ci8" Width="16" Height="16" Offset="0x2AE30" TlutOffset="0x29e50"/>
<Texture Name="object_tw_Tex_02AF30" OutName="tex_02AF30" Format="ci8" Width="8" Height="16" Offset="0x2AF30" TlutOffset="0x2A020"/>
<DList Name="object_tw_DL_02CAF0" Offset="0x2CAF0"/>
<DList Name="object_tw_DL_02CB50" Offset="0x2CB50"/>
<DList Name="object_tw_DL_02CBB0" Offset="0x2CBB0"/>
<DList Name="object_tw_DL_02D320" Offset="0x2D320"/>
<DList Name="object_tw_DL_02D4A0" Offset="0x2D4A0"/>
<DList Name="object_tw_DL_02D5D8" Offset="0x2D5D8"/>
<DList Name="object_tw_DL_02D710" Offset="0x2D710"/>
<DList Name="object_tw_DL_02D890" Offset="0x2D890"/>
<DList Name="object_tw_DL_02D940" Offset="0x2D940"/>
<DList Name="object_tw_DL_02D9F0" Offset="0x2D9F0"/>
<DList Name="object_tw_DL_02DAE0" Offset="0x2DAE0"/>
<DList Name="object_tw_DL_02DBC8" Offset="0x2DBC8"/>
<DList Name="object_tw_DL_02DCB8" Offset="0x2DCB8"/>
<DList Name="object_tw_DL_02DDD8" Offset="0x2DDD8"/>
<DList Name="object_tw_DL_02DEB0" Offset="0x2DEB0"/>
<DList Name="object_tw_DL_02DFB0" Offset="0x2DFB0"/>
<DList Name="object_tw_DL_02E098" Offset="0x2E098"/>
<Blob Name="object_tw_Blob_02E170" Size="0x3C00" Offset="0x2E170"/> <!-- boss title card -->
<Limb Name="object_tw_Limb_031D70" LimbType="Standard" Offset="0x31D70"/>
<Limb Name="object_tw_Limb_031D7C" LimbType="Standard" Offset="0x31D7C"/>
<Limb Name="object_tw_Limb_031D88" LimbType="Standard" Offset="0x31D88"/>
<Limb Name="object_tw_Limb_031D94" LimbType="Standard" Offset="0x31D94"/>
<Limb Name="object_tw_Limb_031DA0" LimbType="Standard" Offset="0x31DA0"/>
<Limb Name="object_tw_Limb_031DAC" LimbType="Standard" Offset="0x31DAC"/>
<Limb Name="object_tw_Limb_031DB8" LimbType="Standard" Offset="0x31DB8"/>
<Limb Name="object_tw_Limb_031DC4" LimbType="Standard" Offset="0x31DC4"/>
<Limb Name="object_tw_Limb_031DD0" LimbType="Standard" Offset="0x31DD0"/>
<Limb Name="object_tw_Limb_031DDC" LimbType="Standard" Offset="0x31DDC"/>
<Limb Name="object_tw_Limb_031DE8" LimbType="Standard" Offset="0x31DE8"/>
<Limb Name="object_tw_Limb_031DF4" LimbType="Standard" Offset="0x31DF4"/>
<Limb Name="object_tw_Limb_031E00" LimbType="Standard" Offset="0x31E00"/>
<Limb Name="object_tw_Limb_031E0C" LimbType="Standard" Offset="0x31E0C"/>
<Limb Name="object_tw_Limb_031E18" LimbType="Standard" Offset="0x31E18"/>
<Limb Name="object_tw_Limb_031E24" LimbType="Standard" Offset="0x31E24"/>
<Limb Name="object_tw_Limb_031E30" LimbType="Standard" Offset="0x31E30"/>
<Limb Name="object_tw_Limb_031E3C" LimbType="Standard" Offset="0x31E3C"/>
<Limb Name="object_tw_Limb_031E48" LimbType="Standard" Offset="0x31E48"/>
<Limb Name="object_tw_Limb_031E54" LimbType="Standard" Offset="0x31E54"/>
<Limb Name="object_tw_Limb_031E60" LimbType="Standard" Offset="0x31E60"/>
<Limb Name="object_tw_Limb_031E6C" LimbType="Standard" Offset="0x31E6C"/>
<Limb Name="object_tw_Limb_031E78" LimbType="Standard" Offset="0x31E78"/>
<Limb Name="object_tw_Limb_031E84" LimbType="Standard" Offset="0x31E84"/>
<Limb Name="object_tw_Limb_031E90" LimbType="Standard" Offset="0x31E90"/>
<Limb Name="object_tw_Limb_031E9C" LimbType="Standard" Offset="0x31E9C"/>
<Limb Name="object_tw_Limb_031EA8" LimbType="Standard" Offset="0x31EA8"/>
<Limb Name="object_tw_Limb_031EB4" LimbType="Standard" Offset="0x31EB4"/>
<Limb Name="object_tw_Limb_031EC0" LimbType="Standard" Offset="0x31EC0"/>
<Limb Name="object_tw_Limb_031ECC" LimbType="Standard" Offset="0x31ECC"/>
<Limb Name="object_tw_Limb_031ED8" LimbType="Standard" Offset="0x31ED8"/>
<Limb Name="object_tw_Limb_031EE4" LimbType="Standard" Offset="0x31EE4"/>
<Limb Name="object_tw_Limb_031EF0" LimbType="Standard" Offset="0x31EF0"/>
<Limb Name="object_tw_Limb_031EFC" LimbType="Standard" Offset="0x31EFC"/>
<Limb Name="object_tw_Limb_031F08" LimbType="Standard" Offset="0x31F08"/>
<Limb Name="object_tw_Limb_031F14" LimbType="Standard" Offset="0x31F14"/>
<Limb Name="object_tw_Limb_031F20" LimbType="Standard" Offset="0x31F20"/>
<Limb Name="object_tw_Limb_031F2C" LimbType="Standard" Offset="0x31F2C"/>
<Limb Name="object_tw_Limb_031F38" LimbType="Standard" Offset="0x31F38"/>
<Limb Name="object_tw_Limb_031F44" LimbType="Standard" Offset="0x31F44"/>
<Limb Name="object_tw_Limb_031F50" LimbType="Standard" Offset="0x31F50"/>
<Limb Name="object_tw_Limb_031F5C" LimbType="Standard" Offset="0x31F5C"/>
<Limb Name="object_tw_Limb_031F68" LimbType="Standard" Offset="0x31F68"/>
<Skeleton Name="object_tw_Skel_032020" Type="Flex" LimbType="Standard" Offset="0x32020"/>
<Animation Name="object_tw_Anim_032BF8" Offset="0x32BF8"/>
<Animation Name="object_tw_Anim_0338F0" Offset="0x338F0"/>
<Animation Name="object_tw_Anim_0343B4" Offset="0x343B4"/>
<Animation Name="object_tw_Anim_035030" Offset="0x35030"/>
<Animation Name="object_tw_Anim_035988" Offset="0x35988"/>
<Animation Name="object_tw_Anim_036FBC" Offset="0x36FBC"/>
<Animation Name="object_tw_Anim_038E2C" Offset="0x38E2C"/>
<Animation Name="object_tw_Anim_03A2D0" Offset="0x3A2D0"/>
<DList Name="object_tw_DL_03A680" Offset="0x3A680"/>
<Texture Name="object_tw_Tex_03A7B0" OutName="tex_03A7B0" Format="rgba16" Width="32" Height="32" Offset="0x3A7B0"/>
<!-- Twinrova Texture -->
<Texture Name="gTwinrovaEyeHalfTex" OutName="twinrova_eye_half" Format="ci8" Width="32" Height="32" Offset="0x2A070" TlutOffset="0x29E50"/>
<!-- Twinrova Animations -->
<Animation Name="gTwinrovaDeathAnim" Offset="0x216DC"/> <!-- Original name is "btW_EDdamage" -->
<Animation Name="gTwinrovaIceAttackAnim" Offset="0x22700"/> <!-- Original name is "btW_atackL" -->
<Animation Name="gTwinrovaFireAttackAnim" Offset="0x23750"/> <!-- Original name is "btW_atackR" -->
<Animation Name="gTwinrovaDamageAnim" Offset="0x24374"/> <!-- Original name is "btW_damage" -->
<Animation Name="gTwinrovaTPoseAnim" Offset="0x244B4"/> <!-- Original name is "btW_default" -->
<!-- Twinrova Textures -->
<Texture Name="gTwinrovaSkinAndBangleTex" OutName="twinrova_skin_and_bangle" Format="rgba16" Width="4" Height="8" Offset="0x244D0"/>
<Texture Name="gTwinrovaEmblemTex" OutName="twinrova_emblem" Format="rgba16" Width="16" Height="16" Offset="0x24510"/>
<Texture Name="gTwinrovaBreastTex" OutName="twinrova_breast" Format="rgba16" Width="16" Height="16" Offset="0x24710"/>
<Texture Name="gTwinrovaRightPantLegTex" OutName="twinrova_right_pant_leg" Format="rgba16" Width="16" Height="16" Offset="0x24910"/>
<Texture Name="gTwinrovaLeftPantLegTex" OutName="twinrova_left_pant_leg" Format="rgba16" Width="16" Height="16" Offset="0x24B10"/>
<!-- Twinrova Limb DisplayLists -->
<DList Name="gTwinrovaRightFootDL" Offset="0x27720"/>
<DList Name="gTwinrovaRightShinDL" Offset="0x27820"/>
<DList Name="gTwinrovaRightThighDL" Offset="0x27970"/>
<DList Name="gTwinrovaRightSleeveEndDL" Offset="0x27A60"/>
<DList Name="gTwinrovaRightSleeveStartDL" Offset="0x27B78"/>
<DList Name="gTwinrovaRightForearmDL" Offset="0x27C98"/>
<DList Name="gTwinrovaRightUpperArmDL" Offset="0x27DE8"/>
<DList Name="gTwinrovaRightShoulderDL" Offset="0x27EE0"/>
<DList Name="gTwinrovaLeftSleeveEndDL" Offset="0x27FE8"/>
<DList Name="gTwinrovaLeftSleeveStartDL" Offset="0x28100"/>
<DList Name="gTwinrovaLeftForearmDL" Offset="0x28220"/>
<DList Name="gTwinrovaLeftUpperArmDL" Offset="0x28370"/>
<DList Name="gTwinrovaLeftShoulderDL" Offset="0x28468"/>
<DList Name="gTwinrovaLeftBraidEndDL" Offset="0x28570"/>
<DList Name="gTwinrovaLeftBraidStartDL" Offset="0x28668"/>
<DList Name="gTwinrovaRightBraidEndDL" Offset="0x28778"/>
<DList Name="gTwinrovaRightBraidStartDL" Offset="0x28870"/>
<DList Name="gTwinrovaRightBreastDL" Offset="0x28980"/>
<DList Name="gTwinrovaLeftBreastDL" Offset="0x28B78"/>
<DList Name="gTwinrovaTorsoDL" Offset="0x28D70"/>
<DList Name="gTwinrovaLeftFootDL" Offset="0x29268"/>
<DList Name="gTwinrovaLeftShinDL" Offset="0x293E0"/>
<DList Name="gTwinrovaLeftThighDL" Offset="0x29530"/>
<DList Name="gTwinrovaSash4DL" Offset="0x29620"/>
<DList Name="gTwinrovaSash3DL" Offset="0x29738"/>
<DList Name="gTwinrovaSash2DL" Offset="0x29900"/>
<DList Name="gTwinrovaSash1DL" Offset="0x299F8"/>
<DList Name="gTwinrovaPelvisDL" Offset="0x29B10"/>
<!-- Twinrova Textures -->
<Texture Name="gTwinrovaEyeAndMouthTLUT" OutName="twinrova_eye_and_mouth_tlut" Format="rgba16" Width="29" Height="8" Offset="0x29E50"/>
<Texture Name="gTwinrovaEarAndFingerTLUT" OutName="twinrova_ear_and_finger_tlut" Format="rgba16" Width="8" Height="5" Offset="0x2A020"/>
<Texture Name="gTwinrovaEyeClosedTex" OutName="twinrova_eye_closed" Format="ci8" Width="32" Height="32" Offset="0x2A470" TlutOffset="0x29E50"/>
<Texture Name="gTwinrovaGrimaceTex" OutName="twinrova_grimace" Format="ci8" Width="16" Height="16" Offset="0x2A870" TlutOffset="0x29E50"/>
<Texture Name="gTwinrovaEyebrowTex" OutName="twinrova_eyebrow" Format="rgba16" Width="8" Height="4" Offset="0x2A970"/>
<Texture Name="gTwinrovaEyeOpenTex" OutName="twinrova_eye_open" Format="ci8" Width="32" Height="32" Offset="0x2A9B0" TlutOffset="0x29E50"/>
<Texture Name="gTwinrovaNoseTex" OutName="twinrova_nose" Format="i8" Width="8" Height="8" Offset="0x2ADB0"/>
<Texture Name="gTwinrovaEarTex" OutName="twinrova_ear" Format="ci8" Width="8" Height="8" Offset="0x2ADF0" TlutOffset="0x2A020"/>
<Texture Name="gTwinrovaSmileTex" OutName="twinrova_smile" Format="ci8" Width="16" Height="16" Offset="0x2AE30" TlutOffset="0x29E50"/>
<Texture Name="gTwinrovaFingerTex" OutName="twinrova_finger" Format="ci8" Width="8" Height="16" Offset="0x2AF30" TlutOffset="0x2A020"/>
<!-- Twinrova Limb DisplayLists -->
<DList Name="gTwinrovaInvisibleLeftHairBunDL" Offset="0x2CAF0"/>
<DList Name="gTwinrovaInvisibleRightHairBunDL" Offset="0x2CB50"/>
<DList Name="gTwinrovaHeadDL" Offset="0x2CBB0"/>
<DList Name="gTwinrovaLeftHandDL" Offset="0x2D320"/>
<DList Name="gTwinrovaRightBroomDL" Offset="0x2D4A0"/>
<DList Name="gTwinrovaLeftBroomDL" Offset="0x2D5D8"/>
<DList Name="gTwinrovaRightHandDL" Offset="0x2D710"/>
<DList Name="gTwinrovaRightHairBunDL" Offset="0x2D890"/>
<DList Name="gTwinrovaLeftHairBunDL" Offset="0x2D940"/>
<DList Name="gTwinrovaHairIceJetDL" Offset="0x2D9F0"/>
<DList Name="gTwinrovaHairIceTrailDL" Offset="0x2DAE0"/>
<DList Name="gTwinrovaHairFireJetDL" Offset="0x2DBC8"/>
<DList Name="gTwinrovaHairFireTrailDL" Offset="0x2DCB8"/>
<DList Name="gTwinrovaBroomIceJetDL" Offset="0x2DDD8"/>
<DList Name="gTwinrovaBroomIceTrailDL" Offset="0x2DEB0"/>
<DList Name="gTwinrovaBroomFireJetDL" Offset="0x2DFB0"/>
<DList Name="gTwinrovaBroomFireTrailDL" Offset="0x2E098"/>
<!-- Twinrova Title Card -->
<Texture Name="gTwinrovaTitleCardTex" OutName="twinrova_title_card" Format="i8" Width="128" Height="120" Offset="0x2E170"/>
<!-- Twinrova Limbs -->
<Limb Name="gTwinrovaPelvisLimb" LimbType="Standard" Offset="0x31D70"/>
<Limb Name="gTwinrovaSash1Limb" LimbType="Standard" Offset="0x31D7C"/>
<Limb Name="gTwinrovaSash2Limb" LimbType="Standard" Offset="0x31D88"/>
<Limb Name="gTwinrovaSash3Limb" LimbType="Standard" Offset="0x31D94"/>
<Limb Name="gTwinrovaSash4Limb" LimbType="Standard" Offset="0x31DA0"/>
<Limb Name="gTwinrovaLeftThighLimb" LimbType="Standard" Offset="0x31DAC"/>
<Limb Name="gTwinrovaLeftShinLimb" LimbType="Standard" Offset="0x31DB8"/>
<Limb Name="gTwinrovaLeftFootLimb" LimbType="Standard" Offset="0x31DC4"/>
<Limb Name="gTwinrovaRightThighLimb" LimbType="Standard" Offset="0x31DD0"/>
<Limb Name="gTwinrovaRightShinLimb" LimbType="Standard" Offset="0x31DDC"/>
<Limb Name="gTwinrovaRightFootLimb" LimbType="Standard" Offset="0x31DE8"/>
<Limb Name="gTwinrovaTorsoLimb" LimbType="Standard" Offset="0x31DF4"/>
<Limb Name="gTwinrovaLeftBreastLimb" LimbType="Standard" Offset="0x31E00"/>
<Limb Name="gTwinrovaRightBreastLimb" LimbType="Standard" Offset="0x31E0C"/>
<Limb Name="gTwinrovaHairIceTrailLimb" LimbType="Standard" Offset="0x31E18"/>
<Limb Name="gTwinrovaHairIceJetLimb" LimbType="Standard" Offset="0x31E24"/>
<Limb Name="gTwinrovaHairFireJetLimb" LimbType="Standard" Offset="0x31E30"/>
<Limb Name="gTwinrovaHairFireTrailLimb" LimbType="Standard" Offset="0x31E3C"/>
<Limb Name="gTwinrovaLeftHairBunLimb" LimbType="Standard" Offset="0x31E48"/>
<Limb Name="gTwinrovaRightHairBunLimb" LimbType="Standard" Offset="0x31E54"/>
<Limb Name="gTwinrovaHeadLimb" LimbType="Standard" Offset="0x31E60"/>
<Limb Name="gTwinrovaRightBraidStartLimb" LimbType="Standard" Offset="0x31E6C"/>
<Limb Name="gTwinrovaRightBraidEndLimb" LimbType="Standard" Offset="0x31E78"/>
<Limb Name="gTwinrovaLeftBraidStartLimb" LimbType="Standard" Offset="0x31E84"/>
<Limb Name="gTwinrovaLeftBraidEndLimb" LimbType="Standard" Offset="0x31E90"/>
<Limb Name="gTwinrovaLeftShoulderLimb" LimbType="Standard" Offset="0x31E9C"/>
<Limb Name="gTwinrovaLeftUpperArmLimb" LimbType="Standard" Offset="0x31EA8"/>
<Limb Name="gTwinrovaLeftForearmLimb" LimbType="Standard" Offset="0x31EB4"/>
<Limb Name="gTwinrovaLeftSleeveStartLimb" LimbType="Standard" Offset="0x31EC0"/>
<Limb Name="gTwinrovaLeftSleeveEndLimb" LimbType="Standard" Offset="0x31ECC"/>
<Limb Name="gTwinrovaBroomIceTrailLimb" LimbType="Standard" Offset="0x31ED8"/>
<Limb Name="gTwinrovaBroomIceJetLimb" LimbType="Standard" Offset="0x31EE4"/>
<Limb Name="gTwinrovaLeftHandLimb" LimbType="Standard" Offset="0x31EF0"/>
<Limb Name="gTwinrovaLeftBroomLimb" LimbType="Standard" Offset="0x31EFC"/>
<Limb Name="gTwinrovaRightShoulderLimb" LimbType="Standard" Offset="0x31F08"/>
<Limb Name="gTwinrovaRightUpperArmLimb" LimbType="Standard" Offset="0x31F14"/>
<Limb Name="gTwinrovaRightForearmLimb" LimbType="Standard" Offset="0x31F20"/>
<Limb Name="gTwinrovaRightSleeveStartLimb" LimbType="Standard" Offset="0x31F2C"/>
<Limb Name="gTwinrovaRightSleeveEndLimb" LimbType="Standard" Offset="0x31F38"/>
<Limb Name="gTwinrovaRightBroomLimb" LimbType="Standard" Offset="0x31F44"/>
<Limb Name="gTwinrovaBroomFireJetLimb" LimbType="Standard" Offset="0x31F50"/>
<Limb Name="gTwinrovaBroomFireTrailLimb" LimbType="Standard" Offset="0x31F5C"/>
<Limb Name="gTwinrovaRightHandLimb" LimbType="Standard" Offset="0x31F68"/>
<!-- Twinrova Skeleton -->
<Skeleton Name="gTwinrovaSkel" Type="Flex" LimbType="Standard" Offset="0x32020"/>
<!-- Twinrova Animations -->
<Animation Name="gTwinrovaHoverAnim" Offset="0x32BF8"/> <!-- Original name is "btW_fly" -->
<Animation Name="gTwinrovaChargedAttackHitAnim" Offset="0x338F0"/> <!-- Original name is "btW_hit" -->
<Animation Name="gTwinrovaStunStartAnim" Offset="0x343B4"/> <!-- Original name is "btW_hit_to_mahi" -->
<Animation Name="gTwinrovaStunLoopAnim" Offset="0x35030"/> <!-- Original name is "btW_mahi" ("paralysis, stupor") -->
<Animation Name="gTwinrovaStunEndAnim" Offset="0x35988"/> <!-- Original name is "btW_mahi_to_fly" -->
<Animation Name="gTwinrovaWindUpAnim" Offset="0x36FBC"/> <!-- Original name is "btW_preatack" -->
<Animation Name="gTwinrovaIntroAnim" Offset="0x38E2C"/> <!-- Original name is "btW_start" -->
<Animation Name="gTwinrovaLaughAnim" Offset="0x3A2D0"/> <!-- Original name is "btW_ufufu" ("tee-hee") -->
<!-- Assets for an unused red boulder -->
<DList Name="gTwinrovaUnusedBoulderDL" Offset="0x3A680"/>
<Texture Name="gTwinrovaUnusedBoulderTex" OutName="twinrova_unused_boulder" Format="rgba16" Width="32" Height="32" Offset="0x3A7B0"/>
</File>
</Root>

View File

@ -550,8 +550,8 @@ void BossTw_Init(Actor* thisx, PlayState* play2) {
this->actor.colChkInfo.health = 24;
this->actor.update = BossTw_TwinrovaUpdate;
this->actor.draw = BossTw_TwinrovaDraw;
SkelAnime_InitFlex(play, &this->skelAnime, &object_tw_Skel_032020, &object_tw_Anim_0244B4, NULL, NULL, 0);
Animation_MorphToLoop(&this->skelAnime, &object_tw_Anim_0244B4, -3.0f);
SkelAnime_InitFlex(play, &this->skelAnime, &gTwinrovaSkel, &gTwinrovaTPoseAnim, NULL, NULL, 0);
Animation_MorphToLoop(&this->skelAnime, &gTwinrovaTPoseAnim, -3.0f);
if (GET_EVENTCHKINF(EVENTCHKINF_75)) {
// began twinrova battle
@ -807,7 +807,7 @@ s32 BossTw_BeamHitPlayerCheck(BossTw* this, PlayState* play) {
this->beamDist = sqrtf(SQ(offset.x) + SQ(offset.y) + SQ(offset.z));
func_8002F6D4(play, &this->actor, 3.0f, this->actor.shape.rot.y, 0.0f, 0x20);
if (this->actor.params == 0) {
if (this->actor.params == TW_KOTAKE) {
if (sFreezeState == 0) {
sFreezeState = 1;
}
@ -1038,7 +1038,7 @@ void BossTw_ShootBeam(BossTw* this, PlayState* play) {
Math_ApproachF(&this->spawnPortalAlpha, 0, 1.0f, 30.0f);
} else {
Math_ApproachF(&this->flameAlpha, 255.0f, 1.0f, 10.0f);
if (this->actor.params == 1) {
if (this->actor.params == TW_KOUME) {
Audio_PlayActorSfx2(&this->actor, NA_SE_EN_TWINROBA_MS_FIRE - SFX_FLAG);
} else {
Audio_PlayActorSfx2(&this->actor, NA_SE_EN_TWINROBA_MS_FREEZE - SFX_FLAG);
@ -1132,7 +1132,7 @@ void BossTw_ShootBeam(BossTw* this, PlayState* play) {
SkinMatrix_Vec3fMtxFMultXYZW(&play->viewProjectionMtxF, &this->beamReflectionOrigin, &this->unk_54C,
&this->actor.projectedW);
if (this->actor.params == 1) {
if (this->actor.params == TW_KOUME) {
Audio_PlaySfxGeneral(NA_SE_EN_TWINROBA_SHOOT_FIRE - SFX_FLAG, &this->unk_54C, 4,
&gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
} else {
@ -1162,7 +1162,7 @@ void BossTw_ShootBeam(BossTw* this, PlayState* play) {
SkinMatrix_Vec3fMtxFMultXYZW(&play->viewProjectionMtxF, &this->unk_530, &this->unk_558,
&this->actor.projectedW);
if (this->actor.params == 1) {
if (this->actor.params == TW_KOUME) {
Audio_PlaySfxGeneral(NA_SE_EN_TWINROBA_SHOOT_FIRE - SFX_FLAG, &this->unk_558, 4U,
&gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
Audio_PlaySfxGeneral(NA_SE_EN_TWINROBA_REFL_FIRE - SFX_FLAG, &this->unk_558, 4,
@ -1344,7 +1344,7 @@ void BossTw_SetupHitByBeam(BossTw* this, PlayState* play) {
this->timers[0] = 53;
this->actor.speedXZ = 0.0f;
if (this->actor.params == 0) {
if (this->actor.params == TW_KOTAKE) {
this->work[FOG_TIMER] = 20;
}
}
@ -1369,11 +1369,11 @@ void BossTw_HitByBeam(BossTw* this, PlayState* play) {
accel.y = 0.1f;
accel.z = 0.0f;
BossTw_AddDmgCloud(play, this->actor.params + 2, &pos, &velocity, &accel, Rand_ZeroFloat(10.0f) + 15.0f, 0, 0,
150);
BossTw_AddDmgCloud(play, this->actor.params + TWEFF_2, &pos, &velocity, &accel, Rand_ZeroFloat(10.0f) + 15.0f,
0, 0, 150);
}
if (this->actor.params == 1) {
if (this->actor.params == TW_KOUME) {
Math_ApproachF(&this->fogR, 255.0f, 1.0f, 30.0f);
Math_ApproachF(&this->fogG, 255.0f, 1.0f, 30.0f);
Math_ApproachF(&this->fogB, 255.0f, 1.0f, 30.0f);
@ -1636,8 +1636,8 @@ void BossTw_TwinrovaMergeCS(BossTw* this, PlayState* play) {
BossTw_SetupWait(sKotakePtr, play);
BossTw_SetupWait(sKoumePtr, play);
Actor_SetScale(&this->actor, 0.0f);
Animation_MorphToPlayOnce(&this->skelAnime, &object_tw_Anim_038E2C, 0.0f);
this->workf[ANIM_SW_TGT] = Animation_GetLastFrame(&object_tw_Anim_038E2C);
Animation_MorphToPlayOnce(&this->skelAnime, &gTwinrovaIntroAnim, 0.0f);
this->workf[ANIM_SW_TGT] = Animation_GetLastFrame(&gTwinrovaIntroAnim);
this->timers[0] = 50;
func_8002DF54(play, &this->actor, 2);
Audio_PlayActorSfx2(&this->actor, NA_SE_EN_TWINROBA_TRANSFORM);
@ -1651,7 +1651,7 @@ void BossTw_TwinrovaMergeCS(BossTw* this, PlayState* play) {
case 1:
if (Animation_OnFrame(&this->skelAnime, this->workf[ANIM_SW_TGT])) {
Animation_MorphToLoop(&this->skelAnime, &object_tw_Anim_032BF8, -15.0f);
Animation_MorphToLoop(&this->skelAnime, &gTwinrovaHoverAnim, -15.0f);
}
sEnvType = -1;
@ -2214,7 +2214,7 @@ void BossTw_TwinrovaIntroCS(BossTw* this, PlayState* play) {
play->envCtx.prevLightSetting = 1;
play->envCtx.lightSetting = 1;
play->envCtx.lightBlend = 0.0f;
TitleCard_InitBossName(play, &play->actorCtx.titleCtx, SEGMENTED_TO_VIRTUAL(object_tw_Blob_02E170),
TitleCard_InitBossName(play, &play->actorCtx.titleCtx, SEGMENTED_TO_VIRTUAL(gTwinrovaTitleCardTex),
0xA0, 0xB4, 0x80, 0x28);
SET_EVENTCHKINF(EVENTCHKINF_75);
SEQCMD_PLAY_SEQUENCE(SEQ_PLAYER_BGM_MAIN, 0, 0, NA_BGM_BOSS);
@ -2337,7 +2337,7 @@ void BossTw_DeathBall(BossTw* this, PlayState* play) {
}
}
if (this->actor.params == 0x69) {
if (this->actor.params == TW_DEATHBALL_KOUME) {
this->targetPos.x = sKoumePtr->actor.world.pos.x;
this->targetPos.z = sKoumePtr->actor.world.pos.z;
} else {
@ -2369,7 +2369,7 @@ void BossTw_DeathBall(BossTw* this, PlayState* play) {
void BossTw_TwinrovaSetupDeathCS(BossTw* this, PlayState* play) {
this->actionFunc = BossTw_TwinrovaDeathCS;
Animation_MorphToLoop(&this->skelAnime, &object_tw_Anim_024374, -3.0f);
Animation_MorphToLoop(&this->skelAnime, &gTwinrovaDamageAnim, -3.0f);
this->actor.world.rot.y = this->actor.shape.rot.y;
this->actor.flags &= ~ACTOR_FLAG_0;
this->csState2 = this->csState1 = 0;
@ -2622,7 +2622,7 @@ void BossTw_TwinrovaDeathCS(BossTw* this, PlayState* play) {
switch (this->csState1) {
case 0:
if (this->work[CS_TIMER_1] == 15) {
Animation_MorphToPlayOnce(&this->skelAnime, &object_tw_Anim_0216DC, -3.0f);
Animation_MorphToPlayOnce(&this->skelAnime, &gTwinrovaDeathAnim, -3.0f);
}
if (this->work[CS_TIMER_1] >= 15) {
@ -2910,7 +2910,7 @@ void BossTw_Update(Actor* thisx, PlayState* play) {
CollisionCheck_SetAT(play, &play->colChkCtx, &this->collider.base);
}
if (this->actor.params == 0) {
if (this->actor.params == TW_KOTAKE) {
this->workf[OUTR_CRWN_TX_X2] += 1.0f;
this->workf[OUTR_CRWN_TX_Y2] -= 7.0f;
this->workf[INNR_CRWN_TX_Y1] += 1.0f;
@ -3180,7 +3180,7 @@ s32 BossTw_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f*
if (limbIndex == 21) {
if (this->unk_5F8 == 0) {
if (this->actor.params == 0) {
if (this->actor.params == TW_KOTAKE) {
*dList = object_tw_DL_012CE0;
} else {
*dList = object_tw_DL_0134B8;
@ -3192,7 +3192,7 @@ s32 BossTw_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f*
if (this->actionFunc == BossTw_DeathCS) {
*dList = NULL;
} else if (this->scepterAlpha == 0.0f) {
if (this->actor.params == 0) {
if (this->actor.params == TW_KOTAKE) {
*dList = object_tw_DL_012B38;
} else {
*dList = object_tw_DL_013310;
@ -3222,7 +3222,7 @@ void BossTw_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot
if (this->unk_5F8 != 0) {
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 == 0) {
if (this->actor.params == TW_KOTAKE) {
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(object_tw_DL_013AE8));
} else {
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(object_tw_DL_013D68));
@ -3239,7 +3239,7 @@ void BossTw_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot
if (this->scepterAlpha > 0.0f) {
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, "../z_boss_tw.c", 6221),
G_MTX_LOAD | G_MTX_MODELVIEW | G_MTX_NOPUSH);
if (this->actor.params == 0) {
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));
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 195, 225, 235, (s16)this->scepterAlpha);
@ -3270,7 +3270,7 @@ void func_80941BC0(BossTw* this, PlayState* play) {
G_MTX_LOAD | G_MTX_MODELVIEW | G_MTX_NOPUSH);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, (s16)this->workf[UNK_F11]);
gDPSetEnvColor(POLY_XLU_DISP++, 0, 40, 30, 80);
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(object_tw_DL_01BC00));
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(gTwinrovaIcePoolDL));
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 215, 215, 215, (s16)this->workf[UNK_F11] * this->workf[UNK_F14]);
gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 255, 128);
gSPSegment(POLY_XLU_DISP++, 8,
@ -3280,7 +3280,7 @@ void func_80941BC0(BossTw* this, PlayState* play) {
Matrix_RotateY(this->workf[UNK_F15], MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, "../z_boss_tw.c", 6423),
G_MTX_LOAD | G_MTX_MODELVIEW | G_MTX_NOPUSH);
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(object_tw_DL_01C1C0));
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(gTwinrovaIcePoolShineDL));
Matrix_Pop();
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, "../z_boss_tw.c", 6427),
G_MTX_LOAD | G_MTX_MODELVIEW | G_MTX_NOPUSH);
@ -3295,7 +3295,7 @@ void func_80941BC0(BossTw* this, PlayState* play) {
GBL_c1(G_BL_CLR_FOG, G_BL_A_SHADE, G_BL_CLR_IN, G_BL_1MA),
G_RM_ZB_OVL_SURF2);
gSPSetGeometryMode(POLY_XLU_DISP++, G_CULL_BACK | G_FOG);
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(object_tw_DL_01A790));
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(gTwinrovaEffectHaloDL));
Matrix_Pop();
CLOSE_DISPS(play->state.gfxCtx, "../z_boss_tw.c", 6461);
@ -3319,7 +3319,7 @@ void func_80942180(BossTw* this, PlayState* play) {
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 100, 40, 00, (s16)this->workf[KM_GRND_CRTR_A]);
gDPPipeSync(POLY_XLU_DISP++);
gDPSetEnvColor(POLY_XLU_DISP++, 255, 245, 255, 128);
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(object_tw_DL_019D40));
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(gTwinrovaFirePoolDL));
Matrix_ReplaceRotation(&play->billboardMtxF);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, "../z_boss_tw.c", 6514),
@ -3331,7 +3331,7 @@ void func_80942180(BossTw* this, PlayState* play) {
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 80, 0, 0, (s16)this->workf[KM_GD_SMOKE_A]);
gDPPipeSync(POLY_XLU_DISP++);
gDPSetEnvColor(POLY_XLU_DISP++, 0, 0, 0, 100);
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(object_tw_DL_018FC0));
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(gTwinrovaFireSmokeDL));
gSPSegment(POLY_XLU_DISP++, 8,
Gfx_TwoTexScroll(play->state.gfxCtx, G_TX_RENDERTILE, (-this->work[CS_TIMER_1] * 3) & 0x7F, 0, 0x20,
@ -3342,7 +3342,7 @@ void func_80942180(BossTw* this, PlayState* play) {
Matrix_Scale(this->workf[KM_GD_FLM_SCL], this->workf[KM_GD_FLM_SCL], this->workf[KM_GD_FLM_SCL], MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, "../z_boss_tw.c", 6575),
G_MTX_LOAD | G_MTX_MODELVIEW | G_MTX_NOPUSH);
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(object_tw_DL_019938));
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(gTwinrovaBigFlameDL));
Matrix_Pop();
@ -3366,19 +3366,19 @@ void func_809426F0(BossTw* this, PlayState* play) {
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, "../z_boss_tw.c", 6614),
G_MTX_LOAD | G_MTX_MODELVIEW | G_MTX_NOPUSH);
if (this->actor.params == 0) {
if (this->actor.params == TW_KOTAKE) {
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 135, 175, 165, (s16)this->spawnPortalAlpha);
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(object_tw_DL_01CEE0));
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(gTwinrovaKotakeMagicSigilDL));
} else {
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 0, (s16)this->spawnPortalAlpha);
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(object_tw_DL_01DBE8));
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(gTwinrovaKoumeMagicSigilDL));
}
Matrix_Pop();
if (this->actor.params == 0) {
if (this->actor.params == TW_KOTAKE) {
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 195, 225, 235, (s16)this->flameAlpha);
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(object_tw_DL_01A998));
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(gTwinrovaIceMaterialDL));
} else {
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 200, 20, 0, (s16)this->flameAlpha);
gDPSetEnvColor(POLY_XLU_DISP++, 255, 215, 255, 128);
@ -3397,7 +3397,7 @@ void func_809426F0(BossTw* this, PlayState* play) {
Matrix_ReplaceRotation(&play->billboardMtxF);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, "../z_boss_tw.c", 6751),
G_MTX_LOAD | G_MTX_MODELVIEW | G_MTX_NOPUSH);
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(object_tw_DL_01A430));
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(gTwinrovaFireDL));
Matrix_Pop();
}
@ -3416,7 +3416,7 @@ void func_80942C70(Actor* thisx, PlayState* play) {
Gfx_TexScroll(play->state.gfxCtx, 0, (u8)(this->work[CS_TIMER_1] * -0xF), 0x20, 0x40));
alpha = this->beamScale * 100.0f * 255.0f;
if (this->actor.params == 1) {
if (this->actor.params == TW_KOUME) {
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 60, alpha);
gDPSetEnvColor(POLY_XLU_DISP++, 255, 0, 0, 128);
} else {
@ -3431,7 +3431,7 @@ void func_80942C70(Actor* thisx, PlayState* play) {
Matrix_Scale(this->beamScale, this->beamScale, (this->beamDist * 0.01f * 98.0f) / 20000.0f, MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, "../z_boss_tw.c", 6846),
G_MTX_LOAD | G_MTX_MODELVIEW | G_MTX_NOPUSH);
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(object_tw_DL_01DDF0));
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(gTwinrovaBeamDL));
if (this->beamReflectionDist > 10.0f) {
Matrix_Translate(this->beamReflectionOrigin.x, this->beamReflectionOrigin.y, this->beamReflectionOrigin.z,
@ -3443,7 +3443,7 @@ void func_80942C70(Actor* thisx, PlayState* play) {
MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, "../z_boss_tw.c", 6870),
G_MTX_LOAD | G_MTX_MODELVIEW | G_MTX_NOPUSH);
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(object_tw_DL_01DDF0));
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(gTwinrovaBeamDL));
}
Matrix_Pop();
@ -3463,7 +3463,7 @@ void func_80943028(Actor* thisx, PlayState* play) {
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, 255);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, "../z_boss_tw.c", 6908),
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(object_tw_DL_01F608));
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(gTwinrovaHaloDL));
Gfx_SetupDL_44Xlu(play->state.gfxCtx);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 0, 0, 0, 200);
Matrix_Translate(this->actor.world.pos.x, 240.0f, this->actor.world.pos.z, MTXMODE_NEW);
@ -3564,10 +3564,10 @@ void BossTw_Draw(Actor* thisx, PlayState* play2) {
CLOSE_DISPS(play->state.gfxCtx, "../z_boss_tw.c", 7123);
}
void* D_8094A9B0[] = {
object_tw_Tex_02A9B0,
object_tw_Tex_02A070,
object_tw_Tex_02A470,
void* sTwinrovaEyeTextures[] = {
gTwinrovaEyeOpenTex,
gTwinrovaEyeHalfTex,
gTwinrovaEyeClosedTex,
};
s32 BossTw_TwinrovaOverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, void* thisx) {
@ -3576,53 +3576,53 @@ s32 BossTw_TwinrovaOverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList,
OPEN_DISPS(play->state.gfxCtx, "../z_boss_tw.c", 7139);
switch (limbIndex) {
case 21:
case TWINROVA_LIMB_HEAD:
gSPSegment(POLY_OPA_DISP++, 0xC,
Gfx_TexScroll(play->state.gfxCtx, 0, (s16)(f32)this->work[CS_TIMER_1], 8, 8));
gSPSegment(POLY_OPA_DISP++, 8, SEGMENTED_TO_VIRTUAL(D_8094A9B0[this->eyeTexIdx]));
gSPSegment(POLY_OPA_DISP++, 9, SEGMENTED_TO_VIRTUAL(D_8094A9B0[this->leftEyeTexIdx]));
gSPSegment(POLY_OPA_DISP++, 8, SEGMENTED_TO_VIRTUAL(sTwinrovaEyeTextures[this->eyeTexIdx]));
gSPSegment(POLY_OPA_DISP++, 9, SEGMENTED_TO_VIRTUAL(sTwinrovaEyeTextures[this->leftEyeTexIdx]));
gDPSetEnvColor(POLY_OPA_DISP++, 255, 255, 255, this->work[UNK_S8]);
break;
case 17:
case 41:
case TWINROVA_LIMB_HAIR_FIRE_JET:
case TWINROVA_LIMB_BROOM_FIRE_JET:
*dList = NULL;
gSPSegment(POLY_XLU_DISP++, 0xA,
Gfx_TwoTexScroll(play->state.gfxCtx, G_TX_RENDERTILE, 0, 0, 0x20, 0x20, 1, 0,
-this->work[CS_TIMER_1] * 0xF, 0x20, 0x40));
break;
case 18:
case 42:
case TWINROVA_LIMB_HAIR_FIRE_TRAIL:
case TWINROVA_LIMB_BROOM_FIRE_TRAIL:
*dList = NULL;
gSPSegment(POLY_XLU_DISP++, 0xB,
Gfx_TwoTexScroll(play->state.gfxCtx, G_TX_RENDERTILE, 0, 0, 0x20, 0x20, 1, 0,
-this->work[CS_TIMER_1] * 0xA, 0x20, 0x40));
break;
case 16:
case 32:
case TWINROVA_LIMB_HAIR_ICE_JET:
case TWINROVA_LIMB_BROOM_ICE_JET:
*dList = NULL;
gSPSegment(POLY_XLU_DISP++, 8,
Gfx_TwoTexScroll(play->state.gfxCtx, G_TX_RENDERTILE, 0, 0, 0x20, 0x20, 1,
this->work[CS_TIMER_1], -this->work[CS_TIMER_1] * 7, 0x20, 0x40));
break;
case 15:
case 31:
case TWINROVA_LIMB_HAIR_ICE_TRAIL:
case TWINROVA_LIMB_BROOM_ICE_TRAIL:
*dList = NULL;
gSPSegment(POLY_XLU_DISP++, 9, Gfx_TexScroll(play->state.gfxCtx, 0, this->work[CS_TIMER_1], 0x20, 0x40));
break;
case 19:
case TWINROVA_LIMB_LEFT_HAIR_BUN:
if (this->unk_5F8 != 0) {
*dList = object_tw_DL_02D940;
*dList = gTwinrovaLeftHairBunDL;
}
break;
case 20:
case TWINROVA_LIMB_RIGHT_HAIR_BUN:
if (this->unk_5F8 != 0) {
*dList = object_tw_DL_02D890;
*dList = gTwinrovaRightHairBunDL;
}
break;
}
if (this->unk_5F8 != 0 && ((limbIndex == 34) || (limbIndex == 40))) {
if ((this->unk_5F8 != 0) && ((limbIndex == TWINROVA_LIMB_LEFT_BROOM) || (limbIndex == TWINROVA_LIMB_RIGHT_BROOM))) {
*dList = NULL;
}
@ -3642,24 +3642,24 @@ void BossTw_TwinrovaPostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Ve
OPEN_DISPS(play->state.gfxCtx, "../z_boss_tw.c", 7262);
switch (limbIndex) {
case 34:
case TWINROVA_LIMB_LEFT_BROOM:
Matrix_MultVec3f(&D_8094A9D4, &this->leftScepterPos);
break;
case 40:
case TWINROVA_LIMB_RIGHT_BROOM:
Matrix_MultVec3f(&D_8094A9E0, &this->rightScepterPos);
break;
case 21:
case TWINROVA_LIMB_HEAD:
Matrix_MultVec3f(&D_8094A9BC, &this->actor.focus.pos);
Matrix_MultVec3f(&D_8094A9C8, &this->crownPos);
break;
case 15:
case 16:
case 17:
case 18:
case 31:
case 32:
case 41:
case 42:
case TWINROVA_LIMB_HAIR_ICE_TRAIL:
case TWINROVA_LIMB_HAIR_ICE_JET:
case TWINROVA_LIMB_HAIR_FIRE_JET:
case TWINROVA_LIMB_HAIR_FIRE_TRAIL:
case TWINROVA_LIMB_BROOM_ICE_TRAIL:
case TWINROVA_LIMB_BROOM_ICE_JET:
case TWINROVA_LIMB_BROOM_FIRE_JET:
case TWINROVA_LIMB_BROOM_FIRE_TRAIL:
Matrix_Push();
Matrix_Scale(this->workf[UNK_F12], this->workf[UNK_F12], this->workf[UNK_F12], MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, "../z_boss_tw.c", 7295),
@ -3718,21 +3718,21 @@ void BossTw_ShieldChargeDraw(BossTw* this, PlayState* play) {
temp_a0 = (Math_SinS(this->work[CS_TIMER_1] * 2730 * temp_t0) * D_8094C854 * 0.5f) + (D_8094C854 * 0.5f);
if (sShieldFireCharge != 0) {
gDPSetEnvColor(POLY_XLU_DISP++, 255, 245, 255, temp_a0);
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(object_tw_DL_01E0E0));
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(gTwinrovaMirrorShieldFireChargeSidesDL));
gSPSegment(POLY_XLU_DISP++, 8,
Gfx_TwoTexScroll(play->state.gfxCtx, G_TX_RENDERTILE, (this->work[CS_TIMER_1] * 2) * temp_t0,
0, 0x20, 0x20, 1, (-this->work[CS_TIMER_1] * 2) * temp_t0, 0, 0x20, 0x20));
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 100, 20, 0, (s16)D_8094C854);
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(object_tw_DL_01E020));
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(gTwinrovaMirrorShieldFireChargeCenterDL));
} else {
gDPSetEnvColor(POLY_XLU_DISP++, 225, 255, 255, temp_a0);
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(object_tw_DL_01E3A0));
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(gTwinrovaMirrorShieldIceChargeSidesDL));
gSPSegment(POLY_XLU_DISP++, 8,
Gfx_TwoTexScroll(play->state.gfxCtx, G_TX_RENDERTILE, 0,
(-this->work[CS_TIMER_1] * 5) * temp_t0, 0x20, 0x40, 1,
(this->work[CS_TIMER_1] * 4) * temp_t0, 0, 0x20, 0x20));
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 175, 205, 195, (s16)D_8094C854);
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(object_tw_DL_01E2C0));
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(gTwinrovaMirrorShieldIceChargeCenterDL));
}
}
}
@ -3767,7 +3767,7 @@ void BossTw_ShieldChargeDraw(BossTw* this, PlayState* play) {
gSPSegment(POLY_XLU_DISP++, 8,
Gfx_TwoTexScroll(play->state.gfxCtx, G_TX_RENDERTILE, 0, this->work[CS_TIMER_1] * D_8094C872, 0x20,
0x40, 1, 0, this->work[CS_TIMER_1] * D_8094C872, 0x20, 0x20));
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(object_tw_DL_01E9F0));
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(gTwinrovaShieldAbsorbAndReflectEffectDL));
}
Matrix_Pop();
@ -3792,28 +3792,28 @@ void BossTw_SpawnPortalDraw(BossTw* this, PlayState* play) {
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 0, 0, 0, (s16)this->spawnPortalAlpha);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, "../z_boss_tw.c", 7582),
G_MTX_LOAD | G_MTX_MODELVIEW | G_MTX_NOPUSH);
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(object_tw_DL_01EC68));
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(gTwinrovaSpawnPortalShadowDL));
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 135, 175, 165, (s16)this->spawnPortalAlpha);
Matrix_Translate(0.0f, 2.0f, 0.0f, MTXMODE_APPLY);
Matrix_RotateX(M_PI / 2.0f, MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, "../z_boss_tw.c", 7596),
G_MTX_LOAD | G_MTX_MODELVIEW | G_MTX_NOPUSH);
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(object_tw_DL_01CEE0));
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(gTwinrovaKotakeMagicSigilDL));
Matrix_Translate(0.0f, 232.0f, 600.0f, MTXMODE_NEW);
Matrix_Scale(this->spawnPortalScale, this->spawnPortalScale, this->spawnPortalScale, MTXMODE_APPLY);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 0, 0, 0, (s16)this->spawnPortalAlpha);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, "../z_boss_tw.c", 7617),
G_MTX_LOAD | G_MTX_MODELVIEW | G_MTX_NOPUSH);
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(object_tw_DL_01EC68));
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(gTwinrovaSpawnPortalShadowDL));
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 0, (s16)this->spawnPortalAlpha);
Matrix_Translate(0.0f, 2.0f, 0.0f, MTXMODE_APPLY);
Matrix_RotateX(M_PI / 2.0f, MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, "../z_boss_tw.c", 7631),
G_MTX_LOAD | G_MTX_MODELVIEW | G_MTX_NOPUSH);
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(object_tw_DL_01DBE8));
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(gTwinrovaKoumeMagicSigilDL));
Matrix_Pop();
@ -3833,7 +3833,7 @@ void func_80944C50(BossTw* this, PlayState* play) {
Matrix_Scale(this->workf[UNK_F19], this->workf[UNK_F19], this->workf[UNK_F19], MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, "../z_boss_tw.c", 7671),
G_MTX_LOAD | G_MTX_MODELVIEW | G_MTX_NOPUSH);
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(object_tw_DL_01F390));
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(gTwinrovaLightCircleDL));
Matrix_Pop();
gSPSegment(POLY_XLU_DISP++, 8,
@ -3842,7 +3842,7 @@ void func_80944C50(BossTw* this, PlayState* play) {
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, (s16)this->workf[UNK_F18] / 2);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, "../z_boss_tw.c", 7694),
G_MTX_LOAD | G_MTX_MODELVIEW | G_MTX_NOPUSH);
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(object_tw_DL_01F238));
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(gTwinrovaLightRaysDL));
gSPSegment(POLY_XLU_DISP++, 8,
Gfx_TwoTexScroll(play->state.gfxCtx, G_TX_RENDERTILE, -sKoumePtr->work[CS_TIMER_1] * 5,
@ -3856,7 +3856,7 @@ void func_80944C50(BossTw* this, PlayState* play) {
Matrix_Scale(scale, 1.0f, scale, MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, "../z_boss_tw.c", 7728),
G_MTX_LOAD | G_MTX_MODELVIEW | G_MTX_NOPUSH);
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(object_tw_DL_01EEB0));
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(gTwinrovaLightPillarDL));
Matrix_Pop();
CLOSE_DISPS(play->state.gfxCtx, "../z_boss_tw.c", 7732);
@ -4253,13 +4253,14 @@ void BossTw_BlastIce(BossTw* this, PlayState* play) {
accel.x = 0.0f;
accel.y = 0.13f;
accel.z = 0.0f;
BossTw_AddDmgCloud(play, 3, &pos, &velocity, &accel, Rand_ZeroFloat(5.0f) + 20.0f, 0, 0, 80);
BossTw_AddDmgCloud(play, TWEFF_3, &pos, &velocity, &accel, Rand_ZeroFloat(5.0f) + 20.0f, 0, 0, 80);
velocity.x = Rand_CenteredFloat(10.0f);
velocity.z = Rand_CenteredFloat(10.0f);
velocity.y = Rand_ZeroFloat(3.0f) + 3.0f;
pos.x = sKotakePtr->groundBlastPos2.x + (velocity.x * 0.5f);
pos.z = sKotakePtr->groundBlastPos2.z + (velocity.z * 0.5f);
BossTw_AddDmgCloud(play, 3, &pos, &velocity, &accel, Rand_ZeroFloat(5.0f) + 15.0f, 255, 2, 130);
BossTw_AddDmgCloud(play, TWEFF_3, &pos, &velocity, &accel, Rand_ZeroFloat(5.0f) + 15.0f, 255, 2,
130);
}
Math_ApproachF(&sKotakePtr->workf[UNK_F9], 80.0f, 1.0f, 3.0f);
@ -4292,7 +4293,8 @@ void BossTw_BlastIce(BossTw* this, PlayState* play) {
accel.x = 0.0f;
accel.y = 0.13f;
accel.z = 0.0f;
BossTw_AddDmgCloud(play, 3, &pos, &velocity, &accel, Rand_ZeroFloat(5.0f) + 20, 0, 0, 80);
BossTw_AddDmgCloud(play, TWEFF_3, &pos, &velocity, &accel, Rand_ZeroFloat(5.0f) + 20, 0, 0,
80);
}
}
sp80 = 3.0f;
@ -4456,7 +4458,7 @@ void BossTw_BlastDraw(Actor* thisx, PlayState* play2) {
Matrix_ReplaceRotation(&play->billboardMtxF);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, "../z_boss_tw.c", 8865),
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(object_tw_DL_01A430));
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(gTwinrovaFireDL));
}
break;
@ -4465,7 +4467,7 @@ void BossTw_BlastDraw(Actor* thisx, PlayState* play2) {
case TW_ICE_BLAST:
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 195, 225, 235, (s8)this->workf[TAIL_ALPHA]);
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(object_tw_DL_01A998));
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(gTwinrovaIceMaterialDL));
for (i = 9; i >= 0; i--) {
gSPSegment(POLY_XLU_DISP++, 8,
Gfx_TwoTexScroll(
@ -4480,7 +4482,7 @@ void BossTw_BlastDraw(Actor* thisx, PlayState* play2) {
Matrix_ReplaceRotation(&play->billboardMtxF);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, "../z_boss_tw.c", 9004),
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(object_tw_DL_01AB00));
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(gTwinrovaIceModelDL));
}
break;
@ -4520,11 +4522,11 @@ void BossTw_DrawDeathBall(Actor* thisx, PlayState* play2) {
Matrix_ReplaceRotation(&play->billboardMtxF);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, "../z_boss_tw.c", 9071),
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(object_tw_DL_01A430));
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(gTwinrovaFireDL));
}
} else {
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 195, 225, 235, (s8)this->workf[TAIL_ALPHA]);
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(object_tw_DL_01A998));
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(gTwinrovaIceMaterialDL));
for (i = 9; i >= 0; i--) {
gSPSegment(POLY_XLU_DISP++, 8,
@ -4540,7 +4542,7 @@ void BossTw_DrawDeathBall(Actor* thisx, PlayState* play2) {
Matrix_ReplaceRotation(&play->billboardMtxF);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, "../z_boss_tw.c", 9107),
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(object_tw_DL_01AB00));
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(gTwinrovaIceModelDL));
}
}
@ -4573,7 +4575,7 @@ void BossTw_UpdateEffects(PlayState* play) {
Actor* unk44;
for (i = 0; i < BOSS_TW_EFFECT_COUNT; i++) {
if (eff->type != 0) {
if (eff->type != TWEFF_NONE) {
eff->pos.x += eff->curSpeed.x;
eff->pos.y += eff->curSpeed.y;
eff->pos.z += eff->curSpeed.z;
@ -4582,7 +4584,7 @@ void BossTw_UpdateEffects(PlayState* play) {
eff->curSpeed.y += eff->accel.y;
eff->curSpeed.z += eff->accel.z;
if (eff->type == 1) {
if (eff->type == TWEFF_DOT) {
colorIdx = eff->frame % 4;
if (eff->work[EFF_ARGS] == 0) {
@ -4599,7 +4601,7 @@ void BossTw_UpdateEffects(PlayState* play) {
eff->type = TWEFF_NONE;
}
} else if ((eff->type == 3) || (eff->type == 2)) {
} else if ((eff->type == TWEFF_3) || (eff->type == TWEFF_2)) {
if (eff->work[EFF_ARGS] == 2) {
eff->alpha -= 20;
if (eff->alpha <= 0) {
@ -4763,7 +4765,7 @@ void BossTw_UpdateEffects(PlayState* play) {
}
BossTw_AddFlameEffect(play, &eff->pos, &sZeroVector, &sZeroVector, 10, eff->work[EFF_ARGS]);
} else if (eff->type == 4) {
} else if (eff->type == TWEFF_RING) {
if (eff->work[EFF_UNKS1] == 0) {
Math_ApproachF(&eff->workf[EFF_SCALE], eff->workf[EFF_DIST], 0.05f, 1.0f);
@ -4851,8 +4853,8 @@ void BossTw_UpdateEffects(PlayState* play) {
spA8.y = 0.1f;
spA8.z = 0.0f;
BossTw_AddDmgCloud(play, 3, &spC0, &spB4, &spA8, phi_f22 + Rand_ZeroFloat(phi_f22 * 0.5f), 0, 0,
150);
BossTw_AddDmgCloud(play, TWEFF_3, &spC0, &spB4, &spA8, phi_f22 + Rand_ZeroFloat(phi_f22 * 0.5f),
0, 0, 150);
}
}
}
@ -4905,9 +4907,9 @@ void BossTw_DrawEffects(PlayState* play) {
Gfx_SetupDL_25Xlu(play->state.gfxCtx);
for (i = 0; i < BOSS_TW_EFFECT_COUNT; i++) {
if (currentEffect->type == 1) {
if (currentEffect->type == TWEFF_DOT) {
if (materialFlag == 0) {
gSPDisplayList(POLY_XLU_DISP++, object_tw_DL_01A528);
gSPDisplayList(POLY_XLU_DISP++, gTwinrovaMagicParticleMaterialDL);
materialFlag++;
}
@ -4918,7 +4920,7 @@ void BossTw_DrawEffects(PlayState* play) {
Matrix_Scale(currentEffect->workf[EFF_SCALE], currentEffect->workf[EFF_SCALE], 1.0f, MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gfxCtx, "../z_boss_tw.c", 9617),
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, object_tw_DL_01A5A8);
gSPDisplayList(POLY_XLU_DISP++, gTwinrovaMagicParticleModelDL);
}
currentEffect++;
@ -4928,9 +4930,9 @@ void BossTw_DrawEffects(PlayState* play) {
currentEffect = effectHead;
for (i = 0; i < BOSS_TW_EFFECT_COUNT; i++) {
if (currentEffect->type == 3) {
if (currentEffect->type == TWEFF_3) {
if (materialFlag == 0) {
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(object_tw_DL_01A998));
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(gTwinrovaIceMaterialDL));
materialFlag++;
}
@ -4943,7 +4945,7 @@ void BossTw_DrawEffects(PlayState* play) {
Matrix_Scale(currentEffect->workf[EFF_SCALE], currentEffect->workf[EFF_SCALE], 1.0f, MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gfxCtx, "../z_boss_tw.c", 9660),
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(object_tw_DL_01AB00));
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(gTwinrovaIceModelDL));
}
currentEffect++;
}
@ -4952,7 +4954,7 @@ void BossTw_DrawEffects(PlayState* play) {
currentEffect = effectHead;
for (i = 0; i < BOSS_TW_EFFECT_COUNT; i++) {
if (currentEffect->type == 2) {
if (currentEffect->type == TWEFF_2) {
if (materialFlag == 0) {
gDPPipeSync(POLY_XLU_DISP++);
gDPSetEnvColor(POLY_XLU_DISP++, 255, 215, 255, 128);
@ -4968,7 +4970,7 @@ void BossTw_DrawEffects(PlayState* play) {
Matrix_Scale(currentEffect->workf[EFF_SCALE], currentEffect->workf[EFF_SCALE], 1.0f, MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gfxCtx, "../z_boss_tw.c", 9709),
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(object_tw_DL_01A430));
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(gTwinrovaFireDL));
}
currentEffect++;
@ -4978,7 +4980,7 @@ void BossTw_DrawEffects(PlayState* play) {
currentEffect = effectHead;
for (i = 0; i < BOSS_TW_EFFECT_COUNT; i++) {
if (currentEffect->type == 4) {
if (currentEffect->type == TWEFF_RING) {
if (materialFlag == 0) {
materialFlag++;
}
@ -5013,7 +5015,7 @@ void BossTw_DrawEffects(PlayState* play) {
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gDPSetRenderMode(POLY_XLU_DISP++, G_RM_PASS, G_RM_AA_ZB_XLU_SURF2);
gSPClearGeometryMode(POLY_XLU_DISP++, G_CULL_BACK | G_FOG);
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(object_tw_DL_01A790));
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(gTwinrovaEffectHaloDL));
}
currentEffect++;
@ -5028,7 +5030,7 @@ void BossTw_DrawEffects(PlayState* play) {
if (currentEffect->type == TWEFF_PLYR_FRZ) {
if (materialFlag == 0) {
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(object_tw_DL_01AA50));
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(gTwinrovaIceSurroundingPlayerMaterialDL));
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 195, 225, 235, 255);
gSPSegment(
POLY_XLU_DISP++, 8,
@ -5059,7 +5061,7 @@ void BossTw_DrawEffects(PlayState* play) {
Matrix_RotateX((BossTw_RandZeroOne() - 0.5f) * M_PI * 0.5f, MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gfxCtx, "../z_boss_tw.c", 9855),
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(object_tw_DL_01AB00));
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(gTwinrovaIceModelDL));
}
}
@ -5070,10 +5072,10 @@ void BossTw_DrawEffects(PlayState* play) {
currentEffect = effectHead;
for (i = 0; i < BOSS_TW_EFFECT_COUNT; i++) {
if (currentEffect->type >= 6) {
if (currentEffect->type >= TWEFF_FLAME) {
if (currentEffect->work[EFF_ARGS] == 0) {
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 195, 225, 235, currentEffect->alpha);
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(object_tw_DL_01A998));
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(gTwinrovaIceMaterialDL));
} else {
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 200, 20, 0, currentEffect->alpha);
gDPPipeSync(POLY_XLU_DISP++);
@ -5090,9 +5092,9 @@ void BossTw_DrawEffects(PlayState* play) {
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
if (currentEffect->work[EFF_ARGS] == 0) {
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(object_tw_DL_01AB00));
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(gTwinrovaIceModelDL));
} else {
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(object_tw_DL_01A430));
gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(gTwinrovaFireDL));
}
}
@ -5104,7 +5106,7 @@ void BossTw_DrawEffects(PlayState* play) {
void BossTw_TwinrovaSetupArriveAtTarget(BossTw* this, PlayState* play) {
this->actionFunc = BossTw_TwinrovaArriveAtTarget;
Animation_MorphToLoop(&this->skelAnime, &object_tw_Anim_032BF8, -3.0f);
Animation_MorphToLoop(&this->skelAnime, &gTwinrovaHoverAnim, -3.0f);
this->work[CS_TIMER_1] = Rand_ZeroFloat(100.0f);
this->timers[1] = 25;
this->rotateSpeed = 0.0f;
@ -5127,8 +5129,8 @@ void BossTw_TwinrovaArriveAtTarget(BossTw* this, PlayState* play) {
void BossTw_TwinrovaSetupChargeBlast(BossTw* this, PlayState* play) {
this->actionFunc = BossTw_TwinrovaChargeBlast;
Animation_MorphToPlayOnce(&this->skelAnime, &object_tw_Anim_036FBC, -5.0f);
this->workf[ANIM_SW_TGT] = Animation_GetLastFrame(&object_tw_Anim_036FBC);
Animation_MorphToPlayOnce(&this->skelAnime, &gTwinrovaWindUpAnim, -5.0f);
this->workf[ANIM_SW_TGT] = Animation_GetLastFrame(&gTwinrovaWindUpAnim);
this->csState1 = 0;
}
@ -5160,12 +5162,12 @@ void BossTw_TwinrovaSetupShootBlast(BossTw* this, PlayState* play) {
this->actionFunc = BossTw_TwinrovaShootBlast;
if (sTwinrovaBlastType == 0) {
Animation_MorphToPlayOnce(&this->skelAnime, &object_tw_Anim_022700, 0.0f);
Animation_MorphToPlayOnce(&this->skelAnime, &gTwinrovaIceAttackAnim, 0.0f);
} else {
Animation_MorphToPlayOnce(&this->skelAnime, &object_tw_Anim_023750, 0.0f);
Animation_MorphToPlayOnce(&this->skelAnime, &gTwinrovaFireAttackAnim, 0.0f);
}
this->workf[ANIM_SW_TGT] = Animation_GetLastFrame(&object_tw_Anim_023750);
this->workf[ANIM_SW_TGT] = Animation_GetLastFrame(&gTwinrovaFireAttackAnim);
}
void BossTw_TwinrovaShootBlast(BossTw* this, PlayState* play) {
@ -5222,7 +5224,7 @@ void BossTw_TwinrovaShootBlast(BossTw* this, PlayState* play) {
void BossTw_TwinrovaSetupDoneBlastShoot(BossTw* this, PlayState* play) {
this->actionFunc = BossTw_TwinrovaDoneBlastShoot;
Animation_MorphToLoop(&this->skelAnime, &object_tw_Anim_032BF8, -10.0f);
Animation_MorphToLoop(&this->skelAnime, &gTwinrovaHoverAnim, -10.0f);
this->timers[1] = 60;
}
@ -5243,7 +5245,7 @@ void BossTw_TwinrovaDoneBlastShoot(BossTw* this, PlayState* play) {
void BossTw_TwinrovaDamage(BossTw* this, PlayState* play, u8 damage) {
if (this->actionFunc != BossTw_TwinrovaStun) {
Animation_MorphToPlayOnce(&this->skelAnime, &object_tw_Anim_0338F0, -15.0f);
Animation_MorphToPlayOnce(&this->skelAnime, &gTwinrovaChargedAttackHitAnim, -15.0f);
this->timers[0] = 150;
this->timers[1] = 20;
this->csState1 = 0;
@ -5251,8 +5253,8 @@ void BossTw_TwinrovaDamage(BossTw* this, PlayState* play, u8 damage) {
} else {
this->work[FOG_TIMER] = 10;
this->work[INVINC_TIMER] = 20;
Animation_MorphToPlayOnce(&this->skelAnime, &object_tw_Anim_024374, -3.0f);
this->workf[ANIM_SW_TGT] = Animation_GetLastFrame(&object_tw_Anim_024374);
Animation_MorphToPlayOnce(&this->skelAnime, &gTwinrovaDamageAnim, -3.0f);
this->workf[ANIM_SW_TGT] = Animation_GetLastFrame(&gTwinrovaDamageAnim);
this->csState1 = 1;
if ((s8)(this->actor.colChkInfo.health -= damage) < 0) {
@ -5279,7 +5281,7 @@ void BossTw_TwinrovaStun(BossTw* this, PlayState* play) {
this->unk_5F8 = 1;
this->actor.flags |= ACTOR_FLAG_10;
cloudType = sTwinrovaBlastType == 0 ? 3 : 2;
cloudType = sTwinrovaBlastType == 0 ? TWEFF_3 : TWEFF_2;
if ((this->work[CS_TIMER_1] % 8) == 0) {
Vec3f pos;
@ -5314,12 +5316,12 @@ void BossTw_TwinrovaStun(BossTw* this, PlayState* play) {
if (this->csState1 == 0) {
if (this->timers[1] == 0) {
this->csState1 = 1;
this->workf[ANIM_SW_TGT] = Animation_GetLastFrame(&object_tw_Anim_0343B4);
Animation_Change(&this->skelAnime, &object_tw_Anim_0343B4, 1.0f, 0.0f, this->workf[ANIM_SW_TGT], 3, 0.0f);
this->workf[ANIM_SW_TGT] = Animation_GetLastFrame(&gTwinrovaStunStartAnim);
Animation_Change(&this->skelAnime, &gTwinrovaStunStartAnim, 1.0f, 0.0f, this->workf[ANIM_SW_TGT], 3, 0.0f);
}
} else if (Animation_OnFrame(&this->skelAnime, this->workf[ANIM_SW_TGT])) {
this->workf[ANIM_SW_TGT] = 1000.0f;
Animation_MorphToLoop(&this->skelAnime, &object_tw_Anim_035030, 0.0f);
Animation_MorphToLoop(&this->skelAnime, &gTwinrovaStunLoopAnim, 0.0f);
}
if (this->actor.bgCheckFlags & BGCHECKFLAG_GROUND) {
@ -5332,8 +5334,8 @@ void BossTw_TwinrovaStun(BossTw* this, PlayState* play) {
}
void BossTw_TwinrovaSetupGetUp(BossTw* this, PlayState* play) {
Animation_MorphToPlayOnce(&this->skelAnime, &object_tw_Anim_035988, 0.0f);
this->workf[ANIM_SW_TGT] = Animation_GetLastFrame(&object_tw_Anim_035988);
Animation_MorphToPlayOnce(&this->skelAnime, &gTwinrovaStunEndAnim, 0.0f);
this->workf[ANIM_SW_TGT] = Animation_GetLastFrame(&gTwinrovaStunEndAnim);
this->actionFunc = BossTw_TwinrovaGetUp;
this->timers[0] = 50;
}
@ -5344,7 +5346,7 @@ void BossTw_TwinrovaGetUp(BossTw* this, PlayState* play) {
if (Animation_OnFrame(&this->skelAnime, this->workf[ANIM_SW_TGT])) {
this->workf[ANIM_SW_TGT] = 1000.0f;
Animation_MorphToLoop(&this->skelAnime, &object_tw_Anim_032BF8, 0.0f);
Animation_MorphToLoop(&this->skelAnime, &gTwinrovaHoverAnim, 0.0f);
}
if (this->timers[0] == 0) {
@ -5378,7 +5380,7 @@ void BossTw_TwinrovaSetupFly(BossTw* this, PlayState* play) {
this->actor.world.rot.y = RAD_TO_BINANG(Math_FAtan2F(xDiff, zDiff));
xzDist = sqrtf(SQ(xDiff) + SQ(zDiff));
this->actor.world.rot.x = RAD_TO_BINANG(Math_FAtan2F(yDiff, xzDist));
Animation_MorphToLoop(&this->skelAnime, &object_tw_Anim_032BF8, -10.0f);
Animation_MorphToLoop(&this->skelAnime, &gTwinrovaHoverAnim, -10.0f);
}
void BossTw_TwinrovaFly(BossTw* this, PlayState* play) {
@ -5414,7 +5416,7 @@ void BossTw_TwinrovaFly(BossTw* this, PlayState* play) {
void BossTw_TwinrovaSetupSpin(BossTw* this, PlayState* play) {
this->actionFunc = BossTw_TwinrovaSpin;
Animation_MorphToLoop(&this->skelAnime, &object_tw_Anim_032BF8, 0.0f);
Animation_MorphToLoop(&this->skelAnime, &gTwinrovaHoverAnim, 0.0f);
this->timers[0] = 20;
this->actor.speedXZ = 0.0f;
}
@ -5435,8 +5437,8 @@ void BossTw_TwinrovaSpin(BossTw* this, PlayState* play) {
void BossTw_TwinrovaSetupLaugh(BossTw* this, PlayState* play) {
this->actionFunc = BossTw_TwinrovaLaugh;
Animation_MorphToPlayOnce(&this->skelAnime, &object_tw_Anim_03A2D0, 0.0f);
this->workf[ANIM_SW_TGT] = Animation_GetLastFrame(&object_tw_Anim_03A2D0);
Animation_MorphToPlayOnce(&this->skelAnime, &gTwinrovaLaughAnim, 0.0f);
this->workf[ANIM_SW_TGT] = Animation_GetLastFrame(&gTwinrovaLaughAnim);
this->actor.speedXZ = 0.0f;
}

View File

@ -55,6 +55,54 @@ typedef enum {
/* 26 */ FWORK_MAX
} TwFwork;
typedef enum {
/* 0 */ TWINROVA_LIMB_NONE,
/* 1 */ TWINROVA_LIMB_PELVIS,
/* 2 */ TWINROVA_LIMB_SASH_1,
/* 3 */ TWINROVA_LIMB_SASH_2,
/* 4 */ TWINROVA_LIMB_SASH_3,
/* 5 */ TWINROVA_LIMB_SASH_4,
/* 6 */ TWINROVA_LIMB_LEFT_THIGH,
/* 7 */ TWINROVA_LIMB_LEFT_SHIN,
/* 8 */ TWINROVA_LIMB_LEFT_FOOT,
/* 9 */ TWINROVA_LIMB_RIGHT_THIGH,
/* 10 */ TWINROVA_LIMB_RIGHT_SHIN,
/* 11 */ TWINROVA_LIMB_RIGHT_FOOT,
/* 12 */ TWINROVA_LIMB_TORSO,
/* 13 */ TWINROVA_LIMB_LEFT_BREAST,
/* 14 */ TWINROVA_LIMB_RIGHT_BREAST,
/* 15 */ TWINROVA_LIMB_HAIR_ICE_TRAIL,
/* 16 */ TWINROVA_LIMB_HAIR_ICE_JET,
/* 17 */ TWINROVA_LIMB_HAIR_FIRE_JET,
/* 18 */ TWINROVA_LIMB_HAIR_FIRE_TRAIL,
/* 19 */ TWINROVA_LIMB_LEFT_HAIR_BUN,
/* 20 */ TWINROVA_LIMB_RIGHT_HAIR_BUN,
/* 21 */ TWINROVA_LIMB_HEAD,
/* 22 */ TWINROVA_LIMB_RIGHT_BRAID_START,
/* 23 */ TWINROVA_LIMB_RIGHT_BRAID_END,
/* 24 */ TWINROVA_LIMB_LEFT_BRAID_START,
/* 25 */ TWINROVA_LIMB_LEFT_BRAID_END,
/* 26 */ TWINROVA_LIMB_LEFT_SHOULDER,
/* 27 */ TWINROVA_LIMB_LEFT_UPPER_ARM,
/* 28 */ TWINROVA_LIMB_LEFT_FOREARM,
/* 29 */ TWINROVA_LIMB_LEFT_SLEEVE_START,
/* 30 */ TWINROVA_LIMB_LEFT_SLEEVE_END,
/* 31 */ TWINROVA_LIMB_BROOM_ICE_TRAIL,
/* 32 */ TWINROVA_LIMB_BROOM_ICE_JET,
/* 33 */ TWINROVA_LIMB_LEFT_HAND,
/* 34 */ TWINROVA_LIMB_LEFT_BROOM,
/* 35 */ TWINROVA_LIMB_RIGHT_SHOULDER,
/* 36 */ TWINROVA_LIMB_RIGHT_UPPER_ARM,
/* 37 */ TWINROVA_LIMB_RIGHT_FOREARM,
/* 38 */ TWINROVA_LIMB_RIGHT_SLEEVE_START,
/* 39 */ TWINROVA_LIMB_RIGHT_SLEEVE_END,
/* 40 */ TWINROVA_LIMB_RIGHT_BROOM,
/* 41 */ TWINROVA_LIMB_BROOM_FIRE_JET,
/* 42 */ TWINROVA_LIMB_BROOM_FIRE_TRAIL,
/* 43 */ TWINROVA_LIMB_RIGHT_HAND,
/* 44 */ TWINROVA_LIMB_MAX
} TwinrovaLimb;
typedef struct BossTw {
/* 0x0000 */ Actor actor;
/* 0x014C */ BossTwActionFunc actionFunc;