diff options
| author | Rozelette <Rozelette@users.noreply.github.com> | 2021-04-07 08:42:37 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-04-07 09:42:37 -0400 |
| commit | 95bf5fc0080135f20f3ab17082f79b9e539e80a5 (patch) | |
| tree | 92f5190dc89172df719d82092ae2d2fb086205ba /ZAPD/ZRoom/Commands/SetPathways.cpp | |
| parent | 19c2ea3d474de1b74781417f4b58782396c0aa50 (diff) | |
Add MM scene support (#109)
* Enough to get 1 scene OK
* More MM progress
* Fixes for scenes. 376/401 match
* Fix last of MM scenes
* Add SetWorldMapVisited
* Cleanup
* Hopefully fix OOT build
* Address feedback
* Add macro for rotation flags in MM
* remove Align2
* Cleanup
* Conditionally use looser alignment only in MM
Diffstat (limited to 'ZAPD/ZRoom/Commands/SetPathways.cpp')
| -rw-r--r-- | ZAPD/ZRoom/Commands/SetPathways.cpp | 197 |
1 files changed, 136 insertions, 61 deletions
diff --git a/ZAPD/ZRoom/Commands/SetPathways.cpp b/ZAPD/ZRoom/Commands/SetPathways.cpp index 9d70e27..d36d15d 100644 --- a/ZAPD/ZRoom/Commands/SetPathways.cpp +++ b/ZAPD/ZRoom/Commands/SetPathways.cpp @@ -2,6 +2,7 @@ #include "../../BitConverter.h" #include "../../StringHelper.h" #include "../../ZFile.h" +#include "../../Globals.h" #include "../ZRoom.h" using namespace std; @@ -12,10 +13,7 @@ SetPathways::SetPathways(ZRoom* nZRoom, std::vector<uint8_t> rawData, int rawDat _rawData = rawData; _rawDataIndex = rawDataIndex; - segmentOffset = 0; - listSegmentOffset = 0; - - InitList(GETSEGOFFSET(BitConverter::ToInt32BE(rawData, rawDataIndex + 4))); + segmentOffset = GETSEGOFFSET(BitConverter::ToInt32BE(rawData, rawDataIndex + 4)); if (segmentOffset != 0) zRoom->parent->AddDeclarationPlaceholder(segmentOffset); @@ -23,79 +21,139 @@ SetPathways::SetPathways(ZRoom* nZRoom, std::vector<uint8_t> rawData, int rawDat SetPathways::~SetPathways() { - for (PathwayEntry* entry : pathways) - delete entry; + if (pathwayList != nullptr) + delete pathwayList; } -void SetPathways::InitList(uint32_t address) +string SetPathways::GetSourceOutputCode(std::string prefix) { - segmentOffset = address; - listSegmentOffset = GETSEGOFFSET(BitConverter::ToInt32BE(_rawData, address + 4)); - numPoints = _rawData[address + 0]; + return ""; } -string SetPathways::GetSourceOutputCode(std::string prefix) +string SetPathways::GenerateSourceCodePass1(string roomName, int baseAddress) { + int numPaths = (Globals::Instance->game != ZGame::MM_RETAIL) ? 1 : zRoom->GetDeclarationSizeFromNeighbor(segmentOffset) / 8; + + pathwayList = new PathwayList(zRoom, _rawData, segmentOffset, numPaths); + return ""; } -string SetPathways::GenerateSourceCodePass1(string roomName, int baseAddress) +string SetPathways::GenerateSourceCodePass2(string roomName, int baseAddress) +{ + string sourceOutput = ""; + + sourceOutput += + StringHelper::Sprintf("%s 0, (u32)%sPathway0x%06X };", + ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), + roomName.c_str(), segmentOffset); + + if (pathwayList != nullptr) + pathwayList->GetSourceOutputCode(roomName); + + return sourceOutput; +} + +int32_t SetPathways::GetRawDataSize() +{ + int32_t size = 0; + if (pathwayList != nullptr) + size += pathwayList->GetRawDataSize(); + + return ZRoomCommand::GetRawDataSize() + size; +} + +string SetPathways::GenerateExterns() +{ + if (pathwayList != nullptr) + return pathwayList->GenerateExterns(); + + return std::string(); +} + +string SetPathways::GetCommandCName() +{ + return "SCmdPathList"; +} + +RoomCommand SetPathways::GetRoomCommand() +{ + return RoomCommand::SetPathways; +} + +PathwayEntry::PathwayEntry(std::vector<uint8_t> rawData, int rawDataIndex) : + numPoints(rawData[rawDataIndex + 0]), + unk1(rawData[rawDataIndex + 1]), + unk2(BitConverter::ToInt16BE(rawData, rawDataIndex + 2)), + listSegmentOffset(GETSEGOFFSET(BitConverter::ToInt32BE(rawData, rawDataIndex + 4))) { - // int numPathsReal = zRoom->GetDeclarationSizeFromNeighbor(listSegmentOffset) / 6; uint32_t currentPtr = listSegmentOffset; - uint8_t* data = _rawData.data(); + uint8_t* data = rawData.data(); for (int i = 0; i < numPoints; i++) { - PathwayEntry* entry = new PathwayEntry(); - entry->x = BitConverter::ToInt16BE(data, currentPtr + 0); - entry->y = BitConverter::ToInt16BE(data, currentPtr + 2); - entry->z = BitConverter::ToInt16BE(data, currentPtr + 4); + x = BitConverter::ToInt16BE(data, currentPtr + 0); + y = BitConverter::ToInt16BE(data, currentPtr + 2); + z = BitConverter::ToInt16BE(data, currentPtr + 4); - pathways.push_back(entry); + Vec3s point = Vec3s(x, y, z); + + points.push_back(point); currentPtr += 6; } - + if (numPoints == 0) // Hack for SharpOcarina { for (int i = 0; i < 3; i++) { - PathwayEntry* entry = new PathwayEntry(); - pathways.push_back(entry); + Vec3s point = Vec3s(0, 0, 0); + points.push_back(point); } } - - return ""; } -string SetPathways::GenerateSourceCodePass2(string roomName, int baseAddress) +PathwayList::PathwayList(ZRoom* nZRoom, std::vector<uint8_t> rawData, int rawDataIndex, int length) { - string sourceOutput = ""; + zRoom = nZRoom; + _rawDataIndex = rawDataIndex; - sourceOutput += - StringHelper::Sprintf("%s 0, (u32)&%sPathway0x%06X };", - ZRoomCommand::GenerateSourceCodePass1(roomName, baseAddress).c_str(), - roomName.c_str(), segmentOffset); + uint32_t currentPtr = rawDataIndex; + uint8_t* data = rawData.data(); + + for (int pathIndex = 0; pathIndex < length; pathIndex++) { - string declaration = StringHelper::Sprintf("%i, (u32)%sPathwayList0x%06X", numPoints, - roomName.c_str(), listSegmentOffset); + PathwayEntry* path = new PathwayEntry(rawData, currentPtr); + currentPtr += 8; + + if (path->listSegmentOffset == 0) + break; - zRoom->parent->AddDeclaration( - segmentOffset, DeclarationAlignment::None, DeclarationPadding::None, 8, "Path", - StringHelper::Sprintf("%sPathway0x%06X", roomName.c_str(), segmentOffset), declaration); + pathways.push_back(path); } +} +PathwayList::~PathwayList() +{ + for (PathwayEntry* path : pathways) + delete path; +} + +void PathwayList::GetSourceOutputCode(std::string prefix) +{ { string declaration = ""; - size_t index = 0; for (PathwayEntry* entry : pathways) { - declaration += StringHelper::Sprintf(" { %i, %i, %i }, //0x%06X", entry->x, entry->y, - entry->z, listSegmentOffset + (index * 6)); + 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"; @@ -104,39 +162,56 @@ string SetPathways::GenerateSourceCodePass2(string roomName, int baseAddress) } zRoom->parent->AddDeclarationArray( - listSegmentOffset, DeclarationAlignment::None, DeclarationPadding::None, - pathways.size() * 6, "Vec3s", - StringHelper::Sprintf("%sPathwayList0x%06X", roomName.c_str(), listSegmentOffset), + _rawDataIndex, DeclarationAlignment::None, DeclarationPadding::None, + pathways.size() * 8, "Path", + StringHelper::Sprintf("%sPathway0x%06X", prefix.c_str(), _rawDataIndex), pathways.size(), declaration); } - return sourceOutput; -} + for (PathwayEntry* entry : pathways) + { + string declaration = ""; -int32_t SetPathways::GetRawDataSize() -{ - return ZRoomCommand::GetRawDataSize() + (pathways.size() * 6); -} + 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)); -string SetPathways::GenerateExterns() -{ - return StringHelper::Sprintf("extern Vec3s %sPathwayList0x%06X[];\n", zRoom->GetName().c_str(), - segmentOffset); -} + if (index < entry->points.size() - 1) + declaration += "\n"; -string SetPathways::GetCommandCName() -{ - return "SCmdPathList"; + index++; + } + + zRoom->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); + } } -RoomCommand SetPathways::GetRoomCommand() +int32_t PathwayList::GetRawDataSize() { - return RoomCommand::SetPathways; + int32_t pointsSize = 0; + + for (PathwayEntry* entry : pathways) + { + pointsSize += entry->points.size() * 6; + } + + return pathways.size() * 8 + pointsSize; } -PathwayEntry::PathwayEntry() +string PathwayList::GenerateExterns() { - x = 0; - y = 0; - z = 0; + string declaration = ""; + for (PathwayEntry* entry : pathways) + { + declaration += StringHelper::Sprintf("extern Vec3s %sPathwayList0x%06X[];\n", zRoom->GetName().c_str(), + entry->listSegmentOffset); + } + + return declaration; } |
