1#include "ObjectKuribo.hh"
3#include "game/field/CollisionDirector.hh"
11 : ObjectCollidable(params), StateManager(this) {
12 m_animStep =
static_cast<f32
>(m_mapObj->setting(2)) / 100.0f;
13 m_speedStep =
static_cast<f32
>(m_mapObj->setting(1)) / 100.0f;
17ObjectKuribo::~ObjectKuribo() =
default;
20void ObjectKuribo::init() {
22 m_origin = m_transform.base(2);
24 m_railInterpolator->init(0.0f, 0);
25 m_railInterpolator->setCurrVel(0.0f);
31 auto *anmMgr = m_drawMdl->anmMgr();
32 anmMgr->playAnim(0.0f, m_animStep, 0);
33 m_maxAnimTimer = anmMgr->activeAnim(Render::AnmType::Chr)->frameCount();
38void ObjectKuribo::calc() {
39 m_animTimer = ::fmodf(
static_cast<f32
>(m_frameCount) * m_animStep, m_maxAnimTimer);
47void ObjectKuribo::loadAnims() {
48 std::array<const char *, 2> names = {{
53 std::array<Render::AnmType, 2> types = {{
58 linkAnims(names, types);
61void ObjectKuribo::enterStateStub() {}
63void ObjectKuribo::calcStateStub() {}
67void ObjectKuribo::calcStateReroute() {
68 if (m_railInterpolator->curPoint().setting[0] < m_currentFrame) {
74 setMatrixTangentTo(m_rot, m_origin);
79void ObjectKuribo::calcStateWalk() {
84void ObjectKuribo::calcAnim() {
87 if (m_railInterpolator->isMovementDirectionForward()) {
88 shouldMove = m_animTimer > 15.0f && m_animTimer < 25.0f;
90 shouldMove = m_animTimer > 45.0f && m_animTimer < 55.0f;
94 m_currSpeed = std::min(10.0f, m_currSpeed + m_speedStep);
96 m_currSpeed = std::max(0.0f, m_currSpeed - m_speedStep);
99 m_railInterpolator->setCurrVel(m_currSpeed);
100 m_flags.setBit(eFlags::Position);
101 const auto &curPos = m_railInterpolator->curPos();
105 if (m_railInterpolator->calc() == RailInterpolator::Status::ChangingDirection) {
112 setMatrixTangentTo(m_rot, m_origin);
116void ObjectKuribo::calcRot() {
117 m_rot = interpolate(0.1f, m_rot, m_floorNrm);
119 if (m_rot.squaredLength() > std::numeric_limits<f32>::epsilon()) {
122 m_rot = EGG::Vector3f::ey;
127void ObjectKuribo::checkSphereFull() {
128 constexpr f32 RADIUS = 50.0f;
131 if (m_currentStateId != 0) {
132 m_flags.setBit(eFlags::Position);
136 CollisionInfo colInfo;
140 bool hasCol = CollisionDirector::Instance()->checkSphereFull(RADIUS, pos, EGG::Vector3f::inf,
144 m_pos += colInfo.tangentOff;
145 m_flags.setBit(eFlags::Position);
147 if (colInfo.floorDist > -std::numeric_limits<f32>::min()) {
148 m_floorNrm = colInfo.floorNrm;
156 return v0 + (v1 - v0) * scale;
#define KCL_TYPE_FLOOR
0x20E80FFF - Any KCL that the player or items can drive/land on.