2
0
mirror of https://github.com/AxioDL/metaforce.git synced 2025-05-13 17:11:22 +00:00
metaforce/Runtime/Weapon/CFidget.cpp
Lioncash 221cc5c6b8 RuntimeCommonB: Normalize cpp file includes
Like the prior changes normalizing the inclusions within headers, this
tackles the cpp files of the RuntimeCommonB target, making these source
files consistent with their headers.
2019-12-22 18:12:04 -05:00

140 lines
4.0 KiB
C++

#include "Runtime/Weapon/CFidget.hpp"
#include "Runtime/CStateManager.hpp"
#include "Runtime/World/CPlayer.hpp"
namespace urde {
static float kMinorFidgetDelay = 20.f;
static float kMajorFidgetDelay = 20.f;
CFidget::EState CFidget::Update(int fireButtonStates, bool bobbing, bool inStrikeCooldown, float dt,
CStateManager& mgr) {
switch (x0_state) {
case EState::NoFidget:
break;
case EState::MinorFidget:
return x34_24_loading ? EState::Loading : EState::StillMinorFidget;
case EState::MajorFidget:
return x34_24_loading ? EState::Loading : EState::StillMajorFidget;
case EState::HolsterBeam:
return x34_24_loading ? EState::Loading : EState::StillHolsterBeam;
default:
x0_state = EState::NoFidget;
break;
}
if (fireButtonStates != 0) {
x14_timeSinceFire = 0.f;
x2c_holsterTimeSinceFire = 0.f;
} else {
if (x14_timeSinceFire < 6.f)
x14_timeSinceFire += dt;
if (x2c_holsterTimeSinceFire < x30_timeUntilHolster + 1.f)
x2c_holsterTimeSinceFire += dt;
}
if (inStrikeCooldown)
x18_timeSinceStrikeCooldown = 0.f;
else if (x18_timeSinceStrikeCooldown < 11.f)
x18_timeSinceStrikeCooldown += dt;
if (mgr.GetPlayer().GetMorphballTransitionState() == CPlayer::EPlayerMorphBallState::Unmorphed) {
if (x1c_timeSinceUnmorph < 21.f)
x1c_timeSinceUnmorph += dt;
} else {
x1c_timeSinceUnmorph = 0.f;
}
if (bobbing)
x20_timeSinceBobbing = 0.f;
else if (x20_timeSinceBobbing < 21.f)
x20_timeSinceBobbing += dt;
u32 pendingTriggerBits = 0;
if (x0_state == EState::NoFidget) {
if ((x10_delayTimerEnableBits & 0x1) != 0) {
x24_minorDelayTimer += dt;
if (x24_minorDelayTimer > kMinorFidgetDelay) {
pendingTriggerBits |= 0x1;
x24_minorDelayTimer = 0.f;
}
}
if ((x10_delayTimerEnableBits & 0x2) != 0) {
x28_majorDelayTimer += dt;
if (x28_majorDelayTimer > kMajorFidgetDelay) {
pendingTriggerBits |= 0x2;
x28_majorDelayTimer = 0.f;
}
}
}
if (x2c_holsterTimeSinceFire > x30_timeUntilHolster) {
x0_state = EState::HolsterBeam;
} else {
if (x18_timeSinceStrikeCooldown > 10.f && x1c_timeSinceUnmorph > 20.f && x20_timeSinceBobbing > 20.f) {
if ((pendingTriggerBits & 0x1) != 0)
x8_delayTriggerBits |= 0x1;
else if ((pendingTriggerBits & 0x2) != 0)
x8_delayTriggerBits |= 0x2;
}
if ((x8_delayTriggerBits & 0x3) == 0x3)
x0_state = (mgr.GetActiveRandom()->Next() % 100) >= 50 ? EState::MajorFidget : EState::MinorFidget;
else if ((x8_delayTriggerBits & 0x1) == 0x1)
x0_state = EState::MinorFidget;
else if ((x8_delayTriggerBits & 0x2) == 0x2)
x0_state = EState::MajorFidget;
else
x0_state = EState::NoFidget;
}
switch (x0_state) {
case EState::MinorFidget:
x34_24_loading = true;
x10_delayTimerEnableBits = 2;
x8_delayTriggerBits &= ~0x1;
kMinorFidgetDelay = mgr.GetActiveRandom()->Range(20.f, 29.f);
x4_type = SamusGun::EFidgetType::Minor;
xc_animSet = mgr.GetActiveRandom()->Range(0, 4);
break;
case EState::MajorFidget:
x34_24_loading = true;
x10_delayTimerEnableBits = 1;
x8_delayTriggerBits &= ~0x2;
kMajorFidgetDelay = mgr.GetActiveRandom()->Range(20.f, 30.f);
x4_type = SamusGun::EFidgetType::Major;
xc_animSet = mgr.GetActiveRandom()->Range(0, 5);
break;
case EState::HolsterBeam:
x4_type = SamusGun::EFidgetType::Minor;
x34_24_loading = true;
xc_animSet = 0;
break;
default:
break;
}
return x0_state;
}
void CFidget::ResetMinor() { x0_state = EState::NoFidget; }
void CFidget::ResetAll() {
x0_state = EState::NoFidget;
x4_type = SamusGun::EFidgetType::Invalid;
x18_timeSinceStrikeCooldown = 0.f;
x1c_timeSinceUnmorph = 0.f;
x14_timeSinceFire = 0.f;
x24_minorDelayTimer = 0.f;
x28_majorDelayTimer = 0.f;
x2c_holsterTimeSinceFire = 0.f;
x8_delayTriggerBits = 0;
xc_animSet = -1;
x10_delayTimerEnableBits = 3;
x34_24_loading = false;
}
} // namespace urde