summaryrefslogtreecommitdiff
path: root/ZAPD/ZRoom
diff options
context:
space:
mode:
authorAnghelo Carvajal <angheloalf95@gmail.com>2021-05-10 12:25:39 -0400
committerGitHub <noreply@github.com>2021-05-10 12:25:39 -0400
commit769f5702a422d14bfb0a60a39319da4b4bf9ec1f (patch)
tree11e12a20fb2880792722babdee0b5222ea86504f /ZAPD/ZRoom
parenta357277e412b5e8f0f2f0578c7d7d213e8744c8d (diff)
ZRoom refactor (#124)
* Remove redundant methods * first pass os cleaning * More cleaning * Fix compilation errors * Fix dumb crashes * Fix dumb issues * Removing most uses of GenerateSourceCodePass1 * more cleanup * Move segmentOffset to ZRoomCommand * Half of ParseRawData * somehow broken... * fix broken stuff * This may or may not be broken * More cleaning * Remove GenerateSourceCodePass2 * More cleanup and pointer removal * Use PolygonType2 in SetMesh * another small cleanup * Merge PolygonDlist and PolygonDlist2 * More code merging * GetDeclarationPtrName * Remove most repeated externs and a bit of redundant code * Dumb MM fixes * small fix (cherry picked from commit 0813fd69538491c5aceb00d79d19bf59fd082ca7) * Another dumb fix * Remove GenerateExterns * Change DeclareReferences signature * Refactor SetAnimatedTextureList * const std::vector<uint8_t>& * another small bunch of changes * last parserawdata and declarereferences separation probably * Move parserawdata * Remove GenerateSourceCodePass1 * Use macros for commands * Make ZRoomCommand inherit ZResource * shrink scenes tluts * ProcessTextureIntersections * small output improvements * Small changes * run format * SCENE_CMD -> SCENECMD * fix merge errors * run format * fix some warnings * update macros names * Add again different commands for each game ni SCENE_CMD_ROOM_BEHAVIOR * macro update * More booleans * Move declaration to its own file * minor changes * Update according to latest reviews in oot * run format * Yet another cutscene change * Remove special scene/room segment code * This is crashing and I don't know why * remove includeFilePrefix * fix merge issues * always pass a parent to zresource * move path to its own zclass and properly implement parserawdata in commands * Fix GetDeclarationPtrName uses * Some ZPath fixes (still broken tho) * Fix ZPath declarations * Fix weird problem * Add `Path` to the docs * run format * clean syotes code * A bunch of changes for MM * run format
Diffstat (limited to 'ZAPD/ZRoom')
-rw-r--r--ZAPD/ZRoom/Commands/EndMarker.cpp11
-rw-r--r--ZAPD/ZRoom/Commands/EndMarker.h13
-rw-r--r--ZAPD/ZRoom/Commands/SetActorCutsceneList.cpp100
-rw-r--r--ZAPD/ZRoom/Commands/SetActorCutsceneList.h24
-rw-r--r--ZAPD/ZRoom/Commands/SetActorList.cpp187
-rw-r--r--ZAPD/ZRoom/Commands/SetActorList.h50
-rw-r--r--ZAPD/ZRoom/Commands/SetAlternateHeaders.cpp74
-rw-r--r--ZAPD/ZRoom/Commands/SetAlternateHeaders.h24
-rw-r--r--ZAPD/ZRoom/Commands/SetAnimatedMaterialList.cpp402
-rw-r--r--ZAPD/ZRoom/Commands/SetAnimatedMaterialList.h (renamed from ZAPD/ZRoom/Commands/SetAnimatedTextureList.h)54
-rw-r--r--ZAPD/ZRoom/Commands/SetAnimatedTextureList.cpp433
-rw-r--r--ZAPD/ZRoom/Commands/SetCameraSettings.cpp27
-rw-r--r--ZAPD/ZRoom/Commands/SetCameraSettings.h16
-rw-r--r--ZAPD/ZRoom/Commands/SetCollisionHeader.cpp44
-rw-r--r--ZAPD/ZRoom/Commands/SetCollisionHeader.h23
-rw-r--r--ZAPD/ZRoom/Commands/SetCsCamera.cpp159
-rw-r--r--ZAPD/ZRoom/Commands/SetCsCamera.h49
-rw-r--r--ZAPD/ZRoom/Commands/SetCutscenes.cpp100
-rw-r--r--ZAPD/ZRoom/Commands/SetCutscenes.h33
-rw-r--r--ZAPD/ZRoom/Commands/SetEchoSettings.cpp20
-rw-r--r--ZAPD/ZRoom/Commands/SetEchoSettings.h16
-rw-r--r--ZAPD/ZRoom/Commands/SetEntranceList.cpp91
-rw-r--r--ZAPD/ZRoom/Commands/SetEntranceList.h32
-rw-r--r--ZAPD/ZRoom/Commands/SetExitList.cpp70
-rw-r--r--ZAPD/ZRoom/Commands/SetExitList.h22
-rw-r--r--ZAPD/ZRoom/Commands/SetLightList.cpp113
-rw-r--r--ZAPD/ZRoom/Commands/SetLightList.h42
-rw-r--r--ZAPD/ZRoom/Commands/SetLightingSettings.cpp142
-rw-r--r--ZAPD/ZRoom/Commands/SetLightingSettings.h33
-rw-r--r--ZAPD/ZRoom/Commands/SetMesh.cpp677
-rw-r--r--ZAPD/ZRoom/Commands/SetMesh.h167
-rw-r--r--ZAPD/ZRoom/Commands/SetMinimapChests.cpp95
-rw-r--r--ZAPD/ZRoom/Commands/SetMinimapChests.h27
-rw-r--r--ZAPD/ZRoom/Commands/SetMinimapList.cpp102
-rw-r--r--ZAPD/ZRoom/Commands/SetMinimapList.h27
-rw-r--r--ZAPD/ZRoom/Commands/SetObjectList.cpp78
-rw-r--r--ZAPD/ZRoom/Commands/SetObjectList.h21
-rw-r--r--ZAPD/ZRoom/Commands/SetPathways.cpp236
-rw-r--r--ZAPD/ZRoom/Commands/SetPathways.h59
-rw-r--r--ZAPD/ZRoom/Commands/SetRoomBehavior.cpp45
-rw-r--r--ZAPD/ZRoom/Commands/SetRoomBehavior.h28
-rw-r--r--ZAPD/ZRoom/Commands/SetRoomList.cpp73
-rw-r--r--ZAPD/ZRoom/Commands/SetRoomList.h38
-rw-r--r--ZAPD/ZRoom/Commands/SetSkyboxModifier.cpp29
-rw-r--r--ZAPD/ZRoom/Commands/SetSkyboxModifier.h16
-rw-r--r--ZAPD/ZRoom/Commands/SetSkyboxSettings.cpp35
-rw-r--r--ZAPD/ZRoom/Commands/SetSkyboxSettings.h18
-rw-r--r--ZAPD/ZRoom/Commands/SetSoundSettings.cpp27
-rw-r--r--ZAPD/ZRoom/Commands/SetSoundSettings.h16
-rw-r--r--ZAPD/ZRoom/Commands/SetSpecialObjects.cpp26
-rw-r--r--ZAPD/ZRoom/Commands/SetSpecialObjects.h16
-rw-r--r--ZAPD/ZRoom/Commands/SetStartPositionList.cpp91
-rw-r--r--ZAPD/ZRoom/Commands/SetStartPositionList.h23
-rw-r--r--ZAPD/ZRoom/Commands/SetTimeSettings.cpp26
-rw-r--r--ZAPD/ZRoom/Commands/SetTimeSettings.h19
-rw-r--r--ZAPD/ZRoom/Commands/SetTransitionActorList.cpp95
-rw-r--r--ZAPD/ZRoom/Commands/SetTransitionActorList.h36
-rw-r--r--ZAPD/ZRoom/Commands/SetWind.cpp29
-rw-r--r--ZAPD/ZRoom/Commands/SetWind.h16
-rw-r--r--ZAPD/ZRoom/Commands/SetWorldMapVisited.cpp14
-rw-r--r--ZAPD/ZRoom/Commands/SetWorldMapVisited.h14
-rw-r--r--ZAPD/ZRoom/Commands/Unused09.cpp12
-rw-r--r--ZAPD/ZRoom/Commands/Unused09.h14
-rw-r--r--ZAPD/ZRoom/Commands/Unused1D.cpp12
-rw-r--r--ZAPD/ZRoom/Commands/Unused1D.h14
-rw-r--r--ZAPD/ZRoom/Commands/ZRoomCommandUnk.cpp46
-rw-r--r--ZAPD/ZRoom/Commands/ZRoomCommandUnk.h27
-rw-r--r--ZAPD/ZRoom/ZNames.h6
-rw-r--r--ZAPD/ZRoom/ZRoom.cpp318
-rw-r--r--ZAPD/ZRoom/ZRoom.h36
-rw-r--r--ZAPD/ZRoom/ZRoomCommand.cpp53
-rw-r--r--ZAPD/ZRoom/ZRoomCommand.h46
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;
+};