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")
|
dr = csv.DictReader(f, delimiter="\t")
|
||||||
index = 0
|
index = 0
|
||||||
for row in dr:
|
for row in dr:
|
||||||
|
if row["Name"] == "Expansion":
|
||||||
|
continue
|
||||||
index += 1
|
index += 1
|
||||||
if len(row["Name"]) == 0:
|
if len(row["Name"]) == 0:
|
||||||
continue
|
continue
|
||||||
affixes["prefixes"][index] = {
|
affixes["prefixes"][index] = {
|
||||||
"name": row["Name"],
|
"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"],
|
"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")
|
dr = csv.DictReader(f, delimiter="\t")
|
||||||
index = 0
|
index = 0
|
||||||
for row in dr:
|
for row in dr:
|
||||||
|
if row["Name"] == "Expansion":
|
||||||
|
continue
|
||||||
index += 1
|
index += 1
|
||||||
if len(row["Name"]) == 0:
|
if len(row["Name"]) == 0:
|
||||||
continue
|
continue
|
||||||
affixes["suffixes"][index] = {
|
affixes["suffixes"][index] = {
|
||||||
"name": row["Name"],
|
"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"],
|
"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
|
_unique_map = None
|
||||||
_set_item_map = None
|
_set_item_map = None
|
||||||
_runeword_map = None
|
_runeword_map = None
|
||||||
|
_affix_map = None
|
||||||
|
|
||||||
|
|
||||||
class Quality(IntEnum):
|
class Quality(IntEnum):
|
||||||
@@ -286,9 +287,11 @@ class Item:
|
|||||||
# TODO: What affects runeword level? Only the sockets?
|
# TODO: What affects runeword level? Only the sockets?
|
||||||
pass
|
pass
|
||||||
elif self.quality in [Quality.MAGIC, Quality.RARE, Quality.CRAFTED]:
|
elif self.quality in [Quality.MAGIC, Quality.RARE, Quality.CRAFTED]:
|
||||||
for m, id in [("suffixes", id) for id in self.suffixes] + [
|
for m, id in [(False, id) for id in self.suffixes] + [
|
||||||
("prefixes", id) for id in self.prefixes
|
(True, id) for id in self.prefixes
|
||||||
]:
|
]:
|
||||||
|
if id == 0:
|
||||||
|
continue
|
||||||
affix = lookup_affix(id, m)
|
affix = lookup_affix(id, m)
|
||||||
reqs["lvl"] = max(reqs["lvl"], affix["req_lvl"])
|
reqs["lvl"] = max(reqs["lvl"], affix["req_lvl"])
|
||||||
if affix["req_class"]:
|
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]:
|
def parse_rare_data(bits: bitarray, item: Item) -> tuple[Item, int]:
|
||||||
item.nameword1 = ba2int(bits[0:8])
|
item.nameword1 = ba2int(bits[0:8])
|
||||||
item.nameword2 = ba2int(bits[8:16])
|
item.nameword2 = ba2int(bits[8:16])
|
||||||
affixes = []
|
item.prefixes = []
|
||||||
|
item.suffixes = []
|
||||||
ptr = 16
|
ptr = 16
|
||||||
for _ in range(0, 6):
|
for _ in range(0, 3):
|
||||||
|
# Prefix
|
||||||
(affix, sz) = parse_affix(bits[ptr:])
|
(affix, sz) = parse_affix(bits[ptr:])
|
||||||
ptr += sz
|
ptr += sz
|
||||||
affixes.append(affix)
|
if affix:
|
||||||
item.prefixes = [affix for affix in affixes[0:3] if affix is not None]
|
item.prefixes.append(affix)
|
||||||
item.suffixes = [affix for affix in affixes[3:6] if affix is not None]
|
# Suffix
|
||||||
|
(affix, sz) = parse_affix(bits[ptr:])
|
||||||
|
ptr += sz
|
||||||
|
if affix:
|
||||||
|
item.suffixes.append(affix)
|
||||||
|
|
||||||
return item, ptr
|
return item, ptr
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import unittest
|
import unittest
|
||||||
from d2warehouse.parser import parse_item
|
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):
|
class ParseItemTest(unittest.TestCase):
|
||||||
@@ -214,3 +214,29 @@ class ParseItemTest(unittest.TestCase):
|
|||||||
|
|
||||||
data, _ = parse_item(data)
|
data, _ = parse_item(data)
|
||||||
self.assertEqual(data, b"")
|
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