1#include "ObjectDokan.hh"
3#include "game/field/CollisionDirector.hh"
5#include "game/kart/KartCollide.hh"
10ObjectDokan::ObjectDokan(
const System::MapdataGeoObj ¶ms) :
ObjectCollidable(params) {}
13ObjectDokan::~ObjectDokan() =
default;
16void ObjectDokan::init() {
21void ObjectDokan::calc() {
22 constexpr f32 ACCEL = 2.0f;
28 m_velocity.y -= ACCEL;
35void ObjectDokan::calcCollisionTransform() {
36 if (m_id == ObjectId::DokanSFC) {
37 ObjectCollidable::calcCollisionTransform();
41 EGG::Matrix34f mat = transform();
42 mat.setBase(3, mat.translation() + EGG::Vector3f::ey * 300.0f);
43 m_collision->transform(mat, scale(), getCollisionTranslation());
48Kart::Reaction ObjectDokan::onCollision(Kart::KartObject * ,
49 Kart::Reaction reactionOnKart, Kart::Reaction reactionOnObj, EGG::Vector3f & ) {
50 constexpr f32 INITIAL_VELOCITY = 100.0f;
52 if (reactionOnObj == Kart::Reaction::UNK_3 || reactionOnObj == Kart::Reaction::UNK_5) {
55 m_velocity = INITIAL_VELOCITY * EGG::Vector3f::ey;
59 return reactionOnKart;
63void ObjectDokan::calcFloor() {
64 constexpr f32 PIPE_RADIUS = 100.0f;
65 constexpr f32 PIPE_SQRT_RADIUS = 10.0f;
66 constexpr f32 ACCELERATION = 0.2f;
68 CollisionInfo colInfo;
69 EGG::Vector3f colPos = pos();
70 colPos.y += PIPE_RADIUS;
73 if (!CollisionDirector::Instance()->checkSphereFull(PIPE_RADIUS, colPos, EGG::Vector3f::inf,
74 KCL_TYPE_64EBDFFF, &colInfo, &typeMask, 0)) {
78 addPos(EGG::Vector3f(0.0f, colInfo.tangentOff.y, 0.0f));
81 m_velocity.y *= -ACCELERATION;
82 if (m_velocity.length() < ACCELERATION * PIPE_SQRT_RADIUS) {
#define KCL_TYPE_FLOOR
0x20E80FFF - Any KCL that the player or items can drive/land on.