SMG-Decomp
A decompilation of Super Mario Galaxy 1
Loading...
Searching...
No Matches
CollisionCode.cpp
1#include "Game/Map/CollisionCode.hpp"
2
3#include "Game/Util/HashUtil.hpp"
4
5CollisionCode::CollisionCode()
6 : mFloorTable(0), mWallTable(0), mSoundTable(0), mCameraTable(0) {
7
8 createFloorTable();
9 createWallTable();
10 createSoundTable();
11 createCameraTable();
12}
13
14CodeTable::CodeTable(u32 maxNum) {
15 mMaxNumCodes = maxNum;
16 mNumCodes = 0;
17 mHashCodes = new u32[maxNum];
18 _C = new u32[maxNum];
19 mNames = new const char*[maxNum];
20}
21
22void CodeTable::add(const char *pName, u32 num) {
23 mHashCodes[mNumCodes] = MR::getHashCode(pName);
24 _C[mNumCodes] = num;
25 mNames[mNumCodes] = pName;
26 mNumCodes++;
27}
28
29const char* CollisionCode::getFloorCodeString(const Triangle &rTriangle) {
30 JMapInfoIter iter = rTriangle.getAttributes();
31
32 u32 code = getCode(iter, mFloorTable, "Floor_code");
33 return mFloorTable->getString(code);
34}
35
36const char* CodeTable::getString(u32 val) {
37 for (s32 i = 0; i < mNumCodes; i++) {
38 if (val == _C[i]) {
39 return mNames[i];
40 }
41 }
42
43 return "NoIter";
44}
45
46const char* CollisionCode::getWallCodeString(const Triangle &rTriangle) {
47 JMapInfoIter iter = rTriangle.getAttributes();
48
49 u32 code = getCode(iter, mWallTable, "Wall_code");
50 return mWallTable->getString(code);
51}
52
53const char* CollisionCode::getSoundCodeString(const Triangle &rTriangle) {
54 JMapInfoIter iter = rTriangle.getAttributes();
55 return getSoundCodeString(iter);
56}
57
58const char* CollisionCode::getSoundCodeString(const JMapInfoIter &rIter) {
59 if (!rIter.isValid()) {
60 return "nullptr";
61 }
62
63 if (rIter.mInfo->getValueType("Sound_code") == 0) {
64 u32 code = 0;
65
66 bool ret = rIter.getValue<u32>("Sound_code", &code);
67
68 if (ret) {
69 return mSoundTable->getString(code);
70 }
71 }
72 else {
73 const char* code = 0;
74
75 bool ret = rIter.getValue<const char*>("Sound_code", &code);
76
77 if (ret) {
78 return code;
79 }
80 }
81
82 return "nullptr";
83}
84
85u32 CollisionCode::getCameraID(const Triangle &rTriangle) {
86 JMapInfoIter iter = rTriangle.getAttributes();
87 return getCameraID(iter);
88}
89
90u32 CollisionCode::getCode(const JMapInfoIter &rIter, CodeTable *pCodeTable, const char *pName) {
91 if (!rIter.isValid()) {
92 return 0;
93 }
94
95 if (rIter.mInfo->getValueType(pName) == 0) {
96 u32 code = 0;
97
98 bool ret = rIter.getValue<u32>(pName, &code);
99
100 if (ret) {
101 return code;
102 }
103 }
104 else {
105 const char* code = 0;
106
107 bool ret = rIter.getValue<const char*>(pName, &code);
108
109 if (ret) {
110 u32 ret_code = 0;
111 u32 hash = MR::getHashCode(code);
112
113 for (s32 i = 0; i < pCodeTable->mNumCodes; i++) {
114 if (hash == pCodeTable->mHashCodes[i]) {
115 ret_code = pCodeTable->_C[i];
116 break;
117 }
118 }
119
120 return ret_code;
121 }
122 }
123
124 return 0;
125}
126
127void CollisionCode::createFloorTable() {
128 mFloorTable = new CodeTable(0x23);
129
130 mFloorTable->add("Normal", 0);
131 mFloorTable->add("Death", 1);
132 mFloorTable->add("Slip", 2);
133 mFloorTable->add("NoSlip", 3);
134 mFloorTable->add("DamageNormal", 4);
135 mFloorTable->add("Ice", 5);
136 mFloorTable->add("JumpLow", 6);
137 mFloorTable->add("JumpMiddle", 7);
138 mFloorTable->add("JumpHigh", 8);
139 mFloorTable->add("Slider", 9);
140 mFloorTable->add("DamageFire", 0xA);
141 mFloorTable->add("JumpNormal", 0xB);
142 mFloorTable->add("FireDance", 0xC);
143 mFloorTable->add("Sand", 0xD);
144 mFloorTable->add("Glass", 0xE);
145 mFloorTable->add("DamageElectric", 0xF);
146 mFloorTable->add("PullBack", 0x10);
147 mFloorTable->add("Sink", 0x11);
148 mFloorTable->add("SinkPoison", 0x12);
149 mFloorTable->add("Slide", 0x13);
150 mFloorTable->add("WaterBottomH", 0x14);
151 mFloorTable->add("WaterBottomM", 0x15);
152 mFloorTable->add("WaterBottomL", 0x16);
153 mFloorTable->add("Wet", 0x17);
154 mFloorTable->add("Needle", 0x18);
155 mFloorTable->add("SinkDeath", 0x19);
156 mFloorTable->add("Snow", 0x1A);
157 mFloorTable->add("RailMove", 0x1B);
158 mFloorTable->add("AreaMove", 0x1C);
159 mFloorTable->add("Press", 0x1D);
160 mFloorTable->add("NoStampSand", 0x1E);
161 mFloorTable->add("SinkDeathMud", 0x1F);
162 mFloorTable->add("Brake", 0x20);
163 mFloorTable->add("GlassIce", 0x21);
164 mFloorTable->add("JumpParasol", 0x22);
165}
166
167void CollisionCode::createWallTable() {
168 mWallTable = new CodeTable(0x9);
169
170 mWallTable->add("Normal", 0);
171 mWallTable->add("NotWallJump", 1);
172 mWallTable->add("NotWallSlip", 2);
173 mWallTable->add("NotGrab", 3);
174 mWallTable->add("GhostThroughCode", 4);
175 mWallTable->add("NotSideStep", 5);
176 mWallTable->add("Rebound", 6);
177 mWallTable->add("Fur", 7);
178 mWallTable->add("NoAction", 8);
179}
180
181void CollisionCode::createSoundTable() {
182 mSoundTable = new CodeTable(0x10);
183
184 mSoundTable->add("nullptr", 0);
185 mSoundTable->add("Soil", 1);
186 mSoundTable->add("Lawn", 2);
187 mSoundTable->add("Stone", 3);
188 mSoundTable->add("Marble", 4);
189 mSoundTable->add("WoodThick", 5);
190 mSoundTable->add("WoodThin", 6);
191 mSoundTable->add("Metal", 7);
192 mSoundTable->add("Snow", 8);
193 mSoundTable->add("Ice", 9);
194 mSoundTable->add("Shallow", 0xA);
195 mSoundTable->add("Sand", 0xB);
196 mSoundTable->add("Beach", 0xC);
197 mSoundTable->add("Carpet", 0xD);
198 mSoundTable->add("Mud", 0xE);
199 mSoundTable->add("Honey", 0xF);
200}
201
202void CollisionCode::createCameraTable() {
203 mCameraTable = new CodeTable(2);
204
205 mCameraTable->add("NoThrough", 0);
206 mCameraTable->add("Through", 1);
207}
208
209u32 CollisionCode::getFloorCode(const JMapInfoIter &rIter) {
210 return getCode(rIter, mFloorTable, "Floor_code");
211}
212
213u32 CollisionCode::getWallCode(const JMapInfoIter &rIter) {
214 return getCode(rIter, mWallTable, "Wall_code");
215}
216
217u32 CollisionCode::getSoundCode(const JMapInfoIter &rIter) {
218 return getCode(rIter, mSoundTable, "Sound_code");
219}
220
221u32 CollisionCode::getCameraCode(const JMapInfoIter &rIter) {
222 return getCode(rIter, mCameraTable, "Camera_through");
223}
224
225u32 CollisionCode::getCameraID(const JMapInfoIter &rIter) {
226 if (!rIter.isValid()) {
227 return -1;
228 }
229
230 u32 id = -1;
231 rIter.getValue<u32>("camera_id", &id);
232
233 return id;
234}