1#include "ObjectBasabasa.hh"
3#include "game/field/ObjectDirector.hh"
4#include "game/field/RailManager.hh"
6#include "game/system/RaceConfig.hh"
7#include "game/system/RaceManager.hh"
12ObjectBasabasaDummy::ObjectBasabasaDummy(
const System::MapdataGeoObj ¶ms)
14 m_bigBump(params.setting(7) == 1) {
19ObjectBasabasaDummy::~ObjectBasabasaDummy() =
default;
22void ObjectBasabasaDummy::init() {
23 m_railInterpolator->init(0.0f, 0);
24 setPos(m_railInterpolator->curPos());
26 auto &rng = System::RaceManager::Instance()->random();
28 f32 y = rng.getF32(ObjectBasabasa::initialYRange());
29 f32 x = rng.getF32(ObjectBasabasa::initialXRange());
31 m_initialPos = EGG::Vector3f(x - ObjectBasabasa::initialXRange() * 0.5f, y, 0.0f);
37Kart::Reaction ObjectBasabasaDummy::onCollision(Kart::KartObject * ,
38 Kart::Reaction reactionOnKart, Kart::Reaction ,
40 auto course = System::RaceConfig::Instance()->raceScenario().course;
41 if (course == Course::Dry_Dry_Ruins && m_bigBump) {
42 const auto &hitTable = ObjectDirector::Instance()->hitTableKart();
43 reactionOnKart = hitTable.reaction(hitTable.slot(ObjectId::BasabasaDummy));
46 return reactionOnKart;
50void ObjectBasabasaDummy::calcState0() {
55 if (m_railInterpolator->calc() == RailInterpolator::Status::ChangingDirection) {
57 unregisterCollision();
59 setMatrixFromOrthonormalBasisAndPos(m_railInterpolator->curTangentDir());
62 EGG::Matrix34f mat = transform();
63 mat.setBase(3, EGG::Vector3f::zero);
64 setPos(m_railInterpolator->curPos() + mat.ps_multVector(m_initialPos));
69ObjectBasabasa::ObjectBasabasa(
const System::MapdataGeoObj ¶ms)
70 : ObjectCollidable(params), m_initialTimer(params.setting(1)),
71 m_batsPerGroup(params.setting(2)), m_startFrame(params.setting(6)),
72 m_batSpacing(static_cast<u32>(static_cast<f32>(params.setting(5)) /
73 static_cast<f32>(params.setting(0)) / static_cast<f32>(m_batsPerGroup))) {
74 f32 railLen = RailManager::Instance()->rail(params.pathId())->getPathLength();
75 u32 groupCount =
static_cast<u32
>(railLen /
static_cast<f32
>(params.setting(0)) /
76 static_cast<f32
>(m_initialTimer)) +
78 u32 batCount = groupCount * m_batsPerGroup;
80 m_bats = owning_span<ObjectBasabasaDummy *>(batCount);
82 for (
auto *&bat : m_bats) {
83 bat = EGG::egg_new<ObjectBasabasaDummy>(params);
87 s_initialXRange = params.setting(3);
88 s_initialYRange = params.setting(4);
92ObjectBasabasa::~ObjectBasabasa() =
default;
95void ObjectBasabasa::init() {
96 for (
auto *&bat : m_bats) {
98 bat->setActive(
false);
99 bat->unregisterCollision();
103 m_cycleTimer = m_initialTimer;
108void ObjectBasabasa::calc() {
109 if (System::RaceManager::Instance()->timer() <= m_startFrame) {
113 if (m_cycleTimer == m_initialTimer + m_batSpacing * (m_batsActive % m_batsPerGroup)) {
114 auto *&bat = m_bats[m_batsActive++];
116 bat->setActive(
true);
119 if ((m_batsActive % m_batsPerGroup) == 0) {
120 m_cycleTimer = m_batSpacing * m_batsPerGroup;
124 m_batsActive %= m_bats.size();
129f32 ObjectBasabasa::s_initialXRange;
130f32 ObjectBasabasa::s_initialYRange;
Base class that represents different "states" for an object.