From d35d3b629ec3cb4cb2dea9fc337f86832cbc17d2 Mon Sep 17 00:00:00 2001 From: Bryce Wilson Date: Mon, 3 Jul 2023 23:46:18 -0700 Subject: [PATCH] DS3: Dark Souls 3 Major Update/Refactor (#1864) * fix estus shard/bone shard numbers there are only 11 estus shards in the pool, so fixed number of estus shards so everything can be collected, and upped the number of bone shards in the pool to fix datapackage numbers. new counts went from: 15(estus) + 5(bones) = 20(total) TO 11(estus) + 9(bones) = 20(total) * Update locations_data.py changed estus shard/bone shard counts to match the counts in items_data.py. same reasoning as the commit for that, only 11 estus in game * added new options "Late DLC" revampled "Late Basin of Vows" option added the Fire Demon location in Undead Sanctuary * first file dump added new settings for customizing pool options sorted all the item pools code clean up fixed estus/bone shard counts still need to figure out location excluding * bunch of changes added new locations put locations into specific lists made DarkSouls3Locations for each list of items still need to figure out how to exclude * excluded locations from generating without options, created gotthard_region, update how the pool fills additional items, update location/item tables, create more tables * code cleanup, remove extra tables, add grave key/eyes of a firekeeper back to key pool * fixed some logging * add more detailed options descriptions * forgot to update progressive locations updates too whoops * remove irina's tower key from items/location list. the current ID's dont work to shuffle * fixed item-to-locations, added new weapons, added new armors, added new rings, added "eyes of a fire keeper" to key locations list to balance, adjusted tables * added HWL: broken straight sword location, moved Greirat's ashes to NPC items * remove hwl: broken short sword location/item from pool (does not exist), fix item/location counts in options, general code clean up * more code cleanup, fix Havels Ring +3 location/properly renamed item, changed Estus/Bone Shard names to not include a +| added a missing undead bone shard * fixed npc rule, added a bunch of ring locations, fixed ring tables * updated options * cleaned up more code, edited some option names * start of new items system * DS3: Major refactor (allows for defining more items than those in vanilla locations) * DS3: Repair changes overwritten by refactor * DS3: Re-implement new options for location categories * DS3: Make replacement item lists for most unique item types * DS3: Remove accidentally added apworld * DS3: Make option names more consistent * DS3: Fix Pyromancer's Parting Flame location category * DS3: Add new items * DS3: Fix access rule for DLC/Contraption Key * DS3: Only replace unrandomized progression items with events Also fix some location names/categories * DS3: Change some location names to be in line with their items * DS3: Add randomized infusion code (only works for Broadsword) * DS3: Make varied item pool an option * added remaining weapons, shields, armors, rings, spells, dlc equivalents | added remaining dlc ring locations (2 in dreg heap, 5 in ringed city) * adjusted 'Progressive Locations' counts and added new table * added more souls + upgrade gems * added the rest of consumables * reverted adding an additional 'progressive location 4' table and added bulk progression locations to prog. location 3 table * DS3: Add infusion categories and some cleanup of items * DS3: Fix item ordering * DS3: Fix infusion/upgrade code extra if * DS3: Disable some unmarked cut content items * DS3: Rename blessed red and white shield+1 * DS3: Implement guaranteed_items option * DS3: Remove print statement * DS3: Add extra check for trying to remove items from an empty list * add unused content item id's * DS3: Move cut content to its own list * DS3: Classify spells and healing upgrades as useful * DS3: Implement get_filler_item_name * DS3: Change lower bounds for upgrades from +1 to +0 * DS3: Move Ancient Dragon Greatshield back to vanilla and recategorize some useful consumables * DS3: Guaranteed items checks for number of existing items before replacing * added remaining progressive items, fixed npc rules, adjusted option location counts * delete extra items, add rule for dancer/late basin * seperate PW into two parts (can access first half w/o contraption key | SKIP more unused items * DS3: Minor linting changes * DS3: Update required_client_version * DS3: Remove rule for bell tower access The key can always be purchased from the shop * DS3: Move location category option checks to generate_early * added "Boss Soul" option to pool * DS3: Fix rules for boss souls and update misc location count * DS3: Address minor review comments * DS3: Change category enums to IntEnum * DS3: Make apworld --------- Co-authored-by: Brooty Johnson <83629348+Br00ty@users.noreply.github.com> --- setup.py | 1 - worlds/dark_souls_3/Items.py | 1282 +++++++++++++++++++- worlds/dark_souls_3/Locations.py | 684 ++++++++++- worlds/dark_souls_3/Options.py | 170 ++- worlds/dark_souls_3/__init__.py | 611 ++++++---- worlds/dark_souls_3/data/items_data.py | 600 --------- worlds/dark_souls_3/data/locations_data.py | 614 ---------- 7 files changed, 2460 insertions(+), 1502 deletions(-) delete mode 100644 worlds/dark_souls_3/data/items_data.py delete mode 100644 worlds/dark_souls_3/data/locations_data.py diff --git a/setup.py b/setup.py index 75d223ea..a82f4cac 100644 --- a/setup.py +++ b/setup.py @@ -69,7 +69,6 @@ non_apworlds: set = { "ChecksFinder", "Clique", "DLCQuest", - "Dark Souls III", "Final Fantasy", "Hollow Knight", "Hylics 2", diff --git a/worlds/dark_souls_3/Items.py b/worlds/dark_souls_3/Items.py index 140d3ba6..754282e7 100644 --- a/worlds/dark_souls_3/Items.py +++ b/worlds/dark_souls_3/Items.py @@ -1,36 +1,1276 @@ -import sys +from enum import IntEnum +from typing import NamedTuple from BaseClasses import Item -from worlds.dark_souls_3.data.items_data import item_tables, dlc_shields_table, dlc_weapons_upgrade_10_table, \ - dlc_weapons_upgrade_5_table, dlc_goods_table, dlc_spells_table, dlc_armor_table, dlc_ring_table, dlc_misc_table, dlc_goods_2_table + + +class DS3ItemCategory(IntEnum): + WEAPON_UPGRADE_5 = 0 + WEAPON_UPGRADE_10 = 1 + WEAPON_UPGRADE_10_INFUSIBLE = 2 + SHIELD = 3 + SHIELD_INFUSIBLE = 4 + ARMOR = 5 + RING = 6 + SPELL = 7 + MISC = 8 + KEY = 9 + BOSS = 10 + SKIP = 11 + + +class DS3ItemData(NamedTuple): + name: str + ds3_code: int + is_dlc: bool + category: DS3ItemCategory class DarkSouls3Item(Item): game: str = "Dark Souls III" - dlc_set = {**dlc_shields_table, **dlc_weapons_upgrade_10_table, **dlc_weapons_upgrade_5_table, - **dlc_goods_table, **dlc_spells_table, **dlc_armor_table, **dlc_ring_table, **dlc_misc_table} - - dlc_progressive = {**dlc_goods_2_table} - @staticmethod def get_name_to_id() -> dict: base_id = 100000 - table_offset = 100 + return {item_data.name: id for id, item_data in enumerate(_all_items, base_id)} - output = {} - for i, table in enumerate(item_tables): - if len(table) > table_offset: - raise Exception("An item table has {} entries, that is more than {} entries (table #{})".format(len(table), table_offset, i)) - output.update({name: id for id, name in enumerate(table, base_id + (table_offset * i))}) - return output +key_item_names = { + "Small Lothric Banner", + "Basin of Vows", + "Small Doll", + "Storm Ruler", + "Grand Archives Key", + "Cinders of a Lord - Abyss Watcher", + "Cinders of a Lord - Yhorm the Giant", + "Cinders of a Lord - Aldrich", + "Cinders of a Lord - Lothric Prince", + "Mortician's Ashes", + "Cell Key", + #"Tower Key", #Not a relevant key item atm + "Jailbreaker's Key", + "Prisoner Chief's Ashes", + "Old Cell Key", + "Jailer's Key Ring", + "Contraption Key", + "Small Envoy Banner" +} - @staticmethod - def is_dlc_item(name) -> bool: - return name in DarkSouls3Item.dlc_set - @staticmethod - def is_dlc_progressive(name) -> bool: - return name in DarkSouls3Item.dlc_progressive +_vanilla_items = [DS3ItemData(row[0], row[1], False, row[2]) for row in [ + # Ammunition + ("Standard Arrow", 0x00061A80, DS3ItemCategory.SKIP), + ("Fire Arrow", 0x00061AE4, DS3ItemCategory.SKIP), + ("Poison Arrow", 0x00061B48, DS3ItemCategory.SKIP), + ("Large Arrow", 0x00061BAC, DS3ItemCategory.SKIP), + ("Feather Arrow", 0x00061C10, DS3ItemCategory.SKIP), + ("Moonlight Arrow", 0x00061C74, DS3ItemCategory.SKIP), + ("Wood Arrow", 0x00061CD8, DS3ItemCategory.SKIP), + ("Dark Arrow", 0x00061D3C, DS3ItemCategory.SKIP), + ("Dragonslayer Greatarrow", 0x00062250, DS3ItemCategory.SKIP), + ("Dragonslayer Lightning Arrow", 0x00062318, DS3ItemCategory.SKIP), + ("Onislayer Greatarrow", 0x0006237C, DS3ItemCategory.SKIP), + ("Standard Bolt", 0x00062A20, DS3ItemCategory.SKIP), + ("Heavy Bolt", 0x00062A84, DS3ItemCategory.SKIP), + ("Sniper Bolt", 0x00062AE8, DS3ItemCategory.SKIP), + ("Wood Bolt", 0x00062B4C, DS3ItemCategory.SKIP), + ("Lightning Bolt", 0x00062BB0, DS3ItemCategory.SKIP), + ("Splintering Bolt", 0x00062C14, DS3ItemCategory.SKIP), + ("Exploding Bolt", 0x00062C78, DS3ItemCategory.SKIP), + # Weapons + ("Dagger", 0x000F4240, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Bandit's Knife", 0x000F6950, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Parrying Dagger", 0x000F9060, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Rotten Ghru Dagger", 0x000FDE80, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Harpe", 0x00102CA0, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Scholar's Candlestick", 0x001053B0, DS3ItemCategory.WEAPON_UPGRADE_10), + ("Tailbone Short Sword", 0x00107AC0, DS3ItemCategory.WEAPON_UPGRADE_10), + ("Corvian Greatknife", 0x0010A1D0, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Handmaid's Dagger", 0x00111700, DS3ItemCategory.WEAPON_UPGRADE_10), + ("Shortsword", 0x001E8480, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Longsword", 0x001EAB90, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Broadsword", 0x001ED2A0, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Broken Straight Sword", 0x001EF9B0, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Lothric Knight Sword", 0x001F6EE0, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Sunlight Straight Sword", 0x00203230, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Rotten Ghru Curved Sword", 0x00205940, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Irithyll Straight Sword", 0x0020A760, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Cleric's Candlestick", 0x0020F580, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Morion Blade", 0x002143A0, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Astora's Straight Sword", 0x002191C0, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Barbed Straight Sword", 0x0021B8D0, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Executioner's Greatsword", 0x0021DFE0, DS3ItemCategory.WEAPON_UPGRADE_10), + ("Anri's Straight Sword", 0x002206F0, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Estoc", 0x002DC6C0, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Mail Breaker", 0x002DEDD0, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Rapier", 0x002E14E0, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Ricard's Rapier", 0x002E3BF0, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Crystal Sage's Rapier", 0x002E6300, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Irithyll Rapier", 0x002E8A10, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Shotel", 0x003D3010, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Scimitar", 0x003D7E30, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Falchion", 0x003DA540, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Carthus Curved Sword", 0x003DCC50, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Carthus Curved Greatsword", 0x003DF360, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Pontiff Knight Curved Sword", 0x003E1A70, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Storm Curved Sword", 0x003E4180, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Painting Guardian's Curved Sword", 0x003E6890, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Crescent Moon Sword", 0x003E8FA0, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Carthus Shotel", 0x003EB6B0, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Uchigatana", 0x004C4B40, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Washing Pole", 0x004C7250, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Chaos Blade", 0x004C9960, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Black Blade", 0x004CC070, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Bloodlust", 0x004CE780, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Darkdrift", 0x004D0E90, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Bastard Sword", 0x005B8D80, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Claymore", 0x005BDBA0, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Zweihander", 0x005C29C0, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Greatsword", 0x005C50D0, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Astora Greatsword", 0x005C9EF0, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Murakumo", 0x005CC600, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Lothric Knight Greatsword", 0x005D1420, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Flamberge", 0x005DB060, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Exile Greatsword", 0x005DD770, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Greatsword of Judgment", 0x005E2590, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Profaned Greatsword", 0x005E4CA0, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Cathedral Knight Greatsword", 0x005E73B0, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Farron Greatsword", 0x005E9AC0, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Yhorm's Great Machete", 0x005F0FF0, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Dark Sword", 0x005F3700, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Black Knight Sword", 0x005F5E10, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Lorian's Greatsword", 0x005F8520, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Twin Princes' Greatsword", 0x005FAC30, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Lothric's Holy Sword", 0x005FD340, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Wolnir's Holy Sword", 0x005FFA50, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Wolf Knight's Greatsword", 0x00602160, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Greatsword of Artorias", 0x0060216A, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Hollowslayer Greatsword", 0x00604870, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Moonlight Greatsword", 0x00606F80, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Drakeblood Greatsword", 0x00609690, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Firelink Greatsword", 0x0060BDA0, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Fume Ultra Greatsword", 0x0060E4B0, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Old Wolf Curved Sword", 0x00610BC0, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Storm Ruler", 0x006132D0, DS3ItemCategory.KEY), + ("Hand Axe", 0x006ACFC0, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Battle Axe", 0x006AF6D0, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Deep Battle Axe", 0x006AFA54, DS3ItemCategory.WEAPON_UPGRADE_10), + ("Brigand Axe", 0x006B1DE0, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Crescent Axe", 0x006B6C00, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Great Axe", 0x006B9310, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Butcher Knife", 0x006BE130, DS3ItemCategory.WEAPON_UPGRADE_10), + ("Dragonslayer's Axe", 0x006C0840, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Thrall Axe", 0x006C5660, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Dragonslayer Greataxe", 0x006C7D70, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Demon's Greataxe", 0x006CA480, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Eleonora", 0x006CCB90, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Man Serpent Hatchet", 0x006D19B0, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Club", 0x007A1200, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Mace", 0x007A3910, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Morning Star", 0x007A6020, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Reinforced Club", 0x007A8730, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Large Club", 0x007AFC60, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Great Club", 0x007B4A80, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Great Mace", 0x007BBFB0, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Great Wooden Hammer", 0x007C8300, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Gargoyle Flame Hammer", 0x007CAA10, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Vordt's Great Hammer", 0x007CD120, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Old King's Great Hammer", 0x007CF830, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Heysel Pick", 0x007D6D60, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Warpick", 0x007DBB80, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Pickaxe", 0x007DE290, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Dragon Tooth", 0x007E09A0, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Smough's Great Hammer", 0x007E30B0, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Blacksmith Hammer", 0x007E57C0, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Morne's Great Hammer", 0x007E7ED0, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Spiked Mace", 0x007EA5E0, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Spear", 0x00895440, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Winged Spear", 0x00897B50, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Partizan", 0x0089C970, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Greatlance", 0x008A8CC0, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Lothric Knight Long Spear", 0x008AB3D0, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Gargoyle Flame Spear", 0x008B01F0, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Rotten Ghru Spear", 0x008B2900, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Tailbone Spear", 0x008B5010, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Soldering Iron", 0x008B7720, DS3ItemCategory.WEAPON_UPGRADE_10), + ("Arstor's Spear", 0x008BEC50, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Saint Bident", 0x008C1360, DS3ItemCategory.WEAPON_UPGRADE_10), + ("Yorshka's Spear", 0x008C3A70, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Pike", 0x008C6180, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Heavy Four-pronged Plow", 0x008ADAE0, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Dragonslayer Spear", 0x008CAFA0, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Great Scythe", 0x00989680, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Lucerne", 0x0098BD90, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Glaive", 0x0098E4A0, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Halberd", 0x00990BB0, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Black Knight Greataxe", 0x009959D0, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Pontiff Knight Great Scythe", 0x0099A7F0, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Great Corvian Scythe", 0x0099CF00, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Winged Knight Halberd", 0x0099F610, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Gundyr's Halberd", 0x009A1D20, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Red Hilted Halberd", 0x009AB960, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Black Knight Glaive", 0x009AE070, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Immolation Tinder", 0x009B0780, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Claw", 0x00A7D8C0, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Caestus", 0x00A7FFD0, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Manikin Claws", 0x00A826E0, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Demon's Fist", 0x00A84DF0, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Dark Hand", 0x00A87500, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Whip", 0x00B71B00, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Witch's Locks", 0x00B7B740, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Notched Whip", 0x00B7DE50, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Spotted Whip", 0x00B80560, DS3ItemCategory.WEAPON_UPGRADE_10), + ("Talisman", 0x00C72090, DS3ItemCategory.WEAPON_UPGRADE_10), + ("Sorcerer's Staff", 0x00C747A0, DS3ItemCategory.WEAPON_UPGRADE_10), + ("Storyteller's Staff", 0x00C76EB0, DS3ItemCategory.WEAPON_UPGRADE_10), + ("Mendicant's Staff", 0x00C795C0, DS3ItemCategory.WEAPON_UPGRADE_10), + ("Man-grub's Staff", 0x00C7E3E0, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Archdeacon's Great Staff", 0x00C80AF0, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Golden Ritual Spear", 0x00C83200, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Yorshka's Chime", 0x00C88020, DS3ItemCategory.WEAPON_UPGRADE_10), + ("Sage's Crystal Staff", 0x00C8CE40, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Heretic's Staff", 0x00C8F550, DS3ItemCategory.WEAPON_UPGRADE_10), + ("Court Sorcerer's Staff", 0x00C91C60, DS3ItemCategory.WEAPON_UPGRADE_10), + ("Witchtree Branch", 0x00C94370, DS3ItemCategory.WEAPON_UPGRADE_10), + ("Izalith Staff", 0x00C96A80, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Cleric's Sacred Chime", 0x00C99190, DS3ItemCategory.WEAPON_UPGRADE_10), + ("Priest's Chime", 0x00C9B8A0, DS3ItemCategory.WEAPON_UPGRADE_10), + ("Saint-tree Bellvine", 0x00C9DFB0, DS3ItemCategory.WEAPON_UPGRADE_10), + ("Caitha's Chime", 0x00CA06C0, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Crystal Chime", 0x00CA2DD0, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Sunlight Talisman", 0x00CA54E0, DS3ItemCategory.WEAPON_UPGRADE_10), + ("Canvas Talisman", 0x00CA7BF0, DS3ItemCategory.WEAPON_UPGRADE_10), + ("Sunless Talisman", 0x00CAA300, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Saint's Talisman", 0x00CACA10, DS3ItemCategory.WEAPON_UPGRADE_10), + ("White Hair Talisman", 0x00CAF120, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Pyromancy Flame", 0x00CC77C0, DS3ItemCategory.WEAPON_UPGRADE_10), + ("Dragonslayer Greatbow", 0x00CF8500, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Short Bow", 0x00D5C690, DS3ItemCategory.WEAPON_UPGRADE_10), + ("Composite Bow", 0x00D5EDA0, DS3ItemCategory.WEAPON_UPGRADE_10), + ("Light Crossbow", 0x00D63BC0, DS3ItemCategory.WEAPON_UPGRADE_10), + ("Arbalest", 0x00D662D0, DS3ItemCategory.WEAPON_UPGRADE_10), + ("Longbow", 0x00D689E0, DS3ItemCategory.WEAPON_UPGRADE_10), + ("Dragonrider Bow", 0x00D6B0F0, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Avelyn", 0x00D6FF10, DS3ItemCategory.WEAPON_UPGRADE_10), + ("Knight's Crossbow", 0x00D72620, DS3ItemCategory.WEAPON_UPGRADE_10), + ("Heavy Crossbow", 0x00D74D30, DS3ItemCategory.WEAPON_UPGRADE_10), + ("Darkmoon Longbow", 0x00D79B50, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Onislayer Greatbow", 0x00D7C260, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Black Bow of Pharis", 0x00D7E970, DS3ItemCategory.WEAPON_UPGRADE_10), + ("Sniper Crossbow", 0x00D83790, DS3ItemCategory.WEAPON_UPGRADE_10), + ("Sellsword Twinblades", 0x00F42400, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Warden Twinblades", 0x00F47220, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Winged Knight Twinaxes", 0x00F49930, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Dancer's Enchanted Swords", 0x00F4C040, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Great Machete", 0x00F4E750, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Brigand Twindaggers", 0x00F50E60, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Gotthard Twinswords", 0x00F53570, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Onikiri and Ubadachi", 0x00F58390, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Drang Twinspears", 0x00F5AAA0, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Drang Hammers", 0x00F61FD0, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + + # Shields + ("Buckler", 0x01312D00, DS3ItemCategory.SHIELD_INFUSIBLE), + ("Small Leather Shield", 0x01315410, DS3ItemCategory.SHIELD_INFUSIBLE), + ("Round Shield", 0x0131A230, DS3ItemCategory.SHIELD_INFUSIBLE), + ("Large Leather Shield", 0x0131C940, DS3ItemCategory.SHIELD_INFUSIBLE), + ("Hawkwood's Shield", 0x01323E70, DS3ItemCategory.SHIELD_INFUSIBLE), + ("Iron Round Shield", 0x01326580, DS3ItemCategory.SHIELD_INFUSIBLE), + ("Wooden Shield", 0x0132DAB0, DS3ItemCategory.SHIELD_INFUSIBLE), + ("Kite Shield", 0x013301C0, DS3ItemCategory.SHIELD_INFUSIBLE), + ("Ghru Rotshield", 0x013328D0, DS3ItemCategory.SHIELD_INFUSIBLE), + ("Havel's Greatshield", 0x013376F0, DS3ItemCategory.SHIELD), + ("Target Shield", 0x01339E00, DS3ItemCategory.SHIELD_INFUSIBLE), + ("Elkhorn Round Shield", 0x0133C510, DS3ItemCategory.SHIELD_INFUSIBLE), + ("Warrior's Round Shield", 0x0133EC20, DS3ItemCategory.SHIELD_INFUSIBLE), + ("Caduceus Round Shield", 0x01341330, DS3ItemCategory.SHIELD_INFUSIBLE), + ("Red and White Shield", 0x01343A40, DS3ItemCategory.SHIELD_INFUSIBLE), + ("Blessed Red and White Shield+1", 0x01343FB9, DS3ItemCategory.SHIELD), + ("Plank Shield", 0x01346150, DS3ItemCategory.SHIELD_INFUSIBLE), + ("Leather Shield", 0x01348860, DS3ItemCategory.SHIELD_INFUSIBLE), + ("Crimson Parma", 0x0134AF70, DS3ItemCategory.SHIELD_INFUSIBLE), + ("Eastern Iron Shield", 0x0134D680, DS3ItemCategory.SHIELD_INFUSIBLE), + ("Llewellyn Shield", 0x0134FD90, DS3ItemCategory.SHIELD_INFUSIBLE), + ("Golden Falcon Shield", 0x01354BB0, DS3ItemCategory.SHIELD_INFUSIBLE), + ("Sacred Bloom Shield", 0x013572C0, DS3ItemCategory.SHIELD), + ("Ancient Dragon Greatshield", 0x013599D0, DS3ItemCategory.SHIELD), + ("Lothric Knight Shield", 0x01409650, DS3ItemCategory.SHIELD_INFUSIBLE), + ("Knight Shield", 0x01410B80, DS3ItemCategory.SHIELD_INFUSIBLE), + ("Pontiff Knight Shield", 0x014159A0, DS3ItemCategory.SHIELD), + ("Carthus Shield", 0x014180B0, DS3ItemCategory.SHIELD_INFUSIBLE), + ("Black Knight Shield", 0x0141F5E0, DS3ItemCategory.SHIELD), + ("Silver Knight Shield", 0x01424400, DS3ItemCategory.SHIELD), + ("Spiked Shield", 0x01426B10, DS3ItemCategory.SHIELD_INFUSIBLE), + ("Pierce Shield", 0x01429220, DS3ItemCategory.SHIELD_INFUSIBLE), + ("East-West Shield", 0x0142B930, DS3ItemCategory.SHIELD_INFUSIBLE), + ("Sunlight Shield", 0x0142E040, DS3ItemCategory.SHIELD_INFUSIBLE), + ("Crest Shield", 0x01430750, DS3ItemCategory.SHIELD), + ("Dragon Crest Shield", 0x01432E60, DS3ItemCategory.SHIELD), + ("Spider Shield", 0x01435570, DS3ItemCategory.SHIELD_INFUSIBLE), + ("Grass Crest Shield", 0x01437C80, DS3ItemCategory.SHIELD), + ("Sunset Shield", 0x0143A390, DS3ItemCategory.SHIELD_INFUSIBLE), + ("Golden Wing Crest Shield", 0x0143CAA0, DS3ItemCategory.SHIELD), + ("Blue Wooden Shield", 0x0143F1B0, DS3ItemCategory.SHIELD_INFUSIBLE), + ("Silver Eagle Kite Shield", 0x014418C0, DS3ItemCategory.SHIELD_INFUSIBLE), + ("Stone Parma", 0x01443FD0, DS3ItemCategory.SHIELD_INFUSIBLE), + ("Spirit Tree Crest Shield", 0x014466E0, DS3ItemCategory.SHIELD), + ("Porcine Shield", 0x01448DF0, DS3ItemCategory.SHIELD_INFUSIBLE), + ("Shield of Want", 0x0144B500, DS3ItemCategory.SHIELD), + ("Wargod Wooden Shield", 0x0144DC10, DS3ItemCategory.SHIELD_INFUSIBLE), + ("Lothric Knight Greatshield", 0x014FD890, DS3ItemCategory.SHIELD_INFUSIBLE), + ("Cathedral Knight Greatshield", 0x014FFFA0, DS3ItemCategory.SHIELD_INFUSIBLE), + ("Dragonslayer Greatshield", 0x01504DC0, DS3ItemCategory.SHIELD), + ("Moaning Shield", 0x015074D0, DS3ItemCategory.SHIELD), + ("Yhorm's Greatshield", 0x0150C2F0, DS3ItemCategory.SHIELD), + ("Black Iron Greatshield", 0x0150EA00, DS3ItemCategory.SHIELD_INFUSIBLE), + ("Wolf Knight's Greatshield", 0x01511110, DS3ItemCategory.SHIELD), + ("Twin Dragon Greatshield", 0x01513820, DS3ItemCategory.SHIELD_INFUSIBLE), + ("Greatshield of Glory", 0x01515F30, DS3ItemCategory.SHIELD), + ("Curse Ward Greatshield", 0x01518640, DS3ItemCategory.SHIELD), + ("Bonewheel Shield", 0x0151AD50, DS3ItemCategory.SHIELD_INFUSIBLE), + ("Stone Greatshield", 0x0151D460, DS3ItemCategory.SHIELD_INFUSIBLE), + + # Armor + ("Fallen Knight Helm", 0x1121EAC0, DS3ItemCategory.ARMOR), + ("Fallen Knight Armor", 0x1121EEA8, DS3ItemCategory.ARMOR), + ("Fallen Knight Gauntlets", 0x1121F290, DS3ItemCategory.ARMOR), + ("Fallen Knight Trousers", 0x1121F678, DS3ItemCategory.ARMOR), + ("Knight Helm", 0x11298BE0, DS3ItemCategory.ARMOR), + ("Knight Armor", 0x11298FC8, DS3ItemCategory.ARMOR), + ("Knight Gauntlets", 0x112993B0, DS3ItemCategory.ARMOR), + ("Knight Leggings", 0x11299798, DS3ItemCategory.ARMOR), + ("Firelink Helm", 0x11406F40, DS3ItemCategory.ARMOR), + ("Firelink Armor", 0x11407328, DS3ItemCategory.ARMOR), + ("Firelink Gauntlets", 0x11407710, DS3ItemCategory.ARMOR), + ("Firelink Leggings", 0x11407AF8, DS3ItemCategory.ARMOR), + ("Sellsword Helm", 0x11481060, DS3ItemCategory.ARMOR), + ("Sellsword Armor", 0x11481448, DS3ItemCategory.ARMOR), + ("Sellsword Gauntlet", 0x11481830, DS3ItemCategory.ARMOR), + ("Sellsword Trousers", 0x11481C18, DS3ItemCategory.ARMOR), + ("Herald Helm", 0x114FB180, DS3ItemCategory.ARMOR), + ("Herald Armor", 0x114FB568, DS3ItemCategory.ARMOR), + ("Herald Gloves", 0x114FB950, DS3ItemCategory.ARMOR), + ("Herald Trousers", 0x114FBD38, DS3ItemCategory.ARMOR), + ("Sunless Veil", 0x115752A0, DS3ItemCategory.ARMOR), + ("Sunless Armor", 0x11575688, DS3ItemCategory.ARMOR), + ("Sunless Gauntlets", 0x11575A70, DS3ItemCategory.ARMOR), + ("Sunless Leggings", 0x11575E58, DS3ItemCategory.ARMOR), + ("Black Hand Hat", 0x115EF3C0, DS3ItemCategory.ARMOR), + ("Black Hand Armor", 0x115EF7A8, DS3ItemCategory.ARMOR), + ("Assassin Gloves", 0x115EFB90, DS3ItemCategory.ARMOR), + ("Assassin Trousers", 0x115EFF78, DS3ItemCategory.ARMOR), + ("Assassin Hood", 0x11607A60, DS3ItemCategory.ARMOR), + ("Assassin Armor", 0x11607E48, DS3ItemCategory.ARMOR), + ("Xanthous Crown", 0x116694E0, DS3ItemCategory.ARMOR), + ("Xanthous Overcoat", 0x116698C8, DS3ItemCategory.ARMOR), + ("Xanthous Gloves", 0x11669CB0, DS3ItemCategory.ARMOR), + ("Xanthous Trousers", 0x1166A098, DS3ItemCategory.ARMOR), + ("Northern Helm", 0x116E3600, DS3ItemCategory.ARMOR), + ("Northern Armor", 0x116E39E8, DS3ItemCategory.ARMOR), + ("Northern Gloves", 0x116E3DD0, DS3ItemCategory.ARMOR), + ("Northern Trousers", 0x116E41B8, DS3ItemCategory.ARMOR), + ("Morne's Helm", 0x1175D720, DS3ItemCategory.ARMOR), + ("Morne's Armor", 0x1175DB08, DS3ItemCategory.ARMOR), + ("Morne's Gauntlets", 0x1175DEF0, DS3ItemCategory.ARMOR), + ("Morne's Leggings", 0x1175E2D8, DS3ItemCategory.ARMOR), + ("Silver Mask", 0x117D7840, DS3ItemCategory.ARMOR), + ("Leonhard's Garb", 0x117D7C28, DS3ItemCategory.ARMOR), + ("Leonhard's Gauntlets", 0x117D8010, DS3ItemCategory.ARMOR), + ("Leonhard's Trousers", 0x117D83F8, DS3ItemCategory.ARMOR), + ("Sneering Mask", 0x11851960, DS3ItemCategory.ARMOR), + ("Pale Shade Robe", 0x11851D48, DS3ItemCategory.ARMOR), + ("Pale Shade Gloves", 0x11852130, DS3ItemCategory.ARMOR), + ("Pale Shade Trousers", 0x11852518, DS3ItemCategory.ARMOR), + ("Sunset Helm", 0x118CBA80, DS3ItemCategory.ARMOR), + ("Sunset Armor", 0x118CBE68, DS3ItemCategory.ARMOR), + ("Sunset Gauntlets", 0x118CC250, DS3ItemCategory.ARMOR), + ("Sunset Leggings", 0x118CC638, DS3ItemCategory.ARMOR), + ("Old Sage's Blindfold", 0x11945BA0, DS3ItemCategory.ARMOR), + ("Cornyx's Garb", 0x11945F88, DS3ItemCategory.ARMOR), + ("Cornyx's Wrap", 0x11946370, DS3ItemCategory.ARMOR), + ("Cornyx's Skirt", 0x11946758, DS3ItemCategory.ARMOR), + ("Executioner Helm", 0x119BFCC0, DS3ItemCategory.ARMOR), + ("Executioner Armor", 0x119C00A8, DS3ItemCategory.ARMOR), + ("Executioner Gauntlets", 0x119C0490, DS3ItemCategory.ARMOR), + ("Executioner Leggings", 0x119C0878, DS3ItemCategory.ARMOR), + ("Billed Mask", 0x11A39DE0, DS3ItemCategory.ARMOR), + ("Black Dress", 0x11A3A1C8, DS3ItemCategory.ARMOR), + ("Black Gauntlets", 0x11A3A5B0, DS3ItemCategory.ARMOR), + ("Black Leggings", 0x11A3A998, DS3ItemCategory.ARMOR), + ("Pyromancer Crown", 0x11AB3F00, DS3ItemCategory.ARMOR), + ("Pyromancer Garb", 0x11AB42E8, DS3ItemCategory.ARMOR), + ("Pyromancer Wrap", 0x11AB46D0, DS3ItemCategory.ARMOR), + ("Pyromancer Trousers", 0x11AB4AB8, DS3ItemCategory.ARMOR), + ("Court Sorcerer Hood", 0x11BA8140, DS3ItemCategory.ARMOR), + ("Court Sorcerer Robe", 0x11BA8528, DS3ItemCategory.ARMOR), + ("Court Sorcerer Gloves", 0x11BA8910, DS3ItemCategory.ARMOR), + ("Court Sorcerer Trousers", 0x11BA8CF8, DS3ItemCategory.ARMOR), + ("Sorcerer Hood", 0x11C9C380, DS3ItemCategory.ARMOR), + ("Sorcerer Robe", 0x11C9C768, DS3ItemCategory.ARMOR), + ("Sorcerer Gloves", 0x11C9CB50, DS3ItemCategory.ARMOR), + ("Sorcerer Trousers", 0x11C9CF38, DS3ItemCategory.ARMOR), + ("Clandestine Coat", 0x11CB4E08, DS3ItemCategory.ARMOR), + ("Cleric Hat", 0x11D905C0, DS3ItemCategory.ARMOR), + ("Cleric Blue Robe", 0x11D909A8, DS3ItemCategory.ARMOR), + ("Cleric Gloves", 0x11D90D90, DS3ItemCategory.ARMOR), + ("Cleric Trousers", 0x11D91178, DS3ItemCategory.ARMOR), + ("Steel Soldier Helm", 0x12625A00, DS3ItemCategory.ARMOR), + ("Deserter Armor", 0x12625DE8, DS3ItemCategory.ARMOR), + ("Deserter Trousers", 0x126265B8, DS3ItemCategory.ARMOR), + ("Thief Mask", 0x12656740, DS3ItemCategory.ARMOR), + ("Sage's Big Hat", 0x129020C0, DS3ItemCategory.ARMOR), + ("Aristocrat's Mask", 0x129F6300, DS3ItemCategory.ARMOR), + ("Jailer Robe", 0x129F66E8, DS3ItemCategory.ARMOR), + ("Jailer Gloves", 0x129F6AD0, DS3ItemCategory.ARMOR), + ("Jailer Trousers", 0x129F6EB8, DS3ItemCategory.ARMOR), + ("Grave Warden Hood", 0x12BDE780, DS3ItemCategory.ARMOR), + ("Grave Warden Robe", 0x12BDEB68, DS3ItemCategory.ARMOR), + ("Grave Warden Wrap", 0x12BDEF50, DS3ItemCategory.ARMOR), + ("Grave Warden Skirt", 0x12BDF338, DS3ItemCategory.ARMOR), + ("Worker Hat", 0x12CD29C0, DS3ItemCategory.ARMOR), + ("Worker Garb", 0x12CD2DA8, DS3ItemCategory.ARMOR), + ("Worker Gloves", 0x12CD3190, DS3ItemCategory.ARMOR), + ("Worker Trousers", 0x12CD3578, DS3ItemCategory.ARMOR), + ("Thrall Hood", 0x12D4CAE0, DS3ItemCategory.ARMOR), + ("Evangelist Hat", 0x12DC6C00, DS3ItemCategory.ARMOR), + ("Evangelist Robe", 0x12DC6FE8, DS3ItemCategory.ARMOR), + ("Evangelist Gloves", 0x12DC73D0, DS3ItemCategory.ARMOR), + ("Evangelist Trousers", 0x12DC77B8, DS3ItemCategory.ARMOR), + ("Scholar's Robe", 0x12E41108, DS3ItemCategory.ARMOR), + ("Winged Knight Helm", 0x12EBAE40, DS3ItemCategory.ARMOR), + ("Winged Knight Armor", 0x12EBB228, DS3ItemCategory.ARMOR), + ("Winged Knight Gauntlets", 0x12EBB610, DS3ItemCategory.ARMOR), + ("Winged Knight Leggings", 0x12EBB9F8, DS3ItemCategory.ARMOR), + ("Cathedral Knight Helm", 0x130291A0, DS3ItemCategory.ARMOR), + ("Cathedral Knight Armor", 0x13029588, DS3ItemCategory.ARMOR), + ("Cathedral Knight Gauntlets", 0x13029970, DS3ItemCategory.ARMOR), + ("Cathedral Knight Leggings", 0x13029D58, DS3ItemCategory.ARMOR), + ("Lothric Knight Helm", 0x13197500, DS3ItemCategory.ARMOR), + ("Lothric Knight Armor", 0x131978E8, DS3ItemCategory.ARMOR), + ("Lothric Knight Gauntlets", 0x13197CD0, DS3ItemCategory.ARMOR), + ("Lothric Knight Leggings", 0x131980B8, DS3ItemCategory.ARMOR), + ("Outrider Knight Helm", 0x1328B740, DS3ItemCategory.ARMOR), + ("Outrider Knight Armor", 0x1328BB28, DS3ItemCategory.ARMOR), + ("Outrider Knight Gauntlets", 0x1328BF10, DS3ItemCategory.ARMOR), + ("Outrider Knight Leggings", 0x1328C2F8, DS3ItemCategory.ARMOR), + ("Black Knight Helm", 0x1337F980, DS3ItemCategory.ARMOR), + ("Black Knight Armor", 0x1337FD68, DS3ItemCategory.ARMOR), + ("Black Knight Gauntlets", 0x13380150, DS3ItemCategory.ARMOR), + ("Black Knight Leggings", 0x13380538, DS3ItemCategory.ARMOR), + ("Dark Mask", 0x133F9AA0, DS3ItemCategory.ARMOR), + ("Dark Armor", 0x133F9E88, DS3ItemCategory.ARMOR), + ("Dark Gauntlets", 0x133FA270, DS3ItemCategory.ARMOR), + ("Dark Leggings", 0x133FA658, DS3ItemCategory.ARMOR), + ("Exile Mask", 0x13473BC0, DS3ItemCategory.ARMOR), + ("Exile Armor", 0x13473FA8, DS3ItemCategory.ARMOR), + ("Exile Gauntlets", 0x13474390, DS3ItemCategory.ARMOR), + ("Exile Leggings", 0x13474778, DS3ItemCategory.ARMOR), + ("Pontiff Knight Crown", 0x13567E00, DS3ItemCategory.ARMOR), + ("Pontiff Knight Armor", 0x135681E8, DS3ItemCategory.ARMOR), + ("Pontiff Knight Gauntlets", 0x135685D0, DS3ItemCategory.ARMOR), + ("Pontiff Knight Leggings", 0x135689B8, DS3ItemCategory.ARMOR), + ("Golden Crown", 0x1365C040, DS3ItemCategory.ARMOR), + ("Dragonscale Armor", 0x1365C428, DS3ItemCategory.ARMOR), + ("Golden Bracelets", 0x1365C810, DS3ItemCategory.ARMOR), + ("Dragonscale Waistcloth", 0x1365CBF8, DS3ItemCategory.ARMOR), + ("Wolnir's Crown", 0x136D6160, DS3ItemCategory.ARMOR), + ("Undead Legion Helm", 0x13750280, DS3ItemCategory.ARMOR), + ("Undead Legion Armor", 0x13750668, DS3ItemCategory.ARMOR), + ("Undead Legion Gauntlets", 0x13750A50, DS3ItemCategory.ARMOR), + ("Undead Legion Leggings", 0x13750E38, DS3ItemCategory.ARMOR), + ("Fire Witch Helm", 0x13938700, DS3ItemCategory.ARMOR), + ("Fire Witch Armor", 0x13938AE8, DS3ItemCategory.ARMOR), + ("Fire Witch Gauntlets", 0x13938ED0, DS3ItemCategory.ARMOR), + ("Fire Witch Leggings", 0x139392B8, DS3ItemCategory.ARMOR), + ("Lorian's Helm", 0x13A2C940, DS3ItemCategory.ARMOR), + ("Lorian's Armor", 0x13A2CD28, DS3ItemCategory.ARMOR), + ("Lorian's Gauntlets", 0x13A2D110, DS3ItemCategory.ARMOR), + ("Lorian's Leggings", 0x13A2D4F8, DS3ItemCategory.ARMOR), + ("Hood of Prayer", 0x13AA6A60, DS3ItemCategory.ARMOR), + ("Robe of Prayer", 0x13AA6E48, DS3ItemCategory.ARMOR), + ("Skirt of Prayer", 0x13AA7618, DS3ItemCategory.ARMOR), + ("Dancer's Crown", 0x13C14DC0, DS3ItemCategory.ARMOR), + ("Dancer's Armor", 0x13C151A8, DS3ItemCategory.ARMOR), + ("Dancer's Gauntlets", 0x13C15590, DS3ItemCategory.ARMOR), + ("Dancer's Leggings", 0x13C15978, DS3ItemCategory.ARMOR), + ("Gundyr's Helm", 0x13D09000, DS3ItemCategory.ARMOR), + ("Gundyr's Armor", 0x13D093E8, DS3ItemCategory.ARMOR), + ("Gundyr's Gauntlets", 0x13D097D0, DS3ItemCategory.ARMOR), + ("Gundyr's Leggings", 0x13D09BB8, DS3ItemCategory.ARMOR), + ("Archdeacon White Crown", 0x13EF1480, DS3ItemCategory.ARMOR), + ("Archdeacon Holy Garb", 0x13EF1868, DS3ItemCategory.ARMOR), + ("Archdeacon Skirt", 0x13EF2038, DS3ItemCategory.ARMOR), + ("Deacon Robe", 0x13F6B988, DS3ItemCategory.ARMOR), + ("Deacon Skirt", 0x13F6C158, DS3ItemCategory.ARMOR), + ("Fire Keeper Robe", 0x140D9CE8, DS3ItemCategory.ARMOR), + ("Fire Keeper Gloves", 0x140DA0D0, DS3ItemCategory.ARMOR), + ("Fire Keeper Skirt", 0x140DA4B8, DS3ItemCategory.ARMOR), + ("Chain Helm", 0x142C1D80, DS3ItemCategory.ARMOR), + ("Chain Armor", 0x142C2168, DS3ItemCategory.ARMOR), + ("Leather Gauntlets", 0x142C2550, DS3ItemCategory.ARMOR), + ("Chain Leggings", 0x142C2938, DS3ItemCategory.ARMOR), + ("Nameless Knight Helm", 0x143B5FC0, DS3ItemCategory.ARMOR), + ("Nameless Knight Armor", 0x143B63A8, DS3ItemCategory.ARMOR), + ("Nameless Knight Gauntlets", 0x143B6790, DS3ItemCategory.ARMOR), + ("Nameless Knight Leggings", 0x143B6B78, DS3ItemCategory.ARMOR), + ("Elite Knight Helm", 0x144AA200, DS3ItemCategory.ARMOR), + ("Elite Knight Armor", 0x144AA5E8, DS3ItemCategory.ARMOR), + ("Elite Knight Gauntlets", 0x144AA9D0, DS3ItemCategory.ARMOR), + ("Elite Knight Leggings", 0x144AADB8, DS3ItemCategory.ARMOR), + ("Faraam Helm", 0x1459E440, DS3ItemCategory.ARMOR), + ("Faraam Armor", 0x1459E828, DS3ItemCategory.ARMOR), + ("Faraam Gauntlets", 0x1459EC10, DS3ItemCategory.ARMOR), + ("Faraam Boots", 0x1459EFF8, DS3ItemCategory.ARMOR), + ("Catarina Helm", 0x14692680, DS3ItemCategory.ARMOR), + ("Catarina Armor", 0x14692A68, DS3ItemCategory.ARMOR), + ("Catarina Gauntlets", 0x14692E50, DS3ItemCategory.ARMOR), + ("Catarina Leggings", 0x14693238, DS3ItemCategory.ARMOR), + ("Standard Helm", 0x1470C7A0, DS3ItemCategory.ARMOR), + ("Hard Leather Armor", 0x1470CB88, DS3ItemCategory.ARMOR), + ("Hard Leather Gauntlets", 0x1470CF70, DS3ItemCategory.ARMOR), + ("Hard Leather Boots", 0x1470D358, DS3ItemCategory.ARMOR), + ("Havel's Helm", 0x147868C0, DS3ItemCategory.ARMOR), + ("Havel's Armor", 0x14786CA8, DS3ItemCategory.ARMOR), + ("Havel's Gauntlets", 0x14787090, DS3ItemCategory.ARMOR), + ("Havel's Leggings", 0x14787478, DS3ItemCategory.ARMOR), + ("Brigand Hood", 0x148009E0, DS3ItemCategory.ARMOR), + ("Brigand Armor", 0x14800DC8, DS3ItemCategory.ARMOR), + ("Brigand Gauntlets", 0x148011B0, DS3ItemCategory.ARMOR), + ("Brigand Trousers", 0x14801598, DS3ItemCategory.ARMOR), + ("Pharis's Hat", 0x1487AB00, DS3ItemCategory.ARMOR), + ("Leather Armor", 0x1487AEE8, DS3ItemCategory.ARMOR), + ("Leather Gloves", 0x1487B2D0, DS3ItemCategory.ARMOR), + ("Leather Boots", 0x1487B6B8, DS3ItemCategory.ARMOR), + ("Ragged Mask", 0x148F4C20, DS3ItemCategory.ARMOR), + ("Master's Attire", 0x148F5008, DS3ItemCategory.ARMOR), + ("Master's Gloves", 0x148F53F0, DS3ItemCategory.ARMOR), + ("Loincloth", 0x148F57D8, DS3ItemCategory.ARMOR), + ("Old Sorcerer Hat", 0x1496ED40, DS3ItemCategory.ARMOR), + ("Old Sorcerer Coat", 0x1496F128, DS3ItemCategory.ARMOR), + ("Old Sorcerer Gauntlets", 0x1496F510, DS3ItemCategory.ARMOR), + ("Old Sorcerer Boots", 0x1496F8F8, DS3ItemCategory.ARMOR), + ("Conjurator Hood", 0x149E8E60, DS3ItemCategory.ARMOR), + ("Conjurator Robe", 0x149E9248, DS3ItemCategory.ARMOR), + ("Conjurator Manchettes", 0x149E9630, DS3ItemCategory.ARMOR), + ("Conjurator Boots", 0x149E9A18, DS3ItemCategory.ARMOR), + ("Black Leather Armor", 0x14A63368, DS3ItemCategory.ARMOR), + ("Black Leather Gloves", 0x14A63750, DS3ItemCategory.ARMOR), + ("Black Leather Boots", 0x14A63B38, DS3ItemCategory.ARMOR), + ("Symbol of Avarice", 0x14ADD0A0, DS3ItemCategory.ARMOR), + ("Creighton's Steel Mask", 0x14B571C0, DS3ItemCategory.ARMOR), + ("Mirrah Chain Mail", 0x14B575A8, DS3ItemCategory.ARMOR), + ("Mirrah Chain Gloves", 0x14B57990, DS3ItemCategory.ARMOR), + ("Mirrah Chain Leggings", 0x14B57D78, DS3ItemCategory.ARMOR), + ("Maiden Hood", 0x14BD12E0, DS3ItemCategory.ARMOR), + ("Maiden Robe", 0x14BD16C8, DS3ItemCategory.ARMOR), + ("Maiden Gloves", 0x14BD1AB0, DS3ItemCategory.ARMOR), + ("Maiden Skirt", 0x14BD1E98, DS3ItemCategory.ARMOR), + ("Alva Helm", 0x14C4B400, DS3ItemCategory.ARMOR), + ("Alva Armor", 0x14C4B7E8, DS3ItemCategory.ARMOR), + ("Alva Gauntlets", 0x14C4BBD0, DS3ItemCategory.ARMOR), + ("Alva Leggings", 0x14C4BFB8, DS3ItemCategory.ARMOR), + ("Shadow Mask", 0x14D3F640, DS3ItemCategory.ARMOR), + ("Shadow Garb", 0x14D3FA28, DS3ItemCategory.ARMOR), + ("Shadow Gauntlets", 0x14D3FE10, DS3ItemCategory.ARMOR), + ("Shadow Leggings", 0x14D401F8, DS3ItemCategory.ARMOR), + ("Eastern Helm", 0x14E33880, DS3ItemCategory.ARMOR), + ("Eastern Armor", 0x14E33C68, DS3ItemCategory.ARMOR), + ("Eastern Gauntlets", 0x14E34050, DS3ItemCategory.ARMOR), + ("Eastern Leggings", 0x14E34438, DS3ItemCategory.ARMOR), + ("Helm of Favor", 0x14F27AC0, DS3ItemCategory.ARMOR), + ("Embraced Armor of Favor", 0x14F27EA8, DS3ItemCategory.ARMOR), + ("Gauntlets of Favor", 0x14F28290, DS3ItemCategory.ARMOR), + ("Leggings of Favor", 0x14F28678, DS3ItemCategory.ARMOR), + ("Brass Helm", 0x1501BD00, DS3ItemCategory.ARMOR), + ("Brass Armor", 0x1501C0E8, DS3ItemCategory.ARMOR), + ("Brass Gauntlets", 0x1501C4D0, DS3ItemCategory.ARMOR), + ("Brass Leggings", 0x1501C8B8, DS3ItemCategory.ARMOR), + ("Silver Knight Helm", 0x1510FF40, DS3ItemCategory.ARMOR), + ("Silver Knight Armor", 0x15110328, DS3ItemCategory.ARMOR), + ("Silver Knight Gauntlets", 0x15110710, DS3ItemCategory.ARMOR), + ("Silver Knight Leggings", 0x15110AF8, DS3ItemCategory.ARMOR), + ("Lucatiel's Mask", 0x15204180, DS3ItemCategory.ARMOR), + ("Mirrah Vest", 0x15204568, DS3ItemCategory.ARMOR), + ("Mirrah Gloves", 0x15204950, DS3ItemCategory.ARMOR), + ("Mirrah Trousers", 0x15204D38, DS3ItemCategory.ARMOR), + ("Iron Helm", 0x152F83C0, DS3ItemCategory.ARMOR), + ("Armor of the Sun", 0x152F87A8, DS3ItemCategory.ARMOR), + ("Iron Bracelets", 0x152F8B90, DS3ItemCategory.ARMOR), + ("Iron Leggings", 0x152F8F78, DS3ItemCategory.ARMOR), + ("Drakeblood Helm", 0x153EC600, DS3ItemCategory.ARMOR), + ("Drakeblood Armor", 0x153EC9E8, DS3ItemCategory.ARMOR), + ("Drakeblood Gauntlets", 0x153ECDD0, DS3ItemCategory.ARMOR), + ("Drakeblood Leggings", 0x153ED1B8, DS3ItemCategory.ARMOR), + ("Drang Armor", 0x154E0C28, DS3ItemCategory.ARMOR), + ("Drang Gauntlets", 0x154E1010, DS3ItemCategory.ARMOR), + ("Drang Shoes", 0x154E13F8, DS3ItemCategory.ARMOR), + ("Black Iron Helm", 0x155D4A80, DS3ItemCategory.ARMOR), + ("Black Iron Armor", 0x155D4E68, DS3ItemCategory.ARMOR), + ("Black Iron Gauntlets", 0x155D5250, DS3ItemCategory.ARMOR), + ("Black Iron Leggings", 0x155D5638, DS3ItemCategory.ARMOR), + ("Painting Guardian Hood", 0x156C8CC0, DS3ItemCategory.ARMOR), + ("Painting Guardian Gown", 0x156C90A8, DS3ItemCategory.ARMOR), + ("Painting Guardian Gloves", 0x156C9490, DS3ItemCategory.ARMOR), + ("Painting Guardian Waistcloth", 0x156C9878, DS3ItemCategory.ARMOR), + ("Wolf Knight Helm", 0x157BCF00, DS3ItemCategory.ARMOR), + ("Wolf Knight Armor", 0x157BD2E8, DS3ItemCategory.ARMOR), + ("Wolf Knight Gauntlets", 0x157BD6D0, DS3ItemCategory.ARMOR), + ("Wolf Knight Leggings", 0x157BDAB8, DS3ItemCategory.ARMOR), + ("Dragonslayer Helm", 0x158B1140, DS3ItemCategory.ARMOR), + ("Dragonslayer Armor", 0x158B1528, DS3ItemCategory.ARMOR), + ("Dragonslayer Gauntlets", 0x158B1910, DS3ItemCategory.ARMOR), + ("Dragonslayer Leggings", 0x158B1CF8, DS3ItemCategory.ARMOR), + ("Smough's Helm", 0x159A5380, DS3ItemCategory.ARMOR), + ("Smough's Armor", 0x159A5768, DS3ItemCategory.ARMOR), + ("Smough's Gauntlets", 0x159A5B50, DS3ItemCategory.ARMOR), + ("Smough's Leggings", 0x159A5F38, DS3ItemCategory.ARMOR), + ("Helm of Thorns", 0x15B8D800, DS3ItemCategory.ARMOR), + ("Armor of Thorns", 0x15B8DBE8, DS3ItemCategory.ARMOR), + ("Gauntlets of Thorns", 0x15B8DFD0, DS3ItemCategory.ARMOR), + ("Leggings of Thorns", 0x15B8E3B8, DS3ItemCategory.ARMOR), + ("Crown of Dusk", 0x15D75C80, DS3ItemCategory.ARMOR), + ("Antiquated Dress", 0x15D76068, DS3ItemCategory.ARMOR), + ("Antiquated Gloves", 0x15D76450, DS3ItemCategory.ARMOR), + ("Antiquated Skirt", 0x15D76838, DS3ItemCategory.ARMOR), + ("Karla's Pointed Hat", 0x15E69EC0, DS3ItemCategory.ARMOR), + ("Karla's Coat", 0x15E6A2A8, DS3ItemCategory.ARMOR), + ("Karla's Gloves", 0x15E6A690, DS3ItemCategory.ARMOR), + ("Karla's Trousers", 0x15E6AA78, DS3ItemCategory.ARMOR), + + # Covenants + ("Blade of the Darkmoon", 0x20002710, DS3ItemCategory.SKIP), + ("Watchdogs of Farron", 0x20002724, DS3ItemCategory.SKIP), + ("Aldrich Faithful", 0x2000272E, DS3ItemCategory.SKIP), + ("Warrior of Sunlight", 0x20002738, DS3ItemCategory.SKIP), + ("Mound-makers", 0x20002742, DS3ItemCategory.SKIP), + ("Way of Blue", 0x2000274C, DS3ItemCategory.SKIP), + ("Blue Sentinels", 0x20002756, DS3ItemCategory.SKIP), + ("Rosaria's Fingers", 0x20002760, DS3ItemCategory.SKIP), + + # Rings + ("Life Ring", 0x20004E20, DS3ItemCategory.RING), + ("Life Ring+1", 0x20004E21, DS3ItemCategory.RING), + ("Life Ring+2", 0x20004E22, DS3ItemCategory.RING), + ("Life Ring+3", 0x20004E23, DS3ItemCategory.RING), + ("Chloranthy Ring", 0x20004E2A, DS3ItemCategory.RING), + ("Chloranthy Ring+1", 0x20004E2B, DS3ItemCategory.RING), + ("Chloranthy Ring+2", 0x20004E2C, DS3ItemCategory.RING), + ("Havel's Ring", 0x20004E34, DS3ItemCategory.RING), + ("Havel's Ring+1", 0x20004E35, DS3ItemCategory.RING), + ("Havel's Ring+2", 0x20004E36, DS3ItemCategory.RING), + ("Ring of Favor", 0x20004E3E, DS3ItemCategory.RING), + ("Ring of Favor+1", 0x20004E3F, DS3ItemCategory.RING), + ("Ring of Favor+2", 0x20004E40, DS3ItemCategory.RING), + ("Ring of Steel Protection", 0x20004E48, DS3ItemCategory.RING), + ("Ring of Steel Protection+1", 0x20004E49, DS3ItemCategory.RING), + ("Ring of Steel Protection+2", 0x20004E4A, DS3ItemCategory.RING), + ("Flame Stoneplate Ring", 0x20004E52, DS3ItemCategory.RING), + ("Flame Stoneplate Ring+1", 0x20004E53, DS3ItemCategory.RING), + ("Flame Stoneplate Ring+2", 0x20004E54, DS3ItemCategory.RING), + ("Thunder Stoneplate Ring", 0x20004E5C, DS3ItemCategory.RING), + ("Thunder Stoneplate Ring+1", 0x20004E5D, DS3ItemCategory.RING), + ("Thunder Stoneplate Ring+2", 0x20004E5E, DS3ItemCategory.RING), + ("Magic Stoneplate Ring", 0x20004E66, DS3ItemCategory.RING), + ("Magic Stoneplate Ring+1", 0x20004E67, DS3ItemCategory.RING), + ("Magic Stoneplate Ring+2", 0x20004E68, DS3ItemCategory.RING), + ("Dark Stoneplate Ring", 0x20004E70, DS3ItemCategory.RING), + ("Dark Stoneplate Ring+1", 0x20004E71, DS3ItemCategory.RING), + ("Dark Stoneplate Ring+2", 0x20004E72, DS3ItemCategory.RING), + ("Speckled Stoneplate Ring", 0x20004E7A, DS3ItemCategory.RING), + ("Speckled Stoneplate Ring+1", 0x20004E7B, DS3ItemCategory.RING), + ("Bloodbite Ring", 0x20004E84, DS3ItemCategory.RING), + ("Bloodbite Ring+1", 0x20004E85, DS3ItemCategory.RING), + ("Poisonbite Ring", 0x20004E8E, DS3ItemCategory.RING), + ("Poisonbite Ring+1", 0x20004E8F, DS3ItemCategory.RING), + ("Cursebite Ring", 0x20004E98, DS3ItemCategory.RING), + ("Fleshbite Ring", 0x20004EA2, DS3ItemCategory.RING), + ("Fleshbite Ring+1", 0x20004EA3, DS3ItemCategory.RING), + ("Wood Grain Ring", 0x20004EAC, DS3ItemCategory.RING), + ("Wood Grain Ring+1", 0x20004EAD, DS3ItemCategory.RING), + ("Wood Grain Ring+2", 0x20004EAE, DS3ItemCategory.RING), + ("Scholar Ring", 0x20004EB6, DS3ItemCategory.RING), + ("Priestess Ring", 0x20004EC0, DS3ItemCategory.RING), + ("Red Tearstone Ring", 0x20004ECA, DS3ItemCategory.RING), + ("Blue Tearstone Ring", 0x20004ED4, DS3ItemCategory.RING), + ("Wolf Ring", 0x20004EDE, DS3ItemCategory.RING), + ("Wolf Ring+1", 0x20004EDF, DS3ItemCategory.RING), + ("Wolf Ring+2", 0x20004EE0, DS3ItemCategory.RING), + ("Leo Ring", 0x20004EE8, DS3ItemCategory.RING), + ("Ring of Sacrifice", 0x20004EF2, DS3ItemCategory.RING), + ("Young Dragon Ring", 0x20004F06, DS3ItemCategory.RING), + ("Bellowing Dragoncrest Ring", 0x20004F07, DS3ItemCategory.RING), + ("Great Swamp Ring", 0x20004F10, DS3ItemCategory.RING), + ("Witch's Ring", 0x20004F11, DS3ItemCategory.RING), + ("Morne's Ring", 0x20004F1A, DS3ItemCategory.RING), + ("Ring of the Sun's First Born", 0x20004F1B, DS3ItemCategory.RING), + ("Lingering Dragoncrest Ring", 0x20004F2E, DS3ItemCategory.RING), + ("Lingering Dragoncrest Ring+1", 0x20004F2F, DS3ItemCategory.RING), + ("Lingering Dragoncrest Ring+2", 0x20004F30, DS3ItemCategory.RING), + ("Sage Ring", 0x20004F38, DS3ItemCategory.RING), + ("Sage Ring+1", 0x20004F39, DS3ItemCategory.RING), + ("Sage Ring+2", 0x20004F3A, DS3ItemCategory.RING), + ("Slumbering Dragoncrest Ring", 0x20004F42, DS3ItemCategory.RING), + ("Dusk Crown Ring", 0x20004F4C, DS3ItemCategory.RING), + ("Saint's Ring", 0x20004F56, DS3ItemCategory.RING), + ("Deep Ring", 0x20004F60, DS3ItemCategory.RING), + ("Darkmoon Ring", 0x20004F6A, DS3ItemCategory.RING), + ("Hawk Ring", 0x20004F92, DS3ItemCategory.RING), + ("Hornet Ring", 0x20004F9C, DS3ItemCategory.RING), + ("Covetous Gold Serpent Ring", 0x20004FA6, DS3ItemCategory.RING), + ("Covetous Gold Serpent Ring+1", 0x20004FA7, DS3ItemCategory.RING), + ("Covetous Gold Serpent Ring+2", 0x20004FA8, DS3ItemCategory.RING), + ("Covetous Silver Serpent Ring", 0x20004FB0, DS3ItemCategory.RING), + ("Covetous Silver Serpent Ring+1", 0x20004FB1, DS3ItemCategory.RING), + ("Covetous Silver Serpent Ring+2", 0x20004FB2, DS3ItemCategory.RING), + ("Sun Princess Ring", 0x20004FBA, DS3ItemCategory.RING), + ("Silvercat Ring", 0x20004FC4, DS3ItemCategory.RING), + ("Skull Ring", 0x20004FCE, DS3ItemCategory.RING), + ("Untrue White Ring", 0x20004FD8, DS3ItemCategory.RING), + ("Carthus Milkring", 0x20004FE2, DS3ItemCategory.RING), + ("Knight's Ring", 0x20004FEC, DS3ItemCategory.RING), + ("Hunter's Ring", 0x20004FF6, DS3ItemCategory.RING), + ("Knight Slayer's Ring", 0x20005000, DS3ItemCategory.RING), + ("Magic Clutch Ring", 0x2000500A, DS3ItemCategory.RING), + ("Lightning Clutch Ring", 0x20005014, DS3ItemCategory.RING), + ("Fire Clutch Ring", 0x2000501E, DS3ItemCategory.RING), + ("Dark Clutch Ring", 0x20005028, DS3ItemCategory.RING), + ("Flynn's Ring", 0x2000503C, DS3ItemCategory.RING), + ("Prisoner's Chain", 0x20005046, DS3ItemCategory.RING), + ("Untrue Dark Ring", 0x20005050, DS3ItemCategory.RING), + ("Obscuring Ring", 0x20005064, DS3ItemCategory.RING), + ("Ring of the Evil Eye", 0x2000506E, DS3ItemCategory.RING), + ("Ring of the Evil Eye+1", 0x2000506F, DS3ItemCategory.RING), + ("Ring of the Evil Eye+2", 0x20005070, DS3ItemCategory.RING), + ("Calamity Ring", 0x20005078, DS3ItemCategory.RING), + ("Farron Ring", 0x20005082, DS3ItemCategory.RING), + ("Aldrich's Ruby", 0x2000508C, DS3ItemCategory.RING), + ("Aldrich's Sapphire", 0x20005096, DS3ItemCategory.RING), + ("Lloyd's Sword Ring", 0x200050B4, DS3ItemCategory.RING), + ("Lloyd's Shield Ring", 0x200050BE, DS3ItemCategory.RING), + ("Estus Ring", 0x200050DC, DS3ItemCategory.RING), + ("Ashen Estus Ring", 0x200050E6, DS3ItemCategory.RING), + ("Carthus Bloodring", 0x200050FA, DS3ItemCategory.RING), + ("Reversal Ring", 0x20005104, DS3ItemCategory.RING), + ("Pontiff's Right Eye", 0x2000510E, DS3ItemCategory.RING), + ("Pontiff's Left Eye", 0x20005136, DS3ItemCategory.RING), + ("Dragonscale Ring", 0x2000515E, DS3ItemCategory.RING), + + # Items + ("Roster of Knights", 0x4000006C, DS3ItemCategory.SKIP), + ("Cracked Red Eye Orb", 0x4000006F, DS3ItemCategory.SKIP), + ("Divine Blessing", 0x400000F0, DS3ItemCategory.MISC), + ("Hidden Blessing", 0x400000F1, DS3ItemCategory.MISC), + ("Silver Pendant", 0x400000F2, DS3ItemCategory.SKIP), + ("Green Blossom", 0x40000104, DS3ItemCategory.MISC), + ("Budding Green Blossom", 0x40000106, DS3ItemCategory.MISC), + ("Bloodred Moss Clump", 0x4000010E, DS3ItemCategory.SKIP), + ("Purple Moss Clump", 0x4000010F, DS3ItemCategory.MISC), + ("Blooming Purple Moss Clump", 0x40000110, DS3ItemCategory.SKIP), + ("Purging Stone", 0x40000112, DS3ItemCategory.SKIP), + ("Rime-blue Moss Clump", 0x40000114, DS3ItemCategory.SKIP), + ("Repair Powder", 0x40000118, DS3ItemCategory.MISC), + ("Kukri", 0x40000122, DS3ItemCategory.SKIP), + ("Firebomb", 0x40000124, DS3ItemCategory.MISC), + ("Dung Pie", 0x40000125, DS3ItemCategory.SKIP), + ("Alluring Skull", 0x40000126, DS3ItemCategory.MISC), + ("Undead Hunter Charm", 0x40000128, DS3ItemCategory.MISC), + ("Black Firebomb", 0x40000129, DS3ItemCategory.MISC), + ("Rope Firebomb", 0x4000012B, DS3ItemCategory.MISC), + ("Lightning Urn", 0x4000012C, DS3ItemCategory.MISC), + ("Rope Black Firebomb", 0x4000012E, DS3ItemCategory.MISC), + ("Stalk Dung Pie", 0x4000012F, DS3ItemCategory.SKIP), + ("Duel Charm", 0x40000130, DS3ItemCategory.MISC), + ("Throwing Knife", 0x40000136, DS3ItemCategory.MISC), + ("Poison Throwing Knife", 0x40000137, DS3ItemCategory.MISC), + ("Charcoal Pine Resin", 0x4000014A, DS3ItemCategory.MISC), + ("Gold Pine Resin", 0x4000014B, DS3ItemCategory.MISC), + ("Human Pine Resin", 0x4000014E, DS3ItemCategory.MISC), + ("Carthus Rouge", 0x4000014F, DS3ItemCategory.MISC), + ("Pale Pine Resin", 0x40000150, DS3ItemCategory.MISC), + ("Charcoal Pine Bundle", 0x40000154, DS3ItemCategory.MISC), + ("Gold Pine Bundle", 0x40000155, DS3ItemCategory.MISC), + ("Rotten Pine Resin", 0x40000157, DS3ItemCategory.MISC), + ("Homeward Bone", 0x4000015E, DS3ItemCategory.MISC), + ("Coiled Sword Fragment", 0x4000015F, DS3ItemCategory.MISC), + ("Wolf's Blood Swordgrass", 0x4000016E, DS3ItemCategory.MISC), + ("Human Dregs", 0x4000016F, DS3ItemCategory.SKIP), + ("Forked Pale Tongue", 0x40000170, DS3ItemCategory.MISC), + ("Proof of a Concord Well Kept", 0x40000171, DS3ItemCategory.SKIP), + ("Prism Stone", 0x40000172, DS3ItemCategory.SKIP), + ("Binoculars", 0x40000173, DS3ItemCategory.MISC), + ("Proof of a Concord Kept", 0x40000174, DS3ItemCategory.SKIP), + ("Pale Tongue", 0x40000175, DS3ItemCategory.MISC), + ("Vertebra Shackle", 0x40000176, DS3ItemCategory.SKIP), + ("Sunlight Medal", 0x40000177, DS3ItemCategory.SKIP), + ("Dragon Head Stone", 0x40000179, DS3ItemCategory.MISC), + ("Dragon Torso Stone", 0x4000017A, DS3ItemCategory.MISC), + ("Rubbish", 0x4000017C, DS3ItemCategory.SKIP), + ("Dried Finger", 0x40000181, DS3ItemCategory.SKIP), + ("Twinkling Dragon Head Stone", 0x40000183, DS3ItemCategory.MISC), + ("Twinkling Dragon Torso Stone", 0x40000184, DS3ItemCategory.MISC), + ("Fire Keeper Soul", 0x40000186, DS3ItemCategory.MISC), + ("Fading Soul", 0x40000190, DS3ItemCategory.MISC), + ("Soul of a Deserted Corpse", 0x40000191, DS3ItemCategory.MISC), + ("Large Soul of a Deserted Corpse", 0x40000192, DS3ItemCategory.MISC), + ("Soul of an Unknown Traveler", 0x40000193, DS3ItemCategory.MISC), + ("Large Soul of an Unknown Traveler", 0x40000194, DS3ItemCategory.MISC), + ("Soul of a Nameless Soldier", 0x40000195, DS3ItemCategory.MISC), + ("Large Soul of a Nameless Soldier", 0x40000196, DS3ItemCategory.MISC), + ("Soul of a Weary Warrior", 0x40000197, DS3ItemCategory.MISC), + ("Large Soul of a Weary Warrior", 0x40000198, DS3ItemCategory.MISC), + ("Soul of a Crestfallen Knight", 0x40000199, DS3ItemCategory.MISC), + ("Large Soul of a Crestfallen Knight", 0x4000019A, DS3ItemCategory.MISC), + ("Soul of a Proud Paladin", 0x4000019B, DS3ItemCategory.MISC), + ("Large Soul of a Proud Paladin", 0x4000019C, DS3ItemCategory.MISC), + ("Soul of an Intrepid Hero", 0x4000019D, DS3ItemCategory.MISC), + ("Large Soul of an Intrepid Hero", 0x4000019E, DS3ItemCategory.MISC), + ("Soul of a Seasoned Warrior", 0x4000019F, DS3ItemCategory.MISC), + ("Large Soul of a Seasoned Warrior", 0x400001A0, DS3ItemCategory.MISC), + ("Soul of an Old Hand", 0x400001A1, DS3ItemCategory.MISC), + ("Soul of a Venerable Old Hand", 0x400001A2, DS3ItemCategory.MISC), + ("Soul of a Champion", 0x400001A3, DS3ItemCategory.MISC), + ("Soul of a Great Champion", 0x400001A4, DS3ItemCategory.MISC), + ("Seed of a Giant Tree", 0x400001B8, DS3ItemCategory.SKIP), + ("Young White Branch", 0x400001C6, DS3ItemCategory.SKIP), + ("Rusted Coin", 0x400001C7, DS3ItemCategory.MISC), + ("Siegbräu", 0x400001C8, DS3ItemCategory.SKIP), + ("Rusted Gold Coin", 0x400001C9, DS3ItemCategory.MISC), + ("Blue Bug Pellet", 0x400001CA, DS3ItemCategory.SKIP), + ("Red Bug Pellet", 0x400001CB, DS3ItemCategory.SKIP), + ("Yellow Bug Pellet", 0x400001CC, DS3ItemCategory.SKIP), + ("Black Bug Pellet", 0x400001CD, DS3ItemCategory.SKIP), + ("Young White Branch", 0x400001CF, DS3ItemCategory.SKIP), + ("Dark Sigil", 0x400001EA, DS3ItemCategory.SKIP), + ("Ember", 0x400001F4, DS3ItemCategory.MISC), + ("Soul of Champion Gundyr", 0x400002C8, DS3ItemCategory.BOSS), + ("Soul of the Dancer", 0x400002CA, DS3ItemCategory.BOSS), + ("Soul of a Crystal Sage", 0x400002CB, DS3ItemCategory.BOSS), + ("Soul of the Blood of the Wolf", 0x400002CD, DS3ItemCategory.BOSS), + ("Soul of Consumed Oceiros", 0x400002CE, DS3ItemCategory.BOSS), + ("Soul of Boreal Valley Vordt", 0x400002CF, DS3ItemCategory.BOSS), + ("Soul of the Old Demon King", 0x400002D0, DS3ItemCategory.BOSS), + ("Soul of Dragonslayer Armour", 0x400002D1, DS3ItemCategory.BOSS), + ("Soul of the Nameless King", 0x400002D2, DS3ItemCategory.BOSS), + ("Soul of Pontiff Sulyvahn", 0x400002D4, DS3ItemCategory.BOSS), + ("Soul of Aldrich", 0x400002D5, DS3ItemCategory.BOSS), + ("Soul of High Lord Wolnir", 0x400002D6, DS3ItemCategory.BOSS), + ("Soul of the Rotted Greatwood", 0x400002D7, DS3ItemCategory.BOSS), + ("Soul of Rosaria", 0x400002D8, DS3ItemCategory.MISC), + ("Soul of the Deacons of the Deep", 0x400002D9, DS3ItemCategory.BOSS), + ("Soul of the Twin Princes", 0x400002DB, DS3ItemCategory.BOSS), + ("Soul of Yhorm the Giant", 0x400002DC, DS3ItemCategory.BOSS), + ("Soul of the Lords", 0x400002DD, DS3ItemCategory.MISC), + ("Soul of a Demon", 0x400002E3, DS3ItemCategory.BOSS), + ("Soul of a Stray Demon", 0x400002E7, DS3ItemCategory.BOSS), + ("Titanite Shard", 0x400003E8, DS3ItemCategory.MISC), + ("Large Titanite Shard", 0x400003E9, DS3ItemCategory.MISC), + ("Titanite Chunk", 0x400003EA, DS3ItemCategory.MISC), + ("Titanite Slab", 0x400003EB, DS3ItemCategory.MISC), + ("Titanite Scale", 0x400003FC, DS3ItemCategory.MISC), + ("Twinkling Titanite", 0x40000406, DS3ItemCategory.MISC), + ("Heavy Gem", 0x4000044C, DS3ItemCategory.MISC), + ("Sharp Gem", 0x40000456, DS3ItemCategory.MISC), + ("Refined Gem", 0x40000460, DS3ItemCategory.MISC), + ("Crystal Gem", 0x4000046A, DS3ItemCategory.MISC), + ("Simple Gem", 0x40000474, DS3ItemCategory.MISC), + ("Fire Gem", 0x4000047E, DS3ItemCategory.MISC), + ("Chaos Gem", 0x40000488, DS3ItemCategory.MISC), + ("Lightning Gem", 0x40000492, DS3ItemCategory.MISC), + ("Deep Gem", 0x4000049C, DS3ItemCategory.MISC), + ("Dark Gem", 0x400004A6, DS3ItemCategory.MISC), + ("Poison Gem", 0x400004B0, DS3ItemCategory.MISC), + ("Blood Gem", 0x400004BA, DS3ItemCategory.MISC), + ("Raw Gem", 0x400004C4, DS3ItemCategory.MISC), + ("Blessed Gem", 0x400004CE, DS3ItemCategory.MISC), + ("Hollow Gem", 0x400004D8, DS3ItemCategory.MISC), + ("Shriving Stone", 0x400004E2, DS3ItemCategory.MISC), + ("Lift Chamber Key", 0x400007D1, DS3ItemCategory.KEY), + ("Small Doll", 0x400007D5, DS3ItemCategory.KEY), + ("Jailbreaker's Key", 0x400007D7, DS3ItemCategory.KEY), + ("Jailer's Key Ring", 0x400007D8, DS3ItemCategory.KEY), + ("Grave Key", 0x400007D9, DS3ItemCategory.KEY), + ("Cell Key", 0x400007DA, DS3ItemCategory.KEY), + ("Dungeon Ground Floor Key", 0x400007DB, DS3ItemCategory.KEY), + ("Old Cell Key", 0x400007DC, DS3ItemCategory.KEY), + ("Grand Archives Key", 0x400007DE, DS3ItemCategory.KEY), + ("Tower Key", 0x400007DF, DS3ItemCategory.KEY), + ("Small Lothric Banner", 0x40000836, DS3ItemCategory.KEY), + ("Farron Coal", 0x40000837, DS3ItemCategory.MISC), + ("Sage's Coal", 0x40000838, DS3ItemCategory.MISC), + ("Giant's Coal", 0x40000839, DS3ItemCategory.MISC), + ("Profaned Coal", 0x4000083A, DS3ItemCategory.MISC), + ("Mortician's Ashes", 0x4000083B, DS3ItemCategory.MISC), + ("Dreamchaser's Ashes", 0x4000083C, DS3ItemCategory.MISC), + ("Paladin's Ashes", 0x4000083D, DS3ItemCategory.MISC), + ("Grave Warden's Ashes", 0x4000083E, DS3ItemCategory.MISC), + ("Greirat's Ashes", 0x4000083F, DS3ItemCategory.MISC), + ("Orbeck's Ashes", 0x40000840, DS3ItemCategory.MISC), + ("Cornyx's Ashes", 0x40000841, DS3ItemCategory.MISC), + ("Karla's Ashes", 0x40000842, DS3ItemCategory.MISC), + ("Irina's Ashes", 0x40000843, DS3ItemCategory.MISC), + ("Yuria's Ashes", 0x40000844, DS3ItemCategory.MISC), + ("Basin of Vows", 0x40000845, DS3ItemCategory.KEY), + ("Loretta's Bone", 0x40000846, DS3ItemCategory.KEY), + ("Braille Divine Tome of Carim", 0x40000847, DS3ItemCategory.MISC), + ("Braille Divine Tome of Lothric", 0x40000848, DS3ItemCategory.MISC), + ("Cinders of a Lord - Abyss Watcher", 0x4000084B, DS3ItemCategory.KEY), + ("Cinders of a Lord - Aldrich", 0x4000084C, DS3ItemCategory.KEY), + ("Cinders of a Lord - Yhorm the Giant", 0x4000084D, DS3ItemCategory.KEY), + ("Cinders of a Lord - Lothric Prince", 0x4000084E, DS3ItemCategory.KEY), + ("Great Swamp Pyromancy Tome", 0x4000084F, DS3ItemCategory.MISC), + ("Carthus Pyromancy Tome", 0x40000850, DS3ItemCategory.MISC), + ("Izalith Pyromancy Tome", 0x40000851, DS3ItemCategory.MISC), + ("Quelana Pyromancy Tome", 0x40000852, DS3ItemCategory.MISC), + ("Grave Warden Pyromancy Tome", 0x40000853, DS3ItemCategory.MISC), + ("Sage's Scroll", 0x40000854, DS3ItemCategory.MISC), + ("Logan's Scroll", 0x40000855, DS3ItemCategory.MISC), + ("Crystal Scroll", 0x40000856, DS3ItemCategory.MISC), + ("Transposing Kiln", 0x40000857, DS3ItemCategory.MISC), + ("Coiled Sword", 0x40000859, DS3ItemCategory.SKIP), # Useless + ("Eyes of a Fire Keeper", 0x4000085A, DS3ItemCategory.KEY), + ("Sword of Avowal", 0x4000085B, DS3ItemCategory.KEY), + ("Golden Scroll", 0x4000085C, DS3ItemCategory.MISC), + ("Estus Shard", 0x4000085D, DS3ItemCategory.MISC), + ("Hawkwood's Swordgrass", 0x4000085E, DS3ItemCategory.SKIP), + ("Undead Bone Shard", 0x4000085F, DS3ItemCategory.MISC), + ("Deep Braille Divine Tome", 0x40000860, DS3ItemCategory.MISC), + ("Londor Braille Divine Tome", 0x40000861, DS3ItemCategory.MISC), + ("Excrement-covered Ashes", 0x40000862, DS3ItemCategory.MISC), + ("Prisoner Chief's Ashes", 0x40000863, DS3ItemCategory.MISC), + ("Xanthous Ashes", 0x40000864, DS3ItemCategory.MISC), + ("Hollow's Ashes", 0x40000865, DS3ItemCategory.MISC), + ("Patches' Ashes", 0x40000866, DS3ItemCategory.MISC), + ("Dragon Chaser's Ashes", 0x40000867, DS3ItemCategory.MISC), + ("Easterner's Ashes", 0x40000868, DS3ItemCategory.MISC), + + # Spells + ("Farron Dart", 0x40124F80, DS3ItemCategory.SPELL), + ("Great Farron Dart", 0x40127690, DS3ItemCategory.SPELL), + ("Soul Arrow", 0x4013D620, DS3ItemCategory.SPELL), + ("Great Soul Arrow", 0x4013DA08, DS3ItemCategory.SPELL), + ("Heavy Soul Arrow", 0x4013DDF0, DS3ItemCategory.SPELL), + ("Great Heavy Soul Arrow", 0x4013E1D8, DS3ItemCategory.SPELL), + ("Homing Soulmass", 0x4013E5C0, DS3ItemCategory.SPELL), + ("Homing Crystal Soulmass", 0x4013E9A8, DS3ItemCategory.SPELL), + ("Soul Spear", 0x4013ED90, DS3ItemCategory.SPELL), + ("Crystal Soul Spear", 0x4013F178, DS3ItemCategory.SPELL), + ("Deep Soul", 0x4013F560, DS3ItemCategory.SPELL), + ("Great Deep Soul", 0x4013F948, DS3ItemCategory.SPELL), + ("Magic Weapon", 0x4013FD30, DS3ItemCategory.SPELL), + ("Great Magic Weapon", 0x40140118, DS3ItemCategory.SPELL), + ("Crystal Magic Weapon", 0x40140500, DS3ItemCategory.SPELL), + ("Magic Shield", 0x40144B50, DS3ItemCategory.SPELL), + ("Great Magic Shield", 0x40144F38, DS3ItemCategory.SPELL), + ("Hidden Weapon", 0x40147260, DS3ItemCategory.SPELL), + ("Hidden Body", 0x40147648, DS3ItemCategory.SPELL), + ("Cast Light", 0x40149970, DS3ItemCategory.SPELL), + ("Repair", 0x4014A528, DS3ItemCategory.SPELL), + ("Spook", 0x4014A910, DS3ItemCategory.SPELL), + ("Chameleon", 0x4014ACF8, DS3ItemCategory.SPELL), + ("Aural Decoy", 0x4014B0E0, DS3ItemCategory.SPELL), + ("White Dragon Breath", 0x4014E790, DS3ItemCategory.SPELL), + ("Farron Hail", 0x4014EF60, DS3ItemCategory.SPELL), + ("Crystal Hail", 0x4014F348, DS3ItemCategory.SPELL), + ("Soul Greatsword", 0x4014F730, DS3ItemCategory.SPELL), + ("Farron Flashsword", 0x4014FB18, DS3ItemCategory.SPELL), + ("Affinity", 0x401875B8, DS3ItemCategory.SPELL), + ("Dark Edge", 0x40189CC8, DS3ItemCategory.SPELL), + ("Soul Stream", 0x4018B820, DS3ItemCategory.SPELL), + ("Twisted Wall of Light", 0x40193138, DS3ItemCategory.SPELL), + ("Pestilent Mist", 0x401A8CE0, DS3ItemCategory.SPELL), # Originally called "Pestilent Mercury" pre 1.15 + ("Fireball", 0x40249F00, DS3ItemCategory.SPELL), + ("Fire Orb", 0x4024A6D0, DS3ItemCategory.SPELL), + ("Firestorm", 0x4024AAB8, DS3ItemCategory.SPELL), + ("Fire Surge", 0x4024B288, DS3ItemCategory.SPELL), + ("Black Serpent", 0x4024BA58, DS3ItemCategory.SPELL), + ("Combustion", 0x4024C610, DS3ItemCategory.SPELL), + ("Great Combustion", 0x4024C9F8, DS3ItemCategory.SPELL), + ("Poison Mist", 0x4024ED20, DS3ItemCategory.SPELL), + ("Toxic Mist", 0x4024F108, DS3ItemCategory.SPELL), + ("Acid Surge", 0x4024F4F0, DS3ItemCategory.SPELL), + ("Iron Flesh", 0x40251430, DS3ItemCategory.SPELL), + ("Flash Sweat", 0x40251818, DS3ItemCategory.SPELL), + ("Carthus Flame Arc", 0x402527B8, DS3ItemCategory.SPELL), + ("Rapport", 0x40252BA0, DS3ItemCategory.SPELL), + ("Power Within", 0x40253B40, DS3ItemCategory.SPELL), + ("Great Chaos Fire Orb", 0x40256250, DS3ItemCategory.SPELL), + ("Chaos Storm", 0x40256638, DS3ItemCategory.SPELL), + ("Fire Whip", 0x40256A20, DS3ItemCategory.SPELL), + ("Black Flame", 0x40256E08, DS3ItemCategory.SPELL), + ("Profaned Flame", 0x402575D8, DS3ItemCategory.SPELL), + ("Chaos Bed Vestiges", 0x402579C0, DS3ItemCategory.SPELL), + ("Warmth", 0x4025B070, DS3ItemCategory.SPELL), + ("Profuse Sweat", 0x402717D0, DS3ItemCategory.SPELL), + ("Black Fire Orb", 0x4027D350, DS3ItemCategory.SPELL), + ("Bursting Fireball", 0x4027FA60, DS3ItemCategory.SPELL), + ("Boulder Heave", 0x40282170, DS3ItemCategory.SPELL), + ("Sacred Flame", 0x40284880, DS3ItemCategory.SPELL), + ("Carthus Beacon", 0x40286F90, DS3ItemCategory.SPELL), + ("Heal Aid", 0x403540D0, DS3ItemCategory.SPELL), + ("Heal", 0x403567E0, DS3ItemCategory.SPELL), + ("Med Heal", 0x40356BC8, DS3ItemCategory.SPELL), + ("Great Heal", 0x40356FB0, DS3ItemCategory.SPELL), + ("Soothing Sunlight", 0x40357398, DS3ItemCategory.SPELL), + ("Replenishment", 0x40357780, DS3ItemCategory.SPELL), + ("Bountiful Sunlight", 0x40357B68, DS3ItemCategory.SPELL), + ("Bountiful Light", 0x40358338, DS3ItemCategory.SPELL), + ("Caressing Tears", 0x40358720, DS3ItemCategory.SPELL), + ("Tears of Denial", 0x4035B600, DS3ItemCategory.SPELL), + ("Homeward", 0x4035B9E8, DS3ItemCategory.SPELL), + ("Force", 0x4035DD10, DS3ItemCategory.SPELL), + ("Wrath of the Gods", 0x4035E0F8, DS3ItemCategory.SPELL), + ("Emit Force", 0x4035E4E0, DS3ItemCategory.SPELL), + ("Seek Guidance", 0x40360420, DS3ItemCategory.SPELL), + ("Lightning Spear", 0x40362B30, DS3ItemCategory.SPELL), + ("Great Lightning Spear", 0x40362F18, DS3ItemCategory.SPELL), + ("Sunlight Spear", 0x40363300, DS3ItemCategory.SPELL), + ("Lightning Storm", 0x403636E8, DS3ItemCategory.SPELL), + ("Gnaw", 0x40363AD0, DS3ItemCategory.SPELL), + ("Dorhys' Gnawing", 0x40363EB8, DS3ItemCategory.SPELL), + ("Magic Barrier", 0x40365240, DS3ItemCategory.SPELL), + ("Great Magic Barrier", 0x40365628, DS3ItemCategory.SPELL), + ("Sacred Oath", 0x40365DF8, DS3ItemCategory.SPELL), + ("Vow of Silence", 0x4036A448, DS3ItemCategory.SPELL), + ("Lightning Blade", 0x4036C770, DS3ItemCategory.SPELL), + ("Darkmoon Blade", 0x4036CB58, DS3ItemCategory.SPELL), + ("Dark Blade", 0x40378AC0, DS3ItemCategory.SPELL), + ("Dead Again", 0x40387520, DS3ItemCategory.SPELL), + ("Lightning Stake", 0x40389C30, DS3ItemCategory.SPELL), + ("Divine Pillars of Light", 0x4038C340, DS3ItemCategory.SPELL), + ("Lifehunt Scythe", 0x4038EA50, DS3ItemCategory.SPELL), + ("Blessed Weapon", 0x40395F80, DS3ItemCategory.SPELL), + ("Deep Protection", 0x40398690, DS3ItemCategory.SPELL), + ("Atonement", 0x4039ADA0, DS3ItemCategory.SPELL), +]] + +_dlc_items = [DS3ItemData(row[0], row[1], True, row[2]) for row in [ + # Ammunition + ("Millwood Greatarrow", 0x000623E0, DS3ItemCategory.SKIP), + + # Weapons + ("Aquamarine Dagger", 0x00116520, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Murky Hand Scythe", 0x00118C30, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Onyx Blade", 0x00222E00, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Ringed Knight Straight Sword", 0x00225510, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Gael's Greatsword", 0x00227C20, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Follower Sabre", 0x003EDDC0, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Demon's Scar", 0x003F04D0, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Frayed Blade", 0x004D35A0, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Herald Curved Greatsword", 0x006159E0, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Millwood Battle Axe", 0x006D67D0, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Earth Seeker", 0x006D8EE0, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Quakestone Hammer", 0x007ECCF0, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Ledo's Great Hammer", 0x007EF400, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Follower Javelin", 0x008CD6B0, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Ringed Knight Spear", 0x008CFDC0, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Lothric War Banner", 0x008D24D0, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Crucifix of the Mad King", 0x008D4BE0, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Splitleaf Greatsword", 0x009B2E90, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Friede's Great Scythe", 0x009B55A0, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Crow Talons", 0x00A89C10, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Rose of Ariandel", 0x00B82C70, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Pyromancer's Parting Flame", 0x00CC9ED0, DS3ItemCategory.WEAPON_UPGRADE_10), + ("Murky Longstaff", 0x00CCC5E0, DS3ItemCategory.WEAPON_UPGRADE_10), + ("Sacred Chime of Filianore", 0x00CCECF0, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Preacher's Right Arm", 0x00CD1400, DS3ItemCategory.WEAPON_UPGRADE_5), + ("White Birch Bow", 0x00D77440, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Millwood Greatbow", 0x00D85EA0, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Repeating Crossbow", 0x00D885B0, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Giant Door Shield", 0x00F5F8C0, DS3ItemCategory.SHIELD_INFUSIBLE), + ("Valorheart", 0x00F646E0, DS3ItemCategory.WEAPON_UPGRADE_5), + ("Crow Quills", 0x00F66DF0, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE), + ("Ringed Knight Paired Greatswords", 0x00F69500, DS3ItemCategory.WEAPON_UPGRADE_5), + + # Shields + ("Follower Shield", 0x0135C0E0, DS3ItemCategory.SHIELD_INFUSIBLE), + ("Dragonhead Shield", 0x0135E7F0, DS3ItemCategory.SHIELD), + ("Ethereal Oak Shield", 0x01450320, DS3ItemCategory.SHIELD), + ("Dragonhead Greatshield", 0x01452A30, DS3ItemCategory.SHIELD), + ("Follower Torch", 0x015F1AD0, DS3ItemCategory.SHIELD), + + # Armor + ("Vilhelm's Helm", 0x11312D00, DS3ItemCategory.ARMOR), + ("Vilhelm's Armor", 0x113130E8, DS3ItemCategory.ARMOR), + ("Vilhelm's Gauntlets", 0x113134D0, DS3ItemCategory.ARMOR), + ("Vilhelm's Leggings", 0x113138B8, DS3ItemCategory.ARMOR), + ("Antiquated Plain Garb", 0x11B2E408, DS3ItemCategory.ARMOR), + ("Violet Wrappings", 0x11B2E7F0, DS3ItemCategory.ARMOR), + ("Loincloth 2", 0x11B2EBD8, DS3ItemCategory.ARMOR), + ("Shira's Crown", 0x11C22260, DS3ItemCategory.ARMOR), + ("Shira's Armor", 0x11C22648, DS3ItemCategory.ARMOR), + ("Shira's Gloves", 0x11C22A30, DS3ItemCategory.ARMOR), + ("Shira's Trousers", 0x11C22E18, DS3ItemCategory.ARMOR), + ("Lapp's Helm", 0x11E84800, DS3ItemCategory.ARMOR), + ("Lapp's Armor", 0x11E84BE8, DS3ItemCategory.ARMOR), + ("Lapp's Gauntlets", 0x11E84FD0, DS3ItemCategory.ARMOR), + ("Lapp's Leggings", 0x11E853B8, DS3ItemCategory.ARMOR), + ("Slave Knight Hood", 0x134EDCE0, DS3ItemCategory.ARMOR), + ("Slave Knight Armor", 0x134EE0C8, DS3ItemCategory.ARMOR), + ("Slave Knight Gauntlets", 0x134EE4B0, DS3ItemCategory.ARMOR), + ("Slave Knight Leggings", 0x134EE898, DS3ItemCategory.ARMOR), + ("Ordained Hood", 0x135E1F20, DS3ItemCategory.ARMOR), + ("Ordained Dress", 0x135E2308, DS3ItemCategory.ARMOR), + ("Ordained Trousers", 0x135E2AD8, DS3ItemCategory.ARMOR), + ("Follower Helm", 0x137CA3A0, DS3ItemCategory.ARMOR), + ("Follower Armor", 0x137CA788, DS3ItemCategory.ARMOR), + ("Follower Gloves", 0x137CAB70, DS3ItemCategory.ARMOR), + ("Follower Boots", 0x137CAF58, DS3ItemCategory.ARMOR), + ("Millwood Knight Helm", 0x139B2820, DS3ItemCategory.ARMOR), + ("Millwood Knight Armor", 0x139B2C08, DS3ItemCategory.ARMOR), + ("Millwood Knight Gauntlets", 0x139B2FF0, DS3ItemCategory.ARMOR), + ("Millwood Knight Leggings", 0x139B33D8, DS3ItemCategory.ARMOR), + ("Ringed Knight Hood", 0x13C8EEE0, DS3ItemCategory.ARMOR), + ("Ringed Knight Armor", 0x13C8F2C8, DS3ItemCategory.ARMOR), + ("Ringed Knight Gauntlets", 0x13C8F6B0, DS3ItemCategory.ARMOR), + ("Ringed Knight Leggings", 0x13C8FA98, DS3ItemCategory.ARMOR), + ("Harald Legion Armor", 0x13D83508, DS3ItemCategory.ARMOR), + ("Harald Legion Gauntlets", 0x13D838F0, DS3ItemCategory.ARMOR), + ("Harald Legion Leggings", 0x13D83CD8, DS3ItemCategory.ARMOR), + ("Iron Dragonslayer Helm", 0x1405F7E0, DS3ItemCategory.ARMOR), + ("Iron Dragonslayer Armor", 0x1405FBC8, DS3ItemCategory.ARMOR), + ("Iron Dragonslayer Gauntlets", 0x1405FFB0, DS3ItemCategory.ARMOR), + ("Iron Dragonslayer Leggings", 0x14060398, DS3ItemCategory.ARMOR), + ("White Preacher Head", 0x14153A20, DS3ItemCategory.ARMOR), + ("Ruin Sentinel Helm", 0x14CC5520, DS3ItemCategory.ARMOR), + ("Ruin Sentinel Armor", 0x14CC5908, DS3ItemCategory.ARMOR), + ("Ruin Sentinel Gauntlets", 0x14CC5CF0, DS3ItemCategory.ARMOR), + ("Ruin Sentinel Leggings", 0x14CC60D8, DS3ItemCategory.ARMOR), + ("Desert Pyromancer Hood", 0x14DB9760, DS3ItemCategory.ARMOR), + ("Desert Pyromancer Garb", 0x14DB9B48, DS3ItemCategory.ARMOR), + ("Desert Pyromancer Gloves", 0x14DB9F30, DS3ItemCategory.ARMOR), + ("Desert Pyromancer Skirt", 0x14DBA318, DS3ItemCategory.ARMOR), + ("Black Witch Hat", 0x14EAD9A0, DS3ItemCategory.ARMOR), + ("Black Witch Garb", 0x14EADD88, DS3ItemCategory.ARMOR), + ("Black Witch Wrappings", 0x14EAE170, DS3ItemCategory.ARMOR), + ("Black Witch Trousers", 0x14EAE558, DS3ItemCategory.ARMOR), + ("Black Witch Veil", 0x14FA1BE0, DS3ItemCategory.ARMOR), + ("Blindfold Mask", 0x15095E20, DS3ItemCategory.ARMOR), + + # Covenants + ("Spear of the Church", 0x2000276A, DS3ItemCategory.SKIP), + + # Rings + ("Chloranthy Ring+3", 0x20004E2D, DS3ItemCategory.RING), + ("Havel's Ring+3", 0x20004E37, DS3ItemCategory.RING), + ("Ring of Favor+3", 0x20004E41, DS3ItemCategory.RING), + ("Ring of Steel Protection+3", 0x20004E4B, DS3ItemCategory.RING), + ("Wolf Ring+3", 0x20004EE1, DS3ItemCategory.RING), + ("Covetous Gold Serpent Ring+3", 0x20004FA9, DS3ItemCategory.RING), + ("Covetous Silver Serpent Ring+3", 0x20004FB3, DS3ItemCategory.RING), + ("Ring of the Evil Eye+3", 0x20005071, DS3ItemCategory.RING), + ("Chillbite Ring", 0x20005208, DS3ItemCategory.RING), + + # Items + ("Church Guardian Shiv", 0x4000013B, DS3ItemCategory.MISC), + ("Filianore's Spear Ornament", 0x4000017B, DS3ItemCategory.SKIP), + ("Ritual Spear Fragment", 0x4000028A, DS3ItemCategory.MISC), + ("Divine Spear Fragment", 0x4000028B, DS3ItemCategory.SKIP), + ("Soul of Sister Friede", 0x400002E8, DS3ItemCategory.BOSS), + ("Soul of Slave Knight Gael", 0x400002E9, DS3ItemCategory.BOSS), + ("Soul of the Demon Prince", 0x400002EA, DS3ItemCategory.BOSS), + ("Soul of Darkeater Midir", 0x400002EB, DS3ItemCategory.BOSS), + ("Champion's Bones", 0x40000869, DS3ItemCategory.SKIP), + ("Captain's Ashes", 0x4000086A, DS3ItemCategory.MISC), + ("Contraption Key", 0x4000086B, DS3ItemCategory.KEY), + ("Small Envoy Banner", 0x4000086C, DS3ItemCategory.KEY), + ("Old Woman's Ashes", 0x4000086D, DS3ItemCategory.SKIP), + ("Blood of the Dark Soul", 0x4000086E, DS3ItemCategory.SKIP), + + # Spells + ("Frozen Weapon", 0x401408E8, DS3ItemCategory.SPELL), + ("Old Moonlight", 0x4014FF00, DS3ItemCategory.SPELL), + ("Great Soul Dregs", 0x401879A0, DS3ItemCategory.SPELL), + ("Snap Freeze", 0x401A90C8, DS3ItemCategory.SPELL), + ("Floating Chaos", 0x40257DA8, DS3ItemCategory.SPELL), + ("Flame Fan", 0x40258190, DS3ItemCategory.SPELL), + ("Seething Chaos", 0x402896A0, DS3ItemCategory.SPELL), + ("Lightning Arrow", 0x40358B08, DS3ItemCategory.SPELL), + ("Way of White Corona", 0x403642A0, DS3ItemCategory.SPELL), + ("Projected Heal", 0x40364688, DS3ItemCategory.SPELL), +]] + +# Unused list for future reference +# These items exist to some degree in the code, but aren't accessible +# in-game and can't be picked up without modifications +_cut_content_items = [DS3ItemData(row[0], row[1], False, row[2]) for row in [ + # Weapons + ("Blood-stained Short Sword", 0x00100590, DS3ItemCategory.SKIP), + ("Missionary's Axe", 0x006C2F50, DS3ItemCategory.SKIP), + ("Dragon King Greataxe", 0x006D40C0, DS3ItemCategory.SKIP), + ("Four Knights Hammer", 0x007D4650, DS3ItemCategory.SKIP), + ("Hammer of the Great Tree", 0x007D9470, DS3ItemCategory.SKIP), + ("Lothric's Scythe", 0x009A4430, DS3ItemCategory.SKIP), + ("Ancient Dragon Halberd", 0x009A6B40, DS3ItemCategory.SKIP), + ("Scythe of Want", 0x009A9250, DS3ItemCategory.SKIP), + ("Sacred Beast Catalyst", 0x00C8A730, DS3ItemCategory.SKIP), + ("Deep Pyromancy Flame", 0x00CC9ED0, DS3ItemCategory.SKIP), # Duplicate? + ("Flickering Pyromancy Flame", 0x00CD3B10, DS3ItemCategory.SKIP), + ("Strong Pyromancy Flame", 0x00CD6220, DS3ItemCategory.SKIP), + ("Deep Pyromancy Flame", 0x00CDFE60, DS3ItemCategory.SKIP), # Duplicate? + ("Pitch-Dark Pyromancy Flame", 0x00CE2570, DS3ItemCategory.SKIP), + ("Dancer's Short Bow", 0x00D77440, DS3ItemCategory.SKIP), + ("Shield Crossbow", 0x00D81080, DS3ItemCategory.SKIP), + ("Golden Dual Swords", 0x00F55C80, DS3ItemCategory.SKIP), + ("Channeler's Trident", 0x008C8890, DS3ItemCategory.SKIP), + + # Shields + ("Cleric's Parma", 0x013524A0, DS3ItemCategory.SKIP), + ("Prince's Shield", 0x01421CF0, DS3ItemCategory.SKIP), + + # Armor + ("Dingy Maiden's Overcoat", 0x11DA9048, DS3ItemCategory.SKIP), + ("Grotto Hat", 0x11F78A40, DS3ItemCategory.SKIP), + ("Grotto Robe", 0x11F78E28, DS3ItemCategory.SKIP), + ("Grotto Wrap", 0x11F79210, DS3ItemCategory.SKIP), + ("Grotto Trousers", 0x11F795F8, DS3ItemCategory.SKIP), + ("Soldier's Gauntlets", 0x126261D0, DS3ItemCategory.SKIP), + ("Soldier's Hood", 0x1263E0A0, DS3ItemCategory.SKIP), + ("Elder's Robe", 0x129024A8, DS3ItemCategory.SKIP), + ("Saint's Veil", 0x12A70420, DS3ItemCategory.SKIP), + ("Saint's Dress", 0x12A70808, DS3ItemCategory.SKIP), + ("Footman's Hood", 0x12AEA540, DS3ItemCategory.SKIP), + ("Footman's Overcoat", 0x12AEA928, DS3ItemCategory.SKIP), + ("Footman's Bracelets", 0x12AEAD10, DS3ItemCategory.SKIP), + ("Footman's Trousers", 0x12AEB0F8, DS3ItemCategory.SKIP), + ("Scholar's Shed Skin", 0x12E40D20, DS3ItemCategory.SKIP), + ("Man Serpent's Mask", 0x138BE5E0, DS3ItemCategory.SKIP), + ("Man Serpent's Robe", 0x138BE9C8, DS3ItemCategory.SKIP), + ("Old Monarch's Crown", 0x13DFD240, DS3ItemCategory.SKIP), + ("Old Monarch's Robe", 0x13DFD628, DS3ItemCategory.SKIP), + ("Frigid Valley Mask", 0x13FE56C0, DS3ItemCategory.SKIP), + ("Dingy Hood", 0x140D9900, DS3ItemCategory.SKIP), + ("Hexer's Hood", 0x15A995C0, DS3ItemCategory.SKIP), + ("Hexer's Robes", 0x15A999A8, DS3ItemCategory.SKIP), + ("Hexer's Gloves", 0x15A99D90, DS3ItemCategory.SKIP), + ("Hexer's Boots", 0x15A9A178, DS3ItemCategory.SKIP), + ("Varangian Helm", 0x15C81A40, DS3ItemCategory.SKIP), + ("Varangian Armor", 0x15C81E28, DS3ItemCategory.SKIP), + ("Varangian Cuffs", 0x15C82210, DS3ItemCategory.SKIP), + ("Varangian Leggings", 0x15C825F8, DS3ItemCategory.SKIP), + + # Rings + ("Rare Ring of Sacrifice", 0x20004EFC, DS3ItemCategory.SKIP), + ("Baneful Bird Ring", 0x20005032, DS3ItemCategory.SKIP), + ("Darkmoon Blade Covenant Ring", 0x20004F7E, DS3ItemCategory.SKIP), + ("Yorgh's Ring", 0x2000505A, DS3ItemCategory.SKIP), + ("Ring of Hiding", 0x200050D2, DS3ItemCategory.SKIP), + ("Ring of Sustained Toughness", 0x20005118, DS3ItemCategory.SKIP), + ("Ring of Sustained Energy", 0x20005122, DS3ItemCategory.SKIP), + ("Ring of Sustained Magic", 0x2000512C, DS3ItemCategory.SKIP), + ("Ring of Sustained Essence", 0x20005140, DS3ItemCategory.SKIP), + ("Ring of Sustained Might", 0x2000514A, DS3ItemCategory.SKIP), + ("Ring of Sustained Fortune", 0x20005154, DS3ItemCategory.SKIP), + + # Items + ("Soul of a Wicked Spirit", 0x400002C9, DS3ItemCategory.SKIP), + + # Spells + ("Dark Orb", 0x4027AC40, DS3ItemCategory.SKIP), + ("Morbid Temptation", 0x40359AA8, DS3ItemCategory.SKIP), + ("Dorris Swarm", 0x40393870, DS3ItemCategory.SKIP), +]] + +_all_items = _vanilla_items + _dlc_items + +item_dictionary = {item_data.name: item_data for item_data in _all_items} diff --git a/worlds/dark_souls_3/Locations.py b/worlds/dark_souls_3/Locations.py index a63a951c..53a39f51 100644 --- a/worlds/dark_souls_3/Locations.py +++ b/worlds/dark_souls_3/Locations.py @@ -1,22 +1,690 @@ -import sys +from enum import IntEnum +from typing import Optional, NamedTuple, Dict -from BaseClasses import Location -from worlds.dark_souls_3.data.locations_data import location_tables, painted_world_table, dreg_heap_table, \ - ringed_city_table +from BaseClasses import Location, Region + + +class DS3LocationCategory(IntEnum): + WEAPON = 0 + SHIELD = 1 + ARMOR = 2 + RING = 3 + SPELL = 4 + NPC = 5 + KEY = 6 + BOSS = 7 + MISC = 8 + HEALTH = 9 + PROGRESSIVE_ITEM = 10 + + +class DS3LocationData(NamedTuple): + name: str + default_item: str + category: DS3LocationCategory class DarkSouls3Location(Location): game: str = "Dark Souls III" + category: DS3LocationCategory + default_item_name: str + + def __init__( + self, + player: int, + name: str, + category: DS3LocationCategory, + default_item_name: str, + address: Optional[int] = None, + parent: Optional[Region] = None): + super().__init__(player, name, address, parent) + self.default_item_name = default_item_name + self.category = category @staticmethod def get_name_to_id() -> dict: base_id = 100000 table_offset = 100 + table_order = [ + "Firelink Shrine", + "Firelink Shrine Bell Tower", + "High Wall of Lothric", + "Undead Settlement", + "Road of Sacrifices", + "Cathedral of the Deep", + "Farron Keep", + "Catacombs of Carthus", + "Smouldering Lake", + "Irithyll of the Boreal Valley", + "Irithyll Dungeon", + "Profaned Capital", + "Anor Londo", + "Lothric Castle", + "Consumed King's Garden", + "Grand Archives", + "Untended Graves", + "Archdragon Peak", + + "Painted World of Ariandel 1", + "Painted World of Ariandel 2", + "Dreg Heap", + "Ringed City", + + "Progressive Items 1", + "Progressive Items 2", + "Progressive Items 3", + "Progressive Items 4", + "Progressive Items DLC", + ] + output = {} - for i, table in enumerate(location_tables): - if len(table) > table_offset: - raise Exception("A location table has {} entries, that is more than {} entries (table #{})".format(len(table), table_offset, i)) - output.update({name: id for id, name in enumerate(table, base_id + (table_offset * i))}) + for i, region_name in enumerate(table_order): + if len(location_tables[region_name]) > table_offset: + raise Exception("A location table has {} entries, that is more than {} entries (table #{})".format(len(location_tables[region_name]), table_offset, i)) + + output.update({location_data.name: id for id, location_data in enumerate(location_tables[region_name], base_id + (table_offset * i))}) return output + + +location_tables = { + "Firelink Shrine": [ + DS3LocationData("FS: Broken Straight Sword", "Broken Straight Sword", DS3LocationCategory.WEAPON), + DS3LocationData("FS: East-West Shield", "East-West Shield", DS3LocationCategory.SHIELD), + DS3LocationData("FS: Uchigatana", "Uchigatana", DS3LocationCategory.WEAPON), + DS3LocationData("FS: Master's Attire", "Master's Attire", DS3LocationCategory.ARMOR), + DS3LocationData("FS: Master's Gloves", "Master's Gloves", DS3LocationCategory.ARMOR), + ], + "Firelink Shrine Bell Tower": [ + DS3LocationData("FSBT: Covetous Silver Serpent Ring", "Covetous Silver Serpent Ring", DS3LocationCategory.RING), + DS3LocationData("FSBT: Fire Keeper Robe", "Fire Keeper Robe", DS3LocationCategory.ARMOR), + DS3LocationData("FSBT: Fire Keeper Gloves", "Fire Keeper Gloves", DS3LocationCategory.ARMOR), + DS3LocationData("FSBT: Fire Keeper Skirt", "Fire Keeper Skirt", DS3LocationCategory.ARMOR), + DS3LocationData("FSBT: Estus Ring", "Estus Ring", DS3LocationCategory.RING), + DS3LocationData("FSBT: Fire Keeper Soul", "Fire Keeper Soul", DS3LocationCategory.MISC), + ], + "High Wall of Lothric": [ + DS3LocationData("HWL: Deep Battle Axe", "Deep Battle Axe", DS3LocationCategory.WEAPON), + DS3LocationData("HWL: Club", "Club", DS3LocationCategory.WEAPON), + DS3LocationData("HWL: Claymore", "Claymore", DS3LocationCategory.WEAPON), + DS3LocationData("HWL: Binoculars", "Binoculars", DS3LocationCategory.MISC), + DS3LocationData("HWL: Longbow", "Longbow", DS3LocationCategory.WEAPON), + DS3LocationData("HWL: Mail Breaker", "Mail Breaker", DS3LocationCategory.WEAPON), + DS3LocationData("HWL: Broadsword", "Broadsword", DS3LocationCategory.WEAPON), + DS3LocationData("HWL: Silver Eagle Kite Shield", "Silver Eagle Kite Shield", DS3LocationCategory.SHIELD), + DS3LocationData("HWL: Astora's Straight Sword", "Astora's Straight Sword", DS3LocationCategory.WEAPON), + DS3LocationData("HWL: Cell Key", "Cell Key", DS3LocationCategory.KEY), + DS3LocationData("HWL: Rapier", "Rapier", DS3LocationCategory.WEAPON), + DS3LocationData("HWL: Lucerne", "Lucerne", DS3LocationCategory.WEAPON), + DS3LocationData("HWL: Small Lothric Banner", "Small Lothric Banner", DS3LocationCategory.KEY), + DS3LocationData("HWL: Basin of Vows", "Basin of Vows", DS3LocationCategory.KEY), + DS3LocationData("HWL: Soul of Boreal Valley Vordt", "Soul of Boreal Valley Vordt", DS3LocationCategory.BOSS), + DS3LocationData("HWL: Soul of the Dancer", "Soul of the Dancer", DS3LocationCategory.BOSS), + DS3LocationData("HWL: Way of Blue", "Way of Blue", DS3LocationCategory.MISC), + DS3LocationData("HWL: Greirat's Ashes", "Greirat's Ashes", DS3LocationCategory.NPC), + DS3LocationData("HWL: Blue Tearstone Ring", "Blue Tearstone Ring", DS3LocationCategory.NPC), + ], + "Undead Settlement": [ + DS3LocationData("US: Small Leather Shield", "Small Leather Shield", DS3LocationCategory.SHIELD), + DS3LocationData("US: Whip", "Whip", DS3LocationCategory.WEAPON), + DS3LocationData("US: Reinforced Club", "Reinforced Club", DS3LocationCategory.WEAPON), + DS3LocationData("US: Blue Wooden Shield", "Blue Wooden Shield", DS3LocationCategory.SHIELD), + DS3LocationData("US: Cleric Hat", "Cleric Hat", DS3LocationCategory.ARMOR), + DS3LocationData("US: Cleric Blue Robe", "Cleric Blue Robe", DS3LocationCategory.ARMOR), + DS3LocationData("US: Cleric Gloves", "Cleric Gloves", DS3LocationCategory.ARMOR), + DS3LocationData("US: Cleric Trousers", "Cleric Trousers", DS3LocationCategory.ARMOR), + DS3LocationData("US: Mortician's Ashes", "Mortician's Ashes", DS3LocationCategory.KEY), + DS3LocationData("US: Caestus", "Caestus", DS3LocationCategory.WEAPON), + DS3LocationData("US: Plank Shield", "Plank Shield", DS3LocationCategory.SHIELD), + DS3LocationData("US: Flame Stoneplate Ring", "Flame Stoneplate Ring", DS3LocationCategory.RING), + DS3LocationData("US: Caduceus Round Shield", "Caduceus Round Shield", DS3LocationCategory.SHIELD), + DS3LocationData("US: Fire Clutch Ring", "Fire Clutch Ring", DS3LocationCategory.RING), + DS3LocationData("US: Partizan", "Partizan", DS3LocationCategory.WEAPON), + DS3LocationData("US: Bloodbite Ring", "Bloodbite Ring", DS3LocationCategory.RING), + DS3LocationData("US: Red Hilted Halberd", "Red Hilted Halberd", DS3LocationCategory.WEAPON), + DS3LocationData("US: Saint's Talisman", "Saint's Talisman", DS3LocationCategory.WEAPON), + DS3LocationData("US: Irithyll Straight Sword", "Irithyll Straight Sword", DS3LocationCategory.WEAPON), + DS3LocationData("US: Large Club", "Large Club", DS3LocationCategory.WEAPON), + DS3LocationData("US: Northern Helm", "Northern Helm", DS3LocationCategory.ARMOR), + DS3LocationData("US: Northern Armor", "Northern Armor", DS3LocationCategory.ARMOR), + DS3LocationData("US: Northern Gloves", "Northern Gloves", DS3LocationCategory.ARMOR), + DS3LocationData("US: Northern Trousers", "Northern Trousers", DS3LocationCategory.ARMOR), + DS3LocationData("US: Flynn's Ring", "Flynn's Ring", DS3LocationCategory.RING), + DS3LocationData("US: Mirrah Vest", "Mirrah Vest", DS3LocationCategory.ARMOR), + DS3LocationData("US: Mirrah Gloves", "Mirrah Gloves", DS3LocationCategory.ARMOR), + DS3LocationData("US: Mirrah Trousers", "Mirrah Trousers", DS3LocationCategory.ARMOR), + DS3LocationData("US: Chloranthy Ring", "Chloranthy Ring", DS3LocationCategory.RING), + DS3LocationData("US: Loincloth", "Loincloth", DS3LocationCategory.ARMOR), + DS3LocationData("US: Wargod Wooden Shield", "Wargod Wooden Shield", DS3LocationCategory.SHIELD), + DS3LocationData("US: Loretta's Bone", "Loretta's Bone", DS3LocationCategory.KEY), + DS3LocationData("US: Hand Axe", "Hand Axe", DS3LocationCategory.WEAPON), + DS3LocationData("US: Great Scythe", "Great Scythe", DS3LocationCategory.WEAPON), + DS3LocationData("US: Soul of the Rotted Greatwood", "Soul of the Rotted Greatwood", DS3LocationCategory.BOSS), + DS3LocationData("US: Hawk Ring", "Hawk Ring", DS3LocationCategory.RING), + DS3LocationData("US: Warrior of Sunlight", "Warrior of Sunlight", DS3LocationCategory.MISC), + DS3LocationData("US: Blessed Red and White Shield+1", "Blessed Red and White Shield+1", DS3LocationCategory.SHIELD), + DS3LocationData("US: Irina's Ashes", "Irina's Ashes", DS3LocationCategory.NPC), + DS3LocationData("US: Cornyx's Ashes", "Cornyx's Ashes", DS3LocationCategory.NPC), + DS3LocationData("US: Cornyx's Wrap", "Cornyx's Wrap", DS3LocationCategory.NPC), + DS3LocationData("US: Cornyx's Garb", "Cornyx's Garb", DS3LocationCategory.NPC), + DS3LocationData("US: Cornyx's Skirt", "Cornyx's Skirt", DS3LocationCategory.NPC), + DS3LocationData("US: Pyromancy Flame", "Pyromancy Flame", DS3LocationCategory.NPC), + DS3LocationData("US: Transposing Kiln", "Transposing Kiln", DS3LocationCategory.MISC), + DS3LocationData("US: Tower Key", "Tower Key", DS3LocationCategory.NPC), + ], + "Road of Sacrifices": [ + DS3LocationData("RS: Brigand Twindaggers", "Brigand Twindaggers", DS3LocationCategory.WEAPON), + DS3LocationData("RS: Brigand Hood", "Brigand Hood", DS3LocationCategory.ARMOR), + DS3LocationData("RS: Brigand Armor", "Brigand Armor", DS3LocationCategory.ARMOR), + DS3LocationData("RS: Brigand Gauntlets", "Brigand Gauntlets", DS3LocationCategory.ARMOR), + DS3LocationData("RS: Brigand Trousers", "Brigand Trousers", DS3LocationCategory.ARMOR), + DS3LocationData("RS: Butcher Knife", "Butcher Knife", DS3LocationCategory.WEAPON), + DS3LocationData("RS: Brigand Axe", "Brigand Axe", DS3LocationCategory.WEAPON), + DS3LocationData("RS: Braille Divine Tome of Carim", "Braille Divine Tome of Carim", DS3LocationCategory.MISC), + DS3LocationData("RS: Morne's Ring", "Morne's Ring", DS3LocationCategory.RING), + DS3LocationData("RS: Twin Dragon Greatshield", "Twin Dragon Greatshield", DS3LocationCategory.SHIELD), + DS3LocationData("RS: Heretic's Staff", "Heretic's Staff", DS3LocationCategory.WEAPON), + DS3LocationData("RS: Sorcerer Hood", "Sorcerer Hood", DS3LocationCategory.ARMOR), + DS3LocationData("RS: Sorcerer Robe", "Sorcerer Robe", DS3LocationCategory.ARMOR), + DS3LocationData("RS: Sorcerer Gloves", "Sorcerer Gloves", DS3LocationCategory.ARMOR), + DS3LocationData("RS: Sorcerer Trousers", "Sorcerer Trousers", DS3LocationCategory.ARMOR), + DS3LocationData("RS: Sage Ring", "Sage Ring", DS3LocationCategory.RING), + DS3LocationData("RS: Fallen Knight Helm", "Fallen Knight Helm", DS3LocationCategory.ARMOR), + DS3LocationData("RS: Fallen Knight Armor", "Fallen Knight Armor", DS3LocationCategory.ARMOR), + DS3LocationData("RS: Fallen Knight Gauntlets", "Fallen Knight Gauntlets", DS3LocationCategory.ARMOR), + DS3LocationData("RS: Fallen Knight Trousers", "Fallen Knight Trousers", DS3LocationCategory.ARMOR), + DS3LocationData("RS: Conjurator Hood", "Conjurator Hood", DS3LocationCategory.ARMOR), + DS3LocationData("RS: Conjurator Robe", "Conjurator Robe", DS3LocationCategory.ARMOR), + DS3LocationData("RS: Conjurator Manchettes", "Conjurator Manchettes", DS3LocationCategory.ARMOR), + DS3LocationData("RS: Conjurator Boots", "Conjurator Boots", DS3LocationCategory.ARMOR), + DS3LocationData("RS: Great Swamp Pyromancy Tome", "Great Swamp Pyromancy Tome", DS3LocationCategory.MISC), + DS3LocationData("RS: Great Club", "Great Club", DS3LocationCategory.WEAPON), + DS3LocationData("RS: Exile Greatsword", "Exile Greatsword", DS3LocationCategory.WEAPON), + DS3LocationData("RS: Farron Coal", "Farron Coal", DS3LocationCategory.MISC), + DS3LocationData("RS: Sellsword Twinblades", "Sellsword Twinblades", DS3LocationCategory.WEAPON), + DS3LocationData("RS: Sellsword Helm", "Sellsword Helm", DS3LocationCategory.ARMOR), + DS3LocationData("RS: Sellsword Armor", "Sellsword Armor", DS3LocationCategory.ARMOR), + DS3LocationData("RS: Sellsword Gauntlet", "Sellsword Gauntlet", DS3LocationCategory.ARMOR), + DS3LocationData("RS: Sellsword Trousers", "Sellsword Trousers", DS3LocationCategory.ARMOR), + DS3LocationData("RS: Golden Falcon Shield", "Golden Falcon Shield", DS3LocationCategory.SHIELD), + DS3LocationData("RS: Herald Helm", "Herald Helm", DS3LocationCategory.ARMOR), + DS3LocationData("RS: Herald Armor", "Herald Armor", DS3LocationCategory.ARMOR), + DS3LocationData("RS: Herald Gloves", "Herald Gloves", DS3LocationCategory.ARMOR), + DS3LocationData("RS: Herald Trousers", "Herald Trousers", DS3LocationCategory.ARMOR), + DS3LocationData("RS: Grass Crest Shield", "Grass Crest Shield", DS3LocationCategory.SHIELD), + DS3LocationData("RS: Soul of a Crystal Sage", "Soul of a Crystal Sage", DS3LocationCategory.BOSS), + DS3LocationData("RS: Great Swamp Ring", "Great Swamp Ring", DS3LocationCategory.RING), + DS3LocationData("RS: Orbeck's Ashes", "Orbeck's Ashes", DS3LocationCategory.NPC), + ], + "Cathedral of the Deep": [ + DS3LocationData("CD: Paladin's Ashes", "Paladin's Ashes", DS3LocationCategory.MISC), + DS3LocationData("CD: Spider Shield", "Spider Shield", DS3LocationCategory.SHIELD), + DS3LocationData("CD: Crest Shield", "Crest Shield", DS3LocationCategory.SHIELD), + DS3LocationData("CD: Notched Whip", "Notched Whip", DS3LocationCategory.WEAPON), + DS3LocationData("CD: Astora Greatsword", "Astora Greatsword", DS3LocationCategory.WEAPON), + DS3LocationData("CD: Executioner's Greatsword", "Executioner's Greatsword", DS3LocationCategory.WEAPON), + DS3LocationData("CD: Curse Ward Greatshield", "Curse Ward Greatshield", DS3LocationCategory.SHIELD), + DS3LocationData("CD: Saint-tree Bellvine", "Saint-tree Bellvine", DS3LocationCategory.WEAPON), + DS3LocationData("CD: Poisonbite Ring", "Poisonbite Ring", DS3LocationCategory.RING), + DS3LocationData("CD: Lloyd's Sword Ring", "Lloyd's Sword Ring", DS3LocationCategory.RING), + DS3LocationData("CD: Seek Guidance", "Seek Guidance", DS3LocationCategory.SPELL), + DS3LocationData("CD: Aldrich's Sapphire", "Aldrich's Sapphire", DS3LocationCategory.RING), + DS3LocationData("CD: Deep Braille Divine Tome", "Deep Braille Divine Tome", DS3LocationCategory.MISC), + DS3LocationData("CD: Saint Bident", "Saint Bident", DS3LocationCategory.WEAPON), + DS3LocationData("CD: Maiden Hood", "Maiden Hood", DS3LocationCategory.ARMOR), + DS3LocationData("CD: Maiden Robe", "Maiden Robe", DS3LocationCategory.ARMOR), + DS3LocationData("CD: Maiden Gloves", "Maiden Gloves", DS3LocationCategory.ARMOR), + DS3LocationData("CD: Maiden Skirt", "Maiden Skirt", DS3LocationCategory.ARMOR), + DS3LocationData("CD: Drang Armor", "Drang Armor", DS3LocationCategory.ARMOR), + DS3LocationData("CD: Drang Gauntlets", "Drang Gauntlets", DS3LocationCategory.ARMOR), + DS3LocationData("CD: Drang Shoes", "Drang Shoes", DS3LocationCategory.ARMOR), + DS3LocationData("CD: Drang Hammers", "Drang Hammers", DS3LocationCategory.WEAPON), + DS3LocationData("CD: Deep Ring", "Deep Ring", DS3LocationCategory.RING), + DS3LocationData("CD: Archdeacon White Crown", "Archdeacon White Crown", DS3LocationCategory.ARMOR), + DS3LocationData("CD: Archdeacon Holy Garb", "Archdeacon Holy Garb", DS3LocationCategory.ARMOR), + DS3LocationData("CD: Archdeacon Skirt", "Archdeacon Skirt", DS3LocationCategory.ARMOR), + DS3LocationData("CD: Arbalest", "Arbalest", DS3LocationCategory.WEAPON), + DS3LocationData("CD: Small Doll", "Small Doll", DS3LocationCategory.KEY), + DS3LocationData("CD: Soul of the Deacons of the Deep", "Soul of the Deacons of the Deep", DS3LocationCategory.BOSS), + DS3LocationData("CD: Rosaria's Fingers", "Rosaria's Fingers", DS3LocationCategory.MISC) + ], + "Farron Keep": [ + DS3LocationData("FK: Ragged Mask", "Ragged Mask", DS3LocationCategory.ARMOR), + DS3LocationData("FK: Iron Flesh", "Iron Flesh", DS3LocationCategory.SPELL), + DS3LocationData("FK: Golden Scroll", "Golden Scroll", DS3LocationCategory.MISC), + DS3LocationData("FK: Antiquated Dress", "Antiquated Dress", DS3LocationCategory.ARMOR), + DS3LocationData("FK: Antiquated Gloves", "Antiquated Gloves", DS3LocationCategory.ARMOR), + DS3LocationData("FK: Antiquated Skirt", "Antiquated Skirt", DS3LocationCategory.ARMOR), + DS3LocationData("FK: Nameless Knight Helm", "Nameless Knight Helm", DS3LocationCategory.ARMOR), + DS3LocationData("FK: Nameless Knight Armor", "Nameless Knight Armor", DS3LocationCategory.ARMOR), + DS3LocationData("FK: Nameless Knight Gauntlets", "Nameless Knight Gauntlets", DS3LocationCategory.ARMOR), + DS3LocationData("FK: Nameless Knight Leggings", "Nameless Knight Leggings", DS3LocationCategory.ARMOR), + DS3LocationData("FK: Sunlight Talisman", "Sunlight Talisman", DS3LocationCategory.WEAPON), + DS3LocationData("FK: Wolf's Blood Swordgrass", "Wolf's Blood Swordgrass", DS3LocationCategory.MISC), + DS3LocationData("FK: Greatsword", "Greatsword", DS3LocationCategory.WEAPON), + DS3LocationData("FK: Sage's Coal", "Sage's Coal", DS3LocationCategory.MISC), + DS3LocationData("FK: Stone Parma", "Stone Parma", DS3LocationCategory.SHIELD), + DS3LocationData("FK: Sage's Scroll", "Sage's Scroll", DS3LocationCategory.MISC), + DS3LocationData("FK: Crown of Dusk", "Crown of Dusk", DS3LocationCategory.ARMOR), + DS3LocationData("FK: Lingering Dragoncrest Ring", "Lingering Dragoncrest Ring", DS3LocationCategory.RING), + DS3LocationData("FK: Pharis's Hat", "Pharis's Hat", DS3LocationCategory.ARMOR), + DS3LocationData("FK: Black Bow of Pharis", "Black Bow of Pharis", DS3LocationCategory.WEAPON), + DS3LocationData("FK: Dreamchaser's Ashes", "Dreamchaser's Ashes", DS3LocationCategory.MISC), + DS3LocationData("FK: Great Axe", "Great Axe", DS3LocationCategory.WEAPON), + DS3LocationData("FK: Dragon Crest Shield", "Dragon Crest Shield", DS3LocationCategory.SHIELD), + DS3LocationData("FK: Lightning Spear", "Lightning Spear", DS3LocationCategory.SPELL), + DS3LocationData("FK: Atonement", "Atonement", DS3LocationCategory.SPELL), + DS3LocationData("FK: Great Magic Weapon", "Great Magic Weapon", DS3LocationCategory.SPELL), + DS3LocationData("FK: Cinders of a Lord - Abyss Watcher", "Cinders of a Lord - Abyss Watcher", DS3LocationCategory.KEY), + DS3LocationData("FK: Soul of the Blood of the Wolf", "Soul of the Blood of the Wolf", DS3LocationCategory.BOSS), + DS3LocationData("FK: Soul of a Stray Demon", "Soul of a Stray Demon", DS3LocationCategory.BOSS), + DS3LocationData("FK: Watchdogs of Farron", "Watchdogs of Farron", DS3LocationCategory.MISC), + ], + "Catacombs of Carthus": [ + DS3LocationData("CC: Carthus Pyromancy Tome", "Carthus Pyromancy Tome", DS3LocationCategory.MISC), + DS3LocationData("CC: Carthus Milkring", "Carthus Milkring", DS3LocationCategory.RING), + DS3LocationData("CC: Grave Warden's Ashes", "Grave Warden's Ashes", DS3LocationCategory.MISC), + DS3LocationData("CC: Carthus Bloodring", "Carthus Bloodring", DS3LocationCategory.RING), + DS3LocationData("CC: Grave Warden Pyromancy Tome", "Grave Warden Pyromancy Tome", DS3LocationCategory.MISC), + DS3LocationData("CC: Old Sage's Blindfold", "Old Sage's Blindfold", DS3LocationCategory.ARMOR), + DS3LocationData("CC: Witch's Ring", "Witch's Ring", DS3LocationCategory.RING), + DS3LocationData("CC: Black Blade", "Black Blade", DS3LocationCategory.WEAPON), + DS3LocationData("CC: Soul of High Lord Wolnir", "Soul of High Lord Wolnir", DS3LocationCategory.BOSS), + DS3LocationData("CC: Soul of a Demon", "Soul of a Demon", DS3LocationCategory.BOSS), + ], + "Smouldering Lake": [ + DS3LocationData("SL: Shield of Want", "Shield of Want", DS3LocationCategory.SHIELD), + DS3LocationData("SL: Speckled Stoneplate Ring", "Speckled Stoneplate Ring", DS3LocationCategory.RING), + DS3LocationData("SL: Dragonrider Bow", "Dragonrider Bow", DS3LocationCategory.WEAPON), + DS3LocationData("SL: Lightning Stake", "Lightning Stake", DS3LocationCategory.SPELL), + DS3LocationData("SL: Izalith Pyromancy Tome", "Izalith Pyromancy Tome", DS3LocationCategory.MISC), + DS3LocationData("SL: Black Knight Sword", "Black Knight Sword", DS3LocationCategory.WEAPON), + DS3LocationData("SL: Quelana Pyromancy Tome", "Quelana Pyromancy Tome", DS3LocationCategory.MISC), + DS3LocationData("SL: Toxic Mist", "Toxic Mist", DS3LocationCategory.SPELL), + DS3LocationData("SL: White Hair Talisman", "White Hair Talisman", DS3LocationCategory.WEAPON), + DS3LocationData("SL: Izalith Staff", "Izalith Staff", DS3LocationCategory.WEAPON), + DS3LocationData("SL: Sacred Flame", "Sacred Flame", DS3LocationCategory.SPELL), + DS3LocationData("SL: Fume Ultra Greatsword", "Fume Ultra Greatsword", DS3LocationCategory.WEAPON), + DS3LocationData("SL: Black Iron Greatshield", "Black Iron Greatshield", DS3LocationCategory.SHIELD), + DS3LocationData("SL: Soul of the Old Demon King", "Soul of the Old Demon King", DS3LocationCategory.BOSS), + DS3LocationData("SL: Knight Slayer's Ring", "Knight Slayer's Ring", DS3LocationCategory.RING), + ], + "Irithyll of the Boreal Valley": [ + DS3LocationData("IBV: Dorhys' Gnawing", "Dorhys' Gnawing", DS3LocationCategory.SPELL), + DS3LocationData("IBV: Witchtree Branch", "Witchtree Branch", DS3LocationCategory.WEAPON), + DS3LocationData("IBV: Magic Clutch Ring", "Magic Clutch Ring", DS3LocationCategory.RING), + DS3LocationData("IBV: Ring of the Sun's First Born", "Ring of the Sun's First Born", DS3LocationCategory.RING), + DS3LocationData("IBV: Roster of Knights", "Roster of Knights", DS3LocationCategory.MISC), + DS3LocationData("IBV: Pontiff's Right Eye", "Pontiff's Right Eye", DS3LocationCategory.RING), + DS3LocationData("IBV: Yorshka's Spear", "Yorshka's Spear", DS3LocationCategory.WEAPON), + DS3LocationData("IBV: Great Heal", "Great Heal", DS3LocationCategory.SPELL), + DS3LocationData("IBV: Smough's Great Hammer", "Smough's Great Hammer", DS3LocationCategory.WEAPON), + DS3LocationData("IBV: Leo Ring", "Leo Ring", DS3LocationCategory.RING), + DS3LocationData("IBV: Excrement-covered Ashes", "Excrement-covered Ashes", DS3LocationCategory.MISC), + DS3LocationData("IBV: Dark Stoneplate Ring", "Dark Stoneplate Ring", DS3LocationCategory.RING), + DS3LocationData("IBV: Easterner's Ashes", "Easterner's Ashes", DS3LocationCategory.MISC), + DS3LocationData("IBV: Painting Guardian's Curved Sword", "Painting Guardian's Curved Sword", DS3LocationCategory.WEAPON), + DS3LocationData("IBV: Painting Guardian Hood", "Painting Guardian Hood", DS3LocationCategory.ARMOR), + DS3LocationData("IBV: Painting Guardian Gown", "Painting Guardian Gown", DS3LocationCategory.ARMOR), + DS3LocationData("IBV: Painting Guardian Gloves", "Painting Guardian Gloves", DS3LocationCategory.ARMOR), + DS3LocationData("IBV: Painting Guardian Waistcloth", "Painting Guardian Waistcloth", DS3LocationCategory.ARMOR), + DS3LocationData("IBV: Dragonslayer Greatbow", "Dragonslayer Greatbow", DS3LocationCategory.WEAPON), + DS3LocationData("IBV: Reversal Ring", "Reversal Ring", DS3LocationCategory.RING), + DS3LocationData("IBV: Brass Helm", "Brass Helm", DS3LocationCategory.ARMOR), + DS3LocationData("IBV: Brass Armor", "Brass Armor", DS3LocationCategory.ARMOR), + DS3LocationData("IBV: Brass Gauntlets", "Brass Gauntlets", DS3LocationCategory.ARMOR), + DS3LocationData("IBV: Brass Leggings", "Brass Leggings", DS3LocationCategory.ARMOR), + DS3LocationData("IBV: Ring of Favor", "Ring of Favor", DS3LocationCategory.RING), + DS3LocationData("IBV: Golden Ritual Spear", "Golden Ritual Spear", DS3LocationCategory.WEAPON), + DS3LocationData("IBV: Soul of Pontiff Sulyvahn", "Soul of Pontiff Sulyvahn", DS3LocationCategory.BOSS), + DS3LocationData("IBV: Aldrich Faithful", "Aldrich Faithful", DS3LocationCategory.MISC), + DS3LocationData("IBV: Drang Twinspears", "Drang Twinspears", DS3LocationCategory.WEAPON), + ], + "Irithyll Dungeon": [ + DS3LocationData("ID: Bellowing Dragoncrest Ring", "Bellowing Dragoncrest Ring", DS3LocationCategory.RING), + DS3LocationData("ID: Jailbreaker's Key", "Jailbreaker's Key", DS3LocationCategory.KEY), + DS3LocationData("ID: Prisoner Chief's Ashes", "Prisoner Chief's Ashes", DS3LocationCategory.KEY), + DS3LocationData("ID: Old Sorcerer Hat", "Old Sorcerer Hat", DS3LocationCategory.ARMOR), + DS3LocationData("ID: Old Sorcerer Coat", "Old Sorcerer Coat", DS3LocationCategory.ARMOR), + DS3LocationData("ID: Old Sorcerer Gauntlets", "Old Sorcerer Gauntlets", DS3LocationCategory.ARMOR), + DS3LocationData("ID: Old Sorcerer Boots", "Old Sorcerer Boots", DS3LocationCategory.ARMOR), + DS3LocationData("ID: Great Magic Shield", "Great Magic Shield", DS3LocationCategory.SPELL), + DS3LocationData("ID: Dragon Torso Stone", "Dragon Torso Stone", DS3LocationCategory.MISC), + DS3LocationData("ID: Lightning Blade", "Lightning Blade", DS3LocationCategory.SPELL), + DS3LocationData("ID: Profaned Coal", "Profaned Coal", DS3LocationCategory.MISC), + DS3LocationData("ID: Xanthous Ashes", "Xanthous Ashes", DS3LocationCategory.MISC), + DS3LocationData("ID: Old Cell Key", "Old Cell Key", DS3LocationCategory.KEY), + DS3LocationData("ID: Pickaxe", "Pickaxe", DS3LocationCategory.WEAPON), + DS3LocationData("ID: Profaned Flame", "Profaned Flame", DS3LocationCategory.SPELL), + DS3LocationData("ID: Covetous Gold Serpent Ring", "Covetous Gold Serpent Ring", DS3LocationCategory.RING), + DS3LocationData("ID: Jailer's Key Ring", "Jailer's Key Ring", DS3LocationCategory.KEY), + DS3LocationData("ID: Dusk Crown Ring", "Dusk Crown Ring", DS3LocationCategory.RING), + DS3LocationData("ID: Dark Clutch Ring", "Dark Clutch Ring", DS3LocationCategory.RING), + DS3LocationData("ID: Karla's Ashes", "Karla's Ashes", DS3LocationCategory.NPC), + DS3LocationData("ID: Karla's Pointed Hat", "Karla's Pointed Hat", DS3LocationCategory.NPC), + DS3LocationData("ID: Karla's Coat", "Karla's Coat", DS3LocationCategory.NPC), + DS3LocationData("ID: Karla's Gloves", "Karla's Gloves", DS3LocationCategory.NPC), + DS3LocationData("ID: Karla's Trousers", "Karla's Trousers", DS3LocationCategory.NPC), + ], + "Profaned Capital": [ + DS3LocationData("PC: Cursebite Ring", "Cursebite Ring", DS3LocationCategory.RING), + DS3LocationData("PC: Court Sorcerer Hood", "Court Sorcerer Hood", DS3LocationCategory.ARMOR), + DS3LocationData("PC: Court Sorcerer Robe", "Court Sorcerer Robe", DS3LocationCategory.ARMOR), + DS3LocationData("PC: Court Sorcerer Gloves", "Court Sorcerer Gloves", DS3LocationCategory.ARMOR), + DS3LocationData("PC: Court Sorcerer Trousers", "Court Sorcerer Trousers", DS3LocationCategory.ARMOR), + DS3LocationData("PC: Wrath of the Gods", "Wrath of the Gods", DS3LocationCategory.SPELL), + DS3LocationData("PC: Logan's Scroll", "Logan's Scroll", DS3LocationCategory.MISC), + DS3LocationData("PC: Eleonora", "Eleonora", DS3LocationCategory.WEAPON), + DS3LocationData("PC: Court Sorcerer's Staff", "Court Sorcerer's Staff", DS3LocationCategory.WEAPON), + DS3LocationData("PC: Greatshield of Glory", "Greatshield of Glory", DS3LocationCategory.SHIELD), + DS3LocationData("PC: Storm Ruler", "Storm Ruler", DS3LocationCategory.KEY), + DS3LocationData("PC: Cinders of a Lord - Yhorm the Giant", "Cinders of a Lord - Yhorm the Giant", DS3LocationCategory.KEY), + DS3LocationData("PC: Soul of Yhorm the Giant", "Soul of Yhorm the Giant", DS3LocationCategory.BOSS), + ], + "Anor Londo": [ + DS3LocationData("AL: Giant's Coal", "Giant's Coal", DS3LocationCategory.MISC), + DS3LocationData("AL: Sun Princess Ring", "Sun Princess Ring", DS3LocationCategory.RING), + DS3LocationData("AL: Aldrich's Ruby", "Aldrich's Ruby", DS3LocationCategory.RING), + DS3LocationData("AL: Cinders of a Lord - Aldrich", "Cinders of a Lord - Aldrich", DS3LocationCategory.KEY), + DS3LocationData("AL: Soul of Aldrich", "Soul of Aldrich", DS3LocationCategory.BOSS), + ], + "Lothric Castle": [ + DS3LocationData("LC: Hood of Prayer", "Hood of Prayer", DS3LocationCategory.ARMOR), + DS3LocationData("LC: Robe of Prayer", "Robe of Prayer", DS3LocationCategory.ARMOR), + DS3LocationData("LC: Skirt of Prayer", "Skirt of Prayer", DS3LocationCategory.ARMOR), + DS3LocationData("LC: Sacred Bloom Shield", "Sacred Bloom Shield", DS3LocationCategory.SHIELD), + DS3LocationData("LC: Winged Knight Helm", "Winged Knight Helm", DS3LocationCategory.ARMOR), + DS3LocationData("LC: Winged Knight Armor", "Winged Knight Armor", DS3LocationCategory.ARMOR), + DS3LocationData("LC: Winged Knight Gauntlets", "Winged Knight Gauntlets", DS3LocationCategory.ARMOR), + DS3LocationData("LC: Winged Knight Leggings", "Winged Knight Leggings", DS3LocationCategory.ARMOR), + DS3LocationData("LC: Greatlance", "Greatlance", DS3LocationCategory.WEAPON), + DS3LocationData("LC: Sniper Crossbow", "Sniper Crossbow", DS3LocationCategory.WEAPON), + DS3LocationData("LC: Spirit Tree Crest Shield", "Spirit Tree Crest Shield", DS3LocationCategory.SHIELD), + DS3LocationData("LC: Red Tearstone Ring", "Red Tearstone Ring", DS3LocationCategory.RING), + DS3LocationData("LC: Caitha's Chime", "Caitha's Chime", DS3LocationCategory.WEAPON), + DS3LocationData("LC: Braille Divine Tome of Lothric", "Braille Divine Tome of Lothric", DS3LocationCategory.MISC), + DS3LocationData("LC: Knight's Ring", "Knight's Ring", DS3LocationCategory.RING), + DS3LocationData("LC: Irithyll Rapier", "Irithyll Rapier", DS3LocationCategory.WEAPON), + DS3LocationData("LC: Sunlight Straight Sword", "Sunlight Straight Sword", DS3LocationCategory.WEAPON), + DS3LocationData("LC: Soul of Dragonslayer Armour", "Soul of Dragonslayer Armour", DS3LocationCategory.BOSS), + DS3LocationData("LC: Grand Archives Key", "Grand Archives Key", DS3LocationCategory.KEY), + DS3LocationData("LC: Gotthard Twinswords", "Gotthard Twinswords", DS3LocationCategory.WEAPON), + ], + "Consumed King's Garden": [ + DS3LocationData("CKG: Dragonscale Ring", "Dragonscale Ring", DS3LocationCategory.RING), + DS3LocationData("CKG: Shadow Mask", "Shadow Mask", DS3LocationCategory.ARMOR), + DS3LocationData("CKG: Shadow Garb", "Shadow Garb", DS3LocationCategory.ARMOR), + DS3LocationData("CKG: Shadow Gauntlets", "Shadow Gauntlets", DS3LocationCategory.ARMOR), + DS3LocationData("CKG: Shadow Leggings", "Shadow Leggings", DS3LocationCategory.ARMOR), + DS3LocationData("CKG: Claw", "Claw", DS3LocationCategory.WEAPON), + DS3LocationData("CKG: Soul of Consumed Oceiros", "Soul of Consumed Oceiros", DS3LocationCategory.BOSS), + DS3LocationData("CKG: Magic Stoneplate Ring", "Magic Stoneplate Ring", DS3LocationCategory.RING), + ], + "Grand Archives": [ + DS3LocationData("GA: Avelyn", "Avelyn", DS3LocationCategory.WEAPON), + DS3LocationData("GA: Witch's Locks", "Witch's Locks", DS3LocationCategory.WEAPON), + DS3LocationData("GA: Power Within", "Power Within", DS3LocationCategory.SPELL), + DS3LocationData("GA: Scholar Ring", "Scholar Ring", DS3LocationCategory.RING), + DS3LocationData("GA: Soul Stream", "Soul Stream", DS3LocationCategory.SPELL), + DS3LocationData("GA: Fleshbite Ring", "Fleshbite Ring", DS3LocationCategory.RING), + DS3LocationData("GA: Crystal Chime", "Crystal Chime", DS3LocationCategory.WEAPON), + DS3LocationData("GA: Golden Wing Crest Shield", "Golden Wing Crest Shield", DS3LocationCategory.SHIELD), + DS3LocationData("GA: Onikiri and Ubadachi", "Onikiri and Ubadachi", DS3LocationCategory.WEAPON), + DS3LocationData("GA: Hunter's Ring", "Hunter's Ring", DS3LocationCategory.RING), + DS3LocationData("GA: Divine Pillars of Light", "Divine Pillars of Light", DS3LocationCategory.SPELL), + DS3LocationData("GA: Cinders of a Lord - Lothric Prince", "Cinders of a Lord - Lothric Prince", DS3LocationCategory.KEY), + DS3LocationData("GA: Soul of the Twin Princes", "Soul of the Twin Princes", DS3LocationCategory.BOSS), + DS3LocationData("GA: Sage's Crystal Staff", "Sage's Crystal Staff", DS3LocationCategory.WEAPON), + DS3LocationData("GA: Outrider Knight Helm", "Outrider Knight Helm", DS3LocationCategory.ARMOR), + DS3LocationData("GA: Outrider Knight Armor", "Outrider Knight Armor", DS3LocationCategory.ARMOR), + DS3LocationData("GA: Outrider Knight Gauntlets", "Outrider Knight Gauntlets", DS3LocationCategory.ARMOR), + DS3LocationData("GA: Outrider Knight Leggings", "Outrider Knight Leggings", DS3LocationCategory.ARMOR), + DS3LocationData("GA: Crystal Scroll", "Crystal Scroll", DS3LocationCategory.MISC), + ], + "Untended Graves": [ + DS3LocationData("UG: Ashen Estus Ring", "Ashen Estus Ring", DS3LocationCategory.RING), + DS3LocationData("UG: Black Knight Glaive", "Black Knight Glaive", DS3LocationCategory.WEAPON), + DS3LocationData("UG: Hornet Ring", "Hornet Ring", DS3LocationCategory.RING), + DS3LocationData("UG: Chaos Blade", "Chaos Blade", DS3LocationCategory.WEAPON), + DS3LocationData("UG: Blacksmith Hammer", "Blacksmith Hammer", DS3LocationCategory.WEAPON), + DS3LocationData("UG: Eyes of a Fire Keeper", "Eyes of a Fire Keeper", DS3LocationCategory.KEY), + DS3LocationData("UG: Coiled Sword Fragment", "Coiled Sword Fragment", DS3LocationCategory.MISC), + DS3LocationData("UG: Soul of Champion Gundyr", "Soul of Champion Gundyr", DS3LocationCategory.BOSS), + ], + "Archdragon Peak": [ + DS3LocationData("AP: Lightning Clutch Ring", "Lightning Clutch Ring", DS3LocationCategory.RING), + DS3LocationData("AP: Ancient Dragon Greatshield", "Ancient Dragon Greatshield", DS3LocationCategory.SHIELD), + DS3LocationData("AP: Ring of Steel Protection", "Ring of Steel Protection", DS3LocationCategory.RING), + DS3LocationData("AP: Calamity Ring", "Calamity Ring", DS3LocationCategory.RING), + DS3LocationData("AP: Drakeblood Greatsword", "Drakeblood Greatsword", DS3LocationCategory.WEAPON), + DS3LocationData("AP: Dragonslayer Spear", "Dragonslayer Spear", DS3LocationCategory.WEAPON), + DS3LocationData("AP: Thunder Stoneplate Ring", "Thunder Stoneplate Ring", DS3LocationCategory.RING), + DS3LocationData("AP: Great Magic Barrier", "Great Magic Barrier", DS3LocationCategory.SPELL), + DS3LocationData("AP: Dragon Chaser's Ashes", "Dragon Chaser's Ashes", DS3LocationCategory.MISC), + DS3LocationData("AP: Twinkling Dragon Torso Stone", "Twinkling Dragon Torso Stone", DS3LocationCategory.MISC), + DS3LocationData("AP: Dragonslayer Helm", "Dragonslayer Helm", DS3LocationCategory.ARMOR), + DS3LocationData("AP: Dragonslayer Armor", "Dragonslayer Armor", DS3LocationCategory.ARMOR), + DS3LocationData("AP: Dragonslayer Gauntlets", "Dragonslayer Gauntlets", DS3LocationCategory.ARMOR), + DS3LocationData("AP: Dragonslayer Leggings", "Dragonslayer Leggings", DS3LocationCategory.ARMOR), + DS3LocationData("AP: Ricard's Rapier", "Ricard's Rapier", DS3LocationCategory.WEAPON), + DS3LocationData("AP: Soul of the Nameless King", "Soul of the Nameless King", DS3LocationCategory.BOSS), + DS3LocationData("AP: Dragon Tooth", "Dragon Tooth", DS3LocationCategory.WEAPON), + DS3LocationData("AP: Havel's Greatshield", "Havel's Greatshield", DS3LocationCategory.SHIELD), + ], + "Kiln of the First Flame": [], + + # DLC + "Painted World of Ariandel 1": [ + DS3LocationData("PW: Follower Javelin", "Follower Javelin", DS3LocationCategory.WEAPON), + DS3LocationData("PW: Frozen Weapon", "Frozen Weapon", DS3LocationCategory.SPELL), + DS3LocationData("PW: Millwood Greatbow", "Millwood Greatbow", DS3LocationCategory.WEAPON), + DS3LocationData("PW: Captain's Ashes", "Captain's Ashes", DS3LocationCategory.MISC), + DS3LocationData("PW: Millwood Battle Axe", "Millwood Battle Axe", DS3LocationCategory.WEAPON), + DS3LocationData("PW: Ethereal Oak Shield", "Ethereal Oak Shield", DS3LocationCategory.SHIELD), + DS3LocationData("PW: Crow Quills", "Crow Quills", DS3LocationCategory.WEAPON), + DS3LocationData("PW: Slave Knight Hood", "Slave Knight Hood", DS3LocationCategory.ARMOR), + DS3LocationData("PW: Slave Knight Armor", "Slave Knight Armor", DS3LocationCategory.ARMOR), + DS3LocationData("PW: Slave Knight Gauntlets", "Slave Knight Gauntlets", DS3LocationCategory.ARMOR), + DS3LocationData("PW: Slave Knight Leggings", "Slave Knight Leggings", DS3LocationCategory.ARMOR), + DS3LocationData("PW: Way of White Corona", "Way of White Corona", DS3LocationCategory.SPELL), + DS3LocationData("PW: Crow Talons", "Crow Talons", DS3LocationCategory.WEAPON), + DS3LocationData("PW: Onyx Blade", "Onyx Blade", DS3LocationCategory.WEAPON), + DS3LocationData("PW: Contraption Key", "Contraption Key", DS3LocationCategory.KEY), + ], + "Painted World of Ariandel 2": [ + DS3LocationData("PW: Quakestone Hammer", "Quakestone Hammer", DS3LocationCategory.WEAPON), + DS3LocationData("PW: Earth Seeker", "Earth Seeker", DS3LocationCategory.WEAPON), + DS3LocationData("PW: Follower Torch", "Follower Torch", DS3LocationCategory.SHIELD), + DS3LocationData("PW: Follower Shield", "Follower Shield", DS3LocationCategory.SHIELD), + DS3LocationData("PW: Follower Sabre", "Follower Sabre", DS3LocationCategory.WEAPON), + DS3LocationData("PW: Snap Freeze", "Snap Freeze", DS3LocationCategory.SPELL), + DS3LocationData("PW: Floating Chaos", "Floating Chaos", DS3LocationCategory.SPELL), + DS3LocationData("PW: Pyromancer's Parting Flame", "Pyromancer's Parting Flame", DS3LocationCategory.WEAPON), + DS3LocationData("PW: Vilhelm's Helm", "Vilhelm's Helm", DS3LocationCategory.ARMOR), + DS3LocationData("PW: Vilhelm's Armor", "Vilhelm's Armor", DS3LocationCategory.ARMOR), + DS3LocationData("PW: Vilhelm's Gauntlets", "Vilhelm's Gauntlets", DS3LocationCategory.ARMOR), + DS3LocationData("PW: Vilhelm's Leggings", "Vilhelm's Leggings", DS3LocationCategory.ARMOR), + DS3LocationData("PW: Valorheart", "Valorheart", DS3LocationCategory.WEAPON), + DS3LocationData("PW: Champion's Bones", "Champion's Bones", DS3LocationCategory.MISC), + DS3LocationData("PW: Soul of Sister Friede", "Soul of Sister Friede", DS3LocationCategory.BOSS), + DS3LocationData("PW: Chillbite Ring", "Chillbite Ring", DS3LocationCategory.RING), + ], + "Dreg Heap": [ + DS3LocationData("DH: Loincloth", "Loincloth", DS3LocationCategory.ARMOR), + DS3LocationData("DH: Aquamarine Dagger", "Aquamarine Dagger", DS3LocationCategory.WEAPON), + DS3LocationData("DH: Murky Hand Scythe", "Murky Hand Scythe", DS3LocationCategory.WEAPON), + DS3LocationData("DH: Murky Longstaff", "Murky Longstaff", DS3LocationCategory.WEAPON), + DS3LocationData("DH: Great Soul Dregs", "Great Soul Dregs", DS3LocationCategory.SPELL), + DS3LocationData("DH: Lothric War Banner", "Lothric War Banner", DS3LocationCategory.WEAPON), + DS3LocationData("DH: Projected Heal", "Projected Heal", DS3LocationCategory.SPELL), + DS3LocationData("DH: Desert Pyromancer Hood", "Desert Pyromancer Hood", DS3LocationCategory.ARMOR), + DS3LocationData("DH: Desert Pyromancer Garb", "Desert Pyromancer Garb", DS3LocationCategory.ARMOR), + DS3LocationData("DH: Desert Pyromancer Gloves", "Desert Pyromancer Gloves", DS3LocationCategory.ARMOR), + DS3LocationData("DH: Desert Pyromancer Skirt", "Desert Pyromancer Skirt", DS3LocationCategory.ARMOR), + DS3LocationData("DH: Giant Door Shield", "Giant Door Shield", DS3LocationCategory.SHIELD), + DS3LocationData("DH: Herald Curved Greatsword", "Herald Curved Greatsword", DS3LocationCategory.WEAPON), + DS3LocationData("DH: Flame Fan", "Flame Fan", DS3LocationCategory.SPELL), + DS3LocationData("DH: Soul of the Demon Prince", "Soul of the Demon Prince", DS3LocationCategory.BOSS), + DS3LocationData("DH: Small Envoy Banner", "Small Envoy Banner", DS3LocationCategory.KEY), + DS3LocationData("DH: Ring of Favor+3", "Ring of Favor+3", DS3LocationCategory.RING), + DS3LocationData("DH: Covetous Silver Serpent Ring+3", "Covetous Silver Serpent Ring+3", DS3LocationCategory.RING), + ], + "Ringed City": [ + DS3LocationData("RC: Ruin Sentinel Helm", "Ruin Sentinel Helm", DS3LocationCategory.ARMOR), + DS3LocationData("RC: Ruin Sentinel Armor", "Ruin Sentinel Armor", DS3LocationCategory.ARMOR), + DS3LocationData("RC: Ruin Sentinel Gauntlets", "Ruin Sentinel Gauntlets", DS3LocationCategory.ARMOR), + DS3LocationData("RC: Ruin Sentinel Leggings", "Ruin Sentinel Leggings", DS3LocationCategory.ARMOR), + DS3LocationData("RC: Black Witch Veil", "Black Witch Veil", DS3LocationCategory.ARMOR), + DS3LocationData("RC: Black Witch Hat", "Black Witch Hat", DS3LocationCategory.ARMOR), + DS3LocationData("RC: Black Witch Garb", "Black Witch Garb", DS3LocationCategory.ARMOR), + DS3LocationData("RC: Black Witch Wrappings", "Black Witch Wrappings", DS3LocationCategory.ARMOR), + DS3LocationData("RC: Black Witch Trousers", "Black Witch Trousers", DS3LocationCategory.ARMOR), + DS3LocationData("RC: White Preacher Head", "White Preacher Head", DS3LocationCategory.ARMOR), + DS3LocationData("RC: Havel's Ring+3", "Havel's Ring+3", DS3LocationCategory.RING), + DS3LocationData("RC: Ringed Knight Spear", "Ringed Knight Spear", DS3LocationCategory.WEAPON), + DS3LocationData("RC: Dragonhead Shield", "Dragonhead Shield", DS3LocationCategory.SHIELD), + DS3LocationData("RC: Ringed Knight Straight Sword", "Ringed Knight Straight Sword", DS3LocationCategory.WEAPON), + DS3LocationData("RC: Preacher's Right Arm", "Preacher's Right Arm", DS3LocationCategory.WEAPON), + DS3LocationData("RC: White Birch Bow", "White Birch Bow", DS3LocationCategory.WEAPON), + DS3LocationData("RC: Church Guardian Shiv", "Church Guardian Shiv", DS3LocationCategory.MISC), + DS3LocationData("RC: Dragonhead Greatshield", "Dragonhead Greatshield", DS3LocationCategory.SHIELD), + DS3LocationData("RC: Ringed Knight Paired Greatswords", "Ringed Knight Paired Greatswords", DS3LocationCategory.WEAPON), + DS3LocationData("RC: Shira's Crown", "Shira's Crown", DS3LocationCategory.ARMOR), + DS3LocationData("RC: Shira's Armor", "Shira's Armor", DS3LocationCategory.ARMOR), + DS3LocationData("RC: Shira's Gloves", "Shira's Gloves", DS3LocationCategory.ARMOR), + DS3LocationData("RC: Shira's Trousers", "Shira's Trousers", DS3LocationCategory.ARMOR), + DS3LocationData("RC: Crucifix of the Mad King", "Crucifix of the Mad King", DS3LocationCategory.WEAPON), + DS3LocationData("RC: Sacred Chime of Filianore", "Sacred Chime of Filianore", DS3LocationCategory.WEAPON), + DS3LocationData("RC: Iron Dragonslayer Helm", "Iron Dragonslayer Helm", DS3LocationCategory.ARMOR), + DS3LocationData("RC: Iron Dragonslayer Armor", "Iron Dragonslayer Armor", DS3LocationCategory.ARMOR), + DS3LocationData("RC: Iron Dragonslayer Gauntlets", "Iron Dragonslayer Gauntlets", DS3LocationCategory.ARMOR), + DS3LocationData("RC: Iron Dragonslayer Leggings", "Iron Dragonslayer Leggings", DS3LocationCategory.ARMOR), + DS3LocationData("RC: Lightning Arrow", "Lightning Arrow", DS3LocationCategory.SPELL), + DS3LocationData("RC: Ritual Spear Fragment", "Ritual Spear Fragment", DS3LocationCategory.MISC), + DS3LocationData("RC: Antiquated Plain Garb", "Antiquated Plain Garb", DS3LocationCategory.ARMOR), + DS3LocationData("RC: Violet Wrappings", "Violet Wrappings", DS3LocationCategory.ARMOR), + DS3LocationData("RC: Soul of Darkeater Midir", "Soul of Darkeater Midir", DS3LocationCategory.BOSS), + DS3LocationData("RC: Soul of Slave Knight Gael", "Soul of Slave Knight Gael", DS3LocationCategory.BOSS), + DS3LocationData("RC: Blood of the Dark Soul", "Blood of the Dark Soul", DS3LocationCategory.KEY), + DS3LocationData("RC: Chloranthy Ring+3", "Chloranthy Ring+3", DS3LocationCategory.RING), + DS3LocationData("RC: Ring of Steel Protection+3", "Ring of Steel Protection+3", DS3LocationCategory.RING), + DS3LocationData("RC: Covetous Gold Serpent Ring+3", "Covetous Gold Serpent Ring+3", DS3LocationCategory.RING), + DS3LocationData("RC: Ring of the Evil Eye+3", "Ring of the Evil Eye+3", DS3LocationCategory.RING), + DS3LocationData("RC: Wolf Ring+3", "Wolf Ring+3", DS3LocationCategory.RING), + ], + + # Progressive + "Progressive Items 1": [] + + # Upgrade materials + [DS3LocationData(f"Titanite Shard #{i + 1}", "Titanite Shard", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(26)] + + [DS3LocationData(f"Large Titanite Shard #{i + 1}", "Large Titanite Shard", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(28)] + + [DS3LocationData(f"Titanite Slab #{i + 1}", "Titanite Slab", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(3)] + + [DS3LocationData(f"Twinkling Titanite #{i + 1}", "Twinkling Titanite", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(15)] + + + # Healing + [DS3LocationData(f"Estus Shard #{i + 1}", "Estus Shard", DS3LocationCategory.HEALTH) for i in range(11)] + + [DS3LocationData(f"Undead Bone Shard #{i + 1}", "Undead Bone Shard", DS3LocationCategory.HEALTH) for i in range(10)], + + "Progressive Items 2": [] + + # Items + [DS3LocationData(f"Green Blossom #{i + 1}", "Green Blossom", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(6)] + + [DS3LocationData(f"Firebomb #{i + 1}", "Firebomb", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(4)] + + [DS3LocationData(f"Alluring Skull #{i + 1}", "Alluring Skull", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(3)] + + [DS3LocationData(f"Undead Hunter Charm #{i + 1}", "Undead Hunter Charm", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(2)] + + [DS3LocationData(f"Duel Charm #{i + 1}", "Duel Charm", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(2)] + + [DS3LocationData(f"Throwing Knife #{i + 1}", "Throwing Knife", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(2)] + + [DS3LocationData(f"Gold Pine Resin #{i + 1}", "Gold Pine Resin", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(1)] + + [DS3LocationData(f"Charcoal Pine Resin #{i + 1}", "Charcoal Pine Resin", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(1)] + + [DS3LocationData(f"Human Pine Resin #{i + 1}", "Human Pine Resin", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(2)] + + [DS3LocationData(f"Carthus Rouge #{i + 1}", "Carthus Rouge", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(1)] + + [DS3LocationData(f"Pale Pine Resin #{i + 1}", "Pale Pine Resin", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(1)] + + [DS3LocationData(f"Charcoal Pine Bundle #{i + 1}", "Charcoal Pine Bundle", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(2)] + + [DS3LocationData(f"Rotten Pine Resin #{i + 1}", "Rotten Pine Resin", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(2)] + + [DS3LocationData(f"Homeward Bone #{i + 1}", "Homeward Bone", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(16)] + + [DS3LocationData(f"Pale Tongue #{i + 1}", "Pale Tongue", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(3)] + + [DS3LocationData(f"Rusted Coin #{i + 1}", "Rusted Coin", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(2)] + + [DS3LocationData(f"Rusted Gold Coin #{i + 1}", "Rusted Gold Coin", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(3)] + + [DS3LocationData(f"Ember #{i + 1}", "Ember", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(45)], + + "Progressive Items 3": [] + + # Souls & Bulk Upgrade Materials + [DS3LocationData(f"Fading Soul #{i + 1}", "Fading Soul", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(5)] + + [DS3LocationData(f"Soul of a Deserted Corpse #{i + 1}", "Soul of a Deserted Corpse", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(5)] + + [DS3LocationData(f"Large Soul of a Deserted Corpse #{i + 1}", "Large Soul of a Deserted Corpse", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(5)] + + [DS3LocationData(f"Soul of an Unknown Traveler #{i + 1}", "Soul of an Unknown Traveler", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(5)] + + [DS3LocationData(f"Large Soul of an Unknown Traveler #{i + 1}", "Large Soul of an Unknown Traveler", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(5)] + + [DS3LocationData(f"Soul of a Nameless Soldier #{i + 1}", "Soul of a Nameless Soldier", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(4)] + + [DS3LocationData(f"Large Soul of a Nameless Soldier #{i + 1}", "Large Soul of a Nameless Soldier", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(4)] + + [DS3LocationData(f"Soul of a Weary Warrior #{i + 1}", "Soul of a Weary Warrior", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(6)] + + [DS3LocationData(f"Soul of a Crestfallen Knight #{i + 1}", "Soul of a Crestfallen Knight", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(2)] + + [DS3LocationData(f"Titanite Chunk #{i + 1}", "Titanite Chunk", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(22)] + + [DS3LocationData(f"Titanite Scale #{i + 1}", "Titanite Scale", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(29)], + + "Progressive Items 4": [] + + # Gems & Random Consumables + [DS3LocationData(f"Ring of Sacrifice #{i + 1}", "Ring of Sacrifice", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(4)] + + [DS3LocationData(f"Divine Blessing #{i + 1}", "Divine Blessing", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(2)] + + [DS3LocationData(f"Hidden Blessing #{i + 1}", "Hidden Blessing", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(1)] + + [DS3LocationData(f"Budding Green Blossom #{i + 1}", "Budding Green Blossom", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(5)] + + [DS3LocationData(f"Bloodred Moss Clump #{i + 1}", "Bloodred Moss Clump", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(1)] + + [DS3LocationData(f"Purple Moss Clump #{i + 1}", "Purple Moss Clump", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(3)] + + [DS3LocationData(f"Blooming Purple Moss Clump #{i + 1}", "Blooming Purple Moss Clump", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(1)] + + [DS3LocationData(f"Purging Stone #{i + 1}", "Purging Stone", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(2)] + + [DS3LocationData(f"Rime-blue Moss Clump #{i + 1}", "Rime-blue Moss Clump", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(2)] + + [DS3LocationData(f"Repair Powder #{i + 1}", "Repair Powder", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(3)] + + [DS3LocationData(f"Kukri #{i + 1}", "Kukri", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(2)] + + [DS3LocationData(f"Lightning Urn #{i + 1}", "Lightning Urn", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(3)] + + [DS3LocationData(f"Rubbish #{i + 1}", "Rubbish", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(1)] + + [DS3LocationData(f"Blue Bug Pellet #{i + 1}", "Blue Bug Pellet", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(3)] + + [DS3LocationData(f"Red Bug Pellet #{i + 1}", "Red Bug Pellet", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(3)] + + [DS3LocationData(f"Yellow Bug Pellet #{i + 1}", "Yellow Bug Pellet", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(3)] + + [DS3LocationData(f"Black Bug Pellet #{i + 1}", "Black Bug Pellet", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(3)] + + [DS3LocationData(f"Heavy Gem #{i + 1}", "Heavy Gem", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(3)] + + [DS3LocationData(f"Sharp Gem #{i + 1}", "Sharp Gem", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(3)] + + [DS3LocationData(f"Refined Gem #{i + 1}", "Refined Gem", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(3)] + + [DS3LocationData(f"Crystal Gem #{i + 1}", "Crystal Gem", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(3)] + + [DS3LocationData(f"Simple Gem #{i + 1}", "Simple Gem", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(2)] + + [DS3LocationData(f"Fire Gem #{i + 1}", "Fire Gem", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(2)] + + [DS3LocationData(f"Chaos Gem #{i + 1}", "Chaos Gem", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(2)] + + [DS3LocationData(f"Lightning Gem #{i + 1}", "Lightning Gem", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(2)] + + [DS3LocationData(f"Deep Gem #{i + 1}", "Deep Gem", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(2)] + + [DS3LocationData(f"Dark Gem #{i + 1}", "Dark Gem", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(2)] + + [DS3LocationData(f"Poison Gem #{i + 1}", "Poison Gem", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(2)] + + [DS3LocationData(f"Blood Gem #{i + 1}", "Blood Gem", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(1)] + + [DS3LocationData(f"Raw Gem #{i + 1}", "Raw Gem", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(2)] + + [DS3LocationData(f"Blessed Gem #{i + 1}", "Blessed Gem", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(3)] + + [DS3LocationData(f"Hollow Gem #{i + 1}", "Hollow Gem", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(2)] + + [DS3LocationData(f"Shriving Stone #{i + 1}", "Shriving Stone", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(3)], + + "Progressive Items DLC": [] + + # Upgrade materials + [DS3LocationData(f"Large Titanite Shard ${i + 1}", "Large Titanite Shard", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(3)] + + [DS3LocationData(f"Titanite Chunk ${i + 1}", "Titanite Chunk", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(15)] + + [DS3LocationData(f"Titanite Slab ${i + 1}", "Titanite Slab", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(2)] + + [DS3LocationData(f"Twinkling Titanite ${i + 1}", "Twinkling Titanite", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(5)] + + [DS3LocationData(f"Titanite Scale ${i + 1}", "Titanite Scale", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(11)] + + + + # Items + [DS3LocationData(f"Homeward Bone ${i + 1}", "Homeward Bone", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(6)] + + [DS3LocationData(f"Rusted Coin ${i + 1}", "Rusted Coin", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(3)] + + [DS3LocationData(f"Ember ${i + 1}", "Ember", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(10)] + + + # Souls + [DS3LocationData(f"Large Soul of an Unknown Traveler ${i + 1}", "Large Soul of an Unknown Traveler", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(9)] + + [DS3LocationData(f"Soul of a Weary Warrior ${i + 1}", "Soul of a Weary Warrior", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(5)] + + [DS3LocationData(f"Large Soul of a Weary Warrior ${i + 1}", "Large Soul of a Weary Warrior", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(6)] + + [DS3LocationData(f"Soul of a Crestfallen Knight ${i + 1}", "Soul of a Crestfallen Knight", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(6)] + + [DS3LocationData(f"Large Soul of a Crestfallen Knight ${i + 1}", "Large Soul of a Crestfallen Knight", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(3)] + + + # Gems + [DS3LocationData(f"Dark Gem ${i + 1}", "Dark Gem", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(2)] + + [DS3LocationData(f"Blood Gem ${i + 1}", "Blood Gem", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(1)] + + [DS3LocationData(f"Blessed Gem ${i + 1}", "Blessed Gem", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(2)] + + [DS3LocationData(f"Hollow Gem ${i + 1}", "Hollow Gem", DS3LocationCategory.PROGRESSIVE_ITEM) for i in range(2)] +} + +location_dictionary: Dict[str, DS3LocationData] = {} +for location_table in location_tables.values(): + location_dictionary.update({location_data.name: location_data for location_data in location_table}) diff --git a/worlds/dark_souls_3/Options.py b/worlds/dark_souls_3/Options.py index dc9510a7..d613e473 100644 --- a/worlds/dark_souls_3/Options.py +++ b/worlds/dark_souls_3/Options.py @@ -1,16 +1,91 @@ import typing -from Options import Toggle, Option, Range, Choice, DeathLink + +from Options import Toggle, DefaultOnToggle, Option, Range, Choice, ItemDict, DeathLink + + +class RandomizeWeaponLocations(DefaultOnToggle): + """Randomizes weapons (+76 locations)""" + display_name = "Randomize Weapon Locations" + + +class RandomizeShieldLocations(DefaultOnToggle): + """Randomizes shields (+24 locations)""" + display_name = "Randomize Shield Locations" + + +class RandomizeArmorLocations(DefaultOnToggle): + """Randomizes armor pieces (+97 locations)""" + display_name = "Randomize Armor Locations" + + +class RandomizeRingLocations(DefaultOnToggle): + """Randomizes rings (+49 locations)""" + display_name = "Randomize Ring Locations" + + +class RandomizeSpellLocations(DefaultOnToggle): + """Randomizes spells (+18 locations)""" + display_name = "Randomize Spell Locations" + + +class RandomizeKeyLocations(DefaultOnToggle): + """Randomizes items which unlock doors or bypass barriers""" + display_name = "Randomize Key Locations" + + +class RandomizeBossSoulLocations(DefaultOnToggle): + """Randomizes Boss Souls (+18 Locations)""" + display_name = "Randomize Boss Soul Locations" + + +class RandomizeNPCLocations(Toggle): + """Randomizes friendly NPC drops (meaning you will probably have to kill them) (+14 locations)""" + display_name = "Randomize NPC Locations" + + +class RandomizeMiscLocations(Toggle): + """Randomizes miscellaneous items (ashes, tomes, scrolls, etc.) to the pool. (+36 locations)""" + display_name = "Randomize Miscellaneous Locations" + + +class RandomizeHealthLocations(Toggle): + """Randomizes health upgrade items. (+21 locations)""" + display_name = "Randomize Health Upgrade Locations" + + +class RandomizeProgressiveLocationsOption(Toggle): + """Randomizes upgrade materials and consumables such as the titanite shards, firebombs, resin, etc... + + Instead of specific locations, these are progressive, so Titanite Shard #1 is the first titanite shard + you pick up, regardless of whether it's from an enemy drop late in the game or an item on the ground in the + first 5 minutes.""" + display_name = "Randomize Progressive Locations" + + +class PoolTypeOption(Choice): + """Changes which non-progression items you add to the pool + + Shuffle: Items are picked from the locations being randomized + Various: Items are picked from a list of all items in the game, but are the same type of item they replace""" + display_name = "Pool Type" + option_shuffle = 0 + option_various = 1 + + +class GuaranteedItemsOption(ItemDict): + """Guarantees that the specified items will be in the item pool""" + display_name = "Guaranteed Items" class AutoEquipOption(Toggle): """Automatically equips any received armor or left/right weapons.""" - display_name = "Auto-equip" + display_name = "Auto-Equip" class LockEquipOption(Toggle): """Lock the equipment slots so you cannot change your armor or your left/right weapons. Works great with the Auto-equip option.""" - display_name = "Lock Equipement Slots" + display_name = "Lock Equipment Slots" class NoWeaponRequirementsOption(Toggle): @@ -26,93 +101,124 @@ class NoSpellRequirementsOption(Toggle): class NoEquipLoadOption(Toggle): """Disable the equip load constraint from the game""" - display_name = "No Equip load" + display_name = "No Equip Load" -class RandomizeWeaponsLevelOption(Choice): +class RandomizeInfusionOption(Toggle): + """Enable this option to infuse a percentage of the pool of weapons and shields.""" + display_name = "Randomize Infusion" + + +class RandomizeInfusionPercentageOption(Range): + """The percentage of weapons/shields in the pool to be infused if Randomize Infusion is toggled""" + display_name = "Percentage of Infused Weapons" + range_start = 0 + range_end = 100 + default = 33 + + +class RandomizeWeaponLevelOption(Choice): """Enable this option to upgrade a percentage of the pool of weapons to a random value between the minimum and - maximum levels defined. - all: All weapons are eligible, both basic and epic - basic: Only weapons that can be upgraded to +10 - epic: Only weapons that can be upgraded to +5""" - display_name = "Randomize weapons level" + maximum levels defined. + + All: All weapons are eligible, both basic and epic + Basic: Only weapons that can be upgraded to +10 + Epic: Only weapons that can be upgraded to +5""" + display_name = "Randomize Weapon Level" option_none = 0 option_all = 1 option_basic = 2 option_epic = 3 -class RandomizeWeaponsLevelPercentageOption(Range): +class RandomizeWeaponLevelPercentageOption(Range): """The percentage of weapons in the pool to be upgraded if randomize weapons level is toggled""" - display_name = "Percentage of randomized weapons" - range_start = 1 + display_name = "Percentage of Randomized Weapons" + range_start = 0 range_end = 100 default = 33 class MinLevelsIn5WeaponPoolOption(Range): """The minimum upgraded value of a weapon in the pool of weapons that can only reach +5""" - display_name = "Minimum level of +5 weapons" - range_start = 1 + display_name = "Minimum Level of +5 Weapons" + range_start = 0 range_end = 5 default = 1 class MaxLevelsIn5WeaponPoolOption(Range): """The maximum upgraded value of a weapon in the pool of weapons that can only reach +5""" - display_name = "Maximum level of +5 weapons" - range_start = 1 + display_name = "Maximum Level of +5 Weapons" + range_start = 0 range_end = 5 default = 5 class MinLevelsIn10WeaponPoolOption(Range): """The minimum upgraded value of a weapon in the pool of weapons that can reach +10""" - display_name = "Minimum level of +10 weapons" - range_start = 1 + display_name = "Minimum Level of +10 Weapons" + range_start = 0 range_end = 10 default = 1 class MaxLevelsIn10WeaponPoolOption(Range): """The maximum upgraded value of a weapon in the pool of weapons that can reach +10""" - display_name = "Maximum level of +10 weapons" - range_start = 1 + display_name = "Maximum Level of +10 Weapons" + range_start = 0 range_end = 10 default = 10 class LateBasinOfVowsOption(Toggle): - """Force the Basin of Vows to be located as a reward of defeating Pontiff Sulyvahn. It permits to ease the - progression by preventing having to kill the Dancer of the Boreal Valley as the first boss""" + """This option makes it so the Basin of Vows is still randomized, but guarantees you that you wont have to venture into + Lothric Castle to find your Small Lothric Banner to get out of High Wall of Lothric. So you may find Basin of Vows early, + but you wont have to fight Dancer to find your Small Lothric Banner.""" display_name = "Late Basin of Vows" -class EnableProgressiveLocationsOption(Toggle): - """Randomize upgrade materials such as the titanite shards, the estus shards and the consumables""" - display_name = "Randomize materials, Estus shards and consumables (+196 checks/items)" +class LateDLCOption(Toggle): + """This option makes it so you are guaranteed to find your Small Doll without having to venture off into the DLC, + effectively putting anything in the DLC in logic after finding both Contraption Key and Small Doll, + and being able to get into Irithyll of the Boreal Valley.""" + display_name = "Late DLC" class EnableDLCOption(Toggle): """To use this option, you must own both the ASHES OF ARIANDEL and the RINGED CITY DLC""" - display_name = "Add the DLC Items and Locations to the pool (+81 checks/items)" + display_name = "Enable DLC" -dark_souls_options: typing.Dict[str, type(Option)] = { +dark_souls_options: typing.Dict[str, Option] = { + "enable_weapon_locations": RandomizeWeaponLocations, + "enable_shield_locations": RandomizeShieldLocations, + "enable_armor_locations": RandomizeArmorLocations, + "enable_ring_locations": RandomizeRingLocations, + "enable_spell_locations": RandomizeSpellLocations, + "enable_key_locations": RandomizeKeyLocations, + "enable_boss_locations": RandomizeBossSoulLocations, + "enable_npc_locations": RandomizeNPCLocations, + "enable_misc_locations": RandomizeMiscLocations, + "enable_health_upgrade_locations": RandomizeHealthLocations, + "enable_progressive_locations": RandomizeProgressiveLocationsOption, + "pool_type": PoolTypeOption, + "guaranteed_items": GuaranteedItemsOption, "auto_equip": AutoEquipOption, "lock_equip": LockEquipOption, "no_weapon_requirements": NoWeaponRequirementsOption, - "randomize_weapons_level": RandomizeWeaponsLevelOption, - "randomize_weapons_percentage": RandomizeWeaponsLevelPercentageOption, + "randomize_infusion": RandomizeInfusionOption, + "randomize_infusion_percentage": RandomizeInfusionPercentageOption, + "randomize_weapon_level": RandomizeWeaponLevelOption, + "randomize_weapon_level_percentage": RandomizeWeaponLevelPercentageOption, "min_levels_in_5": MinLevelsIn5WeaponPoolOption, "max_levels_in_5": MaxLevelsIn5WeaponPoolOption, "min_levels_in_10": MinLevelsIn10WeaponPoolOption, "max_levels_in_10": MaxLevelsIn10WeaponPoolOption, "late_basin_of_vows": LateBasinOfVowsOption, + "late_dlc": LateDLCOption, "no_spell_requirements": NoSpellRequirementsOption, "no_equip_load": NoEquipLoadOption, "death_link": DeathLink, - "enable_progressive_locations": EnableProgressiveLocationsOption, "enable_dlc": EnableDLCOption, } - diff --git a/worlds/dark_souls_3/__init__.py b/worlds/dark_souls_3/__init__.py index d08cd3ee..1f6a7a48 100644 --- a/worlds/dark_souls_3/__init__.py +++ b/worlds/dark_souls_3/__init__.py @@ -1,21 +1,15 @@ # world/dark_souls_3/__init__.py -from typing import Dict +from typing import Dict, Set, List -from .Items import DarkSouls3Item -from .Locations import DarkSouls3Location -from .Options import dark_souls_options -from .data.items_data import weapons_upgrade_5_table, weapons_upgrade_10_table, item_dictionary, key_items_list, \ - dlc_weapons_upgrade_5_table, dlc_weapons_upgrade_10_table -from .data.locations_data import location_dictionary, fire_link_shrine_table, \ - high_wall_of_lothric, \ - undead_settlement_table, road_of_sacrifice_table, consumed_king_garden_table, cathedral_of_the_deep_table, \ - farron_keep_table, catacombs_of_carthus_table, smouldering_lake_table, irithyll_of_the_boreal_valley_table, \ - irithyll_dungeon_table, profaned_capital_table, anor_londo_table, lothric_castle_table, grand_archives_table, \ - untended_graves_table, archdragon_peak_table, firelink_shrine_bell_tower_table, progressive_locations, \ - progressive_locations_2, progressive_locations_3, painted_world_table, dreg_heap_table, ringed_city_table, dlc_progressive_locations -from ..AutoWorld import World, WebWorld from BaseClasses import MultiWorld, Region, Item, Entrance, Tutorial, ItemClassification -from ..generic.Rules import set_rule, add_item_rule +from Options import Toggle + +from worlds.AutoWorld import World, WebWorld +from worlds.generic.Rules import set_rule, add_rule, add_item_rule + +from .Items import DarkSouls3Item, DS3ItemCategory, item_dictionary, key_item_names +from .Locations import DarkSouls3Location, DS3LocationCategory, location_tables, location_dictionary +from .Options import RandomizeWeaponLevelOption, PoolTypeOption, dark_souls_options class DarkSouls3Web(WebWorld): @@ -52,212 +46,394 @@ class DarkSouls3World(World): option_definitions = dark_souls_options topology_present: bool = True web = DarkSouls3Web() - data_version = 5 + data_version = 6 base_id = 100000 - required_client_version = (0, 3, 7) + enabled_location_categories: Set[DS3LocationCategory] + required_client_version = (0, 4, 2) item_name_to_id = DarkSouls3Item.get_name_to_id() location_name_to_id = DarkSouls3Location.get_name_to_id() - def __init__(self, world: MultiWorld, player: int): - super().__init__(world, player) + + def __init__(self, multiworld: MultiWorld, player: int): + super().__init__(multiworld, player) self.locked_items = [] self.locked_locations = [] self.main_path_locations = [] + self.enabled_location_categories = set() + + + def generate_early(self): + if self.multiworld.enable_weapon_locations[self.player] == Toggle.option_true: + self.enabled_location_categories.add(DS3LocationCategory.WEAPON) + if self.multiworld.enable_shield_locations[self.player] == Toggle.option_true: + self.enabled_location_categories.add(DS3LocationCategory.SHIELD) + if self.multiworld.enable_armor_locations[self.player] == Toggle.option_true: + self.enabled_location_categories.add(DS3LocationCategory.ARMOR) + if self.multiworld.enable_ring_locations[self.player] == Toggle.option_true: + self.enabled_location_categories.add(DS3LocationCategory.RING) + if self.multiworld.enable_spell_locations[self.player] == Toggle.option_true: + self.enabled_location_categories.add(DS3LocationCategory.SPELL) + if self.multiworld.enable_npc_locations[self.player] == Toggle.option_true: + self.enabled_location_categories.add(DS3LocationCategory.NPC) + if self.multiworld.enable_key_locations[self.player] == Toggle.option_true: + self.enabled_location_categories.add(DS3LocationCategory.KEY) + if self.multiworld.enable_boss_locations[self.player] == Toggle.option_true: + self.enabled_location_categories.add(DS3LocationCategory.BOSS) + if self.multiworld.enable_misc_locations[self.player] == Toggle.option_true: + self.enabled_location_categories.add(DS3LocationCategory.MISC) + if self.multiworld.enable_health_upgrade_locations[self.player] == Toggle.option_true: + self.enabled_location_categories.add(DS3LocationCategory.HEALTH) + if self.multiworld.enable_progressive_locations[self.player] == Toggle.option_true: + self.enabled_location_categories.add(DS3LocationCategory.PROGRESSIVE_ITEM) + + + def create_regions(self): + progressive_location_table = [] + if self.multiworld.enable_progressive_locations[self.player].value: + progressive_location_table = [] + \ + location_tables["Progressive Items 1"] + \ + location_tables["Progressive Items 2"] + \ + location_tables["Progressive Items 3"] + \ + location_tables["Progressive Items 4"] + + if self.multiworld.enable_dlc[self.player].value: + progressive_location_table += location_tables["Progressive Items DLC"] + + # Create Vanilla Regions + regions = {} + regions["Menu"] = self.create_region("Menu", progressive_location_table) + regions.update({region_name: self.create_region(region_name, location_tables[region_name]) for region_name in [ + "Firelink Shrine", + "Firelink Shrine Bell Tower", + "High Wall of Lothric", + "Undead Settlement", + "Road of Sacrifices", + "Cathedral of the Deep", + "Farron Keep", + "Catacombs of Carthus", + "Smouldering Lake", + "Irithyll of the Boreal Valley", + "Irithyll Dungeon", + "Profaned Capital", + "Anor Londo", + "Lothric Castle", + "Consumed King's Garden", + "Grand Archives", + "Untended Graves", + "Archdragon Peak", + "Kiln of the First Flame", + ]}) + + # Create DLC Regions + if self.multiworld.enable_dlc[self.player]: + regions.update({region_name: self.create_region(region_name, location_tables[region_name]) for region_name in [ + "Painted World of Ariandel 1", + "Painted World of Ariandel 2", + "Dreg Heap", + "Ringed City", + ]}) + + # Connect Regions + def create_connection(from_region: str, to_region: str): + connection = Entrance(self.player, f"Go To {to_region}", regions[from_region]) + regions[from_region].exits.append(connection) + connection.connect(regions[to_region]) + + regions["Menu"].exits.append(Entrance(self.player, "New Game", regions["Menu"])) + self.multiworld.get_entrance("New Game", self.player).connect(regions["Firelink Shrine"]) + + create_connection("Firelink Shrine", "High Wall of Lothric") + create_connection("Firelink Shrine", "Firelink Shrine Bell Tower") + create_connection("Firelink Shrine", "Kiln of the First Flame") + + create_connection("High Wall of Lothric", "Undead Settlement") + create_connection("High Wall of Lothric", "Lothric Castle") + + create_connection("Undead Settlement", "Road of Sacrifices") + + create_connection("Road of Sacrifices", "Cathedral of the Deep") + create_connection("Road of Sacrifices", "Farron Keep") + + create_connection("Farron Keep", "Catacombs of Carthus") + + create_connection("Catacombs of Carthus", "Irithyll of the Boreal Valley") + create_connection("Catacombs of Carthus", "Smouldering Lake") + + create_connection("Irithyll of the Boreal Valley", "Irithyll Dungeon") + create_connection("Irithyll of the Boreal Valley", "Anor Londo") + + create_connection("Irithyll Dungeon", "Archdragon Peak") + create_connection("Irithyll Dungeon", "Profaned Capital") + + create_connection("Lothric Castle", "Consumed King's Garden") + create_connection("Lothric Castle", "Grand Archives") + + create_connection("Consumed King's Garden", "Untended Graves") + + # Connect DLC Regions + if self.multiworld.enable_dlc[self.player]: + create_connection("Cathedral of the Deep", "Painted World of Ariandel 1") + create_connection("Painted World of Ariandel 1", "Painted World of Ariandel 2") + create_connection("Painted World of Ariandel 2", "Dreg Heap") + create_connection("Dreg Heap", "Ringed City") + + + # For each region, add the associated locations retrieved from the corresponding location_table + def create_region(self, region_name, location_table) -> Region: + new_region = Region(region_name, self.player, self.multiworld) + + for location in location_table: + if location.category in self.enabled_location_categories: + new_location = DarkSouls3Location( + self.player, + location.name, + location.category, + location.default_item, + self.location_name_to_id[location.name], + new_region + ) + else: + # Replace non-randomized progression items with events + event_item = self.create_item(location.default_item) + if event_item.classification != ItemClassification.progression: + continue + + new_location = DarkSouls3Location( + self.player, + location.name, + location.category, + location.default_item, + None, + new_region + ) + event_item.code = None + new_location.place_locked_item(event_item) + + if region_name == "Menu": + add_item_rule(new_location, lambda item: not item.advancement) + + new_region.locations.append(new_location) + + self.multiworld.regions.append(new_region) + return new_region + + + def create_items(self): + dlc_enabled = self.multiworld.enable_dlc[self.player] == Toggle.option_true + + itempool_by_category = {category: [] for category in self.enabled_location_categories} + + # Gather all default items on randomized locations + num_required_extra_items = 0 + for location in self.multiworld.get_locations(self.player): + if location.category in itempool_by_category: + if item_dictionary[location.default_item_name].category == DS3ItemCategory.SKIP: + num_required_extra_items += 1 + else: + itempool_by_category[location.category].append(location.default_item_name) + + # Replace each item category with a random sample of items of those types + if self.multiworld.pool_type[self.player] == PoolTypeOption.option_various: + def create_random_replacement_list(item_categories: Set[DS3ItemCategory], num_items: int): + candidates = [ + item.name for item + in item_dictionary.values() + if (item.category in item_categories and (not item.is_dlc or dlc_enabled)) + ] + return self.multiworld.random.sample(candidates, num_items) + + if DS3LocationCategory.WEAPON in self.enabled_location_categories: + itempool_by_category[DS3LocationCategory.WEAPON] = create_random_replacement_list( + { + DS3ItemCategory.WEAPON_UPGRADE_5, + DS3ItemCategory.WEAPON_UPGRADE_10, + DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE + }, + len(itempool_by_category[DS3LocationCategory.WEAPON]) + ) + if DS3LocationCategory.SHIELD in self.enabled_location_categories: + itempool_by_category[DS3LocationCategory.SHIELD] = create_random_replacement_list( + {DS3ItemCategory.SHIELD, DS3ItemCategory.SHIELD_INFUSIBLE}, + len(itempool_by_category[DS3LocationCategory.SHIELD]) + ) + if DS3LocationCategory.ARMOR in self.enabled_location_categories: + itempool_by_category[DS3LocationCategory.ARMOR] = create_random_replacement_list( + {DS3ItemCategory.ARMOR}, + len(itempool_by_category[DS3LocationCategory.ARMOR]) + ) + if DS3LocationCategory.RING in self.enabled_location_categories: + itempool_by_category[DS3LocationCategory.RING] = create_random_replacement_list( + {DS3ItemCategory.RING}, + len(itempool_by_category[DS3LocationCategory.RING]) + ) + if DS3LocationCategory.SPELL in self.enabled_location_categories: + itempool_by_category[DS3LocationCategory.SPELL] = create_random_replacement_list( + {DS3ItemCategory.SPELL}, + len(itempool_by_category[DS3LocationCategory.SPELL]) + ) + + itempool: List[DarkSouls3Item] = [] + for category in self.enabled_location_categories: + itempool += [self.create_item(name) for name in itempool_by_category[category]] + + # A list of items we can replace + removable_items = [item for item in itempool if item.classification != ItemClassification.progression] + + guaranteed_items = self.multiworld.guaranteed_items[self.player].value + for item_name in guaranteed_items: + # Break early just in case nothing is removable (if user is trying to guarantee more + # items than the pool can hold, for example) + if len(removable_items) == 0: + break + + num_existing_copies = len([item for item in itempool if item.name == item_name]) + for _ in range(guaranteed_items[item_name]): + if num_existing_copies > 0: + num_existing_copies -= 1 + continue + + if num_required_extra_items > 0: + # We can just add them instead of using "Soul of an Intrepid Hero" later + num_required_extra_items -= 1 + else: + if len(removable_items) == 0: + break + + # Try to construct a list of items with the same category that can be removed + # If none exist, just remove something at random + removable_shortlist = [ + item for item + in removable_items + if item_dictionary[item.name].category == item_dictionary[item_name].category + ] + if len(removable_shortlist) == 0: + removable_shortlist = removable_items + + removed_item = self.multiworld.random.choice(removable_shortlist) + removable_items.remove(removed_item) # To avoid trying to replace the same item twice + itempool.remove(removed_item) + + itempool.append(self.create_item(item_name)) + + # Extra filler items for locations containing SKIP items + itempool += [self.create_filler() for _ in range(num_required_extra_items)] + + # Add items to itempool + self.multiworld.itempool += itempool + def create_item(self, name: str) -> Item: + useful_categories = { + DS3ItemCategory.WEAPON_UPGRADE_5, + DS3ItemCategory.WEAPON_UPGRADE_10, + DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE, + DS3ItemCategory.SPELL, + } data = self.item_name_to_id[name] - if name in key_items_list: + if name in key_item_names: item_classification = ItemClassification.progression - elif name in weapons_upgrade_5_table or name in weapons_upgrade_10_table: + elif item_dictionary[name].category in useful_categories or name in {"Estus Shard", "Undead Bone Shard"}: item_classification = ItemClassification.useful else: item_classification = ItemClassification.filler return DarkSouls3Item(name, item_classification, data, self.player) - def create_regions(self): - if self.multiworld.enable_progressive_locations[self.player].value and self.multiworld.enable_dlc[self.player].value: - menu_region = self.create_region("Menu", {**progressive_locations, **progressive_locations_2, - **progressive_locations_3, **dlc_progressive_locations}) - elif self.multiworld.enable_progressive_locations[self.player].value: - menu_region = self.create_region("Menu", {**progressive_locations, **progressive_locations_2, - **progressive_locations_3}) - else: - menu_region = self.create_region("Menu", None) + def get_filler_item_name(self) -> str: + return "Soul of an Intrepid Hero" - # Create all Vanilla regions of Dark Souls III - firelink_shrine_region = self.create_region("Firelink Shrine", fire_link_shrine_table) - firelink_shrine_bell_tower_region = self.create_region("Firelink Shrine Bell Tower", - firelink_shrine_bell_tower_table) - high_wall_of_lothric_region = self.create_region("High Wall of Lothric", high_wall_of_lothric) - undead_settlement_region = self.create_region("Undead Settlement", undead_settlement_table) - road_of_sacrifices_region = self.create_region("Road of Sacrifices", road_of_sacrifice_table) - consumed_king_garden_region = self.create_region("Consumed King's Garden", consumed_king_garden_table) - cathedral_of_the_deep_region = self.create_region("Cathedral of the Deep", cathedral_of_the_deep_table) - farron_keep_region = self.create_region("Farron Keep", farron_keep_table) - catacombs_of_carthus_region = self.create_region("Catacombs of Carthus", catacombs_of_carthus_table) - smouldering_lake_region = self.create_region("Smouldering Lake", smouldering_lake_table) - irithyll_of_the_boreal_valley_region = self.create_region("Irithyll of the Boreal Valley", - irithyll_of_the_boreal_valley_table) - irithyll_dungeon_region = self.create_region("Irithyll Dungeon", irithyll_dungeon_table) - profaned_capital_region = self.create_region("Profaned Capital", profaned_capital_table) - anor_londo_region = self.create_region("Anor Londo", anor_londo_table) - lothric_castle_region = self.create_region("Lothric Castle", lothric_castle_table) - grand_archives_region = self.create_region("Grand Archives", grand_archives_table) - untended_graves_region = self.create_region("Untended Graves", untended_graves_table) - archdragon_peak_region = self.create_region("Archdragon Peak", archdragon_peak_table) - kiln_of_the_first_flame_region = self.create_region("Kiln Of The First Flame", None) - # DLC Down here - if self.multiworld.enable_dlc[self.player]: - painted_world_of_ariandel_region = self.create_region("Painted World of Ariandel", painted_world_table) - dreg_heap_region = self.create_region("Dreg Heap", dreg_heap_table) - ringed_city_region = self.create_region("Ringed City", ringed_city_table) - - # Create the entrance to connect those regions - menu_region.exits.append(Entrance(self.player, "New Game", menu_region)) - self.multiworld.get_entrance("New Game", self.player).connect(firelink_shrine_region) - firelink_shrine_region.exits.append(Entrance(self.player, "Goto High Wall of Lothric", - firelink_shrine_region)) - firelink_shrine_region.exits.append(Entrance(self.player, "Goto Kiln Of The First Flame", - firelink_shrine_region)) - firelink_shrine_region.exits.append(Entrance(self.player, "Goto Bell Tower", - firelink_shrine_region)) - self.multiworld.get_entrance("Goto High Wall of Lothric", self.player).connect(high_wall_of_lothric_region) - self.multiworld.get_entrance("Goto Kiln Of The First Flame", self.player).connect( - kiln_of_the_first_flame_region) - self.multiworld.get_entrance("Goto Bell Tower", self.player).connect(firelink_shrine_bell_tower_region) - high_wall_of_lothric_region.exits.append(Entrance(self.player, "Goto Undead Settlement", - high_wall_of_lothric_region)) - high_wall_of_lothric_region.exits.append(Entrance(self.player, "Goto Lothric Castle", - high_wall_of_lothric_region)) - self.multiworld.get_entrance("Goto Undead Settlement", self.player).connect(undead_settlement_region) - self.multiworld.get_entrance("Goto Lothric Castle", self.player).connect(lothric_castle_region) - undead_settlement_region.exits.append(Entrance(self.player, "Goto Road Of Sacrifices", - undead_settlement_region)) - self.multiworld.get_entrance("Goto Road Of Sacrifices", self.player).connect(road_of_sacrifices_region) - road_of_sacrifices_region.exits.append(Entrance(self.player, "Goto Cathedral", road_of_sacrifices_region)) - road_of_sacrifices_region.exits.append(Entrance(self.player, "Goto Farron keep", road_of_sacrifices_region)) - self.multiworld.get_entrance("Goto Cathedral", self.player).connect(cathedral_of_the_deep_region) - self.multiworld.get_entrance("Goto Farron keep", self.player).connect(farron_keep_region) - farron_keep_region.exits.append(Entrance(self.player, "Goto Carthus catacombs", farron_keep_region)) - self.multiworld.get_entrance("Goto Carthus catacombs", self.player).connect(catacombs_of_carthus_region) - catacombs_of_carthus_region.exits.append(Entrance(self.player, "Goto Irithyll of the boreal", - catacombs_of_carthus_region)) - catacombs_of_carthus_region.exits.append(Entrance(self.player, "Goto Smouldering Lake", - catacombs_of_carthus_region)) - self.multiworld.get_entrance("Goto Irithyll of the boreal", self.player). \ - connect(irithyll_of_the_boreal_valley_region) - self.multiworld.get_entrance("Goto Smouldering Lake", self.player).connect(smouldering_lake_region) - irithyll_of_the_boreal_valley_region.exits.append(Entrance(self.player, "Goto Irithyll dungeon", - irithyll_of_the_boreal_valley_region)) - irithyll_of_the_boreal_valley_region.exits.append(Entrance(self.player, "Goto Anor Londo", - irithyll_of_the_boreal_valley_region)) - self.multiworld.get_entrance("Goto Irithyll dungeon", self.player).connect(irithyll_dungeon_region) - self.multiworld.get_entrance("Goto Anor Londo", self.player).connect(anor_londo_region) - irithyll_dungeon_region.exits.append(Entrance(self.player, "Goto Archdragon peak", irithyll_dungeon_region)) - irithyll_dungeon_region.exits.append(Entrance(self.player, "Goto Profaned capital", irithyll_dungeon_region)) - self.multiworld.get_entrance("Goto Archdragon peak", self.player).connect(archdragon_peak_region) - self.multiworld.get_entrance("Goto Profaned capital", self.player).connect(profaned_capital_region) - lothric_castle_region.exits.append(Entrance(self.player, "Goto Consumed King Garden", lothric_castle_region)) - lothric_castle_region.exits.append(Entrance(self.player, "Goto Grand Archives", lothric_castle_region)) - self.multiworld.get_entrance("Goto Consumed King Garden", self.player).connect(consumed_king_garden_region) - self.multiworld.get_entrance("Goto Grand Archives", self.player).connect(grand_archives_region) - consumed_king_garden_region.exits.append(Entrance(self.player, "Goto Untended Graves", - consumed_king_garden_region)) - self.multiworld.get_entrance("Goto Untended Graves", self.player).connect(untended_graves_region) - # DLC Connectors Below - if self.multiworld.enable_dlc[self.player]: - cathedral_of_the_deep_region.exits.append(Entrance(self.player, "Goto Painted World of Ariandel", - cathedral_of_the_deep_region)) - self.multiworld.get_entrance("Goto Painted World of Ariandel", self.player).connect(painted_world_of_ariandel_region) - painted_world_of_ariandel_region.exits.append(Entrance(self.player, "Goto Dreg Heap", - painted_world_of_ariandel_region)) - self.multiworld.get_entrance("Goto Dreg Heap", self.player).connect(dreg_heap_region) - dreg_heap_region.exits.append(Entrance(self.player, "Goto Ringed City", dreg_heap_region)) - self.multiworld.get_entrance("Goto Ringed City", self.player).connect(ringed_city_region) - - # For each region, add the associated locations retrieved from the corresponding location_table - def create_region(self, region_name, location_table) -> Region: - new_region = Region(region_name, self.player, self.multiworld) - if location_table: - for name, address in location_table.items(): - location = DarkSouls3Location(self.player, name, self.location_name_to_id[name], new_region) - if region_name == "Menu": - add_item_rule(location, lambda item: not item.advancement) - new_region.locations.append(location) - self.multiworld.regions.append(new_region) - return new_region - - def create_items(self): - for name, address in self.item_name_to_id.items(): - # Specific items will be included in the item pool under certain conditions. See generate_basic - if name == "Basin of Vows": - continue - # Do not add progressive_items ( containing "#" ) to the itempool if the option is disabled - if (not self.multiworld.enable_progressive_locations[self.player]) and "#" in name: - continue - # Do not add DLC items if the option is disabled - if (not self.multiworld.enable_dlc[self.player]) and DarkSouls3Item.is_dlc_item(name): - continue - # Do not add DLC Progressives if both options are disabled - if ((not self.multiworld.enable_progressive_locations[self.player]) or (not self.multiworld.enable_dlc[self.player])) and DarkSouls3Item.is_dlc_progressive(name): - continue - self.multiworld.itempool += [self.create_item(name)] - - def generate_early(self): - pass def set_rules(self) -> None: - # Define the access rules to the entrances - set_rule(self.multiworld.get_entrance("Goto Bell Tower", self.player), - lambda state: state.has("Tower Key", self.player)) - set_rule(self.multiworld.get_entrance("Goto Undead Settlement", self.player), + set_rule(self.multiworld.get_entrance("Go To Undead Settlement", self.player), lambda state: state.has("Small Lothric Banner", self.player)) - set_rule(self.multiworld.get_entrance("Goto Lothric Castle", self.player), + set_rule(self.multiworld.get_entrance("Go To Lothric Castle", self.player), lambda state: state.has("Basin of Vows", self.player)) - set_rule(self.multiworld.get_entrance("Goto Irithyll of the boreal", self.player), + set_rule(self.multiworld.get_entrance("Go To Irithyll of the Boreal Valley", self.player), lambda state: state.has("Small Doll", self.player)) - set_rule(self.multiworld.get_entrance("Goto Archdragon peak", self.player), - lambda state: state.can_reach("CKG: Soul of Consumed Oceiros", "Location", self.player)) - set_rule(self.multiworld.get_entrance("Goto Profaned capital", self.player), - lambda state: state.has("Storm Ruler", self.player)) - set_rule(self.multiworld.get_entrance("Goto Grand Archives", self.player), + set_rule(self.multiworld.get_entrance("Go To Archdragon Peak", self.player), + lambda state: state.can_reach("Go To Untended Graves", "Entrance", self.player)) + set_rule(self.multiworld.get_entrance("Go To Grand Archives", self.player), lambda state: state.has("Grand Archives Key", self.player)) - set_rule(self.multiworld.get_entrance("Goto Kiln Of The First Flame", self.player), + set_rule(self.multiworld.get_entrance("Go To Kiln of the First Flame", self.player), lambda state: state.has("Cinders of a Lord - Abyss Watcher", self.player) and state.has("Cinders of a Lord - Yhorm the Giant", self.player) and state.has("Cinders of a Lord - Aldrich", self.player) and state.has("Cinders of a Lord - Lothric Prince", self.player)) + + if self.multiworld.late_basin_of_vows[self.player] == Toggle.option_true: + add_rule(self.multiworld.get_entrance("Go To Lothric Castle", self.player), + lambda state: state.has("Small Lothric Banner", self.player)) + # DLC Access Rules Below if self.multiworld.enable_dlc[self.player]: - set_rule(self.multiworld.get_entrance("Goto Painted World of Ariandel", self.player), - lambda state: state.has("Contraption Key", self.player)) - set_rule(self.multiworld.get_entrance("Goto Ringed City", self.player), + set_rule(self.multiworld.get_entrance("Go To Ringed City", self.player), lambda state: state.has("Small Envoy Banner", self.player)) + # If key items are randomized, must have contraption key to enter DLC + # If key items are not randomized, Contraption Key is guaranteed to be accessible before it is needed + if self.multiworld.enable_key_locations[self.player] == Toggle.option_true: + add_rule(self.multiworld.get_entrance("Go To Painted World of Ariandel 2", self.player), + lambda state: state.has("Contraption Key", self.player)) + + if self.multiworld.late_dlc[self.player] == Toggle.option_true: + add_rule(self.multiworld.get_entrance("Go To Painted World of Ariandel 2", self.player), + lambda state: state.has("Small Doll", self.player)) + # Define the access rules to some specific locations - set_rule(self.multiworld.get_location("HWL: Soul of the Dancer", self.player), - lambda state: state.has("Basin of Vows", self.player)) - set_rule(self.multiworld.get_location("HWL: Greirat's Ashes", self.player), - lambda state: state.has("Cell Key", self.player)) - set_rule(self.multiworld.get_location("HWL: Blue Tearstone Ring", self.player), - lambda state: state.has("Cell Key", self.player)) - set_rule(self.multiworld.get_location("ID: Bellowing Dragoncrest Ring", self.player), - lambda state: state.has("Jailbreaker's Key", self.player)) - set_rule(self.multiworld.get_location("ID: Prisoner Chief's Ashes", self.player), - lambda state: state.has("Jailer's Key Ring", self.player)) - set_rule(self.multiworld.get_location("ID: Covetous Gold Serpent Ring", self.player), - lambda state: state.has("Old Cell Key", self.player)) - set_rule(self.multiworld.get_location("ID: Karla's Ashes", self.player), - lambda state: state.has("Jailer's Key Ring", self.player)) - black_hand_gotthard_corpse_rule = lambda state: \ + set_rule(self.multiworld.get_location("PC: Cinders of a Lord - Yhorm the Giant", self.player), + lambda state: state.has("Storm Ruler", self.player)) + + if self.multiworld.enable_ring_locations[self.player] == Toggle.option_true: + set_rule(self.multiworld.get_location("ID: Bellowing Dragoncrest Ring", self.player), + lambda state: state.has("Jailbreaker's Key", self.player)) + set_rule(self.multiworld.get_location("ID: Covetous Gold Serpent Ring", self.player), + lambda state: state.has("Old Cell Key", self.player)) + set_rule(self.multiworld.get_location("UG: Hornet Ring", self.player), + lambda state: state.has("Small Lothric Banner", self.player)) + + if self.multiworld.enable_npc_locations[self.player] == Toggle.option_true: + set_rule(self.multiworld.get_location("HWL: Greirat's Ashes", self.player), + lambda state: state.has("Cell Key", self.player)) + set_rule(self.multiworld.get_location("HWL: Blue Tearstone Ring", self.player), + lambda state: state.has("Cell Key", self.player)) + set_rule(self.multiworld.get_location("ID: Karla's Ashes", self.player), + lambda state: state.has("Jailer's Key Ring", self.player)) + set_rule(self.multiworld.get_location("ID: Karla's Pointed Hat", self.player), + lambda state: state.has("Jailer's Key Ring", self.player)) + set_rule(self.multiworld.get_location("ID: Karla's Coat", self.player), + lambda state: state.has("Jailer's Key Ring", self.player)) + set_rule(self.multiworld.get_location("ID: Karla's Gloves", self.player), + lambda state: state.has("Jailer's Key Ring", self.player)) + set_rule(self.multiworld.get_location("ID: Karla's Trousers", self.player), + lambda state: state.has("Jailer's Key Ring", self.player)) + + if self.multiworld.enable_misc_locations[self.player] == Toggle.option_true: + set_rule(self.multiworld.get_location("ID: Prisoner Chief's Ashes", self.player), + lambda state: state.has("Jailer's Key Ring", self.player)) + + if self.multiworld.enable_boss_locations[self.player] == Toggle.option_true: + set_rule(self.multiworld.get_location("PC: Soul of Yhorm the Giant", self.player), + lambda state: state.has("Storm Ruler", self.player)) + set_rule(self.multiworld.get_location("HWL: Soul of the Dancer", self.player), + lambda state: state.has("Basin of Vows", self.player)) + + # Lump Soul of the Dancer in with LC for locations that should not be reachable + # before having access to US. (Prevents requiring getting Basin to fight Dancer to get SLB to go to US) + if self.multiworld.late_basin_of_vows[self.player] == Toggle.option_true: + add_rule(self.multiworld.get_location("HWL: Soul of the Dancer", self.player), + lambda state: state.has("Small Lothric Banner", self.player)) + + gotthard_corpse_rule = lambda state: \ (state.can_reach("AL: Cinders of a Lord - Aldrich", "Location", self.player) and state.can_reach("PC: Cinders of a Lord - Yhorm the Giant", "Location", self.player)) - set_rule(self.multiworld.get_location("LC: Grand Archives Key", self.player), black_hand_gotthard_corpse_rule) - set_rule(self.multiworld.get_location("LC: Gotthard Twinswords", self.player), black_hand_gotthard_corpse_rule) + + set_rule(self.multiworld.get_location("LC: Grand Archives Key", self.player), gotthard_corpse_rule) + + if self.multiworld.enable_weapon_locations[self.player] == Toggle.option_true: + set_rule(self.multiworld.get_location("LC: Gotthard Twinswords", self.player), gotthard_corpse_rule) self.multiworld.completion_condition[self.player] = lambda state: \ state.has("Cinders of a Lord - Abyss Watcher", self.player) and \ @@ -265,57 +441,36 @@ class DarkSouls3World(World): state.has("Cinders of a Lord - Aldrich", self.player) and \ state.has("Cinders of a Lord - Lothric Prince", self.player) - def generate_basic(self): - # Depending on the specified option, add the Basin of Vows to a specific location or to the item pool - item = self.create_item("Basin of Vows") - if self.multiworld.late_basin_of_vows[self.player]: - self.multiworld.get_location("IBV: Soul of Pontiff Sulyvahn", self.player).place_locked_item(item) - else: - self.multiworld.itempool += [item] - - # Fill item pool with additional items - item_pool_len = self.item_name_to_id.__len__() - total_required_locations = self.location_name_to_id.__len__() - for i in range(item_pool_len, total_required_locations): - self.multiworld.itempool += [self.create_item("Soul of an Intrepid Hero")] def fill_slot_data(self) -> Dict[str, object]: slot_data: Dict[str, object] = {} - # Depending on the specified option, modify items hexadecimal value to add an upgrade level - item_dictionary_copy = item_dictionary.copy() - if self.multiworld.randomize_weapons_level[self.player] > 0: + # Depending on the specified option, modify items hexadecimal value to add an upgrade level or infusion + name_to_ds3_code = {item.name: item.ds3_code for item in item_dictionary.values()} + + # Randomize some weapon upgrades + if self.multiworld.randomize_weapon_level[self.player] != RandomizeWeaponLevelOption.option_none: # if the user made an error and set a min higher than the max we default to the max max_5 = self.multiworld.max_levels_in_5[self.player] min_5 = min(self.multiworld.min_levels_in_5[self.player], max_5) max_10 = self.multiworld.max_levels_in_10[self.player] min_10 = min(self.multiworld.min_levels_in_10[self.player], max_10) - weapons_percentage = self.multiworld.randomize_weapons_percentage[self.player] + weapon_level_percentage = self.multiworld.randomize_weapon_level_percentage[self.player] - # Randomize some weapons upgrades - if self.multiworld.randomize_weapons_level[self.player] in [1, 3]: # Options are either all or +5 - for name in weapons_upgrade_5_table.keys(): - if self.multiworld.per_slot_randoms[self.player].randint(1, 100) < weapons_percentage: - value = self.multiworld.per_slot_randoms[self.player].randint(min_5, max_5) - item_dictionary_copy[name] += value + for item in item_dictionary.values(): + if self.multiworld.per_slot_randoms[self.player].randint(0, 99) < weapon_level_percentage: + if item.category == DS3ItemCategory.WEAPON_UPGRADE_5: + name_to_ds3_code[item.name] += self.multiworld.per_slot_randoms[self.player].randint(min_5, max_5) + elif item.category in {DS3ItemCategory.WEAPON_UPGRADE_10, DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE}: + name_to_ds3_code[item.name] += self.multiworld.per_slot_randoms[self.player].randint(min_10, max_10) - if self.multiworld.randomize_weapons_level[self.player] in [1, 2]: # Options are either all or +10 - for name in weapons_upgrade_10_table.keys(): - if self.multiworld.per_slot_randoms[self.player].randint(1, 100) < weapons_percentage: - value = self.multiworld.per_slot_randoms[self.player].randint(min_10, max_10) - item_dictionary_copy[name] += value - - if self.multiworld.randomize_weapons_level[self.player] in [1, 3]: - for name in dlc_weapons_upgrade_5_table.keys(): - if self.multiworld.per_slot_randoms[self.player].randint(1, 100) < weapons_percentage: - value = self.multiworld.per_slot_randoms[self.player].randint(min_5, max_5) - item_dictionary_copy[name] += value - - if self.multiworld.randomize_weapons_level[self.player] in [1, 2]: - for name in dlc_weapons_upgrade_10_table.keys(): - if self.multiworld.per_slot_randoms[self.player].randint(1, 100) < weapons_percentage: - value = self.multiworld.per_slot_randoms[self.player].randint(min_10, max_10) - item_dictionary_copy[name] += value + # Randomize some weapon infusions + if self.multiworld.randomize_infusion[self.player] == Toggle.option_true: + infusion_percentage = self.multiworld.randomize_infusion_percentage[self.player] + for item in item_dictionary.values(): + if item.category in {DS3ItemCategory.WEAPON_UPGRADE_10_INFUSIBLE, DS3ItemCategory.SHIELD_INFUSIBLE}: + if self.multiworld.per_slot_randoms[self.player].randint(0, 99) < infusion_percentage: + name_to_ds3_code[item.name] += 100 * self.multiworld.per_slot_randoms[self.player].randint(0, 15) # Create the mandatory lists to generate the player's output file items_id = [] @@ -324,15 +479,19 @@ class DarkSouls3World(World): locations_address = [] locations_target = [] for location in self.multiworld.get_filled_locations(): + # Skip events + if location.item.code is None: + continue + if location.item.player == self.player: items_id.append(location.item.code) - items_address.append(item_dictionary_copy[location.item.name]) + items_address.append(name_to_ds3_code[location.item.name]) if location.player == self.player: - locations_address.append(location_dictionary[location.name]) + locations_address.append(item_dictionary[location_dictionary[location.name].default_item].ds3_code) locations_id.append(location.address) if location.item.player == self.player: - locations_target.append(item_dictionary_copy[location.item.name]) + locations_target.append(name_to_ds3_code[location.item.name]) else: locations_target.append(0) diff --git a/worlds/dark_souls_3/data/items_data.py b/worlds/dark_souls_3/data/items_data.py deleted file mode 100644 index 0ecd0434..00000000 --- a/worlds/dark_souls_3/data/items_data.py +++ /dev/null @@ -1,600 +0,0 @@ -""" -Tools used to create this list : -List of all items https://docs.google.com/spreadsheets/d/1nK2g7g6XJ-qphFAk1tjP3jZtlXWDQY-ItKLa_sniawo/edit#gid=1551945791 -Regular expression parser https://regex101.com/r/XdtiLR/2 -List of locations https://darksouls3.wiki.fextralife.com/Locations -""" - -weapons_upgrade_5_table = { - "Irithyll Straight Sword": 0x0020A760, - "Chaos Blade": 0x004C9960, - "Dragonrider Bow": 0x00D6B0F0, - "White Hair Talisman": 0x00CAF120, - "Izalith Staff": 0x00C96A80, - "Fume Ultra Greatsword": 0x0060E4B0, - "Black Knight Sword": 0x005F5E10, - "Yorshka's Spear": 0x008C3A70, - "Smough's Great Hammer": 0x007E30B0, - "Dragonslayer Greatbow": 0x00CF8500, - "Golden Ritual Spear": 0x00C83200, - "Eleonora": 0x006CCB90, - "Witch's Locks": 0x00B7B740, - "Crystal Chime": 0x00CA2DD0, - "Black Knight Glaive": 0x009AE070, - "Dragonslayer Spear": 0x008CAFA0, - "Caitha's Chime": 0x00CA06C0, - "Sunlight Straight Sword": 0x00203230, - "Firelink Greatsword": 0x0060BDA0, - "Hollowslayer Greatsword": 0x00604870, - "Arstor's Spear": 0x008BEC50, - "Vordt's Great Hammer": 0x007CD120, - "Crystal Sage's Rapier": 0x002E6300, - "Farron Greatsword": 0x005E9AC0, - "Wolf Knight's Greatsword": 0x00602160, - "Dancer's Enchanted Swords": 0x00F4C040, - "Wolnir's Holy Sword": 0x005FFA50, - "Demon's Greataxe": 0x006CA480, - "Demon's Fist": 0x00A84DF0, - "Old King's Great Hammer": 0x007CF830, - "Greatsword of Judgment": 0x005E2590, - "Profaned Greatsword": 0x005E4CA0, - "Yhorm's Great Machete": 0x005F0FF0, - "Cleric's Candlestick": 0x0020F580, - "Dragonslayer Greataxe": 0x006C7D70, - "Moonlight Greatsword": 0x00606F80, - "Gundyr's Halberd": 0x009A1D20, - "Lothric's Holy Sword": 0x005FD340, - "Lorian's Greatsword": 0x005F8520, - "Twin Princes' Greatsword": 0x005FAC30, - "Storm Curved Sword": 0x003E4180, - "Dragonslayer Swordspear": 0x008BC540, - "Sage's Crystal Staff": 0x00C8CE40, - "Irithyll Rapier": 0x002E8A10 -} - -dlc_weapons_upgrade_5_table = { - "Friede's Great Scythe": 0x009B55A0, - "Rose of Ariandel": 0x00B82C70, - "Demon's Scar": 0x003F04D0, # Assigned to "RC: Church Guardian Shiv" - "Frayed Blade": 0x004D35A0, # Assigned to "RC: Ritual Spear Fragment" - "Gael's Greatsword": 0x00227C20, # Assigned to "RC: Violet Wrappings" - "Repeating Crossbow": 0x00D885B0, # Assigned to "RC: Blood of the Dark Souls" - "Onyx Blade": 0x00222E00, # VILHELM FIGHT - "Earth Seeker": 0x006D8EE0, - "Quakestone Hammer": 0x007ECCF0, - "Millwood Greatbow": 0x00D85EA0, - "Valorheart": 0x00F646E0, - "Aquamarine Dagger": 0x00116520, - "Ringed Knight Straight Sword": 0x00225510, - "Ledo's Great Hammer": 0x007EF400, # INVADER FIGHT - "Ringed Knight Spear": 0x008CFDC0, - "Crucifix of the Mad King": 0x008D4BE0, - "Sacred Chime of Filianore": 0x00CCECF0, - "Preacher's Right Arm": 0x00CD1400, - "White Birch Bow": 0x00D77440, - "Ringed Knight Paired Greatswords": 0x00F69500 -} - -weapons_upgrade_10_table = { - "Broken Straight Sword": 0x001EF9B0, - "Deep Battle Axe": 0x0006AFA54, - "Club": 0x007A1200, - "Claymore": 0x005BDBA0, - "Longbow": 0x00D689E0, - "Mail Breaker": 0x002DEDD0, - "Broadsword": 0x001ED2A0, - "Astora's Straight Sword": 0x002191C0, - "Rapier": 0x002E14E0, - "Lucerne": 0x0098BD90, - "Whip": 0x00B71B00, - "Reinforced Club": 0x007A8730, - "Caestus": 0x00A7FFD0, - "Partizan": 0x0089C970, - "Red Hilted Halberd": 0x009AB960, - "Saint's Talisman": 0x00CACA10, - "Large Club": 0x007AFC60, - "Brigand Twindaggers": 0x00F50E60, - "Butcher Knife": 0x006BE130, - "Brigand Axe": 0x006B1DE0, - "Heretic's Staff": 0x00C8F550, - "Great Club": 0x007B4A80, - "Exile Greatsword": 0x005DD770, - "Sellsword Twinblades": 0x00F42400, - "Notched Whip": 0x00B7DE50, - "Astora Greatsword": 0x005C9EF0, - "Executioner's Greatsword": 0x0021DFE0, - "Saint-tree Bellvine": 0x00C9DFB0, - "Saint Bident": 0x008C1360, - "Drang Hammers": 0x00F61FD0, - "Arbalest": 0x00D662D0, - "Sunlight Talisman": 0x00CA54E0, - "Greatsword": 0x005C50D0, - "Black Bow of Pharis": 0x00D7E970, - "Great Axe": 0x006B9310, - "Black Blade": 0x004CC070, - "Blacksmith Hammer": 0x007E57C0, - "Witchtree Branch": 0x00C94370, - "Painting Guardian's Curved Sword": 0x003E6890, - "Pickaxe": 0x007DE290, - "Court Sorcerer's Staff": 0x00C91C60, - "Avelyn": 0x00D6FF10, - "Onikiri and Ubadachi": 0x00F58390, - "Ricard's Rapier": 0x002E3BF0, - "Drakeblood Greatsword": 0x00609690, - "Greatlance": 0x008A8CC0, - "Sniper Crossbow": 0x00D83790, - "Claw": 0x00A7D8C0, - "Drang Twinspears": 0x00F5AAA0, - "Pyromancy Flame": 0x00CC77C0 #given/dropped by Cornyx -} - -dlc_weapons_upgrade_10_table = { - "Follower Sabre": 0x003EDDC0, - "Millwood Battle Axe": 0x006D67D0, - "Follower Javelin": 0x008CD6B0, - "Crow Talons": 0x00A89C10, - "Pyromancer's Parting Flame": 0x00CC9ED0, - "Crow Quills": 0x00F66DF0, - "Follower Torch": 0x015F1AD0, - "Murky Hand Scythe": 0x00118C30, - "Herald Curved Greatsword": 0x006159E0, - "Lothric War Banner": 0x008D24D0, - "Splitleaf Greatsword": 0x009B2E90, # SHOP ITEM - "Murky Longstaff": 0x00CCC5E0, -} - -shields_table = { - "East-West Shield": 0x0142B930, - "Silver Eagle Kite Shield": 0x014418C0, - "Small Leather Shield": 0x01315410, - "Blue Wooden Shield": 0x0143F1B0, - "Plank Shield": 0x01346150, - "Caduceus Round Shield": 0x01341330, - "Wargod Wooden Shield": 0x0144DC10, - "Grass Crest Shield": 0x01437C80, - "Golden Falcon Shield": 0x01354BB0, - "Twin Dragon Greatshield": 0x01513820, - "Spider Shield": 0x01435570, - "Crest Shield": 0x01430750, - "Curse Ward Greatshield": 0x01518640, - "Stone Parma": 0x01443FD0, - "Dragon Crest Shield": 0x01432E60, - "Shield of Want": 0x0144B500, - "Black Iron Greatshield": 0x0150EA00, - "Greatshield of Glory": 0x01515F30, - "Sacred Bloom Shield": 0x013572C0, - "Golden Wing Crest Shield": 0x0143CAA0, - "Ancient Dragon Greatshield": 0x013599D0, - "Spirit Tree Crest Shield": 0x014466E0, - "Blessed Red and White Shield": 0x01343FB9 -} - -dlc_shields_table = { - "Followers Shield": 0x0135C0E0, - "Ethereal Oak Shield": 0x01450320, - "Giant Door Shield": 0x00F5F8C0, - "Dragonhead Shield": 0x0135E7F0, - "Dragonhead Greatshield": 0x01452A30 -} - -goods_table = { - "Soul of an Intrepid Hero": 0x4000019D, - "Soul of the Nameless King": 0x400002D2, - "Soul of Champion Gundyr": 0x400002C8, - "Soul of the Twin Princes": 0x400002DB, - "Soul of Consumed Oceiros": 0x400002CE, - "Soul of Aldrich": 0x400002D5, - "Soul of Yhorm the Giant": 0x400002DC, - "Soul of Pontiff Sulyvahn": 0x400002D4, - "Soul of the Old Demon King": 0x400002D0, - "Soul of High Lord Wolnir": 0x400002D6, - "Soul of the Blood of the Wolf": 0x400002CD, - "Soul of the Deacons of the Deep": 0x400002D9, - "Soul of a Crystal Sage": 0x400002CB, - "Soul of Boreal Valley Vordt": 0x400002CF, - "Soul of a Stray Demon": 0x400002E7, - "Soul of a Demon": 0x400002E3, - - # Upgrade materials - **{"Titanite Shard #"+str(i): 0x400003E8 for i in range(1, 11)}, - **{"Large Titanite Shard #"+str(i): 0x400003E9 for i in range(1, 11)}, - **{"Titanite Chunk #"+str(i): 0x400003EA for i in range(1, 6)}, - **{"Titanite Slab #"+str(i): 0x400003EB for i in range(1, 4)}, - - # Healing - **{"Estus Shard #"+str(i): 0x4000085D for i in range(1, 16)}, - **{"Undead Bone Shard #"+str(i): 0x4000085F for i in range(1, 6)}, - - # Souls - **{"Soul of a Great Champion #"+str(i): 0x400001A4 for i in range(1, 3)}, - **{"Soul of a Champion #"+str(i): 0x400001A3 for i in range(1, 5)}, - **{"Soul of a Venerable Old Hand #"+str(i): 0x400001A2 for i in range(1, 5)}, - **{"Soul of a Crestfallen Knight #"+str(i): 0x40000199 for i in range(1, 11)} -} - -goods_2_table = { # Added by Br00ty - "HWL: Gold Pine Resin #": 0x4000014B, - "US: Charcoal Pine Resin #": 0x4000014A, - "FK: Gold Pine Bundle #": 0x40000155, - "CC: Carthus Rouge #": 0x4000014F, - "ID: Pale Pine Resin #": 0x40000150, - **{"Ember #"+str(i): 0x400001F4 for i in range(1, 45)}, - **{"Titanite Shard #"+str(i): 0x400003E8 for i in range(11, 16)}, - **{"Large Titanite Shard #"+str(i): 0x400003E9 for i in range(11, 16)}, - **{"Titanite Scale #" + str(i): 0x400003FC for i in range(1, 25)} -} - -goods_3_table = { # Added by Br00ty - **{"Fading Soul #" + str(i): 0x40000190 for i in range(1, 4)}, - **{"Ring of Sacrifice #"+str(i): 0x20004EF2 for i in range(1, 5)}, - **{"Homeward Bone #"+str(i): 0x4000015E for i in range(1, 17)}, - **{"Green Blossom #"+str(i): 0x40000104 for i in range(1, 7)}, - **{"Human Pine Resin #"+str(i): 0x4000014E for i in range(1, 3)}, - **{"Charcoal Pine Bundle #"+str(i): 0x40000154 for i in range(1, 3)}, - **{"Rotten Pine Resin #"+str(i): 0x40000157 for i in range(1, 3)}, - **{"Alluring Skull #"+str(i): 0x40000126 for i in range(1, 9)}, - **{"Rusted Coin #"+str(i): 0x400001C7 for i in range(1, 3)}, - **{"Rusted Gold Coin #"+str(i): 0x400001C9 for i in range(1, 3)}, - **{"Titanite Chunk #"+str(i): 0x400003EA for i in range(1, 17)}, - **{"Twinkling Titanite #"+str(i): 0x40000406 for i in range(1, 8)} -} - -dlc_goods_table = { - "Soul of Sister Friede": 0x400002E8, - "Soul of the Demon Prince": 0x400002EA, - "Soul of Darkeater Midir": 0x400002EB, - "Soul of Slave Knight Gael": 0x400002E9 -} - -dlc_goods_2_table = { #71 - **{"Large Soul of an Unknown Traveler $"+str(i): 0x40000194 for i in range(1, 10)}, - **{"Soul of a Weary Warrior $"+str(i): 0x40000197 for i in range(1, 6)}, - **{"Large Soul of a Weary Warrior $"+str(i): 0x40000198 for i in range(1, 7)}, - **{"Soul of a Crestfallen Knight $"+str(i): 0x40000199 for i in range(1, 7)}, - **{"Large Soul of a Crestfallen Knight $"+str(i): 0x4000019A for i in range(1, 4)}, - **{"Homeward Bone $"+str(i): 0x4000015E for i in range(1, 7)}, - **{"Large Titanite Shard $"+str(i): 0x400003E9 for i in range(1, 4)}, - **{"Titanite Chunk $"+str(i): 0x400003EA for i in range(1, 16)}, - **{"Twinkling Titanite $"+str(i): 0x40000406 for i in range(1, 6)}, - **{"Rusted Coin $"+str(i): 0x400001C7 for i in range(1, 4)}, - **{"Ember $"+str(i): 0x400001F4 for i in range(1, 11)} -} - -armor_table = { - "Fire Keeper Robe": 0x140D9CE8, - "Fire Keeper Gloves": 0x140DA0D0, - "Fire Keeper Skirt": 0x140DA4B8, - "Deserter Trousers": 0x126265B8, - "Cleric Hat": 0x11D905C0, - "Cleric Blue Robe": 0x11D909A8, - "Cleric Gloves": 0x11D90D90, - "Cleric Trousers": 0x11D91178, - "Northern Helm": 0x116E3600, - "Northern Armor": 0x116E39E8, - "Northern Gloves": 0x116E3DD0, - "Northern Trousers": 0x116E41B8, - "Loincloth": 0x148F57D8, - - "Brigand Hood": 0x148009E0, - "Brigand Armor": 0x14800DC8, - "Brigand Gauntlets": 0x148011B0, - "Brigand Trousers": 0x14801598, - "Sorcerer Hood": 0x11C9C380, - "Sorcerer Robe": 0x11C9C768, - "Sorcerer Gloves": 0x11C9CB50, - "Sorcerer Trousers": 0x11C9CF38, - "Fallen Knight Helm": 0x1121EAC0, - "Fallen Knight Armor": 0x1121EEA8, - "Fallen Knight Gauntlets": 0x1121F290, - "Fallen Knight Trousers": 0x1121F678, - "Conjurator Hood": 0x149E8E60, - "Conjurator Robe": 0x149E9248, - "Conjurator Manchettes": 0x149E9630, - "Conjurator Boots": 0x149E9A18, - - "Sellsword Helm": 0x11481060, - "Sellsword Armor": 0x11481448, - "Sellsword Gauntlet": 0x11481830, - "Sellsword Trousers": 0x11481C18, - "Herald Helm": 0x114FB180, - "Herald Armor": 0x114FB568, - "Herald Gloves": 0x114FB950, - "Herald Trousers": 0x114FBD38, - - "Maiden Hood": 0x14BD12E0, - "Maiden Robe": 0x14BD16C8, - "Maiden Gloves": 0x14BD1AB0, - "Maiden Skirt": 0x14BD1E98, - "Drang Armor": 0x154E0C28, - "Drang Gauntlets": 0x154E1010, - "Drang Shoes": 0x154E13F8, - "Archdeacon White Crown": 0x13EF1480, - "Archdeacon Holy Garb": 0x13EF1868, - "Archdeacon Skirt": 0x13EF2038, - "Antiquated Dress": 0x15D76068, - "Antiquated Gloves": 0x15D76450, - "Antiquated Skirt": 0x15D76838, - "Ragged Mask": 0x148F4C20, - "Crown of Dusk": 0x15D75C80, - "Pharis's Hat": 0x1487AB00, - "Old Sage's Blindfold": 0x11945BA0, - - "Painting Guardian Hood": 0x156C8CC0, - "Painting Guardian Gown": 0x156C90A8, - "Painting Guardian Gloves": 0x156C9490, - "Painting Guardian Waistcloth": 0x156C9878, - "Brass Helm": 0x1501BD00, - "Brass Armor": 0x1501C0E8, - "Brass Gauntlets": 0x1501C4D0, - "Brass Leggings": 0x1501C8B8, - "Old Sorcerer Hat": 0x1496ED40, - "Old Sorcerer Coat": 0x1496F128, - "Old Sorcerer Gauntlets": 0x1496F510, - "Old Sorcerer Boots": 0x1496F8F8, - "Court Sorcerer Hood": 0x11BA8140, - "Court Sorcerer Robe": 0x11BA8528, - "Court Sorcerer Gloves": 0x11BA8910, - "Court Sorcerer Trousers": 0x11BA8CF8, - "Dragonslayer Helm": 0x158B1140, - "Dragonslayer Armor": 0x158B1528, - "Dragonslayer Gauntlets": 0x158B1910, - "Dragonslayer Leggings": 0x158B1CF8, - - "Hood of Prayer": 0x13AA6A60, - "Robe of Prayer": 0x13AA6E48, - "Skirt of Prayer": 0x13AA7618, - "Winged Knight Helm": 0x12EBAE40, - "Winged Knight Armor": 0x12EBB228, - "Winged Knight Gauntlets": 0x12EBB610, - "Winged Knight Leggings": 0x12EBB9F8, - "Shadow Mask": 0x14D3F640, - "Shadow Garb": 0x14D3FA28, - "Shadow Gauntlets": 0x14D3FE10, - "Shadow Leggings": 0x14D401F8, - "Outrider Knight Helm": 0x1328B740, - "Outrider Knight Armor": 0x1328BB28, - "Outrider Knight Gauntlets": 0x1328BF10, - "Outrider Knight Leggings": 0x1328C2F8, - - "Cornyx's Wrap": 0x11946370, - "Cornyx's Garb": 0x11945F88, - "Cornyx's Skirt": 0x11946758 -} - -dlc_armor_table = { - "Slave Knight Hood": 0x134EDCE0, - "Slave Knight Armor": 0x134EE0C8, - "Slave Knight Gauntlets": 0x134EE4B0, - "Slave Knight Leggings": 0x134EE898, - "Vilhelm's Helm": 0x11312D00, - "Vilhelm's Armor": 0x113130E8, - "Vilhelm's Gauntlets": 0x113134D0, - "Vilhelm's Leggings": 0x113138B8, - #"Millwood Knight Helm": 0x139B2820, # SHOP ITEM - #"Millwood Knight Armor": 0x139B2C08, # SHOP ITEM - #"Millwood Knight Gauntlets": 0x139B2FF0, # SHOP ITEM - #"Millwood Knight Leggings": 0x139B33D8, # SHOP ITEM - - "Shira's Crown": 0x11C22260, - "Shira's Armor": 0x11C22648, - "Shira's Gloves": 0x11C22A30, - "Shira's Trousers": 0x11C22E18, - #"Lapp's Helm": 0x11E84800, # SHOP ITEM - #"Lapp's Armor": 0x11E84BE8, # SHOP ITEM - #"Lapp's Gauntlets": 0x11E84FD0, # SHOP ITEM - #"Lapp's Leggings": 0x11E853B8, # SHOP ITEM - #"Ringed Knight Hood": 0x13C8EEE0, # RANDOM ENEMY DROP - #"Ringed Knight Armor": 0x13C8F2C8, # RANDOM ENEMY DROP - #"Ringed Knight Gauntlets": 0x13C8F6B0, # RANDOM ENEMY DROP - #"Ringed Knight Leggings": 0x13C8FA98, # RANDOM ENEMY DROP - #"Harald Legion Armor": 0x13D83508, # RANDOM ENEMY DROP - #"Harald Legion Gauntlets": 0x13D838F0, # RANDOM ENEMY DROP - #"Harald Legion Leggings": 0x13D83CD8, # RANDOM ENEMY DROP - "Iron Dragonslayer Helm": 0x1405F7E0, - "Iron Dragonslayer Armor": 0x1405FBC8, - "Iron Dragonslayer Gauntlets": 0x1405FFB0, - "Iron Dragonslayer Leggings": 0x14060398, - - "Ruin Sentinel Helm": 0x14CC5520, - "Ruin Sentinel Armor": 0x14CC5908, - "Ruin Sentinel Gauntlets": 0x14CC5CF0, - "Ruin Sentinel Leggings": 0x14CC60D8, - "Desert Pyromancer Hood": 0x14DB9760, - "Desert Pyromancer Garb": 0x14DB9B48, - "Desert Pyromancer Gloves": 0x14DB9F30, - "Desert Pyromancer Skirt": 0x14DBA318, - - #"Follower Helm": 0x137CA3A0, # RANDOM ENEMY DROP - #"Follower Armor": 0x137CA788, # RANDOM ENEMY DROP - #"Follower Gloves": 0x137CAB70, # RANDOM ENEMY DROP - #"Follower Boots": 0x137CAF58, # RANDOM ENEMY DROP - #"Ordained Hood": 0x135E1F20, # SHOP ITEM - #"Ordained Dress": 0x135E2308, # SHOP ITEM - #"Ordained Trousers": 0x135E2AD8, # SHOP ITEM - "Black Witch Veil": 0x14FA1BE0, - "Black Witch Hat": 0x14EAD9A0, - "Black Witch Garb": 0x14EADD88, - "Black Witch Wrappings": 0x14EAE170, - "Black Witch Trousers": 0x14EAE558, - "White Preacher Head": 0x14153A20, - "Antiquated Plain Garb": 0x11B2E408 -} - -rings_table = { - "Estus Ring": 0x200050DC, - "Covetous Silver Serpent Ring": 0x20004FB0, - "Fire Clutch Ring": 0x2000501E, - "Flame Stoneplate Ring": 0x20004E52, - "Flynn's Ring": 0x2000503C, - "Chloranthy Ring": 0x20004E2A, - - "Morne's Ring": 0x20004F1A, - "Sage Ring": 0x20004F38, - "Aldrich's Sapphire": 0x20005096, - "Lloyd's Sword Ring": 0x200050B4, - "Poisonbite Ring": 0x20004E8E, - "Deep Ring": 0x20004F60, - "Lingering Dragoncrest Ring": 0x20004F2E, - "Carthus Milkring": 0x20004FE2, - "Witch's Ring": 0x20004F11, - "Carthus Bloodring": 0x200050FA, - - "Speckled Stoneplate Ring": 0x20004E7A, - "Magic Clutch Ring": 0x2000500A, - "Ring of the Sun's First Born": 0x20004F1B, - "Pontiff's Right Eye": 0x2000510E, "Leo Ring": 0x20004EE8, - "Dark Stoneplate Ring": 0x20004E70, - "Reversal Ring": 0x20005104, - "Ring of Favor": 0x20004E3E, - "Bellowing Dragoncrest Ring": 0x20004F07, - "Covetous Gold Serpent Ring": 0x20004FA6, - "Dusk Crown Ring": 0x20004F4C, - "Dark Clutch Ring": 0x20005028, - "Cursebite Ring": 0x20004E98, - "Sun Princess Ring": 0x20004FBA, - "Aldrich's Ruby": 0x2000508C, - "Scholar Ring": 0x20004EB6, - "Fleshbite Ring": 0x20004EA2, - "Hunter's Ring": 0x20004FF6, - "Ashen Estus Ring": 0x200050E6, - "Hornet Ring": 0x20004F9C, - "Lightning Clutch Ring": 0x20005014, - "Ring of Steel Protection": 0x20004E48, - "Calamity Ring": 0x20005078, - "Thunder Stoneplate Ring": 0x20004E5C, - "Knight's Ring": 0x20004FEC, - "Red Tearstone Ring": 0x20004ECA, - "Dragonscale Ring": 0x2000515E, - "Knight Slayer's Ring": 0x20005000, - "Magic Stoneplate Ring": 0x20004E66, - "Blue Tearstone Ring": 0x20004ED4 #given/dropped by Greirat -} - -dlc_ring_table = { - "Havel's Ring": 0x20004E34, - "Chillbite Ring": 0x20005208 -} - -spells_table = { - "Seek Guidance": 0x40360420, - "Lightning Spear": 0x40362B30, - "Atonement": 0x4039ADA0, - "Great Magic Weapon": 0x40140118, - "Iron Flesh": 0x40251430, - "Lightning Stake": 0x40389C30, - "Toxic Mist": 0x4024F108, - "Sacred Flame": 0x40284880, - "Dorhys' Gnawing": 0x40363EB8, - "Great Heal": 0x40356FB0, - "Lightning Blade": 0x4036C770, - "Profaned Flame": 0x402575D8, - "Wrath of the Gods": 0x4035E0F8, - "Power Within": 0x40253B40, - "Soul Stream": 0x4018B820, - "Divine Pillars of Light": 0x4038C340, - "Great Magic Barrier": 0x40365628, - "Great Magic Shield": 0x40144F38, - "Crystal Scroll": 0x40000856 -} - -dlc_spells_table = { - #"Boulder Heave": 0x40282170, # KILN STRAY DEMON - #"Seething Chaos": 0x402896A0, # KILN DEMON PRINCES - #"Old Moonlight": 0x4014FF00, # KILN MIDIR - "Frozen Weapon": 0x401408E8, - "Snap Freeze": 0x401A90C8, - "Great Soul Dregs": 0x401879A0, - "Flame Fan": 0x40258190, - "Lightning Arrow": 0x40358B08, - "Way of White Corona": 0x403642A0, - "Projected Heal": 0x40364688, - "Floating Chaos": 0x40257DA8 -} - -misc_items_table = { - "Tower Key": 0x400007DF, - "Grave Key": 0x400007D9, - "Cell Key": 0x400007DA, - "Small Lothric Banner": 0x40000836, - "Mortician's Ashes": 0x4000083B, - "Braille Divine Tome of Carim": 0x40000847, # Shop - "Great Swamp Pyromancy Tome": 0x4000084F, # Shop - "Farron Coal ": 0x40000837, # Shop - "Paladin's Ashes": 0x4000083D, # Shop - "Deep Braille Divine Tome": 0x40000860, # Shop - "Small Doll": 0x400007D5, - "Golden Scroll": 0x4000085C, - "Sage's Coal": 0x40000838, # Shop #Unique - "Sage's Scroll": 0x40000854, - "Dreamchaser's Ashes": 0x4000083C, # Shop #Unique - "Cinders of a Lord - Abyss Watcher": 0x4000084B, - "Cinders of a Lord - Yhorm the Giant": 0x4000084D, - "Cinders of a Lord - Aldrich": 0x4000084C, - "Grand Archives Key": 0x400007DE, - "Basin of Vows": 0x40000845, - "Cinders of a Lord - Lothric Prince": 0x4000084E, - "Carthus Pyromancy Tome": 0x40000850, - "Grave Warden's Ashes": 0x4000083E, - "Grave Warden Pyromancy Tome": 0x40000853, - "Quelana Pyromancy Tome": 0x40000852, - "Izalith Pyromancy Tome": 0x40000851, - "Greirat's Ashes": 0x4000083F, - "Excrement-covered Ashes": 0x40000862, - "Easterner's Ashes": 0x40000868, - "Prisoner Chief's Ashes": 0x40000863, - "Jailbreaker's Key": 0x400007D7, - "Dragon Torso Stone": 0x4000017A, - "Profaned Coal": 0x4000083A, - "Xanthous Ashes": 0x40000864, - "Old Cell Key": 0x400007DC, - "Jailer's Key Ring": 0x400007D8, - "Logan's Scroll": 0x40000855, - "Storm Ruler": 0x006132D0, - "Giant's Coal": 0x40000839, - "Coiled Sword Fragment": 0x4000015F, - "Dragon Chaser's Ashes": 0x40000867, - "Twinkling Dragon Torso Stone": 0x40000184, - "Braille Divine Tome of Lothric": 0x40000848, - "Irina's Ashes": 0x40000843, - "Karla's Ashes": 0x40000842, - "Cornyx's Ashes": 0x40000841, - "Orbeck's Ashes": 0x40000840 -} - -dlc_misc_table = { - "Captains Ashes": 0x4000086A, - "Contraption Key": 0x4000086B, # Needed for Painted World - "Small Envoy Banner": 0x4000086C # Needed to get to Ringed City from Dreg Heap -} - -key_items_list = { - "Small Lothric Banner", - "Basin of Vows", - "Small Doll", - "Storm Ruler", - "Grand Archives Key", - "Cinders of a Lord - Abyss Watcher", - "Cinders of a Lord - Yhorm the Giant", - "Cinders of a Lord - Aldrich", - "Cinders of a Lord - Lothric Prince", - "Mortician's Ashes", - "Cell Key", - "Tower Key", - "Jailbreaker's Key", - "Prisoner Chief's Ashes", - "Old Cell Key", - "Jailer's Key Ring", - "Contraption Key", - "Small Envoy Banner" -} - -item_tables = [weapons_upgrade_5_table, weapons_upgrade_10_table, shields_table, - armor_table, rings_table, spells_table, misc_items_table, goods_table, goods_2_table, goods_3_table, - dlc_weapons_upgrade_5_table, dlc_weapons_upgrade_10_table, dlc_shields_table, dlc_goods_table, - dlc_armor_table, dlc_spells_table, dlc_ring_table, dlc_misc_table, dlc_goods_2_table] - -item_dictionary = {**weapons_upgrade_5_table, **weapons_upgrade_10_table, **shields_table, - **armor_table, **rings_table, **spells_table, **misc_items_table, **goods_table, **goods_2_table, - **goods_3_table, **dlc_weapons_upgrade_5_table, **dlc_weapons_upgrade_10_table, **dlc_shields_table, - **dlc_goods_table, **dlc_armor_table, **dlc_spells_table, **dlc_ring_table, **dlc_misc_table, **dlc_goods_2_table} - diff --git a/worlds/dark_souls_3/data/locations_data.py b/worlds/dark_souls_3/data/locations_data.py deleted file mode 100644 index 98eb8076..00000000 --- a/worlds/dark_souls_3/data/locations_data.py +++ /dev/null @@ -1,614 +0,0 @@ -""" -Tools used to create this list : -List of all items https://docs.google.com/spreadsheets/d/1nK2g7g6XJ-qphFAk1tjP3jZtlXWDQY-ItKLa_sniawo/edit#gid=1551945791 -Regular expression parser https://regex101.com/r/XdtiLR/2 -List of locations https://darksouls3.wiki.fextralife.com/Locations -""" - -fire_link_shrine_table = { - # "FS: Coiled Sword": 0x40000859, You can still light the Firelink Shrine fire whether you have it or not, useless - "FS: Broken Straight Sword": 0x001EF9B0, - "FS: East-West Shield": 0x0142B930, - "FS: Uchigatana": 0x004C4B40, - "FS: Master's Attire": 0x148F5008, - "FS: Master's Gloves": 0x148F53F0, -} - -firelink_shrine_bell_tower_table = { - "FSBT: Covetous Silver Serpent Ring": 0x20004FB0, - "FSBT: Fire Keeper Robe": 0x140D9CE8, - "FSBT: Fire Keeper Gloves": 0x140DA0D0, - "FSBT: Fire Keeper Skirt": 0x140DA4B8, - "FSBT: Estus Ring": 0x200050DC, - "FSBT: Fire Keeper Soul": 0x40000186 -} - -high_wall_of_lothric = { - "HWL: Deep Battle Axe": 0x0006AFA54, - "HWL: Club": 0x007A1200, - "HWL: Claymore": 0x005BDBA0, - "HWL: Binoculars": 0x40000173, - "HWL: Longbow": 0x00D689E0, - "HWL: Mail Breaker": 0x002DEDD0, - "HWL: Broadsword": 0x001ED2A0, - "HWL: Silver Eagle Kite Shield": 0x014418C0, - "HWL: Astora's Straight Sword": 0x002191C0, - "HWL: Cell Key": 0x400007DA, - "HWL: Rapier": 0x002E14E0, - "HWL: Lucerne": 0x0098BD90, - "HWL: Small Lothric Banner": 0x40000836, - "HWL: Basin of Vows": 0x40000845, - "HWL: Soul of Boreal Valley Vordt": 0x400002CF, - "HWL: Soul of the Dancer": 0x400002CA, - "HWL: Way of Blue Covenant": 0x2000274C, - "HWL: Greirat's Ashes": 0x4000083F, - "HWL: Blue Tearstone Ring": 0x20004ED4 #given/dropped by Greirat -} - -undead_settlement_table = { - "US: Small Leather Shield": 0x01315410, - "US: Whip": 0x00B71B00, - "US: Reinforced Club": 0x007A8730, - "US: Blue Wooden Shield": 0x0143F1B0, - - "US: Cleric Hat": 0x11D905C0, - "US: Cleric Blue Robe": 0x11D909A8, - "US: Cleric Gloves": 0x11D90D90, - "US: Cleric Trousers": 0x11D91178, - - "US: Mortician's Ashes": 0x4000083B, - "US: Caestus": 0x00A7FFD0, - "US: Plank Shield": 0x01346150, - "US: Flame Stoneplate Ring": 0x20004E52, - "US: Caduceus Round Shield": 0x01341330, - "US: Fire Clutch Ring": 0x2000501E, - "US: Partizan": 0x0089C970, - "US: Bloodbite Ring": 0x20004E84, - - "US: Red Hilted Halberd": 0x009AB960, - "US: Saint's Talisman": 0x00CACA10, - "US: Irithyll Straight Sword": 0x0020A760, - "US: Large Club": 0x007AFC60, - "US: Northern Helm": 0x116E3600, - "US: Northern Armor": 0x116E39E8, - "US: Northern Gloves": 0x116E3DD0, - "US: Northern Trousers": 0x116E41B8, - "US: Flynn's Ring": 0x2000503C, - - "US: Mirrah Vest": 0x15204568, - "US: Mirrah Gloves": 0x15204950, - "US: Mirrah Trousers": 0x15204D38, - - "US: Chloranthy Ring": 0x20004E2A, - "US: Loincloth": 0x148F57D8, - "US: Wargod Wooden Shield": 0x0144DC10, - - "US: Loretta's Bone": 0x40000846, - - "US: Hand Axe": 0x006ACFC0, - "US: Great Scythe": 0x00989680, - "US: Soul of the Rotted Greatwood": 0x400002D7, - "US: Hawk Ring": 0x20004F92, - "US: Warrior of Sunlight Covenant": 0x20002738, - "US: Blessed Red and White Shield": 0x01343FB9, - "US: Irina's Ashes": 0x40000843, - "US: Cornyx's Ashes": 0x40000841, - "US: Cornyx's Wrap": 0x11946370, - "US: Cornyx's Garb": 0x11945F88, - "US: Cornyx's Skirt": 0x11946758, - "US: Pyromancy Flame": 0x00CC77C0 #given/dropped by Cornyx -} - -road_of_sacrifice_table = { - "RS: Brigand Twindaggers": 0x00F50E60, - - "RS: Brigand Hood": 0x148009E0, - "RS: Brigand Armor": 0x14800DC8, - "RS: Brigand Gauntlets": 0x148011B0, - "RS: Brigand Trousers": 0x14801598, - - "RS: Butcher Knife": 0x006BE130, - "RS: Brigand Axe": 0x006B1DE0, - "RS: Braille Divine Tome of Carim": 0x40000847, - "RS: Morne's Ring": 0x20004F1A, - "RS: Twin Dragon Greatshield": 0x01513820, - "RS: Heretic's Staff": 0x00C8F550, - - "RS: Sorcerer Hood": 0x11C9C380, - "RS: Sorcerer Robe": 0x11C9C768, - "RS: Sorcerer Gloves": 0x11C9CB50, - "RS: Sorcerer Trousers": 0x11C9CF38, - - "RS: Sage Ring": 0x20004F38, - - "RS: Fallen Knight Helm": 0x1121EAC0, - "RS: Fallen Knight Armor": 0x1121EEA8, - "RS: Fallen Knight Gauntlets": 0x1121F290, - "RS: Fallen Knight Trousers": 0x1121F678, - - "RS: Conjurator Hood": 0x149E8E60, - "RS: Conjurator Robe": 0x149E9248, - "RS: Conjurator Manchettes": 0x149E9630, - "RS: Conjurator Boots": 0x149E9A18, - - "RS: Great Swamp Pyromancy Tome": 0x4000084F, - - "RS: Great Club": 0x007B4A80, - "RS: Exile Greatsword": 0x005DD770, - - "RS: Farron Coal ": 0x40000837, - - "RS: Sellsword Twinblades": 0x00F42400, - "RS: Sellsword Helm": 0x11481060, - "RS: Sellsword Armor": 0x11481448, - "RS: Sellsword Gauntlet": 0x11481830, - "RS: Sellsword Trousers": 0x11481C18, - - "RS: Golden Falcon Shield": 0x01354BB0, - - "RS: Herald Helm": 0x114FB180, - "RS: Herald Armor": 0x114FB568, - "RS: Herald Gloves": 0x114FB950, - "RS: Herald Trousers": 0x114FBD38, - - "RS: Grass Crest Shield": 0x01437C80, - "RS: Soul of a Crystal Sage": 0x400002CB, - "RS: Great Swamp Ring": 0x20004F10, - "RS: Orbeck's Ashes": 0x40000840 -} - -cathedral_of_the_deep_table = { - "CD: Paladin's Ashes": 0x4000083D, - "CD: Spider Shield": 0x01435570, - "CD: Crest Shield": 0x01430750, - "CD: Notched Whip": 0x00B7DE50, - "CD: Astora Greatsword": 0x005C9EF0, - "CD: Executioner's Greatsword": 0x0021DFE0, - "CD: Curse Ward Greatshield": 0x01518640, - "CD: Saint-tree Bellvine": 0x00C9DFB0, - "CD: Poisonbite Ring": 0x20004E8E, - - "CD: Lloyd's Sword Ring": 0x200050B4, - "CD: Seek Guidance": 0x40360420, - - "CD: Aldrich's Sapphire": 0x20005096, - "CD: Deep Braille Divine Tome": 0x40000860, - - "CD: Saint Bident": 0x008C1360, - "CD: Maiden Hood": 0x14BD12E0, - "CD: Maiden Robe": 0x14BD16C8, - "CD: Maiden Gloves": 0x14BD1AB0, - "CD: Maiden Skirt": 0x14BD1E98, - "CD: Drang Armor": 0x154E0C28, - "CD: Drang Gauntlets": 0x154E1010, - "CD: Drang Shoes": 0x154E13F8, - "CD: Drang Hammers": 0x00F61FD0, - "CD: Deep Ring": 0x20004F60, - - "CD: Archdeacon White Crown": 0x13EF1480, - "CD: Archdeacon Holy Garb": 0x13EF1868, - "CD: Archdeacon Skirt": 0x13EF2038, - - "CD: Arbalest": 0x00D662D0, - "CD: Small Doll": 0x400007D5, - "CD: Soul of the Deacons of the Deep": 0x400002D9, - "CD: Rosaria's Fingers Covenant": 0x20002760, -} - -farron_keep_table = { - "FK: Ragged Mask": 0x148F4C20, - "FK: Iron Flesh": 0x40251430, - "FK: Golden Scroll": 0x4000085C, - - "FK: Antiquated Dress": 0x15D76068, - "FK: Antiquated Gloves": 0x15D76450, - "FK: Antiquated Skirt": 0x15D76838, - - "FK: Nameless Knight Helm": 0x143B5FC0, - "FK: Nameless Knight Armor": 0x143B63A8, - "FK: Nameless Knight Gauntlets": 0x143B6790, - "FK: Nameless Knight Leggings": 0x143B6B78, - - "FK: Sunlight Talisman": 0x00CA54E0, - "FK: Wolf's Blood Swordgrass": 0x4000016E, - "FK: Greatsword": 0x005C50D0, - - "FK: Sage's Coal": 0x40000838, - "FK: Stone Parma": 0x01443FD0, - "FK: Sage's Scroll": 0x40000854, - "FK: Crown of Dusk": 0x15D75C80, - - "FK: Lingering Dragoncrest Ring": 0x20004F2E, - "FK: Pharis's Hat": 0x1487AB00, - "FK: Black Bow of Pharis": 0x00D7E970, - - "FK: Dreamchaser's Ashes": 0x4000083C, - "FK: Great Axe": 0x006B9310, - "FK: Dragon Crest Shield": 0x01432E60, - "FK: Lightning Spear": 0x40362B30, - "FK: Atonement": 0x4039ADA0, - "FK: Great Magic Weapon": 0x40140118, - "FK: Cinders of a Lord - Abyss Watcher": 0x4000084B, - "FK: Soul of the Blood of the Wolf": 0x400002CD, - "FK: Soul of a Stray Demon": 0x400002E7, - "FK: Watchdogs of Farron Covenant": 0x20002724, -} - -catacombs_of_carthus_table = { - "CC: Carthus Pyromancy Tome": 0x40000850, - "CC: Carthus Milkring": 0x20004FE2, - "CC: Grave Warden's Ashes": 0x4000083E, - "CC: Carthus Bloodring": 0x200050FA, - "CC: Grave Warden Pyromancy Tome": 0x40000853, - "CC: Old Sage's Blindfold": 0x11945BA0, - "CC: Witch's Ring": 0x20004F11, - "CC: Black Blade": 0x004CC070, - "CC: Soul of High Lord Wolnir": 0x400002D6, - "CC: Soul of a Demon": 0x400002E3, -} - -smouldering_lake_table = { - "SL: Shield of Want": 0x0144B500, - "SL: Speckled Stoneplate Ring": 0x20004E7A, - "SL: Dragonrider Bow": 0x00D6B0F0, - "SL: Lightning Stake": 0x40389C30, - "SL: Izalith Pyromancy Tome": 0x40000851, - "SL: Black Knight Sword": 0x005F5E10, - "SL: Quelana Pyromancy Tome": 0x40000852, - "SL: Toxic Mist": 0x4024F108, - "SL: White Hair Talisman": 0x00CAF120, - "SL: Izalith Staff": 0x00C96A80, - "SL: Sacred Flame": 0x40284880, - "SL: Fume Ultra Greatsword": 0x0060E4B0, - "SL: Black Iron Greatshield": 0x0150EA00, - "SL: Soul of the Old Demon King": 0x400002D0, - "SL: Knight Slayer's Ring": 0x20005000, -} - -irithyll_of_the_boreal_valley_table = { - "IBV: Dorhys' Gnawing": 0x40363EB8, - "IBV: Witchtree Branch": 0x00C94370, - "IBV: Magic Clutch Ring": 0x2000500A, - "IBV: Ring of the Sun's First Born": 0x20004F1B, - "IBV: Roster of Knights": 0x4000006C, - "IBV: Pontiff's Right Eye": 0x2000510E, - - "IBV: Yorshka's Spear": 0x008C3A70, - "IBV: Great Heal": 0x40356FB0, - - "IBV: Smough's Great Hammer": 0x007E30B0, - "IBV: Leo Ring": 0x20004EE8, - "IBV: Excrement-covered Ashes": 0x40000862, - - "IBV: Dark Stoneplate Ring": 0x20004E70, - "IBV: Easterner's Ashes": 0x40000868, - "IBV: Painting Guardian's Curved Sword": 0x003E6890, - "IBV: Painting Guardian Hood": 0x156C8CC0, - "IBV: Painting Guardian Gown": 0x156C90A8, - "IBV: Painting Guardian Gloves": 0x156C9490, - "IBV: Painting Guardian Waistcloth": 0x156C9878, - "IBV: Dragonslayer Greatbow": 0x00CF8500, - "IBV: Reversal Ring": 0x20005104, - "IBV: Brass Helm": 0x1501BD00, - "IBV: Brass Armor": 0x1501C0E8, - "IBV: Brass Gauntlets": 0x1501C4D0, - "IBV: Brass Leggings": 0x1501C8B8, - "IBV: Ring of Favor": 0x20004E3E, - "IBV: Golden Ritual Spear": 0x00C83200, - "IBV: Soul of Pontiff Sulyvahn": 0x400002D4, - "IBV: Aldrich Faithful Covenant": 0x2000272E, - "IBV: Drang Twinspears": 0x00F5AAA0, -} - -irithyll_dungeon_table = { - "ID: Bellowing Dragoncrest Ring": 0x20004F07, - "ID: Jailbreaker's Key": 0x400007D7, - "ID: Prisoner Chief's Ashes": 0x40000863, - "ID: Old Sorcerer Hat": 0x1496ED40, - "ID: Old Sorcerer Coat": 0x1496F128, - "ID: Old Sorcerer Gauntlets": 0x1496F510, - "ID: Old Sorcerer Boots": 0x1496F8F8, - "ID: Great Magic Shield": 0x40144F38, - - "ID: Dragon Torso Stone": 0x4000017A, - "ID: Lightning Blade": 0x4036C770, - "ID: Profaned Coal": 0x4000083A, - "ID: Xanthous Ashes": 0x40000864, - "ID: Old Cell Key": 0x400007DC, - "ID: Pickaxe": 0x007DE290, - "ID: Profaned Flame": 0x402575D8, - "ID: Covetous Gold Serpent Ring": 0x20004FA6, - "ID: Jailer's Key Ring": 0x400007D8, - "ID: Dusk Crown Ring": 0x20004F4C, - "ID: Dark Clutch Ring": 0x20005028, - "ID: Karla's Ashes": 0x40000842 -} - -profaned_capital_table = { - "PC: Cursebite Ring": 0x20004E98, - "PC: Court Sorcerer Hood": 0x11BA8140, - "PC: Court Sorcerer Robe": 0x11BA8528, - "PC: Court Sorcerer Gloves": 0x11BA8910, - "PC: Court Sorcerer Trousers": 0x11BA8CF8, - "PC: Wrath of the Gods": 0x4035E0F8, - "PC: Logan's Scroll": 0x40000855, - "PC: Eleonora": 0x006CCB90, - "PC: Court Sorcerer's Staff": 0x00C91C60, - "PC: Greatshield of Glory": 0x01515F30, - "PC: Storm Ruler": 0x006132D0, - "PC: Cinders of a Lord - Yhorm the Giant": 0x4000084D, - "PC: Soul of Yhorm the Giant": 0x400002DC, -} - -anor_londo_table = { - "AL: Giant's Coal": 0x40000839, - "AL: Sun Princess Ring": 0x20004FBA, - "AL: Aldrich's Ruby": 0x2000508C, - "AL: Cinders of a Lord - Aldrich": 0x4000084C, - "AL: Soul of Aldrich": 0x400002D5, -} - -lothric_castle_table = { - "LC: Hood of Prayer": 0x13AA6A60, - "LC: Robe of Prayer": 0x13AA6E48, - "LC: Skirt of Prayer": 0x13AA7618, - - "LC: Sacred Bloom Shield": 0x013572C0, - "LC: Winged Knight Helm": 0x12EBAE40, - "LC: Winged Knight Armor": 0x12EBB228, - "LC: Winged Knight Gauntlets": 0x12EBB610, - "LC: Winged Knight Leggings": 0x12EBB9F8, - - "LC: Greatlance": 0x008A8CC0, - "LC: Sniper Crossbow": 0x00D83790, - "LC: Spirit Tree Crest Shield": 0x014466E0, - "LC: Red Tearstone Ring": 0x20004ECA, - "LC: Caitha's Chime": 0x00CA06C0, - "LC: Braille Divine Tome of Lothric": 0x40000848, - "LC: Knight's Ring": 0x20004FEC, - "LC: Irithyll Rapier": 0x002E8A10, - "LC: Sunlight Straight Sword": 0x00203230, - "LC: Soul of Dragonslayer Armour": 0x400002D1, - - # The Black Hand Gotthard corpse appears when you have defeated Yhorm and Aldrich and triggered the cutscene - "LC: Grand Archives Key": 0x400007DE, # On Black Hand Gotthard corpse - "LC: Gotthard Twinswords": 0x00F53570 # On Black Hand Gotthard corpse -} - -consumed_king_garden_table = { - "CKG: Dragonscale Ring": 0x2000515E, - "CKG: Shadow Mask": 0x14D3F640, - "CKG: Shadow Garb": 0x14D3FA28, - "CKG: Shadow Gauntlets": 0x14D3FE10, - "CKG: Shadow Leggings": 0x14D401F8, - "CKG: Claw": 0x00A7D8C0, - "CKG: Soul of Consumed Oceiros": 0x400002CE, - "CKG: Magic Stoneplate Ring": 0x20004E66, - # "CKG: Path of the Dragon Gesture": 0x40002346, I can't technically randomize it as it is a gesture and not an item -} - -grand_archives_table = { - "GA: Avelyn": 0x00D6FF10, - "GA: Witch's Locks": 0x00B7B740, - "GA: Power Within": 0x40253B40, - "GA: Scholar Ring": 0x20004EB6, - "GA: Soul Stream": 0x4018B820, - "GA: Fleshbite Ring": 0x20004EA2, - "GA: Crystal Chime": 0x00CA2DD0, - "GA: Golden Wing Crest Shield": 0x0143CAA0, - "GA: Onikiri and Ubadachi": 0x00F58390, - "GA: Hunter's Ring": 0x20004FF6, - "GA: Divine Pillars of Light": 0x4038C340, - "GA: Cinders of a Lord - Lothric Prince": 0x4000084E, - "GA: Soul of the Twin Princes": 0x400002DB, - "GA: Sage's Crystal Staff": 0x00C8CE40, - "GA: Outrider Knight Helm": 0x1328B740, - "GA: Outrider Knight Armor": 0x1328BB28, - "GA: Outrider Knight Gauntlets": 0x1328BF10, - "GA: Outrider Knight Leggings": 0x1328C2F8, - "GA: Crystal Scroll": 0x40000856, -} - -untended_graves_table = { - "UG: Ashen Estus Ring": 0x200050E6, - "UG: Black Knight Glaive": 0x009AE070, - "UG: Hornet Ring": 0x20004F9C, - "UG: Chaos Blade": 0x004C9960, - "UG: Blacksmith Hammer": 0x007E57C0, - "UG: Eyes of a Fire Keeper": 0x4000085A, - "UG: Coiled Sword Fragment": 0x4000015F, - "UG: Soul of Champion Gundyr": 0x400002C8, -} - -archdragon_peak_table = { - "AP: Lightning Clutch Ring": 0x20005014, - "AP: Ancient Dragon Greatshield": 0x013599D0, - "AP: Ring of Steel Protection": 0x20004E48, - "AP: Calamity Ring": 0x20005078, - "AP: Drakeblood Greatsword": 0x00609690, - "AP: Dragonslayer Spear": 0x008CAFA0, - - "AP: Thunder Stoneplate Ring": 0x20004E5C, - "AP: Great Magic Barrier": 0x40365628, - "AP: Dragon Chaser's Ashes": 0x40000867, - "AP: Twinkling Dragon Torso Stone": 0x40000184, - "AP: Dragonslayer Helm": 0x158B1140, - "AP: Dragonslayer Armor": 0x158B1528, - "AP: Dragonslayer Gauntlets": 0x158B1910, - "AP: Dragonslayer Leggings": 0x158B1CF8, - "AP: Ricard's Rapier": 0x002E3BF0, - "AP: Soul of the Nameless King": 0x400002D2, - "AP: Dragon Tooth": 0x007E09A0, - "AP: Havel's Greatshield": 0x013376F0, -} - -painted_world_table = { # DLC - "PW: Follower Javelin": 0x008CD6B0, - "PW: Frozen Weapon": 0x401408E8, - "PW: Millwood Greatbow": 0x00D85EA0, - "PW: Captains Ashes": 0x4000086A, - "PW: Millwood Battle Axe": 0x006D67D0, - "PW: Ethereal Oak Shield": 0x01450320, - "PW: Crow Quills": 0x00F66DF0, - "PW: Slave Knight Hood": 0x134EDCE0, - "PW: Slave Knight Armor": 0x134EE0C8, - "PW: Slave Knight Gauntlets": 0x134EE4B0, - "PW: Slave Knight Leggings": 0x134EE898, - "PW: Way of White Corona": 0x403642A0, - "PW: Crow Talons": 0x00A89C10, - "PW: Quakestone Hammer": 0x007ECCF0, - "PW: Earth Seeker": 0x006D8EE0, - "PW: Follower Torch": 0x015F1AD0, - "PW: Follower Shield": 0x0135C0E0, - "PW: Follower Sabre": 0x003EDDC0, - "PW: Snap Freeze": 0x401A90C8, - "PW: Floating Chaos": 0x40257DA8, - "PW: Pyromancer's Parting Flame": 0x00CC9ED0, - "PW: Vilhelm's Helm": 0x11312D00, - "PW: Vilhelm's Armor": 0x113130E8, - "PW: Vilhelm's Gauntlets": 0x113134D0, - "PW: Vilhelm's Leggings": 0x113138B8, - "PW: Valorheart": 0x00F646E0, # GRAVETENDER FIGHT - "PW: Champions Bones": 0x40000869, # GRAVETENDER FIGHT - "PW: Onyx Blade": 0x00222E00, # VILHELM FIGHT - "PW: Soul of Sister Friede": 0x400002E8, - "PW: Titanite Slab": 0x400003EB, - "PW: Chillbite Ring": 0x20005208, - "PW: Contraption Key": 0x4000086B # VILHELM FIGHT/NEEDED TO PROGRESS THROUGH PW -} - -dreg_heap_table = { # DLC - "DH: Loincloth": 0x11B2EBD8, - "DH: Aquamarine Dagger": 0x00116520, - "DH: Murky Hand Scythe": 0x00118C30, - "DH: Murky Longstaff": 0x00CCC5E0, - "DH: Great Soul Dregs": 0x401879A0, - "DH: Lothric War Banner": 0x00CCC5E0, - "DH: Projected Heal": 0x40364688, - "DH: Desert Pyromancer Hood": 0x14DB9760, - "DH: Desert Pyromancer Garb": 0x14DB9B48, - "DH: Desert Pyromancer Gloves": 0x14DB9F30, - "DH: Desert Pyromancer Skirt": 0x14DBA318, - "DH: Giant Door Shield": 0x00F5F8C0, - "DH: Herald Curved Greatsword": 0x006159E0, - "DH: Flame Fan": 0x40258190, - "DH: Soul of the Demon Prince": 0x400002EA, - "DH: Small Envoy Banner": 0x4000086C # NEEDED TO TRAVEL TO RINGED CITY -} - -ringed_city_table = { # DLC - "RC: Ruin Sentinel Helm": 0x14CC5520, - "RC: Ruin Sentinel Armor": 0x14CC5908, - "RC: Ruin Sentinel Gauntlets": 0x14CC5CF0, - "RC: Ruin Sentinel Leggings": 0x14CC60D8, - "RC: Black Witch Veil": 0x14FA1BE0, - "RC: Black Witch Hat": 0x14EAD9A0, - "RC: Black Witch Garb": 0x14EADD88, - "RC: Black Witch Wrappings": 0x14EAE170, - "RC: Black Witch Trousers": 0x14EAE558, - "RC: White Preacher Head": 0x14153A20, - "RC: Havel's Ring": 0x20004E34, - "RC: Ringed Knight Spear": 0x008CFDC0, - "RC: Dragonhead Shield": 0x0135E7F0, - "RC: Ringed Knight Straight Sword": 0x00225510, - "RC: Preacher's Right Arm": 0x00CD1400, - "RC: White Birch Bow": 0x00D77440, - "RC: Church Guardian Shiv": 0x4000013B, # Assigned to "Demon's Scar" - "RC: Dragonhead Greatshield": 0x01452A30, - "RC: Ringed Knight Paired Greatswords": 0x00F69500, - "RC: Shira's Crown": 0x11C22260, - "RC: Shira's Armor": 0x11C22648, - "RC: Shira's Gloves": 0x11C22A30, - "RC: Shira's Trousers": 0x11C22E18, - "RC: Titanite Slab": 0x400003EB, # SHIRA DROP - "RC: Crucifix of the Mad King": 0x008D4BE0, # SHIRA DROP - "RC: Sacred Chime of Filianore": 0x00CCECF0, # SHIRA DROP - "RC: Iron Dragonslayer Helm": 0x1405F7E0, - "RC: Iron Dragonslayer Armor": 0x1405FBC8, - "RC: Iron Dragonslayer Gauntlets": 0x1405FFB0, - "RC: Iron Dragonslayer Leggings": 0x14060398, - "RC: Lightning Arrow": 0x40358B08, - "RC: Ritual Spear Fragment": 0x4000028A, # Assigned to "Frayed Blade" - "RC: Antiquated Plain Garb": 0x11B2E408, - "RC: Violet Wrappings": 0x11B2E7F0, # Assigned to "Gael's Greatsword" - "RC: Soul of Darkeater Midir": 0x400002EB, - "RC: Soul of Slave Knight Gael": 0x400002E9, - "RC: Blood of the Dark Souls": 0x4000086E, # Assigned to "Repeating Crossbow" -} - -progressive_locations = { - # Upgrade materials - **{"Titanite Shard #"+str(i): 0x400003E8 for i in range(1, 11)}, - **{"Large Titanite Shard #"+str(i): 0x400003E9 for i in range(1, 11)}, - **{"Titanite Chunk #"+str(i): 0x400003EA for i in range(1, 6)}, - **{"Titanite Slab #"+str(i): 0x400003EB for i in range(1, 4)}, - - # Healing - **{"Estus Shard #"+str(i): 0x4000085D for i in range(1, 16)}, - **{"Undead Bone Shard #"+str(i): 0x4000085F for i in range(1, 6)}, - - # Items - **{"Firebomb #"+str(i): 0x40000124 for i in range(1, 5)}, - **{"Throwing Knife #"+str(i): 0x40000136 for i in range(1, 3)}, - - # Souls - **{"Soul of a Deserted Corpse #" + str(i): 0x40000191 for i in range(1, 6)}, - **{"Large Soul of a Deserted Corpse #" + str(i): 0x40000192 for i in range(1, 6)}, - **{"Soul of an Unknown Traveler #" + str(i): 0x40000193 for i in range(1, 6)}, - **{"Large Soul of an Unknown Traveler #" + str(i): 0x40000194 for i in range(1, 6)} -} - -progressive_locations_2 = { - ##Added by Br00ty - "HWL: Gold Pine Resin #": 0x4000014B, - "US: Charcoal Pine Resin #": 0x4000014A, - "FK: Gold Pine Bundle #": 0x40000155, - "CC: Carthus Rouge #": 0x4000014F, - "ID: Pale Pine Resin #": 0x40000150, - **{"Titanite Scale #" + str(i): 0x400003FC for i in range(1, 27)}, - **{"Fading Soul #" + str(i): 0x40000190 for i in range(1, 4)}, - **{"Ring of Sacrifice #"+str(i): 0x20004EF2 for i in range(1, 5)}, - **{"Homeward Bone #"+str(i): 0x4000015E for i in range(1, 17)}, - **{"Ember #"+str(i): 0x400001F4 for i in range(1, 46)}, -} - -progressive_locations_3 = { - **{"Green Blossom #" + str(i): 0x40000104 for i in range(1, 7)}, - **{"Human Pine Resin #" + str(i): 0x4000014E for i in range(1, 3)}, - **{"Charcoal Pine Bundle #" + str(i): 0x40000154 for i in range(1, 3)}, - **{"Rotten Pine Resin #" + str(i): 0x40000157 for i in range(1, 3)}, - **{"Pale Tongue #" + str(i): 0x40000175 for i in range(1, 3)}, - **{"Alluring Skull #" + str(i): 0x40000126 for i in range(1, 3)}, - **{"Undead Hunter Charm #" + str(i): 0x40000128 for i in range(1, 3)}, - **{"Duel Charm #" + str(i): 0x40000130 for i in range(1, 3)}, - **{"Rusted Coin #" + str(i): 0x400001C7 for i in range(1, 3)}, - **{"Rusted Gold Coin #" + str(i): 0x400001C9 for i in range(1, 4)}, - **{"Titanite Chunk #"+str(i): 0x400003EA for i in range(1, 17)}, - **{"Twinkling Titanite #"+str(i): 0x40000406 for i in range(1, 8)} -} - -dlc_progressive_locations = { #71 - **{"Large Soul of an Unknown Traveler $"+str(i): 0x40000194 for i in range(1, 10)}, - **{"Soul of a Weary Warrior $"+str(i): 0x40000197 for i in range(1, 6)}, - **{"Large Soul of a Weary Warrior $"+str(i): 0x40000198 for i in range(1, 7)}, - **{"Soul of a Crestfallen Knight $"+str(i): 0x40000199 for i in range(1, 7)}, - **{"Large Soul of a Crestfallen Knight $"+str(i): 0x4000019A for i in range(1, 4)}, - **{"Homeward Bone $"+str(i): 0x4000015E for i in range(1, 7)}, - **{"Large Titanite Shard $"+str(i): 0x400003E9 for i in range(1, 4)}, - **{"Titanite Chunk $"+str(i): 0x400003EA for i in range(1, 16)}, - **{"Twinkling Titanite $"+str(i): 0x40000406 for i in range(1, 6)}, - **{"Rusted Coin $"+str(i): 0x400001C7 for i in range(1, 4)}, - **{"Ember $"+str(i): 0x400001F4 for i in range(1, 11)} -} - -location_tables = [fire_link_shrine_table, firelink_shrine_bell_tower_table, high_wall_of_lothric, undead_settlement_table, road_of_sacrifice_table, - cathedral_of_the_deep_table, farron_keep_table, catacombs_of_carthus_table, smouldering_lake_table, irithyll_of_the_boreal_valley_table, - irithyll_dungeon_table, profaned_capital_table, anor_londo_table, lothric_castle_table, consumed_king_garden_table, - grand_archives_table, untended_graves_table, archdragon_peak_table, progressive_locations, progressive_locations_2, progressive_locations_3, - painted_world_table, dreg_heap_table, ringed_city_table, dlc_progressive_locations] - -location_dictionary = {**fire_link_shrine_table, **firelink_shrine_bell_tower_table, **high_wall_of_lothric, **undead_settlement_table, **road_of_sacrifice_table, - **cathedral_of_the_deep_table, **farron_keep_table, **catacombs_of_carthus_table, **smouldering_lake_table, **irithyll_of_the_boreal_valley_table, - **irithyll_dungeon_table, **profaned_capital_table, **anor_londo_table, **lothric_castle_table, **consumed_king_garden_table, - **grand_archives_table, **untended_graves_table, **archdragon_peak_table, **progressive_locations, **progressive_locations_2, **progressive_locations_3, - **painted_world_table, **dreg_heap_table, **ringed_city_table, **dlc_progressive_locations}