Add Enhanced, +Min/Max Damage exceptions to contrib/stats.py
Fixes https://gitlab.com/omicron-oss/d2warehouse/-/issues/1
This commit is contained in:
@@ -27,6 +27,18 @@ special_stats = {
|
|||||||
"poisonlength": None,
|
"poisonlength": None,
|
||||||
"mindamage": "dmg-norm",
|
"mindamage": "dmg-norm",
|
||||||
"maxdamage": None,
|
"maxdamage": None,
|
||||||
|
"item_maxdamage_percent": "dmg%", # max before min for this stat
|
||||||
|
"item_mindamage_percent": None,
|
||||||
|
}
|
||||||
|
|
||||||
|
# Patching of missing data in properties.txt
|
||||||
|
# NOTE: Ideally we should implement the description functions referenced in itemstatcost.txt
|
||||||
|
# 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.
|
||||||
|
properties_patches = {
|
||||||
|
"dmg-min": {"stat1": "secondary_mindamage"},
|
||||||
|
"dmg-max": {"stat1": "secondary_maxdamage"},
|
||||||
|
"dmg%": {"stat1": "item_maxdamage_percent", "stat2": "item_mindamage_percent"},
|
||||||
}
|
}
|
||||||
|
|
||||||
properties = {}
|
properties = {}
|
||||||
@@ -34,6 +46,8 @@ stat_to_prop = {}
|
|||||||
with open(os.path.join(path, "properties.txt")) as f:
|
with open(os.path.join(path, "properties.txt")) as f:
|
||||||
reader = csv.DictReader(f, delimiter="\t")
|
reader = csv.DictReader(f, delimiter="\t")
|
||||||
for row in reader:
|
for row in reader:
|
||||||
|
if row["code"] in properties_patches:
|
||||||
|
row.update(properties_patches[row["code"]])
|
||||||
if len(row["stat1"]) == 0 or len(row["*Tooltip"]) == 0:
|
if len(row["stat1"]) == 0 or len(row["*Tooltip"]) == 0:
|
||||||
continue
|
continue
|
||||||
prop = {
|
prop = {
|
||||||
@@ -94,3 +108,4 @@ for stat, statdat in itemstatcost.items():
|
|||||||
|
|
||||||
with open("stats.json", "w", newline="\n") as f:
|
with open("stats.json", "w", newline="\n") as f:
|
||||||
json.dump(stats, f, indent=4)
|
json.dump(stats, f, indent=4)
|
||||||
|
f.write("\n")
|
||||||
|
|||||||
@@ -63,6 +63,15 @@
|
|||||||
"save_add": 0,
|
"save_add": 0,
|
||||||
"save_param_bits": null
|
"save_param_bits": null
|
||||||
},
|
},
|
||||||
|
"17": {
|
||||||
|
"text": "+#% Enhanced Damage",
|
||||||
|
"save_bits": [
|
||||||
|
9,
|
||||||
|
9
|
||||||
|
],
|
||||||
|
"save_add": 0,
|
||||||
|
"save_param_bits": null
|
||||||
|
},
|
||||||
"19": {
|
"19": {
|
||||||
"text": "+# to Attack Rating",
|
"text": "+# to Attack Rating",
|
||||||
"save_bits": [
|
"save_bits": [
|
||||||
@@ -88,6 +97,22 @@
|
|||||||
"save_add": 0,
|
"save_add": 0,
|
||||||
"save_param_bits": null
|
"save_param_bits": null
|
||||||
},
|
},
|
||||||
|
"23": {
|
||||||
|
"text": "+# to Minimum Damage",
|
||||||
|
"save_bits": [
|
||||||
|
6
|
||||||
|
],
|
||||||
|
"save_add": 0,
|
||||||
|
"save_param_bits": null
|
||||||
|
},
|
||||||
|
"24": {
|
||||||
|
"text": "+# to Maximum Damage",
|
||||||
|
"save_bits": [
|
||||||
|
7
|
||||||
|
],
|
||||||
|
"save_add": 0,
|
||||||
|
"save_param_bits": null
|
||||||
|
},
|
||||||
"27": {
|
"27": {
|
||||||
"text": "Regenerate Mana #%",
|
"text": "Regenerate Mana #%",
|
||||||
"save_bits": [
|
"save_bits": [
|
||||||
@@ -1639,4 +1664,4 @@
|
|||||||
"save_add": 0,
|
"save_add": 0,
|
||||||
"save_param_bits": null
|
"save_param_bits": null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -58,12 +58,15 @@ class Stat:
|
|||||||
text: str | None = None
|
text: str | None = None
|
||||||
|
|
||||||
def print(self, indent=5):
|
def print(self, indent=5):
|
||||||
|
print(" " * indent, str(self))
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
subst_text = self.text
|
subst_text = self.text
|
||||||
for val in self.values:
|
for val in self.values:
|
||||||
subst_text = subst_text.replace("#", str(val), 1)
|
subst_text = subst_text.replace("#", str(val), 1)
|
||||||
if self.parameter:
|
if self.parameter:
|
||||||
subst_text = re.sub(r"\[[^\]]*\]", str(self.parameter), subst_text, 1)
|
subst_text = re.sub(r"\[[^\]]*\]", str(self.parameter), subst_text, 1)
|
||||||
print(" " * indent, subst_text)
|
return subst_text
|
||||||
|
|
||||||
|
|
||||||
def txtbits(bits: bitarray) -> str:
|
def txtbits(bits: bitarray) -> str:
|
||||||
|
|||||||
@@ -69,3 +69,14 @@ class ParseItemTest(unittest.TestCase):
|
|||||||
self.assertEqual(item.quality, Quality.HIGH)
|
self.assertEqual(item.quality, Quality.HIGH)
|
||||||
self.assertEqual(len(item.stats), 2)
|
self.assertEqual(len(item.stats), 2)
|
||||||
self.assertEqual(item.sockets, 2)
|
self.assertEqual(item.sockets, 2)
|
||||||
|
|
||||||
|
def test_ed_max(self):
|
||||||
|
# test bugfix for https://gitlab.com/omicron-oss/d2warehouse/-/issues/1
|
||||||
|
data = bytes.fromhex(
|
||||||
|
"10008000050094e6095cd89f590b23557340c2629612233cf09010a14183094260109c6866232080cc7f"
|
||||||
|
)
|
||||||
|
data, item = parse_item(data)
|
||||||
|
self.assertEqual(data, b"")
|
||||||
|
self.assertEqual(item.code, "spr")
|
||||||
|
self.assertEqual(str(item.stats[0]), "+13% Enhanced Damage")
|
||||||
|
self.assertEqual(str(item.stats[2]), "+2 to Maximum Damage")
|
||||||
|
|||||||
Reference in New Issue
Block a user