mirror of
https://github.com/MarioSpore/Grinch-AP.git
synced 2025-10-21 12:11:33 -06:00

🤞 * map option objects to a `World.options` dict * convert RoR2 to options dict system for testing * add temp behavior for lttp with notes * copy/paste bad * convert `set_default_common_options` to a namespace property * reorganize test call order * have fill_restrictive use the new options system * update world api * update soe tests * fix world api * core: auto initialize a dataclass on the World class with the option results * core: auto initialize a dataclass on the World class with the option results: small tying improvement * add `as_dict` method to the options dataclass * fix namespace issues with tests * have current option updates use `.value` instead of changing the option * update ror2 to use the new options system again * revert the junk pool dict since it's cased differently * fix begin_with_loop typo * write new and old options to spoiler * change factorio option behavior back * fix comparisons * move common and per_game_common options to new system * core: automatically create missing options_dataclass from legacy option_definitions * remove spoiler special casing and add back the Factorio option changing but in new system * give ArchipIDLE the default options_dataclass so its options get generated and spoilered properly * reimplement `inspect.get_annotations` * move option info generation for webhost to new system * need to include Common and PerGame common since __annotations__ doesn't include super * use get_type_hints for the options dictionary * typing.get_type_hints returns the bases too. * forgot to sweep through generate * sweep through all the tests * swap to a metaclass property * move remaining usages from get_type_hints to metaclass property * move remaining usages from __annotations__ to metaclass property * move remaining usages from legacy dictionaries to metaclass property * remove legacy dictionaries * cache the metaclass property * clarify inheritance in world api * move the messenger to new options system * add an assert for my dumb * update the doc * rename o to options * missed a spot * update new messenger options * comment spacing Co-authored-by: Doug Hoskisson <beauxq@users.noreply.github.com> * fix tests * fix missing import * make the documentation definition more accurate * use options system for loc creation * type cast MessengerWorld * fix typo and use quotes for cast * LTTP: set random seed in tests * ArchipIdle: remove change here as it's default on AutoWorld * Stardew: Need to set state because `set_default_common_options` used to * The Messenger: update shop rando and helpers to new system; optimize imports * Add a kwarg to `as_dict` to do the casing for you * RoR2: use new kwarg for less code * RoR2: revert some accidental reverts * The Messenger: remove an unnecessary variable * remove TypeVar that isn't used * CommonOptions not abstract * Docs: fix mistake in options api.md Co-authored-by: Doug Hoskisson <beauxq@users.noreply.github.com> * create options for item link worlds * revert accidental doc removals * Item Links: set default options on group * change Zillion to new options dataclass * remove unused parameter to function * use TypeGuard for Literal narrowing * move dlc quest to new api * move overcooked 2 to new api * fixed some missed code in oc2 * - Tried to be compliant with 993 (WIP?) * - I think it all works now * - Removed last trace of me touching core * typo * It now passes all tests! * Improve options, fix all issues I hope * - Fixed init options * dlcquest: fix bad imports * missed a file * - Reduce code duplication * add as_dict documentation * - Use .items(), get option name more directly, fix slot data content * - Remove generic options from the slot data * improve slot data documentation * remove `CommonOptions.get_value` (#21) * better slot data description Co-authored-by: black-sliver <59490463+black-sliver@users.noreply.github.com> --------- Co-authored-by: el-u <109771707+el-u@users.noreply.github.com> Co-authored-by: Doug Hoskisson <beauxq@users.noreply.github.com> Co-authored-by: Doug Hoskisson <beauxq@yahoo.com> Co-authored-by: black-sliver <59490463+black-sliver@users.noreply.github.com> Co-authored-by: Alex Gilbert <alexgilbert@yahoo.com>
146 lines
6.2 KiB
Python
146 lines
6.2 KiB
Python
import json
|
|
import logging
|
|
import os
|
|
import typing
|
|
|
|
import yaml
|
|
from jinja2 import Template
|
|
|
|
import Options
|
|
from Utils import __version__, local_path
|
|
from worlds.AutoWorld import AutoWorldRegister
|
|
|
|
handled_in_js = {"start_inventory", "local_items", "non_local_items", "start_hints", "start_location_hints",
|
|
"exclude_locations", "priority_locations"}
|
|
|
|
|
|
def create():
|
|
target_folder = local_path("WebHostLib", "static", "generated")
|
|
yaml_folder = os.path.join(target_folder, "configs")
|
|
|
|
Options.generate_yaml_templates(yaml_folder)
|
|
|
|
def get_html_doc(option_type: type(Options.Option)) -> str:
|
|
if not option_type.__doc__:
|
|
return "Please document me!"
|
|
return "\n".join(line.strip() for line in option_type.__doc__.split("\n")).strip()
|
|
|
|
weighted_settings = {
|
|
"baseOptions": {
|
|
"description": "Generated by https://archipelago.gg/",
|
|
"name": "Player",
|
|
"game": {},
|
|
},
|
|
"games": {},
|
|
}
|
|
|
|
for game_name, world in AutoWorldRegister.world_types.items():
|
|
|
|
all_options: typing.Dict[str, Options.AssembleOptions] = world.options_dataclass.type_hints
|
|
|
|
# Generate JSON files for player-settings pages
|
|
player_settings = {
|
|
"baseOptions": {
|
|
"description": f"Generated by https://archipelago.gg/ for {game_name}",
|
|
"game": game_name,
|
|
"name": "Player",
|
|
},
|
|
}
|
|
|
|
game_options = {}
|
|
for option_name, option in all_options.items():
|
|
if option_name in handled_in_js:
|
|
pass
|
|
|
|
elif issubclass(option, Options.Choice) or issubclass(option, Options.Toggle):
|
|
game_options[option_name] = this_option = {
|
|
"type": "select",
|
|
"displayName": option.display_name if hasattr(option, "display_name") else option_name,
|
|
"description": get_html_doc(option),
|
|
"defaultValue": None,
|
|
"options": []
|
|
}
|
|
|
|
for sub_option_id, sub_option_name in option.name_lookup.items():
|
|
if sub_option_name != "random":
|
|
this_option["options"].append({
|
|
"name": option.get_option_name(sub_option_id),
|
|
"value": sub_option_name,
|
|
})
|
|
if sub_option_id == option.default:
|
|
this_option["defaultValue"] = sub_option_name
|
|
|
|
if not this_option["defaultValue"]:
|
|
this_option["defaultValue"] = "random"
|
|
|
|
elif issubclass(option, Options.Range):
|
|
game_options[option_name] = {
|
|
"type": "range",
|
|
"displayName": option.display_name if hasattr(option, "display_name") else option_name,
|
|
"description": get_html_doc(option),
|
|
"defaultValue": option.default if hasattr(
|
|
option, "default") and option.default != "random" else option.range_start,
|
|
"min": option.range_start,
|
|
"max": option.range_end,
|
|
}
|
|
|
|
if issubclass(option, Options.SpecialRange):
|
|
game_options[option_name]["type"] = 'special_range'
|
|
game_options[option_name]["value_names"] = {}
|
|
for key, val in option.special_range_names.items():
|
|
game_options[option_name]["value_names"][key] = val
|
|
|
|
elif issubclass(option, Options.ItemSet):
|
|
game_options[option_name] = {
|
|
"type": "items-list",
|
|
"displayName": option.display_name if hasattr(option, "display_name") else option_name,
|
|
"description": get_html_doc(option),
|
|
"defaultValue": list(option.default)
|
|
}
|
|
|
|
elif issubclass(option, Options.LocationSet):
|
|
game_options[option_name] = {
|
|
"type": "locations-list",
|
|
"displayName": option.display_name if hasattr(option, "display_name") else option_name,
|
|
"description": get_html_doc(option),
|
|
"defaultValue": list(option.default)
|
|
}
|
|
|
|
elif issubclass(option, Options.VerifyKeys) and not issubclass(option, Options.OptionDict):
|
|
if option.valid_keys:
|
|
game_options[option_name] = {
|
|
"type": "custom-list",
|
|
"displayName": option.display_name if hasattr(option, "display_name") else option_name,
|
|
"description": get_html_doc(option),
|
|
"options": list(option.valid_keys),
|
|
"defaultValue": list(option.default) if hasattr(option, "default") else []
|
|
}
|
|
|
|
else:
|
|
logging.debug(f"{option} not exported to Web Settings.")
|
|
|
|
player_settings["gameOptions"] = game_options
|
|
|
|
os.makedirs(os.path.join(target_folder, 'player-settings'), exist_ok=True)
|
|
|
|
with open(os.path.join(target_folder, 'player-settings', game_name + ".json"), "w") as f:
|
|
json.dump(player_settings, f, indent=2, separators=(',', ': '))
|
|
|
|
if not world.hidden and world.web.settings_page is True:
|
|
# Add the random option to Choice, TextChoice, and Toggle settings
|
|
for option in game_options.values():
|
|
if option["type"] == "select":
|
|
option["options"].append({"name": "Random", "value": "random"})
|
|
|
|
if not option["defaultValue"]:
|
|
option["defaultValue"] = "random"
|
|
|
|
weighted_settings["baseOptions"]["game"][game_name] = 0
|
|
weighted_settings["games"][game_name] = {}
|
|
weighted_settings["games"][game_name]["gameSettings"] = game_options
|
|
weighted_settings["games"][game_name]["gameItems"] = tuple(world.item_names)
|
|
weighted_settings["games"][game_name]["gameLocations"] = tuple(world.location_names)
|
|
|
|
with open(os.path.join(target_folder, 'weighted-settings.json'), "w") as f:
|
|
json.dump(weighted_settings, f, indent=2, separators=(',', ': '))
|