26 lines
21 KiB
JSON
26 lines
21 KiB
JSON
{
|
|
"permissions": {
|
|
"allow": [
|
|
"Bash(npx tsc:*)",
|
|
"WebFetch(domain:github.com)",
|
|
"WebSearch",
|
|
"WebFetch(domain:raw.githubusercontent.com)",
|
|
"WebFetch(domain:wiki.albiononline.com)",
|
|
"WebFetch(domain:www.tools4albion.com)",
|
|
"WebFetch(domain:albiononline2d.com)",
|
|
"WebFetch(domain:gist.github.com)",
|
|
"WebFetch(domain:forum.albiononline.com)",
|
|
"WebFetch(domain:www.albion-online-data.com)",
|
|
"WebFetch(domain:gamerifts.com)",
|
|
"WebFetch(domain:albionhub.com)",
|
|
"WebFetch(domain:hyper3d.ai)",
|
|
"WebFetch(domain:albiononlineguideblog.wordpress.com)",
|
|
"Bash(node:*)",
|
|
"Bash(python3:*)",
|
|
"Bash(curl:*)",
|
|
"Bash(cat > /tmp/gen_final.py << 'PYEOF'\n#!/usr/bin/env python3\n\"\"\"Generate corrected recipes.json and categories.json from items.json\"\"\"\nimport json, urllib.request, sys\n\nURL = \"https://raw.githubusercontent.com/ao-data/ao-bin-dumps/refs/heads/master/items.json\"\nOUT_RECIPES = \"/home/jbourdon/repos/albion-crafting-calc/src/data/recipes.json\"\nOUT_CATEGORIES = \"/home/jbourdon/repos/albion-crafting-calc/src/data/categories.json\"\n\nprint\\(\"Fetching items.json...\", file=sys.stderr\\)\nreq = urllib.request.Request\\(URL, headers={'User-Agent': 'Mozilla/5.0'}\\)\nwith urllib.request.urlopen\\(req, timeout=120\\) as r:\n raw = json.load\\(r\\)\n\nitems_root = raw['items']\nlookup = {}\nfor type_key, items_list in items_root.items\\(\\):\n if isinstance\\(items_list, list\\):\n for item in items_list:\n if isinstance\\(item, dict\\):\n name = item.get\\('@uniquename',''\\)\n if name: lookup[name] = item\n elif isinstance\\(items_list, dict\\):\n name = items_list.get\\('@uniquename',''\\)\n if name: lookup[name] = items_list\n\ndef resolve_cr\\(item\\):\n cr = item.get\\('craftingrequirements'\\)\n if cr is None: return None\n if isinstance\\(cr, list\\):\n for path in cr:\n reqs = path.get\\('craftresource', []\\)\n if isinstance\\(reqs, dict\\): reqs = [reqs]\n bad = any\\('TOKEN_FAVOR' in r.get\\('@uniquename',''\\) or 'QUESTITEM' in r.get\\('@uniquename',''\\) for r in reqs\\)\n if not bad: return path\n return cr[0]\n return cr\n\ndef extract_ings\\(cr\\):\n reqs = cr.get\\('craftresource', []\\)\n if isinstance\\(reqs, dict\\): reqs = [reqs]\n result = []\n for r in reqs:\n name = r.get\\('@uniquename',''\\)\n qty = int\\(r.get\\('@count', 1\\)\\)\n if 'TOKEN_FAVOR' in name or 'QUESTITEM' in name: continue\n result.append\\(\\(name, qty\\)\\)\n return result\n\ndef templatize\\(item_id\\):\n if item_id.startswith\\('T4_'\\): return 'T{t}_' + item_id[3:]\n if item_id.startswith\\('T3_'\\): return 'T{t-1}_' + item_id[3:]\n return item_id\n\ndef no_enchant\\(item_id\\):\n return 'ARTEFACT' in item_id or 'ALCHEMY_RARE' in item_id\n\ndef make_recipe\\(id_, display_name, category, output_tmpl, enchanted=None\\):\n t4_id = output_tmpl.replace\\('{t}','4'\\)\n item = lookup.get\\(t4_id\\)\n if not item:\n print\\(f\" NOT_FOUND: {t4_id}\", file=sys.stderr\\); return None\n cr = resolve_cr\\(item\\)\n if not cr:\n print\\(f\" NO_CR: {t4_id}\", file=sys.stderr\\); return None\n ings = extract_ings\\(cr\\)\n entry = {\n 'id': id_,\n 'displayName': display_name,\n 'category': category,\n 'outputId': output_tmpl,\n 'ingredients': []\n }\n if enchanted is False:\n entry['enchanted'] = False\n for item_id, qty in ings:\n ing = {'itemId': templatize\\(item_id\\), 'qty': qty}\n if no_enchant\\(item_id\\): ing['noEnchant'] = True\n entry['ingredients'].append\\(ing\\)\n return entry\n\n# ─── Build recipes ────────────────────────────────────────────────────────────\nrecipes = []\nW = 'Weapons'; A = 'Armor'; G = 'Gathering'; F = 'Food'; P = 'Potions'\n\ndef c\\(msg\\): recipes.append\\({'comment': msg}\\)\ndef a\\(id_, name, cat, tmpl, enchanted=None\\):\n r = make_recipe\\(id_, name, cat, tmpl, enchanted\\)\n if r: recipes.append\\(r\\)\n\nc\\('--- Bows -------------------------------------------------------------------'\\)\na\\('bow','Bow',W,'T{t}_2H_BOW'\\)\na\\('longbow','Longbow',W,'T{t}_2H_LONGBOW'\\)\na\\('warbow','Warbow',W,'T{t}_2H_WARBOW'\\)\na\\('whispering-bow','Whispering Bow',W,'T{t}_2H_LONGBOW_UNDEAD'\\)\na\\('wailing-bow','Wailing Bow',W,'T{t}_2H_BOW_HELL'\\)\na\\('bow-of-badon','Bow of Badon',W,'T{t}_2H_BOW_KEEPER'\\)\na\\('mistpiercer','Mistpiercer',W,'T{t}_2H_BOW_AVALON'\\)\na\\('skystrider-bow','Skystrider Bow',W,'T{t}_2H_BOW_CRYSTAL'\\)\n\nc\\('--- Swords \\(Bars + Leather\\) ------------------------------------------------'\\)\na\\('broadsword','Broadsword',W,'T{t}_MAIN_SWORD'\\)\na\\('claymore','Claymore',W,'T{t}_2H_CLAYMORE'\\)\na\\('dual-swords','Dual Swords',W,'T{t}_2H_DUALSWORD'\\)\n\nc\\('--- Axes \\(Planks + Bars\\) ---------------------------------------------------'\\)\na\\('battleaxe','Battleaxe',W,'T{t}_MAIN_AXE'\\)\na\\('great-axe','Great Axe',W,'T{t}_2H_AXE'\\)\na\\('halberd','Halberd',W,'T{t}_2H_HALBERD'\\)\n\nc\\('--- Maces / Hammers --------------------------------------------------------'\\)\na\\('mace','Mace',W,'T{t}_MAIN_MACE'\\)\na\\('hammer','Hammer',W,'T{t}_MAIN_HAMMER'\\)\na\\('great-hammer','Great Hammer',W,'T{t}_2H_HAMMER'\\)\na\\('polehammer','Polehammer',W,'T{t}_2H_POLEHAMMER'\\)\n\nc\\('--- Crossbows \\(Planks + Bars\\) ----------------------------------------------'\\)\na\\('light-crossbow','Light Crossbow',W,'T{t}_MAIN_1HCROSSBOW'\\)\na\\('crossbow','Crossbow',W,'T{t}_2H_CROSSBOW'\\)\na\\('heavy-crossbow','Heavy Crossbow',W,'T{t}_2H_CROSSBOWLARGE'\\)\n\nc\\('--- Daggers \\(Bars + Leather\\) -----------------------------------------------'\\)\na\\('dagger','Dagger',W,'T{t}_MAIN_DAGGER'\\)\na\\('dagger-pair','Dagger Pair',W,'T{t}_2H_DAGGERPAIR'\\)\na\\('claws','Claws',W,'T{t}_2H_CLAWPAIR'\\)\n\nc\\('--- Spears \\(Planks + Bars\\) -------------------------------------------------'\\)\na\\('spear','Spear',W,'T{t}_MAIN_SPEAR'\\)\na\\('pike','Pike',W,'T{t}_2H_SPEAR'\\)\na\\('glaive','Glaive',W,'T{t}_2H_GLAIVE'\\)\n\nc\\('--- Quarterstaves \\(Bars + Leather\\) -----------------------------------------'\\)\na\\('quarterstaff','Quarterstaff',W,'T{t}_2H_QUARTERSTAFF'\\)\na\\('iron-clad-staff','Iron-clad Staff',W,'T{t}_2H_IRONCLADEDSTAFF'\\)\na\\('double-bladed-staff','Double Bladed Staff',W,'T{t}_2H_DOUBLEBLADEDSTAFF'\\)\n\nc\\('--- Fire Staves \\(Planks + Bars\\) --------------------------------------------'\\)\na\\('fire-staff','Fire Staff',W,'T{t}_MAIN_FIRESTAFF'\\)\na\\('great-fire-staff','Great Fire Staff',W,'T{t}_2H_FIRESTAFF'\\)\na\\('inferno-staff','Inferno Staff',W,'T{t}_2H_INFERNOSTAFF'\\)\n\nc\\('--- Arcane Staves \\(Planks + Bars\\) ------------------------------------------'\\)\na\\('arcane-staff','Arcane Staff',W,'T{t}_MAIN_ARCANESTAFF'\\)\na\\('great-arcane-staff','Great Arcane Staff',W,'T{t}_2H_ARCANESTAFF'\\)\na\\('enigmatic-staff','Enigmatic Staff',W,'T{t}_2H_ENIGMATICSTAFF'\\)\n\nc\\('--- Cursed Staves \\(Planks + Bars\\) ------------------------------------------'\\)\na\\('cursed-staff','Cursed Staff',W,'T{t}_MAIN_CURSEDSTAFF'\\)\na\\('great-cursed-staff','Great Cursed Staff',W,'T{t}_2H_CURSEDSTAFF'\\)\na\\('demonic-staff','Demonic Staff',W,'T{t}_2H_DEMONICSTAFF'\\)\n\nc\\('--- Frost Staves \\(Planks + Bars\\) -------------------------------------------'\\)\na\\('frost-staff','Frost Staff',W,'T{t}_MAIN_FROSTSTAFF'\\)\na\\('great-frost-staff','Great Frost Staff',W,'T{t}_2H_FROSTSTAFF'\\)\na\\('glacial-staff','Glacial Staff',W,'T{t}_2H_GLACIALSTAFF'\\)\n\nc\\('--- Holy Staves \\(Planks + Cloth\\) -------------------------------------------'\\)\na\\('holy-staff','Holy Staff',W,'T{t}_MAIN_HOLYSTAFF'\\)\na\\('great-holy-staff','Great Holy Staff',W,'T{t}_2H_HOLYSTAFF'\\)\na\\('divine-staff','Divine Staff',W,'T{t}_2H_DIVINESTAFF'\\)\n\nc\\('--- Nature Staves \\(Planks + Cloth\\) -----------------------------------------'\\)\na\\('nature-staff','Nature Staff',W,'T{t}_MAIN_NATURESTAFF'\\)\na\\('great-nature-staff','Great Nature Staff',W,'T{t}_2H_NATURESTAFF'\\)\na\\('wild-staff','Wild Staff',W,'T{t}_2H_WILDSTAFF'\\)\n\nc\\('--- Shapeshifter Weapons \\(Planks + Leather + Alchemy\\) ----------------------'\\)\na\\('shapeshifter-claws','Shapeshifter Claws',W,'T{t}_2H_SHAPESHIFTER_SET1'\\)\na\\('shapeshifter-spear','Shapeshifter Spear',W,'T{t}_2H_SHAPESHIFTER_SET2'\\)\na\\('shapeshifter-staff','Shapeshifter Staff',W,'T{t}_2H_SHAPESHIFTER_SET3'\\)\n\nc\\('--- War Gloves \\(Bars + Leather\\) --------------------------------------------'\\)\na\\('brawler-gloves','Brawler Gloves',W,'T{t}_2H_KNUCKLES_SET1'\\)\na\\('battle-bracers','Battle Bracers',W,'T{t}_2H_KNUCKLES_SET2'\\)\na\\('ravenstrike-cestus','Ravenstrike Cestus',W,'T{t}_2H_KNUCKLES_SET3'\\)\n\nc\\('--- Off-hands ---------------------------------------------------------------'\\)\na\\('shield','Shield',W,'T{t}_OFF_SHIELD'\\)\na\\('torch','Torch',W,'T{t}_OFF_TORCH'\\)\na\\('tome-of-spells','Tome of Spells',W,'T{t}_OFF_BOOK'\\)\n\n# ─── Plate Armor ──────────────────────────────────────────────────────────────\nc\\('--- Plate Armor — sets 1-3 \\(Bars only\\) ------------------------------------'\\)\nfor sn,sl in [\\('SET1','Soldier'\\),\\('SET2','Knight'\\),\\('SET3','Guardian'\\)]:\n n = sl.lower\\(\\)\n a\\(f'{n}-helmet',f'{sl} Helmet',A,f'T{{t}}_HEAD_PLATE_{sn}'\\)\n a\\(f'{n}-armor',f'{sl} Armor',A,f'T{{t}}_ARMOR_PLATE_{sn}'\\)\n a\\(f'{n}-boots',f'{sl} Boots',A,f'T{{t}}_SHOES_PLATE_{sn}'\\)\n\nc\\('--- Plate Armor — artifact variants \\(Bars + artifact\\) ----------------------'\\)\nfor art,name in [\\('UNDEAD','Graveguard'\\),\\('HELL','Demon'\\),\\('KEEPER','Judicator'\\),\\('FEY','Duskweaver'\\),\\('AVALON','Valor'\\)]:\n n = name.lower\\(\\)\n a\\(f'{n}-helmet',f'{name} Helmet',A,f'T{{t}}_HEAD_PLATE_{art}'\\)\n a\\(f'{n}-armor',f'{name} Armor',A,f'T{{t}}_ARMOR_PLATE_{art}'\\)\n a\\(f'{n}-boots',f'{name} Boots',A,f'T{{t}}_SHOES_PLATE_{art}'\\)\n\n# ─── Leather Armor ────────────────────────────────────────────────────────────\nc\\('--- Leather Armor — sets 1-3 \\(Leather only\\) --------------------------------'\\)\nfor sn,sl in [\\('SET1','Mercenary'\\),\\('SET2','Hunter'\\),\\('SET3','Assassin'\\)]:\n n = sl.lower\\(\\)\n a\\(f'{n}-hood',f'{sl} Hood',A,f'T{{t}}_HEAD_LEATHER_{sn}'\\)\n a\\(f'{n}-jacket',f'{sl} Jacket',A,f'T{{t}}_ARMOR_LEATHER_{sn}'\\)\n a\\(f'{n}-shoes',f'{sl} Shoes',A,f'T{{t}}_SHOES_LEATHER_{sn}'\\)\n\nc\\('--- Leather Armor — artifact variants \\(Leather + artifact\\) -----------------'\\)\nfor art,name in [\\('MORGANA','Hellion'\\),\\('HELL','Specter'\\),\\('UNDEAD','Stalker'\\),\\('FEY','Mistwalker'\\),\\('AVALON','Tenacity'\\)]:\n n = name.lower\\(\\)\n a\\(f'{n}-hood',f'{name} Hood',A,f'T{{t}}_HEAD_LEATHER_{art}'\\)\n a\\(f'{n}-jacket',f'{name} Jacket',A,f'T{{t}}_ARMOR_LEATHER_{art}'\\)\n a\\(f'{n}-shoes',f'{name} Shoes',A,f'T{{t}}_SHOES_LEATHER_{art}'\\)\n\n# ─── Cloth Armor ──────────────────────────────────────────────────────────────\nc\\('--- Cloth Armor — sets 1-3 \\(Cloth only\\) ------------------------------------'\\)\nfor sn,sl,slots in [\\('SET1','Scholar',\\('Cowl','Robe','Sandals'\\)\\),\\('SET2','Cleric',\\('Cowl','Robe','Sandals'\\)\\),\\('SET3','Mage',\\('Cowl','Robe','Sandals'\\)\\)]:\n n = sl.lower\\(\\)\n a\\(f'{n}-cowl',f'{sl} {slots[0]}',A,f'T{{t}}_HEAD_CLOTH_{sn}'\\)\n a\\(f'{n}-robe',f'{sl} {slots[1]}',A,f'T{{t}}_ARMOR_CLOTH_{sn}'\\)\n a\\(f'{n}-sandals',f'{sl} {slots[2]}',A,f'T{{t}}_SHOES_CLOTH_{sn}'\\)\n\nc\\('--- Cloth Armor — artifact variants \\(Cloth + artifact\\) ---------------------'\\)\nfor art,name in [\\('KEEPER','Druid'\\),\\('HELL','Fiend'\\),\\('MORGANA','Cultist'\\),\\('FEY','Feyscale'\\),\\('AVALON','Purity'\\)]:\n n = name.lower\\(\\)\n a\\(f'{n}-cowl',f'{name} Cowl',A,f'T{{t}}_HEAD_CLOTH_{art}'\\)\n a\\(f'{n}-robe',f'{name} Robe',A,f'T{{t}}_ARMOR_CLOTH_{art}'\\)\n a\\(f'{n}-sandals',f'{name} Sandals',A,f'T{{t}}_SHOES_CLOTH_{art}'\\)\n\n# ─── Gathering ────────────────────────────────────────────────────────────────\nc\\('--- Gathering Tools \\(Planks + Bars\\) ----------------------------------------'\\)\na\\('pickaxe','Pickaxe',G,'T{t}_2H_TOOL_PICK'\\)\na\\('sickle','Sickle',G,'T{t}_2H_TOOL_SICKLE'\\)\na\\('skinning-knife','Skinning Knife',G,'T{t}_2H_TOOL_KNIFE'\\)\na\\('lumberjack-axe','Lumberjack Axe',G,'T{t}_2H_TOOL_AXE'\\)\na\\('stonesmasher','Stonesmasher',G,'T{t}_2H_TOOL_HAMMER'\\)\n\n# ─── Food ─────────────────────────────────────────────────────────────────────\nc\\('--- Food \\(enchanted: false\\) ------------------------------------------------'\\)\na\\('seaweed-salad','Seaweed Salad',F,'T{t}_MEAL_SALAD', False\\)\na\\('stew','Stew',F,'T{t}_MEAL_STEW', False\\)\na\\('sandwich','Sandwich',F,'T{t}_MEAL_SANDWICH', False\\)\n\n# ─── Potions ──────────────────────────────────────────────────────────────────\nc\\('--- Potions \\(enchanted: false\\) ---------------------------------------------'\\)\na\\('healing-potion','Healing Potion',P,'T{t}_POTION_HEAL', False\\)\na\\('energy-potion','Energy Potion',P,'T{t}_POTION_ENERGY', False\\)\na\\('cooldown-potion','Cooldown Potion',P,'T{t}_POTION_COOLDOWN', False\\)\n\n# ─── Write recipes.json ───────────────────────────────────────────────────────\nwith open\\(OUT_RECIPES, 'w'\\) as f:\n json.dump\\(recipes, f, indent=2, ensure_ascii=False\\)\n f.write\\('\\\\n'\\)\n\nrecipe_count = sum\\(1 for r in recipes if 'outputId' in r\\)\nprint\\(f\"Wrote {recipe_count} recipes to {OUT_RECIPES}\", file=sys.stderr\\)\n\n# ─── Build categories.json ────────────────────────────────────────────────────\ncategories = [\n {\"label\": \"Weapons\", \"children\": [\n {\"label\": \"Bow\", \"children\": [\n {\"label\": \"Bow\"}, {\"label\": \"Longbow\"}, {\"label\": \"Warbow\"},\n {\"label\": \"Whispering Bow\"}, {\"label\": \"Wailing Bow\"},\n {\"label\": \"Bow of Badon\"}, {\"label\": \"Mistpiercer\"}, {\"label\": \"Skystrider Bow\"}\n ]},\n {\"label\": \"Sword\", \"children\": [\n {\"label\": \"Broadsword\"}, {\"label\": \"Claymore\"}, {\"label\": \"Dual Swords\"}\n ]},\n {\"label\": \"Axe\", \"children\": [\n {\"label\": \"Battleaxe\"}, {\"label\": \"Great Axe\"}, {\"label\": \"Halberd\"}\n ]},\n {\"label\": \"Mace\", \"children\": [\n {\"label\": \"Mace\"}, {\"label\": \"Hammer\"}, {\"label\": \"Great Hammer\"}, {\"label\": \"Polehammer\"}\n ]},\n {\"label\": \"Crossbow\", \"children\": [\n {\"label\": \"Light Crossbow\"}, {\"label\": \"Crossbow\"}, {\"label\": \"Heavy Crossbow\"}\n ]},\n {\"label\": \"Dagger\", \"children\": [\n {\"label\": \"Dagger\"}, {\"label\": \"Dagger Pair\"}, {\"label\": \"Claws\"}\n ]},\n {\"label\": \"Spear\", \"children\": [\n {\"label\": \"Spear\"}, {\"label\": \"Pike\"}, {\"label\": \"Glaive\"}\n ]},\n {\"label\": \"Quarterstaff\", \"children\": [\n {\"label\": \"Quarterstaff\"}, {\"label\": \"Iron-clad Staff\"}, {\"label\": \"Double Bladed Staff\"}\n ]},\n {\"label\": \"Fire Staff\", \"children\": [\n {\"label\": \"Fire Staff\"}, {\"label\": \"Great Fire Staff\"}, {\"label\": \"Inferno Staff\"}\n ]},\n {\"label\": \"Arcane Staff\", \"children\": [\n {\"label\": \"Arcane Staff\"}, {\"label\": \"Great Arcane Staff\"}, {\"label\": \"Enigmatic Staff\"}\n ]},\n {\"label\": \"Cursed Staff\", \"children\": [\n {\"label\": \"Cursed Staff\"}, {\"label\": \"Great Cursed Staff\"}, {\"label\": \"Demonic Staff\"}\n ]},\n {\"label\": \"Frost Staff\", \"children\": [\n {\"label\": \"Frost Staff\"}, {\"label\": \"Great Frost Staff\"}, {\"label\": \"Glacial Staff\"}\n ]},\n {\"label\": \"Holy Staff\", \"children\": [\n {\"label\": \"Holy Staff\"}, {\"label\": \"Great Holy Staff\"}, {\"label\": \"Divine Staff\"}\n ]},\n {\"label\": \"Nature Staff\", \"children\": [\n {\"label\": \"Nature Staff\"}, {\"label\": \"Great Nature Staff\"}, {\"label\": \"Wild Staff\"}\n ]},\n {\"label\": \"Shapeshifter\", \"children\": [\n {\"label\": \"Shapeshifter Claws\"}, {\"label\": \"Shapeshifter Spear\"}, {\"label\": \"Shapeshifter Staff\"}\n ]},\n {\"label\": \"War Gloves\", \"children\": [\n {\"label\": \"Brawler Gloves\"}, {\"label\": \"Battle Bracers\"}, {\"label\": \"Ravenstrike Cestus\"}\n ]},\n {\"label\": \"Off-hand\", \"children\": [\n {\"label\": \"Shield\"}, {\"label\": \"Torch\"}, {\"label\": \"Tome of Spells\"}\n ]}\n ]},\n {\"label\": \"Armor\", \"children\": [\n {\"label\": \"Head\", \"children\": [\n {\"label\": \"Plate\", \"children\": [\n {\"label\": \"Soldier Helmet\"}, {\"label\": \"Knight Helmet\"}, {\"label\": \"Guardian Helmet\"},\n {\"label\": \"Graveguard Helmet\"}, {\"label\": \"Demon Helmet\"}, {\"label\": \"Judicator Helmet\"},\n {\"label\": \"Duskweaver Helmet\"}, {\"label\": \"Valor Helmet\"}\n ]},\n {\"label\": \"Leather\", \"children\": [\n {\"label\": \"Mercenary Hood\"}, {\"label\": \"Hunter Hood\"}, {\"label\": \"Assassin Hood\"},\n {\"label\": \"Hellion Hood\"}, {\"label\": \"Specter Hood\"}, {\"label\": \"Stalker Hood\"},\n {\"label\": \"Mistwalker Hood\"}, {\"label\": \"Tenacity Hood\"}\n ]},\n {\"label\": \"Cloth\", \"children\": [\n {\"label\": \"Scholar Cowl\"}, {\"label\": \"Cleric Cowl\"}, {\"label\": \"Mage Cowl\"},\n {\"label\": \"Druid Cowl\"}, {\"label\": \"Fiend Cowl\"}, {\"label\": \"Cultist Cowl\"},\n {\"label\": \"Feyscale Cowl\"}, {\"label\": \"Purity Cowl\"}\n ]}\n ]},\n {\"label\": \"Chest\", \"children\": [\n {\"label\": \"Plate\", \"children\": [\n {\"label\": \"Soldier Armor\"}, {\"label\": \"Knight Armor\"}, {\"label\": \"Guardian Armor\"},\n {\"label\": \"Graveguard Armor\"}, {\"label\": \"Demon Armor\"}, {\"label\": \"Judicator Armor\"},\n {\"label\": \"Duskweaver Armor\"}, {\"label\": \"Valor Armor\"}\n ]},\n {\"label\": \"Leather\", \"children\": [\n {\"label\": \"Mercenary Jacket\"}, {\"label\": \"Hunter Jacket\"}, {\"label\": \"Assassin Jacket\"},\n {\"label\": \"Hellion Jacket\"}, {\"label\": \"Specter Jacket\"}, {\"label\": \"Stalker Jacket\"},\n {\"label\": \"Mistwalker Jacket\"}, {\"label\": \"Tenacity Jacket\"}\n ]},\n {\"label\": \"Cloth\", \"children\": [\n {\"label\": \"Scholar Robe\"}, {\"label\": \"Cleric Robe\"}, {\"label\": \"Mage Robe\"},\n {\"label\": \"Druid Robe\"}, {\"label\": \"Fiend Robe\"}, {\"label\": \"Cultist Robe\"},\n {\"label\": \"Feyscale Robe\"}, {\"label\": \"Purity Robe\"}\n ]}\n ]},\n {\"label\": \"Boots\", \"children\": [\n {\"label\": \"Plate\", \"children\": [\n {\"label\": \"Soldier Boots\"}, {\"label\": \"Knight Boots\"}, {\"label\": \"Guardian Boots\"},\n {\"label\": \"Graveguard Boots\"}, {\"label\": \"Demon Boots\"}, {\"label\": \"Judicator Boots\"},\n {\"label\": \"Duskweaver Boots\"}, {\"label\": \"Valor Boots\"}\n ]},\n {\"label\": \"Leather\", \"children\": [\n {\"label\": \"Mercenary Shoes\"}, {\"label\": \"Hunter Shoes\"}, {\"label\": \"Assassin Shoes\"},\n {\"label\": \"Hellion Shoes\"}, {\"label\": \"Specter Shoes\"}, {\"label\": \"Stalker Shoes\"},\n {\"label\": \"Mistwalker Shoes\"}, {\"label\": \"Tenacity Shoes\"}\n ]},\n {\"label\": \"Cloth\", \"children\": [\n {\"label\": \"Scholar Sandals\"}, {\"label\": \"Cleric Sandals\"}, {\"label\": \"Mage Sandals\"},\n {\"label\": \"Druid Sandals\"}, {\"label\": \"Fiend Sandals\"}, {\"label\": \"Cultist Sandals\"},\n {\"label\": \"Feyscale Sandals\"}, {\"label\": \"Purity Sandals\"}\n ]}\n ]}\n ]},\n {\"label\": \"Gathering\", \"children\": [\n {\"label\": \"Pickaxe\"}, {\"label\": \"Sickle\"}, {\"label\": \"Skinning Knife\"},\n {\"label\": \"Lumberjack Axe\"}, {\"label\": \"Stonesmasher\"}\n ]},\n {\"label\": \"Food\", \"children\": [\n {\"label\": \"Seaweed Salad\"}, {\"label\": \"Stew\"}, {\"label\": \"Sandwich\"}\n ]},\n {\"label\": \"Potions\", \"children\": [\n {\"label\": \"Healing Potion\"}, {\"label\": \"Energy Potion\"}, {\"label\": \"Cooldown Potion\"}\n ]}\n]\n\nwith open\\(OUT_CATEGORIES, 'w'\\) as f:\n json.dump\\(categories, f, indent=2, ensure_ascii=False\\)\n f.write\\('\\\\n'\\)\n\nprint\\(f\"Wrote categories to {OUT_CATEGORIES}\", file=sys.stderr\\)\nPYEOF\necho \"Script written\")",
|
|
"Bash(do:*)"
|
|
]
|
|
}
|
|
}
|