1#include "ObjectKuribo.hh"
3#include "game/field/CollisionDirector.hh"
10ObjectKuribo::ObjectKuribo(
const System::MapdataGeoObj ¶ms)
13 m_animStep =
static_cast<f32
>(m_mapObj->setting(2)) / 100.0f;
14 m_speedStep =
static_cast<f32
>(m_mapObj->setting(1)) / 100.0f;
18ObjectKuribo::~ObjectKuribo() =
default;
21void ObjectKuribo::init() {
23 m_origin = transform().base(2);
25 m_railInterpolator->init(0.0f, 0);
26 m_railInterpolator->setCurrVel(0.0f);
32 auto *anmMgr = m_drawMdl->anmMgr();
33 anmMgr->playAnim(0.0f, m_animStep, 0);
34 m_maxAnimTimer = anmMgr->activeAnim(Render::AnmType::Chr)->frameCount();
39void ObjectKuribo::calc() {
40 m_animTimer = ::fmodf(
static_cast<f32
>(m_frameCount) * m_animStep, m_maxAnimTimer);
48void ObjectKuribo::loadAnims() {
49 std::array<const char *, 2> names = {{
54 std::array<Render::AnmType, 2> types = {{
59 linkAnims(names, types);
62void ObjectKuribo::enterStateStub() {}
64void ObjectKuribo::calcStateStub() {}
69 if (m_railInterpolator->curPoint().setting[0] < m_currentFrame) {
75 setMatrixTangentTo(m_rot, m_origin);
85void ObjectKuribo::calcAnim() {
88 if (m_railInterpolator->isMovementDirectionForward()) {
89 shouldMove = m_animTimer > 15.0f && m_animTimer < 25.0f;
91 shouldMove = m_animTimer > 45.0f && m_animTimer < 55.0f;
95 m_currSpeed = std::min(10.0f, m_currSpeed + m_speedStep);
97 m_currSpeed = std::max(0.0f, m_currSpeed - m_speedStep);
100 m_railInterpolator->setCurrVel(m_currSpeed);
101 const auto &curPos = m_railInterpolator->curPos();
102 setPos(EGG::Vector3f(curPos.x, pos().y, curPos.z));
104 if (m_railInterpolator->calc() == RailInterpolator::Status::ChangingDirection) {
111 setMatrixTangentTo(m_rot, m_origin);
115void ObjectKuribo::calcRot() {
116 m_rot = Interpolate(0.1f, m_rot, m_floorNrm);
118 if (m_rot.squaredLength() > std::numeric_limits<f32>::epsilon()) {
121 m_rot = EGG::Vector3f::ey;
126void ObjectKuribo::checkSphereFull() {
127 constexpr f32 RADIUS = 50.0f;
130 if (m_currentStateId != 0) {
131 subPos(EGG::Vector3f(0.0f, 2.0f, 0.0f));
134 CollisionInfo colInfo;
135 EGG::Vector3f colPos = pos();
138 bool hasCol = CollisionDirector::Instance()->checkSphereFull(RADIUS, colPos, EGG::Vector3f::inf,
142 addPos(colInfo.tangentOff);
144 if (colInfo.floorDist > -std::numeric_limits<f32>::min()) {
145 m_floorNrm = colInfo.floorNrm;
#define KCL_TYPE_FLOOR
0x20E80FFF - Any KCL that the player or items can drive/land on.
void calcStateWalk()
Called when Goomba is walking along the rail.
void calcStateReroute()
Called when the Goomba is changing direction.
Base class that represents different "states" for an object.