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 | |
| 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')
72 files changed, 2323 insertions, 2884 deletions
diff --git a/ZAPD/ZRoom/Commands/EndMarker.cpp b/ZAPD/ZRoom/Commands/EndMarker.cpp index c5162fb..3f64af1 100644 --- a/ZAPD/ZRoom/Commands/EndMarker.cpp +++ b/ZAPD/ZRoom/Commands/EndMarker.cpp @@ -1,15 +1,12 @@ #include "EndMarker.h" -#include "../../StringHelper.h" -EndMarker::EndMarker(ZRoom* nZRoom, std::vector<uint8_t> rawData, uint32_t rawDataIndex) - : ZRoomCommand(nZRoom, rawData, rawDataIndex) +EndMarker::EndMarker(ZFile* nParent) : ZRoomCommand(nParent) { } -std::string EndMarker::GenerateSourceCodePass1(std::string roomName, uint32_t baseAddress) +std::string EndMarker::GetBodySourceCode() const { - return StringHelper::Sprintf( - "%s 0x00, 0x00", ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str()); + return "SCENE_CMD_END()"; } std::string EndMarker::GetCommandCName() const @@ -20,4 +17,4 @@ std::string EndMarker::GetCommandCName() const RoomCommand EndMarker::GetRoomCommand() const { return RoomCommand::EndMarker; -}
\ No newline at end of file +} diff --git a/ZAPD/ZRoom/Commands/EndMarker.h b/ZAPD/ZRoom/Commands/EndMarker.h index 79351cf..daa477c 100644 --- a/ZAPD/ZRoom/Commands/EndMarker.h +++ b/ZAPD/ZRoom/Commands/EndMarker.h @@ -1,16 +1,13 @@ #pragma once -#include "../ZRoomCommand.h" +#include "ZRoom/ZRoomCommand.h" class EndMarker : public ZRoomCommand { public: - EndMarker(ZRoom* nZRoom, std::vector<uint8_t> rawData, uint32_t rawDataIndex); + EndMarker(ZFile* nParent); - virtual std::string GenerateSourceCodePass1(std::string roomName, - uint32_t baseAddress) override; - virtual std::string GetCommandCName() const override; - virtual RoomCommand GetRoomCommand() const override; - -private: + std::string GetBodySourceCode() const override; + std::string GetCommandCName() const override; + RoomCommand GetRoomCommand() const override; };
\ No newline at end of file diff --git a/ZAPD/ZRoom/Commands/SetActorCutsceneList.cpp b/ZAPD/ZRoom/Commands/SetActorCutsceneList.cpp index 3027c68..18cfd1e 100644 --- a/ZAPD/ZRoom/Commands/SetActorCutsceneList.cpp +++ b/ZAPD/ZRoom/Commands/SetActorCutsceneList.cpp @@ -1,64 +1,61 @@ #include "SetActorCutsceneList.h" -#include "../../BitConverter.h" -#include "../../Globals.h" -#include "../../StringHelper.h" -#include "../../ZFile.h" -#include "../ZRoom.h" - -SetActorCutsceneList::SetActorCutsceneList(ZRoom* nZRoom, std::vector<uint8_t> rawData, - uint32_t rawDataIndex) - : ZRoomCommand(nZRoom, rawData, rawDataIndex) -{ - int32_t numCutscenes = rawData[rawDataIndex + 1]; - segmentOffset = BitConverter::ToInt32BE(rawData, rawDataIndex + 4) & 0x00FFFFFF; - cutscenes = std::vector<ActorCutsceneEntry*>(); +#include "BitConverter.h" +#include "Globals.h" +#include "StringHelper.h" +#include "ZFile.h" +#include "ZRoom/ZRoom.h" + +SetActorCutsceneList::SetActorCutsceneList(ZFile* nParent) : ZRoomCommand(nParent) +{ +} +void SetActorCutsceneList::ParseRawData() +{ + ZRoomCommand::ParseRawData(); + int numCutscenes = cmdArg1; int32_t currentPtr = segmentOffset; for (int32_t i = 0; i < numCutscenes; i++) { - ActorCutsceneEntry* entry = new ActorCutsceneEntry(rawData, currentPtr); + ActorCutsceneEntry entry(parent->GetRawData(), currentPtr); cutscenes.push_back(entry); currentPtr += 16; } +} - std::string declaration = ""; - - for (ActorCutsceneEntry* entry : cutscenes) +void SetActorCutsceneList::DeclareReferences(const std::string& prefix) +{ + if (cutscenes.size() > 0) { - declaration += StringHelper::Sprintf( - " { %i, %i, %i, %i, %i, %i, %i, %i, %i, %i },\n", entry->priority, entry->length, - entry->unk4, entry->unk6, entry->additionalCutscene, entry->sound, entry->unkB, - entry->unkC, entry->unkE, entry->letterboxSize); - } + std::string declaration = ""; - zRoom->parent->AddDeclarationArray( - segmentOffset, DeclarationAlignment::None, cutscenes.size() * 16, "ActorCutscene", - StringHelper::Sprintf("%sActorCutsceneList0x%06X", zRoom->GetName().c_str(), segmentOffset), - 0, declaration); -} + for (size_t i = 0; i < cutscenes.size(); i++) + { + const auto& entry = cutscenes.at(i); + declaration += StringHelper::Sprintf(" { %s },", entry.GetBodySourceCode().c_str()); -SetActorCutsceneList::~SetActorCutsceneList() -{ - for (ActorCutsceneEntry* entry : cutscenes) - delete entry; -} + if (i + 1 < cutscenes.size()) + { + declaration += "\n"; + } + } -std::string SetActorCutsceneList::GenerateSourceCodePass1(std::string roomName, - uint32_t baseAddress) -{ - return StringHelper::Sprintf( - "%s 0x%02X, (u32)&%sActorCutsceneList0x%06X", - ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), cutscenes.size(), - zRoom->GetName().c_str(), segmentOffset); + std::string typeName = cutscenes.at(0).GetSourceTypeName(); + + parent->AddDeclarationArray( + segmentOffset, DeclarationAlignment::Align4, cutscenes.size() * 16, typeName, + StringHelper::Sprintf("%s%sList_%06X", prefix.c_str(), typeName.c_str(), segmentOffset), + 0, declaration); + } } -std::string SetActorCutsceneList::GenerateSourceCodePass2(std::string roomName, - uint32_t baseAddress) +std::string SetActorCutsceneList::GetBodySourceCode() const { - return ""; + std::string listName = parent->GetDeclarationPtrName(cmdArg2); + return StringHelper::Sprintf("SCENE_CMD_ACTOR_CUTSCENE_LIST(%i, %s)", cutscenes.size(), + listName.c_str()); } size_t SetActorCutsceneList::GetRawDataSize() const @@ -66,12 +63,6 @@ size_t SetActorCutsceneList::GetRawDataSize() const return ZRoomCommand::GetRawDataSize() + (cutscenes.size() * 16); } -std::string SetActorCutsceneList::GenerateExterns() const -{ - return StringHelper::Sprintf("extern ActorCutscene %sActorCutsceneList0x%06X[];\n", - zRoom->GetName().c_str(), segmentOffset); -} - std::string SetActorCutsceneList::GetCommandCName() const { return "SCmdCutsceneActorList"; @@ -82,7 +73,7 @@ RoomCommand SetActorCutsceneList::GetRoomCommand() const return RoomCommand::SetActorCutsceneList; } -ActorCutsceneEntry::ActorCutsceneEntry(std::vector<uint8_t> rawData, uint32_t rawDataIndex) +ActorCutsceneEntry::ActorCutsceneEntry(const std::vector<uint8_t>& rawData, uint32_t rawDataIndex) : priority(BitConverter::ToInt16BE(rawData, rawDataIndex + 0)), length(BitConverter::ToInt16BE(rawData, rawDataIndex + 2)), unk4(BitConverter::ToInt16BE(rawData, rawDataIndex + 4)), @@ -93,3 +84,14 @@ ActorCutsceneEntry::ActorCutsceneEntry(std::vector<uint8_t> rawData, uint32_t ra letterboxSize(rawData[rawDataIndex + 0xF]) { } + +std::string ActorCutsceneEntry::GetBodySourceCode() const +{ + return StringHelper::Sprintf("%i, %i, %i, %i, %i, %i, %i, %i, %i, %i", priority, length, unk4, + unk6, additionalCutscene, sound, unkB, unkC, unkE, letterboxSize); +} + +std::string ActorCutsceneEntry::GetSourceTypeName() const +{ + return "ActorCutscene"; +} diff --git a/ZAPD/ZRoom/Commands/SetActorCutsceneList.h b/ZAPD/ZRoom/Commands/SetActorCutsceneList.h index b924dff..d36dd4c 100644 --- a/ZAPD/ZRoom/Commands/SetActorCutsceneList.h +++ b/ZAPD/ZRoom/Commands/SetActorCutsceneList.h @@ -1,10 +1,10 @@ #pragma once -#include "../ZRoomCommand.h" +#include "ZRoom/ZRoomCommand.h" class ActorCutsceneEntry { -public: +protected: int16_t priority; int16_t length; int16_t unk4; @@ -16,23 +16,27 @@ public: uint8_t unkE; uint8_t letterboxSize; - ActorCutsceneEntry(std::vector<uint8_t> rawData, uint32_t rawDataIndex); +public: + ActorCutsceneEntry(const std::vector<uint8_t>& rawData, uint32_t rawDataIndex); + + std::string GetBodySourceCode() const; + std::string GetSourceTypeName() const; }; class SetActorCutsceneList : public ZRoomCommand { public: - SetActorCutsceneList(ZRoom* nZRoom, std::vector<uint8_t> rawData, uint32_t rawDataIndex); - ~SetActorCutsceneList(); + SetActorCutsceneList(ZFile* nParent); + + void ParseRawData() override; + void DeclareReferences(const std::string& prefix) override; + + std::string GetBodySourceCode() const override; - std::string GenerateSourceCodePass1(std::string roomName, uint32_t baseAddress) override; - std::string GenerateSourceCodePass2(std::string roomName, uint32_t baseAddress) override; std::string GetCommandCName() const override; - std::string GenerateExterns() const override; RoomCommand GetRoomCommand() const override; size_t GetRawDataSize() const override; private: - std::vector<ActorCutsceneEntry*> cutscenes; - uint32_t segmentOffset; + std::vector<ActorCutsceneEntry> cutscenes; }; 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; } diff --git a/ZAPD/ZRoom/Commands/SetActorList.h b/ZAPD/ZRoom/Commands/SetActorList.h index 3214dd7..bb4091f 100644 --- a/ZAPD/ZRoom/Commands/SetActorList.h +++ b/ZAPD/ZRoom/Commands/SetActorList.h @@ -1,10 +1,20 @@ #pragma once -#include "../ZRoomCommand.h" +#include "ZRoom/ZRoomCommand.h" class ActorSpawnEntry { public: + 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; + +protected: uint16_t actorNum; int16_t posX; int16_t posY; @@ -13,31 +23,25 @@ public: int16_t rotY; int16_t rotZ; uint16_t initVar; - - ActorSpawnEntry(std::vector<uint8_t> rawData, uint32_t rawDataIndex); }; class SetActorList : public ZRoomCommand { public: - SetActorList(ZRoom* nZRoom, std::vector<uint8_t> rawData, uint32_t rawDataIndex); - ~SetActorList(); - - std::string GetSourceOutputCode(std::string prefix); - virtual std::string GenerateSourceCodePass1(std::string roomName, - uint32_t baseAddress) override; - virtual std::string GenerateSourceCodePass2(std::string roomName, - uint32_t baseAddress) override; - virtual RoomCommand GetRoomCommand() const override; - virtual size_t GetRawDataSize() const override; - virtual std::string GetCommandCName() const override; - virtual std::string GenerateExterns() const override; - -private: + SetActorList(ZFile* nParent); + + void ParseRawData() override; + void DeclareReferences(const std::string& prefix) override; + + std::string GetBodySourceCode() const override; + + RoomCommand GetRoomCommand() const override; + size_t GetRawDataSize() const override; + std::string GetCommandCName() const override; + +protected: size_t GetActorListArraySize() const; - int32_t numActors; - std::vector<ActorSpawnEntry*> actors; - uint32_t segmentOffset; - std::vector<uint8_t> _rawData; - uint32_t _rawDataIndex; -};
\ No newline at end of file + + uint8_t numActors; + std::vector<ActorSpawnEntry> actors; +}; diff --git a/ZAPD/ZRoom/Commands/SetAlternateHeaders.cpp b/ZAPD/ZRoom/Commands/SetAlternateHeaders.cpp index a01c555..c5f9387 100644 --- a/ZAPD/ZRoom/Commands/SetAlternateHeaders.cpp +++ b/ZAPD/ZRoom/Commands/SetAlternateHeaders.cpp @@ -1,64 +1,62 @@ #include "SetAlternateHeaders.h" -#include "../../BitConverter.h" -#include "../../StringHelper.h" -#include "../../ZFile.h" -SetAlternateHeaders::SetAlternateHeaders(ZRoom* nZRoom, std::vector<uint8_t> rawData, - uint32_t rawDataIndex) - : ZRoomCommand(nZRoom, rawData, rawDataIndex) +#include "BitConverter.h" +#include "StringHelper.h" +#include "ZFile.h" + +SetAlternateHeaders::SetAlternateHeaders(ZFile* nParent) : ZRoomCommand(nParent) { - segmentOffset = GETSEGOFFSET(BitConverter::ToInt32BE(rawData, rawDataIndex + 4)); +} +void SetAlternateHeaders::DeclareReferences(const std::string& prefix) +{ if (segmentOffset != 0) - zRoom->parent->AddDeclarationPlaceholder(segmentOffset); - - _rawData = rawData; - _rawDataIndex = rawDataIndex; + parent->AddDeclarationPlaceholder(segmentOffset); } -std::string SetAlternateHeaders::GenerateSourceCodePass1(std::string roomName, uint32_t baseAddress) +void SetAlternateHeaders::ParseRawDataLate() { - std::string sourceOutput = ""; - int32_t numHeaders = zRoom->GetDeclarationSizeFromNeighbor(segmentOffset) / 4; + int numHeaders = zRoom->GetDeclarationSizeFromNeighbor(segmentOffset) / 4; for (int32_t i = 0; i < numHeaders; i++) { - int32_t address = BitConverter::ToInt32BE(_rawData, segmentOffset + (i * 4)); + int32_t address = BitConverter::ToInt32BE(parent->GetRawData(), segmentOffset + (i * 4)); headers.push_back(address); if (address != 0) zRoom->commandSets.push_back(CommandSet(address)); } +} - sourceOutput += - StringHelper::Sprintf("%s 0, (u32)&%sAlternateHeaders0x%06X", - ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), - roomName.c_str(), segmentOffset); - - std::string declaration = ""; - - for (int32_t i = 0; i < numHeaders; i++) +void SetAlternateHeaders::DeclareReferencesLate(const std::string& prefix) +{ + if (!headers.empty()) { - // sprintf(line, " 0x%06X,\n", headers[i]); + std::string declaration = ""; - if (headers[i] == 0) - declaration += StringHelper::Sprintf(" 0,\n"); - else - declaration += StringHelper::Sprintf(" (u32)&%sSet%04XCmd00,\n", roomName.c_str(), - headers[i] & 0x00FFFFFF); - } + for (size_t i = 0; i < headers.size(); i++) + { + if (headers.at(i) == 0) + declaration += StringHelper::Sprintf("\tNULL,"); + else + declaration += + StringHelper::Sprintf("\t%sSet%04X,", prefix.c_str(), GETSEGOFFSET(headers[i])); - zRoom->parent->AddDeclarationArray( - segmentOffset, DeclarationAlignment::None, headers.size() * 4, "u32", - StringHelper::Sprintf("%sAlternateHeaders0x%06X", roomName.c_str(), segmentOffset), 0, - declaration); + if (i + 1 < headers.size()) + declaration += "\n"; + } - return sourceOutput; + parent->AddDeclarationArray( + segmentOffset, DeclarationAlignment::None, headers.size() * 4, "SCmdBase*", + StringHelper::Sprintf("%sAlternateHeaders0x%06X", prefix.c_str(), segmentOffset), 0, + declaration); + } } -size_t SetAlternateHeaders::GetRawDataSize() const +std::string SetAlternateHeaders::GetBodySourceCode() const { - return ZRoomCommand::GetRawDataSize() + 0; + std::string listName = parent->GetDeclarationPtrName(cmdArg2); + return StringHelper::Sprintf("SCENE_CMD_ALTERNATE_HEADER_LIST(%s)", listName.c_str()); } std::string SetAlternateHeaders::GetCommandCName() const @@ -69,4 +67,4 @@ std::string SetAlternateHeaders::GetCommandCName() const RoomCommand SetAlternateHeaders::GetRoomCommand() const { return RoomCommand::SetAlternateHeaders; -}
\ No newline at end of file +} diff --git a/ZAPD/ZRoom/Commands/SetAlternateHeaders.h b/ZAPD/ZRoom/Commands/SetAlternateHeaders.h index d918183..e6e7baf 100644 --- a/ZAPD/ZRoom/Commands/SetAlternateHeaders.h +++ b/ZAPD/ZRoom/Commands/SetAlternateHeaders.h @@ -1,22 +1,22 @@ #pragma once -#include "../ZRoom.h" -#include "../ZRoomCommand.h" +#include "ZRoom/ZRoom.h" +#include "ZRoom/ZRoomCommand.h" class SetAlternateHeaders : public ZRoomCommand { public: - SetAlternateHeaders(ZRoom* nZRoom, std::vector<uint8_t> rawData, uint32_t rawDataIndex); + SetAlternateHeaders(ZFile* nParent); - virtual std::string GenerateSourceCodePass1(std::string roomName, - uint32_t baseAddress) override; - virtual size_t GetRawDataSize() const override; - virtual std::string GetCommandCName() const override; - virtual RoomCommand GetRoomCommand() const override; + void DeclareReferences(const std::string& prefix) override; + void ParseRawDataLate() override; + void DeclareReferencesLate(const std::string& prefix) override; + + std::string GetBodySourceCode() const override; + + RoomCommand GetRoomCommand() const override; + std::string GetCommandCName() const override; private: - int32_t segmentOffset; std::vector<uint32_t> headers; - std::vector<uint8_t> _rawData; - int32_t _rawDataIndex; -};
\ No newline at end of file +}; diff --git a/ZAPD/ZRoom/Commands/SetAnimatedMaterialList.cpp b/ZAPD/ZRoom/Commands/SetAnimatedMaterialList.cpp new file mode 100644 index 0000000..ef606a2 --- /dev/null +++ b/ZAPD/ZRoom/Commands/SetAnimatedMaterialList.cpp @@ -0,0 +1,402 @@ +#include "SetAnimatedMaterialList.h" + +#include "BitConverter.h" +#include "Globals.h" +#include "StringHelper.h" +#include "ZFile.h" +#include "ZRoom/ZRoom.h" + +SetAnimatedMaterialList::SetAnimatedMaterialList(ZFile* nParent) : ZRoomCommand(nParent) +{ +} + +void SetAnimatedMaterialList::ParseRawData() +{ + ZRoomCommand::ParseRawData(); + int32_t currentPtr = segmentOffset; + bool keepGoing = true; + + do + { + AnimatedMaterial lastTexture(parent->GetRawData(), currentPtr); + keepGoing = (lastTexture.segment != 0) && (lastTexture.segment > -1); + currentPtr += 8; + textures.push_back(lastTexture); + } while (keepGoing); +} + +void SetAnimatedMaterialList::DeclareReferences(const std::string& prefix) +{ + std::string nameStr = + StringHelper::Sprintf("%sAnimatedMaterialList0x%06X", prefix.c_str(), segmentOffset); + + for (auto& texture : textures) + { + size_t declSize = 0; + std::string declTypeName = ""; + std::string declName = StringHelper::Sprintf("%sAnimatedMaterialParams0x%06X", + prefix.c_str(), texture.segmentOffset); + std::string declaration = ""; + size_t index = 0; + + switch (texture.type) + { + case 0: + case 1: + for (const auto& param : texture.params) + { + declaration += param->GenerateSourceCode(zRoom, texture.segmentOffset); + + if (index < texture.params.size() - 1) + declaration += "\n"; + + index++; + } + + declSize = texture.params.size() * 4; + declTypeName = "AnimatedMatTexScrollParams"; + + parent->AddDeclarationArray(texture.segmentOffset, DeclarationAlignment::Align4, + declSize, declTypeName, declName, texture.params.size(), + declaration); + break; + case 2: + case 3: + case 4: + declSize = texture.params.at(0)->GetParamsSize(); + declTypeName = "AnimatedMatColorParams"; + declaration = texture.params.at(0)->GenerateSourceCode(zRoom, texture.segmentOffset); + + parent->AddDeclaration(texture.segmentOffset, DeclarationAlignment::Align4, declSize, + declTypeName, declName, + StringHelper::Sprintf("\n\t%s\n", declaration.c_str())); + break; + case 5: + declSize = texture.params.at(0)->GetParamsSize(); + declTypeName = "AnimatedMatTexCycleParams"; + declaration = texture.params.at(0)->GenerateSourceCode(zRoom, texture.segmentOffset); + + parent->AddDeclaration(texture.segmentOffset, DeclarationAlignment::Align4, declSize, + declTypeName, declName, + StringHelper::Sprintf("\n\t%s\n", declaration.c_str())); + break; + case 6: + continue; + + default: + throw std::runtime_error( + StringHelper::Sprintf("Error in SetAnimatedMaterialList::DeclareReferences (%s)\n" + "\t Unknown texture.type: %i\n", + nameStr.c_str(), texture.type)); + } + } + + if (!textures.empty()) + { + std::string declaration = ""; + + for (size_t i = 0; i < textures.size(); i++) + { + std::string textureName = parent->GetDeclarationPtrName(textures.at(i).segmentOffset); + + declaration += StringHelper::Sprintf("\t{ %2i, %2i, %s },", textures.at(i).segment, + textures.at(i).type, textureName.c_str()); + + if (i + 1 < textures.size()) + declaration += "\n"; + } + + parent->AddDeclarationArray(segmentOffset, DeclarationAlignment::Align4, + DeclarationPadding::Pad16, textures.size() * 8, + "AnimatedMaterial", nameStr, textures.size(), declaration); + } +} + +std::string SetAnimatedMaterialList::GetBodySourceCode() const +{ + std::string listName = parent->GetDeclarationPtrName(cmdArg2); + return StringHelper::Sprintf("SCENE_CMD_ANIMATED_MATERIAL_LIST(%s)", listName.c_str()); +} + +size_t SetAnimatedMaterialList::GetRawDataSize() const +{ + size_t paramsSize = 0; + for (const auto& texture : textures) + { + for (const auto& param : texture.params) + { + paramsSize += param->GetParamsSize(); + } + } + + return ZRoomCommand::GetRawDataSize() + paramsSize; +} + +std::string SetAnimatedMaterialList::GetCommandCName() const +{ + return "SCmdTextureAnimations"; +} + +RoomCommand SetAnimatedMaterialList::GetRoomCommand() const +{ + return RoomCommand::SetAnimatedMaterialList; +} + +AnimatedMaterial::AnimatedMaterial(const std::vector<uint8_t>& rawData, uint32_t rawDataIndex) + : segment(rawData.at(rawDataIndex)), type(BitConverter::ToInt16BE(rawData, rawDataIndex + 2)), + segmentOffset(GETSEGOFFSET(BitConverter::ToInt32BE(rawData, rawDataIndex + 4))) +{ + switch (type) + { + case 0: + params.push_back(std::make_shared<ScrollingTexture>(rawData, segmentOffset)); + break; + case 1: + params.push_back(std::make_shared<ScrollingTexture>(rawData, segmentOffset)); + params.push_back(std::make_shared<ScrollingTexture>(rawData, segmentOffset + 4)); + break; + case 2: + case 3: + case 4: + params.push_back(std::make_shared<FlashingTexture>(rawData, segmentOffset, type)); + break; + case 5: + params.push_back(std::make_shared<AnimatedMatTexCycleParams>(rawData, segmentOffset)); + break; + case 6: // Some terminator when there are no animated textures? + break; + } +} + +ScrollingTexture::ScrollingTexture(const std::vector<uint8_t>& rawData, uint32_t rawDataIndex) + : xStep(rawData.at(rawDataIndex + 0)), yStep(rawData.at(rawDataIndex + 1)), + width(rawData.at(rawDataIndex + 2)), height(rawData.at(rawDataIndex + 3)) +{ +} + +std::string ScrollingTexture::GenerateSourceCode(ZRoom* zRoom, uint32_t baseAddress) +{ + return StringHelper::Sprintf(" { %i, %i, 0x%02X, 0x%02X },", xStep, yStep, width, height); +} + +size_t ScrollingTexture::GetParamsSize() +{ + return 4; +} + +F3DPrimColor::F3DPrimColor(const std::vector<uint8_t>& rawData, uint32_t rawDataIndex) + : r(rawData.at(rawDataIndex + 0)), g(rawData.at(rawDataIndex + 1)), + b(rawData.at(rawDataIndex + 2)), a(rawData.at(rawDataIndex + 3)), + lodFrac(rawData.at(rawDataIndex + 4)) +{ +} + +FlashingTextureEnvColor::FlashingTextureEnvColor(const std::vector<uint8_t>& rawData, + uint32_t rawDataIndex) + : r(rawData.at(rawDataIndex + 0)), g(rawData.at(rawDataIndex + 1)), + b(rawData.at(rawDataIndex + 2)), a(rawData.at(rawDataIndex + 3)) +{ +} + +FlashingTexture::FlashingTexture(const std::vector<uint8_t>& rawData, uint32_t rawDataIndex, + int32_t type) + : cycleLength(BitConverter::ToUInt16BE(rawData, rawDataIndex + 0)), + numKeyFrames(BitConverter::ToUInt16BE(rawData, rawDataIndex + 2)), + primColorSegmentOffset(GETSEGOFFSET(BitConverter::ToInt32BE(rawData, rawDataIndex + 4))), + envColorSegmentOffset(GETSEGOFFSET(BitConverter::ToInt32BE(rawData, rawDataIndex + 8))), + keyFrameSegmentOffset(GETSEGOFFSET(BitConverter::ToInt32BE(rawData, rawDataIndex + 12))) +{ + uint16_t length = (type == 2) ? cycleLength : numKeyFrames; + + int32_t currentPtr = primColorSegmentOffset; + for (uint16_t i = 0; i < length; i++) + { + primColors.push_back(F3DPrimColor(rawData, currentPtr)); + currentPtr += 5; + } + + currentPtr = envColorSegmentOffset; + for (uint16_t i = 0; i < length; i++) + { + envColors.push_back(FlashingTextureEnvColor(rawData, currentPtr)); + currentPtr += 4; + } + + currentPtr = keyFrameSegmentOffset; + for (uint16_t i = 0; i < length; i++) + { + keyFrames.push_back(BitConverter::ToUInt16BE(rawData, currentPtr)); + currentPtr += 2; + } +} + +std::string FlashingTexture::GenerateSourceCode(ZRoom* zRoom, uint32_t baseAddress) +{ + if (primColorSegmentOffset != 0) + { + std::string declaration = ""; + size_t index = 0; + + for (F3DPrimColor& color : primColors) + { + declaration += StringHelper::Sprintf(" { 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X },", + color.r, color.g, color.b, color.a, color.lodFrac); + + if (index < primColors.size() - 1) + declaration += "\n"; + + index++; + } + + zRoom->parent->AddDeclarationArray( + primColorSegmentOffset, DeclarationAlignment::Align4, primColors.size() * 5, + "F3DPrimColor", + StringHelper::Sprintf("%sAnimatedMaterialPrimColor0x%06X", zRoom->GetName().c_str(), + primColorSegmentOffset), + primColors.size(), declaration); + } + + if (envColorSegmentOffset != 0) + { + std::string declaration = ""; + size_t index = 0; + + for (FlashingTextureEnvColor& color : envColors) + { + declaration += StringHelper::Sprintf(" { 0x%02X, 0x%02X, 0x%02X, 0x%02X },", color.r, + color.g, color.b, color.a); + + if (index < envColors.size() - 1) + declaration += "\n"; + + index++; + } + + zRoom->parent->AddDeclarationArray( + envColorSegmentOffset, DeclarationAlignment::Align4, envColors.size() * 4, + "Color_RGBA8", + StringHelper::Sprintf("%sAnimatedMaterialEnvColors0x%06X", zRoom->GetName().c_str(), + envColorSegmentOffset), + envColors.size(), declaration); + } + + if (keyFrameSegmentOffset != 0) + { + std::string declaration = ""; + size_t index = 0; + + for (uint16_t keyFrame : keyFrames) + { + declaration += StringHelper::Sprintf(" 0x%02X,", keyFrame); + + if (index < keyFrames.size() - 1) + declaration += "\n"; + + index++; + } + + zRoom->parent->AddDeclarationArray( + keyFrameSegmentOffset, DeclarationAlignment::Align4, keyFrames.size() * 2, "u16", + StringHelper::Sprintf("%sAnimatedMaterialKeyFrames0x%06X", zRoom->GetName().c_str(), + keyFrameSegmentOffset), + keyFrames.size(), declaration); + } + + std::string primName = zRoom->parent->GetDeclarationPtrName(primColorSegmentOffset); + std::string envName = zRoom->parent->GetDeclarationPtrName(envColorSegmentOffset); + std::string keyName = zRoom->parent->GetDeclarationPtrName(keyFrameSegmentOffset); + + return StringHelper::Sprintf("%i, %i, %s, %s, %s", cycleLength, numKeyFrames, primName.c_str(), + envName.c_str(), keyName.c_str()); +} + +size_t FlashingTexture::GetParamsSize() +{ + return 16; +} + +AnimatedMatTexCycleParams::AnimatedMatTexCycleParams(const std::vector<uint8_t>& rawData, + uint32_t rawDataIndex) + : cycleLength(BitConverter::ToUInt16BE(rawData, rawDataIndex + 0)), + textureSegmentOffsetsSegmentOffset( + GETSEGOFFSET(BitConverter::ToInt32BE(rawData, rawDataIndex + 4))), + textureIndicesSegmentOffset(GETSEGOFFSET(BitConverter::ToInt32BE(rawData, rawDataIndex + 8))) +{ + int32_t currentPtr = textureIndicesSegmentOffset; + int32_t maxIndex = 0; + + for (uint16_t i = 0; i < cycleLength; i++) + { + uint8_t newIndex = rawData.at(currentPtr); + textureIndices.push_back(newIndex); + currentPtr++; + if (newIndex > maxIndex) + maxIndex = newIndex; + } + + currentPtr = textureSegmentOffsetsSegmentOffset; + for (int32_t i = 0; i < maxIndex + 1; i++) + { + textureSegmentOffsets.push_back(GETSEGOFFSET(BitConverter::ToInt32BE(rawData, currentPtr))); + currentPtr += 4; + } +} + +std::string AnimatedMatTexCycleParams::GenerateSourceCode(ZRoom* zRoom, uint32_t baseAddress) +{ + if (textureSegmentOffsetsSegmentOffset != 0) + { + std::string declaration = ""; + size_t index = 0; + + for (uint32_t offset : textureSegmentOffsets) + { + declaration += + StringHelper::Sprintf(" %sTex_%06X,", zRoom->GetName().c_str(), offset); + + if (index < textureSegmentOffsets.size() - 1) + declaration += "\n"; + + index++; + } + + zRoom->parent->AddDeclarationArray( + textureSegmentOffsetsSegmentOffset, DeclarationAlignment::Align4, + textureSegmentOffsets.size() * 4, "u64*", + StringHelper::Sprintf("%sAnimatedMaterialTexSegOffsets0x%06X", zRoom->GetName().c_str(), + textureSegmentOffsetsSegmentOffset), + textureSegmentOffsets.size(), declaration); + } + + if (textureIndicesSegmentOffset != 0) + { + std::string declaration = ""; + size_t index = 0; + + for (uint8_t textureIndex : textureIndices) + { + declaration += StringHelper::Sprintf(" 0x%02X,", textureIndex); + + if (index < textureIndices.size() - 1) + declaration += "\n"; + + index++; + } + + zRoom->parent->AddDeclarationArray( + textureIndicesSegmentOffset, DeclarationAlignment::Align4, textureIndices.size(), "u8", + StringHelper::Sprintf("%sAnimatedMaterialTexIndices0x%06X", zRoom->GetName().c_str(), + textureIndicesSegmentOffset), + textureIndices.size(), declaration); + } + + std::string segmName = zRoom->parent->GetDeclarationPtrName(textureSegmentOffsetsSegmentOffset); + std::string indexesName = zRoom->parent->GetDeclarationPtrName(textureIndicesSegmentOffset); + + return StringHelper::Sprintf("%i, %s, %s", cycleLength, segmName.c_str(), indexesName.c_str()); +} + +size_t AnimatedMatTexCycleParams::GetParamsSize() +{ + return 12; +} diff --git a/ZAPD/ZRoom/Commands/SetAnimatedTextureList.h b/ZAPD/ZRoom/Commands/SetAnimatedMaterialList.h index a8347c6..003d37d 100644 --- a/ZAPD/ZRoom/Commands/SetAnimatedTextureList.h +++ b/ZAPD/ZRoom/Commands/SetAnimatedMaterialList.h @@ -1,12 +1,12 @@ #pragma once -#include "../ZRoomCommand.h" +#include <memory> +#include "ZRoom/ZRoomCommand.h" // TODO move into header and add all types class AnitmatedTextureParams { public: - virtual ~AnitmatedTextureParams(); virtual std::string GenerateSourceCode(ZRoom* zRoom, uint32_t baseAddress) = 0; virtual size_t GetParamsSize() = 0; }; @@ -14,7 +14,7 @@ public: class ScrollingTexture : public AnitmatedTextureParams { public: - ScrollingTexture(std::vector<uint8_t> rawData, uint32_t rawDataIndex); + ScrollingTexture(const std::vector<uint8_t>& rawData, uint32_t rawDataIndex); std::string GenerateSourceCode(ZRoom* zRoom, uint32_t baseAddress) override; size_t GetParamsSize() override; @@ -24,10 +24,10 @@ public: uint8_t height; }; -class FlashingTexturePrimColor +class F3DPrimColor { public: - FlashingTexturePrimColor(std::vector<uint8_t> rawData, uint32_t rawDataIndex); + F3DPrimColor(const std::vector<uint8_t>& rawData, uint32_t rawDataIndex); uint8_t r; uint8_t g; @@ -39,7 +39,7 @@ public: class FlashingTextureEnvColor { public: - FlashingTextureEnvColor(std::vector<uint8_t> rawData, uint32_t rawDataIndex); + FlashingTextureEnvColor(const std::vector<uint8_t>& rawData, uint32_t rawDataIndex); uint8_t r; uint8_t g; @@ -50,7 +50,7 @@ public: class FlashingTexture : public AnitmatedTextureParams { public: - FlashingTexture(std::vector<uint8_t> rawData, uint32_t rawDataIndex, int32_t type); + FlashingTexture(const std::vector<uint8_t>& rawData, uint32_t rawDataIndex, int32_t type); std::string GenerateSourceCode(ZRoom* zRoom, uint32_t baseAddress) override; size_t GetParamsSize() override; @@ -60,15 +60,15 @@ public: uint32_t envColorSegmentOffset; uint32_t keyFrameSegmentOffset; - std::vector<FlashingTexturePrimColor> primColors; + std::vector<F3DPrimColor> primColors; std::vector<FlashingTextureEnvColor> envColors; std::vector<uint16_t> keyFrames; }; -class CyclingTextureParams : public AnitmatedTextureParams +class AnimatedMatTexCycleParams : public AnitmatedTextureParams { public: - CyclingTextureParams(std::vector<uint8_t> rawData, uint32_t rawDataIndex); + AnimatedMatTexCycleParams(const std::vector<uint8_t>& rawData, uint32_t rawDataIndex); std::string GenerateSourceCode(ZRoom* zRoom, uint32_t baseAddress) override; size_t GetParamsSize() override; @@ -80,35 +80,31 @@ public: std::vector<uint8_t> textureIndices; }; -class AnimatedTexture +class AnimatedMaterial { public: - AnimatedTexture(std::vector<uint8_t> rawData, uint32_t rawDataIndex); - virtual ~AnimatedTexture(); + AnimatedMaterial(const std::vector<uint8_t>& rawData, uint32_t rawDataIndex); int8_t segment; int16_t type; uint32_t segmentOffset; - std::vector<AnitmatedTextureParams*> params; + std::vector<std::shared_ptr<AnitmatedTextureParams>> params; }; -class SetAnimatedTextureList : public ZRoomCommand +class SetAnimatedMaterialList : public ZRoomCommand { public: - SetAnimatedTextureList(ZRoom* nZRoom, std::vector<uint8_t> rawData, uint32_t rawDataIndex); - ~SetAnimatedTextureList(); + SetAnimatedMaterialList(ZFile* nParent); - std::string GetSourceOutputCode(std::string prefix); - virtual std::string GenerateSourceCodePass1(std::string roomName, - uint32_t baseAddress) override; - virtual RoomCommand GetRoomCommand() const override; - virtual size_t GetRawDataSize() const override; - virtual std::string GetCommandCName() const override; - virtual std::string GenerateExterns() const override; + void ParseRawData() override; + void DeclareReferences(const std::string& prefix) override; + + std::string GetBodySourceCode() const override; + + RoomCommand GetRoomCommand() const override; + size_t GetRawDataSize() const override; + std::string GetCommandCName() const override; private: - uint32_t segmentOffset; - std::vector<AnimatedTexture*> textures; - std::vector<uint8_t> _rawData; - int32_t _rawDataIndex; -};
\ No newline at end of file + std::vector<AnimatedMaterial> textures; +}; diff --git a/ZAPD/ZRoom/Commands/SetAnimatedTextureList.cpp b/ZAPD/ZRoom/Commands/SetAnimatedTextureList.cpp deleted file mode 100644 index 2d3a104..0000000 --- a/ZAPD/ZRoom/Commands/SetAnimatedTextureList.cpp +++ /dev/null @@ -1,433 +0,0 @@ -#include "SetAnimatedTextureList.h" -#include "../../BitConverter.h" -#include "../../Globals.h" -#include "../../StringHelper.h" -#include "../../ZFile.h" -#include "../ZRoom.h" - -SetAnimatedTextureList::SetAnimatedTextureList(ZRoom* nZRoom, std::vector<uint8_t> rawData, - uint32_t rawDataIndex) - : ZRoomCommand(nZRoom, rawData, rawDataIndex) -{ - segmentOffset = GETSEGOFFSET(BitConverter::ToInt32BE(rawData, rawDataIndex + 4)); - - { - std::string declaration = ""; - - int32_t currentPtr = segmentOffset; - - AnimatedTexture* lastTexture = nullptr; - - do - { - if (textures.size() > 0) - declaration += "\n"; - - lastTexture = new AnimatedTexture(rawData, currentPtr); - currentPtr += 8; - textures.push_back(lastTexture); - - std::string textureName = - (lastTexture->segmentOffset != 0) ? - StringHelper::Sprintf("&%sAnimatedTextureParams0x%06X", - zRoom->GetName().c_str(), lastTexture->segmentOffset) : - "NULL"; - - declaration += StringHelper::Sprintf(" { %i, %i, (u32)%s },", lastTexture->segment, - lastTexture->type, textureName.c_str()); - } while ((lastTexture->segment != 0) && (lastTexture->segment > -1)); - - zRoom->parent->AddDeclarationArray( - segmentOffset, DeclarationAlignment::None, DeclarationPadding::Pad16, - textures.size() * 8, "AnimatedTexture", - StringHelper::Sprintf("%sAnimatedTextureList0x%06X", zRoom->GetName().c_str(), - segmentOffset), - textures.size(), declaration); - } - - for (AnimatedTexture* texture : textures) - { - std::string declaration = ""; - size_t index = 0; - - switch (texture->type) - { - case 0: - case 1: - for (AnitmatedTextureParams* param : texture->params) - { - declaration += param->GenerateSourceCode(zRoom, texture->segmentOffset); - - if (index < texture->params.size() - 1) - declaration += "\n"; - - index++; - } - - zRoom->parent->AddDeclarationArray( - texture->segmentOffset, DeclarationAlignment::None, DeclarationPadding::None, - texture->params.size() * 4, "ScrollingTextureParams", - StringHelper::Sprintf("%sAnimatedTextureParams0x%06X", zRoom->GetName().c_str(), - texture->segmentOffset), - texture->params.size(), declaration); - break; - case 2: - case 3: - case 4: - zRoom->parent->AddDeclaration( - texture->segmentOffset, DeclarationAlignment::Align4, DeclarationPadding::None, 16, - "FlashingTextureParams", - StringHelper::Sprintf("%sAnimatedTextureParams0x%06X", zRoom->GetName().c_str(), - texture->segmentOffset), - texture->params[0]->GenerateSourceCode(zRoom, texture->segmentOffset)); - break; - case 5: - zRoom->parent->AddDeclaration( - texture->segmentOffset, DeclarationAlignment::Align4, DeclarationPadding::None, 12, - "CyclingTextureParams", - StringHelper::Sprintf("%sAnimatedTextureParams0x%06X", zRoom->GetName().c_str(), - texture->segmentOffset), - texture->params[0]->GenerateSourceCode(zRoom, texture->segmentOffset)); - break; - case 6: - break; - } - } -} - -SetAnimatedTextureList::~SetAnimatedTextureList() -{ - for (AnimatedTexture* texture : textures) - delete texture; -} - -AnitmatedTextureParams::~AnitmatedTextureParams() -{ -} - -std::string SetAnimatedTextureList::GenerateSourceCodePass1(std::string roomName, - uint32_t baseAddress) -{ - return StringHelper::Sprintf( - "%s 0, (u32)%sAnimatedTextureList0x%06X", - ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), - zRoom->GetName().c_str(), segmentOffset); -} - -size_t SetAnimatedTextureList::GetRawDataSize() const -{ - size_t paramsSize = 0; - for (AnimatedTexture* texture : textures) - { - for (AnitmatedTextureParams* param : texture->params) - { - paramsSize += param->GetParamsSize(); - } - } - - return ZRoomCommand::GetRawDataSize() + paramsSize; -} - -std::string SetAnimatedTextureList::GenerateExterns() const -{ - return ""; -} - -std::string SetAnimatedTextureList::GetCommandCName() const -{ - return "SCmdTextureAnimations"; -} - -RoomCommand SetAnimatedTextureList::GetRoomCommand() const -{ - return RoomCommand::SetAnimatedTextureList; -} - -std::string SetAnimatedTextureList::GetSourceOutputCode(std::string prefix) -{ - return ""; -} - -AnimatedTexture::AnimatedTexture(std::vector<uint8_t> rawData, uint32_t rawDataIndex) - : segment(rawData[rawDataIndex]), type(BitConverter::ToInt16BE(rawData, rawDataIndex + 2)), - segmentOffset(GETSEGOFFSET(BitConverter::ToInt32BE(rawData, rawDataIndex + 4))) -{ - switch (type) - { - case 0: - params.push_back(new ScrollingTexture(rawData, segmentOffset)); - break; - case 1: - params.push_back(new ScrollingTexture(rawData, segmentOffset)); - params.push_back(new ScrollingTexture(rawData, segmentOffset + 4)); - break; - case 2: - case 3: - case 4: - params.push_back(new FlashingTexture(rawData, segmentOffset, type)); - break; - case 5: - params.push_back(new CyclingTextureParams(rawData, segmentOffset)); - break; - case 6: // Some terminator when there are no animated textures? - break; - } -} - -AnimatedTexture::~AnimatedTexture() -{ - for (AnitmatedTextureParams* param : params) - delete param; -} - -ScrollingTexture::ScrollingTexture(std::vector<uint8_t> rawData, uint32_t rawDataIndex) - : xStep(rawData[rawDataIndex + 0]), yStep(rawData[rawDataIndex + 1]), - width(rawData[rawDataIndex + 2]), height(rawData[rawDataIndex + 3]) -{ -} - -std::string ScrollingTexture::GenerateSourceCode(ZRoom* zRoom, uint32_t baseAddress) -{ - return StringHelper::Sprintf(" { %i, %i, 0x%02X, 0x%02X },", xStep, yStep, width, height); -} - -size_t ScrollingTexture::GetParamsSize() -{ - return 4; -} - -FlashingTexturePrimColor::FlashingTexturePrimColor(std::vector<uint8_t> rawData, - uint32_t rawDataIndex) - : r(rawData[rawDataIndex + 0]), g(rawData[rawDataIndex + 1]), b(rawData[rawDataIndex + 2]), - a(rawData[rawDataIndex + 3]), lodFrac(rawData[rawDataIndex + 4]) -{ -} - -FlashingTextureEnvColor::FlashingTextureEnvColor(std::vector<uint8_t> rawData, - uint32_t rawDataIndex) - : r(rawData[rawDataIndex + 0]), g(rawData[rawDataIndex + 1]), b(rawData[rawDataIndex + 2]), - a(rawData[rawDataIndex + 3]) -{ -} - -FlashingTexture::FlashingTexture(std::vector<uint8_t> rawData, uint32_t rawDataIndex, int32_t type) - : cycleLength(BitConverter::ToUInt16BE(rawData, rawDataIndex + 0)), - numKeyFrames(BitConverter::ToUInt16BE(rawData, rawDataIndex + 2)), - primColorSegmentOffset(GETSEGOFFSET(BitConverter::ToInt32BE(rawData, rawDataIndex + 4))), - envColorSegmentOffset(GETSEGOFFSET(BitConverter::ToInt32BE(rawData, rawDataIndex + 8))), - keyFrameSegmentOffset(GETSEGOFFSET(BitConverter::ToInt32BE(rawData, rawDataIndex + 12))) -{ - uint16_t length = (type == 2) ? cycleLength : numKeyFrames; - - int32_t currentPtr = primColorSegmentOffset; - for (uint16_t i = 0; i < length; i++) - { - primColors.push_back(FlashingTexturePrimColor(rawData, currentPtr)); - currentPtr += 5; - } - - currentPtr = envColorSegmentOffset; - for (uint16_t i = 0; i < length; i++) - { - envColors.push_back(FlashingTextureEnvColor(rawData, currentPtr)); - currentPtr += 4; - } - - currentPtr = keyFrameSegmentOffset; - for (uint16_t i = 0; i < length; i++) - { - keyFrames.push_back(BitConverter::ToUInt16BE(rawData, currentPtr)); - currentPtr += 2; - } -} - -std::string FlashingTexture::GenerateSourceCode(ZRoom* zRoom, uint32_t baseAddress) -{ - if (primColorSegmentOffset != 0) - { - std::string declaration = ""; - size_t index = 0; - - for (FlashingTexturePrimColor& color : primColors) - { - declaration += StringHelper::Sprintf(" { 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X },", - color.r, color.g, color.b, color.a, color.lodFrac); - - if (index < primColors.size() - 1) - declaration += "\n"; - - index++; - } - - zRoom->parent->AddDeclarationArray( - primColorSegmentOffset, DeclarationAlignment::Align4, DeclarationPadding::None, - primColors.size() * 5, "FlashingTexturePrimColor", - StringHelper::Sprintf("%sAnimatedTexturePrimColor0x%06X", zRoom->GetName().c_str(), - primColorSegmentOffset), - primColors.size(), declaration); - } - - if (envColorSegmentOffset != 0) - { - std::string declaration = ""; - size_t index = 0; - - for (FlashingTextureEnvColor& color : envColors) - { - declaration += StringHelper::Sprintf(" { 0x%02X, 0x%02X, 0x%02X, 0x%02X },", color.r, - color.g, color.b, color.a); - - if (index < envColors.size() - 1) - declaration += "\n"; - - index++; - } - - zRoom->parent->AddDeclarationArray( - envColorSegmentOffset, DeclarationAlignment::Align4, DeclarationPadding::None, - envColors.size() * 4, "Color_RGBA8", - StringHelper::Sprintf("%sAnimatedTextureEnvColors0x%06X", zRoom->GetName().c_str(), - envColorSegmentOffset), - envColors.size(), declaration); - } - - if (keyFrameSegmentOffset != 0) - { - std::string declaration = ""; - size_t index = 0; - - for (uint16_t keyFrame : keyFrames) - { - declaration += StringHelper::Sprintf(" 0x%02X,", keyFrame); - - if (index < keyFrames.size() - 1) - declaration += "\n"; - - index++; - } - - zRoom->parent->AddDeclarationArray(keyFrameSegmentOffset, DeclarationAlignment::Align4, - DeclarationPadding::None, keyFrames.size() * 2, "u16", - StringHelper::Sprintf("%sAnimatedTextureKeyFrames0x%06X", - zRoom->GetName().c_str(), - keyFrameSegmentOffset), - keyFrames.size(), declaration); - } - - return StringHelper::Sprintf( - "%i, %i, (u32)%s, (u32)%s, (u32)%s", cycleLength, numKeyFrames, - (primColorSegmentOffset != 0) ? - StringHelper::Sprintf("%sAnimatedTexturePrimColor0x%06X", zRoom->GetName().c_str(), - primColorSegmentOffset) - .c_str() : - "NULL", - (envColorSegmentOffset != 0) ? - StringHelper::Sprintf("%sAnimatedTextureEnvColors0x%06X", zRoom->GetName().c_str(), - envColorSegmentOffset) - .c_str() : - "NULL", - (keyFrameSegmentOffset != 0) ? - StringHelper::Sprintf("%sAnimatedTextureKeyFrames0x%06X", zRoom->GetName().c_str(), - keyFrameSegmentOffset) - .c_str() : - "NULL"); -} - -size_t FlashingTexture::GetParamsSize() -{ - return 16; -} - -CyclingTextureParams::CyclingTextureParams(std::vector<uint8_t> rawData, uint32_t rawDataIndex) - : cycleLength(BitConverter::ToUInt16BE(rawData, rawDataIndex + 0)), - textureSegmentOffsetsSegmentOffset( - GETSEGOFFSET(BitConverter::ToInt32BE(rawData, rawDataIndex + 4))), - textureIndicesSegmentOffset(GETSEGOFFSET(BitConverter::ToInt32BE(rawData, rawDataIndex + 8))) -{ - int32_t currentPtr = textureIndicesSegmentOffset; - int32_t maxIndex = 0; - - for (uint16_t i = 0; i < cycleLength; i++) - { - int32_t newIndex = rawData[currentPtr]; - textureIndices.push_back(newIndex); - currentPtr++; - if (newIndex > maxIndex) - maxIndex = newIndex; - } - - currentPtr = textureSegmentOffsetsSegmentOffset; - for (int32_t i = 0; i < maxIndex + 1; i++) - { - textureSegmentOffsets.push_back(GETSEGOFFSET(BitConverter::ToInt32BE(rawData, currentPtr))); - currentPtr += 4; - } -} - -std::string CyclingTextureParams::GenerateSourceCode(ZRoom* zRoom, uint32_t baseAddress) -{ - if (textureSegmentOffsetsSegmentOffset != 0) - { - std::string declaration = ""; - size_t index = 0; - - for (uint32_t offset : textureSegmentOffsets) - { - declaration += - StringHelper::Sprintf(" %sTex_%06X,", zRoom->GetName().c_str(), offset); - - if (index < textureSegmentOffsets.size() - 1) - declaration += "\n"; - - index++; - } - - zRoom->parent->AddDeclarationArray( - textureSegmentOffsetsSegmentOffset, DeclarationAlignment::Align4, - DeclarationPadding::None, textureSegmentOffsets.size() * 4, "u64*", - StringHelper::Sprintf("%sAnimatedTextureTexSegOffsets0x%06X", zRoom->GetName().c_str(), - textureSegmentOffsetsSegmentOffset), - textureSegmentOffsets.size(), declaration); - } - - if (textureIndicesSegmentOffset != 0) - { - std::string declaration = ""; - size_t index = 0; - - for (uint8_t textureIndex : textureIndices) - { - declaration += StringHelper::Sprintf(" 0x%02X,", textureIndex); - - if (index < textureIndices.size() - 1) - declaration += "\n"; - - index++; - } - - zRoom->parent->AddDeclarationArray( - textureIndicesSegmentOffset, DeclarationAlignment::Align4, DeclarationPadding::None, - textureIndices.size(), "u8", - StringHelper::Sprintf("%sAnimatedTextureTexIndices0x%06X", zRoom->GetName().c_str(), - textureIndicesSegmentOffset), - textureIndices.size(), declaration); - } - - return StringHelper::Sprintf( - "%i, (u32)%s, (u32)%s", cycleLength, - (textureSegmentOffsetsSegmentOffset != 0) ? - StringHelper::Sprintf("%sAnimatedTextureTexSegOffsets0x%06X", zRoom->GetName().c_str(), - textureSegmentOffsetsSegmentOffset) - .c_str() : - "NULL", - (textureIndicesSegmentOffset != 0) ? - StringHelper::Sprintf("%sAnimatedTextureTexIndices0x%06X", zRoom->GetName().c_str(), - textureIndicesSegmentOffset) - .c_str() : - "NULL"); -} - -size_t CyclingTextureParams::GetParamsSize() -{ - return 12; -} diff --git a/ZAPD/ZRoom/Commands/SetCameraSettings.cpp b/ZAPD/ZRoom/Commands/SetCameraSettings.cpp index b377107..fb41b88 100644 --- a/ZAPD/ZRoom/Commands/SetCameraSettings.cpp +++ b/ZAPD/ZRoom/Commands/SetCameraSettings.cpp @@ -1,20 +1,23 @@ #include "SetCameraSettings.h" -#include "../../BitConverter.h" -#include "../../StringHelper.h" -SetCameraSettings::SetCameraSettings(ZRoom* nZRoom, std::vector<uint8_t> rawData, - uint32_t rawDataIndex) - : ZRoomCommand(nZRoom, rawData, rawDataIndex) +#include "BitConverter.h" +#include "StringHelper.h" + +SetCameraSettings::SetCameraSettings(ZFile* nParent) : ZRoomCommand(nParent) { - cameraMovement = rawData[rawDataIndex + 0x01]; - mapHighlight = BitConverter::ToInt32BE(rawData, rawDataIndex + 4); } -std::string SetCameraSettings::GenerateSourceCodePass1(std::string roomName, uint32_t baseAddress) +void SetCameraSettings::ParseRawData() { - return StringHelper::Sprintf( - "%s 0x%02X, 0x%08X", ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), - cameraMovement, mapHighlight); + ZRoomCommand::ParseRawData(); + cameraMovement = cmdArg1; + mapHighlight = BitConverter::ToUInt32BE(parent->GetRawData(), rawDataIndex + 4); +} + +std::string SetCameraSettings::GetBodySourceCode() const +{ + return StringHelper::Sprintf("SCENE_CMD_MISC_SETTINGS(0x%02X, 0x%08X)", cameraMovement, + mapHighlight); } std::string SetCameraSettings::GetCommandCName() const @@ -25,4 +28,4 @@ std::string SetCameraSettings::GetCommandCName() const RoomCommand SetCameraSettings::GetRoomCommand() const { return RoomCommand::SetCameraSettings; -}
\ No newline at end of file +} diff --git a/ZAPD/ZRoom/Commands/SetCameraSettings.h b/ZAPD/ZRoom/Commands/SetCameraSettings.h index f019eb9..1a0eb11 100644 --- a/ZAPD/ZRoom/Commands/SetCameraSettings.h +++ b/ZAPD/ZRoom/Commands/SetCameraSettings.h @@ -1,18 +1,20 @@ #pragma once -#include "../ZRoomCommand.h" +#include "ZRoom/ZRoomCommand.h" class SetCameraSettings : public ZRoomCommand { public: - SetCameraSettings(ZRoom* nZRoom, std::vector<uint8_t> rawData, uint32_t rawDataIndex); + SetCameraSettings(ZFile* nParent); - virtual std::string GenerateSourceCodePass1(std::string roomName, - uint32_t baseAddress) override; - virtual std::string GetCommandCName() const override; - virtual RoomCommand GetRoomCommand() const override; + void ParseRawData() override; + + std::string GetBodySourceCode() const override; + + std::string GetCommandCName() const override; + RoomCommand GetRoomCommand() const override; private: uint8_t cameraMovement; uint32_t mapHighlight; -};
\ No newline at end of file +}; diff --git a/ZAPD/ZRoom/Commands/SetCollisionHeader.cpp b/ZAPD/ZRoom/Commands/SetCollisionHeader.cpp index d08a301..1eb13f6 100644 --- a/ZAPD/ZRoom/Commands/SetCollisionHeader.cpp +++ b/ZAPD/ZRoom/Commands/SetCollisionHeader.cpp @@ -1,33 +1,34 @@ #include "SetCollisionHeader.h" -#include "../../BitConverter.h" -#include "../../StringHelper.h" -#include "../../ZFile.h" -#include "../ZRoom.h" -SetCollisionHeader::SetCollisionHeader(ZRoom* nZRoom, std::vector<uint8_t> rawData, - uint32_t rawDataIndex) - : ZRoomCommand(nZRoom, rawData, rawDataIndex) +#include "BitConverter.h" +#include "StringHelper.h" +#include "ZFile.h" +#include "ZRoom/ZRoom.h" + +SetCollisionHeader::SetCollisionHeader(ZFile* nParent) : ZRoomCommand(nParent) +{ +} + +void SetCollisionHeader::ParseRawData() { - segmentOffset = GETSEGOFFSET(BitConverter::ToInt32BE(rawData, rawDataIndex + 4)); - collisionHeader = new ZCollisionHeader(nZRoom->parent); - collisionHeader->SetRawData(rawData); + ZRoomCommand::ParseRawData(); + collisionHeader = new ZCollisionHeader(parent); + collisionHeader->SetRawData(parent->GetRawData()); collisionHeader->SetRawDataIndex(segmentOffset); collisionHeader->SetName( - StringHelper::Sprintf("%sCollisionHeader0x%06X", nZRoom->GetName().c_str(), segmentOffset)); + StringHelper::Sprintf("%sCollisionHeader_%06X", parent->GetName().c_str(), segmentOffset)); collisionHeader->ParseRawData(); } -std::string SetCollisionHeader::GenerateSourceCodePass1(std::string roomName, uint32_t baseAddress) +SetCollisionHeader::~SetCollisionHeader() { - return StringHelper::Sprintf( - "%s 0x00, (u32)&%sCollisionHeader0x%06X", - ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), - zRoom->GetName().c_str(), segmentOffset); + delete collisionHeader; } -std::string SetCollisionHeader::GenerateSourceCodePass2(std::string roomName, uint32_t baseAddress) +std::string SetCollisionHeader::GetBodySourceCode() const { - return ""; + std::string listName = parent->GetDeclarationPtrName(cmdArg2); + return StringHelper::Sprintf("SCENE_CMD_COL_HEADER(%s)", listName.c_str()); } std::string SetCollisionHeader::GetCommandCName() const @@ -35,12 +36,7 @@ std::string SetCollisionHeader::GetCommandCName() const return "SCmdColHeader"; } -std::string SetCollisionHeader::GenerateExterns() const -{ - return ""; -} - RoomCommand SetCollisionHeader::GetRoomCommand() const { return RoomCommand::SetCollisionHeader; -}
\ No newline at end of file +} diff --git a/ZAPD/ZRoom/Commands/SetCollisionHeader.h b/ZAPD/ZRoom/Commands/SetCollisionHeader.h index 853cd3d..7ea15ef 100644 --- a/ZAPD/ZRoom/Commands/SetCollisionHeader.h +++ b/ZAPD/ZRoom/Commands/SetCollisionHeader.h @@ -1,22 +1,21 @@ #pragma once -#include "../../ZCollision.h" -#include "../ZRoomCommand.h" +#include "ZCollision.h" +#include "ZRoom/ZRoomCommand.h" class SetCollisionHeader : public ZRoomCommand { public: - SetCollisionHeader(ZRoom* nZRoom, std::vector<uint8_t> rawData, uint32_t rawDataIndex); + SetCollisionHeader(ZFile* nParent); + ~SetCollisionHeader(); - virtual std::string GenerateSourceCodePass1(std::string roomName, - uint32_t baseAddress) override; - virtual std::string GenerateSourceCodePass2(std::string roomName, - uint32_t baseAddress) override; - virtual std::string GetCommandCName() const override; - virtual std::string GenerateExterns() const override; - virtual RoomCommand GetRoomCommand() const override; + void ParseRawData() override; + + std::string GetBodySourceCode() const override; + + std::string GetCommandCName() const override; + RoomCommand GetRoomCommand() const override; private: ZCollisionHeader* collisionHeader; - uint32_t segmentOffset; -};
\ No newline at end of file +}; diff --git a/ZAPD/ZRoom/Commands/SetCsCamera.cpp b/ZAPD/ZRoom/Commands/SetCsCamera.cpp index 30d2f5c..02e2e61 100644 --- a/ZAPD/ZRoom/Commands/SetCsCamera.cpp +++ b/ZAPD/ZRoom/Commands/SetCsCamera.cpp @@ -1,85 +1,64 @@ #include "SetCsCamera.h" -#include "../../BitConverter.h" -#include "../../StringHelper.h" -#include "../../ZFile.h" -#include "../ZRoom.h" -SetCsCamera::SetCsCamera(ZRoom* nZRoom, std::vector<uint8_t> rawData, uint32_t rawDataIndex) - : ZRoomCommand(nZRoom, rawData, rawDataIndex) -{ - _rawData = rawData; - _rawDataIndex = rawDataIndex; +#include "BitConverter.h" +#include "StringHelper.h" +#include "ZFile.h" +#include "ZRoom/ZRoom.h" - segmentOffset = 0; +SetCsCamera::SetCsCamera(ZFile* nParent) : ZRoomCommand(nParent) +{ +} - int32_t numCameras = rawData[rawDataIndex + 1]; - segmentOffset = GETSEGOFFSET(BitConverter::ToInt32BE(rawData, rawDataIndex + 4)); +void SetCsCamera::ParseRawData() +{ + ZRoomCommand::ParseRawData(); + int numCameras = cmdArg1; uint32_t currentPtr = segmentOffset; int32_t numPoints = 0; for (int32_t i = 0; i < numCameras; i++) { - CsCameraEntry* entry = new CsCameraEntry(_rawData, currentPtr); + CsCameraEntry entry(parent->GetRawData(), currentPtr); + numPoints += entry.GetNumPoints(); + currentPtr += entry.GetRawDataSize(); cameras.push_back(entry); - numPoints += entry->numPoints; - - currentPtr += 8; } if (numPoints > 0) { - uint32_t currentPtr = cameras[0]->segmentOffset; + uint32_t currentPtr = cameras.at(0).GetSegmentOffset(); for (int32_t i = 0; i < numPoints; i++) { - int16_t x = BitConverter::ToInt16BE(rawData, currentPtr + 0); - int16_t y = BitConverter::ToInt16BE(rawData, currentPtr + 2); - int16_t z = BitConverter::ToInt16BE(rawData, currentPtr + 4); - Vec3s p = {x, y, z}; - points.push_back(p); - currentPtr += 6; + ZVector vec(parent); + vec.SetRawData(parent->GetRawData()); + vec.SetRawDataIndex(currentPtr); + vec.SetScalarType(ZScalarType::ZSCALAR_S16); + vec.SetDimensions(3); + vec.ParseRawData(); + + currentPtr += vec.GetRawDataSize(); + points.push_back(vec); } } if (segmentOffset != 0) - zRoom->parent->AddDeclarationPlaceholder(segmentOffset); + parent->AddDeclarationPlaceholder(segmentOffset); } -SetCsCamera::~SetCsCamera() +void SetCsCamera::DeclareReferences(const std::string& prefix) { - for (CsCameraEntry* entry : cameras) - delete entry; -} - -std::string SetCsCamera::GetSourceOutputCode(std::string prefix) -{ - return ""; -} - -std::string SetCsCamera::GenerateSourceCodePass1(std::string roomName, uint32_t baseAddress) -{ - return ""; -} - -std::string SetCsCamera::GenerateSourceCodePass2(std::string roomName, uint32_t baseAddress) -{ - std::string sourceOutput = ""; - - sourceOutput += - StringHelper::Sprintf("%s %i, (u32)&%sCsCameraList0x%06X };", - ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), - cameras.size(), roomName.c_str(), segmentOffset); - if (points.size() > 0) { std::string declaration = ""; size_t index = 0; - for (Vec3s point : points) + for (auto& point : points) { - declaration += StringHelper::Sprintf(" { %i, %i, %i }, //0x%06X", point.x, point.y, - point.z, cameras[0]->segmentOffset + (index * 6)); + declaration += + StringHelper::Sprintf("\t%s, //0x%06X", point.GetBodySourceCode().c_str(), + cameras.at(0).segmentOffset + (index * 6)); if (index < points.size() - 1) declaration += "\n"; @@ -87,50 +66,56 @@ std::string SetCsCamera::GenerateSourceCodePass2(std::string roomName, uint32_t index++; } - zRoom->parent->AddDeclarationArray(cameras[0]->segmentOffset, DeclarationAlignment::None, - DeclarationPadding::None, points.size() * 6, "Vec3s", - StringHelper::Sprintf("%sCsCameraPoints0x%06X", - roomName.c_str(), - cameras[0]->segmentOffset), - points.size(), declaration); + uint32_t segOffset = cameras.at(0).GetSegmentOffset(); + + parent->AddDeclarationArray( + segOffset, DeclarationAlignment::Align4, points.size() * points.at(0).GetRawDataSize(), + points.at(0).GetSourceTypeName().c_str(), + StringHelper::Sprintf("%sCsCameraPoints_%06X", prefix.c_str(), segOffset), + points.size(), declaration); } + if (!cameras.empty()) { + std::string camPointsName = parent->GetDeclarationName(cameras.at(0).GetSegmentOffset()); std::string declaration = ""; size_t index = 0; size_t pointsIndex = 0; - for (CsCameraEntry* entry : cameras) + for (const auto& entry : cameras) { - declaration += StringHelper::Sprintf(" %i, %i, (u32)&%sCsCameraPoints0x%06X[%i],", - entry->type, entry->numPoints, roomName.c_str(), - cameras[0]->segmentOffset, pointsIndex); + declaration += + StringHelper::Sprintf("\t{ %i, %i, &%s[%i] },", entry.type, entry.numPoints, + camPointsName.c_str(), pointsIndex); if (index < cameras.size() - 1) declaration += "\n"; index++; - pointsIndex += entry->numPoints; + pointsIndex += entry.GetNumPoints(); } - zRoom->parent->AddDeclarationArray( + const auto& entry = cameras.front(); + std::string camTypename = entry.GetSourceTypeName(); + + parent->AddDeclarationArray( segmentOffset, DeclarationAlignment::Align4, DeclarationPadding::Pad16, - cameras.size() * 8, "CsCameraEntry", - StringHelper::Sprintf("%sCsCameraList0x%06X", roomName.c_str(), segmentOffset), + cameras.size() * entry.GetRawDataSize(), camTypename, + StringHelper::Sprintf("%s%s_%06X", prefix.c_str(), camTypename.c_str(), segmentOffset), cameras.size(), declaration); } - - return sourceOutput; } -size_t SetCsCamera::GetRawDataSize() const +std::string SetCsCamera::GetBodySourceCode() const { - return ZRoomCommand::GetRawDataSize() + (cameras.size() * 8) + (points.size() * 6); + std::string listName = parent->GetDeclarationPtrName(cmdArg2); + return StringHelper::Sprintf("SCENE_CMD_ACTOR_CUTSCENE_CAM_LIST(%i, %s)", cameras.size(), + listName.c_str()); } -std::string SetCsCamera::GenerateExterns() const +size_t SetCsCamera::GetRawDataSize() const { - return ""; + return ZRoomCommand::GetRawDataSize() + (cameras.size() * 8) + (points.size() * 6); } std::string SetCsCamera::GetCommandCName() const @@ -143,9 +128,35 @@ RoomCommand SetCsCamera::GetRoomCommand() const return RoomCommand::SetCsCamera; } -CsCameraEntry::CsCameraEntry(std::vector<uint8_t> rawData, uint32_t rawDataIndex) +CsCameraEntry::CsCameraEntry(const std::vector<uint8_t>& rawData, uint32_t rawDataIndex) : baseOffset(rawDataIndex), type(BitConverter::ToInt16BE(rawData, rawDataIndex + 0)), - numPoints(BitConverter::ToInt16BE(rawData, rawDataIndex + 2)), - segmentOffset(GETSEGOFFSET(BitConverter::ToInt32BE(rawData, rawDataIndex + 4))) + numPoints(BitConverter::ToInt16BE(rawData, rawDataIndex + 2)) +{ + camAddress = BitConverter::ToInt32BE(rawData, rawDataIndex + 4); + segmentOffset = GETSEGOFFSET(camAddress); +} + +std::string CsCameraEntry::GetSourceTypeName() const +{ + return "CsCameraEntry"; +} + +int32_t CsCameraEntry::GetRawDataSize() const +{ + return 8; +} + +int16_t CsCameraEntry::GetNumPoints() const +{ + return numPoints; +} + +segptr_t CsCameraEntry::GetCamAddress() const +{ + return camAddress; +} + +uint32_t CsCameraEntry::GetSegmentOffset() const { + return segmentOffset; } diff --git a/ZAPD/ZRoom/Commands/SetCsCamera.h b/ZAPD/ZRoom/Commands/SetCsCamera.h index 2bd4107..e62b073 100644 --- a/ZAPD/ZRoom/Commands/SetCsCamera.h +++ b/ZAPD/ZRoom/Commands/SetCsCamera.h @@ -1,39 +1,42 @@ #pragma once -#include "../../Vec3s.h" -#include "../ZRoomCommand.h" +#include "ZRoom/ZRoomCommand.h" +#include "ZVector.h" class CsCameraEntry { public: - CsCameraEntry(std::vector<uint8_t> rawData, uint32_t rawDataIndex); + CsCameraEntry(const std::vector<uint8_t>& rawData, uint32_t rawDataIndex); - int32_t baseOffset; - int32_t type; - int32_t numPoints; + std::string GetSourceTypeName() const; + int32_t GetRawDataSize() const; + + int16_t GetNumPoints() const; + segptr_t GetCamAddress() const; + uint32_t GetSegmentOffset() const; + + int baseOffset; + int16_t type; + int16_t numPoints; + segptr_t camAddress; uint32_t segmentOffset; }; class SetCsCamera : public ZRoomCommand { public: - SetCsCamera(ZRoom* nZRoom, std::vector<uint8_t> rawData, uint32_t rawDataIndex); - ~SetCsCamera(); - - std::string GetSourceOutputCode(std::string prefix); - virtual std::string GenerateSourceCodePass1(std::string roomName, - uint32_t baseAddress) override; - virtual std::string GenerateSourceCodePass2(std::string roomName, - uint32_t baseAddress) override; - virtual RoomCommand GetRoomCommand() const override; - virtual size_t GetRawDataSize() const override; - virtual std::string GetCommandCName() const override; - virtual std::string GenerateExterns() const override; + SetCsCamera(ZFile* nParent); + + void ParseRawData() override; + void DeclareReferences(const std::string& prefix) override; + + std::string GetBodySourceCode() const override; + + RoomCommand GetRoomCommand() const override; + size_t GetRawDataSize() const override; + std::string GetCommandCName() const override; private: - uint32_t segmentOffset; - std::vector<CsCameraEntry*> cameras; - std::vector<Vec3s> points; - std::vector<uint8_t> _rawData; - int32_t _rawDataIndex; + std::vector<CsCameraEntry> cameras; + std::vector<ZVector> points; }; diff --git a/ZAPD/ZRoom/Commands/SetCutscenes.cpp b/ZAPD/ZRoom/Commands/SetCutscenes.cpp index e49082a..8007ac0 100644 --- a/ZAPD/ZRoom/Commands/SetCutscenes.cpp +++ b/ZAPD/ZRoom/Commands/SetCutscenes.cpp @@ -1,24 +1,27 @@ #include "SetCutscenes.h" -#include "../../BitConverter.h" -#include "../../Globals.h" -#include "../../StringHelper.h" -#include "../../ZFile.h" -#include "../ZRoom.h" - -SetCutscenes::SetCutscenes(ZRoom* nZRoom, std::vector<uint8_t> rawData, uint32_t rawDataIndex) - : ZRoomCommand(nZRoom, rawData, rawDataIndex) + +#include "BitConverter.h" +#include "Globals.h" +#include "StringHelper.h" +#include "ZFile.h" +#include "ZRoom/ZRoom.h" + +SetCutscenes::SetCutscenes(ZFile* nParent) : ZRoomCommand(nParent) { - numCutscenes = rawData[rawDataIndex + 1]; - segmentOffset = GETSEGOFFSET(BitConverter::ToInt32BE(rawData, rawDataIndex + 4)); +} +void SetCutscenes::ParseRawData() +{ + ZRoomCommand::ParseRawData(); std::string output = ""; + numCutscenes = cmdArg1; if (Globals::Instance->game == ZGame::OOT_RETAIL || Globals::Instance->game == ZGame::OOT_SW97) { - ZCutscene* cutscene = new ZCutscene(nZRoom->parent); - cutscene->ExtractFromFile(rawData, segmentOffset); + ZCutscene* cutscene = new ZCutscene(parent); + cutscene->ExtractFromFile(parent->GetRawData(), segmentOffset); - auto decl = nZRoom->parent->GetDeclaration(segmentOffset); + auto decl = parent->GetDeclaration(segmentOffset); if (decl == nullptr) { cutscene->DeclareVar(zRoom->GetName().c_str(), ""); @@ -33,37 +36,34 @@ SetCutscenes::SetCutscenes(ZRoom* nZRoom, std::vector<uint8_t> rawData, uint32_t for (uint8_t i = 0; i < numCutscenes; i++) { - CutsceneEntry* entry = new CutsceneEntry(rawData, currentPtr); + CutsceneEntry entry(parent->GetRawData(), currentPtr); cutsceneEntries.push_back(entry); currentPtr += 8; declaration += StringHelper::Sprintf( " { %sCutsceneData0x%06X, 0x%04X, 0x%02X, 0x%02X },", zRoom->GetName().c_str(), - entry->segmentOffset, entry->exit, entry->entrance, entry->flag); + entry.segmentOffset, entry.exit, entry.entrance, entry.flag); if (i < numCutscenes - 1) declaration += "\n"; - ZCutsceneMM* cutscene = new ZCutsceneMM(nZRoom->parent); - - // TODO: Use ExtractFromFile() here when that gets implemented - cutscene->ExtractFromXML(nullptr, rawData, entry->segmentOffset); + ZCutsceneMM* cutscene = new ZCutsceneMM(parent); + cutscene->ExtractFromFile(parent->GetRawData(), entry.segmentOffset); cutscenes.push_back(cutscene); } - zRoom->parent->AddDeclarationArray( - segmentOffset, DeclarationAlignment::None, DeclarationPadding::None, - cutsceneEntries.size() * 8, "CutsceneEntry", - StringHelper::Sprintf("%sCutsceneEntryList0x%06X", zRoom->GetName().c_str(), - segmentOffset), - cutsceneEntries.size(), declaration); + parent->AddDeclarationArray(segmentOffset, DeclarationAlignment::Align4, + cutsceneEntries.size() * 8, "CutsceneEntry", + StringHelper::Sprintf("%sCutsceneEntryList_%06X", + zRoom->GetName().c_str(), segmentOffset), + cutsceneEntries.size(), declaration); } for (ZCutsceneBase* cutscene : cutscenes) { if (cutscene->getSegmentOffset() != 0) { - Declaration* decl = zRoom->parent->GetDeclaration(cutscene->getSegmentOffset()); + Declaration* decl = parent->GetDeclaration(cutscene->getSegmentOffset()); if (decl == nullptr) { cutscene->GetSourceOutputCode(zRoom->GetName()); @@ -80,44 +80,21 @@ SetCutscenes::~SetCutscenes() { for (ZCutsceneBase* cutscene : cutscenes) delete cutscene; - - for (CutsceneEntry* entry : cutsceneEntries) - delete entry; } -std::string SetCutscenes::GenerateSourceCodePass1(std::string roomName, uint32_t baseAddress) +std::string SetCutscenes::GetBodySourceCode() const { - std::string pass1 = ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress); - Declaration* decl = zRoom->parent->GetDeclaration(segmentOffset); - if (decl != nullptr) - { - return StringHelper::Sprintf("%s %i, (u32)%s", pass1.c_str(), numCutscenes, - decl->varName.c_str()); - } - return StringHelper::Sprintf("%s %i, (u32)%sCutsceneData0x%06X", pass1.c_str(), numCutscenes, - zRoom->GetName().c_str(), segmentOffset); -} + std::string listName = parent->GetDeclarationPtrName(cmdArg2); -size_t SetCutscenes::GetRawDataSize() const -{ - return ZRoomCommand::GetRawDataSize() + (0); + if (Globals::Instance->game == ZGame::MM_RETAIL) + return StringHelper::Sprintf("SCENE_CMD_CUTSCENE_LIST(%i, %s)", numCutscenes, + listName.c_str()); + return StringHelper::Sprintf("SCENE_CMD_CUTSCENE_DATA(%s)", listName.c_str()); } -std::string SetCutscenes::GenerateExterns() const +size_t SetCutscenes::GetRawDataSize() const { - if (Globals::Instance->game == ZGame::MM_RETAIL) - { - return StringHelper::Sprintf("extern CutsceneEntry %sCutsceneEntryList0x%06X[];\n", - zRoom->GetName().c_str(), segmentOffset); - } - - Declaration* decl = zRoom->parent->GetDeclaration(segmentOffset); - if (decl != nullptr && decl->varName != "") - { - return StringHelper::Sprintf("extern s32 %s[];\n", decl->varName.c_str()); - } - return StringHelper::Sprintf("extern s32 %sCutsceneData0x%06X[];\n", zRoom->GetName().c_str(), - segmentOffset); + return ZRoomCommand::GetRawDataSize(); } std::string SetCutscenes::GetCommandCName() const @@ -130,13 +107,8 @@ RoomCommand SetCutscenes::GetRoomCommand() const return RoomCommand::SetCutscenes; } -std::string SetCutscenes::GetSourceOutputCode(std::string prefix) -{ - return ""; -} - -CutsceneEntry::CutsceneEntry(std::vector<uint8_t> rawData, uint32_t rawDataIndex) - : segmentOffset(BitConverter::ToInt32BE(rawData, rawDataIndex + 0) & 0x00FFFFFF), +CutsceneEntry::CutsceneEntry(const std::vector<uint8_t>& rawData, uint32_t rawDataIndex) + : segmentOffset(GETSEGOFFSET(BitConverter::ToInt32BE(rawData, rawDataIndex + 0))), exit(BitConverter::ToInt16BE(rawData, rawDataIndex + 4)), entrance(rawData[rawDataIndex + 6]), flag(rawData[rawDataIndex + 7]) { diff --git a/ZAPD/ZRoom/Commands/SetCutscenes.h b/ZAPD/ZRoom/Commands/SetCutscenes.h index 4a70010..0d1def2 100644 --- a/ZAPD/ZRoom/Commands/SetCutscenes.h +++ b/ZAPD/ZRoom/Commands/SetCutscenes.h @@ -1,13 +1,13 @@ #pragma once -#include "../../ZCutscene.h" -#include "../../ZCutsceneMM.h" -#include "../ZRoomCommand.h" +#include "ZCutscene.h" +#include "ZCutsceneMM.h" +#include "ZRoom/ZRoomCommand.h" class CutsceneEntry { public: - CutsceneEntry(std::vector<uint8_t> rawData, uint32_t rawDataIndex); + CutsceneEntry(const std::vector<uint8_t>& rawData, uint32_t rawDataIndex); uint32_t segmentOffset; uint16_t exit; @@ -18,22 +18,19 @@ public: class SetCutscenes : public ZRoomCommand { public: - SetCutscenes(ZRoom* nZRoom, std::vector<uint8_t> rawData, uint32_t rawDataIndex); + SetCutscenes(ZFile* nParent); ~SetCutscenes(); - std::string GetSourceOutputCode(std::string prefix); - virtual std::string GenerateSourceCodePass1(std::string roomName, - uint32_t baseAddress) override; - virtual RoomCommand GetRoomCommand() const override; - virtual size_t GetRawDataSize() const override; - virtual std::string GetCommandCName() const override; - virtual std::string GenerateExterns() const override; + void ParseRawData() override; + + std::string GetBodySourceCode() const override; + + RoomCommand GetRoomCommand() const override; + size_t GetRawDataSize() const override; + std::string GetCommandCName() const override; private: std::vector<ZCutsceneBase*> cutscenes; - std::vector<CutsceneEntry*> cutsceneEntries; // (MM Only) - uint32_t segmentOffset; - uint8_t numCutscenes; // (MM Only) - std::vector<uint8_t> _rawData; - int32_t _rawDataIndex; -};
\ No newline at end of file + std::vector<CutsceneEntry> cutsceneEntries; // (MM Only) + uint8_t numCutscenes; // (MM Only) +}; diff --git a/ZAPD/ZRoom/Commands/SetEchoSettings.cpp b/ZAPD/ZRoom/Commands/SetEchoSettings.cpp index f0758ef..275dc63 100644 --- a/ZAPD/ZRoom/Commands/SetEchoSettings.cpp +++ b/ZAPD/ZRoom/Commands/SetEchoSettings.cpp @@ -1,17 +1,19 @@ #include "SetEchoSettings.h" -#include "../../StringHelper.h" +#include "StringHelper.h" -SetEchoSettings::SetEchoSettings(ZRoom* nZRoom, std::vector<uint8_t> rawData, uint32_t rawDataIndex) - : ZRoomCommand(nZRoom, rawData, rawDataIndex) +SetEchoSettings::SetEchoSettings(ZFile* nParent) : ZRoomCommand(nParent) { - echo = rawData[rawDataIndex + 0x07]; } -std::string SetEchoSettings::GenerateSourceCodePass1(std::string roomName, uint32_t baseAddress) +void SetEchoSettings::ParseRawData() { - return StringHelper::Sprintf( - "%s 0, { 0 }, 0x%02X", ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), - echo); + ZRoomCommand::ParseRawData(); + echo = parent->GetRawData().at(rawDataIndex + 0x07); +} + +std::string SetEchoSettings::GetBodySourceCode() const +{ + return StringHelper::Sprintf("SCENE_CMD_ECHO_SETTINGS(%i)", echo); } std::string SetEchoSettings::GetCommandCName() const @@ -22,4 +24,4 @@ std::string SetEchoSettings::GetCommandCName() const RoomCommand SetEchoSettings::GetRoomCommand() const { return RoomCommand::SetEchoSettings; -}
\ No newline at end of file +} diff --git a/ZAPD/ZRoom/Commands/SetEchoSettings.h b/ZAPD/ZRoom/Commands/SetEchoSettings.h index 1c8886d..5963263 100644 --- a/ZAPD/ZRoom/Commands/SetEchoSettings.h +++ b/ZAPD/ZRoom/Commands/SetEchoSettings.h @@ -1,17 +1,19 @@ #pragma once -#include "../ZRoomCommand.h" +#include "ZRoom/ZRoomCommand.h" class SetEchoSettings : public ZRoomCommand { public: - SetEchoSettings(ZRoom* nZRoom, std::vector<uint8_t> rawData, uint32_t rawDataIndex); + SetEchoSettings(ZFile* nParent); - virtual std::string GenerateSourceCodePass1(std::string roomName, - uint32_t baseAddress) override; - virtual std::string GetCommandCName() const override; - virtual RoomCommand GetRoomCommand() const override; + void ParseRawData() override; + + std::string GetBodySourceCode() const override; + + std::string GetCommandCName() const override; + RoomCommand GetRoomCommand() const override; private: uint8_t echo; -};
\ No newline at end of file +}; diff --git a/ZAPD/ZRoom/Commands/SetEntranceList.cpp b/ZAPD/ZRoom/Commands/SetEntranceList.cpp index 2c97902..4ba73a2 100644 --- a/ZAPD/ZRoom/Commands/SetEntranceList.cpp +++ b/ZAPD/ZRoom/Commands/SetEntranceList.cpp @@ -1,70 +1,64 @@ #include "SetEntranceList.h" -#include "../../BitConverter.h" -#include "../../StringHelper.h" -#include "../../ZFile.h" -#include "../ZRoom.h" +#include "BitConverter.h" #include "SetStartPositionList.h" +#include "StringHelper.h" +#include "ZFile.h" +#include "ZRoom/ZRoom.h" -SetEntranceList::SetEntranceList(ZRoom* nZRoom, std::vector<uint8_t> rawData, uint32_t rawDataIndex) - : ZRoomCommand(nZRoom, rawData, rawDataIndex) +SetEntranceList::SetEntranceList(ZFile* nParent) : ZRoomCommand(nParent) { - segmentOffset = BitConverter::ToInt32BE(rawData, rawDataIndex + 4) & 0x00FFFFFF; - entrances = std::vector<EntranceEntry*>(); - - _rawData = rawData; - _rawDataIndex = rawDataIndex; } -SetEntranceList::~SetEntranceList() +void SetEntranceList::DeclareReferences(const std::string& prefix) { - for (EntranceEntry* entry : entrances) - delete entry; + if (segmentOffset != 0) + parent->AddDeclarationPlaceholder(segmentOffset); } -std::string SetEntranceList::GenerateSourceCodePass1(std::string roomName, uint32_t baseAddress) +void SetEntranceList::ParseRawDataLate() { - std::string sourceOutput = - StringHelper::Sprintf("%s 0x00, (u32)&%sEntranceList0x%06X", - ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), - zRoom->GetName().c_str(), segmentOffset); - // Parse Entrances and Generate Declaration - zRoom->parent->AddDeclarationPlaceholder(segmentOffset); // Make sure this segment is defined - int32_t numEntrances = zRoom->GetDeclarationSizeFromNeighbor(segmentOffset) / 2; + int numEntrances = zRoom->GetDeclarationSizeFromNeighbor(segmentOffset) / 2; uint32_t currentPtr = segmentOffset; for (int32_t i = 0; i < numEntrances; i++) { - EntranceEntry* entry = new EntranceEntry(_rawData, currentPtr); + EntranceEntry entry(parent->GetRawData(), currentPtr); entrances.push_back(entry); currentPtr += 2; } +} - std::string declaration = ""; - - int32_t index = 0; - - for (EntranceEntry* entry : entrances) +void SetEntranceList::DeclareReferencesLate(const std::string& prefix) +{ + if (!entrances.empty()) { - declaration += - StringHelper::Sprintf(" { 0x%02X, 0x%02X }, //0x%06X \n", entry->startPositionIndex, - entry->roomToLoad, segmentOffset + (index * 2)); - index++; + std::string declaration = ""; + + size_t index = 0; + for (const auto& entry : entrances) + { + declaration += + StringHelper::Sprintf(" { %s }, //0x%06X", entry.GetBodySourceCode().c_str(), + segmentOffset + (index * 2)); + if (index + 1 < entrances.size()) + declaration += "\n"; + + index++; + } + + parent->AddDeclarationArray( + segmentOffset, DeclarationAlignment::None, entrances.size() * 2, "EntranceEntry", + StringHelper::Sprintf("%sEntranceList0x%06X", zRoom->GetName().c_str(), segmentOffset), + entrances.size(), declaration); } - - zRoom->parent->AddDeclarationArray( - segmentOffset, DeclarationAlignment::None, entrances.size() * 2, "EntranceEntry", - StringHelper::Sprintf("%sEntranceList0x%06X", zRoom->GetName().c_str(), segmentOffset), - entrances.size(), declaration); - - return sourceOutput; } -std::string SetEntranceList::GenerateExterns() const +std::string SetEntranceList::GetBodySourceCode() const { - return StringHelper::Sprintf("extern EntranceEntry %sEntranceList0x%06X[];\n", - zRoom->GetName().c_str(), segmentOffset); + std::string listName = parent->GetDeclarationPtrName(cmdArg2); + return StringHelper::Sprintf("SCENE_CMD_ENTRANCE_LIST(%s)", listName.c_str()); } std::string SetEntranceList::GetCommandCName() const @@ -77,8 +71,13 @@ RoomCommand SetEntranceList::GetRoomCommand() const return RoomCommand::SetEntranceList; } -EntranceEntry::EntranceEntry(std::vector<uint8_t> rawData, uint32_t rawDataIndex) +EntranceEntry::EntranceEntry(const std::vector<uint8_t>& rawData, uint32_t rawDataIndex) +{ + startPositionIndex = rawData.at(rawDataIndex + 0); + roomToLoad = rawData.at(rawDataIndex + 1); +} + +std::string EntranceEntry::GetBodySourceCode() const { - startPositionIndex = rawData[rawDataIndex + 0]; - roomToLoad = rawData[rawDataIndex + 1]; -}
\ No newline at end of file + return StringHelper::Sprintf("0x%02X, 0x%02X", startPositionIndex, roomToLoad); +} diff --git a/ZAPD/ZRoom/Commands/SetEntranceList.h b/ZAPD/ZRoom/Commands/SetEntranceList.h index 5624916..5e76f9f 100644 --- a/ZAPD/ZRoom/Commands/SetEntranceList.h +++ b/ZAPD/ZRoom/Commands/SetEntranceList.h @@ -1,31 +1,33 @@ #pragma once -#include "../ZRoomCommand.h" +#include "ZRoom/ZRoomCommand.h" class EntranceEntry { public: + EntranceEntry(const std::vector<uint8_t>& rawData, uint32_t rawDataIndex); + + std::string GetBodySourceCode() const; + +protected: uint8_t startPositionIndex; uint8_t roomToLoad; - - EntranceEntry(std::vector<uint8_t> rawData, uint32_t rawDataIndex); }; class SetEntranceList : public ZRoomCommand { public: - SetEntranceList(ZRoom* nZRoom, std::vector<uint8_t> rawData, uint32_t rawDataIndex); - ~SetEntranceList(); + SetEntranceList(ZFile* nParent); - virtual std::string GenerateSourceCodePass1(std::string roomName, - uint32_t baseAddress) override; - virtual std::string GenerateExterns() const override; - virtual std::string GetCommandCName() const override; - virtual RoomCommand GetRoomCommand() const override; + void DeclareReferences(const std::string& prefix) override; + void ParseRawDataLate() override; + void DeclareReferencesLate(const std::string& prefix) override; + + std::string GetBodySourceCode() const override; + + RoomCommand GetRoomCommand() const override; + std::string GetCommandCName() const override; private: - std::vector<EntranceEntry*> entrances; - uint32_t segmentOffset; - std::vector<uint8_t> _rawData; - int32_t _rawDataIndex; -};
\ No newline at end of file + std::vector<EntranceEntry> entrances; +}; diff --git a/ZAPD/ZRoom/Commands/SetExitList.cpp b/ZAPD/ZRoom/Commands/SetExitList.cpp index 85fc4a4..5bfd19a 100644 --- a/ZAPD/ZRoom/Commands/SetExitList.cpp +++ b/ZAPD/ZRoom/Commands/SetExitList.cpp @@ -1,61 +1,59 @@ #include "SetExitList.h" -#include "../../BitConverter.h" -#include "../../StringHelper.h" -#include "../../ZFile.h" -#include "../ZRoom.h" -SetExitList::SetExitList(ZRoom* nZRoom, std::vector<uint8_t> rawData, uint32_t rawDataIndex) - : ZRoomCommand(nZRoom, rawData, rawDataIndex) +#include "BitConverter.h" +#include "StringHelper.h" +#include "ZFile.h" +#include "ZRoom/ZRoom.h" + +SetExitList::SetExitList(ZFile* nParent) : ZRoomCommand(nParent) { - segmentOffset = GETSEGOFFSET(BitConverter::ToInt32BE(rawData, rawDataIndex + 4)); - exits = std::vector<uint16_t>(); +} +void SetExitList::DeclareReferences(const std::string& prefix) +{ if (segmentOffset != 0) - zRoom->parent->AddDeclarationPlaceholder(segmentOffset); - - _rawData = rawData; - _rawDataIndex = rawDataIndex; + parent->AddDeclarationPlaceholder(segmentOffset); } -std::string SetExitList::GenerateSourceCodePass1(std::string roomName, uint32_t baseAddress) +void SetExitList::ParseRawDataLate() { - std::string sourceOutput = - StringHelper::Sprintf("%s 0x00, (u32)&%sExitList0x%06X", - ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), - zRoom->GetName().c_str(), segmentOffset); - // Parse Entrances and Generate Declaration - zRoom->parent->AddDeclarationPlaceholder(segmentOffset); // Make sure this segment is defined - int32_t numEntrances = zRoom->GetDeclarationSizeFromNeighbor(segmentOffset) / 2; + int numEntrances = zRoom->GetDeclarationSizeFromNeighbor(segmentOffset) / 2; uint32_t currentPtr = segmentOffset; for (int32_t i = 0; i < numEntrances; i++) { - uint16_t exit = BitConverter::ToInt16BE(_rawData, currentPtr); + uint16_t exit = BitConverter::ToUInt16BE(parent->GetRawData(), currentPtr); exits.push_back(exit); currentPtr += 2; } +} - std::string declaration = ""; - - for (uint16_t exit : exits) - declaration += StringHelper::Sprintf(" 0x%04X,\n", exit); - ; +void SetExitList::DeclareReferencesLate(const std::string& prefix) +{ + if (!exits.empty()) + { + std::string declaration = ""; - zRoom->parent->AddDeclarationArray( - segmentOffset, DeclarationAlignment::None, exits.size() * 2, "u16", - StringHelper::Sprintf("%sExitList0x%06X", zRoom->GetName().c_str(), segmentOffset), - exits.size(), declaration); + for (size_t i = 0; i < exits.size(); i++) + { + declaration += StringHelper::Sprintf(" 0x%04X,", exits.at(i)); + if (i + 1 < exits.size()) + declaration += "\n"; + } - return sourceOutput; + parent->AddDeclarationArray( + segmentOffset, DeclarationAlignment::Align4, exits.size() * 2, "u16", + StringHelper::Sprintf("%sExitList_%06X", zRoom->GetName().c_str(), segmentOffset), + exits.size(), declaration); + } } -std::string SetExitList::GenerateExterns() const +std::string SetExitList::GetBodySourceCode() const { - return StringHelper::Sprintf("extern u16 %sExitList0x%06X[];\n", zRoom->GetName().c_str(), - segmentOffset); - ; + std::string listName = parent->GetDeclarationPtrName(cmdArg2); + return StringHelper::Sprintf("SCENE_CMD_EXIT_LIST(%s)", listName.c_str()); } std::string SetExitList::GetCommandCName() const @@ -66,4 +64,4 @@ std::string SetExitList::GetCommandCName() const RoomCommand SetExitList::GetRoomCommand() const { return RoomCommand::SetExitList; -}
\ No newline at end of file +} diff --git a/ZAPD/ZRoom/Commands/SetExitList.h b/ZAPD/ZRoom/Commands/SetExitList.h index b146317..8d220b1 100644 --- a/ZAPD/ZRoom/Commands/SetExitList.h +++ b/ZAPD/ZRoom/Commands/SetExitList.h @@ -1,21 +1,21 @@ #pragma once -#include "../ZRoomCommand.h" +#include "ZRoom/ZRoomCommand.h" class SetExitList : public ZRoomCommand { public: - SetExitList(ZRoom* nZRoom, std::vector<uint8_t> rawData, uint32_t rawDataIndex); + SetExitList(ZFile* nParent); - virtual std::string GenerateSourceCodePass1(std::string roomName, - uint32_t baseAddress) override; - virtual std::string GenerateExterns() const override; - virtual std::string GetCommandCName() const override; - virtual RoomCommand GetRoomCommand() const override; + void DeclareReferences(const std::string& prefix) override; + void ParseRawDataLate() override; + void DeclareReferencesLate(const std::string& prefix) override; + + std::string GetBodySourceCode() const override; + + RoomCommand GetRoomCommand() const override; + std::string GetCommandCName() const override; private: std::vector<uint16_t> exits; - uint32_t segmentOffset; - std::vector<uint8_t> _rawData; - int32_t _rawDataIndex; -};
\ No newline at end of file +}; diff --git a/ZAPD/ZRoom/Commands/SetLightList.cpp b/ZAPD/ZRoom/Commands/SetLightList.cpp index 2765e0c..a12832c 100644 --- a/ZAPD/ZRoom/Commands/SetLightList.cpp +++ b/ZAPD/ZRoom/Commands/SetLightList.cpp @@ -1,51 +1,56 @@ #include "SetLightList.h" -#include "../../BitConverter.h" -#include "../../StringHelper.h" +#include "BitConverter.h" +#include "StringHelper.h" -SetLightList::SetLightList(ZRoom* nZRoom, std::vector<uint8_t> rawData, uint32_t rawDataIndex) - : ZRoomCommand(nZRoom, rawData, rawDataIndex) +SetLightList::SetLightList(ZFile* nParent) : ZRoomCommand(nParent) { - this->ptrRoom = nZRoom; - this->numLights = rawData[rawDataIndex + 1]; - this->segment = BitConverter::ToInt32BE(rawData, rawDataIndex + 4) & 0x00FFFFFF; +} +void SetLightList::ParseRawData() +{ + ZRoomCommand::ParseRawData(); std::string declarations = ""; - int32_t currentPtr = this->segment; - for (int32_t i = 0; i < this->numLights; i++) + numLights = cmdArg1; + int32_t currentPtr = segmentOffset; + for (int i = 0; i < this->numLights; i++) { - uint8_t type = rawData[currentPtr + 0]; - int16_t x = BitConverter::ToInt16BE(rawData, currentPtr + 2); - int16_t y = BitConverter::ToInt16BE(rawData, currentPtr + 4); - int16_t z = BitConverter::ToInt16BE(rawData, currentPtr + 6); - uint8_t r = rawData[currentPtr + 8]; - uint8_t g = rawData[currentPtr + 9]; - uint8_t b = rawData[currentPtr + 10]; - uint8_t drawGlow = rawData[currentPtr + 11]; - int16_t radius = BitConverter::ToInt16BE(rawData, currentPtr + 12); - - currentPtr += 14; - - declarations += StringHelper::Sprintf( - " { 0x%02X, { %i, %i, %i, { 0x%02X, 0x%02X, 0x%02X }, 0x%02X, 0x%04X } },", type, x, - y, z, r, g, b, drawGlow, radius); - - if (i < this->numLights - 1) - declarations += "\n"; + LightInfo light(parent->GetRawData(), currentPtr); + + currentPtr += light.GetRawDataSize(); + lights.push_back(light); } +} + +void SetLightList::DeclareReferences(const std::string& prefix) +{ + if (!lights.empty()) + { + std::string declarations = ""; - this->ptrRoom->parent->AddDeclarationArray( - this->segment, DeclarationAlignment::None, this->numLights * 0xE, "LightInfo", - StringHelper::Sprintf("%sLightInfo0x%06X", this->ptrRoom->GetName().c_str(), this->segment), - this->numLights, declarations); + for (size_t i = 0; i < lights.size(); i++) + { + declarations += + StringHelper::Sprintf("\t{ %s },", lights.at(i).GetBodySourceCode().c_str()); + + if (i < lights.size() - 1) + declarations += "\n"; + } + + const auto& light = lights.front(); + + parent->AddDeclarationArray( + segmentOffset, DeclarationAlignment::None, lights.size() * light.GetRawDataSize(), + light.GetSourceTypeName(), + StringHelper::Sprintf("%sLightInfo0x%06X", prefix.c_str(), segmentOffset), + lights.size(), declarations); + } } -std::string SetLightList::GenerateSourceCodePass1(std::string roomName, uint32_t baseAddress) +std::string SetLightList::GetBodySourceCode() const { - return StringHelper::Sprintf( - "%s %i, &%sLightInfo0x%06X", - ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), this->numLights, - this->ptrRoom->GetName().c_str(), this->segment); + std::string listName = parent->GetDeclarationPtrName(cmdArg2); + return StringHelper::Sprintf("SCENE_CMD_LIGHT_LIST(%i, %s)", numLights, listName.c_str()); } std::string SetLightList::GetCommandCName() const @@ -53,13 +58,37 @@ std::string SetLightList::GetCommandCName() const return "SCmdLightList"; } -std::string SetLightList::GenerateExterns() const +RoomCommand SetLightList::GetRoomCommand() const { - return StringHelper::Sprintf("extern LightInfo %sLightInfo0x%06X[];\n", - this->ptrRoom->GetName().c_str(), this->segment); + return RoomCommand::SetLightList; } -RoomCommand SetLightList::GetRoomCommand() const +LightInfo::LightInfo(const std::vector<uint8_t>& rawData, uint32_t rawDataIndex) { - return RoomCommand::SetLightList; -}
\ No newline at end of file + type = BitConverter::ToUInt8BE(rawData, rawDataIndex + 0); + x = BitConverter::ToInt16BE(rawData, rawDataIndex + 2); + y = BitConverter::ToInt16BE(rawData, rawDataIndex + 4); + z = BitConverter::ToInt16BE(rawData, rawDataIndex + 6); + r = BitConverter::ToUInt8BE(rawData, rawDataIndex + 8); + g = BitConverter::ToUInt8BE(rawData, rawDataIndex + 9); + b = BitConverter::ToUInt8BE(rawData, rawDataIndex + 10); + drawGlow = BitConverter::ToUInt8BE(rawData, rawDataIndex + 11); + radius = BitConverter::ToInt16BE(rawData, rawDataIndex + 12); +} + +std::string LightInfo::GetBodySourceCode() const +{ + return StringHelper::Sprintf( + "0x%02X, { %i, %i, %i, { 0x%02X, 0x%02X, 0x%02X }, 0x%02X, 0x%04X }", type, x, y, z, r, g, + b, drawGlow, radius); +} + +std::string LightInfo::GetSourceTypeName() const +{ + return "LightInfo"; +} + +size_t LightInfo::GetRawDataSize() const +{ + return 0x0E; +} diff --git a/ZAPD/ZRoom/Commands/SetLightList.h b/ZAPD/ZRoom/Commands/SetLightList.h index 0f04d82..389ffef 100644 --- a/ZAPD/ZRoom/Commands/SetLightList.h +++ b/ZAPD/ZRoom/Commands/SetLightList.h @@ -2,24 +2,42 @@ #include <string> -#include "../ZRoom.h" -#include "../ZRoomCommand.h" #include "ZFile.h" +#include "ZRoom/ZRoom.h" +#include "ZRoom/ZRoomCommand.h" + +class LightInfo +{ +public: + LightInfo(const std::vector<uint8_t>& rawData, uint32_t rawDataIndex); + + std::string GetBodySourceCode() const; + + std::string GetSourceTypeName() const; + size_t GetRawDataSize() const; + +protected: + uint8_t type; + int16_t x, y, z; + uint8_t r, g, b; + uint8_t drawGlow; + int16_t radius; +}; class SetLightList : public ZRoomCommand { public: - SetLightList(ZRoom* nZRoom, std::vector<uint8_t> rawData, uint32_t rawDataIndex); + SetLightList(ZFile* nParent); + + void ParseRawData() override; + void DeclareReferences(const std::string& prefix) override; - virtual std::string GenerateSourceCodePass1(std::string roomName, - uint32_t baseAddress) override; - virtual std::string GetCommandCName() const override; - virtual RoomCommand GetRoomCommand() const override; - virtual std::string GenerateExterns() const override; + std::string GetBodySourceCode() const override; + + RoomCommand GetRoomCommand() const override; + std::string GetCommandCName() const override; private: uint8_t numLights; - uint32_t segment; - - ZRoom* ptrRoom; -};
\ No newline at end of file + std::vector<LightInfo> lights; +}; diff --git a/ZAPD/ZRoom/Commands/SetLightingSettings.cpp b/ZAPD/ZRoom/Commands/SetLightingSettings.cpp index 53b4711..e677738 100644 --- a/ZAPD/ZRoom/Commands/SetLightingSettings.cpp +++ b/ZAPD/ZRoom/Commands/SetLightingSettings.cpp @@ -1,65 +1,50 @@ #include "SetLightingSettings.h" -#include "../../BitConverter.h" -#include "../../StringHelper.h" -#include "../../ZFile.h" -#include "../ZRoom.h" - -SetLightingSettings::SetLightingSettings(ZRoom* nZRoom, std::vector<uint8_t> rawData, - uint32_t rawDataIndex) - : ZRoomCommand(nZRoom, rawData, rawDataIndex) +#include "BitConverter.h" +#include "StringHelper.h" +#include "ZFile.h" +#include "ZRoom/ZRoom.h" + +SetLightingSettings::SetLightingSettings(ZFile* nParent) : ZRoomCommand(nParent) +{ +} + +void SetLightingSettings::ParseRawData() { - uint8_t numLights = rawData[rawDataIndex + 1]; - segmentOffset = GETSEGOFFSET(BitConverter::ToInt32BE(rawData, rawDataIndex + 4)); + ZRoomCommand::ParseRawData(); + uint8_t numLights = cmdArg1; - for (int32_t i = 0; i < numLights; i++) - settings.push_back(new LightingSettings(rawData, segmentOffset + (i * 22))); + for (int i = 0; i < numLights; i++) + settings.push_back(LightingSettings(parent->GetRawData(), segmentOffset + (i * 22))); +} - if (numLights > 0) +void SetLightingSettings::DeclareReferences(const std::string& prefix) +{ + if (settings.size() > 0) { std::string declaration = ""; - for (int32_t i = 0; i < numLights; i++) + for (size_t i = 0; i < settings.size(); i++) { - declaration += StringHelper::Sprintf( - "\t{ 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, " - "0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%04X, " - "0x%04X }, // 0x%06X", - settings[i]->ambientClrR, settings[i]->ambientClrG, settings[i]->ambientClrB, - settings[i]->diffuseClrA_R, settings[i]->diffuseClrA_G, settings[i]->diffuseClrA_B, - settings[i]->diffuseDirA_X, settings[i]->diffuseDirA_Y, settings[i]->diffuseDirA_Z, - settings[i]->diffuseClrB_R, settings[i]->diffuseClrB_G, settings[i]->diffuseClrB_B, - settings[i]->diffuseDirB_X, settings[i]->diffuseDirB_Y, settings[i]->diffuseDirB_Z, - settings[i]->fogClrR, settings[i]->fogClrG, settings[i]->fogClrB, settings[i]->unk, - settings[i]->drawDistance, segmentOffset + (i * 22)); - if (i + 1 < numLights) + declaration += StringHelper::Sprintf("\t{ %s }, // 0x%06X", + settings.at(i).GetBodySourceCode().c_str(), + segmentOffset + (i * 22)); + if (i + 1 < settings.size()) declaration += "\n"; } - zRoom->parent->AddDeclarationArray( - segmentOffset, DeclarationAlignment::None, DeclarationPadding::None, numLights * 22, - "LightSettings", - StringHelper::Sprintf("%sLightSettings_%06X", zRoom->GetName().c_str(), segmentOffset), - numLights, declaration); + parent->AddDeclarationArray( + segmentOffset, DeclarationAlignment::Align4, + settings.size() * settings.front().GetRawDataSize(), "LightSettings", + StringHelper::Sprintf("%sLightSettings0x%06X", prefix.c_str(), segmentOffset), + settings.size(), declaration); } } -SetLightingSettings::~SetLightingSettings() -{ - for (LightingSettings* setting : settings) - delete setting; -} - -std::string SetLightingSettings::GenerateSourceCodePass1(std::string roomName, uint32_t baseAddress) -{ - return StringHelper::Sprintf( - "%s %i, (u32)&%sLightSettings_%06X", - ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), settings.size(), - zRoom->GetName().c_str(), segmentOffset); -} - -std::string SetLightingSettings::GenerateSourceCodePass2(std::string roomName, uint32_t baseAddress) +std::string SetLightingSettings::GetBodySourceCode() const { - return ""; + std::string listName = parent->GetDeclarationPtrName(cmdArg2); + return StringHelper::Sprintf("SCENE_CMD_ENV_LIGHT_SETTINGS(%i, %s)", settings.size(), + listName.c_str()); } std::string SetLightingSettings::GetCommandCName() const @@ -67,45 +52,52 @@ std::string SetLightingSettings::GetCommandCName() const return "SCmdLightSettingList"; } -std::string SetLightingSettings::GenerateExterns() const -{ - return StringHelper::Sprintf("extern LightSettings %sLightSettings_%06X[];\n", - zRoom->GetName().c_str(), segmentOffset); -} - RoomCommand SetLightingSettings::GetRoomCommand() const { return RoomCommand::SetLightingSettings; } -LightingSettings::LightingSettings(std::vector<uint8_t> rawData, uint32_t rawDataIndex) +LightingSettings::LightingSettings(const std::vector<uint8_t>& rawData, uint32_t rawDataIndex) { - const uint8_t* data = rawData.data(); + ambientClrR = rawData.at(rawDataIndex + 0); + ambientClrG = rawData.at(rawDataIndex + 1); + ambientClrB = rawData.at(rawDataIndex + 2); - ambientClrR = data[rawDataIndex + 0]; - ambientClrG = data[rawDataIndex + 1]; - ambientClrB = data[rawDataIndex + 2]; + diffuseClrA_R = rawData.at(rawDataIndex + 3); + diffuseClrA_G = rawData.at(rawDataIndex + 4); + diffuseClrA_B = rawData.at(rawDataIndex + 5); - diffuseClrA_R = data[rawDataIndex + 3]; - diffuseClrA_G = data[rawDataIndex + 4]; - diffuseClrA_B = data[rawDataIndex + 5]; + diffuseDirA_X = rawData.at(rawDataIndex + 6); + diffuseDirA_Y = rawData.at(rawDataIndex + 7); + diffuseDirA_Z = rawData.at(rawDataIndex + 8); - diffuseDirA_X = data[rawDataIndex + 6]; - diffuseDirA_Y = data[rawDataIndex + 7]; - diffuseDirA_Z = data[rawDataIndex + 8]; + diffuseClrB_R = rawData.at(rawDataIndex + 9); + diffuseClrB_G = rawData.at(rawDataIndex + 10); + diffuseClrB_B = rawData.at(rawDataIndex + 11); - diffuseClrB_R = data[rawDataIndex + 9]; - diffuseClrB_G = data[rawDataIndex + 10]; - diffuseClrB_B = data[rawDataIndex + 11]; + diffuseDirB_X = rawData.at(rawDataIndex + 12); + diffuseDirB_Y = rawData.at(rawDataIndex + 13); + diffuseDirB_Z = rawData.at(rawDataIndex + 14); - diffuseDirB_X = data[rawDataIndex + 12]; - diffuseDirB_Y = data[rawDataIndex + 13]; - diffuseDirB_Z = data[rawDataIndex + 14]; + fogClrR = rawData.at(rawDataIndex + 15); + fogClrG = rawData.at(rawDataIndex + 16); + fogClrB = rawData.at(rawDataIndex + 17); - fogClrR = data[rawDataIndex + 15]; - fogClrG = data[rawDataIndex + 16]; - fogClrB = data[rawDataIndex + 17]; + unk = BitConverter::ToInt16BE(rawData, rawDataIndex + 18); + drawDistance = BitConverter::ToInt16BE(rawData, rawDataIndex + 20); +} - unk = BitConverter::ToInt16BE(data, rawDataIndex + 18); - drawDistance = BitConverter::ToInt16BE(data, rawDataIndex + 20); +std::string LightingSettings::GetBodySourceCode() const +{ + return StringHelper::Sprintf( + "0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, " + "0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%04X, 0x%04X", + ambientClrR, ambientClrG, ambientClrB, diffuseClrA_R, diffuseClrA_G, diffuseClrA_B, + diffuseDirA_X, diffuseDirA_Y, diffuseDirA_Z, diffuseClrB_R, diffuseClrB_G, diffuseClrB_B, + diffuseDirB_X, diffuseDirB_Y, diffuseDirB_Z, fogClrR, fogClrG, fogClrB, unk, drawDistance); +} + +size_t LightingSettings::GetRawDataSize() const +{ + return 0x16; } diff --git a/ZAPD/ZRoom/Commands/SetLightingSettings.h b/ZAPD/ZRoom/Commands/SetLightingSettings.h index 121e7ca..7717957 100644 --- a/ZAPD/ZRoom/Commands/SetLightingSettings.h +++ b/ZAPD/ZRoom/Commands/SetLightingSettings.h @@ -1,10 +1,17 @@ #pragma once -#include "../ZRoomCommand.h" +#include "ZRoom/ZRoomCommand.h" class LightingSettings { public: + LightingSettings(const std::vector<uint8_t>& rawData, uint32_t rawDataIndex); + + std::string GetBodySourceCode() const; + + size_t GetRawDataSize() const; + +protected: uint8_t ambientClrR, ambientClrG, ambientClrB; uint8_t diffuseClrA_R, diffuseClrA_G, diffuseClrA_B; uint8_t diffuseDirA_X, diffuseDirA_Y, diffuseDirA_Z; @@ -13,25 +20,21 @@ public: uint8_t fogClrR, fogClrG, fogClrB; uint16_t unk; uint16_t drawDistance; - - LightingSettings(std::vector<uint8_t> rawData, uint32_t rawDataIndex); }; class SetLightingSettings : public ZRoomCommand { public: - SetLightingSettings(ZRoom* nZRoom, std::vector<uint8_t> rawData, uint32_t rawDataIndex); - ~SetLightingSettings(); + SetLightingSettings(ZFile* nParent); - virtual std::string GenerateSourceCodePass1(std::string roomName, - uint32_t baseAddress) override; - virtual std::string GenerateSourceCodePass2(std::string roomName, - uint32_t baseAddress) override; - virtual std::string GetCommandCName() const override; - virtual std::string GenerateExterns() const override; - virtual RoomCommand GetRoomCommand() const override; + void ParseRawData() override; + void DeclareReferences(const std::string& prefix) override; + + std::string GetBodySourceCode() const override; + + RoomCommand GetRoomCommand() const override; + std::string GetCommandCName() const override; private: - uint32_t segmentOffset; - std::vector<LightingSettings*> settings; -};
\ No newline at end of file + std::vector<LightingSettings> settings; +}; diff --git a/ZAPD/ZRoom/Commands/SetMesh.cpp b/ZAPD/ZRoom/Commands/SetMesh.cpp index e8f522d..2635e7f 100644 --- a/ZAPD/ZRoom/Commands/SetMesh.cpp +++ b/ZAPD/ZRoom/Commands/SetMesh.cpp @@ -1,257 +1,76 @@ #include "SetMesh.h" #include <Globals.h> #include <Path.h> -#include "../../BitConverter.h" -#include "../../StringHelper.h" -#include "../../ZFile.h" -#include "../ZRoom.h" +#include "BitConverter.h" +#include "StringHelper.h" #include "ZBackground.h" +#include "ZFile.h" +#include "ZRoom/ZRoom.h" -using namespace std; +void GenDListDeclarations(ZRoom* zRoom, ZFile* parent, ZDisplayList* dList); -SetMesh::SetMesh(ZRoom* nZRoom, std::vector<uint8_t> rawData, uint32_t rawDataIndex, - int32_t segAddressOffset) - : ZRoomCommand(nZRoom, rawData, rawDataIndex) +SetMesh::SetMesh(ZFile* nParent) : ZRoomCommand(nParent) { - data = rawData[rawDataIndex + 1]; - segmentOffset = GETSEGOFFSET(BitConverter::ToInt32BE(rawData, rawDataIndex + 4)); +} - string declaration = ""; - meshHeaderType = rawData[segmentOffset + 0]; +void SetMesh::ParseRawData() +{ + ZRoomCommand::ParseRawData(); + auto& parentRawData = parent->GetRawData(); + meshHeaderType = parentRawData.at(segmentOffset); - if (meshHeaderType == 0) + switch (meshHeaderType) { - uint32_t dListStart = Seg2Filespace(BitConverter::ToInt32BE(rawData, segmentOffset + 4), - zRoom->parent->baseAddress); - uint32_t dListEnd = Seg2Filespace(BitConverter::ToInt32BE(rawData, segmentOffset + 8), - zRoom->parent->baseAddress); - - int8_t numEntries = rawData[segmentOffset + 1]; - uint32_t currentPtr = dListStart; - - // Hack for Syotes - for (int32_t i = 0; i < abs(segAddressOffset); i++) - { - rawData.erase(rawData.begin()); - segmentOffset--; - } - - if (numEntries > 0) - { - std::string polyGfxBody = ""; - std::string polyGfxType = ""; - int32_t polyGfxSize = 0; - - for (int32_t i = 0; i < numEntries; i++) - { - PolygonDlist polyGfxList(zRoom->GetName(), rawData, currentPtr, zRoom->parent, - zRoom); - if (polyGfxList.opaDList != nullptr) - { - GenDListDeclarations(rawData, polyGfxList.opaDList); - } - if (polyGfxList.xluDList != nullptr) - { - GenDListDeclarations(rawData, polyGfxList.xluDList); - } - polyGfxBody += polyGfxList.GetBodySourceCode(true); - polyGfxType = polyGfxList.GetSourceTypeName(); - polyGfxSize = polyGfxList.GetRawDataSize(); - - currentPtr += polyGfxList.GetRawDataSize(); - } - - zRoom->parent->AddDeclarationArray( - dListStart, DeclarationAlignment::Align4, numEntries * polyGfxSize, polyGfxType, - StringHelper::Sprintf("%s%s0x%06X", zRoom->GetName().c_str(), polyGfxType.c_str(), - dListStart), - numEntries, polyGfxBody); - } + case 0: + polyType = std::make_shared<PolygonType2>(parent, parentRawData, segmentOffset, zRoom); + break; - declaration = "\n "; - declaration += StringHelper::Sprintf("{ 0 }, 0x%02X, ", numEntries); - declaration += "\n "; + case 1: + polyType = std::make_shared<PolygonType1>(parent, parentRawData, segmentOffset, zRoom); + break; - std::string entriesStr = "NULL"; + case 2: + polyType = std::make_shared<PolygonType2>(parent, parentRawData, segmentOffset, zRoom); + break; - if (dListStart != 0) - { - entriesStr = zRoom->parent->GetDeclaration(dListStart)->varName; - } - declaration += StringHelper::Sprintf("%s, ", entriesStr.c_str()); - declaration += "\n "; - - if (dListEnd != 0) - declaration += StringHelper::Sprintf("%s + ARRAY_COUNT(%s), ", entriesStr.c_str(), - entriesStr.c_str()); - else - declaration += "NULL, "; - declaration += "\n"; - - zRoom->parent->AddDeclaration( - segmentOffset, DeclarationAlignment::Align16, 12, "MeshHeader0", - StringHelper::Sprintf("%sMeshHeader0x%06X", zRoom->GetName().c_str(), segmentOffset), - declaration); - - zRoom->parent->AddDeclaration(dListStart + (numEntries * 8), DeclarationAlignment::None, - DeclarationPadding::Pad16, 4, "static s32", "terminatorMaybe", - "0x01000000"); - } - else if (meshHeaderType == 1) - { - PolygonType1 polygon1(zRoom->GetName().c_str(), rawData, segmentOffset, zRoom->parent, - zRoom); - if (polygon1.polyGfxList.opaDList != nullptr) - { - GenDListDeclarations(rawData, polygon1.polyGfxList.opaDList); - } - if (polygon1.polyGfxList.xluDList != nullptr) - { - GenDListDeclarations(rawData, polygon1.polyGfxList.xluDList); - } - polygon1.DeclareAndGenerateOutputCode(); + default: + throw std::runtime_error(StringHelper::Sprintf("Error in SetMesh::ParseRawData\n" + "\t Unknown meshHeaderType: %i\n", + meshHeaderType)); } - else if (meshHeaderType == 2) - { - MeshHeader2* meshHeader2 = new MeshHeader2(); - meshHeader2->headerType = 2; - - meshHeader2->entries = vector<MeshEntry2*>(); - meshHeader2->dListStart = GETSEGOFFSET(BitConverter::ToInt32BE(rawData, segmentOffset + 4)); - meshHeader2->dListEnd = GETSEGOFFSET(BitConverter::ToInt32BE(rawData, segmentOffset + 8)); - - int8_t numEntries = rawData[segmentOffset + 1]; - uint32_t currentPtr = meshHeader2->dListStart; - - for (int32_t i = 0; i < numEntries; i++) - { - MeshEntry2* entry = new MeshEntry2(); - entry->playerXMax = BitConverter::ToInt16BE(rawData, currentPtr + 0); - entry->playerZMax = BitConverter::ToInt16BE(rawData, currentPtr + 2); - entry->playerXMin = BitConverter::ToInt16BE(rawData, currentPtr + 4); - entry->playerZMin = BitConverter::ToInt16BE(rawData, currentPtr + 6); - entry->opaqueDListAddr = GETSEGOFFSET(BitConverter::ToInt32BE(rawData, currentPtr + 8)); - entry->translucentDListAddr = - GETSEGOFFSET(BitConverter::ToInt32BE(rawData, currentPtr + 12)); - - if (entry->opaqueDListAddr != 0) - { - entry->opaqueDList = new ZDisplayList( - rawData, entry->opaqueDListAddr, - ZDisplayList::GetDListLength(rawData, entry->opaqueDListAddr, - Globals::Instance->game == ZGame::OOT_SW97 ? - DListType::F3DEX : - DListType::F3DZEX), - zRoom->parent); - entry->opaqueDList->scene = zRoom->scene; - GenDListDeclarations(rawData, entry->opaqueDList); - } - - if (entry->translucentDListAddr != 0) - { - entry->translucentDList = new ZDisplayList( - rawData, entry->translucentDListAddr, - ZDisplayList::GetDListLength(rawData, entry->translucentDListAddr, - Globals::Instance->game == ZGame::OOT_SW97 ? - DListType::F3DEX : - DListType::F3DZEX), - zRoom->parent); - entry->translucentDList->scene = zRoom->scene; - GenDListDeclarations(rawData, entry->translucentDList); - } - - meshHeader2->entries.push_back(entry); - - currentPtr += 16; - } - - declaration += StringHelper::Sprintf("{ 2 }, 0x%02lX, ", meshHeader2->entries.size()); - - if (meshHeader2->dListStart != 0) - declaration += StringHelper::Sprintf("(u32)&%sMeshDListEntry0x%06X, ", - zRoom->GetName().c_str(), meshHeader2->dListStart); - else - declaration += "0, "; - - if (meshHeader2->dListEnd != 0) - declaration += StringHelper::Sprintf( - "(u32)&(%sMeshDListEntry0x%06X) + sizeof(%sMeshDListEntry0x%06X)", - zRoom->GetName().c_str(), meshHeader2->dListStart, zRoom->GetName().c_str(), - meshHeader2->dListStart); - else - declaration += "0"; - declaration += "\n"; - - zRoom->parent->AddDeclaration( - segmentOffset, DeclarationAlignment::None, 12, "MeshHeader2", - StringHelper::Sprintf("%sMeshHeader0x%06X", zRoom->GetName().c_str(), segmentOffset), - declaration); - - declaration = ""; - - for (size_t i = 0; i < meshHeader2->entries.size(); i++) - { - declaration += StringHelper::Sprintf( - " { %i, %i, %i, %i, ", meshHeader2->entries[i]->playerXMax, - meshHeader2->entries[i]->playerZMax, meshHeader2->entries[i]->playerXMin, - meshHeader2->entries[i]->playerZMin); - - if (meshHeader2->entries[i]->opaqueDListAddr != 0) - declaration += StringHelper::Sprintf("(u32)%sDL_%06X, ", zRoom->GetName().c_str(), - meshHeader2->entries[i]->opaqueDListAddr); - else - declaration += "0, "; - - if (meshHeader2->entries[i]->translucentDListAddr != 0) - declaration += - StringHelper::Sprintf("(u32)%sDL_%06X },\n", zRoom->GetName().c_str(), - meshHeader2->entries[i]->translucentDListAddr); - else - declaration += "0 },\n"; - } - - zRoom->parent->AddDeclarationArray( - meshHeader2->dListStart, DeclarationAlignment::None, DeclarationPadding::None, - (meshHeader2->entries.size() * 16) + 0, "MeshEntry2", - StringHelper::Sprintf("%sMeshDListEntry0x%06X", zRoom->GetName().c_str(), - meshHeader2->dListStart, meshHeader2->entries.size()), - meshHeader2->entries.size(), declaration); - - zRoom->parent->AddDeclaration(meshHeader2->dListStart + (meshHeader2->entries.size() * 16), - DeclarationAlignment::None, DeclarationPadding::Pad16, 4, - "static s32", "terminatorMaybe", "0x01000000"); - - meshHeader = meshHeader2; - } + polyType->ParseRawData(); } -SetMesh::~SetMesh() +void SetMesh::DeclareReferences(const std::string& prefix) { - if (meshHeader != nullptr) - { - delete meshHeader; - meshHeader = nullptr; - } + polyType->SetName(polyType->GetDefaultName(prefix)); + polyType->DeclareReferences(prefix); + polyType->DeclareAndGenerateOutputCode(prefix); } -void SetMesh::GenDListDeclarations(std::vector<uint8_t> rawData, ZDisplayList* dList) +void GenDListDeclarations(ZRoom* zRoom, ZFile* parent, ZDisplayList* dList) { - string srcVarName = + if (dList == nullptr) + { + return; + } + std::string srcVarName = StringHelper::Sprintf("%s%s", zRoom->GetName().c_str(), dList->GetName().c_str()); dList->SetName(srcVarName); - string sourceOutput = dList->GetSourceOutputCode(zRoom->GetName()); + dList->scene = zRoom->scene; + std::string sourceOutput = dList->GetSourceOutputCode(zRoom->GetName()); for (ZDisplayList* otherDList : dList->otherDLists) - GenDListDeclarations(rawData, otherDList); + GenDListDeclarations(zRoom, parent, otherDList); - for (pair<uint32_t, string> vtxEntry : dList->vtxDeclarations) + for (const auto& vtxEntry : dList->vtxDeclarations) { - DeclarationAlignment alignment = DeclarationAlignment::Align8; + DeclarationAlignment alignment = DeclarationAlignment::Align4; if (Globals::Instance->game == ZGame::MM_RETAIL) alignment = DeclarationAlignment::None; - zRoom->parent->AddDeclarationArray( + parent->AddDeclarationArray( vtxEntry.first, alignment, dList->vertices[vtxEntry.first].size() * 16, "static Vtx", StringHelper::Sprintf("%sVtx_%06X", zRoom->GetName().c_str(), vtxEntry.first), dList->vertices[vtxEntry.first].size(), vtxEntry.second); @@ -260,13 +79,10 @@ void SetMesh::GenDListDeclarations(std::vector<uint8_t> rawData, ZDisplayList* d std::string SetMesh::GenDListExterns(ZDisplayList* dList) { - string sourceOutput = ""; + std::string sourceOutput = ""; - if (Globals::Instance->includeFilePrefix) - sourceOutput += StringHelper::Sprintf("extern Gfx %sDL_%06X[];\n", zRoom->GetName().c_str(), - dList->GetRawDataIndex()); - else - sourceOutput += StringHelper::Sprintf("extern Gfx DL_%06X[];\n", dList->GetRawDataIndex()); + sourceOutput += StringHelper::Sprintf("extern Gfx %sDL_%06X[];\n", zRoom->GetName().c_str(), + dList->GetRawDataIndex()); for (ZDisplayList* otherDList : dList->otherDLists) sourceOutput += GenDListExterns(otherDList); @@ -276,22 +92,10 @@ std::string SetMesh::GenDListExterns(ZDisplayList* dList) return sourceOutput; } -string SetMesh::GenerateSourceCodePass1(string roomName, uint32_t baseAddress) +std::string SetMesh::GetBodySourceCode() const { - string sourceOutput = ""; - - Declaration* decl = zRoom->parent->GetDeclaration(segmentOffset); - - sourceOutput += StringHelper::Sprintf( - "%s %i, &%s", ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), data, - decl->varName.c_str()); - - return sourceOutput; -} - -string SetMesh::GenerateExterns() const -{ - return ""; + std::string list = parent->GetDeclarationPtrName(cmdArg2); + return StringHelper::Sprintf("SCENE_CMD_MESH(%s)", list.c_str()); } size_t SetMesh::GetRawDataSize() const @@ -299,7 +103,7 @@ size_t SetMesh::GetRawDataSize() const return ZRoomCommand::GetRawDataSize(); } -string SetMesh::GetCommandCName() const +std::string SetMesh::GetCommandCName() const { return "SCmdMesh"; } @@ -315,20 +119,36 @@ PolygonDlist::PolygonDlist(const std::string& prefix, const std::vector<uint8_t> rawData.assign(nRawData.begin(), nRawData.end()); rawDataIndex = nRawDataIndex; parent = nParent; - room = nRoom; + zRoom = nRoom; name = GetDefaultName(prefix.c_str(), rawDataIndex); +} - ParseRawData(); +void PolygonDlist::ParseRawData() +{ + switch (polyType) + { + case 2: + x = BitConverter::ToInt16BE(rawData, rawDataIndex + 0); + y = BitConverter::ToInt16BE(rawData, rawDataIndex + 2); + z = BitConverter::ToInt16BE(rawData, rawDataIndex + 4); + unk_06 = BitConverter::ToInt16BE(rawData, rawDataIndex + 6); - opaDList = MakeDlist(opa, prefix); - xluDList = MakeDlist(xlu, prefix); + opa = BitConverter::ToUInt32BE(rawData, rawDataIndex + 8); + xlu = BitConverter::ToUInt32BE(rawData, rawDataIndex + 12); + break; + + default: + opa = BitConverter::ToUInt32BE(rawData, rawDataIndex); + xlu = BitConverter::ToUInt32BE(rawData, rawDataIndex + 4); + break; + } } -void PolygonDlist::ParseRawData() +void PolygonDlist::DeclareReferences(const std::string& prefix) { - opa = BitConverter::ToUInt32BE(rawData, rawDataIndex); - xlu = BitConverter::ToUInt32BE(rawData, rawDataIndex + 4); + opaDList = MakeDlist(opa, prefix); + xluDList = MakeDlist(xlu, prefix); } ZDisplayList* PolygonDlist::MakeDlist(segptr_t ptr, const std::string& prefix) @@ -344,18 +164,26 @@ ZDisplayList* PolygonDlist::MakeDlist(segptr_t ptr, const std::string& prefix) rawData, dlistAddress, Globals::Instance->game == ZGame::OOT_SW97 ? DListType::F3DEX : DListType::F3DZEX); ZDisplayList* dlist = new ZDisplayList(rawData, dlistAddress, dlistLength, parent); - - string dListStr = StringHelper::Sprintf("%sPolygonDlist_%06X", prefix.c_str(), dlistAddress); - dlist->SetName(dListStr); - dlist->scene = room->scene; - dlist->GetSourceOutputCode(prefix); + GenDListDeclarations(zRoom, parent, dlist); return dlist; } -size_t PolygonDlist::GetRawDataSize() +size_t PolygonDlist::GetRawDataSize() const { - return 0x08; + switch (polyType) + { + case 2: + return 0x10; + + default: + return 0x08; + } +} + +void PolygonDlist::SetPolyType(uint8_t nPolyType) +{ + polyType = nPolyType; } void PolygonDlist::DeclareVar(const std::string& prefix, const std::string& bodyStr) @@ -372,53 +200,32 @@ void PolygonDlist::DeclareVar(const std::string& prefix, const std::string& body std::string PolygonDlist::GetBodySourceCode(bool arrayElement) { std::string bodyStr = ""; - std::string opaStr = "NULL"; - std::string xluStr = "NULL"; + std::string opaStr = parent->GetDeclarationPtrName(opa); + std::string xluStr = parent->GetDeclarationPtrName(xlu); if (arrayElement) { - bodyStr += " { \n "; + bodyStr += " { "; } else { - bodyStr += "\n"; + bodyStr += "\n "; } - if (opa != 0) + if (polyType == 2) { - Declaration* decl = parent->GetDeclaration(Seg2Filespace(opa, parent->baseAddress)); - if (decl != nullptr) - { - opaStr = decl->varName; - } - else - { - opaStr = StringHelper::Sprintf("0x%08X", opa); - } - } - if (xlu != 0) - { - Declaration* decl = parent->GetDeclaration(Seg2Filespace(xlu, parent->baseAddress)); - if (decl != nullptr) - { - xluStr = decl->varName; - } - else - { - xluStr = StringHelper::Sprintf("0x%08X", xlu); - } + bodyStr += StringHelper::Sprintf("{ %6i, %6i, %6i }, %6i, ", x, y, z, unk_06); } - bodyStr += StringHelper::Sprintf(" %s, \n", opaStr.c_str()); + bodyStr += StringHelper::Sprintf("%s, ", opaStr.c_str()); + bodyStr += StringHelper::Sprintf("%s", xluStr.c_str()); + if (arrayElement) { - bodyStr += " "; + bodyStr += " },"; } - - bodyStr += StringHelper::Sprintf(" %s, \n", xluStr.c_str()); - - if (arrayElement) + else { - bodyStr += " },"; + bodyStr += "\n"; } return bodyStr; @@ -446,7 +253,14 @@ std::string PolygonDlist::GetDefaultName(const std::string& prefix, uint32_t add std::string PolygonDlist::GetSourceTypeName() { - return "PolygonDlist"; + switch (polyType) + { + case 2: + return "PolygonDlist2"; + + default: + return "PolygonDlist"; + } } std::string PolygonDlist::GetName() @@ -510,12 +324,12 @@ size_t BgImage::GetRawDataSize() return 0x1C; } -std::string BgImage::GetBodySourceCode(bool arrayElement) +std::string BgImage::GetBodySourceCode(bool arrayElement) const { - std::string bodyStr = ""; + std::string bodyStr = " "; if (arrayElement) { - bodyStr += " { \n "; + bodyStr += "{ \n "; } if (!isSubStruct) @@ -529,21 +343,7 @@ std::string BgImage::GetBodySourceCode(bool arrayElement) } } - std::string backgroundName = "NULL"; - if (source != 0) - { - uint32_t address = Seg2Filespace(source, parent->baseAddress); - Declaration* decl = parent->GetDeclaration(address); - - if (decl == nullptr) - { - backgroundName += StringHelper::Sprintf("0x%08X, ", source); - } - else - { - backgroundName = decl->varName; - } - } + std::string backgroundName = parent->GetDeclarationPtrName(source); bodyStr += StringHelper::Sprintf("%s, ", backgroundName.c_str()); bodyStr += "\n "; if (arrayElement) @@ -581,6 +381,10 @@ std::string BgImage::GetBodySourceCode(bool arrayElement) { bodyStr += " \n }, "; } + else + { + bodyStr += "\n"; + } return bodyStr; } @@ -600,29 +404,109 @@ std::string BgImage::GetName() return name; } -PolygonType1::PolygonType1(const std::string& prefix, const std::vector<uint8_t>& nRawData, - uint32_t nRawDataIndex, ZFile* nParent, ZRoom* nRoom) +/* PolygonType section */ + +PolygonTypeBase::PolygonTypeBase(ZFile* nParent, const std::vector<uint8_t>& nRawData, + uint32_t nRawDataIndex, ZRoom* nRoom) + : rawData{nRawData}, rawDataIndex{nRawDataIndex}, parent{nParent}, zRoom{nRoom} { - rawData.assign(nRawData.begin(), nRawData.end()); - rawDataIndex = nRawDataIndex; - parent = nParent; + type = BitConverter::ToUInt8BE(rawData, rawDataIndex); +} - name = GetDefaultName(prefix.c_str(), rawDataIndex); +void PolygonTypeBase::DeclareVar(const std::string& prefix, const std::string& bodyStr) +{ + std::string auxName = name; + if (name == "") + auxName = GetDefaultName(prefix); - ParseRawData(); + parent->AddDeclaration(rawDataIndex, DeclarationAlignment::Align4, GetRawDataSize(), + GetSourceTypeName(), auxName, bodyStr); +} + +void PolygonTypeBase::DeclareAndGenerateOutputCode(const std::string& prefix) +{ + std::string bodyStr = GetBodySourceCode(); + + Declaration* decl = parent->GetDeclaration(rawDataIndex); + if (decl == nullptr) + { + DeclareVar(prefix, bodyStr); + } + else + { + decl->text = bodyStr; + } +} + +std::string PolygonTypeBase::GetSourceTypeName() const +{ + switch (type) + { + case 2: + return "PolygonType2"; + + case 1: + return "PolygonType1"; + + default: + return "PolygonType0"; + } +} + +std::string PolygonTypeBase::GetName() const +{ + return name; +} + +void PolygonTypeBase::SetName(const std::string& newName) +{ + name = newName; +} + +std::string PolygonTypeBase::GetDefaultName(const std::string& prefix) const +{ + return StringHelper::Sprintf("%s%s_%06X", prefix.c_str(), GetSourceTypeName().c_str(), + rawDataIndex); +} + +PolygonType1::PolygonType1(ZFile* nParent, const std::vector<uint8_t>& nRawData, + uint32_t nRawDataIndex, ZRoom* nRoom) + : PolygonTypeBase(nParent, nRawData, nRawDataIndex, nRoom) +{ +} + +void PolygonType1::ParseRawData() +{ + format = BitConverter::ToUInt8BE(rawData, rawDataIndex + 0x01); + dlist = BitConverter::ToUInt32BE(rawData, rawDataIndex + 0x04); + + if (format == 2) + { + count = BitConverter::ToUInt8BE(rawData, rawDataIndex + 0x08); + list = BitConverter::ToUInt32BE(rawData, rawDataIndex + 0x0C); + } if (dlist != 0) { - polyGfxList = - PolygonDlist(prefix, rawData, Seg2Filespace(dlist, parent->baseAddress), parent, nRoom); + PolygonDlist polyGfxList(zRoom->GetName(), rawData, + Seg2Filespace(dlist, parent->baseAddress), parent, zRoom); + polyGfxList.SetPolyType(type); + polyGfxList.ParseRawData(); + polyGfxList.DeclareReferences(zRoom->GetName()); + polyDLists.push_back(polyGfxList); } +} + +void PolygonType1::DeclareReferences(const std::string& prefix) +{ + polyDLists.at(0).DeclareAndGenerateOutputCode(); uint32_t listAddress; std::string bgImageArrayBody = ""; switch (format) { case 1: - single = BgImage(true, prefix, nRawData, nRawDataIndex + 0x08, parent); + single = BgImage(true, prefix, rawData, rawDataIndex + 0x08, parent); break; case 2: @@ -659,20 +543,7 @@ PolygonType1::PolygonType1(const std::string& prefix, const std::vector<uint8_t> } } -void PolygonType1::ParseRawData() -{ - type = BitConverter::ToUInt8BE(rawData, rawDataIndex); - format = BitConverter::ToUInt8BE(rawData, rawDataIndex + 0x01); - dlist = BitConverter::ToUInt32BE(rawData, rawDataIndex + 0x04); - - if (format == 2) - { - count = BitConverter::ToUInt8BE(rawData, rawDataIndex + 0x08); - list = BitConverter::ToUInt32BE(rawData, rawDataIndex + 0x0C); - } -} - -size_t PolygonType1::GetRawDataSize() +size_t PolygonType1::GetRawDataSize() const { switch (format) { @@ -685,40 +556,14 @@ size_t PolygonType1::GetRawDataSize() return 0x20; } -void PolygonType1::DeclareVar(const std::string& prefix, const std::string& bodyStr) -{ - std::string auxName = name; - if (name == "") - { - auxName = GetDefaultName(prefix, rawDataIndex); - } - parent->AddDeclaration(rawDataIndex, DeclarationAlignment::Align4, GetRawDataSize(), - GetSourceTypeName(), auxName, bodyStr); -} - -std::string PolygonType1::GetBodySourceCode() +std::string PolygonType1::GetBodySourceCode() const { std::string bodyStr = "\n "; bodyStr += "{ "; bodyStr += StringHelper::Sprintf("%i, %i, ", type, format); - std::string dlistStr = "NULL"; - if (dlist != 0) - { - uint32_t entryRecordAddress = Seg2Filespace(dlist, parent->baseAddress); - Declaration* decl = parent->GetDeclaration(entryRecordAddress); - - if (decl == nullptr) - { - polyGfxList.DeclareAndGenerateOutputCode(); - dlistStr = "&" + polyGfxList.GetName(); - } - else - { - dlistStr = "&" + decl->varName; - } - } + std::string dlistStr = parent->GetDeclarationPtrName(dlist); bodyStr += StringHelper::Sprintf("%s, ", dlistStr.c_str()); bodyStr += "}, \n"; @@ -727,22 +572,10 @@ std::string PolygonType1::GetBodySourceCode() switch (format) { case 1: - bodyStr += " " + single.GetBodySourceCode(false) + "\n"; + bodyStr += single.GetBodySourceCode(false); break; case 2: - if (list != 0) - { - uint32_t listAddress = Seg2Filespace(list, parent->baseAddress); - Declaration* decl = parent->GetDeclaration(listAddress); - if (decl != nullptr) - { - listStr = decl->varName; - } - else - { - listStr = StringHelper::Sprintf("0x%08X", list); - } - } + listStr = parent->GetDeclarationPtrName(list); bodyStr += StringHelper::Sprintf(" %i, %s, \n", count, listStr.c_str()); break; @@ -754,41 +587,85 @@ std::string PolygonType1::GetBodySourceCode() return bodyStr; } -void PolygonType1::DeclareAndGenerateOutputCode() +std::string PolygonType1::GetSourceTypeName() const { - std::string bodyStr = GetBodySourceCode(); - - Declaration* decl = parent->GetDeclaration(rawDataIndex); - if (decl == nullptr) - { - DeclareVar("", bodyStr); - } - else + switch (format) { - decl->text = bodyStr; + case 1: + return "MeshHeader1Single"; + + case 2: + return "MeshHeader1Multi"; } + return "ERROR"; + // return "PolygonType1"; } -std::string PolygonType1::GetDefaultName(const std::string& prefix, uint32_t address) +PolygonType2::PolygonType2(ZFile* nParent, const std::vector<uint8_t>& nRawData, + uint32_t nRawDataIndex, ZRoom* nRoom) + : PolygonTypeBase(nParent, nRawData, nRawDataIndex, nRoom) { - return StringHelper::Sprintf("%sPolygonType1_%06X", prefix.c_str(), address); } -std::string PolygonType1::GetSourceTypeName() +void PolygonType2::ParseRawData() { - switch (format) + num = BitConverter::ToUInt8BE(rawData, rawDataIndex + 0x01); + + start = BitConverter::ToUInt32BE(rawData, rawDataIndex + 0x04); + end = BitConverter::ToUInt32BE(rawData, rawDataIndex + 0x08); + + uint32_t currentPtr = GETSEGOFFSET(start); + for (size_t i = 0; i < num; i++) { - case 1: - return "MeshHeader1Single"; + PolygonDlist entry(zRoom->GetName(), rawData, currentPtr, parent, zRoom); + entry.SetPolyType(type); + entry.ParseRawData(); + entry.DeclareReferences(zRoom->GetName()); + polyDLists.push_back(entry); + currentPtr += entry.GetRawDataSize(); + } +} - case 2: - return "MeshHeader1Multi"; +void PolygonType2::DeclareReferences(const std::string& prefix) +{ + if (num > 0) + { + std::string declaration = ""; + + for (size_t i = 0; i < polyDLists.size(); i++) + { + declaration += polyDLists.at(i).GetBodySourceCode(true); + if (i + 1 < polyDLists.size()) + declaration += "\n"; + } + + std::string polyDlistType = polyDLists.at(0).GetSourceTypeName(); + std::string polyDListName = ""; + polyDListName = StringHelper::Sprintf("%s%s_%06X", prefix.c_str(), polyDlistType.c_str(), + GETSEGOFFSET(start)); + + parent->AddDeclarationArray(GETSEGOFFSET(start), DeclarationAlignment::Align4, + polyDLists.size() * polyDLists.at(0).GetRawDataSize(), + polyDlistType, polyDListName, polyDLists.size(), declaration); } - return "ERROR"; - // return "PolygonType1"; + + parent->AddDeclaration(GETSEGOFFSET(end), DeclarationAlignment::Align4, + DeclarationPadding::Pad16, 4, "static s32", "terminatorMaybe", + "0x01000000"); } -std::string PolygonType1::GetName() +std::string PolygonType2::GetBodySourceCode() const { - return name; + std::string listName = parent->GetDeclarationPtrName(start); + + std::string body = StringHelper::Sprintf("\n %i, %i,\n", type, polyDLists.size()); + body += StringHelper::Sprintf(" %s,\n", listName.c_str()); + body += + StringHelper::Sprintf(" %s + ARRAY_COUNTU(%s)\n", listName.c_str(), listName.c_str()); + return body; +} + +size_t PolygonType2::GetRawDataSize() const +{ + return 0x0C; } diff --git a/ZAPD/ZRoom/Commands/SetMesh.h b/ZAPD/ZRoom/Commands/SetMesh.h index b9648a1..fb99dbd 100644 --- a/ZAPD/ZRoom/Commands/SetMesh.h +++ b/ZAPD/ZRoom/Commands/SetMesh.h @@ -1,57 +1,22 @@ #pragma once -#include "../../ZDisplayList.h" -#include "../ZRoomCommand.h" +#include <memory> #include "ZBackground.h" - -class MeshHeaderBase -{ -public: - int8_t headerType; // 0x00 -}; - -class MeshEntry2 -{ -public: - int16_t playerXMax, playerZMax; - int16_t playerXMin, playerZMin; - - int32_t opaqueDListAddr; - int32_t translucentDListAddr; - - ZDisplayList* opaqueDList; - ZDisplayList* translucentDList; -}; - -class MeshHeader2 : public MeshHeaderBase -{ -public: - std::vector<MeshEntry2*> entries; - uint32_t dListStart; - uint32_t dListEnd; -}; +#include "ZDisplayList.h" +#include "ZRoom/ZRoomCommand.h" class PolygonDlist { -protected: - segptr_t opa = 0; // Gfx* - segptr_t xlu = 0; // Gfx* - - std::vector<uint8_t> rawData; - uint32_t rawDataIndex; - ZFile* parent; - ZRoom* room; - std::string name; - - void ParseRawData(); - ZDisplayList* MakeDlist(segptr_t ptr, const std::string& prefix); - public: PolygonDlist() = default; PolygonDlist(const std::string& prefix, const std::vector<uint8_t>& nRawData, uint32_t nRawDataIndex, ZFile* nParent, ZRoom* nRoom); - size_t GetRawDataSize(); + void ParseRawData(); + void DeclareReferences(const std::string& prefix); + + size_t GetRawDataSize() const; + void SetPolyType(uint8_t nPolyType); void DeclareVar(const std::string& prefix, const std::string& bodyStr); @@ -62,8 +27,25 @@ public: std::string GetSourceTypeName(); std::string GetName(); +protected: + int16_t x, y, z; // polyType == 2 + int16_t unk_06; // polyType == 2 + + segptr_t opa = 0; // Gfx* + segptr_t xlu = 0; // Gfx* + + uint8_t polyType; + ZDisplayList* opaDList = nullptr; // Gfx* ZDisplayList* xluDList = nullptr; // Gfx* + + std::vector<uint8_t> rawData; + uint32_t rawDataIndex; + ZFile* parent; + ZRoom* zRoom; + std::string name; + + ZDisplayList* MakeDlist(segptr_t ptr, const std::string& prefix); }; class BgImage @@ -99,17 +81,49 @@ public: static size_t GetRawDataSize(); - std::string GetBodySourceCode(bool arrayElement); + std::string GetBodySourceCode(bool arrayElement) const; static std::string GetDefaultName(const std::string& prefix, uint32_t address); static std::string GetSourceTypeName(); std::string GetName(); }; -class PolygonType1 +class PolygonTypeBase { +public: + PolygonTypeBase(ZFile* nParent, const std::vector<uint8_t>& nRawData, uint32_t nRawDataIndex, + ZRoom* nRoom); + + virtual void ParseRawData() = 0; + virtual void DeclareReferences(const std::string& prefix) = 0; + + virtual std::string GetBodySourceCode() const = 0; + void DeclareVar(const std::string& prefix, const std::string& bodyStr); + void DeclareAndGenerateOutputCode(const std::string& prefix); + + virtual std::string GetSourceTypeName() const; + + std::string GetName() const; + void SetName(const std::string& newName); + virtual size_t GetRawDataSize() const = 0; + + std::string GetDefaultName(const std::string& prefix) const; + protected: uint8_t type; + + std::vector<PolygonDlist> polyDLists; + + std::vector<uint8_t> rawData; + uint32_t rawDataIndex; + ZFile* parent; + ZRoom* zRoom; + std::string name; +}; + +class PolygonType1 : public PolygonTypeBase +{ +protected: uint8_t format; segptr_t dlist; @@ -121,51 +135,56 @@ protected: segptr_t list; // BgImage* std::vector<BgImage> multiList; - std::vector<uint8_t> rawData; - uint32_t rawDataIndex; - ZFile* parent; - std::string name; +public: + PolygonType1(ZFile* nParent, const std::vector<uint8_t>& nRawData, uint32_t nRawDataIndex, + ZRoom* nRoom); - void ParseRawData(); + void ParseRawData() override; + void DeclareReferences(const std::string& prefix) override; -public: - PolygonType1(const std::string& prefix, const std::vector<uint8_t>& nRawData, - uint32_t nRawDataIndex, ZFile* nParent, ZRoom* nRoom); + std::string GetBodySourceCode() const override; - size_t GetRawDataSize(); + std::string GetSourceTypeName() const override; - void DeclareVar(const std::string& prefix, const std::string& bodyStr); + size_t GetRawDataSize() const override; +}; - std::string GetBodySourceCode(); - void DeclareAndGenerateOutputCode(); +class PolygonType2 : public PolygonTypeBase +{ +public: + PolygonType2(ZFile* nParent, const std::vector<uint8_t>& nRawData, uint32_t nRawDataIndex, + ZRoom* nRoom); - static std::string GetDefaultName(const std::string& prefix, uint32_t address); - std::string GetSourceTypeName(); - std::string GetName(); + void ParseRawData() override; + void DeclareReferences(const std::string& prefix) override; - PolygonDlist polyGfxList; + std::string GetBodySourceCode() const override; + + size_t GetRawDataSize() const override; + +protected: + uint8_t num; + segptr_t start; + segptr_t end; }; class SetMesh : public ZRoomCommand { public: - SetMesh(ZRoom* nZRoom, std::vector<uint8_t> rawData, uint32_t rawDataIndex, - int32_t segAddressOffset); - ~SetMesh(); + SetMesh(ZFile* nParent); + + void ParseRawData() override; + void DeclareReferences(const std::string& prefix) override; + + std::string GetBodySourceCode() const override; - virtual std::string GenerateSourceCodePass1(std::string roomName, - uint32_t baseAddress) override; - virtual std::string GenerateExterns() const override; - virtual std::string GetCommandCName() const override; - virtual RoomCommand GetRoomCommand() const override; - virtual size_t GetRawDataSize() const override; + RoomCommand GetRoomCommand() const override; + size_t GetRawDataSize() const override; + std::string GetCommandCName() const override; private: - MeshHeaderBase* meshHeader = nullptr; - uint32_t segmentOffset; - uint8_t data; uint8_t meshHeaderType; + std::shared_ptr<PolygonTypeBase> polyType; - void GenDListDeclarations(std::vector<uint8_t> rawData, ZDisplayList* dList); std::string GenDListExterns(ZDisplayList* dList); }; diff --git a/ZAPD/ZRoom/Commands/SetMinimapChests.cpp b/ZAPD/ZRoom/Commands/SetMinimapChests.cpp index abaff62..bd9c8a0 100644 --- a/ZAPD/ZRoom/Commands/SetMinimapChests.cpp +++ b/ZAPD/ZRoom/Commands/SetMinimapChests.cpp @@ -1,78 +1,57 @@ #include "SetMinimapChests.h" -#include "../../BitConverter.h" -#include "../../Globals.h" -#include "../../StringHelper.h" -#include "../../ZFile.h" -#include "../ZRoom.h" - -SetMinimapChests::SetMinimapChests(ZRoom* nZRoom, std::vector<uint8_t> rawData, - uint32_t rawDataIndex) - : ZRoomCommand(nZRoom, rawData, rawDataIndex) + +#include "BitConverter.h" +#include "Globals.h" +#include "StringHelper.h" +#include "ZFile.h" +#include "ZRoom/ZRoom.h" + +SetMinimapChests::SetMinimapChests(ZFile* nParent) : ZRoomCommand(nParent) +{ +} + +void SetMinimapChests::ParseRawData() { - int32_t numChests = rawData[rawDataIndex + 1]; - segmentOffset = GETSEGOFFSET(BitConverter::ToInt32BE(rawData, rawDataIndex + 4)); + ZRoomCommand::ParseRawData(); + int numChests = cmdArg1; int32_t currentPtr = segmentOffset; for (int32_t i = 0; i < numChests; i++) { - MinimapChest* chest = new MinimapChest(rawData, currentPtr); + MinimapChest chest(parent->GetRawData(), currentPtr); chests.push_back(chest); currentPtr += 10; } } -SetMinimapChests::~SetMinimapChests() -{ - for (MinimapChest* chest : chests) - delete chest; -} - -std::string SetMinimapChests::GenerateSourceCodePass1(std::string roomName, uint32_t baseAddress) +void SetMinimapChests::DeclareReferences(const std::string& prefix) { - return std::string(); -} + std::string declaration = ""; -std::string SetMinimapChests::GenerateSourceCodePass2(std::string roomName, uint32_t baseAddress) -{ - std::string sourceOutput = ""; + size_t index = 0; + for (const auto& chest : chests) + { + declaration += StringHelper::Sprintf(" { %s },", chest.GetBodySourceCode().c_str()); - sourceOutput += - StringHelper::Sprintf("%s 0x%02X, (u32)%sMinimapChests0x%06X };", - ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), - chests.size(), roomName.c_str(), segmentOffset); + if (index < chests.size() - 1) + declaration += "\n"; - { - std::string declaration = ""; - - size_t index = 0; - for (MinimapChest* chest : chests) - { - declaration += StringHelper::Sprintf(" { 0x%04X, 0x%04X, 0x%04X, 0x%04X, 0x%04X },", - chest->unk0, chest->unk2, chest->unk4, chest->unk6, - chest->unk8); - - if (index < chests.size() - 1) - declaration += "\n"; - - index++; - } - - zRoom->parent->AddDeclarationArray( - segmentOffset, DeclarationAlignment::None, DeclarationPadding::None, chests.size() * 10, - "MinimapChest", - StringHelper::Sprintf("%sMinimapChests0x%06X", roomName.c_str(), segmentOffset), - chests.size(), declaration); + index++; } - return sourceOutput; + parent->AddDeclarationArray( + segmentOffset, DeclarationAlignment::None, chests.size() * 10, "MinimapChest", + StringHelper::Sprintf("%sMinimapChests0x%06X", prefix.c_str(), segmentOffset), + chests.size(), declaration); } -std::string SetMinimapChests::GenerateExterns() const +std::string SetMinimapChests::GetBodySourceCode() const { - return StringHelper::Sprintf("extern MinimapChest %sMinimapChests0x%06X[%i];\n", - zRoom->GetName().c_str(), segmentOffset, chests.size()); + std::string listName = parent->GetDeclarationPtrName(cmdArg2); + return StringHelper::Sprintf("SCENE_CMD_MINIMAP_COMPASS_ICON_INFO(0x%02X, %s)", chests.size(), + listName.c_str()); } std::string SetMinimapChests::GetCommandCName() const @@ -90,11 +69,17 @@ size_t SetMinimapChests::GetRawDataSize() const return ZRoomCommand::GetRawDataSize() + (chests.size() * 10); } -MinimapChest::MinimapChest(std::vector<uint8_t> rawData, uint32_t rawDataIndex) +MinimapChest::MinimapChest(const std::vector<uint8_t>& rawData, uint32_t rawDataIndex) : unk0(BitConverter::ToUInt16BE(rawData, rawDataIndex + 0)), unk2(BitConverter::ToUInt16BE(rawData, rawDataIndex + 2)), unk4(BitConverter::ToUInt16BE(rawData, rawDataIndex + 4)), unk6(BitConverter::ToUInt16BE(rawData, rawDataIndex + 6)), unk8(BitConverter::ToUInt16BE(rawData, rawDataIndex + 8)) { -}
\ No newline at end of file +} + +std::string MinimapChest::GetBodySourceCode() const +{ + return StringHelper::Sprintf("0x%04X, 0x%04X, 0x%04X, 0x%04X, 0x%04X", unk0, unk2, unk4, unk6, + unk8); +} diff --git a/ZAPD/ZRoom/Commands/SetMinimapChests.h b/ZAPD/ZRoom/Commands/SetMinimapChests.h index 664bfce..b18534d 100644 --- a/ZAPD/ZRoom/Commands/SetMinimapChests.h +++ b/ZAPD/ZRoom/Commands/SetMinimapChests.h @@ -1,33 +1,36 @@ #pragma once -#include "../ZRoomCommand.h" +#include "ZRoom/ZRoomCommand.h" class MinimapChest { public: + MinimapChest(const std::vector<uint8_t>& rawData, uint32_t rawDataIndex); + + std::string GetBodySourceCode() const; + +protected: uint16_t unk0; uint16_t unk2; uint16_t unk4; uint16_t unk6; uint16_t unk8; - - MinimapChest(std::vector<uint8_t> rawData, uint32_t rawDataIndex); }; class SetMinimapChests : public ZRoomCommand { public: - SetMinimapChests(ZRoom* nZRoom, std::vector<uint8_t> rawData, uint32_t rawDataIndex); - ~SetMinimapChests(); + SetMinimapChests(ZFile* nParent); + + void ParseRawData() override; + void DeclareReferences(const std::string& prefix) override; + + std::string GetBodySourceCode() const override; - std::string GenerateSourceCodePass1(std::string roomName, uint32_t baseAddress) override; - std::string GenerateSourceCodePass2(std::string roomName, uint32_t baseAddress) override; - std::string GetCommandCName() const override; - std::string GenerateExterns() const override; RoomCommand GetRoomCommand() const override; size_t GetRawDataSize() const override; + std::string GetCommandCName() const override; private: - std::vector<MinimapChest*> chests; - uint32_t segmentOffset; -};
\ No newline at end of file + std::vector<MinimapChest> chests; +}; diff --git a/ZAPD/ZRoom/Commands/SetMinimapList.cpp b/ZAPD/ZRoom/Commands/SetMinimapList.cpp index c3e1d53..51a8a81 100644 --- a/ZAPD/ZRoom/Commands/SetMinimapList.cpp +++ b/ZAPD/ZRoom/Commands/SetMinimapList.cpp @@ -1,72 +1,42 @@ #include "SetMinimapList.h" -#include "../../BitConverter.h" -#include "../../Globals.h" -#include "../../StringHelper.h" -#include "../../ZFile.h" -#include "../ZRoom.h" - -SetMinimapList::SetMinimapList(ZRoom* nZRoom, std::vector<uint8_t> rawData, uint32_t rawDataIndex) - : ZRoomCommand(nZRoom, rawData, rawDataIndex) + +#include "BitConverter.h" +#include "Globals.h" +#include "StringHelper.h" +#include "ZFile.h" +#include "ZRoom/ZRoom.h" + +SetMinimapList::SetMinimapList(ZFile* nParent) : ZRoomCommand(nParent) { - segmentOffset = GETSEGOFFSET(BitConverter::ToInt32BE(rawData, rawDataIndex + 4)); - listSegmentOffset = GETSEGOFFSET(BitConverter::ToInt32BE(rawData, segmentOffset + 0)); - unk4 = BitConverter::ToInt32BE(rawData, segmentOffset + 4); +} - minimaps = std::vector<MinimapEntry*>(); +void SetMinimapList::ParseRawData() +{ + ZRoomCommand::ParseRawData(); + listSegmentOffset = + GETSEGOFFSET(BitConverter::ToInt32BE(parent->GetRawData(), segmentOffset + 0)); + unk4 = BitConverter::ToInt32BE(parent->GetRawData(), segmentOffset + 4); int32_t currentPtr = listSegmentOffset; for (int32_t i = 0; i < zRoom->roomCount; i++) { - MinimapEntry* entry = new MinimapEntry(rawData, currentPtr); + MinimapEntry entry(parent->GetRawData(), currentPtr); minimaps.push_back(entry); currentPtr += 10; } } -SetMinimapList::~SetMinimapList() -{ - for (MinimapEntry* entry : minimaps) - delete entry; -} - -std::string SetMinimapList::GenerateSourceCodePass1(std::string roomName, uint32_t baseAddress) +void SetMinimapList::DeclareReferences(const std::string& prefix) { - return StringHelper::Sprintf( - "%s 0x%02X, (u32)&%sMinimapList0x%06X", - ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), minimaps.size(), - zRoom->GetName().c_str(), segmentOffset); -} - -std::string SetMinimapList::GenerateSourceCodePass2(std::string roomName, uint32_t baseAddress) -{ - std::string sourceOutput = ""; - - sourceOutput += - StringHelper::Sprintf("%s 0, (u32)&%sMinimapList0x%06X };", - ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), - roomName.c_str(), segmentOffset, unk4); - - { - std::string declaration = StringHelper::Sprintf("(u32)%sMinimapEntryList0x%06X, 0x%08X", - roomName.c_str(), listSegmentOffset, unk4); - - zRoom->parent->AddDeclaration( - segmentOffset, DeclarationAlignment::Align4, DeclarationPadding::None, 8, "MinimapList", - StringHelper::Sprintf("%sMinimapList0x%06X", roomName.c_str(), segmentOffset), - declaration); - } - { std::string declaration = ""; size_t index = 0; - for (MinimapEntry* entry : minimaps) + for (const auto& entry : minimaps) { - declaration += StringHelper::Sprintf(" { 0x%04X, 0x%04X, 0x%04X, 0x%04X, 0x%04X },", - entry->unk0, entry->unk2, entry->unk4, entry->unk6, - entry->unk8); + declaration += StringHelper::Sprintf(" { %s },", entry.GetBodySourceCode().c_str()); if (index < minimaps.size() - 1) declaration += "\n"; @@ -74,20 +44,28 @@ std::string SetMinimapList::GenerateSourceCodePass2(std::string roomName, uint32 index++; } - zRoom->parent->AddDeclarationArray( - listSegmentOffset, DeclarationAlignment::None, DeclarationPadding::None, - minimaps.size() * 10, "MinimapEntry", - StringHelper::Sprintf("%sMinimapEntryList0x%06X", roomName.c_str(), listSegmentOffset), + parent->AddDeclarationArray( + listSegmentOffset, DeclarationAlignment::Align4, minimaps.size() * 10, "MinimapEntry", + StringHelper::Sprintf("%sMinimapEntryList0x%06X", prefix.c_str(), listSegmentOffset), minimaps.size(), declaration); } - return sourceOutput; + { + std::string listName = parent->GetDeclarationPtrName(listSegmentOffset); + + std::string declaration = StringHelper::Sprintf("(u32)%s, 0x%08X", listName.c_str(), unk4); + + parent->AddDeclaration( + segmentOffset, DeclarationAlignment::Align4, 8, "MinimapList", + StringHelper::Sprintf("%sMinimapList0x%06X", prefix.c_str(), segmentOffset), + declaration); + } } -std::string SetMinimapList::GenerateExterns() const +std::string SetMinimapList::GetBodySourceCode() const { - return StringHelper::Sprintf("extern MinimapList %sMinimapList0x%06X;\n", - zRoom->GetName().c_str(), listSegmentOffset); + std::string listName = parent->GetDeclarationPtrName(cmdArg2); + return StringHelper::Sprintf("SCENE_CMD_MINIMAP_INFO(%s)", listName.c_str()); } std::string SetMinimapList::GetCommandCName() const @@ -105,11 +83,17 @@ size_t SetMinimapList::GetRawDataSize() const return ZRoomCommand::GetRawDataSize() + (minimaps.size() * 10); } -MinimapEntry::MinimapEntry(std::vector<uint8_t> rawData, uint32_t rawDataIndex) +MinimapEntry::MinimapEntry(const std::vector<uint8_t>& rawData, uint32_t rawDataIndex) : unk0(BitConverter::ToUInt16BE(rawData, rawDataIndex + 0)), unk2(BitConverter::ToUInt16BE(rawData, rawDataIndex + 2)), unk4(BitConverter::ToUInt16BE(rawData, rawDataIndex + 4)), unk6(BitConverter::ToUInt16BE(rawData, rawDataIndex + 6)), unk8(BitConverter::ToUInt16BE(rawData, rawDataIndex + 8)) { -}
\ No newline at end of file +} + +std::string MinimapEntry::GetBodySourceCode() const +{ + return StringHelper::Sprintf("0x%04X, 0x%04X, 0x%04X, 0x%04X, 0x%04X", unk0, unk2, unk4, unk6, + unk8); +} diff --git a/ZAPD/ZRoom/Commands/SetMinimapList.h b/ZAPD/ZRoom/Commands/SetMinimapList.h index 0944dd3..2794c80 100644 --- a/ZAPD/ZRoom/Commands/SetMinimapList.h +++ b/ZAPD/ZRoom/Commands/SetMinimapList.h @@ -1,36 +1,39 @@ #pragma once -#include "../ZRoomCommand.h" +#include "ZRoom/ZRoomCommand.h" class MinimapEntry { public: + MinimapEntry(const std::vector<uint8_t>& rawData, uint32_t rawDataIndex); + + std::string GetBodySourceCode() const; + +protected: uint16_t unk0; uint16_t unk2; uint16_t unk4; uint16_t unk6; uint16_t unk8; - - MinimapEntry(std::vector<uint8_t> rawData, uint32_t rawDataIndex); }; class SetMinimapList : public ZRoomCommand { public: - SetMinimapList(ZRoom* nZRoom, std::vector<uint8_t> rawData, uint32_t rawDataIndex); - ~SetMinimapList(); + SetMinimapList(ZFile* nParent); + + void ParseRawData() override; + void DeclareReferences(const std::string& prefix) override; + + std::string GetBodySourceCode() const override; - std::string GenerateSourceCodePass1(std::string roomName, uint32_t baseAddress) override; - std::string GenerateSourceCodePass2(std::string roomName, uint32_t baseAddress) override; - std::string GetCommandCName() const override; - std::string GenerateExterns() const override; RoomCommand GetRoomCommand() const override; size_t GetRawDataSize() const override; + std::string GetCommandCName() const override; private: - std::vector<MinimapEntry*> minimaps; - uint32_t segmentOffset; + std::vector<MinimapEntry> minimaps; uint32_t listSegmentOffset; uint32_t unk4; -};
\ No newline at end of file +}; diff --git a/ZAPD/ZRoom/Commands/SetObjectList.cpp b/ZAPD/ZRoom/Commands/SetObjectList.cpp index c3c709b..d3184b4 100644 --- a/ZAPD/ZRoom/Commands/SetObjectList.cpp +++ b/ZAPD/ZRoom/Commands/SetObjectList.cpp @@ -1,62 +1,60 @@ #include "SetObjectList.h" -#include "../../BitConverter.h" -#include "../../Globals.h" -#include "../../StringHelper.h" -#include "../../ZFile.h" -#include "../ZNames.h" -#include "../ZRoom.h" -SetObjectList::SetObjectList(ZRoom* nZRoom, std::vector<uint8_t> rawData, uint32_t rawDataIndex) - : ZRoomCommand(nZRoom, rawData, rawDataIndex) +#include "BitConverter.h" +#include "Globals.h" +#include "StringHelper.h" +#include "ZFile.h" +#include "ZRoom/ZNames.h" +#include "ZRoom/ZRoom.h" + +SetObjectList::SetObjectList(ZFile* nParent) : ZRoomCommand(nParent) +{ +} + +void SetObjectList::ParseRawData() { - objects = std::vector<uint16_t>(); - uint8_t objectCnt = rawData[rawDataIndex + 1]; - segmentOffset = GETSEGOFFSET(BitConverter::ToInt32BE(rawData, rawDataIndex + 4)); + ZRoomCommand::ParseRawData(); + uint8_t objectCnt = parent->GetRawData().at(rawDataIndex + 1); uint32_t currentPtr = segmentOffset; for (uint8_t i = 0; i < objectCnt; i++) { - uint16_t objectIndex = BitConverter::ToInt16BE(rawData, currentPtr); + uint16_t objectIndex = BitConverter::ToInt16BE(parent->GetRawData(), currentPtr); objects.push_back(objectIndex); currentPtr += 2; } if (segmentOffset != 0) - zRoom->parent->AddDeclarationPlaceholder(segmentOffset); -} - -std::string SetObjectList::GenerateExterns() const -{ - return StringHelper::Sprintf("s16 %sObjectList0x%06X[];\n", zRoom->GetName().c_str(), - segmentOffset); + parent->AddDeclarationPlaceholder(segmentOffset); } -std::string SetObjectList::GenerateSourceCodePass1(std::string roomName, uint32_t baseAddress) +void SetObjectList::DeclareReferences(const std::string& prefix) { - std::string sourceOutput = ""; - - sourceOutput += - StringHelper::Sprintf("%s 0x%02X, (u32)%sObjectList0x%06X", - ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), - objects.size(), zRoom->GetName().c_str(), segmentOffset); + if (!objects.empty()) + { + std::string declaration = ""; - std::string declaration = ""; + for (size_t i = 0; i < objects.size(); i++) + { + uint16_t objectIndex = objects[i]; + declaration += + StringHelper::Sprintf(" %s,", ZNames::GetObjectName(objectIndex).c_str()); - for (size_t i = 0; i < objects.size(); i++) - { - uint16_t objectIndex = objects[i]; - declaration += StringHelper::Sprintf(" %s,", ZNames::GetObjectName(objectIndex).c_str()); + if (i < objects.size() - 1) + declaration += "\n"; + } - if (i < objects.size() - 1) - declaration += "\n"; + parent->AddDeclarationArray( + segmentOffset, DeclarationAlignment::None, objects.size() * 2, "s16", + StringHelper::Sprintf("%sObjectList_%06X", prefix.c_str(), segmentOffset), + objects.size(), declaration); } +} - zRoom->parent->AddDeclarationArray( - segmentOffset, DeclarationAlignment::None, objects.size() * 2, "s16", - StringHelper::Sprintf("%sObjectList0x%06X", zRoom->GetName().c_str(), segmentOffset), - objects.size(), declaration); - - return sourceOutput; +std::string SetObjectList::GetBodySourceCode() const +{ + std::string listName = parent->GetDeclarationPtrName(cmdArg2); + return StringHelper::Sprintf("SCENE_CMD_OBJECT_LIST(%i, %s)", objects.size(), listName.c_str()); } size_t SetObjectList::GetRawDataSize() const @@ -72,4 +70,4 @@ std::string SetObjectList::GetCommandCName() const RoomCommand SetObjectList::GetRoomCommand() const { return RoomCommand::SetObjectList; -}
\ No newline at end of file +} diff --git a/ZAPD/ZRoom/Commands/SetObjectList.h b/ZAPD/ZRoom/Commands/SetObjectList.h index c29bc53..c952333 100644 --- a/ZAPD/ZRoom/Commands/SetObjectList.h +++ b/ZAPD/ZRoom/Commands/SetObjectList.h @@ -1,20 +1,21 @@ #pragma once -#include "../ZRoomCommand.h" +#include "ZRoom/ZRoomCommand.h" class SetObjectList : public ZRoomCommand { public: - SetObjectList(ZRoom* nZRoom, std::vector<uint8_t> rawData, uint32_t rawDataIndex); + SetObjectList(ZFile* nParent); - virtual std::string GenerateSourceCodePass1(std::string roomName, - uint32_t baseAddress) override; - virtual std::string GetCommandCName() const override; - virtual RoomCommand GetRoomCommand() const override; - virtual size_t GetRawDataSize() const override; - virtual std::string GenerateExterns() const override; + void ParseRawData() override; + void DeclareReferences(const std::string& prefix); + + std::string GetBodySourceCode() const override; + + std::string GetCommandCName() const override; + RoomCommand GetRoomCommand() const override; + size_t GetRawDataSize() const override; private: std::vector<uint16_t> objects; - uint32_t segmentOffset; -};
\ No newline at end of file +}; diff --git a/ZAPD/ZRoom/Commands/SetPathways.cpp b/ZAPD/ZRoom/Commands/SetPathways.cpp index dbadba9..13ee7a7 100644 --- a/ZAPD/ZRoom/Commands/SetPathways.cpp +++ b/ZAPD/ZRoom/Commands/SetPathways.cpp @@ -1,240 +1,58 @@ #include "SetPathways.h" -#include "../../BitConverter.h" -#include "../../Globals.h" -#include "../../StringHelper.h" -#include "../../ZFile.h" -#include "../ZRoom.h" +#include "BitConverter.h" +#include "Globals.h" +#include "StringHelper.h" +#include "ZFile.h" +#include "ZRoom/ZRoom.h" -REGISTER_ZFILENODE(Path, ZSetPathways); - -ZSetPathways::ZSetPathways(ZFile* nParent) : ZResource(nParent) -{ -} - -ZSetPathways::ZSetPathways(ZRoom* nZRoom, const std::vector<uint8_t>& nRawData, - uint32_t nRawDataIndex, bool nIsFromHeader) - : ZResource(nZRoom->parent), ZRoomCommand(nZRoom, nRawData, nRawDataIndex) -{ - rawData = nRawData; - rawDataIndex = nRawDataIndex; - isFromHeader = nIsFromHeader; -} - -ZSetPathways::~ZSetPathways() -{ - delete pathwayList; -} - -void ZSetPathways::DeclareVar(const std::string& prefix, const std::string& bodyStr) const +SetPathways::SetPathways(ZFile* nParent) : ZRoomCommand(nParent), pathwayList(nParent) { - parent->AddDeclaration(cmdAddress, DeclarationAlignment::None, 8, - StringHelper::Sprintf("static %s", GetCommandCName().c_str()), - StringHelper::Sprintf("%sSet%04XCmd%02X", name.c_str(), - commandSet & 0x00FFFFFF, cmdIndex, cmdID), - StringHelper::Sprintf("%s // 0x%04X", bodyStr.c_str(), cmdAddress)); } -std::string ZSetPathways::GetSourceOutputCode(const std::string& prefix) +void SetPathways::DeclareReferences(const std::string& prefix) { - if (pathwayList != nullptr) - pathwayList->GetSourceOutputCode(parent->GetName()); - - return ""; -} - -void ZSetPathways::ParseRawData() -{ - if (isFromHeader) - segmentOffset = GETSEGOFFSET(BitConverter::ToInt32BE(rawData, rawDataIndex + 4)); - else - segmentOffset = rawDataIndex; - if (segmentOffset != 0) parent->AddDeclarationPlaceholder(segmentOffset); - - int32_t numPaths = (Globals::Instance->game != ZGame::MM_RETAIL) ? - 1 : - zRoom->GetDeclarationSizeFromNeighbor(segmentOffset) / 8; - - pathwayList = new PathwayList(parent, rawData, segmentOffset, numPaths); -} - -std::string ZSetPathways::GenerateSourceCodePass1(std::string roomName, uint32_t baseAddress) -{ - ParseRawData(); - return ""; -} - -std::string ZSetPathways::GenerateSourceCodePass2(std::string roomName, uint32_t baseAddress) -{ - std::string sourceOutput = ""; - - sourceOutput += StringHelper::Sprintf("\n\t%s 0, (u32)%sPathway0x%06X\n};", - ZRoomCommand::GenerateSourceCodePass1("", 0).c_str(), - parent->GetName().c_str(), segmentOffset); - - if (pathwayList != nullptr) - pathwayList->GetSourceOutputCode(parent->GetName()); - - return sourceOutput; } -size_t ZSetPathways::GetRawDataSize() const +void SetPathways::ParseRawDataLate() { - size_t size = 0; - if (pathwayList != nullptr) - size += pathwayList->GetRawDataSize(); - - return ZRoomCommand::GetRawDataSize() + size; -} - -std::string ZSetPathways::GenerateExterns() const -{ - if (pathwayList != nullptr) - return pathwayList->GenerateExterns(parent->GetName()); - - return ""; -} - -std::string ZSetPathways::GetCommandCName() const -{ - return "SCmdPathList"; -} - -RoomCommand ZSetPathways::GetRoomCommand() const -{ - return RoomCommand::SetPathways; -} - -PathwayEntry::PathwayEntry(std::vector<uint8_t> rawData, uint32_t rawDataIndex) - : numPoints(rawData[rawDataIndex + 0]), unk1(rawData[rawDataIndex + 1]), - unk2(BitConverter::ToInt16BE(rawData, rawDataIndex + 2)), - listSegmentOffset(GETSEGOFFSET(BitConverter::ToInt32BE(rawData, rawDataIndex + 4))) -{ - uint32_t currentPtr = listSegmentOffset; - uint8_t* data = rawData.data(); - - for (int32_t i = 0; i < numPoints; i++) + if (Globals::Instance->game == ZGame::MM_RETAIL) { - x = BitConverter::ToInt16BE(data, currentPtr + 0); - y = BitConverter::ToInt16BE(data, currentPtr + 2); - z = BitConverter::ToInt16BE(data, currentPtr + 4); - - Vec3s point = Vec3s(x, y, z); - points.push_back(point); - - currentPtr += 6; + auto numPaths = zRoom->GetDeclarationSizeFromNeighbor(segmentOffset) / 8; + pathwayList.SetNumPaths(numPaths); } - if (numPoints == 0) // Hack for SharpOcarina - { - for (uint32_t i = 0; i < 3; i++) - { - Vec3s point = Vec3s(0, 0, 0); - points.push_back(point); - } - } + pathwayList.SetRawDataIndex(segmentOffset); + pathwayList.ParseRawData(); } -PathwayList::PathwayList(ZFile* nParent, std::vector<uint8_t> rawData, uint32_t rawDataIndex, - int32_t length) +void SetPathways::DeclareReferencesLate(const std::string& prefix) { - parent = nParent; - _rawDataIndex = rawDataIndex; - - uint32_t currentPtr = rawDataIndex; - - for (int32_t pathIndex = 0; pathIndex < length; pathIndex++) - { - PathwayEntry* path = new PathwayEntry(rawData, currentPtr); - currentPtr += 8; - - if (path->listSegmentOffset == 0) - break; - - pathways.push_back(path); - } + pathwayList.SetName(StringHelper::Sprintf("%sPathway_%06X", prefix.c_str(), segmentOffset)); + pathwayList.DeclareReferences(prefix); + pathwayList.GetSourceOutputCode(prefix); } -PathwayList::~PathwayList() +std::string SetPathways::GetBodySourceCode() const { - for (PathwayEntry* path : pathways) - delete path; + std::string listName = parent->GetDeclarationPtrName(cmdArg2); + return StringHelper::Sprintf("SCENE_CMD_PATH_LIST(%s)", listName.c_str()); } -void PathwayList::GetSourceOutputCode(const std::string& prefix) +size_t SetPathways::GetRawDataSize() const { - { - std::string declaration = ""; - size_t index = 0; - for (PathwayEntry* entry : pathways) - { - if (Globals::Instance->game == ZGame::MM_RETAIL) - declaration += StringHelper::Sprintf(" { %i, %i, %i, (u32)%sPathwayList0x%06X },", - entry->numPoints, entry->unk1, entry->unk2, - prefix.c_str(), entry->listSegmentOffset); - else - declaration += - StringHelper::Sprintf(" { %i, (u32)%sPathwayList0x%06X },", entry->numPoints, - prefix.c_str(), entry->listSegmentOffset); - - if (index < pathways.size() - 1) - declaration += "\n"; - - index++; - } + int32_t size = pathwayList.GetRawDataSize(); - parent->AddDeclarationArray( - _rawDataIndex, DeclarationAlignment::None, DeclarationPadding::None, - pathways.size() * 8, "Path", - StringHelper::Sprintf("%sPathway0x%06X", prefix.c_str(), _rawDataIndex), - pathways.size(), declaration); - } - - for (PathwayEntry* entry : pathways) - { - std::string declaration = ""; - - size_t index = 0; - for (Vec3s& point : entry->points) - { - declaration += StringHelper::Sprintf(" { %i, %i, %i }, //0x%06X", point.x, point.y, - point.z, entry->listSegmentOffset + (index * 6)); - - if (index < entry->points.size() - 1) - declaration += "\n"; - - index++; - } - - parent->AddDeclarationArray( - entry->listSegmentOffset, DeclarationAlignment::Align4, DeclarationPadding::Pad4, - entry->points.size() * 6, "Vec3s", - StringHelper::Sprintf("%sPathwayList0x%06X", prefix.c_str(), entry->listSegmentOffset), - entry->points.size(), declaration); - } + return ZRoomCommand::GetRawDataSize() + size; } -size_t PathwayList::GetRawDataSize() const +std::string SetPathways::GetCommandCName() const { - size_t pointsSize = 0; - - for (PathwayEntry* entry : pathways) - { - pointsSize += entry->points.size() * 6; - } - - return pathways.size() * 8 + pointsSize; + return "SCmdPathList"; } -std::string PathwayList::GenerateExterns(const std::string& prefix) +RoomCommand SetPathways::GetRoomCommand() const { - std::string declaration = ""; - for (PathwayEntry* entry : pathways) - { - declaration += StringHelper::Sprintf("extern Vec3s %sPathwayList0x%06X[];\n", - prefix.c_str(), entry->listSegmentOffset); - } - - return declaration; + return RoomCommand::SetPathways; } diff --git a/ZAPD/ZRoom/Commands/SetPathways.h b/ZAPD/ZRoom/Commands/SetPathways.h index cb3b7ab..30b765b 100644 --- a/ZAPD/ZRoom/Commands/SetPathways.h +++ b/ZAPD/ZRoom/Commands/SetPathways.h @@ -1,63 +1,28 @@ #pragma once -#include "../../Vec3s.h" -#include "../ZRoomCommand.h" +#include "Vec3s.h" +#include "ZPath.h" #include "ZResource.h" +#include "ZRoom/ZRoomCommand.h" -class PathwayEntry +class SetPathways : public ZRoomCommand { public: - int16_t x, y, z; + SetPathways(ZFile* nParent); - PathwayEntry(std::vector<uint8_t> rawData, uint32_t rawDataIndex); + void DeclareReferences(const std::string& prefix) override; - int32_t numPoints; - int8_t unk1; // (MM Only) - int16_t unk2; // (MM Only) - uint32_t listSegmentOffset; - std::vector<Vec3s> points; -}; - -struct PathwayList -{ -public: - PathwayList(ZFile* nParent, std::vector<uint8_t> rawData, uint32_t rawDataIndex, - int32_t length); - ~PathwayList(); - - void GetSourceOutputCode(const std::string& prefix); - size_t GetRawDataSize() const; - std::string GenerateExterns(const std::string& prefix); - -private: - ZFile* parent; - std::vector<PathwayEntry*> pathways; - std::vector<uint8_t> _rawData; - uint32_t _rawDataIndex; -}; - -class ZSetPathways : public ZResource, public ZRoomCommand -{ -public: - ZSetPathways(ZFile* nParent); - ZSetPathways(ZRoom* nZRoom, const std::vector<uint8_t>& nRawData, uint32_t nRawDataIndex, - bool nIsFromHeader); - ~ZSetPathways(); + void ParseRawDataLate() override; + void DeclareReferencesLate(const std::string& prefix) override; - void ParseRawData() override; + void DeclareVar(const std::string& prefix, const std::string& bodyStr); - void DeclareVar(const std::string& prefix, const std::string& bodyStr) const; - std::string GetSourceOutputCode(const std::string& prefix) override; + std::string GetBodySourceCode() const override; - std::string GenerateSourceCodePass1(std::string roomName, uint32_t baseAddress) override; - std::string GenerateSourceCodePass2(std::string roomName, uint32_t baseAddress) override; RoomCommand GetRoomCommand() const override; size_t GetRawDataSize() const override; std::string GetCommandCName() const override; - std::string GenerateExterns() const override; private: - uint32_t segmentOffset; - PathwayList* pathwayList; - bool isFromHeader = false; -};
\ No newline at end of file + ZPath pathwayList; +}; diff --git a/ZAPD/ZRoom/Commands/SetRoomBehavior.cpp b/ZAPD/ZRoom/Commands/SetRoomBehavior.cpp index eb19073..d667328 100644 --- a/ZAPD/ZRoom/Commands/SetRoomBehavior.cpp +++ b/ZAPD/ZRoom/Commands/SetRoomBehavior.cpp @@ -1,20 +1,41 @@ #include "SetRoomBehavior.h" -#include "../../BitConverter.h" -#include "../../StringHelper.h" +#include "BitConverter.h" +#include "Globals.h" +#include "StringHelper.h" -SetRoomBehavior::SetRoomBehavior(ZRoom* nZRoom, std::vector<uint8_t> rawData, uint32_t rawDataIndex) - : ZRoomCommand(nZRoom, rawData, rawDataIndex) +SetRoomBehavior::SetRoomBehavior(ZFile* nParent) : ZRoomCommand(nParent) { - gameplayFlags = rawData[rawDataIndex + 0x01]; - gameplayFlags2 = BitConverter::ToInt32BE(rawData, rawDataIndex + 0x04); } -std::string SetRoomBehavior::GenerateSourceCodePass1(std::string roomName, uint32_t baseAddress) +void SetRoomBehavior::ParseRawData() { - return StringHelper::Sprintf( - "%s 0x%02X, 0x%08X", ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), - gameplayFlags, gameplayFlags2); - ; + ZRoomCommand::ParseRawData(); + gameplayFlags = cmdArg1; + gameplayFlags2 = BitConverter::ToInt32BE(parent->GetRawData(), rawDataIndex + 0x04); + + currRoomUnk2 = gameplayFlags2 & 0xFF; + + currRoomUnk5 = showInvisActors = (gameplayFlags2 >> 8) & 1; + + msgCtxUnk = (gameplayFlags2 >> 10) & 1; + + enablePosLights = (gameplayFlags2 >> 11) & 1; + kankyoContextUnkE2 = (gameplayFlags2 >> 12) & 1; +} + +std::string SetRoomBehavior::GetBodySourceCode() const +{ + if (Globals::Instance->game == ZGame::MM_RETAIL) + { + std::string enableLights = StringHelper::BoolStr(enablePosLights); + return StringHelper::Sprintf("SCENE_CMD_ROOM_BEHAVIOR(0x%02X, 0x%02X, %i, %i, %s, %i)", + gameplayFlags, currRoomUnk2, currRoomUnk5, msgCtxUnk, + enableLights.c_str(), kankyoContextUnkE2); + } + std::string showInvisible = StringHelper::BoolStr(showInvisActors); + std::string disableWarps = StringHelper::BoolStr(msgCtxUnk); + return StringHelper::Sprintf("SCENE_CMD_ROOM_BEHAVIOR(0x%02X, 0x%02X, %s, %s)", gameplayFlags, + currRoomUnk2, showInvisible.c_str(), disableWarps.c_str()); } std::string SetRoomBehavior::GetCommandCName() const @@ -25,4 +46,4 @@ std::string SetRoomBehavior::GetCommandCName() const RoomCommand SetRoomBehavior::GetRoomCommand() const { return RoomCommand::SetRoomBehavior; -}
\ No newline at end of file +} diff --git a/ZAPD/ZRoom/Commands/SetRoomBehavior.h b/ZAPD/ZRoom/Commands/SetRoomBehavior.h index 41fb058..7989ea3 100644 --- a/ZAPD/ZRoom/Commands/SetRoomBehavior.h +++ b/ZAPD/ZRoom/Commands/SetRoomBehavior.h @@ -1,18 +1,30 @@ #pragma once -#include "../ZRoomCommand.h" +#include "ZRoom/ZRoomCommand.h" class SetRoomBehavior : public ZRoomCommand { public: - SetRoomBehavior(ZRoom* nZRoom, std::vector<uint8_t> rawData, uint32_t rawDataIndex); + SetRoomBehavior(ZFile* nParent); - virtual std::string GenerateSourceCodePass1(std::string roomName, - uint32_t baseAddress) override; - virtual std::string GetCommandCName() const override; - virtual RoomCommand GetRoomCommand() const override; + void ParseRawData() override; -private: + std::string GetBodySourceCode() const override; + + RoomCommand GetRoomCommand() const override; + std::string GetCommandCName() const override; + +protected: uint8_t gameplayFlags; uint32_t gameplayFlags2; -};
\ No newline at end of file + + uint8_t currRoomUnk2; + + uint8_t showInvisActors; + uint8_t currRoomUnk5; + + uint8_t msgCtxUnk; + + uint8_t enablePosLights; + uint8_t kankyoContextUnkE2; +}; diff --git a/ZAPD/ZRoom/Commands/SetRoomList.cpp b/ZAPD/ZRoom/Commands/SetRoomList.cpp index 9ab2752..8cac82e 100644 --- a/ZAPD/ZRoom/Commands/SetRoomList.cpp +++ b/ZAPD/ZRoom/Commands/SetRoomList.cpp @@ -1,23 +1,25 @@ #include "SetRoomList.h" -#include "../../BitConverter.h" -#include "../../Globals.h" -#include "../../StringHelper.h" -#include "../../ZFile.h" -#include "../ZRoom.h" - -SetRoomList::SetRoomList(ZRoom* nZRoom, std::vector<uint8_t> rawData, uint32_t rawDataIndex) - : ZRoomCommand(nZRoom, rawData, rawDataIndex) + +#include "BitConverter.h" +#include "Globals.h" +#include "StringHelper.h" +#include "ZFile.h" +#include "ZRoom/ZRoom.h" + +SetRoomList::SetRoomList(ZFile* nParent) : ZRoomCommand(nParent) { - int32_t numRooms = rawData[rawDataIndex + 1]; - segmentOffset = BitConverter::ToInt32BE(rawData, rawDataIndex + 4) & 0x00FFFFFF; +} - rooms = std::vector<RoomEntry*>(); +void SetRoomList::ParseRawData() +{ + ZRoomCommand::ParseRawData(); + int numRooms = cmdArg1; int32_t currentPtr = segmentOffset; for (int32_t i = 0; i < numRooms; i++) { - RoomEntry* entry = new RoomEntry(rawData, currentPtr); + RoomEntry entry(parent->GetRawData(), currentPtr); rooms.push_back(entry); currentPtr += 8; @@ -26,29 +28,17 @@ SetRoomList::SetRoomList(ZRoom* nZRoom, std::vector<uint8_t> rawData, uint32_t r zRoom->roomCount = numRooms; } -SetRoomList::~SetRoomList() -{ - for (RoomEntry* entry : rooms) - delete entry; -} - -std::string SetRoomList::GenerateSourceCodePass1(std::string roomName, uint32_t baseAddress) -{ - return StringHelper::Sprintf( - "%s 0x%02X, (u32)&%sRoomList0x%06X", - ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), rooms.size(), - zRoom->GetName().c_str(), segmentOffset); -} - -std::string SetRoomList::GenerateSourceCodePass2(std::string roomName, uint32_t baseAddress) +void SetRoomList::DeclareReferences(const std::string& prefix) { - return ""; + parent->AddDeclarationArray( + segmentOffset, DeclarationAlignment::None, rooms.size() * 8, "RomFile", + StringHelper::Sprintf("%sRoomList0x%06X", prefix.c_str(), segmentOffset), 0, ""); } -std::string SetRoomList::GenerateExterns() const +std::string SetRoomList::GetBodySourceCode() const { - return StringHelper::Sprintf("extern RomFile %sRoomList0x%06X[];\n", zRoom->GetName().c_str(), - segmentOffset); + std::string listName = parent->GetDeclarationPtrName(cmdArg2); + return StringHelper::Sprintf("SCENE_CMD_ROOM_LIST(%i, %s)", rooms.size(), listName.c_str()); } std::string SetRoomList::GetCommandCName() const @@ -61,7 +51,7 @@ RoomCommand SetRoomList::GetRoomCommand() const return RoomCommand::SetRoomList; } -std::string SetRoomList::PreGenSourceFiles() +void SetRoomList::PreGenSourceFiles() { std::string declaration = ""; @@ -72,24 +62,17 @@ std::string SetRoomList::PreGenSourceFiles() if (res->GetResourceType() == ZResourceType::Room && res != zRoom) { std::string roomName = res->GetName(); - declaration += StringHelper::Sprintf( - " { (u32)_%sSegmentRomStart, (u32)_%sSegmentRomEnd },\n", roomName.c_str(), - roomName.c_str()); + declaration += + StringHelper::Sprintf("\t{ (u32)_%sSegmentRomStart, (u32)_%sSegmentRomEnd },\n", + roomName.c_str(), roomName.c_str()); } } } - zRoom->parent->AddDeclarationArray( + parent->AddDeclarationArray( segmentOffset, DeclarationAlignment::None, rooms.size() * 8, "RomFile", StringHelper::Sprintf("%sRoomList0x%06X", zRoom->GetName().c_str(), segmentOffset), 0, declaration); - - return std::string(); -} - -std::string SetRoomList::Save() -{ - return std::string(); } RoomEntry::RoomEntry(uint32_t nVAS, uint32_t nVAE) @@ -98,8 +81,8 @@ RoomEntry::RoomEntry(uint32_t nVAS, uint32_t nVAE) virtualAddressEnd = nVAE; } -RoomEntry::RoomEntry(std::vector<uint8_t> rawData, uint32_t rawDataIndex) +RoomEntry::RoomEntry(const std::vector<uint8_t>& rawData, uint32_t rawDataIndex) : RoomEntry(BitConverter::ToInt32BE(rawData, rawDataIndex + 0), BitConverter::ToInt32BE(rawData, rawDataIndex + 4)) { -}
\ No newline at end of file +} diff --git a/ZAPD/ZRoom/Commands/SetRoomList.h b/ZAPD/ZRoom/Commands/SetRoomList.h index a54ee56..eaa2013 100644 --- a/ZAPD/ZRoom/Commands/SetRoomList.h +++ b/ZAPD/ZRoom/Commands/SetRoomList.h @@ -1,34 +1,32 @@ #pragma once -#include "../ZRoomCommand.h" +#include "ZRoom/ZRoomCommand.h" class RoomEntry { public: - uint32_t virtualAddressStart; - uint32_t virtualAddressEnd; - RoomEntry(uint32_t nVAS, uint32_t nVAE); - RoomEntry(std::vector<uint8_t> rawData, uint32_t rawDataIndex); + RoomEntry(const std::vector<uint8_t>& rawData, uint32_t rawDataIndex); + +protected: + int32_t virtualAddressStart; + int32_t virtualAddressEnd; }; class SetRoomList : public ZRoomCommand { public: - SetRoomList(ZRoom* nZRoom, std::vector<uint8_t> rawData, uint32_t rawDataIndex); - ~SetRoomList(); - - virtual std::string GenerateSourceCodePass1(std::string roomName, - uint32_t baseAddress) override; - virtual std::string GenerateSourceCodePass2(std::string roomName, - uint32_t baseAddress) override; - virtual std::string GetCommandCName() const override; - virtual std::string GenerateExterns() const override; - virtual RoomCommand GetRoomCommand() const override; - virtual std::string PreGenSourceFiles() override; - virtual std::string Save() override; + SetRoomList(ZFile* nParent); + + void ParseRawData() override; + virtual void DeclareReferences(const std::string& prefix); + + std::string GetBodySourceCode() const override; + void PreGenSourceFiles() override; + + RoomCommand GetRoomCommand() const override; + std::string GetCommandCName() const override; private: - std::vector<RoomEntry*> rooms; - uint32_t segmentOffset; -};
\ No newline at end of file + std::vector<RoomEntry> rooms; +}; diff --git a/ZAPD/ZRoom/Commands/SetSkyboxModifier.cpp b/ZAPD/ZRoom/Commands/SetSkyboxModifier.cpp index 612d289..d8af2d1 100644 --- a/ZAPD/ZRoom/Commands/SetSkyboxModifier.cpp +++ b/ZAPD/ZRoom/Commands/SetSkyboxModifier.cpp @@ -1,21 +1,24 @@ #include "SetSkyboxModifier.h" -#include "../../StringHelper.h" -SetSkyboxModifier::SetSkyboxModifier(ZRoom* nZRoom, std::vector<uint8_t> rawData, - uint32_t rawDataIndex) - : ZRoomCommand(nZRoom, rawData, rawDataIndex) +#include "StringHelper.h" + +SetSkyboxModifier::SetSkyboxModifier(ZFile* nParent) : ZRoomCommand(nParent) { - disableSky = rawData[rawDataIndex + 0x04]; - disableSunMoon = rawData[rawDataIndex + 0x05]; } -std::string SetSkyboxModifier::GenerateSourceCodePass1(std::string roomName, uint32_t baseAddress) +void SetSkyboxModifier::ParseRawData() { - return StringHelper::Sprintf( - "%s 0, 0, 0, 0x%02X, 0x%02X", - ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), disableSky, - disableSunMoon); - ; + ZRoomCommand::ParseRawData(); + disableSky = parent->GetRawData().at(rawDataIndex + 0x04); + disableSunMoon = parent->GetRawData().at(rawDataIndex + 0x05); +} + +std::string SetSkyboxModifier::GetBodySourceCode() const +{ + std::string sky = StringHelper::BoolStr(disableSky); + std::string soonMoon = StringHelper::BoolStr(disableSunMoon); + return StringHelper::Sprintf("SCENE_CMD_SKYBOX_DISABLES(%s, %s)", sky.c_str(), + soonMoon.c_str()); } std::string SetSkyboxModifier::GetCommandCName() const @@ -26,4 +29,4 @@ std::string SetSkyboxModifier::GetCommandCName() const RoomCommand SetSkyboxModifier::GetRoomCommand() const { return RoomCommand::SetSkyboxModifier; -}
\ No newline at end of file +} diff --git a/ZAPD/ZRoom/Commands/SetSkyboxModifier.h b/ZAPD/ZRoom/Commands/SetSkyboxModifier.h index b813cbb..1b0e022 100644 --- a/ZAPD/ZRoom/Commands/SetSkyboxModifier.h +++ b/ZAPD/ZRoom/Commands/SetSkyboxModifier.h @@ -1,18 +1,20 @@ #pragma once -#include "../ZRoomCommand.h" +#include "ZRoom/ZRoomCommand.h" class SetSkyboxModifier : public ZRoomCommand { public: - SetSkyboxModifier(ZRoom* nZRoom, std::vector<uint8_t> rawData, uint32_t rawDataIndex); + SetSkyboxModifier(ZFile* nParent); - virtual std::string GenerateSourceCodePass1(std::string roomName, - uint32_t baseAddress) override; - virtual std::string GetCommandCName() const override; - virtual RoomCommand GetRoomCommand() const override; + void ParseRawData() override; + + std::string GetBodySourceCode() const override; + + std::string GetCommandCName() const override; + RoomCommand GetRoomCommand() const override; private: uint8_t disableSky; uint8_t disableSunMoon; -};
\ No newline at end of file +}; diff --git a/ZAPD/ZRoom/Commands/SetSkyboxSettings.cpp b/ZAPD/ZRoom/Commands/SetSkyboxSettings.cpp index 8e58d5c..43c5c1e 100644 --- a/ZAPD/ZRoom/Commands/SetSkyboxSettings.cpp +++ b/ZAPD/ZRoom/Commands/SetSkyboxSettings.cpp @@ -1,23 +1,28 @@ #include "SetSkyboxSettings.h" -#include "../../Globals.h" -#include "../../StringHelper.h" +#include "Globals.h" +#include "StringHelper.h" -SetSkyboxSettings::SetSkyboxSettings(ZRoom* nZRoom, std::vector<uint8_t> rawData, - uint32_t rawDataIndex) - : ZRoomCommand(nZRoom, rawData, rawDataIndex) +SetSkyboxSettings::SetSkyboxSettings(ZFile* nParent) : ZRoomCommand(nParent) { - unk1 = rawData[rawDataIndex + 0x01]; - skyboxNumber = rawData[rawDataIndex + 0x04]; - cloudsType = rawData[rawDataIndex + 0x05]; - lightingSettingsControl = rawData[rawDataIndex + 0x06]; } -std::string SetSkyboxSettings::GenerateSourceCodePass1(std::string roomName, uint32_t baseAddress) +void SetSkyboxSettings::ParseRawData() { - return StringHelper::Sprintf( - "%s 0x%02X, 0x00, 0x00, 0x%02X, 0x%02X, 0x%02X", - ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), unk1, skyboxNumber, - cloudsType, lightingSettingsControl); + ZRoomCommand::ParseRawData(); + unk1 = cmdArg1; + skyboxNumber = parent->GetRawData().at(rawDataIndex + 0x04); + cloudsType = parent->GetRawData().at(rawDataIndex + 0x05); + isIndoors = parent->GetRawData().at(rawDataIndex + 0x06); +} + +std::string SetSkyboxSettings::GetBodySourceCode() const +{ + std::string indoors = StringHelper::BoolStr(isIndoors); + if (Globals::Instance->game == ZGame::MM_RETAIL) + return StringHelper::Sprintf("SCENE_CMD_SKYBOX_SETTINGS(0x%02X, %i, %i, %s)", unk1, + skyboxNumber, cloudsType, indoors.c_str()); + return StringHelper::Sprintf("SCENE_CMD_SKYBOX_SETTINGS(%i, %i, %s)", skyboxNumber, cloudsType, + indoors.c_str()); } std::string SetSkyboxSettings::GetCommandCName() const @@ -28,4 +33,4 @@ std::string SetSkyboxSettings::GetCommandCName() const RoomCommand SetSkyboxSettings::GetRoomCommand() const { return RoomCommand::SetSkyboxSettings; -}
\ No newline at end of file +} diff --git a/ZAPD/ZRoom/Commands/SetSkyboxSettings.h b/ZAPD/ZRoom/Commands/SetSkyboxSettings.h index 0cf13b5..380addc 100644 --- a/ZAPD/ZRoom/Commands/SetSkyboxSettings.h +++ b/ZAPD/ZRoom/Commands/SetSkyboxSettings.h @@ -1,20 +1,22 @@ #pragma once -#include "../ZRoomCommand.h" +#include "ZRoom/ZRoomCommand.h" class SetSkyboxSettings : public ZRoomCommand { public: - SetSkyboxSettings(ZRoom* nZRoom, std::vector<uint8_t> rawData, uint32_t rawDataIndex); + SetSkyboxSettings(ZFile* nParent); - virtual std::string GenerateSourceCodePass1(std::string roomName, - uint32_t baseAddress) override; - virtual std::string GetCommandCName() const override; - virtual RoomCommand GetRoomCommand() const override; + void ParseRawData() override; + + std::string GetBodySourceCode() const override; + + std::string GetCommandCName() const override; + RoomCommand GetRoomCommand() const override; private: uint8_t unk1; // (MM Only) uint8_t skyboxNumber; uint8_t cloudsType; - uint8_t lightingSettingsControl; -};
\ No newline at end of file + uint8_t isIndoors; +}; diff --git a/ZAPD/ZRoom/Commands/SetSoundSettings.cpp b/ZAPD/ZRoom/Commands/SetSoundSettings.cpp index f1bc7b1..9472468 100644 --- a/ZAPD/ZRoom/Commands/SetSoundSettings.cpp +++ b/ZAPD/ZRoom/Commands/SetSoundSettings.cpp @@ -1,21 +1,22 @@ #include "SetSoundSettings.h" -#include "../../StringHelper.h" +#include "StringHelper.h" -SetSoundSettings::SetSoundSettings(ZRoom* nZRoom, std::vector<uint8_t> rawData, - uint32_t rawDataIndex) - : ZRoomCommand(nZRoom, rawData, rawDataIndex) +SetSoundSettings::SetSoundSettings(ZFile* nParent) : ZRoomCommand(nParent) { - reverb = rawData[rawDataIndex + 0x01]; - nightTimeSFX = rawData[rawDataIndex + 0x06]; - musicSequence = rawData[rawDataIndex + 0x07]; } -std::string SetSoundSettings::GenerateSourceCodePass1(std::string roomName, uint32_t baseAddress) +void SetSoundSettings::ParseRawData() { - return StringHelper::Sprintf( - "%s 0x%02X, 0x00, 0x00, 0x00, 0x00, 0x%02X, 0x%02X", - ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), reverb, nightTimeSFX, - musicSequence); + ZRoomCommand::ParseRawData(); + reverb = cmdArg1; + nightTimeSFX = parent->GetRawData().at(rawDataIndex + 0x06); + musicSequence = parent->GetRawData().at(rawDataIndex + 0x07); +} + +std::string SetSoundSettings::GetBodySourceCode() const +{ + return StringHelper::Sprintf("SCENE_CMD_SOUND_SETTINGS(%i, %i, %i)", reverb, nightTimeSFX, + musicSequence); } std::string SetSoundSettings::GetCommandCName() const @@ -26,4 +27,4 @@ std::string SetSoundSettings::GetCommandCName() const RoomCommand SetSoundSettings::GetRoomCommand() const { return RoomCommand::SetSoundSettings; -}
\ No newline at end of file +} diff --git a/ZAPD/ZRoom/Commands/SetSoundSettings.h b/ZAPD/ZRoom/Commands/SetSoundSettings.h index 07ee59e..0e35af7 100644 --- a/ZAPD/ZRoom/Commands/SetSoundSettings.h +++ b/ZAPD/ZRoom/Commands/SetSoundSettings.h @@ -1,19 +1,21 @@ #pragma once -#include "../ZRoomCommand.h" +#include "ZRoom/ZRoomCommand.h" class SetSoundSettings : public ZRoomCommand { public: - SetSoundSettings(ZRoom* nZRoom, std::vector<uint8_t> rawData, uint32_t rawDataIndex); + SetSoundSettings(ZFile* nParent); - virtual std::string GenerateSourceCodePass1(std::string roomName, - uint32_t baseAddress) override; - virtual std::string GetCommandCName() const override; - virtual RoomCommand GetRoomCommand() const override; + void ParseRawData() override; + + std::string GetBodySourceCode() const override; + + RoomCommand GetRoomCommand() const override; + std::string GetCommandCName() const override; private: uint8_t reverb; uint8_t nightTimeSFX; uint8_t musicSequence; -};
\ No newline at end of file +}; diff --git a/ZAPD/ZRoom/Commands/SetSpecialObjects.cpp b/ZAPD/ZRoom/Commands/SetSpecialObjects.cpp index e32ea8b..b202c4d 100644 --- a/ZAPD/ZRoom/Commands/SetSpecialObjects.cpp +++ b/ZAPD/ZRoom/Commands/SetSpecialObjects.cpp @@ -1,20 +1,22 @@ #include "SetSpecialObjects.h" -#include "../../BitConverter.h" -#include "../../StringHelper.h" +#include "BitConverter.h" +#include "StringHelper.h" -SetSpecialObjects::SetSpecialObjects(ZRoom* nZRoom, std::vector<uint8_t> rawData, - uint32_t rawDataIndex) - : ZRoomCommand(nZRoom, rawData, rawDataIndex) +SetSpecialObjects::SetSpecialObjects(ZFile* nParent) : ZRoomCommand(nParent) { - elfMessage = rawData[rawDataIndex + 0x01]; - globalObject = BitConverter::ToInt16BE(rawData, rawDataIndex + 6); } -std::string SetSpecialObjects::GenerateSourceCodePass1(std::string roomName, uint32_t baseAddress) +void SetSpecialObjects::ParseRawData() { - return StringHelper::Sprintf( - "%s 0x%02X, 0x%04X", ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), - elfMessage, globalObject); + ZRoomCommand::ParseRawData(); + elfMessage = cmdArg1; + globalObject = BitConverter::ToUInt16BE(parent->GetRawData(), rawDataIndex + 0x06); +} + +std::string SetSpecialObjects::GetBodySourceCode() const +{ + return StringHelper::Sprintf("SCENE_CMD_SPECIAL_FILES(0x%02X, 0x%04X)", elfMessage, + globalObject); } std::string SetSpecialObjects::GetCommandCName() const @@ -25,4 +27,4 @@ std::string SetSpecialObjects::GetCommandCName() const RoomCommand SetSpecialObjects::GetRoomCommand() const { return RoomCommand::SetSpecialObjects; -}
\ No newline at end of file +} diff --git a/ZAPD/ZRoom/Commands/SetSpecialObjects.h b/ZAPD/ZRoom/Commands/SetSpecialObjects.h index 19e4a0a..959133d 100644 --- a/ZAPD/ZRoom/Commands/SetSpecialObjects.h +++ b/ZAPD/ZRoom/Commands/SetSpecialObjects.h @@ -1,18 +1,20 @@ #pragma once -#include "../ZRoomCommand.h" +#include "ZRoom/ZRoomCommand.h" class SetSpecialObjects : public ZRoomCommand { public: - SetSpecialObjects(ZRoom* nZRoom, std::vector<uint8_t> rawData, uint32_t rawDataIndex); + SetSpecialObjects(ZFile* nParent); - virtual std::string GenerateSourceCodePass1(std::string roomName, - uint32_t baseAddress) override; - virtual std::string GetCommandCName() const override; - virtual RoomCommand GetRoomCommand() const override; + void ParseRawData() override; + + std::string GetBodySourceCode() const override; + + RoomCommand GetRoomCommand() const override; + std::string GetCommandCName() const override; private: uint8_t elfMessage; uint16_t globalObject; -};
\ No newline at end of file +}; diff --git a/ZAPD/ZRoom/Commands/SetStartPositionList.cpp b/ZAPD/ZRoom/Commands/SetStartPositionList.cpp index d6745e8..01bd1bf 100644 --- a/ZAPD/ZRoom/Commands/SetStartPositionList.cpp +++ b/ZAPD/ZRoom/Commands/SetStartPositionList.cpp @@ -1,76 +1,57 @@ #include "SetStartPositionList.h" -#include "../../BitConverter.h" -#include "../../Globals.h" -#include "../../StringHelper.h" -#include "../../ZFile.h" -#include "../ZNames.h" -#include "../ZRoom.h" -SetStartPositionList::SetStartPositionList(ZRoom* nZRoom, std::vector<uint8_t> rawData, - uint32_t rawDataIndex) - : ZRoomCommand(nZRoom, rawData, rawDataIndex) -{ - uint8_t numActors = rawData[rawDataIndex + 1]; - segmentOffset = GETSEGOFFSET(BitConverter::ToInt32BE(rawData, rawDataIndex + 4)); +#include "BitConverter.h" +#include "Globals.h" +#include "StringHelper.h" +#include "ZFile.h" +#include "ZRoom/ZNames.h" +#include "ZRoom/ZRoom.h" - if (segmentOffset != 0) - zRoom->parent->AddDeclarationPlaceholder(segmentOffset); +SetStartPositionList::SetStartPositionList(ZFile* nParent) : ZRoomCommand(nParent) +{ +} - actors = std::vector<ActorSpawnEntry*>(); +void SetStartPositionList::ParseRawData() +{ + ZRoomCommand::ParseRawData(); + uint8_t numActors = cmdArg1; uint32_t currentPtr = segmentOffset; for (int32_t i = 0; i < numActors; i++) { - actors.push_back(new ActorSpawnEntry(rawData, currentPtr)); + actors.push_back(ActorSpawnEntry(parent->GetRawData(), currentPtr)); currentPtr += 16; } } -SetStartPositionList::~SetStartPositionList() +void SetStartPositionList::DeclareReferences(const std::string& prefix) { - for (ActorSpawnEntry* entry : actors) - delete entry; -} - -std::string SetStartPositionList::GenerateSourceCodePass1(std::string roomName, - uint32_t baseAddress) -{ - std::string sourceOutput = ""; - - sourceOutput += - StringHelper::Sprintf("%s 0x%02X, (u32)&%sStartPositionList0x%06X", - ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), - actors.size(), zRoom->GetName().c_str(), segmentOffset); - - std::string declaration = ""; - - for (ActorSpawnEntry* entry : actors) + if (!actors.empty()) { - declaration += StringHelper::Sprintf(" { %s, %i, %i, %i, %i, %i, %i, 0x%04X },\n", - ZNames::GetActorName(entry->actorNum).c_str(), - entry->posX, entry->posY, entry->posZ, entry->rotX, - entry->rotY, entry->rotZ, entry->initVar); + std::string declaration = ""; + + size_t index = 0; + for (const auto& entry : actors) + { + declaration += StringHelper::Sprintf(" { %s },", entry.GetBodySourceCode().c_str()); + if (index + 1 < actors.size()) + declaration += "\n"; + + index++; + } + + parent->AddDeclarationArray( + segmentOffset, DeclarationAlignment::Align4, actors.size() * 16, "ActorEntry", + StringHelper::Sprintf("%sStartPositionList0x%06X", prefix.c_str(), segmentOffset), 0, + declaration); } - - zRoom->parent->AddDeclarationArray( - segmentOffset, DeclarationAlignment::None, actors.size() * 16, "ActorEntry", - StringHelper::Sprintf("%sStartPositionList0x%06X", zRoom->GetName().c_str(), segmentOffset), - 0, declaration); - - return sourceOutput; } -std::string SetStartPositionList::GenerateSourceCodePass2(std::string roomName, - uint32_t baseAddress) +std::string SetStartPositionList::GetBodySourceCode() const { - return ""; -} - -std::string SetStartPositionList::GenerateExterns() const -{ - return StringHelper::Sprintf("extern ActorEntry %sStartPositionList0x%06X[];\n", - zRoom->GetName().c_str(), segmentOffset); + std::string listName = parent->GetDeclarationPtrName(cmdArg2); + return StringHelper::Sprintf("SCENE_CMD_SPAWN_LIST(%i, %s)", actors.size(), listName.c_str()); } std::string SetStartPositionList::GetCommandCName() const @@ -81,4 +62,4 @@ std::string SetStartPositionList::GetCommandCName() const RoomCommand SetStartPositionList::GetRoomCommand() const { return RoomCommand::SetStartPositionList; -}
\ No newline at end of file +} diff --git a/ZAPD/ZRoom/Commands/SetStartPositionList.h b/ZAPD/ZRoom/Commands/SetStartPositionList.h index d2cf554..02cf7c6 100644 --- a/ZAPD/ZRoom/Commands/SetStartPositionList.h +++ b/ZAPD/ZRoom/Commands/SetStartPositionList.h @@ -1,24 +1,21 @@ #pragma once -#include "../ZRoomCommand.h" #include "SetActorList.h" +#include "ZRoom/ZRoomCommand.h" class SetStartPositionList : public ZRoomCommand { public: - std::vector<ActorSpawnEntry*> actors; + SetStartPositionList(ZFile* nParent); - SetStartPositionList(ZRoom* nZRoom, std::vector<uint8_t> rawData, uint32_t rawDataIndex); - ~SetStartPositionList(); + void ParseRawData() override; + void DeclareReferences(const std::string& prefix) override; - virtual std::string GenerateSourceCodePass1(std::string roomName, - uint32_t baseAddress) override; - virtual std::string GenerateSourceCodePass2(std::string roomName, - uint32_t baseAddress) override; - virtual std::string GetCommandCName() const override; - virtual std::string GenerateExterns() const override; - virtual RoomCommand GetRoomCommand() const override; + std::string GetBodySourceCode() const override; + + RoomCommand GetRoomCommand() const override; + std::string GetCommandCName() const override; private: - uint32_t segmentOffset; -};
\ No newline at end of file + std::vector<ActorSpawnEntry> actors; +}; diff --git a/ZAPD/ZRoom/Commands/SetTimeSettings.cpp b/ZAPD/ZRoom/Commands/SetTimeSettings.cpp index 582a078..708c421 100644 --- a/ZAPD/ZRoom/Commands/SetTimeSettings.cpp +++ b/ZAPD/ZRoom/Commands/SetTimeSettings.cpp @@ -1,20 +1,22 @@ #include "SetTimeSettings.h" -#include "../../BitConverter.h" -#include "../../StringHelper.h" +#include "BitConverter.h" +#include "StringHelper.h" -SetTimeSettings::SetTimeSettings(ZRoom* nZRoom, std::vector<uint8_t> rawData, uint32_t rawDataIndex) - : ZRoomCommand(nZRoom, rawData, rawDataIndex) +SetTimeSettings::SetTimeSettings(ZFile* nParent) : ZRoomCommand(nParent) { - hour = rawData[rawDataIndex + 4]; - min = rawData[rawDataIndex + 5]; - unk = rawData[rawDataIndex + 6]; } -std::string SetTimeSettings::GenerateSourceCodePass1(std::string roomName, uint32_t baseAddress) +void SetTimeSettings::ParseRawData() { - return StringHelper::Sprintf( - "%s 0x00, 0x00, 0x00, 0x%02X, 0x%02X, 0x%02X", - ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), hour, min, unk); + ZRoomCommand::ParseRawData(); + hour = parent->GetRawData().at(rawDataIndex + 4); + min = parent->GetRawData().at(rawDataIndex + 5); + unk = parent->GetRawData().at(rawDataIndex + 6); +} + +std::string SetTimeSettings::GetBodySourceCode() const +{ + return StringHelper::Sprintf("SCENE_CMD_TIME_SETTINGS(%i, %i, %i)", hour, min, unk); } std::string SetTimeSettings::GetCommandCName() const @@ -25,4 +27,4 @@ std::string SetTimeSettings::GetCommandCName() const RoomCommand SetTimeSettings::GetRoomCommand() const { return RoomCommand::SetTimeSettings; -}
\ No newline at end of file +} diff --git a/ZAPD/ZRoom/Commands/SetTimeSettings.h b/ZAPD/ZRoom/Commands/SetTimeSettings.h index 92c52a7..cafafc1 100644 --- a/ZAPD/ZRoom/Commands/SetTimeSettings.h +++ b/ZAPD/ZRoom/Commands/SetTimeSettings.h @@ -1,22 +1,21 @@ #pragma once -#include "../ZRoomCommand.h" +#include "ZRoom/ZRoomCommand.h" class SetTimeSettings : public ZRoomCommand { public: - SetTimeSettings(ZRoom* nZRoom, std::vector<uint8_t> rawData, uint32_t rawDataIndex); + SetTimeSettings(ZFile* nParent); - virtual std::string GenerateSourceCodePass1(std::string roomName, - uint32_t baseAddress) override; - virtual std::string GetCommandCName() const override; - virtual RoomCommand GetRoomCommand() const override; + void ParseRawData() override; -private: - // uint16_t time; - // int8_t speed; + std::string GetBodySourceCode() const override; + + std::string GetCommandCName() const override; + RoomCommand GetRoomCommand() const override; +private: uint8_t hour; uint8_t min; uint8_t unk; -};
\ No newline at end of file +}; diff --git a/ZAPD/ZRoom/Commands/SetTransitionActorList.cpp b/ZAPD/ZRoom/Commands/SetTransitionActorList.cpp index 431c1a2..9d70e6d 100644 --- a/ZAPD/ZRoom/Commands/SetTransitionActorList.cpp +++ b/ZAPD/ZRoom/Commands/SetTransitionActorList.cpp @@ -1,75 +1,59 @@ #include "SetTransitionActorList.h" -#include "../../BitConverter.h" -#include "../../Globals.h" -#include "../../StringHelper.h" -#include "../../ZFile.h" -#include "../ZNames.h" -#include "../ZRoom.h" - -SetTransitionActorList::SetTransitionActorList(ZRoom* nZRoom, std::vector<uint8_t> rawData, - uint32_t rawDataIndex) - : ZRoomCommand(nZRoom, rawData, rawDataIndex) -{ - int32_t numActors = rawData[rawDataIndex + 1]; - segmentOffset = BitConverter::ToInt32BE(rawData, rawDataIndex + 4) & 0x00FFFFFF; - transitionActors = std::vector<TransitionActorEntry*>(); +#include "BitConverter.h" +#include "Globals.h" +#include "StringHelper.h" +#include "ZFile.h" +#include "ZRoom/ZNames.h" +#include "ZRoom/ZRoom.h" +SetTransitionActorList::SetTransitionActorList(ZFile* nParent) : ZRoomCommand(nParent) +{ +} + +void SetTransitionActorList::ParseRawData() +{ + ZRoomCommand::ParseRawData(); + int numActors = cmdArg1; uint32_t currentPtr = segmentOffset; for (int32_t i = 0; i < numActors; i++) { - TransitionActorEntry* entry = new TransitionActorEntry(rawData, currentPtr); + TransitionActorEntry entry(parent->GetRawData(), currentPtr); transitionActors.push_back(entry); currentPtr += 16; } } -SetTransitionActorList::~SetTransitionActorList() -{ - for (TransitionActorEntry* actor : transitionActors) - delete actor; -} - -std::string SetTransitionActorList::GetSourceOutputCode(std::string prefix) -{ - return ""; -} - -std::string SetTransitionActorList::GenerateSourceCodePass1(std::string roomName, - uint32_t baseAddress) +void SetTransitionActorList::DeclareReferences(const std::string& prefix) { - std::string sourceOutput = - StringHelper::Sprintf("%s 0x%02X, (u32)%sTransitionActorList0x%06X", - ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), - transitionActors.size(), roomName.c_str(), segmentOffset); std::string declaration = ""; - for (TransitionActorEntry* entry : transitionActors) + size_t index = 0; + for (const auto& entry : transitionActors) { - std::string actorStr = ZNames::GetActorName(entry->actorNum); + declaration += StringHelper::Sprintf(" { %s },", entry.GetBodySourceCode().c_str()); + if (index + 1 < transitionActors.size()) + { + declaration += "\n"; + } - declaration += StringHelper::Sprintf( - " { %i, %i, %i, %i, %s, %i, %i, %i, %i, 0x%04X }, \n", entry->frontObjectRoom, - entry->frontTransitionReaction, entry->backObjectRoom, entry->backTransitionReaction, - actorStr.c_str(), entry->posX, entry->posY, entry->posZ, entry->rotY, - (uint16_t)entry->initVar); + index++; } - zRoom->parent->AddDeclarationArray( + parent->AddDeclarationArray( segmentOffset, DeclarationAlignment::None, transitionActors.size() * 16, "TransitionActorEntry", - StringHelper::Sprintf("%sTransitionActorList0x%06X", roomName.c_str(), segmentOffset), 0, + StringHelper::Sprintf("%sTransitionActorList_%06X", prefix.c_str(), segmentOffset), 0, declaration); - - return sourceOutput; } -std::string SetTransitionActorList::GenerateSourceCodePass2(std::string roomName, - uint32_t baseAddress) +std::string SetTransitionActorList::GetBodySourceCode() const { - return ""; + std::string listName = parent->GetDeclarationPtrName(cmdArg2); + return StringHelper::Sprintf("SCENE_CMD_TRANSITION_ACTOR_LIST(%i, %s)", transitionActors.size(), + listName.c_str()); } size_t SetTransitionActorList::GetRawDataSize() const @@ -77,12 +61,6 @@ size_t SetTransitionActorList::GetRawDataSize() const return ZRoomCommand::GetRawDataSize() + (transitionActors.size() * 16); } -std::string SetTransitionActorList::GenerateExterns() const -{ - return StringHelper::Sprintf("extern TransitionActorEntry %sTransitionActorList0x%06X[];\n", - zRoom->GetName().c_str(), segmentOffset); -} - std::string SetTransitionActorList::GetCommandCName() const { return "SCmdTransiActorList"; @@ -93,7 +71,7 @@ RoomCommand SetTransitionActorList::GetRoomCommand() const return RoomCommand::SetTransitionActorList; } -TransitionActorEntry::TransitionActorEntry(std::vector<uint8_t> rawData, uint32_t rawDataIndex) +TransitionActorEntry::TransitionActorEntry(const std::vector<uint8_t>& rawData, int rawDataIndex) { frontObjectRoom = rawData[rawDataIndex + 0]; frontTransitionReaction = rawData[rawDataIndex + 1]; @@ -105,4 +83,13 @@ TransitionActorEntry::TransitionActorEntry(std::vector<uint8_t> rawData, uint32_ posZ = BitConverter::ToInt16BE(rawData, rawDataIndex + 10); rotY = BitConverter::ToInt16BE(rawData, rawDataIndex + 12); initVar = BitConverter::ToInt16BE(rawData, rawDataIndex + 14); -}
\ No newline at end of file +} + +std::string TransitionActorEntry::GetBodySourceCode() const +{ + std::string actorStr = ZNames::GetActorName(actorNum); + + return StringHelper::Sprintf("%i, %i, %i, %i, %s, %i, %i, %i, %i, 0x%04X", frontObjectRoom, + frontTransitionReaction, backObjectRoom, backTransitionReaction, + actorStr.c_str(), posX, posY, posZ, rotY, initVar); +} diff --git a/ZAPD/ZRoom/Commands/SetTransitionActorList.h b/ZAPD/ZRoom/Commands/SetTransitionActorList.h index 5dbbf58..dba7a80 100644 --- a/ZAPD/ZRoom/Commands/SetTransitionActorList.h +++ b/ZAPD/ZRoom/Commands/SetTransitionActorList.h @@ -1,10 +1,15 @@ #pragma once -#include "../ZRoomCommand.h" +#include "ZRoom/ZRoomCommand.h" class TransitionActorEntry { public: + TransitionActorEntry(const std::vector<uint8_t>& rawData, int rawDataIndex); + + std::string GetBodySourceCode() const; + +protected: uint8_t frontObjectRoom; uint8_t frontTransitionReaction; uint8_t backObjectRoom; @@ -13,27 +18,22 @@ public: int16_t posX, posY, posZ; int16_t rotY; uint16_t initVar; - - TransitionActorEntry(std::vector<uint8_t> rawData, uint32_t rawDataIndex); }; class SetTransitionActorList : public ZRoomCommand { public: - SetTransitionActorList(ZRoom* nZRoom, std::vector<uint8_t> rawData, uint32_t rawDataIndex); - ~SetTransitionActorList(); - - std::string GetSourceOutputCode(std::string prefix); - virtual std::string GenerateSourceCodePass1(std::string roomName, - uint32_t baseAddress) override; - virtual std::string GenerateSourceCodePass2(std::string roomName, - uint32_t baseAddress) override; - virtual RoomCommand GetRoomCommand() const override; - virtual size_t GetRawDataSize() const override; - virtual std::string GetCommandCName() const override; - virtual std::string GenerateExterns() const override; + SetTransitionActorList(ZFile* nParent); + + void ParseRawData() override; + void DeclareReferences(const std::string& prefix) override; + + std::string GetBodySourceCode() const override; + + RoomCommand GetRoomCommand() const override; + size_t GetRawDataSize() const override; + std::string GetCommandCName() const override; private: - std::vector<TransitionActorEntry*> transitionActors; - uint32_t segmentOffset; -};
\ No newline at end of file + std::vector<TransitionActorEntry> transitionActors; +}; diff --git a/ZAPD/ZRoom/Commands/SetWind.cpp b/ZAPD/ZRoom/Commands/SetWind.cpp index 26d668f..3b50c81 100644 --- a/ZAPD/ZRoom/Commands/SetWind.cpp +++ b/ZAPD/ZRoom/Commands/SetWind.cpp @@ -1,21 +1,24 @@ #include "SetWind.h" -#include "../../StringHelper.h" +#include "StringHelper.h" -SetWind::SetWind(ZRoom* nZRoom, std::vector<uint8_t> rawData, uint32_t rawDataIndex) - : ZRoomCommand(nZRoom, rawData, rawDataIndex) +SetWind::SetWind(ZFile* nParent) : ZRoomCommand(nParent) { - windWest = rawData[rawDataIndex + 0x04]; - windVertical = rawData[rawDataIndex + 0x05]; - windSouth = rawData[rawDataIndex + 0x06]; - clothFlappingStrength = rawData[rawDataIndex + 0x07]; } -std::string SetWind::GenerateSourceCodePass1(std::string roomName, uint32_t baseAddress) +void SetWind::ParseRawData() { - return StringHelper::Sprintf( - "%s 0x00, 0x00, 0x00, 0x%02X, 0x%02X, 0x%02X, 0x%02X", - ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), windWest, - windVertical, windSouth, clothFlappingStrength); + ZRoomCommand::ParseRawData(); + auto& parentRawData = parent->GetRawData(); + windWest = parentRawData.at(rawDataIndex + 0x04); + windVertical = parentRawData.at(rawDataIndex + 0x05); + windSouth = parentRawData.at(rawDataIndex + 0x06); + clothFlappingStrength = parentRawData.at(rawDataIndex + 0x07); +} + +std::string SetWind::GetBodySourceCode() const +{ + return StringHelper::Sprintf("SCENE_CMD_WIND_SETTINGS(%i, %i, %i, %i)", windWest, windVertical, + windSouth, clothFlappingStrength); } std::string SetWind::GetCommandCName() const @@ -26,4 +29,4 @@ std::string SetWind::GetCommandCName() const RoomCommand SetWind::GetRoomCommand() const { return RoomCommand::SetWind; -}
\ No newline at end of file +} diff --git a/ZAPD/ZRoom/Commands/SetWind.h b/ZAPD/ZRoom/Commands/SetWind.h index 30af2e9..8e00b4f 100644 --- a/ZAPD/ZRoom/Commands/SetWind.h +++ b/ZAPD/ZRoom/Commands/SetWind.h @@ -1,20 +1,22 @@ #pragma once -#include "../ZRoomCommand.h" +#include "ZRoom/ZRoomCommand.h" class SetWind : public ZRoomCommand { public: - SetWind(ZRoom* nZRoom, std::vector<uint8_t> rawData, uint32_t rawDataIndex); + SetWind(ZFile* nParent); - virtual std::string GenerateSourceCodePass1(std::string roomName, - uint32_t baseAddress) override; - virtual std::string GetCommandCName() const override; - virtual RoomCommand GetRoomCommand() const override; + void ParseRawData() override; + + std::string GetBodySourceCode() const override; + + std::string GetCommandCName() const override; + RoomCommand GetRoomCommand() const override; private: uint8_t windWest; uint8_t windVertical; uint8_t windSouth; uint8_t clothFlappingStrength; -};
\ No newline at end of file +}; diff --git a/ZAPD/ZRoom/Commands/SetWorldMapVisited.cpp b/ZAPD/ZRoom/Commands/SetWorldMapVisited.cpp index 78bfb81..4420c9d 100644 --- a/ZAPD/ZRoom/Commands/SetWorldMapVisited.cpp +++ b/ZAPD/ZRoom/Commands/SetWorldMapVisited.cpp @@ -1,16 +1,14 @@ #include "SetWorldMapVisited.h" -#include "../../StringHelper.h" -SetWorldMapVisited::SetWorldMapVisited(ZRoom* nZRoom, std::vector<uint8_t> rawData, - uint32_t rawDataIndex) - : ZRoomCommand(nZRoom, rawData, rawDataIndex) +#include "StringHelper.h" + +SetWorldMapVisited::SetWorldMapVisited(ZFile* nParent) : ZRoomCommand(nParent) { } -std::string SetWorldMapVisited::GenerateSourceCodePass1(std::string roomName, uint32_t baseAddress) +std::string SetWorldMapVisited::GetBodySourceCode() const { - return StringHelper::Sprintf( - "%s 0x00, 0x00", ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str()); + return "SCENE_CMD_MISC_SETTINGS()"; } std::string SetWorldMapVisited::GetCommandCName() const @@ -21,4 +19,4 @@ std::string SetWorldMapVisited::GetCommandCName() const RoomCommand SetWorldMapVisited::GetRoomCommand() const { return RoomCommand::SetWorldMapVisited; -}
\ No newline at end of file +} diff --git a/ZAPD/ZRoom/Commands/SetWorldMapVisited.h b/ZAPD/ZRoom/Commands/SetWorldMapVisited.h index 497b082..a7ad931 100644 --- a/ZAPD/ZRoom/Commands/SetWorldMapVisited.h +++ b/ZAPD/ZRoom/Commands/SetWorldMapVisited.h @@ -1,16 +1,14 @@ #pragma once -#include "../ZRoomCommand.h" +#include "ZRoom/ZRoomCommand.h" class SetWorldMapVisited : public ZRoomCommand { public: - SetWorldMapVisited(ZRoom* nZRoom, std::vector<uint8_t> rawData, uint32_t rawDataIndex); + SetWorldMapVisited(ZFile* nParent); - virtual std::string GenerateSourceCodePass1(std::string roomName, - uint32_t baseAddress) override; - virtual std::string GetCommandCName() const override; - virtual RoomCommand GetRoomCommand() const override; + std::string GetBodySourceCode() const override; -private: -};
\ No newline at end of file + RoomCommand GetRoomCommand() const override; + std::string GetCommandCName() const override; +}; diff --git a/ZAPD/ZRoom/Commands/Unused09.cpp b/ZAPD/ZRoom/Commands/Unused09.cpp index b3ccc31..69db353 100644 --- a/ZAPD/ZRoom/Commands/Unused09.cpp +++ b/ZAPD/ZRoom/Commands/Unused09.cpp @@ -1,15 +1,13 @@ #include "Unused09.h" -#include "../../StringHelper.h" +#include "StringHelper.h" -Unused09::Unused09(ZRoom* nZRoom, std::vector<uint8_t> rawData, uint32_t rawDataIndex) - : ZRoomCommand(nZRoom, rawData, rawDataIndex) +Unused09::Unused09(ZFile* nParent) : ZRoomCommand(nParent) { } -std::string Unused09::GenerateSourceCodePass1(std::string roomName, uint32_t baseAddress) +std::string Unused09::GetBodySourceCode() const { - return StringHelper::Sprintf( - "%s 0x00, 0x00", ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str()); + return StringHelper::Sprintf("{ %s, 0x00, 0x00 }", GetCommandHex().c_str()); } std::string Unused09::GetCommandCName() const @@ -20,4 +18,4 @@ std::string Unused09::GetCommandCName() const RoomCommand Unused09::GetRoomCommand() const { return RoomCommand::Unused09; -}
\ No newline at end of file +} diff --git a/ZAPD/ZRoom/Commands/Unused09.h b/ZAPD/ZRoom/Commands/Unused09.h index abadc1d..a38985e 100644 --- a/ZAPD/ZRoom/Commands/Unused09.h +++ b/ZAPD/ZRoom/Commands/Unused09.h @@ -1,16 +1,14 @@ #pragma once -#include "../ZRoomCommand.h" +#include "ZRoom/ZRoomCommand.h" class Unused09 : public ZRoomCommand { public: - Unused09(ZRoom* nZRoom, std::vector<uint8_t> rawData, uint32_t rawDataIndex); + Unused09(ZFile* nParent); - virtual std::string GenerateSourceCodePass1(std::string roomName, - uint32_t baseAddress) override; - virtual std::string GetCommandCName() const override; - virtual RoomCommand GetRoomCommand() const override; + std::string GetBodySourceCode() const override; -private: -};
\ No newline at end of file + RoomCommand GetRoomCommand() const override; + std::string GetCommandCName() const override; +}; diff --git a/ZAPD/ZRoom/Commands/Unused1D.cpp b/ZAPD/ZRoom/Commands/Unused1D.cpp index efeaa7b..14ac6e4 100644 --- a/ZAPD/ZRoom/Commands/Unused1D.cpp +++ b/ZAPD/ZRoom/Commands/Unused1D.cpp @@ -1,15 +1,13 @@ #include "Unused1D.h" -#include "../../StringHelper.h" +#include "StringHelper.h" -Unused1D::Unused1D(ZRoom* nZRoom, std::vector<uint8_t> rawData, uint32_t rawDataIndex) - : ZRoomCommand(nZRoom, rawData, rawDataIndex) +Unused1D::Unused1D(ZFile* nParent) : ZRoomCommand(nParent) { } -std::string Unused1D::GenerateSourceCodePass1(std::string roomName, uint32_t baseAddress) +std::string Unused1D::GetBodySourceCode() const { - return StringHelper::Sprintf( - "%s 0x00, 0x00", ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str()); + return StringHelper::Sprintf("{ %s, 0x00, 0x00 }", GetCommandHex().c_str()); } std::string Unused1D::GetCommandCName() const @@ -20,4 +18,4 @@ std::string Unused1D::GetCommandCName() const RoomCommand Unused1D::GetRoomCommand() const { return RoomCommand::Unused1D; -}
\ No newline at end of file +} diff --git a/ZAPD/ZRoom/Commands/Unused1D.h b/ZAPD/ZRoom/Commands/Unused1D.h index 2a6c2eb..dea0f98 100644 --- a/ZAPD/ZRoom/Commands/Unused1D.h +++ b/ZAPD/ZRoom/Commands/Unused1D.h @@ -1,16 +1,14 @@ #pragma once -#include "../ZRoomCommand.h" +#include "ZRoom/ZRoomCommand.h" class Unused1D : public ZRoomCommand { public: - Unused1D(ZRoom* nZRoom, std::vector<uint8_t> rawData, uint32_t rawDataIndex); + Unused1D(ZFile* nParent); - virtual std::string GenerateSourceCodePass1(std::string roomName, - uint32_t baseAddress) override; - virtual std::string GetCommandCName() const override; - virtual RoomCommand GetRoomCommand() const override; + std::string GetBodySourceCode() const override; -private: -};
\ No newline at end of file + RoomCommand GetRoomCommand() const override; + std::string GetCommandCName() const override; +}; diff --git a/ZAPD/ZRoom/Commands/ZRoomCommandUnk.cpp b/ZAPD/ZRoom/Commands/ZRoomCommandUnk.cpp index 897a3c7..3f35c13 100644 --- a/ZAPD/ZRoom/Commands/ZRoomCommandUnk.cpp +++ b/ZAPD/ZRoom/Commands/ZRoomCommandUnk.cpp @@ -1,52 +1,20 @@ #include "ZRoomCommandUnk.h" -#include "../../StringHelper.h" #include "BitConverter.h" +#include "StringHelper.h" +#include "ZRoom/ZRoom.h" -ZRoomCommandUnk::ZRoomCommandUnk(ZRoom* nZRoom, std::vector<uint8_t> rawData, uint32_t rawDataIndex) - : ZRoomCommand(nZRoom, rawData, rawDataIndex) +ZRoomCommandUnk::ZRoomCommandUnk(ZFile* nParent) : ZRoomCommand(nParent) { - cmdID = (RoomCommand)rawData[rawDataIndex]; - cmdAddress = rawDataIndex; - zRoom = nZRoom; - - data1 = rawData[rawDataIndex + 1]; - data2 = BitConverter::ToInt32BE(rawData, rawDataIndex + 4); } -std::string ZRoomCommandUnk::GenerateSourceCodePass1(std::string roomName, uint32_t baseAddress) +std::string ZRoomCommandUnk::GetBodySourceCode() const { - return StringHelper::Sprintf("%s %sSet%04XCmd%02X = { 0x%02X, 0x%02X, 0x%06X }; /* WARNING: " + return StringHelper::Sprintf("{ %s, 0x%02X, 0x%06X } /* WARNING: " "UNIMPLEMENTED ROOM COMMAND */", - GetCommandCName().c_str(), roomName.c_str(), baseAddress, data2, - cmdID, data1, data2); -} - -std::string ZRoomCommandUnk::GenerateSourceCodePass2(std::string roomName, uint32_t baseAddress) -{ - return ""; -} - -std::string ZRoomCommandUnk::GenerateSourceCodePass3(std::string roomName) -{ - return ""; -} - -std::string ZRoomCommandUnk::GenerateExterns() const -{ - return ""; -} - -size_t ZRoomCommandUnk::GetRawDataSize() const -{ - return 8; -} - -std::string ZRoomCommandUnk::GetCommandCName() const -{ - return "SCmdBase"; + GetCommandHex().c_str(), cmdArg1, cmdArg2); } RoomCommand ZRoomCommandUnk::GetRoomCommand() const { return RoomCommand::Error; -}
\ No newline at end of file +} diff --git a/ZAPD/ZRoom/Commands/ZRoomCommandUnk.h b/ZAPD/ZRoom/Commands/ZRoomCommandUnk.h index 11c3cca..e381fe5 100644 --- a/ZAPD/ZRoom/Commands/ZRoomCommandUnk.h +++ b/ZAPD/ZRoom/Commands/ZRoomCommandUnk.h @@ -1,29 +1,12 @@ #pragma once -#include "../ZRoomCommand.h" +#include "ZRoom/ZRoomCommand.h" class ZRoomCommandUnk : public ZRoomCommand { public: - RoomCommand cmdID; - int32_t cmdAddress; - int32_t cmdIndex; - int32_t cmdSet; - uint32_t commandSet; - uint8_t data1; - uint32_t data2; + ZRoomCommandUnk(ZFile* nParent); - ZRoomCommandUnk(ZRoom* nZRoom, std::vector<uint8_t> rawData, uint32_t rawDataIndex); + std::string GetBodySourceCode() const override; - virtual std::string GenerateSourceCodePass1(std::string roomName, - uint32_t baseAddress) override; - virtual std::string GenerateSourceCodePass2(std::string roomName, - uint32_t baseAddress) override; - virtual std::string GenerateSourceCodePass3(std::string roomName) override; - virtual RoomCommand GetRoomCommand() const override; - virtual size_t GetRawDataSize() const override; - virtual std::string GetCommandCName() const override; - virtual std::string GenerateExterns() const override; - -protected: - ZRoom* zRoom; -};
\ No newline at end of file + RoomCommand GetRoomCommand() const override; +}; diff --git a/ZAPD/ZRoom/ZNames.h b/ZAPD/ZRoom/ZNames.h index 6b99cd3..bee0386 100644 --- a/ZAPD/ZRoom/ZNames.h +++ b/ZAPD/ZRoom/ZNames.h @@ -1,10 +1,10 @@ #pragma once -#include "../Globals.h" -#include "../StringHelper.h" - #include <string> +#include "Globals.h" +#include "StringHelper.h" + class ZNames { public: diff --git a/ZAPD/ZRoom/ZRoom.cpp b/ZAPD/ZRoom/ZRoom.cpp index b24175a..7e4a79a 100644 --- a/ZAPD/ZRoom/ZRoom.cpp +++ b/ZAPD/ZRoom/ZRoom.cpp @@ -10,7 +10,7 @@ #include "Commands/SetActorCutsceneList.h" #include "Commands/SetActorList.h" #include "Commands/SetAlternateHeaders.h" -#include "Commands/SetAnimatedTextureList.h" +#include "Commands/SetAnimatedMaterialList.h" #include "Commands/SetCameraSettings.h" #include "Commands/SetCollisionHeader.h" #include "Commands/SetCsCamera.h" @@ -49,8 +49,6 @@ REGISTER_ZFILENODE(Scene, ZRoom); ZRoom::ZRoom(ZFile* nParent) : ZResource(nParent) { - extDefines = ""; - scene = nullptr; roomCount = -1; canHaveInner = true; } @@ -142,9 +140,12 @@ void ZRoom::ExtractFromXML(tinyxml2::XMLElement* reader, const std::vector<uint8 std::string addressStr = child->Attribute("Offset"); int32_t address = strtol(StringHelper::Split(addressStr, "0x")[1].c_str(), NULL, 16); - ZSetPathways* pathway = new ZSetPathways(this, rawData, address, false); - pathway->GenerateSourceCodePass1(name, 0); - pathway->GenerateSourceCodePass2(name, 0); + // TODO: add this to command set + ZPath* pathway = new ZPath(parent); + pathway->SetRawDataIndex(address); + pathway->ParseRawData(); + pathway->DeclareReferences(name); + pathway->GetSourceOutputCode(name); delete pathway; } @@ -159,7 +160,6 @@ void ZRoom::ExtractFromXML(tinyxml2::XMLElement* reader, const std::vector<uint8 #endif } - // ParseCommands(rawDataIndex); commandSets.push_back(CommandSet(rawDataIndex, cmdCount)); ProcessCommandSets(); } @@ -177,7 +177,7 @@ void ZRoom::ParseCommands(std::vector<ZRoomCommand*>& commandList, CommandSet co if (commandsLeft <= 0) break; - RoomCommand opcode = (RoomCommand)rawData[rawDataIndex]; + RoomCommand opcode = static_cast<RoomCommand>(rawData.at(rawDataIndex)); ZRoomCommand* cmd = nullptr; @@ -186,105 +186,108 @@ void ZRoom::ParseCommands(std::vector<ZRoomCommand*>& commandList, CommandSet co switch (opcode) { case RoomCommand::SetStartPositionList: - cmd = new SetStartPositionList(this, rawData, rawDataIndex); + cmd = new SetStartPositionList(parent); break; // 0x00 case RoomCommand::SetActorList: - cmd = new SetActorList(this, rawData, rawDataIndex); + cmd = new SetActorList(parent); break; // 0x01 case RoomCommand::SetCsCamera: - cmd = new SetCsCamera(this, rawData, rawDataIndex); + cmd = new SetCsCamera(parent); break; // 0x02 (MM-ONLY) case RoomCommand::SetCollisionHeader: - cmd = new SetCollisionHeader(this, rawData, rawDataIndex); + cmd = new SetCollisionHeader(parent); break; // 0x03 case RoomCommand::SetRoomList: - cmd = new SetRoomList(this, rawData, rawDataIndex); + cmd = new SetRoomList(parent); break; // 0x04 case RoomCommand::SetWind: - cmd = new SetWind(this, rawData, rawDataIndex); + cmd = new SetWind(parent); break; // 0x05 case RoomCommand::SetEntranceList: - cmd = new SetEntranceList(this, rawData, rawDataIndex); + cmd = new SetEntranceList(parent); break; // 0x06 case RoomCommand::SetSpecialObjects: - cmd = new SetSpecialObjects(this, rawData, rawDataIndex); + cmd = new SetSpecialObjects(parent); break; // 0x07 case RoomCommand::SetRoomBehavior: - cmd = new SetRoomBehavior(this, rawData, rawDataIndex); + cmd = new SetRoomBehavior(parent); break; // 0x08 case RoomCommand::Unused09: - cmd = new Unused09(this, rawData, rawDataIndex); + cmd = new Unused09(parent); break; // 0x09 case RoomCommand::SetMesh: - cmd = new SetMesh(this, rawData, rawDataIndex, 0); + cmd = new SetMesh(parent); break; // 0x0A case RoomCommand::SetObjectList: - cmd = new SetObjectList(this, rawData, rawDataIndex); + cmd = new SetObjectList(parent); break; // 0x0B case RoomCommand::SetLightList: - cmd = new SetLightList(this, rawData, rawDataIndex); + cmd = new SetLightList(parent); break; // 0x0C (MM-ONLY) case RoomCommand::SetPathways: - cmd = new ZSetPathways(this, rawData, rawDataIndex, true); + cmd = new SetPathways(parent); break; // 0x0D case RoomCommand::SetTransitionActorList: - cmd = new SetTransitionActorList(this, rawData, rawDataIndex); + cmd = new SetTransitionActorList(parent); break; // 0x0E case RoomCommand::SetLightingSettings: - cmd = new SetLightingSettings(this, rawData, rawDataIndex); + cmd = new SetLightingSettings(parent); break; // 0x0F case RoomCommand::SetTimeSettings: - cmd = new SetTimeSettings(this, rawData, rawDataIndex); + cmd = new SetTimeSettings(parent); break; // 0x10 case RoomCommand::SetSkyboxSettings: - cmd = new SetSkyboxSettings(this, rawData, rawDataIndex); + cmd = new SetSkyboxSettings(parent); break; // 0x11 case RoomCommand::SetSkyboxModifier: - cmd = new SetSkyboxModifier(this, rawData, rawDataIndex); + cmd = new SetSkyboxModifier(parent); break; // 0x12 case RoomCommand::SetExitList: - cmd = new SetExitList(this, rawData, rawDataIndex); + cmd = new SetExitList(parent); break; // 0x13 case RoomCommand::EndMarker: - cmd = new EndMarker(this, rawData, rawDataIndex); + cmd = new EndMarker(parent); break; // 0x14 case RoomCommand::SetSoundSettings: - cmd = new SetSoundSettings(this, rawData, rawDataIndex); + cmd = new SetSoundSettings(parent); break; // 0x15 case RoomCommand::SetEchoSettings: - cmd = new SetEchoSettings(this, rawData, rawDataIndex); + cmd = new SetEchoSettings(parent); break; // 0x16 case RoomCommand::SetCutscenes: - cmd = new SetCutscenes(this, rawData, rawDataIndex); + cmd = new SetCutscenes(parent); break; // 0x17 case RoomCommand::SetAlternateHeaders: - cmd = new SetAlternateHeaders(this, rawData, rawDataIndex); + cmd = new SetAlternateHeaders(parent); break; // 0x18 case RoomCommand::SetCameraSettings: if (Globals::Instance->game == ZGame::MM_RETAIL) - cmd = new SetWorldMapVisited(this, rawData, rawDataIndex); + cmd = new SetWorldMapVisited(parent); else - cmd = new SetCameraSettings(this, rawData, rawDataIndex); + cmd = new SetCameraSettings(parent); break; // 0x19 - case RoomCommand::SetAnimatedTextureList: - cmd = new SetAnimatedTextureList(this, rawData, rawDataIndex); + case RoomCommand::SetAnimatedMaterialList: + cmd = new SetAnimatedMaterialList(parent); break; // 0x1A (MM-ONLY) case RoomCommand::SetActorCutsceneList: - cmd = new SetActorCutsceneList(this, rawData, rawDataIndex); + cmd = new SetActorCutsceneList(parent); break; // 0x1B (MM-ONLY) case RoomCommand::SetMinimapList: - cmd = new SetMinimapList(this, rawData, rawDataIndex); + cmd = new SetMinimapList(parent); break; // 0x1C (MM-ONLY) case RoomCommand::Unused1D: - cmd = new Unused1D(this, rawData, rawDataIndex); + cmd = new Unused1D(parent); break; // 0x1D case RoomCommand::SetMinimapChests: - cmd = new SetMinimapChests(this, rawData, rawDataIndex); + cmd = new SetMinimapChests(parent); break; // 0x1E (MM-ONLY) default: - cmd = new ZRoomCommandUnk(this, rawData, rawDataIndex); + cmd = new ZRoomCommandUnk(parent); } + cmd->ExtractCommandFromRoom(this, rawDataIndex); + cmd->DeclareReferences(GetName()); + auto end = std::chrono::steady_clock::now(); auto diff = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count(); @@ -295,7 +298,6 @@ void ZRoom::ParseCommands(std::vector<ZRoomCommand*>& commandList, CommandSet co } cmd->cmdIndex = currentIndex; - cmd->cmdSet = rawDataIndex; commandList.push_back(cmd); @@ -319,40 +321,37 @@ void ZRoom::ProcessCommandSets() ParseCommands(setCommands, commandSets[0]); commandSets.erase(commandSets.begin()); - for (size_t i = 0; i < setCommands.size(); i++) + for (auto& cmd : setCommands) { - ZRoomCommand* cmd = setCommands[i]; - cmd->commandSet = commandSet & 0x00FFFFFF; - std::string pass1 = cmd->GenerateSourceCodePass1(name, cmd->commandSet); - - Declaration* decl = parent->AddDeclaration( - cmd->cmdAddress, - i == 0 ? DeclarationAlignment::Align16 : DeclarationAlignment::None, 8, - StringHelper::Sprintf("static %s", cmd->GetCommandCName().c_str()), - StringHelper::Sprintf("%sSet%04XCmd%02X", name.c_str(), commandSet & 0x00FFFFFF, - cmd->cmdIndex, cmd->cmdID), - StringHelper::Sprintf("\n %s\n", pass1.c_str())); - - decl->rightText = StringHelper::Sprintf("// 0x%04X", cmd->cmdAddress); + cmd->ParseRawDataLate(); + cmd->DeclareReferencesLate(name); } - sourceOutput += "\n"; + if (!setCommands.empty()) + { + std::string declaration = ""; - for (ZRoomCommand* cmd : setCommands) - commands.push_back(cmd); - } + for (size_t i = 0; i < setCommands.size(); i++) + { + ZRoomCommand* cmd = setCommands[i]; + cmd->commandSet = GETSEGOFFSET(commandSet); + declaration += StringHelper::Sprintf("\t%s,", cmd->GetBodySourceCode().c_str()); - for (ZRoomCommand* cmd : commands) - { - std::string pass2 = cmd->GenerateSourceCodePass2(name, cmd->commandSet); - - if (pass2 != "") - parent->AddDeclaration( - cmd->cmdAddress, DeclarationAlignment::None, 8, - StringHelper::Sprintf("static %s", cmd->GetCommandCName().c_str()), - StringHelper::Sprintf("%sSet%04XCmd%02X", name.c_str(), - cmd->commandSet & 0x00FFFFFF, cmd->cmdIndex, cmd->cmdID), - StringHelper::Sprintf("%s // 0x%04X", pass2.c_str(), cmd->cmdAddress)); + if (i + 1 < setCommands.size()) + declaration += "\n"; + } + + parent->AddDeclarationArray( + GETSEGOFFSET(commandSet), DeclarationAlignment::Align16, 8 * setCommands.size(), + "static SCmdBase", + StringHelper::Sprintf("%sSet%04X", name.c_str(), GETSEGOFFSET(commandSet)), + setCommands.size(), declaration); + + sourceOutput += "\n"; + + for (ZRoomCommand* cmd : setCommands) + commands.push_back(cmd); + } } } @@ -363,64 +362,38 @@ void ZRoom::ProcessCommandSets() */ void ZRoom::SyotesRoomHack() { - char headerData[] = {0x0A, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x08}; - - for (size_t i = 0; i < sizeof(headerData); i++) - rawData.insert(rawData.begin() + i, headerData[i]); - - SetMesh* cmdSetMesh = new SetMesh(this, rawData, 0, -8); + PolygonType2 poly(parent, parent->GetRawData(), 0, this); - for (size_t i = 0; i < sizeof(headerData); i++) - rawData.erase(rawData.begin()); - - cmdSetMesh->cmdIndex = 0; - cmdSetMesh->cmdSet = 0; - - commands.push_back(cmdSetMesh); + poly.ParseRawData(); + poly.DeclareReferences(GetName()); + parent->AddDeclaration(0, DeclarationAlignment::Align4, poly.GetRawDataSize(), + poly.GetSourceTypeName(), poly.GetDefaultName(GetName()), + poly.GetBodySourceCode()); } ZRoomCommand* ZRoom::FindCommandOfType(RoomCommand cmdType) { for (size_t i = 0; i < commands.size(); i++) { - if (commands[i]->cmdID == cmdType) + if (commands[i]->GetRoomCommand() == cmdType) return commands[i]; } return nullptr; } -size_t ZRoom::GetDeclarationSizeFromNeighbor(int32_t declarationAddress) +size_t ZRoom::GetDeclarationSizeFromNeighbor(uint32_t declarationAddress) { - size_t declarationIndex = -1; + auto currentDecl = parent->declarations.find(declarationAddress); + if (currentDecl == parent->declarations.end()) + return 0; - // Copy it into a vector. - std::vector<std::pair<int32_t, Declaration*>> declarationKeysSorted( - parent->declarations.begin(), parent->declarations.end()); + auto nextDecl = currentDecl; + std::advance(nextDecl, 1); + if (nextDecl == parent->declarations.end()) + return rawData.size() - currentDecl->first; - // Sort the vector according to the word count in descending order. - sort(declarationKeysSorted.begin(), declarationKeysSorted.end(), - [](const auto& lhs, const auto& rhs) { return lhs.first < rhs.first; }); - - for (size_t i = 0; i < declarationKeysSorted.size(); i++) - { - if (declarationKeysSorted[i].first == declarationAddress) - { - declarationIndex = i; - break; - } - } - - if ((int32_t)declarationIndex != -1) - { - if (declarationIndex + 1 < declarationKeysSorted.size()) - return declarationKeysSorted[declarationIndex + 1].first - - declarationKeysSorted[declarationIndex].first; - else - return rawData.size() - declarationKeysSorted[declarationIndex].first; - } - - return 0; + return nextDecl->first - currentDecl->first; } size_t ZRoom::GetCommandSizeFromNeighbor(ZRoomCommand* cmd) @@ -449,17 +422,7 @@ size_t ZRoom::GetCommandSizeFromNeighbor(ZRoomCommand* cmd) std::string ZRoom::GetSourceOutputHeader(const std::string& prefix) { - sourceOutput = ""; - - for (ZRoomCommand* cmd : commands) - sourceOutput += cmd->GenerateExterns(); - - sourceOutput += "\n"; - - sourceOutput += "\n" + extDefines + "\n"; - sourceOutput += "\n"; - - return sourceOutput; + return "\n" + extDefines + "\n\n"; } std::string ZRoom::GetSourceOutputCode(const std::string& prefix) @@ -474,8 +437,6 @@ std::string ZRoom::GetSourceOutputCode(const std::string& prefix) if (scene != nullptr) sourceOutput += scene->parent->GetHeaderInclude(); - // sourceOutput += "\n"; - ProcessCommandSets(); return sourceOutput; @@ -496,114 +457,13 @@ ZResourceType ZRoom::GetResourceType() const return ZResourceType::Room; } -void ZRoom::Save(const fs::path& outFolder) -{ - for (ZRoomCommand* cmd : commands) - cmd->Save(); -} - void ZRoom::PreGenSourceFiles() { for (ZRoomCommand* cmd : commands) cmd->PreGenSourceFiles(); } -Declaration::Declaration(DeclarationAlignment nAlignment, DeclarationPadding nPadding, size_t nSize, - std::string nText) -{ - alignment = nAlignment; - padding = nPadding; - size = nSize; - preText = ""; - text = nText; - rightText = ""; - postText = ""; - preComment = ""; - postComment = ""; - varType = ""; - varName = ""; - isArray = false; - arrayItemCnt = 0; - arrayItemCntStr = ""; - includePath = ""; - isExternal = false; - references = std::vector<uint32_t>(); -} - -Declaration::Declaration(DeclarationAlignment nAlignment, size_t nSize, std::string nVarType, - std::string nVarName, bool nIsArray, std::string nText) - : Declaration(nAlignment, DeclarationPadding::None, nSize, nText) -{ - varType = nVarType; - varName = nVarName; - isArray = nIsArray; -} - -Declaration::Declaration(DeclarationAlignment nAlignment, DeclarationPadding nPadding, size_t nSize, - std::string nVarType, std::string nVarName, bool nIsArray, - std::string nText) - : Declaration(nAlignment, nPadding, nSize, nText) -{ - varType = nVarType; - varName = nVarName; - isArray = nIsArray; -} - -Declaration::Declaration(DeclarationAlignment nAlignment, size_t nSize, std::string nVarType, - std::string nVarName, bool nIsArray, size_t nArrayItemCnt, - std::string nText) - : Declaration(nAlignment, DeclarationPadding::None, nSize, nText) -{ - varType = nVarType; - varName = nVarName; - isArray = nIsArray; - arrayItemCnt = nArrayItemCnt; -} - -Declaration::Declaration(DeclarationAlignment nAlignment, size_t nSize, std::string nVarType, - std::string nVarName, bool nIsArray, std::string nArrayItemCntStr, - std::string nText) - : Declaration(nAlignment, DeclarationPadding::None, nSize, nText) -{ - varType = nVarType; - varName = nVarName; - isArray = nIsArray; - arrayItemCntStr = nArrayItemCntStr; -} - -Declaration::Declaration(DeclarationAlignment nAlignment, size_t nSize, std::string nVarType, - std::string nVarName, bool nIsArray, size_t nArrayItemCnt, - std::string nText, bool nIsExternal) - : Declaration(nAlignment, nSize, nVarType, nVarName, nIsArray, nArrayItemCnt, nText) -{ - isExternal = nIsExternal; -} - -Declaration::Declaration(DeclarationAlignment nAlignment, DeclarationPadding nPadding, size_t nSize, - std::string nVarType, std::string nVarName, bool nIsArray, - size_t nArrayItemCnt, std::string nText) - : Declaration(nAlignment, nPadding, nSize, nText) -{ - varType = nVarType; - varName = nVarName; - isArray = nIsArray; - arrayItemCnt = nArrayItemCnt; -} - -Declaration::Declaration(std::string nIncludePath, size_t nSize, std::string nVarType, - std::string nVarName) - : Declaration(DeclarationAlignment::None, DeclarationPadding::None, nSize, "") -{ - includePath = nIncludePath; - varType = nVarType; - varName = nVarName; -} - -CommandSet::CommandSet(uint32_t nAddress) -{ - address = nAddress; - commandCount = UINT32_MAX; -} +/* CommandSet */ CommandSet::CommandSet(uint32_t nAddress, uint32_t nCommandCount) { diff --git a/ZAPD/ZRoom/ZRoom.h b/ZAPD/ZRoom/ZRoom.h index 77320c8..3ca3fc9 100644 --- a/ZAPD/ZRoom/ZRoom.h +++ b/ZAPD/ZRoom/ZRoom.h @@ -1,14 +1,21 @@ #pragma once -#include <tinyxml2.h> -#include "../ZResource.h" -#include "ZRoomCommand.h" -#include "ZTexture.h" - #include <map> #include <string> #include <vector> +#include "ZResource.h" +#include "ZRoomCommand.h" +#include "tinyxml2.h" + +struct CommandSet +{ + uint32_t address; + uint32_t commandCount; // Only used if explicitly specified in the XML + + CommandSet(uint32_t nAddress, uint32_t nCommandCount = UINT32_MAX); +}; + class ZRoom : public ZResource { protected: @@ -30,23 +37,14 @@ public: virtual ~ZRoom(); void ExtractFromXML(tinyxml2::XMLElement* reader, const std::vector<uint8_t>& nRawData, - const uint32_t nRawDataIndex) override; + uint32_t nRawDataIndex) override; + void ParseCommands(std::vector<ZRoomCommand*>& commandList, CommandSet commandSet); - size_t GetDeclarationSizeFromNeighbor(int32_t declarationAddress); + size_t GetDeclarationSizeFromNeighbor(uint32_t declarationAddress); size_t GetCommandSizeFromNeighbor(ZRoomCommand* cmd); ZRoomCommand* FindCommandOfType(RoomCommand cmdType); - size_t GetRawDataSize() const override; - virtual ZResourceType GetResourceType() const override; - virtual void Save(const fs::path& outFolder) override; + size_t GetRawDataSize() const override; + ZResourceType GetResourceType() const override; virtual void PreGenSourceFiles() override; }; - -struct CommandSet -{ - uint32_t address; - uint32_t commandCount; // Only used if explicitly specified in the XML - - CommandSet(uint32_t nAddress); - CommandSet(uint32_t nAddress, uint32_t nCommandCount); -}; diff --git a/ZAPD/ZRoom/ZRoomCommand.cpp b/ZAPD/ZRoom/ZRoomCommand.cpp index e105449..e600ca4 100644 --- a/ZAPD/ZRoom/ZRoomCommand.cpp +++ b/ZAPD/ZRoom/ZRoomCommand.cpp @@ -1,50 +1,38 @@ #include "ZRoomCommand.h" -#include "StringHelper.h" - -ZRoomCommand::ZRoomCommand(ZRoom* nZRoom, std::vector<uint8_t> rawData, uint32_t rawDataIndex) -{ - cmdID = (RoomCommand)rawData[rawDataIndex]; - cmdAddress = rawDataIndex; - zRoom = nZRoom; -} -ZRoomCommand::~ZRoomCommand() -{ -} +#include "BitConverter.h" +#include "StringHelper.h" +#include "ZRoom.h" -std::string ZRoomCommand::GenerateSourceCodePass1(std::string roomName, uint32_t baseAddress) +ZRoomCommand::ZRoomCommand(ZFile* nParent) : ZResource(nParent) { - return StringHelper::Sprintf("0x%02X,", (uint8_t)cmdID); } -std::string ZRoomCommand::GenerateSourceCodePass2(std::string roomName, uint32_t baseAddress) +void ZRoomCommand::ExtractCommandFromRoom(ZRoom* nZRoom, uint32_t nRawDataIndex) { - return ""; -} + zRoom = nZRoom; + rawDataIndex = nRawDataIndex; -std::string ZRoomCommand::GenerateSourceCodePass3(std::string roomName) -{ - return ""; + ParseRawData(); } -std::string ZRoomCommand::GenerateExterns() const +void ZRoomCommand::ParseRawData() { - return ""; -} + auto& parentRawData = parent->GetRawData(); + cmdID = static_cast<RoomCommand>(parentRawData.at(rawDataIndex)); + cmdAddress = rawDataIndex; -std::string ZRoomCommand::Save() -{ - return std::string(); + cmdArg1 = parentRawData.at(rawDataIndex + 1); + cmdArg2 = BitConverter::ToUInt32BE(parentRawData, rawDataIndex + 4); + segmentOffset = GETSEGOFFSET(cmdArg2); } -std::string ZRoomCommand::PreGenSourceFiles() +void ZRoomCommand::ParseRawDataLate() { - return std::string(); } -size_t ZRoomCommand::GetRawDataSize() const +void ZRoomCommand::DeclareReferencesLate(const std::string& prefix) { - return 8; } std::string ZRoomCommand::GetCommandCName() const @@ -55,4 +43,9 @@ std::string ZRoomCommand::GetCommandCName() const RoomCommand ZRoomCommand::GetRoomCommand() const { return RoomCommand::Error; -}
\ No newline at end of file +} + +std::string ZRoomCommand::GetCommandHex() const +{ + return StringHelper::Sprintf("0x%02X", static_cast<uint8_t>(cmdID)); +} diff --git a/ZAPD/ZRoom/ZRoomCommand.h b/ZAPD/ZRoom/ZRoomCommand.h index f1b5837..b89c918 100644 --- a/ZAPD/ZRoom/ZRoomCommand.h +++ b/ZAPD/ZRoom/ZRoomCommand.h @@ -1,10 +1,13 @@ #pragma once -#include <tinyxml2.h> +#include "tinyxml2.h" #include <string> #include <vector> +#include "ZFile.h" +#include "ZResource.h" + class ZRoom; enum class RoomCommand : uint8_t @@ -38,7 +41,7 @@ enum class RoomCommand : uint8_t // MM Commands SetWorldMapVisited = 0x19, - SetAnimatedTextureList = 0x1A, + SetAnimatedMaterialList = 0x1A, SetActorCutsceneList = 0x1B, SetMinimapList = 0x1C, Unused1D = 0x1D, @@ -47,28 +50,37 @@ enum class RoomCommand : uint8_t Error = 0xFF }; -class ZRoomCommand +class ZRoomCommand : public ZResource { public: - RoomCommand cmdID; int32_t cmdAddress; uint32_t cmdIndex; - int32_t cmdSet; uint32_t commandSet; - ZRoomCommand() = default; - ZRoomCommand(ZRoom* nZRoom, std::vector<uint8_t> rawData, uint32_t rawDataIndex); - virtual ~ZRoomCommand(); - virtual std::string GenerateSourceCodePass1(std::string roomName, uint32_t baseAddress); - virtual std::string GenerateSourceCodePass2(std::string roomName, uint32_t baseAddress); - virtual std::string GenerateSourceCodePass3(std::string roomName); - virtual RoomCommand GetRoomCommand() const; - virtual size_t GetRawDataSize() const; + ZRoomCommand(ZFile* nParent); + virtual ~ZRoomCommand() = default; + + virtual void ExtractCommandFromRoom(ZRoom* nZRoom, uint32_t nRawDataIndex); + + void ParseRawData() override; + + virtual void ParseRawDataLate(); + virtual void DeclareReferencesLate(const std::string& prefix); + + virtual std::string GetBodySourceCode() const = 0; + + // Getters/Setters + virtual RoomCommand GetRoomCommand() const = 0; + // virtual size_t GetRawDataSize() const; virtual std::string GetCommandCName() const; - virtual std::string GenerateExterns() const; - virtual std::string Save(); - virtual std::string PreGenSourceFiles(); + + virtual std::string GetCommandHex() const; protected: ZRoom* zRoom; -};
\ No newline at end of file + + RoomCommand cmdID; + uint8_t cmdArg1; + segptr_t cmdArg2; + uint32_t segmentOffset; +}; |
