Match and link CProjectileInfo

This commit is contained in:
Henrique Gemignani Passos Lima 2022-10-20 14:18:42 +03:00
parent a5685638b5
commit 928ade0175
No known key found for this signature in database
GPG Key ID: E224F951761145F8
13 changed files with 166 additions and 16 deletions

View File

@ -219,8 +219,8 @@ lbl_8013CCC4:
/* 8013CD48 00139CA8 38 21 01 30 */ addi r1, r1, 0x130
/* 8013CD4C 00139CAC 4E 80 00 20 */ blr
.global ProjectOrbitalIntersection__18CSteeringBehaviorsFRC9CVector3ffRC9CVector3fRC9CVector3fRC9CVector3fRC9CVector3fR9CVector3f
ProjectOrbitalIntersection__18CSteeringBehaviorsFRC9CVector3ffRC9CVector3fRC9CVector3fRC9CVector3fRC9CVector3fR9CVector3f:
.global ProjectOrbitalIntersection__18CSteeringBehaviorsFRC9CVector3fffRC9CVector3fRC9CVector3fRC9CVector3fRC9CVector3fR9CVector3f
ProjectOrbitalIntersection__18CSteeringBehaviorsFRC9CVector3fffRC9CVector3fRC9CVector3fRC9CVector3fRC9CVector3fR9CVector3f:
/* 8013CD50 00139CB0 94 21 FE 80 */ stwu r1, -0x180(r1)
/* 8013CD54 00139CB4 7C 08 02 A6 */ mflr r0
/* 8013CD58 00139CB8 90 01 01 84 */ stw r0, 0x184(r1)
@ -492,8 +492,8 @@ lbl_8013D0D8:
/* 8013D164 0013A0C4 38 21 01 80 */ addi r1, r1, 0x180
/* 8013D168 0013A0C8 4E 80 00 20 */ blr
.global ProjectOrbitalIntersection__18CSteeringBehaviorsFRC9CVector3ffRC9CVector3fRC9CVector3fRC9CVector3fR9CVector3f
ProjectOrbitalIntersection__18CSteeringBehaviorsFRC9CVector3ffRC9CVector3fRC9CVector3fRC9CVector3fR9CVector3f:
.global ProjectOrbitalIntersection__18CSteeringBehaviorsFRC9CVector3fffRC9CVector3fRC9CVector3fRC9CVector3fR9CVector3f
ProjectOrbitalIntersection__18CSteeringBehaviorsFRC9CVector3fffRC9CVector3fRC9CVector3fRC9CVector3fR9CVector3f:
/* 8013D16C 0013A0CC 94 21 FE 80 */ stwu r1, -0x180(r1)
/* 8013D170 0013A0D0 7C 08 02 A6 */ mflr r0
/* 8013D174 0013A0D4 90 01 01 84 */ stw r0, 0x184(r1)
@ -2567,4 +2567,3 @@ lbl_805AB840:
# ROM: 0x3F80E0
.4byte 0x3FC90FDB
.4byte 0

View File

@ -12399,7 +12399,7 @@ sub_801fec6c:
/* 801FECB4 001FBC14 90 7D 00 08 */ stw r3, 8(r29)
/* 801FECB8 001FBC18 7F C4 F3 78 */ mr r4, r30
/* 801FECBC 001FBC1C 38 7D 00 0C */ addi r3, r29, 0xc
/* 801FECC0 001FBC20 48 01 D3 51 */ bl sub_8021c010
/* 801FECC0 001FBC20 48 01 D3 51 */ bl __ct__15CProjectileInfoFR12CInputStream
/* 801FECC4 001FBC24 7F C3 F3 78 */ mr r3, r30
/* 801FECC8 001FBC28 48 13 FF BD */ bl ReadLong__12CInputStreamFv
/* 801FECCC 001FBC2C 54 63 04 3E */ clrlwi r3, r3, 0x10
@ -12407,7 +12407,7 @@ sub_801fec6c:
/* 801FECD4 001FBC34 B0 7D 00 34 */ sth r3, 0x34(r29)
/* 801FECD8 001FBC38 7F C4 F3 78 */ mr r4, r30
/* 801FECDC 001FBC3C 38 7D 00 38 */ addi r3, r29, 0x38
/* 801FECE0 001FBC40 48 01 D3 31 */ bl sub_8021c010
/* 801FECE0 001FBC40 48 01 D3 31 */ bl __ct__15CProjectileInfoFR12CInputStream
/* 801FECE4 001FBC44 88 01 00 0C */ lbz r0, 0xc(r1)
/* 801FECE8 001FBC48 38 A0 00 00 */ li r5, 0
/* 801FECEC 001FBC4C 50 A0 3E 30 */ rlwimi r0, r5, 7, 0x18, 0x18

View File

