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