Split stackable property away from the class in items.json
This commit is contained in:
72
contrib/items.py
Normal file
72
contrib/items.py
Normal 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
@@ -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
|
||||
|
||||
|
||||
@@ -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"")
|
||||
|
||||
Reference in New Issue
Block a user