diff --git a/worlds/keymasters_keep/games/elden_ring_game.py b/worlds/keymasters_keep/games/elden_ring_game.py new file mode 100644 index 000000000000..7eaa778d4316 --- /dev/null +++ b/worlds/keymasters_keep/games/elden_ring_game.py @@ -0,0 +1,3265 @@ +from __future__ import annotations + +import functools + +from typing import List + +from dataclasses import dataclass + +from Options import OptionSet + +from ..game import Game +from ..game_objective_template import GameObjectiveTemplate + +from ..enums import KeymastersKeepGamePlatforms + + +@dataclass +class EldenRingArchipelagoOptions: + elden_ring_dlc_owned: EldenRingDLCOwned + + +class EldenRingGame(Game): + name = "ELDEN RING" + platform = KeymastersKeepGamePlatforms.PC + + platforms_other = [ + KeymastersKeepGamePlatforms.PS4, + KeymastersKeepGamePlatforms.PS5, + KeymastersKeepGamePlatforms.XONE, + KeymastersKeepGamePlatforms.XSX, + ] + + is_adult_only_or_unrated = False + + options_cls = EldenRingArchipelagoOptions + + def optional_game_constraint_templates(self) -> List[GameObjectiveTemplate]: + return [ + GameObjectiveTemplate( + label="Create a new ORIGIN character. Keepsake: KEEPSAKE Body Type: BODY_TYPE", + data={ + "ORIGIN": (self.origins, 1), + "KEEPSAKE": (self.keepsakes, 1), + "BODY_TYPE": (self.body_types, 1), + }, + ), + GameObjectiveTemplate( + label="Create a new ORIGIN character. Keepsake: KEEPSAKE Body Type: BODY_TYPE. Need to be at LOAD at all times", + data={ + "ORIGIN": (self.origins, 1), + "KEEPSAKE": (self.keepsakes, 1), + "BODY_TYPE": (self.body_types, 1), + "LOAD": (self.equip_loads, 1), + }, + ), + GameObjectiveTemplate( + label="Create a new ORIGIN character. Keepsake: KEEPSAKE Body Type: BODY_TYPE. Cannot use Spirit Ashes", + data={ + "ORIGIN": (self.origins, 1), + "KEEPSAKE": (self.keepsakes, 1), + "BODY_TYPE": (self.body_types, 1), + }, + ), + GameObjectiveTemplate( + label="Create a new ORIGIN character. Keepsake: KEEPSAKE Body Type: BODY_TYPE. Default Ashes of War only", + data={ + "ORIGIN": (self.origins, 1), + "KEEPSAKE": (self.keepsakes, 1), + "BODY_TYPE": (self.body_types, 1), + }, + ), + GameObjectiveTemplate( + label="Create a new ORIGIN character. Keepsake: KEEPSAKE Body Type: BODY_TYPE. No Crafting allowed", + data={ + "ORIGIN": (self.origins, 1), + "KEEPSAKE": (self.keepsakes, 1), + "BODY_TYPE": (self.body_types, 1), + }, + ), + ] + + def game_objective_templates(self) -> List[GameObjectiveTemplate]: + return [ + GameObjectiveTemplate( + label="Defeat BOSS", + data={ + "BOSS": (self.bosses, 1), + }, + is_time_consuming=False, + is_difficult=False, + weight=6, + ), + GameObjectiveTemplate( + label="Defeat one of the following Bosses: BOSSES", + data={ + "BOSSES": (self.bosses, 3), + }, + is_time_consuming=False, + is_difficult=False, + weight=4, + ), + GameObjectiveTemplate( + label="Enter the following Region: REGION", + data={ + "REGION": (self.regions, 1), + }, + is_time_consuming=False, + is_difficult=False, + weight=1, + ), + GameObjectiveTemplate( + label="Clear the following Dungeon: DUNGEON", + data={ + "DUNGEON": (self.dungeons, 1), + }, + is_time_consuming=False, + is_difficult=False, + weight=5, + ), + GameObjectiveTemplate( + label="Clear one of the following Dungeons: DUNGEONS", + data={ + "DUNGEONS": (self.dungeons, 3), + }, + is_time_consuming=False, + is_difficult=False, + weight=3, + ), + GameObjectiveTemplate( + label="Visit the following Landmark: LANDMARK", + data={ + "LANDMARK": (self.landmarks, 1), + }, + is_time_consuming=False, + is_difficult=False, + weight=2, + ), + GameObjectiveTemplate( + label="Visit one of the following Landmarks: LANDMARKS", + data={ + "LANDMARKS": (self.landmarks, 3), + }, + is_time_consuming=False, + is_difficult=False, + weight=1, + ), + GameObjectiveTemplate( + label="Rest at the following Site of Grace: SITE_OF_GRACE", + data={ + "SITE_OF_GRACE": (self.sites_of_grace, 1), + }, + is_time_consuming=False, + is_difficult=False, + weight=2, + ), + GameObjectiveTemplate( + label="Rest at one of the following Sites of Grace: SITES_OF_GRACE", + data={ + "SITES_OF_GRACE": (self.sites_of_grace, 3), + }, + is_time_consuming=False, + is_difficult=False, + weight=1, + ), + GameObjectiveTemplate( + label="Navigate between the 2 following Sites of Grace without resting: SITES_OF_GRACE", + data={ + "SITES_OF_GRACE": (self.sites_of_grace, 2), + }, + is_time_consuming=False, + is_difficult=True, + weight=2, + ), + GameObjectiveTemplate( + label="Starting at SITE_OF_GRACE, navigate to LANDMARK without resting", + data={ + "SITE_OF_GRACE": (self.sites_of_grace, 1), + "LANDMARK": (self.landmarks, 1), + }, + is_time_consuming=False, + is_difficult=True, + weight=2, + ), + GameObjectiveTemplate( + label="Trade in the following Remembrance: REMEMBRANCE", + data={ + "REMEMBRANCE": (self.remembrances, 1), + }, + is_time_consuming=False, + is_difficult=False, + weight=1, + ), + GameObjectiveTemplate( + label="Obtain and use one of the following Spirit Ashes in a boss fight: SPIRIT_ASHES", + data={ + "SPIRIT_ASHES": (self.spirit_ashes, 3), + }, + is_time_consuming=False, + is_difficult=False, + weight=3, + ), + GameObjectiveTemplate( + label="Fully upgrade one of the following Spirit Ashes: SPIRIT_ASHES", + data={ + "SPIRIT_ASHES": (self.spirit_ashes, 3), + }, + is_time_consuming=True, + is_difficult=False, + weight=1, + ), + GameObjectiveTemplate( + label="Acquire and use one of the following Ashes of War: ASHES_OF_WAR", + data={ + "ASHES_OF_WAR": (self.ashes_of_war, 3), + }, + is_time_consuming=False, + is_difficult=False, + weight=3, + ), + GameObjectiveTemplate( + label="Restore the following Great Rune: GREAT_RUNE", + data={ + "GREAT_RUNE": (self.great_runes, 1), + }, + is_time_consuming=False, + is_difficult=False, + weight=1, + ), + GameObjectiveTemplate( + label="Upgrade the Sacred Flasks to have COUNT charges", + data={ + "COUNT": (self.flask_charge_range, 1), + }, + is_time_consuming=True, + is_difficult=False, + weight=1, + ), + GameObjectiveTemplate( + label="Upgrade the Sacred Flasks to have +COUNT potency", + data={ + "COUNT": (self.flask_potency_range, 1), + }, + is_time_consuming=True, + is_difficult=False, + weight=1, + ), + GameObjectiveTemplate( + label="Use the following Crystal Tears in the Wondrous Physicks Flask: CRYSTAL_TEARS", + data={ + "CRYSTAL_TEARS": (self.crystal_tears, 2), + }, + is_time_consuming=False, + is_difficult=False, + weight=1, + ), + GameObjectiveTemplate( + label="Acquire the Map of the following Area: AREA", + data={ + "AREA": (self.maps, 1), + }, + is_time_consuming=False, + is_difficult=False, + weight=1, + ), + GameObjectiveTemplate( + label="Obtain and cast one of the following Sorceries: SORCERIES", + data={ + "SORCERIES": (self.sorceries, 3), + }, + is_time_consuming=True, + is_difficult=False, + weight=3, + ), + GameObjectiveTemplate( + label="Obtain and cast one of the following Incantations: INCANTATIONS", + data={ + "INCANTATIONS": (self.incantations, 3), + }, + is_time_consuming=True, + is_difficult=False, + weight=3, + ), + GameObjectiveTemplate( + label="Obtain one of the following Weapons: WEAPONS", + data={ + "WEAPONS": (self.weapons_melee, 3), + }, + is_time_consuming=True, + is_difficult=False, + weight=5, + ), + GameObjectiveTemplate( + label="Fully upgrade one of the following Weapons: WEAPONS", + data={ + "WEAPONS": (self.weapons_melee, 3), + }, + is_time_consuming=True, + is_difficult=False, + weight=1, + ), + GameObjectiveTemplate( + label="Defeat a boss with one of the following Weapons: WEAPONS", + data={ + "WEAPONS": (self.weapons_melee, 3), + }, + is_time_consuming=True, + is_difficult=True, + weight=3, + ), + GameObjectiveTemplate( + label="Obtain one of the following Ranged Weapons: RANGED_WEAPONS", + data={ + "RANGED_WEAPONS": (self.weapons_ranged, 3), + }, + is_time_consuming=True, + is_difficult=False, + weight=2, + ), + GameObjectiveTemplate( + label="Kill an enemy with one of the following Ranged Weapons: RANGED_WEAPONS", + data={ + "RANGED_WEAPONS": (self.weapons_ranged, 3), + }, + is_time_consuming=True, + is_difficult=False, + weight=1, + ), + GameObjectiveTemplate( + label="Obtain one of the following Catalysts: CATALYSTS", + data={ + "CATALYSTS": (self.catalysts, 3), + }, + is_time_consuming=True, + is_difficult=False, + weight=3, + ), + GameObjectiveTemplate( + label="Obtain one of the following Shields: SHIELDS", + data={ + "SHIELDS": (self.shields, 3), + }, + is_time_consuming=True, + is_difficult=False, + weight=3, + ), + GameObjectiveTemplate( + label="Defeat a boss while wielding one of the following Shields: SHIELDS", + data={ + "SHIELDS": (self.shields, 3), + }, + is_time_consuming=True, + is_difficult=True, + weight=1, + ), + GameObjectiveTemplate( + label="Collect one of the following pieces of Headgear: HEADGEAR", + data={ + "HEADGEAR": (self.armor_headgear, 3), + }, + is_time_consuming=True, + is_difficult=False, + weight=2, + ), + GameObjectiveTemplate( + label="Collect one of the following pieces of Chestgear: CHESTGEAR", + data={ + "CHESTGEAR": (self.armor_chestgear, 3), + }, + is_time_consuming=True, + is_difficult=False, + weight=2, + ), + GameObjectiveTemplate( + label="Collect one of the following pieces of Armgear: ARMGEAR", + data={ + "ARMGEAR": (self.armor_armgear, 3), + }, + is_time_consuming=True, + is_difficult=False, + weight=2, + ), + GameObjectiveTemplate( + label="Collect one of the following pieces of Legwear: LEGWEAR", + data={ + "LEGWEAR": (self.armor_legwear, 3), + }, + is_time_consuming=True, + is_difficult=False, + weight=2, + ), + GameObjectiveTemplate( + label="Acquire one of the following Talismans: TALISMANS", + data={ + "TALISMANS": (self.talismans, 3), + }, + is_time_consuming=True, + is_difficult=False, + weight=2, + ), + ] + + @property + def dlc_owned(self) -> List[str]: + return sorted(self.archipelago_options.elden_ring_dlc_owned.value) + + @property + def has_dlc_shadow_of_the_erdtree(self) -> bool: + return "Shadow of the Erdtree" in self.dlc_owned + + @staticmethod + def origins() -> List[str]: + return [ + "Vagabond", + "Warrior", + "Hero", + "Bandit", + "Astrologer", + "Prophet", + "Samurai", + "Prisoner", + "Confessor", + "Wretch", + ] + + @staticmethod + def keepsakes() -> List[str]: + return [ + "None", + "None", + "None", + "Crimson Amber Medallion", + "Lands Between Rune", + "Golden Seed", + "Fanged Imp Ashes", + "Cracked Pot", + "Stonesword Key", + "Bewitching Branch", + "Boiled Prawn", + "Shabriri's Woe", + ] + + @staticmethod + def body_types() -> List[str]: + return [ + "Type A", + "Type B", + ] + + @staticmethod + def equip_loads() -> List[str]: + return [ + "Light Load", + "Medium Load", + "Heavy Load", + ] + + @functools.cached_property + def bosses_base(self) -> List[str]: + return [ + "Abductor Virgins", + "Alabaster Lord", + "Alecto, Black Knife Ringleader", + "Ancestor Spirit", + "Ancient Hero of Zamor", + "Astel, Naturalborn of the Void", + "Astel, Stars of Darkness", + "Beastman of Farum Azula", + "Bell Bearing Hunter", + "Black Blade Kindred", + "Black Knife Assassin", + "Bloodhound Knight Darriwil", + "Bloodhound Knight", + "Borealis the Freezing Fog", + "Cemetery Shade", + "Cleanrot Knight", + "Crucible Knight Ordovis", + "Crucible Knight Siluria", + "Crucible Knight", + "Crystalian", + "Death Rite Bird", + "Decaying Ekzykes", + "Demi-Human Chief", + "Demi-Human Queen Gilika", + "Demi-Human Queen Maggie", + "Demi-Human Queen Margot", + "Draconic Tree Sentinel", + "Dragonkin Soldier of Nokstella", + "Dragonkin Soldier", + "Dragonlord Placidusax", + "Elden Beast", + "Elemer of the Briar", + "Erdtree Avatar", + "Erdtree Burial Watchdog", + "Esgar, Priest of Blood", + "Fell Twins", + "Fia's Champions", + "Fire Giant", + "Flying Dragon Agheel", + "Flying Dragon Greyll", + "Frenzied Duelist", + "Full-Grown Fallingstar Beast", + "Glintstone Dragon Adula", + "Glintstone Dragon Smarag", + "Godefroy the Grafted", + "Godfrey, First Elden Lord", + "Godrick the Grafted", + "Godskin Apostle", + "Godskin Duo", + "Godskin Noble", + "Grafted Scion", + "Grave Warden Duelist", + "Great Wyrm Theodorix", + "Guardian Golem", + "Hoarah Loux, Warrior", + "Kindred of Rot", + "Leonine Misbegotten", + "Lichdragon Fortissax", + "Lion Guardian", + "Loretta, Knight of the Haligtree", + "Mad Pumpkin Head", + "Magma Wyrm Makar", + "Magma Wyrm", + "Malenia, Goddess of Rot", + "Maliketh, the Black Blade", + "Margit the Fell Omen", + "Mimic Tear", + "Miranda Blossom", + "Miranda the Blighted Bloom", + "Misbegotten Crusader", + "Misbegotten Warrior", + "Mohg, Lord of Blood", + "Mohg, the Omen", + "Morgott, the Omen King", + "Night's Cavalry", + "Nox Monk", + "Nox Swordstress", + "Omenkiller", + "Onyx Lord", + "Patches", + "Perfumer Tricia", + "Putrid Crystallians", + "Putrid Grave Warden Duelist", + "Radagon of the Golden Order", + "Red Wolf of Radagon", + "Red Wolf of the Champion", + "Regal Ancestor Spirit", + "Rennala, Queen of the Full Moon", + "Roundtable Knight Vyke", + "Royal Knight Loretta", + "Royal Revenant", + "Runebear", + "Rykard, Lord of Blasphemy", + "Scaly Misbegotten", + "Sir Gideon Ofnir, the All-Knowing", + "Soldier of Godrick", + "Spirit-Caller Snail", + "Starscourge Radahn", + "Stonedigger Troll", + "Tibia Mariner", + "Tree Sentinel", + "Ulcerated Tree Spirit", + "Valiant Gargoyles", + "Wormface", + ] + + @functools.cached_property + def bosses_shadow_of_the_erdtree(self) -> List[str]: + return [ + "Ancient Dragon Senessax", + "Ancient Dragon-Man", + "Base Serpent Messmer", + "Bayle the Dread", + "Black Knight Edredd", + "Black Knight Garrew", + "Chief Bloodfiend", + "Commander Gaius", + "Count Ymir, Mother of Fingers", + "Curseblade Labirith", + "Dancer of Ranah", + "Death Knight", + "Death Rite Bird", + "Demi-Human Queen Marigga", + "Demi-Human Swordmaster Onze", + "Divine Beast Dancing Lion", + "Fallingstar Beast", + "Ghostflame Dragon", + "Golden Hippopotamus", + "Jagged Peak Drake", + "Jori, Elder Inquisitor", + "Knight of the Solitary Gaol", + "Lamenter", + "Metyr, Mother of Fingers", + "Midra, Lord of Frenzied Flame", + "Promised Consort Radahn", + "Putrescent Knight", + "Radahn, Consort of Miquella", + "Rakshasa", + "Ralva the Great Red Bear", + "Red Bear", + "Rellana, Twin Moon Knight", + "Romina, Saint of the Bud", + "Rugalea the Great Red Bear", + "Scadutree Avatar", + "Tibia Mariner", + ] + + def bosses(self) -> List[str]: + bosses: List[str] = self.bosses_base[:] + + if self.has_dlc_shadow_of_the_erdtree: + bosses.extend(self.bosses_shadow_of_the_erdtree) + + return sorted(set(bosses)) + + @functools.cached_property + def regions_base(self) -> List[str]: + return [ + "Academy of Raya Lucaria", + "Ainsel River", + "Altus Plateau", + "Caelid", + "Crumbling Farum Azula", + "Deeproot Depths", + "Leyndell, Royal Capital", + "Limgrave", + "Liurnia of the Lakes", + "Miquella's Haligtree", + "Mountaintops of the Giants", + "Siofra River", + "Stormveil Castle", + "Volcano Manor", + ] + + @functools.cached_property + def regions_shadow_of_the_erdtree(self) -> List[str]: + return [ + "Gravesite Plain", + "Land of the Tower", + "Scadu Altus", + "Shadow Keep", + ] + + def regions(self) -> List[str]: + regions: List[str] = self.regions_base[:] + + if self.has_dlc_shadow_of_the_erdtree: + regions.extend(self.regions_shadow_of_the_erdtree) + + return sorted(regions) + + @functools.cached_property + def dungeons_base(self) -> List[str]: + return [ + "Cave of Knowledge (Limgrave)", + "Fringefolk Hero's Grave (Limgrave)", + "Groveside Cave (Limgrave)", + "Stormfoot Catacombs (Limgrave)", + "Coastal Cave (Limgrave)", + "Murkwater Catacombs (Limgrave)", + "Murkwater Cave (Limgrave)", + "Limgrave Tunnels (Limgrave)", + "Highroad Cave (Limgrave)", + "Deathtouched Catacombs (Limgrave)", + "Earthbore Cave (Limgrave)", + "Morne Tunnel (Limgrave)", + "Tombsward Catacombs (Limgrave)", + "Impaler's Catacombs (Limgrave)", + "Tombsward Cave (Limgrave)", + "Castle Morne (Limgrave)", + "Stillwater Cave (Liurna)", + "Lakeside Crystal Cave (Liurna)", + "Cliffbottom Catacombs (Liurna)", + "Black Knife Catacombs (Liurna)", + "Raya Lucaria Crystal Tunnel (Liurna)", + "Academy Crystal Cave (Liurna)", + "Ruin-Strewn Precipice (Liurna)", + "Caria Manor (Liurna)", + "Carian Study Hall (Liurna)", + "Road's End Catacombs (Liurna)", + "Unsightly Catacombs (Altus)", + "Perfumer's Grotto (Altus)", + "Sage's Cave (Altus)", + "Old Altus Tunnel (Altus)", + "The Shaded Castle (Altus)", + "Altus Tunnel (Altus)", + "Sainted Hero's Grave (Altus)", + "Wyndham Catacombs (Altus)", + "Seethewater Cave (Altus)", + "Gelmir Hero's Grave (Altus)", + "Volcano Cave (Altus)", + "Subterranean Inquisition Chamber (Altus)", + "Auriza Hero's Grave (Altus)", + "Auriza Side Tomb (Altus)", + "Sealed Tunnel (Altus)", + "Minor Erdtree Catacombs (Caelid)", + "Gael Tunnel (Caelid)", + "Abandoned Cave (Caelid)", + "Gaol Cave (Caelid)", + "Sellia Crystal Tunnel (Caelid)", + "Sellia Hideaway (Caelid)", + "Dragonbarrow Cave (Caelid)", + "Caelid Catacombs (Caelid)", + "Redmane Castle (Caelid)", + "War-Dead Catacombs (Caelid)", + "Giants' Mountaintop Catacombs (Mountaintops)", + "Castle Sol (Mountaintops)", + "Spiritcaller Cave (Mountaintops)", + "Giant-Conquering Hero's Grave (Mountaintops)", + "Hidden Path to the Haligtree (Mountaintops)", + "Consecrated Snowfield Catacombs (Mountaintops)", + "Yelough Anix Tunnel (Mountaintops)", + "Cave of the Forlorn (Mountaintops)", + ] + + @functools.cached_property + def dungeons_shadow_of_the_erdtree(self) -> List[str]: + return [ + "Fog Rift Catacombs (Gravesite)", + "Belurat Gaol (Gravesite)", + "Ruined Forge Lava Intake (Gravesite)", + "Rivermouth Cave (Gravesite)", + "Dragon's Pit (Gravesite)", + "Castle Ensis (Gravesite)", + "Lamenter's Gaol (Gravesite)", + "Taylew's Ruined Forge (Tower)", + "Scorpion River Catacombs (Tower)", + "Darklight Catacombs (Scadu)", + "Bonny Gaol (Scadu)", + "Ruined Forge of Starfall Past (Scadu)", + "Midra's Manse (Scadu)", + ] + + def dungeons(self) -> List[str]: + dungeons: List[str] = self.dungeons_base[:] + + if self.has_dlc_shadow_of_the_erdtree: + dungeons.extend(self.dungeons_shadow_of_the_erdtree) + + return sorted(dungeons) + + @functools.cached_property + def landmarks_base(self) -> List[str]: + return [ + "Ailing Village (Limgrave)", + "Artist's Shack (Limgrave)", + "Bridge of Sacrifice (Limgrave)", + "Callu Baptismal Church (Limgrave)", + "Chapel of Anticipation (Limgrave)", + "Church of Dragon Communion (Limgrave)", + "Church of Elleh (Limgrave)", + "Church of Pilgrimage (Limgrave)", + "Demi-Human Forest Ruins (Limgrave)", + "Divine Tower of Limgrave (Limgrave)", + "Dragon-Burnt Ruins (Limgrave)", + "Forest Lookout Tower (Limgrave)", + "Forlorn Hound Evergaol (Limgrave)", + "Fort Haight (Limgrave)", + "Fourth Church of Marika (Limgrave)", + "Gatefront Ruins (Limgrave)", + "Isolated Merchant's Shack (Limgrave)", + "Limgrave Colosseum (Limgrave)", + "Minor Erdtree (Limgrave)", + "Mistwood Ruins (Limgrave)", + "Oridys's Rise (Limgrave)", + "Siofra River Well (Limgrave)", + "Stormgate (Limgrave)", + "Stormhill Evergaol (Limgrave)", + "Stormhill Shack (Limgrave)", + "Stranded Graveyard (Limgrave)", + "Summonwater Village (Limgrave)", + "Third Church of Marika (Limgrave)", + "Tombsward Ruins (Limgrave)", + "Tower of Return (Limgrave)", + "Wandering Mausoleum (Limgrave)", + "Warmaster's Shack (Limgrave)", + "Waypoint Ruins (Limgrave)", + "Weeping Evergaol (Limgrave)", + "Witchbane Ruins (Limgrave)", + "Academy Gate Town (Liurna)", + "Ainsel River Well (Liurna)", + "Artist's Shack (Liurna)", + "Bellum Church (Liurna)", + "Boilprawn Shack (Liurna)", + "Cathedral of Manus Celes (Liurna)", + "Chelona's Rise (Liurna)", + "Church of Inhibition (Liurna)", + "Church of Irith (Liurna)", + "Church of Vows (Liurna)", + "Converted Fringe Tower (Liurna)", + "Converted Tower (Liurna)", + "Cuckoo's Evergaol (Liurna)", + "Deep Ainsel Well (Liurna)", + "Divine Tower of Liurnia (Liurna)", + "Frenzied Flame Village (Liurna)", + "Frenzy-Flaming Tower (Liurna)", + "Grand Lift of Dectus (Liurna)", + "Highway Lookout Tower (Liurna)", + "Jarburg (Liurna)", + "Kingsrealm Ruins (Liurna)", + "Laskyar Ruins (Liurna)", + "Lunar Estate Ruins (Liurna)", + "Malefactor's Evergaol (Liurna)", + "Minor Erdtree (Liurna)", + "Moonfolk Ruins (Liurna)", + "Purified Ruins (Liurna)", + "Ranni's Rise (Liurna)", + "Renna's Rise (Liurna)", + "Revenger's Shack (Liurna)", + "Ringleader's Evergaol (Liurna)", + "Rose Church (Liurna)", + "Royal Grave Evergaol (Liurna)", + "Seluvis's Rise (Liurna)", + "Slumbering Wolf's Shack (Liurna)", + "Temple Quarter (Liurna)", + "Testu's Rise (Liurna)", + "The Four Belfries (Liurna)", + "Three Sisters (Liurna)", + "Uld Palace Ruins (Liurna)", + "Village of the Albinaurics (Liurna)", + "Corpse-Stench Shack (Altus)", + "Craftsman's Shack (Altus)", + "Divine Tower of East Altus (Altus)", + "Divine Tower of West Altus (Altus)", + "Dominula, Windmill Village (Altus)", + "East Windmill Pasture (Altus)", + "Fort Laiedd (Altus)", + "Golden Lineage Evergaol (Altus)", + "Hermit Merchant's Shack (Altus)", + "Hermit Village (Altus)", + "Hermit's Shack (Altus)", + "Highway Lookout Tower (Altus)", + "Lux Ruins (Altus)", + "Minor Erdtree (Altus)", + "Minor Erdtree Church (Altus)", + "Mirage Rise (Altus)", + "Perfumer's Ruins (Altus)", + "Second Church of Marika (Altus)", + "Stormcaller Church (Altus)", + "Village Windmill Pasture (Altus)", + "West Windmill Pasture (Altus)", + "Woodfolk Ruins (Altus)", + "Writheblood Ruins (Altus)", + "Wyndham Ruins (Altus)", + "Bestial Sanctum (Caelid)", + "Caelem Ruins (Caelid)", + "Caelid Colosseum (Caelid)", + "Caelid Waypoint Ruins (Caelid)", + "Cathedral of Dragon Communion (Caelid)", + "Church of the Plague (Caelid)", + "Deep Siofra Well (Caelid)", + "Divine Tower of Caelid (Caelid)", + "Forsaken Ruins (Caelid)", + "Fort Faroth (Caelid)", + "Fort Gael (Caelid)", + "Gowry's Shack (Caelid)", + "Isolated Merchant's Shack (Caelid)", + "Lenne's Rise (Caelid)", + "Minor Erdtree (Caelid)", + "Sellia Evergaol (Caelid)", + "Sellia Gateway (Caelid)", + "Sellia, Town of Sorcery (Caelid)", + "Shack of the Rotting (Caelid)", + "Smoldering Church (Caelid)", + "Street of Sages Ruins (Caelid)", + "Swamp Lookout Tower (Caelid)", + "Wailing Dunes (Caelid)", + "Albinauric Rise (Mountaintops)", + "Apostate Derelict (Mountaintops)", + "Church of Repose (Mountaintops)", + "First Church of Marika (Mountaintops)", + "Forge of the Giants (Mountaintops)", + "Grand Lift of Rold (Mountaintops)", + "Guardians' Garrison (Mountaintops)", + "Heretical Rise (Mountaintops)", + "Lord Contender's Evergaol (Mountaintops)", + "Minor Erdtree (Mountaintops)", + "Ordina, Liturgical Town (Mountaintops)", + "Shack of the Lofty (Mountaintops)", + "Stargazer's Ruins (Mountaintops)", + "Yelough Anix Ruins (Mountaintops)", + "Zamor Ruins (Mountaintops)", + ] + + @functools.cached_property + def landmarks_shadow_of_the_erdtree(self) -> List[str]: + return [ + "Abandoned Ailing Village (Gravesite)", + "Artist's Shack (Gravesite)", + "Church of Benediction (Gravesite)", + "Church of Consolation (Gravesite)", + "Elder's Hovel (Gravesite)", + "Ellac Greatbridge (Gravesite)", + "Finger Ruins of Rhia (Gravesite)", + "Finger-Weaver's Hovel (Gravesite)", + "Grand Altar of Dragon Communion (Gravesite)", + "Prospect Town (Gravesite)", + "Run-Down Traveler's Rest (Gravesite)", + "Scorched Ruins (Gravesite)", + "Southern Nameless Mausoleum (Gravesite)", + "Suppressing Pillar (Gravesite)", + "Western Nameless Mausoleum (Gravesite)", + "Church of the Bud (Tower)", + "Temple Town Ruins (Tower)", + "Moorth Ruins (Scadu)", + "Fort of Reprimand (Scadu)", + "Church of the Crusade (Scadu)", + "Northern Nameless Mausoleum (Scadu)", + "Bonny Village (Scadu)", + "Whipping Hut (Scadu)", + "Cathedral of Manus Metyr (Scadu)", + "Finger Ruins of Miyr (Scadu)", + "Rabbath's Rise (Scadu)", + "Ruins of Unte (Scadu)", + "Eastern Nameless Mausoleum (Scadu)", + "Abandoned Church (Scadu)", + ] + + def landmarks(self) -> List[str]: + landmarks: List[str] = self.landmarks_base[:] + + if self.has_dlc_shadow_of_the_erdtree: + landmarks.extend(self.landmarks_shadow_of_the_erdtree) + + return sorted(landmarks) + + @functools.cached_property + def sites_of_grace_base(self) -> List[str]: + return [ + "The First Step (Limgrave)", + "Church of Elleh (Limgrave)", + "Gatefront (Limgrave)", + "Waypoint Ruins Cellar (Limgrave)", + "Artist's Shack (Limgrave)", + "Third Church of Marika (Limgrave)", + "Fort Haight West (Limgrave)", + "Agheel Lake South (Limgrave)", + "Agheel Lake North (Limgrave)", + "Church of Dragon Communion (Limgrave)", + "Seaside Ruins (Limgrave)", + "Mistwood Outskirts (Limgrave)", + "Murkwater Coast (Limgrave)", + "Summonwater Village Outskirts (Limgrave)", + "Stormfoot Catacombs (Limgrave)", + "Murkwater Catacombs (Limgrave)", + "Groveside Cave (Limgrave)", + "Coastal Cave (Limgrave)", + "Murkwater Cave (Limgrave)", + "Highroad Cave (Limgrave)", + "Limgrave Tunnels (Limgrave)", + "Lake-Facing Cliffs (Liurna)", + "Liurnia Lake Shore (Liurna)", + "Laskyar Ruins (Liurna)", + "Scenic Isle (Liurna)", + "Academy Gate Town (Liurna)", + "South Raya Lucaria Gate (Liurna)", + "Main Academy Gate (Liurna)", + "Liurnia Highway South (Liurna)", + "Liurnia Highway North (Liurna)", + "Gate Town Bridge (Liurna)", + "Artist's Shack (Liurna)", + "Eastern Liurnia Lake Shore (Liurna)", + "Jarburg (Liurna)", + "Ranni's Chamber (Liurna)", + "Eastern Tableland (Liurna)", + "Church of Vows (Liurna)", + "Ruined Labyrinth (Liurna)", + "Mausoleum Compound (Liurna)", + "Slumbering Wolf's Shack (Liurna)", + "Boilprawn Shack (Liurna)", + "Fallen Ruins of the Lake (Liurna)", + "Folly on the Lake (Liurna)", + "Village of the Albinaurics (Liurna)", + "Converted Tower (Liurna)", + "Revenger's Shack (Liurna)", + "Temple Quarter (Liurna)", + "Crystalline Woods (Liurna)", + "Foot of the Four Belfries (Liurna)", + "The Four Belfries (Liurna)", + "Sorcerer's Isle (Liurna)", + "East Gate Bridge Trestle (Liurna)", + "Gate Town North (Liurna)", + "Northern Liurnia Lake Shore (Liurna)", + "Road to the Manor (Liurna)", + "Main Caria Manor Gate (Liurna)", + "Manor Upper Level (Liurna)", + "Manor Lower Level (Liurna)", + "Royal Moongazing Grounds (Liurna)", + "Ranni's Rise (Liurna)", + "Behind Caria Manor (Liurna)", + "The Ravine (Liurna)", + "Ravine-Veiled Village (Liurna)", + "Cliffbottom Catacombs (Liurna)", + "Road's End Catacombs (Liurna)", + "Black Knife Catacombs (Liurna)", + "Stillwater Cave (Liurna)", + "Lakeside Crystal Cave (Liurna)", + "Academy Crystal Cave (Liurna)", + "Raya Lucaria Crystal Tunnel (Liurna)", + "Study Hall Entrance (Liurna)", + "Liurnia Tower Bridge (Liurna)", + "Divine Tower of Liurnia (Liurna)", + "Abandoned Coffin (Altus)", + "Erdtree-Gazing Hill (Altus)", + "Altus Plateau (Altus)", + "Altus Highway Junction (Altus)", + "Forest-Spanning Greatbridge (Altus)", + "Bower of Bounty (Altus)", + "Windmill Village (Altus)", + "Windmill Heights (Altus)", + "Road of Iniquity Side Path (Altus)", + "Rampartside Path (Altus)", + "Shaded Castle Ramparts (Altus)", + "Shaded Castle Inner Gate (Altus)", + "Castellan's Hall (Altus)", + "Unsightly Catacombs (Altus)", + "Sainted Hero's Grave (Altus)", + "Sage's Cave (Altus)", + "Perfumer's Grotto (Altus)", + "Old Altus Tunnel (Altus)", + "Altus Tunnel (Altus)", + "Smoldering Church (Caelid)", + "Rotview Balcony (Caelid)", + "Caelem Ruins (Caelid)", + "Fort Gael North (Caelid)", + "Smoldering Wall (Caelid)", + "Caelid Highway South (Caelid)", + "Cathedral of Dragon Communion (Caelid)", + "Southern Aeonia Swamp Bank (Caelid)", + "Sellia Backstreets (Caelid)", + "Sellia Under-Stair (Caelid)", + "Chair-Crypt of Sellia (Caelid)", + "Church of the Plague (Caelid)", + "Deep Siofra Well (Caelid)", + "Impassable Greatbridge (Caelid)", + "Chamber Outside the Plaza (Caelid)", + "Redmane Castle Plaza (Caelid)", + "Starscourge Radahn (Caelid)", + "Minor Erdtree Catacombs (Caelid)", + "Caelid Catacombs (Caelid)", + "War-Dead Catacombs (Caelid)", + "Abandoned Cave (Caelid)", + "Gaol Cave (Caelid)", + "Gael Tunnel (Caelid)", + "Rear Gael Tunnel Entrance (Caelid)", + "Sellia Crystal Tunnel (Caelid)", + "Cave of Knowledge (Limgrave)", + "Stranded Graveyard (Limgrave)", + "Stormhill Shack (Limgrave)", + "Castleward Tunnel (Limgrave)", + "Margit, the Fell Omen (Limgrave)", + "Warmaster's Shack (Limgrave)", + "Saintsbridge (Limgrave)", + "Deathtouched Catacombs (Limgrave)", + "Limgrave Tower Bridge (Limgrave)", + "Divine Tower of Limgrave (Limgrave)", + "Church of Pilgrimage (Limgrave)", + "Castle Morne Rampart (Limgrave)", + "Tombsward (Limgrave)", + "South of the Lookout Tower (Limgrave)", + "Ailing Village Outskirts (Limgrave)", + "Beside the Crater-Pocked Glade (Limgrave)", + "Isolated Merchant's Shack (Limgrave)", + "Fourth Church of Marika (Limgrave)", + "Bridge of Sacrifice (Limgrave)", + "Castle Morne Lift (Limgrave)", + "Behind the Castle (Limgrave)", + "Beside the Rampart Gaol (Limgrave)", + "Morne Moangrave (Limgrave)", + "Impaler's Catacombs (Limgrave)", + "Tombsward Catacombs (Limgrave)", + "Earthbore Cave (Limgrave)", + "Tombsward Cave (Limgrave)", + "Morne Tunnel (Limgrave)", + "East Raya Lucaria Gate (Liurna)", + "Bellum Church (Liurna)", + "Grand Lift of Dectus (Liurna)", + "Frenzied Flame Village Outskirts (Liurna)", + "Church of Inhibition (Liurna)", + "Ruin-Strewn Precipice (Liurna)", + "Ruin-Strewn Precipice Overlook (Liurna)", + "Magma Wyrm Makar (Liurna)", + "Moonlight Altar (Liurna)", + "Cathedral of Manus Celes (Liurna)", + "Altar South (Liurna)", + "Bridge of Iniquity (Altus)", + "First Mt.Gelmir Campsite (Altus)", + "Ninth Mt. Gelmir Campsite (Altus)", + "Road of Iniquity (Altus)", + "Seethewater River (Altus)", + "Seethewater Terminus (Altus)", + "Craftsman's Shack (Altus)", + "Primeval Sorcerer Azur (Altus)", + "Wyndham Catacombs (Altus)", + "Gelmir Hero's Grave (Altus)", + "Seethewater Cave (Altus)", + "Volcano Cave (Altus)", + "Outer Wall Phantom Tree (Altus)", + "Minor Erdtree Church (Altus)", + "Outer Wall Battleground (Altus)", + "Hermit Merchant's Shack (Altus)", + "Capital Rampart (Altus)", + "Auriza Side Tomb (Altus)", + "Auriza Hero's Grave (Altus)", + "Sealed Tunnel (Altus)", + "Divine Tower of West Altus: Gate (Altus)", + "Divine Tower of West Altus (Altus)", + "Aeonia Swamp Shore (Caelid)", + "Astray from Caelid Highway North (Caelid)", + "Heart of Aeonia (Caelid)", + "Inner Aeonia (Caelid)", + "Dragonbarrow West (Caelid)", + "Isolated Merchant's Shack (Caelid)", + "Fort Faroth (Caelid)", + "Dragonbarrow Fork (Caelid)", + "Lenne's Rise (Caelid)", + "Farum Greatbridge (Caelid)", + "Bestial Sanctum (Caelid)", + "Sellia Hideaway (Caelid)", + "Dragonbarrow Cave (Caelid)", + "Divine Tower of Caelid: Center (Caelid)", + "Divine Tower of Caelid: Basement (Caelid)", + "Forbidden Lands (Mountaintops)", + "Grand Lift of Rold (Mountaintops)", + "Hidden Path to the Haligtree (Mountaintops)", + "Divine Tower of East Altus: Gate (Mountaintops)", + "Divine Tower of East Altus (Mountaintops)", + "Zamor Ruins (Mountaintops)", + "Ancient Snow Valley Ruins (Mountaintops)", + "Freezing Lake (Mountaintops)", + "First Church of Marika (Mountaintops)", + "Whiteridge Road (Mountaintops)", + "Snow Valley Ruins Overlook (Mountaintops)", + "Castle Sol Main Gate (Mountaintops)", + "Church of the Eclipse (Mountaintops)", + "Castle Sol Rooftop (Mountaintops)", + "Spiritcaller Cave (Mountaintops)", + "Giants' Gravepost (Mountaintops)", + "Church of Repose (Mountaintops)", + "Foot of the Forge (Mountaintops)", + "Fire Giant (Mountaintops)", + "Forge of the Giants (Mountaintops)", + "Giants' Mountaintop Catacombs (Mountaintops)", + "Giant-Conquering Hero's Grave (Mountaintops)", + "Consecrated Snowfield (Mountaintops)", + "Inner Consecrated Snowfield (Mountaintops)", + "Ordina Liturgical Town (Mountaintops)", + "Apostate Derelict (Mountaintops)", + "Consecrated Snowfield Catacombs (Mountaintops)", + "Cave of the Forlorn (Mountaintops)", + "Yelough Anix Tunnel (Mountaintops)", + ] + + @functools.cached_property + def sites_of_grace_shadow_of_the_erdtree(self) -> List[str]: + return [ + "Belurat Gaol (Gravesite)", + "Castle Ensis Checkpoint (Gravesite)", + "Castle Front (Gravesite)", + "Castle-Lord's Chamber (Gravesite)", + "Cerulean Coast (Gravesite)", + "Cerulean Coast Cross (Gravesite)", + "Cerulean Coast West (Gravesite)", + "Charo's Hidden Grave (Gravesite)", + "Cliffroad Terminus (Gravesite)", + "Dragon's Pit (Gravesite)", + "Ellac River Cave (Gravesite)", + "Ellac River Downstream (Gravesite)", + "Ensis Moongazing Grounds (Gravesite)", + "Finger Ruins of Rhia (Gravesite)", + "Fissure Cross (Gravesite)", + "Fissure Depths (Gravesite)", + "Fissure Waypoint (Gravesite)", + "Fog Rift Catacombs (Gravesite)", + "Foot of the Jagged Peak (Gravesite)", + "Garden of Deep Purple (Gravesite)", + "Grand Altar of Dragon Communion (Gravesite)", + "Gravesite Plain (Gravesite)", + "Greatbridge, North (Gravesite)", + "Jagged Peak Mountainside (Gravesite)", + "Jagged Peak Summit (Gravesite)", + "Lamenter's Gaol (Gravesite)", + "Main Gate Cross (Gravesite)", + "Pillar Path Cross (Gravesite)", + "Pillar Path Waypoint (Gravesite)", + "Rest of the Dread Dragon (Gravesite)", + "Rivermouth Cave (Gravesite)", + "Ruined Forge Lava Intake (Gravesite)", + "Scorched Ruins (Gravesite)", + "Stone Coffin Fissure (Gravesite)", + "The Fissure (Gravesite)", + "Three-Path Cross (Gravesite)", + "Viaduct Minor Tower (Tower)", + "Rauh Ancient Ruins, East (Tower)", + "Rauh Ancient Ruins, West (Tower)", + "Ancient Ruins, Grand Stairway (Tower)", + "Church of the Bud, Main Entrance (Tower)", + "Church of the Bud (Tower)", + "Ancient Ruins Base (Tower)", + "Temple Town Ruins (Tower)", + "Ravine North (Tower)", + "Scorpion River Catacombs (Tower)", + "Taylew's Ruined Forge (Tower)", + "Highroad Cross (Scadu)", + "Scadu Altus, West (Scadu)", + "Moorth Ruins (Scadu)", + "Moorth Highway, South (Scadu)", + "Fort of Reprimand (Scadu)", + "Behind the Fort of Reprimand (Scadu)", + "Bonny Village (Scadu)", + "Bridge Leading to the Village (Scadu)", + "Church District Highroad (Scadu)", + "Cathedral of Manus Metyr (Scadu)", + "Finger Birthing Grounds (Scadu)", + "Castle Watering Hole (Scadu)", + "Recluses' River Upstream (Scadu)", + "Recluses' River Downstream (Scadu)", + "Darklight Catacombs (Scadu)", + "Bonny Gaol (Scadu)", + "Ruined Forge of Starfall Past (Scadu)", + "Forsaken Graveyard (Scadu)", + "Woodland Trail (Scadu)", + "Church Ruins (Scadu)", + "Abyssal Woods (Scadu)", + "Divided Falls (Scadu)", + "Manse Hall (Scadu)", + "Midra's Library (Scadu)", + "Second Floor Chamber (Scadu)", + "Discussion Chamber (Scadu)", + ] + + def sites_of_grace(self) -> List[str]: + sites_of_grace: List[str] = self.sites_of_grace_base[:] + + if self.has_dlc_shadow_of_the_erdtree: + sites_of_grace.extend(self.sites_of_grace_shadow_of_the_erdtree) + + return sorted(sites_of_grace) + + @functools.cached_property + def remembrances_base(self) -> List[str]: + return [ + "Remembrance of the Regal Ancestor", + "Remembrance of the Naturalborn", + "Remembrance of the Lichdragon", + "Remembrance of the Fire Giant", + "Remembrance of the Grafted", + "Remembrance of the Full Moon Queen", + "Remembrance of the Blasphemous", + "Remembrance of the Starscourge", + "Remembrance of the Omen King", + "Remembrance of the Blood Lord", + "Remembrance of the Rot Goddess", + "Remembrance of the Black Blade", + "Remembrance of Hoarah Loux", + "Remembrance of the Dragonlord", + "Elden Remembrance", + + ] + + @functools.cached_property + def remembrances_shadow_of_the_erdtree(self) -> List[str]: + return [ + "Remembrance of the Dancing Lion", + "Remembrance of the Twin Moon Knight", + "Remembrance of Putrescence", + "Remembrance of the Wild Boar Rider", + "Remembrance of the Shadow Sunflower", + "Remembrance of the Saint of the Bud", + "Remembrance of the Lord of Frenzied Flame", + "Remembrance of the Mother of Fingers", + "Remembrance of the Impaler", + "Remembrance of a God and a Lord", + ] + + def remembrances(self) -> List[str]: + remembrances: List[str] = self.remembrances_base[:] + + if self.has_dlc_shadow_of_the_erdtree: + remembrances.extend(self.remembrances_shadow_of_the_erdtree) + + return sorted(remembrances) + + @functools.cached_property + def spirit_ashes_base(self) -> List[str]: + return [ + "Wandering Noble Ashes", + "Noble Sorcerer Ashes", + "Nomad Ashes", + "Putrid Corpse Ashes", + "Skeletal Militiaman Ashes", + "Skeletal Bandit Ashes", + "Albinauric Ashes", + "Winged Misbegotten Ashes", + "Demi-Human Ashes", + "Clayman Ashes", + "Oracle Envoy Ashes", + "Lone Wolf Ashes", + "Rotten Stray Ashes", + "Giant Rat Ashes", + "Warhawk Ashes", + "Land Squirt Ashes", + "Spirit Jellyfish Ashes", + "Miranda Sprout Ashes", + "Fanged Imp Ashes", + "Soldjars of Fortune Ashes", + "Archer Ashes", + "Greatshield Soldier Ashes", + "Page Ashes", + "Vulgar Militia Ashes", + "Marionette Soldier Ashes", + "Avionette Soldier Ashes", + "Kaiden Sellsword Ashes", + "Mad Pumpkin Head Ashes", + "Fire Monk Ashes", + "Ancestral Follower Ashes", + "Azula Beastman Ashes", + "Man-Serpent Ashes", + "Crystalian Ashes", + "Kindred of Rot Ashes", + "Glintstone Sorcerer Ashes", + "Twinsage Sorcerer Ashes", + "Godrick Soldier Ashes", + "Raya Lucaria Soldier Ashes", + "Leyndell Soldier Ashes", + "Radahn Soldier Ashes", + "Haligtree Soldier Ashes", + "Mausoleum Soldier Ashes", + "Stormhawk Deenh", + "Banished Knight Oleg", + "Banished Knight Engvall", + "Bloodhound Knight Floh", + "Battlemage Hugues", + "Latenna the Albinauric", + "Perfumer Tricia", + "Depraved Perfumer Carmaan", + "Omenkiller Rollo", + "Blackflame Monk Amon", + "Ancient Dragon Knight Kristoff", + "Redmane Knight Ogha", + "Lhutel the Headless", + "Cleanrot Knight Finlay", + "Black Knife Tiche", + "Mimic Tear Ashes", + "Finger Maiden Therolina Puppet", + "Jarwight Puppet", + "Dolores the Sleeping Arrow Puppet", + "Nepheli Loux Puppet", + "Dung Eater Puppet", + "Nightmaiden & Swordstress Puppets", + ] + + @functools.cached_property + def spirit_ashes_shadow_of_the_erdtree(self) -> List[str]: + return [ + "Man-Fly Ashes", + "Spider Scorpion Ashes", + "Fingercreeper Ashes", + "Bigmouth Imp Ashes", + "Gravebird Ashes", + "Horned Warrior Ashes", + "Bloodfiend Hexer's Ashes", + "Inquisitor Ashes", + "Messmer Soldier Ashes", + "Black Knight Captain Huw", + "Black Knight Commander Andreas", + "Fire Knight Hilde", + "Fire Knight Queelign", + "Swordhand of Night Jolán", + "Jolán and Anna", + "Curseblade Meera", + "Demi-Human Swordsman Yosh", + "Divine Bird Warrior Ornis", + "Taylew the Golem Smith", + "Ancient Dragon Florissax", + ] + + def spirit_ashes(self) -> List[str]: + spirit_ashes: List[str] = self.spirit_ashes_base[:] + + if self.has_dlc_shadow_of_the_erdtree: + spirit_ashes.extend(self.spirit_ashes_shadow_of_the_erdtree) + + return sorted(spirit_ashes) + + @functools.cached_property + def ashes_of_war_base(self) -> List[str]: + return [ + "Stamp (Upward Cut)", + "Stamp (Sweep)", + "Wild Strikes", + "Lion's Claw", + "Cragblade", + "Kick", + "Endure", + "Ground Slam", + "Earthshaker", + "Hoarah Loux's Earthshaker", + "War Cry", + "Barbaric Roar", + "Braggart's Roar", + "Troll's Roar", + "Spinning Slash", + "Impaling Thrust", + "Piercing Fang", + "Repeating Thrust", + "Double Slash", + "Sword Dance", + "Unsheathe", + "Quickstep", + "Bloodhound's Step", + "Raptor of the Mists", + "Beast's Roar", + "Square Off", + "Charge Forth", + "Spinning Strikes", + "Giant Hunt", + "Storm Blade", + "Storm Assault", + "Stormcaller", + "Storm Stomp", + "Vacuum Slice", + "Phantom Slash", + "Determination", + "Royal Knight's Resolve", + "Glintstone Pebble", + "Glintblade Phalanx", + "Carian Greatsword", + "Carian Grandeur", + "Spinning Weapon", + "Loretta's Slash", + "Gravitas", + "Waves of Darkness", + "Flaming Strike", + "Flame of the Redmanes", + "Eruption", + "Prelate's Charge", + "Black Flame Tornado", + "Thunderbolt", + "Lightning Slash", + "Lightning Ram", + "Sacred Blade", + "Prayerful Strike", + "Sacred Ring of Light", + "Sacred Order", + "Shared Order", + "Golden Land", + "Golden Slam", + "Golden Vow", + "Vow of the Indomitable", + "Holy Ground", + "Poisonous Mist", + "Poison Moth Flight", + "Blood Blade", + "Bloody Slash", + "Blood Tax", + "Seppuku", + "Ice Spear", + "Chilling Mist", + "Hoarfrost Stomp", + "Spectral Lance", + "Lifesteal Fist", + "White Shadow's Lure", + "Assassin's Gambit", + "Mighty Shot", + "Through and Through", + "Barrage", + "Sky Shot", + "Enchanted Shot", + "Rain of Arrows", + "Parry", + "Golden Parry", + "Storm Wall", + "Shield Bash", + "Shield Crash", + "Barricade Shield", + "Thops's Barrier", + "Carian Retaliation", + "No Skill", + ] + + @functools.cached_property + def ashes_of_war_shadow_of_the_erdtree(self) -> List[str]: + return [ + "Savage Lion's Claw", + "Spinning Gravity Thrust", + "Blind Spot", + "Swift Slash", + "Overhead Stance", + "Savage Claws", + "Raging Beast", + "Piercing Throw", + "Scattershot Throw", + "Wing Stance", + "Carian Sovereignty", + "Flame Skewer", + "Flame Spear", + "Blinkbolt", + "Aspects of the Crucible: Wings", + "The Poison Flower Blooms Twice", + "Ghostflame Call", + "Divine Beast Frost Stomp", + "Shriek of Sorrow", + "Palm Blast", + "Dryleaf Whirlwind", + "Wall of Sparks", + "Rolling Sparks", + "Igon's Drake Hunt", + "Shield Strike", + ] + + def ashes_of_war(self) -> List[str]: + ashes_of_war: List[str] = self.ashes_of_war_base[:] + + if self.has_dlc_shadow_of_the_erdtree: + ashes_of_war.extend(self.ashes_of_war_shadow_of_the_erdtree) + + return sorted(ashes_of_war) + + @staticmethod + def great_runes() -> List[str]: + return [ + "Godrick's Great Rune", + "Rykard's Great Rune", + "Radahn's Great Rune", + "Morgott's Great Rune", + "Mohg's Great Rune", + "Malenia's Great Rune", + ] + + @functools.cached_property + def crystal_tears_base(self) -> List[str]: + return [ + "Cerulean Crystal Tear", + "Cerulean Hidden Tear", + "Crimson Bubbletear", + "Crimson Crystal Tear", + "Crimsonburst Crystal Tear", + "Crimsonspill Crystal Tear", + "Crimsonwhorl Bubbletear", + "Dexterity-knot Crystal Tear", + "Faith-knot Crystal Tear", + "Flame-Shrouding Cracked Tear", + "Greenburst Crystal Tear", + "Greenspill Crystal Tear", + "Holy-Shrouding Cracked Tear", + "Intelligence-knot Crystal Tear", + "Leaden Hardtear", + "Lightning-Shrouding Cracked Tear", + "Magic-Shrouding Cracked Tear", + "Opaline Bubbletear", + "Opaline Hardtear", + "Purifying Crystal Tear", + "Ruptured Crystal Tear", + "Speckled Hardtear", + "Spiked Cracked Tear", + "Stonebarb Cracked Tear", + "Strength-knot Crystal Tear", + "Thorny Cracked Tear", + "Twiggy Cracked Tear", + "Windy Crystal Tear", + "Winged Crystal Tear", + ] + + @functools.cached_property + def crystal_tears_shadow_of_the_erdtree(self) -> List[str]: + return [ + "Crimsonburst Dried Tear", + "Deflecting Hardtear", + "Crimson-Sapping Cracked Tear", + "Cerulean-Sapping Cracked Tear", + "Bloodsucking Cracked Tear", + "Glovewort Crystal Tear", + "Viridian Hidden Tear", + "Oil-Soaked Tear", + ] + + def crystal_tears(self) -> List[str]: + crystal_tears: List[str] = self.crystal_tears_base[:] + + if self.has_dlc_shadow_of_the_erdtree: + crystal_tears.extend(self.crystal_tears_shadow_of_the_erdtree) + + return sorted(crystal_tears) + + @functools.cached_property + def maps_base(self) -> List[str]: + return [ + "Limgrave, West", + "Limgrave, East", + "Weeping Peninsula", + "Liurnia, West", + "Liurnia, East", + "Liurnia, North", + "Altus Plateau", + "Leyndell,Royal Capital", + "Mt. Gelmir", + "Caelid", + "Dragonbarrow", + "Mountaintops ofthe Giants, West", + "Mountaintops ofthe Giants, East", + "Consecrated Snowfield", + "Ainsel River", + "Lake of Rot", + "Siofra River", + "Mohgwyn Palace", + "Deeproot Depths", + ] + + @functools.cached_property + def maps_shadow_of_the_erdtree(self) -> List[str]: + return [ + "Gravesite Plain", + "Scadu Altus", + "Southern Shore", + "Rauh Ruins", + "Abyss", + ] + + def maps(self) -> List[str]: + maps: List[str] = self.maps_base[:] + + if self.has_dlc_shadow_of_the_erdtree: + maps.extend(self.maps_shadow_of_the_erdtree) + + return sorted(maps) + + @functools.cached_property + def sorceries_base(self) -> List[str]: + return [ + "Glintstone Pebble", + "Swift Glintstone Shard", + "Great Glintstone Shard", + "Glintstone Cometshard", + "Comet", + "Shard Spiral", + "Glintstone Stars", + "Star Shower", + "Glintstone Arc", + "Crystal Barrage", + "Crystal Burst", + "Cannon of Haima", + "Gavel of Haima", + "Shatter Earth", + "Rock Blaster", + "Scholar's Armament", + "Scholar's Shield", + "Starlight", + "Terra Magica", + "Thops's Barrier", + "Comet Azur", + "Stars of Ruin", + "Founding Rain of Stars", + "Magic Glintblade", + "Glintblade Phalanx", + "Carian Phalanx", + "Greatblade Phalanx", + "Magic Downpour", + "Loretta's Greatbow", + "Loretta's Mastery", + "Rennala's Full Moon", + "Ranni's Dark Moon", + "Carian Slicer", + "Carian Greatsword", + "Carian Piercer", + "Adula's Moonblade", + "Lucidity", + "Carian Retaliation", + "Ambush Shard", + "Night Shard", + "Night Comet", + "Night Maiden's Mist", + "Unseen Blade", + "Unseen Form", + "Eternal Darkness", + "Magma Shot", + "Roiling Magma", + "Gelmir's Fury", + "Rykard's Rancor", + "Glintstone Icecrag", + "Freezing Mist", + "Frozen Armament", + "Zamor Ice Storm", + "Shattering Crystal", + "Crystal Torrent", + "Crystal Release", + "Gravity Well", + "Collapsing Stars", + "Rock Sling", + "Meteorite", + "Meteorite of Astel", + "Oracle Bubbles", + "Great Oracular Bubble", + "Briars of Sin", + "Briars of Punishment", + "Rancorcall", + "Ancient Death Rancor", + "Explosive Ghostflame", + "Fia's Mist", + "Tibia's Summons", + ] + + @functools.cached_property + def sorceries_shadow_of_the_erdtree(self) -> List[str]: + return [ + "Glintblade Trio", + "Rellana's Twin Moons", + "Miriam's Vanishing", + "Gravitational Missile", + "Blades of Stone", + "Glintstone Nail", + "Glintstone Nails", + "Fleeting Microcosm", + "Cherishing Fingers", + "Mantle of Thorns", + "Impenetrable Thorns", + "Rings of Spectral Light", + "Mass of Putrescence", + "Vortex of Putrescence", + ] + + def sorceries(self) -> List[str]: + sorceries: List[str] = self.sorceries_base[:] + + if self.has_dlc_shadow_of_the_erdtree: + sorceries.extend(self.sorceries_shadow_of_the_erdtree) + + return sorted(sorceries) + + @functools.cached_property + def incantations_base(self) -> List[str]: + return [ + "Urgent Heal", + "Heal", + "Great Heal", + "Lord's Heal", + "Cure Poison", + "Lord's Aid", + "Magic Fortification", + "Flame Fortification", + "Lightning Fortification", + "Divine Fortification", + "Lord's Divine Fortification", + "Rejection", + "Shadow Bait", + "Darkness", + "Assassin's Approach", + "Golden Vow", + "Barrier of Gold", + "Golden Lightning Fortification", + "Protection of the Erdtree", + "Wrath of Gold", + "Erdtree Heal", + "Blessing's Boon", + "Blessing of the Erdtree", + "Aspects of the Crucible: Breath", + "Aspects of the Crucible: Tail", + "Aspects of the Crucible: Horns", + "Elden Stars", + "Black Blade", + "Discus of Light", + "Triple Rings of Light", + "Radagon's Rings of Light", + "Litany of Proper Death", + "Order Healing", + "Order's Blade", + "Immutable Shield", + "Law of Causality", + "Law of Regression", + "Lightning Spear", + "Lightning Strike", + "Honed Bolt", + "Ancient Dragons' Lightning Spear", + "Ancient Dragons' Lightning Strike", + "Lansseax's Glaive", + "Fortissax's Lightning Spear", + "Frozen Lightning Spear", + "Death Lightning", + "Electrify Armament", + "Dragonbolt Blessing", + "Vyke's Dragonbolt", + "Catch Flame", + "O, Flame!", + "Flame Sling", + "Giantsflame Take Thee", + "Flame, Fall Upon Them", + "Flame of the Fell God", + "Surge, O Flame!", + "Whirl, O Flame!", + "Burn, O Flame!", + "Flame, Cleanse Me", + "Flame, Protect Me", + "Flame, Grant Me Strength", + "Fire's Deadly Sin", + "Black Flame", + "Scouring Black Flame", + "Black Flame Ritual", + "Black Flame Blade", + "Black Flame's Protection", + "Noble Presence", + "Beast Claw", + "Gurranq's Beast Claw", + "Bestial Sling", + "Stone of Gurranq", + "Bestial Constitution", + "Bestial Vitality", + "Swarm of Flies", + "Bloodflame Talons", + "Bloodboon", + "Bloodflame Blade", + "Poison Mist", + "Poison Armament", + "Pest Threads", + "Scarlet Aeonia", + "The Flame of Frenzy", + "Unendurable Frenzy", + "Frenzied Burst", + "Howl of Shabriri", + "Inescapable Frenzy", + "Dragonfire", + "Agheel's Flame", + "Magma Breath", + "Theodorix's Magma", + "Glintstone Breath", + "Smarag's Glintstone Breath", + "Rotten Breath", + "Ekzykes's Decay", + "Dragonice", + "Borealis's Mist", + "Placidusax's Ruin", + "Dragonclaw", + "Dragonmaw", + "Greyoll's Roar", + ] + + @functools.cached_property + def incantations_shadow_of_the_erdtree(self) -> List[str]: + return [ + "Wrath from Afar", + "Heal from Afar", + "Minor Erdtree", + "Aspects of the Crucible: Thorns", + "Aspects of the Crucible: Bloom", + "Land of Shadow", + "Multilayered Ring of Light", + "Light of Miquella", + "Knight's Lightning Spear", + "Electrocharge", + "Dragonbolt of Florissax", + "Golden Arcs", + "Giant Golden Arc", + "Spira", + "Watchful Spirit", + "Divine Bird Feathers", + "Divine Beast Tornado", + "Fire Serpent", + "Rain of Fire", + "Messmer's Orb", + "Roar of Rugalea", + "Furious Blade of Ansbach", + "Pest-Thread Spears", + "Rotten Butterflies", + "Midra's Flame of Frenzy", + "Ghostflame Breath", + "Bayle's Tyranny", + "Bayle's Flame Lightning", + ] + + def incantations(self) -> List[str]: + incantations: List[str] = self.incantations_base[:] + + if self.has_dlc_shadow_of_the_erdtree: + incantations.extend(self.incantations_shadow_of_the_erdtree) + + return sorted(incantations) + + @functools.cached_property + def weapons_melee_base(self) -> List[str]: + return [ + "Dagger", + "Parrying Dagger", + "Misericorde", + "Great Knife", + "Bloodstained Dagger", + "Erdsteel Dagger", + "Wakizashi", + "Celebrant's Sickle", + "Ivory Sickle", + "Crystal Knife", + "Scorpion's Stinger", + "Cinquedea", + "Glintstone Kris", + "Reduvia", + "Blade of Calling", + "Black Knife", + "Short Sword", + "Longsword", + "Broadsword", + "Weathered Straight Sword", + "Lordsworn's Straight Sword", + "Noble's Slender Sword", + "Cane Sword", + "Warhawk's Talon", + "Lazuli Glintstone Sword", + "Carian Knight's Sword", + "Crystal Sword", + "Rotten Crystal Sword", + "Miquellan Knight's Sword", + "Ornamental Straight Sword", + "Golden Epitaph", + "Sword of St Trina", + "Regalia of Eochaid", + "Coded Sword", + "Sword of Night and Flame", + "Bastard Sword", + "Claymore", + "Iron Greatsword", + "Lordsworn's Greatsword", + "Knight's Greatsword", + "Banished Knight's Greatsword", + "Forked Greatsword", + "Flamberge", + "Gargoyle's Greatsword", + "Gargoyle's Blackblade", + "Inseparable Sword", + "Sword of Milos", + "Marais Executioner's Sword", + "Ordovis's Greatsword", + "Alabaster Lord's Sword", + "Death's Poker", + "Helphen's Steeple", + "Blasphemous Blade", + "Golden Order Greatsword", + "Dark Moon Greatsword", + "Sacred Relic Sword", + "Zweihander", + "Greatsword", + "Watchdog's Greatsword", + "Troll's Golden Sword", + "Troll Knight's Sword", + "Royal Greatsword", + "Grafted Blade Greatsword", + "Ruins Greatsword", + "Starscourge Greatsword", + "Godslayer's Greatsword", + "Maliketh's Black Blade", + "Rapier", + "Estoc", + "Noble's Estoc", + "Cleanrot Knight's Sword", + "Rogier's Rapier", + "Antspur Rapier", + "Frozen Needle", + "Great Epee", + "Godskin Stitcher", + "Bloody Helice", + "Dragon King's Cragblade", + "Scimitar", + "Falchion", + "Shamshir", + "Grossmesser", + "Bandit's Curved Sword", + "Shotel", + "Scavenger's Curved Sword", + "Mantis Blade", + "Beastman's Curved Sword", + "Flowing Curved Sword", + "Serpent-God's Curved Sword", + "Magma Blade", + "Nox Flowing Sword", + "Wing of Astel", + "Eclipse Shotel", + "Dismounter", + "Omen Cleaver", + "Monk's Flameblade", + "Beastman's Cleaver", + "Bloodhound's Fang", + "Onyx Lord's Greatsword", + "Zamor Curved Sword", + "Magma Wyrm's Scalesword", + "Morgott's Cursed Sword", + "Uchigatana", + "Nagakiba", + "Serpentbone Blade", + "Meteoric Ore Blade", + "Moonveil", + "Rivers of Blood", + "Dragonscale Blade", + "Hand of Malenia", + "Twinblade", + "Twinned Knight Swords", + "Godskin Peeler", + "Gargoyle's Twinblade", + "Gargoyle's Black Blades", + "Eleonora's Poleblade", + "Hand Axe", + "Forked Hatchet", + "Battle Axe", + "Warped Axe", + "Jawbone Axe", + "Iron Cleaver", + "Highland Axe", + "Celebrant's Cleaver", + "Sacrificial Axe", + "Icerind Hatchet", + "Ripple Blade", + "Stormhawk Axe", + "Rosus' Axe", + "Greataxe", + "Crescent Moon Axe", + "Longhaft Axe", + "Executioner's Greataxe", + "Great Omenkiller Cleaver", + "Rusted Anchor", + "Butchering Knife", + "Gargoyle's Great Axe", + "Gargoyle's Black Axe", + "Winged Greathorn", + "Axe of Godrick", + "Club", + "Curved Club", + "Spiked Club", + "Stone Club", + "Mace", + "Morning Star", + "Warpick", + "Hammer", + "Monk's Flamemace", + "Varré's Bouquet", + "Envoy's Horn", + "Nox Flowing Hammer", + "Ringed Finger", + "Scepter of the All-Knowing", + "Marika's Hammer", + "Flail", + "Nightrider Flail", + "Chainlink Flail", + "Family Heads", + "Bastard's Stars", + "Large Club", + "Curved Great Club", + "Great Mace", + "Pickaxe", + "Brick Hammer", + "Battle Hammer", + "Rotten Battle Hammer", + "Celebrant's Skull", + "Great Stars", + "Greathorn Hammer", + "Envoy's Long Horn", + "Cranial Vessel Candlestand", + "Beastclaw Greathammer", + "Devourer's Scepter", + "Duelist Greataxe", + "Rotten Greataxe", + "Golem's Halberd", + "Giant-Crusher", + "Prelate's Inferno Crozier", + "Great Club", + "Troll's Hammer", + "Dragon Greatclaw", + "Watchdog's Staff", + "Staff of the Avatar", + "Rotten Staff", + "Envoy's Greathorn", + "Ghiza's Wheel", + "Fallingstar Beast Jaw", + "Axe of Godfrey", + "Short Spear", + "Iron Spear", + "Spear", + "Partisan", + "Pike", + "Spiked Spear", + "Cross-Naginata", + "Clayman's Harpoon", + "Celebrant's Rib-Rake", + "Torchpole", + "Inquisitor's Girandole", + "Crystal Spear", + "Rotten Crystal Spear", + "Cleanrot Spear", + "Death Ritual Spear", + "Bolt of Gransax", + "Lance", + "Treespear", + "Serpent-Hunter", + "Siluria's Tree", + "Vyke's War Spear", + "Mohgwyn's Sacred Spear", + "Halberd", + "Banished Knight's Halberd", + "Lucerne", + "Glaive", + "Vulgar Militia Shotel", + "Vulgar Militia Saw", + "Guardian's Swordspear", + "Gargoyle's Halberd", + "Gargoyle's Black Halberd", + "Nightrider Glaive", + "Pest's Glaive", + "Ripple Crescent Halberd", + "Golden Halberd", + "Dragon Halberd", + "Loretta's War Sickle", + "Commander's Standard", + "Scythe", + "Grave Scythe", + "Halo Scythe", + "Winged Scythe", + "Whip", + "Thorned Whip", + "Urumi", + "Hoslow's Petal Whip", + "Magma Whip Candlestick", + "Giant's Red Braid", + "Caestus", + "Spiked Caestus", + "Katar", + "Iron Ball", + "Star Fist", + "Clinging Bone", + "Veteran's Prosthesis", + "Cipher Pata", + "Grafted Dragon", + "Hookclaws", + "Bloodhound Claws", + "Venomous Fang", + "Raptor Talons", + ] + + @functools.cached_property + def weapons_melee_shadow_of_the_erdtree(self) -> List[str]: + return [ + "Fire Knight's Shortsword", + "Main-gauche", + "Smithscript Dagger", + "Stone-Sheathed Sword", + "Velvet Sword of St Trina", + "Sword of Light", + "Sword of Darkness", + "Milady", + "Leda's Sword", + "Rellana's Twin Blades", + "Lizard Greatsword", + "Greatsword of Solitude", + "Greatsword of Damnation", + "Fire Knight's Greatsword", + "Moonrithyll's Knight Sword", + "Ancient Meteoric Ore Greatsword", + "Greatsword of Radahn", + "Carian Sorcery Sword", + "Queelign's Greatsword", + "Sword Lance", + "Spirit Sword", + "Falx", + "Dancing Blade of Ranah", + "Horned Warrior's Sword", + "Freyja's Greatsword", + "Horned Warrior's Greatsword", + "Backhand Blade", + "Smithscript Cirque", + "Curseblade's Cirque", + "Sword of Night", + "Star-Lined Sword", + "Great Katana", + "Dragon-Hunter's Great Katana", + "Rakshasa's Great Katana", + "Black Steel Twinblade", + "Euporia", + "Forked-Tongue Hatchet", + "Messmer Soldier's Axe", + "Smithscript Axe", + "Death Knight's Twin Axes", + "Bonny Butchering Knife", + "Death Knight's Longhaft Axe", + "Putrescence Cleaver", + "Flowerstone Gavel", + "Serpent Flail", + "Black Steel Greathammer", + "Smithscript Greathammer", + "Bloodfiend's Arm", + "Anvil Hammer", + "Devonia's Hammer", + "Shadow Sunflower Blossom", + "Gazing Finger", + "Swift Spear", + "Bloodfiend's Fork", + "Smithscript Spear", + "Messmer Soldier's Spear", + "Barbed Staff-Spear", + "Bloodfiend's Sacred Spear", + "Spear of the Impaler", + "Spirit Glaive", + "Poleblade of the Bud", + "Obsidian Lamina", + "Tooth Whip", + "Pata", + "Poisoned Hand", + "Madding Hand", + "Thiollier's Hidden Needle", + "Golem Fist", + "Dryleaf Arts", + "Dane's Footwork", + "Claws of Night", + "Beast Claw", + "Red Bear's Claw", + ] + + def weapons_melee(self) -> List[str]: + weapons_melee: List[str] = self.weapons_melee_base[:] + + if self.has_dlc_shadow_of_the_erdtree: + weapons_melee.extend(self.weapons_melee_shadow_of_the_erdtree) + + return sorted(weapons_melee) + + @functools.cached_property + def weapons_ranged_base(self) -> List[str]: + return [ + "Shortbow", + "Composite Bow", + "Red Branch Shortbow", + "Misbegotten Shortbow", + "Harp Bow", + "Longbow", + "Albinauric Bow", + "Black Bow", + "Pulley Bow", + "Horn Bow", + "Serpent Bow", + "Erdtree Bow", + "Greatbow", + "Golem Greatbow", + "Erdtree Greatbow", + "Lion Greatbow", + "Soldier's Crossbow", + "Light Crossbow", + "Heavy Crossbow", + "Arbalest", + "Crepus's Black-Key Crossbow", + "Pulley Crossbow", + "Full Moon Crossbow", + "Hand Ballista", + "Jar Cannon", + + ] + + @functools.cached_property + def weapons_ranged_shadow_of_the_erdtree(self) -> List[str]: + return [ + "Bone Bow", + "Ansbach's Longbow", + "Igon's Greatbow", + "Repeating Crossbow", + "Spread Crossbow", + "Rabbath's Cannon", + ] + + def weapons_ranged(self) -> List[str]: + weapons_ranged: List[str] = self.weapons_ranged_base[:] + + if self.has_dlc_shadow_of_the_erdtree: + weapons_ranged.extend(self.weapons_ranged_shadow_of_the_erdtree) + + return sorted(weapons_ranged) + + @functools.cached_property + def catalysts_base(self) -> List[str]: + return [ + "Astrologer's Staff", + "Glintstone Staff", + "Academy Glintstone Staff", + "Digger's Staff", + "Demi-Human Queen's Staff", + "Azur's Glintstone Staff", + "Lusat's Glintstone Staff", + "Carian Glintstone Staff", + "Carian Glintblade Staff", + "Carian Regal Scepter", + "Albinauric Staff", + "Staff of Loss", + "Gelmir Glintstone Staff", + "Crystal Staff", + "Rotten Crystal Staff", + "Meteorite Staff", + "Staff of the Guilty", + "Prince of Death's Staff", + "Finger Seal", + "Erdtree Seal", + "Golden Order Seal", + "Gravel Stone Seal", + "Giant's Seal", + "Godslayer's Seal", + "Clawmark Seal", + "Frenzied Flame Seal", + "Dragon Communion Seal", + ] + + @functools.cached_property + def catalysts_shadow_of_the_erdtree(self) -> List[str]: + return [ + "Maternal Staff", + "Staff of the Great Beyond", + "Dryleaf Seal", + "Fire Knight's Seal", + "Spiraltree Seal", + ] + + def catalysts(self) -> List[str]: + catalysts: List[str] = self.catalysts_base[:] + + if self.has_dlc_shadow_of_the_erdtree: + catalysts.extend(self.catalysts_shadow_of_the_erdtree) + + return sorted(catalysts) + + @functools.cached_property + def shields_base(self) -> List[str]: + return [ + "Torch", + "Beast-Repellent Torch", + "Steel-Wire Torch", + "Sentry's Torch", + "Ghostflame Torch", + "St. Trina's Torch", + "Rickety Shield", + "Riveted Wooden Shield", + "Blue-White Wooden Shield", + "Scripture Wooden Shield", + "Red Thorn Roundshield", + "Pillory Shield", + "Buckler", + "Iron Roundshield", + "Gilded Iron Shield", + "Man-Serpent's Shield", + "Ice Crest Shield", + "Rift Shield", + "Perfumer's Shield", + "Shield of the Guilty", + "Spiralhorn Shield", + "Smoldering Shield", + "Coil Shield", + "Hawk Crest Wooden Shield", + "Horse Crest Wooden Shield", + "Candletree Wooden Shield", + "Flame Crest Wooden Shield", + "Marred Wooden Shield", + "Sun Realm Shield", + "Round Shield", + "Large Leather Shield", + "Black Leather Shield", + "Marred Leather Shield", + "Heater Shield", + "Blue Crest Heater Shield", + "Red Crest Heater Shield", + "Beast Crest Heater Shield", + "Inverted Hawk Heater Shield", + "Eclipse Crest Heater Shield", + "Kite Shield", + "Blue-Gold Kite Shield", + "Scorpion Kite Shield", + "Twinbird Kite Shield", + "Brass Shield", + "Banished Knight's Shield", + "Albinauric Shield", + "Beastman's Jar-Shield", + "Carian Knight's Shield", + "Silver Mirrorshield", + "Great Turtle Shell", + "Wooden Greatshield", + "Lordsworn's Shield", + "Briar Greatshield", + "Spiked Palisade Shield", + "Icon Shield", + "Golden Beast Crest Shield", + "Manor Towershield", + "Crossed-Tree Towershield", + "Inverted Hawk Towershield", + "Dragon Towershield", + "Distinguished Greatshield", + "Gilded Greatshield", + "Cuckoo Greatshield", + "Redmane Greatshield", + "Golden Greatshield", + "Haligtree Crest Greatshield", + "Crucible Hornshield", + "Dragonclaw Shield", + "Fingerprint Stone Shield", + "Eclipse Crest Greatshield", + "Ant's Skull Plate", + "Erdtree Greatshield", + "Jellyfish Shield", + "Visage Shield", + "One-Eyed Shield", + ] + + @functools.cached_property + def shields_shadow_of_the_erdtree(self) -> List[str]: + return [ + "Nanaya's Torch", + "Lamenting Visage", + "Smithscript Shield", + "Shield of Night", + "Messmer Soldier Shield", + "Wolf Crest Shield", + "Serpent Crest Shield", + "Golden Lion Shield", + "Black Steel Greatshield", + "Verdigris Greatshield", + "Dueling Shield", + "Carian Thrusting Shield", + ] + + def shields(self) -> List[str]: + shields: List[str] = self.shields_base[:] + + if self.has_dlc_shadow_of_the_erdtree: + shields.extend(self.shields_shadow_of_the_erdtree) + + return sorted(shields) + + @functools.cached_property + def armor_headgear_base(self) -> List[str]: + return [ + "Commoner's Headband", + "Aristocrat Headband", + "Aristocrat Hat", + "Old Aristocrat Cowl", + "Page Hood", + "High Page Hood", + "Guardian Mask", + "Festive Hood", + "Blue Festive Hood", + "Guilty Hood", + "Prisoner Iron Mask", + "Blackguard's Iron Mask", + "Bloodsoaked Mask", + "Black Dumpling", + "Mushroom Head", + "Mushroom Crown", + "Astrologer Hood", + "Juvenile Scholar Cap", + "Karolos Glintstone Crown", + "Olivinus Glintstone Crown", + "Twinsage Glintstone Crown", + "Witch's Glintstone Crown", + "Lazuli Glintstone Crown", + "Haima Glintstone Crown", + "Hierodas Glintstone Crown", + "Spellblade's Pointed Hat", + "Alberich's Pointed Hat", + "Preceptor's Big Hat", + "Mask of Confidence", + "Azur's Glintstone Crown", + "Lusat's Glintstone Crown", + "Queen's Crescent Crown", + "Snow Witch Hat", + "Fia's Hood", + "Prophet Blindfold", + "Traveling Maiden Hood", + "Finger Maiden Fillet", + "Sage Hood", + "Greathood", + "Radiant Gold Mask", + "Perfumer Hood", + "Traveler's Hat", + "Depraved Perfumer Headscarf", + "Ruler's Mask", + "Consort's Mask", + "Marais Mask", + "Great Horned Headband", + "Shining Horned Headband", + "Godskin Apostle Hood", + "Godskin Noble Hood", + "Sanguine Noble Hood", + "Crimson Tear Scarab", + "Cerulean Tear Scarab", + "Ash-of-War Scarab", + "Glintstone Scarab", + "Incantation Scarab", + "Imp Head (Cat)", + "Imp Head (Wolf)", + "Imp Head (Fanged)", + "Imp Head (Long-Tongued)", + "Imp Head (Corpse)", + "Imp Head (Elder)", + "Nox Mirrorhelm", + "Iji's Mirrorhelm", + "Silver Tear Mask", + "Envoy Crown", + "Octopus Head", + "Jar", + "Albinauric Mask", + "Black Wolf Mask", + "Blue Cloth Cowl", + "Crimson Hood", + "Navy Hood", + "White Mask", + "Nomadic Merchant's Chapeau", + "Bandit Mask", + "Black Hood", + "Confessor Hood", + "Omensmirk Mask", + "Skeletal Mask", + "Foot Soldier Helm", + "Foot Soldier Helmet", + "Foot Soldier Cap", + "Gilded Foot Soldier Cap", + "Sacred Crown Helm", + "Highwayman Hood", + "Vulgar Militia Helm", + "Duelist Helm", + "Rotten Duelist Helm", + "Nox Monk Hood", + "Nox Swordstress Crown", + "Night Maiden Twin Crown", + "Champion Headband", + "Chain Coif", + "Iron Helmet", + "Godrick Soldier Helm", + "Raya Lucarian Helm", + "Radahn Soldier Helm", + "Leyndell Soldier Helm", + "Haligtree Helm", + "Exile Hood", + "Kaiden Helm", + "Land of Reeds Helm", + "Okina Mask", + "Iron Kasa", + "Eccentric's Hood", + "Marionette Soldier Helm", + "Marionette Soldier Birdhelm", + "Blue Silver Mail Hood", + "Fire Monk Hood", + "Blackflame Monk Hood", + "Zamor Mask", + "Black Knife Hood", + "Malenia's Winged Helm", + "Elden Lord Crown", + "Knight Helm", + "Vagabond Knight Helm", + "Greathelm", + "Carian Knight Helm", + "Godrick Knight Helm", + "Cuckoo Knight Helm", + "Redmane Knight Helm", + "Gelmir Knight Helm", + "Leyndell Knight Helm", + "Haligtree Knight Helm", + "Bloodhound Knight Helm", + "Cleanrot Helm", + "Raging Wolf Helm", + "Hoslow's Helm", + "Diallos's Mask", + "Twinned Helm", + "Drake Knight Helm", + "Briar Helm", + "Fingerprint Helm", + "Royal Remains Helm", + "All-Knowing Helm", + "Royal Knight Helm", + "Maliketh's Helm", + "Banished Knight Helm", + "Night's Cavalry Helm", + "Veteran's Helm", + "Scaled Helm", + "Beast Champion Helm", + "Tree Sentinel Helm", + "Malformed Dragon Helm", + "Crucible Axe Helm", + "Crucible Tree Helm", + "Radahn's Redmane Helm", + "Lionel's Helm", + "Bull-Goat Helm", + "Omen Helm", + "Fire Prelate Helm", + "Pumpkin Helm", + ] + + @functools.cached_property + def armor_headgear_shadow_of_the_erdtree(self) -> List[str]: + return [ + "Caterpillar Mask", + "St. Trina's Blossom", + "Circlet of Light", + "High Priest Hat", + "Dane's Hat", + "Wise Man's Mask", + "Imp Head (Lion)", + "Greatjar", + "Thiollier's Mask", + "Gravebird Helm", + "Dancer's Hood", + "Common Soldier Helm", + "Shadow Militiaman Helm", + "Leather Headband", + "Leather Crown", + "Fang Helm", + "Igon's Helm", + "Curseblade Mask", + "Pelt of Ralva", + "Messmer Soldier Helm", + "Freyja's Helm", + "Helm of Night", + "Messmer's Helm", + "Black Knight Helm", + "Fire Knight Helm", + "Winged Serpent Helm", + "Death Mask Helm", + "Salza's Hood", + "Death Knight Helm", + "Horned Warrior Helm", + "Divine Beast Helm", + "Divine Bird Helm", + "Oathseeker Knight Helm", + "Rakshasa Helm", + "Rellana's Helm", + "Helm of Solitude", + "Crucible Hammer-Helm", + "Gaius's Helm", + "Young Lion's Helm", + "Verdigris Helm", + "Divine Beast Head", + ] + + def armor_headgear(self) -> List[str]: + armor_headgear: List[str] = self.armor_headgear_base[:] + + if self.has_dlc_shadow_of_the_erdtree: + armor_headgear.extend(self.armor_headgear_shadow_of_the_erdtree) + + return sorted(armor_headgear) + + @functools.cached_property + def armor_chestgear_base(self) -> List[str]: + return [ + "Cloth Garb", + "Traveler's Clothes", + "Commoner's Simple Garb", + "Commoner's Garb", + "Aristocrat Garb", + "Aristocrat Coat", + "Old Aristocrat Gown", + "Page Garb", + "High Page Clothes", + "Guardian Garb", + "Guardian Garb (Full Bloom)", + "Festive Garb", + "Blue Festive Garb", + "Prisoner Clothing", + "Mushroom Body", + "Astrologer Robe", + "Juvenile Scholar Robe", + "Raya Lucarian Robe", + "Lazuli Robe", + "Battlemage Robe", + "Errant Sorcerer Robe", + "Spellblade's Traveling Attire", + "Alberich's Robe", + "Preceptor's Long Gown", + "Azur's Glintstone Robe", + "Lusat's Robe", + "Queen's Robe", + "Snow Witch Robe", + "Fia's Robe", + "Deathbed Dress", + "Prophet Robe", + "Corhyn's Robe", + "Traveling Maiden Robe", + "Finger Maiden Robe", + "Sage Robe", + "Goldmask's Rags", + "Perfumer Robe", + "Perfumer's Traveling Garb", + "Depraved Perfumer Robe", + "Upper-Class Robe", + "Ruler's Robe", + "Consort's Robe", + "Official's Attire", + "Marais Robe", + "Fur Raiment", + "Shaman Furs", + "Godskin Apostle Robe", + "Godskin Noble Robe", + "Fell Omen Cloak", + "Sanguine Noble Robe", + "Lord of Blood's Robe", + "Leather Armor", + "Blue Cloth Vest", + "Noble's Traveling Garb", + "War Surgeon Gown", + "Nomadic Merchant's Finery", + "Bandit Garb", + "Confessor Armor", + "Omenkiller Robe", + "Raptor's Black Feathers", + "Foot Soldier Tabard", + "Leather-Draped Tabard", + "Chain-Draped Tabard", + "Ivory-Draped Tabard", + "Scarlet Tabard", + "Bloodsoaked Tabard", + "Highwayman Cloth Armor", + "Vulgar Militia Armor", + "Gravekeeper Cloak", + "Rotten Gravekeeper Cloak", + "Nox Monk Armor", + "Nox Swordstress Armor", + "Night Maiden Armor", + "Champion Pauldron", + "Chain Armor", + "Dirty Chainmail", + "Tree Surcoat", + "Eye Surcoat", + "Tree-and-Beast Surcoat", + "Cuckoo Surcoat", + "Redmane Surcoat", + "Erdtree Surcoat", + "Haligtree Crest Surcoat", + "Mausoleum Surcoat", + "Scale Armor", + "Exile Armor", + "Kaiden Armor", + "Land of Reeds Armor", + "White Reed Armor", + "Ronin's Armor", + "Eccentric's Armor", + "Marionette Soldier Armor", + "Blue Silver Mail Armor", + "Fire Monk Armor", + "Blackflame Monk Armor", + "Zamor Armor", + "Black Knife Armor", + "Malenia's Armor", + "Elden Lord Armor", + "Knight Armor", + "Vagabond Knight Armor", + "Carian Knight Armor", + "Godrick Knight Armor", + "Cuckoo Knight Armor", + "Redmane Knight Armor", + "Gelmir Knight Armor", + "Leyndell Knight Armor", + "Haligtree Knight Armor", + "Mausoleum Knight Armor", + "Bloodhound Knight Armor", + "Cleanrot Armor", + "Raging Wolf Armor", + "Hoslow's Armor", + "Twinned Armor", + "Drake Knight Armor", + "Blaidd's Armor", + "Briar Armor", + "Fingerprint Armor", + "Royal Remains Armor", + "All-Knowing Armor", + "Royal Knight Armor", + "Maliketh's Armor", + "Banished Knight Armor", + "Night's Cavalry Armor", + "Veteran's Armor", + "Scaled Armor", + "Beast Champion Armor", + "Tree Sentinel Armor", + "Malformed Dragon Armor", + "Crucible Axe Armor", + "Crucible Tree Armor", + "Radahn's Lion Armor", + "Lionel's Armor", + "Bull-Goat Armor", + "Omen Armor", + "Fire Prelate Armor", + ] + + @functools.cached_property + def armor_chestgear_shadow_of_the_erdtree(self) -> List[str]: + return [ + "Braided Cord Robe", + "High Priest Robe", + "Finger Robe", + "Dryleaf Robe", + "Ansbach's Attire", + "Thiollier's Garb", + "Gravebird Armor", + "Gravebird's Blackquill Armor", + "Dancer's Dress", + "Common Soldier Cloth Armor", + "Shadow Militiaman Armor", + "Highland Attire", + "Gloried Attire", + "Iron Rivet Armor", + "Igon's Armor", + "Ascetic's Loincloth", + "Messmer Soldier Armor", + "Freyja's Armor", + "Armor of Night", + "Messmer's Armor", + "Black Knight Armor", + "Fire Knight Armor", + "Death Knight Armor", + "Horned Warrior Armor", + "Divine Beast Warrior Armor", + "Divine Bird Warrior Armor", + "Oathseeker Knight Armor", + "Leda's Armor", + "Rakshasa Armor", + "Rellana's Armor", + "Armor of Solitude", + "Gaius's Armor", + "Young Lion's Armor", + "Verdigris Armor", + ] + + def armor_chestgear(self) -> List[str]: + armor_chestgear: List[str] = self.armor_chestgear_base[:] + + if self.has_dlc_shadow_of_the_erdtree: + armor_chestgear.extend(self.armor_chestgear_shadow_of_the_erdtree) + + return sorted(armor_chestgear) + + @functools.cached_property + def armor_armgear_base(self) -> List[str]: + return [ + "Traveler's Manchettes", + "Guardian Bracers", + "Bloodsoaked Manchettes", + "Mushroom Arms", + "Astrologer Gloves", + "Sorcerer Manchettes", + "Battlemage Manchettes", + "Errant Sorcerer Manchettes", + "Spellblade's Gloves", + "Alberich's Bracers", + "Preceptor's Gloves", + "Azur's Manchettes", + "Lusat's Manchettes", + "Queen's Bracelets", + "Traveling Maiden Gloves", + "Gold Bracelets", + "Perfumer Gloves", + "Traveler's Gloves", + "Depraved Perfumer Gloves", + "Godskin Apostle Bracelets", + "Godskin Noble Bracelets", + "Leather Gloves", + "Warrior Gauntlets", + "Noble's Gloves", + "War Surgeon Gloves", + "Bandit Manchettes", + "Confessor Gloves", + "Omenkiller Long Gloves", + "Foot Soldier Gauntlets", + "Highwayman Gauntlets", + "Vulgar Militia Gauntlets", + "Nox Bracelets", + "Champion Bracers", + "Gauntlets", + "Iron Gauntlets", + "Godrick Soldier Gauntlets", + "Raya Lucarian Gauntlets", + "Radahn Soldier Gauntlets", + "Leyndell Soldier Gauntlets", + "Haligtree Gauntlets", + "Mausoleum Gauntlets", + "Exile Gauntlets", + "Kaiden Gauntlets", + "Land of Reeds Gauntlets", + "White Reed Gauntlets", + "Ronin's Gauntlets", + "Eccentric's Manchettes", + "Blue Silver Bracelets", + "Fire Monk Gauntlets", + "Blackflame Monk Gauntlets", + "Zamor Bracelets", + "Black Knife Gauntlets", + "Malenia's Gauntlet", + "Elden Lord Bracers", + "Messmer's Gauntlets", + "Knight Gauntlets", + "Vagabond Knight Gauntlets", + "Carian Knight Gauntlets", + "Godrick Knight Gauntlets", + "Cuckoo Knight Gauntlets", + "Redmane Knight Gauntlets", + "Gelmir Knight Gauntlets", + "Leyndell Knight Gauntlets", + "Haligtree Knight Gauntlets", + "Mausoleum Knight Gauntlets", + "Black Knight Gauntlets", + "Bloodhound Knight Gauntlets", + "Cleanrot Gauntlets", + "Oathseeker Knight Gauntlets", + "Raging Wolf Gauntlets", + "Hoslow's Gauntlets", + "Twinned Gauntlets", + "Drake Knight Gauntlets", + "Blaidd's Gauntlets", + "Briar Gauntlets", + "Fingerprint Gauntlets", + "Royal Remains Gauntlets", + "All-Knowing Gauntlets", + "Royal Knight Gauntlets", + "Maliketh's Gauntlets", + "Banished Knight Gauntlets", + "Night's Cavalry Gauntlets", + "Veteran's Gauntlets", + "Scaled Gauntlets", + "Beast Champion Gauntlets", + "Tree Sentinel Gauntlets", + "Malformed Dragon Gauntlets", + "Crucible Gauntlets", + "Radahn's Gauntlets", + "Lionel's Gauntlets", + "Bull-Goat Gauntlets", + "Omen Gauntlets", + "Fire Prelate Gauntlets", + ] + + @functools.cached_property + def armor_armgear_shadow_of_the_erdtree(self) -> List[str]: + return [ + "Braided Arm Wraps", + "High Priest Gloves", + "Dryleaf Arm Wraps", + "Ansbach's Manchettes", + "Thiollier's Gloves", + "Gravebird Bracelets", + "Dancer's Bracer", + "Common Soldier Gauntlets", + "Shadow Militiaman Gauntlets", + "Leather Arm Wraps", + "Iron Rivet Gauntlets", + "Igon's Gauntlets", + "Ascetic's Wrist Guards", + "Messmer Soldier Gauntlets", + "Freyja's Gauntlets", + "Gauntlets of Night", + "Fire Knight Gauntlets", + "Death Knight Gauntlets", + "Horned Warrior Gauntlets", + "Divine Bird Warrior Gauntlets", + "Rakshasa Gauntlets", + "Rellana's Gloves", + "Gauntlets of Solitude", + "Gaius's Gauntlets", + "Young Lion's Gauntlets", + "Verdigris Gauntlets", + ] + + def armor_armgear(self) -> List[str]: + armor_armgear: List[str] = self.armor_armgear_base[:] + + if self.has_dlc_shadow_of_the_erdtree: + armor_armgear.extend(self.armor_armgear_shadow_of_the_erdtree) + + return sorted(armor_armgear) + + @functools.cached_property + def armor_legwear_base(self) -> List[str]: + return [ + "Cloth Trousers", + "Traveler's Boots", + "Commoner's Shoes", + "Aristocrat Boots", + "Old Aristocrat Shoes", + "Page Trousers", + "Guardian Greaves", + "Prisoner Trousers", + "Mushroom Legs", + "Astrologer Trousers", + "Sorcerer Leggings", + "Battlemage Legwraps", + "Errant Sorcerer Boots", + "Spellblade's Trousers", + "Alberich's Trousers", + "Preceptor's Trousers", + "Old Sorcerer's Legwraps", + "Queen's Leggings", + "Snow Witch Skirt", + "Prophet Trousers", + "Traveling Maiden Boots", + "Finger Maiden Shoes", + "Sage Trousers", + "Gold Waistwrap", + "Perfumer Sarong", + "Traveler's Slops", + "Depraved Perfumer Trousers", + "Consort's Trousers", + "Fur Leggings", + "Shaman Leggings", + "Godskin Apostle Trousers", + "Godskin Noble Trousers", + "Sanguine Noble Waistcloth", + "Leather Trousers", + "Leather Boots", + "Warrior Greaves", + "Noble's Trousers", + "War Surgeon Trousers", + "Nomadic Merchant's Trousers", + "Bandit Boots", + "Confessor Boots", + "Omenkiller Boots", + "Foot Soldier Greaves", + "Vulgar Militia Greaves", + "Duelist Greaves", + "Rotten Duelist Greaves", + "Nox Greaves", + "Champion Gaiters", + "Chain Leggings", + "Godrick Soldier Greaves", + "Raya Lucarian Greaves", + "Radahn Soldier Greaves", + "Leyndell Soldier Greaves", + "Haligtree Greaves", + "Mausoleum Greaves", + "Exile Greaves", + "Kaiden Trousers", + "Land of Reeds Greaves", + "White Reed Greaves", + "Ronin's Greaves", + "Eccentric's Breeches", + "Blue Silver Mail Skirt", + "Fire Monk Greaves", + "Blackflame Monk Greaves", + "Zamor Legwraps", + "Black Knife Greaves", + "Malenia's Greaves", + "Elden Lord Greaves", + "Knight Greaves", + "Vagabond Knight Greaves", + "Carian Knight Greaves", + "Godrick Knight Greaves", + "Cuckoo Knight Greaves", + "Redmane Knight Greaves", + "Gelmir Knight Greaves", + "Leyndell Knight Greaves", + "Haligtree Knight Greaves", + "Mausoleum Knight Greaves", + "Bloodhound Knight Greaves", + "Cleanrot Greaves", + "Raging Wolf Greaves", + "Hoslow's Greaves", + "Twinned Greaves", + "Drake Knight Greaves", + "Blaidd's Greaves", + "Briar Greaves", + "Fingerprint Greaves", + "Royal Remains Greaves", + "All-Knowing Greaves", + "Royal Knight Greaves", + "Maliketh's Greaves", + "Banished Knight Greaves", + "Night's Cavalry Greaves", + "Veteran's Greaves", + "Scaled Greaves", + "Beast Champion Greaves", + "Tree Sentinel Greaves", + "Malformed Dragon Greaves", + "Crucible Greaves", + "Radahn's Greaves", + "Lionel's Greaves", + "Bull-Goat Greaves", + "Omen Greaves", + "Fire Prelate Greaves", + + ] + + @functools.cached_property + def armor_legwear_shadow_of_the_erdtree(self) -> List[str]: + return [ + "Soiled Loincloth", + "High Priest Undergarments", + "Dryleaf Cuissardes", + "Ansbach's Boots", + "Thiollier's Trousers", + "Gravebird Anklets", + "Dancer's Trousers", + "Common Soldier Greaves", + "Shadow Militiaman Greaves", + "Leather Leg Wraps", + "Iron Rivet Greaves", + "Igon's Loincloth", + "Ascetic's Ankle Guards", + "Messmer Soldier Greaves", + "Freyja's Greaves", + "Greaves of Night", + "Messmer's Greaves", + "Black Knight Greaves", + "Fire Knight Greaves", + "Death Knight Greaves", + "Horned Warrior Greaves", + "Divine Bird Warrior Greaves", + "Oathseeker Knight Greaves", + "Rakshasa Greaves", + "Rellana's Greaves", + "Greaves of Solitude", + "Gaius's Greaves", + "Young Lion's Greaves", + "Verdigris Greaves", + ] + + def armor_legwear(self) -> List[str]: + armor_legwear: List[str] = self.armor_legwear_base[:] + + if self.has_dlc_shadow_of_the_erdtree: + armor_legwear.extend(self.armor_legwear_shadow_of_the_erdtree) + + return sorted(armor_legwear) + + @functools.cached_property + def talismans_base(self) -> List[str]: + return [ + "Crimson Amber Medallion", + "Crimson Seed Talisman", + "Blessed Dew Talisman", + "Cerulean Amber Medallion", + "Cerulean Seed Talisman", + "Viridian Amber Medallion", + "Green Turtle Talisman", + "Arsenal Charm", + "Great-Jar's Arsenal", + "Erdtree's Favor", + "Radagon's Scarseal", + "Radagon's Soreseal", + "Marika's Scarseal", + "Marika's Soreseal", + "Starscourge Heirloom", + "Stargazer Heirloom", + "Two Fingers Heirloom", + "Dragoncrest Shield Talisman", + "Dragoncrest Greatshield Talisman", + "Spelldrake Talisman", + "Flamedrake Talisman", + "Boltdrake Talisman", + "Haligdrake Talisman", + "Pearldrake Talisman", + "Immunizing Horn Charm", + "Stalwart Horn Charm", + "Clarifying Horn Charm", + "Mottled Necklace", + "Prince of Death's Pustule", + "Prince of Death's Cyst", + "Dagger Talisman", + "Curved Sword Talisman", + "Twinblade Talisman", + "Axe Talisman", + "Hammer Talisman", + "Spear Talisman", + "Lance Talisman", + "Claw Talisman", + "Greatshield Talisman", + "Arrow's Sting Talisman", + "Arrow's Reach Talisman", + "Graven-School Talisman", + "Graven-Mass Talisman", + "Faithful's Canvas Talisman", + "Flock's Canvas Talisman", + "Primal Glintstone Blade", + "Moon of Nokstella", + "Old Lord's Talisman", + "Radagon Icon", + "Roar Medallion", + "Companion Jar", + "Perfumer's Talisman", + "Carian Filigreed Crest", + "Warrior Jar Shard", + "Shard of Alexander", + "Godfrey Icon", + "Bull-Goat's Talisman", + "Blue Dancer Charm", + "Magic Scorpion Charm", + "Fire Scorpion Charm", + "Lightning Scorpion Charm", + "Sacred Scorpion Charm", + "Crucible Scale Talisman", + "Crucible Feather Talisman", + "Crucible Knot Talisman", + "Red-Feathered Branchsword", + "Blue-Feathered Branchsword", + "Ritual Sword Talisman", + "Ritual Shield Talisman", + "Assassin's Crimson Dagger", + "Assassin's Cerulean Dagger", + "Winged Sword Insignia", + "Rotten Winged Sword Insignia", + "Millicent's Prosthesis", + "Godskin Swaddling Cloth", + "Kindred of Rot's Exultation", + "Lord of Blood's Exultation", + "Taker's Cameo", + "Ancestral Spirit's Horn", + "Gold Scarab", + "Silver Scarab", + "Crepus's Vial", + "Concealing Veil", + "Longtail Cat Talisman", + "Furled Finger's Trick-Mirror", + "Host's Trick-Mirror", + "Shabriri's Woe", + "Daedicar's Woe", + "Sacrificial Twig", + ] + + @functools.cached_property + def talismans_shadow_of_the_erdtree(self) -> List[str]: + return [ + "Blessed Blue Dew Talisman", + "Talisman of Lord's Bestowal", + "Two-Headed Turtle Talisman", + "Prosthesis-Wearer Heirloom", + "Outer God Heirloom", + "Golden Braid", + "Ailment Talisman", + "Two-Handed Sword Talisman", + "Pearl Shield Talisman", + "Retaliatory Crossed-Tree", + "Lacerating Crossed-Tree", + "Arrow's Soaring Sting Talisman", + "Sharpshot Talisman", + "Beloved Stardust", + "Rellana's Cameo", + "Shattered Stone Talisman", + "Smithing Talisman", + "Enraged Divine Beast", + "Talisman of the Dread", + "Verdigris Discus", + "Fine Crucible Feather Talisman", + "Talisman of All Crucibles", + "Aged One's Exultation", + "St. Trina's Smile", + "Blade of Mercy", + "Crusade Insignia", + "Dried Bouquet", + ] + + def talismans(self) -> List[str]: + talismans: List[str] = self.talismans_base[:] + + if self.has_dlc_shadow_of_the_erdtree: + talismans.extend(self.talismans_shadow_of_the_erdtree) + + return sorted(talismans) + + @staticmethod + def flask_charge_range() -> range: + return range(7, 15) + + @staticmethod + def flask_potency_range() -> range: + return range(3, 13) + + +# Archipelago Options +class EldenRingDLCOwned(OptionSet): + """ + Indicates which ELDEN RING DLC the player owns, if any. + """ + + display_name = "ELDEN RING DLC Owned" + valid_keys = [ + "Shadow of the Erdtree", + ] + + default = valid_keys