forked from omicron/d2warehouse
Fix bugs with affixes lookup
This commit is contained in:
@@ -11,12 +11,14 @@ with open(os.path.join(path, "magicprefix.txt")) as f:
|
||||
dr = csv.DictReader(f, delimiter="\t")
|
||||
index = 0
|
||||
for row in dr:
|
||||
if row["Name"] == "Expansion":
|
||||
continue
|
||||
index += 1
|
||||
if len(row["Name"]) == 0:
|
||||
continue
|
||||
affixes["prefixes"][index] = {
|
||||
"name": row["Name"],
|
||||
"req_lvl": row["levelreq"],
|
||||
"req_lvl": 0 if len(row["levelreq"]) == 0 else int(row["levelreq"]),
|
||||
"req_class": None if len(row["class"]) == 0 else row["class"],
|
||||
}
|
||||
|
||||
@@ -24,12 +26,14 @@ with open(os.path.join(path, "magicsuffix.txt")) as f:
|
||||
dr = csv.DictReader(f, delimiter="\t")
|
||||
index = 0
|
||||
for row in dr:
|
||||
if row["Name"] == "Expansion":
|
||||
continue
|
||||
index += 1
|
||||
if len(row["Name"]) == 0:
|
||||
continue
|
||||
affixes["suffixes"][index] = {
|
||||
"name": row["Name"],
|
||||
"req_lvl": row["levelreq"],
|
||||
"req_lvl": 0 if len(row["levelreq"]) == 0 else int(row["levelreq"]),
|
||||
"req_class": None if len(row["class"]) == 0 else row["class"],
|
||||
}
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -31,6 +31,7 @@ _stats_map = None
|
||||
_unique_map = None
|
||||
_set_item_map = None
|
||||
_runeword_map = None
|
||||
_affix_map = None
|
||||
|
||||
|
||||
class Quality(IntEnum):
|
||||
@@ -286,9 +287,11 @@ class Item:
|
||||
# TODO: What affects runeword level? Only the sockets?
|
||||
pass
|
||||
elif self.quality in [Quality.MAGIC, Quality.RARE, Quality.CRAFTED]:
|
||||
for m, id in [("suffixes", id) for id in self.suffixes] + [
|
||||
("prefixes", id) for id in self.prefixes
|
||||
for m, id in [(False, id) for id in self.suffixes] + [
|
||||
(True, id) for id in self.prefixes
|
||||
]:
|
||||
if id == 0:
|
||||
continue
|
||||
affix = lookup_affix(id, m)
|
||||
reqs["lvl"] = max(reqs["lvl"], affix["req_lvl"])
|
||||
if affix["req_class"]:
|
||||
|
||||
@@ -268,14 +268,20 @@ def parse_set_data(bits: bitarray, item: Item) -> tuple[Item, int]:
|
||||
def parse_rare_data(bits: bitarray, item: Item) -> tuple[Item, int]:
|
||||
item.nameword1 = ba2int(bits[0:8])
|
||||
item.nameword2 = ba2int(bits[8:16])
|
||||
affixes = []
|
||||
item.prefixes = []
|
||||
item.suffixes = []
|
||||
ptr = 16
|
||||
for _ in range(0, 6):
|
||||
for _ in range(0, 3):
|
||||
# Prefix
|
||||
(affix, sz) = parse_affix(bits[ptr:])
|
||||
ptr += sz
|
||||
affixes.append(affix)
|
||||
item.prefixes = [affix for affix in affixes[0:3] if affix is not None]
|
||||
item.suffixes = [affix for affix in affixes[3:6] if affix is not None]
|
||||
if affix:
|
||||
item.prefixes.append(affix)
|
||||
# Suffix
|
||||
(affix, sz) = parse_affix(bits[ptr:])
|
||||
ptr += sz
|
||||
if affix:
|
||||
item.suffixes.append(affix)
|
||||
|
||||
return item, ptr
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import unittest
|
||||
from d2warehouse.parser import parse_item
|
||||
from d2warehouse.item import Quality, lookup_runeword
|
||||
from d2warehouse.item import Quality, lookup_affix, lookup_runeword
|
||||
|
||||
|
||||
class ParseItemTest(unittest.TestCase):
|
||||
@@ -214,3 +214,29 @@ class ParseItemTest(unittest.TestCase):
|
||||
|
||||
data, _ = parse_item(data)
|
||||
self.assertEqual(data, b"")
|
||||
|
||||
def test_affixes(self):
|
||||
data = bytes.fromhex(
|
||||
"1000800005d0f4aa09173a36bf0723542d351ae4236acbd27000c30201a1052810208cf1241b4c50fc07"
|
||||
)
|
||||
data, item = parse_item(data)
|
||||
self.assertEqual(data, b"")
|
||||
|
||||
req = item.requirements()
|
||||
self.assertEqual(req["lvl"], 4)
|
||||
# +8 stamina
|
||||
self.assertAlmostEqual(lookup_affix(item.prefixes[0], True)["name"], "Rugged")
|
||||
# 16% ed
|
||||
self.assertAlmostEqual(lookup_affix(item.prefixes[1], True)["name"], "Sturdy")
|
||||
# 10% fhr
|
||||
self.assertAlmostEqual(
|
||||
lookup_affix(item.suffixes[0], False)["name"], "of Balance"
|
||||
)
|
||||
# +1 dex
|
||||
self.assertAlmostEqual(
|
||||
lookup_affix(item.suffixes[1], False)["name"], "of Dexterity"
|
||||
)
|
||||
# Lightning bolt on hit
|
||||
self.assertAlmostEqual(
|
||||
lookup_affix(item.suffixes[2], False)["name"], "of Charged Shield"
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user