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)
13 : ObjectCollidable(params), StateManager(this, STATE_ENTRIES),
14 m_bigBump(params.setting(7) == 1) {
19ObjectBasabasaDummy::~ObjectBasabasaDummy() =
default;
22void ObjectBasabasaDummy::init() {
23 m_railInterpolator->init(0.0f, 0);
24 m_pos = m_railInterpolator->curPos();
25 m_flags.setBit(eFlags::Position);
27 auto &rng = System::RaceManager::Instance()->random();
29 f32 y = rng.getF32(ObjectBasabasa::initialYRange());
30 f32 x = rng.getF32(ObjectBasabasa::initialXRange());
32 m_initialPos = EGG::Vector3f(x - ObjectBasabasa::initialXRange() * 0.5f, y, 0.0f);
38Kart::Reaction ObjectBasabasaDummy::onCollision(Kart::KartObject * ,
39 Kart::Reaction reactionOnKart, Kart::Reaction ,
41 auto course = System::RaceConfig::Instance()->raceScenario().course;
42 if (course == Course::Dry_Dry_Ruins && m_bigBump) {
43 const auto &hitTable = ObjectDirector::Instance()->hitTableKart();
44 reactionOnKart = hitTable.reaction(hitTable.slot(ObjectId::BasabasaDummy));
47 return reactionOnKart;
51void ObjectBasabasaDummy::calcState0() {
56 if (m_railInterpolator->calc() == RailInterpolator::Status::ChangingDirection) {
58 unregisterCollision();
60 setMatrixFromOrthonormalBasisAndPos(m_railInterpolator->curTangentDir());
63 EGG::Matrix34f mat = m_transform;
64 mat.setBase(3, EGG::Vector3f::zero);
65 m_pos = m_railInterpolator->curPos() + mat.ps_multVector(m_initialPos);
66 m_flags.setBit(eFlags::Position);
71ObjectBasabasa::ObjectBasabasa(
const System::MapdataGeoObj ¶ms)
72 : ObjectCollidable(params), m_initialTimer(params.setting(1)),
73 m_batsPerGroup(params.setting(2)), m_startFrame(params.setting(6)),
74 m_batSpacing(static_cast<u32>(static_cast<f32>(params.setting(5)) /
75 static_cast<f32>(params.setting(0)) / static_cast<f32>(m_batsPerGroup))) {
76 f32 railLen = RailManager::Instance()->rail(params.pathId())->getPathLength();
77 u32 groupCount =
static_cast<u32
>(railLen /
static_cast<f32
>(params.setting(0)) /
78 static_cast<f32
>(m_initialTimer)) +
80 u32 batCount = groupCount * m_batsPerGroup;
82 m_bats = owning_span<ObjectBasabasaDummy *>(batCount);
84 for (
auto *&bat : m_bats) {
85 bat =
new ObjectBasabasaDummy(params);
89 s_initialXRange = params.setting(3);
90 s_initialYRange = params.setting(4);
94ObjectBasabasa::~ObjectBasabasa() =
default;
97void ObjectBasabasa::init() {
98 for (
auto *&bat : m_bats) {
100 bat->setActive(
false);
101 bat->unregisterCollision();
105 m_cycleTimer = m_initialTimer;
110void ObjectBasabasa::calc() {
111 if (System::RaceManager::Instance()->timer() <= m_startFrame) {
115 if (m_cycleTimer == m_initialTimer + m_batSpacing * (m_batsActive % m_batsPerGroup)) {
116 auto *&bat = m_bats[m_batsActive++];
118 bat->setActive(
true);
121 if ((m_batsActive % m_batsPerGroup) == 0) {
122 m_cycleTimer = m_batSpacing * m_batsPerGroup;
126 m_batsActive %= m_bats.size();
131f32 ObjectBasabasa::s_initialXRange;
132f32 ObjectBasabasa::s_initialYRange;