Update ds3 locations and items (#819)

* DS3: Add more rules to avoid softlocks, remove Path of the Dragon gesture location/item and remove useless comments

* DS3: Add more Hostile NPCs locations/items

* DS3: Add missing key items to the key items list
This commit is contained in:
Ludovic Marechal 2022-07-26 09:31:16 +02:00 committed by GitHub
parent 3b2037a2d4
commit 288a623ab6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 64 additions and 24 deletions

View File

@ -39,7 +39,7 @@ class DarkSouls3World(World):
remote_items: bool = False remote_items: bool = False
remote_start_inventory: bool = False remote_start_inventory: bool = False
web = DarkSouls3Web() web = DarkSouls3Web()
data_version = 1 data_version = 2
base_id = 100000 base_id = 100000
item_name_to_id = {name: id for id, name in enumerate(item_dictionary_table, base_id)} 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)} location_name_to_id = {name: id for id, name in enumerate(location_dictionary_table, base_id)}
@ -167,17 +167,15 @@ class DarkSouls3World(World):
# Define the access rules to the entrances # Define the access rules to the entrances
set_rule(self.world.get_entrance("Goto Bell Tower", self.player), set_rule(self.world.get_entrance("Goto Bell Tower", self.player),
lambda state: state.has("Mortician's Ashes", self.player)) lambda state: state.has("Tower Key", self.player))
set_rule(self.world.get_entrance("Goto Undead Settlement", self.player), set_rule(self.world.get_entrance("Goto Undead Settlement", self.player),
lambda state: state.has("Small Lothric Banner", self.player)) lambda state: state.has("Small Lothric Banner", self.player))
set_rule(self.world.get_entrance("Goto Lothric Castle", self.player), set_rule(self.world.get_entrance("Goto Lothric Castle", self.player),
lambda state: state.has("Basin of Vows", 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), set_rule(self.world.get_entrance("Goto Irithyll of the boreal", self.player),
lambda state: state.has("Small Doll", self.player)) lambda state: state.has("Small Doll", self.player))
set_rule(self.world.get_entrance("Goto Archdragon peak", self.player), set_rule(self.world.get_entrance("Goto Archdragon peak", self.player),
lambda state: state.has("Path of the Dragon Gesture", self.player)) lambda state: state.can_reach("CKG: Soul of Consumed Oceiros", "Location", self.player))
set_rule(self.world.get_entrance("Goto Profaned capital", self.player), set_rule(self.world.get_entrance("Goto Profaned capital", self.player),
lambda state: state.has("Storm Ruler", self.player)) lambda state: state.has("Storm Ruler", self.player))
set_rule(self.world.get_entrance("Goto Grand Archives", self.player), set_rule(self.world.get_entrance("Goto Grand Archives", self.player),
@ -188,6 +186,23 @@ class DarkSouls3World(World):
state.has("Cinders of a Lord - Aldrich", self.player) and state.has("Cinders of a Lord - Aldrich", self.player) and
state.has("Cinders of a Lord - Lothric Prince", self.player)) state.has("Cinders of a Lord - Lothric Prince", self.player))
# Define the access rules to some specific locations
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_location("HWL: Greirat's Ashes", self.player),
lambda state: state.has("Cell Key", self.player))
set_rule(self.world.get_location("ID: Bellowing Dragoncrest Ring", self.player),
lambda state: state.has("Jailbreaker's Key", self.player))
set_rule(self.world.get_location("ID: Prisoner Chief's Ashes", self.player),
lambda state: state.has("Jailer's Key Ring", self.player))
set_rule(self.world.get_location("ID: Covetous Gold Serpent Ring", self.player),
lambda state: state.has("Old Cell Key", self.player))
black_hand_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.world.get_location("LC: Grand Archives Key", self.player), black_hand_gotthard_corpse_rule)
set_rule(self.world.get_location("LC: Gotthard Twinswords", self.player), black_hand_gotthard_corpse_rule)
self.world.completion_condition[self.player] = lambda state: \ 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 - Abyss Watcher", self.player) and \
state.has("Cinders of a Lord - Yhorm the Giant", self.player) and \ state.has("Cinders of a Lord - Yhorm the Giant", self.player) and \
@ -202,6 +217,12 @@ class DarkSouls3World(World):
else: else:
self.world.itempool += [item] self.world.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.world.itempool += [self.create_item("Soul of an Intrepid Hero")]
def generate_output(self, output_directory: str): def generate_output(self, output_directory: str):
# Depending on the specified option, modify items hexadecimal value to add an upgrade level # Depending on the specified option, modify items hexadecimal value to add an upgrade level
item_dictionary = item_dictionary_table.copy() item_dictionary = item_dictionary_table.copy()

