Match and link CObjectList

Former-commit-id: ba9184e06f
This commit is contained in:
Phillip Stephens 2022-10-13 21:50:56 -07:00
parent 09fe85b522
commit 48261eb77e
7 changed files with 77 additions and 24 deletions

View File

@ -3,8 +3,8 @@
.section .data .section .data
.balign 8 .balign 8
.global lbl_803D96D8 .global __vt__11CObjectList
lbl_803D96D8: __vt__11CObjectList:
# ROM: 0x3D66D8 # ROM: 0x3D66D8
.4byte 0 .4byte 0
.4byte 0 .4byte 0
@ -282,10 +282,10 @@ IsQualified__11CObjectListFRC7CEntity:
__ct__11CObjectListF15EGameObjectList: __ct__11CObjectListF15EGameObjectList:
/* 80010038 0000CF98 94 21 FF F0 */ stwu r1, -0x10(r1) /* 80010038 0000CF98 94 21 FF F0 */ stwu r1, -0x10(r1)
/* 8001003C 0000CF9C 7C 08 02 A6 */ mflr r0 /* 8001003C 0000CF9C 7C 08 02 A6 */ mflr r0
/* 80010040 0000CFA0 3C A0 80 3E */ lis r5, lbl_803D96D8@ha /* 80010040 0000CFA0 3C A0 80 3E */ lis r5, __vt__11CObjectList@ha
/* 80010044 0000CFA4 38 C0 00 08 */ li r6, 8 /* 80010044 0000CFA4 38 C0 00 08 */ li r6, 8
/* 80010048 0000CFA8 90 01 00 14 */ stw r0, 0x14(r1) /* 80010048 0000CFA8 90 01 00 14 */ stw r0, 0x14(r1)
/* 8001004C 0000CFAC 38 05 96 D8 */ addi r0, r5, lbl_803D96D8@l /* 8001004C 0000CFAC 38 05 96 D8 */ addi r0, r5, __vt__11CObjectList@l
/* 80010050 0000CFB0 38 A0 00 00 */ li r5, 0 /* 80010050 0000CFB0 38 A0 00 00 */ li r5, 0
/* 80010054 0000CFB4 38 E0 04 00 */ li r7, 0x400 /* 80010054 0000CFB4 38 E0 04 00 */ li r7, 0x400
/* 80010058 0000CFB8 93 E1 00 0C */ stw r31, 0xc(r1) /* 80010058 0000CFB8 93 E1 00 0C */ stw r31, 0xc(r1)

View File

@ -10033,9 +10033,9 @@ UpdateObjectTooCloseId__11CBallCameraFR13CStateManager:
/* 8008997C 000868DC 80 84 08 4C */ lwz r4, 0x84c(r4) /* 8008997C 000868DC 80 84 08 4C */ lwz r4, 0x84c(r4)
/* 80089980 000868E0 48 1F B3 C9 */ bl GetBallPosition__7CPlayerCFv /* 80089980 000868E0 48 1F B3 C9 */ bl GetBallPosition__7CPlayerCFv
/* 80089984 000868E4 80 BF 08 48 */ lwz r5, 0x848(r31) /* 80089984 000868E4 80 BF 08 48 */ lwz r5, 0x848(r31)
/* 80089988 000868E8 3C 60 80 3E */ lis r3, lbl_803D96D8@ha /* 80089988 000868E8 3C 60 80 3E */ lis r3, __vt__11CObjectList@ha
/* 8008998C 000868EC C3 9E 00 40 */ lfs f28, 0x40(r30) /* 8008998C 000868EC C3 9E 00 40 */ lfs f28, 0x40(r30)
/* 80089990 000868F0 38 03 96 D8 */ addi r0, r3, lbl_803D96D8@l /* 80089990 000868F0 38 03 96 D8 */ addi r0, r3, __vt__11CObjectList@l
/* 80089994 000868F4 C3 7E 00 50 */ lfs f27, 0x50(r30) /* 80089994 000868F4 C3 7E 00 50 */ lfs f27, 0x50(r30)
/* 80089998 000868F8 38 81 00 70 */ addi r4, r1, 0x70 /* 80089998 000868F8 38 81 00 70 */ addi r4, r1, 0x70
/* 8008999C 000868FC C3 5E 00 60 */ lfs f26, 0x60(r30) /* 8008999C 000868FC C3 5E 00 60 */ lfs f26, 0x60(r30)

