81 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			81 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|   | from enum import Flag, auto | ||
|  | from typing import Dict, List, NamedTuple | ||
|  | 
 | ||
|  | from BaseClasses import Location | ||
|  | from .static_logic import DOORS_BY_ROOM, PANELS_BY_ROOM, RoomAndPanel, get_door_location_id, get_panel_location_id | ||
|  | 
 | ||
|  | 
 | ||
|  | class LocationClassification(Flag): | ||
|  |     normal = auto() | ||
|  |     reduced = auto() | ||
|  |     insanity = auto() | ||
|  | 
 | ||
|  | 
 | ||
|  | class LocationData(NamedTuple): | ||
|  |     """
 | ||
|  |     LocationData for a location in Lingo | ||
|  |     """
 | ||
|  |     code: int | ||
|  |     room: str | ||
|  |     panels: List[RoomAndPanel] | ||
|  |     classification: LocationClassification | ||
|  | 
 | ||
|  |     def panel_ids(self): | ||
|  |         ids = set() | ||
|  |         for panel in self.panels: | ||
|  |             effective_room = self.room if panel.room is None else panel.room | ||
|  |             panel_data = PANELS_BY_ROOM[effective_room][panel.panel] | ||
|  |             ids = ids | set(panel_data.internal_ids) | ||
|  |         return ids | ||
|  | 
 | ||
|  | 
 | ||
|  | class LingoLocation(Location): | ||
|  |     """
 | ||
|  |     Location from the game Lingo | ||
|  |     """
 | ||
|  |     game: str = "Lingo" | ||
|  | 
 | ||
|  | 
 | ||
|  | ALL_LOCATION_TABLE: Dict[str, LocationData] = {} | ||
|  | 
 | ||
|  | 
 | ||
|  | def load_location_data(): | ||
|  |     global ALL_LOCATION_TABLE | ||
|  | 
 | ||
|  |     for room_name, panels in PANELS_BY_ROOM.items(): | ||
|  |         for panel_name, panel in panels.items(): | ||
|  |             location_name = f"{room_name} - {panel_name}" | ||
|  | 
 | ||
|  |             classification = LocationClassification.insanity | ||
|  |             if panel.check: | ||
|  |                 classification |= LocationClassification.normal | ||
|  | 
 | ||
|  |                 if not panel.exclude_reduce: | ||
|  |                     classification |= LocationClassification.reduced | ||
|  | 
 | ||
|  |             ALL_LOCATION_TABLE[location_name] = \ | ||
|  |                 LocationData(get_panel_location_id(room_name, panel_name), room_name, | ||
|  |                              [RoomAndPanel(None, panel_name)], classification) | ||
|  | 
 | ||
|  |     for room_name, doors in DOORS_BY_ROOM.items(): | ||
|  |         for door_name, door in doors.items(): | ||
|  |             if door.skip_location or door.event or door.panels is None: | ||
|  |                 continue | ||
|  | 
 | ||
|  |             location_name = door.location_name | ||
|  |             classification = LocationClassification.normal | ||
|  |             if door.include_reduce: | ||
|  |                 classification |= LocationClassification.reduced | ||
|  | 
 | ||
|  |             if location_name in ALL_LOCATION_TABLE: | ||
|  |                 new_id = ALL_LOCATION_TABLE[location_name].code | ||
|  |                 classification |= ALL_LOCATION_TABLE[location_name].classification | ||
|  |             else: | ||
|  |                 new_id = get_door_location_id(room_name, door_name) | ||
|  | 
 | ||
|  |             ALL_LOCATION_TABLE[location_name] = LocationData(new_id, room_name, door.panels, classification) | ||
|  | 
 | ||
|  | 
 | ||
|  | # Initialize location data on the module scope. | ||
|  | load_location_data() |