Archipelago/worlds/lingo/locations.py

82 lines
2.6 KiB
Python

from enum import Flag, auto
from typing import Dict, List, NamedTuple
from BaseClasses import Location
from .datatypes import RoomAndPanel
from .static_logic import DOORS_BY_ROOM, PANELS_BY_ROOM, get_door_location_id, get_panel_location_id
class LocationClassification(Flag):
normal = auto()
reduced = auto()
insanity = auto()
small_sphere_one = auto()
class LocationData(NamedTuple):
"""
LocationData for a location in Lingo
"""
code: int
room: str
panels: List[RoomAndPanel]
classification: LocationClassification
class LingoLocation(Location):
"""
Location from the game Lingo
"""
game: str = "Lingo"
ALL_LOCATION_TABLE: Dict[str, LocationData] = {}
LOCATIONS_BY_GROUP: Dict[str, List[str]] = {}
def load_location_data():
global ALL_LOCATION_TABLE, LOCATIONS_BY_GROUP
for room_name, panels in PANELS_BY_ROOM.items():
for panel_name, panel in panels.items():
location_name = f"{room_name} - {panel_name}" if panel.location_name is None else panel.location_name
classification = LocationClassification.insanity
if panel.check:
classification |= LocationClassification.normal
if not panel.exclude_reduce:
classification |= LocationClassification.reduced
if room_name == "Starting Room":
classification |= LocationClassification.small_sphere_one
ALL_LOCATION_TABLE[location_name] = \
LocationData(get_panel_location_id(room_name, panel_name), room_name,
[RoomAndPanel(None, panel_name)], classification)
if panel.achievement:
LOCATIONS_BY_GROUP.setdefault("Achievements", []).append(location_name)
for room_name, doors in DOORS_BY_ROOM.items():
for door_name, door in doors.items():
if door.skip_location or door.event or not door.panels:
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()