{% extends "base.html" %} {% block title %}{% if game %}Edit{% else %}Add{% endif %} Game — Admin — {{ config.BBS_NAME }}{% endblock %} {% block extra_css %} {% endblock %} {% block content %}

{% if game %} Edit: {{ game.name }} {% else %} Add New Game{% endif %}

Back
{{ form.hidden_tag() }} {% if form.errors %}
Save failed — fix the errors below:
{% endif %}
General
{{ form.name.label(class="form-label") }} {{ form.name(class="form-control") }}
{{ form.slug.label(class="form-label") }} {{ form.slug(class="form-control") }} URL-safe name, e.g. "my-game"
{{ form.description.label(class="form-label") }} {{ form.description(class="form-control", rows=3) }}
{{ form.category.label(class="form-label") }} {{ form.category(class="form-control") }} Manage categories
{{ form.game_type.label(class="form-label") }} {{ form.game_type(class="form-control", id="game_type_select") }}
{{ form.icon.label(class="form-label") }} {{ form.icon(class="form-control", placeholder="bi-controller") }}
{{ form.min_access_level.label(class="form-label") }} {{ form.min_access_level(class="form-control") }} 0=all, 10=user, 50=power, 100=sysop
{{ form.max_nodes.label(class="form-label") }} {{ form.max_nodes(class="form-control") }}
{{ form.sort_order.label(class="form-label") }} {{ form.sort_order(class="form-control") }}
{{ form.is_active(class="form-check-input") }} {{ form.is_active.label(class="form-check-label") }}
{{ form.is_multiplayer(class="form-check-input") }} {{ form.is_multiplayer.label(class="form-check-label") }}
{{ form.web_enabled(class="form-check-input") }} {{ form.web_enabled.label(class="form-check-label") }}
{{ form.terminal_enabled(class="form-check-input") }} {{ form.terminal_enabled.label(class="form-check-label") }}
Web/Terminal switches only matter for games with a real, independent implementation on both front ends (currently just the Ebook Reader) — turning one off there won't affect anything else.
DOS Door Settings
{{ form.executable_path.label(class="form-label") }} {{ form.executable_path(class="form-control", placeholder="/games/LORD/LORD.EXE") }}
{{ form.working_directory.label(class="form-label") }} {{ form.working_directory(class="form-control") }}
{{ form.command_line_args.label(class="form-label") }} {{ form.command_line_args(class="form-control") }}
{{ form.drop_file_type.label(class="form-label") }} {{ form.drop_file_type(class="form-control") }}
{{ form.drop_file_path.label(class="form-label") }} {{ form.drop_file_path(class="form-control") }}
{{ form.use_dosbox(class="form-check-input") }} {{ form.use_dosbox.label(class="form-check-label") }}
dosemu2 Door Settings
{{ form.executable_path.label(class="form-label") }} {{ form.executable_path(class="form-control", placeholder="/games/TW2002/TW.EXE") }}
{{ form.working_directory.label(class="form-label") }} {{ form.working_directory(class="form-control", placeholder="/games/TW2002/") }}
{{ form.command_line_args.label(class="form-label") }} {{ form.command_line_args(class="form-control") }}
{{ form.drop_file_type.label(class="form-label") }} {{ form.drop_file_type(class="form-control") }}
{{ form.drop_file_path.label(class="form-label") }} {{ form.drop_file_path(class="form-control") }}
{{ form.needs_fossil_driver(class="form-check-input") }} {{ form.needs_fossil_driver.label(class="form-check-label") }} Only enable if this game requires a FOSSIL serial driver loaded before launch. Do NOT enable for TW2002 — dosemu2 virtual COM1 conflicts with FOSSIL drivers.
Drives inside DOS: G: = FOSSIL bundle, H: = game dir, I: = per-node temp (drop files). Set your game's drop-file path to I:\ in its config. Requires sudo apt install dosemu2.
Native Door Settings
{{ form.executable_path.label(class="form-label") }} {{ form.executable_path(class="form-control") }}
{{ form.working_directory.label(class="form-label") }} {{ form.working_directory(class="form-control") }}
{{ form.command_line_args.label(class="form-label") }} {{ form.command_line_args(class="form-control") }}
{{ form.drop_file_type.label(class="form-label") }} {{ form.drop_file_type(class="form-control") }}
{{ form.drop_file_path.label(class="form-label") }} {{ form.drop_file_path(class="form-control") }}
Mystic BBS Python Settings
{{ form.mystic_script_path.label(class="form-label") }} {{ form.mystic_script_path(class="form-control", placeholder="/games/mygame.mpy") }}
Mystic BBS Pascal Script (.mps) Settings
{{ form.mystic_script_path.label(class="form-label") }} {{ form.mystic_script_path(class="form-control", placeholder="/games/dopewars.mps") }} Requires the Mystic BBS runtime (mystic) installed on the server. Set MYSTIC_BBS_PATH env var if it is not at /usr/local/bin/mystic.
Synchronet JS Settings
{{ form.synchronet_script_path.label(class="form-label") }} {{ form.synchronet_script_path(class="form-control", placeholder="/games/galaga.js") }}
{{ form.synchronet_exec_dir.label(class="form-label") }} {{ form.synchronet_exec_dir(class="form-control", placeholder="/sbbs/exec") }} Path to Synchronet stdlib (frame.js, etc.)
In-Browser DOS Game Settings
{{ form.web_game_url.label(class="form-label") }} {{ form.web_game_url(class="form-control", placeholder="/games/dos-data/doom.zip") }} Path served by the /games/dos-data/ route, e.g. /games/dos-data/doom.zip
{{ form.command_line_args.label(class="form-label") }} {{ form.command_line_args(class="form-control", placeholder="DOOM.EXE") }} DOS executable (reference only — autoexec is in the ZIP's dosbox.conf)
Web Game Settings
{{ form.web_game_module.label(class="form-label") }} {{ form.web_game_module(class="form-control", placeholder="hangman") }} Template module name (hangman, snake, etc.)
{{ form.web_game_url.label(class="form-label") }} {{ form.web_game_url(class="form-control", placeholder="https://…") }}
A-Net Game Server (rlogin)
{{ form.executable_path(class="form-control", placeholder="game.a-net-online.lol:513", id="executable_path") }} Default rlogin port is 513.
{{ form.command_line_args(class="form-control", placeholder="@USER@ 8hf30n^! [xtrn=LORD408]", id="command_line_args") }} Three space-separated fields: USER_TEMPLATE PASSWORD [TERMINAL].
{{ form.rlogin_bbs_tag(class="form-control", placeholder="ANET", id="rlogin_bbs_tag") }} A short tag the remote server uses to namespace users by source BBS. Leave blank if the remote server doesn't use tags.
About the BBS tag. Game servers namespace inbound users by source BBS. Set your tag in the BBS Tag field above (just the letters, e.g. ANET) and the BBS builds the actual suffix for you, sending it as username-ANET (hyphen-joined, no space) — the Mystic-style convention, not Synchronet's own native ?rlogin -s-TAG client convention (which uses a space + -s- prefix and only applies BBS-to-BBS between two real Synchronet installs). It's a separate field from User-template purely so you don't have to hand-assemble a combined string. Coordinate the tag + password with the remote sysop.

Tokens in USER_TEMPLATE: @USER@ → BBS username, @ALIAS@ → display name, %U / %u → username (Mystic/Synchronet style).
TERMINAL is optional. Set to xtrn=GAMENAME (e.g., xtrn=LORD408) to drop the user straight into a specific door instead of the remote BBS's door menu. Supported door codes are listed on the server's website.

Examples for game.a-net-online.lol (BBS Tag: ANET; replace YOUR_PASS with the password the remote sysop assigned to your BBS):
  • Door menu: @USER@ YOUR_PASS
  • Direct LORD: @USER@ YOUR_PASS xtrn=LORD408
  • Direct ASSASSIN: @USER@ YOUR_PASS xtrn=ASSASSIN
  • RPG category menu: @USER@ YOUR_PASS xtrn_sec=RPG
Telnet Door Server
{{ form.executable_path(class="form-control", placeholder="twgs.example.com:23", id="executable_path_telnet") }} Default telnet port is 23.
Plain telnet, no pre-authentication — the user logs in interactively on the remote side exactly as they would connecting with any telnet client directly. This is the right type for external game servers that only offer telnet, like a TWGS (Trade Wars Game Server) instance. No user template or password needed here — Command Line Args above is unused for this door type.
{{ form.submit(class="btn btn-primary") }} Cancel
{% endblock %} {% block extra_js %} {% endblock %}