Main branch¶
+-
+
Fix: Typo in
defense_typein evadventure tutorial (feyrkh)
+[Docs][pull3576]: Rework doc for Pycharm howto
+Docs updates: feykrh
+
From c122c26f8f1d84cd2ec05c2b4773132524bc1369 Mon Sep 17 00:00:00 2001
From: Evennia docbuilder action Fix: Typo in [Docs][pull3576]: Rework doc for Pycharm howto Docs updates: feykrh Oct 1, 2024Table of Contents
+
Changelog¶
+Main branch¶
+
+
+defense_type in evadventure tutorial (feyrkh)Evennia 4.4.1¶
Turn based battle system framework
+mailmultidescerpuzzlesstorageturnbattlefrom evennia.contrib.base_systems import building_menu
@@ -297,17 +298,17 @@ copy its entire folder to your game directory and modify/use it from there.
+
-
-
+
+
-
-
-
+
+
@@ -487,6 +488,7 @@ the rpgIn-Game Mail system
Evennia Multidescer
Puzzles System
+Item Storage
Turn based battle system framework
@@ -580,6 +582,12 @@ puzzle is built from unique objects rather than using tags and a builder can cre
the puzzle entirely from in-game.
Read the documentation - Browse the Code
+
+storage¶
+Contribution by helpme (2024)
+This module allows certain rooms to be marked as storage locations.
+Read the documentation - Browse the Code
+
turnbattle¶
Contribution by Tim Ashley Jenkins, 2017
diff --git a/docs/latest/_sources/Coding/Changelog.md.txt b/docs/latest/_sources/Coding/Changelog.md.txt
index 7ed3c09e34..dbf1f5093d 100644
--- a/docs/latest/_sources/Coding/Changelog.md.txt
+++ b/docs/latest/_sources/Coding/Changelog.md.txt
@@ -1,5 +1,16 @@
# Changelog
+
+## Main branch
+
+- [Fix][pull3626]: Typo in `defense_type` in evadventure tutorial (feyrkh)
+- [Docs][pull3576]: Rework doc for [Pycharm howto][doc-pycharm]
+- Docs updates: feykrh
+
+[pull3626]: https://github.com/evennia/evennia/pull/3626
+[pull3676]: https://github.com/evennia/evennia/pull/3676
+[doc-pycharm]: https://www.evennia.com/docs/latest/Coding/Setting-up-PyCharm.html
+
## Evennia 4.4.1
Oct 1, 2024
diff --git a/docs/latest/_sources/Contribs/Contrib-Storage.md.txt b/docs/latest/_sources/Contribs/Contrib-Storage.md.txt
new file mode 100644
index 0000000000..fa720ece20
--- /dev/null
+++ b/docs/latest/_sources/Contribs/Contrib-Storage.md.txt
@@ -0,0 +1,42 @@
+# Item Storage
+
+Contribution by helpme (2024)
+
+This module allows certain rooms to be marked as storage locations.
+
+In those rooms, players can `list`, `store`, and `retrieve` items. Storages can be shared or individual.
+
+## Installation
+
+This utility adds the storage-related commands. Import the module into your commands and add it to your command set to make it available.
+
+Specifically, in `mygame/commands/default_cmdsets.py`:
+
+```python
+...
+from evennia.contrib.game_systems.storage import StorageCmdSet # <---
+
+class CharacterCmdset(default_cmds.Character_CmdSet):
+ ...
+ def at_cmdset_creation(self):
+ ...
+ self.add(StorageCmdSet) # <---
+
+```
+
+Then `reload` to make the `list`, `retrieve`, `store`, and `storage` commands available.
+
+## Usage
+
+To mark a location as having item storage, use the `storage` command. By default this is a builder-level command. Storage can be shared, which means everyone using the storage can access all items stored there, or individual, which means only the person who stores an item can retrieve it. See `help storage` for further details.
+
+## Technical info
+
+This is a tag-based system. Rooms set as storage rooms are tagged with an identifier marking them as shared or not. Items stored in those rooms are tagged with the storage room identifier and, if the storage room is not shared, the character identifier, and then they are removed from the grid i.e. their location is set to `None`. Upon retrieval, items are untagged and moved back to character inventories.
+
+When a room is unmarked as storage with the `storage` command, all stored objects are untagged and dropped to the room. You should use the `storage` command to create and remove storages, as otherwise stored objects may become lost.
+
+----
+
+This document page is generated from `evennia/contrib/game_systems/storage/README.md`. Changes to this
+file will be overwritten, so edit that file rather than this one.
diff --git a/docs/latest/_sources/Contribs/Contribs-Overview.md.txt b/docs/latest/_sources/Contribs/Contribs-Overview.md.txt
index f1d7308eaf..232284616e 100644
--- a/docs/latest/_sources/Contribs/Contribs-Overview.md.txt
+++ b/docs/latest/_sources/Contribs/Contribs-Overview.md.txt
@@ -7,7 +7,7 @@ in the [Community Contribs & Snippets][forum] forum.
_Contribs_ are optional code snippets and systems contributed by
the Evennia community. They vary in size and complexity and
may be more specific about game types and styles than 'core' Evennia.
-This page is auto-generated and summarizes all **51** contribs currently included
+This page is auto-generated and summarizes all **52** contribs currently included
with the Evennia distribution.
All contrib categories are imported from `evennia.contrib`, such as
@@ -37,9 +37,9 @@ If you want to add a contrib, see [the contrib guidelines](./Contribs-Guidelines
| [health_bar](#health_bar) | [ingame_map_display](#ingame_map_display) | [ingame_python](#ingame_python) | [ingame_reports](#ingame_reports) | [llm](#llm) |
| [mail](#mail) | [mapbuilder](#mapbuilder) | [menu_login](#menu_login) | [mirror](#mirror) | [multidescer](#multidescer) |
| [mux_comms_cmds](#mux_comms_cmds) | [name_generator](#name_generator) | [puzzles](#puzzles) | [random_string_generator](#random_string_generator) | [red_button](#red_button) |
-| [rpsystem](#rpsystem) | [simpledoor](#simpledoor) | [slow_exit](#slow_exit) | [talking_npc](#talking_npc) | [traits](#traits) |
-| [tree_select](#tree_select) | [turnbattle](#turnbattle) | [tutorial_world](#tutorial_world) | [unixcommand](#unixcommand) | [wilderness](#wilderness) |
-| [xyzgrid](#xyzgrid) |
+| [rpsystem](#rpsystem) | [simpledoor](#simpledoor) | [slow_exit](#slow_exit) | [storage](#storage) | [talking_npc](#talking_npc) |
+| [traits](#traits) | [tree_select](#tree_select) | [turnbattle](#turnbattle) | [tutorial_world](#tutorial_world) | [unixcommand](#unixcommand) |
+| [wilderness](#wilderness) | [xyzgrid](#xyzgrid) |
@@ -288,6 +288,7 @@ Contrib-Gendersub.md
Contrib-Mail.md
Contrib-Multidescer.md
Contrib-Puzzles.md
+Contrib-Storage.md
Contrib-Turnbattle.md
```
@@ -420,6 +421,16 @@ the puzzle entirely from in-game.
+### `storage`
+
+_Contribution by helpme (2024)_
+
+This module allows certain rooms to be marked as storage locations.
+
+[Read the documentation](./Contrib-Storage.md) - [Browse the Code](evennia.contrib.game_systems.storage)
+
+
+
### `turnbattle`
_Contribution by Tim Ashley Jenkins, 2017_
diff --git a/docs/latest/api/evennia.commands.default.batchprocess.html b/docs/latest/api/evennia.commands.default.batchprocess.html
index 9b80e97757..5a7b88c2de 100644
--- a/docs/latest/api/evennia.commands.default.batchprocess.html
+++ b/docs/latest/api/evennia.commands.default.batchprocess.html
@@ -152,7 +152,7 @@ skipping, reloading etc.
@@ -183,7 +183,7 @@ skipping, reloading etc.
-
-
search_index_entry = {'aliases': 'batchcommand batchcmd', 'category': 'building', 'key': 'batchcommands', 'no_prefix': ' batchcommand batchcmd', 'tags': '', 'text': '\n build from batch-command file\n\n Usage:\n batchcommands[/interactive] <python.path.to.file>\n\n Switch:\n interactive - this mode will offer more control when\n executing the batch file, like stepping,\n skipping, reloading etc.\n\n Runs batches of commands from a batch-cmd text file (*.ev).\n\n '}¶
+search_index_entry = {'aliases': 'batchcmd batchcommand', 'category': 'building', 'key': 'batchcommands', 'no_prefix': ' batchcmd batchcommand', 'tags': '', 'text': '\n build from batch-command file\n\n Usage:\n batchcommands[/interactive] <python.path.to.file>\n\n Switch:\n interactive - this mode will offer more control when\n executing the batch file, like stepping,\n skipping, reloading etc.\n\n Runs batches of commands from a batch-cmd text file (*.ev).\n\n '}¶
diff --git a/docs/latest/api/evennia.commands.default.building.html b/docs/latest/api/evennia.commands.default.building.html
index 0a745b715a..8d4f720764 100644
--- a/docs/latest/api/evennia.commands.default.building.html
+++ b/docs/latest/api/evennia.commands.default.building.html
@@ -647,7 +647,7 @@ You can specify the /force switch to bypass this confirmation.
@@ -688,7 +688,7 @@ You can specify the /force switch to bypass this confirmation.
-
-
search_index_entry = {'aliases': '@delete @del', 'category': 'building', 'key': '@destroy', 'no_prefix': 'destroy delete del', 'tags': '', 'text': '\n permanently delete objects\n\n Usage:\n destroy[/switches] [obj, obj2, obj3, [dbref-dbref], ...]\n\n Switches:\n override - The destroy command will usually avoid accidentally\n destroying account objects. This switch overrides this safety.\n force - destroy without confirmation.\n Examples:\n destroy house, roof, door, 44-78\n destroy 5-10, flower, 45\n destroy/force north\n\n Destroys one or many objects. If dbrefs are used, a range to delete can be\n given, e.g. 4-10. Also the end points will be deleted. This command\n displays a confirmation before destroying, to make sure of your choice.\n You can specify the /force switch to bypass this confirmation.\n '}¶
+search_index_entry = {'aliases': '@del @delete', 'category': 'building', 'key': '@destroy', 'no_prefix': 'destroy del delete', 'tags': '', 'text': '\n permanently delete objects\n\n Usage:\n destroy[/switches] [obj, obj2, obj3, [dbref-dbref], ...]\n\n Switches:\n override - The destroy command will usually avoid accidentally\n destroying account objects. This switch overrides this safety.\n force - destroy without confirmation.\n Examples:\n destroy house, roof, door, 44-78\n destroy 5-10, flower, 45\n destroy/force north\n\n Destroys one or many objects. If dbrefs are used, a range to delete can be\n given, e.g. 4-10. Also the end points will be deleted. This command\n displays a confirmation before destroying, to make sure of your choice.\n You can specify the /force switch to bypass this confirmation.\n '}¶
@@ -1415,7 +1415,7 @@ server settings.
-
-
aliases = ['@update', '@swap', '@type', '@typeclasses', '@parent']¶
+aliases = ['@type', '@typeclasses', '@swap', '@parent', '@update']¶
@@ -1446,7 +1446,7 @@ server settings.
-
-
search_index_entry = {'aliases': '@update @swap @type @typeclasses @parent', 'category': 'building', 'key': '@typeclass', 'no_prefix': 'typeclass update swap type typeclasses parent', 'tags': '', 'text': "\n set or change an object's typeclass\n\n Usage:\n typeclass[/switch] <object> [= typeclass.path]\n typeclass/prototype <object> = prototype_key\n\n typeclasses or typeclass/list/show [typeclass.path]\n swap - this is a shorthand for using /force/reset flags.\n update - this is a shorthand for using the /force/reload flag.\n\n Switch:\n show, examine - display the current typeclass of object (default) or, if\n given a typeclass path, show the docstring of that typeclass.\n update - *only* re-run at_object_creation on this object\n meaning locks or other properties set later may remain.\n reset - clean out *all* the attributes and properties on the\n object - basically making this a new clean object. This will also\n reset cmdsets!\n force - change to the typeclass also if the object\n already has a typeclass of the same name.\n list - show available typeclasses. Only typeclasses in modules actually\n imported or used from somewhere in the code will show up here\n (those typeclasses are still available if you know the path)\n prototype - clean and overwrite the object with the specified\n prototype key - effectively making a whole new object.\n\n Example:\n type button = examples.red_button.RedButton\n type/prototype button=a red button\n\n If the typeclass_path is not given, the current object's typeclass is\n assumed.\n\n View or set an object's typeclass. If setting, the creation hooks of the\n new typeclass will be run on the object. If you have clashing properties on\n the old class, use /reset. By default you are protected from changing to a\n typeclass of the same name as the one you already have - use /force to\n override this protection.\n\n The given typeclass must be identified by its location using python\n dot-notation pointing to the correct module and class. If no typeclass is\n given (or a wrong typeclass is given). Errors in the path or new typeclass\n will lead to the old typeclass being kept. The location of the typeclass\n module is searched from the default typeclass directory, as defined in the\n server settings.\n\n "}¶
+search_index_entry = {'aliases': '@type @typeclasses @swap @parent @update', 'category': 'building', 'key': '@typeclass', 'no_prefix': 'typeclass type typeclasses swap parent update', 'tags': '', 'text': "\n set or change an object's typeclass\n\n Usage:\n typeclass[/switch] <object> [= typeclass.path]\n typeclass/prototype <object> = prototype_key\n\n typeclasses or typeclass/list/show [typeclass.path]\n swap - this is a shorthand for using /force/reset flags.\n update - this is a shorthand for using the /force/reload flag.\n\n Switch:\n show, examine - display the current typeclass of object (default) or, if\n given a typeclass path, show the docstring of that typeclass.\n update - *only* re-run at_object_creation on this object\n meaning locks or other properties set later may remain.\n reset - clean out *all* the attributes and properties on the\n object - basically making this a new clean object. This will also\n reset cmdsets!\n force - change to the typeclass also if the object\n already has a typeclass of the same name.\n list - show available typeclasses. Only typeclasses in modules actually\n imported or used from somewhere in the code will show up here\n (those typeclasses are still available if you know the path)\n prototype - clean and overwrite the object with the specified\n prototype key - effectively making a whole new object.\n\n Example:\n type button = examples.red_button.RedButton\n type/prototype button=a red button\n\n If the typeclass_path is not given, the current object's typeclass is\n assumed.\n\n View or set an object's typeclass. If setting, the creation hooks of the\n new typeclass will be run on the object. If you have clashing properties on\n the old class, use /reset. By default you are protected from changing to a\n typeclass of the same name as the one you already have - use /force to\n override this protection.\n\n The given typeclass must be identified by its location using python\n dot-notation pointing to the correct module and class. If no typeclass is\n given (or a wrong typeclass is given). Errors in the path or new typeclass\n will lead to the old typeclass being kept. The location of the typeclass\n module is searched from the default typeclass directory, as defined in the\n server settings.\n\n "}¶
@@ -1908,7 +1908,7 @@ one is given.
@@ -1939,7 +1939,7 @@ one is given.
-
-
search_index_entry = {'aliases': '@locate @search', 'category': 'building', 'key': '@find', 'no_prefix': 'find locate search', 'tags': '', 'text': '\n search the database for objects\n\n Usage:\n find[/switches] <name or dbref or *account> [= dbrefmin[-dbrefmax]]\n locate - this is a shorthand for using the /loc switch.\n\n Switches:\n room - only look for rooms (location=None)\n exit - only look for exits (destination!=None)\n char - only look for characters (BASE_CHARACTER_TYPECLASS)\n exact - only exact matches are returned.\n loc - display object location if exists and match has one result\n startswith - search for names starting with the string, rather than containing\n\n Searches the database for an object of a particular name or exact #dbref.\n Use *accountname to search for an account. The switches allows for\n limiting object matches to certain game entities. Dbrefmin and dbrefmax\n limits matches to within the given dbrefs range, or above/below if only\n one is given.\n '}¶
+search_index_entry = {'aliases': '@search @locate', 'category': 'building', 'key': '@find', 'no_prefix': 'find search locate', 'tags': '', 'text': '\n search the database for objects\n\n Usage:\n find[/switches] <name or dbref or *account> [= dbrefmin[-dbrefmax]]\n locate - this is a shorthand for using the /loc switch.\n\n Switches:\n room - only look for rooms (location=None)\n exit - only look for exits (destination!=None)\n char - only look for characters (BASE_CHARACTER_TYPECLASS)\n exact - only exact matches are returned.\n loc - display object location if exists and match has one result\n startswith - search for names starting with the string, rather than containing\n\n Searches the database for an object of a particular name or exact #dbref.\n Use *accountname to search for an account. The switches allows for\n limiting object matches to certain game entities. Dbrefmin and dbrefmax\n limits matches to within the given dbrefs range, or above/below if only\n one is given.\n '}¶
diff --git a/docs/latest/api/evennia.commands.default.comms.html b/docs/latest/api/evennia.commands.default.comms.html
index e1cd9627c3..0fa48db791 100644
--- a/docs/latest/api/evennia.commands.default.comms.html
+++ b/docs/latest/api/evennia.commands.default.comms.html
@@ -270,7 +270,7 @@ ban mychannel1,mychannel2= EvilUser : Was banned for spamming.
@@ -795,7 +795,7 @@ don’t actually sub to yet.
-
-
search_index_entry = {'aliases': '@channels @chan', 'category': 'comms', 'key': '@channel', 'no_prefix': 'channel channels chan', 'tags': '', 'text': "\n Use and manage in-game channels.\n\n Usage:\n channel channelname <msg>\n channel channel name = <msg>\n channel (show all subscription)\n channel/all (show available channels)\n channel/alias channelname = alias[;alias...]\n channel/unalias alias\n channel/who channelname\n channel/history channelname [= index]\n channel/sub channelname [= alias[;alias...]]\n channel/unsub channelname[,channelname, ...]\n channel/mute channelname[,channelname,...]\n channel/unmute channelname[,channelname,...]\n\n channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n channel/desc channelname = description\n channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n channel/ban channelname (list bans)\n channel/ban[/quiet] channelname[, channelname, ...] = subscribername [: reason]\n channel/unban[/quiet] channelname[, channelname, ...] = subscribername\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n\n # subtopics\n\n ## sending\n\n Usage: channel channelname msg\n channel channel name = msg (with space in channel name)\n\n This sends a message to the channel. Note that you will rarely use this\n command like this; instead you can use the alias\n\n channelname <msg>\n channelalias <msg>\n\n For example\n\n public Hello World\n pub Hello World\n\n (this shortcut doesn't work for aliases containing spaces)\n\n See channel/alias for help on setting channel aliases.\n\n ## alias and unalias\n\n Usage: channel/alias channel = alias[;alias[;alias...]]\n channel/unalias alias\n channel - this will list your subs and aliases to each channel\n\n Set one or more personal aliases for referencing a channel. For example:\n\n channel/alias warrior's guild = warrior;wguild;warchannel;warrior guild\n\n You can now send to the channel using all of these:\n\n warrior's guild Hello\n warrior Hello\n wguild Hello\n warchannel Hello\n\n Note that this will not work if the alias has a space in it. So the\n 'warrior guild' alias must be used with the `channel` command:\n\n channel warrior guild = Hello\n\n Channel-aliases can be removed one at a time, using the '/unalias' switch.\n\n ## who\n\n Usage: channel/who channelname\n\n List the channel's subscribers. Shows who are currently offline or are\n muting the channel. Subscribers who are 'muting' will not see messages sent\n to the channel (use channel/mute to mute a channel).\n\n ## history\n\n Usage: channel/history channel [= index]\n\n This will display the last |c20|n lines of channel history. By supplying an\n index number, you will step that many lines back before viewing those 20 lines.\n\n For example:\n\n channel/history public = 35\n\n will go back 35 lines and show the previous 20 lines from that point (so\n lines -35 to -55).\n\n ## sub and unsub\n\n Usage: channel/sub channel [=alias[;alias;...]]\n channel/unsub channel\n\n This subscribes you to a channel and optionally assigns personal shortcuts\n for you to use to send to that channel (see aliases). When you unsub, all\n your personal aliases will also be removed.\n\n ## mute and unmute\n\n Usage: channel/mute channelname\n channel/unmute channelname\n\n Muting silences all output from the channel without actually\n un-subscribing. Other channel members will see that you are muted in the /who\n list. Sending a message to the channel will automatically unmute you.\n\n ## create and destroy\n\n Usage: channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n\n Creates a new channel (or destroys one you control). You will automatically\n join the channel you create and everyone will be kicked and loose all aliases\n to a destroyed channel.\n\n ## lock and unlock\n\n Usage: channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n\n Note: this is an admin command.\n\n A lockstring is on the form locktype:lockfunc(). Channels understand three\n locktypes:\n listen - who may listen or join the channel.\n send - who may send messages to the channel\n control - who controls the channel. This is usually the one creating\n the channel.\n\n Common lockfuncs are all() and perm(). To make a channel everyone can\n listen to but only builders can talk on, use this:\n\n listen:all()\n send: perm(Builders)\n\n ## boot and ban\n\n Usage:\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n channel/ban channelname[, channelname, ...] = subscribername [: reason]\n channel/unban channelname[, channelname, ...] = subscribername\n channel/unban channelname\n channel/ban channelname (list bans)\n\n Booting will kick a named subscriber from channel(s) temporarily. The\n 'reason' will be passed to the booted user. Unless the /quiet switch is\n used, the channel will also be informed of the action. A booted user is\n still able to re-connect, but they'll have to set up their aliases again.\n\n Banning will blacklist a user from (re)joining the provided channels. It\n will then proceed to boot them from those channels if they were connected.\n The 'reason' and `/quiet` works the same as for booting.\n\n Example:\n boot mychannel1 = EvilUser : Kicking you to cool down a bit.\n ban mychannel1,mychannel2= EvilUser : Was banned for spamming.\n\n "}¶
+search_index_entry = {'aliases': '@chan @channels', 'category': 'comms', 'key': '@channel', 'no_prefix': 'channel chan channels', 'tags': '', 'text': "\n Use and manage in-game channels.\n\n Usage:\n channel channelname <msg>\n channel channel name = <msg>\n channel (show all subscription)\n channel/all (show available channels)\n channel/alias channelname = alias[;alias...]\n channel/unalias alias\n channel/who channelname\n channel/history channelname [= index]\n channel/sub channelname [= alias[;alias...]]\n channel/unsub channelname[,channelname, ...]\n channel/mute channelname[,channelname,...]\n channel/unmute channelname[,channelname,...]\n\n channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n channel/desc channelname = description\n channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n channel/ban channelname (list bans)\n channel/ban[/quiet] channelname[, channelname, ...] = subscribername [: reason]\n channel/unban[/quiet] channelname[, channelname, ...] = subscribername\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n\n # subtopics\n\n ## sending\n\n Usage: channel channelname msg\n channel channel name = msg (with space in channel name)\n\n This sends a message to the channel. Note that you will rarely use this\n command like this; instead you can use the alias\n\n channelname <msg>\n channelalias <msg>\n\n For example\n\n public Hello World\n pub Hello World\n\n (this shortcut doesn't work for aliases containing spaces)\n\n See channel/alias for help on setting channel aliases.\n\n ## alias and unalias\n\n Usage: channel/alias channel = alias[;alias[;alias...]]\n channel/unalias alias\n channel - this will list your subs and aliases to each channel\n\n Set one or more personal aliases for referencing a channel. For example:\n\n channel/alias warrior's guild = warrior;wguild;warchannel;warrior guild\n\n You can now send to the channel using all of these:\n\n warrior's guild Hello\n warrior Hello\n wguild Hello\n warchannel Hello\n\n Note that this will not work if the alias has a space in it. So the\n 'warrior guild' alias must be used with the `channel` command:\n\n channel warrior guild = Hello\n\n Channel-aliases can be removed one at a time, using the '/unalias' switch.\n\n ## who\n\n Usage: channel/who channelname\n\n List the channel's subscribers. Shows who are currently offline or are\n muting the channel. Subscribers who are 'muting' will not see messages sent\n to the channel (use channel/mute to mute a channel).\n\n ## history\n\n Usage: channel/history channel [= index]\n\n This will display the last |c20|n lines of channel history. By supplying an\n index number, you will step that many lines back before viewing those 20 lines.\n\n For example:\n\n channel/history public = 35\n\n will go back 35 lines and show the previous 20 lines from that point (so\n lines -35 to -55).\n\n ## sub and unsub\n\n Usage: channel/sub channel [=alias[;alias;...]]\n channel/unsub channel\n\n This subscribes you to a channel and optionally assigns personal shortcuts\n for you to use to send to that channel (see aliases). When you unsub, all\n your personal aliases will also be removed.\n\n ## mute and unmute\n\n Usage: channel/mute channelname\n channel/unmute channelname\n\n Muting silences all output from the channel without actually\n un-subscribing. Other channel members will see that you are muted in the /who\n list. Sending a message to the channel will automatically unmute you.\n\n ## create and destroy\n\n Usage: channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n\n Creates a new channel (or destroys one you control). You will automatically\n join the channel you create and everyone will be kicked and loose all aliases\n to a destroyed channel.\n\n ## lock and unlock\n\n Usage: channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n\n Note: this is an admin command.\n\n A lockstring is on the form locktype:lockfunc(). Channels understand three\n locktypes:\n listen - who may listen or join the channel.\n send - who may send messages to the channel\n control - who controls the channel. This is usually the one creating\n the channel.\n\n Common lockfuncs are all() and perm(). To make a channel everyone can\n listen to but only builders can talk on, use this:\n\n listen:all()\n send: perm(Builders)\n\n ## boot and ban\n\n Usage:\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n channel/ban channelname[, channelname, ...] = subscribername [: reason]\n channel/unban channelname[, channelname, ...] = subscribername\n channel/unban channelname\n channel/ban channelname (list bans)\n\n Booting will kick a named subscriber from channel(s) temporarily. The\n 'reason' will be passed to the booted user. Unless the /quiet switch is\n used, the channel will also be informed of the action. A booted user is\n still able to re-connect, but they'll have to set up their aliases again.\n\n Banning will blacklist a user from (re)joining the provided channels. It\n will then proceed to boot them from those channels if they were connected.\n The 'reason' and `/quiet` works the same as for booting.\n\n Example:\n boot mychannel1 = EvilUser : Kicking you to cool down a bit.\n ban mychannel1,mychannel2= EvilUser : Was banned for spamming.\n\n "}¶
@@ -948,7 +948,7 @@ ban mychannel1,mychannel2= EvilUser : Was banned for spamming.
@@ -968,7 +968,7 @@ ban mychannel1,mychannel2= EvilUser : Was banned for spamming.
-
-
search_index_entry = {'aliases': '@channels @chan', 'category': 'comms', 'key': '@channel', 'no_prefix': 'channel channels chan', 'tags': '', 'text': "\n Use and manage in-game channels.\n\n Usage:\n channel channelname <msg>\n channel channel name = <msg>\n channel (show all subscription)\n channel/all (show available channels)\n channel/alias channelname = alias[;alias...]\n channel/unalias alias\n channel/who channelname\n channel/history channelname [= index]\n channel/sub channelname [= alias[;alias...]]\n channel/unsub channelname[,channelname, ...]\n channel/mute channelname[,channelname,...]\n channel/unmute channelname[,channelname,...]\n\n channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n channel/desc channelname = description\n channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n channel/ban channelname (list bans)\n channel/ban[/quiet] channelname[, channelname, ...] = subscribername [: reason]\n channel/unban[/quiet] channelname[, channelname, ...] = subscribername\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n\n # subtopics\n\n ## sending\n\n Usage: channel channelname msg\n channel channel name = msg (with space in channel name)\n\n This sends a message to the channel. Note that you will rarely use this\n command like this; instead you can use the alias\n\n channelname <msg>\n channelalias <msg>\n\n For example\n\n public Hello World\n pub Hello World\n\n (this shortcut doesn't work for aliases containing spaces)\n\n See channel/alias for help on setting channel aliases.\n\n ## alias and unalias\n\n Usage: channel/alias channel = alias[;alias[;alias...]]\n channel/unalias alias\n channel - this will list your subs and aliases to each channel\n\n Set one or more personal aliases for referencing a channel. For example:\n\n channel/alias warrior's guild = warrior;wguild;warchannel;warrior guild\n\n You can now send to the channel using all of these:\n\n warrior's guild Hello\n warrior Hello\n wguild Hello\n warchannel Hello\n\n Note that this will not work if the alias has a space in it. So the\n 'warrior guild' alias must be used with the `channel` command:\n\n channel warrior guild = Hello\n\n Channel-aliases can be removed one at a time, using the '/unalias' switch.\n\n ## who\n\n Usage: channel/who channelname\n\n List the channel's subscribers. Shows who are currently offline or are\n muting the channel. Subscribers who are 'muting' will not see messages sent\n to the channel (use channel/mute to mute a channel).\n\n ## history\n\n Usage: channel/history channel [= index]\n\n This will display the last |c20|n lines of channel history. By supplying an\n index number, you will step that many lines back before viewing those 20 lines.\n\n For example:\n\n channel/history public = 35\n\n will go back 35 lines and show the previous 20 lines from that point (so\n lines -35 to -55).\n\n ## sub and unsub\n\n Usage: channel/sub channel [=alias[;alias;...]]\n channel/unsub channel\n\n This subscribes you to a channel and optionally assigns personal shortcuts\n for you to use to send to that channel (see aliases). When you unsub, all\n your personal aliases will also be removed.\n\n ## mute and unmute\n\n Usage: channel/mute channelname\n channel/unmute channelname\n\n Muting silences all output from the channel without actually\n un-subscribing. Other channel members will see that you are muted in the /who\n list. Sending a message to the channel will automatically unmute you.\n\n ## create and destroy\n\n Usage: channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n\n Creates a new channel (or destroys one you control). You will automatically\n join the channel you create and everyone will be kicked and loose all aliases\n to a destroyed channel.\n\n ## lock and unlock\n\n Usage: channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n\n Note: this is an admin command.\n\n A lockstring is on the form locktype:lockfunc(). Channels understand three\n locktypes:\n listen - who may listen or join the channel.\n send - who may send messages to the channel\n control - who controls the channel. This is usually the one creating\n the channel.\n\n Common lockfuncs are all() and perm(). To make a channel everyone can\n listen to but only builders can talk on, use this:\n\n listen:all()\n send: perm(Builders)\n\n ## boot and ban\n\n Usage:\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n channel/ban channelname[, channelname, ...] = subscribername [: reason]\n channel/unban channelname[, channelname, ...] = subscribername\n channel/unban channelname\n channel/ban channelname (list bans)\n\n Booting will kick a named subscriber from channel(s) temporarily. The\n 'reason' will be passed to the booted user. Unless the /quiet switch is\n used, the channel will also be informed of the action. A booted user is\n still able to re-connect, but they'll have to set up their aliases again.\n\n Banning will blacklist a user from (re)joining the provided channels. It\n will then proceed to boot them from those channels if they were connected.\n The 'reason' and `/quiet` works the same as for booting.\n\n Example:\n boot mychannel1 = EvilUser : Kicking you to cool down a bit.\n ban mychannel1,mychannel2= EvilUser : Was banned for spamming.\n\n "}¶
+search_index_entry = {'aliases': '@chan @channels', 'category': 'comms', 'key': '@channel', 'no_prefix': 'channel chan channels', 'tags': '', 'text': "\n Use and manage in-game channels.\n\n Usage:\n channel channelname <msg>\n channel channel name = <msg>\n channel (show all subscription)\n channel/all (show available channels)\n channel/alias channelname = alias[;alias...]\n channel/unalias alias\n channel/who channelname\n channel/history channelname [= index]\n channel/sub channelname [= alias[;alias...]]\n channel/unsub channelname[,channelname, ...]\n channel/mute channelname[,channelname,...]\n channel/unmute channelname[,channelname,...]\n\n channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n channel/desc channelname = description\n channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n channel/ban channelname (list bans)\n channel/ban[/quiet] channelname[, channelname, ...] = subscribername [: reason]\n channel/unban[/quiet] channelname[, channelname, ...] = subscribername\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n\n # subtopics\n\n ## sending\n\n Usage: channel channelname msg\n channel channel name = msg (with space in channel name)\n\n This sends a message to the channel. Note that you will rarely use this\n command like this; instead you can use the alias\n\n channelname <msg>\n channelalias <msg>\n\n For example\n\n public Hello World\n pub Hello World\n\n (this shortcut doesn't work for aliases containing spaces)\n\n See channel/alias for help on setting channel aliases.\n\n ## alias and unalias\n\n Usage: channel/alias channel = alias[;alias[;alias...]]\n channel/unalias alias\n channel - this will list your subs and aliases to each channel\n\n Set one or more personal aliases for referencing a channel. For example:\n\n channel/alias warrior's guild = warrior;wguild;warchannel;warrior guild\n\n You can now send to the channel using all of these:\n\n warrior's guild Hello\n warrior Hello\n wguild Hello\n warchannel Hello\n\n Note that this will not work if the alias has a space in it. So the\n 'warrior guild' alias must be used with the `channel` command:\n\n channel warrior guild = Hello\n\n Channel-aliases can be removed one at a time, using the '/unalias' switch.\n\n ## who\n\n Usage: channel/who channelname\n\n List the channel's subscribers. Shows who are currently offline or are\n muting the channel. Subscribers who are 'muting' will not see messages sent\n to the channel (use channel/mute to mute a channel).\n\n ## history\n\n Usage: channel/history channel [= index]\n\n This will display the last |c20|n lines of channel history. By supplying an\n index number, you will step that many lines back before viewing those 20 lines.\n\n For example:\n\n channel/history public = 35\n\n will go back 35 lines and show the previous 20 lines from that point (so\n lines -35 to -55).\n\n ## sub and unsub\n\n Usage: channel/sub channel [=alias[;alias;...]]\n channel/unsub channel\n\n This subscribes you to a channel and optionally assigns personal shortcuts\n for you to use to send to that channel (see aliases). When you unsub, all\n your personal aliases will also be removed.\n\n ## mute and unmute\n\n Usage: channel/mute channelname\n channel/unmute channelname\n\n Muting silences all output from the channel without actually\n un-subscribing. Other channel members will see that you are muted in the /who\n list. Sending a message to the channel will automatically unmute you.\n\n ## create and destroy\n\n Usage: channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n\n Creates a new channel (or destroys one you control). You will automatically\n join the channel you create and everyone will be kicked and loose all aliases\n to a destroyed channel.\n\n ## lock and unlock\n\n Usage: channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n\n Note: this is an admin command.\n\n A lockstring is on the form locktype:lockfunc(). Channels understand three\n locktypes:\n listen - who may listen or join the channel.\n send - who may send messages to the channel\n control - who controls the channel. This is usually the one creating\n the channel.\n\n Common lockfuncs are all() and perm(). To make a channel everyone can\n listen to but only builders can talk on, use this:\n\n listen:all()\n send: perm(Builders)\n\n ## boot and ban\n\n Usage:\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n channel/ban channelname[, channelname, ...] = subscribername [: reason]\n channel/unban channelname[, channelname, ...] = subscribername\n channel/unban channelname\n channel/ban channelname (list bans)\n\n Booting will kick a named subscriber from channel(s) temporarily. The\n 'reason' will be passed to the booted user. Unless the /quiet switch is\n used, the channel will also be informed of the action. A booted user is\n still able to re-connect, but they'll have to set up their aliases again.\n\n Banning will blacklist a user from (re)joining the provided channels. It\n will then proceed to boot them from those channels if they were connected.\n The 'reason' and `/quiet` works the same as for booting.\n\n Example:\n boot mychannel1 = EvilUser : Kicking you to cool down a bit.\n ban mychannel1,mychannel2= EvilUser : Was banned for spamming.\n\n "}¶
diff --git a/docs/latest/api/evennia.commands.default.general.html b/docs/latest/api/evennia.commands.default.general.html
index bb49756c25..b6d9d4ecba 100644
--- a/docs/latest/api/evennia.commands.default.general.html
+++ b/docs/latest/api/evennia.commands.default.general.html
@@ -337,7 +337,7 @@ inv
@@ -368,7 +368,7 @@ inv
-
-
search_index_entry = {'aliases': 'inv i', 'category': 'general', 'key': 'inventory', 'no_prefix': ' inv i', 'tags': '', 'text': '\n view inventory\n\n Usage:\n inventory\n inv\n\n Shows your inventory.\n '}¶
+search_index_entry = {'aliases': 'i inv', 'category': 'general', 'key': 'inventory', 'no_prefix': ' i inv', 'tags': '', 'text': '\n view inventory\n\n Usage:\n inventory\n inv\n\n Shows your inventory.\n '}¶
@@ -722,7 +722,7 @@ automatically begin with your name.
@@ -763,7 +763,7 @@ space.
-
-
search_index_entry = {'aliases': 'emote :', 'category': 'general', 'key': 'pose', 'no_prefix': ' emote :', 'tags': '', 'text': "\n strike a pose\n\n Usage:\n pose <pose text>\n pose's <pose text>\n\n Example:\n pose is standing by the wall, smiling.\n -> others will see:\n Tom is standing by the wall, smiling.\n\n Describe an action being taken. The pose text will\n automatically begin with your name.\n "}¶
+search_index_entry = {'aliases': ': emote', 'category': 'general', 'key': 'pose', 'no_prefix': ' : emote', 'tags': '', 'text': "\n strike a pose\n\n Usage:\n pose <pose text>\n pose's <pose text>\n\n Example:\n pose is standing by the wall, smiling.\n -> others will see:\n Tom is standing by the wall, smiling.\n\n Describe an action being taken. The pose text will\n automatically begin with your name.\n "}¶
diff --git a/docs/latest/api/evennia.commands.default.system.html b/docs/latest/api/evennia.commands.default.system.html
index d02b7cfcc2..196b1c1736 100644
--- a/docs/latest/api/evennia.commands.default.system.html
+++ b/docs/latest/api/evennia.commands.default.system.html
@@ -697,7 +697,7 @@ See |luhttps://ww
@@ -743,7 +743,7 @@ to all the variables defined therein.
-
-
search_index_entry = {'aliases': '@task @delays', 'category': 'system', 'key': '@tasks', 'no_prefix': 'tasks task delays', 'tags': '', 'text': "\n Display or terminate active tasks (delays).\n\n Usage:\n tasks[/switch] [task_id or function_name]\n\n Switches:\n pause - Pause the callback of a task.\n unpause - Process all callbacks made since pause() was called.\n do_task - Execute the task (call its callback).\n call - Call the callback of this task.\n remove - Remove a task without executing it.\n cancel - Stop a task from automatically executing.\n\n Notes:\n A task is a single use method of delaying the call of a function. Calls are created\n in code, using `evennia.utils.delay`.\n See |luhttps://www.evennia.com/docs/latest/Command-Duration.html|ltthe docs|le for help.\n\n By default, tasks that are canceled and never called are cleaned up after one minute.\n\n Examples:\n - `tasks/cancel move_callback` - Cancels all movement delays from the slow_exit contrib.\n In this example slow exits creates it's tasks with\n `utils.delay(move_delay, move_callback)`\n - `tasks/cancel 2` - Cancel task id 2.\n\n "}¶
+search_index_entry = {'aliases': '@delays @task', 'category': 'system', 'key': '@tasks', 'no_prefix': 'tasks delays task', 'tags': '', 'text': "\n Display or terminate active tasks (delays).\n\n Usage:\n tasks[/switch] [task_id or function_name]\n\n Switches:\n pause - Pause the callback of a task.\n unpause - Process all callbacks made since pause() was called.\n do_task - Execute the task (call its callback).\n call - Call the callback of this task.\n remove - Remove a task without executing it.\n cancel - Stop a task from automatically executing.\n\n Notes:\n A task is a single use method of delaying the call of a function. Calls are created\n in code, using `evennia.utils.delay`.\n See |luhttps://www.evennia.com/docs/latest/Command-Duration.html|ltthe docs|le for help.\n\n By default, tasks that are canceled and never called are cleaned up after one minute.\n\n Examples:\n - `tasks/cancel move_callback` - Cancels all movement delays from the slow_exit contrib.\n In this example slow exits creates it's tasks with\n `utils.delay(move_delay, move_callback)`\n - `tasks/cancel 2` - Cancel task id 2.\n\n "}¶
diff --git a/docs/latest/api/evennia.commands.default.tests.html b/docs/latest/api/evennia.commands.default.tests.html
index 37af18ebe2..f81ab3ff58 100644
--- a/docs/latest/api/evennia.commands.default.tests.html
+++ b/docs/latest/api/evennia.commands.default.tests.html
@@ -980,7 +980,7 @@ main test suite started with
Test the batch processor.
+red_button = <module 'evennia.contrib.tutorials.red_button.red_button' from '/tmp/tmpw2lhzv5k/471406bbe427aeebeb1764fef17ced0d1a8ca593/evennia/contrib/tutorials/red_button/red_button.py'>¶
diff --git a/docs/latest/api/evennia.commands.default.unloggedin.html b/docs/latest/api/evennia.commands.default.unloggedin.html
index 29cf53cfe3..04060e8ff1 100644
--- a/docs/latest/api/evennia.commands.default.unloggedin.html
+++ b/docs/latest/api/evennia.commands.default.unloggedin.html
@@ -136,7 +136,7 @@ connect “account name” “pass word”
@@ -171,7 +171,7 @@ there is no object yet before the account has logged in)
-
-
search_index_entry = {'aliases': 'conn co con', 'category': 'general', 'key': 'connect', 'no_prefix': ' conn co con', 'tags': '', 'text': '\n connect to the game\n\n Usage (at login screen):\n connect accountname password\n connect "account name" "pass word"\n\n Use the create command to first create an account before logging in.\n\n If you have spaces in your name, enclose it in double quotes.\n '}¶
+search_index_entry = {'aliases': 'co con conn', 'category': 'general', 'key': 'connect', 'no_prefix': ' co con conn', 'tags': '', 'text': '\n connect to the game\n\n Usage (at login screen):\n connect accountname password\n connect "account name" "pass word"\n\n Use the create command to first create an account before logging in.\n\n If you have spaces in your name, enclose it in double quotes.\n '}¶
@@ -355,7 +355,7 @@ for simplicity. It shows a pane of info.
@@ -381,7 +381,7 @@ for simplicity. It shows a pane of info.
-
-
search_index_entry = {'aliases': '? h', 'category': 'general', 'key': 'help', 'no_prefix': ' ? h', 'tags': '', 'text': '\n get help when in unconnected-in state\n\n Usage:\n help\n\n This is an unconnected version of the help command,\n for simplicity. It shows a pane of info.\n '}¶
+search_index_entry = {'aliases': 'h ?', 'category': 'general', 'key': 'help', 'no_prefix': ' h ?', 'tags': '', 'text': '\n get help when in unconnected-in state\n\n Usage:\n help\n\n This is an unconnected version of the help command,\n for simplicity. It shows a pane of info.\n '}¶
diff --git a/docs/latest/api/evennia.contrib.base_systems.email_login.email_login.html b/docs/latest/api/evennia.contrib.base_systems.email_login.email_login.html
index 012f979e00..1ebe8f68a1 100644
--- a/docs/latest/api/evennia.contrib.base_systems.email_login.email_login.html
+++ b/docs/latest/api/evennia.contrib.base_systems.email_login.email_login.html
@@ -153,7 +153,7 @@ the module given by settings.CONNECTION_SCREEN_MODULE.
@@ -183,7 +183,7 @@ there is no object yet before the account has logged in)
-
-
search_index_entry = {'aliases': 'conn co con', 'category': 'general', 'key': 'connect', 'no_prefix': ' conn co con', 'tags': '', 'text': '\n Connect to the game.\n\n Usage (at login screen):\n connect <email> <password>\n\n Use the create command to first create an account before logging in.\n '}¶
+search_index_entry = {'aliases': 'co con conn', 'category': 'general', 'key': 'connect', 'no_prefix': ' co con conn', 'tags': '', 'text': '\n Connect to the game.\n\n Usage (at login screen):\n connect <email> <password>\n\n Use the create command to first create an account before logging in.\n '}¶
@@ -355,7 +355,7 @@ for simplicity. It shows a pane of info.
@@ -381,7 +381,7 @@ for simplicity. It shows a pane of info.
-
-
search_index_entry = {'aliases': '? h', 'category': 'general', 'key': 'help', 'no_prefix': ' ? h', 'tags': '', 'text': '\n This is an unconnected version of the help command,\n for simplicity. It shows a pane of info.\n '}¶
+search_index_entry = {'aliases': 'h ?', 'category': 'general', 'key': 'help', 'no_prefix': ' h ?', 'tags': '', 'text': '\n This is an unconnected version of the help command,\n for simplicity. It shows a pane of info.\n '}¶
diff --git a/docs/latest/api/evennia.contrib.base_systems.ingame_python.commands.html b/docs/latest/api/evennia.contrib.base_systems.ingame_python.commands.html
index 10d456bfec..7af3c85a5d 100644
--- a/docs/latest/api/evennia.contrib.base_systems.ingame_python.commands.html
+++ b/docs/latest/api/evennia.contrib.base_systems.ingame_python.commands.html
@@ -130,7 +130,7 @@
@@ -211,7 +211,7 @@ on user permission.
-
-
search_index_entry = {'aliases': '@calls @callbacks @callback', 'category': 'building', 'key': '@call', 'no_prefix': 'call calls callbacks callback', 'tags': '', 'text': '\n Command to edit callbacks.\n '}¶
+search_index_entry = {'aliases': '@callback @callbacks @calls', 'category': 'building', 'key': '@call', 'no_prefix': 'call callback callbacks calls', 'tags': '', 'text': '\n Command to edit callbacks.\n '}¶
diff --git a/docs/latest/api/evennia.contrib.base_systems.mux_comms_cmds.mux_comms_cmds.html b/docs/latest/api/evennia.contrib.base_systems.mux_comms_cmds.mux_comms_cmds.html
index 9cb93a4627..6f78c0d57a 100644
--- a/docs/latest/api/evennia.contrib.base_systems.mux_comms_cmds.mux_comms_cmds.html
+++ b/docs/latest/api/evennia.contrib.base_systems.mux_comms_cmds.mux_comms_cmds.html
@@ -231,7 +231,7 @@ for that channel.
@@ -262,7 +262,7 @@ for that channel.
-
-
search_index_entry = {'aliases': 'delchanalias delaliaschan', 'category': 'comms', 'key': 'delcom', 'no_prefix': ' delchanalias delaliaschan', 'tags': '', 'text': "\n remove a channel alias and/or unsubscribe from channel\n\n Usage:\n delcom <alias or channel>\n delcom/all <channel>\n\n If the full channel name is given, unsubscribe from the\n channel. If an alias is given, remove the alias but don't\n unsubscribe. If the 'all' switch is used, remove all aliases\n for that channel.\n "}¶
+search_index_entry = {'aliases': 'delaliaschan delchanalias', 'category': 'comms', 'key': 'delcom', 'no_prefix': ' delaliaschan delchanalias', 'tags': '', 'text': "\n remove a channel alias and/or unsubscribe from channel\n\n Usage:\n delcom <alias or channel>\n delcom/all <channel>\n\n If the full channel name is given, unsubscribe from the\n channel. If an alias is given, remove the alias but don't\n unsubscribe. If the 'all' switch is used, remove all aliases\n for that channel.\n "}¶
diff --git a/docs/latest/api/evennia.contrib.full_systems.evscaperoom.commands.html b/docs/latest/api/evennia.contrib.full_systems.evscaperoom.commands.html
index bd09047e09..4230d90d7c 100644
--- a/docs/latest/api/evennia.contrib.full_systems.evscaperoom.commands.html
+++ b/docs/latest/api/evennia.contrib.full_systems.evscaperoom.commands.html
@@ -385,7 +385,7 @@ shout
@@ -414,7 +414,7 @@ set in self.parse())
-
-
search_index_entry = {'aliases': 'whisper ; shout', 'category': 'general', 'key': 'say', 'no_prefix': ' whisper ; shout', 'tags': '', 'text': '\n Perform an communication action.\n\n Usage:\n say <text>\n whisper\n shout\n\n '}¶
+search_index_entry = {'aliases': 'shout whisper ;', 'category': 'general', 'key': 'say', 'no_prefix': ' shout whisper ;', 'tags': '', 'text': '\n Perform an communication action.\n\n Usage:\n say <text>\n whisper\n shout\n\n '}¶
@@ -504,7 +504,7 @@ looks and what actions is available.
@@ -533,7 +533,7 @@ set in self.parse())
-
-
search_index_entry = {'aliases': 'examine ex e unfocus', 'category': 'evscaperoom', 'key': 'focus', 'no_prefix': ' examine ex e unfocus', 'tags': '', 'text': '\n Focus your attention on a target.\n\n Usage:\n focus <obj>\n\n Once focusing on an object, use look to get more information about how it\n looks and what actions is available.\n\n '}¶
+search_index_entry = {'aliases': 'e ex unfocus examine', 'category': 'evscaperoom', 'key': 'focus', 'no_prefix': ' e ex unfocus examine', 'tags': '', 'text': '\n Focus your attention on a target.\n\n Usage:\n focus <obj>\n\n Once focusing on an object, use look to get more information about how it\n looks and what actions is available.\n\n '}¶
@@ -595,7 +595,7 @@ set in self.parse())
@@ -619,7 +619,7 @@ set in self.parse())
-
-
search_index_entry = {'aliases': 'inv i give inventory', 'category': 'evscaperoom', 'key': 'get', 'no_prefix': ' inv i give inventory', 'tags': '', 'text': '\n Use focus / examine instead.\n\n '}¶
+search_index_entry = {'aliases': 'i give inventory inv', 'category': 'evscaperoom', 'key': 'get', 'no_prefix': ' i give inventory inv', 'tags': '', 'text': '\n Use focus / examine instead.\n\n '}¶
@@ -640,7 +640,7 @@ set in self.parse())
@@ -663,7 +663,7 @@ to all the variables defined therein.
-
-
search_index_entry = {'aliases': '@open @dig', 'category': 'general', 'key': 'open', 'no_prefix': ' open dig', 'tags': '', 'text': '\n Interact with an object in focus.\n\n Usage:\n <action> [arg]\n\n '}¶
+search_index_entry = {'aliases': '@dig @open', 'category': 'general', 'key': 'open', 'no_prefix': ' dig open', 'tags': '', 'text': '\n Interact with an object in focus.\n\n Usage:\n <action> [arg]\n\n '}¶
diff --git a/docs/latest/api/evennia.contrib.game_systems.barter.barter.html b/docs/latest/api/evennia.contrib.game_systems.barter.barter.html
index 995664a60e..180d50f58c 100644
--- a/docs/latest/api/evennia.contrib.game_systems.barter.barter.html
+++ b/docs/latest/api/evennia.contrib.game_systems.barter.barter.html
@@ -759,7 +759,7 @@ try to influence the other part in the deal.
@@ -785,7 +785,7 @@ try to influence the other part in the deal.
-
-
search_index_entry = {'aliases': 'deal offers', 'category': 'trading', 'key': 'status', 'no_prefix': ' deal offers', 'tags': '', 'text': "\n show a list of the current deal\n\n Usage:\n status\n deal\n offers\n\n Shows the currently suggested offers on each sides of the deal. To\n accept the current deal, use the 'accept' command. Use 'offer' to\n change your deal. You might also want to use 'say', 'emote' etc to\n try to influence the other part in the deal.\n "}¶
+search_index_entry = {'aliases': 'offers deal', 'category': 'trading', 'key': 'status', 'no_prefix': ' offers deal', 'tags': '', 'text': "\n show a list of the current deal\n\n Usage:\n status\n deal\n offers\n\n Shows the currently suggested offers on each sides of the deal. To\n accept the current deal, use the 'accept' command. Use 'offer' to\n change your deal. You might also want to use 'say', 'emote' etc to\n try to influence the other part in the deal.\n "}¶
diff --git a/docs/latest/api/evennia.contrib.game_systems.clothing.clothing.html b/docs/latest/api/evennia.contrib.game_systems.clothing.clothing.html
index 158896c484..8c8be515bb 100644
--- a/docs/latest/api/evennia.contrib.game_systems.clothing.clothing.html
+++ b/docs/latest/api/evennia.contrib.game_systems.clothing.clothing.html
@@ -636,7 +636,7 @@ inv
@@ -667,7 +667,7 @@ inv
-
-
search_index_entry = {'aliases': 'inv i', 'category': 'general', 'key': 'inventory', 'no_prefix': ' inv i', 'tags': '', 'text': '\n view inventory\n\n Usage:\n inventory\n inv\n\n Shows your inventory.\n '}¶
+search_index_entry = {'aliases': 'i inv', 'category': 'general', 'key': 'inventory', 'no_prefix': ' i inv', 'tags': '', 'text': '\n view inventory\n\n Usage:\n inventory\n inv\n\n Shows your inventory.\n '}¶
diff --git a/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_basic.html b/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_basic.html
index 9dd6a535f0..c662d4ed02 100644
--- a/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_basic.html
+++ b/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_basic.html
@@ -686,7 +686,7 @@ if there are still any actions you can take.
@@ -712,7 +712,7 @@ if there are still any actions you can take.
-
-
search_index_entry = {'aliases': 'hold wait', 'category': 'combat', 'key': 'pass', 'no_prefix': ' hold wait', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶
+search_index_entry = {'aliases': 'wait hold', 'category': 'combat', 'key': 'pass', 'no_prefix': ' wait hold', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶
diff --git a/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_equip.html b/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_equip.html
index 0bed424fda..b43d0f5a48 100644
--- a/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_equip.html
+++ b/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_equip.html
@@ -581,7 +581,7 @@ if there are still any actions you can take.
@@ -601,7 +601,7 @@ if there are still any actions you can take.
-
-
search_index_entry = {'aliases': 'hold wait', 'category': 'combat', 'key': 'pass', 'no_prefix': ' hold wait', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶
+search_index_entry = {'aliases': 'wait hold', 'category': 'combat', 'key': 'pass', 'no_prefix': ' wait hold', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶
diff --git a/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_items.html b/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_items.html
index 9b7607f915..1e2a340556 100644
--- a/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_items.html
+++ b/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_items.html
@@ -704,7 +704,7 @@ if there are still any actions you can take.
@@ -724,7 +724,7 @@ if there are still any actions you can take.
-
-
search_index_entry = {'aliases': 'hold wait', 'category': 'combat', 'key': 'pass', 'no_prefix': ' hold wait', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶
+search_index_entry = {'aliases': 'wait hold', 'category': 'combat', 'key': 'pass', 'no_prefix': ' wait hold', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶
diff --git a/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_magic.html b/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_magic.html
index 0f29530eac..62ecd7c88e 100644
--- a/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_magic.html
+++ b/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_magic.html
@@ -483,7 +483,7 @@ if there are still any actions you can take.
@@ -503,7 +503,7 @@ if there are still any actions you can take.
-
-
search_index_entry = {'aliases': 'hold wait', 'category': 'combat', 'key': 'pass', 'no_prefix': ' hold wait', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶
+search_index_entry = {'aliases': 'wait hold', 'category': 'combat', 'key': 'pass', 'no_prefix': ' wait hold', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶
diff --git a/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_range.html b/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_range.html
index d06a19f299..66eedd87ae 100644
--- a/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_range.html
+++ b/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_range.html
@@ -943,7 +943,7 @@ if there are still any actions you can take.
@@ -963,7 +963,7 @@ if there are still any actions you can take.
-
-
search_index_entry = {'aliases': 'hold wait', 'category': 'combat', 'key': 'pass', 'no_prefix': ' hold wait', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶
+search_index_entry = {'aliases': 'wait hold', 'category': 'combat', 'key': 'pass', 'no_prefix': ' wait hold', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶
diff --git a/docs/latest/api/evennia.contrib.rpg.dice.dice.html b/docs/latest/api/evennia.contrib.rpg.dice.dice.html
index fad4cb5e02..3d7ee8d157 100644
--- a/docs/latest/api/evennia.contrib.rpg.dice.dice.html
+++ b/docs/latest/api/evennia.contrib.rpg.dice.dice.html
@@ -340,7 +340,7 @@ everyone but the person rolling.
@@ -366,7 +366,7 @@ everyone but the person rolling.
-
-
search_index_entry = {'aliases': 'roll @dice', 'category': 'general', 'key': 'dice', 'no_prefix': ' roll dice', 'tags': '', 'text': "\n roll dice\n\n Usage:\n dice[/switch] <nr>d<sides> [modifier] [success condition]\n\n Switch:\n hidden - tell the room the roll is being done, but don't show the result\n secret - don't inform the room about neither roll nor result\n\n Examples:\n dice 3d6 + 4\n dice 1d100 - 2 < 50\n\n This will roll the given number of dice with given sides and modifiers.\n So e.g. 2d6 + 3 means to 'roll a 6-sided die 2 times and add the result,\n then add 3 to the total'.\n Accepted modifiers are +, -, * and /.\n A success condition is given as normal Python conditionals\n (<,>,<=,>=,==,!=). So e.g. 2d6 + 3 > 10 means that the roll will succeed\n only if the final result is above 8. If a success condition is given, the\n outcome (pass/fail) will be echoed along with how much it succeeded/failed\n with. The hidden/secret switches will hide all or parts of the roll from\n everyone but the person rolling.\n "}¶
+search_index_entry = {'aliases': '@dice roll', 'category': 'general', 'key': 'dice', 'no_prefix': ' dice roll', 'tags': '', 'text': "\n roll dice\n\n Usage:\n dice[/switch] <nr>d<sides> [modifier] [success condition]\n\n Switch:\n hidden - tell the room the roll is being done, but don't show the result\n secret - don't inform the room about neither roll nor result\n\n Examples:\n dice 3d6 + 4\n dice 1d100 - 2 < 50\n\n This will roll the given number of dice with given sides and modifiers.\n So e.g. 2d6 + 3 means to 'roll a 6-sided die 2 times and add the result,\n then add 3 to the total'.\n Accepted modifiers are +, -, * and /.\n A success condition is given as normal Python conditionals\n (<,>,<=,>=,==,!=). So e.g. 2d6 + 3 > 10 means that the roll will succeed\n only if the final result is above 8. If a success condition is given, the\n outcome (pass/fail) will be echoed along with how much it succeeded/failed\n with. The hidden/secret switches will hide all or parts of the roll from\n everyone but the person rolling.\n "}¶
diff --git a/docs/latest/api/evennia.contrib.tutorials.evadventure.commands.html b/docs/latest/api/evennia.contrib.tutorials.evadventure.commands.html
index c0bc2608d6..98c34b6087 100644
--- a/docs/latest/api/evennia.contrib.tutorials.evadventure.commands.html
+++ b/docs/latest/api/evennia.contrib.tutorials.evadventure.commands.html
@@ -206,7 +206,7 @@ self.args).
@@ -230,7 +230,7 @@ set in self.parse())
-
-
search_index_entry = {'aliases': 'inv i', 'category': 'general', 'key': 'inventory', 'no_prefix': ' inv i', 'tags': '', 'text': '\n View your inventory\n\n Usage:\n inventory\n\n '}¶
+search_index_entry = {'aliases': 'i inv', 'category': 'general', 'key': 'inventory', 'no_prefix': ' i inv', 'tags': '', 'text': '\n View your inventory\n\n Usage:\n inventory\n\n '}¶
diff --git a/docs/latest/api/evennia.contrib.tutorials.red_button.red_button.html b/docs/latest/api/evennia.contrib.tutorials.red_button.red_button.html
index 935cc1f5af..505e642581 100644
--- a/docs/latest/api/evennia.contrib.tutorials.red_button.red_button.html
+++ b/docs/latest/api/evennia.contrib.tutorials.red_button.red_button.html
@@ -167,7 +167,7 @@ such as when closing the lid and un-blinding a character.
+aliases = ['press button', 'push', 'press']¶
@@ -196,7 +196,7 @@ check if the lid is open or closed.
+search_index_entry = {'aliases': 'press button push press', 'category': 'general', 'key': 'push button', 'no_prefix': ' press button push press', 'tags': '', 'text': '\n Push the red button (lid closed)\n\n Usage:\n push button\n\n '}¶
@@ -393,7 +393,7 @@ be mutually exclusive.
+aliases = ['press button', 'push', 'press']¶
@@ -422,7 +422,7 @@ set in self.parse())
+search_index_entry = {'aliases': 'press button push press', 'category': 'general', 'key': 'push button', 'no_prefix': ' press button push press', 'tags': '', 'text': '\n Push the red button\n\n Usage:\n push button\n\n '}¶
@@ -520,7 +520,7 @@ be mutually exclusive.
+aliases = ['listen', 'examine', 'ex', 'feel', 'get', 'l']¶
@@ -546,7 +546,7 @@ be mutually exclusive.
+search_index_entry = {'aliases': 'listen examine ex feel get l', 'category': 'general', 'key': 'look', 'no_prefix': ' listen examine ex feel get l', 'tags': '', 'text': "\n Looking around in darkness\n\n Usage:\n look <obj>\n\n ... not that there's much to see in the dark.\n\n "}¶
diff --git a/docs/latest/api/evennia.contrib.tutorials.tutorial_world.objects.html b/docs/latest/api/evennia.contrib.tutorials.tutorial_world.objects.html
index 30955a9c93..4fa16376ed 100644
--- a/docs/latest/api/evennia.contrib.tutorials.tutorial_world.objects.html
+++ b/docs/latest/api/evennia.contrib.tutorials.tutorial_world.objects.html
@@ -570,7 +570,7 @@ shift green root up/down
@@ -606,7 +606,7 @@ yellow/green - horizontal roots
-
-
search_index_entry = {'aliases': 'move push shiftroot pull', 'category': 'tutorialworld', 'key': 'shift', 'no_prefix': ' move push shiftroot pull', 'tags': '', 'text': '\n Shifts roots around.\n\n Usage:\n shift blue root left/right\n shift red root left/right\n shift yellow root up/down\n shift green root up/down\n\n '}¶
+search_index_entry = {'aliases': 'move shiftroot push pull', 'category': 'tutorialworld', 'key': 'shift', 'no_prefix': ' move shiftroot push pull', 'tags': '', 'text': '\n Shifts roots around.\n\n Usage:\n shift blue root left/right\n shift red root left/right\n shift yellow root up/down\n shift green root up/down\n\n '}¶
@@ -623,7 +623,7 @@ yellow/green - horizontal roots
-
-
aliases = ['press button', 'push button', 'button']¶
+aliases = ['button', 'press button', 'push button']¶
@@ -649,7 +649,7 @@ yellow/green - horizontal roots
-
-
search_index_entry = {'aliases': 'press button push button button', 'category': 'tutorialworld', 'key': 'press', 'no_prefix': ' press button push button button', 'tags': '', 'text': '\n Presses a button.\n '}¶
+search_index_entry = {'aliases': 'button press button push button', 'category': 'tutorialworld', 'key': 'press', 'no_prefix': ' button press button push button', 'tags': '', 'text': '\n Presses a button.\n '}¶
@@ -793,7 +793,7 @@ parry - forgoes your attack but will make you harder to hit on next
-
-
aliases = ['slash', 'thrust', 'stab', 'chop', 'bash', 'fight', 'pierce', 'defend', 'hit', 'kill', 'parry']¶
+aliases = ['fight', 'chop', 'thrust', 'slash', 'stab', 'pierce', 'bash', 'kill', 'hit', 'defend', 'parry']¶
@@ -819,7 +819,7 @@ parry - forgoes your attack but will make you harder to hit on next
-
-
search_index_entry = {'aliases': 'slash thrust stab chop bash fight pierce defend hit kill parry', 'category': 'tutorialworld', 'key': 'attack', 'no_prefix': ' slash thrust stab chop bash fight pierce defend hit kill parry', 'tags': '', 'text': '\n Attack the enemy. Commands:\n\n stab <enemy>\n slash <enemy>\n parry\n\n stab - (thrust) makes a lot of damage but is harder to hit with.\n slash - is easier to land, but does not make as much damage.\n parry - forgoes your attack but will make you harder to hit on next\n enemy attack.\n\n '}¶
+search_index_entry = {'aliases': 'fight chop thrust slash stab pierce bash kill hit defend parry', 'category': 'tutorialworld', 'key': 'attack', 'no_prefix': ' fight chop thrust slash stab pierce bash kill hit defend parry', 'tags': '', 'text': '\n Attack the enemy. Commands:\n\n stab <enemy>\n slash <enemy>\n parry\n\n stab - (thrust) makes a lot of damage but is harder to hit with.\n slash - is easier to land, but does not make as much damage.\n parry - forgoes your attack but will make you harder to hit on next\n enemy attack.\n\n '}¶
diff --git a/docs/latest/api/evennia.contrib.tutorials.tutorial_world.rooms.html b/docs/latest/api/evennia.contrib.tutorials.tutorial_world.rooms.html
index a506d50f6e..b4ec1d99e3 100644
--- a/docs/latest/api/evennia.contrib.tutorials.tutorial_world.rooms.html
+++ b/docs/latest/api/evennia.contrib.tutorials.tutorial_world.rooms.html
@@ -830,7 +830,7 @@ if they fall off the bridge.
@@ -856,7 +856,7 @@ if they fall off the bridge.
-
-
search_index_entry = {'aliases': '? h', 'category': 'tutorial world', 'key': 'help', 'no_prefix': ' ? h', 'tags': '', 'text': '\n Overwritten help command while on the bridge.\n '}¶
+search_index_entry = {'aliases': 'h ?', 'category': 'tutorial world', 'key': 'help', 'no_prefix': ' h ?', 'tags': '', 'text': '\n Overwritten help command while on the bridge.\n '}¶
@@ -982,7 +982,7 @@ to find something.
-
-
aliases = ['l', 'fiddle', 'feel around', 'search', 'feel']¶
+aliases = ['feel around', 'fiddle', 'l', 'feel', 'search']¶
@@ -1010,7 +1010,7 @@ random chance of eventually finding a light source.
-
-
search_index_entry = {'aliases': 'l fiddle feel around search feel', 'category': 'tutorialworld', 'key': 'look', 'no_prefix': ' l fiddle feel around search feel', 'tags': '', 'text': '\n Look around in darkness\n\n Usage:\n look\n\n Look around in the darkness, trying\n to find something.\n '}¶
+search_index_entry = {'aliases': 'feel around fiddle l feel search', 'category': 'tutorialworld', 'key': 'look', 'no_prefix': ' feel around fiddle l feel search', 'tags': '', 'text': '\n Look around in darkness\n\n Usage:\n look\n\n Look around in the darkness, trying\n to find something.\n '}¶
diff --git a/docs/latest/api/evennia.contrib.utils.git_integration.git_integration.html b/docs/latest/api/evennia.contrib.utils.git_integration.git_integration.html
index 9955a8459b..c8a6ef92d7 100644
--- a/docs/latest/api/evennia.contrib.utils.git_integration.git_integration.html
+++ b/docs/latest/api/evennia.contrib.utils.git_integration.git_integration.html
@@ -222,7 +222,7 @@ git evennia pull - Pull the latest evennia code.
-
-
directory = '/tmp/tmpiey3gskj/bde8c0def77f3d6f375e077c1e561df376e53c01/evennia'¶
+directory = '/tmp/tmpw2lhzv5k/471406bbe427aeebeb1764fef17ced0d1a8ca593/evennia'¶
@@ -283,7 +283,7 @@ git pull - Pull the latest code from your current branch.
-
-
directory = '/tmp/tmpiey3gskj/bde8c0def77f3d6f375e077c1e561df376e53c01/evennia/game_template'¶
+directory = '/tmp/tmpw2lhzv5k/471406bbe427aeebeb1764fef17ced0d1a8ca593/evennia/game_template'¶
diff --git a/docs/latest/api/evennia.utils.eveditor.html b/docs/latest/api/evennia.utils.eveditor.html
index 5e50f05d99..72b3254ac1 100644
--- a/docs/latest/api/evennia.utils.eveditor.html
+++ b/docs/latest/api/evennia.utils.eveditor.html
@@ -356,7 +356,7 @@ indentation.
-
-
aliases = [':S', ':<', ':y', ':echo', ':=', ':uu', ':A', ':fd', ':', ':f', ':s', ':i', ':::', ':dw', ':UU', ':q!', ':r', ':dd', '::', ':w', ':p', ':fi', ':j', ':u', ':h', ':I', ':!', ':>', ':x', ':wq', ':DD', ':q']¶
+aliases = [':wq', '::', ':I', ':x', ':r', ':f', ':!', ':echo', ':A', ':', ':u', ':fd', ':=', ':q!', ':i', ':dw', ':y', ':<', ':fi', ':UU', ':p', ':S', ':uu', ':j', ':DD', ':h', ':s', ':dd', ':q', ':w', ':>', ':::']¶
@@ -384,7 +384,7 @@ efficient presentation.
-
-
search_index_entry = {'aliases': ':S :< :y :echo := :uu :A :fd : :f :s :i ::: :dw :UU :q! :r :dd :: :w :p :fi :j :u :h :I :! :> :x :wq :DD :q', 'category': 'general', 'key': ':editor_command_group', 'no_prefix': ' :S :< :y :echo := :uu :A :fd : :f :s :i ::: :dw :UU :q! :r :dd :: :w :p :fi :j :u :h :I :! :> :x :wq :DD :q', 'tags': '', 'text': '\n Commands for the editor\n '}¶
+search_index_entry = {'aliases': ':wq :: :I :x :r :f :! :echo :A : :u :fd := :q! :i :dw :y :< :fi :UU :p :S :uu :j :DD :h :s :dd :q :w :> :::', 'category': 'general', 'key': ':editor_command_group', 'no_prefix': ' :wq :: :I :x :r :f :! :echo :A : :u :fd := :q! :i :dw :y :< :fi :UU :p :S :uu :j :DD :h :s :dd :q :w :> :::', 'tags': '', 'text': '\n Commands for the editor\n '}¶
diff --git a/docs/latest/api/evennia.utils.evmenu.html b/docs/latest/api/evennia.utils.evmenu.html
index f64cd3c6ea..b3835b7f47 100644
--- a/docs/latest/api/evennia.utils.evmenu.html
+++ b/docs/latest/api/evennia.utils.evmenu.html
@@ -955,7 +955,7 @@ single question.
+aliases = ['n', 'no', '__nomatch_command', 'yes', 'a', 'y', 'abort']¶
@@ -981,7 +981,7 @@ single question.
+search_index_entry = {'aliases': 'n no __nomatch_command yes a y abort', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' n no __nomatch_command yes a y abort', 'tags': '', 'text': '\n Handle a prompt for yes or no. Press [return] for the default choice.\n\n '}¶
diff --git a/docs/latest/api/evennia.utils.evmore.html b/docs/latest/api/evennia.utils.evmore.html
index f74e67ca97..4c9adb946a 100644
--- a/docs/latest/api/evennia.utils.evmore.html
+++ b/docs/latest/api/evennia.utils.evmore.html
@@ -151,7 +151,7 @@ the caller.msg() construct every time the page is updated.
-
-
aliases = ['top', 'quit', 'previous', 'abort', 'q', 'a', 't', 'n', 'end', 'next', 'e', 'p']¶
+aliases = ['t', 'e', 'top', 'end', 'n', 'next', 'p', 'q', 'a', 'previous', 'abort', 'quit']¶
@@ -177,7 +177,7 @@ the caller.msg() construct every time the page is updated.
-
-
search_index_entry = {'aliases': 'top quit previous abort q a t n end next e p', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' top quit previous abort q a t n end next e p', 'tags': '', 'text': '\n Manipulate the text paging. Catch no-input with aliases.\n '}¶
+search_index_entry = {'aliases': 't e top end n next p q a previous abort quit', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' t e top end n next p q a previous abort quit', 'tags': '', 'text': '\n Manipulate the text paging. Catch no-input with aliases.\n '}¶
diff --git a/docs/latest/index.html b/docs/latest/index.html
index 794c7460c6..9960e41915 100644
--- a/docs/latest/index.html
+++ b/docs/latest/index.html
@@ -510,6 +510,7 @@
In-Game Mail system
Evennia Multidescer
Puzzles System
+Item Storage
Turn based battle system framework
achievements
barter
@@ -524,6 +525,7 @@
mail
multidescer
puzzles
+storage
turnbattle
diff --git a/docs/latest/objects.inv b/docs/latest/objects.inv
index f17256389cb2220426b467c483e567806170d2bc..4d65693793641d6a53285d2f50da9a8ddf6e3a7a 100644
GIT binary patch
delta 101806
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