View File

@ -40,7 +40,7 @@ LIBS = [
"MetroidPrime/Cameras/CCameraManager", "MetroidPrime/Cameras/CCameraManager",
"MetroidPrime/CControlMapper", "MetroidPrime/CControlMapper",
"MetroidPrime/Cameras/CFirstPersonCamera", "MetroidPrime/Cameras/CFirstPersonCamera",
"MetroidPrime/CObjectList", ["MetroidPrime/CObjectList", True],
"MetroidPrime/Player/CPlayer", "MetroidPrime/Player/CPlayer",
["MetroidPrime/CAxisAngle", True], ["MetroidPrime/CAxisAngle", True],
"MetroidPrime/CEulerAngles", "MetroidPrime/CEulerAngles",

View File

@ -32,6 +32,7 @@ public:
TAreaId GetAreaId() const; TAreaId GetAreaId() const;
TAreaId GetAreaIdAlways() const { return x4_areaId; } TAreaId GetAreaIdAlways() const { return x4_areaId; }
bool GetActive() const { return x30_24_active; } bool GetActive() const { return x30_24_active; }
bool IsScriptingBlocked() const { return x30_26_scriptingBlocked; }
// might be fake? // might be fake?
rstl::vector< SConnection >& ConnectionList() { return x20_conns; } rstl::vector< SConnection >& ConnectionList() { return x20_conns; }

View File

@ -25,23 +25,23 @@ class CObjectList {
CEntity* mEnt; CEntity* mEnt;
short mNext; short mNext;
short mPrev; short mPrev;
SObjectListEntry(); SObjectListEntry() : mEnt(nullptr), mNext(-1), mPrev(-1) {}
}; };
public: public:
CObjectList(EGameObjectList list); CObjectList(EGameObjectList list);
virtual bool IsQualified(CEntity& ent); virtual bool IsQualified(const CEntity& ent);
void AddObject(CEntity& ent); void AddObject(CEntity& ent);
void RemoveObject(TUniqueId uid); void RemoveObject(TUniqueId uid);
CEntity* GetObjectById(); CEntity* GetObjectById(TUniqueId uid);
const CEntity* GetObjectById() const; const CEntity* GetObjectById(TUniqueId uid) const;
CEntity* GetValidObjectById(TUniqueId uid); CEntity* GetValidObjectById(TUniqueId uid);
const CEntity* GetValidObjectById(TUniqueId uid) const; const CEntity* GetValidObjectById(TUniqueId uid) const;
CEntity* operator[](int idx); CEntity* operator[](int idx);
const CEntity* operator[](int idx) const; const CEntity* operator[](int idx) const;
const CEntity* GetValidObjectByIndex(int idx) const; const CEntity* GetObjectByIndex(int idx) const;
int size() const { return mCount; } int size() const { return mCount; }
int GetFirstObjectIndex() const { return mFirstId; } int GetFirstObjectIndex() const { return mFirstId; }

View File

@ -7,7 +7,7 @@ METROIDPRIME :=\
$(BUILD_DIR)/asm/MetroidPrime/Cameras/CCameraManager.o\ $(BUILD_DIR)/asm/MetroidPrime/Cameras/CCameraManager.o\
$(BUILD_DIR)/asm/MetroidPrime/CControlMapper.o\ $(BUILD_DIR)/asm/MetroidPrime/CControlMapper.o\
$(BUILD_DIR)/asm/MetroidPrime/Cameras/CFirstPersonCamera.o\ $(BUILD_DIR)/asm/MetroidPrime/Cameras/CFirstPersonCamera.o\
$(BUILD_DIR)/asm/MetroidPrime/CObjectList.o\ $(BUILD_DIR)/src/MetroidPrime/CObjectList.o\
$(BUILD_DIR)/asm/MetroidPrime/Player/CPlayer.o\ $(BUILD_DIR)/asm/MetroidPrime/Player/CPlayer.o\
$(BUILD_DIR)/src/MetroidPrime/CAxisAngle.o\ $(BUILD_DIR)/src/MetroidPrime/CAxisAngle.o\
$(BUILD_DIR)/asm/MetroidPrime/CEulerAngles.o\ $(BUILD_DIR)/asm/MetroidPrime/CEulerAngles.o\

View File

