summaryrefslogtreecommitdiff
path: root/ZAPD/ZRoom/Commands/SetActorList.cpp
diff options
context:
space:
mode:
authorAnghelo Carvajal <angheloalf95@gmail.com>2021-05-10 12:25:39 -0400
committerGitHub <noreply@github.com>2021-05-10 12:25:39 -0400
commit769f5702a422d14bfb0a60a39319da4b4bf9ec1f (patch)
tree11e12a20fb2880792722babdee0b5222ea86504f /ZAPD/ZRoom/Commands/SetActorList.cpp
parenta357277e412b5e8f0f2f0578c7d7d213e8744c8d (diff)
ZRoom refactor (#124)
* Remove redundant methods * first pass os cleaning * More cleaning * Fix compilation errors * Fix dumb crashes * Fix dumb issues * Removing most uses of GenerateSourceCodePass1 * more cleanup * Move segmentOffset to ZRoomCommand * Half of ParseRawData * somehow broken... * fix broken stuff * This may or may not be broken * More cleaning * Remove GenerateSourceCodePass2 * More cleanup and pointer removal * Use PolygonType2 in SetMesh * another small cleanup * Merge PolygonDlist and PolygonDlist2 * More code merging * GetDeclarationPtrName * Remove most repeated externs and a bit of redundant code * Dumb MM fixes * small fix (cherry picked from commit 0813fd69538491c5aceb00d79d19bf59fd082ca7) * Another dumb fix * Remove GenerateExterns * Change DeclareReferences signature * Refactor SetAnimatedTextureList * const std::vector<uint8_t>& * another small bunch of changes * last parserawdata and declarereferences separation probably * Move parserawdata * Remove GenerateSourceCodePass1 * Use macros for commands * Make ZRoomCommand inherit ZResource * shrink scenes tluts * ProcessTextureIntersections * small output improvements * Small changes * run format * SCENE_CMD -> SCENECMD * fix merge errors * run format * fix some warnings * update macros names * Add again different commands for each game ni SCENE_CMD_ROOM_BEHAVIOR * macro update * More booleans * Move declaration to its own file * minor changes * Update according to latest reviews in oot * run format * Yet another cutscene change * Remove special scene/room segment code * This is crashing and I don't know why * remove includeFilePrefix * fix merge issues * always pass a parent to zresource * move path to its own zclass and properly implement parserawdata in commands * Fix GetDeclarationPtrName uses * Some ZPath fixes (still broken tho) * Fix ZPath declarations * Fix weird problem * Add `Path` to the docs * run format * clean syotes code * A bunch of changes for MM * run format
Diffstat (limited to 'ZAPD/ZRoom/Commands/SetActorList.cpp')
-rw-r--r--ZAPD/ZRoom/Commands/SetActorList.cpp187
1 files changed, 86 insertions, 101 deletions
diff --git a/ZAPD/ZRoom/Commands/SetActorList.cpp b/ZAPD/ZRoom/Commands/SetActorList.cpp
index 813bc3e..b93623b 100644
--- a/ZAPD/ZRoom/Commands/SetActorList.cpp
+++ b/ZAPD/ZRoom/Commands/SetActorList.cpp
@@ -1,110 +1,69 @@
#include "SetActorList.h"
-#include "../../BitConverter.h"
-#include "../../Globals.h"
-#include "../../StringHelper.h"
-#include "../../ZFile.h"
-#include "../ZNames.h"
-#include "../ZRoom.h"
-
-SetActorList::SetActorList(ZRoom* nZRoom, std::vector<uint8_t> rawData, uint32_t rawDataIndex)
- : ZRoomCommand(nZRoom, rawData, rawDataIndex)
-{
- numActors = rawData[rawDataIndex + 1];
- segmentOffset = GETSEGOFFSET(BitConverter::ToInt32BE(rawData, rawDataIndex + 4));
-
- _rawData = rawData;
- _rawDataIndex = rawDataIndex;
-
- if (segmentOffset != 0)
- zRoom->parent->AddDeclarationPlaceholder(segmentOffset);
-}
-SetActorList::~SetActorList()
-{
- for (ActorSpawnEntry* entry : actors)
- delete entry;
-}
+#include "BitConverter.h"
+#include "Globals.h"
+#include "StringHelper.h"
+#include "ZFile.h"
+#include "ZRoom/ZNames.h"
+#include "ZRoom/ZRoom.h"
-std::string SetActorList::GetSourceOutputCode(std::string prefix)
+SetActorList::SetActorList(ZFile* nParent) : ZRoomCommand(nParent)
{
- return "";
}
-std::string SetActorList::GenerateSourceCodePass1(std::string roomName, uint32_t baseAddress)
+void SetActorList::ParseRawData()
{
- return "";
-}
+ ZRoomCommand::ParseRawData();
+ numActors = cmdArg1;
-std::string SetActorList::GenerateSourceCodePass2(std::string roomName, uint32_t baseAddress)
-{
- std::string sourceOutput = "";
- size_t numActorsReal = zRoom->GetDeclarationSizeFromNeighbor(segmentOffset) / 16;
- actors = std::vector<ActorSpawnEntry*>();
uint32_t currentPtr = segmentOffset;
- for (size_t i = 0; i < numActorsReal; i++)
+ for (size_t i = 0; i < numActors; i++)
{
- ActorSpawnEntry* entry = new ActorSpawnEntry(_rawData, currentPtr);
- actors.push_back(entry);
+ ActorSpawnEntry entry(parent->GetRawData(), currentPtr);
- currentPtr += 16;
+ currentPtr += entry.GetRawDataSize();
+ actors.push_back(entry);
}
+}
- sourceOutput +=
- StringHelper::Sprintf("\n %s 0x%02X, (u32)%sActorList0x%06X \n};",
- ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(),
- numActors, roomName.c_str(), segmentOffset);
-
- // zRoom->parent->AddDeclaration(segmentOffset, DeclarationAlignment::None,
- // DeclarationPadding::None, GetRawDataSize(), "SCmdActorList",
- // ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress), sourceOutput);
-
- std::string declaration = "";
-
- size_t index = 0;
- for (ActorSpawnEntry* entry : actors)
+void SetActorList::DeclareReferences(const std::string& prefix)
+{
+ if (!actors.empty())
{
- uint16_t actorNum = entry->actorNum;
+ std::string declaration = "";
- if (Globals::Instance->game == ZGame::MM_RETAIL)
- {
- declaration += StringHelper::Sprintf(
- " { %s, %i, %i, %i, SPAWN_ROT_FLAGS(%i, 0x%04X), SPAWN_ROT_FLAGS(%i, 0x%04X), "
- "SPAWN_ROT_FLAGS(%i, 0x%04X), 0x%04X }, //0x%06X",
- ZNames::GetActorName(actorNum).c_str(), entry->posX, entry->posY, entry->posZ,
- (entry->rotX >> 7) & 0b111111111, entry->rotX & 0b1111111,
- (entry->rotY >> 7) & 0b111111111, entry->rotY & 0b1111111,
- (entry->rotZ >> 7) & 0b111111111, entry->rotZ & 0b1111111, (uint16_t)entry->initVar,
- segmentOffset + (index * 16));
- }
- else
+ size_t index = 0;
+ for (const auto& entry : actors)
{
- declaration += StringHelper::Sprintf(
- " { %s, %i, %i, %i, %i, %i, %i, 0x%04X }, //0x%06X",
- ZNames::GetActorName(actorNum).c_str(), entry->posX, entry->posY, entry->posZ,
- entry->rotX, entry->rotY, entry->rotZ, (uint16_t)entry->initVar,
- segmentOffset + (index * 16));
+ declaration +=
+ StringHelper::Sprintf("\t{ %s }, // 0x%06X", entry.GetBodySourceCode().c_str(),
+ segmentOffset + (index * 16));
if (index < actors.size() - 1)
declaration += "\n";
- }
- if (index < actors.size() - 1)
- declaration += "\n";
+ index++;
+ }
- index++;
- }
+ const auto& entry = actors.front();
- DeclarationPadding padding = DeclarationPadding::Pad16;
- if (Globals::Instance->game == ZGame::MM_RETAIL)
- padding = DeclarationPadding::None;
+ DeclarationPadding padding = DeclarationPadding::Pad16;
+ if (Globals::Instance->game == ZGame::MM_RETAIL)
+ padding = DeclarationPadding::None;
- zRoom->parent->AddDeclarationArray(
- segmentOffset, DeclarationAlignment::None, padding, actors.size() * 16, "ActorEntry",
- StringHelper::Sprintf("%sActorList0x%06X", roomName.c_str(), segmentOffset),
- GetActorListArraySize(), declaration);
+ parent->AddDeclarationArray(
+ segmentOffset, DeclarationAlignment::Align4, padding,
+ actors.size() * entry.GetRawDataSize(), entry.GetSourceTypeName(),
+ StringHelper::Sprintf("%sActorList_%06X", prefix.c_str(), segmentOffset),
+ GetActorListArraySize(), declaration);
+ }
+}
- return sourceOutput;
+std::string SetActorList::GetBodySourceCode() const
+{
+ std::string listName = parent->GetDeclarationPtrName(cmdArg2);
+ return StringHelper::Sprintf("SCENE_CMD_ACTOR_LIST(%i, %s)", numActors, listName.c_str());
}
size_t SetActorList::GetRawDataSize() const
@@ -123,8 +82,8 @@ size_t SetActorList::GetActorListArraySize() const
{
actorCount = 0;
- for (ActorSpawnEntry* entry : actors)
- if (entry->actorNum != 0x22)
+ for (const auto& entry : actors)
+ if (entry.GetActorId() != 0x22)
actorCount++;
}
else
@@ -135,12 +94,6 @@ size_t SetActorList::GetActorListArraySize() const
return actorCount;
}
-std::string SetActorList::GenerateExterns() const
-{
- return StringHelper::Sprintf("extern ActorEntry %sActorList0x%06X[%i];\n",
- zRoom->GetName().c_str(), segmentOffset, GetActorListArraySize());
-}
-
std::string SetActorList::GetCommandCName() const
{
return "SCmdActorList";
@@ -151,16 +104,48 @@ RoomCommand SetActorList::GetRoomCommand() const
return RoomCommand::SetActorList;
}
-ActorSpawnEntry::ActorSpawnEntry(std::vector<uint8_t> rawData, uint32_t rawDataIndex)
+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::ToInt16BE(rawData, rawDataIndex + 8);
+ rotY = BitConverter::ToInt16BE(rawData, rawDataIndex + 10);
+ rotZ = BitConverter::ToInt16BE(rawData, rawDataIndex + 12);
+ initVar = BitConverter::ToInt16BE(rawData, rawDataIndex + 14);
+}
+
+std::string ActorSpawnEntry::GetBodySourceCode() const
+{
+ std::string body = "\n";
+
+ body += "\t\t" + ZNames::GetActorName(actorNum) + ",\n";
+ body += StringHelper::Sprintf("\t\t{ %6i, %6i, %6i },\n", posX, posY, posZ);
+ if (Globals::Instance->game == ZGame::MM_RETAIL)
+ body += StringHelper::Sprintf("\t\t{ SPAWN_ROT_FLAGS(%i, 0x%04X), SPAWN_ROT_FLAGS(%i, "
+ "0x%04X), SPAWN_ROT_FLAGS(%i, 0x%04X)},\n",
+ (rotX >> 7) & 0b111111111, rotX & 0b1111111,
+ (rotY >> 7) & 0b111111111, rotY & 0b1111111,
+ (rotZ >> 7) & 0b111111111, rotZ & 0b1111111);
+ else
+ body += StringHelper::Sprintf("\t\t{ %6i, %6i, %6i },\n", rotX, rotY, rotZ);
+ body += StringHelper::Sprintf("\t\t0x%04X\n ", initVar);
+
+ return body;
+}
+
+std::string ActorSpawnEntry::GetSourceTypeName() const
+{
+ return "ActorEntry";
+}
+
+int32_t ActorSpawnEntry::GetRawDataSize() const
+{
+ return 16;
+}
+
+uint16_t ActorSpawnEntry::GetActorId() const
{
- const uint8_t* data = rawData.data();
-
- actorNum = BitConverter::ToInt16BE(data, rawDataIndex + 0);
- posX = BitConverter::ToInt16BE(data, rawDataIndex + 2);
- posY = BitConverter::ToInt16BE(data, rawDataIndex + 4);
- posZ = BitConverter::ToInt16BE(data, rawDataIndex + 6);
- rotX = BitConverter::ToInt16BE(data, rawDataIndex + 8);
- rotY = BitConverter::ToInt16BE(data, rawDataIndex + 10);
- rotZ = BitConverter::ToInt16BE(data, rawDataIndex + 12);
- initVar = BitConverter::ToInt16BE(data, rawDataIndex + 14);
+ return actorNum;
}