@ -12774,7 +12774,7 @@ __ct__Q212CSpacePirate16CSpacePirateDataFR12CInputStreamUi:
/* 8012B0D4 00128034 98 7D 00 1C */ stb r3, 0x1c(r29)
/* 8012B0D8 00128038 7F C4 F3 78 */ mr r4, r30
/* 8012B0DC 0012803C 38 7D 00 20 */ addi r3, r29, 0x20
/* 8012B0E0 00128040 48 0F 0F 31 */ bl sub_8021c010
/* 8012B0E0 00128040 48 0F 0F 31 */ bl __ct__15CProjectileInfoFR12CInputStream
/* 8012B0E4 00128044 7F C3 F3 78 */ mr r3, r30
/* 8012B0E8 00128048 48 21 3B 9D */ bl ReadLong__12CInputStreamFv
/* 8012B0EC 0012804C 54 63 04 3E */ clrlwi r3, r3, 0x10
@ -12788,7 +12788,7 @@ __ct__Q212CSpacePirate16CSpacePirateDataFR12CInputStreamUi:
/* 8012B10C 0012806C D0 3D 00 68 */ stfs f1, 0x68(r29)
/* 8012B110 00128070 7F C4 F3 78 */ mr r4, r30
/* 8012B114 00128074 38 7D 00 6C */ addi r3, r29, 0x6c
/* 8012B118 00128078 48 0F 0E F9 */ bl sub_8021c010
/* 8012B118 00128078 48 0F 0E F9 */ bl __ct__15CProjectileInfoFR12CInputStream
/* 8012B11C 0012807C 7F C3 F3 78 */ mr r3, r30
/* 8012B120 00128080 48 21 3B 09 */ bl ReadFloat__12CInputStreamFv
/* 8012B124 00128084 D0 3D 00 94 */ stfs f1, 0x94(r29)

View File

@ -63,7 +63,7 @@ PredictInterceptPos__15CProjectileInfoFRC9CVector3fRC9CVector3fRC7CPlayerbff:
/* 8021BD78 00218CD8 38 A1 00 44 */ addi r5, r1, 0x44
/* 8021BD7C 00218CDC 38 C1 00 38 */ addi r6, r1, 0x38
/* 8021BD80 00218CE0 39 01 00 50 */ addi r8, r1, 0x50
/* 8021BD84 00218CE4 4B F2 0F CD */ bl ProjectOrbitalIntersection__18CSteeringBehaviorsFRC9CVector3ffRC9CVector3fRC9CVector3fRC9CVector3fRC9CVector3fR9CVector3f
/* 8021BD84 00218CE4 4B F2 0F CD */ bl ProjectOrbitalIntersection__18CSteeringBehaviorsFRC9CVector3fffRC9CVector3fRC9CVector3fRC9CVector3fRC9CVector3fR9CVector3f
/* 8021BD88 00218CE8 48 00 00 E0 */ b lbl_8021BE68
lbl_8021BD8C:
/* 8021BD8C 00218CEC 38 61 00 44 */ addi r3, r1, 0x44
@ -102,7 +102,7 @@ lbl_8021BDE0:
/* 8021BE08 00218D68 D0 01 00 30 */ stfs f0, 0x30(r1)
/* 8021BE0C 00218D6C C0 08 00 08 */ lfs f0, 8(r8)
/* 8021BE10 00218D70 D0 01 00 34 */ stfs f0, 0x34(r1)
/* 8021BE14 00218D74 4B F2 13 59 */ bl ProjectOrbitalIntersection__18CSteeringBehaviorsFRC9CVector3ffRC9CVector3fRC9CVector3fRC9CVector3fR9CVector3f
/* 8021BE14 00218D74 4B F2 13 59 */ bl ProjectOrbitalIntersection__18CSteeringBehaviorsFRC9CVector3fffRC9CVector3fRC9CVector3fRC9CVector3fR9CVector3f
/* 8021BE18 00218D78 48 00 00 50 */ b lbl_8021BE68
lbl_8021BE1C:
/* 8021BE1C 00218D7C 57 A0 06 3F */ clrlwi. r0, r29, 0x18
@ -241,8 +241,8 @@ lbl_8021BFE8:
/* 8021C008 00218F68 38 21 00 30 */ addi r1, r1, 0x30
/* 8021C00C 00218F6C 4E 80 00 20 */ blr
.global sub_8021c010
sub_8021c010:
.global __ct__15CProjectileInfoFR12CInputStream
__ct__15CProjectileInfoFR12CInputStream:
/* 8021C010 00218F70 94 21 FF E0 */ stwu r1, -0x20(r1)
/* 8021C014 00218F74 7C 08 02 A6 */ mflr r0
/* 8021C018 00218F78 90 01 00 24 */ stw r0, 0x24(r1)
@ -349,4 +349,3 @@ lbl_805AD108:
# ROM: 0x3F99A8
.4byte 0x472FC800
.4byte 0

