Fix bug with min/max damage parsing
This commit is contained in:
		| @@ -24,8 +24,12 @@ special_stats = { | |||||||
|     "poisonmindam": {"template": "dmg-pois"}, |     "poisonmindam": {"template": "dmg-pois"}, | ||||||
|     "poisonmaxdam": None, |     "poisonmaxdam": None, | ||||||
|     "poisonlength": None, |     "poisonlength": None, | ||||||
|     "mindamage": {"template": "dmg-norm"}, |     "mindamage": {"template": "dmg-min"}, | ||||||
|     "maxdamage": None, |     "maxdamage": {"template": "dmg-max"}, | ||||||
|  |     "secondary_mindamage": {"template": "dmg-min"}, | ||||||
|  |     "secondary_maxdamage": {"template": "dmg-max"}, | ||||||
|  |     "item_throw_mindamage": {"template": "dmg-min"}, | ||||||
|  |     "item_throw_maxdamage": {"template": "dmg-max"}, | ||||||
|     "item_maxdamage_percent": {"template": "dmg%"},  # max before min for this stat |     "item_maxdamage_percent": {"template": "dmg%"},  # max before min for this stat | ||||||
|     "item_mindamage_percent": None, |     "item_mindamage_percent": None, | ||||||
|     "item_addclassskills": { |     "item_addclassskills": { | ||||||
| @@ -39,8 +43,8 @@ special_stats = { | |||||||
| #       instead of relying on the debug tooltips of properties.txt, since the game does not | #       instead of relying on the debug tooltips of properties.txt, since the game does not | ||||||
| #       actually use those, but rather they are present for the excel developers. | #       actually use those, but rather they are present for the excel developers. | ||||||
| properties_patches = { | properties_patches = { | ||||||
|     "dmg-min": {"stat1": "secondary_mindamage"}, |     "dmg-min": {"stat1": "VARIABLE"}, | ||||||
|     "dmg-max": {"stat1": "secondary_maxdamage"}, |     "dmg-max": {"stat1": "VARIABLE"}, | ||||||
|     "dmg%": {"stat1": "item_maxdamage_percent", "stat2": "item_mindamage_percent"}, |     "dmg%": {"stat1": "item_maxdamage_percent", "stat2": "item_mindamage_percent"}, | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -97,10 +101,12 @@ for stat in itemstatcost: | |||||||
|     obj = { |     obj = { | ||||||
|         "text": prop["tooltip"], |         "text": prop["tooltip"], | ||||||
|         "save_bits": [], |         "save_bits": [], | ||||||
|         "save_add": itemstatcost[prop["stats"][0]]["save_add"], |         "save_add": itemstatcost[stat]["save_add"], | ||||||
|         "save_param_bits": itemstatcost[prop["stats"][0]]["save_param_bits"], |         "save_param_bits": itemstatcost[stat]["save_param_bits"], | ||||||
|     } |     } | ||||||
|     for prop_stat in prop["stats"]: |     for prop_stat in prop["stats"]: | ||||||
|  |         if prop_stat == "VARIABLE": | ||||||
|  |             prop_stat = stat | ||||||
|         if itemstatcost[prop_stat]["save_add"] != obj["save_add"]: |         if itemstatcost[prop_stat]["save_add"] != obj["save_add"]: | ||||||
|             print( |             print( | ||||||
|                 f"Unexpected divergence in save_add for stats in prop {special_stats[stat]}" |                 f"Unexpected divergence in save_add for stats in prop {special_stats[stat]}" | ||||||
|   | |||||||
| @@ -89,9 +89,16 @@ | |||||||
|         "save_param_bits": null |         "save_param_bits": null | ||||||
|     }, |     }, | ||||||
|     "21": { |     "21": { | ||||||
|         "text": "Adds #-# Damage", |         "text": "+# to Minimum Damage", | ||||||
|  |         "save_bits": [ | ||||||
|  |             6 | ||||||
|  |         ], | ||||||
|  |         "save_add": 0, | ||||||
|  |         "save_param_bits": null | ||||||
|  |     }, | ||||||
|  |     "22": { | ||||||
|  |         "text": "+# to Maximum Damage", | ||||||
|         "save_bits": [ |         "save_bits": [ | ||||||
|             6, |  | ||||||
|             7 |             7 | ||||||
|         ], |         ], | ||||||
|         "save_add": 0, |         "save_add": 0, | ||||||
| @@ -869,6 +876,22 @@ | |||||||
|         "save_add": 0, |         "save_add": 0, | ||||||
|         "save_param_bits": null |         "save_param_bits": null | ||||||
|     }, |     }, | ||||||
|  |     "159": { | ||||||
|  |         "text": "+# to Minimum Damage", | ||||||
|  |         "save_bits": [ | ||||||
|  |             6 | ||||||
|  |         ], | ||||||
|  |         "save_add": 0, | ||||||
|  |         "save_param_bits": null | ||||||
|  |     }, | ||||||
|  |     "160": { | ||||||
|  |         "text": "+# to Maximum Damage", | ||||||
|  |         "save_bits": [ | ||||||
|  |             7 | ||||||
|  |         ], | ||||||
|  |         "save_add": 0, | ||||||
|  |         "save_param_bits": null | ||||||
|  |     }, | ||||||
|     "179": { |     "179": { | ||||||
|         "text": "#% to Attack Rating versus [Monster Type]", |         "text": "#% to Attack Rating versus [Monster Type]", | ||||||
|         "save_bits": [ |         "save_bits": [ | ||||||
|   | |||||||
| @@ -139,3 +139,52 @@ class ParseItemTest(unittest.TestCase): | |||||||
|         data, item = parse_item(data) |         data, item = parse_item(data) | ||||||
|         self.assertEqual(data, b"") |         self.assertEqual(data, b"") | ||||||
|         self.assertEqual(str(item.stats[7]), "+2 to Druid Skill Levels") |         self.assertEqual(str(item.stats[7]), "+2 to Druid Skill Levels") | ||||||
|  |  | ||||||
|  |     def test_stat_min_max_damage(self): | ||||||
|  |         # Magic javelin with 3 to minimum damage and 21 attack rating | ||||||
|  |         # Mod is id 21 (mindmg) | ||||||
|  |         # Note: Since this is a javelin, it also has the stat 159 (min throwing dmg) | ||||||
|  |         data = bytes.fromhex( | ||||||
|  |             "10008000050014dddb05074ae2c006f10e701010a065420515864fc37f" | ||||||
|  |         ) | ||||||
|  |         data, item = parse_item(data) | ||||||
|  |         self.assertEqual(data, b"") | ||||||
|  |         self.assertEqual(str(item.stats[1]), "+3 to Minimum Damage") | ||||||
|  |         self.assertEqual(str(item.stats[2]), "+3 to Minimum Damage") | ||||||
|  |  | ||||||
|  |         # Rare spear with 2 max dmg + some other stats | ||||||
|  |         # Mod is id 24 (secondary_maxdmg) | ||||||
|  |         data = bytes.fromhex( | ||||||
|  |             "10008000050094e6095cd89f590b23557340c2629612233cf09010a14183094260109c6866232080cc7f" | ||||||
|  |         ) | ||||||
|  |         data, item = parse_item(data) | ||||||
|  |         self.assertEqual(data, b"") | ||||||
|  |         self.assertEqual(str(item.stats[2]), "+2 to Maximum Damage") | ||||||
|  |  | ||||||
|  |         # Unique: Husoldal Evo | ||||||
|  |         # Adds 20-32 damage mod + its other stats | ||||||
|  |         # Mod is 2 stats: id 23 (secondary_mindmg) and id 24 (secondary_maxdmg) | ||||||
|  |         data = bytes.fromhex( | ||||||
|  |             "10008000051cd4611704229c67b1472db89111a158b109e95ca0308094c85d507502ff01" | ||||||
|  |         ) | ||||||
|  |         data, item = parse_item(data) | ||||||
|  |         self.assertEqual(data, b"") | ||||||
|  |         self.assertEqual(str(item.stats[2]), "+20 to Minimum Damage") | ||||||
|  |         self.assertEqual(str(item.stats[3]), "+32 to Maximum Damage") | ||||||
|  |  | ||||||
|  |         # Jewel with minimum & maximum damage (+ others) | ||||||
|  |         # This jewel has all of the stats: | ||||||
|  |         # Primary (21, 22) | ||||||
|  |         # Secondary (23, 24) | ||||||
|  |         # Throwing (159, 160) | ||||||
|  |         data = bytes.fromhex( | ||||||
|  |             "10008000050014dd004269ea621ed446f0e05be494e9d02b0e9ca8a058085c50300464045e7c524005fe03" | ||||||
|  |         ) | ||||||
|  |         data, item = parse_item(data) | ||||||
|  |         self.assertEqual(data, b"") | ||||||
|  |         self.assertEqual(str(item.stats[1]), "+10 to Minimum Damage") | ||||||
|  |         self.assertEqual(str(item.stats[2]), "+1 to Maximum Damage") | ||||||
|  |         self.assertEqual(str(item.stats[3]), "+10 to Minimum Damage") | ||||||
|  |         self.assertEqual(str(item.stats[4]), "+1 to Maximum Damage") | ||||||
|  |         self.assertEqual(str(item.stats[6]), "+10 to Minimum Damage") | ||||||
|  |         self.assertEqual(str(item.stats[7]), "+1 to Maximum Damage") | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user