Brazil
unread,Mar 5, 2026, 1:41:43 PMMar 5Sign in to reply to author
Sign in to forward
You do not have permission to delete messages in this group
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
to tinymux
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512
# State of TinyMUX—Developer Preview (brazil branch)
This is a heads-up about major changes landing on the `brazil` development
branch. These changes are NOT yet in a release. Do not pull from this
branch and @restart a production game without understanding what has
changed.
## The Database Layer Has Changed
The biggest change: **SQLite is now the only storage backend.** The old
CHashFile (.dir/.pag) attribute store is gone. The MEMORY_BASED compile
option is gone. There is no configure flag—SQLite is always on.
What this means in practice:
- On first startup after upgrading, TinyMUX reads your existing
flatfiles (netmux.db, comsys.db, mail.db) and migrates everything
into a single `netmux.sqlite3` database.
- After migration, the flatfile is no longer the primary store. @dump
performs a WAL checkpoint, not a full flatfile rewrite.
- dbconvert can still import/export flatfiles for backup and migration:
`dbconvert -d netmux -i netmux.flat -l` (load into SQLite),
`dbconvert -d netmux -o netmux.flat -u` (unload from SQLite).
New flags `-C comsys.db` and `-m mail.db` handle comsys/mail flatfiles.
- All object field mutations (name, location, flags, powers, etc.) are
written through to SQLite immediately—no more waiting for @dump.
- Comsys and @mail mutations are also written through in real time.
- Attribute reads go through an LRU cache with SQLite as the backing
store. `@list cache` shows hit rates and storage stats.
- `@search` for simple queries (owner, type, zone, parent, flags) is
routed through indexed SQL for better performance on large databases.
**Do NOT** pull this branch, build it, and @restart an existing game
expecting everything to Just Work. The on-disk format is different.
Plan your migration. Back up your flatfiles first.
## Unicode Overhaul
TinyMUX now has comprehensive Unicode support built on four layers:
### Layer 1—Unicode 16.0 Property Tables
All character classification and mapping tables updated from Unicode 10.0
to 16.0. This covers case mapping (tolower/toupper/totitle), character
width, printability, and script classification.
### Layer 2—NFC Normalization
All attribute values are normalized to NFC (Canonical Decomposition
followed by Canonical Composition) on write. Input from players is also
normalized. This means that equivalent Unicode sequences (e.g., e +
combining acute vs. precomposed e-acute) are stored identically, so
string comparisons and pattern matching work correctly.
### Layer 3—Grapheme Cluster Segmentation (UAX #29)
String functions that operate on "characters" now operate on extended
grapheme clusters. A base character plus its combining marks (accents,
diacritics, emoji modifiers, ZWJ sequences) count as one unit. This
affects mid(), left(), right(), strlen(), and related functions.
### Layer 4—Unicode Collation Algorithm (UTS #10)
Full implementation of the Unicode Collation Algorithm using the Default
Unicode Collation Element Table (DUCET) for Unicode 16.0. This provides
linguistically correct sorting across all scripts.
- New sort types: `u`/`U` (Unicode collation), `c`/`C` (case-insensitive
Unicode collation), `a`/`A` (legacy ASCII sort).
- `sort()`, `setunion()`, `setdiff()`, `setinter()`, and `comp()` all
support these new sort types.
- Auto-detection of sort type now defaults to Unicode collation for
non-numeric lists.
## Other Cleanup
- `have_comsys` and `have_mailer` config options removed. Comsys and
@mail are always present. You don't have to use them, but you can't
compile them out.
- GANL networking is always on (no `USE_GANL` define). SSL is always
compiled in if OpenSSL is available (no configure flag needed).
- Dead code removed: hashfile_backend.h, CHashFile/CHashPage classes,
MEMORY_BASED conditionals, SQLITE_STORAGE conditionals.
## Feature Additions (since 2.13.0.7)
Beyond the two big infrastructure changes above, the `brazil` branch has
accumulated a substantial backlog of new features, fixes, and quality-of-life
improvements. These are all queued up but not yet on the `dev` branch.
### New Functions
- objid(), isobjid(), and %: substitution—stable object references
that survive @destroy/@create cycles.
- parenmatch()—find matching parentheses/brackets in strings.
- pose()—formatting function for pose-style output.
- mailreview()—softcode access to @mail/review data.
- clone()—side-effect function to clone objects.
- verb()—side-effect function for @verb actions.
- lock()—side-effect function for setting locks.
- attrib_set()—side-effect function for setting attributes.
- regedit() family—regexp-based string editing.
- ledit()—list editing function.
### New Commands and Switches
- @scan—examine trigger and listen matches on objects.
- @logrotate—rotate log files without restarting.
- @nameformat—custom name formatting for things and exits in look.
- @oemit/list and expanded oemit()—emit to all but a list of targets.
- @addcommand/noeval—add commands without argument evaluation.
- @mail/review all—review all sent mail at once.
- @mail/next—advance to the next unread message.
- @cpattr wildcarding—copy attributes with wildcard patterns.
- /now switch for @switch, @dolist, @trigger, @force—immediate
execution bypassing the command queue.
- page/blind—page without revealing your location.
- HELP command from the connect screen.
- IDLE command for keepalive.
### New Flags and Powers
- NOEVAL flag (object and attribute)—suppress evaluation.
- INDESTRUCTIBLE flag—protect objects from @destroy.
- NOMODIFY flag—prevent attribute changes.
- NOEXAMINE flag—prevent examination.
- dark @power—full in-room hiding.
- no_mail_expire power—exempt from mail expiration.
- named global registers—reference registers by name, not just 0-9.
- PIDs on the command queue—process IDs for queued commands.
### New Config Options
- pronoun_group—configurable custom %s/%o/%p/%a substitution sets.
- mail_max_per_player—per-player mailbox size limits.
- email_per_hour—rate-limiting for @email.
- terse_nospoof—terse NOSPOOF notification format.
- no_flash—disable screen flash/bell.
- @function/restrict—restrict function access by flag/power.
### Other Improvements
- OBF_LEVEL and HSS_LEVEL evaluable as softcode.
- Possessive matching in locate() via 's' flag.
- Unicode case-folding at all call sites.
- sort() ignores color codes in comparisons.
- Per-player suppression of channel join/leave messages.
- Examined and decompiled attributes sorted alphabetically.
- Allow Royalty to use @last on other players.
- Allow isdbref() to accept leading/trailing spaces.
### Bug Fixes (beyond 2.13.0.7)
- Fix lrooms() DFS bug by replacing with BFS.
- Fix @mail/review and @mail/retract recycled dbref privacy leak.
- Fix @hook for \ command.
- Fix whisper and comsys colon-space pose formatting.
- Purge mail on player destruction.
- Remove database compression feature (was broken, never used).
- Support UTF-8 in @email.
## What Is NOT Changing
- The softcode language is backwards-compatible. Existing softcode will
work. The new Unicode sort types are opt-in; existing sort() calls
with numeric or alphabetic types still work as before.
- The flatfile format is unchanged. You can still export a flatfile with
dbconvert and read it on an older version.
- The network protocol is unchanged. Existing clients work fine.
- Configuration files are backwards-compatible (the removed options are
silently ignored if present in your mux.conf).
## Timeline
No release date yet. This is active development on the `brazil` branch.
When it ships, it will be TinyMUX 2.13.0.8.
-----BEGIN PGP SIGNATURE-----
iQIzBAEBCgAdFiEE8GWFNwJrhRGk25uvF80K5PxQP7EFAmmpzi4ACgkQF80K5PxQ
P7Grxw/+LWD9T8D4IjQE3jyaEsYoGY/plOvpdiPu5Ri3qHuZTZSoPvB8Pv381jPY
8MN1S1HUongTwyFuR8pyrZ1MNqQ20w1VT9IecOqabjh84CF6T5GZqXsqq8pwSYD+
xtfoTUAtbP5LG8yb1DuABl6siZcODt7xX4gv7ZR0tGjLktbWm+hSeFPM+RZiVYP/
e8YXEEJvaBoj8UGOXpa+b1lbTwFaVvKjI3fj+xFbFnIgX5rlgaFLvlbf8g94dI9S
Dp24GC8sy6CIEA/JZgSmhkF9SIcakPGebuvR6F67dcruJsoIm4XXyz3NzR1ApbL9
qjc3IwM9XAfrhMsozRnPUv422GHO6Z8zJR1A1AeOrGHkOv10zb0oS4RN/DBzhbbo
TYx7cPMDIBf+FxY3JRNopCVTVj4qbTw2rIcKo8M9GjDbfik3nRWvTXSuHgRq8GDg
8Or5H8helKN4xT3E3bIdPgpPD2bQWqGd97L3UqsxyXRjwJn21REogucH/KvjWJmU
MO/YEtZKp6snaJXwrBtSO4YCUsuPDysdHUgrT1lE2m2gDvTKg5Fn/+L42Qbx64BU
GZrFfkn+I0HTkp5+zb13RTUTAa4R2Rq97vQZuU8ngh8/yVupdSVcTcP5G/r1LCBe
khoyVm8lPYL/2v2OGuNQQAb9Z1XPO5o7vVTxI9eaDnz9SfLfmiQ=
=Wddd
-----END PGP SIGNATURE-----