Witness: More bug fixes (#937)
* Fixed disable_non_randomized and other bugs * Slight performance & code sensibility increase * Added River Shortcut to Garden as a disabled check in disable_non_randomized * Changed no progression items exception to a warning * Added a list of disabled panels to slot_data for disable_non_randomized, so the client can automatically disable the right panels in the future * Made no progression exception conditional on playercount
This commit is contained in:
		
							parent
							
								
									a4a8894d22
								
							
						
					
					
						commit
						9553627136
					
				| 
						 | 
				
			
			@ -13,6 +13,7 @@ from .rules import set_rules
 | 
			
		|||
from .regions import WitnessRegions
 | 
			
		||||
from .Options import is_option_enabled, the_witness_options, get_option_value
 | 
			
		||||
from .utils import best_junk_to_add_based_on_weights
 | 
			
		||||
from logging import warning
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class WitnessWebWorld(WebWorld):
 | 
			
		||||
| 
						 | 
				
			
			@ -56,15 +57,20 @@ class WitnessWorld(World):
 | 
			
		|||
            'panelhex_to_id': self.locat.CHECK_PANELHEX_TO_ID,
 | 
			
		||||
            'item_id_to_door_hexes': self.items.ITEM_ID_TO_DOOR_HEX,
 | 
			
		||||
            'door_hexes': self.items.DOORS,
 | 
			
		||||
            'symbols_not_in_the_game': self.items.SYMBOLS_NOT_IN_THE_GAME
 | 
			
		||||
            'symbols_not_in_the_game': self.items.SYMBOLS_NOT_IN_THE_GAME,
 | 
			
		||||
            'disabled_panels': self.player_logic.COMPLETELY_DISABLED_CHECKS,
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    def generate_early(self):
 | 
			
		||||
        if not (is_option_enabled(self.world, self.player, "shuffle_symbols")
 | 
			
		||||
                or get_option_value(self.world, self.player, "shuffle_doors")
 | 
			
		||||
                or is_option_enabled(self.world, self.player, "shuffle_lasers")):
 | 
			
		||||
            raise Exception("This Witness world doesn't have any progression items. Please turn on Symbol Shuffle, Door"
 | 
			
		||||
                            " Shuffle or Laser Shuffle")
 | 
			
		||||
            if self.world.players == 1:
 | 
			
		||||
                warning("This Witness world doesn't have any progression items. Please turn on Symbol Shuffle, Door"
 | 
			
		||||
                        " Shuffle or Laser Shuffle if that doesn't seem right.")
 | 
			
		||||
            else:
 | 
			
		||||
                raise Exception("This Witness world doesn't have any progression items. Please turn on Symbol Shuffle,"
 | 
			
		||||
                                " Door Shuffle or Laser Shuffle.")
 | 
			
		||||
 | 
			
		||||
        self.player_logic = WitnessPlayerLogic(self.world, self.player)
 | 
			
		||||
        self.locat = WitnessPlayerLocations(self.world, self.player, self.player_logic)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -277,6 +277,8 @@ class WitnessPlayerLocations:
 | 
			
		|||
        if not is_option_enabled(world, player, "shuffle_postgame"):
 | 
			
		||||
            self.CHECK_LOCATIONS -= postgame
 | 
			
		||||
 | 
			
		||||
        self.CHECK_LOCATIONS.discard(StaticWitnessLogic.CHECKS_BY_HEX[player_logic.VICTORY_LOCATION]["checkName"])
 | 
			
		||||
 | 
			
		||||
        self.CHECK_LOCATIONS = self.CHECK_LOCATIONS - {
 | 
			
		||||
            StaticWitnessLogic.CHECKS_BY_HEX[check_hex]["checkName"]
 | 
			
		||||
            for check_hex in player_logic.COMPLETELY_DISABLED_CHECKS
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -36,6 +36,9 @@ class WitnessPlayerLogic:
 | 
			
		|||
        Panels outside of the same region will still be checked manually.
 | 
			
		||||
        """
 | 
			
		||||
 | 
			
		||||
        if panel_hex in self.COMPLETELY_DISABLED_CHECKS:
 | 
			
		||||
            return frozenset()
 | 
			
		||||
 | 
			
		||||
        check_obj = StaticWitnessLogic.CHECKS_BY_HEX[panel_hex]
 | 
			
		||||
 | 
			
		||||
        these_items = frozenset({frozenset()})
 | 
			
		||||
| 
						 | 
				
			
			@ -72,7 +75,9 @@ class WitnessPlayerLogic:
 | 
			
		|||
            for option_panel in option:
 | 
			
		||||
                dep_obj = StaticWitnessLogic.CHECKS_BY_HEX.get(option_panel)
 | 
			
		||||
 | 
			
		||||
                if option_panel in {"7 Lasers", "11 Lasers"}:
 | 
			
		||||
                if option_panel in self.COMPLETELY_DISABLED_CHECKS:
 | 
			
		||||
                    new_items = frozenset()
 | 
			
		||||
                elif option_panel in {"7 Lasers", "11 Lasers"}:
 | 
			
		||||
                    new_items = frozenset({frozenset([option_panel])})
 | 
			
		||||
                # If a panel turns on when a panel in a different region turns on,
 | 
			
		||||
                # the latter panel will be an "event panel", unless it ends up being
 | 
			
		||||
| 
						 | 
				
			
			@ -204,9 +209,11 @@ class WitnessPlayerLogic:
 | 
			
		|||
        elif get_option_value(world, player, "victory_condition") == 3:
 | 
			
		||||
            self.VICTORY_LOCATION = "0xFFF00"
 | 
			
		||||
 | 
			
		||||
        self.COMPLETELY_DISABLED_CHECKS.add(
 | 
			
		||||
            self.VICTORY_LOCATION
 | 
			
		||||
        )
 | 
			
		||||
        if get_option_value(world, player, "challenge_lasers") <= 7:
 | 
			
		||||
            adjustment_linesets_in_order.append([
 | 
			
		||||
                "Requirement Changes:",
 | 
			
		||||
                "0xFFF00 - 11 Lasers - True",
 | 
			
		||||
            ])
 | 
			
		||||
 | 
			
		||||
        if is_option_enabled(world, player, "disable_non_randomized_puzzles"):
 | 
			
		||||
            adjustment_linesets_in_order.append(get_disable_unrandomized_list())
 | 
			
		||||
| 
						 | 
				
			
			@ -356,6 +363,12 @@ class WitnessPlayerLogic:
 | 
			
		|||
            "0x2700B": "Open Door to Treehouse Laser House",
 | 
			
		||||
            "0x00055": "Orchard Apple Trees 4 Turns On",
 | 
			
		||||
            "0x17DDB": "Left Orange Bridge Fully Extended",
 | 
			
		||||
            "0x03535": "Shipwreck Video Pattern Knowledge",
 | 
			
		||||
            "0x03542": "Mountain Video Pattern Knowledge",
 | 
			
		||||
            "0x0339E": "Desert Video Pattern Knowledge",
 | 
			
		||||
            "0x03481": "Tutorial Video Pattern Knowledge",
 | 
			
		||||
            "0x03702": "Jungle Video Pattern Knowledge",
 | 
			
		||||
            "0x0356B": "Challenge Video Pattern Knowledge",
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        self.ALWAYS_EVENT_NAMES_BY_HEX = {
 | 
			
		||||
| 
						 | 
				
			
			@ -371,12 +384,6 @@ class WitnessPlayerLogic:
 | 
			
		|||
            "0x0C2B2": "Bunker Laser Activation",
 | 
			
		||||
            "0x00BF6": "Swamp Laser Activation",
 | 
			
		||||
            "0x028A4": "Treehouse Laser Activation",
 | 
			
		||||
            "0x03535": "Shipwreck Video Pattern Knowledge",
 | 
			
		||||
            "0x03542": "Mountain Video Pattern Knowledge",
 | 
			
		||||
            "0x0339E": "Desert Video Pattern Knowledge",
 | 
			
		||||
            "0x03481": "Tutorial Video Pattern Knowledge",
 | 
			
		||||
            "0x03702": "Jungle Video Pattern Knowledge",
 | 
			
		||||
            "0x0356B": "Challenge Video Pattern Knowledge",
 | 
			
		||||
            "0x09F7F": "Mountaintop Trap Door Turns On",
 | 
			
		||||
            "0x17C34": "Mountain Access",
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,15 +1,15 @@
 | 
			
		|||
Event Items:
 | 
			
		||||
Town Tower 4th Door Opens - 0x17CFB,0x3C12B,0x00B8D,0x17CF7
 | 
			
		||||
Monastery Laser Activation - 0x00A5B,0x17CE7,0x17FA9,0x17CA4
 | 
			
		||||
Monastery Laser Activation - 0x00A5B,0x17CE7,0x17FA9
 | 
			
		||||
Bunker Laser Activation - 0x00061,0x17D01,0x17C42
 | 
			
		||||
Shadows Laser Activation - 0x00021,0x17D28,0x17C71
 | 
			
		||||
 | 
			
		||||
Requirement Changes:
 | 
			
		||||
0x17C65 - 0x00A5B | 0x17CE7 | 0x17FA9 | 0x17CA4
 | 
			
		||||
0x17C65 - 0x00A5B | 0x17CE7 | 0x17FA9
 | 
			
		||||
0x0C2B2 - 0x00061 | 0x17D01 | 0x17C42
 | 
			
		||||
0x181B3 - 0x00021 | 0x17D28 | 0x17C71
 | 
			
		||||
0x28B39 - True - Reflection
 | 
			
		||||
0x17CAB - True - True
 | 
			
		||||
0x2779A - True - 0x17CFB | 0x3C12B | 0x17CF7
 | 
			
		||||
 | 
			
		||||
Disabled Locations:
 | 
			
		||||
0x03505 (Tutorial Gate Close)
 | 
			
		||||
| 
						 | 
				
			
			@ -61,7 +61,7 @@ Disabled Locations:
 | 
			
		|||
0x193AA (Monastery Branch Avoid 2)
 | 
			
		||||
0x193AB (Monastery Branch Follow 1)
 | 
			
		||||
0x193A6 (Monastery Branch Follow 2)
 | 
			
		||||
0x17CA4 (Monastery Laser) - 0x193A6 - True
 | 
			
		||||
0x17CA4 (Monastery Laser)
 | 
			
		||||
0x18590 (Tree Outlines) - True - Symmetry & Environment
 | 
			
		||||
0x28AE3 (Vines Shadows Follow) - 0x18590 - Shadows Follow & Environment
 | 
			
		||||
0x28938 (Four-way Apple Tree) - 0x28AE3 - Environment
 | 
			
		||||
| 
						 | 
				
			
			@ -104,3 +104,5 @@ Disabled Locations:
 | 
			
		|||
0x09DE0 (Bunker Laser)
 | 
			
		||||
0x0A079 (Bunker Elevator Control)
 | 
			
		||||
0x0042D (Mountaintop River Shape)
 | 
			
		||||
 | 
			
		||||
0x17CAA (River Door to Garden Panel)
 | 
			
		||||
		Loading…
	
		Reference in New Issue