A reimplementation of Mario Kart Wii's physics engine in C++
Loading...
Searching...
No Matches
ObjectHighwayManager.cc
1#include "ObjectHighwayManager.hh"
2
3#include "game/field/ObjectDirector.hh"
4#include "game/field/obj/ObjectCarTGE.hh"
5
6namespace Field {
7
9ObjectHighwayManager::ObjectHighwayManager()
10 : ObjectCollidable("HighwayManager", EGG::Vector3f::zero, EGG::Vector3f::ez,
11 EGG::Vector3f::unit) {
12 size_t carCount = 0;
13 auto *objDir = ObjectDirector::Instance();
14
15 for (auto *const &obj : objDir->managedObjects()) {
16 const char *objName = obj->getName();
17
18 if ((strcmp(objName, "car_body") == 0) || (strcmp(objName, "kart_truck") == 0)) {
19 ++carCount;
20 }
21 }
22
23 m_cars = std::span<ObjectCarTGE *>(new ObjectCarTGE *[carCount], carCount);
24 size_t idx = 0;
25
26 for (auto *&obj : objDir->managedObjects()) {
27 const char *objName = obj->getName();
28
29 if ((strcmp(objName, "car_body") == 0) || (strcmp(objName, "kart_truck") == 0)) {
30 auto *carObj = reinterpret_cast<ObjectCarTGE *>(obj);
31 m_cars[idx++] = carObj;
32 carObj->setHighwayManager(this);
33 }
34 }
35}
36
38ObjectHighwayManager::~ObjectHighwayManager() {
39 // The manager does not own the underlying objects. Only free the array itself.
40 delete[] m_cars.data();
41}
42
44void ObjectHighwayManager::init() {
45 m_squashTimer = SQUASH_MAX;
46}
47
49void ObjectHighwayManager::calc() {
50 calcSquash();
51}
52
54void ObjectHighwayManager::calcSquash() {
55 constexpr u32 SQUASH_INVULNERABILITY = 200;
56
57 bool vulnerable = m_squashTimer >= SQUASH_INVULNERABILITY;
58
59 for (auto *&obj : m_cars) {
60 if (obj->squashed() && vulnerable) {
61 m_squashTimer = 0;
62 }
63
64 obj->reset();
65 }
66
67 m_squashTimer = std::min<u32>(m_squashTimer + 1, SQUASH_MAX);
68}
69
70} // namespace Field
EGG core library.
Definition Archive.cc:6
Pertains to collision.