Add options to generate page (#450)
* Add Item cheat permission to generate page. * Indicate that both remaining_mode and item cheat are disabled in race mode. * Add server_password * refine tooltips and help for server_password and !admin command. * Add Plando options to generation page. * Remove debugging code * Style adjustments and HTML formatting and tag fixes with the goal of making the page nicer looking and not as vertical. Co-authored-by: Chris Wilson <chris@legendserver.info>
This commit is contained in:
parent
ea51df432d
commit
517e72f442
|
@ -1060,7 +1060,10 @@ class ClientMessageProcessor(CommonCommandProcessor):
|
||||||
|
|
||||||
@mark_raw
|
@mark_raw
|
||||||
def _cmd_admin(self, command: str = ""):
|
def _cmd_admin(self, command: str = ""):
|
||||||
"""Allow remote administration of the multiworld server"""
|
"""Allow remote administration of the multiworld server
|
||||||
|
Usage: "!admin login <password>" in order to log in to the remote interface.
|
||||||
|
Once logged in, you can then use "!admin <command>" to issue commands.
|
||||||
|
If you need further help once logged in. use "!admin /help" """
|
||||||
|
|
||||||
output = f"!admin {command}"
|
output = f"!admin {command}"
|
||||||
if output.lower().startswith(
|
if output.lower().startswith(
|
||||||
|
|
|
@ -45,7 +45,7 @@ def generate_api():
|
||||||
"detail": app.config["MAX_ROLL"]}, 409
|
"detail": app.config["MAX_ROLL"]}, 409
|
||||||
meta = get_meta(meta_options_source)
|
meta = get_meta(meta_options_source)
|
||||||
meta["race"] = race
|
meta["race"] = race
|
||||||
results, gen_options = roll_options(options)
|
results, gen_options = roll_options(options, meta["plando_options"])
|
||||||
if any(type(result) == str for result in results.values()):
|
if any(type(result) == str for result in results.values()):
|
||||||
return {"text": str(results),
|
return {"text": str(results),
|
||||||
"detail": results}, 400
|
"detail": results}, 400
|
||||||
|
|
|
@ -62,7 +62,7 @@ def get_yaml_data(file) -> Union[Dict[str, str], str]:
|
||||||
return options
|
return options
|
||||||
|
|
||||||
|
|
||||||
def roll_options(options: Dict[str, Union[dict, str]]) -> Tuple[Dict[str, Union[str, bool]], Dict[str, dict]]:
|
def roll_options(options: Dict[str, Union[dict, str]], plando_options: set = {"bosses", "items", "connections", "texts"}) -> Tuple[Dict[str, Union[str, bool]], Dict[str, dict]]:
|
||||||
results = {}
|
results = {}
|
||||||
rolled_results = {}
|
rolled_results = {}
|
||||||
for filename, text in options.items():
|
for filename, text in options.items():
|
||||||
|
@ -77,11 +77,11 @@ def roll_options(options: Dict[str, Union[dict, str]]) -> Tuple[Dict[str, Union[
|
||||||
try:
|
try:
|
||||||
if len(yaml_datas) == 1:
|
if len(yaml_datas) == 1:
|
||||||
rolled_results[filename] = roll_settings(yaml_datas[0],
|
rolled_results[filename] = roll_settings(yaml_datas[0],
|
||||||
plando_options={"bosses", "items", "connections", "texts"})
|
plando_options=plando_options)
|
||||||
else:
|
else:
|
||||||
for i, yaml_data in enumerate(yaml_datas):
|
for i, yaml_data in enumerate(yaml_datas):
|
||||||
rolled_results[f"{filename}/{i + 1}"] = roll_settings(yaml_data,
|
rolled_results[f"{filename}/{i + 1}"] = roll_settings(yaml_data,
|
||||||
plando_options={"bosses", "items", "connections", "texts"})
|
plando_options=plando_options)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
results[filename] = f"Failed to generate mystery in {filename}: {e}"
|
results[filename] = f"Failed to generate mystery in {filename}: {e}"
|
||||||
else:
|
else:
|
||||||
|
|
|
@ -22,11 +22,22 @@ from .upload import upload_zip_to_db
|
||||||
|
|
||||||
|
|
||||||
def get_meta(options_source: dict) -> dict:
|
def get_meta(options_source: dict) -> dict:
|
||||||
|
plando_options = {
|
||||||
|
options_source.get("plando_bosses", ""),
|
||||||
|
options_source.get("plando_items", ""),
|
||||||
|
options_source.get("plando_connections", ""),
|
||||||
|
options_source.get("plando_texts", "")
|
||||||
|
}
|
||||||
|
plando_options -= {""}
|
||||||
|
|
||||||
meta = {
|
meta = {
|
||||||
"hint_cost": int(options_source.get("hint_cost", 10)),
|
"hint_cost": int(options_source.get("hint_cost", 10)),
|
||||||
"forfeit_mode": options_source.get("forfeit_mode", "goal"),
|
"forfeit_mode": options_source.get("forfeit_mode", "goal"),
|
||||||
"remaining_mode": options_source.get("remaining_mode", "disabled"),
|
"remaining_mode": options_source.get("remaining_mode", "disabled"),
|
||||||
"collect_mode": options_source.get("collect_mode", "disabled"),
|
"collect_mode": options_source.get("collect_mode", "disabled"),
|
||||||
|
"item_cheat": bool(int(options_source.get("item_cheat", 1))),
|
||||||
|
"server_password": options_source.get("server_password", None),
|
||||||
|
"plando_options": plando_options
|
||||||
}
|
}
|
||||||
return meta
|
return meta
|
||||||
|
|
||||||
|
@ -44,10 +55,9 @@ def generate(race=False):
|
||||||
if type(options) == str:
|
if type(options) == str:
|
||||||
flash(options)
|
flash(options)
|
||||||
else:
|
else:
|
||||||
results, gen_options = roll_options(options)
|
|
||||||
# get form data -> server settings
|
|
||||||
meta = get_meta(request.form)
|
meta = get_meta(request.form)
|
||||||
meta["race"] = race
|
meta["race"] = race
|
||||||
|
results, gen_options = roll_options(options, meta["plando_options"])
|
||||||
|
|
||||||
if race:
|
if race:
|
||||||
meta["item_cheat"] = False
|
meta["item_cheat"] = False
|
||||||
|
@ -89,6 +99,8 @@ def gen_game(gen_options, meta: TypeOptional[Dict[str, object]] = None, owner=No
|
||||||
meta.setdefault("hint_cost", 10)
|
meta.setdefault("hint_cost", 10)
|
||||||
race = meta.get("race", False)
|
race = meta.get("race", False)
|
||||||
del (meta["race"])
|
del (meta["race"])
|
||||||
|
plando_options = meta.get("plando", {"bosses", "items", "connections", "texts"})
|
||||||
|
del (meta["plando_options"])
|
||||||
try:
|
try:
|
||||||
target = tempfile.TemporaryDirectory()
|
target = tempfile.TemporaryDirectory()
|
||||||
playercount = len(gen_options)
|
playercount = len(gen_options)
|
||||||
|
@ -108,6 +120,7 @@ def gen_game(gen_options, meta: TypeOptional[Dict[str, object]] = None, owner=No
|
||||||
erargs.outputname = seedname
|
erargs.outputname = seedname
|
||||||
erargs.outputpath = target.name
|
erargs.outputpath = target.name
|
||||||
erargs.teams = 1
|
erargs.teams = 1
|
||||||
|
erargs.plando_options = ", ".join(plando_options)
|
||||||
|
|
||||||
name_counter = Counter()
|
name_counter = Counter()
|
||||||
for player, (playerfile, settings) in enumerate(gen_options.items(), 1):
|
for player, (playerfile, settings) in enumerate(gen_options.items(), 1):
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
#generate-game{
|
#generate-game{
|
||||||
width: 700px;
|
width: 990px;
|
||||||
min-height: 360px;
|
min-height: 360px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
@ -25,9 +25,26 @@
|
||||||
margin-bottom: 1rem;
|
margin-bottom: 1rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#generate-game-tables-container{
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
justify-content: space-around;
|
||||||
|
}
|
||||||
|
|
||||||
|
.table-wrapper select {
|
||||||
|
width: 200px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.table-wrapper input:not([type]){
|
||||||
|
width: 200px;
|
||||||
|
}
|
||||||
|
|
||||||
#generate-game-form-wrapper table td{
|
#generate-game-form-wrapper table td{
|
||||||
text-align: left;
|
text-align: left;
|
||||||
padding-right: 0.5rem;
|
padding-right: 0.5rem;
|
||||||
|
vertical-align: top;
|
||||||
|
width: 230px;
|
||||||
}
|
}
|
||||||
|
|
||||||
#generate-form-button-row{
|
#generate-form-button-row{
|
||||||
|
|
|
@ -35,86 +35,153 @@
|
||||||
</p>
|
</p>
|
||||||
<div id="generate-game-form-wrapper">
|
<div id="generate-game-form-wrapper">
|
||||||
<form id="generate-game-form" method="post" enctype="multipart/form-data">
|
<form id="generate-game-form" method="post" enctype="multipart/form-data">
|
||||||
<table>
|
<div id="generate-game-tables-container">
|
||||||
<tbody>
|
<div class="table-wrapper">
|
||||||
<tr>
|
<table>
|
||||||
<td>
|
<tbody>
|
||||||
<label for="forfeit_mode">Forfeit Permission:</label>
|
<tr>
|
||||||
<span
|
<td>
|
||||||
class="interactive"
|
<label for="forfeit_mode">Forfeit Permission:</label>
|
||||||
data-tooltip="A forfeit releases all remaining items from the locations
|
<span
|
||||||
in your world.">(?)
|
class="interactive"
|
||||||
</span>
|
data-tooltip="A forfeit releases all remaining items from the locations
|
||||||
</td>
|
in your world.">(?)
|
||||||
<td>
|
</span>
|
||||||
<select name="forfeit_mode" id="forfeit_mode">
|
</td>
|
||||||
<option value="auto">Automatic on goal completion</option>
|
<td>
|
||||||
<option value="goal">Allow !forfeit after goal completion</option>
|
<select name="forfeit_mode" id="forfeit_mode">
|
||||||
<option value="auto-enabled">Automatic on goal completion and manual !forfeit</option>
|
<option value="auto">Automatic on goal completion</option>
|
||||||
<option value="enabled">Manual !forfeit</option>
|
<option value="goal">Allow !forfeit after goal completion</option>
|
||||||
<option value="disabled">Disabled</option>
|
<option value="auto-enabled">
|
||||||
</select>
|
Automatic on goal completion and manual !forfeit
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
<tr>
|
|
||||||
<td>
|
|
||||||
<label for="collect_mode">Collect Permission:</label>
|
|
||||||
<span
|
|
||||||
class="interactive"
|
|
||||||
data-tooltip="A collect releases all of your remaining items to you
|
|
||||||
from across the multiworld.">(?)
|
|
||||||
</span>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<select name="collect_mode" id="collect_mode">
|
|
||||||
<option value="goal">Allow !collect after goal completion</option>
|
|
||||||
<option value="auto">Automatic on goal completion</option>
|
|
||||||
<option value="auto-enabled">Automatic on goal completion and manual !collect</option>
|
|
||||||
<option value="enabled">Manual !collect</option>
|
|
||||||
<option value="disabled">Disabled</option>
|
|
||||||
</select>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
<tr>
|
|
||||||
<td>
|
|
||||||
<label for="remaining_mode">Remaining Permission:</label>
|
|
||||||
<span
|
|
||||||
class="interactive"
|
|
||||||
data-tooltip="Remaining lists all items still in your world by name only.">(?)
|
|
||||||
</span>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<select name="remaining_mode" id="remaining_mode">
|
|
||||||
<option value="disabled">Disabled</option>
|
|
||||||
<option value="goal">Allow !remaining after goal completion</option>
|
|
||||||
<option value="enabled">Manual !remaining</option>
|
|
||||||
</select>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
<tr>
|
|
||||||
<td>
|
|
||||||
<label for="hint_cost"> Hint Cost:</label>
|
|
||||||
<span
|
|
||||||
class="interactive"
|
|
||||||
data-tooltip="After gathering this many checks, players can !hint <itemname>
|
|
||||||
to get the location of that hint item.">(?)
|
|
||||||
</span>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<select name="hint_cost" id="hint_cost">
|
|
||||||
{% for n in range(0, 110, 5) %}
|
|
||||||
<option {% if n == 10 %}selected="selected" {% endif %} value="{{ n }}">
|
|
||||||
{% if n > 100 %}Off{% else %}{{ n }}%{% endif %}
|
|
||||||
</option>
|
</option>
|
||||||
{% endfor %}
|
<option value="enabled">Manual !forfeit</option>
|
||||||
</select>
|
<option value="disabled">Disabled</option>
|
||||||
</td>
|
</select>
|
||||||
</tr>
|
</td>
|
||||||
</tbody>
|
</tr>
|
||||||
</table>
|
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<label for="collect_mode">Collect Permission:</label>
|
||||||
|
<span
|
||||||
|
class="interactive"
|
||||||
|
data-tooltip="A collect releases all of your remaining items to you
|
||||||
|
from across the multiworld.">(?)
|
||||||
|
</span>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<select name="collect_mode" id="collect_mode">
|
||||||
|
<option value="goal">Allow !collect after goal completion</option>
|
||||||
|
<option value="auto">Automatic on goal completion</option>
|
||||||
|
<option value="auto-enabled">
|
||||||
|
Automatic on goal completion and manual !collect
|
||||||
|
</option>
|
||||||
|
<option value="enabled">Manual !collect</option>
|
||||||
|
<option value="disabled">Disabled</option>
|
||||||
|
</select>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<label for="remaining_mode">Remaining Permission:</label>
|
||||||
|
<span
|
||||||
|
class="interactive"
|
||||||
|
data-tooltip="Remaining lists all items still in your world by name only."
|
||||||
|
>(?)
|
||||||
|
</span>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<select name="remaining_mode" id="remaining_mode">
|
||||||
|
{% if race -%}
|
||||||
|
<option value="disabled">Disabled in Race mode</option>
|
||||||
|
{%- else -%}
|
||||||
|
<option value="disabled">Disabled</option>
|
||||||
|
<option value="goal">Allow !remaining after goal completion</option>
|
||||||
|
<option value="enabled">Manual !remaining</option>
|
||||||
|
{%- endif -%}
|
||||||
|
</select>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<label for="item_cheat">Item Cheat:</label>
|
||||||
|
<span
|
||||||
|
class="interactive"
|
||||||
|
data-tooltip="Allows players to use the !getitem command.">(?)
|
||||||
|
</span>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<select name="item_cheat" id="item_cheat">
|
||||||
|
{% if race -%}
|
||||||
|
<option value="0">Disabled in Race mode</option>
|
||||||
|
{%- else -%}
|
||||||
|
<option value="1">Enabled</option>
|
||||||
|
<option value="0">Disabled</option>
|
||||||
|
{%- endif -%}
|
||||||
|
</select>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<div class="table-wrapper">
|
||||||
|
<table>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<label for="hint_cost"> Hint Cost:</label>
|
||||||
|
<span
|
||||||
|
class="interactive"
|
||||||
|
data-tooltip="After gathering this many checks, players can !hint <itemname>
|
||||||
|
to get the location of that hint item.">(?)
|
||||||
|
</span>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<select name="hint_cost" id="hint_cost">
|
||||||
|
{% for n in range(0, 110, 5) %}
|
||||||
|
<option {% if n == 10 %}selected="selected" {% endif %} value="{{ n }}">
|
||||||
|
{% if n > 100 %}Off{% else %}{{ n }}%{% endif %}
|
||||||
|
</option>
|
||||||
|
{% endfor %}
|
||||||
|
</select>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<label for="server_password">Server Password:</label>
|
||||||
|
<span
|
||||||
|
class="interactive"
|
||||||
|
data-tooltip="Allows for issuing of server console commands from any text client or in-game client using the !admin command.">(?)
|
||||||
|
</span>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<input id="server_password" name="server_password">
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<label for="plando_options">Plando Options:</label>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<input type="checkbox" name="plando_bosses" value="bosses" checked>
|
||||||
|
<label for="plando_bosses">Bosses</label><br>
|
||||||
|
|
||||||
|
<input type="checkbox" name="plando_items" value="items" checked>
|
||||||
|
<label for="plando_items">Items</label><br>
|
||||||
|
|
||||||
|
<input type="checkbox" name="plando_connections" value="connections" checked>
|
||||||
|
<label for="plando_connections">Connections</label><br>
|
||||||
|
|
||||||
|
<input type="checkbox" name="plando_texts" value="texts" checked>
|
||||||
|
<label for="plando_texts">Text</label>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<div id="generate-form-button-row">
|
<div id="generate-form-button-row">
|
||||||
<input id="file-input" type="file" name="file">
|
<input id="file-input" type="file" name="file">
|
||||||
</div>
|
</div>
|
||||||
|
|
Loading…
Reference in New Issue