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