1#include "Game/Util/JMapUtil.hpp"
2#include "Game/Util.hpp"
3#include "math_types.hpp"
8 bool getJMapInfoRailArg(
const JMapInfoIter &rIter,
const char *pName, s32 *pOut) NO_INLINE {
10 bool hasValue = rIter.getValue<s32>(pName, &val);
24 bool getJMapInfoArgNoInit(
const JMapInfoIter &rIter,
const char *pName, s32 *pOut) NO_INLINE {
26 bool hasValue = rIter.getValue<s32>(pName, &val);
40 bool getJMapInfoArgNoInit(
const JMapInfoIter &rIter,
const char *pName, f32 *pOut) NO_INLINE {
42 bool hasValue = ::getJMapInfoArgNoInit(rIter, pName, &val);
52 bool getJMapInfoArgNoInit(
const JMapInfoIter &rIter,
const char *pName,
bool *pOut) NO_INLINE {
54 bool hasValue = rIter.getValue<s32>(pName, &val);
73 return rIter.isValid();
76 bool isObjectName(
const JMapInfoIter &rIter,
const char *pName) {
77 const char *objName =
nullptr;
78 if (MR::getObjectName(&objName, rIter)) {
79 return MR::isEqualString(pName, objName);
85 inline bool getArgAndInit(
const JMapInfoIter &rIter,
const char *pName, s32 *pOut) {
87 return ::getJMapInfoArgNoInit(rIter, pName, pOut);
90 inline bool getArgAndInit(
const JMapInfoIter &rIter,
const char *pName, f32 *pOut) {
92 return ::getJMapInfoArgNoInit(rIter, pName, pOut);
95 inline bool getArgAndInit(
const JMapInfoIter &rIter,
const char *pName,
bool *pOut) {
97 return ::getJMapInfoArgNoInit(rIter, pName, pOut);
102 bool getJMapInfoTrans(
const JMapInfoIter &rIter, TVec3f *pOut) {
103 if (!getJMapInfoTransLocal(rIter, pOut)) {
107 if (isPlacementLocalStage()) {
108 getZonePlacementMtx(rIter)->mult(*pOut, *pOut);
114 bool getJMapInfoRotate(
const JMapInfoIter &rIter, TVec3f *pOut) {
115 if (!getJMapInfoRotateLocal(rIter, pOut)) {
119 if (isPlacementLocalStage()) {
121 makeMtxRotate(rotateMtx.toMtxPtr(), *pOut);
122 TMtx34f* placementMtx = getZonePlacementMtx(rIter);
123 rotateMtx.concat(*placementMtx, rotateMtx);
125 if (-0.001f <= rotateMtx.mMtx[2][0] - 1.0f) {
126 pOut->x = std::atan2(-rotateMtx.mMtx[0][1], rotateMtx.mMtx[1][1]);
127 pOut->y = -1.5707964f;
130 else if (rotateMtx.mMtx[2][0] + 1.0f <= 0.001f) {
131 pOut->x = std::atan2(rotateMtx.mMtx[0][1], rotateMtx.mMtx[1][1]);
132 pOut->y = 1.5707964f;
136 pOut->x = std::atan2(rotateMtx.mMtx[2][1], rotateMtx.mMtx[2][2]);
137 pOut->z = std::atan2(rotateMtx.mMtx[1][0], rotateMtx.mMtx[0][0]);
138 pOut->y = asin(-rotateMtx.mMtx[2][0]);
142 stack_8.setInlinePS(*pOut);
143 stack_8.x *= 57.29578f;
144 stack_8.y *= 57.29578f;
145 stack_8.z *= 57.29578f;
146 pOut->setInlinePS(stack_8);
152 bool getJMapInfoMatrixFromRT(
const JMapInfoIter &rIter, TPos3f *pOut) {
154 if (!getJMapInfoTrans(rIter, &trans)) {
159 if (!getJMapInfoRotate(rIter, &rot)) {
163 makeMtxTR(pOut->toMtxPtr(), trans, rot);
167 bool getJMapInfoArg0WithInit(
const JMapInfoIter &rIter, s32 *pOut) {
168 return getArgAndInit(rIter,
"Obj_arg0", pOut);
171 bool getJMapInfoArg0WithInit(
const JMapInfoIter &rIter, f32 *pOut) {
172 return getArgAndInit(rIter,
"Obj_arg0", pOut);
175 bool getJMapInfoArg0WithInit(
const JMapInfoIter &rIter,
bool *pOut) {
176 return getArgAndInit(rIter,
"Obj_arg0", pOut);
179 bool getJMapInfoArg1WithInit(
const JMapInfoIter &rIter, f32 *pOut) {
180 return getArgAndInit(rIter,
"Obj_arg1", pOut);
183 bool getJMapInfoArg1WithInit(
const JMapInfoIter &rIter,
bool *pOut) {
184 return getArgAndInit(rIter,
"Obj_arg1", pOut);
187 bool getJMapInfoArg2WithInit(
const JMapInfoIter &rIter, f32 *pOut) {
188 return getArgAndInit(rIter,
"Obj_arg2", pOut);
191 bool getJMapInfoArg2WithInit(
const JMapInfoIter &rIter,
bool *pOut) {
192 return getArgAndInit(rIter,
"Obj_arg2", pOut);
195 bool getJMapInfoArg3WithInit(
const JMapInfoIter &rIter, f32 *pOut) {
196 return getArgAndInit(rIter,
"Obj_arg3", pOut);
199 bool getJMapInfoArg3WithInit(
const JMapInfoIter &rIter,
bool *pOut) {
200 return getArgAndInit(rIter,
"Obj_arg3", pOut);
203 bool getJMapInfoArg4WithInit(
const JMapInfoIter &rIter,
bool *pOut) {
204 return getArgAndInit(rIter,
"Obj_arg4", pOut);
207 bool getJMapInfoArg7WithInit(
const JMapInfoIter &rIter,
bool *pOut) {
208 return getArgAndInit(rIter,
"Obj_arg7", pOut);
211 bool getJMapInfoArg0NoInit(
const JMapInfoIter &rIter, s32 *pOut) {
212 return ::getJMapInfoArgNoInit(rIter,
"Obj_arg0", pOut);
215 bool getJMapInfoArg0NoInit(
const JMapInfoIter &rIter, f32 *pOut) {
216 return ::getJMapInfoArgNoInit(rIter,
"Obj_arg0", pOut);
219 bool getJMapInfoArg0NoInit(
const JMapInfoIter &rIter,
bool *pOut) {
220 return ::getJMapInfoArgNoInit(rIter,
"Obj_arg0", pOut);
223 bool getJMapInfoArg1NoInit(
const JMapInfoIter &rIter, s32 *pOut) {
224 return ::getJMapInfoArgNoInit(rIter,
"Obj_arg1", pOut);
227 bool getJMapInfoArg1NoInit(
const JMapInfoIter &rIter, f32 *pOut) {
228 return ::getJMapInfoArgNoInit(rIter,
"Obj_arg1", pOut);
231 bool getJMapInfoArg1NoInit(
const JMapInfoIter &rIter,
bool *pOut) {
232 return ::getJMapInfoArgNoInit(rIter,
"Obj_arg1", pOut);
235 bool getJMapInfoArg2NoInit(
const JMapInfoIter &rIter, s32 *pOut) {
236 return ::getJMapInfoArgNoInit(rIter,
"Obj_arg2", pOut);
239 bool getJMapInfoArg2NoInit(
const JMapInfoIter &rIter, f32 *pOut) {
240 return ::getJMapInfoArgNoInit(rIter,
"Obj_arg2", pOut);
243 bool getJMapInfoArg2NoInit(
const JMapInfoIter &rIter,
bool *pOut) {
244 return ::getJMapInfoArgNoInit(rIter,
"Obj_arg2", pOut);
247 bool getJMapInfoArg3NoInit(
const JMapInfoIter &rIter, s32 *pOut) {
248 return ::getJMapInfoArgNoInit(rIter,
"Obj_arg3", pOut);
251 bool getJMapInfoArg3NoInit(
const JMapInfoIter &rIter, f32 *pOut) {
252 return ::getJMapInfoArgNoInit(rIter,
"Obj_arg3", pOut);
255 bool getJMapInfoArg3NoInit(
const JMapInfoIter &rIter,
bool *pOut) {
256 return ::getJMapInfoArgNoInit(rIter,
"Obj_arg3", pOut);
259 bool getJMapInfoArg4NoInit(
const JMapInfoIter &rIter, s32 *pOut) {
260 return ::getJMapInfoArgNoInit(rIter,
"Obj_arg4", pOut);
263 bool getJMapInfoArg4NoInit(
const JMapInfoIter &rIter, f32 *pOut) {
264 return ::getJMapInfoArgNoInit(rIter,
"Obj_arg4", pOut);
267 bool getJMapInfoArg4NoInit(
const JMapInfoIter &rIter,
bool *pOut) {
268 return ::getJMapInfoArgNoInit(rIter,
"Obj_arg4", pOut);
271 bool getJMapInfoArg5NoInit(
const JMapInfoIter &rIter, s32 *pOut) {
272 return ::getJMapInfoArgNoInit(rIter,
"Obj_arg5", pOut);
275 bool getJMapInfoArg5NoInit(
const JMapInfoIter &rIter, f32 *pOut) {
276 return ::getJMapInfoArgNoInit(rIter,
"Obj_arg5", pOut);
279 bool getJMapInfoArg5NoInit(
const JMapInfoIter &rIter,
bool *pOut) {
280 return ::getJMapInfoArgNoInit(rIter,
"Obj_arg5", pOut);
283 bool getJMapInfoArg6NoInit(
const JMapInfoIter &rIter, s32 *pOut) {
284 return ::getJMapInfoArgNoInit(rIter,
"Obj_arg6", pOut);
287 bool getJMapInfoArg6NoInit(
const JMapInfoIter &rIter, f32 *pOut) {
288 return ::getJMapInfoArgNoInit(rIter,
"Obj_arg6", pOut);
291 bool getJMapInfoArg6NoInit(
const JMapInfoIter &rIter,
bool *pOut) {
292 return ::getJMapInfoArgNoInit(rIter,
"Obj_arg6", pOut);
295 bool getJMapInfoArg7NoInit(
const JMapInfoIter &rIter, s32 *pOut) {
296 return ::getJMapInfoArgNoInit(rIter,
"Obj_arg7", pOut);
299 bool getJMapInfoArg7NoInit(
const JMapInfoIter &rIter, f32 *pOut) {
300 return ::getJMapInfoArgNoInit(rIter,
"Obj_arg7", pOut);
303 bool getJMapInfoArg7NoInit(
const JMapInfoIter &rIter,
bool *pOut) {
304 return ::getJMapInfoArgNoInit(rIter,
"Obj_arg7", pOut);
307 bool isEqualObjectName(
const JMapInfoIter &rIter,
const char *pOtherName) {
309 getObjectName(&objName, rIter);
310 return isEqualStringCase(objName, pOtherName);
315 rIter.getValue<s32>(
"DemoGroupId", &groupID);
321 rIter.getValue<s32>(
"l_id", &linkID);
325 bool getJMapInfoRailArg0NoInit(
const JMapInfoIter &rIter, s32 *pRailArg0) {
326 return ::getJMapInfoRailArg(rIter,
"path_arg0", pRailArg0);
329 bool getRailId(
const JMapInfoIter &rIter, s32 *pRailID) {
330 return getArgAndInit(rIter,
"CommonPath_ID", pRailID);
333 bool getObjectName(
const char **pName,
const JMapInfoIter &rIter) {
334 if (!rIter.isValid()) {
338 if (rIter.getValue<
const char *>(
"type", pName)) {
342 return rIter.getValue<
const char*>(
"name", pName);
346 if (!rIter.isValid()) {
351 return rIter.getValue<s32>(
"Obj_arg0", &val);
354 bool getJMapInfoShapeIdWithInit(
const JMapInfoIter &rIter, s32 *pShapeID) {
355 return rIter.getValue<s32>(
"ShapeModelNo", pShapeID);
359 bool getJMapInfoTransLocal(
const JMapInfoIter &rIter, TVec3f *pOut) {
360 if (!MR::getValue<f32>(rIter,
"pos_x", &pOut->x)) {
363 else if (!MR::getValue<f32>(rIter,
"pos_y", &pOut->y)) {
367 return MR::getValue<f32>(rIter,
"pos_z", &pOut->z);
370 bool getJMapInfoRotateLocal(
const JMapInfoIter &rIter, TVec3f *pOut) {
371 if (!MR::getValue<f32>(rIter,
"dir_x", &pOut->x)) {
374 else if (!MR::getValue<f32>(rIter,
"dir_y", &pOut->y)) {
378 return MR::getValue<f32>(rIter,
"dir_z", &pOut->z);
381 bool getJMapInfoScale(
const JMapInfoIter &rIter, TVec3f *pOut) {
382 if (!MR::getValue<f32>(rIter,
"scale_x", &pOut->x)) {
385 else if (!MR::getValue<f32>(rIter,
"scale_y", &pOut->y)) {
389 return MR::getValue<f32>(rIter,
"scale_z", &pOut->z);
392 bool getJMapInfoV3f(
const JMapInfoIter &rIter,
const char *pName, TVec3f *pOut) {
394 sprintf(str,
"%sX", pName);
396 if (!MR::getValue<f32>(rIter, str, &pOut->x)) {
400 sprintf(str,
"%sY", pName);
402 if (!MR::getValue<f32>(rIter, str, &pOut->y)) {
406 sprintf(str,
"%sZ", pName);
407 return MR::getValue<f32>(rIter, str, &pOut->z);
410 bool getJMapInfoArg1WithInit(
const JMapInfoIter &rIter, s32 *pOut) {
411 return MR::getArgAndInit(rIter,
"Obj_arg1", pOut);
414 bool getJMapInfoArg2WithInit(
const JMapInfoIter &rIter, s32 *pOut) {
415 return MR::getArgAndInit(rIter,
"Obj_arg2", pOut);
418 bool getJMapInfoArg3WithInit(
const JMapInfoIter &rIter, s32 *pOut) {
419 return MR::getArgAndInit(rIter,
"Obj_arg3", pOut);
422 bool getJMapInfoArg4WithInit(
const JMapInfoIter &rIter, s32 *pOut) {
423 return MR::getArgAndInit(rIter,
"Obj_arg4", pOut);
426 bool getJMapInfoArg5WithInit(
const JMapInfoIter &rIter, s32 *pOut) {
427 return MR::getArgAndInit(rIter,
"Obj_arg5", pOut);
430 bool getJMapInfoArg6WithInit(
const JMapInfoIter &rIter, s32 *pOut) {
431 return MR::getArgAndInit(rIter,
"Obj_arg6", pOut);
434 bool getJMapInfoArg7WithInit(
const JMapInfoIter &rIter, s32 *pOut) {
435 return MR::getArgAndInit(rIter,
"Obj_arg7", pOut);
438 bool getJMapInfoFollowID(
const JMapInfoIter &rIter, s32 *pOut) {
439 return MR::getArgAndInit(rIter,
"FollowId", pOut);
442 bool getJMapInfoGroupID(
const JMapInfoIter &rIter, s32 *pOut) {
443 if (MR::getArgAndInit(rIter,
"GroupId", pOut)) {
447 return MR::getJMapInfoClippingGroupID(rIter, pOut);
450 bool getJMapInfoClippingGroupID(
const JMapInfoIter &rIter, s32 *pOut) {
451 return MR::getArgAndInit(rIter,
"ClippingGroupId", pOut);
454 bool getJMapInfoDemoGroupID(
const JMapInfoIter &rIter, s32 *pOut) {
455 return MR::getArgAndInit(rIter,
"DemoGroupId", pOut);
458 bool getJMapInfoLinkID(
const JMapInfoIter &rIter, s32 *pOut) {
459 return rIter.getValue<s32>(
"l_id", pOut);
463 if (!rIter.isValid()) {
468 return !MR::getArgAndInit(rIter,
"CommonPath_ID", &
id) ? false :
id != -1;
472 if (!rIter.isValid()) {
477 MR::getArgAndInit(rIter,
"SW_A", &
id);
482 if (!rIter.isValid()) {
487 MR::getArgAndInit(rIter,
"SW_B", &
id);
491 bool isExistStageSwitchAppear(
const JMapInfoIter &rIter) {
492 if (!rIter.isValid()) {
497 MR::getArgAndInit(rIter,
"SW_APPEAR", &
id);
501 bool isExistStageSwitchDead(
const JMapInfoIter &rIter) {
502 if (!rIter.isValid()) {
507 MR::getArgAndInit(rIter,
"SW_DEAD", &
id);
511 bool isExistStageSwitchSleep(
const JMapInfoIter &rIter) {
512 if (!rIter.isValid()) {
517 MR::getArgAndInit(rIter,
"SW_SLEEP", &
id);
521 bool getJMapInfoCameraSetID(
const JMapInfoIter &rIter, s32 *pOut) {
524 if (!rIter.isValid()) {
528 return ::getJMapInfoArgNoInit(rIter,
"CameraSetId", pOut);
531 bool getJMapInfoViewGroupID(
const JMapInfoIter &rIter, s32 *pOut) {
534 if (!rIter.isValid()) {
538 return ::getJMapInfoArgNoInit(rIter,
"ViewGroupId", pOut);
541 bool getJMapInfoMessageID(
const JMapInfoIter &rIter, s32 *pOut) {
544 if (!rIter.isValid()) {
548 return ::getJMapInfoArgNoInit(rIter,
"MessageId", pOut);
553 rIter.getValue<s32>(
"CastId", &id);
558 const char* name =
nullptr;
559 rIter.getValue<
const char *>(
"DemoName", &name);
563 const char* getDemoSheetName(
const JMapInfoIter &rIter) {
564 const char* name =
nullptr;
565 rIter.getValue<
const char *>(
"TimeSheetName", &name);
569 bool getNextLinkRailID(
const JMapInfoIter &rIter, s32 *pOut) {
570 return rIter.getValue<s32>(
"Path_ID", pOut);
573 bool isEqualRailUsage(
const JMapInfoIter &rIter,
const char *pUsage) {
574 const char* str =
nullptr;
575 rIter.getValue<
const char *>(
"usage", &str);
576 return isEqualStringCase(str, pUsage);
579 void getRailPointPos0(
const JMapInfoIter &rIter, TVec3f *pOut) {
580 rIter.getValue<f32>(
"pnt0_x", &pOut->x);
581 rIter.getValue<f32>(
"pnt0_y", &pOut->y);
582 rIter.getValue<f32>(
"pnt0_z", &pOut->z);
584 if (isPlacementLocalStage()) {
585 getZonePlacementMtx(rIter)->mult(*pOut, *pOut);
589 void getRailPointPos1(
const JMapInfoIter &rIter, TVec3f *pOut) {
590 rIter.getValue<f32>(
"pnt1_x", &pOut->x);
591 rIter.getValue<f32>(
"pnt1_y", &pOut->y);
592 rIter.getValue<f32>(
"pnt1_z", &pOut->z);
594 if (isPlacementLocalStage()) {
595 getZonePlacementMtx(rIter)->mult(*pOut, *pOut);
599 void getRailPointPos2(
const JMapInfoIter &rIter, TVec3f *pOut) {
600 rIter.getValue<f32>(
"pnt2_x", &pOut->x);
601 rIter.getValue<f32>(
"pnt2_y", &pOut->y);
602 rIter.getValue<f32>(
"pnt2_z", &pOut->z);
604 if (isPlacementLocalStage()) {
605 getZonePlacementMtx(rIter)->mult(*pOut, *pOut);
610 const char* status =
"";
611 rIter.getValue<
const char *>(
"closed", &status);
612 return isEqualString(status,
"CLOSE");