Split stackable property away from the class in items.json

This commit is contained in:
2023-10-25 14:30:30 +02:00
parent 1ae1095cd6
commit 074964aa87
4 changed files with 3247 additions and 2562 deletions

72
contrib/items.py Normal file
View File

@@ -0,0 +1,72 @@
import json
import csv
items = {}
item_patches = {
"tbk": {"class": "tome"},
"ibk": {"class": "tome"},
}
# build code -> names map
with open("item-names.json", encoding="utf-8-sig") as f:
names = json.load(f)
names = []
for entry in names:
code = entry["Key"]
if len(code) != 3 or not code.islower():
continue
name = entry["enUS"]
names[code] = {"name": name}
# Extract items
with open("armor.txt", newline="") as f:
reader = csv.DictReader(f, delimiter="\t")
for row in reader:
if row["name"] == "Expansion":
continue
code = row["code"]
assert code not in items
items[code] = {
"name": names[code] if code in names else row["name"],
"class": "armor",
"type": row["type"],
"stackable": bool(row["stackable"]),
}
with open("weapons.txt", newline="") as f:
reader = csv.DictReader(f, delimiter="\t")
for row in reader:
if row["name"] == "Expansion":
continue
code = row["code"]
if code in items:
print("Already in", code)
assert code not in items
items[code] = {
"name": names[code] if code in names else row["name"],
"class": "weapon",
"type": row["type"],
"stackable": bool(row["stackable"]),
}
with open("misc.txt", newline="") as f:
reader = csv.DictReader(f, delimiter="\t")
for row in reader:
if row["name"] == "Expansion":
continue
code = row["code"]
assert code not in items
items[code] = {
"name": names[code] if code in names else row["name"],
"class": "misc",
"type": row["type"],
"stackable": bool(row["stackable"]),
}
for code, patch in item_patches.items():
items[code].update(patch)
with open("items.json", "w") as f:
json.dump(items, f, indent=4)

File diff suppressed because it is too large Load Diff

View File

@@ -311,7 +311,9 @@ def parse_personalization(bits: bitarray) -> tuple[str, int]:
def parse_basetype_data(bits: bitarray, item: Item) -> tuple[Item, int]:
cls = lookup_basetype(item.code)["class"]
basetype = lookup_basetype(item.code)
cls = basetype["class"]
stackable = basetype["stackable"]
ptr = 0
if cls == "tome":
@@ -331,7 +333,7 @@ def parse_basetype_data(bits: bitarray, item: Item) -> tuple[Item, int]:
item.durability = ba2int(bits[ptr : ptr + 8])
ptr += 8 + 1 # uknown bit after durability
if cls in ["tome", "stackable"]:
if stackable:
item.quantity = ba2int(bits[ptr : ptr + 9])
ptr += 9

View File

@@ -113,3 +113,8 @@ class ParseItemTest(unittest.TestCase):
self.assertEqual(str(item.stats[1]), "Lightning Resist +13%")
self.assertEqual(str(item.stats[2]), "Cold Resist +13%")
self.assertEqual(str(item.stats[3]), "Poison Resist +13%")
def test_stackable_weapon(self):
data = bytes.fromhex("10208000054814dddb852a79b4708640408096ff")
data, item = parse_item(data)
self.assertEqual(data, b"")