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>
This commit is contained in:
Bryce Wilson 2023-07-03 23:46:18 -07:00 committed by GitHub
parent 532c4c068f
commit d35d3b629e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 2460 additions and 1502 deletions

View File

@ -69,7 +69,6 @@ non_apworlds: set = {
"ChecksFinder",
"Clique",
"DLCQuest",
"Dark Souls III",
"Final Fantasy",
"Hollow Knight",
"Hylics 2",

File diff suppressed because it is too large Load Diff

View File

@ -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})

View File

@ -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,
}

View File

@ -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)

View File

@ -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}

View File

@ -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}