From bd111b1998cf6b5d7a2253843931a2b80b23a46c Mon Sep 17 00:00:00 2001
From: Evennia docbuilder action Contribution by Griatch, 2012 Contribution by Griatch, 2012, 2023 A dice roller for any number and side of dice. Adds in-game dice rolling
-(Dice roller¶
-roll 2d10 + 1) as well as conditionals (roll under/over/equal to a target)
+(like roll 2d10 + 1) as well as conditionals (roll under/over/equal to a target)
and functions for rolling dice in code. Command also supports hidden or secret
rolls for use by a human game master.
Rolling this will inform all parties if roll was indeed below 8 or not.
-> roll/hidden
+> roll/hidden 1d100
Informs the room that the roll is being made without telling what the result
was.
-> roll/secret
+> roll/secret 1d20
-Is a hidden roll that does not inform the room it happened.
+This a hidden roll that does not inform the room it happened.
Rolling dice from code¶
@@ -196,9 +197,33 @@ construct the roll from components.
roll(2, 6, modifier=("-", 1), conditional=(">=", 10))
-You can only roll one set of dice. If your RPG requires you to roll multiple
+
+Dice pools and other variations¶
+You can only roll one set of dice at a time. If your RPG requires you to roll multiple
sets of dice and combine them in more advanced ways, you can do so with multiple
-roll() calls.
+roll() calls. Depending on what you need, you may just want to express this as
+helper functions specific for your game.
+Here’s how to roll a D&D advantage roll (roll d20 twice, pick highest):
+ from evennia.contrib.rpg.dice import roll
+
+ def roll_d20_with_advantage():
+ """Get biggest result of two d20 rolls"""
+ return max(roll("d20"), roll("d20"))
+
+
+
+Here’s an example of a Free-League style dice pool, where you roll a pile of d6
+and want to know how many 1s and sixes you get:
+from evennia.contrib.rpg.dice import roll
+
+def roll_dice_pool(poolsize):
+ """Return (number_of_ones, number_of_sixes)"""
+ results = [roll("1d6") for _ in range(poolsize)]
+ return results.count(1), results.count(6)
+
+
+
+
Get all roll details¶
If you need the individual rolls (e.g. for a dice pool), set the return_tuple kwarg:
diff --git a/docs/2.x/Contribs/Contribs-Overview.html b/docs/2.x/Contribs/Contribs-Overview.html
index 3afb6bde17..6f792279bb 100644
--- a/docs/2.x/Contribs/Contribs-Overview.html
+++ b/docs/2.x/Contribs/Contribs-Overview.html
@@ -680,9 +680,9 @@ It is a common design pattern in RPGs, particularly action games.
dice¶
-Contribution by Griatch, 2012
+Contribution by Griatch, 2012, 2023
A dice roller for any number and side of dice. Adds in-game dice rolling
-(roll 2d10 + 1) as well as conditionals (roll under/over/equal to a target)
+(like roll 2d10 + 1) as well as conditionals (roll under/over/equal to a target)
and functions for rolling dice in code. Command also supports hidden or secret
rolls for use by a human game master.
Read the documentation - Browse the Code
diff --git a/docs/2.x/Howtos/Beginner-Tutorial/Part3/Beginner-Tutorial-Rules.html b/docs/2.x/Howtos/Beginner-Tutorial/Part3/Beginner-Tutorial-Rules.html
index 4f99fdc467..f1f4582e2b 100644
--- a/docs/2.x/Howtos/Beginner-Tutorial/Part3/Beginner-Tutorial-Rules.html
+++ b/docs/2.x/Howtos/Beginner-Tutorial/Part3/Beginner-Tutorial-Rules.html
@@ -602,9 +602,7 @@ So the result for 1
2.3.8. Roll for death¶
-While original Knave suggests hitting 0 HP means insta-death, we will grab the optional “death table”
-from the “prettified” Knave’s optional rules to make it a little less punishing. We also changed the
-result of 2 to ‘dead’ since we don’t simulate ‘dismemberment’ in this tutorial:
+While original Knave suggests hitting 0 HP means insta-death, we will grab the optional “death table” from the “prettified” Knave’s optional rules to make it a little less punishing. We also changed the result of 2 to ‘dead’ since we don’t simulate ‘dismemberment’ in this tutorial:
Roll
@@ -643,9 +641,7 @@ result of 2<
-All the non-dead values map to a loss of 1d4 in one of the six Abilities (but you get HP back).
-We need to map back to this from the above table. One also cannot have less than -10 Ability bonus,
-if you do, you die too.
+All the non-dead values map to a loss of 1d4 in one of the six Abilities (but you get HP back). We need to map back to this from the above table. One also cannot have less than -10 Ability bonus, if you do, you die too.
# in mygame/evadventure/rules.py
death_table = (
@@ -696,9 +692,7 @@ if you do, you die too.
Here we roll on the ‘death table’ from the rules to see what happens. We give the character
a message if they survive, to let them know what happened.
-We don’t yet know what ‘killing the character’ technically means, so we mark this as TODO and
-return to it in a later lesson. We just know that we need to do something here to kill off the
-character!
+We don’t yet know what ‘killing the character’ technically means, so we mark this as TODO and return to it in a later lesson. We just know that we need to do something here to kill off the character!
@@ -743,14 +737,9 @@ has a complete example of rule testing.
test method. We use super().setUp() to make sure the parent class’ version of this method
always fire. Then we create a fresh EvAdventureRollEngine we can test with.
In our test, we import patch from the unittest.mock library. This is a very useful tool for testing.
-Normally the randint function we imported in rules will return a random value. That’s very hard to
-test for, since the value will be different every test.
-With @patch (this is called a decorator), we temporarily replace rules.randint with a ‘mock’ - a
-dummy entity. This mock is passed into the testing method. We then take this mock_randint and set
-.return_value = 4 on it.
-Adding return_value to the mock means that every time this mock is called, it will return 4. For the
-duration of the test we can now check with self.assertEqual that our roll method always returns a
-result as-if the random result was 4.
+Normally the randint function we imported in rules will return a random value. That’s very hard to test for, since the value will be different every test.
+With @patch (this is called a decorator), we temporarily replace rules.randint with a ‘mock’ - a dummy entity. This mock is passed into the testing method. We then take this mock_randint and set .return_value = 4 on it.
+Adding return_value to the mock means that every time this mock is called, it will return 4. For the duration of the test we can now check with self.assertEqual that our roll method always returns a result as-if the random result was 4.
There are many resources for understanding mock, refer to
them for further help.
@@ -760,9 +749,7 @@ them for further help.
2.5. Summary¶
-This concludes all the core rule mechanics of Knave - the rules used during play. We noticed here
-that we are going to soon need to establish how our Character actually stores data. So we will
-address that next.
+This concludes all the core rule mechanics of Knave - the rules used during play. We noticed here that we are going to soon need to establish how our Character actually stores data. So we will address that next.
diff --git a/docs/2.x/_sources/Contribs/Contrib-Dice.md.txt b/docs/2.x/_sources/Contribs/Contrib-Dice.md.txt
index 44d27b1e78..43c471ea8e 100644
--- a/docs/2.x/_sources/Contribs/Contrib-Dice.md.txt
+++ b/docs/2.x/_sources/Contribs/Contrib-Dice.md.txt
@@ -1,9 +1,9 @@
# Dice roller
-Contribution by Griatch, 2012
+Contribution by Griatch, 2012, 2023
A dice roller for any number and side of dice. Adds in-game dice rolling
-(`roll 2d10 + 1`) as well as conditionals (roll under/over/equal to a target)
+(like `roll 2d10 + 1`) as well as conditionals (roll under/over/equal to a target)
and functions for rolling dice in code. Command also supports hidden or secret
rolls for use by a human game master.
@@ -44,14 +44,14 @@ unbiased way. For example:
Rolling this will inform all parties if roll was indeed below 8 or not.
- > roll/hidden
+ > roll/hidden 1d100
Informs the room that the roll is being made without telling what the result
was.
- > roll/secret
+ > roll/secret 1d20
-Is a hidden roll that does not inform the room it happened.
+This a hidden roll that does not inform the room it happened.
## Rolling dice from code
@@ -93,9 +93,38 @@ Here's how to roll `2d6 - 1 >= 10` (you'll get back `True`/`False` back):
roll(2, 6, modifier=("-", 1), conditional=(">=", 10))
```
-You can only roll one set of dice. If your RPG requires you to roll multiple
+### Dice pools and other variations
+
+You can only roll one set of dice at a time. If your RPG requires you to roll multiple
sets of dice and combine them in more advanced ways, you can do so with multiple
-`roll()` calls.
+`roll()` calls. Depending on what you need, you may just want to express this as
+helper functions specific for your game.
+
+Here's how to roll a D&D advantage roll (roll d20 twice, pick highest):
+
+```python
+ from evennia.contrib.rpg.dice import roll
+
+ def roll_d20_with_advantage():
+ """Get biggest result of two d20 rolls"""
+ return max(roll("d20"), roll("d20"))
+
+```
+
+Here's an example of a Free-League style dice pool, where you roll a pile of d6
+and want to know how many 1s and sixes you get:
+
+```python
+from evennia.contrib.rpg.dice import roll
+
+def roll_dice_pool(poolsize):
+ """Return (number_of_ones, number_of_sixes)"""
+ results = [roll("1d6") for _ in range(poolsize)]
+ return results.count(1), results.count(6)
+
+```
+
+
### Get all roll details
diff --git a/docs/2.x/_sources/Contribs/Contribs-Overview.md.txt b/docs/2.x/_sources/Contribs/Contribs-Overview.md.txt
index 00f0694d85..07a9ceace6 100644
--- a/docs/2.x/_sources/Contribs/Contribs-Overview.md.txt
+++ b/docs/2.x/_sources/Contribs/Contribs-Overview.md.txt
@@ -581,10 +581,10 @@ Commands for managing and initiating an in-game character-creation menu.
### `dice`
-_Contribution by Griatch, 2012_
+_Contribution by Griatch, 2012, 2023_
A dice roller for any number and side of dice. Adds in-game dice rolling
-(`roll 2d10 + 1`) as well as conditionals (roll under/over/equal to a target)
+(like `roll 2d10 + 1`) as well as conditionals (roll under/over/equal to a target)
and functions for rolling dice in code. Command also supports hidden or secret
rolls for use by a human game master.
diff --git a/docs/2.x/_sources/Howtos/Beginner-Tutorial/Part3/Beginner-Tutorial-Rules.md.txt b/docs/2.x/_sources/Howtos/Beginner-Tutorial/Part3/Beginner-Tutorial-Rules.md.txt
index ff88476d56..c882d43c63 100644
--- a/docs/2.x/_sources/Howtos/Beginner-Tutorial/Part3/Beginner-Tutorial-Rules.md.txt
+++ b/docs/2.x/_sources/Howtos/Beginner-Tutorial/Part3/Beginner-Tutorial-Rules.md.txt
@@ -487,9 +487,7 @@ we check if `maxval` actually has a value `("5",)` or if its empty `()`. The res
### Roll for death
-While original Knave suggests hitting 0 HP means insta-death, we will grab the optional "death table"
-from the "prettified" Knave's optional rules to make it a little less punishing. We also changed the
-result of `2` to 'dead' since we don't simulate 'dismemberment' in this tutorial:
+While original Knave suggests hitting 0 HP means insta-death, we will grab the optional "death table" from the "prettified" Knave's optional rules to make it a little less punishing. We also changed the result of `2` to 'dead' since we don't simulate 'dismemberment' in this tutorial:
| Roll | Result | -1d4 Loss of Ability |
|:---: |:--------:|:--------------------:|
@@ -501,9 +499,7 @@ result of `2` to 'dead' since we don't simulate 'dismemberment' in this tutorial
| 7 | rattled | WIS |
| 8 | disfigured | CHA |
-All the non-dead values map to a loss of 1d4 in one of the six Abilities (but you get HP back).
-We need to map back to this from the above table. One also cannot have less than -10 Ability bonus,
-if you do, you die too.
+All the non-dead values map to a loss of 1d4 in one of the six Abilities (but you get HP back). We need to map back to this from the above table. One also cannot have less than -10 Ability bonus, if you do, you die too.
```python
# in mygame/evadventure/rules.py
@@ -557,9 +553,7 @@ dice = EvAdventureRollEngine()
Here we roll on the 'death table' from the rules to see what happens. We give the character
a message if they survive, to let them know what happened.
-We don't yet know what 'killing the character' technically means, so we mark this as `TODO` and
-return to it in a later lesson. We just know that we need to do _something_ here to kill off the
-character!
+We don't yet know what 'killing the character' technically means, so we mark this as `TODO` and return to it in a later lesson. We just know that we need to do _something_ here to kill off the character!
## Testing
@@ -605,16 +599,11 @@ test method. We use `super().setUp()` to make sure the parent class' version of
always fire. Then we create a fresh `EvAdventureRollEngine` we can test with.
In our test, we import `patch` from the `unittest.mock` library. This is a very useful tool for testing.
-Normally the `randint` function we imported in `rules` will return a random value. That's very hard to
-test for, since the value will be different every test.
+Normally the `randint` function we imported in `rules` will return a random value. That's very hard to test for, since the value will be different every test.
-With `@patch` (this is called a _decorator_), we temporarily replace `rules.randint` with a 'mock' - a
-dummy entity. This mock is passed into the testing method. We then take this `mock_randint` and set
-`.return_value = 4` on it.
+With `@patch` (this is called a _decorator_), we temporarily replace `rules.randint` with a 'mock' - a dummy entity. This mock is passed into the testing method. We then take this `mock_randint` and set `.return_value = 4` on it.
-Adding `return_value` to the mock means that every time this mock is called, it will return 4. For the
-duration of the test we can now check with `self.assertEqual` that our `roll` method always returns a
-result as-if the random result was 4.
+Adding `return_value` to the mock means that every time this mock is called, it will return 4. For the duration of the test we can now check with `self.assertEqual` that our `roll` method always returns a result as-if the random result was 4.
There are [many resources for understanding mock](https://realpython.com/python-mock-library/), refer to
them for further help.
@@ -623,9 +612,7 @@ them for further help.
## Summary
-This concludes all the core rule mechanics of _Knave_ - the rules used during play. We noticed here
-that we are going to soon need to establish how our _Character_ actually stores data. So we will
-address that next.
+This concludes all the core rule mechanics of _Knave_ - the rules used during play. We noticed here that we are going to soon need to establish how our _Character_ actually stores data. So we will address that next.
diff --git a/docs/2.x/api/evennia.commands.default.building.html b/docs/2.x/api/evennia.commands.default.building.html
index 6aec9fd6dc..8e1ae6555c 100644
--- a/docs/2.x/api/evennia.commands.default.building.html
+++ b/docs/2.x/api/evennia.commands.default.building.html
@@ -600,7 +600,7 @@ You can specify the /force switch to bypass this confirmation.
@@ -641,7 +641,7 @@ You can specify the /force switch to bypass this confirmation.
-
-
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 '}¶
+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 '}¶
@@ -1353,7 +1353,7 @@ server settings.
-
-
aliases = ['@type', '@parent', '@typeclasses', '@swap', '@update']¶
+aliases = ['@swap', '@typeclasses', '@update', '@parent', '@type']¶
@@ -1384,7 +1384,7 @@ server settings.
-
-
search_index_entry = {'aliases': '@type @parent @typeclasses @swap @update', 'category': 'building', 'key': '@typeclass', 'no_prefix': 'typeclass type parent typeclasses swap 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 "}¶
+search_index_entry = {'aliases': '@swap @typeclasses @update @parent @type', 'category': 'building', 'key': '@typeclass', 'no_prefix': 'typeclass swap typeclasses update parent type', '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 "}¶
@@ -1841,7 +1841,7 @@ one is given.
@@ -1872,7 +1872,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/2.x/api/evennia.commands.default.comms.html b/docs/2.x/api/evennia.commands.default.comms.html
index bc71ab84a5..5de183adbf 100644
--- a/docs/2.x/api/evennia.commands.default.comms.html
+++ b/docs/2.x/api/evennia.commands.default.comms.html
@@ -264,7 +264,7 @@ ban mychannel1,mychannel2= EvilUser : Was banned for spamming.
@@ -789,7 +789,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 "}¶
@@ -942,7 +942,7 @@ ban mychannel1,mychannel2= EvilUser : Was banned for spamming.
@@ -962,7 +962,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/2.x/api/evennia.commands.default.general.html b/docs/2.x/api/evennia.commands.default.general.html
index 6a5335eb75..c0a1f7cb73 100644
--- a/docs/2.x/api/evennia.commands.default.general.html
+++ b/docs/2.x/api/evennia.commands.default.general.html
@@ -276,7 +276,7 @@ for everyone to use, you need build privileges and the alias command.
@@ -308,7 +308,7 @@ for everyone to use, you need build privileges and the alias command.
-
-
search_index_entry = {'aliases': 'nicks nickname', 'category': 'general', 'key': 'nick', 'no_prefix': ' nicks nickname', 'tags': '', 'text': '\n define a personal alias/nick by defining a string to\n match and replace it with another on the fly\n\n Usage:\n nick[/switches] <string> [= [replacement_string]]\n nick[/switches] <template> = <replacement_template>\n nick/delete <string> or number\n nicks\n\n Switches:\n inputline - replace on the inputline (default)\n object - replace on object-lookup\n account - replace on account-lookup\n list - show all defined aliases (also "nicks" works)\n delete - remove nick by index in /list\n clearall - clear all nicks\n\n Examples:\n nick hi = say Hello, I\'m Sarah!\n nick/object tom = the tall man\n nick build $1 $2 = create/drop $1;$2\n nick tell $1 $2=page $1=$2\n nick tm?$1=page tallman=$1\n nick tm\\=$1=page tallman=$1\n\n A \'nick\' is a personal string replacement. Use $1, $2, ... to catch arguments.\n Put the last $-marker without an ending space to catch all remaining text. You\n can also use unix-glob matching for the left-hand side <string>:\n\n * - matches everything\n ? - matches 0 or 1 single characters\n [abcd] - matches these chars in any order\n [!abcd] - matches everything not among these chars\n \\= - escape literal \'=\' you want in your <string>\n\n Note that no objects are actually renamed or changed by this command - your nicks\n are only available to you. If you want to permanently add keywords to an object\n for everyone to use, you need build privileges and the alias command.\n\n '}¶
+search_index_entry = {'aliases': 'nickname nicks', 'category': 'general', 'key': 'nick', 'no_prefix': ' nickname nicks', 'tags': '', 'text': '\n define a personal alias/nick by defining a string to\n match and replace it with another on the fly\n\n Usage:\n nick[/switches] <string> [= [replacement_string]]\n nick[/switches] <template> = <replacement_template>\n nick/delete <string> or number\n nicks\n\n Switches:\n inputline - replace on the inputline (default)\n object - replace on object-lookup\n account - replace on account-lookup\n list - show all defined aliases (also "nicks" works)\n delete - remove nick by index in /list\n clearall - clear all nicks\n\n Examples:\n nick hi = say Hello, I\'m Sarah!\n nick/object tom = the tall man\n nick build $1 $2 = create/drop $1;$2\n nick tell $1 $2=page $1=$2\n nick tm?$1=page tallman=$1\n nick tm\\=$1=page tallman=$1\n\n A \'nick\' is a personal string replacement. Use $1, $2, ... to catch arguments.\n Put the last $-marker without an ending space to catch all remaining text. You\n can also use unix-glob matching for the left-hand side <string>:\n\n * - matches everything\n ? - matches 0 or 1 single characters\n [abcd] - matches these chars in any order\n [!abcd] - matches everything not among these chars\n \\= - escape literal \'=\' you want in your <string>\n\n Note that no objects are actually renamed or changed by this command - your nicks\n are only available to you. If you want to permanently add keywords to an object\n for everyone to use, you need build privileges and the alias command.\n\n '}¶
@@ -331,7 +331,7 @@ inv
@@ -362,7 +362,7 @@ inv
-
-
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 '}¶
+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 '}¶
@@ -606,7 +606,7 @@ placing it in their inventory.
@@ -637,7 +637,7 @@ placing it in their inventory.
-
-
search_index_entry = {'aliases': '\' "', 'category': 'general', 'key': 'say', 'no_prefix': ' \' "', 'tags': '', 'text': '\n speak as your character\n\n Usage:\n say <message>\n\n Talk to those in your current location.\n '}¶
+search_index_entry = {'aliases': '" \'', 'category': 'general', 'key': 'say', 'no_prefix': ' " \'', 'tags': '', 'text': '\n speak as your character\n\n Usage:\n say <message>\n\n Talk to those in your current location.\n '}¶
@@ -717,7 +717,7 @@ automatically begin with your name.
@@ -758,7 +758,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 "}¶
@@ -781,7 +781,7 @@ which permission groups you are a member of.
@@ -812,7 +812,7 @@ which permission groups you are a member of.
-
-
search_index_entry = {'aliases': 'groups hierarchy', 'category': 'general', 'key': 'access', 'no_prefix': ' groups hierarchy', 'tags': '', 'text': '\n show your current game access\n\n Usage:\n access\n\n This command shows you the permission hierarchy and\n which permission groups you are a member of.\n '}¶
+search_index_entry = {'aliases': 'hierarchy groups', 'category': 'general', 'key': 'access', 'no_prefix': ' hierarchy groups', 'tags': '', 'text': '\n show your current game access\n\n Usage:\n access\n\n This command shows you the permission hierarchy and\n which permission groups you are a member of.\n '}¶
diff --git a/docs/2.x/api/evennia.commands.default.tests.html b/docs/2.x/api/evennia.commands.default.tests.html
index 32f2c2e58a..0f302d83aa 100644
--- a/docs/2.x/api/evennia.commands.default.tests.html
+++ b/docs/2.x/api/evennia.commands.default.tests.html
@@ -963,7 +963,7 @@ main test suite started with
Test the batch processor.
+red_button = <module 'evennia.contrib.tutorials.red_button.red_button' from '/tmp/tmpgx53clc5/079ff67408623cb17694e4faeef97b94540a5aa3/evennia/contrib/tutorials/red_button/red_button.py'>¶
diff --git a/docs/2.x/api/evennia.commands.default.unloggedin.html b/docs/2.x/api/evennia.commands.default.unloggedin.html
index 0f04c26c98..ca94aedddd 100644
--- a/docs/2.x/api/evennia.commands.default.unloggedin.html
+++ b/docs/2.x/api/evennia.commands.default.unloggedin.html
@@ -130,7 +130,7 @@ connect “account name” “pass word”
@@ -165,7 +165,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': 'con co conn', 'category': 'general', 'key': 'connect', 'no_prefix': ' con co 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 '}¶
@@ -300,7 +300,7 @@ All it does is display the connect screen.
@@ -326,7 +326,7 @@ All it does is display the connect screen.
-
-
search_index_entry = {'aliases': 'look l', 'category': 'general', 'key': '__unloggedin_look_command', 'no_prefix': ' look l', 'tags': '', 'text': '\n look when in unlogged-in state\n\n Usage:\n look\n\n This is an unconnected version of the look command for simplicity.\n\n This is called by the server and kicks everything in gear.\n All it does is display the connect screen.\n '}¶
+search_index_entry = {'aliases': 'l look', 'category': 'general', 'key': '__unloggedin_look_command', 'no_prefix': ' l look', 'tags': '', 'text': '\n look when in unlogged-in state\n\n Usage:\n look\n\n This is an unconnected version of the look command for simplicity.\n\n This is called by the server and kicks everything in gear.\n All it does is display the connect screen.\n '}¶
@@ -349,7 +349,7 @@ for simplicity. It shows a pane of info.
@@ -375,7 +375,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/2.x/api/evennia.contrib.base_systems.email_login.email_login.html b/docs/2.x/api/evennia.contrib.base_systems.email_login.email_login.html
index a24f3ec752..f02b46642a 100644
--- a/docs/2.x/api/evennia.contrib.base_systems.email_login.email_login.html
+++ b/docs/2.x/api/evennia.contrib.base_systems.email_login.email_login.html
@@ -147,7 +147,7 @@ the module given by settings.CONNECTION_SCREEN_MODULE.
@@ -177,7 +177,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': 'con co conn', 'category': 'general', 'key': 'connect', 'no_prefix': ' con co 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 '}¶
@@ -299,7 +299,7 @@ All it does is display the connect screen.
@@ -325,7 +325,7 @@ All it does is display the connect screen.
-
-
search_index_entry = {'aliases': 'look l', 'category': 'general', 'key': '__unloggedin_look_command', 'no_prefix': ' look l', 'tags': '', 'text': '\n This is an unconnected version of the `look` command for simplicity.\n\n This is called by the server and kicks everything in gear.\n All it does is display the connect screen.\n '}¶
+search_index_entry = {'aliases': 'l look', 'category': 'general', 'key': '__unloggedin_look_command', 'no_prefix': ' l look', 'tags': '', 'text': '\n This is an unconnected version of the `look` command for simplicity.\n\n This is called by the server and kicks everything in gear.\n All it does is display the connect screen.\n '}¶
@@ -343,7 +343,7 @@ for simplicity. It shows a pane of info.
@@ -369,7 +369,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/2.x/api/evennia.contrib.base_systems.ingame_python.commands.html b/docs/2.x/api/evennia.contrib.base_systems.ingame_python.commands.html
index 2d17d971c4..3bf7ad15fe 100644
--- a/docs/2.x/api/evennia.contrib.base_systems.ingame_python.commands.html
+++ b/docs/2.x/api/evennia.contrib.base_systems.ingame_python.commands.html
@@ -124,7 +124,7 @@
@@ -205,7 +205,7 @@ on user permission.
-
-
search_index_entry = {'aliases': '@calls @callback @callbacks', 'category': 'building', 'key': '@call', 'no_prefix': 'call calls callback callbacks', 'tags': '', 'text': '\n Command to edit callbacks.\n '}¶
+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 '}¶
diff --git a/docs/2.x/api/evennia.contrib.base_systems.mux_comms_cmds.mux_comms_cmds.html b/docs/2.x/api/evennia.contrib.base_systems.mux_comms_cmds.mux_comms_cmds.html
index 7161fd5c59..ca49eb74d4 100644
--- a/docs/2.x/api/evennia.contrib.base_systems.mux_comms_cmds.mux_comms_cmds.html
+++ b/docs/2.x/api/evennia.contrib.base_systems.mux_comms_cmds.mux_comms_cmds.html
@@ -168,7 +168,7 @@ aliases to an already joined channel.
@@ -199,7 +199,7 @@ aliases to an already joined channel.
-
-
search_index_entry = {'aliases': 'aliaschan chanalias', 'category': 'comms', 'key': 'addcom', 'no_prefix': ' aliaschan chanalias', 'tags': '', 'text': '\n Add a channel alias and/or subscribe to a channel\n\n Usage:\n addcom [alias=] <channel>\n\n Joins a given channel. If alias is given, this will allow you to\n refer to the channel by this alias rather than the full channel\n name. Subsequent calls of this command can be used to add multiple\n aliases to an already joined channel.\n '}¶
+search_index_entry = {'aliases': 'chanalias aliaschan', 'category': 'comms', 'key': 'addcom', 'no_prefix': ' chanalias aliaschan', 'tags': '', 'text': '\n Add a channel alias and/or subscribe to a channel\n\n Usage:\n addcom [alias=] <channel>\n\n Joins a given channel. If alias is given, this will allow you to\n refer to the channel by this alias rather than the full channel\n name. Subsequent calls of this command can be used to add multiple\n aliases to an already joined channel.\n '}¶
@@ -225,7 +225,7 @@ for that channel.
@@ -256,7 +256,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/2.x/api/evennia.contrib.full_systems.evscaperoom.commands.html b/docs/2.x/api/evennia.contrib.full_systems.evscaperoom.commands.html
index e4a33512bf..60085688c2 100644
--- a/docs/2.x/api/evennia.contrib.full_systems.evscaperoom.commands.html
+++ b/docs/2.x/api/evennia.contrib.full_systems.evscaperoom.commands.html
@@ -219,7 +219,7 @@ the operation will be general or on the room.
@@ -243,7 +243,7 @@ set in self.parse())
-
-
search_index_entry = {'aliases': 'abort q quit chicken out', 'category': 'evscaperoom', 'key': 'give up', 'no_prefix': ' abort q quit chicken out', 'tags': '', 'text': '\n Give up\n\n Usage:\n give up\n\n Abandons your attempts at escaping and of ever winning the pie-eating contest.\n\n '}¶
+search_index_entry = {'aliases': 'chicken out q abort quit', 'category': 'evscaperoom', 'key': 'give up', 'no_prefix': ' chicken out q abort quit', 'tags': '', 'text': '\n Give up\n\n Usage:\n give up\n\n Abandons your attempts at escaping and of ever winning the pie-eating contest.\n\n '}¶
@@ -379,7 +379,7 @@ shout
@@ -408,7 +408,7 @@ set in self.parse())
-
-
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 '}¶
+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 '}¶
@@ -589,7 +589,7 @@ set in self.parse())
@@ -613,7 +613,7 @@ set in self.parse())
-
-
search_index_entry = {'aliases': 'i inventory give inv', 'category': 'evscaperoom', 'key': 'get', 'no_prefix': ' i inventory give inv', 'tags': '', 'text': '\n Use focus / examine instead.\n\n '}¶
+search_index_entry = {'aliases': 'inventory i inv give', 'category': 'evscaperoom', 'key': 'get', 'no_prefix': ' inventory i inv give', 'tags': '', 'text': '\n Use focus / examine instead.\n\n '}¶
@@ -634,7 +634,7 @@ set in self.parse())
@@ -657,7 +657,7 @@ to all the variables defined therein.
-
-
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 '}¶
+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 '}¶
diff --git a/docs/2.x/api/evennia.contrib.game_systems.clothing.clothing.html b/docs/2.x/api/evennia.contrib.game_systems.clothing.clothing.html
index 2c3865a810..7c96a8a017 100644
--- a/docs/2.x/api/evennia.contrib.game_systems.clothing.clothing.html
+++ b/docs/2.x/api/evennia.contrib.game_systems.clothing.clothing.html
@@ -630,7 +630,7 @@ inv
@@ -661,7 +661,7 @@ inv
-
-
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 '}¶
+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 '}¶
diff --git a/docs/2.x/api/evennia.contrib.grid.xyzgrid.commands.html b/docs/2.x/api/evennia.contrib.grid.xyzgrid.commands.html
index f92fe04007..652a2fef7e 100644
--- a/docs/2.x/api/evennia.contrib.grid.xyzgrid.commands.html
+++ b/docs/2.x/api/evennia.contrib.grid.xyzgrid.commands.html
@@ -430,7 +430,7 @@ there is no room above/below you, your movement will fail.
@@ -453,7 +453,7 @@ to all the variables defined therein.
-
-
search_index_entry = {'aliases': 'dive fly', 'category': 'general', 'key': 'fly or dive', 'no_prefix': ' dive fly', 'tags': '', 'text': '\n Fly or Dive up and down.\n\n Usage:\n fly\n dive\n\n Will fly up one room or dive down one room at your current position. If\n there is no room above/below you, your movement will fail.\n\n '}¶
+search_index_entry = {'aliases': 'fly dive', 'category': 'general', 'key': 'fly or dive', 'no_prefix': ' fly dive', 'tags': '', 'text': '\n Fly or Dive up and down.\n\n Usage:\n fly\n dive\n\n Will fly up one room or dive down one room at your current position. If\n there is no room above/below you, your movement will fail.\n\n '}¶
diff --git a/docs/2.x/api/evennia.contrib.rpg.rpsystem.rpsystem.html b/docs/2.x/api/evennia.contrib.rpg.rpsystem.rpsystem.html
index 797bc2810d..c1c61a27f3 100644
--- a/docs/2.x/api/evennia.contrib.rpg.rpsystem.rpsystem.html
+++ b/docs/2.x/api/evennia.contrib.rpg.rpsystem.rpsystem.html
@@ -709,7 +709,7 @@ a different language.
@@ -740,7 +740,7 @@ a different language.
-
-
search_index_entry = {'aliases': '\' "', 'category': 'general', 'key': 'say', 'no_prefix': ' \' "', 'tags': '', 'text': '\n speak as your character\n\n Usage:\n say <message>\n\n Talk to those in your current location.\n '}¶
+search_index_entry = {'aliases': '" \'', 'category': 'general', 'key': 'say', 'no_prefix': ' " \'', 'tags': '', 'text': '\n speak as your character\n\n Usage:\n say <message>\n\n Talk to those in your current location.\n '}¶
@@ -881,7 +881,7 @@ Using the command without arguments will list all current recogs.
@@ -908,7 +908,7 @@ Using the command without arguments will list all current recogs.
-
-
search_index_entry = {'aliases': 'forget recognize', 'category': 'general', 'key': 'recog', 'no_prefix': ' forget recognize', 'tags': '', 'text': '\n Recognize another person in the same room.\n\n Usage:\n recog\n recog sdesc as alias\n forget alias\n\n Example:\n recog tall man as Griatch\n forget griatch\n\n This will assign a personal alias for a person, or forget said alias.\n Using the command without arguments will list all current recogs.\n\n '}¶
+search_index_entry = {'aliases': 'recognize forget', 'category': 'general', 'key': 'recog', 'no_prefix': ' recognize forget', 'tags': '', 'text': '\n Recognize another person in the same room.\n\n Usage:\n recog\n recog sdesc as alias\n forget alias\n\n Example:\n recog tall man as Griatch\n forget griatch\n\n This will assign a personal alias for a person, or forget said alias.\n Using the command without arguments will list all current recogs.\n\n '}¶
diff --git a/docs/2.x/api/evennia.contrib.tutorials.evadventure.combat_twitch.html b/docs/2.x/api/evennia.contrib.tutorials.evadventure.combat_twitch.html
index 9e80a493d0..c801039b1b 100644
--- a/docs/2.x/api/evennia.contrib.tutorials.evadventure.combat_twitch.html
+++ b/docs/2.x/api/evennia.contrib.tutorials.evadventure.combat_twitch.html
@@ -485,7 +485,7 @@ boost INT Wizard Goblin
@@ -519,7 +519,7 @@ set in self.parse())
-
-
search_index_entry = {'aliases': 'foil boost', 'category': 'combat', 'key': 'stunt', 'no_prefix': ' foil boost', 'tags': '', 'text': '\n Perform a combat stunt, that boosts an ally against a target, or\n foils an enemy, giving them disadvantage against an ally.\n\n Usage:\n boost [ability] <recipient> <target>\n foil [ability] <recipient> <target>\n boost [ability] <target> (same as boost me <target>)\n foil [ability] <target> (same as foil <target> me)\n\n Example:\n boost STR me Goblin\n boost DEX Goblin\n foil STR Goblin me\n foil INT Goblin\n boost INT Wizard Goblin\n\n '}¶
+search_index_entry = {'aliases': 'boost foil', 'category': 'combat', 'key': 'stunt', 'no_prefix': ' boost foil', 'tags': '', 'text': '\n Perform a combat stunt, that boosts an ally against a target, or\n foils an enemy, giving them disadvantage against an ally.\n\n Usage:\n boost [ability] <recipient> <target>\n foil [ability] <recipient> <target>\n boost [ability] <target> (same as boost me <target>)\n foil [ability] <target> (same as foil <target> me)\n\n Example:\n boost STR me Goblin\n boost DEX Goblin\n foil STR Goblin me\n foil INT Goblin\n boost INT Wizard Goblin\n\n '}¶
diff --git a/docs/2.x/api/evennia.contrib.tutorials.red_button.red_button.html b/docs/2.x/api/evennia.contrib.tutorials.red_button.red_button.html
index f03f921c89..7b0301378a 100644
--- a/docs/2.x/api/evennia.contrib.tutorials.red_button.red_button.html
+++ b/docs/2.x/api/evennia.contrib.tutorials.red_button.red_button.html
@@ -161,7 +161,7 @@ such as when closing the lid and un-blinding a character.
+aliases = ['press button', 'press', 'push']¶
@@ -190,7 +190,7 @@ check if the lid is open or closed.
+search_index_entry = {'aliases': 'press button press push', 'category': 'general', 'key': 'push button', 'no_prefix': ' press button press push', 'tags': '', 'text': '\n Push the red button (lid closed)\n\n Usage:\n push button\n\n '}¶
@@ -260,7 +260,7 @@ check if the lid is open or closed.
+aliases = ['smash lid', 'break lid', 'smash']¶
@@ -287,7 +287,7 @@ break.
+search_index_entry = {'aliases': 'smash lid break lid smash', 'category': 'general', 'key': 'smash glass', 'no_prefix': ' smash lid break lid smash', 'tags': '', 'text': '\n Smash the protective glass.\n\n Usage:\n smash glass\n\n Try to smash the glass of the button.\n\n '}¶
@@ -387,7 +387,7 @@ be mutually exclusive.
+aliases = ['press button', 'press', 'push']¶
@@ -416,7 +416,7 @@ set in self.parse())
+search_index_entry = {'aliases': 'press button press push', 'category': 'general', 'key': 'push button', 'no_prefix': ' press button press push', 'tags': '', 'text': '\n Push the red button\n\n Usage:\n push button\n\n '}¶
@@ -514,7 +514,7 @@ be mutually exclusive.
+aliases = ['ex', 'examine', 'listen', 'get', 'feel', 'l']¶
@@ -540,7 +540,7 @@ be mutually exclusive.
+search_index_entry = {'aliases': 'ex examine listen get feel l', 'category': 'general', 'key': 'look', 'no_prefix': ' ex examine listen get feel 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/2.x/api/evennia.contrib.tutorials.tutorial_world.objects.html b/docs/2.x/api/evennia.contrib.tutorials.tutorial_world.objects.html
index 8ebf4dd985..f38679acaf 100644
--- a/docs/2.x/api/evennia.contrib.tutorials.tutorial_world.objects.html
+++ b/docs/2.x/api/evennia.contrib.tutorials.tutorial_world.objects.html
@@ -433,7 +433,7 @@ of the object. We overload it with our own version.
@@ -460,7 +460,7 @@ to sit on a “lightable” object, we operate only on self.obj.
-
-
search_index_entry = {'aliases': 'light burn', 'category': 'tutorialworld', 'key': 'on', 'no_prefix': ' light burn', 'tags': '', 'text': '\n Creates light where there was none. Something to burn.\n '}¶
+search_index_entry = {'aliases': 'burn light', 'category': 'tutorialworld', 'key': 'on', 'no_prefix': ' burn light', 'tags': '', 'text': '\n Creates light where there was none. Something to burn.\n '}¶
@@ -564,7 +564,7 @@ shift green root up/down
@@ -600,7 +600,7 @@ yellow/green - horizontal roots
-
-
search_index_entry = {'aliases': 'shiftroot move push pull', 'category': 'tutorialworld', 'key': 'shift', 'no_prefix': ' shiftroot move 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 '}¶
+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 '}¶
@@ -617,7 +617,7 @@ yellow/green - horizontal roots
-
-
aliases = ['push button', 'press button', 'button']¶
+aliases = ['press button', 'button', 'push button']¶
@@ -643,7 +643,7 @@ yellow/green - horizontal roots
-
-
search_index_entry = {'aliases': 'push button press button button', 'category': 'tutorialworld', 'key': 'press', 'no_prefix': ' push button press button button', 'tags': '', 'text': '\n Presses a button.\n '}¶
+search_index_entry = {'aliases': 'press button button push button', 'category': 'tutorialworld', 'key': 'press', 'no_prefix': ' press button button push button', 'tags': '', 'text': '\n Presses a button.\n '}¶
@@ -787,7 +787,7 @@ parry - forgoes your attack but will make you harder to hit on next
-
-
aliases = ['defend', 'hit', 'fight', 'pierce', 'chop', 'slash', 'bash', 'thrust', 'parry', 'kill', 'stab']¶
+aliases = ['kill', 'chop', 'pierce', 'parry', 'fight', 'stab', 'defend', 'thrust', 'hit', 'slash', 'bash']¶
@@ -813,7 +813,7 @@ parry - forgoes your attack but will make you harder to hit on next
-
-
search_index_entry = {'aliases': 'defend hit fight pierce chop slash bash thrust parry kill stab', 'category': 'tutorialworld', 'key': 'attack', 'no_prefix': ' defend hit fight pierce chop slash bash thrust parry kill stab', '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': 'kill chop pierce parry fight stab defend thrust hit slash bash', 'category': 'tutorialworld', 'key': 'attack', 'no_prefix': ' kill chop pierce parry fight stab defend thrust hit slash bash', '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/2.x/api/evennia.contrib.tutorials.tutorial_world.rooms.html b/docs/2.x/api/evennia.contrib.tutorials.tutorial_world.rooms.html
index d3c44f132d..d2c435265b 100644
--- a/docs/2.x/api/evennia.contrib.tutorials.tutorial_world.rooms.html
+++ b/docs/2.x/api/evennia.contrib.tutorials.tutorial_world.rooms.html
@@ -824,7 +824,7 @@ if they fall off the bridge.
@@ -850,7 +850,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 '}¶
@@ -976,7 +976,7 @@ to find something.
-
-
aliases = ['feel', 'l', 'search', 'feel around', 'fiddle']¶
+aliases = ['feel around', 'search', 'fiddle', 'feel', 'l']¶
@@ -1004,7 +1004,7 @@ random chance of eventually finding a light source.
-
-
search_index_entry = {'aliases': 'feel l search feel around fiddle', 'category': 'tutorialworld', 'key': 'look', 'no_prefix': ' feel l search feel around fiddle', '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 search fiddle feel l', 'category': 'tutorialworld', 'key': 'look', 'no_prefix': ' feel around search fiddle feel l', '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/2.x/api/evennia.contrib.utils.git_integration.git_integration.html b/docs/2.x/api/evennia.contrib.utils.git_integration.git_integration.html
index 0462a2b95e..efdaa539bc 100644
--- a/docs/2.x/api/evennia.contrib.utils.git_integration.git_integration.html
+++ b/docs/2.x/api/evennia.contrib.utils.git_integration.git_integration.html
@@ -216,7 +216,7 @@ git evennia pull - Pull the latest evennia code.
-
-
directory = '/tmp/tmp__6swbk7/ae2c2fd1b143554d596208211048b72d91230404/evennia'¶
+directory = '/tmp/tmpgx53clc5/079ff67408623cb17694e4faeef97b94540a5aa3/evennia'¶
@@ -277,7 +277,7 @@ git pull - Pull the latest code from your current branch.
-
-
directory = '/tmp/tmp__6swbk7/ae2c2fd1b143554d596208211048b72d91230404/evennia/game_template'¶
+directory = '/tmp/tmpgx53clc5/079ff67408623cb17694e4faeef97b94540a5aa3/evennia/game_template'¶
diff --git a/docs/2.x/api/evennia.utils.eveditor.html b/docs/2.x/api/evennia.utils.eveditor.html
index 8c7d97fc4f..32e244482a 100644
--- a/docs/2.x/api/evennia.utils.eveditor.html
+++ b/docs/2.x/api/evennia.utils.eveditor.html
@@ -344,7 +344,7 @@ indentation.
-
-
aliases = [':echo', ':w', ':UU', ':x', ':dw', ':q', ':>', ':dd', ':r', ':u', ':A', ':j', ':=', ':h', ':s', ':<', ':fi', ':::', ':!', ':', '::', ':f', ':DD', ':y', ':q!', ':i', ':p', ':I', ':fd', ':uu', ':S', ':wq']¶
+aliases = [':I', ':::', ':!', ':<', ':w', ':y', ':wq', ':r', ':f', ':dw', ':i', ':=', '::', ':dd', ':j', ':UU', ':h', ':', ':DD', ':S', ':u', ':fi', ':q', ':fd', ':uu', ':echo', ':A', ':x', ':s', ':>', ':q!', ':p']¶
@@ -372,7 +372,7 @@ efficient presentation.
-
-
search_index_entry = {'aliases': ':echo :w :UU :x :dw :q :> :dd :r :u :A :j := :h :s :< :fi ::: :! : :: :f :DD :y :q! :i :p :I :fd :uu :S :wq', 'category': 'general', 'key': ':editor_command_group', 'no_prefix': ' :echo :w :UU :x :dw :q :> :dd :r :u :A :j := :h :s :< :fi ::: :! : :: :f :DD :y :q! :i :p :I :fd :uu :S :wq', 'tags': '', 'text': '\n Commands for the editor\n '}¶
+search_index_entry = {'aliases': ':I ::: :! :< :w :y :wq :r :f :dw :i := :: :dd :j :UU :h : :DD :S :u :fi :q :fd :uu :echo :A :x :s :> :q! :p', 'category': 'general', 'key': ':editor_command_group', 'no_prefix': ' :I ::: :! :< :w :y :wq :r :f :dw :i := :: :dd :j :UU :h : :DD :S :u :fi :q :fd :uu :echo :A :x :s :> :q! :p', 'tags': '', 'text': '\n Commands for the editor\n '}¶
diff --git a/docs/2.x/api/evennia.utils.evmenu.html b/docs/2.x/api/evennia.utils.evmenu.html
index 2803da515c..8a1ccdafe0 100644
--- a/docs/2.x/api/evennia.utils.evmenu.html
+++ b/docs/2.x/api/evennia.utils.evmenu.html
@@ -939,7 +939,7 @@ single question.
+aliases = ['yes', 'n', '__nomatch_command', 'no', 'y', 'a', 'abort']¶
@@ -965,7 +965,7 @@ single question.
+search_index_entry = {'aliases': 'yes n __nomatch_command no y a abort', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' yes n __nomatch_command no y a abort', 'tags': '', 'text': '\n Handle a prompt for yes or no. Press [return] for the default choice.\n\n '}¶
diff --git a/docs/2.x/api/evennia.utils.evmore.html b/docs/2.x/api/evennia.utils.evmore.html
index d5789bc0c2..175cd3e4ad 100644
--- a/docs/2.x/api/evennia.utils.evmore.html
+++ b/docs/2.x/api/evennia.utils.evmore.html
@@ -145,7 +145,7 @@ the caller.msg() construct every time the page is updated.
-
-
aliases = ['a', 'q', 't', 'p', 'e', 'quit', 'next', 'n', 'end', 'abort', 'previous', 'top']¶
+aliases = ['previous', 'next', 'top', 't', 'n', 'q', 'end', 'e', 'quit', 'p', 'a', 'abort']¶
@@ -171,7 +171,7 @@ the caller.msg() construct every time the page is updated.
-
-
search_index_entry = {'aliases': 'a q t p e quit next n end abort previous top', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' a q t p e quit next n end abort previous top', 'tags': '', 'text': '\n Manipulate the text paging. Catch no-input with aliases.\n '}¶
+search_index_entry = {'aliases': 'previous next top t n q end e quit p a abort', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' previous next top t n q end e quit p a abort', 'tags': '', 'text': '\n Manipulate the text paging. Catch no-input with aliases.\n '}¶
diff --git a/docs/2.x/objects.inv b/docs/2.x/objects.inv
index 11aee1132a6ded86c1e1bf3407fd520ce358b4a1..6f8981a24413ce6b0c27850cff3561be9152f5a4 100644
GIT binary patch
delta 85774
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