A reimplementation of Mario Kart Wii's physics engine in C++
Loading...
Searching...
No Matches
ObjectBasabasa.cc
1#include "ObjectBasabasa.hh"
2
3#include "game/field/ObjectDirector.hh"
4#include "game/field/RailManager.hh"
5
6#include "game/system/RaceConfig.hh"
7#include "game/system/RaceManager.hh"
8
9namespace Field {
10
12static f32 s_initialX;
13static f32 s_initialY;
14
16ObjectBasabasaDummy::ObjectBasabasaDummy(const System::MapdataGeoObj &params)
17 : ObjectCollidable(params), StateManager(this, STATE_ENTRIES),
18 m_bigBump(params.setting(7) == 1) {
19 m_active = true;
20}
21
23ObjectBasabasaDummy::~ObjectBasabasaDummy() = default;
24
26void ObjectBasabasaDummy::init() {
27 m_railInterpolator->init(0.0f, 0);
28 m_pos = m_railInterpolator->curPos();
29 m_flags.setBit(eFlags::Position);
30
31 auto &rng = System::RaceManager::Instance()->random();
32 rng.next();
33 f32 y = rng.getF32(s_initialY);
34 f32 x = rng.getF32(s_initialX);
35
36 m_initialPos = EGG::Vector3f(x - s_initialX * 0.5f, y, 0.0f);
37
38 m_nextStateId = 0;
39}
40
42Kart::Reaction ObjectBasabasaDummy::onCollision(Kart::KartObject * /*kartObj*/,
43 Kart::Reaction reactionOnKart, Kart::Reaction /*reactionOnObj*/,
44 EGG::Vector3f & /*hitDepth*/) {
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));
49 }
50
51 return reactionOnKart;
52}
53
55void ObjectBasabasaDummy::calcState0() {
56 if (!m_active) {
57 return;
58 }
59
60 if (m_railInterpolator->calc() == RailInterpolator::Status::ChangingDirection) {
61 m_active = false;
62 unregisterCollision();
63 } else {
64 setMatrixFromOrthonormalBasisAndPos(m_railInterpolator->curTangentDir());
65 calcTransform();
66
67 EGG::Matrix34f mat = m_transform;
68 mat.setBase(3, EGG::Vector3f::zero);
69 m_pos = m_railInterpolator->curPos() + mat.ps_multVector(m_initialPos);
70 m_flags.setBit(eFlags::Position);
71 }
72}
73
75ObjectBasabasa::ObjectBasabasa(const System::MapdataGeoObj &params)
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)) +
83 1;
84 u32 batCount = groupCount * m_batsPerGroup;
85
86 m_bats = std::span<ObjectBasabasaDummy *>(new ObjectBasabasaDummy *[batCount], batCount);
87
88 for (auto *&bat : m_bats) {
89 bat = new ObjectBasabasaDummy(params);
90 bat->load();
91 }
92
93 s_initialX = params.setting(3);
94 s_initialY = params.setting(4);
95}
96
98ObjectBasabasa::~ObjectBasabasa() {
99 delete[] m_bats.data();
100}
101
103void ObjectBasabasa::init() {
104 for (auto *&bat : m_bats) {
105 if (bat->active()) {
106 bat->setActive(false);
107 bat->unregisterCollision();
108 }
109 }
110
111 m_cycleTimer = m_initialTimer;
112 m_batsActive = 0;
113}
114
116void ObjectBasabasa::calc() {
117 if (System::RaceManager::Instance()->timer() <= m_startFrame) {
118 return;
119 }
120
121 if (m_cycleTimer == m_initialTimer + m_batSpacing * (m_batsActive % m_batsPerGroup)) {
122 auto *&bat = m_bats[m_batsActive++];
123 bat->init();
124 bat->setActive(true);
125 bat->loadAABB(0.0f);
126
127 if ((m_batsActive % m_batsPerGroup) == 0) {
128 m_cycleTimer = m_batSpacing * m_batsPerGroup;
129 }
130 }
131
132 m_batsActive %= m_bats.size();
133
134 ++m_cycleTimer;
135}
136
137} // namespace Field
A 3 x 4 matrix.
Definition Matrix.hh:8
void setBase(size_t col, const Vector3f &base)
Sets one column of a matrix.
Definition Matrix.cc:181
Vector3f ps_multVector(const Vector3f &vec) const
Paired-singles impl. of multVector.
Definition Matrix.cc:224
Base class that represents different "states" for an object.
The highest level abstraction for a kart.
Definition KartObject.hh:11
Pertains to collision.
static f32 s_initialX
Scoped within the TU so that ObjectBasabasa can set and ObjectBasabasaDummy can access.
A 3D float vector.
Definition Vector.hh:88