make name-all-items more useful

This commit is contained in:
Martin Michelsen
2025-01-04 19:00:42 -08:00
parent 8508607c87
commit 1c5b0e4667
4 changed files with 65 additions and 17 deletions
+3
View File
@@ -35,6 +35,9 @@ public:
return this->name_index;
}
inline bool exists(const ItemData& item) const {
return this->primary_identifier_index.count(item.primary_identifier());
}
std::string describe_item(const ItemData& item, bool include_color_escapes = false) const;
ItemData parse_item_description(const std::string& description) const;
+32
View File
@@ -739,6 +739,38 @@ pair<uint8_t, uint8_t> ItemParameterTable::find_tool_by_id(uint32_t item_id) con
}
}
variant<
const ItemParameterTable::WeaponV4*,
const ItemParameterTable::ArmorOrShieldV4*,
const ItemParameterTable::UnitV4*,
const ItemParameterTable::MagV4*,
const ItemParameterTable::ToolV4*>
ItemParameterTable::definition_for_primary_identifier(uint32_t primary_identifier) const {
uint8_t data1_0 = (primary_identifier >> 24) & 0xFF;
uint8_t data1_1 = (primary_identifier >> 16) & 0xFF;
uint8_t data1_2 = (primary_identifier >> 8) & 0xFF;
switch (data1_0) {
case 0:
return &this->get_weapon(data1_1, data1_2);
case 1:
switch (data1_1) {
case 1:
case 2:
return &this->get_armor_or_shield(data1_1, data1_2);
case 3:
return &this->get_unit(data1_2);
default:
throw runtime_error("invalid primary identifier");
}
case 2:
return &this->get_mag(data1_1);
case 3:
return &this->get_tool(data1_1, data1_2);
default:
throw runtime_error("invalid primary identifier");
}
}
template <bool BE, typename OffsetsT>
float ItemParameterTable::get_sale_divisor_t(const OffsetsT* offsets, uint8_t data1_0, uint8_t data1_1) const {
switch (data1_0) {
+8 -3
View File
@@ -2,16 +2,19 @@
#include <stdint.h>
#include <array>
#include <map>
#include <memory>
#include <phosg/Encoding.hh>
#include <set>
#include <string>
#include <variant>
#include <vector>
#include "ItemData.hh"
#include "Text.hh"
#include "Types.hh"
#include "Version.hh"
class ItemParameterTable {
public:
@@ -438,7 +441,6 @@ public:
ItemParameterTable(std::shared_ptr<const std::string> data, Version version);
~ItemParameterTable() = default;
void print(FILE* stream) const;
std::set<uint32_t> compute_all_valid_primary_identifiers() const;
size_t num_weapons_in_class(uint8_t data1_1) const;
@@ -453,6 +455,9 @@ public:
const ToolV4& get_tool(uint8_t data1_1, uint8_t data1_2) const;
std::pair<uint8_t, uint8_t> find_tool_by_id(uint32_t id) const;
std::variant<const WeaponV4*, const ArmorOrShieldV4*, const UnitV4*, const MagV4*, const ToolV4*>
definition_for_primary_identifier(uint32_t primary_identifier) const;
float get_sale_divisor(uint8_t data1_0, uint8_t data1_1) const;
const MagFeedResult& get_mag_feed_result(uint8_t table_index, uint8_t which) const;
uint8_t get_item_stars(uint32_t id) const;
@@ -484,7 +489,7 @@ public:
size_t num_specials;
size_t first_rare_mag_index;
private:
protected:
struct TableOffsetsDCProtos {
/* ## / NTE / 11/2000 */
/* 00 / 0013 / 0013 */ le_uint32_t unknown_a0;
@@ -642,7 +647,7 @@ public:
uint8_t get_evolution_number(uint8_t data1_1) const;
private:
protected:
std::shared_ptr<const std::string> data;
phosg::StringReader r;
const TableOffsets* offsets;
+22 -14
View File
@@ -2092,7 +2092,7 @@ Action a_name_all_items(
if (args.get<bool>("list")) {
for (uint32_t primary_identifier : all_primary_identifiers) {
fprintf(stderr, "%08" PRIX32 "\n", primary_identifier);
fprintf(stdout, "%08" PRIX32 "\n", primary_identifier);
for (Version v : ALL_VERSIONS) {
const auto& index = s->item_name_index_opt(v);
if (index) {
@@ -2101,41 +2101,49 @@ Action a_name_all_items(
string name = index->describe_item(item);
try {
bool is_rare = pmt->is_item_rare(item);
fprintf(stderr, " %10s: %s %s\n", phosg::name_for_enum(v), is_rare ? "+++" : "---", name.c_str());
fprintf(stdout, " %10s: %s %s\n", phosg::name_for_enum(v), is_rare ? "+++" : "---", name.c_str());
} catch (const out_of_range&) {
fprintf(stderr, " %10s: (missing)\n", phosg::name_for_enum(v));
fprintf(stdout, " %10s: (missing)\n", phosg::name_for_enum(v));
}
}
}
fputc('\n', stderr);
fputc('\n', stdout);
}
} else {
fprintf(stderr, "IDENT :");
bool separate_classes = args.get<bool>("separate-classes");
fprintf(stdout, "IDENT :");
for (Version v : ALL_VERSIONS) {
const auto& index = s->item_name_index_opt(v);
if (index) {
fprintf(stderr, " %30s ", phosg::name_for_enum(v));
fprintf(stdout, " %30s ", phosg::name_for_enum(v));
}
}
fputc('\n', stderr);
fputc('\n', stdout);
uint32_t prev_ident = 0;
for (uint32_t primary_identifier : all_primary_identifiers) {
fprintf(stderr, "%08" PRIX32 ":", primary_identifier);
if (separate_classes & ((primary_identifier & 0xFFFF0000) != (prev_ident & 0xFFFF0000))) {
fputc('\n', stdout);
}
prev_ident = primary_identifier;
fprintf(stdout, "%08" PRIX32 ":", primary_identifier);
for (Version v : ALL_VERSIONS) {
const auto& index = s->item_name_index_opt(v);
if (index) {
auto pmt = s->item_parameter_table(v);
ItemData item = ItemData::from_primary_identifier(*s->item_stack_limits(v), primary_identifier);
string name = index->describe_item(item);
try {
if (index->exists(item)) {
string name = index->describe_item(item);
bool is_rare = pmt->is_item_rare(item);
fprintf(stderr, " %30s%s", name.c_str(), is_rare ? " (*)" : " ");
} catch (const out_of_range&) {
fprintf(stderr, " ");
fprintf(stdout, " %30s%s", name.c_str(), is_rare ? " ***" : " ...");
} else {
fprintf(stdout, " ------------------------------ ---");
}
}
}
fputc('\n', stderr);
fputc('\n', stdout);
}
}
});