diff --git a/config/eur/arm9/itcm/delinks.txt b/config/eur/arm9/itcm/delinks.txt index e6ad4257..d87fbca5 100644 --- a/config/eur/arm9/itcm/delinks.txt +++ b/config/eur/arm9/itcm/delinks.txt @@ -1,2 +1,5 @@ .text start:0x01ff8000 end:0x01fffe18 kind:code align:32 .bss start:0x01fffe20 end:0x01fffe20 kind:bss align:32 + +src/ITCM/ITCM_MapObjectManager.cpp: + .text start:0x01fff498 end:0x01fff5d0 diff --git a/config/eur/arm9/itcm/symbols.txt b/config/eur/arm9/itcm/symbols.txt index 8db02547..11def13e 100644 --- a/config/eur/arm9/itcm/symbols.txt +++ b/config/eur/arm9/itcm/symbols.txt @@ -204,11 +204,11 @@ _ZN12ActorManager13func_01fff3b4Ei kind:function(arm,size=0x8c) addr:0x01fff3b4 func_01fff440 kind:function(arm,size=0x18) addr:0x01fff440 _ZN5Actor10GetActorIdEv kind:function(arm,size=0xc) addr:0x01fff458 _ZN5Actor8vfunc_10Ev kind:function(arm,size=0x34) addr:0x01fff464 -_ZN16MapObjectManager13func_01fff498Eii kind:function(arm,size=0x34) addr:0x01fff498 -func_01fff4cc kind:function(arm,size=0x54) addr:0x01fff4cc -func_01fff520 kind:function(arm,size=0x64) addr:0x01fff520 +_ZN16MapObjectManager13func_01fff498E23UnkStruct_func_01fff498 kind:function(arm,size=0x34) addr:0x01fff498 +_ZN16MapObjectManager13func_01fff4ccEPFvPvS0_ES0_ kind:function(arm,size=0x54) addr:0x01fff4cc +_ZN16MapObjectManager13func_01fff520EP24UnkStruct_ov000_020b34c4PP9MapObject kind:function(arm,size=0x64) addr:0x01fff520 _ZN9MapObject14GetMapObjectIdEv kind:function(arm,size=0xc) addr:0x01fff584 -func_01fff590 kind:function(arm,size=0x40) addr:0x01fff590 +_ZN9MapObject13func_01fff590Ei kind:function(arm,size=0x40) addr:0x01fff590 _ZN10ActorRupee13func_01fff5d0Eii kind:function(arm,size=0x3c) addr:0x01fff5d0 _ZN18UnkStruct_027e09b413func_01fff60cEiiihii kind:function(arm,size=0x8c) addr:0x01fff60c func_01fff698 kind:function(arm,size=0x38) addr:0x01fff698 diff --git a/config/eur/arm9/overlays/ov000/delinks.txt b/config/eur/arm9/overlays/ov000/delinks.txt index 8699de82..aab601c6 100644 --- a/config/eur/arm9/overlays/ov000/delinks.txt +++ b/config/eur/arm9/overlays/ov000/delinks.txt @@ -90,6 +90,11 @@ src/000_Second/MapObject/MapObjectMiniBlocks.cpp: .data start:0x020b3744 end:0x020b37ac .bss start:0x020b6228 end:0x020b62a0 +src/000_Second/Cutscene/Cutscene.cpp: + .text start:0x020a782c end:0x020a7908 + .rodata start:0x020af780 end:0x020afc3c + .data start:0x020b4bd0 end:0x020b4d28 + src/000_Second/Item/ItemManager.cpp: complete .text start:0x020a863c end:0x020a8ae0 diff --git a/config/eur/arm9/overlays/ov000/symbols.txt b/config/eur/arm9/overlays/ov000/symbols.txt index 9b8560be..e27a4b3b 100644 --- a/config/eur/arm9/overlays/ov000/symbols.txt +++ b/config/eur/arm9/overlays/ov000/symbols.txt @@ -2959,9 +2959,9 @@ func_ov000_020a7748 kind:function(arm,size=0x14) addr:0x020a7748 func_ov000_020a775c kind:function(arm,size=0x28) addr:0x020a775c func_ov000_020a7784 kind:function(arm,size=0x4c) addr:0x020a7784 func_ov000_020a77d0 kind:function(arm,size=0x5c) addr:0x020a77d0 -func_ov000_020a782c kind:function(arm,size=0x14) addr:0x020a782c +_Z22Cutscene_GetParamEntryi kind:function(arm,size=0x14) addr:0x020a782c func_ov000_020a7840 kind:function(arm,size=0x84) addr:0x020a7840 -func_ov000_020a78c4 kind:function(arm,size=0x44) addr:0x020a78c4 +_Z27Cutscene_IsAdventureFlagSeti kind:function(arm,size=0x44) addr:0x020a78c4 func_ov000_020a7908 kind:function(arm,size=0xdc) addr:0x020a7908 func_ov000_020a79e4 kind:function(arm,size=0x6c) addr:0x020a79e4 func_ov000_020a7a50 kind:function(arm,size=0x20) addr:0x020a7a50 @@ -3274,7 +3274,7 @@ data_ov000_020af760 kind:data(any) addr:0x020af760 data_ov000_020af764 kind:data(any) addr:0x020af764 data_ov000_020af770 kind:data(any) addr:0x020af770 data_ov000_020af77c kind:data(any) addr:0x020af77c -data_ov000_020af780 kind:data(any) addr:0x020af780 +gCSParamsEntries kind:data(any) addr:0x020af780 data_ov000_020afc3c kind:data(any) addr:0x020afc3c gQuiverCapacities kind:data(any) addr:0x020afc40 gBombBagCapacities kind:data(any) addr:0x020afc43 diff --git a/config/eur/arm9/overlays/ov088/relocs.txt b/config/eur/arm9/overlays/ov088/relocs.txt index eb9edce3..7ad14ea7 100644 --- a/config/eur/arm9/overlays/ov088/relocs.txt +++ b/config/eur/arm9/overlays/ov088/relocs.txt @@ -80,7 +80,7 @@ from:0x02165f0c kind:arm_call to:0x02165f18 module:overlay(88) from:0x02165f24 kind:arm_call to:0x0216f414 module:overlay(88) from:0x02165f38 kind:arm_call to:0x02013724 module:main from:0x02165f48 kind:arm_call to:0x020a782c module:overlay(0) -from:0x02165fa0 kind:arm_call to:0x020d1a08 module:overlays(20,24) +from:0x02165fa0 kind:arm_call to:0x020d1a08 module:overlay(24) from:0x02165fec kind:arm_call to:0x02070a9c module:overlay(0) from:0x02165ff8 kind:load to:0x02049a2c module:main from:0x02165ffc kind:load to:0x020be079 module:overlay(1) diff --git a/config/jp/arm9/itcm/delinks.txt b/config/jp/arm9/itcm/delinks.txt index e6ad4257..d87fbca5 100644 --- a/config/jp/arm9/itcm/delinks.txt +++ b/config/jp/arm9/itcm/delinks.txt @@ -1,2 +1,5 @@ .text start:0x01ff8000 end:0x01fffe18 kind:code align:32 .bss start:0x01fffe20 end:0x01fffe20 kind:bss align:32 + +src/ITCM/ITCM_MapObjectManager.cpp: + .text start:0x01fff498 end:0x01fff5d0 diff --git a/config/jp/arm9/itcm/symbols.txt b/config/jp/arm9/itcm/symbols.txt index 8db02547..11def13e 100644 --- a/config/jp/arm9/itcm/symbols.txt +++ b/config/jp/arm9/itcm/symbols.txt @@ -204,11 +204,11 @@ _ZN12ActorManager13func_01fff3b4Ei kind:function(arm,size=0x8c) addr:0x01fff3b4 func_01fff440 kind:function(arm,size=0x18) addr:0x01fff440 _ZN5Actor10GetActorIdEv kind:function(arm,size=0xc) addr:0x01fff458 _ZN5Actor8vfunc_10Ev kind:function(arm,size=0x34) addr:0x01fff464 -_ZN16MapObjectManager13func_01fff498Eii kind:function(arm,size=0x34) addr:0x01fff498 -func_01fff4cc kind:function(arm,size=0x54) addr:0x01fff4cc -func_01fff520 kind:function(arm,size=0x64) addr:0x01fff520 +_ZN16MapObjectManager13func_01fff498E23UnkStruct_func_01fff498 kind:function(arm,size=0x34) addr:0x01fff498 +_ZN16MapObjectManager13func_01fff4ccEPFvPvS0_ES0_ kind:function(arm,size=0x54) addr:0x01fff4cc +_ZN16MapObjectManager13func_01fff520EP24UnkStruct_ov000_020b34c4PP9MapObject kind:function(arm,size=0x64) addr:0x01fff520 _ZN9MapObject14GetMapObjectIdEv kind:function(arm,size=0xc) addr:0x01fff584 -func_01fff590 kind:function(arm,size=0x40) addr:0x01fff590 +_ZN9MapObject13func_01fff590Ei kind:function(arm,size=0x40) addr:0x01fff590 _ZN10ActorRupee13func_01fff5d0Eii kind:function(arm,size=0x3c) addr:0x01fff5d0 _ZN18UnkStruct_027e09b413func_01fff60cEiiihii kind:function(arm,size=0x8c) addr:0x01fff60c func_01fff698 kind:function(arm,size=0x38) addr:0x01fff698 diff --git a/config/jp/arm9/overlays/ov000/delinks.txt b/config/jp/arm9/overlays/ov000/delinks.txt index cc076e30..47ad7540 100644 --- a/config/jp/arm9/overlays/ov000/delinks.txt +++ b/config/jp/arm9/overlays/ov000/delinks.txt @@ -89,6 +89,11 @@ src/000_Second/MapObject/MapObjectMiniBlocks.cpp: .data start:0x020b4f44 end:0x020b4fac .bss start:0x020b7a38 end:0x020b7ab0 +src/000_Second/Cutscene/Cutscene.cpp: + .text start:0x020a902c end:0x020a9108 + .rodata start:0x020b0f90 end:0x020b144c + .data start:0x020b63d0 end:0x020b6528 + src/000_Second/Item/ItemManager.cpp: complete .text start:0x020a9e3c end:0x020aa2e0 diff --git a/config/jp/arm9/overlays/ov000/symbols.txt b/config/jp/arm9/overlays/ov000/symbols.txt index 52c415b6..2866c5a3 100644 --- a/config/jp/arm9/overlays/ov000/symbols.txt +++ b/config/jp/arm9/overlays/ov000/symbols.txt @@ -2958,9 +2958,9 @@ func_ov000_020a8f48 kind:function(arm,size=0x14) addr:0x020a8f48 func_ov000_020a8f5c kind:function(arm,size=0x28) addr:0x020a8f5c func_ov000_020a8f84 kind:function(arm,size=0x4c) addr:0x020a8f84 func_ov000_020a8fd0 kind:function(arm,size=0x5c) addr:0x020a8fd0 -func_ov000_020a782c kind:function(arm,size=0x14) addr:0x020a902c +_Z22Cutscene_GetParamEntryi kind:function(arm,size=0x14) addr:0x020a902c func_ov000_020a9040 kind:function(arm,size=0x84) addr:0x020a9040 -func_ov000_020a90c4 kind:function(arm,size=0x44) addr:0x020a90c4 +_Z27Cutscene_IsAdventureFlagSeti kind:function(arm,size=0x44) addr:0x020a90c4 func_ov000_020a9108 kind:function(arm,size=0xdc) addr:0x020a9108 func_ov000_020a91e4 kind:function(arm,size=0x6c) addr:0x020a91e4 func_ov000_020a9250 kind:function(arm,size=0x20) addr:0x020a9250 @@ -3274,7 +3274,7 @@ data_ov000_020b0f70 kind:data(any) addr:0x020b0f70 data_ov000_020b0f74 kind:data(any) addr:0x020b0f74 data_ov000_020b0f80 kind:data(any) addr:0x020b0f80 data_ov000_020b0f8c kind:data(any) addr:0x020b0f8c -data_ov000_020b0f90 kind:data(any) addr:0x020b0f90 +gCSParamsEntries kind:data(any) addr:0x020b0f90 data_ov000_020b144c kind:data(any) addr:0x020b144c gQuiverCapacities kind:data(any) addr:0x020b1450 gBombBagCapacities kind:data(any) addr:0x020b1453 diff --git a/include/Cutscene/Cutscene.hpp b/include/Cutscene/Cutscene.hpp new file mode 100644 index 00000000..d857fd69 --- /dev/null +++ b/include/Cutscene/Cutscene.hpp @@ -0,0 +1,81 @@ +#pragma once + +#include "global.h" +#include "types.h" + +#include "Save/AdventureFlags.hpp" + +enum CutsceneIndex_ { + /* 0 */ CutsceneIndex_TitleScreen, + /* 1 */ CutsceneIndex_Intro, + /* 2 */ CutsceneIndex_EngineerCertificate, + /* 3 */ CutsceneIndex_SpiritTowerSplit_01, // Rails disappearing + /* 4 */ CutsceneIndex_SpiritTowerSplit_02, // Spirit Tower split + /* 5 */ CutsceneIndex_SpiritTowerSplit_03, // Tower parts aligning + /* 6 */ CutsceneIndex_SpiritTowerSplit_04, // Demon Train appearing + /* 7 */ CutsceneIndex_SpiritTowerSplit_05, // Zelda becoming a ghost + /* 8 */ CutsceneIndex_WalkingToSpiritTower, + /* 9 */ CutsceneIndex_FirstAnjeanMeeting, + /* 10 */ CutsceneIndex_FirstPhantomPossession, + /* 11 */ CutsceneIndex_ForestTempleCompleted_01, // Altar appearing in boss room + /* 12 */ CutsceneIndex_ForestTempleCompleted_02, // Forest Realm Spirit Tracks restoring + /* 13 */ CutsceneIndex_ForestTempleCompleted_03, // First part of Spirit Tower split re-attatching + /* 14 */ CutsceneIndex_BlizzardTempleCompleted_01, // Altar appearing in boss room + /* 15 */ CutsceneIndex_BlizzardTempleCompleted_02, // Snow Realm Spirit Tracks restoring + /* 16 */ CutsceneIndex_BlizzardTempleCompleted_03, // Second part of Spirit Tower split re-attatching + /* 17 */ CutsceneIndex_MarineTempleCompleted_01, // Altar appearing in boss room + /* 18 */ CutsceneIndex_MarineTempleCompleted_02, // Ocean Realm Spirit Tracks restoring + /* 19 */ CutsceneIndex_MarineTempleCompleted_03, // Third part of Spirit Tower split re-attatching + /* 20 */ CutsceneIndex_StavenInTOSAfterFireGlyph_01, // Staven appearing in ToS + /* 21 */ CutsceneIndex_StavenInTOSAfterFireGlyph_02, // Zelda and Link falling inside tower's lobby + /* 22 */ CutsceneIndex_MountainTempleCompleted_01, // Altar appearing in boss room + /* 23 */ CutsceneIndex_MountainTempleCompleted_02, // Fire Realm Spirit Tracks restoring + /* 24 */ CutsceneIndex_MountainTempleCompleted_03, // Fourth part of Spirit Tower split re-attatching + /* 25 */ CutsceneIndex_StavenPreBattle, + /* 26 */ CutsceneIndex_StavenPostBattle, + /* 27 */ CutsceneIndex_MalladusOnTOSSummit_01, // Malladus appearing + /* 28 */ CutsceneIndex_MalladusOnTOSSummit_02, // Malladus and Cole leaving with the Demon Train + /* 29 */ CutsceneIndex_PassengerCarAnjeanBowOfLight, + /* 30 */ CutsceneIndex_LokomoSword, + /* 31 */ CutsceneIndex_PassengerCarBeforeMalladusFight, + /* 32 */ CutsceneIndex_BoardingDemonTrain, + /* 33 */ CutsceneIndex_BeforeMalladusBeast_01, // Demon Train getting destroyed + /* 34 */ CutsceneIndex_BeforeMalladusBeast_02, // Zelda getting her body back + /* 35 */ CutsceneIndex_BeforeMalladusBeast_03, // Beast Malladus appearing + /* 36 */ CutsceneIndex_PreCredits, + /* 37 */ CutsceneIndex_Credits_01, // Credits followed by first ending + /* 38 */ CutsceneIndex_Credits_02, // Credits followed by second ending + /* 39 */ CutsceneIndex_Credits_03, // Credits followed by third ending + /* 40 */ CutsceneIndex_SpiritPipes, + /* 41 */ CutsceneIndex_ForestTracksRestoredFromGlyph, + /* 42 */ CutsceneIndex_MalladusBeastDestroyed, + /* 43 */ CutsceneIndex_Max, + + CutsceneIndex_None = CutsceneIndex_Max, +}; + +struct CutsceneParamsEntry { + /* 00 */ const char *mUnk_00; + /* 04 */ u8 mSceneIndex; + /* 05 */ u8 mRoomIndex; + /* 06 */ u8 mSpawnIndex; + /* 07 */ u8 mCutsceneIndex; // note: this seems to be the index of the current entry? + /* 08 */ u8 mNextSceneIndex; + /* 09 */ u8 mNextRoomIndex; + /* 0A */ u8 mNextSpawnIndex; + /* 0B */ u8 mNextCutsceneIndex; + /* 0C */ bool mNextIsCS; // doesn't makes sense with the array's data + /* 0C */ bool mUnk_0D; + /* 0E */ unk16 mUnk_0E; + /* 10 */ AdventureFlag_Half mFlag; + /* 12 */ unk16 mUnk_12; // pad? + /* 14 */ u32 mUnk_14; + /* 18 */ u32 mUnk_18; + /* 1C */ +}; + +CutsceneParamsEntry *Cutscene_GetParamEntry(s32 csIndex); +s32 func_ov000_020a7840(unk32 param1); +bool Cutscene_IsAdventureFlagSet(s32 csIndex); + +extern const CutsceneParamsEntry gCSParamsEntries[CutsceneIndex_Max]; diff --git a/include/MapObject/MapObject.hpp b/include/MapObject/MapObject.hpp index 142d090b..17dee6f2 100644 --- a/include/MapObject/MapObject.hpp +++ b/include/MapObject/MapObject.hpp @@ -150,6 +150,7 @@ class MapObject : public SysObject { MapObject(); MapObjectId GetMapObjectId(); + void func_01fff590(unk32 param2); bool func_ov000_0209d114(); bool func_ov000_0209d12c(); diff --git a/include/MapObject/MapObjectManager.hpp b/include/MapObject/MapObjectManager.hpp index e5cd4c99..34b95bcb 100644 --- a/include/MapObject/MapObjectManager.hpp +++ b/include/MapObject/MapObjectManager.hpp @@ -4,12 +4,19 @@ #include "Unknown/UnkStruct_ov000_020b34c4.hpp" #include "types.h" +typedef void (*UnkCallback_func_01fff4cc)(void *, void *); + +struct UnkStruct_func_01fff498 { + u8 ptrIndex; + u8 valueIndex; +}; + class MapObjectManager { public: /* 00 */ MapObject **mMapObjTable; /* 04 */ MapObject **mMapObjTableEnd; /* 08 */ MapObject **mUnk_08; // pointer to first available slot? - /* 0C */ void **mUnk_0C; // unknown table + /* 0C */ s16 **mUnk_0C; // unknown table /* 10 */ void **mUnk_10; // unknown table end /* 14 */ void *mUnk_14; /* 18 */ unk16 mUnk_18; @@ -22,14 +29,19 @@ class MapObjectManager { /* 6C */ void *mUnk_6C; /* 70 */ - MapObject **func_01fff520(UnkStruct_ov000_020b34c4 *param1, void *); - MapObject *func_01fff498(unk32 param1, unk32 param2); + MapObject *func_01fff498(UnkStruct_func_01fff498 param1); + void func_01fff4cc(UnkCallback_func_01fff4cc param1, void *param2); + MapObject **func_01fff520(UnkStruct_ov000_020b34c4 *param1, MapObject **param2); void func_ov000_0209c3a8(); void func_ov000_0209c3e8(); void func_ov000_0209c444(); + void SetInstance(); // func_ov001_020baf4c + void ClearInstance(); // func_ov001_020baf58 + static void func_ov000_0209c490(); + static MapObjectManager *Create(); // func_ov001_020bac40 }; extern MapObjectManager *gpMapObjManager; diff --git a/include/Save/AdventureFlags.hpp b/include/Save/AdventureFlags.hpp index be8c90d5..14a45428 100644 --- a/include/Save/AdventureFlags.hpp +++ b/include/Save/AdventureFlags.hpp @@ -5,6 +5,7 @@ #include "types.h" typedef u32 AdventureFlag; +typedef u16 AdventureFlag_Half; enum AdventureFlag_ { /* 0x000 */ AdventureFlag_Unk_000 = FLAG(0, 0), /* 0x001 */ AdventureFlag_Unk_001 = FLAG(0, 1), @@ -160,7 +161,7 @@ enum AdventureFlag_ { /* 0x08F */ AdventureFlag_Unk_08F = FLAG(4, 15), /* 0x090 */ AdventureFlag_WatchedIntroCS = FLAG(4, 16), /* 0x091 */ AdventureFlag_WatchedFirstPhantomPossessionCS = FLAG(4, 17), - /* 0x092 */ AdventureFlag_WatchedFireTempleCompletedCS = FLAG(4, 18), + /* 0x092 */ AdventureFlag_WatchedForestTempleCompletedCS = FLAG(4, 18), /* 0x093 */ AdventureFlag_TalkedToZeldaMayscoreFirstTime = FLAG(4, 19), /* 0x094 */ AdventureFlag_TalkedToZeldaPhantomPossessionFirstTime = FLAG(4, 20), /* 0x095 */ AdventureFlag_Unk_095 = FLAG(4, 21), @@ -1070,4 +1071,5 @@ enum AdventureFlag_ { /* 0x3FD */ AdventureFlag_Unk_3FD = FLAG(31, 29), /* 0x3FE */ AdventureFlag_Unk_3FE = FLAG(31, 30), /* 0x3FF */ AdventureFlag_Unk_3FF = FLAG(31, 31), + /* 0x400 */ AdventureFlag_None = 0x400, }; diff --git a/include/Unknown/UnkStruct_027e09a4.hpp b/include/Unknown/UnkStruct_027e09a4.hpp index 39853176..490aea2d 100644 --- a/include/Unknown/UnkStruct_027e09a4.hpp +++ b/include/Unknown/UnkStruct_027e09a4.hpp @@ -1,5 +1,6 @@ #pragma once +#include "Cutscene/Cutscene.hpp" #include "System/SysNew.hpp" #include "Unknown/UnkStruct_0204a060.hpp" #include "global.h" @@ -164,7 +165,7 @@ struct UnkStruct_SceneChange1 { /* 08 */ unk16 mUnk_08; /* 0A */ u8 mRoomIndex; /* 0B */ unk8 mSpawnIndex; - /* 0C */ unk8 mUnk_0C; + /* 0C */ bool mNextIsCS; /* 0D */ unk8 mUnk_0D; /* 0E */ unk8 mCutsceneIndex; /* 0F */ unk8 mUnk_0F; @@ -181,12 +182,30 @@ struct UnkStruct_SceneChange1 { this->mRoomIndex = 0xFF; // this changes when you enter a house, it's not clear if it has another purpose yet this->mSpawnIndex = 0; // changing this then saving will change your spawn location after opening the save again // (not the area) - this->mUnk_0C = 0; + this->mNextIsCS = false; this->mUnk_0D = 0; - this->mCutsceneIndex = 0x2B; // array length of `data_ov000_020af780` + this->mCutsceneIndex = CutsceneIndex_None; this->mUnk_0F = 0; this->mUnk_10 = 0; } + + UnkStruct_SceneChange1(CutsceneParamsEntry *pEntry, bool nextIsCS) { + u8 sceneIndex = pEntry->mSceneIndex; + u8 cutsceneIndex = pEntry->mCutsceneIndex; + u8 spawnIndex = pEntry->mSpawnIndex; + u8 roomIndex = pEntry->mRoomIndex; + + this->mNextSceneIndex = sceneIndex; + this->mUnk_04 = 0; + this->mUnk_08 = 0; + this->mRoomIndex = roomIndex; + this->mSpawnIndex = spawnIndex; + this->mNextIsCS = nextIsCS; + this->mUnk_0D = 0; + this->mCutsceneIndex = cutsceneIndex; + this->mUnk_0F = 0; + this->mUnk_10 = 0; + } }; class UnkStruct_WarpUnk1 : public UnkStruct_0204a060_Base { @@ -206,7 +225,7 @@ class UnkStruct_027e09a4 : public SysObject { /* 08 */ unk32 mUnk_08; /* 0C */ u8 mUnk_0C; /* 0D */ unk8 mUnk_0D; - /* 0E */ unk8 mUnk_0E; + /* 0E */ u8 mCutsceneIndex; /* 0F */ unk8 mUnk_0F; /* 10 */ unk32 *mUnk_10; /* 14 */ UnkStruct_SceneChange1 mUnk_14; @@ -214,7 +233,7 @@ class UnkStruct_027e09a4 : public SysObject { /* 54 */ void *mUnk_54; // vtable /* 58 */ UnkStruct_WarpUnk1 *mpWarpUnk1; /* 5C */ unk32 mUnk_5C; - /* 60 */ unk32 mUnk_60; + /* 60 */ unk32 mUnk_60; // related to ds download? /* 64 */ unk32 mUnk_64; /* 68 */ @@ -245,7 +264,7 @@ class UnkStruct_027e09a4 : public SysObject { UnkStruct_func_01ffd400 *func_01ffd400(); - unk8 func_ov000_02070bd0(unk32, unk32); + unk8 func_ov000_02070bd0(unk32 csIndex, unk32 param2); UnkStruct_027e09a4_58_78 *func_ov000_02070560(); void func_ov000_020707a8(void *param1); void func_ov000_02070834(void *param1); diff --git a/include/Unknown/UnkStruct_027e09b8.hpp b/include/Unknown/UnkStruct_027e09b8.hpp index 29843f92..0c437668 100644 --- a/include/Unknown/UnkStruct_027e09b8.hpp +++ b/include/Unknown/UnkStruct_027e09b8.hpp @@ -5,7 +5,7 @@ class UnkStruct_027e09b8 { public: /* 00 */ unk8 mUnk_00[0x14]; - /* 14 */ u32 mUnk_14[1]; //! TODO + /* 14 */ u32 mAdventureFlags[32]; //! TODO unk32 func_01ffd420(); diff --git a/include/Unknown/UnkStruct_ov000_020b34c4.hpp b/include/Unknown/UnkStruct_ov000_020b34c4.hpp index b8d8c19c..42f26893 100644 --- a/include/Unknown/UnkStruct_ov000_020b34c4.hpp +++ b/include/Unknown/UnkStruct_ov000_020b34c4.hpp @@ -2,10 +2,16 @@ #include "types.h" +//! TODO: this is probably all fake to match func_01fff520 + +typedef bool (**UnkStruct_ov000_020b34c4_Callback)(void *, void *); + class UnkStruct_ov000_020b34c4 { public: - /* 00 */ void *mUnk_00; + /* 00 */ UnkStruct_ov000_020b34c4_Callback mUnk_00; /* 04 */ unk32 mUnk_04; + + /* 00 */ virtual bool vfunc_00(void *param1); }; extern UnkStruct_ov000_020b34c4 data_ov000_020b34c4; diff --git a/src/000_Second/Cutscene/Cutscene.cpp b/src/000_Second/Cutscene/Cutscene.cpp new file mode 100644 index 00000000..65b1b8e8 --- /dev/null +++ b/src/000_Second/Cutscene/Cutscene.cpp @@ -0,0 +1,839 @@ +#include "Cutscene/Cutscene.hpp" +#include "Unknown/UnkStruct_027e09a4.hpp" +#include "Unknown/UnkStruct_027e09b8.hpp" + +const CutsceneParamsEntry gCSParamsEntries[CutsceneIndex_Max] = { + { + // CutsceneIndex_TitleScreen + .mUnk_00 = "d00_01", + .mSceneIndex = SceneIndex_demo_train, + .mRoomIndex = 0x00, + .mSpawnIndex = 0x00, + .mCutsceneIndex = CutsceneIndex_TitleScreen, + .mNextSceneIndex = SceneIndex_demo_train, + .mNextRoomIndex = 0x00, + .mNextSpawnIndex = 0x00, + .mNextCutsceneIndex = CutsceneIndex_TitleScreen, + .mNextIsCS = false, + .mUnk_0D = false, + .mUnk_0E = 0x0048, + .mFlag = AdventureFlag_None, + .mUnk_12 = 0x0000, + .mUnk_14 = 1, + .mUnk_18 = 0, + }, + { + // CutsceneIndex_Intro + .mUnk_00 = "d02_01", + .mSceneIndex = SceneIndex_f_first, + .mRoomIndex = 0x0A, + .mSpawnIndex = 0x00, + .mCutsceneIndex = CutsceneIndex_Intro, + .mNextSceneIndex = SceneIndex_f_first, + .mNextRoomIndex = 0x0A, + .mNextSpawnIndex = 0x00, + .mNextCutsceneIndex = CutsceneIndex_None, + .mNextIsCS = true, + .mUnk_0D = false, + .mUnk_0E = 0x0049, + .mFlag = AdventureFlag_WatchedIntroCS, + .mUnk_12 = 0x0000, + .mUnk_14 = 0, + .mUnk_18 = 1, + }, + { + // CutsceneIndex_EngineerCertificate + .mUnk_00 = "d03_01", + .mSceneIndex = SceneIndex_f_hyral, + .mRoomIndex = 0x06, + .mSpawnIndex = 0x00, + .mCutsceneIndex = CutsceneIndex_EngineerCertificate, + .mNextSceneIndex = SceneIndex_f_hyral, + .mNextRoomIndex = 0x06, + .mNextSpawnIndex = 0x04, + .mNextCutsceneIndex = CutsceneIndex_None, + .mNextIsCS = false, + .mUnk_0D = false, + .mUnk_0E = 0x004A, + .mFlag = AdventureFlag_ObtainedEngineerCertificate, + .mUnk_12 = 0x0000, + .mUnk_14 = 0, + .mUnk_18 = 1, + }, + { + // CutsceneIndex_SpiritTowerSplit_01 (Rails disappearing) + .mUnk_00 = "d04_01", + .mSceneIndex = SceneIndex_demo_train, + .mRoomIndex = 0x03, + .mSpawnIndex = 0x00, + .mCutsceneIndex = CutsceneIndex_SpiritTowerSplit_01, + .mNextSceneIndex = SceneIndex_demo_train, + .mNextRoomIndex = 0x02, + .mNextSpawnIndex = 0x00, + .mNextCutsceneIndex = CutsceneIndex_SpiritTowerSplit_02, + .mNextIsCS = false, + .mUnk_0D = false, + .mUnk_0E = 0x004B, + .mFlag = AdventureFlag_WatchedSpiritTowerSplitCS, + .mUnk_12 = 0x0000, + .mUnk_14 = 0, + .mUnk_18 = 1, + }, + { + // CutsceneIndex_SpiritTowerSplit_02 (Spirit Tower split) + .mUnk_00 = "d04_02", + .mSceneIndex = SceneIndex_demo_train, + .mRoomIndex = 0x02, + .mSpawnIndex = 0x00, + .mCutsceneIndex = CutsceneIndex_SpiritTowerSplit_02, + .mNextSceneIndex = SceneIndex_demo_train, + .mNextRoomIndex = 0x03, + .mNextSpawnIndex = 0x00, + .mNextCutsceneIndex = CutsceneIndex_SpiritTowerSplit_03, + .mNextIsCS = false, + .mUnk_0D = false, + .mUnk_0E = 0x004C, + .mFlag = AdventureFlag_None, + .mUnk_12 = 0x0000, + .mUnk_14 = 1, + .mUnk_18 = 0, + }, + { + // CutsceneIndex_SpiritTowerSplit_03 (Tower parts aligning) + .mUnk_00 = "d04_03", + .mSceneIndex = SceneIndex_demo_train, + .mRoomIndex = 0x03, + .mSpawnIndex = 0x00, + .mCutsceneIndex = CutsceneIndex_SpiritTowerSplit_03, + .mNextSceneIndex = SceneIndex_demo_train, + .mNextRoomIndex = 0x03, + .mNextSpawnIndex = 0x00, + .mNextCutsceneIndex = CutsceneIndex_SpiritTowerSplit_04, + .mNextIsCS = false, + .mUnk_0D = false, + .mUnk_0E = 0x004D, + .mFlag = AdventureFlag_None, + .mUnk_12 = 0x0000, + .mUnk_14 = 0, + .mUnk_18 = 1, + }, + { + // CutsceneIndex_SpiritTowerSplit_04 (Demon Train appearing) + .mUnk_00 = "d04_04", + .mSceneIndex = SceneIndex_demo_train, + .mRoomIndex = 0x03, + .mSpawnIndex = 0x00, + .mCutsceneIndex = CutsceneIndex_SpiritTowerSplit_04, + .mNextSceneIndex = SceneIndex_demo_train, + .mNextRoomIndex = 0x03, + .mNextSpawnIndex = 0x00, + .mNextCutsceneIndex = CutsceneIndex_SpiritTowerSplit_05, + .mNextIsCS = false, + .mUnk_0D = true, + .mUnk_0E = 0x0062, + .mFlag = AdventureFlag_None, + .mUnk_12 = 0x0000, + .mUnk_14 = 0, + .mUnk_18 = 1, + }, + { + // CutsceneIndex_SpiritTowerSplit_05 (Zelda becoming a ghost) + .mUnk_00 = "d04_05", + .mSceneIndex = SceneIndex_demo_train, + .mRoomIndex = 0x03, + .mSpawnIndex = 0x00, + .mCutsceneIndex = CutsceneIndex_SpiritTowerSplit_05, + .mNextSceneIndex = SceneIndex_f_hyral, + .mNextRoomIndex = 0x03, + .mNextSpawnIndex = 0x00, + .mNextCutsceneIndex = CutsceneIndex_None, + .mNextIsCS = false, + .mUnk_0D = false, + .mUnk_0E = 0x0062, + .mFlag = AdventureFlag_None, + .mUnk_12 = 0x0000, + .mUnk_14 = 0, + .mUnk_18 = 1, + }, + { + // CutsceneIndex_WalkingToSpiritTower + .mUnk_00 = "d05_01", + .mSceneIndex = SceneIndex_demo_train, + .mRoomIndex = 0x03, + .mSpawnIndex = 0x00, + .mCutsceneIndex = CutsceneIndex_WalkingToSpiritTower, + .mNextSceneIndex = SceneIndex_d_main_f, + .mNextRoomIndex = 0x01, + .mNextSpawnIndex = 0x00, + .mNextCutsceneIndex = CutsceneIndex_FirstAnjeanMeeting, + .mNextIsCS = false, + .mUnk_0D = false, + .mUnk_0E = 0x004E, + .mFlag = AdventureFlag_None, + .mUnk_12 = 0x0000, + .mUnk_14 = 1, + .mUnk_18 = 0, + }, + { + // CutsceneIndex_FirstAnjeanMeeting + .mUnk_00 = "d06_01", + .mSceneIndex = SceneIndex_d_main_f, + .mRoomIndex = 0x01, + .mSpawnIndex = 0x00, + .mCutsceneIndex = CutsceneIndex_FirstAnjeanMeeting, + .mNextSceneIndex = SceneIndex_d_main_f, + .mNextRoomIndex = 0x01, + .mNextSpawnIndex = 0x04, + .mNextCutsceneIndex = CutsceneIndex_None, + .mNextIsCS = false, + .mUnk_0D = false, + .mUnk_0E = 0x004F, + .mFlag = AdventureFlag_MetAnjeanFirstTime, + .mUnk_12 = 0x0000, + .mUnk_14 = 0, + .mUnk_18 = 1, + }, + { + // CutsceneIndex_FirstPhantomPossession + .mUnk_00 = "d07_01", + .mSceneIndex = SceneIndex_d_main, + .mRoomIndex = 0x00, + .mSpawnIndex = 0x02, + .mCutsceneIndex = CutsceneIndex_FirstPhantomPossession, + .mNextSceneIndex = SceneIndex_d_main, + .mNextRoomIndex = 0x00, + .mNextSpawnIndex = 0x02, + .mNextCutsceneIndex = CutsceneIndex_None, + .mNextIsCS = false, + .mUnk_0D = false, + .mUnk_0E = 0x0050, + .mFlag = AdventureFlag_WatchedFirstPhantomPossessionCS, + .mUnk_12 = 0x0000, + .mUnk_14 = 0, + .mUnk_18 = 1, + }, + { + // CutsceneIndex_ForestTempleCompleted_01 (Altar appearing in boss room) + .mUnk_00 = "d08_01", + .mSceneIndex = SceneIndex_b_forest, + .mRoomIndex = 0x00, + .mSpawnIndex = 0x00, + .mCutsceneIndex = CutsceneIndex_ForestTempleCompleted_01, + .mNextSceneIndex = SceneIndex_demo_train, + .mNextRoomIndex = 0x01, + .mNextSpawnIndex = 0x00, + .mNextCutsceneIndex = CutsceneIndex_ForestTempleCompleted_02, + .mNextIsCS = false, + .mUnk_0D = true, + .mUnk_0E = 0x0051, + .mFlag = AdventureFlag_WatchedForestTempleCompletedCS, + .mUnk_12 = 0x0000, + .mUnk_14 = 0, + .mUnk_18 = 1, + }, + { + // CutsceneIndex_ForestTempleCompleted_02 (Forest Realm Spirit Tracks restoring) + .mUnk_00 = "d08_02", + .mSceneIndex = SceneIndex_demo_train, + .mRoomIndex = 0x01, + .mSpawnIndex = 0x00, + .mCutsceneIndex = CutsceneIndex_ForestTempleCompleted_02, + .mNextSceneIndex = SceneIndex_demo_train, + .mNextRoomIndex = 0x02, + .mNextSpawnIndex = 0x00, + .mNextCutsceneIndex = CutsceneIndex_ForestTempleCompleted_03, + .mNextIsCS = false, + .mUnk_0D = true, + .mUnk_0E = 0x0052, + .mFlag = AdventureFlag_None, + .mUnk_12 = 0x0000, + .mUnk_14 = 1, + .mUnk_18 = 0, + }, + { + // CutsceneIndex_ForestTempleCompleted_03 (First part of Spirit Tower split re-attatching) + .mUnk_00 = "d08_03", + .mSceneIndex = SceneIndex_demo_train, + .mRoomIndex = 0x02, + .mSpawnIndex = 0x00, + .mCutsceneIndex = CutsceneIndex_ForestTempleCompleted_03, + .mNextSceneIndex = SceneIndex_b_forest, + .mNextRoomIndex = 0x00, + .mNextSpawnIndex = 0x02, + .mNextCutsceneIndex = CutsceneIndex_None, + .mNextIsCS = false, + .mUnk_0D = false, + .mUnk_0E = 0x0053, + .mFlag = AdventureFlag_None, + .mUnk_12 = 0x0000, + .mUnk_14 = 1, + .mUnk_18 = 0, + }, + { + // CutsceneIndex_BlizzardTempleCompleted_01 (Altar appearing in boss room) + .mUnk_00 = "d09_01", + .mSceneIndex = SceneIndex_b_snow, + .mRoomIndex = 0x00, + .mSpawnIndex = 0x00, + .mCutsceneIndex = CutsceneIndex_BlizzardTempleCompleted_01, + .mNextSceneIndex = SceneIndex_demo_train, + .mNextRoomIndex = 0x06, + .mNextSpawnIndex = 0x00, + .mNextCutsceneIndex = CutsceneIndex_BlizzardTempleCompleted_02, + .mNextIsCS = false, + .mUnk_0D = true, + .mUnk_0E = 0x0054, + .mFlag = AdventureFlag_WatchedBlizzardTempleCompletedCS, + .mUnk_12 = 0x0000, + .mUnk_14 = 0, + .mUnk_18 = 1, + }, + { + // CutsceneIndex_BlizzardTempleCompleted_02 (Snow Realm Spirit Tracks restoring) + .mUnk_00 = "d09_02", + .mSceneIndex = SceneIndex_demo_train, + .mRoomIndex = 0x06, + .mSpawnIndex = 0x00, + .mCutsceneIndex = CutsceneIndex_BlizzardTempleCompleted_02, + .mNextSceneIndex = SceneIndex_demo_train, + .mNextRoomIndex = 0x07, + .mNextSpawnIndex = 0x00, + .mNextCutsceneIndex = CutsceneIndex_BlizzardTempleCompleted_03, + .mNextIsCS = false, + .mUnk_0D = true, + .mUnk_0E = 0x0055, + .mFlag = AdventureFlag_None, + .mUnk_12 = 0x0000, + .mUnk_14 = 1, + .mUnk_18 = 0, + }, + { + // CutsceneIndex_BlizzardTempleCompleted_03 (Second part of Spirit Tower split re-attatching) + .mUnk_00 = "d09_03", + .mSceneIndex = SceneIndex_demo_train, + .mRoomIndex = 0x07, + .mSpawnIndex = 0x00, + .mCutsceneIndex = CutsceneIndex_BlizzardTempleCompleted_03, + .mNextSceneIndex = SceneIndex_b_snow, + .mNextRoomIndex = 0x00, + .mNextSpawnIndex = 0x00, + .mNextCutsceneIndex = CutsceneIndex_None, + .mNextIsCS = false, + .mUnk_0D = false, + .mUnk_0E = 0x0053, + .mFlag = AdventureFlag_None, + .mUnk_12 = 0x0000, + .mUnk_14 = 1, + .mUnk_18 = 0, + }, + { + // CutsceneIndex_MarineTempleCompleted_01 (Altar appearing in boss room) + .mUnk_00 = "d10_01", + .mSceneIndex = SceneIndex_b_water, + .mRoomIndex = 0x00, + .mSpawnIndex = 0x01, + .mCutsceneIndex = CutsceneIndex_MarineTempleCompleted_01, + .mNextSceneIndex = SceneIndex_demo_train, + .mNextRoomIndex = 0x04, + .mNextSpawnIndex = 0x00, + .mNextCutsceneIndex = CutsceneIndex_MarineTempleCompleted_02, + .mNextIsCS = false, + .mUnk_0D = true, + .mUnk_0E = 0x0056, + .mFlag = AdventureFlag_WatchedMarineTempleCompletedCS, + .mUnk_12 = 0x0000, + .mUnk_14 = 0, + .mUnk_18 = 1, + }, + { + // CutsceneIndex_MarineTempleCompleted_02 (Ocean Realm Spirit Tracks restoring) + .mUnk_00 = "d10_02", + .mSceneIndex = SceneIndex_demo_train, + .mRoomIndex = 0x04, + .mSpawnIndex = 0x00, + .mCutsceneIndex = CutsceneIndex_MarineTempleCompleted_02, + .mNextSceneIndex = SceneIndex_demo_train, + .mNextRoomIndex = 0x05, + .mNextSpawnIndex = 0x00, + .mNextCutsceneIndex = CutsceneIndex_MarineTempleCompleted_03, + .mNextIsCS = false, + .mUnk_0D = true, + .mUnk_0E = 0x0057, + .mFlag = AdventureFlag_None, + .mUnk_12 = 0x0000, + .mUnk_14 = 1, + .mUnk_18 = 0, + }, + { + // CutsceneIndex_MarineTempleCompleted_03 (Third part of Spirit Tower split re-attatching) + .mUnk_00 = "d10_03", + .mSceneIndex = SceneIndex_demo_train, + .mRoomIndex = 0x05, + .mSpawnIndex = 0x00, + .mCutsceneIndex = CutsceneIndex_MarineTempleCompleted_03, + .mNextSceneIndex = SceneIndex_b_water, + .mNextRoomIndex = 0x00, + .mNextSpawnIndex = 0x01, + .mNextCutsceneIndex = CutsceneIndex_None, + .mNextIsCS = false, + .mUnk_0D = false, + .mUnk_0E = 0x0053, + .mFlag = AdventureFlag_None, + .mUnk_12 = 0x0000, + .mUnk_14 = 1, + .mUnk_18 = 0, + }, + { + // CutsceneIndex_StavenInTOSAfterFireGlyph_01 (Staven appearing in ToS) + .mUnk_00 = "d11_01", + .mSceneIndex = SceneIndex_d_main, + .mRoomIndex = 0x0F, + .mSpawnIndex = 0x00, + .mCutsceneIndex = CutsceneIndex_StavenInTOSAfterFireGlyph_01, + .mNextSceneIndex = SceneIndex_d_main_f, + .mNextRoomIndex = 0x01, + .mNextSpawnIndex = 0x00, + .mNextCutsceneIndex = CutsceneIndex_StavenInTOSAfterFireGlyph_02, + .mNextIsCS = false, + .mUnk_0D = false, + .mUnk_0E = 0x0061, + .mFlag = AdventureFlag_MetStavenInTOSAfterFireGlyphCS, + .mUnk_12 = 0x0000, + .mUnk_14 = 0, + .mUnk_18 = 1, + }, + { + // CutsceneIndex_StavenInTOSAfterFireGlyph_02 (Zelda and Link falling inside tower's lobby) + .mUnk_00 = "d11_02", + .mSceneIndex = SceneIndex_d_main_f, + .mRoomIndex = 0x01, + .mSpawnIndex = 0x00, + .mCutsceneIndex = CutsceneIndex_StavenInTOSAfterFireGlyph_02, + .mNextSceneIndex = SceneIndex_d_main_f, + .mNextRoomIndex = 0x01, + .mNextSpawnIndex = 0x00, + .mNextCutsceneIndex = CutsceneIndex_None, + .mNextIsCS = false, + .mUnk_0D = false, + .mUnk_0E = 0x004F, + .mFlag = AdventureFlag_None, + .mUnk_12 = 0x0000, + .mUnk_14 = 0, + .mUnk_18 = 1, + }, + { + // CutsceneIndex_MountainTempleCompleted_01 (Altar appearing in boss room) + .mUnk_00 = "d12_01", + .mSceneIndex = SceneIndex_b_flame, + .mRoomIndex = 0x00, + .mSpawnIndex = 0x00, + .mCutsceneIndex = CutsceneIndex_MountainTempleCompleted_01, + .mNextSceneIndex = SceneIndex_demo_train, + .mNextRoomIndex = 0x08, + .mNextSpawnIndex = 0x00, + .mNextCutsceneIndex = CutsceneIndex_MountainTempleCompleted_02, + .mNextIsCS = false, + .mUnk_0D = true, + .mUnk_0E = 0x0058, + .mFlag = AdventureFlag_WatchedMountainTempleCompletedCS, + .mUnk_12 = 0x0000, + .mUnk_14 = 0, + .mUnk_18 = 1, + }, + { + // CutsceneIndex_MountainTempleCompleted_02 (Fire Realm Spirit Tracks restoring) + .mUnk_00 = "d12_02", + .mSceneIndex = SceneIndex_demo_train, + .mRoomIndex = 0x08, + .mSpawnIndex = 0x00, + .mCutsceneIndex = CutsceneIndex_MountainTempleCompleted_02, + .mNextSceneIndex = SceneIndex_demo_train, + .mNextRoomIndex = 0x02, + .mNextSpawnIndex = 0x00, + .mNextCutsceneIndex = CutsceneIndex_MountainTempleCompleted_03, + .mNextIsCS = false, + .mUnk_0D = true, + .mUnk_0E = 0x0059, + .mFlag = AdventureFlag_None, + .mUnk_12 = 0x0000, + .mUnk_14 = 1, + .mUnk_18 = 0, + }, + { + // CutsceneIndex_MountainTempleCompleted_03 (Fourth part of Spirit Tower split re-attatching) + .mUnk_00 = "d12_03", + .mSceneIndex = SceneIndex_demo_train, + .mRoomIndex = 0x09, + .mSpawnIndex = 0x00, + .mCutsceneIndex = CutsceneIndex_MountainTempleCompleted_03, + .mNextSceneIndex = SceneIndex_b_flame, + .mNextRoomIndex = 0x00, + .mNextSpawnIndex = 0x01, + .mNextCutsceneIndex = CutsceneIndex_None, + .mNextIsCS = false, + .mUnk_0D = false, + .mUnk_0E = 0x0053, + .mFlag = AdventureFlag_None, + .mUnk_12 = 0x0000, + .mUnk_14 = 1, + .mUnk_18 = 0, + }, + { + // CutsceneIndex_StavenPreBattle + .mUnk_00 = "d13_01", + .mSceneIndex = SceneIndex_b_deago, + .mRoomIndex = 0x00, + .mSpawnIndex = 0x02, + .mCutsceneIndex = CutsceneIndex_StavenPreBattle, + .mNextSceneIndex = SceneIndex_b_deago, + .mNextRoomIndex = 0x00, + .mNextSpawnIndex = 0x00, + .mNextCutsceneIndex = CutsceneIndex_None, + .mNextIsCS = false, + .mUnk_0D = false, + .mUnk_0E = 0x005A, + .mFlag = AdventureFlag_None, + .mUnk_12 = 0x0000, + .mUnk_14 = 0, + .mUnk_18 = 1, + }, + { + // CutsceneIndex_StavenPostBattle + .mUnk_00 = "d14_01", + .mSceneIndex = SceneIndex_b_deago, + .mRoomIndex = 0x00, + .mSpawnIndex = 0x00, + .mCutsceneIndex = CutsceneIndex_StavenPostBattle, + .mNextSceneIndex = SceneIndex_b_deago, + .mNextRoomIndex = 0x00, + .mNextSpawnIndex = 0x03, + .mNextCutsceneIndex = CutsceneIndex_None, + .mNextIsCS = false, + .mUnk_0D = false, + .mUnk_0E = 0x005A, + .mFlag = AdventureFlag_WatchedStavenPostBattleCS, + .mUnk_12 = 0x0000, + .mUnk_14 = 0, + .mUnk_18 = 1, + }, + { + // CutsceneIndex_MalladusOnTOSSummit_01 (Malladus appearing) + .mUnk_00 = "d15_01", + .mSceneIndex = SceneIndex_d_main_a, + .mRoomIndex = 0x00, + .mSpawnIndex = 0x00, + .mCutsceneIndex = CutsceneIndex_MalladusOnTOSSummit_01, + .mNextSceneIndex = SceneIndex_d_main_a, + .mNextRoomIndex = 0x00, + .mNextSpawnIndex = 0x00, + .mNextCutsceneIndex = CutsceneIndex_MalladusOnTOSSummit_02, + .mNextIsCS = false, + .mUnk_0D = false, + .mUnk_0E = 0x005B, + .mFlag = AdventureFlag_WatchedMalladusOnTOSSummitCS, + .mUnk_12 = 0x0000, + .mUnk_14 = 0, + .mUnk_18 = 1, + }, + { + // CutsceneIndex_MalladusOnTOSSummit_02 (Malladus and Cole leaving with the Demon Train) + .mUnk_00 = "d15_02", + .mSceneIndex = SceneIndex_d_main_a, + .mRoomIndex = 0x00, + .mSpawnIndex = 0x00, + .mCutsceneIndex = CutsceneIndex_MalladusOnTOSSummit_02, + .mNextSceneIndex = SceneIndex_f_passenger, + .mNextRoomIndex = 0x00, + .mNextSpawnIndex = 0x00, + .mNextCutsceneIndex = CutsceneIndex_PassengerCarAnjeanBowOfLight, + .mNextIsCS = false, + .mUnk_0D = false, + .mUnk_0E = 0x005B, + .mFlag = AdventureFlag_None, + .mUnk_12 = 0x0000, + .mUnk_14 = 0, + .mUnk_18 = 1, + }, + { + // CutsceneIndex_PassengerCarAnjeanBowOfLight + .mUnk_00 = "d16_01", + .mSceneIndex = SceneIndex_f_passenger, + .mRoomIndex = 0x00, + .mSpawnIndex = 0x00, + .mCutsceneIndex = CutsceneIndex_PassengerCarAnjeanBowOfLight, + .mNextSceneIndex = SceneIndex_f_passenger, + .mNextRoomIndex = 0x00, + .mNextSpawnIndex = 0x00, + .mNextCutsceneIndex = CutsceneIndex_None, + .mNextIsCS = false, + .mUnk_0D = false, + .mUnk_0E = 0x005C, + .mFlag = AdventureFlag_None, + .mUnk_12 = 0x0000, + .mUnk_14 = 0, + .mUnk_18 = 1, + }, + { + // CutsceneIndex_LokomoSword + .mUnk_00 = "d17_01", + .mSceneIndex = SceneIndex_f_passenger, + .mRoomIndex = 0x00, + .mSpawnIndex = 0x00, + .mCutsceneIndex = CutsceneIndex_LokomoSword, + .mNextSceneIndex = SceneIndex_t_area2, + .mNextRoomIndex = 0x00, + .mNextSpawnIndex = 0x07, + .mNextCutsceneIndex = CutsceneIndex_None, + .mNextIsCS = false, + .mUnk_0D = false, + .mUnk_0E = 0x005C, + .mFlag = AdventureFlag_WatchedLokomoSwordCS, + .mUnk_12 = 0x0000, + .mUnk_14 = 0, + .mUnk_18 = 1, + }, + { + // CutsceneIndex_PassengerCarBeforeMalladusFight + .mUnk_00 = "d18_01", + .mSceneIndex = SceneIndex_f_passenger, + .mRoomIndex = 0x00, + .mSpawnIndex = 0x00, + .mCutsceneIndex = CutsceneIndex_PassengerCarBeforeMalladusFight, + .mNextSceneIndex = SceneIndex_demo_train, + .mNextRoomIndex = 0x0A, + .mNextSpawnIndex = 0x00, + .mNextCutsceneIndex = CutsceneIndex_BoardingDemonTrain, + .mNextIsCS = false, + .mUnk_0D = false, + .mUnk_0E = 0x005C, + .mFlag = AdventureFlag_None, + .mUnk_12 = 0x0000, + .mUnk_14 = 0, + .mUnk_18 = 1, + }, + { + // CutsceneIndex_BoardingDemonTrain + .mUnk_00 = "d19_01", + .mSceneIndex = SceneIndex_demo_train, + .mRoomIndex = 0x0A, + .mSpawnIndex = 0x00, + .mCutsceneIndex = CutsceneIndex_BoardingDemonTrain, + .mNextSceneIndex = SceneIndex_b_last1, + .mNextRoomIndex = 0x00, + .mNextSpawnIndex = 0x00, + .mNextCutsceneIndex = CutsceneIndex_None, + .mNextIsCS = false, + .mUnk_0D = false, + .mUnk_0E = 0x005D, + .mFlag = AdventureFlag_None, + .mUnk_12 = 0x0000, + .mUnk_14 = 0, + .mUnk_18 = 1, + }, + { + // CutsceneIndex_BeforeMalladusBeast_01 (Demon Train getting destroyed) + .mUnk_00 = "d20_01", + .mSceneIndex = SceneIndex_demo_train, + .mRoomIndex = 0x0A, + .mSpawnIndex = 0x00, + .mCutsceneIndex = CutsceneIndex_BeforeMalladusBeast_01, + .mNextSceneIndex = SceneIndex_b_last2, + .mNextRoomIndex = 0x00, + .mNextSpawnIndex = 0x00, + .mNextCutsceneIndex = CutsceneIndex_BeforeMalladusBeast_02, + .mNextIsCS = false, + .mUnk_0D = false, + .mUnk_0E = 0x005D, + .mFlag = AdventureFlag_None, + .mUnk_12 = 0x0000, + .mUnk_14 = 0, + .mUnk_18 = 1, + }, + { + // CutsceneIndex_BeforeMalladusBeast_02 (Zelda getting her body back) + .mUnk_00 = "d20_02", + .mSceneIndex = SceneIndex_b_last2, + .mRoomIndex = 0x00, + .mSpawnIndex = 0x00, + .mCutsceneIndex = CutsceneIndex_BeforeMalladusBeast_02, + .mNextSceneIndex = SceneIndex_b_last2, + .mNextRoomIndex = 0x00, + .mNextSpawnIndex = 0x00, + .mNextCutsceneIndex = CutsceneIndex_BeforeMalladusBeast_03, + .mNextIsCS = false, + .mUnk_0D = true, + .mUnk_0E = 0x0060, + .mFlag = AdventureFlag_None, + .mUnk_12 = 0x0000, + .mUnk_14 = 0, + .mUnk_18 = 1, + }, + { + // CutsceneIndex_BeforeMalladusBeast_03 (Beast Malladus appearing) + .mUnk_00 = "d20_03", + .mSceneIndex = SceneIndex_b_last2, + .mRoomIndex = 0x00, + .mSpawnIndex = 0x00, + .mCutsceneIndex = CutsceneIndex_BeforeMalladusBeast_03, + .mNextSceneIndex = SceneIndex_b_last2, + .mNextRoomIndex = 0x00, + .mNextSpawnIndex = 0x00, + .mNextCutsceneIndex = CutsceneIndex_None, + .mNextIsCS = false, + .mUnk_0D = false, + .mUnk_0E = 0x0060, + .mFlag = AdventureFlag_None, + .mUnk_12 = 0x0000, + .mUnk_14 = 0, + .mUnk_18 = 1, + }, + { + // CutsceneIndex_PreCredits + .mUnk_00 = "d21_01", + .mSceneIndex = SceneIndex_b_last2, + .mRoomIndex = 0x00, + .mSpawnIndex = 0x00, + .mCutsceneIndex = CutsceneIndex_PreCredits, + .mNextSceneIndex = SceneIndex_f_hyral, + .mNextRoomIndex = 0x05, + .mNextSpawnIndex = 0x00, + .mNextCutsceneIndex = CutsceneIndex_Credits_01, + .mNextIsCS = false, + .mUnk_0D = false, + .mUnk_0E = 0x002D, + .mFlag = AdventureFlag_None, + .mUnk_12 = 0x0000, + .mUnk_14 = 0, + .mUnk_18 = 1, + }, + { + // CutsceneIndex_Credits_01 (Credits followed by first ending) + .mUnk_00 = "d23_01", + .mSceneIndex = SceneIndex_f_hyral, + .mRoomIndex = 0x05, + .mSpawnIndex = 0x00, + .mCutsceneIndex = CutsceneIndex_Credits_01, + .mNextSceneIndex = SceneIndex_demo_train, + .mNextRoomIndex = 0x00, + .mNextSpawnIndex = 0x00, + .mNextCutsceneIndex = CutsceneIndex_TitleScreen, + .mNextIsCS = true, + .mUnk_0D = false, + .mUnk_0E = 0x005E, + .mFlag = AdventureFlag_None, + .mUnk_12 = 0x0000, + .mUnk_14 = 0, + .mUnk_18 = 1, + }, + { + // CutsceneIndex_Credits_02 (Credits followed by second ending) + .mUnk_00 = "d23_02", + .mSceneIndex = SceneIndex_f_hyral, + .mRoomIndex = 0x05, + .mSpawnIndex = 0x00, + .mCutsceneIndex = CutsceneIndex_Credits_02, + .mNextSceneIndex = SceneIndex_demo_train, + .mNextRoomIndex = 0x00, + .mNextSpawnIndex = 0x00, + .mNextCutsceneIndex = CutsceneIndex_TitleScreen, + .mNextIsCS = true, + .mUnk_0D = false, + .mUnk_0E = 0x005E, + .mFlag = AdventureFlag_None, + .mUnk_12 = 0x0000, + .mUnk_14 = 0, + .mUnk_18 = 1, + }, + { + // CutsceneIndex_Credits_03 (Credits followed by third ending) + .mUnk_00 = "d23_03", + .mSceneIndex = SceneIndex_f_hyral, + .mRoomIndex = 0x05, + .mSpawnIndex = 0x00, + .mCutsceneIndex = CutsceneIndex_Credits_03, + .mNextSceneIndex = SceneIndex_demo_train, + .mNextRoomIndex = 0x00, + .mNextSpawnIndex = 0x00, + .mNextCutsceneIndex = CutsceneIndex_TitleScreen, + .mNextIsCS = true, + .mUnk_0D = false, + .mUnk_0E = 0x005E, + .mFlag = AdventureFlag_None, + .mUnk_12 = 0x0000, + .mUnk_14 = 0, + .mUnk_18 = 1, + }, + { + // CutsceneIndex_SpiritPipes + .mUnk_00 = "d24_01", + .mSceneIndex = SceneIndex_f_hyral, + .mRoomIndex = 0x05, + .mSpawnIndex = 0x00, + .mCutsceneIndex = CutsceneIndex_SpiritPipes, + .mNextSceneIndex = SceneIndex_f_hyral, + .mNextRoomIndex = 0x05, + .mNextSpawnIndex = 0x01, + .mNextCutsceneIndex = CutsceneIndex_None, + .mNextIsCS = false, + .mUnk_0D = false, + .mUnk_0E = 0x005F, + .mFlag = AdventureFlag_ObtainedSpiritPipes, + .mUnk_12 = 0x0000, + .mUnk_14 = 0, + .mUnk_18 = 1, + }, + { + // CutsceneIndex_ForestTracksRestoredFromGlyph + .mUnk_00 = "d25_01", + .mSceneIndex = SceneIndex_demo_train, + .mRoomIndex = 0x02, + .mSpawnIndex = 0x00, + .mCutsceneIndex = CutsceneIndex_ForestTracksRestoredFromGlyph, + .mNextSceneIndex = SceneIndex_d_main, + .mNextRoomIndex = 0x02, + .mNextSpawnIndex = 0x01, + .mNextCutsceneIndex = CutsceneIndex_None, + .mNextIsCS = false, + .mUnk_0D = false, + .mUnk_0E = 0x0053, + .mFlag = AdventureFlag_ForestTracksRestoredFromGlyphCS, + .mUnk_12 = 0x0000, + .mUnk_14 = 1, + .mUnk_18 = 0, + }, + { + // CutsceneIndex_MalladusBeastDestroyed + .mUnk_00 = "d26_01", + .mSceneIndex = SceneIndex_b_last2, + .mRoomIndex = 0x00, + .mSpawnIndex = 0x00, + .mCutsceneIndex = CutsceneIndex_MalladusBeastDestroyed, + .mNextSceneIndex = SceneIndex_b_last2, + .mNextRoomIndex = 0x00, + .mNextSpawnIndex = 0x00, + .mNextCutsceneIndex = CutsceneIndex_PreCredits, + .mNextIsCS = false, + .mUnk_0D = true, + .mUnk_0E = 0x0060, + .mFlag = AdventureFlag_None, + .mUnk_12 = 0x0000, + .mUnk_14 = 0, + .mUnk_18 = 1, + }, +}; + +CutsceneParamsEntry *Cutscene_GetParamEntry(s32 csIndex) { + return (CutsceneParamsEntry *) &gCSParamsEntries[csIndex]; +} + +s32 func_ov000_020a7840(unk32 param1) {} + +bool Cutscene_IsAdventureFlagSet(s32 csIndex) { + CutsceneParamsEntry *pEntry = Cutscene_GetParamEntry(csIndex); + + if (pEntry->mFlag == AdventureFlag_None) { + return false; + } + + return GET_FLAG(data_027e09b8->mAdventureFlags, pEntry->mFlag); +} diff --git a/src/001_SceneInit/Actor/ActorManager_001.cpp b/src/001_SceneInit/Actor/ActorManager_001.cpp index b0a7e75b..8c6832d3 100644 --- a/src/001_SceneInit/Actor/ActorManager_001.cpp +++ b/src/001_SceneInit/Actor/ActorManager_001.cpp @@ -347,11 +347,11 @@ THUMB bool ActorManager::func_ov001_020bb728(s32 param1) { if (param1 == data_ov001_020c2638[i]) { value = data_ov001_020c2624[i] & 0x1F; - value2 = data_027e09b8->mUnk_14[(u32) data_ov001_020c2624[i] >> 5]; + value2 = data_027e09b8->mAdventureFlags[(u32) data_ov001_020c2624[i] >> 5]; if ((1 << value) & value2) { value = data_ov001_020c262e[i] & 0x1F; - value2 = data_027e09b8->mUnk_14[(u32) data_ov001_020c262e[i] >> 5]; + value2 = data_027e09b8->mAdventureFlags[(u32) data_ov001_020c262e[i] >> 5]; if (!((1 << value) & value2)) { continue; diff --git a/src/025_Title/GameModeTitleScreen.cpp b/src/025_Title/GameModeTitleScreen.cpp index 44193fb9..b6bb2930 100644 --- a/src/025_Title/GameModeTitleScreen.cpp +++ b/src/025_Title/GameModeTitleScreen.cpp @@ -1,23 +1,15 @@ #include "Game/GameModeTitleScreen.hpp" +#include "Cutscene/Cutscene.hpp" #include "Game/Game.hpp" #include "TitleScreen/TitleScreen.hpp" #include "Unknown/UnkStruct_0204a088.hpp" #include "Unknown/UnkStruct_0204a110.hpp" #include "Unknown/UnkStruct_027e09a4.hpp" -struct UnkStruct_ov000_020a782c { - /* 00 */ unk32 mUnk_00; - /* 04 */ u8 mUnk_04; - /* 05 */ u8 mUnk_05; - /* 06 */ u8 mUnk_06; - /* 07 */ u8 mUnk_07; -}; - extern "C" { void func_0201659c(); void func_0200e234(); void func_ov001_020b6520(unk32 param1); -UnkStruct_ov000_020a782c *func_ov000_020a782c(unk32 param1); } ARM GameModeTitleScreen::GameModeTitleScreen() { @@ -32,44 +24,9 @@ ARM GameModeTitleScreen::~GameModeTitleScreen() { func_0200e234(); } -struct stack_struct { - /* 00 */ unk32 mUnk_00; - /* 04 */ unk32 mUnk_04; - /* 08 */ unk16 mUnk_08; - /* 0A */ unk8 mUnk_0A; - /* 0B */ unk8 mUnk_0B; - /* 0C */ unk8 mUnk_0C; - /* 0D */ unk8 mUnk_0D; - /* 0E */ unk8 mUnk_0E; - /* 0F */ unk8 mmUnk_0F; - /* 10 */ unk8 mUnk_10; - /* 11 */ unk8 mUnk_11; - /* 12 */ unk8 mUnk_12; - /* 13 */ unk8 mUnk_13; - /* 14 */ -}; - ARM void GameModeTitleScreen::vfunc_08() { this->GameModeBase::vfunc_08(); - - UnkStruct_ov000_020a782c *iVar1 = func_ov000_020a782c(0); - u8 mUnk_04 = iVar1->mUnk_04; - u8 mUnk_07 = iVar1->mUnk_07; - u8 mUnk_06 = iVar1->mUnk_06; - u8 mUnk_05 = iVar1->mUnk_05; - - stack_struct stack; - stack.mUnk_00 = mUnk_04; - stack.mUnk_04 = 0; - stack.mUnk_08 = 0; - stack.mUnk_0A = mUnk_05; - stack.mUnk_0B = mUnk_06; - stack.mUnk_0C = 1; - stack.mUnk_0D = 0; - stack.mUnk_0E = mUnk_07; - stack.mmUnk_0F = 0; - stack.mUnk_10 = 0; - + UnkStruct_SceneChange1 stack(Cutscene_GetParamEntry(CutsceneIndex_TitleScreen), true); data_027e09a4->func_ov000_020707a8(&stack); } diff --git a/src/110_PlayerGet/PlayerGet.cpp b/src/110_PlayerGet/PlayerGet.cpp index abb2e1cd..7e412935 100644 --- a/src/110_PlayerGet/PlayerGet.cpp +++ b/src/110_PlayerGet/PlayerGet.cpp @@ -180,7 +180,7 @@ ARM bool ItemManager::func_ov110_02184a40(ItemId itemId) { if (temp_r0_5 != 0) { temp_r0_5 &= 0xFFFF; - SET_FLAG(data_027e09b8->mUnk_14, temp_r0_5); + SET_FLAG(data_027e09b8->mAdventureFlags, temp_r0_5); } data_027e0ce0->mUnk_34->func_ov110_02185d3c(itemId); @@ -669,7 +669,11 @@ ARM void PlayerGet::vfunc_10(unk32 param1, unk32 param2) { } if (*(u16 *) this->mUnk_54.mUnk_00 == 0x1000) { - MapObject *pMapObj = gpMapObjManager->func_01fff498(this->mUnk_54.mUnk_00[0], this->mUnk_54.mUnk_00[1]); + UnkStruct_func_01fff498 stack; + stack.ptrIndex = this->mUnk_54.mUnk_00[0]; + stack.valueIndex = this->mUnk_54.mUnk_00[1]; + + MapObject *pMapObj = gpMapObjManager->func_01fff498(stack); if (pMapObj != NULL) { var_r5_2 = MapObjectId_None; @@ -697,9 +701,9 @@ ARM void PlayerGet::vfunc_10(unk32 param1, unk32 param2) { } if (this->mUnk_54.mItemId == ItemId_ForestGlyph) { - this->mUnk_72 = data_027e09a4->func_ov000_02070bd0(0x29, 0); + this->mUnk_72 = data_027e09a4->func_ov000_02070bd0(CutsceneIndex_ForestTracksRestoredFromGlyph, 0); } else if (this->mUnk_54.mItemId == ItemId_FireGlyph) { - this->mUnk_72 = data_027e09a4->func_ov000_02070bd0(0x14, 0); + this->mUnk_72 = data_027e09a4->func_ov000_02070bd0(CutsceneIndex_StavenInTOSAfterFireGlyph_01, 0); } if (this->mUnk_72 != 0) { diff --git a/src/112_PlayerSceneChange/PlayerSceneChange.cpp b/src/112_PlayerSceneChange/PlayerSceneChange.cpp index d2651097..5a8446c1 100644 --- a/src/112_PlayerSceneChange/PlayerSceneChange.cpp +++ b/src/112_PlayerSceneChange/PlayerSceneChange.cpp @@ -144,8 +144,11 @@ ARM void PlayerSceneChange::vfunc_0c(UnkStruct_PlayerGet_vfunc_0c_param1 *param1 break; default: if (this->mUnk_2C->mUnk_150 == 0x1000) { - MapObjectUnkDRTY *pDRTY = - (MapObjectUnkDRTY *) gpMapObjManager->func_01fff498(this->mUnk_2C->mUnk_150 >> 0x10, 0); + UnkStruct_func_01fff498 stack; + stack.ptrIndex = this->mUnk_2C->mUnk_150 >> 0x10; + stack.valueIndex = 0; + + MapObjectUnkDRTY *pDRTY = (MapObjectUnkDRTY *) gpMapObjManager->func_01fff498(stack); if (pDRTY != NULL) { pDRTY->func_ov000_0209d6ac((Vec3p *) &this->mUnk_70); @@ -283,7 +286,11 @@ ARM void PlayerSceneChange::vfunc_0c(UnkStruct_PlayerGet_vfunc_0c_param1 *param1 return; } - MapObject *target = gpMapObjManager->func_01fff498(this->mUnk_8C >> 16, 0); + UnkStruct_func_01fff498 stack; + stack.ptrIndex = this->mUnk_8C >> 16; + stack.valueIndex = 0; + + MapObject *target = gpMapObjManager->func_01fff498(stack); if (target != NULL && target->GetMapObjectId() == MapObjectId_WPHL) { func_ov034_02121de4(target); } diff --git a/src/ITCM/ITCM_MapObjectManager.cpp b/src/ITCM/ITCM_MapObjectManager.cpp new file mode 100644 index 00000000..ce130268 --- /dev/null +++ b/src/ITCM/ITCM_MapObjectManager.cpp @@ -0,0 +1,72 @@ +#include "MapObject/MapObjectManager.hpp" + +struct UnkStruct { + unk32 one; + unk32 two; + unk32 three; + unk32 four; +}; + +extern "C" void func_01ffecdc(int, void *); + +MapObject *MapObjectManager::func_01fff498(UnkStruct_func_01fff498 param1) { + if (this->mUnk_0C[param1.valueIndex][param1.ptrIndex] < 0) { + return NULL; + } + + return this->mMapObjTable[this->mUnk_0C[param1.valueIndex][param1.ptrIndex]]; +} + +void MapObjectManager::func_01fff4cc(UnkCallback_func_01fff4cc param1, void *param2) { + MapObject **ptr = this->mMapObjTable; + + while (ptr != this->mUnk_08) { + if (*ptr != NULL && GET_FLAG((*ptr)->mFlags, MapObjFlag_Alive)) { + param1(*ptr, param2); + } + + ptr++; + } +} + +MapObject **MapObjectManager::func_01fff520(UnkStruct_ov000_020b34c4 *param1, MapObject **param2) { + MapObject **ptr = param2; + + while (ptr != this->mUnk_08) { + MapObject *ptr2 = *ptr; + if (ptr2 != NULL && GET_FLAG((ptr2)->mFlags, MapObjFlag_Alive)) { + + //! TODO: fake match + if (param1->vfunc_00(ptr2)) { + break; + } + } + + ptr++; + } + + return ptr; +} + +MapObjectId MapObject::GetMapObjectId() { + return this->mpProfile->mMapObjId; +} + +void MapObject::func_01fff590(unk32 param2) { + UnkStruct stack; + unk32 one; + unk32 two; + unk32 three; + unk32 four; + + four = this->mpProfile->mUnk_08; + one = (three = this->mPos.x); + two = this->mPos.y; + three = this->mPos.z; + + stack.one = one; + stack.two = two; + stack.three = three; + stack.four = four; + func_01ffecdc(param2, &stack); +} diff --git a/tools/configure.py b/tools/configure.py index 041000d5..921667e6 100755 --- a/tools/configure.py +++ b/tools/configure.py @@ -131,6 +131,12 @@ def GameLib(lib_name: str, objects: List[Object]) -> Dict[str, Any]: config.warn_missing_source = True config.libs = [ + GameLib( + "ITCM", + [ + Object("ITCM/ITCM_MapObjectManager.cpp"), + ] + ), GameLib( "Main", [ @@ -168,6 +174,7 @@ def GameLib(lib_name: str, objects: List[Object]) -> Dict[str, Any]: Object("000_Second/MapObject/MapObject.cpp"), Object("000_Second/MapObject/MapObjectSwitchStep.cpp"), Object("000_Second/MapObject/MapObjectMiniBlocks.cpp"), + Object("000_Second/Cutscene/Cutscene.cpp"), Object("000_Second/Item/ItemManager.cpp"), Object("000_Second/Actor/ActorUnk_ov000_020a8bb0.cpp"), Object("000_Second/Item/TreasureManager.cpp"),