diff options
Diffstat (limited to 'source/game/interfaces/StarSwingableItem.cpp')
-rw-r--r-- | source/game/interfaces/StarSwingableItem.cpp | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/source/game/interfaces/StarSwingableItem.cpp b/source/game/interfaces/StarSwingableItem.cpp new file mode 100644 index 0000000..3a113d8 --- /dev/null +++ b/source/game/interfaces/StarSwingableItem.cpp @@ -0,0 +1,53 @@ +#include "StarSwingableItem.hpp" + +namespace Star { + +SwingableItem::SwingableItem() { + m_swingAimFactor = 0; + m_swingStart = 0; + m_swingFinish = 0; +} + +SwingableItem::SwingableItem(Json const& params) : FireableItem(params) { + setParams(params); +} + +void SwingableItem::setParams(Json const& params) { + m_swingStart = params.getFloat("swingStart", 60) * Constants::pi / 180; + m_swingFinish = params.getFloat("swingFinish", -40) * Constants::pi / 180; + m_swingAimFactor = params.getFloat("swingAimFactor", 1); + m_coolingDownAngle = params.optFloat("coolingDownAngle").apply([](float angle) { return angle * Constants::pi / 180; }); + FireableItem::setParams(params); +} + +float SwingableItem::getAngleDir(float angle, Direction) { + return getAngle(angle); +} + +float SwingableItem::getAngle(float aimAngle) { + if (!ready()) { + if (coolingDown()) { + if (m_coolingDownAngle) + return *m_coolingDownAngle + aimAngle * m_swingAimFactor; + else + return -Constants::pi / 2; + } + + if (m_timeFiring < windupTime()) + return m_swingStart + (m_swingFinish - m_swingStart) * m_timeFiring / windupTime() + aimAngle * m_swingAimFactor; + + return m_swingFinish + (m_swingStart - m_swingFinish) * fireTimer() / (cooldownTime() + windupTime()) + aimAngle * m_swingAimFactor; + } + + return -Constants::pi / 2; +} + +float SwingableItem::getItemAngle(float aimAngle) { + return getAngle(aimAngle); +} + +String SwingableItem::getArmFrame() { + return "rotation"; +} + +} |