BRE screen reference — literal output, layout, and colors¶
This is a ground-truth capture of Barren Realms Elite's actual on-screen output: exact wording, borders/decorations, numeric prompts, and the ANSI colors of each element. It exists so Immortal Barons can match BRE's presentation without re-driving the DOS binary every time. It is a reference for our implementation — no BRE code or art is copied into the game; this file records observed behavior for fidelity work (see the clean-room note at the end).
Captured live 2026-07 by driving BRE v0.988 under dosemu2 and scraping the pane
with tmux capture-pane -ep (the -e flag keeps ANSI escapes — this is the
proven way to read BRE's colors headlessly; see the bre-gather skill).
Audit status — and the UNVERIFIED marker¶
Every claim in this file is either backed by a capture or marked
**UNVERIFIED**. That literal string is the one marker; grep -n UNVERIFIED
docs/dev/bre-screens.md lists every gap in the file. A marked claim is a
recorded guess or a reading taken from somewhere other than a live screen — do
not build a color or layout decision on one without re-capturing first. An
unmarked claim was read off a capture, and the entry says which.
Captures are not in git (cap/ is excluded and *.cap is gitignored as
verbatim proprietary output), so a future audit needs them re-taken, and nothing
verbatim beyond what is already recorded here should be pasted in.
One exception to the rule above, and it is a defect in this file rather than a
kind of claim. The entries stamped re-captured 2026-08-16 were read off a
live session whose raw log was NOT kept: that pass drove BRE in a throwaway
directory and deleted it when it finished, taking the script output with it.
Copying the game aside to protect the sysop's save was right; putting the
capture there too was not. Nothing here contradicts those readings and they are
probably correct — but they cannot be re-checked against anything on disk, which
is the standard every other unmarked claim meets. Treat them as sound but
unauditable until someone re-drives those screens and keeps the log in cap/,
per the rule now in the bre-gather skill.
Nothing is parked on this any more. The last item that was — the incoming
treaty-offer prompt's position relative to the numbered recap entries — was
settled from the DISASSEMBLY instead, because no capture can settle it: a survey
of all 249 recaps across six captures found no screen showing an offer and
numbered entries together. run_player_turn (BRE.EXE 0x36E1) prints the
header, then calls process_trade_offer (0x3855), process_diplomatic_proposal
(0x385A), write_data_report (0x385F) for the entries, and
read_local_messages (0x3869). So both offers precede the entries, and the
trade barter precedes the treaty. IB had both the other way round.
The same routine says which of those stops a player out of turns still gets:
the two offer calls sit behind a turns-remaining test (0x3842), while the
entries and the mailbox are called on either path (0x385F), and "Sorry, you
have used all of your turns today." is only reached afterward (0x38D7 ->
0x3F8D). So entering with no turns left shows the recap and the mail and asks
nothing about pending offers. Neither stop has a per-day gate: a pending barter
is put again on every entry that has a turn to play, which is what #175 asks.
The Covert Operations box width was parked here too and is now settled: it
was re-captured on 2026-08-17 with the log kept as cap/covert-menu-20260817.cap
(32 columns; see that section).
2026-08-16, pass one — the file against the captures on disk¶
Every claim was checked against four color captures plus one large monochrome public-board session. Roughly seventeen screens were misdescribed and corrected; each correction below says so and names the capture. That pass also found about a third of the file resting on no capture at all, which is what pass two went after.
2026-08-16, pass two — driving BRE for the screens with no evidence¶
A fresh session under dosemu2 (script-wrapped, so SGR color survives) against
a three-realm local game, then a BRE RESET for the editor. These went from
recorded-but-unverified to capture-backed:
| Screen | Outcome |
|---|---|
| Status bar | CORRECTED — three fields, and their pre-login values |
| Regular Attack force entry | confirmed |
| Regular Attack post-battle report (WIN) + region picker | confirmed |
| Covert Operations menu | CORRECTED — accent is green, and the fees are on screen |
| SDI Program colors | confirmed, plus the post-funding echo |
| Configuration Editor | confirmed, plus the highlight color and the edit screen |
| Message editor | confirmed |
| Game Setup | CORRECTED — it is bracketed by a rule this file omitted |
| Travel Times | CORRECTED — the unmeasured case |
| Alliance Strength with a real ally row | confirmed |
-*Relations*- |
CORRECTED — the caller's own realm is not listed |
| Incoming treaty-offer prompt | CORRECTED — it comes before the recap entries |
Still not reached, and still marked in place: the Attack Type menu was not
re-reached on 2026-08-16 (it needs a live two-board league with recon data), but
it is not unverified — it was captured end-to-end on 2026-08-11 and its entry
carries those colors. Its (?) Help browser and the Join Group Attack table
were reached on 2026-09-02, log kept as cap/eots-ibbs-02.cap. What genuinely remains unverified is listed at each
screen; the biggest are the interplanetary screens that need a second board
running, and the Diplomacy roster-flag contradiction recorded under Full Defense
Alliance.
How to read the color notes¶
Colors are given as ANSI SGR codes (what BRE actually emits):
| Code | Color | Code | Color (bright) |
|---|---|---|---|
| 30 | black | 90 | bright-black (gray) |
| 31 | red | 91 | bright-red |
| 32 | green | 92 | bright-green |
| 33 | yellow | 93 | bright-yellow |
| 34 | blue | 94 | bright-blue |
| 35 | magenta | 95 | bright-magenta |
| 36 | cyan | 96 | bright-cyan |
| 37 | white | 97 | bright-white |
Backgrounds: 40–47 (and 100+) — e.g. 44 = blue background. Border rules
mix the single horizontal ─ (U+2500) and double ═ (U+2550) — e.g. a short
═══ accent set inside a longer ─── line.
How the score table spells its three figures — BINARY-VERIFIED¶
The Id / Empire Name / Territory / Score / Networth table (show_player_list,
drawn by the roster, the attack target list and the Spy Database) spells each of
its three numeric columns DIFFERENTLY, and IB now follows all three
(internal/numfmt, Short and GroupLong):
- Territory — grouped, but only past four digits.
resident_0dc9_0608(BRE.EXE image0x0E2F7) tests the rendered digit string's LENGTH against 4 and returns it ungrouped when it is not longer. One capture shows the same screen printing3469on one planet and14,203on another. - Score and Net Worth — shortened with a bare
korm.resident_0dc9_0df9(image0x0EA89) does, twice over:if v >= 10000 { v /= 1000; suffix = next }, stepping""->k->m.
The two divides are separate ifs, not a loop, and that is the format's whole
character. 1,213,456 falls to 1213, which is under the threshold, so it stays
1213k and never reaches m; a capture prints a net worth of 3180k beside
another realm's 12m. The crossover to m is at exactly 10,000,000, NOT at a
million. There is no b tier: two billion prints 2000m. Division truncates,
and a negative figure is never shortened (the routine's first test jumps past
the whole thing).
The suffix strings are the only 01 'k' 01 'm' in the binary
(BRE.EXE 0x113C5). Evidence for the values:
cap/20240527-134Pho_Lazarus_Public.cap.
Id Empire Name Territory Score Networth
(A) <realm> 14,203 1962k 12m
(A) <realm> 3469 958k 3180k
This is a CONVERGENCE, and it narrows the comma-grouping divergence below. IB printed these columns bare (the board and the target list) or fully grouped (the recipient picker) until 2026-08-30; all three now share one row helper.
The shortening is NOT the score table's alone¶
resident_0dc9_0eb4 wraps the same helper, so these screens shorten too — every
numeric field on the line, gold and unit counts alike:
| BRE routine | the line | IB |
|---|---|---|
launch_pirate_raid |
You took 111k Gold, 5 Regions, 8568 Agents, ... 13k Turrets |
done |
resolve_returning_attack |
1000k Tanks returned. |
done |
resolve_received_invasion |
the arriving strike's report | done |
resolve_received_trade_offer |
They shipped 1000k Turrets and 188m Gold. |
done |
process_trade_offer |
He Offers 100m Gold and 1000 Carriers. |
— |
create_individual_attack |
You have N Troopers, N usable Jets, ... |
done |
show_military_advisor_report |
9 figures, NOT yet mapped to their lines | open |
The LOCAL battle report does NOT shorten, and that is not an oversight.
resolve_regular_attack is absent from the helper's caller list, and a staged
local battle printed 10469 Troopers whole
(cap/small-vs-large-20260830.cap) where the interplanetary report of a
comparable figure prints 115k Turrets. The two must not be made to agree.
The money screens do not shorten either. Bank: 2,000,000,000 is printed in
full (below), so BRE spells gold both ways and which one applies is decided per
screen, not per quantity.
The Daily Bulletin is a THIRD format again¶
Its three rows are spelled:
| row | rule | capture |
|---|---|---|
| Total Population | grouped past four digits | 7813, 10,040, 977,749 |
| Total Regions | grouped past four digits | 5000, 41,686 |
| Total Net Worth | /1000, always k, then grouped |
0k, 12k, 1255k, 97,678k |
The k is unconditional — a planet worth nothing prints 0k — and it NEVER
steps to m however large the planet grows, which is what separates this from
the score table's rule above. The Change figure beside each uses that row's own
format (+7570, +12k). IB matched this on 2026-08-30; it had stepped k/m/b
here (#205) and printed 12m where the original prints 12,468k.
How BRE prints a figure of a billion or more¶
In full, with its thousands comma-grouped — no suffix, no decimal form. This
is the MONEY screens; the score table shortens instead (above), so BRE does both
and which one applies is per screen.
Bank: 2,000,000,000 appears 8,581 times in cap/121125-666H4H_Camembert_Public.cap
alongside You have 0 gold in hand and 2,000,000,000 gold in the bank., and the
bank-history rows run 09/25/2013 $1,001,235,538 / Today $1,846,153,847.
2,000,000,000 is the money cap, so that is the top of BRE's own range and its
screens are sized for the thirteen characters.
One exception, and it is a prompt bound rather than a displayed figure.
cap/shsbbs.cap carries How many Jets? (0; 1.0737B): on the trade deal's
Request side — 1,073,741,824, i.e. 2^30, the sentinel that stands in for "what
the other realm holds is not yours to see". That is the only decimal B form in
any capture here. IB prints no ceiling at all on that prompt (see Send Trade
Deal, below).
Abbreviated columns use a lowercase suffix, and each column keeps ONE suffix
however large its figure runs — the suffix is not a magnitude threshold. The
See Scores board puts 1962k and 12m side by side in a single row
(cap/20240527-134Pho_Lazarus_Public.cap): the Score column is fixed on k and
the Net Worth column on m, at the same magnitude. The Daily Bulletin's third
row stays on k well past a million — Total Net Worth: 25,750k in
cap/eots-ibbs-01.cap, with 2720k and Change: +616k in a smaller game. No
capture reaches billion scale in either column, and a lowercase b appears
nowhere.
IB steps the suffix instead, k/m/b by magnitude and nothing below a
thousand, one rule on every screen (numfmt.Abbrev). A deliberate divergence:
two columns spelling the same magnitude two ways is the part of BRE's behavior
worth losing, and stepping holds any figure to four digits and a letter.
Status bar (bottom line, every screen)¶
Captured 2026-08-16. The whole line carries a 44 blue background. It opens
with the BBS caller's handle in 37 white, padded to 20 columns, then three
94 bright-blue │ separators with 37 white fields between them — the
empire letter, the realm name, and last the ■ (CP437 0xFE) marker
immediately followed by F2=Extra Information:
BORON │ A │ Boron │ ■F2=Extra Information
Before the caller is matched to an empire — during the splash and the
new-realm flow — the second and third fields read UNKNOWN and Who knows!.
That is BRE's own placeholder text, so the bar is drawn before the login is
resolved rather than being suppressed.
This section said the bar opened with the realm name and showed two fields; it is the BBS handle, and there are three.
Attack Menu¶
Title border: 35 magenta ───── + 95 bright-magenta [ + 97 bright-white
Attack Menu + 95 ] + 35 ─────. Each item: 35(+key+)with the key
letter in95bright-magenta and the parens/label as35magenta(/)and37white label. The default (Quit) prompt:Choicewhite,97> ,37Quit`.
─────[Attack Menu]─────
(R) Regular Attack
(N) Nuclear Attack
(C) Chemical Attack
(B) Biological Attack
(P) Attack Pirates
(A) Alliance Strength
(V) Visit Bank
(?) Help
(0) Quit
───────────────────────
Choice> Quit
Total conquest, and how a dead realm is listed¶
Captured live in cap/kd3-01.cap (2026-09-18), the attack that eliminated a
realm. The win line is replaced, and a second line announces the military:
You have crushed the enemy completely! You captured all 8 Regions!
You also get all the remains of your opponent's military...
The captured-region picker still runs afterward, exactly as on an ordinary win — the conqueror places the last 8 regions by type before the turn ends.
Thereafter the realm keeps its row on the score board, with DEAD in the
TERRITORY column where the region count would be, right-aligned like a figure.
The name is untouched and both figures are still printed:
(P) Epoch Times DEAD 17927 986
IB matched this on 2026-09-18. It had been appending (dead) to the NAME
and printing the territory figure, which cost the name column seven characters
and left the territory column claiming the realm still held land.
Open question — the 986. That realm shows a net worth of 986 with no
territory, having just had "all the remains" of its military taken. Net worth is
land plus units (BRE.EXE 0x8F53), so a realm with neither should read 0. Either
the transfer leaves some unit type behind, or the dead row prints a stored figure
rather than a recomputed one. The check that would settle it is the arithmetic
in resolve_regular_attack after the block the catalog names
__transfer_defeated_military (BRE.OVR 0x01012b) — that block opens with the
report-string assembly, so the transfer itself is further in and has not been
read. IB does not reproduce the 986: absorbMilitary takes all six unit
types, so a crushed realm computes 0. IB stopped FORCING the zero in the same
change, since the forcing rested on a claim this capture disproves.
New Realm Protection refusals — distinct strings, scoped by situation¶
The original does not have one protection message. It has several, and each
belongs to the routine that prints it — read out of the binary 2026-09-21, with
find-string naming the referring routine for each. IB prints each one in its
own situation (#286):
| String | Routine | When |
|---|---|---|
That empire is in protection. |
choose_target_empire |
the TARGET you picked is shielded |
You are in protection. |
choose_target_empire |
YOUR realm is shielded |
Our empire is in protection, my lord. |
run_covert_operations_menu |
your realm is shielded, at the covert menu |
That realm is still in protection. |
create_trade_offer |
a trade offer to a shielded realm |
Sorry, this option is not available in protection. |
fund_gooie_kablooie |
funding the weapon while shielded |
Your forces found their target was in protection. |
resolve_returning_attack |
an interplanetary strike finds its target shielded on arrival |
A second find-string pass (2026-09-23) turned up four more:
| String | Routine | When |
|---|---|---|
Your dominion is still under protection. |
create_trade_offer, run_trading_market |
YOUR realm is shielded, at a trade offer or the market |
Sorry....You are under New Realm Protection! |
run_interbbs_menu |
your realm is shielded, at InterPlanetary digits 2, 3, 4, 6, 8, 9 |
Sorry... You're under new realm protection. |
the join path (catalog: create_individual_attack, 0x02d212) |
Join Group Attack while shielded; the menu gate skips digit 5 |
Your terrorists found that their target was under protection. |
process_terrorist_report |
a terrorist op finds its target shielded on arrival |
The Gooie string is unreachable in the original: fund_gooie_kablooie's only
caller is run_interbbs_menu, which has already refused digit 9 on the same
predicate. IB prints the menu's refusal there. IB's terrorist and Special
Operations return reports still use IB's own wording, which names the operation.
choose_target_empire is the SHARED picker, so one string covers the attack and
covert lists — which is why IB sharing a single targetList.prompts() refusal
across both is right. What is not right is reusing any of the other five for a
situation they do not belong to.
Do not source the picker's wording from a capture without checking which
screen it came from. cap/kd3-01.cap lines 1051 and 1075 show
That realm is still in protection. directly under a Choose a Target prompt,
which reads as the attack picker and is not: the menu drawn immediately after it
is Trading, and the binary assigns that string to create_trade_offer. IB briefly
took the trade wording for its attack picker on that basis (2026-09-21, corrected
the same day).
A local refusal costs nothing. The picker refuses before any force is named,
so nothing is committed and no turn is spent. That is the opposite of the
interplanetary Group Attack, where the detachment travels, is refused at the far
end, and comes home reduced by GroupAttackLossPct — the case
docs/mechanics-reference.md documents. Reading the group-attack cost onto a
local attack is the mistake this note exists to stop.
Regular Attack¶
Target list¶
Choose a Target (white) then 31 red [ + 93 bright-yellow A + 37 -
+ 93 Y + 37 , + 93 ? + 37 =List + 31 RETURN to Abort].
? lists players. Header line -*Barren Realms Elite*- has -*/*- in 31
red and the title in 97. Column header row in 97 bright-white. Rows:
35(()97(id-letter)35()+)37(name) with Territory in 95
bright-magenta, Score in 97 bright-white, Net Worth in 37 white.
The + before a realm name marks it in the list (seen on both own and rival).
Id Empire Name Territory Score Net Worth
─────═══════════════───────────────────────────────────────────────────────
(A)+Asgard 656 5903 47474
(B)+Rome 45 213 587
─────═══════════════───────────────────────────────────────────────────────
Choose a Target [A-Y,?=List RETURN to Abort]
IB keeps the capture's (A), and BRACKETS the id of a realm under New Realm
Protection: [C] (#214). That bracket is the entire flag — nothing follows the
name, the row keeps its width, and the shape carries the meaning, so it reads on
a monochrome terminal and to anyone who cannot separate the two colors. BRE
flags nothing; it has no need to, since its own list is drawn before any of this
is decided. The divergence is not local to this screen: See Scores, the covert
target list and the recipient picker draw the same table and change with it.
The realm KEEPS its selection letter and pressing it is answered with the
refusal by name. IB withheld the letter until 2026-08-26, which told a player
that something about the row was different without saying what; it then spent a
day flagging (P) after the name and bracketing EVERY id, which spelled one id
two ways for a flag the bracket could carry on its own. An ALLIED realm still
shows no letter: that standing belongs to the diplomacy screens, and the player
made it themselves.
-*Relations*- is the one screen unchanged by this. The original brackets every
id there, so a bracket cannot mean protection on it, and it is a standings
roster rather than a picker — the flag belongs where a realm is chosen.
Force selection¶
Re-captured 2026-08-16, unchanged. You have white, counts in 96
bright-cyan. Each prompt: label white, then 94 blue ( + 96 bright-cyan
(suggested/default) + 94 ; + 36 cyan (max) + 94 ), input echoed 97
bright-white. The default is the maximum here, so Enter commits everything —
unlike the interplanetary force prompts, whose defaults are all 0.
You have 4359 Troopers, 5000 usable Jets, 26,374 Tanks, and 0 Bombers
Send how many Troopers? (4359; 4359)
How many Jets? (5000; 5000)
How many Tanks? (26,374; 26,374)
How many Bombers? (0; 0)
IB adds a Send this Attack? (Y/n) confirmation here; the original has none.
Send this Attack? is one string (BRE.OVR 0x2b82b) in configure_attack_forces
(0x2b83c), whose only callers are create_group_attack, create_individual_attack
and run_interbbs_attack_menu — the interplanetary paths, where the prompt follows
the gold cost it is really asking about. The local resolve_regular_attack
(0x00ef90) touches no such string and quotes no cost, and launches off the last
force prompt. IB asks anyway because every default above is the maximum, so a
held Enter commits the whole army with nothing in between. The wording and the YES
default are the original's.
Post-battle result (WIN)¶
Re-captured live 2026-08-16 (a winning attack that took 79 regions), and the
description below held on every point. BRE breaks down both sides' losses by
unit type, and uses the same "Exhausted from battle" header even on a win. The
captured count is 96 bright-cyan; all other unit numbers are 97
bright-white; labels 37 white.
The line before it is an animation. And the battle begins is followed by a
run of about forty dots drawn alternately 31 red and 34 blue, which reads as
a twinkling progress bar on a real terminal. The dot count varies. IB does not
reproduce it, which is fine — but this is where the pause lives, so a
reimplementation that prints the report instantly loses the beat.
Your forces have returned..Exhausted from battle...
You lost 43 Troopers, 50 Jets, 263 Tanks, and 0 Bombers.
You destroyed 20 Troopers, 0 Turrets, 0 Tanks, and 0 Jets.
You won the battle! You captured 15 Regions!
On a win with captured land, the captured-region picker (below) opens immediately after this. A win capturing 0 regions shows no picker.
IB divergence (2026-07): IB's report reads
Victory! You captured N regions.\n You lost N units; the enemy lost N.— a single total per side, no per-unit breakdown and different wording. Reconcile toward the BRE text above.
Captured-region picker (shared: regular attack AND pirate raid)¶
The same picker BRE shows after a winning Regular Attack that took land and
after a winning pirate raid that took land. Header Key Name Owned
in 97 bright-white. Rule: 95 bright-magenta, 25 columns — 5 ─, 5 ═,
15 ─ (measured in cap/kd3-01.cap and cap/eots-ibbs-01.cap; the same rule
the Regions buy screen draws, since one routine serves both). Each row: 35
magenta ( + 97 bright-white
key-letter + 35 ) + 93 bright-yellow region name + 97 bright-white Owned
count. (*) Advisors uses the same coloring. Owned counts are the values
BEFORE this allocation — BRE applies the picked amounts at the end.
Picker prompt (distinct from the buy/sell "Your choice?"): 34 blue [ + 96
bright-cyan (count) + 37 Regions left + 34 ] + 37 Your choice?.
After a type is chosen: How many white + the type name 96 bright-cyan +
regions? white + 94 blue ( + 96
0 + 94 ; + 36 cyan (count) + 94 ). The picker loops, decrementing
the count, and auto-exits when it reaches 0.
Key Name Owned
─────═════───────────────
(C) Coastal 131
(R) River 0
(A) Agricultural 12
(D) Desert 5
(I) Industrial 311
(U) Urban 0
(M) Mountain 139
(T) Technology 58
(*) Advisors
─────═════───────────────
[15 Regions left] Your choice?
How many Coastal regions? (0; 15)
IB diverges here, deliberately. At Your choice? a key that is not a
region letter — a digit, 0, Enter — prints Press the letter of a region
type to place the remaining N. and asks again. BRE ignores the key or redraws
the prompt without a word, and a player who read [N Regions left] as asking
how many was stuck at it on an IB v0.1.2 board until the idle timeout.
Attack Pirates¶
Faction list — each faction has its own color¶
90 gray ( + 97 bright-white digit + 90 ) then the faction name in a
distinct color:
| # | Faction | Name color |
|---|---|---|
| 1 | Humans | 92 bright-green |
| 2 | Barbarians | 93 bright-yellow |
| 3 | Solarians | 91 bright-red |
| 4 | Sharks | 31 red |
| 5 | Mechanoids | 35 magenta |
| 6 | Rexxogans | 95 bright-magenta |
| 7 | Xandorians | 94 bright-blue |
| 8 | Monitorians | 36 cyan |
| 9 | Spacians | 96 bright-cyan |
(0) Quit in 37 white. (Names are BRE-original; IB should rename the coined
ones per the clean-room rule — tracked separately.)
Force selection¶
Same shape as Regular Attack: Send how many Troopers? (0; MAX) etc. Pirate
raids commit Troopers / Jets / Tanks (no Turrets/Bombers).
Post-raid result (WIN)¶
The faction name keeps its list color. Loot taken numbers are 93
bright-yellow; labels 37 white; own losses are 97 bright-white. Regions
appear in the loot line only when the faction holds land; otherwise the loot
line omits "Regions" and no picker opens.
Your efforts against Xandorians have brought you success!
You took 78k Gold, 8 Regions, 525 Troopers, 481 Jets, 606 Turrets, and 175 Tanks.
You lost 150 Troopers, 350 Jets, and 1000 Tanks.
Then the captured-region picker (above) opens for the won regions.
IB marks a faction that raided you since your last play. BRE's list has
no such flag. IB writes « after the name, one space clear of it — CP437 174,
pointing back at the name it marks, in the 37 gray the online mark ((O),
above) gives the part that must carry its meaning alone. A faction that did not
raid carries nothing at all.
The head is drawn without a shaft on purpose. « is a text glyph and sits
off the horizontal centerline ═/─ are drawn on, so «═ reads as two marks
side by side rather than as one arrow. A session held to 7-bit ASCII gets <=
instead, where both characters share a baseline and the shaft costs nothing —
the general substitution would have reduced the guillemet to a bare <. The mark is
cleared and reset each time the income report runs, so it flags only the raiders
named in that turn's report, not an older one.
The mark sat to the LEFT of the name until 2026-08-25, with every unmarked row holding that column blank so the names lined up. On the common screen — nothing raided you — the whole list read as indented for no reason, which is how it was reported (#197).
IB status (2026-08-09): matched, with three recorded divergences:
- IB prints the gold figure in full where BRE abbreviates it (
78k Gold), so a full tally can pass 80 columns and is wrapped at display. - IB adds an
Agentsfield, which BRE's raid has no counterpart for. - IB omits the
You lostline on a win, because a winning raid costs the attacker nothing here — BRE charges one, and setting a rate needs evidence rather than a guess.
The headline is one of five
picked at random (raidWinLines / raidFailLines in internal/game/pirates.go),
BRE's own wording first and four of IB's after it — a deliberate divergence, so
a player raiding the same faction repeatedly is not read the same sentence.
System Menu¶
Reached from the Spending Menu via (*) System Menu. Border 34 blue rule +
94 bright-blue [ + 97 System Menu + 94 ] + 34. Items in three
columns: 34 blue ( + 94 bright-blue key + 34 ) + 37 white label.
────────────────────────────[System Menu]────────────────────────────
(#) Abdicate (M) Messages (1) Set Industries
(A) Visit Advisors (P) Preferences (2) Show Instructions
(D) Diplomacy (R) Set Tax Rate (4) Spy Database
(E) Empire Status (S) See Scores (5) Coordinator Vote
(F) Food Market (T) Trading (*) Coordinator Menu
(G) Game Setup (V) Visit Bank (0) Quit
(I) InterBBS Scores (W) Write Macros
─────────────────────────────────────────────────────────────────────
Choice> Quit
(C) Covert Operations sits between (A) Visit Advisors and (D) Diplomacy
when the realm holds at least one covert agent; it is absent above because that
capture had none. Verified across the cap/ captures: the item appears at the
exact point agents go from 0 to nonzero (eots, shsbbs, bre-9-eots), and it shows
even with the "Visit Covert Menu" preference set to No, so the preference gates
only the per-turn step.
Set Industries (System Menu → 1)¶
Title 31 red rule + 91 bright-red [ + 97 Industrial Production + 91
] + 31. Each row: label 37 white + : + percent value 93 bright-yellow
+ % white + 31 red ( + 91 bright-red (per-year count) + 37 per year
+ 31 ). Specialized tag in 93 bright-yellow.
IB divergences: IB writes * * * in bright-yellow where BRE
writes Specialized, in the same position at the end of the row — a marker with
no word to translate. IB also lists a Gold row last, with no per-year figure,
so capacity can be reserved for gold rather than only left over; it starts at 0%,
and unallocated capacity still pays gold as before. The Gold row carries a
per-year figure like the units, from the same function that credits it. Figures
in that column are comma-grouped, which BRE does not do — the same divergence
recorded for figures elsewhere. Gold is not offered as a specialization.
───────────[Industrial Production]────────────
Troopers : 0% (0 per year)
Jets : 0% (0 per year)
Turrets : 0% (0 per year)
Bombers : 0% (0 per year)
Tanks : 100% (2496 per year) Specialized
Carriers : 0% (0 per year)
──────────────────────────────────────────────
Change Production? (y/N)
Change Production? prompt: white + 36 cyan ( + 96 bright-cyan y + 36
/ + 96 N + 36 ). On y, per-unit percentage prompts follow:
Troopers (0; 100) — label white, 94 blue ( + 96 0 + 94 ; +
36 100 + 94 ). Percentages allocate across the six unit types.
Advisors (System Menu → A)¶
Menu: 35 magenta rule + 95 bright-magenta [ + 97 Advisors + 95 ] +
35. Four advisors, items 35(()95(key)35())37(label):
───[Advisors]───
(1) Civilian
(2) Economic
(3) Military
(4) Technology
(0) Quit
Each advisor prints prose (no inner border); key numbers are highlighted. The
─»>Paused<«─ bar is 36 cyan with 96 bright-cyan Paused.
Deliberate divergence — IB gives all four advisors a named greeting, in 96
bright-cyan. The original names only the MILITARY one: ", your military
advisor." is the single greeting string in BRE.OVR, and the capture shows no
opening line for the other three and no color for advisor prose. IB coins a
name and a line of character for each of the four, which Andy approved on
2026-08-15. Do not "correct" this back.
Deliberate divergence — IB frames each advisor and sorts what it says (Andy,
2026-09-23). BRE prints bare prose. IB draws a 76-column box: a 35 magenta
title rule naming the advisor (──[Military]──), the greeting, then the figures,
then the advice, each part after a blank line, and a 35 closing rule. Each piece
of advice starts with a 95 bright-magenta », and a wrapped line hangs under
the start of its sentence, and the figures sit in short groups separated by
blank lines. The Military advisor's unit counts use Empire Status's own Military
row ([count Unit] cells) rather than BRE's sentence, and IB shows them on every
board, where BRE shows force figures only on an inter-BBS one. The counts themselves follow BRE: they
are shortened to k/m and include forces away on attacks (#239). IB does not
list the pending interplanetary attacks BRE prints above the totals.
(1) Civilian — food outlook¶
Numbers 97 bright-white; a deficit figure in 93 bright-yellow (warning).
We currently produce a minimum of 3708 units of food per year.
We occasionally produce an additional 0 units from rivers.
The empire consumes 4928 units of food yearly.
This gives the empire a maximum food deficit of 1220 units per year.
At our current population, we can survive for at least 2 years.
(2) Economic — income and efficiency¶
All figures 93 bright-yellow.
Your yearly income was 1,273,887 Gold, 100% of the world total.
Your barony's efficiency is approximately 1941 Gold per Region.
The global average is approximately 1941 Gold per Region.
(3) Military — named advisor + conditional advice + force tally¶
The advisor is named ("Hi, I'm Joe, your military advisor."), and the name
itself is 97 bright-white against the 37 white greeting. Advice lines
are conditional on empire state (missing HQ, carrier shortage, etc.); unit types
named in advice are 93 bright-yellow. Force counts 97 bright-white.
Hi, I'm Joe, your military advisor.
Sire, your headquarters really needs to be constructed. It makes a large
difference in the strength of your Tanks.
We have a shortage of carriers in the empire. All of our jets cannot
be put to use in offensive attacks as it is right now.
Your total military force consists of 4359 Troopers, 7581 Jets,
6360 Turrets, 24k Tanks, and 0 Bombers.
(4) Technology — the full effect list¶
Each aspect name 97 bright-white, each percentage 93 bright-yellow. Confirms
the Technology-region mechanic's full set of effects. The NOTE has 96
bright-cyan NOTE: + 36 cyan body.
Because of technology...
Our military forces are functioning at 101% strength.
Our gold producing regions are at 101% of normal production.
Our food production techniques increased efficiency to 103%.
Our industries are running at 101% efficiency.
Our maintenance costs have been reduced to 99% of standard costs.
Our SDI yearly funding needs have been lowered to 99% normal expenses.
Food decay is at 94% of standard levels.
NOTE: Technology levels are relative to the number of regions
in the empire. Larger empires need more advanced technology to
maintain the same efficiency as smaller realms.
Second capture (full IBBS turn, 2026-07)¶
The sections below were added from a second live capture: a complete play-turn on a 4-board InterBBS game (v0.988), scraped with ANSI escapes intact. All real empire, player, planet, board, and operator names — and the operator locations in the Spy Database — are placeholders here; only BRE's own UI text, layout, and colors are ground truth. This was an InterBBS game with local player-vs-player attacks disabled, so the Attack Menu is the reduced variant (see below).
Per-menu accent color¶
The menu grammar from the top of this file (border + (key) + white label +
Choice> Quit) is constant, but each menu recolors the accent (the border
and the parens/hotkey). The title text inside [ ] is always 97 bright-white;
the accent is:
IB drops the word "Menu" from menu TITLES — [Attack], [Spending],
[System] where BRE writes [Attack Menu], [Spending Menu], [System Menu],
and the opening menu is [Entry] where BRE writes [Barren Realms Elite]. A deliberate divergence: the
box is plainly a menu, so the word is a wasted word in every title and in every
translation of it. The items that navigate to a menu keep it ((*) System
Menu), since there the word says where the item goes. The German and Russian
catalogs had already dropped their "Menü"/"Меню" element for Diplomacy before
this change.
IB's opening menu names the build above the title rule. BRE puts its own
name in the title rule itself, which IB cannot copy — [Entry] stands there
instead — so the first header line reads Immortal Barons v<version>, above
Game started on <date>. It is drawn with the header rather than once per
session: the opening menu is the screen a caller returns to from every submenu,
and printing the version after the splash alone left every redraw after the
first without it.
IB's opening menu carries a clock above the title rule; BRE's carries none.
A third header line under Game started on <date> reads Planetary time: HH:MM
New day in H:MM — the door host's wall clock, marked with its zone (#267),
and the time left of the game day, which turns at that host's local midnight.
It is the one time on any screen that stays on the BOARD's clock whatever zone
the reader picked: drawn in UTC beside the countdown, the two halves would no
longer add up to a round hour. It is its own row because one
row would run past 80 columns in German or Russian, and the header is not
wrapped. Nothing on BRE's screens tells a player when
the day turns, and the boundary is the server's, not the caller's, so a player in
another timezone had no way to work it out. The clock is 24-hour, and it is there so a
caller can compare the host's time against their own. It is left out entirely when the host's
date has moved off the world's own — a sysop's pinned -date, or a session held
open past midnight — because a wrong countdown is worse than none. Drop files
carry the caller's time remaining, never the time of day, so this comes from
the host clock as Synchronet's own dropfiles.c takes it.
Box widths vary per screen — BRE sizes each box to its content rather than
to one house width. Re-measured 2026-08-16 across every capture on disk
(cap/, plus the two older color captures), counting the title line and the
closing rule of each box:
- 14/16 (Specialization)
- 17 (Attack Pirates)
- 16 (Advisors)
- 20 (Trading)
- 23 (Attack Menu, Terrorist Ops)
- 26 (Coordinator Ops)
- 28 (Diplomacy)
- 36 (Preferences)
- 37 (Special Operations)
- 38 (InterBBS Scores)
- 44 (Spending, Sell)
- 46 (Industrial Production)
- 52 (opening)
- 60 (Crazy Gold Bank)
- 58/62/64/68 (InterPlanetary Ops)
- 64 (Food Unlimited)
- 69/75 (System Menu)
The closing rule is exactly the box width. True of 18 of the 19 box titles found across the five captures; Specialization is the one exception, and only because its title is wider than its content (below). Several code blocks in this file used to draw the closing rule one column wider than its own title line — those were the blocks being wrong, not BRE being inconsistent.
IB's rule constant is 62; a screen that draws
its own box should take its width from its own capture instead. IB sets Width
per menu where a capture gives one: Attack 23 (its content measures 23 too, so
the fit is exact), Spending 44, Industrial Production 46, Specialization 14.
System is 59, not BRE's 69/75 — BRE lays that menu out in three columns and
its box tracks whichever items are showing, IB uses two, so IB follows the
principle (size to content) rather than the number.
Specialization IS captured (this file said it was not until 2026-08-16).
BRE draws its title line as a bare [Specialization] with no fill at all —
16 columns, because the title is wider than the menu — and closes it with a
14-column rule, the width of its widest item ((1) Troopers). So the box
is content-sized like every other, and the title simply overhangs it. IB now
draws it at 14, having drawn it at 46 until 2026-08-16 to sit beside Industrial
Production. titleRule collapses its fill runs to zero rather than falling back
to a bare label, so an overhanging title keeps the bright brackets and
bright-white text a filled one has — which is what the capture shows. IB's item
labels are still laid out its own way (1) Troopers, unpadded, where BRE pads
each to the full 14), and the width grows past 14 when a translated label needs
it, since sizing to content is what produces 14 in the first place.
InterPlanetary Operations is the one box whose width moves — 58, 62, 64 and 68 all appear, because the Terrorist Ops price column grows with the figure it carries. Take 62 from the block below only as one sample.
| Menu | Accent |
|---|---|
Opening menu (Barren Realms Elite) |
35 magenta |
| See Scores / Regions buy / Attack Menu / Advisors | 35 magenta |
| Diplomacy Menu / Sell Menu | 32 green |
| Crazy Gold Bank / Food Unlimited / Preferences | 36 cyan |
| Spending Menu / Industrial Production / Trading / Specialization / Special Operations / Terrorist Ops | 31 red |
| System Menu | 34 blue |
| InterPlanetary Operations | 33 yellow |
| InterBBS Scores / Attack Pirates | 90 bright-black (gray) |
The whole table was re-read from the captures on 2026-08-16 by matching the SGR
run in front of each [Title]. Every menu is consistent across all five
captures. Diplomacy is GREEN, not cyan — this file said cyan until then, and
all four captures that contain the menu draw its rule 32 and its brackets
1;32. (IB's code was already green; only the doc was wrong.)
The two gray menus put the accent on the rule and the parentheses only: their
title brackets are plain white 37 and their hotkeys 1;37 bright-white, where
every other menu brightens its own accent for both.
Data-value convention (status, income, bank, food, end-of-turn): the numbers
are 96 bright-cyan, the surrounding label text 37 white. Maintenance-paid /
food-consumed lines and the Spending-Menu Price/#Owned columns use 97
bright-white numbers instead — and so does a menu's own status footer
(You have N gold and N turns., …and N units of food.), on every menu that
carries one.
Daily maintenance (login, before the opening menu)¶
Captured live in cap/treaty-order-20260817.cap. The header carries a 93
bright-yellow ■ marker and 37 white text; each task is its own line
indented 5 columns, printed as it is carried out and scrolled up a line at a
time; the closing line is 97 bright-white. The tasks BRE names in order:
- checking for dead empires
- the news bulletin
- covert operations
- investment and loan information
- packing trade deals / covert operations / treaties
- awarding the Planetary Master
- depositing trading market money
- duplicate scanning files
- inbound and outbound doomsday attacks
- old recons
- transfer times
- duplicate users
- SpyGuys
- packing data packets
■ Running Daily Maintenance
Checking for Dead Empires
Updating Daily News Bulletin
Processing Covert Operations
...
Daily Maintainence Complete
Deliberate divergence: IB names its own tasks, in its own words, and lists only the ones that had something to do — its maintenance is not BRE's, and half those lines belong to file formats IB does not have. The shape (marker, header, indented task lines, bright closing line) is the same.
Opening menu (top-level)¶
Shown after login and after each news screen. Magenta accent; two columns.
───────────────[Barren Realms Elite]────────────────
(1) Play Game (8) Game Bulletins
(2) See Status (9) InterPlanetary Ops
(3) See Scores (A) Game Instructions
(4) See Today's News (B) Help Database
(5) See Yesterday's News (P) Preferences
(6) Read Messages (0) Quit
(7) Send Messages
────────────────────────────────────────────────────
Choice> Play Game
52 columns, not the 47/48 this block used to draw: 15 ─, [Barren Realms
Elite], 16 ─, closing rule 52. That is exactly its content — two 26-column
item cells ((1) plus a 22-column label field).
Daily News File / Daily Bulletin¶
Header line: 93 bright-yellow Barren Realms Elite + 97 v0.988 + 37
: News File with the date right-aligned. Then a blank line, then the banner,
indented 24 columns — centerd over the 75-column rule below it, not over the
80-column screen: 31 red ── + 91 bright-red ═ + 97 bright-white
The Queen's Quadrant + 91 ═ + 31 ──, then a full-width 33 yellow rule.
The banner's inner glyphs are ═ (CP437 0xCD), not »/«. This file
recorded them as guillemets until 2026-08-16; the bytes around the title in
bre-01-color.cap read c4 c4 … cd … cd … c4 c4. The same idiom draws the
──═Planetary Post═── and ──═Planetary Treaties═── banners, which this file
already had right — three screens, one decoration. (The ─»>Paused<«─ bar is a
different decoration and really is 0xAF/0xAE.)
The Daily Bulletin box has a 34 blue border with 97 bright-white
Daily Bulletin in the top edge. Three rows; label 37 white, value 36 cyan,
Change: 37 white. Positive change = 92 bright-green + then 96
bright-cyan value; negative change = 96 bright-cyan for the whole thing
(minus sign included — direction is not color-coded).
IB matched this on 2026-08-16, having drawn a rise in 32 green and a fall
in 31 red. The old coloring was also a contrast defect: 31 red on black
measures 2.7:1 on the VGA palette (#AA0000, relative luminance 0.0853,
(0.0853 + 0.05) / 0.05), under the 4.5:1 text minimum. 96 bright cyan is
17.1:1 and 92 bright green 15.8:1, both far clear of it. Nothing is lost by
dropping the red/green pairing, because the +/- sign already carries
direction on its own — including in a monochrome or ANSI-less session.
The box is drawn in SINGLE-line CP437, ┌ ─ ┐ │ └ ┘, and is 66 columns wide
— not the double ╔ ═ ╗ ║ ╚ ╝ at 68 this block used to show. Indented 4; top
edge is ┌ + 25 ─ + Daily Bulletin + 25 ─ + ┐, bottom └ + 64 ─ +
┘. Measured identically in bre-01-color.cap and the public-board capture.
In a league IB puts the board's name and an em dash ahead of Daily Bulletin in
that top edge, and the edge is sized to the title. The width has to be measured
in the caller's OWN charset: a CP437 or ASCII terminal is sent -- for the em
dash, so a rune count made the top edge a column longer than the box under it
(#192).
──═The Queen's Quadrant═──
───────────────────────────────────────────────────────────────────────────
┌─────────────────────────Daily Bulletin─────────────────────────┐
│ Total Population: 185,861 Change: +19243 │
│ Total Regions: 25,283 Change: +1167 │
│ Total Net Worth: 2720k Change: +616k │
└────────────────────────────────────────────────────────────────┘
Below the box, the news items. Each item starts with 31 red ── + 91
bright-red ─ arrow, then 37 white body; wrapped continuation lines indent 5
spaces. A blank line separates every item. In-line highlights, read off a
live capture in cap/ (2026-08-13) and confirmed against a second session two
weeks earlier:
| element | code |
|---|---|
| every empire — the reader's own included | 1;33 bright-yellow |
| pirate factions (Humans, Barbarians, Spacians, …) | 31 red, returning to 37 |
| numbers | 1;37 bright-white |
Planetary Master title |
1;37 bright-white |
The Queen Royale actor |
1;31 bright-red |
BRE gives your own realm no distinct color in the news — three different
realms in a single captured screen all render 1;33. A realm name has no one
color in BRE: the same name renders 1;36 on the recap and in message headers,
1;33 here and at the target-picker echo, and 37 in plain lists. Take the
color from the screen, never from a sibling screen.
Deliberate divergence: IB paints pirate factions 1;31 bright-red, not BRE's
31. Plain red on black measures 2.71:1, below the 4.5:1 floor for text, and
the faction name is the payload of a raid item. Brightening keeps BRE's hue and
reaches ~5.2:1. Everything else on this screen matches.
Today's News and Yesterday's News use this same layout. (IB is free to reword the prose — clean-room — this records BRE's wording and coloring only.)
See Scores (local planet)¶
Title -* 91 red + 97 bright-white Barren Realms Elite + *- red. Column
header row 97 bright-white. The border mixes single ─ and a ══ double-line
accent over the name column. Each row: 35(()+97key +35) + a flag
column + 37 white name + 95
bright-magenta Territory + 97 bright-white Score + 37 white Net Worth.
The + flag is BRE's own, meaning unverified. This file has called it
"participating this reset", and elsewhere just "marks it in the list". Neither
survives the 2026-08-16 capture: across one session the flag moved on and off
individual realms with no reset in sight — a three-realm game showed all three
flagged, then A +, B —, C + after A played and attacked B, then
A +, B +, C — after B played. It is per-viewer or per-day state of some
kind and nobody has pinned which. Do not build anything on the current wording.
IB uses it for its own "played today" marker: a realm that played today but is
not online now gets + in the same column. The (O) online mark takes priority
when both apply.
IB diverges from BRE by suppressing the + for your own realm. BRE's
capture shows the flag on the caller's own row too ((E)+Your Empire); IB
omits it there — your own status is obvious from context, and the row is
already singled out by its bright-yellow name.
And IB draws it only in a league game (#249). Off a league every realm on this table is a neighbor the caller can attack, and the rows WITHOUT the mark then say which barons have not been on today — intelligence the original may hand out but IB does not. Whether BRE gates it the same way is unsettled: the 2026-08-16 capture above was not recorded with the game's InterBBS setting, so it cannot say whether a local-only planet shows the flag at all.
-*Barren Realms Elite*-
Id Empire Name Territory Score Net Worth
─────═══════════════───────────────────────────────────────────────────────
(A)+Empire One 6936 536115 1344439
(B)+Empire Two 5749 442683 692769
(E) Your Empire 1140 4260 24814
─────═══════════════───────────────────────────────────────────────────────
The rule is 75 columns — 5 ─, 15 ═, 55 ─ in 35 magenta, the same
figure the attack picker and the recipient picker draw, since one routine serves
all three. This block showed 72 (with a 10-column ═ accent) until 2026-08-16;
no capture produces that. Note the heading row is 72, three columns short of
its own rule — that mismatch is BRE's.
IB adds an online mark (#123). BRE has no online indicator; IB writes (O)
for a baron who acted within OnlineWindowSecs, hugging the LEFT of the empire
name inside the name field. Your own realm is never marked. Every local roster
carries it: the attack target picker and the recipient picker share
scoreTableRow/nameCell, and the Coordinator's Player List puts it in its
indent. The inter-BBS scores screen does NOT — those figures arrive in packets
that may be hours old, so there is nothing to report.
The protection flag is not in this field at all: a shielded realm wears its slot letter in brackets in the id column instead (see "Target list" above, #214), so the name field carries only the online mark.
The name field is measured in the caller's own charset. ValidRealmName
accepts any printable rune, so a realm may be named Iron—Fist; the CP437 and
plain-ASCII writers rewrite that em dash as two hyphens below every layer that
counts columns, and a rune count walked the figures one column right for the
default charset. nameCell takes Term and measures through visWidth /
fitColumn, the same pair the InterBBS Scores tables use (#192, #196).
An unmarked row reserves the mark's width, so the names stay in one column
either way; markWidth measures the translated letter rather than assuming one
character, since the O goes through tr.
The parentheses are 90 dark gray and the letter 37 gray. Measured on black:
the letter is 9.0:1 on the VGA palette and 16.7:1 on xterm's, comfortably
over 4.5:1. The parentheses are 2.8:1 on VGA (5.3:1 on xterm), under the 3:1
non-text minimum — they are deliberately dim framing, and the letter inside them
carries the meaning on its own, including on a monochrome or ANSI-less session.
Brightening them to 37 as well would make the mark compete with the empire
name it sits against, which is the thing a reader is scanning for.
An earlier revision drew the mark as a reverse-video 93+7 cell in the ID
column, in the slot BRE uses for its participation +. Changing it moved the
mark next to the name it describes; 3c4a789 is the commit.
Turn income, status block, maintenance¶
At turn start BRE prints the income lines (numbers 96 bright-cyan), then the
status block bordered by 34 blue rules, then the maintenance-paid lines (97
bright-white numbers).
Two different rule widths are in play here, both 34 blue inset rules. The
income lines open under a 75-column one (5 ─, 15 ═, 55 ─); the status
block is bracketed by a 70-column one (5 ─, 14 ═, 51 ─) above and
below. Nothing closes the maintenance lines — the pause follows them directly.
The rules are omitted from the block below only to keep the field list readable.
Deliberate divergence: BRE ends each manufacturing line with "were
manufactured by Industrial Zones." IB says that once, as a label, and lays the
units out ACROSS the line as bracketed [899 Troopers] cells — the Empire
Status block's own Military row, three to a line with the rest indented under
the first bracket — between two short blue rules. A type that built none is left
out, and a turn that built nothing prints nothing. It was one line per unit type
until 2026-09-10, which spent six lines of a screen the player reads every turn
on six figures.
The bank's returns close the block. After the manufacturing lines BRE prints
N gold was earned from investment returns. — the day's matured investments, and
the SAME figure on every turn of that day (cap/eots-ibbs-01.cap: one day's
14,699,020 repeated across all ten turns). IB adds a line above it for the
savings interest credited at the end of the previous turn, which BRE reports
nowhere; the wording is IB's own, in the style of the lines around it (#216).
227,717 gold was earned in taxes.
19,510 gold was produced from the Ore Mines.
4,380,288 gold was earned in Tourism.
15,490 gold was earned by Solar Power Generators.
120,384 gold was created by Hydropower.
4228 Food units were grown.
-*Your Empire*-
Turns: 10
Score: 4473
Gold: 6,156,219
Bank: 7,255,312
Population: 3386 Million (Tax Rate: 12%)
Popular Support: 100%
Food: 6441
Military: [42,259 Troopers]
[100% Morale]
Regions: [24 Rivers] [14 Agricultural] [5 Desert] [4 Urban]
[5 Mountains] [1088 Coastal]
You have 100 Years of Protection Left.
The status title -*name*- uses 96 bright-cyan -*/*- with 97 bright-white
name; every field value is 96 bright-cyan, labels 37 white.
There is no box. The block is a plain run of lines at column 0 — no border, no side rails, no fill. IB drew it as two boxed pages of its own invention until v0.0.4; both are gone and IB now renders the block above.
This paragraph said "no rule" until 2026-08-16, which the captures contradict:
the 70-column blue inset rule described above sits immediately before -*name*-
and immediately after the protection line. A rule above and below is not a box,
and both statements have to be made separately. IB draws both rules as of
2026-08-16; it drew neither before.
Deliberate divergence: IB itemizes the income differently from BRE — right-aligned amounts in one column, a subtotal rule, and a total line BRE does not print. The lines and their wording are BRE's.
IB drew a blue-backed Income Report bar of its own above them until
2026-08-25, where BRE has the 75-column rule and no heading at all. Corrected:
the rule is what opens the block now. That bar was the only filled-background
heading in the game, so the style went with it.
The capture is of a realm that holds little, and the block is shorter than the
field set. The status routine (BRE.OVR show_empire_status, 0x193b2) is a
straight run of if figure > 0 guards, so a zero field prints nothing at all.
Its string table declares every label in display order:
-*name*- Turns Score Gold Bank Population (Tax Rate) Popular Support
Food Agents Headquarters (N% Complete) Military SDI Strength Regions
Only Score, Population, Popular Support and Regions are unconditional; the rest
appear when their figure leaves zero. Military: prints None for an empty
army, and the Morale cell is left out entirely with it.
The Military and Regions rows are cells of [figure Label], and both break
onto continuation lines indented ten columns — under the first bracket, since
Military: and Regions: are both ten wide. The break is by cell count, not
width: a shared helper takes the threshold as an argument and is passed 3 for
Military and 4 for Regions. It compares the running count for equality,
so the row breaks exactly ONCE however many cells follow — a realm holding all
nine region types gets four cells then five. Morale always sits alone on the
line after the units.
Military cells are declared Troopers, Jets, Turrets, Tanks, Bombers, Carriers.
Region cells are Rivers, Agricultural, Desert, Industrial, Urban, Mountains,
Coastal, Technology, Waste — the ninth count at record +0xb6, absent from
that capture only because the realm held none; cap/nuke-waste-20260912.cap
shows it present, as the last cell of the row ([120 Waste]). That row order is the status
block's alone: the record itself, the Buy Regions screen and every other display
lead with Coastal (bre-save-format.md, +0x96).
Deliberate divergences, all of them IB's:
- Population is a head count, not millions. BRE stores population as a count
of millions and writes
3386 Million; IB counts people directly (seebalance_costs.go, "Population / migration"), so the line readsPopulation: 3,386 (Tax Rate: 12%)— the same figure the Civilian advisor and the Daily Bulletin's Total Population row print, in the same unit. - Figures are comma-grouped, as everywhere else in IB.
- Regions run in IB's one region order — the Buy Regions order the region table, the pickers and the record all use, Waste last. BRE re-sorts this row and nothing else; IB keeps a single order rather than carry a second one for one screen.
- Region and unit names are IB's singular labels (
[14 River]), the same strings the region table prints, rather than the plurals BRE writes here. - The rows break every 3 / 4 cells, not once, and break early when the next cell would reach the 80th column. IB's figures carry thousands separators and its region counts have passed 250,000 in a long game, where BRE's single break overruns the line and the terminal wraps it on top of the next.
- Nothing is added. IB shows BRE's field set and no more — no Debt, no net
worth.
Score:isEmpire.Score, the cumulative score the scores board ranks on (BRE reads it from record+0x286), not net worth.
A pirate raid suffered since the last play is reported as the report's last line, after the Industrial Zones production lines and before the pause, at column 0:
Rexxogans has captured 927 Turrets
The faction name carries its own color (1;35 here — the per-faction palette in
pirateColors), has captured is 37 white, the figure 1;36 bright cyan,
the unit word white. No trailing punctuation. It names exactly ONE thing: the
raid draws a single category (see docs/mechanics-reference.md). Deliberate
divergences: IB writes "have captured", since the faction names are plural;
indents the line two columns to sit with the rest of its income report; and puts
a blank line above it, where BRE runs it straight on from the last production
line.
The closing line is one of a pair — BRE.OVR holds You have Years of
Protection Left. beside This is year of your freedom., so the same slot
counts protection down and then counts up. BRE's turn is its year: protection is
a turn count it prints as years. Deliberate divergences: IB writes the first
as You have N turns of protection left., naming the unit Empire.Protection
actually holds — Andy has confirmed the altered wording. And it writes the second
as This is year N of your reign. "Freedom" reads as though the realm had been
captive, when what ended was the shield.
Crazy Gold Bank¶
Cyan accent, two columns. Followed by the gold-in-hand / in-bank line (both
figures 97 bright-white).
─────────────────────[Crazy Gold Bank]──────────────────────
(C) Cash Relief / Loans (L) List Investments / Loans
(D) Deposit Funds (V) View Bank Rates
(W) Withdraw Funds (0) Quit
(I) Investments
────────────────────────────────────────────────────────────
You have 4,582,875 gold in hand and 7,255,312 gold in the bank.
Choice> Quit
60 columns (21 ─, [Crazy Gold Bank], 22 ─), closing rule 60 — this
block drew 61/62 until 2026-08-16.
Deposit / Withdraw prompt form: Withdraw how many gold? (0; 7,255,312) — the
parenthetical is (minimum; maximum).
List Investments / Loans — captured in cap/eots-ibbs-01.cap, read from the binary¶
run_bank, key L (BRE.OVR 0x39A0C-0x39EA0). A blank line after the choice
echo, a header in 15 bright-white, a 45-column inset rule in 1;30 gray
(5 ─, 9 ═, 31 ─), one row per day slot that holds anything, then the same
rule again. There is no "nothing to list" line: an empty list is the header and
the two rules. The capture has no loans or hold; those parts are from the
binary alone.
Date Investments Loans Due
─────═════════───────────────────────────────
Today $ 88,194,129
08/16/2026 $259,433,437
08/17/2026 $732,227,077
08/18/2026 $335,569,488
08/24/2026 $193,182,690
─────═════════───────────────────────────────
- Rows run over the twelve slots in order: slot 0 is
Today, slots 1-10 are the date that many days ahead (the date string cut to ten characters), slot 11 isIn Hold. Labels are10bright-green. - Each figure is
07$then the number in15, comma-grouped and right-aligned to the widest figure in its column. Both widths start from the value 5, so neither is under one digit. - After an investment figure come
16 - widthspaces; a row with no investment writes twenty spaces there, so the loan column does not move. - The hold is stored in thousands. Its column width is sized from the thousands,
and the row prints them right-aligned to
width - 4with,000after.
IB builds the rows from its own records rather than slots: its Today row is the
day's unpaid returns and the realm's Debt, and a loan or investment due today
or earlier joins it.
Spending Menu¶
Red accent. Decoration line is 44 columns wide (14 fill + [Spending Menu] +
15 fill). Columnar: Key Item / Price / # Owned header (37 white); each row has
31(()+91key +31) + 37 white label, then 97 bright-white Price
and 37 white # Owned right-aligned. (*) System Menu, (S) Sell,
(V) Visit Bank, (?) Help, (0) Quit carry no price/count.
──────────────[Spending Menu]───────────────
Key Item Price # Owned
(*) System Menu
(1) Troopers 250 42259
(2) Jets 318 0
(3) Turrets 359 0
(4) Bombers 3006 0
(5) HeadQuarters 6580 0
(6) Regions 38537 1140
(7) Covert Agents 895 0
(8) Tanks 2020 0
(9) Carriers 5315 0
(S) Sell
(V) Visit Bank
(?) Help
(0) Quit
────────────────────────────────────────────
You have 4,582,875 gold and 9 turns.
Prices drift turn to turn (region-cost-change setting); # Owned is live.
IB diverges on (2) Jets: an order of more than 100 is followed by a wrapped
line and an Include carriers? (y/N) question, which BRE does not ask. And on
(9) Carriers: a realm holding more jets than its carriers can lift is told
the shortfall before the quantity prompt. See "Screen output that deliberately
diverges" in docs/mechanics-reference.md.
The footer's turn count is the turns remaining after the current one, so it is one less than the Empire Status "Turns:" line (10 there, "9 turns" here); the last turn of the day reads "0 turns".
Regions buy screen (Spending → Regions)¶
There are 138,322 Regions available.
Note: Region prices are constantly changing. Therefore, the region price
shown is only the price for the first piece of territory you buy.
You can afford 274 regions.
Key Name Owned
─────═════───────────────
(C) Coastal 1088
(R) River 24
(A) Agricultural 14
(D) Desert 5
(I) Industrial 0
(U) Urban 4
(M) Mountain 5
(T) Technology 0
(*) Advisors
─────═════───────────────
Your choice?
Same 25-column rule and the same colors as the captured-region picker above —
one routine draws both. There are N Regions available and You can afford N
carry their figures in 96 bright-cyan against 37 white body.
Picking a region type prints its one-paragraph blurb, then
Buy how many <Type> regions? (0; <max>).
After a purchase, BRE stays on the region-type picker (Your choice?) so more
types can be bought in the same visit — unless no further region could be
bought, in which case it returns to the Spending Menu. Two separate causes were
observed: gold exhausted (five max-affordable buys, each exiting), and the land
allowance exhausted (a 51-region buy that left 668,204 gold against a 24,281
price, and still exited). A partial buy with both gold and allowance remaining
(15 of 44) stayed on the picker. So the trigger is "cannot buy another region",
not "bought the maximum offered" and not gold alone.
The buy screen states the land remaining (There are 49,451 Regions available).
This is the realm's own Daily Land Creation allowance, not a shared planetary
pool — see the binary-verified note on Empire.LandAvailable in
internal/game/game.go. Live captures agree: the figure fell 49,623 → 49,451
across a 172-region purchase, i.e. by exactly what this realm bought.
Once the allowance is spent, selecting (6) Regions prints
no land is available at this time above a redrawn Spending Menu — the region
screen never appears. Observed to persist across a turn boundary, so the top-up
comes with daily maintenance rather than each turn. You can afford N is
min(affordable, allowance remaining), so a quoted N is not by itself evidence
about price.
IB's buyLand (internal/menu/actions_regions.go) loops the picker until the
player quits with 0, which matches the partial-purchase case but keeps looping
when gold runs out.
Diplomacy Menu¶
Green accent (32 rule and parens, 1;32 brackets and hotkeys), single
column. (Reached pre-turn in this build, and from the System Menu.) This section
said cyan until 2026-08-16; see the accent table above for the evidence.
──────[Diplomacy Menu]──────
(1) Tariff Trade Agreement
(2) Protective Trade
(3) Free Trade Agreement
(4) Terrorist Prevention
(5) Intelligence Alliance
(6) Technology Agreement
(7) Full Defense Alliance
(8) Declaration Of War
(9) View Treaties
(?) Help
(0) Quit
────────────────────────────
Choice> Quit
Industrial Production (Change Production display)¶
Red accent. Shown before the Change Production? (y/N) prompt.
───────────[Industrial Production]────────────
Troopers : 0% (0 per year)
Jets : 0% (0 per year)
Turrets : 0% (0 per year)
Bombers : 0% (0 per year)
Tanks : 0% (0 per year)
Carriers : 0% (0 per year)
──────────────────────────────────────────────
Change Production? (y/N) No
InterPlanetary Operations¶
Yellow accent, two columns. Terrorist Ops shows a cost figure next to the
label — the launcher's region count × 64 at the default Terrorist Costs
setting, so it climbs as the realm buys land. The 72,960 below is 1,140
regions; a second capture (cap/eots-ibbs-01.cap) gives 541,824 / 542,144 /
542,336 / 542,976 against 8,466 / 8,471 / 8,474 / 8,484 regions, every one
exact; a third on 2026-08-16 gives 47,232 against 738. The derivation and the
one term still unpinned are in docs/mechanics-reference.md.
The 64 is the Medium figure — the sysop's Terrorist Costs knob scales it.
Set to High, a 15-region realm was quoted 2,880, which is
15 × 64 × 3. So the multiplier is a preset factor and 64 is its Medium value;
×3 for High is one sample and the Low / None factors were not measured, so
UNVERIFIED beyond that. This is the opposite of the local covert fees, which
the same experiment proved do not move at all (see Covert Operations).
Colors, from cap/eots-ibbs-01.cap: the rule is 33 yellow with the brackets
1;33 bright yellow and the title 1;37 bright white; each item is a 33
yellow paren around a 1;33 bright-yellow key, then a 37 white label, and the
cost figure is 37 white. This is the same accent/dim/bright-white split the
menu engine's titleRule already draws.
─────────────────[InterPlanetary Operations]──────────────────
(1) View IPScores (9) Gooie Kablooie Ops
(2) Terrorist Ops 72,960 (A) SDI Program
(3) Send Trade Deal (D) Diplomacy List
(4) Create Group Attack (S) Spy Database
(5) Join Group Attack (T) Travel Times
(6) Indiv. Attack Force (V) Visit Bank
(7) Send Message (?) Help
(8) Special Operations (0) Quit
──────────────────────────────────────────────────────────────
You have 0 gold.
Gates seen: Sorry....You are under New Realm Protection! (Terrorist / Special
Ops while protected), There are not any attack parties at this time. (Join
Group Attack — its table, when parties ARE forming, is its own section below).
Send Trade Deal (3). The sending flow is not captured; it was read out of
the binary instead (#195). A different routine from the local deal —
send_trade_offer (BRE.OVR 0x24212), whose only caller is the InterBBS menu.
The block that used to sit here was the LOCAL deal and has moved to the Trading
section, which is what wired IB's interplanetary item to the local mechanic.
The order it asks in: planet, then realm, then goods, then the price.
select_planet (0x021dd9) takes a planet name or number, or a key that lists
them, and refuses two answers outright by returning 0 — your own planet
(cmp ax,[0x6795] at 0x18a6) and a planet you hold no data on — so the item
cannot reach a realm at home. It then prints your standing with the planet
chosen. select_player (0x022a0c) takes a letter A-Y, a raw index into that
planet's 25-slot roster with the gaps left in, validated against the slot's own
id being non-zero; ? lists the roster and / searches it by name.
Planets are chosen by name or number, players by LETTER — that split is the original's throughout, and IB matches it as of 2026-08-26. Its interplanetary baron list was numbered until then, the last place a player was picked any other way; it draws the same lettered score table the local target lists use now.
A flat fee, no day span, no treaty. It calls the same cost routine the local
deal does (calculate_trade_offer_cost, 0x0513e7) and then simply stops: no
multiply by days, no Protective Trade divisor, no days prompt. The formula is the
nine goods against fixed weights, over five, plus a 100,000 base, scaled by the
sysop's Trade Deal Costs ladder and capped at two billion. Neither realm needs a
pact — the routine reads no relation field and holds no relation string, where
the local one refuses a realm you have no pact with.
The arrival gets no choice. resolve_received_trade_offer (0x043df1) checks
for a duplicate, checks the target's stored id against the letter, and credits
every good straight onto the realm, each capped at two billion. It files a
private report for each side and writes no news at all — no .dat template
carries a trade-deal category. A deal aimed at a realm under New Realm Protection
is DESTROYED: the routine returns, and neither side is told. IB refuses that
target at the picker instead; see docs/mechanics-reference.md.
Carriers are sized to the cargo (ovr_050dfb_entry_0436): troopers 1,000 to
a carrier, jets 100, turrets 1,000, tanks 5,000, gold 100,000, with food,
bombers, agents and carriers riding free — summed and rounded up as a total.
A capture has the original asking for twenty.
The receiving side IS captured: cap/20240527-134Pho_Lazarus_Public.cap
carries 13 arrivals, each a header naming the realm and its planet over an
indented list of what was shipped. Gold is in eleven of them, one is a mixed
shipment, ten are the same sender to the same recipient in a single run — so
nothing caps how many a realm may send in a day.
Travel Times (T). Captured 2026-08-16: a 37 white heading
Average Turn Around Times to All BBSes, then the 78-column inset rule
(5 ─, 15 ═, 58 ─) in 90 gray above and below the rows. Each row is the
planet name in 37 white in a 30-column field, then the figure.
Average Turn Around Times to All BBSes
─────═══════════════───────────────────────────────────────────────────────
Test Planet Two No Data
─────═══════════════───────────────────────────────────────────────────────
A board with no measured round trip reads No Data, in 31 red — not a
zero and not a blank. The planet N.NN hours form this file recorded is the
measured case only; both belong in the same column. (31 red on black measures
2.7:1 on the VGA palette, under the 4.5:1 minimum — IB should not copy the
color for its own "no data" state, and the word carries the meaning without it.)
IB adds the measurement's AGE, which the original has nowhere. The stored
average is a bare number with no timestamp in either game, so a link that stops
delivering leaves its last good figure on the screen indefinitely — a board read
40 minutes through a three-day outage, which is the one thing this screen
exists to rule out. IB stamps each arrival (World.TravelSeen) and appends
(N days old) past TravelStaleDays:
Nite Eyes 40 minutes (3 days old)
Fresh Board 2 minutes
Never Answered No Data
It is words rather than a color, for the reason the red above is called out: the note has to survive a monochrome terminal, and how old is what the reader needs, which no color carries. A figure whose arrival was never stamped — a world saved before this was kept — is left unmarked rather than guessed at either way.
SDI Program (A):
Total Funding: 0,000 Gold
Yearly Maintenance: 0 Gold
Funding / Region: 0,000 Gold
Current SDI Strength: 0%
Maximum productive spending this year is: 250,000 Gold.
Note: You should only fund the SDI in increments of 1000 Gold.
Add how much gold for funding? (0; 0)
Colors, re-captured 2026-08-16 and confirmed: labels white 37, every figure
bright-yellow 1;33, the Note line gray 1;30. After funding it prints
N Gold added. then Current SDI Strength: N% again — and those two lines
put their figures in 97 bright-white, not the bright-yellow the report lines
above use. See the SDI section at the end of this file for the seventeen
captured funding levels and what they establish.
The same run funded an empty program with 250,000 gold at 738 regions and got
5%, which is trunc(sqrt(250000 / (10 × 739))) exactly — an independent
check of the curve on a realm three orders of magnitude smaller than the one it
was derived from.
The menu's own keys, from the capture: Gooie Kablooie Ops is 9, not a letter, and Terrorist Ops carries a gold cost in the menu's price column (471,360 / 532,544 / 533,568 across the capture — it grows with something, and three points do not say what).
The Gooie Kablooie defense screen — NO CAPTURE, two IB choices. This is the
turn stage that offers the planet's barons a sortie against a weapon on the
ground (stage 12 of run_player_turn), not the Ops item above it. Its strings
are read out of launch_gooie_kablooie and its geometry is unknown, so two
things on it are IB's and are not to be "corrected" against the original:
- The weapon list is framed by a
rule75above and below, the divider the scores board and Travel Times draw. BRE sizes each box to its own content and there is no capture of this one to take a width from. - The prompt reads
Enter Gooie Number (0 to cancel)?, where the string in the binary is the bareEnter Gooie Number. BRE's bounded-integer reader supplies its own limit text, which IB'spromptIntdoes not, so the cancel key is said in the message instead — the form the vote, help and diplomacy pickers already use. The string is a new msgid: de and ru show the English until the next translation pass.
It quotes NO required-jets figure, and must not. IB printed
It would take N jets to destroy one outright. under the table until
2026-09-15, off AnnihilatorJetsNeeded. It was invented here and it was wrong
twice over: the original's screen has no such line — its whole string set is the
yes/no, the no-jets refusal, the two headings, Enter Gooie Number, Send how
many Jets?, Jets were destroyed in the attack!, DESTROYED! and % of the
Gooie Destroyed!, and take/need/would match nothing in the binary at all —
and the number named the full requirement while a sortie is capped at 75%, so a
baron who sent exactly it got 75% and burned the last quarter of their wing for
nothing. The player judges the weapon from Strength and Days Until
Self-Destruct, as the original leaves them to.
Terrorist Ops (2), captured 2026-08-26 in cap/eots-ibbs-01.cap. Nine
numbered operations and a Quit, in this order, and no price column — the cost
is quoted once on the parent menu beside the item, not per operation, which is
where it differs from Special Operations below.
────[Terrorist Ops]────
(1) Send Spy
(2) Bomb Intelligence
(3) Demoralize
(4) Cause Dissensions
(5) Bomb AirBases
(6) Stir Emigrations
(7) Spread Propaganda
(8) Bomb Food Stores
(9) Sabotage HQ
(0) Quit
───────────────────────
Every menu box in every capture, measured (cap/*.cap, 2026-08-26), so the
next screen has a number to size itself from rather than a default to fall back
on:
| box | columns | box | columns | |
|---|---|---|---|---|
| Advisors | 16 | Preferences | 36 | |
| Trading | 20 | InterBBS Scores | 38 | |
| Attack Type | 21 | Sell Menu | 44 | |
| Attack Menu | 23 | Spending Menu | 44 | |
| Terrorist Ops | 23 | Industrial Production | 46 | |
| IP Messages | 24 | Barren Realms Elite | 52 | |
| Coordinator Ops | 26 | Crazy Gold Bank | 60 | |
| Diplomacy Menu | 28 | Food Unlimited | 64 | |
| Covert Operations | 32 | System Menu | 69 (75 once) |
InterPlanetary Operations is the one that moves — 58, 62, 64 and 68 across the
captures — because the original lays it out in columns and its width tracks
whichever items are showing. Sizing to content is the rule, not any of these
numbers; a box that has to hold more is wider, and IB's Covert (34) and System
(59 English) are wider than the original's for exactly that reason.
Two ruled screens are not boxes and are not in that table: the Join Group Attack
table runs 79 columns and the Attack Type help's topic list 75, both
from cap/eots-ibbs-02.cap.
IB sizes its rules from its own rendered body as of 2026-08-26, taking a
declared Width as a FLOOR rather than a fixed value. A width measured against
English goes stale the day a label is translated — System was set to the 59 it
measured in English and ran 64 in German and Russian, leaving its box five
columns short of its own items, and the Bank overran its rule by two in English
alone.
The Terrorist Ops box is 23 columns — four CP437 0xC4 rules,
[Terrorist Ops], four more, with every item line padded to the same 23 and the
closing rule 23 long.
IB drew it at the 62-column rule default until 2026-08-26, since no capture of
this screen existed to size it from. That is the trap AGENTS.md names: the
original sizes each box to its own content, and the captures in this file run
16, 20, 21, 23, 28, 32, 38, 44, 46 and 52 columns with no house width among them.
Item names, keys and order match IB's exactly, with one deliberate divergence:
IB's item 3 is Trade, a submenu, where the original's is Send Trade Deal
itself. That deal, the interplanetary markets and the bids still out are the
three halves of one activity, and IB had them on two unrelated-looking items —
(3) Send Trade Deal and a (B) Trading of its own making. The submenu holds
all three; Send Trade Deal keeps its turn gate inside it (#162).
Special Operations (8) is numbered 1-8 with no Help item, and prices its first four entries:
- Bomb Food Market 10,000,000
- Bomb Trading Market 25,000,000
- Bomb Trade Routes 25,000,000
- Undermine Investments 75,000,000
Nuclear Assault, Chemical Bombing, S3-Sabre and Send SpyGuy show no price on the menu — Send SpyGuy quotes its own ("A SpyGuy will cost 10,810,500 gold per day") after the target is named.
Diplomacy List (D): the Planetary Treaties chart — see the section at the
end of this file for its measurements, colors and the screen that edits it.
Spy Database (S): prompts Select Planet to view players: /
Enter Planet Name or Number (? for list):. ? lists planets with an operator
location column (## Planet Name Location); selecting one prints
Our current relations with <planet>: <relation> then any known players.
IB diverges here, deliberately. BRE stores one report per realm, and a new
one overwrites it (see the Send Spy note in docs/mechanics-reference.md).
IB's viewer groups the last five reports on each realm, each stamped with when
it arrived, under the realm's name with the change between the last two, and a
Send Spy that gets in also reads its figures out on the sender's own report. A
spy sent before and after a strike can therefore be compared. No number, cost
or odds changes.
The planet prompt is shared by every interplanetary screen that asks for one,
and its colors are (from cap/eots-ibbs-01.cap): the label and the trailing
: white (0;40;37), the parens bright black (1;30), the ? bright white
(1;37), and what the caller types echoing bright yellow (1;33).
Enter Planet Name or Number (? for list): Starship Junkyard
InterBBS Scores (IP Ops → View IPScores)¶
IB substitutes its own name in the title, deliberately. The original heads
this screen with its product name (Barren Realms Elite: Top Planets by Score),
so cloning the layout faithfully means putting OURS there — a title is branding,
not a mechanic, and the license line is that IB may replicate the original's
shape but never present itself as the original. IB printed the original's name
here until 2026-08-23, which is the one place in the whole game it ever did.
Colors and geometry are unchanged.
Gray accent. A menu of eight ranking views + Quit; each opens a »Planetary
Post« table.
──────────[InterBBS Scores]───────────
(1) Top Planets by Score
(2) Top Planets by Net Worth
(3) Top Planets by Land
(4) Top Planets by Net Worth Density
(5) Top Players by Score
(6) Top Players by Net Worth
(7) Top Players by Land
(8) Top Players by Net Worth Density
(0) Quit
──────────────────────────────────────
Planet table: ( n) <name> <value> (value right-aligned; header names the
metric, e.g. Score, Net Worth, Land, Net Worth / Region). Player tables
add a Planet column.
Barren Realms Elite: Top Planets by Score
──═Planetary Post═──
Name Score
────────────────────────────────────────────────────────────────────────
( 1) Planet A 1321561
( 2) Planet B 1254755
Colors and geometry, from bre-01-color.cap: the title line is 97
bright-white Barren Realms Elite + 90 gray : + 91 bright-red metric
name. The banner is the same ──═…═── decoration as the news masthead — 31
red ──, 91 bright-red ═, 97 bright-white title — indented 26. The
heading row is 97 bright-white and the rule under it is 72 columns of
plain ─ in 90 gray (this block drew 52 until 2026-08-16, and the banner as
»…«). Each row: 31 red ( + 91 bright-red right-aligned number + 31
) + 37 white name + 97 bright-white value.
The player tables put Planet LAST, after the metric — captured in
cap/20240527-134Pho_Lazarus_Public.cap and
cap/121125-666H4H_Camembert_Public.cap. All four player views share one
geometry: Name at column 6, the metric right-aligned to column 46 (the
same column the planet table's metric ends on, so the two shapes agree), then
Planet beginning at column 51, for a 57-column heading under the same
72-column rule.
Name Land Planet
Name Score Planet
Name Net Worth Planet
Name Net Worth / Region Planet
IB draws this shape as of 2026-08-26; it had the two reversed — Planet
second at column 33 and the metric last, a 66-column heading — until #196, and
its planet table ended on column 53 rather than 46. Not established: the
Planet column's width and whether it truncates. Neither capture has a data row
under that heading, so only the geometry above is proven; IB fits Planet to 21
columns, which ends it on the rule.
The rule is WIDER than the table on purpose. 72 columns of ─ over a
46-column planet table and a 57-column player table. It is not misalignment and
must not be "corrected".
Attack Menu (InterBBS, local attacks OFF)¶
With local player-vs-player attacks disabled, the Attack Menu collapses to just the pirate/alliance options (contrast the full Attack Menu near the top of this file, which lists Regular/Nuclear/Chemical/Biological). Magenta accent.
─────[Attack Menu]─────
(P) Attack Pirates
(A) Alliance Strength
(V) Visit Bank
(?) Help
(0) Quit
───────────────────────
Attack Pirates (gray accent) — BRE's nine faction names (IB renames these):
[Attack Pirates]
(1) Humans
(2) Barbarians
(3) Solarians
(4) Sharks
(5) Mechanoids
(6) Rexxogans
(7) Xandorians
(8) Monitorians
(9) Spacians
(0) Quit
Alliance Strength (A): a Name / Troopers / Tanks / Agents table ending in a
Total Forces NONE NONE NONE line when you have no allies.
End of Turn Statistics¶
Heading 97 bright-white, then 34 blue inset rules — 75 columns, 5 ─,
15 ═, 55 ─, the same rule that opens the income lines. Opens with a
support-flavor line, then population change and food spoilage (numbers 96
bright-cyan), then Do you wish to continue? (Y/n).
End of Turn Statistics
─────═══════════════───────────────────────────────────────────────────────
Your people have great faith in you as an excellent ruler!
Your dominion gained 380 million people.
57 units of food spoiled.
─────═══════════════───────────────────────────────────────────────────────
Do you wish to continue? (Y/n) Yes
A turn with no migration still prints the population line, as Your dominion
gained 0 million people. (twice in cap/kd3-01.cap, both on riot turns).
process_end_of_turn (BRE.OVR 0x00ce97) references only two strings for it,
Your dominion gained and Your dominion lost, so zero has no wording of its
own. IB printed nothing at all on a zero turn until 2026-08-18 — most often
hit by a realm with an empty granary, whose growth is forced to zero.
This block drew both rules as plain 75-column runs until 2026-08-16; the ═
accent is in bre-01-color.cap and cap/eots-ibbs-01.cap alike. IB draws
both rules as of 2026-08-16; it drew a bare heading and no rules before. Its
heading keeps IB's own bright-cyan End of Turn Statistics: where BRE writes it
bright-white without the colon, and its body lines are indented two columns.
Food Unlimited (Food Market)¶
Cyan accent, single row of options. Preceded by the market line (available,
buying for, selling for — all figures 96 bright-cyan).
We have 6,851,917 units of food available today.
We are buying for 9 and selling for 26.
────────────────────────[Food Unlimited]────────────────────────
(B) Buy Food (S) Sell Food (V) Visit Bank (0) Quit
────────────────────────────────────────────────────────────────
You have 3,229,328 gold and 5321 units of food.
IB matches this since 2026-09-17, footer included. It had drawn the market
as an ordinary priced menu with a # Owned column, which printed the one food
holding twice — once on the Buy row and once on the Sell row — while the footer
carried the supply and the gold. The holding now sits in the footer beside the
gold, in the sentence above, and the supply line moved to the header, above the
title rule, where the original puts it. The two were one line briefly and ran to
89 columns, which is the other reason the original splits them.
Then the per-turn feed prompts: Your People Need N units of food /
How much will you give? (N; N) and Your Armed Forces Require N units of food.
Gold maintenance sequence (captured live 2026-07-29)¶
Runs at the start of a turn with Auto-Pay Maintenance off, in this exact order.
Each figure is bright cyan against plain white body text, with the (…; …) pair
bright blue / bright cyan / dark cyan as elsewhere.
Your Armed Forces Require 682 gold.
How much will you give? (682; 682)
267,340 gold is required to maintain your regions.
How much will you give? (267,340; 267,340)
50,386 gold is requested to boost popular support.
How much will you give? (50,386; 75,579)
The Queen Royale requires 52,415 gold for Taxes.
How much will you give? (52,415; 780,295)
Two things to note in the prompt pairs:
- Forces and regions pass
(required; required)— the maximum is the amount owed, so a solvent baron cannot overpay them. - The crown tax passes
(required; gold on hand)— you may hand the Queen far more than she asks. The support boost is similar but capped at 1.5x requested. - The low number is a suggestion, not a floor: typing
0at any of these is accepted, and was confirmed live at the crown-tax prompt.
Underpaying any required item raises, after the sequence:
Your actions may lead to DISASTEROUS results.
Would you like to reconsider? (Y/n)
DISASTEROUS is the original's own spelling and capitalisation, recorded here
for fidelity reference; IB uses its own wording (see the clean-room note).
Answering yes restarts the whole sequence from the bank prompt.
With Auto-Pay Maintenance on and enough gold on hand, the entire sequence above collapses to two lines in the post-status block, with no prompts at all:
5,707,154 Gold paid.
29,164 units of Food consumed.
That single total is the best arithmetic probe in the game — see the Auto-Pay
section of the bre-gather skill for how to decompose it.
Those two lines only appear together when the realm fed itself. The second
one is the silent feed's own announcement, and what follows the block depends on
how maintenance was paid and whether the Food Market opened. Four shapes, from
cap/eots-ibbs-01.cap (13 market turns, 131 silent), cap/kd3-01.cap and
cap/121125-666H4H_Camembert_Public.cap (9 market turns):
auto-pay, fed itself 5,707,154 Gold paid.
29,164 units of Food consumed.
<- blank line
─»>Paused<«─
[Crazy Gold Bank]
auto-pay, market 45,115,582 Gold paid.
─»>Paused<«─ <- no blank line above it
We have 26,744,605 units of food available today.
paid by hand, market The Queen Royale requires 313,176 gold for Taxes.
How much will you give? (313,176; 195,988,719) 313176
We have 1,991,547,608 units of food available today.
paid by hand, fed How much will you give? (2,879,687; 632,675,991) 2879687
90,997 units of Food consumed.
<- blank line
[Crazy Gold Bank]
Two things to take from that. The pause follows the auto-pay summary, which
is the one line nobody has answered a prompt for — pay by hand and the market
opens straight off the last payment prompt. And the market path never prints
units of Food consumed.: the string has a single reference in either binary
(run_player_turn__branch_0821, BRE.EXE 0x3c81) and both market routes jump
past it. The ─»>Paused<«─ bar sits directly under Gold paid. with no blank
line, unlike the one under the consumed line, which has one.
System Menu (InterBBS grid)¶
Blue accent, three columns. In InterBBS mode it carries two extra rows —
(G) Game Setup and (I) InterBBS Scores — beyond the base set.
───────────────────────────────[System Menu]───────────────────────────────
(#) Abdicate (M) Messages (W) Write Macros
(A) Visit Advisors (P) Preferences (1) Set Industries
(D) Diplomacy (R) Set Tax Rate (2) Show Instructions
(E) Empire Status (S) See Scores (3) Specialize Industry
(F) Food Market (T) Trading (4) Spy Database
(G) Game Setup (V) Visit Bank (0) Quit
(I) InterBBS Scores
───────────────────────────────────────────────────────────────────────────
- Set Tax Rate (R):
New Tax Rate [0-100, Current Tax Rate = 20]? - Game Setup (G): the read-only ruleset dump. Re-captured 2026-08-16, and
it is bracketed above and below by a 78-column inset rule (5
─, 15═, 58─) in90gray, which this block omitted entirely. Labels are37white and values97bright-white — except the board count in the InterBBS sentence and the threeGooie Kablooies/Bombing Ops/Missile Opstoggles on the last line, which are93bright-yellow.
Game Started: 7/8/2026
Turns per day: 10
Protection Turns: 120
Daily Land Creation: 3000
Planetary Tax Rate: 10.0%
Maximum Players: 25
Bank Interest Rate: 10.0%
Investment Rate: 8.0%
Maintenance Costs: Medium Region Cost Change: Medium
Trade Deal Costs: Medium Attack Damage: Medium
Attack Rewards: Medium
Military purchasing: Enabled
This game is setup in InterBBS mode with 4 boards in the game.
Attack Costs: Medium Terrorism Costs: Medium
Maximum Individual Attacks Per Day: 2
Maximum Group Attacks Per Day: 2
Maximum Terrorist Ops Per Day: 15
Maximum Bombing Operations Per Day: 5
Days before "lost" forces returned: 1
Gooie Kablooies: Enabled Bombing Ops: Enabled Missile Ops: Enabled
- Specialize Industry (3): a blurb, then a red-accent
[Specialization]menu (Troopers/Jets/Turrets/Bombers/Tanks/Carriers/Quit); declining printsYour industries have not been specialized. - Trading (T): a small red-accent menu —
(1) Trading(2) Trading Market(V) Visit Bank(0) Quit.
Configuration Editor (BRE RESET, captured live 2026-08-11)¶
Reached by BRE RESET from the DOS prompt:
Are you sure you wish to reset the Game? (Y/n)- the editor
[ESC]to saveWould you like this to be a league-wide reset? (Y/n)Your BRE game has been reset...Thank you!
That league-wide prompt only appears on a board BRE recognizes as a league
member (its bbs.cfg FTN address matching an entry in BRNODES.DAT). A
standalone install never asks it, which makes it the quickest confirmation that
an InterBBS test board is configured correctly.
Two pages, moved through with PG-DN / PG-UP; [ESC] saves and quits.
Re-captured with color 2026-08-16 — the color-by-type table below had been
presented as fact with no capture behind it, and it holds. Fields are
color-coded by type, and every value is the BRIGHT form of its label's
color — labels 3x, values 9x:
| field type | label | value | seen on |
|---|---|---|---|
| dates | 32 green |
92 bright-green |
Game Start Date, Game Join Date |
| numbers | 36 cyan |
96 bright-cyan |
Turns Per Day, Turns of Protection, rates, caps |
| presets | 35 magenta |
95 bright-magenta |
Buy Military, Maintenance/Trade Deal/Region Costs, Attack Damage, Sabre Handling |
Three additions the earlier entry did not have:
- The highlighted field is
97bright-white on BOTH label and value, which is how the cursor is shown — the type color is replaced, not brightened. The92/97alternative the old table gave for a date value was this highlight being read as a date color. Buy Militaryis a preset field, not a number, and takes the magenta pair even though its values areYes/No.- The footer's
*and the three bracketed key names (PG-DN,PG-UP,ESC) are93bright-yellow inside37white brackets.
The : separator and the trailing pad are 37 white. A * prefix marks an
InterBBS-only setting; the footer states it. The title rule is 72 columns —
5 ─, 2 ═, the 40-column title, 6 ═, 19 ─ — and it is drawn in mixed
colors: the outer ─ runs 90 gray, the inner ─ and ═ 37 white, with
the title itself split across 91 bright-red and 31 red and 97 runs. That
last is not a scheme worth copying; record it and move on.
─────══Barren Realms Elite Configuration Editor══════───────────────────
Game Start Date : 08/11/2026 14:48:46
Game Join Date : 01/01/2999 00:00:00
Turns Per Day : 8
Turns of Protection : 20
Initial Market Land : 0
Land Created / Day : 1000
Interest Rate : 50
Standard Investment Rate : 35
Steady Investment Rate : Disabled
Tax Rate : 50
Max Purchasable Regions : 500
Max Players Per BBS : 25
Buy Military : Yes
Maintenance Costs : Medium
Trade Deal Costs : Medium
Region Costs : Medium
Attack Damage : Medium
* = InterBBS Setting Only [PG-DN] For More Options [ESC] to Save & Quit
Page two — everything starred is InterBBS-only:
Attack Rewards : Medium
Sabre Handling : User Select/Original Setting
*Attack Costs : Medium
*Terrorist Costs : Medium
*Individual Attacks / Day : 1
*Group Attacks / Day : 1
*Terrorist Attacks / Day : 10
*Bombings / Day : 5
*Days for "Lost Attacks" : 7
*Gooie Kablooies : Enabled
*Bombing Operations : Enabled
*Missile Operations : Enabled
*Local Attacks : Enabled
*Local Attack Scoring : Disabled
*Dupe Checking : Enabled
* = InterBBS Setting Only [PG-UP] For More Options [ESC] to Save & Quit
Editing a field — the help screen IS the edit screen¶
Enter on a field replaces the list with a full-screen page (captured 2026-08-16):
──═Configuration Help Information═──
─────═══════════════──────────────────────────────────────────────────────────
──═GamePlay: Maintenance Costs═──
The GamePlay options may be set to the following values: High, Medium
Low, or None. [H,M,L,N] ...
─────═══════════════──────────────────────────────────────────────────────────
Possible Settings: High
Medium
Low
None
New Setting:
The outer banner is the ──═…═── decoration in 34 blue / 94 bright-blue
around a 97 bright-white title; the field's own banner repeats it in 32
green / 92 bright-green. Both rules are the 78-column inset (5 ─,
15 ═, 58 ─) in 90 gray. Body text 37 white with the setting's key words
92 bright-green.
A preset field commits on ONE key — H sets High and returns to the list
with no Enter. A numeric field takes digits and Enter. The old note calling the
editor read-only under dosemu -t is wrong and has been removed: every field
edited cleanly this run.
Trading (System Menu → T) and the Trading Market¶
The Trading submenu's accent is red: 31 red parens and rule, 91
bright-red key letter, 37 white label.
─────[Trading]──────
(1) Trading
(2) Trading Market
(V) Visit Bank
(0) Quit
────────────────────
Choice> Quit
Send Trade Deal — the local flow (captured in cap/kd3-01.cap)¶
This is create_trade_offer (BRE.OVR 0x260cd), the LOCAL deal, reached from
this menu. It was filed under the InterPlanetary Operations menu's (3) for
months — the two items are different routines, and that misattribution is what
wired IB's interplanetary item to the local mechanic (#195). Every string below
is this routine's: the per-day rate, the minimum span and the arrival-turn
sentence have no counterpart in the interplanetary one.
After the goods are chosen it states the transport requirement, the per-day cost and the two-day floor, prompts for a span, and then — the part IB had no equivalent of — tells the sender which turn of the recipient's day it lands on:
Trade Deal requires 20 Carriers.
Send Trade Deal? (Y/n) Yes
This trade deal will cost 120,000 gold per day to send.
Trade deals must be sent for a minimum of 2 days.
How many days would you like to send this deal for? (2; 10) 2
Trade Deal sent to <realm>
It will arrive at earliest on Turn #<n> of that empire today.
The turn number is 0e bright-yellow against 07 gray body text. The figure
is the sender's own turn of the day; the mechanic behind it is in
docs/mechanics-reference.md. Deliberate divergence: IB says the same thing
in its own words rather than reproducing BRE's sentence.
IB matches the rest of this screen, from the carriers line to the days
prompt (2026-09-27). The (2; 10) is min and max, not a default: the ceiling
is 10 or the days the gold in hand can pay for, whichever is lower (0x26A39).
IB counts the bank as well, so its withdrawal offer can still pay the fee.
IB keeps its own You offer … in return for … summary above the carriers line,
its : after the hint, and its one short-of-gold refusal in place of BRE's
Sorry, you cannot afford to send this deal.
The market itself lists the eight tradeable goods — note keys 1-5 and 7-9, with
no key 6. Key 6 is Gold (empire_trade_good_pointer, BRE.OVR 0x051133,
record +0x66, and the good-name table at DS:0xb11 agrees). It is missing from
the MARKET because gold cannot be sold for gold, not because it is untradeable —
it rides a trade deal, local or interplanetary, like anything else. This file
said "regions are not tradeable" until #195; regions have no key here at all.
Trading Market
Key Name Your Prices Owned For Sale Total For Sale
─────═══════════════──────────────────────────────────────────────────────────
(1) Trooper 500 27 73 73
(2) Jet 0 0 0 0
(3) Turret 0 0 0 0
(4) Bomber 0 0 0 0
(5) *Food 0 1840 0 0
(7) Agent 0 0 0 0
(8) Tank 0 0 0 0
(9) Carrier 0 0 0 0
─────═══════════════──────────────────────────────────────────────────────────
Your Choice?
The market table does NOT take the Trading menu's accent (cap/eots-ibbs-01.cap):
its 78-column inset rule is 91 bright-red, the row parentheses are 33 yellow
around a 93 bright-yellow key, the good's name is 37 white, and the four
figure columns each carry their own color — Your Prices 97 bright-white, Owned
96 bright-cyan, For Sale and Total For Sale 93 bright-yellow. The heading row
is plain 37.
Picking a good gives [C] Change your setup, or [B] Buy from Market:, then
Enter new amount of <Good> for sale:(MAX=n) and Set new <Good> price: (0).
Listing moves the goods out of Owned into For Sale immediately.
The market exits on ESC — not 0, not Enter. Its screen lists no Quit key
and the Your Choice? prompt silently redraws on both, so a driver that presses
0 until it recognizes a screen will loop forever. tmux send-keys -H 1b leaves
it, and pops the Trading submenu with it, landing on the System Menu.
The * marks a good that is not a military unit. It is part of the stored
name, not something the draw routine adds: BRE's shared goods table lives in
BRE.EXE at 0x157b7 (fixed-width slots, Pascal ShortStrings) and reads
Trooper Jet Turret Bomber *Food *Gold Agent Tank Carrier
so the seven military units are bare and only Food and Gold carry the
marker. Gold is not one of the market's eight rows, which is why the capture
above shows exactly one *. Searching BRE.OVR for it finds nothing — the
table is in the executable, not the overlay, which is the trap here.
IB status (2026-08-13): matched, with one recorded divergence.
- The exit key. IB leaves on ESC as BRE does, and also on
0and Enter, which BRE ignores. A screen that lists no Quit key and refuses the key every other menu quits on is a trap for a player, not a fidelity detail worth keeping;0quits everywhere else in IB.
The column geometry above is pinned by TestMarketTableMatchesTheCapturedGeometry
as golden literals (edges 33/45/59/76, and the 5/15/58 inset rule), so a change
to the format must produce new evidence rather than quietly following the code.
Covert Operations (System Menu → C)¶
Captured live 2026-08-16, and RE-captured 2026-08-17 with the log kept —
cap/covert-menu-20260817.cap. This section said "colors NOT captured" before
that. The second pass exists because the first one's log was not retained; every
figure below now has a file behind it.
The menu's accent is green, and it prices every operation on the menu
itself. Colors, byte for byte: border 32 green, brackets 92 bright-green,
title 97 bright-white, item parens 32, item keys 92, labels and prices
37 white. IB chose bright-green for this menu before any capture existed, and
the capture bears that out.
The box is 32 columns — 6 + [Covert Operations] + 7, closing rule 32,
obeying the rule that a closing rule equals the box width.
IB draws 34, and that is the faithful answer rather than a divergence. BRE sizes the box to its widest row; IB's same row is two columns wider, because the menu engine indents every item two columns and IB comma-groups figures BRE prints bare (both long-standing). Forcing 32 clips every priced row, which is a worse likeness than a box two columns wider. IB drew 62 until this was captured.
IB additionally prints a Key Item Price header row that BRE has no equivalent
for — UNVERIFIED whether BRE omits it everywhere or only here.
cap/kd3-01.cap holds this screen too, from a real board with 11,652 agents,
and independently gives the same 32-column box and the same nine prices. It was
missed on two earlier passes: a search keyed on the status line's wording did not
match the real spacing, and the follow-up found only the help-topic index, which
lists all nine operation names and reads like the menu. Grep an operation name
plus a price, not the status line, and do not stop at the topic index.
The same capture shows what BRE says when an operation is ORDERED, which no other screen records:
Demoralize Forces
Choose a Target [A-Y,?=List RETURN to Abort] Endor
Covert Agent Sent out
──────[Covert Operations]───────
The menu redraws immediately and no outcome is shown, because an effect operation is queued and resolved at daily maintenance rather than on the spot. That is the observed counterpart to the queue mechanism read out of the binary.
The menu is hidden until the realm holds covert agents. Observed directly: at
0 agents the System Menu has no (C) item and its right column starts at
(1) Set Industries; buying 20 agents makes (C) Covert Operations appear.
The advertised price for Spy on Relations is a lie. The menu says 100,000;
report_spy_result subtracts the Send Spy fee of 5,000 for both info ops. The
screen above is what BRE shows, not what it charges.
──────[Covert Operations]───────
(1) Send Spy 5000
(2) Stir Revolts 25,000
(3) Set Up 50,000
(4) Support Dissensions 80,000
(5) Demoralize Forces 80,000
(6) Spy on Relations 100,000
(7) Bomb Enemy Targets 100,000
(8) Bribery 200,000
(9) Expose Enemy Ops 600,000
(V) Visit Bank
(?) Help
(0) Quit
────────────────────────────────
You have 4,732,202 gold and 100 agents.
Choice> Quit
Colors: the rule and the parentheses 32 green, the title brackets and the
hotkeys 92 bright-green, the title 97 bright-white, and both the item label
and its price 37 white. The footer follows the menu-footer convention —
body 37 white, the two figures 97 bright-white. 32 columns (6 ─ +
[Covert Operations] + 7 ─), closing rule 32.
IB drew this menu bright-green before the capture existed, so its choice turns out to match. The price column is IB's to add or not; BRE shows it.
Limit one try per turn! did not appear on either capture of this screen,
though the string sits beside the footer's in the same overlay unit. Not
explained — record it as a string that exists rather than as a line the menu
draws.
The fees are flat constants, not scaled by the sysop's cost levels. Two
independent lines agree. Live: a game with Maintenance / Trade Deal / Region /
Attack / Terrorist Costs all set to High draws the identical nine figures as
one with them at Medium/None, and a Send Spy moved gold by exactly 5,000. Static:
the nine dwords the menu reads from DS:0x63E are initialized DGROUP data in
BRE.EXE at file offset 0x14EDE, not a runtime table — nothing anywhere in
either binary writes them, the charge is a bare 32-bit sub/sbb with no
multiply, and the covert overlay unit never loads the config record at all. See
GitHub issue #143.
What the strings and the disassembly give¶
The item labels and their order come from the overlay's string table, where Turbo
Pascal stores them consecutively in declaration order, which is render order
(BRE.OVR 0x1731a onward):
Send Spy · Stir Revolts · Set Up · Support Dissensions · Demoralize Forces
Spy on Relations · Bomb Enemy Targets · Bribery · Expose Enemy Ops · Visit Bank
The status line under it is assembled from 'You have ' + gold + ' gold and '
+ agents + ' agents.', and 'Limit one try per turn!' sits just below in the
same unit — the one-effect-op-per-turn cap.
The interplanetary Special Operations menu has its own table at
BRE.OVR 0x2981b, in this order, with a zero-length entry between Nuclear
Assault and Chemical Bombing that a naive ShortString walk will mistake for the
end of the table:
Bomb Food Market · Bomb Trading Market · Bomb Trade Routes · Undermine
Investments · Nuclear Assault · <len 0> · Chemical Bombing · S3-Sabre · Send SpyGuy
All eight belong to the interplanetary menu, and none to the local one. The
table is read by run_bombing_operations_menu (BRE.OVR 0x029EA9) alone, whose
only caller is run_interbbs_menu. The 500-bomber gate string follows
immediately, and the gate itself (+0x1015) and the 500 Bombers each launch
consumes (+0x1146, +0x1233, +0x1689) are all inside that same procedure —
the local Covert menu tests no bomber count anywhere. The local Bomb Enemy
Targets is ONE flat op that rolls Random(6)+1 over six holdings in the
resolver; see docs/mechanics-reference.md. IB read this table as "the local
menu takes the first seven" and built a lettered submenu on it, which was wrong
and has been removed.
From the draw routine (run_covert_operations_menu, BRE.OVR 0x17469),
read directly rather than inferred:
- The hotkeys are binary-verified. Each item block opens
mov al,<char>with0x31–0x39then0x56—1-9thenV, in the same order as the strings. - The per-op costs sit in a DS table, indexed by keycode. Each item pushes a
different consecutive dword from
DS:0x63e, stepping 4 bytes per item ([0x63e],[0x642], …). This was read as a runtime table until 2026-08-16, on the strength of a byte search finding nothing — but the search had been run over the overlay. The dwords are initialized data inBRE.EXE(above), which is why they never change. - The entry gate is a signed 32-bit
agents > 0on the held agent count (+0x26f), tested high word then low. Agents escrowed on the Trading Market live at+0x229and are a separate field, so listing agents for sale can close the menu — IB matches, since listing moves them out ofEmpire.Agents. The per-turn covert step carries an extra gate on the byte atDS:0x6d52, which is the preference; the System-menu item does not, matching what the captures show.
Why the disassembly could not have settled the colors — worth keeping,
because the same reasoning applies to every screen whose colors are still
missing. Neither binary contains a single literal ANSI escape, so BRE holds
color as a Turbo Pascal attribute and builds the escape at write time; the draw
routine passes only key, label and cost, and neither it nor
enter_covert_operations_menu sets an attribute. The color comes from the
shared output helpers (0dc9:0608 formats the line, 0735:0000 writes it),
which every screen uses. A script-wrapped live capture is the only cheap way
to get a screen's colors, which is how this one was finally closed.
Corroboration worth keeping: a 2012 public-board capture renders the Help "List
of Topics" divider as CP437 ÄÄÄÄÄÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÄÄÄ… — 5 ─ then 15 ═ — the
same inset rule recorded for the Relations table and the Trading Market, from an
entirely separate board and year. That the ratio recurs across screens and
releases is why insetRule is the shared helper rather than a per-screen
constant.
Clean-room note¶
BRE is proprietary (John Dailey Software; design by Mehul Patel). This file records observed screen behavior to guide an independent reimplementation; it is not a copy of BRE's source or assets. Distinctive coined strings/names (e.g. pirate faction names) are recorded here for fidelity analysis; whether IB uses one or coins its own is Andy's call case by case. The Gooie Kablooie and the S3-Sabre keep the original's names (#218); the pirate factions carry IB's own.
Full Defense Alliance — Diplomacy, Alliance Strength, battle (captured live 2026-07-27)¶
Diplomacy Menu (opens every turn before income, and via System Menu -> D)¶
Items:
- (1) Tariff Trade Agreement
- (2) Protective Trade
- (3) Free Trade Agreement
- (4) Terrorist Prevention
- (5) Intelligence Alliance
- (6) Technology Agreement
- (7) Full Defense Alliance
- (8) Declaration Of War
- (9) View Treaties
- (?) Help
- (0) Quit
Proposing (7) Full Defense Alliance¶
Shows the treaty blurb then (A-Y,Z=All,?=List) Send to: -> pick target letter
-> Would you like to attach a message? (y/N). ? prints the shared realm
roster and re-prompts (captured at a Send to: prompt in cap/bre-3-color.cap):
-*Barren Realms Elite*-
Id Empire Name Territory Score Net Worth
─────═══════════════───────────────────────────────────────────────────────
(A)+Dynoland 8391 687985 1883573
(B) Bran The Warrior 2135 6390 26687
─────═══════════════───────────────────────────────────────────────────────
(A-Y,Z=All,?=List) Send to:
+ marks a realm in the list; figures are ungrouped. This is the same table
the Regular Attack picker lists, so one routine serves both.
The prompt is the MULTI-select one (see "Send Message: the recipient picker
is MULTI-select" below for how it behaves), and the Diplomacy menu is its other
caller: the selection routine at BRE.OVR 0x1b65e is reached from exactly three
sites, one on the message path and two inside run_diplomacy_menu (0x1c800
+0x08e7 and +0x0a79) — a treaty proposal and the Declaration Of War. So both
address several realms in one action, and the capture above sits at a prompt that
is waiting for RETURN, not for one letter. The prompt text is the same for both
callers: its printer (0x1b0a3) has the selection routine as its only caller, so
there is no per-item wording.
UNVERIFIED — Diplomacy's roster flag. Diplomacy passes 0 for the roster flag, which lists
-*Relations*- rather than the score table — yet the capture above is filed
under a treaty proposal and shows the score table. One of the two is mislabeled
and it has not been re-captured; the capture's own note only says it was taken
"at a Send to: prompt", which the message path also has. IB follows the flag
and lists Relations at a Diplomacy prompt.
Recipient sees at next login:
<Name> proposes a Full Defense Alliance. / Regions: N; Net Worth: N; Score: N;
Accept? (Y/n). (9) View Treaties -> -*Relations*- table: each empire letter +
name + Relations ("None" / "Full Defense Alliance").
Attack Menu -> (A) Alliance Strength¶
Your allies will send the following to aid you in defense:
Name Troopers Tanks Agents
Carbon 29 3271 NONE
Total Forces 29 3271 NONE
Measurements and colors for those three (captured live 2026-08-01, league game)¶
Incoming proposal, in the "since your last play" block — immediately after
the Since your last play, this has happened: header and BEFORE the numbered
recap entries, not after them. Re-captured 2026-08-16 and every color below
held; only the position was wrong. It carries NO rule and NO timestamp: unlike a
recap entry it is a prompt, not a log line. Two lines, unindented, the second
running straight into the prompt; the figures are NOT comma-grouped:
<Name> proposes a <Treaty>.
Regions: 19445; Net Worth: 146868315; Score: 2442093; Accept? (Y/n) Yes
1;36), every connecting word
white (0;40;37), the three figures bright yellow (1;33). The y/n hint is
BRE's usual cyan parens (36) around bright-cyan letters, and the answer echoes
as the whole word (Yes/No) in bright white (1;37).
BRE writes proposes a <Treaty> with no article agreement, so an
Intelligence Alliance reads proposes a Intelligence Alliance. Recorded for
accuracy; IB fixes the article, which is a divergence not worth reversing.
View Treaties -> -*Relations*-. Re-captured 2026-08-16. Lists every living
realm except the caller's own, "None" included — the roster doubles as the
empire-letter key, minus your own letter. (This file said it listed every living
realm; a three-realm capture from realm A lists only [B] and [C].) Title
-*/*- blue (0;40;34) around a bright-white word; heading bright white; a
75-column inset rule (5 ─, 15 ═, 55 ─) in blue above and below the
rows. A row is [X] then the name in a 40-column field: brackets blue,
letter bright white, name bright cyan (1;36), relation bright blue (1;34).
Id Empire Name Relations
─────═══════════════───────────────────────────────────────────────────────
[A] Endor None
[F] Opium Full Defense Alliance
Alliance Strength. Re-captured 2026-08-16 with a real ally row — until then
only the empty Total Forces … NONE case was on disk — and every figure below
held. White headings, a 51-column inset rule (5 ─, 10 ═, 36 ─) in red
above the rows and above the total, ally names bright white, figures bright
yellow and ungrouped, a zero shown as NONE. Data columns are name 21, then
9 / 10 / 10; BRE's heading row is one column wider on Troopers (10), so the
headings sit one column right of the figures.
Your allies will send the following to aid you in defense:
Name Troopers Tanks Agents
─────══════════────────────────────────────────────
Carbon 29 3271 NONE
─────══════════────────────────────────────────────
Total Forces 29 3271 NONE
IB deviates on readability (deliberate, Andy's call). Two changes, both to make a dense line scan faster:
- Number grouping. BRE prints the figures on both of these screens ungrouped
—
19445,963016. IB comma-groups them; the Alliance Strength columns are widened to 12 and its rule follows, and the heading drops BRE's off-by-one. BRE is not consistent about this itself — its Queen Royale refund line groups. - Field separator. The offer's stats line uses
│where BRE uses;, so the three figures read as separate fields rather than as prose. It costs the same width as the semicolon (one glyph per gap), which bracketing the values would not —[…]reaches 78 columns with a 9-digit net worth and wraps at 10. - Online mark (#123). Relations shows the same
(O)as See Scores, hugging the left of the realm name in the two spaces BRE leaves after[X], so the 40-column name field and the relation at column 45 are untouched. A headed column of its own would have moved both, and this is one of the closest-matched screens; the cost is that the mark carries no heading here.
Everything else on the two screens is the original's.
Do not raise the y/n prompt mismatch. Two known differences in the shared
AskYesNo: BRE echoes the whole word (Yes/No) in bright white where IB
echoes y/n, and BRE's hint parens are plain cyan (36) where IB uses bright
blue. Both are recorded here so the capture stays accurate. Andy has parked
them — leave them alone unless he brings them up.
Regular Attack flow + battle report (attacker's view)¶
- Attack Menu -> (R)
Choose a Target [A-Y,?=List RETURN to Abort]- letter
You have N Troopers, N usable Jets, N Tanks, and N BombersSend how many Troopers? (def; max)/How many Jets?/How many Tanks?/How many Bombers?(>=max; all-zero aborts)
A losing attack against an allied defender:
The empire's allies send 29 Troopers and 3271 Tanks.
And the battle begins.......
Your forces have returned..Exhausted from battle...
You lost 0 Troopers, 0 Jets, 2206 Tanks, and 0 Bombers.
You destroyed 14 Troopers, 0 Turrets, 1948 Tanks, and 0 Jets.
You lost the battle!
The allies line and the casualty lines are spelled differently, on one
screen. The allies line groups past four digits and the casualty lines stay
bare at any size. Every figure in the capture above is four digits or fewer, so
it cannot show this; a later one (2026-09-13) has the same line reading
8636 Tanks in one battle and 11,508 Troopers / 248,073,416 Tanks in
another, beside You lost 4197 Troopers, 81294 Jets. IB matches both
(numfmt.GroupLong on the allies line, bare on the casualties). Do not tidy the
screen into one spelling.
Deliberate divergence — the defender-jets figure in a LOSING report. BRE's
You destroyed … and N Jets slot shows only the bombers-vs-jets air tally, and
prints 0 while the defender's jets silently bleed at the same ground fraction
as everything else (measured 2026-08-30: six staged battles took the defender's
jets 209,235 → 198,983 with 0 Jets printed each time —
cap/small-vs-large-20260830.cap). IB reports the jets actually lost. Do not
"correct" IB's figure back to 0.
"Since your last play" event log (captured live 2026-07-31, league game)¶
The recap shown at the start of a turn. Every entry is wrapped in its own rule carrying a 1-based counter and a timestamp; entries are separated by a blank line.
Since your last play, this has happened:
─────(1)────────────────────────────────07/31/2026 07:43:11────────
Opium accepted your Full Defense Alliance proposal.
─────(2)────────────────────────────────07/31/2026 09:07:07────────
DTF accepted your Full Defense Alliance proposal.
IB marks the stamp's zone, where BRE leaves it bare (#267): the rule reads
07/31/2026 07:43:11 UTC on a player set to UTC, four columns wider, which the
8 ─ tail absorbs — the rule is still 76 columns and the stamp still starts at
48. Times are stored in UTC and drawn on whichever clock the reader picked in
Preferences, because a league's boards are not on one.
Deliberate divergence: IB merges repeated entries. BRE gives every event its
own numbered rule, so thirteen caught spies from one realm fill thirteen entries
(cap/kd3-01.cap, its last recap: Beavis's Couch was found spying on you. 13
times). IB shows each distinct text once, in the order it first appeared, with
that first entry's stamp and (13 times) on the end (countRepeats,
internal/menu/turnrecap.go). The repeats need not be adjacent, so interleaved
successes and failures collapse to one line each.
Measured: 5 ─, (N), 40 ─, the 20-column stamp, 8 ─ — 76 columns,
with the stamp starting at column 48. This block showed 48 fill columns, which
would run the line to 84 and wrap; 13 rules across two captures all measure 76.
(IB's eventRuleWidth/eventStampColumn were already 76/48 and are correct.)
Colors:
- Header line
Since your last play, this has happened:— plain white37. - The rule, both sides of the counter and the date/time inside it — bright-black
1;30(dim gray). The()around the counter are yellow0;40;33; the counter digit itself is bright-yellow1;33. - Body: on a treaty entry the realm name and treaty type are bright-cyan
1;36; the connecting words plain white0;40;37. - The body colors are per entry TYPE, not per kind of thing. A trade entry
in
cap/eots-ibbs-01.caprenders the buying realm1;33bright-yellow, the good1;31bright-red and the quantity1;37— the same realm name that a treaty entry two rules above draws1;36. Do not generalise one entry's palette to the rest of the recap.
Treaty replies read <Realm> accepted your <Treaty> proposal. and
<Realm> rejected your <Treaty> proposal. — rejected, not "declined".
Message box inside the recap (same capture)¶
Mail is read as part of the recap, straight after the numbered event rules — no
count line, no "read them now?" gate. An empty inbox prints You have no
messages. in that spot instead.
Since your last play, this has happened:
┌──────────────────────────────────────────────────07/30/2026 00:24:05─────
│ Message From: <realm>
│ Message To : ABCE
├─────════════───────────────────────────
│ Savings full. Investments start coming in 8/1.
[R] Reply, [D] Delete, [I] Ignore, or [Q] Quit> Delete
Measurements: the top rule is 76 columns (┌ + 50 ─ + the 20-column stamp
+ 5 ─); the header separator is a short 41 (├ + 5 ─ + 8 ═ + 27 ─)
and does NOT span the box. Message To carries the recipient empire letters.
Colors: frame cyan 36; timestamp bright-white 1;37; the Message From: /
Message To : labels white 37; sender bright-cyan 1;36; recipient letters
bright-green 1;32; body white, quoted lines bright-blue 1;34; the action keys
bright-cyan 1;36 inside blue 34 brackets.
When the reader runs. BRE reads mail once per Play Game, not once per turn:
run_player_turn calls read_local_messages at BRE.EXE 0x3869, before the
turn loop whose head is 0x38D7, and nothing in the loop calls it again (the
loop's 0x43a call at 0x3E4A is Send Message). The routine takes no argument
and is also key 6 of the main menu (0x24DE), so the Play Game stop and Read
Messages show the same thing: every message still in the file, an ignored one
included. cap/kd3-01.cap agrees — each Play Game shows the recap and the
reader once, and a day's turns follow with no further mail prompt. IB matches
this at the Play Game stop.
IB addition: a mail stop at the head of each later turn. It exists so mail from another node is seen mid-session (#3), and it passes over anything the player ignored earlier in the same session, so a baron playing out a day's ten turns is not shown the same box ten times. Read Messages and the next Play Game never skip it. (This note used to say BRE re-shows an ignored message at every turn; the disassembly above says it does not.)
What counts as passing a message over, all deliberate:
[I]gnore- an unrecognized key at the prompt
- a
[R]eplyabandoned in the editor, because opening a reply and backing out is still a decision not to deal with the message now
[Q]uit marks nothing: the messages behind it were never shown, so the next
turn's stop still has them.
Deliberate divergence: a sent reply asks
[D] Delete or [K] Keep original message? about the message just answered,
keys drawn like the reader's own. BRE has no such question. Enter keeps the
message, and a kept message counts as passed over, like [I]gnore.
Deliberate divergence: the player's own sent mail can be read back. BRE
keeps nothing a player sends. IB keeps a copy of each message and shows it from
the Messages menu's View Sent Messages item, in the same box: Message From: is
the player, Message To : the address (see docs/mechanics-reference.md).
Message To is a run of letters, not a name — the reader loops A..Y over the
message's own recipient table and prints every letter that is in it, so a message
sent to several realms shows them all, in letter order, and every copy carries
the same run.
Send Message: the recipient picker is MULTI-select (System Menu → M)¶
The (A-Y,Z=All,?=List) Send to: prompt is not answered with one keypress.
It is a toggling list, closed by RETURN. Read from a live capture and confirmed
against the selection routine at BRE.OVR 0x1b65e and the per-letter toggle it
calls at 0x1b575:
(A-Y,Z=All,?=List) Send to: EFHIJKMNOP
You have 20 lines for your message. /S=save /A=abort /C=clear
[---+----|----+----|----+----|----+----|----+----|----+----|----+----]
1>
- A letter toggles that realm. Selecting echoes the letter in bright cyan
(
1;36) and returns the color to37; pressing it again writesBS/space/BSto rub it out and re-draws the letters that are left (0x1034 adds and echoes, 0x10d2 removes and erases). Ztoggles every letter A..Y in turn — the same toggle applied to the whole range (0x1427). It does not end the prompt, and on a list that already has selections it inverts them.?prints the roster and re-draws the prompt. Letters already chosen stay chosen but are not re-echoed on the new line. The roster it prints depends on a flag the caller passes: Send Message passes 1 and gets the See Scores table (Id / Empire Name / Territory / Score / Net Worth); the Diplomacy menu passes 0 and gets the-*Relations*-table instead.- RETURN closes the list; with nothing selected that is a cancel and the flow returns to the menu.
- Anything else is ignored with no echo — including a letter with no living realm behind it and the caller's own letter (0x12b2 rejects self, 0x12c8 rejects an empty slot).
The letter is the realm's SLOT, not its row number. BRE indexes its empire
array with the letter itself, so a dead realm or the caller's own leaves a gap
— which is why the -*Relations*- capture above runs [A] [C] [D] [E] [G] ….
The prompt therefore always names the full A-Y range whatever the realm count:
the two-realm capture in the Full Defense Alliance section shows the same
(A-Y,Z=All,?=List).
After a message is saved BRE asks Do you wish to send another message? (y/N)
and loops straight back to the Send to: prompt.
IB uses this picker at both of BRE's call sites: Send Message, and every
Diplomacy action that names a realm — each treaty type and Declaration Of War
(see the Diplomacy section above). The roster flag is the relations field of
pickOpts. IB adds *=All Allies, which marks the realms it holds a treaty with
and leaves the list open, so letters can still be added or taken off before
RETURN.
IP Messages: the recipient picker (InterPlanetary Ops -> Send Message -> Single Planet)¶
The interplanetary twin of the picker above, captured live in
cap/eots-ibbs-01.cap (a four-planet league, 2026-08) and read out of
send_interbbs_message (BRE.OVR 0x1f335). The flow is:
- the IP Messages box (Single Planet / Select Planets / All Planets / Allied Planets / Planet Coordinator / Quit)
- the shared
Enter Planet Name or Number (? for list):prompt - the "Our current relations with" line
- and THEN
(A-Y,Z=All,?=List) Send to:over the barons on the chosen planet
The editor comes after that, not straight after the planet.
The roster ? draws is headed -*Players at <planet>*- in bright white on
blue-rules, over the same Id Empire Name Territory Score Networth
columns the local See Scores table uses, closed by the [BRE vX] <date>
footer. It is drawn by the same routine the Spy Database and the attack target
list use (show_player_list, BRE.OVR 0x2224cf).
The toggle is visible in the capture's BYTES. At one prompt the echo after
Send to: runs four letters in bright cyan (1;36, returning to 0;40;37
after each), then four erase groups:
<L><L><L><L> BS SP BS -> the last letter taken off, nothing re-drawn
BS SP BS -> and the next
BS SP BS BS <L> -> one taken from the MIDDLE: an extra BS per
letter after it, then the survivors re-drawn
BS SP BS -> the last one off
CR
and the next thing on screen is the "send another message?" question, NOT the editor's banner. That settles three things a reading of the code leaves open: the letters toggle, the erase-and-redraw is what a middle deselect looks like, and RETURN with nothing marked sends nothing (the code simply never fills its recipient table in that case, which is undefined rather than defined behavior; the capture defines it).
? is not echoed. The capture shows the key produce a color change and a
CRLF, then the roster, then the prompt again. IB echoes the word "List" instead,
as it already does on the local picker.
The letters have gaps and they persist. The same planet's roster reads
(A) (B) (D) (E) on three separate days a week apart, and a later capture shows
(A) (B) (C) (D) once the C slot has been refilled by a different realm — so
the letter is the realm's own slot on its home planet, not its row number, and
BRE knows it because it holds that planet's whole 25-slot array.
IB divergences here, both recorded in docs/mechanics-reference.md under
"IP Messages": IB letters the rows of the received scores packet consecutively,
because game.RemoteScore carries no slot; and a planet IB has no scores packet
for skips the prompt and takes a planet-wide message rather than refusing.
The planet prompt autocompletes in the original. The capture shows two typed
characters erased (BS SP BS twice) and replaced with the full planet name.
Its parser, read out of select_planet (BRE.OVR 0x021dd9, container
ovr_0209c5) — this settles #183. An exact roster number resolves first and
alone, and only when the slot is occupied (0x1861). Otherwise the answer is a
substring search, not a prefix one: both sides are upper-cased and the
original calls Pos(typed, name) (argument order confirmed at 0x1535-0x1560), so
a fragment matches from the middle of a name. The same Pos runs against the
planet's number rendered as a string (0x1585), so a bare digit can match several
planets once a roster passes nine.
It counts the matches rather than taking the first ([bp-0x30e], loop at
0x1521) and resolves only on a count of exactly one: 0 sets state 7, 1 sets 14,
more than 1 sets 15, and the loop that identifies the slot runs for 1 alone
(0x15c0). So an AMBIGUOUS answer selects nothing and is refused exactly as an
unknown one is — the routine holds no message telling the two apart, only
Planet not found. That is the question #183 left open, and it is the safe
answer: The X-Bit BBS and The uniX-Bit BBS share The, and picking one
would send an attack to the wrong planet.
The matching runs as you TYPE — the state code is compared against its previous value each keystroke (0x16a3) and the line is completed the moment the count reaches one, which is what the erase-and-replace above is.
Watched live, and it confirms the SUBSTRING reading rather than a prefix one.
Against the roster in cap/eots-ibbs-01.cap — Nova Hub, Starship Junkyard, Eye
of the Storm, The Eclipse — typing s changes nothing (it is inside Starship,
Storm and Eclipse: three matches), st still changes nothing (Starship and
Storm: two), and sta completes to Starship Junkyard (one). A prefix matcher
would have completed on the first keystroke, since only Starship Junkyard STARTS
with s. It did not.
The keystroke that makes the match unique is not echoed: the two characters
already on screen are erased and the resolved name written over them, so the
capture reads st + two BS SP BS + the name, with the a that triggered it
appearing nowhere. Reading those bytes without the live behavior beside them
makes it look as though a two-character answer resolved. IB completes live
too since #183 (readPlanetAnswer).
The line's Color is the match count, and the whole line carries it. The routine keeps a state code — 7 (white) for no match, 15 (bright white) for several, 14 (yellow) for one, set at 0x159c — and compares it against the previous keystroke's at 0x16a3. Equal takes the cheap redraw (0x16b0: skip the common prefix, erase the rest, print the new tail); CHANGED erases the whole string and reprints all of it (0x1771). So a name that fills in is yellow end to end, not yellow only where the completion added characters. IB drew only the added text until 2026-09-05.
Backspace edits the TYPED text, not the completed name (0x14a5: Delete of
the last character of the typed buffer at [bp-0x102]), and the shown string at
[bp-0x302] is rebuilt from it on every keystroke — cleared at 0x14fd, filled
with the matched planet's name at 0x1669 when the count is one, otherwise copied
from the typed text at 0x168e. Enter answers with the completed planet: the
slot found during that pass ([bp-0x308]) wins outright, and the typed text is
parsed as a roster number only when no planet resolved (0x1823).
That combination is what #250 reported as a defect. It is the ORIGINAL's behavior, not IB's invention: after a completion, each backspace shortens invisible typed text while the visible name is redrawn identically, until the answer goes ambiguous and the name collapses. Both the "dead" presses and the completed name winning on Enter are read out of the routine above.
One quirk NOT cloned: the count loop increments once for a name match
(0x1569) and again for a match against the planet's NUMBER rendered as a string
(0x158e), so a planet matching both ways counts twice and is refused as
ambiguous. IB's matchPlanetCount counts such a planet once. Reachable only
where a planet's name contains its own roster number.
The message editor¶
20 lines, under a 68-column ruler — note the last group is short, ----+----]
rather than a seventh |, so the whole ruler including brackets is 70 columns.
Line prompts are 1> upward. / as the first key of a line opens
/-Command? [A,S,C]; BRE erases that prompt (20 columns of BS/space/BS)
before printing the outcome, and prints an abort in red (0;40;31).
IB divergences here, both cosmetic and deliberate: IB shows no block cursor while
typing (BRE draws █ then backspaces over it per character), and it prints the
/-command outcome in place rather than erasing the prompt first.
Message editor (captured live 2026-08-14, standalone board)¶
Reached from the main menu's (7) Send Messages once a recipient is picked, and
from a reply in either message reader. All five entry points call one routine
(compose_message, BRE.OVR 0x0492ba), so the editor behaves the same
everywhere; only the line allowance differs, and the 3-line banner in the string
table belongs to the trade-deal note, not to this screen.
You have 20 lines for your message. /S=save /A=abort /C=clear
[---+----|----+----|----+----|----+----|----+----|----+----|----+----]
1> aaaaa bbbbb ccccc ddddd eeeee fffff ggggg hhhhh iiiii jjjjj kkkkk
2> lllll mmmmm
Measurements: the ruler spans 68 columns between its brackets. Counting the
[ itself as column 1, a + marks every fifth column and a | every tenth.
Banner and ruler are indented four columns, which puts the [ directly over the
first text column of a NN> prompt — so the ruler's own last - sits one
column past where the line stops taking text.
Colors, re-captured 2026-08-16 and confirmed: banner white 37; ruler plain
cyan 36; the line-number prompt bright green 92 with the typed text bright
white 97. A line re-opened by backspacing off the start of the one below it is
prompted in bright red 91. The /-command prompt draws its [A,S,C] keys
96 bright-cyan inside 37 white brackets, and ABORTED! lands in 31 red.
Wrapping at the margin¶
A line takes 68 characters. The 69th printable key wraps rather than extending
the line or being refused (compose_message compares the next column against
0x45). The wrap:
- Scans back from column 68 for a space, giving up below column 56 — a 13-column
window. A space found at column k breaks there: columns k+1..68 are erased
from the screen with
\b \b, along with the space at k, and re-echoed after the next line's prompt. The key that triggered the wrap lands on the new line after them. - Splits at the margin when no space is in reach, carrying nothing. A word longer than 13 columns therefore gets cut mid-word, not carried whole.
- Keeps the space at k in the stored line even though it erased it from the screen, so a wrapped line is saved with a trailing space.
- Erases one screen cell in the margin-split case although nothing was carried,
so the line renders one character shorter than it saves. Confirmed against
data/msgs.datand by backspacing into the line, which redrew all 68. - Opens a 21st line when it fires on line 20, accepts the carried word plus the triggering key there, then refuses every further key — and drops that line when saving, losing the word.
Backspace at column 1 takes the line above back out of the message and re-opens it with the cursor at its end. BRE does not move the cursor up a row; it draws the line again below, under the red prompt noted above.
Quoted lines in a reply are placed in the buffer and echoed as they stand. Only a keypress can wrap, so they are never re-flowed however long they are.
IB's deliberate divergences, all in internal/menu/actions_message.go:
- On line 20 IB stops taking keys at the margin instead of opening a 21st line. BRE's 21st line is discarded on save, so the text the player watched himself type is lost either way; stopping at the margin keeps the 68 columns.
- IB erases nothing on a margin split, so the screen matches what is saved.
- IB trims the space it broke at rather than storing it.
- IB draws the banner and ruler bright cyan. That predates this capture and is recorded here rather than changed, since the color is not what the wrap fix was about.
Planetary diplomacy (captured live 2026-08-08, league game)¶
Two screens and one line, all reading the same per-board chart. It is a local annotation, not a treaty system — the editing screen says so itself.
Diplomacy List (InterPlanetary Ops → D)¶
──═Planetary Treaties═──
─────══════════───────────────────────────────────
( 1) Nova Hub None
( 2) Starship Junkyard Allied
( 4) The Eclipse Peace
─────══════════───────────────────────────────────
Measurements: the rule is 50 columns (5 ─, 10 ═, 35 ─); each row is
( + a 2-column number + ) then the planet name in 35 columns, with the
status after it. The board the player is on is not listed (the capture is
from planet 3 and jumps from 2 to 4).
Colors: the title's ── red 31 and its ═ bright-red 1;31 around a
bright-white 1;37 title; the rules gray 1;30; the row parentheses gray
1;30 around a bright-white number; the planet name bright-white 1;37. The
status carries its own color — None white 37, Peace bright-green
1;32, Allied bright-blue 1;34. Enemy never appeared in the capture,
so IB's bright-red for it is an inference, not an observation — UNVERIFIED.
The relations line¶
Printed by the shared planet prompt, so it follows every planet the player names — a terror op, an IP message, a Spy Database lookup:
Our current relations with Starship Junkyard: Allied
White 37 body, the planet name bright-white 1;37, the status in its own
color as above.
Diplomacy Modification (BBS Coordinator only)¶
Not reachable in the capture — the caller was not the elected Coordinator — so
this is read from the binary rather than observed, so its layout and colors are UNVERIFIED. It is reached from the System
Menu's Coordinator Menu item (BRE.OVR 0x13920).
The menu has four items, keyed 1-4, and its handler settles both the
labels and the mapping. run_interbbs_operations_menu (BRE.OVR 0x015e3a, unit
ovr_015dbf) draws each row with mov al,0x31..0x34 against the four label
offsets 0x00 / 0x11 / 0x22 / 0x37, which are the four strings stored together at
BRE.OVR 0x15dbf, then dispatches on cmp al,'1'..'4':
| Key | Item | Opens |
|---|---|---|
| 1 | Dismantle Gooie | confirms Are you positive? first |
| 2 | Modify Diplomacy | the Diplomacy Modification screen below |
| 3 | Global Recon Request | posts Recon Requests Created to All BBSs |
| 4 | View Diplomacy | the Planetary Treaties chart |
A fifth key, read from a variable rather than a literal, quits; anything else redraws the menu.
IB's keys match this table as of 2026-08-18 and did not before: it numbered
the three items it had built 1-3, so each sat on the original's key for its
neighbor, and its own Player List sat on 4, View Diplomacy's key. Key 1 now
holds IB's Dismantle Gooie (#45), and Player List has moved to 5,
past the original's four. Call Off Attack Party (#270) is IB's own too, on
6 for the same reason: it disbands a group attack still assembling here and
hands every contributor their forces back, which is the Gooie lever applied to
the other planet-level commitment barons join.
The Coordinator gets no player list in the original. The two coordinator roles are different offices: the BBS Coordinator whose menu this is was elected by the planet's own barons and is an ordinary player, while the League Coordinator operates the coordinating board. Neither implies the other, and neither implies a sysop — a board's operator may be playing or may not be, so "the sysop knows the handles anyway" is no argument for handing them to whoever wins an election.
BRE's player list belongs to the second: PLAYERLIST, a command-line switch its
manual documents as "for League Coordinators only", writing PLAYERS.LST from
DATA\DUPE.BR, the duplicate-user file. That file is the only place a caller's
BBS account name is printed anywhere near the game. No screen shows one. The
empire record holds the BBS name at +0x00 and the realm name at +0x1f (both
String[30], proven against a live game.dat where a caller WRAPTEST holds a
realm Wraptest), and See Scores, the coordinator vote and the interplanetary
Player Information screen all print +0x1f — as does the recon packet, whose
PlanetInfo.Names build_recon_record fills from the same field, so a realm's
owner never crosses to another planet either. IB's Player List carried an Owner
column of BBS handles until 2026-08-18; it now names realms only. IB's own
PLAYERLIST.LST does name callers by handle, but only this board's: remote rows
keep the realm name, and a shared owner is marked by hash instead (#283).
So the menu item is Modify Diplomacy; Diplomacy Modification is the title
of the screen it opens.
Correction. This section previously recorded "eight hotkeys (DEFRIOKL)"
from BRE.EXE 0x14e50 and called the mapping unestablished. That string is not
this menu's key set: it sits in a run of GAME\BREINS.TXT help-topic names
(Spending Menu, System Menu, Coordinator Ops, Sell Menu, Covert
Operations, Preferences), and the handler above proves the keys are 1-4.
The note that IB's D was "probably the original's key for Dismantle Gooie" was
wrong for the same reason.
BRE.OVR 0x23530 carries the screen: the title Diplomacy Modification, the
prompt Change status to War, None, Peace, or Ally? (keys WNPA at 0x23594 —
this file read that string as WNPAU until 2026-08-18, but the length byte
ahead of it is 0x04 and the U is the 0x55 push bp of the routine that
follows, the length-prefix trap; there is no fifth key, and IB's four match,
with the tails ar, / one, / eace, or / lly? stored separately, so
each key character is printed highlighted ahead of the rest of its word), and
at 0x23425 the note that governs the whole mechanic:
NOTE: Planetary Diplomacy is not official. This is used for you to allow the gamers to learn of your status with other Planets. None of the info in this chart is official. (ie, none of this is forced nor reported to the other planets.
The four display words are a table at BRE.EXE 0x158b5: Enemy, None,
Peace, Allied — so the prompt's War files Enemy and its Ally files
Allied.
SDI program funding (captured live 2026-08-08, league game)¶
Seventeen consecutive SDI Program screens across one game, from an empty program to just over seven million gold. Funding is the screen's Total Funding; upkeep its Yearly Maintenance; allowance its "Maximum productive spending this year".
| Funding | Upkeep | Allowance | Strength |
|---|---|---|---|
| 0 | 0 | 250,000 | 0% |
| 250,000 | 10,000 | 250,000 | 1% |
| 500,000 | 20,000 | 250,000 | 2% |
| 750,000 | 30,000 | 250,000 | 3% |
| 1,000,000 | 40,000 | 250,000 | 3% |
| 1,250,000 | 50,000 | 250,000 | 3% |
| 1,500,000 | 60,000 | 300,000 | 4% |
| 1,800,000 | 72,000 | 360,000 | 4% |
| 2,160,000 | 86,400 | 432,000 | 5% |
| 2,592,000 | 103,680 | 518,400 | 5% |
| 3,110,000 | 124,400 | 622,000 | 6% |
| 3,732,000 | 149,280 | 746,400 | 6% |
| 4,478,000 | 179,120 | 895,600 | 7% |
| 5,373,000 | 214,920 | 1,074,600 | 8% |
| 5,899,000 | 235,960 | 1,179,800 | 8% |
| 7,078,000 | 283,120 | 1,415,600 | 9% |
Two exact fits across every row:
- upkeep = 4% of funding
- allowance = max(250,000, 20% of funding)
Both are per turn, not per game year: the allowance dropped to 0 immediately after being spent and was back at its full value the next turn, and the upkeep was billed in every turn's maintenance sequence.
The funding column is truncated to whole thousands — adding a 518,400 allowance to 2,592,000 gives 3,110,400 but the next screen reads 3,110,000 — which matches the screen's own note about funding in increments of 1000.
Strength is a function of funding AND land, so the funding column alone
cannot give it. The curve came out of the binary instead
(trunc(sqrt(funding / (10 x (regions+1)))), see docs/mechanics-reference.md),
and every row above reproduces exactly at 8,321 regions — the count this
capture's realm held, read off the Terrorist Ops price (regions × 64 (base at opsToday=0) =
532,544) on the menu the SDI screen opens from.
The Funding / Region: 0,000 Gold line is not a defect: the program is stored in
whole thousands and the screen appends a literal ,000, so a realm funding under
1,000 gold per region reads as zero.
The upkeep is billed in the maintenance sequence between the region maintenance and the crown tax:
6,724,245 gold is required to maintain your regions.
How much will you give? (6,724,245; 6,724,245)
Your SDI Program requires 10,000 gold.
How much will you give? (10,000; 10,000)
The Queen Royale requires 2,409,303 gold for Taxes.
Figures in that prompt are bright-cyan 1;36 on white 37, like the region and
crown lines around it.
Indiv. Attack Force, end to end (captured live 2026-08-11, two-board league)¶
The first fully end-to-end interplanetary strike driven against the original: sent from ALPHA (node 1) at BRAVO (node 2), resolved on the far board, and the result read back in the sender's news. Everything below is literal output.
Gate. The IP options refuse to open until a turn has been played this entry:
You must play at least one turn per entry in the game to access this option.
Target picker (the same Enter Planet Name or Number prompt BRE uses
everywhere, then a lettered roster):
Enter Planet Name or Number (? for list): Test Planet Two
Our current relations with Test Planet Two: None
Choose a target[A-Y, ?, /Search, [ENTER]=Abort]
-*Players at Test Planet Two*-
Id Empire Name Territory Score Networth
─────═══════════════───────────────────────────────────────────────────────
(A) Bravo 15 426 212
─────═══════════════───────────────────────────────────────────────────────
[BRE v0.988] 8/15/2026
IB draws the same lettered roster as of 2026-08-26. It numbered this one list until then — the last place in the game a player was picked by anything but a letter — while the original letters every roster of players and reserves names and numbers for planets.
A baron the last scores packet had under New Realm Protection wears its letter in
brackets, [B] against (A), and the strike is refused when that row is picked
(#214). Those barons were HIDDEN from the list until 2026-08-26, with a count
printed beneath it saying how many had been held back, which named nothing and
left a planet's roster disagreeing with its target list. The flag is a courtesy
either way — a packet can be days old, so the target board still refuses an
arriving strike on its own authority.
The interplanetary picker's prompt is colored differently from the local
one, though the wording is nearly the same (cap/eots-ibbs-01.cap): here the
brackets are 34 blue and every key inside them 97 bright-white, where the
local Choose a Target [A-Y,?=List RETURN to Abort] uses 31 red brackets and
93 bright-yellow keys. Another case of the color belonging to the screen
rather than to the kind of thing.
Target card (cap/eots-ibbs-02.cap, cap/eots-ibbs-03.cap, and the Lazarus
capture). Once a target letter is chosen, and before the Attack Type menu, BRE
prints its spy record on that realm. Create Group Attack prints it at the same
point when one realm is targeted, before Wait how many Hours, and Join Group
Attack prints the party's target after Join which group?, before the force
prompts. With no record on the realm nothing is printed, which is why the
capture above goes straight from the roster to the menu.
BBS Name: The Eclipse Date: 09/01/2026 14:39:55
Player Name: Pirates Ahoy! Player Letter: C
─────═══════════════──────────────────────────────────────────────────────────
Regions: 5630
[Troopers=1584] [Morale=52%]
[Jets=3409063] [Turrets=1069712] [Tanks=8712570]
─────═══════════════──────────────────────────────────────────────────────────
The figures are the record's, not the realm's now: the roster two lines up had
the same realm at 3,445 regions. Labels and brackets are white (0;40;37), the
planet and realm names bright white (1;37), the date, the letter and every
figure bright yellow (1;33), and both 78-column rules bright black (1;30).
The names sit in 33- and 30-column fields, so Date: and Player Letter: both
start at column 46.
IB prints the same card on all three paths as of v0.2.0, with its figures comma-grouped as everywhere else, and the date as when the report arrived here.
Attack Type menu. A 21-column box, sized to its own content as BRE always
does. Note the (?) Help item and that Enter takes Quit, not the first item.
(Not re-reached on 2026-08-16 — the menu needs a live two-board league with recon
data, and a single-board attempt stops at Sorry, we don't have any information
on that planet yet. The colors below are from the 2026-08-11 capture and stand.)
────[Attack Type]────
(1) Normal Attack
(2) Quick Strike
(3) Extended Battle
(?) Help
(0) Quit
─────────────────────
Choice> Quit
Colors: rules, parentheses and the closing rule are red (31); the item
digits and the [ ] around the title are bright red (91); the title
Attack Type is bright white (97); item labels are white (37). The
prompt is Choice in white, > in bright white, and the Quit default in
white — the ordinary menu-engine prompt.
Force prompts and confirmation. Unlike the group-attack picker, this one asks about every unit type, including ones held at zero, and each default is 0 rather than "send everything":
Choice> Quick Strike
Send how many Troopers? (0; 100) 100
Send how many Jets? (0; 0) 0
Send how many Tanks? (0; 0) 0
Send how many Bombers? (0; 0) 0
This attack will cost 100 gold.
Send this Attack? (Y/n) Yes
IB asks this on all three attack paths. The original prompts for the counts,
quotes the price and asks to confirm in one shared routine, so a group attack —
created or joined — is confirmed exactly as a lone strike is; IB quoted the price
on those two and then filed the attack without asking, which is how it was
reported. The default is the original's, YES: (Y/n) here, and on the Accept?
prompts throughout cap/121125-666H4H_Camembert_Public.cap. IB defaulted these
to no for a day in September 2026; matching the original won.
100 troopers cost 100 gold, so the rate is 1 gold per unit — verified for troopers only; whether the other three types cost the same is UNVERIFIED.
Result, in the sender's news after the round trip:
───Alpha's forces have returned with news of failure from Bravo of Test
Planet Two!
(?) Help opens a topic BROWSER, not a page (captured 2026-09-02,
cap/eots-ibbs-02.cap). The key echoes List of Topics beside the Choice>
prompt, then:
─────══════════════─────────────────────────────────────────────────────────
Normal Attack Quick Strike Extended Battle
─────══════════════─────────────────────────────────────────────────────────
Enter Topic (? for list): Quick Strike
Quick Strike - In the quick strike, you add the element of surprise to
your attack, and are able to fight at 110% of your normal strength.
...
Enter Topic (? for list): None
Both rules are 75 columns and 0;40;34 blue: five ─, fifteen ═, then ─ to
the end. The three topic names are 1;37 bright white in 25-column fields. In a
topic body the type's name is 1;31 bright red, the - after it 0;40;31
red, the prose 37 white, and each figure 36 cyan.
The prompt is Enter Topic (? for list):, the same live-completion prompt as
Enter Planet Name or Number (? for list): — the capture shows Quick Strike
completed from a partial answer. Enter alone answers None and returns to the
Attack Type menu; choosing a topic prints that type only and asks again, so all
three read without leaving.
The bodies are game/attack.hlp, which holds exactly these three topics and
nothing else.
One figure in that help is wrong in the original. It says the quick strike
fights at 110%; the resolver loads 1.2 (BRE.OVR 0x4055a). Anything reproducing
this screen keeps 120%.
Deliberate divergences in IB. IB writes its own help prose rather than
BRE's attack.hlp wording, and comma-groups the gold figure as it does
everywhere.
IB opens the browser above as of 2026-09-05 (#253) — the rule, the three names
in their 25-column fields, the completing Enter Topic prompt, Enter answering
None. It printed one page until then. The page it printed also covered
group-attack timing, the return path and the region picker, which
game/attack.hlp has no counterpart for; that material stays on the Attack
Types page under Game Instructions, and only the three type topics answer here.
Create Group Attack (captured live 2026-08-11, two-board league)¶
Driven on the same pair, in a played turn. Literal output:
Choice> Create Group Attack
Enter Planet Name or Number (? for list): Test Planet Two
Our current relations with Test Planet Two: None
Do you wish to target (O)ne Dominion or (A)ll? Entire Planet
Wait how many Hours (12-120)? (12; 120) 12
Send how many Troopers? (0; 89) 0
Send how many Jets? (0; 0) 0
Send how many Tanks? (0; 0) 0
Send how many Bombers? (0; 0) 0
Attack Aborted
A SUCCESSFUL creation prints nothing at all. The capture above aborts on a
zero force, but cap/20240527-134Pho_Lazarus_Public.cap carries several that go
through, and every one reads the same way (byte-checked at 131765, 131786,
133390, 133411):
Send how many Bombers? (0; 0) 0
This attack will cost 7,040,000 gold.
Send this Attack? (Y/n) Yes
──────────────────[InterPlanetary Operations]───────────────────
A blank line, then the menu. No confirmation, no party number, no departure time
— and NOT the Join table either, which the code confirms: create_group_attack
(BRE.OVR 0x02c0df) never calls the table's renderer, its only substantive calls
being configure_attack_forces, initialize_attack_record and
append_news_record twice. The two news records are the whole of what a
successful creation produces.
IB matches that silence. It printed Group attack #N formed against X on Y,
leaving at Z here until 2026-09-11, on the reasoning that the slot number is how
another baron joins the party — but the number and the countdown are both on the
Join Group Attack table, which is where a baron joins by them, so the line was
telling a player what the next screen tells them anyway.
The force prompts are identical to the individual strike's — all four unit types, including ones held at zero, every default 0. There is no attack-type menu here: a group attack has no type choice.
The departure delay is in HOURS, Wait how many Hours (12-120)?, with a
12-hour floor and a 120-hour ceiling — and it is asked BEFORE the force prompts,
not after. IB matches this (#124): it asks the same question in the same place
and stores the answer as a departure instant, because the binary does
(hours/24 added to the clock — see docs/mechanics-reference.md).
Whole-planet vs one baron is a single keypress, Do you wish to target
(O)ne Dominion or (A)ll?, echoing "Entire Planet", and it is asked BEFORE the
roster — so a planet-wide strike never draws the baron list. IB matches this
(#125); it used to offer "(the whole planet)" as the first row of a numbered
list. The capture shows only the "A" echo, so IB's "One Dominion" for the other
key is a guess at wording, not a captured string — UNVERIFIED.
An empty force prints Attack Aborted (capital A on both words), where the
attack-type menu's quit path prints Attack aborted. with a period.
Join Group Attack (captured live 2026-09-02, cap/eots-ibbs-02.cap)¶
A table of the attack parties now forming, one row each, then a prompt. This is the screen a baron reads to decide whether a group is worth reinforcing, which is why every row carries the forces already committed rather than a total.
Id│By│ Planet │ Individual Target │Troopers│ Jets │ Tanks │Bombers│ Leave
──┼──┼──────────────┼───────────────────┼────────┼──────┼───────┼───────┼──────
1│A │ The Eclipse │ Land of Dreams │ 118k │4500k │ 6698k │ 25k │ 2h
Join which group? 1
| Element | Color |
|---|---|
Column headings, the Id figure, the prompt |
0;40;37 white |
Every │, and the whole rule |
1;30 bright black |
The By letter |
1;33 bright yellow |
| Planet, Individual Target | 1;37 bright white |
| The four unit counts | 1;36 bright cyan |
Leave |
1;32 bright green |
The rule carries ┼ (0xC5) under each │ and ─ (0xC4) between. Column widths
left to right are 2, 2, 14, 19, 8, 6, 7, 7, 6 — 79 with the separators, so the
table is sized to the screen rather than to any house width.
Leave is hours remaining, 2h, not a clock time. By is the creating
realm's Id letter.
IB steps Leave down to minutes and then seconds as the departure nears
(#269) — 3h, 90m, 45s — where the original prints whole hours to the last
second. The departure is an instant (GroupAttack.DepartAt) and travel times are
measured to the second, so whole hours were rounder than what the game knows, and
"1h" covered everything from a second to a full hour. The form is at most four
columns, so it still sits in the original's 6-column cell; shortDuration in
internal/menu/duration.go defines it, and the incoming views (#268) spell a
wait the same way. Unit counts are abbreviated the way the score table
abbreviates — 118k, 4500k, and 18m on a later row in the same capture.
Several parties list together, ids ascending, up to three rows in
cap/20240527-134Pho_Lazarus_Public.cap. A whole-planet target renders as ALL,
centerd in its 19-column field; Leave runs to three digits (95h, 50h,
23h).
After the join, the joiner's share (cap/eots-ibbs-03.cap, 2026-09-05):
Send this Attack? (Y/n) Yes
You now have a 6.06% share in this attack.
The figure is 1;33 bright yellow, the rest 0;40;37. It is the joiner's whole
slot, every detachment they have put in, over the group's offense plus 0.01,
times 100, to two decimals (create_individual_attack, BRE.OVR ovr_02b783
+0x1be7; the offense is calculate_attack_force_offense). A first join into a
one-trooper party read 100.00. IB words the line its own way
(Your share of this attack is now 6.06%.), with the same colors, and prints
nothing else after a join, where it used to say You joined group attack #N.
Gooie Kablooie Ops (captured in cap/eots-ibbs-03.cap and cap/20240527-134Pho_Lazarus_Public.cap)¶
fund_gooie_kablooie. Starting one:
It will cost your planet 371 Million Gold to fund. Accept? (Y/n) Yes
The Queen Royale agrees to put in 5 million gold to the Gooie.
Target: The Undermine
Total Cost: 371 mil gold Cost Left: 366 mil gold
Creator: Lazarus
How many Million Gold do you wish to put in? (0; 366) 366
Gooie Kablooie Complete.
Opening an existing one skips to Target:. The target and both figures are
1;33 bright yellow and the creator 1;37 bright white; the fifteen spaces
before Cost Left: are part of the original's string. The prompt's maximum is
the lesser of the cost left and the gold in hand, in millions: (0; 105)
against 327 million left and 105,576,974 gold. A partial payment prints
nothing; only the payment that completes the weapon is answered. The Queen
Royale's share is the mechanic in docs/mechanics-reference.md, "Gooie
Kablooie".
IB matches the layout, the colors, the prompt and its cap, the Yes default on
the cost question, and the silence after a partial payment. It says the Queen's
line and the completion in its own words (The Queen Royale puts N million gold
toward the Gooie Kablooie., The Gooie Kablooie is complete. It launches at X
in 72h.).
Id│By│ Planet │ Individual Target │Troopers│ Jets │ Tanks │Bombers│ Leave
──┼──┼──────────────┼───────────────────┼────────┼──────┼───────┼───────┼──────
1│A │The Undermine │ ALL │ 1 │ 0 │ 1000k │ 0 │ 50h
2│A │The Undermine │ ALL │ 1 │ 0 │ 1000k │ 0 │ 50h
3│A │The Undermine │ ALL │ 0 │ 0 │ 1000k │ 0 │ 12h
The Id is the party's own slot, not its position in the list. A slot is
taken when a party is created and freed only when that party's forces come home,
so a list can show 2 and 3 with 1 absent while 1 is away. From a play report
by the project's owner, not from a capture: no capture on disk shows a gap, and
create_group_attack's head (BRE.OVR 0x096b) is the per-day allowance check —
the caller's record at +0x27a against the limit at [0x103e] — rather than the
allocation. Reading the write to the party array would settle it.
The Id field is 2 columns, which is consistent with a small reused slot
number and not with a running total.
IB now numbers them the same way (#251). NextAttackID is one monotonic
counter shared by group attacks, individual attacks, special ops, trade deals,
spy recon and terror ops, reset only when the world is
(internal/game/game.go), so a season's third group attack can be #4127 — which
no 2-column field holds and which tells a player nothing. That id stays where it
was needed, on the packet that pairs a returning result with the strike that
left; the table instead shows GroupAttack.Slot, the lowest number 1..99 no
party is using. A party away keeps its number until its forces come home, so
IB's list can show 2 and 3 with 1 absent exactly as the original's does.
Joining costs gold, charged after the force prompts and refused when it cannot be met:
Join which group? 1
Send how many Troopers? (0; 12,141) 12141
Send how many Jets? (0; 12,378,520) 12378520
Send how many Tanks? (0; 916,433) 916433
Send how many Bombers? (0; 105,520) 105520
This attack will cost 99,572,437 gold.
Sorry, you can't afford that!
The rate behind 99,572,437 was not worked back to a formula, so whether a join
is priced like an individual strike is UNVERIFIED. IB charges for a group
attack at both ends, at the individual strike's rate (#252).
IB draws this table (#251), to these widths and colors, from
internal/menu/groupattacktable.go; TestGroupAttackTableMatchesTheCapture
compares its output to both captured rows above, character for character. Two
divergences, neither visible on a captured row: a wait is rounded UP to the
whole hour, so a party filed with an eight-hour delay reads 8h for its first
hour rather than dropping to 7h the instant it is created; and a party saved
before IB numbered them, which knows only the game day it leaves on, shows ?
in the Leave column rather than a figure invented for it.
Enter alone at Join which group? answers 0 and returns to the menu. With no
party forming, the item prints There are not any attack parties at this time.
The lottery (first play of a game day)¶
Captured with color in cap/kd3-01.cap, declined in cap/eots-ibbs-01.cap,
and played several times in cap/20240527-134Pho_Lazarus_Public.cap (that one
holds no escape sequences). It follows the Queen Royale's tax refund and is the
second half of the same first-play block.
The offer is BRE's ordinary y/n prompt, cyan (Y/n) with a bright-white echo of
the full word Yes or No. Then, on separate lines, a prompt for the ticket
and one for the draw — from cap/kd3-01.cap, with the escapes shown:
Choose your 6 letters: ESC[1;36m AGNTYI
Winning Letters: ESC[0;40;31m D ESC[31m K ESC[31m M ESC[31m M ESC[1;33m I ESC[0;40;31m U
| Element | Color |
|---|---|
| ticket letters, as they are typed | 1;36 bright cyan |
| a drawn letter that matched | 1;33 yellow |
| a drawn letter that did not | 0;40;31 dark red |
That one capture proves the whole scoring rule on its own: the ticket is
AGNTYI, the draw DKMMIU, and the single yellow letter is the I — which
sits at position 5 in the draw and position 6 on the ticket, so matching cannot
be positional.
The six ticket letters are six separate keypresses with no Enter to finish, each accepted only if it is A–Z; the count of echoed characters after the prompt is what shows this. Enter fills the slot with a random letter, so the echo never stalls on a player who just wants it over with.
IB deviates on two points. An unmatched letter is drawn in bright red, not
dark red, which sits at about 2:1 against black; and the result line states the
match count in words, so nothing depends on telling two colors apart. Both are
deliberate — see docs/mechanics-reference.md.
The Coordinator notice (top of every InterBBS turn)¶
Printed the moment Play Game is chosen, before the "Since your last play"
header, and only in an InterBBS game. One of two lines, chosen by comparing the
elected Coordinator's id against the caller's own (run_door_session,
BRE.EXE 013a:0cf7).
To the Coordinator (cap/treaty-order-20260817.cap, and color-stripped in
cap/20240527-134Pho_Lazarus_Public.cap) — the office is the bright segment,
BRE's color 0x0f, and the line returns to 0x07 after it:
You are currently the ESC[0fm BBS Coordinator ESC[07m
To everyone else (cap/eots-ibbs-01.cap), the voted realm is the bright
segment, and a second line follows in the body color:
Your current vote for BBS coordinator is: ESC[1;37m Dynoland ESC[0;40;37m
You may change your vote in the system menu
Note the casing: the office is capitalised on the first line and not on the second.
A baron who has not voted has No one in the name slot, from
format_no_recipient (BRE.OVR 0x0176f), so the line never changes shape. IB
prints its own wording in the same place, the same shape and the same three
cases.
Deliberate divergence: the second line, under New Realm Protection. The
original sends every voter to the system menu, but show_game_settings +0x082f
hides the Coordinator Vote item from a realm still under protection — so a new
baron is directed to an item that is not there, and one on ConstructiveChaos
reported exactly that. IB keeps the item hidden and replaces the second line
while protection lasts, naming the turns left instead of the menu.
Game Setup and Send Trade Deal (captured live 2026-08-23)¶
Citation repair, 2026-08-31. The local-mode panel below was captured to
cap/shsbbs.cap, which is no longer in cap/, so that half is no longer
re-readable — it is kept because the league half below corroborates the layout
and two surviving captures agree on it. Do not add to it without a fresh
capture.
The panel (System Menu → G)¶
The panel is 78 columns and pairs settings two to a line, the second block starting at column 38. Labels carry their own colon and are padded to 21, so a value always begins at column 22 of its block. It is one panel, not two — the whole ruleset fits a screen because of the pairing:
──────═══════════════─────────────────────────────────────────────────────────
Game Started: 6/27/2025
Turns per day: 8
Protection Turns: 20
Daily Land Creation: 1000
Planetary Tax Rate: 6.9%
Maximum Players: 25
Bank Interest Rate: 5.0%
Investment Rate: 5.2%
Maintenance Costs: Medium Region Cost Change: Medium
Trade Deal Costs: Medium Attack Damage: Medium
Attack Rewards: Medium
Military purchasing: Enabled
This game is setup for Local mode only.
──────═══════════════─────────────────────────────────────────────────────────
On a league board the mode line changes and the interplanetary rules follow
it, still inside the same single panel — 21 content lines, no pause
(cap/20240527-134Pho_Lazarus_Public.cap, a 13-board league):
Military purchasing: Enabled
This game is setup in InterBBS mode with 13 boards in the game.
Attack Costs: Medium Terrorism Costs: Medium
Maximum Individual Attacks Per Day: 2
Maximum Group Attacks Per Day: 2
Maximum Terrorist Ops Per Day: 10
Maximum Bombing Operations Per Day: 15
Days before "lost" forces returned: 2
Gooie Kablooies: Enabled Bombing Ops: Enabled Missile Ops: Enabled
Re-captured on a 4-board league 2026-08-31 (cap/eots-ibbs-02.cap), identical in
shape with different figures — Maximum Terrorist Ops Per Day: 15,
Maximum Bombing Operations Per Day: 5, Days before "lost" forces returned: 1.
The panel does not report Sabre Handling, which is why a capture cannot say
what a board's S3-Sabre setting is; that lives only in the Configuration Editor.
Note the three label widths in use:
- 21 for the paired rows
- 36 for the "Maximum ... Per Day" block
- a three-up line for the switches whose labels carry their own leading spaces
(
'Gooie Kablooies: ',' Bombing Ops: ',' Missile Ops: ')
BRE names no league anywhere on this screen — neither a number nor a name.
The board count is the whole of it (show_game_settings, BRE.OVR 0x13c44:
'This game is setup in ', 'InterBBS', ' mode with ', ' boards in the
game.'). IB shows a league group first, carrying the league's number, this planet,
the roster size and the board holding the League Coordinator — an addition, not
a fidelity fix. Those are what identify a league: the number is what keeps two
sharing one inbound directory apart, and the Coordinator's board is who set the
rules below.
IB has no league NAME at all. It carried one until 2026-08-23 — its own
invention, with no counterpart in the original — and dropped it: hardly any
league ever set one, and a row that came and went left the group a different
shape on every board a player visited.
IB also diverges by grouping under captioned dividers and by paging in two. BRE fits one panel because its ruleset is 21 lines; IB's has grown well past that, and pairing settings two to a line is what holds the result to two pages.
This capture settles the crown tax. Planetary Tax Rate: 6.9% beside a
first turn earning 53,740 gold and charged 3,708 — trunc(53740 x 0.069) — so
the rate is a sysop's setting and the formula in
docs/mechanics-reference.md is unchanged.
Send Trade Deal — the Request side shows no counts at all¶
Read from the binary, not from a capture. cap/shsbbs.cap switches from BRE
to Immortal Barons partway through (the A-Net game server's own door menu, [0]
Immortal Barons), and the trade-deal screens in it are IB's own — a trap worth
naming, because the two games look alike enough that IB's output was briefly
written up here as the original's.
BRE draws both baskets from ONE routine, compose_trade_demand (BRE.OVR
0x25ab4), with a Send/Demand flag at [bp+0x6]. Three things branch on it, so
the Demand table is a genuinely different screen and not the same one with a
blank column:
- the header tail
' # Owned'prints only on the Send side (0x25d47); - the divider is 48 characters with it and 34 without (0x25d85);
- the row format differs, and only the Send row looks the owned figure up
(
0504:003e, 0x25db6).
Its strings: 'Stuff to ' + 'Send'/'Demand' for the title, 'Key Item
', ' # to ', ' # Owned', and
'Trade Deal requires N Carriers.' with a separate 'WARNING:' +
' You do not have enough carriers.'.
The quantity prompts are 'Send how many ' / 'Demand how many ' + the item +
'? '. BRE's bounded input helper (056d:01bf -> 0851:0bd9) is a raw
key-by-key editor that prints no bounds of its own; the (N; M) hints elsewhere
in BRE are printed by their callers.
The SEND side does have one; the DEMAND side does not — this file said
neither did until #195. create_trade_offer calls the hint helper
(0851:08b2, which builds "(min; max) ") at unit offset 0x1a4c, immediately
before the Send prompt's input call, and makes no such call before the Demand
prompt at 0x1ce7. The helper prints only "(min) " when the max is negative
(BRE.EXE 0x8dd1), which is exactly the Demand side's 0xFFFFFFFF sentinel — so
even where it is called on a sentinel it quotes no ceiling. The interplanetary
routine calls it too (send_trade_offer 0x0395). And the bounds themselves say
the same thing the columns do (create_trade_offer, BRE.OVR 0x2624c):
Send prompt bounded by the player's own count of that item (0x2679d)
Demand prompt bounded by 0xFFFFFFFF — a sentinel, not a figure (0x26a4b)
IB matches the important half and diverges on the rest. No Owned column on
the Request side, and no ceiling quoted in its prompt — IB used to print the
sentinel as (0; 1.0737B), which reads like information about the other realm
and is not. IB keeps its (suggested) hint on both sides where BRE has none,
and keeps a real 2^30 ceiling internally so the figure stays inside an int on
a 32-bit door build.
Special Operations (InterPlanetary Ops → 8) — captured live 2026-08-31, cap/eots-ibbs-02.cap¶
Eight items, numbered 1-8 with a (0) Quit, in a 37-column box. The four
bombing ops carry a right-aligned price; the three missiles and Send SpyGuy show
none, because those are priced off the target once one is named.
────────[Special Operations]─────────
(1) Bomb Food Market 10,000,000
(2) Bomb Trading Market 25,000,000
(3) Bomb Trade Routes 25,000,000
(4) Undermine Investments 75,000,000
(5) Nuclear Assault
(6) Chemical Bombing
(7) S3-Sabre
(8) Send SpyGuy
(0) Quit
─────────────────────────────────────
IB draws this menu to the same shape: one column, the red accent the table
above gives it (bright red, for the contrast reason recorded there), and the four
bombing prices in a right-aligned column — its own Key Item Price header row
included, the same addition the Covert Operations screen makes. The box is 38
against BRE's 37, for the reason the covert menu's is 34 against 32. The menu was
two columns in the InterPlanetary menu's yellow, with no prices at all, until
2026-09-10.
A missile that has been fired today is dropped from the list. Same capture, after Nuclear Assault and Chemical Bombing were used, then after the S3-Sabre:
(4) Undermine Investments 75,000,000 (4) Undermine Investments 75,000,000
(7) S3-Sabre (8) Send SpyGuy
(8) Send SpyGuy (0) Quit
The remaining items keep their own keys — 7 stays 7 while 5 and 6 are gone — so
the menu is filtered, not renumbered. Mechanic and addresses in
docs/mechanics-reference.md.
Reading this screen from a capture, watch what an echo proves. Choice> Quit
Undermine Investments appears in the same session and item 4 never disappears:
the op was selected and then abandoned at the planet prompt (Enter Planet Name
or Number (? for list): None). The echo records the keypress, not the outcome.
The tell for a completed op is the row vanishing or the gold moving.
The S3-Sabre launch flow — captured live 2026-08-31, cap/eots-ibbs-02.cap¶
Blurb, then planet, then target, then price, then a single confirm:
The S3-Sabre is a variable-return missile. Capable of a variety of
special effects, this missile can be extremely devastating.
In addition, for reasons as of yet unknown, large quantities of Troopers
on the target empire are known to cause the missle to backfire.
NOTE: Sabre Attacks require 500 Bombers to deliver their payloads.
Enter Planet Name or Number (? for list): The Eclipse
Our current relations with The Eclipse: Enemy
Choose a target[A-Y, ?, /Search, [ENTER]=Abort] Pirates Ahoy!
Cost: 36122736 Gold
Would you like to prepare the attack? (Y/n) Yes
Attack Launched.
No dial prompt, and the blurb is SHORT — both because of the board's Sabre
Handling setting. The binary's full blurb has two more paragraphs ("However,
the S-3's Dial-technology is not 100% accurate…" and "The Sabre missile comes
with a dial which can be set anywhere from 0 to 10…") and a
Enter a number for the dial: prompt, all of them behind the same guard: only
the User Select setting shows them. Two players on this board reported the
missile never asking them; this is the capture of that, and it is the setting
working. See docs/mechanics-reference.md for the guard's address.
Note Cost: here is printed bare — no comma grouping — where IB comma-groups it.
Travel Times (InterPlanetary Ops → T) — captured live, cap/eots-ibbs-01.cap¶
The board you are calling is not in the list, and only it is missing. The same session's planet roster a few hundred lines earlier (line 20389) shows four planets and does include the caller, which is what rules out the alternative reading of a three-board league:
## Planet Name Location
1 Nova Hub Brisbane, QL, AUS
2 Starship Junkyard Brisbane, QL, AUS
3 Eye of the Storm New Plymouth, TN, NZ <- the board being called
4 The Eclipse Sydney, NS, AUS
The screen itself (line 20613) lists the other three:
Average Turn Around Times to All BBSes
──────═══════════════──────────────────────────────────────────────────────
Nova Hub 0.80 hours
Starship Junkyard 0.80 hours
The Eclipse 1.00 hours
──────═══════════════──────────────────────────────────────────────────────
Geometry, measured off the capture: a 75-column rule with a 15-column
double run starting at column 6, and the planet name in 30 columns before
its figure. Hours print to two decimals over a value quantized to a tenth
(0.80, 1.00) — the format and the quantization are different widths, which
is easy to get backwards.
show_interbbs_turnaround_times (BRE.OVR 0x23d76) holds exactly four strings:
'Average Turn Around Times to All BBSes', 'No Data', ' hours', ' days'.
No Data matters to the finding: BRE does print a row for a board it has
never measured, so leaving the caller out is a deliberate omission rather than a
row suppressed for want of a measurement.
IB matches all of it — KnownBoards() drops Config.BoardID and nothing else,
and the constants are travelRuleWidth/travelRuleDouble/travelNameWidth.
Its sub-hour tiers (seconds, minutes) are IB's own; BRE never needed them,
because no 1990s FidoNet link answered in under a minute.
Nuclear strike, waste, and decontamination¶
Driven live 2026-09-12; the raw log is cap/nuke-waste-20260912.cap. The
attacker held 600 Bombers and a billion gold; the target was staged at exactly
2,000 regions (500 Coastal, 300 River, 400 Agricultural, 200 each of Desert,
Industrial, Urban and Mountain) with no Technology and no turrets, so every
figure below is uninflated. Region maintenance came out at 1,826,000 for 2,000
regions — 913.000 per region exactly, the known constant, which is the
cross-check that the realm carried no research.
The target picker is the shared one, Choose a Target [A-Y,?=List RETURN to
Abort], and it echoes the chosen realm's NAME rather than its letter. ? draws
the -*Barren Realms Elite*- roster.
The arms dealer quotes the price and asks to confirm, in two lines of its own flavor prose (not reproduced here — IB writes its own; see AGENTS.md on where that line falls). The figure is what matters:
- 7,086,000 gold for a 2,000-region target = 3,543 per region, matching
NukeCostPerRegionexactly. The quote is taken from the target's region count alone. - The confirm is a
Deal? (Y/n)— default yes, unlike IB's, which defaults to no because a missile can cost tens of millions.
The strike reports the ruined count in one line. Here, 120 regions out of
2,000 — 6%, inside the 5-9% band (NukeWastePct 7, plus and minus a Random(3)
each).
The removal is proportional and exact. Reading the save either side of the strike, every type lost precisely 6% and all 120 went to Waste, with total land unchanged:
before 500 C / 300 R / 400 A / 200 D / 200 I / 200 U / 200 M waste 0 = 2000
after 470 C / 282 R / 376 A / 188 D / 188 I / 188 U / 188 M waste 120 = 2000
The victim's status block carries [120 Waste] as the last cell of the
Regions row.
Decontamination is a maintenance-sequence prompt, not a menu item. The full
order in allocate_turn_budget is Bank → Armed Forces → regions → SDI →
decontamination → popular support → military morale → Queen Royale taxes; a step
is skipped when it has nothing to ask for (this realm saw no SDI step at zero
funding and no morale/support steps at 100%). The prompt names the whole
allowance's bill and offers it as both the suggested and the maximum value:
1,642,800 gold is required to decontamine some waste regions.
How much will you give? (1,642,800; 1,642,800)
(decontamine is the original's own spelling.) The arithmetic, all of it
matching the constants in balance_costs.go:
- 24 regions cleaned from 120 of waste —
waste/5, the 20% allowance. - 68,450 gold each, half the 136,900 region price at this size, the food technology factor being 1.0 here.
Paying prints the revived count and then opens the region picker, because
cleaned land comes back UNTYPED — it is moved out of Waste (+0xb6) and into the
untyped-regions slot (+0xba), the same pool a won attack fills, and the owner
names the types:
24 Waste regions have been revived.
Key Name Owned
─────═════───────────────
(C) Coastal 470
(R) River 282
...
(T) Technology 0
(*) Advisors
─────═════───────────────
[24 Regions left] Your choice?
Allocating all 24 to Coastal left the save at waste 96 / coastal 494, total still 2,000.
Nothing ever dumps waste automatically. Every writer of +0xb6 was
enumerated across both binaries and all four addressing idioms (add di,0xb6,
[di+0xb6] and their es:-prefixed forms):
- the ruin helper adds to it
allocate_turn_budgetsubtracts what was decontaminatedconfirm_end_gameclears itprocess_end_of_turn(+0xd470) zeroes it along with all eight other region counts — guarded by population, not waste (+0x62falling below 1 wipes the realm's whole region block)
So a nuked realm carries its waste, paying maintenance on it, until the owner
either pays to decontaminate or drops the regions from the Sell menu
(run_drop_regions_menu, whose only caller is sell_empire_assets).