Add CScanTreeInventory loading

This commit is contained in:
Henrique Gemignani Passos Lima
2026-05-09 17:37:04 +03:00
parent 32790c6612
commit 5deed2ad82
6 changed files with 138 additions and 5 deletions
+1 -1
View File
@@ -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"
}
+3
View File
@@ -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
+4 -4
View File
@@ -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
+1
View File
@@ -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"),
],
},
{
@@ -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
@@ -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
);
}