diff options
| author | Anghelo Carvajal <angheloalf95@gmail.com> | 2021-05-10 12:25:39 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-05-10 12:25:39 -0400 |
| commit | 769f5702a422d14bfb0a60a39319da4b4bf9ec1f (patch) | |
| tree | 11e12a20fb2880792722babdee0b5222ea86504f /ZAPD/ZRoom/Commands/SetActorList.cpp | |
| parent | a357277e412b5e8f0f2f0578c7d7d213e8744c8d (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.cpp | 187 |
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; } |
