fix multiple bugs in quest assembler
This commit is contained in:
+4
-19
@@ -1588,11 +1588,6 @@ Action a_encode_qst(
|
|||||||
write_output_data(args, qst_data.data(), qst_data.size(), "qst");
|
write_output_data(args, qst_data.data(), qst_data.size(), "qst");
|
||||||
});
|
});
|
||||||
|
|
||||||
Action a_check_quest_opcodes(
|
|
||||||
"check-quest-opcodes", nullptr,
|
|
||||||
+[](phosg::Arguments&) {
|
|
||||||
check_opcode_definitions();
|
|
||||||
});
|
|
||||||
Action a_disassemble_quest_script(
|
Action a_disassemble_quest_script(
|
||||||
"disassemble-quest-script", "\
|
"disassemble-quest-script", "\
|
||||||
disassemble-quest-script [OPTIONS] [INPUT-FILENAME [OUTPUT-FILENAME]]\n\
|
disassemble-quest-script [OPTIONS] [INPUT-FILENAME [OUTPUT-FILENAME]]\n\
|
||||||
@@ -3123,23 +3118,11 @@ Action a_print_free_supermap(
|
|||||||
map_state.print(stdout);
|
map_state.print(stdout);
|
||||||
});
|
});
|
||||||
|
|
||||||
Action a_check_quests(
|
Action a_check_quest_reassembly(
|
||||||
"check-quests", nullptr,
|
"check-quests", nullptr,
|
||||||
+[](phosg::Arguments& args) {
|
+[](phosg::Arguments& args) {
|
||||||
auto s = make_shared<ServerState>(get_config_filename(args));
|
check_quest_opcode_definitions();
|
||||||
s->is_debug = true;
|
|
||||||
s->load_config_early();
|
|
||||||
s->clear_file_caches();
|
|
||||||
s->load_patch_indexes();
|
|
||||||
s->load_set_data_tables();
|
|
||||||
s->load_maps();
|
|
||||||
s->load_quest_index(true);
|
|
||||||
phosg::fwrite_fmt(stdout, "All quests indexed\n");
|
|
||||||
});
|
|
||||||
|
|
||||||
Action a_check_quest_reassembly(
|
|
||||||
"check-quest-reassembly", nullptr,
|
|
||||||
+[](phosg::Arguments& args) {
|
|
||||||
auto s = make_shared<ServerState>(get_config_filename(args));
|
auto s = make_shared<ServerState>(get_config_filename(args));
|
||||||
s->is_debug = true;
|
s->is_debug = true;
|
||||||
s->load_config_early();
|
s->load_config_early();
|
||||||
@@ -3149,6 +3132,7 @@ Action a_check_quest_reassembly(
|
|||||||
s->load_maps();
|
s->load_maps();
|
||||||
s->load_quest_index(true);
|
s->load_quest_index(true);
|
||||||
|
|
||||||
|
if (args.get<bool>("reassembly")) {
|
||||||
for (const auto& [_, q] : s->quest_index->quests_by_number) {
|
for (const auto& [_, q] : s->quest_index->quests_by_number) {
|
||||||
for (const auto& [_, vq] : q->versions) {
|
for (const auto& [_, vq] : q->versions) {
|
||||||
auto decompressed_bin = prs_decompress(*vq->bin_contents);
|
auto decompressed_bin = prs_decompress(*vq->bin_contents);
|
||||||
@@ -3216,6 +3200,7 @@ Action a_check_quest_reassembly(
|
|||||||
phosg::log_info_f("... {} {} {} ({}) OK", phosg::name_for_enum(vq->meta.version), name_for_language(vq->meta.language), vq->bin_filename(), vq->meta.name);
|
phosg::log_info_f("... {} {} {} ({}) OK", phosg::name_for_enum(vq->meta.version), name_for_language(vq->meta.language), vq->bin_filename(), vq->meta.name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
Action a_check_ep3_maps(
|
Action a_check_ep3_maps(
|
||||||
|
|||||||
+15
-5
@@ -107,6 +107,8 @@ static string escape_string(const string& data, TextEncoding encoding = TextEnco
|
|||||||
ret += "\\\'";
|
ret += "\\\'";
|
||||||
} else if (ch == '\"') {
|
} else if (ch == '\"') {
|
||||||
ret += "\\\"";
|
ret += "\\\"";
|
||||||
|
} else if (ch == '\\') {
|
||||||
|
ret += "\\\\";
|
||||||
} else {
|
} else {
|
||||||
ret += ch;
|
ret += ch;
|
||||||
}
|
}
|
||||||
@@ -2947,7 +2949,7 @@ static const unordered_map<string, const QuestScriptOpcodeDefinition*>& opcodes_
|
|||||||
return index;
|
return index;
|
||||||
}
|
}
|
||||||
|
|
||||||
void check_opcode_definitions() {
|
void check_quest_opcode_definitions() {
|
||||||
static const array<Version, 12> versions = {
|
static const array<Version, 12> versions = {
|
||||||
Version::DC_NTE,
|
Version::DC_NTE,
|
||||||
Version::DC_11_2000,
|
Version::DC_11_2000,
|
||||||
@@ -3043,10 +3045,12 @@ std::string disassemble_quest_script(
|
|||||||
}
|
}
|
||||||
if (!is_v1_or_v2(version) || (version == Version::GC_NTE)) {
|
if (!is_v1_or_v2(version) || (version == Version::GC_NTE)) {
|
||||||
lines.emplace_back(std::format(".episode {}", token_name_for_episode(meta.episode)));
|
lines.emplace_back(std::format(".episode {}", token_name_for_episode(meta.episode)));
|
||||||
|
if (meta.header_episode >= 0) {
|
||||||
lines.emplace_back(std::format(".header_episode 0x{:02X}", meta.header_episode));
|
lines.emplace_back(std::format(".header_episode 0x{:02X}", meta.header_episode));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
lines.emplace_back(std::format(".language {}", char_for_language(meta.language)));
|
lines.emplace_back(std::format(".language {}", char_for_language(meta.language)));
|
||||||
if (!is_pre_v1(version) && !is_v4(version) && (static_cast<uint8_t>(meta.language) != meta.header_language)) {
|
if (!is_pre_v1(version) && !is_v4(version) && (meta.header_language >= 0) && (static_cast<uint8_t>(meta.language) != meta.header_language)) {
|
||||||
lines.emplace_back(std::format(".header_language 0x{:02X}", meta.header_language));
|
lines.emplace_back(std::format(".header_language 0x{:02X}", meta.header_language));
|
||||||
}
|
}
|
||||||
if (is_v4(version)) {
|
if (is_v4(version)) {
|
||||||
@@ -3894,7 +3898,13 @@ std::string disassemble_quest_script(
|
|||||||
disassemble_label_as_vector4f_list(l);
|
disassemble_label_as_vector4f_list(l);
|
||||||
break;
|
break;
|
||||||
case Arg::DataType::SCRIPT:
|
case Arg::DataType::SCRIPT:
|
||||||
disassemble_label_as_script(l, false);
|
try {
|
||||||
|
disassemble_label_as_script(l, reassembly_mode);
|
||||||
|
} catch (const std::exception& e) {
|
||||||
|
l->lines.clear();
|
||||||
|
l->lines.emplace_back(std::format(" // Warning: label is code, but disassembly failed ({})", e.what()));
|
||||||
|
disassemble_label_as_data(l);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3904,9 +3914,9 @@ std::string disassemble_quest_script(
|
|||||||
l->lines.clear();
|
l->lines.clear();
|
||||||
try {
|
try {
|
||||||
disassemble_label_as_script(l, true);
|
disassemble_label_as_script(l, true);
|
||||||
} catch (const std::runtime_error& e) {
|
} catch (const std::exception& e) {
|
||||||
l->lines.clear();
|
l->lines.clear();
|
||||||
l->lines.emplace_back(std::format(" // Could not disassemble as code ({})", e.what()));
|
l->lines.emplace_back(std::format(" // Label type is not known; could not disassemble as code ({})", e.what()));
|
||||||
disassemble_label_as_data(l);
|
disassemble_label_as_data(l);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
EXECUTABLE="$1"
|
|
||||||
if [ -z "$EXECUTABLE" ]; then
|
|
||||||
EXECUTABLE="./newserv"
|
|
||||||
fi
|
|
||||||
|
|
||||||
$EXECUTABLE --config=tests/config.json check-quests
|
|
||||||
@@ -7,4 +7,4 @@ if [ -z "$EXECUTABLE" ]; then
|
|||||||
EXECUTABLE="./newserv"
|
EXECUTABLE="./newserv"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
$EXECUTABLE check-quest-opcodes
|
$EXECUTABLE check-quests --reassembly
|
||||||
Reference in New Issue
Block a user