219 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			219 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			Python
		
	
	
	
from ..test import WitnessTestBase
 | 
						|
 | 
						|
 | 
						|
class TestSymbolsRequiredToWinElevatorNormal(WitnessTestBase):
 | 
						|
    options = {
 | 
						|
        "shuffle_lasers": True,
 | 
						|
        "puzzle_randomization": "sigma_normal",
 | 
						|
        "mountain_lasers": 1,
 | 
						|
        "victory_condition": "elevator",
 | 
						|
        "early_symbol_item": False,
 | 
						|
    }
 | 
						|
 | 
						|
    def test_symbols_to_win(self) -> None:
 | 
						|
        """
 | 
						|
        In symbol shuffle, the only way to reach the Elevator is through Mountain Entry by descending the Mountain.
 | 
						|
        This requires a very specific set of symbol items per puzzle randomization mode.
 | 
						|
        In this case, we check Sigma Normal Puzzles.
 | 
						|
        """
 | 
						|
 | 
						|
        exact_requirement = {
 | 
						|
            "Monastery Laser": 1,
 | 
						|
            "Progressive Dots": 2,
 | 
						|
            "Progressive Stars": 2,
 | 
						|
            "Progressive Symmetry": 2,
 | 
						|
            "Black/White Squares": 1,
 | 
						|
            "Colored Squares": 1,
 | 
						|
            "Shapers": 1,
 | 
						|
            "Rotated Shapers": 1,
 | 
						|
            "Eraser": 1,
 | 
						|
        }
 | 
						|
 | 
						|
        self.assert_can_beat_with_minimally(exact_requirement)
 | 
						|
 | 
						|
 | 
						|
class TestSymbolsRequiredToWinElevatorExpert(WitnessTestBase):
 | 
						|
    options = {
 | 
						|
        "shuffle_lasers": True,
 | 
						|
        "mountain_lasers": 1,
 | 
						|
        "victory_condition": "elevator",
 | 
						|
        "early_symbol_item": False,
 | 
						|
        "puzzle_randomization": "sigma_expert",
 | 
						|
    }
 | 
						|
 | 
						|
    def test_symbols_to_win(self) -> None:
 | 
						|
        """
 | 
						|
        In symbol shuffle, the only way to reach the Elevator is through Mountain Entry by descending the Mountain.
 | 
						|
        This requires a very specific set of symbol items per puzzle randomization mode.
 | 
						|
        In this case, we check Sigma Expert Puzzles.
 | 
						|
        """
 | 
						|
 | 
						|
        exact_requirement = {
 | 
						|
            "Monastery Laser": 1,
 | 
						|
            "Progressive Dots": 2,
 | 
						|
            "Progressive Stars": 2,
 | 
						|
            "Progressive Symmetry": 2,
 | 
						|
            "Black/White Squares": 1,
 | 
						|
            "Colored Squares": 1,
 | 
						|
            "Shapers": 1,
 | 
						|
            "Rotated Shapers": 1,
 | 
						|
            "Negative Shapers": 1,
 | 
						|
            "Eraser": 1,
 | 
						|
            "Triangles": 1,
 | 
						|
        }
 | 
						|
 | 
						|
        self.assert_can_beat_with_minimally(exact_requirement)
 | 
						|
 | 
						|
 | 
						|
class TestSymbolsRequiredToWinElevatorVanilla(WitnessTestBase):
 | 
						|
    options = {
 | 
						|
        "shuffle_lasers": True,
 | 
						|
        "mountain_lasers": 1,
 | 
						|
        "victory_condition": "elevator",
 | 
						|
        "early_symbol_item": False,
 | 
						|
        "puzzle_randomization": "none",
 | 
						|
    }
 | 
						|
 | 
						|
    def test_symbols_to_win(self) -> None:
 | 
						|
        """
 | 
						|
        In symbol shuffle, the only way to reach the Elevator is through Mountain Entry by descending the Mountain.
 | 
						|
        This requires a very specific set of symbol items per puzzle randomization mode.
 | 
						|
        In this case, we check Vanilla Puzzles.
 | 
						|
        """
 | 
						|
 | 
						|
        exact_requirement = {
 | 
						|
            "Monastery Laser": 1,
 | 
						|
            "Progressive Dots": 2,
 | 
						|
            "Progressive Stars": 2,
 | 
						|
            "Progressive Symmetry": 1,
 | 
						|
            "Black/White Squares": 1,
 | 
						|
            "Colored Squares": 1,
 | 
						|
            "Shapers": 1,
 | 
						|
            "Rotated Shapers": 1,
 | 
						|
            "Eraser": 1,
 | 
						|
        }
 | 
						|
 | 
						|
        self.assert_can_beat_with_minimally(exact_requirement)
 | 
						|
 | 
						|
 | 
						|
class TestSymbolsRequiredToWinElevatorVariety(WitnessTestBase):
 | 
						|
    options = {
 | 
						|
        "shuffle_lasers": True,
 | 
						|
        "mountain_lasers": 1,
 | 
						|
        "victory_condition": "elevator",
 | 
						|
        "early_symbol_item": False,
 | 
						|
        "puzzle_randomization": "umbra_variety",
 | 
						|
    }
 | 
						|
 | 
						|
    def test_symbols_to_win(self) -> None:
 | 
						|
        """
 | 
						|
        In symbol shuffle, the only way to reach the Elevator is through Mountain Entry by descending the Mountain.
 | 
						|
        This requires a very specific set of symbol items per puzzle randomization mode.
 | 
						|
        In this case, we check Variety Puzzles.
 | 
						|
        """
 | 
						|
 | 
						|
        exact_requirement = {
 | 
						|
            "Monastery Laser": 1,
 | 
						|
            "Progressive Dots": 2,
 | 
						|
            "Progressive Stars": 2,
 | 
						|
            "Progressive Symmetry": 1,
 | 
						|
            "Black/White Squares": 1,
 | 
						|
            "Colored Squares": 1,
 | 
						|
            "Shapers": 1,
 | 
						|
            "Rotated Shapers": 1,
 | 
						|
            "Eraser": 1,
 | 
						|
            "Triangles": 1,
 | 
						|
            "Arrows": 1,
 | 
						|
        }
 | 
						|
 | 
						|
        self.assert_can_beat_with_minimally(exact_requirement)
 | 
						|
 | 
						|
 | 
						|
