Sil-Q terminal interface
Your objective is to retrieve at least one Silmaril from Morgoth's crown and escape Angband carrying it. Each scheduled trial is a fresh normal game. All races and their native house, stat, skill and ability choices are available. The manual recommends Noldor as the easiest race; race choice deliberately changes difficulty.
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.
The actual screen and native item/ability descriptions determine current behavior.
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 actual trial and frame from your latest response. The numbers above
only demonstrate syntax. 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 stdout to one screen
instead of overflowing the coding tool's output 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.
It does not check whether a later key still matches your intention after an
unexpected prompt: use batches carefully. 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.
For programs, the service accepts POST /act with exactly
{"trial":1,"frame":2,"keys":"6"} at http://game:8080; GET /state,
GET /overall, and empty-object POST /start or POST /finish are also available.
Errors have an error field, and the CLI exits with status 2. Check errors instead
of assuming a key was accepted. 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 instead of blindly repeating
them. Local archives are ordinary files in your workspace, not score evidence.
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. This is a screen, not a complete dungeon map.
Menus overlay 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 otherwise identical map symbols and highlights menu choices
and command letters. Preserve it in your own controller. 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 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. |
The table describes keys 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. Read the highlighted shortcuts and help rather than guessing which prompt is active.
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. There is no reset, tutorial replay or access to the random schedule.
Only the protected native ending is scored. Messages, names, inscriptions, files you write and claims in your final answer cannot award a win. Escaping empty handed, merely reaching 1000 ft, dying with a jewel, quitting, retiring and running out of the trial allowance all give zero. Progress is recorded for diagnosis, but does not substitute for the full objective.