105 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			105 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
from __future__ import annotations
 | 
						|
from enum import IntEnum, auto, Enum
 | 
						|
 | 
						|
 | 
						|
class Toggle(IntEnum):
 | 
						|
    off = 0
 | 
						|
    on = 1
 | 
						|
 | 
						|
    @classmethod
 | 
						|
    def from_text(cls, text: str) -> Toggle:
 | 
						|
        if text.lower() in {"off", "0", "false", "none", "null", "no"}:
 | 
						|
            return Toggle.off
 | 
						|
        else:
 | 
						|
            return Toggle.on
 | 
						|
 | 
						|
 | 
						|
class Choice(IntEnum):
 | 
						|
    @classmethod
 | 
						|
    def from_text(cls, text: str) -> Choice:
 | 
						|
        for option in cls:
 | 
						|
            if option.name == text.lower():
 | 
						|
                return option
 | 
						|
        raise KeyError(
 | 
						|
            f'Could not find option "{text}" for "{cls.__name__}", known options are {", ".join(f"{option.name}" for option in cls)}')
 | 
						|
 | 
						|
 | 
						|
class Logic(Choice):
 | 
						|
    no_glitches = auto()
 | 
						|
    no_logic = auto()
 | 
						|
 | 
						|
 | 
						|
class Goal(Choice):
 | 
						|
    ganon = auto()
 | 
						|
    fast_ganon = auto()
 | 
						|
    all_dungeons = auto()
 | 
						|
    pedestal = auto()
 | 
						|
    triforce_hunt = auto()
 | 
						|
 | 
						|
 | 
						|
class Accessibility(Choice):
 | 
						|
    locations = auto()
 | 
						|
    items = auto()
 | 
						|
    beatable = auto()
 | 
						|
 | 
						|
 | 
						|
class Crystals(Enum):
 | 
						|
    # can't use IntEnum since there's also random
 | 
						|
    C0 = 0
 | 
						|
    C1 = 1
 | 
						|
    C2 = 2
 | 
						|
    C3 = 3
 | 
						|
    C4 = 4
 | 
						|
    C5 = 5
 | 
						|
    C6 = 6
 | 
						|
    C7 = 7
 | 
						|
    Random = -1
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def from_text(text: str) -> Crystals:
 | 
						|
        for option in Crystals:
 | 
						|
            if str(option.value) == text.lower():
 | 
						|
                return option
 | 
						|
        return Crystals.Random
 | 
						|
 | 
						|
 | 
						|
class WorldState(Choice):
 | 
						|
    standard = auto()
 | 
						|
    open = auto()
 | 
						|
    retro = auto()
 | 
						|
    inverted = auto()
 | 
						|
 | 
						|
 | 
						|
class Bosses(Choice):
 | 
						|
    vanilla = auto()
 | 
						|
    simple = auto()
 | 
						|
    full = auto()
 | 
						|
    chaos = auto()
 | 
						|
 | 
						|
 | 
						|
class Enemies(Choice):
 | 
						|
    vanilla = auto()
 | 
						|
    shuffled = auto()
 | 
						|
    chaos = auto()
 | 
						|
 | 
						|
 | 
						|
mapshuffle = Toggle
 | 
						|
compassshuffle = Toggle
 | 
						|
keyshuffle = Toggle
 | 
						|
bigkeyshuffle = Toggle
 | 
						|
hints = Toggle
 | 
						|
 | 
						|
if __name__ == "__main__":
 | 
						|
    import argparse
 | 
						|
 | 
						|
    test = argparse.Namespace()
 | 
						|
    test.logic = Logic.from_text("no_logic")
 | 
						|
    test.mapshuffle = mapshuffle.from_text("ON")
 | 
						|
    try:
 | 
						|
        test.logic = Logic.from_text("owg")
 | 
						|
    except KeyError as e:
 | 
						|
        print(e)
 | 
						|
    if test.mapshuffle:
 | 
						|
        print("Mapshuffle is on")
 | 
						|
    print(test)
 |