diff --git a/WebHostLib/downloads.py b/WebHostLib/downloads.py
index 9b93b82c..0704f5d0 100644
--- a/WebHostLib/downloads.py
+++ b/WebHostLib/downloads.py
@@ -78,6 +78,8 @@ def download_slot_file(room_id, player_id: int):
fname = f"AP_{app.jinja_env.filters['suuid'](room_id)}_SP.apv6"
elif slot_data.game == "Super Mario 64":
fname = f"AP_{app.jinja_env.filters['suuid'](room_id)}_SP.apsm64ex"
+ elif slot_data.game == "Dark Souls III":
+ fname = f"AP_{app.jinja_env.filters['suuid'](room_id)}.json"
else:
return "Game download not supported."
return send_file(io.BytesIO(slot_data.data), as_attachment=True, attachment_filename=fname)
diff --git a/WebHostLib/templates/macros.html b/WebHostLib/templates/macros.html
index 70b41fad..6ed2ca49 100644
--- a/WebHostLib/templates/macros.html
+++ b/WebHostLib/templates/macros.html
@@ -43,6 +43,9 @@
{% elif patch.game in ["A Link to the Past", "Secret of Evermore", "Super Metroid", "SMZ3"] %}
Download Patch File...
+ {% elif patch.game == "Dark Souls III" %}
+
+ Download JSON File...
{% else %}
No file to download for this game.
{% endif %}
diff --git a/WebHostLib/upload.py b/WebHostLib/upload.py
index e6b2c7de..00825df4 100644
--- a/WebHostLib/upload.py
+++ b/WebHostLib/upload.py
@@ -80,6 +80,11 @@ def upload_zip_to_db(zfile: zipfile.ZipFile, owner=None, meta={"race": False}, s
slots.add(Slot(data=zfile.open(file, "r").read(), player_name=slot_name,
player_id=int(slot_id[1:]), game="Ocarina of Time"))
+ elif file.filename.endswith(".json"):
+ _, seed_name, slot_id, slot_name = file.filename.split('.')[0].split('-', 3)
+ slots.add(Slot(data=zfile.open(file, "r").read(), player_name=slot_name,
+ player_id=int(slot_id[1:]), game="Dark Souls III"))
+
elif file.filename.endswith(".txt"):
spoiler = zfile.open(file, "r").read().decode("utf-8-sig")
diff --git a/worlds/dark_souls_3/Options.py b/worlds/dark_souls_3/Options.py
new file mode 100644
index 00000000..6b52cf53
--- /dev/null
+++ b/worlds/dark_souls_3/Options.py
@@ -0,0 +1,41 @@
+import typing
+from Options import Toggle, Option
+
+
+class AutoEquipOption(Toggle):
+ """Automatically equips any received armor or left/right weapons."""
+ 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"
+
+
+class NoWeaponRequirementsOption(Toggle):
+ """Disable the weapon requirements by removing any movement or damage penalties.
+ Permitting you to use any weapon early"""
+ display_name = "No Weapon Requirements"
+
+
+class RandomizeWeaponsLevelOption(Toggle):
+ """Enable this option to upgrade 33% ( based on the probability chance ) of the pool of weapons to a random value
+ between +1 and +5/+10"""
+ display_name = "Randomize weapons level"
+
+
+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"""
+ display_name = "Late Basin of Vows"
+
+
+dark_souls_options: typing.Dict[str, type(Option)] = {
+ "auto_equip": AutoEquipOption,
+ "lock_equip": LockEquipOption,
+ "no_weapon_requirements": NoWeaponRequirementsOption,
+ "randomize_weapons_level": RandomizeWeaponsLevelOption,
+ "late_basin_of_vows": LateBasinOfVowsOption,
+}
+
diff --git a/worlds/dark_souls_3/__init__.py b/worlds/dark_souls_3/__init__.py
new file mode 100644
index 00000000..f8ed9fb0
--- /dev/null
+++ b/worlds/dark_souls_3/__init__.py
@@ -0,0 +1,266 @@
+# world/dark_souls_3/__init__.py
+import json
+import os
+
+from .Options import dark_souls_options
+from .data.items_data import weapons_upgrade_5_table, weapons_upgrade_10_table, item_dictionary_table, key_items_list
+from .data.locations_data import location_dictionary_table, cemetery_of_ash_table, 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
+from ..AutoWorld import World, WebWorld
+from BaseClasses import MultiWorld, Location, Region, Item, RegionType, Entrance, Tutorial, ItemClassification
+from ..generic.Rules import set_rule
+
+
+class DarkSouls3Web(WebWorld):
+ tutorials = [Tutorial(
+ "Multiworld Setup Tutorial",
+ "A guide to setting up the Archipelago Dark Souls III randomizer on your computer.",
+ "English",
+ "setup_en.md",
+ "setup/en",
+ ["Marech"]
+ )]
+
+
+class DarkSouls3World(World):
+ """
+ Dark souls III is an Action role-playing game and is part of the Souls series developed by FromSoftware.
+ Played in a third-person perspective, players have access to various weapons, armour, magic, and consumables that
+ they can use to fight their enemies.
+ """
+
+ game: str = "Dark Souls III"
+ options = dark_souls_options
+ topology_present: bool = True
+ remote_items: bool = False
+ remote_start_inventory: bool = False
+ web = DarkSouls3Web()
+ data_version = 1
+ base_id = 100000
+ item_name_to_id = {name: id for id, name in enumerate(item_dictionary_table, base_id)}
+ location_name_to_id = {name: id for id, name in enumerate(location_dictionary_table, base_id)}
+
+ def __init__(self, world: MultiWorld, player: int):
+ super().__init__(world, player)
+ self.locked_items = []
+ self.locked_locations = []
+ self.main_path_locations = []
+
+ def create_item(self, name: str) -> Item:
+ data = self.item_name_to_id[name]
+
+ if name in key_items_list:
+ item_classification = ItemClassification.progression
+ elif name in weapons_upgrade_5_table or name in weapons_upgrade_10_table:
+ item_classification = ItemClassification.useful
+ else:
+ item_classification = ItemClassification.filler
+
+ return DarkSouls3Item(name, item_classification, data, self.player)
+
+ def create_regions(self):
+ menu_region = Region("Menu", RegionType.Generic, "Menu", self.player)
+ self.world.regions.append(menu_region)
+
+ # Create all Vanilla regions of Dark Souls III
+ cemetery_of_ash_region = self.create_region("Cemetery Of Ash", cemetery_of_ash_table)
+ 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)
+
+ # Create the entrance to connect those regions
+ menu_region.exits.append(Entrance(self.player, "New Game", menu_region))
+ self.world.get_entrance("New Game", self.player).connect(cemetery_of_ash_region)
+ cemetery_of_ash_region.exits.append(Entrance(self.player, "Goto Firelink Shrine", cemetery_of_ash_region))
+ self.world.get_entrance("Goto Firelink Shrine", 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.world.get_entrance("Goto High Wall of Lothric", self.player).connect(high_wall_of_lothric_region)
+ self.world.get_entrance("Goto Kiln Of The First Flame", self.player).connect(kiln_of_the_first_flame_region)
+ self.world.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.world.get_entrance("Goto Undead Settlement", self.player).connect(undead_settlement_region)
+ self.world.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.world.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.world.get_entrance("Goto Cathedral", self.player).connect(cathedral_of_the_deep_region)
+ self.world.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.world.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.world.get_entrance("Goto Irithyll of the boreal", self.player).\
+ connect(irithyll_of_the_boreal_valley_region)
+ self.world.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.world.get_entrance("Goto Irithyll dungeon", self.player).connect(irithyll_dungeon_region)
+ self.world.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.world.get_entrance("Goto Archdragon peak", self.player).connect(archdragon_peak_region)
+ self.world.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.world.get_entrance("Goto Consumed King Garden", self.player).connect(consumed_king_garden_region)
+ self.world.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.world.get_entrance("Goto Untended Graves", self.player).connect(untended_graves_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, RegionType.Generic, region_name, self.player)
+ if location_table:
+ for name, address in location_table.items():
+ location = DarkSouls3Location(self.player, name, self.location_name_to_id[name], new_region)
+ new_region.locations.append(location)
+ self.world.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":
+ self.world.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.world.get_entrance("Goto Bell Tower", self.player),
+ lambda state: state.has("Mortician's Ashes", self.player))
+ set_rule(self.world.get_entrance("Goto Undead Settlement", self.player),
+ lambda state: state.has("Small Lothric Banner", self.player))
+ set_rule(self.world.get_entrance("Goto Lothric Castle", self.player),
+ lambda state: state.has("Basin of Vows", self.player))
+ set_rule(self.world.get_location("HWL: Soul of the Dancer", self.player),
+ lambda state: state.has("Basin of Vows", self.player))
+ set_rule(self.world.get_entrance("Goto Irithyll of the boreal", self.player),
+ lambda state: state.has("Small Doll", self.player))
+ set_rule(self.world.get_entrance("Goto Archdragon peak", self.player),
+ lambda state: state.has("Path of the Dragon Gesture", self.player))
+ set_rule(self.world.get_entrance("Goto Profaned capital", self.player),
+ lambda state: state.has("Storm Ruler", self.player))
+ set_rule(self.world.get_entrance("Goto Grand Archives", self.player),
+ lambda state: state.has("Grand Archives Key", self.player))
+ set_rule(self.world.get_entrance("Goto 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))
+
+ self.world.completion_condition[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)
+
+ 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.world.late_basin_of_vows[self.player]:
+ self.world.get_location("IBV: Soul of Pontiff Sulyvahn", self.player).place_locked_item(item)
+ else:
+ self.world.itempool += [item]
+
+ def generate_output(self, output_directory: str):
+ # Depending on the specified option, modify items hexadecimal value to add an upgrade level
+ item_dictionary = item_dictionary_table.copy()
+ if self.world.randomize_weapons_level[self.player]:
+ # Randomize some weapons upgrades
+ for name in weapons_upgrade_5_table.keys():
+ if self.world.random.randint(0, 100) < 33:
+ value = self.world.random.randint(1, 5)
+ item_dictionary[name] += value
+
+ for name in weapons_upgrade_10_table.keys():
+ if self.world.random.randint(0, 100) < 33:
+ value = self.world.random.randint(1, 10)
+ item_dictionary[name] += value
+
+ # Create the mandatory lists to generate the player's output file
+ items_id = []
+ items_address = []
+ locations_id = []
+ locations_address = []
+ locations_target = []
+ for location in self.world.get_filled_locations():
+ if location.item.player == self.player:
+ items_id.append(location.item.code)
+ items_address.append(item_dictionary[location.item.name])
+
+ if location.player == self.player:
+ locations_address.append(location_dictionary_table[location.name])
+ locations_id.append(location.address)
+ if location.item.player == self.player:
+ locations_target.append(item_dictionary[location.item.name])
+ else:
+ locations_target.append(0)
+
+ data = {
+ "options": {
+ "auto_equip": self.world.auto_equip[self.player].value,
+ "lock_equip": self.world.lock_equip[self.player].value,
+ "no_weapon_requirements": self.world.no_weapon_requirements[self.player].value,
+ },
+ "seed": self.world.seed_name, # to verify the server's multiworld
+ "slot": self.world.player_name[self.player], # to connect to server
+ "base_id": self.base_id, # to merge location and items lists
+ "locationsId": locations_id,
+ "locationsAddress": locations_address,
+ "locationsTarget": locations_target,
+ "itemsId": items_id,
+ "itemsAddress": items_address
+ }
+
+ # generate the file
+ filename = f"AP-{self.world.seed_name}-P{self.player}-{self.world.player_name[self.player]}.json"
+ with open(os.path.join(output_directory, filename), 'w') as outfile:
+ json.dump(data, outfile)
+
+
+class DarkSouls3Location(Location):
+ game: str = "Dark Souls III"
+
+
+class DarkSouls3Item(Item):
+ game: str = "Dark Souls III"
diff --git a/worlds/dark_souls_3/data/items_data.py b/worlds/dark_souls_3/data/items_data.py
new file mode 100644
index 00000000..b7c5c3d1
--- /dev/null
+++ b/worlds/dark_souls_3/data/items_data.py
@@ -0,0 +1,376 @@
+"""
+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,
+
+}
+
+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,
+}
+
+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,
+ "Great Magic Shield": 0x40144F38,
+ "Greatshield of Glory": 0x01515F30,
+ "Sacred Bloom Shield": 0x013572C0,
+ "Golden Wing Crest Shield": 0x0143CAA0,
+ "Ancient Dragon Greatshield": 0x013599D0,
+ "Spirit Tree Crest Shield": 0x014466E0,
+
+}
+
+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,
+}
+
+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,
+}
+
+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,
+}
+
+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,
+
+}
+
+misc_items_table = {
+ "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,
+ "Path of the Dragon Gesture": 0x40002346,
+ "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,
+}
+
+key_items_list = {
+ "Small Lothric Banner",
+ "Basin of Vows",
+ "Small Doll",
+ "Path of the Dragon Gesture",
+ "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"
+}
+
+item_dictionary_table = {**weapons_upgrade_5_table, **weapons_upgrade_10_table, **shields_table, **armor_table, **rings_table, **spells_table, **misc_items_table, **goods_table}
diff --git a/worlds/dark_souls_3/data/locations_data.py b/worlds/dark_souls_3/data/locations_data.py
new file mode 100644
index 00000000..bf85e6eb
--- /dev/null
+++ b/worlds/dark_souls_3/data/locations_data.py
@@ -0,0 +1,422 @@
+"""
+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
+"""
+
+cemetery_of_ash_table = {
+}
+
+fire_link_shrine_table = {
+ "FS: Broken Straight Sword": 0x001EF9B0, # Multiple
+ "FS: East-West Shield": 0x0142B930,
+}
+
+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,
+}
+
+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, # Key item for Grave Key for Firelink Towerlocations
+ "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,
+}
+
+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, # Shop
+ "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, # Shop
+
+ "RS: Great Club": 0x007B4A80,
+ "RS: Exile Greatsword": 0x005DD770,
+
+ "RS: Farron Coal ": 0x40000837, # Shop
+
+ "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,
+}
+
+cathedral_of_the_deep_table = {
+ "CD: Paladin's Ashes": 0x4000083D, #Shop
+ "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, # Shop
+
+ "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, # Shop #Unique
+ "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, # Shop #Unique
+ "FK: Great Axe": 0x006B9310, # Multiple
+ "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,
+}
+
+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: Greirat's Ashes": 0x4000083F,
+ "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,
+}
+
+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,
+}
+
+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: Sunlight Straight Sword": 0x00203230,
+ "LC: Grand Archives Key": 0x400007DE,
+ "LC: Soul of Dragonslayer Armour": 0x400002D1,
+}
+
+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: Path of the Dragon Gesture": 0x40002346,
+}
+
+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,
+}
+
+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,
+}
+
+location_dictionary_table = {**cemetery_of_ash_table, **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}
diff --git a/worlds/dark_souls_3/docs/en_Dark Souls III.md b/worlds/dark_souls_3/docs/en_Dark Souls III.md
new file mode 100644
index 00000000..5860073c
--- /dev/null
+++ b/worlds/dark_souls_3/docs/en_Dark Souls III.md
@@ -0,0 +1,22 @@
+# Dark Souls III
+
+## Where is the settings page?
+
+The [player settings page for this game](../player-settings) contains all the options you need to configure and export a
+config file.
+
+## What does randomization do to this game?
+
+In Dark Souls III, all unique items you can earn from a static corpse, a chest or the death of a Boss/NPC are randomized.
+This exclude the upgrade materials such as the titanite shards, the estus shards and the consumables which remain at
+the same location. I also added an option available from the settings page to randomize the level of the generated
+weapons( from +0 to +10/+5 )
+
+## What Dark Souls III items can appear in other players' worlds?
+
+Every unique items from Dark Souls III can appear in other player's worlds, such as a piece of armor, an upgraded weapon
+or a key item.
+
+## What does another world's item look like in Dark Souls III?
+
+In Dark Souls III, items which need to be sent to other worlds appear as a Prism Stone.
\ No newline at end of file
diff --git a/worlds/dark_souls_3/docs/setup_en.md b/worlds/dark_souls_3/docs/setup_en.md
new file mode 100644
index 00000000..e0802928
--- /dev/null
+++ b/worlds/dark_souls_3/docs/setup_en.md
@@ -0,0 +1,35 @@
+# Dark Souls III Randomizer Setup Guide
+
+## Required Software
+
+- [Dark Souls III](https://store.steampowered.com/app/374320/DARK_SOULS_III/)
+- [Dark Souls III AP Client](https://github.com/Marechal-L/Dark-Souls-III-Archipelago-client)
+
+## General Concept
+
+The Dark Souls III AP Client is a dinput8.dll triggered when launching Dark Souls III. This .dll file will launch a command
+prompt where you can read information about your run and write any command to interact with the Archipelago server.
+
+The randomization is performed by the AP.json file, an output file generated by the Archipelago server.
+
+## Installation Procedures
+
+**This client has only been tested with the Official Steam version of the game (v1.15/1.35) not matter which DLCs are installed**
+
+Get the dinput8.dll from the [Dark Souls III AP Client](https://github.com/Marechal-L/Dark-Souls-III-Archipelago-client).
+Then you need to add the two following files at the root folder of your game
+( e.g. "SteamLibrary\steamapps\common\DARK SOULS III\Game" ):
+- **dinput8.dll**
+- **AP.json** (renamed from the generated file AP-{ROOM_ID}.json)
+
+## Joining a MultiWorld Game
+
+1. Run DarkSoulsIII.exe or run the game through Steam
+2. Type in /connect {SERVER_IP}:{SERVER_PORT} in the "Windows Command Prompt" that opened
+3. Once connected, create a new game, choose a class and wait for the others before starting
+4. You can quit and launch at anytime during a game
+
+## Where do I get a config file?
+
+The [Player Settings](/games/Dark%20Souls%20III/player-settings) page on the website allows you to
+configure your personal settings and export them into a config file
\ No newline at end of file