Sil-Q terminal interface

Retrieve at least one Silmaril from Morgoth's crown and escape Angband carrying it. Each trial starts a fresh normal game. You can choose any race, house, stats, skills, and abilities. The manual recommends Noldor as the easiest race.

The game is pinned to Sil-Q v1.5.1-beta1. SILQ_MANUAL.txt is the text extracted from the upstream 1.5.0 manual bundled with this release. It explains combat, stealth, skills, experience, smithing and abilities. Some introductory passages describe original Sil: for example, this version starts with a curved sword. Use the screen and native item and ability descriptions when they differ from the manual.

These documentation corrections apply to this pinned version:

Commands and lifecycle

silq overall
silq start
silq state
silq press '6' --trial 1 --frame 1
silq press --json-keys '"\r"' --trial 1 --frame 2

Use the trial and frame from your latest response; the numbers above are examples. start consumes the next scheduled trial; it cannot reset a live game. state returns the current screen without sending native input or advancing the game. overall shows the schedule and recorded outcomes. finish voluntarily retires the live trial for zero. A completed schedule cannot be extended, and a finished game cannot be resumed. Continue through every trial.

press accepts 1–64 ASCII characters. Case matters. A single character returns the next input screen. For multiple characters, the service sends each one only after receiving the previous screen. The CLI saves every intermediate frame in /workspace/silq-history/trial-NN.jsonl and prints the last state with a history receipt listing the saved frame range. This keeps command output within the coding tool's limit. Inspect an earlier frame with silq history --trial N --frame F; this reads the local archive without sending any game input. History is also saved for single-key responses and screen reads. Keep these files if you want to analyze your earlier play.

The service stops a batch at the game's end or a resource limit. An unexpected prompt can change what the remaining keys mean. Use short batches when prompts or combat may interrupt an action. A stale frame, wrong trial or malformed request is rejected before sending a native key; fetch state to recover.

--json-keys decodes a JSON string. Useful escapes are "\r" (Enter), "\u001b" (Escape), "\t" (Tab), "\b" (Backspace), "\u007f" (Delete) and " " (Space). No shell escape syntax is interpreted inside an ordinary literal keys argument. The CLI saves each mutation before sending it and retries a lost response with the same request ID. Use silq retry to repeat the last saved request safely. A recovered batch may contain only its executed prefix; inspect its current state before sending more keys. Restarting the service does not reset a trial's deadline.

For programs, http://game:8080 accepts GET /state and GET /overall. Every POST /start, /act, or /finish requires a unique canonical UUID in request_id. Start also requires the next trial; act requires trial, frame, and keys; finish requires trial and frame. Retry the exact same body to retrieve its receipt. For example, an act body is {"request_id":"f09c8ede-a2c6-40ee-bd10-e8e3a456bb87","trial":1,"frame":2,"keys":"6"}. Generate a new UUID for each new action. Errors have an error field, and the CLI exits with status 2. Check for errors before choosing the next action. If local history saving fails after a request, the CLI reports history_save_failed_after_request and the final state; the keys may already have executed. Fetch the current state before deciding whether to send more keys. Local archives are for your analysis; the protected service records scores.

Programs using HTTP directly receive the complete frames array and final state for batches. Retain those frames yourself; printing a large raw batch can be truncated by the coding tool even when you request a large output allowance.

Reading the screen

Each response contains screen.rows: the native 80-column, 27-row terminal. Coordinates are zero-based. Trailing spaces are omitted; pad each row to 80 characters when building a grid. The screen shows the current panel. Menus can cover the map, the panel can scroll, and unseen terrain is not exposed. Use the native look, map and list commands to inspect what your character knows.

screen.attributes preserves colors as runs [row, column, length, attribute]. Unlisted cells have attribute 1 (white). An attribute's base color is its value modulo 16; the integer quotient by 16 is its native shade. Base colors are:

ID Color ID Color
0 dark 8 light dark
1 white 9 light slate
2 slate 10 violet
3 orange 11 yellow
4 red 12 light red
5 green 13 light green
6 blue 14 light blue
7 umber 15 light umber

Color distinguishes map symbols and highlights menu choices and command letters. Preserve it when parsing the screen. cursor is [column,row]; cursor_visible reports whether the native terminal shows it. A hidden cursor's position can be stale. Screen coordinates are not persistent dungeon coordinates. bell_count records native warning beeps since the preceding frame. An invalid keypress may ring the bell while leaving the text unchanged. Re-reading the current state returns that same recorded frame; it does not ring a new bell.

The target sidebar's monster alertness label can lag a native state transition. Press [ for a freshly generated visible-monster list; Escape returns to the game. Use the list to check a potentially stale sidebar label.

The response also reports trial phase/status, keys used and wall time remaining. A native key can consume no game turn (a menu), one turn (movement), or many turns (running/resting/repeat commands). The next response arrives when the native game waits for input again. Native -more- prompts require input; they are not skipped. Inspect the resulting screen after dismissing them. The service has no automatic movement, pathfinding, combat policy, monster detector or item identification.

Native controls

The standard Sil-Q numerical keyset is fixed. In menus, 8 and 2 navigate up and down, 4 and 6 decrease/increase or move left/right, and Enter accepts the current selection. Read each prompt: letters often choose an item directly. During character creation you choose race, house, stats, skills, history, age/height/weight and name. Type a name and Enter. The introductory poem also waits for a key. Escape can return to earlier birth choices before the dungeon exists.

Native key Action from the normal gameplay screen
7 8 9 / 4 5 6 / 1 2 3 Numerical directions; 5 waits. Moving into an enemy attacks.
. then a direction Run using native stopping rules.
Z Rest using native stopping rules, normally until recovered or interrupted.
S Toggle stealth mode.
<, > Use stairs underfoot.
g Pick up items underfoot.
i, e Inventory or equipment.
x Examine an item; choose from the prompted inventory/equipment/floor list.
w, r, d, k Wield/wear, remove, drop, destroy.
u Use an item through the native universal-use prompt.
q, E, a, p Quaff potion, eat, activate staff, play horn.
f, t Fire ammunition or throw an item.
o, c, b, T, D, / Open, close, bash, tunnel, disarm, interact in a direction.
l, L, M Look, shift the map panel, view the overhead map.
[, ] List visible monsters or objects.
@ Character sheet; highlighted commands include increasing skills and abilities.
Tab Ability screen.
s Choose a song.
0 Smithing screen.
? Three native help pages; press a key to advance each page.
m, Escape Main menu from ordinary gameplay; Escape usually cancels a sub-menu.
Control-P ("\u0010") Earlier messages.
Q Native suicide/quit confirmation.

These keys apply at the gameplay prompt. In an inventory, target, direction, quantity, confirmation or menu prompt the same character may mean something else. Inventory and equipment lists allow follow-on item commands. Check the prompt and highlighted shortcuts before sending a key.

Scope of the evaluation

Wizard/debug/spoiler modes, configuration changes, native macros, custom preferences, file exports and native save/load are unavailable. Use scripts in your own workspace for automation and notes. Native gameplay rules and normal menus remain in the engine. A fixed September calendar avoids holiday items; dungeons, encounters, combat and unidentified item flavors remain randomized. Games cannot be reset, tutorials replayed, or the random schedule inspected.

The service scores the native ending and inventory. Escape with a Silmaril earns 1. Empty-handed escape, reaching 1000 ft without returning, death with a jewel, quit, retirement, or an unfinished game earns 0. Other progress is recorded for analysis. Names, inscriptions, workspace files, and your final report do not affect the score.