mirror of https://github.com/AxioDL/metaforce.git
CCameraShakeData: Make classes and structs constexpr where applicable
Same behavior, but allows eliminating file-scope initializers needing to be run on program start.
This commit is contained in:
parent
f1e28a1290
commit
d240e40a17
|
@ -27,22 +27,6 @@ CCameraShakerComponent CCameraShakerComponent::LoadNewCameraShakerComponent(CInp
|
||||||
return {useModulation != 0, am, fm};
|
return {useModulation != 0, am, fm};
|
||||||
}
|
}
|
||||||
|
|
||||||
CCameraShakeData::CCameraShakeData(float duration, float sfxDist, u32 flags, const zeus::CVector3f& sfxPos,
|
|
||||||
const CCameraShakerComponent& shaker1, const CCameraShakerComponent& shaker2,
|
|
||||||
const CCameraShakerComponent& shaker3)
|
|
||||||
: x0_duration(duration)
|
|
||||||
, x8_shakerX(shaker1)
|
|
||||||
, x44_shakerY(shaker2)
|
|
||||||
, x80_shakerZ(shaker3)
|
|
||||||
, xc0_flags(flags)
|
|
||||||
, xc4_sfxPos(sfxPos)
|
|
||||||
, xd0_sfxDist(sfxDist) {}
|
|
||||||
|
|
||||||
CCameraShakeData::CCameraShakeData(float duration, float magnitude)
|
|
||||||
: CCameraShakeData(duration, 100.f, 0, zeus::skZero3f, CCameraShakerComponent{}, CCameraShakerComponent{},
|
|
||||||
CCameraShakerComponent{1, SCameraShakePoint{0, 0.25f * duration, 0.f, 0.75f * duration, magnitude},
|
|
||||||
SCameraShakePoint{1, 0.f, 0.f, 0.5f * duration, 2.f}}) {}
|
|
||||||
|
|
||||||
CCameraShakeData::CCameraShakeData(CInputStream& in) {
|
CCameraShakeData::CCameraShakeData(CInputStream& in) {
|
||||||
in.readUint32Big();
|
in.readUint32Big();
|
||||||
in.readFloatBig();
|
in.readFloatBig();
|
||||||
|
@ -56,66 +40,6 @@ CCameraShakeData::CCameraShakeData(CInputStream& in) {
|
||||||
BuildProjectileCameraShake(0.5f, 0.75f);
|
BuildProjectileCameraShake(0.5f, 0.75f);
|
||||||
}
|
}
|
||||||
|
|
||||||
CCameraShakeData CCameraShakeData::BuildLandingCameraShakeData(float duration, float magnitude) {
|
|
||||||
return {duration,
|
|
||||||
100.f,
|
|
||||||
0,
|
|
||||||
zeus::skZero3f,
|
|
||||||
CCameraShakerComponent(1, SCameraShakePoint(0, 0.15f * duration, 0.f, 0.85f * duration, magnitude),
|
|
||||||
SCameraShakePoint(1, 0.f, 0.f, 0.4f * duration, 1.5f)),
|
|
||||||
CCameraShakerComponent(),
|
|
||||||
CCameraShakerComponent(1, SCameraShakePoint(0, 0.25f * duration, 0.f, 0.75f * duration, magnitude),
|
|
||||||
SCameraShakePoint(1, 0.f, 0.f, 0.5f * duration, 2.f))};
|
|
||||||
}
|
|
||||||
|
|
||||||
CCameraShakeData CCameraShakeData::BuildProjectileCameraShake(float duration, float magnitude) {
|
|
||||||
return {duration,
|
|
||||||
100.f,
|
|
||||||
0,
|
|
||||||
zeus::skZero3f,
|
|
||||||
CCameraShakerComponent(1, SCameraShakePoint(0, 0.f, 0.f, duration, magnitude),
|
|
||||||
SCameraShakePoint(1, 0.f, 0.f, 0.5f * duration, 3.f)),
|
|
||||||
CCameraShakerComponent(),
|
|
||||||
CCameraShakerComponent()};
|
|
||||||
}
|
|
||||||
|
|
||||||
CCameraShakeData CCameraShakeData::BuildMissileCameraShake(float duration, float magnitude, float sfxDistance,
|
|
||||||
const zeus::CVector3f& sfxPos) {
|
|
||||||
CCameraShakeData ret(duration, magnitude);
|
|
||||||
ret.SetSfxPositionAndDistance(sfxPos, sfxDistance);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
CCameraShakeData CCameraShakeData::BuildPhazonCameraShakeData(float duration, float magnitude) {
|
|
||||||
return {duration,
|
|
||||||
100.f,
|
|
||||||
0,
|
|
||||||
zeus::skZero3f,
|
|
||||||
CCameraShakerComponent(1, SCameraShakePoint(0, 0.15f * duration, 0.f, 0.25f * duration, magnitude),
|
|
||||||
SCameraShakePoint(1, 0.f, 0.f, 0.4f * duration, 0.3f)),
|
|
||||||
CCameraShakerComponent(),
|
|
||||||
CCameraShakerComponent(1, SCameraShakePoint(0, 0.25f * duration, 0.f, 0.25f * duration, magnitude),
|
|
||||||
SCameraShakePoint(1, 0.f, 0.f, 0.5f * duration, 0.5f))};
|
|
||||||
}
|
|
||||||
|
|
||||||
CCameraShakeData CCameraShakeData::BuildPatternedExplodeShakeData(float duration, float magnitude) {
|
|
||||||
return {duration,
|
|
||||||
100.f,
|
|
||||||
0,
|
|
||||||
zeus::skZero3f,
|
|
||||||
CCameraShakerComponent(1, SCameraShakePoint(0, 0.25f * duration, 0.f, 0.75f * duration, magnitude),
|
|
||||||
SCameraShakePoint(1, 0.f, 0.f, 0.5f * duration, 2.0f)),
|
|
||||||
CCameraShakerComponent(),
|
|
||||||
CCameraShakerComponent()};
|
|
||||||
}
|
|
||||||
|
|
||||||
CCameraShakeData CCameraShakeData::BuildPatternedExplodeShakeData(const zeus::CVector3f& pos, float duration,
|
|
||||||
float magnitude, float distance) {
|
|
||||||
CCameraShakeData shakeData = CCameraShakeData::BuildPatternedExplodeShakeData(duration, magnitude);
|
|
||||||
shakeData.SetSfxPositionAndDistance(pos, distance);
|
|
||||||
return shakeData;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SCameraShakePoint::Update(float curTime) {
|
void SCameraShakePoint::Update(float curTime) {
|
||||||
float offTimePoint = xc_attackTime + x10_sustainTime;
|
float offTimePoint = xc_attackTime + x10_sustainTime;
|
||||||
float factor = 1.f;
|
float factor = 1.f;
|
||||||
|
@ -198,13 +122,18 @@ CCameraShakeData CCameraShakeData::LoadCameraShakeData(CInputStream& in) {
|
||||||
return {duration, 100.f, 0, zeus::skZero3f, shakerX, shakerY, shakerZ};
|
return {duration, 100.f, 0, zeus::skZero3f, shakerX, shakerY, shakerZ};
|
||||||
}
|
}
|
||||||
|
|
||||||
const CCameraShakeData CCameraShakeData::skChargedShotCameraShakeData = {
|
const CCameraShakeData CCameraShakeData::skChargedShotCameraShakeData{
|
||||||
0.3f,
|
0.3f,
|
||||||
100.f,
|
100.f,
|
||||||
0,
|
0,
|
||||||
zeus::skZero3f,
|
zeus::skZero3f,
|
||||||
CCameraShakerComponent(),
|
CCameraShakerComponent{},
|
||||||
CCameraShakerComponent(1, {0, 0.f, 0.f, 0.3f, -1.f}, {1, 0.f, 0.f, 0.05f, 0.3f}),
|
CCameraShakerComponent{
|
||||||
CCameraShakerComponent()};
|
true,
|
||||||
|
{false, 0.f, 0.f, 0.3f, -1.f},
|
||||||
|
{true, 0.f, 0.f, 0.05f, 0.3f},
|
||||||
|
},
|
||||||
|
CCameraShakerComponent{},
|
||||||
|
};
|
||||||
|
|
||||||
} // namespace urde
|
} // namespace urde
|
||||||
|
|
|
@ -16,14 +16,15 @@ struct SCameraShakePoint {
|
||||||
float xc_attackTime = 0.f;
|
float xc_attackTime = 0.f;
|
||||||
float x10_sustainTime = 0.f;
|
float x10_sustainTime = 0.f;
|
||||||
float x14_duration = 0.f;
|
float x14_duration = 0.f;
|
||||||
SCameraShakePoint() = default;
|
constexpr SCameraShakePoint() noexcept = default;
|
||||||
SCameraShakePoint(bool useEnvelope, float attackTime, float sustainTime, float duration, float magnitude)
|
constexpr SCameraShakePoint(bool useEnvelope, float attackTime, float sustainTime, float duration,
|
||||||
|
float magnitude) noexcept
|
||||||
: x0_useEnvelope(useEnvelope)
|
: x0_useEnvelope(useEnvelope)
|
||||||
, x8_magnitude(magnitude)
|
, x8_magnitude(magnitude)
|
||||||
, xc_attackTime(attackTime)
|
, xc_attackTime(attackTime)
|
||||||
, x10_sustainTime(sustainTime)
|
, x10_sustainTime(sustainTime)
|
||||||
, x14_duration(duration) {}
|
, x14_duration(duration) {}
|
||||||
float GetValue() const { return x0_useEnvelope ? x8_magnitude : x4_value; }
|
[[nodiscard]] constexpr float GetValue() const noexcept { return x0_useEnvelope ? x8_magnitude : x4_value; }
|
||||||
static SCameraShakePoint LoadCameraShakePoint(CInputStream& in);
|
static SCameraShakePoint LoadCameraShakePoint(CInputStream& in);
|
||||||
void Update(float curTime);
|
void Update(float curTime);
|
||||||
};
|
};
|
||||||
|
@ -35,12 +36,13 @@ class CCameraShakerComponent {
|
||||||
float x38_value = 0.f;
|
float x38_value = 0.f;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CCameraShakerComponent() = default;
|
constexpr CCameraShakerComponent() noexcept = default;
|
||||||
CCameraShakerComponent(bool useModulation, const SCameraShakePoint& am, const SCameraShakePoint& fm)
|
constexpr CCameraShakerComponent(bool useModulation, const SCameraShakePoint& am,
|
||||||
|
const SCameraShakePoint& fm) noexcept
|
||||||
: x4_useModulation(useModulation), x8_am(am), x20_fm(fm) {}
|
: x4_useModulation(useModulation), x8_am(am), x20_fm(fm) {}
|
||||||
static CCameraShakerComponent LoadNewCameraShakerComponent(CInputStream& in);
|
static CCameraShakerComponent LoadNewCameraShakerComponent(CInputStream& in);
|
||||||
void Update(float curTime, float duration, float distAtt);
|
void Update(float curTime, float duration, float distAtt);
|
||||||
float GetValue() const { return x38_value; }
|
[[nodiscard]] constexpr float GetValue() const noexcept { return x38_value; }
|
||||||
};
|
};
|
||||||
|
|
||||||
class CCameraShakeData {
|
class CCameraShakeData {
|
||||||
|
@ -57,19 +59,112 @@ class CCameraShakeData {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static const CCameraShakeData skChargedShotCameraShakeData;
|
static const CCameraShakeData skChargedShotCameraShakeData;
|
||||||
CCameraShakeData(float duration, float sfxDist, u32 flags, const zeus::CVector3f& sfxPos,
|
|
||||||
const CCameraShakerComponent& shaker1, const CCameraShakerComponent& shaker2,
|
constexpr CCameraShakeData(float duration, float sfxDist, u32 flags, const zeus::CVector3f& sfxPos,
|
||||||
const CCameraShakerComponent& shaker3);
|
const CCameraShakerComponent& shaker1, const CCameraShakerComponent& shaker2,
|
||||||
CCameraShakeData(float duration, float magnitude);
|
const CCameraShakerComponent& shaker3) noexcept
|
||||||
|
: x0_duration(duration)
|
||||||
|
, x8_shakerX(shaker1)
|
||||||
|
, x44_shakerY(shaker2)
|
||||||
|
, x80_shakerZ(shaker3)
|
||||||
|
, xc0_flags(flags)
|
||||||
|
, xc4_sfxPos(sfxPos)
|
||||||
|
, xd0_sfxDist(sfxDist) {}
|
||||||
|
|
||||||
|
constexpr CCameraShakeData(float duration, float magnitude) noexcept
|
||||||
|
: CCameraShakeData(
|
||||||
|
duration, 100.f, 0, zeus::skZero3f, CCameraShakerComponent{}, CCameraShakerComponent{},
|
||||||
|
CCameraShakerComponent{true, SCameraShakePoint{false, 0.25f * duration, 0.f, 0.75f * duration, magnitude},
|
||||||
|
SCameraShakePoint{true, 0.f, 0.f, 0.5f * duration, 2.f}}) {}
|
||||||
|
|
||||||
explicit CCameraShakeData(CInputStream&);
|
explicit CCameraShakeData(CInputStream&);
|
||||||
static CCameraShakeData BuildLandingCameraShakeData(float duration, float magnitude);
|
|
||||||
static CCameraShakeData BuildProjectileCameraShake(float duration, float magnitude);
|
static constexpr CCameraShakeData BuildLandingCameraShakeData(float duration, float magnitude) noexcept {
|
||||||
static CCameraShakeData BuildMissileCameraShake(float duration, float magnitude, float sfxDistance,
|
return {
|
||||||
const zeus::CVector3f& sfxPos);
|
duration,
|
||||||
static CCameraShakeData BuildPhazonCameraShakeData(float duration, float magnitude);
|
100.f,
|
||||||
static CCameraShakeData BuildPatternedExplodeShakeData(float duration, float magnitude);
|
0,
|
||||||
static CCameraShakeData BuildPatternedExplodeShakeData(const zeus::CVector3f& pos, float duration, float magnitude,
|
zeus::skZero3f,
|
||||||
float distance);
|
CCameraShakerComponent{
|
||||||
|
true,
|
||||||
|
SCameraShakePoint(false, 0.15f * duration, 0.f, 0.85f * duration, magnitude),
|
||||||
|
SCameraShakePoint(true, 0.f, 0.f, 0.4f * duration, 1.5f),
|
||||||
|
},
|
||||||
|
CCameraShakerComponent{},
|
||||||
|
CCameraShakerComponent{
|
||||||
|
true,
|
||||||
|
SCameraShakePoint(false, 0.25f * duration, 0.f, 0.75f * duration, magnitude),
|
||||||
|
SCameraShakePoint(true, 0.f, 0.f, 0.5f * duration, 2.f),
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
static constexpr CCameraShakeData BuildProjectileCameraShake(float duration, float magnitude) noexcept {
|
||||||
|
return {
|
||||||
|
duration,
|
||||||
|
100.f,
|
||||||
|
0,
|
||||||
|
zeus::skZero3f,
|
||||||
|
CCameraShakerComponent{
|
||||||
|
true,
|
||||||
|
SCameraShakePoint(false, 0.f, 0.f, duration, magnitude),
|
||||||
|
SCameraShakePoint(true, 0.f, 0.f, 0.5f * duration, 3.f),
|
||||||
|
},
|
||||||
|
CCameraShakerComponent{},
|
||||||
|
CCameraShakerComponent{},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
static constexpr CCameraShakeData BuildMissileCameraShake(float duration, float magnitude, float sfxDistance,
|
||||||
|
const zeus::CVector3f& sfxPos) noexcept {
|
||||||
|
CCameraShakeData ret(duration, magnitude);
|
||||||
|
ret.SetSfxPositionAndDistance(sfxPos, sfxDistance);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static constexpr CCameraShakeData BuildPhazonCameraShakeData(float duration, float magnitude) noexcept {
|
||||||
|
return {
|
||||||
|
duration,
|
||||||
|
100.f,
|
||||||
|
0,
|
||||||
|
zeus::skZero3f,
|
||||||
|
CCameraShakerComponent{
|
||||||
|
true,
|
||||||
|
SCameraShakePoint(false, 0.15f * duration, 0.f, 0.25f * duration, magnitude),
|
||||||
|
SCameraShakePoint(true, 0.f, 0.f, 0.4f * duration, 0.3f),
|
||||||
|
},
|
||||||
|
CCameraShakerComponent{},
|
||||||
|
CCameraShakerComponent{
|
||||||
|
true,
|
||||||
|
SCameraShakePoint(false, 0.25f * duration, 0.f, 0.25f * duration, magnitude),
|
||||||
|
SCameraShakePoint(true, 0.f, 0.f, 0.5f * duration, 0.5f),
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
static constexpr CCameraShakeData BuildPatternedExplodeShakeData(float duration, float magnitude) noexcept {
|
||||||
|
return {
|
||||||
|
duration,
|
||||||
|
100.f,
|
||||||
|
0,
|
||||||
|
zeus::skZero3f,
|
||||||
|
CCameraShakerComponent{
|
||||||
|
true,
|
||||||
|
SCameraShakePoint(false, 0.25f * duration, 0.f, 0.75f * duration, magnitude),
|
||||||
|
SCameraShakePoint(true, 0.f, 0.f, 0.5f * duration, 2.0f),
|
||||||
|
},
|
||||||
|
CCameraShakerComponent{},
|
||||||
|
CCameraShakerComponent{},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
static constexpr CCameraShakeData BuildPatternedExplodeShakeData(const zeus::CVector3f& pos, float duration,
|
||||||
|
float magnitude, float distance) noexcept {
|
||||||
|
CCameraShakeData shakeData = BuildPatternedExplodeShakeData(duration, magnitude);
|
||||||
|
shakeData.SetSfxPositionAndDistance(pos, distance);
|
||||||
|
return shakeData;
|
||||||
|
}
|
||||||
|
|
||||||
void Update(float dt, CStateManager& mgr);
|
void Update(float dt, CStateManager& mgr);
|
||||||
zeus::CVector3f GetPoint() const;
|
zeus::CVector3f GetPoint() const;
|
||||||
float GetMaxAMComponent() const;
|
float GetMaxAMComponent() const;
|
||||||
|
@ -77,10 +172,10 @@ public:
|
||||||
void SetShakerId(u32 id) { xbc_shakerId = id; }
|
void SetShakerId(u32 id) { xbc_shakerId = id; }
|
||||||
u32 GetShakerId() const { return xbc_shakerId; }
|
u32 GetShakerId() const { return xbc_shakerId; }
|
||||||
static CCameraShakeData LoadCameraShakeData(CInputStream& in);
|
static CCameraShakeData LoadCameraShakeData(CInputStream& in);
|
||||||
void SetSfxPositionAndDistance(const zeus::CVector3f& pos, float f2) {
|
constexpr void SetSfxPositionAndDistance(const zeus::CVector3f& pos, float sfxDistance) noexcept {
|
||||||
xc0_flags |= 0x1;
|
xc0_flags |= 0x1;
|
||||||
xc4_sfxPos = pos;
|
xc4_sfxPos = pos;
|
||||||
xd0_sfxDist = f2;
|
xd0_sfxDist = sfxDistance;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
#include "Runtime/Weapon/CAuxWeapon.hpp"
|
#include "Runtime/Weapon/CAuxWeapon.hpp"
|
||||||
|
|
||||||
|
#include <array>
|
||||||
|
|
||||||
#include "Runtime/CSimplePool.hpp"
|
#include "Runtime/CSimplePool.hpp"
|
||||||
#include "Runtime/GameGlobalObjects.hpp"
|
#include "Runtime/GameGlobalObjects.hpp"
|
||||||
#include "Runtime/Weapon/CEnergyProjectile.hpp"
|
#include "Runtime/Weapon/CEnergyProjectile.hpp"
|
||||||
|
@ -7,9 +9,27 @@
|
||||||
#include "Runtime/Weapon/CWaveBuster.hpp"
|
#include "Runtime/Weapon/CWaveBuster.hpp"
|
||||||
|
|
||||||
namespace urde {
|
namespace urde {
|
||||||
|
constexpr CCameraShakeData skHardShake{
|
||||||
|
0.3f,
|
||||||
|
100.f,
|
||||||
|
0,
|
||||||
|
zeus::skZero3f,
|
||||||
|
{},
|
||||||
|
{
|
||||||
|
true,
|
||||||
|
{false, 0.f, 0.f, 0.3f, -2.f},
|
||||||
|
{true, 0.f, 0.f, 0.05f, 0.5f},
|
||||||
|
},
|
||||||
|
{},
|
||||||
|
};
|
||||||
|
|
||||||
static const CCameraShakeData skHardShake = {
|
constexpr std::array skComboNames{
|
||||||
0.3f, 100.f, 0, zeus::skZero3f, {}, {1, {0, 0.f, 0.f, 0.3f, -2.f}, {1, 0.f, 0.f, 0.05f, 0.5f}}, {}};
|
"SuperMissile", "IceCombo", "WaveBuster", "FlameThrower", "SuperMissile",
|
||||||
|
};
|
||||||
|
|
||||||
|
constexpr std::array<u16, 5> skSoundId{
|
||||||
|
1810, 1837, 1847, 1842, 1810,
|
||||||
|
};
|
||||||
|
|
||||||
CAuxWeapon::CAuxWeapon(TUniqueId playerId)
|
CAuxWeapon::CAuxWeapon(TUniqueId playerId)
|
||||||
: x0_missile(g_SimplePool->GetObj("Missile"))
|
: x0_missile(g_SimplePool->GetObj("Missile"))
|
||||||
|
@ -23,11 +43,10 @@ CAuxWeapon::CAuxWeapon(TUniqueId playerId)
|
||||||
InitComboData();
|
InitComboData();
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char* skComboNames[] = {"SuperMissile", "IceCombo", "WaveBuster", "FlameThrower", "SuperMissile"};
|
|
||||||
|
|
||||||
void CAuxWeapon::InitComboData() {
|
void CAuxWeapon::InitComboData() {
|
||||||
for (int i = 0; i < 5; ++i)
|
for (const auto comboName : skComboNames) {
|
||||||
x28_combos.push_back(g_SimplePool->GetObj(skComboNames[i]));
|
x28_combos.push_back(g_SimplePool->GetObj(comboName));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CAuxWeapon::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId sender, CStateManager& mgr) {
|
void CAuxWeapon::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId sender, CStateManager& mgr) {
|
||||||
|
@ -242,8 +261,6 @@ void CAuxWeapon::CreateWaveBusterBeam(EProjectileAttrib attribs, TUniqueId homin
|
||||||
x74_firingBeamId = CPlayerState::EBeamId::Wave;
|
x74_firingBeamId = CPlayerState::EBeamId::Wave;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const u16 skSoundId[] = {1810, 1837, 1847, 1842, 1810};
|
|
||||||
|
|
||||||
void CAuxWeapon::LaunchMissile(float dt, bool underwater, bool charged, CPlayerState::EBeamId currentBeam,
|
void CAuxWeapon::LaunchMissile(float dt, bool underwater, bool charged, CPlayerState::EBeamId currentBeam,
|
||||||
EProjectileAttrib attrib, const zeus::CTransform& xf, TUniqueId homingId,
|
EProjectileAttrib attrib, const zeus::CTransform& xf, TUniqueId homingId,
|
||||||
CStateManager& mgr) {
|
CStateManager& mgr) {
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
|
|
||||||
namespace urde {
|
namespace urde {
|
||||||
namespace {
|
namespace {
|
||||||
const CCameraShakeData CameraShaker{0.125f, 0.25f};
|
constexpr CCameraShakeData CameraShaker{0.125f, 0.25f};
|
||||||
constexpr std::array<u16, 2> kSoundId{SFXwpn_fire_plasma_normal, SFXwpn_fire_plasma_charged};
|
constexpr std::array<u16, 2> kSoundId{SFXwpn_fire_plasma_normal, SFXwpn_fire_plasma_charged};
|
||||||
} // Anonymous namespace
|
} // Anonymous namespace
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue