ANetBBS Changelog
Versions are internal build numbers. Public releases are tagged
separately. Current release: v1.0b2.33 (July 2026). Full release: August 1 2026.
v1.0b2.18 — ANetCRAFT: day/night cycle was 40 seconds, now 10 minutes (July 2026)
- FIX:
DAY_TICKwas 500 (40 seconds/day at the 80ms tick rate) — reported by Jerry as far too fast to feel like a real survival mechanic. Changed to 7500 (~10 minutes/day). All consuming code (DayT()/_day_t(), the "Day N" counters, the saved-game lobby preview) derives from this one constant via division/modulo, so the change propagates cleanly with no other edits needed. Applied identically to both this Python version and the standalone C# ANetCRAFT-Door project.
v1.0b2.17 — ANetCRAFT: fix severe lighting-related slowdown (July 2026)
- FIX: v1.0b2.16's
World.light_at()was ported straight from the C# version's per-cell design — an O(R²) 17×17-tile neighborhood scan for every query, called once per visible cell (~1560 cells/frame in_draw_world). Cheap in compiled/JIT'd C#; measured 155ms/frame in pure Python against an 80ms tick budget — reported by Jerry as "very slow" on the main ANetBBS server and "pretty much unplayable" on a Pi3. NewWorld.compute_light_grid(cam_x, cam_y, vp_w, vp_h, is_day)computes the entire viewport's lighting in one pass: one O(depth) scan per column for skylight instead of per cell, and one pass over the viewport+margin that finds each light source once and splats its falloff onto nearby grid cells, instead of every cell independently re-scanning its neighborhood for sources._draw_worldnow calls this once per frame. Measured 5-7ms/frame typical, ~29ms even in a deliberately dense-torch stress test — both comfortably under budget. Verified byte-identical output against the old per-cell method across a full viewport (0 mismatches) before trusting the optimization. - FIX: Dropped lava (block 15) from
LIGHT_SRCin the Python version — a visible lava sea in the Nether can be hundreds of tiles, each of which would trigger an O(R²) splat; torches/glowstone/portals are naturally sparse and don't have this problem. (Lava is still a light source in the standalone C# door — not an issue there, not changed.)
v1.0b2.16 — ANetCRAFT: full Minecraft-style progression + win condition (July 2026)
- FEATURE: Ported the same expansion built for the standalone C# ANetCRAFT-Door project into the bundled Python
anetbbs/features/anetcraft.py(1582 → 2468 lines), by hand — the two are separate codebases with no shared code. Added:World.light_at()sky+torch/glowstone lighting (hostile spawns now gated on darkness viais_dark(), not day/night, so unlit caves are dangerous at noon); furnace block (id 20) + smelting (SMELT/FUELtables, iron/gold ore now drop raw ore ids 67/68 instead of ingots directly, sand→glass moved from instant craft to furnace); 4-tier armor system (ids 77-92) withPlayer.total_defense()/reduced_damage(); lava burn damage +fire_ticksstatus; a_respawn_player()death cycle that didn't exist before; a Nether dimension (World._gen_nether()) reached by building + lighting an Obsidian portal with Flint and Steel (flood-fill frame validator in_try_ignite_portal), with Blaze and Ghast mobs; Enderman mob → Ender Pearl → Eye of Ender crafting chain; an End dimension (World._gen_end()) reached through a ring of 8 End Portal Frames, hosting a full Ender Dragon boss fight (_dragon_ai) with healing-crystal pillars, ending in a victory screen (_render_victory_overlay) and Dragon Egg trophy. World keeps going after victory. - FIX: Pressing Enter in the ANetCRAFT inventory screen never actually swapped items —
_handle_key's generic "close overlay" branch intercepted Enter before it ever reached_inv_key's swap logic. The "Enter=grab/drop" hint had been non-functional since this feature was written. - FIX: Starving to 1 HP in ANetCRAFT could leave a player stuck there forever — there was no death/respawn handling at all for the zero-HP case.
- NOTE: Save format changed (
dimslist of per-dimension world+mobs instead of a single top-levelworld/mobs).load()auto-migrates old single-dimension saves, so existing player saves on the live server load fine.
v1.0b2.15 — Terminal message wrapping fix + Admin menu reorg (July 2026)
- FIX: Terminal message reader (board threads, private messages, Inter-BBS instant messages) truncated any line past column 78 (
line[:78]) instead of word-wrapping it — long web-composed paragraphs were cut off mid-sentence when read over telnet/SSH.read_thread, the PM viewer, and the InterBBS IM viewer now build their output through_wrap_text()and a new shared_page_lines()pager (extracted from_page_text()), so long messages word-wrap to the session's terminal width and paginate with a--MORE--prompt instead of truncating. - FEATURE: Admin navbar dropdown reorganized from one 58-item flat list into 8 entries (Dashboard + Users/Messages/Files/Content/Network/System/Settings). Each category opens a new
/admin/hub/<section>page rendering its tools as cards (ADMIN_HUB_SECTIONSinweb/admin.py,templates/admin/hub.html). Purely a navigation change — no existing admin route or URL was moved.
v1.0b2.14 — CP437 encoding fixes: terminal input + web renderer (July 2026)
- FIX: ANEdit dropped CP437 high-byte characters (ä ö ü Ä Ö Ü ß etc.) entered from SyncTERM/CP437 sessions. Root cause:
_Keysdecoded raw bytes aslatin-1, turning CP437 byte 0x84 (ä) into U+0084 (a C1 control character), whichisprintable()rejects._Keysnow usessession.encoding(defaultcp437) so high bytes decode to their correct Unicode glyphs and are inserted normally. UTF-8 multi-byte buffering also added for SSH sessions. - FIX: Web interface rendered correctly stored Unicode characters (ä ö ü ß etc. in local board posts) as CP437 box/line/math symbols. Root cause:
render_msg_body_richalways ran a latin-1→CP437 round-trip (e.g. ä U+00E4 → byte 0xE4 → CP437 Σ). Local posts are stored as proper Unicode and need no charset conversion — the round-trip is now skipped when nochrsheader is present.
v1.0b2.12 — Widescreen: 132-col art border removal + status bar overflow fixes (July 2026)
- FIX:
║side border characters removed from all 132-col ANSI art files (main menu, game center, chat, goodbye) for a cleaner borderless look. - FIX: Status bar overflowed to a second line on game_center132, chat132, and goodbye132 when BBS name + version expanded past 132 cols. Middle spacing trimmed to absorb the template expansion.
- FIX: goodbye132 title banner (
Thanks for calling @BBS@!) overflowed when BBS name is long — trailing decoration bytes trimmed. - FIX: Door Games box:
║side borders replaced with plain═horizontal bars. - FIX: File library area list column overflow with
[inactive]/[sysop]flags at 132 cols. - FIX: ANView (message reader) header bar, status bar, and content now use terminal width.
- FIX: Door Games list name/type column widths now scale with terminal width.
v1.0b2.11 — Graffiti Wall: widescreen + ASCII mode support (July 2026)
- FEATURE: Wall box scales with terminal width (131 cols max on widescreen sessions).
- FEATURE: ASCII mode substitutes
+/-/|for CP437 box chars; pipe colors stripped in post content.
v1.0b2.10 — MRC: send TERMSIZE to server at connect time (July 2026)
- FEATURE: MRC client sends
TERMSIZE <cols>,<rows>to the remote MRC server immediately after joining. On a 132-col session this sendsTERMSIZE 132,37. - NOTE: WHOON
/wholist format is set by the remote server (mrc.bottomlessabyss.net) for 80-col. Chat word-wrap already uses the full local terminal width.
v1.0b2.9 — MRC: status bar blue fill now spans full terminal width (July 2026)
- FIX: Root cause of narrow MRC status bar:
room_s/topic_sboth embed\x1b[0m]which reset the blue background before the gap spaces were written. Added\x1b[44m]re-assertion before gap and before\x1b[K]. Status bar now fills the full 131-col width on widescreen sessions.
v1.0b2.8 — MRC: active terminal size detection + status bar fill fix (July 2026)
- FIX: MRC detects actual terminal size via ANSI CPR query when session
window_sizeis small (<100 cols). Fixes 40-col MRC status bar on telnet sessions where NAWS was not negotiated at connect time. - FIX: MRC status bar uses
\x1b[K]after writing content to fill the rest of the row with blue — no longer depends on\x1b[2K]behavior. - FIX:
_term_columnsfloor raised from 40 → 64.
v1.0b2.7 — Widescreen: MRC chat fixes (July 2026)
- FIX: MRC status bar blue fill stopped at content end —
\x1b[44mnow set before\x1b[2Kso erase fills blue. - FIX: Chat Systems menu
banner/footer/menu_itemnot width-aware — now pass_w. - FIX: MRC
_enter_split_screencheckssession.cols/.rowsas fallback for_term_columns.
v1.0b2.6 — Widescreen fixes: RSS pager/lightbar, file browser, ANetIRC (July 2026)
- FIX: RSS lightbar and pager separator lines hardcoded to 76 — now
ui_width(session). - FIX: RSS item list title column capped at 62 — now expands with terminal width.
- FIX: RSS article pager divider hardcoded to 72 — now expands.
- FIX: File area list/detail dividers hardcoded to 44 — now terminal width; name + desc columns expand.
- FIX: InterBBS IM inbox banner not width-aware — now full width with wider message preview.
- FIX: ANetIRC capped terminal width at 79 — now 131 so two-panel TUI fills 132-col sessions.
v1.0b2.5 — Full widescreen support for all terminal screens (July 2026)
- FEATURE:
ui_width(session)added toansi_ui.py. Everybanner(),footer(), table header, and content column across all 20+ screens now passes the terminal width. All screens expand to fill wide (132-col) terminals automatically. - FEATURE: Content column widths (board name, thread subject, bulletin title, RSS feed/item title, echomail area name, file area name, message body) scale proportionally with
ui_width.
v1.0b2.4 — Game Center: Q and 3 both exit (July 2026)
- FIX:
Qdid not exit Game Center — only3did. Both now accepted (case-insensitive), matching Chat and Door Games behavior.
v1.0b2.3 — Display @-codes applied in all sub-menu art files (July 2026)
- FIX:
@SYSOP@,@BBS@,@VERSION@,@NODE@,@TIME@not substituted in sub-menu art. Addedwrite_menu_art(session, slot)toansi_ui.py— shared helper that applies display codes before writing. All feature sub-menus converted to use it. - FIX:
game_centerart had[Q]for back but code checked'3'. Art files corrected.