SMG-Decomp
A decompilation of Super Mario Galaxy 1
Loading...
Searching...
No Matches
ObjUtil.cpp
1#include "Game/NameObj/NameObjExecuteHolder.hpp"
2#include "Game/NameObj/NameObjAdaptor.hpp"
3#include "Game/System/ResourceHolder.hpp"
4#include "Game/System/ResourceHolderManager.hpp"
5#include "Game/Util/ObjUtil.hpp"
6#include <cstdio>
7#include <va_list.h>
8
9class LiveActor;
10
11namespace {
12 const JMapInfo* tryCreateCsvParserLocal(const ResourceHolder* pHolder, const char* pArchive, va_list pFormat) NO_INLINE {
13 char buf[0x100];
14 vsnprintf(buf, 0x100, pArchive, pFormat);
15
16 if (!pHolder->mFileInfoTable->isExistRes(buf)) {
17 return nullptr;
18 }
19
20 JMapInfo* inf = new JMapInfo();
21 inf->attach(pHolder->mFileInfoTable->getRes(buf));
22 return inf;
23 }
24};
25
26namespace MR {
27 void connectToScene(LiveActor *pActor, int a2, int a3, int a4, int a5) {
28 MR::registerNameObjToExecuteHolder(reinterpret_cast<NameObj*>(pActor), a2, a3, a4, a5);
29 }
30
31 void connectToScene(NameObj *pObj, int a2, int a3, int a4, int a5) {
32 MR::registerNameObjToExecuteHolder(pObj, a2, a3, a4, a5);
33 MR::connectToSceneTemporarily(pObj);
34 MR::connectToDrawTemporarily(pObj);
35 }
36
37 void connectToSceneCollisionMapObj(LiveActor *pActor) {
38 MR::registerNameObjToExecuteHolder(reinterpret_cast<NameObj*>(pActor), 0x1E, 2, 8, -1);
39 }
40
41 void connectToSceneCollisionMapObjMovementCalcAnim(LiveActor *pActor) {
42 MR::registerNameObjToExecuteHolder(reinterpret_cast<NameObj*>(pActor), 0x1E, 2, -1, -1);
43 }
44
45 void connectToSceneCollisionMapObjWeakLight(LiveActor *pActor) {
46 MR::registerNameObjToExecuteHolder(reinterpret_cast<NameObj*>(pActor), 0x1E, 2, 9, -1);
47 }
48
49 void connectToSceneCollisionMapObjStrongLight(LiveActor *pActor) {
50 MR::registerNameObjToExecuteHolder(reinterpret_cast<NameObj*>(pActor), 0x1E, 2, 0xA, -1);
51 }
52
53 void connectToSceneCollisionEnemy(LiveActor *pActor) {
54 MR::registerNameObjToExecuteHolder(reinterpret_cast<NameObj*>(pActor), 0x1F, 3, 0x12, -1);
55 }
56
57 void connectToSceneCollisionEnemyMovement(NameObj *pObj) {
58 MR::registerNameObjToExecuteHolder(pObj, 0x1F, -1, -1, -1);
59 MR::connectToSceneTemporarily(pObj);
60 MR::connectToDrawTemporarily(pObj);
61 }
62
63 void connectToSceneCollisionEnemyStrongLight(LiveActor *pActor) {
64 MR::registerNameObjToExecuteHolder(reinterpret_cast<NameObj*>(pActor), 0x1F, 3, 0xA, -1);
65 }
66
67 void connectToSceneCollisionEnemyNoShadowedMapObjStrongLight(LiveActor *pActor) {
68 MR::registerNameObjToExecuteHolder(reinterpret_cast<NameObj*>(pActor), 0x1F, 3, 0xC, -1);
69 }
70
71 void connectToSceneNpc(LiveActor *pActor) {
72 MR::registerNameObjToExecuteHolder(reinterpret_cast<NameObj*>(pActor), 0x28, 6, 0x10, -1);
73 }
74
75 void connectToSceneNpcMovement(LiveActor *pActor) {
76 MR::registerNameObjToExecuteHolder(reinterpret_cast<NameObj*>(pActor), 0x28, -1, -1, -1);
77 }
78
79 void connectToSceneRide(LiveActor *pActor) {
80 MR::registerNameObjToExecuteHolder(reinterpret_cast<NameObj*>(pActor), 0x29, 7, 0x11, -1);
81 }
82
83 void connectToSceneEnemy(LiveActor *pActor) {
84 MR::registerNameObjToExecuteHolder(reinterpret_cast<NameObj*>(pActor), 0x2A, 8, 0x12, -1);
85 }
86
87 void connectToSceneEnemyMovement(NameObj *pObj) {
88 MR::registerNameObjToExecuteHolder(pObj, 0x2A, -1, -1, -1);
89 MR::connectToSceneTemporarily(pObj);
90 MR::connectToDrawTemporarily(pObj);
91 }
92
93 void connectToSceneMapObj(LiveActor *pActor) {
94 MR::registerNameObjToExecuteHolder(reinterpret_cast<NameObj*>(pActor), 0x22, 5, 8, -1);
95 }
96
97 void connectToSceneMapObjMovement(NameObj *pObj) {
98 MR::registerNameObjToExecuteHolder(pObj, 0x22, -1, -1, -1);
99 MR::connectToSceneTemporarily(pObj);
100 MR::connectToDrawTemporarily(pObj);
101 }
102
103 void connectToSceneMapObjMovementCalcAnim(NameObj *pObj) {
104 MR::registerNameObjToExecuteHolder(pObj, 0x22, 5, -1, -1);
105 MR::connectToSceneTemporarily(pObj);
106 MR::connectToDrawTemporarily(pObj);
107 }
108
109 void connectToSceneMapObjNoMovement(LiveActor *pActor) {
110 MR::registerNameObjToExecuteHolder(reinterpret_cast<NameObj*>(pActor), -1, 5, 8, -1);
111 }
112
113 void connectToSceneMapObjNoCalcAnim(LiveActor *pActor) {
114 MR::registerNameObjToExecuteHolder(reinterpret_cast<NameObj*>(pActor), 0x22, -1, 8, -1);
115 }
116
117 void connectToSceneMapObjNoCalcAnimStrongLight(LiveActor *pActor) {
118 MR::registerNameObjToExecuteHolder(reinterpret_cast<NameObj*>(pActor), 0x22, -1, 0xA, -1);
119 }
120
121 void connectToSceneMapObjDecoration(LiveActor *pActor) {
122 MR::registerNameObjToExecuteHolder(reinterpret_cast<NameObj*>(pActor), 0x23, 0xB, 8, -1);
123 }
124
125 void connectToSceneMapObjDecorationStrongLight(LiveActor *pActor) {
126 MR::registerNameObjToExecuteHolder(reinterpret_cast<NameObj*>(pActor), 0x23, 0xB, 0xA, -1);
127 }
128
129 void connectToSceneMapObjDecorationMovement(NameObj *pObj) {
130 MR::registerNameObjToExecuteHolder(pObj, 0x23, -1, -1, -1);
131 MR::connectToSceneTemporarily(pObj);
132 MR::connectToDrawTemporarily(pObj);
133 }
134
135 void connectToSceneMapObjStrongLight(LiveActor *pActor) {
136 MR::registerNameObjToExecuteHolder(reinterpret_cast<NameObj*>(pActor), 0x22, 5, 0xA, -1);
137 }
138
139 void connectToSceneMapParts(LiveActor *pActor) {
140 MR::registerNameObjToExecuteHolder(reinterpret_cast<NameObj*>(pActor), 0x1C, 0, 8, -1);
141 }
142
143 void connectToScenePlanet(LiveActor *pActor) {
144 if (MR::isExistIndirectTexture(pActor)) {
145 MR::registerNameObjToExecuteHolder(reinterpret_cast<NameObj*>(pActor), 0x1D, 1, 0x1D, -1);
146 }
147 else {
148 MR::registerNameObjToExecuteHolder(reinterpret_cast<NameObj*>(pActor), 0x1D, 1, 4, -1);
149 }
150 }
151
152 void connectToSceneEnvironment(LiveActor *pActor) {
153 MR::registerNameObjToExecuteHolder(reinterpret_cast<NameObj*>(pActor), 0x21, 4, 6, -1);
154 }
155
156 void connectToSceneEnvironmentStrongLight(LiveActor *pActor) {
157 MR::registerNameObjToExecuteHolder(reinterpret_cast<NameObj*>(pActor), 0x21, 4, 7, -1);
158 }
159
160 void connectToClippedMapParts(LiveActor *pActor) {
161 MR::registerNameObjToExecuteHolder(reinterpret_cast<NameObj*>(pActor), 0x1C, 0, 0, -1);
162 }
163
164 void connectToSceneEnemyDecoration(LiveActor *pActor) {
165 MR::registerNameObjToExecuteHolder(reinterpret_cast<NameObj*>(pActor), 0x2B, 0xB, 0x13, -1);
166 }
167
168 void connectToSceneEnemyDecorationMovement(NameObj *pObj) {
169 MR::registerNameObjToExecuteHolder(pObj, 0x2B, -1, -1, -1);
170 MR::connectToSceneTemporarily(pObj);
171 MR::connectToDrawTemporarily(pObj);
172 }
173
174 void connectToSceneEnemyDecorationMovementCalcAnim(NameObj *pObj) {
175 MR::registerNameObjToExecuteHolder(pObj, 0x2B, 0x11, -1, -1);
176 MR::connectToSceneTemporarily(pObj);
177 MR::connectToDrawTemporarily(pObj);
178 }
179
180 void connectToSceneItem(LiveActor *pActor) {
181 MR::registerNameObjToExecuteHolder(reinterpret_cast<NameObj*>(pActor), 0x2C, 0x10, 0xD, -1);
182 }
183
184 void connectToSceneItemStrongLight(LiveActor *pActor) {
185 MR::registerNameObjToExecuteHolder(reinterpret_cast<NameObj*>(pActor), 0x2C, 0x10, 0xF, -1);
186 }
187
188 void connectToSceneIndirectEnemy(LiveActor *pActor) {
189 MR::registerNameObjToExecuteHolder(reinterpret_cast<NameObj*>(pActor), 0x2A, 8, 0x1C, -1);
190 }
191
192 void connectToSceneIndirectNpc(LiveActor *pActor) {
193 MR::registerNameObjToExecuteHolder(reinterpret_cast<NameObj*>(pActor), 0x28, 6, 0x1B, -1);
194 }
195
196 void connectToSceneIndirectMapObj(LiveActor *pActor) {
197 MR::registerNameObjToExecuteHolder(reinterpret_cast<NameObj*>(pActor), 0x22, 5, 0x19, -1);
198 }
199
200 void connectToSceneIndirectMapObjStrongLight(LiveActor *pActor) {
201 MR::registerNameObjToExecuteHolder(reinterpret_cast<NameObj*>(pActor), 0x22, 5, 0x1A, -1);
202 }
203
204 void connectToSceneScreenEffectMovement(NameObj *pObj) {
205 MR::registerNameObjToExecuteHolder(pObj, 3, -1, -1, -1);
206 MR::connectToSceneTemporarily(pObj);
207 MR::connectToDrawTemporarily(pObj);
208 }
209
210 void connectToSceneAreaObj(NameObj *pObj) {
211 MR::registerNameObjToExecuteHolder(pObj, 0xD, -1, -1, -1);
212 MR::connectToSceneTemporarily(pObj);
213 MR::connectToDrawTemporarily(pObj);
214 }
215
216 NameObjAdaptor* createDrawAdaptor(const char *pName, const MR::FunctorBase &rFunctor) {
217 NameObjAdaptor* adaptor = new NameObjAdaptor(pName);
218 adaptor->connectToDraw(rFunctor);
219 return adaptor;
220 }
221
222 NameObjAdaptor* createAdaptorAndConnectToDrawBloomModel(const char *pName, const MR::FunctorBase &rFunctor) {
223 NameObjAdaptor* adaptor = new NameObjAdaptor(pName);
224 adaptor->connectToDraw(rFunctor);
225 MR::registerNameObjToExecuteHolder(adaptor, -1, -1, -1, 0x36);
226 MR::connectToSceneTemporarily(adaptor);
227 MR::connectToDrawTemporarily(adaptor);
228 return adaptor;
229 }
230
231 ResourceHolder* createAndAddResourceHolder(const char* pResource) {
232 return SingletonHolder<ResourceHolderManager>::sInstance->createAndAdd(pResource, nullptr);
233 }
234
235 void* loadResourceFromArc(const char* pArchive, const char* pFile) {
236 ResourceHolder* holder = createAndAddResourceHolder(pArchive);
237 return holder->mFileInfoTable->getRes(pFile);
238 }
239
240 bool isExistResourceInArc(const char* pArchive, const char* pFile) {
241 ResourceHolder* holder = createAndAddResourceHolder(pArchive);
242 return holder->mFileInfoTable->isExistRes(pFile);
243 }
244
245 const ResTIMG* loadTexFromArc(const char* pArchive, const char* pFile) {
246 return static_cast<const ResTIMG*>(loadResourceFromArc(pArchive, pFile));
247 }
248
249 const ResTIMG* loadTexFromArc(const char* pArchive) {
250 char arcBuf[0x100];
251 snprintf(arcBuf, 0x100, "%s.arc", pArchive);
252 char texBuf[0x100];
253 snprintf(texBuf, 0x100, "%s.bti", pArchive);
254 return loadTexFromArc(arcBuf, texBuf);
255 }
256
257 const JMapInfo* createCsvParser(const ResourceHolder* pHolder, const char* pFormat, ...) {
258 va_list list;
259 va_start(list, pFormat);
260 return ::tryCreateCsvParserLocal(pHolder, pFormat, list);
261 }
262
263 const JMapInfo* createCsvParser(const char *pArchive, const char *pFormat, ...) {
264 ResourceHolder* holder = SingletonHolder<ResourceHolderManager>::sInstance->createAndAdd(pArchive, nullptr);
265 return MR::createCsvParser(holder, pFormat);
266 }
267
268 // MR::tryCreateCsvParser
269
270 s32 getCsvDataElementNum(const JMapInfo *pMapInfo) {
271 if (pMapInfo->mData != nullptr) {
272 return pMapInfo->mData->mNumEntries;
273 }
274
275 return 0;
276 }
277
278 void getCsvDataStr(const char **pOut , const JMapInfo *pMapInfo, const char *pKey, s32 idx) {
279 int v7 = pMapInfo->searchItemInfo(pKey);
280
281 if (v7 >= 0) {
282 pMapInfo->getValueFast(idx, v7, pOut);
283 }
284 }
285
286 void getCsvDataStrOrNULL(const char **pOut, const JMapInfo *pMapInfo, const char *pKey, s32 idx) {
287 getCsvDataStr(pOut, pMapInfo, pKey, idx);
288 if (*pOut[0] == 0) {
289 *pOut = nullptr;
290 }
291 }
292
293 void getCsvDataS32(s32 *pOut, const JMapInfo *pMapInfo, const char *pKey, s32 idx) {
294 pMapInfo->getValue<s32>(idx, pKey, pOut);
295 }
296
297 void getCsvDataU8(u8 *pOut, const JMapInfo *pMapInfo, const char *pKey, s32 idx) {
298 s32 val = 0;
299 pMapInfo->getValue<s32>(idx, pKey, &val);
300 *pOut = val;
301 }
302
303 #ifdef NON_MATCHING
304 void getCsvDataF32(f32 *pOut, const JMapInfo *pMapInfo, const char *pKey, s32 idx) {
305 int v7 = pMapInfo->searchItemInfo(pKey);
306
307 if (v7 >= 0) {
308 *pOut = *((f32*)(pMapInfo->mData->mNumEntries + pMapInfo->mData->mDataOffset + idx * (pMapInfo->mData->mEntrySize + static_cast<const JMapItem*>(&pMapInfo->mData->mItems)[v7].mOffsData)));
309 }
310 }
311 #endif
312
313 // MR::getCsvDataBool
314
315};
The basis of a drawable actor that can contain states (see: Nerve)
Definition LiveActor.hpp:24
Implementation of a NameObj that stores function pointers to movement, calcAnim, calcView,...
The most basic form of an object.
Definition NameObj.hpp:11