A reimplementation of Mario Kart Wii's physics engine in C++
Loading...
Searching...
No Matches
KartParamFileManager.cc
1#include "KartParamFileManager.hh"
2
3namespace Kinoko::Kart {
4
6void KartParamFileManager::clear() {
7 m_kartParam.clear();
8 m_driverParam.clear();
9 m_bikeDispParam.clear();
10 m_kartDispParam.clear();
11 m_kartCameraParam.clear();
12}
13
17 m_kartParam.load("kartParam.bin");
18 m_driverParam.load("driverParam.bin");
19 m_bikeDispParam.load("bikePartsDispParam.bin");
20 m_kartDispParam.load("kartPartsDispParam.bin");
21 m_kartCameraParam.load("kartCameraParam.bin");
22 if (!validate()) {
23 PANIC("Parameter files could not be validated!");
24 }
25}
26
27EGG::RamStream KartParamFileManager::getDriverStream(Character character) const {
28 s32 idx = -1;
29 switch (character) {
30 case Character::Small_Mii_Outfit_A_Male:
31 case Character::Small_Mii_Outfit_A_Female:
32 case Character::Small_Mii_Outfit_B_Male:
33 case Character::Small_Mii_Outfit_B_Female:
34 case Character::Small_Mii_Outfit_C_Male:
35 case Character::Small_Mii_Outfit_C_Female:
36 case Character::Small_Mii:
37 idx = 23;
38 break;
39 case Character::Medium_Mii_Outfit_A_Male:
40 case Character::Medium_Mii_Outfit_A_Female:
41 case Character::Medium_Mii_Outfit_B_Male:
42 case Character::Medium_Mii_Outfit_B_Female:
43 case Character::Medium_Mii_Outfit_C_Male:
44 case Character::Medium_Mii_Outfit_C_Female:
45 case Character::Medium_Mii:
46 idx = 24;
47 break;
48 case Character::Large_Mii_Outfit_A_Male:
49 case Character::Large_Mii_Outfit_A_Female:
50 case Character::Large_Mii_Outfit_B_Male:
51 case Character::Large_Mii_Outfit_B_Female:
52 case Character::Large_Mii_Outfit_C_Male:
53 case Character::Large_Mii_Outfit_C_Female:
54 case Character::Large_Mii:
55 idx = 25;
56 break;
57 default:
58 if (character > Character::Rosalina) {
59 PANIC("Uh oh.");
60 }
61
62 idx = static_cast<s32>(character);
63 break;
64 }
65
66 auto *file = reinterpret_cast<ParamFile<KartParam::Stats> *>(m_driverParam.file);
67 ASSERT(file);
68 return EGG::RamStream(&file->params[idx], sizeof(KartParam::Stats));
69}
70
71EGG::RamStream KartParamFileManager::getVehicleStream(Vehicle vehicle) const {
72 if (vehicle >= Vehicle::Max) {
73 PANIC("Uh oh.");
74 }
75
76 s32 idx = static_cast<s32>(vehicle);
77 auto *file = reinterpret_cast<ParamFile<KartParam::Stats> *>(m_kartParam.file);
78 ASSERT(file);
79 return EGG::RamStream(&file->params[idx], sizeof(KartParam::Stats));
80}
81
82EGG::RamStream KartParamFileManager::getHitboxStream(Vehicle vehicle) const {
83 if (vehicle >= Vehicle::Max) {
84 PANIC("Uh oh.");
85 }
86
87 auto *resourceManager = System::ResourceManager::Instance();
88 size_t size;
89
90 auto *file = resourceManager->getBsp(vehicle, &size);
91 ASSERT(file);
92 ASSERT(size == sizeof(BSP));
93 return EGG::RamStream(file, size);
94}
95
96EGG::RamStream KartParamFileManager::getBikeDispParamsStream(Vehicle vehicle) const {
97 if (vehicle < Vehicle::Standard_Bike_S || vehicle >= Vehicle::Max) {
98 PANIC("Uh oh.");
99 }
100
101 // We need to index at the correct offset
102 constexpr u32 KART_MAX = 18;
103 s32 idx = static_cast<s32>(vehicle) - KART_MAX;
104
105 auto *file = reinterpret_cast<ParamFile<KartParam::BikeDisp> *>(m_bikeDispParam.file);
106 ASSERT(file);
107 return EGG::RamStream(&file->params[idx], sizeof(KartParam::BikeDisp));
108}
109
110EGG::RamStream KartParamFileManager::getKartDispParamsStream(Vehicle vehicle) const {
111 if (vehicle < Vehicle::Standard_Kart_S || vehicle > Vehicle::Honeycoupe) {
112 PANIC("Uh oh.");
113 }
114
115 s32 idx = static_cast<s32>(vehicle);
116
117 auto *file = reinterpret_cast<ParamFile<KartParam::KartDisp> *>(m_kartDispParam.file);
118 ASSERT(file);
119 return EGG::RamStream(&file->params[idx], sizeof(KartParam::KartDisp));
120}
121
122EGG::RamStream KartParamFileManager::getKartCameraStream(Character character) const {
123 WeightClass weightClass = CharacterToWeight(character);
124 if (weightClass == WeightClass::Invalid) {
125 PANIC("Invalid weight class when getting KartCamera stream");
126 }
127
128 auto *file = reinterpret_cast<KartParam::KartCameraParam *>(m_kartCameraParam.file);
129 ASSERT(file);
130
131 // We skip 1 to get 16:9
132 return EGG::RamStream(file + static_cast<u32>(weightClass) * 4 + 1,
133 sizeof(KartParam::KartCameraParam));
134}
135
136KartParamFileManager *KartParamFileManager::CreateInstance() {
137 ASSERT(!s_instance);
138 s_instance = new KartParamFileManager;
139 return s_instance;
140}
141
142void KartParamFileManager::DestroyInstance() {
143 ASSERT(s_instance);
144 auto *instance = s_instance;
145 s_instance = nullptr;
146 delete instance;
147}
148
149KartParamFileManager::KartParamFileManager() {
150 init();
151}
152
153KartParamFileManager::~KartParamFileManager() {
154 if (s_instance) {
155 s_instance = nullptr;
156 WARN("KartParamFileManager instance not explicitly handled!");
157 }
158}
159
162 // Validate kartParam.bin
163 if (!m_kartParam.file || m_kartParam.size == 0) {
164 return false;
165 }
166
167 auto *kartFile = reinterpret_cast<ParamFile<KartParam::Stats> *>(m_kartParam.file);
168 if (m_kartParam.size != parse<u32>(kartFile->count) * sizeof(KartParam::Stats) + 4) {
169 return false;
170 }
171
172 // Validate driverParam.bin
173 if (!m_driverParam.file || m_driverParam.size == 0) {
174 return false;
175 }
176
177 auto *driverFile = reinterpret_cast<ParamFile<KartParam::Stats> *>(m_driverParam.file);
178 if (m_driverParam.size != parse<u32>(driverFile->count) * sizeof(KartParam::Stats) + 4) {
179 return false;
180 }
181
182 // Validate bikePartsDispParam.bin
183 if (!m_bikeDispParam.file || m_bikeDispParam.size == 0) {
184 return false;
185 }
186
187 auto *bikeDispFile = reinterpret_cast<ParamFile<KartParam::BikeDisp> *>(m_bikeDispParam.file);
188 if (m_bikeDispParam.size != parse<u32>(bikeDispFile->count) * sizeof(KartParam::BikeDisp) + 4) {
189 return false;
190 }
191
192 // Validate kartPartsDispParam.bin
193 if (!m_kartDispParam.file || m_kartDispParam.size == 0) {
194 return false;
195 }
196
197 auto *kartDispFile = reinterpret_cast<ParamFile<KartParam::KartDisp> *>(m_kartDispParam.file);
198 if (m_kartDispParam.size != parse<u32>(kartDispFile->count) * sizeof(KartParam::KartDisp) + 4) {
199 return false;
200 }
201
202 // Validate kartCameraParam.bin
203 if (!m_kartCameraParam.file || m_kartCameraParam.size == 0) {
204 return false;
205 }
206
207 return true;
208}
209
210KartParamFileManager *KartParamFileManager::s_instance = nullptr;
211
212} // namespace Kinoko::Kart
A stream of data stored in memory.
Definition Stream.hh:83
Abstraction for the process of retrieving kart parameters from files.
bool validate() const
Performs a few checks to make sure the files were loaded successfully.
void init()
Loads and validates the kart parameter files.
Pertains to kart-related functionality.
Various character/vehicle-related handling and speed stats.
Definition KartParam.hh:79