110 lines
3.4 KiB
Python
110 lines
3.4 KiB
Python
from __future__ import annotations
|
|
from aenum import Enum, IntEnum, extend_enum
|
|
from source.classes.BabelFish import BabelFish
|
|
import json
|
|
import os
|
|
|
|
fish = BabelFish(lang="en")
|
|
|
|
def tokenize(token):
|
|
for search,replace in (
|
|
('(', ""),
|
|
(')',""),
|
|
("'", ""),
|
|
('-'," "),
|
|
('/',""),
|
|
("\\","")
|
|
):
|
|
token = token.replace(search, replace)
|
|
tokens = token.split(" ")
|
|
i = 0
|
|
for check in tokens:
|
|
if check.lower() == check:
|
|
tokens[i] = ""
|
|
i += 1
|
|
return " ".join(tokens).replace(" ","")
|
|
|
|
class Toggle(IntEnum):
|
|
Off = 0
|
|
On = 1
|
|
|
|
@classmethod
|
|
def from_text(cls, text: str) -> Toggle:
|
|
if text.lower() in {"off", "0", "false", "none", "null"}:
|
|
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.upper():
|
|
return option
|
|
raise KeyError(
|
|
'KeyError: Could not find option "%s" for "%s", known options are %s' %
|
|
(
|
|
text,
|
|
cls.__name__,
|
|
", ".join(option.name for option in cls)
|
|
)
|
|
)
|
|
|
|
def create_choice(option_name,option_vals):
|
|
option = type(option_name,(Choice,),{})
|
|
for name in option_vals:
|
|
extend_enum(option,str(name).upper(),len(option))
|
|
return option
|
|
|
|
def load_options(filepath):
|
|
theseCompiled = {}
|
|
with open(filepath) as widgetsDefn:
|
|
filepath = filepath.split(os.sep)
|
|
domain = filepath[3]
|
|
key = filepath[4]
|
|
theseOptions = json.load(widgetsDefn)
|
|
for section in theseOptions:
|
|
widgets = theseOptions[section]
|
|
for widget in widgets:
|
|
thisWidget = widgets[widget]
|
|
if domain == "randomize":
|
|
domain = "randomizer"
|
|
if key == "entrando":
|
|
key = "entrance"
|
|
fish_key = domain + '.' + key + '.' + widget
|
|
option_name = tokenize(fish.translate("gui","gui",fish_key,"en"))
|
|
if thisWidget["type"] == "checkbox":
|
|
theseCompiled[option_name] = Toggle
|
|
elif thisWidget["type"] == "selectbox":
|
|
option_vals = thisWidget["options"]
|
|
theseCompiled[option_name] = create_choice(option_name,option_vals)
|
|
return theseCompiled
|
|
|
|
|
|
if __name__ == "__main__":
|
|
import argparse
|
|
|
|
compiledOptions = {}
|
|
notebooks = {
|
|
"randomize": [ "dungeon", "enemizer", "overworld", "entrando", "gameoptions", "generation", "item", "multiworld" ]
|
|
}
|
|
for notebook in notebooks:
|
|
for page in notebooks[notebook]:
|
|
for filename in ["keysanity","checkboxes","widgets"]:
|
|
defn = os.path.join("resources", "app", "gui", notebook, page, filename + ".json")
|
|
if os.path.isfile(defn):
|
|
compiledOptions.update(load_options(defn))
|
|
|
|
test = argparse.Namespace()
|
|
test.logic = compiledOptions["LogicLevel"].from_text("nologic")
|
|
test.mapshuffle = compiledOptions["Maps"].from_text("ON")
|
|
try:
|
|
test.logic = compiledOptions["LogicLevel"].from_text("overworldglitches")
|
|
except KeyError as e:
|
|
print(e)
|
|
if test.mapshuffle:
|
|
print("Map Shuffle is on")
|
|
print(test)
|
|
for option in compiledOptions:
|
|
print("%s: %s" % (option, list(compiledOptions[option])))
|