From b5b7149c796854af10d8e476345f51d674bec870 Mon Sep 17 00:00:00 2001 From: omicron Date: Wed, 25 Oct 2023 16:41:27 +0200 Subject: [PATCH] Fix issue in item extraction when stackable is "0" instead of "" --- contrib/items.py | 6 +- d2warehouse/data/items.json | 282 +++++++++++++-------------- d2warehouse/tests/test_parse_item.py | 6 + 3 files changed, 150 insertions(+), 144 deletions(-) diff --git a/contrib/items.py b/contrib/items.py index 2022d1b..11aa2b5 100644 --- a/contrib/items.py +++ b/contrib/items.py @@ -32,7 +32,7 @@ with open("armor.txt", newline="") as f: "name": names[code] if code in names else row["name"], "class": "armor", "type": row["type"], - "stackable": bool(row["stackable"]), + "stackable": row["stackable"] == "1", } with open("weapons.txt", newline="") as f: @@ -48,7 +48,7 @@ with open("weapons.txt", newline="") as f: "name": names[code] if code in names else row["name"], "class": "weapon", "type": row["type"], - "stackable": bool(row["stackable"]), + "stackable": row["stackable"] == "1", } with open("misc.txt", newline="") as f: @@ -62,7 +62,7 @@ with open("misc.txt", newline="") as f: "name": names[code] if code in names else row["name"], "class": "misc", "type": row["type"], - "stackable": bool(row["stackable"]), + "stackable": row["stackable"] == "1", } for code, patch in item_patches.items(): diff --git a/d2warehouse/data/items.json b/d2warehouse/data/items.json index 5028329..c161d11 100644 --- a/d2warehouse/data/items.json +++ b/d2warehouse/data/items.json @@ -3051,61 +3051,61 @@ "name": "Elixir", "class": "misc", "type": "elix", - "stackable": true + "stackable": false }, "hpo": { "name": "Healing Potion", "class": "misc", "type": "hpot", - "stackable": true + "stackable": false }, "mpo": { "name": "Mana Potion", "class": "misc", "type": "mpot", - "stackable": true + "stackable": false }, "hpf": { "name": "Full Healing Potion", "class": "misc", "type": "hpot", - "stackable": true + "stackable": false }, "mpf": { "name": "Full Mana Potion", "class": "misc", "type": "mpot", - "stackable": true + "stackable": false }, "vps": { "name": "Stamina Potion", "class": "misc", "type": "spot", - "stackable": true + "stackable": false }, "yps": { "name": "Antidote Potion", "class": "misc", "type": "apot", - "stackable": true + "stackable": false }, "rvs": { "name": "Rejuvenation Potion", "class": "misc", "type": "rpot", - "stackable": true + "stackable": false }, "rvl": { "name": "Full Rejuvenation Potion", "class": "misc", "type": "rpot", - "stackable": true + "stackable": false }, "wms": { "name": "Thawing Potion", "class": "misc", "type": "wpot", - "stackable": true + "stackable": false }, "tbk": { "name": "Tome of Town Portal", @@ -3123,19 +3123,19 @@ "name": "Amulet", "class": "misc", "type": "amul", - "stackable": true + "stackable": false }, "vip": { "name": "Amulet of the Viper", "class": "misc", "type": "amul", - "stackable": true + "stackable": false }, "rin": { "name": "Ring", "class": "misc", "type": "ring", - "stackable": true + "stackable": false }, "gld": { "name": "Gold", @@ -3147,13 +3147,13 @@ "name": "Scroll of Inifuss", "class": "misc", "type": "ques", - "stackable": true + "stackable": false }, "bkd": { "name": "Key to the Cairn Stones", "class": "misc", "type": "ques", - "stackable": true + "stackable": false }, "aqv": { "name": "Arrows", @@ -3165,7 +3165,7 @@ "name": "Torch", "class": "misc", "type": "torc", - "stackable": true + "stackable": false }, "cqv": { "name": "Bolts", @@ -3177,85 +3177,85 @@ "name": "Scroll of Town Portal", "class": "misc", "type": "scro", - "stackable": true + "stackable": false }, "isc": { "name": "Scroll of Identify", "class": "misc", "type": "scro", - "stackable": true + "stackable": false }, "hrt": { "name": "Heart", "class": "misc", "type": "body", - "stackable": true + "stackable": false }, "brz": { "name": "Brain", "class": "misc", "type": "body", - "stackable": true + "stackable": false }, "jaw": { "name": "Jawbone", "class": "misc", "type": "body", - "stackable": true + "stackable": false }, "eyz": { "name": "Eye", "class": "misc", "type": "body", - "stackable": true + "stackable": false }, "hrn": { "name": "Horn", "class": "misc", "type": "body", - "stackable": true + "stackable": false }, "tal": { "name": "Tail", "class": "misc", "type": "body", - "stackable": true + "stackable": false }, "flg": { "name": "Flag", "class": "misc", "type": "body", - "stackable": true + "stackable": false }, "fng": { "name": "Fang", "class": "misc", "type": "body", - "stackable": true + "stackable": false }, "qll": { "name": "Quill", "class": "misc", "type": "body", - "stackable": true + "stackable": false }, "sol": { "name": "Soul", "class": "misc", "type": "body", - "stackable": true + "stackable": false }, "scz": { "name": "Scalp", "class": "misc", "type": "body", - "stackable": true + "stackable": false }, "spe": { "name": "Spleen", "class": "misc", "type": "body", - "stackable": true + "stackable": false }, "key": { "name": "Key", @@ -3267,373 +3267,373 @@ "name": "The Black Tower Key", "class": "misc", "type": "key", - "stackable": true + "stackable": false }, "xyz": { "name": "Potion of Life", "class": "misc", "type": "ques", - "stackable": true + "stackable": false }, "j34": { "name": "A Jade Figurine", "class": "misc", "type": "ques", - "stackable": true + "stackable": false }, "g34": { "name": "The Golden Bird", "class": "misc", "type": "ques", - "stackable": true + "stackable": false }, "bbb": { "name": "Lam Esen's Tome", "class": "misc", "type": "ques", - "stackable": true + "stackable": false }, "box": { "name": "Horadric Cube", "class": "misc", "type": "ques", - "stackable": true + "stackable": false }, "tr1": { "name": "Horadric Scroll", "class": "misc", "type": "ques", - "stackable": true + "stackable": false }, "mss": { "name": "Mephisto's Soulstone", "class": "misc", "type": "ques", - "stackable": true + "stackable": false }, "ass": { "name": "Book of Skill", "class": "misc", "type": "ques", - "stackable": true + "stackable": false }, "qey": { "name": "Khalim's Eye", "class": "misc", "type": "ques", - "stackable": true + "stackable": false }, "qhr": { "name": "Khalim's Heart", "class": "misc", "type": "ques", - "stackable": true + "stackable": false }, "qbr": { "name": "Khalim's Brain", "class": "misc", "type": "ques", - "stackable": true + "stackable": false }, "ear": { "name": "Ear", "class": "misc", "type": "play", - "stackable": true + "stackable": false }, "gcv": { "name": "Chipped Amethyst", "class": "misc", "type": "gema", - "stackable": true + "stackable": false }, "gfv": { "name": "Flawed Amethyst", "class": "misc", "type": "gema", - "stackable": true + "stackable": false }, "gsv": { "name": "Amethyst", "class": "misc", "type": "gema", - "stackable": true + "stackable": false }, "gzv": { "name": "Flawless Amethyst", "class": "misc", "type": "gema", - "stackable": true + "stackable": false }, "gpv": { "name": "Perfect Amethyst", "class": "misc", "type": "gema", - "stackable": true + "stackable": false }, "gcy": { "name": "Chipped Topaz", "class": "misc", "type": "gemt", - "stackable": true + "stackable": false }, "gfy": { "name": "Flawed Topaz", "class": "misc", "type": "gemt", - "stackable": true + "stackable": false }, "gsy": { "name": "Topaz", "class": "misc", "type": "gemt", - "stackable": true + "stackable": false }, "gly": { "name": "Flawless Topaz", "class": "misc", "type": "gemt", - "stackable": true + "stackable": false }, "gpy": { "name": "Perfect Topaz", "class": "misc", "type": "gemt", - "stackable": true + "stackable": false }, "gcb": { "name": "Chipped Sapphire", "class": "misc", "type": "gems", - "stackable": true + "stackable": false }, "gfb": { "name": "Flawed Sapphire", "class": "misc", "type": "gems", - "stackable": true + "stackable": false }, "gsb": { "name": "Sapphire", "class": "misc", "type": "gems", - "stackable": true + "stackable": false }, "glb": { "name": "Flawless Sapphire", "class": "misc", "type": "gems", - "stackable": true + "stackable": false }, "gpb": { "name": "Perfect Sapphire", "class": "misc", "type": "gems", - "stackable": true + "stackable": false }, "gcg": { "name": "Chipped Emerald", "class": "misc", "type": "geme", - "stackable": true + "stackable": false }, "gfg": { "name": "Flawed Emerald", "class": "misc", "type": "geme", - "stackable": true + "stackable": false }, "gsg": { "name": "Emerald", "class": "misc", "type": "geme", - "stackable": true + "stackable": false }, "glg": { "name": "Flawless Emerald", "class": "misc", "type": "geme", - "stackable": true + "stackable": false }, "gpg": { "name": "Perfect Emerald", "class": "misc", "type": "geme", - "stackable": true + "stackable": false }, "gcr": { "name": "Chipped Ruby", "class": "misc", "type": "gemr", - "stackable": true + "stackable": false }, "gfr": { "name": "Flawed Ruby", "class": "misc", "type": "gemr", - "stackable": true + "stackable": false }, "gsr": { "name": "Ruby", "class": "misc", "type": "gemr", - "stackable": true + "stackable": false }, "glr": { "name": "Flawless Ruby", "class": "misc", "type": "gemr", - "stackable": true + "stackable": false }, "gpr": { "name": "Perfect Ruby", "class": "misc", "type": "gemr", - "stackable": true + "stackable": false }, "gcw": { "name": "Chipped Diamond", "class": "misc", "type": "gemd", - "stackable": true + "stackable": false }, "gfw": { "name": "Flawed Diamond", "class": "misc", "type": "gemd", - "stackable": true + "stackable": false }, "gsw": { "name": "Diamond", "class": "misc", "type": "gemd", - "stackable": true + "stackable": false }, "glw": { "name": "Flawless Diamond", "class": "misc", "type": "gemd", - "stackable": true + "stackable": false }, "gpw": { "name": "Perfect Diamond", "class": "misc", "type": "gemd", - "stackable": true + "stackable": false }, "hp1": { "name": "Minor Healing Potion", "class": "misc", "type": "hpot", - "stackable": true + "stackable": false }, "hp2": { "name": "Light Healing Potion", "class": "misc", "type": "hpot", - "stackable": true + "stackable": false }, "hp3": { "name": "Healing Potion", "class": "misc", "type": "hpot", - "stackable": true + "stackable": false }, "hp4": { "name": "Greater Healing Potion", "class": "misc", "type": "hpot", - "stackable": true + "stackable": false }, "hp5": { "name": "Super Healing Potion", "class": "misc", "type": "hpot", - "stackable": true + "stackable": false }, "mp1": { "name": "Minor Mana Potion", "class": "misc", "type": "mpot", - "stackable": true + "stackable": false }, "mp2": { "name": "Light Mana Potion", "class": "misc", "type": "mpot", - "stackable": true + "stackable": false }, "mp3": { "name": "Mana Potion", "class": "misc", "type": "mpot", - "stackable": true + "stackable": false }, "mp4": { "name": "Greater Mana Potion", "class": "misc", "type": "mpot", - "stackable": true + "stackable": false }, "mp5": { "name": "Super Mana Potion", "class": "misc", "type": "mpot", - "stackable": true + "stackable": false }, "skc": { "name": "Chipped Skull", "class": "misc", "type": "gemz", - "stackable": true + "stackable": false }, "skf": { "name": "Flawed Skull", "class": "misc", "type": "gemz", - "stackable": true + "stackable": false }, "sku": { "name": "Skull", "class": "misc", "type": "gemz", - "stackable": true + "stackable": false }, "skl": { "name": "Flawless Skull", "class": "misc", "type": "gemz", - "stackable": true + "stackable": false }, "skz": { "name": "Perfect Skull", "class": "misc", "type": "gemz", - "stackable": true + "stackable": false }, "hrb": { "name": "Herb", "class": "misc", "type": "herb", - "stackable": true + "stackable": false }, "cm1": { "name": "Small Charm", "class": "misc", "type": "scha", - "stackable": true + "stackable": false }, "cm2": { "name": "Large Charm", "class": "misc", "type": "mcha", - "stackable": true + "stackable": false }, "cm3": { "name": "Grand Charm", "class": "misc", "type": "lcha", - "stackable": true + "stackable": false }, "rps": { "name": "Small Red Potion", @@ -3663,294 +3663,294 @@ "name": "El Rune", "class": "misc", "type": "rune", - "stackable": true + "stackable": false }, "r02": { "name": "Eld Rune", "class": "misc", "type": "rune", - "stackable": true + "stackable": false }, "r03": { "name": "Tir Rune", "class": "misc", "type": "rune", - "stackable": true + "stackable": false }, "r04": { "name": "Nef Rune", "class": "misc", "type": "rune", - "stackable": true + "stackable": false }, "r05": { "name": "Eth Rune", "class": "misc", "type": "rune", - "stackable": true + "stackable": false }, "r06": { "name": "Ith Rune", "class": "misc", "type": "rune", - "stackable": true + "stackable": false }, "r07": { "name": "Tal Rune", "class": "misc", "type": "rune", - "stackable": true + "stackable": false }, "r08": { "name": "Ral Rune", "class": "misc", "type": "rune", - "stackable": true + "stackable": false }, "r09": { "name": "Ort Rune", "class": "misc", "type": "rune", - "stackable": true + "stackable": false }, "r10": { "name": "Thul Rune", "class": "misc", "type": "rune", - "stackable": true + "stackable": false }, "r11": { "name": "Amn Rune", "class": "misc", "type": "rune", - "stackable": true + "stackable": false }, "r12": { "name": "Sol Rune", "class": "misc", "type": "rune", - "stackable": true + "stackable": false }, "r13": { "name": "Shael Rune", "class": "misc", "type": "rune", - "stackable": true + "stackable": false }, "r14": { "name": "Dol Rune", "class": "misc", "type": "rune", - "stackable": true + "stackable": false }, "r15": { "name": "Hel Rune", "class": "misc", "type": "rune", - "stackable": true + "stackable": false }, "r16": { "name": "Io Rune", "class": "misc", "type": "rune", - "stackable": true + "stackable": false }, "r17": { "name": "Lum Rune", "class": "misc", "type": "rune", - "stackable": true + "stackable": false }, "r18": { "name": "Ko Rune", "class": "misc", "type": "rune", - "stackable": true + "stackable": false }, "r19": { "name": "Fal Rune", "class": "misc", "type": "rune", - "stackable": true + "stackable": false }, "r20": { "name": "Lem Rune", "class": "misc", "type": "rune", - "stackable": true + "stackable": false }, "r21": { "name": "Pul Rune", "class": "misc", "type": "rune", - "stackable": true + "stackable": false }, "r22": { "name": "Um Rune", "class": "misc", "type": "rune", - "stackable": true + "stackable": false }, "r23": { "name": "Mal Rune", "class": "misc", "type": "rune", - "stackable": true + "stackable": false }, "r24": { "name": "Ist Rune", "class": "misc", "type": "rune", - "stackable": true + "stackable": false }, "r25": { "name": "Gul Rune", "class": "misc", "type": "rune", - "stackable": true + "stackable": false }, "r26": { "name": "Vex Rune", "class": "misc", "type": "rune", - "stackable": true + "stackable": false }, "r27": { "name": "Ohm Rune", "class": "misc", "type": "rune", - "stackable": true + "stackable": false }, "r28": { "name": "Lo Rune", "class": "misc", "type": "rune", - "stackable": true + "stackable": false }, "r29": { "name": "Sur Rune", "class": "misc", "type": "rune", - "stackable": true + "stackable": false }, "r30": { "name": "Ber Rune", "class": "misc", "type": "rune", - "stackable": true + "stackable": false }, "r31": { "name": "Jah Rune", "class": "misc", "type": "rune", - "stackable": true + "stackable": false }, "r32": { "name": "Cham Rune", "class": "misc", "type": "rune", - "stackable": true + "stackable": false }, "r33": { "name": "Zod Rune", "class": "misc", "type": "rune", - "stackable": true + "stackable": false }, "jew": { "name": "Jewel", "class": "misc", "type": "jewl", - "stackable": true + "stackable": false }, "ice": { "name": "Malah's Potion", "class": "misc", "type": "ques", - "stackable": true + "stackable": false }, "0sc": { "name": "Scroll of Knowledge", "class": "misc", "type": "scro", - "stackable": true + "stackable": false }, "tr2": { "name": "Scroll of Resistance", "class": "misc", "type": "ques", - "stackable": true + "stackable": false }, "pk1": { "name": "Key of Terror", "class": "misc", "type": "ques", - "stackable": true + "stackable": false }, "pk2": { "name": "Key of Hate", "class": "misc", "type": "ques", - "stackable": true + "stackable": false }, "pk3": { "name": "Key of Destruction", "class": "misc", "type": "ques", - "stackable": true + "stackable": false }, "dhn": { "name": "Diablo's Horn", "class": "misc", "type": "ques", - "stackable": true + "stackable": false }, "bey": { "name": "Baal's Eye", "class": "misc", "type": "ques", - "stackable": true + "stackable": false }, "mbr": { "name": "Mephisto's Brain", "class": "misc", "type": "ques", - "stackable": true + "stackable": false }, "toa": { "name": "Token of Absolution", "class": "misc", "type": "ques", - "stackable": true + "stackable": false }, "tes": { "name": "Twisted Essence of Suffering", "class": "misc", "type": "ques", - "stackable": true + "stackable": false }, "ceh": { "name": "Charged Essense of Hatred", "class": "misc", "type": "ques", - "stackable": true + "stackable": false }, "bet": { "name": "Burning Essence of Terror", "class": "misc", "type": "ques", - "stackable": true + "stackable": false }, "fed": { "name": "Festering Essence of Destruction", "class": "misc", "type": "ques", - "stackable": true + "stackable": false }, "std": { "name": "Standard of Heroes", "class": "misc", "type": "ques", - "stackable": true + "stackable": false } } \ No newline at end of file diff --git a/d2warehouse/tests/test_parse_item.py b/d2warehouse/tests/test_parse_item.py index 00398a5..3d62678 100644 --- a/d2warehouse/tests/test_parse_item.py +++ b/d2warehouse/tests/test_parse_item.py @@ -118,3 +118,9 @@ class ParseItemTest(unittest.TestCase): data = bytes.fromhex("10208000054814dddb852a79b4708640408096ff") data, item = parse_item(data) self.assertEqual(data, b"") + + def test_token_of_absolution(self): + # this is one of the items that had stackable "0" instead of "" + data = bytes.fromhex("100080000524d4fc5f308dc1e10908fe03") + data, item = parse_item(data) + self.assertEqual(data, b"")