summaryrefslogtreecommitdiff
path: root/ZAPD/ZRoom
diff options
context:
space:
mode:
authorAnghelo Carvajal <angheloalf95@gmail.com>2022-03-26 17:38:55 -0300
committerGitHub <noreply@github.com>2022-03-26 16:38:55 -0400
commit89a0b26289a7bcb2e5cc450f2792e08b7bb276f9 (patch)
tree2635012016662ffc7c1f468773e6d2b5120ccba0 /ZAPD/ZRoom
parent14d2a734b3fdddf2091629edc59db94ab5548f3e (diff)
Add cutscene extraction for MM (#242)
* Initial draft * crashes a lot less * Some scenes matches * GiveTatl * A class for every command * CS_MISC * A few macros * More commands * Macros for unknown commands * small cleanup * Remove useless destructors and fix warnings * More cleanup * format * Move stuff around * move commands to commands file * oot builds again * Mix OoT and MM SetTime commands * Name Terminator and Camera * MOTIONBLUR * Use CS_TEXT_LEARN_SONG in OoT * Macros for each type of textbox * Mix PlaySec and PlayBgm classes * Mix StopSeq and StopBgm * Mix the actor actions from oot and mm * Merge unknown command * Mix ZCutscene and ZCutsceneMM into one * Fix SCENE_CMD_CUTSCENE_LIST not using symbol and hardcoded MM cutscenes names * Mix OoT and MM LIGHTING class * Mix OoT and MM misc * Rumble * format * remove redundant else * CS_FADESCREEN * argument change * Remove some redundant parameters * Renames * format * Rename ChooseCredits class * Final cleanup * line * GenericCmd class for MM * Move some extra commands to csCommandsDescMM * Remove redundant GetCommandOoTFromID * CutsceneCommand_GenericCmd for OoT * Move CS_UNK_DATA to GenericCmd * Final cleanup * format * warning
Diffstat (limited to 'ZAPD/ZRoom')
-rw-r--r--ZAPD/ZRoom/Commands/SetCutscenes.cpp98
-rw-r--r--ZAPD/ZRoom/Commands/SetCutscenes.h6
-rw-r--r--ZAPD/ZRoom/Commands/SetRoomList.cpp5
3 files changed, 61 insertions, 48 deletions
diff --git a/ZAPD/ZRoom/Commands/SetCutscenes.cpp b/ZAPD/ZRoom/Commands/SetCutscenes.cpp
index e51e550..3820203 100644
--- a/ZAPD/ZRoom/Commands/SetCutscenes.cpp
+++ b/ZAPD/ZRoom/Commands/SetCutscenes.cpp
@@ -10,53 +10,65 @@ SetCutscenes::SetCutscenes(ZFile* nParent) : ZRoomCommand(nParent)
{
}
-SetCutscenes::~SetCutscenes()
-{
- for (ZCutsceneBase* cutscene : cutscenes)
- delete cutscene;
-}
-
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(parent);
- cutscene->ExtractFromFile(segmentOffset);
- auto decl = parent->GetDeclaration(segmentOffset);
- if (decl == nullptr)
- {
- cutscene->DeclareVar(zRoom->GetName().c_str(), "");
- }
-
- cutscenes.push_back(cutscene);
- }
- else
+ if (Globals::Instance->game == ZGame::MM_RETAIL)
{
int32_t currentPtr = segmentOffset;
- std::string declaration;
for (uint8_t i = 0; i < numCutscenes; i++)
{
CutsceneEntry entry(parent->GetRawData(), currentPtr);
cutsceneEntries.push_back(entry);
currentPtr += 8;
+ }
+ }
+}
+
+void SetCutscenes::DeclareReferences(const std::string& prefix)
+{
+ std::string varPrefix = name;
+ if (varPrefix == "")
+ varPrefix = prefix;
+
+ if (Globals::Instance->game == ZGame::MM_RETAIL)
+ {
+ std::string declaration;
+ size_t i = 0;
- // TODO: don't hardcode %sCutsceneData_%06X, look up for the declared name instead
- declaration += StringHelper::Sprintf(
- " { %sCutsceneData_%06X, 0x%04X, 0x%02X, 0x%02X },", zRoom->GetName().c_str(),
- entry.segmentOffset, entry.exit, entry.entrance, entry.flag);
+ for (const auto& entry : cutsceneEntries)
+ {
+ if (entry.segmentPtr != SEGMENTED_NULL &&
+ GETSEGNUM(entry.segmentPtr) == parent->segment)
+ {
+ offset_t csOffset = Seg2Filespace(entry.segmentPtr, parent->baseAddress);
+ if (!parent->HasDeclaration(csOffset))
+ {
+ auto* cutscene = new ZCutscene(parent);
+ cutscene->ExtractFromFile(csOffset);
+ cutscene->SetName(cutscene->GetDefaultName(varPrefix));
+ cutscene->DeclareVar(varPrefix, "");
+ cutscene->DeclareReferences(varPrefix);
+ parent->AddResource(cutscene);
+ }
+ }
+
+ std::string csName;
+ Globals::Instance->GetSegmentedPtrName(entry.segmentPtr, parent, "CutsceneData",
+ csName);
- if (i < numCutscenes - 1)
+ declaration +=
+ StringHelper::Sprintf(" { %s, 0x%04X, 0x%02X, 0x%02X },", csName.c_str(),
+ entry.exit, entry.entrance, entry.flag);
+
+ if (i + 1 < numCutscenes)
declaration += "\n";
- ZCutsceneMM* cutscene = new ZCutsceneMM(parent);
- cutscene->ExtractFromFile(entry.segmentOffset);
- cutscenes.push_back(cutscene);
+ i++;
}
parent->AddDeclarationArray(segmentOffset, DeclarationAlignment::Align4,
@@ -65,19 +77,19 @@ void SetCutscenes::ParseRawData()
zRoom->GetName().c_str(), segmentOffset),
cutsceneEntries.size(), declaration);
}
-
- for (ZCutsceneBase* cutscene : cutscenes)
+ else
{
- if (cutscene->GetRawDataIndex() != 0)
+ if (cmdArg2 != SEGMENTED_NULL && GETSEGNUM(cmdArg2) == parent->segment)
{
- Declaration* decl = parent->GetDeclaration(cutscene->GetRawDataIndex());
- if (decl == nullptr)
- {
- cutscene->GetSourceOutputCode(zRoom->GetName());
- }
- else if (decl->text == "")
+ offset_t csOffset = Seg2Filespace(cmdArg2, parent->baseAddress);
+ if (!parent->HasDeclaration(csOffset))
{
- decl->text = cutscene->GetBodySourceCode();
+ auto* cutscene = new ZCutscene(parent);
+ cutscene->ExtractFromFile(csOffset);
+ cutscene->SetName(cutscene->GetDefaultName(varPrefix));
+ cutscene->DeclareVar(varPrefix, "");
+ cutscene->DeclareReferences(varPrefix);
+ parent->AddResource(cutscene);
}
}
}
@@ -86,11 +98,15 @@ void SetCutscenes::ParseRawData()
std::string SetCutscenes::GetBodySourceCode() const
{
std::string listName;
- Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "CutsceneData", listName);
if (Globals::Instance->game == ZGame::MM_RETAIL)
+ {
+ Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "CutsceneEntry", listName);
return StringHelper::Sprintf("SCENE_CMD_CUTSCENE_LIST(%i, %s)", numCutscenes,
listName.c_str());
+ }
+
+ Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "CutsceneData", listName);
return StringHelper::Sprintf("SCENE_CMD_CUTSCENE_DATA(%s)", listName.c_str());
}
@@ -105,7 +121,7 @@ RoomCommand SetCutscenes::GetRoomCommand() const
}
CutsceneEntry::CutsceneEntry(const std::vector<uint8_t>& rawData, uint32_t rawDataIndex)
- : segmentOffset(GETSEGOFFSET(BitConverter::ToInt32BE(rawData, rawDataIndex + 0))),
+ : segmentPtr(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 ad032bb..81a622c 100644
--- a/ZAPD/ZRoom/Commands/SetCutscenes.h
+++ b/ZAPD/ZRoom/Commands/SetCutscenes.h
@@ -1,7 +1,6 @@
#pragma once
#include "ZCutscene.h"
-#include "ZCutsceneMM.h"
#include "ZRoom/ZRoomCommand.h"
class CutsceneEntry
@@ -9,7 +8,7 @@ class CutsceneEntry
public:
CutsceneEntry(const std::vector<uint8_t>& rawData, uint32_t rawDataIndex);
- uint32_t segmentOffset;
+ segptr_t segmentPtr;
uint16_t exit;
uint8_t entrance;
uint8_t flag;
@@ -18,14 +17,13 @@ public:
class SetCutscenes : public ZRoomCommand
{
public:
- std::vector<ZCutsceneBase*> cutscenes;
std::vector<CutsceneEntry> cutsceneEntries; // (MM Only)
uint8_t numCutscenes; // (MM Only)
SetCutscenes(ZFile* nParent);
- ~SetCutscenes();
void ParseRawData() override;
+ void DeclareReferences(const std::string& prefix) override;
std::string GetBodySourceCode() const override;
diff --git a/ZAPD/ZRoom/Commands/SetRoomList.cpp b/ZAPD/ZRoom/Commands/SetRoomList.cpp
index e023583..20138dd 100644
--- a/ZAPD/ZRoom/Commands/SetRoomList.cpp
+++ b/ZAPD/ZRoom/Commands/SetRoomList.cpp
@@ -104,9 +104,8 @@ std::string RomFile::GetBodySourceCode() const
if (!isFirst)
declaration += "\n";
- declaration +=
- StringHelper::Sprintf("\t{ _%sSegmentRomStart, _%sSegmentRomEnd },",
- roomName.c_str(), roomName.c_str());
+ declaration += StringHelper::Sprintf("\t{ _%sSegmentRomStart, _%sSegmentRomEnd },",
+ roomName.c_str(), roomName.c_str());
isFirst = false;
}
}