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"
18 m_bigBump(params.setting(7) == 1) {
23ObjectBasabasaDummy::~ObjectBasabasaDummy() =
default;
26void ObjectBasabasaDummy::init() {
27 m_railInterpolator->init(0.0f, 0);
28 m_pos = m_railInterpolator->curPos();
29 m_flags.setBit(eFlags::Position);
31 auto &rng = System::RaceManager::Instance()->random();
33 f32 y = rng.getF32(s_initialY);
34 f32 x = rng.getF32(s_initialX);
43 Kart::Reaction reactionOnKart, Kart::Reaction ,
45 auto course = System::RaceConfig::Instance()->raceScenario().course;
46 if (course == Course::Dry_Dry_Ruins && m_bigBump) {
47 const auto &hitTable = ObjectDirector::Instance()->hitTableKart();
48 reactionOnKart = hitTable.reaction(hitTable.slot(ObjectId::BasabasaDummy));
51 return reactionOnKart;
55void ObjectBasabasaDummy::calcState0() {
60 if (m_railInterpolator->calc() == RailInterpolator::Status::ChangingDirection) {
62 unregisterCollision();
64 setMatrixFromOrthonormalBasisAndPos(m_railInterpolator->curTangentDir());
68 mat.
setBase(3, EGG::Vector3f::zero);
69 m_pos = m_railInterpolator->curPos() + mat.
ps_multVector(m_initialPos);
70 m_flags.setBit(eFlags::Position);
76 : ObjectCollidable(params), m_initialTimer(params.setting(1)),
77 m_batsPerGroup(params.setting(2)), m_startFrame(params.setting(6)),
78 m_batSpacing(static_cast<u32>(static_cast<f32>(params.setting(5)) /
79 static_cast<f32>(params.setting(0)) / static_cast<f32>(m_batsPerGroup))) {
80 f32 railLen = RailManager::Instance()->rail(params.pathId())->getPathLength();
81 u32 groupCount =
static_cast<u32
>(railLen /
static_cast<f32
>(params.setting(0)) /
82 static_cast<f32
>(m_initialTimer)) +
84 u32 batCount = groupCount * m_batsPerGroup;
86 m_bats = std::span<ObjectBasabasaDummy *>(
new ObjectBasabasaDummy *[batCount], batCount);
88 for (
auto *&bat : m_bats) {
89 bat =
new ObjectBasabasaDummy(params);
94 s_initialY = params.setting(4);
98ObjectBasabasa::~ObjectBasabasa() {
99 delete[] m_bats.data();
103void ObjectBasabasa::init() {
104 for (
auto *&bat : m_bats) {
106 bat->setActive(
false);
107 bat->unregisterCollision();
111 m_cycleTimer = m_initialTimer;
116void ObjectBasabasa::calc() {
117 if (System::RaceManager::Instance()->timer() <= m_startFrame) {
121 if (m_cycleTimer == m_initialTimer + m_batSpacing * (m_batsActive % m_batsPerGroup)) {
122 auto *&bat = m_bats[m_batsActive++];
124 bat->setActive(
true);
127 if ((m_batsActive % m_batsPerGroup) == 0) {
128 m_cycleTimer = m_batSpacing * m_batsPerGroup;
132 m_batsActive %= m_bats.size();
void setBase(size_t col, const Vector3f &base)
Sets one column of a matrix.
Vector3f ps_multVector(const Vector3f &vec) const
Paired-singles impl. of multVector.
Base class that represents different "states" for an object.
The highest level abstraction for a kart.
static f32 s_initialX
Scoped within the TU so that ObjectBasabasa can set and ObjectBasabasaDummy can access.