 cc22161644
			
		
	
	cc22161644
	
	
	
		
			
			* Created panels mode door shuffle * Added some panel door item names * Remove RUNT TURN panel door Not really useful. * Fix logic with First SIX related stuff * Add group_doors to slot data * Fix LEVEL 2 behavior with panels mode * Fixed unit tests * Fixed duplicate IDs from merge * Just regenerated new IDs * Fixed duplication of color and door group items * Removed unnecessary unit test option * Fix The Seeker being achievable without entrance door * Fix The Observant being achievable without locked panels * Added some more panel doors * Added Progressive Suits Area * Lingo: Fix Basement access with THE MASTER * Added indirect conditions for MASTER-blocked entrances * Fixed Incomparable achievement access * Fix STAIRS panel logic * Fix merge error with good items * Is this clearer? * DREAD and TURN LEARN * Allow a weird edge case for reduced locations Panels mode door shuffle + grouped doors + color shuffle + pilgrimage enabled is exactly the right number of items for reduced locations. Removing color shuffle also allows for disabling pilgrimage, adding sunwarp locking, or both, with a couple of locations left over. * Prevent small sphere one on panels mode * Added shuffle_doors aliases for old options * Fixed a unit test * Updated datafile * Tweaked requirements for reduced locations * Added player name to OptionError messages * Update generated.dat
		
			
				
	
	
		
			108 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			108 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| from enum import Enum
 | |
| from typing import Dict, List, NamedTuple, Set
 | |
| 
 | |
| from BaseClasses import Item, ItemClassification
 | |
| from .static_logic import DOORS_BY_ROOM, PROGRESSIVE_ITEMS, get_door_group_item_id, get_door_item_id, \
 | |
|     get_progressive_item_id, get_special_item_id, PANEL_DOORS_BY_ROOM, get_panel_door_item_id, get_panel_group_item_id
 | |
| 
 | |
| 
 | |
| class ItemType(Enum):
 | |
|     NORMAL = 1
 | |
|     COLOR = 2
 | |
| 
 | |
| 
 | |
| class ItemData(NamedTuple):
 | |
|     """
 | |
|     ItemData for an item in Lingo
 | |
|     """
 | |
|     code: int
 | |
|     classification: ItemClassification
 | |
|     type: ItemType
 | |
|     has_doors: bool
 | |
|     painting_ids: List[str]
 | |
| 
 | |
| 
 | |
| class LingoItem(Item):
 | |
|     """
 | |
|     Item from the game Lingo
 | |
|     """
 | |
|     game: str = "Lingo"
 | |
| 
 | |
| 
 | |
| ALL_ITEM_TABLE: Dict[str, ItemData] = {}
 | |
| ITEMS_BY_GROUP: Dict[str, List[str]] = {}
 | |
| 
 | |
| TRAP_ITEMS: List[str] = ["Slowness Trap", "Iceland Trap", "Atbash Trap"]
 | |
| 
 | |
| 
 | |
| def load_item_data():
 | |
|     global ALL_ITEM_TABLE, ITEMS_BY_GROUP
 | |
| 
 | |
|     for color in ["Black", "Red", "Blue", "Yellow", "Green", "Orange", "Gray", "Brown", "Purple"]:
 | |
|         ALL_ITEM_TABLE[color] = ItemData(get_special_item_id(color), ItemClassification.progression,
 | |
|                                          ItemType.COLOR, False, [])
 | |
|         ITEMS_BY_GROUP.setdefault("Colors", []).append(color)
 | |
| 
 | |
|     door_groups: Set[str] = set()
 | |
|     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.door_group is not None:
 | |
|                 door_groups.add(door.door_group)
 | |
| 
 | |
|             ALL_ITEM_TABLE[door.item_name] = \
 | |
|                 ItemData(get_door_item_id(room_name, door_name), ItemClassification.progression, ItemType.NORMAL,
 | |
|                          door.has_doors, door.painting_ids)
 | |
|             ITEMS_BY_GROUP.setdefault("Doors", []).append(door.item_name)
 | |
| 
 | |
|             if door.item_group is not None:
 | |
|                 ITEMS_BY_GROUP.setdefault(door.item_group, []).append(door.item_name)
 | |
| 
 | |
|     for group in door_groups:
 | |
|         ALL_ITEM_TABLE[group] = ItemData(get_door_group_item_id(group),
 | |
|                                          ItemClassification.progression, ItemType.NORMAL, True, [])
 | |
|         ITEMS_BY_GROUP.setdefault("Doors", []).append(group)
 | |
| 
 | |
|     panel_groups: Set[str] = set()
 | |
|     for room_name, panel_doors in PANEL_DOORS_BY_ROOM.items():
 | |
|         for panel_door_name, panel_door in panel_doors.items():
 | |
|             if panel_door.panel_group is not None:
 | |
|                 panel_groups.add(panel_door.panel_group)
 | |
| 
 | |
|             ALL_ITEM_TABLE[panel_door.item_name] = ItemData(get_panel_door_item_id(room_name, panel_door_name),
 | |
|                                                             ItemClassification.progression, ItemType.NORMAL, False, [])
 | |
|             ITEMS_BY_GROUP.setdefault("Panels", []).append(panel_door.item_name)
 | |
| 
 | |
|     for group in panel_groups:
 | |
|         ALL_ITEM_TABLE[group] = ItemData(get_panel_group_item_id(group), ItemClassification.progression,
 | |
|                                          ItemType.NORMAL, False, [])
 | |
|         ITEMS_BY_GROUP.setdefault("Panels", []).append(group)
 | |
| 
 | |
|     special_items: Dict[str, ItemClassification] = {
 | |
|         ":)":                        ItemClassification.filler,
 | |
|         "The Feeling of Being Lost": ItemClassification.filler,
 | |
|         "Wanderlust":                ItemClassification.filler,
 | |
|         "Empty White Hallways":      ItemClassification.filler,
 | |
|         **{trap_name: ItemClassification.trap for trap_name in TRAP_ITEMS},
 | |
|         "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,
 | |
|                                              ItemType.NORMAL, False, [])
 | |
| 
 | |
|         if classification == ItemClassification.filler:
 | |
|             ITEMS_BY_GROUP.setdefault("Junk", []).append(item_name)
 | |
|         elif classification == ItemClassification.trap:
 | |
|             ITEMS_BY_GROUP.setdefault("Traps", []).append(item_name)
 | |
| 
 | |
|     for item_name in PROGRESSIVE_ITEMS:
 | |
|         ALL_ITEM_TABLE[item_name] = ItemData(get_progressive_item_id(item_name),
 | |
|                                              ItemClassification.progression, ItemType.NORMAL, False, [])
 | |
| 
 | |
| 
 | |
| # Initialize the item data at module scope.
 | |
| load_item_data()
 |