#ifndef _DNAMP1_CTWEAKPLAYERGUN_HPP_ #define _DNAMP1_CTWEAKPLAYERGUN_HPP_ #include "../../DNACommon/Tweaks/ITweakPlayerGun.hpp" namespace DataSpec::DNAMP1 { struct CTweakPlayerGun final : ITweakPlayerGun { DECL_YAML Value x4_upLookAngle; Value x8_downLookAngle; Value xc_verticalSpread; Value x10_horizontalSpread; Value x14_highVerticalSpread; Value x18_highHorizontalSpread; Value x1c_lowVerticalSpread; Value x20_lowHorizontalSpread; Value x24_aimVerticalSpeed; Value x28_aimHorizontalSpeed; Value x2c_bombFuseTime; Value x30_bombDropDelayTime; Value x34_holoHoldTime; Value x38_gunTransformTime; Value x3c_gunHolsterTime; Value x40_gunNotFiringTime; Value x44_fixedVerticalAim; Value x48_gunExtendDistance; Value x4c_gunPosition; Value x58_; Value x64_grapplingArmPosition; SShotParam x70_bomb; SShotParam x8c_powerBomb; SShotParam x1d4_missile; SWeaponInfo xa8_beams[5]; SComboShotParam x1f0_combos[5]; // Originally rstl::prereserved_vector Value x280_ricochetData[6]; // Originally rstl::prereserved_vector, extended to 6 to capture // PhazonBeam's value CTweakPlayerGun() = default; CTweakPlayerGun(athena::io::IStreamReader& r) { this->read(r); x44_fixedVerticalAim = zeus::degToRad(x44_fixedVerticalAim); } float GetUpLookAngle() const { return x4_upLookAngle; } float GetDownLookAngle() const { return x8_downLookAngle; } float GetVerticalSpread() const { return xc_verticalSpread; } float GetHorizontalSpread() const { return x10_horizontalSpread; } float GetHighVerticalSpread() const { return x14_highVerticalSpread; } float GetHighHorizontalSpread() const { return x18_highHorizontalSpread; } float GetLowVerticalSpread() const { return x1c_lowVerticalSpread; } float GetLowHorizontalSpread() const { return x20_lowHorizontalSpread; } float GetAimVerticalSpeed() const { return x24_aimVerticalSpeed; } float GetAimHorizontalSpeed() const { return x28_aimHorizontalSpeed; } float GetBombFuseTime() const { return x2c_bombFuseTime; } float GetBombDropDelayTime() const { return x30_bombDropDelayTime; } float GetHoloHoldTime() const { return x34_holoHoldTime; } float GetGunTransformTime() const { return x38_gunTransformTime; } float GetGunHolsterTime() const { return x3c_gunHolsterTime; } float GetGunNotFiringTime() const { return x40_gunNotFiringTime; } float GetFixedVerticalAim() const { return x44_fixedVerticalAim; } float GetGunExtendDistance() const { return x48_gunExtendDistance; } const zeus::CVector3f& GetGunPosition() const { return x4c_gunPosition; } const zeus::CVector3f& GetGrapplingArmPosition() const { return x64_grapplingArmPosition; } float GetRichochetDamage(atUint32 type) const { switch (type) { case 0: // Power return x280_ricochetData[0]; case 1: // Ice return x280_ricochetData[1]; case 2: // Wave return x280_ricochetData[2]; case 3: // Plasma return x280_ricochetData[3]; case 6: // Missile return x280_ricochetData[4]; case 8: // Phazon /* Note: In order to return the same value as retail we have to do a bit of a hack * Retro accidentally forgot to load in PhazonBeam's richochet value, as a result, it loads the * pointer to CTweakParticle's vtable. */ #if MP_v1088 return float(0x803D9CC4); #else return x280_ricochetData[5]; #endif default: return 1.f; } } const SWeaponInfo& GetBeamInfo(atInt32 beam) const { if (beam < 0 || beam > 5) return xa8_beams[0]; return xa8_beams[beam]; } const SComboShotParam& GetComboShotInfo(atInt32 beam) const { if (beam < 0 || beam > 5) return x1f0_combos[0]; return x1f0_combos[beam]; } const SShotParam& GetBombInfo() const { return x70_bomb; } const SShotParam& GetPowerBombInfo() const { return x8c_powerBomb; } const SShotParam& GetMissileInfo() const { return x1d4_missile; } }; } #endif // _DNAMP1_CTWEAKPLAYERGUN_HPP_