From 6e0d918c47fec8a74e1391778d1bdcdeba820308 Mon Sep 17 00:00:00 2001
From: Evennia docbuilder action
Date: Fri, 8 Mar 2024 08:07:29 +0000
Subject: [PATCH] Updated HTML docs.
---
docs/latest/.buildinfo | 2 +-
docs/latest/Coding/Changelog.html | 10 +
docs/latest/Coding/Coding-Overview.html | 1 +
.../Beginner-Tutorial-Overview.html | 8 +-
.../Beginner-Tutorial-Part3-Overview.html | 14 +-
.../Part3/Beginner-Tutorial-Rules.html | 8 +-
.../Part3/Beginner-Tutorial-Utilities.html | 163 ++++++++--------
.../evennia/scripts/ondemandhandler.html | 103 +++++++++-
docs/latest/_sources/Coding/Changelog.md.txt | 7 +
.../Part3/Beginner-Tutorial-Utilities.md.txt | 181 +++++++++---------
.../api/evennia.commands.default.account.html | 4 +-
.../evennia.commands.default.building.html | 8 +-
.../api/evennia.commands.default.comms.html | 8 +-
.../api/evennia.commands.default.general.html | 4 +-
.../api/evennia.commands.default.system.html | 4 +-
.../api/evennia.commands.default.tests.html | 2 +-
.../evennia.commands.default.unloggedin.html | 20 +-
....base_systems.email_login.email_login.html | 20 +-
...systems.mux_comms_cmds.mux_comms_cmds.html | 4 +-
...rib.full_systems.evscaperoom.commands.html | 20 +-
...ia.contrib.game_systems.barter.barter.html | 4 +-
...trib.grid.extended_room.extended_room.html | 4 +-
...evennia.contrib.grid.xyzgrid.commands.html | 4 +-
...evennia.contrib.rpg.rpsystem.rpsystem.html | 4 +-
...b.tutorials.evadventure.combat_twitch.html | 8 +-
...ntrib.tutorials.red_button.red_button.html | 16 +-
...trib.tutorials.tutorial_world.objects.html | 16 +-
...ontrib.tutorials.tutorial_world.rooms.html | 12 +-
...utils.git_integration.git_integration.html | 4 +-
.../api/evennia.scripts.ondemandhandler.html | 84 ++++++++
docs/latest/api/evennia.utils.eveditor.html | 4 +-
docs/latest/api/evennia.utils.evmenu.html | 4 +-
docs/latest/api/evennia.utils.evmore.html | 4 +-
docs/latest/genindex.html | 12 ++
docs/latest/objects.inv | Bin 166713 -> 166788 bytes
docs/latest/searchindex.js | 2 +-
36 files changed, 492 insertions(+), 281 deletions(-)
diff --git a/docs/latest/.buildinfo b/docs/latest/.buildinfo
index 309b5fcda0..8bb0ff0243 100644
--- a/docs/latest/.buildinfo
+++ b/docs/latest/.buildinfo
@@ -1,4 +1,4 @@
# Sphinx build info version 1
# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
-config: c427203c7f1ab55e799030b3c9ea17d2
+config: 2a731986fc5984aa7215a4df34e6a035
tags: 645f666f9bcd5a90fca523b33c5a78b7
diff --git a/docs/latest/Coding/Changelog.html b/docs/latest/Coding/Changelog.html
index 280a2453f2..7f7c4e7ef5 100644
--- a/docs/latest/Coding/Changelog.html
+++ b/docs/latest/Coding/Changelog.html
@@ -66,6 +66,7 @@
- Changelog
+- Evennia Main branch
- Evennia 3.2.0
- Evennia 3.1.1
- Evennia 3.1.0
@@ -190,6 +191,15 @@
Changelog
+
+Evennia Main branch
+
+Feature: Add ON_DEMAND_HANDLER.set_dt(key, category, dt) and
+.set_stage(key, category, stage) to allow manual tweaking of task timings,
+for example for a spell speeding a plant’s growth. (Griatch)
+Fix: Resolve a bug when loading on-demand-handler data from database.
+
+
Evennia 3.2.0
Feb 25, 2024
diff --git a/docs/latest/Coding/Coding-Overview.html b/docs/latest/Coding/Coding-Overview.html
index 40901a70e0..e1cd4f1bcf 100644
--- a/docs/latest/Coding/Coding-Overview.html
+++ b/docs/latest/Coding/Coding-Overview.html
@@ -174,6 +174,7 @@ make your game, also if you never coded before.
- Changelog
+- Evennia Main branch
- Evennia 3.2.0
- Evennia 3.1.1
- Evennia 3.1.0
diff --git a/docs/latest/Howtos/Beginner-Tutorial/Beginner-Tutorial-Overview.html b/docs/latest/Howtos/Beginner-Tutorial/Beginner-Tutorial-Overview.html
index cdbcb27ea5..246e7f036c 100644
--- a/docs/latest/Howtos/Beginner-Tutorial/Beginner-Tutorial-Overview.html
+++ b/docs/latest/Howtos/Beginner-Tutorial/Beginner-Tutorial-Overview.html
@@ -467,12 +467,12 @@ Click here to see the full index of all parts and lessons of the Beginner-Tutori
- Part 3: How We Get There (Example Game)
[docs] def save(self):
"""
@@ -610,6 +658,30 @@
task = self.get(key, category)
return task.get_dt() if task else None
+[docs] def set_dt(self, key, category, dt):
+
"""
+
Set the time-delta since the task started manually. This allows you to 'cheat' the system
+
and set the time manually. This is useful for testing or when a system manipulates the state
+
somehow (like using a potion that speeds up the growth of a plant).
+
+
Args:
+
key (str, callable, OnDemandTask or Object): The unique identifier for the task. If a
+
callable, will be called without arguments. If an Object, will be converted to a string.
+
If an `OnDemandTask`, then all other arguments are ignored and the task will be used
+
to identify the task to set the time-delta for.
+
category (str, optional): The category of the task.
+
dt (int): The time-delta to set. This is an absolute value in seconds, same as returned
+
by `get_dt`.
+
+
Notes:
+
Setting this will not on its own trigger any stage functions - this will only happen
+
as normal, next time the state is checked and the stage is found to have changed.
+
+
"""
+
task = self.get(key, category)
+
if task:
+
task.set_dt(dt)
+
[docs] def get_stage(self, key, category=None):
"""
Get the current stage of an on-demand task.
@@ -625,7 +697,32 @@
"""
task = self.get(key, category)
-
return task.get_stage() if task else None
+ return task.get_stage() if task else None
+
+[docs] def set_stage(self, key, category=None, stage=None):
+
"""
+
Set the stage of an on-demand task manually. This allows you to 'cheat' the system and set
+
the stage manually. This is useful for testing or when a system manipulates the state
+
somehow (like using a potion that speeds up the growth of a plant). The given stage must
+
be previously created for the given task. If task has no stages, this will do nothing.
+
+
Args:
+
key (str, callable, OnDemandTask or Object): The unique identifier for the task. If a
+
callable, will be called without arguments. If an Object, will be converted to a
+
string. If an `OnDemandTask`, then all other arguments are ignored and the task
+
will be used to identify the task to set the stage for.
+
category (str, optional): The category of the task.
+
stage (str, optional): The stage to set. If `None`, the task will be reset to its
+
initial (first) state.
+
+
Notes:
+
Setting this will not on its own trigger any stage functions - this will only happen
+
as normal, next time the state is checked and the stage is found to have changed.
+
+
"""
+
task = self.get(key, category)
+
if task:
+
task.set_stage(stage)
# Create singleton
diff --git a/docs/latest/_sources/Coding/Changelog.md.txt b/docs/latest/_sources/Coding/Changelog.md.txt
index 4f4d92d266..41bde9c50b 100644
--- a/docs/latest/_sources/Coding/Changelog.md.txt
+++ b/docs/latest/_sources/Coding/Changelog.md.txt
@@ -1,5 +1,12 @@
# Changelog
+## Evennia Main branch
+
+- Feature: Add `ON_DEMAND_HANDLER.set_dt(key, category, dt)` and
+ `.set_stage(key, category, stage)` to allow manual tweaking of task timings,
+ for example for a spell speeding a plant's growth. (Griatch)
+- Fix: Resolve a bug when loading on-demand-handler data from database.
+
## Evennia 3.2.0
Feb 25, 2024
diff --git a/docs/latest/_sources/Howtos/Beginner-Tutorial/Part3/Beginner-Tutorial-Utilities.md.txt b/docs/latest/_sources/Howtos/Beginner-Tutorial/Part3/Beginner-Tutorial-Utilities.md.txt
index fa3299accd..effd4bce3d 100644
--- a/docs/latest/_sources/Howtos/Beginner-Tutorial/Part3/Beginner-Tutorial-Utilities.md.txt
+++ b/docs/latest/_sources/Howtos/Beginner-Tutorial/Part3/Beginner-Tutorial-Utilities.md.txt
@@ -1,18 +1,16 @@
-# Code structure and Utilities
+# Code Structure and Utilities
-In this lesson we will set up the file structure for _EvAdventure_. We will make some
+In this lesson, we will set up the file structure for _EvAdventure_. We will make some
utilities that will be useful later. We will also learn how to write _tests_.
-## Folder structure
+## Folder Structure
```{sidebar} This layout is for the tutorial!
-We make the `evadventure` folder stand-alone for the sake of the tutorial only. Leaving the code isolated makes it clear what we changed - and for you to grab what you want later. It also makes it easier to refer to matching code in `evennia/contrib/tutorials/evadventure`.
+We make the `evadventure` folder stand-alone for the sake of the tutorial only. Leaving the code isolated in this way makes it clear what we have changed — and for you to grab what you want later. It also makes it easier to refer to the matching code in `evennia/contrib/tutorials/evadventure`.
-For your own game you are encouraged to modify your game dir in-place instead (such as add to `commands/commands.py` and to modify the `typeclasses/` modules directly). Except for the `server/` folder, you are infact free to structure your game dir code pretty much as you like.
+For your own game, you are instead encouraged to modify your game dir in-place (i.e, directly add to `commands/commands.py` and modify the `typeclasses/` modules directly). Except for the `server/` folder, you are, in fact, free to structure your game dir code pretty much as you like.
```
-Create a new folder under your `mygame` folder, named `evadventure`. Inside it, create
-another folder `tests/` and make sure to put empty `__init__.py` files in both. This turns both
-folders into packages Python understands to import from.
+Create a new folder named `evadventure` under your `mygame` folder. Inside it the new folder, create another folder named `tests/`. Make sure to put empty `__init__.py` files in both new folders. Doing so turns both new folders into packages from which Python understands to import automatically.
```
mygame/
@@ -30,79 +28,79 @@ mygame/
```
-Importing anything from inside this folder from anywhere else under `mygame` will be done by
+Importing anything from inside this folder from anywhere else under `mygame` will be done by
-```python
+```python
# from anywhere in mygame/
-from evadventure.yourmodulename import whatever
+from evadventure.yourmodulename import whatever
```
-This is the 'absolute path` type of import.
+This is the 'absolute path` type of import.
Between two modules both in `evadventure/`, you can use a 'relative' import with `.`:
-```python
+```python
# from a module inside mygame/evadventure
from .yourmodulename import whatever
```
From e.g. inside `mygame/evadventure/tests/` you can import from one level above using `..`:
-```python
-# from mygame/evadventure/tests/
+```python
+# from mygame/evadventure/tests/
from ..yourmodulename import whatever
```
-## Enums
+## Enums
```{sidebar}
-A full example of the enum module is found in
+A full example of the enum module is found in
[evennia/contrib/tutorials/evadventure/enums.py](../../../api/evennia.contrib.tutorials.evadventure.enums.md).
```
Create a new file `mygame/evadventure/enums.py`.
-An [enum](https://docs.python.org/3/library/enum.html) (enumeration) is a way to establish constants in Python. Best is to show an example:
+An [enum](https://docs.python.org/3/library/enum.html) (enumeration) is a way to establish constants in Python. For example:
-```python
+```python
# in a file mygame/evadventure/enums.py
from enum import Enum
-class Ability(Enum):
+class Ability(Enum):
STR = "strength"
```
-You access an enum like this:
+You can then access an enum like this:
-```
+```
# from another module in mygame/evadventure
-from .enums import Ability
+from .enums import Ability
-Ability.STR # the enum itself
+Ability.STR # the enum itself
Ability.STR.value # this is the string "strength"
```
-Having enums is recommended practice. With them set up, it means we can make sure to refer to the same thing every time. Having all enums in one place also means you have a good overview of the constants you are dealing with.
+Using enums is a recommended practice. With enums set up, we can make sure to refer to the same constant or variable every time. Keeping all enums in one place also means we have a good overview of the constants with which we are dealing.
-The alternative would be to for example pass around a string `"constitution"`. If you mis-spell this (`"consitution"`), you would not necessarily know it right away - the error would happen later when the string is not recognized. If you make a typo getting `Ability.COM` instead of `Ability.CON`, Python will immediately raise an error since this enum is not recognized.
+The alternative to enums would be, for example, to pass around a string named `"constitution"`. If you mis-spelled this as, say, `"consitution"`, you would not necessarily know it right away because the error would happen later when the string is not recognized. By using the enum practice,should you make a typo getting `Ability.COM` instead of `Ability.CON`, Python will immediately raise an error becase this enum with the typo will not be recognized.
-With enums you can also do nice direct comparisons like `if ability is Ability.WIS: `.
+With enums, you can also do nice direct comparisons like `if ability is Ability.WIS: `.
-Note that the `Ability.STR` enum does not have the actual _value_ of e.g. your Strength. It's just a fixed label for the Strength ability.
+Note that the `Ability.STR` enum does not have the actual _value_ of, for instance, your Strength. `Ability.STR` is just a fixed label for the Strength ability.
-Here is the `enum.py` module needed for _Knave_. It covers the basic aspects of rule systems we need to track (check out the _Knave_ rules. If you use another rule system you'll likely gradually expand on your enums as you figure out what you'll need).
+Below is the `enum.py` module needed for _Knave_. It covers the basic aspects of the rule system we need to track. (Check out the _Knave_ rules.) Should you later use another rule system, you'll likely expand on your enums gradually as you figure out what you'll need.
-```python
+```python
# mygame/evadventure/enums.py
class Ability(Enum):
"""
- The six base ability-bonuses and other
+ The six base ability-bonuses and other
abilities
"""
@@ -113,62 +111,62 @@ class Ability(Enum):
INT = "intelligence"
WIS = "wisdom"
CHA = "charisma"
-
+
ARMOR = "armor"
-
+
CRITICAL_FAILURE = "critical_failure"
CRITICAL_SUCCESS = "critical_success"
-
+
ALLEGIANCE_HOSTILE = "hostile"
ALLEGIANCE_NEUTRAL = "neutral"
ALLEGIANCE_FRIENDLY = "friendly"
ABILITY_REVERSE_MAP = {
- "str": Ability.STR,
+ "str": Ability.STR,
"dex": Ability.DEX,
"con": Ability.CON,
"int": Ability.INT,
"wis": Ability.WIS,
- "cha": Ability.CHA
+ "cha": Ability.CHA
}
```
-Here the `Ability` class holds basic properties of a character sheet.
+Above, the `Ability` class holds some basic properties of a character sheet.
-The `ABILITY_REVERSE_MAP` is a convenient map to go the other way - if you in some command were to enter the string 'cha', we could use this mapping to directly convert your input to the correct `Ability`:
+The `ABILITY_REVERSE_MAP` is a convenient map to go the other way &mdas; if in some command we were to enter the string 'cha', we could use this mapping to directly convert your input to the correct `Ability`. For example:
ability = ABILITY_REVERSE_MAP.get(your_input)
-## Utility module
+## Utility Module
> Create a new module `mygame/evadventure/utils.py`
```{sidebar}
-An example of the utility module is found in
+An example of the utility module is found in
[evennia/contrib/tutorials/evadventure/utils.py](../../../api/evennia.contrib.tutorials.evadventure.utils.md)
```
-This is for general functions we may need from all over. In this case we only picture one utility, a function that produces a pretty display of any object we pass to it.
+The utility module is used to contain general functions we may need to call repeatedly from various other modules. In this tutorial example, we only crate one utility: a function that produces a pretty display of any object we pass to it.
-This is an example of the string we want to see:
+Below is an example of the string we want to see:
```
-Chipped Sword
+Chipped Sword
Value: ~10 coins [wielded in Weapon hand]
-
-A simple sword used by mercenaries all over
+
+A simple sword used by mercenaries all over
the world.
-
+
Slots: 1, Used from: weapon hand
Quality: 3, Uses: None
Attacks using strength against armor.
Damage roll: 1d6
```
-Here's the start of how the function could look:
+And, here's the start of how the function might look:
```python
# in mygame/evadventure/utils.py
@@ -186,23 +184,23 @@ Damage roll: |w{damage_roll}|n
""".strip()
-def get_obj_stats(obj, owner=None):
- """
+def get_obj_stats(obj, owner=None):
+ """
Get a string of stats about the object.
-
+
Args:
obj (Object): The object to get stats for.
- owner (Object): The one currently owning/carrying `obj`, if any. Can be
+ owner (Object): The one currently owning/carrying `obj`, if any. Can be
used to show e.g. where they are wielding it.
Returns:
str: A nice info string to display about the object.
-
+
"""
return _OBJ_STATS.format(
- key=obj.key,
- value=10,
- carried="[Not carried]",
- desc=obj.db.desc,
+ key=obj.key,
+ value=10,
+ carried="[Not carried]",
+ desc=obj.db.desc,
size=1,
quality=3,
uses="infinite",
@@ -212,55 +210,54 @@ def get_obj_stats(obj, owner=None):
damage_roll="1d6"
)
```
-Here we set up the string template with place holders for where every piece of info should go. Study this string so you understand what it does. The `|c`, `|y`, `|w` and `|n` markers are [Evennia color markup](../../../Concepts/Colors.md) for making the text cyan, yellow, white and neutral-color respectively.
+In our new `get_obj_stats` function above, we set up a string template with place holders for where every element of stats information should go. Study this string so that you understand what it does. The `|c`, `|y`, `|w` and `|n` markers are [Evennia color markup](../../../Concepts/Colors.md) for making the text cyan, yellow, white and neutral-color, respectively.
-We can guess some things, such that `obj.key` is the name of the object, and that `obj.db.desc` will hold its description (this is how it is in default Evennia).
+Some stats elements are easy to identify in the above code. For instance, `obj.key` is the name of an object and `obj.db.desc` will hold an object's description — this is also how default Evennia works.
-But so far we have not established how to get any of the other properties like `size` or `attack_type`. So we just set them to dummy values. We'll need to get back to this when we have more code in place!
+So far, here in our tutorial, we have not yet established how to get any of the other properties like `size` or `attack_type`. For our current purposes, we will just set them to dummy values and we'll need to revisit them later when we have more code in place!
-## Testing
+## Testing
+
+Evennia comes with extensive functionality to help you test your code. A _unit test_ allows you to set up automated testing of code. Once you've written your test, you can then run it over and over again to ensure later changes to your code didn't break things by introducing errors.
> create a new module `mygame/evadventure/tests/test_utils.py`
-How do you know if you made a typo in the code above? You could _manually_ test it by reloading your Evennia server and do the following from in-game:
+How would you know if you made a typo in the code above? You can _manually_ test it by reloading your Evennia server and issuing the following in-game python command:
py from evadventure.utils import get_obj_stats;print(get_obj_stats(self))
-You should get back a nice string about yourself! If that works, great! But you'll need to remember doing that test when you change this code later.
+Doing so should spit back a nice bit of string ouput about yourself! If that works, great! But, you'll need to remember re-running that test manually when you later change the code.
```{sidebar}
In [evennia/contrib/tutorials/evadventure/tests/test_utils.py](evennia.contrib.tutorials.evadventure.tests.test_utils)
is an example of the testing module. To dive deeper into unit testing in Evennia, see the [Unit testing](../../../Coding/Unit-Testing.md) documentation.
```
-A _unit test_ allows you to set up automated testing of code. Once you've written your test you can run it over and over and make sure later changes to your code didn't break things.
+In our particular case of this tutorial, we should _expect_ to need to later update the test when the `get_obj_stats` code becomes more complete and returns more pertinent data.
-In this particular case, we _expect_ to later have to update the test when `get_obj_stats` becomes more complete and returns more reasonable data.
+Here's a module for testing `get_obj_stats`.
-Evennia comes with extensive functionality to help you test your code. Here's a module for
-testing `get_obj_stats`.
-
-```python
+```python
# mygame/evadventure/tests/test_utils.py
-from evennia.utils import create
-from evennia.utils.test_resources import EvenniaTest
+from evennia.utils import create
+from evennia.utils.test_resources import EvenniaTest
from ..import utils
class TestUtils(EvenniaTest):
def test_get_obj_stats(self):
- # make a simple object to test with
+ # make a simple object to test with
obj = create.create_object(
- key="testobj",
+ key="testobj",
attributes=(("desc", "A test object"),)
- )
- # run it through the function
+ )
+ # run it through the function
result = utils.get_obj_stats(obj)
# check that the result is what we expected
self.assertEqual(
- result,
- """
+ result,
+ """
|ctestobj|n
Value: ~|y10|n coins[not carried]
@@ -275,37 +272,41 @@ Damage roll: |w1d6|n
```
-What happens here is that we create a new test-class `TestUtils` that inherits from `EvenniaTest`. This inheritance is what makes this a testing class.
+What happens in the above code is that we create a new test-class named `TestUtils` that inherits from `EvenniaTest`. It is this inheritance that makes this a testing class.
```{important}
-It's useful for any game dev to know how to effectively test their code. So we'll try to include a *Testing* section at the end of each of the implementation lessons to follow. Writing tests for your code is optional but highly recommended. It can feel a little cumbersome or time-consuming at first ... but you'll thank yourself later.
+It's useful for any game dev to know how to test their code effectively. So, we'll try to include a *Testing* section at the end of each implementation lesson that follows in this tutorial.
+
+Writing tests for your code is optional, but highly recommended. Initially, unit testing may feel a little cumbersome or time-consuming... but you'll thank yourself later.
```
-We can have any number of methods on this class. To have a method recognized as one containing code to test, its name _must_ start with `test_`. We have one - `test_get_obj_stats`.
+We can have any number of methods called on this class. To have Evennia automatically recognize a method as one containing code to test, its name _must_ start with the `test_` prefix. We have one here as `test_get_obj_stats`.
-In this method we create a dummy `obj` and gives it a `key` "testobj". Note how we add the `desc` [Attribute](../../../Components/Attributes.md) directly in the `create_object` call by specifying the attribute as a tuple `(name, value)`!
+In our `test_get_obj_stats` method, we create a dummy `obj` and assign it a `key` "testobj". Note that we add the`desc` [Attribute](../../../Components/Attributes.md) directly in the `create_object` call by specifying the attribute as a tuple `(name, value)`!
-We then get the result of passing this dummy-object through `get_obj_stats` we imported earlier.
+Then, we can get the result of passing this dummy-object through the `get_obj_stats` function that we imported earlier.
-The `assertEqual` method is available on all testing classes and checks that the `result` is equal to the string we specify. If they are the same, the test _passes_, otherwise it _fails_ and we need to investigate what went wrong.
+The `assertEqual` method is available on all testing classes and checks that the `result` is equal to the string we specify. If they are the same, the test _passes_. Otherwise, it _fails_ and we need to investigate what went wrong.
-### Running your test
+### Running your Test
-To run your test you need to stand inside your `mygame` folder and execute the following command:
+To run our utility module test, we need to issue the following command directly from the `mygame` folder:
evennia test --settings settings.py evadventure.tests
-This will run all your `evadventure` tests (if you had more of them). To only run your utility tests you could do
+The above command will run all `evadventure` tests found in the `mygame/evadventure/tests` folder. To run only our utility tests we might instead specify the test individually:
evennia test --settings settings.py evadventure.tests.test_utils
-If all goes well, you should get an `OK` back. Otherwise you need to check the failure, maybe your return string doesn't quite match what you expected.
+If all goes well, the above utility test should produce output ending with `OK` to indicate our code has passed the test.
-> Hint: The example unit test code above contains a deliberate error in capitalization. See if you can interpret the error and fix it!
+However, if our return string doesn't quite match what we expected, the test will fail. We will then need to begin examining and troubleshooting our failing code.
-## Summary
+> Hint: The above example unit test code contains a deliberate error in capitalization. See if you can examine the output to interpret the deliberate error, and then fix it!
-It's very important to understand how you import code between modules in Python, so if this is still confusing to you, it's worth to read up on this more.
+## Summary
-That said, many newcomers are confused with how to begin, so by creating the folder structure, some small modules and even making your first unit test, you are off to a great start!
\ No newline at end of file
+It's very important to understand how you import code among modules in Python. If importing from Python modules is still confusing to you, it's worth it to read more on the topic.
+
+That said, many newcomers are confused with how to tackle these concepts. In this lesson, by creating the folder structure, two small modules and even making our first unit test, you are off to a great start!
diff --git a/docs/latest/api/evennia.commands.default.account.html b/docs/latest/api/evennia.commands.default.account.html
index e86f477900..375f6c988e 100644
--- a/docs/latest/api/evennia.commands.default.account.html
+++ b/docs/latest/api/evennia.commands.default.account.html
@@ -145,7 +145,7 @@ method. Otherwise all text will be returned to all connected sessions.
-
-
aliases = ['ls', 'l']
+aliases = ['l', 'ls']
@@ -176,7 +176,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.building.html b/docs/latest/api/evennia.commands.default.building.html
index 8658f810aa..da94468388 100644
--- a/docs/latest/api/evennia.commands.default.building.html
+++ b/docs/latest/api/evennia.commands.default.building.html
@@ -641,7 +641,7 @@ You can specify the /force switch to bypass this confirmation.
-
-
aliases = ['@del', '@delete']
+aliases = ['@delete', '@del']
@@ -682,7 +682,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 '}
@@ -1409,7 +1409,7 @@ server settings.
-
-
aliases = ['@update', '@type', '@typeclasses', '@swap', '@parent']
+aliases = ['@parent', '@swap', '@update', '@typeclasses', '@type']
@@ -1440,7 +1440,7 @@ server settings.
-
-
search_index_entry = {'aliases': '@update @type @typeclasses @swap @parent', 'category': 'building', 'key': '@typeclass', 'no_prefix': 'typeclass update type typeclasses swap parent', 'tags': '', 'text': "\n set or change an object's typeclass\n\n Usage:\n typeclass[/switch] <object> [= typeclass.path]\n typeclass/prototype <object> = prototype_key\n\n typeclasses or typeclass/list/show [typeclass.path]\n swap - this is a shorthand for using /force/reset flags.\n update - this is a shorthand for using the /force/reload flag.\n\n Switch:\n show, examine - display the current typeclass of object (default) or, if\n given a typeclass path, show the docstring of that typeclass.\n update - *only* re-run at_object_creation on this object\n meaning locks or other properties set later may remain.\n reset - clean out *all* the attributes and properties on the\n object - basically making this a new clean object. This will also\n reset cmdsets!\n force - change to the typeclass also if the object\n already has a typeclass of the same name.\n list - show available typeclasses. Only typeclasses in modules actually\n imported or used from somewhere in the code will show up here\n (those typeclasses are still available if you know the path)\n prototype - clean and overwrite the object with the specified\n prototype key - effectively making a whole new object.\n\n Example:\n type button = examples.red_button.RedButton\n type/prototype button=a red button\n\n If the typeclass_path is not given, the current object's typeclass is\n assumed.\n\n View or set an object's typeclass. If setting, the creation hooks of the\n new typeclass will be run on the object. If you have clashing properties on\n the old class, use /reset. By default you are protected from changing to a\n typeclass of the same name as the one you already have - use /force to\n override this protection.\n\n The given typeclass must be identified by its location using python\n dot-notation pointing to the correct module and class. If no typeclass is\n given (or a wrong typeclass is given). Errors in the path or new typeclass\n will lead to the old typeclass being kept. The location of the typeclass\n module is searched from the default typeclass directory, as defined in the\n server settings.\n\n "}
+search_index_entry = {'aliases': '@parent @swap @update @typeclasses @type', 'category': 'building', 'key': '@typeclass', 'no_prefix': 'typeclass parent swap update 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 "}
diff --git a/docs/latest/api/evennia.commands.default.comms.html b/docs/latest/api/evennia.commands.default.comms.html
index 3a319d4365..39be8775a2 100644
--- a/docs/latest/api/evennia.commands.default.comms.html
+++ b/docs/latest/api/evennia.commands.default.comms.html
@@ -268,7 +268,7 @@ ban mychannel1,mychannel2= EvilUser : Was banned for spamming.
-
-
aliases = ['@chan', '@channels']
+aliases = ['@channels', '@chan']
@@ -793,7 +793,7 @@ don’t actually sub to yet.
-
-
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 "}
+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 "}
@@ -946,7 +946,7 @@ ban mychannel1,mychannel2= EvilUser : Was banned for spamming.
-
-
aliases = ['@chan', '@channels']
+aliases = ['@channels', '@chan']
@@ -966,7 +966,7 @@ ban mychannel1,mychannel2= EvilUser : Was banned for spamming.
-
-
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 "}
+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 "}
diff --git a/docs/latest/api/evennia.commands.default.general.html b/docs/latest/api/evennia.commands.default.general.html
index d9cd6436a8..95b1d15d92 100644
--- a/docs/latest/api/evennia.commands.default.general.html
+++ b/docs/latest/api/evennia.commands.default.general.html
@@ -187,7 +187,7 @@ look *<account&g
-
-
aliases = ['ls', 'l']
+aliases = ['l', 'ls']
@@ -218,7 +218,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.commands.default.system.html b/docs/latest/api/evennia.commands.default.system.html
index 3da57e3e28..537be7e371 100644
--- a/docs/latest/api/evennia.commands.default.system.html
+++ b/docs/latest/api/evennia.commands.default.system.html
@@ -695,7 +695,7 @@ See |luhttps://ww
-
-
aliases = ['@delays', '@task']
+aliases = ['@task', '@delays']
@@ -741,7 +741,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 658e6e812a..22f49f6485 100644
--- a/docs/latest/api/evennia.commands.default.tests.html
+++ b/docs/latest/api/evennia.commands.default.tests.html
@@ -973,7 +973,7 @@ main test suite started with
Test the batch processor.
-
-
red_button = <module 'evennia.contrib.tutorials.red_button.red_button' from '/tmp/tmpgfj82hyu/cc8584f8390f4ca7b7843ff77d8dac7c7305e6b6/evennia/contrib/tutorials/red_button/red_button.py'>
+red_button = <module 'evennia.contrib.tutorials.red_button.red_button' from '/tmp/tmpyyzozo7g/bb501d990fea472ec87303e245292ffe5998c185/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 e6b6ce547a..96a7156348 100644
--- a/docs/latest/api/evennia.commands.default.unloggedin.html
+++ b/docs/latest/api/evennia.commands.default.unloggedin.html
@@ -134,7 +134,7 @@ connect “account name” “pass word”
-
-
aliases = ['con', 'co', 'conn']
+aliases = ['conn', 'con', 'co']
@@ -169,7 +169,7 @@ there is no object yet before the account has logged in)
-
-
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 '}
+search_index_entry = {'aliases': 'conn con co', 'category': 'general', 'key': 'connect', 'no_prefix': ' conn con co', '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 '}
@@ -193,7 +193,7 @@ create “account name” “pass word”
-
-
aliases = ['cr', 'cre']
+aliases = ['cre', 'cr']
@@ -230,7 +230,7 @@ create “account name” “pass word”
-
-
search_index_entry = {'aliases': 'cr cre', 'category': 'general', 'key': 'create', 'no_prefix': ' cr cre', 'tags': '', 'text': '\n create a new account account\n\n Usage (at login screen):\n create <accountname> <password>\n create "account name" "pass word"\n\n This creates a new account account.\n\n If you have spaces in your name, enclose it in double quotes.\n '}
+search_index_entry = {'aliases': 'cre cr', 'category': 'general', 'key': 'create', 'no_prefix': ' cre cr', 'tags': '', 'text': '\n create a new account account\n\n Usage (at login screen):\n create <accountname> <password>\n create "account name" "pass word"\n\n This creates a new account account.\n\n If you have spaces in your name, enclose it in double quotes.\n '}
@@ -254,7 +254,7 @@ version is a bit more complicated.
-
-
aliases = ['qu', 'q']
+aliases = ['q', 'qu']
@@ -280,7 +280,7 @@ version is a bit more complicated.
-
-
search_index_entry = {'aliases': 'qu q', 'category': 'general', 'key': 'quit', 'no_prefix': ' qu q', 'tags': '', 'text': '\n quit when in unlogged-in state\n\n Usage:\n quit\n\n We maintain a different version of the quit command\n here for unconnected accounts for the sake of simplicity. The logged in\n version is a bit more complicated.\n '}
+search_index_entry = {'aliases': 'q qu', 'category': 'general', 'key': 'quit', 'no_prefix': ' q qu', 'tags': '', 'text': '\n quit when in unlogged-in state\n\n Usage:\n quit\n\n We maintain a different version of the quit command\n here for unconnected accounts for the sake of simplicity. The logged in\n version is a bit more complicated.\n '}
@@ -304,7 +304,7 @@ All it does is display the connect screen.
-
-
aliases = ['look', 'l']
+aliases = ['l', 'look']
@@ -330,7 +330,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 '}
@@ -353,7 +353,7 @@ for simplicity. It shows a pane of info.
-
-
aliases = ['?', 'h']
+aliases = ['h', '?']
@@ -379,7 +379,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 f79879c60d..9a77ba85ed 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
@@ -151,7 +151,7 @@ the module given by settings.CONNECTION_SCREEN_MODULE.
-
-
aliases = ['con', 'co', 'conn']
+aliases = ['conn', 'con', 'co']
@@ -181,7 +181,7 @@ there is no object yet before the account has logged in)
-
-
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 '}
+search_index_entry = {'aliases': 'conn con co', 'category': 'general', 'key': 'connect', 'no_prefix': ' conn con co', '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 '}
@@ -203,7 +203,7 @@ there is no object yet before the account has logged in)
-
-
aliases = ['cr', 'cre']
+aliases = ['cre', 'cr']
@@ -245,7 +245,7 @@ name enclosed in quotes:
-
-
search_index_entry = {'aliases': 'cr cre', 'category': 'general', 'key': 'create', 'no_prefix': ' cr cre', 'tags': '', 'text': '\n Create a new account.\n\n Usage (at login screen):\n create "accountname" <email> <password>\n\n This creates a new account account.\n\n '}
+search_index_entry = {'aliases': 'cre cr', 'category': 'general', 'key': 'create', 'no_prefix': ' cre cr', 'tags': '', 'text': '\n Create a new account.\n\n Usage (at login screen):\n create "accountname" <email> <password>\n\n This creates a new account account.\n\n '}
@@ -264,7 +264,7 @@ version is a bit more complicated.
-
-
aliases = ['qu', 'q']
+aliases = ['q', 'qu']
@@ -290,7 +290,7 @@ version is a bit more complicated.
-
-
search_index_entry = {'aliases': 'qu q', 'category': 'general', 'key': 'quit', 'no_prefix': ' qu q', 'tags': '', 'text': '\n We maintain a different version of the `quit` command\n here for unconnected accounts for the sake of simplicity. The logged in\n version is a bit more complicated.\n '}
+search_index_entry = {'aliases': 'q qu', 'category': 'general', 'key': 'quit', 'no_prefix': ' q qu', 'tags': '', 'text': '\n We maintain a different version of the `quit` command\n here for unconnected accounts for the sake of simplicity. The logged in\n version is a bit more complicated.\n '}
@@ -309,7 +309,7 @@ All it does is display the connect screen.
-
-
aliases = ['look', 'l']
+aliases = ['l', 'look']
@@ -335,7 +335,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 '}
@@ -353,7 +353,7 @@ for simplicity. It shows a pane of info.
-
-
aliases = ['?', 'h']
+aliases = ['h', '?']
@@ -379,7 +379,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.mux_comms_cmds.mux_comms_cmds.html b/docs/latest/api/evennia.contrib.base_systems.mux_comms_cmds.mux_comms_cmds.html
index 7e3f138b69..00d018afee 100644
--- a/docs/latest/api/evennia.contrib.base_systems.mux_comms_cmds.mux_comms_cmds.html
+++ b/docs/latest/api/evennia.contrib.base_systems.mux_comms_cmds.mux_comms_cmds.html
@@ -172,7 +172,7 @@ aliases to an already joined channel.
-
-
aliases = ['aliaschan', 'chanalias']
+aliases = ['chanalias', 'aliaschan']
@@ -203,7 +203,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 '}
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 be7a231fc7..6751b2c41a 100644
--- a/docs/latest/api/evennia.contrib.full_systems.evscaperoom.commands.html
+++ b/docs/latest/api/evennia.contrib.full_systems.evscaperoom.commands.html
@@ -223,7 +223,7 @@ the operation will be general or on the room.
-
-
aliases = ['abort', 'q', 'chicken out', 'quit']
+aliases = ['quit', 'abort', 'q', 'chicken out']
@@ -247,7 +247,7 @@ set in self.parse())
-
-
search_index_entry = {'aliases': 'abort q chicken out quit', 'category': 'evscaperoom', 'key': 'give up', 'no_prefix': ' abort q chicken out 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 '}
+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 '}
@@ -268,7 +268,7 @@ set in self.parse())
-
-
aliases = ['ls', 'l']
+aliases = ['l', 'ls']
@@ -302,7 +302,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 '}
@@ -383,7 +383,7 @@ shout
-
-
aliases = ['shout', ';', 'whisper']
+aliases = ['whisper', ';', 'shout']
@@ -412,7 +412,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 '}
@@ -502,7 +502,7 @@ looks and what actions is available.
-
-
aliases = ['ex', 'examine', 'e', 'unfocus']
+aliases = ['ex', 'unfocus', 'examine', 'e']
@@ -531,7 +531,7 @@ set in self.parse())
-
-
search_index_entry = {'aliases': 'ex examine e unfocus', 'category': 'evscaperoom', 'key': 'focus', 'no_prefix': ' ex examine e unfocus', 'tags': '', 'text': '\n Focus your attention on a target.\n\n Usage:\n focus <obj>\n\n Once focusing on an object, use look to get more information about how it\n looks and what actions is available.\n\n '}
+search_index_entry = {'aliases': 'ex unfocus examine e', 'category': 'evscaperoom', 'key': 'focus', 'no_prefix': ' ex unfocus examine e', '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 '}
@@ -593,7 +593,7 @@ set in self.parse())
-
-
aliases = ['i', 'give', 'inventory', 'inv']
+aliases = ['inventory', 'i', 'inv', 'give']
@@ -617,7 +617,7 @@ set in self.parse())
-
-
search_index_entry = {'aliases': 'i give inventory inv', 'category': 'evscaperoom', 'key': 'get', 'no_prefix': ' i give inventory inv', 'tags': '', 'text': '\n Use focus / examine instead.\n\n '}
+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 '}
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 cb25c8dc15..cf98b83048 100644
--- a/docs/latest/api/evennia.contrib.game_systems.barter.barter.html
+++ b/docs/latest/api/evennia.contrib.game_systems.barter.barter.html
@@ -757,7 +757,7 @@ try to influence the other part in the deal.
-
-
aliases = ['offers', 'deal']
+aliases = ['deal', 'offers']
@@ -783,7 +783,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.grid.extended_room.extended_room.html b/docs/latest/api/evennia.contrib.grid.extended_room.extended_room.html
index a404069937..61200a8f31 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
@@ -655,7 +655,7 @@ look *<account&g
-
-
aliases = ['ls', 'l']
+aliases = ['l', 'ls']
@@ -675,7 +675,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 5be1099b5b..b3553eddc2 100644
--- a/docs/latest/api/evennia.contrib.grid.xyzgrid.commands.html
+++ b/docs/latest/api/evennia.contrib.grid.xyzgrid.commands.html
@@ -434,7 +434,7 @@ there is no room above/below you, your movement will fail.
-
-
aliases = ['dive', 'fly']
+aliases = ['fly', 'dive']
@@ -457,7 +457,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.rpsystem.rpsystem.html b/docs/latest/api/evennia.contrib.rpg.rpsystem.rpsystem.html
index 2adee8e578..d4f324e09f 100644
--- a/docs/latest/api/evennia.contrib.rpg.rpsystem.rpsystem.html
+++ b/docs/latest/api/evennia.contrib.rpg.rpsystem.rpsystem.html
@@ -906,7 +906,7 @@ Using the command without arguments will list all current recogs.
-
-
aliases = ['recognize', 'forget']
+aliases = ['forget', 'recognize']
@@ -933,7 +933,7 @@ Using the command without arguments will list all current recogs.
-
-
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 '}
+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 '}
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 1292043c2a..6108751a9d 100644
--- a/docs/latest/api/evennia.contrib.tutorials.evadventure.combat_twitch.html
+++ b/docs/latest/api/evennia.contrib.tutorials.evadventure.combat_twitch.html
@@ -393,7 +393,7 @@ look *<account&g
-
-
aliases = ['ls', 'l']
+aliases = ['l', 'ls']
@@ -413,7 +413,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 '}
@@ -489,7 +489,7 @@ boost INT Wizard Goblin
-
-
aliases = ['boost', 'foil']
+aliases = ['foil', 'boost']
@@ -523,7 +523,7 @@ set in self.parse())
-
-
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 '}
+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 '}
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 6e07fbce57..2b90a0e766 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
@@ -165,7 +165,7 @@ such as when closing the lid and un-blinding a character.
-
-
aliases = ['press', 'press button', 'push']
+aliases = ['press button', 'push', 'press']
@@ -194,7 +194,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 '}
+search_index_entry = {'aliases': 'press button push press', 'category': 'general', 'key': 'push button', 'no_prefix': ' press button push press', 'tags': '', 'text': '\n Push the red button (lid closed)\n\n Usage:\n push button\n\n '}
@@ -264,7 +264,7 @@ check if the lid is open or closed.
-
-
aliases = ['smash', 'break lid', 'smash lid']
+aliases = ['smash lid', 'smash', 'break lid']
@@ -291,7 +291,7 @@ break.
-
-
search_index_entry = {'aliases': 'smash break lid smash lid', 'category': 'general', 'key': 'smash glass', 'no_prefix': ' smash break lid smash lid', '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 '}
+search_index_entry = {'aliases': 'smash lid smash break lid', 'category': 'general', 'key': 'smash glass', 'no_prefix': ' smash lid smash break lid', '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 '}
@@ -391,7 +391,7 @@ be mutually exclusive.
-
-
aliases = ['press', 'press button', 'push']
+aliases = ['press button', 'push', 'press']
@@ -420,7 +420,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 '}
+search_index_entry = {'aliases': 'press button push press', 'category': 'general', 'key': 'push button', 'no_prefix': ' press button push press', 'tags': '', 'text': '\n Push the red button\n\n Usage:\n push button\n\n '}
@@ -518,7 +518,7 @@ be mutually exclusive.
-
-
aliases = ['listen', 'l', 'feel', 'examine', 'get', 'ex']
+aliases = ['listen', 'get', 'examine', 'l', 'feel', 'ex']
@@ -544,7 +544,7 @@ be mutually exclusive.
-
-
search_index_entry = {'aliases': 'listen l feel examine get ex', 'category': 'general', 'key': 'look', 'no_prefix': ' listen l feel examine get ex', '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 "}
+search_index_entry = {'aliases': 'listen get examine l feel ex', 'category': 'general', 'key': 'look', 'no_prefix': ' listen get examine l feel ex', '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 d91662005e..f0dedf2627 100644
--- a/docs/latest/api/evennia.contrib.tutorials.tutorial_world.objects.html
+++ b/docs/latest/api/evennia.contrib.tutorials.tutorial_world.objects.html
@@ -437,7 +437,7 @@ of the object. We overload it with our own version.
-
-
aliases = ['burn', 'light']
+aliases = ['light', 'burn']
@@ -464,7 +464,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 '}
@@ -568,7 +568,7 @@ shift green root up/down
-
-
aliases = ['push', 'pull', 'move', 'shiftroot']
+aliases = ['pull', 'move', 'shiftroot', 'push']
@@ -604,7 +604,7 @@ yellow/green - horizontal roots
-
-
search_index_entry = {'aliases': 'push pull move shiftroot', 'category': 'tutorialworld', 'key': 'shift', 'no_prefix': ' push pull move shiftroot', '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': '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 '}
@@ -621,7 +621,7 @@ yellow/green - horizontal roots
-
-
aliases = ['button', 'push button', 'press button']
+aliases = ['press button', 'button', 'push button']
@@ -647,7 +647,7 @@ yellow/green - horizontal roots
-
-
search_index_entry = {'aliases': 'button push button press button', 'category': 'tutorialworld', 'key': 'press', 'no_prefix': ' button push button press 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 '}
@@ -791,7 +791,7 @@ parry - forgoes your attack but will make you harder to hit on next
-
-
aliases = ['slash', 'pierce', 'thrust', 'bash', 'kill', 'chop', 'defend', 'hit', 'fight', 'stab', 'parry']
+aliases = ['kill', 'hit', 'fight', 'stab', 'bash', 'slash', 'parry', 'chop', 'pierce', 'thrust', 'defend']
@@ -817,7 +817,7 @@ parry - forgoes your attack but will make you harder to hit on next
-
-
search_index_entry = {'aliases': 'slash pierce thrust bash kill chop defend hit fight stab parry', 'category': 'tutorialworld', 'key': 'attack', 'no_prefix': ' slash pierce thrust bash kill chop defend hit fight stab parry', 'tags': '', 'text': '\n Attack the enemy. Commands:\n\n stab <enemy>\n slash <enemy>\n parry\n\n stab - (thrust) makes a lot of damage but is harder to hit with.\n slash - is easier to land, but does not make as much damage.\n parry - forgoes your attack but will make you harder to hit on next\n enemy attack.\n\n '}
+search_index_entry = {'aliases': 'kill hit fight stab bash slash parry chop pierce thrust defend', 'category': 'tutorialworld', 'key': 'attack', 'no_prefix': ' kill hit fight stab bash slash parry chop pierce thrust defend', '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 0c22be5014..3490be57f6 100644
--- a/docs/latest/api/evennia.contrib.tutorials.tutorial_world.rooms.html
+++ b/docs/latest/api/evennia.contrib.tutorials.tutorial_world.rooms.html
@@ -260,7 +260,7 @@ code except for adding in the details.
-
-
aliases = ['ls', 'l']
+aliases = ['l', 'ls']
@@ -275,7 +275,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 '}
@@ -828,7 +828,7 @@ if they fall off the bridge.
-
-
aliases = ['?', 'h']
+aliases = ['h', '?']
@@ -854,7 +854,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 '}
@@ -980,7 +980,7 @@ to find something.
-
-
aliases = ['feel around', 'search', 'l', 'fiddle', 'feel']
+aliases = ['feel', 'l', 'feel around', 'fiddle', 'search']
@@ -1008,7 +1008,7 @@ random chance of eventually finding a light source.
-
-
search_index_entry = {'aliases': 'feel around search l fiddle feel', 'category': 'tutorialworld', 'key': 'look', 'no_prefix': ' feel around search l 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': 'feel l feel around fiddle search', 'category': 'tutorialworld', 'key': 'look', 'no_prefix': ' feel l feel around fiddle search', 'tags': '', 'text': '\n Look around in darkness\n\n Usage:\n look\n\n Look around in the darkness, trying\n to find something.\n '}
diff --git a/docs/latest/api/evennia.contrib.utils.git_integration.git_integration.html b/docs/latest/api/evennia.contrib.utils.git_integration.git_integration.html
index 796e069a2e..af0f5424cc 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
@@ -220,7 +220,7 @@ git evennia pull - Pull the latest evennia code.
-
-
directory = '/tmp/tmpgfj82hyu/cc8584f8390f4ca7b7843ff77d8dac7c7305e6b6/evennia'
+directory = '/tmp/tmpyyzozo7g/bb501d990fea472ec87303e245292ffe5998c185/evennia'
@@ -281,7 +281,7 @@ git pull - Pull the latest code from your current branch.
-
-
directory = '/tmp/tmpgfj82hyu/cc8584f8390f4ca7b7843ff77d8dac7c7305e6b6/evennia/game_template'
+directory = '/tmp/tmpyyzozo7g/bb501d990fea472ec87303e245292ffe5998c185/evennia/game_template'
diff --git a/docs/latest/api/evennia.scripts.ondemandhandler.html b/docs/latest/api/evennia.scripts.ondemandhandler.html
index 57d753fbee..434bd10dcd 100644
--- a/docs/latest/api/evennia.scripts.ondemandhandler.html
+++ b/docs/latest/api/evennia.scripts.ondemandhandler.html
@@ -300,6 +300,23 @@ current stage. If no stages are defined, stage will always be <
+
+-
+
set_dt(dt)[source]
+Set the time-delta since the task started manually. This allows you to ‘cheat’ the system
+and set the time manually. This is useful for testing or when a system manipulates the state
+somehow (like using a potion that speeds up the growth of a plant).
+
+- Parameters
+dt (int) – The time-delta to set. This is an absolute value in seconds, same as returned
+by get_dt.
+
+
+Notes
+Setting this will not on its own trigger any stage functions - this will only happen
+as normal, next time the state is checked and the stage is found to have changed.
+
+
-
get_stage()[source]
@@ -312,6 +329,24 @@ still update the last_checked time.
+
+-
+
set_stage(stage=None)[source]
+Set the stage of the task manually. This allows you to ‘cheat’ the system and set the stage
+manually. This is useful for testing or when a system manipulates the state somehow (like
+using a potion that speeds up the growth of a plant). The given stage must be previously
+created for the given task. If task has no stages, this will do nothing.
+
+- Parameters
+stage (str, optional) – The stage to set. If None, the task will be reset to its
+initial (first) state.
+
+
+Notes
+Setting this will not on its own trigger any stage functions - this will only happen
+as normal, next time the state is checked and the stage is found to have changed.
+
+
@@ -494,6 +529,30 @@ to identify the task to get the time-delta from.
+
+-
+
set_dt(key, category, dt)[source]
+Set the time-delta since the task started manually. This allows you to ‘cheat’ the system
+and set the time manually. This is useful for testing or when a system manipulates the state
+somehow (like using a potion that speeds up the growth of a plant).
+
+- Parameters
+
+key (str, callable, OnDemandTask or Object) – The unique identifier for the task. If a
+callable, will be called without arguments. If an Object, will be converted to a string.
+If an OnDemandTask, then all other arguments are ignored and the task will be used
+to identify the task to set the time-delta for.
+category (str, optional) – The category of the task.
+dt (int) – The time-delta to set. This is an absolute value in seconds, same as returned
+by get_dt.
+
+
+
+Notes
+Setting this will not on its own trigger any stage functions - this will only happen
+as normal, next time the state is checked and the stage is found to have changed.
+
+
-
get_stage(key, category=None)[source]
@@ -511,6 +570,31 @@ to identify the task to get the stage from.
+
+-
+
set_stage(key, category=None, stage=None)[source]
+Set the stage of an on-demand task manually. This allows you to ‘cheat’ the system and set
+the stage manually. This is useful for testing or when a system manipulates the state
+somehow (like using a potion that speeds up the growth of a plant). The given stage must
+be previously created for the given task. If task has no stages, this will do nothing.
+
+- Parameters
+
+key (str, callable, OnDemandTask or Object) – The unique identifier for the task. If a
+callable, will be called without arguments. If an Object, will be converted to a
+string. If an OnDemandTask, then all other arguments are ignored and the task
+will be used to identify the task to set the stage for.
+category (str, optional) – The category of the task.
+stage (str, optional) – The stage to set. If None, the task will be reset to its
+initial (first) state.
+
+
+
+Notes
+Setting this will not on its own trigger any stage functions - this will only happen
+as normal, next time the state is checked and the stage is found to have changed.
+
+
diff --git a/docs/latest/api/evennia.utils.eveditor.html b/docs/latest/api/evennia.utils.eveditor.html
index 8bc451bc71..dfaea32d0d 100644
--- a/docs/latest/api/evennia.utils.eveditor.html
+++ b/docs/latest/api/evennia.utils.eveditor.html
@@ -348,7 +348,7 @@ indentation.
-
-
aliases = [':', '::', ':=', ':wq', ':h', ':r', ':w', ':q!', ':u', ':I', ':p', ':DD', ':dd', ':y', ':q', ':j', ':::', ':S', ':f', ':!', ':<', ':fd', ':A', ':dw', ':i', ':s', ':echo', ':>', ':fi', ':uu', ':x', ':UU']
+aliases = [':I', ':::', ':q', ':w', ':i', ':fi', ':wq', ':s', ':!', ':r', ':echo', ':fd', ':j', ':DD', ':=', ':h', ':>', ':S', ':f', ':p', ':q!', ':A', ':dw', ':uu', ':', ':<', ':dd', '::', ':u', ':UU', ':y', ':x']
@@ -376,7 +376,7 @@ efficient presentation.
-
-
search_index_entry = {'aliases': ': :: := :wq :h :r :w :q! :u :I :p :DD :dd :y :q :j ::: :S :f :! :< :fd :A :dw :i :s :echo :> :fi :uu :x :UU', 'category': 'general', 'key': ':editor_command_group', 'no_prefix': ' : :: := :wq :h :r :w :q! :u :I :p :DD :dd :y :q :j ::: :S :f :! :< :fd :A :dw :i :s :echo :> :fi :uu :x :UU', 'tags': '', 'text': '\n Commands for the editor\n '}
+search_index_entry = {'aliases': ':I ::: :q :w :i :fi :wq :s :! :r :echo :fd :j :DD := :h :> :S :f :p :q! :A :dw :uu : :< :dd :: :u :UU :y :x', 'category': 'general', 'key': ':editor_command_group', 'no_prefix': ' :I ::: :q :w :i :fi :wq :s :! :r :echo :fd :j :DD := :h :> :S :f :p :q! :A :dw :uu : :< :dd :: :u :UU :y :x', '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 ac54ad182d..5344a1d8da 100644
--- a/docs/latest/api/evennia.utils.evmenu.html
+++ b/docs/latest/api/evennia.utils.evmenu.html
@@ -951,7 +951,7 @@ single question.
+aliases = ['yes', 'n', 'y', '__nomatch_command', 'a', 'abort', 'no']
@@ -977,7 +977,7 @@ single question.
+search_index_entry = {'aliases': 'yes n y __nomatch_command a abort no', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' yes n y __nomatch_command a abort no', '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 deffbf32a1..5f01fca0ee 100644
--- a/docs/latest/api/evennia.utils.evmore.html
+++ b/docs/latest/api/evennia.utils.evmore.html
@@ -149,7 +149,7 @@ the caller.msg() construct every time the page is updated.
-
-
aliases = ['abort', 'n', 'end', 'e', 'a', 'p', 't', 'top', 'previous', 'quit', 'q', 'next']
+aliases = ['t', 'n', 'q', 'previous', 'top', 'end', 'e', 'a', 'next', 'quit', 'p', 'abort']
@@ -175,7 +175,7 @@ the caller.msg() construct every time the page is updated.
-
-
search_index_entry = {'aliases': 'abort n end e a p t top previous quit q next', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' abort n end e a p t top previous quit q next', 'tags': '', 'text': '\n Manipulate the text paging. Catch no-input with aliases.\n '}
+search_index_entry = {'aliases': 't n q previous top end e a next quit p abort', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' t n q previous top end e a next quit p abort', 'tags': '', 'text': '\n Manipulate the text paging. Catch no-input with aliases.\n '}
diff --git a/docs/latest/genindex.html b/docs/latest/genindex.html
index 4ebcabafaa..aeb0713923 100644
--- a/docs/latest/genindex.html
+++ b/docs/latest/genindex.html
@@ -19855,6 +19855,12 @@
+ set_dt() (evennia.scripts.ondemandhandler.OnDemandHandler method)
+
+
set_flag() (evennia.contrib.full_systems.evscaperoom.objects.EvscaperoomObject method)
@@ -19877,6 +19883,12 @@
set_position() (evennia.contrib.full_systems.evscaperoom.objects.EvscaperoomObject method)
+ set_stage() (evennia.scripts.ondemandhandler.OnDemandHandler method)
+
+
set_task() (evennia.contrib.base_systems.ingame_python.scripts.EventHandler method)
set_trace() (in module evennia)
diff --git a/docs/latest/objects.inv b/docs/latest/objects.inv
index 5911abf7175f94886bcb0d3cdcfc11caa0b7b51c..241c3eaa83860e021c67cd7447bd021b7e546af8 100644
GIT binary patch
delta 91408
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