@ -2,15 +2,13 @@
#include "MetroidPrime/CEntity.hpp" #include "MetroidPrime/CEntity.hpp"
CObjectList::SObjectListEntry::SObjectListEntry() : mEnt(nullptr), mNext(-1), mPrev(-1) {}
CObjectList::CObjectList(EGameObjectList list) : mListType(list), mFirstId(-1), mCount(0) { CObjectList::CObjectList(EGameObjectList list) : mListType(list), mFirstId(-1), mCount(0) {
for (int i = 0; i < kMaxObjects; ++i) { for (int i = 0; i < kMaxObjects; ++i) {
mObjects[i] = SObjectListEntry(); mObjects[i] = SObjectListEntry();
} }
} }
bool CObjectList::IsQualified(CEntity& ent) { return true; } bool CObjectList::IsQualified(const CEntity& ent) { return true; }
void CObjectList::AddObject(CEntity& ent) { void CObjectList::AddObject(CEntity& ent) {
if (IsQualified(ent)) { if (IsQualified(ent)) {
@ -28,18 +26,72 @@ void CObjectList::AddObject(CEntity& ent) {
} }
} }
void CObjectList::RemoveObject(TUniqueId uid) {} void CObjectList::RemoveObject(TUniqueId uid) {
if (mObjects[uid.Value()].mEnt == nullptr) {
return;
}
CEntity* CObjectList::GetObjectById() { return nullptr; } if (mObjects[uid.Value()].mEnt->GetUniqueId() != uid) {
return;
}
const CEntity* CObjectList::GetObjectById() const { return nullptr; } if (mFirstId == uid.Value()) {
mFirstId = mObjects[uid.Value()].mNext;
s16 next = mObjects[uid.Value()].mNext;
if (next != -1) {
mObjects[next].mPrev = -1;
}
} else {
mObjects[mObjects[uid.Value()].mPrev].mNext = mObjects[uid.Value()].mNext;
s16 next = mObjects[uid.Value()].mNext;
if (next != -1) {
mObjects[next].mPrev = mObjects[uid.Value()].mPrev;
}
}
--mCount;
mObjects[uid.Value()].mEnt = nullptr;
u16 index = uid.Value();
mObjects[index].mNext = -1;
mObjects[index].mPrev = -1;
}
CEntity* CObjectList::GetValidObjectById(TUniqueId uid) { return nullptr; } CEntity* CObjectList::GetObjectById(TUniqueId uid) {
if (uid == kInvalidUniqueId)
return nullptr;
CEntity* ret = mObjects[uid.Value()].mEnt;
return ret && uid == ret->GetUniqueId() && !ret->IsScriptingBlocked() ? ret : nullptr;
}
const CEntity* CObjectList::GetValidObjectById(TUniqueId uid) const { return nullptr; } const CEntity* CObjectList::GetObjectById(TUniqueId uid) const {
if (uid == kInvalidUniqueId)
return nullptr;
const CEntity* ret = mObjects[uid.Value()].mEnt;
return ret && uid == ret->GetUniqueId() && !ret->IsScriptingBlocked() ? ret : nullptr;
}
CEntity* CObjectList::operator[](int idx) { return nullptr; } CEntity* CObjectList::GetValidObjectById(TUniqueId uid) {
if (uid == kInvalidUniqueId)
return nullptr;
CEntity* ret = mObjects[uid.Value()].mEnt;
return ret && uid == ret->GetUniqueId() ? ret : nullptr;
}
const CEntity* CObjectList::operator[](int idx) const { return nullptr; } const CEntity* CObjectList::GetValidObjectById(TUniqueId uid) const {
if (uid == kInvalidUniqueId)
return nullptr;
CEntity* ret = mObjects[uid.Value()].mEnt;
return ret && uid == ret->GetUniqueId() ? ret : nullptr;
}
const CEntity* CObjectList::GetValidObjectByIndex(int idx) const { return nullptr; } CEntity* CObjectList::operator[](int idx) {
CEntity* ret = mObjects[idx].mEnt;
return ret == nullptr || ret->IsScriptingBlocked() ? nullptr : ret;
}
const CEntity* CObjectList::operator[](int idx) const {
const CEntity* ret = mObjects[idx].mEnt;
return ret == nullptr || ret->IsScriptingBlocked() ? nullptr : ret;
}
const CEntity* CObjectList::GetObjectByIndex(int idx) const { return mObjects[idx].mEnt; }