108 lines
3.7 KiB
Python
108 lines
3.7 KiB
Python
from enum import Enum
|
|
from typing import Dict, List
|
|
|
|
class GameMode(Enum):
|
|
Normal = 0
|
|
Multiworld = 1
|
|
|
|
class Z3Logic(Enum):
|
|
Normal = 0
|
|
Nmg = 1
|
|
Owg = 2
|
|
|
|
class SMLogic(Enum):
|
|
Normal = 0
|
|
Hard = 1
|
|
|
|
class SwordLocation(Enum):
|
|
Randomized = 0
|
|
Early = 1
|
|
Uncle = 2
|
|
|
|
class MorphLocation(Enum):
|
|
Randomized = 0
|
|
Early = 1
|
|
Original = 2
|
|
|
|
class Goal(Enum):
|
|
DefeatBoth = 0
|
|
|
|
class KeyShuffle(Enum):
|
|
Null = 0
|
|
Keysanity = 1
|
|
|
|
class GanonInvincible(Enum):
|
|
Never = 0
|
|
BeforeCrystals = 1
|
|
BeforeAllDungeons = 2
|
|
Always = 3
|
|
|
|
class Config:
|
|
GameMode: GameMode = GameMode.Multiworld
|
|
Z3Logic: Z3Logic = Z3Logic.Normal
|
|
SMLogic: SMLogic = SMLogic.Normal
|
|
SwordLocation: SwordLocation= SwordLocation.Randomized
|
|
MorphLocation: MorphLocation = MorphLocation.Randomized
|
|
Goal: Goal = Goal.DefeatBoth
|
|
KeyShuffle: KeyShuffle = KeyShuffle.Null
|
|
Keysanity: bool = KeyShuffle != KeyShuffle.Null
|
|
Race: bool = False
|
|
GanonInvincible: GanonInvincible = GanonInvincible.BeforeCrystals
|
|
|
|
def __init__(self, options: Dict[str, str]):
|
|
self.GameMode = self.ParseOption(options, GameMode.Multiworld)
|
|
self.Z3Logic = self.ParseOption(options, Z3Logic.Normal)
|
|
self.SMLogic = self.ParseOption(options, SMLogic.Normal)
|
|
self.SwordLocation = self.ParseOption(options, SwordLocation.Randomized)
|
|
self.MorphLocation = self.ParseOption(options, MorphLocation.Randomized)
|
|
self.Goal = self.ParseOption(options, Goal.DefeatBoth)
|
|
self.GanonInvincible = self.ParseOption(options, GanonInvincible.BeforeCrystals)
|
|
self.KeyShuffle = self.ParseOption(options, KeyShuffle.Null)
|
|
self.Keysanity = self.KeyShuffle != KeyShuffle.Null
|
|
self.Race = self.ParseOptionWith(options, "Race", False)
|
|
|
|
def ParseOption(self, options:Dict[str, str], defaultValue:Enum):
|
|
enumKey = defaultValue.__class__.__name__.lower()
|
|
if (enumKey in options):
|
|
return defaultValue.__class__[options[enumKey]]
|
|
return defaultValue
|
|
|
|
def ParseOptionWith(self, options:Dict[str, str], option:str, defaultValue:bool):
|
|
if (option.lower() in options):
|
|
return options[option.lower()]
|
|
return defaultValue
|
|
|
|
""" public static RandomizerOption GetRandomizerOption<T>(string description, string defaultOption = "") where T : Enum {
|
|
var enumType = typeof(T);
|
|
var values = Enum.GetValues(enumType).Cast<Enum>();
|
|
|
|
return new RandomizerOption {
|
|
Key = enumType.Name.ToLower(),
|
|
Description = description,
|
|
Type = RandomizerOptionType.Dropdown,
|
|
Default = string.IsNullOrEmpty(defaultOption) ? GetDefaultValue<T>().ToLString() : defaultOption,
|
|
Values = values.ToDictionary(k => k.ToLString(), v => v.GetDescription())
|
|
};
|
|
}
|
|
|
|
public static RandomizerOption GetRandomizerOption(string name, string description, bool defaultOption = false) {
|
|
return new RandomizerOption {
|
|
Key = name.ToLower(),
|
|
Description = description,
|
|
Type = RandomizerOptionType.Checkbox,
|
|
Default = defaultOption.ToString().ToLower(),
|
|
Values = new Dictionary<string, string>()
|
|
};
|
|
}
|
|
|
|
public static TEnum GetDefaultValue<TEnum>() where TEnum : Enum {
|
|
Type t = typeof(TEnum);
|
|
var attributes = (DefaultValueAttribute[])t.GetCustomAttributes(typeof(DefaultValueAttribute), false);
|
|
if ((attributes?.Length ?? 0) > 0) {
|
|
return (TEnum)attributes.First().Value;
|
|
}
|
|
else {
|
|
return default;
|
|
}
|
|
} """
|