From f6f1040fff5865cfbcf98dca9b4aad95ec28b72b Mon Sep 17 00:00:00 2001 From: Luke Street Date: Sun, 18 Sep 2022 13:51:07 -0400 Subject: [PATCH] Various rstl fixes; continue CScriptMazeNode & CScriptPlatform Former-commit-id: 7608f27ed25d023062df8257de2982c881e982f4 --- asm/MetroidPrime/CStateManager.s | 4 +- asm/MetroidPrime/Enemies/CFlyingPirate.s | 8 +-- asm/MetroidPrime/Enemies/CMetroidPrimeExo.s | 4 +- asm/MetroidPrime/Enemies/CRidley.s | 4 +- asm/MetroidPrime/Enemies/CThardus.s | 2 +- asm/MetroidPrime/Enemies/CWallCrawlerSwarm.s | 2 +- asm/MetroidPrime/Enemies/CWallWalker.s | 2 +- .../ScriptObjects/CScriptAiJumpPoint.s | 2 +- .../ScriptObjects/CScriptMazeNode.s | 4 +- .../ScriptObjects/CScriptPlatform.s | 28 ++++------- .../ScriptObjects/CScriptWaypoint.s | 4 +- include/Kyoto/Graphics/CColor.hpp | 1 + include/Kyoto/Math/CTransform4f.hpp | 2 +- include/MetroidPrime/CModelData.hpp | 1 + include/MetroidPrime/CStateManager.hpp | 2 +- .../ScriptObjects/CScriptPlatform.hpp | 10 ++++ .../ScriptObjects/CScriptWaypoint.hpp | 50 +++++++++++++++++++ include/MetroidPrime/TCastTo.hpp | 4 +- include/rstl/algorithm.hpp | 5 -- include/rstl/optional_object.hpp | 2 +- include/rstl/pointer_iterator.hpp | 38 ++++++-------- include/rstl/single_ptr.hpp | 5 +- include/static_assert.hpp | 6 +++ .../ScriptObjects/CScriptMazeNode.cpp | 35 ++++--------- .../ScriptObjects/CScriptPlatform.cpp | 42 ++++++++++++++++ 25 files changed, 171 insertions(+), 96 deletions(-) create mode 100644 include/MetroidPrime/ScriptObjects/CScriptWaypoint.hpp diff --git a/asm/MetroidPrime/CStateManager.s b/asm/MetroidPrime/CStateManager.s index 1ad6afe2..8790ee9c 100644 --- a/asm/MetroidPrime/CStateManager.s +++ b/asm/MetroidPrime/CStateManager.s @@ -626,8 +626,8 @@ sub_80044008: /* 80044028 00040F88 90 03 0F 04 */ stw r0, 0xf04(r3) /* 8004402C 00040F8C 4E 80 00 20 */ blr -.global "SetCurrentMaze__13CStateManagerFRCQ24rstl24single_ptr<10CMazeState>" -"SetCurrentMaze__13CStateManagerFRCQ24rstl24single_ptr<10CMazeState>": +.global "SetCurrentMaze__13CStateManagerFQ24rstl24single_ptr<10CMazeState>" +"SetCurrentMaze__13CStateManagerFQ24rstl24single_ptr<10CMazeState>": /* 80044030 00040F90 94 21 FF F0 */ stwu r1, -0x10(r1) /* 80044034 00040F94 7C 08 02 A6 */ mflr r0 /* 80044038 00040F98 90 01 00 14 */ stw r0, 0x14(r1) diff --git a/asm/MetroidPrime/Enemies/CFlyingPirate.s b/asm/MetroidPrime/Enemies/CFlyingPirate.s index 948bba18..17c80eda 100644 --- a/asm/MetroidPrime/Enemies/CFlyingPirate.s +++ b/asm/MetroidPrime/Enemies/CFlyingPirate.s @@ -802,7 +802,7 @@ lbl_801F4584: /* 801F4584 001F14E4 7F A5 EB 78 */ mr r5, r29 /* 801F4588 001F14E8 38 61 00 10 */ addi r3, r1, 0x10 /* 801F458C 001F14EC 3B 18 00 01 */ addi r24, r24, 1 -/* 801F4590 001F14F0 4B E8 2B A5 */ bl NextWaypoint__15CScriptWaypointCFR13CStateManager +/* 801F4590 001F14F0 4B E8 2B A5 */ bl NextWaypoint__15CScriptWaypointCFRC13CStateManager /* 801F4594 001F14F4 A0 01 00 10 */ lhz r0, 0x10(r1) /* 801F4598 001F14F8 7F A3 EB 78 */ mr r3, r29 /* 801F459C 001F14FC 38 81 00 14 */ addi r4, r1, 0x14 @@ -951,7 +951,7 @@ lbl_801F479C: /* 801F47A8 001F1708 38 61 00 08 */ addi r3, r1, 8 /* 801F47AC 001F170C 38 06 00 01 */ addi r0, r6, 1 /* 801F47B0 001F1710 90 1C 03 90 */ stw r0, 0x390(r28) -/* 801F47B4 001F1714 4B E8 29 81 */ bl NextWaypoint__15CScriptWaypointCFR13CStateManager +/* 801F47B4 001F1714 4B E8 29 81 */ bl NextWaypoint__15CScriptWaypointCFRC13CStateManager /* 801F47B8 001F1718 A0 01 00 08 */ lhz r0, 8(r1) /* 801F47BC 001F171C 7F A3 EB 78 */ mr r3, r29 /* 801F47C0 001F1720 38 81 00 0C */ addi r4, r1, 0xc @@ -1746,7 +1746,7 @@ UpdateDest__10CPatternedFR13CStateManager: /* 801F52FC 001F225C 7F E4 FB 78 */ mr r4, r31 /* 801F5300 001F2260 7F 85 E3 78 */ mr r5, r28 /* 801F5304 001F2264 38 61 00 20 */ addi r3, r1, 0x20 -/* 801F5308 001F2268 4B E8 1E 2D */ bl NextWaypoint__15CScriptWaypointCFR13CStateManager +/* 801F5308 001F2268 4B E8 1E 2D */ bl NextWaypoint__15CScriptWaypointCFRC13CStateManager /* 801F530C 001F226C A0 01 00 20 */ lhz r0, 0x20(r1) /* 801F5310 001F2270 B0 1B 02 DC */ sth r0, 0x2dc(r27) /* 801F5314 001F2274 A0 7B 02 DC */ lhz r3, 0x2dc(r27) @@ -1846,7 +1846,7 @@ lbl_801F5480: /* 801F5488 001F23E8 7F C4 F3 78 */ mr r4, r30 /* 801F548C 001F23EC 7F 85 E3 78 */ mr r5, r28 /* 801F5490 001F23F0 38 61 00 18 */ addi r3, r1, 0x18 -/* 801F5494 001F23F4 4B E8 1C A1 */ bl NextWaypoint__15CScriptWaypointCFR13CStateManager +/* 801F5494 001F23F4 4B E8 1C A1 */ bl NextWaypoint__15CScriptWaypointCFRC13CStateManager /* 801F5498 001F23F8 A0 61 00 18 */ lhz r3, 0x18(r1) /* 801F549C 001F23FC A0 0D A3 8C */ lhz r0, kInvalidUniqueId@sda21(r13) /* 801F54A0 001F2400 B0 61 00 28 */ sth r3, 0x28(r1) diff --git a/asm/MetroidPrime/Enemies/CMetroidPrimeExo.s b/asm/MetroidPrime/Enemies/CMetroidPrimeExo.s index 601f65a3..4f09a758 100644 --- a/asm/MetroidPrime/Enemies/CMetroidPrimeExo.s +++ b/asm/MetroidPrime/Enemies/CMetroidPrimeExo.s @@ -4542,7 +4542,7 @@ lbl_802746C0: lbl_8027470C: /* 8027470C 0027166C 7F C5 F3 78 */ mr r5, r30 /* 80274710 00271670 38 61 00 08 */ addi r3, r1, 8 -/* 80274714 00271674 4B E0 2A 21 */ bl NextWaypoint__15CScriptWaypointCFR13CStateManager +/* 80274714 00271674 4B E0 2A 21 */ bl NextWaypoint__15CScriptWaypointCFRC13CStateManager /* 80274718 00271678 A0 01 00 08 */ lhz r0, 8(r1) /* 8027471C 0027167C B0 01 00 14 */ sth r0, 0x14(r1) lbl_80274720: @@ -7045,7 +7045,7 @@ lbl_80276AC8: lbl_80276AEC: /* 80276AEC 00273A4C 7F A5 EB 78 */ mr r5, r29 /* 80276AF0 00273A50 38 61 00 08 */ addi r3, r1, 8 -/* 80276AF4 00273A54 4B E0 06 41 */ bl NextWaypoint__15CScriptWaypointCFR13CStateManager +/* 80276AF4 00273A54 4B E0 06 41 */ bl NextWaypoint__15CScriptWaypointCFRC13CStateManager /* 80276AF8 00273A58 A0 01 00 08 */ lhz r0, 8(r1) /* 80276AFC 00273A5C B0 01 00 14 */ sth r0, 0x14(r1) /* 80276B00 00273A60 48 00 00 0C */ b lbl_80276B0C diff --git a/asm/MetroidPrime/Enemies/CRidley.s b/asm/MetroidPrime/Enemies/CRidley.s index 0b112f3c..5cbcd899 100644 --- a/asm/MetroidPrime/Enemies/CRidley.s +++ b/asm/MetroidPrime/Enemies/CRidley.s @@ -7980,7 +7980,7 @@ lbl_80258EEC: /* 80258F4C 00255EAC 7F 44 D3 78 */ mr r4, r26 /* 80258F50 00255EB0 7F C5 F3 78 */ mr r5, r30 /* 80258F54 00255EB4 38 61 00 78 */ addi r3, r1, 0x78 -/* 80258F58 00255EB8 4B E1 E1 DD */ bl NextWaypoint__15CScriptWaypointCFR13CStateManager +/* 80258F58 00255EB8 4B E1 E1 DD */ bl NextWaypoint__15CScriptWaypointCFRC13CStateManager /* 80258F5C 00255EBC A0 01 00 78 */ lhz r0, 0x78(r1) /* 80258F60 00255EC0 7F C3 F3 78 */ mr r3, r30 /* 80258F64 00255EC4 38 81 00 7C */ addi r4, r1, 0x7c @@ -8029,7 +8029,7 @@ lbl_80258EEC: /* 80259010 00255F70 D0 A1 01 A4 */ stfs f5, 0x1a4(r1) /* 80259014 00255F74 D0 C1 01 A8 */ stfs f6, 0x1a8(r1) /* 80259018 00255F78 D0 1F 0A B8 */ stfs f0, 0xab8(r31) -/* 8025901C 00255F7C 4B E1 E1 19 */ bl NextWaypoint__15CScriptWaypointCFR13CStateManager +/* 8025901C 00255F7C 4B E1 E1 19 */ bl NextWaypoint__15CScriptWaypointCFRC13CStateManager /* 80259020 00255F80 A0 01 00 70 */ lhz r0, 0x70(r1) /* 80259024 00255F84 7F C3 F3 78 */ mr r3, r30 /* 80259028 00255F88 38 81 00 74 */ addi r4, r1, 0x74 diff --git a/asm/MetroidPrime/Enemies/CThardus.s b/asm/MetroidPrime/Enemies/CThardus.s index 288fe9fa..3c46b1d8 100644 --- a/asm/MetroidPrime/Enemies/CThardus.s +++ b/asm/MetroidPrime/Enemies/CThardus.s @@ -5141,7 +5141,7 @@ lbl_801DE780: /* 801DE7B8 001DB718 7F E5 FB 78 */ mr r5, r31 /* 801DE7BC 001DB71C 38 61 00 0C */ addi r3, r1, 0xc /* 801DE7C0 001DB720 7E 64 9B 78 */ mr r4, r19 -/* 801DE7C4 001DB724 4B E9 89 71 */ bl NextWaypoint__15CScriptWaypointCFR13CStateManager +/* 801DE7C4 001DB724 4B E9 89 71 */ bl NextWaypoint__15CScriptWaypointCFRC13CStateManager /* 801DE7C8 001DB728 A0 01 00 0C */ lhz r0, 0xc(r1) /* 801DE7CC 001DB72C 7F E3 FB 78 */ mr r3, r31 /* 801DE7D0 001DB730 38 81 00 10 */ addi r4, r1, 0x10 diff --git a/asm/MetroidPrime/Enemies/CWallCrawlerSwarm.s b/asm/MetroidPrime/Enemies/CWallCrawlerSwarm.s index 21ee6a5c..64f3be50 100644 --- a/asm/MetroidPrime/Enemies/CWallCrawlerSwarm.s +++ b/asm/MetroidPrime/Enemies/CWallCrawlerSwarm.s @@ -1627,7 +1627,7 @@ MoveToWayPoint__17CWallCrawlerSwarmFRQ217CWallCrawlerSwarm5CBoidR13CStateManager /* 801E8AB8 001E5A18 40 80 00 80 */ bge lbl_801E8B38 /* 801E8ABC 001E5A1C 7F A5 EB 78 */ mr r5, r29 /* 801E8AC0 001E5A20 38 61 00 0C */ addi r3, r1, 0xc -/* 801E8AC4 001E5A24 4B E8 E6 71 */ bl NextWaypoint__15CScriptWaypointCFR13CStateManager +/* 801E8AC4 001E5A24 4B E8 E6 71 */ bl NextWaypoint__15CScriptWaypointCFRC13CStateManager /* 801E8AC8 001E5A28 A0 01 00 0C */ lhz r0, 0xc(r1) /* 801E8ACC 001E5A2C B0 1C 00 3C */ sth r0, 0x3c(r28) /* 801E8AD0 001E5A30 A0 7C 00 3C */ lhz r3, 0x3c(r28) diff --git a/asm/MetroidPrime/Enemies/CWallWalker.s b/asm/MetroidPrime/Enemies/CWallWalker.s index 7852241c..e4f6abe1 100644 --- a/asm/MetroidPrime/Enemies/CWallWalker.s +++ b/asm/MetroidPrime/Enemies/CWallWalker.s @@ -345,7 +345,7 @@ GotoNextWaypoint__11CWallWalkerFR13CStateManager: /* 80268798 002656F8 7F E4 FB 78 */ mr r4, r31 /* 8026879C 002656FC 7F C5 F3 78 */ mr r5, r30 /* 802687A0 00265700 38 61 00 10 */ addi r3, r1, 0x10 -/* 802687A4 00265704 4B E0 E9 91 */ bl NextWaypoint__15CScriptWaypointCFR13CStateManager +/* 802687A4 00265704 4B E0 E9 91 */ bl NextWaypoint__15CScriptWaypointCFRC13CStateManager /* 802687A8 00265708 A0 01 00 10 */ lhz r0, 0x10(r1) /* 802687AC 0026570C C0 22 BB 04 */ lfs f1, lbl_805AD824@sda21(r2) /* 802687B0 00265710 B0 1D 02 DC */ sth r0, 0x2dc(r29) diff --git a/asm/MetroidPrime/ScriptObjects/CScriptAiJumpPoint.s b/asm/MetroidPrime/ScriptObjects/CScriptAiJumpPoint.s index 9f6f2e99..eadfc9df 100644 --- a/asm/MetroidPrime/ScriptObjects/CScriptAiJumpPoint.s +++ b/asm/MetroidPrime/ScriptObjects/CScriptAiJumpPoint.s @@ -196,7 +196,7 @@ lbl_801EF36C: /* 801EF3D0 001EC330 7F A5 EB 78 */ mr r5, r29 /* 801EF3D4 001EC334 38 61 00 08 */ addi r3, r1, 8 /* 801EF3D8 001EC338 B0 1F 01 0C */ sth r0, 0x10c(r31) -/* 801EF3DC 001EC33C 4B E8 7D 59 */ bl NextWaypoint__15CScriptWaypointCFR13CStateManager +/* 801EF3DC 001EC33C 4B E8 7D 59 */ bl NextWaypoint__15CScriptWaypointCFRC13CStateManager /* 801EF3E0 001EC340 A0 01 00 08 */ lhz r0, 8(r1) /* 801EF3E4 001EC344 B0 1F 01 0E */ sth r0, 0x10e(r31) /* 801EF3E8 001EC348 48 00 00 20 */ b lbl_801EF408 diff --git a/asm/MetroidPrime/ScriptObjects/CScriptMazeNode.s b/asm/MetroidPrime/ScriptObjects/CScriptMazeNode.s index bd589927..5302d4b6 100644 --- a/asm/MetroidPrime/ScriptObjects/CScriptMazeNode.s +++ b/asm/MetroidPrime/ScriptObjects/CScriptMazeNode.s @@ -261,7 +261,7 @@ lbl_80288A7C: /* 80288ADC 00285A3C 7F C3 F3 78 */ mr r3, r30 /* 80288AE0 00285A40 38 81 00 58 */ addi r4, r1, 0x58 /* 80288AE4 00285A44 90 01 00 5C */ stw r0, 0x5c(r1) -/* 80288AE8 00285A48 4B DB B5 49 */ bl "SetCurrentMaze__13CStateManagerFRCQ24rstl24single_ptr<10CMazeState>" +/* 80288AE8 00285A48 4B DB B5 49 */ bl "SetCurrentMaze__13CStateManagerFQ24rstl24single_ptr<10CMazeState>" /* 80288AEC 00285A4C 80 61 00 58 */ lwz r3, 0x58(r1) /* 80288AF0 00285A50 48 08 CE 41 */ bl Free__7CMemoryFPCv /* 80288AF4 00285A54 80 61 00 5C */ lwz r3, 0x5c(r1) @@ -739,7 +739,7 @@ lbl_802891AC: /* 802891C0 00286120 7F C3 F3 78 */ mr r3, r30 /* 802891C4 00286124 90 01 00 40 */ stw r0, 0x40(r1) /* 802891C8 00286128 38 81 00 40 */ addi r4, r1, 0x40 -/* 802891CC 0028612C 4B DB AE 65 */ bl "SetCurrentMaze__13CStateManagerFRCQ24rstl24single_ptr<10CMazeState>" +/* 802891CC 0028612C 4B DB AE 65 */ bl "SetCurrentMaze__13CStateManagerFQ24rstl24single_ptr<10CMazeState>" /* 802891D0 00286130 80 61 00 40 */ lwz r3, 0x40(r1) /* 802891D4 00286134 48 08 C7 5D */ bl Free__7CMemoryFPCv lbl_802891D8: diff --git a/asm/MetroidPrime/ScriptObjects/CScriptPlatform.s b/asm/MetroidPrime/ScriptObjects/CScriptPlatform.s index 8a4d0098..affc9e34 100644 --- a/asm/MetroidPrime/ScriptObjects/CScriptPlatform.s +++ b/asm/MetroidPrime/ScriptObjects/CScriptPlatform.s @@ -1618,7 +1618,7 @@ lbl_800B1FD0: /* 800B2044 000AEFA4 80 9D 03 3C */ lwz r4, 0x33c(r29) /* 800B2048 000AEFA8 38 7D 03 38 */ addi r3, r29, 0x338 /* 800B204C 000AEFAC 38 84 00 01 */ addi r4, r4, 1 -/* 800B2050 000AEFB0 48 00 23 B5 */ bl sub_800b4404 +/* 800B2050 000AEFB0 48 00 23 B5 */ bl "reserve__Q24rstl43vector<7SRiders,Q24rstl17rmemory_allocator>Fi" /* 800B2054 000AEFB4 A0 1E 00 00 */ lhz r0, 0(r30) /* 800B2058 000AEFB8 3B C1 00 38 */ addi r30, r1, 0x38 /* 800B205C 000AEFBC C0 02 8C CC */ lfs f0, lbl_805AA9EC@sda21(r2) @@ -1638,7 +1638,7 @@ lbl_800B1FD0: /* 800B2094 000AEFF4 41 82 00 08 */ beq lbl_800B209C /* 800B2098 000AEFF8 54 A4 08 3C */ slwi r4, r5, 1 lbl_800B209C: -/* 800B209C 000AEFFC 48 00 23 69 */ bl sub_800b4404 +/* 800B209C 000AEFFC 48 00 23 69 */ bl "reserve__Q24rstl43vector<7SRiders,Q24rstl17rmemory_allocator>Fi" lbl_800B20A0: /* 800B20A0 000AF000 80 1D 03 3C */ lwz r0, 0x33c(r29) /* 800B20A4 000AF004 80 7D 03 44 */ lwz r3, 0x344(r29) @@ -1761,12 +1761,10 @@ AcceptScriptMsg__15CScriptPlatformF20EScriptObjectMessage9TUniqueIdR13CStateMana /* 800B222C 000AF18C 7C 04 00 2E */ lwzx r0, r4, r0 /* 800B2230 000AF190 7C 09 03 A6 */ mtctr r0 /* 800B2234 000AF194 4E 80 04 20 */ bctr -.global lbl_800B2238 lbl_800B2238: /* 800B2238 000AF198 7F E4 FB 78 */ mr r4, r31 /* 800B223C 000AF19C 48 00 08 15 */ bl BuildSlaveList__15CScriptPlatformFR13CStateManager /* 800B2240 000AF1A0 48 00 03 3C */ b lbl_800B257C -.global lbl_800B2244 lbl_800B2244: /* 800B2244 000AF1A4 A0 1E 00 00 */ lhz r0, 0(r30) /* 800B2248 000AF1A8 7F 85 E3 78 */ mr r5, r28 @@ -1775,13 +1773,11 @@ lbl_800B2244: /* 800B2254 000AF1B4 B0 01 00 64 */ sth r0, 0x64(r1) /* 800B2258 000AF1B8 48 00 15 79 */ bl "AddRider__15CScriptPlatformFRQ24rstl43vector<7SRiders,Q24rstl17rmemory_allocator>9TUniqueIdPC13CPhysicsActorR13CStateManager" /* 800B225C 000AF1BC 48 00 03 20 */ b lbl_800B257C -.global lbl_800B2260 lbl_800B2260: /* 800B2260 000AF1C0 C0 02 8C AC */ lfs f0, lbl_805AA9CC@sda21(r2) /* 800B2264 000AF1C4 D0 1C 02 5C */ stfs f0, 0x25c(r28) /* 800B2268 000AF1C8 48 06 91 11 */ bl Stop__13CPhysicsActorFv /* 800B226C 000AF1CC 48 00 03 10 */ b lbl_800B257C -.global lbl_800B2270 lbl_800B2270: /* 800B2270 000AF1D0 A0 1C 02 58 */ lhz r0, 0x258(r28) /* 800B2274 000AF1D4 7F 84 E3 78 */ mr r4, r28 @@ -1908,7 +1904,6 @@ lbl_800B2428: /* 800B243C 000AF39C C0 03 00 08 */ lfs f0, 8(r3) /* 800B2440 000AF3A0 D0 1C 02 78 */ stfs f0, 0x278(r28) /* 800B2444 000AF3A4 48 00 01 38 */ b lbl_800B257C -.global lbl_800B2448 lbl_800B2448: /* 800B2448 000AF3A8 A0 1C 02 58 */ lhz r0, 0x258(r28) /* 800B244C 000AF3AC 7F 84 E3 78 */ mr r4, r28 @@ -1946,7 +1941,6 @@ lbl_800B249C: /* 800B24C8 000AF428 C0 03 00 E8 */ lfs f0, 0xe8(r3) /* 800B24CC 000AF42C D0 1C 02 5C */ stfs f0, 0x25c(r28) /* 800B24D0 000AF430 48 00 00 AC */ b lbl_800B257C -.global lbl_800B24D4 lbl_800B24D4: /* 800B24D4 000AF434 88 1C 03 56 */ lbz r0, 0x356(r28) /* 800B24D8 000AF438 38 60 00 00 */ li r3, 0 @@ -1957,7 +1951,6 @@ lbl_800B24D4: /* 800B24EC 000AF44C C0 1C 02 90 */ lfs f0, 0x290(r28) /* 800B24F0 000AF450 D0 1C 02 98 */ stfs f0, 0x298(r28) /* 800B24F4 000AF454 48 00 00 88 */ b lbl_800B257C -.global lbl_800B24F8 lbl_800B24F8: /* 800B24F8 000AF458 88 1C 00 30 */ lbz r0, 0x30(r28) /* 800B24FC 000AF45C 54 00 CF FF */ rlwinm. r0, r0, 0x19, 0x1f, 0x1f @@ -1980,7 +1973,6 @@ lbl_800B2524: /* 800B253C 000AF49C C0 3C 02 68 */ lfs f1, 0x268(r28) /* 800B2540 000AF4A0 48 14 F4 69 */ bl FadeInHelper__20CScriptColorModulateFR13CStateManager9TUniqueIdf /* 800B2544 000AF4A4 48 00 00 38 */ b lbl_800B257C -.global lbl_800B2548 lbl_800B2548: /* 800B2548 000AF4A8 A0 1C 00 08 */ lhz r0, 8(r28) /* 800B254C 000AF4AC 7F E4 FB 78 */ mr r4, r31 @@ -1991,13 +1983,11 @@ lbl_800B2548: /* 800B2560 000AF4C0 C0 3C 02 6C */ lfs f1, 0x26c(r28) /* 800B2564 000AF4C4 48 14 F2 15 */ bl FadeOutHelper__20CScriptColorModulateFR13CStateManager9TUniqueIdf /* 800B2568 000AF4C8 48 00 00 14 */ b lbl_800B257C -.global lbl_800B256C lbl_800B256C: /* 800B256C 000AF4CC C0 22 8C D0 */ lfs f1, lbl_805AA9F0@sda21(r2) /* 800B2570 000AF4D0 7F E4 FB 78 */ mr r4, r31 /* 800B2574 000AF4D4 38 7C 03 18 */ addi r3, r28, 0x318 /* 800B2578 000AF4D8 48 00 10 2D */ bl "DecayRiders__15CScriptPlatformFRQ24rstl43vector<7SRiders,Q24rstl17rmemory_allocator>fR13CStateManager" -.global lbl_800B257C lbl_800B257C: /* 800B257C 000AF4DC A0 1E 00 00 */ lhz r0, 0(r30) /* 800B2580 000AF4E0 7F 83 E3 78 */ mr r3, r28 @@ -2360,7 +2350,7 @@ BuildSlaveList__15CScriptPlatformFR13CStateManager: /* 800B2A64 000AF9C4 7C 7C 1B 78 */ mr r28, r3 /* 800B2A68 000AF9C8 80 83 00 24 */ lwz r4, 0x24(r3) /* 800B2A6C 000AF9CC 38 7C 03 28 */ addi r3, r28, 0x328 -/* 800B2A70 000AF9D0 48 00 19 95 */ bl sub_800b4404 +/* 800B2A70 000AF9D0 48 00 19 95 */ bl "reserve__Q24rstl43vector<7SRiders,Q24rstl17rmemory_allocator>Fi" /* 800B2A74 000AF9D4 83 FC 00 2C */ lwz r31, 0x2c(r28) /* 800B2A78 000AF9D8 3B C1 00 4C */ addi r30, r1, 0x4c /* 800B2A7C 000AF9DC 48 00 01 E0 */ b lbl_800B2C5C @@ -2426,7 +2416,7 @@ lbl_800B2A80: /* 800B2B68 000AFAC8 41 82 00 08 */ beq lbl_800B2B70 /* 800B2B6C 000AFACC 54 A4 08 3C */ slwi r4, r5, 1 lbl_800B2B70: -/* 800B2B70 000AFAD0 48 00 18 95 */ bl sub_800b4404 +/* 800B2B70 000AFAD0 48 00 18 95 */ bl "reserve__Q24rstl43vector<7SRiders,Q24rstl17rmemory_allocator>Fi" lbl_800B2B74: /* 800B2B74 000AFAD4 80 1C 03 2C */ lwz r0, 0x32c(r28) /* 800B2B78 000AFAD8 80 7C 03 34 */ lwz r3, 0x334(r28) @@ -3384,7 +3374,7 @@ lbl_800B3938: /* 800B3938 000B0898 80 9B 00 04 */ lwz r4, 4(r27) /* 800B393C 000B089C 7F 63 DB 78 */ mr r3, r27 /* 800B3940 000B08A0 38 84 00 01 */ addi r4, r4, 1 -/* 800B3944 000B08A4 48 00 0A C1 */ bl sub_800b4404 +/* 800B3944 000B08A4 48 00 0A C1 */ bl "reserve__Q24rstl43vector<7SRiders,Q24rstl17rmemory_allocator>Fi" /* 800B3948 000B08A8 80 1B 00 04 */ lwz r0, 4(r27) /* 800B394C 000B08AC 80 BB 00 08 */ lwz r5, 8(r27) /* 800B3950 000B08B0 7C 00 28 00 */ cmpw r0, r5 @@ -3395,7 +3385,7 @@ lbl_800B3938: /* 800B3964 000B08C4 41 82 00 08 */ beq lbl_800B396C /* 800B3968 000B08C8 54 A4 08 3C */ slwi r4, r5, 1 lbl_800B396C: -/* 800B396C 000B08CC 48 00 0A 99 */ bl sub_800b4404 +/* 800B396C 000B08CC 48 00 0A 99 */ bl "reserve__Q24rstl43vector<7SRiders,Q24rstl17rmemory_allocator>Fi" lbl_800B3970: /* 800B3970 000B08D0 80 1B 00 04 */ lwz r0, 4(r27) /* 800B3974 000B08D4 80 7B 00 0C */ lwz r3, 0xc(r27) @@ -3454,7 +3444,7 @@ GetNext__15CScriptPlatformF9TUniqueIdR13CStateManager: lbl_800B3A30: /* 800B3A30 000B0990 7F E5 FB 78 */ mr r5, r31 /* 800B3A34 000B0994 38 61 00 0C */ addi r3, r1, 0xc -/* 800B3A38 000B0998 4B FC 36 FD */ bl NextWaypoint__15CScriptWaypointCFR13CStateManager +/* 800B3A38 000B0998 4B FC 36 FD */ bl NextWaypoint__15CScriptWaypointCFRC13CStateManager /* 800B3A3C 000B099C A0 01 00 0C */ lhz r0, 0xc(r1) /* 800B3A40 000B09A0 7F E3 FB 78 */ mr r3, r31 /* 800B3A44 000B09A4 38 81 00 08 */ addi r4, r1, 8 @@ -4131,8 +4121,8 @@ lbl_800B43CC: /* 800B43FC 000B135C B0 03 00 02 */ sth r0, 2(r3) /* 800B4400 000B1360 4E 80 00 20 */ blr -.global sub_800b4404 -sub_800b4404: +.global "reserve__Q24rstl43vector<7SRiders,Q24rstl17rmemory_allocator>Fi" +"reserve__Q24rstl43vector<7SRiders,Q24rstl17rmemory_allocator>Fi": /* 800B4404 000B1364 94 21 FF D0 */ stwu r1, -0x30(r1) /* 800B4408 000B1368 7C 08 02 A6 */ mflr r0 /* 800B440C 000B136C 90 01 00 34 */ stw r0, 0x34(r1) diff --git a/asm/MetroidPrime/ScriptObjects/CScriptWaypoint.s b/asm/MetroidPrime/ScriptObjects/CScriptWaypoint.s index 1a0c971e..ddca4603 100644 --- a/asm/MetroidPrime/ScriptObjects/CScriptWaypoint.s +++ b/asm/MetroidPrime/ScriptObjects/CScriptWaypoint.s @@ -126,8 +126,8 @@ lbl_80077120: /* 8007712C 0007408C 38 21 00 20 */ addi r1, r1, 0x20 /* 80077130 00074090 4E 80 00 20 */ blr -.global NextWaypoint__15CScriptWaypointCFR13CStateManager -NextWaypoint__15CScriptWaypointCFR13CStateManager: +.global NextWaypoint__15CScriptWaypointCFRC13CStateManager +NextWaypoint__15CScriptWaypointCFRC13CStateManager: /* 80077134 00074094 94 21 FF A0 */ stwu r1, -0x60(r1) /* 80077138 00074098 7C 08 02 A6 */ mflr r0 /* 8007713C 0007409C 90 01 00 64 */ stw r0, 0x64(r1) diff --git a/include/Kyoto/Graphics/CColor.hpp b/include/Kyoto/Graphics/CColor.hpp index dca452bd..5781770d 100644 --- a/include/Kyoto/Graphics/CColor.hpp +++ b/include/Kyoto/Graphics/CColor.hpp @@ -74,6 +74,7 @@ private: static const CColor sPurpleColor; static const CColor sOrangeColor; }; +CHECK_SIZEOF(CColor, 0x4) #ifdef __MWERKS__ #pragma cpp_extensions off diff --git a/include/Kyoto/Math/CTransform4f.hpp b/include/Kyoto/Math/CTransform4f.hpp index ac662a29..9cb5317a 100644 --- a/include/Kyoto/Math/CTransform4f.hpp +++ b/include/Kyoto/Math/CTransform4f.hpp @@ -75,7 +75,7 @@ public: // Translate__12CTransform4fFfff // Translate__12CTransform4fFRC9CVector3f // TransposeMultiply__12CTransform4fCFRC9CVector3f - // TransposeRotate__12CTransform4fCFRC9CVector3f + CVector3f TransposeRotate(const CVector3f& in) const; void SetTranslation(const CVector3f& vec) { posX = vec.GetX(); diff --git a/include/MetroidPrime/CModelData.hpp b/include/MetroidPrime/CModelData.hpp index c4d691a1..a23160cc 100644 --- a/include/MetroidPrime/CModelData.hpp +++ b/include/MetroidPrime/CModelData.hpp @@ -87,5 +87,6 @@ private: rstl::optional_object< TCachedToken< CModel > > x2c_xrayModel; rstl::optional_object< TCachedToken< CModel > > x3c_infraModel; }; +CHECK_SIZEOF(CModelData, 0x4c) #endif diff --git a/include/MetroidPrime/CStateManager.hpp b/include/MetroidPrime/CStateManager.hpp index 9e9dc196..f7bb500a 100644 --- a/include/MetroidPrime/CStateManager.hpp +++ b/include/MetroidPrime/CStateManager.hpp @@ -55,7 +55,7 @@ public: CMazeState* CurrentMaze(); const CMazeState* GetCurrentMaze() const; - void SetCurrentMaze(const rstl::single_ptr< CMazeState >& maze); + void SetCurrentMaze(rstl::single_ptr< CMazeState > maze); CCameraManager* CameraManager() { return x870_cameraManager; } const CCameraManager* GetCameraManager() const { return x870_cameraManager; } diff --git a/include/MetroidPrime/ScriptObjects/CScriptPlatform.hpp b/include/MetroidPrime/ScriptObjects/CScriptPlatform.hpp index 59e87024..a9185eed 100644 --- a/include/MetroidPrime/ScriptObjects/CScriptPlatform.hpp +++ b/include/MetroidPrime/ScriptObjects/CScriptPlatform.hpp @@ -23,6 +23,10 @@ struct SRiders { TUniqueId x0_uid; f32 x4_decayTimer; CTransform4f x8_transform; + + SRiders(TUniqueId uid) + : x0_uid(uid), x4_decayTimer(1.f / 6.f), x8_transform(CTransform4f::Identity()) {} + bool operator==(const SRiders& other) const { return x0_uid == other.x0_uid; } }; class CScriptPlatform : public CPhysicsActor { @@ -60,6 +64,12 @@ public: virtual void SplashThink(const CAABox&, const CFluidPlane&, float, CStateManager&) const; virtual CQuaternion Move(float, CStateManager&); + TUniqueId GetWaypoint(CStateManager& mgr); + TUniqueId GetNext(TUniqueId uid, CStateManager& mgr); + + static void AddRider(rstl::vector< SRiders >& riders, TUniqueId riderId, + const CPhysicsActor* ridee, CStateManager& mgr); + private: TUniqueId x258_currentWaypoint; TUniqueId x25a_targetWaypoint; diff --git a/include/MetroidPrime/ScriptObjects/CScriptWaypoint.hpp b/include/MetroidPrime/ScriptObjects/CScriptWaypoint.hpp new file mode 100644 index 00000000..ac5305cf --- /dev/null +++ b/include/MetroidPrime/ScriptObjects/CScriptWaypoint.hpp @@ -0,0 +1,50 @@ +#ifndef _CSCRIPTWAYPOINT_HPP +#define _CSCRIPTWAYPOINT_HPP + +#include "types.h" + +#include "MetroidPrime/CActor.hpp" + +class CScriptWaypoint : public CActor { +public: + CScriptWaypoint(TUniqueId uid, const rstl::string& name, const CEntityInfo& info, + const CTransform4f& xf, bool active, float speed, float pause, + uint patternTranslate, uint patternOrient, uint patternFit, uint behaviour, + uint behaviourOrient, uint behaviourModifiers, uint animation); + + // CEntity + ~CScriptWaypoint() override; + void Accept(IVisitor& visitor) 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; + + // CScriptWaypoint + TUniqueId NextWaypoint(const CStateManager& mgr) const; + void FollowWaypoint(const CStateManager& mgr) const; + + f32 GetSpeed() const { return xe8_speed; } + uint GetAnimation() const { return xec_animation; } + f32 GetPause() const { return xf0_pause; } + u8 GetPatternTranslate() const { return xf4_patternTranslate; } + u8 GetPatternOrient() const { return xf5_patternOrient; } + u8 GetPatternFit() const { return xf6_patternFit; } + u8 GetBehaviour() const { return xf7_behaviour; } + u8 GetBehaviourOrient() const { return xf8_behaviourOrient; } + u16 GetBehaviourModifiers() const { return xfa_behaviourModifiers; } + +private: + f32 xe8_speed; + uint xec_animation; + f32 xf0_pause; + u8 xf4_patternTranslate; + u8 xf5_patternOrient; + u8 xf6_patternFit; + u8 xf7_behaviour; + u8 xf8_behaviourOrient; + u16 xfa_behaviourModifiers; +}; + +#endif \ No newline at end of file diff --git a/include/MetroidPrime/TCastTo.hpp b/include/MetroidPrime/TCastTo.hpp index de8df09d..68b54e55 100644 --- a/include/MetroidPrime/TCastTo.hpp +++ b/include/MetroidPrime/TCastTo.hpp @@ -98,11 +98,11 @@ private: }; template < typename T > -const T* TCastToConstPtr(const CEntity* p) { +inline const T* TCastToConstPtr(const CEntity* p) { return TCastToPtr< T >(const_cast< CEntity* >(p)); } template < typename T > -const T* TCastToConstPtr(const CEntity& p) { +inline const T* TCastToConstPtr(const CEntity& p) { return TCastToPtr< T >(const_cast< CEntity* >(&p)); } diff --git a/include/rstl/algorithm.hpp b/include/rstl/algorithm.hpp index aede661c..39e813c6 100644 --- a/include/rstl/algorithm.hpp +++ b/include/rstl/algorithm.hpp @@ -16,11 +16,6 @@ inline const T& max_val(const T& a, const T& b) { template < class Iter, class T > inline Iter find(Iter first, Iter last, const T& val) { - return find(first, last, val, typename Iter::iterator_category()); -} - -template < class Iter, class T > -inline Iter find(Iter first, Iter last, const T& val, input_iterator_tag) { while (first != last && !(*first == val)) ++first; return first; diff --git a/include/rstl/optional_object.hpp b/include/rstl/optional_object.hpp index 6b9271ba..37c2a351 100644 --- a/include/rstl/optional_object.hpp +++ b/include/rstl/optional_object.hpp @@ -44,7 +44,7 @@ public: private: u8 m_data[sizeof(T)]; - bool m_valid; + bool m_valid ATTRIBUTE_ALIGN(4); void assign(const T& item) { if (!m_valid) { diff --git a/include/rstl/pointer_iterator.hpp b/include/rstl/pointer_iterator.hpp index 9aab80bc..2df71254 100644 --- a/include/rstl/pointer_iterator.hpp +++ b/include/rstl/pointer_iterator.hpp @@ -14,14 +14,11 @@ struct random_access_iterator_tag : public bidirectional_iterator_tag {}; template < typename T, typename Vec, typename Alloc > class const_pointer_iterator { -protected: - const T* current; - public: typedef random_access_iterator_tag iterator_category; const_pointer_iterator() : current(nullptr) {} - const_pointer_iterator(const T* begin) : current(begin) {} + const_pointer_iterator(const T* begin) : current(const_cast< T* >(begin)) {} const_pointer_iterator& operator++() { ++current; return *this; @@ -30,10 +27,8 @@ public: --current; return *this; } - T* get_pointer() const { return const_cast< T* >(current); } - const T& operator*() const { return *get_pointer(); } - const T* operator->() const { return get_pointer(); } - bool CheckValid() const { return current != nullptr; } + const T& operator*() const { return *current; } + const T* operator->() const { return current; } bool operator==(const const_pointer_iterator& other) { return current == other.current; } bool operator!=(const const_pointer_iterator& other) { return current != other.current; } @@ -43,6 +38,9 @@ public: friend const_pointer_iterator operator-(const const_pointer_iterator& x, int v) { return const_pointer_iterator(x.current - v); } + +protected: + T* current; }; template < typename T, typename Vec, typename Alloc > @@ -50,34 +48,28 @@ class pointer_iterator : public const_pointer_iterator< T, Vec, Alloc > { public: 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) { - if (this->CheckValid()) { - *get_pointer() = other; - } - } - T* get_pointer() const { return const_cast< T* >(this->current); } - // T* operator*() const { if (CheckValid()) return get_pointer(); else return - // nullptr; } - T* operator->() const { return get_pointer(); } + void operator=(const T& other) { rstl::construct(this->current, other); } + T& operator*() { return *this->current; } + T* operator->() { return this->current; } void destroy() const { - if (this->CheckValid()) { - rstl::destroy(get_pointer()); + if (this->current != nullptr) { + rstl::destroy(this->current); } } pointer_iterator& operator++() { - ++current; + ++this->current; return *this; } pointer_iterator& operator--() { - --current; + --this->current; return *this; } friend pointer_iterator operator+(const pointer_iterator& x, int v) { - return pointer_iterator(x.get_pointer() + v); + return pointer_iterator(x.current + v); } friend pointer_iterator operator-(const pointer_iterator& x, int v) { - return pointer_iterator(x.get_pointer() - v); + return pointer_iterator(x.current - v); } }; } // namespace rstl diff --git a/include/rstl/single_ptr.hpp b/include/rstl/single_ptr.hpp index b6d391dc..c543f860 100644 --- a/include/rstl/single_ptr.hpp +++ b/include/rstl/single_ptr.hpp @@ -6,7 +6,7 @@ namespace rstl { template < typename T > class single_ptr { - T* x0_ptr; + mutable T* x0_ptr; public: single_ptr() : x0_ptr(nullptr) {} @@ -16,6 +16,9 @@ public: // const T* get() const { return x0_ptr; } T* operator->() { return x0_ptr; } const T* operator->() const { return x0_ptr; } + single_ptr(const single_ptr& other) : x0_ptr(other.x0_ptr) { + other.x0_ptr = nullptr; + } single_ptr& operator=(T* ptr) { delete x0_ptr; x0_ptr = ptr; diff --git a/include/static_assert.hpp b/include/static_assert.hpp index 1d9fd3e2..17d33d52 100644 --- a/include/static_assert.hpp +++ b/include/static_assert.hpp @@ -18,7 +18,13 @@ template < class T, int N > struct check_sizeof : _n_is_equal< sizeof(T), N > {}; #ifdef __MWERKS__ +#ifndef offsetof +typedef unsigned long size_t; +#define offsetof(type, member) ((size_t) & (((type*)0)->member)) +#endif #define CHECK_SIZEOF(cls, size) extern int cls##_check[check_sizeof< cls, size >::value]; +#define CHECK_OFFSETOF(cls, member, offset) \ + extern int cls##_check_offset##[_n_is_equal< offsetof(cls, member), offset >::value]; #else #define CHECK_SIZEOF(cls, size) #endif diff --git a/src/MetroidPrime/ScriptObjects/CScriptMazeNode.cpp b/src/MetroidPrime/ScriptObjects/CScriptMazeNode.cpp index c32c7037..760eb32e 100644 --- a/src/MetroidPrime/ScriptObjects/CScriptMazeNode.cpp +++ b/src/MetroidPrime/ScriptObjects/CScriptMazeNode.cpp @@ -272,6 +272,7 @@ void CScriptMazeNode::GenerateObjects(CStateManager& mgr) { if (conn->x0_state != kSS_MaxReached || conn->x4_msg != kSM_Activate) { continue; } + CEntity* ent = mgr.ObjectById(mgr.GetIdForScript(conn->x8_objId)); CScriptEffect* scriptEffect = TCastToPtr< CScriptEffect >(ent); CScriptActor* scriptActor = TCastToPtr< CScriptActor >(ent); @@ -282,12 +283,13 @@ void CScriptMazeNode::GenerateObjects(CStateManager& mgr) { if (scriptEffect && x13c_25_hasGate) { continue; } + // TUniqueId objUid = GenerateObject(mgr, conn->x8_objId); - TUniqueId objUid = GenerateObject(mgr, conn->x8_objId); - // bool wasGeneratingObject = mgr.IsGeneratingObject(); - // mgr.SetIsGeneratingObject(true); - // TUniqueId objUid = mgr.GenerateObject(conn->x8_objId).second; - // mgr.SetIsGeneratingObject(wasGeneratingObject); + bool wasGeneratingObject = mgr.IsGeneratingObject(); + mgr.SetIsGeneratingObject(true); + TUniqueId objUid = mgr.GenerateObject(conn->x8_objId).second; + mgr.SetIsGeneratingObject(wasGeneratingObject); + if (CActor* actor = static_cast< CActor* >(mgr.ObjectById(objUid))) { mgr.SendScriptMsg(actor, GetUniqueId(), kSM_Activate); if (scriptEffect) { @@ -321,19 +323,6 @@ void CScriptMazeNode::SendScriptMsgs(CStateManager& mgr, EScriptObjectMessage ms SendScriptMsg(mgr, mgr.ObjectById(xf4_gateEffectId), GetUniqueId(), msg); } -template < typename Iter, typename T > -static inline Iter contains(Iter it, Iter end, const T& value) { - for (; it != end && *it != value; ++it) { - } - return it; -} - -template < typename T > -static inline bool contains(const rstl::vector< T >& vec, - typename rstl::vector< T >::const_iterator end, const T& value) { - return rstl::find< rstl::vector< T >::const_iterator, T >(vec.begin(), end, value) != end; -} - void CScriptMazeNode::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId uid, CStateManager& mgr) { if (GetActive()) { switch (msg) { @@ -344,7 +333,7 @@ void CScriptMazeNode::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId uid, C maze->Reset(sMazeSeeds[mgr.GetActiveRandom()->Next() % 300]); maze->Initialize(); maze->GenerateObstacles(); - mgr.SetCurrentMaze(maze.release()); + mgr.SetCurrentMaze(maze); } break; } @@ -432,12 +421,8 @@ void CScriptMazeNode::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId uid, C case kSM_SetToZero: { CMazeState* maze = mgr.CurrentMaze(); if (x13c_24_hasPuddle && maze != nullptr) { - rstl::vector< TUniqueId >::const_iterator pend = x12c_puddleObjectIds.end(); - rstl::vector< TUniqueId >::const_iterator pit = - rstl::find< rstl::vector< TUniqueId >::const_iterator, TUniqueId >( - x12c_puddleObjectIds.begin(), pend, uid); - if (pit != pend) { - // if (contains(x12c_puddleObjectIds, x12c_puddleObjectIds.end(), uid)) { + if (rstl::find(x12c_puddleObjectIds.begin(), x12c_puddleObjectIds.end(), uid) != + x12c_puddleObjectIds.end()) { rstl::vector< TUniqueId >::const_iterator it = x12c_puddleObjectIds.begin(); for (; it != x12c_puddleObjectIds.end(); ++it) { if (CEntity* ent = mgr.ObjectById(*it)) { diff --git a/src/MetroidPrime/ScriptObjects/CScriptPlatform.cpp b/src/MetroidPrime/ScriptObjects/CScriptPlatform.cpp index 652ff5a3..101fc844 100644 --- a/src/MetroidPrime/ScriptObjects/CScriptPlatform.cpp +++ b/src/MetroidPrime/ScriptObjects/CScriptPlatform.cpp @@ -2,11 +2,14 @@ #include "MetroidPrime/CActorParameters.hpp" #include "MetroidPrime/CAnimData.hpp" +#include "MetroidPrime/ScriptObjects/CScriptWaypoint.hpp" #include "Kyoto/Graphics/CGX.hpp" #include "WorldFormat/CCollidableOBBTreeGroup.hpp" +#include "rstl/algorithm.hpp" + #ifndef TARGET_PC struct GXData { u16 cpSRreg; @@ -110,3 +113,42 @@ rstl::optional_object< CAABox > CScriptPlatform::GetTouchBounds() const { return rstl::optional_object_null(); } } + +TUniqueId CScriptPlatform::GetWaypoint(CStateManager& mgr) { + rstl::vector< SConnection >::const_iterator conn = GetConnectionList().begin(); + for (; conn != GetConnectionList().end(); ++conn) { + if (conn->x4_msg == kSM_Follow) { + return mgr.GetIdForScript(conn->x8_objId); + } + } + return kInvalidUniqueId; +} + +TUniqueId CScriptPlatform::GetNext(TUniqueId uid, CStateManager& mgr) { + const CScriptWaypoint* nextWp = TCastToConstPtr< CScriptWaypoint >(mgr.GetObjectById(uid)); + if (!nextWp) { + return GetWaypoint(mgr); + } + TUniqueId next = nextWp->NextWaypoint(mgr); + if (const CScriptWaypoint* wp = TCastToConstPtr< CScriptWaypoint >(mgr.GetObjectById(next))) { + x25c_currentSpeed = wp->GetSpeed(); + } + return next; +} + +void CScriptPlatform::AddRider(rstl::vector< SRiders >& riders, TUniqueId riderId, + const CPhysicsActor* ridee, CStateManager& mgr) { + rstl::vector< SRiders >::iterator it = rstl::find(riders.begin(), riders.end(), SRiders(riderId)); + if (it == riders.end()) { + SRiders rider(riderId); + if (CPhysicsActor* act = TCastToPtr< CPhysicsActor >(mgr.ObjectById(riderId))) { + CVector3f rideePos = ridee->GetTranslation(); + rider.x8_transform.SetTranslation(ridee->GetTransform().TransposeRotate(act->GetTranslation() - rideePos)); + mgr.SendScriptMsg(act, ridee->GetUniqueId(), kSM_AddPlatformRider); + } + riders.reserve(riders.size() + 1); + riders.push_back(rider); + } else { + it->x4_decayTimer = 1.f / 6.f; + } +}