An Account represents a unique game account - one player playing the game. Whereas a player can potentially connect to the game from several Clients/Sessions, they will normally have only one Account.
-
The Account object has no in-game representation. In order to actually get on the game the Account must puppet an Object (normally a Character).
+
The Account object has no in-game representation. In order to actually get on the game the Account must puppet an Object (normally a Character).
Exactly how many Sessions can interact with an Account and its Puppets at once is determined by
Evennia’s MULTISESSION_MODE
Apart from storing login information and other account-specific data, the Account object is what is chatting on Evennia’s default Channels. It is also a good place to store Permissions to be consistent between different in-game characters. It can also hold player-level configuration options.
Characters is an in-game Object commonly used to represent the player’s in-game avatar. The empty Character class is found in mygame/typeclasses/characters.py. It inherits from DefaultCharacter and the (by default empty) ObjectParent class (used if wanting to add share properties between all in-game Objects).
+
When a new Account logs in to Evennia for the first time, a new Character object is created and the Account will be set to puppet it. By default this first Character will get the same name as the Account (but Evennia supports alternative connection-styles if so desired).
+
A Character object will usually have a Default Commandset set on itself at creation, or the account will not be able to issue any in-game commands!
+
If you want to change the default character created by the default commands, you can change it in settings:
+
+
+
\ No newline at end of file
diff --git a/docs/1.0/Components/Commands.html b/docs/1.0/Components/Commands.html
index 120fdb27af..f33fa2f1de 100644
--- a/docs/1.0/Components/Commands.html
+++ b/docs/1.0/Components/Commands.html
@@ -539,7 +539,7 @@ corresponds to a known command. This is how the command handler sequence looks f
The caller’s own currently active CmdSet.
CmdSets defined on the current account, if caller is a puppeted object.
CmdSets defined on the Session itself.
-
The active CmdSets of eventual objects in the same location (if any). This includes commands on Exits.
+
The active CmdSets of eventual objects in the same location (if any). This includes commands on Exits.
Sets of dynamically created System commands representing available Communications
Exits are in-game Objects connecting other objects (usually Rooms) together.
+
An object named north or in might be exits, as well as door, portal or jumpoutthewindow.
+
An exit has two things that separate them from other objects.
+
+
Their .destination property is set and points to a valid target location. This fact makes it easy and fast to locate exits in the database.
+
Exits define a special Transit Command on themselves when they are created. This command is named the same as the exit object and will, when called, handle the practicalities of moving the character to the Exits’s .destination - this allows you to just enter the name of the exit on its own to move around, just as you would expect.
+
+
The default exit functionality is all defined on the DefaultExit typeclass. You could in principle completely change how exits work in your game by overriding this - it’s not recommended though, unless you really know what you are doing).
+
Exits are locked using an access_type called traverse and also make use of a few hook methods for giving feedback if the traversal fails. See evennia.DefaultExit for more info.
+
Exits are normally overridden on a case-by-case basis, but if you want to change the default exit createad by rooms like dig , tunnel or open you can change it in settings:
+
BASE_EXIT_TYPECLASS = "typeclasses.exits.Exit"
+
+
+
In mygame/typeclasses/exits.py there is an empty Exit class for you to modify.
The traversing obj sends a command that matches the Exit-command name on the Exit object. The cmdhandler detects this and triggers the command defined on the Exit. Traversal always involves the “source” (the current location) and the destination (this is stored on the Exit object).
+
The Exit command checks the traverse lock on the Exit object
+
The Exit command triggers at_traverse(obj,destination) on the Exit object.
+
In at_traverse, object.move_to(destination) is triggered. This triggers the following hooks, in order:
+
+
obj.at_pre_move(destination) - if this returns False, move is aborted.
+
origin.at_pre_leave(obj,destination)
+
obj.announce_move_from(destination)
+
Move is performed by changing obj.location from source location to destination.
+
obj.announce_move_to(source)
+
destination.at_object_receive(obj,source)
+
obj.at_post_move(source)
+
+
+
On the Exit object, at_post_traverse(obj,source) is triggered.
+
+
If the move fails for whatever reason, the Exit will look for an Attribute err_traverse on itself and display this as an error message. If this is not found, the Exit will instead call at_failed_traverse(obj) on itself.
+
+
+
\ No newline at end of file
diff --git a/docs/1.0/Components/Locks.html b/docs/1.0/Components/Locks.html
index 46279702cf..bd51887375 100644
--- a/docs/1.0/Components/Locks.html
+++ b/docs/1.0/Components/Locks.html
@@ -217,12 +217,12 @@ using a attrcreate - who may create new attributes on the object (default True)
All in-game objects in Evennia, be it characters, chairs, monsters, rooms or hand grenades are
-represented by an Evennia Object. Objects form the core of Evennia and is probably what you’ll
-spend most time working with. Objects are Typeclassed entities.
-
An Evennia Object is, by definition, a Python class that includes evennia.objects.objects.DefaultObject among its parents. Evennia defines several subclasses of DefaultObject in the following inheritance tree:
All in-game objects in Evennia, be it characters, chairs, monsters, rooms or hand grenades are jointly referred to as an Evennia Object. An Object is generally something you can look and interact with in the game world. When a message travels from the client, the Object-level is the last stop.
+
Objects form the core of Evennia and is probably what you’ll spend most time working with. Objects are Typeclassed entities.
+
An Evennia Object is, by definition, a Python class that includes evennia.objects.objects.DefaultObject among its parents. Evennia defines several subclasses of DefaultObject:
+
+
Object - the base in-game entity. Found in mygame/typeclasses/objects.py. Inherits directly from DefaultObject.
+
Characters - the normal in-game Character, controlled by a player. Found in mygame/typeclasses/characters.py. Inherits from DefaultCharacter, which is turn a child of DefaultObject.
+
Rooms - a location in the game world. Found in mygame/typeclasses/rooms.py. Inherits from DefaultRoom, which is in turn a child of DefaultObject).
+
Exits - represents a one-way connection to another location. Found in mygame/typeclasses/exits.py (inherits from DefaultExit, which is in turn a child of DefaultObject).
Here, arrows indicate inheritance and point from-child-to-parent.
-
So, for example DefaultObject is a child of DefaultCharacter (in the Evennia library), which is a parent of Character (in the game dir). The class in the game-dir is the one you should modify for your game.
-
Note the ObjectParent class. This is an empty mix-in that all classes in the game-dir inherits from. It’s where you put things you want all these classes to have.
+
For an explanation of ObjectParent, see next section.
You can easily add your own in-game behavior by either modifying one of the typeclasses in your game dir or by inheriting from them.
+
The Object class is meant to be used as the basis for creating things that are neither characters, rooms or exits - anything from weapons and armour, equipment and houses can be represented by extending the Object class. Depending on your game, this also goes for NPCs and monsters (in some games you may want to treat NPCs as just an un-puppeted Character instead).
+
You should not use Objects for game systems. Don’t use an ‘invisible’ Object for tracking weather, combat, economy or guild memberships - that’s what Scripts are for.
This functionality is shared by all sub-classes of DefaultObject. You can easily add your own in-game behavior by either modifying one of the typeclasses in your game dir or by inheriting further from them.
You can put your new typeclass directly in the relevant module, or you could organize your code in some other way. Here we assume we make a new module mygame/typeclasses/flowers.py:
(The create command will auto-append the most likely path to your typeclass, if you enter the
-call manually you have to give the full path to the class. The create.create_object function is
-powerful and should be used for all coded object creating (so this is what you use when defining
-your own building commands).
-
This particular Rose class doesn’t really do much, all it does it make sure the attribute
-desc(which is what the look command looks for) is pre-set, which is pretty pointless since you
-will usually want to change this at build time (using the desc command or using the Spawner).
+
(The create command will auto-append the most likely path to your typeclass, if you enter the call manually you have to give the full path to the class. The create.create_object function is powerful and should be used for all coded object creating (so this is what you use when defining your own building commands).
+
This particular Rose class doesn’t really do much, all it does it make sure the attribute desc(which is what the look command looks for) is pre-set, which is pretty pointless since you will usually want to change this at build time (using the desc command or using the Spawner).
Beyond the properties assigned to all typeclassed objects (see that page for a list
@@ -204,16 +204,14 @@ of those), the Object also has the following custom properties:
aliases - a handler that allows you to add and remove aliases from this object. Use aliases.add() to add a new alias and aliases.remove() to remove one.
location - a reference to the object currently containing this object.
home is a backup location. The main motivation is to have a safe place to move the object to if its location is destroyed. All objects should usually have a home location for safety.
-
destination - this holds a reference to another object this object links to in some way. Its main use is for Exits, it’s otherwise usually unset.
+
destination - this holds a reference to another object this object links to in some way. Its main use is for Exits, it’s otherwise usually unset.
nicks - as opposed to aliases, a Nick holds a convenient nickname replacement for a real name, word or sequence, only valid for this object. This mainly makes sense if the Object is used as a game character - it can then store briefer shorts, example so as to quickly reference game commands or other characters. Use nicks.add(alias, realname) to add a new one.
account - this holds a reference to a connected Account controlling this object (if any). Note that this is set also if the controlling account is not currently online - to test if an account is online, use the has_account property instead.
sessions - if account field is set and the account is online, this is a list of all active sessions (server connections) to contact them through (it may be more than one if multiple connections are allowed in settings).
has_account - a shorthand for checking if an online account is currently connected to this object.
contents - this returns a list referencing all objects ‘inside’ this object (i,e. which has this object set as their location).
exits - this returns all objects inside this object that are Exits, that is, has the destination property set.
-
-
The last two properties are special:
-
+
appearance_template - this helps formatting the look of the Object when someone looks at it (see next section).l
cmdset - this is a handler that stores all command sets defined on the object (if any).
scripts - this is a handler that manages Scripts attached to the object (if any).
@@ -224,83 +222,47 @@ of those), the Object also has the following custom properties:
search() - this is a convenient shorthand to search for a specific object, at a given location or globally. It’s mainly useful when defining commands (in which case the object executing the command is named caller and one can do caller.search() to find objects in the room to operate on).
execute_cmd() - Lets the object execute the given string as if it was given on the command line.
move_to - perform a full move of this object to a new location. This is the main move method and will call all relevant hooks, do all checks etc.
-
clear_exits() - will delete all Exits to and from this object.
+
clear_exits() - will delete all Exits to and from this object.
clear_contents() - this will not delete anything, but rather move all contents (except Exits) to their designated Home locations.
delete() - deletes this object, first calling clear_exits() and clear_contents().
+
return_appearance is the main hook letting the object visually describe itself.
The Object Typeclass defines many more hook methods beyond at_object_creation. Evennia calls these hooks at various points. When implementing your custom objects, you will inherit from the base parent and overload these hooks with your own custom code. See evennia.objects.objects for an updated list of all the available hooks or the API for DefaultObject here.
The DefaultCharacters is the root class for player in-game entities. They are usually puppeted by Accounts.
-
When a new Account logs in to Evennia for the first time, a new Character object is created and the Account object is assigned to the account attribute (but Evennia supports alternative connection-styles if so desired).
-
A Character object must have a Default Commandset set on itself at creation, or the account will not be able to issue any commands!
-
If you want to change the default character created by the default commands, you can change it in settings:
When you type look<obj>, this is the sequence of events that happen:
+
+
The command checks if the caller of the command (the ‘looker’) passes the viewlock of the target obj. If not, they will not find anything to look at (this is how you make objects invisible).
+
The look command calls caller.at_look(obj) - that is, the at_look hook on the ‘looker’ (the caller of the command) is called to perform the look on the target object. The command will echo whatever this hook returns.
+
caller.at_look calls and returns the outcome of obj.return_apperance(looker,**kwargs). Here looker is the caller of the command. In other words, we ask the obj to descibe itself to looker.
+
obj.return_appearance makes use of its .appearance_template property and calls a slew of helper-hooks to populate this template. This is how the template looks by default:
Rooms are the root containers of all other objects.
-
The only thing really separating a room from any other object is that they have no location of their own and that default commands like dig creates objects of this class - so if you want to expand your rooms with more functionality, just inherit from evennia.DefaultRoom.
-
To change the default room created by dig, tunnel and other commands, change it in settings:
-
BASE_ROOM_TYPECLASS = "typeclases.rooms.Room"
-
-
-
The empty class in mygame/typeclasses/rooms.py is a good place to start!
Exits are objects connecting other objects (usually Rooms) together. An object named North or in might be an exit, as well as door, portal or jump out the window. An exit has two things that separate them from other objects. Firstly, their destination property is set and points to a valid object. This fact makes it easy and fast to locate exits in the database. Secondly, exits define a special Transit Command on themselves when they are created. This command is named the same as the exit object and will, when called, handle the practicalities of moving the character to the Exits’s destination - this allows you to just enter the name of the exit on its own to move around, just as you would expect.
-
The exit functionality is all defined on the Exit typeclass, so you could in principle completely change how exits work in your game (it’s not recommended though, unless you really know what you are doing). Exits are locked using an access_type called traverse and also make use of a few hook methods for giving feedback if the traversal fails. See evennia.DefaultExit for more info.
-
Exits are normally overridden on a case-by-case basis, but if you want to change the default exit createad by rooms like dig , tunnel or open you can change it in settings:
-
BASE_EXIT_TYPECLASS = "typeclasses.exits.Exit"
-
-
-
In mygame/typeclasses/exits.py there is an empty Exit class for you to modify.
The traversing obj sends a command that matches the Exit-command name on the Exit object. The cmdhandler detects this and triggers the command defined on the Exit. Traversal always involves the “source” (the current location) and the destination (this is stored on the Exit object).
-
The Exit command checks the traverse lock on the Exit object
-
The Exit command triggers at_traverse(obj,destination) on the Exit object.
-
In at_traverse, object.move_to(destination) is triggered. This triggers the following hooks, in order:
-
-
obj.at_pre_move(destination) - if this returns False, move is aborted.
-
origin.at_pre_leave(obj,destination)
-
obj.announce_move_from(destination)
-
Move is performed by changing obj.location from source location to destination.
-
obj.announce_move_to(source)
-
destination.at_object_receive(obj,source)
-
obj.at_post_move(source)
-
-
On the Exit object, at_post_traverse(obj,source) is triggered.
+
Each field of the template is populated by a matching helper method (and their default returns):
+
+
name -> obj.get_display_name(looker,**kwargs) - returns obj.name.
header -> obj.get_display_header(looker,**kwargs) - empty by default.
+
footer -> obj.get_display_footer(looker,**kwargs) - empty by default.
+
exits -> obj.get_display_exits(looker,**kwargs) - a list of DefaultExit-inheriting objects found inside this object (usually only present if obj is a Room).
+
characters -> obj.get_display_characters(looker,**kwargs) - a list of DefaultCharacter-inheriting entities inside this object.
+
things -> obj.get_display_things(looker,**kwargs) - a list of all other Objects inside obj.
+
+
+
obj.format_appearance(string,looker,**kwargs) is the last step the populated template string goes through. This can be used for final adjustments, such as stripping whitespace. The return from this method is what the user will see.
-
If the move fails for whatever reason, the Exit will look for an Attribute err_traverse on itself and display this as an error message. If this is not found, the Exit will instead call at_failed_traverse(obj) on itself.
Object, Character, Room and Exit also inherit from mygame.typeclasses.objects.ObjectParent.
-This is an empty ‘mixin’ class. Optionally, you can modify this class if you want to easily add some common functionality to all your Objects, Characters, Rooms and Exits at once. You can still customize each subclass separately (see the Python docs on multiple inheritance for details).
-
Here is an example:
-
# in mygame/typeclasses/objects.py
-# ...
-
-fromevennia.objects.objectsimportDefaultObject
-
-classObjectParent:
- defat_pre_get(self,getter,**kwargs):
- # make all entities by default un-pickable
- returnFalse
-
-
-
Now all of Object, Exit. Room and Character default to not being able to be picked up using the get command.
+
As each of these hooks (and the template itself) can be overridden in your child class, you can customize your look extensively. You can also have objects look different depending on who is looking at them. The extra **kwargs are not used by default, but are there to allow you to pass extra data into the system if you need it (like light conditions etc.)
@@ -320,7 +282,7 @@ This is an empty ‘mixin’ class. Optionally, you can modify this class if you
modules |
Rooms are in-game Objects representing the root containers of all other objects.
+
The only thing technically separating a room from any other object is that they have no location of their own and that default commands like dig creates objects of this class - so if you want to expand your rooms with more functionality, just inherit from evennia.DefaultRoom.
+
To change the default room created by dig, tunnel and other default commands, change it in settings:
+
BASE_ROOM_TYPECLASS = "typeclases.rooms.Room"
+
+
+
The empty class in mygame/typeclasses/rooms.py is a good place to start!
+
While the default Room is very simple, there are several Evennia contribs customizing and extending rooms with more functionality.
diff --git a/docs/1.0/Contribs/Contrib-Ingame-Python.html b/docs/1.0/Contribs/Contrib-Ingame-Python.html
index 10db0ce2c0..88a537fe9e 100644
--- a/docs/1.0/Contribs/Contrib-Ingame-Python.html
+++ b/docs/1.0/Contribs/Contrib-Ingame-Python.html
@@ -184,7 +184,7 @@ using ingame-python events.
defines the context in which we would like to call some arbitrary code. For
instance, one event is defined on exits and will fire every time a character
traverses through this exit. Events are described on a typeclass
-(exits in our example). All objects inheriting from this
+(exits in our example). All objects inheriting from this
typeclass will have access to this event.
Callbacks can be set on individual objects, on events defined in code.
These callbacks can contain arbitrary code and describe a specific
diff --git a/docs/1.0/Evennia-API.html b/docs/1.0/Evennia-API.html
index 1c329571cc..470f362f05 100644
--- a/docs/1.0/Evennia-API.html
+++ b/docs/1.0/Evennia-API.html
@@ -171,9 +171,9 @@ The flat API is defined in
Here we see the (somewhat simplified) Python class inheritance tree that you as an Evennia developer will see, along with the three instanced entities.
Objects represent stuff you will actually see in-game and its child classes implement all the handlers, helper code and the hook methods that Evennia makes use of. In your mygame/ folder you just import these and overload the things you want to modify. In this way, the Crossbow is modified to do the stuff only crossbows can do and CastleRoom adds whatever it is that is special about rooms in the castle.
-
When creating a new entity in-game, a new row will automatically be created in the database table and then Trigger will appear in-game! If we, in code, search the database for Trigger, we will get an instance of the Character class back - a Python object we can work with normally.
+
When creating a new entity in-game, a new row will automatically be created in the database table and then Trigger will appear in-game! If we, in code, search the database for Trigger, we will get an instance of the Character class back - a Python object we can work with normally.
Looking at this you may think that you will be making a lot of classes for every different object in the game. Your exact layout is up to you but Evennia also offers other ways to customize each individual object. Read on.
diff --git a/docs/1.0/Howtos/Beginner-Tutorial/Part1/Beginner-Tutorial-Gamedir-Overview.html b/docs/1.0/Howtos/Beginner-Tutorial/Part1/Beginner-Tutorial-Gamedir-Overview.html
index 9c05f815e1..7ecaa2539e 100644
--- a/docs/1.0/Howtos/Beginner-Tutorial/Part1/Beginner-Tutorial-Gamedir-Overview.html
+++ b/docs/1.0/Howtos/Beginner-Tutorial/Part1/Beginner-Tutorial-Gamedir-Overview.html
@@ -217,9 +217,9 @@ are expected to copy&paste the changes you need from accounts.py (Python-path: typeclasses.accounts) - An Account represents the player connecting to the game. It holds information like email, password and other out-of-character details.
channels.py (Python-path: typeclasses.channels) - Channels are used to manage in-game communication between players.
objects.py (Python-path: typeclasses.objects) - Objects represent all things having a location within the game world.
-
characters.py (Python-path: typeclasses.characters) - The Character is a subclass of Objects, controlled by Accounts - they are the player’s avatars in the game world.
-
rooms.py (Python-path: typeclasses.rooms) - A Room is also a subclass of Object; describing discrete locations. While the traditional term is ‘room’, such a location can be anything and on any scale that fits your game, from a forest glade, an entire planet or an actual dungeon room.
-
exits.py (Python-path: typeclasses.exits) - Exits is another subclass of Object. Exits link one Room to another.
+
characters.py (Python-path: typeclasses.characters) - The Character is a subclass of Objects, controlled by Accounts - they are the player’s avatars in the game world.
+
rooms.py (Python-path: typeclasses.rooms) - A Room is also a subclass of Object; describing discrete locations. While the traditional term is ‘room’, such a location can be anything and on any scale that fits your game, from a forest glade, an entire planet or an actual dungeon room.
+
exits.py (Python-path: typeclasses.exits) - Exits is another subclass of Object. Exits link one Room to another.
scripts.py (Python-path: typeclasses.scripts) - Scripts are ‘out-of-character’ objects. They have no location in-game and can serve as basis for anything that needs database persistence, such as combat, weather, or economic systems. They also have the ability to execute code repeatedly, on a timer.
diff --git a/docs/1.0/Howtos/Tutorial-Building-a-Mech.html b/docs/1.0/Howtos/Tutorial-Building-a-Mech.html
index c4658ae28e..1f020d2299 100644
--- a/docs/1.0/Howtos/Tutorial-Building-a-Mech.html
+++ b/docs/1.0/Howtos/Tutorial-Building-a-Mech.html
@@ -128,7 +128,7 @@ Let’s describe it.
The Account represents the real person logging in and has no game-world existence.
Any Object can be puppeted by an Account (with proper permissions).
Characters, Rooms, and Exits are just children of normal Objects.
Any Object can be inside another (except if it creates a loop).
Any Object can store custom sets of commands on it. Those commands can:
diff --git a/docs/1.0/Howtos/Tutorial-Building-a-Train.html b/docs/1.0/Howtos/Tutorial-Building-a-Train.html
index 0c03f2be21..e1f3952475 100644
--- a/docs/1.0/Howtos/Tutorial-Building-a-Train.html
+++ b/docs/1.0/Howtos/Tutorial-Building-a-Train.html
@@ -149,7 +149,7 @@ and back (assuming we created it in limbo).
Using the telcommand like shown above is obviously not what we want. @tel is an admin command and normal players will thus never be able to enter the train!
-
It is also not really a good idea to use Exits to get in and out of the train - Exits are (at least by default) objects too. They point to a specific destination. If we put an Exit in this room leading inside the train it would stay here when the train moved away (still leading into the train like a magic portal!). In the same way, if we put an Exit object inside the train, it would always point back to this room, regardless of where the Train has moved.
+
It is also not really a good idea to use Exits to get in and out of the train - Exits are (at least by default) objects too. They point to a specific destination. If we put an Exit in this room leading inside the train it would stay here when the train moved away (still leading into the train like a magic portal!). In the same way, if we put an Exit object inside the train, it would always point back to this room, regardless of where the Train has moved.
Now, one could define custom Exit types that move with the train or change their destination in the right way - but this seems to be a pretty cumbersome solution.
What we will do instead is to create some new commands: one for entering the train and
another for leaving it again. These will be stored on the train object and will thus be made
@@ -446,7 +446,7 @@ train again., and we’re ready to ride it around!
Make it impossible to exit and enter the train mid-ride. This could be made by having the enter/exit commands check so the train is not moving before allowing the caller to proceed.
Have train conductor commands that can override the automatic start/stop.
Allow for in-between stops between the start- and end station
-
Have a rail road track instead of hard-coding the rooms in the train object. This could for example be a custom Exit only traversable by trains. The train will follow the track. Some track segments can split to lead to two different rooms and a player can switch the direction to which room it goes.
+
Have a rail road track instead of hard-coding the rooms in the train object. This could for example be a custom Exit only traversable by trains. The train will follow the track. Some track segments can split to lead to two different rooms and a player can switch the direction to which room it goes.
An NPC typeclass that can react when someone enters.
-
A custom Room typeclass that can tell the NPC that someone entered.
+
A custom Room typeclass that can tell the NPC that someone entered.
We will also tweak our default Character typeclass a little.
# in mygame/typeclasses/npcs.py (for example)
diff --git a/docs/1.0/_modules/evennia/locks/lockfuncs.html b/docs/1.0/_modules/evennia/locks/lockfuncs.html
index 1e7b34bd98..1aed9f6c2e 100644
--- a/docs/1.0/_modules/evennia/locks/lockfuncs.html
+++ b/docs/1.0/_modules/evennia/locks/lockfuncs.html
@@ -589,7 +589,8 @@
is_ooc() This is normally used to lock a Command, so it can be used
- only when out of character.
+ only when out of character. When not logged in at all, this
+ function will still return True. """obj=accessed_obj.objifhasattr(accessed_obj,"obj")elseaccessed_objaccount=obj.accountifhasattr(obj,"account")elseobj
@@ -598,9 +599,14 @@
try:session=accessed_obj.sessionexceptAttributeError:
- session=account.sessions.get()[0]# note-this doesn't work well
+ # note-this doesn't work well# for high multisession mode. We may need# to change to sessiondb to resolve this
+ sessions=session=account.sessions.get()
+ session=sessions[0]ifsessionselseNone
+ ifnotsession:
+ # this suggests we are not even logged in; treat as ooc.
+ returnTruetry:returnnotaccount.get_puppet(session)exceptTypeError:
diff --git a/docs/1.0/_sources/Coding/Changelog.md.txt b/docs/1.0/_sources/Coding/Changelog.md.txt
index fdb2573585..8a0fa4856d 100644
--- a/docs/1.0/_sources/Coding/Changelog.md.txt
+++ b/docs/1.0/_sources/Coding/Changelog.md.txt
@@ -4,6 +4,9 @@
- Feature: Add support for saving `deque` with `maxlen` to Attributes (before
`maxlen` was ignored).
+- Fix: More unit tests for scripts (Storsorken)
+- Docs: Made separate doc pages for Exits, Characters and Rooms. Expanded on how
+ to change the description of an in-game object with templating.
## Evennia 1.2.1
diff --git a/docs/1.0/_sources/Components/Characters.md.txt b/docs/1.0/_sources/Components/Characters.md.txt
new file mode 100644
index 0000000000..45ceeb1bde
--- /dev/null
+++ b/docs/1.0/_sources/Components/Characters.md.txt
@@ -0,0 +1,29 @@
+# Characters
+**Inheritance Tree:
+```
+┌─────────────┐
+│DefaultObject│
+└─────▲───────┘
+ │
+┌─────┴──────────┐
+│DefaultCharacter│
+└─────▲──────────┘
+ │ ┌────────────┐
+ │ ┌─────────►ObjectParent│
+ │ │ └────────────┘
+ ┌───┴─┴───┐
+ │Character│
+ └─────────┘
+```
+
+_Characters_ is an in-game [Object](./Objects.md) commonly used to represent the player's in-game avatar. The empty `Character` class is found in `mygame/typeclasses/characters.py`. It inherits from [DefaultCharacter](evennia.objects.objects.DefaultCharacter) and the (by default empty) `ObjectParent` class (used if wanting to add share properties between all in-game Objects).
+
+When a new [Account](./Accounts.md) logs in to Evennia for the first time, a new `Character` object is created and the [Account](./Accounts.md) will be set to _puppet_ it. By default this first Character will get the same name as the Account (but Evennia supports [alternative connection-styles](../Concepts/Connection-Styles.md) if so desired).
+
+A `Character` object will usually have a [Default Commandset](./Command-Sets.md) set on itself at creation, or the account will not be able to issue any in-game commands!
+
+If you want to change the default character created by the default commands, you can change it in settings:
+
+ BASE_CHARACTER_TYPECLASS = "typeclasses.characters.Character"
+
+This deafult points at the empty class in `mygame/typeclasses/characters.py` , ready for you to modify as you please.
\ No newline at end of file
diff --git a/docs/1.0/_sources/Components/Components-Overview.md.txt b/docs/1.0/_sources/Components/Components-Overview.md.txt
index 5218cddcc6..194a6cf2c1 100644
--- a/docs/1.0/_sources/Components/Components-Overview.md.txt
+++ b/docs/1.0/_sources/Components/Components-Overview.md.txt
@@ -13,6 +13,9 @@ Sessions.md
Typeclasses.md
Accounts.md
Objects.md
+Characters.md
+Rooms.md
+Exits.md
Scripts.md
Channels.md
Msg.md
diff --git a/docs/1.0/_sources/Components/Exits.md.txt b/docs/1.0/_sources/Components/Exits.md.txt
new file mode 100644
index 0000000000..17770a2b76
--- /dev/null
+++ b/docs/1.0/_sources/Components/Exits.md.txt
@@ -0,0 +1,55 @@
+# Exits
+
+**Inheritance Tree:**
+```
+┌─────────────┐
+│DefaultObject│
+└─────▲───────┘
+ │
+┌─────┴─────┐
+│DefaultExit│
+└─────▲─────┘
+ │ ┌────────────┐
+ │ ┌─────►ObjectParent│
+ │ │ └────────────┘
+ ┌─┴─┴┐
+ │Exit│
+ └────┘
+```
+
+*Exits* are in-game [Objects](./Objects.md) connecting other objects (usually [Rooms](./Rooms.md)) together.
+
+An object named `north` or `in` might be exits, as well as `door`, `portal` or `jump out the window`.
+
+An exit has two things that separate them from other objects.
+1. Their `.destination` property is set and points to a valid target location. This fact makes it easy and fast to locate exits in the database.
+2. Exits define a special [Transit Command](./Commands.md) on themselves when they are created. This command is named the same as the exit object and will, when called, handle the practicalities of moving the character to the Exits's `.destination` - this allows you to just enter the name of the exit on its own to move around, just as you would expect.
+
+The default exit functionality is all defined on the [DefaultExit](DefaultExit) typeclass. You could in principle completely change how exits work in your game by overriding this - it's not recommended though, unless you really know what you are doing).
+
+Exits are [locked](./Locks.md) using an `access_type` called *traverse* and also make use of a few hook methods for giving feedback if the traversal fails. See `evennia.DefaultExit` for more info.
+
+Exits are normally overridden on a case-by-case basis, but if you want to change the default exit createad by rooms like `dig` , `tunnel` or `open` you can change it in settings:
+
+ BASE_EXIT_TYPECLASS = "typeclasses.exits.Exit"
+
+In `mygame/typeclasses/exits.py` there is an empty `Exit` class for you to modify.
+
+### Exit details
+
+The process of traversing an exit is as follows:
+
+1. The traversing `obj` sends a command that matches the Exit-command name on the Exit object. The [cmdhandler](./Commands.md) detects this and triggers the command defined on the Exit. Traversal always involves the "source" (the current location) and the `destination` (this is stored on the Exit object).
+1. The Exit command checks the `traverse` lock on the Exit object
+1. The Exit command triggers `at_traverse(obj, destination)` on the Exit object.
+1. In `at_traverse`, `object.move_to(destination)` is triggered. This triggers the following hooks, in order:
+ 1. `obj.at_pre_move(destination)` - if this returns False, move is aborted.
+ 1. `origin.at_pre_leave(obj, destination)`
+ 1. `obj.announce_move_from(destination)`
+ 1. Move is performed by changing `obj.location` from source location to `destination`.
+ 1. `obj.announce_move_to(source)`
+ 1. `destination.at_object_receive(obj, source)`
+ 1. `obj.at_post_move(source)`
+1. On the Exit object, `at_post_traverse(obj, source)` is triggered.
+
+If the move fails for whatever reason, the Exit will look for an Attribute `err_traverse` on itself and display this as an error message. If this is not found, the Exit will instead call `at_failed_traverse(obj)` on itself.
\ No newline at end of file
diff --git a/docs/1.0/_sources/Components/Objects.md.txt b/docs/1.0/_sources/Components/Objects.md.txt
index 789dcc444a..b547bf976b 100644
--- a/docs/1.0/_sources/Components/Objects.md.txt
+++ b/docs/1.0/_sources/Components/Objects.md.txt
@@ -1,5 +1,6 @@
# Objects
+**Message-path:**
```
┌──────┐ │ ┌───────┐ ┌───────┐ ┌──────┐
│Client├─┼──►│Session├───►│Account├──►│Object│
@@ -7,51 +8,63 @@
^
```
-All in-game objects in Evennia, be it characters, chairs, monsters, rooms or hand grenades are
-represented by an Evennia *Object*. Objects form the core of Evennia and is probably what you'll
-spend most time working with. Objects are [Typeclassed](./Typeclasses.md) entities.
+All in-game objects in Evennia, be it characters, chairs, monsters, rooms or hand grenades are jointly referred to as an Evennia *Object*. An Object is generally something you can look and interact with in the game world. When a message travels from the client, the Object-level is the last stop.
-An Evennia Object is, by definition, a Python class that includes [evennia.objects.objects.DefaultObject](evennia.objects.objects.DefaultObject) among its parents. Evennia defines several subclasses of `DefaultObject` in the following inheritance tree:
+Objects form the core of Evennia and is probably what you'll spend most time working with. Objects are [Typeclassed](./Typeclasses.md) entities.
+An Evennia Object is, by definition, a Python class that includes [evennia.objects.objects.DefaultObject](evennia.objects.objects.DefaultObject) among its parents. Evennia defines several subclasses of `DefaultObject`:
+
+- `Object` - the base in-game entity. Found in `mygame/typeclasses/objects.py`. Inherits directly from `DefaultObject`.
+- [Characters](./Characters.md) - the normal in-game Character, controlled by a player. Found in `mygame/typeclasses/characters.py`. Inherits from `DefaultCharacter`, which is turn a child of `DefaultObject`.
+- [Rooms](./Rooms.md) - a location in the game world. Found in `mygame/typeclasses/rooms.py`. Inherits from `DefaultRoom`, which is in turn a child of `DefaultObject`).
+- [Exits](./Exits.md) - represents a one-way connection to another location. Found in `mygame/typeclasses/exits.py` (inherits from `DefaultExit`, which is in turn a child of `DefaultObject`).
+
+## Object
+
+**Inheritance Tree:**
```
- ┌────────────┐
- Evennia│ │ObjectParent│
- library│ └──────▲─────┘
-┌─────────────┐ │ ┌──────┐ │
-│DefaultObject◄────────────────────┼────┤Object├──────┤
-└──────▲──────┘ │ └──────┘ │
- │ ┌────────────────┐ │ ┌─────────┐ │
- ├────────┤DefaultCharacter◄─┼────┤Character├───┤
- │ └────────────────┘ │ └─────────┘ │
- │ ┌────────────────┐ │ ┌────┐ │
- ├────────┤DefaultRoom ◄─┼────┤Room├────────┤
- │ └────────────────┘ │ └────┘ │
- │ ┌────────────────┐ │ ┌────┐ │
- └────────┤DefaultExit ◄─┼────┤Exit├────────┘
- └────────────────┘ │ └────┘
- │Game-dir
+┌─────────────┐
+│DefaultObject│
+└──────▲──────┘
+ │ ┌────────────┐
+ │ ┌─────►ObjectParent│
+ │ │ └────────────┘
+ ┌─┴─┴──┐
+ │Object│
+ └──────┘
```
-Here, arrows indicate inheritance and point from-child-to-parent.
+> For an explanation of `ObjectParent`, see next section.
-So, for example `DefaultObject` is a child of `DefaultCharacter` (in the Evennia library), which is a parent of `Character` (in the game dir). The class in the game-dir is the one you should modify for your game.
+The `Object` class is meant to be used as the basis for creating things that are neither characters, rooms or exits - anything from weapons and armour, equipment and houses can be represented by extending the Object class. Depending on your game, this also goes for NPCs and monsters (in some games you may want to treat NPCs as just an un-puppeted [Character](./Characters.md) instead).
-> Note the `ObjectParent` class. This is an empty mix-in that all classes in the game-dir inherits from. It's where you put things you want _all_ these classes to have.
+You should not use Objects for game _systems_. Don't use an 'invisible' Object for tracking weather, combat, economy or guild memberships - that's what [Scripts](./Scripts.md) are for.
-- [evennia.objects.objects.DefaultCharacter](evennia.objects.objects.DefaultCharacter) - the normal in-game Character, controlled by a player.
-- [evennia.objects.objects.DefaultRoom](evennia.objects.objects.DefaultRoom) - a location in the game world.
-- [evennia.objects.objects.DefaultExit](evennia.objects.objects.DefaultExit) - an entity that in a location (usually a Room). It represents a one-way connection to another location.
+## ObjectParent - Adding common functionality
-Here are the import paths for the relevant child classes in the game dir
+`Object`, as well as `Character`, `Room` and `Exit` classes all additionally inherit from `mygame.typeclasses.objects.ObjectParent`.
-- `mygame.typeclasses.objects.Object` (inherits from `DefaultObject`)
-- `mygame.typeclasses.characters.Character` (inherits from `DefaultCharacter`)
-- `mygame.typeclasses.rooms.Room` (inherits from `DefaultRoom`)
-- `mygame.typeclasses.exits.Exit` (inherits from `DefaultExit`)
+`ObjectParent` is an empty 'mixin' class. You can add stuff to this class that you want _all_ in-game entities to have.
-## Working with Objects
+Here is an example:
-You can easily add your own in-game behavior by either modifying one of the typeclasses in your game dir or by inheriting from them.
+```python
+# in mygame/typeclasses/objects.py
+# ...
+
+from evennia.objects.objects import DefaultObject
+
+class ObjectParent:
+ def at_pre_get(self, getter, **kwargs):
+ # make all entities by default un-pickable
+ return False
+```
+
+Now all of `Object`, `Exit`. `Room` and `Character` default to not being able to be picked up using the `get` command.
+
+## Working with children of DefaultObject
+
+This functionality is shared by all sub-classes of `DefaultObject`. You can easily add your own in-game behavior by either modifying one of the typeclasses in your game dir or by inheriting further from them.
You can put your new typeclass directly in the relevant module, or you could organize your code in some other way. Here we assume we make a new module `mygame/typeclasses/flowers.py`:
@@ -82,15 +95,10 @@ What the `create` command actually *does* is to use the [evennia.create_object](
new_rose = create_object("typeclasses.flowers.Rose", key="MyRose")
```
-(The `create` command will auto-append the most likely path to your typeclass, if you enter the
-call manually you have to give the full path to the class. The `create.create_object` function is
-powerful and should be used for all coded object creating (so this is what you use when defining
-your own building commands).
-
-This particular Rose class doesn't really do much, all it does it make sure the attribute
-`desc`(which is what the `look` command looks for) is pre-set, which is pretty pointless since you
-will usually want to change this at build time (using the `desc` command or using the [Spawner](./Prototypes.md)).
+(The `create` command will auto-append the most likely path to your typeclass, if you enter the call manually you have to give the full path to the class. The `create.create_object` function is powerful and should be used for all coded object creating (so this is what you use when defining your own building commands).
+This particular Rose class doesn't really do much, all it does it make sure the attribute `desc`(which is what the `look` command looks for) is pre-set, which is pretty pointless since you will usually want to change this at build time (using the `desc` command or using the [Spawner](./Prototypes.md)).
+
### Properties and functions on Objects
Beyond the properties assigned to all [typeclassed](./Typeclasses.md) objects (see that page for a list
@@ -99,16 +107,14 @@ of those), the Object also has the following custom properties:
- `aliases` - a handler that allows you to add and remove aliases from this object. Use `aliases.add()` to add a new alias and `aliases.remove()` to remove one.
- `location` - a reference to the object currently containing this object.
- `home` is a backup location. The main motivation is to have a safe place to move the object to if its `location` is destroyed. All objects should usually have a home location for safety.
-- `destination` - this holds a reference to another object this object links to in some way. Its main use is for [Exits](./Objects.md#exits), it's otherwise usually unset.
+- `destination` - this holds a reference to another object this object links to in some way. Its main use is for [Exits](./Exits.md), it's otherwise usually unset.
- `nicks` - as opposed to aliases, a [Nick](./Nicks.md) holds a convenient nickname replacement for a real name, word or sequence, only valid for this object. This mainly makes sense if the Object is used as a game character - it can then store briefer shorts, example so as to quickly reference game commands or other characters. Use nicks.add(alias, realname) to add a new one.
- `account` - this holds a reference to a connected [Account](./Accounts.md) controlling this object (if any). Note that this is set also if the controlling account is *not* currently online - to test if an account is online, use the `has_account` property instead.
- `sessions` - if `account` field is set *and the account is online*, this is a list of all active sessions (server connections) to contact them through (it may be more than one if multiple connections are allowed in settings).
- `has_account` - a shorthand for checking if an *online* account is currently connected to this object.
- `contents` - this returns a list referencing all objects 'inside' this object (i,e. which has this object set as their `location`).
- `exits` - this returns all objects inside this object that are *Exits*, that is, has the `destination` property set.
-
-The last two properties are special:
-
+- `appearance_template` - this helps formatting the look of the Object when someone looks at it (see next section).l
- `cmdset` - this is a handler that stores all [command sets](./Command-Sets.md) defined on the object (if any).
- `scripts` - this is a handler that manages [Scripts](./Scripts.md) attached to the object (if any).
@@ -119,87 +125,40 @@ The Object also has a host of useful utility functions. See the function headers
- `search()` - this is a convenient shorthand to search for a specific object, at a given location or globally. It's mainly useful when defining commands (in which case the object executing the command is named `caller` and one can do `caller.search()` to find objects in the room to operate on).
- `execute_cmd()` - Lets the object execute the given string as if it was given on the command line.
- `move_to` - perform a full move of this object to a new location. This is the main move method and will call all relevant hooks, do all checks etc.
-- `clear_exits()` - will delete all [Exits](./Objects.md#exits) to *and* from this object.
+- `clear_exits()` - will delete all [Exits](./Exits.md) to *and* from this object.
- `clear_contents()` - this will not delete anything, but rather move all contents (except Exits) to their designated `Home` locations.
- `delete()` - deletes this object, first calling `clear_exits()` and `clear_contents()`.
+- `return_appearance` is the main hook letting the object visually describe itself.
The Object Typeclass defines many more *hook methods* beyond `at_object_creation`. Evennia calls these hooks at various points. When implementing your custom objects, you will inherit from the base parent and overload these hooks with your own custom code. See `evennia.objects.objects` for an updated list of all the available hooks or the [API for DefaultObject here](evennia.objects.objects.DefaultObject).
-## Characters
+## Changing an Object's appearance
-The [DefaultCharacters](evennia.objects.objects.DefaultCharacter) is the root class for player in-game entities. They are usually _puppeted_ by [Accounts](./Accounts.md).
+When you type `look `, this is the sequence of events that happen:
-When a new Account logs in to Evennia for the first time, a new `Character` object is created and the Account object is assigned to the `account` attribute (but Evennia supports [alternative connection-styles](../Concepts/Connection-Styles.md) if so desired).
+1. The command checks if the `caller` of the command (the 'looker') passes the `view` [lock](./Locks.md) of the target `obj`. If not, they will not find anything to look at (this is how you make objects invisible).
+1. The `look` command calls `caller.at_look(obj)` - that is, the `at_look` hook on the 'looker' (the caller of the command) is called to perform the look on the target object. The command will echo whatever this hook returns.
+2. `caller.at_look` calls and returns the outcome of `obj.return_apperance(looker, **kwargs)`. Here `looker` is the `caller` of the command. In other words, we ask the `obj` to descibe itself to `looker`.
+3. `obj.return_appearance` makes use of its `.appearance_template` property and calls a slew of helper-hooks to populate this template. This is how the template looks by default:
-A `Character` object must have a [Default Commandset](./Command-Sets.md) set on itself at creation, or the account will not be able to issue any commands!
+ ```python
+ appearance_template = """
+ {header}
+ |c{name}|n
+ {desc}
+ {exits}{characters}{things}
+ {footer}
+ """```
-If you want to change the default character created by the default commands, you can change it in settings:
+4. Each field of the template is populated by a matching helper method (and their default returns):
+ - `name` -> `obj.get_display_name(looker, **kwargs)` - returns `obj.name`.
+ - `desc` -> `obj.get_display_desc(looker, **kwargs)` - returns `obj.db.desc`.
+ - `header` -> `obj.get_display_header(looker, **kwargs)` - empty by default.
+ - `footer` -> `obj.get_display_footer(looker, **kwargs)` - empty by default.
+ - `exits` -> `obj.get_display_exits(looker, **kwargs)` - a list of `DefaultExit`-inheriting objects found inside this object (usually only present if `obj` is a `Room`).
+ - `characters` -> `obj.get_display_characters(looker, **kwargs)` - a list of `DefaultCharacter`-inheriting entities inside this object.
+ - `things` -> `obj.get_display_things(looker, **kwargs)` - a list of all other Objects inside `obj`.
+5. `obj.format_appearance(string, looker, **kwargs)` is the last step the populated template string goes through. This can be used for final adjustments, such as stripping whitespace. The return from this method is what the user will see.
- BASE_CHARACTER_TYPECLASS = "typeclasses.characters.Character"
-
-This deafult points at the empty class in `mygame/typeclasses/characters.py` , ready for you to modify as you please.
-
-## Rooms
-
-[Rooms](evennia.objects.objects.DefaultRoom) are the root containers of all other objects.
-
-The only thing really separating a room from any other object is that they have no `location` of their own and that default commands like `dig` creates objects of this class - so if you want to expand your rooms with more functionality, just inherit from `evennia.DefaultRoom`.
-
-To change the default room created by `dig`, `tunnel` and other commands, change it in settings:
-
- BASE_ROOM_TYPECLASS = "typeclases.rooms.Room"
-
-The empty class in `mygame/typeclasses/rooms.py` is a good place to start!
-
-## Exits
-
-*Exits* are objects connecting other objects (usually *Rooms*) together. An object named *North* or *in* might be an exit, as well as *door*, *portal* or *jump out the window*. An exit has two things that separate them from other objects. Firstly, their *destination* property is set and points to a valid object. This fact makes it easy and fast to locate exits in the database. Secondly, exits define a special [Transit Command](./Commands.md) on themselves when they are created. This command is named the same as the exit object and will, when called, handle the practicalities of moving the character to the Exits's *destination* - this allows you to just enter the name of the exit on its own to move around, just as you would expect.
-
-The exit functionality is all defined on the Exit typeclass, so you could in principle completely change how exits work in your game (it's not recommended though, unless you really know what you are doing). Exits are [locked](./Locks.md) using an access_type called *traverse* and also make use of a few hook methods for giving feedback if the traversal fails. See `evennia.DefaultExit` for more info.
-
-Exits are normally overridden on a case-by-case basis, but if you want to change the default exit createad by rooms like `dig` , `tunnel` or `open` you can change it in settings:
-
- BASE_EXIT_TYPECLASS = "typeclasses.exits.Exit"
-
-In `mygame/typeclasses/exits.py` there is an empty `Exit` class for you to modify.
-
-### Exit details
-
-The process of traversing an exit is as follows:
-
-1. The traversing `obj` sends a command that matches the Exit-command name on the Exit object. The [cmdhandler](./Commands.md) detects this and triggers the command defined on the Exit. Traversal always involves the "source" (the current location) and the `destination` (this is stored on the Exit object).
-1. The Exit command checks the `traverse` lock on the Exit object
-1. The Exit command triggers `at_traverse(obj, destination)` on the Exit object.
-1. In `at_traverse`, `object.move_to(destination)` is triggered. This triggers the following hooks, in order:
- 1. `obj.at_pre_move(destination)` - if this returns False, move is aborted.
- 1. `origin.at_pre_leave(obj, destination)`
- 1. `obj.announce_move_from(destination)`
- 1. Move is performed by changing `obj.location` from source location to `destination`.
- 1. `obj.announce_move_to(source)`
- 1. `destination.at_object_receive(obj, source)`
- 1. `obj.at_post_move(source)`
-1. On the Exit object, `at_post_traverse(obj, source)` is triggered.
-
-If the move fails for whatever reason, the Exit will look for an Attribute `err_traverse` on itself and display this as an error message. If this is not found, the Exit will instead call `at_failed_traverse(obj)` on itself.
-
-## Adding common functionality
-
-`Object`, `Character`, `Room` and `Exit` also inherit from `mygame.typeclasses.objects.ObjectParent`.
-This is an empty 'mixin' class. Optionally, you can modify this class if you want to easily add some _common_ functionality to all your Objects, Characters, Rooms and Exits at once. You can still customize each subclass separately (see the Python docs on [multiple inheritance](https://docs.python.org/3/tutorial/classes.html#multiple-inheritance) for details).
-
-Here is an example:
-
-```python
-# in mygame/typeclasses/objects.py
-# ...
-
-from evennia.objects.objects import DefaultObject
-
-class ObjectParent:
- def at_pre_get(self, getter, **kwargs):
- # make all entities by default un-pickable
- return False
-```
-
-Now all of `Object`, `Exit`. `Room` and `Character` default to not being able to be picked up using the `get` command.
+As each of these hooks (and the template itself) can be overridden in your child class, you can customize your look extensively. You can also have objects look different depending on who is looking at them. The extra `**kwargs` are not used by default, but are there to allow you to pass extra data into the system if you need it (like light conditions etc.)
\ No newline at end of file
diff --git a/docs/1.0/_sources/Components/Rooms.md.txt b/docs/1.0/_sources/Components/Rooms.md.txt
new file mode 100644
index 0000000000..1543c4629d
--- /dev/null
+++ b/docs/1.0/_sources/Components/Rooms.md.txt
@@ -0,0 +1,31 @@
+
+# Rooms
+
+**Inheritance Tree:**
+```
+┌─────────────┐
+│DefaultObject│
+└─────▲───────┘
+ │
+┌─────┴─────┐
+│DefaultRoom│
+└─────▲─────┘
+ │ ┌────────────┐
+ │ ┌─────►ObjectParent│
+ │ │ └────────────┘
+ ┌─┴─┴┐
+ │Room│
+ └────┘
+```
+
+[Rooms](evennia.objects.objects.DefaultRoom) are in-game [Objects](./Objects.md) representing the root containers of all other objects.
+
+The only thing technically separating a room from any other object is that they have no `location` of their own and that default commands like `dig` creates objects of this class - so if you want to expand your rooms with more functionality, just inherit from `evennia.DefaultRoom`.
+
+To change the default room created by `dig`, `tunnel` and other default commands, change it in settings:
+
+ BASE_ROOM_TYPECLASS = "typeclases.rooms.Room"
+
+The empty class in `mygame/typeclasses/rooms.py` is a good place to start!
+
+While the default Room is very simple, there are several Evennia [contribs](../Contribs/Contribs-Overview.md) customizing and extending rooms with more functionality.
\ No newline at end of file
diff --git a/docs/1.0/_sources/Contribs/Contrib-Ingame-Python.md.txt b/docs/1.0/_sources/Contribs/Contrib-Ingame-Python.md.txt
index 6deaf769a7..7e2dd05559 100644
--- a/docs/1.0/_sources/Contribs/Contrib-Ingame-Python.md.txt
+++ b/docs/1.0/_sources/Contribs/Contrib-Ingame-Python.md.txt
@@ -39,7 +39,7 @@ using ingame-python events.
defines the context in which we would like to call some arbitrary code. For
instance, one event is defined on exits and will fire every time a character
traverses through this exit. Events are described on a [typeclass](../Components/Typeclasses.md)
-([exits](../Components/Objects.md#exits) in our example). All objects inheriting from this
+([exits](../Components/Exits.md) in our example). All objects inheriting from this
typeclass will have access to this event.
- **Callbacks** can be set on individual objects, on events defined in code.
These **callbacks** can contain arbitrary code and describe a specific
diff --git a/docs/1.0/_sources/Evennia-API.md.txt b/docs/1.0/_sources/Evennia-API.md.txt
index a187164dfa..e0c588b7ae 100644
--- a/docs/1.0/_sources/Evennia-API.md.txt
+++ b/docs/1.0/_sources/Evennia-API.md.txt
@@ -50,9 +50,9 @@ The flat API is defined in `__init__.py` [viewable here](github:evennia/__init__
- [evennia.DefaultAccount](evennia.accounts.accounts.DefaultAccount) - player account class ([docs](Components/Accounts.md))
- [evennia.DefaultGuest](evennia.accounts.accounts.DefaultGuest) - base guest account class
- [evennia.DefaultObject](evennia.objects.objects.DefaultObject) - base class for all objects ([docs](Components/Objects.md))
-- [evennia.DefaultCharacter](evennia.objects.objects.DefaultCharacter) - base class for in-game characters ([docs](Components/Objects.md#characters))
-- [evennia.DefaultRoom](evennia.objects.objects.DefaultRoom) - base class for rooms ([docs](Components/Objects.md#rooms))
-- [evennia.DefaultExit](evennia.objects.objects.DefaultExit) - base class for exits ([docs](Components/Objects.md#exits))
+- [evennia.DefaultCharacter](evennia.objects.objects.DefaultCharacter) - base class for in-game characters ([docs](Components/Characters.md))
+- [evennia.DefaultRoom](evennia.objects.objects.DefaultRoom) - base class for rooms ([docs](Components/Rooms.md))
+- [evennia.DefaultExit](evennia.objects.objects.DefaultExit) - base class for exits ([docs](Components/Exits.md))
- [evennia.DefaultScript](evennia.scripts.scripts.DefaultScript) - base class for OOC-objects ([docs](Components/Scripts.md))
- [evennia.DefaultChannel](evennia.comms.comms.DefaultChannel) - base class for in-game channels ([docs](Components/Channels.md))
diff --git a/docs/1.0/api/evennia.commands.default.account.html b/docs/1.0/api/evennia.commands.default.account.html
index fabebc2c32..125d701657 100644
--- a/docs/1.0/api/evennia.commands.default.account.html
+++ b/docs/1.0/api/evennia.commands.default.account.html
@@ -133,7 +133,7 @@ method. Otherwise all text will be returned to all connected sessions.
-search_index_entry = {'aliases': '@parent @type @update @swap @typeclasses', 'category': 'building', 'key': '@typeclass', 'no_prefix': 'typeclass parent type update swap typeclasses', 'tags': '', 'text': "\n set or change an object's typeclass\n\n Usage:\n typeclass[/switch] <object> [= typeclass.path]\n typeclass/prototype <object> = prototype_key\n\n typeclasses or typeclass/list/show [typeclass.path]\n swap - this is a shorthand for using /force/reset flags.\n update - this is a shorthand for using the /force/reload flag.\n\n Switch:\n show, examine - display the current typeclass of object (default) or, if\n given a typeclass path, show the docstring of that typeclass.\n update - *only* re-run at_object_creation on this object\n meaning locks or other properties set later may remain.\n reset - clean out *all* the attributes and properties on the\n object - basically making this a new clean object. This will also\n reset cmdsets!\n force - change to the typeclass also if the object\n already has a typeclass of the same name.\n list - show available typeclasses. Only typeclasses in modules actually\n imported or used from somewhere in the code will show up here\n (those typeclasses are still available if you know the path)\n prototype - clean and overwrite the object with the specified\n prototype key - effectively making a whole new object.\n\n Example:\n type button = examples.red_button.RedButton\n type/prototype button=a red button\n\n If the typeclass_path is not given, the current object's typeclass is\n assumed.\n\n View or set an object's typeclass. If setting, the creation hooks of the\n new typeclass will be run on the object. If you have clashing properties on\n the old class, use /reset. By default you are protected from changing to a\n typeclass of the same name as the one you already have - use /force to\n override this protection.\n\n The given typeclass must be identified by its location using python\n dot-notation pointing to the correct module and class. If no typeclass is\n given (or a wrong typeclass is given). Errors in the path or new typeclass\n will lead to the old typeclass being kept. The location of the typeclass\n module is searched from the default typeclass directory, as defined in the\n server settings.\n\n "}¶
+search_index_entry = {'aliases': '@update @parent @swap @typeclasses @type', 'category': 'building', 'key': '@typeclass', 'no_prefix': 'typeclass update parent swap 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 "}¶
@@ -1531,7 +1531,7 @@ If object is not specified, the current location is examined.
@@ -1799,7 +1799,7 @@ the cases, see the module doc.
-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': '@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 '}¶
diff --git a/docs/1.0/api/evennia.commands.default.comms.html b/docs/1.0/api/evennia.commands.default.comms.html
index 2d9002254b..c46610c6d8 100644
--- a/docs/1.0/api/evennia.commands.default.comms.html
+++ b/docs/1.0/api/evennia.commands.default.comms.html
@@ -256,7 +256,7 @@ ban mychannel1,mychannel2= EvilUser : Was banned for spamming.
-search_index_entry = {'aliases': '@channels @chan', 'category': 'comms', 'key': '@channel', 'no_prefix': 'channel channels chan', 'tags': '', 'text': "\n Use and manage in-game channels.\n\n Usage:\n channel channelname <msg>\n channel channel name = <msg>\n channel (show all subscription)\n channel/all (show available channels)\n channel/alias channelname = alias[;alias...]\n channel/unalias alias\n channel/who channelname\n channel/history channelname [= index]\n channel/sub channelname [= alias[;alias...]]\n channel/unsub channelname[,channelname, ...]\n channel/mute channelname[,channelname,...]\n channel/unmute channelname[,channelname,...]\n\n channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n channel/desc channelname = description\n channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n channel/ban channelname (list bans)\n channel/ban[/quiet] channelname[, channelname, ...] = subscribername [: reason]\n channel/unban[/quiet] channelname[, channelname, ...] = subscribername\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n\n # subtopics\n\n ## sending\n\n Usage: channel channelname msg\n channel channel name = msg (with space in channel name)\n\n This sends a message to the channel. Note that you will rarely use this\n command like this; instead you can use the alias\n\n channelname <msg>\n channelalias <msg>\n\n For example\n\n public Hello World\n pub Hello World\n\n (this shortcut doesn't work for aliases containing spaces)\n\n See channel/alias for help on setting channel aliases.\n\n ## alias and unalias\n\n Usage: channel/alias channel = alias[;alias[;alias...]]\n channel/unalias alias\n channel - this will list your subs and aliases to each channel\n\n Set one or more personal aliases for referencing a channel. For example:\n\n channel/alias warrior's guild = warrior;wguild;warchannel;warrior guild\n\n You can now send to the channel using all of these:\n\n warrior's guild Hello\n warrior Hello\n wguild Hello\n warchannel Hello\n\n Note that this will not work if the alias has a space in it. So the\n 'warrior guild' alias must be used with the `channel` command:\n\n channel warrior guild = Hello\n\n Channel-aliases can be removed one at a time, using the '/unalias' switch.\n\n ## who\n\n Usage: channel/who channelname\n\n List the channel's subscribers. Shows who are currently offline or are\n muting the channel. Subscribers who are 'muting' will not see messages sent\n to the channel (use channel/mute to mute a channel).\n\n ## history\n\n Usage: channel/history channel [= index]\n\n This will display the last |c20|n lines of channel history. By supplying an\n index number, you will step that many lines back before viewing those 20 lines.\n\n For example:\n\n channel/history public = 35\n\n will go back 35 lines and show the previous 20 lines from that point (so\n lines -35 to -55).\n\n ## sub and unsub\n\n Usage: channel/sub channel [=alias[;alias;...]]\n channel/unsub channel\n\n This subscribes you to a channel and optionally assigns personal shortcuts\n for you to use to send to that channel (see aliases). When you unsub, all\n your personal aliases will also be removed.\n\n ## mute and unmute\n\n Usage: channel/mute channelname\n channel/unmute channelname\n\n Muting silences all output from the channel without actually\n un-subscribing. Other channel members will see that you are muted in the /who\n list. Sending a message to the channel will automatically unmute you.\n\n ## create and destroy\n\n Usage: channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n\n Creates a new channel (or destroys one you control). You will automatically\n join the channel you create and everyone will be kicked and loose all aliases\n to a destroyed channel.\n\n ## lock and unlock\n\n Usage: channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n\n Note: this is an admin command.\n\n A lockstring is on the form locktype:lockfunc(). Channels understand three\n locktypes:\n listen - who may listen or join the channel.\n send - who may send messages to the channel\n control - who controls the channel. This is usually the one creating\n the channel.\n\n Common lockfuncs are all() and perm(). To make a channel everyone can\n listen to but only builders can talk on, use this:\n\n listen:all()\n send: perm(Builders)\n\n ## boot and ban\n\n Usage:\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n channel/ban channelname[, channelname, ...] = subscribername [: reason]\n channel/unban channelname[, channelname, ...] = subscribername\n channel/unban channelname\n channel/ban channelname (list bans)\n\n Booting will kick a named subscriber from channel(s) temporarily. The\n 'reason' will be passed to the booted user. Unless the /quiet switch is\n used, the channel will also be informed of the action. A booted user is\n still able to re-connect, but they'll have to set up their aliases again.\n\n Banning will blacklist a user from (re)joining the provided channels. It\n will then proceed to boot them from those channels if they were connected.\n The 'reason' and `/quiet` works the same as for booting.\n\n Example:\n boot mychannel1 = EvilUser : Kicking you to cool down a bit.\n ban mychannel1,mychannel2= EvilUser : Was banned for spamming.\n\n "}¶
+search_index_entry = {'aliases': '@chan @channels', 'category': 'comms', 'key': '@channel', 'no_prefix': 'channel chan channels', 'tags': '', 'text': "\n Use and manage in-game channels.\n\n Usage:\n channel channelname <msg>\n channel channel name = <msg>\n channel (show all subscription)\n channel/all (show available channels)\n channel/alias channelname = alias[;alias...]\n channel/unalias alias\n channel/who channelname\n channel/history channelname [= index]\n channel/sub channelname [= alias[;alias...]]\n channel/unsub channelname[,channelname, ...]\n channel/mute channelname[,channelname,...]\n channel/unmute channelname[,channelname,...]\n\n channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n channel/desc channelname = description\n channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n channel/ban channelname (list bans)\n channel/ban[/quiet] channelname[, channelname, ...] = subscribername [: reason]\n channel/unban[/quiet] channelname[, channelname, ...] = subscribername\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n\n # subtopics\n\n ## sending\n\n Usage: channel channelname msg\n channel channel name = msg (with space in channel name)\n\n This sends a message to the channel. Note that you will rarely use this\n command like this; instead you can use the alias\n\n channelname <msg>\n channelalias <msg>\n\n For example\n\n public Hello World\n pub Hello World\n\n (this shortcut doesn't work for aliases containing spaces)\n\n See channel/alias for help on setting channel aliases.\n\n ## alias and unalias\n\n Usage: channel/alias channel = alias[;alias[;alias...]]\n channel/unalias alias\n channel - this will list your subs and aliases to each channel\n\n Set one or more personal aliases for referencing a channel. For example:\n\n channel/alias warrior's guild = warrior;wguild;warchannel;warrior guild\n\n You can now send to the channel using all of these:\n\n warrior's guild Hello\n warrior Hello\n wguild Hello\n warchannel Hello\n\n Note that this will not work if the alias has a space in it. So the\n 'warrior guild' alias must be used with the `channel` command:\n\n channel warrior guild = Hello\n\n Channel-aliases can be removed one at a time, using the '/unalias' switch.\n\n ## who\n\n Usage: channel/who channelname\n\n List the channel's subscribers. Shows who are currently offline or are\n muting the channel. Subscribers who are 'muting' will not see messages sent\n to the channel (use channel/mute to mute a channel).\n\n ## history\n\n Usage: channel/history channel [= index]\n\n This will display the last |c20|n lines of channel history. By supplying an\n index number, you will step that many lines back before viewing those 20 lines.\n\n For example:\n\n channel/history public = 35\n\n will go back 35 lines and show the previous 20 lines from that point (so\n lines -35 to -55).\n\n ## sub and unsub\n\n Usage: channel/sub channel [=alias[;alias;...]]\n channel/unsub channel\n\n This subscribes you to a channel and optionally assigns personal shortcuts\n for you to use to send to that channel (see aliases). When you unsub, all\n your personal aliases will also be removed.\n\n ## mute and unmute\n\n Usage: channel/mute channelname\n channel/unmute channelname\n\n Muting silences all output from the channel without actually\n un-subscribing. Other channel members will see that you are muted in the /who\n list. Sending a message to the channel will automatically unmute you.\n\n ## create and destroy\n\n Usage: channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n\n Creates a new channel (or destroys one you control). You will automatically\n join the channel you create and everyone will be kicked and loose all aliases\n to a destroyed channel.\n\n ## lock and unlock\n\n Usage: channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n\n Note: this is an admin command.\n\n A lockstring is on the form locktype:lockfunc(). Channels understand three\n locktypes:\n listen - who may listen or join the channel.\n send - who may send messages to the channel\n control - who controls the channel. This is usually the one creating\n the channel.\n\n Common lockfuncs are all() and perm(). To make a channel everyone can\n listen to but only builders can talk on, use this:\n\n listen:all()\n send: perm(Builders)\n\n ## boot and ban\n\n Usage:\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n channel/ban channelname[, channelname, ...] = subscribername [: reason]\n channel/unban channelname[, channelname, ...] = subscribername\n channel/unban channelname\n channel/ban channelname (list bans)\n\n Booting will kick a named subscriber from channel(s) temporarily. The\n 'reason' will be passed to the booted user. Unless the /quiet switch is\n used, the channel will also be informed of the action. A booted user is\n still able to re-connect, but they'll have to set up their aliases again.\n\n Banning will blacklist a user from (re)joining the provided channels. It\n will then proceed to boot them from those channels if they were connected.\n The 'reason' and `/quiet` works the same as for booting.\n\n Example:\n boot mychannel1 = EvilUser : Kicking you to cool down a bit.\n ban mychannel1,mychannel2= EvilUser : Was banned for spamming.\n\n "}¶
@@ -934,7 +934,7 @@ ban mychannel1,mychannel2= EvilUser : Was banned for spamming.
@@ -954,7 +954,7 @@ ban mychannel1,mychannel2= EvilUser : Was banned for spamming.
-search_index_entry = {'aliases': '@channels @chan', 'category': 'comms', 'key': '@channel', 'no_prefix': 'channel channels chan', 'tags': '', 'text': "\n Use and manage in-game channels.\n\n Usage:\n channel channelname <msg>\n channel channel name = <msg>\n channel (show all subscription)\n channel/all (show available channels)\n channel/alias channelname = alias[;alias...]\n channel/unalias alias\n channel/who channelname\n channel/history channelname [= index]\n channel/sub channelname [= alias[;alias...]]\n channel/unsub channelname[,channelname, ...]\n channel/mute channelname[,channelname,...]\n channel/unmute channelname[,channelname,...]\n\n channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n channel/desc channelname = description\n channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n channel/ban channelname (list bans)\n channel/ban[/quiet] channelname[, channelname, ...] = subscribername [: reason]\n channel/unban[/quiet] channelname[, channelname, ...] = subscribername\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n\n # subtopics\n\n ## sending\n\n Usage: channel channelname msg\n channel channel name = msg (with space in channel name)\n\n This sends a message to the channel. Note that you will rarely use this\n command like this; instead you can use the alias\n\n channelname <msg>\n channelalias <msg>\n\n For example\n\n public Hello World\n pub Hello World\n\n (this shortcut doesn't work for aliases containing spaces)\n\n See channel/alias for help on setting channel aliases.\n\n ## alias and unalias\n\n Usage: channel/alias channel = alias[;alias[;alias...]]\n channel/unalias alias\n channel - this will list your subs and aliases to each channel\n\n Set one or more personal aliases for referencing a channel. For example:\n\n channel/alias warrior's guild = warrior;wguild;warchannel;warrior guild\n\n You can now send to the channel using all of these:\n\n warrior's guild Hello\n warrior Hello\n wguild Hello\n warchannel Hello\n\n Note that this will not work if the alias has a space in it. So the\n 'warrior guild' alias must be used with the `channel` command:\n\n channel warrior guild = Hello\n\n Channel-aliases can be removed one at a time, using the '/unalias' switch.\n\n ## who\n\n Usage: channel/who channelname\n\n List the channel's subscribers. Shows who are currently offline or are\n muting the channel. Subscribers who are 'muting' will not see messages sent\n to the channel (use channel/mute to mute a channel).\n\n ## history\n\n Usage: channel/history channel [= index]\n\n This will display the last |c20|n lines of channel history. By supplying an\n index number, you will step that many lines back before viewing those 20 lines.\n\n For example:\n\n channel/history public = 35\n\n will go back 35 lines and show the previous 20 lines from that point (so\n lines -35 to -55).\n\n ## sub and unsub\n\n Usage: channel/sub channel [=alias[;alias;...]]\n channel/unsub channel\n\n This subscribes you to a channel and optionally assigns personal shortcuts\n for you to use to send to that channel (see aliases). When you unsub, all\n your personal aliases will also be removed.\n\n ## mute and unmute\n\n Usage: channel/mute channelname\n channel/unmute channelname\n\n Muting silences all output from the channel without actually\n un-subscribing. Other channel members will see that you are muted in the /who\n list. Sending a message to the channel will automatically unmute you.\n\n ## create and destroy\n\n Usage: channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n\n Creates a new channel (or destroys one you control). You will automatically\n join the channel you create and everyone will be kicked and loose all aliases\n to a destroyed channel.\n\n ## lock and unlock\n\n Usage: channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n\n Note: this is an admin command.\n\n A lockstring is on the form locktype:lockfunc(). Channels understand three\n locktypes:\n listen - who may listen or join the channel.\n send - who may send messages to the channel\n control - who controls the channel. This is usually the one creating\n the channel.\n\n Common lockfuncs are all() and perm(). To make a channel everyone can\n listen to but only builders can talk on, use this:\n\n listen:all()\n send: perm(Builders)\n\n ## boot and ban\n\n Usage:\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n channel/ban channelname[, channelname, ...] = subscribername [: reason]\n channel/unban channelname[, channelname, ...] = subscribername\n channel/unban channelname\n channel/ban channelname (list bans)\n\n Booting will kick a named subscriber from channel(s) temporarily. The\n 'reason' will be passed to the booted user. Unless the /quiet switch is\n used, the channel will also be informed of the action. A booted user is\n still able to re-connect, but they'll have to set up their aliases again.\n\n Banning will blacklist a user from (re)joining the provided channels. It\n will then proceed to boot them from those channels if they were connected.\n The 'reason' and `/quiet` works the same as for booting.\n\n Example:\n boot mychannel1 = EvilUser : Kicking you to cool down a bit.\n ban mychannel1,mychannel2= EvilUser : Was banned for spamming.\n\n "}¶
+search_index_entry = {'aliases': '@chan @channels', 'category': 'comms', 'key': '@channel', 'no_prefix': 'channel chan channels', 'tags': '', 'text': "\n Use and manage in-game channels.\n\n Usage:\n channel channelname <msg>\n channel channel name = <msg>\n channel (show all subscription)\n channel/all (show available channels)\n channel/alias channelname = alias[;alias...]\n channel/unalias alias\n channel/who channelname\n channel/history channelname [= index]\n channel/sub channelname [= alias[;alias...]]\n channel/unsub channelname[,channelname, ...]\n channel/mute channelname[,channelname,...]\n channel/unmute channelname[,channelname,...]\n\n channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n channel/desc channelname = description\n channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n channel/ban channelname (list bans)\n channel/ban[/quiet] channelname[, channelname, ...] = subscribername [: reason]\n channel/unban[/quiet] channelname[, channelname, ...] = subscribername\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n\n # subtopics\n\n ## sending\n\n Usage: channel channelname msg\n channel channel name = msg (with space in channel name)\n\n This sends a message to the channel. Note that you will rarely use this\n command like this; instead you can use the alias\n\n channelname <msg>\n channelalias <msg>\n\n For example\n\n public Hello World\n pub Hello World\n\n (this shortcut doesn't work for aliases containing spaces)\n\n See channel/alias for help on setting channel aliases.\n\n ## alias and unalias\n\n Usage: channel/alias channel = alias[;alias[;alias...]]\n channel/unalias alias\n channel - this will list your subs and aliases to each channel\n\n Set one or more personal aliases for referencing a channel. For example:\n\n channel/alias warrior's guild = warrior;wguild;warchannel;warrior guild\n\n You can now send to the channel using all of these:\n\n warrior's guild Hello\n warrior Hello\n wguild Hello\n warchannel Hello\n\n Note that this will not work if the alias has a space in it. So the\n 'warrior guild' alias must be used with the `channel` command:\n\n channel warrior guild = Hello\n\n Channel-aliases can be removed one at a time, using the '/unalias' switch.\n\n ## who\n\n Usage: channel/who channelname\n\n List the channel's subscribers. Shows who are currently offline or are\n muting the channel. Subscribers who are 'muting' will not see messages sent\n to the channel (use channel/mute to mute a channel).\n\n ## history\n\n Usage: channel/history channel [= index]\n\n This will display the last |c20|n lines of channel history. By supplying an\n index number, you will step that many lines back before viewing those 20 lines.\n\n For example:\n\n channel/history public = 35\n\n will go back 35 lines and show the previous 20 lines from that point (so\n lines -35 to -55).\n\n ## sub and unsub\n\n Usage: channel/sub channel [=alias[;alias;...]]\n channel/unsub channel\n\n This subscribes you to a channel and optionally assigns personal shortcuts\n for you to use to send to that channel (see aliases). When you unsub, all\n your personal aliases will also be removed.\n\n ## mute and unmute\n\n Usage: channel/mute channelname\n channel/unmute channelname\n\n Muting silences all output from the channel without actually\n un-subscribing. Other channel members will see that you are muted in the /who\n list. Sending a message to the channel will automatically unmute you.\n\n ## create and destroy\n\n Usage: channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n\n Creates a new channel (or destroys one you control). You will automatically\n join the channel you create and everyone will be kicked and loose all aliases\n to a destroyed channel.\n\n ## lock and unlock\n\n Usage: channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n\n Note: this is an admin command.\n\n A lockstring is on the form locktype:lockfunc(). Channels understand three\n locktypes:\n listen - who may listen or join the channel.\n send - who may send messages to the channel\n control - who controls the channel. This is usually the one creating\n the channel.\n\n Common lockfuncs are all() and perm(). To make a channel everyone can\n listen to but only builders can talk on, use this:\n\n listen:all()\n send: perm(Builders)\n\n ## boot and ban\n\n Usage:\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n channel/ban channelname[, channelname, ...] = subscribername [: reason]\n channel/unban channelname[, channelname, ...] = subscribername\n channel/unban channelname\n channel/ban channelname (list bans)\n\n Booting will kick a named subscriber from channel(s) temporarily. The\n 'reason' will be passed to the booted user. Unless the /quiet switch is\n used, the channel will also be informed of the action. A booted user is\n still able to re-connect, but they'll have to set up their aliases again.\n\n Banning will blacklist a user from (re)joining the provided channels. It\n will then proceed to boot them from those channels if they were connected.\n The 'reason' and `/quiet` works the same as for booting.\n\n Example:\n boot mychannel1 = EvilUser : Kicking you to cool down a bit.\n ban mychannel1,mychannel2= EvilUser : Was banned for spamming.\n\n "}¶
-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 '}¶
@@ -629,7 +629,7 @@ placing it in their inventory.
-search_index_entry = {'aliases': '" \'', 'category': 'general', 'key': 'say', 'no_prefix': ' " \'', 'tags': '', 'text': '\n speak as your character\n\n Usage:\n say <message>\n\n Talk to those in your current location.\n '}¶
+search_index_entry = {'aliases': '\' "', 'category': 'general', 'key': 'say', 'no_prefix': ' \' "', 'tags': '', 'text': '\n speak as your character\n\n Usage:\n say <message>\n\n Talk to those in your current location.\n '}¶
@@ -709,7 +709,7 @@ automatically begin with your name.
-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 "}¶
@@ -773,7 +773,7 @@ which permission groups you are a member of.
@@ -804,7 +804,7 @@ which permission groups you are a member of.
-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': '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 '}¶
diff --git a/docs/1.0/api/evennia.commands.default.tests.html b/docs/1.0/api/evennia.commands.default.tests.html
index 33c0e8fe6c..63dcf51c7d 100644
--- a/docs/1.0/api/evennia.commands.default.tests.html
+++ b/docs/1.0/api/evennia.commands.default.tests.html
@@ -955,7 +955,7 @@ main test suite started with
Test the batch processor.
-red_button = <module 'evennia.contrib.tutorials.red_button.red_button' from '/tmp/tmpk0rxqjoy/6c5e9193bba1cb7af19d8a2c9f1d13fa54f3e977/evennia/contrib/tutorials/red_button/red_button.py'>¶
+red_button = <module 'evennia.contrib.tutorials.red_button.red_button' from '/tmp/tmp4kguhrm8/d10fad89ad2e90c9458b262b73fe6a77db4be97c/evennia/contrib/tutorials/red_button/red_button.py'>¶
@@ -157,7 +157,7 @@ there is no object yet before the account has logged in)
-search_index_entry = {'aliases': 'co con conn', 'category': 'general', 'key': 'connect', 'no_prefix': ' co con conn', 'tags': '', 'text': '\n connect to the game\n\n Usage (at login screen):\n connect accountname password\n connect "account name" "pass word"\n\n Use the create command to first create an account before logging in.\n\n If you have spaces in your name, enclose it in double quotes.\n '}¶
+search_index_entry = {'aliases': 'conn co con', 'category': 'general', 'key': 'connect', 'no_prefix': ' conn co con', 'tags': '', 'text': '\n connect to the game\n\n Usage (at login screen):\n connect accountname password\n connect "account name" "pass word"\n\n Use the create command to first create an account before logging in.\n\n If you have spaces in your name, enclose it in double quotes.\n '}¶
-search_index_entry = {'aliases': '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': '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 '}¶
@@ -292,7 +292,7 @@ All it does is display the connect screen.
@@ -318,7 +318,7 @@ All it does is display the connect screen.
-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 '}¶
+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 '}¶
@@ -341,7 +341,7 @@ for simplicity. It shows a pane of info.
@@ -367,7 +367,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/1.0/api/evennia.contrib.base_systems.email_login.email_login.html b/docs/1.0/api/evennia.contrib.base_systems.email_login.email_login.html
index 759c3276e2..da259c00b1 100644
--- a/docs/1.0/api/evennia.contrib.base_systems.email_login.email_login.html
+++ b/docs/1.0/api/evennia.contrib.base_systems.email_login.email_login.html
@@ -139,7 +139,7 @@ the module given by settings.CONNECTION_SCREEN_MODULE.
@@ -169,7 +169,7 @@ there is no object yet before the account has logged in)
-search_index_entry = {'aliases': 'co con conn', 'category': 'general', 'key': 'connect', 'no_prefix': ' co con conn', 'tags': '', 'text': '\n Connect to the game.\n\n Usage (at login screen):\n connect <email> <password>\n\n Use the create command to first create an account before logging in.\n '}¶
+search_index_entry = {'aliases': 'conn co con', 'category': 'general', 'key': 'connect', 'no_prefix': ' conn co con', 'tags': '', 'text': '\n Connect to the game.\n\n Usage (at login screen):\n connect <email> <password>\n\n Use the create command to first create an account before logging in.\n '}¶
@@ -191,7 +191,7 @@ there is no object yet before the account has logged in)
@@ -317,7 +317,7 @@ All it does is display the connect screen.
-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 '}¶
+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 '}¶
@@ -335,7 +335,7 @@ for simplicity. It shows a pane of info.
@@ -361,7 +361,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/1.0/api/evennia.contrib.base_systems.mux_comms_cmds.mux_comms_cmds.html b/docs/1.0/api/evennia.contrib.base_systems.mux_comms_cmds.mux_comms_cmds.html
index a368dfc800..f0aa162501 100644
--- a/docs/1.0/api/evennia.contrib.base_systems.mux_comms_cmds.mux_comms_cmds.html
+++ b/docs/1.0/api/evennia.contrib.base_systems.mux_comms_cmds.mux_comms_cmds.html
@@ -160,7 +160,7 @@ aliases to an already joined channel.
@@ -191,7 +191,7 @@ aliases to an already joined channel.
-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 '}¶
diff --git a/docs/1.0/api/evennia.contrib.full_systems.evscaperoom.commands.html b/docs/1.0/api/evennia.contrib.full_systems.evscaperoom.commands.html
index 81e79ddd39..054293ba8d 100644
--- a/docs/1.0/api/evennia.contrib.full_systems.evscaperoom.commands.html
+++ b/docs/1.0/api/evennia.contrib.full_systems.evscaperoom.commands.html
@@ -211,7 +211,7 @@ the operation will be general or on the room.
-search_index_entry = {'aliases': 'chicken out q quit abort', 'category': 'evscaperoom', 'key': 'give up', 'no_prefix': ' chicken out q quit abort', 'tags': '', 'text': '\n Give up\n\n Usage:\n give up\n\n Abandons your attempts at escaping and of ever winning the pie-eating contest.\n\n '}¶
+search_index_entry = {'aliases': 'q chicken out abort quit', 'category': 'evscaperoom', 'key': 'give up', 'no_prefix': ' q chicken out abort quit', 'tags': '', 'text': '\n Give up\n\n Usage:\n give up\n\n Abandons your attempts at escaping and of ever winning the pie-eating contest.\n\n '}¶
-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': ': 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 '}¶
@@ -490,7 +490,7 @@ looks and what actions is available.
-search_index_entry = {'aliases': 'ex unfocus e examine', 'category': 'evscaperoom', 'key': 'focus', 'no_prefix': ' ex unfocus e examine', 'tags': '', 'text': '\n Focus your attention on a target.\n\n Usage:\n focus <obj>\n\n Once focusing on an object, use look to get more information about how it\n looks and what actions is available.\n\n '}¶
+search_index_entry = {'aliases': 'unfocus examine e ex', 'category': 'evscaperoom', 'key': 'focus', 'no_prefix': ' unfocus examine e ex', '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 '}¶
diff --git a/docs/1.0/api/evennia.contrib.game_systems.turnbattle.tb_basic.html b/docs/1.0/api/evennia.contrib.game_systems.turnbattle.tb_basic.html
index adae913770..efca33993e 100644
--- a/docs/1.0/api/evennia.contrib.game_systems.turnbattle.tb_basic.html
+++ b/docs/1.0/api/evennia.contrib.game_systems.turnbattle.tb_basic.html
@@ -672,7 +672,7 @@ if there are still any actions you can take.
@@ -698,7 +698,7 @@ if there are still any actions you can take.
-search_index_entry = {'aliases': 'hold wait', 'category': 'combat', 'key': 'pass', 'no_prefix': ' hold wait', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶
+search_index_entry = {'aliases': 'wait hold', 'category': 'combat', 'key': 'pass', 'no_prefix': ' wait hold', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶
diff --git a/docs/1.0/api/evennia.contrib.game_systems.turnbattle.tb_equip.html b/docs/1.0/api/evennia.contrib.game_systems.turnbattle.tb_equip.html
index c375bddf93..37ac87b8d3 100644
--- a/docs/1.0/api/evennia.contrib.game_systems.turnbattle.tb_equip.html
+++ b/docs/1.0/api/evennia.contrib.game_systems.turnbattle.tb_equip.html
@@ -567,7 +567,7 @@ if there are still any actions you can take.
@@ -587,7 +587,7 @@ if there are still any actions you can take.
-search_index_entry = {'aliases': 'hold wait', 'category': 'combat', 'key': 'pass', 'no_prefix': ' hold wait', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶
+search_index_entry = {'aliases': 'wait hold', 'category': 'combat', 'key': 'pass', 'no_prefix': ' wait hold', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶
diff --git a/docs/1.0/api/evennia.contrib.game_systems.turnbattle.tb_items.html b/docs/1.0/api/evennia.contrib.game_systems.turnbattle.tb_items.html
index fd9a60204f..357befc2ef 100644
--- a/docs/1.0/api/evennia.contrib.game_systems.turnbattle.tb_items.html
+++ b/docs/1.0/api/evennia.contrib.game_systems.turnbattle.tb_items.html
@@ -690,7 +690,7 @@ if there are still any actions you can take.
@@ -710,7 +710,7 @@ if there are still any actions you can take.
-search_index_entry = {'aliases': 'hold wait', 'category': 'combat', 'key': 'pass', 'no_prefix': ' hold wait', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶
+search_index_entry = {'aliases': 'wait hold', 'category': 'combat', 'key': 'pass', 'no_prefix': ' wait hold', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶
diff --git a/docs/1.0/api/evennia.contrib.game_systems.turnbattle.tb_magic.html b/docs/1.0/api/evennia.contrib.game_systems.turnbattle.tb_magic.html
index 55eb38bfae..3a720e7003 100644
--- a/docs/1.0/api/evennia.contrib.game_systems.turnbattle.tb_magic.html
+++ b/docs/1.0/api/evennia.contrib.game_systems.turnbattle.tb_magic.html
@@ -469,7 +469,7 @@ if there are still any actions you can take.
@@ -489,7 +489,7 @@ if there are still any actions you can take.
-search_index_entry = {'aliases': 'hold wait', 'category': 'combat', 'key': 'pass', 'no_prefix': ' hold wait', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶
+search_index_entry = {'aliases': 'wait hold', 'category': 'combat', 'key': 'pass', 'no_prefix': ' wait hold', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶
diff --git a/docs/1.0/api/evennia.contrib.game_systems.turnbattle.tb_range.html b/docs/1.0/api/evennia.contrib.game_systems.turnbattle.tb_range.html
index cbbf27f645..09197d0a8a 100644
--- a/docs/1.0/api/evennia.contrib.game_systems.turnbattle.tb_range.html
+++ b/docs/1.0/api/evennia.contrib.game_systems.turnbattle.tb_range.html
@@ -929,7 +929,7 @@ if there are still any actions you can take.
@@ -949,7 +949,7 @@ if there are still any actions you can take.
-search_index_entry = {'aliases': 'hold wait', 'category': 'combat', 'key': 'pass', 'no_prefix': ' hold wait', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶
+search_index_entry = {'aliases': 'wait hold', 'category': 'combat', 'key': 'pass', 'no_prefix': ' wait hold', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶
-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 '}¶
diff --git a/docs/1.0/api/evennia.contrib.rpg.rpsystem.rpsystem.html b/docs/1.0/api/evennia.contrib.rpg.rpsystem.rpsystem.html
index 1caf634e7b..1fc5811ef0 100644
--- a/docs/1.0/api/evennia.contrib.rpg.rpsystem.rpsystem.html
+++ b/docs/1.0/api/evennia.contrib.rpg.rpsystem.rpsystem.html
@@ -701,7 +701,7 @@ a different language.
-search_index_entry = {'aliases': '" \'', 'category': 'general', 'key': 'say', 'no_prefix': ' " \'', 'tags': '', 'text': '\n speak as your character\n\n Usage:\n say <message>\n\n Talk to those in your current location.\n '}¶
+search_index_entry = {'aliases': '\' "', 'category': 'general', 'key': 'say', 'no_prefix': ' \' "', 'tags': '', 'text': '\n speak as your character\n\n Usage:\n say <message>\n\n Talk to those in your current location.\n '}¶
diff --git a/docs/1.0/api/evennia.contrib.tutorials.evadventure.commands.html b/docs/1.0/api/evennia.contrib.tutorials.evadventure.commands.html
index 7e1fadaeba..aad49b98bc 100644
--- a/docs/1.0/api/evennia.contrib.tutorials.evadventure.commands.html
+++ b/docs/1.0/api/evennia.contrib.tutorials.evadventure.commands.html
@@ -256,7 +256,7 @@ set in self.parse())
diff --git a/docs/1.0/api/evennia.contrib.tutorials.red_button.red_button.html b/docs/1.0/api/evennia.contrib.tutorials.red_button.red_button.html
index cad164cd82..cfac852e54 100644
--- a/docs/1.0/api/evennia.contrib.tutorials.red_button.red_button.html
+++ b/docs/1.0/api/evennia.contrib.tutorials.red_button.red_button.html
@@ -153,7 +153,7 @@ such as when closing the lid and un-blinding a character.
-search_index_entry = {'aliases': 'smash lid break lid smash', 'category': 'general', 'key': 'smash glass', 'no_prefix': ' smash lid break lid smash', 'tags': '', 'text': '\n Smash the protective glass.\n\n Usage:\n smash glass\n\n Try to smash the glass of the button.\n\n '}¶
+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 '}¶
-search_index_entry = {'aliases': 'examine ex listen l get feel', 'category': 'general', 'key': 'look', 'no_prefix': ' examine ex listen l get feel', '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 feel examine l get ex', 'category': 'general', 'key': 'look', 'no_prefix': ' listen feel examine l 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 "}¶
diff --git a/docs/1.0/api/evennia.contrib.tutorials.tutorial_world.objects.html b/docs/1.0/api/evennia.contrib.tutorials.tutorial_world.objects.html
index 7bbf29d544..d2766bd8c5 100644
--- a/docs/1.0/api/evennia.contrib.tutorials.tutorial_world.objects.html
+++ b/docs/1.0/api/evennia.contrib.tutorials.tutorial_world.objects.html
@@ -556,7 +556,7 @@ shift green root up/down
@@ -805,7 +805,7 @@ parry - forgoes your attack but will make you harder to hit on next
-search_index_entry = {'aliases': 'fight kill slash pierce thrust parry chop stab bash hit defend', 'category': 'tutorialworld', 'key': 'attack', 'no_prefix': ' fight kill slash pierce thrust parry chop stab bash hit 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 '}¶
+search_index_entry = {'aliases': 'thrust chop kill fight defend bash slash stab parry pierce hit', 'category': 'tutorialworld', 'key': 'attack', 'no_prefix': ' thrust chop kill fight defend bash slash stab parry pierce hit', '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/1.0/api/evennia.contrib.tutorials.tutorial_world.rooms.html b/docs/1.0/api/evennia.contrib.tutorials.tutorial_world.rooms.html
index d73deabc2e..98125ac568 100644
--- a/docs/1.0/api/evennia.contrib.tutorials.tutorial_world.rooms.html
+++ b/docs/1.0/api/evennia.contrib.tutorials.tutorial_world.rooms.html
@@ -248,7 +248,7 @@ code except for adding in the details.
@@ -263,7 +263,7 @@ code except for adding in the details.
-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 '}¶
@@ -996,7 +996,7 @@ random chance of eventually finding a light source.
-search_index_entry = {'aliases': 'search l feel fiddle feel around', 'category': 'tutorialworld', 'key': 'look', 'no_prefix': ' search l feel fiddle feel around', '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 fiddle feel around l search', 'category': 'tutorialworld', 'key': 'look', 'no_prefix': ' feel fiddle feel around l 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/1.0/api/evennia.locks.lockfuncs.html b/docs/1.0/api/evennia.locks.lockfuncs.html
index ad3f605269..f2f2ba4ccf 100644
--- a/docs/1.0/api/evennia.locks.lockfuncs.html
+++ b/docs/1.0/api/evennia.locks.lockfuncs.html
@@ -393,7 +393,8 @@ If obj has no location, this lockfunc fails.
This is normally used to lock a Command, so it can be used
-only when out of character.
+only when out of character. When not logged in at all, this
+function will still return True.
-search_index_entry = {'aliases': 'yes no a abort n __nomatch_command y', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' yes no a abort n __nomatch_command y', 'tags': '', 'text': '\n Handle a prompt for yes or no. Press [return] for the default choice.\n\n '}¶
+search_index_entry = {'aliases': 'no n abort y a yes __nomatch_command', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' no n abort y a yes __nomatch_command', 'tags': '', 'text': '\n Handle a prompt for yes or no. Press [return] for the default choice.\n\n '}¶
diff --git a/docs/1.0/api/evennia.utils.evmore.html b/docs/1.0/api/evennia.utils.evmore.html
index 250aaffe44..4d1dd910b0 100644
--- a/docs/1.0/api/evennia.utils.evmore.html
+++ b/docs/1.0/api/evennia.utils.evmore.html
@@ -137,7 +137,7 @@ the caller.msg() construct every time the page is updated.
@@ -163,7 +163,7 @@ the caller.msg() construct every time the page is updated.
-search_index_entry = {'aliases': 'end quit a q abort n p t next top previous e', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' end quit a q abort n p t next top previous e', 'tags': '', 'text': '\n Manipulate the text paging. Catch no-input with aliases.\n '}¶
+search_index_entry = {'aliases': 'e end t next q abort n p top a previous quit', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' e end t next q abort n p top a previous quit', 'tags': '', 'text': '\n Manipulate the text paging. Catch no-input with aliases.\n '}¶