Atlas-Install/source/mkw/collection/Slot.py

103 lines
4.4 KiB
Python

from dataclasses import dataclass
from source.translation import translate as _
class SlotNotFound(Exception):
def __init__(self, slot_data: any):
super().__init__(_("CANNOT_FIND_SLOT", ' "', slot_data, '" '))
@dataclass(init=True, slots=True, frozen=True, repr=True)
class Slot:
"""
represent a game slot (arena, ...)
"""
normal: str # T11, T12, ...
abbreviation: str # LC, MMM, ...
track_name: str # beginner_course, farm_course, ...
def __str__(self) -> str: return self.normal
def __eq__(self, other) -> bool: return any(getattr(self, key) == other for key in self.__slots__)
all_slots: list[Slot] = [
Slot(normal="T11", abbreviation="LC", track_name="beginner_course"),
Slot(normal="T12", abbreviation="MMM", track_name="farm_course"),
Slot(normal="T13", abbreviation="MG", track_name="kinoko_course"),
Slot(normal="T14", abbreviation="TF", track_name="factory_course"),
Slot(normal="T21", abbreviation="MC", track_name="castle_course"),
Slot(normal="T22", abbreviation="CM", track_name="shopping_course"),
Slot(normal="T23", abbreviation="DKS", track_name="boardcross_course"),
Slot(normal="T24", abbreviation="WGM", track_name="truck_course"),
Slot(normal="T31", abbreviation="DC", track_name="senior_course"),
Slot(normal="T32", abbreviation="KC", track_name="water_course"),
Slot(normal="T33", abbreviation="MT", track_name="treehouse_course"),
Slot(normal="T34", abbreviation="GV", track_name="volcano_course"),
Slot(normal="T41", abbreviation="DDR", track_name="desert_course"),
Slot(normal="T42", abbreviation="MH", track_name="ridgehighway_course"),
Slot(normal="T43", abbreviation="BC", track_name="koopa_course"),
Slot(normal="T44", abbreviation="RR", track_name="rainbow_course"),
# retro tracks
Slot(normal="T51", abbreviation="gPB", track_name="old_peach_gc"),
Slot(normal="T52", abbreviation="dYF", track_name="old_falls_ds"),
Slot(normal="T53", abbreviation="sGV2", track_name="old_obake_sfc"),
Slot(normal="T54", abbreviation="nMR", track_name="old_mario_64"),
Slot(normal="T61", abbreviation="nSL", track_name="old_sherbet_64"),
Slot(normal="T62", abbreviation="gSGB", track_name="old_heyho_gba"),
Slot(normal="T63", abbreviation="dDS", track_name="old_town_ds"),
Slot(normal="T64", abbreviation="gWS", track_name="old_waluigi_gc"),
Slot(normal="T71", abbreviation="dDH", track_name="old_desert_ds"),
Slot(normal="T72", abbreviation="gBC3", track_name="old_koopa_gba"),
Slot(normal="T73", abbreviation="nDKJP", track_name="old_donkey_64"),
Slot(normal="T74", abbreviation="gMC", track_name="old_mario_gc"),
Slot(normal="T81", abbreviation="sMC3", track_name="old_mario_sfc"),
Slot(normal="T82", abbreviation="dPG", track_name="old_garden_ds"),
Slot(normal="T83", abbreviation="gDKM", track_name="old_donkey_gc"),
Slot(normal="T84", abbreviation="nBC", track_name="old_koopa_64"),
# wii arena
Slot(normal="A11", abbreviation="aBP", track_name="block_battle"),
Slot(normal="A12", abbreviation="aDP", track_name="venice_battle"),
Slot(normal="A13", abbreviation="aFS", track_name="skate_battle"),
Slot(normal="A14", abbreviation="aCCW", track_name="casino_battle"),
Slot(normal="A15", abbreviation="aTD", track_name="sand_battle"),
# retro arena
Slot(normal="A21", abbreviation="asBC4", track_name="old_battle4_sfc"),
Slot(normal="A22", abbreviation="agBC3", track_name="old_battle3_gba"),
Slot(normal="A23", abbreviation="anSS", track_name="old_matenro_64"),
Slot(normal="A24", abbreviation="agCL", track_name="old_CookieLand_gc"),
Slot(normal="A25", abbreviation="adTH", track_name="old_House_ds"),
]
def get(**slot_datas) -> Slot:
"""
Get a original slot object from keys and its value
:param slot_datas: dictionary of track key and their value
:return: the corresponding slot
"""
try:
return next(filter(
lambda slot: all(getattr(slot, key) == value for key, value in slot_datas.items()),
all_slots
))
except StopIteration: raise SlotNotFound(slot_datas)
def find(value) -> Slot:
"""
Return a slot from any value of any key.
:param value: the value used to search the slot
:return: the corresponding slot
"""
try: return next(filter(lambda slot: slot == value, all_slots))
except StopIteration: raise SlotNotFound(value)