mirror of https://github.com/AxioDL/metaforce.git
CMetroid: Implement GetDamageVulnerability
This commit is contained in:
parent
ca659bdcbc
commit
ac30616efb
|
@ -8,10 +8,46 @@
|
||||||
#include "Runtime/World/ScriptLoader.hpp"
|
#include "Runtime/World/ScriptLoader.hpp"
|
||||||
|
|
||||||
namespace urde::MP1 {
|
namespace urde::MP1 {
|
||||||
|
namespace {
|
||||||
|
constexpr CDamageVulnerability CDamageVulnerability_80571c64{
|
||||||
|
EVulnerability::Deflect, EVulnerability::Deflect, EVulnerability::Deflect, EVulnerability::Immune,
|
||||||
|
EVulnerability::Deflect, EVulnerability::Normal, EVulnerability::Deflect, EVulnerability::Deflect,
|
||||||
|
EVulnerability::Normal, EVulnerability::Deflect, EVulnerability::Deflect, EVulnerability::Deflect,
|
||||||
|
EVulnerability::Deflect, EVulnerability::Deflect, EVulnerability::Deflect, EDeflectType::None,
|
||||||
|
};
|
||||||
|
|
||||||
|
constexpr CDamageVulnerability CDamageVulnerability_80571e6c{
|
||||||
|
EVulnerability::Deflect, EVulnerability::Immune, EVulnerability::Deflect, EVulnerability::Deflect,
|
||||||
|
EVulnerability::Deflect, EVulnerability::Normal, EVulnerability::Deflect, EVulnerability::Deflect,
|
||||||
|
EVulnerability::Normal, EVulnerability::Deflect, EVulnerability::Deflect, EVulnerability::Deflect,
|
||||||
|
EVulnerability::Deflect, EVulnerability::Deflect, EVulnerability::Deflect, EDeflectType::None,
|
||||||
|
};
|
||||||
|
|
||||||
|
constexpr CDamageVulnerability CDamageVulnerability_80571ed4{
|
||||||
|
EVulnerability::Deflect, EVulnerability::Deflect, EVulnerability::Immune, EVulnerability::Deflect,
|
||||||
|
EVulnerability::Deflect, EVulnerability::Normal, EVulnerability::Deflect, EVulnerability::Deflect,
|
||||||
|
EVulnerability::Normal, EVulnerability::Deflect, EVulnerability::Deflect, EVulnerability::Deflect,
|
||||||
|
EVulnerability::Deflect, EVulnerability::Deflect, EVulnerability::Deflect, EDeflectType::None,
|
||||||
|
};
|
||||||
|
|
||||||
|
constexpr CDamageVulnerability CDamageVulnerability_80571f3c{
|
||||||
|
EVulnerability::Immune, EVulnerability::Deflect, EVulnerability::Deflect, EVulnerability::Deflect,
|
||||||
|
EVulnerability::Deflect, EVulnerability::Normal, EVulnerability::Deflect, EVulnerability::Deflect,
|
||||||
|
EVulnerability::Normal, EVulnerability::Deflect, EVulnerability::Deflect, EVulnerability::Deflect,
|
||||||
|
EVulnerability::Deflect, EVulnerability::Deflect, EVulnerability::Deflect, EDeflectType::None,
|
||||||
|
};
|
||||||
|
|
||||||
|
constexpr CDamageVulnerability CDamageVulnerability_80571fa4{
|
||||||
|
EVulnerability::Deflect, EVulnerability::Deflect, EVulnerability::Deflect, EVulnerability::Deflect,
|
||||||
|
EVulnerability::Deflect, EVulnerability::Normal, EVulnerability::Deflect, EVulnerability::Deflect,
|
||||||
|
EVulnerability::Deflect, EVulnerability::Deflect, EVulnerability::Deflect, EVulnerability::Deflect,
|
||||||
|
EVulnerability::Deflect, EVulnerability::Deflect, EVulnerability::Deflect, EDeflectType::None,
|
||||||
|
};
|
||||||
|
} // namespace
|
||||||
|
|
||||||
CMetroidData::CMetroidData(CInputStream& in)
|
CMetroidData::CMetroidData(CInputStream& in)
|
||||||
: x0_dVuln1(in)
|
: x0_frozenVulnerability(in)
|
||||||
, x68_dVuln2(in)
|
, x68_energyDrainVulnerability(in)
|
||||||
, xd0_(in.readFloatBig())
|
, xd0_(in.readFloatBig())
|
||||||
, xd4_(in.readFloatBig())
|
, xd4_(in.readFloatBig())
|
||||||
, xd8_(in.readFloatBig())
|
, xd8_(in.readFloatBig())
|
||||||
|
@ -120,4 +156,34 @@ EWeaponCollisionResponseTypes CMetroid::GetCollisionResponseType(const zeus::CVe
|
||||||
return types;
|
return types;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const CDamageVulnerability* CMetroid::GetDamageVulnerability() const {
|
||||||
|
if (IsSuckingEnergy()) {
|
||||||
|
if (x9c0_24_) {
|
||||||
|
return &x56c_data.GetEnergyDrainVulnerability();
|
||||||
|
}
|
||||||
|
return &CDamageVulnerability_80571fa4;
|
||||||
|
}
|
||||||
|
if (x9bf_25_ && !x450_bodyController->IsFrozen()) {
|
||||||
|
return &x56c_data.GetEnergyDrainVulnerability();
|
||||||
|
}
|
||||||
|
if (x450_bodyController->GetPercentageFrozen() > 0.f) {
|
||||||
|
return &x56c_data.GetFrozenVulnerability();
|
||||||
|
}
|
||||||
|
if (x3fc_flavor == CPatterned::EFlavorType::Two) {
|
||||||
|
if (x7cc_animParmsidx == 1) {
|
||||||
|
return &CDamageVulnerability_80571c64;
|
||||||
|
}
|
||||||
|
if (x7cc_animParmsidx == 2) {
|
||||||
|
return &CDamageVulnerability_80571e6c;
|
||||||
|
}
|
||||||
|
if (x7cc_animParmsidx == 3) {
|
||||||
|
return &CDamageVulnerability_80571ed4;
|
||||||
|
}
|
||||||
|
if (x7cc_animParmsidx == 4) {
|
||||||
|
return &CDamageVulnerability_80571f3c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return CAi::GetDamageVulnerability();
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace urde::MP1
|
} // namespace urde::MP1
|
||||||
|
|
|
@ -16,8 +16,8 @@ namespace urde::MP1 {
|
||||||
class CMetroidData {
|
class CMetroidData {
|
||||||
private:
|
private:
|
||||||
static constexpr u32 skNumProperties = 20;
|
static constexpr u32 skNumProperties = 20;
|
||||||
CDamageVulnerability x0_dVuln1;
|
CDamageVulnerability x0_frozenVulnerability;
|
||||||
CDamageVulnerability x68_dVuln2;
|
CDamageVulnerability x68_energyDrainVulnerability;
|
||||||
float xd0_;
|
float xd0_;
|
||||||
float xd4_;
|
float xd4_;
|
||||||
float xd8_;
|
float xd8_;
|
||||||
|
@ -33,6 +33,8 @@ private:
|
||||||
public:
|
public:
|
||||||
explicit CMetroidData(CInputStream& in);
|
explicit CMetroidData(CInputStream& in);
|
||||||
static u32 GetNumProperties() { return skNumProperties; }
|
static u32 GetNumProperties() { return skNumProperties; }
|
||||||
|
const CDamageVulnerability& GetFrozenVulnerability() const { return x0_frozenVulnerability; }
|
||||||
|
const CDamageVulnerability& GetEnergyDrainVulnerability() const { return x68_energyDrainVulnerability; }
|
||||||
bool GetStartsInWall() { return x128_24_startsInWall; }
|
bool GetStartsInWall() { return x128_24_startsInWall; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -187,7 +189,7 @@ private:
|
||||||
float GetDamageMultiplier() { return 0.5f * (GetGrowthStage() - 1.f) + 1.f; }
|
float GetDamageMultiplier() { return 0.5f * (GetGrowthStage() - 1.f) + 1.f; }
|
||||||
float GetGrowthStage();
|
float GetGrowthStage();
|
||||||
zeus::CVector3f GetAttackTargetPos(CStateManager& mgr);
|
zeus::CVector3f GetAttackTargetPos(CStateManager& mgr);
|
||||||
bool IsSuckingEnergy();
|
bool IsSuckingEnergy() const;
|
||||||
void UpdateVolume();
|
void UpdateVolume();
|
||||||
void UpdateTouchBounds();
|
void UpdateTouchBounds();
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue