fail on unknown quest directives

This commit is contained in:
Martin Michelsen
2026-02-05 19:58:28 -08:00
parent d38be2f360
commit e9dfa5d1de
+34 -19
View File
@@ -4011,6 +4011,13 @@ AssembledQuestScript assemble_quest_script(
} }
// Collect metadata directives // Collect metadata directives
std::unordered_set<std::string> metadata_directive_names{
".include", ".version", ".name", ".short_desc", ".long_desc", ".allow_create_item", ".solo_unlock_flag",
".quest_num", ".language", ".episode", ".max_players", ".joinable", ".header_language", ".header_episode",
".header_unknown_a1", ".header_unknown_a2", ".header_unknown_a3", ".header_unknown_a4", ".header_unknown_a5",
".header_unknown_a6"};
AssembledQuestScript ret; AssembledQuestScript ret;
for (const auto& line : lines) { for (const auto& line : lines) {
if (line.text.empty()) { if (line.text.empty()) {
@@ -4259,10 +4266,20 @@ AssembledQuestScript assemble_quest_script(
} }
if (line.text[0] == '.') { if (line.text[0] == '.') {
if (line.text.starts_with(".data ")) { string directive, args;
code_w.write(phosg::parse_data_string(line.text.substr(6))); size_t space_loc = line.text.find(' ');
} else if (line.text.starts_with(".cstr ")) { if (space_loc == string::npos) {
string data = phosg::parse_data_string(line.text.substr(6)); directive = line.text;
} else {
directive = line.text.substr(0, space_loc);
args = line.text.substr(space_loc + 1);
phosg::strip_whitespace(args);
}
if ((directive == ".data") || (directive == ".binary")) {
code_w.write(phosg::parse_data_string(args));
} else if (directive == ".cstr") {
string data = phosg::parse_data_string(args);
if (uses_utf16(ret.meta.version)) { if (uses_utf16(ret.meta.version)) {
code_w.write(tt_utf8_to_utf16(data)); code_w.write(tt_utf8_to_utf16(data));
code_w.put_u16l(0); code_w.put_u16l(0);
@@ -4270,27 +4287,23 @@ AssembledQuestScript assemble_quest_script(
code_w.write((ret.meta.language == Language::JAPANESE) ? tt_utf8_to_sega_sjis(data) : tt_utf8_to_8859(data)); code_w.write((ret.meta.language == Language::JAPANESE) ? tt_utf8_to_sega_sjis(data) : tt_utf8_to_8859(data));
code_w.put_u8(0); code_w.put_u8(0);
} }
} else if (line.text.starts_with(".zero ")) { } else if (directive == ".zero") {
size_t size = stoull(line.text.substr(6), nullptr, 0); size_t size = stoull(args, nullptr, 0);
code_w.extend_by(size, 0x00); code_w.extend_by(size, 0x00);
} else if (line.text.starts_with(".zero_until ")) { } else if (directive == ".zero_until") {
size_t size = stoull(line.text.substr(12), nullptr, 0); size_t size = stoull(args, nullptr, 0);
code_w.extend_to(size, 0x00); code_w.extend_to(size, 0x00);
} else if (line.text.starts_with(".align ")) { } else if (directive == ".align") {
size_t alignment = stoull(line.text.substr(7), nullptr, 0); size_t alignment = stoull(args, nullptr, 0);
while (code_w.size() % alignment) { while (code_w.size() % alignment) {
code_w.put_u8(0); code_w.put_u8(0);
} }
} else if (line.text.starts_with(".include ")) { } else if (directive == ".include") {
// This was already handled in a previous phase // This was already handled in a previous phase
} else if (line.text.starts_with(".include_bin ")) { } else if (directive == ".include_bin ") {
string filename = line.text.substr(13); code_w.write(get_native_include(args));
phosg::strip_whitespace(filename); } else if (directive == ".include_native") {
code_w.write(get_native_include(filename)); string native_text = get_native_include(args);
} else if (line.text.starts_with(".include_native ")) {
string filename = line.text.substr(16);
phosg::strip_whitespace(filename);
string native_text = get_native_include(filename);
string code; string code;
if (is_ppc(ret.meta.version)) { if (is_ppc(ret.meta.version)) {
code = std::move(ResourceDASM::PPC32Emulator::assemble(native_text).code); code = std::move(ResourceDASM::PPC32Emulator::assemble(native_text).code);
@@ -4302,6 +4315,8 @@ AssembledQuestScript assemble_quest_script(
throw runtime_error("unknown architecture"); throw runtime_error("unknown architecture");
} }
code_w.write(code); code_w.write(code);
} else if (!metadata_directive_names.count(directive)) { // These were handled in an earlier phase
throw runtime_error("unknown directive: " + directive);
} }
return; return;
} }