1#include "ObjectHeyhoBall.hh"
3#include "game/field/ObjectDirector.hh"
9 : ObjectProjectile(params), StateManager(this, STATE_ENTRIES),
10 m_airtime(static_cast<f32>(params.setting(1))), m_initPos(params.pos()) {
11 registerManagedObject();
15ObjectHeyhoBall::~ObjectHeyhoBall() =
default;
18void ObjectHeyhoBall::init() {
22 m_intensity = ExplosionIntensity::ExplosionLoseItem;
24 resize(BLAST_RADIUS, 0.0f);
26 const auto &flowTable = ObjectDirector::Instance()->flowTable();
27 m_blastRadiusRatio = BLAST_RADIUS /
28 static_cast<f32
>(parse<s16>(flowTable.set(flowTable.slot(
id()))->params.sphere.radius));
32void ObjectHeyhoBall::calc() {
35 m_flags.setBit(eFlags::Position);
41 Kart::Reaction , Kart::Reaction ,
43 if (m_currentStateId == 3) {
44 if (m_intensity == ExplosionIntensity::ExplosionLoseItem) {
45 return Kart::Reaction::ExplosionLoseItem;
49 return Kart::Reaction::SpinSomeSpeed;
52 return Kart::Reaction::WallAllSpeed;
58 m_xzDir = (m_initPos + EGG::Vector3f::ey * -BALL_RADIUS) - m_shipPos;
63 m_xzSpeed = EGG::Mathf::sqrt(xzDist.dot()) / m_airtime;
64 m_yDist = m_initPos.y + -BALL_RADIUS - m_shipPos.y;
65 m_initYSpeed = m_yDist / m_airtime + 0.5f * 4.0f * m_airtime;
69void ObjectHeyhoBall::enterFalling() {
72 resize(BLAST_RADIUS, 0.0f);
77void ObjectHeyhoBall::calcFalling() {
78 f32 currentHeight = m_workingPos.y + (m_initYSpeed - 4.0f *
static_cast<f32
>(m_currentFrame));
79 if (currentHeight > m_initPos.y + -BALL_RADIUS) {
80 m_workingPos.y = currentHeight;
81 m_workingPos.x += m_xzDir.x * m_xzSpeed;
82 m_workingPos.z += m_xzDir.z * m_xzSpeed;
85 m_workingPos = (m_workingPos + m_initPos + EGG::Vector3f::ey * -BALL_RADIUS) * 0.5f;
90void ObjectHeyhoBall::calcExploding() {
91 constexpr u32 EXPLODE_FRAMES = 46;
95 constexpr u32 SPIN_FRAME = 32;
97 if (m_currentFrame >= EXPLODE_FRAMES) {
98 m_flags.setBit(eFlags::Scale);
102 unregisterCollision();
106 m_intensity = ExplosionIntensity::ExplosionLoseItem;
108 f32 shrinkFrames =
static_cast<f32
>(m_currentFrame) - 40.0f;
109 f32 scale = 1.2f * m_blastRadiusRatio + -m_scaleChangeRate * shrinkFrames * shrinkFrames;
111 scale = std::min(m_blastRadiusRatio, scale);
112 m_flags.setBit(eFlags::Scale);
115 m_intensity = m_currentFrame >= SPIN_FRAME ? ExplosionIntensity::SpinSomeSpeed :
116 ExplosionIntensity::ExplosionLoseItem;
The highest level abstraction for a kart.