mirror of
https://github.com/MarioSpore/Grinch-AP.git
synced 2025-10-21 20:21:32 -06:00

The Colorful did not actually properly split into individual doors when progressive colorful was off. This change refactors the code that handles special cases with progressive items to make things clearer (which is important because I will be introducing another one).
100 lines
3.7 KiB
Python
100 lines
3.7 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 == "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]:
|
|
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()
|