107 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			107 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|   | from typing import Dict, List, NamedTuple, Optional, TYPE_CHECKING | ||
|  | 
 | ||
|  | from BaseClasses import Item, ItemClassification | ||
|  | from .options import ShuffleDoors | ||
|  | from .static_logic import DOORS_BY_ROOM, PROGRESSION_BY_ROOM, PROGRESSIVE_ITEMS, get_door_group_item_id, \ | ||
|  |     get_door_item_id, get_progressive_item_id, get_special_item_id | ||
|  | 
 | ||
|  | if TYPE_CHECKING: | ||
|  |     from . import LingoWorld | ||
|  | 
 | ||
|  | 
 | ||
|  | class ItemData(NamedTuple): | ||
|  |     """
 | ||
|  |     ItemData for an item in Lingo | ||
|  |     """
 | ||
|  |     code: int | ||
|  |     classification: ItemClassification | ||
|  |     mode: Optional[str] | ||
|  |     door_ids: List[str] | ||
|  |     painting_ids: List[str] | ||
|  | 
 | ||
|  |     def should_include(self, world: "LingoWorld") -> bool: | ||
|  |         if self.mode == "colors": | ||
|  |             return world.options.shuffle_colors > 0 | ||
|  |         elif self.mode == "doors": | ||
|  |             return world.options.shuffle_doors != ShuffleDoors.option_none | ||
|  |         elif self.mode == "orange tower": | ||
|  |             # door shuffle is on and tower isn't progressive | ||
|  |             return world.options.shuffle_doors != ShuffleDoors.option_none \ | ||
|  |                 and not world.options.progressive_orange_tower | ||
|  |         elif self.mode == "complex door": | ||
|  |             return world.options.shuffle_doors == ShuffleDoors.option_complex | ||
|  |         elif self.mode == "door group": | ||
|  |             return world.options.shuffle_doors == ShuffleDoors.option_simple | ||
|  |         elif self.mode == "special": | ||
|  |             return False | ||
|  |         else: | ||
|  |             return True | ||
|  | 
 | ||
|  | 
 | ||
|  | class LingoItem(Item): | ||
|  |     """
 | ||
|  |     Item from the game Lingo | ||
|  |     """
 | ||
|  |     game: str = "Lingo" | ||
|  | 
 | ||
|  | 
 | ||
|  | ALL_ITEM_TABLE: Dict[str, ItemData] = {} | ||
|  | 
 | ||
|  | 
 | ||
|  | def load_item_data(): | ||
|  |     global ALL_ITEM_TABLE | ||
|  | 
 | ||
|  |     for color in ["Black", "Red", "Blue", "Yellow", "Green", "Orange", "Gray", "Brown", "Purple"]: | ||
|  |         ALL_ITEM_TABLE[color] = ItemData(get_special_item_id(color), ItemClassification.progression, | ||
|  |                                          "colors", [], []) | ||
|  | 
 | ||
|  |     door_groups: Dict[str, List[str]] = {} | ||
|  |     for room_name, doors in DOORS_BY_ROOM.items(): | ||
|  |         for door_name, door in doors.items(): | ||
|  |             if door.skip_item is True or door.event is True: | ||
|  |                 continue | ||
|  | 
 | ||
|  |             if door.group is None: | ||
|  |                 door_mode = "doors" | ||
|  |             else: | ||
|  |                 door_mode = "complex door" | ||
|  |                 door_groups.setdefault(door.group, []).extend(door.door_ids) | ||
|  | 
 | ||
|  |             if room_name in PROGRESSION_BY_ROOM and door_name in PROGRESSION_BY_ROOM[room_name]: | ||
|  |                 if room_name == "Orange Tower": | ||
|  |                     door_mode = "orange tower" | ||
|  |                 else: | ||
|  |                     door_mode = "special" | ||
|  | 
 | ||
|  |             ALL_ITEM_TABLE[door.item_name] = \ | ||
|  |                 ItemData(get_door_item_id(room_name, door_name), | ||
|  |                          ItemClassification.filler if door.junk_item else ItemClassification.progression, door_mode, | ||
|  |                          door.door_ids, door.painting_ids) | ||
|  | 
 | ||
|  |     for group, group_door_ids in door_groups.items(): | ||
|  |         ALL_ITEM_TABLE[group] = ItemData(get_door_group_item_id(group), | ||
|  |                                          ItemClassification.progression, "door group", group_door_ids, []) | ||
|  | 
 | ||
|  |     special_items: Dict[str, ItemClassification] = { | ||
|  |         ":)":                        ItemClassification.filler, | ||
|  |         "The Feeling of Being Lost": ItemClassification.filler, | ||
|  |         "Wanderlust":                ItemClassification.filler, | ||
|  |         "Empty White Hallways":      ItemClassification.filler, | ||
|  |         "Slowness Trap":             ItemClassification.trap, | ||
|  |         "Iceland Trap":              ItemClassification.trap, | ||
|  |         "Atbash Trap":               ItemClassification.trap, | ||
|  |         "Puzzle Skip":               ItemClassification.useful, | ||
|  |     } | ||
|  | 
 | ||
|  |     for item_name, classification in special_items.items(): | ||
|  |         ALL_ITEM_TABLE[item_name] = ItemData(get_special_item_id(item_name), classification, | ||
|  |                                              "special", [], []) | ||
|  | 
 | ||
|  |     for item_name in PROGRESSIVE_ITEMS: | ||
|  |         ALL_ITEM_TABLE[item_name] = ItemData(get_progressive_item_id(item_name), | ||
|  |                                              ItemClassification.progression, "special", [], []) | ||
|  | 
 | ||
|  | 
 | ||
|  | # Initialize the item data at module scope. | ||
|  | load_item_data() |