{% 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") }}
{{ form.share_scores_interbbs(class="form-check-input") }} {{ form.share_scores_interbbs.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 dosemu2 (sudo apt install dosemu2 on Debian/Ubuntu; on Fedora/RHEL enable RPM Fusion or a COPR providing it, then dnf install dosemu2; on Arch it's AUR-only, yay -S dosemu2; on openSUSE check the Packman repo or build from source).
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(text="Mystic Script Path (.mps/.mpx)", 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.
{{ form.working_directory.label(class="form-label") }} {{ form.working_directory(class="form-control", placeholder="/opt/mystic") }} Defaults to the script's own directory. Set this to your real Mystic BBS install directory so the script can find mystic.dat there (confirmed live: fails with "Unable to read mystic.dat" when run from outside the actual install directory).
{{ form.command_line_args.label(text="Mystic Username / Password", class="form-label") }} {{ form.command_line_args(class="form-control", placeholder="@USER@ mypassword") }} Format: USERNAME PASSWORD. Mystic requires a real, already-created local user account to run a script under — there's no anonymous mode. @USER@ in the username substitutes the real ANetBBS caller's own username, but only works if you've actually created a matching Mystic account for every caller ahead of time. For most doors, a single shared account (e.g. a dedicated anetbbs service user — fixed name, no @USER@) is simpler.
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.)
{{ form.msgbase_area_id.label(class="form-label") }} Only for doors that call real Synchronet MsgBase (e.g. Minesweeper's InterBBS DOVE-Net/FidoNet score sharing) — leave as "None" for every other door. Grouped by network — DOVE-Net's areas won't be buried among a large FidoNet arealist.
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 %}