diff --git a/.vscode/settings.json b/.vscode/settings.json index 3a76b21..a632180 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -44,7 +44,7 @@ "C/C++ Include Guard.Auto Update Path Blocklist": [ "include/zlib" ], - "search.useIgnoreFiles": false, + "search.useIgnoreFiles": true, // Disable C++ intellisense engine, use clangd instead "C_Cpp.intelliSenseEngine": "disabled" } diff --git a/config/G2ME01/splits.txt b/config/G2ME01/splits.txt index 18968ff..30da24d 100644 --- a/config/G2ME01/splits.txt +++ b/config/G2ME01/splits.txt @@ -93,6 +93,9 @@ MetroidPrime/ScriptObjects/CScriptSequenceTimer.cpp: MetroidPrime/CRuleSet.cpp: .text start:0x801F5E04 end:0x801F6638 +MetroidPrime/ScriptObjects/CScanTreeInventory.cpp: + .text start:0x8020EBF0 end:0x8020EE18 + MetroidPrime/ScriptLoaderRel.cpp: .text start:0x8021BA60 end:0x8021BFE0 .sbss start:0x80419480 end:0x804194F0 diff --git a/config/G2ME01/symbols.txt b/config/G2ME01/symbols.txt index 8e9318e..fee46ad 100644 --- a/config/G2ME01/symbols.txt +++ b/config/G2ME01/symbols.txt @@ -8492,7 +8492,7 @@ fn_8020E548 = .text:0x8020E548; // type:function size:0x1C0 fn_8020E708 = .text:0x8020E708; // type:function size:0x3A0 fn_8020EAA8 = .text:0x8020EAA8; // type:function size:0xA8 fn_8020EB50 = .text:0x8020EB50; // type:function size:0xA0 -fn_8020EBF0 = .text:0x8020EBF0; // type:function size:0x228 +LoadScanTreeInventory__FPiR12CInputStream = .text:0x8020EBF0; // type:function size:0x228 fn_8020EE18 = .text:0x8020EE18; // type:function size:0x1D0 fn_8020EFE8 = .text:0x8020EFE8; // type:function size:0x194 fn_8020F17C = .text:0x8020F17C; // type:function size:0x2CC @@ -10201,9 +10201,9 @@ fn_8024133C = .text:0x8024133C; // type:function size:0x3C fn_80241378 = .text:0x80241378; // type:function size:0xC4 align:4 fn_8024143C = .text:0x8024143C; // type:function size:0x3C align:4 fn_80241478 = .text:0x80241478; // type:function size:0x10 align:4 -fn_80241488 = .text:0x80241488; // type:function size:0xA8 -fn_80241530 = .text:0x80241530; // type:function size:0x3C -fn_8024156C = .text:0x8024156C; // type:function size:0xC +LoadTypedefSLdrScannableParameters__FR23SLdrScannableParametersR12CInputStream = .text:0x80241488; // type:function size:0xA8 +__dt__23SLdrScannableParametersFv = .text:0x80241530; // type:function size:0x3C +__ct__23SLdrScannableParametersFv = .text:0x8024156C; // type:function size:0xC fn_80241578 = .text:0x80241578; // type:function size:0xC4 fn_8024163C = .text:0x8024163C; // type:function size:0x3C fn_80241678 = .text:0x80241678; // type:function size:0x14 diff --git a/configure.py b/configure.py index cb6d44c..02d003e 100644 --- a/configure.py +++ b/configure.py @@ -346,6 +346,7 @@ config.libs = [ Object(NonMatching, "MetroidPrime/ScriptObjects/CScriptSpawnPoint.cpp"), Object(NonMatching, "MetroidPrime/CRuleSet.cpp"), Object(NonMatching, "MetroidPrime/Player/CPlayer.cpp"), + Object(NonMatching, "MetroidPrime/ScriptObjects/CScanTreeInventory.cpp"), ], }, { diff --git a/include/MetroidPrime/ScriptObjects/CScanTreeInventory.hpp b/include/MetroidPrime/ScriptObjects/CScanTreeInventory.hpp new file mode 100644 index 0000000..4795fcd --- /dev/null +++ b/include/MetroidPrime/ScriptObjects/CScanTreeInventory.hpp @@ -0,0 +1,20 @@ +#ifndef _CSCANTREEINVENTORY +#define _CSCANTREEINVENTORY + +#include "rstl/string.hpp" +#include "Kyoto/SObjectTag.hpp" + +#include "MetroidPrime/Player/CPlayerState.hpp" + +class CInputStream; +class SLdrTransform; + +class CScanTreeInventory { +public: +CScanTreeInventory(int id, const SLdrTransform& transform, CAssetId nameStringTable, CAssetId scannableInfo, + CPlayerState::EItemType inventorySlotId, const rstl::string& nameStringName); +}; + +CScanTreeInventory* LoadScanTreeInventory(int* id, CInputStream& input); + +#endif // _CSCANTREEINVENTORY diff --git a/src/MetroidPrime/ScriptObjects/CScanTreeInventory.cpp b/src/MetroidPrime/ScriptObjects/CScanTreeInventory.cpp new file mode 100644 index 0000000..484c5f2 --- /dev/null +++ b/src/MetroidPrime/ScriptObjects/CScanTreeInventory.cpp @@ -0,0 +1,109 @@ +#include "MetroidPrime/ScriptObjects/CScanTreeInventory.hpp" + +#include "Kyoto/SObjectTag.hpp" +#include "Kyoto/Streams/CInputStream.hpp" + +#include "MetroidPrime/Player/CPlayerState.hpp" +#include "MetroidPrime/ScriptLoader/SLdrEditorProperties.hpp" +#include "MetroidPrime/ScriptLoader/SLdrScannableParameters.hpp" +#include "rstl/string.hpp" + +static const CPlayerState::EItemType kInventorySlotToItemType[] = { + CPlayerState::kIT_PowerBeam, + CPlayerState::kIT_DarkBeam, + CPlayerState::kIT_LightBeam, + CPlayerState::kIT_AnnihilatorBeam, + CPlayerState::kIT_SuperMissile, + CPlayerState::kIT_Darkburst, + CPlayerState::kIT_Sunburst, + CPlayerState::kIT_SonicBoom, + CPlayerState::kIT_CombatVisor, + CPlayerState::kIT_ScanVisor, + CPlayerState::kIT_DarkVisor, + CPlayerState::kIT_EchoVisor, + CPlayerState::kIT_VariaSuit, + CPlayerState::kIT_DarkSuit, + CPlayerState::kIT_LightSuit, + CPlayerState::kIT_MorphBall, + CPlayerState::kIT_BoostBall, + CPlayerState::kIT_SpiderBall, + CPlayerState::kIT_MorphBallBombs, + CPlayerState::kIT_DarkBomb, + CPlayerState::kIT_LightBomb, + CPlayerState::kIT_AnnihilatorBomb, + CPlayerState::kIT_ChargeBeam, + CPlayerState::kIT_GrappleBeam, + CPlayerState::kIT_SpaceJumpBoots, + CPlayerState::kIT_GravityBoost, + CPlayerState::kIT_SeekerLauncher, + CPlayerState::kIT_ScrewAttack, + CPlayerState::kIT_Powerbomb, + CPlayerState::kIT_Missile, + CPlayerState::kIT_DarkAmmo, + CPlayerState::kIT_LightAmmo, + CPlayerState::kIT_EnergyTanks, + CPlayerState::kIT_TempleKey1, + CPlayerState::kIT_TempleKey2, + CPlayerState::kIT_TempleKey3, + CPlayerState::kIT_TempleKey4, + CPlayerState::kIT_TempleKey5, + CPlayerState::kIT_TempleKey6, + CPlayerState::kIT_TempleKey7, + CPlayerState::kIT_TempleKey8, + CPlayerState::kIT_TempleKey9, + CPlayerState::kIT_AgonKey1, + CPlayerState::kIT_AgonKey2, + CPlayerState::kIT_AgonKey3, + CPlayerState::kIT_TorvusKey1, + CPlayerState::kIT_TorvusKey2, + CPlayerState::kIT_TorvusKey3, + CPlayerState::kIT_HiveKey1, + CPlayerState::kIT_HiveKey2, + CPlayerState::kIT_HiveKey3, + CPlayerState::kIT_EnergyTransferModule, + CPlayerState::kIT_ChargeCombo +}; + +struct SLdrScanTreeInventory { + SLdrEditorProperties editorProperties; + CAssetId nameStringTable; + rstl::string nameStringName; + int inventorySlotId; + SLdrScannableParameters scannableParams; +}; + +CScanTreeInventory* LoadScanTreeInventory(int* id, CInputStream& input) { + SLdrScanTreeInventory sldrThis; + + int propertyCount = input.ReadUint16(); + for (int i = 0; i < propertyCount; ++i) { + uint propertyId = (uint)input.ReadInt32(); + u16 propertySize = input.ReadUint16(); + + switch (propertyId) { + case 0x255a4580: + LoadTypedefSLdrEditorProperties(sldrThis.editorProperties, input); + break; + case 0x46219bac: + sldrThis.nameStringTable = input.ReadInt32(); + break; + case 0x32698bd6: + sldrThis.nameStringName = rstl::string(input); + break; + case 0x3d326f90: + sldrThis.inventorySlotId = input.ReadInt32(); + break; + case 0x2da1ec33: + LoadTypedefSLdrScannableParameters(sldrThis.scannableParams, input); + break; + default: + input.ReadBytes(nullptr, propertySize); + break; + } + } + + return new CScanTreeInventory( + *id & 0xffff, sldrThis.editorProperties.transform, sldrThis.nameStringTable, + sldrThis.scannableParams.scannableInfo0, sldrThis.inventorySlotId < 0x35 ? kInventorySlotToItemType[sldrThis.inventorySlotId] : CPlayerState::kIT_PowerBeam, sldrThis.nameStringName + ); +}