From 8dc5e9f281d4e6c79ba2fcde532886b06e5a6c3f Mon Sep 17 00:00:00 2001 From: Martin Michelsen Date: Mon, 8 May 2023 20:49:39 -0700 Subject: [PATCH] add describe-item action --- src/Main.cc | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/Main.cc b/src/Main.cc index 5759e48d..60642fd0 100644 --- a/src/Main.cc +++ b/src/Main.cc @@ -164,6 +164,10 @@ The actions are:\n\ show-ep3-data\n\ Print the Episode 3 maps and card definitions from the system/ep3 directory\n\ in a (sort of) human-readable format.\n\ + describe-item DATA\n\ + Print the name of the item given by DATA (in hex). DATA must not contain\n\ + spaces. If DATA is 20 bytes, newserv assumes it contains an unused item ID\n\ + field; if it is fewer bytes, up to 16 bytes are used.\n\ replay-log [INPUT-FILENAME] [OPTIONS...]\n\ Replay a terminal log as if it were a client session. input-filename may be\n\ specified for this option. This is used for regression testing, to make\n\ @@ -208,6 +212,7 @@ enum class Behavior { FORMAT_ITEMRT_ENTRY, FORMAT_ITEMRT_REL, SHOW_EP3_DATA, + DESCRIBE_ITEM, PARSE_OBJECT_GRAPH, REPLAY_LOG, CAT_CLIENT, @@ -234,6 +239,7 @@ static bool behavior_takes_input_filename(Behavior b) { (b == Behavior::FORMAT_ITEMRT_REL) || (b == Behavior::EXTRACT_GSL) || (b == Behavior::EXTRACT_BML) || + (b == Behavior::DESCRIBE_ITEM) || (b == Behavior::PARSE_OBJECT_GRAPH) || (b == Behavior::REPLAY_LOG) || (b == Behavior::CAT_CLIENT) || @@ -386,6 +392,8 @@ int main(int argc, char** argv) { behavior = Behavior::FORMAT_ITEMRT_REL; } else if (!strcmp(argv[x], "show-ep3-data")) { behavior = Behavior::SHOW_EP3_DATA; + } else if (!strcmp(argv[x], "describe-item")) { + behavior = Behavior::DESCRIBE_ITEM; } else if (!strcmp(argv[x], "parse-object-graph")) { behavior = Behavior::PARSE_OBJECT_GRAPH; } else if (!strcmp(argv[x], "replay-log")) { @@ -964,6 +972,24 @@ int main(int argc, char** argv) { break; } + case Behavior::DESCRIBE_ITEM: { + string data = parse_data_string(input_filename); + + ItemData item; + if (data.size() == sizeof(ItemData)) { + memcpy(&item, data.data(), data.size()); + } else { + memcpy(&item.data1[0], data.data(), min(sizeof(item.data1), data.size())); + if (data.size() > sizeof(item.data1)) { + memcpy(&item.data2[0], data.data() + sizeof(item.data1), min(sizeof(item.data2), data.size() - sizeof(item.data1))); + } + } + + string desc = item.name(false); + log_info("Item: %s", desc.c_str()); + break; + } + case Behavior::SHOW_EP3_DATA: { config_log.info("Collecting Episode 3 data"); Episode3::DataIndex index("system/ep3", Episode3::BehaviorFlag::LOAD_CARD_TEXT);