summaryrefslogtreecommitdiff
path: root/ZAPD/ZRoom/Commands/SetActorList.cpp
diff options
context:
space:
mode:
authorlouist103 <louist103@gmail.com>2022-10-25 10:47:22 -0400
committerlouist103 <louist103@gmail.com>2022-10-25 10:47:22 -0400
commit0293bafafe118dde1a238ea2546940302eb1baa9 (patch)
treeb862a47fde8857bc0460daa349b2775368d86d72 /ZAPD/ZRoom/Commands/SetActorList.cpp
parent78fdac56498f674eba2692e075d415a12cb4a31f (diff)
ActorList file node.
Diffstat (limited to 'ZAPD/ZRoom/Commands/SetActorList.cpp')
-rw-r--r--ZAPD/ZRoom/Commands/SetActorList.cpp158
1 files changed, 21 insertions, 137 deletions
diff --git a/ZAPD/ZRoom/Commands/SetActorList.cpp b/ZAPD/ZRoom/Commands/SetActorList.cpp
index 719b336..b3c186f 100644
--- a/ZAPD/ZRoom/Commands/SetActorList.cpp
+++ b/ZAPD/ZRoom/Commands/SetActorList.cpp
@@ -1,117 +1,56 @@
#include "SetActorList.h"
+#include <cassert>
+
#include "Globals.h"
#include "Utils/BitConverter.h"
#include "Utils/StringHelper.h"
-#include "ZFile.h"
-#include "ZRoom/ZNames.h"
#include "ZRoom/ZRoom.h"
SetActorList::SetActorList(ZFile* nParent) : ZRoomCommand(nParent)
{
}
+SetActorList::~SetActorList()
+{
+ if (actorList != nullptr)
+ delete actorList;
+}
+
void SetActorList::ParseRawData()
{
ZRoomCommand::ParseRawData();
numActors = cmdArg1;
-}
-void SetActorList::DeclareReferences(const std::string& prefix)
-{
- if (numActors != 0 && cmdArg2 != 0)
- {
- std::string varName =
- StringHelper::Sprintf("%sActorList_%06X", prefix.c_str(), segmentOffset);
- parent->AddDeclarationPlaceholder(segmentOffset, varName);
- }
+ actorList = new ZActorList(parent);
+ actorList->ExtractFromBinary(segmentOffset, numActors);
}
-void SetActorList::ParseRawDataLate()
+void SetActorList::DeclareReferences(const std::string& prefix)
{
- ZRoomCommand::ParseRawDataLate();
- size_t actorsAmount = zRoom->GetDeclarationSizeFromNeighbor(segmentOffset) / 0x10;
-
- uint32_t currentPtr = segmentOffset;
-
- actors.reserve(actorsAmount);
- for (size_t i = 0; i < actorsAmount; i++)
+ if (parent->HasDeclaration(segmentOffset))
{
- ActorSpawnEntry entry(parent->GetRawData(), currentPtr);
-
- currentPtr += entry.GetRawDataSize();
- actors.push_back(entry);
- }
-}
-
-void SetActorList::DeclareReferencesLate(const std::string& prefix)
-{
- if (actors.empty())
+ delete actorList;
+ actorList = static_cast<ZActorList*>(parent->FindResource(segmentOffset));
+ assert(actorList != nullptr);
+ assert(actorList->GetResourceType() == ZResourceType::ActorList);
return;
-
- std::string declaration;
-
- size_t largestlength = 0;
- for (const auto& entry : actors)
- {
- size_t actorNameLength = ZNames::GetActorName(entry.GetActorId()).size();
- if (actorNameLength > largestlength)
- largestlength = actorNameLength;
}
- size_t index = 0;
- for (auto& entry : actors)
+ if (actorList->GetName() == "")
{
- entry.SetLargestActorName(largestlength);
- declaration += StringHelper::Sprintf("\t{ %s },", entry.GetBodySourceCode().c_str());
-
- if (index < actors.size() - 1)
- declaration += "\n";
-
- index++;
+ actorList->SetName(actorList->GetDefaultName(prefix));
}
-
- const auto& entry = actors.front();
-
- std::string varName = StringHelper::Sprintf("%sActorList_%06X", prefix.c_str(), segmentOffset);
- parent->AddDeclarationArray(segmentOffset, DeclarationAlignment::Align4,
- actors.size() * entry.GetRawDataSize(), entry.GetSourceTypeName(),
- varName, GetActorListArraySize(), declaration);
+ actorList->DeclareVar(prefix, "");
+ parent->AddResource(actorList);
}
std::string SetActorList::GetBodySourceCode() const
{
std::string listName;
Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "ActorEntry", listName);
- if (numActors != actors.size())
- {
- printf("%s: numActors(%i) ~ actors(%li)\n", parent->GetName().c_str(), numActors,
- actors.size());
- }
- return StringHelper::Sprintf("SCENE_CMD_ACTOR_LIST(%i, %s)", numActors, listName.c_str());
-}
-
-size_t SetActorList::GetActorListArraySize() const
-{
- size_t actorCount = 0;
-
- // Doing an else-if here so we only do the loop when the game is SW97.
- // Actor 0x22 is removed from SW97, so we need to ensure that we don't increment the actor count
- // for it.
- if (Globals::Instance->game == ZGame::OOT_SW97)
- {
- actorCount = 0;
-
- for (const auto& entry : actors)
- if (entry.GetActorId() != 0x22)
- actorCount++;
- }
- else
- {
- actorCount = actors.size();
- }
- return actorCount;
+ return StringHelper::Sprintf("SCENE_CMD_ACTOR_LIST(%i, %s)", numActors, listName.c_str());
}
std::string SetActorList::GetCommandCName() const
@@ -123,58 +62,3 @@ RoomCommand SetActorList::GetRoomCommand() const
{
return RoomCommand::SetActorList;
}
-
-ActorSpawnEntry::ActorSpawnEntry(const std::vector<uint8_t>& rawData, uint32_t rawDataIndex)
-{
- actorNum = BitConverter::ToInt16BE(rawData, rawDataIndex + 0);
- posX = BitConverter::ToInt16BE(rawData, rawDataIndex + 2);
- posY = BitConverter::ToInt16BE(rawData, rawDataIndex + 4);
- posZ = BitConverter::ToInt16BE(rawData, rawDataIndex + 6);
- rotX = BitConverter::ToUInt16BE(rawData, rawDataIndex + 8);
- rotY = BitConverter::ToUInt16BE(rawData, rawDataIndex + 10);
- rotZ = BitConverter::ToUInt16BE(rawData, rawDataIndex + 12);
- initVar = BitConverter::ToInt16BE(rawData, rawDataIndex + 14);
-}
-
-std::string ActorSpawnEntry::GetBodySourceCode() const
-{
- std::string body;
-
- std::string actorNameFmt = StringHelper::Sprintf("%%-%zus ", largestActorName + 1);
- body =
- StringHelper::Sprintf(actorNameFmt.c_str(), (ZNames::GetActorName(actorNum) + ",").c_str());
-
- body += StringHelper::Sprintf("{ %6i, %6i, %6i }, ", posX, posY, posZ);
- if (Globals::Instance->game == ZGame::MM_RETAIL)
- body += StringHelper::Sprintf("{ SPAWN_ROT_FLAGS(%#5hX, 0x%04X)"
- ", SPAWN_ROT_FLAGS(%#5hX, 0x%04X)"
- ", SPAWN_ROT_FLAGS(%#5hX, 0x%04X) }, ",
- (rotX >> 7) & 0b111111111, rotX & 0b1111111,
- (rotY >> 7) & 0b111111111, rotY & 0b1111111,
- (rotZ >> 7) & 0b111111111, rotZ & 0b1111111);
- else
- body += StringHelper::Sprintf("{ %#6hX, %#6hX, %#6hX }, ", rotX, rotY, rotZ);
- body += StringHelper::Sprintf("0x%04X", initVar);
-
- return body;
-}
-
-std::string ActorSpawnEntry::GetSourceTypeName() const
-{
- return "ActorEntry";
-}
-
-int32_t ActorSpawnEntry::GetRawDataSize() const
-{
- return 16;
-}
-
-uint16_t ActorSpawnEntry::GetActorId() const
-{
- return actorNum;
-}
-
-void ActorSpawnEntry::SetLargestActorName(size_t nameSize)
-{
- largestActorName = nameSize;
-}