Ten releases since I last posted:
b14... the web client is now draws vitals, renders the pages a verb pushes, remembers which world you were on, and says who just logged in. Builders got room coordinates and a map that takes the numbers they typed. A world can run its own code at startup. @renumber moves the rows now instead of rebuilding the object.
b15... '&i' is the indirect object and nothing else. It used to also be a color code and substitution only filled a token when it was given something to fill it with, so a '&i' in a message sent without an iobj fell through to color pass and inverted the rest of the line. Telnet made it reverse and the browser made it italic. Yuck. Attributes are spelled '&<reverse>', '&<underline>', '&<bold>' now, which can't collide because substitution has no '<...>' token. If you have a world using '&i' or '&u' as color, that is the migration.
b16... a list you read from a property and then changed didn't save the change and didn't say so either. 'obj.wear_list.insert(0, [])' did nothing at all. A read gives you a container that remembers where it came from and writes itself back. On an inherited read it creates a local property on the reader rather than editing the parent, which i think is the copy-on-write we all expect. Also added conjugation so '&v(smile)' conjugates per reader, one string. The actor sees "You smile at the guard" while the room sees "Robin smiles at the guard".
b17... the big one, and mostly things I would rather not have found. '@set' called the real 'eval()', so gm3 was arbitrary Python, eg: '@set me.description = __import__('socket').gethostname()' on a fresh world. 'auth_level()' read the property with getattr, which walks the parent chain, so '@parent me = #100' and '@clear me.auth' made a wizard in two commands. Authority is not a property of the kind of thing you are, and it reads the object's own auth now. Four builtins reported success and wrote nothing. One '@set' could freeze an object on disk, silently, for good. Ownership is real, so a builder builds without touching anybody else's world. The other half of the release is the part I actually enjoyed, $list_utils, $command_utils, $code_utils and $perm_utils are objects now, forty-two methods off a Python module and onto the world where LambdaCore had them all along. $string_utils, $match_utils and $obj_utils too.
b18... the server was listening on IPv4 only. Fixed.
b19... WIZARD is gm5, which is what every check already assumed. Chargen couldn't make a character for a staff account.
b20... help stopped showing players the pages written for people writing verbs. 'help #42.go' now says which object it means.
b21... a port set in megamoo.toml now pins the listener the way a typed --port does.
b22... came out of feedback from a blind developer who read the verb code and said the docs "just bounce off". He was right: 5,800 lines of restated comments gone, screen reader mode available before character creation instead of after it, and the building commands answer with one labelled fact per line. Verb files also lint clean now, 4,683 false undefined names to 0.
b23... a world you already built can take a fix applied after you built it. 'megamoo upgrade' compares your world against the version it came from and brings across what you never touched, reports what you changed as yours, and refuses while a server has the world open. Reaches back to beta3, so existing worlds are covered.
pip install megamoo
https://malifaxlax.github.io/megamoo/