1#include "ObjectKuribo.hh"
3#include "game/field/CollisionDirector.hh"
11 : ObjectCollidable(params), StateManager(this, STATE_ENTRIES) {
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 = m_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() {}
68void ObjectKuribo::calcStateReroute() {
69 if (m_railInterpolator->curPoint().setting[0] < m_currentFrame) {
75 setMatrixTangentTo(m_rot, m_origin);
80void ObjectKuribo::calcStateWalk() {
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 m_flags.setBit(eFlags::Position);
102 const auto &curPos = m_railInterpolator->curPos();
106 if (m_railInterpolator->calc() == RailInterpolator::Status::ChangingDirection) {
113 setMatrixTangentTo(m_rot, m_origin);
117void ObjectKuribo::calcRot() {
118 m_rot = interpolate(0.1f, m_rot, m_floorNrm);
120 if (m_rot.squaredLength() > std::numeric_limits<f32>::epsilon()) {
123 m_rot = EGG::Vector3f::ey;
128void ObjectKuribo::checkSphereFull() {
129 constexpr f32 RADIUS = 50.0f;
132 if (m_currentStateId != 0) {
133 m_flags.setBit(eFlags::Position);
137 CollisionInfo colInfo;
141 bool hasCol = CollisionDirector::Instance()->checkSphereFull(RADIUS, pos, EGG::Vector3f::inf,
145 m_pos += colInfo.tangentOff;
146 m_flags.setBit(eFlags::Position);
148 if (colInfo.floorDist > -std::numeric_limits<f32>::min()) {
149 m_floorNrm = colInfo.floorNrm;
157 return v0 + (v1 - v0) * scale;
#define KCL_TYPE_FLOOR
0x20E80FFF - Any KCL that the player or items can drive/land on.