summaryrefslogtreecommitdiff
path: root/ZAPD/ZRoom/Commands/SetAlternateHeaders.cpp
blob: 68a58e60a9285ba37c562ef018ace5aa6b29a1b0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include "SetAlternateHeaders.h"

#include "Globals.h"
#include "Utils/BitConverter.h"
#include <ship/utils/StringHelper.h>
#include "ZFile.h"

SetAlternateHeaders::SetAlternateHeaders(ZFile* nParent) : ZRoomCommand(nParent)
{
}

void SetAlternateHeaders::DeclareReferences([[maybe_unused]] const std::string& prefix)
{
	if (cmdArg2 != 0)
	{
		std::string varName =
			StringHelper::Sprintf("%sAlternateHeaders0x%06X", prefix.c_str(), segmentOffset);
		parent->AddDeclarationPlaceholder(segmentOffset, varName);
	}
}

void SetAlternateHeaders::ParseRawDataLate()
{
	size_t numHeaders = zRoom->parent->GetDeclarationSizeFromNeighbor(segmentOffset) / 4;

	headers.reserve(numHeaders);
	for (uint32_t i = 0; i < numHeaders; i++)
	{
		int32_t address = BitConverter::ToInt32BE(parent->GetRawData(), segmentOffset + (i * 4));
		headers.push_back(address);

		if (address != 0 && parent->GetDeclaration(GETSEGOFFSET(address)) == nullptr)
		{
			ZRoom* altheader = new ZRoom(parent);
			altheader->ExtractFromBinary(GETSEGOFFSET(address), zRoom->GetResourceType());
			altheader->DeclareReferences(parent->GetName());

			parent->resources.push_back(altheader);
		}
	}
}

void SetAlternateHeaders::DeclareReferencesLate(const std::string& prefix)
{
	if (!headers.empty())
	{
		std::string declaration;

		for (size_t i = 0; i < headers.size(); i++)
		{
			std::string altHeaderName;
			Globals::Instance->GetSegmentedPtrName(headers.at(i), parent, "", altHeaderName,
			                                       parent->workerID);

			declaration += StringHelper::Sprintf("\t%s,", altHeaderName.c_str());

			if (i + 1 < headers.size())
				declaration += "\n";
		}

		std::string varName =
			StringHelper::Sprintf("%sAlternateHeaders0x%06X", prefix.c_str(), segmentOffset);
		parent->AddDeclarationArray(segmentOffset, GetDeclarationAlignment(), headers.size() * 4,
		                            "SceneCmd*", varName, headers.size(), declaration);
	}
}

std::string SetAlternateHeaders::GetBodySourceCode() const
{
	std::string listName;
	Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "SceneCmd*", listName,
	                                       parent->workerID);
	return StringHelper::Sprintf("SCENE_CMD_ALTERNATE_HEADER_LIST(%s)", listName.c_str());
}

std::string SetAlternateHeaders::GetCommandCName() const
{
	return "SCmdAltHeaders";
}

RoomCommand SetAlternateHeaders::GetRoomCommand() const
{
	return RoomCommand::SetAlternateHeaders;
}