Blasphemous: Set rules for event items later + misc logic fixes (#2084)
Co-authored-by: Fabian Dill <Berserker66@users.noreply.github.com>
This commit is contained in:
		
							parent
							
								
									8af4fda7b6
								
							
						
					
					
						commit
						6c7a7d2be5
					
				| 
						 | 
					@ -255,23 +255,23 @@ def opened_botss_ladder(state: CollectionState, player: int) -> bool:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def upwarp_skips_allowed(logic: int) -> bool:
 | 
					def upwarp_skips_allowed(logic: int) -> bool:
 | 
				
			||||||
    return True if logic >= 2 else False
 | 
					    return logic >= 2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def mourning_skips_allowed(logic: int) -> bool:
 | 
					def mourning_skips_allowed(logic: int) -> bool:
 | 
				
			||||||
    return True if logic >= 2 else False
 | 
					    return logic >= 2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def enemy_skips_allowed(logic: int, enemy: int) -> bool:
 | 
					def enemy_skips_allowed(logic: int, enemy: int) -> bool:
 | 
				
			||||||
    return True if logic >= 2 and enemy == 0 else False
 | 
					    return logic >= 2 and enemy == 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#def unknown_skips_allowed():
 | 
					def obscure_skips_allowed(logic):
 | 
				
			||||||
#    return False
 | 
					    return logic >= 2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#def precise_skips_allowed():
 | 
					def precise_skips_allowed(logic):
 | 
				
			||||||
#    return False
 | 
					    return logic >= 2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def can_beat_boss(state: CollectionState, boss: str, logic: int, player: int) -> bool:
 | 
					def can_beat_boss(state: CollectionState, boss: str, logic: int, player: int) -> bool:
 | 
				
			||||||
| 
						 | 
					@ -412,7 +412,7 @@ def guilt_rooms(state: CollectionState, player: int, number: int) -> bool:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    total: int = sum(state.has(item, player) for item in doors)
 | 
					    total: int = sum(state.has(item, player) for item in doors)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return True if total >= number else False
 | 
					    return total >= number
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def sword_rooms(state: CollectionState, player: int, number: int) -> bool:
 | 
					def sword_rooms(state: CollectionState, player: int, number: int) -> bool:
 | 
				
			||||||
| 
						 | 
					@ -428,7 +428,7 @@ def sword_rooms(state: CollectionState, player: int, number: int) -> bool:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    total: int = sum(state.has_any(items, player) for items in doors)
 | 
					    total: int = sum(state.has_any(items, player) for items in doors)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return True if total >= number else False
 | 
					    return total >= number
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def redento(state: CollectionState, world, player: int, number: int) -> bool:
 | 
					def redento(state: CollectionState, world, player: int, number: int) -> bool:
 | 
				
			||||||
| 
						 | 
					@ -479,7 +479,7 @@ def amanecida_rooms(state: CollectionState, logic: int, player: int, number: int
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    total = sum(can_beat_boss(state, boss, logic, player) for boss in bosses)
 | 
					    total = sum(can_beat_boss(state, boss, logic, player) for boss in bosses)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return True if total >= number else False
 | 
					    return total >= number
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def chalice_rooms(state: CollectionState, player: int, number: int) -> bool:
 | 
					def chalice_rooms(state: CollectionState, player: int, number: int) -> bool:
 | 
				
			||||||
| 
						 | 
					@ -491,7 +491,7 @@ def chalice_rooms(state: CollectionState, player: int, number: int) -> bool:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    total: int = sum(state.has_any(items, player) for items in doors)
 | 
					    total: int = sum(state.has_any(items, player) for items in doors)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return True if total >= number else False
 | 
					    return total >= number
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def rules(blasphemousworld):
 | 
					def rules(blasphemousworld):
 | 
				
			||||||
| 
						 | 
					@ -575,12 +575,13 @@ def rules(blasphemousworld):
 | 
				
			||||||
            state.has("RodeGOTPElevator", player)
 | 
					            state.has("RodeGOTPElevator", player)
 | 
				
			||||||
            or pillar(state, player)
 | 
					            or pillar(state, player)
 | 
				
			||||||
            or state.has("Cante Jondo of the Three Sisters", player)
 | 
					            or state.has("Cante Jondo of the Three Sisters", player)
 | 
				
			||||||
            or state.has("D01Z02S03[NW]", player) and (
 | 
					            or state.has("Purified Hand of the Nun", player)
 | 
				
			||||||
                can_cross_gap(state, logic, player, 2)
 | 
					            or state.has("D01Z02S03[NW]", player) 
 | 
				
			||||||
 | 
					            and (
 | 
				
			||||||
 | 
					                can_cross_gap(state, logic, player, 1)
 | 
				
			||||||
                or state.has("Lorquiana", player)
 | 
					                or state.has("Lorquiana", player)
 | 
				
			||||||
                or aubade(state, player)
 | 
					                or aubade(state, player)
 | 
				
			||||||
                or state.has("Cantina of the Blue Rose", player)
 | 
					                or state.has("Cantina of the Blue Rose", player)
 | 
				
			||||||
                or can_air_stall(state, logic, player)
 | 
					 | 
				
			||||||
                or charge_beam(state, player)
 | 
					                or charge_beam(state, player)
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
        ))
 | 
					        ))
 | 
				
			||||||
