diff --git a/asm/MetroidPrime/CCredits.s b/asm/MetroidPrime/CCredits.s index add9b84c..8cd7778e 100644 --- a/asm/MetroidPrime/CCredits.s +++ b/asm/MetroidPrime/CCredits.s @@ -2140,10 +2140,10 @@ lbl_80026C0C: /* 80026C4C 00023BAC 80 81 00 38 */ lwz r4, 0x38(r1) /* 80026C50 00023BB0 80 63 00 00 */ lwz r3, 0(r3) /* 80026C54 00023BB4 83 24 00 00 */ lwz r25, 0(r4) -/* 80026C58 00023BB8 48 06 A8 55 */ bl GetTotalPickupCount__12CPlayerStateFv +/* 80026C58 00023BB8 48 06 A8 55 */ bl GetTotalPickupCount__12CPlayerStateCFv /* 80026C5C 00023BBC 7C 7A 1B 78 */ mr r26, r3 /* 80026C60 00023BC0 7F 23 CB 78 */ mr r3, r25 -/* 80026C64 00023BC4 48 06 A5 D1 */ bl CalculateItemCollectionRate__12CPlayerStateFv +/* 80026C64 00023BC4 48 06 A5 D1 */ bl CalculateItemCollectionRate__12CPlayerStateCFv /* 80026C68 00023BC8 1C 03 00 64 */ mulli r0, r3, 0x64 /* 80026C6C 00023BCC 38 61 00 34 */ addi r3, r1, 0x34 /* 80026C70 00023BD0 7F 00 D3 D6 */ divw r24, r0, r26 diff --git a/asm/MetroidPrime/Enemies/CAtomicAlpha.s b/asm/MetroidPrime/Enemies/CAtomicAlpha.s index 3287ae1d..38378d4d 100644 --- a/asm/MetroidPrime/Enemies/CAtomicAlpha.s +++ b/asm/MetroidPrime/Enemies/CAtomicAlpha.s @@ -860,7 +860,7 @@ CollidedWith__12CAtomicAlphaFRC9TUniqueIdRC18CCollisionInfoListR13CStateManager: /* 802454A8 00242408 B0 01 00 08 */ sth r0, 8(r1) /* 802454AC 0024240C 80 63 00 00 */ lwz r3, 0(r3) /* 802454B0 00242410 38 63 01 88 */ addi r3, r3, 0x188 -/* 802454B4 00242414 4B F7 B6 85 */ bl AddSource__19CStaticInterferenceF9TUniqueId +/* 802454B4 00242414 4B F7 B6 85 */ bl AddSource__19CStaticInterferenceF9TUniqueIdff /* 802454B8 00242418 C0 02 B8 44 */ lfs f0, lbl_805AD564@sda21(r2) /* 802454BC 0024241C 38 7C 06 E0 */ addi r3, r28, 0x6e0 /* 802454C0 00242420 38 80 00 00 */ li r4, 0 diff --git a/asm/MetroidPrime/Enemies/CAtomicBeta.s b/asm/MetroidPrime/Enemies/CAtomicBeta.s index bd811f6f..9ee4fd53 100644 --- a/asm/MetroidPrime/Enemies/CAtomicBeta.s +++ b/asm/MetroidPrime/Enemies/CAtomicBeta.s @@ -537,7 +537,7 @@ lbl_80250ECC: /* 80250F04 0024DE64 B0 01 00 10 */ sth r0, 0x10(r1) /* 80250F08 0024DE68 80 63 00 00 */ lwz r3, 0(r3) /* 80250F0C 0024DE6C 38 63 01 88 */ addi r3, r3, 0x188 -/* 80250F10 0024DE70 4B F6 FC 29 */ bl AddSource__19CStaticInterferenceF9TUniqueId +/* 80250F10 0024DE70 4B F6 FC 29 */ bl AddSource__19CStaticInterferenceF9TUniqueIdff lbl_80250F14: /* 80250F14 0024DE74 7F C3 F3 78 */ mr r3, r30 /* 80250F18 0024DE78 FC 20 F8 90 */ fmr f1, f31 diff --git a/asm/MetroidPrime/Enemies/CDrone.s b/asm/MetroidPrime/Enemies/CDrone.s index ead093c2..c8238f87 100644 --- a/asm/MetroidPrime/Enemies/CDrone.s +++ b/asm/MetroidPrime/Enemies/CDrone.s @@ -6191,7 +6191,7 @@ lbl_80164000: /* 801640EC 0016104C B0 01 00 0C */ sth r0, 0xc(r1) /* 801640F0 00161050 80 63 00 00 */ lwz r3, 0(r3) /* 801640F4 00161054 38 63 01 88 */ addi r3, r3, 0x188 -/* 801640F8 00161058 48 05 CA 41 */ bl AddSource__19CStaticInterferenceF9TUniqueId +/* 801640F8 00161058 48 05 CA 41 */ bl AddSource__19CStaticInterferenceF9TUniqueIdff /* 801640FC 0016105C C0 22 9F 80 */ lfs f1, lbl_805ABCA0@sda21(r2) /* 80164100 00161060 7E C5 B3 78 */ mr r5, r22 /* 80164104 00161064 C0 02 9F 68 */ lfs f0, lbl_805ABC88@sda21(r2) @@ -7073,7 +7073,7 @@ lbl_80164D84: /* 80164D9C 00161CFC B0 01 00 20 */ sth r0, 0x20(r1) /* 80164DA0 00161D00 80 63 00 00 */ lwz r3, 0(r3) /* 80164DA4 00161D04 38 63 01 88 */ addi r3, r3, 0x188 -/* 80164DA8 00161D08 48 05 BD 91 */ bl AddSource__19CStaticInterferenceF9TUniqueId +/* 80164DA8 00161D08 48 05 BD 91 */ bl AddSource__19CStaticInterferenceF9TUniqueIdff lbl_80164DAC: /* 80164DAC 00161D0C 88 1E 08 34 */ lbz r0, 0x834(r30) /* 80164DB0 00161D10 54 00 EF FF */ rlwinm. r0, r0, 0x1d, 0x1f, 0x1f @@ -7114,7 +7114,7 @@ lbl_80164E1C: /* 80164E34 00161D94 B0 01 00 10 */ sth r0, 0x10(r1) /* 80164E38 00161D98 80 63 00 00 */ lwz r3, 0(r3) /* 80164E3C 00161D9C 38 63 01 88 */ addi r3, r3, 0x188 -/* 80164E40 00161DA0 48 05 BC F9 */ bl AddSource__19CStaticInterferenceF9TUniqueId +/* 80164E40 00161DA0 48 05 BC F9 */ bl AddSource__19CStaticInterferenceF9TUniqueIdff lbl_80164E44: /* 80164E44 00161DA4 88 1E 08 34 */ lbz r0, 0x834(r30) /* 80164E48 00161DA8 54 00 EF FF */ rlwinm. r0, r0, 0x1d, 0x1f, 0x1f diff --git a/asm/MetroidPrime/Enemies/CJellyZap.s b/asm/MetroidPrime/Enemies/CJellyZap.s index 334c9d67..278810e7 100644 --- a/asm/MetroidPrime/Enemies/CJellyZap.s +++ b/asm/MetroidPrime/Enemies/CJellyZap.s @@ -749,8 +749,8 @@ lbl_801D7FA0: /* 801D8038 001D4F98 EC 24 08 BA */ fmadds f1, f4, f2, f1 /* 801D803C 001D4F9C FC 01 00 40 */ fcmpo cr0, f1, f0 /* 801D8040 001D4FA0 40 81 00 34 */ ble lbl_801D8074 -/* 801D8044 001D4FA4 C0 42 80 F8 */ lfs f2, lbl_805A9E18@sda21(r2) -/* 801D8048 001D4FA8 C0 62 80 FC */ lfs f3, lbl_805A9E1C@sda21(r2) +/* 801D8044 001D4FA4 C0 42 80 F8 */ lfs f2, skDefaultHudFadeOutSpeed__7CPlayer@sda21(r2) +/* 801D8048 001D4FA8 C0 62 80 FC */ lfs f3, skDefaultHudFadeInSpeed__7CPlayer@sda21(r2) /* 801D804C 001D4FAC 4B E3 B0 21 */ bl SetHudDisable__7CPlayerFfff /* 801D8050 001D4FB0 80 7F 08 4C */ lwz r3, 0x84c(r31) /* 801D8054 001D4FB4 7F E6 FB 78 */ mr r6, r31 @@ -771,7 +771,7 @@ lbl_801D8074: /* 801D808C 001D4FEC B0 01 00 08 */ sth r0, 8(r1) /* 801D8090 001D4FF0 80 63 00 00 */ lwz r3, 0(r3) /* 801D8094 001D4FF4 38 63 01 88 */ addi r3, r3, 0x188 -/* 801D8098 001D4FF8 4B FE 8A A1 */ bl AddSource__19CStaticInterferenceF9TUniqueId +/* 801D8098 001D4FF8 4B FE 8A A1 */ bl AddSource__19CStaticInterferenceF9TUniqueIdff lbl_801D809C: /* 801D809C 001D4FFC C0 1E 05 AC */ lfs f0, 0x5ac(r30) /* 801D80A0 001D5000 D0 1E 03 40 */ stfs f0, 0x340(r30) @@ -1019,7 +1019,7 @@ lbl_801D835C: /* 801D8404 001D5364 B0 01 00 10 */ sth r0, 0x10(r1) /* 801D8408 001D5368 80 63 00 00 */ lwz r3, 0(r3) /* 801D840C 001D536C 38 63 01 88 */ addi r3, r3, 0x188 -/* 801D8410 001D5370 4B FE 87 29 */ bl AddSource__19CStaticInterferenceF9TUniqueId +/* 801D8410 001D5370 4B FE 87 29 */ bl AddSource__19CStaticInterferenceF9TUniqueIdff /* 801D8414 001D5374 48 00 00 7C */ b lbl_801D8490 lbl_801D8418: /* 801D8418 001D5378 3C 60 80 3E */ lis r3, lbl_803DAA68@ha diff --git a/asm/MetroidPrime/Enemies/CMetroid.s b/asm/MetroidPrime/Enemies/CMetroid.s index f4fdf3ba..c5d2e124 100644 --- a/asm/MetroidPrime/Enemies/CMetroid.s +++ b/asm/MetroidPrime/Enemies/CMetroid.s @@ -2660,14 +2660,14 @@ lbl_8016C09C: /* 8016C0E8 00169048 B0 01 00 08 */ sth r0, 8(r1) /* 8016C0EC 0016904C 80 63 00 00 */ lwz r3, 0(r3) /* 8016C0F0 00169050 38 63 01 88 */ addi r3, r3, 0x188 -/* 8016C0F4 00169054 48 05 4A 45 */ bl AddSource__19CStaticInterferenceF9TUniqueId +/* 8016C0F4 00169054 48 05 4A 45 */ bl AddSource__19CStaticInterferenceF9TUniqueIdff /* 8016C0F8 00169058 80 7E 08 4C */ lwz r3, 0x84c(r30) /* 8016C0FC 0016905C C0 22 A0 B0 */ lfs f1, lbl_805ABDD0@sda21(r2) /* 8016C100 00169060 C0 03 07 40 */ lfs f0, 0x740(r3) /* 8016C104 00169064 FC 00 08 40 */ fcmpo cr0, f0, f1 /* 8016C108 00169068 40 80 00 10 */ bge lbl_8016C118 -/* 8016C10C 0016906C C0 42 80 F8 */ lfs f2, lbl_805A9E18@sda21(r2) -/* 8016C110 00169070 C0 62 80 FC */ lfs f3, lbl_805A9E1C@sda21(r2) +/* 8016C10C 0016906C C0 42 80 F8 */ lfs f2, skDefaultHudFadeOutSpeed__7CPlayer@sda21(r2) +/* 8016C110 00169070 C0 62 80 FC */ lfs f3, skDefaultHudFadeInSpeed__7CPlayer@sda21(r2) /* 8016C114 00169074 4B EA 6F 59 */ bl SetHudDisable__7CPlayerFfff lbl_8016C118: /* 8016C118 00169078 88 1D 04 02 */ lbz r0, 0x402(r29) diff --git a/asm/MetroidPrime/Enemies/CMetroidBeta.s b/asm/MetroidPrime/Enemies/CMetroidBeta.s index 6b93c8cd..1484a508 100644 --- a/asm/MetroidPrime/Enemies/CMetroidBeta.s +++ b/asm/MetroidPrime/Enemies/CMetroidBeta.s @@ -2214,15 +2214,15 @@ sub_801c2698: /* 801C2818 001BF778 80 63 00 00 */ lwz r3, 0(r3) /* 801C281C 001BF77C EC 21 00 32 */ fmuls f1, f1, f0 /* 801C2820 001BF780 38 63 01 88 */ addi r3, r3, 0x188 -/* 801C2824 001BF784 4B FF E3 15 */ bl AddSource__19CStaticInterferenceF9TUniqueId +/* 801C2824 001BF784 4B FF E3 15 */ bl AddSource__19CStaticInterferenceF9TUniqueIdff /* 801C2828 001BF788 80 7E 08 4C */ lwz r3, 0x84c(r30) /* 801C282C 001BF78C C0 22 AA F0 */ lfs f1, lbl_805AC810@sda21(r2) /* 801C2830 001BF790 C0 03 07 40 */ lfs f0, 0x740(r3) /* 801C2834 001BF794 FC 00 08 40 */ fcmpo cr0, f0, f1 /* 801C2838 001BF798 40 80 00 14 */ bge lbl_801C284C -/* 801C283C 001BF79C C0 42 80 F8 */ lfs f2, lbl_805A9E18@sda21(r2) +/* 801C283C 001BF79C C0 42 80 F8 */ lfs f2, skDefaultHudFadeOutSpeed__7CPlayer@sda21(r2) /* 801C2840 001BF7A0 7F E3 FB 78 */ mr r3, r31 -/* 801C2844 001BF7A4 C0 62 80 FC */ lfs f3, lbl_805A9E1C@sda21(r2) +/* 801C2844 001BF7A4 C0 62 80 FC */ lfs f3, skDefaultHudFadeInSpeed__7CPlayer@sda21(r2) /* 801C2848 001BF7A8 4B E5 08 25 */ bl SetHudDisable__7CPlayerFfff lbl_801C284C: /* 801C284C 001BF7AC C0 1D 07 A0 */ lfs f0, 0x7a0(r29) diff --git a/asm/MetroidPrime/Player/CGameState.s b/asm/MetroidPrime/Player/CGameState.s index a8265168..6011155c 100644 --- a/asm/MetroidPrime/Player/CGameState.s +++ b/asm/MetroidPrime/Player/CGameState.s @@ -873,10 +873,10 @@ lbl_801D4280: /* 801D435C 001D12BC 48 00 00 20 */ b lbl_801D437C lbl_801D4360: /* 801D4360 001D12C0 38 61 00 60 */ addi r3, r1, 0x60 -/* 801D4364 001D12C4 4B EB D1 49 */ bl GetTotalPickupCount__12CPlayerStateFv +/* 801D4364 001D12C4 4B EB D1 49 */ bl GetTotalPickupCount__12CPlayerStateCFv /* 801D4368 001D12C8 7C 7E 1B 78 */ mr r30, r3 /* 801D436C 001D12CC 38 61 00 60 */ addi r3, r1, 0x60 -/* 801D4370 001D12D0 4B EB CE C5 */ bl CalculateItemCollectionRate__12CPlayerStateFv +/* 801D4370 001D12D0 4B EB CE C5 */ bl CalculateItemCollectionRate__12CPlayerStateCFv /* 801D4374 001D12D4 1C 03 00 64 */ mulli r0, r3, 0x64 /* 801D4378 001D12D8 7C 00 F3 D6 */ divw r0, r0, r30 lbl_801D437C: diff --git a/asm/MetroidPrime/Player/CPlayer.s b/asm/MetroidPrime/Player/CPlayer.s index f7eed530..3cae05fa 100644 --- a/asm/MetroidPrime/Player/CPlayer.s +++ b/asm/MetroidPrime/Player/CPlayer.s @@ -440,13 +440,13 @@ lbl_805A9E14: # ROM: 0x3F66B4 .4byte lbl_803CC4F8 -.global lbl_805A9E18 -lbl_805A9E18: +.global skDefaultHudFadeOutSpeed__7CPlayer +skDefaultHudFadeOutSpeed__7CPlayer: # ROM: 0x3F66B8 .float 0.5 -.global lbl_805A9E1C -lbl_805A9E1C: +.global skDefaultHudFadeInSpeed__7CPlayer +skDefaultHudFadeInSpeed__7CPlayer: # ROM: 0x3F66BC .float 2.5 @@ -8555,7 +8555,7 @@ lbl_80016C58: /* 80016CAC 00013C0C B0 01 00 18 */ sth r0, 0x18(r1) /* 80016CB0 00013C10 80 63 00 00 */ lwz r3, 0(r3) /* 80016CB4 00013C14 38 63 01 88 */ addi r3, r3, 0x188 -/* 80016CB8 00013C18 48 1A 9E 81 */ bl AddSource__19CStaticInterferenceF9TUniqueId +/* 80016CB8 00013C18 48 1A 9E 81 */ bl AddSource__19CStaticInterferenceF9TUniqueIdff /* 80016CBC 00013C1C 48 00 00 68 */ b lbl_80016D24 .global lbl_80016CC0 lbl_80016CC0: diff --git a/asm/MetroidPrime/Player/CPlayerState.s b/asm/MetroidPrime/Player/CPlayerState.s index 43b4a9c6..26ef750e 100644 --- a/asm/MetroidPrime/Player/CPlayerState.s +++ b/asm/MetroidPrime/Player/CPlayerState.s @@ -137,8 +137,8 @@ GetMissileCostForAltAttack__12CPlayerStateCFv: /* 8009122C 0008E18C 7C 63 00 2E */ lwzx r3, r3, r0 /* 80091230 0008E190 4E 80 00 20 */ blr -.global CalculateItemCollectionRate__12CPlayerStateFv -CalculateItemCollectionRate__12CPlayerStateFv: +.global CalculateItemCollectionRate__12CPlayerStateCFv +CalculateItemCollectionRate__12CPlayerStateCFv: /* 80091234 0008E194 94 21 FF E0 */ stwu r1, -0x20(r1) /* 80091238 0008E198 7C 08 02 A6 */ mflr r0 /* 8009123C 0008E19C 38 80 00 07 */ li r4, 7 @@ -299,8 +299,8 @@ lbl_8009126C: /* 800914A4 0008E404 38 21 00 20 */ addi r1, r1, 0x20 /* 800914A8 0008E408 4E 80 00 20 */ blr -.global GetTotalPickupCount__12CPlayerStateFv -GetTotalPickupCount__12CPlayerStateFv: +.global GetTotalPickupCount__12CPlayerStateCFv +GetTotalPickupCount__12CPlayerStateCFv: /* 800914AC 0008E40C 38 60 00 63 */ li r3, 0x63 /* 800914B0 0008E410 4E 80 00 20 */ blr diff --git a/asm/MetroidPrime/Player/CStaticInterference.s b/asm/MetroidPrime/Player/CStaticInterference.s index fa1b569a..bb084786 100644 --- a/asm/MetroidPrime/Player/CStaticInterference.s +++ b/asm/MetroidPrime/Player/CStaticInterference.s @@ -292,8 +292,8 @@ lbl_801C0B0C: /* 801C0B30 001BDA90 38 21 00 10 */ addi r1, r1, 0x10 /* 801C0B34 001BDA94 4E 80 00 20 */ blr -.global AddSource__19CStaticInterferenceF9TUniqueId -AddSource__19CStaticInterferenceF9TUniqueId: +.global AddSource__19CStaticInterferenceF9TUniqueIdff +AddSource__19CStaticInterferenceF9TUniqueIdff: /* 801C0B38 001BDA98 94 21 FF C0 */ stwu r1, -0x40(r1) /* 801C0B3C 001BDA9C 7C 08 02 A6 */ mflr r0 /* 801C0B40 001BDAA0 90 01 00 44 */ stw r0, 0x44(r1) @@ -487,4 +487,3 @@ lbl_803D1A78: # ROM: 0x3CEA78 .asciz "??(??)" .balign 4 - diff --git a/asm/MetroidPrime/ScriptObjects/CEnergyBall.s b/asm/MetroidPrime/ScriptObjects/CEnergyBall.s index d70c414e..320fc458 100644 --- a/asm/MetroidPrime/ScriptObjects/CEnergyBall.s +++ b/asm/MetroidPrime/ScriptObjects/CEnergyBall.s @@ -463,7 +463,7 @@ lbl_8029F5E8: /* 8029F62C 0029C58C C0 3D 05 B8 */ lfs f1, 0x5b8(r29) /* 8029F630 0029C590 C0 5D 05 BC */ lfs f2, 0x5bc(r29) /* 8029F634 0029C594 38 63 01 88 */ addi r3, r3, 0x188 -/* 8029F638 0029C598 4B F2 15 01 */ bl AddSource__19CStaticInterferenceF9TUniqueId +/* 8029F638 0029C598 4B F2 15 01 */ bl AddSource__19CStaticInterferenceF9TUniqueIdff /* 8029F63C 0029C59C 48 00 01 68 */ b lbl_8029F7A4 lbl_8029F640: /* 8029F640 0029C5A0 38 00 00 00 */ li r0, 0 diff --git a/asm/MetroidPrime/ScriptObjects/CScriptEMPulse.s b/asm/MetroidPrime/ScriptObjects/CScriptEMPulse.s index e329fe97..6e665995 100644 --- a/asm/MetroidPrime/ScriptObjects/CScriptEMPulse.s +++ b/asm/MetroidPrime/ScriptObjects/CScriptEMPulse.s @@ -175,8 +175,8 @@ Touch__14CScriptEMPulseFR6CActorR13CStateManager: /* 8018ED7C 0018BCDC FC 1F 00 40 */ fcmpo cr0, f31, f0 /* 8018ED80 0018BCE0 40 81 00 3C */ ble lbl_8018EDBC /* 8018ED84 0018BCE4 FC 20 F8 90 */ fmr f1, f31 -/* 8018ED88 0018BCE8 C0 42 80 F8 */ lfs f2, lbl_805A9E18@sda21(r2) -/* 8018ED8C 0018BCEC C0 62 80 FC */ lfs f3, lbl_805A9E1C@sda21(r2) +/* 8018ED88 0018BCE8 C0 42 80 F8 */ lfs f2, skDefaultHudFadeOutSpeed__7CPlayer@sda21(r2) +/* 8018ED8C 0018BCEC C0 62 80 FC */ lfs f3, skDefaultHudFadeInSpeed__7CPlayer@sda21(r2) /* 8018ED90 0018BCF0 7F E3 FB 78 */ mr r3, r31 /* 8018ED94 0018BCF4 4B E8 42 D9 */ bl SetHudDisable__7CPlayerFfff /* 8018ED98 0018BCF8 80 BE 08 4C */ lwz r5, 0x84c(r30) @@ -198,7 +198,7 @@ lbl_8018EDBC: /* 8018EDD4 0018BD34 B0 01 00 08 */ sth r0, 8(r1) /* 8018EDD8 0018BD38 80 63 00 00 */ lwz r3, 0(r3) /* 8018EDDC 0018BD3C 38 63 01 88 */ addi r3, r3, 0x188 -/* 8018EDE0 0018BD40 48 03 1D 59 */ bl AddSource__19CStaticInterferenceF9TUniqueId +/* 8018EDE0 0018BD40 48 03 1D 59 */ bl AddSource__19CStaticInterferenceF9TUniqueIdff lbl_8018EDE4: /* 8018EDE4 0018BD44 E3 E1 00 68 */ psq_l f31, 104(r1), 0, qr0 /* 8018EDE8 0018BD48 CB E1 00 60 */ lfd f31, 0x60(r1) @@ -458,7 +458,7 @@ lbl_8018F0F4: /* 8018F17C 0018C0DC C0 3D 01 00 */ lfs f1, 0x100(r29) /* 8018F180 0018C0E0 C0 5D 00 F8 */ lfs f2, 0xf8(r29) /* 8018F184 0018C0E4 38 63 01 88 */ addi r3, r3, 0x188 -/* 8018F188 0018C0E8 48 03 19 B1 */ bl AddSource__19CStaticInterferenceF9TUniqueId +/* 8018F188 0018C0E8 48 03 19 B1 */ bl AddSource__19CStaticInterferenceF9TUniqueIdff lbl_8018F18C: /* 8018F18C 0018C0EC 80 01 00 74 */ lwz r0, 0x74(r1) /* 8018F190 0018C0F0 83 E1 00 6C */ lwz r31, 0x6c(r1) diff --git a/asm/MetroidPrime/ScriptObjects/CScriptPickup.s b/asm/MetroidPrime/ScriptObjects/CScriptPickup.s index b90db51f..6b066494 100644 --- a/asm/MetroidPrime/ScriptObjects/CScriptPickup.s +++ b/asm/MetroidPrime/ScriptObjects/CScriptPickup.s @@ -385,10 +385,10 @@ lbl_800C291C: /* 800C297C 000BF8DC 80 7E 08 B8 */ lwz r3, 0x8b8(r30) /* 800C2980 000BF8E0 83 43 00 00 */ lwz r26, 0(r3) /* 800C2984 000BF8E4 7F 43 D3 78 */ mr r3, r26 -/* 800C2988 000BF8E8 4B FC EB 25 */ bl GetTotalPickupCount__12CPlayerStateFv +/* 800C2988 000BF8E8 4B FC EB 25 */ bl GetTotalPickupCount__12CPlayerStateCFv /* 800C298C 000BF8EC 7C 7B 1B 78 */ mr r27, r3 /* 800C2990 000BF8F0 7F 43 D3 78 */ mr r3, r26 -/* 800C2994 000BF8F4 4B FC E8 A1 */ bl CalculateItemCollectionRate__12CPlayerStateFv +/* 800C2994 000BF8F4 4B FC E8 A1 */ bl CalculateItemCollectionRate__12CPlayerStateCFv /* 800C2998 000BF8F8 7C 03 D8 00 */ cmpw r3, r27 /* 800C299C 000BF8FC 40 82 00 60 */ bne lbl_800C29FC /* 800C29A0 000BF900 80 8D A0 80 */ lwz r4, gpGameState@sda21(r13) diff --git a/asm/MetroidPrime/ScriptObjects/CScriptSpecialFunction.s b/asm/MetroidPrime/ScriptObjects/CScriptSpecialFunction.s index 18e7cafc..c3858e57 100644 --- a/asm/MetroidPrime/ScriptObjects/CScriptSpecialFunction.s +++ b/asm/MetroidPrime/ScriptObjects/CScriptSpecialFunction.s @@ -292,8 +292,8 @@ GetTouchBounds__22CScriptSpecialFunctionCFv: /* 8014F32C 0014C28C D0 03 00 14 */ stfs f0, 0x14(r3) /* 8014F330 0014C290 4E 80 00 20 */ blr -.global GetSpecialEnding__22CScriptSpecialFunctionCFv -GetSpecialEnding__22CScriptSpecialFunctionCFv: +.global GetSpecialEnding__22CScriptSpecialFunctionCFRC13CStateManager +GetSpecialEnding__22CScriptSpecialFunctionCFRC13CStateManager: /* 8014F334 0014C294 94 21 FF F0 */ stwu r1, -0x10(r1) /* 8014F338 0014C298 7C 08 02 A6 */ mflr r0 /* 8014F33C 0014C29C 90 01 00 14 */ stw r0, 0x14(r1) @@ -302,10 +302,10 @@ GetSpecialEnding__22CScriptSpecialFunctionCFv: /* 8014F348 0014C2A8 80 64 08 B8 */ lwz r3, 0x8b8(r4) /* 8014F34C 0014C2AC 83 C3 00 00 */ lwz r30, 0(r3) /* 8014F350 0014C2B0 7F C3 F3 78 */ mr r3, r30 -/* 8014F354 0014C2B4 4B F4 21 59 */ bl GetTotalPickupCount__12CPlayerStateFv +/* 8014F354 0014C2B4 4B F4 21 59 */ bl GetTotalPickupCount__12CPlayerStateCFv /* 8014F358 0014C2B8 7C 7F 1B 78 */ mr r31, r3 /* 8014F35C 0014C2BC 7F C3 F3 78 */ mr r3, r30 -/* 8014F360 0014C2C0 4B F4 1E D5 */ bl CalculateItemCollectionRate__12CPlayerStateFv +/* 8014F360 0014C2C0 4B F4 1E D5 */ bl CalculateItemCollectionRate__12CPlayerStateCFv /* 8014F364 0014C2C4 1C 03 00 64 */ mulli r0, r3, 0x64 /* 8014F368 0014C2C8 7C 00 FB D6 */ divw r0, r0, r31 /* 8014F36C 0014C2CC 2C 00 00 4B */ cmpwi r0, 0x4b @@ -833,8 +833,8 @@ lbl_8014FA90: /* 8014FAE8 0014CA48 7C 04 00 00 */ cmpw r4, r0 /* 8014FAEC 0014CA4C 40 82 00 5C */ bne lbl_8014FB48 /* 8014FAF0 0014CA50 C0 3E 01 00 */ lfs f1, 0x100(r30) -/* 8014FAF4 0014CA54 C0 42 80 F8 */ lfs f2, lbl_805A9E18@sda21(r2) -/* 8014FAF8 0014CA58 C0 62 80 FC */ lfs f3, lbl_805A9E1C@sda21(r2) +/* 8014FAF4 0014CA54 C0 42 80 F8 */ lfs f2, skDefaultHudFadeOutSpeed__7CPlayer@sda21(r2) +/* 8014FAF8 0014CA58 C0 62 80 FC */ lfs f3, skDefaultHudFadeInSpeed__7CPlayer@sda21(r2) /* 8014FAFC 0014CA5C 4B EC 35 71 */ bl SetHudDisable__7CPlayerFfff /* 8014FB00 0014CA60 C0 22 9D B4 */ lfs f1, lbl_805ABAD4@sda21(r2) /* 8014FB04 0014CA64 38 61 00 28 */ addi r3, r1, 0x28 @@ -900,7 +900,7 @@ lbl_8014FBD4: /* 8014FBE8 0014CB48 B0 01 00 18 */ sth r0, 0x18(r1) /* 8014FBEC 0014CB4C 80 63 00 00 */ lwz r3, 0(r3) /* 8014FBF0 0014CB50 38 63 01 88 */ addi r3, r3, 0x188 -/* 8014FBF4 0014CB54 48 07 0F 45 */ bl AddSource__19CStaticInterferenceF9TUniqueId +/* 8014FBF4 0014CB54 48 07 0F 45 */ bl AddSource__19CStaticInterferenceF9TUniqueIdff lbl_8014FBF8: /* 8014FBF8 0014CB58 57 60 06 3F */ clrlwi. r0, r27, 0x18 /* 8014FBFC 0014CB5C 41 82 00 38 */ beq lbl_8014FC34 @@ -1386,7 +1386,7 @@ ThinkSpinnerController__22CScriptSpecialFunctionFfR13CStateManagerQ222CScriptSpe /* 801502F0 0014D250 38 78 00 EC */ addi r3, r24, 0xec /* 801502F4 0014D254 38 81 00 98 */ addi r4, r1, 0x98 /* 801502F8 0014D258 38 A0 00 00 */ li r5, 0 -/* 801502FC 0014D25C 48 00 0A 9D */ bl sub_80150d98 +/* 801502FC 0014D25C 48 00 0A 9D */ bl "string_find__4rstlFRCQ24rstl66basic_string,Q24rstl17rmemory_allocator>RCQ24rstl66basic_string,Q24rstl17rmemory_allocator>i" /* 80150300 0014D260 20 83 FF FF */ subfic r4, r3, -1 /* 80150304 0014D264 38 03 00 01 */ addi r0, r3, 1 /* 80150308 0014D268 7C 80 03 78 */ or r0, r4, r0 @@ -1401,7 +1401,7 @@ ThinkSpinnerController__22CScriptSpecialFunctionFfR13CStateManagerQ222CScriptSpe /* 8015032C 0014D28C 38 78 00 EC */ addi r3, r24, 0xec /* 80150330 0014D290 38 81 00 88 */ addi r4, r1, 0x88 /* 80150334 0014D294 38 A0 00 00 */ li r5, 0 -/* 80150338 0014D298 48 00 0A 61 */ bl sub_80150d98 +/* 80150338 0014D298 48 00 0A 61 */ bl "string_find__4rstlFRCQ24rstl66basic_string,Q24rstl17rmemory_allocator>RCQ24rstl66basic_string,Q24rstl17rmemory_allocator>i" /* 8015033C 0014D29C 20 83 FF FF */ subfic r4, r3, -1 /* 80150340 0014D2A0 38 03 00 01 */ addi r0, r3, 1 /* 80150344 0014D2A4 7C 80 03 78 */ or r0, r4, r0 @@ -1902,14 +1902,14 @@ lbl_80150A50: /* 80150A5C 0014D9BC 38 A1 00 0C */ addi r5, r1, 0xc /* 80150A60 0014D9C0 90 01 00 08 */ stw r0, 8(r1) /* 80150A64 0014D9C4 90 01 00 0C */ stw r0, 0xc(r1) -/* 80150A68 0014D9C8 48 00 00 15 */ bl sub_80150a7c +/* 80150A68 0014D9C8 48 00 00 15 */ bl "insert__Q24rstl36vectorFQ24rstl92pointer_iterator,Q24rstl17rmemory_allocator>RCf" /* 80150A6C 0014D9CC 80 01 00 24 */ lwz r0, 0x24(r1) /* 80150A70 0014D9D0 7C 08 03 A6 */ mtlr r0 /* 80150A74 0014D9D4 38 21 00 20 */ addi r1, r1, 0x20 /* 80150A78 0014D9D8 4E 80 00 20 */ blr -.global sub_80150a7c -sub_80150a7c: +.global "insert__Q24rstl36vectorFQ24rstl92pointer_iterator,Q24rstl17rmemory_allocator>RCf" +"insert__Q24rstl36vectorFQ24rstl92pointer_iterator,Q24rstl17rmemory_allocator>RCf": /* 80150A7C 0014D9DC 94 21 FF D0 */ stwu r1, -0x30(r1) /* 80150A80 0014D9E0 7C 08 02 A6 */ mflr r0 /* 80150A84 0014D9E4 90 01 00 34 */ stw r0, 0x34(r1) @@ -1933,7 +1933,7 @@ sub_80150a7c: /* 80150ACC 0014DA2C 38 81 00 08 */ addi r4, r1, 8 /* 80150AD0 0014DA30 90 01 00 10 */ stw r0, 0x10(r1) /* 80150AD4 0014DA34 90 E1 00 08 */ stw r7, 8(r1) -/* 80150AD8 0014DA38 48 00 00 31 */ bl sub_80150b08 +/* 80150AD8 0014DA38 48 00 00 31 */ bl "insert_into>__Q24rstl36vectorFQ24rstl92pointer_iterator,Q24rstl17rmemory_allocator>iQ24rstl26const_counting_iterator" /* 80150ADC 0014DA3C 80 7E 00 0C */ lwz r3, 0xc(r30) /* 80150AE0 0014DA40 57 E0 10 3A */ slwi r0, r31, 2 /* 80150AE4 0014DA44 7C 63 02 14 */ add r3, r3, r0 @@ -1946,8 +1946,8 @@ sub_80150a7c: /* 80150B00 0014DA60 38 21 00 30 */ addi r1, r1, 0x30 /* 80150B04 0014DA64 4E 80 00 20 */ blr -.global sub_80150b08 -sub_80150b08: +.global "insert_into>__Q24rstl36vectorFQ24rstl92pointer_iterator,Q24rstl17rmemory_allocator>iQ24rstl26const_counting_iterator" +"insert_into>__Q24rstl36vectorFQ24rstl92pointer_iterator,Q24rstl17rmemory_allocator>iQ24rstl26const_counting_iterator": /* 80150B08 0014DA68 94 21 FF D0 */ stwu r1, -0x30(r1) /* 80150B0C 0014DA6C 7C 08 02 A6 */ mflr r0 /* 80150B10 0014DA70 90 01 00 34 */ stw r0, 0x34(r1) @@ -2143,8 +2143,8 @@ lbl_80150D84: /* 80150D90 0014DCF0 38 21 00 10 */ addi r1, r1, 0x10 /* 80150D94 0014DCF4 4E 80 00 20 */ blr -.global sub_80150d98 -sub_80150d98: +.global "string_find__4rstlFRCQ24rstl66basic_string,Q24rstl17rmemory_allocator>RCQ24rstl66basic_string,Q24rstl17rmemory_allocator>i" +"string_find__4rstlFRCQ24rstl66basic_string,Q24rstl17rmemory_allocator>RCQ24rstl66basic_string,Q24rstl17rmemory_allocator>i": /* 80150D98 0014DCF8 94 21 FF A0 */ stwu r1, -0x60(r1) /* 80150D9C 0014DCFC 7C 08 02 A6 */ mflr r0 /* 80150DA0 0014DD00 2C 05 FF FF */ cmpwi r5, -1 @@ -3543,7 +3543,7 @@ lbl_8015214C: /* 80152150 0014F0B0 40 82 07 50 */ bne lbl_801528A0 /* 80152154 0014F0B4 7F E3 FB 78 */ mr r3, r31 /* 80152158 0014F0B8 7F C4 F3 78 */ mr r4, r30 -/* 8015215C 0014F0BC 4B FF D1 D9 */ bl GetSpecialEnding__22CScriptSpecialFunctionCFv +/* 8015215C 0014F0BC 4B FF D1 D9 */ bl GetSpecialEnding__22CScriptSpecialFunctionCFRC13CStateManager /* 80152160 0014F0C0 2C 03 00 01 */ cmpwi r3, 1 /* 80152164 0014F0C4 41 82 00 30 */ beq lbl_80152194 /* 80152168 0014F0C8 40 80 00 10 */ bge lbl_80152178 @@ -4042,7 +4042,7 @@ lbl_80152860: /* 80152864 0014F7C4 40 82 00 3C */ bne lbl_801528A0 /* 80152868 0014F7C8 7F E3 FB 78 */ mr r3, r31 /* 8015286C 0014F7CC 7F C4 F3 78 */ mr r4, r30 -/* 80152870 0014F7D0 4B FF CA C5 */ bl GetSpecialEnding__22CScriptSpecialFunctionCFv +/* 80152870 0014F7D0 4B FF CA C5 */ bl GetSpecialEnding__22CScriptSpecialFunctionCFRC13CStateManager /* 80152874 0014F7D4 C0 1F 00 FC */ lfs f0, 0xfc(r31) /* 80152878 0014F7D8 FC 00 00 1E */ fctiwz f0, f0 /* 8015287C 0014F7DC D8 01 01 68 */ stfd f0, 0x168(r1) diff --git a/asm/MetroidPrime/Weapons/CPlasmaProjectile.s b/asm/MetroidPrime/Weapons/CPlasmaProjectile.s index ea2b733a..3031172f 100644 --- a/asm/MetroidPrime/Weapons/CPlasmaProjectile.s +++ b/asm/MetroidPrime/Weapons/CPlasmaProjectile.s @@ -2039,8 +2039,8 @@ lbl_80178778: /* 801787A0 00175700 48 17 15 D5 */ bl SfxStart__11CSfxManagerFUsssbsbi /* 801787A4 00175704 80 7E 08 4C */ lwz r3, 0x84c(r30) /* 801787A8 00175708 C0 22 A2 1C */ lfs f1, lbl_805ABF3C@sda21(r2) -/* 801787AC 0017570C C0 42 80 F8 */ lfs f2, lbl_805A9E18@sda21(r2) -/* 801787B0 00175710 C0 62 80 FC */ lfs f3, lbl_805A9E1C@sda21(r2) +/* 801787AC 0017570C C0 42 80 F8 */ lfs f2, skDefaultHudFadeOutSpeed__7CPlayer@sda21(r2) +/* 801787B0 00175710 C0 62 80 FC */ lfs f3, skDefaultHudFadeInSpeed__7CPlayer@sda21(r2) /* 801787B4 00175714 4B E9 A8 B9 */ bl SetHudDisable__7CPlayerFfff /* 801787B8 00175718 80 7E 08 4C */ lwz r3, 0x84c(r30) /* 801787BC 0017571C 7F C6 F3 78 */ mr r6, r30 @@ -2060,7 +2060,7 @@ lbl_80178778: /* 801787F4 00175754 B0 01 00 20 */ sth r0, 0x20(r1) /* 801787F8 00175758 80 63 00 00 */ lwz r3, 0(r3) /* 801787FC 0017575C 38 63 01 88 */ addi r3, r3, 0x188 -/* 80178800 00175760 48 04 83 39 */ bl AddSource__19CStaticInterferenceF9TUniqueId +/* 80178800 00175760 48 04 83 39 */ bl AddSource__19CStaticInterferenceF9TUniqueIdff /* 80178804 00175764 48 00 00 70 */ b lbl_80178874 lbl_80178808: /* 80178808 00175768 88 1D 05 40 */ lbz r0, 0x540(r29) diff --git a/configure.py b/configure.py index cb48bd56..a0e22f07 100755 --- a/configure.py +++ b/configure.py @@ -1106,6 +1106,11 @@ LIBS = [ }, ] +# Create & link static libraries +# Currently broken due to deadstripping +ENABLE_STATIC_LIBS = False + +# On Windows, we need this to use && in commands ALLOW_CHAIN = "cmd /c " if os.name == "nt" else "" out = io.StringIO() @@ -1170,9 +1175,10 @@ n.newline() n.rule(name="as", command="$devkitppc/bin/powerpc-eabi-as $asflags -o $out $in -MD $out.d", description="AS $out", depfile="$out.d", deps="gcc") n.newline() -n.rule(name="ar", command="$devkitppc/bin/powerpc-eabi-ar crs $out $in", - description="AR $out") -n.newline() +if ENABLE_STATIC_LIBS: + n.rule(name="ar", command="$devkitppc/bin/powerpc-eabi-ar crs $out $in", + description="AR $out") + n.newline() n.rule(name="link", command="$wine tools/mwcc_compiler/$mwcc_version/mwldeppc.exe $ldflags -o $out @$out.rsp", description="LINK $out", rspfile="$out.rsp", rspfile_content="$in") n.newline() @@ -1212,23 +1218,23 @@ for lib in LIBS: inputs.append(f"$builddir/src/{object}.o") else: inputs.append(f"$builddir/asm/{object}.o") - if "lib" in lib: + if ENABLE_STATIC_LIBS and "lib" in lib: lib_name = lib["lib"] - n.build(f"$builddir/{lib_name}.a", "ar", inputs) + n.build(f"$builddir/lib/{lib_name}.a", "ar", inputs) n.newline() n.comment("main.elf") inputs = [] for lib in LIBS: - # if "lib" in lib: - # lib_name = lib["lib"] - # inputs.append(f"$builddir/{lib_name}.a") - # else: - for object in lib["objects"]: - if object in COMPLETE_OBJECTS: - inputs.append(f"$builddir/src/{object}.o") - else: - inputs.append(f"$builddir/asm/{object}.o") + if ENABLE_STATIC_LIBS and "lib" in lib: + lib_name = lib["lib"] + inputs.append(f"$builddir/lib/{lib_name}.a") + else: + for object in lib["objects"]: + if object in COMPLETE_OBJECTS: + inputs.append(f"$builddir/src/{object}.o") + else: + inputs.append(f"$builddir/asm/{object}.o") if args.map: n.build("$builddir/main.elf", "link", inputs, implicit_outputs="$builddir/MetroidPrime.MAP") diff --git a/include/Collision/CMaterialFilter.hpp b/include/Collision/CMaterialFilter.hpp index 2e7759a7..59bf00e6 100644 --- a/include/Collision/CMaterialFilter.hpp +++ b/include/Collision/CMaterialFilter.hpp @@ -18,6 +18,12 @@ public: CMaterialFilter(const CMaterialList& include, const CMaterialList& exclude, EFilterType type) : include(include), exclude(exclude), type(type) {} + static CMaterialFilter MakeInclude(const CMaterialList& include) { + return CMaterialFilter(include, CMaterialList(), kFT_Include); + } + static CMaterialFilter MakeExclude(const CMaterialList& exclude) { + return CMaterialFilter(CMaterialList(), exclude, kFT_Exclude); + } static CMaterialFilter MakeIncludeExclude(const CMaterialList& include, const CMaterialList& exclude) { return CMaterialFilter(include, exclude, kFT_IncludeExclude); diff --git a/include/Kyoto/TAverage.hpp b/include/Kyoto/TAverage.hpp index 5d36d0b2..3d5bcf1c 100644 --- a/include/Kyoto/TAverage.hpp +++ b/include/Kyoto/TAverage.hpp @@ -12,7 +12,13 @@ public: TAverage() {} TAverage(int capacity, const T& value); void AddValue(const T& value); - rstl::optional_object< T > GetAverage() const; + rstl::optional_object< T > GetAverage() const { + if (empty()) { + return rstl::optional_object_null(); + } else { + return GetAverageValue(data(), size()); + } + } }; template < typename T > @@ -22,11 +28,14 @@ TAverage< T >::TAverage(int capacity, const T& value) { template < typename T > void TAverage< T >::AddValue(const T& value) { - push_back(value); - for (int i = size() - 1; i > 0; --i) { - operator[](i) = operator[](i - 1); + if (size() == capacity()) { + // TODO ? + x4_count -= 1; } - operator[](0) = value; + insert(begin(), value); } +template < typename T > +T GetAverageValue(const T* ptr, int count); // TODO + #endif diff --git a/include/Kyoto/TReservedAverage.hpp b/include/Kyoto/TReservedAverage.hpp index 1053f463..a2cf29ed 100644 --- a/include/Kyoto/TReservedAverage.hpp +++ b/include/Kyoto/TReservedAverage.hpp @@ -3,6 +3,8 @@ #include "types.h" +#include "Kyoto/TAverage.hpp" + #include "rstl/optional_object.hpp" #include "rstl/reserved_vector.hpp" diff --git a/include/MetaRender/CCubeRenderer.hpp b/include/MetaRender/CCubeRenderer.hpp index b60712a1..f5ec4af7 100644 --- a/include/MetaRender/CCubeRenderer.hpp +++ b/include/MetaRender/CCubeRenderer.hpp @@ -11,8 +11,13 @@ #include "Kyoto/Math/CAABox.hpp" #include "Kyoto/Math/CTransform4f.hpp" #include "Kyoto/Math/CVector2f.hpp" +#include "Kyoto/Math/CVector3f.hpp" +#include "Kyoto/TToken.hpp" + #include "rstl/pair.hpp" +class CSkinnedModel; + class CCubeRenderer { public: virtual ~CCubeRenderer(); @@ -71,7 +76,8 @@ public: virtual void DrawModelFlat(); virtual void SetWireframeFlags(); virtual void SetWorldFog(); - virtual void RenderFogVolume(const CColor&, const CAABox&, const TLockedToken*, const CSkinnedModel*); + virtual void RenderFogVolume(const CColor&, const CAABox&, const TLockedToken< CModel >*, + const CSkinnedModel*); virtual void SetThermal(); virtual void SetThermalColdScale(); virtual void DoThermalBlendCold(); diff --git a/include/MetroidPrime/CStateManager.hpp b/include/MetroidPrime/CStateManager.hpp index e0e9b3cb..73a47f1a 100644 --- a/include/MetroidPrime/CStateManager.hpp +++ b/include/MetroidPrime/CStateManager.hpp @@ -12,6 +12,8 @@ #include "MetroidPrime/CEntityInfo.hpp" #include "MetroidPrime/CObjectList.hpp" +#include "MetroidPrime/Cameras/CCameraBlurPass.hpp" +#include "MetroidPrime/Cameras/CCameraFilterPass.hpp" #include "MetroidPrime/TGameTypes.hpp" #include "rstl/auto_ptr.hpp" @@ -81,6 +83,19 @@ public: typedef rstl::map< TEditorId, TUniqueId > TIdList; typedef rstl::pair< TIdList::const_iterator, TIdList::const_iterator > TIdListResult; + enum ECameraFilterStage { + kCFS_Zero, + kCFS_One, + kCFS_Two, + kCFS_Three, + kCFS_Four, + kCFS_Five, + kCFS_Six, + kCFS_Seven, + kCFS_Eight, + kCFS_Max, + }; + void ResetEscapeSequenceTimer(float); void SendScriptMsg(TUniqueId uid, TEditorId target, EScriptObjectMessage msg, EScriptObjectState state); @@ -91,6 +106,8 @@ public: void FreeScriptObject(TUniqueId uid); rstl::pair< TEditorId, TUniqueId > GenerateObject(const TEditorId& eid); + void BuildNearList(TEntityList& nearList, const CAABox&, const CMaterialFilter&, + const CActor*) const; bool RayCollideWorld(const CVector3f& start, const CVector3f& end, const TEntityList& nearList, const CMaterialFilter& filter, const CActor* damagee) const; CRayCastResult RayWorldIntersection(TUniqueId& idOut, const CVector3f& pos, const CVector3f& dir, @@ -126,6 +143,13 @@ public: CObjectList& GetObjectListById(EGameObjectList id) { return *x808_objectLists[id]; } + CCameraFilterPass& CameraFilterPass(ECameraFilterStage stage) { + return xb84_camFilterPasses[size_t(stage)]; + } + const CCameraFilterPass& GetCameraFilterPass(ECameraFilterStage stage) const { + return xb84_camFilterPasses[size_t(stage)]; + } + f32 GetThermalColdScale1() const { return xf24_thermColdScale1; } f32 GetThermalColdScale2() const { return xf28_thermColdScale2; } @@ -169,7 +193,8 @@ private: CWeaponMgr* x878_weaponMgr; CFluidPlaneManager* x87c_fluidPlaneManager; CEnvFxManager* x880_envFxManager; - rstl::auto_ptr< CActorModelParticles > x884_actorModelParticles; + rstl::single_ptr< CActorModelParticles > x884_actorModelParticles; + uint x888_; CRumbleManager* x88c_rumbleManager; // TODO // rstl::multimap< TEditorId, TUniqueId > x890_scriptIdMap; @@ -193,8 +218,12 @@ private: CRandom16 x8fc_random; CRandom16* x900_random; - u8 x904_pad[0x5f0]; + u8 x904_pad[0x280]; + rstl::reserved_vector< CCameraFilterPass, kCFS_Max > xb84_camFilterPasses; + rstl::reserved_vector< CCameraBlurPass, kCFS_Max > xd14_camBlurPasses; + int xeec_hintIdx; + uint xef0_hintPeriods; SOnScreenTex xef4_pendingScreenTex; CAssetId xf08_pauseHudMessage; f32 xf0c_escapeTimer; diff --git a/include/MetroidPrime/Cameras/CCameraBlurPass.hpp b/include/MetroidPrime/Cameras/CCameraBlurPass.hpp new file mode 100644 index 00000000..a6184c46 --- /dev/null +++ b/include/MetroidPrime/Cameras/CCameraBlurPass.hpp @@ -0,0 +1,42 @@ +#ifndef _CCAMERABLURPASS_HPP +#define _CCAMERABLURPASS_HPP + +#include "types.h" + +#include "MetroidPrime/TGameTypes.hpp" + +#include "Kyoto/Graphics/CColor.hpp" +#include "Kyoto/TToken.hpp" + +#include "rstl/auto_ptr.hpp" +#include "rstl/optional_object.hpp" + +class CTexture; + +class CCameraBlurPass { +public: + enum EBlurType { + kBT_NoBlur, + kBT_LoBlur, + kBT_HiBlur, + kBT_XRay, + }; + + static void DrawWideScreen(const CColor& color, const CTexture* tex, f32 v); + +private: + rstl::optional_object< TLockedToken< CTexture > > x0_paletteTex; + EBlurType x10_curType; + EBlurType x14_endType; + float x18_endValue; + float x1c_curValue; + float x20_startValue; + float x24_totalTime; + float x28_remainingTime; + bool x2c_usePersistent; + bool x2d_noPersistentCopy; + uint x30_persistentBuf; +}; +CHECK_SIZEOF(CCameraBlurPass, 0x34) + +#endif diff --git a/include/MetroidPrime/Cameras/CCameraFilterPass.hpp b/include/MetroidPrime/Cameras/CCameraFilterPass.hpp index c3717c82..176b1053 100644 --- a/include/MetroidPrime/Cameras/CCameraFilterPass.hpp +++ b/include/MetroidPrime/Cameras/CCameraFilterPass.hpp @@ -3,13 +3,59 @@ #include "types.h" -#include "Kyoto/Graphics/CColor.hpp" +#include "MetroidPrime/TGameTypes.hpp" -#include "CTexture.hpp" +#include "Kyoto/Graphics/CColor.hpp" +#include "Kyoto/TToken.hpp" + +#include "rstl/auto_ptr.hpp" + +class CTexture; class CCameraFilterPass { public: + enum EFilterType { + kFT_Passthru, + kFT_Multiply, + kFT_Invert, + kFT_Add, + kFT_Subtract, + kFT_Blend, + kFT_Widescreen, + kFT_SceneAdd, + kFT_NoColor, + kFT_InvDstMultiply, + }; + enum EFilterShape { + kFS_Fullscreen, + kFS_FullscreenHalvesLeftRight, + kFS_FullscreenHalvesTopBottom, + kFS_FullscreenQuarters, + kFS_CinemaBars, + kFS_ScanLinesEven, + kFS_ScanLinesOdd, + kFS_RandomStatic, + kFS_CookieCutterDepthRandomStatic + }; + + void SetFilter(EFilterType type, EFilterShape shape, float time, const CColor& color, + CAssetId txtr); + void DisableFilter(float time); + static void DrawWideScreen(const CColor& color, const CTexture* tex, f32 v); + +private: + EFilterType x0_curType; + EFilterType x4_nextType; + EFilterShape x8_shape; + float xc_duration; + float x10_remTime; + CColor x14_prevColor; + CColor x18_curColor; + CColor x1c_nextColor; + CAssetId x20_nextTxtr; + rstl::auto_ptr< TLockedToken< CTexture > > x24_texObj; }; +CHECK_SIZEOF(CCameraFilterPass, 0x2c) #endif diff --git a/include/MetroidPrime/Player/CPlayer.hpp b/include/MetroidPrime/Player/CPlayer.hpp index 5cf5fe84..e1fbb3a6 100644 --- a/include/MetroidPrime/Player/CPlayer.hpp +++ b/include/MetroidPrime/Player/CPlayer.hpp @@ -153,10 +153,17 @@ public: EPlayerOrbitState GetOrbitState() const { return x304_orbitState; } const CVector3f& GetMovementDirection() const { return x50c_moveDir; } EPlayerMorphBallState GetMorphballTransitionState() const { return x2f8_morphBallState; } - void SetHudDisable(float staticTimer, float outSpeed, float inSpeed); + + static float skDefaultHudFadeOutSpeed; + static float skDefaultHudFadeInSpeed; + void SetHudDisable(float staticTimer, float outSpeed = skDefaultHudFadeOutSpeed, + float inSpeed = skDefaultHudFadeInSpeed); + void IncrementPhazon(); void DecrementPhazon(); // GetMovementDirection2D__7CPlayerCFv ?? + void AddOrbitDisableSource(CStateManager& mgr, TUniqueId addId); + void RemoveOrbitDisableSource(TUniqueId uid); private: struct CVisorSteam { diff --git a/include/MetroidPrime/Player/CPlayerState.hpp b/include/MetroidPrime/Player/CPlayerState.hpp index 363acce2..eea7da74 100644 --- a/include/MetroidPrime/Player/CPlayerState.hpp +++ b/include/MetroidPrime/Player/CPlayerState.hpp @@ -92,11 +92,11 @@ public: explicit CPlayerState(CInputStream& stream); void PutTo(COutputStream& stream); - u32 GetMissileCostForAltAttack() const; + int GetMissileCostForAltAttack() const; float GetComboFireAmmoPeriod() const; static float GetMissileComboChargeFactor(); - u32 CalculateItemCollectionRate() const; - u32 GetTotalPickupCount() const; + int CalculateItemCollectionRate() const; + int GetTotalPickupCount() const; void SetIsFusionEnabled(bool v); bool GetIsFusionEnabled() const; @@ -111,7 +111,7 @@ public: EPlayerVisor GetActiveVisor(const CStateManager& mgr) const; void UpdateStaticInterference(CStateManager& stateMgr, const float& dt); - void IncreaseScanTime(u32 time, float val); + void IncreaseScanTime(uint time, float val); void SetScanTime(CAssetId res, float time); float GetScanTime(CAssetId time) const; bool GetIsVisorTransitioning() const; @@ -124,9 +124,9 @@ public: void DisableItem(EItemType type); void EnableItem(EItemType type); bool HasPowerUp(EItemType type) const; - u32 GetPowerUp(EItemType type); - u32 GetItemCapacity(EItemType type) const; - u32 GetItemAmount(EItemType type) const; + uint GetPowerUp(EItemType type); + uint GetItemCapacity(EItemType type) const; + uint GetItemAmount(EItemType type) const; void DecrPickUp(EItemType type, int amount); void IncrPickUp(EItemType type, int amount); void ResetAndIncrPickUp(EItemType type, int amount); @@ -140,7 +140,8 @@ public: static uint GetBitCount(uint); - CStaticInterference& GetStaticInterference() { return x188_staticIntf; } + CStaticInterference& StaticInterference() { return x188_staticIntf; } + const CStaticInterference& GetStaticInterference() const { return x188_staticIntf; } const rstl::vector< rstl::pair< CAssetId, float > >& GetScanTimes() const { return x170_scanTimes; @@ -162,7 +163,7 @@ private: bool x0_24_alive : 1; bool x0_25_firingComboBeam : 1; bool x0_26_fusion : 1; - u32 x4_enabledItems; + uint x4_enabledItems; EBeamId x8_currentBeam; CHealthInfo xc_health; EPlayerVisor x14_currentVisor; @@ -171,7 +172,7 @@ private: EPlayerSuit x20_currentSuit; rstl::reserved_vector< CPowerUp, 41 > x24_powerups; rstl::vector< rstl::pair< CAssetId, float > > x170_scanTimes; - rstl::pair< u32, u32 > x180_scanCompletionRate; + rstl::pair< uint, uint > x180_scanCompletionRate; CStaticInterference x188_staticIntf; }; diff --git a/include/MetroidPrime/Player/CStaticInterference.hpp b/include/MetroidPrime/Player/CStaticInterference.hpp index c215ec0e..b11a6c7a 100644 --- a/include/MetroidPrime/Player/CStaticInterference.hpp +++ b/include/MetroidPrime/Player/CStaticInterference.hpp @@ -14,7 +14,12 @@ struct CStaticInterferenceSource { class CStaticInterference { public: - CStaticInterference(int); + CStaticInterference(int sourceCount); + + void AddSource(TUniqueId id, float magnitude, float duration); + void RemoveSource(TUniqueId id); + void Update(CStateManager&, float dt); + float GetTotalInterference() const; private: rstl::vector< CStaticInterferenceSource > sources; diff --git a/include/MetroidPrime/ScriptObjects/CScriptSpecialFunction.hpp b/include/MetroidPrime/ScriptObjects/CScriptSpecialFunction.hpp index a27aa318..8c863e8f 100644 --- a/include/MetroidPrime/ScriptObjects/CScriptSpecialFunction.hpp +++ b/include/MetroidPrime/ScriptObjects/CScriptSpecialFunction.hpp @@ -67,7 +67,12 @@ public: float x4_rotateSpeed; bool x8_reachedTarget; CVector3f xc_; - SRingController(TUniqueId uid, float rotateSpeed, bool reachedTarget); + + SRingController(TUniqueId uid, float rotateSpeed, bool reachedTarget) + : x0_id(uid) + , x4_rotateSpeed(rotateSpeed) + , x8_reachedTarget(reachedTarget) + , xc_(CVector3f::Zero()) {} }; private: @@ -87,7 +92,7 @@ private: u16 x172_sfx2; u16 x174_sfx3; CSfxHandle x178_sfxHandle; - u32 x17c_; + uint x17c_; float x180_; TAverage< f32 > x184_; float x194_; @@ -142,7 +147,7 @@ public: bool ShouldSkipCinematic(CStateManager& stateMgr) const; void DeleteEmitter(CSfxHandle& handle); - u32 GetSpecialEnding(const CStateManager&) const; + int GetSpecialEnding(const CStateManager&) const; void AddOrUpdateEmitter(float pitch, CSfxHandle& handle, u16 id, const CVector3f& pos, uchar vol); }; diff --git a/include/MetroidPrime/Weapons/CEnergyProjectile.hpp b/include/MetroidPrime/Weapons/CEnergyProjectile.hpp new file mode 100644 index 00000000..28ab63b2 --- /dev/null +++ b/include/MetroidPrime/Weapons/CEnergyProjectile.hpp @@ -0,0 +1,51 @@ +#ifndef _CENERGYPROJECTILE_HPP +#define _CENERGYPROJECTILE_HPP + +#include "types.h" + +#include "MetroidPrime/Cameras/CCameraShakeData.hpp" +#include "MetroidPrime/Weapons/CGameProjectile.hpp" + +#include "Kyoto/Audio/CSfxHandle.hpp" +#include "Kyoto/Math/CVector3f.hpp" + +class CEnergyProjectile : public CGameProjectile { +public: + // TODO ctor + + // CEntity + ~CEnergyProjectile() override; + void Accept(IVisitor& visitor) override; + void Think(f32 dt, CStateManager& mgr) override; + void AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId uid, CStateManager& mgr) override; + + // CActor + void AddToRenderer(const CFrustumPlanes&, const CStateManager&) const override; + void Render(const CStateManager&) const override; + void Touch(CActor&, CStateManager&) override; + + // CGameProjectile + void ResolveCollisionWithActor(const CRayCastResult& res, CActor& act, + CStateManager& mgr) override; + + // CEnergyProjectile + virtual bool Explode(const CVector3f& pos, const CVector3f& normal, + EWeaponCollisionResponseTypes type, CStateManager& mgr, + const CDamageVulnerability& dVuln, TUniqueId hitActor); + + void Set3d0_26(bool v) { x3d0_26_ = v; } + +private: + CSfxHandle x2e8_sfx; + CVector3f x2ec_dir; + float x2f8_mag; + CCameraShakeData x2fc_camShake; + bool x3d0_24_dead : 1; + bool x3d0_25_ : 1; + bool x3d0_26_ : 1; + bool x3d0_27_camShakeDirty : 1; + float x3d4_curTime; +}; +CHECK_SIZEOF(CEnergyProjectile, 0x3d8); + +#endif diff --git a/include/MetroidPrime/Weapons/CGameProjectile.hpp b/include/MetroidPrime/Weapons/CGameProjectile.hpp new file mode 100644 index 00000000..8a1b0d84 --- /dev/null +++ b/include/MetroidPrime/Weapons/CGameProjectile.hpp @@ -0,0 +1,62 @@ +#ifndef _CGAMEPROJECTILE_HPP +#define _CGAMEPROJECTILE_HPP + +#include "types.h" + +#include "MetroidPrime/Weapons/CProjectileWeapon.hpp" +#include "MetroidPrime/Weapons/CWeapon.hpp" + +#include "Kyoto/TToken.hpp" + +#include "rstl/optional_object.hpp" +#include "rstl/vector.hpp" + +class CGenDescription; +class CProjectileTouchResult; + +class CGameProjectile : public CWeapon { +public: + // TODO ctor + + // CEntity + ~CGameProjectile() override; + void Accept(IVisitor& visitor) override; + void AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId uid, CStateManager& mgr) override; + + // CActor + void Render(const CStateManager&) const override; + rstl::optional_object< CAABox > GetTouchBounds() const override; + void FluidFXThink(EFluidState, CScriptWater&, CStateManager&) override; + + // CGameProjectile + virtual void ResolveCollisionWithActor(const CRayCastResult& res, CActor& act, + CStateManager& mgr); + + TUniqueId GetHomingTargetId() const { return x2c0_homingTargetId; } + +private: + rstl::optional_object< TLockedToken< CGenDescription > > x158_visorParticle; + u16 x168_visorSfx; + CProjectileWeapon x170_projectile; + CVector3f x298_previousPos; + float x2a4_projExtent; + float x2a8_homingDt; + double x2b0_targetHomingTime; + double x2b8_curHomingTime; + TUniqueId x2c0_homingTargetId; + TUniqueId x2c2_lastResolvedObj; + TUniqueId x2c4_hitProjectileOwner; + TUniqueId x2c6_pendingDamagee; + TUniqueId x2c8_projectileLight; + CAssetId x2cc_wpscId; + rstl::vector< CProjectileTouchResult > x2d0_touchResults; + float x2e0_minHomingDist; + bool x2e4_24_active : 1; + bool x2e4_25_startedUnderwater : 1; + bool x2e4_26_waterUpdate : 1; + bool x2e4_27_inWater : 1; + bool x2e4_28_sendProjectileCollideMsg : 1; +}; +CHECK_SIZEOF(CGameProjectile, 0x2e8) + +#endif diff --git a/include/MetroidPrime/Weapons/CProjectileWeapon.hpp b/include/MetroidPrime/Weapons/CProjectileWeapon.hpp new file mode 100644 index 00000000..a2fc7043 --- /dev/null +++ b/include/MetroidPrime/Weapons/CProjectileWeapon.hpp @@ -0,0 +1,71 @@ +#ifndef _CPROJECTILEWEAPON_HPP +#define _CPROJECTILEWEAPON_HPP + +#include "types.h" + +#include "Kyoto/CRandom16.hpp" +#include "Kyoto/Graphics/CColor.hpp" +#include "Kyoto/Math/CTransform4f.hpp" +#include "Kyoto/Math/CVector3f.hpp" +#include "Kyoto/TToken.hpp" + +#include "rstl/optional_object.hpp" +#include "rstl/single_ptr.hpp" + +class CWeaponDescription; +class CElementGen; +class CModel; +class CParticleSwoosh; + +class CProjectileWeapon { +public: + // TODO ctor + + virtual ~CProjectileWeapon(); + virtual void Update(float dt); + virtual void AddToRenderer(); + virtual void Render(); + virtual CVector3f GetTranslation() const; + virtual CTransform4f GetTransform() const; + +private: + TLockedToken< CWeaponDescription > x4_weaponDesc; + CRandom16 x10_random; + CTransform4f x14_localToWorldXf; + CTransform4f x44_localXf; + CVector3f x74_worldOffset; + CVector3f x80_localOffset; + CVector3f x8c_projOffset; + CVector3f x98_scale; + CVector3f xa4_localOffset2; + CVector3f xb0_velocity; + CVector3f xbc_gravity; + CColor xc8_ambientLightColor; + double xd0_curTime; + double xd8_remainderTime; + float xe0_maxTurnRate; + int xe4_flags; + int xe8_lifetime; + int xec_childSystemUpdateRate; + int xf0_; + int xf4_curFrame; + int xf8_lastParticleFrame; + rstl::single_ptr< CElementGen > xfc_APSMGen; + rstl::single_ptr< CElementGen > x100_APS2Gen; + rstl::single_ptr< CElementGen > x104_; + rstl::optional_object< TLockedToken< CModel > > x108_model; + rstl::single_ptr< CParticleSwoosh > x118_swoosh1; + rstl::single_ptr< CParticleSwoosh > x11c_swoosh2; + rstl::single_ptr< CParticleSwoosh > x120_swoosh3; + bool x124_24_active : 1; + bool x124_25_APSO : 1; + bool x124_26_AP11 : 1; + bool x124_27_AP21 : 1; + bool x124_28_AS11 : 1; + bool x124_29_AS12 : 1; + bool x124_30_AS13 : 1; + bool x124_31_VMD2 : 1; +}; +CHECK_SIZEOF(CProjectileWeapon, 0x128) + +#endif diff --git a/include/MetroidPrime/Weapons/CWeapon.hpp b/include/MetroidPrime/Weapons/CWeapon.hpp new file mode 100644 index 00000000..06f0a626 --- /dev/null +++ b/include/MetroidPrime/Weapons/CWeapon.hpp @@ -0,0 +1,39 @@ +#ifndef _CWEAPON_HPP +#define _CWEAPON_HPP + +#include "types.h" + +#include "MetroidPrime/CActor.hpp" +#include "MetroidPrime/CDamageInfo.hpp" +#include "MetroidPrime/Weapons/WeaponTypes.hpp" + +class CWeapon : public CActor { +public: + // TODO + + // CEntity + ~CWeapon() override; + void Think(f32 dt, CStateManager& mgr) override; + + // CActor + void Render(const CStateManager&) const override; + EWeaponCollisionResponseTypes GetCollisionResponseType(const CVector3f&, const CVector3f&, + const CWeaponMode&, + int /*EProjectileAttrib?*/) const override; + void FluidFXThink(EFluidState, CScriptWater&, CStateManager&) override; + +private: + EProjectileAttrib xe8_projectileAttribs; + TUniqueId xec_ownerId; + EWeaponType xf0_weaponType; + CMaterialFilter xf8_filter; + CDamageInfo x110_origDamageInfo; + CDamageInfo x12c_curDamageInfo; + float x148_curTime; + float x14c_damageFalloffSpeed; + float x150_damageDuration; + float x154_interferenceDuration; +}; +CHECK_SIZEOF(CWeapon, 0x158) + +#endif diff --git a/include/rstl/algorithm.hpp b/include/rstl/algorithm.hpp index 732a613f..2500fbed 100644 --- a/include/rstl/algorithm.hpp +++ b/include/rstl/algorithm.hpp @@ -4,11 +4,30 @@ #include "rstl/pointer_iterator.hpp" namespace rstl { -template < class Iter, class T > -inline Iter find(Iter first, Iter last, const T& val) { +template < class It, class T > +inline It find(It first, It last, const T& val) { while (first != last && !(*first == val)) ++first; return first; } + +template < typename T > +inline void swap(T& a, T& b) { + T tmp(a); + a = b; + b = tmp; +} + +template < typename I1, typename I2 > +inline void iter_swap(I1 a, I2 b) { + swap(*a, *b); +} + +template < class It, class Cmp > +void __sort3(It a, It b, It c, Cmp comp); // TODO + +template < typename It, class Cmp > +inline void sort(It first, It last, Cmp cmp); // TODO } // namespace rstl + #endif // _RSTL_ALGORITHM_HPP diff --git a/include/rstl/construct.hpp b/include/rstl/construct.hpp index 4cdb74cf..e0953d0a 100644 --- a/include/rstl/construct.hpp +++ b/include/rstl/construct.hpp @@ -13,71 +13,36 @@ template < typename T > inline void destroy(T* in) { in->~T(); } -// template < typename T > -// inline void destroy(const T* in) {} -template < typename Iter > -inline void destroy(Iter begin, Iter end) { - Iter current = begin; - while (current != end) { - current.destroy(); - ++current; - } -} -template < typename S > -inline void destroy(S* begin, S* end) { - S* current = begin; - while (current != end) { - destroy(current); - ++current; +template < typename It > +inline void destroy(It begin, It end) { + It cur = begin; + for (; cur != end; ++cur) { + destroy(&*cur); } } -template < typename Iter, typename T > -inline void uninitialized_copy(Iter begin, Iter end, T* out) { - Iter current = begin; - while (current != end) { - construct(out, *current); - current.destroy(); - ++out; - ++current; +template < typename It, typename T > +inline void uninitialized_copy(It begin, It end, T* out) { + It cur = begin; + for (; cur != end; ++out, ++cur) { + construct(out, *cur); } } template < typename S, typename D > -inline void uninitialized_copy(D* out, S* begin, S* end) { - while (begin != end) { - construct(out, *begin); - ++out; - ++begin; +inline void uninitialized_copy_n(S src, int n, D dest) { + D cur = dest; + for (int i = 0; i < n; ++cur, ++i, ++src) { + construct(&*cur, *src); } - // rstl::destroy(begin, end); -} - -// FIXME this is a hack around regalloc -// need to figure out the proper types/positions for all of these funcs -template < typename S, typename D > -inline void uninitialized_copy_2(S* begin, D* out, S* end) { - while (begin != end) { - construct(out, *begin); - ++out; - ++begin; - } -} - -template < typename S, typename D > -// inline void uninitialized_copy_n(S* src, int count, D* dest) { -inline void uninitialized_copy_n(D* dest, S* src, int count) { - for (int i = 0; i < count; ++dest, ++i, ++src) { - construct(dest, *src); - } - // destroy(src, src + count); ?? } template < typename D, typename S > -inline void uninitialized_fill_n(D dest, int count, const S& value) { - for (int i = 0; i < count; ++dest, ++i) { - construct(dest, value); +inline void uninitialized_fill_n(D dest, int n, const S& value) { + D cur = dest; + for (; n > 0; --n, ++cur) { + construct(&*cur, value); } } } // namespace rstl diff --git a/include/rstl/list.hpp b/include/rstl/list.hpp index f718955a..11495deb 100644 --- a/include/rstl/list.hpp +++ b/include/rstl/list.hpp @@ -14,7 +14,7 @@ public: node* cur = x4_start; while (cur != x8_end) { cur->get_value()->~T(); - Alloc::deallocate(cur->get_value()); + x0_allocator.deallocate(cur->get_value()); cur = cur->get_next(); } } diff --git a/include/rstl/pointer_iterator.hpp b/include/rstl/pointer_iterator.hpp index 5def7bdb..0e3e9367 100644 --- a/include/rstl/pointer_iterator.hpp +++ b/include/rstl/pointer_iterator.hpp @@ -2,6 +2,7 @@ #define _RSTL_POINTER_ITERATOR_HPP #include "types.h" +#include "stddef.h" #include "rstl/construct.hpp" @@ -15,6 +16,7 @@ struct random_access_iterator_tag : public bidirectional_iterator_tag {}; template < typename T, typename Vec, typename Alloc > class const_pointer_iterator { public: + typedef ptrdiff_t difference_type; typedef random_access_iterator_tag iterator_category; typedef T* value_type; @@ -24,12 +26,12 @@ public: ++this->current; return *this; } - const_pointer_iterator& operator++(int) { return const_pointer_iterator(this->current++); } + const_pointer_iterator operator++(int) { return const_pointer_iterator(this->current++); } const_pointer_iterator& operator--() { --this->current; return *this; } - const_pointer_iterator& operator--(int) { return const_pointer_iterator(this->current--); } + const_pointer_iterator operator--(int) { return const_pointer_iterator(this->current--); } const_pointer_iterator& operator+=(int v) { this->current += v; return *this; @@ -46,7 +48,10 @@ public: const_pointer_iterator it = *this; return it -= v; } - int operator-(const const_pointer_iterator& other) const { return this->current - other.current; } + difference_type operator-(const const_pointer_iterator& other) const { + return this->current - other.current; + } + const T* get_pointer() const { return current; } const T& operator*() const { return *current; } const T* operator->() const { return current; } bool operator==(const const_pointer_iterator& other) { return current == other.current; } @@ -69,13 +74,18 @@ protected: template < typename T, typename Vec, typename Alloc > class pointer_iterator : public const_pointer_iterator< T, Vec, Alloc > { + typedef const_pointer_iterator< T, Vec, Alloc > base; + public: + typedef base::difference_type difference_type; + typedef base::iterator_category iterator_category; + typedef base::value_type value_type; + pointer_iterator() : const_pointer_iterator< T, Vec, Alloc >(nullptr) {} pointer_iterator(T* begin) : const_pointer_iterator< T, Vec, Alloc >(begin) {} void operator=(const T& other) { rstl::construct(this->current, other); } - T& operator*() { return *this->current; } - T* operator->() { return this->current; } - void destroy() const { rstl::destroy(this->current); } + T& operator*() const { return *this->current; } + T* operator->() const { return this->current; } pointer_iterator& operator++() { ++this->current; return *this; @@ -102,7 +112,29 @@ public: pointer_iterator it = *this; return it -= v; } + // HACK: non-const operator- is required to match vector::insert + difference_type operator-(const pointer_iterator& other) { + return this->current - other.current; + } }; + +template < typename T > +struct const_counting_iterator { + const T* ptr; + int count; + + const_counting_iterator(const T* ptr, int count) : ptr(ptr), count(count) {} +}; + +template < typename It > +inline typename It::difference_type __distance(It first, It last, random_access_iterator_tag) { + return last - first; +} + +template < typename It > +inline typename It::difference_type distance(It first, It last) { + return __distance(first, last, It::iterator_category()); +} } // namespace rstl #endif diff --git a/include/rstl/reserved_vector.hpp b/include/rstl/reserved_vector.hpp index e09a1a60..4e42223c 100644 --- a/include/rstl/reserved_vector.hpp +++ b/include/rstl/reserved_vector.hpp @@ -22,23 +22,21 @@ public: inline const_iterator end() const { return const_iterator(data() + x0_count); } reserved_vector() : x0_count(0) {} - // reserved_vector(const T& value) : x0_count(N) { rstl::uninitialized_fill_n(data(), N, value); } - reserved_vector(const reserved_vector& other) { - x0_count = other.size(); - // rstl::uninitialized_copy_n(other.data(), size(), data()); - rstl::uninitialized_copy_n(data(), other.data(), size()); + reserved_vector(const T& value) : x0_count(N) { uninitialized_fill_n(data(), N, value); } + reserved_vector(const reserved_vector& other) : x0_count(other.x0_count) { + uninitialized_copy_n(other.data(), x0_count, data()); } reserved_vector& operator=(const reserved_vector& other) { if (this != &other) { clear(); - rstl::uninitialized_copy_2(other.data(), data(), other.data() + other.size()); + uninitialized_copy(data(), other.data() + other.size(), other.data()); x0_count = other.x0_count; } return *this; } void clear() { for (int i = 0; i < x0_count; ++i) { - rstl::destroy(&data()[i]); + destroy(&data()[i]); } x0_count = 0; } diff --git a/include/rstl/rmemory_allocator.hpp b/include/rstl/rmemory_allocator.hpp index a56c105b..60fdb14c 100644 --- a/include/rstl/rmemory_allocator.hpp +++ b/include/rstl/rmemory_allocator.hpp @@ -8,8 +8,23 @@ namespace rstl { struct rmemory_allocator { template < typename T > - static void allocate(T*& out, int sz) { - out = reinterpret_cast< T* >(new u8[sz]); + static void allocate(T*& out, int count) { + int size = count * sizeof(T); + if (size == 0) { + out = nullptr; + } else { + out = reinterpret_cast< T* >(new u8[size]); + } + } + // TODO: this fixes a regswap in vector::reserve + template < typename T > + static T* allocate2(int count) { + int size = count * sizeof(T); + if (size == 0) { + return nullptr; + } else { + return reinterpret_cast< T* >(new u8[size]); + } } template < typename T > static void deallocate(T* ptr) { diff --git a/include/rstl/vector.hpp b/include/rstl/vector.hpp index 54f83f52..64ab5945 100644 --- a/include/rstl/vector.hpp +++ b/include/rstl/vector.hpp @@ -25,6 +25,7 @@ namespace rstl { template < typename T, typename Alloc = rmemory_allocator > class vector { +protected: Alloc x0_allocator; int x4_count; int x8_capacity; @@ -41,36 +42,27 @@ public: inline vector() : x4_count(0), x8_capacity(0), xc_items(NULL) {} inline vector(int count) : x4_count(0), x8_capacity(0), xc_items(0) { reserve(count); } vector(int count, const T& v) : x4_count(count), x8_capacity(count) { - if (x4_count * sizeof(T) == 0) { - xc_items = NULL; - } else { - x0_allocator.allocate(xc_items, x4_count * sizeof(T)); - } + x0_allocator.allocate(xc_items, x4_count); uninitialized_fill_n(xc_items, count, v); } - vector(const vector& other) { - x4_count = other.x4_count; - x8_capacity = other.x8_capacity; + vector(const vector& other) : x4_count(other.x4_count), x8_capacity(other.x8_capacity) { if (other.x4_count == 0 && other.x8_capacity == 0) { - xc_items = NULL; + xc_items = nullptr; } else { - int sz = x8_capacity * sizeof(T); - if (sz == 0) { - xc_items = NULL; - } else { - x0_allocator.allocate(xc_items, sz); - } - // rstl::uninitialized_copy_n(other.data(), x4_count, data()); - rstl::uninitialized_copy_n(data(), other.data(), x4_count); + x0_allocator.allocate(xc_items, x8_capacity); + uninitialized_copy_n(other.xc_items, x4_count, xc_items); } } ~vector() { - rstl::destroy(begin(), end()); + destroy(begin(), end()); x0_allocator.deallocate(xc_items); } void reserve(int size); void resize(int size, const T& in); + iterator insert(iterator it, const T& value); // TODO + template < typename from_iterator > + iterator insert(iterator it, from_iterator begin, from_iterator end); iterator erase(iterator it); void push_back(const T& in) { @@ -93,14 +85,14 @@ public: xc_items = nullptr; } else { reserve(other.size()); - rstl::uninitialized_copy(data(), other.data(), other.data() + other.size()); + uninitialized_copy(data(), other.data(), other.data() + other.size()); x4_count = other.x4_count; } return *this; } void clear() { - rstl::destroy(begin(), end()); + destroy(begin(), end()); x4_count = 0; } @@ -117,6 +109,10 @@ public: inline const T& back() const { return at(x4_count - 1); } inline T& operator[](int idx) { return xc_items[idx]; } inline const T& operator[](int idx) const { return xc_items[idx]; } + +protected: + template < typename In > + void insert_into(iterator it, int count, In in); }; template < typename T, typename Alloc > @@ -133,21 +129,24 @@ void vector< T, Alloc >::resize(int size, const T& in) { } template < typename T, typename Alloc > -void vector< T, Alloc >::reserve(int size) { - if (size <= x8_capacity) +void vector< T, Alloc >::reserve(int newSize) { + if (newSize <= x8_capacity) { return; - int sz = size * sizeof(T); - T* newData; - if (sz == 0) { - newData = nullptr; - } else { - x0_allocator.allocate(newData, sz); } - rstl::uninitialized_copy(begin(), end(), newData); - rstl::destroy(xc_items, xc_items + x4_count); + T* newData = x0_allocator.allocate2< T >(newSize); + uninitialized_copy(begin(), end(), newData); + destroy(xc_items, xc_items + x4_count); x0_allocator.deallocate(xc_items); xc_items = newData; - x8_capacity = size; + x8_capacity = newSize; +} + +template < typename T, typename Alloc > +typename vector< T, Alloc >::iterator vector< T, Alloc >::insert(iterator it, const T& value) { + iterator::difference_type diff = it - begin(); // distance(begin(), it); + const_counting_iterator< T > in(&value, 0); + insert_into(it, 1, in); + return begin() + diff; } typedef vector< void > unk_vector; diff --git a/ldscript.lcf b/ldscript.lcf index f85901c7..3115d4cb 100644 --- a/ldscript.lcf +++ b/ldscript.lcf @@ -36,31 +36,4 @@ SECTIONS FORCEFILES { __init_cpp_exceptions.o - uart_console_io.o - mslsupp.o - CBallFilter.o - CABSIdle.o - CMetaAnimPlay.o - CMetaTransSnap.o - CAnimTreeAnimReaderContainer.o - CAnimTreeContinuousPhaseBlend.o - CAnimTreeSingleChild.o - CTimeScaleFunctions.o - CDvdRequest.o - CColorInstruction.o - CColorOverrideInstruction.o - CFontInstruction.o - CLineExtraSpaceInstruction.o - CLineSpacingInstruction.o - CPopStateInstruction.o - CPushStateInstruction.o - CRemoveColorOverrideInstruction.o - CWordInstruction.o - CBlockInstruction.o - CloseEnough.o - CParticleGen.o - CWarp.o - CImageInstruction.o - RumbleFxTable.o - CGuiWidgetDrawParms.o } diff --git a/libc/stddef.h b/libc/stddef.h index a1fb6b4b..51b0f2ce 100644 --- a/libc/stddef.h +++ b/libc/stddef.h @@ -8,6 +8,7 @@ extern "C" { #define offsetof(type, member) ((size_t) & (((type*)0)->member)) typedef __typeof__(sizeof(0)) size_t; +typedef __typeof__((char*)0 - (char*)0) ptrdiff_t; #ifndef NULL #define NULL 0L diff --git a/obj_files.mk b/obj_files.mk index a5101358..1b232f8b 100644 --- a/obj_files.mk +++ b/obj_files.mk @@ -560,7 +560,7 @@ KYOTO_1 :=\ $(BUILD_DIR)/asm/Kyoto/Streams/CZipSupport.o\ $(BUILD_DIR)/asm/Kyoto/CSimplePool.o\ $(BUILD_DIR)/asm/Kyoto/CToken.o\ - $(BUILD_DIR)/asm/Kyoto/IObj.o + $(BUILD_DIR)/asm/Kyoto/IObj.o\ ZLIB_FILES :=\ $(BUILD_DIR)/src/Kyoto/zlib/adler32.o\ @@ -629,17 +629,17 @@ KYOTO_2 :=\ $(BUILD_DIR)/asm/Kyoto/CFrameDelayedKiller.o\ AI_FILES :=\ - $(BUILD_DIR)/asm/Dolphin/ai.o + $(BUILD_DIR)/asm/Dolphin/ai.o\ AR_FILES :=\ $(BUILD_DIR)/asm/Dolphin/ar/ar.o\ $(BUILD_DIR)/asm/Dolphin/ar/arq.o BASE_FILES :=\ - $(BUILD_DIR)/src/Dolphin/PPCArch.o + $(BUILD_DIR)/src/Dolphin/PPCArch.o\ DB_FILES :=\ - $(BUILD_DIR)/asm/Dolphin/db.o + $(BUILD_DIR)/asm/Dolphin/db.o\ DSP_FILES :=\ $(BUILD_DIR)/asm/Dolphin/dsp/dsp.o\ @@ -671,18 +671,17 @@ GX_FILES :=\ $(BUILD_DIR)/asm/Dolphin/gx/GXStubs.o\ $(BUILD_DIR)/asm/Dolphin/gx/GXDisplayList.o\ $(BUILD_DIR)/asm/Dolphin/gx/GXTransform.o\ - $(BUILD_DIR)/asm/Dolphin/gx/GXPerf.o - + $(BUILD_DIR)/asm/Dolphin/gx/GXPerf.o\ + MTX_FILES :=\ $(BUILD_DIR)/asm/Dolphin/mtx/mtx.o\ $(BUILD_DIR)/asm/Dolphin/mtx/mtx44vec.o\ $(BUILD_DIR)/asm/Dolphin/mtx/mtx44.o\ $(BUILD_DIR)/asm/Dolphin/mtx/vec.o\ - $(BUILD_DIR)/asm/Dolphin/mtx/psmtx.o - -# TODO: Move __ppc_eabi_init_text into the same source files as __ppc_eabi_init + $(BUILD_DIR)/asm/Dolphin/mtx/psmtx.o\ + OS_FILES :=\ - $(BUILD_DIR)/src/Dolphin/os/__start.o\ + $(BUILD_DIR)/src/Dolphin/os/__start.ep.o\ $(BUILD_DIR)/asm/Dolphin/os/OS.o\ $(BUILD_DIR)/asm/Dolphin/os/OSAlarm.o\ $(BUILD_DIR)/asm/Dolphin/os/OSArena.o\ @@ -703,7 +702,7 @@ OS_FILES :=\ $(BUILD_DIR)/asm/Dolphin/os/OSSync.o\ $(BUILD_DIR)/asm/Dolphin/os/OSThread.o\ $(BUILD_DIR)/asm/Dolphin/os/OSTime.o\ - $(BUILD_DIR)/src/Dolphin/os/__ppc_eabi_init.o\ + $(BUILD_DIR)/src/Dolphin/os/__ppc_eabi_init.ep.o\ PAD_FILES :=\ $(BUILD_DIR)/asm/Dolphin/pad/PadClamp.o\ @@ -810,7 +809,7 @@ MUSYX_FILES :=\ $(BUILD_DIR)/src/musyx/reverb_fx.o\ $(BUILD_DIR)/asm/musyx/reverb.o\ $(BUILD_DIR)/src/musyx/delay_fx.o\ - $(BUILD_DIR)/asm/musyx/chorus_fx.o + $(BUILD_DIR)/asm/musyx/chorus_fx.o\ DTK_FILES :=\ $(BUILD_DIR)/asm/Dolphin/dtk.o @@ -850,4 +849,4 @@ GBA_FILES :=\ $(BUILD_DIR)/asm/Dolphin/GBA/GBARead.o\ $(BUILD_DIR)/asm/Dolphin/GBA/GBAWrite.o\ $(BUILD_DIR)/asm/Dolphin/GBA/GBAXfer.o\ - $(BUILD_DIR)/asm/Dolphin/GBA/GBAKey.o + $(BUILD_DIR)/asm/Dolphin/GBA/GBAKey.o\ diff --git a/src/Kyoto/Math/CAABox.cpp b/src/Kyoto/Math/CAABox.cpp index 6f5816a7..91d232cd 100644 --- a/src/Kyoto/Math/CAABox.cpp +++ b/src/Kyoto/Math/CAABox.cpp @@ -99,7 +99,7 @@ CTri CAABox::GetTri(EBoxFaceId face, int windOffset) const { verts[3] = CVector3f(min.GetX(), min.GetY(), max.GetZ()); break; case kF_ZMin: - verts[0] = min; + verts[0] = CVector3f(min.GetX(), min.GetY(), min.GetZ()); verts[1] = CVector3f(max.GetX(), min.GetY(), min.GetZ()); verts[2] = CVector3f(max.GetX(), max.GetY(), min.GetZ()); verts[3] = CVector3f(min.GetX(), max.GetY(), min.GetZ()); @@ -228,13 +228,7 @@ f32 CAABox::GetVolume() const { return delta.GetX() * delta.GetY() * delta.GetZ(); } -CVector3f CAABox::GetCenterPoint() const { - CVector3f result = min + max; - result.SetX(result.GetX() * 0.5f); - result.SetY(result.GetY() * 0.5f); - result.SetZ(result.GetZ() * 0.5f); - return result; -} +CVector3f CAABox::GetCenterPoint() const { return (min + max) * 0.5f; } CVector3f CAABox::GetPoint(int point) const { const CVector3f* vecs[2] = {&min, &max}; @@ -260,9 +254,12 @@ f32 CAABox::DistanceBetween(const CAABox& a, const CAABox& b) { bool zi = b.GetMinPoint().GetZ() < a.GetMaxPoint().GetZ() && maxZ < minZ; int intersects = 0; - if (xi) intersects |= 1; - if (yi) intersects |= 2; - if (zi) intersects |= 4; + if (xi) + intersects |= 1; + if (yi) + intersects |= 2; + if (zi) + intersects |= 4; if (b.GetMinPoint().GetX() > a.GetMaxPoint().GetX()) { minX = b.GetMinPoint().GetX(); diff --git a/src/MetroidPrime/CActor.cpp b/src/MetroidPrime/CActor.cpp index 3bdf517b..43f983e3 100644 --- a/src/MetroidPrime/CActor.cpp +++ b/src/MetroidPrime/CActor.cpp @@ -326,7 +326,7 @@ void CActor::Render(const CStateManager& mgr) const { if (GetModelData() && !NullModel()) { bool renderPrePostParticles = GetRenderParticleDatabaseInside() && HasAnimation(); if (renderPrePostParticles) { - x64_modelData->GetAnimationData()->GetParticleDB().RenderSystemsToBeDrawnFirst(); + GetAnimationData()->GetParticleDB().RenderSystemsToBeDrawnFirst(); } if (xe7_27_enableRender) { @@ -337,8 +337,7 @@ void CActor::Render(const CStateManager& mgr) const { RenderInternal(mgr); } else { const f32 timeSince = CGraphics::GetSecondsMod900() - xbc_time; - const f32 tpTime = CMath::FastFmod(timeSince, 900.f); - CTimeProvider tp(tpTime); + CTimeProvider tp(CMath::FastFmod(timeSince, 900.f)); RenderInternal(mgr); } if (xe5_31_pointGeneratorParticles) { @@ -348,7 +347,7 @@ void CActor::Render(const CStateManager& mgr) const { } if (renderPrePostParticles) { - x64_modelData->GetAnimationData()->GetParticleDB().RenderSystemsToBeDrawnLast(); + GetAnimationData()->GetParticleDB().RenderSystemsToBeDrawnLast(); } } DrawTouchBounds(); diff --git a/src/MetroidPrime/Player/CPlayerState.cpp b/src/MetroidPrime/Player/CPlayerState.cpp index bb3dae91..6ba7edcc 100644 --- a/src/MetroidPrime/Player/CPlayerState.cpp +++ b/src/MetroidPrime/Player/CPlayerState.cpp @@ -366,10 +366,10 @@ bool CPlayerState::GetIsFusionEnabled() const { return x0_26_fusion; } void CPlayerState::SetIsFusionEnabled(bool val) { x0_26_fusion = val; } -u32 CPlayerState::GetTotalPickupCount() const { return 99; } +int CPlayerState::GetTotalPickupCount() const { return 99; } -u32 CPlayerState::CalculateItemCollectionRate() const { - u32 total = GetItemCapacity(kIT_PowerBombs); +int CPlayerState::CalculateItemCollectionRate() const { + int total = GetItemCapacity(kIT_PowerBombs); if (total >= 4) total -= 3; @@ -407,7 +407,7 @@ u32 CPlayerState::CalculateItemCollectionRate() const { return total + GetItemCapacity(kIT_Wavebuster); } -u32 CPlayerState::GetMissileCostForAltAttack() const { +int CPlayerState::GetMissileCostForAltAttack() const { return kMissileCosts[size_t(x8_currentBeam)]; } diff --git a/src/MetroidPrime/ScriptObjects/CScriptMazeNode.cpp b/src/MetroidPrime/ScriptObjects/CScriptMazeNode.cpp index ed4f9600..ed102522 100644 --- a/src/MetroidPrime/ScriptObjects/CScriptMazeNode.cpp +++ b/src/MetroidPrime/ScriptObjects/CScriptMazeNode.cpp @@ -264,6 +264,13 @@ void CScriptMazeNode::Accept(IVisitor& visitor) { visitor.Visit(*this); } // return objUid; // } +// struct GenerateObjectGuard { +// GenerateObjectGuard(CStateManager& mgr) : mgr(mgr), wasGenerating(mgr.IsGeneratingObject()) {} +// ~GenerateObjectGuard() { mgr.SetIsGeneratingObject(wasGenerating); } +// CStateManager& mgr; +// bool wasGenerating; +// }; + // TODO non-matching // https://decomp.me/scratch/IvHBz void CScriptMazeNode::GenerateObjects(CStateManager& mgr) { @@ -285,6 +292,7 @@ void CScriptMazeNode::GenerateObjects(CStateManager& mgr) { } // TUniqueId objUid = GenerateObject(mgr, conn->x8_objId); + // TUniqueId objUid = kInvalidUniqueId; bool wasGeneratingObject = mgr.IsGeneratingObject(); mgr.SetIsGeneratingObject(true); TUniqueId objUid = mgr.GenerateObject(conn->x8_objId).second; diff --git a/src/MetroidPrime/ScriptObjects/CScriptSpecialFunction.cpp b/src/MetroidPrime/ScriptObjects/CScriptSpecialFunction.cpp index 698e4766..258577df 100644 --- a/src/MetroidPrime/ScriptObjects/CScriptSpecialFunction.cpp +++ b/src/MetroidPrime/ScriptObjects/CScriptSpecialFunction.cpp @@ -12,6 +12,7 @@ #include "MetroidPrime/Player/CPlayerState.hpp" #include "MetroidPrime/ScriptObjects/CScriptPlatform.hpp" #include "MetroidPrime/TCastTo.hpp" +#include "MetroidPrime/Weapons/CEnergyProjectile.hpp" #include "MetaRender/CCubeRenderer.hpp" @@ -35,12 +36,11 @@ static int string_find(const string& haystack, const string& needle, int) { return 0; } -template < class RandomAccessIterator, class Compare > -void sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp) { +template < class It, class Cmp > +void sort(It first, It last, Cmp cmp) { // TODO: proper implementation - comp(*first, *last); + cmp(*first, *last); } - } // namespace rstl CScriptSpecialFunction::CScriptSpecialFunction( @@ -979,41 +979,43 @@ void CScriptSpecialFunction::Render(CStateManager& mgr) { } void CScriptSpecialFunction::ThinkChaffTarget(float dt, CStateManager& mgr) { - /* - const zeus::CAABox box(5.f - GetTranslation(), 5.f + GetTranslation()); - EntityList nearList; - mgr.BuildNearList(nearList, box, CMaterialFilter::MakeInclude({kMT_Projectile}), nullptr); - auto& filter = mgr.GetCameraFilterPass(7); + TEntityList nearList; + const CVector3f offset(5.f, 5.f, 5.f); + const CAABox box(GetTranslation() - offset, GetTranslation() + offset); + mgr.BuildNearList(nearList, box, CMaterialFilter::MakeInclude(kMT_Projectile), nullptr); - for (const auto& uid : nearList) { - if (const TCastToPtr proj = mgr.ObjectById(uid)) { + for (int i = 0; i < nearList.size(); ++i) { + if (CEnergyProjectile* proj = TCastToPtr< CEnergyProjectile >(mgr.ObjectById(nearList[i]))) { if (proj->GetHomingTargetId() == GetUniqueId()) { proj->Set3d0_26(true); - if (mgr.GetPlayer().GetAreaIdAlways() == GetAreaIdAlways()) { - mgr.GetPlayer().SetHudDisable(x100_float2, 0.5f, 2.5f); - filter.SetFilter(EFilterType::Blend, EFilterShape::Fullscreen, 0.f, zeus::skWhite, - CAssetId()); filter.DisableFilter(0.1f); + if (mgr.GetPlayer()->GetAreaIdAlways() == GetAreaIdAlways()) { + mgr.Player()->SetHudDisable(x100_float2); + x194_ = xfc_float1; + + CCameraFilterPass& filter = mgr.CameraFilterPass(CStateManager::kCFS_Seven); + filter.SetFilter(CCameraFilterPass::kFT_Blend, CCameraFilterPass::kFS_Fullscreen, 0.f, + CColor(1.f, 1.f, 1.f), kInvalidAssetId); + filter.DisableFilter(0.1f); } } } } - x194_ = zeus::max(0.f, x194_ - dt); - if (x194_ != 0.f && mgr.GetPlayer()->GetAreaIdAlways() == GetAreaIdAlways()) { - float intfMag = x104_float3 * (0.5f + ((0.5f + x194_) / xfc_float1)); + bool addedInterference = false; + x194_ = CMath::Max(0.f, x194_ - dt); + if (x194_ && mgr.GetPlayer()->GetAreaIdAlways() == GetAreaIdAlways()) { + addedInterference = true; + float intfMag = x104_float3 * (0.5f + ((0.5f * x194_) / xfc_float1)); if (x194_ < 1.f) { intfMag *= x194_; } - - mgr.GetPlayerState()->GetStaticInterference().AddSource(GetUniqueId(), intfMag, .5f); - - if (mgr.GetPlayerState()->GetCurrentVisor() != kPV_Scan) { - mgr.GetPlayer()->AddOrbitDisableSource(mgr, GetUniqueId()); - } else { - mgr.GetPlayer()->RemoveOrbitDisableSource(GetUniqueId()); - } + mgr.PlayerState()->StaticInterference().AddSource(GetUniqueId(), intfMag, 0.5f); + } + if (addedInterference && mgr.GetPlayerState()->GetCurrentVisor() != CPlayerState::kPV_Thermal) { + mgr.Player()->AddOrbitDisableSource(mgr, GetUniqueId()); + } else { + mgr.Player()->RemoveOrbitDisableSource(GetUniqueId()); } - */ } void CScriptSpecialFunction::ThinkRainSimulator(float, CStateManager& mgr) { @@ -1095,25 +1097,6 @@ void CScriptSpecialFunction::ThinkPlayerInArea(float dt, CStateManager& mgr) { } } -void CScriptSpecialFunction::DeleteEmitter(CSfxHandle& handle) { - if (handle) { - CSfxManager::RemoveEmitter(handle); - handle.Clear(); - } -} - -u32 CScriptSpecialFunction::GetSpecialEnding(const CStateManager& mgr) const { - const u32 rate = (mgr.GetPlayerState()->CalculateItemCollectionRate() * 100) / - mgr.GetPlayerState()->GetTotalPickupCount(); - if (rate < 75) { - return 0; - } - if (rate < 100) { - return 1; - } - return 2; -} - void CScriptSpecialFunction::AddOrUpdateEmitter(float pitch, CSfxHandle& handle, u16 id, const CVector3f& pos, uchar vol) { if (!handle) { @@ -1125,9 +1108,24 @@ void CScriptSpecialFunction::AddOrUpdateEmitter(float pitch, CSfxHandle& handle, } } -CScriptSpecialFunction::SRingController::SRingController(TUniqueId uid, float rotateSpeed, - bool reachedTarget) -: x0_id(uid) -, x4_rotateSpeed(rotateSpeed) -, x8_reachedTarget(reachedTarget) -, xc_(CVector3f::Zero()) {} +void CScriptSpecialFunction::DeleteEmitter(CSfxHandle& handle) { + if (handle) { + CSfxManager::RemoveEmitter(handle); + handle.Clear(); + } +} + +int CScriptSpecialFunction::GetSpecialEnding(const CStateManager& mgr) const { + const int rate = (mgr.GetPlayerState()->CalculateItemCollectionRate() * 100) / + mgr.GetPlayerState()->GetTotalPickupCount(); + int result; + if (rate < 75) { + result = 0; + } else { + result = 2; + if (rate < 100) { + result = 1; + } + } + return result; +}