From 0b6621f30ee8263c5eeb0610541156809b8e8455 Mon Sep 17 00:00:00 2001
From: Evennia docbuilder action Feb 25, 2024 Feature: Add [ Feature: Add [Feature][pull3412]: Make it possible to add custom webclient css in
+ Feature: Make it possible to add custom webclient css in
[Feature][pull3367]: [Component contrib][pull3367extra] got better
+ Feature: Component contrib got better
inheritance, slot names to choose attr storage, speedups and fixes (ChrisLR) Feature: Break up Evennia 3.2.0¶
-
evennia.ON_DEMAND_HANDLER][new-ondemandhandler] for making it
+evennia.ON_DEMAND_HANDLER for making it
easier to implement changes that are calculated on-demand (Griatch)webclient/css/custom.css, same as for website (InspectorCaracal)DefaultObject.search method into several helpers to make
it easier to override (Griatch)
Feature: Remove too-strict password restrictions for Evennia logins, using django defaults instead for passwords with more varied characters.
Fix services command with no args would traceback (regression) (Griatch)
[Fix][pull3423]: Fix wilderness contrib error moving to an already existing +
Fix: Fix wilderness contrib error moving to an already existing wilderness room (InspectorCaracal)
[Fix][pull3425]: Don’t always include example the crafting recipe when +
Fix: Don’t always include example the crafting recipe when using the crafting contrib (InspectorCaracal)
[Fix][pull3426]: Traceback banning a channel using with only one nick +
Fix: Traceback banning a channel using with only one nick (InspectorCaracal)
[Fix][pull3434]: Adjust lunr search weights to void clashing of cmd-aliases over +
Fix: Adjust lunr search weights to void clashing of cmd-aliases over keys which caused some help entries to shadow others (InspectorCaracal)
Fix: Make menu/email_login contribs honor NEW_ACCOUNT_REGISTRATION_ENABLED
setting (Griatch)
Doc fixes (InspectorCaracal, Griatch)
[new-ondemandhandler][https://www.evennia.com/docs/latest/Components/OnDemandHandler.html] -[pull3412]: https://github.com/evennia/evennia/pull/3412 -[pull3423]: https://github.com/evennia/evennia/pull/3423 -[pull3425]: https://github.com/evennia/evennia/pull/3425 -[pull3426]: https://github.com/evennia/evennia/pull/3426 -[pull3434]: https://github.com/evennia/evennia/pull/3434 -[pull3367]: https://github.com/evennia/evennia/pull/3367 -[pull3367extra]: https://www.evennia.com/docs/latest/Contribs/Contrib-Components.html
This handler offers help for implementing on-demand state changes. On-demand means that the state won’t be computed until the player actually looks for it. Until they do, nothing happens. This is the most compute-efficient way to handle your systems and you should consider using this style of system whenever you can.
Take for example a gardening system. A player goes to a room and plants a seed. After a certain time, that plant will then move through a set of stages; it will move from “seedling” to ‘sprout’ to ‘flowering’ and then on to ‘wilting’ and eventually ‘dead’.
-Now, you could use utils.delay to track each phase, or use the TickerHandler to tick the flower. You could even use a Script on the flower.
Now, you could use utils.delay to track each phase, or use the TickerHandler to tick the flower. You could even use a Script on the flower. This would work like this:
The ticker/task/Script would automatically fire at regular intervals to update the plant through its stages.
Whenever a player comes to the room, the state is already updated on the flower, so they just read the state.
This will work fine, but if no one comes back to that room, that’s a lot of updating that no one will see. While maybe not a big deal for a single player, what if you have flowers in thousands of rooms, all growing indepedently? Or some even more complex system requiring calculation on every state change. You should avoid spending computing on things that bring nothing extra to your player base.
-Using the The on-demand style would instead work like this for the flower:
+Using the The on-demand style, the flower would instead work like this:
When the player plants the seed, we register a new on-demand task with the OnDemandHandler (described below). This registers the current timestamp when the plant starts to grow.
When a player enters the room and/or looks at the plant, then (and only then) we call the OnDemandHandler to see what state the flower it’s in. It will then use the current time to figure out how much time passed and which state the plant is thus in. Until someone looks, the plant is in its previous found state, because no-one needed to know until then. Same thing, if some other system needs to know this - they just figure out the state on the fly.
When the player plants the seed, we register the current timestamp - the time the plant starts to grow. We store this with the OnDemandHandler (below).
When a player enters the room and/or looks at the plant (or a code system needs to know the plant’s state), then (and only then) we check the current time to figure out the state the flower must now be in (the OnDemandHandler does the book-keeping for us). The key is that until we check, the flower object is completely inactive and uses no computing resources.
This handler is found as evennia.ON_DEMAND_HANDLER. It is meant to be integrated into your other code. Here’s an example of a flower that
This handler is found as evennia.ON_DEMAND_HANDLER. It is meant to be integrated into your other code. Here’s an example of a flower that goes through its stages of life in 12 hours.
# e.g. in mygame/typeclasses/objects.py
from evennia import ON_DEMAND_HANDLER
@@ -184,7 +185,7 @@
self.delete()
You could now create the rose and it would figure out its state only when you are actually looking at it. It will stay a seedling for 10 minutes (of in-game real time) before it sprouts. Within 12 hours it will be dead again (a very quickly growing rose!).
+You could now create the rose and it would figure out its state only when you are actually looking at it. It will stay a seedling for 10 minutes (of in-game real time) before it sprouts. Within 12 hours it will be dead again.
If you had a harvest command in your game, you could equally have it check the stage of bloom and give you different results depending on if you pick the rose at the right time or not.
The on-demand handler’s tasks survive a reload and will properly account for downtime.
The key can be a string, but also a typeclassed object (its string representation will be used, which normally includes its #dbref). You can also pass a callable - this will be called without arguments and is expected to return a string to use for the key. Finally, you can also pass OnDemandTask entities - these are the objects the handler uses under the hood to represent each task.
The category allows you to further categorize your demandhandler tasks to make sure they are unique. Since the handler is global, you need to make sure key + category is unique. While category is optional, if you use it you must also use it to retrieve your state later.
stages is a dict {dt: statename} or {dt: (statename, callable} that represents how much time (in seconds) before next stage begins. In the flower example above, it was 10 hours until the wilting state began. If a callable is also included, this will be called the first time that state is checked for. The callable takes a evennia.OnDemandTask as an argument and allows for tweaking the task on the fly. The dt can also be a float if you desire higher than per-second precision. Having stages is optional - sometimes you only want to know how much time has passed.
stages is a dict {dt: statename} or {dt: (statename, callable} that represents how much time (in seconds) from the start of the task to that stage to begin. In the flower example above, it was 10 hours until the wilting state began. If a callable is also included, this will be called the first time that state is checked for (only!). The callable takes a evennia.OnDemandTask as an argument and allows for tweaking the task on the fly. The dt can also be a float if you desire higher than per-second precision. Having stages is optional - sometimes you only want to know how much time has passed.
.get_dt() - get the current time (in seconds) since the task started. This is a float.
.get_stage() - get the current state name, such as “flowering” or “seedling”. If you didn’t specify any stages, this will return None, and you need to interpret the dt yourself to determine which state you are in.
Under the hood, the handler uses OnDemandTask objects. It can sometimes be practical to create tasks directly with these, and pass them to the handler in bulk:
from evennia import ON_DEMAND_HANDLER, OnDemandTask
-task1 = OnDemandTask("key1", {0: "state1", 100: "state2"})
-task2 = OnDemandTask("key2", category)
+task1 = OnDemandTask("key1", {0: "state1", 100: ("state2", my_callable)})
+task2 = OnDemandTask("key2", category="state-category")
+# batch-start on-demand tasks
ON_DEMAND_HANDLER.batch_add(task1, task2)
-# get tasks back
-task = ON_DEMAND_HANDLER.get("key1")
+# get the tasks back later
+task1 = ON_DEMAND_HANDLER.get("key1")
+task2 = ON_DEMAND_HANDLER.get("key1", category="state-category")
-# batch-delete (deactivate) from handler
+# batch-deactivate tasks you have available
ON_DEMAND_HANDLER.batch_remove(task1, task2)
Normally, when a sequence of stages have been cycled through, the task will just
Normally, when a sequence of stages have been cycled through, the task will just stop at the last stage indefinitely.
evennia.OnDemandTask.stagefunc_loop is an included static-method callable you can use to make the task loop. Here’s an example of how to use it:
from evennia import ON_DEMAND_HANDLER, OnDemandTask
@@ -242,14 +249,14 @@
)
This is a trap state that loops through its states depending on timing. Note that the looping helper callable will immediately reset the cycle back to the first stage, so the last stage will never be visible to the player/game system. So it’s a good (if optional) idea to name it with _* to remember this is a ‘virtual’ stage.
This is a trap state that loops through its states depending on timing. Note that the looping helper callable will immediately reset the cycle back to the first stage, so the last stage will never be visible to the player/game system. So it’s a good (if optional) idea to name it with _* to remember this is a ‘virtual’ stage. In the example above, the “deadly” state will cycle directly to “harmless”.
The OnDemandTask task instance has a .iterations variable that will go up by one for every loop.
If the state is not checked for a long time, the looping function will correctly update the .iterations of the task it would have used so far and figure out where in the cycle it is right now.
If the state is not checked for a long time, the looping function will correctly update the .iterations property on the task it would have used so far and figure out where in the cycle it is right now.
evennia.OnDemandTask.stagefunc_bounce is an included static-method callable you can use to ‘bounce’ the sequence of stages. That is, it will cycle to the end of the cycle and then reverse direction and cycle through the sequence in reverse.
To make this repreat indefinitely, you need to put the callables at both ends of the list:
+To make this repeat indefinitely, you need to put these callables at both ends of the list:
from evennia import ON_DEMAND_HANDLER, OnDemandTask
ON_DEMAND_HANDLER.add(
@@ -269,14 +276,21 @@
cold -> luke warm -> warm -> hot -> HOT!
-before reversing and go back:
+before reversing and go back over and over:
HOT! -> hot -> warm -> luke warm -> cold
-Over and over. The OnDemandTask instance has an .iterations property that will step up by one every time the sequence reverses.
-If the state is not checked for a long time, the bounce function will correctly update the .iterations property to the amount of iterations it would have done in that time, and figure out where in the cycle it must be right now.
+Unlike the stagefunc_loop callable, the bouncing one will visibly stay at the first and last stage until it changes to the next one in the sequence. The OnDemandTask instance has an .iterations property that will step up by one every time the sequence reverses.
+If the state is not checked for a long time, the bounce function will correctly update the .iterations property to the amount of iterations it would have done in that time, and figure out where in the cycle it is right now.
+
+When is it not suitable to do things on-demand?¶
+If you put your mind to it, you can probably make of your game on-demand. The player will not be the wiser.
+There is only really one case where on-demand doesn’t work, and that is if the player should be informed of something without first providing any input.
+If a player has to run check health command to see how much health they have, that could happen on demand. Similarly, a prompt could be set to update every time you move. But if you would an idling player to get a message popping up out of nowhere saying “You are feeling hungry” or to have some HP meter visually increasing also when standing still, then some sort of timer/ticker would be necessary to crank the wheels.
+Remember however, that in a text-medium (especially with traditional line-by-line MUD clients), there is only so much spam you can push on the player before they get overwhelmed.
+
diff --git a/docs/latest/_sources/Coding/Changelog.md.txt b/docs/latest/_sources/Coding/Changelog.md.txt
index 6e7ea0d7f2..4f4d92d266 100644
--- a/docs/latest/_sources/Coding/Changelog.md.txt
+++ b/docs/latest/_sources/Coding/Changelog.md.txt
@@ -30,7 +30,7 @@ Feb 25, 2024
setting (Griatch)
- Doc fixes (InspectorCaracal, Griatch)
-[new-ondemandhandler][https://www.evennia.com/docs/latest/Components/OnDemandHandler.html]
+[new-ondemandhandler]: https://www.evennia.com/docs/latest/Components/OnDemandHandler.html
[pull3412]: https://github.com/evennia/evennia/pull/3412
[pull3423]: https://github.com/evennia/evennia/pull/3423
[pull3425]: https://github.com/evennia/evennia/pull/3425
diff --git a/docs/latest/_sources/Components/OnDemandHandler.md.txt b/docs/latest/_sources/Components/OnDemandHandler.md.txt
index b8cf0e765c..1d4f2cfabe 100644
--- a/docs/latest/_sources/Components/OnDemandHandler.md.txt
+++ b/docs/latest/_sources/Components/OnDemandHandler.md.txt
@@ -4,19 +4,21 @@ This handler offers help for implementing on-demand state changes. On-demand mea
Take for example a gardening system. A player goes to a room and plants a seed. After a certain time, that plant will then move through a set of stages; it will move from "seedling" to 'sprout' to 'flowering' and then on to 'wilting' and eventually 'dead'.
-Now, you _could_ use `utils.delay` to track each phase, or use the [TickerHandler](./TickerHandler.md) to tick the flower. You could even use a [Script](./Scripts.md) on the flower.
+Now, you _could_ use `utils.delay` to track each phase, or use the [TickerHandler](./TickerHandler.md) to tick the flower. You could even use a [Script](./Scripts.md) on the flower. This would work like this:
+
1. The ticker/task/Script would automatically fire at regular intervals to update the plant through its stages.
2. Whenever a player comes to the room, the state is already updated on the flower, so they just read the state.
This will work fine, but if no one comes back to that room, that's a lot of updating that no one will see. While maybe not a big deal for a single player, what if you have flowers in thousands of rooms, all growing indepedently? Or some even more complex system requiring calculation on every state change. You should avoid spending computing on things that bring nothing extra to your player base.
-Using the The on-demand style would instead work like this for the flower:
-1. When the player plants the seed, we register a new on-demand task with the `OnDemandHandler` (described below). This registers _the current timestamp_ when the plant starts to grow.
-2. When a player enters the room and/or looks at the plant, _then_ (and only then) we call the `OnDemandHandler` to see what state the flower it's in. It will then use the _current time_ to figure out how much time passed and which state the plant is thus in. Until someone looks, the plant is in its previous found state, because no-one needed to know until then. Same thing, if some other system needs to know this - they just figure out the state on the fly.
+Using the The on-demand style, the flower would instead work like this:
+
+1. When the player plants the seed, we register _the current timestamp_ - the time the plant starts to grow. We store this with the `OnDemandHandler` (below).
+2. When a player enters the room and/or looks at the plant (or a code system needs to know the plant's state), _then_ (and only then) we check _the current time_ to figure out the state the flower must now be in (the `OnDemandHandler` does the book-keeping for us). The key is that _until we check_, the flower object is completely inactive and uses no computing resources.
## A blooming flower using the OnDemandHandler
-This handler is found as `evennia.ON_DEMAND_HANDLER`. It is meant to be integrated into your other code. Here's an example of a flower that
+This handler is found as `evennia.ON_DEMAND_HANDLER`. It is meant to be integrated into your other code. Here's an example of a flower that goes through its stages of life in 12 hours.
```python
# e.g. in mygame/typeclasses/objects.py
@@ -65,7 +67,7 @@ class Flower(Object):
```
-You could now create the rose and it would figure out its state only when you are actually looking at it. It will stay a seedling for 10 minutes (of in-game real time) before it sprouts. Within 12 hours it will be dead again (a very quickly growing rose!).
+You could now create the rose and it would figure out its state only when you are actually looking at it. It will stay a seedling for 10 minutes (of in-game real time) before it sprouts. Within 12 hours it will be dead again.
If you had a `harvest` command in your game, you could equally have it check the stage of bloom and give you different results depending on if you pick the rose at the right time or not.
@@ -87,9 +89,12 @@ ON_DEMAND_HANDLER.remove("key", category=None)
ON_DEMAND_HANDLER.clear(cateogory="category") #clear all with category
```
+```{sidebar} Not all stages may fire!
+This is important. If no-one checks in on the flower until a time when it's already wilting, it will simply _skip_ all its previous stages, directly to the 'wilting' stage. So don't write code for a stage that assumes previous stages to have made particular changes to the object - those changes may not have happened because those stages could have been skipped entirely!
+```
- The `key` can be a string, but also a typeclassed object (its string representation will be used, which normally includes its `#dbref`). You can also pass a `callable` - this will be called without arguments and is expected to return a string to use for the `key`. Finally, you can also pass [OnDemandTask](evennia.scripts.ondemandhandler.OnDemandTask) entities - these are the objects the handler uses under the hood to represent each task.
- The `category` allows you to further categorize your demandhandler tasks to make sure they are unique. Since the handler is global, you need to make sure `key` + `category` is unique. While `category` is optional, if you use it you must also use it to retrieve your state later.
-- `stages` is a `dict` `{dt: statename}` or `{dt: (statename, callable}` that represents how much time (in seconds) before next stage begins. In the flower example above, it was 10 hours until the `wilting` state began. If a `callable` is also included, this will be called *the first time* that state is checked for. The callable takes a `evennia.OnDemandTask` as an argument and allows for tweaking the task on the fly. The `dt` can also be a `float` if you desire higher than per-second precision. Having `stages` is optional - sometimes you only want to know how much time has passed.
+- `stages` is a `dict` `{dt: statename}` or `{dt: (statename, callable}` that represents how much time (in seconds) from _the start of the task_ to that stage to begin. In the flower example above, it was 10 hours until the `wilting` state began. If a `callable` is also included, this will be called *the first time* that state is checked for (only!). The callable takes a `evennia.OnDemandTask` as an argument and allows for tweaking the task on the fly. The `dt` can also be a `float` if you desire higher than per-second precision. Having `stages` is optional - sometimes you only want to know how much time has passed.
- `.get_dt()` - get the current time (in seconds) since the task started. This is a `float`.
- `.get_stage()` - get the current state name, such as "flowering" or "seedling". If you didn't specify any `stages`, this will return `None`, and you need to interpret the `dt` yourself to determine which state you are in.
@@ -99,22 +104,23 @@ Under the hood, the handler uses [OnDemandTask](evennia.scripts.ondemandhandler
```python
from evennia import ON_DEMAND_HANDLER, OnDemandTask
-task1 = OnDemandTask("key1", {0: "state1", 100: "state2"})
-task2 = OnDemandTask("key2", category)
+task1 = OnDemandTask("key1", {0: "state1", 100: ("state2", my_callable)})
+task2 = OnDemandTask("key2", category="state-category")
+# batch-start on-demand tasks
ON_DEMAND_HANDLER.batch_add(task1, task2)
-# get tasks back
-task = ON_DEMAND_HANDLER.get("key1")
+# get the tasks back later
+task1 = ON_DEMAND_HANDLER.get("key1")
+task2 = ON_DEMAND_HANDLER.get("key1", category="state-category")
-# batch-delete (deactivate) from handler
+# batch-deactivate tasks you have available
ON_DEMAND_HANDLER.batch_remove(task1, task2)
```
### Looping repeatedly
-Normally, when a sequence of `stages` have been cycled through, the task will just
-
+Normally, when a sequence of `stages` have been cycled through, the task will just stop at the last stage indefinitely.
`evennia.OnDemandTask.stagefunc_loop` is an included static-method callable you can use to make the task loop. Here's an example of how to use it:
@@ -133,17 +139,17 @@ ON_DEMAND_HANDLER.add(
)
```
-This is a trap state that loops through its states depending on timing. Note that the looping helper callable will _immediately_ reset the cycle back to the first stage, so the last stage will never be visible to the player/game system. So it's a good (if optional) idea to name it with `_*` to remember this is a 'virtual' stage.
+This is a trap state that loops through its states depending on timing. Note that the looping helper callable will _immediately_ reset the cycle back to the first stage, so the last stage will never be visible to the player/game system. So it's a good (if optional) idea to name it with `_*` to remember this is a 'virtual' stage. In the example above, the "deadly" state will cycle directly to "harmless".
The `OnDemandTask` task instance has a `.iterations` variable that will go up by one for every loop.
-If the state is not checked for a long time, the looping function will correctly update the `.iterations` of the task it would have used so far and figure out where in the cycle it is right now.
+If the state is not checked for a long time, the looping function will correctly update the `.iterations` property on the task it would have used so far and figure out where in the cycle it is right now.
### Bouncing back and forth
`evennia.OnDemandTask.stagefunc_bounce` is an included static-method callable you can use to 'bounce' the sequence of stages. That is, it will cycle to the end of the cycle and then reverse direction and cycle through the sequence in reverse.
-To make this repreat indefinitely, you need to put the callables at both ends of the list:
+To make this repeat indefinitely, you need to put these callables at both ends of the list:
```python
from evennia import ON_DEMAND_HANDLER, OnDemandTask
@@ -165,10 +171,20 @@ This will cycle
cold -> luke warm -> warm -> hot -> HOT!
-before reversing and go back:
+before reversing and go back over and over:
HOT! -> hot -> warm -> luke warm -> cold
-Over and over. The `OnDemandTask` instance has an `.iterations` property that will step up by one every time the sequence reverses.
+Unlike the `stagefunc_loop` callable, the bouncing one _will_ visibly stay at the first and last stage until it changes to the next one in the sequence. The `OnDemandTask` instance has an `.iterations` property that will step up by one every time the sequence reverses.
-If the state is not checked for a long time, the bounce function will correctly update the `.iterations` property to the amount of iterations it would have done in that time, and figure out where in the cycle it must be right now.
+If the state is not checked for a long time, the bounce function will correctly update the `.iterations` property to the amount of iterations it would have done in that time, and figure out where in the cycle it is right now.
+
+## When is it not suitable to do things on-demand?
+
+If you put your mind to it, you can probably make of your game on-demand. The player will not be the wiser.
+
+There is only really one case where on-demand doesn't work, and that is if the player should be informed of something _without first providing any input_.
+
+If a player has to run `check health` command to see how much health they have, that could happen on demand. Similarly, a prompt could be set to update every time you move. But if you would an idling player to get a message popping up out of nowhere saying "You are feeling hungry" or to have some HP meter visually increasing also when standing still, then some sort of timer/ticker would be necessary to crank the wheels.
+
+Remember however, that in a text-medium (especially with traditional line-by-line MUD clients), there is only so much spam you can push on the player before they get overwhelmed.
\ No newline at end of file
diff --git a/docs/latest/api/evennia.commands.default.account.html b/docs/latest/api/evennia.commands.default.account.html
index 375f6c988e..e86f477900 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.
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 '}¶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': '@delete @del', 'category': 'building', 'key': '@destroy', 'no_prefix': 'destroy delete del', 'tags': '', 'text': '\n permanently delete objects\n\n Usage:\n destroy[/switches] [obj, obj2, obj3, [dbref-dbref], ...]\n\n Switches:\n override - The destroy command will usually avoid accidentally\n destroying account objects. This switch overrides this safety.\n force - destroy without confirmation.\n Examples:\n destroy house, roof, door, 44-78\n destroy 5-10, flower, 45\n destroy/force north\n\n Destroys one or many objects. If dbrefs are used, a range to delete can be\n given, e.g. 4-10. Also the end points will be deleted. This command\n displays a confirmation before destroying, to make sure of your choice.\n You can specify the /force switch to bypass this confirmation.\n '}¶search_index_entry = {'aliases': '@del @delete', 'category': 'building', 'key': '@destroy', 'no_prefix': 'destroy del delete', 'tags': '', 'text': '\n permanently delete objects\n\n Usage:\n destroy[/switches] [obj, obj2, obj3, [dbref-dbref], ...]\n\n Switches:\n override - The destroy command will usually avoid accidentally\n destroying account objects. This switch overrides this safety.\n force - destroy without confirmation.\n Examples:\n destroy house, roof, door, 44-78\n destroy 5-10, flower, 45\n destroy/force north\n\n Destroys one or many objects. If dbrefs are used, a range to delete can be\n given, e.g. 4-10. Also the end points will be deleted. This command\n displays a confirmation before destroying, to make sure of your choice.\n You can specify the /force switch to bypass this confirmation.\n '}¶
aliases = ['@typeclasses', '@update', '@parent', '@swap', '@type']¶aliases = ['@parent', '@type', '@typeclasses', '@swap', '@update']¶
search_index_entry = {'aliases': '@typeclasses @update @parent @swap @type', 'category': 'building', 'key': '@typeclass', 'no_prefix': 'typeclass typeclasses update parent swap type', 'tags': '', 'text': "\n set or change an object's typeclass\n\n Usage:\n typeclass[/switch] <object> [= typeclass.path]\n typeclass/prototype <object> = prototype_key\n\n typeclasses or typeclass/list/show [typeclass.path]\n swap - this is a shorthand for using /force/reset flags.\n update - this is a shorthand for using the /force/reload flag.\n\n Switch:\n show, examine - display the current typeclass of object (default) or, if\n given a typeclass path, show the docstring of that typeclass.\n update - *only* re-run at_object_creation on this object\n meaning locks or other properties set later may remain.\n reset - clean out *all* the attributes and properties on the\n object - basically making this a new clean object. This will also\n reset cmdsets!\n force - change to the typeclass also if the object\n already has a typeclass of the same name.\n list - show available typeclasses. Only typeclasses in modules actually\n imported or used from somewhere in the code will show up here\n (those typeclasses are still available if you know the path)\n prototype - clean and overwrite the object with the specified\n prototype key - effectively making a whole new object.\n\n Example:\n type button = examples.red_button.RedButton\n type/prototype button=a red button\n\n If the typeclass_path is not given, the current object's typeclass is\n assumed.\n\n View or set an object's typeclass. If setting, the creation hooks of the\n new typeclass will be run on the object. If you have clashing properties on\n the old class, use /reset. By default you are protected from changing to a\n typeclass of the same name as the one you already have - use /force to\n override this protection.\n\n The given typeclass must be identified by its location using python\n dot-notation pointing to the correct module and class. If no typeclass is\n given (or a wrong typeclass is given). Errors in the path or new typeclass\n will lead to the old typeclass being kept. The location of the typeclass\n module is searched from the default typeclass directory, as defined in the\n server settings.\n\n "}¶search_index_entry = {'aliases': '@parent @type @typeclasses @swap @update', 'category': 'building', 'key': '@typeclass', 'no_prefix': 'typeclass parent type typeclasses swap update', 'tags': '', 'text': "\n set or change an object's typeclass\n\n Usage:\n typeclass[/switch] <object> [= typeclass.path]\n typeclass/prototype <object> = prototype_key\n\n typeclasses or typeclass/list/show [typeclass.path]\n swap - this is a shorthand for using /force/reset flags.\n update - this is a shorthand for using the /force/reload flag.\n\n Switch:\n show, examine - display the current typeclass of object (default) or, if\n given a typeclass path, show the docstring of that typeclass.\n update - *only* re-run at_object_creation on this object\n meaning locks or other properties set later may remain.\n reset - clean out *all* the attributes and properties on the\n object - basically making this a new clean object. This will also\n reset cmdsets!\n force - change to the typeclass also if the object\n already has a typeclass of the same name.\n list - show available typeclasses. Only typeclasses in modules actually\n imported or used from somewhere in the code will show up here\n (those typeclasses are still available if you know the path)\n prototype - clean and overwrite the object with the specified\n prototype key - effectively making a whole new object.\n\n Example:\n type button = examples.red_button.RedButton\n type/prototype button=a red button\n\n If the typeclass_path is not given, the current object's typeclass is\n assumed.\n\n View or set an object's typeclass. If setting, the creation hooks of the\n new typeclass will be run on the object. If you have clashing properties on\n the old class, use /reset. By default you are protected from changing to a\n typeclass of the same name as the one you already have - use /force to\n override this protection.\n\n The given typeclass must be identified by its location using python\n dot-notation pointing to the correct module and class. If no typeclass is\n given (or a wrong typeclass is given). Errors in the path or new typeclass\n will lead to the old typeclass being kept. The location of the typeclass\n module is searched from the default typeclass directory, as defined in the\n server settings.\n\n "}¶
search_index_entry = {'aliases': '@exam @ex', 'category': 'building', 'key': '@examine', 'no_prefix': 'examine exam ex', 'tags': '', 'text': '\n get detailed information about an object\n\n Usage:\n examine [<object>[/attrname]]\n examine [*<account>[/attrname]]\n\n Switch:\n account - examine an Account (same as adding *)\n object - examine an Object (useful when OOC)\n script - examine a Script\n channel - examine a Channel\n\n The examine command shows detailed game info about an\n object and optionally a specific attribute on it.\n If object is not specified, the current location is examined.\n\n Append a * before the search string to examine an account.\n\n '}¶search_index_entry = {'aliases': '@ex @exam', 'category': 'building', 'key': '@examine', 'no_prefix': 'examine ex exam', 'tags': '', 'text': '\n get detailed information about an object\n\n Usage:\n examine [<object>[/attrname]]\n examine [*<account>[/attrname]]\n\n Switch:\n account - examine an Account (same as adding *)\n object - examine an Object (useful when OOC)\n script - examine a Script\n channel - examine a Channel\n\n The examine command shows detailed game info about an\n object and optionally a specific attribute on it.\n If object is not specified, the current location is examined.\n\n Append a * before the search string to examine an account.\n\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 '}¶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': ': emote', 'category': 'general', 'key': 'pose', 'no_prefix': ' : emote', 'tags': '', 'text': "\n strike a pose\n\n Usage:\n pose <pose text>\n pose's <pose text>\n\n Example:\n pose is standing by the wall, smiling.\n -> others will see:\n Tom is standing by the wall, smiling.\n\n Describe an action being taken. The pose text will\n automatically begin with your name.\n "}¶search_index_entry = {'aliases': 'emote :', 'category': 'general', 'key': 'pose', 'no_prefix': ' emote :', 'tags': '', 'text': "\n strike a pose\n\n Usage:\n pose <pose text>\n pose's <pose text>\n\n Example:\n pose is standing by the wall, smiling.\n -> others will see:\n Tom is standing by the wall, smiling.\n\n Describe an action being taken. The pose text will\n automatically begin with your name.\n "}¶
search_index_entry = {'aliases': 'groups hierarchy', 'category': 'general', 'key': 'access', 'no_prefix': ' groups hierarchy', 'tags': '', 'text': '\n show your current game access\n\n Usage:\n access\n\n This command shows you the permission hierarchy and\n which permission groups you are a member of.\n '}¶search_index_entry = {'aliases': 'hierarchy groups', 'category': 'general', 'key': 'access', 'no_prefix': ' hierarchy groups', 'tags': '', 'text': '\n show your current game access\n\n Usage:\n access\n\n This command shows you the permission hierarchy and\n which permission groups you are a member of.\n '}¶
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 "}¶
Test the batch processor.
red_button = <module 'evennia.contrib.tutorials.red_button.red_button' from '/tmp/tmp6s9kfaez/1ca384ac609e8d56a830fad597e770e63d08ba2c/evennia/contrib/tutorials/red_button/red_button.py'>¶
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 '}¶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': '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 '}¶
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 '}¶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': '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 '}¶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': '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 '}¶
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 '}¶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': '@callback @calls @callbacks', 'category': 'building', 'key': '@call', 'no_prefix': 'call callback calls callbacks', 'tags': '', 'text': '\n Command to edit callbacks.\n '}¶search_index_entry = {'aliases': '@calls @callbacks @callback', 'category': 'building', 'key': '@call', 'no_prefix': 'call calls callbacks callback', 'tags': '', 'text': '\n Command to edit callbacks.\n '}¶
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 '}¶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': 'delchanalias delaliaschan', 'category': 'comms', 'key': 'delcom', 'no_prefix': ' delchanalias delaliaschan', 'tags': '', 'text': "\n remove a channel alias and/or unsubscribe from channel\n\n Usage:\n delcom <alias or channel>\n delcom/all <channel>\n\n If the full channel name is given, unsubscribe from the\n channel. If an alias is given, remove the alias but don't\n unsubscribe. If the 'all' switch is used, remove all aliases\n for that channel.\n "}¶search_index_entry = {'aliases': 'delaliaschan delchanalias', 'category': 'comms', 'key': 'delcom', 'no_prefix': ' delaliaschan delchanalias', 'tags': '', 'text': "\n remove a channel alias and/or unsubscribe from channel\n\n Usage:\n delcom <alias or channel>\n delcom/all <channel>\n\n If the full channel name is given, unsubscribe from the\n channel. If an alias is given, remove the alias but don't\n unsubscribe. If the 'all' switch is used, remove all aliases\n for that channel.\n "}¶
search_index_entry = {'aliases': 'q abort quit chicken out', 'category': 'evscaperoom', 'key': 'give up', 'no_prefix': ' q abort quit chicken out', 'tags': '', 'text': '\n Give up\n\n Usage:\n give up\n\n Abandons your attempts at escaping and of ever winning the pie-eating contest.\n\n '}¶search_index_entry = {'aliases': 'quit chicken out abort q', 'category': 'evscaperoom', 'key': 'give up', 'no_prefix': ' quit chicken out abort q', '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': '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 '}¶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': '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 '}¶
search_index_entry = {'aliases': ': pose', 'category': 'general', 'key': 'emote', 'no_prefix': ' : pose', 'tags': '', 'text': '\n Perform a free-form emote. Use /me to\n include yourself in the emote and /name\n to include other objects or characters.\n Use "..." to enact speech.\n\n Usage:\n emote <emote>\n :<emote\n\n Example:\n emote /me smiles at /peter\n emote /me points to /box and /lever.\n\n '}¶search_index_entry = {'aliases': 'pose :', 'category': 'general', 'key': 'emote', 'no_prefix': ' pose :', 'tags': '', 'text': '\n Perform a free-form emote. Use /me to\n include yourself in the emote and /name\n to include other objects or characters.\n Use "..." to enact speech.\n\n Usage:\n emote <emote>\n :<emote\n\n Example:\n emote /me smiles at /peter\n emote /me points to /box and /lever.\n\n '}¶
search_index_entry = {'aliases': 'ex e examine unfocus', 'category': 'evscaperoom', 'key': 'focus', 'no_prefix': ' ex e examine 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 e unfocus examine', 'category': 'evscaperoom', 'key': 'focus', 'no_prefix': ' ex e unfocus examine', 'tags': '', 'text': '\n Focus your attention on a target.\n\n Usage:\n focus <obj>\n\n Once focusing on an object, use look to get more information about how it\n looks and what actions is available.\n\n '}¶
search_index_entry = {'aliases': 'inventory inv give i', 'category': 'evscaperoom', 'key': 'get', 'no_prefix': ' inventory inv give i', 'tags': '', 'text': '\n Use focus / examine instead.\n\n '}¶search_index_entry = {'aliases': 'inv inventory i give', 'category': 'evscaperoom', 'key': 'get', 'no_prefix': ' inv inventory i give', 'tags': '', 'text': '\n Use focus / examine instead.\n\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 '}¶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': '@dice roll', 'category': 'general', 'key': 'dice', 'no_prefix': ' dice roll', 'tags': '', 'text': "\n roll dice\n\n Usage:\n dice[/switch] <nr>d<sides> [modifier] [success condition]\n\n Switch:\n hidden - tell the room the roll is being done, but don't show the result\n secret - don't inform the room about neither roll nor result\n\n Examples:\n dice 3d6 + 4\n dice 1d100 - 2 < 50\n\n This will roll the given number of dice with given sides and modifiers.\n So e.g. 2d6 + 3 means to 'roll a 6-sided die 2 times and add the result,\n then add 3 to the total'.\n Accepted modifiers are +, -, * and /.\n A success condition is given as normal Python conditionals\n (<,>,<=,>=,==,!=). So e.g. 2d6 + 3 > 10 means that the roll will succeed\n only if the final result is above 8. If a success condition is given, the\n outcome (pass/fail) will be echoed along with how much it succeeded/failed\n with. The hidden/secret switches will hide all or parts of the roll from\n everyone but the person rolling.\n "}¶search_index_entry = {'aliases': 'roll @dice', 'category': 'general', 'key': 'dice', 'no_prefix': ' roll dice', 'tags': '', 'text': "\n roll dice\n\n Usage:\n dice[/switch] <nr>d<sides> [modifier] [success condition]\n\n Switch:\n hidden - tell the room the roll is being done, but don't show the result\n secret - don't inform the room about neither roll nor result\n\n Examples:\n dice 3d6 + 4\n dice 1d100 - 2 < 50\n\n This will roll the given number of dice with given sides and modifiers.\n So e.g. 2d6 + 3 means to 'roll a 6-sided die 2 times and add the result,\n then add 3 to the total'.\n Accepted modifiers are +, -, * and /.\n A success condition is given as normal Python conditionals\n (<,>,<=,>=,==,!=). So e.g. 2d6 + 3 > 10 means that the roll will succeed\n only if the final result is above 8. If a success condition is given, the\n outcome (pass/fail) will be echoed along with how much it succeeded/failed\n with. The hidden/secret switches will hide all or parts of the roll from\n everyone but the person rolling.\n "}¶
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 '}¶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 '}¶
aliases = ['break lid', 'smash', 'smash lid']¶
search_index_entry = {'aliases': 'break lid smash smash lid', 'category': 'general', 'key': 'smash glass', 'no_prefix': ' break lid smash 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 '}¶
aliases = ['ex', 'feel', 'examine', 'get', 'listen', 'l']¶
search_index_entry = {'aliases': 'ex feel examine get listen l', 'category': 'general', 'key': 'look', 'no_prefix': ' ex feel examine get listen l', 'tags': '', 'text': "\n Looking around in darkness\n\n Usage:\n look <obj>\n\n ... not that there's much to see in the dark.\n\n "}¶
search_index_entry = {'aliases': 'move pull shiftroot push', 'category': 'tutorialworld', 'key': 'shift', 'no_prefix': ' move pull shiftroot push', 'tags': '', 'text': '\n Shifts roots around.\n\n Usage:\n shift blue root left/right\n shift red root left/right\n shift yellow root up/down\n shift green root up/down\n\n '}¶search_index_entry = {'aliases': 'shiftroot move pull push', 'category': 'tutorialworld', 'key': 'shift', 'no_prefix': ' shiftroot move pull 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 '}¶
aliases = ['push button', 'button', 'press button']¶aliases = ['button', 'push button', 'press button']¶
search_index_entry = {'aliases': 'push button button press button', 'category': 'tutorialworld', 'key': 'press', 'no_prefix': ' push button button press button', 'tags': '', 'text': '\n Presses a button.\n '}¶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 '}¶
aliases = ['hit', 'thrust', 'defend', 'bash', 'chop', 'pierce', 'parry', 'stab', 'kill', 'fight', 'slash']¶aliases = ['hit', 'thrust', 'kill', 'bash', 'defend', 'pierce', 'slash', 'parry', 'fight', 'stab', 'chop']¶
search_index_entry = {'aliases': 'hit thrust defend bash chop pierce parry stab kill fight slash', 'category': 'tutorialworld', 'key': 'attack', 'no_prefix': ' hit thrust defend bash chop pierce parry stab kill fight slash', 'tags': '', 'text': '\n Attack the enemy. Commands:\n\n stab <enemy>\n slash <enemy>\n parry\n\n stab - (thrust) makes a lot of damage but is harder to hit with.\n slash - is easier to land, but does not make as much damage.\n parry - forgoes your attack but will make you harder to hit on next\n enemy attack.\n\n '}¶search_index_entry = {'aliases': 'hit thrust kill bash defend pierce slash parry fight stab chop', 'category': 'tutorialworld', 'key': 'attack', 'no_prefix': ' hit thrust kill bash defend pierce slash parry fight stab chop', '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': '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 '}¶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 '}¶
aliases = ['feel around', 'fiddle', 'search', 'feel', 'l']¶aliases = ['feel', 'search', 'feel around', 'fiddle', 'l']¶
search_index_entry = {'aliases': 'feel around fiddle search feel l', 'category': 'tutorialworld', 'key': 'look', 'no_prefix': ' feel around fiddle search feel l', 'tags': '', 'text': '\n Look around in darkness\n\n Usage:\n look\n\n Look around in the darkness, trying\n to find something.\n '}¶search_index_entry = {'aliases': 'feel search feel around fiddle l', 'category': 'tutorialworld', 'key': 'look', 'no_prefix': ' feel search feel around fiddle l', 'tags': '', 'text': '\n Look around in darkness\n\n Usage:\n look\n\n Look around in the darkness, trying\n to find something.\n '}¶
directory = '/tmp/tmpj9pncrya/fe6a89bf8fe79433762c1af7590631f5c23373bb/evennia'¶directory = '/tmp/tmp6s9kfaez/1ca384ac609e8d56a830fad597e770e63d08ba2c/evennia'¶
directory = '/tmp/tmpj9pncrya/fe6a89bf8fe79433762c1af7590631f5c23373bb/evennia/game_template'¶directory = '/tmp/tmp6s9kfaez/1ca384ac609e8d56a830fad597e770e63d08ba2c/evennia/game_template'¶
aliases = [':h', ':echo', ':fd', ':i', ':!', ':uu', '::', ':y', ':I', ':dd', ':fi', ':q!', ':j', ':dw', ':', ':x', ':=', ':UU', ':w', ':p', ':S', ':wq', ':q', ':>', ':u', ':<', ':DD', ':s', ':f', ':r', ':::', ':A']¶aliases = [':q!', ':uu', ':!', ':fi', ':p', ':y', ':echo', ':dd', ':UU', ':j', ':wq', ':<', ':::', ':u', ':dw', ':f', '::', ':h', ':fd', ':I', ':', ':i', ':r', ':S', ':>', ':s', ':DD', ':w', ':x', ':q', ':=', ':A']¶
search_index_entry = {'aliases': ':h :echo :fd :i :! :uu :: :y :I :dd :fi :q! :j :dw : :x := :UU :w :p :S :wq :q :> :u :< :DD :s :f :r ::: :A', 'category': 'general', 'key': ':editor_command_group', 'no_prefix': ' :h :echo :fd :i :! :uu :: :y :I :dd :fi :q! :j :dw : :x := :UU :w :p :S :wq :q :> :u :< :DD :s :f :r ::: :A', 'tags': '', 'text': '\n Commands for the editor\n '}¶search_index_entry = {'aliases': ':q! :uu :! :fi :p :y :echo :dd :UU :j :wq :< ::: :u :dw :f :: :h :fd :I : :i :r :S :> :s :DD :w :x :q := :A', 'category': 'general', 'key': ':editor_command_group', 'no_prefix': ' :q! :uu :! :fi :p :y :echo :dd :UU :j :wq :< ::: :u :dw :f :: :h :fd :I : :i :r :S :> :s :DD :w :x :q := :A', 'tags': '', 'text': '\n Commands for the editor\n '}¶
aliases = ['a', 'no', 'abort', 'yes', 'n', '__nomatch_command', 'y']¶
search_index_entry = {'aliases': 'a no abort yes n __nomatch_command y', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' a no abort yes n __nomatch_command y', 'tags': '', 'text': '\n Handle a prompt for yes or no. Press [return] for the default choice.\n\n '}¶
aliases = ['e', 'abort', 'quit', 'q', 'top', 'previous', 'end', 'a', 'n', 'p', 'next', 't']¶aliases = ['a', 'abort', 'previous', 'e', 'q', 'n', 'p', 'quit', 't', 'top', 'end', 'next']¶
search_index_entry = {'aliases': 'e abort quit q top previous end a n p next t', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' e abort quit q top previous end a n p next t', 'tags': '', 'text': '\n Manipulate the text paging. Catch no-input with aliases.\n '}¶search_index_entry = {'aliases': 'a abort previous e q n p quit t top end next', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' a abort previous e q n p quit t top end next', 'tags': '', 'text': '\n Manipulate the text paging. Catch no-input with aliases.\n '}¶
`VCrj!VUoM&@e+jv181Iyz>L%}g!Jy&
zvv_~vP{{`vtTAA`tJq6==BlX&;Y%xkE!}Kz(sWXtip6Y_5{=9d=`o!P1g$33iS$ZH
zh*p?%Q#2U}+S1`a>&mjtggz`0@#jEB86XY}S}CtC;P~^m+Hs<=XNg1OW5$7jEcH1E
z7~rzN2F-ty(RQlDg4v>vzHmsxT{(t$ssw*a{-RRLJD5_m#9X
zoKONCSn9>6J2i7cN+fwC&2xum_}~o79i4N^TQc!lI?>)qPdpEEN9g=qcm`;Czc0(Q
z-QTfRA#2l?>@qrbA-30&{ObB4-_sC@2$8_Ffrn7uNb-LvE?QdFT1-%L2=IY7(EK|>
z1&rt9R?vtdl)(fFZwdLbZoCpgkS_%XP*tRb^M9!I7xFwI;vpSErpQ9}?j)HP2bDp8tR{cV)OqjkQIN$VP8lu}lnO9trn!qUftSpBHlr|{YlI0M
zINC3n3I2$p+Vfh==b!CFpblCRfE2=M0-SjWrnHEEX3hyXCpe`5XS)_5b)zSBSBQ68
znzZRhW`oyJFO+bsdN2pDwv-DKzLt(&6@?zF7Zg^3Lq;1z1?)JJHH&{JMk8$^TDt*j
z$TgD@opQ;
z9++YH>i{V`o1u
@tH+c
z_s`_v)1U2$59{l5YYXY+0T{~rEzobWYb=oc_~B!w3c#DAs=#ow_JvzD*dZ>O`dsZ=
z3}qwjg{ayfMckZz9}tj>yeK?nYt6!9{*?Dz*
yx;vb*y*g{t1uqetF;@k3eWP
zE|)w9M@1qB4