| 
						 | 
					@ -705,6 +706,7 @@ def rules(blasphemousworld):
 | 
				
			||||||
            or aubade(state, player)
 | 
					            or aubade(state, player)
 | 
				
			||||||
            or charge_beam(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)
 | 
					            or state.has_any({"Lorquiana", "Cante Jondo of the Three Sisters", "Cantina of the Blue Rose", "Cloistered Ruby"}, player)
 | 
				
			||||||
 | 
					            or precise_skips_allowed(logic)
 | 
				
			||||||
        ))
 | 
					        ))
 | 
				
			||||||
    # Doors
 | 
					    # Doors
 | 
				
			||||||
    set_rule(world.get_entrance("D01Z03S07[-Cherubs]", player),
 | 
					    set_rule(world.get_entrance("D01Z03S07[-Cherubs]", player),
 | 
				
			||||||
| 
						 | 
					@ -926,10 +928,24 @@ def rules(blasphemousworld):
 | 
				
			||||||
    # D01Z05S25 (Desecrated Cistern)
 | 
					    # D01Z05S25 (Desecrated Cistern)
 | 
				
			||||||
    # Items
 | 
					    # Items
 | 
				
			||||||
    set_rule(world.get_location("DC: Elevator shaft ledge", player),
 | 
					    set_rule(world.get_location("DC: Elevator shaft ledge", player),
 | 
				
			||||||
        lambda state: state.has("Linen of Golden Thread", player))
 | 
					        lambda state: (
 | 
				
			||||||
 | 
					            state.has("Linen of Golden Thread", player)
 | 
				
			||||||
 | 
					            or (
 | 
				
			||||||
 | 
					                state.has("Purified Hand of the Nun", player)
 | 
				
			||||||
 | 
					                and state.has_any({"D01Z05S25[SW]", "D01Z05S25[SE]", "D01Z05S25[NE]"}, player)
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					        ))
 | 
				
			||||||
    set_rule(world.get_location("DC: Elevator shaft Child of Moonlight", player),
 | 
					    set_rule(world.get_location("DC: Elevator shaft Child of Moonlight", player),
 | 
				
			||||||
        lambda state: (
 | 
					        lambda state: (
 | 
				
			||||||
            state.has("Linen of Golden Thread", player)
 | 
					            state.has("Linen of Golden Thread", player)
 | 
				
			||||||
 | 
					            or (
 | 
				
			||||||
 | 
					                obscure_skips_allowed(logic)
 | 
				
			||||||
 | 
					                and state.has_any({"D01Z05S25[SW]", "D01Z05S25[SE]", "D01Z05S25[NE]"}, player)
 | 
				
			||||||
 | 
					                and (
 | 
				
			||||||
 | 
					                    aubade(state, player)
 | 
				
			||||||
 | 
					                    or state.has("Cantina of the Blue Rose", player)
 | 
				
			||||||
 | 
					                )
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
            or (
 | 
					            or (
 | 
				
			||||||
                pillar(state, player)
 | 
					                pillar(state, player)
 | 
				
			||||||
                and (
 | 
					                and (
 | 
				
			||||||
| 
						 | 
					@ -995,27 +1011,33 @@ def rules(blasphemousworld):
 | 
				
			||||||
        lambda state: state.has("D01Z05S25[EchoesE]", player))
 | 
					        lambda state: state.has("D01Z05S25[EchoesE]", player))
 | 
				
			||||||
    add_rule(world.get_entrance("D01Z05S25[EchoesW]", player),
 | 
					    add_rule(world.get_entrance("D01Z05S25[EchoesW]", player),
 | 
				
			||||||
        lambda state: (
 | 
					        lambda state: (
 | 
				
			||||||
            (
 | 
					 | 
				
			||||||
            state.has("D01Z05S25[EchoesE]", player)
 | 
					            state.has("D01Z05S25[EchoesE]", player)
 | 
				
			||||||
            and (
 | 
					            and (
 | 
				
			||||||
                state.has("Blood Perpetuated in Sand", player)
 | 
					                state.has("Blood Perpetuated in Sand", player)
 | 
				
			||||||
                or can_cross_gap(state, logic, player, 8)
 | 
					                or can_cross_gap(state, logic, player, 8)
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
 | 
					            or state.has("Linen of Golden Thread", player)
 | 
				
			||||||
 | 
					            and (
 | 
				
			||||||
 | 
					                can_cross_gap(state, logic, player, 5)
 | 
				
			||||||
 | 
					                or can_air_stall(state, logic, player)
 | 
				
			||||||
 | 
					                and state.has("Blood Perpetuated in Sand", player)
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
            or state.has_all({"Linen of Golden Thread", "Purified Hand of the Nun"}, player)
 | 
					 | 
				
			||||||
        ))
 | 
					        ))
 | 
				
			||||||
    set_rule(world.get_entrance("D01Z05S25[EchoesE]", player),
 | 
					    set_rule(world.get_entrance("D01Z05S25[EchoesE]", player),
 | 
				
			||||||
        lambda state: state.has("D01Z05S25[EchoesW]", player))
 | 
					        lambda state: state.has("D01Z05S25[EchoesW]", player))
 | 
				
			||||||
    add_rule(world.get_entrance("D01Z05S25[EchoesE]", player),
 | 
					    add_rule(world.get_entrance("D01Z05S25[EchoesE]", player),
 | 
				
			||||||
        lambda state: (
 | 
					        lambda state: (
 | 
				
			||||||
            (
 | 
					 | 
				
			||||||
            state.has("D01Z05S25[EchoesW]", player)
 | 
					            state.has("D01Z05S25[EchoesW]", player)
 | 
				
			||||||
            and (
 | 
					            and (
 | 
				
			||||||
                state.has("Blood Perpetuated in Sand", player)
 | 
					                state.has("Blood Perpetuated in Sand", player)
 | 
				
			||||||
                or can_cross_gap(state, logic, player, 8)
 | 
					                or can_cross_gap(state, logic, player, 8)
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
 | 
					            or state.has("Linen of Golden Thread", player)
 | 
				
			||||||
 | 
					            and (
 | 
				
			||||||
 | 
					                can_cross_gap(state, logic, player, 5)
 | 
				
			||||||
 | 
					                or can_air_stall(state, logic, player)
 | 
				
			||||||
 | 
					                and state.has("Blood Perpetuated in Sand", player)
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
            or state.has_all({"Linen of Golden Thread", "Purified Hand of the Nun"}, player)
 | 
					 | 
				
			||||||
        ))
 | 
					        ))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1193,16 +1215,14 @@ def rules(blasphemousworld):
 | 
				
			||||||
    # Items
 | 
					    # Items
 | 
				
			||||||
    set_rule(world.get_location("WOTW: Underground ledge", player),
 | 
					    set_rule(world.get_location("WOTW: Underground ledge", player),
 | 
				
			||||||
        lambda state: (
 | 
					        lambda state: (
 | 
				
			||||||
            state.has_all({"Wall Climb Ability", "Blood Perpetuated in Sand"}, player)
 | 
					            state.has("Wall Climb Ability", player)
 | 
				
			||||||
 | 
					            and (
 | 
				
			||||||
 | 
					                state.has("Purified Hand of the Nun", player)
 | 
				
			||||||
 | 
					                or state.has("Blood Perpetuated in Sand", player)
 | 
				
			||||||
                and (
 | 
					                and (
 | 
				
			||||||
                    state.has("Dash Ability", player)
 | 
					                    state.has("Dash Ability", player)
 | 
				
			||||||
                    or state.has("D02Z01S06[Cherubs]", 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),
 | 
					    set_rule(world.get_location("WOTW: Underground Child of Moonlight", player),
 | 
				
			||||||
| 
						 | 
					@ -1210,20 +1230,26 @@ def rules(blasphemousworld):
 | 
				
			||||||
            (
 | 
					            (
 | 
				
			||||||
                state.has("D02Z01S06[W]", player)
 | 
					                state.has("D02Z01S06[W]", player)
 | 
				
			||||||
                or state.has("Dash Ability", player)
 | 
					                or state.has("Dash Ability", player)
 | 
				
			||||||
                or state.has_all({"Purified Hand of the Nun", "Wall Climb Ability"}, player)
 | 
					                or state.has("Purified Hand of the Nun", player)
 | 
				
			||||||
 | 
					                and state.has("Wall Climb Ability", player)
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
            and (
 | 
					            and (
 | 
				
			||||||
                pillar(state, player)
 | 
					                pillar(state, player)
 | 
				
			||||||
                or state.has("Cante Jondo of the Three Sisters", player)
 | 
					                or state.has("Cante Jondo of the Three Sisters", player)
 | 
				
			||||||
 | 
					                or can_dive_laser(state, logic, player)
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
            or (
 | 
					            or (
 | 
				
			||||||
                state.has("D02Z01S06[W]", player)
 | 
					                state.has("Wall Climb Ability", player)
 | 
				
			||||||
                or state.has_any({"Purified Hand of the Nun", "Dash Ability"}, player)
 | 
					 | 
				
			||||||
            )
 | 
					 | 
				
			||||||
            and state.has("Wall Climb Ability", player)
 | 
					 | 
				
			||||||
                and (
 | 
					                and (
 | 
				
			||||||
                state.has_any({"Lorquiana", "Cantina of the Blue Rose"}, player)
 | 
					                    state.has("D02Z01S06[W]", player)
 | 
				
			||||||
 | 
					                    or state.has("Purified Hand of the Nun", player)
 | 
				
			||||||
 | 
					                    or state.has("Dash Ability", player)
 | 
				
			||||||
 | 
					                )
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					            and (
 | 
				
			||||||
 | 
					                state.has("Lorquiana", player)
 | 
				
			||||||
                or aubade(state, player)
 | 
					                or aubade(state, player)
 | 
				
			||||||
 | 
					                or state.has("Cantina of the Blue Rose", player)
 | 
				
			||||||
                or can_air_stall(state, logic, player)
 | 
					                or can_air_stall(state, logic, player)
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
        ))
 | 
					        ))
 | 
				
			||||||
| 
						 | 
					@ -1353,17 +1379,13 @@ def rules(blasphemousworld):
 | 
				
			||||||
        ))
 | 
					        ))
 | 
				
			||||||
    set_rule(world.get_location("GotP: Upper east shaft", player),
 | 
					    set_rule(world.get_location("GotP: Upper east shaft", player),
 | 
				
			||||||
        lambda state: (
 | 
					        lambda state: (
 | 
				
			||||||
            (
 | 
					 | 
				
			||||||
            can_climb_on_root(state, player)
 | 
					            can_climb_on_root(state, player)
 | 
				
			||||||
                and state.has("Purified Hand of the Nun", player)
 | 
					 | 
				
			||||||
            )
 | 
					 | 
				
			||||||
            or (
 | 
					 | 
				
			||||||
                state.has("Blood Perpetuated in Sand", player)
 | 
					 | 
				
			||||||
            and (
 | 
					            and (
 | 
				
			||||||
                    state.has("Purified Hand of the Nun", player)
 | 
					                state.has("D02Z02S03[NE]", player)
 | 
				
			||||||
                    or can_climb_on_root(state, player)
 | 
					                or state.has("Purified Hand of the Nun", player)
 | 
				
			||||||
                )
 | 
					                or state.has("Blood Perpetuated in Sand", player)
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
 | 
					            or state.has_all({"Blood Perpetuated in Sand", "Purified Hand of the Nun"}, player)
 | 
				
			||||||
        ))
 | 
					        ))
 | 
				
			||||||
    # Doors
 | 
					    # Doors
 | 
				
			||||||
    set_rule(world.get_entrance("D02Z02S03[NW]", player),
 | 
					    set_rule(world.get_entrance("D02Z02S03[NW]", player),
 | 
				
			||||||
| 
						 | 
					@ -1549,6 +1571,7 @@ def rules(blasphemousworld):
 | 
				
			||||||
    set_rule(world.get_location("GotP: Shop cave Child of Moonlight", player),
 | 
					    set_rule(world.get_location("GotP: Shop cave Child of Moonlight", player),
 | 
				
			||||||
        lambda state: (
 | 
					        lambda state: (
 | 
				
			||||||
            state.has("D02Z02S08[CherubsR]", player)
 | 
					            state.has("D02Z02S08[CherubsR]", player)
 | 
				
			||||||
 | 
					            or can_dive_laser(state, logic, player)
 | 
				
			||||||
            or state.has("Blood Perpetuated in Sand", player)
 | 
					            or state.has("Blood Perpetuated in Sand", player)
 | 
				
			||||||
            or pillar(state, player)
 | 
					            or pillar(state, player)
 | 
				
			||||||
            or can_cross_gap(state, logic, player, 8)
 | 
					            or can_cross_gap(state, logic, player, 8)
 | 
				
			||||||
| 
						 | 
					@ -2055,13 +2078,6 @@ def rules(blasphemousworld):
 | 
				
			||||||
        lambda state: broke_jondo_bell_e(state, logic, enemy, 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)
 | 
					    # D03Z02S08 (Jondo)
 | 
				
			||||||
    # Items
 | 
					    # Items
 | 
				
			||||||
    set_rule(world.get_location("Jondo: Lower west bell alcove", player),
 | 
					    set_rule(world.get_location("Jondo: Lower west bell alcove", player),
 | 
				
			||||||
| 
						 | 
					@ -2116,44 +2132,58 @@ def rules(blasphemousworld):
 | 
				
			||||||
    # Items
 | 
					    # Items
 | 
				
			||||||
    set_rule(world.get_location("Jondo: Spike tunnel statue", player),
 | 
					    set_rule(world.get_location("Jondo: Spike tunnel statue", player),
 | 
				
			||||||
        lambda state: (
 | 
					        lambda state: (
 | 
				
			||||||
            state.has("Dash Ability", player)
 | 
					            state.has("D03Z02S11[W]", player)
 | 
				
			||||||
            and (
 | 
					            and state.has("Purified Hand of the Nun", player)
 | 
				
			||||||
                state.has_any({"Purified Hand of the Nun", "Wall Climb Ability"}, player)
 | 
					 | 
				
			||||||
            or state.has("D03Z02S11[E]", player)
 | 
					            or state.has("D03Z02S11[E]", player)
 | 
				
			||||||
                and can_cross_gap(state, logic, player, 2)
 | 
					            and state.has("Dash Ability", player)
 | 
				
			||||||
 | 
					            and (
 | 
				
			||||||
 | 
					                state.has("Wall Climb Ability", player)
 | 
				
			||||||
 | 
					                or can_cross_gap(state, logic, player, 2)
 | 
				
			||||||
 | 
					                or precise_skips_allowed(logic)
 | 
				
			||||||
 | 
					                and can_cross_gap(state, logic, player, 1)
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
        ))
 | 
					        ))
 | 
				
			||||||
    set_rule(world.get_location("Jondo: Spike tunnel Child of Moonlight", player),
 | 
					    set_rule(world.get_location("Jondo: Spike tunnel Child of Moonlight", player),
 | 
				
			||||||
        lambda state: (
 | 
					        lambda state: (
 | 
				
			||||||
            state.has("Dash Ability", player)
 | 
					            state.has("D03Z02S11[W]", player)
 | 
				
			||||||
            and (
 | 
					            and (
 | 
				
			||||||
                state.has_any({"Purified Hand of the Nun", "Wall Climb Ability"}, player)
 | 
					                state.has("Purified Hand of the Nun", player)
 | 
				
			||||||
                or state.has("D03Z02S11[W]", player)
 | 
					                or state.has("Dash Ability", player)
 | 
				
			||||||
                and (
 | 
					                and (
 | 
				
			||||||
                    can_cross_gap(state, logic, player, 2)
 | 
					                    state.has("Wall Climb Ability", player)
 | 
				
			||||||
 | 
					                    or can_cross_gap(state, logic, player, 2)
 | 
				
			||||||
                    and can_enemy_bounce(logic, enemy)
 | 
					                    and can_enemy_bounce(logic, enemy)
 | 
				
			||||||
                    or can_cross_gap(state, logic, player, 3)
 | 
					                    or can_cross_gap(state, logic, player, 3)
 | 
				
			||||||
                )
 | 
					                )
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
            or state.has("D03Z02S11[E]", player)
 | 
					            or state.has("D03Z02S11[E]", player)
 | 
				
			||||||
 | 
					            and state.has("Dash Ability", player)
 | 
				
			||||||
            and (
 | 
					            and (
 | 
				
			||||||
                can_cross_gap(state, logic, player, 1)
 | 
					                can_cross_gap(state, logic, player, 1)
 | 
				
			||||||
 | 
					                or state.has("Wall Climb Ability", player)
 | 
				
			||||||
                or can_enemy_bounce(logic, enemy)
 | 
					                or can_enemy_bounce(logic, enemy)
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
            )
 | 
					 | 
				
			||||||
        ))
 | 
					        ))
 | 
				
			||||||
    # Doors
 | 
					    # Doors
 | 
				
			||||||
    set_rule(world.get_entrance("D03Z02S11[W]", player),
 | 
					    set_rule(world.get_entrance("D03Z02S11[W]", player),
 | 
				
			||||||
        lambda state: (
 | 
					        lambda state: (
 | 
				
			||||||
            state.has("Dash Ability", player)
 | 
					            state.has("Dash Ability", player)
 | 
				
			||||||
            and (
 | 
					            and (
 | 
				
			||||||
                state.has_any({"Purified Hand of the Nun", "Wall Climb Ability"}, player)
 | 
					                state.has("Wall Climb Ability", player)
 | 
				
			||||||
                or can_cross_gap(state, logic, player, 2)
 | 
					                or can_cross_gap(state, logic, player, 2)
 | 
				
			||||||
 | 
					                or precise_skips_allowed(logic)
 | 
				
			||||||
 | 
					                and can_cross_gap(state, logic, player, 1)
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
        ))
 | 
					        ))
 | 
				
			||||||
    set_rule(world.get_entrance("D03Z02S11[E]", player),
 | 
					    set_rule(world.get_entrance("D03Z02S11[E]", player),
 | 
				
			||||||
        lambda state: (
 | 
					        lambda state: (
 | 
				
			||||||
            state.has("Dash Ability", player)
 | 
					            state.has("Dash Ability", player)
 | 
				
			||||||
            and state.has_any({"Purified Hand of the Nun", "Wall Climb Ability"}, player)
 | 
					            and (
 | 
				
			||||||
 | 
					                state.has("Wall Climb Ability", player)
 | 
				
			||||||
 | 
					                or state.has("Purified Hand of the Nun", player)
 | 
				
			||||||
 | 
					                or can_cross_gap(state, logic, player, 2)
 | 
				
			||||||
 | 
					                and can_enemy_bounce(logic, enemy)
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
        ))
 | 
					        ))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # D03Z02S13 (Jondo)
 | 
					    # D03Z02S13 (Jondo)
 | 
				
			||||||
| 
						 | 
					@ -2224,7 +2254,11 @@ def rules(blasphemousworld):
 | 
				
			||||||
        ))
 | 
					        ))
 | 
				
			||||||
    set_rule(world.get_entrance("D03Z03S04[NE]", player),
 | 
					    set_rule(world.get_entrance("D03Z03S04[NE]", player),
 | 
				
			||||||
        lambda state: (
 | 
					        lambda state: (
 | 
				
			||||||
 | 
					            (
 | 
				
			||||||
                state.has("Wall Climb Ability", player)
 | 
					                state.has("Wall Climb Ability", player)
 | 
				
			||||||
 | 
					                or state.has("Purified Hand of the Nun", player)
 | 
				
			||||||
 | 
					                and can_enemy_bounce(logic, enemy)
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
            and (
 | 
					            and (
 | 
				
			||||||
                state.has("D03Z03S04[NW]", player)
 | 
					                state.has("D03Z03S04[NW]", player)
 | 
				
			||||||
                or state.has("D03Z03S04[E]", player)
 | 
					                or state.has("D03Z03S04[E]", player)
 | 
				
			||||||
| 
						 | 
					@ -2280,7 +2314,12 @@ def rules(blasphemousworld):
 | 
				
			||||||
    set_rule(world.get_location("GA: Miasma room treasure", player),
 | 
					    set_rule(world.get_location("GA: Miasma room treasure", player),
 | 
				
			||||||
        lambda state: state.has("Wall Climb Ability", player))
 | 
					        lambda state: state.has("Wall Climb Ability", player))
 | 
				
			||||||
    set_rule(world.get_location("GA: Miasma room Child of Moonlight", player),
 | 
					    set_rule(world.get_location("GA: Miasma room Child of Moonlight", player),
 | 
				
			||||||
        lambda state: state.has("Wall Climb Ability", player))
 | 
					        lambda state: (
 | 
				
			||||||
 | 
					            state.has("Wall Climb Ability", player)
 | 
				
			||||||
 | 
					            or can_cross_gap(state, logic, player, 11)
 | 
				
			||||||
 | 
					            and state.has("Taranto to my Sister", player)
 | 
				
			||||||
 | 
					            and obscure_skips_allowed(logic)
 | 
				
			||||||
 | 
					        ))
 | 
				
			||||||
    # No doors
 | 
					    # No doors
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2579,8 +2618,11 @@ def rules(blasphemousworld):
 | 
				
			||||||
    # Items
 | 
					    # Items
 | 
				
			||||||
    set_rule(world.get_location("MoM: East chandelier platform", player),
 | 
					    set_rule(world.get_location("MoM: East chandelier platform", player),
 | 
				
			||||||
        lambda state: (
 | 
					        lambda state: (
 | 
				
			||||||
 | 
					            state.has("Dash Ability", player)
 | 
				
			||||||
 | 
					            and (
 | 
				
			||||||
                state.has("Blood Perpetuated in Sand", player)
 | 
					                state.has("Blood Perpetuated in Sand", player)
 | 
				
			||||||
                or can_cross_gap(state, logic, player, 3)
 | 
					                or can_cross_gap(state, logic, player, 3)
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
        ))
 | 
					        ))
 | 
				
			||||||
    # No doors
 | 
					    # No doors
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2764,14 +2806,19 @@ def rules(blasphemousworld):
 | 
				
			||||||
    # Items
 | 
					    # Items
 | 
				
			||||||
    set_rule(world.get_location("LotNW: Elevator Child of Moonlight", player),
 | 
					    set_rule(world.get_location("LotNW: Elevator Child of Moonlight", player),
 | 
				
			||||||
        lambda state: (
 | 
					        lambda state: (
 | 
				
			||||||
            state.has("Zarabanda of the Safe Haven", player)
 | 
					            state.has("Blood Perpetuated in Sand", player)
 | 
				
			||||||
            or state.has("Blood Perpetuated in Sand", player)
 | 
					 | 
				
			||||||
            and (
 | 
					            and (
 | 
				
			||||||
                can_walk_on_root(state, player)
 | 
					                can_walk_on_root(state, player)
 | 
				
			||||||
                or state.has("Purified Hand of the Nun", player)
 | 
					                or state.has("Purified Hand of the Nun", player)
 | 
				
			||||||
                or can_cross_gap(state, logic, player, 5)
 | 
					                or can_cross_gap(state, logic, player, 5)
 | 
				
			||||||
                and pillar(state, player)
 | 
					                and pillar(state, player)
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
 | 
					            or obscure_skips_allowed(logic)
 | 
				
			||||||
 | 
					            and (
 | 
				
			||||||
 | 
					                state.has("Zarabanda of the Safe Haven", player)
 | 
				
			||||||
 | 
					                or aubade(state, player)
 | 
				
			||||||
 | 
					                or state.has("Cantina of the Blue Rose", player)
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
        ))
 | 
					        ))
 | 
				
			||||||
    # Doors
 | 
					    # Doors
 | 
				
			||||||
    set_rule(world.get_entrance("D05Z01S21[-Cherubs]", player),
 | 
					    set_rule(world.get_entrance("D05Z01S21[-Cherubs]", player),
 | 
				
			||||||
| 
						 | 
					@ -3784,6 +3831,11 @@ def rules(blasphemousworld):
 | 
				
			||||||
            and (
 | 
					            and (
 | 
				
			||||||
                state.has("D09Z01S09[NW]", player)
 | 
					                state.has("D09Z01S09[NW]", player)
 | 
				
			||||||
                or state.has("D09Z01S09[Cell19]", player)
 | 
					                or state.has("D09Z01S09[Cell19]", player)
 | 
				
			||||||
 | 
					                or state.has("Purified Hand of the Nun", player)
 | 
				
			||||||
 | 
					                and (
 | 
				
			||||||
 | 
					                    can_air_stall(state, logic, player)
 | 
				
			||||||
 | 
					                    or can_dawn_jump(state, logic, player)
 | 
				
			||||||
 | 
					                )
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
        ))
 | 
					        ))
 | 
				
			||||||
    # Doors
 | 
					    # Doors
 | 
				
			||||||
| 
						 | 
					@ -3803,6 +3855,14 @@ def rules(blasphemousworld):
 | 
				
			||||||
        lambda state: (
 | 
					        lambda state: (
 | 
				
			||||||
            state.has("D09Z01S09[Cell19]", player)
 | 
					            state.has("D09Z01S09[Cell19]", player)
 | 
				
			||||||
            or state.has("Dash Ability", player)
 | 
					            or state.has("Dash Ability", player)
 | 
				
			||||||
 | 
					            and (
 | 
				
			||||||
 | 
					                state.has("D09Z01S09[Cell24]", player)
 | 
				
			||||||
 | 
					                or state.has("Purified Hand of the Nun", player)
 | 
				
			||||||
 | 
					                and (
 | 
				
			||||||
 | 
					                    can_air_stall(state, logic, player)
 | 
				
			||||||
 | 
					                    or can_dawn_jump(state, logic, player)
 | 
				
			||||||
 | 
					                )
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
        ))
 | 
					        ))
 | 
				
			||||||
    set_rule(world.get_entrance("D09Z01S09[E]", player),
 | 
					    set_rule(world.get_entrance("D09Z01S09[E]", player),
 | 
				
			||||||
        lambda state: (
 | 
					        lambda state: (
 | 
				
			||||||
| 
						 | 
					@ -3817,8 +3877,19 @@ def rules(blasphemousworld):
 | 
				
			||||||
            or state.has("D09Z01S09[Cell19]", player)
 | 
					            or state.has("D09Z01S09[Cell19]", player)
 | 
				
			||||||
        ))
 | 
					        ))
 | 
				
			||||||
    add_rule(world.get_entrance("D09Z01S09[Cell24]", player),
 | 
					    add_rule(world.get_entrance("D09Z01S09[Cell24]", player),
 | 
				
			||||||
        lambda state: state.has("Dash Ability", player))
 | 
					        lambda state: (
 | 
				
			||||||
    set_rule(world.get_entrance("D09Z01S09[Cell24]", player),
 | 
					            state.has("Dash Ability", player)
 | 
				
			||||||
 | 
					            and (
 | 
				
			||||||
 | 
					                state.has("D09Z01S09[NW]", player)
 | 
				
			||||||
 | 
					                or state.has("D09Z01S09[Cell19]", player)
 | 
				
			||||||
 | 
					                or state.has("Purified Hand of the Nun", player)
 | 
				
			||||||
 | 
					                and (
 | 
				
			||||||
 | 
					                    can_air_stall(state, logic, player)
 | 
				
			||||||
 | 
					                    or can_dawn_jump(state, logic, player)
 | 
				
			||||||
 | 
					                )
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					        ))
 | 
				
			||||||
 | 
					    set_rule(world.get_entrance("D09Z01S09[Cell19]", player),
 | 
				
			||||||
        lambda state: (
 | 
					        lambda state: (
 | 
				
			||||||
            state.has("D09Z01S09[NW]", player)
 | 
					            state.has("D09Z01S09[NW]", player)
 | 
				
			||||||
            or state.has("D09Z01S09[Cell24]", player)
 | 
					            or state.has("D09Z01S09[Cell24]", player)
 | 
				
			||||||
| 
						 | 
					@ -3827,6 +3898,14 @@ def rules(blasphemousworld):
 | 
				
			||||||
        lambda state: (
 | 
					        lambda state: (
 | 
				
			||||||
            state.has("D09Z01S09[NW]", player)
 | 
					            state.has("D09Z01S09[NW]", player)
 | 
				
			||||||
            or state.has("Dash Ability", player)
 | 
					            or state.has("Dash Ability", player)
 | 
				
			||||||
 | 
					            and (
 | 
				
			||||||
 | 
					                state.has("D09Z01S09[Cell24]", player)
 | 
				
			||||||
 | 
					                or state.has("Purified Hand of the Nun", player)
 | 
				
			||||||
 | 
					                and (
 | 
				
			||||||
 | 
					                    can_air_stall(state, logic, player)
 | 
				
			||||||
 | 
					                    or can_dawn_jump(state, logic, player)
 | 
				
			||||||
 | 
					                )
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
        ))
 | 
					        ))
 | 
				
			||||||
    set_rule(world.get_entrance("D09Z01S09[Cell20]", player),
 | 
					    set_rule(world.get_entrance("D09Z01S09[Cell20]", player),
 | 
				
			||||||
        lambda state: (
 | 
					        lambda state: (
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -52,6 +52,9 @@ class BlasphemousWorld(World):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def set_rules(self):
 | 
					    def set_rules(self):
 | 
				
			||||||
        rules(self)
 | 
					        rules(self)
 | 
				
			||||||
 | 
					        for door in door_table:
 | 
				
			||||||
 | 
					            add_rule(self.multiworld.get_location(door["Id"], self.player),
 | 
				
			||||||
 | 
					                lambda state: state.can_reach(self.get_connected_door(door["Id"])), self.player)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def create_item(self, name: str) -> "BlasphemousItem":
 | 
					    def create_item(self, name: str) -> "BlasphemousItem":
 | 
				
			||||||
| 
						 | 
					@ -301,7 +304,6 @@ class BlasphemousWorld(World):
 | 
				
			||||||
            event = BlasphemousLocation(player, door["Id"], None, region)
 | 
					            event = BlasphemousLocation(player, door["Id"], None, region)
 | 
				
			||||||
            event.show_in_spoiler = False
 | 
					            event.show_in_spoiler = False
 | 
				
			||||||
            event.place_locked_item(self.create_event(door["Id"]))
 | 
					            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)
 | 
					            region.locations.append(event)
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        victory = Location(player, "His Holiness Escribar", None, world.get_region("D07Z01S03", player))
 | 
					        victory = Location(player, "His Holiness Escribar", None, world.get_region("D07Z01S03", player))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue