Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update ds3 locations and items #819

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 26 additions & 5 deletions worlds/dark_souls_3/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)}
Expand Down Expand Up @@ -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),
Expand All @@ -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 \
Expand All @@ -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()
Expand Down
19 changes: 13 additions & 6 deletions worlds/dark_souls_3/data/items_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@
"Twin Princes' Greatsword": 0x005FAC30,
"Storm Curved Sword": 0x003E4180,
"Dragonslayer Swordspear": 0x008BC540,

"Sage's Crystal Staff": 0x00C8CE40,
}

weapons_upgrade_10_table = {
Expand Down Expand Up @@ -105,6 +105,7 @@
"Sniper Crossbow": 0x00D83790,

"Claw": 0x00A7D8C0,
"Drang Twinspears": 0x00F5AAA0,
}

shields_table = {
Expand All @@ -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,
Expand Down Expand Up @@ -291,6 +291,7 @@
"Knight's Ring": 0x20004FEC,
"Red Tearstone Ring": 0x20004ECA,
"Dragonscale Ring": 0x2000515E,
"Knight Slayer's Ring": 0x20005000,
}

spells_table = {
Expand All @@ -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,
Expand Down Expand Up @@ -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,
Expand All @@ -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}
38 changes: 25 additions & 13 deletions worlds/dark_souls_3/data/locations_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 = {
Expand Down Expand Up @@ -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 = {
Expand All @@ -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,
Expand Down Expand Up @@ -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,
Expand All @@ -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,
Expand All @@ -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,
Expand All @@ -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,
Expand Down Expand Up @@ -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,
Expand All @@ -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,
Expand Down Expand Up @@ -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 = {
Expand All @@ -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,
Expand All @@ -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 = {
Expand Down Expand Up @@ -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 = {
Expand All @@ -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 = {
Expand All @@ -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 = {
Expand Down Expand Up @@ -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,
Expand Down