From b506df2778807264e5b95de04c1b1e93df06a6d2 Mon Sep 17 00:00:00 2001 From: Henrique Gemignani Passos Lima Date: Thu, 1 Dec 2022 15:45:36 +0200 Subject: [PATCH] Add WeaponTypes.cpp --- asm/MetroidPrime/CAnimData.s | 12 +- asm/MetroidPrime/CAnimationDatabaseGame.s | 2 +- asm/MetroidPrime/Player/CGrappleArm.s | 4 +- asm/MetroidPrime/Player/CPlayerGun.s | 6 +- asm/MetroidPrime/Player/CPlayerState.s | 4 +- asm/MetroidPrime/Weapons/WeaponTypes.s | 10 +- configure.py | 2 +- include/Kyoto/Animation/CPrimitive.hpp | 3 + include/Kyoto/Audio/CAudioSys.hpp | 29 +++ include/Kyoto/Audio/CSfxManager.hpp | 11 +- include/MetroidPrime/CAnimData.hpp | 7 +- include/MetroidPrime/CAnimPlaybackParms.hpp | 2 +- include/MetroidPrime/Player/CGameState.hpp | 2 + include/MetroidPrime/Player/CPlayerState.hpp | 2 +- include/MetroidPrime/Weapons/WeaponCommon.hpp | 12 +- include/MetroidPrime/Weapons/WeaponTypes.hpp | 3 + include/rstl/set.hpp | 1 + src/MetroidPrime/Player/CPlayerState.cpp | 2 +- src/MetroidPrime/Weapons/WeaponTypes.cpp | 196 ++++++++++++++++++ tools/metaforce_renames.py | 1 + 20 files changed, 281 insertions(+), 30 deletions(-) create mode 100644 src/MetroidPrime/Weapons/WeaponTypes.cpp diff --git a/asm/MetroidPrime/CAnimData.s b/asm/MetroidPrime/CAnimData.s index 7b377102..0fbf17a2 100644 --- a/asm/MetroidPrime/CAnimData.s +++ b/asm/MetroidPrime/CAnimData.s @@ -3706,7 +3706,7 @@ lbl_8002C704: /* 8002C708 00029668 28 04 00 00 */ cmplwi r4, 0 /* 8002C70C 0002966C 41 82 00 0C */ beq lbl_8002C718 /* 8002C710 00029670 38 61 00 54 */ addi r3, r1, 0x54 -/* 8002C714 00029674 48 00 4B 95 */ bl sub_800312a8 +/* 8002C714 00029674 48 00 4B 95 */ bl "free_node_and_sub_nodes__Q24rstl130red_black_tree<10CPrimitive,10CPrimitive,0,Q24rstl22identity<10CPrimitive>,Q24rstl18less<10CPrimitive>,Q24rstl17rmemory_allocator>FPQ34rstl130red_black_tree<10CPrimitive,10CPrimitive,0,Q24rstl22identity<10CPrimitive>,Q24rstl18less<10CPrimitive>,Q24rstl17rmemory_allocator>4node" lbl_8002C718: /* 8002C718 00029678 38 00 00 00 */ li r0, 0 /* 8002C71C 0002967C 38 61 00 1C */ addi r3, r1, 0x1c @@ -5992,7 +5992,7 @@ lbl_8002E7C0: /* 8002E7C4 0002B724 28 04 00 00 */ cmplwi r4, 0 /* 8002E7C8 0002B728 41 82 00 0C */ beq lbl_8002E7D4 /* 8002E7CC 0002B72C 38 61 00 54 */ addi r3, r1, 0x54 -/* 8002E7D0 0002B730 48 00 2A D9 */ bl sub_800312a8 +/* 8002E7D0 0002B730 48 00 2A D9 */ bl "free_node_and_sub_nodes__Q24rstl130red_black_tree<10CPrimitive,10CPrimitive,0,Q24rstl22identity<10CPrimitive>,Q24rstl18less<10CPrimitive>,Q24rstl17rmemory_allocator>FPQ34rstl130red_black_tree<10CPrimitive,10CPrimitive,0,Q24rstl22identity<10CPrimitive>,Q24rstl18less<10CPrimitive>,Q24rstl17rmemory_allocator>4node" lbl_8002E7D4: /* 8002E7D4 0002B734 38 00 00 00 */ li r0, 0 /* 8002E7D8 0002B738 38 61 00 14 */ addi r3, r1, 0x14 @@ -9096,8 +9096,8 @@ lbl_80031284: /* 800312A0 0002E200 38 21 00 30 */ addi r1, r1, 0x30 /* 800312A4 0002E204 4E 80 00 20 */ blr -.global sub_800312a8 -sub_800312a8: +.global "free_node_and_sub_nodes__Q24rstl130red_black_tree<10CPrimitive,10CPrimitive,0,Q24rstl22identity<10CPrimitive>,Q24rstl18less<10CPrimitive>,Q24rstl17rmemory_allocator>FPQ34rstl130red_black_tree<10CPrimitive,10CPrimitive,0,Q24rstl22identity<10CPrimitive>,Q24rstl18less<10CPrimitive>,Q24rstl17rmemory_allocator>4node" +"free_node_and_sub_nodes__Q24rstl130red_black_tree<10CPrimitive,10CPrimitive,0,Q24rstl22identity<10CPrimitive>,Q24rstl18less<10CPrimitive>,Q24rstl17rmemory_allocator>FPQ34rstl130red_black_tree<10CPrimitive,10CPrimitive,0,Q24rstl22identity<10CPrimitive>,Q24rstl18less<10CPrimitive>,Q24rstl17rmemory_allocator>4node": /* 800312A8 0002E208 94 21 FF F0 */ stwu r1, -0x10(r1) /* 800312AC 0002E20C 7C 08 02 A6 */ mflr r0 /* 800312B0 0002E210 90 01 00 14 */ stw r0, 0x14(r1) @@ -9108,13 +9108,13 @@ sub_800312a8: /* 800312C4 0002E224 80 84 00 00 */ lwz r4, 0(r4) /* 800312C8 0002E228 28 04 00 00 */ cmplwi r4, 0 /* 800312CC 0002E22C 41 82 00 08 */ beq lbl_800312D4 -/* 800312D0 0002E230 4B FF FF D9 */ bl sub_800312a8 +/* 800312D0 0002E230 4B FF FF D9 */ bl "free_node_and_sub_nodes__Q24rstl130red_black_tree<10CPrimitive,10CPrimitive,0,Q24rstl22identity<10CPrimitive>,Q24rstl18less<10CPrimitive>,Q24rstl17rmemory_allocator>FPQ34rstl130red_black_tree<10CPrimitive,10CPrimitive,0,Q24rstl22identity<10CPrimitive>,Q24rstl18less<10CPrimitive>,Q24rstl17rmemory_allocator>4node" lbl_800312D4: /* 800312D4 0002E234 80 9F 00 04 */ lwz r4, 4(r31) /* 800312D8 0002E238 28 04 00 00 */ cmplwi r4, 0 /* 800312DC 0002E23C 41 82 00 0C */ beq lbl_800312E8 /* 800312E0 0002E240 7F C3 F3 78 */ mr r3, r30 -/* 800312E4 0002E244 4B FF FF C5 */ bl sub_800312a8 +/* 800312E4 0002E244 4B FF FF C5 */ bl "free_node_and_sub_nodes__Q24rstl130red_black_tree<10CPrimitive,10CPrimitive,0,Q24rstl22identity<10CPrimitive>,Q24rstl18less<10CPrimitive>,Q24rstl17rmemory_allocator>FPQ34rstl130red_black_tree<10CPrimitive,10CPrimitive,0,Q24rstl22identity<10CPrimitive>,Q24rstl18less<10CPrimitive>,Q24rstl17rmemory_allocator>4node" lbl_800312E8: /* 800312E8 0002E248 28 1F 00 00 */ cmplwi r31, 0 /* 800312EC 0002E24C 41 82 00 18 */ beq lbl_80031304 diff --git a/asm/MetroidPrime/CAnimationDatabaseGame.s b/asm/MetroidPrime/CAnimationDatabaseGame.s index 0e70e0f9..740c7214 100644 --- a/asm/MetroidPrime/CAnimationDatabaseGame.s +++ b/asm/MetroidPrime/CAnimationDatabaseGame.s @@ -86,7 +86,7 @@ lbl_8006D884: /* 8006D8F8 0006A858 28 04 00 00 */ cmplwi r4, 0 /* 8006D8FC 0006A85C 41 82 00 0C */ beq lbl_8006D908 /* 8006D900 0006A860 38 61 00 38 */ addi r3, r1, 0x38 -/* 8006D904 0006A864 4B FC 39 A5 */ bl sub_800312a8 +/* 8006D904 0006A864 4B FC 39 A5 */ bl "free_node_and_sub_nodes__Q24rstl130red_black_tree<10CPrimitive,10CPrimitive,0,Q24rstl22identity<10CPrimitive>,Q24rstl18less<10CPrimitive>,Q24rstl17rmemory_allocator>FPQ34rstl130red_black_tree<10CPrimitive,10CPrimitive,0,Q24rstl22identity<10CPrimitive>,Q24rstl18less<10CPrimitive>,Q24rstl17rmemory_allocator>4node" lbl_8006D908: /* 8006D908 0006A868 38 00 00 00 */ li r0, 0 /* 8006D90C 0006A86C 90 01 00 48 */ stw r0, 0x48(r1) diff --git a/asm/MetroidPrime/Player/CGrappleArm.s b/asm/MetroidPrime/Player/CGrappleArm.s index fd63a8f7..36febf7e 100644 --- a/asm/MetroidPrime/Player/CGrappleArm.s +++ b/asm/MetroidPrime/Player/CGrappleArm.s @@ -1317,7 +1317,7 @@ lbl_8011E430: /* 8011E460 0011B3C0 80 FC 00 34 */ lwz r7, 0x34(r28) /* 8011E464 0011B3C4 C0 5C 00 3C */ lfs f2, 0x3c(r28) /* 8011E468 0011B3C8 C0 7C 00 40 */ lfs f3, 0x40(r28) -/* 8011E46C 0011B3CC 48 16 C7 1D */ bl "do_sound_event__12NWeaponTypesFRQ24rstl21pairRibUifUiffUcRC9CVector3fRC9CVector3f7TAreaId" +/* 8011E46C 0011B3CC 48 16 C7 1D */ bl "do_sound_event__12NWeaponTypesFRQ24rstl21pairRibUifUiffUcUcRC9CVector3fRC9CVector3f7TAreaIdR13CStateManager" lbl_8011E470: /* 8011E470 0011B3D0 3B 9C 00 44 */ addi r28, r28, 0x44 /* 8011E474 0011B3D4 3B 5A 00 01 */ addi r26, r26, 1 @@ -1375,7 +1375,7 @@ lbl_8011E4FC: /* 8011E52C 0011B48C 80 DC 00 38 */ lwz r6, 0x38(r28) /* 8011E530 0011B490 C0 3C 00 2C */ lfs f1, 0x2c(r28) /* 8011E534 0011B494 80 FC 00 34 */ lwz r7, 0x34(r28) -/* 8011E538 0011B498 48 16 C6 51 */ bl "do_sound_event__12NWeaponTypesFRQ24rstl21pairRibUifUiffUcRC9CVector3fRC9CVector3f7TAreaId" +/* 8011E538 0011B498 48 16 C6 51 */ bl "do_sound_event__12NWeaponTypesFRQ24rstl21pairRibUifUiffUcUcRC9CVector3fRC9CVector3f7TAreaIdR13CStateManager" lbl_8011E53C: /* 8011E53C 0011B49C 3B 9C 00 4C */ addi r28, r28, 0x4c /* 8011E540 0011B4A0 3B 7B 00 01 */ addi r27, r27, 1 diff --git a/asm/MetroidPrime/Player/CPlayerGun.s b/asm/MetroidPrime/Player/CPlayerGun.s index bae817cd..1b7e2790 100644 --- a/asm/MetroidPrime/Player/CPlayerGun.s +++ b/asm/MetroidPrime/Player/CPlayerGun.s @@ -1379,7 +1379,7 @@ lbl_8003B3D8: /* 8003B430 00038390 28 04 00 00 */ cmplwi r4, 0 /* 8003B434 00038394 41 82 00 0C */ beq lbl_8003B440 /* 8003B438 00038398 38 61 00 10 */ addi r3, r1, 0x10 -/* 8003B43C 0003839C 4B FF 5E 6D */ bl sub_800312a8 +/* 8003B43C 0003839C 4B FF 5E 6D */ bl "free_node_and_sub_nodes__Q24rstl130red_black_tree<10CPrimitive,10CPrimitive,0,Q24rstl22identity<10CPrimitive>,Q24rstl18less<10CPrimitive>,Q24rstl17rmemory_allocator>FPQ34rstl130red_black_tree<10CPrimitive,10CPrimitive,0,Q24rstl22identity<10CPrimitive>,Q24rstl18less<10CPrimitive>,Q24rstl17rmemory_allocator>4node" lbl_8003B440: /* 8003B440 000383A0 38 00 00 00 */ li r0, 0 /* 8003B444 000383A4 90 01 00 20 */ stw r0, 0x20(r1) @@ -2345,7 +2345,7 @@ lbl_8003C1BC: /* 8003C1EC 0003914C 80 FB 00 34 */ lwz r7, 0x34(r27) /* 8003C1F0 00039150 C0 5B 00 3C */ lfs f2, 0x3c(r27) /* 8003C1F4 00039154 C0 7B 00 40 */ lfs f3, 0x40(r27) -/* 8003C1F8 00039158 48 24 E9 91 */ bl "do_sound_event__12NWeaponTypesFRQ24rstl21pairRibUifUiffUcRC9CVector3fRC9CVector3f7TAreaId" +/* 8003C1F8 00039158 48 24 E9 91 */ bl "do_sound_event__12NWeaponTypesFRQ24rstl21pairRibUifUiffUcUcRC9CVector3fRC9CVector3f7TAreaIdR13CStateManager" lbl_8003C1FC: /* 8003C1FC 0003915C 3B 7B 00 44 */ addi r27, r27, 0x44 /* 8003C200 00039160 3B 39 00 01 */ addi r25, r25, 1 @@ -2402,7 +2402,7 @@ lbl_8003C284: /* 8003C2B4 00039214 80 DB 00 38 */ lwz r6, 0x38(r27) /* 8003C2B8 00039218 C0 3B 00 2C */ lfs f1, 0x2c(r27) /* 8003C2BC 0003921C 80 FB 00 34 */ lwz r7, 0x34(r27) -/* 8003C2C0 00039220 48 24 E8 C9 */ bl "do_sound_event__12NWeaponTypesFRQ24rstl21pairRibUifUiffUcRC9CVector3fRC9CVector3f7TAreaId" +/* 8003C2C0 00039220 48 24 E8 C9 */ bl "do_sound_event__12NWeaponTypesFRQ24rstl21pairRibUifUiffUcUcRC9CVector3fRC9CVector3f7TAreaIdR13CStateManager" lbl_8003C2C4: /* 8003C2C4 00039224 3B 7B 00 4C */ addi r27, r27, 0x4c /* 8003C2C8 00039228 3B 5A 00 01 */ addi r26, r26, 1 diff --git a/asm/MetroidPrime/Player/CPlayerState.s b/asm/MetroidPrime/Player/CPlayerState.s index 362656b3..40e4bdee 100644 --- a/asm/MetroidPrime/Player/CPlayerState.s +++ b/asm/MetroidPrime/Player/CPlayerState.s @@ -320,8 +320,8 @@ GetIsFusionEnabled__12CPlayerStateCFv: /* 800914D4 0008E434 54 03 0F FE */ srwi r3, r0, 0x1f /* 800914D8 0008E438 4E 80 00 20 */ blr -.global GetCurrentSuit__12CPlayerStateFv -GetCurrentSuit__12CPlayerStateFv: +.global GetCurrentSuit__12CPlayerStateCFv +GetCurrentSuit__12CPlayerStateCFv: /* 800914DC 0008E43C 94 21 FF F0 */ stwu r1, -0x10(r1) /* 800914E0 0008E440 7C 08 02 A6 */ mflr r0 /* 800914E4 0008E444 90 01 00 14 */ stw r0, 0x14(r1) diff --git a/asm/MetroidPrime/Weapons/WeaponTypes.s b/asm/MetroidPrime/Weapons/WeaponTypes.s index 606801d8..fbb0c2e9 100644 --- a/asm/MetroidPrime/Weapons/WeaponTypes.s +++ b/asm/MetroidPrime/Weapons/WeaponTypes.s @@ -11,7 +11,7 @@ get_current_suit__12NWeaponTypesFRC13CStateManager: /* 8028A9DC 0028793C 80 63 08 B8 */ lwz r3, 0x8b8(r3) /* 8028A9E0 00287940 83 E3 00 00 */ lwz r31, 0(r3) /* 8028A9E4 00287944 7F E3 FB 78 */ mr r3, r31 -/* 8028A9E8 00287948 4B E0 6A F5 */ bl GetCurrentSuit__12CPlayerStateFv +/* 8028A9E8 00287948 4B E0 6A F5 */ bl GetCurrentSuit__12CPlayerStateCFv /* 8028A9EC 0028794C 2C 03 00 00 */ cmpwi r3, 0 /* 8028A9F0 00287950 41 80 00 0C */ blt lbl_8028A9FC /* 8028A9F4 00287954 2C 03 00 05 */ cmpwi r3, 5 @@ -127,8 +127,8 @@ lbl_8028AB68: /* 8028AB80 00287AE0 38 21 00 20 */ addi r1, r1, 0x20 /* 8028AB84 00287AE4 4E 80 00 20 */ blr -.global "do_sound_event__12NWeaponTypesFRQ24rstl21pairRibUifUiffUcRC9CVector3fRC9CVector3f7TAreaId" -"do_sound_event__12NWeaponTypesFRQ24rstl21pairRibUifUiffUcRC9CVector3fRC9CVector3f7TAreaId": +.global "do_sound_event__12NWeaponTypesFRQ24rstl21pairRibUifUiffUcUcRC9CVector3fRC9CVector3f7TAreaIdR13CStateManager" +"do_sound_event__12NWeaponTypesFRQ24rstl21pairRibUifUiffUcUcRC9CVector3fRC9CVector3f7TAreaIdR13CStateManager": /* 8028AB88 00287AE8 94 21 FF 20 */ stwu r1, -0xe0(r1) /* 8028AB8C 00287AEC 7C 08 02 A6 */ mflr r0 /* 8028AB90 00287AF0 90 01 00 E4 */ stw r0, 0xe4(r1) @@ -674,7 +674,7 @@ lbl_8028B308: /* 8028B328 00288288 28 04 00 00 */ cmplwi r4, 0 /* 8028B32C 0028828C 41 82 00 0C */ beq lbl_8028B338 /* 8028B330 00288290 38 61 00 10 */ addi r3, r1, 0x10 -/* 8028B334 00288294 4B DA 5F 75 */ bl sub_800312a8 +/* 8028B334 00288294 4B DA 5F 75 */ bl "free_node_and_sub_nodes__Q24rstl130red_black_tree<10CPrimitive,10CPrimitive,0,Q24rstl22identity<10CPrimitive>,Q24rstl18less<10CPrimitive>,Q24rstl17rmemory_allocator>FPQ34rstl130red_black_tree<10CPrimitive,10CPrimitive,0,Q24rstl22identity<10CPrimitive>,Q24rstl18less<10CPrimitive>,Q24rstl17rmemory_allocator>4node" lbl_8028B338: /* 8028B338 00288298 38 00 00 00 */ li r0, 0 /* 8028B33C 0028829C 90 01 00 20 */ stw r0, 0x20(r1) @@ -734,7 +734,7 @@ lbl_8028B338: /* 8028B408 00288368 28 04 00 00 */ cmplwi r4, 0 /* 8028B40C 0028836C 41 82 00 0C */ beq lbl_8028B418 /* 8028B410 00288370 38 61 00 10 */ addi r3, r1, 0x10 -/* 8028B414 00288374 4B DA 5E 95 */ bl sub_800312a8 +/* 8028B414 00288374 4B DA 5E 95 */ bl "free_node_and_sub_nodes__Q24rstl130red_black_tree<10CPrimitive,10CPrimitive,0,Q24rstl22identity<10CPrimitive>,Q24rstl18less<10CPrimitive>,Q24rstl17rmemory_allocator>FPQ34rstl130red_black_tree<10CPrimitive,10CPrimitive,0,Q24rstl22identity<10CPrimitive>,Q24rstl18less<10CPrimitive>,Q24rstl17rmemory_allocator>4node" lbl_8028B418: /* 8028B418 00288378 38 00 00 00 */ li r0, 0 /* 8028B41C 0028837C 90 01 00 20 */ stw r0, 0x20(r1) diff --git a/configure.py b/configure.py index d3d3d409..43ea5e02 100755 --- a/configure.py +++ b/configure.py @@ -352,7 +352,7 @@ LIBS = [ "MetroidPrime/Enemies/CMetroidPrimeRelay", "MetroidPrime/Player/CPlayerDynamics", ["MetroidPrime/ScriptObjects/CScriptMazeNode", False], - "MetroidPrime/Weapons/WeaponTypes", + ["MetroidPrime/Weapons/WeaponTypes", False], "MetroidPrime/Enemies/COmegaPirate", "MetroidPrime/Enemies/CPhazonPool", "MetroidPrime/CNESEmulator", diff --git a/include/Kyoto/Animation/CPrimitive.hpp b/include/Kyoto/Animation/CPrimitive.hpp index 4df591ef..14980cee 100644 --- a/include/Kyoto/Animation/CPrimitive.hpp +++ b/include/Kyoto/Animation/CPrimitive.hpp @@ -6,6 +6,9 @@ #include "rstl/string.hpp" class CPrimitive { +public: + CAssetId GetAnimResId() const { return x0_animId; } + private: CAssetId x0_animId; int x4_animIdx; diff --git a/include/Kyoto/Audio/CAudioSys.hpp b/include/Kyoto/Audio/CAudioSys.hpp index ba07fe3d..40ec6e37 100644 --- a/include/Kyoto/Audio/CAudioSys.hpp +++ b/include/Kyoto/Audio/CAudioSys.hpp @@ -3,6 +3,8 @@ #include "types.h" +#include "Kyoto/Math/CVector3f.hpp" + enum ETRKSampleRate { kTSR_Zero, kTSR_One, @@ -17,6 +19,33 @@ class CAudioSys { public: enum ESurroundModes { kSM_Mono, kSM_Stereo, kSM_Surround }; + struct C3DEmitterParmData { + C3DEmitterParmData(const CVector3f& pos, const CVector3f& dir, float maxDist, float distComp, + uint flags, ushort sfxId, float maxVol, float minVol, bool important, + uchar prio) + : x0_pos(pos) + , xc_dir(dir) + , x18_maxDist(maxDist) + , x1c_distComp(distComp) + , x20_flags(flags) + , x24_sfxId(sfxId) + , x26_maxVol(maxVol) + , x27_minVol(minVol) + , x28_important(important) + , x29_prio(prio) {} + + CVector3f x0_pos; + CVector3f xc_dir; + float x18_maxDist; + float x1c_distComp; + uint x20_flags; + ushort x24_sfxId; + float x26_maxVol; + float x27_minVol; + bool x28_important; // Can't be allocated over, regardless of priority + uchar x29_prio; + }; + CAudioSys(uchar, uchar, uchar, uchar, uint); ~CAudioSys(); diff --git a/include/Kyoto/Audio/CSfxManager.hpp b/include/Kyoto/Audio/CSfxManager.hpp index a5e5873c..b90f69a3 100644 --- a/include/Kyoto/Audio/CSfxManager.hpp +++ b/include/Kyoto/Audio/CSfxManager.hpp @@ -74,7 +74,8 @@ public: static void RemoveEmitter(CSfxHandle handle); static void UpdateEmitter(CSfxHandle handle, const CVector3f& pos, const CVector3f& dir, uchar maxVol); - static void UpdateListener(const CVector3f& pos, const CVector3f& dir, const CVector3f&, const CVector3f&, const uchar); + static void UpdateListener(const CVector3f& pos, const CVector3f& dir, const CVector3f&, + const CVector3f&, const uchar); static const short kMaxPriority; // 0xFF static const short kMedPriority; // 0x7F @@ -86,6 +87,8 @@ public: static CSfxHandle AddEmitter(ushort id, const CVector3f& pos, const CVector3f& dir, uchar vol, bool useAcoustics, bool looped, short prio = kMedPriority, int areaId = kAllAreas); + static CSfxHandle AddEmitter(CAudioSys::C3DEmitterParmData& parmData, bool useAcoustics, + short prio, bool looped, int areaId = kAllAreas); static void AddListener(ESfxChannels channel, const CVector3f& pos, const CVector3f& dir, const CVector3f& vec1, const CVector3f& vec2, float f1, float f2, @@ -95,8 +98,10 @@ public: static void PitchBend(CSfxHandle handle, int pitch); - static CSfxHandle SfxStart(ushort id, short vol, short pan, bool useAcoustics, short prio = kMaxPriority, - bool looped = false, int areaId = kAllAreas); + static CSfxHandle SfxStart(ushort id, short vol, short pan, bool useAcoustics, + short prio = kMaxPriority, bool looped = false, + int areaId = kAllAreas); + static void SfxSpan(CSfxHandle, uchar); static bool IsPlaying(const CSfxHandle& handle); static void SetChannel(ESfxChannels); diff --git a/include/MetroidPrime/CAnimData.hpp b/include/MetroidPrime/CAnimData.hpp index 850b911f..4d07f3d2 100644 --- a/include/MetroidPrime/CAnimData.hpp +++ b/include/MetroidPrime/CAnimData.hpp @@ -17,6 +17,7 @@ #include "Kyoto/TToken.hpp" #include "rstl/reserved_vector.hpp" +#include "rstl/set.hpp" class CAnimationManager; class CAnimSysContext; @@ -28,6 +29,7 @@ class CSkinnedModelWithAvgNormals; class CTransitionManager; class CVertexMorphEffect; class CModelFlags; +class CPrimitive; class CAnimData { public: @@ -89,7 +91,8 @@ public: // Advance__9CAnimDataFfRC9CVector3fR13CStateManagerb // DoAdvance__9CAnimDataFfRbR9CRandom16b void SetAnimation(const CAnimPlaybackParms& parms, bool noTrans); - // GetAnimationPrimitives__9CAnimDataCFRC18CAnimPlaybackParmsRQ24rstl72set<10CPrimitive,Q24rstl18less<10CPrimitive>,Q24rstl17rmemory_allocator> + void GetAnimationPrimitives(const CAnimPlaybackParms& parms, + rstl::set< CPrimitive >& primsOut) const; // PrimitiveSetToTokenVector__9CAnimDataFRCQ24rstl72set<10CPrimitive,Q24rstl18less<10CPrimitive>,Q24rstl17rmemory_allocator>RQ24rstl42vector<6CToken,Q24rstl17rmemory_allocator>b // BuildPose__9CAnimDataFv // PreRender__9CAnimDataFv @@ -125,7 +128,7 @@ public: // UpdateAdditiveAnims__9CAnimDataFf // AdvanceAdditiveAnims__9CAnimDataFf // AddAdditiveSegData__9CAnimDataCFRC10CSegIdListR16CSegStatementSet - // GetEventResourceIdForAnimResourceId__9CAnimDataCFi + int GetEventResourceIdForAnimResourceId(int id) const; // GetAnimationManager__9CAnimDataFv // SetPoseValid__9CAnimDataFb diff --git a/include/MetroidPrime/CAnimPlaybackParms.hpp b/include/MetroidPrime/CAnimPlaybackParms.hpp index 3bf7f572..f6deb874 100644 --- a/include/MetroidPrime/CAnimPlaybackParms.hpp +++ b/include/MetroidPrime/CAnimPlaybackParms.hpp @@ -34,7 +34,7 @@ public: , x24_objectScale(nullptr) {} CAnimPlaybackParms(int anim, const CQuaternion* deltaOrient, const CVector3f* targetPos, - const CTransform4f* xf, const CVector3f* scale, bool useLocator) + const CTransform4f* xf, const CVector3f* scale, bool useLocator) : x0_animA(anim) , x4_animB(-1) , x8_blendWeight(1.f) diff --git a/include/MetroidPrime/Player/CGameState.hpp b/include/MetroidPrime/Player/CGameState.hpp index 4e1101f6..c9a7ab7a 100644 --- a/include/MetroidPrime/Player/CGameState.hpp +++ b/include/MetroidPrime/Player/CGameState.hpp @@ -45,6 +45,8 @@ public: void SetFileIdx(u32 idx) { x20c_saveIdx = idx; } void SetCardSerial(u64 serial) { x210_cardSerial = serial; } u64 GetCardSerial() const { return x210_cardSerial; } + bool GetHardMode() const { return x228_24_hardMode; } + float GetHardModeWeaponMultiplier() const; rstl::rc_ptr< CWorldTransManager >& WorldTransitionManager(); // { return x9c_transManager.GetPtr(); } struct GameFileStateInfo { diff --git a/include/MetroidPrime/Player/CPlayerState.hpp b/include/MetroidPrime/Player/CPlayerState.hpp index 0337713f..d4c78edb 100644 --- a/include/MetroidPrime/Player/CPlayerState.hpp +++ b/include/MetroidPrime/Player/CPlayerState.hpp @@ -105,7 +105,7 @@ public: void SetIsFusionEnabled(bool v); bool GetIsFusionEnabled() const; - EPlayerSuit GetCurrentSuit(); + EPlayerSuit GetCurrentSuit() const; EPlayerSuit GetCurrentSuitRaw() const { return x20_currentSuit; } EBeamId GetCurrentBeam() const { return x8_currentBeam; } void SetCurrentBeam(EBeamId beam) { x8_currentBeam = beam; } diff --git a/include/MetroidPrime/Weapons/WeaponCommon.hpp b/include/MetroidPrime/Weapons/WeaponCommon.hpp index a7dc06f3..868f7269 100644 --- a/include/MetroidPrime/Weapons/WeaponCommon.hpp +++ b/include/MetroidPrime/Weapons/WeaponCommon.hpp @@ -1,11 +1,16 @@ #ifndef _WEAPONCOMMON #define _WEAPONCOMMON +#include "Kyoto/SObjectTag.hpp" + +#include "rstl/set.hpp" #include "rstl/vector.hpp" class CToken; class CSfxHandle; class CAnimData; +class CStateManager; +class CPrimitive; namespace NWeaponTypes { @@ -24,8 +29,11 @@ enum EGunAnimType { }; CSfxHandle play_sfx(ushort sfx, bool underwater, bool looped, short pan); -void get_token_vector(CAnimData& animData, int, rstl::vector< CToken >& tokensOut, - bool preLock); + +void primitive_set_to_token_vector(const CAnimData& animData, + const rstl::set< CPrimitive >& primSet, + rstl::vector< CToken >& tokensOut, bool preLock); +void get_token_vector(CAnimData& animData, int, rstl::vector< CToken >& tokensOut, bool preLock); void get_token_vector(const CAnimData& animData, int begin, int end, rstl::vector< CToken >& tokensOut, bool preLock); bool are_tokens_ready(const rstl::vector< CToken >&); diff --git a/include/MetroidPrime/Weapons/WeaponTypes.hpp b/include/MetroidPrime/Weapons/WeaponTypes.hpp index e650e8a2..fcb2371d 100644 --- a/include/MetroidPrime/Weapons/WeaponTypes.hpp +++ b/include/MetroidPrime/Weapons/WeaponTypes.hpp @@ -34,6 +34,9 @@ public: , x4_24_charged(charged) , x4_25_comboed(comboed) , x4_26_instantKill(instaKill) {} + + CWeaponMode(int type, int flags) + : x0_weaponType(EWeaponType(type)) {} EWeaponType GetType() const { return x0_weaponType; } diff --git a/include/rstl/set.hpp b/include/rstl/set.hpp index c8b5d599..904aa99e 100644 --- a/include/rstl/set.hpp +++ b/include/rstl/set.hpp @@ -32,6 +32,7 @@ public: void erase(iterator it) { inner.erase(it); } int size() const { return inner.size(); } + private: rep_type inner; }; diff --git a/src/MetroidPrime/Player/CPlayerState.cpp b/src/MetroidPrime/Player/CPlayerState.cpp index c063bfd0..2974ef58 100644 --- a/src/MetroidPrime/Player/CPlayerState.cpp +++ b/src/MetroidPrime/Player/CPlayerState.cpp @@ -406,7 +406,7 @@ bool CPlayerState::CanVisorSeeFog(const CStateManager& stateMgr) const { return (activeVisor == kPV_Combat || activeVisor == kPV_Scan); } -CPlayerState::EPlayerSuit CPlayerState::GetCurrentSuit() { +CPlayerState::EPlayerSuit CPlayerState::GetCurrentSuit() const { if (GetIsFusionEnabled()) return kPS_FusionPower; diff --git a/src/MetroidPrime/Weapons/WeaponTypes.cpp b/src/MetroidPrime/Weapons/WeaponTypes.cpp new file mode 100644 index 00000000..2d8a5e4a --- /dev/null +++ b/src/MetroidPrime/Weapons/WeaponTypes.cpp @@ -0,0 +1,196 @@ +#include "MetroidPrime/Weapons/WeaponTypes.hpp" +#include "MetroidPrime/Weapons/WeaponCommon.hpp" + +#include "MetroidPrime/CAnimData.hpp" +#include "MetroidPrime/CAnimPlaybackParms.hpp" +#include "MetroidPrime/CStateManager.hpp" +#include "MetroidPrime/Player/CPlayerState.hpp" +#include "MetroidPrime/Player/CGameState.hpp" +#include "MetroidPrime/Weapons/CGunWeapon.hpp" +#include "MetroidPrime/Tweaks/CTweakPlayerGun.hpp" + +#include "Kyoto/Animation/CPrimitive.hpp" +#include "Kyoto/Audio/CSfxManager.hpp" +#include "Kyoto/CResFactory.hpp" +#include "Kyoto/CToken.hpp" + +#include "rstl/set.hpp" + +namespace NWeaponTypes { + +CAssetId get_asset_id_from_name(const char* name) { + const SObjectTag* tag = gpResourceFactory->GetResourceIdByName(name); + if (!tag) { + return kInvalidAssetId; + } + return tag->id; +} + +void get_token_vector(CAnimData& animData, int animIdx, rstl::vector< CToken >& tokensOut, + bool preLock) { + rstl::set< CPrimitive > prims; + CAnimPlaybackParms parms(animIdx, -1, 1.f, true); + animData.GetAnimationPrimitives(parms, prims); + primitive_set_to_token_vector(animData, prims, tokensOut, preLock); +} + +void get_token_vector(const CAnimData& animData, int begin, int end, + rstl::vector< CToken >& tokensOut, bool preLock) { + rstl::set< CPrimitive > prims; + for (int i = begin; i < end; ++i) { + CAnimPlaybackParms parms(i, -1, 1.f, true); + animData.GetAnimationPrimitives(parms, prims); + } + primitive_set_to_token_vector(animData, prims, tokensOut, preLock); +} + +bool are_tokens_ready(const rstl::vector< CToken >& anims) { + for (rstl::vector< CToken >::const_iterator it = anims.begin(); it != anims.end(); ++it) + if (!it->IsLoaded()) + return false; + return true; +} + +void lock_tokens(rstl::vector< CToken >& anims) { + for (rstl::vector< CToken >::iterator it = anims.begin(); it != anims.end(); ++it) + it->Lock(); +} + +void unlock_tokens(rstl::vector< CToken >& anims) { + for (rstl::vector< CToken >::iterator it = anims.begin(); it != anims.end(); ++it) + it->Unlock(); +} + +void primitive_set_to_token_vector(const CAnimData& animData, + const rstl::set< CPrimitive >& primSet, + rstl::vector< CToken >& tokensOut, bool preLock) { + + int eventCount = 0; + + rstl::set< CPrimitive >::const_iterator it = primSet.begin(); + for (; it != primSet.end(); ++it) { + if (animData.GetEventResourceIdForAnimResourceId(it->GetAnimResId()) != -1) + ++eventCount; + } + + tokensOut = rstl::vector< CToken >(); + tokensOut.reserve(primSet.size() + eventCount); + + for (it = primSet.begin(); it != primSet.end(); ++it) { + int aId = it->GetAnimResId(); + int eId = animData.GetEventResourceIdForAnimResourceId(aId); + + if (eId != -1) { + CToken token = gpSimplePool->GetObj(SObjectTag('EVNT', eId)); + if (preLock) + token.Lock(); + tokensOut.push_back(token); + } + + CToken token = gpSimplePool->GetObj(SObjectTag('ANIM', aId)); + if (preLock) + token.Lock(); + tokensOut.push_back(token); + } +} + +void do_sound_event(rstl::pair< u16, CSfxHandle >& sfxHandle, int& pitch, bool doPitchBend, + uint soundId, float weight, uint flags, float falloff, float maxDist, + uchar minVol, uchar maxVol, const CVector3f& posToCam, const CVector3f& pos, + TAreaId aid, CStateManager& mgr) { + if (posToCam.MagSquared() >= maxDist * maxDist) + return; + + u16 useSfxId = CSfxManager::TranslateSFXID(u16(soundId)); + uint useFlags = 0x1; // Continuous parameter update + if ((flags & 0x8) != 0) + useFlags |= 0x8; // Doppler effect + bool useAcoustics = (flags & 0x80) == 0; + + CAudioSys::C3DEmitterParmData parms(pos, CVector3f::Up(), maxDist, falloff, useFlags, useSfxId, + maxVol, minVol, false, 0x7f); + + if (mgr.Random()->Float() <= weight) { + if ((soundId & 0x80000000) != 0) { + if (!sfxHandle.second) { + CSfxHandle hnd; + if ((soundId & 0x40000000) != 0) + hnd = CSfxManager::SfxStart(useSfxId, 0x7f, 0x40, true, CSfxManager::kMedPriority, true, + aid.Value()); + else + hnd = CSfxManager::AddEmitter(parms, useAcoustics, CSfxManager::kMedPriority, true, + aid.Value()); + if (hnd) { + sfxHandle.first = useSfxId; + sfxHandle.second = hnd; + if (doPitchBend) + CSfxManager::PitchBend(hnd, pitch); + } + } else { + if (sfxHandle.first == useSfxId) { + CSfxManager::UpdateEmitter(sfxHandle.second, parms.x0_pos, parms.xc_dir, maxVol); + } else if ((flags & 0x4) != 0) // Pausable + { + CSfxManager::RemoveEmitter(sfxHandle.second); + CSfxHandle hnd = CSfxManager::AddEmitter(parms, useAcoustics, 0x7f, true, aid.Value()); + if (hnd) { + sfxHandle.first = useSfxId; + sfxHandle.second = hnd; + if (doPitchBend && hnd) + CSfxManager::PitchBend(hnd, pitch); + } + } + } + } else { + CSfxHandle hnd; + if ((soundId & 0x40000000) != 0) + hnd = CSfxManager::SfxStart(useSfxId, 1.f, 0.f, true, 0x7f, false, aid.Value()); + else + hnd = CSfxManager::AddEmitter(parms, useAcoustics, 0x7f, false, aid.Value()); + if (doPitchBend) + CSfxManager::PitchBend(hnd, pitch); + } + } +} + +CSfxHandle play_sfx(u16 sfx, bool underwater, bool looped, short pan) { + CSfxHandle hnd = CSfxManager::SfxStart(sfx, 0x7f, pan, true, CSfxManager::kMaxPriority, looped); + CSfxManager::SfxSpan(hnd, 0); + if (underwater) + CSfxManager::PitchBend(hnd, 0); + return hnd; +} + +CDamageInfo CGunWeapon::GetShotDamageInfo(const SShotParam& shotParam, CStateManager& mgr) const { + // CWeaponMode mode(shotParam.x0_weaponType, 0); + // float damage = shotParam.x8_damage; + // float radiusDamage = shotParam.xc_radiusDamage; + // float radius = shotParam.x10_radius; + // float knockback = shotParam.x14_knockback; + // bool noImmunity = shotParam.x18_24_noImmunity; + + CDamageInfo result( + CWeaponMode(shotParam.x0_weaponType, 0), + shotParam.x8_damage, + shotParam.xc_radiusDamage, + shotParam.x10_radius, + shotParam.x14_knockback, + shotParam.x18_24_noImmunity); + + if (gpGameState->GetHardMode()) { + result.MultiplyDamage(gpGameState->GetHardModeWeaponMultiplier()); + } + return result; +} + +int get_current_suit(const CStateManager& mgr) { + const CPlayerState* state = mgr.GetPlayerState(); + CPlayerState::EPlayerSuit suit = state->GetCurrentSuit(); + if (suit < CPlayerState::kPS_Power || suit > CPlayerState::kPS_FusionGravity) + suit = CPlayerState::kPS_Power; + if (suit == CPlayerState::kPS_FusionPower) + suit = CPlayerState::EPlayerSuit(int(suit) + int(state->GetCurrentSuitRaw())); + return suit; +} + +} // namespace NWeaponTypes diff --git a/tools/metaforce_renames.py b/tools/metaforce_renames.py index 4ba0c501..01cc8aab 100644 --- a/tools/metaforce_renames.py +++ b/tools/metaforce_renames.py @@ -30,6 +30,7 @@ _LITERAL_REPLACEMENTS = [ ("g_SimplePool", "gpSimplePool"), ("g_Renderer", "gpRender"), + ("g_ResFactory", "gpResourceFactory"), # Vector (".magnitude()", ".Magnitude()"),