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 Kinoko::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 = owning_span<ObjectCarTGE *>(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() = default;
39
41void ObjectHighwayManager::init() {
42 m_squashTimer = SQUASH_MAX;
43}
44
46void ObjectHighwayManager::calc() {
47 calcSquash();
48}
49
51void ObjectHighwayManager::calcSquash() {
52 constexpr u32 SQUASH_INVULNERABILITY = 200;
53
54 bool vulnerable = m_squashTimer >= SQUASH_INVULNERABILITY;
55
56 for (auto *&obj : m_cars) {
57 if (obj->squashed() && vulnerable) {
58 m_squashTimer = 0;
59 }
60
61 obj->reset();
62 }
63
64 m_squashTimer = std::min<u32>(m_squashTimer + 1, SQUASH_MAX);
65}
66
67} // namespace Kinoko::Field
Pertains to collision.