2
0
mirror of https://github.com/AxioDL/metaforce.git synced 2025-12-15 02:46:10 +00:00

CElitePirate: Nearly complete implementation

This commit is contained in:
2020-03-29 03:28:14 -04:00
parent 4f7e0a85a3
commit 4ada5a00cb
5 changed files with 556 additions and 166 deletions

View File

@@ -22,8 +22,28 @@
namespace urde {
namespace MP1 {
struct SGrenadeLauncherData {
CHealthInfo x0_healthInfo;
struct SGrenadeTrajectoryInfo {
float x0_;
float x4_;
float x8_angleMin;
float xc_angleMax;
SGrenadeTrajectoryInfo(CInputStream& in)
: x0_(in.readFloatBig())
, x4_(in.readFloatBig())
, x8_angleMin(zeus::degToRad(in.readFloatBig()))
, xc_angleMax(zeus::degToRad(in.readFloatBig())) {}
};
struct SGrenadeUnknownStruct {
float x0_mass;
float x4_;
SGrenadeUnknownStruct(CInputStream& in) : x0_mass(in.readFloatBig()), x4_(in.readFloatBig()) {}
};
struct SBouncyGrenadeData {
SGrenadeUnknownStruct x0_;
CDamageInfo x8_damageInfo;
CAssetId x24_;
CAssetId x28_;
@@ -33,30 +53,22 @@ struct SGrenadeLauncherData {
u16 x38_;
u16 x3a_;
SGrenadeLauncherData(const CHealthInfo& healthInfo, const CDamageInfo& damageInfo, CAssetId w1, CAssetId w2,
CAssetId w3, CAssetId w4, CAssetId w5, u16 s1, u16 s2)
: x0_healthInfo(healthInfo)
, x8_damageInfo(damageInfo)
, x24_(w1)
, x28_(w2)
, x2c_(w3)
, x30_(w4)
, x34_(w5)
, x38_(s1)
, x3a_(s2){};
SBouncyGrenadeData(const SGrenadeUnknownStruct& unkStruct, const CDamageInfo& damageInfo, CAssetId w1, CAssetId w2,
CAssetId w3, CAssetId w4, CAssetId w5, u16 s1, u16 s2)
: x0_(unkStruct), x8_damageInfo(damageInfo), x24_(w1), x28_(w2), x2c_(w3), x30_(w4), x34_(w5), x38_(s1), x3a_(s2){};
};
class CGrenadeLauncherData {
public:
SGrenadeLauncherData x0_;
SBouncyGrenadeData x0_;
CAssetId x3c_;
CAssetId x40_;
u16 x44_sfx;
zeus::CQuaternion x48_quat;
SGrenadeTrajectoryInfo x48_trajectoryInfo;
CGrenadeLauncherData(const SGrenadeLauncherData& data, CAssetId w1, CAssetId w2, u16 sfx,
const zeus::CQuaternion& quat)
: x0_(data), x3c_(w1), x40_(w2), x44_sfx(sfx), x48_quat(quat){};
CGrenadeLauncherData(const SBouncyGrenadeData& data, CAssetId w1, CAssetId w2, u16 sfx,
const SGrenadeTrajectoryInfo& trajectoryInfo)
: x0_(data), x3c_(w1), x40_(w2), x44_sfx(sfx), x48_trajectoryInfo(trajectoryInfo){};
};
class CGrenadeLauncher : public CPhysicsActor {
@@ -92,16 +104,20 @@ public:
const CGrenadeLauncherData& data, float f1);
void Accept(IVisitor& visitor) override { visitor.Visit(this); }
void AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId uid, CStateManager& mgr) override;
void AddToRenderer(const zeus::CFrustum& frustum, const CStateManager& mgr) const override;
// void AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId uid, CStateManager& mgr) override;
// void AddToRenderer(const zeus::CFrustum& frustum, const CStateManager& mgr) const override;
const CCollisionPrimitive* GetCollisionPrimitive() const override { return &x328_cSphere; }
const CDamageVulnerability* GetDamageVulnerability() const override { return &x264_vulnerability; }
std::optional<zeus::CAABox> GetTouchBounds() const override;
CHealthInfo* HealthInfo(CStateManager& mgr) override;
void PreRender(CStateManager& mgr, const zeus::CFrustum& frustum) override;
void Render(const CStateManager& mgr) const override;
void Think(float dt, CStateManager& mgr) override;
void Touch(CActor& act, CStateManager& mgr) override;
// std::optional<zeus::CAABox> GetTouchBounds() const override;
// CHealthInfo* HealthInfo(CStateManager& mgr) override;
// void PreRender(CStateManager& mgr, const zeus::CFrustum& frustum) override;
// void Render(const CStateManager& mgr) const override;
// void Think(float dt, CStateManager& mgr) override;
// void Touch(CActor& act, CStateManager& mgr) override;
static zeus::CVector3f GrenadeTarget(const CStateManager& mgr);
static void CalculateGrenadeTrajectory(const zeus::CVector3f& target, const zeus::CVector3f& origin,
const SGrenadeTrajectoryInfo& info, float& angleOut, float& velocityOut);
protected:
void UpdateCollision();