diff options
| author | louist103 <louist103@gmail.com> | 2022-10-25 10:47:22 -0400 |
|---|---|---|
| committer | louist103 <louist103@gmail.com> | 2022-10-25 10:47:22 -0400 |
| commit | 0293bafafe118dde1a238ea2546940302eb1baa9 (patch) | |
| tree | b862a47fde8857bc0460daa349b2775368d86d72 /ZAPD/ZRoom | |
| parent | 78fdac56498f674eba2692e075d415a12cb4a31f (diff) | |
ActorList file node.
Diffstat (limited to 'ZAPD/ZRoom')
| -rw-r--r-- | ZAPD/ZRoom/Commands/SetActorList.cpp | 158 | ||||
| -rw-r--r-- | ZAPD/ZRoom/Commands/SetActorList.h | 32 |
2 files changed, 25 insertions, 165 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; -} diff --git a/ZAPD/ZRoom/Commands/SetActorList.h b/ZAPD/ZRoom/Commands/SetActorList.h index 7b34125..f3eed93 100644 --- a/ZAPD/ZRoom/Commands/SetActorList.h +++ b/ZAPD/ZRoom/Commands/SetActorList.h @@ -1,44 +1,20 @@ #pragma once #include "ZRoom/ZRoomCommand.h" - -class ActorSpawnEntry -{ -public: - uint16_t actorNum; - int16_t posX; - int16_t posY; - int16_t posZ; - uint16_t rotX; - uint16_t rotY; - uint16_t rotZ; - uint16_t initVar; - size_t largestActorName = 16; - - ActorSpawnEntry(const std::vector<uint8_t>& rawData, uint32_t rawDataIndex); - - std::string GetBodySourceCode() const; - - std::string GetSourceTypeName() const; - int32_t GetRawDataSize() const; - - uint16_t GetActorId() const; - void SetLargestActorName(size_t nameSize); -}; +#include "ZActorList.h" class SetActorList : public ZRoomCommand { public: - uint8_t numActors; - std::vector<ActorSpawnEntry> actors; + uint32_t numActors; + ZActorList* actorList = nullptr; SetActorList(ZFile* nParent); + ~SetActorList(); void ParseRawData() override; void DeclareReferences(const std::string& prefix) override; - void ParseRawDataLate() override; - void DeclareReferencesLate(const std::string& prefix) override; std::string GetBodySourceCode() const override; |
