diff --git a/setup.py b/setup.py index c3e2dbac..c4165ba9 100644 --- a/setup.py +++ b/setup.py @@ -67,7 +67,6 @@ non_apworlds: set = { "Adventure", "ArchipIDLE", "Archipelago", - "Blasphemous", "ChecksFinder", "Clique", "DLCQuest", diff --git a/worlds/blasphemous/Exits.py b/worlds/blasphemous/Exits.py deleted file mode 100644 index a4460e2a..00000000 --- a/worlds/blasphemous/Exits.py +++ /dev/null @@ -1,135 +0,0 @@ -from typing import List, Dict - - -region_exit_table: Dict[str, List[str]] = { - "menu" : ["New Game"], - - "albero" : ["To The Holy Line", - "To Desecrated Cistern", - "To Wasteland of the Buried Churches", - "To Dungeons"], - - "attots" : ["To Mother of Mothers"], - - "ar" : ["To Mother of Mothers", - "To Wall of the Holy Prohibitions", - "To Deambulatory of His Holiness"], - - "bottc" : ["To Wasteland of the Buried Churches", - "To Ferrous Tree"], - - "botss" : ["To The Holy Line", - "To Mountains of the Endless Dusk"], - - "coolotcv" : ["To Graveyard of the Peaks", - "To Wall of the Holy Prohibitions"], - - "dohh" : ["To Archcathedral Rooftops"], - - "dc" : ["To Albero", - "To Mercy Dreams", - "To Mountains of the Endless Dusk", - "To Echoes of Salt", - "To Grievance Ascends"], - - "eos" : ["To Jondo", - "To Mountains of the Endless Dusk", - "To Desecrated Cistern", - "To The Resting Place of the Sister", - "To Mourning and Havoc"], - - "ft" : ["To Bridge of the Three Cavalries", - "To Hall of the Dawning", - "To Patio of the Silent Steps"], - - "gotp" : ["To Where Olive Trees Wither", - "To Convent of Our Lady of the Charred Visage"], - - "ga" : ["To Jondo", - "To Desecrated Cistern"], - - "hotd" : ["To Ferrous Tree"], - - "jondo" : ["To Mountains of the Endless Dusk", - "To Grievance Ascends"], - - "kottw" : ["To Mother of Mothers"], - - "lotnw" : ["To Mother of Mothers", - "To The Sleeping Canvases"], - - "md" : ["To Wasteland of the Buried Churches", - "To Desecrated Cistern", - "To The Sleeping Canvases"], - - "mom" : ["To Patio of the Silent Steps", - "To Archcathedral Rooftops", - "To Knot of the Three Words", - "To Library of the Negated Words", - "To All the Tears of the Sea"], - - "moted" : ["To Brotherhood of the Silent Sorrow", - "To Jondo", - "To Desecrated Cistern"], - - "mah" : ["To Echoes of Salt", - "To Mother of Mothers"], - - "potss" : ["To Ferrous Tree", - "To Mother of Mothers", - "To Wall of the Holy Prohibitions"], - - "petrous" : ["To The Holy Line"], - - "thl" : ["To Brotherhood of the Silent Sorrow", - "To Petrous", - "To Albero"], - - "trpots" : ["To Echoes of Salt"], - - "tsc" : ["To Library of the Negated Words", - "To Mercy Dreams"], - - "wothp" : ["To Archcathedral Rooftops", - "To Convent of Our Lady of the Charred Visage"], - - "wotbc" : ["To Albero", - "To Where Olive Trees Wither", - "To Mercy Dreams"], - - "wotw" : ["To Wasteland of the Buried Churches", - "To Graveyard of the Peaks"] -} - -exit_lookup_table: Dict[str, str] = { - "New Game": "botss", - "To Albero": "albero", - "To All the Tears of the Sea": "attots", - "To Archcathedral Rooftops": "ar", - "To Bridge of the Three Cavalries": "bottc", - "To Brotherhood of the Silent Sorrow": "botss", - "To Convent of Our Lady of the Charred Visage": "coolotcv", - "To Deambulatory of His Holiness": "dohh", - "To Desecrated Cistern": "dc", - "To Echoes of Salt": "eos", - "To Ferrous Tree": "ft", - "To Graveyard of the Peaks": "gotp", - "To Grievance Ascends": "ga", - "To Hall of the Dawning": "hotd", - "To Jondo": "jondo", - "To Knot of the Three Words": "kottw", - "To Library of the Negated Words": "lotnw", - "To Mercy Dreams": "md", - "To Mother of Mothers": "mom", - "To Mountains of the Endless Dusk": "moted", - "To Mourning and Havoc": "mah", - "To Patio of the Silent Steps": "potss", - "To Petrous": "petrous", - "To The Holy Line": "thl", - "To The Resting Place of the Sister": "trpots", - "To The Sleeping Canvases": "tsc", - "To Wall of the Holy Prohibitions": "wothp", - "To Wasteland of the Buried Churches": "wotbc", - "To Where Olive Trees Wither": "wotw", - "To Dungeons": "dungeon" -} \ No newline at end of file diff --git a/worlds/blasphemous/Items.py b/worlds/blasphemous/Items.py index 97dcefde..23cad0f5 100644 --- a/worlds/blasphemous/Items.py +++ b/worlds/blasphemous/Items.py @@ -219,6 +219,12 @@ item_table: List[ItemDict] = [ {'name': "Three Gnarled Tongues", 'count': 1, 'classification': ItemClassification.progression}, + {'name': "Boots of Pleading", + 'count': 1, + 'classification': ItemClassification.progression}, + {'name': "Purified Hand of the Nun", + 'count': 1, + 'classification': ItemClassification.progression}, # Mea Culpa Hearts {'name': "Smoking Heart of Incense", @@ -372,7 +378,7 @@ item_table: List[ItemDict] = [ 'classification': ItemClassification.progression}, {'name': "Quicksilver", 'count': 5, - 'classification': ItemClassification.useful}, + 'classification': ItemClassification.progression}, {'name': "Petrified Bell", 'count': 1, 'classification': ItemClassification.progression}, @@ -398,7 +404,7 @@ item_table: List[ItemDict] = [ # Skills {'name': "Combo Skill", 'count': 3, - 'classification': ItemClassification.useful}, + 'classification': ItemClassification.progression}, {'name': "Charged Skill", 'count': 3, 'classification': ItemClassification.progression}, @@ -410,7 +416,13 @@ item_table: List[ItemDict] = [ 'classification': ItemClassification.progression}, {'name': "Lunge Skill", 'count': 3, - 'classification': ItemClassification.useful}, + 'classification': ItemClassification.progression}, + {'name': "Dash Ability", + 'count': 1, + 'classification': ItemClassification.progression}, + {'name': "Wall Climb Ability", + 'count': 1, + 'classification': ItemClassification.progression}, # Other {'name': "Parietal bone of Lasser, the Inquisitor", @@ -625,6 +637,23 @@ item_table: List[ItemDict] = [ 'classification': ItemClassification.filler} ] +event_table: Dict[str, str] = { + "OpenedDCGateW": "D01Z05S24", + "OpenedDCGateE": "D01Z05S12", + "OpenedDCLadder": "D01Z05S20", + "OpenedWOTWCave": "D02Z01S06", + "RodeGOTPElevator": "D02Z02S11", + "OpenedConventLadder": "D02Z03S11", + "BrokeJondoBellW": "D03Z02S09", + "BrokeJondoBellE": "D03Z02S05", + "OpenedMOMLadder": "D04Z02S06", + "OpenedTSCGate": "D05Z02S11", + "OpenedARLadder": "D06Z01S23", + "BrokeBOTTCStatue": "D08Z01S02", + "OpenedWOTHPGate": "D09Z01S05", + "OpenedBOTSSLadder": "D17Z01S04" +} + group_table: Dict[str, Set[str]] = { "wounds" : ["Holy Wound of Attrition", "Holy Wound of Contrition", @@ -634,6 +663,10 @@ group_table: Dict[str, Set[str]] = { "Mirrored Mask of Dolphos", "Embossed Mask of Crescente"], + "marks" : ["Mark of the First Refuge", + "Mark of the Second Refuge", + "Mark of the Third Refuge"], + "tirso" : ["Bouquet of Rosemary", "Incense Garlic", "Olive Seeds", diff --git a/worlds/blasphemous/Locations.py b/worlds/blasphemous/Locations.py index 88065de4..6dd6e031 100644 --- a/worlds/blasphemous/Locations.py +++ b/worlds/blasphemous/Locations.py @@ -1,1295 +1,986 @@ -from typing import List, Set, TypedDict +from typing import List, TypedDict class LocationDict(TypedDict): name: str - region: str game_id: str room: str location_table: List[LocationDict] = [ - # Albero (35) + # Albero {'name': "Albero: Tirso's house, top floor", - 'region': "albero", 'game_id': "RB01", 'room': "D01Z02S02"}, {'name': "Albero: Outside Ossuary", - 'region': "albero", 'game_id': "CO43", 'room': "D01Z02S04"}, {'name': "Albero: Graveyard", - 'region': "albero", 'game_id': "CO16", 'room': "D01Z02S05"}, {'name': "Albero: Gate of Travel room", - 'region': "albero", 'game_id': "QI65", 'room': "D01Z02S07"}, {'name': "Albero: Child of Moonlight", - 'region': "albero", 'game_id': "RESCUED_CHERUB_08", 'room': "D01Z02S03"}, {'name': "Albero: Bless Linen Cloth", - 'region': "albero", 'game_id': "RE04", 'room': "D01Z02S01"}, {'name': "Albero: Bless Hatched Egg", - 'region': "albero", 'game_id': "RE10", 'room': "D01Z02S01"}, {'name': "Albero: Bless Severed Hand", - 'region': "albero", 'game_id': "RE02", 'room': "D01Z02S01"}, {'name': "Albero: First gift for Cleofas", - 'region': "albero", 'game_id': "QI01", 'room': "D01Z02S03"}, {'name': "Albero: Final gift for Cleofas", - 'region': "albero", 'game_id': "PR11", - 'room': "D01Z02S03"}, + 'room': "D01BZ04S01"}, {'name': "Albero: Tirso's 1st reward", - 'region': "albero", 'game_id': "QI66", 'room': "D01Z02S02"}, {'name': "Albero: Tirso's 2nd reward", - 'region': "albero", 'game_id': "Tirso[500]", 'room': "D01Z02S02"}, {'name': "Albero: Tirso's 3rd reward", - 'region': "albero", 'game_id': "Tirso[1000]", 'room': "D01Z02S02"}, {'name': "Albero: Tirso's 4th reward", - 'region': "albero", 'game_id': "Tirso[2000]", 'room': "D01Z02S02"}, {'name': "Albero: Tirso's 5th reward", - 'region': "albero", 'game_id': "Tirso[5000]", 'room': "D01Z02S02"}, {'name': "Albero: Tirso's 6th reward", - 'region': "albero", 'game_id': "Tirso[10000]", 'room': "D01Z02S02"}, {'name': "Albero: Tirso's final reward", - 'region': "albero", 'game_id': "QI56", 'room': "D01Z02S02"}, {'name': "Albero: Lvdovico's 1st reward", - 'region': "albero", 'game_id': "Lvdovico[500]", 'room': "D01Z02S03"}, {'name': "Albero: Lvdovico's 2nd reward", - 'region': "albero", 'game_id': "Lvdovico[1000]", 'room': "D01Z02S03"}, {'name': "Albero: Lvdovico's 3rd reward", - 'region': "albero", 'game_id': "PR03", 'room': "D01Z02S03"}, {'name': "Ossuary: Isidora, Voice of the Dead", - 'region': "albero", 'game_id': "QI201", 'room': "D01BZ08S01"}, {'name': "Albero: Mea Culpa altar", - 'region': "albero", 'game_id': "Sword[D01Z02S06]", 'room': "D01Z02S06"}, {'name': "Albero: Donate 5000 Tears", - 'region': "albero", 'game_id': "RB104", 'room': "D01BZ04S01"}, {'name': "Albero: Donate 50000 Tears", - 'region': "albero", 'game_id': "RB105", 'room': "D01BZ04S01"}, {'name': "Ossuary: 1st reward", - 'region': "albero", 'game_id': "Undertaker[250]", 'room': "D01BZ06S01"}, {'name': "Ossuary: 2nd reward", - 'region': "albero", 'game_id': "Undertaker[500]", 'room': "D01BZ06S01"}, {'name': "Ossuary: 3rd reward", - 'region': "albero", 'game_id': "Undertaker[750]", 'room': "D01BZ06S01"}, {'name': "Ossuary: 4th reward", - 'region': "albero", 'game_id': "Undertaker[1000]", 'room': "D01BZ06S01"}, {'name': "Ossuary: 5th reward", - 'region': "albero", 'game_id': "Undertaker[1250]", 'room': "D01BZ06S01"}, {'name': "Ossuary: 6th reward", - 'region': "albero", 'game_id': "Undertaker[1500]", 'room': "D01BZ06S01"}, {'name': "Ossuary: 7th reward", - 'region': "albero", 'game_id': "Undertaker[1750]", 'room': "D01BZ06S01"}, {'name': "Ossuary: 8th reward", - 'region': "albero", 'game_id': "Undertaker[2000]", 'room': "D01BZ06S01"}, {'name': "Ossuary: 9th reward", - 'region': "albero", 'game_id': "Undertaker[2500]", 'room': "D01BZ06S01"}, {'name': "Ossuary: 10th reward", - 'region': "albero", 'game_id': "Undertaker[3000]", 'room': "D01BZ06S01"}, {'name': "Ossuary: 11th reward", - 'region': "albero", 'game_id': "Undertaker[5000]", 'room': "D01BZ06S01"}, - # All the Tears of the Sea (1) + # All the Tears of the Sea {'name': "AtTotS: Miriam's gift", - 'region': "attots", 'game_id': "PR201", - 'room': "D04Z04S02"}, + 'room': "D04Z04S01"}, - # Archcathedral Rooftops (11) + # Archcathedral Rooftops {'name': "AR: First soldier fight", - 'region': "ar", 'game_id': "QI02", 'room': "D06Z01S03"}, {'name': "AR: Second soldier fight", - 'region': "ar", 'game_id': "QI03", 'room': "D06Z01S06"}, {'name': "AR: Third soldier fight", - 'region': "ar", 'game_id': "QI04", 'room': "D06Z01S21"}, {'name': "AR: Upper west shaft ledge", - 'region': "ar", 'game_id': "CO06", 'room': "D06Z01S12"}, {'name': "AR: Upper west shaft Child of Moonlight", - 'region': "ar", 'game_id': "RESCUED_CHERUB_36", 'room': "D06Z01S12"}, {'name': "AR: Upper west shaft chest", - 'region': "ar", 'game_id': "PR12", 'room': "D06Z01S12"}, {'name': "AR: Statue near MoM", - 'region': "ar", 'game_id': "HE04", 'room': "D06Z01S22"}, {'name': "AR: Lady of the Six Sorrows", - 'region': "ar", 'game_id': "Lady[D06Z01S24]", 'room': "D06Z01S24"}, {'name': "AR: Upper east shaft ledge", - 'region': "ar", 'game_id': "CO40", 'room': "D06Z01S15"}, {'name': "AR: Mea Culpa altar", - 'region': "ar", 'game_id': "Sword[D06Z01S11]", 'room': "D06Z01S11"}, {'name': "AR: Crisanta of the Wrapped Agony", - 'region': "ar", 'game_id': "BS16", 'room': "D06Z01S25"}, - # Bridge of the Three Cavalries (3) + # Bridge of the Three Cavalries {'name': "BotTC: Esdras, of the Anointed Legion", - 'region': "bottc", 'game_id': "BS12", 'room': "D08Z01S01"}, {'name': "BotTC: Esdras' gift", - 'region': "bottc", 'game_id': "PR09", 'room': "D08Z01S01"}, {'name': "BotTC: Inside giant statue", - 'region': "bottc", 'game_id': "HE101", 'room': "D08Z01S02"}, - # Brotherhood of the Silent Sorrow (11) - {'name': "BotSS: Beginning gift", - 'region': "botss", - 'game_id': "QI106", - 'room': "D17Z01S01"}, + # Brotherhood of the Silent Sorrow {'name': "BotSS: Starting room Child of Moonlight", - 'region': "botss", 'game_id': "RESCUED_CHERUB_06", 'room': "D17Z01S01"}, {'name': "BotSS: Starting room ledge", - 'region': "botss", 'game_id': "RB204", 'room': "D17Z01S01"}, {'name': "BotSS: Chamber of the Eldest Brother", - 'region': "botss", 'game_id': "RE01", - 'room': "D17BZ01S01[relic]"}, + 'room': "D17BZ01S01"}, {'name': "BotSS: Mea Culpa altar", - 'region': "botss", 'game_id': "Sword[D17Z01S08]", 'room': "D17Z01S08"}, {'name': "BotSS: Platforming gauntlet", - 'region': "botss", 'game_id': "CO25", - 'room': "D17Z01S04"}, - {'name': "BotSS: Blue candle", - 'region': "botss", - 'game_id': "RB25", - 'room': "D17Z01S04"}, + 'room': "D17BZ02S01"}, {'name': "BotSS: Outside church", - 'region': "botss", 'game_id': "PR203", 'room': "D17Z01S14"}, {'name': "BotSS: Esdras' final gift", - 'region': "botss", 'game_id': "QI204", 'room': "D17Z01S15"}, {'name': "BotSS: Crisanta's gift", - 'region': "botss", 'game_id': "QI301", 'room': "D17Z01S15"}, {'name': "BotSS: Warden of the Silent Sorrow", - 'region': "botss", 'game_id': "BS13", 'room': "D17Z01S11"}, - # Convent of Our Lady of the Charred Visage (13) + # Convent of Our Lady of the Charred Visage {'name': "CoOLotCV: Snowy window ledge", - 'region': "coolotcv", 'game_id': "CO05", 'room': "D02Z03S03"}, {'name': "CoOLotCV: Center enemy lineup", - 'region': "coolotcv", 'game_id': "CO15", 'room': "D02Z03S07"}, {'name': "CoOLotCV: Center miasma room", - 'region': "coolotcv", 'game_id': "RB08", 'room': "D02Z03S05"}, {'name': "CoOLotCV: Lower west statue", - 'region': "coolotcv", 'game_id': "HE03", 'room': "D02Z03S12"}, {'name': "CoOLotCV: Lady of the Six Sorrows", - 'region': "coolotcv", 'game_id': "Lady[D02Z03S15]", 'room': "D02Z03S15"}, {'name': "CoOLotCV: Mea Culpa altar", - 'region': "coolotcv", 'game_id': "Sword[D02Z03S13]", 'room': "D02Z03S13"}, - {'name': "CoOLotCV: Red candle", - 'region': "coolotcv", - 'game_id': "RB18", - 'room': "D02Z03S06"}, - {'name': "CoOLotCV: Blue candle", - 'region': "coolotcv", + {'name': "CoOLotCV: First blue candle", 'game_id': "RB24", 'room': "D02Z03S17"}, {'name': "CoOLotCV: Outside pathway", - 'region': "coolotcv", 'game_id': "RB107", 'room': "D02Z03S23"}, {'name': "CoOLotCV: Fountain of burning oil", - 'region': "coolotcv", 'game_id': "QI57", 'room': "D02Z03S21"}, {'name': "CoOLotCV: Our Lady of the Charred Visage", - 'region': "coolotcv", 'game_id': "BS03", 'room': "D02Z03S20"}, {'name': "CoOLotCV: Visage of Compunction", - 'region': "coolotcv", 'game_id': "QI40", 'room': "D02Z03S21"}, {'name': "CoOLotCV: Mask room", - 'region': "coolotcv", 'game_id': "QI61", 'room': "D02Z03S19"}, - # Deambulatory of His Holiness (3) + # Deambulatory of His Holiness {'name': "DoHH: Viridiana's gift", - 'region': "dohh", 'game_id': "PR08", 'room': "D07Z01S01"}, - # Desecrated Cistern (20) + # Desecrated Cistern {'name': "DC: Lady of the Six Sorrows, from MD", - 'region': "dc", 'game_id': "Lady[D01Z05S22]", 'room': "D01Z05S22"}, {'name': "DC: Behind sewage drips", - 'region': "dc", 'game_id': "CO41", 'room': "D01Z05S15"}, {'name': "DC: Child of Moonlight, above water", - 'region': "dc", 'game_id': "RESCUED_CHERUB_11", 'room': "D01Z05S14"}, {'name': "DC: Lower east tunnel chest", - 'region': "dc", 'game_id': "QI45", 'room': "D01Z05S11"}, {'name': "DC: Upper east tunnel chest", - 'region': "dc", 'game_id': "PR16", 'room': "D01Z05S06"}, {'name': "DC: Upper east Child of Moonlight", - 'region': "dc", 'game_id': "RESCUED_CHERUB_13", 'room': "D01Z05S06"}, {'name': "DC: Hidden alcove near fountain", - 'region': "dc", 'game_id': "QI67", 'room': "D01Z05S05"}, {'name': "DC: Shortcut to WotBC", - 'region': "dc", 'game_id': "CO09", 'room': "D01Z05S05"}, {'name': "DC: Oil of the Pilgrims", - 'region': "dc", 'game_id': "Oil[D01Z05S07]", 'room': "D01Z05S07"}, {'name': "DC: Child of Moonlight, miasma room", - 'region': "dc", 'game_id': "RESCUED_CHERUB_14", 'room': "D01Z05S08"}, {'name': "DC: Behind gate in miasma room", - 'region': "dc", 'game_id': "QI12", 'room': "D01Z05S08"}, {'name': "DC: Child of Moonlight, behind pillar", - 'region': "dc", 'game_id': "RESCUED_CHERUB_12", 'room': "D01Z05S13"}, {'name': "DC: High ledge near elevator shaft", - 'region': "dc", 'game_id': "CO32", 'room': "D01Z05S17"}, {'name': "DC: Shroud puzzle", - 'region': "dc", 'game_id': "RB03", - 'room': "D01Z05S21"}, + 'room': "D01BZ05S01"}, {'name': "DC: Chalice room", - 'region': "dc", 'game_id': "QI75", 'room': "D01Z05S23"}, {'name': "DC: Mea Culpa altar", - 'region': "dc", 'game_id': "Sword[D01Z05S24]", 'room': "D01Z05S24"}, {'name': "DC: Lady of the Six Sorrows, elevator shaft", - 'region': "dc", 'game_id': "Lady[D01Z05S26]", 'room': "D01Z05S26"}, {'name': "DC: Top of elevator Child of Moonlight", - 'region': "dc", 'game_id': "RESCUED_CHERUB_15", 'room': "D01Z05S20"}, {'name': "DC: Elevator shaft Child of Moonlight", - 'region': "dc", 'game_id': "RESCUED_CHERUB_22", 'room': "D01Z05S25"}, {'name': "DC: Elevator shaft ledge", - 'region': "dc", 'game_id': "CO44", 'room': "D01Z05S25"}, - # Echoes of Salt (2) + # Echoes of Salt {'name': "EoS: Lantern jump near MotED", - 'region': "eos", 'game_id': "RB108", 'room': "D20Z01S02"}, {'name': "EoS: Lantern jump near elevator", - 'region': "eos", 'game_id': "RB202", 'room': "D20Z01S09"}, - # Graveyard of the Peaks (21) + # Graveyard of the Peaks {'name': "GotP: Shop cave Child of Moonlight", - 'region': "gotp", 'game_id': "RESCUED_CHERUB_31", 'room': "D02Z02S08"}, {'name': "GotP: Shop cave hidden hole", - 'region': "gotp", 'game_id': "CO42", 'room': "D02Z02S08"}, {'name': "GotP: Shop item 1", - 'region': "gotp", 'game_id': "QI11", - 'room': "D02BZ01S01"}, + 'room': "D02BZ02S01"}, {'name': "GotP: Shop item 2", - 'region': "gotp", 'game_id': "RB37", - 'room': "D02BZ01S01"}, + 'room': "D02BZ02S01"}, {'name': "GotP: Shop item 3", - 'region': "gotp", 'game_id': "RB02", - 'room': "D02BZ01S01"}, + 'room': "D02BZ02S01"}, {'name': "GotP: Confessor Dungeon room", - 'region': "gotp", 'game_id': "RB38", 'room': "D02Z02S06"}, {'name': "GotP: Elevator shaft Child of Moonlight", - 'region': "gotp", 'game_id': "RESCUED_CHERUB_26", 'room': "D02Z02S11"}, {'name': "GotP: Elevator shaft ledge", - 'region': "gotp", 'game_id': "QI53", 'room': "D02Z02S11"}, {'name': "GotP: Lady of the Six Sorrows", - 'region': "gotp", 'game_id': "Lady[D02Z02S12]", 'room': "D02Z02S12"}, {'name': "GotP: Self sacrifice statue", - 'region': "gotp", 'game_id': "HE11", 'room': "D02Z02S13"}, {'name': "GotP: Lower east shaft", - 'region': "gotp", 'game_id': "QI46", 'room': "D02Z02S03"}, {'name': "GotP: Center east shaft", - 'region': "gotp", 'game_id': "CO29", 'room': "D02Z02S03"}, {'name': "GotP: Upper east shaft", - 'region': "gotp", 'game_id': "QI08", 'room': "D02Z02S03"}, {'name': "GotP: East cliffside", - 'region': "gotp", 'game_id': "RB106", 'room': "D02Z02S14"}, {'name': "GotP: West shaft Child of Moonlight", - 'region': "gotp", 'game_id': "RESCUED_CHERUB_25", 'room': "D02Z02S04"}, {'name': "GotP: Lower west shaft", - 'region': "gotp", 'game_id': "RB32", 'room': "D02Z02S04"}, {'name': "GotP: Upper west shaft", - 'region': "gotp", 'game_id': "CO01", 'room': "D02Z02S04"}, {'name': "GotP: Center shaft Child of Moonlight", - 'region': "gotp", 'game_id': "RESCUED_CHERUB_24", 'room': "D02Z02S02"}, {'name': "GotP: Center shaft ledge", - 'region': "gotp", 'game_id': "RB15", 'room': "D02Z02S05"}, {'name': "GotP: Oil of the Pilgrims", - 'region': "gotp", 'game_id': "Oil[D02Z02S10]", 'room': "D02Z02S10"}, {'name': "GotP: Amanecida of the Bejeweled Arrow", - 'region': "gotp", - 'game_id': "D02Z02S14[18000]", + 'game_id': "Amanecida[D02Z02S14]", 'room': "D02Z02S14"}, - # Grievance Ascends (12) + # Grievance Ascends {'name': "GA: Lower west ledge", - 'region': "ga", 'game_id': "QI44", 'room': "D03Z03S02"}, {'name': "GA: Miasma room treasure", - 'region': "ga", 'game_id': "RE07", 'room': "D03Z03S06"}, {'name': "GA: Miasma room Child of Moonlight", - 'region': "ga", 'game_id': "RESCUED_CHERUB_19", 'room': "D03Z03S06"}, {'name': "GA: Miasma room floor", - 'region': "ga", 'game_id': "CO12", 'room': "D03Z03S06"}, {'name': "GA: Oil of the Pilgrims", - 'region': "ga", 'game_id': "Oil[D03Z03S13]", 'room': "D03Z03S13"}, {'name': "GA: End of blood bridge", - 'region': "ga", 'game_id': "QI10", 'room': "D03Z03S08"}, {'name': "GA: Blood bridge Child of Moonlight", - 'region': "ga", 'game_id': "RESCUED_CHERUB_21", 'room': "D03Z03S08"}, {'name': "GA: Lower east Child of Moonlight", - 'region': "ga", 'game_id': "RESCUED_CHERUB_20", 'room': "D03Z03S09"}, {'name': "GA: Altasgracias' gift", - 'region': "ga", 'game_id': "QI13", 'room': "D03Z03S10"}, {'name': "GA: Empty giant egg", - 'region': "ga", 'game_id': "RB06", 'room': "D03Z03S10"}, {'name': "GA: Tres Angustias", - 'region': "ga", 'game_id': "BS04", 'room': "D03Z03S15"}, {'name': "GA: Visage of Contrition", - 'region': "ga", 'game_id': "QI39", 'room': "D03Z03S16"}, - # Hall of the Dawning (2) + # Hall of the Dawning {'name': "HotD: Mirror room", - 'region': "hotd", 'game_id': "QI105", - 'room': "D08Z02S01"}, + 'room': "D08Z03S01"}, {'name': "HotD: Laudes, the First of the Amanecidas", - 'region': "hotd", 'game_id': "LaudesBossTrigger[30000]", - 'room': "D08Z02S03"}, + 'room': "D08Z03S03"}, - # Jondo (13) + # Jondo {'name': "Jondo: Upper east ledge", - 'region': "jondo", 'game_id': "CO08", - 'room': "D03Z03S01"}, + 'room': "D03Z02S01"}, {'name': "Jondo: Upper east chest", - 'region': "jondo", 'game_id': "PR10", - 'room': "D03Z03S01"}, + 'room': "D03Z02S01"}, {'name': "Jondo: Lower east under chargers", - 'region': "jondo", 'game_id': "CO33", - 'room': "D03Z03S04"}, + 'room': "D03Z02S04"}, {'name': "Jondo: Lower east bell trap", - 'region': "jondo", 'game_id': "QI19", - 'room': "D03Z03S06"}, + 'room': "D03Z02S06"}, {'name': "Jondo: Upper east Child of Moonlight", - 'region': "jondo", 'game_id': "RESCUED_CHERUB_18", - 'room': "D03Z03S05"}, + 'room': "D03Z02S05"}, {'name': "Jondo: Spike tunnel Child of Moonlight", - 'region': "jondo", 'game_id': "RESCUED_CHERUB_37", - 'room': "D03Z03S11"}, + 'room': "D03Z02S11"}, {'name': "Jondo: Spike tunnel statue", - 'region': "jondo", 'game_id': "HE06", - 'room': "D03Z03S11"}, + 'room': "D03Z02S11"}, {'name': "Jondo: Spike tunnel cave", - 'region': "jondo", 'game_id': "QI103", - 'room': "D03Z03S15"}, + 'room': "D03Z02S15"}, {'name': "Jondo: Lower west lift alcove", - 'region': "jondo", 'game_id': "CO07", - 'room': "D03Z03S07"}, + 'room': "D03Z02S07"}, {'name': "Jondo: Lower west bell alcove", - 'region': "jondo", 'game_id': "QI41", - 'room': "D03Z03S08"}, + 'room': "D03Z02S08"}, {'name': "Jondo: Upper west bell puzzle", - 'region': "jondo", 'game_id': "QI52", - 'room': "D03Z03S12"}, + 'room': "D03Z02S12"}, {'name': "Jondo: Upper west tree root", - 'region': "jondo", 'game_id': "RB28", - 'room': "D03Z03S13"}, + 'room': "D03Z02S13"}, {'name': "Jondo: Upper west Child of Moonlight", - 'region': "jondo", 'game_id': "RESCUED_CHERUB_17", - 'room': "D03Z03S10"}, + 'room': "D03Z02S10"}, - # Knot of the Three Words (1) + # Knot of the Three Words {'name': "KotTW: Gift from the Traitor", - 'region': "kottw", 'game_id': "HE201", 'room': "D04Z03S02"}, - # Library of the Negated Words (18) + # Library of the Negated Words {'name': "LotNW: Platform room Child of Moonlight", - 'region': "lotnw", 'game_id': "RESCUED_CHERUB_01", 'room': "D05Z01S04"}, {'name': "LotNW: Platform room ledge", - 'region': "lotnw", 'game_id': "CO18", 'room': "D05Z01S04"}, {'name': "LotNW: Root ceiling platform", - 'region': "lotnw", 'game_id': "CO22", 'room': "D05Z01S05"}, {'name': "LotNW: Hidden floor", - 'region': "lotnw", 'game_id': "QI50", 'room': "D05Z01S05"}, {'name': "LotNW: Miasma hallway chest", - 'region': "lotnw", 'game_id': "RB31", 'room': "D05Z01S06"}, {'name': "LotNW: Lady of the Six Sorrows", - 'region': "lotnw", 'game_id': "Lady[D05Z01S14]", 'room': "D05Z01S14"}, {'name': "LotNW: Bone puzzle", - 'region': "lotnw", 'game_id': "PR15", 'room': "D05Z01S18"}, {'name': "LotNW: Lowest west upper ledge", - 'region': "lotnw", 'game_id': "CO28", 'room': "D05Z01S11"}, {'name': "LotNW: Platform puzzle chest", - 'region': "lotnw", 'game_id': "PR07", 'room': "D05Z01S10"}, {'name': "LotNW: Lowest west center ledge", - 'region': "lotnw", 'game_id': "RB30", 'room': "D05Z01S11"}, {'name': "LotNW: Lowest west Child of Moonlight", - 'region': "lotnw", 'game_id': "RESCUED_CHERUB_02", 'room': "D05Z01S11"}, {'name': "LotNW: Oil of the Pilgrims", - 'region': "lotnw", 'game_id': "Oil[D05Z01S19]", 'room': "D05Z01S19"}, {'name': "LotNW: Elevator Child of Moonlight", - 'region': "lotnw", 'game_id': "RESCUED_CHERUB_32", 'room': "D05Z01S21"}, {'name': "LotNW: Mask room", - 'region': "lotnw", 'game_id': "QI62", 'room': "D05Z01S15"}, {'name': "LotNW: Mea Culpa altar", - 'region': "lotnw", 'game_id': "Sword[D05Z01S13]", 'room': "D05Z01S13"}, - {'name': "LotNW: Red candle", - 'region': "lotnw", - 'game_id': "RB19", - 'room': "D05Z01S02"}, {'name': "LotNW: Silence for Diosdado", - 'region': "lotnw", 'game_id': "RB203", - 'room': "D05Z01S11"}, # ? + 'room': "D05Z01S11"}, {'name': "LotNW: Twisted wood hidden wall", - 'region': "lotnw", 'game_id': "RB301", 'room': "D05BZ01S01"}, - # Mercy Dreams (15) + # Mercy Dreams {'name': "MD: First area hidden wall", - 'region': "md", 'game_id': "CO30", 'room': "D01Z04S05"}, {'name': "MD: Second area trapped chest", - 'region': "md", 'game_id': "PR01", 'room': "D01Z04S07"}, {'name': "MD: Second area ledge", - 'region': "md", 'game_id': "CO03", 'room': "D01Z04S06"}, {'name': "MD: Second area Child of Moonlight", - 'region': "md", 'game_id': "RESCUED_CHERUB_09", 'room': "D01Z04S06"}, - {'name': "MD: Red candle", - 'region': "md", + {'name': "MD: First red candle", 'game_id': "RB17", 'room': "D01Z04S08"}, {'name': "MD: Shop item 1", - 'region': "md", 'game_id': "QI58", 'room': "D01BZ02S01"}, {'name': "MD: Shop item 2", - 'region': "md", 'game_id': "RB05", 'room': "D01BZ02S01"}, {'name': "MD: Shop item 3", - 'region': "md", 'game_id': "RB09", 'room': "D01BZ02S01"}, {'name': "MD: Third area hidden room", - 'region': "md", 'game_id': "QI48", 'room': "D01Z04S11"}, {'name': "MD: Sliding challenge", - 'region': "md", 'game_id': "CO38", 'room': "D01Z04S14"}, {'name': "MD: Ten Piedad", - 'region': "md", 'game_id': "BS01", 'room': "D01Z04S18"}, {'name': "MD: Visage of Attrition", - 'region': "md", 'game_id': "QI38", 'room': "D01Z04S19"}, - {'name': "MD: Blue candle", - 'region': "md", - 'game_id': "RB26", - 'room': "D01Z04S16"}, {'name': "MD: Cave Child of Moonlight", - 'region': "md", 'game_id': "RESCUED_CHERUB_33", 'room': "D01Z04S16"}, {'name': "MD: Behind gate to TSC", - 'region': "md", 'game_id': "CO21", 'room': "D01Z04S13"}, - # Mother of Mothers (14) + # Mother of Mothers {'name': "MoM: Oil of the Pilgrims", - 'region': "mom", 'game_id': "Oil[D04Z02S14]", 'room': "D04Z02S14"}, {'name': "MoM: Upper east ledge", - 'region': "mom", 'game_id': "RB33", 'room': "D04Z02S07"}, {'name': "MoM: East chandelier platform", - 'region': "mom", 'game_id': "CO35", - 'room': "D04Z02S"}, + 'room': "D04Z02S07"}, {'name': "MoM: Lower west Child of Moonlight", - 'region': "mom", 'game_id': "RESCUED_CHERUB_30", - 'room': ""}, + 'room': "D04Z02S01"}, {'name': "MoM: Upper west floor", - 'region': "mom", 'game_id': "CO17", 'room': "D04Z02S02"}, {'name': "MoM: Redento's treasure", - 'region': "mom", 'game_id': "RE03", 'room': "D04BZ02S01"}, {'name': "MoM: Final meeting with Redento", - 'region': "mom", 'game_id': "QI54", 'room': "D04BZ02S01"}, {'name': "MoM: Giant chandelier statue", - 'region': "mom", 'game_id': "HE01", 'room': "D04Z02S16"}, {'name': "MoM: Outside Cleofas' room", - 'region': "mom", 'game_id': "CO34", 'room': "D04Z02S06"}, {'name': "MoM: Upper center floor", - 'region': "mom", 'game_id': "CO20", 'room': "D04Z02S11"}, {'name': "MoM: Upper center Child of Moonlight", - 'region': "mom", 'game_id': "RESCUED_CHERUB_29", - 'room': ""}, + 'room': "D04Z02S11"}, {'name': "MoM: Mea Culpa altar", - 'region': "mom", 'game_id': "Sword[D04Z02S12]", 'room': "D04Z02S12"}, {'name': "MoM: Melquiades, The Exhumed Archbishop", - 'region': "mom", 'game_id': "BS05", 'room': "D04Z02S22"}, {'name': "MoM: Mask room", - 'region': "mom", 'game_id': "QI60", 'room': "D04Z02S15"}, - # Mountains of the Endless Dusk (8) + # Mountains of the Endless Dusk {'name': "MotED: Under entrance to DC", - 'region': "moted", 'game_id': "CO13", 'room': "D03Z01S01"}, {'name': "MotED: Perpetva", - 'region': "moted", 'game_id': "RB13", 'room': "D03Z01S06"}, {'name': "MotED: Child of Moonlight, above chasm", - 'region': "moted", 'game_id': "RESCUED_CHERUB_16", 'room': "D03Z01S03"}, {'name': "MotED: Platform above chasm", - 'region': "moted", 'game_id': "QI47", 'room': "D03Z01S03"}, {'name': "MotED: 1st meeting with Redento", - 'region': "moted", 'game_id': "RB22", 'room': "D03Z01S03"}, {'name': "MotED: Blood platform alcove", - 'region': "moted", 'game_id': "QI63", 'room': "D03Z01S04"}, {'name': "MotED: Egg hatching", - 'region': "moted", 'game_id': "QI14", 'room': "D03Z01S06"}, {'name': "MotED: Amanecida of the Golden Blades", - 'region': "moted", - 'game_id': "D03Z01S03[18000]", + 'game_id': "Amanecida[D03Z01S03]", 'room': "D03Z01S03"}, - # Mourning and Havoc (4) + # Mourning and Havoc {'name': "MaH: West chest", - 'region': "mah", 'game_id': "PR202", 'room': "D20Z02S11"}, {'name': "MaH: Upper east chest", - 'region': "mah", 'game_id': "RB201", 'room': "D20Z02S02"}, {'name': "MaH: Sierpes' eye", - 'region': "mah", 'game_id': "QI202", 'room': "D20Z02S08"}, {'name': "MaH: Sierpes", - 'region': "mah", 'game_id': "BossTrigger[5000]", 'room': "D20Z02S08"}, - # Patio of the Silent Steps (9) + # Patio of the Silent Steps {'name': "PotSS: First area Child of Moonlight", - 'region': "potss", 'game_id': "RESCUED_CHERUB_35", 'room': "D04Z01S01"}, {'name': "PotSS: First area ledge", - 'region': "potss", 'game_id': "CO23", 'room': "D04Z01S01"}, {'name': "PotSS: Second area ledge", - 'region': "potss", 'game_id': "RB14", 'room': "D04Z01S02"}, {'name': "PotSS: Third area Child of Moonlight", - 'region': "potss", 'game_id': "RESCUED_CHERUB_28", 'room': "D04Z01S03"}, {'name': "PotSS: Third area lower ledge", - 'region': "potss", 'game_id': "QI37", 'room': "D04Z01S03"}, {'name': "PotSS: Third area upper ledge", - 'region': "potss", 'game_id': "CO39", 'room': "D04Z01S03"}, {'name': "PotSS: Climb to WotHP", - 'region': "potss", 'game_id': "QI102", - 'room': "D04Z01S05"}, + 'room': "D04Z01S06"}, {'name': "PotSS: 4th meeting with Redento", - 'region': "potss", 'game_id': "RB21", - 'room': "D04Z01S01"}, + 'room': "D04Z01S04"}, {'name': "PotSS: Amanecida of the Chiselled Steel", - 'region': "potss", - 'game_id': "D04Z01S04[18000]", + 'game_id': "Amanecida[D04Z01S04]", 'room': "D04Z01S04"}, - # Petrous (1) + # Petrous {'name': "Petrous: Temple entrance", - 'region': "petrous", 'game_id': "QI101", 'room': "D01Z06S01"}, - # The Resting Place of the Sister (1) + # The Resting Place of the Sister {'name': "TRPotS: Perpetva's shrine", - 'region': "trpots", 'game_id': "QI203", 'room': "D20Z03S01"}, - # The Sleeping Canvases (10) + # The Sleeping Canvases {'name': "TSC: Painting ladder ledge", - 'region': "tsc", 'game_id': "QI64", 'room': "D05Z02S02"}, {'name': "TSC: Candle wax puzzle", - 'region': "tsc", 'game_id': "HE07", 'room': "D05Z02S08"}, {'name': "TSC: Shop item 1", - 'region': "tsc", 'game_id': "RB12", 'room': "D05BZ02S01"}, {'name': "TSC: Shop item 2", - 'region': "tsc", 'game_id': "QI49", 'room': "D05BZ02S01"}, {'name': "TSC: Shop item 3", - 'region': "tsc", 'game_id': "QI71", 'room': "D05BZ02S01"}, {'name': "TSC: Swinging blade tunnel", - 'region': "tsc", 'game_id': "QI104", 'room': "D05Z02S15"}, {'name': "TSC: Exposito, Scion of Abjuration", - 'region': "tsc", 'game_id': "BS06", 'room': "D05Z02S14"}, {'name': "TSC: Under elevator shaft", - 'region': "tsc", 'game_id': "CO31", 'room': "D05Z02S11"}, {'name': "TSC: Jocinero's 1st reward", - 'region': "tsc", 'game_id': "RE05", - 'room': "D05Z02S10"}, # ? + 'room': "D05Z02S10"}, {'name': "TSC: Jocinero's final reward", - 'region': "tsc", 'game_id': "PR05", - 'room': "D05Z02S10"}, # ? + 'room': "D05Z02S10"}, - # The Holy Line (6) + # The Holy Line {'name': "THL: Deogracias' gift", - 'region': "thl", 'game_id': "QI31", 'room': "D01Z01S07"}, {'name': "THL: Hanging skeleton", - 'region': "thl", 'game_id': "PR14", 'room': "D01Z01S02"}, {'name': "THL: Across blood platforms", - 'region': "thl", 'game_id': "RB07", 'room': "D01Z01S02"}, {'name': "THL: Child of Moonlight", - 'region': "thl", 'game_id': "RESCUED_CHERUB_07", 'room': "D01Z01S03"}, {'name': "THL: Underground ledge", - 'region': "thl", 'game_id': "CO04", 'room': "D01Z01S03"}, {'name': "THL: Underground chest", - 'region': "thl", 'game_id': "QI55", 'room': "D01Z01S03"}, - # Wall of the Holy Prohibitions (19) + # Wall of the Holy Prohibitions {'name': "WotHP: Upper east room, lift puzzle", - 'region': "wothp", 'game_id': "RB11", 'room': "D09Z01S02"}, {'name': "WotHP: Upper east room, center cell ledge", - 'region': "wothp", 'game_id': "CO10", - 'room': "D09BZ01S01[Cell22]"}, + 'room': "D09BZ01S01"}, {'name': "WotHP: Upper east room, center cell floor", - 'region': "wothp", 'game_id': "QI69", - 'room': "D09BZ01S01[Cell22]"}, + 'room': "D09BZ01S01"}, {'name': "WotHP: Upper east room, top bronze cell", - 'region': "wothp", 'game_id': "RESCUED_CHERUB_03", - 'room': "D09BZ01S01[Cell1]"}, + 'room': "D09BZ01S01"}, {'name': "WotHP: Upper east room, top silver cell", - 'region': "wothp", 'game_id': "CO24", - 'room': "D09BZ01S01[Cell6]"}, + 'room': "D09BZ01S01"}, {'name': "WotHP: Upper east room, center gold cell", - 'region': "wothp", 'game_id': "QI51", 'room': "D09Z01S02"}, {'name': "WotHP: Upper west room, center gold cell", - 'region': "wothp", 'game_id': "CO26", - 'room': "D09BZ01S01[Cell16]"}, + 'room': "D09BZ01S01"}, {'name': "WotHP: Lower west room, bottom gold cell", - 'region': "wothp", 'game_id': "CO02", - 'room': "D09BZ01S01[Cell21]"}, + 'room': "D09BZ01S01"}, {'name': "WotHP: Upper west room, top silver cell", - 'region': "wothp", 'game_id': "RESCUED_CHERUB_34", - 'room': "D09BZ01S01[Cell17~18]"}, # ? + 'room': "D09BZ01S01"}, {'name': "WotHP: Lower west room, top ledge", - 'region': "wothp", 'game_id': "RB16", - 'room': "D09BZ01S01[Cell24]"}, + 'room': "D09Z01S09"}, {'name': "WotHP: Lower east room, hidden ledge", - 'region': "wothp", 'game_id': "CO27", 'room': "D09Z01S10"}, {'name': "WotHP: Lower east room, bottom silver cell", - 'region': "wothp", 'game_id': "RESCUED_CHERUB_04", - 'room': "D09BZ01S01[Cell11]"}, + 'room': "D09BZ01S01"}, {'name': "WotHP: Lower east room, top bronze cell", - 'region': "wothp", 'game_id': "QI70", 'room': "D09Z01S10"}, {'name': "WotHP: Lower east room, top silver cell", - 'region': "wothp", 'game_id': "CO37", - 'room': "D09BZ01S01[Cell10]"}, + 'room': "D09BZ01S01"}, {'name': "WotHP: Outside Child of Moonlight", - 'region': "wothp", 'game_id': "RESCUED_CHERUB_05", 'room': "D09Z01S06"}, {'name': "WotHP: Oil of the Pilgrims", - 'region': "wothp", 'game_id': "Oil[D09Z01S12]", 'room': "D09Z01S12"}, {'name': "WotHP: Quirce, Returned By The Flames", - 'region': "wothp", 'game_id': "BS14", 'room': "D09Z01S03"}, {'name': "WotHP: Collapsing floor ledge", - 'region': "wothp", 'game_id': "QI72", 'room': "D09Z01S08"}, {'name': "WotHP: Amanecida of the Molten Thorn", - 'region': "wothp", - 'game_id': "D09Z01S01[18000]", + 'game_id': "Amanecida[D09Z01S01]", 'room': "D09Z01S01"}, - # Wasteland of the Buried Churches (8) + # Wasteland of the Buried Churches {'name': "WotBC: Lower log path", - 'region': "wotbc", 'game_id': "RB04", 'room': "D01Z03S01"}, {'name': "WotBC: Hidden alcove", - 'region': "wotbc", 'game_id': "CO14", 'room': "D01Z03S02"}, {'name': "WotBC: Outside ledge", - 'region': "wotbc", 'game_id': "CO36", 'room': "D01Z03S03"}, {'name': "WotBC: Outside Child of Moonlight", - 'region': "wotbc", 'game_id': "RESCUED_CHERUB_10", 'room': "D01Z03S03"}, {'name': "WotBC: Under broken bridge", - 'region': "wotbc", 'game_id': "QI06", 'room': "D01Z03S05"}, {'name': "WotBC: Cliffside statue", - 'region': "wotbc", 'game_id': "HE02", 'room': "D01Z03S07"}, {'name': "WotBC: Cliffside Child of Moonlight", - 'region': "wotbc", 'game_id': "RESCUED_CHERUB_38", 'room': "D01Z03S07"}, {'name': "WotBC: 3rd meeting with Redento", - 'region': "wotbc", 'game_id': "RB20", - 'room': "D01Z03S01"}, # ? + 'room': "D01Z03S06"}, - # Where Olive Trees Wither (11) + # Where Olive Trees Wither {'name': "WOTW: Below Prie Dieu", - 'region': "wotw", 'game_id': "CO11", 'room': "D02Z01S01"}, {'name': "WOTW: Entrance to tomb", - 'region': "wotw", 'game_id': "QI20", 'room': "D02Z01S04"}, {'name': "WOTW: Gift for the tomb", - 'region': "wotw", 'game_id': "QI68", - 'room': "D02Z01S"}, + 'room': "D02Z01S04"}, {'name': "WOTW: Underground tomb", - 'region': "wotw", 'game_id': "PR04", 'room': "D02Z01S08"}, {'name': "WOTW: Underground Child of Moonlight", - 'region': "wotw", 'game_id': "RESCUED_CHERUB_27", 'room': "D02Z01S06"}, {'name': "WOTW: Underground ledge", - 'region': "wotw", 'game_id': "CO19", 'room': "D02Z01S06"}, {'name': "WOTW: Upper east Child of Moonlight", - 'region': "wotw", 'game_id': "RESCUED_CHERUB_23", - 'room': "D02Z01S09"}, + 'room': "D02Z01S02"}, {'name': "WOTW: Upper east statue", - 'region': "wotw", 'game_id': "HE05", 'room': "D02Z01S09"}, {'name': "WOTW: Death run", - 'region': "wotw", 'game_id': "QI07", 'room': "D02Z01S05"}, {'name': "WOTW: Gemino's gift", - 'region': "wotw", 'game_id': "QI59", 'room': "D02Z01S01"}, {'name': "WOTW: Gemino's reward", - 'region': "wotw", 'game_id': "RB10", 'room': "D02Z01S01"}, - # Various (20) + # Various + {'name': "Beginning gift", + 'game_id': "QI106", + 'room': "Misc"}, + {'name': "Second red candle", + 'game_id': "RB18", + 'room': "Misc"}, + {'name': "Third red candle", + 'game_id': "RB19", + 'room': "Misc"}, + {'name': "Second blue candle", + 'game_id': "RB25", + 'room': "Misc"}, + {'name': "Third blue candle", + 'game_id': "RB26", + 'room': "Misc"}, {'name': "Confessor Dungeon 1 extra", - 'region': "dungeon", 'game_id': "Arena_NailManager[1000]", - 'room': "dungeon"}, + 'room': "Misc"}, {'name': "Confessor Dungeon 1 main", - 'region': "dungeon", 'game_id': "QI32", - 'room': "dungeon"}, + 'room': "Misc"}, {'name': "Confessor Dungeon 2 extra", - 'region': "dungeon", 'game_id': "HE10", - 'room': "dungeon"}, + 'room': "Misc"}, {'name': "Confessor Dungeon 2 main", - 'region': "dungeon", 'game_id': "QI33", - 'room': "dungeon"}, + 'room': "Misc"}, {'name': "Confessor Dungeon 3 extra", - 'region': "dungeon", 'game_id': "Arena_NailManager[3000]", - 'room': "dungeon"}, + 'room': "Misc"}, {'name': "Confessor Dungeon 3 main", - 'region': "dungeon", 'game_id': "QI34", - 'room': "dungeon"}, + 'room': "Misc"}, {'name': "Confessor Dungeon 4 extra", - 'region': "dungeon", 'game_id': "RB34", - 'room': "dungeon"}, + 'room': "Misc"}, {'name': "Confessor Dungeon 4 main", - 'region': "dungeon", 'game_id': "QI35", - 'room': "dungeon"}, + 'room': "Misc"}, {'name': "Confessor Dungeon 5 extra", - 'region': "dungeon", 'game_id': "Arena_NailManager[5000]", - 'room': "dungeon"}, + 'room': "Misc"}, {'name': "Confessor Dungeon 5 main", - 'region': "dungeon", 'game_id': "QI79", - 'room': "dungeon"}, + 'room': "Misc"}, {'name': "Confessor Dungeon 6 extra", - 'region': "dungeon", 'game_id': "RB35", - 'room': "dungeon"}, + 'room': "Misc"}, {'name': "Confessor Dungeon 6 main", - 'region': "dungeon", 'game_id': "QI80", - 'room': "dungeon"}, + 'room': "Misc"}, {'name': "Confessor Dungeon 7 extra", - 'region': "dungeon", 'game_id': "RB36", - 'room': "dungeon"}, + 'room': "Misc"}, {'name': "Confessor Dungeon 7 main", - 'region': "dungeon", 'game_id': "QI81", - 'room': "dungeon"}, + 'room': "Misc"}, {'name': "Defeat 1 Amanecida", - 'region': "dungeon", 'game_id': "QI107", - 'room': "dungeon"}, + 'room': "Misc"}, {'name': "Defeat 2 Amanecidas", - 'region': "dungeon", 'game_id': "QI108", - 'room': "dungeon"}, + 'room': "Misc"}, {'name': "Defeat 3 Amanecidas", - 'region': "dungeon", 'game_id': "QI109", - 'room': "dungeon"}, + 'room': "Misc"}, {'name': "Defeat 4 Amanecidas", - 'region': "dungeon", 'game_id': "QI110", - 'room': "dungeon"}, + 'room': "Misc"}, {'name': "Defeat all Amanecidas", - 'region': "dungeon", 'game_id': "PR101", - 'room': "dungeon"}, + 'room': "Misc"}, {'name': "Skill 1, Tier 1", - 'region': "dungeon", 'game_id': "COMBO_1", - 'room': "dungeon"}, + 'room': "Misc"}, {'name': "Skill 1, Tier 2", - 'region': "dungeon", 'game_id': "COMBO_2", - 'room': "dungeon"}, + 'room': "Misc"}, {'name': "Skill 1, Tier 3", - 'region': "dungeon", 'game_id': "COMBO_3", - 'room': "dungeon"}, + 'room': "Misc"}, {'name': "Skill 2, Tier 1", - 'region': "dungeon", 'game_id': "CHARGED_1", - 'room': "dungeon"}, + 'room': "Misc"}, {'name': "Skill 2, Tier 2", - 'region': "dungeon", 'game_id': "CHARGED_2", - 'room': "dungeon"}, + 'room': "Misc"}, {'name': "Skill 2, Tier 3", - 'region': "dungeon", 'game_id': "CHARGED_3", - 'room': "dungeon"}, + 'room': "Misc"}, {'name': "Skill 3, Tier 1", - 'region': "dungeon", 'game_id': "RANGED_1", - 'room': "dungeon"}, + 'room': "Misc"}, {'name': "Skill 3, Tier 2", - 'region': "dungeon", 'game_id': "RANGED_2", - 'room': "dungeon"}, + 'room': "Misc"}, {'name': "Skill 3, Tier 3", - 'region': "dungeon", 'game_id': "RANGED_3", - 'room': "dungeon"}, + 'room': "Misc"}, {'name': "Skill 4, Tier 1", - 'region': "dungeon", 'game_id': "VERTICAL_1", - 'room': "dungeon"}, + 'room': "Misc"}, {'name': "Skill 4, Tier 2", - 'region': "dungeon", 'game_id': "VERTICAL_2", - 'room': "dungeon"}, + 'room': "Misc"}, {'name': "Skill 4, Tier 3", - 'region': "dungeon", 'game_id': "VERTICAL_3", - 'room': "dungeon"}, + 'room': "Misc"}, {'name': "Skill 5, Tier 1", - 'region': "dungeon", 'game_id': "LUNGE_1", - 'room': "dungeon"}, + 'room': "Misc"}, {'name': "Skill 5, Tier 2", - 'region': "dungeon", 'game_id': "LUNGE_2", - 'room': "dungeon"}, + 'room': "Misc"}, {'name': "Skill 5, Tier 3", - 'region': "dungeon", 'game_id': "LUNGE_3", - 'room': "dungeon"}, -] + 'room': "Misc"}, -shop_set: Set[str] = [ - "GotP: Shop item 1", - "GotP: Shop item 2", - "GotP: Shop item 3", - "MD: Shop item 1", - "MD: Shop item 2", - "MD: Shop item 3", - "TSC: Shop item 1", - "TSC: Shop item 2", - "TSC: Shop item 3" + # Custom Items + {'name': "BotSS: 2nd meeting with Redento", + 'game_id': "RE401", + 'room': "D17Z01S04"}, + {'name': "MoM: Western room ledge", + 'game_id': "RE402", + 'room': "D04Z02S01"} ] \ No newline at end of file diff --git a/worlds/blasphemous/Options.py b/worlds/blasphemous/Options.py index b3bb3a6b..ea304d22 100644 --- a/worlds/blasphemous/Options.py +++ b/worlds/blasphemous/Options.py @@ -1,4 +1,22 @@ -from Options import Choice, Toggle, DefaultOnToggle, DeathLink +from Options import Choice, Toggle, DefaultOnToggle, DeathLink, StartInventoryPool +import random + + +class ChoiceIsRandom(Choice): + randomized: bool = False + + @classmethod + def from_text(cls, text: str) -> Choice: + text = text.lower() + if text == "random": + cls.randomized = True + return cls(random.choice(list(cls.name_lookup))) + for option_name, value in cls.options.items(): + if option_name == text: + return cls(value) + raise KeyError( + f'Could not find option "{text}" for "{cls.__name__}", ' + f'known options are {", ".join(f"{option}" for option in cls.name_lookup.values())}') class PrieDieuWarp(DefaultOnToggle): @@ -17,13 +35,12 @@ class CorpseHints(DefaultOnToggle): class Difficulty(Choice): - """Adjusts the logic required to defeat bosses. - Impossible: Removes all logic requirements for bosses. Good luck.""" + """Adjusts the overall difficulty of the randomizer, including upgrades required to defeat bosses + and advanced movement tricks or glitches.""" display_name = "Difficulty" option_easy = 0 option_normal = 1 option_hard = 2 - option_impossible = 3 default = 1 @@ -32,9 +49,20 @@ class Penitence(Toggle): display_name = "Penitence" -class ExpertLogic(Toggle): - """Expands the logic used by the randomizer to allow for some difficult and/or lesser known tricks.""" - display_name = "Expert Logic" +class StartingLocation(ChoiceIsRandom): + """Choose where to start the randomizer. Note that some starting locations cannot be chosen with certain + other options. + Specifically, Brotherhood and Mourning And Havoc cannot be chosen if Shuffle Dash is enabled, and Grievance Ascends + cannot be chosen if Shuffle Wall Climb is enabled.""" + display_name = "Starting Location" + option_brotherhood = 0 + option_albero = 1 + option_convent = 2 + option_grievance = 3 + option_knot_of_words = 4 + option_rooftops = 5 + option_mourning_havoc = 6 + default = 0 class Ending(Choice): @@ -48,6 +76,13 @@ class Ending(Choice): default = 0 +class SkipLongQuests(Toggle): + """Ensures that the rewards for long quests will be filler items. + Affected locations: \"Albero: Donate 50000 Tears\", \"Ossuary: 11th reward\", \"AtTotS: Miriam's gift\", + \"TSC: Jocinero's final reward\"""" + display_name = "Skip Long Quests" + + class ThornShuffle(Choice): """Shuffles the Thorn given by Deogracias and all Thorn upgrades into the item pool.""" display_name = "Shuffle Thorn" @@ -57,124 +92,33 @@ class ThornShuffle(Choice): default = 0 +class DashShuffle(Toggle): + """Turns the ability to dash into an item that must be found in the multiworld.""" + display_name = "Shuffle Dash" + + +class WallClimbShuffle(Toggle): + """Turns the ability to climb walls with your sword into an item that must be found in the multiworld.""" + display_name = "Shuffle Wall Climb" + + class ReliquaryShuffle(DefaultOnToggle): """Adds the True Torment exclusive Reliquary rosary beads into the item pool.""" display_name = "Shuffle Penitence Rewards" -class CherubShuffle(DefaultOnToggle): - """Shuffles Children of Moonlight into the item pool.""" - display_name = "Shuffle Children of Moonlight" +class CustomItem1(Toggle): + """Adds the custom relic Boots of Pleading into the item pool, which grants the ability to fall onto spikes + and survive. + Must have the \"Blasphemous-Boots-of-Pleading\" mod installed to connect to a multiworld.""" + display_name = "Boots of Pleading" -class LifeShuffle(DefaultOnToggle): - """Shuffles life upgrades from the Lady of the Six Sorrows into the item pool.""" - display_name = "Shuffle Life Upgrades" - - -class FervourShuffle(DefaultOnToggle): - """Shuffles fervour upgrades from the Oil of the Pilgrims into the item pool.""" - display_name = "Shuffle Fervour Upgrades" - - -class SwordShuffle(DefaultOnToggle): - """Shuffles Mea Culpa upgrades from the Mea Culpa Altars into the item pool.""" - display_name = "Shuffle Mea Culpa Upgrades" - - -class BlessingShuffle(DefaultOnToggle): - """Shuffles blessings from the Lake of Silent Pilgrims into the item pool.""" - display_name = "Shuffle Blessings" - - -class DungeonShuffle(DefaultOnToggle): - """Shuffles rewards from completing Confessor Dungeons into the item pool.""" - display_name = "Shuffle Dungeon Rewards" - - -class TirsoShuffle(DefaultOnToggle): - """Shuffles rewards from delivering herbs to Tirso into the item pool.""" - display_name = "Shuffle Tirso's Rewards" - - -class MiriamShuffle(DefaultOnToggle): - """Shuffles the prayer given by Miriam into the item pool.""" - display_name = "Shuffle Miriram's Reward" - - -class RedentoShuffle(DefaultOnToggle): - """Shuffles rewards from assisting Redento into the item pool.""" - display_name = "Shuffle Redento's Rewards" - - -class JocineroShuffle(DefaultOnToggle): - """Shuffles rewards from rescuing 20 and 38 Children of Moonlight into the item pool.""" - display_name = "Shuffle Jocinero's Rewards" - - -class AltasgraciasShuffle(DefaultOnToggle): - """Shuffles the reward given by Altasgracias and the item left behind by them into the item pool.""" - display_name = "Shuffle Altasgracias' Rewards" - - -class TentudiaShuffle(DefaultOnToggle): - """Shuffles the rewards from delivering Tentudia's remains to Lvdovico into the item pool.""" - display_name = "Shuffle Lvdovico's Rewards" - - -class GeminoShuffle(DefaultOnToggle): - """Shuffles the rewards from Gemino's quest and the hidden tomb into the item pool.""" - display_name = "Shuffle Gemino's Rewards" - - -class GuiltShuffle(DefaultOnToggle): - """Shuffles the Weight of True Guilt into the item pool.""" - display_name = "Shuffle Immaculate Bead" - - -class OssuaryShuffle(DefaultOnToggle): - """Shuffles the rewards from delivering bones to the Ossuary into the item pool.""" - display_name = "Shuffle Ossuary Rewards" - - -class BossShuffle(DefaultOnToggle): - """Shuffles the Tears of Atonement from defeating bosses into the item pool.""" - display_name = "Shuffle Boss Tears" - - -class WoundShuffle(DefaultOnToggle): - """Shuffles the Holy Wounds required to pass the Bridge of the Three Cavalries into the item pool.""" - display_name = "Shuffle Holy Wounds" - - -class MaskShuffle(DefaultOnToggle): - """Shuffles the masks required to use the elevator in Archcathedral Rooftops into the item pool.""" - display_name = "Shuffle Masks" - - -class EyeShuffle(DefaultOnToggle): - """Shuffles the Eyes of the Traitor from defeating Isidora and Sierpes into the item pool.""" - display_name = "Shuffle Traitor's Eyes" - - -class HerbShuffle(DefaultOnToggle): - """Shuffles the herbs required for Tirso's quest into the item pool.""" - display_name = "Shuffle Herbs" - - -class ChurchShuffle(DefaultOnToggle): - """Shuffles the rewards from donating 5,000 and 50,000 Tears of Atonement to the Church in Albero into the item pool.""" - display_name = "Shuffle Donation Rewards" - - -class ShopShuffle(DefaultOnToggle): - """Shuffles the items sold in Candelaria's shops into the item pool.""" - display_name = "Shuffle Shop Items" - - -class CandleShuffle(DefaultOnToggle): - """Shuffles the Beads of Wax and their upgrades into the item pool.""" - display_name = "Shuffle Candles" +class CustomItem2(Toggle): + """Adds the custom relic Purified Hand of the Nun into the item pool, which grants the ability to jump + a second time in mid-air. + Must have the \"Blasphemous-Double-Jump\" mod installed to connect to a multiworld.""" + display_name = "Purified Hand of the Nun" class StartWheel(Toggle): @@ -189,7 +133,8 @@ class SkillRando(Toggle): class EnemyRando(Choice): """Randomizes the enemies that appear in each room. - Shuffled: Enemies will be shuffled amongst each other, but can only appear as many times as they do in a standard game. + Shuffled: Enemies will be shuffled amongst each other, but can only appear as many times as they do in + a standard game. Randomized: Every enemy is completely random, and can appear any number of times. Some enemies will never be randomized.""" display_name = "Enemy Randomizer" @@ -223,37 +168,20 @@ blasphemous_options = { "corpse_hints": CorpseHints, "difficulty": Difficulty, "penitence": Penitence, - "expert_logic": ExpertLogic, + "starting_location": StartingLocation, "ending": Ending, + "skip_long_quests": SkipLongQuests, "thorn_shuffle" : ThornShuffle, + "dash_shuffle": DashShuffle, + "wall_climb_shuffle": WallClimbShuffle, "reliquary_shuffle": ReliquaryShuffle, - "cherub_shuffle" : CherubShuffle, - "life_shuffle" : LifeShuffle, - "fervour_shuffle" : FervourShuffle, - "sword_shuffle" : SwordShuffle, - "blessing_shuffle" : BlessingShuffle, - "dungeon_shuffle" : DungeonShuffle, - "tirso_shuffle" : TirsoShuffle, - "miriam_shuffle" : MiriamShuffle, - "redento_shuffle" : RedentoShuffle, - "jocinero_shuffle" : JocineroShuffle, - "altasgracias_shuffle" : AltasgraciasShuffle, - "tentudia_shuffle" : TentudiaShuffle, - "gemino_shuffle" : GeminoShuffle, - "guilt_shuffle" : GuiltShuffle, - "ossuary_shuffle" : OssuaryShuffle, - "boss_shuffle" : BossShuffle, - "wound_shuffle" : WoundShuffle, - "mask_shuffle" : MaskShuffle, - "eye_shuffle": EyeShuffle, - "herb_shuffle" : HerbShuffle, - "church_shuffle" : ChurchShuffle, - "shop_shuffle" : ShopShuffle, - "candle_shuffle" : CandleShuffle, + "boots_of_pleading": CustomItem1, + "purified_hand": CustomItem2, "start_wheel": StartWheel, "skill_randomizer": SkillRando, "enemy_randomizer": EnemyRando, "enemy_groups": EnemyGroups, "enemy_scaling": EnemyScaling, - "death_link": BlasphemousDeathLink + "death_link": BlasphemousDeathLink, + "start_inventory": StartInventoryPool } \ No newline at end of file diff --git a/worlds/blasphemous/Rooms.py b/worlds/blasphemous/Rooms.py new file mode 100644 index 00000000..74f245ad --- /dev/null +++ b/worlds/blasphemous/Rooms.py @@ -0,0 +1,5405 @@ +from typing import List, TypedDict + + +room_table: List[str] = [ + "D01Z01S01", # THL + "D01Z01S02", # THL + "D01Z01S03", # THL + "D01Z01S07", # THL + "D01Z02S01", # Albero + "D01Z02S02", # Albero + "D01Z02S03", # Albero + "D01Z02S04", # Albero + "D01Z02S05", # Albero + "D01Z02S06", # Albero + "D01Z02S07", # Albero + "D01BZ04S01", # Albero Church + "D01BZ06S01", # Ossuary + "D01BZ08S01", # Ossuary - isidora's room? + "D01Z03S01", # WotBC + "D01Z03S02", # WotBC + "D01Z03S03", # WotBC + "D01Z03S04", # WotBC + "D01Z03S05", # WotBC + "D01Z03S06", # WotBC + "D01Z03S07", # WotBC + "D01Z04S01", # MD + "D01Z04S02", # MD + "D01Z04S03", # MD + "D01Z04S05", # MD + "D01Z04S06", # MD + "D01Z04S07", # MD + "D01Z04S08", # MD + "D01Z04S09", # MD + "D01Z04S10", # MD + "D01Z04S11", # MD + "D01Z04S12", # MD + "D01Z04S13", # MD + "D01Z04S14", # MD + "D01Z04S15", # MD + "D01Z04S16", # MD + "D01Z04S17", # MD + "D01Z04S18", # MD + "D01Z04S19", # MD + "D01BZ02S01", # MD - shop + "D01Z05S01", # DC + "D01Z05S02", # DC + "D01Z05S03", # DC + "D01Z05S04", # DC + "D01Z05S05", # DC + "D01Z05S06", # DC + "D01Z05S07", # DC + "D01Z05S08", # DC + "D01Z05S09", # DC + "D01Z05S10", # DC + "D01Z05S11", # DC + "D01Z05S12", # DC + "D01Z05S13", # DC + "D01Z05S14", # DC + "D01Z05S15", # DC + "D01Z05S16", # DC + "D01Z05S17", # DC + "D01Z05S18", # DC + "D01Z05S19", # DC + "D01Z05S20", # DC + "D01Z05S21", # DC + "D01Z05S22", # DC + "D01Z05S23", # DC + "D01Z05S24", # DC + "D01Z05S25", # DC + "D01Z05S26", # DC + "D01Z05S27", # DC + "D01BZ05S01", # DC - shroud of dreamt sins room? + "D01BZ09S01", # DC - arcade room + "D01Z06S01", # Petrous + "D01BZ07S01", # Petrous - Jibrael + "D02Z01S01", # WOTW + "D02Z01S02", # WOTW + "D02Z01S03", # WOTW + "D02Z01S04", # WOTW + "D02Z01S05", # WOTW + "D02Z01S06", # WOTW + "D02Z01S08", # WOTW + "D02Z01S09", # WOTW + "D02Z02S01", # GOTP + "D02Z02S02", # GOTP + "D02Z02S03", # GOTP + "D02Z02S04", # GOTP + "D02Z02S05", # GOTP + "D02Z02S06", # GOTP + "D02Z02S07", # GOTP + "D02Z02S08", # GOTP + "D02Z02S09", # GOTP + "D02Z02S10", # GOTP + "D02Z02S11", # GOTP + "D02Z02S12", # GOTP + "D02Z02S13", # GOTP + "D02Z02S14", # GOTP + "D02BZ02S01", # GOTP - shop + "D02Z03S01", # COOLOTCV + "D02Z03S02", # COOLOTCV + "D02Z03S03", # COOLOTCV + "D02Z03S05", # COOLOTCV + "D02Z03S06", # COOLOTCV + "D02Z03S07", # COOLOTCV + "D02Z03S08", # COOLOTCV + "D02Z03S09", # COOLOTCV + "D02Z03S10", # COOLOTCV + "D02Z03S11", # COOLOTCV + "D02Z03S12", # COOLOTCV + "D02Z03S13", # COOLOTCV + "D02Z03S14", # COOLOTCV + "D02Z03S15", # COOLOTCV + "D02Z03S16", # COOLOTCV + "D02Z03S17", # COOLOTCV + "D02Z03S18", # COOLOTCV + "D02Z03S19", # COOLOTCV + "D02Z03S20", # COOLOTCV + "D02Z03S21", # COOLOTCV + "D02Z03S22", # COOLOTCV + "D02Z03S23", # COOLOTCV + "D02Z03S24", # COOLOTCV + "D03Z01S01", # MOTED + "D03Z01S02", # MOTED + "D03Z01S03", # MOTED + "D03Z01S04", # MOTED + "D03Z01S05", # MOTED + "D03Z01S06", # MOTED + "D03Z02S01", # Jondo + "D03Z02S02", # Jondo + "D03Z02S03", # Jondo + "D03Z02S04", # Jondo + "D03Z02S05", # Jondo + "D03Z02S06", # Jondo + "D03Z02S07", # Jondo + "D03Z02S08", # Jondo + "D03Z02S09", # Jondo + "D03Z02S10", # Jondo + "D03Z02S11", # Jondo + "D03Z02S12", # Jondo + "D03Z02S13", # Jondo + "D03Z02S14", # Jondo + "D03Z02S15", # Jondo + "D03Z03S01", # GA + "D03Z03S02", # GA + "D03Z03S03", # GA + "D03Z03S04", # GA + "D03Z03S05", # GA + "D03Z03S06", # GA + "D03Z03S07", # GA + "D03Z03S08", # GA + "D03Z03S09", # GA + "D03Z03S10", # GA + "D03Z03S11", # GA + "D03Z03S12", # GA + "D03Z03S13", # GA + "D03Z03S14", # GA + "D03Z03S15", # GA + "D03Z03S16", # GA + "D03Z03S17", # GA + "D03Z03S18", # GA + "D03Z03S19", # GA + "D04Z01S01", # POTSS + "D04Z01S02", # POTSS + "D04Z01S03", # POTSS + "D04Z01S04", # POTSS + "D04Z01S05", # POTSS + "D04Z01S06", # POTSS + "D04Z02S01", # MOM + "D04Z02S02", # MOM + "D04Z02S03", # MOM + "D04Z02S04", # MOM + "D04Z02S05", # MOM + "D04Z02S06", # MOM + "D04Z02S07", # MOM + "D04Z02S08", # MOM + "D04Z02S09", # MOM + "D04Z02S10", # MOM + "D04Z02S11", # MOM + "D04Z02S12", # MOM + "D04Z02S13", # MOM + "D04Z02S14", # MOM + "D04Z02S15", # MOM + "D04Z02S16", # MOM + "D04Z02S17", # MOM + "D04Z02S19", # MOM + "D04Z02S20", # MOM + "D04Z02S21", # MOM + "D04Z02S22", # MOM + "D04Z02S23", # MOM + "D04Z02S24", # MOM + "D04Z02S25", # MOM + "D04BZ02S01", # MOM - Redento + "D04Z03S01", # KOTTW + "D04Z03S02", # KOTTW + "D04Z04S01", # ATTOTS + "D04Z04S02", # ATTOTS + "D05Z01S01", # LOTNW + "D05Z01S02", # LOTNW + "D05Z01S03", # LOTNW + "D05Z01S04", # LOTNW + "D05Z01S05", # LOTNW + "D05Z01S06", # LOTNW + "D05Z01S07", # LOTNW + "D05Z01S08", # LOTNW + "D05Z01S09", # LOTNW + "D05Z01S10", # LOTNW + "D05Z01S11", # LOTNW + "D05Z01S12", # LOTNW + "D05Z01S13", # LOTNW + "D05Z01S14", # LOTNW + "D05Z01S15", # LOTNW + "D05Z01S16", # LOTNW + "D05Z01S17", # LOTNW + "D05Z01S18", # LOTNW + "D05Z01S19", # LOTNW + "D05Z01S20", # LOTNW + "D05Z01S21", # LOTNW + "D05Z01S22", # LOTNW + "D05Z01S23", # LOTNW + "D05Z01S24", # LOTNW + "D05BZ01S01", # LOTNW - secret entrance to KOTTW? + "D05Z02S01", # TSC + "D05Z02S02", # TSC + "D05Z02S03", # TSC + "D05Z02S04", # TSC + "D05Z02S05", # TSC + "D05Z02S06", # TSC + "D05Z02S07", # TSC + "D05Z02S08", # TSC + "D05Z02S09", # TSC + "D05Z02S10", # TSC + "D05Z02S11", # TSC + "D05Z02S12", # TSC + "D05Z02S13", # TSC + "D05Z02S14", # TSC + "D05Z02S15", # TSC + "D05BZ02S01", # TSC - shop + "D06Z01S01", # AR + "D06Z01S02", # AR + "D06Z01S03", # AR + "D06Z01S04", # AR + "D06Z01S05", # AR + "D06Z01S06", # AR + "D06Z01S07", # AR + "D06Z01S08", # AR + "D06Z01S09", # AR + "D06Z01S10", # AR + "D06Z01S11", # AR + "D06Z01S12", # AR + "D06Z01S13", # AR + "D06Z01S14", # AR + "D06Z01S15", # AR + "D06Z01S16", # AR + "D06Z01S17", # AR + "D06Z01S18", # AR + "D06Z01S19", # AR + "D06Z01S20", # AR + "D06Z01S21", # AR + "D06Z01S22", # AR + "D06Z01S23", # AR + "D06Z01S24", # AR + "D06Z01S25", # AR + "D06Z01S26", # AR + "D07Z01S01", # DOHH? + "D07Z01S02", # DOHH? + "D07Z01S03", # DOHH? + "D08Z01S01", # BOTTC + "D08Z01S02", # BOTTC + "D08Z02S01", # FT + "D08Z02S02", # FT + "D08Z02S03", # FT + "D08Z03S01", # HOTD + "D08Z03S02", # HOTD + "D08Z03S03", # HOTD + "D09Z01S01", # WOTHP + "D09Z01S02", # WOTHP + "D09Z01S03", # WOTHP + "D09Z01S04", # WOTHP + "D09Z01S05", # WOTHP + "D09Z01S06", # WOTHP + "D09Z01S07", # WOTHP + "D09Z01S08", # WOTHP + "D09Z01S09", # WOTHP + "D09Z01S10", # WOTHP + "D09Z01S11", # WOTHP + "D09Z01S12", # WOTHP + "D09Z01S13", # WOTHP + "D09BZ01S01", # WOTHP - all cells + "D17Z01S01", # BOTSS + "D17Z01S02", # BOTSS + "D17Z01S03", # BOTSS + "D17Z01S04", # BOTSS + "D17Z01S05", # BOTSS + "D17Z01S06", # BOTSS + "D17Z01S07", # BOTSS + "D17Z01S08", # BOTSS + "D17Z01S09", # BOTSS + "D17Z01S10", # BOTSS + "D17Z01S11", # BOTSS + "D17Z01S12", # BOTSS + "D17Z01S13", # BOTSS + "D17Z01S14", # BOTSS + "D17Z01S15", # BOTSS + "D17BZ01S01", # BOTSS - chamber of the eldest brother + "D17BZ02S01", # BOTSS - platforming challenge + "D20Z01S01", # EOS + "D20Z01S02", # EOS + "D20Z01S03", # EOS + "D20Z01S04", # EOS + "D20Z01S05", # EOS + "D20Z01S06", # EOS + "D20Z01S07", # EOS + "D20Z01S08", # EOS + "D20Z01S09", # EOS + "D20Z01S10", # EOS + "D20Z01S11", # EOS + "D20Z01S12", # EOS + "D20Z01S13", # EOS + "D20Z01S14", # EOS + "D20Z02S01", # MAH + "D20Z02S02", # MAH + "D20Z02S03", # MAH + "D20Z02S04", # MAH + "D20Z02S05", # MAH + "D20Z02S06", # MAH + "D20Z02S07", # MAH + "D20Z02S08", # MAH + "D20Z02S09", # MAH + "D20Z02S10", # MAH + "D20Z02S11", # MAH + "D20Z02S12", # MAH + "D20Z03S01", # TRPOTS +] + + +class DoorDict(TypedDict, total=False): + Id: str + Direction: int + OriginalDoor: str + Type: int + Logic: str + VisibilityFlags: int + RequiredDoors: List[str] + + +door_table: List[DoorDict] = [ + { + "Id": "D01Z01S01[W]", + "Direction": 1, + "OriginalDoor": "D01Z01S07[E]" + }, + { + "Id": "D01Z01S01[E]", + "Direction": 2, + "OriginalDoor": "D01Z01S02[W]" + }, + { + "Id": "D01Z01S01[S]", + "Direction": 2, + "OriginalDoor": "D01Z06S01[N]", + "Type": 1, + "Logic": "D01Z01S01[S] || canBreakHoles || doubleJump" + }, + { + "Id": "D01Z01S02[W]", + "Direction": 1, + "OriginalDoor": "D01Z01S01[E]" + }, + { + "Id": "D01Z01S02[E]", + "Direction": 2, + "OriginalDoor": "D01Z01S03[W]" + }, + { + "Id": "D01Z01S03[W]", + "Direction": 1, + "OriginalDoor": "D01Z01S02[E]" + }, + { + "Id": "D01Z01S03[E]", + "Direction": 2, + "OriginalDoor": "D01Z02S01[W]", + "Type": 1 + }, + { + "Id": "D01Z01S07[W]", + "Direction": 1, + "OriginalDoor": "D17Z01S03[E]", + "Type": 1 + }, + { + "Id": "D01Z01S07[E]", + "Direction": 2, + "OriginalDoor": "D01Z01S01[W]" + }, + + { + "Id": "D01Z02S01[W]", + "Direction": 1, + "OriginalDoor": "D01Z01S03[E]", + "Type": 1 + }, + { + "Id": "D01Z02S01[E]", + "Direction": 2, + "OriginalDoor": "D01Z02S02[W]" + }, + { + "Id": "D01Z02S02[SW]", + "Direction": 1, + "OriginalDoor": "D01Z02S06[E]" + }, + { + "Id": "D01Z02S02[SE]", + "Direction": 2, + "OriginalDoor": "D01Z02S04[W]" + }, + { + "Id": "D01Z02S02[W]", + "Direction": 1, + "OriginalDoor": "D01Z02S01[E]" + }, + { + "Id": "D01Z02S02[E]", + "Direction": 2, + "OriginalDoor": "D01Z02S03[W]" + }, + { + "Id": "D01Z02S02[NE]", + "Direction": 2, + "OriginalDoor": "D01Z02S03[NW]" + }, + { + "Id": "D01Z02S03[W]", + "Direction": 1, + "OriginalDoor": "D01Z02S02[E]" + }, + { + "Id": "D01Z02S03[NW]", + "Direction": 1, + "OriginalDoor": "D01Z02S02[NE]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D02Z02S11[NW]", "D02Z02S11[NE]", "D02Z02S11[W]", "D02Z02S11[E]", "D02Z02S11[SE]" ] + }, + { + "Id": "D01Z02S03[E]", + "Direction": 2, + "OriginalDoor": "D01Z02S05[W]" + }, + { + "Id": "D01Z02S03[church]", + "Direction": 4, + "OriginalDoor": "D01BZ04S01[church]", + "Logic": "canBeatMercyBoss || canBeatConventBoss || canBeatGrievanceBoss" + }, + { + "Id": "D01Z02S03[Cherubs]", + "Direction": 5 + }, + { + "Id": "D01Z02S04[W]", + "Direction": 1, + "OriginalDoor": "D01Z02S02[SE]" + }, + { + "Id": "D01Z02S04[E]", + "Direction": 2, + "OriginalDoor": "D01Z05S01[N]", + "Type": 1 + }, + { + "Id": "D01Z02S04[Ossary]", + "Direction": 4, + "OriginalDoor": "D01BZ06S01[Ossary]" + }, + { + "Id": "D01Z02S05[W]", + "Direction": 1, + "OriginalDoor": "D01Z02S03[E]" + }, + { + "Id": "D01Z02S05[E]", + "Direction": 2, + "OriginalDoor": "D01Z03S01[W]", + "Type": 1 + }, + { + "Id": "D01Z02S06[W]", + "Direction": 1, + "OriginalDoor": "D01Z02S07[E]" + }, + { + "Id": "D01Z02S06[E]", + "Direction": 2, + "OriginalDoor": "D01Z02S02[SW]" + }, + { + "Id": "D01Z02S07[E]", + "Direction": 2, + "OriginalDoor": "D01Z02S06[W]" + }, + { + "Id": "D01BZ04S01[church]", + "Direction": 7, + "OriginalDoor": "D01Z02S03[church]" + }, + { + "Id": "D01BZ06S01[Ossary]", + "Direction": 7, + "OriginalDoor": "D01Z02S04[Ossary]" + }, + { + "Id": "D01BZ06S01[E]", + "Direction": 2, + "OriginalDoor": "D01BZ08S01[W]", + "Logic": "bones >= 30" + }, + { + "Id": "D01BZ08S01[W]", + "Direction": 1, + "OriginalDoor": "D01BZ06S01[E]" + }, + + { + "Id": "D01Z03S01[W]", + "Direction": 1, + "OriginalDoor": "D01Z02S05[E]", + "Type": 1 + }, + { + "Id": "D01Z03S01[E]", + "Direction": 2, + "OriginalDoor": "D01Z03S02[W]" + }, + { + "Id": "D01Z03S01[SE]", + "Direction": 2, + "OriginalDoor": "D01Z03S02[SW]", + "VisibilityFlags": 1 + }, + { + "Id": "D01Z03S02[W]", + "Direction": 1, + "OriginalDoor": "D01Z03S01[E]" + }, + { + "Id": "D01Z03S02[SW]", + "Direction": 1, + "OriginalDoor": "D01Z03S01[SE]" + }, + { + "Id": "D01Z03S02[E]", + "Direction": 2, + "OriginalDoor": "D01Z03S03[W]" + }, + { + "Id": "D01Z03S02[S]", + "Direction": 3, + "OriginalDoor": "D01Z05S05[N]", + "Type": 1, + "VisibilityFlags": 1 + }, + { + "Id": "D01Z03S03[W]", + "Direction": 1, + "OriginalDoor": "D01Z03S02[E]" + }, + { + "Id": "D01Z03S03[E]", + "Direction": 2, + "OriginalDoor": "D01Z03S04[SW]" + }, + { + "Id": "D01Z03S03[Cherubs]", + "Direction": 5 + }, + { + "Id": "D01Z03S03[-Cherubs]", + "Direction": 6, + "OriginalDoor": "D01Z05S06[Cherubs]", + "Type": 1, + "Logic": "linen" + }, + { + "Id": "D01Z03S04[SW]", + "Direction": 1, + "OriginalDoor": "D01Z03S03[E]" + }, + { + "Id": "D01Z03S04[W]", + "Direction": 1, + "OriginalDoor": "D01Z03S07[E]" + }, + { + "Id": "D01Z03S04[NW]", + "Direction": 1, + "OriginalDoor": "D02Z01S01[SE]", + "Type": 1 + }, + { + "Id": "D01Z03S04[SE]", + "Direction": 2, + "OriginalDoor": "D01Z03S05[W]" + }, + { + "Id": "D01Z03S04[E]", + "Direction": 2, + "OriginalDoor": "D01Z03S06[W]" + }, + { + "Id": "D01Z03S05[W]", + "Direction": 1, + "OriginalDoor": "D01Z03S04[SE]" + }, + { + "Id": "D01Z03S05[E]", + "Direction": 2, + "OriginalDoor": "D01Z04S01[NW]", + "Type": 1 + }, + { + "Id": "D01Z03S05[Cherubs]", + "Direction": 6, + "OriginalDoor": "D01Z05S11[Cherubs]", + "Type": 1, + "Logic": "linen" + }, + { + "Id": "D01Z03S06[W]", + "Direction": 1, + "OriginalDoor": "D01Z03S04[E]" + }, + { + "Id": "D01Z03S06[E]", + "Direction": 2, + "OriginalDoor": "D08Z01S01[W]", + "Type": 1 + }, + { + "Id": "D01Z03S07[E]", + "Direction": 2, + "OriginalDoor": "D01Z03S04[W]" + }, + { + "Id": "D01Z03S07[-Cherubs]", + "Direction": 6, + "OriginalDoor": "D01Z03S03[Cherubs]", + "Logic": "linen" + }, + + { + "Id": "D01Z04S01[NW]", + "Direction": 1, + "OriginalDoor": "D01Z03S05[E]", + "Type": 1 + }, + { + "Id": "D01Z04S01[NE]", + "Direction": 2, + "OriginalDoor": "D01Z04S17[W]" + }, + { + "Id": "D01Z04S01[W]", + "Direction": 1, + "OriginalDoor": "D01Z04S03[E]" + }, + { + "Id": "D01Z04S01[E]", + "Direction": 2, + "OriginalDoor": "D01Z04S05[NW]" + }, + { + "Id": "D01Z04S01[SE]", + "Direction": 2, + "OriginalDoor": "D01Z04S05[SW]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D01Z04S01[S]" ] + }, + { + "Id": "D01Z04S01[S]", + "Direction": 3, + "OriginalDoor": "D01Z04S15[N]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D01Z04S01[SE]" ] + }, + { + "Id": "D01Z04S02[W]", + "Direction": 1, + "OriginalDoor": "D01Z04S13[NE]" + }, + { + "Id": "D01Z04S03[E]", + "Direction": 2, + "OriginalDoor": "D01Z04S01[W]" + }, + { + "Id": "D01Z04S05[NW]", + "Direction": 1, + "OriginalDoor": "D01Z04S01[E]" + }, + { + "Id": "D01Z04S05[SW]", + "Direction": 1, + "OriginalDoor": "D01Z04S01[SE]" + }, + { + "Id": "D01Z04S06[E]", + "Direction": 2, + "OriginalDoor": "D01Z04S07[W]" + }, + { + "Id": "D01Z04S06[NW]", + "Direction": 1, + "OriginalDoor": "D01Z04S15[NE]" + }, + { + "Id": "D01Z04S06[SW]", + "Direction": 1, + "OriginalDoor": "D01Z04S15[E]" + }, + { + "Id": "D01Z04S07[W]", + "Direction": 1, + "OriginalDoor": "D01Z04S06[E]" + }, + { + "Id": "D01Z04S08[E]", + "Direction": 2, + "OriginalDoor": "D01Z04S15[W]" + }, + { + "Id": "D01Z04S09[W]", + "Direction": 1, + "OriginalDoor": "D01Z05S12[E]", + "Type": 1, + "Logic": "openedDCGateE" + }, + { + "Id": "D01Z04S09[E]", + "Direction": 2, + "OriginalDoor": "D01Z04S15[SW]" + }, + { + "Id": "D01Z04S09[C]", + "Direction": 4, + "OriginalDoor": "D01BZ02S01[C]" + }, + { + "Id": "D01Z04S10[NW]", + "Direction": 1, + "OriginalDoor": "D01Z04S15[SE]" + }, + { + "Id": "D01Z04S10[SW]", + "Direction": 3, + "OriginalDoor": "D01Z04S11[NE]" + }, + { + "Id": "D01Z04S10[SE]", + "Direction": 3, + "OriginalDoor": "D01Z04S12[NW]" + }, + { + "Id": "D01Z04S11[NE]", + "Direction": 0, + "OriginalDoor": "D01Z04S10[SW]" + }, + { + "Id": "D01Z04S12[NW]", + "Direction": 0, + "OriginalDoor": "D01Z04S10[SE]" + }, + { + "Id": "D01Z04S12[W]", + "Direction": 1, + "OriginalDoor": "D01Z04S18[E]" + }, + { + "Id": "D01Z04S12[SE]", + "Direction": 2, + "OriginalDoor": "D01Z04S13[NW]" + }, + { + "Id": "D01Z04S13[NW]", + "Direction": 1, + "OriginalDoor": "D01Z04S12[SE]" + }, + { + "Id": "D01Z04S13[NE]", + "Direction": 2, + "OriginalDoor": "D01Z04S02[W]" + }, + { + "Id": "D01Z04S13[SW]", + "Direction": 1, + "OriginalDoor": "D01Z04S14[E]" + }, + { + "Id": "D01Z04S13[SE]", + "Direction": 2, + "OriginalDoor": "D01Z04S16[W]", + "VisibilityFlags": 5, + "Logic": "D01Z04S13[SE] || canDiveLaser && (canAirStall || wheel || doubleJump || canEnemyBounce)" + }, + { + "Id": "D01Z04S14[E]", + "Direction": 2, + "OriginalDoor": "D01Z04S13[SW]" + }, + { + "Id": "D01Z04S15[N]", + "Direction": 0, + "OriginalDoor": "D01Z04S01[S]" + }, + { + "Id": "D01Z04S15[NE]", + "Direction": 2, + "OriginalDoor": "D01Z04S06[NW]" + }, + { + "Id": "D01Z04S15[W]", + "Direction": 1, + "OriginalDoor": "D01Z04S08[E]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D01Z04S15[E]", "D01Z04S15[SW]", "D01Z04S15[SE]" ] + }, + { + "Id": "D01Z04S15[E]", + "Direction": 2, + "OriginalDoor": "D01Z04S06[SW]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D01Z04S15[W]", "D01Z04S15[SW]", "D01Z04S15[SE]" ] + }, + { + "Id": "D01Z04S15[SW]", + "Direction": 1, + "OriginalDoor": "D01Z04S09[E]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D01Z04S15[W]", "D01Z04S15[E]", "D01Z04S15[SE]" ] + }, + { + "Id": "D01Z04S15[SE]", + "Direction": 2, + "OriginalDoor": "D01Z04S10[NW]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D01Z04S15[W]", "D01Z04S15[E]", "D01Z04S15[SW]" ] + }, + { + "Id": "D01Z04S16[W]", + "Direction": 1, + "OriginalDoor": "D01Z04S13[SE]" + }, + { + "Id": "D01Z04S16[E]", + "Direction": 2, + "OriginalDoor": "D05Z02S12[W]", + "Type": 1 + }, + { + "Id": "D01Z04S17[W]", + "Direction": 1, + "OriginalDoor": "D01Z04S01[NE]" + }, + { + "Id": "D01Z04S18[W]", + "Direction": 1, + "OriginalDoor": "D01Z04S19[E]", + "Logic": "D01Z04S18[W] || canBeatMercyBoss" + }, + { + "Id": "D01Z04S18[E]", + "Direction": 2, + "OriginalDoor": "D01Z04S12[W]", + "Logic": "D01Z04S18[E] || canBeatMercyBoss" + }, + { + "Id": "D01Z04S19[W]", + "Direction": 1, + "OriginalDoor": "D01Z05S19[E]", + "Type": 1 + }, + { + "Id": "D01Z04S19[E]", + "Direction": 2, + "OriginalDoor": "D01Z04S18[W]" + }, + { + "Id": "D01BZ02S01[C]", + "Direction": 7, + "OriginalDoor": "D01Z04S09[C]" + }, + + { + "Id": "D01Z05S01[N]", + "Direction": 1, + "OriginalDoor": "D01Z02S04[E]", + "Type": 1 + }, + { + "Id": "D01Z05S01[W]", + "Direction": 1, + "OriginalDoor": "D01Z05S27[E]" + }, + { + "Id": "D01Z05S01[S]", + "Direction": 3, + "OriginalDoor": "D01Z05S02[N]" + }, + { + "Id": "D01Z05S02[N]", + "Direction": 0, + "OriginalDoor": "D01Z05S01[S]" + }, + { + "Id": "D01Z05S02[W]", + "Direction": 1, + "OriginalDoor": "D03Z01S01[NE]", + "Type": 1 + }, + { + "Id": "D01Z05S02[E]", + "Direction": 2, + "OriginalDoor": "D01Z05S03[NW]", + "VisibilityFlags": 1 + }, + { + "Id": "D01Z05S02[S]", + "Direction": 3, + "OriginalDoor": "D01Z05S20[N]", + "Logic": "openedDCLadder" + }, + { + "Id": "D01Z05S03[NW]", + "Direction": 1, + "OriginalDoor": "D01Z05S02[E]" + }, + { + "Id": "D01Z05S03[NE]", + "Direction": 2, + "OriginalDoor": "D01Z05S04[W]" + }, + { + "Id": "D01Z05S03[W]", + "Direction": 1, + "OriginalDoor": "D01Z05S07[E]" + }, + { + "Id": "D01Z05S03[E]", + "Direction": 2, + "OriginalDoor": "D01Z05S08[W]" + }, + { + "Id": "D01Z05S03[S]", + "Direction": 3, + "OriginalDoor": "D01Z05S13[N]" + }, + { + "Id": "D01Z05S04[W]", + "Direction": 1, + "OriginalDoor": "D01Z05S03[NE]" + }, + { + "Id": "D01Z05S04[E]", + "Direction": 2, + "OriginalDoor": "D01Z05S05[NW]" + }, + { + "Id": "D01Z05S05[N]", + "Direction": 0, + "OriginalDoor": "D01Z03S02[S]", + "Type": 1 + }, + { + "Id": "D01Z05S05[NW]", + "Direction": 1, + "OriginalDoor": "D01Z05S04[E]" + }, + { + "Id": "D01Z05S05[NE]", + "Direction": 2, + "OriginalDoor": "D01Z05S06[W]" + }, + { + "Id": "D01Z05S05[SW]", + "Direction": 1, + "OriginalDoor": "D01Z05S18[E]" + }, + { + "Id": "D01Z05S05[E]", + "Direction": 2, + "OriginalDoor": "D01Z05S09[NW]" + }, + { + "Id": "D01Z05S06[W]", + "Direction": 1, + "OriginalDoor": "D01Z05S05[NE]" + }, + { + "Id": "D01Z05S06[Cherubs]", + "Direction": 5, + "Type": 1 + }, + { + "Id": "D01Z05S07[E]", + "Direction": 2, + "OriginalDoor": "D01Z05S03[W]" + }, + { + "Id": "D01Z05S08[W]", + "Direction": 1, + "OriginalDoor": "D01Z05S03[E]" + }, + { + "Id": "D01Z05S09[NW]", + "Direction": 1, + "OriginalDoor": "D01Z05S05[E]" + }, + { + "Id": "D01Z05S09[SE]", + "Direction": 2, + "OriginalDoor": "D01Z05S10[W]" + }, + { + "Id": "D01Z05S10[W]", + "Direction": 1, + "OriginalDoor": "D01Z05S09[SE]" + }, + { + "Id": "D01Z05S10[NE]", + "Direction": 2, + "OriginalDoor": "D01Z05S11[W]" + }, + { + "Id": "D01Z05S10[SE]", + "Direction": 2, + "OriginalDoor": "D01Z05S12[W]" + }, + { + "Id": "D01Z05S10[S]", + "Direction": 3, + "OriginalDoor": "D01Z05S14[N]" + }, + { + "Id": "D01Z05S11[W]", + "Direction": 1, + "OriginalDoor": "D01Z05S10[NE]" + }, + { + "Id": "D01Z05S11[Cherubs]", + "Direction": 5, + "Type": 1 + }, + { + "Id": "D01Z05S12[W]", + "Direction": 1, + "OriginalDoor": "D01Z05S10[SE]" + }, + { + "Id": "D01Z05S12[E]", + "Direction": 2, + "OriginalDoor": "D01Z04S09[W]", + "Type": 1 + }, + { + "Id": "D01Z05S13[SW]", + "Direction": 3, + "OriginalDoor": "D01Z05S16[N]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D01Z05S13[E]" ], + "Logic": "D01Z05S13[SW] || canSurvivePoison3 && canWaterJump" + }, + { + "Id": "D01Z05S13[N]", + "Direction": 0, + "OriginalDoor": "D01Z05S03[S]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D01Z05S13[E]" ], + "Logic": "D01Z05S13[N] || canSurvivePoison3 && canWaterJump" + }, + { + "Id": "D01Z05S13[E]", + "Direction": 2, + "OriginalDoor": "D01Z05S14[W]", + "VisibilityFlags": 1 + }, + { + "Id": "D01Z05S14[W]", + "Direction": 1, + "OriginalDoor": "D01Z05S13[E]" + }, + { + "Id": "D01Z05S14[N]", + "Direction": 0, + "OriginalDoor": "D01Z05S10[S]" + }, + { + "Id": "D01Z05S14[SE]", + "Direction": 2, + "OriginalDoor": "D01Z05S15[W]" + }, + { + "Id": "D01Z05S15[W]", + "Direction": 1, + "OriginalDoor": "D01Z05S14[SE]" + }, + { + "Id": "D01Z05S15[SW]", + "Direction": 1, + "OriginalDoor": "D01Z05S22[E]" + }, + { + "Id": "D01Z05S15[SE]", + "Direction": 2, + "OriginalDoor": "D01Z05S19[W]" + }, + { + "Id": "D01Z05S16[N]", + "Direction": 0, + "OriginalDoor": "D01Z05S13[SW]" + }, + { + "Id": "D01Z05S16[SW]", + "Direction": 1, + "OriginalDoor": "D01Z05S21[E]" + }, + { + "Id": "D01Z05S16[SE]", + "Direction": 2, + "OriginalDoor": "D01Z05S17[W]" + }, + { + "Id": "D01Z05S17[W]", + "Direction": 1, + "OriginalDoor": "D01Z05S16[SE]" + }, + { + "Id": "D01Z05S17[E]", + "Direction": 2, + "OriginalDoor": "D01BZ09S01[W]", + "Logic": "dash && (D01Z05S17[E] || canWaterJump || canCrossGap5)" + }, + { + "Id": "D01Z05S18[E]", + "Direction": 2, + "OriginalDoor": "D01Z05S05[SW]" + }, + { + "Id": "D01Z05S19[W]", + "Direction": 1, + "OriginalDoor": "D01Z05S15[SE]" + }, + { + "Id": "D01Z05S19[E]", + "Direction": 2, + "OriginalDoor": "D01Z04S19[W]", + "Type": 1 + }, + { + "Id": "D01Z05S20[W]", + "Direction": 1, + "OriginalDoor": "D01Z05S25[NE]" + }, + { + "Id": "D01Z05S20[N]", + "Direction": 0, + "OriginalDoor": "D01Z05S02[S]" + }, + { + "Id": "D01Z05S21[W]", + "Direction": 1, + "OriginalDoor": "D01Z05S25[E]" + }, + { + "Id": "D01Z05S21[E]", + "Direction": 2, + "OriginalDoor": "D01Z05S16[SW]" + }, + { + "Id": "D01Z05S21[Reward]", + "Direction": 4, + "OriginalDoor": "D01BZ05S01[Reward]", + "Logic": "shroud" + }, + { + "Id": "D01Z05S22[E]", + "Direction": 2, + "OriginalDoor": "D01Z05S15[SW]" + }, + { + "Id": "D01Z05S23[W]", + "Direction": 1, + "OriginalDoor": "D01Z05S24[E]", + "Logic": "chalice && chaliceRooms >= 3" + }, + { + "Id": "D01Z05S23[E]", + "Direction": 2, + "OriginalDoor": "D01Z05S25[W]" + }, + { + "Id": "D01Z05S24[W]", + "Direction": 1, + "OriginalDoor": "D20Z01S04[E]", + "Type": 1 + }, + { + "Id": "D01Z05S24[E]", + "Direction": 2, + "OriginalDoor": "D01Z05S23[W]" + }, + { + "Id": "D01Z05S25[NE]", + "Direction": 2, + "OriginalDoor": "D01Z05S20[W]", + "Logic": "D01Z05S25[SW] || D01Z05S25[SE] || D01Z05S25[NE] || linen" + }, + { + "Id": "D01Z05S25[W]", + "Direction": 1, + "OriginalDoor": "D01Z05S23[E]", + "Logic": "D01Z05S25[W] || (linen && (canWalkOnRoot || doubleJump || canAirStall)) || (D01Z05S25[E] && (canWalkOnRoot || canCrossGap3))" + }, + { + "Id": "D01Z05S25[E]", + "Direction": 2, + "OriginalDoor": "D01Z05S21[W]", + "VisibiliyFlags": 5, + "Logic": "D01Z05S25[E] || canBreakTirana && (linen || D01Z05S25[W] && (canWalkOnRoot || canCrossGap3))" + }, + { + "Id": "D01Z05S25[SW]", + "Direction": 1, + "OriginalDoor": "D03Z03S17[E]", + "Type": 1, + "Logic": "D01Z05S25[SW] || D01Z05S25[SE] || D01Z05S25[NE] || linen" + }, + { + "Id": "D01Z05S25[SE]", + "Direction": 2, + "OriginalDoor": "D01Z05S26[W]", + "Logic": "D01Z05S25[SW] || D01Z05S25[SE] || D01Z05S25[NE] || linen" + }, + { + "Id": "D01Z05S25[EchoesW]", + "Direction": 1, + "OriginalDoor": "D20Z01S09[E]", + "Type": 1, + "VisibilityFlags": 11, + "RequiredDoors": [ "D01Z05S25[EchoesE]" ], + "Logic": "D01Z05S25[EchoesW] || (D01Z05S25[EchoesE] && (blood || canCrossGap8)) || (linen && doubleJump)" + }, + { + "Id": "D01Z05S25[EchoesE]", + "Direction": 2, + "OriginalDoor": "D20Z01S10[W]", + "Type": 1, + "VisibilityFlags": 11, + "RequiredDoors": [ "D01Z05S25[EchoesW]" ], + "Logic": "D01Z05S25[EchoesE] || (D01Z05S25[EchoesW] && (blood || canCrossGap8)) || (linen && doubleJump)" + }, + { + "Id": "D01Z05S26[W]", + "Direction": 1, + "OriginalDoor": "D01Z05S25[SE]" + }, + { + "Id": "D01Z05S27[E]", + "Direction": 2, + "OriginalDoor": "D01Z05S01[W]" + }, + { + "Id": "D01BZ05S01[Reward]", + "Direction": 7, + "OriginalDoor": "D01Z05S21[Reward]" + }, + { + "Id": "D01BZ09S01[W]", + "Direction": 1, + "OriginalDoor": "D01Z05S17[E]" + }, + + { + "Id": "D01Z06S01[N]", + "Direction": 1, + "OriginalDoor": "D01Z01S01[S]", + "Type": 1 + }, + { + "Id": "D01Z06S01[Santos]", + "Direction": 4, + "OriginalDoor": "D01BZ07S01[Santos]", + "Logic": "bell" + }, + { + "Id": "D01BZ07S01[Santos]", + "Direction": 7, + "OriginalDoor": "D01Z06S01[Santos]" + }, + + { + "Id": "D02Z01S01[SW]", + "Direction": 1, + "OriginalDoor": "D02Z01S06[E]", + "Logic": "openedWOTWCave && (D02Z01S01[W] || D02Z01S01[CherubsL] || D02Z01S01[SW] || D02Z01S01[CherubsR] || doubleJump || wallClimb)" + }, + { + "Id": "D02Z01S01[W]", + "Direction": 1, + "OriginalDoor": "D02Z01S02[E]", + "Logic": "D02Z01S01[W] || D02Z01S01[CherubsL] || wallClimb || doubleJump || ((D02Z01S01[SW] || D02Z01S01[CherubsR]) && canDawnJump)" + }, + { + "Id": "D02Z01S01[SE]", + "Direction": 2, + "OriginalDoor": "D01Z03S04[NW]", + "Type": 1 + }, + { + "Id": "D02Z01S01[CherubsL]", + "Direction": 5 + }, + { + "Id": "D02Z01S01[CherubsR]", + "Direction": 5 + }, + { + "Id": "D02Z01S02[W]", + "Direction": 1, + "OriginalDoor": "D02Z01S04[E]" + }, + { + "Id": "D02Z01S02[NW]", + "Direction": 1, + "OriginalDoor": "D02Z01S03[SE]", + "Logic": "D02Z01S02[NW] || wallClimb || doubleJump || (D02Z01S02[NE] && canWalkOnRoot && canCrossGap5)" + }, + { + "Id": "D02Z01S02[E]", + "Direction": 2, + "OriginalDoor": "D02Z01S01[W]" + }, + { + "Id": "D02Z01S02[NE]", + "Direction": 2, + "OriginalDoor": "D02Z01S09[W]", + "Logic": "D02Z01S02[NE] || (doubleJump && canEnemyBounce) || (D02Z01S02[NW] || wallClimb || doubleJump) && (canWalkOnRoot || canCrossGap10)" + }, + { + "Id": "D02Z01S02[]", + "Direction": 6, + "OriginalDoor": "D02Z01S06[Cherubs]", + "Logic": "linen" + }, + { + "Id": "D02Z01S03[SW]", + "Direction": 1, + "OriginalDoor": "D02Z01S05[E]" + }, + { + "Id": "D02Z01S03[W]", + "Direction": 1, + "OriginalDoor": "D02Z02S01[E]", + "Type": 1, + "Logic": "D02Z01S03[W] || D02Z01S03[SE] || D02Z01S03[Cherubs] || wallClimb" + }, + { + "Id": "D02Z01S03[SE]", + "Direction": 2, + "OriginalDoor": "D02Z01S02[NW]", + "Logic": "D02Z01S03[W] || D02Z01S03[SE] || D02Z01S03[Cherubs] || wallClimb" + }, + { + "Id": "D02Z01S03[Cherubs]", + "Direction": 5 + }, + { + "Id": "D02Z01S04[E]", + "Direction": 2, + "OriginalDoor": "D02Z01S02[W]" + }, + { + "Id": "D02Z01S04[-N]", + "Direction": 6, + "OriginalDoor": "D02Z01S08[N]", + "Logic": "fullThimble && (D02Z01S01[W] || D02Z01S01[CherubsL] || wallClimb || doubleJump || ((D02Z01S01[SW] || D02Z01S01[CherubsR]) && canDawnJump))" + }, + { + "Id": "D02Z01S05[E]", + "Direction": 2, + "OriginalDoor": "D02Z01S03[SW]" + }, + { + "Id": "D02Z01S06[W]", + "Direction": 1, + "OriginalDoor": "D02Z01S08[E]", + "Logic": "D02Z01S06[W] || dash || wallClimb && doubleJump" + }, + { + "Id": "D02Z01S06[E]", + "Direction": 2, + "OriginalDoor": "D02Z01S01[SW]", + "Logic": "D02Z01S06[E] || wallClimb" + }, + { + "Id": "D02Z01S06[Cherubs]", + "Direction": 5 + }, + { + "Id": "D02Z01S08[E]", + "Direction": 2, + "OriginalDoor": "D02Z01S06[W]" + }, + { + "Id": "D02Z01S08[N]", + "Direction": 5 + }, + { + "Id": "D02Z01S09[W]", + "Direction": 1, + "OriginalDoor": "D02Z01S02[NE]" + }, + { + "Id": "D02Z01S09[-CherubsL]", + "Direction": 6, + "OriginalDoor": "D02Z01S01[CherubsL]", + "Logic": "linen" + }, + { + "Id": "D02Z01S09[-CherubsR]", + "Direction": 6, + "OriginalDoor": "D02Z01S01[CherubsR]", + "Logic": "linen && (canWalkOnRoot || canCrossGap2 || canEnemyBounce && canAirStall)" + }, + + { + "Id": "D02Z02S01[W]", + "Direction": 1, + "OriginalDoor": "D02Z02S08[E]", + "Logic": "D02Z02S01[W] || D02Z02S01[NW] || D02Z02S01[Cherubs] || dash" + }, + { + "Id": "D02Z02S01[NW]", + "Direction": 1, + "OriginalDoor": "D02Z02S02[SE]", + "Logic": "D02Z02S01[NW] || D02Z02S01[Cherubs] || wallClimb && (D02Z02S01[W] || dash)" + }, + { + "Id": "D02Z02S01[E]", + "Direction": 2, + "OriginalDoor": "D02Z01S03[W]", + "Type": 1, + "Logic": "D02Z02S01[E] || D02Z02S01[NW] || D02Z02S01[Cherubs] || wallClimb || dash" + }, + { + "Id": "D02Z02S01[Cherubs]", + "Direction": 5 + }, + { + "Id": "D02Z02S02[SE]", + "Direction": 2, + "OriginalDoor": "D02Z02S01[NW]" + }, + { + "Id": "D02Z02S02[NW]", + "Direction": 1, + "OriginalDoor": "D02Z02S04[SE]", + "Logic": "D02Z02S02[NW] || D02Z02S02[NE] || D02Z02S02[CherubsL] || D02Z02S02[CherubsR] || wallClimb" + }, + { + "Id": "D02Z02S02[NE]", + "Direction": 2, + "OriginalDoor": "D02Z02S03[SW]", + "Logic": "D02Z02S02[NW] || D02Z02S02[NE] || D02Z02S02[CherubsL] || D02Z02S02[CherubsR] || wallClimb" + }, + { + "Id": "D02Z02S02[-CherubsR]", + "Direction": 6, + "OriginalDoor": "D02Z02S08[CherubsR]", + "Logic": "linen" + }, + { + "Id": "D02Z02S02[CherubsL]", + "Direction": 5 + }, + { + "Id": "D02Z02S02[CherubsR]", + "Direction": 5 + }, + { + "Id": "D02Z02S03[SW]", + "Direction": 1, + "OriginalDoor": "D02Z02S02[NE]" + }, + { + "Id": "D02Z02S03[NW]", + "Direction": 1, + "OriginalDoor": "D02Z02S05[SE]", + "Logic": "D02Z02S03[NW] || doubleJump || wallClimb || D02Z02S03[NE] && canWalkOnRoot" + }, + { + "Id": "D02Z02S03[NE]", + "Direction": 2, + "OriginalDoor": "D02Z02S14[W]", + "Logic": "D02Z02S03[NE] || wallClimb && (canCrossGap11 || (blood && (canWalkOnRoot || canCrossGap7)) || (canWalkOnRoot && (doubleJump || canAirStall)))" + }, + { + "Id": "D02Z02S03[-Cherubs]", + "Direction": 6, + "OriginalDoor": "D02Z02S01[Cherubs]", + "Logic": "linen" + }, + { + "Id": "D02Z02S04[W]", + "Direction": 1, + "OriginalDoor": "D02Z02S09[E]", + "Logic": "D02Z02S04[NE] || D02Z02S04[W] || D02Z02S04[E] && dash || D02Z02S04[SE] && (wallClimb || doubleJump && canEnemyUpslash)" + }, + { + "Id": "D02Z02S04[SE]", + "Direction": 2, + "OriginalDoor": "D02Z02S02[NW]", + "Logic": "D02Z02S04[NE] || D02Z02S04[W] || D02Z02S04[SE] || dash" + }, + { + "Id": "D02Z02S04[E]", + "Direction": 2, + "OriginalDoor": "D02Z02S05[SW]", + "VisibilityFlags": 1 + }, + { + "Id": "D02Z02S04[NE]", + "Direction": 2, + "OriginalDoor": "D02Z02S05[W]", + "Logic": "D02Z02S04[NE] || ((D02Z02S04[W] || D02Z02S04[E] && dash) && (doubleJump || wallClimb)) || (D02Z02S04[SE] && (wallClimb || doubleJump && canEnemyUpslash))" + }, + { + "Id": "D02Z02S04[-CherubsL]", + "Direction": 6, + "OriginalDoor": "D02Z02S08[CherubsL]", + "Logic": "linen && (D02Z02S04[NE] || D02Z02S04[W] || D02Z02S04[SE] || dash)" + }, + { + "Id": "D02Z02S05[SW]", + "Direction": 1, + "OriginalDoor": "D02Z02S04[E]" + }, + { + "Id": "D02Z02S05[W]", + "Direction": 1, + "OriginalDoor": "D02Z02S04[NE]", + "VisibilityFlags": 65, + "Logic": "D02Z02S05[W] || doubleJump && canEnemyBounce" + }, + { + "Id": "D02Z02S05[SE]", + "Direction": 2, + "OriginalDoor": "D02Z02S03[NW]" + }, + { + "Id": "D02Z02S05[E]", + "Direction": 2, + "OriginalDoor": "D02Z02S10[W]", + "Logic": "D02Z02S05[NW] || D02Z02S05[E] || wallClimb" + }, + { + "Id": "D02Z02S05[NW]", + "Direction": 1, + "OriginalDoor": "D02Z02S07[E]", + "Logic": "D02Z02S05[NW] || wallClimb" + }, + { + "Id": "D02Z02S05[-CherubsL]", + "Direction": 6, + "OriginalDoor": "D02Z02S02[CherubsL]", + "Logic": "linen" + }, + { + "Id": "D02Z02S05[-CherubsR]", + "Direction": 6, + "OriginalDoor": "D02Z02S02[CherubsR]", + "Logic": "linen" + }, + { + "Id": "D02Z02S06[E]", + "Direction": 2, + "OriginalDoor": "D02Z02S11[W]" + }, + { + "Id": "D02Z02S07[W]", + "Direction": 1, + "OriginalDoor": "D02Z03S01[E]", + "Type": 1 + }, + { + "Id": "D02Z02S07[E]", + "Direction": 2, + "OriginalDoor": "D02Z02S05[NW]" + }, + { + "Id": "D02Z02S07[Cherubs]", + "Direction": 5 + }, + { + "Id": "D02Z02S08[W]", + "Direction": 1, + "OriginalDoor": "D02Z02S11[SE]" + }, + { + "Id": "D02Z02S08[E]", + "Direction": 2, + "OriginalDoor": "D02Z02S01[W]" + }, + { + "Id": "D02Z02S08[C]", + "Direction": 4, + "OriginalDoor": "D02BZ02S01[C]" + }, + { + "Id": "D02Z02S08[CherubsL]", + "Direction": 5 + }, + { + "Id": "D02Z02S08[CherubsR]", + "Direction": 5 + }, + { + "Id": "D02Z02S09[E]", + "Direction": 2, + "OriginalDoor": "D02Z02S04[W]" + }, + { + "Id": "D02Z02S10[W]", + "Direction": 1, + "OriginalDoor": "D02Z02S05[E]" + }, + { + "Id": "D02Z02S11[W]", + "Direction": 1, + "OriginalDoor": "D02Z02S06[E]" + }, + { + "Id": "D02Z02S11[SE]", + "Direction": 2, + "OriginalDoor": "D02Z02S08[W]" + }, + { + "Id": "D02Z02S11[E]", + "Direction": 2, + "OriginalDoor": "D02Z02S12[W]", + "Logic": "D02Z02S11[E] || D02Z02S11[NW] || D02Z02S11[NE] || canCrossGap6" + }, + { + "Id": "D02Z02S11[NW]", + "Direction": 1, + "OriginalDoor": "D02Z03S14[E]", + "Type": 1, + "VisibilityFlags": 3, + "RequiredDoors": [ "D02Z02S11[NE]" ] + }, + { + "Id": "D02Z02S11[NE]", + "Direction": 2, + "OriginalDoor": "D02Z02S13[W]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D02Z02S11[NW]" ] + }, + { + "Id": "D02Z02S11[-Cherubs]", + "Direction": 6, + "OriginalDoor": "D01Z02S03[Cherubs]", + "Logic": "linen" + }, + { + "Id": "D02Z02S12[W]", + "Direction": 1, + "OriginalDoor": "D02Z02S11[E]" + }, + { + "Id": "D02Z02S13[W]", + "Direction": 1, + "OriginalDoor": "D02Z02S11[NE]" + }, + { + "Id": "D02Z02S14[W]", + "Direction": 1, + "OriginalDoor": "D02Z02S03[NE]" + }, + { + "Id": "D02Z02S14[-Cherubs]", + "Direction": 6, + "OriginalDoor": "D02Z01S03[Cherubs]", + "Logic": "linen" + }, + { + "Id": "D02BZ02S01[C]", + "Direction": 7, + "OriginalDoor": "D02Z02S08[C]" + }, + + { + "Id": "D02Z03S01[W]", + "Direction": 1, + "OriginalDoor": "D02Z03S08[E]" + }, + { + "Id": "D02Z03S01[E]", + "Direction": 2, + "OriginalDoor": "D02Z02S07[W]", + "Type": 1 + }, + { + "Id": "D02Z03S02[S]", + "Direction": 3, + "OriginalDoor": "D02Z03S16[N]" + }, + { + "Id": "D02Z03S02[W]", + "Direction": 1, + "OriginalDoor": "D02Z03S03[E]", + "Logic": "D02Z03S02[NW] || D02Z03S02[NE] || D02Z03S02[N] || D02Z03S02[W] || doubleJump || wallClimb" + }, + { + "Id": "D02Z03S02[NW]", + "Direction": 1, + "OriginalDoor": "D02Z03S21[E]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D02Z03S02[NE]", "D02Z03S02[N]" ] + }, + { + "Id": "D02Z03S02[NE]", + "Direction": 2, + "OriginalDoor": "D02Z03S13[W]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D02Z03S02[NW]", "D02Z03S02[N]" ] + }, + { + "Id": "D02Z03S02[N]", + "Direction": 0, + "OriginalDoor": "D02Z03S11[S]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D02Z03S02[NW]", "D02Z03S02[NE]" ], + "Logic": "openedConventLadder" + }, + { + "Id": "D02Z03S03[W]", + "Direction": 1, + "OriginalDoor": "D02Z03S05[E]" + }, + { + "Id": "D02Z03S03[NW]", + "Direction": 1, + "OriginalDoor": "D02Z03S05[NE]", + "Logic": "D02Z03S03[NW] || blood || canCrossGap3" + }, + { + "Id": "D02Z03S03[E]", + "Direction": 2, + "OriginalDoor": "D02Z03S02[W]" + }, + { + "Id": "D02Z03S05[S]", + "Direction": 3, + "OriginalDoor": "D02Z03S07[N]", + "Logic": "D02Z03S05[S] || D02Z03S05[NE] || wallClimb" + }, + { + "Id": "D02Z03S05[E]", + "Direction": 2, + "OriginalDoor": "D02Z03S03[W]" + }, + { + "Id": "D02Z03S05[NE]", + "Direction": 2, + "OriginalDoor": "D02Z03S03[NW]", + "Logic": "D02Z03S05[S] || D02Z03S05[NE] || wallClimb || doubleJump" + }, + { + "Id": "D02Z03S06[W]", + "Direction": 1, + "OriginalDoor": "D02Z03S18[SE]" + }, + { + "Id": "D02Z03S06[S]", + "Direction": 3, + "OriginalDoor": "D02Z03S07[NW]" + }, + { + "Id": "D02Z03S07[W]", + "Direction": 1, + "OriginalDoor": "D02Z03S17[E]" + }, + { + "Id": "D02Z03S07[NWW]", + "Direction": 1, + "OriginalDoor": "D02Z03S24[E]" + }, + { + "Id": "D02Z03S07[NW]", + "Direction": 0, + "OriginalDoor": "D02Z03S06[S]" + }, + { + "Id": "D02Z03S07[N]", + "Direction": 0, + "OriginalDoor": "D02Z03S05[S]" + }, + { + "Id": "D02Z03S07[E]", + "Direction": 2, + "OriginalDoor": "D02Z03S08[W]" + }, + { + "Id": "D02Z03S08[SW]", + "Direction": 1, + "OriginalDoor": "D02Z03S12[E]" + }, + { + "Id": "D02Z03S08[W]", + "Direction": 1, + "OriginalDoor": "D02Z03S07[E]", + "VisibilityFlags": 1 + }, + { + "Id": "D02Z03S08[SE]", + "Direction": 2, + "OriginalDoor": "D02Z03S14[W]" + }, + { + "Id": "D02Z03S08[E]", + "Direction": 2, + "OriginalDoor": "D02Z03S01[W]" + }, + { + "Id": "D02Z03S08[NE]", + "Direction": 2, + "OriginalDoor": "D02Z03S16[W]" + }, + { + "Id": "D02Z03S09[W]", + "Direction": 1, + "OriginalDoor": "D02Z03S18[NE]" + }, + { + "Id": "D02Z03S09[E]", + "Direction": 2, + "OriginalDoor": "D02Z03S20[W]" + }, + { + "Id": "D02Z03S10[W]", + "Direction": 1, + "OriginalDoor": "D02Z03S11[E]" + }, + { + "Id": "D02Z03S10[-W]", + "Direction": 2, + "OriginalDoor": "D09Z01S06[-E]", + "Type": 1 + }, + { + "Id": "D02Z03S10[-Cherubs]", + "Direction": 6, + "OriginalDoor": "D02Z02S07[Cherubs]", + "Logic": "linen" + }, + { + "Id": "D02Z03S11[S]", + "Direction": 3, + "OriginalDoor": "D02Z03S02[N]" + }, + { + "Id": "D02Z03S11[W]", + "Direction": 1, + "OriginalDoor": "D02Z03S15[E]" + }, + { + "Id": "D02Z03S11[NW]", + "Direction": 1, + "OriginalDoor": "D02Z03S19[E]" + }, + { + "Id": "D02Z03S11[E]", + "Direction": 2, + "OriginalDoor": "D02Z03S10[W]" + }, + { + "Id": "D02Z03S11[NE]", + "Direction": 2, + "OriginalDoor": "D02Z03S22[W]" + }, + { + "Id": "D02Z03S12[E]", + "Direction": 2, + "OriginalDoor": "D02Z03S08[SW]" + }, + { + "Id": "D02Z03S13[W]", + "Direction": 1, + "OriginalDoor": "D02Z03S02[NE]" + }, + { + "Id": "D02Z03S14[W]", + "Direction": 1, + "OriginalDoor": "D02Z03S08[SE]" + }, + { + "Id": "D02Z03S14[E]", + "Direction": 2, + "OriginalDoor": "D02Z02S11[NW]", + "Type": 1 + }, + { + "Id": "D02Z03S15[E]", + "Direction": 2, + "OriginalDoor": "D02Z03S11[W]" + }, + { + "Id": "D02Z03S16[W]", + "Direction": 1, + "OriginalDoor": "D02Z03S08[NE]" + }, + { + "Id": "D02Z03S16[N]", + "Direction": 0, + "OriginalDoor": "D02Z03S02[S]" + }, + { + "Id": "D02Z03S17[E]", + "Direction": 2, + "OriginalDoor": "D02Z03S07[W]" + }, + { + "Id": "D02Z03S18[NW]", + "Direction": 1, + "OriginalDoor": "D02Z03S23[E]", + "Logic": "D02Z03S18[NW] || D02Z03S18[NE] || wallClimb" + }, + { + "Id": "D02Z03S18[SE]", + "Direction": 2, + "OriginalDoor": "D02Z03S06[W]" + }, + { + "Id": "D02Z03S18[NE]", + "Direction": 2, + "OriginalDoor": "D02Z03S09[W]", + "Logic": "D02Z03S18[NW] || D02Z03S18[NE] || wallClimb" + }, + { + "Id": "D02Z03S19[E]", + "Direction": 2, + "OriginalDoor": "D02Z03S11[NW]" + }, + { + "Id": "D02Z03S20[W]", + "Direction": 1, + "OriginalDoor": "D02Z03S09[E]", + "Logic": "D02Z03S20[W] || canBeatConventBoss" + }, + { + "Id": "D02Z03S20[E]", + "Direction": 2, + "OriginalDoor": "D02Z03S21[W]", + "Logic": "D02Z03S20[E] || canBeatConventBoss" + }, + { + "Id": "D02Z03S21[W]", + "Direction": 1, + "OriginalDoor": "D02Z03S20[E]" + }, + { + "Id": "D02Z03S21[E]", + "Direction": 2, + "OriginalDoor": "D02Z03S02[NW]" + }, + { + "Id": "D02Z03S22[W]", + "Direction": 1, + "OriginalDoor": "D02Z03S11[NE]" + }, + { + "Id": "D02Z03S23[E]", + "Direction": 2, + "OriginalDoor": "D02Z03S18[NW]" + }, + { + "Id": "D02Z03S24[E]", + "Direction": 2, + "OriginalDoor": "D02Z03S07[NWW]" + }, + + { + "Id": "D03Z01S01[W]", + "Direction": 1, + "OriginalDoor": "D03Z01S02[E]" + }, + { + "Id": "D03Z01S01[NE]", + "Direction": 2, + "OriginalDoor": "D01Z05S02[W]", + "Type": 1 + }, + { + "Id": "D03Z01S01[S]", + "Direction": 3, + "OriginalDoor": "D20Z01S03[N]", + "Type": 1, + "VisibilityFlags": 1 + }, + { + "Id": "D03Z01S01[-Cherubs]", + "Direction": 6, + "OriginalDoor": "D20Z01S01[Cherubs]", + "Logic": "linen" + }, + { + "Id": "D03Z01S02[W]", + "Direction": 1, + "OriginalDoor": "D03Z01S06[E]", + "Logic": "D03Z01S02[W] || wallClimb || canCrossGap3" + }, + { + "Id": "D03Z01S02[E]", + "Direction": 2, + "OriginalDoor": "D03Z01S01[W]", + "Logic": "D03Z01S02[E] || wallClimb || canCrossGap7" + }, + { + "Id": "D03Z01S03[W]", + "Direction": 1, + "OriginalDoor": "D03Z01S04[E]", + "Logic": "D03Z01S03[W] || wallClimb && (D03Z01S03[SW] || canCrossGap9)" + }, + { + "Id": "D03Z01S03[E]", + "Direction": 2, + "OriginalDoor": "D03Z01S06[W]", + "Logic": "D03Z01S03[E] || wallClimb" + }, + { + "Id": "D03Z01S03[SW]", + "Direction": 3, + "OriginalDoor": "D03Z02S10[N]", + "Type": 1, + "Logic": "D03Z01S03[W] || D03Z01S03[SW] || canCrossGap9" + }, + { + "Id": "D03Z01S03[SE]", + "Direction": 3, + "OriginalDoor": "D03Z02S01[N]", + "Type": 1 + }, + { + "Id": "D03Z01S03[-WestL]", + "Direction": 6, + "OriginalDoor": "D03Z02S10[Cherubs]", + "Type": 1, + "Logic": "linen && (D03Z01S03[W] || D03Z01S03[SW] || canCrossGap9)" + }, + { + "Id": "D03Z01S03[-WestR]", + "Direction": 6, + "OriginalDoor": "D03Z02S02[CherubsL]", + "Type": 1, + "Logic": "linen && (D03Z01S03[W] || D03Z01S03[SW] || canCrossGap9)" + }, + { + "Id": "D03Z01S03[-EastL]", + "Direction": 6, + "OriginalDoor": "D03Z02S02[CherubsR]", + "Type": 1, + "Logic": "linen && (D03Z01S03[W] || D03Z01S03[SW] || canCrossGap5)" + }, + { + "Id": "D03Z01S03[-EastR]", + "Direction": 6, + "OriginalDoor": "D03Z02S01[Cherubs]", + "Type": 1, + "Logic": "linen" + }, + { + "Id": "D03Z01S04[NW]", + "Direction": 1, + "OriginalDoor": "D03Z01S05[E]" + }, + { + "Id": "D03Z01S04[E]", + "Direction": 2, + "OriginalDoor": "D03Z01S03[W]" + }, + { + "Id": "D03Z01S05[W]", + "Direction": 1, + "OriginalDoor": "D17Z01S07[SE]", + "Type": 1 + }, + { + "Id": "D03Z01S05[E]", + "Direction": 2, + "OriginalDoor": "D03Z01S04[NW]" + }, + { + "Id": "D03Z01S06[W]", + "Direction": 1, + "OriginalDoor": "D03Z01S03[E]", + "Logic": "D03Z01S06[W] || canBeatPerpetua" + }, + { + "Id": "D03Z01S06[E]", + "Direction": 2, + "OriginalDoor": "D03Z01S02[W]", + "Logic": "D03Z01S06[E] || canBeatPerpetua" + }, + + { + "Id": "D03Z02S01[W]", + "Direction": 1, + "OriginalDoor": "D03Z02S02[E]", + "Logic": "D03Z02S01[W] || wallClimb || doubleJump && canEnemyBounce" + }, + { + "Id": "D03Z02S01[N]", + "Direction": 0, + "OriginalDoor": "D03Z01S03[SE]", + "Type": 1, + "Logic": "D03Z02S01[N] || wallClimb || doubleJump" + }, + { + "Id": "D03Z02S01[Cherubs]", + "Direction": 5, + "Type": 1 + }, + { + "Id": "D03Z02S02[W]", + "Direction": 1, + "OriginalDoor": "D03Z02S10[E]", + "Logic": "D03Z02S02[W] || D03Z02S02[CherubsL] || doubleJump && (D03Z02S02[E] || D03Z02S02[CherubsR] || wallClimb || canEnemyBounce)" + }, + { + "Id": "D03Z02S02[E]", + "Direction": 2, + "OriginalDoor": "D03Z02S01[W]", + "Logic": "D03Z02S02[E] || wallClimb || doubleJump && canEnemyBounce" + }, + { + "Id": "D03Z02S02[S]", + "Direction": 3, + "OriginalDoor": "D03Z02S03[N]" + }, + { + "Id": "D03Z02S02[CherubsL]", + "Direction": 5, + "Type": 1 + }, + { + "Id": "D03Z02S02[CherubsR]", + "Direction": 5, + "Type": 1 + }, + { + "Id": "D03Z02S03[W]", + "Direction": 3, + "OriginalDoor": "D03Z02S07[N]", + "Logic": "D03Z02S03[W] || dash && (D03Z02S03[E] || D03Z02S03[N] || D03Z02S03[SE2])" + }, + { + "Id": "D03Z02S03[E]", + "Direction": 2, + "OriginalDoor": "D03Z02S05[W]", + "Logic": "D03Z02S03[E] || (canAirStall || doubleJump || boots) && (D03Z02S03[E] && dash || D03Z02S03[N] || D03Z02S03[SE2])" + }, + { + "Id": "D03Z02S03[N]", + "Direction": 0, + "OriginalDoor": "D03Z02S02[S]", + "Logic": "D03Z02S03[W] && dash || D03Z02S03[E] || D03Z02S03[N] || D03Z02S03[SE2]" + }, + { + "Id": "D03Z02S03[SE2]", + "Direction": 3, + "OriginalDoor": "D03Z02S04[NW]", + "Logic": "D03Z02S03[W] && dash || D03Z02S03[E] || D03Z02S03[N] || D03Z02S03[SE2]" + }, + { + "Id": "D03Z02S03[SW]", + "Direction": 1, + "OriginalDoor": "D03Z02S07[E]", + "Logic": "D03Z02S03[SW] || D03Z02S03[SE] || D03Z02S03[SSL] || D03Z02S03[SSR] || brokeJondoBellW && brokeJondoBellE && (D03Z02S03[W] && dash || D03Z02S03[E] || D03Z02S03[N] || D03Z02S03[SE2])" + }, + { + "Id": "D03Z02S03[SE]", + "Direction": 2, + "OriginalDoor": "D03Z02S06[W]", + "Logic": "D03Z02S03[SW] || D03Z02S03[SE] || D03Z02S03[SSL] || D03Z02S03[SSR] || brokeJondoBellW && brokeJondoBellE && (D03Z02S03[W] && dash || D03Z02S03[E] || D03Z02S03[N] || D03Z02S03[SE2])" + }, + { + "Id": "D03Z02S03[SSL]", + "Direction": 3, + "OriginalDoor": "D03Z03S01[NL]", + "Type": 1, + "Logic": "D03Z02S03[SW] || D03Z02S03[SE] || D03Z02S03[SSL] || D03Z02S03[SSR] || brokeJondoBellW && brokeJondoBellE && (D03Z02S03[W] && dash || D03Z02S03[E] || D03Z02S03[N] || D03Z02S03[SE2])" + }, + { + "Id": "D03Z02S03[SSC]", + "Direction": 6, + "OriginalDoor": "D03Z03S01[NC]", + "Type": 1, + "Logic": "D03Z02S03[SW] || D03Z02S03[SE] || D03Z02S03[SSL] || D03Z02S03[SSR] || brokeJondoBellW && brokeJondoBellE && (D03Z02S03[W] && dash || D03Z02S03[E] || D03Z02S03[N] || D03Z02S03[SE2])" + }, + { + "Id": "D03Z02S03[SSR]", + "Direction": 3, + "OriginalDoor": "D03Z03S01[NR]", + "Type": 1, + "Logic": "D03Z02S03[SW] || D03Z02S03[SE] || D03Z02S03[SSL] || D03Z02S03[SSR] || brokeJondoBellW && brokeJondoBellE && (D03Z02S03[W] && dash || D03Z02S03[E] || D03Z02S03[N] || D03Z02S03[SE2])" + }, + { + "Id": "D03Z02S04[NW]", + "Direction": 0, + "OriginalDoor": "D03Z02S03[SE2]", + "Logic": "D03Z02S04[NW] || wallClimb || doubleJump" + }, + { + "Id": "D03Z02S04[NE]", + "Direction": 0, + "OriginalDoor": "D03Z02S05[S]", + "Logic": "D03Z02S04[NE] || wallClimb || (D03Z02S04[S] && doubleJump)" + }, + { + "Id": "D03Z02S04[S]", + "Direction": 3, + "OriginalDoor": "D03Z02S06[N]", + "Logic": "D03Z02S04[NE] || D03Z02S04[S] || wallClimb" + }, + { + "Id": "D03Z02S05[W]", + "Direction": 1, + "OriginalDoor": "D03Z02S03[E]" + }, + { + "Id": "D03Z02S05[E]", + "Direction": 2, + "OriginalDoor": "D03Z02S11[W]", + "Logic": "D03Z02S05[E] || D03Z02S05[S] || canCrossGap5 || (canEnemyBounce && canCrossGap3)" + }, + { + "Id": "D03Z02S05[S]", + "Direction": 3, + "OriginalDoor": "D03Z02S04[NE]", + "Logic": "D03Z02S05[E] || D03Z02S05[S] || canCrossGap5 || (canEnemyBounce && canCrossGap3)" + }, + { + "Id": "D03Z02S06[W]", + "Direction": 1, + "OriginalDoor": "D03Z02S03[SE]", + "VisibilityFlags": 1 + }, + { + "Id": "D03Z02S06[N]", + "Direction": 0, + "OriginalDoor": "D03Z02S04[S]" + }, + { + "Id": "D03Z02S07[W]", + "Direction": 1, + "OriginalDoor": "D03Z02S08[E]" + }, + { + "Id": "D03Z02S07[E]", + "Direction": 2, + "OriginalDoor": "D03Z02S03[SW]", + "VisibilityFlags": 1 + }, + { + "Id": "D03Z02S07[N]", + "Direction": 0, + "OriginalDoor": "D03Z02S03[W]" + }, + { + "Id": "D03Z02S08[W]", + "Direction": 1, + "OriginalDoor": "D03Z02S14[E]", + "Logic": "D03Z02S08[N] || D03Z02S08[W] || wallClimb || doubleJump" + }, + { + "Id": "D03Z02S08[E]", + "Direction": 2, + "OriginalDoor": "D03Z02S07[W]" + }, + { + "Id": "D03Z02S08[N]", + "Direction": 0, + "OriginalDoor": "D03Z02S09[S]", + "Logic": "D03Z02S08[N] || D03Z02S08[W] || wallClimb || doubleJump" + }, + { + "Id": "D03Z02S09[W]", + "Direction": 1, + "OriginalDoor": "D03Z02S12[E]", + "Logic": "D03Z02S09[W] || dash" + }, + { + "Id": "D03Z02S09[N]", + "Direction": 0, + "OriginalDoor": "D03Z02S10[S]", + "Logic": "D03Z02S09[N] || D03Z02S09[S] || D03Z02S09[Cherubs] || dash" + }, + { + "Id": "D03Z02S09[S]", + "Direction": 3, + "OriginalDoor": "D03Z02S08[N]", + "Logic": "D03Z02S09[N] || D03Z02S09[S] || D03Z02S09[Cherubs] || dash" + }, + { + "Id": "D03Z02S09[Cherubs]", + "Direction": 5 + }, + { + "Id": "D03Z02S10[W]", + "Direction": 1, + "OriginalDoor": "D03Z02S13[E]" + }, + { + "Id": "D03Z02S10[N]", + "Direction": 0, + "OriginalDoor": "D03Z01S03[SW]", + "Type": 1 + }, + { + "Id": "D03Z02S10[S]", + "Direction": 3, + "OriginalDoor": "D03Z02S09[N]" + }, + { + "Id": "D03Z02S10[E]", + "Direction": 2, + "OriginalDoor": "D03Z02S02[W]" + }, + { + "Id": "D03Z02S10[-Cherubs]", + "Direction": 6, + "OriginalDoor": "D03Z02S09[Cherubs]", + "Logic": "linen" + }, + { + "Id": "D03Z02S10[Cherubs]", + "Direction": 5, + "Type": 1 + }, + { + "Id": "D03Z02S11[W]", + "Direction": 1, + "OriginalDoor": "D03Z02S05[E]", + "Logic": "D03Z02S11[W] || dash && (doubleJump || wallClimb || canCrossGap2)" + }, + { + "Id": "D03Z02S11[E]", + "Direction": 2, + "OriginalDoor": "D03Z02S15[W]", + "Logic": "D03Z02S11[E] || dash && (wallClimb || doubleJump)" + }, + { + "Id": "D03Z02S12[E]", + "Direction": 2, + "OriginalDoor": "D03Z02S09[W]" + }, + { + "Id": "D03Z02S12[Cherubs]", + "Direction": 5 + }, + { + "Id": "D03Z02S13[E]", + "Direction": 2, + "OriginalDoor": "D03Z02S10[W]" + }, + { + "Id": "D03Z02S13[-Cherubs]", + "Direction": 6, + "OriginalDoor": "D03Z02S12[Cherubs]", + "Logic": "linen" + }, + { + "Id": "D03Z02S14[E]", + "Direction": 2, + "OriginalDoor": "D03Z02S08[W]" + }, + { + "Id": "D03Z02S15[W]", + "Direction": 1, + "OriginalDoor": "D03Z02S11[E]" + }, + { + "Id": "D03Z02S15[E]", + "Direction": 2, + "OriginalDoor": "D20Z01S01[W]", + "Type": 1 + }, + + { + "Id": "D03Z03S01[W]", + "Direction": 1, + "OriginalDoor": "D03Z03S18[E]" + }, + { + "Id": "D03Z03S01[S]", + "Direction": 2, + "OriginalDoor": "D03Z03S12[W]" + }, + { + "Id": "D03Z03S01[NL]", + "Direction": 0, + "OriginalDoor": "D03Z02S03[SSL]", + "Type": 1, + "Logic": "D03Z03S01[NL] || D03Z03S01[NR] || D03Z03S01[NC] || wallClimb || doubleJump" + }, + { + "Id": "D03Z03S01[NC]", + "Direction": 5, + "Type": 1 + }, + { + "Id": "D03Z03S01[NR]", + "Direction": 0, + "OriginalDoor": "D03Z02S03[SSR]", + "Type": 1, + "Logic": "D03Z03S01[NL] || D03Z03S01[NR] || D03Z03S01[NC] || wallClimb || doubleJump" + }, + { + "Id": "D03Z03S02[W]", + "Direction": 1, + "OriginalDoor": "D03Z03S12[E]", + "Logic": "D03Z03S02[NE] || D03Z03S02[W] || wallClimb || doubleJump" + }, + { + "Id": "D03Z03S02[NE]", + "Direction": 2, + "OriginalDoor": "D03Z03S14[W]", + "Logic": "D03Z03S02[NE] || wallClimb || doubleJump" + }, + { + "Id": "D03Z03S02[E]", + "Direction": 2, + "OriginalDoor": "D03Z03S03[W]" + }, + { + "Id": "D03Z03S03[W]", + "Direction": 1, + "OriginalDoor": "D03Z03S02[E]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D03Z03S03[NE]" ] + }, + { + "Id": "D03Z03S03[NE]", + "Direction": 2, + "OriginalDoor": "D03Z03S04[NW]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D03Z03S03[W]" ] + }, + { + "Id": "D03Z03S03[SE]", + "Direction": 2, + "OriginalDoor": "D03Z03S04[SW]", + "VisibilityFlags": 1 + }, + { + "Id": "D03Z03S04[NW]", + "Direction": 1, + "OriginalDoor": "D03Z03S03[NE]", + "Logic": "D03Z03S04[NW] || D03Z03S04[NE] || (wallClimb || doubleJump) && (D03Z03S04[E] || D03Z03S04[SW] || blood || canCrossGap10)" + }, + { + "Id": "D03Z03S04[NE]", + "Direction": 2, + "OriginalDoor": "D03Z03S05[NW]", + "Logic": "D03Z03S04[NE] || wallClimb && (D03Z03S04[NW] || D03Z03S04[E] || D03Z03S04[SW] || blood || canCrossGap10)" + }, + { + "Id": "D03Z03S04[E]", + "Direction": 2, + "OriginalDoor": "D03Z03S05[SW]", + "Logic": "D03Z03S04[NW] || D03Z03S04[NE] || D03Z03S04[E] || (wallClimb || doubleJump) && (D03Z03S04[SW] || blood || canCrossGap10)" + }, + { + "Id": "D03Z03S04[SW]", + "Direction": 1, + "OriginalDoor": "D03Z03S03[SE]", + "Logic": "D03Z03S04[NW] || D03Z03S04[NE] || D03Z03S04[E] || D03Z03S04[SW] || blood || canCrossGap10" + }, + { + "Id": "D03Z03S04[SE]", + "Direction": 2, + "OriginalDoor": "D03Z03S13[W]", + "Logic": "D03Z03S04[SE] || blood" + }, + { + "Id": "D03Z03S04[-Cherubs]", + "Direction": 6, + "OriginalDoor": "D03Z03S10[Cherubs]", + "Logic": "linen" + }, + { + "Id": "D03Z03S05[NW]", + "Direction": 1, + "OriginalDoor": "D03Z03S04[NE]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D03Z03S05[NE]" ] + }, + { + "Id": "D03Z03S05[NE]", + "Direction": 2, + "OriginalDoor": "D03Z03S06[W]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D03Z03S05[NW]" ] + }, + { + "Id": "D03Z03S05[SW]", + "Direction": 1, + "OriginalDoor": "D03Z03S04[E]", + "Logic": "D03Z03S05[SW] || D03Z03S05[SE] || linen" + }, + { + "Id": "D03Z03S05[SE]", + "Direction": 2, + "OriginalDoor": "D03Z03S07[SW]", + "Logic": "D03Z03S05[SW] || D03Z03S05[SE] || linen" + }, + { + "Id": "D03Z03S06[W]", + "Direction": 1, + "OriginalDoor": "D03Z03S05[NE]" + }, + { + "Id": "D03Z03S07[NW]", + "Direction": 1, + "OriginalDoor": "D03Z03S19[E]", + "Logic": "D03Z03S07[NW] || D03Z03S07[NE] || wallClimb || doubleJump" + }, + { + "Id": "D03Z03S07[NE]", + "Direction": 2, + "OriginalDoor": "D03Z03S08[W]", + "Logic": "D03Z03S07[NW] || D03Z03S07[NE] || wallClimb || doubleJump" + }, + { + "Id": "D03Z03S07[SW]", + "Direction": 1, + "OriginalDoor": "D03Z03S05[SE]" + }, + { + "Id": "D03Z03S07[E]", + "Direction": 2, + "OriginalDoor": "D03Z03S11[W]" + }, + { + "Id": "D03Z03S07[S]", + "Direction": 3, + "OriginalDoor": "D03Z03S09[N]" + }, + { + "Id": "D03Z03S08[W]", + "Direction": 1, + "OriginalDoor": "D03Z03S07[NE]" + }, + { + "Id": "D03Z03S08[-CherubsL]", + "Direction": 6, + "OriginalDoor": "D03Z03S11[CherubsL]", + "Logic": "linen" + }, + { + "Id": "D03Z03S08[-CherubsR]", + "Direction": 6, + "OriginalDoor": "D03Z03S11[CherubsR]", + "Logic": "linen" + }, + { + "Id": "D03Z03S09[SW]", + "Direction": 1, + "OriginalDoor": "D03Z03S10[E]" + }, + { + "Id": "D03Z03S09[N]", + "Direction": 0, + "OriginalDoor": "D03Z03S07[S]" + }, + { + "Id": "D03Z03S10[E]", + "Direction": 2, + "OriginalDoor": "D03Z03S09[SW]" + }, + { + "Id": "D03Z03S10[Cherubs]", + "Direction": 5 + }, + { + "Id": "D03Z03S11[W]", + "Direction": 1, + "OriginalDoor": "D03Z03S07[E]" + }, + { + "Id": "D03Z03S11[E]", + "Direction": 2, + "OriginalDoor": "D03Z03S15[W]" + }, + { + "Id": "D03Z03S11[CherubsL]", + "Direction": 5 + }, + { + "Id": "D03Z03S11[CherubsR]", + "Direction": 5 + }, + { + "Id": "D03Z03S12[W]", + "Direction": 1, + "OriginalDoor": "D03Z03S01[S]" + }, + { + "Id": "D03Z03S12[E]", + "Direction": 2, + "OriginalDoor": "D03Z03S02[W]" + }, + { + "Id": "D03Z03S13[W]", + "Direction": 1, + "OriginalDoor": "D03Z03S04[SE]" + }, + { + "Id": "D03Z03S14[W]", + "Direction": 1, + "OriginalDoor": "D03Z03S02[NE]" + }, + { + "Id": "D03Z03S15[W]", + "Direction": 1, + "OriginalDoor": "D03Z03S11[E]", + "Logic": "canBeatGrievanceBoss" + }, + { + "Id": "D03Z03S15[E]", + "Direction": 2, + "OriginalDoor": "D03Z03S16[W]", + "Logic": "canBeatGrievanceBoss" + }, + { + "Id": "D03Z03S16[W]", + "Direction": 1, + "OriginalDoor": "D03Z03S15[E]" + }, + { + "Id": "D03Z03S16[E]", + "Direction": 2, + "OriginalDoor": "D03Z03S17[W]" + }, + { + "Id": "D03Z03S17[W]", + "Direction": 1, + "OriginalDoor": "D03Z03S16[E]" + }, + { + "Id": "D03Z03S17[E]", + "Direction": 2, + "OriginalDoor": "D01Z05S25[SW]", + "Type": 1 + }, + { + "Id": "D03Z03S18[E]", + "Direction": 2, + "OriginalDoor": "D03Z03S01[W]" + }, + { + "Id": "D03Z03S19[E]", + "Direction": 2, + "OriginalDoor": "D03Z03S07[NW]" + }, + + { + "Id": "D04Z01S01[W]", + "Direction": 1, + "OriginalDoor": "D08Z02S01[E]", + "Type": 1 + }, + { + "Id": "D04Z01S01[E]", + "Direction": 2, + "OriginalDoor": "D04Z01S02[W]" + }, + { + "Id": "D04Z01S01[NE]", + "Direction": 2, + "OriginalDoor": "D04Z01S02[NW]", + "Logic": "D04Z01S01[NE] || D04Z01S01[N] || canCrossGap3" + }, + { + "Id": "D04Z01S01[N]", + "Direction": 0, + "OriginalDoor": "D04Z01S05[S]", + "Logic": "D04Z01S01[NE] || D04Z01S01[N] || canCrossGap3" + }, + { + "Id": "D04Z01S01[Cherubs]", + "Direction": 5 + }, + { + "Id": "D04Z01S02[W]", + "Direction": 1, + "OriginalDoor": "D04Z01S01[E]" + }, + { + "Id": "D04Z01S02[NW]", + "Direction": 1, + "OriginalDoor": "D04Z01S01[NE]" + }, + { + "Id": "D04Z01S02[E]", + "Direction": 2, + "OriginalDoor": "D04Z01S03[W]" + }, + { + "Id": "D04Z01S03[W]", + "Direction": 1, + "OriginalDoor": "D04Z01S02[E]" + }, + { + "Id": "D04Z01S03[E]", + "Direction": 2, + "OriginalDoor": "D04Z01S04[W]" + }, + { + "Id": "D04Z01S03[S]", + "Direction": 3, + "OriginalDoor": "D05Z01S20[N]", + "Type": 1, + "VisibilityFlags": 1 + }, + { + "Id": "D04Z01S04[W]", + "Direction": 1, + "OriginalDoor": "D04Z01S03[E]" + }, + { + "Id": "D04Z01S04[E]", + "Direction": 2, + "OriginalDoor": "D04Z02S01[W]", + "Type": 1 + }, + { + "Id": "D04Z01S04[Cherubs]", + "Direction": 5, + "Type": 1 + }, + { + "Id": "D04Z01S05[S]", + "Direction": 3, + "OriginalDoor": "D04Z01S01[N]" + }, + { + "Id": "D04Z01S05[N]", + "Direction": 0, + "OriginalDoor": "D04Z01S06[S]", + "Logic": "D04Z01S05[N] || (blood && canClimbOnRoot) || doubleJump && (blood || canClimbOnRoot)" + }, + { + "Id": "D04Z01S05[-Cherubs]", + "Direction": 6, + "OriginalDoor": "D04Z01S01[Cherubs]", + "Logic": "linen" + }, + { + "Id": "D04Z01S05[CherubsN]", + "Direction": 5 + }, + { + "Id": "D04Z01S06[S]", + "Direction": 3, + "OriginalDoor": "D04Z01S05[N]" + }, + { + "Id": "D04Z01S06[E]", + "Direction": 2, + "OriginalDoor": "D09Z01S09[SW]", + "Type": 1, + "VisibilityFlags": 9, + "Logic": "D04Z01S06[E] || doubleJump" + }, + { + "Id": "D04Z01S06[Cherubs]", + "Direction": 6, + "OriginalDoor": "D04Z01S05[CherubsN]", + "Logic": "linen" + }, + + { + "Id": "D04Z02S01[W]", + "Direction": 1, + "OriginalDoor": "D04Z01S04[E]", + "Type": 1 + }, + { + "Id": "D04Z02S01[N]", + "Direction": 0, + "OriginalDoor": "D04Z02S02[S]", + "Logic": "D04Z02S01[N] || D04Z02S01[NE] && dash && (doubleJump || wallClimb)" + }, + { + "Id": "D04Z02S01[E]", + "Direction": 2, + "OriginalDoor": "D04Z03S01[W]", + "Type": 1 + }, + { + "Id": "D04Z02S01[NE]", + "Direction": 2, + "OriginalDoor": "D04Z02S03[W]", + "Logic": "D04Z02S01[NE] || D04Z02S01[N] && dash && canCrossGap1" + }, + { + "Id": "D04Z02S02[S]", + "Direction": 3, + "OriginalDoor": "D04Z02S01[N]" + }, + { + "Id": "D04Z02S02[SE]", + "Direction": 2, + "OriginalDoor": "D04Z02S17[W]" + }, + { + "Id": "D04Z02S02[NE]", + "Direction": 2, + "OriginalDoor": "D04Z02S15[W]", + "VisibilityFlags": 49, + "Logic": "D04Z02S02[NE] || (doubleJump && upwarpSkipsAllowed) || (doubleJump && canEnemyUpslash) || (canEnemyUpslash && upwarpSkipsAllowed && (wallClimb || D04Z02S02[N]))" + }, + { + "Id": "D04Z02S02[N]", + "Direction": 0, + "OriginalDoor": "D06Z01S02[S]", + "Type": 1, + "Logic": "D04Z02S02[N] || D04Z02S02[NE] || wallClimb || doubleJump" + }, + { + "Id": "D04Z02S03[W]", + "Direction": 1, + "OriginalDoor": "D04Z02S01[NE]" + }, + { + "Id": "D04Z02S03[E]", + "Direction": 2, + "OriginalDoor": "D04Z02S04[NW]" + }, + { + "Id": "D04Z02S04[SW]", + "Direction": 1, + "OriginalDoor": "D04Z02S14[E]" + }, + { + "Id": "D04Z02S04[SE]", + "Direction": 2, + "OriginalDoor": "D05Z01S01[NW]", + "Type": 1 + }, + { + "Id": "D04Z02S04[W]", + "Direction": 1, + "OriginalDoor": "D04Z03S01[E]", + "Type": 1 + }, + { + "Id": "D04Z02S04[E]", + "Direction": 2, + "OriginalDoor": "D04Z02S05[W]" + }, + { + "Id": "D04Z02S04[NW]", + "Direction": 1, + "OriginalDoor": "D04Z02S03[E]", + "Logic": "D04Z02S04[NW] || D04Z02S04[NE] || D04Z02S04[N] || D04Z02S04[Cherubs] || wallClimb && doubleJump" + }, + { + "Id": "D04Z02S04[NE]", + "Direction": 2, + "OriginalDoor": "D04Z02S19[W]", + "Logic": "D04Z02S04[NW] || D04Z02S04[NE] || D04Z02S04[N] || D04Z02S04[Cherubs] || wallClimb && doubleJump" + }, + { + "Id": "D04Z02S04[N]", + "Direction": 0, + "OriginalDoor": "D04Z02S06[S]", + "Logic": "(D04Z02S04[NW] || D04Z02S04[NE] || D04Z02S04[N] || D04Z02S04[Cherubs] || wallClimb && doubleJump) && openedMoMLadder" + }, + { + "Id": "D04Z02S04[Cherubs]", + "Direction": 5 + }, + { + "Id": "D04Z02S05[W]", + "Direction": 1, + "OriginalDoor": "D04Z02S04[E]" + }, + { + "Id": "D04Z02S05[E]", + "Direction": 2, + "OriginalDoor": "D04Z02S07[SW]" + }, + { + "Id": "D04Z02S06[S]", + "Direction": 3, + "OriginalDoor": "D04Z02S04[N]" + }, + { + "Id": "D04Z02S06[NW]", + "Direction": 1, + "OriginalDoor": "D04Z02S11[E]", + "Logic": "D04Z02S06[NW] || D04Z02S06[N] || D04Z02S06[NE] || wallClimb" + }, + { + "Id": "D04Z02S06[N]", + "Direction": 0, + "OriginalDoor": "D06Z01S23[S]", + "Type": 1, + "Logic": "(D04Z02S06[NW] || D04Z02S06[N] || D04Z02S06[NE] || wallClimb) && openedARLadder" + }, + { + "Id": "D04Z02S06[NE]", + "Direction": 2, + "OriginalDoor": "D04Z02S09[W]", + "Logic": "D04Z02S06[NW] || D04Z02S06[N] || D04Z02S06[NE] || wallClimb" + }, + { + "Id": "D04Z02S06[E]", + "Direction": 2, + "OriginalDoor": "D04Z02S10[W]" + }, + { + "Id": "D04Z02S06[-Cherubs]", + "Direction": 6, + "OriginalDoor": "D04Z02S04[Cherubs]", + "Logic": "linen" + }, + { + "Id": "D04Z02S07[SW]", + "Direction": 1, + "OriginalDoor": "D04Z02S05[E]" + }, + { + "Id": "D04Z02S07[W]", + "Direction": 1, + "OriginalDoor": "D04Z02S19[E]" + }, + { + "Id": "D04Z02S07[N]", + "Direction": 0, + "OriginalDoor": "D04Z02S08[S]" + }, + { + "Id": "D04Z02S07[NE]", + "Direction": 2, + "OriginalDoor": "D04Z02S13[W]" + }, + { + "Id": "D04Z02S07[SE]", + "Direction": 2, + "OriginalDoor": "D04Z02S23[W]" + }, + { + "Id": "D04Z02S08[W]", + "Direction": 1, + "OriginalDoor": "D04Z02S09[E]" + }, + { + "Id": "D04Z02S08[E]", + "Direction": 2, + "OriginalDoor": "D04Z02S20[W]" + }, + { + "Id": "D04Z02S08[S]", + "Direction": 3, + "OriginalDoor": "D04Z02S07[N]" + }, + { + "Id": "D04Z02S08[Cherubs]", + "Direction": 5 + }, + { + "Id": "D04Z02S09[W]", + "Direction": 1, + "OriginalDoor": "D04Z02S06[NE]" + }, + { + "Id": "D04Z02S09[E]", + "Direction": 2, + "OriginalDoor": "D04Z02S08[W]" + }, + { + "Id": "D04Z02S09[NE]", + "Direction": 2, + "OriginalDoor": "D04Z02S16[W]", + "Logic": "D04Z02S09[NE] || blood" + }, + { + "Id": "D04Z02S10[W]", + "Direction": 1, + "OriginalDoor": "D04Z02S06[E]" + }, + { + "Id": "D04Z02S11[W]", + "Direction": 1, + "OriginalDoor": "D04Z02S21[SE]" + }, + { + "Id": "D04Z02S11[E]", + "Direction": 2, + "OriginalDoor": "D04Z02S06[NW]" + }, + { + "Id": "D04Z02S12[W]", + "Direction": 1, + "OriginalDoor": "D04Z02S21[NE]" + }, + { + "Id": "D04Z02S13[W]", + "Direction": 1, + "OriginalDoor": "D04Z02S07[NE]" + }, + { + "Id": "D04Z02S14[E]", + "Direction": 2, + "OriginalDoor": "D04Z02S04[SW]" + }, + { + "Id": "D04Z02S15[W]", + "Direction": 1, + "OriginalDoor": "D04Z02S02[NE]" + }, + { + "Id": "D04Z02S15[E]", + "Direction": 2, + "OriginalDoor": "D04Z02S22[W]" + }, + { + "Id": "D04Z02S16[W]", + "Direction": 1, + "OriginalDoor": "D04Z02S09[NE]" + }, + { + "Id": "D04Z02S16[-Cherubs]", + "Direction": 6, + "OriginalDoor": "D04Z02S08[Cherubs]", + "Logic": "linen" + }, + { + "Id": "D04Z02S17[W]", + "Direction": 1, + "OriginalDoor": "D04Z02S02[SE]" + }, + { + "Id": "D04Z02S19[W]", + "Direction": 1, + "OriginalDoor": "D04Z02S04[NE]" + }, + { + "Id": "D04Z02S19[E]", + "Direction": 2, + "OriginalDoor": "D04Z02S07[W]" + }, + { + "Id": "D04Z02S20[W]", + "Direction": 1, + "OriginalDoor": "D04Z02S08[E]" + }, + { + "Id": "D04Z02S20[Redento]", + "Direction": 4, + "OriginalDoor": "D04BZ02S01[Redento]", + "Logic": "redentoRooms >= 5" + }, + { + "Id": "D04Z02S21[W]", + "Direction": 1, + "OriginalDoor": "D04Z02S22[E]", + "Logic": "D04Z02S21[NE] || D04Z02S21[W] || wallClimb || doubleJump" + }, + { + "Id": "D04Z02S21[SE]", + "Direction": 2, + "OriginalDoor": "D04Z02S11[W]" + }, + { + "Id": "D04Z02S21[NE]", + "Direction": 2, + "OriginalDoor": "D04Z02S12[W]", + "Logic": "D04Z02S21[NE] || wallClimb || doubleJump" + }, + { + "Id": "D04Z02S22[W]", + "Direction": 1, + "OriginalDoor": "D04Z02S15[E]", + "Logic": "D04Z02S22[W] || canBeatMothersBoss" + }, + { + "Id": "D04Z02S22[E]", + "Direction": 2, + "OriginalDoor": "D04Z02S21[W]", + "Logic": "D04Z02S22[E] || canBeatMothersBoss" + }, + { + "Id": "D04Z02S23[W]", + "Direction": 1, + "OriginalDoor": "D04Z02S07[SE]" + }, + { + "Id": "D04Z02S23[SE]", + "Direction": 2, + "OriginalDoor": "D04Z02S24[NW]" + }, + { + "Id": "D04Z02S23[NE]", + "Direction": 2, + "OriginalDoor": "D04Z04S01[W]", + "Type": 1 + }, + { + "Id": "D04Z02S24[NW]", + "Direction": 1, + "OriginalDoor": "D04Z02S23[SE]" + }, + { + "Id": "D04Z02S24[SW]", + "Direction": 1, + "OriginalDoor": "D20Z02S01[E]", + "Type": 1 + }, + { + "Id": "D04Z02S24[SE]", + "Direction": 2, + "OriginalDoor": "D04Z02S25[W]" + }, + { + "Id": "D04Z02S25[W]", + "Direction": 1, + "OriginalDoor": "D04Z02S24[SE]" + }, + { + "Id": "D04BZ02S01[Redento]", + "Direction": 7, + "OriginalDoor": "D04Z02S20[Redento]" + }, + + { + "Id": "D04Z03S01[W]", + "Direction": 1, + "OriginalDoor": "D04Z02S01[E]", + "Type": 1 + }, + { + "Id": "D04Z03S01[E]", + "Direction": 2, + "OriginalDoor": "D04Z02S04[W]", + "Type": 1 + }, + { + "Id": "D04Z03S02[W]", + "Direction": 1, + "OriginalDoor": "D05Z01S22[E]", + "Type": 1 + }, + + { + "Id": "D04Z04S01[W]", + "Direction": 1, + "OriginalDoor": "D04Z02S23[NE]", + "Type": 1 + }, + { + "Id": "D04Z04S01[E]", + "Direction": 2, + "OriginalDoor": "D04Z04S02[W]", + "Type": 9 + }, + { + "Id": "D04Z04S02[W]", + "Direction": 1, + "OriginalDoor": "D04Z04S01[E]", + "Type": 9 + }, + + { + "Id": "D05Z01S01[W]", + "Direction": 1, + "OriginalDoor": "D05Z01S02[E]" + }, + { + "Id": "D05Z01S01[NW]", + "Direction": 1, + "OriginalDoor": "D04Z02S04[SE]", + "Type": 1 + }, + { + "Id": "D05Z01S01[E]", + "Direction": 2, + "OriginalDoor": "D05Z01S16[W]" + }, + { + "Id": "D05Z01S02[W]", + "Direction": 1, + "OriginalDoor": "D05Z01S15[E]", + "VisibilityFlags": 1 + }, + { + "Id": "D05Z01S02[NW]", + "Direction": 1, + "OriginalDoor": "D05Z01S03[E]" + }, + { + "Id": "D05Z01S02[E]", + "Direction": 2, + "OriginalDoor": "D05Z01S01[W]" + }, + { + "Id": "D05Z01S03[W]", + "Direction": 1, + "OriginalDoor": "D05Z01S04[E]" + }, + { + "Id": "D05Z01S03[E]", + "Direction": 2, + "OriginalDoor": "D05Z01S02[NW]" + }, + { + "Id": "D05Z01S03[Frontal]", + "Direction": 4, + "OriginalDoor": "D05BZ01S01[FrontalS]", + "Logic": "woodKey && D05Z01S23[E] && (D05Z01S11[NW] || D05Z01S11[NE])" + }, + { + "Id": "D05Z01S04[W]", + "Direction": 1, + "OriginalDoor": "D05Z01S05[E]" + }, + { + "Id": "D05Z01S04[E]", + "Direction": 2, + "OriginalDoor": "D05Z01S03[W]" + }, + { + "Id": "D05Z01S05[SW]", + "Direction": 1, + "OriginalDoor": "D05Z01S07[E]" + }, + { + "Id": "D05Z01S05[E]", + "Direction": 2, + "OriginalDoor": "D05Z01S04[W]" + }, + { + "Id": "D05Z01S05[NE]", + "Direction": 2, + "OriginalDoor": "D05Z01S17[W]", + "Logic": "D05Z01S05[NE] || blood" + }, + { + "Id": "D05Z01S06[W]", + "Direction": 1, + "OriginalDoor": "D05Z01S24[E]", + "Logic": "D05Z01S06[W] || canSurvivePoison3" + }, + { + "Id": "D05Z01S06[E]", + "Direction": 2, + "OriginalDoor": "D05Z01S20[W]", + "Logic": "D05Z01S06[E] || canSurvivePoison3" + }, + { + "Id": "D05Z01S07[SW]", + "Direction": 1, + "OriginalDoor": "D05Z01S08[NE]" + }, + { + "Id": "D05Z01S07[NW]", + "Direction": 1, + "OriginalDoor": "D05Z01S20[E]", + "Logic": "D05Z01S07[NW] || blood && (canClimbOnRoot || doubleJump) || (canClimbOnRoot && canCrossGap3) || canCrossGap7" + }, + { + "Id": "D05Z01S07[E]", + "Direction": 2, + "OriginalDoor": "D05Z01S05[SW]" + }, + { + "Id": "D05Z01S08[W]", + "Direction": 1, + "OriginalDoor": "D05Z01S10[E]" + }, + { + "Id": "D05Z01S08[NW]", + "Direction": 1, + "OriginalDoor": "D05Z01S12[E]" + }, + { + "Id": "D05Z01S08[E]", + "Direction": 2, + "OriginalDoor": "D05Z01S09[W]" + }, + { + "Id": "D05Z01S08[Health]", + "Direction": 2, + "OriginalDoor": "D05Z01S14[W]" + }, + { + "Id": "D05Z01S08[NE]", + "Direction": 2, + "OriginalDoor": "D05Z01S07[SW]" + }, + { + "Id": "D05Z01S09[W]", + "Direction": 1, + "OriginalDoor": "D05Z01S08[E]" + }, + { + "Id": "D05Z01S09[E]", + "Direction": 2, + "OriginalDoor": "D05Z01S18[W]" + }, + { + "Id": "D05Z01S10[W]", + "Direction": 1, + "OriginalDoor": "D05Z01S11[E]" + }, + { + "Id": "D05Z01S10[NW]", + "Direction": 1, + "OriginalDoor": "D05Z01S11[NE]" + }, + { + "Id": "D05Z01S10[E]", + "Direction": 2, + "OriginalDoor": "D05Z01S08[W]" + }, + { + "Id": "D05Z01S11[SW]", + "Direction": 1, + "OriginalDoor": "D05Z01S19[E]", + "VisibilityFlags": 5, + "Logic": "canBreakTirana" + }, + { + "Id": "D05Z01S11[NW]", + "Direction": 1, + "OriginalDoor": "D05Z01S23[E]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D05Z01S11[NE]" ] + }, + { + "Id": "D05Z01S11[NE]", + "Direction": 2, + "OriginalDoor": "D05Z01S10[NW]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D05Z01S11[NW]" ] + }, + { + "Id": "D05Z01S11[SE]", + "Direction": 2, + "OriginalDoor": "D05Z02S01[W]", + "Type": 1 + }, + { + "Id": "D05Z01S11[E]", + "Direction": 2, + "OriginalDoor": "D05Z01S10[W]" + }, + { + "Id": "D05Z01S12[E]", + "Direction": 2, + "OriginalDoor": "D05Z01S08[NW]" + }, + { + "Id": "D05Z01S13[E]", + "Direction": 2, + "OriginalDoor": "D05Z01S21[NW]" + }, + { + "Id": "D05Z01S14[W]", + "Direction": 1, + "OriginalDoor": "D05Z01S08[Health]" + }, + { + "Id": "D05Z01S15[W]", + "Direction": 1, + "OriginalDoor": "D05Z01S21[NE]" + }, + { + "Id": "D05Z01S15[E]", + "Direction": 2, + "OriginalDoor": "D05Z01S02[W]" + }, + { + "Id": "D05Z01S16[W]", + "Direction": 1, + "OriginalDoor": "D05Z01S01[E]" + }, + { + "Id": "D05Z01S17[W]", + "Direction": 1, + "OriginalDoor": "D05Z01S05[NE]" + }, + { + "Id": "D05Z01S18[W]", + "Direction": 1, + "OriginalDoor": "D05Z01S09[E]" + }, + { + "Id": "D05Z01S19[W]", + "Direction": 1, + "OriginalDoor": "D05Z02S15[E]", + "Type": 1 + }, + { + "Id": "D05Z01S19[E]", + "Direction": 2, + "OriginalDoor": "D05Z01S11[SW]" + }, + { + "Id": "D05Z01S20[W]", + "Direction": 1, + "OriginalDoor": "D05Z01S06[E]" + }, + { + "Id": "D05Z01S20[E]", + "Direction": 2, + "OriginalDoor": "D05Z01S07[NW]" + }, + { + "Id": "D05Z01S20[N]", + "Direction": 0, + "OriginalDoor": "D04Z01S03[S]", + "Type": 1 + }, + { + "Id": "D05Z01S21[SW]", + "Direction": 1, + "OriginalDoor": "D05Z02S14[E]", + "Type": 1 + }, + { + "Id": "D05Z01S21[NW]", + "Direction": 1, + "OriginalDoor": "D05Z01S13[E]" + }, + { + "Id": "D05Z01S21[NE]", + "Direction": 2, + "OriginalDoor": "D05Z01S15[W]" + }, + { + "Id": "D05Z01S21[-Cherubs]", + "Direction": 6, + "OriginalDoor": "D05Z02S11[Cherubs]", + "Type": 1, + "Logic": "linen" + }, + { + "Id": "D05Z01S22[FrontalN]", + "Direction": 4, + "OriginalDoor": "D05BZ01S01[FrontalN]" + }, + { + "Id": "D05Z01S22[E]", + "Direction": 2, + "OriginalDoor": "D04Z03S02[W]", + "Type": 1 + }, + { + "Id": "D05Z01S23[E]", + "Direction": 2, + "OriginalDoor": "D05Z01S11[NW]" + }, + { + "Id": "D05Z01S24[E]", + "Direction": 2, + "OriginalDoor": "D05Z01S06[W]" + }, + { + "Id": "D05BZ01S01[FrontalS]", + "Direction": 7, + "OriginalDoor": "D05Z01S03[Frontal]" + }, + { + "Id": "D05BZ01S01[FrontalN]", + "Direction": 7, + "OriginalDoor": "D05Z01S22[FrontalN]" + }, + + { + "Id": "D05Z02S01[W]", + "Direction": 1, + "OriginalDoor": "D05Z01S11[SE]", + "Type": 1 + }, + { + "Id": "D05Z02S01[E]", + "Direction": 2, + "OriginalDoor": "D05Z02S02[NW]" + }, + { + "Id": "D05Z02S02[SW]", + "Direction": 1, + "OriginalDoor": "D05Z02S03[E]" + }, + { + "Id": "D05Z02S02[NW]", + "Direction": 1, + "OriginalDoor": "D05Z02S01[E]" + }, + { + "Id": "D05Z02S02[SE]", + "Direction": 2, + "OriginalDoor": "D05Z02S09[W]" + }, + { + "Id": "D05Z02S02[NE]", + "Direction": 2, + "OriginalDoor": "D05Z02S05[W]" + }, + { + "Id": "D05Z02S03[W]", + "Direction": 1, + "OriginalDoor": "D05Z02S04[E]" + }, + { + "Id": "D05Z02S03[E]", + "Direction": 2, + "OriginalDoor": "D05Z02S02[SW]" + }, + { + "Id": "D05Z02S04[W]", + "Direction": 1, + "OriginalDoor": "D05Z02S12[E]" + }, + { + "Id": "D05Z02S04[E]", + "Direction": 2, + "OriginalDoor": "D05Z02S03[W]" + }, + { + "Id": "D05Z02S04[C]", + "Direction": 4, + "OriginalDoor": "D05BZ02S01[C]" + }, + { + "Id": "D05Z02S05[W]", + "Direction": 1, + "OriginalDoor": "D05Z02S02[NE]" + }, + { + "Id": "D05Z02S05[E]", + "Direction": 2, + "OriginalDoor": "D05Z02S06[SW]" + }, + { + "Id": "D05Z02S06[SW]", + "Direction": 1, + "OriginalDoor": "D05Z02S05[E]" + }, + { + "Id": "D05Z02S06[NW]", + "Direction": 1, + "OriginalDoor": "D05Z02S07[E]" + }, + { + "Id": "D05Z02S06[SE]", + "Direction": 2, + "OriginalDoor": "D05Z02S11[W]", + "Logic": "openedTSCGate" + }, + { + "Id": "D05Z02S06[NE]", + "Direction": 2, + "OriginalDoor": "D05Z02S14[W]" + }, + { + "Id": "D05Z02S07[W]", + "Direction": 1, + "OriginalDoor": "D05Z02S10[E]" + }, + { + "Id": "D05Z02S07[E]", + "Direction": 2, + "OriginalDoor": "D05Z02S06[NW]" + }, + { + "Id": "D05Z02S08[W]", + "Direction": 1, + "OriginalDoor": "D05Z02S09[E]" + }, + { + "Id": "D05Z02S09[W]", + "Direction": 1, + "OriginalDoor": "D05Z02S02[SE]" + }, + { + "Id": "D05Z02S09[E]", + "Direction": 2, + "OriginalDoor": "D05Z02S08[W]", + "Logic": "redWax >= 3 && blueWax >= 3" + }, + { + "Id": "D05Z02S10[W]", + "Direction": 1, + "OriginalDoor": "D05Z02S13[E]", + "Logic": "dash" + }, + { + "Id": "D05Z02S10[E]", + "Direction": 2, + "OriginalDoor": "D05Z02S07[W]" + }, + { + "Id": "D05Z02S11[W]", + "Direction": 1, + "OriginalDoor": "D05Z02S06[SE]" + }, + { + "Id": "D05Z02S11[Cherubs]", + "Direction": 5, + "Type": 1 + }, + { + "Id": "D05Z02S12[W]", + "Direction": 1, + "OriginalDoor": "D01Z04S16[E]", + "Type": 1 + }, + { + "Id": "D05Z02S12[E]", + "Direction": 2, + "OriginalDoor": "D05Z02S04[W]" + }, + { + "Id": "D05Z02S12[N]", + "Direction": 0, + "OriginalDoor": "D05Z02S15[S]" + }, + { + "Id": "D05Z02S13[E]", + "Direction": 2, + "OriginalDoor": "D05Z02S10[W]", + "Logic": "dash" + }, + { + "Id": "D05Z02S14[W]", + "Direction": 1, + "OriginalDoor": "D05Z02S06[NE]", + "Logic": "D05Z02S14[W] || canBeatCanvasesBoss" + }, + { + "Id": "D05Z02S14[E]", + "Direction": 2, + "OriginalDoor": "D05Z01S21[SW]", + "Type": 1, + "Logic": "D05Z02S14[E] || canBeatCanvasesBoss" + }, + { + "Id": "D05Z02S15[S]", + "Direction": 3, + "OriginalDoor": "D05Z02S12[N]" + }, + { + "Id": "D05Z02S15[E]", + "Direction": 2, + "OriginalDoor": "D05Z01S19[W]", + "Type": 1 + }, + { + "Id": "D05BZ02S01[C]", + "Direction": 7, + "OriginalDoor": "D05Z02S04[C]" + }, + + { + "Id": "D06Z01S01[SW]", + "Direction": 1, + "OriginalDoor": "D06Z01S14[E]", + "Logic": "(D06Z01S01[SW] || D06Z01S01[SE] || D06Z01S01[W] || D06Z01S01[E] || D06Z01S01[NNW] || D06Z01S01[NNE] || D06Z01S01[N]) || linen && (D06Z01S01[NW] || D06Z01S01[NE])" + }, + { + "Id": "D06Z01S01[SE]", + "Direction": 2, + "OriginalDoor": "D06Z01S03[W]", + "Logic": "(D06Z01S01[SW] || D06Z01S01[SE] || D06Z01S01[W] || D06Z01S01[E] || D06Z01S01[NNW] || D06Z01S01[NNE] || D06Z01S01[N]) || linen && (D06Z01S01[NW] || D06Z01S01[NE])" + }, + { + "Id": "D06Z01S01[W]", + "Direction": 1, + "OriginalDoor": "D06Z01S07[E]", + "Logic": "(D06Z01S01[W] || D06Z01S01[E] || D06Z01S01[NNW] || D06Z01S01[NNE] || D06Z01S01[N]) || masks >= 1 && (D06Z01S01[SW] || D06Z01S01[SE]) || linen && (D06Z01S01[NW] || D06Z01S01[NE] && (canWalkOnRoot || canCrossGap1))" + }, + { + "Id": "D06Z01S01[E]", + "Direction": 2, + "OriginalDoor": "D06Z01S06[WW]", + "Logic": "(D06Z01S01[W] || D06Z01S01[E] || D06Z01S01[NNW] || D06Z01S01[NNE] || D06Z01S01[N]) || masks >= 1 && (D06Z01S01[SW] || D06Z01S01[SE]) || linen && (D06Z01S01[NE] || D06Z01S01[NW] && (canWalkOnRoot || canCrossGap1))" + }, + { + "Id": "D06Z01S01[NW]", + "Direction": 1, + "OriginalDoor": "D06Z01S16[E]", + "Logic": "D06Z01S01[NW] || D06Z01S01[NE] && (canWalkOnRoot || canCrossGap8) || linen && (D06Z01S01[NNW] || D06Z01S01[NNE] && (canWalkOnRoot || canCrossGap3))" + }, + { + "Id": "D06Z01S01[NE]", + "Direction": 2, + "OriginalDoor": "D06Z01S17[W]", + "Logic": "D06Z01S01[NE] || D06Z01S01[NW] && (canWalkOnRoot || canCrossGap8) || linen && (D06Z01S01[NNE] || D06Z01S01[NNW] && (canWalkOnRoot || canCrossGap3))" + }, + { + "Id": "D06Z01S01[NNW]", + "Direction": 1, + "OriginalDoor": "D06Z01S09[E]", + "Logic": "(D06Z01S01[NNW] || D06Z01S01[NNE] || D06Z01S01[N]) || masks >= 2 && (D06Z01S01[SW] || D06Z01S01[SE] || D06Z01S01[W] || D06Z01S01[E] || linen && (D06Z01S01[NW] || D06Z01S01[NE]))" + }, + { + "Id": "D06Z01S01[NNE]", + "Direction": 2, + "OriginalDoor": "D06Z01S10[W]", + "Logic": "(D06Z01S01[NNW] || D06Z01S01[NNE] || D06Z01S01[N]) || masks >= 2 && (D06Z01S01[SW] || D06Z01S01[SE] || D06Z01S01[W] || D06Z01S01[E] || linen && (D06Z01S01[NW] || D06Z01S01[NE]))" + }, + { + "Id": "D06Z01S01[N]", + "Direction": 0, + "OriginalDoor": "D06Z01S19[S]", + "Logic": "masks >= 3 && (D06Z01S01[SW] || D06Z01S01[SE] || D06Z01S01[W] || D06Z01S01[E] || D06Z01S01[NNW] || D06Z01S01[NNE] || D06Z01S01[N] || linen && (D06Z01S01[NW] || D06Z01S01[NE]))", + "Type": 9 + }, + { + "Id": "D06Z01S01[-Cherubs]", + "Direction": 6, + "OriginalDoor": "D06Z01S23[Cherubs]", + "Logic": "linen && (D06Z01S01[SW] || D06Z01S01[SE] || D06Z01S01[W] || D06Z01S01[E] || D06Z01S01[NW] || D06Z01S01[NE] || D06Z01S01[NNW] || D06Z01S01[NNE])" + }, + { + "Id": "D06Z01S02[W]", + "Direction": 1, + "OriginalDoor": "D06Z01S18[E]" + }, + { + "Id": "D06Z01S02[E]", + "Direction": 2, + "OriginalDoor": "D06Z01S08[W]" + }, + { + "Id": "D06Z01S02[S]", + "Direction": 3, + "OriginalDoor": "D04Z02S02[N]", + "Type": 1 + }, + { + "Id": "D06Z01S03[W]", + "Direction": 1, + "OriginalDoor": "D06Z01S01[SE]", + "Logic": "D06Z01S03[W] || canBeatLegionary" + }, + { + "Id": "D06Z01S03[E]", + "Direction": 2, + "OriginalDoor": "D06Z01S04[W]", + "Logic": "D06Z01S03[E] || canBeatLegionary" + }, + { + "Id": "D06Z01S04[SW]", + "Direction": 1, + "OriginalDoor": "D06Z01S20[E]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D06Z01S04[W]", "D06Z01S04[Health]" ] + }, + { + "Id": "D06Z01S04[W]", + "Direction": 1, + "OriginalDoor": "D06Z01S03[E]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D06Z01S04[SW]", "D06Z01S04[Health]" ] + }, + { + "Id": "D06Z01S04[Health]", + "Direction": 2, + "OriginalDoor": "D06Z01S24[W]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D06Z01S04[SW]", "D06Z01S04[W]" ], + "Logic": "D06Z01S04[Health] || (wallClimb && canSurvivePoison2 && (doubleJump || blood && canClimbOnRoot))" + }, + { + "Id": "D06Z01S04[NW]", + "Direction": 1, + "OriginalDoor": "D06Z01S06[E]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D06Z01S04[NE]", "D06Z01S04[Cherubs]" ], + "Logic": "D06Z01S04[NW] || D06Z01S04[Cherubs] || (D06Z01S04[SW] || D06Z01S04[W] || D06Z01S04[Health]) && wallClimb && canSurvivePoison2 && (dash || doubleJump && (canDawnJump || canClimbOnRoot))" + }, + { + "Id": "D06Z01S04[NE]", + "Direction": 2, + "OriginalDoor": "D06Z01S06[W]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D06Z01S04[NW]", "D06Z01S04[Cherubs]" ], + "Logic": "D06Z01S04[NE] || (D06Z01S04[SW] || D06Z01S04[W] || D06Z01S04[Health]) && wallClimb && canSurvivePoison2 && (dash || doubleJump && (canDawnJump || canClimbOnRoot))" + }, + { + "Id": "D06Z01S04[Cherubs]", + "Direction": 5 + }, + { + "Id": "D06Z01S05[E]", + "Direction": 2, + "OriginalDoor": "D06Z01S12[NW]" + }, + { + "Id": "D06Z01S06[WW]", + "Direction": 1, + "OriginalDoor": "D06Z01S01[E]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D06Z01S06[E]" ], + "Logic": "D06Z01S06[WW] || canBeatLegionary" + }, + { + "Id": "D06Z01S06[E]", + "Direction": 2, + "OriginalDoor": "D06Z01S04[NW]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D06Z01S06[WW]" ], + "Logic": "D06Z01S06[E] || canBeatLegionary" + }, + { + "Id": "D06Z01S06[W]", + "Direction": 1, + "OriginalDoor": "D06Z01S04[NE]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D06Z01S06[EE]" ] + }, + { + "Id": "D06Z01S06[EE]", + "Direction": 2, + "OriginalDoor": "D06Z01S15[SW]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D06Z01S06[W]" ] + }, + { + "Id": "D06Z01S07[W]", + "Direction": 1, + "OriginalDoor": "D06Z01S12[E]" + }, + { + "Id": "D06Z01S07[E]", + "Direction": 2, + "OriginalDoor": "D06Z01S01[W]" + }, + { + "Id": "D06Z01S07[CherubsL]", + "Direction": 5 + }, + { + "Id": "D06Z01S07[CherubsR]", + "Direction": 5 + }, + { + "Id": "D06Z01S08[W]", + "Direction": 1, + "OriginalDoor": "D06Z01S02[E]" + }, + { + "Id": "D06Z01S08[E]", + "Direction": 2, + "OriginalDoor": "D06Z01S14[W]", + "Logic": "D06Z01S08[N] || D06Z01S08[E] || wallClimb" + }, + { + "Id": "D06Z01S08[N]", + "Direction": 0, + "OriginalDoor": "D06Z01S13[S]", + "VisibilityFlags": 1 + }, + { + "Id": "D06Z01S09[W]", + "Direction": 1, + "OriginalDoor": "D06Z01S12[NE]" + }, + { + "Id": "D06Z01S09[E]", + "Direction": 2, + "OriginalDoor": "D06Z01S01[NNW]" + }, + { + "Id": "D06Z01S09[-CherubsL]", + "Direction": 6, + "OriginalDoor": "D06Z01S16[CherubsL]", + "Logic": "linen" + }, + { + "Id": "D06Z01S09[-CherubsR]", + "Direction": 6, + "OriginalDoor": "D06Z01S16[CherubsR]", + "Logic": "linen" + }, + { + "Id": "D06Z01S10[W]", + "Direction": 1, + "OriginalDoor": "D06Z01S01[NNE]" + }, + { + "Id": "D06Z01S10[E]", + "Direction": 2, + "OriginalDoor": "D06Z01S21[W]" + }, + { + "Id": "D06Z01S10[-CherubsL]", + "Direction": 6, + "OriginalDoor": "D06Z01S17[CherubsL]", + "Logic": "linen" + }, + { + "Id": "D06Z01S10[-CherubsR]", + "Direction": 6, + "OriginalDoor": "D06Z01S17[CherubsR]", + "Logic": "linen" + }, + { + "Id": "D06Z01S11[W]", + "Direction": 1, + "OriginalDoor": "D06Z01S15[NE]" + }, + { + "Id": "D06Z01S12[S]", + "Direction": 3, + "OriginalDoor": "D06Z01S14[N]" + }, + { + "Id": "D06Z01S12[W]", + "Direction": 1, + "OriginalDoor": "D06Z01S13[E]", + "Logic": "D06Z01S12[NW] || D06Z01S12[NE] || D06Z01S12[NE2] || D06Z01S12[W] || D06Z01S12[E] || wallClimb && doubleJump" + }, + { + "Id": "D06Z01S12[E]", + "Direction": 2, + "OriginalDoor": "D06Z01S07[W]", + "Logic": "D06Z01S12[NW] || D06Z01S12[NE] || D06Z01S12[NE2] || D06Z01S12[W] || D06Z01S12[E] || wallClimb && doubleJump" + }, + { + "Id": "D06Z01S12[NW]", + "Direction": 1, + "OriginalDoor": "D06Z01S05[E]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D06Z01S12[NE]", "D06Z01S12[NE2]" ], + "Logic": "D06Z01S12[NW] || D06Z01S12[NE] || wallClimb || doubleJump" + }, + { + "Id": "D06Z01S12[NE]", + "Direction": 2, + "OriginalDoor": "D06Z01S09[W]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D06Z01S12[NW]", "D06Z01S12[NE2]" ], + "Logic": "D06Z01S12[NW] || D06Z01S12[NE] || wallClimb || doubleJump" + }, + { + "Id": "D06Z01S12[NE2]", + "Direction": 2, + "OriginalDoor": "D06Z01S16[W]", + "VisibilityFlags": 1 + }, + { + "Id": "D06Z01S13[W]", + "Direction": 1, + "OriginalDoor": "D09Z01S01[E]", + "Type": 1 + }, + { + "Id": "D06Z01S13[E]", + "Direction": 2, + "OriginalDoor": "D06Z01S12[W]" + }, + { + "Id": "D06Z01S13[S]", + "Direction": 3, + "OriginalDoor": "D06Z01S08[N]" + }, + { + "Id": "D06Z01S14[W]", + "Direction": 1, + "OriginalDoor": "D06Z01S08[E]" + }, + { + "Id": "D06Z01S14[E]", + "Direction": 2, + "OriginalDoor": "D06Z01S01[SW]" + }, + { + "Id": "D06Z01S14[N]", + "Direction": 0, + "OriginalDoor": "D06Z01S12[S]" + }, + { + "Id": "D06Z01S15[SW]", + "Direction": 1, + "OriginalDoor": "D06Z01S06[EE]", + "VisibilityFlags": 1 + }, + { + "Id": "D06Z01S15[NW]", + "Direction": 1, + "OriginalDoor": "D06Z01S21[E]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D06Z01S15[NE]" ], + "Logic": "D06Z01S15[NW] || D06Z01S15[SW] && wallClimb" + }, + { + "Id": "D06Z01S15[NE]", + "Direction": 2, + "OriginalDoor": "D06Z01S11[W]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D06Z01S15[NW]" ], + "Logic": "D06Z01S15[NE] || D06Z01S15[SW] && wallClimb" + }, + { + "Id": "D06Z01S16[W]", + "Direction": 1, + "OriginalDoor": "D06Z01S12[NE2]", + "Logic": "D06Z01S16[W] || (D06Z01S16[CherubsL] && (doubleJump || wallClimb && (canWalkOnRoot || canAirStall))) || (D06Z01S16[CherubsR] && (doubleJump || canAirStall && (canWalkOnRoot || wheel) && (wallClimb || canDawnJump))) || (D06Z01S16[E] && (canWalkOnRoot || canCrossGap7) && (wallClimb || canCrossGap5))" + }, + { + "Id": "D06Z01S16[E]", + "Direction": 2, + "OriginalDoor": "D06Z01S01[NW]", + "Logic": "D06Z01S16[E] || ((D06Z01S16[W] || D06Z01S16[CherubsL]) && (canWalkOnRoot || canCrossGap5)) || (D06Z01S16[CherubsR] && (doubleJump || canAirStall && (canWalkOnRoot || wheel)))" + }, + { + "Id": "D06Z01S16[-CherubsL]", + "Direction": 6, + "OriginalDoor": "D06Z01S07[CherubsL]", + "Logic": "linen && (D06Z01S16[W] || D06Z01S16[CherubsL] || (D06Z01S16[CherubsR] && (doubleJump || canAirStall && (canWalkOnRoot || wheel))) || (D06Z01S16[E] && (canWalkOnRoot || canCrossGap7)))" + }, + { + "Id": "D06Z01S16[-CherubsR]", + "Direction": 6, + "OriginalDoor": "D06Z01S07[CherubsR]", + "Logic": "linen && (D06Z01S16[E] || D06Z01S16[CherubsR] || (D06Z01S16[CherubsL] && (canAirStall || canWalkOnRoot || doubleJump)) || (D06Z01S16[W] && (canWalkOnRoot || canCrossGap1)))" + }, + { + "Id": "D06Z01S16[CherubsL]", + "Direction": 5 + }, + { + "Id": "D06Z01S16[CherubsR]", + "Direction": 5 + }, + { + "Id": "D06Z01S17[W]", + "Direction": 1, + "OriginalDoor": "D06Z01S01[NE]", + "Logic": "D06Z01S17[W] || (D06Z01S17[E] || D06Z01S17[CherubsR]) && blood || D06Z01S17[CherubsL] && doubleJump" + }, + { + "Id": "D06Z01S17[E]", + "Direction": 2, + "OriginalDoor": "D06Z01S26[W]", + "Logic": "D06Z01S17[E] || D06Z01S17[CherubsR] || blood && (D06Z01S17[W] || D06Z01S17[CherubsL] && doubleJump)" + }, + { + "Id": "D06Z01S17[-Cherubs]", + "Direction": 6, + "OriginalDoor": "D06Z01S04[Cherubs]", + "Logic": "linen" + }, + { + "Id": "D06Z01S17[CherubsL]", + "Direction": 5 + }, + { + "Id": "D06Z01S17[CherubsR]", + "Direction": 5 + }, + { + "Id": "D06Z01S18[E]", + "Direction": 2, + "OriginalDoor": "D06Z01S02[W]" + }, + { + "Id": "D06Z01S18[-Cherubs]", + "Direction": 6, + "OriginalDoor": "D04Z01S04[Cherubs]", + "Type": 1, + "Logic": "linen" + }, + { + "Id": "D06Z01S19[S]", + "Direction": 3, + "OriginalDoor": "D06Z01S01[N]", + "Type": 9 + }, + { + "Id": "D06Z01S19[E]", + "Direction": 2, + "OriginalDoor": "D06Z01S25[W]", + "Type": 9 + }, + { + "Id": "D06Z01S20[W]", + "Direction": 1, + "OriginalDoor": "D06Z01S23[E]" + }, + { + "Id": "D06Z01S20[E]", + "Direction": 2, + "OriginalDoor": "D06Z01S04[SW]" + }, + { + "Id": "D06Z01S21[W]", + "Direction": 1, + "OriginalDoor": "D06Z01S10[E]", + "Logic": "D06Z01S21[W] || canBeatLegionary" + }, + { + "Id": "D06Z01S21[E]", + "Direction": 2, + "OriginalDoor": "D06Z01S15[NW]", + "Logic": "D06Z01S21[E] || canBeatLegionary" + }, + { + "Id": "D06Z01S22[Sword]", + "Direction": 2, + "OriginalDoor": "D06Z01S23[Sword]" + }, + { + "Id": "D06Z01S23[Sword]", + "Direction": 1, + "OriginalDoor": "D06Z01S22[Sword]" + }, + { + "Id": "D06Z01S23[E]", + "Direction": 2, + "OriginalDoor": "D06Z01S20[W]" + }, + { + "Id": "D06Z01S23[S]", + "Direction": 3, + "OriginalDoor": "D04Z02S06[N]", + "Type": 1 + }, + { + "Id": "D06Z01S23[Cherubs]", + "Direction": 5 + }, + { + "Id": "D06Z01S24[W]", + "Direction": 1, + "OriginalDoor": "D06Z01S04[Health]" + }, + { + "Id": "D06Z01S25[W]", + "Direction": 1, + "OriginalDoor": "D06Z01S19[E]", + "Logic": "D06Z01S25[W] || canBeatRooftopsBoss", + "Type": 9 + }, + { + "Id": "D06Z01S25[E]", + "Direction": 2, + "OriginalDoor": "D07Z01S01[W]", + "Logic": "D06Z01S25[E] || canBeatRooftopsBoss", + "Type": 9 + }, + { + "Id": "D06Z01S26[W]", + "Direction": 1, + "OriginalDoor": "D06Z01S17[E]" + }, + + { + "Id": "D07Z01S01[W]", + "Direction": 1, + "OriginalDoor": "D06Z01S25[E]", + "Type": 9 + }, + { + "Id": "D07Z01S01[E]", + "Direction": 2, + "OriginalDoor": "D07Z01S02[W]", + "Type": 9 + }, + { + "Id": "D07Z01S02[W]", + "Direction": 1, + "OriginalDoor": "D07Z01S01[E]", + "Type": 9 + }, + { + "Id": "D07Z01S02[E]", + "Direction": 2, + "OriginalDoor": "D07Z01S03[W]", + "Type": 9 + }, + { + "Id": "D07Z01S03[W]", + "Direction": 1, + "OriginalDoor": "D07Z01S02[E]", + "Type": 9 + }, + + { + "Id": "D08Z01S01[W]", + "Direction": 1, + "OriginalDoor": "D01Z03S06[E]", + "Type": 1, + "Logic": "D08Z01S01[W] || canBeatBridgeBoss" + }, + { + "Id": "D08Z01S01[E]", + "Direction": 2, + "OriginalDoor": "D08Z02S01[W]", + "Type": 1, + "Logic": "holyWounds >= 3 && (D08Z01S01[E] || D08Z01S01[Cherubs] || canBeatBridgeBoss)" + }, + { + "Id": "D08Z01S01[Cherubs]", + "Direction": 5 + }, + { + "Id": "D08Z01S02[NE]", + "Direction": 2, + "OriginalDoor": "D08Z03S03[W]", + "Type": 1, + "VisibilityFlags": 1 + }, + { + "Id": "D08Z01S02[SE]", + "Direction": 2, + "OriginalDoor": "D08Z02S03[W]", + "Type": 1 + }, + { + "Id": "D08Z01S02[-Cherubs]", + "Direction": 6, + "OriginalDoor": "D08Z01S01[Cherubs]", + "Logic": "linen" + }, + + { + "Id": "D08Z02S01[W]", + "Direction": 1, + "OriginalDoor": "D08Z01S01[E]", + "Type": 1 + }, + { + "Id": "D08Z02S01[SE]", + "Direction": 2, + "OriginalDoor": "D08Z02S02[W]" + }, + { + "Id": "D08Z02S01[E]", + "Direction": 2, + "OriginalDoor": "D04Z01S01[W]", + "Type": 1 + }, + { + "Id": "D08Z02S01[N]", + "Direction": 0, + "OriginalDoor": "D08Z02S03[S]" + }, + { + "Id": "D08Z02S02[W]", + "Direction": 1, + "OriginalDoor": "D08Z02S01[SE]" + }, + { + "Id": "D08Z02S03[W]", + "Direction": 1, + "OriginalDoor": "D08Z01S02[SE]", + "Type": 1, + "Logic": "brokeBotTCStatue" + }, + { + "Id": "D08Z02S03[E]", + "Direction": 2, + "OriginalDoor": "D08Z03S01[W]", + "Type": 1 + }, + { + "Id": "D08Z02S03[S]", + "Direction": 3, + "OriginalDoor": "D08Z02S01[N]" + }, + + { + "Id": "D08Z03S01[W]", + "Direction": 1, + "OriginalDoor": "D08Z02S03[E]", + "Type": 1 + }, + { + "Id": "D08Z03S01[E]", + "Direction": 2, + "OriginalDoor": "D08Z03S02[SW]", + "Logic": "verses >= 4" + }, + { + "Id": "D08Z03S02[SW]", + "Direction": 1, + "OriginalDoor": "D08Z03S01[E]" + }, + { + "Id": "D08Z03S02[NW]", + "Direction": 1, + "OriginalDoor": "D08Z03S03[E]", + "Logic": "D08Z03S02[NW] || wallClimb" + }, + { + "Id": "D08Z03S03[W]", + "Direction": 1, + "OriginalDoor": "D08Z01S02[NE]", + "Type": 1, + "Logic": "D08Z03S03[W] || canBeatHallBoss" + }, + { + "Id": "D08Z03S03[E]", + "Direction": 2, + "OriginalDoor": "D08Z03S02[NW]", + "Logic": "D08Z03S03[E] || canBeatHallBoss" + }, + + { + "Id": "D09Z01S01[W]", + "Direction": 1, + "OriginalDoor": "D09Z01S11[E]" + }, + { + "Id": "D09Z01S01[E]", + "Direction": 2, + "OriginalDoor": "D06Z01S13[W]", + "Type": 1 + }, + { + "Id": "D09Z01S02[SW]", + "Direction": 1, + "OriginalDoor": "D09Z01S07[E]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D09Z01S02[Cell2]" ] + }, + { + "Id": "D09Z01S02[NW]", + "Direction": 1, + "OriginalDoor": "D09Z01S07[NE]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D09Z01S02[NW]", "D09Z01S02[N]", "D09Z01S02[Cell1]", "D09Z01S02[Cell6]", "D09Z01S02[Cell4]", "D09Z01S02[Cell3]", "D09Z01S02[Cell22]", "D09Z01S02[Cell23]" ] + }, + { + "Id": "D09Z01S02[N]", + "Direction": 0, + "OriginalDoor": "D09Z01S11[S]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D09Z01S02[NW]", "D09Z01S02[N]", "D09Z01S02[Cell1]", "D09Z01S02[Cell6]", "D09Z01S02[Cell4]", "D09Z01S02[Cell3]", "D09Z01S02[Cell22]", "D09Z01S02[Cell23]" ] + }, + { + "Id": "D09Z01S02[Cell1]", + "Direction": 4, + "OriginalDoor": "D09BZ01S01[Cell1]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D09Z01S02[NW]", "D09Z01S02[N]", "D09Z01S02[Cell1]", "D09Z01S02[Cell6]", "D09Z01S02[Cell4]", "D09Z01S02[Cell3]", "D09Z01S02[Cell22]", "D09Z01S02[Cell23]" ], + "Logic": "bronzeKey" + }, + { + "Id": "D09Z01S02[Cell6]", + "Direction": 4, + "OriginalDoor": "D09BZ01S01[Cell6]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D09Z01S02[NW]", "D09Z01S02[N]", "D09Z01S02[Cell1]", "D09Z01S02[Cell6]", "D09Z01S02[Cell4]", "D09Z01S02[Cell3]", "D09Z01S02[Cell22]", "D09Z01S02[Cell23]" ], + "Logic": "silverKey" + }, + { + "Id": "D09Z01S02[Cell5]", + "Direction": 4, + "OriginalDoor": "D09BZ01S01[Cell5]", + "VisibilityFlags": 1 + }, + { + "Id": "D09Z01S02[Cell4]", + "Direction": 4, + "OriginalDoor": "D09BZ01S01[Cell4]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D09Z01S02[NW]", "D09Z01S02[N]", "D09Z01S02[Cell1]", "D09Z01S02[Cell6]", "D09Z01S02[Cell4]", "D09Z01S02[Cell3]", "D09Z01S02[Cell22]", "D09Z01S02[Cell23]" ], + "Logic": "goldKey" + }, + { + "Id": "D09Z01S02[Cell2]", + "Direction": 4, + "OriginalDoor": "D09BZ01S01[Cell2]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D09Z01S02[SW]" ] + }, + { + "Id": "D09Z01S02[Cell3]", + "Direction": 4, + "OriginalDoor": "D09BZ01S01[Cell3]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D09Z01S02[NW]", "D09Z01S02[N]", "D09Z01S02[Cell1]", "D09Z01S02[Cell6]", "D09Z01S02[Cell4]", "D09Z01S02[Cell3]", "D09Z01S02[Cell22]", "D09Z01S02[Cell23]" ], + "Logic": "bronzeKey" + }, + { + "Id": "D09Z01S02[Cell22]", + "Direction": 4, + "OriginalDoor": "D09BZ01S01[Cell22]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D09Z01S02[NW]", "D09Z01S02[N]", "D09Z01S02[Cell1]", "D09Z01S02[Cell6]", "D09Z01S02[Cell4]", "D09Z01S02[Cell3]", "D09Z01S02[Cell22]", "D09Z01S02[Cell23]" ] + }, + { + "Id": "D09Z01S02[Cell23]", + "Direction": 4, + "OriginalDoor": "D09BZ01S01[Cell23]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D09Z01S02[NW]", "D09Z01S02[N]", "D09Z01S02[Cell1]", "D09Z01S02[Cell6]", "D09Z01S02[Cell4]", "D09Z01S02[Cell3]", "D09Z01S02[Cell22]", "D09Z01S02[Cell23]" ], + "Logic": "bronzeKey" + }, + { + "Id": "D09Z01S03[W]", + "Direction": 1, + "OriginalDoor": "D09Z01S05[SE]", + "Logic": "D09Z01S03[N] && canBeatPrisonBoss" + }, + { + "Id": "D09Z01S03[N]", + "Direction": 5 + }, + { + "Id": "D09Z01S04[W]", + "Direction": 1, + "OriginalDoor": "D09Z01S06[E]" + }, + { + "Id": "D09Z01S04[E]", + "Direction": 2, + "OriginalDoor": "D09Z01S11[W]" + }, + { + "Id": "D09Z01S04[S]", + "Direction": 3, + "OriginalDoor": "D09Z01S07[N]" + }, + { + "Id": "D09Z01S05[W]", + "Direction": 1, + "OriginalDoor": "D09Z01S13[E]" + }, + { + "Id": "D09Z01S05[SE]", + "Direction": 2, + "OriginalDoor": "D09Z01S03[W]" + }, + { + "Id": "D09Z01S05[NE]", + "Direction": 2, + "OriginalDoor": "D09Z01S08[W]" + }, + { + "Id": "D09Z01S06[-E]", + "Direction": 1, + "OriginalDoor": "D02Z03S10[-W]", + "Type": 1, + "Logic": "peaksKey" + }, + { + "Id": "D09Z01S06[E]", + "Direction": 2, + "OriginalDoor": "D09Z01S04[W]" + }, + { + "Id": "D09Z01S07[SW]", + "Direction": 1, + "OriginalDoor": "D09Z01S09[E]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D09Z01S07[SW]", "D09Z01S07[SE]", "D09Z01S07[W]", "D09Z01S07[E]" ] + }, + { + "Id": "D09Z01S07[SE]", + "Direction": 2, + "OriginalDoor": "D09Z01S10[W]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D09Z01S07[SW]", "D09Z01S07[SE]", "D09Z01S07[W]", "D09Z01S07[E]" ] + }, + { + "Id": "D09Z01S07[W]", + "Direction": 1, + "OriginalDoor": "D09Z01S08[SE]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D09Z01S07[SW]", "D09Z01S07[SE]", "D09Z01S07[W]", "D09Z01S07[E]" ] + }, + { + "Id": "D09Z01S07[E]", + "Direction": 2, + "OriginalDoor": "D09Z01S02[SW]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D09Z01S07[SW]", "D09Z01S07[SE]", "D09Z01S07[W]", "D09Z01S07[E]" ] + }, + { + "Id": "D09Z01S07[NW]", + "Direction": 1, + "OriginalDoor": "D09Z01S08[NE]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D09Z01S07[N]" ] + }, + { + "Id": "D09Z01S07[N]", + "Direction": 0, + "OriginalDoor": "D09Z01S04[S]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D09Z01S07[NW]" ] + }, + { + "Id": "D09Z01S07[NE]", + "Direction": 2, + "OriginalDoor": "D09Z01S02[NW]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D09Z01S07[SW]", "D09Z01S07[SE]", "D09Z01S07[W]", "D09Z01S07[E]" ], + "Logic": "D09Z01S07[NE] || blood" + }, + { + "Id": "D09Z01S08[W]", + "Direction": 1, + "OriginalDoor": "D09Z01S05[NE]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D09Z01S08[Cell14]" ], + "Logic": "openedWotHPGate" + }, + { + "Id": "D09Z01S08[S]", + "Direction": 6, + "OriginalDoor": "D09Z01S03[N]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D09Z01S08[W]", "D09Z01S08[Cell14]" ] + }, + { + "Id": "D09Z01S08[SE]", + "Direction": 2, + "OriginalDoor": "D09Z01S07[W]", + "Logic": "D09Z01S08[SE] || D09Z01S08[Cell15] || D09Z01S08[Cell16] || D09Z01S08[Cell18] || D09Z01S08[Cell17] && dash" + }, + { + "Id": "D09Z01S08[NE]", + "Direction": 2, + "OriginalDoor": "D09Z01S07[NW]", + "Logic": "D09Z01S08[NE] || D09Z01S08[Cell7] || D09Z01S08[Cell17] && dash" + }, + { + "Id": "D09Z01S08[Cell14]", + "Direction": 4, + "OriginalDoor": "D09BZ01S01[Cell14]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D09Z01S08[W]" ] + }, + { + "Id": "D09Z01S08[Cell15]", + "Direction": 4, + "OriginalDoor": "D09BZ01S01[Cell15]", + "Logic": "silverKey && (D09Z01S08[SE] || D09Z01S08[Cell15] || D09Z01S08[Cell16] || D09Z01S08[Cell18] || D09Z01S08[Cell17] && dash)" + }, + { + "Id": "D09Z01S08[Cell7]", + "Direction": 4, + "OriginalDoor": "D09BZ01S01[Cell7]", + "Logic": "goldKey && (D09Z01S08[NE] || D09Z01S08[Cell7] || D09Z01S08[Cell17] && dash)" + }, + { + "Id": "D09Z01S08[Cell16]", + "Direction": 4, + "OriginalDoor": "D09BZ01S01[Cell16]", + "Logic": "goldKey && (D09Z01S08[SE] || D09Z01S08[Cell15] || D09Z01S08[Cell16] || D09Z01S08[Cell18] || D09Z01S08[Cell17] && dash)" + }, + { + "Id": "D09Z01S08[Cell18]", + "Direction": 4, + "OriginalDoor": "D09BZ01S01[Cell18]", + "Logic": "silverKey && (D09Z01S08[SE] || D09Z01S08[Cell15] || D09Z01S08[Cell16] || D09Z01S08[Cell18] || D09Z01S08[Cell17] && dash)" + }, + { + "Id": "D09Z01S08[Cell17]", + "Direction": 4, + "OriginalDoor": "D09BZ01S01[Cell17]", + "VisibilityFlags": 1 + }, + { + "Id": "D09Z01S09[SW]", + "Direction": 1, + "OriginalDoor": "D04Z01S06[E]", + "Type": 1, + "Logic": "D09Z01S09[Cell21] || D09Z01S09[Cell20] || D09Z01S09[SW] || D09Z01S09[E] || dash" + }, + { + "Id": "D09Z01S09[NW]", + "Direction": 1, + "OriginalDoor": "D09Z01S12[E]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D09Z01S09[Cell19]", "D09Z01S09[Cell24]" ], + "Logic": "D09Z01S09[NW] || D09Z01S09[Cell19] || dash" + }, + { + "Id": "D09Z01S09[E]", + "Direction": 2, + "OriginalDoor": "D09Z01S07[SW]", + "Logic": "D09Z01S09[Cell21] || D09Z01S09[Cell20] || D09Z01S09[SW] || D09Z01S09[E] || dash" + }, + { + "Id": "D09Z01S09[Cell24]", + "Direction": 4, + "OriginalDoor": "D09BZ01S01[Cell24]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D09Z01S09[NW]", "D09Z01S09[Cell19]" ], + "Logic": "D09Z01S09[Cell24] || dash" + }, + { + "Id": "D09Z01S09[Cell19]", + "Direction": 4, + "OriginalDoor": "D09BZ01S01[Cell19]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D09Z01S09[NW]", "D09Z01S09[Cell24]" ], + "Logic": "D09Z01S09[NW] || D09Z01S09[Cell19] || dash" + }, + { + "Id": "D09Z01S09[Cell20]", + "Direction": 4, + "OriginalDoor": "D09BZ01S01[Cell20]", + "Logic": "silverKey && (D09Z01S09[Cell21] || D09Z01S09[Cell20] || D09Z01S09[SW] || D09Z01S09[E] || dash)" + }, + { + "Id": "D09Z01S09[Cell21]", + "Direction": 4, + "OriginalDoor": "D09BZ01S01[Cell21]", + "Logic": "goldKey && (D09Z01S09[Cell21] || D09Z01S09[Cell20] || D09Z01S09[SW] || D09Z01S09[E] || dash)" + }, + { + "Id": "D09Z01S10[W]", + "Direction": 1, + "OriginalDoor": "D09Z01S07[SE]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D09Z01S10[Cell12]", "D09Z01S10[Cell10]", "D09Z01S10[Cell11]" ] + }, + { + "Id": "D09Z01S10[Cell13]", + "Direction": 4, + "OriginalDoor": "D09BZ01S01[Cell13]", + "VisibilityFlags": 1 + }, + { + "Id": "D09Z01S10[Cell12]", + "Direction": 4, + "OriginalDoor": "D09BZ01S01[Cell12]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D09Z01S10[W]", "D09Z01S10[Cell10]", "D09Z01S10[Cell11]" ], + "Logic": "bronzeKey" + }, + { + "Id": "D09Z01S10[Cell10]", + "Direction": 4, + "OriginalDoor": "D09BZ01S01[Cell10]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D09Z01S10[W]", "D09Z01S10[Cell12]", "D09Z01S10[Cell11]" ], + "Logic": "silverKey" + }, + { + "Id": "D09Z01S10[Cell11]", + "Direction": 4, + "OriginalDoor": "D09BZ01S01[Cell11]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D09Z01S10[W]", "D09Z01S10[Cell12]", "D09Z01S10[Cell10]" ], + "Logic": "silverKey" + }, + { + "Id": "D09Z01S11[W]", + "Direction": 1, + "OriginalDoor": "D09Z01S04[E]", + "VisibilityFlags": 1 + }, + { + "Id": "D09Z01S11[E]", + "Direction": 2, + "OriginalDoor": "D09Z01S01[W]" + }, + { + "Id": "D09Z01S11[S]", + "Direction": 3, + "OriginalDoor": "D09Z01S02[N]" + }, + { + "Id": "D09Z01S12[E]", + "Direction": 2, + "OriginalDoor": "D09Z01S09[NW]" + }, + { + "Id": "D09Z01S13[E]", + "Direction": 2, + "OriginalDoor": "D09Z01S05[W]" + }, + { + "Id": "D09BZ01S01[Cell1]", + "Direction": 7, + "OriginalDoor": "D09Z01S02[Cell1]", + "VisibilityFlags": 1 + }, + { + "Id": "D09BZ01S01[Cell2]", + "Direction": 7, + "OriginalDoor": "D09Z01S02[Cell2]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D09BZ01S01[Cell3]" ] + }, + { + "Id": "D09BZ01S01[Cell3]", + "Direction": 7, + "OriginalDoor": "D09Z01S02[Cell3]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D09BZ01S01[Cell2]" ] + }, + { + "Id": "D09BZ01S01[Cell4]", + "Direction": 7, + "OriginalDoor": "D09Z01S02[Cell4]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D09BZ01S01[Cell5]" ] + }, + { + "Id": "D09BZ01S01[Cell5]", + "Direction": 7, + "OriginalDoor": "D09Z01S02[Cell5]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D09BZ01S01[Cell4]" ] + }, + { + "Id": "D09BZ01S01[Cell6]", + "Direction": 7, + "OriginalDoor": "D09Z01S02[Cell6]", + "VisibilityFlags": 1 + }, + { + "Id": "D09BZ01S01[Cell7]", + "Direction": 7, + "OriginalDoor": "D09Z01S08[Cell7]", + "VisibilityFlags": 1 + }, + { + "Id": "D09BZ01S01[Cell10]", + "Direction": 7, + "OriginalDoor": "D09Z01S10[Cell10]", + "VisibilityFlags": 1 + }, + { + "Id": "D09BZ01S01[Cell11]", + "Direction": 7, + "OriginalDoor": "D09Z01S10[Cell11]", + "VisibilityFlags": 1 + }, + { + "Id": "D09BZ01S01[Cell12]", + "Direction": 7, + "OriginalDoor": "D09Z01S10[Cell12]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D09BZ01S01[Cell13]" ] + }, + { + "Id": "D09BZ01S01[Cell13]", + "Direction": 7, + "OriginalDoor": "D09Z01S10[Cell13]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D09BZ01S01[Cell12]" ] + }, + { + "Id": "D09BZ01S01[Cell14]", + "Direction": 7, + "OriginalDoor": "D09Z01S08[Cell14]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D09BZ01S01[Cell15]" ] + }, + { + "Id": "D09BZ01S01[Cell15]", + "Direction": 7, + "OriginalDoor": "D09Z01S08[Cell15]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D09BZ01S01[Cell14]" ] + }, + { + "Id": "D09BZ01S01[Cell16]", + "Direction": 7, + "OriginalDoor": "D09Z01S08[Cell16]", + "VisibilityFlags": 1 + }, + { + "Id": "D09BZ01S01[Cell17]", + "Direction": 7, + "OriginalDoor": "D09Z01S08[Cell17]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D09BZ01S01[Cell18]" ] + }, + { + "Id": "D09BZ01S01[Cell18]", + "Direction": 7, + "OriginalDoor": "D09Z01S08[Cell18]", + "VisibilityFlags": 1 + }, + { + "Id": "D09BZ01S01[Cell19]", + "Direction": 7, + "OriginalDoor": "D09Z01S09[Cell19]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D09BZ01S01[Cell20]" ] + }, + { + "Id": "D09BZ01S01[Cell20]", + "Direction": 7, + "OriginalDoor": "D09Z01S09[Cell20]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D09BZ01S01[Cell19]" ] + }, + { + "Id": "D09BZ01S01[Cell21]", + "Direction": 7, + "OriginalDoor": "D09Z01S09[Cell21]", + "VisibilityFlags": 1 + }, + { + "Id": "D09BZ01S01[Cell22]", + "Direction": 7, + "OriginalDoor": "D09Z01S02[Cell22]", + "VisibilityFlags": 1 + }, + { + "Id": "D09BZ01S01[Cell23]", + "Direction": 7, + "OriginalDoor": "D09Z01S02[Cell23]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D09BZ01S01[Cell22]" ], + "Logic": "bronzeKey" + }, + { + "Id": "D09BZ01S01[Cell24]", + "Direction": 7, + "OriginalDoor": "D09Z01S09[Cell24]", + "VisibilityFlags": 1 + }, + + { + "Id": "D17Z01S01[E]", + "Direction": 2, + "OriginalDoor": "D17Z01S02[W]" + }, + { + "Id": "D17Z01S01[Cherubs1]", + "Direction": 5 + }, + { + "Id": "D17Z01S01[Cherubs2]", + "Direction": 5 + }, + { + "Id": "D17Z01S01[Cherubs3]", + "Direction": 5 + }, + { + "Id": "D17Z01S02[W]", + "Direction": 1, + "OriginalDoor": "D17Z01S01[E]", + "Logic": "D17Z01S02[W] || dash" + }, + { + "Id": "D17Z01S02[E]", + "Direction": 2, + "OriginalDoor": "D17Z01S05[W]", + "Logic": "D17Z01S02[N] || D17Z01S02[E] || dash" + }, + { + "Id": "D17Z01S02[N]", + "Direction": 0, + "OriginalDoor": "D17Z01S10[S]", + "Logic": "D17Z01S02[N] || blood && (D17Z01S02[E] || D17Z01S02[W] && dash)" + }, + { + "Id": "D17Z01S03[W]", + "Direction": 1, + "OriginalDoor": "D17Z01S11[E]" + }, + { + "Id": "D17Z01S03[E]", + "Direction": 2, + "OriginalDoor": "D01Z01S07[W]", + "Type": 1 + }, + { + "Id": "D17Z01S03[relic]", + "Direction": 4, + "OriginalDoor": "D17BZ01S01[relic]", + "Logic": "elderKey" + }, + { + "Id": "D17Z01S04[W]", + "Direction": 1, + "OriginalDoor": "D17Z01S12[E]" + }, + { + "Id": "D17Z01S04[S]", + "Direction": 3, + "OriginalDoor": "D17Z01S07[N]" + }, + { + "Id": "D17Z01S04[FrontL]", + "Direction": 4, + "OriginalDoor": "D17BZ02S01[FrontL]" + }, + { + "Id": "D17Z01S04[N]", + "Direction": 0, + "OriginalDoor": "D17Z01S05[S]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D17Z01S04[FrontR]" ] + }, + { + "Id": "D17Z01S04[FrontR]", + "Direction": 4, + "OriginalDoor": "D17BZ02S01[FrontR]", + "VisibilityFlags": 3, + "RequiredDoors": [ "D17Z01S04[N]" ] + }, + { + "Id": "D17Z01S05[W]", + "Direction": 1, + "OriginalDoor": "D17Z01S02[E]" + }, + { + "Id": "D17Z01S05[E]", + "Direction": 2, + "OriginalDoor": "D17Z01S11[W]" + }, + { + "Id": "D17Z01S05[S]", + "Direction": 3, + "OriginalDoor": "D17Z01S04[N]", + "Logic": "openedBotSSLadder" + }, + { + "Id": "D17Z01S06[E]", + "Direction": 2, + "OriginalDoor": "D17Z01S07[W]" + }, + { + "Id": "D17Z01S07[SW]", + "Direction": 1, + "OriginalDoor": "D17Z01S08[E]" + }, + { + "Id": "D17Z01S07[SE]", + "Direction": 2, + "OriginalDoor": "D03Z01S05[W]", + "Type": 1 + }, + { + "Id": "D17Z01S07[W]", + "Direction": 1, + "OriginalDoor": "D17Z01S06[E]" + }, + { + "Id": "D17Z01S07[NW]", + "Direction": 1, + "OriginalDoor": "D17Z01S09[E]" + }, + { + "Id": "D17Z01S07[N]", + "Direction": 0, + "OriginalDoor": "D17Z01S04[S]" + }, + { + "Id": "D17Z01S08[E]", + "Direction": 2, + "OriginalDoor": "D17Z01S07[SW]" + }, + { + "Id": "D17Z01S09[E]", + "Direction": 2, + "OriginalDoor": "D17Z01S07[NW]" + }, + { + "Id": "D17Z01S10[W]", + "Direction": 1, + "OriginalDoor": "D17Z01S13[E]", + "Logic": "D17Z01S10[W] || blood || doubleJump" + }, + { + "Id": "D17Z01S10[S]", + "Direction": 3, + "OriginalDoor": "D17Z01S02[N]" + }, + { + "Id": "D17Z01S11[W]", + "Direction": 1, + "OriginalDoor": "D17Z01S05[E]", + "Logic": "D17Z01S11[W] || canBeatBrotherhoodBoss" + }, + { + "Id": "D17Z01S11[E]", + "Direction": 2, + "OriginalDoor": "D17Z01S03[W]", + "Logic": "D17Z01S11[E] || canBeatBrotherhoodBoss" + }, + { + "Id": "D17Z01S12[E]", + "Direction": 2, + "OriginalDoor": "D17Z01S04[W]" + }, + { + "Id": "D17Z01S13[W]", + "Direction": 1, + "OriginalDoor": "D17Z01S14[E]" + }, + { + "Id": "D17Z01S13[E]", + "Direction": 2, + "OriginalDoor": "D17Z01S10[W]" + }, + { + "Id": "D17Z01S14[W]", + "Direction": 1, + "OriginalDoor": "D17Z01S15[E]", + "Logic": "scapular && (D17Z01S14[W] || blood)" + }, + { + "Id": "D17Z01S14[E]", + "Direction": 2, + "OriginalDoor": "D17Z01S13[W]", + "Logic": "D17Z01S14[E] || blood" + }, + { + "Id": "D17Z01S14[-Cherubs1]", + "Direction": 6, + "OriginalDoor": "D17Z01S01[Cherubs1]", + "Logic": "linen && (D17Z01S14[W] || blood || canCrossGap11)" + }, + { + "Id": "D17Z01S14[-Cherubs2]", + "Direction": 6, + "OriginalDoor": "D17Z01S01[Cherubs2]", + "Logic": "linen && (D17Z01S14[E] && canCrossGap8 || D17Z01S14[W] && canCrossGap10 || blood)" + }, + { + "Id": "D17Z01S14[-Cherubs3]", + "Direction": 6, + "OriginalDoor": "D17Z01S01[Cherubs3]", + "Logic": "linen && (D17Z01S14[E] || blood)" + }, + { + "Id": "D17Z01S15[E]", + "Direction": 2, + "OriginalDoor": "D17Z01S14[W]" + }, + { + "Id": "D17BZ01S01[relic]", + "Direction": 7, + "OriginalDoor": "D17Z01S03[relic]" + }, + { + "Id": "D17BZ02S01[FrontL]", + "Direction": 7, + "OriginalDoor": "D17Z01S04[FrontL]", + "VisibilityFlags": 1 + }, + { + "Id": "D17BZ02S01[FrontR]", + "Direction": 7, + "OriginalDoor": "D17Z01S04[FrontR]", + "Logic": "D17BZ02S01[FrontR] || dash && wallClimb" + }, + + { + "Id": "D20Z01S01[W]", + "Direction": 1, + "OriginalDoor": "D03Z02S15[E]", + "Type": 1 + }, + { + "Id": "D20Z01S01[E]", + "Direction": 2, + "OriginalDoor": "D20Z01S02[W]" + }, + { + "Id": "D20Z01S01[S]", + "Direction": 3, + "OriginalDoor": "D20Z01S04[N]" + }, + { + "Id": "D20Z01S01[Cherubs]", + "Direction": 5 + }, + { + "Id": "D20Z01S02[W]", + "Direction": 1, + "OriginalDoor": "D20Z01S01[E]" + }, + { + "Id": "D20Z01S02[E]", + "Direction": 2, + "OriginalDoor": "D20Z01S03[W]" + }, + { + "Id": "D20Z01S03[W]", + "Direction": 1, + "OriginalDoor": "D20Z01S02[E]" + }, + { + "Id": "D20Z01S03[N]", + "Direction": 0, + "OriginalDoor": "D03Z01S01[S]", + "Type": 1 + }, + { + "Id": "D20Z01S04[W]", + "Direction": 1, + "OriginalDoor": "D20Z01S05[E]" + }, + { + "Id": "D20Z01S04[E]", + "Direction": 2, + "OriginalDoor": "D01Z05S24[W]", + "Type": 1, + "Logic": "openedDCGateW" + }, + { + "Id": "D20Z01S04[N]", + "Direction": 0, + "OriginalDoor": "D20Z01S01[S]" + }, + { + "Id": "D20Z01S05[W]", + "Direction": 1, + "OriginalDoor": "D20Z01S06[NE]" + }, + { + "Id": "D20Z01S05[E]", + "Direction": 2, + "OriginalDoor": "D20Z01S04[W]" + }, + { + "Id": "D20Z01S06[NE]", + "Direction": 2, + "OriginalDoor": "D20Z01S05[W]" + }, + { + "Id": "D20Z01S06[SE]", + "Direction": 2, + "OriginalDoor": "D20Z01S07[NW]" + }, + { + "Id": "D20Z01S07[NW]", + "Direction": 1, + "OriginalDoor": "D20Z01S06[SE]" + }, + { + "Id": "D20Z01S07[NE]", + "Direction": 2, + "OriginalDoor": "D20Z01S08[W]" + }, + { + "Id": "D20Z01S07[SE]", + "Direction": 2, + "OriginalDoor": "D20Z01S09[W]" + }, + { + "Id": "D20Z01S08[W]", + "Direction": 1, + "OriginalDoor": "D20Z01S07[NE]" + }, + { + "Id": "D20Z01S09[W]", + "Direction": 1, + "OriginalDoor": "D20Z01S07[SE]", + "Logic": "D20Z01S09[W] || dash" + }, + { + "Id": "D20Z01S09[E]", + "Direction": 2, + "OriginalDoor": "D01Z05S25[EchoesW]", + "Type": 1, + "Logic": "D20Z01S09[E] || blood && dash" + }, + { + "Id": "D20Z01S10[W]", + "Direction": 1, + "OriginalDoor": "D01Z05S25[EchoesE]", + "Type": 1, + "Logic": "D20Z01S10[W] || blood && dash" + }, + { + "Id": "D20Z01S10[E]", + "Direction": 2, + "OriginalDoor": "D20Z01S11[W]", + "Logic": "D20Z01S10[E] || blood && dash" + }, + { + "Id": "D20Z01S11[W]", + "Direction": 1, + "OriginalDoor": "D20Z01S10[E]" + }, + { + "Id": "D20Z01S11[NW]", + "Direction": 1, + "OriginalDoor": "D20Z01S12[E]" + }, + { + "Id": "D20Z01S11[NE]", + "Direction": 2, + "OriginalDoor": "D20Z01S13[W]" + }, + { + "Id": "D20Z01S11[SE]", + "Direction": 2, + "OriginalDoor": "D20Z02S12[W]", + "Type": 1 + }, + { + "Id": "D20Z01S12[E]", + "Direction": 2, + "OriginalDoor": "D20Z01S11[NW]" + }, + { + "Id": "D20Z01S13[W]", + "Direction": 1, + "OriginalDoor": "D20Z01S11[NE]" + }, + { + "Id": "D20Z01S13[E]", + "Direction": 2, + "OriginalDoor": "D20Z02S11[NW]", + "Type": 1 + }, + { + "Id": "D20Z01S13[N]", + "Direction": 0, + "OriginalDoor": "D20Z01S14[S]" + }, + { + "Id": "D20Z01S14[S]", + "Direction": 3, + "OriginalDoor": "D20Z01S13[N]" + }, + { + "Id": "D20Z01S14[E]", + "Direction": 2, + "OriginalDoor": "D20Z03S01[W]", + "Type": 1 + }, + + { + "Id": "D20Z02S01[W]", + "Direction": 1, + "OriginalDoor": "D20Z02S03[SE]" + }, + { + "Id": "D20Z02S01[E]", + "Direction": 2, + "OriginalDoor": "D04Z02S24[SW]", + "Type": 1 + }, + { + "Id": "D20Z02S02[W]", + "Direction": 1, + "OriginalDoor": "D20Z02S03[NE]" + }, + { + "Id": "D20Z02S03[W]", + "Direction": 1, + "OriginalDoor": "D20Z02S04[E]" + }, + { + "Id": "D20Z02S03[NE]", + "Direction": 2, + "OriginalDoor": "D20Z02S02[W]", + "Logic": "D20Z02S03[NE] || canWalkOnRoot || canCrossGap5" + }, + { + "Id": "D20Z02S03[SE]", + "Direction": 2, + "OriginalDoor": "D20Z02S01[W]" + }, + { + "Id": "D20Z02S04[W]", + "Direction": 1, + "OriginalDoor": "D20Z02S05[E]", + "Logic": "D20Z02S04[W] || dash" + }, + { + "Id": "D20Z02S04[E]", + "Direction": 2, + "OriginalDoor": "D20Z02S03[W]", + "Logic": "D20Z02S04[E] || dash" + }, + { + "Id": "D20Z02S05[SW]", + "Direction": 1, + "OriginalDoor": "D20Z02S06[SE]" + }, + { + "Id": "D20Z02S05[NW]", + "Direction": 1, + "OriginalDoor": "D20Z02S06[NE]", + "Logic": "D20Z02S05[NW] || nail || canCrossGap3" + }, + { + "Id": "D20Z02S05[E]", + "Direction": 2, + "OriginalDoor": "D20Z02S04[W]" + }, + { + "Id": "D20Z02S06[SW]", + "Direction": 1, + "OriginalDoor": "D20Z02S09[E]" + }, + { + "Id": "D20Z02S06[SE]", + "Direction": 2, + "OriginalDoor": "D20Z02S05[SW]" + }, + { + "Id": "D20Z02S06[NW]", + "Direction": 1, + "OriginalDoor": "D20Z02S07[E]", + "Logic": "D20Z02S06[NW] || D20Z02S06[NE] || doubleJump || canClimbOnRoot || canDiveLaser" + }, + { + "Id": "D20Z02S06[NE]", + "Direction": 2, + "OriginalDoor": "D20Z02S05[NW]", + "Logic": "D20Z02S06[NW] || D20Z02S06[NE] || doubleJump || canClimbOnRoot || canDiveLaser" + }, + { + "Id": "D20Z02S07[W]", + "Direction": 1, + "OriginalDoor": "D20Z02S08[E]" + }, + { + "Id": "D20Z02S07[E]", + "Direction": 2, + "OriginalDoor": "D20Z02S06[NW]" + }, + { + "Id": "D20Z02S08[E]", + "Direction": 2, + "OriginalDoor": "D20Z02S07[W]" + }, + { + "Id": "D20Z02S09[W]", + "Direction": 1, + "OriginalDoor": "D20Z02S10[E]" + }, + { + "Id": "D20Z02S09[E]", + "Direction": 2, + "OriginalDoor": "D20Z02S06[SW]" + }, + { + "Id": "D20Z02S10[W]", + "Direction": 1, + "OriginalDoor": "D20Z02S11[E]" + }, + { + "Id": "D20Z02S10[E]", + "Direction": 2, + "OriginalDoor": "D20Z02S09[W]" + }, + { + "Id": "D20Z02S11[SW]", + "Direction": 1, + "OriginalDoor": "D20Z02S12[E]" + }, + { + "Id": "D20Z02S11[NW]", + "Direction": 1, + "OriginalDoor": "D20Z01S13[E]", + "Type": 1, + "VisibilityFlags": 5, + "RequiredDoors": [ "D20Z02S11[E]" ], + "Logic": "D20Z02S11[NW] || mourningSkipAllowed && (doubleJump || canBreakTirana || D20Z02S11[E])" + }, + { + "Id": "D20Z02S11[E]", + "Direction": 2, + "OriginalDoor": "D20Z02S10[W]", + "VisibilityFlags": 5, + "Logic": "D20Z02S11[E] || mourningSkipAllowed && (doubleJump || canBreakTirana || D20Z02S11[NW] && canCrossGap5)" + }, + { + "Id": "D20Z02S12[W]", + "Direction": 1, + "OriginalDoor": "D20Z01S11[SE]", + "Type": 1 + }, + { + "Id": "D20Z02S12[E]", + "Direction": 2, + "OriginalDoor": "D20Z02S11[SW]" + }, + + { + "Id": "D20Z03S01[W]", + "Direction": 1, + "OriginalDoor": "D20Z01S14[E]", + "Type": 1 + }, +] \ No newline at end of file diff --git a/worlds/blasphemous/Rules.py b/worlds/blasphemous/Rules.py index 8608d5f3..251794dd 100644 --- a/worlds/blasphemous/Rules.py +++ b/worlds/blasphemous/Rules.py @@ -1,1479 +1,4374 @@ +from typing import Dict, List, Set from worlds.generic.Rules import set_rule, add_rule -from ..AutoWorld import LogicMixin +from BaseClasses import CollectionState -class BlasphemousLogic(LogicMixin): - def _blasphemous_blood_relic(self, player): - return self.has("Blood Perpetuated in Sand", player) +def total_fervour(state: CollectionState, player: int) -> int: + totalFervour: int = 60 + (20 * state.count("Fervour Upgrade", player)) + (10 * state.count("Bead of Blue Wax", player)) - def _blasphemous_water_relic(self, player): - return self.has("Nail Uprooted from Dirt", player) + return totalFervour - def _blasphemous_corpse_relic(self, player): - return self.has("Shroud of Dreamt Sins", player) - def _blasphemous_fall_relic(self, player): - return self.has("Linen of Golden Thread", player) +def aubade(state: CollectionState, player: int) -> bool: + return state.has("Aubade of the Nameless Guardian", player) if total_fervour(state, player) >= 90 else False - def _blasphemous_miasma_relic(self, player): - return self.has("Silvered Lung of Dolphos", player) + +def tirana(state: CollectionState, player: int) -> bool: + return state.has("Tirana of the Celestial Bastion", player) if total_fervour(state, player) >= 90 else False + + +def pillar(state: CollectionState, player: int) -> bool: + return state.has_any({"Debla of the Lights", "Taranto to my Sister", "Cloistered Ruby"}, player) + + +def charge_beam(state: CollectionState, player: int) -> bool: + return state.has("Charged Skill", player, 3) + + +def can_air_stall(state: CollectionState, logic: int, player: int) -> bool: + return state.has("Ranged Skill", player) if logic >= 1 else False + + +def can_dawn_jump(state: CollectionState, logic: int, player: int) -> bool: + return state.has_all({"Brilliant Heart of Dawn", "Dash Ability"}, player) if logic >= 1 else False + + +def can_water_jump(state: CollectionState, player: int) -> bool: + return state.has_any({"Nail Uprooted from Dirt", "Purified Hand of the Nun"}, player) + + +def can_break_holes(state: CollectionState, player: int) -> bool: + return ( + state.has_any({"Charged Skill", "Dive Skill"}, player) + or ( + state.has("Lunge Skill", player, 3) + and state.has("Dash Ability", player) + ) + or state.has_group("prayer", player) + or aubade(state, player) + or tirana(state, player) + ) + + +def can_break_tirana(state: CollectionState, logic: int, player: int) -> bool: + return tirana(state, player) if logic >= 2 else False + + +def can_dive_laser(state: CollectionState, logic: int, player: int) -> bool: + return state.has("Dive Skill", player, 3) if logic >= 2 else False + + +def can_walk_on_root(state: CollectionState, player: int) -> bool: + return state.has("Three Gnarled Tongues", player) + + +def can_climb_on_root(state: CollectionState, player: int) -> bool: + return state.has_all({"Three Gnarled Tongues", "Wall Climb Ability"}, player) + + +def can_survive_poison(state: CollectionState, logic: int, player: int, number: int) -> bool: + if number == 1: + if logic >= 2: + return True + elif logic == 1: + return state.has_any({"Silvered Lung of Dolphos", "Tiento to your Thorned Hairs"}, player) + elif logic == 0: + return state.has("Silvered Lung of Dolphos", player) + elif number == 2: + if logic >= 1: + return state.has_any({"Silvered Lung of Dolphos", "Tiento to your Thorned Hairs"}, player) + else: + return state.has("Silvered Lung of Dolphos", player) + elif number == 3: + if logic >= 2 and total_fervour(state, player) >= 120: + return state.has_any({"Silvered Lung of Dolphos", "Tiento to your Thorned Hairs"}, player) + else: + return state.has("Silvered Lung of Dolphos", player) + + +def can_enemy_bounce(logic: int, enemy: int) -> bool: # TODO + return enemy_skips_allowed(logic, enemy) + + +def can_enemy_upslash(state: CollectionState, logic: int, enemy: int, player: int) -> bool: + return state.has("Combo Skill", player, 2) and \ + enemy_skips_allowed(logic, enemy) + + +def can_cross_gap(state: CollectionState, logic: int, player: int, number: int) -> bool: + if number == 1: + return ( + state.has_any({"Purified Hand of the Nun", "The Young Mason's Wheel"}, player) + or can_dawn_jump(state, logic, player) + or can_air_stall(state, logic, player) + ) + elif number == 2: + return ( + state.has_any({"Purified Hand of the Nun", "The Young Mason's Wheel"}, player) + or can_dawn_jump(state, logic, player) + ) + elif number == 3: + return ( + state.has("Purified Hand of the Nun", player) + or can_dawn_jump(state, logic, player) + or ( + state.has("The Young Mason's Wheel", player) + and can_air_stall(state, logic, player) + ) + ) + elif number == 4: + return ( + state.has("Purified Hand of the Nun", player) + or can_dawn_jump(state, logic, player) + ) + elif number == 5: + return ( + state.has("Purified Hand of the Nun", player) + or ( + can_dawn_jump(state, logic, player) + and can_air_stall(state, logic, player)) + ) + elif number == 6: + return state.has("Purified Hand of the Nun", player) + elif number == 7: + return ( + state.has("Purified Hand of the Nun", player) + and ( + can_dawn_jump(state, logic, player) + or state.has("The Young Mason's Wheel", player) + or can_air_stall(state, logic, player) + ) + ) + elif number == 8: + return ( + state.has("Purified Hand of the Nun", player) + and ( + can_dawn_jump(state, logic, player) + or state.has("The Young Mason's Wheel", player) + ) + ) + elif number == 9: + return ( + state.has("Purified Hand of the Nun", player) + and ( + can_dawn_jump(state, logic, player) + or state.has("The Young Mason's Wheel", player) + and can_air_stall(state, logic, player) + ) + ) + elif number == 10: + return ( + state.has("Purified Hand of the Nun", player) + and can_dawn_jump(state, logic, player) + ) + elif number == 11: + return ( + state.has("Purified Hand of the Nun", player) + and can_dawn_jump(state, logic, player) + and can_air_stall(state, logic, player) + ) + + +def can_ride_albero_elevator(state: CollectionState, player: int) -> bool: + return state.has_any({"D02Z02S11[NW]", "D02Z02S11[NE]", "D02Z02S11[W]", "D02Z02S11[E]", \ + "D02Z02S11[SE]"}, player) + + +def opened_dc_gate_w(state: CollectionState, player: int) -> bool: + return state.has_any({"D01Z05S24[W]", "D01Z05S24[E]"}, player) + + +def opened_dc_gate_e(state: CollectionState, player: int) -> bool: + return state.has_any({"D01Z05S12[W]", "D01Z05S12[E]"}, player) + + +def opened_dc_ladder(state: CollectionState, player: int) -> bool: + return state.has_any({"D01Z05S20[W]", "D01Z05S20[N]"}, player) + + +def opened_wotw_cave(state: CollectionState, player: int) -> bool: + return ( + state.has("D02Z01S06[E]", player) + or state.has("Wall Climb Ability", player) + and ( + state.has("D02Z01S06[W]", player) + or state.has("D02Z01S06[Cherubs]", player) + ) + ) + + +def rode_gotp_elevator(state: CollectionState, player: int) -> bool: + return state.has_any({"D02Z02S11[NW]", "D02Z02S11[NE]", "D02Z02S11[W]", "D02Z02S11[E]", \ + "D02Z02S11[SE]"}, player) + + +def opened_convent_ladder(state: CollectionState, player: int) -> bool: + return state.has_any({"D02Z03S11[S]", "D02Z03S11[W]", "D02Z03S11[NW]", "D02Z03S11[E]", \ + "D02Z03S11[NE]"}, player) + + +def broke_jondo_bell_w(state: CollectionState, player: int) -> bool: + return ( + state.has("D03Z02S09[S]", player) + or state.has("D03Z02S09[W]", player) + and state.has("Dash Ability", player) + or state.has("D03Z02S09[N]", player) + or state.has("D03Z02S09[Cherubs]", player) + ) + + +def broke_jondo_bell_e(state: CollectionState, logic: int, enemy: int, player: int) -> bool: + return ( + state.has("D03Z02S05[S]", player) + or state.has("D03Z02S05[E]", player) + or state.has("D03Z02S05[W]", player) + and ( + can_cross_gap(state, logic, player, 5) + or can_enemy_bounce(logic, enemy) + and can_cross_gap(state, logic, player, 3) + ) + ) + + +def opened_mom_ladder(state: CollectionState, player: int) -> bool: + return state.has_any({"D04Z02S06[NW]", "D04Z02S06[NE]", "D04Z02S06[N]", "D04Z02S06[S]"}, player) + + +def opened_tsc_gate(state: CollectionState, player: int) -> bool: + return state.has_any({"D05Z02S11[W]", "D05Z02S11[Cherubs]"}, player) + + +def opened_ar_ladder(state: CollectionState, player: int) -> bool: + return state.has_any({"D06Z01S23[Sword]", "D06Z01S23[E]", "D06Z01S23[S]", "D06Z01S23[Cherubs]"}, player) + + +def broke_bottc_statue(state: CollectionState, player: int) -> bool: + return state.has_any({"D08Z01S02[NE]", "D08Z01S02[SE]"}, player) + + +def opened_wothp_gate(state: CollectionState, player: int) -> bool: + return state.has_any({"D09Z01S05[W]", "D09Z01S05[SE]", "D09Z01S05[NE]"}, player) + + +def opened_botss_ladder(state: CollectionState, player: int) -> bool: + return state.has_any({"D17Z01S04[N]", "D17Z01S04[FrontR]"}, player) + + +def upwarp_skips_allowed(logic: int) -> bool: + return True if logic >= 2 else False + + +def mourning_skips_allowed(logic: int) -> bool: + return True if logic >= 2 else False + + +def enemy_skips_allowed(logic: int, enemy: int) -> bool: + return True if logic >= 2 and enemy == 0 else False + + +#def unknown_skips_allowed(): +# return False + + +#def precise_skips_allowed(): +# return False + + +def can_beat_boss(state: CollectionState, boss: str, logic: int, player: int) -> bool: + def has_boss_strength(name: str) -> bool: + silver: int = state.count("Quicksilver", player) if state.has("D01Z05S27[E]", player) else 0 + flasks: int = state.count("Empty Bile Flask", player) if \ + state.has_any({"D01Z05S18[E]", "D02Z02S09[E]", "D03Z02S14[E]", "D03Z03S03[SE]", "D04Z02S13[W]", \ + "D05Z01S12[E]", "D20Z01S08[W]"}, player) else 0 + + + playerStrength: float = state.count("Life Upgrade", player) * 0.25 / 6 + \ + state.count("Mea Culpa Upgrade", player) * 0.25 / 7 + state.count("Fervour Upgrade", player) * 0.20 \ + / 6 + flasks * 0.15 / 8 + silver * 0.15 / 5 + + bosses: Dict[str, int] = { + "warden": -0.10, + "ten-piedad": 0.05, + "charred-visage": 0.20, + "tres-angustias": 0.15, + "esdras": 0.25, + "melquiades": 0.25, + "exposito": 0.30, + "quirce": 0.35, + "crisanta": 0.50, + "isidora": 0.70, + "sierpes": 0.70, + "amanecida": 0.60, + "laudes": 0.60, + "perpetua": -0.05, + "legionary": 0.20 + } + + bossStrength: int = bosses[name] + + return playerStrength >= (bossStrength - 0.10 if logic >= 2 else (bossStrength if logic >= 1 else bossStrength + 0.10)) - def _blasphemous_root_relic(self, player): - return self.has("Three Gnarled Tongues", player) - - def _blasphemous_open_holes(self, player): - return self.has_any({"Dive Skill", "Charged Skill"}, player) or \ - self.has_group("prayer", player, 1) or \ - (self.has_any({"Tirana of the Celestial Bastion", "Aubade of the Nameless Guardian"}, player) and \ - self.has("Fervour Upgrade", player, 2)) - - def _blasphemous_bell(self, player): - return self.has("Petrified Bell", player) - - def _blasphemous_bead(self, player): - return self.has("Weight of True Guilt", player) - - def _blasphemous_cloth(self, player): - return self.has("Linen Cloth", player) - - def _blasphemous_pre_egg(self, player): - return self.has("Egg of Deformity", player) - - def _blasphemous_egg(self, player): - return self.has("Hatched Egg of Deformity", player) - - def _blasphemous_hand(self, player): - return self.has("Severed Hand", player) - - def _blasphemous_chalice(self, player): - return self.has("Chalice of Inverted Verses", player) - - def _blasphemous_thimble(self, player): - return self.has("Empty Golden Thimble", player) - - def _blasphemous_full_thimble(self, player): - return self.has("Golden Thimble Filled with Burning Oil", player) - - def _blasphemous_flowers(self, player): - return self.has("Dried Flowers bathed in Tears", player) - - def _blasphemous_redento(self, player): - return self.has_all({"Little Toe made of Limestone", "Big Toe made of Limestone", \ - "Fourth Toe made of Limestone"}, player) and \ - self.has("Knot of Rosary Rope", player) - - def _blasphemous_cord(self, player): - return self.has("Cord of the True Burying", player) - - def _blasphemous_marks(self, player): - return self.has_all({"Mark of the First Refuge", "Mark of the Second Refuge", \ - "Mark of the Third Refuge"}, player) - - def _blasphemous_red_wax(self, player): - return self.has("Bead of Red Wax", player) - - def _blasphemous_blue_wax(self, player): - return self.has("Bead of Blue Wax", player) - - def _blasphemous_both_wax(self, player): - return self.has("Bead of Red Wax", player, 3) and \ - self.has("Bead of Blue Wax", player, 3) - - def _blasphemous_elder_key(self, player): - return self.has("Key to the Chamber of the Eldest Brother", player) - - def _blasphemous_bronze_key(self, player): - return self.has("Key of the Secular", player) - - def _blasphemous_silver_key(self, player): - return self.has("Key of the Scribe", player) - - def _blasphemous_gold_key(self, player): - return self.has("Key of the Inquisitor", player) - - def _blasphemous_high_key(self, player): - return self.has("Key of the High Peaks", player) - - def _blasphemous_wood_key(self, player): - return self.has("Key Grown from Twisted Wood", player) - - def _blasphemous_scapular(self, player): - return self.has("Incomplete Scapular", player) - - def _blasphemous_heart_c(self, player): - return self.has("Apodictic Heart of Mea Culpa", player) - - def _blasphemous_eyes(self, player): - return self.has("Severed Right Eye of the Traitor", player) and \ - self.has("Broken Left Eye of the Traitor", player) - - def _blasphemous_debla(self, player): - return self.has("Debla of the Lights", player) - - def _blasphemous_taranto(self, player): - return self.has("Taranto to my Sister", player) - - def _blasphemous_tirana(self, player): - return self.has("Tirana of the Celestial Bastion", player) and \ - self.has("Fervour Upgrade", player, 2) - - def _blasphemous_aubade(self, player): - return self.has("Aubade of the Nameless Guardian", player) and \ - self.has("Fervour Upgrade", player, 2) - - def _blasphemous_cherub_6(self, player): - return self.has_any({"Debla of the Lights", "Taranto to my Sister", "Verdiales of the Forsaken Hamlet", \ - "Cloistered Ruby"}, player) or \ - (self.has("Tirana of the Celestial Bastion", player) and \ - self.has("Fervour Upgrade", player, 2)) - - def _blasphemous_cherub_13(self, player): - return self.has_any({"Ranged Skill", "Debla of the Lights", "Taranto to my Sister", \ - "Cante Jondo of the Three Sisters", "Cloistered Ruby"}, player) or \ - (self.has_any({"Aubade of the Nameless Guardian", "Tirana of the Celestial Bastion"}, player) and \ - self.has("Fervour Upgrade", player, 2)) - - def _blasphemous_cherub_20(self, player): - return self.has_any({"Debla of the Lights", "Lorquiana", "Zarabanda of the Safe Haven", "Taranto to my Sister", \ - "Cante Jondo of the Three Sisters", "Cloistered Ruby"}, player) or \ - (self.has_any({"Aubade of the Nameless Guardian", "Tirana of the Celestial Bastion"}, player) and \ - self.has("Fervour Upgrade", player, 2)) - - def _blasphemous_cherub_21(self, player): - return self.has_any({"Debla of the Lights", "Taranto to my Sister", "Cante Jondo of the Three Sisters", \ - "Verdiales of the Forsaken Hamlet", "Cloistered Ruby"}, player) or \ - (self.has("Tirana of the Celestial Bastion", player) and \ - self.has("Fervour Upgrade", player, 2)) - - def _blasphemous_cherub_22_23_31_32(self, player): - return self.has_any({"Debla of the Lights", "Taranto to my Sister", "Cloistered Ruby"}, player) - - def _blasphemous_cherub_24_33(self, player): - return self.has_any({"Debla of the Lights", "Taranto to my Sister", "Cante Jondo of the Three Sisters", \ - "Cloistered Ruby"}, player) or \ - (self.has("Tirana of the Celestial Bastion", player) and \ - self.has("Fervour Upgrade", player, 2)) - - def _blasphemous_cherub_25(self, player): - return self.has_any({"Debla of the Lights", "Lorquiana", "Taranto to my Sister", \ - "Cante Jondo of the Three Sisters", "Verdiales of the Forsaken Hamlet", "Cantina of the Blue Rose", \ - "Cloistered Ruby"}, player) or \ - (self.has("Aubade of the Nameless Guardian", player) and \ - self.has("Fervour Upgrade", player, 2)) - - def _blasphemous_cherub_27(self, player): - return self.has_any({"Ranged Skill", "Debla of the Lights", "Lorquiana", "Taranto to my Sister", \ - "Cante Jondo of the Three Sisters", "Cantina of the Blue Rose", "Cloistered Ruby"}, player) or \ - (self.has("Aubade of the Nameless Guardian", player) and \ - self.has("Fervour Upgrade", player, 2)) - - def _blasphemous_cherub_38(self, player): - return self.has_any({"Ranged Skill", "Lorquiana", "Cante Jondo of the Three Sisters", \ - "Cantina of the Blue Rose", "Cloistered Ruby"}, player) or \ - self.has("The Young Mason's Wheel", player) or \ - self.has("Brilliant Heart of Dawn", player) or \ - (self.has("Aubade of the Nameless Guardian", player) and \ - self.has("Fervour Upgrade", player, 2)) - - def _blasphemous_wheel(self, player): - return self.has("The Young Mason's Wheel", player) - - def _blasphemous_dawn_heart(self, player): - return self.has("Brilliant Heart of Dawn", player) - - def _blasphemous_tirso_1(self, player): - return self.has_group("tirso", player, 1) - - def _blasphemous_tirso_2(self, player): - return self.has_group("tirso", player, 2) - - def _blasphemous_tirso_3(self, player): - return self.has_group("tirso", player, 3) - - def _blasphemous_tirso_4(self, player): - return self.has_group("tirso", player, 4) - - def _blasphemous_tirso_5(self, player): - return self.has_group("tirso", player, 5) - - def _blasphemous_tirso_6(self, player): - return self.has_group("tirso", player, 6) - - def _blasphemous_tentudia_1(self, player): - return self.has_group("tentudia", player, 1) - - def _blasphemous_tentudia_2(self, player): - return self.has_group("tentudia", player, 2) - - def _blasphemous_tentudia_3(self, player): - return self.has_group("tentudia", player, 3) - - def _blasphemous_altasgracias_3(self, player): - return self.has_group("egg", player, 3) - - def _blasphemous_cherubs_20(self, player): - return self.has("Child of Moonlight", player, 20) - - def _blasphemous_cherubs_all(self, player): - return self.has("Child of Moonlight", player, 38) - - def _blasphemous_bones_4(self, player): - return self.has_group("bones", player, 4) - - def _blasphemous_bones_8(self, player): - return self.has_group("bones", player, 8) - - def _blasphemous_bones_12(self, player): - return self.has_group("bones", player, 12) - - def _blasphemous_bones_16(self, player): - return self.has_group("bones", player, 16) - - def _blasphemous_bones_20(self, player): - return self.has_group("bones", player, 20) - - def _blasphemous_bones_24(self, player): - return self.has_group("bones", player, 24) - - def _blasphemous_bones_28(self, player): - return self.has_group("bones", player, 28) - - def _blasphemous_bones_30(self, player): - return self.has_group("bones", player, 30) - - def _blasphemous_bones_32(self, player): - return self.has_group("bones", player, 32) - - def _blasphemous_bones_36(self, player): - return self.has_group("bones", player, 36) - - def _blasphemous_bones_40(self, player): - return self.has_group("bones", player, 40) - - def _blasphemous_bones_44(self, player): - return self.has_group("bones", player, 44) - - def _blasphemous_sword_1(self, player): - return self.has("Mea Culpa Upgrade", player) - - def _blasphemous_sword_2(self, player): - return self.has("Mea Culpa Upgrade", player, 2) - - def _blasphemous_sword_3(self, player): - return self.has("Mea Culpa Upgrade", player, 3) - - def _blasphemous_sword_4(self, player): - return self.has("Mea Culpa Upgrade", player, 4) - - def _blasphemous_sword_5(self, player): - return self.has("Mea Culpa Upgrade", player, 5) - - def _blasphemous_sword_6(self, player): - return self.has("Mea Culpa Upgrade", player, 6) - - def _blasphemous_sword_7(self, player): - return self.has("Mea Culpa Upgrade", player, 7) - - def _blasphemous_ranged(self, player): - return self.has("Ranged Skill", player) - - def _blasphemous_bridge_access(self, player): - return self.has_group("wounds", player, 3) - - def _blasphemous_ex_bridge_access(self, player): - return self.has_group("wounds", player, 3) or \ - (self.has("Brilliant Heart of Dawn", player) and \ - self.has("Ranged Skill", player) and \ - self.has("Blood Perpetuated in Sand", player)) or \ - (self.has("Blood Perpetuated in Sand", player) and \ - self.has("Tirana of the Celestial Bastion", player) and \ - self.has("Fervour Upgrade", player, 2)) - - def _blasphemous_1_mask(self, player): - return self.has_group("masks", player, 1) - - def _blasphemous_2_masks(self, player): - return self.has_group("masks", player, 2) - - def _blasphemous_3_masks(self, player): - return self.has_group("masks", player, 3) - - def _blasphemous_laudes_gate(self, player): - return self.has("Verses Spun from Gold", player, 4) - - # Ten Piedad, Tres Angustias, Our Lady of the Charred Visage - def _blasphemous_wound_boss_easy(self, player): - return self.has("Mea Culpa Upgrade", player, 2) and \ - self.has_group("power", player, 3) - - def _blasphemous_wound_boss_normal(self, player): - return self.has("Mea Culpa Upgrade", player, 1) - - def _blasphemous_wound_boss_hard(self, player): - return True - - # Esdras - def _blasphemous_esdras_boss_easy(self, player): - return self.has("Mea Culpa Upgrade", player, 3) and \ - self.has_group("power", player, 5) - - def _blasphemous_esdras_boss_normal(self, player): - return self.has("Mea Culpa Upgrade", player, 2) and \ - self.has_group("power", player, 2) - - def _blasphemous_esdras_boss_hard(self, player): - return self.has("Mea Culpa Upgrade", player, 1) and \ - self.has_group("power", player, 1) - - # Melquiades, Exposito, Quirce - def _blasphemous_mask_boss_easy(self, player): - return self.has("Mea Culpa Upgrade", player, 4) and \ - self.has_group("power", player, 8) - - def _blasphemous_mask_boss_normal(self, player): - return self.has("Mea Culpa Upgrade", player, 3) and \ - self.has_group("power", player, 4) - - def _blasphemous_mask_boss_hard(self, player): - return self.has("Mea Culpa Upgrade", player, 2) and \ - self.has_group("power", player, 2) - - # Crisanta, Isidora, Sierpes, Amanecidas, Laudes - def _blasphemous_endgame_boss_easy(self, player): - return self.has("Mea Culpa Upgrade", player, 6) and \ - self.has_group("power", player, 16) - - def _blasphemous_endgame_boss_normal(self, player): - return self.has("Mea Culpa Upgrade", player, 5) and \ - self.has_group("power", player, 8) - - def _blasphemous_endgame_boss_hard(self, player): - return self.has("Mea Culpa Upgrade", player, 4) and \ - self.has_group("power", player, 5) + if boss == "Brotherhood": + return ( + has_boss_strength("warden") + and state.has_any({"D17Z01S11[W]", "D17Z01S11[E]"}, player) + ) + elif boss == "Mercy": + return ( + has_boss_strength("ten-piedad") + and state.has_any({"D01Z04S18[W]", "D01Z04S18[E]"}, player) + ) + elif boss == "Convent": + return ( + has_boss_strength("charred-visage") + and state.has_any({"D02Z03S20[W]", "D02Z03S20[E]"}, player) + ) + elif boss == "Grievance": + return ( + has_boss_strength("tres-angustias") + and state.has_any({"Wall Climb Ability", "Purified Hand of the Nun"}, player) + and state.has_any({"D03Z03S15[W]", "D03Z03S15[E]"}, player) + ) + elif boss == "Bridge": + return ( + has_boss_strength("esdras") + and state.has_any({"D08Z01S01[W]", "D08Z01S01[E]"}, player) + ) + elif boss == "Mothers": + return ( + has_boss_strength("melquiades") + and state.has_any({"D04Z02S22[W]", "D04Z02S22[E]"}, player) + ) + elif boss == "Canvases": + return ( + has_boss_strength("exposito") + and state.has_any({"D05Z02S14[W]", "D05Z02S14[E]"}, player) + ) + elif boss == "Prison": + return ( + has_boss_strength("quirce") + and state.has_any({"D09Z01S03[W]", "D09Z01S03[N]"}, player) + ) + elif boss == "Rooftops": + return ( + has_boss_strength("crisanta") + and state.has_any({"D06Z01S25[W]", "D06Z01S25[E]"}, player) + ) + elif boss == "Ossuary": + return ( + has_boss_strength("isidora") + and state.has("D01BZ08S01[W]", player) + ) + elif boss == "Mourning": + return ( + has_boss_strength("sierpes") + and state.has("D20Z02S08[E]", player) + ) + elif boss == "Graveyard": + return ( + has_boss_strength("amanecida") + and state.has_all({"D01BZ07S01[Santos]", "D02Z03S23[E]", "D02Z02S14[W]", "Wall Climb Ability"}, player) + ) + elif boss == "Jondo": + return ( + has_boss_strength("amanecida") + and state.has("D01BZ07S01[Santos]", player) + and state.has_any({"D20Z01S05[W]", "D20Z01S05[E]"}, player) + and state.has_any({"D03Z01S03[W]", "D03Z01S03[SW]"}, player) + ) + elif boss == "Patio": + return ( + has_boss_strength("amanecida") + and state.has_all({"D01BZ07S01[Santos]", "D06Z01S18[E]"}, player) + and state.has_any({"D04Z01S04[W]", "D04Z01S04[E]", "D04Z01S04[Cherubs]"}, player) + ) + elif boss == "Wall": + return ( + has_boss_strength("amanecida") + and state.has_all({"D01BZ07S01[Santos]", "D09BZ01S01[Cell24]"}, player) + and state.has_any({"D09Z01S01[W]", "D09Z01S01[E]"}, player) + ) + elif boss == "Hall": + return ( + has_boss_strength("laudes") + and state.has_any({"D08Z03S03[W]", "D08Z03S03[E]"}, player) + ) + elif boss == "Perpetua": + return has_boss_strength("perpetua") + elif boss == "Legionary": + return has_boss_strength("legionary") + + +def guilt_rooms(state: CollectionState, player: int, number: int) -> bool: + doors: List[str] = [ + "D01Z04S17[W]", + "D02Z02S06[E]", + "D03Z03S14[W]", + "D04Z02S17[W]", + "D05Z01S17[W]", + "D09Z01S13[E]", + "D17Z01S12[E]" + ] + + total: int = sum(state.has(item, player) for item in doors) + + return True if total >= number else False + + +def sword_rooms(state: CollectionState, player: int, number: int) -> bool: + doors: List[Set[str]] = [ + {"D01Z02S06[W]", "D01Z02S06[E]"}, + {"D01Z05S24[W]", "D01Z05S24[E]"}, + {"D02Z03S13[W]"}, + {"D04Z02S12[W]"}, + {"D05Z01S13[E]"}, + {"D06Z01S11[W]"}, + {"D17Z01S08[E]"} + ] + + total: int = sum(state.has_any(items, player) for items in doors) + + return True if total >= number else False + + +def redento(state: CollectionState, world, player: int, number: int) -> bool: + if number == 1: + return state.has_any({"D03Z01S03[W]", "D03Z01S03[SW]"}, player) + elif number == 2: + return ( + state.has_any({"D03Z01S03[W]", "D03Z01S03[SW]"}, player) + and state.has("OpenedBOTSSLadder", player) + ) + elif number == 3: + return ( + state.has_any({"D03Z01S03[W]", "D03Z01S03[SW]"}, player) + and state.has("OpenedBOTSSLadder", player) + and state.can_reach(world.multiworld.get_region("D01Z03S06", player)) + ) + elif number == 4: + return ( + state.has_any({"D03Z01S03[W]", "D03Z01S03[SW]"}, player) + and state.has("OpenedBOTSSLadder", player) + and state.can_reach(world.multiworld.get_region("D01Z03S06", player)) + and state.can_reach(world.multiworld.get_region("D04Z01S04", player)) + ) + elif number == 5: + return ( + state.has_any({"D03Z01S03[W]", "D03Z01S03[SW]"}, player) + and state.has("OpenedBOTSSLadder", player) + and state.can_reach(world.multiworld.get_region("D01Z03S06", player)) + and state.can_reach(world.multiworld.get_region("D04Z01S04", player)) + and state.can_reach(world.multiworld.get_region("D04Z02S20", player)) + and state.has_all({"Little Toe made of Limestone", "Big Toe made of Limestone", \ + "Fourth Toe made of Limestone", "D17Z01S09[E]"}, player) + and state.has("Knot of Rosary Rope", player) + ) + + +def miriam(state: CollectionState, player: int) -> bool: + return state.has_all({"D02Z03S24[E]", "D03Z03S19[E]", "D04Z04S02[W]", "D05Z01S24[E]", "D06Z01S26[W]"}, player) + + +def amanecida_rooms(state: CollectionState, logic: int, player: int, number: int) -> bool: + bosses: List[str] = [ + "Graveyard", + "Jondo", + "Patio", + "Wall" + ] + + total = sum(can_beat_boss(state, boss, logic, player) for boss in bosses) + + return True if total >= number else False + + +def chalice_rooms(state: CollectionState, player: int, number: int) -> bool: + doors: List[Set[str]] = [ + {"D03Z01S01[W]", "D03Z01S01[NE]", "D03Z01S01[S]"}, + {"D05Z02S01[W]", "D05Z02S01[E]"}, + {"D09Z01S07[SW]", "D09Z01S07[SE]", "D09Z01S07[W]", "D09Z01S07[E]"} + ] + + total: int = sum(state.has_any(items, player) for items in doors) + + return True if total >= number else False def rules(blasphemousworld): world = blasphemousworld.multiworld player = blasphemousworld.player + logic = world.difficulty[player].value + enemy = world.enemy_randomizer[player].value - # entrances - for i in world.get_region("Deambulatory of His Holiness", player).entrances: - set_rule(i, lambda state: state._blasphemous_3_masks(player)) - for i in world.get_region("Ferrous Tree", player).entrances: - set_rule(i, lambda state: state._blasphemous_bridge_access(player)) - for i in world.get_region("Mother of Mothers", player).entrances: - set_rule(i, lambda state: state._blasphemous_bridge_access(player)) - for i in world.get_region("Mourning and Havoc", player).entrances: - set_rule(i, lambda state: state._blasphemous_blood_relic(player) or \ - state.can_reach(world.get_region("Mother of Mothers", player), player)) - for i in world.get_region("Patio of the Silent Steps", player).entrances: - set_rule(i, lambda state: state._blasphemous_bridge_access(player)) - for i in world.get_region("The Resting Place of the Sister", player).entrances: - set_rule(i, lambda state: state._blasphemous_blood_relic(player)) - for i in world.get_region("The Sleeping Canvases", player).entrances: - set_rule(i, lambda state: state._blasphemous_bridge_access(player)) - for i in world.get_region("Wall of the Holy Prohibitions", player).entrances: - set_rule(i, lambda state: state._blasphemous_1_mask(player) and \ - state._blasphemous_bridge_access(player)) - # Albero - set_rule(world.get_location("Albero: Bless Linen Cloth", player), - lambda state: state._blasphemous_cloth(player)) - set_rule(world.get_location("Albero: Bless Hatched Egg", player), - lambda state: state._blasphemous_egg(player)) - set_rule(world.get_location("Albero: Bless Severed Hand", player), - lambda state: state._blasphemous_hand(player)) - set_rule(world.get_location("Albero: First gift for Cleofas", player), - lambda state: state.can_reach(world.get_region("Mother of Mothers", player))) - set_rule(world.get_location("Albero: Final gift for Cleofas", player), - lambda state: state.can_reach(world.get_region("Mother of Mothers", player)) and \ - state._blasphemous_marks(player) and \ - state._blasphemous_cord(player)) - set_rule(world.get_location("Albero: Tirso's 1st reward", player), - lambda state: state._blasphemous_tirso_1(player)) - set_rule(world.get_location("Albero: Tirso's 2nd reward", player), - lambda state: state._blasphemous_tirso_2(player)) - set_rule(world.get_location("Albero: Tirso's 3rd reward", player), - lambda state: state._blasphemous_tirso_3(player)) - set_rule(world.get_location("Albero: Tirso's 4th reward", player), - lambda state: state._blasphemous_tirso_4(player)) - set_rule(world.get_location("Albero: Tirso's 5th reward", player), - lambda state: state._blasphemous_tirso_5(player)) - set_rule(world.get_location("Albero: Tirso's 6th reward", player), - lambda state: state._blasphemous_tirso_6(player)) - set_rule(world.get_location("Albero: Tirso's final reward", player), - lambda state: state._blasphemous_tirso_6(player) and \ - state.can_reach(world.get_region("Wall of the Holy Prohibitions", player)) and \ - state._blasphemous_silver_key(player) and \ - state._blasphemous_bronze_key(player)) - set_rule(world.get_location("Albero: Lvdovico's 1st reward", player), - lambda state: state._blasphemous_tentudia_1(player)) - set_rule(world.get_location("Albero: Lvdovico's 2nd reward", player), - lambda state: state._blasphemous_tentudia_2(player)) - set_rule(world.get_location("Albero: Lvdovico's 3rd reward", player), - lambda state: state._blasphemous_tentudia_3(player)) - set_rule(world.get_location("Ossuary: Isidora, Voice of the Dead", player), - lambda state: state._blasphemous_bones_30(player)) - set_rule(world.get_location("Ossuary: 1st reward", player), - lambda state: state._blasphemous_bones_4(player)) - set_rule(world.get_location("Ossuary: 2nd reward", player), - lambda state: state._blasphemous_bones_8(player)) - set_rule(world.get_location("Ossuary: 3rd reward", player), - lambda state: state._blasphemous_bones_12(player)) - set_rule(world.get_location("Ossuary: 4th reward", player), - lambda state: state._blasphemous_bones_16(player)) - set_rule(world.get_location("Ossuary: 5th reward", player), - lambda state: state._blasphemous_bones_20(player)) - set_rule(world.get_location("Ossuary: 6th reward", player), - lambda state: state._blasphemous_bones_24(player)) - set_rule(world.get_location("Ossuary: 7th reward", player), - lambda state: state._blasphemous_bones_28(player)) - set_rule(world.get_location("Ossuary: 8th reward", player), - lambda state: state._blasphemous_bones_32(player)) - set_rule(world.get_location("Ossuary: 9th reward", player), - lambda state: state._blasphemous_bones_36(player)) - set_rule(world.get_location("Ossuary: 10th reward", player), - lambda state: state._blasphemous_bones_40(player)) - set_rule(world.get_location("Ossuary: 11th reward", player), - lambda state: state._blasphemous_bones_44(player)) + # D01Z01S01 (The Holy Line) + # No items + # Doors + set_rule(world.get_entrance("D01Z01S01[S]", player), + lambda state: ( + can_break_holes(state, player) + or state.has("Purified Hand of the Nun", player) + )) - # All the Tears of the Sea - set_rule(world.get_location("AtTotS: Miriam's gift", player), - lambda state: state._blasphemous_2_masks(player) and \ - state._blasphemous_fall_relic(player) and \ - state._blasphemous_blood_relic(player) and \ - state._blasphemous_root_relic(player) and \ - state._blasphemous_miasma_relic(player)) - # Archcathedral Rooftops - set_rule(world.get_location("AR: Second soldier fight", player), - lambda state: state._blasphemous_1_mask(player)) - set_rule(world.get_location("AR: Third soldier fight", player), - lambda state: state._blasphemous_2_masks(player)) - set_rule(world.get_location("AR: Upper west shaft Child of Moonlight", player), - lambda state: state._blasphemous_1_mask(player)) - set_rule(world.get_location("AR: Upper west shaft chest", player), - lambda state: state._blasphemous_2_masks(player) and \ - state._blasphemous_fall_relic(player) and \ - state._blasphemous_root_relic(player)) - set_rule(world.get_location("AR: Lady of the Six Sorrows", player), - lambda state: state._blasphemous_blood_relic(player) and \ - state._blasphemous_miasma_relic(player) and \ - state._blasphemous_root_relic(player)) - set_rule(world.get_location("AR: Upper east shaft ledge", player), - lambda state: state._blasphemous_blood_relic(player) and \ - state._blasphemous_miasma_relic(player) and \ - state._blasphemous_root_relic(player) and \ - state._blasphemous_1_mask(player)) - set_rule(world.get_location("AR: Mea Culpa altar", player), - lambda state: state._blasphemous_blood_relic(player) and \ - state._blasphemous_miasma_relic(player) and \ - state._blasphemous_2_masks(player)) - set_rule(world.get_location("AR: Crisanta of the Wrapped Agony", player), - lambda state: state._blasphemous_3_masks(player)) - - # Bridge of the Three Cavalries - set_rule(world.get_location("BotTC: Esdras, of the Anointed Legion", player), - lambda state: state._blasphemous_bridge_access(player)) - set_rule(world.get_location("BotTC: Esdras' gift", player), - lambda state: state._blasphemous_bridge_access(player)) - set_rule(world.get_location("BotTC: Inside giant statue", player), - lambda state: state._blasphemous_bridge_access(player) and \ - state._blasphemous_laudes_gate(player)) - - # Brotherhood of the Silent Sorrow - set_rule(world.get_location("BotSS: Starting room Child of Moonlight", player), - lambda state: (state._blasphemous_blood_relic(player) and \ - (state._blasphemous_root_relic(player) or \ - state._blasphemous_fall_relic(player))) or \ - (state._blasphemous_root_relic(player) and \ - state._blasphemous_cherub_6(player)) or \ - state._blasphemous_taranto(player)) - set_rule(world.get_location("BotSS: Starting room ledge", player), - lambda state: state._blasphemous_blood_relic(player) and \ - state._blasphemous_fall_relic(player)) - set_rule(world.get_location("BotSS: Chamber of the Eldest Brother", player), - lambda state: state._blasphemous_elder_key(player)) - set_rule(world.get_location("BotSS: Blue candle", player), - lambda state: state._blasphemous_blue_wax(player)) - set_rule(world.get_location("BotSS: Outside church", player), - lambda state: state._blasphemous_blood_relic(player)) - set_rule(world.get_location("BotSS: Esdras' final gift", player), - lambda state: state._blasphemous_blood_relic(player) and \ - state._blasphemous_scapular(player) and \ - state._blasphemous_bridge_access(player)) - set_rule(world.get_location("BotSS: Crisanta's gift", player), - lambda state: state._blasphemous_blood_relic(player) and \ - state._blasphemous_scapular(player) and \ - state._blasphemous_heart_c(player) and \ - state._blasphemous_3_masks(player) and \ - state._blasphemous_bridge_access(player)) - - # Convent of our Lady of the Charred Visage - set_rule(world.get_location("CoOLotCV: Lower west statue", player), - lambda state: state._blasphemous_miasma_relic(player)) - set_rule(world.get_location("CoOLotCV: Lady of the Six Sorrows", player), - lambda state: state._blasphemous_bridge_access(player) and \ - state._blasphemous_1_mask(player) and \ - state._blasphemous_bronze_key(player) and \ - state._blasphemous_silver_key(player) and \ - state._blasphemous_high_key(player)) - set_rule(world.get_location("CoOLotCV: Red candle", player), - lambda state: state._blasphemous_red_wax(player)) - set_rule(world.get_location("CoOLotCV: Fountain of burning oil", player), - lambda state: state._blasphemous_thimble(player)) - set_rule(world.get_location("CoOLotCV: Mask room", player), - lambda state: state._blasphemous_bridge_access(player) and \ - state._blasphemous_1_mask(player) and \ - state._blasphemous_bronze_key(player) and \ - state._blasphemous_silver_key(player) and \ - state._blasphemous_high_key(player)) - - # Desecrated Cistern - set_rule(world.get_location("DC: Upper east tunnel chest", player), - lambda state: state._blasphemous_water_relic(player) or \ - state._blasphemous_fall_relic(player)) - set_rule(world.get_location("DC: Upper east Child of Moonlight", player), - lambda state: state._blasphemous_water_relic(player) or \ - state._blasphemous_fall_relic(player) or \ - state._blasphemous_cherub_13(player)) - set_rule(world.get_location("DC: Hidden alcove near fountain", player), - lambda state: state._blasphemous_water_relic(player)) - set_rule(world.get_location("DC: Shroud puzzle", player), - lambda state: state._blasphemous_corpse_relic(player) and \ - state._blasphemous_miasma_relic(player) and \ - state._blasphemous_water_relic(player)) - set_rule(world.get_location("DC: Chalice room", player), - lambda state: (state._blasphemous_miasma_relic(player) and \ - state._blasphemous_water_relic(player) and \ - state._blasphemous_root_relic(player)) or \ - (state._blasphemous_fall_relic(player) and \ - state._blasphemous_root_relic(player))) - set_rule(world.get_location("DC: Mea Culpa altar", player), - lambda state: state._blasphemous_chalice(player) and \ - state._blasphemous_bridge_access(player) and \ - state._blasphemous_1_mask(player) and \ - state._blasphemous_bronze_key(player) and \ - (state._blasphemous_miasma_relic(player) and \ - state._blasphemous_water_relic(player) and \ - state._blasphemous_root_relic(player) or \ - state._blasphemous_fall_relic(player) and \ - state._blasphemous_root_relic(player))) - set_rule(world.get_location("DC: Child of Moonlight, behind pillar", player), - lambda state: state._blasphemous_miasma_relic(player) and \ - state._blasphemous_water_relic(player)) - set_rule(world.get_location("DC: High ledge near elevator shaft", player), - lambda state: state._blasphemous_miasma_relic(player) and \ - state._blasphemous_water_relic(player)) - set_rule(world.get_location("DC: Elevator shaft Child of Moonlight", player), - lambda state: state._blasphemous_fall_relic(player) or \ - (state._blasphemous_miasma_relic(player) and \ - state._blasphemous_water_relic(player) and \ - state._blasphemous_cherub_22_23_31_32(player))) - set_rule(world.get_location("DC: Elevator shaft ledge", player), - lambda state: state._blasphemous_fall_relic(player)) - - # Graveyard of the Peaks - set_rule(world.get_location("GotP: Shop cave Child of Moonlight", player), - lambda state: state._blasphemous_blood_relic(player) or \ - state._blasphemous_fall_relic(player) or \ - state._blasphemous_cherub_22_23_31_32(player)) - # to do: or dive - set_rule(world.get_location("GotP: Shop cave hidden hole", player), - lambda state: state._blasphemous_blood_relic(player) or \ - state._blasphemous_open_holes(player)) - set_rule(world.get_location("GotP: Upper east shaft", player), - lambda state: state._blasphemous_blood_relic(player) and \ - state._blasphemous_root_relic(player)) - set_rule(world.get_location("GotP: East cliffside", player), - lambda state: state._blasphemous_blood_relic(player) and \ - state._blasphemous_root_relic(player)) - set_rule(world.get_location("GotP: West shaft Child of Moonlight", player), - lambda state: state._blasphemous_blood_relic(player) or \ - state._blasphemous_cherub_25(player)) - set_rule(world.get_location("GotP: Center shaft Child of Moonlight", player), - lambda state: state._blasphemous_fall_relic(player) or \ - state._blasphemous_cherub_24_33(player)) - # to do: requires dive - set_rule(world.get_location("GotP: Amanecida of the Bejeweled Arrow", player), - lambda state: state._blasphemous_bell(player) and \ - state._blasphemous_blood_relic(player) and \ - state._blasphemous_root_relic(player) and \ - state._blasphemous_open_holes(player)) - - # Grievance Ascends - set_rule(world.get_location("GA: Lower west ledge", player), - lambda state: state._blasphemous_miasma_relic(player)) - set_rule(world.get_location("GA: Miasma room floor", player), - lambda state: state._blasphemous_miasma_relic(player)) - set_rule(world.get_location("GA: Oil of the Pilgrims", player), - lambda state: state._blasphemous_blood_relic(player)) - set_rule(world.get_location("GA: End of blood bridge", player), - lambda state: state._blasphemous_blood_relic(player)) - set_rule(world.get_location("GA: Blood bridge Child of Moonlight", player), - lambda state: state._blasphemous_blood_relic(player) and \ - ((state._blasphemous_aubade(player) and \ - state._blasphemous_ranged(player)) or \ - state._blasphemous_cherub_21(player))) - set_rule(world.get_location("GA: Lower east Child of Moonlight", player), - lambda state: state._blasphemous_root_relic(player) or \ - state._blasphemous_cherub_20(player)) - set_rule(world.get_location("GA: Altasgracias' gift", player), - lambda state: state._blasphemous_altasgracias_3(player)) - set_rule(world.get_location("GA: Empty giant egg", player), - lambda state: state._blasphemous_altasgracias_3(player) and \ - state._blasphemous_egg(player)) - - # Hall of the Dawning - set_rule(world.get_location("HotD: Laudes, the First of the Amanecidas", player), - lambda state: state._blasphemous_bridge_access(player) and \ - state._blasphemous_laudes_gate(player)) - - # Jondo - set_rule(world.get_location("Jondo: Upper east chest", player), - lambda state: state._blasphemous_fall_relic(player) or \ - state._blasphemous_root_relic(player)) - set_rule(world.get_location("Jondo: Upper west tree root", player), - lambda state: state._blasphemous_root_relic(player) or \ - state._blasphemous_dawn_heart(player)) - - # Knot of the Three Words - set_rule(world.get_location("KotTW: Gift from the Traitor", player), - lambda state: state._blasphemous_wood_key(player) and \ - state._blasphemous_eyes(player)) - - # Library of the Negated Words - set_rule(world.get_location("LotNW: Root ceiling platform", player), - lambda state: state._blasphemous_root_relic(player)) - # to do: requires dive (sometimes opens with other skills?) - set_rule(world.get_location("LotNW: Hidden floor", player), - lambda state: state._blasphemous_open_holes(player)) - set_rule(world.get_location("LotNW: Miasma hallway chest", player), - lambda state: state._blasphemous_blood_relic(player) and \ - state._blasphemous_root_relic(player) and \ - state._blasphemous_miasma_relic(player)) - set_rule(world.get_location("LotNW: Platform puzzle chest", player), - lambda state: state._blasphemous_blood_relic(player)) - set_rule(world.get_location("LotNW: Elevator Child of Moonlight", player), - lambda state: state._blasphemous_blood_relic(player) and \ - state._blasphemous_root_relic(player)) - set_rule(world.get_location("LotNW: Red candle", player), - lambda state: state._blasphemous_red_wax(player)) - set_rule(world.get_location("LotNW: Twisted wood hidden wall", player), - lambda state: state._blasphemous_wood_key(player)) - - # Mercy Dreams - set_rule(world.get_location("MD: Blue candle", player), - lambda state: state._blasphemous_bridge_access(player) and \ - state._blasphemous_blue_wax(player)) - set_rule(world.get_location("MD: Cave Child of Moonlight", player), - lambda state: state._blasphemous_bridge_access(player) and \ - state._blasphemous_cherub_24_33(player)) - set_rule(world.get_location("MD: Behind gate to TSC", player), - lambda state: state._blasphemous_bridge_access(player)) - - # Mother of Mothers - set_rule(world.get_location("MoM: East chandelier platform", player), - lambda state: state._blasphemous_blood_relic(player) or \ - state._blasphemous_dawn_heart(player)) - set_rule(world.get_location("MoM: Redento's treasure", player), - lambda state: state._blasphemous_redento(player)) - set_rule(world.get_location("MoM: Final meeting with Redento", player), - lambda state: state._blasphemous_redento(player)) - set_rule(world.get_location("MoM: Giant chandelier statue", player), - lambda state: state._blasphemous_blood_relic(player)) - - # Mountains of the Endless Dusk - set_rule(world.get_location("MotED: Platform above chasm", player), - lambda state: state._blasphemous_blood_relic(player)) - set_rule(world.get_location("MotED: Blood platform alcove", player), - lambda state: state._blasphemous_blood_relic(player)) - set_rule(world.get_location("MotED: Egg hatching", player), - lambda state: state._blasphemous_pre_egg(player)) - # to do: requires dive - set_rule(world.get_location("MotED: Amanecida of the Golden Blades", player), - lambda state: state._blasphemous_bell(player) and \ - state._blasphemous_open_holes(player)) - - # Mourning and Havoc - set_rule(world.get_location("MaH: Upper east chest", player), - lambda state: state._blasphemous_bridge_access(player) and \ - state._blasphemous_root_relic(player)) - set_rule(world.get_location("MaH: Sierpes' eye", player), - lambda state: state._blasphemous_bridge_access(player) and \ - (state._blasphemous_root_relic(player) or \ - state._blasphemous_water_relic(player) or \ - state._blasphemous_dawn_heart(player))) - set_rule(world.get_location("MaH: Sierpes", player), - lambda state: state._blasphemous_bridge_access(player) and \ - (state._blasphemous_root_relic(player) or \ - state._blasphemous_water_relic(player) or \ - state._blasphemous_dawn_heart(player))) - - # Patio of the Silent Steps - set_rule(world.get_location("PotSS: Second area ledge", player), - lambda state: state._blasphemous_root_relic(player) or \ - state._blasphemous_dawn_heart(player)) - set_rule(world.get_location("PotSS: Third area upper ledge", player), - lambda state: state._blasphemous_root_relic(player) or \ - state._blasphemous_dawn_heart(player)) - set_rule(world.get_location("PotSS: Climb to WotHP", player), - lambda state: (state._blasphemous_blood_relic(player) and \ - state._blasphemous_root_relic(player)) or \ - (state.can_reach(world.get_region("Wall of the Holy Prohibitions", player)) and \ - state._blasphemous_bronze_key(player))) - # to do: requires dive - set_rule(world.get_location("PotSS: Amanecida of the Chiselled Steel", player), - lambda state: state._blasphemous_bell(player) and \ - state._blasphemous_open_holes(player)) - - # Petrous - # to do: requires dive - set_rule(world.get_location("Petrous: Temple entrance", player), - lambda state: state._blasphemous_open_holes(player)) - - # The Sleeping Canvases - set_rule(world.get_location("TSC: Candle wax puzzle", player), - lambda state: state._blasphemous_both_wax(player)) - set_rule(world.get_location("TSC: Under elevator shaft", player), - lambda state: state._blasphemous_fall_relic(player)) - set_rule(world.get_location("TSC: Jocinero's 1st reward", player), - lambda state: state._blasphemous_cherubs_20(player)) - set_rule(world.get_location("TSC: Jocinero's final reward", player), - lambda state: state._blasphemous_cherubs_all(player)) - - # The Holy Line + # D01Z01S02 (The Holy Line) + # Items set_rule(world.get_location("THL: Across blood platforms", player), - lambda state: state._blasphemous_blood_relic(player)) + lambda state: ( + state.has_any({"Blood Perpetuated in Sand", "Purified Hand of the Nun"}, player) + )) + # No doors + + + # D01Z01S03 (The Holy Line) + # Items set_rule(world.get_location("THL: Underground chest", player), - lambda state: state._blasphemous_blood_relic(player) and \ - state._blasphemous_water_relic(player)) - - # Wall of the Holy Prohibitions - set_rule(world.get_location("WotHP: Upper east room, top bronze cell", player), - lambda state: state._blasphemous_bronze_key(player)) - set_rule(world.get_location("WotHP: Upper east room, top silver cell", player), - lambda state: state._blasphemous_silver_key(player)) - set_rule(world.get_location("WotHP: Upper east room, center gold cell", player), - lambda state: state._blasphemous_gold_key(player)) - set_rule(world.get_location("WotHP: Upper west room, center gold cell", player), - lambda state: state._blasphemous_gold_key(player) and \ - state._blasphemous_bronze_key(player)) - set_rule(world.get_location("WotHP: Upper west room, top silver cell", player), - lambda state: state._blasphemous_silver_key(player) and \ - state._blasphemous_bronze_key(player)) - set_rule(world.get_location("WotHP: Lower west room, bottom gold cell", player), - lambda state: state._blasphemous_gold_key(player) and \ - state._blasphemous_bronze_key(player) and \ - state._blasphemous_root_relic(player) and \ - state._blasphemous_blood_relic(player) and \ - state._blasphemous_miasma_relic(player)) - set_rule(world.get_location("WotHP: Lower west room, top ledge", player), - lambda state: state._blasphemous_silver_key(player) and \ - state._blasphemous_bronze_key(player)) - set_rule(world.get_location("WotHP: Lower east room, hidden ledge", player), - lambda state: state._blasphemous_bronze_key(player)) - set_rule(world.get_location("WotHP: Lower east room, bottom silver cell", player), - lambda state: state._blasphemous_silver_key(player) and \ - state._blasphemous_bronze_key(player)) - set_rule(world.get_location("WotHP: Lower east room, top bronze cell", player), - lambda state: state._blasphemous_bronze_key(player)) - set_rule(world.get_location("WotHP: Lower east room, top silver cell", player), - lambda state: state._blasphemous_silver_key(player) and \ - state._blasphemous_bronze_key(player)) - set_rule(world.get_location("WotHP: Outside Child of Moonlight", player), - lambda state: state._blasphemous_silver_key(player) and \ - state._blasphemous_bronze_key(player)) - set_rule(world.get_location("WotHP: Oil of the Pilgrims", player), - lambda state: state._blasphemous_silver_key(player) and \ - state._blasphemous_bronze_key(player)) - set_rule(world.get_location("WotHP: Quirce, Returned By The Flames", player), - lambda state: state._blasphemous_silver_key(player) and \ - state._blasphemous_bronze_key(player)) - set_rule(world.get_location("WotHP: Collapsing floor ledge", player), - lambda state: state._blasphemous_silver_key(player) and \ - state._blasphemous_bronze_key(player)) - set_rule(world.get_location("WotHP: Amanecida of the Molten Thorn", player), - lambda state: state._blasphemous_bell(player) and \ - state._blasphemous_silver_key(player) and \ - state._blasphemous_bronze_key(player)) + lambda state: ( + state.has_all({"Blood Perpetuated in Sand", "Dash Ability"}, player) + and can_water_jump(state, player) + )) + # No doors - # Wasteland of the Buried Churches + + # D01Z02S01 (Albero) + # Items + set_rule(world.get_location("Albero: Bless Linen Cloth", player), + lambda state: state.has("Linen Cloth", player)) + set_rule(world.get_location("Albero: Bless Hatched Egg", player), + lambda state: state.has("Hatched Egg of Deformity", player)) + set_rule(world.get_location("Albero: Bless Severed Hand", player), + lambda state: state.has("Severed Hand", player)) + # No doors + + + # D01Z02S02 (Albero) + # Items + set_rule(world.get_location("Albero: Tirso's 1st reward", player), + lambda state: state.has_group("tirso", player, 1)) + set_rule(world.get_location("Albero: Tirso's 2nd reward", player), + lambda state: state.has_group("tirso", player, 2)) + set_rule(world.get_location("Albero: Tirso's 3rd reward", player), + lambda state: state.has_group("tirso", player, 3)) + set_rule(world.get_location("Albero: Tirso's 4th reward", player), + lambda state: state.has_group("tirso", player, 4)) + set_rule(world.get_location("Albero: Tirso's 5th reward", player), + lambda state: state.has_group("tirso", player, 5)) + set_rule(world.get_location("Albero: Tirso's 6th reward", player), + lambda state: state.has_group("tirso", player, 6)) + set_rule(world.get_location("Albero: Tirso's final reward", player), + lambda state: ( + state.has_group("tirso", player, 6) + and can_beat_boss(state, "Mercy", logic, player) + and can_beat_boss(state, "Convent", logic, player) + and can_beat_boss(state, "Grievance", logic, player) + and can_beat_boss(state, "Mothers", logic, player) + and can_beat_boss(state, "Canvases", logic, player) + and can_beat_boss(state, "Prison", logic, player) + )) + # No doors + + + # D01Z02S03 (Albero) + # Items + set_rule(world.get_location("Albero: Child of Moonlight", player), + lambda state: ( + state.has("RodeGOTPElevator", player) + or pillar(state, player) + or state.has("Cante Jondo of the Three Sisters", player) + or state.has("D01Z02S03[NW]", player) and ( + can_cross_gap(state, logic, player, 2) + or state.has("Lorquiana", player) + or aubade(state, player) + or state.has("Cantina of the Blue Rose", player) + or can_air_stall(state, logic, player) + or charge_beam(state, player) + ) + )) + set_rule(world.get_location("Albero: Lvdovico's 1st reward", player), + lambda state: state.has_group("tentudia", player, 1)) + set_rule(world.get_location("Albero: Lvdovico's 2nd reward", player), + lambda state: state.has_group("tentudia", player, 2)) + set_rule(world.get_location("Albero: Lvdovico's 3rd reward", player), + lambda state: state.has_group("tentudia", player, 3)) + set_rule(world.get_location("Albero: First gift for Cleofas", player), + lambda state: state.has("D04Z02S10[W]", player)) + # Doors + set_rule(world.get_entrance("D01Z02S03[NW]", player), + lambda state: ( + state.has("D02Z02S11[NW]", player) + or state.has("D02Z02S11[NE]", player) + or state.has("D02Z02S11[W]", player) + or state.has("D02Z02S11[E]", player) + or state.has("D02Z02S11[SE]", player) + )) + set_rule(world.get_entrance("D01Z02S03[church]", player), + lambda state: ( + can_beat_boss(state, "Mercy", logic, player) + or can_beat_boss(state, "Convent", logic, player) + or can_beat_boss(state, "Grievance", logic, player) + )) + + + # D01BZ04S01 (Albero: Inside church) + # Items + set_rule(world.get_location("Albero: Final gift for Cleofas", player), + lambda state: ( + state.has_group("marks", player, 3) + and state.has("Cord of the True Burying", player) + and state.has("D04Z02S10[W]", player) + and state.has("D06Z01S18[E]", player) + )) + # No doors + + + # D01BZ06S01 (Ossuary) + # Items + set_rule(world.get_location("Ossuary: 1st reward", player), + lambda state: state.has_group("bones", player, 4)) + set_rule(world.get_location("Ossuary: 2nd reward", player), + lambda state: state.has_group("bones", player, 8)) + set_rule(world.get_location("Ossuary: 3rd reward", player), + lambda state: state.has_group("bones", player, 12)) + set_rule(world.get_location("Ossuary: 4th reward", player), + lambda state: state.has_group("bones", player, 16)) + set_rule(world.get_location("Ossuary: 5th reward", player), + lambda state: state.has_group("bones", player, 20)) + set_rule(world.get_location("Ossuary: 6th reward", player), + lambda state: state.has_group("bones", player, 24)) + set_rule(world.get_location("Ossuary: 7th reward", player), + lambda state: state.has_group("bones", player, 28)) + set_rule(world.get_location("Ossuary: 8th reward", player), + lambda state: state.has_group("bones", player, 32)) + set_rule(world.get_location("Ossuary: 9th reward", player), + lambda state: state.has_group("bones", player, 36)) + set_rule(world.get_location("Ossuary: 10th reward", player), + lambda state: state.has_group("bones", player, 40)) + set_rule(world.get_location("Ossuary: 11th reward", player), + lambda state: state.has_group("bones", player, 44)) + # Doors + set_rule(world.get_entrance("D01BZ06S01[E]", player), + lambda state: state.has_group("bones", player, 30)) + + + # D01BZ08S01 (Isidora) + # Items + set_rule(world.get_location("Ossuary: Isidora, Voice of the Dead", player), + lambda state: can_beat_boss(state, "Ossuary", logic, player)) + # No doors + + + # D01Z03S01 (Wasteland of the Buried Churches) + # Items + set_rule(world.get_location("WotBC: Lower log path", player), + lambda state: state.has("D01Z03S01[SE]", player)) + # No doors + + + # D01Z03S02 (Wasteland of the Buried Churches) + # Items + set_rule(world.get_location("WotBC: Hidden alcove", player), + lambda state: state.has("Dash Ability", player)) + # No doors + + + # D01Z03S03 (Wasteland of the Buried Churches) + # No items + # Doors + set_rule(world.get_entrance("D01Z03S03[-Cherubs]", player), + lambda state: state.has("Linen of Golden Thread", player)) + + + # D01Z03S05 (Wasteland of the Buried Churches) + # Items set_rule(world.get_location("WotBC: Under broken bridge", player), - lambda state: state._blasphemous_blood_relic(player) or \ - state._blasphemous_dawn_heart(player)) + lambda state: ( + state.has_any({"Blood Perpetuated in Sand", "Boots of Pleading"}, player) + or can_cross_gap(state, logic, player, 3) + )) + # Doors + set_rule(world.get_entrance("D01Z03S05[Cherubs]", player), + lambda state: state.has("Linen of Golden Thread", player)) + + + # D01Z03S06 (Wasteland of the Buried Churches) + # Items + set_rule(world.get_location("WotBC: 3rd meeting with Redento", player), + lambda state: redento(state, blasphemousworld, player, 3)) + # No doors + + + # D01Z03S07 (Wasteland of the Buried Churches) + # Items set_rule(world.get_location("WotBC: Cliffside Child of Moonlight", player), - lambda state: state._blasphemous_cherub_38(player)) + lambda state: ( + can_cross_gap(state, logic, player, 1) + or aubade(state, player) + or charge_beam(state, player) + or state.has_any({"Lorquiana", "Cante Jondo of the Three Sisters", "Cantina of the Blue Rose", "Cloistered Ruby"}, player) + )) + # Doors + set_rule(world.get_entrance("D01Z03S07[-Cherubs]", player), + lambda state: state.has("Linen of Golden Thread", player)) - # Where Olive Trees Wither - set_rule(world.get_location("WOTW: Gift for the tomb", player), - lambda state: state._blasphemous_full_thimble(player)) - set_rule(world.get_location("WOTW: Underground tomb", player), - lambda state: state._blasphemous_flowers(player) and \ - (state._blasphemous_full_thimble(player) or \ - state._blasphemous_fall_relic(player))) - set_rule(world.get_location("WOTW: Underground Child of Moonlight", player), - lambda state: (state._blasphemous_full_thimble(player) or \ - state._blasphemous_fall_relic(player)) and \ - state._blasphemous_cherub_27(player)) - set_rule(world.get_location("WOTW: Underground ledge", player), - lambda state: (state._blasphemous_full_thimble(player) or \ - state._blasphemous_fall_relic(player)) and \ - state._blasphemous_blood_relic(player)) - set_rule(world.get_location("WOTW: Upper east Child of Moonlight", player), - lambda state: state._blasphemous_root_relic(player) or \ - state._blasphemous_cherub_22_23_31_32(player)) - set_rule(world.get_location("WOTW: Upper east statue", player), - lambda state: state._blasphemous_root_relic(player)) + + # D01Z04S01 (Mercy Dreams) + # No items + # Doors + set_rule(world.get_entrance("D01Z04S01[SE]", player), + lambda state: state.has("D01Z04S01[S]", player)) + set_rule(world.get_entrance("D01Z04S01[S]", player), + lambda state: state.has("D01Z04S01[SE]", player)) + + + # D01Z04S09 (Mercy Dreams) + # No items + # Doors + set_rule(world.get_entrance("D01Z04S09[W]", player), + lambda state: state.has("OpenedDCGateE", player)) + + + # D01Z04S13 (Mercy Dreams) + # Items + set_rule(world.get_location("MD: Behind gate to TSC", player), + lambda state: ( + state.has("D01Z04S13[SE]", player) + or can_dive_laser(state, logic, player) and ( + can_air_stall(state, logic, player) + or state.has_any({"The Young Mason's Wheel", "Purified Hand of the Nun"}, player) + or can_enemy_bounce(logic, enemy) + ) + )) + # Doors + set_rule(world.get_entrance("D01Z04S13[SE]", player), + lambda state: ( + can_dive_laser(state, logic, player) and ( + can_air_stall(state, logic, player) + or state.has_any({"The Young Mason's Wheel", "Purified Hand of the Nun"}, player) + or can_enemy_bounce(logic, enemy) + ) + )) + + + # D01Z04S14 (Mercy Dreams) + # Items + set_rule(world.get_location("MD: Sliding challenge", player), + lambda state: state.has("Dash Ability", player)) + # No doors + + + # D01Z04S15 (Mercy Dreams) + # No items + # Doors + set_rule(world.get_entrance("D01Z04S15[W]", player), + lambda state: ( + state.has("D01Z04S15[E]", player) + or state.has("D01Z04S15[SW]", player) + or state.has("D01Z04S15[SE]", player) + )) + set_rule(world.get_entrance("D01Z04S15[E]", player), + lambda state: ( + state.has("D01Z04S15[W]", player) + or state.has("D01Z04S15[SW]", player) + or state.has("D01Z04S15[SE]", player) + )) + set_rule(world.get_entrance("D01Z04S15[SW]", player), + lambda state: ( + state.has("D01Z04S15[W]", player) + or state.has("D01Z04S15[E]", player) + or state.has("D01Z04S15[SE]", player) + )) + set_rule(world.get_entrance("D01Z04S15[SE]", player), + lambda state: ( + state.has("D01Z04S15[W]", player) + or state.has("D01Z04S15[E]", player) + or state.has("D01Z04S15[SW]", player) + )) + + + # D01Z04S16 (Mercy Dreams) + # Items + set_rule(world.get_location("MD: Cave Child of Moonlight", player), + lambda state: ( + state.has_any({"Purified Hand of the Nun", "Cante Jondo of the Three Sisters"}, player) + or pillar(state, player) + or tirana(state, player) + )) + # No doors + + + # D01Z04S18 (Ten Piedad) + # Items + set_rule(world.get_location("MD: Ten Piedad", player), + lambda state: can_beat_boss(state, "Mercy", logic, player)) + # Doors + set_rule(world.get_entrance("D01Z04S18[W]", player), + lambda state: can_beat_boss(state, "Mercy", logic, player)) + set_rule(world.get_entrance("D01Z04S18[E]", player), + lambda state: can_beat_boss(state, "Mercy", logic, player)) + + + # D01Z05S02 (Desecrated Cistern) + # No items + # Doors + set_rule(world.get_entrance("D01Z05S02[S]", player), + lambda state: state.has("OpenedDCLadder", player)) + + + # D01Z05S05 (Desecrated Cistern) + # Items + set_rule(world.get_location("DC: Hidden alcove near fountain", player), + lambda state: ( + state.has("Dash Ability", player) + and can_water_jump(state, player) + )) + # No doors + + + # D01Z05S06 (Desecrated Cistern) + # Items + set_rule(world.get_location("DC: Upper east tunnel chest", player), + lambda state: ( + state.has("D01Z05S06[Cherubs]", player) + or can_water_jump(state, player) + )) + set_rule(world.get_location("DC: Upper east Child of Moonlight", player), + lambda state: ( + state.has("D01Z05S06[Cherubs]", player) + or can_water_jump(state, player) + or pillar(state, player) + or state.has("Cante Jondo of the Three Sisters", player) + or aubade(state, player) + or tirana(state, player) + or can_air_stall(state, logic, player) + )) + # No doors + + + # D01Z05S12 (Desecrated Cistern) + # Event + set_rule(world.get_location("OpenedDCGateE", player), + lambda state: opened_dc_gate_e(state, player)) + + + # D01Z05S13 (Desecrated Cistern) + # Items + set_rule(world.get_location("DC: Child of Moonlight, behind pillar", player), + lambda state: ( + state.has("D01Z05S13[SW]", player) + or state.has("D01Z05S13[E]", player) + and can_survive_poison(state, logic, player, 3) + and can_water_jump(state, player) + )) + # Doors + set_rule(world.get_entrance("D01Z05S13[SW]", player), + lambda state: state.has("D01Z05S13[E]", player)) + add_rule(world.get_entrance("D01Z05S13[SW]", player), + lambda state: ( + can_survive_poison(state, logic, player, 3) + and can_water_jump(state, player) + )) + set_rule(world.get_entrance("D01Z05S13[N]", player), + lambda state: state.has("D01Z05S13[E]", player)) + add_rule(world.get_entrance("D01Z05S13[N]", player), + lambda state: ( + can_survive_poison(state, logic, player, 3) + and can_water_jump(state, player) + )) + + + # D01Z05S17 (Desecrated Cistern) + # Items + set_rule(world.get_location("DC: High ledge near elevator shaft", player), + lambda state: ( + state.has("D01Z05S17[E]", player) + or can_water_jump(state, player) + or can_cross_gap(state, logic, player, 5) + )) + # Doors + set_rule(world.get_entrance("D01Z05S17[E]", player), + lambda state: ( + state.has("Dash Ability", player) and ( + can_water_jump(state, player) + or can_cross_gap(state, logic, player, 5) + ) + )) + + + # D01Z05S20 (Desecrated Cistern) + # Event + set_rule(world.get_location("OpenedDCLadder", player), + lambda state: opened_dc_ladder(state, player)) + + + # D01Z05S21 (Desecrated Cistern) + # No items + # Doors + set_rule(world.get_entrance("D01Z05S21[Reward]", player), + lambda state: state.has("Shroud of Dreamt Sins", player)) + + + # D01Z05S23 (Desecrated Cistern) + # No items + # Doors + set_rule(world.get_entrance("D01Z05S23[W]", player), + lambda state: ( + chalice_rooms(state, player, 3) + and state.has("Chalice of Inverted Verses", player) + )) + + + # D01Z05S24 (Desecrated Cistern) + # Event + set_rule(world.get_location("OpenedDCGateW", player), + lambda state: opened_dc_gate_w(state, player)) + + + # D01Z05S25 (Desecrated Cistern) + # Items + set_rule(world.get_location("DC: Elevator shaft ledge", player), + lambda state: state.has("Linen of Golden Thread", player)) + set_rule(world.get_location("DC: Elevator shaft Child of Moonlight", player), + lambda state: ( + state.has("Linen of Golden Thread", player) + or ( + pillar(state, player) + and ( + state.has("D01Z05S25[E]", player) + or state.has("D01Z05S25[W]", player) + and ( + can_walk_on_root(state, player) + or can_cross_gap(state, logic, player, 3) + ) + ) + ) + )) + # Doors + set_rule(world.get_entrance("D01Z05S25[NE]", player), + lambda state: ( + state.has("Linen of Golden Thread", player) + or state.has("D01Z05S25[SW]", player) + or state.has("D01Z05S25[SE]", player) + )) + set_rule(world.get_entrance("D01Z05S25[W]", player), + lambda state: ( + ( + state.has("Linen of Golden Thread", player) + and ( + can_walk_on_root(state, player) + or state.has("Purified Hand of the Nun", player) + or can_air_stall(state, logic, player) + ) + ) + or ( + state.has("D01Z05S25[E]", player) + and ( + can_walk_on_root(state, player) + or can_cross_gap(state, logic, player, 3) + ) + ) + )) + set_rule(world.get_entrance("D01Z05S25[E]", player), + lambda state: ( + can_break_tirana(state, logic, player) + and ( + state.has("Linen of Golden Thread", player) + or state.has("D01Z05S25[W]", player) + and ( + can_walk_on_root(state, player) + or can_cross_gap(state, logic, player, 3) + ) + ) + )) + set_rule(world.get_entrance("D01Z05S25[SW]", player), + lambda state: ( + state.has("D01Z05S25[SE]", player) + or state.has("D01Z05S25[NE]", player) + or state.has("Linen of Golden Thread", player) + )) + set_rule(world.get_entrance("D01Z05S25[SE]", player), + lambda state: ( + state.has("D01Z05S25[SW]", player) + or state.has("D01Z05S25[NE]", player) + or state.has("Linen of Golden Thread", player) + )) + set_rule(world.get_entrance("D01Z05S25[EchoesW]", player), + lambda state: state.has("D01Z05S25[EchoesE]", player)) + add_rule(world.get_entrance("D01Z05S25[EchoesW]", player), + lambda state: ( + ( + state.has("D01Z05S25[EchoesE]", player) + and ( + state.has("Blood Perpetuated in Sand", player) + or can_cross_gap(state, logic, player, 8) + ) + ) + or state.has_all({"Linen of Golden Thread", "Purified Hand of the Nun"}, player) + )) + set_rule(world.get_entrance("D01Z05S25[EchoesE]", player), + lambda state: state.has("D01Z05S25[EchoesW]", player)) + add_rule(world.get_entrance("D01Z05S25[EchoesE]", player), + lambda state: ( + ( + state.has("D01Z05S25[EchoesW]", player) + and ( + state.has("Blood Perpetuated in Sand", player) + or can_cross_gap(state, logic, player, 8) + ) + ) + or state.has_all({"Linen of Golden Thread", "Purified Hand of the Nun"}, player) + )) + + + # D01Z06S01 (Petrous) + # No items + # Doors + set_rule(world.get_entrance("D01Z06S01[Santos]", player), + lambda state: state.has("Petrified Bell", player)) + + + # D02Z01S01 (Where Olive Trees Wither) + # Items + set_rule(world.get_location("WOTW: Below Prie Dieu", player), + lambda state: ( + state.has("D02Z01S01[W]", player) + or state.has("D02Z01S01[CherubsL]", player) + or state.has("D02Z01S01[SW]", player) + or state.has("D02Z01S01[CherubsR]", player) + or state.has_any({"Purified Hand of the Nun", "Wall Climb Ability"}, player) + )) + set_rule(world.get_location("WOTW: Gemino's gift", player), + lambda state: ( + state.has("D02Z01S01[W]", player) + or state.has("D02Z01S01[CherubsL]", player) + or state.has_any({"Purified Hand of the Nun", "Wall Climb Ability"}, player) + or ( + ( + state.has("D02Z01S01[SW]", player) + or state.has("D02Z01S01[CherubsR]", player) + ) + and can_dawn_jump(state, logic, player) + ) + )) set_rule(world.get_location("WOTW: Gemino's reward", player), - lambda state: state._blasphemous_full_thimble(player)) + lambda state: ( + state.has("Golden Thimble Filled with Burning Oil", player) + and ( + state.has("D02Z01S01[W]", player) + or state.has("D02Z01S01[CherubsL]", player) + or state.has_any({"Purified Hand of the Nun", "Wall Climb Ability"}, player) + or ( + ( + state.has("D02Z01S01[SW]", player) + or state.has("D02Z01S01[CherubsR]", player) + ) + and can_dawn_jump(state, logic, player) + ) + ) + )) + # Doors + set_rule(world.get_entrance("D02Z01S01[SW]", player), + lambda state: ( + state.has("OpenedWOTWCave", player) + and ( + state.has("D02Z01S01[W]", player) + or state.has("D02Z01S01[CherubsL]", player) + or state.has("D02Z01S01[CherubsR]", player) + or state.has_any({"Purified Hand of the Nun", "Wall Climb Ability"}, player) + ) + )) + set_rule(world.get_entrance("D02Z01S01[W]", player), + lambda state: ( + state.has("D02Z01S01[CherubsL]", player) + or state.has_any({"Purified Hand of the Nun", "Wall Climb Ability"}, player) + or ( + ( + state.has("D02Z01S01[SW]", player) + or state.has("D02Z01S01[CherubsR]", player) + ) + and can_dawn_jump(state, logic, player) + ) + )) - # Various - set_rule(world.get_location("Confessor Dungeon 1 extra", player), - lambda state: state._blasphemous_bead(player)) - set_rule(world.get_location("Confessor Dungeon 1 main", player), - lambda state: state._blasphemous_bead(player)) - set_rule(world.get_location("Confessor Dungeon 2 extra", player), - lambda state: state._blasphemous_bead(player)) - set_rule(world.get_location("Confessor Dungeon 2 main", player), - lambda state: state._blasphemous_bead(player)) - set_rule(world.get_location("Confessor Dungeon 3 extra", player), - lambda state: state._blasphemous_bead(player)) - set_rule(world.get_location("Confessor Dungeon 3 main", player), - lambda state: state._blasphemous_bead(player)) - set_rule(world.get_location("Confessor Dungeon 4 extra", player), - lambda state: state._blasphemous_bead(player)) - set_rule(world.get_location("Confessor Dungeon 4 main", player), - lambda state: state._blasphemous_bead(player)) - set_rule(world.get_location("Confessor Dungeon 5 extra", player), - lambda state: state._blasphemous_bead(player) and \ - state._blasphemous_bridge_access(player)) - set_rule(world.get_location("Confessor Dungeon 5 main", player), - lambda state: state._blasphemous_bead(player) and \ - state._blasphemous_bridge_access(player)) - set_rule(world.get_location("Confessor Dungeon 6 extra", player), - lambda state: state._blasphemous_bead(player) and \ - state._blasphemous_bridge_access(player) and \ - (state._blasphemous_blood_relic(player) or \ - state._blasphemous_1_mask(player) and \ - state._blasphemous_silver_key(player) and \ - state._blasphemous_bronze_key(player))) - set_rule(world.get_location("Confessor Dungeon 6 main", player), - lambda state: state._blasphemous_bead(player) and \ - state._blasphemous_bridge_access(player) and \ - (state._blasphemous_blood_relic(player) or \ - state._blasphemous_1_mask(player) and \ - state._blasphemous_silver_key(player) and \ - state._blasphemous_bronze_key(player))) - set_rule(world.get_location("Confessor Dungeon 7 extra", player), - lambda state: state._blasphemous_bead(player) and \ - state._blasphemous_bridge_access(player) and \ - state._blasphemous_1_mask(player) and \ - state._blasphemous_bronze_key(player) and \ - state._blasphemous_silver_key(player) and \ - state._blasphemous_blood_relic(player)) - set_rule(world.get_location("Confessor Dungeon 7 main", player), - lambda state: state._blasphemous_bead(player) and \ - state._blasphemous_bridge_access(player) and \ - state._blasphemous_1_mask(player) and \ - state._blasphemous_bronze_key(player) and \ - state._blasphemous_silver_key(player) and \ - state._blasphemous_blood_relic(player)) - # to do: requires dive + + # D02Z01S02 (Where Olive Trees Wither) + # Items + set_rule(world.get_location("WOTW: Upper east Child of Moonlight", player), + lambda state: ( + state.has("D02Z01S02[NE]", player) + or ( + state.has("D02Z01S02[NW]", player) + or state.has_any({"Purified Hand of the Nun", "Wall Climb Ability"}, player) + ) + and ( + can_walk_on_root(state, player) + or can_cross_gap(state, logic, player, 4) + or pillar(state, player) + ) + )) + # Doors + set_rule(world.get_entrance("D02Z01S02[NW]", player), + lambda state: ( + state.has_any({"Purified Hand of the Nun", "Wall Climb Ability"}, player) + or ( + state.has("D02Z01S02[NE]", player) + and can_walk_on_root(state, player) + and can_cross_gap(state, logic, player, 5) + ) + )) + set_rule(world.get_entrance("D02Z01S02[NE]", player), + lambda state: ( + ( + state.has("Purified Hand of the Nun", player) + and can_enemy_bounce(logic, enemy) + ) + or ( + state.has("D02Z01S02[NW]", player) + or state.has("Wall Climb Ability", player) + or state.has("Purified Hand of the Nun", player) + ) + and ( + can_walk_on_root(state, player) + or can_cross_gap(state, logic, player, 10) + ) + )) + set_rule(world.get_entrance("D02Z01S02[]", player), + lambda state: state.has("Linen of Golden Thread", player)) + + + # D02Z01S03 (Where Olive Trees Wither) + # No items + # Doors + set_rule(world.get_entrance("D02Z01S03[W]", player), + lambda state: ( + state.has("D02Z01S03[SE]", player) + or state.has("D02Z01S03[Cherubs]", player) + or state.has("Wall Climb Ability", player) + )) + set_rule(world.get_entrance("D02Z01S03[SE]", player), + lambda state: ( + state.has("D02Z01S03[W]", player) + or state.has("D02Z01S03[Cherubs]", player) + or state.has("Wall Climb Ability", player) + )) + + + # D02Z01S04 (Where Olive Trees Wither) + # Items + set_rule(world.get_location("WOTW: Gift for the tomb", player), + lambda state: ( + state.has("Golden Thimble Filled with Burning Oil", player) + and ( + state.has("D02Z01S01[W]", player) + or state.has("D02Z01S01[CherubsL]", player) + or state.has_any({"Purified Hand of the Nun", "Wall Climb Ability"}, player) + or ( + ( + state.has("D02Z01S01[SW]", player) + or state.has("D02Z01S01[CherubsR]", player) + ) + and can_dawn_jump(state, logic, player) + ) + ) + )) + # Doors + set_rule(world.get_entrance("D02Z01S04[-N]", player), + lambda state: ( + state.has("Golden Thimble Filled with Burning Oil", player) + and ( + state.has("D02Z01S01[W]", player) + or state.has("D02Z01S01[CherubsL]", player) + or state.has_any({"Purified Hand of the Nun", "Wall Climb Ability"}, player) + or ( + ( + state.has("D02Z01S01[SW]", player) + or state.has("D02Z01S01[CherubsR]", player) + ) + and can_dawn_jump(state, logic, player) + ) + ) + )) + + + # D02Z01S06 (Where Olive Trees Wither) + # Items + set_rule(world.get_location("WOTW: Underground ledge", player), + lambda state: ( + state.has_all({"Wall Climb Ability", "Blood Perpetuated in Sand"}, player) + and ( + state.has("Dash Ability", player) + or state.has("D02Z01S06[Cherubs]", player) + ) + or state.has("Purified Hand of the Nun", player) + and ( + state.has("D02Z01S06[Cherubs]", player) + or state.has("D02Z01S06[E]", player) + or state.has_any({"Wall Climb Ability", "Dash Ability"}, player) + ) + )) + set_rule(world.get_location("WOTW: Underground Child of Moonlight", player), + lambda state: ( + ( + state.has("D02Z01S06[W]", player) + or state.has("Dash Ability", player) + or state.has_all({"Purified Hand of the Nun", "Wall Climb Ability"}, player) + ) + and ( + pillar(state, player) + or state.has("Cante Jondo of the Three Sisters", player) + ) + or ( + state.has("D02Z01S06[W]", player) + or state.has_any({"Purified Hand of the Nun", "Dash Ability"}, player) + ) + and state.has("Wall Climb Ability", player) + and ( + state.has_any({"Lorquiana", "Cantina of the Blue Rose"}, player) + or aubade(state, player) + or can_air_stall(state, logic, player) + ) + )) + # Doors + set_rule(world.get_entrance("D02Z01S06[W]", player), + lambda state: ( + state.has("Dash Ability", player) + or state.has_all({"Purified Hand of the Nun", "Wall Climb Ability"}, player) + )) + set_rule(world.get_entrance("D02Z01S06[E]", player), + lambda state: state.has("Wall Climb Ability", player)) + # Event + set_rule(world.get_location("OpenedWOTWCave", player), + lambda state: opened_wotw_cave(state, player)) + + + # D02Z01S08 (Where Olive Trees Wither) + # Items + set_rule(world.get_location("WOTW: Underground tomb", player), + lambda state: state.has("Dried Flowers bathed in Tears", player)) + # No doors + + + # D02Z01S09 (Where Olive Trees Wither) + # Items + set_rule(world.get_location("WOTW: Upper east statue", player), + lambda state: ( + can_walk_on_root(state, player) + or can_cross_gap(state, logic, player, 11) + or state.has("Purified Hand of the Nun", player) + and can_enemy_bounce(logic, enemy) + )) + # Doors + set_rule(world.get_entrance("D02Z01S09[-CherubsL]", player), + lambda state: state.has("Linen of Golden Thread", player)) + set_rule(world.get_entrance("D02Z01S09[-CherubsR]", player), + lambda state: ( + state.has("Linen of Golden Thread", player) + and ( + can_walk_on_root(state, player) + or can_cross_gap(state, logic, player, 2) + or can_enemy_bounce(logic, enemy) + and can_air_stall(state, logic, player) + ) + )) + + + # D02Z02S01 (Graveyard of the Peaks) + # No items + # Doors + set_rule(world.get_entrance("D02Z02S01[W]", player), + lambda state: ( + state.has("D02Z02S01[NW]", player) + or state.has("D02Z02S01[Cherubs]", player) + or state.has("Dash Ability", player) + )) + set_rule(world.get_entrance("D02Z02S01[NW]", player), + lambda state: ( + state.has("D02Z02S01[Cherubs]", player) + or state.has("Wall Climb Ability", player) + and ( + state.has("D02Z02S01[W]", player) + or state.has("Dash Ability", player) + ) + )) + set_rule(world.get_entrance("D02Z02S01[E]", player), + lambda state: ( + state.has("D02Z02S01[NW]", player) + or state.has("D02Z02S01[Cherubs]", player) + or state.has_any({"Wall Climb Ability", "Dash Ability"}, player) + )) + + + # D02Z02S02 (Graveyard of the Peaks) + # Items + set_rule(world.get_location("GotP: Center shaft Child of Moonlight", player), + lambda state: ( + state.has("D02Z02S02[CherubsL]", player) + or state.has("D02Z02S02[CherubsR]", player) + or ( + ( + state.has("D02Z02S02[NW]", player) + or state.has("D02Z02S02[NE]", player) + or state.has("Wall Climb Ability", player) + ) + and ( + state.has_any({"Purified Hand of the Nun", "Cante Jondo of the Three Sisters"}, player) + or pillar(state, player) + or tirana(state, player) + or can_dive_laser(state, logic, player) + ) + ) + )) + # Doors + set_rule(world.get_entrance("D02Z02S02[NW]", player), + lambda state: ( + state.has("D02Z02S02[NE]", player) + or state.has("D02Z02S02[CherubsL]", player) + or state.has("D02Z02S02[CherubsR]", player) + or state.has("Wall Climb Ability", player) + )) + set_rule(world.get_entrance("D02Z02S02[NE]", player), + lambda state: ( + state.has("D02Z02S02[NW]", player) + or state.has("D02Z02S02[CherubsL]", player) + or state.has("D02Z02S02[CherubsR]", player) + or state.has("Wall Climb Ability", player) + )) + set_rule(world.get_entrance("D02Z02S02[-CherubsR]", player), + lambda state: state.has("Linen of Golden Thread", player)) + + + # D02Z02S03 (Graveyard of the Peaks) + # Items + set_rule(world.get_location("GotP: Lower east shaft", player), + lambda state: ( + state.has("D02Z02S03[NW]", player) + or state.has("D02Z02S03[NE]", player) + or state.has("Wall Climb Ability", player) + or can_cross_gap(state, logic, player, 2) + )) + set_rule(world.get_location("GotP: Center east shaft", player), + lambda state: ( + state.has("D02Z02S03[NW]", player) + or state.has("D02Z02S03[NE]", player) + or state.has_any({"Wall Climb Ability", "Purified Hand of the Nun"}, player) + )) + set_rule(world.get_location("GotP: Upper east shaft", player), + lambda state: ( + ( + can_climb_on_root(state, player) + and state.has("Purified Hand of the Nun", player) + ) + or ( + state.has("Blood Perpetuated in Sand", player) + and ( + state.has("Purified Hand of the Nun", player) + or can_climb_on_root(state, player) + ) + ) + )) + # Doors + set_rule(world.get_entrance("D02Z02S03[NW]", player), + lambda state: ( + state.has_any({"Purified Hand of the Nun", "Wall Climb Ability"}, player) + or state.has("D02Z02S03[NE]", player) + and can_walk_on_root(state, player) + )) + set_rule(world.get_entrance("D02Z02S03[NE]", player), + lambda state: ( + state.has("Wall Climb Ability", player) + and ( + can_cross_gap(state, logic, player, 11) + or ( + state.has("Blood Perpetuated in Sand", player) + and ( + can_walk_on_root(state, player) + or can_cross_gap(state, logic, player, 7) + ) + ) + or ( + can_walk_on_root(state, player) + and ( + state.has("Purified Hand of the Nun", player) + or can_air_stall(state, logic, player) + ) + ) + ) + )) + set_rule(world.get_entrance("D02Z02S03[-Cherubs]", player), + lambda state: state.has("Linen of Golden Thread", player)) + + + # D02Z02S04 (Graveyard of the Peaks) + # Items + set_rule(world.get_location("GotP: Lower west shaft", player), + lambda state: state.has("D02Z02S04[E]", player)) + set_rule(world.get_location("GotP: Upper west shaft", player), + lambda state: + ( + state.has("D02Z02S04[NE]", player) + or ( + ( + state.has("D02Z02S04[W]", player) + or state.has("D02Z02S04[E]", player) + and state.has("Dash Ability", player) + ) + and ( + state.has("Purified Hand of the Nun", player) + or state.has("Wall Climb Ability", player) + ) + ) + or ( + state.has("D02Z02S04[SE]", player) + and ( + state.has("Wall Climb Ability", player) + or state.has("Purified Hand of the Nun", player) + and can_enemy_upslash(state, logic, enemy, player) + ) + ) + )) + set_rule(world.get_location("GotP: West shaft Child of Moonlight", player), + lambda state: + ( + ( + state.has("D02Z02S04[NE]", player) + or state.has("D02Z02S04[W]", player) + or state.has("D02Z02S04[E]", player) + and state.has("Dash Ability", player) + or state.has("D02Z02S04[SE]", player) + and ( + state.has("Wall Climb Ability", player) + or state.has("Purified Hand of the Nun", player) + and can_enemy_upslash(state, logic, enemy, player) + ) + ) + and ( + state.has("Blood Perpetuated in Sand", player) + and state.has("Dash Ability", player) + or state.has("Purified Hand of the Nun", player) + and can_enemy_bounce(logic, enemy) + or state.has_any({"Lorquiana", "Cante Jondo of the Three Sisters", "Verdiales of the Forsaken Hamlet", "Cantina of the Blue Rose"}, player) + or aubade(state, player) + ) + or ( + state.has("D02Z02S04[NE]", player) + or state.has("D02Z02S04[W]", player) + or state.has("D02Z02S04[E]", player) + and state.has("Dash Ability", player) + or state.has("D02Z02S04[SE]", player) + ) + and pillar(state, player) + )) + # Doors + set_rule(world.get_entrance("D02Z02S04[W]", player), + lambda state: ( + state.has("D02Z02S04[NE]", player) + or state.has("D02Z02S04[E]", player) + and state.has("Dash Ability", player) + or state.has("D02Z02S04[SE]", player) + and ( + state.has("Wall Climb Ability", player) + or state.has("Purified Hand of the Nun", player) + and can_enemy_upslash(state, logic, enemy, player) + ) + )) + set_rule(world.get_entrance("D02Z02S04[SE]", player), + lambda state: ( + state.has("D02Z02S04[NE]", player) + or state.has("D02Z02S04[W]", player) + or state.has("Dash Ability", player) + )) + set_rule(world.get_entrance("D02Z02S04[NE]", player), + lambda state: ( + ( + ( + state.has("D02Z02S04[W]", player) + or state.has("D02Z02S04[E]", player) + and state.has("Dash Ability", player) + ) + and state.has_any({"Purified Hand of the Nun", "Wall Climb Ability"}, player) + ) + or ( + state.has("D02Z02S04[SE]", player) + and ( + state.has("Wall Climb Ability", player) + or state.has("Purified Hand of the Nun", player) + and can_enemy_upslash(state, logic, enemy, player) + ) + ) + )) + set_rule(world.get_entrance("D02Z02S04[-CherubsL]", player), + lambda state: ( + state.has("Linen of Golden Thread", player) + and ( + state.has("D02Z02S04[NE]", player) + or state.has("D02Z02S04[W]", player) + or state.has("D02Z02S04[SE]", player) + or state.has("Dash Ability", player) + ) + )) + + + # D02Z02S05 (Graveyard of the Peaks) + # Items + set_rule(world.get_location("GotP: Center shaft ledge", player), + lambda state: ( + state.has("D02Z02S05[NW]", player) + or state.has("Wall Climb Ability", player) + )) + # Doors + set_rule(world.get_entrance("D02Z02S05[W]", player), + lambda state: ( + state.has("Purified Hand of the Nun", player) + and can_enemy_bounce(logic, enemy) + )) + set_rule(world.get_entrance("D02Z02S05[E]", player), + lambda state: ( + state.has("D02Z02S05[NW]", player) + or state.has("D02Z02S05[E]", player) + or state.has("Wall Climb Ability", player) + )) + set_rule(world.get_entrance("D02Z02S05[NW]", player), + lambda state: ( + state.has("D02Z02S05[NW]", player) + or state.has("Wall Climb Ability", player) + )) + set_rule(world.get_entrance("D02Z02S05[-CherubsL]", player), + lambda state: state.has("Linen of Golden Thread", player)) + set_rule(world.get_entrance("D02Z02S05[-CherubsR]", player), + lambda state: state.has("Linen of Golden Thread", player)) + + + # D02Z02S08 (Graveyard of the Peaks) + # Items + set_rule(world.get_location("GotP: Shop cave hidden hole", player), + lambda state: ( + state.has("D02Z02S08[CherubsR]", player) + or state.has("Blood Perpetuated in Sand", player) + or can_break_holes(state, player) + or can_cross_gap(state, logic, player, 8) + )) + set_rule(world.get_location("GotP: Shop cave Child of Moonlight", player), + lambda state: ( + state.has("D02Z02S08[CherubsR]", player) + or state.has("Blood Perpetuated in Sand", player) + or pillar(state, player) + or can_cross_gap(state, logic, player, 8) + )) + # No doors + + + # D02Z02S11 (Graveyard of the Peaks) + # No items + # Doors + set_rule(world.get_entrance("D02Z02S11[E]", player), + lambda state: ( + state.has("D02Z02S11[NW]", player) + or state.has("D02Z02S11[NE]", player) + or can_cross_gap(state, logic, player, 6) + )) + set_rule(world.get_entrance("D02Z02S11[NW]", player), + lambda state: state.has("D02Z02S11[NE]", player)) + set_rule(world.get_entrance("D02Z02S11[NE]", player), + lambda state: state.has("D02Z02S11[NW]", player)) + set_rule(world.get_entrance("D02Z02S11[-Cherubs]", player), + lambda state: state.has("Linen of Golden Thread", player)) + + + # D02Z02S14 (Graveyard of the Peaks) + # Items + set_rule(world.get_location("GotP: Amanecida of the Bejeweled Arrow", player), + lambda state: can_beat_boss(state, "Graveyard", logic, player)) + # Doors + set_rule(world.get_entrance("D02Z02S14[-Cherubs]", player), + lambda state: state.has("Linen of Golden Thread", player)) + + + # D02Z03S02 (Convent of Our Lady of the Charred Visage) + # No items + # Doors + set_rule(world.get_entrance("D02Z03S02[W]", player), + lambda state: ( + state.has("D02Z03S02[NW]", player) + or state.has("D02Z03S02[NE]", player) + or state.has("D02Z03S02[N]", player) + or state.has_any({"Purified Hand of the Nun", "Wall Climb Ability"}, player) + )) + set_rule(world.get_entrance("D02Z03S02[NW]", player), + lambda state: ( + state.has("D02Z03S02[NE]", player) + or state.has("D02Z03S02[N]", player) + )) + set_rule(world.get_entrance("D02Z03S02[NE]", player), + lambda state: ( + state.has("D02Z03S02[NW]", player) + or state.has("D02Z03S02[N]", player) + )) + set_rule(world.get_entrance("D02Z03S02[N]", player), + lambda state: ( + state.has("D02Z03S02[NW]", player) + or state.has("D02Z03S02[NE]", player) + )) + add_rule(world.get_entrance("D02Z03S02[N]", player), + lambda state: state.has("OpenedConventLadder", player)) + + + # D02Z03S03 (Convent of Our Lady of the Charred Visage) + # Items + set_rule(world.get_location("CoOLotCV: Snowy window ledge", player), + lambda state: ( + state.has("D02Z03S03[NW]", player) + or state.has("Blood Perpetuated in Sand", player) + or can_cross_gap(state, logic, player, 3) + )) + # Doors + set_rule(world.get_entrance("D02Z03S03[NW]", player), + lambda state: ( + state.has("Blood Perpetuated in Sand", player) + or can_cross_gap(state, logic, player, 3) + )) + + + # D02Z03S05 (Convent of Our Lady of the Charred Visage) + # Items + set_rule(world.get_location("CoOLotCV: Center miasma room", player), + lambda state: ( + state.has("Dash Ability", player) + and ( + state.has("D02Z03S05[S]", player) + or state.has("D02Z03S05[NE]", player) + or state.has_any({"Purified Hand of the Nun", "Wall Climb Ability"}, player) + ) + )) + # Doors + set_rule(world.get_entrance("D02Z03S05[S]", player), + lambda state: ( + state.has("D02Z03S05[NE]", player) + or state.has("Wall Climb Ability", player) + )) + set_rule(world.get_entrance("D02Z03S05[NE]", player), + lambda state: ( + state.has("D02Z03S05[S]", player) + or state.has_any({"Purified Hand of the Nun", "Wall Climb Ability"}, player) + )) + + + # D02Z03S10 (Convent of Our Lady of the Charred Visage) + # No items + # Doors + set_rule(world.get_entrance("D02Z03S10[-Cherubs]", player), + lambda state: state.has("Linen of Golden Thread", player)) + + + # D02Z03S11 (Convent of Our Lady of the Charred Visage) + # Event + set_rule(world.get_location("OpenedConventLadder", player), + lambda state: opened_convent_ladder(state, player)) + + + # D02Z03S12 (Convent of Our Lady of the Charred Visage) + # Items + set_rule(world.get_location("CoOLotCV: Lower west statue", player), + lambda state: ( + can_survive_poison(state, logic, player, 1) + and state.has("Dash Ability", player) + )) + # No doors + + + # D02Z03S18 (Convent of Our Lady of the Charred Visage) + # No items + # Doors + set_rule(world.get_entrance("D02Z03S18[NW]", player), + lambda state: ( + state.has("D02Z03S18[NE]", player) + or state.has("Wall Climb Ability", player) + )) + set_rule(world.get_entrance("D02Z03S18[NE]", player), + lambda state: ( + state.has("D02Z03S18[NW]", player) + or state.has("Wall Climb Ability", player) + )) + + + # D02Z03S20 (Convent of Our Lady of the Charred Visage) + # Items + set_rule(world.get_location("CoOLotCV: Our Lady of the Charred Visage", player), + lambda state: can_beat_boss(state, "Convent", logic, player)) + # Doors + set_rule(world.get_entrance("D02Z03S20[W]", player), + lambda state: can_beat_boss(state, "Convent", logic, player)) + set_rule(world.get_entrance("D02Z03S20[E]", player), + lambda state: can_beat_boss(state, "Convent", logic, player)) + + + # D02Z03S21 (Convent of Our Lady of the Charred Visage) + # Items + set_rule(world.get_location("CoOLotCV: Fountain of burning oil", player), + lambda state: state.has("Empty Golden Thimble", player)) + # No doors + + + # D03Z01S01 (Mountains of the Endless Dusk) + # No items + # Doors + set_rule(world.get_entrance("D03Z01S01[-Cherubs]", player), + lambda state: state.has("Linen of Golden Thread", player)) + + + # D03Z01S02 (Mountains of the Endless Dusk) + # No items + # Doors + set_rule(world.get_entrance("D03Z01S02[W]", player), + lambda state: ( + state.has("Wall Climb Ability", player) + or can_cross_gap(state, logic, player, 3) + )) + set_rule(world.get_entrance("D03Z01S02[E]", player), + lambda state: ( + state.has("Wall Climb Ability", player) + or can_cross_gap(state, logic, player, 7) + )) + + + # D03Z01S03 (Mountains of the Endless Dusk) + # Items + set_rule(world.get_location("MotED: Platform above chasm", player), + lambda state: ( + state.has_any({"Blood Perpetuated in Sand", "Purified Hand of the Nun"}, player) + and ( + state.has("D03Z01S03[W]", player) + or state.has("D03Z01S03[SW]", player) + or can_cross_gap(state, logic, player, 9) + ) + )) + set_rule(world.get_location("MotED: 1st meeting with Redento", player), + lambda state: ( + state.has("D03Z01S03[W]", player) + or state.has("D03Z01S03[SW]", player) + or can_cross_gap(state, logic, player, 9) + )) + set_rule(world.get_location("MotED: Child of Moonlight, above chasm", player), + lambda state: ( + state.has("D03Z01S03[W]", player) + or state.has("D03Z01S03[SW]", player) + or can_cross_gap(state, logic, player, 9) + )) + set_rule(world.get_location("MotED: Amanecida of the Golden Blades", player), + lambda state: ( + can_beat_boss(state, "Jondo", logic, player) + and ( + state.has("D03Z01S03[W]", player) + or state.has("D03Z01S03[SW]", player) + or can_cross_gap(state, logic, player, 9) + ) + )) + # Doors + set_rule(world.get_entrance("D03Z01S03[W]", player), + lambda state: ( + state.has("Wall Climb Ability", player) + and ( + state.has("D03Z01S03[SW]", player) + or can_cross_gap(state, logic, player, 9) + ) + )) + set_rule(world.get_entrance("D03Z01S03[E]", player), + lambda state: state.has("Wall Climb Ability", player)) + set_rule(world.get_entrance("D03Z01S03[SW]", player), + lambda state: ( + state.has("D03Z01S03[W]", player) + or can_cross_gap(state, logic, player, 9) + )) + set_rule(world.get_entrance("D03Z01S03[-WestL]", player), + lambda state: ( + state.has("Linen of Golden Thread", player) + and ( + state.has("D03Z01S03[W]", player) + or state.has("D03Z01S03[SW]", player) + or can_cross_gap(state, logic, player, 9) + ) + )) + set_rule(world.get_entrance("D03Z01S03[-WestR]", player), + lambda state: ( + state.has("Linen of Golden Thread", player) + and ( + state.has("D03Z01S03[W]", player) + or state.has("D03Z01S03[SW]", player) + or can_cross_gap(state, logic, player, 9) + ) + )) + set_rule(world.get_entrance("D03Z01S03[-EastL]", player), + lambda state: ( + state.has("Linen of Golden Thread", player) + and ( + state.has("D03Z01S03[W]", player) + or state.has("D03Z01S03[SW]", player) + or can_cross_gap(state, logic, player, 5) + ) + )) + set_rule(world.get_entrance("D03Z01S03[-EastR]", player), + lambda state: state.has("Linen of Golden Thread", player)) + + + # D03Z01S04 (Mountains of the Endless Dusk) + # Items + set_rule(world.get_location("MotED: Blood platform alcove", player), + lambda state: ( + state.has_any({"Blood Perpetuated in Sand", "Purified Hand of the Nun"}, player) + or upwarp_skips_allowed(logic) + )) + # No doors + + + # D03Z01S06 (Mountains of the Endless Dusk) + # Items + set_rule(world.get_location("MotED: Perpetva", player), + lambda state: can_beat_boss(state, "Perpetua", logic, player)) + set_rule(world.get_location("MotED: Egg hatching", player), + lambda state: can_beat_boss(state, "Perpetua", logic, player) and \ + state.has("Egg of Deformity", player)) + # Doors + set_rule(world.get_entrance("D03Z01S06[W]", player), + lambda state: can_beat_boss(state, "Perpetua", logic, player)) + set_rule(world.get_entrance("D03Z01S06[E]", player), + lambda state: can_beat_boss(state, "Perpetua", logic, player)) + + + # D03Z02S01 (Jondo) + # Items + set_rule(world.get_location("Jondo: Upper east chest", player), + lambda state: ( + state.has("D03Z02S01[Cherubs]", player) + or can_climb_on_root(state, player) + or can_cross_gap(state, logic, player, 8) + or state.has("Purified Hand of the Nun", player) + and can_enemy_bounce(logic, enemy) + )) + # Doors + set_rule(world.get_entrance("D03Z02S01[W]", player), + lambda state: ( + state.has("Wall Climb Ability", player) + or state.has("Purified Hand of the Nun", player) + and can_enemy_bounce(logic, enemy) + )) + set_rule(world.get_entrance("D03Z02S01[N]", player), + lambda state: ( + state.has("Wall Climb Ability", player) + or state.has("Purified Hand of the Nun", player) + )) + + + # D03Z02S02 (Jondo) + # No items + # Doors + set_rule(world.get_entrance("D03Z02S02[W]", player), + lambda state: ( + state.has("D03Z02S02[CherubsL]", player) + or state.has("Purified Hand of the Nun", player) + and ( + state.has("D03Z02S02[E]", player) + or state.has("D03Z02S02[CherubsR]", player) + or state.has("Wall Climb Ability", player) + or can_enemy_bounce(logic, enemy) + ) + )) + set_rule(world.get_entrance("D03Z02S02[E]", player), + lambda state: ( + state.has("Wall Climb Ability", player) + or state.has("Purified Hand of the Nun", player) + and can_enemy_bounce(logic, enemy) + )) + + # D03Z02S03 (Jondo) + # No items + # Doors + set_rule(world.get_entrance("D03Z02S03[W]", player), + lambda state: ( + state.has("Dash Ability", player) + and ( + state.has("D03Z02S03[E]", player) + or state.has("D03Z02S03[N]", player) + or state.has("D03Z02S03[SE2]", player) + ) + )) + set_rule(world.get_entrance("D03Z02S03[E]", player), + lambda state: ( + ( + can_air_stall(state, logic, player) + or state.has_any({"Purified Hand of the Nun", "Boots of Pleading"}, player) + ) + and ( + state.has("Dash Ability", player) + or state.has("D03Z02S03[N]", player) + or state.has("D03Z02S03[SE2]", player) + ) + )) + set_rule(world.get_entrance("D03Z02S03[N]", player), + lambda state: ( + state.has("D03Z02S03[W]", player) + and state.has("Dash Ability", player) + or state.has("D03Z02S03[E]", player) + or state.has("D03Z02S03[SE2]", player) + )) + set_rule(world.get_entrance("D03Z02S03[SE2]", player), + lambda state: ( + state.has("D03Z02S03[W]", player) + and state.has("Dash Ability", player) + or state.has("D03Z02S03[E]", player) + or state.has("D03Z02S03[N]", player) + )) + set_rule(world.get_entrance("D03Z02S03[SW]", player), + lambda state: ( + state.has("D03Z02S03[SE]", player) + or state.has("D03Z02S03[SSL]", player) + or state.has("D03Z02S03[SSR]", player) + or state.has("BrokeJondoBellW", player) + and state.has("BrokeJondoBellE", player) + and ( + state.has("D03Z02S03[W]", player) + and state.has("Dash Ability", player) + or state.has("D03Z02S03[E]", player) + or state.has("D03Z02S03[N]", player) + or state.has("D03Z02S03[SE2]", player) + ) + )) + set_rule(world.get_entrance("D03Z02S03[SE]", player), + lambda state: ( + state.has("D03Z02S03[SW]", player) + or state.has("D03Z02S03[SSL]", player) + or state.has("D03Z02S03[SSR]", player) + or state.has("BrokeJondoBellW", player) + and state.has("BrokeJondoBellE", player) + and ( + state.has("D03Z02S03[W]", player) + and state.has("Dash Ability", player) + or state.has("D03Z02S03[E]", player) + or state.has("D03Z02S03[N]", player) + or state.has("D03Z02S03[SE2]", player) + ) + )) + set_rule(world.get_entrance("D03Z02S03[SSL]", player), + lambda state: ( + state.has("D03Z02S03[SW]", player) + or state.has("D03Z02S03[SE]", player) + or state.has("D03Z02S03[SSR]", player) + or state.has("BrokeJondoBellW", player) + and state.has("BrokeJondoBellE", player) + and ( + state.has("D03Z02S03[W]", player) + and state.has("Dash Ability", player) + or state.has("D03Z02S03[E]", player) + or state.has("D03Z02S03[N]", player) + or state.has("D03Z02S03[SE2]", player) + ) + )) + set_rule(world.get_entrance("D03Z02S03[SSC]", player), + lambda state: ( + state.has("D03Z02S03[SW]", player) + or state.has("D03Z02S03[SE]", player) + or state.has("D03Z02S03[SSL]", player) + or state.has("D03Z02S03[SSR]", player) + or state.has("BrokeJondoBellW", player) + and state.has("BrokeJondoBellE", player) + and ( + state.has("D03Z02S03[W]", player) + and state.has("Dash Ability", player) + or state.has("D03Z02S03[E]", player) + or state.has("D03Z02S03[N]", player) + or state.has("D03Z02S03[SE2]", player) + ) + )) + set_rule(world.get_entrance("D03Z02S03[SSR]", player), + lambda state: ( + state.has("D03Z02S03[SW]", player) + or state.has("D03Z02S03[SE]", player) + or state.has("D03Z02S03[SSL]", player) + or state.has("BrokeJondoBellW", player) + and state.has("BrokeJondoBellE", player) + and ( + state.has("D03Z02S03[W]", player) + and state.has("Dash Ability", player) + or state.has("D03Z02S03[E]", player) + or state.has("D03Z02S03[N]", player) + or state.has("D03Z02S03[SE2]", player) + ) + )) + + + # D03Z02S04 (Jondo) + # Items + set_rule(world.get_location("Jondo: Lower east under chargers", player), + lambda state: ( + state.has("D03Z02S04[NE]", player) + or state.has("D03Z02S04[S]", player) + or state.has("Wall Climb Ability", player) + )) + # Doors + set_rule(world.get_entrance("D03Z02S04[NW]", player), + lambda state: state.has_any({"Purified Hand of the Nun", "Wall Climb Ability"}, player)) + set_rule(world.get_entrance("D03Z02S04[NE]", player), + lambda state: ( + state.has("Wall Climb Ability", player) + or ( + state.has("D03Z02S04[S]", player) + and state.has("Purified Hand of the Nun", player) + ) + )) + set_rule(world.get_entrance("D03Z02S04[S]", player), + lambda state: ( + state.has("D03Z02S04[NE]", player) + or state.has("Wall Climb Ability", player) + )) + + + # D03Z02S05 (Jondo) + # Items + set_rule(world.get_location("Jondo: Upper east Child of Moonlight", player), + lambda state: ( + state.has("D03Z02S05[E]", player) + or state.has("D03Z02S05[S]", player) + or can_cross_gap(state, logic, player, 5) + or ( + can_enemy_bounce(logic, enemy) + and can_cross_gap(state, logic, player, 3) + ) + )) + # Doors + set_rule(world.get_entrance("D03Z02S05[E]", player), + lambda state: ( + state.has("D03Z02S05[S]", player) + or can_cross_gap(state, logic, player, 5) + or ( + can_enemy_bounce(logic, enemy) + and can_cross_gap(state, logic, player, 3) + ) + )) + set_rule(world.get_entrance("D03Z02S05[S]", player), + lambda state: ( + state.has("D03Z02S05[E]", player) + or can_cross_gap(state, logic, player, 5) + or ( + can_enemy_bounce(logic, enemy) + and can_cross_gap(state, logic, player, 3) + ) + )) + # Event + set_rule(world.get_location("BrokeJondoBellE", player), + lambda state: broke_jondo_bell_e(state, logic, enemy, player)) + + + # D03Z02S07 (Jondo) + # Items + set_rule(world.get_location("Jondo: Lower west lift alcove", player), + lambda state: state.has("Dash Ability", player)) + # No doors + + + # D03Z02S08 (Jondo) + # Items + set_rule(world.get_location("Jondo: Lower west bell alcove", player), + lambda state: ( + state.has("D03Z02S08[N]", player) + or state.has("D03Z02S08[W]", player) + or state.has_any({"Purified Hand of the Nun", "Wall Climb Ability"}, player) + )) + # Doors + set_rule(world.get_entrance("D03Z02S08[W]", player), + lambda state: ( + state.has("D03Z02S08[N]", player) + or state.has_any({"Purified Hand of the Nun", "Wall Climb Ability"}, player) + )) + set_rule(world.get_entrance("D03Z02S08[N]", player), + lambda state: ( + state.has("D03Z02S08[W]", player) + or state.has_any({"Purified Hand of the Nun", "Wall Climb Ability"}, player) + )) + + + # D03Z02S09 (Jondo) + # No items + # Doors + set_rule(world.get_entrance("D03Z02S09[W]", player), + lambda state: state.has("Dash Ability", player)) + set_rule(world.get_entrance("D03Z02S09[N]", player), + lambda state: ( + state.has("D03Z02S09[S]", player) + or state.has("D03Z02S09[Cherubs]", player) + or state.has("Dash Ability", player) + )) + set_rule(world.get_entrance("D03Z02S09[S]", player), + lambda state: ( + state.has("D03Z02S09[N]", player) + or state.has("D03Z02S09[Cherubs]", player) + or state.has("Dash Ability", player) + )) + # Event + set_rule(world.get_location("BrokeJondoBellW", player), + lambda state: broke_jondo_bell_w(state, player)) + + + # D03Z02S10 (Jondo) + # No items + # Doors + set_rule(world.get_entrance("D03Z02S10[-Cherubs]", player), + lambda state: state.has("Linen of Golden Thread", player)) + + + # D03Z02S11 (Jondo) + # Items + set_rule(world.get_location("Jondo: Spike tunnel statue", player), + lambda state: ( + state.has("Dash Ability", player) + and ( + state.has_any({"Purified Hand of the Nun", "Wall Climb Ability"}, player) + or state.has("D03Z02S11[E]", player) + and can_cross_gap(state, logic, player, 2) + ) + )) + set_rule(world.get_location("Jondo: Spike tunnel Child of Moonlight", player), + lambda state: ( + state.has("Dash Ability", player) + and ( + state.has_any({"Purified Hand of the Nun", "Wall Climb Ability"}, player) + or state.has("D03Z02S11[W]", player) + and ( + can_cross_gap(state, logic, player, 2) + and can_enemy_bounce(logic, enemy) + or can_cross_gap(state, logic, player, 3) + ) + or state.has("D03Z02S11[E]", player) + and ( + can_cross_gap(state, logic, player, 1) + or can_enemy_bounce(logic, enemy) + ) + ) + )) + # Doors + set_rule(world.get_entrance("D03Z02S11[W]", player), + lambda state: ( + state.has("Dash Ability", player) + and ( + state.has_any({"Purified Hand of the Nun", "Wall Climb Ability"}, player) + or can_cross_gap(state, logic, player, 2) + ) + )) + set_rule(world.get_entrance("D03Z02S11[E]", player), + lambda state: ( + state.has("Dash Ability", player) + and state.has_any({"Purified Hand of the Nun", "Wall Climb Ability"}, player) + )) + + # D03Z02S13 (Jondo) + # Items + set_rule(world.get_location("Jondo: Upper west tree root", player), + lambda state: ( + can_walk_on_root(state, player) + or can_cross_gap(state, logic, player, 3) + )) + # Doors + set_rule(world.get_entrance("D03Z02S13[-Cherubs]", player), + lambda state: state.has("Linen of Golden Thread", player)) + + + # D03Z03S01 (Grievance Ascends) + # No items + # Doors + set_rule(world.get_entrance("D03Z03S01[NL]", player), + lambda state: ( + state.has("D03Z03S01[NR]", player) + or state.has("D03Z03S01[NC]", player) + or state.has_any({"Purified Hand of the Nun", "Wall Climb Ability"}, player) + )) + set_rule(world.get_entrance("D03Z03S01[NR]", player), + lambda state: ( + state.has("D03Z03S01[NL]", player) + or state.has("D03Z03S01[NC]", player) + or state.has_any({"Purified Hand of the Nun", "Wall Climb Ability"}, player) + )) + + + # D03Z03S02 (Grievance Ascends) + # Items + set_rule(world.get_location("GA: Lower west ledge", player), + lambda state: can_survive_poison(state, logic, player, 1)) + # Doors + set_rule(world.get_entrance("D03Z03S02[W]", player), + lambda state: ( + state.has("D03Z03S02[NE]", player) + or state.has_any({"Purified Hand of the Nun", "Wall Climb Ability"}, player) + )) + set_rule(world.get_entrance("D03Z03S02[NE]", player), + lambda state: state.has_any({"Purified Hand of the Nun", "Wall Climb Ability"}, player)) + + + # D03Z03S03 (Grievance Ascends) + # No items + # Doors + set_rule(world.get_entrance("D03Z03S03[W]", player), + lambda state: state.has("D03Z03S03[NE]", player)) + set_rule(world.get_entrance("D03Z03S03[NE]", player), + lambda state: state.has("D03Z03S03[W]", player)) + + + # D03Z03S04 (Grievance Ascends) + # No items + # Doors + set_rule(world.get_entrance("D03Z03S04[NW]", player), + lambda state: ( + state.has("D03Z03S04[NE]", player) + or state.has_any({"Purified Hand of the Nun", "Wall Climb Ability"}, player) + and ( + state.has("D03Z03S04[E]", player) + or state.has("D03Z03S04[SW]", player) + or state.has("Blood Perpetuated in Sand", player) + or can_cross_gap(state, logic, player, 10) + ) + )) + set_rule(world.get_entrance("D03Z03S04[NE]", player), + lambda state: ( + state.has("Wall Climb Ability", player) + and ( + state.has("D03Z03S04[NW]", player) + or state.has("D03Z03S04[E]", player) + or state.has("D03Z03S04[SW]", player) + or state.has("Blood Perpetuated in Sand", player) + or can_cross_gap(state, logic, player, 10) + ) + )) + set_rule(world.get_entrance("D03Z03S04[E]", player), + lambda state: ( + state.has("D03Z03S04[NW]", player) + or state.has("D03Z03S04[NE]", player) + or state.has_any({"Purified Hand of the Nun", "Wall Climb Ability"}, player) + and ( + state.has("D03Z03S04[SW]", player) + or state.has("Blood Perpetuated in Sand", player) + or can_cross_gap(state, logic, player, 10) + ) + )) + set_rule(world.get_entrance("D03Z03S04[SW]", player), + lambda state: ( + state.has("D03Z03S04[NW]", player) + or state.has("D03Z03S04[NE]", player) + or state.has("D03Z03S04[E]", player) + or state.has("Blood Perpetuated in Sand", player) + or can_cross_gap(state, logic, player, 10) + )) + set_rule(world.get_entrance("D03Z03S04[SE]", player), + lambda state: state.has("Blood Perpetuated in Sand", player)) + set_rule(world.get_entrance("D03Z03S04[-Cherubs]", player), + lambda state: state.has("Linen of Golden Thread", player)) + + + # D03Z03S05 (Grievance Ascends) + # No items + # Doors + set_rule(world.get_entrance("D03Z03S05[NW]", player), + lambda state: state.has("D03Z03S05[NE]", player)) + set_rule(world.get_entrance("D03Z03S05[NE]", player), + lambda state: state.has("D03Z03S05[NW]", player)) + set_rule(world.get_entrance("D03Z03S05[SW]", player), + lambda state: state.has("D03Z03S05[SE]", player) or \ + state.has("Linen of Golden Thread", player)) + set_rule(world.get_entrance("D03Z03S05[SE]", player), + lambda state: state.has("D03Z03S05[SW]", player) or \ + state.has("Linen of Golden Thread", player)) + + + # D03Z03S06 (Grievance Ascends) + # Items + set_rule(world.get_location("GA: Miasma room floor", player), + lambda state: can_survive_poison(state, logic, player, 1)) + set_rule(world.get_location("GA: Miasma room treasure", player), + lambda state: state.has("Wall Climb Ability", player)) + set_rule(world.get_location("GA: Miasma room Child of Moonlight", player), + lambda state: state.has("Wall Climb Ability", player)) + # No doors + + + # D03Z03S07 (Grievance Ascends) + # No items + # Doors + set_rule(world.get_entrance("D03Z03S07[NW]", player), + lambda state: ( + state.has("D03Z03S07[NE]", player) + or state.has_any({"Purified Hand of the Nun", "Wall Climb Ability"}, player) + )) + set_rule(world.get_entrance("D03Z03S07[NE]", player), + lambda state: ( + state.has("D03Z03S07[NE]", player) + or state.has_any({"Purified Hand of the Nun", "Wall Climb Ability"}, player) + )) + + + # D03Z03S08 (Grievance Ascends) + # Items + set_rule(world.get_location("GA: End of blood bridge", player), + lambda state: ( + state.has("Blood Perpetuated in Sand", player) + or can_cross_gap(state, logic, player, 11) + )) + set_rule(world.get_location("GA: Blood bridge Child of Moonlight", player), + lambda state: ( + ( + state.has("Blood Perpetuated in Sand", player) + or can_cross_gap(state, logic, player, 11) + ) + and ( + state.has_any({"Purified Hand of the Nun", "Cante Jondo of the Three Sisters", "Verdiales of the Forsaken Hamlet"}, player) + or pillar(state, player) + or tirana(state, player) + or aubade(state, player) + and can_air_stall(state, logic, player) + ) + )) + # Doors + set_rule(world.get_entrance("D03Z03S08[-CherubsL]", player), + lambda state: state.has("Linen of Golden Thread", player)) + set_rule(world.get_entrance("D03Z03S08[-CherubsR]", player), + lambda state: state.has("Linen of Golden Thread", player)) + + + # D03Z03S09 (Grievance Ascends) + # Items + set_rule(world.get_location("GA: Lower east Child of Moonlight", player), + lambda state: ( + can_climb_on_root(state, player) + or state.has_any({"Purified Hand of the Nun", "Lorquiana", "Zarabanda of the Safe Haven", "Cante Jondo of the Three Sisters"}, player) + or pillar(state, player) + or aubade(state, player) + or tirana(state, player) + )) + # No doors + + + # D03Z03S10 (Grievance Ascends) + # Items + set_rule(world.get_location("GA: Altasgracias' gift", player), + lambda state: state.has_group("egg", player, 3)) + set_rule(world.get_location("GA: Empty giant egg", player), + lambda state: ( + state.has_group("egg", player, 3) + and state.has("Hatched Egg of Deformity", player) + and ( + state.has("D01Z02S01[W]", player) + or state.has("D01Z02S01[E]", player) + ) + )) + # No doors + + + # D03Z03S15 (Grievance Ascends) + # Items + set_rule(world.get_location("GA: Tres Angustias", player), + lambda state: can_beat_boss(state, "Grievance", logic, player)) + # Doors + set_rule(world.get_entrance("D03Z03S15[W]", player), + lambda state: can_beat_boss(state, "Grievance", logic, player)) + set_rule(world.get_entrance("D03Z03S15[E]", player), + lambda state: can_beat_boss(state, "Grievance", logic, player)) + + + # D04Z01S01 (Patio of the Silent Steps) + # Items + set_rule(world.get_location("PotSS: First area ledge", player), + lambda state: ( + state.has("D04Z01S01[NE]", player) + or state.has("D04Z01S01[N]", player) + or can_cross_gap(state, logic, player, 3) + )) + # Doors + set_rule(world.get_entrance("D04Z01S01[NE]", player), + lambda state: ( + state.has("D04Z01S01[N]", player) + or can_cross_gap(state, logic, player, 3) + )) + set_rule(world.get_entrance("D04Z01S01[N]", player), + lambda state: ( + state.has("D04Z01S01[NE]", player) + or can_cross_gap(state, logic, player, 3) + )) + + + # D04Z01S02 (Patio of the Silent Steps) + # Items + set_rule(world.get_location("PotSS: Second area ledge", player), + lambda state: ( + can_climb_on_root(state, player) + or can_cross_gap(state, logic, player, 3) + )) + # No doors + + + # D04Z01S03 (Patio of the Silent Steps) + # Items + set_rule(world.get_location("PotSS: Third area upper ledge", player), + lambda state: ( + can_walk_on_root(state, player) + or can_cross_gap(state, logic, player, 3) + )) + # No doors + + + # D04Z01S04 (Patio of the Silent Steps) + # Items + set_rule(world.get_location("PotSS: 4th meeting with Redento", player), + lambda state: redento(state, blasphemousworld, player, 4)) + # No doors + + + # D04Z01S05 (Patio of the Silent Steps) + # No items + # Doors + set_rule(world.get_entrance("D04Z01S05[N]", player), + lambda state: ( + ( + state.has("Blood Perpetuated in Sand", player) + and can_climb_on_root(state, player) + ) + or state.has("Purified Hand of the Nun", player) + and ( + state.has("Blood Perpetuated in Sand", player) + or can_climb_on_root(state, player) + ) + )) + set_rule(world.get_entrance("D04Z01S05[-Cherubs]", player), + lambda state: state.has("Linen of Golden Thread", player)) + + + # D04Z01S06 (Patio of the Silent Steps) + # No items + # Doors + set_rule(world.get_entrance("D04Z01S06[E]", player), + lambda state: state.has("Purified Hand of the Nun", player)) + set_rule(world.get_entrance("D04Z01S06[Cherubs]", player), + lambda state: state.has("Linen of Golden Thread", player)) + + + # D04Z02S01 (Mother of Mothers) + # Items + if world.purified_hand[player]: + set_rule(world.get_location("MoM: Western room ledge", player), + lambda state: ( + state.has("D04Z02S01[N]", player) + or state.has("D04Z02S01[NE]", player) + and state.has("Dash Ability", player) + and state.has_any({"Purified Hand of the Nun", "Wall Climb Ability"}, player) + )) + set_rule(world.get_location("MoM: Lower west Child of Moonlight", player), + lambda state: ( + state.has("D04Z02S01[N]", player) + or pillar(state, player) + or state.has("D04Z02S01[NE]", player) + and state.has("Dash Ability", player) + and ( + state.has("Wall Climb Ability", player) + or can_cross_gap(state, logic, player, 1) + ) + )) + # Doors + set_rule(world.get_entrance("D04Z02S01[N]", player), + lambda state: ( + state.has("D04Z02S04[NE]", player) + and state.has("Dash Ability", player) + and state.has_any({"Purified Hand of the Nun", "Wall Climb Ability"}, player) + )) + set_rule(world.get_entrance("D04Z02S01[NE]", player), + lambda state: ( + state.has("D04Z02S01[N]", player) + or state.has("Dash Ability", player) + and can_cross_gap(state, logic, player, 1) + )) + + + # D04Z02S02 (Mother of Mothers) + # No items + # Doors + set_rule(world.get_entrance("D04Z02S02[NE]", player), + lambda state: ( + ( + state.has("Purified Hand of the Nun", player) + and upwarp_skips_allowed(logic) + ) + or ( + state.has("Purified Hand of the Nun", player) + and can_enemy_upslash(state, logic, enemy, player) + ) + or ( + can_enemy_upslash(state, logic, enemy, player) + and upwarp_skips_allowed(logic) + and ( + state.has("Wall Climb Ability", player) + or state.has("D04Z02S02[N]", player) + ) + ) + )) + set_rule(world.get_entrance("D04Z02S02[N]", player), + lambda state: ( + state.has("D04Z02S02[NE]", player) + or state.has_any({"Purified Hand of the Nun", "Wall Climb Ability"}, player) + )) + + + # D04Z02S04 (Mother of Mothers) + # No items + # Doors + set_rule(world.get_entrance("D04Z02S04[NW]", player), + lambda state: ( + state.has("D04Z02S04[NE]", player) + or state.has("D04Z02S04[N]", player) + or state.has("D04Z02S04[Cherubs]", player) + or state.has_all({"Purified Hand of the Nun", "Wall Climb Ability"}, player) + )) + set_rule(world.get_entrance("D04Z02S04[NE]", player), + lambda state: ( + state.has("D04Z02S04[NW]", player) + or state.has("D04Z02S04[N]", player) + or state.has("D04Z02S04[Cherubs]", player) + or state.has_all({"Purified Hand of the Nun", "Wall Climb Ability"}, player) + )) + set_rule(world.get_entrance("D04Z02S04[N]", player), + lambda state: ( + ( + state.has("D04Z02S04[NW]", player) + or state.has("D04Z02S04[NE]", player) + or state.has("D04Z02S04[Cherubs]", player) + or state.has_all({"Purified Hand of the Nun", "Wall Climb Ability"}, player) + ) + and state.has("OpenedMOMLadder", player) + )) + + + # D04Z02S06 (Mother of Mothers) + # Items + set_rule(world.get_location("MoM: Outside Cleofas' room", player), + lambda state: ( + state.has("D04Z02S06[NW]", player) + or state.has("D04Z02S06[N]", player) + or state.has("D04Z02S06[NE]", player) + or state.has_any({"Purified Hand of the Nun", "Wall Climb Ability"}, player) + )) + # Doors + set_rule(world.get_entrance("D04Z02S06[NW]", player), + lambda state: ( + state.has("D04Z02S06[N]", player) + or state.has("D04Z02S06[NE]", player) + or state.has("Wall Climb Ability", player) + )) + set_rule(world.get_entrance("D04Z02S06[N]", player), + lambda state: ( + ( + state.has("D04Z02S06[NW]", player) + or state.has("D04Z02S06[NE]", player) + or state.has("Wall Climb Ability", player) + ) + and state.has("OpenedARLadder", player) + )) + set_rule(world.get_entrance("D04Z02S06[NE]", player), + lambda state: ( + state.has("D04Z02S06[NW]", player) + or state.has("D04Z02S06[N]", player) + or state.has("Wall Climb Ability", player) + )) + set_rule(world.get_entrance("D04Z02S06[-Cherubs]", player), + lambda state: state.has("Linen of Golden Thread", player)) + # Event + set_rule(world.get_location("OpenedMOMLadder", player), + lambda state: opened_mom_ladder(state, player)) + + + # D04Z02S07 (Mother of Mothers) + # Items + set_rule(world.get_location("MoM: East chandelier platform", player), + lambda state: ( + state.has("Blood Perpetuated in Sand", player) + or can_cross_gap(state, logic, player, 3) + )) + # No doors + + + # D04Z02S09 (Mother of Mothers) + # No items + # Doors + set_rule(world.get_entrance("D04Z02S09[NE]", player), + lambda state: state.has("Blood Perpetuated in Sand", player)) + + + # D04Z02S16 (Mother of Mothers) + # Items + set_rule(world.get_location("MoM: Giant chandelier statue", player), + lambda state: ( + state.has("Wall Climb Ability", player) + and state.has_any({"Blood Perpetuated in Sand", "Purified Hand of the Nun"}, player) + )) + # Doors + set_rule(world.get_entrance("D04Z02S16[-Cherubs]", player), + lambda state: state.has("Linen of Golden Thread", player)) + + + # D04Z02S20 (Mother of Mothers) + # No items + # Doors + set_rule(world.get_entrance("D04Z02S20[Redento]", player), + lambda state: redento(state, blasphemousworld, player, 5)) + + + # D04Z02S21 (Mother of Mothers) + # No items + # Doors + set_rule(world.get_entrance("D04Z02S21[W]", player), + lambda state: ( + state.has("D04Z02S21[NE]", player) + or state.has_any({"Purified Hand of the Nun", "Wall Climb Ability"}, player) + )) + set_rule(world.get_entrance("D04Z02S21[NE]", player), + lambda state: state.has_any({"Purified Hand of the Nun", "Wall Climb Ability"}, player)) + + + # D04Z02S22 (Mother of Mothers) + # Items + set_rule(world.get_location("MoM: Melquiades, The Exhumed Archbishop", player), + lambda state: can_beat_boss(state, "Mothers", logic, player)) + # Doors + set_rule(world.get_entrance("D04Z02S22[W]", player), + lambda state: can_beat_boss(state, "Mothers", logic, player)) + set_rule(world.get_entrance("D04Z02S22[E]", player), + lambda state: can_beat_boss(state, "Mothers", logic, player)) + + + # D04BZ02S01 (Mother of Mothers - Redento) + # Items + set_rule(world.get_location("MoM: Final meeting with Redento", player), + lambda state: redento(state, blasphemousworld, player, 5)) + # No doors + + + # D04Z03S02 (Knot of the Three Words) + # Items + set_rule(world.get_location("KotTW: Gift from the Traitor", player), + lambda state: state.has_all({"Severed Right Eye of the Traitor", "Broken Left Eye of the Traitor"}, player)) + # No doors + + + # D04Z04S01 (All the Tears of the Sea) + # Items + set_rule(world.get_location("AtTotS: Miriam's gift", player), + lambda state: ( + miriam(state, player) + and state.has("Dash Ability", player) + and state.has("Wall Climb Ability", player) + )) + # No doors + + + # D05Z01S03 (Library of the Negated Words) + # No items + # Doors + set_rule(world.get_entrance("D05Z01S03[Frontal]", player), + lambda state: ( + state.has("Key Grown from Twisted Wood", player) + and state.has("D05Z01S23[E]", player) + and ( + state.has("D05Z01S11[NW]", player) + or state.has("D05Z01S11[NE]", player) + ) + )) + + + # D05Z01S05 (Library of the Negated Words) + # Items + set_rule(world.get_location("LotNW: Hidden floor", player), + lambda state: can_break_holes(state, player)) + set_rule(world.get_location("LotNW: Root ceiling platform", player), + lambda state: ( + ( + can_climb_on_root(state, player) + or state.has("Purified Hand of the Nun", player) + ) + and ( + state.has("D05Z01S05[NE]", player) + or state.has("Blood Perpetuated in Sand", player) + ) + )) + # Doors + set_rule(world.get_entrance("D05Z01S05[NE]", player), + lambda state: state.has("Blood Perpetuated in Sand", player)) + + + # D05Z01S06 (Library of the Negated Words) + # Items + set_rule(world.get_location("LotNW: Miasma hallway chest", player), + lambda state: ( + state.has("D05Z01S06[W]", player) + or can_survive_poison(state, logic, player, 3) + )) + # Doors + set_rule(world.get_entrance("D05Z01S06[W]", player), + lambda state: can_survive_poison(state, logic, player, 3)) + set_rule(world.get_entrance("D05Z01S06[E]", player), + lambda state: can_survive_poison(state, logic, player, 3)) + + + # D05Z01S07 (Library of the Negated Words) + # No items + # Doors + set_rule(world.get_entrance("D05Z01S07[NW]", player), + lambda state: ( + state.has("Blood Perpetuated in Sand", player) + and ( + can_climb_on_root(state, player) + or state.has("Purified Hand of the Nun", player) + ) + or ( + can_climb_on_root(state, player) + and can_cross_gap(state, logic, player, 3) + ) + or can_cross_gap(state, logic, player, 7) + )) + + + # D05Z01S10 (Library of the Negated Words) + # Items + set_rule(world.get_location("LotNW: Platform puzzle chest", player), + lambda state: ( + state.has_any({"Blood Perpetuated in Sand", "Purified Hand of the Nun"}, player) + or can_enemy_bounce(logic, enemy) + and can_cross_gap(state, logic, player, 2) + )) + # No doors + + + # D05Z01S11 (Library of the Negated Words) + # Items + set_rule(world.get_location("LotNW: Silence for Diosdado", player), + lambda state: ( + ( + state.has("D05Z01S11[NW]", player) + or state.has("D05Z01S11[NE]", player) + ) + and state.has("D05Z01S23[E]", player) + )) + set_rule(world.get_location("LotNW: Lowest west upper ledge", player), + lambda state: ( + state.has("D05Z01S11[NW]", player) + or state.has("D05Z01S11[NE]", player) + )) + # Doors + set_rule(world.get_entrance("D05Z01S11[SW]", player), + lambda state: can_break_tirana(state, logic, player)) + set_rule(world.get_entrance("D05Z01S11[NW]", player), + lambda state: state.has("D05Z01S11[NE]", player)) + set_rule(world.get_entrance("D05Z01S11[NE]", player), + lambda state: state.has("D05Z01S11[NW]", player)) + + + # D05Z01S21 (Library of the Negated Words) + # Items + set_rule(world.get_location("LotNW: Elevator Child of Moonlight", player), + lambda state: ( + state.has("Zarabanda of the Safe Haven", player) + or state.has("Blood Perpetuated in Sand", player) + and ( + can_walk_on_root(state, player) + or state.has("Purified Hand of the Nun", player) + or can_cross_gap(state, logic, player, 5) + and pillar(state, player) + ) + )) + # Doors + set_rule(world.get_entrance("D05Z01S21[-Cherubs]", player), + lambda state: state.has("Linen of Golden Thread", player)) + + + # D05Z02S06 (The Sleeping Canvases) + # No items + # Doors + set_rule(world.get_entrance("D05Z02S06[SE]", player), + lambda state: state.has("OpenedTSCGate", player)) + + + # D05Z02S09 (The Sleeping Canvases) + # No items + # Doors + set_rule(world.get_entrance("D05Z02S09[E]", player), + lambda state: ( + state.has("Bead of Red Wax", player, 3) + and state.has("Bead of Blue Wax", player, 3) + )) + + + # D05Z02S10 (The Sleeping Canvases) + # Items + set_rule(world.get_location("TSC: Jocinero's 1st reward", player), + lambda state: state.has("Child of Moonlight", player, 20)) + set_rule(world.get_location("TSC: Jocinero's final reward", player), + lambda state: state.has("Child of Moonlight", player, 38)) + # Doors + set_rule(world.get_entrance("D05Z02S10[W]", player), + lambda state: state.has("Dash Ability", player)) + + + # D05Z02S11 (The Sleeping Canvases) + # Event + set_rule(world.get_location("OpenedTSCGate", player), + lambda state: opened_tsc_gate(state, player)) + + + # D05Z02S13 (The Sleeping Canvases) + # No items + # Doors + set_rule(world.get_entrance("D05Z02S13[E]", player), + lambda state: state.has("Dash Ability", player)) + + + # D05Z02S14 (The Sleeping Canvases) + # Items + set_rule(world.get_location("TSC: Exposito, Scion of Abjuration", player), + lambda state: can_beat_boss(state, "Canvases", logic, player)) + # Doors + set_rule(world.get_entrance("D05Z02S14[W]", player), + lambda state: can_beat_boss(state, "Canvases", logic, player)) + set_rule(world.get_entrance("D05Z02S14[E]", player), + lambda state: can_beat_boss(state, "Canvases", logic, player)) + + + # D05Z02S15 (The Sleeping Canvases) + # Items + set_rule(world.get_location("TSC: Swinging blade tunnel", player), + lambda state: state.has("Dash Ability", player)) + # No doors + + + # D06Z01S01 (Archcathedral Rooftops) + # No items + # Doors + set_rule(world.get_entrance("D06Z01S01[SW]", player), + lambda state: ( + ( + state.has("D06Z01S01[SE]", player) + or state.has("D06Z01S01[W]", player) + or state.has("D06Z01S01[E]", player) + or state.has("D06Z01S01[NNW]", player) + or state.has("D06Z01S01[NNE]", player) + or state.has("D06Z01S01[N]", player) + ) + or state.has("Linen of Golden Thread", player) + and ( + state.has("D06Z01S01[NW]", player) + or state.has("D06Z01S01[NE]", player) + ) + )) + set_rule(world.get_entrance("D06Z01S01[SE]", player), + lambda state: ( + ( + state.has("D06Z01S01[SW]", player) + or state.has("D06Z01S01[W]", player) + or state.has("D06Z01S01[E]", player) + or state.has("D06Z01S01[NNW]", player) + or state.has("D06Z01S01[NNE]", player) + or state.has("D06Z01S01[N]", player) + ) + or state.has("Linen of Golden Thread", player) + and ( + state.has("D06Z01S01[NW]", player) + or state.has("D06Z01S01[NE]", player) + ) + )) + set_rule(world.get_entrance("D06Z01S01[W]", player), + lambda state: ( + ( + state.has("D06Z01S01[E]", player) + or state.has("D06Z01S01[NNW]", player) + or state.has("D06Z01S01[NNE]", player) + or state.has("D06Z01S01[N]", player) + ) + or state.has_group("masks", player, 1) + and ( + state.has("D06Z01S01[SW]", player) + or state.has("D06Z01S01[SE]", player) + ) + or state.has("Linen of Golden Thread", player) + and ( + state.has("D06Z01S01[NW]", player) + or state.has("D06Z01S01[NE]", player) + and ( + can_walk_on_root(state, player) + or can_cross_gap(state, logic, player, 1) + ) + ) + )) + set_rule(world.get_entrance("D06Z01S01[E]", player), + lambda state: ( + ( + state.has("D06Z01S01[W]", player) + or state.has("D06Z01S01[NNW]", player) + or state.has("D06Z01S01[NNE]", player) + or state.has("D06Z01S01[N]", player) + ) + or state.has_group("masks", player, 1) + and ( + state.has("D06Z01S01[SW]", player) + or state.has("D06Z01S01[SE]", player) + ) + or state.has("Linen of Golden Thread", player) + and ( + state.has("D06Z01S01[NW]", player) + or state.has("D06Z01S01[NE]", player) + and ( + can_walk_on_root(state, player) + or can_cross_gap(state, logic, player, 1) + ) + ) + )) + set_rule(world.get_entrance("D06Z01S01[NW]", player), + lambda state: ( + state.has("D06Z01S01[NE]", player) + and ( + can_walk_on_root(state, player) + or can_cross_gap(state, logic, player, 8) + ) + or state.has("Linen of Golden Thread", player) + and ( + state.has("D06Z01S01[NNW]", player) + or state.has("D06Z01S01[NNE]", player) + and ( + can_walk_on_root(state, player) + or can_cross_gap(state, logic, player, 3) + ) + ) + )) + set_rule(world.get_entrance("D06Z01S01[NE]", player), + lambda state: ( + state.has("D06Z01S01[NW]", player) + or ( + can_walk_on_root(state, player) + or can_cross_gap(state, logic, player, 8) + ) + or state.has("Linen of Golden Thread", player) + and ( + state.has("D06Z01S01[NNW]", player) + or state.has("D06Z01S01[NNE]", player) + and ( + can_walk_on_root(state, player) + or can_cross_gap(state, logic, player, 3) + ) + ) + )) + set_rule(world.get_entrance("D06Z01S01[NNW]", player), + lambda state: ( + ( + state.has("D06Z01S01[NNE]", player) + or state.has("D06Z01S01[N]", player) + ) + or state.has_group("masks", player, 2) + and ( + state.has("D06Z01S01[SW]", player) + or state.has("D06Z01S01[SE]", player) + or state.has("D06Z01S01[W]", player) + or state.has("D06Z01S01[E]", player) + or state.has("Linen of Golden Thread", player) + and ( + state.has("D06Z01S01[NW]", player) + or state.has("D06Z01S01[NE]", player) + ) + ) + )) + set_rule(world.get_entrance("D06Z01S01[NNE]", player), + lambda state: ( + ( + state.has("D06Z01S01[NNW]", player) + or state.has("D06Z01S01[N]", player) + ) + or state.has_group("masks", player, 2) + and ( + state.has("D06Z01S01[SW]", player) + or state.has("D06Z01S01[SE]", player) + or state.has("D06Z01S01[W]", player) + or state.has("D06Z01S01[E]", player) + or state.has("Linen of Golden Thread", player) + and ( + state.has("D06Z01S01[NW]", player) + or state.has("D06Z01S01[NE]", player) + ) + ) + )) + set_rule(world.get_entrance("D06Z01S01[N]", player), + lambda state: ( + state.has_group("masks", player, 3) + and ( + state.has("D06Z01S01[SW]", player) + or state.has("D06Z01S01[SE]", player) + or state.has("D06Z01S01[W]", player) + or state.has("D06Z01S01[E]", player) + or state.has("D06Z01S01[NNW]", player) + or state.has("D06Z01S01[NNE]", player) + or state.has("Linen of Golden Thread", player) + and ( + state.has("D06Z01S01[NW]", player) + or state.has("D06Z01S01[NE]", player) + ) + ) + )) + set_rule(world.get_entrance("D06Z01S01[-Cherubs]", player), + lambda state: ( + state.has("Linen of Golden Thread", player) + and ( + state.has("D06Z01S01[SW]", player) + or state.has("D06Z01S01[SE]", player) + or state.has("D06Z01S01[W]", player) + or state.has("D06Z01S01[E]", player) + or state.has("D06Z01S01[NW]", player) + or state.has("D06Z01S01[NE]", player) + or state.has("D06Z01S01[NNW]", player) + or state.has("D06Z01S01[NNE]", player)) + )) + + + # D06Z01S03 (Archcathedral Rooftops) + # Items + set_rule(world.get_location("AR: First soldier fight", player), + lambda state: can_beat_boss(state, "Legionary", logic, player)) + # Doors + set_rule(world.get_entrance("D06Z01S03[W]", player), + lambda state: can_beat_boss(state, "Legionary", logic, player)) + set_rule(world.get_entrance("D06Z01S03[E]", player), + lambda state: can_beat_boss(state, "Legionary", logic, player)) + + + # D06Z01S04 (Archcathedral Rooftops) + # No items + # Doors + set_rule(world.get_entrance("D06Z01S04[SW]", player), + lambda state: ( + state.has("D06Z01S04[W]", player) + or state.has("D06Z01S04[Health]", player) + )) + set_rule(world.get_entrance("D06Z01S04[W]", player), + lambda state: ( + state.has("D06Z01S04[SW]", player) + or state.has("D06Z01S04[Health]", player) + )) + set_rule(world.get_entrance("D06Z01S04[Health]", player), + lambda state: ( + state.has("D06Z01S04[SW]", player) + or state.has("D06Z01S04[W]", player) + )) + add_rule(world.get_entrance("D06Z01S04[Health]", player), + lambda state: ( + ( + state.has("Wall Climb Ability", player) + and can_survive_poison(state, logic, player, 2) + and ( + state.has("Purified Hand of the Nun", player) + or ( + state.has("Blood Perpetuated in Sand", player) + and can_climb_on_root(state, player) + ) + ) + ) + )) + set_rule(world.get_entrance("D06Z01S04[NW]", player), + lambda state: ( + state.has("D06Z01S04[NE]", player) + or state.has("D06Z01S04[Cherubs]", player) + )) + add_rule(world.get_entrance("D06Z01S04[NW]", player), + lambda state: ( + state.has("D06Z01S04[Cherubs]", player) + or ( + state.has("D06Z01S04[SW]", player) + or state.has("D06Z01S04[W]", player) + or state.has("D06Z01S04[Health]", player) + ) + and state.has("Wall Climb Ability", player) + and can_survive_poison(state, logic, player, 2) + and ( + state.has_any({"Dash Ability", "Purified Hand of the Nun"}, player) + and ( + can_dawn_jump(state, logic, player) + or can_climb_on_root(state, player) + ) + ) + )) + set_rule(world.get_entrance("D06Z01S04[NE]", player), + lambda state: ( + state.has("D06Z01S04[NW]", player) + or state.has("D06Z01S04[Cherubs]", player) + )) + add_rule(world.get_entrance("D06Z01S04[NE]", player), + lambda state: ( + ( + state.has("D06Z01S04[SW]", player) + or state.has("D06Z01S04[W]", player) + or state.has("D06Z01S04[Health]", player) + ) + and state.has("Wall Climb Ability", player) + and can_survive_poison(state, logic, player, 2) + and ( + state.has_any({"Dash Ability", "Purified Hand of the Nun"}, player) + and ( + can_dawn_jump(state, logic, player) + or can_climb_on_root(state, player) + ) + ) + )) + + + # D06Z01S06 (Archcathedral Rooftops) + # Items + set_rule(world.get_location("AR: Second soldier fight", player), + lambda state: ( + can_beat_boss(state, "Legionary", logic, player) + and ( + state.has("D06Z01S06[WW]", player) + or state.has("D06Z01S06[E]", player) + ) + )) + # Doors + set_rule(world.get_entrance("D06Z01S06[WW]", player), + lambda state: state.has("D06Z01S06[E]", player)) + add_rule(world.get_entrance("D06Z01S06[WW]", player), + lambda state: can_beat_boss(state, "Legionary", logic, player)) + set_rule(world.get_entrance("D06Z01S06[E]", player), + lambda state: state.has("D06Z01S06[WW]", player)) + add_rule(world.get_entrance("D06Z01S06[E]", player), + lambda state: can_beat_boss(state, "Legionary", logic, player)) + set_rule(world.get_entrance("D06Z01S06[W]", player), + lambda state: state.has("D06Z01S06[EE]", player)) + set_rule(world.get_entrance("D06Z01S06[EE]", player), + lambda state: state.has("D06Z01S06[W]", player)) + + + # D06Z01S08 (Archcathedral Rooftops) + # No items + # Doors + set_rule(world.get_entrance("D06Z01S08[E]", player), + lambda state: state.has("D06Z01S08[N]", player) or \ + state.has("Wall Climb Ability", player)) + + + # D06Z01S09 (Archcathedral Rooftops) + # No items + # Doors + set_rule(world.get_entrance("D06Z01S09[-CherubsL]", player), + lambda state: state.has("Linen of Golden Thread", player)) + set_rule(world.get_entrance("D06Z01S09[-CherubsR]", player), + lambda state: state.has("Linen of Golden Thread", player)) + + + # D06Z01S10 (Archcathedral Rooftops) + # No items + # Doors + set_rule(world.get_entrance("D06Z01S10[-CherubsL]", player), + lambda state: state.has("Linen of Golden Thread", player)) + set_rule(world.get_entrance("D06Z01S10[-CherubsR]", player), + lambda state: state.has("Linen of Golden Thread", player)) + + + # D06Z01S12 (Archcathedral Rooftops) + # Items + set_rule(world.get_location("AR: Upper west shaft ledge", player), + lambda state: ( + state.has("D06Z01S12[NW]", player) + or state.has("D06Z01S12[NE]", player) + or state.has("D06Z01S12[NE2]", player) + or state.has("D06Z01S12[W]", player) + or state.has("D06Z01S12[E]", player) + or state.has("Wall Climb Ability", player) + )) + set_rule(world.get_location("AR: Upper west shaft chest", player), + lambda state: ( + state.has("D06Z01S12[NE2]", player) + or ( + state.has("D06Z01S12[NW]", player) + or state.has("D06Z01S12[NE]", player) + ) + and state.has("Purified Hand of the Nun", player) + )) + set_rule(world.get_location("AR: Upper west shaft Child of Moonlight", player), + lambda state: ( + state.has("D06Z01S12[W]", player) + or state.has("D06Z01S12[E]", player) + or state.has("D06Z01S12[NW]", player) + or state.has("D06Z01S12[NE]", player) + or state.has("D06Z01S12[NE2]", player) + or state.has("Wall Climb Ability", player) + and state.has_any({"Purified Hand of the Nun", "Taranto to my Sister"}, player) + )) + # Doors + set_rule(world.get_entrance("D06Z01S12[W]", player), + lambda state: ( + state.has("D06Z01S12[NW]", player) + or state.has("D06Z01S12[NE]", player) + or state.has("D06Z01S12[NE2]", player) + or state.has("D06Z01S12[E]", player) + or state.has_all({"Wall Climb Ability", "Purified Hand of the Nun"}, player) + )) + set_rule(world.get_entrance("D06Z01S12[E]", player), + lambda state: ( + state.has("D06Z01S12[NW]", player) + or state.has("D06Z01S12[NE]", player) + or state.has("D06Z01S12[NE2]", player) + or state.has("D06Z01S12[W]", player) + or state.has_all({"Wall Climb Ability", "Purified Hand of the Nun"}, player) + )) + set_rule(world.get_entrance("D06Z01S12[NW]", player), + lambda state: ( + state.has("D06Z01S12[NE]", player) + or state.has("D06Z01S12[NE2]", player) + )) + add_rule(world.get_entrance("D06Z01S12[NW]", player), + lambda state: ( + state.has("D06Z01S12[NE]", player) + or state.has_any({"Wall Climb Ability", "Purified Hand of the Nun"}, player) + )) + set_rule(world.get_entrance("D06Z01S12[NE]", player), + lambda state: ( + state.has("D06Z01S12[NW]", player) + or state.has("D06Z01S12[NE2]", player) + )) + add_rule(world.get_entrance("D06Z01S12[NE]", player), + lambda state: ( + state.has("D06Z01S12[NW]", player) + or state.has_any({"Wall Climb Ability", "Purified Hand of the Nun"}, player) + )) + + + # D06Z01S15 (Archcathedral Rooftops) + # Items + set_rule(world.get_location("AR: Upper east shaft ledge", player), + lambda state: ( + state.has("D06Z01S15[SW]", player) + and state.has("Wall Climb Ability", player) + and ( + can_cross_gap(state, logic, player, 10) + or can_climb_on_root(state, player) + and ( + state.has("Blood Perpetuated in Sand", player) + or state.has("Purified Hand of the Nun", player) + and can_air_stall(state, logic, player) + ) + ) + )) + # Doors + set_rule(world.get_entrance("D06Z01S15[NW]", player), + lambda state: state.has("D06Z01S15[NE]", player)) + add_rule(world.get_entrance("D06Z01S15[NW]", player), + lambda state: ( + state.has("D06Z01S15[SW]", player) + or state.has("Wall Climb Ability", player) + )) + set_rule(world.get_entrance("D06Z01S15[NE]", player), + lambda state: state.has("D06Z01S15[NW]", player)) + add_rule(world.get_entrance("D06Z01S15[NE]", player), + lambda state: ( + state.has("D06Z01S15[SW]", player) + or state.has("Wall Climb Ability", player) + )) + + + # D06Z01S16 (Archcathedral Rooftops) + # No items + # Doors + set_rule(world.get_entrance("D06Z01S16[W]", player), + lambda state: ( + ( + state.has("D06Z01S16[CherubsL]", player) + and ( + state.has("Purified Hand of the Nun", player) + or state.has("Wall Climb Ability", player) + and ( + can_walk_on_root(state, player) + or can_air_stall(state, logic, player) + ) + ) + ) + or ( + state.has("D06Z01S16[CherubsR]", player) + and ( + state.has("Purified Hand of the Nun", player) + or can_air_stall(state, logic, player) + and ( + can_walk_on_root(state, player) + or state.has("The Young Mason's Wheel", player) + ) + and ( + state.has("Wall Climb Ability", player) + or can_dawn_jump(state, logic, player) + ) + ) + ) + or ( + state.has("D06Z01S16[E]", player) + and ( + can_walk_on_root(state, player) + or can_cross_gap(state, logic, player, 7) + ) + and ( + state.has("Wall Climb Ability", player) or + can_cross_gap(state, logic, player, 5) + ) + ) + )) + set_rule(world.get_entrance("D06Z01S16[E]", player), + lambda state: ( + ( + ( + state.has("D06Z01S16[W]", player) + or state.has("D06Z01S16[CherubsL]", player) + ) + and ( + can_walk_on_root(state, player) + or can_cross_gap(state, logic, player, 5) + ) + ) + or ( + state.has("D06Z01S16[CherubsR]", player) + and ( + state.has("Purified Hand of the Nun", player) + or can_air_stall(state, logic, player) + and ( + can_walk_on_root(state, player) + and state.has("The Young Mason's Wheel", player) + ) + ) + ) + )) + set_rule(world.get_entrance("D06Z01S16[-CherubsL]", player), + lambda state: ( + state.has("Linen of Golden Thread", player) + and ( + state.has("D06Z01S16[W]", player) + or ( + state.has("D06Z01S16[CherubsR]", player) + and ( + state.has("Purified Hand of the Nun", player) + or can_air_stall(state, logic, player) + and ( + can_walk_on_root(state, player) + or state.has("The Young Mason's Wheel", player) + ) + ) + ) + or ( + state.has("D06Z01S16[E]", player) + and ( + can_walk_on_root(state, player) + or can_cross_gap(state, logic, player, 7) + ) + ) + ) + )) + set_rule(world.get_entrance("D06Z01S16[-CherubsR]", player), + lambda state: ( + state.has("Linen of Golden Thread", player) + and ( + state.has("D06Z01S16[E]", player) + or ( + state.has("D06Z01S16[CherubsL]", player) + and ( + can_air_stall(state, logic, player) + or can_walk_on_root(state, player) + or state.has("Purified Hand of the Nun", player) + ) + ) + or ( + state.has("D06Z01S16[W]", player) + and ( + can_walk_on_root(state, player) + or can_cross_gap(state, logic, player, 1) + ) + ) + ) + )) + + + # D06Z01S17 (Archcathedral Rooftops) + # No items + # Doors + set_rule(world.get_entrance("D06Z01S17[W]", player), + lambda state: ( + ( + state.has("D06Z01S17[E]", player) + or state.has("D06Z01S17[CherubsR]", player) + ) + and state.has("Blood Perpetuated in Sand", player) + or state.has("D06Z01S17[CherubsL]", player) + and state.has("Purified Hand of the Nun", player) + )) + set_rule(world.get_entrance("D06Z01S17[E]", player), + lambda state: ( + state.has("D06Z01S17[CherubsR]", player) + or state.has("Blood Perpetuated in Sand", player) + and ( + state.has("D06Z01S17[W]", player) + or state.has("D06Z01S17[CherubsL]", player) + and state.has("Purified Hand of the Nun", player) + ) + )) + set_rule(world.get_entrance("D06Z01S17[-Cherubs]", player), + lambda state: state.has("Linen of Golden Thread", player)) + + + # D06Z01S18 (Archcathedral Rooftops) + # No items + # Doors + set_rule(world.get_entrance("D06Z01S18[-Cherubs]", player), + lambda state: state.has("Linen of Golden Thread", player)) + + # D06Z01S21 (Archcathedral Rooftops) + # Items + set_rule(world.get_location("AR: Third soldier fight", player), + lambda state: can_beat_boss(state, "Legionary", logic, player)) + # Doors + set_rule(world.get_entrance("D06Z01S21[W]", player), + lambda state: can_beat_boss(state, "Legionary", logic, player)) + set_rule(world.get_entrance("D06Z01S21[E]", player), + lambda state: can_beat_boss(state, "Legionary", logic, player)) + + + # D06Z01S23 (Archcathedral Rooftops) + # Event + set_rule(world.get_location("OpenedARLadder", player), + lambda state: opened_ar_ladder(state, player)) + + + # D06Z01S25 (Archcathedral Rooftops) + # Items + set_rule(world.get_location("AR: Crisanta of the Wrapped Agony", player), + lambda state: can_beat_boss(state, "Rooftops", logic, player)) + # Doors + set_rule(world.get_entrance("D06Z01S25[W]", player), + lambda state: can_beat_boss(state, "Rooftops", logic, player)) + set_rule(world.get_entrance("D06Z01S25[E]", player), + lambda state: can_beat_boss(state, "Rooftops", logic, player)) + + + # D08Z01S01 (Bridge of the Three Cavalries) + # Items + set_rule(world.get_location("BotTC: Esdras, of the Anointed Legion", player), + lambda state: ( + state.has_group("wounds", player, 3) + and can_beat_boss(state, "Bridge", logic, player) + )) + set_rule(world.get_location("BotTC: Esdras' gift", player), + lambda state: ( + state.has_group("wounds", player, 3) + and can_beat_boss(state, "Bridge", logic, player) + )) + # Doors + set_rule(world.get_entrance("D08Z01S01[W]", player), + lambda state: can_beat_boss(state, "Bridge", logic, player)) + set_rule(world.get_entrance("D08Z01S01[E]", player), + lambda state: ( + state.has_group("wounds", player, 3) + and ( + state.has("D08Z01S01[Cherubs]", player) + or can_beat_boss(state, "Bridge", logic, player) + ) + )) + + + # D08Z01S02 (Bridge of the Three Cavalries) + # No items + # Items + set_rule(world.get_entrance("D08Z01S02[-Cherubs]", player), + lambda state: state.has("Linen of Golden Thread", player)) + # Event + set_rule(world.get_location("BrokeBOTTCStatue", player), + lambda state: broke_bottc_statue(state, player)) + + + # D08Z02S03 (Ferrous Tree) + # No items + # Doors + set_rule(world.get_entrance("D08Z02S03[W]", player), + lambda state: state.has("OpenedBOTTCStatue", player)) + + + # D08Z03S01 (Hall of the Dawning) + # No items + # Doors + set_rule(world.get_entrance("D08Z03S01[E]", player), + lambda state: state.has("Verses Spun from Gold", player, 4)) + + + # D08Z03S02 (Hall of the Dawning) + # No items + # Doors + set_rule(world.get_entrance("D08Z03S02[NW]", player), + lambda state: state.has("Wall Climb Ability", player)) + + + # D08Z03S03 (Hall of the Dawning) + # Items + set_rule(world.get_location("HotD: Laudes, the First of the Amanecidas", player), + lambda state: can_beat_boss(state, "Hall", logic, player)) + # Doors + set_rule(world.get_entrance("D08Z03S03[W]", player), + lambda state: can_beat_boss(state, "Hall", logic, player)) + set_rule(world.get_entrance("D08Z03S03[E]", player), + lambda state: can_beat_boss(state, "Hall", logic, player)) + + + # D09Z01S01 (Wall of the Holy Prohibitions) + # Items + set_rule(world.get_location("WotHP: Amanecida of the Molten Thorn", player), + lambda state: can_beat_boss(state, "Wall", logic, player)) + # No doors + + + # D09Z01S02 (Wall of the Holy Prohibitions) + # Items + set_rule(world.get_location("WotHP: Upper east room, center gold cell", player), + lambda state: state.has("D09Z01S02[Cell5]", player)) + set_rule(world.get_location("WotHP: Upper east room, lift puzzle", player), + lambda state: ( + state.has("D09Z01S02[NW]", player) + or state.has("D09Z01S02[N]", player) + or state.has("D09Z01S02[Cell1]", player) + or state.has("D09Z01S02[Cell6]", player) + or state.has("D09Z01S02[Cell4]", player) + or state.has("D09Z01S02[Cell3]", player) + or state.has("D09Z01S02[Cell22]", player) + or state.has("D09Z01S02[Cell23]", player) + )) + # Doors + set_rule(world.get_entrance("D09Z01S02[SW]", player), + lambda state: state.has("D09Z01S02[Cell2]", player)) + set_rule(world.get_entrance("D09Z01S02[NW]", player), + lambda state: ( + state.has("D09Z01S02[N]", player) + or state.has("D09Z01S02[Cell1]", player) + or state.has("D09Z01S02[Cell6]", player) + or state.has("D09Z01S02[Cell4]", player) + or state.has("D09Z01S02[Cell3]", player) + or state.has("D09Z01S02[Cell22]", player) + or state.has("D09Z01S02[Cell23]", player) + )) + set_rule(world.get_entrance("D09Z01S02[N]", player), + lambda state: ( + state.has("D09Z01S02[NW]", player) + or state.has("D09Z01S02[Cell1]", player) + or state.has("D09Z01S02[Cell6]", player) + or state.has("D09Z01S02[Cell4]", player) + or state.has("D09Z01S02[Cell3]", player) + or state.has("D09Z01S02[Cell22]", player) + or state.has("D09Z01S02[Cell23]", player) + )) + set_rule(world.get_entrance("D09Z01S02[Cell1]", player), + lambda state: ( + state.has("D09Z01S02[NW]", player) + or state.has("D09Z01S02[N]", player) + or state.has("D09Z01S02[Cell6]", player) + or state.has("D09Z01S02[Cell4]", player) + or state.has("D09Z01S02[Cell3]", player) + or state.has("D09Z01S02[Cell22]", player) + or state.has("D09Z01S02[Cell23]", player) + )) + add_rule(world.get_entrance("D09Z01S02[Cell1]", player), + lambda state: state.has("Key of the Secular", player)) + set_rule(world.get_entrance("D09Z01S02[Cell6]", player), + lambda state: ( + state.has("D09Z01S02[NW]", player) + or state.has("D09Z01S02[N]", player) + or state.has("D09Z01S02[Cell1]", player) + or state.has("D09Z01S02[Cell4]", player) + or state.has("D09Z01S02[Cell3]", player) + or state.has("D09Z01S02[Cell22]", player) + or state.has("D09Z01S02[Cell23]", player) + )) + add_rule(world.get_entrance("D09Z01S02[Cell6]", player), + lambda state: state.has("Key of the Scribe", player)) + set_rule(world.get_entrance("D09Z01S02[Cell4]", player), + lambda state: ( + state.has("D09Z01S02[NW]", player) + or state.has("D09Z01S02[N]", player) + or state.has("D09Z01S02[Cell1]", player) + or state.has("D09Z01S02[Cell6]", player) + or state.has("D09Z01S02[Cell3]", player) + or state.has("D09Z01S02[Cell22]", player) + or state.has("D09Z01S02[Cell23]", player) + )) + add_rule(world.get_entrance("D09Z01S02[Cell4]", player), + lambda state: state.has("Key of the Inquisitor", player)) + set_rule(world.get_entrance("D09Z01S02[Cell2]", player), + lambda state: state.has("D09Z01S02[SW]", player)) + set_rule(world.get_entrance("D09Z01S02[Cell3]", player), + lambda state: ( + state.has("D09Z01S02[NW]", player) + or state.has("D09Z01S02[N]", player) + or state.has("D09Z01S02[Cell1]", player) + or state.has("D09Z01S02[Cell6]", player) + or state.has("D09Z01S02[Cell4]", player) + or state.has("D09Z01S02[Cell22]", player) + or state.has("D09Z01S02[Cell23]", player) + )) + add_rule(world.get_entrance("D09Z01S02[Cell3]", player), + lambda state: state.has("Key of the Secular", player)) + set_rule(world.get_entrance("D09Z01S02[Cell22]", player), + lambda state: ( + state.has("D09Z01S02[NW]", player) + or state.has("D09Z01S02[N]", player) + or state.has("D09Z01S02[Cell1]", player) + or state.has("D09Z01S02[Cell6]", player) + or state.has("D09Z01S02[Cell4]", player) + or state.has("D09Z01S02[Cell3]", player) + or state.has("D09Z01S02[Cell23]", player) + )) + set_rule(world.get_entrance("D09Z01S02[Cell23]", player), + lambda state: ( + state.has("D09Z01S02[NW]", player) + or state.has("D09Z01S02[N]", player) + or state.has("D09Z01S02[Cell1]", player) + or state.has("D09Z01S02[Cell6]", player) + or state.has("D09Z01S02[Cell4]", player) + or state.has("D09Z01S02[Cell3]", player) + or state.has("D09Z01S02[Cell22]", player) + )) + add_rule(world.get_entrance("D09Z01S02[Cell23]", player), + lambda state: state.has("Key of the Secular", player)) + + + # D09Z01S03 (Wall of the Holy Prohibitions) + # Items + set_rule(world.get_location("WotHP: Quirce, Returned By The Flames", player), + lambda state: can_beat_boss(state, "Prison", logic, player)) + # Doors + set_rule(world.get_entrance("D09Z01S03[W]", player), + lambda state: ( + state.has("D09Z01S03[N]", player) + and can_beat_boss(state, "Prison", logic, player) + )) + + + # D09Z01S05 (Wall of the Holy Prohibitions) + # Event + set_rule(world.get_location("OpenedWOTHPGate", player), + lambda state: opened_wothp_gate(state, player)) + + + # D09Z01S06 (Wall of the Holy Prohibitions) + # No items + # Doors + set_rule(world.get_entrance("D09Z01S06[-E]", player), + lambda state: state.has("Key of the High Peaks", player)) + + + # D09Z01S07 (Wall of the Holy Prohibitions) + # No items + # Doors + set_rule(world.get_entrance("D09Z01S07[SW]", player), + lambda state: ( + state.has("D09Z01S07[SE]", player) + or state.has("D09Z01S07[W]", player) + or state.has("D09Z01S07[E]", player) + )) + set_rule(world.get_entrance("D09Z01S07[SE]", player), + lambda state: ( + state.has("D09Z01S07[SW]", player) + or state.has("D09Z01S07[W]", player) + or state.has("D09Z01S07[E]", player) + )) + set_rule(world.get_entrance("D09Z01S07[W]", player), + lambda state: ( + state.has("D09Z01S07[SW]", player) + or state.has("D09Z01S07[SE]", player) + or state.has("D09Z01S07[E]", player) + )) + set_rule(world.get_entrance("D09Z01S07[E]", player), + lambda state: ( + state.has("D09Z01S07[SW]", player) + or state.has("D09Z01S07[SE]", player) + or state.has("D09Z01S07[W]", player) + )) + set_rule(world.get_entrance("D09Z01S07[NW]", player), + lambda state: state.has("D09Z01S07[N]", player)) + set_rule(world.get_entrance("D09Z01S07[N]", player), + lambda state: state.has("D09Z01S07[NW]", player)) + set_rule(world.get_entrance("D09Z01S07[NE]", player), + lambda state: ( + state.has("D09Z01S07[SW]", player) + or state.has("D09Z01S07[SE]", player) + or state.has("D09Z01S07[W]", player) + or state.has("D09Z01S07[E]", player) + )) + add_rule(world.get_entrance("D09Z01S07[NE]", player), + lambda state: state.has("Blood Perpetuated in Sand", player)) + + + # D09Z01S08 (Wall of the Holy Prohibitions) + # Items + set_rule(world.get_location("WotHP: Collapsing floor ledge", player), + lambda state: ( + ( + state.has("D09Z01S08[W]", player) + or state.has("D09Z01S08[Cell18]", player) + ) + and state.has("OpenedWOTHPGate", player) + )) + # Doors + set_rule(world.get_entrance("D09Z01S08[W]", player), + lambda state: state.has("D09Z01S08[Cell14]", player)) + add_rule(world.get_entrance("D09Z01S08[W]", player), + lambda state: state.has("OpenedWOTHPGate", player)) + set_rule(world.get_entrance("D09Z01S08[S]", player), + lambda state: ( + state.has("D09Z01S08[W]", player) + or state.has("D09Z01S08[Cell14]", player) + )) + set_rule(world.get_entrance("D09Z01S08[SE]", player), + lambda state: ( + state.has("D09Z01S08[Cell15]", player) + or state.has("D09Z01S08[Cell16]", player) + or state.has("D09Z01S08[Cell18]", player) + or state.has("D09Z01S08[Cell17]", player) + and state.has("Dash Ability", player) + )) + set_rule(world.get_entrance("D09Z01S08[NE]", player), + lambda state: ( + state.has("D09Z01S08[Cell7]", player) + or state.has("D09Z01S08[Cell17]", player) + and state.has("Dash Ability", player) + )) + set_rule(world.get_entrance("D09Z01S08[Cell14]", player), + lambda state: state.has("D09Z01S08[W]", player)) + set_rule(world.get_entrance("D09Z01S08[Cell15]", player), + lambda state: ( + state.has("Key of the Scribe", player) + and ( + state.has("D09Z01S08[SE]", player) + or state.has("D09Z01S08[Cell16]", player) + or state.has("D09Z01S08[Cell18]", player) + or state.has("D09Z01S08[Cell17]", player) + and state.has("Dash Ability", player) + ) + )) + set_rule(world.get_entrance("D09Z01S08[Cell7]", player), + lambda state: ( + state.has("Key of the Inquisitor", player) + and ( + state.has("D09Z01S08[NE]", player) + or state.has("D09Z01S08[Cell17]", player) + and state.has("Dash Ability", player) + ) + )) + set_rule(world.get_entrance("D09Z01S08[Cell16]", player), + lambda state: ( + state.has("Key of the Inquisitor", player) + and ( + state.has("D09Z01S08[SE]", player) + or state.has("D09Z01S08[Cell15]", player) + or state.has("D09Z01S08[Cell18]", player) + or state.has("D09Z01S08[Cell17]", player) + and state.has("Dash Ability", player) + ) + )) + set_rule(world.get_entrance("D09Z01S08[Cell18]", player), + lambda state: ( + state.has("Key of the Scribe", player) + and ( + state.has("D09Z01S08[SE]", player) + or state.has("D09Z01S08[Cell15]", player) + or state.has("D09Z01S08[Cell16]", player) + or state.has("D09Z01S08[Cell17]", player) + and state.has("Dash Ability", player) + ) + )) + + + # D09Z01S09 (Wall of the Holy Prohibitions) + # Items + set_rule(world.get_location("WotHP: Lower west room, top ledge", player), + lambda state: ( + state.has("D09Z01S09[Cell24]", player) + or state.has("Dash Ability", player) + and ( + state.has("D09Z01S09[NW]", player) + or state.has("D09Z01S09[Cell19]", player) + ) + )) + # Doors + set_rule(world.get_entrance("D09Z01S09[SW]", player), + lambda state: ( + state.has("D09Z01S09[Cell21]", player) + or state.has("D09Z01S09[Cell20]", player) + or state.has("D09Z01S09[E]", player) + or state.has("Dash Ability", player) + )) + set_rule(world.get_entrance("D09Z01S09[NW]", player), + lambda state: ( + state.has("D09Z01S09[Cell19]", player) + or state.has("D09Z01S09[Cell24]", player) + )) + add_rule(world.get_entrance("D09Z01S09[NW]", player), + lambda state: ( + state.has("D09Z01S09[Cell19]", player) + or state.has("Dash Ability", player) + )) + set_rule(world.get_entrance("D09Z01S09[E]", player), + lambda state: ( + state.has("D09Z01S09[Cell21]", player) + or state.has("D09Z01S09[Cell20]", player) + or state.has("D09Z01S09[SW]", player) + or state.has("Dash Ability", player) + )) + set_rule(world.get_entrance("D09Z01S09[Cell24]", player), + lambda state: ( + state.has("D09Z01S09[NW]", player) + or state.has("D09Z01S09[Cell19]", player) + )) + add_rule(world.get_entrance("D09Z01S09[Cell24]", player), + lambda state: state.has("Dash Ability", player)) + set_rule(world.get_entrance("D09Z01S09[Cell24]", player), + lambda state: ( + state.has("D09Z01S09[NW]", player) + or state.has("D09Z01S09[Cell24]", player) + )) + add_rule(world.get_entrance("D09Z01S09[Cell19]", player), + lambda state: ( + state.has("D09Z01S09[NW]", player) + or state.has("Dash Ability", player) + )) + set_rule(world.get_entrance("D09Z01S09[Cell20]", player), + lambda state: ( + state.has("Key of the Scribe", player) + and ( + state.has("D09Z01S09[Cell21]", player) + or state.has("D09Z01S09[SW]", player) + or state.has("D09Z01S09[E]", player) + or state.has("Dash Ability", player) + ) + )) + set_rule(world.get_entrance("D09Z01S09[Cell21]", player), + lambda state: ( + state.has("Key of the Inquisitor", player) + and ( + state.has("D09Z01S09[Cell20]", player) + or state.has("D09Z01S09[SW]", player) + or state.has("D09Z01S09[E]", player) + or state.has("Dash Ability", player) + ) + )) + + + # D09Z01S10 (Wall of the Holy Prohibitions) + # Items + set_rule(world.get_location("WotHP: Lower east room, top bronze cell", player), + lambda state: state.has("D09Z01S10[Cell13]", player)) + set_rule(world.get_location("WotHP: Lower east room, hidden ledge", player), + lambda state: ( + state.has("D09Z01S10[W]", player) + or state.has("D09Z01S10[Cell12]", player) + or state.has("D09Z01S10[Cell10]", player) + or state.has("D09Z01S10[Cell11]", player) + )) + # Doors + set_rule(world.get_entrance("D09Z01S10[W]", player), + lambda state: ( + state.has("D09Z01S10[Cell12]", player) + or state.has("D09Z01S10[Cell10]", player) + or state.has("D09Z01S10[Cell11]", player) + )) + set_rule(world.get_entrance("D09Z01S10[Cell12]", player), + lambda state: ( + state.has("D09Z01S10[W]", player) or \ + state.has("D09Z01S10[Cell10]", player) or \ + state.has("D09Z01S10[Cell11]", player) + )) + add_rule(world.get_entrance("D09Z01S10[Cell12]", player), + lambda state: state.has("Key of the Secular", player)) + set_rule(world.get_entrance("D09Z01S10[Cell10]", player), + lambda state: ( + state.has("D09Z01S10[W]", player) + or state.has("D09Z01S10[Cell12]", player) + or state.has("D09Z01S10[Cell11]", player) + )) + add_rule(world.get_entrance("D09Z01S10[Cell10]", player), + lambda state: state.has("Key of the Scribe", player)) + set_rule(world.get_entrance("D09Z01S10[Cell11]", player), + lambda state: ( + state.has("D09Z01S10[W]", player) + or state.has("D09Z01S10[Cell12]", player) + or state.has("D09Z01S10[Cell10]", player) + )) + add_rule(world.get_entrance("D09Z01S10[Cell11]", player), + lambda state: state.has("Key of the Scribe", player)) + + # D09BZ01S01 (Wall of the Holy Prohibitions - Inside cells) + # Items + set_rule(world.get_location("WotHP: Upper east room, center cell ledge", player), + lambda state: state.has("D09BZ01S01[Cell22]", player)) + set_rule(world.get_location("WotHP: Upper east room, center cell floor", player), + lambda state: ( + state.has("D09BZ01S01[Cell22]", player) + or state.has("D09BZ01S01[Cell23]", player) + )) + set_rule(world.get_location("WotHP: Upper east room, top bronze cell", player), + lambda state: state.has("D09BZ01S01[Cell1]", player)) + set_rule(world.get_location("WotHP: Upper east room, top silver cell", player), + lambda state: state.has("D09BZ01S01[Cell6]", player)) + set_rule(world.get_location("WotHP: Upper west room, top silver cell", player), + lambda state: ( + state.has("D09BZ01S01[Cell14]", player) + or state.has("D09BZ01S01[Cell15]", player) + )) + set_rule(world.get_location("WotHP: Upper west room, center gold cell", player), + lambda state: state.has("D09BZ01S01[Cell16]", player)) + set_rule(world.get_location("WotHP: Lower west room, bottom gold cell", player), + lambda state: ( + state.has("D09BZ01S01[Cell21]", player) + and state.has("Blood Perpetuated in Sand", player) + and can_climb_on_root(state, player) + and can_survive_poison(state, logic, player, 2) + and state.has("Dash Ability", player) + )) + set_rule(world.get_location("WotHP: Lower east room, top silver cell", player), + lambda state: state.has("D09BZ01S01[Cell10]", player)) + set_rule(world.get_location("WotHP: Lower east room, bottom silver cell", player), + lambda state: ( + state.has("D09BZ01S01[Cell11]", player) + and ( + can_survive_poison(state, logic, player, 1) + and state.has("Dash Ability", player) + or state.has_any({"Debla of the Lights", "Taranto to my Sister", "Cante Jondo of the Three Sisters", "Verdiales of the Forsaken Hamlet", "Cantina of the Blue Rose"}, player) + or aubade(state, player) + ) + )) + # Doors + set_rule(world.get_entrance("D09BZ01S01[Cell2]", player), + lambda state: state.has("D09BZ01S01[Cell3]", player)) + set_rule(world.get_entrance("D09BZ01S01[Cell3]", player), + lambda state: state.has("D09BZ01S01[Cell2]", player)) + set_rule(world.get_entrance("D09BZ01S01[Cell4]", player), + lambda state: state.has("D09BZ01S01[Cell5]", player)) + set_rule(world.get_entrance("D09BZ01S01[Cell5]", player), + lambda state: state.has("D09BZ01S01[Cell5]", player)) + set_rule(world.get_entrance("D09BZ01S01[Cell12]", player), + lambda state: state.has("D09BZ01S01[Cell13]", player)) + set_rule(world.get_entrance("D09BZ01S01[Cell13]", player), + lambda state: state.has("D09BZ01S01[Cell12]", player)) + set_rule(world.get_entrance("D09BZ01S01[Cell14]", player), + lambda state: state.has("D09BZ01S01[Cell15]", player)) + set_rule(world.get_entrance("D09BZ01S01[Cell15]", player), + lambda state: state.has("D09BZ01S01[Cell14]", player)) + set_rule(world.get_entrance("D09BZ01S01[Cell17]", player), + lambda state: state.has("D09BZ01S01[Cell18]", player)) + set_rule(world.get_entrance("D09BZ01S01[Cell19]", player), + lambda state: state.has("D09BZ01S01[Cell20]", player)) + set_rule(world.get_entrance("D09BZ01S01[Cell20]", player), + lambda state: state.has("D09BZ01S01[Cell19]", player)) + set_rule(world.get_entrance("D09BZ01S01[Cell23]", player), + lambda state: state.has("D09BZ01S01[Cell22]", player)) + add_rule(world.get_entrance("D09BZ01S01[Cell23]", player), + lambda state: state.has("Key of the Secular", player)) + + + # D17Z01S01 (Brotherhood of the Silent Sorrow) + set_rule(world.get_location("BotSS: Starting room ledge", player), + lambda state: state.has("D17Z01S01[Cherubs3]", player)) + set_rule(world.get_location("BotSS: Starting room Child of Moonlight", player), + lambda state: ( + state.has("D17Z01S01[Cherubs1]", player) + or state.has("Taranto to my Sister", player) + or ( + can_climb_on_root(state, player) + or can_cross_gap(state, logic, player, 9) + ) + and ( + state.has_any({"Blood Perpetuated in Sand", "Purified Hand of the Nun", "Debla of the Lights", "Verdiales of the Forsaken Hamlet", "Cloistered Ruby"}, player) + or tirana(state, player) + ) + )) + + + # D17Z01S02 (Brotherhood of the Silent Sorrow) + # No items + # Doors + set_rule(world.get_entrance("D17Z01S02[W]", player), + lambda state: state.has("Dash Ability", player)) + set_rule(world.get_entrance("D17Z01S02[E]", player), + lambda state: ( + state.has("D17Z01S02[N]", player) + or state.has("Dash Ability", player) + )) + set_rule(world.get_entrance("D17Z01S02[N]", player), + lambda state: ( + state.has("Blood Perpetuated in Sand", player) + and ( + state.has("D17Z01S02[E]", player) + or state.has("D17Z01S02[W]", player) + and state.has("Dash Ability", player) + ) + )) + + + # D17Z01S03 (Brotherhood of the Silent Sorrow) + # No items + # Doors + set_rule(world.get_entrance("D17Z01S03[relic]", player), + lambda state: state.has("Key to the Chamber of the Eldest Brother", player)) + + + # D17Z01S04 (Brotherhood of the Silent Sorrow) + # Items + if world.boots_of_pleading[player]: + set_rule(world.get_location("BotSS: 2nd meeting with Redento", player), + lambda state: redento(state, blasphemousworld, player, 2)) + # Doors + set_rule(world.get_entrance("D17Z01S04[N]", player), + lambda state: state.has("D17Z01S04[FrontR]", player)) + set_rule(world.get_entrance("D17Z01S04[FrontR]", player), + lambda state: state.has("D17Z01S04[N]", player)) + # Event + set_rule(world.get_location("OpenedBOTSSLadder", player), + lambda state: opened_botss_ladder(state, player)) + + + # D17Z01S05 (Brotherhood of the Silent Sorrow) + # No items + # Doors + set_rule(world.get_entrance("D17Z01S05[S]", player), + lambda state: state.has("OpenedBOTSSLadder", player)) + + + # D17Z01S10 (Brotherhood of the Silent Sorrow) + # No items + # Doors + set_rule(world.get_entrance("D17Z01S10[W]", player), + lambda state: state.has_any({"Blood Perpetuated in Sand", "Purified Hand of the Nun"}, player)) + + + # D17Z01S11 (Brotherhood of the Silent Sorrow) + # Items + set_rule(world.get_location("BotSS: Warden of the Silent Sorrow", player), + lambda state: can_beat_boss(state, "Brotherhood", logic, player)) + # Doors + set_rule(world.get_entrance("D17Z01S11[W]", player), + lambda state: can_beat_boss(state, "Brotherhood", logic, player)) + set_rule(world.get_entrance("D17Z01S11[E]", player), + lambda state: can_beat_boss(state, "Brotherhood", logic, player)) + + + # D17Z01S14 (Brotherhood of the Silent Sorrow) + # Items + set_rule(world.get_location("BotSS: Outside church", player), + lambda state: ( + state.has("D17Z01S14[W]", player) + or state.has("Blood Perpetuated in Sand", player) + )) + # Doors + set_rule(world.get_entrance("D17Z01S14[W]", player), + lambda state: ( + state.has("Incomplete Scapular", player) + and state.has("Blood Perpetuated in Sand", player) + )) + set_rule(world.get_entrance("D17Z01S14[E]", player), + lambda state: state.has("Blood Perpetuated in Sand", player)) + set_rule(world.get_entrance("D17Z01S14[-Cherubs1]", player), + lambda state: ( + state.has("Linen of Golden Thread", player) + and ( + state.has("D17Z01S14[W]", player) + or state.has("Blood Perpetuated in Sand", player) + or can_cross_gap(state, logic, player, 11) + ) + )) + set_rule(world.get_entrance("D17Z01S14[-Cherubs2]", player), + lambda state: ( + state.has("Linen of Golden Thread", player) + and ( + state.has("D17Z01S14[E]", player) + and can_cross_gap(state, logic, player, 8) + or state.has("D17Z01S14[W]", player) + and can_cross_gap(state, logic, player, 10) + or state.has("Blood Perpetuated in Sand", player) + ) + )) + set_rule(world.get_entrance("D17Z01S14[-Cherubs3]", player), + lambda state: ( + state.has("Linen of Golden Thread", player) + and ( + state.has("D17Z01S14[E]", player) + or state.has("Blood Perpetuated in Sand", player) + ) + )) + + + # D17Z01S15 (Brotherhood of the Silent Sorrow) + # Items + set_rule(world.get_location("BotSS: Esdras' final gift", player), + lambda state: ( + can_beat_boss(state, "Bridge", logic, player) + and state.has_group("wounds", player, 3) + )) + set_rule(world.get_location("BotSS: Crisanta's gift", player), + lambda state: ( + can_beat_boss(state, "Rooftops", logic, player) + and state.has("Apodictic Heart of Mea Culpa", player) + )) + # No doors + + + # D17BZ02S01 (Brotherhood of the Silent Sorrow - Platforming challenge) + # Items + set_rule(world.get_location("BotSS: Platforming gauntlet", player), + lambda state: ( + state.has("D17BZ02S01[FrontR]", player) + or state.has_all({"Dash Ability", "Wall Climb Ability"}, player) + )) + # Doors + set_rule(world.get_entrance("D17BZ02S01[FrontR]", player), + lambda state: state.has_all({"Dash Ability", "Wall Climb Ability"}, player)) + + + # D20Z01S04 (Echoes of Salt) + # No items + # Doors + set_rule(world.get_entrance("D20Z01S04[E]", player), + lambda state: state.has("OpenedDCGateW", player)) + + + # D20Z01S09 (Echoes of Salt) + # Items + set_rule(world.get_location("EoS: Lantern jump near elevator", player), + lambda state: ( + state.has("D20Z01S09[W]", player) + or state.has("Dash Ability", player) + )) + # Doors + set_rule(world.get_entrance("D20Z01S09[W]", player), + lambda state: state.has("Dash Ability", player)) + set_rule(world.get_entrance("D20Z01S09[E]", player), + lambda state: state.has_all({"Blood Perpetuated in Sand", "Dash Ability"}, player)) + + + # D20Z01S10 (Echoes of Salt) + # No items + # Doors + set_rule(world.get_entrance("D20Z01S10[W]", player), + lambda state: state.has_all({"Blood Perpetuated in Sand", "Dash Ability"}, player)) + set_rule(world.get_entrance("D20Z01S10[E]", player), + lambda state: state.has_all({"Blood Perpetuated in Sand", "Dash Ability"}, player)) + + + # D20Z02S03 (Mourning and Havoc) + # No items + # Doors + set_rule(world.get_entrance("D20Z02S03[NE]", player), + lambda state: ( + can_walk_on_root(state, player) + or can_cross_gap(state, logic, player, 5) + )) + + + # D20Z02S04 (Mourning and Havoc) + # No items + # Doors + set_rule(world.get_entrance("D20Z02S04[W]", player), + lambda state: state.has("Dash Ability", player)) + set_rule(world.get_entrance("D20Z02S04[E]", player), + lambda state: state.has("Dash Ability", player)) + + + # D20Z02S05 (Mourning and Havoc) + # No items + # Doors + set_rule(world.get_entrance("D20Z02S05[NW]", player), + lambda state: ( + state.has("Nail Uprooted from Dirt", player) + or can_cross_gap(state, logic, player, 3) + )) + + + # D20Z02S06 (Mourning and Havoc) + # No items + # Doors + set_rule(world.get_entrance("D20Z02S06[NW]", player), + lambda state: ( + state.has("D20Z02S06[NE]", player) + or state.has("Purified Hand of the Nun", player) + or can_climb_on_root(state, player) + or can_dive_laser(state, logic, player) + )) + set_rule(world.get_entrance("D20Z02S06[NE]", player), + lambda state: ( + state.has("D20Z02S06[NW]", player) + or state.has("Purified Hand of the Nun", player) + or can_climb_on_root(state, player) + or can_dive_laser(state, logic, player) + )) + + + # D20Z02S08 (Mourning and Havoc) + # Items + set_rule(world.get_location("MaH: Sierpes", player), + lambda state: can_beat_boss(state, "Mourning", logic, player)) + set_rule(world.get_location("MaH: Sierpes' eye", player), + lambda state: can_beat_boss(state, "Mourning", logic, player)) + # No doors + + + # D20Z02S11 (Mourning and Havoc) + # No items + # Doors + set_rule(world.get_entrance("D20Z02S11[NW]", player), + lambda state: state.has("D20Z02S11[E]", player)) + set_rule(world.get_entrance("D20Z02S11[NW]", player), + lambda state: ( + mourning_skips_allowed(logic) + and ( + state.has("Purified Hand of the Nun", player) + or can_break_tirana(state, logic, player) + or state.has("D20Z02S11[E]", player) + ) + )) + set_rule(world.get_entrance("D20Z02S11[E]", player), + lambda state: ( + mourning_skips_allowed(logic) + and ( + state.has("Purified Hand of the Nun", player) + or can_break_tirana(state, logic, player) + or state.has("D20Z02S11[NW]", player) + and can_cross_gap(state, logic, player, 5) + ) + )) + + + # Misc Items + set_rule(world.get_location("Second red candle", player), + lambda state: ( + state.has("Bead of Red Wax", player) + and ( + state.can_reach(world.get_region("D02Z03S06", player), player) + or state.has("D05Z01S02[W]", player) + ) + )) + set_rule(world.get_location("Third red candle", player), + lambda state: ( + state.has("Bead of Red Wax", player) + and state.has("D05Z01S02[W]", player) + and state.can_reach(world.get_region("D02Z03S06", player), player) + )) + set_rule(world.get_location("Second blue candle", player), + lambda state: ( + state.has("Bead of Blue Wax", player) + and ( + state.has("OpenedBOTSSLadder", player) + or state.can_reach(world.get_region("D01Z04S16", player), player) + ) + )) + set_rule(world.get_location("Third blue candle", player), + lambda state: ( + state.has("Bead of Blue Wax", player) + and state.has("OpenedBOTSSLadder", player) + and state.can_reach(world.get_region("D01Z04S16", player), player) + )) set_rule(world.get_location("Defeat 1 Amanecida", player), - lambda state: state._blasphemous_bell(player) and \ - state._blasphemous_open_holes(player)) + lambda state: amanecida_rooms(state, logic, player, 1)) set_rule(world.get_location("Defeat 2 Amanecidas", player), - lambda state: state._blasphemous_bell(player) and \ - state._blasphemous_open_holes(player) and \ - (state._blasphemous_blood_relic(player) and \ - state._blasphemous_root_relic(player) or \ - state._blasphemous_bridge_access(player))) + lambda state: amanecida_rooms(state, logic, player, 2)) set_rule(world.get_location("Defeat 3 Amanecidas", player), - lambda state: state._blasphemous_bell(player) and \ - state._blasphemous_open_holes(player) and \ - state._blasphemous_bridge_access(player) and \ - (state._blasphemous_blood_relic(player) and \ - state._blasphemous_root_relic(player) or \ - (state._blasphemous_1_mask(player) and \ - state._blasphemous_bronze_key(player) and \ - state._blasphemous_silver_key(player)))) + lambda state: amanecida_rooms(state, logic, player, 3)) set_rule(world.get_location("Defeat 4 Amanecidas", player), - lambda state: state._blasphemous_bell(player) and \ - state._blasphemous_open_holes(player) and \ - state._blasphemous_bridge_access(player) and \ - state._blasphemous_1_mask(player) and \ - state._blasphemous_blood_relic(player) and \ - state._blasphemous_root_relic(player) and \ - state._blasphemous_bronze_key(player) and \ - state._blasphemous_silver_key(player)) + lambda state: amanecida_rooms(state, logic, player, 4)) set_rule(world.get_location("Defeat all Amanecidas", player), - lambda state: state._blasphemous_bell(player) and \ - state._blasphemous_open_holes(player) and \ - state._blasphemous_bridge_access(player) and \ - state._blasphemous_1_mask(player) and \ - state._blasphemous_blood_relic(player) and \ - state._blasphemous_root_relic(player) and \ - state._blasphemous_bronze_key(player) and \ - state._blasphemous_silver_key(player)) - - # expert logic - if world.expert_logic[player]: - # entrances - for i in world.get_region("Ferrous Tree", player).entrances: - set_rule(i, lambda state: state._blasphemous_ex_bridge_access(player)) - for i in world.get_region("Mother of Mothers", player).entrances: - set_rule(i, lambda state: state._blasphemous_ex_bridge_access(player)) - for i in world.get_region("Patio of the Silent Steps", player).entrances: - set_rule(i, lambda state: state._blasphemous_ex_bridge_access(player)) - for i in world.get_region("The Sleeping Canvases", player).entrances: - set_rule(i, lambda state: state._blasphemous_ex_bridge_access(player)) - for i in world.get_region("Wall of the Holy Prohibitions", player).entrances: - set_rule(i, lambda state: state._blasphemous_1_mask(player) and \ - state._blasphemous_ex_bridge_access(player)) - - # locations - set_rule(world.get_location("AR: Upper west shaft chest", player), - lambda state: state._blasphemous_2_masks(player) and \ - state._blasphemous_fall_relic(player) and \ - (state._blasphemous_root_relic(player) or \ - state._blasphemous_ranged(player))) - set_rule(world.get_location("BotTC: Esdras, of the Anointed Legion", player), - lambda state: state._blasphemous_ex_bridge_access(player)) - set_rule(world.get_location("BotTC: Esdras' gift", player), - lambda state: state._blasphemous_ex_bridge_access(player)) - set_rule(world.get_location("BotTC: Inside giant statue", player), - lambda state: state._blasphemous_ex_bridge_access(player) and \ - state._blasphemous_laudes_gate(player)) - set_rule(world.get_location("BotSS: Esdras' final gift", player), - lambda state: state._blasphemous_blood_relic(player) and \ - state._blasphemous_scapular(player) and \ - state._blasphemous_ex_bridge_access(player)) - set_rule(world.get_location("BotSS: Crisanta's gift", player), - lambda state: state._blasphemous_blood_relic(player) and \ - state._blasphemous_scapular(player) and \ - state._blasphemous_heart_c(player) and \ - state._blasphemous_3_masks(player) and \ - state._blasphemous_ex_bridge_access(player)) - set_rule(world.get_location("CoOLotCV: Lady of the Six Sorrows", player), - lambda state: state._blasphemous_ex_bridge_access(player) and \ - state._blasphemous_1_mask(player) and \ - state._blasphemous_bronze_key(player) and \ - state._blasphemous_silver_key(player) and \ - state._blasphemous_high_key(player)) - set_rule(world.get_location("CoOLotCV: Mask room", player), - lambda state: state._blasphemous_ex_bridge_access(player) and \ - state._blasphemous_1_mask(player) and \ - state._blasphemous_bronze_key(player) and \ - state._blasphemous_silver_key(player) and \ - state._blasphemous_high_key(player)) - set_rule(world.get_location("DC: Chalice room", player), - lambda state: (state._blasphemous_miasma_relic(player) and \ - state._blasphemous_water_relic(player) and \ - (state._blasphemous_root_relic(player) or \ - state._blasphemous_dawn_heart(player) or \ - (state._blasphemous_wheel(player) and \ - state._blasphemous_ranged(player)))) or \ - (state._blasphemous_fall_relic(player) and \ - (state._blasphemous_root_relic(player) or \ - state._blasphemous_ranged(player)))) - set_rule(world.get_location("DC: Mea Culpa altar", player), - lambda state: state._blasphemous_chalice(player) and \ - state._blasphemous_ex_bridge_access(player) and \ - state._blasphemous_1_mask(player) and \ - state._blasphemous_bronze_key(player) and \ - (state._blasphemous_fall_relic(player) and \ - (state._blasphemous_ranged(player) or \ - state._blasphemous_root_relic(player))) or \ - (state._blasphemous_miasma_relic(player) and \ - state._blasphemous_water_relic(player) and \ - (state._blasphemous_root_relic(player) or \ - state._blasphemous_dawn_heart(player) or \ - (state._blasphemous_wheel(player) and \ - state._blasphemous_ranged(player))))) - set_rule(world.get_location("HotD: Laudes, the First of the Amanecidas", player), - lambda state: state._blasphemous_ex_bridge_access(player) and \ - state._blasphemous_laudes_gate(player)) - set_rule(world.get_location("Jondo: Upper west tree root", player), - lambda state: state._blasphemous_root_relic(player) or \ - state._blasphemous_dawn_heart(player) or \ - (state._blasphemous_wheel(player) and \ - state._blasphemous_ranged(player))) - set_rule(world.get_location("LotNW: Elevator Child of Moonlight", player), - lambda state: state._blasphemous_blood_relic(player) and \ - (state._blasphemous_cherub_22_23_31_32(player) and \ - state._blasphemous_dawn_heart(player) and \ - state._blasphemous_ranged(player)) or \ - state._blasphemous_root_relic(player)) - set_rule(world.get_location("MD: Cave Child of Moonlight", player), - lambda state: state._blasphemous_ex_bridge_access(player) and \ - state._blasphemous_cherub_24_33(player)) - set_rule(world.get_location("MD: Behind gate to TSC", player), - lambda state: state._blasphemous_ex_bridge_access(player)) - set_rule(world.get_location("MoM: East chandelier platform", player), - lambda state: state._blasphemous_blood_relic(player) or \ - state._blasphemous_dawn_heart(player) or \ - (state._blasphemous_wheel(player) and \ - state._blasphemous_ranged(player))) - set_rule(world.get_location("MaH: Upper east chest", player), - lambda state: state._blasphemous_ex_bridge_access(player) and \ - (state._blasphemous_root_relic(player)) or \ - (state._blasphemous_dawn_heart(player) and \ - state._blasphemous_ranged(player))) - set_rule(world.get_location("MaH: Sierpes' eye", player), - lambda state: state._blasphemous_ex_bridge_access(player) and \ - (state._blasphemous_root_relic(player)) or \ - state._blasphemous_dawn_heart(player) or \ - state._blasphemous_water_relic(player) or \ - (state._blasphemous_wheel(player) and \ - state._blasphemous_ranged(player))) - set_rule(world.get_location("MaH: Sierpes", player), - lambda state: state._blasphemous_ex_bridge_access(player) and \ - (state._blasphemous_root_relic(player)) or \ - state._blasphemous_dawn_heart(player) or \ - state._blasphemous_water_relic(player) or \ - (state._blasphemous_wheel(player) and \ - state._blasphemous_ranged(player))) - set_rule(world.get_location("PotSS: Second area ledge", player), - lambda state: state._blasphemous_root_relic(player) or \ - state._blasphemous_dawn_heart(player) or \ - (state._blasphemous_wheel(player) and \ - state._blasphemous_ranged(player))) - set_rule(world.get_location("PotSS: Third area upper ledge", player), - lambda state: state._blasphemous_root_relic(player) or \ - state._blasphemous_dawn_heart(player) or \ - (state._blasphemous_wheel(player) and \ - state._blasphemous_ranged(player))) - set_rule(world.get_location("WotBC: Under broken bridge", player), - lambda state: state._blasphemous_blood_relic(player) or \ - state._blasphemous_dawn_heart(player) or \ - (state._blasphemous_wheel(player) and \ - state._blasphemous_ranged(player))) - set_rule(world.get_location("Confessor Dungeon 5 extra", player), - lambda state: state._blasphemous_bead(player) and \ - state._blasphemous_ex_bridge_access(player)) - set_rule(world.get_location("Confessor Dungeon 5 main", player), - lambda state: state._blasphemous_bead(player) and \ - state._blasphemous_ex_bridge_access(player)) - set_rule(world.get_location("Confessor Dungeon 6 extra", player), - lambda state: state._blasphemous_bead(player) and \ - state._blasphemous_ex_bridge_access(player) and \ - (state._blasphemous_blood_relic(player) or \ - state._blasphemous_1_mask(player) and \ - state._blasphemous_silver_key(player) and \ - state._blasphemous_bronze_key(player))) - set_rule(world.get_location("Confessor Dungeon 6 main", player), - lambda state: state._blasphemous_bead(player) and \ - state._blasphemous_ex_bridge_access(player) and \ - (state._blasphemous_blood_relic(player) or \ - state._blasphemous_1_mask(player) and \ - state._blasphemous_silver_key(player) and \ - state._blasphemous_bronze_key(player))) - set_rule(world.get_location("Confessor Dungeon 7 extra", player), - lambda state: state._blasphemous_bead(player) and \ - state._blasphemous_ex_bridge_access(player) and \ - state._blasphemous_1_mask(player) and \ - state._blasphemous_bronze_key(player) and \ - state._blasphemous_silver_key(player) and \ - state._blasphemous_blood_relic(player)) - set_rule(world.get_location("Confessor Dungeon 7 main", player), - lambda state: state._blasphemous_bead(player) and \ - state._blasphemous_ex_bridge_access(player) and \ - state._blasphemous_1_mask(player) and \ - state._blasphemous_bronze_key(player) and \ - state._blasphemous_silver_key(player) and \ - state._blasphemous_blood_relic(player)) - set_rule(world.get_location("Defeat 2 Amanecidas", player), - lambda state: state._blasphemous_bell(player) and \ - state._blasphemous_open_holes(player) and \ - (state._blasphemous_blood_relic(player) and \ - state._blasphemous_root_relic(player) or \ - state._blasphemous_ex_bridge_access(player))) - set_rule(world.get_location("Defeat 3 Amanecidas", player), - lambda state: state._blasphemous_bell(player) and \ - state._blasphemous_open_holes(player) and \ - state._blasphemous_ex_bridge_access(player) and \ - (state._blasphemous_blood_relic(player) and \ - state._blasphemous_root_relic(player) or \ - (state._blasphemous_1_mask(player) and \ - state._blasphemous_bronze_key(player) and \ - state._blasphemous_silver_key(player)))) - set_rule(world.get_location("Defeat 4 Amanecidas", player), - lambda state: state._blasphemous_bell(player) and \ - state._blasphemous_open_holes(player) and \ - state._blasphemous_ex_bridge_access(player) and \ - state._blasphemous_1_mask(player) and \ - state._blasphemous_blood_relic(player) and \ - state._blasphemous_root_relic(player) and \ - state._blasphemous_bronze_key(player) and \ - state._blasphemous_silver_key(player)) - set_rule(world.get_location("Defeat all Amanecidas", player), - lambda state: state._blasphemous_bell(player) and \ - state._blasphemous_open_holes(player) and \ - state._blasphemous_ex_bridge_access(player) and \ - state._blasphemous_1_mask(player) and \ - state._blasphemous_blood_relic(player) and \ - state._blasphemous_root_relic(player) and \ - state._blasphemous_bronze_key(player) and \ - state._blasphemous_silver_key(player)) - - # skill rando - if world.skill_randomizer[player] and not world.expert_logic[player]: - set_rule(world.get_location("Skill 1, Tier 3", player), - lambda state: state._blasphemous_bridge_access(player)) - set_rule(world.get_location("Skill 5, Tier 3", player), - lambda state: state._blasphemous_bridge_access(player)) - set_rule(world.get_location("Skill 3, Tier 2", player), - lambda state: state._blasphemous_bridge_access(player)) - set_rule(world.get_location("Skill 2, Tier 3", player), - lambda state: state._blasphemous_blood_relic(player) and \ - state._blasphemous_miasma_relic(player) and \ - state._blasphemous_2_masks(player) and \ - state._blasphemous_bridge_access(player)) - set_rule(world.get_location("Skill 4, Tier 3", player), - lambda state: state._blasphemous_blood_relic(player) and \ - state._blasphemous_miasma_relic(player) and \ - state._blasphemous_2_masks(player) and \ - state._blasphemous_bridge_access(player)) - set_rule(world.get_location("Skill 3, Tier 3", player), - lambda state: state._blasphemous_chalice(player) and \ - state._blasphemous_bridge_access(player) and \ - state._blasphemous_1_mask(player) and \ - state._blasphemous_bronze_key(player) and \ - state._blasphemous_miasma_relic(player) and \ - state._blasphemous_water_relic(player) and \ - state._blasphemous_root_relic(player)) - elif world.skill_randomizer[player] and world.expert_logic[player]: - set_rule(world.get_location("Skill 1, Tier 3", player), - lambda state: state._blasphemous_ex_bridge_access(player)) - set_rule(world.get_location("Skill 5, Tier 3", player), - lambda state: state._blasphemous_ex_bridge_access(player)) - set_rule(world.get_location("Skill 3, Tier 2", player), - lambda state: state._blasphemous_ex_bridge_access(player)) - set_rule(world.get_location("Skill 2, Tier 3", player), - lambda state: state._blasphemous_blood_relic(player) and \ - state._blasphemous_miasma_relic(player) and \ - state._blasphemous_2_masks(player) and \ - state._blasphemous_ex_bridge_access(player)) - set_rule(world.get_location("Skill 4, Tier 3", player), - lambda state: state._blasphemous_blood_relic(player) and \ - state._blasphemous_miasma_relic(player) and \ - state._blasphemous_2_masks(player) and \ - state._blasphemous_ex_bridge_access(player)) - set_rule(world.get_location("Skill 3, Tier 3", player), - lambda state: state._blasphemous_chalice(player) and \ - state._blasphemous_ex_bridge_access(player) and \ - state._blasphemous_1_mask(player) and \ - state._blasphemous_bronze_key(player) and \ - (state._blasphemous_fall_relic(player) and \ - (state._blasphemous_ranged(player) or \ - state._blasphemous_root_relic(player))) or \ - (state._blasphemous_miasma_relic(player) and \ - state._blasphemous_water_relic(player) and \ - (state._blasphemous_root_relic(player) or \ - state._blasphemous_dawn_heart(player) or \ - (state._blasphemous_wheel(player) and \ - state._blasphemous_ranged(player))))) - - # difficulty (easy) - if world.difficulty[player].value == 0: - for i in world.get_region("Desecrated Cistern", player).entrances: - add_rule(i, lambda state: state._blasphemous_wound_boss_easy(player)) - for i in world.get_region("Ferrous Tree", player).entrances: - add_rule(i, lambda state: state._blasphemous_esdras_boss_easy(player)) - for i in world.get_region("Patio of the Silent Steps", player).entrances: - add_rule(i, lambda state: state._blasphemous_esdras_boss_easy(player)) - for i in world.get_region("The Sleeping Canvases", player).entrances: - add_rule(i, lambda state: state._blasphemous_esdras_boss_easy(player)) - for i in world.get_region("Deambulatory of His Holiness", player).entrances: - add_rule(i, lambda state: state._blasphemous_endgame_boss_easy(player)) - add_rule(world.get_location("Albero: Donate 5000 Tears", player), - lambda state: state._blasphemous_wound_boss_easy(player)) - add_rule(world.get_location("Albero: Donate 50000 Tears", player), - lambda state: state._blasphemous_wound_boss_easy(player)) - add_rule(world.get_location("Albero: Tirso's final reward", player), - lambda state: state._blasphemous_mask_boss_easy(player)) - add_rule(world.get_location("Ossuary: Isidora, Voice of the Dead", player), - lambda state: state._blasphemous_endgame_boss_easy(player)) - add_rule(world.get_location("AR: Crisanta of the Wrapped Agony", player), - lambda state: state._blasphemous_endgame_boss_easy(player)) - add_rule(world.get_location("BotTC: Esdras, of the Anointed Legion", player), - lambda state: state._blasphemous_esdras_boss_easy(player)) - add_rule(world.get_location("BotTC: Esdras' gift", player), - lambda state: state._blasphemous_esdras_boss_easy(player)) - add_rule(world.get_location("BotTC: Inside giant statue", player), - lambda state: state._blasphemous_endgame_boss_easy(player)) - add_rule(world.get_location("BotSS: Crisanta's gift", player), - lambda state: state._blasphemous_endgame_boss_easy(player)) - add_rule(world.get_location("CoOLotCV: Lady of the Six Sorrows", player), - lambda state: state._blasphemous_mask_boss_easy(player)) - add_rule(world.get_location("CoOLotCV: Mask room", player), - lambda state: state._blasphemous_mask_boss_easy(player)) - add_rule(world.get_location("GotP: Amanecida of the Bejeweled Arrow", player), - lambda state: state._blasphemous_endgame_boss_easy(player)) - add_rule(world.get_location("HotD: Laudes, the First of the Amanecidas", player), - lambda state: state._blasphemous_endgame_boss_easy(player)) - add_rule(world.get_location("LotNW: Elevator Child of Moonlight", player), - lambda state: state._blasphemous_mask_boss_easy(player)) - add_rule(world.get_location("LotNW: Mask room", player), - lambda state: state._blasphemous_mask_boss_easy(player)) - add_rule(world.get_location("LotNW: Mea Culpa altar", player), - lambda state: state._blasphemous_mask_boss_easy(player)) - add_rule(world.get_location("LotNW: Red candle", player), - lambda state: state._blasphemous_mask_boss_easy(player)) - add_rule(world.get_location("MD: Blue candle", player), - lambda state: state._blasphemous_wound_boss_easy(player)) - add_rule(world.get_location("MD: Cave Child of Moonlight", player), - lambda state: state._blasphemous_wound_boss_easy(player)) - add_rule(world.get_location("MD: Behind gate to TSC", player), - lambda state: state._blasphemous_wound_boss_easy(player)) - add_rule(world.get_location("MoM: Melquiades, The Exhumed Archbishop", player), - lambda state: state._blasphemous_mask_boss_easy(player)) - add_rule(world.get_location("MoM: Mask room", player), - lambda state: state._blasphemous_mask_boss_easy(player)) - add_rule(world.get_location("MotED: Amanecida of the Golden Blades", player), - lambda state: state._blasphemous_endgame_boss_easy(player)) - add_rule(world.get_location("MaH: Sierpes' eye", player), - lambda state: state._blasphemous_endgame_boss_easy(player)) - add_rule(world.get_location("MaH: Sierpes", player), - lambda state: state._blasphemous_endgame_boss_easy(player)) - add_rule(world.get_location("PotSS: Amanecida of the Chiselled Steel", player), - lambda state: state._blasphemous_endgame_boss_easy(player)) - add_rule(world.get_location("TSC: Under elevator shaft", player), - lambda state: state._blasphemous_mask_boss_easy(player)) - add_rule(world.get_location("TSC: Exposito, Scion of Abjuration", player), - lambda state: state._blasphemous_mask_boss_easy(player)) - add_rule(world.get_location("WotHP: Quirce, Returned By The Flames", player), - lambda state: state._blasphemous_mask_boss_easy(player)) - add_rule(world.get_location("WotHP: Collapsing floor ledge", player), - lambda state: state._blasphemous_mask_boss_easy(player)) - add_rule(world.get_location("WotHP: Amanecida of the Molten Thorn", player), - lambda state: state._blasphemous_endgame_boss_easy(player)) - add_rule(world.get_location("Confessor Dungeon 4 extra", player), - lambda state: state._blasphemous_wound_boss_easy(player)) - add_rule(world.get_location("Confessor Dungeon 4 main", player), - lambda state: state._blasphemous_wound_boss_easy(player)) - add_rule(world.get_location("Confessor Dungeon 5 extra", player), - lambda state: state._blasphemous_wound_boss_easy(player)) - add_rule(world.get_location("Confessor Dungeon 5 main", player), - lambda state: state._blasphemous_wound_boss_easy(player)) - add_rule(world.get_location("Confessor Dungeon 6 extra", player), - lambda state: state._blasphemous_wound_boss_easy(player)) - add_rule(world.get_location("Confessor Dungeon 6 main", player), - lambda state: state._blasphemous_wound_boss_easy(player)) - add_rule(world.get_location("Confessor Dungeon 7 extra", player), - lambda state: state._blasphemous_wound_boss_easy(player)) - add_rule(world.get_location("Confessor Dungeon 7 main", player), - lambda state: state._blasphemous_wound_boss_easy(player)) - add_rule(world.get_location("Defeat 1 Amanecida", player), - lambda state: state._blasphemous_endgame_boss_easy(player)) - add_rule(world.get_location("Defeat 2 Amanecidas", player), - lambda state: state._blasphemous_endgame_boss_easy(player)) - add_rule(world.get_location("Defeat 3 Amanecidas", player), - lambda state: state._blasphemous_endgame_boss_easy(player)) - add_rule(world.get_location("Defeat 4 Amanecidas", player), - lambda state: state._blasphemous_endgame_boss_easy(player)) - add_rule(world.get_location("Defeat all Amanecidas", player), - lambda state: state._blasphemous_endgame_boss_easy(player)) - - # difficulty (normal) - elif world.difficulty[player].value == 1: - for i in world.get_region("Desecrated Cistern", player).entrances: - add_rule(i, lambda state: state._blasphemous_wound_boss_normal(player)) - for i in world.get_region("Ferrous Tree", player).entrances: - add_rule(i, lambda state: state._blasphemous_esdras_boss_normal(player)) - for i in world.get_region("Patio of the Silent Steps", player).entrances: - add_rule(i, lambda state: state._blasphemous_esdras_boss_normal(player)) - for i in world.get_region("The Sleeping Canvases", player).entrances: - add_rule(i, lambda state: state._blasphemous_esdras_boss_normal(player)) - for i in world.get_region("Deambulatory of His Holiness", player).entrances: - add_rule(i, lambda state: state._blasphemous_endgame_boss_normal(player)) - add_rule(world.get_location("Albero: Donate 5000 Tears", player), - lambda state: state._blasphemous_wound_boss_normal(player)) - add_rule(world.get_location("Albero: Donate 50000 Tears", player), - lambda state: state._blasphemous_wound_boss_normal(player)) - add_rule(world.get_location("Albero: Tirso's final reward", player), - lambda state: state._blasphemous_mask_boss_normal(player)) - add_rule(world.get_location("Ossuary: Isidora, Voice of the Dead", player), - lambda state: state._blasphemous_endgame_boss_normal(player)) - add_rule(world.get_location("AR: Crisanta of the Wrapped Agony", player), - lambda state: state._blasphemous_endgame_boss_normal(player)) - add_rule(world.get_location("BotTC: Esdras, of the Anointed Legion", player), - lambda state: state._blasphemous_esdras_boss_normal(player)) - add_rule(world.get_location("BotTC: Esdras' gift", player), - lambda state: state._blasphemous_esdras_boss_normal(player)) - add_rule(world.get_location("BotTC: Inside giant statue", player), - lambda state: state._blasphemous_endgame_boss_normal(player)) - add_rule(world.get_location("BotSS: Crisanta's gift", player), - lambda state: state._blasphemous_endgame_boss_normal(player)) - add_rule(world.get_location("CoOLotCV: Lady of the Six Sorrows", player), - lambda state: state._blasphemous_mask_boss_normal(player)) - add_rule(world.get_location("CoOLotCV: Mask room", player), - lambda state: state._blasphemous_mask_boss_normal(player)) - add_rule(world.get_location("GotP: Amanecida of the Bejeweled Arrow", player), - lambda state: state._blasphemous_endgame_boss_normal(player)) - add_rule(world.get_location("HotD: Laudes, the First of the Amanecidas", player), - lambda state: state._blasphemous_endgame_boss_normal(player)) - add_rule(world.get_location("LotNW: Elevator Child of Moonlight", player), - lambda state: state._blasphemous_mask_boss_normal(player)) - add_rule(world.get_location("LotNW: Mask room", player), - lambda state: state._blasphemous_mask_boss_normal(player)) - add_rule(world.get_location("LotNW: Mea Culpa altar", player), - lambda state: state._blasphemous_mask_boss_normal(player)) - add_rule(world.get_location("LotNW: Red candle", player), - lambda state: state._blasphemous_mask_boss_normal(player)) - add_rule(world.get_location("MD: Blue candle", player), - lambda state: state._blasphemous_wound_boss_normal(player)) - add_rule(world.get_location("MD: Cave Child of Moonlight", player), - lambda state: state._blasphemous_wound_boss_normal(player)) - add_rule(world.get_location("MD: Behind gate to TSC", player), - lambda state: state._blasphemous_wound_boss_normal(player)) - add_rule(world.get_location("MoM: Melquiades, The Exhumed Archbishop", player), - lambda state: state._blasphemous_mask_boss_normal(player)) - add_rule(world.get_location("MoM: Mask room", player), - lambda state: state._blasphemous_mask_boss_normal(player)) - add_rule(world.get_location("MotED: Amanecida of the Golden Blades", player), - lambda state: state._blasphemous_endgame_boss_normal(player)) - add_rule(world.get_location("MaH: Sierpes' eye", player), - lambda state: state._blasphemous_endgame_boss_normal(player)) - add_rule(world.get_location("MaH: Sierpes", player), - lambda state: state._blasphemous_endgame_boss_normal(player)) - add_rule(world.get_location("PotSS: Amanecida of the Chiselled Steel", player), - lambda state: state._blasphemous_endgame_boss_normal(player)) - add_rule(world.get_location("TSC: Under elevator shaft", player), - lambda state: state._blasphemous_mask_boss_normal(player)) - add_rule(world.get_location("TSC: Exposito, Scion of Abjuration", player), - lambda state: state._blasphemous_mask_boss_normal(player)) - add_rule(world.get_location("WotHP: Quirce, Returned By The Flames", player), - lambda state: state._blasphemous_mask_boss_normal(player)) - add_rule(world.get_location("WotHP: Collapsing floor ledge", player), - lambda state: state._blasphemous_mask_boss_normal(player)) - add_rule(world.get_location("WotHP: Amanecida of the Molten Thorn", player), - lambda state: state._blasphemous_endgame_boss_normal(player)) - add_rule(world.get_location("Confessor Dungeon 4 extra", player), - lambda state: state._blasphemous_wound_boss_normal(player)) - add_rule(world.get_location("Confessor Dungeon 4 main", player), - lambda state: state._blasphemous_wound_boss_normal(player)) - add_rule(world.get_location("Confessor Dungeon 5 extra", player), - lambda state: state._blasphemous_wound_boss_normal(player)) - add_rule(world.get_location("Confessor Dungeon 5 main", player), - lambda state: state._blasphemous_wound_boss_normal(player)) - add_rule(world.get_location("Confessor Dungeon 6 extra", player), - lambda state: state._blasphemous_wound_boss_normal(player)) - add_rule(world.get_location("Confessor Dungeon 6 main", player), - lambda state: state._blasphemous_wound_boss_normal(player)) - add_rule(world.get_location("Confessor Dungeon 7 extra", player), - lambda state: state._blasphemous_wound_boss_normal(player)) - add_rule(world.get_location("Confessor Dungeon 7 main", player), - lambda state: state._blasphemous_wound_boss_normal(player)) - add_rule(world.get_location("Defeat 1 Amanecida", player), - lambda state: state._blasphemous_endgame_boss_normal(player)) - add_rule(world.get_location("Defeat 2 Amanecidas", player), - lambda state: state._blasphemous_endgame_boss_normal(player)) - add_rule(world.get_location("Defeat 3 Amanecidas", player), - lambda state: state._blasphemous_endgame_boss_normal(player)) - add_rule(world.get_location("Defeat 4 Amanecidas", player), - lambda state: state._blasphemous_endgame_boss_normal(player)) - add_rule(world.get_location("Defeat all Amanecidas", player), - lambda state: state._blasphemous_endgame_boss_normal(player)) - - # difficulty (hard) - elif world.difficulty[player].value == 2: - for i in world.get_region("Desecrated Cistern", player).entrances: - add_rule(i, lambda state: state._blasphemous_wound_boss_hard(player)) - for i in world.get_region("Ferrous Tree", player).entrances: - add_rule(i, lambda state: state._blasphemous_esdras_boss_hard(player)) - for i in world.get_region("Patio of the Silent Steps", player).entrances: - add_rule(i, lambda state: state._blasphemous_esdras_boss_hard(player)) - for i in world.get_region("The Sleeping Canvases", player).entrances: - add_rule(i, lambda state: state._blasphemous_esdras_boss_hard(player)) - for i in world.get_region("Deambulatory of His Holiness", player).entrances: - add_rule(i, lambda state: state._blasphemous_endgame_boss_hard(player)) - add_rule(world.get_location("Albero: Donate 5000 Tears", player), - lambda state: state._blasphemous_wound_boss_hard(player)) - add_rule(world.get_location("Albero: Donate 50000 Tears", player), - lambda state: state._blasphemous_wound_boss_hard(player)) - add_rule(world.get_location("Albero: Tirso's final reward", player), - lambda state: state._blasphemous_mask_boss_hard(player)) - add_rule(world.get_location("Ossuary: Isidora, Voice of the Dead", player), - lambda state: state._blasphemous_endgame_boss_hard(player)) - add_rule(world.get_location("AR: Crisanta of the Wrapped Agony", player), - lambda state: state._blasphemous_endgame_boss_hard(player)) - add_rule(world.get_location("BotTC: Esdras, of the Anointed Legion", player), - lambda state: state._blasphemous_esdras_boss_hard(player)) - add_rule(world.get_location("BotTC: Esdras' gift", player), - lambda state: state._blasphemous_esdras_boss_hard(player)) - add_rule(world.get_location("BotTC: Inside giant statue", player), - lambda state: state._blasphemous_endgame_boss_hard(player)) - add_rule(world.get_location("BotSS: Crisanta's gift", player), - lambda state: state._blasphemous_endgame_boss_hard(player)) - add_rule(world.get_location("CoOLotCV: Lady of the Six Sorrows", player), - lambda state: state._blasphemous_mask_boss_hard(player)) - add_rule(world.get_location("CoOLotCV: Mask room", player), - lambda state: state._blasphemous_mask_boss_hard(player)) - add_rule(world.get_location("GotP: Amanecida of the Bejeweled Arrow", player), - lambda state: state._blasphemous_endgame_boss_hard(player)) - add_rule(world.get_location("HotD: Laudes, the First of the Amanecidas", player), - lambda state: state._blasphemous_endgame_boss_hard(player)) - add_rule(world.get_location("LotNW: Elevator Child of Moonlight", player), - lambda state: state._blasphemous_mask_boss_hard(player)) - add_rule(world.get_location("LotNW: Mask room", player), - lambda state: state._blasphemous_mask_boss_hard(player)) - add_rule(world.get_location("LotNW: Mea Culpa altar", player), - lambda state: state._blasphemous_mask_boss_hard(player)) - add_rule(world.get_location("LotNW: Red candle", player), - lambda state: state._blasphemous_mask_boss_hard(player)) - add_rule(world.get_location("MD: Blue candle", player), - lambda state: state._blasphemous_wound_boss_hard(player)) - add_rule(world.get_location("MD: Cave Child of Moonlight", player), - lambda state: state._blasphemous_wound_boss_hard(player)) - add_rule(world.get_location("MD: Behind gate to TSC", player), - lambda state: state._blasphemous_wound_boss_hard(player)) - add_rule(world.get_location("MoM: Melquiades, The Exhumed Archbishop", player), - lambda state: state._blasphemous_mask_boss_hard(player)) - add_rule(world.get_location("MoM: Mask room", player), - lambda state: state._blasphemous_mask_boss_hard(player)) - add_rule(world.get_location("MotED: Amanecida of the Golden Blades", player), - lambda state: state._blasphemous_endgame_boss_hard(player)) - add_rule(world.get_location("MaH: Sierpes' eye", player), - lambda state: state._blasphemous_endgame_boss_hard(player)) - add_rule(world.get_location("MaH: Sierpes", player), - lambda state: state._blasphemous_endgame_boss_hard(player)) - add_rule(world.get_location("PotSS: Amanecida of the Chiselled Steel", player), - lambda state: state._blasphemous_endgame_boss_hard(player)) - add_rule(world.get_location("TSC: Under elevator shaft", player), - lambda state: state._blasphemous_mask_boss_hard(player)) - add_rule(world.get_location("TSC: Exposito, Scion of Abjuration", player), - lambda state: state._blasphemous_mask_boss_hard(player)) - add_rule(world.get_location("WotHP: Quirce, Returned By The Flames", player), - lambda state: state._blasphemous_mask_boss_hard(player)) - add_rule(world.get_location("WotHP: Collapsing floor ledge", player), - lambda state: state._blasphemous_mask_boss_hard(player)) - add_rule(world.get_location("WotHP: Amanecida of the Molten Thorn", player), - lambda state: state._blasphemous_endgame_boss_hard(player)) - add_rule(world.get_location("Confessor Dungeon 4 extra", player), - lambda state: state._blasphemous_wound_boss_hard(player)) - add_rule(world.get_location("Confessor Dungeon 4 main", player), - lambda state: state._blasphemous_wound_boss_hard(player)) - add_rule(world.get_location("Confessor Dungeon 5 extra", player), - lambda state: state._blasphemous_wound_boss_hard(player)) - add_rule(world.get_location("Confessor Dungeon 5 main", player), - lambda state: state._blasphemous_wound_boss_hard(player)) - add_rule(world.get_location("Confessor Dungeon 6 extra", player), - lambda state: state._blasphemous_wound_boss_hard(player)) - add_rule(world.get_location("Confessor Dungeon 6 main", player), - lambda state: state._blasphemous_wound_boss_hard(player)) - add_rule(world.get_location("Confessor Dungeon 7 extra", player), - lambda state: state._blasphemous_wound_boss_hard(player)) - add_rule(world.get_location("Confessor Dungeon 7 main", player), - lambda state: state._blasphemous_wound_boss_hard(player)) - add_rule(world.get_location("Defeat 1 Amanecida", player), - lambda state: state._blasphemous_endgame_boss_hard(player)) - add_rule(world.get_location("Defeat 2 Amanecidas", player), - lambda state: state._blasphemous_endgame_boss_hard(player)) - add_rule(world.get_location("Defeat 3 Amanecidas", player), - lambda state: state._blasphemous_endgame_boss_hard(player)) - add_rule(world.get_location("Defeat 4 Amanecidas", player), - lambda state: state._blasphemous_endgame_boss_hard(player)) - add_rule(world.get_location("Defeat all Amanecidas", player), - lambda state: state._blasphemous_endgame_boss_hard(player)) + lambda state: amanecida_rooms(state, logic, player, 4)) + set_rule(world.get_location("Confessor Dungeon 1 main", player), + lambda state: ( + state.has("Weight of True Guilt", player) + and guilt_rooms(state, player, 1) + )) + set_rule(world.get_location("Confessor Dungeon 2 main", player), + lambda state: ( + state.has("Weight of True Guilt", player) + and guilt_rooms(state, player, 2) + )) + set_rule(world.get_location("Confessor Dungeon 3 main", player), + lambda state: ( + state.has("Weight of True Guilt", player) + and guilt_rooms(state, player, 3) + )) + set_rule(world.get_location("Confessor Dungeon 4 main", player), + lambda state: ( + state.has("Weight of True Guilt", player) + and guilt_rooms(state, player, 4) + )) + set_rule(world.get_location("Confessor Dungeon 5 main", player), + lambda state: ( + state.has("Weight of True Guilt", player) + and guilt_rooms(state, player, 5) + )) + set_rule(world.get_location("Confessor Dungeon 6 main", player), + lambda state: ( + state.has("Weight of True Guilt", player) + and guilt_rooms(state, player, 6) + )) + set_rule(world.get_location("Confessor Dungeon 7 main", player), + lambda state: ( + state.has("Weight of True Guilt", player) + and guilt_rooms(state, player, 7) + )) + set_rule(world.get_location("Confessor Dungeon 1 extra", player), + lambda state: ( + state.has("Weight of True Guilt", player) + and guilt_rooms(state, player, 1) + )) + set_rule(world.get_location("Confessor Dungeon 2 extra", player), + lambda state: ( + state.has("Weight of True Guilt", player) + and guilt_rooms(state, player, 2) + )) + set_rule(world.get_location("Confessor Dungeon 3 extra", player), + lambda state: ( + state.has("Weight of True Guilt", player) + and guilt_rooms(state, player, 3) + )) + set_rule(world.get_location("Confessor Dungeon 4 extra", player), + lambda state: ( + state.has("Weight of True Guilt", player) + and guilt_rooms(state, player, 4) + )) + set_rule(world.get_location("Confessor Dungeon 5 extra", player), + lambda state: ( + state.has("Weight of True Guilt", player) + and guilt_rooms(state, player, 5) + )) + set_rule(world.get_location("Confessor Dungeon 6 extra", player), + lambda state: ( + state.has("Weight of True Guilt", player) + and guilt_rooms(state, player, 6) + )) + set_rule(world.get_location("Confessor Dungeon 7 extra", player), + lambda state: ( + state.has("Weight of True Guilt", player) + and guilt_rooms(state, player, 7) + )) + set_rule(world.get_location("Skill 1, Tier 1", player), + lambda state: sword_rooms(state, player, 1)) + set_rule(world.get_location("Skill 1, Tier 2", player), + lambda state: sword_rooms(state, player, 2)) + set_rule(world.get_location("Skill 1, Tier 3", player), + lambda state: sword_rooms(state, player, 4)) + set_rule(world.get_location("Skill 2, Tier 1", player), + lambda state: sword_rooms(state, player, 1)) + set_rule(world.get_location("Skill 2, Tier 2", player), + lambda state: sword_rooms(state, player, 3)) + set_rule(world.get_location("Skill 2, Tier 3", player), + lambda state: sword_rooms(state, player, 6)) + set_rule(world.get_location("Skill 3, Tier 1", player), + lambda state: sword_rooms(state, player, 2)) + set_rule(world.get_location("Skill 3, Tier 2", player), + lambda state: sword_rooms(state, player, 5)) + set_rule(world.get_location("Skill 3, Tier 3", player), + lambda state: sword_rooms(state, player, 7)) + set_rule(world.get_location("Skill 4, Tier 1", player), + lambda state: sword_rooms(state, player, 1)) + set_rule(world.get_location("Skill 4, Tier 2", player), + lambda state: sword_rooms(state, player, 3)) + set_rule(world.get_location("Skill 4, Tier 3", player), + lambda state: sword_rooms(state, player, 6)) + set_rule(world.get_location("Skill 5, Tier 1", player), + lambda state: sword_rooms(state, player, 1)) + set_rule(world.get_location("Skill 5, Tier 2", player), + lambda state: sword_rooms(state, player, 2)) + set_rule(world.get_location("Skill 5, Tier 3", player), + lambda state: sword_rooms(state, player, 4)) \ No newline at end of file diff --git a/worlds/blasphemous/Vanilla.py b/worlds/blasphemous/Vanilla.py index 82ec7c5f..034a2a29 100644 --- a/worlds/blasphemous/Vanilla.py +++ b/worlds/blasphemous/Vanilla.py @@ -7,205 +7,14 @@ unrandomized_dict: Dict[str, str] = { "DC: Chalice room": "Chalice of Inverted Verses" } -cherub_set: Set[str] = [ - "Albero: Child of Moonlight", - "AR: Upper west shaft Child of Moonlight", - "BotSS: Starting room Child of Moonlight", - "DC: Child of Moonlight, above water", - "DC: Upper east Child of Moonlight", - "DC: Child of Moonlight, miasma room", - "DC: Child of Moonlight, behind pillar", - "DC: Top of elevator Child of Moonlight", - "DC: Elevator shaft Child of Moonlight", - "GotP: Shop cave Child of Moonlight", - "GotP: Elevator shaft Child of Moonlight", - "GotP: West shaft Child of Moonlight", - "GotP: Center shaft Child of Moonlight", - "GA: Miasma room Child of Moonlight", - "GA: Blood bridge Child of Moonlight", - "GA: Lower east Child of Moonlight", - "Jondo: Upper east Child of Moonlight", - "Jondo: Spike tunnel Child of Moonlight", - "Jondo: Upper west Child of Moonlight", - "LotNW: Platform room Child of Moonlight", - "LotNW: Lowest west Child of Moonlight", - "LotNW: Elevator Child of Moonlight", - "MD: Second area Child of Moonlight", - "MD: Cave Child of Moonlight", - "MoM: Lower west Child of Moonlight", - "MoM: Upper center Child of Moonlight", - "MotED: Child of Moonlight, above chasm", - "PotSS: First area Child of Moonlight", - "PotSS: Third area Child of Moonlight", - "THL: Child of Moonlight", - "WotHP: Upper east room, top bronze cell", - "WotHP: Upper west room, top silver cell", - "WotHP: Lower east room, bottom silver cell", - "WotHP: Outside Child of Moonlight", - "WotBC: Outside Child of Moonlight", - "WotBC: Cliffside Child of Moonlight", - "WOTW: Underground Child of Moonlight", - "WOTW: Upper east Child of Moonlight", + +junk_locations: Set[str] = [ + "Albero: Donate 50000 Tears", + "Ossuary: 11th reward", + "AtTotS: Miriam's gift", + "TSC: Jocinero's final reward" ] -life_set: Set[str] = [ - "AR: Lady of the Six Sorrows", - "CoOLotCV: Lady of the Six Sorrows", - "DC: Lady of the Six Sorrows, from MD", - "DC: Lady of the Six Sorrows, elevator shaft", - "GotP: Lady of the Six Sorrows", - "LotNW: Lady of the Six Sorrows" -] - -fervour_set: Set[str] = [ - "DC: Oil of the Pilgrims", - "GotP: Oil of the Pilgrims", - "GA: Oil of the Pilgrims", - "LotNW: Oil of the Pilgrims", - "MoM: Oil of the Pilgrims", - "WotHP: Oil of the Pilgrims" -] - -sword_set: Set[str] = [ - "Albero: Mea Culpa altar", - "AR: Mea Culpa altar", - "BotSS: Mea Culpa altar", - "CoOLotCV: Mea Culpa altar", - "DC: Mea Culpa altar", - "LotNW: Mea Culpa altar", - "MoM: Mea Culpa altar" -] - -blessing_dict: Dict[str, str] = { - "Albero: Bless Severed Hand": "Incorrupt Hand of the Fraternal Master", - "Albero: Bless Linen Cloth": "Shroud of Dreamt Sins", - "Albero: Bless Hatched Egg": "Three Gnarled Tongues" -} - -dungeon_dict: Dict[str, str] = { - "Confessor Dungeon 1 extra": "Tears of Atonement (1000)", - "Confessor Dungeon 2 extra": "Heart of the Single Tone", - "Confessor Dungeon 3 extra": "Tears of Atonement (3000)", - "Confessor Dungeon 4 extra": "Embers of a Broken Star", - "Confessor Dungeon 5 extra": "Tears of Atonement (5000)", - "Confessor Dungeon 6 extra": "Scaly Coin", - "Confessor Dungeon 7 extra": "Seashell of the Inverted Spiral" -} - -tirso_dict: Dict[str, str] = { - "Albero: Tirso's 1st reward": "Linen Cloth", - "Albero: Tirso's 2nd reward": "Tears of Atonement (500)", - "Albero: Tirso's 3rd reward": "Tears of Atonement (1000)", - "Albero: Tirso's 4th reward": "Tears of Atonement (2000)", - "Albero: Tirso's 5th reward": "Tears of Atonement (5000)", - "Albero: Tirso's 6th reward": "Tears of Atonement (10000)", - "Albero: Tirso's final reward": "Knot of Rosary Rope" -} - -redento_dict: Dict[str, str] = { - "MoM: Redento's treasure": "Nail Uprooted from Dirt", - "MoM: Final meeting with Redento": "Knot of Rosary Rope", - "MotED: 1st meeting with Redento": "Fourth Toe made of Limestone", - "PotSS: 4th meeting with Redento": "Big Toe made of Limestone", - "WotBC: 3rd meeting with Redento": "Little Toe made of Limestone" -} - -jocinero_dict: Dict[str, str] = { - "TSC: Jocinero's 1st reward": "Linen of Golden Thread", - "TSC: Jocinero's final reward": "Campanillero to the Sons of the Aurora" -} - -altasgracias_dict: Dict[str, str] = { - "GA: Altasgracias' gift": "Egg of Deformity", - "GA: Empty giant egg": "Knot of Hair" -} - -tentudia_dict: Dict[str, str] = { - "Albero: Lvdovico's 1st reward": "Tears of Atonement (500)", - "Albero: Lvdovico's 2nd reward": "Tears of Atonement (1000)", - "Albero: Lvdovico's 3rd reward": "Debla of the Lights" -} - -gemino_dict: Dict[str, str] = { - "WOTW: Gift for the tomb": "Dried Flowers bathed in Tears", - "WOTW: Underground tomb": "Saeta Dolorosa", - "WOTW: Gemino's gift": "Empty Golden Thimble", - "WOTW: Gemino's reward": "Frozen Olive" -} - -ossuary_dict: Dict[str, str] = { - "Ossuary: 1st reward": "Tears of Atonement (250)", - "Ossuary: 2nd reward": "Tears of Atonement (500)", - "Ossuary: 3rd reward": "Tears of Atonement (750)", - "Ossuary: 4th reward": "Tears of Atonement (1000)", - "Ossuary: 5th reward": "Tears of Atonement (1250)", - "Ossuary: 6th reward": "Tears of Atonement (1500)", - "Ossuary: 7th reward": "Tears of Atonement (1750)", - "Ossuary: 8th reward": "Tears of Atonement (2000)", - "Ossuary: 9th reward": "Tears of Atonement (2500)", - "Ossuary: 10th reward": "Tears of Atonement (3000)", - "Ossuary: 11th reward": "Tears of Atonement (5000)", -} - -boss_dict: Dict[str, str] = { - "BotTC: Esdras, of the Anointed Legion": "Tears of Atonement (4300)", - "BotSS: Warden of the Silent Sorrow": "Tears of Atonement (300)", - "CoOLotCV: Our Lady of the Charred Visage": "Tears of Atonement (2600)", - "HotD: Laudes, the First of the Amanecidas": "Tears of Atonement (30000)", - "GotP: Amanecida of the Bejeweled Arrow": "Tears of Atonement (18000)", - "GA: Tres Angustias": "Tears of Atonement (2100)", - "MD: Ten Piedad": "Tears of Atonement (625)", - "MoM: Melquiades, The Exhumed Archbishop": "Tears of Atonement (5500)", - "MotED: Amanecida of the Golden Blades": "Tears of Atonement (18000)", - "MaH: Sierpes": "Tears of Atonement (5000)", - "PotSS: Amanecida of the Chiselled Steel": "Tears of Atonement (18000)", - "TSC: Exposito, Scion of Abjuration": "Tears of Atonement (9000)", - "WotHP: Quirce, Returned By The Flames": "Tears of Atonement (11250)", - "WotHP: Amanecida of the Molten Thorn": "Tears of Atonement (18000)" -} - -wound_dict: Dict[str, str] = { - "CoOLotCV: Visage of Compunction": "Holy Wound of Compunction", - "GA: Visage of Contrition": "Holy Wound of Contrition", - "MD: Visage of Attrition": "Holy Wound of Attrition" -} - -mask_dict: Dict[str, str] = { - "CoOLotCV: Mask room": "Mirrored Mask of Dolphos", - "LotNW: Mask room": "Embossed Mask of Crescente", - "MoM: Mask room": "Deformed Mask of Orestes" -} - -eye_dict: Dict[str, str] = { - "Ossuary: Isidora, Voice of the Dead": "Severed Right Eye of the Traitor", - "MaH: Sierpes' eye": "Broken Left Eye of the Traitor" -} - -herb_dict: Dict[str, str] = { - "Albero: Gate of Travel room": "Bouquet of Thyme", - "Jondo: Lower east bell trap": "Bouquet of Rosemary", - "MotED: Blood platform alcove": "Dried Clove", - "PotSS: Third area lower ledge": "Olive Seeds", - "TSC: Painting ladder ledge": "Sooty Garlic", - "WOTW: Entrance to tomb": "Incense Garlic" -} - -church_dict: Dict[str, str] = { - "Albero: Donate 5000 Tears": "Token of Appreciation", - "Albero: Donate 50000 Tears": "Cloistered Ruby" -} - -shop_dict: Dict[str, str] = { - "GotP: Shop item 1": "Torn Bridal Ribbon", - "GotP: Shop item 2": "Calcified Eye of Erudition", - "GotP: Shop item 3": "Ember of the Holy Cremation", - "MD: Shop item 1": "Key to the Chamber of the Eldest Brother", - "MD: Shop item 2": "Hollow Pearl", - "MD: Shop item 3": "Moss Preserved in Glass", - "TSC: Shop item 1": "Wicker Knot", - "TSC: Shop item 2": "Empty Bile Vessel", - "TSC: Shop item 3": "Key of the Inquisitor" -} thorn_set: Set[str] = { "THL: Deogracias' gift", @@ -218,14 +27,6 @@ thorn_set: Set[str] = { "Confessor Dungeon 7 main", } -candle_dict: Dict[str, str] = { - "CoOLotCV: Red candle": "Bead of Red Wax", - "LotNW: Red candle": "Bead of Red Wax", - "MD: Red candle": "Bead of Red Wax", - "BotSS: Blue candle": "Bead of Blue Wax", - "CoOLotCV: Blue candle": "Bead of Blue Wax", - "MD: Blue candle": "Bead of Blue Wax" -} skill_dict: Dict[str, str] = { "Skill 1, Tier 1": "Combo Skill", diff --git a/worlds/blasphemous/__init__.py b/worlds/blasphemous/__init__.py index ac6d9b70..d53965d9 100644 --- a/worlds/blasphemous/__init__.py +++ b/worlds/blasphemous/__init__.py @@ -1,14 +1,14 @@ -from typing import Dict, Set, List, Any +from typing import Dict, List, Set, Any from collections import Counter from BaseClasses import Region, Entrance, Location, Item, Tutorial, ItemClassification -from ..AutoWorld import World, WebWorld -from .Items import base_id, item_table, group_table, tears_set, reliquary_set, skill_set -from .Locations import location_table, shop_set -from .Exits import region_exit_table, exit_lookup_table +from worlds.AutoWorld import World, WebWorld +from .Items import base_id, item_table, group_table, tears_set, reliquary_set, event_table +from .Locations import location_table +from .Rooms import room_table, door_table from .Rules import rules -from worlds.generic.Rules import set_rule +from worlds.generic.Rules import set_rule, add_rule from .Options import blasphemous_options -from . import Vanilla +from .Vanilla import unrandomized_dict, junk_locations, thorn_set, skill_dict class BlasphemousWeb(WebWorld): @@ -32,7 +32,7 @@ class BlasphemousWorld(World): game: str = "Blasphemous" web = BlasphemousWeb() - data_version = 1 + data_version = 2 item_name_to_id = {item["name"]: (base_id + index) for index, item in enumerate(item_table)} location_name_to_id = {loc["name"]: (base_id + index) for index, loc in enumerate(location_table)} @@ -41,6 +41,14 @@ class BlasphemousWorld(World): item_name_groups = group_table option_definitions = blasphemous_options + required_client_version = (0, 4, 2) + + + def __init__(self, multiworld, player): + super(BlasphemousWorld, self).__init__(multiworld, player) + self.start_room: str = "D17Z01S01" + self.door_connections: Dict[str, str] = {} + def set_rules(self): rules(self) @@ -61,102 +69,134 @@ class BlasphemousWorld(World): return self.multiworld.random.choice(tears_set) - def create_items(self): - placed_items = [] + def generate_early(self): + world = self.multiworld + player = self.player - placed_items.extend(Vanilla.unrandomized_dict.values()) + if not world.starting_location[player].randomized: + if world.starting_location[player].value == 6 and world.difficulty[player].value < 2: + raise Exception(f"[Blasphemous - '{world.get_player_name(player)}'] {world.starting_location[player]}" + " cannot be chosen if Difficulty is lower than Hard.") - if not self.multiworld.reliquary_shuffle[self.player]: - placed_items.extend(reliquary_set) - elif self.multiworld.reliquary_shuffle[self.player]: - placed_items.append("Tears of Atonement (250)") - placed_items.append("Tears of Atonement (300)") - placed_items.append("Tears of Atonement (500)") + if (world.starting_location[player].value == 0 or world.starting_location[player].value == 6) \ + and world.dash_shuffle[player]: + raise Exception(f"[Blasphemous - '{world.get_player_name(player)}'] {world.starting_location[player]}" + " cannot be chosen if Shuffle Dash is enabled.") + + if world.starting_location[player].value == 3 and world.wall_climb_shuffle[player]: + raise Exception(f"[Blasphemous - '{world.get_player_name(player)}'] {world.starting_location[player]}" + " cannot be chosen if Shuffle Wall Climb is enabled.") + else: + locations: List[int] = [ 0, 1, 2, 3, 4, 5, 6 ] + invalid: bool = False - if not self.multiworld.cherub_shuffle[self.player]: - for i in range(38): - placed_items.append("Child of Moonlight") + if world.difficulty[player].value < 2: + locations.remove(6) - if not self.multiworld.life_shuffle[self.player]: - for i in range(6): - placed_items.append("Life Upgrade") + if world.dash_shuffle[player]: + locations.remove(0) + if 6 in locations: + locations.remove(6) - if not self.multiworld.fervour_shuffle[self.player]: - for i in range(6): - placed_items.append("Fervour Upgrade") + if world.wall_climb_shuffle[player]: + locations.remove(3) - if not self.multiworld.sword_shuffle[self.player]: - for i in range(7): - placed_items.append("Mea Culpa Upgrade") + if world.starting_location[player].value == 6 and world.difficulty[player].value < 2: + invalid = True - if not self.multiworld.blessing_shuffle[self.player]: - placed_items.extend(Vanilla.blessing_dict.values()) + if (world.starting_location[player].value == 0 or world.starting_location[player].value == 6) \ + and world.dash_shuffle[player]: + invalid = True + + if world.starting_location[player].value == 3 and world.wall_climb_shuffle[player]: + invalid = True - if not self.multiworld.dungeon_shuffle[self.player]: - placed_items.extend(Vanilla.dungeon_dict.values()) - - if not self.multiworld.tirso_shuffle[self.player]: - placed_items.extend(Vanilla.tirso_dict.values()) - - if not self.multiworld.miriam_shuffle[self.player]: - placed_items.append("Cantina of the Blue Rose") - - if not self.multiworld.redento_shuffle[self.player]: - placed_items.extend(Vanilla.redento_dict.values()) - - if not self.multiworld.jocinero_shuffle[self.player]: - placed_items.extend(Vanilla.jocinero_dict.values()) + if invalid: + world.starting_location[player].value = world.random.choice(locations) + - if not self.multiworld.altasgracias_shuffle[self.player]: - placed_items.extend(Vanilla.altasgracias_dict.values()) + if not world.dash_shuffle[player]: + world.push_precollected(self.create_item("Dash Ability")) - if not self.multiworld.tentudia_shuffle[self.player]: - placed_items.extend(Vanilla.tentudia_dict.values()) + if not world.wall_climb_shuffle[player]: + world.push_precollected(self.create_item("Wall Climb Ability")) - if not self.multiworld.gemino_shuffle[self.player]: - placed_items.extend(Vanilla.gemino_dict.values()) + if world.skip_long_quests[player]: + for loc in junk_locations: + world.exclude_locations[player].value.add(loc) - if not self.multiworld.guilt_shuffle[self.player]: - placed_items.append("Weight of True Guilt") + start_rooms: Dict[int, str] = { + 0: "D17Z01S01", + 1: "D01Z02S01", + 2: "D02Z03S09", + 3: "D03Z03S11", + 4: "D04Z03S01", + 5: "D06Z01S09", + 6: "D20Z02S09" + } - if not self.multiworld.ossuary_shuffle[self.player]: - placed_items.extend(Vanilla.ossuary_dict.values()) + self.start_room = start_rooms[world.starting_location[player].value] - if not self.multiworld.boss_shuffle[self.player]: - placed_items.extend(Vanilla.boss_dict.values()) - if not self.multiworld.wound_shuffle[self.player]: - placed_items.extend(Vanilla.wound_dict.values()) + def create_items(self): + world = self.multiworld + player = self.player - if not self.multiworld.mask_shuffle[self.player]: - placed_items.extend(Vanilla.mask_dict.values()) + removed: int = 0 + to_remove: List[str] = [ + "Tears of Atonement (250)", + "Tears of Atonement (300)", + "Tears of Atonement (500)", + "Tears of Atonement (500)", + "Tears of Atonement (500)" + ] - if not self.multiworld.eye_shuffle[self.player]: - placed_items.extend(Vanilla.eye_dict.values()) + skipped_items = [] + junk: int = 0 - if not self.multiworld.herb_shuffle[self.player]: - placed_items.extend(Vanilla.herb_dict.values()) + for item, count in world.start_inventory[player].value.items(): + for _ in range(count): + skipped_items.append(item) + junk += 1 - if not self.multiworld.church_shuffle[self.player]: - placed_items.extend(Vanilla.church_dict.values()) + skipped_items.extend(unrandomized_dict.values()) - if not self.multiworld.shop_shuffle[self.player]: - placed_items.extend(Vanilla.shop_dict.values()) - - if self.multiworld.thorn_shuffle[self.player] == 2: + if world.thorn_shuffle[player] == 2: for i in range(8): - placed_items.append("Thorn Upgrade") + skipped_items.append("Thorn Upgrade") - if not self.multiworld.candle_shuffle[self.player]: - placed_items.extend(Vanilla.candle_dict.values()) + if world.dash_shuffle[player]: + skipped_items.append(to_remove[removed]) + removed += 1 + elif not world.dash_shuffle[player]: + skipped_items.append("Dash Ability") - if self.multiworld.start_wheel[self.player]: - placed_items.append("The Young Mason's Wheel") + if world.wall_climb_shuffle[player]: + skipped_items.append(to_remove[removed]) + removed += 1 + elif not world.wall_climb_shuffle[player]: + skipped_items.append("Wall Climb Ability") - if not self.multiworld.skill_randomizer[self.player]: - placed_items.extend(Vanilla.skill_dict.values()) + if not world.reliquary_shuffle[player]: + skipped_items.extend(reliquary_set) + elif world.reliquary_shuffle[player]: + for i in range(3): + skipped_items.append(to_remove[removed]) + removed += 1 - counter = Counter(placed_items) + if not world.boots_of_pleading[player]: + skipped_items.append("Boots of Pleading") + + if not world.purified_hand[player]: + skipped_items.append("Purified Hand of the Nun") + + if world.start_wheel[player]: + skipped_items.append("The Young Mason's Wheel") + + if not world.skill_randomizer[player]: + skipped_items.extend(skill_dict.values()) + + counter = Counter(skipped_items) pool = [] @@ -169,95 +209,30 @@ class BlasphemousWorld(World): for i in range(count): pool.append(self.create_item(item["name"])) - self.multiworld.itempool += pool + for _ in range(junk): + pool.append(self.create_item(self.get_filler_item_name())) + + world.itempool += pool def pre_fill(self): - self.place_items_from_dict(Vanilla.unrandomized_dict) + world = self.multiworld + player = self.player - if not self.multiworld.cherub_shuffle[self.player]: - self.place_items_from_set(Vanilla.cherub_set, "Child of Moonlight") + self.place_items_from_dict(unrandomized_dict) - if not self.multiworld.life_shuffle[self.player]: - self.place_items_from_set(Vanilla.life_set, "Life Upgrade") + if world.thorn_shuffle[player] == 2: + self.place_items_from_set(thorn_set, "Thorn Upgrade") - if not self.multiworld.fervour_shuffle[self.player]: - self.place_items_from_set(Vanilla.fervour_set, "Fervour Upgrade") - - if not self.multiworld.sword_shuffle[self.player]: - self.place_items_from_set(Vanilla.sword_set, "Mea Culpa Upgrade") - - if not self.multiworld.blessing_shuffle[self.player]: - self.place_items_from_dict(Vanilla.blessing_dict) - - if not self.multiworld.dungeon_shuffle[self.player]: - self.place_items_from_dict(Vanilla.dungeon_dict) - - if not self.multiworld.tirso_shuffle[self.player]: - self.place_items_from_dict(Vanilla.tirso_dict) - - if not self.multiworld.miriam_shuffle[self.player]: - self.multiworld.get_location("AtTotS: Miriam's gift", self.player)\ - .place_locked_item(self.create_item("Cantina of the Blue Rose")) - - if not self.multiworld.redento_shuffle[self.player]: - self.place_items_from_dict(Vanilla.redento_dict) - - if not self.multiworld.jocinero_shuffle[self.player]: - self.place_items_from_dict(Vanilla.jocinero_dict) - - if not self.multiworld.altasgracias_shuffle[self.player]: - self.place_items_from_dict(Vanilla.altasgracias_dict) - - if not self.multiworld.tentudia_shuffle[self.player]: - self.place_items_from_dict(Vanilla.tentudia_dict) - - if not self.multiworld.gemino_shuffle[self.player]: - self.place_items_from_dict(Vanilla.gemino_dict) - - if not self.multiworld.guilt_shuffle[self.player]: - self.multiworld.get_location("GotP: Confessor Dungeon room", self.player)\ - .place_locked_item(self.create_item("Weight of True Guilt")) - - if not self.multiworld.ossuary_shuffle[self.player]: - self.place_items_from_dict(Vanilla.ossuary_dict) - - if not self.multiworld.boss_shuffle[self.player]: - self.place_items_from_dict(Vanilla.boss_dict) - - if not self.multiworld.wound_shuffle[self.player]: - self.place_items_from_dict(Vanilla.wound_dict) - - if not self.multiworld.mask_shuffle[self.player]: - self.place_items_from_dict(Vanilla.mask_dict) - - if not self.multiworld.eye_shuffle[self.player]: - self.place_items_from_dict(Vanilla.eye_dict) - - if not self.multiworld.herb_shuffle[self.player]: - self.place_items_from_dict(Vanilla.herb_dict) - - if not self.multiworld.church_shuffle[self.player]: - self.place_items_from_dict(Vanilla.church_dict) - - if not self.multiworld.shop_shuffle[self.player]: - self.place_items_from_dict(Vanilla.shop_dict) - - if self.multiworld.thorn_shuffle[self.player] == 2: - self.place_items_from_set(Vanilla.thorn_set, "Thorn Upgrade") - - if not self.multiworld.candle_shuffle[self.player]: - self.place_items_from_dict(Vanilla.candle_dict) - - if self.multiworld.start_wheel[self.player]: - self.multiworld.get_location("BotSS: Beginning gift", self.player)\ + if world.start_wheel[player]: + world.get_location("Beginning gift", player)\ .place_locked_item(self.create_item("The Young Mason's Wheel")) - if not self.multiworld.skill_randomizer[self.player]: - self.place_items_from_dict(Vanilla.skill_dict) + if not world.skill_randomizer[player]: + self.place_items_from_dict(skill_dict) - if self.multiworld.thorn_shuffle[self.player] == 1: - self.multiworld.local_items[self.player].value.add("Thorn Upgrade") + if world.thorn_shuffle[player] == 1: + world.local_items[player].value.add("Thorn Upgrade") def place_items_from_set(self, location_set: Set[str], name: str): @@ -273,133 +248,143 @@ class BlasphemousWorld(World): def create_regions(self) -> None: - player = self.player world = self.multiworld - - region_table: Dict[str, Region] = { - "menu" : Region("Menu", player, world), - "albero" : Region("Albero", player, world), - "attots" : Region("All the Tears of the Sea", player, world), - "ar" : Region("Archcathedral Rooftops", player, world), - "bottc" : Region("Bridge of the Three Cavalries", player, world), - "botss" : Region("Brotherhood of the Silent Sorrow", player, world), - "coolotcv": Region("Convent of Our Lady of the Charred Visage", player, world), - "dohh" : Region("Deambulatory of His Holiness", player, world), - "dc" : Region("Desecrated Cistern", player, world), - "eos" : Region("Echoes of Salt", player, world), - "ft" : Region("Ferrous Tree", player, world), - "gotp" : Region("Graveyard of the Peaks", player, world), - "ga" : Region("Grievance Ascends", player, world), - "hotd" : Region("Hall of the Dawning", player, world), - "jondo" : Region("Jondo", player, world), - "kottw" : Region("Knot of the Three Words", player, world), - "lotnw" : Region("Library of the Negated Words", player, world), - "md" : Region("Mercy Dreams", player, world), - "mom" : Region("Mother of Mothers", player, world), - "moted" : Region("Mountains of the Endless Dusk", player, world), - "mah" : Region("Mourning and Havoc", player, world), - "potss" : Region("Patio of the Silent Steps", player, world), - "petrous" : Region("Petrous", player, world), - "thl" : Region("The Holy Line", player, world), - "trpots" : Region("The Resting Place of the Sister", player, world), - "tsc" : Region("The Sleeping Canvases", player, world), - "wothp" : Region("Wall of the Holy Prohibitions", player, world), - "wotbc" : Region("Wasteland of the Buried Churches", player, world), - "wotw" : Region("Where Olive Trees Wither", player, world), - "dungeon" : Region("Dungeons", player, world) - } - - for rname, reg in region_table.items(): - world.regions.append(reg) - - for ename, exits in region_exit_table.items(): - if ename == rname: - for i in exits: - ent = Entrance(player, i, reg) - reg.exits.append(ent) - - for e, r in exit_lookup_table.items(): - if i == e: - ent.connect(region_table[r]) - - for loc in location_table: - id = base_id + location_table.index(loc) - region_table[loc["region"]].locations\ - .append(BlasphemousLocation(self.player, loc["name"], id, region_table[loc["region"]])) - victory = Location(self.player, "His Holiness Escribar", None, self.multiworld.get_region("Deambulatory of His Holiness", self.player)) - victory.place_locked_item(self.create_event("Victory")) - self.multiworld.get_region("Deambulatory of His Holiness", self.player).locations.append(victory) + menu_region = Region("Menu", player, world) + misc_region = Region("Misc", player, world) + world.regions += [menu_region, misc_region] - if self.multiworld.ending[self.player].value == 1: + for room in room_table: + region = Region(room, player, world) + world.regions.append(region) + + menu_region.add_exits({self.start_room: "New Game"}) + world.get_region(self.start_room, player).add_exits({"Misc": "Misc"}) + + for door in door_table: + if door.get("OriginalDoor") is None: + continue + else: + if not door["Id"] in self.door_connections.keys(): + self.door_connections[door["Id"]] = door["OriginalDoor"] + self.door_connections[door["OriginalDoor"]] = door["Id"] + + parent_region: Region = self.get_room_from_door(door["Id"]) + target_region: Region = self.get_room_from_door(door["OriginalDoor"]) + parent_region.add_exits({ + target_region.name: door["Id"] + }, { + target_region.name: lambda x: door.get("VisibilityFlags") != 1 + }) + + for index, loc in enumerate(location_table): + if not world.boots_of_pleading[player] and loc["name"] == "BotSS: 2nd meeting with Redento": + continue + if not world.purified_hand[player] and loc["name"] == "MoM: Western room ledge": + continue + + region: Region = world.get_region(loc["room"], player) + region.add_locations({loc["name"]: base_id + index}) + #id = base_id + location_table.index(loc) + #reg.locations.append(BlasphemousLocation(player, loc["name"], id, reg)) + + for e, r in event_table.items(): + region: Region = world.get_region(r, player) + event = BlasphemousLocation(player, e, None, region) + event.show_in_spoiler = False + event.place_locked_item(self.create_event(e)) + region.locations.append(event) + + for door in door_table: + region: Region = self.get_room_from_door(self.door_connections[door["Id"]]) + event = BlasphemousLocation(player, door["Id"], None, region) + event.show_in_spoiler = False + event.place_locked_item(self.create_event(door["Id"])) + add_rule(event, lambda state: state.can_reach(self.get_connected_door(door["Id"])), player) + region.locations.append(event) + + victory = Location(player, "His Holiness Escribar", None, world.get_region("D07Z01S03", player)) + victory.place_locked_item(self.create_event("Victory")) + world.get_region("D07Z01S03", player).locations.append(victory) + + if world.ending[self.player].value == 1: set_rule(victory, lambda state: state.has("Thorn Upgrade", player, 8)) - elif self.multiworld.ending[self.player].value == 2: - set_rule(victory, lambda state: state.has("Thorn Upgrade", player, 8) and \ + elif world.ending[self.player].value == 2: + set_rule(victory, lambda state: state.has("Thorn Upgrade", player, 8) and state.has("Holy Wound of Abnegation", player)) - self.multiworld.completion_condition[self.player] = lambda state: state.has("Victory", self.player) + world.completion_condition[self.player] = lambda state: state.has("Victory", player) + + def get_room_from_door(self, door: str) -> Region: + return self.multiworld.get_region(door.split("[")[0], self.player) + + + def get_connected_door(self, door: str) -> Entrance: + return self.multiworld.get_entrance(self.door_connections[door], self.player) + def fill_slot_data(self) -> Dict[str, Any]: slot_data: Dict[str, Any] = {} locations = [] + doors: Dict[str, str] = {} - for loc in self.multiworld.get_filled_locations(self.player): - if loc.name == "His Holiness Escribar": + world = self.multiworld + player = self.player + thorns: bool = True + + if world.thorn_shuffle[player].value == 2: + thorns = False + + for loc in world.get_filled_locations(player): + if loc.item.code == None: continue else: data = { "id": self.location_name_to_game_id[loc.name], "ap_id": loc.address, "name": loc.item.name, - "player_name": self.multiworld.player_name[loc.item.player] + "player_name": world.player_name[loc.item.player], + "type": int(loc.item.classification) } - if loc.name in shop_set: - data["type"] = loc.item.classification.name - locations.append(data) config = { - "versionCreated": "AP", - "general": { - "teleportationAlwaysUnlocked": bool(self.multiworld.prie_dieu_warp[self.player].value), - "skipCutscenes": bool(self.multiworld.skip_cutscenes[self.player].value), - "enablePenitence": bool(self.multiworld.penitence[self.player].value), - "hardMode": False, - "customSeed": 0, - "allowHints": bool(self.multiworld.corpse_hints[self.player].value) - }, - "items": { - "type": 1, - "lungDamage": False, - "disableNPCDeath": True, - "startWithWheel": bool(self.multiworld.start_wheel[self.player].value), - "shuffleReliquaries": bool(self.multiworld.reliquary_shuffle[self.player].value) - }, - "enemies": { - "type": self.multiworld.enemy_randomizer[self.player].value, - "maintainClass": bool(self.multiworld.enemy_groups[self.player].value), - "areaScaling": bool(self.multiworld.enemy_scaling[self.player].value) - }, - "prayers": { - "type": 0, - "removeMirabis": False - }, - "doors": { - "type": 0 - }, - "debug": { - "type": 0 - } + "LogicDifficulty": world.difficulty[player].value, + "StartingLocation": world.starting_location[player].value, + "VersionCreated": "AP", + + "UnlockTeleportation": bool(world.prie_dieu_warp[player].value), + "AllowHints": bool(world.corpse_hints[player].value), + "AllowPenitence": bool(world.penitence[player].value), + + "ShuffleReliquaries": bool(world.reliquary_shuffle[player].value), + "ShuffleBootsOfPleading": bool(world.boots_of_pleading[player].value), + "ShufflePurifiedHand": bool(world.purified_hand[player].value), + "ShuffleDash": bool(world.dash_shuffle[player].value), + "ShuffleWallClimb": bool(world.wall_climb_shuffle[player].value), + + "ShuffleSwordSkills": bool(world.skill_randomizer[player].value), + "ShuffleThorns": thorns, + "JunkLongQuests": bool(world.skip_long_quests[player].value), + "StartWithWheel": bool(world.start_wheel[player].value), + + "EnemyShuffleType": world.enemy_randomizer[player].value, + "MaintainClass": bool(world.enemy_groups[player].value), + "AreaScaling": bool(world.enemy_scaling[player].value), + + "BossShuffleType": 0, + "DoorShuffleType": 0 } slot_data = { "locations": locations, + "doors": doors, "cfg": config, - "ending": self.multiworld.ending[self.player].value, - "death_link": bool(self.multiworld.death_link[self.player].value) + "ending": world.ending[self.player].value, + "death_link": bool(world.death_link[self.player].value) } return slot_data diff --git a/worlds/blasphemous/docs/setup_en.md b/worlds/blasphemous/docs/setup_en.md index 999765bb..cc238a49 100644 --- a/worlds/blasphemous/docs/setup_en.md +++ b/worlds/blasphemous/docs/setup_en.md @@ -1,24 +1,49 @@ # Blasphemous Multiworld Setup Guide -## Required Software +## Useful Links -- Blasphemous from: [Steam](https://store.steampowered.com/app/774361/Blasphemous/) -- Blasphemous Modding API from: [GitHub](https://github.com/BrandenEK/Blasphemous-Modding-API) -- Blasphemous Randomizer from: [GitHub](https://github.com/BrandenEK/Blasphemous-Randomizer) -- Blasphemous Multiworld from: [GitHub](https://github.com/BrandenEK/Blasphemous-Multiworld) -- (*Optional*) PopTracker Pack from: [GitHub](https://github.com/sassyvania/Blasphemous-Randomizer-Maptracker) +Required: +- Blasphemous: [Steam](https://store.steampowered.com/app/774361/Blasphemous/) + - The GOG version of Blasphemous will also work. +- Blasphemous Mod Installer: [GitHub](https://github.com/BrandenEK/Blasphemous-Mod-Installer) +- Blasphemous Modding API: [GitHub](https://github.com/BrandenEK/Blasphemous-Modding-API) +- Blasphemous Randomizer: [GitHub](https://github.com/BrandenEK/Blasphemous-Randomizer) +- Blasphemous Multiworld: [GitHub](https://github.com/BrandenEK/Blasphemous-Multiworld) -## Instructions (Windows) +Optional: +- In-game map tracker: [GitHub](https://github.com/BrandenEK/Blasphemous-Rando-Map) +- Quick Prie Dieu warp mod: [GitHub](https://github.com/BadMagic100/Blasphemous-PrieWarp) +- Boots of Pleading mod: [GitHub](https://github.com/BrandenEK/Blasphemous-Boots-of-Pleading) +- Double Jump mod: [GitHub](https://github.com/BrandenEK/Blasphemous-Double-Jump) +- PopTracker pack: [GitHub](https://github.com/sassyvania/Blasphemous-Randomizer-Maptracker) -1. Download the [Modding API](https://github.com/BrandenEK/Blasphemous-Modding-API/releases), and follow the [installation instructions](https://github.com/BrandenEK/Blasphemous-Modding-API#installation) on the GitHub page. +## Mod Installer (Recommended) -2. After the Modding API has been installed, download the [Randomizer](https://github.com/BrandenEK/Blasphemous-Randomizer/releases) and [Multiworld](https://github.com/BrandenEK/Blasphemous-Multiworld/releases) archives, and extract the contents of both into the `Modding` folder. +1. Download the [Mod Installer](https://github.com/BrandenEK/Blasphemous-Mod-Installer), +and point it to your install directory for Blasphemous. -3. Start Blasphemous. To verfy that the mods are working, look for a version number for both the Randomizer and Multiworld on the title screen. +2. Install the `Modding API`, `Randomizer`, and `Multiworld` mods. Optionally, you can also install the +`Rando Map`, `PrieWarp`, `Boots of Pleading`, and `Double Jump` mods, and set up the PopTracker pack if desired. -4. (*Optional*) Add the Blasphemous pack to PopTracker. In game, open the console by pressing backslash `\` and type `randomizer autotracker on` to automatically connect the game to PopTracker. +3. Start Blasphemous. To verfy that the mods are working, look for a version number for both +the Randomizer and Multiworld on the title screen. + +## Manual Installation + +1. Download the [Modding API](https://github.com/BrandenEK/Blasphemous-Modding-API/releases), and follow +the [installation instructions](https://github.com/BrandenEK/Blasphemous-Modding-API#installation) on the GitHub page. + +2. After the Modding API has been installed, download the +[Randomizer](https://github.com/BrandenEK/Blasphemous-Randomizer/releases) and +[Multiworld](https://github.com/BrandenEK/Blasphemous-Multiworld/releases) archives, and extract the contents of both +into the `Modding` folder. Then, add any desired additional mods. + +3. Start Blasphemous. To verfy that the mods are working, look for a version number for both +the Randomizer and Multiworld on the title screen. ## Connecting -To connect to an Archipelago server, open the in-game console by pressing backslash `\` and use the command `multiworld connect [address:port] [name] [password]`. The port and password are both optional - if no port is provided then the default port of 38281 is used. +To connect to an Archipelago server, open the in-game console by pressing backslash `\` and use +the command `multiworld connect [address:port] [name] [password]`. +The port and password are both optional - if no port is provided then the default port of 38281 is used. **Make sure to connect to the server before attempting to start a new save file.** \ No newline at end of file