summaryrefslogtreecommitdiff
path: root/ZAPD/ZRoom/Commands/SetPathways.cpp
diff options
context:
space:
mode:
authorRozelette <Rozelette@users.noreply.github.com>2021-04-07 08:42:37 -0500
committerGitHub <noreply@github.com>2021-04-07 09:42:37 -0400
commit95bf5fc0080135f20f3ab17082f79b9e539e80a5 (patch)
tree92f5190dc89172df719d82092ae2d2fb086205ba /ZAPD/ZRoom/Commands/SetPathways.cpp
parent19c2ea3d474de1b74781417f4b58782396c0aa50 (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.cpp197
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;
}