metaforce/Runtime/World/CDamageVulnerability.hpp

128 lines
3.3 KiB
C++

#ifndef __URDE_CDAMAGEVULNERABILITY_HPP__
#define __URDE_CDAMAGEVULNERABILITY_HPP__
#include "RetroTypes.hpp"
#include "Weapon/CWeaponMode.hpp"
namespace urde
{
enum class EVulnerability
{
DoubleDamage,
Normal,
Reflect,
Immune,
PassThrough,
DirectDouble,
Direct
};
class CDamageVulnerability
{
EVulnerability x0_power;
EVulnerability x4_ice;
EVulnerability x8_wave;
EVulnerability xc_plasma;
EVulnerability x10_bomb;
EVulnerability x14_powerbomb;
EVulnerability x18_missile;
EVulnerability x1c_boostBall;
EVulnerability x20_phazon;
EVulnerability x24_enemyWp1;
EVulnerability x28_enemyWp2Poison;
EVulnerability x2c_enemyWp3Lava;
EVulnerability x30_enemyWp4;
EVulnerability x34_unk1;
EVulnerability x38_unk2;
EVulnerability x3c_chargedPower;
EVulnerability x40_chargedIce;
EVulnerability x44_chargedWave;
EVulnerability x48_chargedPlasma;
EVulnerability x4c_superMissile;
EVulnerability x50_iceSpreader;
EVulnerability x54_wavebuster;
EVulnerability x58_flamethrower;
u32 x5c_;
u32 x60_;
u32 x64_;
void ConstructNew(CInputStream& in, int propCount)
{
EVulnerability* vulns = &x0_power;
for (int i=0 ; i<std::min(propCount - 3, 15) ; ++i)
vulns[i] = EVulnerability(in.readUint32Big());
if (propCount < 15)
{
for (int i=propCount ; i<15 ; ++i)
vulns[i] = EVulnerability::Reflect;
}
for (int i=15 ; i<propCount ; ++i)
in.readUint32Big();
x5c_ = in.readUint32Big();
EVulnerability* vulns2 = &x3c_chargedPower;
in.readUint32Big();
for (int i=0 ; i<4 ; ++i)
vulns2[i] = EVulnerability(in.readUint32Big());
x60_ = in.readUint32Big();
EVulnerability* vulns3 = &x4c_superMissile;
in.readUint32Big();
for (int i=0 ; i<4 ; ++i)
vulns3[i] = EVulnerability(in.readUint32Big());
x64_ = in.readUint32Big();
}
public:
CDamageVulnerability(CInputStream& in)
{
u32 propCount = in.readUint32Big();;
if (propCount == 11)
{
EVulnerability* vulns = &x0_power;
for (int i=0 ; i<15 ; ++i)
vulns[i] = EVulnerability(in.readUint32Big());
if (propCount == 15)
x5c_ = 0;
else
x5c_ = in.readUint32Big();
x3c_chargedPower = x0_power;
x4c_superMissile = x0_power;
x40_chargedIce = x4_ice;
x50_iceSpreader = x4_ice;
x44_chargedWave = x8_wave;
x54_wavebuster = x8_wave;
x48_chargedPlasma = xc_plasma;
x58_flamethrower = xc_plasma;
}
else
ConstructNew(in, propCount);
}
bool WeaponHurts(const CWeaponMode&, u32) const { return false; }
EVulnerability GetVulnerability(const CWeaponMode& mode, u32 w) const
{
if (int(mode.GetType()) < int(EWeaponType::None) || int(mode.GetType()) > int(EWeaponType::Unused2))
return EVulnerability::Reflect;
if (!mode.IsInstantKill())
return EVulnerability::Normal;
// TODO: Finish
return EVulnerability::Normal;
}
};
}
#endif // __URDE_CDAMAGEVULNERABILITY_HPP__