From d7b17aa3838b27888c66be610c87c1e101d56350 Mon Sep 17 00:00:00 2001 From: Martin Michelsen Date: Fri, 26 Sep 2025 21:44:44 -0700 Subject: [PATCH] update some notes --- src/ItemData.hh | 13 +++++++------ src/ItemNameIndex.cc | 10 +++++----- src/ItemParameterTable.cc | 4 ---- src/ItemParameterTable.hh | 14 ++++---------- 4 files changed, 16 insertions(+), 25 deletions(-) diff --git a/src/ItemData.hh b/src/ItemData.hh index 1a61d9a8..c06329d7 100644 --- a/src/ItemData.hh +++ b/src/ItemData.hh @@ -82,14 +82,14 @@ struct ItemData { // QUICK ITEM FORMAT REFERENCE // data1/0 data1/4 data1/8 data2 // Weapon: 00ZZZZGG SSNNAABB AABBAABB 00000000 - // Armor: 0101ZZ00 FFTTDDDD EEEE0000 00000000 - // Shield: 0102ZZ00 FFTTDDDD EEEE0000 00000000 - // Unit: 0103ZZ00 FF00RRRR 00000000 00000000 + // Armor: 0101ZZ00 FFTTDDDD EEEEXXXX 00000000 + // Shield: 0102ZZ00 FFTTDDDD EEEEXXXX 00000000 + // Unit: 0103ZZ00 FF00RRRR 0000XXXX 00000000 // Mag: 02ZZLLWW HHHHIIII JJJJKKKK YYQQPPVV - // Tool: 03ZZZZUU 00CC0000 00000000 00000000 + // Tool: 03ZZZZUU 00CC0000 0000XXXX 00000000 // Meseta: 04000000 00000000 00000000 MMMMMMMM - // A = attribute type (for S-ranks, custom name) - // B = attribute amount (for S-ranks, custom name) + // A = attribute type (for S-ranks, custom name; last pair is kill count for some weapons) + // B = attribute amount (for S-ranks, custom name; last pair is kill count for some weapons) // C = stack size (for tools) // D = DEF bonus // E = EVP bonus @@ -110,6 +110,7 @@ struct ItemData { // U = tool flags (40=present; unused if item is stackable) // V = mag color // W = photon blasts + // X = kill count (big-endian; high bit always set) // Y = mag synchro // Z = item ID // Note: PSO GC erroneously byteswaps data2 even when the item is a mag. This diff --git a/src/ItemNameIndex.cc b/src/ItemNameIndex.cc index c3b4f263..09ea8114 100644 --- a/src/ItemNameIndex.cc +++ b/src/ItemNameIndex.cc @@ -679,7 +679,7 @@ void ItemNameIndex::print_table(FILE* stream) const { auto pmt = this->item_parameter_table; phosg::fwrite_fmt(stream, "WEAPONS\n"); - phosg::fwrite_fmt(stream, " CODE => ---ID--- TYPE SKIN POINTS FLAG ATPLO ATPHI ATPRQ MSTRQ ATARQ -MST- GND PH SP ATA SB(S1:AMT1,S2:AMT2) PJ 1X 1Y 2X 2Y CL A1 A2 A3 A4 A5 TB BF V1 ST* USL ---DIVISOR--- NAME\n"); + phosg::fwrite_fmt(stream, " CODE => ---ID--- TYPE SKIN POINTS FLAG ATPLO ATPHI ATPRQ MSTRQ ATARQ -MST- GND PH SP ATA SB(S1:AMT1,S2:AMT2) PJ 1X 1Y 2X 2Y CL --A1-- A4 A5 TB BF V1 ST* USL ---DIVISOR--- NAME\n"); for (size_t data1_1 = 0; data1_1 < pmt->num_weapon_classes; data1_1++) { uint8_t v1_replacement = pmt->get_weapon_v1_replacement(data1_1); float sale_divisor = pmt->get_sale_divisor(0x00, data1_1); @@ -699,7 +699,7 @@ void ItemNameIndex::print_table(FILE* stream) const { string name = this->describe_item(item); auto& stat_boost = pmt->get_stat_boost(w.stat_boost_entry_index); - phosg::fwrite_fmt(stream, " 00{:02X}{:02X} => {:08X} {:04X} {:04X} {:6} {:04X} {:5} {:5} {:5} {:5} {:5} {:5} {:3} {:02X} {:02X} {:3} {:02X}({:02X}:{:04X},{:02X}:{:04X}) {:02X} {:02X} {:02X} {:02X} {:02X} {:02X} {:02X} {:02X} {:02X} {:02X} {:02X} {:02X} {:02X} {:02X} {:2}* {} {} {}\n", + phosg::fwrite_fmt(stream, " 00{:02X}{:02X} => {:08X} {:04X} {:04X} {:6} {:04X} {:5} {:5} {:5} {:5} {:5} {:5} {:3} {:02X} {:02X} {:3} {:02X}({:02X}:{:04X},{:02X}:{:04X}) {:02X} {:02X} {:02X} {:02X} {:02X} {:02X} {:02X}{:02X}{:02X} {:02X} {:02X} {:02X} {:02X} {:02X} {:2}* {} {} {}\n", data1_1, data1_2, w.base.id, @@ -728,9 +728,9 @@ void ItemNameIndex::print_table(FILE* stream) const { w.trail2_x, w.trail2_y, w.color, - w.unknown_a1, - w.unknown_a2, - w.unknown_a3, + w.unknown_a1[0], + w.unknown_a1[1], + w.unknown_a1[2], w.unknown_a4, w.unknown_a5, w.tech_boost, diff --git a/src/ItemParameterTable.cc b/src/ItemParameterTable.cc index 36e03471..8b184ce7 100644 --- a/src/ItemParameterTable.cc +++ b/src/ItemParameterTable.cc @@ -238,8 +238,6 @@ ItemParameterTable::WeaponV4 ItemParameterTable::WeaponGCNTE::to_v4() const { ret.trail2_y = this->trail2_y; ret.color = this->color; ret.unknown_a1 = this->unknown_a1; - ret.unknown_a2 = this->unknown_a2; - ret.unknown_a3 = this->unknown_a3; return ret; } @@ -268,8 +266,6 @@ ItemParameterTable::WeaponV4 ItemParameterTable::WeaponV3T::to_v4() const { ret.trail2_y = this->trail2_y; ret.color = this->color; ret.unknown_a1 = this->unknown_a1; - ret.unknown_a2 = this->unknown_a2; - ret.unknown_a3 = this->unknown_a3; ret.unknown_a4 = this->unknown_a4; ret.unknown_a5 = this->unknown_a5; ret.tech_boost = this->tech_boost; diff --git a/src/ItemParameterTable.hh b/src/ItemParameterTable.hh index fd8d09ab..68902af1 100644 --- a/src/ItemParameterTable.hh +++ b/src/ItemParameterTable.hh @@ -120,9 +120,7 @@ public: /* 1E */ int8_t trail2_x = 0; /* 1F */ int8_t trail2_y = 0; /* 20 */ int8_t color = 0; - /* 21 */ uint8_t unknown_a1 = 0; - /* 22 */ uint8_t unknown_a2 = 0; - /* 23 */ uint8_t unknown_a3 = 0; + /* 21 */ parray unknown_a1 = 0; /* 24 */ WeaponV4 to_v4() const; @@ -149,9 +147,7 @@ public: /* 1E */ int8_t trail2_x = 0; /* 1F */ int8_t trail2_y = 0; /* 20 */ int8_t color = 0; - /* 21 */ uint8_t unknown_a1 = 0; - /* 22 */ uint8_t unknown_a2 = 0; - /* 23 */ uint8_t unknown_a3 = 0; + /* 21 */ parray unknown_a1 = 0; /* 24 */ uint8_t unknown_a4 = 0; /* 25 */ uint8_t unknown_a5 = 0; /* 26 */ uint8_t tech_boost = 0; @@ -191,9 +187,7 @@ public: /* 22 */ int8_t trail2_x = 0; /* 23 */ int8_t trail2_y = 0; /* 24 */ int8_t color = 0; - /* 25 */ uint8_t unknown_a1 = 0; - /* 26 */ uint8_t unknown_a2 = 0; - /* 27 */ uint8_t unknown_a3 = 0; + /* 25 */ parray unknown_a1 = 0; /* 28 */ uint8_t unknown_a4 = 0; /* 29 */ uint8_t unknown_a5 = 0; /* 2A */ uint8_t tech_boost = 0; @@ -691,7 +685,7 @@ public: // This specifies which entry in ItemMagMotion.dat is used. The file is // just a list of 0x64-byte structures. 0xFF = no TItemMagSub is created uint8_t motion_table_entry = 0xFF; - parray unknown_a1; + parray unknown_a1 = 0; } __packed_ws__(Side, 0x06); parray sides; // [0] = right side, [1] = left side } __packed_ws__(MotionReference, 0x0C);