diff --git a/worlds/dark_souls_3/__init__.py b/worlds/dark_souls_3/__init__.py index f8ed9fb0f830..0ff27acc43dd 100644 --- a/worlds/dark_souls_3/__init__.py +++ b/worlds/dark_souls_3/__init__.py @@ -39,7 +39,7 @@ class DarkSouls3World(World): remote_items: bool = False remote_start_inventory: bool = False web = DarkSouls3Web() - data_version = 1 + data_version = 2 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)} @@ -167,17 +167,15 @@ 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)) + lambda state: state.has("Tower Key", 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)) + lambda state: state.can_reach("CKG: Soul of Consumed Oceiros", "Location", 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), @@ -188,6 +186,23 @@ def set_rules(self) -> None: state.has("Cinders of a Lord - Aldrich", self.player) and 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: \ state.has("Cinders of a Lord - Abyss Watcher", self.player) and \ state.has("Cinders of a Lord - Yhorm the Giant", self.player) and \ @@ -202,6 +217,12 @@ def generate_basic(self): else: 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): # Depending on the specified option, modify items hexadecimal value to add an upgrade level item_dictionary = item_dictionary_table.copy() diff --git a/worlds/dark_souls_3/data/items_data.py b/worlds/dark_souls_3/data/items_data.py index b7c5c3d18668..9add18820b6e 100644 --- a/worlds/dark_souls_3/data/items_data.py +++ b/worlds/dark_souls_3/data/items_data.py @@ -51,7 +51,7 @@ "Twin Princes' Greatsword": 0x005FAC30, "Storm Curved Sword": 0x003E4180, "Dragonslayer Swordspear": 0x008BC540, - + "Sage's Crystal Staff": 0x00C8CE40, } weapons_upgrade_10_table = { @@ -105,6 +105,7 @@ "Sniper Crossbow": 0x00D83790, "Claw": 0x00A7D8C0, + "Drang Twinspears": 0x00F5AAA0, } shields_table = { @@ -125,7 +126,6 @@ "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, @@ -291,6 +291,7 @@ "Knight's Ring": 0x20004FEC, "Red Tearstone Ring": 0x20004ECA, "Dragonscale Ring": 0x2000515E, + "Knight Slayer's Ring": 0x20005000, } spells_table = { @@ -311,10 +312,12 @@ "Soul Stream": 0x4018B820, "Divine Pillars of Light": 0x4038C340, "Great Magic Barrier": 0x40365628, - + "Great Magic Shield": 0x40144F38, } misc_items_table = { + "Tower Key": 0x400007DF, + "Grave Key": 0x400007D9, "Cell Key": 0x400007DA, "Small Lothric Banner": 0x40000836, "Mortician's Ashes": 0x4000083B, @@ -349,7 +352,6 @@ "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, @@ -363,14 +365,19 @@ "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" + "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} diff --git a/worlds/dark_souls_3/data/locations_data.py b/worlds/dark_souls_3/data/locations_data.py index bf85e6ebf1f4..384da049ac39 100644 --- a/worlds/dark_souls_3/data/locations_data.py +++ b/worlds/dark_souls_3/data/locations_data.py @@ -9,8 +9,12 @@ } 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: Uchigatana": 0x004C4B40, + "FS: Master's Attire": 0x148F5008, + "FS: Master's Gloves": 0x148F53F0, } firelink_shrine_bell_tower_table = { @@ -40,6 +44,7 @@ "HWL: Soul of Boreal Valley Vordt": 0x400002CF, "HWL: Soul of the Dancer": 0x400002CA, "HWL: Way of Blue Covenant": 0x2000274C, + "HWL: Greirat's Ashes": 0x4000083F, } undead_settlement_table = { @@ -53,7 +58,7 @@ "US: Cleric Gloves": 0x11D90D90, "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: Plank Shield": 0x01346150, "US: Flame Stoneplate Ring": 0x20004E52, @@ -99,7 +104,7 @@ "RS: Butcher Knife": 0x006BE130, "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: Twin Dragon Greatshield": 0x01513820, "RS: Heretic's Staff": 0x00C8F550, @@ -121,12 +126,12 @@ "RS: Conjurator Manchettes": 0x149E9630, "RS: Conjurator Boots": 0x149E9A18, - "RS: Great Swamp Pyromancy Tome": 0x4000084F, # Shop + "RS: Great Swamp Pyromancy Tome": 0x4000084F, "RS: Great Club": 0x007B4A80, "RS: Exile Greatsword": 0x005DD770, - "RS: Farron Coal ": 0x40000837, # Shop + "RS: Farron Coal ": 0x40000837, "RS: Sellsword Twinblades": 0x00F42400, "RS: Sellsword Helm": 0x11481060, @@ -147,7 +152,7 @@ } cathedral_of_the_deep_table = { - "CD: Paladin's Ashes": 0x4000083D, #Shop + "CD: Paladin's Ashes": 0x4000083D, "CD: Spider Shield": 0x01435570, "CD: Crest Shield": 0x01430750, "CD: Notched Whip": 0x00B7DE50, @@ -161,7 +166,7 @@ "CD: Seek Guidance": 0x40360420, "CD: Aldrich's Sapphire": 0x20005096, - "CD: Deep Braille Divine Tome": 0x40000860, # Shop + "CD: Deep Braille Divine Tome": 0x40000860, "CD: Saint Bident": 0x008C1360, "CD: Maiden Hood": 0x14BD12E0, @@ -202,7 +207,7 @@ "FK: Wolf's Blood Swordgrass": 0x4000016E, "FK: Greatsword": 0x005C50D0, - "FK: Sage's Coal": 0x40000838, # Shop #Unique + "FK: Sage's Coal": 0x40000838, "FK: Stone Parma": 0x01443FD0, "FK: Sage's Scroll": 0x40000854, "FK: Crown of Dusk": 0x15D75C80, @@ -211,8 +216,8 @@ "FK: Pharis's Hat": 0x1487AB00, "FK: Black Bow of Pharis": 0x00D7E970, - "FK: Dreamchaser's Ashes": 0x4000083C, # Shop #Unique - "FK: Great Axe": 0x006B9310, # Multiple + "FK: Dreamchaser's Ashes": 0x4000083C, + "FK: Great Axe": 0x006B9310, "FK: Dragon Crest Shield": 0x01432E60, "FK: Lightning Spear": 0x40362B30, "FK: Atonement": 0x4039ADA0, @@ -251,6 +256,7 @@ "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 = { @@ -266,7 +272,6 @@ "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, @@ -286,6 +291,7 @@ "IBV: Golden Ritual Spear": 0x00C83200, "IBV: Soul of Pontiff Sulyvahn": 0x400002D4, "IBV: Aldrich Faithful Covenant": 0x2000272E, + "IBV: Drang Twinspears": 0x00F5AAA0, } irithyll_dungeon_table = { @@ -354,8 +360,11 @@ "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, + + # 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 = { @@ -366,7 +375,7 @@ "CKG: Shadow Leggings": 0x14D401F8, "CKG: Claw": 0x00A7D8C0, "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 = { @@ -383,6 +392,7 @@ "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, } untended_graves_table = { @@ -414,6 +424,8 @@ "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, } 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,