#include "global.h" THUMB_BEGIN #include "Actor/ActorManager.hpp" #include "Cutscene/Cutscene.hpp" #include "Game/GameModeManager.hpp" #include "MainGame/AdventureMode.hpp" #include "MainGame/MiscAdvManager.hpp" #include "MapObject/MapObjectManager.hpp" #include "System/OverlayManager.hpp" #include "System/SysNew.hpp" #include "Unknown/UnkStruct_0204a110.hpp" #include "Unknown/UnkStruct_0204e5f8.hpp" #include "Unknown/UnkStruct_027e0954.hpp" #include "Unknown/UnkStruct_027e0958.hpp" #include "Unknown/UnkStruct_027e095c.hpp" #include "Unknown/UnkStruct_027e0960.hpp" #include "Unknown/UnkStruct_027e09a0.hpp" #include "Unknown/UnkStruct_027e09a4.hpp" #include "Unknown/UnkStruct_027e09ac.hpp" #include "Unknown/UnkStruct_027e09b8.hpp" #include "Unknown/UnkStruct_027e09bc.hpp" #include "Unknown/UnkStruct_027e09c0.hpp" #include "Unknown/UnkStruct_027e0cd8.hpp" #include "Unknown/UnkStruct_027e0ce0.hpp" #include "Unknown/UnkStruct_027e0cec.hpp" #include "Unknown/UnkStruct_027e0cf8.hpp" #include "Unknown/UnkStruct_ov000_02067bc4.hpp" #include "Unknown/UnkStruct_ov000_020b50c0.hpp" #include "versions.h" #include #include extern "C" void func_ov001_020bed34(); extern "C" void func_01fff17c(unk16 *, UnkStruct_027e0ce0 *, unk32); extern "C" u16 func_ov026_02106564(void *); extern const OverlayIndex data_ov000_020b21c4[]; extern const OverlayIndex data_ov000_020b21e0[]; struct UnkStruct_ov000_020aa88c { /* 00 */ bool mUnk_00; /* 01 */ bool mUnk_01; /* 02 */ bool mUnk_02; /* 03 */ bool mUnk_03; /* 04 */ unk16 mUnk_04; /* 06 */ u16 mUnk_06; /* 08 */ }; extern UnkStruct_ov000_020aa88c data_ov000_020aa88c[]; static const SceneIndex_Halfs data_ov001_020c25c0[10] = { SceneIndex_t_area1, SceneIndex_t_area0, SceneIndex_t_area0, SceneIndex_t_area0, SceneIndex_t_area0, SceneIndex_t_area1, SceneIndex_t_area2, SceneIndex_t_area3, SceneIndex_t_area1, SceneIndex_t_area2, }; static const u32 data_ov001_020c25fc[10] = { 0x11, 0x12, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x10, 0x1D, }; static const SceneIndex data_ov001_020c25d4[10] = { SceneIndex_f_bridge, SceneIndex_f_bridge2, SceneIndex_f_htown, SceneIndex_f_first, SceneIndex_f_forest1, SceneIndex_f_snow, SceneIndex_f_water, SceneIndex_f_flame5, SceneIndex_f_tetsuo, SceneIndex_f_ajito, }; UnkStruct_027e09a4 *UnkStruct_027e09a4::Create(unk32 param1) { return new(HeapIndex_1) UnkStruct_027e09a4(param1); } UnkStruct_027e09a4::UnkStruct_027e09a4(unk32 param1) { this->mUnk_28 = 0; this->mUnk_54 = NULL; this->mpWarpUnk1 = NULL; this->mUnk_5C = 0; this->mUnk_60 = param1; this->mUnk_64 = 0; UnkStruct_027e09a0::Create(); UnkStruct_027e09c0::Create(); UnkStruct_027e09bc::Create(); UnkStruct_027e0cd8::Create(); UnkStruct_027e0ce0::Create(); ActorManager::Create(); MapObjectManager::Create(); UnkStruct_027e0960::Create(); UnkStruct_027e09b8::Create(); UnkStruct_027e09ac::Create(); UnkStruct_027e0954::Create(); UnkStruct_027e0958::Create(); if (this->mUnk_60 == 0) { MiscAdvManager::Create(); } TreasureManager::Create(); this->mUnk_2C.mSceneIndex = SceneIndex_t_area0; this->mUnk_2C.mUnk_02 = 0x00; this->mUnk_2C.mUnk_04.x = FLOAT_TO_FX32(0.0f); this->mUnk_2C.mUnk_04.y = FLOAT_TO_FX32(0.0f); this->mUnk_2C.mUnk_04.z = FLOAT_TO_FX32(0.0f); this->mUnk_2C.mUnk_10 = 0x00; this->mUnk_40 = this->mUnk_2C; this->mpWarpUnk1 = new(HeapIndex_1) UnkStruct_WarpUnk1(); } void UnkStruct_027e09a4::func_ov001_020b662c() { UnkStruct_WarpUnk1 *ptr = this->mpWarpUnk1; ptr->mUnk_78 = this->mUnk_00; this->mUnk_14 = this->mUnk_00; this->func_ov001_020b6758(&this->mUnk_00, false); } void UnkStruct_027e09a4::func_ov001_020b66dc() { data_02049ba0.Unload(OverlaySlot_10); data_02049ba0.Unload(OverlaySlot_9); //! TODO: ??? UnkStruct_WarpUnk1 *ptr = this->mpWarpUnk1; if (ptr != NULL) { ptr->UnkStruct_WarpUnk1::~UnkStruct_WarpUnk1(); ::operator delete(ptr); } TreasureManager::Destroy(); if (this->mUnk_60 == 0) { MiscAdvManager::Destroy(); } UnkStruct_027e0958::Destroy(); UnkStruct_027e0954::Destroy(); UnkStruct_027e09ac::Destroy(); UnkStruct_027e09b8::Destroy(); UnkStruct_027e0960::Destroy(); MapObjectManager::Destroy(); ActorManager::Destroy(); UnkStruct_027e0ce0::Destroy(); UnkStruct_027e0cd8::Destroy(); UnkStruct_027e09bc::Destroy(); UnkStruct_027e09c0::Destroy(); UnkStruct_027e09a0::Destroy(); } void UnkStruct_027e09a4::func_ov001_020b6758(const UnkStruct_SceneChange1 *param1, bool param2) { OverlayIndex index; unk32 unk_10; this->mUnk_00 = *param1; unk_10 = this->GetCurrentCourseEntry()->unk_10; UnkStruct_027e095c::Create(); index = data_ov000_020b21c4[unk_10]; if (index != OverlayIndex_None) { data_02049ba0.func_02014918(index); } index = data_ov000_020b21e0[unk_10]; if (index != OverlayIndex_None) { data_02049ba0.LoadIfNotLoaded(OverlaySlot_7, index); } switch (unk_10) { case 0: this->mUnk_54 = new(HeapIndex_1) UnkStruct_027e09a4_54_Type1(this); break; case 1: case 3: this->mUnk_54 = new(HeapIndex_1) UnkStruct_027e09a4_54_Type5(this); break; case 6: this->mUnk_54 = new(HeapIndex_1) UnkStruct_027e09a4_54_Type4(this); break; case 2: case 4: this->mUnk_54 = new(HeapIndex_1) UnkStruct_027e09a4_54_Type2(this); data_0204999c.mUnk_60 = 0xFFDC; break; case 5: this->mUnk_54 = new(HeapIndex_1) UnkStruct_027e09a4_54_Type3(this); break; default: break; } if (param2) { this->mUnk_54->mUnk_32 = true; } if (this->IsCutscene()) { data_027e09b8->func_ov001_020b76c0(param1->mCutsceneIndex); } this->mUnk_54->func_ov001_020b6fa0(this->GetCurrentCourseEntry()); } void UnkStruct_027e09a4::func_ov001_020b68a4(bool param1, bool param2, bool param3) { this->mUnk_54->func_ov001_020b7048(); DELETE(this->mUnk_54); if (param3) { data_02049ba0.Unload(OverlaySlot_8); data_02049ba0.Unload(OverlaySlot_11); } if (param2) { data_02049ba0.Unload(OverlaySlot_7); } if (param1) { if (gOverlayManager.mLoadedOverlays[9] != OverlayIndex_Land2) { data_02049ba0.Unload(OverlaySlot_10); data_02049ba0.Unload(OverlaySlot_9); } data_02049ba0.Unload(OverlaySlot_6); data_02049ba0.Unload(OverlaySlot_3); } UnkStruct_027e095c::Destroy(); } void UnkStruct_027e09a4::func_ov001_020b6924(const UnkStruct_SceneChange1 *param1, bool param2) { unk32 iVar5; unk32 iVar6; u8 cVar1; u8 cVar2; iVar6 = this->GetCurrentCourseEntry()->unk_10; iVar5 = data_027e09a0->GetCourseEntry(param1->mSceneIndex)->unk_10; cVar1 = data_027e09a0->GetCourseEntry(this->CurrentSceneIndex())->unk_1C; cVar2 = data_027e09a0->GetCourseEntry(param1->mSceneIndex)->unk_1C; this->func_ov001_020b69b4(param1, param2); this->func_ov001_020b68a4(data_ov000_020b21c4[iVar5] != data_ov000_020b21c4[iVar6], data_ov000_020b21e0[iVar5] != data_ov000_020b21e0[iVar6], cVar1 != cVar2); this->func_ov001_020b6758(param1, param2); } void UnkStruct_027e09a4::func_ov001_020b69b4(const UnkStruct_SceneChange1 *param1, bool param2) { VecFx32 vec1; VecFx32 vec2; unk32 local_34; unk32 index; bool bVar1; bVar1 = false; index = -1; for (int i = 0; i < ARRAY_LEN(data_ov001_020c25d4); i++) { SceneIndex sceneIndex = data_ov001_020c25d4[i]; if (sceneIndex == param1->mSceneIndex) { bVar1 = true; index = i; } } if (param2) { this->mUnk_2C = this->mUnk_40; } else if (bVar1) { this->mUnk_2C.mSceneIndex = data_ov001_020c25c0[index]; GetAdventureModeManager()->func_ov024_020c6840(this->mUnk_2C.mSceneIndex); vec1.x = 0; vec1.y = 0; vec1.z = 0; data_027e0cf8->func_ov024_020c77c0(&vec1.x, &vec1.z, data_ov001_020c25fc[index]); this->mUnk_2C.mUnk_04.x = vec1.x; this->mUnk_2C.mUnk_04.y = vec1.y; this->mUnk_2C.mUnk_04.z = vec1.z; this->mUnk_2C.mUnk_02 = this->func_ov000_02070538()->mUnk_10; this->mUnk_2C.mUnk_10 = this->func_ov000_02070538()->mUnk_12; } else if (this->GetCurrentCourseEntry()->unk_10 == 2) { this->mUnk_2C.mSceneIndex = this->func_ov000_02070538()->mSceneIndex; this->mUnk_2C.mUnk_02 = this->func_ov000_02070538()->mUnk_10; VecFx32 *psVar4 = &this->func_ov000_02070538()->mUnk_04; this->mUnk_2C.mUnk_04.x = psVar4->x; this->mUnk_2C.mUnk_04.y = psVar4->y; this->mUnk_2C.mUnk_04.z = psVar4->z; this->mUnk_2C.mUnk_10 = this->func_ov000_02070538()->mUnk_12; } else { if (this->GetCurrentCourseEntry()->unk_10 == 4) { switch (param1->mSceneIndex) { case SceneIndex_d_water27: case SceneIndex_f_forest2: case SceneIndex_f_snow2: switch (param1->mSceneIndex) { case SceneIndex_d_water27: this->mUnk_2C.mSceneIndex = SceneIndex_t_area2; local_34 = 0x0D; break; case SceneIndex_f_forest2: this->mUnk_2C.mSceneIndex = SceneIndex_t_area0; local_34 = 0x07; break; case SceneIndex_f_snow2: this->mUnk_2C.mSceneIndex = SceneIndex_t_area1; local_34 = 0x08; break; default: break; } GetAdventureModeManager()->func_ov024_020c6840(this->mUnk_2C.mSceneIndex); vec2.x = 0; vec2.y = 0; vec2.z = 0; data_027e0cf8->func_ov024_020c77c0(&vec2.x, &vec2.z, local_34); this->mUnk_2C.mUnk_04.x = vec2.x; this->mUnk_2C.mUnk_04.y = vec2.y; this->mUnk_2C.mUnk_04.z = vec2.z; this->mUnk_2C.mUnk_02 = this->func_ov000_02070538()->mUnk_10; this->mUnk_2C.mUnk_10 = this->func_ov000_02070538()->mUnk_12; break; default: break; } } } } void TreasureManager::Destroy() { if (gpTreasureManager != NULL) { delete gpTreasureManager; } } void MiscAdvManager::Destroy() { if (gpMiscAdvManager != NULL) { delete gpMiscAdvManager; } } void UnkStruct_027e0960::Destroy() { if (data_027e0960 != NULL) { delete data_027e0960; } } void UnkStruct_027e09a0::Destroy() { if (data_027e09a0 != NULL) { delete data_027e09a0; } } void UnkStruct_027e095c::Destroy() { if (data_027e095c != NULL) { delete data_027e095c; } } void UnkStruct_027e0958::Destroy() { if (data_027e0958 != NULL) { delete data_027e0958; } } void UnkStruct_027e0954::Destroy() { if (data_027e0954 != NULL) { delete data_027e0954; } } void UnkStruct_027e09ac::Destroy() { if (data_027e09ac != NULL) { delete data_027e09ac; } } void UnkStruct_027e09b8::Destroy() { if (data_027e09b8 != NULL) { delete data_027e09b8; } } void UnkStruct_027e09bc::Destroy() { if (data_027e09bc != NULL) { delete data_027e09bc; } } void UnkStruct_027e0ce0::Destroy() { if (data_027e0ce0 != NULL) { delete data_027e0ce0; } } void MapObjectManager::Destroy() { if (gpMapObjManager != NULL) { delete gpMapObjManager; } } void ActorManager::Destroy() { if (gpActorManager != NULL) { delete gpActorManager; } } void UnkStruct_027e0cd8::Destroy() { if (data_027e0cd8 != NULL) { delete data_027e0cd8; } } DECL_INSTANCE_CTOR(UnkStruct_027e09a4, data_027e09a4); UnkStruct_027e0954_00::~UnkStruct_027e0954_00() {} DECL_INSTANCE_DTOR(UnkStruct_027e095c, data_027e095c); DECL_INSTANCE_DTOR(UnkStruct_027e0958, data_027e0958); DECL_INSTANCE_DTOR(UnkStruct_027e0954, data_027e0954); UnkStruct_027e09a4_54_Base::UnkStruct_027e09a4_54_Base(unk32 *param1) : mUnk_1C((s32) 0) { this->mUnk_04.Clear(); this->mUnk_0C[0] = L'\0'; this->mUnk_0C[7] = L'\0'; MI_CpuCopy32(param1, &this->mUnk_1C, sizeof(this->mUnk_1C)); this->mUnk_32 = false; } UnkStruct_027e09a4_54_Base::~UnkStruct_027e09a4_54_Base() { data_ov000_020b504c.func_ov001_020be8e0(); data_027e09b8->func_ov001_020b7700(); data_027e0960->func_ov000_0205a164(); data_027e09ac->func_ov001_020bec8c(); data_027e09bc->func_ov001_020babc8(); data_027e0ce0->func_ov001_020bc5f8(); data_027e09c0->func_ov001_020be3c4(); data_0204a110.func_ov001_020bd638(); data_ov000_020b50c0.func_ov001_020bde04(&this->mUnk_1C); func_ov001_020bed34(); } void UnkStruct_027e09a4_54_Base::vfunc_0C() { UnkStruct_027e0cec::Create(); data_ov000_020b50c0.func_ov001_020bd970(&this->mUnk_1C); data_0204a110.func_ov001_020bd5b0(); data_027e09c0->func_ov001_020be394(); data_027e0ce0->func_ov001_020bc524(this->mUnk_32); data_027e09bc->func_ov001_020bab5c(); data_027e09ac->func_ov001_020bebb8(); data_027e0960->func_ov000_0205a160(); } void UnkStruct_027e09a4_54_Base::func_ov001_020b6fa0(CourseListEntry *pCourseEntry) { if (this->mUnk_1C.mIsCS == true) { data_0204a110.func_02018d78(Cutscene_GetParamEntry(this->mUnk_1C.mCutsceneIndex)->mUnk_14); } else { if (data_027e09a4->mUnk_60 == 0) { if (data_027e09a4->IsDarkRealm()) { GetAdventureModeManager()->func_ov024_020c555c(2); } else { if (data_027e09a4->IsTrain()) { GetAdventureModeManager()->func_ov024_020c555c(1); } else { GetAdventureModeManager()->func_ov024_020c555c(0); } } } switch (pCourseEntry->unk_18) { case 0: data_0204a110.func_02018d78(0); break; case 1: data_0204a110.func_02018d78(1); break; default: break; } } strncpy((char *) this->mUnk_0C, pCourseEntry->name, sizeof(this->mUnk_0C) - 1); this->mUnk_30 = pCourseEntry->unk_1A; this->vfunc_0C(); data_027e0cd8->func_ov001_020b7830(&this->mUnk_1C); } void UnkStruct_027e09a4_54_Base::func_ov001_020b7048() { data_027e0cd8->func_ov001_020b7a7c(); } UnkStruct_WarpUnk1_24::UnkStruct_WarpUnk1_24() { this->mUnk_2A = false; } UnkStruct_WarpUnk1::UnkStruct_WarpUnk1() { this->mSpawnTransitionType = 0; this->mUnk_A0.mUnk_04.x = 0; this->mUnk_A0.mUnk_04.y = 0; this->mUnk_A0.mUnk_04.z = 0; this->mUnk_A0.mUnk_10 = 0; this->mUnk_A0.mSceneIndex = SceneIndex_None; this->mUnk_A0.mRoomIndex = (s8) ROOM_INDEX_NONE; this->mUnk_A0.mUnk_12 = 0; } // non-matching bool UnkStruct_WarpUnk1::func_ov001_020b7144() { bool iVar9; u16 uVar1; UnkStruct_027e0ce0_38 *pTrainPlayer; unk16 local_18; unk32 uVar8; bool bVar2; iVar9 = false; uVar1 = data_ov000_020aa88c[this->mSpawnTransitionType].mUnk_06; pTrainPlayer = data_027e0ce0->mUnk_38; if (pTrainPlayer == NULL) { VecFx32 *pPos = data_027e0ce0->func_01fff148(0); VecFx32_Copy(pPos, &this->mUnk_A0.mUnk_04); func_01fff17c(&local_18, data_027e0ce0, 0); this->mUnk_A0.mUnk_10 = local_18; } else { VecFx32 *pPos = &pTrainPlayer->mPos; VecFx32_Copy(pPos, &this->mUnk_A0.mUnk_04); this->mUnk_A0.mUnk_10 = pTrainPlayer->mUnk_056; this->mUnk_A0.mUnk_12 = func_ov026_02106564(NULL); } this->mUnk_A0.mSceneIndex = this->mUnk_78.mSceneIndex; this->mUnk_A0.mRoomIndex = this->mUnk_78.mRoomIndex; switch (this->mSpawnTransitionType) { case 0x04: case 0x05: break; case 0x02: case 0x1D: #if IS_JP case 0x29: #endif iVar9 = true; break; default: if (((this->mUnk_78.mSceneIndex != this->mUnk_8C.mSceneIndex) || (this->mUnk_8C.mIsCS == true) || (this->mUnk_78.mIsCS == true))) { iVar9 = true; } else { iVar9 = false; } break; } data_ov000_020b50c0.func_ov000_0206a014(); this->mUnk_78 = this->mUnk_8C; if (iVar9) { data_027e09a4->func_ov001_020b6924(&this->mUnk_8C, this->mSpawnTransitionType == 2); } else { data_027e0cd8->func_ov001_020b7c08(&this->mUnk_8C, &this->mUnk_A0); } uVar8 = 0; bVar2 = false; data_027e0cd8->mUnk_0C->func_ov001_020b8a5c(this->mUnk_8C.mSpawnIndex, 0); this->Detach(); this->mUnk_0C = false; //! TODO: find out why we need this LinkListImpl::Detach((LinkListNode *) ((u8 *) &this->mUnk_24 + 4)); this->mUnk_24.mUnk_0C = false; LinkListImpl::Detach((LinkListNode *) ((u8 *) &this->mUnk_50 + 4)); this->mUnk_50.mUnk_0C = false; if (this->mUnk_8C.mIsCS == true) { this->Detach(); this->mUnk_0C = false; } else { if (data_ov000_020aa88c[this->mSpawnTransitionType].mUnk_00) { if (data_027e09a4->GetCurrentCourseEntry()->unk_18 == 1) { this->mUnk_50.mUnk_18 = 0x00130000; this->mUnk_50.mUnk_1C = 0x00050000; this->mUnk_50.mUnk_24 = 0x00004000; this->mUnk_50.func_ov000_02065f68(0x02, 0x00, -0xE0, uVar1, 0x02); data_0204e5f8.func_0201b9a8(&this->mUnk_50); this->mUnk_1E = 0x02; this->func_0201bba4(0x00, 0x02); data_0204e5f8.func_0201b9a8(this); bVar2 = true; } else { this->mUnk_24.func_ov000_02070f58(uVar1); data_0204e5f8.func_0201b9a8(&this->mUnk_24); } } if ((data_ov000_020aa88c[this->mSpawnTransitionType].mUnk_01 || data_ov000_020aa88c[this->mSpawnTransitionType].mUnk_02) && !bVar2) { if (data_ov000_020aa88c[this->mSpawnTransitionType].mUnk_03) { this->mUnk_14 = 0x00010000; } else { this->mUnk_14 = 0xFFFF0000; } this->func_0201bba4(0x02, uVar1); this->mUnk_18 = data_ov000_020aa88c[this->mSpawnTransitionType].mUnk_01; this->mUnk_19 = data_ov000_020aa88c[this->mSpawnTransitionType].mUnk_02; data_0204e5f8.func_0201b9a8(this); } } return iVar9; } THUMB_END