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)
 | 
