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]:
|
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
|
ptr = 0
|
||||||
|
|
||||||
if cls == "tome":
|
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])
|
item.durability = ba2int(bits[ptr : ptr + 8])
|
||||||
ptr += 8 + 1 # uknown bit after durability
|
ptr += 8 + 1 # uknown bit after durability
|
||||||
|
|
||||||
if cls in ["tome", "stackable"]:
|
if stackable:
|
||||||
item.quantity = ba2int(bits[ptr : ptr + 9])
|
item.quantity = ba2int(bits[ptr : ptr + 9])
|
||||||
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[1]), "Lightning Resist +13%")
|
||||||
self.assertEqual(str(item.stats[2]), "Cold Resist +13%")
|
self.assertEqual(str(item.stats[2]), "Cold Resist +13%")
|
||||||
self.assertEqual(str(item.stats[3]), "Poison 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