From afea725e7c221f7115f3cdb4c7f7c947d9515278 Mon Sep 17 00:00:00 2001
From: Evennia docbuilder action
When adding the trait, you supply the name of the property (hunting) along
@@ -209,7 +213,6 @@ other properties/methods on your class.
@@ -227,7 +230,7 @@ the same handler (.
Using traits¶
-A trait is added to the traithandler (if you use TraitProperty the handler is just created under
+
A trait are entities added to the traithandler (if you use TraitProperty the handler is just created under
the hood) after which one can access it as a property on the handler (similarly to how you can do
.db.attrname for Attributes in Evennia).
All traits have a read-only field .value. This is only used to read out results, you never
@@ -269,9 +272,25 @@ each other depends on the trait type.
> obj.strength.value += 5
> obj.strength.value
17
-
+
+Relating traits to one another¶
+From a trait you can access its own Traithandler as .traithandler. You can
+also find another trait on the same handler by using the
+Trait.get_trait("traitname") method.
+> obj.strength.get_trait("hp").value
+100
+
+
+This is not too useful for the default trait types - they are all operating
+independently from one another. But if you create your own trait classes, you
+can use this to make traits that depend on each other.
+For example, you could picture making a Trait that is the sum of the values of
+two other traits and capped by the value of a third trait. Such complex
+interactions are common in RPG rule systems but are by definition game specific.
+See an example in the section about making your own Trait classes.
+
Trait types¶
@@ -288,7 +307,6 @@ compatible type.
> trait1 + 2
> trait1.value
5
-
Two numerical traits can also be compared (bigger-than etc), which is useful in
@@ -296,7 +314,6 @@ all sorts of rule-resolution.
if trait1 > trait2:
# do stuff
-
@@ -316,7 +333,6 @@ like a glorified Attribute.
> obj.traits.mytrait.value = "stringvalue"
> obj.traits.mytrait.value
"stringvalue"
-
@@ -338,7 +354,6 @@ that varies slowly or not at all, and which may be modified in-place.
> obj.traits.mytrait.mod = 0
> obj.traits.mytrait.value
12
-
@@ -373,8 +388,6 @@ remove it. A suggested use for a Counter Trait would be to track skill values.
# for TraitProperties, pass the args/kwargs of traits.add() to the
# TraitProperty constructor instead.
-
-
Counters have some extra properties:
@@ -403,7 +416,6 @@ By calling .desc()<
> obj.traits.hunting.desc()
"expert"
-
@@ -442,13 +454,13 @@ a previous value.
71 # we have stopped at the ratetarget
> obj.traits.hunting.rate = 0 # disable auto-change
-
-
Note that when retrieving the current, the result will always be of the same
type as the .base even rate is a non-integer value. So if base is an int
-(default), the currentvalue will also be rounded the closest full integer. If you want to see the exactcurrentvalue, setbaseto a float - you will then need to useround()` yourself on the result if you want integers.
+(default), the current value will also be rounded the closest full integer.
+If you want to see the exact current value, set base to a float - you
+will then need to use round() yourself on the result if you want integers.
.percent()¶
@@ -459,7 +471,6 @@ return the value as a percentage.
> obj.traits.hunting.percent(formatting=None)
71.0
-
@@ -490,7 +501,6 @@ stamina and the like.
> obj.traits.hp.current -= 30
> obj.traits.hp.value
80
-
The Gauge trait is subclass of the Counter, so you have access to the same
@@ -521,8 +531,6 @@ the existing Trait classes).
def sedate(self):
self.mod = 0
-
-
Above is an example custom-trait-class “rage” that stores a property “rage” on
@@ -538,15 +546,25 @@ default (0). Above we also added some helper methods.
> obj.traits.add("mood", "A dark mood", rage=30, trait_type='rage')
> obj.traits.mood.rage
30
-
-# as TraitProperty
-
-class Character(DefaultCharacter):
- rage = TraitProperty("A dark mood", rage=30, trait_type='rage')
-
+
+
+Remember that you can use .get_trait("name") to access other traits on the
+same handler. Let’s say that the rage modifier is actually limited by
+the characters’s current STR value times 3, with a max of 100:
+class RageTrait(StaticTrait):
+ #...
+ def berserk(self):
+ self.mod = min(100, self.get_trait("STR").value * 3)
+
+
+as TraitProperty¶
+class Character(DefaultCharacter):
+ rage = TraitProperty("A dark mood", rage=30, trait_type='rage')
+
+
Adding additional TraitHandlers¶
Sometimes, it is easier to top-level classify traits, such as stats, skills, or other categories of traits you want to handle independantly of each other. Here is an example showing an example on the object typeclass, expanding on the first installation example:
@@ -564,7 +582,7 @@ default (0). Above we also added some helper methods.
def traits(self):
# this adds the handler as .traits
return TraitHandler(self)
-
+
@lazy_property
def stats(self):
# this adds the handler as .stats
@@ -584,6 +602,10 @@ default (0). Above we also added some helper methods.
base=10, mod=1, min=0, max=100)
+
+Rememebr that the .get_traits() method only works for accessing Traits within the
+same TraitHandler.
+
This document page is generated from evennia/contrib/rpg/traits/README.md. Changes to this
file will be overwritten, so edit that file rather than this one.
diff --git a/docs/latest/Contribs/Contribs-Overview.html b/docs/latest/Contribs/Contribs-Overview.html
index 8ec6215f0e..2bbf335a2e 100644
--- a/docs/latest/Contribs/Contribs-Overview.html
+++ b/docs/latest/Contribs/Contribs-Overview.html
@@ -691,6 +691,7 @@ and rule implementation like character traits, dice rolling and emoting.Large Language Model (“Chat-bot AI”) integration
Roleplaying base system for Evennia
Traits
+as TraitProperty
diff --git a/docs/latest/_sources/Contribs/Contrib-Traits.md.txt b/docs/latest/_sources/Contribs/Contrib-Traits.md.txt
index 901f42ea4c..9eac6bcd90 100644
--- a/docs/latest/_sources/Contribs/Contrib-Traits.md.txt
+++ b/docs/latest/_sources/Contribs/Contrib-Traits.md.txt
@@ -4,7 +4,7 @@ Contribution by Griatch 2020, based on code by Whitenoise and Ainneve contribs,
A `Trait` represents a modifiable property on (usually) a Character. They can
be used to represent everything from attributes (str, agi etc) to skills
-(hunting 10, swords 14 etc) and dynamically changing things like HP, XP etc.
+(hunting 10, swords 14 etc) and dynamically changing things like HP, XP etc.
Traits differ from normal Attributes in that they track their changes and limit
themselves to particular value-ranges. One can add/subtract from them easily and
they can even change dynamically at a particular rate (like you being poisoned or
@@ -50,8 +50,6 @@ class Character(DefaultCharacter):
self.traits.add("hp", "Health", trait_type="gauge", min=0, max=100)
self.traits.add("hunting", "Hunting Skill", trait_type="counter",
base=10, mod=1, min=0, max=100)
-
-
```
When adding the trait, you supply the name of the property (`hunting`) along
with a more human-friendly name ("Hunting Skill"). The latter will show if you
@@ -78,7 +76,6 @@ class Object(DefaultObject):
strength = TraitProperty("Strength", trait_type="static", base=10, mod=2)
health = TraitProperty("Health", trait_type="gauge", min=0, base=100, mod=2)
hunting = TraitProperty("Hunting Skill", trait_type="counter", base=10, mod=1, min=0, max=100)
-
```
> Note that the property-name will become the name of the trait and you don't supply `trait_key`
@@ -92,7 +89,7 @@ class Object(DefaultObject):
## Using traits
-A trait is added to the traithandler (if you use `TraitProperty` the handler is just created under
+A trait are entities added to the traithandler (if you use `TraitProperty` the handler is just created under
the hood) after which one can access it as a property on the handler (similarly to how you can do
.db.attrname for Attributes in Evennia).
@@ -137,9 +134,30 @@ obj.traits.strength.value
> obj.strength.value += 5
> obj.strength.value
17
-
```
+### Relating traits to one another
+
+From a trait you can access its own Traithandler as `.traithandler`. You can
+also find another trait on the same handler by using the
+`Trait.get_trait("traitname")` method.
+
+```python
+> obj.strength.get_trait("hp").value
+100
+```
+
+This is not too useful for the default trait types - they are all operating
+independently from one another. But if you create your own trait classes, you
+can use this to make traits that depend on each other.
+
+For example, you could picture making a Trait that is the sum of the values of
+two other traits and capped by the value of a third trait. Such complex
+interactions are common in RPG rule systems but are by definition game specific.
+
+See an example in the section about [making your own Trait classes](#expanding-with-your-own-traits).
+
+
## Trait types
All default traits have a read-only `.value` property that shows the relevant or
@@ -158,7 +176,6 @@ compatible type.
> trait1 + 2
> trait1.value
5
-
```
Two numerical traits can also be compared (bigger-than etc), which is useful in
@@ -168,7 +185,6 @@ all sorts of rule-resolution.
if trait1 > trait2:
# do stuff
-
```
### Trait
@@ -193,7 +209,6 @@ like a glorified Attribute.
> obj.traits.mytrait.value = "stringvalue"
> obj.traits.mytrait.value
"stringvalue"
-
```
### Static trait
@@ -217,7 +232,6 @@ that varies slowly or not at all, and which may be modified in-place.
> obj.traits.mytrait.mod = 0
> obj.traits.mytrait.value
12
-
```
### Counter
@@ -253,8 +267,6 @@ remove it. A suggested use for a Counter Trait would be to track skill values.
# for TraitProperties, pass the args/kwargs of traits.add() to the
# TraitProperty constructor instead.
-
-
```
Counters have some extra properties:
@@ -286,7 +298,6 @@ By calling `.desc()` on the Counter, you will get the text matching the current
> obj.traits.hunting.desc()
"expert"
-
```
#### .rate
@@ -327,12 +338,10 @@ a previous value.
71 # we have stopped at the ratetarget
> obj.traits.hunting.rate = 0 # disable auto-change
-
-
```
Note that when retrieving the `current`, the result will always be of the same
type as the `.base` even `rate` is a non-integer value. So if `base` is an `int`
-(default)`, the `current` value will also be rounded the closest full integer.
+(default), the `current` value will also be rounded the closest full integer.
If you want to see the exact `current` value, set `base` to a float - you
will then need to use `round()` yourself on the result if you want integers.
@@ -347,7 +356,6 @@ return the value as a percentage.
> obj.traits.hunting.percent(formatting=None)
71.0
-
```
### Gauge
@@ -379,7 +387,6 @@ stamina and the like.
> obj.traits.hp.current -= 30
> obj.traits.hp.value
80
-
```
The Gauge trait is subclass of the Counter, so you have access to the same
@@ -412,8 +419,6 @@ class RageTrait(StaticTrait):
def sedate(self):
self.mod = 0
-
-
```
Above is an example custom-trait-class "rage" that stores a property "rage" on
@@ -432,12 +437,24 @@ Reload the server and you should now be able to use your trait:
> obj.traits.add("mood", "A dark mood", rage=30, trait_type='rage')
> obj.traits.mood.rage
30
+```
+
+Remember that you can use `.get_trait("name")` to access other traits on the
+same handler. Let's say that the rage modifier is actually limited by
+the characters's current STR value times 3, with a max of 100:
+
+```python
+class RageTrait(StaticTrait):
+ #...
+ def berserk(self):
+ self.mod = min(100, self.get_trait("STR").value * 3)
+```
# as TraitProperty
+```
class Character(DefaultCharacter):
rage = TraitProperty("A dark mood", rage=30, trait_type='rage')
-
```
## Adding additional TraitHandlers
@@ -459,7 +476,7 @@ class Character(DefaultCharacter):
def traits(self):
# this adds the handler as .traits
return TraitHandler(self)
-
+
@lazy_property
def stats(self):
# this adds the handler as .stats
@@ -479,6 +496,9 @@ class Character(DefaultCharacter):
base=10, mod=1, min=0, max=100)
```
+> Rememebr that the `.get_traits()` method only works for accessing Traits within the
+_same_ TraitHandler.
+
----
diff --git a/docs/latest/_sources/Contribs/Contribs-Overview.md.txt b/docs/latest/_sources/Contribs/Contribs-Overview.md.txt
index f19fb61548..f1d7308eaf 100644
--- a/docs/latest/_sources/Contribs/Contribs-Overview.md.txt
+++ b/docs/latest/_sources/Contribs/Contribs-Overview.md.txt
@@ -654,7 +654,7 @@ _Contribution by Griatch 2020, based on code by Whitenoise and Ainneve contribs,
A `Trait` represents a modifiable property on (usually) a Character. They can
be used to represent everything from attributes (str, agi etc) to skills
-(hunting 10, swords 14 etc) and dynamically changing things like HP, XP etc.
+(hunting 10, swords 14 etc) and dynamically changing things like HP, XP etc.
Traits differ from normal Attributes in that they track their changes and limit
themselves to particular value-ranges. One can add/subtract from them easily and
they can even change dynamically at a particular rate (like you being poisoned or
diff --git a/docs/latest/api/evennia.commands.default.account.html b/docs/latest/api/evennia.commands.default.account.html
index 8daf6e14d2..b87d5b9fb8 100644
--- a/docs/latest/api/evennia.commands.default.account.html
+++ b/docs/latest/api/evennia.commands.default.account.html
@@ -147,7 +147,7 @@ method. Otherwise all text will be returned to all connected sessions.
-
-
aliases = ['ls', 'l']¶
+aliases = ['l', 'ls']¶
@@ -178,7 +178,7 @@ method. Otherwise all text will be returned to all connected sessions.
-
-
search_index_entry = {'aliases': 'ls l', 'category': 'general', 'key': 'look', 'no_prefix': ' ls l', 'tags': '', 'text': '\n look while out-of-character\n\n Usage:\n look\n\n Look in the ooc state.\n '}¶
+search_index_entry = {'aliases': 'l ls', 'category': 'general', 'key': 'look', 'no_prefix': ' l ls', 'tags': '', 'text': '\n look while out-of-character\n\n Usage:\n look\n\n Look in the ooc state.\n '}¶
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.
-
-
aliases = ['batchcommand', 'batchcmd']¶
+aliases = ['batchcmd', 'batchcommand']¶
@@ -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 15e6df614f..36b6af54d4 100644
--- a/docs/latest/api/evennia.commands.default.building.html
+++ b/docs/latest/api/evennia.commands.default.building.html
@@ -1415,7 +1415,7 @@ server settings.
-
-
aliases = ['@typeclasses', '@parent', '@swap', '@update', '@type']¶
+aliases = ['@update', '@swap', '@parent', '@typeclasses', '@type']¶
@@ -1446,7 +1446,7 @@ server settings.
-
-
search_index_entry = {'aliases': '@typeclasses @parent @swap @update @type', 'category': 'building', 'key': '@typeclass', 'no_prefix': 'typeclass typeclasses parent swap update 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 "}¶
+search_index_entry = {'aliases': '@update @swap @parent @typeclasses @type', 'category': 'building', 'key': '@typeclass', 'no_prefix': 'typeclass update swap parent typeclasses 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 "}¶
@@ -1908,7 +1908,7 @@ one is given.
-
-
aliases = ['@locate', '@search']¶
+aliases = ['@search', '@locate']¶
@@ -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.general.html b/docs/latest/api/evennia.commands.default.general.html
index 91d219b181..b49ff4bd75 100644
--- a/docs/latest/api/evennia.commands.default.general.html
+++ b/docs/latest/api/evennia.commands.default.general.html
@@ -189,7 +189,7 @@ look *<account&g
-
-
aliases = ['ls', 'l']¶
+aliases = ['l', 'ls']¶
@@ -220,7 +220,7 @@ look *<account&g
-
-
search_index_entry = {'aliases': 'ls l', 'category': 'general', 'key': 'look', 'no_prefix': ' ls l', 'tags': '', 'text': '\n look at location or object\n\n Usage:\n look\n look <obj>\n look *<account>\n\n Observes your location or objects in your vicinity.\n '}¶
+search_index_entry = {'aliases': 'l ls', 'category': 'general', 'key': 'look', 'no_prefix': ' l ls', 'tags': '', 'text': '\n look at location or object\n\n Usage:\n look\n look <obj>\n look *<account>\n\n Observes your location or objects in your vicinity.\n '}¶
@@ -337,7 +337,7 @@ inv
-
-
aliases = ['inv', 'i']¶
+aliases = ['i', '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 '}¶
@@ -611,7 +611,7 @@ placing it in their inventory.
-
-
aliases = ["'", '"']¶
+aliases = ['"', "'"]¶
@@ -642,7 +642,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 '}¶
diff --git a/docs/latest/api/evennia.commands.default.system.html b/docs/latest/api/evennia.commands.default.system.html
index 196b1c1736..d02b7cfcc2 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
-
-
aliases = ['@delays', '@task']¶
+aliases = ['@task', '@delays']¶
@@ -743,7 +743,7 @@ to all the variables defined therein.
-
-
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 "}¶
+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 "}¶
diff --git a/docs/latest/api/evennia.commands.default.tests.html b/docs/latest/api/evennia.commands.default.tests.html
index bbf80488d0..b3919099df 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/tmplkg5ak94/45a1cb80e181551a293f7ef86ede21c50060d78c/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 7f6134fed6..04060e8ff1 100644
--- a/docs/latest/api/evennia.commands.default.unloggedin.html
+++ b/docs/latest/api/evennia.commands.default.unloggedin.html
@@ -355,7 +355,7 @@ for simplicity. It shows a pane of info.
-
-
aliases = ['?', 'h']¶
+aliases = ['h', '?']¶
@@ -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 bc25031265..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
@@ -355,7 +355,7 @@ for simplicity. It shows a pane of info.
-
-
aliases = ['?', 'h']¶
+aliases = ['h', '?']¶
@@ -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 c003ff99f6..3371789320 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 @@
-
-
aliases = ['@calls', '@callback', '@callbacks']¶
+aliases = ['@callback', '@calls', '@callbacks']¶
@@ -211,7 +211,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': '@callback @calls @callbacks', 'category': 'building', 'key': '@call', 'no_prefix': 'call callback calls callbacks', 'tags': '', 'text': '\n Command to edit callbacks.\n '}¶
diff --git a/docs/latest/api/evennia.contrib.base_systems.ingame_reports.reports.html b/docs/latest/api/evennia.contrib.base_systems.ingame_reports.reports.html
index 609783cc86..0e21045dc4 100644
--- a/docs/latest/api/evennia.contrib.base_systems.ingame_reports.reports.html
+++ b/docs/latest/api/evennia.contrib.base_systems.ingame_reports.reports.html
@@ -174,7 +174,7 @@ players
-
-
aliases = ['manage bugs', 'manage ideas', 'manage players']¶
+aliases = ['manage players', 'manage ideas', 'manage bugs']¶
@@ -208,7 +208,7 @@ to all the variables defined therein.
-
-
search_index_entry = {'aliases': 'manage bugs manage ideas manage players', 'category': 'general', 'key': 'manage reports', 'no_prefix': ' manage bugs manage ideas manage players', 'tags': '', 'text': '\n manage the various reports\n\n Usage:\n manage [report type]\n\n Available report types:\n bugs\n ideas\n players\n\n Initializes a menu for reviewing and changing the status of current reports.\n '}¶
+search_index_entry = {'aliases': 'manage players manage ideas manage bugs', 'category': 'general', 'key': 'manage reports', 'no_prefix': ' manage players manage ideas manage bugs', 'tags': '', 'text': '\n manage the various reports\n\n Usage:\n manage [report type]\n\n Available report types:\n bugs\n ideas\n players\n\n Initializes a menu for reviewing and changing the status of current reports.\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 0e3e0ae9e2..195e26c841 100644
--- a/docs/latest/api/evennia.contrib.full_systems.evscaperoom.commands.html
+++ b/docs/latest/api/evennia.contrib.full_systems.evscaperoom.commands.html
@@ -225,7 +225,7 @@ the operation will be general or on the room.
-
-
aliases = ['quit', 'abort', 'q', 'chicken out']¶
+aliases = ['q', 'quit', 'chicken out', 'abort']¶
@@ -249,7 +249,7 @@ set in self.parse())
-
-
search_index_entry = {'aliases': 'quit abort q chicken out', 'category': 'evscaperoom', 'key': 'give up', 'no_prefix': ' quit abort q 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': 'q quit chicken out abort', 'category': 'evscaperoom', 'key': 'give up', 'no_prefix': ' q quit chicken out abort', '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 '}¶
@@ -270,7 +270,7 @@ set in self.parse())
-
-
aliases = ['ls', 'l']¶
+aliases = ['l', 'ls']¶
@@ -304,7 +304,7 @@ set in self.parse())
-
-
search_index_entry = {'aliases': 'ls l', 'category': 'evscaperoom', 'key': 'look', 'no_prefix': ' ls l', 'tags': '', 'text': '\n Look at the room, an object or the currently focused object\n\n Usage:\n look [obj]\n\n '}¶
+search_index_entry = {'aliases': 'l ls', 'category': 'evscaperoom', 'key': 'look', 'no_prefix': ' l ls', 'tags': '', 'text': '\n Look at the room, an object or the currently focused object\n\n Usage:\n look [obj]\n\n '}¶
@@ -385,7 +385,7 @@ shout
-
-
aliases = ['whisper', ';', 'shout']¶
+aliases = [';', 'shout', 'whisper']¶
@@ -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 '}¶
@@ -442,7 +442,7 @@ emote /me points to /box and /lever.
-
-
aliases = [':', 'pose']¶
+aliases = ['pose', ':']¶
@@ -481,7 +481,7 @@ set in self.parse())
-
-
search_index_entry = {'aliases': ': pose', 'category': 'general', 'key': 'emote', 'no_prefix': ' : pose', 'tags': '', 'text': '\n Perform a free-form emote. Use /me to\n include yourself in the emote and /name\n to include other objects or characters.\n Use "..." to enact speech.\n\n Usage:\n emote <emote>\n :<emote\n\n Example:\n emote /me smiles at /peter\n emote /me points to /box and /lever.\n\n '}¶
+search_index_entry = {'aliases': 'pose :', 'category': 'general', 'key': 'emote', 'no_prefix': ' pose :', 'tags': '', 'text': '\n Perform a free-form emote. Use /me to\n include yourself in the emote and /name\n to include other objects or characters.\n Use "..." to enact speech.\n\n Usage:\n emote <emote>\n :<emote\n\n Example:\n emote /me smiles at /peter\n emote /me points to /box and /lever.\n\n '}¶
@@ -504,7 +504,7 @@ looks and what actions is available.
-
-
aliases = ['ex', 'unfocus', 'e', 'examine']¶
+aliases = ['examine', 'ex', 'e', 'unfocus']¶
@@ -533,7 +533,7 @@ set in self.parse())
-
-
search_index_entry = {'aliases': 'ex unfocus e examine', 'category': 'evscaperoom', 'key': 'focus', 'no_prefix': ' ex unfocus e 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 '}¶
+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 '}¶
@@ -595,7 +595,7 @@ set in self.parse())
-
-
aliases = ['inv', 'i', 'give', 'inventory']¶
+aliases = ['give', 'inventory', 'i', 'inv']¶
@@ -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': 'give inventory i inv', 'category': 'evscaperoom', 'key': 'get', 'no_prefix': ' give inventory i inv', 'tags': '', 'text': '\n Use focus / examine instead.\n\n '}¶
diff --git a/docs/latest/api/evennia.contrib.game_systems.achievements.achievements.html b/docs/latest/api/evennia.contrib.game_systems.achievements.achievements.html
index cbe051aa3d..2e8ab78baa 100644
--- a/docs/latest/api/evennia.contrib.game_systems.achievements.achievements.html
+++ b/docs/latest/api/evennia.contrib.game_systems.achievements.achievements.html
@@ -289,7 +289,7 @@ achievements/progress rats
-
-
aliases = ['achievement', 'achieve', 'achieves']¶
+aliases = ['achievement', 'achieves', 'achieve']¶
@@ -337,7 +337,7 @@ to all the variables defined therein.
-
-
search_index_entry = {'aliases': 'achievement achieve achieves', 'category': 'general', 'key': 'achievements', 'no_prefix': ' achievement achieve achieves', 'tags': '', 'text': '\n view achievements\n\n Usage:\n achievements[/switches] [args]\n\n Switches:\n all View all achievements, including locked ones.\n completed View achievements you\'ve completed.\n progress View achievements you have partially completed\n\n Check your achievement statuses or browse the list. Providing a command argument\n will search all your currently unlocked achievements for matches, and the switches\n will filter the list to something other than "all unlocked". Combining a command\n argument with a switch will search only in that list.\n\n Examples:\n achievements apples\n achievements/all\n achievements/progress rats\n '}¶
+search_index_entry = {'aliases': 'achievement achieves achieve', 'category': 'general', 'key': 'achievements', 'no_prefix': ' achievement achieves achieve', 'tags': '', 'text': '\n view achievements\n\n Usage:\n achievements[/switches] [args]\n\n Switches:\n all View all achievements, including locked ones.\n completed View achievements you\'ve completed.\n progress View achievements you have partially completed\n\n Check your achievement statuses or browse the list. Providing a command argument\n will search all your currently unlocked achievements for matches, and the switches\n will filter the list to something other than "all unlocked". Combining a command\n argument with a switch will search only in that list.\n\n Examples:\n achievements apples\n achievements/all\n achievements/progress rats\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 180d50f58c..995664a60e 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.
-
-
aliases = ['offers', 'deal']¶
+aliases = ['deal', 'offers']¶
@@ -785,7 +785,7 @@ try to influence the other part in the deal.
-
-
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 "}¶
+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 "}¶
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
-
-
aliases = ['inv', 'i']¶
+aliases = ['i', '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 c662d4ed02..9dd6a535f0 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.
-
-
aliases = ['wait', 'hold']¶
+aliases = ['hold', 'wait']¶
@@ -712,7 +712,7 @@ if there are still any actions you can take.
-
-
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 '}¶
+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 '}¶
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 b43d0f5a48..0bed424fda 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.
-
-
aliases = ['wait', 'hold']¶
+aliases = ['hold', 'wait']¶
@@ -601,7 +601,7 @@ if there are still any actions you can take.
-
-
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 '}¶
+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 '}¶
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 1e2a340556..9b7607f915 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.
-
-
aliases = ['wait', 'hold']¶
+aliases = ['hold', 'wait']¶
@@ -724,7 +724,7 @@ if there are still any actions you can take.
-
-
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 '}¶
+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 '}¶
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 62ecd7c88e..0f29530eac 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.
-
-
aliases = ['wait', 'hold']¶
+aliases = ['hold', 'wait']¶
@@ -503,7 +503,7 @@ if there are still any actions you can take.
-
-
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 '}¶
+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 '}¶
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 66eedd87ae..d06a19f299 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.
-
-
aliases = ['wait', 'hold']¶
+aliases = ['hold', 'wait']¶
@@ -963,7 +963,7 @@ if there are still any actions you can take.
-
-
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 '}¶
+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 '}¶
diff --git a/docs/latest/api/evennia.contrib.grid.extended_room.extended_room.html b/docs/latest/api/evennia.contrib.grid.extended_room.extended_room.html
index 3f01341f75..712938071f 100644
--- a/docs/latest/api/evennia.contrib.grid.extended_room.extended_room.html
+++ b/docs/latest/api/evennia.contrib.grid.extended_room.extended_room.html
@@ -657,7 +657,7 @@ look *<account&g
-
-
aliases = ['ls', 'l']¶
+aliases = ['l', 'ls']¶
@@ -677,7 +677,7 @@ look *<account&g
-
-
search_index_entry = {'aliases': 'ls l', 'category': 'general', 'key': 'look', 'no_prefix': ' ls l', 'tags': '', 'text': '\n look\n\n Usage:\n look\n look <obj>\n look <room detail>\n look *<account>\n\n Observes your location, details at your location or objects in your vicinity.\n '}¶
+search_index_entry = {'aliases': 'l ls', 'category': 'general', 'key': 'look', 'no_prefix': ' l ls', 'tags': '', 'text': '\n look\n\n Usage:\n look\n look <obj>\n look <room detail>\n look *<account>\n\n Observes your location, details at your location or objects in your vicinity.\n '}¶
diff --git a/docs/latest/api/evennia.contrib.grid.xyzgrid.commands.html b/docs/latest/api/evennia.contrib.grid.xyzgrid.commands.html
index f6516a49a8..fd3910210f 100644
--- a/docs/latest/api/evennia.contrib.grid.xyzgrid.commands.html
+++ b/docs/latest/api/evennia.contrib.grid.xyzgrid.commands.html
@@ -436,7 +436,7 @@ there is no room above/below you, your movement will fail.
-
-
aliases = ['dive', 'fly']¶
+aliases = ['fly', 'dive']¶
@@ -459,7 +459,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/latest/api/evennia.contrib.rpg.dice.dice.html b/docs/latest/api/evennia.contrib.rpg.dice.dice.html
index 3d7ee8d157..fad4cb5e02 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.
-
-
aliases = ['@dice', 'roll']¶
+aliases = ['roll', '@dice']¶
@@ -366,7 +366,7 @@ everyone but the person rolling.
-
-
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 "}¶
+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 "}¶
diff --git a/docs/latest/api/evennia.contrib.rpg.rpsystem.rpsystem.html b/docs/latest/api/evennia.contrib.rpg.rpsystem.rpsystem.html
index c634d4dadb..97a20164de 100644
--- a/docs/latest/api/evennia.contrib.rpg.rpsystem.rpsystem.html
+++ b/docs/latest/api/evennia.contrib.rpg.rpsystem.rpsystem.html
@@ -736,7 +736,7 @@ commands the caller can use.
-
-
aliases = ["'", '"']¶
+aliases = ['"', "'"]¶
@@ -767,7 +767,7 @@ commands the caller can use.
-
-
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 '}¶
@@ -908,7 +908,7 @@ Using the command without arguments will list all current recogs.
-
-
aliases = ['forget', 'recognize']¶
+aliases = ['recognize', 'forget']¶
@@ -935,7 +935,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/latest/api/evennia.contrib.tutorials.evadventure.combat_twitch.html b/docs/latest/api/evennia.contrib.tutorials.evadventure.combat_twitch.html
index b4a3e80767..439688cc0f 100644
--- a/docs/latest/api/evennia.contrib.tutorials.evadventure.combat_twitch.html
+++ b/docs/latest/api/evennia.contrib.tutorials.evadventure.combat_twitch.html
@@ -395,7 +395,7 @@ look *<account&g
-
-
aliases = ['ls', 'l']¶
+aliases = ['l', 'ls']¶
@@ -415,7 +415,7 @@ look *<account&g
-
-
search_index_entry = {'aliases': 'ls l', 'category': 'general', 'key': 'look', 'no_prefix': ' ls l', 'tags': '', 'text': '\n look at location or object\n\n Usage:\n look\n look <obj>\n look *<account>\n\n Observes your location or objects in your vicinity.\n '}¶
+search_index_entry = {'aliases': 'l ls', 'category': 'general', 'key': 'look', 'no_prefix': ' l ls', 'tags': '', 'text': '\n look at location or object\n\n Usage:\n look\n look <obj>\n look *<account>\n\n Observes your location or objects in your vicinity.\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..6e54a30a6b 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).
-
-
aliases = ['inv', 'i']¶
+aliases = ['i', 'inv']¶
@@ -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 '}¶
@@ -307,7 +307,7 @@ unwear <item>
-
-
aliases = ['unwear', 'unwield']¶
+aliases = ['unwield', 'unwear']¶
@@ -331,7 +331,7 @@ set in self.parse())
-
-
search_index_entry = {'aliases': 'unwear unwield', 'category': 'general', 'key': 'remove', 'no_prefix': ' unwear unwield', 'tags': '', 'text': '\n Remove a remove a weapon/shield, armor or helmet.\n\n Usage:\n remove <item>\n unwield <item>\n unwear <item>\n\n To remove an item from the backpack, use |wdrop|n instead.\n\n '}¶
+search_index_entry = {'aliases': 'unwield unwear', 'category': 'general', 'key': 'remove', 'no_prefix': ' unwield unwear', 'tags': '', 'text': '\n Remove a remove a weapon/shield, armor or helmet.\n\n Usage:\n remove <item>\n unwield <item>\n unwear <item>\n\n To remove an item from the backpack, use |wdrop|n instead.\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 9834c92a80..c75f99d7f4 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', 'press button', 'push']¶
@@ -196,7 +196,7 @@ check if the lid is open or closed.
+search_index_entry = {'aliases': 'press press button push', 'category': 'general', 'key': 'push button', 'no_prefix': ' press press button push', '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', 'press button', 'push']¶
@@ -422,7 +422,7 @@ set in self.parse())
+search_index_entry = {'aliases': 'press press button push', 'category': 'general', 'key': 'push button', 'no_prefix': ' press press button push', 'tags': '', 'text': '\n Push the red button\n\n Usage:\n push button\n\n '}¶
@@ -520,7 +520,7 @@ be mutually exclusive.
+aliases = ['ex', 'get', 'l', 'listen', 'feel', 'examine']¶
@@ -546,7 +546,7 @@ be mutually exclusive.
+search_index_entry = {'aliases': 'ex get l listen feel examine', 'category': 'general', 'key': 'look', 'no_prefix': ' ex get l listen feel examine', '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 b540493e3c..d608846cd4 100644
--- a/docs/latest/api/evennia.contrib.tutorials.tutorial_world.objects.html
+++ b/docs/latest/api/evennia.contrib.tutorials.tutorial_world.objects.html
@@ -439,7 +439,7 @@ of the object. We overload it with our own version.
-
-
aliases = ['burn', 'light']¶
+aliases = ['light', 'burn']¶
@@ -466,7 +466,7 @@ to sit on a “lightable” object, we operate only on self.obj.
-
-
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 '}¶
+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 '}¶
@@ -570,7 +570,7 @@ shift green root up/down
-
-
aliases = ['pull', 'move', 'shiftroot', 'push']¶
+aliases = ['move', 'pull', 'shiftroot', 'push']¶
@@ -606,7 +606,7 @@ yellow/green - horizontal roots
-
-
search_index_entry = {'aliases': 'pull move shiftroot push', 'category': 'tutorialworld', 'key': 'shift', 'no_prefix': ' pull move shiftroot push', '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 pull shiftroot push', 'category': 'tutorialworld', 'key': 'shift', 'no_prefix': ' move pull shiftroot push', '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 '}¶
@@ -793,7 +793,7 @@ parry - forgoes your attack but will make you harder to hit on next
-
-
aliases = ['hit', 'pierce', 'defend', 'fight', 'stab', 'parry', 'bash', 'thrust', 'kill', 'chop', 'slash']¶
+aliases = ['parry', 'defend', 'slash', 'bash', 'fight', 'chop', 'thrust', 'hit', 'pierce', 'stab', 'kill']¶
@@ -819,7 +819,7 @@ parry - forgoes your attack but will make you harder to hit on next
-
-
search_index_entry = {'aliases': 'hit pierce defend fight stab parry bash thrust kill chop slash', 'category': 'tutorialworld', 'key': 'attack', 'no_prefix': ' hit pierce defend fight stab parry bash thrust kill chop slash', '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': 'parry defend slash bash fight chop thrust hit pierce stab kill', 'category': 'tutorialworld', 'key': 'attack', 'no_prefix': ' parry defend slash bash fight chop thrust hit pierce stab kill', '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 fd8174201f..97239179e9 100644
--- a/docs/latest/api/evennia.contrib.tutorials.tutorial_world.rooms.html
+++ b/docs/latest/api/evennia.contrib.tutorials.tutorial_world.rooms.html
@@ -262,7 +262,7 @@ code except for adding in the details.
-
-
aliases = ['ls', 'l']¶
+aliases = ['l', 'ls']¶
@@ -277,7 +277,7 @@ code except for adding in the details.
-
-
search_index_entry = {'aliases': 'ls l', 'category': 'tutorialworld', 'key': 'look', 'no_prefix': ' ls l', 'tags': '', 'text': '\n looks at the room and on details\n\n Usage:\n look <obj>\n look <room detail>\n look *<account>\n\n Observes your location, details at your location or objects\n in your vicinity.\n\n Tutorial: This is a child of the default Look command, that also\n allows us to look at "details" in the room. These details are\n things to examine and offers some extra description without\n actually having to be actual database objects. It uses the\n return_detail() hook on TutorialRooms for this.\n '}¶
+search_index_entry = {'aliases': 'l ls', 'category': 'tutorialworld', 'key': 'look', 'no_prefix': ' l ls', 'tags': '', 'text': '\n looks at the room and on details\n\n Usage:\n look <obj>\n look <room detail>\n look *<account>\n\n Observes your location, details at your location or objects\n in your vicinity.\n\n Tutorial: This is a child of the default Look command, that also\n allows us to look at "details" in the room. These details are\n things to examine and offers some extra description without\n actually having to be actual database objects. It uses the\n return_detail() hook on TutorialRooms for this.\n '}¶
@@ -830,7 +830,7 @@ if they fall off the bridge.
-
-
aliases = ['?', 'h']¶
+aliases = ['h', '?']¶
@@ -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', 'search', 'feel around', 'fiddle', 'feel']¶
+aliases = ['l', 'feel around', 'feel', 'search', 'fiddle']¶
@@ -1010,7 +1010,7 @@ random chance of eventually finding a light source.
-
-
search_index_entry = {'aliases': 'l search feel around fiddle feel', 'category': 'tutorialworld', 'key': 'look', 'no_prefix': ' l search feel around fiddle 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': 'l feel around feel search fiddle', 'category': 'tutorialworld', 'key': 'look', 'no_prefix': ' l feel around feel search 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 '}¶
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 585ea264de..faf9fcb2f6 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/tmpfzlz0eh2/7a7479955fbda8774819dac8b021ec30ab6d13ed/evennia'¶
+directory = '/tmp/tmplkg5ak94/45a1cb80e181551a293f7ef86ede21c50060d78c/evennia'¶
@@ -283,7 +283,7 @@ git pull - Pull the latest code from your current branch.
-
-
directory = '/tmp/tmpfzlz0eh2/7a7479955fbda8774819dac8b021ec30ab6d13ed/evennia/game_template'¶
+directory = '/tmp/tmplkg5ak94/45a1cb80e181551a293f7ef86ede21c50060d78c/evennia/game_template'¶
diff --git a/docs/latest/api/evennia.utils.eveditor.html b/docs/latest/api/evennia.utils.eveditor.html
index 1fe80bd058..991cc0fe59 100644
--- a/docs/latest/api/evennia.utils.eveditor.html
+++ b/docs/latest/api/evennia.utils.eveditor.html
@@ -356,7 +356,7 @@ indentation.
-
-
aliases = [':fd', ':<', ':>', ':I', ':S', ':h', ':x', ':=', ':DD', ':s', ':y', ':q!', ':i', ':A', ':::', ':uu', ':', ':q', ':j', ':!', ':wq', ':r', ':f', ':dw', ':dd', ':fi', '::', ':echo', ':u', ':w', ':UU', ':p']¶
+aliases = [':<', ':fi', ':r', ':!', ':y', ':u', ':j', ':q', ':s', ':>', ':p', ':uu', ':I', ':i', '::', ':q!', ':UU', ':echo', ':dw', ':', ':w', ':A', ':f', ':h', ':fd', ':S', ':::', ':DD', ':dd', ':x', ':=', ':wq']¶
@@ -384,7 +384,7 @@ efficient presentation.
-
-
search_index_entry = {'aliases': ':fd :< :> :I :S :h :x := :DD :s :y :q! :i :A ::: :uu : :q :j :! :wq :r :f :dw :dd :fi :: :echo :u :w :UU :p', 'category': 'general', 'key': ':editor_command_group', 'no_prefix': ' :fd :< :> :I :S :h :x := :DD :s :y :q! :i :A ::: :uu : :q :j :! :wq :r :f :dw :dd :fi :: :echo :u :w :UU :p', 'tags': '', 'text': '\n Commands for the editor\n '}¶
+search_index_entry = {'aliases': ':< :fi :r :! :y :u :j :q :s :> :p :uu :I :i :: :q! :UU :echo :dw : :w :A :f :h :fd :S ::: :DD :dd :x := :wq', 'category': 'general', 'key': ':editor_command_group', 'no_prefix': ' :< :fi :r :! :y :u :j :q :s :> :p :uu :I :i :: :q! :UU :echo :dw : :w :A :f :h :fd :S ::: :DD :dd :x := :wq', '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 5976c004f6..11df77f010 100644
--- a/docs/latest/api/evennia.utils.evmenu.html
+++ b/docs/latest/api/evennia.utils.evmenu.html
@@ -955,7 +955,7 @@ single question.
+aliases = ['yes', '__nomatch_command', 'y', 'a', 'n', 'no', 'abort']¶
@@ -981,7 +981,7 @@ single question.
+search_index_entry = {'aliases': 'yes __nomatch_command y a n no abort', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' yes __nomatch_command y a n no 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 73cd7abd98..a994a16347 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', 'q', 'previous', 'n', 'e', 'next', 't', 'end', 'p', 'quit', 'a', 'abort']¶
+aliases = ['end', 'quit', 'previous', 'q', 'e', 'a', 't', 'top', 'n', 'next', 'p', 'abort']¶
@@ -177,7 +177,7 @@ the caller.msg() construct every time the page is updated.
-
-
search_index_entry = {'aliases': 'top q previous n e next t end p quit a abort', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' top q previous n e next t end p quit a abort', 'tags': '', 'text': '\n Manipulate the text paging. Catch no-input with aliases.\n '}¶
+search_index_entry = {'aliases': 'end quit previous q e a t top n next p abort', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' end quit previous q e a t top n next p abort', '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 b1d4e8ef78..700fab631c 100644
--- a/docs/latest/index.html
+++ b/docs/latest/index.html
@@ -551,6 +551,7 @@
Large Language Model (“Chat-bot AI”) integration
Roleplaying base system for Evennia
Traits
+as TraitProperty
buffs
character_creator
dice
diff --git a/docs/latest/objects.inv b/docs/latest/objects.inv
index 0fb558f5ea2374a36185cfb5a6b7d07a46ff2f6b..1297a90ead273575d48848bbe5bbcf864f6b9083 100644
GIT binary patch
delta 85500
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
BEVj6M;4h>-`znz6nqE%2-7
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