View File

@ -318,7 +318,7 @@ LIBS = [
"MetroidPrime/CEnvFxManager",
"MetroidPrime/Weapons/CEnergyProjectile",
"MetroidPrime/ScriptObjects/CScriptGunTurret",
"MetroidPrime/Weapons/CProjectileInfo",
["MetroidPrime/Weapons/CProjectileInfo", True],
"MetroidPrime/CInGameTweakManager",
"MetroidPrime/Enemies/CBabygoth",
"MetroidPrime/Enemies/CEyeBall",

View File

@ -19,6 +19,7 @@ public:
T* GetT() { return reinterpret_cast< T* >(CToken::GetObj()->GetContents()); }
T* operator*() { return GetT(); }
T* operator->() { return GetT(); }
static inline rstl::auto_ptr< TObjOwnerDerivedFromIObj< T > >
GetIObjObjectFor(const rstl::auto_ptr< T >& obj) {

View File

@ -0,0 +1,20 @@
#ifndef _CSTEERINGBEHAVIORS
#define _CSTEERINGBEHAVIORS
class CVector3f;
class CSteeringBehaviors {
public:
static bool ProjectLinearIntersection(const CVector3f& v0, float f1, const CVector3f& v1,
const CVector3f& v2, CVector3f& v3);
static bool ProjectLinearIntersection(const CVector3f& v0, float f1, const CVector3f& v1,
const CVector3f& v2, const CVector3f& v3, CVector3f& v4);
static bool ProjectOrbitalIntersection(const CVector3f& v0, float f1, float f2,
const CVector3f& v1, const CVector3f& v2,
const CVector3f& v3, CVector3f& v4);
static bool ProjectOrbitalIntersection(const CVector3f& v0, float f1, float f2,
const CVector3f& v1, const CVector3f& v2,
const CVector3f& v3, const CVector3f& v4, CVector3f& v5);
};
#endif // _CSTEERINGBEHAVIORS

View File

@ -175,6 +175,7 @@ public:
}
TUniqueId GetOrbitTargetId() const { return x310_orbitTargetId; }
const CVector3f& GetOrbitPoint() const { return x314_orbitPoint; }
TUniqueId GetOrbitNextTargetId() const { return x33c_orbitNextTargetId; }
TUniqueId GetScanningObjectId() const { return x3b4_scanningObject; }
EGrappleState GetGrappleState() const { return x3b8_grappleState; }
@ -187,6 +188,10 @@ public:
void Teleport(const CTransform4f& xf, CStateManager& mgr, bool resetBallCam);
void SetSpawnedMorphBallState(EPlayerMorphBallState state, CStateManager& mgr);
CVector3f GetDampedClampedVelocityWR() const;
float GetAverageSpeed() const;
float GetGravity() const;
private:
struct CVisorSteam {
float x0_curTargetAlpha;

View File

@ -0,0 +1,25 @@
#ifndef _CPROJECTILEINFO
#define _CPROJECTILEINFO
#include "MetroidPrime/CDamageInfo.hpp"
#include "Kyoto/TToken.hpp"
#include "Kyoto/Math/CVector3f.hpp"
class CPlayer;
class CWeaponDescription;
class CProjectileInfo {
TCachedToken<CWeaponDescription> x0_weaponDescription;
CDamageInfo xc_damageInfo;
public:
CProjectileInfo(CAssetId, const CDamageInfo&);
explicit CProjectileInfo(CInputStream&);
float GetProjectileSpeed() const;
CVector3f PredictInterceptPos(const CVector3f& gunPos, const CVector3f& aimPos, const CPlayer& player, bool gravity, float dt);
static CVector3f PredictInterceptPos(const CVector3f& gunPos, const CVector3f& aimPos, const CPlayer& player, bool gravity, float speed, float dt);
};
#endif // _CPROJECTILEINFO

View File

@ -27,6 +27,8 @@ public:
virtual void Render();
virtual CVector3f GetTranslation() const;
virtual CTransform4f GetTransform() const;
static float GetTickPeriod(); // { return 0.0166667f; }
private:
TLockedToken< CWeaponDescription > x4_weaponDesc;

View File

@ -0,0 +1,23 @@
#ifndef _CWEAPONDESCRIPTION
#define _CWEAPONDESCRIPTION
#include "Kyoto/Particles/CVectorElement.hpp"
#include "Kyoto/Particles/CModVectorElement.hpp"
#include "rstl/single_ptr.hpp"
class CWeaponDescription {
public:
rstl::single_ptr<CVectorElement> x0_IORN;
rstl::single_ptr<CVectorElement> x4_IVEC;
rstl::single_ptr<CVectorElement> x8_PSOV;
rstl::single_ptr<CModVectorElement> xc_PSVM;
bool x10_VMD2;
rstl::single_ptr<CIntElement> x14_PSLT;
rstl::single_ptr<CVectorElement> x18_PSCL;
rstl::single_ptr<CColorElement> x1c_PCOL;
rstl::single_ptr<CVectorElement> x20_POFS;
rstl::single_ptr<CVectorElement> x24_OFST;
};
#endif // _CWEAPONDESCRIPTION

View File

@ -285,7 +285,7 @@ METROIDPRIME :=\
$(BUILD_DIR)/asm/MetroidPrime/CEnvFxManager.o\
$(BUILD_DIR)/asm/MetroidPrime/Weapons/CEnergyProjectile.o\
$(BUILD_DIR)/asm/MetroidPrime/ScriptObjects/CScriptGunTurret.o\
$(BUILD_DIR)/asm/MetroidPrime/Weapons/CProjectileInfo.o\
$(BUILD_DIR)/src/MetroidPrime/Weapons/CProjectileInfo.o\
$(BUILD_DIR)/asm/MetroidPrime/CInGameTweakManager.o\
$(BUILD_DIR)/asm/MetroidPrime/Enemies/CBabygoth.o\
$(BUILD_DIR)/asm/MetroidPrime/Enemies/CEyeBall.o\

View File

@ -0,0 +1,76 @@
#include "MetroidPrime/Weapons/CProjectileInfo.hpp"
#include "MetroidPrime/CSteeringBehaviors.hpp"
#include "MetroidPrime/Player/CPlayer.hpp"
#include "MetroidPrime/Weapons/CProjectileWeapon.hpp"
#include "Weapons/CWeaponDescription.hpp"
#include "Kyoto/Streams/CInputStream.hpp"
CProjectileInfo::CProjectileInfo(CAssetId proj, const CDamageInfo& dInfo)
: x0_weaponDescription(gpSimplePool->GetObj(SObjectTag('WPSC', proj))), xc_damageInfo(dInfo) {}
CProjectileInfo::CProjectileInfo(CInputStream& in )
: x0_weaponDescription(gpSimplePool->GetObj(SObjectTag('WPSC', CAssetId(in.ReadLong())))), xc_damageInfo(in) {}
float CProjectileInfo::GetProjectileSpeed() const {
float result = 45000.0f;
TToken< CWeaponDescription > token(x0_weaponDescription);
if (!token->x4_IVEC.null()) {
CVector3f vec = CVector3f::Zero();
token->x4_IVEC->GetValue(0, vec);
result = vec.Magnitude() / CProjectileWeapon::GetTickPeriod();
}
return result;
}
CVector3f CProjectileInfo::PredictInterceptPos(const CVector3f& gunPos, const CVector3f& aimPos,
const CPlayer& player, bool gravity, float dt) {
return PredictInterceptPos(gunPos, aimPos, player, gravity, GetProjectileSpeed(), dt);
}
CVector3f CProjectileInfo::PredictInterceptPos(const CVector3f& gunPos, const CVector3f& aimPos,
const CPlayer& player, bool gravity, float speed,
float dt) {
CVector3f ret = CVector3f::Zero();
const CVector3f playerVel = player.GetDampedClampedVelocityWR();
const CVector3f gravVec(0.f, 0.f, player.GetGravity());
bool result = false;
switch (player.GetOrbitState()) {
case CPlayer::kOS_OrbitObject:
case CPlayer::kOS_OrbitPoint:
case CPlayer::kOS_OrbitCarcass:
case CPlayer::kOS_ForcedOrbitObject:
case CPlayer::kOS_Grapple: {
const CVector3f& orbitPoint = player.GetOrbitPoint();
if (gravity && player.GetPlayerMovementState() == NPlayer::kMS_ApplyJump) {
result = CSteeringBehaviors::ProjectOrbitalIntersection(gunPos, speed, dt, aimPos, playerVel,
gravVec, orbitPoint, ret);
break;
}
CVector3f vel = playerVel.CanBeNormalized()
? (player.GetAverageSpeed() * playerVel.AsNormalized())
: playerVel;
result = CSteeringBehaviors::ProjectOrbitalIntersection(gunPos, speed, dt, aimPos, vel,
orbitPoint, ret);
break;
}
case CPlayer::kOS_NoOrbit:
if (gravity && player.GetPlayerMovementState() == NPlayer::kMS_ApplyJump) {
result = CSteeringBehaviors::ProjectLinearIntersection(gunPos, speed, aimPos, playerVel,
gravVec, ret);
} else {
result = CSteeringBehaviors::ProjectLinearIntersection(gunPos, speed, aimPos, playerVel, ret);
}
break;
}
if (!result) {
ret = aimPos + playerVel * 1.5f;
}
return ret;
}