- SQLite is now the always-on storage backend. All object metadata, attributes, comsys channels, and @mail are stored in a single SQLite database with write-through on every mutation. @dump performs a WAL checkpoint only—no flatfile serialization, no fork. Crash durability is immediate. - @search for simple cases (owner, type, zone, parent, flags) routes to indexed SQL queries—O(log n) instead of linear scan. - Unicode updated from 10.0 to 16.0. All attribute values are NFC-normalized at storage time. - String functions use grapheme cluster indexing (UAX #29) instead of codepoint counting. - Unicode collation (UCA/DUCET) is the default sort order. sort() and set functions use locale-correct Unicode comparison. - CJK width-aware string operations: center(), ljust(), rjust(), columns() respect double-width characters.
# Feature Additions:
- chr() and ord() support the full Unicode range. - Case-insensitive Unicode collation sort type. - @list cache for attribute cache and SQLite storage stats. - dbconvert supports -C and -m flags for comsys and mail flatfile import/export. - HELP command from the connect screen. - @scan command. - @logrotate command. - @mail/next command. - @mail/review all. - @nameformat for things and exits in look. - @oemit/list and expanded oemit(). - @cpattr wildcarding. - @addcommand/noeval. - @function/restrict. - /now switch for @switch, @dolist, @trigger, @force. - page/blind switch. - IDLE command. - NOEVAL object flag and attribute flag. - NOEXAMINE, NOMODIFY, and INDESTRUCTIBLE flags. - objid(), isobjid(), and %: substitution. - clone(), lock(), attrib_set(), verb(), pose(), mailreview(), regedit(), ledit() functions. - Per-player suppression of channel join/leave messages. - Named global registers. - Configurable pronoun_group for custom %s/%o/%p/%a substitutions. - dark @power for full in-room hiding. - no_mail_expire power and mail_max_per_player config. - no_flash, terse_nospoof, email_per_hour config parameters. - Possessive matching in locate() via 's' flag. - PIDs in command queue. - Purge mail on player destruction. - sort() ignores color in comparisons. - Unicode case-folding at all call sites.
# Bug Fixes:
- Fix lrooms() DFS bug by replacing with BFS. - Fix @mail/review and @mail/retract recycled dbref privacy bug. - Allow isdbref() to accept leading/trailing spaces. - Fix whisper and comsys pose colon-space to match room pose behavior. - Fix @hook for \ command. - Fix chr() token parsing/range checks. - Fix grapheme count byte-length overreads in trunc/scramble. - Fix RI grapheme pairing and ord() invalid UTF-8 handling. - Fix 3-byte and 4-byte UTF-8 decode masks. - Fix vattr rename collision handling and SQLite delete sync. - Comprehensive UTF-8 validation hardening across all string processing paths.
# Performance Enhancements:
- Indexed @search via SQLite for owner, type, zone, parent, and flag queries. - Attribute cache preloading on player connect and object move. - Replaced CHashTable with std::unordered_map throughout. - Replaced qsort() with std::sort() in sort and set functions. - Eliminated A_LIST attribute enumeration; replaced with direct SQLite queries and STL iteration.
# Miscellaneous:
- SQLite 3.49.1 amalgamation bundled. - Omega converter freshened for all four server formats (T5X, T6H, P6H, R7H). Direct T5X-to-R7H path preserves full 24-bit color. - Removed CHashTable, CHashPage, CHashFile, IntArray, and legacy A_LIST machinery. - Removed MEMORY_BASED build option and have_comsys/have_mailer config options. - Removed database compression feature and deprecated stack subsystem. - Sort examined and decompiled attributes alphabetically. - Added 175 new smoke test cases expanding coverage to 348 total.