View File

@ -51,7 +51,7 @@ weapons_upgrade_5_table = {
"Twin Princes' Greatsword": 0x005FAC30, "Twin Princes' Greatsword": 0x005FAC30,
"Storm Curved Sword": 0x003E4180, "Storm Curved Sword": 0x003E4180,
"Dragonslayer Swordspear": 0x008BC540, "Dragonslayer Swordspear": 0x008BC540,
"Sage's Crystal Staff": 0x00C8CE40,
} }
weapons_upgrade_10_table = { weapons_upgrade_10_table = {
@ -105,6 +105,7 @@ weapons_upgrade_10_table = {
"Sniper Crossbow": 0x00D83790, "Sniper Crossbow": 0x00D83790,
"Claw": 0x00A7D8C0, "Claw": 0x00A7D8C0,
"Drang Twinspears": 0x00F5AAA0,
} }
shields_table = { shields_table = {
@ -125,7 +126,6 @@ shields_table = {
"Dragon Crest Shield": 0x01432E60, "Dragon Crest Shield": 0x01432E60,
"Shield of Want": 0x0144B500, "Shield of Want": 0x0144B500,
"Black Iron Greatshield": 0x0150EA00, "Black Iron Greatshield": 0x0150EA00,
"Great Magic Shield": 0x40144F38,
"Greatshield of Glory": 0x01515F30, "Greatshield of Glory": 0x01515F30,
"Sacred Bloom Shield": 0x013572C0, "Sacred Bloom Shield": 0x013572C0,
"Golden Wing Crest Shield": 0x0143CAA0, "Golden Wing Crest Shield": 0x0143CAA0,
@ -291,6 +291,7 @@ rings_table = {
"Knight's Ring": 0x20004FEC, "Knight's Ring": 0x20004FEC,
"Red Tearstone Ring": 0x20004ECA, "Red Tearstone Ring": 0x20004ECA,
"Dragonscale Ring": 0x2000515E, "Dragonscale Ring": 0x2000515E,
"Knight Slayer's Ring": 0x20005000,
} }
spells_table = { spells_table = {
@ -311,10 +312,12 @@ spells_table = {
"Soul Stream": 0x4018B820, "Soul Stream": 0x4018B820,
"Divine Pillars of Light": 0x4038C340, "Divine Pillars of Light": 0x4038C340,
"Great Magic Barrier": 0x40365628, "Great Magic Barrier": 0x40365628,
"Great Magic Shield": 0x40144F38,
} }
misc_items_table = { misc_items_table = {
"Tower Key": 0x400007DF,
"Grave Key": 0x400007D9,
"Cell Key": 0x400007DA, "Cell Key": 0x400007DA,
"Small Lothric Banner": 0x40000836, "Small Lothric Banner": 0x40000836,
"Mortician's Ashes": 0x4000083B, "Mortician's Ashes": 0x4000083B,
@ -349,7 +352,6 @@ misc_items_table = {
"Xanthous Ashes": 0x40000864, "Xanthous Ashes": 0x40000864,
"Old Cell Key": 0x400007DC, "Old Cell Key": 0x400007DC,
"Jailer's Key Ring": 0x400007D8, "Jailer's Key Ring": 0x400007D8,
"Path of the Dragon Gesture": 0x40002346,
"Logan's Scroll": 0x40000855, "Logan's Scroll": 0x40000855,
"Storm Ruler": 0x006132D0, "Storm Ruler": 0x006132D0,
"Giant's Coal": 0x40000839, "Giant's Coal": 0x40000839,
@ -363,14 +365,19 @@ key_items_list = {
"Small Lothric Banner", "Small Lothric Banner",
"Basin of Vows", "Basin of Vows",
"Small Doll", "Small Doll",
"Path of the Dragon Gesture",
"Storm Ruler", "Storm Ruler",
"Grand Archives Key", "Grand Archives Key",
"Cinders of a Lord - Abyss Watcher", "Cinders of a Lord - Abyss Watcher",
"Cinders of a Lord - Yhorm the Giant", "Cinders of a Lord - Yhorm the Giant",
"Cinders of a Lord - Aldrich", "Cinders of a Lord - Aldrich",
"Cinders of a Lord - Lothric Prince", "Cinders of a Lord - Lothric Prince",
"Mortician's Ashes" "Mortician's Ashes",
"Cell Key",
"Tower Key",
"Jailbreaker's Key",
"Prisoner Chief's Ashes",
"Old Cell Key",
"Jailer's Key Ring",
} }
item_dictionary_table = {**weapons_upgrade_5_table, **weapons_upgrade_10_table, **shields_table, **armor_table, **rings_table, **spells_table, **misc_items_table, **goods_table} item_dictionary_table = {**weapons_upgrade_5_table, **weapons_upgrade_10_table, **shields_table, **armor_table, **rings_table, **spells_table, **misc_items_table, **goods_table}

View File

@ -9,8 +9,12 @@ cemetery_of_ash_table = {
} }
fire_link_shrine_table = { fire_link_shrine_table = {
"FS: Broken Straight Sword": 0x001EF9B0, # Multiple # "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: East-West Shield": 0x0142B930,
"FS: Uchigatana": 0x004C4B40,
"FS: Master's Attire": 0x148F5008,
"FS: Master's Gloves": 0x148F53F0,
} }
firelink_shrine_bell_tower_table = { firelink_shrine_bell_tower_table = {
@ -40,6 +44,7 @@ high_wall_of_lothric = {
"HWL: Soul of Boreal Valley Vordt": 0x400002CF, "HWL: Soul of Boreal Valley Vordt": 0x400002CF,
"HWL: Soul of the Dancer": 0x400002CA, "HWL: Soul of the Dancer": 0x400002CA,
"HWL: Way of Blue Covenant": 0x2000274C, "HWL: Way of Blue Covenant": 0x2000274C,
"HWL: Greirat's Ashes": 0x4000083F,
} }
undead_settlement_table = { undead_settlement_table = {
@ -53,7 +58,7 @@ undead_settlement_table = {
"US: Cleric Gloves": 0x11D90D90, "US: Cleric Gloves": 0x11D90D90,
"US: Cleric Trousers": 0x11D91178, "US: Cleric Trousers": 0x11D91178,
"US: Mortician's Ashes": 0x4000083B, # Key item for Grave Key for Firelink Towerlocations "US: Mortician's Ashes": 0x4000083B,
"US: Caestus": 0x00A7FFD0, "US: Caestus": 0x00A7FFD0,
"US: Plank Shield": 0x01346150, "US: Plank Shield": 0x01346150,
"US: Flame Stoneplate Ring": 0x20004E52, "US: Flame Stoneplate Ring": 0x20004E52,
@ -99,7 +104,7 @@ road_of_sacrifice_table = {
"RS: Butcher Knife": 0x006BE130, "RS: Butcher Knife": 0x006BE130,
"RS: Brigand Axe": 0x006B1DE0, "RS: Brigand Axe": 0x006B1DE0,
"RS: Braille Divine Tome of Carim": 0x40000847, # Shop "RS: Braille Divine Tome of Carim": 0x40000847,
"RS: Morne's Ring": 0x20004F1A, "RS: Morne's Ring": 0x20004F1A,
"RS: Twin Dragon Greatshield": 0x01513820, "RS: Twin Dragon Greatshield": 0x01513820,
"RS: Heretic's Staff": 0x00C8F550, "RS: Heretic's Staff": 0x00C8F550,
@ -121,12 +126,12 @@ road_of_sacrifice_table = {
"RS: Conjurator Manchettes": 0x149E9630, "RS: Conjurator Manchettes": 0x149E9630,
"RS: Conjurator Boots": 0x149E9A18, "RS: Conjurator Boots": 0x149E9A18,
"RS: Great Swamp Pyromancy Tome": 0x4000084F, # Shop "RS: Great Swamp Pyromancy Tome": 0x4000084F,
"RS: Great Club": 0x007B4A80, "RS: Great Club": 0x007B4A80,
"RS: Exile Greatsword": 0x005DD770, "RS: Exile Greatsword": 0x005DD770,
"RS: Farron Coal ": 0x40000837, # Shop "RS: Farron Coal ": 0x40000837,
"RS: Sellsword Twinblades": 0x00F42400, "RS: Sellsword Twinblades": 0x00F42400,
"RS: Sellsword Helm": 0x11481060, "RS: Sellsword Helm": 0x11481060,
@ -147,7 +152,7 @@ road_of_sacrifice_table = {
} }
cathedral_of_the_deep_table = { cathedral_of_the_deep_table = {
"CD: Paladin's Ashes": 0x4000083D, #Shop "CD: Paladin's Ashes": 0x4000083D,
"CD: Spider Shield": 0x01435570, "CD: Spider Shield": 0x01435570,
"CD: Crest Shield": 0x01430750, "CD: Crest Shield": 0x01430750,
"CD: Notched Whip": 0x00B7DE50, "CD: Notched Whip": 0x00B7DE50,
@ -161,7 +166,7 @@ cathedral_of_the_deep_table = {
"CD: Seek Guidance": 0x40360420, "CD: Seek Guidance": 0x40360420,
"CD: Aldrich's Sapphire": 0x20005096, "CD: Aldrich's Sapphire": 0x20005096,
"CD: Deep Braille Divine Tome": 0x40000860, # Shop "CD: Deep Braille Divine Tome": 0x40000860,
"CD: Saint Bident": 0x008C1360, "CD: Saint Bident": 0x008C1360,
"CD: Maiden Hood": 0x14BD12E0, "CD: Maiden Hood": 0x14BD12E0,
@ -202,7 +207,7 @@ farron_keep_table = {
"FK: Wolf's Blood Swordgrass": 0x4000016E, "FK: Wolf's Blood Swordgrass": 0x4000016E,
"FK: Greatsword": 0x005C50D0, "FK: Greatsword": 0x005C50D0,
"FK: Sage's Coal": 0x40000838, # Shop #Unique "FK: Sage's Coal": 0x40000838,
"FK: Stone Parma": 0x01443FD0, "FK: Stone Parma": 0x01443FD0,
"FK: Sage's Scroll": 0x40000854, "FK: Sage's Scroll": 0x40000854,
"FK: Crown of Dusk": 0x15D75C80, "FK: Crown of Dusk": 0x15D75C80,
@ -211,8 +216,8 @@ farron_keep_table = {
"FK: Pharis's Hat": 0x1487AB00, "FK: Pharis's Hat": 0x1487AB00,
"FK: Black Bow of Pharis": 0x00D7E970, "FK: Black Bow of Pharis": 0x00D7E970,
"FK: Dreamchaser's Ashes": 0x4000083C, # Shop #Unique "FK: Dreamchaser's Ashes": 0x4000083C,
"FK: Great Axe": 0x006B9310, # Multiple "FK: Great Axe": 0x006B9310,
"FK: Dragon Crest Shield": 0x01432E60, "FK: Dragon Crest Shield": 0x01432E60,
"FK: Lightning Spear": 0x40362B30, "FK: Lightning Spear": 0x40362B30,
"FK: Atonement": 0x4039ADA0, "FK: Atonement": 0x4039ADA0,
@ -251,6 +256,7 @@ smouldering_lake_table = {
"SL: Fume Ultra Greatsword": 0x0060E4B0, "SL: Fume Ultra Greatsword": 0x0060E4B0,
"SL: Black Iron Greatshield": 0x0150EA00, "SL: Black Iron Greatshield": 0x0150EA00,
"SL: Soul of the Old Demon King": 0x400002D0, "SL: Soul of the Old Demon King": 0x400002D0,
"SL: Knight Slayer's Ring": 0x20005000,
} }
irithyll_of_the_boreal_valley_table = { irithyll_of_the_boreal_valley_table = {
@ -266,7 +272,6 @@ irithyll_of_the_boreal_valley_table = {
"IBV: Smough's Great Hammer": 0x007E30B0, "IBV: Smough's Great Hammer": 0x007E30B0,
"IBV: Leo Ring": 0x20004EE8, "IBV: Leo Ring": 0x20004EE8,
"IBV: Greirat's Ashes": 0x4000083F,
"IBV: Excrement-covered Ashes": 0x40000862, "IBV: Excrement-covered Ashes": 0x40000862,
"IBV: Dark Stoneplate Ring": 0x20004E70, "IBV: Dark Stoneplate Ring": 0x20004E70,
@ -286,6 +291,7 @@ irithyll_of_the_boreal_valley_table = {
"IBV: Golden Ritual Spear": 0x00C83200, "IBV: Golden Ritual Spear": 0x00C83200,
"IBV: Soul of Pontiff Sulyvahn": 0x400002D4, "IBV: Soul of Pontiff Sulyvahn": 0x400002D4,
"IBV: Aldrich Faithful Covenant": 0x2000272E, "IBV: Aldrich Faithful Covenant": 0x2000272E,
"IBV: Drang Twinspears": 0x00F5AAA0,
} }
irithyll_dungeon_table = { irithyll_dungeon_table = {
@ -354,8 +360,11 @@ lothric_castle_table = {
"LC: Braille Divine Tome of Lothric": 0x40000848, "LC: Braille Divine Tome of Lothric": 0x40000848,
"LC: Knight's Ring": 0x20004FEC, "LC: Knight's Ring": 0x20004FEC,
"LC: Sunlight Straight Sword": 0x00203230, "LC: Sunlight Straight Sword": 0x00203230,
"LC: Grand Archives Key": 0x400007DE,
"LC: Soul of Dragonslayer Armour": 0x400002D1, "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 = { consumed_king_garden_table = {
@ -366,7 +375,7 @@ consumed_king_garden_table = {
"CKG: Shadow Leggings": 0x14D401F8, "CKG: Shadow Leggings": 0x14D401F8,
"CKG: Claw": 0x00A7D8C0, "CKG: Claw": 0x00A7D8C0,
"CKG: Soul of Consumed Oceiros": 0x400002CE, "CKG: Soul of Consumed Oceiros": 0x400002CE,
"CKG: Path of the Dragon Gesture": 0x40002346, # "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 = { grand_archives_table = {
@ -383,6 +392,7 @@ grand_archives_table = {
"GA: Divine Pillars of Light": 0x4038C340, "GA: Divine Pillars of Light": 0x4038C340,
"GA: Cinders of a Lord - Lothric Prince": 0x4000084E, "GA: Cinders of a Lord - Lothric Prince": 0x4000084E,
"GA: Soul of the Twin Princes": 0x400002DB, "GA: Soul of the Twin Princes": 0x400002DB,
"GA: Sage's Crystal Staff": 0x00C8CE40,
} }
untended_graves_table = { untended_graves_table = {
@ -414,6 +424,8 @@ archdragon_peak_table = {
"AP: Dragonslayer Leggings": 0x158B1CF8, "AP: Dragonslayer Leggings": 0x158B1CF8,
"AP: Ricard's Rapier": 0x002E3BF0, "AP: Ricard's Rapier": 0x002E3BF0,
"AP: Soul of the Nameless King": 0x400002D2, "AP: Soul of the Nameless King": 0x400002D2,
"AP: Dragon Tooth": 0x007E09A0,
"AP: Havel's Greatshield": 0x013376F0,
} }
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, 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,