class TestPanelsRequiredToWinElevator(WitnessTestBase):
 | 
						|
    options = {
 | 
						|
        "shuffle_lasers": True,
 | 
						|
        "mountain_lasers": 1,
 | 
						|
        "victory_condition": "elevator",
 | 
						|
        "early_symbol_item": False,
 | 
						|
        "shuffle_symbols": False,
 | 
						|
        "shuffle_doors": "panels",
 | 
						|
        "door_groupings": "off",
 | 
						|
    }
 | 
						|
 | 
						|
    def test_panels_to_win(self) -> None:
 | 
						|
        """
 | 
						|
        In door panel shuffle , the only way to reach the Elevator is through Mountain Entry by descending the Mountain.
 | 
						|
        This requires some control panels for each of the Mountain Floors.
 | 
						|
        """
 | 
						|
 | 
						|
        exact_requirement = {
 | 
						|
            "Desert Laser": 1,
 | 
						|
            "Town Desert Laser Redirect Control (Panel)": 1,
 | 
						|
            "Mountain Floor 1 Light Bridge (Panel)": 1,
 | 
						|
            "Mountain Floor 2 Light Bridge Near (Panel)": 1,
 | 
						|
            "Mountain Floor 2 Light Bridge Far (Panel)": 1,
 | 
						|
            "Mountain Floor 2 Elevator Control (Panel)": 1,
 | 
						|
        }
 | 
						|
 | 
						|
        self.assert_can_beat_with_minimally(exact_requirement)
 | 
						|
 | 
						|
 | 
						|
class TestDoorsRequiredToWinElevator(WitnessTestBase):
 | 
						|
    options = {
 | 
						|
        "shuffle_lasers": True,
 | 
						|
        "mountain_lasers": 1,
 | 
						|
        "victory_condition": "elevator",
 | 
						|
        "early_symbol_item": False,
 | 
						|
        "shuffle_symbols": False,
 | 
						|
        "shuffle_doors": "doors",
 | 
						|
        "door_groupings": "off",
 | 
						|
    }
 | 
						|
 | 
						|
    def test_doors_to_elevator_paths(self) -> None:
 | 
						|
        """
 | 
						|
        In remote door shuffle, there are three ways to win.
 | 
						|
 | 
						|
        - Through the normal route (Mountain Entry -> Descend through Mountain -> Reach Bottom Floor)
 | 
						|
        - Through the Caves using the Caves Shortcuts (Caves -> Reach Bottom Floor)
 | 
						|
        - Through the Caves via Challenge (Tunnels -> Challenge -> Caves -> Reach Bottom Floor)
 | 
						|
        """
 | 
						|
 | 
						|
        with self.subTest("Test Elevator victory in shuffle_doors through Mountain Entry."):
 | 
						|
            exact_requirement = {
 | 
						|
                "Monastery Laser": 1,
 | 
						|
                "Mountain Floor 1 Exit (Door)": 1,
 | 
						|
                "Mountain Floor 2 Staircase Near (Door)": 1,
 | 
						|
                "Mountain Floor 2 Staircase Far (Door)": 1,
 | 
						|
                "Mountain Floor 2 Exit (Door)": 1,
 | 
						|
                "Mountain Bottom Floor Giant Puzzle Exit (Door)": 1,
 | 
						|
                "Mountain Bottom Floor Pillars Room Entry (Door)": 1,
 | 
						|
            }
 | 
						|
 | 
						|
            self.assert_can_beat_with_minimally(exact_requirement)
 | 
						|
 | 
						|
        with self.subTest("Test Elevator victory in shuffle_doors through Caves Shortcuts."):
 | 
						|
            exact_requirement = {
 | 
						|
                "Monastery Laser": 1,  # Elevator Panel itself has a laser lock
 | 
						|
                "Caves Mountain Shortcut (Door)": 1,
 | 
						|
                "Caves Entry (Door)": 1,
 | 
						|
                "Mountain Bottom Floor Rock (Door)": 1,
 | 
						|
                "Mountain Bottom Floor Pillars Room Entry (Door)": 1,
 | 
						|
            }
 | 
						|
 | 
						|
            self.assert_can_beat_with_minimally(exact_requirement)
 | 
						|
 | 
						|
        with self.subTest("Test Elevator victory in shuffle_doors through Tunnels->Challenge->Caves."):
 | 
						|
            exact_requirement = {
 | 
						|
                "Monastery Laser": 1,  # Elevator Panel itself has a laser lock
 | 
						|
                "Windmill Entry (Door)": 1,
 | 
						|
                "Tunnels Theater Shortcut (Door)": 1,
 | 
						|
                "Tunnels Entry (Door)": 1,
 | 
						|
                "Challenge Entry (Door)": 1,
 | 
						|
                "Caves Pillar Door": 1,
 | 
						|
                "Caves Entry (Door)": 1,
 | 
						|
                "Mountain Bottom Floor Rock (Door)": 1,
 | 
						|
                "Mountain Bottom Floor Pillars Room Entry (Door)": 1,
 | 
						|
            }
 | 
						|
 | 
						|
            self.assert_can_beat_with_minimally(exact_requirement)
 |