diff --git a/docs/0.9.1/Batch-Processors.html b/docs/0.9.1/Batch-Processors.html deleted file mode 100644 index 5496e8d6ab..0000000000 --- a/docs/0.9.1/Batch-Processors.html +++ /dev/null @@ -1,133 +0,0 @@ - - - - - - - - Batch Processors — Evennia 0.9.1 documentation - - - - - - - - - - - - - -
-
-
-
- -
-

Batch Processors

-

Building a game world is a lot of work, especially when starting out. Rooms should be created, descriptions have to be written, objects must be detailed and placed in their proper places. In many traditional MUD setups you had to do all this online, line by line, over a telnet session.

-

Evennia already moves away from much of this by shifting the main coding work to external Python modules. But also building would be helped if one could do some or all of it externally. Enter Evennia’s batch processors (there are two of them). The processors allows you, as a game admin, to build your game completely offline in normal text files (batch files) that the processors understands. Then, when you are ready, you use the processors to read it all into Evennia (and into the database) in one go.

-

You can of course still build completely online should you want to - this is certainly the easiest way to go when learning and for small build projects. But for major building work, the advantages of using the batch-processors are many:

-
    -
  • It’s hard to compete with the comfort of a modern desktop text editor; Compared to a traditional MUD line input, you can get much better overview and many more features. Also, accidentally pressing Return won’t immediately commit things to the database.

  • -
  • You might run external spell checkers on your batch files. In the case of one of the batch-processors (the one that deals with Python code), you could also run external debuggers and code analyzers on your file to catch problems before feeding it to Evennia.

  • -
  • The batch files (as long as you keep them) are records of your work. They make a natural starting point for quickly re-building your world should you ever decide to start over.

  • -
  • If you are an Evennia developer, using a batch file is a fast way to setup a test-game after having reset the database.

  • -
  • The batch files might come in useful should you ever decide to distribute all or part of your world to others.

  • -
-

There are two batch processors, the Batch-command processor and the Batch-code processor. The first one is the simpler of the two. It doesn’t require any programming knowledge - you basically just list in-game commands in a text file. The code-processor on the other hand is much more powerful but also more complex - it lets you use Evennia’s API to code your world in full-fledged Python code.

- -

If you plan to use international characters in your batchfiles you are wise to read about file encodings below.

-
-

A note on File Encodings

-

As mentioned, both the processors take text files as input and then proceed to process them. As long as you stick to the standard ASCII character set (which means the normal English characters, basically) you should not have to worry much about this section.

-

Many languages however use characters outside the simple ASCII table. Common examples are various apostrophes and umlauts but also completely different symbols like those of the greek or cyrillic alphabets.

-

First, we should make it clear that Evennia itself handles international characters just fine. It (and Django) uses unicode strings internally.

-

The problem is that when reading a text file like the batchfile, we need to know how to decode the byte-data stored therein to universal unicode. That means we need an encoding (a mapping) for how the file stores its data. There are many, many byte-encodings used around the world, with opaque names such as Latin-1, ISO-8859-3 or ARMSCII-8 to pick just a few examples. Problem is that it’s practially impossible to determine which encoding was used to save a file just by looking at it (it’s just a bunch of bytes!). You have to know.

-

With this little introduction it should be clear that Evennia can’t guess but has to assume an encoding when trying to load a batchfile. The text editor and Evennia must speak the same “language” so to speak. Evennia will by default first try the international UTF-8 encoding, but you can have Evennia try any sequence of different encodings by customizing the ENCODINGS list in your settings file. Evennia will use the first encoding in the list that do not raise any errors. Only if none work will the server give up and return an error message.

-

You can often change the text editor encoding (this depends on your editor though), otherwise you need to add the editor’s encoding to Evennia’s ENCODINGS list. If you are unsure, write a test file with lots of non-ASCII letters in the editor of your choice, then import to make sure it works as it should.

-

More help with encodings can be found in the entry Text Encodings and also in the Wikipedia article here.

-

A footnote for the batch-code processor: Just because Evennia can parse your file and your fancy special characters, doesn’t mean that Python allows their use. Python syntax only allows international characters inside strings. In all other source code only ASCII set characters are allowed.

-
-
- - -
-
-
-
- -
-
- - - - \ No newline at end of file diff --git a/docs/0.9.1/Evennia-for-MUSH-Users.html b/docs/0.9.1/Evennia-for-MUSH-Users.html deleted file mode 100644 index 3510681917..0000000000 --- a/docs/0.9.1/Evennia-for-MUSH-Users.html +++ /dev/null @@ -1,238 +0,0 @@ - - - - - - - - Evennia for MUSH Users — Evennia 0.9.1 documentation - - - - - - - - - - - - - -
-
-
-
- -
-

Evennia for MUSH Users

-

This page is adopted from an article originally posted for the MUSH community here on musoapbox.net.

-

MUSHes are text multiplayer games traditionally used for heavily roleplay-focused game styles. They are often (but not always) utilizing game masters and human oversight over code automation. MUSHes are traditionally built on the TinyMUSH-family of game servers, like PennMUSH, TinyMUSH, TinyMUX and RhostMUSH. Also their siblings MUCK and MOO are often mentioned together with MUSH since they all inherit from the same TinyMUD base. A major feature is the ability to modify and program the game world from inside the game by using a custom scripting language. We will refer to this online scripting as softcode here.

-

Evennia works quite differently from a MUSH both in its overall design and under the hood. The same things are achievable, just in a different way. Here are some fundamental differences to keep in mind if you are coming from the MUSH world.

-
-

Developers vs Players

-

In MUSH, users tend to code and expand all aspects of the game from inside it using softcode. A MUSH can thus be said to be managed solely by Players with different levels of access. Evennia on the other hand, differentiates between the role of the Player and the Developer.

-
    -
  • An Evennia Developer works in Python from outside the game, in what MUSH would consider “hardcode”. Developers implement larger-scale code changes and can fundamentally change how the game works. They then load their changes into the running Evennia server. Such changes will usually not drop any connected players.

  • -
  • An Evennia Player operates from inside the game. Some staff-level players are likely to double as developers. Depending on access level, players can modify and expand the game’s world by digging new rooms, creating new objects, alias commands, customize their experience and so on. Trusted staff may get access to Python via the @py command, but this would be a security risk for normal Players to use. So the Player usually operates by making use of the tools prepared for them by the Developer - tools that can be as rigid or flexible as the developer desires.

  • -
-
-
-

Collaborating on a game - Python vs Softcode

-

For a Player, collaborating on a game need not be too different between MUSH and Evennia. The building and description of the game world can still happen mostly in-game using build commands, using text tags and inline functions to prettify and customize the experience. Evennia offers external ways to build a world but those are optional. There is also nothing in principle stopping a Developer from offering a softcode-like language to Players if that is deemed necessary.

-

For Developers of the game, the difference is larger: Code is mainly written outside the game in Python modules rather than in-game on the command line. Python is a very popular and well-supported language with tons of documentation and help to be found. The Python standard library is also a great help for not having to reinvent the wheel. But that said, while Python is considered one of the easier languages to learn and use it is undoubtedly very different from MUSH softcode.

-

While softcode allows collaboration in-game, Evennia’s external coding instead opens up the possibility for collaboration using professional version control tools and bug tracking using websites like github (or bitbucket for a free private repo). Source code can be written in proper text editors and IDEs with refactoring, syntax highlighting and all other conveniences. In short, collaborative development of an Evennia game is done in the same way most professional collaborative development is done in the world, meaning all the best tools can be used.

-
-
-

@parent vs @typeclass and @spawn

-

Inheritance works differently in Python than in softcode. Evennia has no concept of a “master object” that other objects inherit from. There is in fact no reason at all to introduce “virtual objects” in the game world - code and data are kept separate from one another.

-

In Python (which is an object oriented language) one instead creates classes - these are like blueprints from which you spawn any number of object instances. Evennia also adds the extra feature that every instance is persistent in the database (this means no SQL is ever needed). To take one example, a unique character in Evennia is an instances of the class Character.

-

One parallel to MUSH’s @parent command may be Evennia’s @typeclass command, which changes which class an already existing object is an instance of. This way you can literally turn a Character into a Flowerpot on the spot.

-

if you are new to object oriented design it’s important to note that all object instances of a class does not have to be identical. If they did, all Characters would be named the same. Evennia allows to customize individual objects in many different ways. One way is through Attributes, which are database-bound properties that can be linked to any object. For example, you could have an Orc class that defines all the stuff an Orc should be able to do (probably in turn inheriting from some Monster class shared by all monsters). Setting different Attributes on different instances (different strength, equipment, looks etc) would make each Orc unique despite all sharing the same class.

-

The @spawn command allows one to conveniently choose between different “sets” of Attributes to put on each new Orc (like the “warrior” set or “shaman” set) . Such sets can even inherit one another which is again somewhat remniscent at least of the effect of @parent and the object-based inheritance of MUSH.

-

There are other differences for sure, but that should give some feel for things. Enough with the theory. Let’s get down to more practical matters next. To install, see the Getting Started instructions.

-
-
-

A first step making things more familiar

-

We will here give two examples of customizing Evennia to be more familiar to a MUSH Player.

-
-

Activating a multi-descer

-

By default Evennia’s desc command updates your description and that’s it. There is a more feature-rich optional “multi-descer” in evennia/contrib/multidesc.py though. This alternative allows for managing and combining a multitude of keyed descriptions.

-

To activate the multi-descer, cd to your game folder and into the commands sub-folder. There you’ll find the file default_cmdsets.py. In Python lingo all *.py files are called modules. Open the module in a text editor. We won’t go into Evennia in-game Commands and Command sets further here, but suffice to say Evennia allows you to change which commands (or versions of commands) are available to the player from moment to moment depending on circumstance.

-

Add two new lines to the module as seen below:

-
 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
# the file mygame/commands/default_cmdsets.py
-# [...] 
-
-from evennia.contrib import multidescer   # <- added now
-
-class CharacterCmdSet(default_cmds.CharacterCmdSet):
-    """
-    The CharacterCmdSet contains general in-game commands like look,
-    get etc available on in-game Character objects. It is merged with
-    the AccountCmdSet when an Account puppets a Character.
-    """
-    key = "DefaultCharacter"
-
-    def at_cmdset_creation(self):
-        """
-        Populates the cmdset
-        """
-        super().at_cmdset_creation()
-        #
-        # any commands you add below will overload the default ones.
-        #
-        self.add(multidescer.CmdMultiDesc())      # <- added now 
-# [...]
-
-
-

Note that Python cares about indentation, so make sure to indent with the same number of spaces as shown above!

-

So what happens above? We import the module evennia/contrib/multidescer.py at the top. Once imported we can access stuff inside that module using full stop (.). The multidescer is defined as a class CmdMultiDesc (we could find this out by opening said module in a text editor). At the bottom we create a new instance of this class and add it to the CharacterCmdSet class. For the sake of this tutorial we only need to know that CharacterCmdSet contains all commands that should be be available to the Character by default.

-

This whole thing will be triggered when the command set is first created, which happens on server start. So we need to reload Evennia with @reload - no one will be disconnected by doing this. If all went well you should now be able to use desc (or +desc) and find that you have more possibilities:

-
1
-2
-3
-4
-5
-6
> help +desc                  # get help on the command
-> +desc eyes = His eyes are blue. 
-> +desc basic = A big guy.
-> +desc/set basic + + eyes    # we add an extra space between
-> look me
-A big guy. His eyes are blue.
-
-
-

If there are errors, a traceback will show in the server log - several lines of text showing where the error occurred. Find where the error is by locating the line number related to the default_cmdsets.py file (it’s the only one you’ve changed so far). Most likely you mis-spelled something or missed the indentation. Fix it and either @reload again or run evennia start as needed.

-
-
-

Customizing the multidescer syntax

-

As seen above the multidescer uses syntax like this (where |/ are Evennia’s tags for line breaks) :

-
1
> +desc/set basic + |/|/ + cape + footwear + |/|/ + attitude 
-
-
-

This use of + was prescribed by the Developer that coded this +desc command. What if the Player doesn’t like this syntax though? Do players need to pester the dev to change it? Not necessarily. While Evennia does not allow the player to build their own multi-descer on the command line, it does allow for re-mapping the command syntax to one they prefer. This is done using the nick command.

-

Here’s a nick that changes how to input the command above:

-
1
> nick setdesc $1 $2 $3 $4 = +desc/set $1 + |/|/ + $2 + $3 + |/|/ + $4
-
-
-

The string on the left will be matched against your input and if matching, it will be replaced with the string on the right. The $-type tags will store space-separated arguments and put them into the replacement. The nick allows shell-like wildcards, so you can use *, ?, [...], [!...] etc to match parts of the input.

-

The same description as before can now be set as

-
1
> setdesc basic cape footwear attitude 
-
-
-

With the nick functionality players can mitigate a lot of syntax dislikes even without the developer changing the underlying Python code.

-
-
-
-

Next steps

-

If you are a Developer and are interested in making a more MUSH-like Evennia game, a good start is to look into the Evennia Tutorial for a first MUSH-like game. That steps through building a simple little game from scratch and helps to acquaint you with the various corners of Evennia. There is also the Tutorial for running roleplaying sessions that can be of interest.

-

An important aspect of making things more familiar for Players is adding new and tweaking existing commands. How this is done is covered by the Tutorial on adding new commands. You may also find it useful to shop through the evennia/contrib/ folder. The Tutorial world is a small single-player quest you can try (it’s not very MUSH-like but it does show many Evennia concepts in action). Beyond that there are many more tutorials to try out. If you feel you want a more visual overview you can also look at Evennia in pictures.

-

… And of course, if you need further help you can always drop into the Evennia chatroom or post a question in our forum/mailing list!

-
-
- - -
-
-
-
- -
-
- - - - \ No newline at end of file diff --git a/docs/0.9.1/Game-Planning.html b/docs/0.9.1/Game-Planning.html deleted file mode 100644 index 9cab39a31c..0000000000 --- a/docs/0.9.1/Game-Planning.html +++ /dev/null @@ -1,219 +0,0 @@ - - - - - - - - Game Planning — Evennia 0.9.1 documentation - - - - - - - - - - - - - -
-
-
-
- -
-

Game Planning

-

So you have Evennia up and running. You have a great game idea in mind. Now it’s time to start cracking! But where to start? Here are some ideas for a workflow. Note that the suggestions on this page are just that - suggestions. Also, they are primarily aimed at a lone hobby designer or a small team developing a game in their free time. There is an article in the Imaginary Realities e-zine which was written by the Evennia lead dev. It focuses more on you finding out your motivations for making a game - you can read the article here.

-

Below are some minimal steps for getting the first version of a new game world going with players. It’s worth to at least make the attempt to do these steps in order even if you are itching to jump ahead in the development cycle. On the other hand, you should also make sure to keep your work fun for you, or motivation will falter. Making a full game is a lot of work as it is, you’ll need all your motivation to make it a reality.

-

Remember that 99.99999% of all great game ideas never lead to a game. Especially not to an online game that people can actually play and enjoy. So our first all overshadowing goal is to beat those odds and get something out the door! Even if it’s a scaled-down version of your dream game, lacking many “must-have” features! It’s better to get it out there and expand on it later than to code in isolation forever until you burn out, lose interest or your hard drive crashes.

-

Like is common with online games, getting a game out the door does not mean you are going to be “finished” with the game - most MUDs add features gradually over the course of years - it’s often part of the fun!

-
-

Planning (step 1)

-

This is what you do before having coded a single line or built a single room. Many prospective game developers are very good at parts of this process, namely in defining what their world is “about”: The theme, the world concept, cool monsters and so on. It is by all means very important to define what is the unique appeal of your game. But it’s unfortunately not enough to make your game a reality. To do that you must also have an idea of how to actually map those great ideas onto Evennia.

-

A good start is to begin by planning out the basic primitives of the game and what they need to be able to do. Below are a far-from-complete list of examples (and for your first version you should definitely try for a much shorter list):

-
-

Systems

-

These are the behind-the-scenes features that exist in your game, often without being represented by a specific in-game object.

-
    -
  • Should your game rules be enforced by coded systems or are you planning for human game masters to run and arbitrate rules?

  • -
  • What are the actual mechanical game rules? How do you decide if an action succeeds or fails? What “rolls” does the game need to be able to do? Do you base your game off an existing system or make up your own?

  • -
  • Does the flow of time matter in your game - does night and day change? What about seasons? Maybe your magic system is affected by the phase of the moon?

  • -
  • Do you want changing, global weather? This might need to operate in tandem over a large number of rooms.

  • -
  • Do you want a game-wide economy or just a simple barter system? Or no formal economy at all?

  • -
  • Should characters be able to send mail to each other in-game?

  • -
  • Should players be able to post on Bulletin boards?

  • -
  • What is the staff hierarchy in your game? What powers do you want your staff to have?

  • -
  • What should a Builder be able to build and what commands do they need in order to do that?

  • -
  • etc.

  • -
-
-
-

Rooms

-

Consider the most basic room in your game.

-
    -
  • Is a simple description enough or should the description be able to change (such as with time, by light conditions, weather or season)?

  • -
  • Should the room have different statuses? Can it have smells, sounds? Can it be affected by dramatic weather, fire or magical effects? If so, how would this affect things in the room? Or are these things something admins/game masters should handle manually?

  • -
  • Can objects be hidden in the room? Can a person hide in the room? How does the room display this?

  • -
  • etc.

  • -
-
-
-

Objects

-

Consider the most basic (non-player-controlled) object in your game.

-
    -
  • How numerous are your objects? Do you want large loot-lists or are objects just role playing props created on demand?

  • -
  • Does the game use money? If so, is each coin a separate object or do you just store a bank account value?

  • -
  • What about multiple identical objects? Do they form stacks and how are those stacks handled in that case?

  • -
  • Does an object have weight or volume (so you cannot carry an infinite amount of them)?

  • -
  • Can objects be broken? If so, does it have a health value? Is burning it causing the same damage as smashing it? Can it be repaired?

  • -
  • Is a weapon a specific type of object or are you supposed to be able to fight with a chair too? Can you fight with a flower or piece of paper as well?

  • -
  • NPCs/mobs are also objects. Should they just stand around or should they have some sort of AI?

  • -
  • Are NPCs/mobs differet entities? How is an Orc different from a Kobold, in code - are they the same object with different names or completely different types of objects, with custom code?

  • -
  • Should there be NPCs giving quests? If so, how would you track quest status and what happens when multiple players try to do the same quest? Do you use instances or some other mechanism?

  • -
  • etc.

  • -
-
-
-

Characters

-

These are the objects controlled directly by Players.

-
    -
  • Can players have more than one Character active at a time or are they allowed to multi-play?

  • -
  • How does a Player create their Character? A Character-creation screen? Answering questions? Filling in a form?

  • -
  • Do you want to use classes (like “Thief”, “Warrior” etc) or some other system, like Skill-based?

  • -
  • How do you implement different “classes” or “races”? Are they separate types of objects or do you simply load different stats on a basic object depending on what the Player wants?

  • -
  • If a Character can hide in a room, what skill will decide if they are detected?

  • -
  • What skill allows a Character to wield a weapon and hit? Do they need a special skill to wield a chair rather than a sword?

  • -
  • Does a Character need a Strength attribute to tell how much they can carry or which objects they can smash?

  • -
  • What does the skill tree look like? Can a Character gain experience to improve? By killing enemies? Solving quests? By roleplaying?

  • -
  • etc.

  • -
-

A MUD’s a lot more involved than you would think and these things hang together in a complex web. It can easily become overwhelming and it’s tempting to want all functionality right out of the door. Try to identify the basic things that “make” your game and focus only on them for your first release. Make a list. Keep future expansions in mind but limit yourself.

-
-
-
-

Coding (step 2)

-

This is the actual work of creating the “game” part of your game. Many “game-designer” types tend to gloss over this bit and jump directly to World Building. Vice versa, many “game-coder” types tend to jump directly to this part without doing the Planning first. Neither way is good and will lead to you having to redo all your hard work at least once, probably more.

-

Evennia’s Developer Central tries to help you with this bit of development. We also have a slew of Tutorials with worked examples. Evennia tries hard to make this part easier for you, but there is no way around the fact that if you want anything but a very basic Talker-type game you will have to bite the bullet and code your game (or find a coder willing to do it for you).

-

Even if you won’t code anything yourself, as a designer you need to at least understand the basic paradigms of Evennia, such as Objects, Commands and Scripts and how they hang together. We recommend you go through the Tutorial World in detail (as well as glancing at its code) to get at least a feel for what is involved behind the scenes. You could also look through the tutorial for building a game from scratch.

-

During Coding you look back at the things you wanted during the Planning phase and try to implement them. Don’t be shy to update your plans if you find things easier/harder than you thought. The earlier you revise problems, the easier they will be to fix.

-

A good idea is to host your code online (publicly or privately) using version control. Not only will this make it easy for multiple coders to collaborate (and have a bug-tracker etc), it also means your work is backed up at all times. The Version Control tutorial has instructions for setting up a sane developer environment with proper version control.

-
-

“Tech Demo” Building

-

This is an integral part of your Coding. It might seem obvious to experienced coders, but it cannot be emphasized enough that you should test things on a small scale before putting your untested code into a large game-world. The earlier you test, the easier and cheaper it will be to fix bugs and even rework things that didn’t work out the way you thought they would. You might even have to go back to the Planning phase if your ideas can’t handle their meet with reality.

-

This means building singular in-game examples. Make one room and one object of each important type and test so they work correctly in isolation. Then add more if they are supposed to interact with each other in some way. Build a small series of rooms to test how mobs move around … and so on. In short, a test-bed for your growing code. It should be done gradually until you have a fully functioning (if not guaranteed bug-free) miniature tech demo that shows all the features you want in the first release of your game. There does not need to be any game play or even a theme to your tests, this is only for you and your co-coders to see. The more testing you do on this small scale, the less headaches you will have in the next phase.

-
-
-
-

World Building (step 3)

-

Up until this point we’ve only had a few tech-demo objects in the database. This step is the act of populating the database with a larger, thematic world. Too many would-be developers jump to this stage too soon (skipping the Coding or even Planning stages). What if the rooms you build now doesn’t include all the nice weather messages the code grows to support? Or the way you store data changes under the hood? Your building work would at best require some rework and at worst you would have to redo the whole thing. And whereas Evennia’s typeclass system does allow you to edit the properties of existing objects, some hooks are only called at object creation … Suffice to say you are in for a lot of unnecessary work if you build stuff en masse without having the underlying code systems in some reasonable shape first.

-

So before starting to build, the “game” bit (Coding + Testing) should be more or less complete, at least to the level of your initial release.

-

Before starting to build, you should also plan ahead again. Make sure it is clear to yourself and your eventual builders just which parts of the world you want for your initial release. Establish for everyone which style, quality and level of detail you expect. Your goal should not be to complete your entire world in one go. You want just enough to make the game’s “feel” come across. You want a minimal but functioning world where the intended game play can be tested and roughly balanced. You can always add new areas later.

-

During building you get free and extensive testing of whatever custom build commands and systems you have made at this point. Since Building often involves different people than those Coding, you also get a chance to hear if some things are hard to understand or non-intuitive. Make sure to respond to this feedback.

-
-
-

Alpha Release

-

As mentioned, don’t hold onto your world more than necessary. Get it out there with a huge Alpha flag and let people try it! Call upon your alpha-players to try everything - they will find ways to break your game in ways that you never could have imagined. In Alpha you might be best off to focus on inviting friends and maybe other MUD developers, people who you can pester to give proper feedback and bug reports (there will be bugs, there is no way around it). Follow the quick instructions for Online Setup to make your game visible online. If you hadn’t already, make sure to put up your game on the Evennia game index so people know it’s in the works (actually, even pre-alpha games are allowed in the index so don’t be shy)!

-
-
-

Beta Release/Perpetual Beta

-

Once things stabilize in Alpha you can move to Beta and let more people in. Many MUDs are in perpetual beta, meaning they are never considered “finished”, but just repeat the cycle of Planning, Coding, Testing and Building over and over as new features get implemented or Players come with suggestions. As the game designer it is now up to you to gradually perfect your vision.

-
-
-

Congratulate yourself!

-

You are worthy of a celebration since at this point you have joined the small, exclusive crowd who have made their dream game a reality!

-
-
- - -
-
-
-
- -
-
- - - - \ No newline at end of file diff --git a/docs/0.9.1/HAProxy-Config-(Optional).html b/docs/0.9.1/HAProxy-Config-(Optional).html deleted file mode 100644 index 1011c44875..0000000000 --- a/docs/0.9.1/HAProxy-Config-(Optional).html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - - HAProxy Config (Optional) — Evennia 0.9.1 documentation - - - - - - - - - - - - - -
-
-
-
- -
-

HAProxy Config (Optional)

-
-

Evennia, HTTPS and Secure Websockets can play nicely together, quickly.

-

May I suggest giving HAProxy 1.5+ a chance…

-

Installing HAProxy is usually as simple as:

-
# Redhat derivatives
-yum install haproxy
-# dnf instead of yum for very recent Fedora distros.
-
-
-

or

-
# Debian derivatives
-apt install haproxy
-
-
-

Configuration of HAProxy requires a single file given as an argument on the command line:

-
haproxy -f /path/to/config.file
-
-
-

In it (example using haproxy 1.5.18 on Centos7):

-
# stuff provided by the default haproxy installs
-global
-    log /dev/log local0
-    chroot /var/lib/haproxy
-    maxconn  4000
-    user  haproxy
-defaults
-    mode http
-    option forwardfor
-
-# Evennia Specifics
-listen evennia-https-website
-    bind <public-ip-address>:<public-SSL-port--probably-443> ssl no-sslv3 no-tlsv10 crt /path/to/your-cert.pem
-    server localhost 127.0.0.1:<evennia-web-port-probably-4001>
-
-listen evennia-secure-websocket
-    bind <public-ip-address>:<WEBSOCKET_CLIENT_URL 4002> ssl no-sslv3 no-tlsv10 crt /path/to/your-cert.pem
-    server localhost 127.0.0.1:<WEBSOCKET_CLIENT_URL 4002>
-    timeout client 10m
-    timeout server 10m
-
-
-

Then edit mygame/server/conf/settings.py and add:

-
WEBSERVER_INTERFACES = ['127.0.0.1']
-WEBSOCKET_CLIENT_INTERFACE = '127.0.0.1'
-
-
-

or

-
LOCKDOWN_MODE=True
-
-
-

and

-
WEBSOCKET_CLIENT_URL="wss://yourhost.com:4002/"
-
-
-
-
- - -
-
-
-
- -
-
- - - - \ No newline at end of file diff --git a/docs/0.9.1/How-To-Get-And-Give-Help.html b/docs/0.9.1/How-To-Get-And-Give-Help.html deleted file mode 100644 index 7400303bd3..0000000000 --- a/docs/0.9.1/How-To-Get-And-Give-Help.html +++ /dev/null @@ -1,130 +0,0 @@ - - - - - - - - How To Get And Give Help — Evennia 0.9.1 documentation - - - - - - - - - - - - - -
-
-
-
- -
-

How To Get And Give Help

-
-

How to get Help

-

If you cannot find what you are looking for in the [online documentation](online documentation), here’s what to do:

-
    -
  • If you think the documentation is not clear enough and are short on time, fill in our quick little online form and let us know - no login required. Maybe the docs need to be improved or a new tutorial added! Note that while this form is useful as a suggestion box we cannot answer questions or reply to you. Use the discussion group or chat (linked below) if you want feedback.

  • -
  • If you have trouble with a missing feature or a problem you think is a bug, go to the issue tracker and search to see if has been reported/suggested already. If you can’t find an existing entry create a new one.

  • -
  • If you need help, want to start a discussion or get some input on something you are working on, make a post to the discussions group This is technically a ‘mailing list’, but you don’t need to use e-mail; you can post and read all messages just as easily from your browser via the online interface.

  • -
  • If you want more direct discussions with developers and other users, consider dropping into our IRC chat channel #evennia on the Freenode network. Please note however that you have to be patient if you don’t get any response immediately; we are all in very different time zones and many have busy personal lives. So you might have to hang around for a while - you’ll get noticed eventually!

  • -
-
-
-

How to give Help

-

Evennia is a completely non-funded project. It relies on the time donated by its users and developers in order to progress.

-

The first and easiest way you as a user can help us out is by taking part in community discussions and by giving feedback on what is good or bad. Report bugs you find and features you lack to our issue tracker. Just the simple act of letting developers know you are out there using their program is worth a lot. Generally mentioning and reviewing Evennia elsewhere is also a nice way to spread the word.

-

If you’d like to help develop Evennia more hands-on, here are some ways to get going:

-
    -
  • Look through our [online documentation wiki](online documentation wiki) and see if you can help improve or expand the documentation (even small things like fixing typos!). You don’t need any particular permissions to edit the wiki.

  • -
  • Send a message to our discussion group and/or our IRC chat asking about what needs doing, along with what your interests and skills are.

  • -
  • Take a look at our issue tracker and see if there’s something you feel like taking on. here are bugs that need fixes. At any given time there may also be some bounties open - these are issues members of the community has put up money to see fixed (if you want to put up a bounty yourself you can do so via our page on bountysource).

  • -
  • Check out the Contributing page on how to practically contribute with code using github.

  • -
-

… And finally, if you want to help motivate and support development you can also drop some coins in the developer’s cup. You can make a donation via PayPal or, even better, become an Evennia patron on Patreon! This is a great way to tip your hat and show that you appreciate the work done with the server! Finally, if you want to encourage the community to resolve a particular

-
-
- - -
-
-
-
- -
-
- - - - \ No newline at end of file diff --git a/docs/0.9.1/Web-Tutorial.html b/docs/0.9.1/Web-Tutorial.html deleted file mode 100644 index f27c47ce20..0000000000 --- a/docs/0.9.1/Web-Tutorial.html +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - - - Web Tutorial — Evennia 0.9.1 documentation - - - - - - - - - - - - - -
-
-
-
- -
-

Web Tutorial

-

Evennia uses the Django web framework as the basis of both its database configuration and the website it provides. While a full understanding of Django requires reading the Django documentation, we have provided this tutorial to get you running with the basics and how they pertain to Evennia. This text details getting everything set up. The Web-based Character view Tutorial gives a more explicit example of making a custom web page connected to your game, and you may want to read that after finishing this guide.

-
-

A Basic Overview

-

Django is a web framework. It gives you a set of development tools for building a website quickly and easily.

-

Django projects are split up into apps and these apps all contribute to one project. For instance, you might have an app for conducting polls, or an app for showing news posts or, like us, one for creating a web client.

-

Each of these applications has a urls.py file, which specifies what URLs are used by the app, a views.py file for the code that the URLs activate, a templates directory for displaying the results of that code in HTML for the user, and a static folder that holds assets like CSS, Javascript, and Image files (You may note your mygame/web folder does not have a static or template folder. This is intended and explained further below). Django applications may also have a models.py file for storing information in the database. We will not change any models here, take a look at the New Models page (as well as the Django docs on models) if you are interested.

-

There is also a root urls.py that determines the URL structure for the entire project. A starter urls.py is included in the default game template, and automatically imports all of Evennia’s default URLs for you. This is located in web/urls.py.

-
-
-

Changing the logo on the front page

-

Evennia’s default logo is a fun little googly-eyed snake wrapped around a gear globe. As cute as it is, it probably doesn’t represent your game. So one of the first things you may wish to do is replace it with a logo of your own.

-

Django web apps all have static assets: CSS files, Javascript files, and Image files. In order to make sure the final project has all the static files it needs, the system collects the files from every app’s static folder and places it in the STATIC_ROOT defined in settings.py. By default, the Evennia STATIC_ROOT is in web/static.

-

Because Django pulls files from all of those separate places and puts them in one folder, it’s possible for one file to overwrite another. We will use this to plug in our own files without having to change anything in the Evennia itself.

-

By default, Evennia is configured to pull files you put in the web/static_overrides after all other static files. That means that files in static_overrides folder will overwrite any previously loaded files having the same path under its static folder. This last part is important to repeat: To overload the static resource from a standard static folder you need to replicate the path of folders and file names from that static folder in exactly the same way inside static_overrides.

-

Let’s see how this works for our logo. The default web application is in the Evennia library itself, in evennia/web/. We can see that there is a static folder here. If we browse down, we’ll eventually find the full path to the Evennia logo file: evennia/web/static/evennia_general/images/evennia_logo.png.

-

Inside our static_overrides we must replicate the part of the path inside the static folder, in other words, we must replicate evennia_general/images/evennia_logo.png.

-

So, to change the logo, we need to create the folder path evennia_general/images/ in static_overrides. We then rename our own logo file to evennia_logo.png and copy it there. The final path for this file would thus be: web/static_overrides/evennia_general/images/evennia_logo.png in your local game folder.

-

To get this file pulled in, just change to your own game directory and reload the server:

-
evennia reload
-
-
-

This will reload the configuration and bring in the new static file(s). If you didn’t want to reload the server you could instead use

-
evennia collectstatic
-
-
-

to only update the static files without any other changes.

-
-

Note: Evennia will collect static files automatically during startup. So if evennia collectstatic reports finding 0 files to collect, make sure you didn’t start the engine at some point - if so the collector has already done its work! To make sure, connect to the website and check so the logo has actually changed to your own version.

-
-
-

Note: Sometimes the static asset collector can get confused. If no matter what you do, your overridden files aren’t getting copied over the defaults, try removing the target file (or everything) in the web/static directory, and re-running collectstatic to gather everything from scratch.

-
-
-
-

Changing the Front Page’s Text

-

The default front page for Evennia contains information about the Evennia project. You’ll probably want to replace this information with information about your own project. Changing the page template is done in a similar way to changing static resources.

-

Like static files, Django looks through a series of template folders to find the file it wants. The difference is that Django does not copy all of the template files into one place, it just searches through the template folders until it finds a template that matches what it’s looking for. This means that when you edit a template, the changes are instant. You don’t have to reload the server or run any extra commands to see these changes - reloading the web page in your browser is enough.

-

To replace the index page’s text, we’ll need to find the template for it. We’ll go into more detail about how to determine which template is used for rendering a page in the Web-based Character view Tutorial. For now, you should know that the template we want to change is stored in evennia/web/website/templates/website/index.html.

-

To replace this template file, you will put your changed template inside the web/template_overrides/website directory in your game folder. In the same way as with static resources you must replicate the path inside the default template directory exactly. So we must copy our replacement template named index.html there (or create the website directory in web/template_overridesif it does not exist, first). The final path to the file should thus be:web/template_overrides/website/index.html` within your game directory.

-

Note that it is usually easier to just copy the original template over and edit it in place. The original file already has all the markup and tags, ready for editing.

-
-
-

Further reading

-

For further hints on working with the web presence, you could now continue to the Web-based Character view Tutorial where you learn to make a web page that displays in-game character stats. You can also look at Django’s own tutorial to get more insight in how Django works and what possibilities exist.

-
-
- - -
-
-
-
- -
-
- - - - \ No newline at end of file diff --git a/docs/0.9.1/_sources/API-refactoring.md.txt b/docs/0.9.1/_sources/API-refactoring.md.txt deleted file mode 100644 index 5ca45a2779..0000000000 --- a/docs/0.9.1/_sources/API-refactoring.md.txt +++ /dev/null @@ -1,30 +0,0 @@ -# API refactoring - -Building up to Evennia 1.0 and beyond, it's time to comb through the Evennia API for old cruft. This whitepage is for anyone interested to contribute with their views on what part of the API needs refactoring, cleanup or clarification (or extension!) - -Note that this is not a forum. To keep things clean, each opinion text should ideally present a clear argument or lay out a suggestion. Asking for clarification and any side-discussions should be held in chat or forum. - ---- - -### Griatch (Aug 13, 2019) - -This is how to enter an opinion. Use any markdown needed but stay within your section. Also remember to copy your text to the clipboard before saving since if someone else edited the wiki in the meantime you'll have to start over. - -### Griatch (Sept 2, 2019) - -I don't agree with removing explicit keywords as suggested by [Johnny on Aug 29 below](./API-refactoring#reduce-usage-of-optionalpositional-arguments-aug-29-2019). Overriding such a method can still be done by `get(self, **kwargs)` if so desired, making the kwargs explicit helps IMO readability of the API. If just giving a generic `**kwargs`, one must read the docstring or even the code to see which keywords are valid. - -On the other hand, I think it makes sense to as a standard offer an extra `**kwargs` at the end of arg-lists for common methods that are expected to be over-ridden. This make the API more flexible by hinting to the dev that they could expand their own over-ridden implementation with their own keyword arguments if so desired. - ---- - -### Johnny - -#### Reduce usage of optional/positional arguments (Aug 29, 2019) -``` -# AttributeHandler -def get(self, key=None, default=None, category=None, return_obj=False, - strattr=False, raise_exception=False, accessing_obj=None, - default_access=True, return_list=False): -``` -Many classes have methods requiring lengthy positional argument lists, which are tedious and error-prone to extend and override especially in cases where not all arguments are even required. It would be useful if arguments were reserved for required inputs and anything else relegated to kwargs for easier passthrough on extension. diff --git a/docs/0.9.1/_sources/Batch-Code-Processor.md.txt b/docs/0.9.1/_sources/Batch-Code-Processor.md.txt deleted file mode 100644 index a3738a5d5c..0000000000 --- a/docs/0.9.1/_sources/Batch-Code-Processor.md.txt +++ /dev/null @@ -1,158 +0,0 @@ -# Batch Code Processor - - -For an introduction and motivation to using batch processors, see [here](./Batch-Processors). This page describes the Batch-*code* processor. The Batch-*command* one is covered [here](./Batch-Command-Processor). - -## Basic Usage - -The batch-code processor is a superuser-only function, invoked by - - > @batchcode path.to.batchcodefile - -Where `path.to.batchcodefile` is the path to a *batch-code file*. Such a file should have a name ending in "`.py`" (but you shouldn't include that in the path). The path is given like a python path relative to a folder you define to hold your batch files, set by `BATCH_IMPORT_PATH` in your settings. Default folder is (assuming your game is called "mygame") `mygame/world/`. So if you want to run the example batch file in `mygame/world/batch_code.py`, you could simply use - - > @batchcode batch_code - -This will try to run through the entire batch file in one go. For more gradual, *interactive* control you can use the `/interactive` switch. The switch `/debug` will put the processor in *debug* mode. Read below for more info. - -## The batch file - -A batch-code file is a normal Python file. The difference is that since the batch processor loads and executes the file rather than importing it, you can reliably update the file, then call it again, over and over and see your changes without needing to `@reload` the server. This makes for easy testing. In the batch-code file you have also access to the following global variables: - -- `caller` - This is a reference to the object running the batchprocessor. -- `DEBUG` - This is a boolean that lets you determine if this file is currently being run in debug-mode or not. See below how this can be useful. - -Running a plain Python file through the processor will just execute the file from beginning to end. If you want to get more control over the execution you can use the processor's *interactive* mode. This runs certain code blocks on their own, rerunning only that part until you are happy with it. In order to do this you need to add special markers to your file to divide it up into smaller chunks. These take the form of comments, so the file remains valid Python. - -Here are the rules of syntax of the batch-code `*.py` file. - -- `#CODE` as the first on a line marks the start of a *code* block. It will last until the beginning of another marker or the end of the file. Code blocks contain functional python code. Each `#CODE` block will be run in complete isolation from other parts of the file, so make sure it's self-contained. -- `#HEADER` as the first on a line marks the start of a *header* block. It lasts until the next marker or the end of the file. This is intended to hold imports and variables you will need for all other blocks .All python code defined in a header block will always be inserted at the top of every `#CODE` blocks in the file. You may have more than one `#HEADER` block, but that is equivalent to having one big one. Note that you can't exchange data between code blocks, so editing a header-variable in one code block won't affect that variable in any other code block! -- `#INSERT path.to.file` will insert another batchcode (Python) file at that position. -- A `#` that is not starting a `#HEADER`, `#CODE` or `#INSERT` instruction is considered a comment. -- Inside a block, normal Python syntax rules apply. For the sake of indentation, each block acts as a separate python module. - -Below is a version of the example file found in `evennia/contrib/tutorial_examples/`. - -```python - # - # This is an example batch-code build file for Evennia. - # - - #HEADER - - # This will be included in all other #CODE blocks - - from evennia import create_object, search_object - from evennia.contrib.tutorial_examples import red_button - from typeclasses.objects import Object - - limbo = search_object('Limbo')[0] - - - #CODE - - red_button = create_object(red_button.RedButton, key="Red button", - location=limbo, aliases=["button"]) - - # caller points to the one running the script - caller.msg("A red button was created.") - - # importing more code from another batch-code file - #INSERT batch_code_insert - - #CODE - - table = create_object(Object, key="Blue Table", location=limbo) - chair = create_object(Object, key="Blue Chair", location=limbo) - - string = "A %s and %s were created." - if DEBUG: - table.delete() - chair.delete() - string += " Since debug was active, " \ - "they were deleted again." - caller.msg(string % (table, chair)) -``` - -This uses Evennia's Python API to create three objects in sequence. - -## Debug mode - -Try to run the example script with - - > @batchcode/debug tutorial_examples.example_batch_code - -The batch script will run to the end and tell you it completed. You will also get messages that the button and the two pieces of furniture were created. Look around and you should see the button there. But you won't see any chair nor a table! This is because we ran this with the `/debug` switch, which is directly visible as `DEBUG==True` inside the script. In the above example we handled this state by deleting the chair and table again. - -The debug mode is intended to be used when you test out a batchscript. Maybe you are looking for bugs in your code or try to see if things behave as they should. Running the script over and over would then create an ever-growing stack of chairs and tables, all with the same name. You would have to go back and painstakingly delete them later. - -## Interactive mode - -Interactive mode works very similar to the [batch-command processor counterpart](./Batch-Command-Processor). It allows you more step-wise control over how the batch file is executed. This is useful for debugging or for picking and choosing only particular blocks to run. Use `@batchcode` with the `/interactive` flag to enter interactive mode. - - > @batchcode/interactive tutorial_examples.batch_code - -You should see the following: - - 01/02: red_button = create_object(red_button.RedButton, [...] (hh for help) - -This shows that you are on the first `#CODE` block, the first of only two commands in this batch file. Observe that the block has *not* actually been executed at this point! - -To take a look at the full code snippet you are about to run, use `ll` (a batch-processor version of `look`). - -```python - from evennia.utils import create, search - from evennia.contrib.tutorial_examples import red_button - from typeclasses.objects import Object - - limbo = search.objects(caller, 'Limbo', global_search=True)[0] - - red_button = create.create_object(red_button.RedButton, key="Red button", - location=limbo, aliases=["button"]) - - # caller points to the one running the script - caller.msg("A red button was created.") -``` - -Compare with the example code given earlier. Notice how the content of `#HEADER` has been pasted at the top of the `#CODE` block. Use `pp` to actually execute this block (this will create the button and give you a message). Use `nn` (next) to go to the next command. Use `hh` for a list of commands. - -If there are tracebacks, fix them in the batch file, then use `rr` to reload the file. You will still be at the same code block and can rerun it easily with `pp` as needed. This makes for a simple debug cycle. It also allows you to rerun individual troublesome blocks - as mentioned, in a large batch file this can be very useful (don't forget the `/debug` mode either). - -Use `nn` and `bb` (next and back) to step through the file; e.g. `nn 12` will jump 12 steps forward (without processing any blocks in between). All normal commands of Evennia should work too while working in interactive mode. - -## Limitations and Caveats - -The batch-code processor is by far the most flexible way to build a world in Evennia. There are however some caveats you need to keep in mind. - -### Safety -Or rather the lack of it. There is a reason only *superusers* are allowed to run the batch-code processor by default. The code-processor runs **without any Evennia security checks** and allows full access to Python. If an untrusted party could run the code-processor they could execute arbitrary python code on your machine, which is potentially a very dangerous thing. If you want to allow other users to access the batch-code processor you should make sure to run Evennia as a separate and very limited-access user on your machine (i.e. in a 'jail'). By comparison, the batch-command processor is much safer since the user running it is still 'inside' the game and can't really do anything outside what the game commands allow them to. - -### No communication between code blocks -Global variables won't work in code batch files, each block is executed as stand-alone environments. `#HEADER` blocks are literally pasted on top of each `#CODE` block so updating some header-variable in your block will not make that change available in another block. Whereas a python execution limitation, allowing this would also lead to very hard-to-debug code when using the interactive mode - this would be a classical example of "spaghetti code". - -The main practical issue with this is when building e.g. a room in one code block and later want to connect that room with a room you built in the current block. There are two ways to do this: - -- Perform a database search for the name of the room you created (since you cannot know in advance which dbref it got assigned). The problem is that a name may not be unique (you may have a lot of "A dark forest" rooms). There is an easy way to handle this though - use [Tags](./Tags) or *Aliases*. You can assign any number of tags and/or aliases to any object. Make sure that one of those tags or aliases is unique to the room (like "room56") and you will henceforth be able to always uniquely search and find it later. -- Use the `caller` global property as an inter-block storage. For example, you could have a dictionary of room references in an `ndb`: - ```python - #HEADER - if caller.ndb.all_rooms is None: - caller.ndb.all_rooms = {} - - #CODE - # create and store the castle - castle = create_object("rooms.Room", key="Castle") - caller.ndb.all_rooms["castle"] = castle - - #CODE - # in another node we want to access the castle - castle = caller.ndb.all_rooms.get("castle") - ``` -Note how we check in `#HEADER` if `caller.ndb.all_rooms` doesn't already exist before creating the dict. Remember that `#HEADER` is copied in front of every `#CODE` block. Without that `if` statement we'd be wiping the dict every block! - -### Don't treat a batchcode file like any Python file -Despite being a valid Python file, a batchcode file should *only* be run by the batchcode processor. You should not do things like define Typeclasses or Commands in them, or import them into other code. Importing a module in Python will execute base level of the module, which in the case of your average batchcode file could mean creating a lot of new objects every time. -### Don't let code rely on the batch-file's real file path - -When you import things into your batchcode file, don't use relative imports but always import with paths starting from the root of your game directory or evennia library. Code that relies on the batch file's "actual" location *will fail*. Batch code files are read as text and the strings executed. When the code runs it has no knowledge of what file those strings where once a part of. diff --git a/docs/0.9.1/_sources/Batch-Command-Processor.md.txt b/docs/0.9.1/_sources/Batch-Command-Processor.md.txt deleted file mode 100644 index e2ed69d49f..0000000000 --- a/docs/0.9.1/_sources/Batch-Command-Processor.md.txt +++ /dev/null @@ -1,121 +0,0 @@ -# Batch Command Processor - - -For an introduction and motivation to using batch processors, see [here](./Batch-Processors). This page describes the Batch-*command* processor. The Batch-*code* one is covered [here](./Batch-Code-Processor). - -## Basic Usage - -The batch-command processor is a superuser-only function, invoked by - - > @batchcommand path.to.batchcmdfile - -Where `path.to.batchcmdfile` is the path to a *batch-command file* with the "`.ev`" file ending. This path is given like a python path relative to a folder you define to hold your batch files, set with `BATCH_IMPORT_PATH` in your settings. Default folder is (assuming your game is in the `mygame` folder) `mygame/world`. So if you want to run the example batch file in `mygame/world/batch_cmds.ev`, you could use - - > @batchcommand batch_cmds - -A batch-command file contains a list of Evennia in-game commands separated by comments. The processor will run the batch file from beginning to end. Note that *it will not stop if commands in it fail* (there is no universal way for the processor to know what a failure looks like for all different commands). So keep a close watch on the output, or use *Interactive mode* (see below) to run the file in a more controlled, gradual manner. - -## The batch file - -The batch file is a simple plain-text file containing Evennia commands. Just like you would write them in-game, except you have more freedom with line breaks. - -Here are the rules of syntax of an `*.ev` file. You'll find it's really, really simple: - -- All lines having the `#` (hash)-symbol *as the first one on the line* are considered *comments*. All non-comment lines are treated as a command and/or their arguments. -- Comment lines have an actual function -- they mark the *end of the previous command definition*. So never put two commands directly after one another in the file - separate them with a comment, or the second of the two will be considered an argument to the first one. Besides, using plenty of comments is good practice anyway. -- A line that starts with the word `#INSERT` is a comment line but also signifies a special instruction. The syntax is `#INSERT ` and tries to import a given batch-cmd file into this one. The inserted batch file (file ending `.ev`) will run normally from the point of the `#INSERT` instruction. -- Extra whitespace in a command definition is *ignored*. - A completely empty line translates in to a line break in texts. Two empty lines thus means a new paragraph (this is obviously only relevant for commands accepting such formatting, such as the `@desc` command). -- The very last command in the file is not required to end with a comment. -- You *cannot* nest another `@batchcommand` statement into your batch file. If you want to link many batch-files together, use the `#INSERT` batch instruction instead. You also cannot launch the `@batchcode` command from your batch file, the two batch processors are not compatible. - -Below is a version of the example file found in `evennia/contrib/tutorial_examples/batch_cmds.ev`. - -```bash - # - # This is an example batch build file for Evennia. - # - - # This creates a red button - @create button:tutorial_examples.red_button.RedButton - # (This comment ends input for @create) - # Next command. Let's create something. - @set button/desc = - This is a large red button. Now and then - it flashes in an evil, yet strangely tantalizing way. - - A big sign sits next to it. It says: - - - ----------- - - Press me! - - ----------- - - - ... It really begs to be pressed! You - know you want to! - - # This inserts the commands from another batch-cmd file named - # batch_insert_file.ev. - #INSERT examples.batch_insert_file - - - # (This ends the @set command). Note that single line breaks - # and extra whitespace in the argument are ignored. Empty lines - # translate into line breaks in the output. - # Now let's place the button where it belongs (let's say limbo #2 is - # the evil lair in our example) - @teleport #2 - # (This comments ends the @teleport command.) - # Now we drop it so others can see it. - # The very last command in the file needs not be ended with #. - drop button -``` - -To test this, run `@batchcommand` on the file: - - > @batchcommand contrib.tutorial_examples.batch_cmds - -A button will be created, described and dropped in Limbo. All commands will be executed by the user calling the command. - -> Note that if you interact with the button, you might find that its description changes, loosing your custom-set description above. This is just the way this particular object works. - -## Interactive mode - -Interactive mode allows you to more step-wise control over how the batch file is executed. This is useful for debugging and also if you have a large batch file and is only updating a small part of it -- running the entire file again would be a waste of time (and in the case of `@create`-ing objects you would to end up with multiple copies of same-named objects, for example). Use `@batchcommand` with the `/interactive` flag to enter interactive mode. - - > @batchcommand/interactive tutorial_examples.batch_cmds - -You will see this: - - 01/04: @create button:tutorial_examples.red_button.RedButton (hh for help) - -This shows that you are on the `@create` command, the first out of only four commands in this batch file. Observe that the command `@create` has *not* been actually processed at this point! - -To take a look at the full command you are about to run, use `ll` (a batch-processor version of `look`). Use `pp` to actually process the current command (this will actually `@create` the button) -- and make sure it worked as planned. Use `nn` (next) to go to the next command. Use `hh` for a list of commands. - -If there are errors, fix them in the batch file, then use `rr` to reload the file. You will still be at the same command and can rerun it easily with `pp` as needed. This makes for a simple debug cycle. It also allows you to rerun individual troublesome commands - as mentioned, in a large batch file this can be very useful. Do note that in many cases, commands depend on the previous ones (e.g. if `@create` in the example above had failed, the following commands would have had nothing to operate on). - -Use `nn` and `bb` (next and back) to step through the file; e.g. `nn 12` will jump 12 steps forward (without processing any command in between). All normal commands of Evennia should work too while working in interactive mode. - -## Limitations and Caveats - -The batch-command processor is great for automating smaller builds or for testing new commands and objects repeatedly without having to write so much. There are several caveats you have to be aware of when using the batch-command processor for building larger, complex worlds though. - -The main issue is that when you run a batch-command script you (*you*, as in your superuser character) are actually moving around in the game creating and building rooms in sequence, just as if you had been entering those commands manually, one by one. You have to take this into account when creating the file, so that you can 'walk' (or teleport) to the right places in order. - -This also means there are several pitfalls when designing and adding certain types of objects. Here are some examples: - -- *Rooms that change your [Command Set](./Command-Sets)*: Imagine that you build a 'dark' room, which severely limits the cmdsets of those entering it (maybe you have to find the light switch to proceed). In your batch script you would create this room, then teleport to it - and promptly be shifted into the dark state where none of your normal build commands work ... -- *Auto-teleportation*: Rooms that automatically teleport those that enter them to another place (like a trap room, for example). You would be teleported away too. -- *Mobiles*: If you add aggressive mobs, they might attack you, drawing you into combat. If they have AI they might even follow you around when building - or they might move away from you before you've had time to finish describing and equipping them! - -The solution to all these is to plan ahead. Make sure that superusers are never affected by whatever effects are in play. Add an on/off switch to objects and make sure it's always set to *off* upon creation. It's all doable, one just needs to keep it in mind. - -## Assorted notes - -The fact that you build as 'yourself' can also be considered an advantage however, should you ever decide to change the default command to allow others than superusers to call the processor. Since normal access-checks are still performed, a malevolent builder with access to the processor should not be able to do all that much damage (this is the main drawback of the [Batch Code Processor](./Batch-Code-Processor)) - -- [GNU Emacs](https://www.gnu.org/software/emacs/) users might find it interesting to use emacs' *evennia mode*. This is an Emacs major mode found in `evennia/utils/evennia-mode.el`. It offers correct syntax highlighting and indentation with `` when editing `.ev` files in Emacs. See the header of that file for installation instructions. -- [VIM](http://www.vim.org/) users can use amfl's [vim-evennia](https://github.com/amfl/vim-evennia) mode instead, see its readme for install instructions. \ No newline at end of file diff --git a/docs/0.9.1/_sources/Batch-Processors.md.txt b/docs/0.9.1/_sources/Batch-Processors.md.txt deleted file mode 100644 index a1a0eb0443..0000000000 --- a/docs/0.9.1/_sources/Batch-Processors.md.txt +++ /dev/null @@ -1,39 +0,0 @@ -# Batch Processors - - -Building a game world is a lot of work, especially when starting out. Rooms should be created, descriptions have to be written, objects must be detailed and placed in their proper places. In many traditional MUD setups you had to do all this online, line by line, over a telnet session. - -Evennia already moves away from much of this by shifting the main coding work to external Python modules. But also building would be helped if one could do some or all of it externally. Enter Evennia's *batch processors* (there are two of them). The processors allows you, as a game admin, to build your game completely offline in normal text files (*batch files*) that the processors understands. Then, when you are ready, you use the processors to read it all into Evennia (and into the database) in one go. - -You can of course still build completely online should you want to - this is certainly the easiest way to go when learning and for small build projects. But for major building work, the advantages of using the batch-processors are many: -- It's hard to compete with the comfort of a modern desktop text editor; Compared to a traditional MUD line input, you can get much better overview and many more features. Also, accidentally pressing Return won't immediately commit things to the database. -- You might run external spell checkers on your batch files. In the case of one of the batch-processors (the one that deals with Python code), you could also run external debuggers and code analyzers on your file to catch problems before feeding it to Evennia. -- The batch files (as long as you keep them) are records of your work. They make a natural starting point for quickly re-building your world should you ever decide to start over. -- If you are an Evennia developer, using a batch file is a fast way to setup a test-game after having reset the database. -- The batch files might come in useful should you ever decide to distribute all or part of your world to others. - - -There are two batch processors, the Batch-*command* processor and the Batch-*code* processor. The first one is the simpler of the two. It doesn't require any programming knowledge - you basically just list in-game commands in a text file. The code-processor on the other hand is much more powerful but also more complex - it lets you use Evennia's API to code your world in full-fledged Python code. - -- The [Batch Command Processor](./Batch-Command-Processor) -- The [Batch Code Processor](./Batch-Code-Processor) - -If you plan to use international characters in your batchfiles you are wise to read about *file encodings* below. - -## A note on File Encodings - -As mentioned, both the processors take text files as input and then proceed to process them. As long as you stick to the standard [ASCII](http://en.wikipedia.org/wiki/Ascii) character set (which means the normal English characters, basically) you should not have to worry much about this section. - -Many languages however use characters outside the simple `ASCII` table. Common examples are various apostrophes and umlauts but also completely different symbols like those of the greek or cyrillic alphabets. - -First, we should make it clear that Evennia itself handles international characters just fine. It (and Django) uses [unicode](http://en.wikipedia.org/wiki/Unicode) strings internally. - -The problem is that when reading a text file like the batchfile, we need to know how to decode the byte-data stored therein to universal unicode. That means we need an *encoding* (a mapping) for how the file stores its data. There are many, many byte-encodings used around the world, with opaque names such as `Latin-1`, `ISO-8859-3` or `ARMSCII-8` to pick just a few examples. Problem is that it's practially impossible to determine which encoding was used to save a file just by looking at it (it's just a bunch of bytes!). You have to *know*. - -With this little introduction it should be clear that Evennia can't guess but has to *assume* an encoding when trying to load a batchfile. The text editor and Evennia must speak the same "language" so to speak. Evennia will by default first try the international `UTF-8` encoding, but you can have Evennia try any sequence of different encodings by customizing the `ENCODINGS` list in your settings file. Evennia will use the first encoding in the list that do not raise any errors. Only if none work will the server give up and return an error message. - -You can often change the text editor encoding (this depends on your editor though), otherwise you need to add the editor's encoding to Evennia's `ENCODINGS` list. If you are unsure, write a test file with lots of non-ASCII letters in the editor of your choice, then import to make sure it works as it should. - -More help with encodings can be found in the entry [Text Encodings](./Text-Encodings) and also in the Wikipedia article [here](http://en.wikipedia.org/wiki/Text_encodings). - -**A footnote for the batch-code processor**: Just because *Evennia* can parse your file and your fancy special characters, doesn't mean that *Python* allows their use. Python syntax only allows international characters inside *strings*. In all other source code only `ASCII` set characters are allowed. diff --git a/docs/0.9.1/_sources/Bootstrap-&-Evennia.md.txt b/docs/0.9.1/_sources/Bootstrap-&-Evennia.md.txt deleted file mode 100644 index 641d4495ca..0000000000 --- a/docs/0.9.1/_sources/Bootstrap-&-Evennia.md.txt +++ /dev/null @@ -1,75 +0,0 @@ -# Bootstrap & Evennia - -# What is Bootstrap? -Evennia's new default web page uses a framework called [Bootstrap](https://getbootstrap.com/). This framework is in use across the internet - you'll probably start to recognize its influence once you learn some of the common design patterns. This switch is great for web developers, perhaps like yourself, because instead of wondering about setting up different grid systems or what custom class another designer used, we have a base, a bootstrap, to work from. Bootstrap is responsive by default, and comes with some default styles that Evennia has lightly overrode to keep some of the same colors and styles you're used to from the previous design. - -For your reading pleasure, a brief overview of Bootstrap follows. For more in-depth info, please read [the documentation](https://getbootstrap.com/docs/4.0/getting-started/introduction/). -*** - -## The Layout System -Other than the basic styling Bootstrap includes, it also includes [a built in layout and grid system](https://getbootstrap.com/docs/4.0/layout/overview/). -The first part of this system is [the container](https://getbootstrap.com/docs/4.0/layout/overview/#containers). - -The container is meant to hold all your page content. Bootstrap provides two types: fixed-width and full-width. -Fixed-width containers take up a certain max-width of the page - they're useful for limiting the width on Desktop or Tablet platforms, instead of making the content span the width of the page. -``` -
- -
-``` -Full width containers take up the maximum width available to them - they'll span across a wide-screen desktop or a smaller screen phone, edge-to-edge. -``` -
- -
-``` - -The second part of the layout system is [the grid](https://getbootstrap.com/docs/4.0/layout/grid/). This is the bread-and-butter of the layout of Bootstrap - it allows you to change the size of elements depending on the size of the screen, without writing any media queries. We'll briefly go over it - to learn more, please read the docs or look at the source code for Evennia's home page in your browser. -> Important! Grid elements should be in a .container or .container-fluid. This will center the contents of your site. - -Bootstrap's grid system allows you to create rows and columns by applying classes based on breakpoints. The default breakpoints are extra small, small, medium, large, and extra-large. If you'd like to know more about these breakpoints, please [take a look at the documentation for them.](https://getbootstrap.com/docs/4.0/layout/overview/#responsive-breakpoints) - -To use the grid system, first create a container for your content, then add your rows and columns like so: -``` -
-
-
- 1 of 3 -
-
- 2 of 3 -
-
- 3 of 3 -
-
-
-``` -This layout would create three equal-width columns. - -To specify your sizes - for instance, Evennia's default site has three columns on desktop and tablet, but reflows to single-column on smaller screens. Try it out! -``` -
-
-
- 1 of 4 -
-
- 2 of 4 -
-
- 3 of 4 -
-
- 4 of 4 -
-
-
-``` -This layout would be 4 columns on large screens, 2 columns on medium screens, and 1 column on anything smaller. - -To learn more about Bootstrap's grid, please [take a look at the docs](https://getbootstrap.com/docs/4.0/layout/grid/) -*** - -## More Bootstrap -Bootstrap also provides a huge amount of utilities, as well as styling and content elements. To learn more about them, please [read the Bootstrap docs](https://getbootstrap.com/docs/4.0/getting-started/introduction/) or read one of our other web tutorials. \ No newline at end of file diff --git a/docs/0.9.1/_sources/Building-Permissions.md.txt b/docs/0.9.1/_sources/Building-Permissions.md.txt deleted file mode 100644 index f100361258..0000000000 --- a/docs/0.9.1/_sources/Building-Permissions.md.txt +++ /dev/null @@ -1,38 +0,0 @@ -# Building Permissions - - -*OBS: This gives only a brief introduction to the access system. Locks and permissions are fully detailed* [here](./Locks). - -## The super user - -There are strictly speaking two types of users in Evennia, the *super user* and everyone else. The superuser is the first user you create, object `#1`. This is the all-powerful server-owner account. Technically the superuser not only has access to everything, it *bypasses* the permission checks entirely. This makes the superuser impossible to lock out, but makes it unsuitable to actually play-test the game's locks and restrictions with (see `@quell` below). Usually there is no need to have but one superuser. - -## Assigning permissions - -Whereas permissions can be used for anything, those put in `settings.PERMISSION_HIERARCHY` will have a ranking relative each other as well. We refer to these types of permissions as *hierarchical permissions*. When building locks to check these permissions, the `perm()` [lock function](./Locks) is used. By default Evennia creates the following hierarchy (spelled exactly like this): - -1. **Developers** basically have the same access as superusers except that they do *not* sidestep the Permission system. Assign only to really trusted server-admin staff since this level gives access both to server reload/shutdown functionality as well as (and this may be more critical) gives access to the all-powerful `@py` command that allows the execution of arbitrary Python code on the command line. -1. **Admins** can do everything *except* affecting the server functions themselves. So an Admin couldn't reload or shutdown the server for example. They also cannot execute arbitrary Python code on the console or import files from the hard drive. -1. **Builders** - have all the build commands, but cannot affect other accounts or mess with the server. -1. **Helpers** are almost like a normal *Player*, but they can also add help files to the database. -1. **Players** is the default group that new players end up in. A new player have permission to use tells and to use and create new channels. - -A user having a certain level of permission automatically have access to locks specifying access of a lower level. - -To assign a new permission from inside the game, you need to be able to use the `@perm` command. This is an *Developer*-level command, but it could in principle be made lower-access since it only allows assignments equal or lower to your current level (so you cannot use it to escalate your own permission level). So, assuming you yourself have *Developer* access (or is superuser), you assign a new account "Tommy" to your core staff with the command - - @perm/account Tommy = Developer - -or - - @perm *Tommy = Developer - -We use a switch or the `*name` format to make sure to put the permission on the *Account* and not on any eventual *Character* that may also be named "Tommy". This is usually what you want since the Account will then remain an Developer regardless of which Character they are currently controlling. To limit permission to a per-Character level you should instead use *quelling* (see below). Normally permissions can be any string, but for these special hierarchical permissions you can also use plural ("Developer" and "Developers" both grant the same powers). - -## Quelling your permissions - -When developing it can be useful to check just how things would look had your permission-level been lower. For this you can use *quelling*. Normally, when you puppet a Character you are using your Account-level permission. So even if your Character only has *Accounts* level permissions, your *Developer*-level Account will take precedence. With the `@quell` command you can change so that the Character's permission takes precedence instead: - - @quell - -This will allow you to test out the game using the current Character's permission level. A developer or builder can thus in principle maintain several test characters, all using different permission levels. Note that you cannot escalate your permissions this way; If the Character happens to have a *higher* permission level than the Account, the *Account's* (lower) permission will still be used. diff --git a/docs/0.9.1/_sources/Building-Quickstart.md.txt b/docs/0.9.1/_sources/Building-Quickstart.md.txt deleted file mode 100644 index 09140ccdf2..0000000000 --- a/docs/0.9.1/_sources/Building-Quickstart.md.txt +++ /dev/null @@ -1,197 +0,0 @@ -# Building Quickstart - - -The [default command](./Default-Command-Help) definitions coming with Evennia -follows a style [similar](./Using-MUX-as-a-Standard) to that of MUX, so the -commands should be familiar if you used any such code bases before. - -> Throughout the larger documentation you may come across commands prefixed -> with `@`. This is just an optional marker used in some places to make a -> command stand out. Evennia defaults to ignoring the use of `@` in front of -> your command (so entering `dig` is the same as entering `@dig`). - -The default commands have the following style (where `[...]` marks optional parts): - - command[/switch/switch...] [arguments ...] - -A _switch_ is a special, optional flag to the command to make it behave differently. It is always put directly after the command name, and begins with a forward slash (`/`). The _arguments_ are one or more inputs to the commands. It's common to use an equal sign (`=`) when assigning something to an object. - -Below are some examples of commands you can try when logged in to the game. Use `help ` for learning more about each command and their detailed options. - -## Stepping Down From Godhood - -If you just installed Evennia, your very first player account is called user #1, also known as the _superuser_ or _god user_. This user is very powerful, so powerful that it will override many game restrictions such as locks. This can be useful, but it also hides some functionality that you might want to test. - -To temporarily step down from your superuser position you can use the `quell` command in-game: - - quell - -This will make you start using the permission of your current character's level instead of your superuser level. If you didn't change any settings your game Character should have an _Developer_ level permission - high as can be without bypassing locks like the superuser does. This will work fine for the examples on this page. Use `unquell` to get back to superuser status again afterwards. - -## Creating an Object - -Basic objects can be anything -- swords, flowers and non-player characters. They are created using the `create` command: - - create box - -This created a new 'box' (of the default object type) in your inventory. Use the command `inventory` (or `i`) to see it. Now, 'box' is a rather short name, let's rename it and tack on a few aliases. - - name box = very large box;box;very;crate - -We now renamed the box to _very large box_ (and this is what we will see when looking at it), but we will also recognize it by any of the other names we give - like _crate_ or simply _box_ as before. We could have given these aliases directly after the name in the `create` command, this is true for all creation commands - you can always tag on a list of `;`-separated aliases to the name of your new object. If you had wanted to not change the name itself, but to only add aliases, you could have used the `alias` command. - -We are currently carrying the box. Let's drop it (there is also a short cut to create and drop in one go by using the `/drop` switch, for example `create/drop box`). - - drop box - -Hey presto - there it is on the ground, in all its normality. - - examine box - -This will show some technical details about the box object. For now we will ignore what this information means. - -Try to `look` at the box to see the (default) description. - - look box - You see nothing special. - -The description you get is not very exciting. Let's add some flavor. - - describe box = This is a large and very heavy box. - -If you try the `get` command we will pick up the box. So far so good, but if we really want this to be a large and heavy box, people should _not_ be able to run off with it that easily. To prevent this we need to lock it down. This is done by assigning a _Lock_ to it. Make sure the box was dropped in the room, then try this: - - lock box = get:false() - -Locks represent a rather [big topic](./Locks), but for now that will do what we want. This will lock the box so noone can lift it. The exception is superusers, they override all locks and will pick it up anyway. Make sure you are quelling your superuser powers and try to get the box now: - - > get box - You can't get that. - -Think thís default error message looks dull? The `get` command looks for an [Attribute](./Attributes) named `get_err_msg` for returning a nicer error message (we just happen to know this, you would need to peek into the [code](https://github.com/evennia/evennia/blob/master/evennia/commands/default/general.py#L235) for the `get` command to find out.). You set attributes using the `set` command: - - set box/get_err_msg = It's way too heavy for you to lift. - -Try to get it now and you should see a nicer error message echoed back to you. To see what this message string is in the future, you can use 'examine.' - - examine box/get_err_msg - -Examine will return the value of attributes, including color codes. `examine here/desc` would return the raw description of your current room (including color codes), so that you can copy-and-paste to set its description to something else. - -You create new Commands (or modify existing ones) in Python outside the game. See the [Adding Commands tutorial](./Adding-Command-Tutorial) for help with creating your first own Command. - -## Get a Personality - -[Scripts](./Scripts) are powerful out-of-character objects useful for many "under the hood" things. One of their optional abilities is to do things on a timer. To try out a first script, let's put one on ourselves. There is an example script in `evennia/contrib/tutorial_examples/bodyfunctions.py` that is called `BodyFunctions`. To add this to us we will use the `script` command: - - script self = tutorial_examples.bodyfunctions.BodyFunctions - -(note that you don't have to give the full path as long as you are pointing to a place inside the `contrib` directory, it's one of the places Evennia looks for Scripts). Wait a while and you will notice yourself starting making random observations. - - script self - -This will show details about scripts on yourself (also `examine` works). You will see how long it is until it "fires" next. Don't be alarmed if nothing happens when the countdown reaches zero - this particular script has a randomizer to determine if it will say something or not. So you will not see output every time it fires. - -When you are tired of your character's "insights", kill the script with - - script/stop self = tutorial_examples.bodyfunctions.BodyFunctions - -You create your own scripts in Python, outside the game; the path you give to `script` is literally the Python path to your script file. The [Scripts](./Scripts) page explains more details. - -## Pushing Your Buttons - -If we get back to the box we made, there is only so much fun you can do with it at this point. It's just a dumb generic object. If you renamed it to `stone` and changed its description noone would be the wiser. However, with the combined use of custom [Typeclasses](./Typeclasses), [Scripts](./Scripts) and object-based [Commands](./Commands), you could expand it and other items to be as unique, complex and interactive as you want. - -Let's take an example. So far we have only created objects that use the default object typeclass named simply `Object`. Let's create an object that is a little more interesting. Under `evennia/contrib/tutorial_examples` there is a module `red_button.py`. It contains the enigmatic `RedButton` typeclass. - -Let's make us one of _those_! - - create/drop button:tutorial_examples.red_button.RedButton - -We import the RedButton python class the same way you would import it in Python except Evennia makes sure to look in`evennia/contrib/` so you don't have to write the full path every time. There you go - one red button. - -The RedButton is an example object intended to show off a few of Evennia's features. You will find that the [Typeclass](./Typeclasses) and [Commands](./Commands) controlling it are inside `evennia/contrib/tutorial_examples/`. - -If you wait for a while (make sure you dropped it!) the button will blink invitingly. Why don't you try to push it ...? Surely a big red button is meant to be pushed. You know you want to. - -## Making Yourself a House - -The main command for shaping the game world is `dig`. For example, if you are standing in Limbo you can dig a route to your new house location like this: - - dig house = large red door;door;in,to the outside;out - -This will create a new room named 'house'. Spaces at the start/end of names and aliases are ignored so you could put more air if you wanted. This call will directly create an exit from your current location named 'large red door' and a corresponding exit named 'to the outside' in the house room leading back to Limbo. We also define a few aliases to those exits, so people don't have to write the full thing all the time. - -If you wanted to use normal compass directions (north, west, southwest etc), you could do that with `dig` too. But Evennia also has a limited version of `dig` that helps for compass directions (and also up/down and in/out). It's called `tunnel`: - - tunnel sw = cliff - -This will create a new room "cliff" with an exit "southwest" leading there and a path "northeast" leading back from the cliff to your current location. - -You can create new exits from where you are using the `open` command: - - open north;n = house - -This opens an exit `north` (with an alias `n`) to the previously created room `house`. - -If you have many rooms named `house` you will get a list of matches and have to select which one you want to link to. You can also give its database (#dbref) number, which is unique to every object. This can be found with the `examine` command or by looking at the latest constructions with `objects`. - -Follow the north exit to your 'house' or `teleport` to it: - - north - -or: - - teleport house - -To manually open an exit back to Limbo (if you didn't do so with the `dig` command): - - open door = limbo - -(or give limbo's dbref which is #2) - -## Reshuffling the World - -You can find things using the `find` command. Assuming you are back at `Limbo`, let's teleport the _large box to our house_. - - > teleport box = house - very large box is leaving Limbo, heading for house. - Teleported very large box -> house. - -We can still find the box by using find: - - > find box - One Match(#1-#8): - very large box(#8) - src.objects.objects.Object - -Knowing the `#dbref` of the box (#8 in this example), you can grab the box and get it back here without actually yourself going to `house` first: - - teleport #8 = here - -(You can usually use `here` to refer to your current location. To refer to yourself you can use `self` or `me`). The box should now be back in Limbo with you. - -We are getting tired of the box. Let's destroy it. - - destroy box - -You can destroy many objects in one go by giving a comma-separated list of objects (or their #dbrefs, if they are not in the same location) to the command. - -## Adding a Help Entry - -An important part of building is keeping the help files updated. You can add, delete and append to existing help entries using the `sethelp` command. - - sethelp/add MyTopic = This help topic is about ... - -## Adding a World - -After this brief introduction to building you may be ready to see a more fleshed-out example. Evennia comes with a tutorial world for you to explore. - -First you need to switch back to _superuser_ by using the `unquell` command. Next, place yourself in `Limbo` and run the following command: - - batchcommand tutorial_world.build - -This will take a while (be patient and don't re-run the command). You will see all the commands used to build the world scroll by as the world is built for you. - -You will end up with a new exit from Limbo named _tutorial_. Apart from being a little solo-adventure in its own right, the tutorial world is a good source for learning Evennia building (and coding). - -Read [the batch file](https://github.com/evennia/evennia/blob/master/evennia/contrib/tutorial_world/build.ev) to see exactly how it's built, step by step. See also more info about the tutorial world [here](./Tutorial-World-Introduction). diff --git a/docs/0.9.1/_sources/Choosing-An-SQL-Server.md.txt b/docs/0.9.1/_sources/Choosing-An-SQL-Server.md.txt deleted file mode 100644 index fff698dd3d..0000000000 --- a/docs/0.9.1/_sources/Choosing-An-SQL-Server.md.txt +++ /dev/null @@ -1,182 +0,0 @@ -# Choosing An SQL Server - - -This page gives an overview of the supported SQL databases as well as instructions on install: - - - SQLite3 (default) - - PostgreSQL - - MySQL / MariaDB - -Since Evennia uses [Django](http://djangoproject.com), most of our notes are based off of what we know from the community and their documentation. While the information below may be useful, you can always find the most up-to-date and "correct" information at Django's [Notes about supported Databases](http://docs.djangoproject.com/en/dev/ref/databases/#ref-databases) page. - -## SQLite3 - -[SQLite3](https://sqlite.org/) is a light weight single-file database. It is our default database and Evennia will set this up for you automatically if you give no other options. SQLite stores the database in a single file (`mygame/server/evennia.db3`). This means it's very easy to reset this database - just delete (or move) that `evennia.db3` file and run `evennia migrate` again! No server process is needed and the administrative overhead and resource consumption is tiny. It is also very fast since it's run in-memory. For the vast majority of Evennia installs it will probably be all that's ever needed. - -SQLite will generally be much faster than MySQL/PostgreSQL but its performance comes with two drawbacks: - -* SQLite [ignores length constraints by design](https://www.sqlite.org/faq.html#q9); it is possible to store very large strings and numbers in fields that technically should not accept them. This is not something you will notice; your game will read and write them and function normally, but this *can* create some data migration problems requiring careful thought if you do need to change databases later. -* SQLite can scale well to storage of millions of objects, but if you end up with a thundering herd of users trying to access your MUD and web site at the same time, or you find yourself writing long-running functions to update large numbers of objects on a live game, either will yield errors and interference. SQLite does not work reliably with multiple concurrent threads or processes accessing its records. This has to do with file-locking clashes of the database file. So for a production server making heavy use of process- or thread pools (or when using a third-party webserver like Apache), a proper database is a more appropriate choice. - -### Install of SQlite3 - -This is installed and configured as part of Evennia. The database file is created as `mygame/server/evennia.db3` when you run - - evennia migrate - -without changing any database options. An optional requirement is the `sqlite3` client program - this is required if you want to inspect the database data manually. A shortcut for using it with the evennia database is `evennia dbshell`. Linux users should look for the `sqlite3` package for their distro while Mac/Windows should get the [sqlite-tools package from this page](https://sqlite.org/download.html). - -To inspect the default Evennia database (once it's been created), go to your game dir and do - -```bash - sqlite3 server/evennia.db3 - # or - evennia dbshell -``` - -This will bring you into the sqlite command line. Use `.help` for instructions and `.quit` to exit. See [here](https://gist.github.com/vincent178/10889334) for a cheat-sheet of commands. - -## PostgreSQL - -[PostgreSQL](https://www.postgresql.org/) is an open-source database engine, recommended by Django. While not as fast as SQLite for normal usage, it will scale better than SQLite, especially if your game has an very large database and/or extensive web presence through a separate server process. - -### Install and initial setup of PostgreSQL - -First, install the posgresql server. Version `9.6` is tested with Evennia. Packages are readily available for all distributions. You need to also get the `psql` client (this is called `postgresql-client` on debian-derived systems). Windows/Mac users can [find what they need on the postgresql download page](https://www.postgresql.org/download/). You should be setting up a password for your database-superuser (always called `postgres`) when you install. - -For interaction with Evennia you need to also install `psycopg2` to your Evennia install (`pip install psycopg2-binary` in your virtualenv). This acts as the python bridge to the database server. - -Next, start the postgres client: - -```bash - psql -U postgres --password -``` -> :warning: **Warning:** With the `--password` argument, Postgres should prompt you for a password. -If it won't, replace that with `-p yourpassword` instead. Do not use the `-p` argument unless you have to since the resulting command, and your password, will be logged in the shell history. - -This will open a console to the postgres service using the psql client. - -On the psql command line: - -```sql -CREATE USER evennia WITH PASSWORD 'somepassword'; -CREATE DATABASE evennia; - --- Postgres-specific optimizations --- https://docs.djangoproject.com/en/dev/ref/databases/#optimizing-postgresql-s-configuration -ALTER ROLE evennia SET client_encoding TO 'utf8'; -ALTER ROLE evennia SET default_transaction_isolation TO 'read committed'; -ALTER ROLE evennia SET timezone TO 'UTC'; - -GRANT ALL PRIVILEGES ON DATABASE evennia TO evennia; --- Other useful commands: --- \l (list all databases and permissions) --- \q (exit) - -``` -[Here](https://gist.github.com/Kartones/dd3ff5ec5ea238d4c546) is a cheat-sheet for psql commands. - -We create a database user 'evennia' and a new database named `evennia` (you can call them whatever you want though). We then grant the 'evennia' user full privileges to the new database so it can read/write etc to it. -If you in the future wanted to completely wipe the database, an easy way to do is to log in as the `postgres` superuser again, then do `DROP DATABASE evennia;`, then `CREATE` and `GRANT` steps above again to recreate the database and grant privileges. - -### Evennia PostgreSQL configuration - -Edit `mygame/server/conf/secret_settings.py and add the following section: - -```python -# -# PostgreSQL Database Configuration -# -DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.postgresql_psycopg2', - 'NAME': 'evennia', - 'USER': 'evennia', - 'PASSWORD': 'somepassword', - 'HOST': 'localhost', - 'PORT': '' # use default - }} -``` - -If you used some other name for the database and user, enter those instead. Run - - evennia migrate - -to populate your database. Should you ever want to inspect the database directly you can from now on also use - - evennia dbshell - -as a shortcut to get into the postgres command line for the right database and user. - -With the database setup you should now be able to start start Evennia normally with your new database. - -## MySQL / MariaDB - -[MySQL](https://www.mysql.com/) is a commonly used proprietary database system, on par with PostgreSQL. There is an open-source alternative called [MariaDB](https://mariadb.org/) that mimics all functionality and command syntax of the former. So this section covers both. - -### Installing and initial setup of MySQL/MariaDB - -First, install and setup MariaDB or MySQL for your specific server. Linux users should look for the `mysql-server` or `mariadb-server` packages for their respective distributions. Windows/Mac users will find what they need from the [MySQL downloads](https://www.mysql.com/downloads/) or [MariaDB downloads](https://mariadb.org/download/) pages. You also need the respective database clients (`mysql`, `mariadb-client`), so you can setup the database itself. When you install the server you should usually be asked to set up the database root user and password. - -You will finally also need a Python interface to allow Evennia to talk to the database. Django recommends the `mysqlclient` one. Install this into the evennia virtualenv with `pip install mysqlclient`. - -Start the database client (this is named the same for both mysql and mariadb): - -```bash -mysql -u root -p -``` - -You should get to enter your database root password (set this up when you installed the database server). - -Inside the database client interface: - -```sql -CREATE USER 'evennia'@'localhost' IDENTIFIED BY 'somepassword'; -CREATE DATABASE evennia; -ALTER DATABASE `evennia` CHARACTER SET utf8; -- note that it's `evennia` with back-ticks, not quotes! -GRANT ALL PRIVILEGES ON evennia.* TO 'evennia'@'localhost'; -FLUSH PRIVILEGES; --- use 'exit' to quit client -``` -[Here](https://gist.github.com/hofmannsven/9164408) is a mysql command cheat sheet. - -Above we created a new local user and database (we called both 'evennia' here, you can name them what you prefer). We set the character set to `utf8` to avoid an issue with prefix character length that can pop up on some installs otherwise. Next we grant the 'evennia' user all privileges on the `evennia` database and make sure the privileges are applied. Exiting the client brings us back to the normal terminal/console. - -> Note: If you are not using MySQL for anything else you might consider granting the 'evennia' user full privileges with `GRANT ALL PRIVILEGES ON *.* TO 'evennia'@'localhost';`. If you do, it means you can use `evennia dbshell` later to connect to mysql, drop your database and re-create it as a way of easy reset. Without this extra privilege you will be able to drop the database but not re-create it without first switching to the database-root user. - -## Add MySQL configuration to Evennia - -To tell Evennia to use your new database you need to edit `mygame/server/conf/settings.py` (or `secret_settings.py` if you don't want your db info passed around on git repositories). - -> Note: The Django documentation suggests using an external `db.cnf` or other external conf-formatted file. Evennia users have however found that this leads to problems (see e.g. [issue #1184](https://git.io/vQdiN)). To avoid trouble we recommend you simply put the configuration in your settings as below. - -```python - # - # MySQL Database Configuration - # - DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.mysql', - 'NAME': 'evennia', - 'USER': 'evennia', - 'PASSWORD': 'somepassword', - 'HOST': 'localhost', # or an IP Address that your DB is hosted on - 'PORT': '', # use default port - } - } -``` -Change this to fit your database setup. Next, run: - - evennia migrate - -to populate your database. Should you ever want to inspect the database directly you can from now on also use - - evennia dbshell - -as a shortcut to get into the postgres command line for the right database and user. - -With the database setup you should now be able to start start Evennia normally with your new database. - -## Others - -No testing has been performed with Oracle, but it is also supported through Django. There are community maintained drivers for [MS SQL](http://code.google.com/p/django-mssql/) and possibly a few others. If you try other databases out, consider expanding this page with instructions. diff --git a/docs/0.9.1/_sources/Coding-Introduction.md.txt b/docs/0.9.1/_sources/Coding-Introduction.md.txt deleted file mode 100644 index ed6d8e9537..0000000000 --- a/docs/0.9.1/_sources/Coding-Introduction.md.txt +++ /dev/null @@ -1,62 +0,0 @@ -# Coding Introduction - - -Evennia allows for a lot of freedom when designing your game - but to code efficiently you still need to adopt some best practices as well as find a good place to start to learn. - -Here are some pointers to get you going. - -### Python - -Evennia is developed using Python. Even if you are more of a designer than a coder, it is wise to learn how to read and understand basic Python code. If you are new to Python, or need a refresher, take a look at our two-part [Python introduction](./Python-basic-introduction). - -### Explore Evennia interactively - -When new to Evennia it can be hard to find things or figure out what is available. Evennia offers a special interactive python shell that allows you to experiment and try out things. It's recommended to use [ipython](http://ipython.org/) for this since the vanilla python prompt is very limited. Here are some simple commands to get started: - - # [open a new console/terminal] - # [activate your evennia virtualenv in this console/terminal] - pip install ipython # [only needed the first time] - cd mygame - evennia shell - -This will open an Evennia-aware python shell (using ipython). From within this shell, try - - import evennia - evennia. - -That is, enter `evennia.` and press the `` key. This will show you all the resources made available at the top level of Evennia's "flat API". See the [flat API](./Evennia-API) page for more info on how to explore it efficiently. - -You can complement your exploration by peeking at the sections of the much more detailed [Developer Central](./Developer-Central). The [Tutorials](./Tutorials) section also contains a growing collection of system- or implementation-specific help. - -### Use a python syntax checker - -Evennia works by importing your own modules and running them as part of the server. Whereas Evennia should just gracefully tell you what errors it finds, it can nevertheless be a good idea for you to check your code for simple syntax errors *before* you load it into the running server. There are many python syntax checkers out there. A fast and easy one is [pyflakes](https://pypi.python.org/pypi/pyflakes), a more verbose one is [pylint](http://www.pylint.org/). You can also check so that your code looks up to snuff using [pep8](https://pypi.python.org/pypi/pep8). Even with a syntax checker you will not be able to catch every possible problem - some bugs or problems will only appear when you actually run the code. But using such a checker can be a good start to weed out the simple problems. - -### Plan before you code - -Before you start coding away at your dream game, take a look at our [Game Planning](./Game-Planning) page. It might hopefully help you avoid some common pitfalls and time sinks. - -### Code in your game folder, not in the evennia/ repository - -As part of the Evennia setup you will create a game folder to host your game code. This is your home. You should *never* need to modify anything in the `evennia` library (anything you download from us, really). You import useful functionality from here and if you see code you like, copy&paste it out into your game folder and edit it there. - -If you find that Evennia doesn't support some functionality you need, make a [Feature Request](feature-request) about it. Same goes for [bugs][bug]. If you add features or fix bugs yourself, please consider [Contributing](./Contributing) your changes upstream! - -### Learn to read tracebacks - -Python is very good at reporting when and where things go wrong. A *traceback* shows everything you need to know about crashing code. The text can be pretty long, but you usually are only interested in the last bit, where it says what the error is and at which module and line number it happened - armed with this info you can resolve most problems. - -Evennia will usually not show the full traceback in-game though. Instead the server outputs errors to the terminal/console from which you started Evennia in the first place. If you want more to show in-game you can add `IN_GAME_ERRORS = True` to your settings file. This will echo most (but not all) tracebacks both in-game as well as to the terminal/console. This is a potential security problem though, so don't keep this active when your game goes into production. - -> A common confusing error is finding that objects in-game are suddenly of the type `DefaultObject` rather than your custom typeclass. This happens when you introduce a critical Syntax error to the module holding your custom class. Since such a module is not valid Python, Evennia can't load it at all. Instead of crashing, Evennia will then print the full traceback to the terminal/console and temporarily fall back to the safe `DefaultObject` until you fix the problem and reload. - -### Docs are here to help you - -Some people find reading documentation extremely dull and shun it out of principle. That's your call, but reading docs really *does* help you, promise! Evennia's documentation is pretty thorough and knowing what is possible can often give you a lot of new cool game ideas. That said, if you can't find the answer in the docs, don't be shy to ask questions! The [discussion group](https://sites.google.com/site/evenniaserver/discussions) and the [irc chat](http://webchat.freenode.net/?channels=evennia) are also there for you. - -### The most important point - -And finally, of course, have fun! - -[feature-request]: (https://github.com/evennia/evennia/issues/new?title=Feature+Request%3a+%3Cdescriptive+title+here%3E&body=%23%23%23%23+Description+of+the+suggested+feature+and+how+it+is+supposed+to+work+for+the+admin%2fend+user%3a%0D%0A%0D%0A%0D%0A%23%23%23%23+A+list+of+arguments+for+why+you+think+this+new+feature+should+be+included+in+Evennia%3a%0D%0A%0D%0A1.%0D%0A2.%0D%0A%0D%0A%23%23%23%23+Extra+information%2c+such+as+requirements+or+ideas+on+implementation%3a%0D%0A%0D%0A -[bug]: https://github.com/evennia/evennia/issues/new?title=Bug%3a+%3Cdescriptive+title+here%3E&body=%23%23%23%23+Steps+to+reproduce+the+issue%3a%0D%0A%0D%0A1.+%0D%0A2.+%0D%0A3.+%0D%0A%0D%0A%23%23%23%23+What+I+expect+to+see+and+what+I+actually+see+%28tracebacks%2c+error+messages+etc%29%3a%0D%0A%0D%0A%0D%0A%0D%0A%23%23%23%23+Extra+information%2c+such+as+Evennia+revision%2frepo%2fbranch%2c+operating+system+and+ideas+for+how+to+solve%3a%0D%0A%0D%0A diff --git a/docs/0.9.1/_sources/Command-Sets.md.txt b/docs/0.9.1/_sources/Command-Sets.md.txt deleted file mode 100644 index 8ce6cf462d..0000000000 --- a/docs/0.9.1/_sources/Command-Sets.md.txt +++ /dev/null @@ -1,217 +0,0 @@ -# Command Sets - - -Command Sets are intimately linked with [Commands](./Commands) and you should be familiar with Commands before reading this page. The two pages were split for ease of reading. - -A *Command Set* (often referred to as a CmdSet or cmdset) is the basic unit for storing one or more *Commands*. A given Command can go into any number of different command sets. Storing Command classes in a command set is the way to make commands available to use in your game. - -When storing a CmdSet on an object, you will make the commands in that command set available to the object. An example is the default command set stored on new Characters. This command set contains all the useful commands, from `look` and `inventory` to `@dig` and `@reload` ([permissions](./Locks#Permissions) then limit which players may use them, but that's a separate topic). - -When an account enters a command, cmdsets from the Account, Character, its location, and elsewhere are pulled together into a *merge stack*. This stack is merged together in a specific order to create a single "merged" cmdset, representing the pool of commands available at that very moment. - -An example would be a `Window` object that has a cmdset with two commands in it: `look through window` and `open window`. The command set would be visible to players in the room with the window, allowing them to use those commands only there. You could imagine all sorts of clever uses of this, like a `Television` object which had multiple commands for looking at it, switching channels and so on. The tutorial world included with Evennia showcases a dark room that replaces certain critical commands with its own versions because the Character cannot see. - -If you want a quick start into defining your first commands and using them with command sets, you can head over to the [Adding Command Tutorial](./Adding-Command-Tutorial) which steps through things without the explanations. - -## Defining Command Sets - -A CmdSet is, as most things in Evennia, defined as a Python class inheriting from the correct parent (`evennia.CmdSet`, which is a shortcut to `evennia.commands.cmdset.CmdSet`). The CmdSet class only needs to define one method, called `at_cmdset_creation()`. All other class parameters are optional, but are used for more advanced set manipulation and coding (see the [merge rules](./Command-Sets#merge-rules) section). - -```python -# file mygame/commands/mycmdset.py - -from evennia import CmdSet - -# this is a theoretical custom module with commands we -# created previously: mygame/commands/mycommands.py -from commands import mycommands - -class MyCmdSet(CmdSet): - def at_cmdset_creation(self): - """ - The only thing this method should need - to do is to add commands to the set. - """ - self.add(mycommands.MyCommand1()) - self.add(mycommands.MyCommand2()) - self.add(mycommands.MyCommand3()) -``` - -The CmdSet's `add()` method can also take another CmdSet as input. In this case all the commands from that CmdSet will be appended to this one as if you added them line by line: - -```python - def at_cmdset_creation(): - ... - self.add(AdditionalCmdSet) # adds all command from this set - ... -``` - -If you added your command to an existing cmdset (like to the default cmdset), that set is already loaded into memory. You need to make the server aware of the code changes: - -``` -@reload -``` - -You should now be able to use the command. - -If you created a new, fresh cmdset, this must be added to an object in order to make the commands within available. A simple way to temporarily test a cmdset on yourself is use the `@py` command to execute a python snippet: - -```python -@py self.cmdset.add('commands.mycmdset.MyCmdSet') -``` - -This will stay with you until you `@reset` or `@shutdown` the server, or you run - -```python -@py self.cmdset.delete('commands.mycmdset.MyCmdSet') -``` - -In the example above, a specific Cmdset class is removed. Calling `delete` without arguments will remove the latest added cmdset. - -> Note: Command sets added using `cmdset.add` are, by default, *not* persistent in the database. - -If you want the cmdset to survive a reload, you can do: - -``` -@py self.cmdset.add(commands.mycmdset.MyCmdSet, permanent=True) -``` - -Or you could add the cmdset as the *default* cmdset: - -``` -@py self.cmdset.add_default(commands.mycmdset.MyCmdSet) -``` - -An object can only have one "default" cmdset (but can also have none). This is meant as a safe fall-back even if all other cmdsets fail or are removed. It is always persistent and will not be affected by `cmdset.delete()`. To remove a default cmdset you must explicitly call `cmdset.remove_default()`. - -Command sets are often added to an object in its `at_object_creation` method. For more examples of adding commands, read the [Step by step tutorial](./Adding-Command-Tutorial). Generally you can customize which command sets are added to your objects by using `self.cmdset.add()` or `self.cmdset.add_default()`. - -> Important: Commands are identified uniquely by key *or* alias (see [Commands](./Commands)). If any overlap exists, two commands are considered identical. Adding a Command to a command set that already has an identical command will *replace* the previous command. This is very important. You must take this behavior into account when attempting to overload any default Evennia commands with your own. Otherwise, you may accidentally "hide" your own command in your command set when adding a new one that has a matching alias. - -### Properties on Command Sets - -There are several extra flags that you can set on CmdSets in order to modify how they work. All are optional and will be set to defaults otherwise. Since many of these relate to *merging* cmdsets, you might want to read the [Adding and Merging Command Sets](./Command-Sets#adding-and-merging-command-sets) section for some of these to make sense. - -- `key` (string) - an identifier for the cmdset. This is optional, but should be unique. It is used for display in lists, but also to identify special merging behaviours using the `key_mergetype` dictionary below. -- `mergetype` (string) - allows for one of the following string values: "*Union*", "*Intersect*", "*Replace*", or "*Remove*". -- `priority` (int) - This defines the merge order of the merge stack - cmdsets will merge in rising order of priority with the highest priority set merging last. During a merger, the commands from the set with the higher priority will have precedence (just what happens depends on the [merge type](./Command-Sets#adding-and-merging-command-sets)). If priority is identical, the order in the merge stack determines preference. The priority value must be greater or equal to `-100`. Most in-game sets should usually have priorities between `0` and `100`. Evennia default sets have priorities as follows (these can be changed if you want a different distribution): - - EmptySet: `-101` (should be lower than all other sets) - - SessionCmdSet: `-20` - - AccountCmdSet: `-10` - - CharacterCmdSet: `0` - - ExitCmdSet: ` 101` (generally should always be available) - - ChannelCmdSet: `101` (should usually always be available) - since exits never accept arguments, there is no collision between exits named the same as a channel even though the commands "collide". -- `key_mergetype` (dict) - a dict of `key:mergetype` pairs. This allows this cmdset to merge differently with certain named cmdsets. If the cmdset to merge with has a `key` matching an entry in `key_mergetype`, it will not be merged according to the setting in `mergetype` but according to the mode in this dict. Please note that this is more complex than it may seem due to the [merge order](./Command-Sets#adding-and-merging-command-sets) of command sets. Please review that section before using `key_mergetype`. -- `duplicates` (bool/None default `None`) - this determines what happens when merging same-priority cmdsets containing same-key commands together. The`dupicate` option will *only* apply when merging the cmdset with this option onto one other cmdset with the same priority. The resulting cmdset will *not* retain this `duplicate` setting. - - `None` (default): No duplicates are allowed and the cmdset being merged "onto" the old one will take precedence. The result will be unique commands. *However*, the system will assume this value to be `True` for cmdsets on Objects, to avoid dangerous clashes. This is usually the safe bet. - - `False`: Like `None` except the system will not auto-assume any value for cmdsets defined on Objects. - - `True`: Same-named, same-prio commands will merge into the same cmdset. This will lead to a multimatch error (the user will get a list of possibilities in order to specify which command they meant). This is is useful e.g. for on-object cmdsets (example: There is a `red button` and a `green button` in the room. Both have a `press button` command, in cmdsets with the same priority. This flag makes sure that just writing `press button` will force the Player to define just which object's command was intended). -- `no_objs` this is a flag for the cmdhandler that builds the set of commands available at every moment. It tells the handler not to include cmdsets from objects around the account (nor from rooms or inventory) when building the merged set. Exit commands will still be included. This option can have three values: - - `None` (default): Passthrough of any value set explicitly earlier in the merge stack. If never set explicitly, this acts as `False`. - - `True`/`False`: Explicitly turn on/off. If two sets with explicit `no_objs` are merged, priority determines what is used. -- `no_exits` - this is a flag for the cmdhandler that builds the set of commands available at every moment. It tells the handler not to include cmdsets from exits. This flag can have three values: - - `None` (default): Passthrough of any value set explicitly earlier in the merge stack. If never set explicitly, this acts as `False`. - - `True`/`False`: Explicitly turn on/off. If two sets with explicit `no_exits` are merged, priority determines what is used. -- `no_channels` (bool) - this is a flag for the cmdhandler that builds the set of commands available at every moment. It tells the handler not to include cmdsets from available in-game channels. This flag can have three values: - - `None` (default): Passthrough of any value set explicitly earlier in the merge stack. If never set explicitly, this acts as `False`. - - `True`/`False`: Explicitly turn on/off. If two sets with explicit `no_channels` are merged, priority determines what is used. - -## Command Sets Searched - -When a user issues a command, it is matched against the [merged](./Command-Sets#adding-and-merging-command-sets) command sets available to the player at the moment. Which those are may change at any time (such as when the player walks into the room with the `Window` object described earlier). - -The currently valid command sets are collected from the following sources: - -- The cmdsets stored on the currently active [Session](./Sessions). Default is the empty `SessionCmdSet` with merge priority `-20`. -- The cmdsets defined on the [Account](./Accounts). Default is the AccountCmdSet with merge priority `-10`. -- All cmdsets on the Character/Object (assuming the Account is currently puppeting such a Character/Object). Merge priority `0`. -- The cmdsets of all objects carried by the puppeted Character (checks the `call` lock). Will not be included if `no_objs` option is active in the merge stack. -- The cmdsets of the Character's current location (checks the `call` lock). Will not be included if `no_objs` option is active in the merge stack. -- The cmdsets of objects in the current location (checks the `call` lock). Will not be included if `no_objs` option is active in the merge stack. -- The cmdsets of Exits in the location. Merge priority `+101`. Will not be included if `no_exits` *or* `no_objs` option is active in the merge stack. -- The [channel](./Communications) cmdset containing commands for posting to all channels the account or character is currently connected to. Merge priority `+101`. Will not be included if `no_channels` option is active in the merge stack. - -Note that an object does not *have* to share its commands with its surroundings. A Character's cmdsets should not be shared for example, or all other Characters would get multi-match errors just by being in the same room. The ability of an object to share its cmdsets is managed by its `call` [lock](./Locks). For example, [Character objects](./Objects) defaults to `call:false()` so that any cmdsets on them can only be accessed by themselves, not by other objects around them. Another example might be to lock an object with `call:inside()` to only make their commands available to objects inside them, or `cmd:holds()` to make their commands available only if they are held. - -## Adding and Merging Command Sets - -*Note: This is an advanced topic. It's very useful to know about, but you might want to skip it if this is your first time learning about commands.* - -CmdSets have the special ability that they can be *merged* together into new sets. Which of the ingoing commands end up in the merged set is defined by the *merge rule* and the relative *priorities* of the two sets. Removing the latest added set will restore things back to the way it was before the addition. - -CmdSets are non-destructively stored in a stack inside the cmdset handler on the object. This stack is parsed to create the "combined" cmdset active at the moment. CmdSets from other sources are also included in the merger such as those on objects in the same room (like buttons to press) or those introduced by state changes (such as when entering a menu). The cmdsets are all ordered after priority and then merged together in *reverse order*. That is, the higher priority will be merged "onto" lower-prio ones. By defining a cmdset with a merge-priority between that of two other sets, you will make sure it will be merged in between them. -The very first cmdset in this stack is called the *Default cmdset* and is protected from accidental deletion. Running `obj.cmdset.delete()` will never delete the default set. Instead one should add new cmdsets on top of the default to "hide" it, as described below. Use the special `obj.cmdset.delete_default()` only if you really know what you are doing. - -CmdSet merging is an advanced feature useful for implementing powerful game effects. Imagine for example a player entering a dark room. You don't want the player to be able to find everything in the room at a glance - maybe you even want them to have a hard time to find stuff in their backpack! You can then define a different CmdSet with commands that override the normal ones. While they are in the dark room, maybe the `look` and `inv` commands now just tell the player they cannot see anything! Another example would be to offer special combat commands only when the player is in combat. Or when being on a boat. Or when having taken the super power-up. All this can be done on the fly by merging command sets. - -### Merge Rules - -Basic rule is that command sets are merged in *reverse priority order*. That is, lower-prio sets are merged first and higher prio sets are merged "on top" of them. Think of it like a layered cake with the highest priority on top. - -To further understand how sets merge, we need to define some examples. Let's call the first command set **A** and the second **B**. We assume **B** is the command set already active on our object and we will merge **A** onto **B**. In code terms this would be done by `object.cdmset.add(A)`. Remember, B is already active on `object` from before. - -We let the **A** set have higher priority than **B**. A priority is simply an integer number. As seen in the list above, Evennia's default cmdsets have priorities in the range `-101` to `120`. You are usually safe to use a priority of `0` or `1` for most game effects. - -In our examples, both sets contain a number of commands which we'll identify by numbers, like `A1, A2` for set **A** and `B1, B2, B3, B4` for **B**. So for that example both sets contain commands with the same keys (or aliases) "1" and "2" (this could for example be "look" and "get" in the real game), whereas commands 3 and 4 are unique to **B**. To describe a merge between these sets, we would write `A1,A2 + B1,B2,B3,B4 = ?` where `?` is a list of commands that depend on which merge type **A** has, and which relative priorities the two sets have. By convention, we read this statement as "New command set **A** is merged onto the old command set **B** to form **?**". - -Below are the available merge types and how they work. Names are partly borrowed from [Set theory](http://en.wikipedia.org/wiki/Set_theory). - -- **Union** (default) - The two cmdsets are merged so that as many commands as possible from each cmdset ends up in the merged cmdset. Same-key commands are merged by priority. - - # Union - A1,A2 + B1,B2,B3,B4 = A1,A2,B3,B4 - -- **Intersect** - Only commands found in *both* cmdsets (i.e. which have the same keys) end up in the merged cmdset, with the higher-priority cmdset replacing the lower one's commands. - - # Intersect - A1,A3,A5 + B1,B2,B4,B5 = A1,A5 - -- **Replace** - The commands of the higher-prio cmdset completely replaces the lower-priority cmdset's commands, regardless of if same-key commands exist or not. - - # Replace - A1,A3 + B1,B2,B4,B5 = A1,A3 - -- **Remove** - The high-priority command sets removes same-key commands from the lower-priority cmdset. They are not replaced with anything, so this is a sort of filter that prunes the low-prio set using the high-prio one as a template. - - # Remove - A1,A3 + B1,B2,B3,B4,B5 = B2,B4,B5 - -Besides `priority` and `mergetype`, a command-set also takes a few other variables to control how they merge: - -- `duplicates` (bool) - determines what happens when two sets of equal priority merge. Default is that the new set in the merger (i.e. **A** above) automatically takes precedence. But if *duplicates* is true, the result will be a merger with more than one of each name match. This will usually lead to the player receiving a multiple-match error higher up the road, but can be good for things like cmdsets on non-player objects in a room, to allow the system to warn that more than one 'ball' in the room has the same 'kick' command defined on it and offer a chance to select which ball to kick ... Allowing duplicates only makes sense for *Union* and *Intersect*, the setting is ignored for the other mergetypes. -- `key_mergetypes` (dict) - allows the cmdset to define a unique mergetype for particular cmdsets, identified by their cmdset `key`. Format is `{CmdSetkey:mergetype}`. Example: `{'Myevilcmdset','Replace'}` which would make sure for this set to always use 'Replace' on the cmdset with the key `Myevilcmdset` only, no matter what the main `mergetype` is set to. - -> Warning: The `key_mergetypes` dictionary *can only work on the cmdset we merge onto*. When using `key_mergetypes` it is thus important to consider the merge priorities - you must make sure that you pick a priority *between* the cmdset you want to detect and the next higher one, if any. That is, if we define a cmdset with a high priority and set it to affect a cmdset that is far down in the merge stack, we would not "see" that set when it's time for us to merge. Example: Merge stack is `A(prio=-10), B(prio=-5), C(prio=0), D(prio=5)`. We now merge a cmdset `E(prio=10)` onto this stack, with a `key_mergetype={"B":"Replace"}`. But priorities dictate that we won't be merged onto B, we will be merged onto E (which is a merger of the lower-prio sets at this point). Since we are merging onto E and not B, our `key_mergetype` directive won't trigger. To make sure it works we must make sure we merge onto B. Setting E's priority to, say, -4 will make sure to merge it onto B and affect it appropriately. - -More advanced cmdset example: - -```python -from commands import mycommands - -class MyCmdSet(CmdSet): - - key = "MyCmdSet" - priority = 4 - mergetype = "Replace" - key_mergetypes = {'MyOtherCmdSet':'Union'} - - def at_cmdset_creation(self): - """ - The only thing this method should need - to do is to add commands to the set. - """ - self.add(mycommands.MyCommand1()) - self.add(mycommands.MyCommand2()) - self.add(mycommands.MyCommand3()) -``` - -### Assorted Notes - -It is very important to remember that two commands are compared *both* by their `key` properties *and* by their `aliases` properties. If either keys or one of their aliases match, the two commands are considered the *same*. So consider these two Commands: - - - A Command with key "kick" and alias "fight" - - A Command with key "punch" also with an alias "fight" - -During the cmdset merging (which happens all the time since also things like channel commands and exits are merged in), these two commands will be considered *identical* since they share alias. It means only one of them will remain after the merger. Each will also be compared with all other commands having any combination of the keys and/or aliases "kick", "punch" or "fight". - -... So avoid duplicate aliases, it will only cause confusion. \ No newline at end of file diff --git a/docs/0.9.1/_sources/Commands.md.txt b/docs/0.9.1/_sources/Commands.md.txt deleted file mode 100644 index b527735af0..0000000000 --- a/docs/0.9.1/_sources/Commands.md.txt +++ /dev/null @@ -1,452 +0,0 @@ -# Commands - - -Commands are intimately linked to [Command Sets](./Command-Sets) and you need to read that page too to be familiar with how the command system works. The two pages were split for easy reading. - -The basic way for users to communicate with the game is through *Commands*. These can be commands directly related to the game world such as *look*, *get*, *drop* and so on, or administrative commands such as *examine* or *@dig*. - -The [default commands](./Default-Command-Help) coming with Evennia are 'MUX-like' in that they use @ for admin commands, support things like switches, syntax with the '=' symbol etc, but there is nothing that prevents you from implementing a completely different command scheme for your game. You can find the default commands in `evennia/commands/default`. You should not edit these directly - they will be updated by the Evennia team as new features are added. Rather you should look to them for inspiration and inherit your own designs from them. - -There are two components to having a command running - the *Command* class and the [Command Set](./Command-Sets) (command sets were split into a separate wiki page for ease of reading). - -1. A *Command* is a python class containing all the functioning code for what a command does - for example, a *get* command would contain code for picking up objects. -1. A *Command Set* (often referred to as a CmdSet or cmdset) is like a container for one or more Commands. A given Command can go into any number of different command sets. Only by putting the command set on a character object you will make all the commands therein available to use by that character. You can also store command sets on normal objects if you want users to be able to use the object in various ways. Consider a "Tree" object with a cmdset defining the commands *climb* and *chop down*. Or a "Clock" with a cmdset containing the single command *check time*. - -This page goes into full detail about how to use Commands. To fully use them you must also read the page detailing [Command Sets](./Command-Sets). There is also a step-by-step [Adding Command Tutorial](./Adding-Command-Tutorial) that will get you started quickly without the extra explanations. - -## Defining Commands - -All commands are implemented as normal Python classes inheriting from the base class `Command` (`evennia.Command`). You will find that this base class is very "bare". The default commands of Evennia actually inherit from a child of `Command` called `MuxCommand` - this is the class that knows all the mux-like syntax like `/switches`, splitting by "=" etc. Below we'll avoid mux-specifics and use the base `Command` class directly. - -```python - # basic Command definition - from evennia import Command - - class MyCmd(Command): - """ - This is the help-text for the command - """ - key = "mycommand" - def parse(self): - # parsing the command line here - def func(self): - # executing the command here -``` - -Here is a minimalistic command with no custom parsing: - -```python - from evennia import Command - - class CmdEcho(Command): - key = "echo" - - def func(self): - # echo the caller's input back to the caller - self.caller.msg("Echo: {}".format(self.args) - -``` - -You define a new command by assigning a few class-global properties on your inherited class and overloading one or two hook functions. The full gritty mechanic behind how commands work are found towards the end of this page; for now you only need to know that the command handler creates an instance of this class and uses that instance whenever you use this command - it also dynamically assigns the new command instance a few useful properties that you can assume to always be available. - -### Who is calling the command? - -In Evennia there are three types of objects that may call the command. It is important to be aware of this since this will also assign appropriate `caller`, `session`, `sessid` and `account` properties on the command body at runtime. Most often the calling type is `Session`. - -* A [Session](./Sessions). This is by far the most common case when a user is entering a command in their client. - * `caller` - this is set to the puppeted [Object](./Objects) if such an object exists. If no puppet is found, `caller` is set equal to `account`. Only if an Account is not found either (such as before being logged in) will this be set to the Session object itself. - * `session` - a reference to the [Session](./Sessions) object itself. - * `sessid` - `sessid.id`, a unique integer identifier of the session. - * `account` - the [Account](./Accounts) object connected to this Session. None if not logged in. -* An [Account](./Accounts). This only happens if `account.execute_cmd()` was used. No Session information can be obtained in this case. - * `caller` - this is set to the puppeted Object if such an object can be determined (without Session info this can only be determined in `MULTISESSION_MODE=0` or `1`). If no puppet is found, this is equal to `account`. - * `session` - `None*` - * `sessid` - `None*` - * `account` - Set to the Account object. -* An [Object](./Objects). This only happens if `object.execute_cmd()` was used (for example by an NPC). - * `caller` - This is set to the calling Object in question. - * `session` - `None*` - * `sessid` - `None*` - * `account` - `None` - -> `*)`: There is a way to make the Session available also inside tests run directly on Accounts and Objects, and that is to pass it to `execute_cmd` like so: `account.execute_cmd("...", session=)`. Doing so *will* make the `.session` and `.sessid` properties available in the command. - -### Properties assigned to the command instance at run-time - -Let's say account *Bob* with a character *BigGuy* enters the command *look at sword*. After the system having successfully identified this as the "look" command and determined that BigGuy really has access to a command named `look`, it chugs the `look` command class out of storage and either loads an existing Command instance from cache or creates one. After some more checks it then assigns it the following properties: - -- `caller` - The character BigGuy, in this example. This is a reference to the object executing the command. The value of this depends on what type of object is calling the command; see the previous section. -- `session` - the [Session](./Sessions) Bob uses to connect to the game and control BigGuy (see also previous section). -- `sessid` - the unique id of `self.session`, for quick lookup. -- `account` - the [Account](./Accounts) Bob (see previous section). -- `cmdstring` - the matched key for the command. This would be *look* in our example. -- `args` - this is the rest of the string, except the command name. So if the string entered was *look at sword*, `args` would be " *at sword*". Note the space kept - Evennia would correctly interpret `lookat sword` too. This is useful for things like `/switches` that should not use space. In the `MuxCommand` class used for default commands, this space is stripped. Also see the `arg_regex` property if you want to enforce a space to make `lookat sword` give a command-not-found error. -- `obj` - the game [Object](./Objects) on which this command is defined. This need not be the caller, but since `look` is a common (default) command, this is probably defined directly on *BigGuy* - so `obj` will point to BigGuy. Otherwise `obj` could be an Account or any interactive object with commands defined on it, like in the example of the "check time" command defined on a "Clock" object. -- `cmdset` - this is a reference to the merged CmdSet (see below) from which this command was matched. This variable is rarely used, it's main use is for the [auto-help system](./Help-System#command-auto-help-system) (*Advanced note: the merged cmdset need NOT be the same as `BigGuy.cmdset`. The merged set can be a combination of the cmdsets from other objects in the room, for example*). -- `raw_string` - this is the raw input coming from the user, without stripping any surrounding whitespace. The only thing that is stripped is the ending newline marker. - -#### Other useful utility methods: - -- `.get_help(caller, cmdset)` - Get the help entry for this command. By default the arguments are not - used, but they could be used to implement alternate help-display systems. -- `.client_width()` - Shortcut for getting the client's screen-width. Note that not all clients will - truthfully report this value - that case the `settings.DEFAULT_SCREEN_WIDTH` will be returned. -- `.styled_table(*args, **kwargs)` - This returns an [EvTable](api:evennia.utils#module-evennia.utils.evtable) styled based on the - session calling this command. The args/kwargs are the same as for EvTable, except styling defaults are set. -- `.styled_header`, `_footer`, `separator` - These will produce styled decorations for - display to the user. They are useful for creating listings and forms with colors adjustable per-user. - -### Defining your own command classes - -Beyond the properties Evennia always assigns to the command at run-time (listed above), your job is to define the following class properties: - -- `key` (string) - the identifier for the command, like `look`. This should (ideally) be unique. A key can consist of more than one word, like "press button" or "pull left lever". Note that *both* `key` and `aliases` below determine the identity of a command. So two commands are considered if either matches. This is important for merging cmdsets described below. -- `aliases` (optional list) - a list of alternate names for the command (`["glance", "see", "l"]`). Same name rules as for `key` applies. -- `locks` (string) - a [lock definition](./Locks), usually on the form `cmd:`. Locks is a rather big topic, so until you learn more about locks, stick to giving the lockstring `"cmd:all()"` to make the command available to everyone (if you don't provide a lock string, this will be assigned for you). -- `help_category` (optional string) - setting this helps to structure the auto-help into categories. If none is set, this will be set to *General*. -- `save_for_next` (optional boolean). This defaults to `False`. If `True`, a copy of this command object (along with any changes you have done to it) will be stored by the system and can be accessed by the next command by retrieving `self.caller.ndb.last_cmd`. The next run command will either clear or replace the storage. -- `arg_regex` (optional raw string): Used to force the parser to limit itself and tell it when the command-name ends and arguments begin (such as requiring this to be a space or a /switch). This is done with a regular expression. [See the arg_regex section](./Commands#on-arg_regex) for the details. -- `auto_help` (optional boolean). Defaults to `True`. This allows for turning off the [auto-help system](./Help-System#command-auto-help-system) on a per-command basis. This could be useful if you either want to write your help entries manually or hide the existence of a command from `help`'s generated list. -- `is_exit` (bool) - this marks the command as being used for an in-game exit. This is, by default, set by all Exit objects and you should not need to set it manually unless you make your own Exit system. It is used for optimization and allows the cmdhandler to easily disregard this command when the cmdset has its `no_exits` flag set. -- `is_channel` (bool)- this marks the command as being used for an in-game channel. This is, by default, set by all Channel objects and you should not need to set it manually unless you make your own Channel system. is used for optimization and allows the cmdhandler to easily disregard this command when its cmdset has its `no_channels` flag set. -- `msg_all_sessions` (bool): This affects the behavior of the `Command.msg` method. If unset (default), calling `self.msg(text)` from the Command will always only send text to the Session that actually triggered this Command. If set however, `self.msg(text)` will send to all Sessions relevant to the object this Command sits on. Just which Sessions receives the text depends on the object and the server's `MULTISESSION_MODE`. - -You should also implement at least two methods, `parse()` and `func()` (You could also implement `perm()`, but that's not needed unless you want to fundamentally change how access checks work). - -- `at_pre_cmd()` is called very first on the command. If this function returns anything that evaluates to `True` the command execution is aborted at this point. -- `parse()` is intended to parse the arguments (`self.args`) of the function. You can do this in any way you like, then store the result(s) in variable(s) on the command object itself (i.e. on `self`). To take an example, the default mux-like system uses this method to detect "command switches" and store them as a list in `self.switches`. Since the parsing is usually quite similar inside a command scheme you should make `parse()` as generic as possible and then inherit from it rather than re-implementing it over and over. In this way, the default `MuxCommand` class implements a `parse()` for all child commands to use. -- `func()` is called right after `parse()` and should make use of the pre-parsed input to actually do whatever the command is supposed to do. This is the main body of the command. The return value from this method will be returned from the execution as a Twisted Deferred. -- `at_post_cmd()` is called after `func()` to handle eventual cleanup. - -Finally, you should always make an informative [doc string](http://www.python.org/dev/peps/pep-0257/#what-is-a-docstring) (`__doc__`) at the top of your class. This string is dynamically read by the [Help System](./Help-System) to create the help entry for this command. You should decide on a way to format your help and stick to that. - -Below is how you define a simple alternative "`smile`" command: - -```python -from evennia import Command - -class CmdSmile(Command): - """ - A smile command - - Usage: - smile [at] [] - grin [at] [] - - Smiles to someone in your vicinity or to the room - in general. - - (This initial string (the __doc__ string) - is also used to auto-generate the help - for this command) - """ - - key = "smile" - aliases = ["smile at", "grin", "grin at"] - locks = "cmd:all()" - help_category = "General" - - def parse(self): - "Very trivial parser" - self.target = self.args.strip() - - def func(self): - "This actually does things" - caller = self.caller - - if not self.target or self.target == "here": - string = f"{caller.key} smiles" - else: - target = caller.search(self.target) - if not target: - return - string = f"{caller.key} smiles at {target.key}" - - caller.location.msg_contents(string) - -``` - -The power of having commands as classes and to separate `parse()` and `func()` -lies in the ability to inherit functionality without having to parse every -command individually. For example, as mentioned the default commands all -inherit from `MuxCommand`. `MuxCommand` implements its own version of `parse()` -that understands all the specifics of MUX-like commands. Almost none of the -default commands thus need to implement `parse()` at all, but can assume the -incoming string is already split up and parsed in suitable ways by its parent. - -Before you can actually use the command in your game, you must now store it -within a *command set*. See the [Command Sets](./Command-Sets) page. - -### On arg_regex - -The command parser is very general and does not require a space to end your command name. This means that the alias `:` to `emote` can be used like `:smiles` without modification. It also means `getstone` will get you the stone (unless there is a command specifically named `getstone`, then that will be used). If you want to tell the parser to require a certain separator between the command name and its arguments (so that `get stone` works but `getstone` gives you a 'command not found' error) you can do so with the `arg_regex` property. - -The `arg_regex` is a [raw regular expression string](http://docs.python.org/library/re.html). The regex will be compiled by the system at runtime. This allows you to customize how the part *immediately following* the command name (or alias) must look in order for the parser to match for this command. Some examples: - -- `commandname argument` (`arg_regex = r"\s.+"`): This forces the parser to require the command name to be followed by one or more spaces. Whatever is entered after the space will be treated as an argument. However, if you'd forget the space (like a command having no arguments), this would *not* match `commandname`. -- `commandname` or `commandname argument` (`arg_regex = r"\s.+|$"`): This makes both `look` and `look me` work but `lookme` will not. -- `commandname/switches arguments` (`arg_regex = r"(?:^(?:\s+|\/).*$)|^$"`. If you are using Evennia's `MuxCommand` Command parent, you may wish to use this since it will allow `/switche`s to work as well as having or not having a space. - -The `arg_regex` allows you to customize the behavior of your commands. You can put it in the parent class of your command to customize all children of your Commands. However, you can also change the base default behavior for all Commands by modifying `settings.COMMAND_DEFAULT_ARG_REGEX`. - -## Exiting a command - -Normally you just use `return` in one of your Command class' hook methods to exit that method. That will however still fire the other hook methods of the Command in sequence. That's usually what you want but sometimes it may be useful to just abort the command, for example if you find some unacceptable input in your parse method. To exit the command this way you can raise `evennia.InterruptCommand`: - -```python -from evennia import InterruptCommand - -class MyCommand(Command): - - # ... - - def parse(self): - # ... - # if this fires, `func()` and `at_post_cmd` will not - # be called at all - raise InterruptCommand() - -``` - -## Pauses in commands - -Sometimes you want to pause the execution of your command for a little while before continuing - maybe you want to simulate a heavy swing taking some time to finish, maybe you want the echo of your voice to return to you with an ever-longer delay. Since Evennia is running asynchronously, you cannot use `time.sleep()` in your commands (or anywhere, really). If you do, the *entire game* will be frozen for everyone! So don't do that. Fortunately, Evennia offers a really quick syntax for making pauses in commands. - -In your `func()` method, you can use the `yield` keyword. This is a Python keyword that will freeze the current execution of your command and wait for more before processing. - -> Note that you *cannot* just drop `yield` into any code and expect it to pause. Evennia will only pause for you if you `yield` inside the Command's `func()` method. Don't expect it to work anywhere else. - -Here's an example of a command using a small pause of five seconds between messages: - -```python -from evennia import Command - -class CmdWait(Command): - """ - A dummy command to show how to wait - - Usage: - wait - - """ - - key = "wait" - locks = "cmd:all()" - help_category = "General" - - def func(self): - """Command execution.""" - self.msg("Starting to wait ...") - yield 5 - self.msg("... This shows after 5 seconds. Waiting ...") - yield 2 - self.msg("... And now another 2 seconds have passed.") -``` - -The important line is the `yield 5` and `yield 2` lines. It will tell Evennia to pause execution here and not continue until the number of seconds given has passed. - -There are two things to remember when using `yield` in your Command's `func` method: - -1. The paused state produced by the `yield` is not saved anywhere. So if the server reloads in the middle of your command pausing, it will *not* resume when the server comes back up - the remainder of the command will never fire. So be careful that you are not freezing the character or account in a way that will not be cleared on reload. -2. If you use `yield` you may not also use `return ` in your `func` method. You'll get an error explaining this. This is due to how Python generators work. You can however use a "naked" `return` just fine. Usually there is no need for `func` to return a value, but if you ever do need to mix `yield` with a final return value in the same `func`, look at [twisted.internet.defer.returnValue](https://twistedmatrix.com/documents/current/api/twisted.internet.defer.html#returnValue). - -## Asking for user input - -The `yield` keyword can also be used to ask for user input. Again you can't -use Python's `input` in your command, for it would freeze Evennia for -everyone while waiting for that user to input their text. Inside a Command's -`func` method, the following syntax can also be used: - -```python -answer = yield("Your question") -``` - -Here's a very simple example: - -```python -class CmdConfirm(Command): - - """ - A dummy command to show confirmation. - - Usage: - confirm - - """ - - key = "confirm" - - def func(self): - answer = yield("Are you sure you want to go on?") - if answer.strip().lower() in ("yes", "y"): - self.msg("Yes!") - else: - self.msg("No!") -``` - -This time, when the user enters the 'confirm' command, she will be asked if she wants to go on. Entering 'yes' or "y" (regardless of case) will give the first reply, otherwise the second reply will show. - -> Note again that the `yield` keyword does not store state. If the game reloads while waiting for the user to answer, the user will have to start over. It is not a good idea to use `yield` for important or complex choices, a persistent [EvMenu](./EvMenu) might be more appropriate in this case. - -## System commands - -*Note: This is an advanced topic. Skip it if this is your first time learning about commands.* - -There are several command-situations that are exceptional in the eyes of the server. What happens if the account enters an empty string? What if the 'command' given is infact the name of a channel the user wants to send a message to? Or if there are multiple command possibilities? - -Such 'special cases' are handled by what's called *system commands*. A system command is defined in the same way as other commands, except that their name (key) must be set to one reserved by the engine (the names are defined at the top of `evennia/commands/cmdhandler.py`). You can find (unused) implementations of the system commands in `evennia/commands/default/system_commands.py`. Since these are not (by default) included in any `CmdSet` they are not actually used, they are just there for show. When the special situation occurs, Evennia will look through all valid `CmdSet`s for your custom system command. Only after that will it resort to its own, hard-coded implementation. - -Here are the exceptional situations that triggers system commands. You can find the command keys they use as properties on `evennia.syscmdkeys`: - -- No input (`syscmdkeys.CMD_NOINPUT`) - the account just pressed return without any input. Default is to do nothing, but it can be useful to do something here for certain implementations such as line editors that interpret non-commands as text input (an empty line in the editing buffer). -- Command not found (`syscmdkeys.CMD_NOMATCH`) - No matching command was found. Default is to display the "Huh?" error message. -- Several matching commands where found (`syscmdkeys.CMD_MULTIMATCH`) - Default is to show a list of matches. -- User is not allowed to execute the command (`syscmdkeys.CMD_NOPERM`) - Default is to display the "Huh?" error message. -- Channel (`syscmdkeys.CMD_CHANNEL`) - This is a [Channel](./Communications) name of a channel you are subscribing to - Default is to relay the command's argument to that channel. Such commands are created by the Comm system on the fly depending on your subscriptions. -- New session connection (`syscmdkeys.CMD_LOGINSTART`). This command name should be put in the `settings.CMDSET_UNLOGGEDIN`. Whenever a new connection is established, this command is always called on the server (default is to show the login screen). - -Below is an example of redefining what happens when the account doesn't provide any input (e.g. just presses return). Of course the new system command must be added to a cmdset as well before it will work. - -```python - from evennia import syscmdkeys, Command - - class MyNoInputCommand(Command): - "Usage: Just press return, I dare you" - key = syscmdkeys.CMD_NOINPUT - def func(self): - self.caller.msg("Don't just press return like that, talk to me!") -``` - -## Dynamic Commands - -*Note: This is an advanced topic.* - -Normally Commands are created as fixed classes and used without modification. There are however situations when the exact key, alias or other properties is not possible (or impractical) to pre-code ([Exits](./Commands#Exits) is an example of this). - -To create a command with a dynamic call signature, first define the command body normally in a class (set your `key`, `aliases` to default values), then use the following call (assuming the command class you created is named `MyCommand`): - -```python - cmd = MyCommand(key="newname", - aliases=["test", "test2"], - locks="cmd:all()", - ...) -``` - -*All* keyword arguments you give to the Command constructor will be stored as a property on the command object. This will overload existing properties defined on the parent class. - -Normally you would define your class and only overload things like `key` and `aliases` at run-time. But you could in principle also send method objects (like `func`) as keyword arguments in order to make your command completely customized at run-time. - -## Exits - -*Note: This is an advanced topic.* - -Exits are examples of the use of a [Dynamic Command](./Commands#Dynamic_Commands). - -The functionality of [Exit](./Objects) objects in Evennia is not hard-coded in the engine. Instead Exits are normal [typeclassed](./Typeclasses) objects that auto-create a [CmdSet](./Commands#CmdSets) on themselves when they load. This cmdset has a single dynamically created Command with the same properties (key, aliases and locks) as the Exit object itself. When entering the name of the exit, this dynamic exit-command is triggered and (after access checks) moves the Character to the exit's destination. -Whereas you could customize the Exit object and its command to achieve completely different behaviour, you will usually be fine just using the appropriate `traverse_*` hooks on the Exit object. But if you are interested in really changing how things work under the hood, check out `evennia/objects/objects.py` for how the `Exit` typeclass is set up. - -## Command instances are re-used - -*Note: This is an advanced topic that can be skipped when first learning about Commands.* - -A Command class sitting on an object is instantiated once and then re-used. So if you run a command from object1 over and over you are in fact running the same command instance over and over (if you run the same command but sitting on object2 however, it will be a different instance). This is usually not something you'll notice, since every time the Command-instance is used, all the relevant properties on it will be overwritten. But armed with this knowledge you can implement some of the more exotic command mechanism out there, like the command having a 'memory' of what you last entered so that you can back-reference the previous arguments etc. - -> Note: On a server reload, all Commands are rebuilt and memory is flushed. - -To show this in practice, consider this command: - -```python -class CmdTestID(Command): - key = "testid" - - def func(self): - - if not hasattr(self, "xval"): - self.xval = 0 - self.xval += 1 - - self.caller.msg("Command memory ID: {} (xval={})".format(id(self), self.xval)) - -``` - -Adding this to the default character cmdset gives a result like this in-game: - -``` -> testid -Command memory ID: 140313967648552 (xval=1) -> testid -Command memory ID: 140313967648552 (xval=2) -> testid -Command memory ID: 140313967648552 (xval=3) -``` - -Note how the in-memory address of the `testid` command never changes, but `xval` keeps ticking up. - -## Dynamically created commands - -*This is also an advanced topic.* - -Commands can also be created and added to a cmdset on the fly. Creating a class instance with a keyword argument, will assign that keyword argument as a property on this paricular command: - -``` -class MyCmdSet(CmdSet): - - def at_cmdset_creation(self): - - self.add(MyCommand(myvar=1, foo="test") - -``` - -This will start the `MyCommand` with `myvar` and `foo` set as properties (accessable as `self.myvar` and `self.foo`). How they are used is up to the Command. Remember however the discussion from the previous section - since the Command instance is re-used, those properties will *remain* on the command as long as this cmdset and the object it sits is in memory (i.e. until the next reload). Unless `myvar` and `foo` are somehow reset when the command runs, they can be modified and that change will be remembered for subsequent uses of the command. - - -## How commands actually work - -*Note: This is an advanced topic mainly of interest to server developers.* - -Any time the user sends text to Evennia, the server tries to figure out if the text entered corresponds to a known command. This is how the command handler sequence looks for a logged-in user: - -1. A user enters a string of text and presses enter. -2. The user's Session determines the text is not some protocol-specific control sequence or OOB command, but sends it on to the command handler. -3. Evennia's *command handler* analyzes the Session and grabs eventual references to Account and eventual puppeted Characters (these will be stored on the command object later). The *caller* property is set appropriately. -4. If input is an empty string, resend command as `CMD_NOINPUT`. If no such command is found in cmdset, ignore. -5. If command.key matches `settings.IDLE_COMMAND`, update timers but don't do anything more. -6. The command handler gathers the CmdSets available to *caller* at this time: - - 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](./Objects#Exits). - - Sets of dynamically created *System commands* representing available [Communications](./Communications#Channels). -7. All CmdSets *of the same priority* are merged together in groups. Grouping avoids order-dependent issues of merging multiple same-prio sets onto lower ones. -8. All the grouped CmdSets are *merged* in reverse priority into one combined CmdSet according to each set's merge rules. -9. Evennia's *command parser* takes the merged cmdset and matches each of its commands (using its key and aliases) against the beginning of the string entered by *caller*. This produces a set of candidates. -10. The *cmd parser* next rates the matches by how many characters they have and how many percent matches the respective known command. Only if candidates cannot be separated will it return multiple matches. - - If multiple matches were returned, resend as `CMD_MULTIMATCH`. If no such command is found in cmdset, return hard-coded list of matches. - - If no match was found, resend as `CMD_NOMATCH`. If no such command is found in cmdset, give hard-coded error message. -11. If a single command was found by the parser, the correct command object is plucked out of storage. This usually doesn't mean a re-initialization. -12. It is checked that the caller actually has access to the command by validating the *lockstring* of the command. If not, it is not considered as a suitable match and `CMD_NOMATCH` is triggered. -13. If the new command is tagged as a channel-command, resend as `CMD_CHANNEL`. If no such command is found in cmdset, use hard-coded implementation. -14. Assign several useful variables to the command instance (see previous sections). -15. Call `at_pre_command()` on the command instance. -16. Call `parse()` on the command instance. This is fed the remainder of the string, after the name of the command. It's intended to pre-parse the string into a form useful for the `func()` method. -17. Call `func()` on the command instance. This is the functional body of the command, actually doing useful things. -18. Call `at_post_command()` on the command instance. - -## Assorted notes - -The return value of `Command.func()` is a Twisted -[deferred](http://twistedmatrix.com/documents/current/core/howto/defer.html). -Evennia does not use this return value at all by default. If you do, you must -thus do so asynchronously, using callbacks. - -```python - # in command class func() - def callback(ret, caller): - caller.msg("Returned is %s" % ret) - deferred = self.execute_command("longrunning") - deferred.addCallback(callback, self.caller) -``` - -This is probably not relevant to any but the most advanced/exotic designs (one might use it to create a "nested" command structure for example). - -The `save_for_next` class variable can be used to implement state-persistent commands. For example it can make a command operate on "it", where it is determined by what the previous command operated on. diff --git a/docs/0.9.1/_sources/Communications.md.txt b/docs/0.9.1/_sources/Communications.md.txt deleted file mode 100644 index e64496949e..0000000000 --- a/docs/0.9.1/_sources/Communications.md.txt +++ /dev/null @@ -1,70 +0,0 @@ -# Communications - - -Apart from moving around in the game world and talking, players might need other forms of communication. This is offered by Evennia's `Comm` system. Stock evennia implements a 'MUX-like' system of channels, but there is nothing stopping you from changing things to better suit your taste. - -Comms rely on two main database objects - `Msg` and `Channel`. There is also the `TempMsg` which mimics the API of a `Msg` but has no connection to the database. - -## Msg - -The `Msg` object is the basic unit of communication in Evennia. A message works a little like an e-mail; it always has a sender (a [Account](./Accounts)) and one or more recipients. The recipients may be either other Accounts, or a *Channel* (see below). You can mix recipients to send the message to both Channels and Accounts if you like. - -Once created, a `Msg` is normally not changed. It is peristently saved in the database. This allows for comprehensive logging of communications. This could be useful for allowing senders/receivers to have 'mailboxes' with the messages they want to keep. - -### Properties defined on `Msg` - -- `senders` - this is a reference to one or many [Account](./Accounts) or [Objects](./Objects) (normally *Characters*) sending the message. This could also be an *External Connection* such as a message coming in over IRC/IMC2 (see below). There is usually only one sender, but the types can also be mixed in any combination. -- `receivers` - a list of target [Accounts](./Accounts), [Objects](./Objects) (usually *Characters*) or *Channels* to send the message to. The types of receivers can be mixed in any combination. -- `header` - this is a text field for storing a title or header for the message. -- `message` - the actual text being sent. -- `date_sent` - when message was sent (auto-created). -- `locks` - a [lock definition](./Locks). -- `hide_from` - this can optionally hold a list of objects, accounts or channels to hide this `Msg` from. This relationship is stored in the database primarily for optimization reasons, allowing for quickly post-filter out messages not intended for a given target. There is no in-game methods for setting this, it's intended to be done in code. - -You create new messages in code using `evennia.create_message` (or `evennia.utils.create.create_message.`) - -## TempMsg - -`evennia.comms.models` also has `TempMsg` which mimics the API of `Msg` but is not connected to the database. TempMsgs are used by Evennia for channel messages by default. They can be used for any system expecting a `Msg` but when you don't actually want to save anything. - -## Channels - -Channels are [Typeclassed](./Typeclasses) entities, which mean they can be easily extended and their functionality modified. To change which channel typeclass Evennia uses, change settings.BASE_CHANNEL_TYPECLASS. - -Channels act as generic distributors of messages. Think of them as "switch boards" redistributing `Msg` or `TempMsg` objects. Internally they hold a list of "listening" objects and any `Msg` (or `TempMsg`) sent to the channel will be distributed out to all channel listeners. Channels have [Locks](./Locks) to limit who may listen and/or send messages through them. - -The *sending* of text to a channel is handled by a dynamically created [Command](./Commands) that always have the same name as the channel. This is created for each channel by the global `ChannelHandler`. The Channel command is added to the Account's cmdset and normal command locks are used to determine which channels are possible to write to. When subscribing to a channel, you can then just write the channel name and the text to send. - -The default ChannelCommand (which can be customized by pointing `settings.CHANNEL_COMMAND_CLASS` to your own command), implements a few convenient features: - - - It only sends `TempMsg` objects. Instead of storing individual entries in the database it instead dumps channel output a file log in `server/logs/channel_.log`. This is mainly for practical reasons - we find one rarely need to query individual Msg objects at a later date. Just stupidly dumping the log to a file also means a lot less database overhead. - - It adds a `/history` switch to view the 20 last messages in the channel. These are read from the end of the log file. One can also supply a line number to start further back in the file (but always 20 entries at a time). It's used like this: - - > public/history - > public/history 35 - - -There are two default channels created in stock Evennia - `MudInfo` and `Public`. `MudInfo` receives server-related messages meant for Admins whereas `Public` is open to everyone to chat on (all new accounts are automatically joined to it when logging in, it is useful for asking questions). The default channels are defined by the `DEFAULT_CHANNELS` list (see `evennia/settings_default.py` for more details). - -You create new channels with `evennia.create_channel` (or `evennia.utils.create.create_channel`). - -In code, messages are sent to a channel using the `msg` or `tempmsg` methods of channels: - - channel.msg(msgobj, header=None, senders=None, persistent=True) - -The argument `msgobj` can be either a string, a previously constructed `Msg` or a `TempMsg` - in the latter cases all the following keywords are ignored since the message objects already contains all this information. If `msgobj` is a string, the other keywords are used for creating a new `Msg` or `TempMsg` on the fly, depending on if `persistent` is set or not. By default, a `TempMsg` is emitted for channel communication (since the default ChannelCommand instead logs to a file). - -```python - # assume we have a 'sender' object and a channel named 'mychan' - - # manually sending a message to a channel - mychan.msg("Hello!", senders=[sender]) -``` - -### Properties defined on `Channel` - -- `key` - main name for channel -- `aliases` - alternative native names for channels -- `desc` - optional description of channel (seen in listings) -- `keep_log` (bool) - if the channel should store messages (default) -- `locks` - A [lock definition](./Locks). Channels normally use the access_types `send, control` and `listen`. \ No newline at end of file diff --git a/docs/0.9.1/_sources/Default-Exit-Errors.md.txt b/docs/0.9.1/_sources/Default-Exit-Errors.md.txt deleted file mode 100644 index f3476bbc6e..0000000000 --- a/docs/0.9.1/_sources/Default-Exit-Errors.md.txt +++ /dev/null @@ -1,96 +0,0 @@ -# Default Exit Errors - - -Evennia allows for exits to have any name. The command "kitchen" is a valid exit name as well as "jump out the window" or "north". An exit actually consists of two parts: an [Exit Object](./Objects) and an [Exit Command](./Commands) stored on said exit object. The command has the same key and aliases as the object, which is why you can see the exit in the room and just write its name to traverse it. - -If you try to enter the name of a non-existing exit, it is thus the same as trying a non-exising command; Evennia doesn't care about the difference: - - > jump out the window - Command 'jump out the window' is not available. Type "help" for help. - -Many games don't need this type of freedom however. They define only the cardinal directions as valid exit names (Evennia's `@tunnel` command also offers this functionality). In this case, the error starts to look less logical: - - > west - Command 'west' is not available. Maybe you meant "@set" or "@reset"? - -Since we for our particular game *know* that west is an exit direction, it would be better if the error message just told us that we couldn't go there. - -## Adding default error commands - -To solve this you need to be aware of how to [write and add new commands](./Adding-Command-Tutorial). What you need to do is to create new commands for all directions you want to support in your game. In this example all we'll do is echo an error message, but you could certainly consider more advanced uses. You add these commands to the default command set. Here is an example of such a set of commands: - -```python -# for example in a file mygame/commands/movecommands.py - -from evennia import default_cmds - -class CmdExitError(default_cmds.MuxCommand): - "Parent class for all exit-errors." - locks = "cmd:all()" - arg_regex = r"\s|$" - auto_help = False - def func(self): - "returns the error" - self.caller.msg("You cannot move %s." % self.key) - -class CmdExitErrorNorth(CmdExitError): - key = "north" - aliases = ["n"] - -class CmdExitErrorEast(CmdExitError): - key = "east" - aliases = ["e"] - -class CmdExitErrorSouth(CmdExitError): - key = "south" - aliases = ["s"] - -class CmdExitErrorWest(CmdExitError): - key = "west" - aliases = ["w"] -``` - -Make sure to add the directional commands (not their parent) to the `CharacterCmdSet` class in `mygame/commands/default_cmdsets.py`: - -```python -# in mygame/commands/default_cmdsets.py - -from commands import movecommands - -# [...] -class CharacterCmdSet(default_cmds.CharacterCmdSet): - # [...] - def at_cmdset_creation(self): - # [...] - self.add(movecommands.CmdExitErrorNorth()) - self.add(movecommands.CmdExitErrorEast()) - self.add(movecommands.CmdExitErrorSouth()) - self.add(movecommands.CmdExitErrorWest()) -``` - -After a `@reload` these commands (assuming you don't get any errors - check your log) will be loaded. What happens henceforth is that if you are in a room with an Exitobject (let's say it's "north"), the proper Exit-command will overload your error command (also named "north"). But if you enter an direction without having a matching exit for it, you will fallback to your default error commands: - - > east - You cannot move east. - -Further expansions by the exit system (including manipulating the way the Exit command itself is created) can be done by modifying the [Exit typeclass](./Typeclasses) directly. - -## Additional Comments - -So why didn't we create a single error command above? Something like this: - -```python - class CmdExitError(default_cmds.MuxCommand): - "Handles all exit-errors." - key = "error_cmd" - aliases = ["north", "n", - "east", "e", - "south", "s", - "west", "w"] - #[...] -``` -The anwer is that this would *not* work and understanding why is important in order to not be confused when working with commands and command sets. - -The reason it doesn't work is because Evennia's [command system](./Commands) compares commands *both* by `key` and by `aliases`. If *either* of those match, the two commands are considered *identical* as far as cmdset merging system is concerned. - -So the above example would work fine as long as there were no Exits at all in the room. But what happens when we enter a room with an exit "north"? The Exit's cmdset is merged onto the default one, and since there is an alias match, the system determines our `CmdExitError` to be identical. It is thus overloaded by the Exit command (which also correctly defaults to a higher priority). The result is that you can go through the north exit normally but none of the error messages for the other directions are available since the single error command was completely overloaded by the single matching "north" exit-command. diff --git a/docs/0.9.1/_sources/Evennia-API.md.txt b/docs/0.9.1/_sources/Evennia-API.md.txt deleted file mode 100644 index 0bd56ac26a..0000000000 --- a/docs/0.9.1/_sources/Evennia-API.md.txt +++ /dev/null @@ -1,58 +0,0 @@ -# Evennia API - - -Evennia makes much of its programming tools available directly from the top-level `evennia` package. This is often referred to as Evennia's "flat" [Application Programming Interface](https://en.wikipedia.org/wiki/Application_programming_interface) (API). The flat API tries to collect and bring the most commonly used resources to the front in a way where everything is available at a glance (in a flat display), making it a good place to start to learn Evennia. - -> Evennia's flat (and full) API can be perused through the auto-generated [API Library refence](github:evennia). - -A good, interactive way to explore the flat API is to use [IPython](http://ipython.org/), a more flexible version of the default Python shell. Inside your virtual environment you can install IPython simply by - - pip install ipython - -Windows users should also install [PyReadline](http://ipython.org/pyreadline.html): - - pip install pyreadline - -With IPython installed, go to your game directory and run - - evennia shell - -This should give you the IPython shell automatically. Inside IPython -you then do - - import evennia - -Followed by - - evennia. - -That is, write `evennia.` and press the TAB key. What pops up is the contents of the `evennia` top-level package - in other words [the "flat" API](github:evennia#the-flat-api). - - evennia.DefaultObject? - -Starting to write the name of an API entity and pressing `` will auto-complete the name. Adding a question mark (`?`) to its name will show you its documentation. Append `??` to get the actual source code. This way you can quickly explore Evennia and see what is available. - - -## To remember when importing from `evennia` - -Properties on the root of the `evennia` package are *not* modules in their own right. They are just shortcut properties stored in the `evennia/__init__.py` module. That means that you cannot use dot-notation to `import` nested module-names over `evennia`. The rule of thumb is that you cannot use `import` for more than one level down. Hence you can do - -```python - import evennia - print(evennia.default_cmds.CmdLook) -``` - -or import one level down - -```python - from evennia import default_cmds - print(default_cmds.CmdLook) -``` - -but you *cannot* import two levels down - -```python - from evennia.default_cmds import CmdLook # error! -``` - -This will give you an `ImportError` telling you that the module `default_cmds` cannot be found - this is becasue `default_cmds` is just a *variable* stored in `evennia.__init__.py`; this cannot be imported from. If you really want full control over which level of package you import you can always bypass the root package and import directly from from the real location. For example `evennia.DefaultObject` is a shortcut to `evennia.objects.objects.DefaultObject`. Using this full path will have the import mechanism work normally. See `evennia/__init__.py` to see where the package imports from. diff --git a/docs/0.9.1/_sources/Evennia-Introduction.md.txt b/docs/0.9.1/_sources/Evennia-Introduction.md.txt deleted file mode 100644 index be60a6dc2e..0000000000 --- a/docs/0.9.1/_sources/Evennia-Introduction.md.txt +++ /dev/null @@ -1,94 +0,0 @@ -# Evennia Introduction - -> *A MUD (originally Multi-User Dungeon, with later variants Multi-User Dimension and Multi-User Domain) is a multiplayer real-time virtual world described primarily in text. MUDs combine elements of role-playing games, hack and slash, player versus player, interactive fiction and online chat. Players can read or view descriptions of rooms, objects, other players, non-player characters, and actions performed in the virtual world. Players typically interact with each other and the world by typing commands that resemble a natural language.* - [Wikipedia](http://en.wikipedia.org/wiki/MUD) - -If you are reading this, it's quite likely you are dreaming of creating and running a text-based massively-multiplayer game ([MUD/MUX/MUSH](http://tinyurl.com/c5sc4bm) etc) of your very own. You might just be starting to think about it, or you might have lugged around that *perfect* game in your mind for years ... you know *just* how good it would be, if you could only make it come to reality. We know how you feel. That is, after all, why Evennia came to be. - -Evennia is in principle a MUD-building system: a bare-bones Python codebase and server intended to be highly extendable for any style of game. "Bare-bones" in this context means that we try to impose as few game-specific things on you as possible. So whereas we for convenience offer basic building blocks like objects, characters, rooms, default commands for building and administration etc, we don't prescribe any combat rules, mob AI, races, skills, character classes or other things that will be different from game to game anyway. It is possible that we will offer some such systems as contributions in the future, but these will in that case all be optional. - -What we *do* however, is to provide a solid foundation for all the boring database, networking, and behind-the-scenes administration stuff that all online games need whether they like it or not. Evennia is *fully persistent*, that means things you drop on the ground somewhere will still be there a dozen server reboots later. Through Django we support a large variety of different database systems (a database is created for you automatically if you use the defaults). - -Using the full power of Python throughout the server offers some distinct advantages. All your coding, from object definitions and custom commands to AI scripts and economic systems is done in normal Python modules rather than some ad-hoc scripting language. The fact that you script the game in the same high-level language that you code it in allows for very powerful and custom game implementations indeed. - -The server ships with a default set of player commands that are similar to the MUX command set. We *do not* aim specifically to be a MUX server, but we had to pick some default to go with (see [this](./Soft-Code) for more about our original motivations). It's easy to remove or add commands, or to have the command syntax mimic other systems, like Diku, LP, MOO and so on. Or why not create a new and better command system of your own design. - -## Can I test it somewhere? - -Evennia's demo server can be found at [demo.evennia.com](http://demo.evennia.com). If you prefer to connect to the demo via your own telnet client you can do so at `silvren.com`, port `4280`. Here is a [screenshot](./Screenshot). - -Once you installed Evennia yourself it comes with its own tutorial - this shows off some of the possibilities _and_ gives you a small single-player quest to play. The tutorial takes only one single in-game command to install as explained [here](./Tutorial-World-Introduction). - -## Brief summary of features - -### Technical - -- Game development is done by the server importing your normal Python modules. Specific server features are implemented by overloading hooks that the engine calls appropriately. -- All game entities are simply Python classes that handle database negotiations behind the scenes without you needing to worry. -- Command sets are stored on individual objects (including characters) to offer unique functionality and object-specific commands. Sets can be updated and modified on the fly to expand/limit player input options during play. -- Scripts are used to offer asynchronous/timed execution abilities. Scripts can also be persistent. There are easy mechanisms to thread particularly long-running processes and built-in ways to start "tickers" for games that wants them. -- In-game communication channels are modular and can be modified to any functionality, including mailing systems and full logging of all messages. -- Server can be fully rebooted/reloaded without users disconnecting. -- An Account can freely connect/disconnect from game-objects, offering an easy way to implement multi-character systems and puppeting. -- Each Account can optionally control multiple Characters/Objects at the same time using the same login information. -- Spawning of individual objects via a prototypes-like system. -- Tagging can be used to implement zones and object groupings. -- All source code is extensively documented. -- Unit-testing suite, including tests of default commands and plugins. - -### Default content - -- Basic classes for Objects, Characters, Rooms and Exits -- Basic login system, using the Account's login name as their in-game Character's name for simplicity -- "MUX-like" command set with administration, building, puppeting, channels and social commands -- In-game Tutorial -- Contributions folder with working, but optional, code such as alternative login, menus, character generation and more - -### Standards/Protocols supported - -- TCP/websocket HTML5 browser web client, with ajax/comet fallback for older browsers -- Telnet and Telnet + SSL with mud-specific extensions ([MCCP](http://tintin.sourceforge.net/mccp/), [MSSP](http://tintin.sourceforge.net/mssp/), [TTYPE](http://tintin.sourceforge.net/mtts/), [MSDP](http://tintin.sourceforge.net/msdp/), [GMCP](https://www.ironrealms.com/rapture/manual/files/FeatGMCP-txt.html), [MXP](https://www.zuggsoft.com/zmud/mxp.htm) links) -- ANSI and xterm256 colours -- SSH -- HTTP - Website served by in-built webserver and connected to same database as game. -- IRC - external IRC channels can be connected to in-game chat channels -- RSS feeds can be echoed to in-game channels (things like Twitter can easily be added) -- Several different databases supported (SQLite3, MySQL, PostgreSQL, ...) - -For more extensive feature information, see the [Developer Central](./Developer-Central). - -## What you need to know to work with Evennia - -Assuming you have Evennia working (see the [quick start instructions](./Getting-Started)) and have gotten as far as to start the server and connect to it with the client of your choice, here's what you need to know depending on your skills and needs. - -### I don't know (or don't want to do) any programming - I just want to run a game! - -Evennia comes with a default set of commands for the Python newbies and for those who need to get a game running *now*. Stock Evennia is enough for running a simple 'Talker'-type game - you can build and describe rooms and basic objects, have chat channels, do emotes and other things suitable for a social or free-form MU\*. Combat, mobs and other game elements are not included, so you'll have a very basic game indeed if you are not willing to do at least *some* coding. - -### I know basic Python, or I am willing to learn - -Evennia's source code is extensively documented and is [viewable online](https://github.com/evennia/evennia). We also have a comprehensive [online manual](https://github.com/evennia/evennia/wiki) with lots of examples. But while Python is considered a very easy programming language to get into, you do have a learning curve to climb if you are new to programming. You should probably sit down -with a Python beginner's [tutorial](http://docs.python.org/tutorial/) (there are plenty of them on the web if you look around) so you at least know what you are seeing. See also our [link page](./Links#wiki-litterature) for some reading suggestions. To efficiently code your dream game in Evennia you don't need to be a Python guru, but you do need to be able to read example code containing at least these basic Python features: - -- Importing and using python [modules](http://docs.python.org/3.7/tutorial/modules.html) -- Using [variables](http://www.tutorialspoint.com/python/python_variable_types.htm), [conditional statements](http://docs.python.org/tutorial/controlflow.html#if-statements), [loops](http://docs.python.org/tutorial/controlflow.html#for-statements) and [functions](http://docs.python.org/tutorial/controlflow.html#defining-functions) -- Using [lists, dictionaries and list comprehensions](http://docs.python.org/tutorial/datastructures.html) -- Doing [string handling and formatting](http://docs.python.org/tutorial/introduction.html#strings) -- Have a basic understanding of [object-oriented programming](http://www.tutorialspoint.com/python/python_classes_objects.htm), using [Classes](http://docs.python.org/tutorial/classes.html), their methods and properties - -Obviously, the more things you feel comfortable with, the easier time you'll have to find your way. With just basic knowledge you should be able to define your own [Commands](./Commands), create custom [Objects](./Objects) as well as make your world come alive with basic [Scripts](./Scripts). You can definitely build a whole advanced and customized game from extending Evennia's examples only. - -### I know my Python stuff and I am willing to use it! - -Even if you started out as a Python beginner, you will likely get to this point after working on your game for a while. With more general knowledge in Python the full power of Evennia opens up for you. Apart from modifying commands, objects and scripts, you can develop everything from advanced mob AI and economic systems, through sophisticated combat and social mini games, to redefining how commands, players, rooms or channels themselves work. Since you code your game by importing normal Python modules, there are few limits to what you can accomplish. - -If you *also* happen to know some web programming (HTML, CSS, Javascript) there is also a web presence (a website and a mud web client) to play around with ... - -### Where to from here? - -From here you can continue browsing the [online documentation]([online documentation](index)) to find more info about Evennia. Or you can jump into the [Tutorials](./Tutorials) and get your hands dirty with code right away. You can also read the developer's [dev blog](https://evennia.blogspot.com/) for many tidbits and snippets about Evennia's development and structure. - -Some more hints: - -1. Get engaged in the community. Make an introductory post to our [mailing list/forum](https://groups.google.com/forum/#!forum/evennia) and get to know people. It's also highly recommended you hop onto our [Developer chat](http://webchat.freenode.net/?channels=evennia&uio=MT1mYWxzZSY5PXRydWUmMTE9MTk1JjEyPXRydWUbb) on IRC. This allows you to chat directly with other developers new and old as well as with the devs of Evennia itself. This chat is logged (you can find links on http://www.evennia.com) and can also be searched from the same place for discussion topics you are interested in. -2. Read the [Game Planning](./Game-Planning) wiki page. It gives some ideas for your work flow and the state of mind you should aim for - including cutting down the scope of your game for its first release. -3. Do the [Tutorial for basic MUSH-like game](./Tutorial-for-basic-MUSH-like-game) carefully from beginning to end and try to understand what does what. Even if you are not interested in a MUSH for your own game, you will end up with a small (very small) game that you can build or learn from. diff --git a/docs/0.9.1/_sources/Evennia-for-MUSH-Users.md.txt b/docs/0.9.1/_sources/Evennia-for-MUSH-Users.md.txt deleted file mode 100644 index 3d9147e0f3..0000000000 --- a/docs/0.9.1/_sources/Evennia-for-MUSH-Users.md.txt +++ /dev/null @@ -1,126 +0,0 @@ -# Evennia for MUSH Users - -*This page is adopted from an article originally posted for the MUSH community [here on musoapbox.net](http://musoapbox.net/topic/1150/evennia-for-mushers).* - -[MUSH](https://en.wikipedia.org/wiki/MUSH)es are text multiplayer games traditionally used for heavily roleplay-focused game styles. They are often (but not always) utilizing game masters and human oversight over code automation. MUSHes are traditionally built on the TinyMUSH-family of game servers, like PennMUSH, TinyMUSH, TinyMUX and RhostMUSH. Also their siblings [MUCK](https://en.wikipedia.org/wiki/TinyMUCK) and [MOO](https://en.wikipedia.org/wiki/MOO) are often mentioned together with MUSH since they all inherit from the same [TinyMUD](https://en.wikipedia.org/wiki/MUD_trees#TinyMUD_family_tree) base. A major feature is the ability to modify and program the game world from inside the game by using a custom scripting language. We will refer to this online scripting as *softcode* here. - -Evennia works quite differently from a MUSH both in its overall design and under the hood. The same things are achievable, just in a different way. Here are some fundamental differences to keep in mind if you are coming from the MUSH world. - -## Developers vs Players - -In MUSH, users tend to code and expand all aspects of the game from inside it using softcode. A MUSH can thus be said to be managed solely by *Players* with different levels of access. Evennia on the other hand, differentiates between the role of the *Player* and the *Developer*. - -- An Evennia *Developer* works in Python from *outside* the game, in what MUSH would consider “hardcode”. Developers implement larger-scale code changes and can fundamentally change how the game works. They then load their changes into the running Evennia server. Such changes will usually not drop any connected players. -- An Evennia *Player* operates from *inside* the game. Some staff-level players are likely to double as developers. Depending on access level, players can modify and expand the game's world by digging new rooms, creating new objects, alias commands, customize their experience and so on. Trusted staff may get access to Python via the `@py` command, but this would be a security risk for normal Players to use. So the *Player* usually operates by making use of the tools prepared for them by the *Developer* - tools that can be as rigid or flexible as the developer desires. - -## Collaborating on a game - Python vs Softcode - -For a *Player*, collaborating on a game need not be too different between MUSH and Evennia. The building and description of the game world can still happen mostly in-game using build commands, using text tags and [inline functions](./TextTags#inline-functions) to prettify and customize the experience. Evennia offers external ways to build a world but those are optional. There is also nothing *in principle* stopping a Developer from offering a softcode-like language to Players if that is deemed necessary. - -For *Developers* of the game, the difference is larger: Code is mainly written outside the game in Python modules rather than in-game on the command line. Python is a very popular and well-supported language with tons of documentation and help to be found. The Python standard library is also a great help for not having to reinvent the wheel. But that said, while Python is considered one of the easier languages to learn and use it is undoubtedly very different from MUSH softcode. - -While softcode allows collaboration in-game, Evennia's external coding instead opens up the possibility for collaboration using professional version control tools and bug tracking using websites like github (or bitbucket for a free private repo). Source code can be written in proper text editors and IDEs with refactoring, syntax highlighting and all other conveniences. In short, collaborative development of an Evennia game is done in the same way most professional collaborative development is done in the world, meaning all the best tools can be used. - - -## `@parent` vs `@typeclass` and `@spawn` - -Inheritance works differently in Python than in softcode. Evennia has no concept of a "master object" that other objects inherit from. There is in fact no reason at all to introduce "virtual objects" in the game world - code and data are kept separate from one another. - -In Python (which is an [object oriented](https://en.wikipedia.org/wiki/Object-oriented_programming) language) one instead creates *classes* - these are like blueprints from which you spawn any number of *object instances*. Evennia also adds the extra feature that every instance is persistent in the database (this means no SQL is ever needed). To take one example, a unique character in Evennia is an instances of the class `Character`. - -One parallel to MUSH's `@parent` command may be Evennia's `@typeclass` command, which changes which class an already existing object is an instance of. This way you can literally turn a `Character` into a `Flowerpot` on the spot. - -if you are new to object oriented design it's important to note that all object instances of a class does *not* have to be identical. If they did, all Characters would be named the same. Evennia allows to customize individual objects in many different ways. One way is through *Attributes*, which are database-bound properties that can be linked to any object. For example, you could have an `Orc` class that defines all the stuff an Orc should be able to do (probably in turn inheriting from some `Monster` class shared by all monsters). Setting different Attributes on different instances (different strength, equipment, looks etc) would make each Orc unique despite all sharing the same class. - - The `@spawn` command allows one to conveniently choose between different "sets" of Attributes to put on each new Orc (like the "warrior" set or "shaman" set) . Such sets can even inherit one another which is again somewhat remniscent at least of the *effect* of `@parent` and the object-based inheritance of MUSH. - -There are other differences for sure, but that should give some feel for things. Enough with the theory. Let's get down to more practical matters next. To install, see the [Getting Started instructions](./Getting-Started). - -## A first step making things more familiar - -We will here give two examples of customizing Evennia to be more familiar to a MUSH *Player*. - -### Activating a multi-descer - -By default Evennia’s `desc` command updates your description and that’s it. There is a more feature-rich optional “multi-descer” in `evennia/contrib/multidesc.py` though. This alternative allows for managing and combining a multitude of keyed descriptions. - -To activate the multi-descer, `cd` to your game folder and into the `commands` sub-folder. There you’ll find the file `default_cmdsets.py`. In Python lingo all `*.py` files are called *modules*. Open the module in a text editor. We won’t go into Evennia in-game *Commands* and *Command sets* further here, but suffice to say Evennia allows you to change which commands (or versions of commands) are available to the player from moment to moment depending on circumstance. - -Add two new lines to the module as seen below: - -```python -# the file mygame/commands/default_cmdsets.py -# [...] - -from evennia.contrib import multidescer # <- added now - -class CharacterCmdSet(default_cmds.CharacterCmdSet): - """ - The CharacterCmdSet contains general in-game commands like look, - get etc available on in-game Character objects. It is merged with - the AccountCmdSet when an Account puppets a Character. - """ - key = "DefaultCharacter" - - def at_cmdset_creation(self): - """ - Populates the cmdset - """ - super().at_cmdset_creation() - # - # any commands you add below will overload the default ones. - # - self.add(multidescer.CmdMultiDesc()) # <- added now -# [...] -``` - -Note that Python cares about indentation, so make sure to indent with the same number of spaces as shown above! - -So what happens above? We [import the module](http://www.linuxtopia.org/online_books/programming_books/python_programming/python_ch28s03.html) `evennia/contrib/multidescer.py` at the top. Once imported we can access stuff inside that module using full stop (`.`). The multidescer is defined as a class `CmdMultiDesc` (we could find this out by opening said module in a text editor). At the bottom we create a new instance of this class and add it to the `CharacterCmdSet` class. For the sake of this tutorial we only need to know that `CharacterCmdSet` contains all commands that should be be available to the `Character` by default. - -This whole thing will be triggered when the command set is first created, which happens on server start. So we need to reload Evennia with `@reload` - no one will be disconnected by doing this. If all went well you should now be able to use `desc` (or `+desc`) and find that you have more possibilities: - -```text -> help +desc # get help on the command -> +desc eyes = His eyes are blue. -> +desc basic = A big guy. -> +desc/set basic + + eyes # we add an extra space between -> look me -A big guy. His eyes are blue. -``` - -If there are errors, a *traceback* will show in the server log - several lines of text showing where the error occurred. Find where the error is by locating the line number related to the `default_cmdsets.py` file (it's the only one you've changed so far). Most likely you mis-spelled something or missed the indentation. Fix it and either `@reload` again or run `evennia start` as needed. - -### Customizing the multidescer syntax - -As seen above the multidescer uses syntax like this (where `|/` are Evennia's tags for line breaks) : - -```text -> +desc/set basic + |/|/ + cape + footwear + |/|/ + attitude -``` - -This use of `+ ` was prescribed by the *Developer* that coded this `+desc` command. What if the *Player* doesn’t like this syntax though? Do players need to pester the dev to change it? Not necessarily. While Evennia does not allow the player to build their own multi-descer on the command line, it does allow for *re-mapping* the command syntax to one they prefer. This is done using the `nick` command. - -Here’s a nick that changes how to input the command above: - -```text -> nick setdesc $1 $2 $3 $4 = +desc/set $1 + |/|/ + $2 + $3 + |/|/ + $4 -``` - -The string on the left will be matched against your input and if matching, it will be replaced with the string on the right. The `$`-type tags will store space-separated arguments and put them into the replacement. The nick allows [shell-like wildcards](http://www.linfo.org/wildcard.html), so you can use `*`, `?`, `[...]`, `[!...]` etc to match parts of the input. - -The same description as before can now be set as - -```text -> setdesc basic cape footwear attitude -``` - -With the `nick` functionality players can mitigate a lot of syntax dislikes even without the developer changing the underlying Python code. - -## Next steps - -If you are a *Developer* and are interested in making a more MUSH-like Evennia game, a good start is to look into the Evennia [Tutorial for a first MUSH-like game](./Tutorial-for-basic-MUSH-like-game). That steps through building a simple little game from scratch and helps to acquaint you with the various corners of Evennia. There is also the [Tutorial for running roleplaying sessions](./Evennia-for-roleplaying-sessions) that can be of interest. - -An important aspect of making things more familiar for *Players* is adding new and tweaking existing commands. How this is done is covered by the [Tutorial on adding new commands](./Adding-Command-Tutorial). You may also find it useful to shop through the `evennia/contrib/` folder. The [Tutorial world](./Tutorial-World-Introduction) is a small single-player quest you can try (it’s not very MUSH-like but it does show many Evennia concepts in action). Beyond that there are [many more tutorials](./Tutorials) to try out. If you feel you want a more visual overview you can also look at [Evennia in pictures](https://evennia.blogspot.se/2016/05/evennia-in-pictures.html). - -… And of course, if you need further help you can always drop into the [Evennia chatroom](http://webchat.freenode.net/?channels=evennia&uio=MT1mYWxzZSY5PXRydWUmMTE9MTk1JjEyPXRydWUbb) or post a question in our [forum/mailing list](https://groups.google.com/forum/#%21forum/evennia)! diff --git a/docs/0.9.1/_sources/Execute-Python-Code.md.txt b/docs/0.9.1/_sources/Execute-Python-Code.md.txt deleted file mode 100644 index 188754ae67..0000000000 --- a/docs/0.9.1/_sources/Execute-Python-Code.md.txt +++ /dev/null @@ -1,88 +0,0 @@ -# Execute Python Code - - -The `@py` command supplied with the default command set of Evennia allows you to execute Python commands directly from inside the game. An alias to `@py` is simply "`!`". *Access to the `@py` command should be severely restricted*. This is no joke - being able to execute arbitrary Python code on the server is not something you should entrust to just anybody. - - @py 1+2 - <<< 3 - -## Available variables - -A few local variables are made available when running `@py`. These offer entry into the running system. - -- **self** / **me** - the calling object (i.e. you) -- **here** - the current caller's location -- **obj** - a dummy [Object](./Objects) instance -- **evennia** - Evennia's [flat API](./Evennia-API) - through this you can access all of Evennia. - -For accessing other objects in the same room you need to use `self.search(name)`. For objects in other locations, use one of the `evennia.search_*` methods. See [below](./Execute-Python-Code#finding-objects). - -## Returning output - -This is an example where we import and test one of Evennia's utilities found in `src/utils/utils.py`, but also accessible through `ev.utils`: - - @py from ev import utils; utils.time_format(33333) - <<< Done. - -Note that we didn't get any return value, all we where told is that the code finished executing without error. This is often the case in more complex pieces of code which has no single obvious return value. To see the output from the `time_format()` function we need to tell the system to echo it to us explicitly with `self.msg()`. - - @py from ev import utils; self.msg(str(utils.time_format(33333))) - 09:15 - <<< Done. - -> Warning: When using the `msg` function wrap our argument in `str()` to convert it into a string above. This is not strictly necessary for most types of data (Evennia will usually convert to a string behind the scenes for you). But for *lists* and *tuples* you will be confused by the output if you don't wrap them in `str()`: only the first item of the iterable will be returned. This is because doing `msg(text)` is actually just a convenience shortcut; the full argument that `msg` accepts is something called an *outputfunc* on the form `(cmdname, (args), {kwargs})` (see [the message path](./Messagepath) for more info). Sending a list/tuple confuses Evennia to think you are sending such a structure. Converting it to a string however makes it clear it should just be displayed as-is. - -If you were to use Python's standard `print`, you will see the result in your current `stdout` (your terminal by default, otherwise your log file). - -## Finding objects - -A common use for `@py` is to explore objects in the database, for debugging and performing specific operations that are not covered by a particular command. - -Locating an object is best done using `self.search()`: - - @py self.search("red_ball") - <<< Ball - - @py self.search("red_ball").db.color = "red" - <<< Done. - - @py self.search("red_ball").db.color - <<< red - -`self.search()` is by far the most used case, but you can also search other database tables for other Evennia entities like scripts or configuration entities. To do this you can use the generic search entries found in `ev.search_*`. - - @py evennia.search_script("sys_game_time") - <<< [] - -(Note that since this becomes a simple statement, we don't have to wrap it in `self.msg()` to get the output). You can also use the database model managers directly (accessible through the `objects` properties of database models or as `evennia.managers.*`). This is a bit more flexible since it gives you access to the full range of database search methods defined in each manager. - - @py evennia.managers.scripts.script_search("sys_game_time") - <<< [] - -The managers are useful for all sorts of database studies. - - @py ev.managers.configvalues.all() - <<< [, , ...] - -## Testing code outside the game - -`@py` has the advantage of operating inside a running server (sharing the same process), where you can test things in real time. Much of this *can* be done from the outside too though. - -In a terminal, cd to the top of your game directory (this bit is important since we need access to your config file) and run - - evennia shell - -Your default Python interpreter will start up, configured to be able to work with and import all modules of your Evennia installation. From here you can explore the database and test-run individual modules as desired. - -It's recommended that you get a more fully featured Python interpreter like [iPython](http://ipython.scipy.org/moin/). If you use a virtual environment, you can just get it with `pip install ipython`. IPython allows you to better work over several lines, and also has a lot of other editing features, such as tab-completion and `__doc__`-string reading. - - $ evennia shell - - IPython 0.10 -- An enhanced Interactive Python - ... - - In [1]: import evennia - In [2]: evennia.managers.objects.all() - Out[3]: [, , ...] - -See the page about the [Evennia-API](./Evennia-API) for more things to explore. diff --git a/docs/0.9.1/_sources/First-Steps-Coding.md.txt b/docs/0.9.1/_sources/First-Steps-Coding.md.txt deleted file mode 100644 index d352210f30..0000000000 --- a/docs/0.9.1/_sources/First-Steps-Coding.md.txt +++ /dev/null @@ -1,217 +0,0 @@ -# First Steps Coding - - -This section gives a brief step-by-step introduction on how to set up Evennia for the first time so you can modify and overload the defaults easily. You should only need to do these steps once. It also walks through you making your first few tweaks. - -Before continuing, make sure you have Evennia installed and running by following the [Getting Started](./Getting-Started) instructions. You should have initialized a new game folder with the `evennia --init foldername` command. We will in the following assume this folder is called "mygame". - -It might be a good idea to eye through the brief [Coding Introduction](./Coding-Introduction) too (especially the recommendations in the section about the evennia "flat" API and about using `evennia shell` will help you here and in the future). - -To follow this tutorial you also need to know the basics of operating your computer's terminal/command line. You also need to have a text editor to edit and create source text files. There are plenty of online tutorials on how to use the terminal and plenty of good free text editors. We will assume these things are already familiar to you henceforth. - - -## Your First Changes - -Below are some first things to try with your new custom modules. You can test these to get a feel for the system. See also [Tutorials](./Tutorials) for more step-by-step help and special cases. - -### Tweak Default Character - -We will add some simple rpg attributes to our default Character. In the next section we will follow up with a new command to view those attributes. - -1. Edit `mygame/typeclasses/characters.py` and modify the `Character` class. The `at_object_creation` method also exists on the `DefaultCharacter` parent and will overload it. The `get_abilities` method is unique to our version of `Character`. - - ```python - class Character(DefaultCharacter): - # [...] - def at_object_creation(self): - """ - Called only at initial creation. This is a rather silly - example since ability scores should vary from Character to - Character and is usually set during some character - generation step instead. - """ - #set persistent attributes - self.db.strength = 5 - self.db.agility = 4 - self.db.magic = 2 - - def get_abilities(self): - """ - Simple access method to return ability - scores as a tuple (str,agi,mag) - """ - return self.db.strength, self.db.agility, self.db.magic - ``` - -1. [Reload](./Start-Stop-Reload) the server (you will still be connected to the game after doing this). Note that if you examine *yourself* you will *not* see any new Attributes appear yet. Read the next section to understand why. - -#### Updating Yourself - -It's important to note that the new [Attributes](./Attributes) we added above will only be stored on *newly* created characters. The reason for this is simple: The `at_object_creation` method, where we added those Attributes, is per definition only called when the object is *first created*, then never again. This is usually a good thing since those Attributes may change over time - calling that hook would reset them back to start values. But it also means that your existing character doesn't have them yet. You can see this by calling the `get_abilities` hook on yourself at this point: - -``` -# (you have to be superuser to use @py) -@py self.get_abilities() -<<< (None, None, None) -``` - -This is easily remedied. - -``` -@update self -``` - -This will (only) re-run `at_object_creation` on yourself. You should henceforth be able to get the abilities successfully: - -``` -@py self.get_abilities() -<<< (5, 4, 2) -``` - -This is something to keep in mind if you start building your world before your code is stable - startup-hooks will not (and should not) automatically run on *existing* objects - you have to update your existing objects manually. Luckily this is a one-time thing and pretty simple to do. If the typeclass you want to update is in `typeclasses.myclass.MyClass`, you can do the following (e.g. from `evennia shell`): - -```python -from typeclasses.myclass import MyClass -# loop over all MyClass instances in the database -# and call .swap_typeclass on them -for obj in MyClass.objects.all(): - obj.swap_typeclass(MyClass, run_start_hooks="at_object_creation") -``` - -Using `swap_typeclass` to the same typeclass we already have will re-run the creation hooks (this is what the `@update` command does under the hood). From in-game you can do the same with `@py`: - -``` -@py typeclasses.myclass import MyClass;[obj.swap_typeclass(MyClass) for obj in MyClass.objects.all()] -``` - -See the [Object Typeclass tutorial](./Adding-Object-Typeclass-Tutorial) for more help and the [Typeclasses](./Typeclasses) and [Attributes](./Attributes) page for detailed documentation about Typeclasses and Attributes. - -#### Troubleshooting: Updating Yourself - -One may experience errors for a number of reasons. Common beginner errors are spelling mistakes, wrong indentations or code omissions leading to a `SyntaxError`. Let's say you leave out a colon from the end of a class function like so: ```def at_object_creation(self)```. The client will reload without issue. *However*, if you look at the terminal/console (i.e. not in-game), you will see Evennia complaining (this is called a *traceback*): - -``` -Traceback (most recent call last): -File "C:\mygame\typeclasses\characters.py", line 33 - def at_object_creation(self) - ^ -SyntaxError: invalid syntax -``` - -Evennia will still be restarting and following the tutorial, doing `@py self.get_abilities()` will return the right response `(None, None, None)`. But when attempting to `@typeclass/force self` you will get this response: - -```python - AttributeError: 'DefaultObject' object has no attribute 'get_abilities' -``` - -The full error will show in the terminal/console but this is confusing since you did add `get_abilities` before. Note however what the error says - you (`self`) should be a `Character` but the error talks about `DefaultObject`. What has happened is that due to your unhandled `SyntaxError` earlier, Evennia could not load the `character.py` module at all (it's not valid Python). Rather than crashing, Evennia handles this by temporarily falling back to a safe default - `DefaultObject` - in order to keep your MUD running. Fix the original `SyntaxError` and reload the server. Evennia will then be able to use your modified `Character` class again and things should work. - -> Note: Learning how to interpret an error traceback is a critical skill for anyone learning Python. Full tracebacks will appear in the terminal/Console you started Evennia from. The traceback text can sometimes be quite long, but you are usually just looking for the last few lines: The description of the error and the filename + line number for where the error occurred. In the example above, we see it's a `SyntaxError` happening at `line 33` of `mygame\typeclasses\characters.py`. In this case it even points out *where* on the line it encountered the error (the missing colon). Learn to read tracebacks and you'll be able to resolve the vast majority of common errors easily. - -### Add a New Default Command - -The `@py` command used above is only available to privileged users. We want any player to be able to see their stats. Let's add a new [command](./Commands) to list the abilities we added in the previous section. - -1. Open `mygame/commands/command.py`. You could in principle put your command anywhere but this module has all the imports already set up along with some useful documentation. Make a new class at the bottom of this file: - - ```python - class CmdAbilities(Command): - """ - List abilities - - Usage: - abilities - - Displays a list of your current ability values. - """ - key = "abilities" - aliases = ["abi"] - lock = "cmd:all()" - help_category = "General" - - def func(self): - "implements the actual functionality" - - str, agi, mag = self.caller.get_abilities() - string = "STR: %s, AGI: %s, MAG: %s" % (str, agi, mag) - self.caller.msg(string) - ``` - -1. Next you edit `mygame/commands/default_cmdsets.py` and add a new import to it near the top: - - ```python - from commands.command import CmdAbilities - ``` - -1. In the `CharacterCmdSet` class, add the following near the bottom (it says where): - - ```python - self.add(CmdAbilities()) - ``` - -1. [Reload](./Start-Stop-Reload) the server (noone will be disconnected by doing this). - -You (and anyone else) should now be able to use `abilities` (or its alias `abi`) as part of your normal commands in-game: - -``` -abilities -STR: 5, AGI: 4, MAG: 2 -``` - -See the [Adding a Command tutorial](./Adding-Command-Tutorial) for more examples and the [Commands](./Commands) section for detailed documentation about the Command system. - -### Make a New Type of Object - -Let's test to make a new type of object. This example is an "wise stone" object that returns some random comment when you look at it, like this: - - > look stone - - A very wise stone - - This is a very wise old stone. - It grumbles and says: 'The world is like a rock of chocolate.' - -1. Create a new module in `mygame/typeclasses/`. Name it `wiseobject.py` for this example. -1. In the module import the base `Object` (`typeclasses.objects.Object`). This is empty by default, meaning it is just a proxy for the default `evennia.DefaultObject`. -1. Make a new class in your module inheriting from `Object`. Overload hooks on it to add new functionality. Here is an example of how the file could look: - - ```python - from random import choice - from typeclasses.objects import Object - - class WiseObject(Object): - """ - An object speaking when someone looks at it. We - assume it looks like a stone in this example. - """ - def at_object_creation(self): - "Called when object is first created" - self.db.wise_texts = \ - ["Stones have feelings too.", - "To live like a stone is to not have lived at all.", - "The world is like a rock of chocolate."] - - def return_appearance(self, looker): - """ - Called by the look command. We want to return - a wisdom when we get looked at. - """ - # first get the base string from the - # parent's return_appearance. - string = super().return_appearance(looker) - wisewords = "\n\nIt grumbles and says: '%s'" - wisewords = wisewords % choice(self.db.wise_texts) - return string + wisewords - ``` - -1. Check your code for bugs. Tracebacks will appear on your command line or log. If you have a grave Syntax Error in your code, the source file itself will fail to load which can cause issues with the entire cmdset. If so, fix your bug and [reload the server from the command line](./Start-Stop-Reload) (noone will be disconnected by doing this). -1. Use `@create/drop stone:wiseobject.WiseObject` to create a talkative stone. If the `@create` command spits out a warning or cannot find the typeclass (it will tell you which paths it searched), re-check your code for bugs and that you gave the correct path. The `@create` command starts looking for Typeclasses in `mygame/typeclasses/`. -1. Use `look stone` to test. You will see the default description ("You see nothing special") followed by a random message of stony wisdom. Use `@desc stone = This is a wise old stone.` to make it look nicer. See the [Builder Docs](./Builder-Docs) for more information. - -Note that `at_object_creation` is only called once, when the stone is first created. If you make changes to this method later, already existing stones will not see those changes. As with the `Character` example above you can use `@typeclass/force` to tell the stone to re-run its initialization. - -The `at_object_creation` is a special case though. Changing most other aspects of the typeclass does *not* require manual updating like this - you just need to `@reload` to have all changes applied automatically to all existing objects. - -## Where to Go From Here? - -There are more [Tutorials](./Tutorials), including one for building a [whole little MUSH-like game](./Tutorial-for-basic-MUSH-like-game) - that is instructive also if you have no interest in MUSHes per se. A good idea is to also get onto the [IRC chat](http://webchat.freenode.net/?channels=evennia) and the [mailing list](https://groups.google.com/forum/#!forum/evennia) to get in touch with the community and other developers. diff --git a/docs/0.9.1/_sources/Game-Planning.md.txt b/docs/0.9.1/_sources/Game-Planning.md.txt deleted file mode 100644 index a7953c932e..0000000000 --- a/docs/0.9.1/_sources/Game-Planning.md.txt +++ /dev/null @@ -1,113 +0,0 @@ -# Game Planning - - -So you have Evennia up and running. You have a great game idea in mind. Now it's time to start cracking! But where to start? Here are some ideas for a workflow. Note that the suggestions on this page are just that - suggestions. Also, they are primarily aimed at a lone hobby designer or a small team developing a game in their free time. There is an article in the Imaginary Realities e-zine which was written by the Evennia lead dev. It focuses more on you finding out your motivations for making a game - you can [read the article here](http://journal.imaginary-realities.com/volume-07/issue-03/where-do-i-begin/index.html). - - -Below are some minimal steps for getting the first version of a new game world going with players. It's worth to at least make the attempt to do these steps in order even if you are itching to jump ahead in the development cycle. On the other hand, you should also make sure to keep your work fun for you, or motivation will falter. Making a full game is a lot of work as it is, you'll need all your motivation to make it a reality. - -Remember that *99.99999% of all great game ideas never lead to a game*. Especially not to an online game that people can actually play and enjoy. So our first all overshadowing goal is to beat those odds and get *something* out the door! Even if it's a scaled-down version of your dream game, lacking many "must-have" features! It's better to get it out there and expand on it later than to code in isolation forever until you burn out, lose interest or your hard drive crashes. - -Like is common with online games, getting a game out the door does not mean you are going to be "finished" with the game - most MUDs add features gradually over the course of years - it's often part of the fun! - -## Planning (step 1) - -This is what you do before having coded a single line or built a single room. Many prospective game developers are very good at *parts* of this process, namely in defining what their world is "about": The theme, the world concept, cool monsters and so on. It is by all means very important to define what is the unique appeal of your game. But it's unfortunately not enough to make your game a reality. To do that you must also have an idea of how to actually map those great ideas onto Evennia. - -A good start is to begin by planning out the basic primitives of the game and what they need to be able to do. Below are a far-from-complete list of examples (and for your first version you should definitely try for a much shorter list): - -### Systems - -These are the behind-the-scenes features that exist in your game, often without being represented by a specific in-game object. - -- Should your game rules be enforced by coded systems or are you planning for human game masters to run and arbitrate rules? -- What are the actual mechanical game rules? How do you decide if an action succeeds or fails? What "rolls" does the game need to be able to do? Do you base your game off an existing system or make up your own? -- Does the flow of time matter in your game - does night and day change? What about seasons? Maybe your magic system is affected by the phase of the moon? -- Do you want changing, global weather? This might need to operate in tandem over a large number of rooms. -- Do you want a game-wide economy or just a simple barter system? Or no formal economy at all? -- Should characters be able to send mail to each other in-game? -- Should players be able to post on Bulletin boards? -- What is the staff hierarchy in your game? What powers do you want your staff to have? -- What should a Builder be able to build and what commands do they need in order to do that? -- etc. - -### Rooms - -Consider the most basic room in your game. - - - Is a simple description enough or should the description be able to change (such as with time, by light conditions, weather or season)? - - Should the room have different statuses? Can it have smells, sounds? Can it be affected by dramatic weather, fire or magical effects? If so, how would this affect things in the room? Or are these things something admins/game masters should handle manually? - - Can objects be hidden in the room? Can a person hide in the room? How does the room display this? - - etc. - -### Objects - -Consider the most basic (non-player-controlled) object in your game. - -- How numerous are your objects? Do you want large loot-lists or are objects just role playing props created on demand? -- Does the game use money? If so, is each coin a separate object or do you just store a bank account value? -- What about multiple identical objects? Do they form stacks and how are those stacks handled in that case? -- Does an object have weight or volume (so you cannot carry an infinite amount of them)? -- Can objects be broken? If so, does it have a health value? Is burning it causing the same damage as smashing it? Can it be repaired? -- Is a weapon a specific type of object or are you supposed to be able to fight with a chair too? Can you fight with a flower or piece of paper as well? -- NPCs/mobs are also objects. Should they just stand around or should they have some sort of AI? -- Are NPCs/mobs differet entities? How is an Orc different from a Kobold, in code - are they the same object with different names or completely different types of objects, with custom code? -- Should there be NPCs giving quests? If so, how would you track quest status and what happens when multiple players try to do the same quest? Do you use instances or some other mechanism? -- etc. - -### Characters - -These are the objects controlled directly by Players. - -- Can players have more than one Character active at a time or are they allowed to multi-play? -- How does a Player create their Character? A Character-creation screen? Answering questions? Filling in a form? -- Do you want to use classes (like "Thief", "Warrior" etc) or some other system, like Skill-based? -- How do you implement different "classes" or "races"? Are they separate types of objects or do you simply load different stats on a basic object depending on what the Player wants? -- If a Character can hide in a room, what skill will decide if they are detected? -- What skill allows a Character to wield a weapon and hit? Do they need a special skill to wield a chair rather than a sword? -- Does a Character need a Strength attribute to tell how much they can carry or which objects they can smash? -- What does the skill tree look like? Can a Character gain experience to improve? By killing enemies? Solving quests? By roleplaying? -- etc. - -A MUD's a lot more involved than you would think and these things hang together in a complex web. It can easily become overwhelming and it's tempting to want *all* functionality right out of the door. Try to identify the basic things that "make" your game and focus *only* on them for your first release. Make a list. Keep future expansions in mind but limit yourself. - -## Coding (step 2) - -This is the actual work of creating the "game" part of your game. Many "game-designer" types tend to gloss over this bit and jump directly to **World Building**. Vice versa, many "game-coder" types tend to jump directly to this part without doing the **Planning** first. Neither way is good and *will* lead to you having to redo all your hard work at least once, probably more. - -Evennia's [Developer Central](./Developer-Central) tries to help you with this bit of development. We also have a slew of [Tutorials](./Tutorials) with worked examples. Evennia tries hard to make this part easier for you, but there is no way around the fact that if you want anything but a very basic Talker-type game you *will* have to bite the bullet and code your game (or find a coder willing to do it for you). - -Even if you won't code anything yourself, as a designer you need to at least understand the basic paradigms of Evennia, such as [Objects](./Objects), [Commands](./Commands) and [Scripts](./Scripts) and how they hang together. We recommend you go through the [Tutorial World](./Tutorial-World-Introduction) in detail (as well as glancing at its code) to get at least a feel for what is involved behind the scenes. You could also look through the tutorial for [building a game from scratch](./Tutorial-for-basic-MUSH-like-game). - -During Coding you look back at the things you wanted during the **Planning** phase and try to implement them. Don't be shy to update your plans if you find things easier/harder than you thought. The earlier you revise problems, the easier they will be to fix. - -A good idea is to host your code online (publicly or privately) using version control. Not only will this make it easy for multiple coders to collaborate (and have a bug-tracker etc), it also means your work is backed up at all times. The [Version Control](./Version-Control) tutorial has instructions for setting up a sane developer environment with proper version control. - -### "Tech Demo" Building - -This is an integral part of your Coding. It might seem obvious to experienced coders, but it cannot be emphasized enough that you should *test things on a small scale* before putting your untested code into a large game-world. The earlier you test, the easier and cheaper it will be to fix bugs and even rework things that didn't work out the way you thought they would. You might even have to go back to the **Planning** phase if your ideas can't handle their meet with reality. - -This means building singular in-game examples. Make one room and one object of each important type and test so they work correctly in isolation. Then add more if they are supposed to interact with each other in some way. Build a small series of rooms to test how mobs move around ... and so on. In short, a test-bed for your growing code. It should be done gradually until you have a fully functioning (if not guaranteed bug-free) miniature tech demo that shows *all* the features you want in the first release of your game. There does not need to be any game play or even a theme to your tests, this is only for you and your co-coders to see. The more testing you do on this small scale, the less headaches you will have in the next phase. - -## World Building (step 3) - -Up until this point we've only had a few tech-demo objects in the database. This step is the act of populating the database with a larger, thematic world. Too many would-be developers jump to this stage too soon (skipping the **Coding** or even **Planning** stages). What if the rooms you build now doesn't include all the nice weather messages the code grows to support? Or the way you store data changes under the hood? Your building work would at best require some rework and at worst you would have to redo the whole thing. And whereas Evennia's typeclass system does allow you to edit the properties of existing objects, some hooks are only called at object creation ... Suffice to say you are in for a *lot* of unnecessary work if you build stuff en masse without having the underlying code systems in some reasonable shape first. - -So before starting to build, the "game" bit (**Coding** + **Testing**) should be more or less **complete**, *at least to the level of your initial release*. - -Before starting to build, you should also plan ahead again. Make sure it is clear to yourself and your eventual builders just which parts of the world you want for your initial release. Establish for everyone which style, quality and level of detail you expect. Your goal should *not* be to complete your entire world in one go. You want just enough to make the game's "feel" come across. You want a minimal but functioning world where the intended game play can be tested and roughly balanced. You can always add new areas later. - -During building you get free and extensive testing of whatever custom build commands and systems you have made at this point. Since Building often involves different people than those Coding, you also get a chance to hear if some things are hard to understand or non-intuitive. Make sure to respond to this feedback. - - -## Alpha Release - -As mentioned, don't hold onto your world more than necessary. *Get it out there* with a huge *Alpha* flag and let people try it! Call upon your alpha-players to try everything - they *will* find ways to break your game in ways that you never could have imagined. In Alpha you might be best off to focus on inviting friends and maybe other MUD developers, people who you can pester to give proper feedback and bug reports (there *will* be bugs, there is no way around it). Follow the quick instructions for [Online Setup](./Online-Setup) to make your game visible online. If you hadn't already, make sure to put up your game on the [Evennia game index](http://games.evennia.com/) so people know it's in the works (actually, even pre-alpha games are allowed in the index so don't be shy)! - -## Beta Release/Perpetual Beta - -Once things stabilize in Alpha you can move to *Beta* and let more people in. Many MUDs are in [perpetual beta](http://en.wikipedia.org/wiki/Perpetual_beta), meaning they are never considered "finished", but just repeat the cycle of Planning, Coding, Testing and Building over and over as new features get implemented or Players come with suggestions. As the game designer it is now up to you to gradually perfect your vision. - -## Congratulate yourself! - -You are worthy of a celebration since at this point you have joined the small, exclusive crowd who have made their dream game a reality! diff --git a/docs/0.9.1/_sources/Glossary.md.txt b/docs/0.9.1/_sources/Glossary.md.txt deleted file mode 100644 index d710c2dd32..0000000000 --- a/docs/0.9.1/_sources/Glossary.md.txt +++ /dev/null @@ -1,209 +0,0 @@ -# Glossary - - -This explains common recurring terms used in the Evennia docs. It will be expanded as needed. - -- _[account](./Glossary#account)_ - the player's account on the game -- _[admin-site](./Glossary#admin-site)_ - the Django web page for manipulating the database -- _[attribute](./Glossary#attribute)_ - persistent, custom data stored on typeclasses -- _[channel](./Glossary#channel)_ - game communication channels -- _[character](./Glossary#character)_ - the player's avatar in the game, controlled from _[account](./Glossary#account)_ -- _[core](./Glossary#core)_ - a term used for the code distributed with Evennia proper -- _[django](./Glossary#django)_ - web framework Evennia uses for database access and web integration -- _[field](./Glossary#field)_ - a _[typeclass](./Glossary#typeclass)_ property representing a database column -- _[git](./Glossary#git)_ - the version-control system we use -- _[github](./Glossary#github)_ - the online hosting of our source code -- _[migrate](./Glossary#migrate)_ - updating the database schema -- _[multisession mode`](#multisession-mode)_ - a setting defining how users connect to Evennia -- _[object](./Glossary#object)_ - Python instance, general term or in-game _[typeclass](./Glossary#typeclass)_ -- _[pip](./Glossary#pip)_ - the Python installer -- _player_ - the human connecting to the game with their client -- _[puppet](./Glossary#puppet)_ - when an [account](./Glossary#account) controls an in-game [object](./Glossary#object) -- _[property](./Glossary#property)_ - a python property -- _evenv_ - see _[virtualenv](./Glossary#virtualenv)_ -- _[repository](./Glossary#repository)_ - a store of source code + source history -- _[script](./Glossary#script)_ - a building block for custom storage, systems and time-keepint -- _[session](./Glossary#session)_ - represents one client connection -- _[ticker](./Glossary#ticker)_ - Allows to run events on a steady 'tick' -- _[twisted](./Glossary#twisted)_ - networking engine responsible for Evennia's event loop and communications -- _[typeclass](./Glossary#typeclass)_ - Evennia's database-connected Python class -- _upstream_ - see _[github](./Glossary#github)_ -- _[virtualenv](./Glossary#virtualenv)_ - a Python program and way to make an isolated Python install - - ---- - -### _account_ - -The term 'account' refers to the [player's](./Glossary#player) unique account on the game. It is represented by the `Account` [typeclass](./Glossary#typeclass) and holds things like email, password, configuration etc. - -When a player connects to the game, they connect to their account. The account has *no* representation in the game world. Through their Account they can instead choose to [puppet](./Glossary#puppet) one (or more, depending on game mode) [Characters](./Glossary#character) in the game. - -In the default [multisession mode](./Sessions#multisession-mode) of Evennia, you immediately start puppeting a Character with the same name as your Account when you log in - mimicking how older servers used to work. - -### _admin-site_ - -This usually refers to [Django's](./Glossary#django) *Admin site* or database-administration web page ([link to Django docs](https://docs.djangoproject.com/en/2.1/ref/contrib/admin/)). The admin site is an automatically generated web interface to the database (it can be customized extensively). It's reachable from the `admin` link on the default Evennia website you get with your server. - -### _attribute_ - -The term _Attribute_ should not be confused with ([properties](./Glossary#property) or [fields](./Glossary#field). The `Attribute` represents arbitrary pieces of data that can be attached to any [typeclassed](./Glossary#typeclass) entity in Evennia. Attributes allows storing new persistent data on typeclasses without changing their underlying database schemas. [Read more about Attributes here](./Attributes). - -### _channel_ - -A _Channel_ refers to an in-game communication channel. It's an entity that people subscribe to and which re-distributes messages between all subscribers. Such subscribers default to being [Accounts](./Glossary#account), for out-of-game communication but could also be [Objects (usually Characters)](./Glossary#character) if one wanted to adopt Channels for things like in-game walkie-talkies or phone systems. It is represented by the `Channel` typeclass. [You can read more about the comm system here](./Communications#channels). - -### _character_ - -The _Character_ is the term we use for the default avatar being [puppeted](./Glossary#puppet) by the [account](./Glossary#account) in the game world. It is represented by the `Character` typeclass (which is a child of [Object](./Glossary#object)). Many developers use children of this class to represent monsters and other NPCs. You can [read more about it here](./Objects#subclasses-of-object). - -### _django_ - -[Django](https://www.djangoproject.com/) is a professional and very popular Python web framework, similar to Rails for the Ruby language. It is one of Evennia's central library dependencies (the other one is [Twisted](./Glossary#twisted)). Evennia uses Django for two main things - to map all database operations to Python and for structuring our web site. - -Through Django, we can work with any supported database (SQlite3, Postgres, MySQL ...) using generic Python instead of database-specific SQL: A database table is represented in Django as a Python class (called a *model*). An Python instance of such a class represents a row in that table. - -There is usually no need to know the details of Django's database handling in order to use Evennia - it will handle most of the complexity for you under the hood using what we call [typeclasses](./Glossary#typeclass). But should you need the power of Django you can always get it. Most commonly people want to use "raw" Django when doing more advanced/custom database queries than offered by Evennia's [default search functions](./Tutorial-Searching-For-Objects). One will then need to read about Django's _querysets_. Querysets are Python method calls on a special form that lets you build complex queries. They get converted into optimized SQL queries under the hood, suitable for your current database. [Here is our tutorial/explanation of Django queries](./Tutorial-Searching-For-Objects#queries-in-django). - -> By the way, Django (and Evennia) does allow you to fall through and send raw SQL if you really want to. It's highly unlikely to be needed though; the Django database abstraction is very, very powerful. - -The other aspect where Evennia uses Django is for web integration. On one end Django gives an infrastructure for wiring Python functions (called *views*) to URLs: the view/function is called when a user goes that URL in their browser, enters data into a form etc. The return is the web page to show. Django also offers templating with features such as being able to add special markers in HTML where it will insert the values of Python variables on the fly (like showing the current player count on the web page). [Here is one of our tutorials on wiring up such a web page](./Add-a-simple-new-web-page). Django also comes with the [admin site](./Glossary#admin-site), which automatically maps the database into a form accessible from a web browser. - -### _core_ - -This term is sometimes used to represent the main Evennia library code suite, *excluding* its [contrib](./Glossary#contrib) directory. It can sometimes come up in code reviews, such as - -> Evennia is game-agnostic but this feature is for a particular game genre. So it does not belong in core. Better make it a contrib. - -### _field_ - -A _field_ or _database field_ in Evennia refers to a [property](./Glossary#property) on a [typeclass](./Glossary#typeclass) directly linked to an underlying database column. Only a few fixed properties per typeclass are database fields but they are often tied to the core functionality of that base typeclass (for example [Objects](./Glossary#object) store its location as a field). In all other cases, [attributes](./Glossary#attribute) are used to add new persistent data to the typeclass. [Read more about typeclass properties here](./Typeclasses#about-typeclass-properties). - -### _git_ - -[Git](https://git-scm.com/) is a [version control](https://en.wikipedia.org/wiki/Version_control) tool. It allows us to track the development of the Evennia code by dividing it into units called *commits*. A 'commit' is sort of a save-spot - you save the current state of your code and can then come back to it later if later changes caused problems. By tracking commits we know what 'version' of the code we are currently using. - -Evennia's source code + its source history is jointly called a [repository](./Glossary#repository). This is centrally stored at our online home on [GitHub](./Glossary#github). Everyone using or developing Evennia makes a 'clone' of this repository to their own computer - everyone automatically gets everything that is online, including all the code history. - -> Don't confuse Git and [GitHub](./Glossary#github). The former is the version control system. The latter is a website (run by a company) that allows you to upload source code controlled by Git for others to see (among other things). - -Git allows multiple users from around the world to efficiently collaborate on Evennia's code: People can make local commits on their cloned code. The commits they do can then be uploaded to GitHub and reviewed by the Evennia lead devs - and if the changes look ok they can be safely *merged* into the central Evennia code - and everyone can *pull* those changes to update their local copies. - -Developers using Evennia often uses Git on their own games in the same way - to track their changes and to help collaboration with team mates. This is done completely independently of Evennia's Git usage. - -Common usage (for non-Evennia developers): -- `git clone ` - clone an online repository to your computer. This is what you do when you 'download' Evennia. You only need to do this once. -- `git pull` (inside local copy of repository) - sync your local repository with what is online. - -> Full usage of Git is way beyond the scope of this glossary. See [Tutorial - version control](./Version-Control) for more info and links to the Git documentation. - -### _migrate_ - -This term is used for upgrading the database structure (it's _schema_ )to a new version. Most often this is due to Evennia's [upstream](./Glossary#github) schema changing. When that happens you need to migrate that schema to the new version as well. Once you have used [git](./Glossary#git) to pull the latest changes, just `cd` into your game dir and run - - evennia migrate - -That should be it (see [virtualenv](./Glossary#virtualenv) if you get a warning that the `evennia` command is not available). See also [Updating your game](./Updating-Your-Game) for more details. - -> Technically, migrations are shipped as little Python snippets of code that explains which database actions must be taken to upgrade from one version of the schema to the next. When you run the command above, those snippets are run in sequence. - -### _multisession mode_ - -This term refers to the `MULTISESSION_MODE` setting, which has a value of 0 to 3. The mode alters how players can connect to the game, such as how many Sessions a player can start with one account and how many Characters they can control at the same time. It is [described in detail here](./Sessions#multisession-mode). - -### _github_ - -[Github](https://github.com/evennia) is where Evennia's source code and documentation is hosted. This online [repository](./Glossary#repository) of code we also sometimes refer to as _upstream_. - -GitHub is a business, offering free hosting to Open-source projects like Evennia. Despite the similarity in name, don't confuse GitHub the website with [Git](./Glossary#git), the versioning system. Github hosts Git [repositories](./Glossary#repository) online and helps with collaboration and infrastructure. Git itself is a separate project. - -### _object_ - -In general Python (and other [object-oriented languages](https://en.wikipedia.org/wiki/Object-oriented_programming)), an `object` is what we call the instance of a *class*. But one of Evennia's core [typeclasses](./Glossary#typeclasss) is also called "Object". To separate these in the docs we try to use `object` to refer to the general term and capitalized `Object` when we refer to the typeclass. - -The `Object` is a typeclass that represents all *in-game* entities, including [Characters](./Glossary#character), rooms, trees, weapons etc. [Read more about Objects here](./Objects). - -### _pip_ - -_[pip](https://pypi.org/project/pip/)_ comes with Python and is the main tool for installing third-party Python packages from the web. Once a python package is installed you can do `import ` in your Python code. - -Common usage: -- `pip install ` - install the given package along with all its dependencies. -- `pip search ` - search Python's central package repository [PyPi](https://pypi.org/) for a package of that name. -- `pip install --upgrade ` - upgrade a package you already have to the latest version. -- `pip install ==1.5` - install exactly a specific package version. -- `pip install ` - install a Python package you have downloaded earlier (or cloned using git). -- `pip install -e ` - install a local package by just making a soft link to the folder. This means that if the code in `` changes, the installed Python package is immediately updated. If not using `-e`, one would need to run `pip install --upgrade ` every time to make the changes available when you import this package into your code. Evennia is installed this way. - -For development, `pip` is usually used together with a [virtualenv](./Glossary#virtualenv) to install all packages and dependencies needed for a project in one, isolated location on the hard drive. - -### _puppet_ - -An [account](./Glossary#account) can take control and "play as" any [Object](./Glossary#object). When doing so, we call this _puppeting_, (like [puppeteering](https://en.wikipedia.org/wiki/Puppeteer)). Normally the entity being puppeted is of the [Character](./Glossary#character) subclass but it does not have to be. - -### _property_ - -A _property_ is a general term used for properties on any Python object. The term also sometimes refers to the `property` built-in function of Python ([read more here](https://www.python-course.eu/python3_properties.php)). Note the distinction between properties, [fields](./Glossary#field) and [Attributes](./Glossary#attribute). - -### _repository_ - -A _repository_ is a version control/[git](./Glossary#git) term. It represents a folder containing source code plus its versioning history. - -> In Git's case, that history is stored in a hidden folder `.git`. If you ever feel the need to look into this folder you probably already know enough Git to know why. - -The `evennia` folder you download from us with `git clone` is a repository. The code on [GitHub](./Glossary#github) is often referred to as the 'online repository' (or the _upstream_ repository). If you put your game dir under version control, that of course becomes a repository as well. - -### _script_ - -When we refer to _Scripts_, we generally refer to the `Script` [typeclass](./Typeclasses). Scripts are the mavericks of Evennia - they are like [Objects](./Glossary#object) but without any in-game existence. They are useful as custom places to store data but also as building blocks in persistent game systems. Since the can be initialized with timing capabilities they can also be used for long-time persistent time keeping (for fast updates other types of timers may be better though). [Read more about Scripts here](./Scripts) - -### _session_ - -A [Session](./Sessions) is a Python object representing a single client connection to the server. A given human player could connect to the game from different clients and each would get a Session (even if you did not allow them to actually log in and get access to an [account](./Glossary#account)). - -Sessions are _not_ [typeclassed](./Glossary#typeclass) and has no database persistence. But since they always exist (also when not logged in), they share some common functionality with typeclasses that can be useful for certain game states. - -### _ticker_ - -The [Ticker handler](./TickerHandler) runs Evennia's optional 'ticker' system. In other engines, such as [DIKU](https://en.wikipedia.org/wiki/DikuMUD), all game events are processed only at specific intervals called 'ticks'. Evennia has no such technical limitation (events are processed whenever needed) but using a fixed tick can still be useful for certain types of game systems, like combat. Ticker Handler allows you to emulate any number of tick rates (not just one) and subscribe actions to be called when those ticks come around. - -### _typeclass_ - -The [typeclass](./Typeclasses) is an Evennia-specific term. A typeclass allows developers to work with database-persistent objects as if they were normal Python objects. It makes use of specific [Django](./Glossary#django) features to link a Python class to a database table. Sometimes we refer to such code entities as _being typeclassed_. - -Evennia's main typeclasses are [Account](./Glossary#account), [Object](./Glossary#object), [Script](./Glossary#script) and [Channel](./Glossary#channel). Children of the base class (such as [Character](./Glossary#character)) will use the same database table as the parent, but can have vastly different Python capabilities (and persistent features through [Attributes](./Glossary#attributes) and [Tags](./Glossary#tags). A typeclass can be coded and treated pretty much like any other Python class except it must inherit (at any distance) from one of the base typeclasses. Also, creating a new instance of a typeclass will add a new row to the database table to which it is linked. - -The [core](./Glossary#core) typeclasses in the Evennia library are all named `DefaultAccount`, `DefaultObject` etc. When you initialize your [game dir] you automatically get empty children of these, called `Account`, `Object` etc that you can start working with. - -### _twisted_ - -[Twisted](https://twistedmatrix.com/trac/) is a heavy-duty asynchronous networking engine. It is one of Evennia's two major library dependencies (the other one is [Django](./Glossary#django)). Twisted is what "runs" Evennia - it handles Evennia's event loop. Twisted also has the building blocks we need to construct network protocols and communicate with the outside world; such as our MUD-custom version of Telnet, Telnet+SSL, SSH, webclient-websockets etc. Twisted also runs our integrated web server, serving the Django-based website for your game. - -### _virtualenv_ - -The standard [virtualenv](https://virtualenv.pypa.io/en/stable/) program comes with Python. It is used to isolate all Python packages needed by a given Python project into one folder (we call that folder `evenv` but it could be called anything). A package environment created this way is usually referred to as "a virtualenv". If you ever try to run the `evennia` program and get an error saying something like "the command 'evennia' is not available" - it's probably because your virtualenv is not 'active' yet (see below). - -Usage: -- `virtualenv ` - initialize a new virtualenv `` in a new folder `` in the current location. Called `evenv` in these docs. -- `virtualenv -p path/to/alternate/python_executable ` - create a virtualenv using another Python version than default. -- `source /bin/activate`(linux/mac) - activate the virtualenv in ``. -- `\Scripts\activate` (windows) -- `deactivate` - turn off the currently activated virtualenv. - -A virtualenv is 'activated' only for the console/terminal it was started in, but it's safe to activate the same virtualenv many times in different windows if you want. Once activated, all Python packages now installed with [pip](./Glossary#pip) will install to `evenv` rather than to a global location like `/usr/local/bin` or `C:\Program Files`. - -> Note that if you have root/admin access you *could* install Evennia globally just fine, without using a virtualenv. It's strongly discouraged and considered bad practice though. Experienced Python developers tend to rather create one new virtualenv per project they are working on, to keep the varying installs cleanly separated from one another. - -When you execute Python code within this activated virtualenv, *only* those packages installed within will be possible to `import` into your code. So if you installed a Python package globally on your computer, you'll need to install it again in your virtualenv. - -> Virtualenvs *only* deal with Python programs/packages. Other programs on your computer couldn't care less if your virtualenv is active or not. So you could use `git` without the virtualenv being active, for example. - -When your virtualenv is active you should see your console/terminal prompt change to - - (evenv) ... - -... or whatever name you gave the virtualenv when you initialized it. - -> We sometimes say that we are "in" the virtualenv when it's active. But just to be clear - you never have to actually `cd` into the `evenv` folder. You can activate it from anywhere and will still be considered "in" the virtualenv wherever you go until you `deactivate` or close the console/terminal. - -So, when do I *need* to activate my virtualenv? If the virtualenv is not active, none of the Python packages/programs you installed in it will be available to you. So at a minimum, *it needs to be activated whenever you want to use the `evennia` command* for any reason. diff --git a/docs/0.9.1/_sources/Guest-Logins.md.txt b/docs/0.9.1/_sources/Guest-Logins.md.txt deleted file mode 100644 index cdcb8c479f..0000000000 --- a/docs/0.9.1/_sources/Guest-Logins.md.txt +++ /dev/null @@ -1,18 +0,0 @@ -# Guest Logins - - -Evennia supports *guest logins* out of the box. A guest login is an anonymous, low-access account and can be useful if you want users to have a chance to try out your game without committing to creating a real account. - -Guest accounts are turned off by default. To activate, add this to your `game/settings.py` file: - - GUEST_ENABLED = True - -Henceforth users can use `connect guest` (in the default command set) to login with a guest account. You may need to change your [Connection Screen](./Connection-Screen) to inform them of this possibility. Guest accounts work differently from normal accounts - they are automatically *deleted* whenever the user logs off or the server resets (but not during a reload). They are literally re-usable throw-away accounts. - -You can add a few more variables to your `settings.py` file to customize your guests: - -- `BASE_GUEST_TYPECLASS` - the python-path to the default [typeclass](./Typeclasses) for guests. Defaults to `"typeclasses.accounts.Guest"`. -- `PERMISSION_GUEST_DEFAULT` - [permission level](./Locks) for guest accounts. Defaults to `"Guests"`, which is the lowest permission level in the hierarchy. -- `GUEST_START_LOCATION` - the `#dbref` to the starting location newly logged-in guests should appear at. Defaults to `"#2` (Limbo). -- `GUEST_HOME` - guest home locations. Defaults to Limbo as well. -- `GUEST_LIST` - this is a list holding the possible guest names to use when entering the game. The length of this list also sets how many guests may log in at the same time. By default this is a list of nine names from `"Guest1"` to `"Guest9"`. diff --git a/docs/0.9.1/_sources/HAProxy-Config-(Optional).md.txt b/docs/0.9.1/_sources/HAProxy-Config-(Optional).md.txt deleted file mode 100644 index 82d3fc44b9..0000000000 --- a/docs/0.9.1/_sources/HAProxy-Config-(Optional).md.txt +++ /dev/null @@ -1,59 +0,0 @@ -# HAProxy Config (Optional) - -### Evennia, HTTPS and Secure Websockets can play nicely together, quickly. -May I suggest giving HAProxy 1.5+ a chance... - -Installing HAProxy is usually as simple as: -``` -# Redhat derivatives -yum install haproxy -# dnf instead of yum for very recent Fedora distros. -``` -or -``` -# Debian derivatives -apt install haproxy -``` - -Configuration of HAProxy requires a single file given as an argument on the command line: -``` -haproxy -f /path/to/config.file -``` - -In it (example using haproxy 1.5.18 on Centos7): -``` -# stuff provided by the default haproxy installs -global - log /dev/log local0 - chroot /var/lib/haproxy - maxconn 4000 - user haproxy -defaults - mode http - option forwardfor - -# Evennia Specifics -listen evennia-https-website - bind : ssl no-sslv3 no-tlsv10 crt /path/to/your-cert.pem - server localhost 127.0.0.1: - -listen evennia-secure-websocket - bind : ssl no-sslv3 no-tlsv10 crt /path/to/your-cert.pem - server localhost 127.0.0.1: - timeout client 10m - timeout server 10m -``` - -Then edit mygame/server/conf/settings.py and add: -``` -WEBSERVER_INTERFACES = ['127.0.0.1'] -WEBSOCKET_CLIENT_INTERFACE = '127.0.0.1' -``` -or -``` -LOCKDOWN_MODE=True -``` -and -``` -WEBSOCKET_CLIENT_URL="wss://yourhost.com:4002/" -``` \ No newline at end of file diff --git a/docs/0.9.1/_sources/Help-System.md.txt b/docs/0.9.1/_sources/Help-System.md.txt deleted file mode 100644 index 5e27174003..0000000000 --- a/docs/0.9.1/_sources/Help-System.md.txt +++ /dev/null @@ -1,86 +0,0 @@ -# Help System - - -An important part of Evennia is the online help system. This allows the players and staff alike to learn how to use the game's commands as well as other information pertinent to the game. The help system has many different aspects, from the normal editing of help entries from inside the game, to auto-generated help entries during code development using the *auto-help system*. - -## Viewing the help database - -The main command is `help`: - - help [searchstring] - -This will show a list of help entries, ordered after categories. You will find two sections, *Command help entries* and *Other help entries* (initially you will only have the first one). You can use help to get more info about an entry; you can also give partial matches to get suggestions. If you give category names you will only be shown the topics in that category. - - -## Command Auto-help system - -A common item that requires help entries are in-game commands. Keeping these entries up-to-date with the actual source code functionality can be a chore. Evennia's commands are therefore auto-documenting straight from the sources through its *auto-help system*. Only commands that you and your character can actually currently use are picked up by the auto-help system. That means an admin will see a considerably larger amount of help topics than a normal player when using the default `help` command. - -The auto-help system uses the `__doc__` strings of your command classes and formats this to a nice-looking help entry. This makes for a very easy way to keep the help updated - just document your commands well and updating the help file is just a `@reload` away. There is no need to manually create and maintain help database entries for commands; as long as you keep the docstrings updated your help will be dynamically updated for you as well. - -Example (from a module with command definitions): - -```python - class CmdMyCmd(Command): - """ - mycmd - my very own command - - Usage: - mycmd[/switches] - - Switches: - test - test the command - run - do something else - - This is my own command that does this and that. - - """ - # [...] - - help_category = "General" # default - auto_help = True # default - - # [...] -``` - -The text at the very top of the command class definition is the class' `__doc__`-string and will be shown to users looking for help. Try to use a consistent format - all default commands are using the structure shown above. - -You should also supply the `help_category` class property if you can; this helps to group help entries together for people to more easily find them. See the `help` command in-game to see the default categories. If you don't specify the category, "General" is assumed. - -If you don't want your command to be picked up by the auto-help system at all (like if you want to write its docs manually using the info in the next section or you use a [cmdset](./Command-Sets) that has its own help functionality) you can explicitly set `auto_help` class property to `False` in your command definition. - -Alternatively, you can keep the advantages of *auto-help* in commands, but control the display of command helps. You can do so by overriding the command's `get_help()` method. By default, this method will return the class docstring. You could modify it to add custom behavior: the text returned by this method will be displayed to the character asking for help in this command. - -## Database help entries - -These are all help entries not involving commands (this is handled automatically by the [Command Auto-help system](./Help-System#command-auto-help-system)). Non-automatic help entries describe how your particular game is played - its rules, world descriptions and so on. - -A help entry consists of four parts: - -- The *topic*. This is the name of the help entry. This is what players search for when they are looking for help. The topic can contain spaces and also partial matches will be found. -- The *help category*. Examples are *Administration*, *Building*, *Comms* or *General*. This is an overall grouping of similar help topics, used by the engine to give a better overview. -- The *text* - the help text itself, of any length. -- locks - a [lock definition](./Locks). This can be used to limit access to this help entry, maybe because it's staff-only or otherwise meant to be restricted. Help commands check for `access_type`s `view` and `edit`. An example of a lock string would be `view:perm(Builders)`. - -You can create new help entries in code by using `evennia.create_help_entry()`. - -```python -from evennia import create_help_entry -entry = create_help_entry("emote", - "Emoting is important because ...", - category="Roleplaying", locks="view:all()") -``` - -From inside the game those with the right permissions can use the `@sethelp` command to add and modify help entries. - - > @sethelp/add emote = The emote command is ... - -Using `@sethelp` you can add, delete and append text to existing entries. By default new entries will go in the *General* help category. You can change this using a different form of the `@sethelp` command: - - > @sethelp/add emote, Roleplaying = Emoting is important because ... - -If the category *Roleplaying* did not already exist, it is created and will appear in the help index. - -You can, finally, define a lock for the help entry by following the category with a [lock definition](./Locks): - - > @sethelp/add emote, Roleplaying, view:all() = Emoting is ... diff --git a/docs/0.9.1/_sources/How-To-Get-And-Give-Help.md.txt b/docs/0.9.1/_sources/How-To-Get-And-Give-Help.md.txt deleted file mode 100644 index ee382df329..0000000000 --- a/docs/0.9.1/_sources/How-To-Get-And-Give-Help.md.txt +++ /dev/null @@ -1,41 +0,0 @@ -# How To Get And Give Help - - -### How to *get* Help - -If you cannot find what you are looking for in the [online documentation]([online documentation](index)), here's what to do: - -- If you think the documentation is not clear enough and are short on time, fill in our quick little [online form][form] and let us know - no login required. Maybe the docs need to be improved or a new tutorial added! Note that while this form is useful as a suggestion box we cannot answer questions or reply to you. Use the discussion group or chat (linked below) if you want feedback. -- If you have trouble with a missing feature or a problem you think is a bug, go to the [issue tracker][issues] and search to see if has been reported/suggested already. If you can't find an existing entry create a new one. -- If you need help, want to start a discussion or get some input on something you are working on, make a post to the [discussions group][group] This is technically a 'mailing list', but you don't need to use e-mail; you can post and read all messages just as easily from your browser via the online interface. -- If you want more direct discussions with developers and other users, consider dropping into our IRC chat channel [#evennia][chat] on the *Freenode* network. Please note however that you have to be patient if you don't get any response immediately; we are all in very different time zones and many have busy personal lives. So you might have to hang around for a while - you'll get noticed eventually! - - -### How to *give* Help - -Evennia is a completely non-funded project. It relies on the time donated by its users and developers in order to progress. - -The first and easiest way you as a user can help us out is by taking part in [community discussions][group] and by giving feedback on what is good or bad. Report bugs you find and features you lack to our [issue tracker][issues]. Just the simple act of letting developers know you are out there using their program is worth a lot. Generally mentioning and reviewing Evennia elsewhere is also a nice way to spread the word. - -If you'd like to help develop Evennia more hands-on, here are some ways to get going: - -- Look through our [online documentation wiki]([online documentation wiki](index)) and see if you can help improve or expand the documentation (even small things like fixing typos!). You don't need any particular permissions to edit the wiki. -- Send a message to our [discussion group][group] and/or our [IRC chat][chat] asking about what needs doing, along with what your interests and skills are. -- Take a look at our [issue tracker][issues] and see if there's something you feel like taking on. [here are bugs][issues-master] that need fixes. At any given time there may also be some [bounties][issues-bounties] open - these are issues members of the community has put up money to see fixed (if you want to put up a bounty yourself you can do so via our page on [bountysource][bountysource]). -- Check out the [Contributing](./Contributing) page on how to practically contribute with code using github. - -... And finally, if you want to help motivate and support development you can also drop some coins in the developer's cup. You can [make a donation via PayPal][paypal] or, even better, [become an Evennia patron on Patreon][patreon]! This is a great way to tip your hat and show that you appreciate the work done with the server! Finally, if you want to encourage the community to resolve a particular - -[form]: https://docs.google.com/spreadsheet/viewform?hl=en_US&formkey=dGN0VlJXMWpCT3VHaHpscDEzY1RoZGc6MQ#gid=0 -[group]: http://groups.google.com/group/evennia/ -[issues]: https://github.com/evennia/evennia/issues -[issues-master]: https://github.com/evennia/evennia/issues?utf8=%E2%9C%93&q=is%3Aissue%20is%3Aopen%20label%3Abug%20label%3Amaster-branch -[chat]: http://webchat.freenode.net/?channels=evennia -[paypal]: https://www.paypal.com/se/cgi-bin/webscr?cmd=_flow&SESSION=Z-VlOvfGjYq2qvCDOUGpb6C8Due7skT0qOklQEy5EbaD1f0eyEQaYlmCc8O&dispatch=5885d80a13c0db1f8e263663d3faee8d64ad11bbf4d2a5a1a0d303a50933f9b2 -[donate-img]: http://images-focus-opensocial.googleusercontent.com/gadgets/proxy?url=https://www.paypalobjects.com/en%255fUS/SE/i/btn/btn%255fdonateCC%255fLG.gif&container=focus&gadget=a&rewriteMime=image/* -[patreon]: https://www.patreon.com/griatch -[patreon-img]: http://www.evennia.com/_/rsrc/1424724909023/home/evennia_patreon_100x100.png -[issues-bounties]: https://github.com/evennia/evennia/labels/bounty -[bountysource]: https://www.bountysource.com/teams/evennia - - diff --git a/docs/0.9.1/_sources/IRC.md.txt b/docs/0.9.1/_sources/IRC.md.txt deleted file mode 100644 index 02013f816e..0000000000 --- a/docs/0.9.1/_sources/IRC.md.txt +++ /dev/null @@ -1,61 +0,0 @@ -# IRC - - -_Disambiguation: This page is related to using IRC inside an Evennia game. To join the official Evennia IRC chat, connect to irc.freenode.net and join #evennia. Alternatively, you can [join our Discord](https://discord.gg/NecFePw), which is mirrored to IRC._ - -[IRC (Internet Relay Chat)](http://en.wikipedia.org/wiki/Internet_Relay_Chat) is a long standing chat protocol used by many open-source projects for communicating in real time. By connecting one of Evennia's [Channels](./Communications) to an IRC channel you can communicate also with people not on an mud themselves. You can also use IRC if you are only running your Evennia MUD locally on your computer (your game doesn't need to be open to the public)! All you need is an internet connection. For IRC operation you also need [twisted.words](http://twistedmatrix.com/trac/wiki/TwistedWords). This is available simply as a package *python-twisted-words* in many Linux distros, or directly downloadable from the link. - -## Configuring IRC - -To configure IRC, you'll need to activate it in your settings file. - -```python - IRC_ENABLED = True -``` - -Start Evennia and log in as a privileged user. You should now have a new command available: `@irc2chan`. This command is called like this: - - @irc2chan[/switches] = <#irchannel> - -If you already know how IRC works, this should be pretty self-evident to use. Read the help entry for more features. - -## Setting up IRC, step by step - -You can connect IRC to any Evennia channel (so you could connect it to the default *public* channel if you like), but for testing, let's set up a new channel `irc`. - - @ccreate irc = This is connected to an irc channel! - -You will automatically join the new channel. - -Next we will create a connection to an external IRC network and channel. There are many, many IRC nets. [Here is a list](http://www.irchelp.org/irchelp/networks/popular.html) of some of the biggest ones, the one you choose is not really very important unless you want to connect to a particular channel (also make sure that the network allows for "bots" to connect). - -For testing, we choose the *Freenode* network, `irc.freenode.net`. We will connect to a test channel, let's call it *#myevennia-test* (an IRC channel always begins with `#`). It's best if you pick an obscure channel name that didn't exist previously - if it didn't exist it will be created for you. - -> *Don't* connect to `#evennia` for testing and debugging, that is Evennia's official chat channel! You *are* welcome to connect your game to `#evennia` once you have everything working though - it can be a good way to get help and ideas. But if you do, please do so with an in-game channel open only to your game admins and developers). - -The *port* needed depends on the network. For Freenode this is `6667`. - -What will happen is that your Evennia server will connect to this IRC channel as a normal user. This "user" (or "bot") needs a name, which you must also supply. Let's call it "mud-bot". - -To test that the bot connects correctly you also want to log onto this channel with a separate, third-party IRC client. There are hundreds of such clients available. If you use Firefox, the *Chatzilla* plugin is good and easy. Freenode also offers its own web-based chat page. Once you have connected to a network, the command to join is usually `/join #channelname` (don't forget the #). - -Next we connect Evennia with the IRC channel. - - @irc2chan irc = irc.freenode.net 6667 #myevennia-test mud-bot - -Evennia will now create a new IRC bot `mud-bot` and connect it to the IRC network and the channel #myevennia. If you are connected to the IRC channel you will soon see the user *mud-bot* connect. - -Write something in the Evennia channel *irc*. - - irc Hello, World! - [irc] Anna: Hello, World! - -If you are viewing your IRC channel with a separate IRC client you should see your text appearing there, spoken by the bot: - - mud-bot> [irc] Anna: Hello, World! - -Write `Hello!` in your IRC client window and it will appear in your normal channel, marked with the name of the IRC channel you used (#evennia here). - - [irc] Anna@#myevennia-test: Hello! - -Your Evennia gamers can now chat with users on external IRC channels! diff --git a/docs/0.9.1/_sources/Internationalization.md.txt b/docs/0.9.1/_sources/Internationalization.md.txt deleted file mode 100644 index 3c035b7015..0000000000 --- a/docs/0.9.1/_sources/Internationalization.md.txt +++ /dev/null @@ -1,57 +0,0 @@ -# Internationalization - - -*Internationalization* (often abbreviated *i18n* since there are 18 characters between the first "i" -and the last "n" in that word) allows Evennia's core server to return texts in other languages than -English - without anyone having to edit the source code. Take a look at the `locale` directory of -the Evennia installation, there you will find which languages are currently supported. - -## Changing server language - -Change language by adding the following to your `mygame/server/conf/settings.py` file: - -```python - USE_I18N = True - LANGUAGE_CODE = 'en' -``` - -Here `'en'` should be changed to the abbreviation for one of the supported languages found in `locale/`. Restart the server to activate i18n. The two-character international language codes are found [here](http://www.science.co.il/Language/Codes.asp). - -> Windows Note: If you get errors concerning `gettext` or `xgettext` on Windows, see the [Django documentation](https://docs.djangoproject.com/en/1.7/topics/i18n/translation/#gettext-on-windows). A self-installing and up-to-date version of gettext for Windows (32/64-bit) is available on [Github](https://github.com/mlocati/gettext-iconv-windows). - -## Translating Evennia - -> **Important Note:** Evennia offers translations of hard-coded strings in the server, things like "Connection closed" or "Server restarted", strings that end users will see and which game devs are not supposed to change on their own. Text you see in the log file or on the command line (like error messages) are generally *not* translated (this is a part of Python). - -> In addition, text in default Commands and in default Typeclasses will *not* be translated by switching *i18n* language. To translate Commands and Typeclass hooks you must overload them in your game directory and translate their returns to the language you want. This is because from Evennia's perspective, adding *i18n* code to commands tend to add complexity to code that is *meant* to be changed anyway. One of the goals of Evennia is to keep the user-changeable code as clean and easy-to-read as possible. - -If you cannot find your language in `evennia/locale/` it's because noone has translated it yet. Alternatively you might have the language but find the translation bad ... You are welcome to help improve the situation! - -To start a new translation you need to first have cloned the Evennia repositry with GIT and activated a python virtualenv as described on the [Getting Started](./Getting-Started) page. You now need to `cd` to the `evennia/` directory. This is *not* your created game folder but the main Evennia library folder. If you see a folder `locale/` then you are in the right place. From here you run: - - evennia makemessages - -where `` is the [two-letter locale code](http://www.science.co.il/Language/Codes.asp) for the language you want, like 'sv' for Swedish or 'es' for Spanish. After a moment it will tell you the language has been processed. For instance: - - evennia makemessages sv - -If you started a new language a new folder for that language will have emerged in the `locale/` folder. Otherwise the system will just have updated the existing translation with eventual new strings found in the server. Running this command will not overwrite any existing strings so you can run it as much as you want. - -> Note: in Django, the `makemessages` command prefixes the locale name by the `-l` option (`... makemessages -l sv` for instance). This syntax is not allowed in Evennia, due to the fact that `-l` is the option to tail log files. Hence, `makemessages` doesn't use the `-l` flag. - -Next head to `locale//LC_MESSAGES` and edit the `**.po` file you find there. You can edit this with a normal text editor but it is easiest if you use a special po-file editor from the web (search the web for "po editor" for many free alternatives). - -The concept of translating is simple, it's just a matter of taking the english strings you find in -the `**.po` file and add your language's translation best you can. The `**.po` format (and many -supporting editors) allow you to mark translations as "fuzzy". This tells the system (and future -translators) that you are unsure about the translation, or that you couldn't find a translation that -exactly matched the intention of the original text. Other translators will see this and might be -able to improve it later. -Finally, you need to compile your translation into a more efficient form. Do so from the `evennia` folder -again: - - evennia compilemessages - -This will go through all languages and create/update compiled files (`**.mo`) for them. This needs to be done whenever a `**.po` file is updated. - -When you are done, send the `**.po` and `*.mo` file to the Evennia developer list (or push it into your own repository clone) so we can integrate your translation into Evennia! diff --git a/docs/0.9.1/_sources/Learn-Python-for-Evennia-The-Hard-Way.md.txt b/docs/0.9.1/_sources/Learn-Python-for-Evennia-The-Hard-Way.md.txt deleted file mode 100644 index b16f181de9..0000000000 --- a/docs/0.9.1/_sources/Learn-Python-for-Evennia-The-Hard-Way.md.txt +++ /dev/null @@ -1,27 +0,0 @@ -# Learn Python for Evennia The Hard Way - -# WORK IN PROGRESS - DO NOT USE - -Evennia provides a great foundation to build your very own MU* whether you have programming experience or none at all. Whilst Evennia has a number of in-game building commands and tutorials available to get you started, when approaching game systems of any complexity it is advisable to have the basics of Python under your belt before jumping into the code. There are many Python tutorials freely available online however this page focuses on Learn Python the Hard Way (LPTHW) by Zed Shaw. This tutorial takes you through the basics of Python and progresses you to creating your very own online text based game. Whilst completing the course feel free to install Evennia and try out some of our beginner tutorials. On completion you can return to this page, which will act as an overview to the concepts separating your online text based game and the inner-workings of Evennia. --The latter portion of the tutorial focuses working your engine into a webpage and is not strictly required for development in Evennia. - -## Exercise 23 -You may have returned here when you were invited to read some code. If you haven’t already, you should now have the knowledge necessary to install Evennia. Head over to the Getting Started page for install instructions. You can also try some of our tutorials to get you started on working with Evennia. - -## Bridging the gap. -If you have successfully completed the Learn Python the Hard Way tutorial you should now have a simple browser based Interactive Fiction engine which looks similar to this. -This engine is built using a single interactive object type, the Room class. The Room class holds a description of itself that is presented to the user and a list of hardcoded commands which if selected correctly will present you with the next rooms’ description and commands. Whilst your game only has one interactive object, MU* have many more: Swords and shields, potions and scrolls or even laser guns and robots. Even the player has an in-game representation in the form of your character. Each of these examples are represented by their own object with their own description that can be presented to the user. - -A basic object in Evennia has a number of default functions but perhaps most important is the idea of location. In your text engine you receive a description of a room but you are not really in the room because you have no in-game representation. However, in Evennia when you enter a Dungeon you ARE in the dungeon. That is to say your character.location = Dungeon whilst the Dungeon.contents now has a spunky young adventurer added to it. In turn, your character.contents may have amongst it a number of swords and potions to help you on your adventure and their location would be you. - -In reality each of these “objects” are just an entry in your Evennia projects database which keeps track of all these attributes, such as location and contents. Making changes to those attributes and the rules in which they are changed is the most fundamental perspective of how your game works. We define those rules in the objects Typeclass. The Typeclass is a Python class with a special connection to the games database which changes values for us through various class methods. Let’s look at your characters Typeclass rules for changing location. - - 1. `self.at_before_move(destination)` (if this returns False, move is aborted) - 2. `self.announce_move_from(destination)` - 3. (move happens here) - 4. `self.announce_move_to(source_location)` - 5. `self.at_after_move(source_location)` - -First we check if it’s okay to leave our current location, then we tell everyone there that we’re leaving. We move locations and tell everyone at our new location that we’ve arrived before checking we’re okay to be there. By default stages 1 and 5 are empty ready for us to add some rules. We’ll leave an explanation as to how to make those changes for the tutorial section, but imagine if you were an astronaut. A smart astronaut might stop at step 1 to remember to put his helmet on whilst a slower astronaut might realise he’s forgotten in step 5 before shortly after ceasing to be an astronaut. - -With all these objects and all this moving around it raises another problem. In your text engine the commands available to the player were hard-coded to the room. That means if we have commands we always want available to the player we’ll need to have those commands hard-coded on every single room. What about an armoury? When all the swords are gone the command to take a sword would still remain causing confusion. Evennia solves this problem by giving each object the ability to hold commands. Rooms can have commands attached to them specific to that location, like climbing a tree; Players can have commands which are always available to them, like ‘look’, ‘get’ and ‘say’; and objects can have commands attached to them which unlock when taking possession of it, like attack commands when obtaining a weapon. diff --git a/docs/0.9.1/_sources/Links.md.txt b/docs/0.9.1/_sources/Links.md.txt deleted file mode 100644 index 9a053c0efb..0000000000 --- a/docs/0.9.1/_sources/Links.md.txt +++ /dev/null @@ -1,110 +0,0 @@ -# Links - -*A list of resources that may be useful for Evennia users and developers.* - -### Official Evennia links - -- [evennia.com](http://www.evennia.com) - Main Evennia portal page. Links to all corners of Evennia. -- [Evennia github page](https://github.com/evennia/evennia) - Download code and read documentation. -- [Evennia official chat channel](http://webchat.freenode.net/?channels=evennia&uio=MT1mYWxzZSY5PXRydWUmMTE9MTk1JjEyPXRydWUbb) - Our official IRC chat #evennia at irc.freenode.net:6667. -- [Evennia forums/mailing list](http://groups.google.com/group/evennia) - Web interface to our google group. -- [Evennia development blog](http://evennia.blogspot.se/) - Musings from the lead developer. -- [Evennia's manual on ReadTheDocs](http://readthedocs.org/projects/evennia/) - Read and download offline in html, PDF or epub formats. -- [Evennia Game Index](http://games.evennia.com/) - An automated listing of Evennia games. ----- -- [Evennia on Open Hub](https://www.openhub.net/p/6906) -- [Evennia on OpenHatch](https://openhatch.org/projects/Evennia) -- [Evennia on PyPi](https://pypi.python.org/pypi/Evennia-MUD-Server/) -- [Evennia subreddit](http://www.reddit.com/r/Evennia/) (not much there yet though) - -### Third-party Evennia utilities and resources - -*For publicly available games running on Evennia, add and find those in the [Evennia game index](http://games.evennia.com) instead!* - -- [Discord Evennia channel](https://discord.gg/NecFePw) - This is a fan-driven Discord channel with a bridge to the official Evennia IRC channel. - ---- - -- [Discord live blog](https://discordapp.com/channels/517176782357528616/517176782781415434) of the _Blackbirds_ Evennia game project. -- [Unreal Engine Evennia plugin](https://www.unrealengine.com/marketplace/en-US/slug/evennia-plugin) - an in-progress Unreal plugin for integrating Evennia with Epic Games' Unreal Engine. -- [The dark net/March Hare MUD](https://github.com/thedarknet/evennia) from the 2019 [DEF CON 27](https://www.defcon.org/html/defcon-27/dc-27-index.html) hacker conference in Paris. This is an Evennia game dir with batchcode to build the custom _Hackers_ style cyberspace zone with puzzles and challenges [used during the conference](https://dcdark.net/home#). -- [Arx sources](https://github.com/Arx-Game/arxcode) - Open-source code release of the very popular [Arx](http://play.arxmush.org/) Evennia game. [Here are instructions for installing](./Arxcode-installing-help) -- [Evennia-wiki](https://github.com/vincent-lg/evennia-wiki) - An Evennia-specific Wiki for your website. -- [Evcolor](https://github.com/taladan/Pegasus/blob/origin/world/utilities/evcolor) - Optional coloration for Evennia unit-test output. -- [Paxboards](https://github.com/aurorachain/paxboards) - Evennia bulletin board system (both for telnet/web). -- [Encarnia sources](https://github.com/whitehorse-io/encarnia) - An open-sourced game dir for Evennia with things like races, combat etc. [Summary here](https://www.reddit.com/r/MUD/comments/6z6s3j/encarnia_an_evennia_python_mud_code_base_with/). -- [The world of Cool battles sources](https://github.com/FlutterSprite/coolbattles) - Open source turn-based battle system for Evennia. It also has a [live demo](http://wcb.battlestudio.com/). -- [nextRPI](https://github.com/cluebyte/nextrpi) - A github project for making a toolbox for people to make [RPI](http://www.topmudsites.com/forums/showthread.php?t=4804)-style Evennia games. -- [Muddery](https://github.com/muddery/muddery) - A mud framework under development, based on an older fork of Evennia. It has some specific design goals for building and extending the game based on input files. -- [vim-evennia](https://github.com/amfl/vim-evennia) - A mode for editing batch-build files (`.ev`) files in the [vim](http://www.vim.org/) text editor (Emacs users can use [evennia-mode.el](https://github.com/evennia/evennia/blob/master/evennia/utils/evennia-mode.el)). -- [Other Evennia-related repos on github](https://github.com/search?p=1&q=evennia) ----- -- [EvCast video series](https://www.youtube.com/playlist?list=PLyYMNttpc-SX1hvaqlUNmcxrhmM64pQXl) - Tutorial videos explaining installing Evennia, basic Python etc. -- [Evennia-docker](https://github.com/gtaylor/evennia-docker) - Evennia in a [Docker container](https://www.docker.com/) for quick install and deployment in just a few commands. -- [Evennia's docs in Chinese](http://www.evenniacn.com/) - A translated mirror of a slightly older Evennia version. Announcement [here](https://groups.google.com/forum/#!topic/evennia/3AXS8ZTzJaA). -- [Evennia for MUSHers](http://musoapbox.net/topic/1150/evennia-for-mushers) - An article describing Evennia for those used to the MUSH way of doing things. -- *[Language Understanding for Text games using Deep reinforcement learning](http://news.mit.edu/2015/learning-language-playing-computer-games-0924#_msocom_1)* ([PDF](http://people.csail.mit.edu/karthikn/pdfs/mud-play15.pdf)) - MIT research paper using Evennia to train AIs. - -### Other useful mud development resources - -- [ROM area reader](https://github.com/ctoth/area_reader) - Parser for converting ROM area files to Python objects. -- [Gossip MUD chat network](https://gossip.haus/) - -### General MUD forums and discussions - -- [MUD Coder's Guild](https://mudcoders.com/) - A blog and [associated Slack channel](https://slack.mudcoders.com/) with discussions on MUD development. -- [MuSoapbox](http://www.musoapbox.net/) - Very active Mu* game community mainly focused on MUSH-type gaming. -- [Imaginary Realities](http://journal.imaginary-realities.com/) - An e-magazine on game and MUD design that has several articles about Evennia. There is also an [archive of older issues](http://disinterest.org/resource/imaginary-realities/) from 1998-2001 that are still very relevant. -- [Optional Realities](http://optionalrealities.com/) - Mud development discussion forums that has regular articles on MUD development focused on roleplay-intensive games. After a HD crash it's not as content-rich as it once was. -- [MudLab](http://mudlab.org/) - Mud design discussion forum -- [MudConnector](http://www.mudconnect.com/) - Mud listing and forums -- [MudBytes](http://www.mudbytes.net/) - Mud listing and forums -- [Top Mud Sites](http://www.topmudsites.com/) - Mud listing and forums -- [Planet Mud-Dev](http://planet-muddev.disinterest.org/) - A blog aggregator following blogs of current MUD development (including Evennia) around the 'net. Worth to put among your RSS subscriptions. -- Mud Dev mailing list archive ([mirror](http://www.disinterest.org/resource/MUD-Dev/)) - Influential mailing list active 1996-2004. Advanced game design discussions. -- [Mud-dev wiki](http://mud-dev.wikidot.com/) - A (very) slowly growing resource on MUD creation. -- [Mud Client/Server Interaction](http://cryosphere.net/mud-protocol.html) - A page on classic MUD telnet protocols. -- [Mud Tech's fun/cool but ...](http://gc-taylor.com/blog/2013/01/08/mud-tech-funcool-dont-forget-ship-damned-thing/) - Greg Taylor gives good advice on mud design. -- [Lost Library of MOO](http://www.hayseed.net/MOO/) - Archive of scientific articles on mudding (in particular moo). -- [Nick Gammon's hints thread](http://www.gammon.com.au/forum/bbshowpost.php?bbsubject_id=5959) - Contains a very useful list of things to think about when starting your new MUD. -- [Lost Garden](http://www.lostgarden.com/) - A game development blog with long and interesting articles (not MUD-specific) -- [What Games Are](http://whatgamesare.com/) - A blog about general game design (not MUD-specific) -- [The Alexandrian](http://thealexandrian.net/) - A blog about tabletop roleplaying and board games, but with lots of general discussion about rule systems and game balance that could be applicable also for MUDs. -- [Raph Koster's laws of game design](https://www.raphkoster.com/games/laws-of-online-world-design/the-laws-of-online-world-design/) - thought-provoking guidelines and things to think about when designing a virtual multiplayer world (Raph is known for *Ultima Online* among other things). - -### Literature - -- Richard Bartle *Designing Virtual Worlds* ([amazon page](http://www.amazon.com/Designing-Virtual-Worlds-Richard-Bartle/dp/0131018167)) - Essential reading for the design of any persistent game world, written by the co-creator of the original game *MUD*. Published in 2003 but it's still as relevant now as when it came out. Covers everything you need to know and then some. -- Zed A. Shaw *Learn Python the Hard way* ([homepage](https://learnpythonthehardway.org/)) - Despite the imposing name this book is for the absolute Python/programming beginner. One learns the language by gradually creating a small text game! It has been used by multiple users before moving on to Evennia. *Update: This used to be free to read online, this is no longer the case.* -- David M. Beazley *Python Essential Reference (4th ed)* ([amazon page](http://www.amazon.com/Python-Essential-Reference-David-Beazley/dp/0672329786/)) - Our recommended book on Python; it not only efficiently summarizes the language but is also an excellent reference to the standard library for more experienced Python coders. -- Luciano Ramalho, *Fluent Python* ([o'reilly page](http://shop.oreilly.com/product/0636920032519.do)) - This is an excellent book for experienced Python coders willing to take their code to the next level. A great read with a lot of useful info also for veteran Pythonistas. -- Richard Cantillon *An Essay on Economic Theory* ([free pdf](http://mises.org/books/essay_on_economic_theory_cantillon.pdf)) - A very good English translation of *Essai sur la Nature du Commerce en Général*, one of the foundations of modern economic theory. Written in 1730 but the translation is annotated and the essay is actually very easy to follow also for a modern reader. Required reading if you think of implementing a sane game economic system. - -### Frameworks - -- [Django's homepage](http://www.djangoproject.com/) - - [Documentation](http://docs.djangoproject.com/en) - - [Code](http://code.djangoproject.com/) -- [Twisted homepage](http://twistedmatrix.com/) - - [Documentation](http://twistedmatrix.com/documents/current/core/howto/index.html) - - [Code](http://twistedmatrix.com/trac/browser) - -### Tools - -- [GIT](http://git-scm.com/) - - [Documentation](http://git-scm.com/documentation) - - [Learn GIT in 15 minutes](http://try.github.io/levels/1/challenges/1) (interactive tutorial) - -### Python Info - -- [Python Website](http://www.python.org/) - - [Documentation](http://www.python.org/doc/) - - [Tutorial](http://docs.python.org/tut/tut.html) - - [Library Reference](http://docs.python.org/lib/lib.html) - - [Language Reference](http://docs.python.org/ref/ref.html) - - [Python tips and tricks](http://www.siafoo.net/article/52) - - [Jetbrains Python academy](https://hyperskill.org/onboarding?track=python) - free online programming curriculum for different skill levels - -### Credits - - - Wiki [Home](./index) Icons made by [Freepik](http://www.freepik.com"-title="Freepik">Freepik) from [flaticon.com](http://www.flaticon.com), licensed under [Creative Commons BY 3.0](http://creativecommons.org/licenses/by/3.0). \ No newline at end of file diff --git a/docs/0.9.1/_sources/Locks.md.txt b/docs/0.9.1/_sources/Locks.md.txt deleted file mode 100644 index 7ef63b06da..0000000000 --- a/docs/0.9.1/_sources/Locks.md.txt +++ /dev/null @@ -1,359 +0,0 @@ -# Locks - - -For most games it is a good idea to restrict what people can do. In Evennia such restrictions are applied and checked by something called *locks*. All Evennia entities ([Commands](./Commands), [Objects](./Objects), [Scripts](./Scripts), [Accounts](./Accounts), [Help System](./Help-System), [messages](./Communications#Msg) and [channels](./Communications#Channels)) are accessed through locks. - -A lock can be thought of as an "access rule" restricting a particular use of an Evennia entity. Whenever another entity wants that kind of access the lock will analyze that entity in different ways to determine if access should be granted or not. Evennia implements a "lockdown" philosophy - all entities are inaccessible unless you explicitly define a lock that allows some or full access. - -Let's take an example: An object has a lock on itself that restricts how people may "delete" that object. Apart from knowing that it restricts deletion, the lock also knows that only players with the specific ID of, say, `34` are allowed to delete it. So whenever a player tries to run `delete` on the object, the `delete` command makes sure to check if this player is really allowed to do so. It calls the lock, which in turn checks if the player's id is `34`. Only then will it allow `delete` to go on with its job. - -## Setting and checking a lock - -The in-game command for setting locks on objects is `lock`: - - > lock obj = - -The `` is a string of a certain form that defines the behaviour of the lock. We will go into more detail on how `` should look in the next section. - -Code-wise, Evennia handles locks through what is usually called `locks` on all relevant entities. This is a handler that allows you to add, delete and check locks. - -```python - myobj.locks.add() -``` - -One can call `locks.check()` to perform a lock check, but to hide the underlying implementation all objects also have a convenience function called `access`. This should preferably be used. In the example below, `accessing_obj` is the object requesting the 'delete' access whereas `obj` is the object that might get deleted. This is how it would look (and does look) from inside the `delete` command: - -```python - if not obj.access(accessing_obj, 'delete'): - accessing_obj.msg("Sorry, you may not delete that.") - return -``` - -## Defining locks - -Defining a lock (i.e. an access restriction) in Evennia is done by adding simple strings of lock definitions to the object's `locks` property using `obj.locks.add()`. - -Here are some examples of lock strings (not including the quotes): - -```python - delete:id(34) # only allow obj #34 to delete - edit:all() # let everyone edit - # only those who are not "very_weak" or are Admins may pick this up - get: not attr(very_weak) or perm(Admin) -``` - -Formally, a lockstring has the following syntax: - -```python - access_type: [NOT] lockfunc1([arg1,..]) [AND|OR] [NOT] lockfunc2([arg1,...]) [...] -``` - -where `[]` marks optional parts. `AND`, `OR` and `NOT` are not case sensitive and excess spaces are ignored. `lockfunc1, lockfunc2` etc are special _lock functions_ available to the lock system. - -So, a lockstring consists of the type of restriction (the `access_type`), a colon (`:`) and then an expression involving function calls that determine what is needed to pass the lock. Each function returns either `True` or `False`. `AND`, `OR` and `NOT` work as they do normally in Python. If the total result is `True`, the lock is passed. - -You can create several lock types one after the other by separating them with a semicolon (`;`) in the lockstring. The string below yields the same result as the previous example: - - delete:id(34);edit:all();get: not attr(very_weak) or perm(Admin) - - -### Valid access_types - -An `access_type`, the first part of a lockstring, defines what kind of capability a lock controls, such as "delete" or "edit". You may in principle name your `access_type` anything as long as it is unique for the particular object. The name of the access types is not case-sensitive. - -If you want to make sure the lock is used however, you should pick `access_type` names that you (or the default command set) actually checks for, as in the example of `delete` above that uses the 'delete' `access_type`. - -Below are the access_types checked by the default commandset. - -- [Commands](./Commands) - - `cmd` - this defines who may call this command at all. -- [Objects](./Objects): - - `control` - who is the "owner" of the object. Can set locks, delete it etc. Defaults to the creator of the object. - - `call` - who may call Object-commands stored on this Object except for the Object itself. By default, Objects share their Commands with anyone in the same location (e.g. so you can 'press' a `Button` object in the room). For Characters and Mobs (who likely only use those Commands for themselves and don't want to share them) this should usually be turned off completely, using something like `call:false()`. - - `examine` - who may examine this object's properties. - - `delete` - who may delete the object. - - `edit` - who may edit properties and attributes of the object. - - `view` - if the `look` command will display/list this object - - `get`- who may pick up the object and carry it around. - - `puppet` - who may "become" this object and control it as their "character". - - `attrcreate` - who may create new attributes on the object (default True) -- [Characters](./Objects#Characters): - - Same as for Objects -- [Exits](./Objects#Exits): - - Same as for Objects - - `traverse` - who may pass the exit. -- [Accounts](./Accounts): - - `examine` - who may examine the account's properties. - - `delete` - who may delete the account. - - `edit` - who may edit the account's attributes and properties. - - `msg` - who may send messages to the account. - - `boot` - who may boot the account. -- [Attributes](./Attributes): (only checked by `obj.secure_attr`) - - `attrread` - see/access attribute - - `attredit` - change/delete attribute -- [Channels](./Communications#Channels): - - `control` - who is administrating the channel. This means the ability to delete the channel, boot listeners etc. - - `send` - who may send to the channel. - - `listen` - who may subscribe and listen to the channel. -- [HelpEntry](./Help-System): - - `examine` - who may view this help entry (usually everyone) - - `edit` - who may edit this help entry. - -So to take an example, whenever an exit is to be traversed, a lock of the type *traverse* will be checked. Defining a suitable lock type for an exit object would thus involve a lockstring `traverse: `. - -### Custom access_types - -As stated above, the `access_type` part of the lock is simply the 'name' or 'type' of the lock. The text is an arbitrary string that must be unique for an object. If adding a lock with the same `access_type` as one that already exists on the object, the new one override the old one. - -For example, if you wanted to create a bulletin board system and wanted to restrict who can either read a board or post to a board. You could then define locks such as: - -```python - obj.locks.add("read:perm(Player);post:perm(Admin)") -``` - -This will create a 'read' access type for Characters having the `Player` permission or above and a 'post' access type for those with `Admin` permissions or above (see below how the `perm()` lock function works). When it comes time to test these permissions, simply check like this (in this example, the `obj` may be a board on the bulletin board system and `accessing_obj` is the player trying to read the board): - -```python - if not obj.access(accessing_obj, 'read'): - accessing_obj.msg("Sorry, you may not read that.") - return -``` - -### Lock functions - -A lock function is a normal Python function put in a place Evennia looks for such functions. The modules Evennia looks at is the list `settings.LOCK_FUNC_MODULES`. *All functions* in any of those modules will automatically be considered a valid lock function. The default ones are found in `evennia/locks/lockfuncs.py` and you can start adding your own in `mygame/server/conf/lockfuncs.py`. You can append the setting to add more module paths. To replace a default lock function, just add your own with the same name. - -A lock function must always accept at least two arguments - the *accessing object* (this is the object wanting to get access) and the *accessed object* (this is the object with the lock). Those two are fed automatically as the first two arguments to the function when the lock is checked. Any arguments explicitly given in the lock definition will appear as extra arguments. - -```python - # A simple example lock function. Called with e.g. `id(34)`. This is - # defined in, say mygame/server/conf/lockfuncs.py - - def id(accessing_obj, accessed_obj, *args, **kwargs): - if args: - wanted_id = args[0] - return accessing_obj.id == wanted_id - return False -``` - -The above could for example be used in a lock function like this: - -```python - # we have `obj` and `owner_object` from before - obj.locks.add("edit: id(%i)" % owner_object.id) -``` - -We could check if the "edit" lock is passed with something like this: - -```python - # as part of a Command's func() method, for example - if not obj.access(caller, "edit"): - caller.msg("You don't have access to edit this!") - return -``` - -In this example, everyone except the `caller` with the right `id` will get the error. - -> (Using the `*` and `**` syntax causes Python to magically put all extra arguments into a list `args` and all keyword arguments into a dictionary `kwargs` respectively. If you are unfamiliar with how `*args` and `**kwargs` work, see the Python manuals). - -Some useful default lockfuncs (see `src/locks/lockfuncs.py` for more): - -- `true()/all()` - give access to everyone -- `false()/none()/superuser()` - give access to none. Superusers bypass the check entirely and are thus the only ones who will pass this check. -- `perm(perm)` - this tries to match a given `permission` property, on an Account firsthand, on a Character second. See [below](./Locks#permissions). -- `perm_above(perm)` - like `perm` but requires a "higher" permission level than the one given. -- `id(num)/dbref(num)` - checks so the access_object has a certain dbref/id. -- `attr(attrname)` - checks if a certain [Attribute](./Attributes) exists on accessing_object. -- `attr(attrname, value)` - checks so an attribute exists on accessing_object *and* has the given value. -- `attr_gt(attrname, value)` - checks so accessing_object has a value larger (`>`) than the given value. -- `attr_ge, attr_lt, attr_le, attr_ne` - corresponding for `>=`, `<`, `<=` and `!=`. -- `holds(objid)` - checks so the accessing objects contains an object of given name or dbref. -- `inside()` - checks so the accessing object is inside the accessed object (the inverse of `holds()`). -- `pperm(perm)`, `pid(num)/pdbref(num)` - same as `perm`, `id/dbref` but always looks for permissions and dbrefs of *Accounts*, not on Characters. -- `serversetting(settingname, value)` - Only returns True if Evennia has a given setting or a setting set to a given value. - -## Checking simple strings - -Sometimes you don't really need to look up a certain lock, you just want to check a lockstring. A common use is inside Commands, in order to check if a user has a certain permission. The lockhandler has a method `check_lockstring(accessing_obj, lockstring, bypass_superuser=False)` that allows this. - -```python - # inside command definition - if not self.caller.locks.check_lockstring(self.caller, "dummy:perm(Admin)"): - self.caller.msg("You must be an Admin or higher to do this!") - return -``` - -Note here that the `access_type` can be left to a dummy value since this method does not actually do a Lock lookup. - -## Default locks - -Evennia sets up a few basic locks on all new objects and accounts (if we didn't, noone would have any access to anything from the start). This is all defined in the root [Typeclasses](./Typeclasses) of the respective entity, in the hook method `basetype_setup()` (which you usually don't want to edit unless you want to change how basic stuff like rooms and exits store their internal variables). This is called once, before `at_object_creation`, so just put them in the latter method on your child object to change the default. Also creation commands like `create` changes the locks of objects you create - for example it sets the `control` lock_type so as to allow you, its creator, to control and delete the object. - -# Permissions - -> This section covers the underlying code use of permissions. If you just want to learn how to practically assign permissions in-game, refer to the [Building Permissions](./Building-Permissions) page, which details how you use the `perm` command. - -A *permission* is simply a list of text strings stored in the handler `permissions` on `Objects` and `Accounts`. Permissions can be used as a convenient way to structure access levels and hierarchies. It is set by the `perm` command. Permissions are especially handled by the `perm()` and `pperm()` lock functions listed above. - -Let's say we have a `red_key` object. We also have red chests that we want to unlock with this key. - - perm red_key = unlocks_red_chests - -This gives the `red_key` object the permission "unlocks_red_chests". Next we lock our red chests: - - lock red chest = unlock:perm(unlocks_red_chests) - -What this lock will expect is to the fed the actual key object. The `perm()` lock function will check the permissions set on the key and only return true if the permission is the one given. - -Finally we need to actually check this lock somehow. Let's say the chest has an command `open ` sitting on itself. Somewhere in its code the command needs to figure out which key you are using and test if this key has the correct permission: - -```python - # self.obj is the chest - # and used_key is the key we used as argument to - # the command. The self.caller is the one trying - # to unlock the chest - if not self.obj.access(used_key, "unlock"): - self.caller.msg("The key does not fit!") - return -``` - -All new accounts are given a default set of permissions defined by `settings.PERMISSION_ACCOUNT_DEFAULT`. - -Selected permission strings can be organized in a *permission hierarchy* by editing the tuple `settings.PERMISSION_HIERARCHY`. Evennia's default permission hierarchy is as follows: - - Developer # like superuser but affected by locks - Admin # can administrate accounts - Builder # can edit the world - Helper # can edit help files - Player # can chat and send tells (default level) - -(Also the plural form works, so you could use `Developers` etc too). - -> There is also a `Guest` level below `Player` that is only active if `settings.GUEST_ENABLED` is set. This is never part of `settings.PERMISSION_HIERARCHY`. - -The main use of this is that if you use the lock function `perm()` mentioned above, a lock check for a particular permission in the hierarchy will *also* grant access to those with *higher* hierarchy access. So if you have the permission "Admin" you will also pass a lock defined as `perm(Builder)` or any of those levels below "Admin". - -When doing an access check from an [Object](./Objects) or Character, the `perm()` lock function will always first use the permissions of any Account connected to that Object before checking for permissions on the Object. In the case of hierarchical permissions (Admins, Builders etc), the Account permission will always be used (this stops an Account from escalating their permission by puppeting a high-level Character). If the permission looked for is not in the hierarchy, an exact match is required, first on the Account and if not found there (or if no Account is connected), then on the Object itself. - -Here is how you use `perm` to give an account more permissions: - - perm/account Tommy = Builders - perm/account/del Tommy = Builders # remove it again - -Note the use of the `/account` switch. It means you assign the permission to the [Accounts](./Accounts) Tommy instead of any [Character](./Objects) that also happens to be named "Tommy". - -Putting permissions on the *Account* guarantees that they are kept, *regardless* of which Character they are currently puppeting. This is especially important to remember when assigning permissions from the *hierarchy tree* - as mentioned above, an Account's permissions will overrule that of its character. So to be sure to avoid confusion you should generally put hierarchy permissions on the Account, not on their Characters (but see also [quelling](./Locks#Quelling)). - -Below is an example of an object without any connected account - -```python - obj1.permissions = ["Builders", "cool_guy"] - obj2.locks.add("enter:perm_above(Accounts) and perm(cool_guy)") - - obj2.access(obj1, "enter") # this returns True! -``` - -And one example of a puppet with a connected account: - -```python - account.permissions.add("Accounts") - puppet.permissions.add("Builders", "cool_guy") - obj2.locks.add("enter:perm_above(Accounts) and perm(cool_guy)") - - obj2.access(puppet, "enter") # this returns False! -``` - -## Superusers - -There is normally only one *superuser* account and that is the one first created when starting Evennia (User #1). This is sometimes known as the "Owner" or "God" user. A superuser has more than full access - it completely *bypasses* all locks so no checks are even run. This allows for the superuser to always have access to everything in an emergency. But it also hides any eventual errors you might have made in your lock definitions. So when trying out game systems you should either use quelling (see below) or make a second Developer-level character so your locks get tested correctly. - -## Quelling - -The `quell` command can be used to enforce the `perm()` lockfunc to ignore permissions on the Account and instead use the permissions on the Character only. This can be used e.g. by staff to test out things with a lower permission level. Return to the normal operation with `unquell`. Note that quelling will use the smallest of any hierarchical permission on the Account or Character, so one cannot escalate one's Account permission by quelling to a high-permission Character. Also the superuser can quell their powers this way, making them affectable by locks. - -## More Lock definition examples - - examine: attr(eyesight, excellent) or perm(Builders) - -You are only allowed to do *examine* on this object if you have 'excellent' eyesight (that is, has an Attribute `eyesight` with the value `excellent` defined on yourself) or if you have the "Builders" permission string assigned to you. - - open: holds('the green key') or perm(Builder) - -This could be called by the `open` command on a "door" object. The check is passed if you are a Builder or has the right key in your inventory. - - cmd: perm(Builders) - -Evennia's command handler looks for a lock of type `cmd` to determine if a user is allowed to even call upon a particular command or not. When you define a command, this is the kind of lock you must set. See the default command set for lots of examples. If a character/account don't pass the `cmd` lock type the command will not even appear in their `help` list. - - cmd: not perm(no_tell) - -"Permissions" can also be used to block users or implement highly specific bans. The above example would be be added as a lock string to the `tell` command. This will allow everyone *not* having the "permission" `no_tell` to use the `tell` command. You could easily give an account the "permission" `no_tell` to disable their use of this particular command henceforth. - - -```python - dbref = caller.id - lockstring = "control:id(%s);examine:perm(Builders);delete:id(%s) or perm(Admin);get:all()" % (dbref, dbref) - new_obj.locks.add(lockstring) -``` - -This is how the `create` command sets up new objects. In sequence, this permission string sets the owner of this object be the creator (the one running `create`). Builders may examine the object whereas only Admins and the creator may delete it. Everyone can pick it up. - -## A complete example of setting locks on an object - -Assume we have two objects - one is ourselves (not superuser) and the other is an [Object](./Objects) called `box`. - - > create/drop box - > desc box = "This is a very big and heavy box." - -We want to limit which objects can pick up this heavy box. Let's say that to do that we require the would-be lifter to to have an attribute *strength* on themselves, with a value greater than 50. We assign it to ourselves to begin with. - - > set self/strength = 45 - -Ok, so for testing we made ourselves strong, but not strong enough. Now we need to look at what happens when someone tries to pick up the the box - they use the `get` command (in the default set). This is defined in `evennia/commands/default/general.py`. In its code we find this snippet: - -```python - if not obj.access(caller, 'get'): - if obj.db.get_err_msg: - caller.msg(obj.db.get_err_msg) - else: - caller.msg("You can't get that.") - return -``` - -So the `get` command looks for a lock with the type *get* (not so surprising). It also looks for an [Attribute](./Attributes) on the checked object called _get_err_msg_ in order to return a customized error message. Sounds good! Let's start by setting that on the box: - - > set box/get_err_msg = You are not strong enough to lift this box. - -Next we need to craft a Lock of type *get* on our box. We want it to only be passed if the accessing object has the attribute *strength* of the right value. For this we would need to create a lock function that checks if attributes have a value greater than a given value. Luckily there is already such a one included in evennia (see `evennia/locks/lockfuncs.py`), called `attr_gt`. - -So the lock string will look like this: `get:attr_gt(strength, 50)`. We put this on the box now: - - lock box = get:attr_gt(strength, 50) - -Try to `get` the object and you should get the message that we are not strong enough. Increase your strength above 50 however and you'll pick it up no problem. Done! A very heavy box! - -If you wanted to set this up in python code, it would look something like this: - -```python - - from evennia import create_object - - # create, then set the lock - box = create_object(None, key="box") - box.locks.add("get:attr_gt(strength, 50)") - - # or we can assign locks in one go right away - box = create_object(None, key="box", locks="get:attr_gt(strength, 50)") - - # set the attributes - box.db.desc = "This is a very big and heavy box." - box.db.get_err_msg = "You are not strong enough to lift this box." - - # one heavy box, ready to withstand all but the strongest... -``` - -## On Django's permission system - -Django also implements a comprehensive permission/security system of its own. The reason we don't use that is because it is app-centric (app in the Django sense). Its permission strings are of the form `appname.permstring` and it automatically adds three of them for each database model in the app - for the app evennia/object this would be for example 'object.create', 'object.admin' and 'object.edit'. This makes a lot of sense for a web application, not so much for a MUD, especially when we try to hide away as much of the underlying architecture as possible. - -The django permissions are not completely gone however. We use it for validating passwords during login. It is also used exclusively for managing Evennia's web-based admin site, which is a graphical front-end for the database of Evennia. You edit and assign such permissions directly from the web interface. It's stand-alone from the permissions described above. diff --git a/docs/0.9.1/_sources/Messagepath.md.txt b/docs/0.9.1/_sources/Messagepath.md.txt deleted file mode 100644 index 31e56bbc90..0000000000 --- a/docs/0.9.1/_sources/Messagepath.md.txt +++ /dev/null @@ -1,155 +0,0 @@ -# Messagepath - - -The main functionality of Evennia is to communicate with clients connected to it; a player enters commands or their client queries for a gui update (ingoing data). The server responds or sends data on its own as the game changes (outgoing data). It's important to understand how this flow of information works in Evennia. - -## The ingoing message path - -We'll start by tracing data from the client to the server. Here it is in short: - - Client -> - PortalSession -> - PortalSessionhandler -> - (AMP) -> - ServerSessionHandler -> - ServerSession -> - Inputfunc - -### Client (ingoing) - -The client sends data to Evennia in two ways. - - - When first connecting, the client can send data to the server about its - capabilities. This is things like "I support xterm256 but not unicode" and is - mainly used when a Telnet client connects. This is called a "handshake" and - will generally set some flags on the [Portal Session](./Portal-And-Server) that - are later synced to the Server Session. Since this is not something the player - controls, we'll not explore this further here. - - The client can send an *inputcommand* to the server. Traditionally this only - happens when the player enters text on the command line. But with a custom - client GUI, a command could also come from the pressing of a button. Finally - the client may send commands based on a timer or some trigger. - -Exactly how the inputcommand looks when it travels from the client to Evennia -depends on the [Protocol](./Custom-Protocols) used: - - Telnet: A string. If GMCP or MSDP OOB protocols are used, this string will - be formatted in a special way, but it's still a raw string. If Telnet SSL is - active, the string will be encrypted. - - SSH: An encrypted string - - Webclient: A JSON-serialized string. - -### Portal Session (ingoing) - -Each client is connected to the game via a *Portal Session*, one per connection. This Session is different depending on the type of connection (telnet, webclient etc) and thus know how to handle that particular data type. So regardless of how the data arrives, the Session will identify the type of the instruction and any arguments it should have. For example, the telnet protocol will figure that anything arriving normally over the wire should be passed on as a "text" type. - -### PortalSessionHandler (ingoing) - -The *PortalSessionhandler* manages all connected Sessions in the Portal. Its `data_in` method (called by each Portal Session) will parse the command names and arguments from the protocols and convert them to a standardized form we call the *inputcommand*: - -```python - (commandname, (args), {kwargs}) -``` - -All inputcommands must have a name, but they may or may not have arguments and keyword arguments - in fact no default inputcommands use kwargs at all. The most common inputcommand is "text", which has the argument the player input on the command line: - -```python - ("text", ("look",), {}) -``` - -This inputcommand-structure is pickled together with the unique session-id of the Session to which it belongs. This is then sent over the AMP connection. - -### ServerSessionHandler (ingoing) - -On the Server side, the AMP unpickles the data and associates the session id with the server-side [Session](./Sessions). Data and Session are passed to the server-side `SessionHandler.data_in`. This in turn calls `ServerSession.data_in()` - -### ServerSession (ingoing) - -The method `ServerSession.data_in` is meant to offer a single place to override if they want to examine *all* data passing into the server from the client. It is meant to call the `ssessionhandler.call_inputfuncs` with the (potentially processed) data (so this is technically a sort of detour back to the sessionhandler). - -In `call_inputfuncs`, the inputcommand's name is compared against the names of all the *inputfuncs* registered with the server. The inputfuncs are named the same as the inputcommand they are supposed to handle, so the (default) inputfunc for handling our "look" command is called "text". These are just normal functions and one can plugin new ones by simply putting them in a module where Evennia looks for such functions. - -If a matching inputfunc is found, it will be called with the Session and the inputcommand's arguments: - -```python - text(session, *("look",), **{}) -``` - - If no matching inputfunc is found, an inputfunc named "default" will be tried and if that is also not found, an error will be raised. - -### Inputfunc - -The [Inputfunc](./Inputfuncs) must be on the form `func(session, *args, **kwargs)`. An exception is the `default` inputfunc which has form `default(session, cmdname, *args, **kwargs)`, where `cmdname` is the un-matched inputcommand string. - -This is where the message's path diverges, since just what happens next depends on the type of inputfunc was triggered. In the example of sending "look", the inputfunc is named "text". It will pass the argument to the `cmdhandler` which will eventually lead to the `look` command being executed. - - -## The outgoing message path - -Next let's trace the passage from server to client. - - msg -> - ServerSession -> - ServerSessionHandler -> - (AMP) -> - PortalSessionHandler -> - PortalSession -> - Client - -### msg - -All outgoing messages start in the `msg` method. This is accessible from three places: - - - `Object.msg` - - `Account.msg` - - `Session.msg` - -The call sign of the `msg` method looks like this: - -```python - msg(text=None, from_obj=None, session=None, options=None, **kwargs) -``` - -For our purposes, what is important to know is that with the exception of `from_obj`, `session` and `options`, all keywords given to the `msg` method is the name of an *outputcommand* and its arguments. So `text` is actually such a command, taking a string as its argument. The reason `text` sits as the first keyword argument is that it's so commonly used (`caller.msg("Text")` for example). Here are some examples - -```python - msg("Hello!") # using the 'text' outputfunc - msg(prompt="HP:%i, SP: %i, MP: %i" % (HP, SP, MP)) - msg(mycommand=((1,2,3,4), {"foo": "bar"}) - -``` -Note the form of the `mycommand` outputfunction. This explicitly defines the arguments and keyword arguments for the function. In the case of the `text` and `prompt` calls we just specify a string - this works too: The system will convert this into a single argument for us later in the message path. - -> Note: The `msg` method sits on your Object- and Account typeclasses. It means you can easily override `msg` and make custom- or per-object modifications to the flow of data as it passes through. - -### ServerSession (outgoing) - -Nothing is processed on the Session, it just serves as a gathering points for all different `msg`. It immediately passes the data on to ... - -### ServerSessionHandler (outgoing) - -In the *ServerSessionhandler*, the keywords from the `msg` method are collated into one or more *outputcommands* on a standardized form (identical to inputcommands): - -``` - (commandname, (args), {kwargs}) -``` - -This will intelligently convert different input to the same form. So `msg("Hello")` will end up as an outputcommand `("text", ("Hello",), {})`. - -This is also the point where [Inlinefuncs](./TextTags#inline-functions) are parsed, depending on the session to receive the data. Said data is pickled together with the Session id then sent over the AMP bridge. - -### PortalSessionHandler (outgoing) - -After the AMP connection has unpickled the data and paired the session id to the matching PortalSession, the handler next determines if this Session has a suitable method for handling the outputcommand. - -The situation is analogous to how inputfuncs work, except that protocols are fixed things that don't need a plugin infrastructure like the inputfuncs are handled. So instead of an "outputfunc", the handler looks for methods on the PortalSession with names of the form `send_`. - -For example, the common sending of text expects a PortalSession method `send_text`. This will be called as `send_text(*("Hello",), **{})`. If the "prompt" outputfunction was used, send_prompt is called. In all other cases the `send_default(cmdname, *args, **kwargs)` will be called - this is the case for all client-custom outputcommands, like when wanting to tell the client to update a graphic or play a sound. - -### PortalSession (outgoing) - -At this point it is up to the session to convert the command into a form understood by this particular protocol. For telnet, `send_text` will just send the argument as a string (since that is what telnet clients expect when "text" is coming). If `send_default` was called (basically everything that is not traditional text or a prompt), it will pack the data as an GMCP or MSDP command packet if the telnet client supports either (otherwise it won't send at all). If sending to the webclient, the data will get packed into a JSON structure at all times. - -### Client (outgoing) - -Once arrived at the client, the outputcommand is handled in the way supported by the client (or it may be quietly ignored if not). "text" commands will be displayed in the main window while others may trigger changes in the GUI or play a sound etc. - diff --git a/docs/0.9.1/_sources/New-Models.md.txt b/docs/0.9.1/_sources/New-Models.md.txt deleted file mode 100644 index 666e9eae61..0000000000 --- a/docs/0.9.1/_sources/New-Models.md.txt +++ /dev/null @@ -1,187 +0,0 @@ -# New Models - -*Note: This is considered an advanced topic.* - -Evennia offers many convenient ways to store object data, such as via Attributes or Scripts. This is sufficient for most use cases. But if you aim to build a large stand-alone system, trying to squeeze your storage requirements into those may be more complex than you bargain for. Examples may be to store guild data for guild members to be able to change, tracking the flow of money across a game-wide economic system or implement other custom game systems that requires the storage of custom data in a quickly accessible way. Whereas [Tags](./Tags) or [Scripts](./Scripts) can handle many situations, sometimes things may be easier to handle by adding your own database model. - -## Overview of database tables - -SQL-type databases (which is what Evennia supports) are basically highly optimized systems for retrieving text stored in tables. A table may look like this - -``` - id | db_key | db_typeclass_path | db_permissions ... - ------------------------------------------------------------------ - 1 | Griatch | evennia.DefaultCharacter | Developers ... - 2 | Rock | evennia.DefaultObject | None ... -``` - -Each line is considerably longer in your database. Each column is referred to as a "field" and every row is a separate object. You can check this out for yourself. If you use the default sqlite3 database, go to your game folder and run - - evennia dbshell - -You will drop into the database shell. While there, try: - - sqlite> .help # view help - - sqlite> .tables # view all tables - - # show the table field names for objects_objectdb - sqlite> .schema objects_objectdb - - # show the first row from the objects_objectdb table - sqlite> select * from objects_objectdb limit 1; - - sqlite> .exit - -Evennia uses [Django](https://docs.djangoproject.com), which abstracts away the database SQL manipulation and allows you to search and manipulate your database entirely in Python. Each database table is in Django represented by a class commonly called a *model* since it describes the look of the table. In Evennia, Objects, Scripts, Channels etc are examples of Django models that we then extend and build on. - -## Adding a new database table - -Here is how you add your own database table/models: - -1. In Django lingo, we will create a new "application" - a subsystem under the main Evennia program. For this example we'll call it "myapp". Run the following (you need to have a working Evennia running before you do this, so make sure you have run the steps in [Getting Started](./Getting-Started) first): - - cd mygame/world - evennia startapp myapp - -1. A new folder `myapp` is created. "myapp" will also be the name (the "app label") from now on. We chose to put it in the `world/` subfolder here, but you could put it in the root of your `mygame` if that makes more sense. -1. The `myapp` folder contains a few empty default files. What we are -interested in for now is `models.py`. In `models.py` you define your model(s). Each model will be a table in the database. See the next section and don't continue until you have added the models you want. -1. You now need to tell Evennia that the models of your app should be a part of your database scheme. Add this line to your `mygame/server/conf/settings.py`file (make sure to use the path where you put `myapp` and don't forget the comma at the end of the tuple): - - ``` - INSTALLED_APPS = INSTALLED_APPS + ("world.myapp", ) - ``` - -1. From `mygame/`, run - - evennia makemigrations myapp - evennia migrate - -This will add your new database table to the database. If you have put your game under version control (if not, [you should](./Version-Control)), don't forget to `git add myapp/*` to add all items to version control. - -## Defining your models - -A Django *model* is the Python representation of a database table. It can be handled like any other Python class. It defines *fields* on itself, objects of a special type. These become the "columns" of the database table. Finally, you create new instances of the model to add new rows to the database. - -We won't describe all aspects of Django models here, for that we refer to the vast [Django documentation](https://docs.djangoproject.com/en/2.2/topics/db/models/) on the subject. Here is a (very) brief example: - -```python -from django.db import models - -class MyDataStore(models.Model): - "A simple model for storing some data" - db_key = models.CharField(max_length=80, db_index=True) - db_category = models.CharField(max_length=80, null=True, blank=True) - db_text = models.TextField(null=True, blank=True) - # we need this one if we want to be - # able to store this in an Evennia Attribute! - db_date_created = models.DateTimeField('date created', editable=False, - auto_now_add=True, db_index=True) -``` - -We create four fields: two character fields of limited length and one text field which has no maximum length. Finally we create a field containing the current time of us creating this object. - -> The `db_date_created` field, with exactly this name, is *required* if you want to be able to store instances of your custom model in an Evennia [Attribute](./Attributes). It will automatically be set upon creation and can after that not be changed. Having this field will allow you to do e.g. `obj.db.myinstance = mydatastore`. If you know you'll never store your model instances in Attributes the `db_date_created` field is optional. - -You don't *have* to start field names with `db_`, this is an Evennia convention. It's nevertheless recommended that you do use `db_`, partly for clarity and consistency with Evennia (if you ever want to share your code) and partly for the case of you later deciding to use Evennia's `SharedMemoryModel` parent down the line. - -The field keyword `db_index` creates a *database index* for this field, which allows quicker lookups, so it's recommended to put it on fields you know you'll often use in queries. The `null=True` and `blank=True` keywords means that these fields may be left empty or set to the empty string without the database complaining. There are many other field types and keywords to define them, see django docs for more info. - -Similar to using [django-admin](https://docs.djangoproject.com/en/2.2/howto/legacy-databases/) you are able to do `evennia inspectdb` to get an automated listing of model information for an existing database. As is the case with any model generating tool you should only use this as a starting point for your models. - -## Creating a new model instance - -To create a new row in your table, you instantiate the model and then call its `save()` method: - -```python - from evennia.myapp import MyDataStore - - new_datastore = MyDataStore(db_key="LargeSword", - db_category="weapons", - db_text="This is a huge weapon!") - # this is required to actually create the row in the database! - new_datastore.save() - -``` - -Note that the `db_date_created` field of the model is not specified. Its flag `at_now_add=True` makes sure to set it to the current date when the object is created (it can also not be changed further after creation). - -When you update an existing object with some new field value, remember that you have to save the object afterwards, otherwise the database will not update: - -```python - my_datastore.db_key = "Larger Sword" - my_datastore.save() -``` - -Evennia's normal models don't need to explicitly save, since they are based on `SharedMemoryModel` rather than the raw django model. This is covered in the next section. - -## Using the `SharedMemoryModel` parent - -Evennia doesn't base most of its models on the raw `django.db.models` but on the Evennia base model `evennia.utils.idmapper.models.SharedMemoryModel`. There are two main reasons for this: - -1. Ease of updating fields without having to explicitly call `save()` -2. On-object memory persistence and database caching - -The first (and least important) point means that as long as you named your fields `db_*`, Evennia will automatically create field wrappers for them. This happens in the model's [Metaclass](http://en.wikibooks.org/wiki/Python_Programming/Metaclasses) so there is no speed penalty for this. The name of the wrapper will be the same name as the field, minus the `db_` prefix. So the `db_key` field will have a wrapper property named `key`. You can then do: - -```python - my_datastore.key = "Larger Sword" -``` - -and don't have to explicitly call `save()` afterwards. The saving also happens in a more efficient way under the hood, updating only the field rather than the entire model using django optimizations. Note that if you were to manually add the property or method `key` to your model, this will be used instead of the automatic wrapper and allows you to fully customize access as needed. - -To explain the second and more important point, consider the following example using the default Django model parent: - -```python - shield = MyDataStore.objects.get(db_key="SmallShield") - shield.cracked = True # where cracked is not a database field -``` - -And then later: - -```python - shield = MyDataStore.objects.get(db_key="SmallShield") - print(shield.cracked) # error! -``` - -The outcome of that last print statement is *undefined*! It could *maybe* randomly work but most likely you will get an `AttributeError` for not finding the `cracked` property. The reason is that `cracked` doesn't represent an actual field in the database. It was just added at run-time and thus Django don't care about it. When you retrieve your shield-match later there is *no* guarantee you will get back the *same Python instance* of the model where you defined `cracked`, even if you search for the same database object. - -Evennia relies heavily on on-model handlers and other dynamically created properties. So rather than using the vanilla Django models, Evennia uses `SharedMemoryModel`, which levies something called *idmapper*. The idmapper caches model instances so that we will always get the *same* instance back after the first lookup of a given object. Using idmapper, the above example would work fine and you could retrieve your `cracked` property at any time - until you rebooted when all non-persistent data goes. - -Using the idmapper is both more intuitive and more efficient *per object*; it leads to a lot less reading from disk. The drawback is that this system tends to be more memory hungry *overall*. So if you know that you'll *never* need to add new properties to running instances or know that you will create new objects all the time yet rarely access them again (like for a log system), you are probably better off making "plain" Django models rather than using `SharedMemoryModel` and its idmapper. - -To use the idmapper and the field-wrapper functionality you just have to have your model classes inherit from `evennia.utils.idmapper.models.SharedMemoryModel` instead of from the default `django.db.models.Model`: - -```python -from evennia.utils.idmapper.models import SharedMemoryModel - -class MyDataStore(SharedMemoryModel): - # the rest is the same as before, but db_* is important; these will - # later be settable as .key, .category, .text ... - db_key = models.CharField(max_length=80, db_index=True) - db_category = models.CharField(max_length=80, null=True, blank=True) - db_text = models.TextField(null=True, blank=True) - db_date_created = models.DateTimeField('date created', editable=False, - auto_now_add=True, db_index=True) -``` - -## Searching for your models - -To search your new custom database table you need to use its database *manager* to build a *query*. Note that even if you use `SharedMemoryModel` as described in the previous section, you have to use the actual *field names* in the query, not the wrapper name (so `db_key` and not just `key`). - -```python - from world.myapp import MyDataStore - - # get all datastore objects exactly matching a given key - matches = MyDataStore.objects.filter(db_key="Larger Sword") - # get all datastore objects with a key containing "sword" - # and having the category "weapons" (both ignoring upper/lower case) - matches2 = MyDataStore.objects.filter(db_key__icontains="sword", - db_category__iequals="weapons") - # show the matching data (e.g. inside a command) - for match in matches2: - self.caller.msg(match.db_text) -``` - -See the [Django query documentation](https://docs.djangoproject.com/en/2.2/topics/db/queries/) for a lot more information about querying the database. diff --git a/docs/0.9.1/_sources/OOB.md.txt b/docs/0.9.1/_sources/OOB.md.txt deleted file mode 100644 index ea8f09ca3d..0000000000 --- a/docs/0.9.1/_sources/OOB.md.txt +++ /dev/null @@ -1,114 +0,0 @@ -# OOB - -OOB, or Out-Of-Band, means sending data between Evennia and the user's client without the user prompting it or necessarily being aware that it's being passed. Common uses would be to update client health-bars, handle client button-presses or to display certain tagged text in a different window pane. - -## Briefly on input/outputcommands - -Inside Evennia, all server-client communication happens in the same way (so plain text is also an 'OOB message' as far as Evennia is concerned). The message follows the [Message Path](./Messagepath). You should read up on that if you are unfamiliar with it. As the message travels along the path it has a standardized internal form: a tuple with a string, a tuple and a dict: - - ("cmdname", (args), {kwargs}) - -This is often referred to as an *inputcommand* or *outputcommand*, depending on the direction it's traveling. The end point for an inputcommand, (the 'Evennia-end' of the message path) is a matching [Inputfunc](./Inputfuncs). This function is called as `cmdname(session, *args, **kwargs)` where `session` is the Session-source of the command. Inputfuncs can easily be added by the developer to support/map client commands to actions inside Evennia (see the [inputfunc](./Inputfuncs) page for more details). - -When a message is outgoing (at the 'Client-end' of the message path) the outputcommand is handled by a matching *Outputfunc*. This is responsible for converting the internal Evennia representation to a form suitable to send over the wire to the Client. Outputfuncs are hard-coded. Which is chosen and how it processes the outgoing data depends on the nature of the client it's connected to. The only time one would want to add new outputfuncs is as part of developing support for a new Evennia [Protocol](./Custom-Protocols). - -## Sending and receiving an OOB message - -Sending is simple. You just use the normal `msg` method of the object whose session you want to send to. For example in a Command: - -```python - caller.msg(cmdname=((args, ...), {key:value, ...})) -``` - -A special case is the `text` input/outputfunc. It's so common that it's the default of the `msg` method. So these are equivalent: - -```python - caller.msg("Hello") - caller.msg(text="Hello") -``` - -You don't have to specify the full output/input definition. So for example, if your particular command only needs kwargs, you can skip the `(args)` part. Like in the `text` case you can skip writing the tuple if there is only one arg ... and so on - the input is pretty flexible. If there are no args at all you need to give the empty tuple `msg(cmdname=(,)` (giving `None` would mean a single argument `None`). - -Which commands you can send depends on the client. If the client does not support an explicit OOB protocol (like many old/legacy MUD clients) Evennia can only send `text` to them and will quietly drop any other types of outputfuncs. - -> Remember that a given message may go to multiple clients with different capabilities. So unless you turn off telnet completely and only rely on the webclient, you should never rely on non-`text` OOB messages always reaching all targets. - -[Inputfuncs](./Inputfuncs) lists the default inputfuncs available to handle incoming OOB messages. To accept more you need to add more inputfuncs (see that page for more info). - -## Supported OOB protocols - -Evennia supports clients using one of the following protocols: - -### Telnet - -By default telnet (and telnet+SSL) supports only the plain `text` outputcommand. Evennia however detects if the Client supports one of two MUD-specific OOB *extensions* to the standard telnet protocol - GMCP or MSDP. Evennia supports both simultaneously and will switch to the protocol the client uses. If the client supports both, GMCP will be used. - -> Note that for Telnet, `text` has a special status as the "in-band" operation. So the `text` outputcommand sends the `text` argument directly over the wire, without going through the OOB translations described below. - -#### Telnet + GMCP - -[GMCP](http://www.gammon.com.au/gmcp), the *Generic Mud Communication Protocol* sends data on the form `cmdname + JSONdata`. Here the cmdname is expected to be on the form "Package.Subpackage". There could also be additional Sub-sub packages etc. The names of these 'packages' and 'subpackages' are not that well standardized beyond what individual MUDs or companies have chosen to go with over the years. You can decide on your own package names, but here are what others are using: - -- [Aardwolf GMCP](http://www.aardwolf.com/wiki/index.php/Clients/GMCP) -- [Discworld GMCP](http://discworld.starturtle.net/lpc/playing/documentation.c?path=/concepts/gmcp) -- [Avatar GMCP](http://www.outland.org/infusions/wiclear/index.php?title=MUD%20Protocols&lang=en) -- [IRE games GMCP](http://nexus.ironrealms.com/GMCP) - -Evennia will translate underscores to `.` and capitalize to fit the specification. So the outputcommand `foo_bar` will become a GMCP command-name `Foo.Bar`. A GMCP command "Foo.Bar" will be come `foo_bar`. To send a GMCP command that turns into an Evennia inputcommand without an underscore, use the `Core` package. So `Core.Cmdname` becomes just `cmdname` in Evennia and vice versa. - -On the wire, a GMCP instruction for `("cmdname", ("arg",), {})` will look like this: - - IAC SB GMCP "cmdname" "arg" IAC SE - -where all the capitalized words are telnet character constants specified in `evennia/server/portal/telnet_oob.py`. These are parsed/added by the protocol and we don't include these in the listings below. - -Input/Outputfunc | GMCP-Command ------------------- -`[cmd_name, [], {}]` | Cmd.Name -`[cmd_name, [arg], {}]` | Cmd.Name arg -`[cmd_na_me, [args],{}]` | Cmd.Na.Me [args] -`[cmd_name, [], {kwargs}]` | Cmd.Name {kwargs} -`[cmdname, [args, {kwargs}]` | Core.Cmdname [[args],{kwargs}] - -Since Evennia already supplies default inputfuncs that don't match the names expected by the most common GMCP implementations we have a few hard-coded mappings for those: - -GMCP command name | Input/Outputfunc name ------------------ -"Core.Hello" | "client_options" -"Core.Supports.Get" | "client_options" -"Core.Commands.Get" | "get_inputfuncs" -"Char.Value.Get" | "get_value" -"Char.Repeat.Update" | "repeat" -"Char.Monitor.Update" | "monitor" - -#### Telnet + MSDP - -[MSDP](http://tintin.sourceforge.net/msdp/), the *Mud Server Data Protocol*, is a competing standard to GMCP. The MSDP protocol page specifies a range of "recommended" available MSDP command names. Evennia does *not* support those - since MSDP doesn't specify a special format for its command names (like GMCP does) the client can and should just call the internal Evennia inputfunc by its actual name. - -MSDP uses Telnet character constants to package various structured data over the wire. MSDP supports strings, arrays (lists) and tables (dicts). These are used to define the cmdname, args and kwargs needed. When sending MSDP for `("cmdname", ("arg",), {})` the resulting MSDP instruction will look like this: - - IAC SB MSDP VAR cmdname VAL arg IAC SE - -The various available MSDP constants like `VAR` (variable), `VAL` (value), `ARRAYOPEN`/`ARRAYCLOSE` and `TABLEOPEN`/`TABLECLOSE` are specified in `evennia/server/portal/telnet_oob`. - -Outputfunc/Inputfunc | MSDP instruction -------------------------- -`[cmdname, [], {}]` | VAR cmdname VAL -`[cmdname, [arg], {}]` | VAR cmdname VAL arg -`[cmdname, [args],{}]` | VAR cmdname VAL ARRAYOPEN VAL arg VAL arg ... ARRAYCLOSE -`[cmdname, [], {kwargs}]` | VAR cmdname VAL TABLEOPEN VAR key VAL val ... TABLECLOSE -`[cmdname, [args], {kwargs}]` | VAR cmdname VAL ARRAYOPEN VAL arg VAL arg ... ARRAYCLOSE VAR cmdname VAL TABLEOPEN VAR key VAL val ... TABLECLOSE - -Observe that `VAR ... VAL` always identifies cmdnames, so if there are multiple arrays/dicts tagged with the same cmdname they will be appended to the args, kwargs of that inputfunc. Vice-versa, a different `VAR ... VAL` (outside a table) will come out as a second, different command input. - -### SSH - -SSH only supports the `text` input/outputcommand. - -### Web client - -Our web client uses pure JSON structures for all its communication, including `text`. This maps directly to the Evennia internal output/inputcommand, including eventual empty args/kwargs. So the same example `("cmdname", ("arg",), {})` will be sent/received as a valid JSON structure - - ["cmdname, ["arg"], {}] - -Since JSON is native to Javascript, this becomes very easy for the webclient to handle. diff --git a/docs/0.9.1/_sources/Objects.md.txt b/docs/0.9.1/_sources/Objects.md.txt deleted file mode 100644 index e7d24a3f44..0000000000 --- a/docs/0.9.1/_sources/Objects.md.txt +++ /dev/null @@ -1,117 +0,0 @@ -# Objects - - -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) entities. - -## How to create your own object types - -An Evennia Object is, per definition, a Python class that includes `evennia.DefaultObject` among its parents. In `mygame/typeclasses/objects.py` there is already a class `Object` that inherits from `DefaultObject` and that you can inherit from. You can put your new typeclass directly in that module or you could organize your code in some other way. Here we assume we make a new module `mygame/typeclasses/flowers.py`: - -```python - # mygame/typeclasses/flowers.py - - from typeclasses.objects import Object - - class Rose(Object): - """ - This creates a simple rose object - """ - def at_object_creation(self): - "this is called only once, when object is first created" - # add a persistent attribute 'desc' - # to object (silly example). - self.db.desc = "This is a pretty rose with thorns." -``` - -You could save this in the `mygame/typeclasses/objects.py` (then you'd not need to import `Object`) or you can put it in a new module. Let's say we do the latter, making a module `typeclasses/flowers.py`. Now you just need to point to the class *Rose* with the `@create` command to make a new rose: - - @create/drop MyRose:flowers.Rose - -What the `@create` command actually *does* is to use `evennia.create_object`. You can do the same thing yourself in code: - -```python - from evennia import 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). Check out the `ev.create_*` functions for how to build other entities like [Scripts](./Scripts)). - -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](./Spawner-and-Prototypes)). The `Object` typeclass offers many more hooks that is available to use though - see next section. - -## Properties and functions on Objects - -Beyond the properties assigned to all [typeclassed](./Typeclasses) objects (see that page for a list 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#Exits), it's otherwise usually unset. -- `nicks` - as opposed to aliases, a [Nick](./Nicks) 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) 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: - -- `cmdset` - this is a handler that stores all [command sets](./Commands#Command_Sets) defined on the object (if any). -- `scripts` - this is a handler that manages [Scripts](./Scripts) attached to the object (if any). - -The Object also has a host of useful utility functions. See the function headers in `src/objects/objects.py` for their arguments and more details. - -- `msg()` - this function is used to send messages from the server to an account connected to this object. -- `msg_contents()` - calls `msg` on all objects inside this object. -- `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#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()`. - -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](api:evennia.objects.objects#defaultobject). - -## Subclasses of `Object` - -There are three special subclasses of *Object* in default Evennia - *Characters*, *Rooms* and *Exits*. The reason they are separated is because these particular object types are fundamental, something you will always need and in some cases requires some extra attention in order to be recognized by the game engine (there is nothing stopping you from redefining them though). In practice they are all pretty similar to the base Object. - -### Characters - -Characters are objects controlled by [Accounts](./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. A `Character` object -must have a [Default Commandset](./Commands#Command_Sets) set on itself at -creation, or the account will not be able to issue any commands! If you just -inherit your own class from `evennia.DefaultCharacter` and make sure to use -`super()` to call the parent methods you should be fine. In -`mygame/typeclasses/characters.py` is an empty `Character` class ready for you -to modify. - -### Rooms - -*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 `ev.DefaultRoom`. In `mygame/typeclasses/rooms.py` is an empty `Room` class ready for you to modify. - -### 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) 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) 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. In `mygame/typeclasses/exits.py` there is an empty `Exit` class for you to modify. - -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) 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_before_move(destination)` - if this returns False, move is aborted. - 1. `origin.at_before_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_after_move(source)` -1. On the Exit object, `at_after_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. diff --git a/docs/0.9.1/_sources/Online-Setup.md.txt b/docs/0.9.1/_sources/Online-Setup.md.txt deleted file mode 100644 index 579f7ea55a..0000000000 --- a/docs/0.9.1/_sources/Online-Setup.md.txt +++ /dev/null @@ -1,277 +0,0 @@ -# Online Setup - - -Evennia development can be made without any Internet connection beyond fetching updates. At some point however, you are likely to want to make your game visible online, either as part opening it to the public or to allow other developers or beta testers access to it. - -## Connecting from the outside - -Accessing your Evennia server from the outside is not hard on its own. Any issues are usually due to the various security measures your computer, network or hosting service has. These will generally (and correctly) block outside access to servers on your machine unless you tell them otherwise. - -We will start by showing how to host your server on your own local computer. Even if you plan to host your "real" game on a remote host later, setting it up locally is useful practice. We cover remote hosting later in this document. - -Out of the box, Evennia uses three ports for outward communication. If your computer has a firewall, these should be open for in/out communication (and only these, other ports used by Evennia are internal to your computer only). - - `4000`, telnet, for traditional mud clients - - `4001`, HTTP for the website) - - `4002`, websocket, for the web client - -Evennia will by default accept incoming connections on all interfaces (`0.0.0.0`) so in principle anyone knowing the ports to use and has the IP address to your machine should be able to connect to your game. - - - Make sure Evennia is installed and that you have activated the virtualenv. Start the server with `evennia start --log`. The `--log` (or `-l`) will make sure that the logs are echoed to the terminal. -> Note: If you need to close the log-view, use `Ctrl-C`. Use just `evennia --log` on its own to start tailing the logs again. - - Make sure you can connect with your web browser to `http://localhost:4001` or, alternatively, `http:127.0.0.1:4001` which is the same thing. You should get your Evennia web site and be able to play the game in the web client. Also check so that you can connect with a mud client to host `localhost`, port `4000` or host `127.0.0.1`, port `4000`. -- [Google for "my ip"](https://www.google.se/search?q=my+ip) or use any online service to figure out what your "outward-facing" IP address is. For our purposes, let's say your outward-facing IP is `203.0.113.0`. - - Next try your outward-facing IP by opening `http://203.0.113.0:4001` in a browser. If this works, that's it! Also try telnet, with the server set to `203.0.113.0` and port `4000`. However, most likely it will *not* work. If so, read on. - - If your computer has a firewall, it may be blocking the ports we need (it may also block telnet overall). If so, you need to open the outward-facing ports to in/out communication. See the manual/instructions for your firewall software on how to do this. To test you could also temporarily turn off your firewall entirely to see if that was indeed the problem. - - Another common problem for not being able to connect is that you are using a hardware router (like a wifi router). The router sits 'between' your computer and the Internet. So the IP you find with Google is the *router's* IP, not that of your computer. To resolve this you need to configure your router to *forward* data it gets on its ports to the IP and ports of your computer sitting in your private network. How to do this depends on the make of your router; you usually configure it using a normal web browser. In the router interface, look for "Port forwarding" or maybe "Virtual server". If that doesn't work, try to temporarily wire your computer directly to the Internet outlet (assuming your computer has the ports for it). You'll need to check for your IP again. If that works, you know the problem is the router. - -> Note: If you need to reconfigure a router, the router's Internet-facing ports do *not* have to have to have the same numbers as your computer's (and Evennia's) ports! For example, you might want to connect Evennia's outgoing port 4001 to an outgoing router port 80 - this is the port HTTP requests use and web browsers automatically look for - if you do that you could go to `http://203.0.113.0` without having to add the port at the end. This would collide with any other web services you are running through this router though. - -### Settings example - -You can connect Evennia to the Internet without any changes to your settings. The default settings are easy to use but are not necessarily the safest. You can customize your online presence in your [settings file](./Server-Conf#settings-file). To have Evennia recognize changed port settings you have to do a full `evennia reboot` to also restart the Portal and not just the Server component. - -Below is an example of a simple set of settings, mostly using the defaults. Evennia will require access to five computer ports, of which three (only) should be open to the outside world. Below we continue to assume that our server address is `203.0.113.0`. - -```python -# in mygame/server/conf/settings.py - -SERVERNAME = "MyGame" - -# open to the internet: 4000, 4001, 4002 -# closed to the internet (internal use): 4005, 4006 -TELNET_PORTS = [4000] -WEBSOCKET_CLIENT_PORT = 4002 -WEBSERVER_PORTS = [(4001, 4005)] -AMP_PORT = 4006 - -# Optional - security measures limiting interface access -# (don't set these before you know things work without them) -TELNET_INTERFACES = ['203.0.113.0'] -WEBSOCKET_CLIENT_INTERFACE = '203.0.113.0' -ALLOWED_HOSTS = [".mymudgame.com"] - -# uncomment if you want to lock the server down for maintenance. -# LOCKDOWN_MODE = True - -``` - -Read on for a description of the individual settings. - -### Telnet - -```python -# Required. Change to whichever outgoing Telnet port(s) -# you are allowed to use on your host. -TELNET_PORTS = [4000] -# Optional for security. Restrict which telnet -# interfaces we should accept. Should be set to your -# outward-facing IP address(es). Default is ´0.0.0.0´ -# which accepts all interfaces. -TELNET_INTERFACES = ['0.0.0.0'] -``` - -The `TELNET_*` settings are the most important ones for getting a traditional base game going. Which IP addresses you have available depends on your server hosting solution (see the next sections). Some hosts will restrict which ports you are allowed you use so make sure to check. - -### Web server - -```python -# Required. This is a list of tuples -# (outgoing_port, internal_port). Only the outgoing -# port should be open to the world! -# set outgoing port to 80 if you want to run Evennia -# as the only web server on your machine (if available). -WEBSERVER_PORTS = [(4001, 4005)] -# Optional for security. Change this to the IP your -# server can be reached at (normally the same -# as TELNET_INTERFACES) -WEBSERVER_INTERFACES = ['0.0.0.0'] -# Optional for security. Protects against -# man-in-the-middle attacks. Change it to your server's -# IP address or URL when you run a production server. -ALLOWED_HOSTS = ['*'] -``` - -The web server is always configured with two ports at a time. The *outgoing* port (`4001` by default) is the port external connections can use. If you don't want users to have to specify the port when they connect, you should set this to `80` - this however only works if you are not running any other web server on the machine. -The *internal* port (`4005` by default) is used internally by Evennia to communicate between the Server and the Portal. It should not be available to the outside world. You usually only need to change the outgoing port unless the default internal port is clashing with some other program. - -### Web client - -```python -# Required. Change this to the main IP address of your server. -WEBSOCKET_CLIENT_INTERFACE = '0.0.0.0' -# Optional and needed only if using a proxy or similar. Change -# to the IP or address where the client can reach -# your server. The ws:// part is then required. If not given, the client -# will use its host location. -WEBSOCKET_CLIENT_URL = "" -# Required. Change to a free port for the websocket client to reach -# the server on. This will be automatically appended -# to WEBSOCKET_CLIENT_URL by the web client. -WEBSOCKET_CLIENT_PORT = 4002 -``` - -The websocket-based web client needs to be able to call back to the server, and these settings must be changed for it to find where to look. If it cannot find the server you will get an warning in your browser's Console (in the dev tools of the browser), and the client will revert to the AJAX-based of the client instead, which tends to be slower. - -### Other ports - -```python -# Optional public facing. Only allows SSL connections (off by default). -SSL_PORTS = [4003] -SSL_INTERFACES = ['0.0.0.0'] -# Optional public facing. Only if you allow SSH connections (off by default). -SSH_PORTS = [4004] -SSH_INTERFACES = ['0.0.0.0'] -# Required private. You should only change this if there is a clash -# with other services on your host. Should NOT be open to the -# outside world. -AMP_PORT = 4006 -``` - -The `AMP_PORT` is required to work, since this is the internal port linking Evennia's [Server and Portal](./Portal-And-Server) components together. The other ports are encrypted ports that may be useful for custom protocols but are otherwise not used. - -### Lockdown mode - -When you test things out and check configurations you may not want players to drop in on you. Similarly, if you are doing maintenance on a live game you may want to take it offline for a while to fix eventual problems without risking people connecting. To do this, stop the server with `evennia stop` and add `LOCKDOWN_MODE = True` to your settings file. When you start the server again, your game will only be accessible from localhost. - -### Registering with the Evennia game directory - -Once your game is online you should make sure to register it with the [Evennia Game Index](http://games.evennia.com/). Registering with the index will help people find your server, drum up interest for your game and also shows people that Evennia is being used. You can do this even if you are just starting development - if you don't give any telnet/web address it will appear as _Not yet public_ and just be a teaser. If so, pick _pre-alpha_ as the development status. - -To register, stand in your game dir, run - - evennia connections - -and follow the instructions. See the [Game index page](./Evennia-Game-Index) for more details. - -## SSL - -SSL can be very useful for web clients. It will protect the credentials and gameplay of your users over a web client if they are in a public place, and your websocket can also be switched to WSS for the same benefit. SSL certificates used to cost money on a yearly basis, but there is now a program that issues them for free with assisted setup to make the entire process less painful. - -Options that may be useful in combination with an SSL proxy: - -``` -# See above for the section on Lockdown Mode. -# Useful for a proxy on the public interface connecting to Evennia on localhost. -LOCKDOWN_MODE = True - -# Have clients communicate via wss after connecting with https to port 4001. -# Without this, you may get DOMException errors when the browser tries -# to create an insecure websocket from a secure webpage. -WEBSOCKET_CLIENT_URL = "wss://fqdn:4002" -``` - -### Let's Encrypt - -[Let's Encrypt](https://letsencrypt.org) is a certificate authority offering free certificates to secure a website with HTTPS. To get started issuing a certificate for your web server using Let's Encrypt, see these links: - - - [Let's Encrypt - Getting Started](https://letsencrypt.org/getting-started/) - - The [CertBot Client](https://certbot.eff.org/) is a program for automatically obtaining a certificate, use it and maintain it with your website. - -Also, on Freenode visit the #letsencrypt channel for assistance from the community. For an additional resource, Let's Encrypt has a very active [community forum](https://community.letsencrypt.org/). - -[A blog where someone sets up Let's Encrypt](https://www.digitalocean.com/community/tutorials/how-to-secure-apache-with-let-s-encrypt-on-ubuntu-16-04) - -The only process missing from all of the above documentation is how to pass verification. This is how Let's Encrypt verifies that you have control over your domain (not necessarily ownership, it's Domain Validation (DV)). This can be done either with configuring a certain path on your web server or through a TXT record in your DNS. Which one you will want to do is a personal preference, but can also be based on your hosting choice. In a controlled/cPanel environment, you will most likely have to use DNS verification. - -## Relevant SSL Proxy Setup Information -- [Apache webserver configuration](./Apache-Config) (optional) -- [HAProxy Config](HAProxy-Config-(Optional)) - -## Hosting locally or remotely? - -### Using your own computer as a server - -What we showed above is by far the simplest and probably cheapest option: Run Evennia on your own home computer. Moreover, since Evennia is its own web server, you don't need to install anything extra to have a website. - -**Advantages** -- Free (except for internet costs and the electrical bill). -- Full control over the server and hardware (it sits right there!). -- Easy to set up. -- Suitable for quick setups - e.g. to briefly show off results to your collaborators. - -**Disadvantages** -- You need a good internet connection, ideally without any upload/download limits/costs. -- If you want to run a full game this way, your computer needs to always be on. It could be noisy, and as mentioned, the electrical bill must be considered. -- No support or safety - if your house burns down, so will your game. Also, you are yourself responsible for doing regular backups. -- Potentially not as easy if you don't know how to open ports in your firewall or router. -- Home IP numbers are often dynamically allocated, so for permanent online time you need to set up a DNS to always re-point to the right place (see below). -- You are personally responsible for any use/misuse of your internet connection-- though unlikely (but not impossible) if running your server somehow causes issues for other customers on the network, goes against your ISP's terms of service (many ISPs insist on upselling you to a business-tier connection) or you are the subject of legal action by a copyright holder, you may find your main internet connection terminated as a consequence. - -#### Setting up your own machine as a server - -[The first section](./Online-Setup#connecting-from-the-outside) of this page describes how to do this and allow users to connect to the IP address of your machine/router. - -A complication with using a specific IP address like this is that your home IP might not remain the same. Many ISPs (Internet Service Providers) allocates a *dynamic* IP to you which could change at any time. When that happens, that IP you told people to go to will be worthless. Also, that long string of numbers is not very pretty, is it? It's hard to remember and not easy to use in marketing your game. What you need is to alias it to a more sensible domain name - an alias that follows you around also when the IP changes. - -1. To set up a domain name alias, we recommend starting with a free domain name from [FreeDNS](http://freedns.afraid.org/). Once you register there (it's free) you have access to tens of thousands domain names that people have "donated" to allow you to use for your own sub domain. For example, `strangled.net` is one of those available domains. So tying our IP address to `strangled.net` using the subdomain `evennia` would mean that one could henceforth direct people to `http://evennia.strangled.net:4001` for their gaming needs - far easier to remember! -1. So how do we make this new, nice domain name follow us also if our IP changes? For this we need to set up a little program on our computer. It will check whenever our ISP decides to change our IP and tell FreeDNS that. There are many alternatives to be found from FreeDNS:s homepage, one that works on multiple platforms is [inadyn](http://www.inatech.eu/inadyn/). Get it from their page or, in Linux, through something like `apt-get install inadyn`. -1. Next, you login to your account on FreeDNS and go to the [Dynamic](http://freedns.afraid.org/dynamic/) page. You should have a list of your subdomains. Click the `Direct URL` link and you'll get a page with a text message. Ignore that and look at the URL of the page. It should be ending in a lot of random letters. Everything after the question mark is your unique "hash". Copy this string. -1. You now start inadyn with the following command (Linux): - - `inadyn --dyndns_system default@freedns.afraid.org -a , &` - - where `` would be `evennia.strangled.net` and `` the string of numbers we copied from FreeDNS. The `&` means we run in the background (might not be valid in other operating systems). `inadyn` will henceforth check for changes every 60 seconds. You should put the `inadyn` command string in a startup script somewhere so it kicks into gear whenever your computer starts. - -### Remote hosting - -Your normal "web hotel" will probably not be enough to run Evennia. A web hotel is normally aimed at a very specific usage - delivering web pages, at the most with some dynamic content. The "Python scripts" they refer to on their home pages are usually only intended to be CGI-like scripts launched by their webserver. Even if they allow you shell access (so you can install the Evennia dependencies in the first place), resource usage will likely be very restricted. Running a full-fledged game server like Evennia will probably be shunned upon or be outright impossible. If you are unsure, contact your web hotel and ask about their policy on you running third-party servers that will want to open custom ports. - -The options you probably need to look for are *shell account services*, *VPS:es* or *Cloud services*. A "Shell account" service means that you get a shell account on a server and can log in like any normal user. By contrast, a *VPS* (Virtual Private Server) service usually means that you get `root` access, but in a virtual machine. There are also *Cloud*-type services which allows for starting up multiple virtual machines and pay for what resources you use. - -**Advantages** -- Shell accounts/VPS/clouds offer more flexibility than your average web hotel - it's the ability to log onto a shared computer away from home. -- Usually runs a Linux flavor, making it easy to install Evennia. -- Support. You don't need to maintain the server hardware. If your house burns down, at least your game stays online. Many services guarantee a certain level of up-time and also do regular backups for you. Make sure to check, some offer lower rates in exchange for you yourself being fully responsible for your data/backups. -- Usually offers a fixed domain name, so no need to mess with IP addresses. -- May have the ability to easily deploy [docker](./Running-Evennia-in-Docker) versions of evennia and/or your game. - -**Disadvantages** -- Might be pretty expensive (more so than a web hotel). Note that Evennia will normally need at least 100MB RAM and likely much more for a large production game. -- Linux flavors might feel unfamiliar to users not used to ssh/PuTTy and the Linux command line. -- You are probably sharing the server with many others, so you are not completely in charge. CPU usage might be limited. Also, if the server people decides to take the server down for maintenance, you have no choice but to sit it out (but you'll hopefully be warned ahead of time). - -#### Installing Evennia on a remote server - -Firstly, if you are familiar with server infrastructure, consider using [Docker](./Running-Evennia-in-Docker) to deploy your game to the remote server; it will likely ease installation and deployment. Docker images may be a little confusing if you are completely new to them though. - -If not using docker, and assuming you know how to connect to your account over ssh/PuTTy, you should be able to follow the [Getting Started](./Getting-Started) instructions normally. You only need Python and GIT pre-installed; these should both be available on any servers (if not you should be able to easily ask for them to be installed). On a VPS or Cloud service you can install them yourself as needed. - -If `virtualenv` is not available and you can't get it, you can download it (it's just a single file) from [the virtualenv pypi](https://pypi.python.org/pypi/virtualenv). Using `virtualenv` you can install everything without actually needing to have further `root` access. Ports might be an issue, so make sure you know which ports are available to use and reconfigure Evennia accordingly. - -### Hosting options - -To find commercial solutions, browse the web for "shell access", "VPS" or "Cloud services" in your region. You may find useful offers for "low cost" VPS hosting on [Low End Box][7]. The associated [Low End Talk][8] forum can be useful for health checking the many small businesses that offer "value" hosting, and occasionally for technical suggestions. - -There are all sorts of services available. Below are some international suggestions offered by Evennia users: - -Hosting name | Type | Lowest price | Comments -:--------------:|:-------:--------------- -[silvren.com][1] | Shell account | Free for MU* | Private hobby provider so don't assume backups or expect immediate support. To ask for an account, connect with a MUD client to iweb.localecho.net, port 4201 and ask for "Jarin". -[Digital Ocean][2] | VPS | $5/month | You can get a $50 credit if you use the referral link https://m.do.co/c/8f64fec2670c - if you do, once you've had it long enough to have paid $25 we will get that as a referral bonus to help Evennia development. -[Amazon Web services][3] | Cloud | ~$5/month / on-demand | Free Tier first 12 months. Regions available around the globe. -[Amazon Lightsail][9] | Cloud | $5/month | Free first month. AWS's new "fixed cost" offering. -[Genesis MUD hosting][4] | Shell account | $8/month | Dedicated MUD host with very limited memory offerings. As for 2017, runs a 13 years old Python version (2.4) so you'd need to either convince them to update or compile yourself. Note that Evennia needs *at least* the "Deluxe" package (50MB RAM) and probably *a lot* higher for a production game. This host is *not* recommended for Evennia. -[Host1Plus][5] | VPS & Cloud | $4/month | $4-$8/month depending on length of sign-up period. -[Scaleway][6] | Cloud | €3/month / on-demand | EU based (Paris, Amsterdam). Smallest option provides 2GB RAM. -[Prgmr][10] | VPS | $5/month | 1 month free with a year prepay. You likely want some experience with servers with this option as they don't have a lot of support. -[Linode][11] | Cloud | $5/month / on-demand | Multiple regions. Smallest option provides 1GB RAM -*Please help us expand this list.* - -[1]: http:silvren.com -[2]: https://www.digitalocean.com/pricing -[3]: https://aws.amazon.com/pricing/ -[4]: http://www.genesismuds.com/ -[5]: https://www.host1plus.com/ -[6]: https://www.scaleway.com/ -[7]: https://lowendbox.com/ -[8]: https://www.lowendtalk.com -[9]: https://amazonlightsail.com -[10]: https://prgmr.com/ -[11]: https://www.linode.com/ - -## Cloud9 - -If you are interested in running Evennia in the online dev environment [Cloud9](https://c9.io/), you can spin it up through their normal online setup using the Evennia Linux install instructions. The one extra thing you will have to do is update `mygame/server/conf/settings.py` and add `WEBSERVER_PORTS = [(8080, 4001)]`. This will then let you access the web server and do everything else as normal. - -Note that, as of December 2017, Cloud9 was re-released by Amazon as a service within their AWS cloud service offering. New customers entitled to the 1 year AWS "free tier" may find it provides sufficient resources to operate a Cloud9 development environment without charge. https://aws.amazon.com/cloud9/ - diff --git a/docs/0.9.1/_sources/Profiling.md.txt b/docs/0.9.1/_sources/Profiling.md.txt deleted file mode 100644 index 88f9672b6f..0000000000 --- a/docs/0.9.1/_sources/Profiling.md.txt +++ /dev/null @@ -1,84 +0,0 @@ -# Profiling - -*This is considered an advanced topic mainly of interest to server developers.* - -## Introduction - -Sometimes it can be useful to try to determine just how efficient a particular piece of code is, or -to figure out if one could speed up things more than they are. There are many ways to test the -performance of Python and the running server. - -Before digging into this section, remember Donald Knuth's [words of wisdom](https://en.wikipedia.org/wiki/Program_optimization#When_to_optimize): - -> *[...]about 97% of the time: Premature optimization is the root of all evil*. - -That is, don't start to try to optimize your code until you have actually identified a need to do -so. This means your code must actually be working before you start to consider optimization. -Optimization will also often make your code more complex and harder to read. Consider readability -and maintainability and you may find that a small gain in speed is just not worth it. - -## Simple timer tests - -Python's `timeit` module is very good for testing small things. For example, in order to test if it is faster to use a `for` loop or a list comprehension you could use the following code: - -```python - import timeit - # Time to do 1000000 for loops - timeit.timeit("for i in range(100):\n a.append(i)", setup="a = []") - <<< 10.70982813835144 - # Time to do 1000000 list comprehensions - timeit.timeit("a = [i for i in range(100)]") - <<< 5.358283996582031 -``` - -The `setup` keyword is used to set up things that should not be included in the time measurement, like `a = []` in the first call. - -By default the `timeit` function will re-run the given test 1000000 times and returns the *total time* to do so (so *not* the average per test). A hint is to not use this default for testing something that includes database writes - for that you may want to use a lower number of repeats (say 100 or 1000) using the `number=100` keyword. - -## Using cProfile - -Python comes with its own profiler, named cProfile (this is for cPython, no tests have been done with `pypy` at this point). Due to the way Evennia's processes are handled, there is no point in using the normal way to start the profiler (`python -m cProfile evennia.py`). Instead you start the profiler through the launcher: - - evennia --profiler start - -This will start Evennia with the Server component running (in daemon mode) under cProfile. You could instead try `--profile` with the `portal` argument to profile the Portal (you would then need to [start the Server separately](./Start-Stop-Reload)). - -Please note that while the profiler is running, your process will use a lot more memory than usual. Memory usage is even likely to climb over time. So don't leave it running perpetually but monitor it carefully (for example using the `top` command on Linux or the Task Manager's memory display on Windows). - -Once you have run the server for a while, you need to stop it so the profiler can give its report. Do *not* kill the program from your task manager or by sending it a kill signal - this will most likely also mess with the profiler. Instead either use `evennia.py stop` or (which may be even better), use `@shutdown` from inside the game. - -Once the server has fully shut down (this may be a lot slower than usual) you will find that profiler has created a new file `mygame/server/logs/server.prof`. - -## Analyzing the profile - -The `server.prof` file is a binary file. There are many ways to analyze and display its contents, all of which has only been tested in Linux (If you are a Windows/Mac user, let us know what works). - -We recommend the -[Runsnake](http://www.vrplumber.com/programming/runsnakerun/) visualizer to see the processor usage of different processes in a graphical form. For more detailed listing of usage time, you can use [KCachegrind](http://kcachegrind.sourceforge.net/html/Home.html). To make KCachegrind work with Python profiles you also need the wrapper script [pyprof2calltree](https://pypi.python.org/pypi/pyprof2calltree/). You can get pyprof2calltree via `pip` whereas KCacheGrind is something you need to get via your package manager or their homepage. - -How to analyze and interpret profiling data is not a trivial issue and depends on what you are profiling for. Evennia being an asynchronous server can also confuse profiling. Ask on the mailing list if you need help and be ready to be able to supply your `server.prof` file for comparison, along with the exact conditions under which it was obtained. - -## The Dummyrunner - -It is difficult to test "actual" game performance without having players in your game. For this reason Evennia comes with the *Dummyrunner* system. The Dummyrunner is a stress-testing system: a separate program that logs into your game with simulated players (aka "bots" or "dummies"). Once connected these dummies will semi-randomly perform various tasks from a list of possible actions. Use `Ctrl-C` to stop the Dummyrunner. - -> Warning: You should not run the Dummyrunner on a production database. It will spawn many objects and also needs to run with general permissions. - -To launch the Dummyrunner, first start your server normally (with or without profiling, as above). Then start a new terminal/console window and active your virtualenv there too. In the new terminal, try to connect 10 dummy players: - - evennia --dummyrunner 10 - -The first time you do this you will most likely get a warning from Dummyrunner. It will tell you to copy an import string to the end of your settings file. Quit the Dummyrunner (`Ctrl-C`) and follow the instructions. Restart Evennia and try `evennia --dummyrunner 10` again. Make sure to remove that extra settings line when running a public server. - -The actions perform by the dummies is controlled by a settings file. The default Dummyrunner settings file is `evennia/server/server/profiling/dummyrunner_settings.py` but you shouldn't modify this directly. Rather create/copy the default file to `mygame/server/conf/` and modify it there. To make sure to use your file over the default, add the following line to your settings file: - -```python -DUMMYRUNNER_SETTINGS_MODULE = "server/conf/dummyrunner_settings.py" -``` - -> Hint: Don't start with too many dummies. The Dummyrunner defaults to taxing the server much more intensely than an equal number of human players. A good dummy number to start with is 10-100. - -Once you have the dummyrunner running, stop it with `Ctrl-C`. - -Generally, the dummyrunner system makes for a decent test of general performance; but it is of -course hard to actually mimic human user behavior. For this, actual real-game testing is required. diff --git a/docs/0.9.1/_sources/Python-basic-introduction.md.txt b/docs/0.9.1/_sources/Python-basic-introduction.md.txt deleted file mode 100644 index 1a82f015ae..0000000000 --- a/docs/0.9.1/_sources/Python-basic-introduction.md.txt +++ /dev/null @@ -1,173 +0,0 @@ -# Python basic introduction - -This is the first part of our beginner's guide to the basics of using Python with Evennia. It's aimed at you with limited or no programming/Python experience. But also if you are an experienced programmer new to Evennia or Python you might still pick up a thing or two. It is by necessity brief and low on detail. There are countless Python guides and tutorials, books and videos out there for learning more in-depth - use them! - -**Contents:** -- [Evennia Hello world](./Python-basic-introduction#evennia-hello-world) -- [Importing modules](./Python-basic-introduction#importing-modules) -- [Parsing Python errors](./Python-basic-introduction#parsing-python-errors) -- [Our first function](./Python-basic-introduction#our-first-function) -- [Looking at the log](./Python-basic-introduction#looking-at-the-log) -- (continued in [part 2](./Python-basic-tutorial-part-two)) - -This quickstart assumes you have [gotten Evennia started](./Getting-Started). You should make sure that you are able to see the output from the server in the console from which you started it. Log into the game either with a mud client on `localhost:4000` or by pointing a web browser to `localhost:4001/webclient`. Log in as your superuser (the user you created during install). - -Below, lines starting with a single `>` means command input. - -### Evennia Hello world - -The `py` (or `!` which is an alias) command allows you as a superuser to run raw Python from in-game. From the game's input line, enter the following: - - > py print("Hello World!") - -You will see - - > print("Hello world!") - Hello World - -To understand what is going on: some extra info: The `print(...)` *function* is the basic, in-built way to output text in Python. The quotes `"..."` means you are inputing a *string* (i.e. text). You could also have used single-quotes `'...'`, Python accepts both. - -The first return line (with `>>>`) is just `py` echoing what you input (we won't include that in the examples henceforth). - -> Note: You may sometimes see people/docs refer to `@py` or other commands starting with `@`. Evennia ignores `@` by default, so `@py` is the exact same thing as `py`. - -The `print` command is a standard Python structure. We can use that here in the `py` command, and it's great for debugging and quick testing. But if you need to send a text to an actual player, `print` won't do, because it doesn't know _who_ to send to. Try this: - - > py me.msg("Hello world!") - Hello world! - -This looks the same as the `print` result, but we are now actually messaging a specific *object*, `me`. The `me` is something uniquely available in the `py` command (we could also use `self`, it's an alias). It represents "us", the ones calling the `py` command. The `me` is an example of an *Object instance*. Objects are fundamental in Python and Evennia. The `me` object not only represents the character we play in the game, it also contains a lot of useful resources for doing things with that Object. One such resource is `msg`. `msg` works like `print` except it sends the text to the object it is attached to. So if we, for example, had an object `you`, doing `you.msg(...)` would send a message to the object `you`. - -You access an Object's resources by using the full-stop character `.`. So `self.msg` accesses the `msg` resource and then we call it like we did print, with our "Hello World!" greeting in parentheses. - -> Important: something like `print(...)` we refer to as a *function*, while `msg(...)` which sits on an object is called a *method*. - -For now, `print` and `me.msg` behaves the same, just remember that you're going to mostly be using the latter in the future. Try printing other things. Also try to include `|r` at the start of your string to make the output red in-game. Use `color` to learn more color tags. - -### Importing modules - -Keep your game running, then open a text editor of your choice. If your game folder is called `mygame`, create a new text file `test.py` in the subfolder `mygame/world`. This is how the file structure should look: - -``` -mygame/ - world/ - test.py -``` - -For now, only add one line to `test.py`: - -```python -print("Hello World!") -``` - -Don't forget to save the file. A file with the ending `.py` is referred to as a Python *module*. To use this in-game we have to *import* it. Try this: - -```python -> @py import world.test -Hello World -``` -If you make some error (we'll cover how to handle errors below) you may need to run the `@reload` command for your changes to take effect. - -So importing `world.test` actually means importing `world/test.py`. Think of the period `.` as replacing `/` (or `\` for Windows) in your path. The `.py` ending of `test.py` is also never included in this "Python-path", but _only_ files with that ending can be imported this way. Where is `mygame` in that Python-path? The answer is that Evennia has already told Python that your `mygame` folder is a good place to look for imports. So we don't include `mygame` in the path - Evennia handles this for us. - -When you import the module, the top "level" of it will execute. In this case, it will immediately print "Hello World". - -> If you look in the folder you'll also often find new files ending with `.pyc`. These are compiled Python binaries that Python auto-creates when running code. Just ignore them, you should never edit those anyway. - -Now try to run this a second time: - -```python -> py import world.test -``` -You will *not* see any output this second time or any subsequent times! This is not a bug. Rather it is because Python is being clever - it stores all imported modules and to be efficient it will avoid importing them more than once. So your `print` will only run the first time, when the module is first imported. To see it again you need to `@reload` first, so Python forgets about the module and has to import it again. - -We'll get back to importing code in the second part of this tutorial. For now, let's press on. - -### Parsing Python errors - -Next, erase the single `print` statement you had in `test.py` and replace it with this instead: - -```python -me.msg("Hello World!") -``` - -As you recall we used this from `py` earlier - it echoed "Hello World!" in-game. -Save your file and `reload` your server - this makes sure Evennia sees the new version of your code. Try to import it from `py` in the same way as earlier: - -```python -> py import world.test -``` - -No go - this time you get an error! - -```python -File "./world/test.py", line 1, in - me.msg("Hello world!") -NameError: name 'me' is not defined -``` - -This is called a *traceback*. Python's errors are very friendly and will most of the time tell you exactly what and where things are wrong. It's important that you learn to parse tracebacks so you can fix your code. Let's look at this one. A traceback is to be read from the _bottom up_. The last line is the error Python balked at, while the two lines above it details exactly where that error was encountered. - -1. An error of type `NameError` is the problem ... -2. ... more specifically it is due to the variable `me` not being defined. -3. This happened on the line `me.msg("Hello world!")` ... -4. ... which is on line `1` of the file `./world/test.py`. - -In our case the traceback is short. There may be many more lines above it, tracking just how different modules called each other until it got to the faulty line. That can sometimes be useful information, but reading from the bottom is always a good start. - -The `NameError` we see here is due to a module being its own isolated thing. It knows nothing about the environment into which it is imported. It knew what `print` is because that is a special [reserved Python keyword](https://docs.python.org/2.5/ref/keywords.html). But `me` is *not* such a reserved word. As far as the module is concerned `me` is just there out of nowhere. Hence the `NameError`. - -### Our first function - -Let's see if we can resolve that `NameError` from the previous section. We know that `me` is defined at the time we use the `@py` command because if we do `py me.msg("Hello World!")` directly in-game it works fine. What if we could *send* that `me` to the `test.py` module so it knows what it is? One way to do this is with a *function*. - -Change your `mygame/world/test.py` file to look like this: - -```python -def hello_world(who): - who.msg("Hello World!") -``` - -Now that we are moving onto multi-line Python code, there are some important things to remember: - -- Capitalization matters in Python. It must be `def` and not `DEF`, `who` is not the same as `Who` etc. -- Indentation matters in Python. The second line must be indented or it's not valid code. You should also use a consistent indentation length. We *strongly* recommend that you set up your editor to always indent *4 spaces* (**not** a single tab-character) when you press the TAB key - it will make your life a lot easier. -- `def` is short for "define" and defines a *function* (or a *method*, if sitting on an object). This is a [reserved Python keyword](https://docs.python.org/2.5/ref/keywords.html); try not to use these words anywhere else. -- A function name can not have spaces but otherwise we could have called it almost anything. We call it `hello_world`. Evennia follows [Python's standard naming style](https://github.com/evennia/evennia/blob/master/CODING_STYLE.md#a-quick-list-of-code-style-points) with lowercase letters and underscores. Use this style for now. -- `who` is what we call the *argument* to our function. Arguments are variables we pass to the function. We could have named it anything and we could also have multiple arguments separated by commas. What `who` is depends on what we pass to this function when we *call* it later (hint: we'll pass `me` to it). -- The colon (`:`) at the end of the first line indicates that the header of the function is complete. -- The indentation marks the beginning of the actual operating code of the function (the function's *body*). If we wanted more lines to belong to this function those lines would all have to have to start at this indentation level. -- In the function body we take the `who` argument and treat it as we would have treated `me` earlier - we expect it to have a `.msg` method we can use to send "Hello World" to. - -First, `reload` your game to make it aware of the updated Python module. Now we have defined our first function, let's use it. - - > reload - > py import world.test - -Nothing happened! That is because the function in our module won't do anything just by importing it. It will only act when we *call* it. We will need to enter the module we just imported and do so. - - > py import world.test ; world.test.hello_world(me) - Hello world! - -There is our "Hello World"! The `;` is the way to put multiple Python-statements on one line. - -> Some MUD clients use `;` for their own purposes to separate client-inputs. If so you'll get a `NameError` stating that `world` is not defined. Check so you understand why this is! Change the use of `;` in your client or use the Evennia web client if this is a problem. - -In the second statement we access the module path we imported (`world.test`) and reach for the `hello_world` function within. We *call* the function with `me`, which becomes the `who` variable we use inside the `hello_function`. - -> As an exercise, try to pass something else into `hello_world`. Try for example to pass _who_ as the number `5` or the simple string `"foo"`. You'll get errors that they don't have the attribute `msg`. As we've seen, `me` *does* make `msg` available which is why it works (you'll learn more about Objects like `me` in the next part of this tutorial). If you are familiar with other programming languages you may be tempted to start *validating* `who` to make sure it works as expected. This is usually not recommended in Python which suggests it's better to [handle](https://docs.python.org/2/tutorial/errors.html) the error if it happens rather than to make a lot of code to prevent it from happening. See also [duck typing](https://en.wikipedia.org/wiki/Duck_typing). - -# Looking at the log - -As you start to explore Evennia, it's important that you know where to look when things go wrong. While using the friendly `py` command you'll see errors directly in-game. But if something goes wrong in your code while the game runs, you must know where to find the _log_. - -Open a terminal (or go back to the terminal you started Evennia in), make sure your `virtualenv` is active and that you are standing in your game directory (the one created with `evennia --init` during installation). Enter - -``` -evennia --log -``` -(or `evennia -l`) - -This will show the log. New entries will show up in real time. Whenever you want to leave the log, enter `Ctrl-C` or `Cmd-C` depending on your system. As a game dev it is important to look at the log output when working in Evennia - many errors will only appear with full details here. You may sometimes have to scroll up in the history if you miss it. - -This tutorial is continued in [Part 2](./Python-basic-tutorial-part-two), where we'll start learning about objects and to explore the Evennia library. diff --git a/docs/0.9.1/_sources/Python-basic-tutorial-part-two.md.txt b/docs/0.9.1/_sources/Python-basic-tutorial-part-two.md.txt deleted file mode 100644 index 203c01dd65..0000000000 --- a/docs/0.9.1/_sources/Python-basic-tutorial-part-two.md.txt +++ /dev/null @@ -1,332 +0,0 @@ -# Python basic tutorial part two - -[In the first part](./Python-basic-introduction) of this Python-for-Evennia basic tutorial we learned how to run some simple Python code from inside the game. We also made our first new *module* containing a *function* that we called. Now we're going to start exploring the very important subject of *objects*. - -**Contents:** -- [On the subject of objects](./Python-basic-tutorial-part-two#on-the-subject-of-objects) -- [Exploring the Evennia library](./Python-basic-tutorial-part-two#exploring-the-evennia-library) -- [Tweaking our Character class](./Python-basic-tutorial-part-two#tweaking-our-character-class) -- [The Evennia shell](./Python-basic-tutorial-part-two#the-evennia-shell) -- [Where to go from here](./Python-basic-tutorial-part-two#where-to-go-from-here) - -### On the subject of objects - -In the first part of the tutorial we did things like - - > py me.msg("Hello World!") - -To learn about functions and imports we also passed that `me` on to a function `hello_world` in another module. - -Let's learn some more about this `me` thing we are passing around all over the place. In the following we assume that we named our superuser Character "Christine". - - > py me - Christine - > py me.key - Christine - -These returns look the same at first glance, but not if we examine them more closely: - - > py type(me) - - > py type(me.key) - - -> Note: In some MU clients, such as Mudlet and MUSHclient simply returning `type(me)`, you may not see the proper return from the above commands. This is likely due to the HTML-like tags `<...>`, being swallowed by the client. - -The `type` function is, like `print`, another in-built function in Python. It -tells us that we (`me`) are of the *class* `typeclasses.characters.Character`. -Meanwhile `me.key` is a *property* on us, a string. It holds the name of this -object. - -> When you do `py me`, the `me` is defined in such a way that it will use its `.key` property to represent itself. That is why the result is the same as when doing `py me.key`. Also, remember that as noted in the first part of the tutorial, the `me` is *not* a reserved Python word; it was just defined by the Evennia developers as a convenient short-hand when creating the `py` command. So don't expect `me` to be available elsewhere. - -A *class* is like a "factory" or blueprint. From a class you then create individual *instances*. So if class is`Dog`, an instance of `Dog` might be `fido`. Our in-game persona is of a class `Character`. The superuser `christine` is an *instance* of the `Character` class (an instance is also often referred to as an *object*). This is an important concept in *object oriented programming*. You are wise to [familiarize yourself with it](https://en.wikipedia.org/wiki/Class-based_programming) a little. - -> In other terms: -> * class: A description of a thing, all the methods (code) and data (information) -> * object: A thing, defined as an *instance* of a class. -> -> So in "Fido is a Dog", "Fido" is an object--a unique thing--and "Dog" is a class. Coders would also say, "Fido is an instance of Dog". There can be other dogs too, such as Butch and Fifi. They, too, would be instances of Dog. -> -> As another example: "Christine is a Character", or "Christine is an instance of typeclasses.characters.Character". To start, all characters will be instances of typeclass.characters.Character. -> -> You'll be writing your own class soon! The important thing to know here is how classes and objects relate. - -The string `'typeclasses.characters.Character'` we got from the `type()` function is not arbitrary. You'll recognize this from when we _imported_ `world.test` in part one. This is a _path_ exactly describing where to find the python code describing this class. Python treats source code files on your hard drive (known as *modules*) as well as folders (known as *packages*) as objects that you access with the `.` operator. It starts looking at a place that Evennia has set up for you - namely the root of your own game directory. - -Open and look at your game folder (named `mygame` if you exactly followed the Getting Started instructions) in a file editor or in a new terminal/console. Locate the file `mygame/typeclasses/characters.py` - -``` -mygame/ - typeclasses - characters.py -``` - -This represents the first part of the python path - `typeclasses.characters` (the `.py` file ending is never included in the python path). The last bit, `.Character` is the actual class name inside the `characters.py` module. Open that file in a text editor and you will see something like this: - -```python -""" -(Doc string for module) -""" - -from evennia import DefaultCharacter - -class Character(DefaultCharacter): - """ - (Doc string for class) - """ - pass - -``` - -There is `Character`, the last part of the path. Note how empty this file is. At first glance one would think a Character had no functionality at all. But from what we have used already we know it has at least the `key` property and the method `msg`! Where is the code? The answer is that this 'emptiness' is an illusion caused by something called *inheritance*. Read on. - -Firstly, in the same way as the little `hello.py` we did in the first part of the tutorial, this is an example of full, multi-line Python code. Those triple-quoted strings are used for strings that have line breaks in them. When they appear on their own like this, at the top of a python module, class or similar they are called *doc strings*. Doc strings are read by Python and is used for producing online help about the function/method/class/module. By contrast, a line starting with `#` is a *comment*. It is ignored completely by Python and is only useful to help guide a human to understand the code. - -The line - -```python - class Character(DefaultCharacter): -``` - -means that the class `Character` is a *child* of the class `DefaultCharacter`. This is called *inheritance* and is another fundamental concept. The answer to the question "where is the code?" is that the code is *inherited* from its parent, `DefaultCharacter`. And that in turn may inherit code from *its* parent(s) and so on. Since our child, `Character` is empty, its functionality is *exactly identical* to that of its parent. The moment we add new things to Character, these will take precedence. And if we add something that already existed in the parent, our child-version will *override* the version in the parent. This is very practical: It means that we can let the parent do the heavy lifting and only tweak the things we want to change. It also means that we could easily have many different Character classes, all inheriting from `DefaultCharacter` but changing different things. And those can in turn also have children ... - -Let's go on an expedition up the inheritance tree. - -### Exploring the Evennia library - -Let's figure out how to tweak `Character`. Right now we don't know much about `DefaultCharacter` though. Without knowing that we won't know what to override. At the top of the file you find - -```python -from evennia import DefaultCharacter -``` - -This is an `import` statement again, but on a different form to what we've seen before. `from ... import ...` is very commonly used and allows you to precisely dip into a module to extract just the component you need to use. In this case we head into the `evennia` package to get `DefaultCharacter`. - -Where is `evennia`? To find it you need to go to the `evennia` folder (repository) you originally cloned from us. If you open it, this is how it looks: - -``` -evennia/ - __init__.py - bin/ - CHANGELOG.txt etc. - ... - evennia/ - ... -``` -There are lots of things in there. There are some docs but most of those have to do with the distribution of Evennia and does not concern us right now. The `evennia` subfolder is what we are looking for. *This* is what you are accessing when you do `from evennia import ...`. It's set up by Evennia as a good place to find modules when the server starts. The exact layout of the Evennia library [is covered by our directory overview](./Directory-Overview#evennia-library-layout). You can also explore it [online on github](https://github.com/evennia/evennia/tree/master/evennia). - -The structure of the library directly reflects how you import from it. - -- To, for example, import [the text justify function](https://github.com/evennia/evennia/blob/master/evennia/utils/utils.py#L201) from `evennia/utils/utils.py` you would do `from evennia.utils.utils import justify`. In your code you could then just call `justify(...)` to access its functionality. -- You could also do `from evennia.utils import utils`. In code you would then have to write `utils.justify(...)`. This is practical if want a lot of stuff from that `utils.py` module and don't want to import each component separately. -- You could also do `import evennia`. You would then have to enter the full `evennia.utils.utils.justify(...)` every time you use it. Using `from` to only import the things you need is usually easier and more readable. -- See [this overview](http://effbot.org/zone/import-confusion.htm) about the different ways to import in Python. - -Now, remember that our `characters.py` module did `from evennia import DefaultCharacter`. But if we look at the contents of the `evennia` folder, there is no `DefaultCharacter` anywhere! This is because Evennia gives a large number of optional "shortcuts", known as [the "flat" API](./Evennia-API). The intention is to make it easier to remember where to find stuff. The flat API is defined in that weirdly named `__init__.py` file. This file just basically imports useful things from all over Evennia so you can more easily find them in one place. - -We could [just look at the documenation](github:evennia#typeclasses) to find out where we can look at our `DefaultCharacter` parent. But for practice, let's figure it out. Here is where `DefaultCharacter` [is imported from](https://github.com/evennia/evennia/blob/master/evennia/__init__.py#L188) inside `__init__.py`: - -```python -from .objects.objects import DefaultCharacter -``` - -The period at the start means that it imports beginning from the same location this module sits(i.e. the `evennia` folder). The full python-path accessible from the outside is thus `evennia.objects.objects.DefaultCharacter`. So to import this into our game it'd be perfectly valid to do - -```python -from evennia.objects.objects import DefaultCharacter -``` - -Using - -```python -from evennia import DefaultCharacter -``` - -is the same thing, just a little easier to remember. - -> To access the shortcuts of the flat API you *must* use `from evennia import -> ...`. Using something like `import evennia.DefaultCharacter` will not work. -> See [more about the Flat API here](./Evennia-API). - - -### Tweaking our Character class - -In the previous section we traced the parent of our `Character` class to be -`DefaultCharacter` in -[evennia/objects/objects.py](https://github.com/evennia/evennia/blob/master/evennia/objects/objects.py). -Open that file and locate the `DefaultCharacter` class. It's quite a bit down -in this module so you might want to search using your editor's (or browser's) -search function. Once you find it, you'll find that the class starts like this: - -```python - -class DefaultCharacter(DefaultObject): - """ - This implements an Object puppeted by a Session - that is, a character - avatar controlled by an account. - """ - - def basetype_setup(self): - """ - Setup character-specific security. - You should normally not need to overload this, but if you do, - make sure to reproduce at least the two last commands in this - method (unless you want to fundamentally change how a - Character object works). - """ - super().basetype_setup() - self.locks.add(";".join(["get:false()", # noone can pick up the character - "call:false()"])) # no commands can be called on character from outside - # add the default cmdset - self.cmdset.add_default(settings.CMDSET_CHARACTER, permanent=True) - - def at_after_move(self, source_location, **kwargs): - """ - We make sure to look around after a move. - """ - if self.location.access(self, "view"): - self.msg(self.at_look(self.location)) - - def at_pre_puppet(self, account, session=None, **kwargs): - """ - Return the character from storage in None location in `at_post_unpuppet`. - """ - - # ... - -``` - -... And so on (you can see the full [class online here](https://github.com/evennia/evennia/blob/master/evennia/objects/objects.py#L1915)). Here we have functional code! These methods may not be directly visible in `Character` back in our game dir, but they are still available since `Character` is a child of `DefaultCharacter` above. Here is a brief summary of the methods we find in `DefaultCharacter` (follow in the code to see if you can see roughly where things happen):: - -- `basetype_setup` is called by Evennia only once, when a Character is first created. In the `DefaultCharacter` class it sets some particular [Locks](./Locks) so that people can't pick up and puppet Characters just like that. It also adds the [Character Cmdset](./Command-Sets) so that Characters always can accept command-input (this should usually not be modified - the normal hook to override is `at_object_creation`, which is called after `basetype_setup` (it's in the parent)). -- `at_after_move` makes it so that every time the Character moves, the `look` command is automatically fired (this would not make sense for just any regular Object). -- `at_pre_puppet` is called when an Account begins to puppet this Character. When not puppeted, the Character is hidden away to a `None` location. This brings it back to the location it was in before. Without this, "headless" Characters would remain in the game world just standing around. -- `at_post_puppet` is called when puppeting is complete. It echoes a message to the room that his Character has now connected. -- `at_post_unpuppet` is called once stopping puppeting of the Character. This hides away the Character to a `None` location again. -- There are also some utility properties which makes it easier to get some time stamps from the Character. - -Reading the class we notice another thing: - -```python -class DefaultCharacter(DefaultObject): - # ... -``` - -This means that `DefaultCharacter` is in *itself* a child of something called `DefaultObject`! Let's see what this parent class provides. It's in the same module as `DefaultCharacter`, you just need to [scroll up near the top](https://github.com/evennia/evennia/blob/master/evennia/objects/objects.py#L182): - -```python -class DefaultObject(with_metaclass(TypeclassBase, ObjectDB)): - # ... -``` - -This is a really big class where the bulk of code defining an in-game object resides. It consists of a large number of methods, all of which thus also becomes available on the `DefaultCharacter` class below *and* by extension in your `Character` class over in your game dir. In this class you can for example find the `msg` method we have been using before. - -> You should probably not expect to understand all details yet, but as an exercise, find and read the doc string of `msg`. - -> As seen, `DefaultObject` actually has multiple parents. In one of those the basic `key` property is defined, but we won't travel further up the inheritance tree in this tutorial. If you are interested to see them, you can find `TypeclassBase` in [evennia/typeclasses/models.py](https://github.com/evennia/evennia/blob/master/evennia/typeclasses/models.py#L93) and `ObjectDB` in [evennia/objects/models.py](https://github.com/evennia/evennia/blob/master/evennia/objects/models.py#L121). We will also not go into the details of [Multiple Inheritance](https://docs.python.org/2/tutorial/classes.html#multiple-inheritance) or [Metaclasses](http://www.onlamp.com/pub/a/python/2003/04/17/metaclasses.html) here. The general rule is that if you realize that you need these features, you already know enough to use them. - -Remember the `at_pre_puppet` method we looked at in `DefaultCharacter`? If you look at the `at_pre_puppet` hook as defined in `DefaultObject` you'll find it to be completely empty (just a `pass`). So if you puppet a regular object it won't be hiding/retrieving the object when you unpuppet it. The `DefaultCharacter` class *overrides* its parent's functionality with a version of its own. And since it's `DefaultCharacter` that our `Character` class inherits back in our game dir, it's *that* version of `at_pre_puppet` we'll get. Anything not explicitly overridden will be passed down as-is. - -While it's useful to read the code, we should never actually modify anything inside the `evennia` folder. Only time you would want that is if you are planning to release a bug fix or new feature for Evennia itself. Instead you *override* the default functionality inside your game dir. - -So to conclude our little foray into classes, objects and inheritance, locate the simple little `at_before_say` method in the `DefaultObject` class: - -```python - def at_before_say(self, message, **kwargs): - """ - (doc string here) - """ - return message -``` - -If you read the doc string you'll find that this can be used to modify the output of `say` before it goes out. You can think of it like this: Evennia knows the name of this method, and when someone speaks, Evennia will make sure to redirect the outgoing message through this method. It makes it ripe for us to replace with a version of our own. - -> In the Evennia documentation you may sometimes see the term *hook* used for a method explicitly meant to be overridden like this. - -As you can see, the first argument to `at_before_say` is `self`. In Python, the first argument of a method is *always a back-reference to the object instance on which the method is defined*. By convention this argument is always called `self` but it could in principle be named anything. The `self` is very useful. If you wanted to, say, send a message to the same object from inside `at_before_say`, you would do `self.msg(...)`. - -What can trip up newcomers is that you *don't* include `self` when you *call* the method. Try: - - > @py me.at_before_say("Hello World!") - Hello World! - -Note that we don't send `self` but only the `message` argument. Python will automatically add `self` for us. In this case, `self` will become equal to the Character instance `me`. - -By default the `at_before_say` method doesn't do anything. It just takes the `message` input and `return`s it just the way it was (the `return` is another reserved Python word). - -> We won't go into `**kwargs` here, but it (and its sibling `*args`) is also important to understand, extra reading is [here for `**kwargs`](https://stackoverflow.com/questions/1769403/understanding-kwargs-in-python). - -Now, open your game folder and edit `mygame/typeclasses/characters.py`. Locate your `Character` class and modify it as such: - -```python -class Character(DefaultCharacter): - """ - (docstring here) - """ - def at_before_say(self, message, **kwargs): - "Called before say, allows for tweaking message" - return f"{message} ..." -``` - -So we add our own version of `at_before_say`, duplicating the `def` line from the parent but putting new code in it. All we do in this tutorial is to add an ellipsis (`...`) to the message as it passes through the method. - -Note that `f` in front of the string, it means we turned the string into a 'formatted string'. We can now easily inject stuff directly into the string by wrapping them in curly brackets `{ }`. In this example, we put the incoming `message` into the string, followed by an ellipsis. This is only one way to format a string. Python has very powerful [string formatting](https://docs.python.org/2/library/string.html#format-specification-mini-language) and you are wise to learn it well, considering your game will be mainly text-based. - -> You could also copy & paste the relevant method from `DefaultObject` here to get the full doc string. For more complex methods, or if you only want to change some small part of the default behavior, copy & pasting will eliminate the need to constantly look up the original method and keep you sane. - -In-game, now try - - > @reload - > say Hello - You say, "Hello ..." - -An ellipsis `...` is added to what you said! This is a silly example but you have just made your first code change to core functionality - without touching any of Evennia's original code! We just plugged in our own version of the `at_before_say` method and it replaced the default one. Evennia happily redirected the message through our version and we got a different output. - -> For sane overriding of parent methods you should also be aware of Python's [super](https://docs.python.org/3/library/functions.html#super), which allows you to call the methods defined on a parent in your child class. - -### The Evennia shell - -Now on to some generally useful tools as you continue learning Python and Evennia. We have so far explored using `py` and have inserted Python code directly in-game. We have also modified Evennia's behavior by overriding default functionality with our own. There is a third way to conveniently explore Evennia and Python - the Evennia shell. - -Outside of your game, `cd` to your mygame folder and make sure any needed virtualenv is running. Next: - - > pip install ipython # only needed once - -The [`IPython`](https://en.wikipedia.org/wiki/IPython) program is just a nicer interface to the Python interpreter - you only need to install it once, after which Evennia will use it automatically. - - > evennia shell - -If you did this call from your game dir you will now be in a Python prompt managed by the IPython program. - - IPython ... - ... - In [1]: -IPython has some very nice ways to explore what Evennia has to offer. - - > import evennia - > evennia. - -That is, write `evennia.` and press the Tab key. You will be presented with a list of all available resources in the Evennia Flat API. We looked at the `__init__.py` file in the `evennia` folder earlier, so some of what you see should be familiar. From the IPython prompt, do: - - > from evennia import DefaultCharacter - > DefaultCharacter.at_before_say? - -Don't forget that you can use `` to auto-complete code as you write. Appending a single `?` to the end will show you the doc-string for `at_before_say` we looked at earlier. Use `??` to get the whole source code. - -Let's look at our over-ridden version instead. Since we started the `evennia shell` from our game dir we can easily get to our code too: - - > from typeclasses.characters import Character - > Character.at_before_say?? - -This will show us the changed code we just did. Having a window with IPython running is very convenient for quickly exploring code without having to go digging through the file structure! - -### Where to go from here - -This should give you a running start using Python with Evennia. If you are completely new to programming or Python you might want to look at a more formal Python tutorial. You can find links and resources [on our link page](./Links). - -We have touched upon many of the concepts here but to use Evennia and to be able to follow along in the code, you will need basic understanding of Python [modules](http://docs.python.org/2/tutorial/modules.html), [variables](http://www.tutorialspoint.com/python/python_variable_types.htm), [conditional statements](http://docs.python.org/tutorial/controlflow.html#if-statements), [loops](http://docs.python.org/tutorial/controlflow.html#for-statements), [functions](http://docs.python.org/tutorial/controlflow.html#defining-functions), [lists, dictionaries, list comprehensions](http://docs.python.org/tutorial/datastructures.html) and [string formatting](http://docs.python.org/tutorial/introduction.html#strings). You should also have a basic understanding of [object-oriented programming](http://www.tutorialspoint.com/python/python_classes_objects.htm) and what Python [Classes](http://docs.python.org/tutorial/classes.html) are. - -Once you have familiarized yourself, or if you prefer to pick Python up as you go, continue to one of the beginning-level [Evennia tutorials](./Tutorials) to gradually build up your understanding. - -Good luck! diff --git a/docs/0.9.1/_sources/Quirks.md.txt b/docs/0.9.1/_sources/Quirks.md.txt deleted file mode 100644 index db4645fff5..0000000000 --- a/docs/0.9.1/_sources/Quirks.md.txt +++ /dev/null @@ -1,72 +0,0 @@ -# Quirks - - -This is a list of various quirks or common stumbling blocks that people often ask about or report when using (or trying to use) Evennia. They are not bugs. - -### Forgetting to use @reload to see changes to your typeclasses - -Firstly: Reloading the server is a safe and usually quick operation which will *not* disconnect any accounts. - -New users tend to forget this step. When editing source code (such as when tweaking typeclasses and commands or adding new commands to command sets) you need to either use the in-game `@reload` command or, from the command line do `python evennia.py reload` before you see your changes. - -### Web admin to create new Account - -If you use the default login system and are trying to use the Web admin to create a new Player account, you need to consider which `MULTIACCOUNT_MODE` you are in. If you are in `MULTIACCOUNT_MODE` `0` or `1`, the login system expects each Account to also have a Character object named the same as the Account - there is no character creation screen by default. If using the normal mud login screen, a Character with the same name is automatically created and connected to your Account. From the web interface you must do this manually. - -So, when creating the Account, make sure to also create the Character *from the same form* as you create the Account from. This should set everything up for you. Otherwise you need to manually set the "account" property on the Character and the "character" property on the Account to point to each other. You must also set the lockstring of the Character to allow the Account to "puppet" this particular character. - -### Mutable attributes and their connection to the database - -When storing a mutable object (usually a list or a dictionary) in an Attribute - -```python - object.db.mylist = [1,2,3] -``` - -you should know that the connection to the database is retained also if you later extract that Attribute into another variable (what is stored and retrieved is actually a `PackedList` or a `PackedDict` that works just like their namesakes except they save themselves to the database when changed). So if you do - -```python - alist = object.db.mylist - alist.append(4) -``` - -this updates the database behind the scenes, so both `alist` and `object.db.mylist` are now `[1,2,3,4]` - -If you don't want this, Evennia provides a way to stably disconnect the mutable from the database by use of `evennia.utils.dbserialize.deserialize`: - -```python - from evennia.utils.dbserialize import deserialize - - blist = deserialize(object.db.mylist) - blist.append(4) -``` - -The property `blist` is now `[1,2,3,4]` whereas `object.db.mylist` remains unchanged. If you want to update the database you'd need to explicitly re-assign the updated data to the `mylist` Attribute. - -### Commands are matched by name *or* alias - -When merging [command sets](./Commands) it's important to remember that command objects are identified *both* by key *or* alias. So if you have a command with a key `look` and an alias `ls`, introducing another command with a key `ls` will be assumed by the system to be *identical* to the first one. This usually means merging cmdsets will overload one of them depending on priority. Whereas this is logical once you know how command objects are handled, it may be confusing if you are just looking at the command strings thinking they are parsed as-is. - -### Objects turning to `DefaultObject` - -A common confusing error for new developers is finding that one or more objects in-game are suddenly of the type `DefaultObject` rather than the typeclass you wanted it to be. This happens when you introduce a critical Syntax error to the module holding your custom class. Since such a module is not valid Python, Evennia can't load it at all to get to the typeclasses within. To keep on running, Evennia will solve this by printing the full traceback to the terminal/console and temporarily fall back to the safe `DefaultObject` until you fix the problem and reload. Most errors of this kind will be caught by any good text editors. Keep an eye on the terminal/console during a reload to catch such errors - you may have to scroll up if your window is small. - -### Overriding of magic methods - -Python implements a system of [magic methods](https://docs.python.org/3/reference/datamodel.html#emulating-container-types), usually prefixed and suffixed by double-underscores (`__example__`) that allow object instances to have certain operations performed on them without needing to do things like turn them into strings or numbers first-- for example, is `obj1` greater than or equal to `obj2`? - -Neither object is a number, but given `obj1.size == "small"` and `obj2.size == "large"`, how might one compare these two arbitrary English adjective strings to figure out which is greater than the other? By defining the `__ge__` (greater than or equal to) magic method on the object class in which you figure out which word has greater significance, perhaps through use of a mapping table (`{'small':0, 'large':10}`) or other lookup and comparing the numeric values of each. - -Evennia extensively makes use of magic methods on typeclasses to do things like initialize objects, check object existence or iterate over objects in an inventory or container. If you override or interfere with the return values from the methods Evennia expects to be both present and working, it can result in very inconsistent and hard-to-diagnose errors. - -The moral of the story-- it can be dangerous to tinker with magic methods on typeclassed objects. Try to avoid doing so. - -### Known upstream bugs - -- There is currently (Autumn 2017) a bug in the `zope.interface` installer on some Linux Ubuntu distributions (notably Ubuntu 16.04 LTS). Zope is a dependency of Twisted. The error manifests in the server not starting with an error that `zope.interface` is not found even though `pip list` shows it's installed. The reason is a missing empty `__init__.py` file at the root of the zope package. If the virtualenv is named "evenv" as suggested in the [Getting Started](./Getting-Started) instructions, use the following command to fix it: - - ```shell - touch evenv/local/lib/python2.7/site-packages/zope/__init__.py - ``` - - This will create the missing file and things should henceforth work correctly. \ No newline at end of file diff --git a/docs/0.9.1/_sources/RSS.md.txt b/docs/0.9.1/_sources/RSS.md.txt deleted file mode 100644 index 52827653b2..0000000000 --- a/docs/0.9.1/_sources/RSS.md.txt +++ /dev/null @@ -1,34 +0,0 @@ -# RSS - - -[RSS](http://en.wikipedia.org/wiki/RSS) is a format for easily tracking updates on websites. The principle is simple - whenever a site is updated, a small text file is updated. An RSS reader can then regularly go online, check this file for updates and let the user know what's new. - -Evennia allows for connecting any number of RSS feeds to any number of in-game channels. Updates to the feed will be conveniently echoed to the channel. There are many potential uses for this: For example the MUD might use a separate website to host its forums. Through RSS, the players can then be notified when new posts are made. Another example is to let everyone know you updated your dev blog. Admins might also want to track the latest Evennia updates through our own RSS feed [here](http://code.google.com/feeds/p/evennia/updates/basic). - -## Configuring RSS - -To use RSS, you first need to install the [feedparser](http://code.google.com/p/feedparser/) python module. - - pip install feedparser - -Next you activate RSS support in your config file by settting `RSS_ENABLED=True`. - -Start/reload Evennia as a privileged user. You should now have a new command available, `@rss2chan`: - - @rss2chan = - -### Setting up RSS, step by step - -You can connect RSS to any Evennia channel, but for testing, let's set up a new channel "rss". - - @ccreate rss = RSS feeds are echoed to this channel! - -Let's connect Evennia's code-update feed to this channel. The RSS url for evennia updates is `https://github.com/evennia/evennia/commits/master.atom`, so let's add that: - - @rss2chan rss = https://github.com/evennia/evennia/commits/master.atom - -That's it, really. New Evennia updates will now show up as a one-line title and link in the channel. Give the `@rss2chan` command on its own to show all connections. To remove a feed from a channel, you specify the connection again (use the command to see it in the list) but add the `/delete` switch: - - @rss2chan/delete rss = https://github.com/evennia/evennia/commits/master.atom - -You can connect any number of RSS feeds to a channel this way. You could also connect them to the same channels as [IRC](./IRC) to have the feed echo to external chat channels as well. diff --git a/docs/0.9.1/_sources/Roadmap.md.txt b/docs/0.9.1/_sources/Roadmap.md.txt deleted file mode 100644 index 2e11984310..0000000000 --- a/docs/0.9.1/_sources/Roadmap.md.txt +++ /dev/null @@ -1,4 +0,0 @@ -# Roadmap - - -*As of Autumn 2016, Evennia's development roadmap is tracked through the [Evennia Projects Page](https://github.com/evennia/evennia/projects).* \ No newline at end of file diff --git a/docs/0.9.1/_sources/Running-Evennia-in-Docker.md.txt b/docs/0.9.1/_sources/Running-Evennia-in-Docker.md.txt deleted file mode 100644 index 9dd6032f70..0000000000 --- a/docs/0.9.1/_sources/Running-Evennia-in-Docker.md.txt +++ /dev/null @@ -1,195 +0,0 @@ -# Running Evennia in Docker - -Evennia has an [official docker image](https://hub.docker.com/r/evennia/evennia/) which makes running an Evennia-based game in a Docker container easy. - -## Install Evennia through docker - -First, install the `docker` program so you can run the Evennia container. You can get it freely from [docker.com](https://www.docker.com/). Linux users can likely also get it through their normal package manager. - -To fetch the latest evennia docker image, run: - - docker pull evennia/evennia - -This is a good command to know, it is also how you update to the latest version when we make updates in the future. This tracks the `master` branch of Evennia. - -> Note: If you want to experiment with the (unstable) `develop` branch, use `docker pull evennia/evennia:develop`. - -Next `cd` to a place where your game dir is, or where you want to create it. Then run: - - docker run -it --rm -p 4000:4000 -p 4001:4001 -p 4002:4002 --rm -v $PWD:/usr/src/game --user $UID:$GID evennia/evennia - -Having run this (see next section for a description of what's what), you will be at a prompt inside the docker container: - -```bash -evennia|docker /usr/src/game $ -``` - -This is a normal shell prompt. We are in the `/usr/src/game` location inside the docker container. If you had anything in the folder you started from, you should see it here (with `ls`) since we mounted the current directory to `usr/src/game` (with `-v` above). You have the `evennia` command available and can now proceed to create a new game as per the [Getting Started](./Getting-Started) instructions (you can skip the virtualenv and install 'globally' in the container though). - -You can run Evennia from inside this container if you want to, it's like you are root in a little isolated Linux environment. To exit the container and all processes in there, press `Ctrl-D`. If you created a new game folder, you will find that it has appeared on-disk. - -> The game folder or any new files that you created from inside the container will appear as owned by `root`. If you want to edit the files outside of the container you should change the ownership. On Linux/Mac you do this with `sudo chown myname:myname -R mygame`, where you replace `myname` with your username and `mygame` with whatever your game folder is named. - -### Description of the `docker run` command - -```bash - docker run -it --rm -p 4000:4000 -p 4001:4001 -p 4002:4002 --rm -v $PWD:/usr/src/game --user $UID:$GID evennia/evennia -``` - -This is what it does: - -- `docker run ... evennia/evennia` tells us that we want to run a new container based on the `evennia/evennia` docker image. Everything in between are options for this. The `evennia/evennia` is the name of our [official docker image on the dockerhub repository](https://hub.docker.com/r/evennia/evennia/). If you didn't do `docker pull evennia/evennia` first, the image will be downloaded when running this, otherwise your already downloaded version will be used. It contains everything needed to run Evennia. -- `-it` has to do with creating an interactive session inside the container we start. -- `--rm` will make sure to delete the container when it shuts down. This is nice to keep things tidy on your drive. -- `-p 4000:4000 -p 4001:4001 -p 4002:4002` means that we *map* ports `4000`, `4001` and `4002` from inside the docker container to same-numbered ports on our host machine. These are ports for telnet, webserver and websockets. This is what allows your Evennia server to be accessed from outside the container (such as by your MUD client)! -- `-v $PWD:/usr/src/game` mounts the current directory (*outside* the container) to the path `/usr/src/game` *inside* the container. This means that when you edit that path in the container you will actually be modifying the "real" place on your hard drive. If you didn't do this, any changes would only exist inside the container and be gone if we create a new one. Note that in linux a shortcut for the current directory is `$PWD`. If you don't have this for your OS, you can replace it with the full path to the current on-disk directory (like `C:/Development/evennia/game` or wherever you want your evennia files to appear). -- `--user $UID:$GID` ensures the container's modifications to `$PWD` are done with you user and group IDs instead of root's IDs (root is the user running evennia inside the container). This avoids having stale `.pid` files in your filesystem between container reboots which you have to force delete with `sudo rm server/*.pid` before each boot. - -## Running your game as a docker image - -If you run the `docker` command given in the previous section from your game dir you can then easily start Evennia and have a running server without any further fuss. - -But apart from ease of install, the primary benefit to running an Evennia-based game in a container is to simplify its deployment into a public production environment. Most cloud-based hosting providers these days support the ability to run container-based applications. This makes deploying or updating your game as simple as building a new container image locally, pushing it to your Docker Hub account, and then pulling from Docker Hub into your AWS/Azure/other docker-enabled hosting account. The container eliminates the need to install Python, set up a virtualenv, or run pip to install dependencies. - -### Start Evennia and run through docker - -For remote or automated deployment you may want to start Evennia immediately as soon as the docker container comes up. If you already have a game folder with a database set up you can also start the docker container and pass commands directly to it. The command you pass will be the main process to run in the container. From your game dir, run for example this command: - - docker run -it --rm -p 4000:4000 -p 4001:4001 -p 4002:4002 --rm -v $PWD:/usr/src/game evennia/evennia evennia start -l - -This will start Evennia as the foreground process, echoing the log to the terminal. Closing the terminal will kill the server. Note that you *must* use a foreground command like `evennia start -l` or `evennia ipstart` to start the server - otherwise the foreground process will finish immediately and the container go down. -### Create your own game image - -These steps assume that you have created or otherwise obtained a game directory already. First, `cd` to your game dir and create a new empty text file named `Dockerfile`. Save the following two lines into it: - -``` -FROM evennia/evennia:latest - -ENTRYPOINT evennia start -l -``` - -These are instructions for building a new docker image. This one is based on the official `evennia/evennia` image, but also makes sure to start evennia when it runs (so we don't need to enter it and run commands). - -To build the image: - -```bash - docker build -t mydhaccount/mygame . -``` - -(don't forget the period at the end, it will use the `Dockerfile` from the current location). Here `mydhaccount` is the name of your `dockerhub` account. If you don't have a dockerhub account you can build the image locally only (name the container whatever you like in that case, like just `mygame`). - -Docker images are stored centrally on your computer. You can see which ones you have available locally with `docker images`. Once built, you have a couple of options to run your game. - -### Run container from your game image for development - -To run the container based on your game image locally for development, mount the local game directory as before: - -``` -docker run -it --rm -p 4000:4000 -p 4001:4001 -p 4002:4002 -v $PWD:/usr/src/game --user $UID:$GID mydhaccount/mygame -``` - -Evennia will start and you'll get output in the terminal, perfect for development. You should be able to connect to the game with your clients normally. - -### Deploy game image for production - -Each time you rebuild the docker image as per the above instructions, the latest copy of your game directory is actually copied inside the image (at `/usr/src/game/`). If you don't mount your on-disk folder there, the internal one will be used. So for deploying evennia on a server, omit the `-v` option and just give the following command: - -``` -docker run -it --rm -d -p 4000:4000 -p 4001:4001 -p 4002:4002 --user $UID:$GID mydhaccount/mygame -``` - -Your game will be downloaded from your docker-hub account and a new container will be built using the image and started on the server! If your server environment forces you to use different ports, you can just map the normal ports differently in the command above. - -Above we added the `-d` option, which starts the container in *daemon* mode - you won't see any return in the console. You can see it running with `docker ps`: - -```bash -$ docker ps - -CONTAINER ID IMAGE COMMAND CREATED ... -f6d4ca9b2b22 mygame "/bin/sh -c 'evenn..." About a minute ago ... -``` - -Note the container ID, this is how you manage the container as it runs. - -``` - docker logs f6d4ca9b2b22 -``` -Looks at the STDOUT output of the container (i.e. the normal server log) -``` - docker logs -f f6d4ca9b2b22 -``` -Tail the log (so it updates to your screen 'live'). -``` - docker pause f6d4ca9b2b22 -``` -Suspend the state of the container. -``` - docker unpause f6d4ca9b2b22 -``` -Un-suspend it again after a pause. It will pick up exactly where it were. -``` - docker stop f6d4ca9b2b22 -``` -Stop the container. To get it up again you need to use `docker run`, specifying ports etc. A new container will get a new container id to reference. - -## How it Works - -The `evennia/evennia` docker image holds the evennia library and all of its dependencies. It also has an `ONBUILD` directive which is triggered during builds of images derived from it. This `ONBUILD` directive handles setting up a volume and copying your game directory code into the proper location within the container. - -In most cases, the Dockerfile for an Evennia-based game will only need the `FROM evennia/evennia:latest` directive, and optionally a `MAINTAINER` directive if you plan to publish your image on Docker Hub and would like to provide contact info. - -For more information on Dockerfile directives, see the [Dockerfile Reference](https://docs.docker.com/engine/reference/builder/). - -For more information on volumes and Docker containers, see the Docker site's [Manage data in containers](https://docs.docker.com/engine/tutorials/dockervolumes/) page. - -### What if I Don't Want "LATEST"? - -A new `evennia/evennia` image is built automatically whenever there is a new commit to the `master` branch of Evennia. It is possible to create your own custom evennia base docker image based on any arbitrary commit. - -1. Use git tools to checkout the commit that you want to base your image upon. (In the example below, we're checking out commit a8oc3d5b.) -``` -git checkout -b my-stable-branch a8oc3d5b -``` -2. Change your working directory to the `evennia` directory containing `Dockerfile`. Note that `Dockerfile` has changed over time, so if you are going far back in the commit history you might want to bring a copy of the latest `Dockerfile` with you and use that instead of whatever version was used at the time. -3. Use the `docker build` command to build the image based off of the currently checked out commit. The example below assumes your docker account is **mydhaccount**. -``` -docker build -t mydhaccount/evennia . -``` -4. Now you have a base evennia docker image built off of a specific commit. To use this image to build your game, you would modify **FROM** directive in the **Dockerfile** for your game directory to be: - -``` -FROM mydhacct/evennia:latest -``` - -Note: From this point, you can also use the `docker tag` command to set a specific tag on your image and/or upload it into Docker Hub under your account. - -5. At this point, build your game using the same `docker build` command as usual. Change your working directory to be your game directory and run - -``` -docker build -t mydhaccountt/mygame . -``` - -## Additional Creature Comforts - -The Docker ecosystem includes a tool called `docker-compose`, which can orchestrate complex multi-container applications, or in our case, store the default port and terminal parameters that we want specified every time we run our container. A sample `docker-compose.yml` file to run a containerized Evennia game in development might look like this: -``` -version: '2' - -services: - evennia: - image: mydhacct/mygame - stdin_open: true - tty: true - ports: - - "4001-4002:4001-4002" - - "4000:4000" - volumes: - - .:/usr/src/game -``` -With this file in the game directory next to the `Dockerfile`, starting the container is as simple as -``` -docker-compose up -``` -For more information about `docker-compose`, see [Getting Started with docker-compose](https://docs.docker.com/compose/gettingstarted/). - -> Note that with this setup you lose the `--user $UID` option. The problem is that the variable `UID` is not available inside the configuration file `docker-compose.yml`. A workaround is to hardcode your user and group id. In a terminal run `echo $UID:$GID` and if for example you get `1000:1000` you can add to `docker-compose.yml` a line `user: 1000:1000` just below the `image: ...` line. diff --git a/docs/0.9.1/_sources/Screenshot.md.txt b/docs/0.9.1/_sources/Screenshot.md.txt deleted file mode 100644 index 17100b5b6d..0000000000 --- a/docs/0.9.1/_sources/Screenshot.md.txt +++ /dev/null @@ -1,13 +0,0 @@ -# Screenshot - - -![evennia_screenshot2017](https://user-images.githubusercontent.com/294267/30773728-ea45afb6-a076-11e7-8820-49be2168a6b8.png) -*(right-click and choose your browser's equivalent of "view image" to see it full size)* - -This screenshot shows a vanilla [install](./Getting-Started) of the just started Evennia MUD server. In the bottom window we can see the log messages from the running server. - -In the top left window we see the default website of our new game displayed in a web browser (it has shrunk to accomodate the smaller screen). Evennia contains its own webserver to serve this page. The default site shows some brief info about the database. From here you can also reach Django's *admin interface* for editing the database online. - -To the upper right is the included web-browser client showing a connection to the server on port 4001. This allows users to access the game without downloading a mud client separately. - -Bottom right we see a login into the stock game using a third-party MUD client ([Mudlet](http://www.mudlet.org)). This connects to the server via the telnet protocol on port 4000. diff --git a/docs/0.9.1/_sources/Security.md.txt b/docs/0.9.1/_sources/Security.md.txt deleted file mode 100644 index 6369101da3..0000000000 --- a/docs/0.9.1/_sources/Security.md.txt +++ /dev/null @@ -1,95 +0,0 @@ -# Security - -Hackers these days aren't discriminating, and their backgrounds range from bored teenagers to international intelligence agencies. Their scripts and bots endlessly crawl the web, looking for vulnerable systems they can break into. Who owns the system is irrelevant-- it doesn't matter if it belongs to you or the Pentagon, the goal is to take advantage of poorly-secured systems and see what resources can be controlled or stolen from them. - -If you're considering deploying to a cloud-based host, you have a vested interest in securing your applications-- you likely have a credit card on file that your host can freely bill. Hackers pegging your CPU to mine cryptocurrency or saturating your network connection to participate in a botnet or send spam can run up your hosting bill, get your service suspended or get your address/site blacklisted by ISPs. It can be a difficult legal or political battle to undo this damage after the fact. - -As a developer about to expose a web application to the threat landscape of the modern internet, here are a few tips to consider to increase the security of your Evennia install. - -### Know your logs -In case of emergency, check your logs! By default they are located in the `server/logs/` folder. Here are some of the more important ones and why you should care: - -* `http_requests.log` will show you what HTTP requests have been made against Evennia's built-in webserver (TwistedWeb). This is a good way to see if people are innocuously browsing your site or trying to break it through code injection. -* `portal.log` will show you various networking-related information. This is a good place to check for odd or unusual types or amounts of connections to your game, or other networking-related issues-- like when users are reporting an inability to connect. -* `server.log` is the MUX administrator's best friend. Here is where you'll find information pertaining to who's trying to break into your system by guessing at passwords, who created what objects, and more. If your game fails to start or crashes and you can't tell why, this is the first place you should look for answers. Security-related events are prefixed with an `[SS]` so when there's a problem you might want to pay special attention to those. - -### Disable development/debugging options -There are a few Evennia/Django options that are set when you first create your game to make it more obvious to you where problems arise. These options should be disabled before you push your game into production-- leaving them on can expose variables or code someone with malicious intent can easily abuse to compromise your environment. - -In `server/conf/settings.py`: - - # Disable Django's debug mode - DEBUG = False - # Disable the in-game equivalent - IN_GAME_ERRORS = False - # If you've registered a domain name, force Django to check host headers. Otherwise leave this as-is. - # Note the leading period-- it is not a typo! - ALLOWED_HOSTS = ['.example.com'] - -### Handle user-uploaded images with care -If you decide to allow users to upload their own images to be served from your site, special care must be taken. Django will read the file headers to confirm it's an image (as opposed to a document or zip archive), but [code can be injected into an image file](https://insinuator.net/2014/05/django-image-validation-vulnerability/) *after* the headers that can be interpreted as HTML and/or give an attacker a web shell through which they can access other filesystem resources. - -[Django has a more comprehensive overview of how to handle user-uploaded files](https://docs.djangoproject.com/en/dev/topics/security/#user-uploaded-content-security), but in short you should take care to do one of two things-- - -* Serve all user-uploaded assets from a *separate* domain or CDN (*not* a subdomain of the one you already have!). For example, you may be browsing `reddit.com` but note that all the user-submitted images are being served from the `redd.it` domain. There are both security and performance benefits to this (webservers tend to load local resources one-by-one, whereas they will request external resources in bulk). -* If you don't want to pay for a second domain, don't understand what any of this means or can't be bothered with additional infrastructure, then simply reprocess user images upon receipt using an image library. Convert them to a different format, for example. *Destroy the originals!* - -### Disable the web interface -The web interface allows visitors to see an informational page as well as log into a browser-based -telnet client with which to access Evennia. It also provides authentication endpoints against which an attacker can attempt to validate stolen lists of credentials to see which ones might be shared by your users. Django's security is robust, but if you don't want/need these features and fully intend to force your users to use traditional clients to access your game, you might consider disabling either/both to minimize your attack surface. - -In `server/conf/settings.py`: - - # Disable the Javascript webclient - WEBCLIENT_ENABLED = False - # Disable the website altogether - WEBSERVER_ENABLED = False - -### Change your ssh port -Automated attacks will often target port 22 seeing as how it's the standard port for SSH traffic. Also, -many public wifi hotspots block ssh traffic over port 22 so you might not be able to access your -server from these locations if you like to work remotely or don't have a home internet connection. - -If you don't intend on running a website or securing it with TLS, you can mitigate both problems by changing the port used for ssh to 443, which most/all hotspot providers assume is HTTPS traffic and allows through. - -(Ubuntu) In /etc/ssh/sshd_config, change the following variable: - - # What ports, IPs and protocols we listen for - Port 443 - -Save, close, then run the following command: - - sudo service ssh restart - -### Set up a firewall -Ubuntu users can make use of the simple ufw utility. Anybody else can use iptables. - - # Install ufw (if not already) - sudo apt-get install ufw - -UFW's default policy is to deny everything. We must specify what we want to allow through our firewall. - - # Allow terminal connections to your game - sudo ufw allow 4000/tcp - # Allow browser connections to your website - sudo ufw allow 4001/tcp - -Use ONE of the next two commands depending on which port your ssh daemon is listening on: - - sudo ufw allow 22/tcp - sudo ufw allow 443/tcp - -Finally: - - sudo ufw enable - -Now the only ports open will be your administrative ssh port (whichever you chose), and Evennia on 4000-4001. - -### Use an external webserver -Though not officially supported, there are some benefits to [deploying a webserver](./Apache-Config) to handle/proxy traffic to your Evennia instance. - -For example, Evennia's game engine and webservice are tightly integrated. If you bring your game down for maintenance (or if it simply crashes) your website will go down with it. In these cases a standalone webserver can still be used to display a maintenance page or otherwise communicate to your users the reason for the downtime, instead of disappearing off the face of the earth and returning opaque `SERVER NOT FOUND` error messages. - -Proper webservers are also written in more efficient programming languages than Python, and while Twisted can handle its own, putting a webserver in front of it is like hiring a bouncer to deal with nuisances and crowds before they even get in the door. - -Many of the popular webservers also let you plug in additional modules (like [mod_security](https://en.wikipedia.org/wiki/ModSecurity) for Apache) that can be used to detect (and block!) malicious users or requests before they even touch your game or site. There are also automated solutions for installing and configuring TLS (via [Certbot/Let's Encrypt](https://en.wikipedia.org/wiki/Let%27s_Encrypt)) to secure your website against hotspot and ISP snooping. \ No newline at end of file diff --git a/docs/0.9.1/_sources/Server-Conf.md.txt b/docs/0.9.1/_sources/Server-Conf.md.txt deleted file mode 100644 index 73d65c0443..0000000000 --- a/docs/0.9.1/_sources/Server-Conf.md.txt +++ /dev/null @@ -1,58 +0,0 @@ -# Server Conf - - -Evennia runs out of the box without any changes to its settings. But there are several important ways to customize the server and expand it with your own plugins. - -## Settings file - -The "Settings" file referenced throughout the documentation is the file `mygame/server/conf/settings.py`. This is automatically created on the first run of `evennia --init` (see the [Getting Started](./Getting-Started) page). - -Your new `settings.py` is relatively bare out of the box. Evennia's core settings file is actually [evennia/settings_default.py](https://github.com/evennia/evennia/blob/master/evennia/settings_default.py) and is considerably more extensive (it is also heavily documented so you should refer to this file directly for the available settings). - -Since `mygame/server/conf/settings.py` is a normal Python module, it simply imports `evennia/settings_default.py` into itself at the top. - -This means that if any setting you want to change were to depend on some *other* default setting, you might need to copy & paste both in order to change them and get the effect you want (for most commonly changed settings, this is not something you need to worry about). - -You should never edit `evennia/settings_default.py`. Rather you should copy&paste the select variables you want to change into your `settings.py` and edit them there. This will overload the previously imported defaults. - -> Warning: It may be tempting to copy everything from `settings_default.py` into your own settings file. There is a reason we don't do this out of the box though: it makes it directly clear what changes you did. Also, if you limit your copying to the things you really need you will directly be able to take advantage of upstream changes and additions to Evennia for anything you didn't customize. - -In code, the settings is accessed through - -```python - from django.conf import settings - # or (shorter): - from evennia import settings - # example: - servername = settings.SERVER_NAME -``` - -Each setting appears as a property on the imported `settings` object. You can also explore all possible options with `evennia.settings_full` (this also includes advanced Django defaults that are not touched in default Evennia). - -> It should be pointed out that when importing `settings` into your code like this, it will be *read only*. You *cannot* edit your settings from your code! The only way to change an Evennia setting is to edit `mygame/server/conf/settings.py` directly. You also generally need to restart the server (possibly also the Portal) before a changed setting becomes available. - -## Other files in the `server/conf` directory - -Apart from the main `settings.py` file, - -- `at_initial_setup.py` - this allows you to add a custom startup method to be called (only) the very first time Evennia starts (at the same time as user #1 and Limbo is created). It can be made to start your own global scripts or set up other system/world-related things your game needs to have running from the start. -- `at_server_startstop.py` - this module contains two functions that Evennia will call every time the Server starts and stops respectively - this includes stopping due to reloading and resetting as well as shutting down completely. It's a useful place to put custom startup code for handlers and other things that must run in your game but which has no database persistence. -- `connection_screens.py` - all global string variables in this module are interpreted by Evennia as a greeting screen to show when an Account first connects. If more than one string variable is present in the module a random one will be picked. -- `inlinefuncs.py` - this is where you can define custom [Inline functions](./TextTags#inlinefuncs). -- `inputfuncs.py` - this is where you define custom [Input functions](./Inputfuncs) to handle data from the client. -- `lockfuncs.py` - this is one of many possible modules to hold your own "safe" *lock functions* to make available to Evennia's [Locks](./Locks). -- `mssp.py` - this holds meta information about your game. It is used by MUD search engines (which you often have to register with) in order to display what kind of game you are running along with - statistics such as number of online accounts and online status. -- `oobfuncs.py` - in here you can define custom [OOB functions](./OOB). -- `portal_services_plugin.py` - this allows for adding your own custom services/protocols to the Portal. It must define one particular function that will be called by Evennia at startup. There can be any number of service plugin modules, all will be imported and used if defined. More info can be found [here](http://code.google.com/p/evennia/wiki/SessionProtocols#Adding_custom_Protocols). -- `server_services_plugin.py` - this is equivalent to the previous one, but used for adding new services to the Server instead. More info can be found [here](http://code.google.com/p/evennia/wiki/SessionProtocols#Adding_custom_Protocols). - -Some other Evennia systems can be customized by plugin modules but has no explicit template in `conf/`: - -- *cmdparser.py* - a custom module can be used to totally replace Evennia's default command parser. All this does is to split the incoming string into "command name" and "the rest". It also handles things like error messages for no-matches and multiple-matches among other things that makes this more complex than it sounds. The default parser is *very* generic, so you are most often best served by modifying things further down the line (on the command parse level) than here. -- *at_search.py* - this allows for replacing the way Evennia handles search results. It allows to change how errors are echoed and how multi-matches are resolved and reported (like how the default understands that "2-ball" should match the second "ball" object if there are two of them in the room). - -## ServerConf - -There is a special database model called `ServerConf` that stores server internal data and settings such as current account count (for interfacing with the webserver), startup status and many other things. It's rarely of use outside the server core itself but may be good to -know about if you are an Evennia developer. diff --git a/docs/0.9.1/_sources/Sessions.md.txt b/docs/0.9.1/_sources/Sessions.md.txt deleted file mode 100644 index 719f3a08a4..0000000000 --- a/docs/0.9.1/_sources/Sessions.md.txt +++ /dev/null @@ -1,101 +0,0 @@ -# Sessions - - -An Evennia *Session* represents one single established connection to the server. Depending on the Evennia session, it is possible for a person to connect multiple times, for example using different clients in multiple windows. Each such connection is represented by a session object. - -A session object has its own [cmdset](./Command-Sets), usually the "unloggedin" cmdset. This is what is used to show the login screen and to handle commands to create a new account (or [Account](./Accounts) in evennia lingo) read initial help and to log into the game with an existing account. A session object can either be "logged in" or not. Logged in means that the user has authenticated. When this happens the session is associated with an Account object (which is what holds account-centric stuff). The account can then in turn puppet any number of objects/characters. - -> Warning: A Session is not *persistent* - it is not a [Typeclass](./Typeclasses) and has no connection to the database. The Session will go away when a user disconnects and you will lose any custom data on it if the server reloads. The `.db` handler on Sessions is there to present a uniform API (so you can assume `.db` exists even if you don't know if you receive an Object or a Session), but this is just an alias to `.ndb`. So don't store any data on Sessions that you can't afford to lose in a reload. You have been warned. - -## Properties on Sessions - -Here are some important properties available on (Server-)Sessions - -- `sessid` - The unique session-id. This is an integer starting from 1. -- `address` - The connected client's address. Different protocols give different information here. -- `logged_in` - `True` if the user authenticated to this session. -- `account` - The [Account](./Accounts) this Session is attached to. If not logged in yet, this is `None`. -- `puppet` - The [Character/Object](./Objects) currently puppeted by this Account/Session combo. If not logged in or in OOC mode, this is `None`. -- `ndb` - The [Non-persistent Attribute](./Attributes) handler. -- `db` - As noted above, Sessions don't have regular Attributes. This is an alias to `ndb`. -- `cmdset` - The Session's [CmdSetHandler](./Command-Sets) - -Session statistics are mainly used internally by Evennia. - -- `conn_time` - How long this Session has been connected -- `cmd_last` - Last active time stamp. This will be reset by sending `idle` keepalives. -- `cmd_last_visible` - last active time stamp. This ignores `idle` keepalives and representes the last time this session was truly visibly active. -- `cmd_total` - Total number of Commands passed through this Session. - - -## Multisession mode - -The number of sessions possible to connect to a given account at the same time and how it works is given by the `MULTISESSION_MODE` setting: - -* `MULTISESSION_MODE=0`: One session per account. When connecting with a new session the old one is disconnected. This is the default mode and emulates many classic mud code bases. In default Evennia, this mode also changes how the `create account` Command works - it will automatically create a Character with the *same name* as the Account. When logging in, the login command is also modified to have the player automatically puppet that Character. This makes the distinction between Account and Character minimal from the player's perspective. -* `MULTISESSION_MODE=1`: Many sessions per account, input/output from/to each session is treated the same. For the player this means they can connect to the game from multiple clients and see the same output in all of them. The result of a command given in one client (that is, through one Session) will be returned to *all* connected Sessions/clients with no distinction. This mode will have the Session(s) auto-create and puppet a Character in the same way as mode 0. -* `MULTISESSION_MODE=2`: Many sessions per account, one character per session. In this mode, puppeting an Object/Character will link the puppet back only to the particular Session doing the puppeting. That is, input from that Session will make use of the CmdSet of that Object/Character and outgoing messages (such as the result of a `look`) will be passed back only to that puppeting Session. If another Session tries to puppet the same Character, the old Session will automatically un-puppet it. From the player's perspective, this will mean that they can open separate game clients and play a different Character in each using one game account. -This mode will *not* auto-create a Character and *not* auto-puppet on login like in modes 0 and 1. Instead it changes how the account-cmdsets's `OOCLook` command works so as to show a simple 'character select' menu. -* `MULTISESSION_MODE=3`: Many sessions per account *and* character. This is the full multi-puppeting mode, where multiple sessions may not only connect to the player account but multiple sessions may also puppet a single character at the same time. From the user's perspective it means one can open multiple client windows, some for controlling different Characters and some that share a Character's input/output like in mode 1. This mode otherwise works the same as mode 2. - -> Note that even if multiple Sessions puppet one Character, there is only ever one instance of that Character. - -## Returning data to the session - -When you use `msg()` to return data to a user, the object on which you call the `msg()` matters. The `MULTISESSION_MODE` also matters, especially if greater than 1. - -For example, if you use `account.msg("hello")` there is no way for evennia to know which session it should send the greeting to. In this case it will send it to all sessions. If you want a specific session you need to supply its session to the `msg` call (`account.msg("hello", session=mysession)`). - -On the other hand, if you call the `msg()` message on a puppeted object, like `character.msg("hello")`, the character already knows the session that controls it - it will cleverly auto-add this for you (you can specify a different session if you specifically want to send stuff to another session). - -Finally, there is a wrapper for `msg()` on all command classes: `command.msg()`. This will transparently detect which session was triggering the command (if any) and redirects to that session (this is most often what you want). If you are having trouble redirecting to a given session, `command.msg()` is often the safest bet. - -You can get the `session` in two main ways: -* [Accounts](./Accounts) and [Objects](./Objects) (including Characters) have a `sessions` property. This is a *handler* that tracks all Sessions attached to or puppeting them. Use e.g. `accounts.sessions.get()` to get a list of Sessions attached to that entity. -* A Command instance has a `session` property that always points back to the Session that triggered it (it's always a single one). It will be `None` if no session is involved, like when a mob or script triggers the Command. - -## Customizing the Session object - -When would one want to customize the Session object? Consider for example a character creation system: You might decide to keep this on the out-of-character level. This would mean that you create the character at the end of some sort of menu choice. The actual char-create cmdset would then normally be put on the account. This works fine as long as you are `MULTISESSION_MODE` below 2. For higher modes, replacing the Account cmdset will affect *all* your connected sessions, also those not involved in character creation. In this case you want to instead put the char-create cmdset on the Session level - then all other sessions will keep working normally despite you creating a new character in one of them. - -By default, the session object gets the `commands.default_cmdsets.UnloggedinCmdSet` when the user first connects. Once the session is authenticated it has *no* default sets. To add a "logged-in" cmdset to the Session, give the path to the cmdset class with `settings.CMDSET_SESSION`. This set will then henceforth always be present as soon as the account logs in. - -To customize further you can completely override the Session with your own subclass. To replace the -default Session class, change `settings.SERVER_SESSION_CLASS` to point to your custom class. This is -a dangerous practice and errors can easily make your game unplayable. Make sure to take heed of the -[original](https://github.com/evennia/evennia/blob/master/evennia/server/session.py) and make your -changes carefully. - -## Portal and Server Sessions - -*Note: This is considered an advanced topic. You don't need to know this on a first read-through.* - -Evennia is split into two parts, the [Portal and the Server](./Portal-And-Server). Each side tracks its own Sessions, syncing them to each other. - -The "Session" we normally refer to is actually the `ServerSession`. Its counter-part on the Portal side is the `PortalSession`. Whereas the server sessions deal with game states, the portal session deals with details of the connection-protocol itself. The two are also acting as backups of critical data such as when the server reboots. - -New Account connections are listened for and handled by the Portal using the [protocols](./Portal-And-Server) it understands (such as telnet, ssh, webclient etc). When a new connection is established, a `PortalSession` is created on the Portal side. This session object looks different depending on which protocol is used to connect, but all still have a minimum set of attributes that are generic to all -sessions. - -These common properties are piped from the Portal, through the AMP connection, to the Server, which is now informed a new connection has been established. On the Server side, a `ServerSession` object is created to represent this. There is only one type of `ServerSession`; It looks the same regardless of how the Account connects. - -From now on, there is a one-to-one match between the `ServerSession` on one side of the AMP connection and the `PortalSession` on the other. Data arriving to the Portal Session is sent on to its mirror Server session and vice versa. - -During certain situations, the portal- and server-side sessions are -"synced" with each other: -- The Player closes their client, killing the Portal Session. The Portal syncs with the Server to make sure the corresponding Server Session is also deleted. -- The Player quits from inside the game, killing the Server Session. The Server then syncs with the Portal to make sure to close the Portal connection cleanly. -- The Server is rebooted/reset/shutdown - The Server Sessions are copied over ("saved") to the Portal side. When the Server comes back up, this data is returned by the Portal so the two are again in sync. This way an Account's login status and other connection-critical things can survive a server reboot (assuming the Portal is not stopped at the same time, obviously). - -## Sessionhandlers - -Both the Portal and Server each have a *sessionhandler* to manage the connections. These handlers are global entities contain all methods for relaying data across the AMP bridge. All types of Sessions hold a reference to their respective Sessionhandler (the property is called `sessionhandler`) so they can relay data. See [protocols](./Custom-Protocols) for more info -on building new protocols. - -To get all Sessions in the game (i.e. all currently connected clients), you access the server-side Session handler, which you get by -``` -from evennia.server.sessionhandler import SESSION_HANDLER -``` -> Note: The `SESSION_HANDLER` singleton has an older alias `SESSIONS` that is commonly seen in various places as well. - -See the [sessionhandler.py](https://github.com/evennia/evennia/blob/master/evennia/server/sessionhandler.py) module for details on the capabilities of the `ServerSessionHandler`. diff --git a/docs/0.9.1/_sources/Tags.md.txt b/docs/0.9.1/_sources/Tags.md.txt deleted file mode 100644 index 682b778e28..0000000000 --- a/docs/0.9.1/_sources/Tags.md.txt +++ /dev/null @@ -1,126 +0,0 @@ -# Tags - - -A common task of a game designer is to organize and find groups of objects and do operations on them. A classic example is to have a weather script affect all "outside" rooms. Another would be for a player casting a magic spell that affects every location "in the dungeon", but not those "outside". Another would be to quickly find everyone joined with a particular guild or everyone currently dead. - -*Tags* are short text labels that you attach to objects so as to easily be able to retrieve and group them. An Evennia entity can be tagged with any number of Tags. On the database side, Tag entities are *shared* between all objects with that tag. This makes them very efficient but also fundamentally different from [Attributes](./Attributes), each of which always belongs to one *single* object. - -In Evennia, Tags are technically also used to implement `Aliases` (alternative names for objects) and `Permissions` (simple strings for [Locks](./Locks) to check for). - - -## Properties of Tags (and Aliases and Permissions) - -Tags are *unique*. This means that there is only ever one Tag object with a given key and category. - -> Not specifying a category (default) gives the tag a category of `None`, which is also considered a unique key + category combination. - -When Tags are assigned to game entities, these entities are actually sharing the same Tag. This means that Tags are not suitable for storing information about a single object - use an [Attribute](./Attributes) for this instead. Tags are a lot more limited than Attributes but this also makes them very quick to lookup in the database - this is the whole point. - -Tags have the following properties, stored in the database: - -- **key** - the name of the Tag. This is the main property to search for when looking up a Tag. -- **category** - this category allows for retrieving only specific subsets of tags used for different purposes. You could have one category of tags for "zones", another for "outdoor locations", for example. If not given, the category will be `None`, which is also considered a separate, default, category. -- **data** - this is an optional text field with information about the tag. Remember that Tags are shared between entities, so this field cannot hold any object-specific information. Usually it would be used to hold info about the group of entities the Tag is tagging - possibly used for contextual help like a tool tip. It is not used by default. - -There are also two special properties. These should usually not need to be changed or set, it is used internally by Evennia to implement various other uses it makes of the `Tag` object: -- **model** - this holds a *natural-key* description of the model object that this tag deals with, on the form *application.modelclass*, for example `objects.objectdb`. It used by the TagHandler of each entity type for correctly storing the data behind the scenes. -- **tagtype** - this is a "top-level category" of sorts for the inbuilt children of Tags, namely *Aliases* and *Permissions*. The Taghandlers using this special field are especially intended to free up the *category* property for any use you desire. - -## Adding/Removing Tags - -You can tag any *typeclassed* object, namely [Objects](./Objects), [Accounts](./Accounts), [Scripts](./Scripts) and [Channels](./Communications). General tags are added by the *Taghandler*. The tag handler is accessed as a property `tags` on the relevant entity: - -```python - mychair.tags.add("furniture") - mychair.tags.add("furniture", category="luxurious") - myroom.tags.add("dungeon#01") - myscript.tags.add("weather", category="climate") - myaccount.tags.add("guestaccount") - - mychair.tags.all() # returns a list of Tags - mychair.tags.remove("furniture") - mychair.tags.clear() -``` - -Adding a new tag will either create a new Tag or re-use an already existing one. Note that there are _two_ "furniture" tags, one with a `None` category, and one with the "luxurious" category. - -When using `remove`, the `Tag` is not deleted but are just disconnected from the tagged object. This makes for very quick operations. The `clear` method removes (disconnects) all Tags from the object. You can also use the default `@tag` command: - - @tag mychair = furniture - -This tags the chair with a 'furniture' Tag (the one with a `None` category). - -## Searching for objects with a given tag - -Usually tags are used as a quick way to find tagged database entities. You can retrieve all objects with a given Tag like this in code: - -```python - import evennia - - # all methods return Querysets - - # search for objects - objs = evennia.search_tag("furniture") - objs2 = evennia.search_tag("furniture", category="luxurious") - dungeon = evennia.search_tag("dungeon#01") - forest_rooms = evennia.search_tag(category="forest") - forest_meadows = evennia.search_tag("meadow", category="forest") - magic_meadows = evennia.search_tag("meadow", category="magical") - - # search for scripts - weather = evennia.search_tag_script("weather") - climates = evennia.search_tag_script(category="climate") - - # search for accounts - accounts = evennia.search_tag_account("guestaccount") -``` - -> Note that searching for just "furniture" will only return the objects tagged with the "furniture" tag that -has a category of `None`. We must explicitly give the category to get the "luxurious" furniture. - -Using any of the `search_tag` variants will all return [Django Querysets](https://docs.djangoproject.com/en/2.1/ref/models/querysets/), including if you only have one match. You can treat querysets as lists and iterate over them, or continue building search queries with them. - -Remember when searching that not setting a category means setting it to `None` - this does *not* mean that category is undefined, rather `None` is considered the default, unnamed category. - -```python -import evennia - -myobj1.tags.add("foo") # implies category=None -myobj2.tags.add("foo", category="bar") - -# this returns a queryset with *only* myobj1 -objs = evennia.search_tag("foo") - -# these return a queryset with *only* myobj2 -objs = evennia.search_tag("foo", category="bar") -# or -objs = evennia.search_tag(category="bar") - -``` - - - -There is also an in-game command that deals with assigning and using ([Object-](./Objects)) tags: - - @tag/search furniture - -## Using Aliases and Permissions - -Aliases and Permissions are implemented using normal TagHandlers that simply save Tags with a different `tagtype`. These handlers are named `aliases` and `permissions` on all Objects. They are used in the same way as Tags above: - -```python - boy.aliases.add("rascal") - boy.permissions.add("Builders") - boy.permissions.remove("Builders") - - all_aliases = boy.aliases.all() -``` - -and so on. Similarly to how `@tag` works in-game, there is also the `@perm` command for assigning permissions and `@alias` command for aliases. - -## Assorted notes - -Generally, tags are enough on their own for grouping objects. Having no tag `category` is perfectly fine and the normal operation. Simply adding a new Tag for grouping objects is often better than making a new category. So think hard before deciding you really need to categorize your Tags. - -That said, tag categories can be useful if you build some game system that uses tags. You can then use tag categories to make sure to separate tags created with this system from any other tags created elsewhere. You can then supply custom search methods that *only* find objects tagged with tags of that category. An example of this -is found in the [Zone tutorial](./Zones). diff --git a/docs/0.9.1/_sources/TextTags.md.txt b/docs/0.9.1/_sources/TextTags.md.txt deleted file mode 100644 index bf1b2278c9..0000000000 --- a/docs/0.9.1/_sources/TextTags.md.txt +++ /dev/null @@ -1,234 +0,0 @@ -# TextTags - - -This documentation details the various text tags supported by Evennia, namely *colours*, *command links* and *inline functions*. - -There is also an [Understanding Color Tags](./Understanding-Color-Tags) tutorial which expands on the use of ANSI color tags and the pitfalls of mixing ANSI and Xterms256 color tags in the same context. - -## Coloured text - -*Note that the Documentation does not display colour the way it would look on the screen.* - -Color can be a very useful tool for your game. It can be used to increase readability and make your game more appealing visually. - -Remember however that, with the exception of the webclient, you generally don't control the client used to connect to the game. There is, for example, one special tag meaning "yellow". But exactly *which* hue of yellow is actually displayed on the user's screen depends on the settings of their particular mud client. They could even swap the colours around or turn them off altogether if so desired. Some clients don't even support color - text games are also played with special reading equipment by people who are blind or have otherwise diminished eyesight. - -So a good rule of thumb is to use colour to enhance your game but don't *rely* on it to display critical information. If you are coding the game, you can add functionality to let users disable colours as they please, as described [here](./Manually-Configuring-Color). - -To see which colours your client support, use the default `@color` command. This will list all available colours for ANSI and Xterm256 along with the codes you use for them. You can find a list of all the parsed `ANSI`-colour codes in `evennia/utils/ansi.py`. - -### ANSI colours - -Evennia supports the `ANSI` standard for text. This is by far the most supported MUD-color standard, available in all but the most ancient mud clients. The ANSI colours are **r**ed, **g**reen, **y**ellow, **b**lue, **m**agenta, **c**yan, **w**hite and black. They are abbreviated by their first letter except for black which is abbreviated with the letter **x**. In ANSI there are "bright" and "normal" (darker) versions of each color, adding up to a total of 16 colours to use for foreground text. There are also 8 "background" colours. These have no bright alternative in ANSI (but Evennia uses the [Xterm256](./TextTags#xterm256-colours) extension behind the scenes to offer them anyway). - -To colour your text you put special tags in it. Evennia will parse these and convert them to the correct markup for the client used. If the user's client/console/display supports ANSI colour, they will see the text in the specified colour, otherwise the tags will be stripped (uncolored text). This works also for non-terminal clients, such as the webclient. For the webclient, Evennia will translate the codes to HTML RGB colors. - -Here is an example of the tags in action: - - |rThis text is bright red.|n This is normal text. - |RThis is a dark red text.|n This is normal text. - |[rThis text has red background.|n This is normal text. - |b|[yThis is bright blue text on yellow background.|n This is normal text. - -- `|n` - this tag will turn off all color formatting, including background colors. -- `|#`- markup marks the start of foreground color. The case defines if the text is "bright" or "normal". So `|g` is a bright green and `|G` is "normal" (darker) green. -- `|[#` is used to add a background colour to the text. The case again specifies if it is "bright" or "normal", so `|[c` starts a bright cyan background and `|[C` a darker cyan background. -- `|!#` is used to add foreground color without any enforced brightness/normal information. - These are normal-intensity and are thus always given as uppercase, such as - `|!R` for red. The difference between e.g. `|!R` and `|R` is that - `|!R` will "inherit" the brightness setting from previously set color tags, whereas `|R` will always reset to the normal-intensity red. The `|#` format contains an implicit `|h`/`|H` tag in it: disabling highlighting when switching to a normal color, and enabling it for bright ones. So `|btest |!Rtest2` will result in a bright red `test2` since the brightness setting from `|b` "bleeds over". You could use this to for example quickly switch the intensity of a multitude of color tags. There is no background-color equivalent to `|!` style tags. -- `|h` is used to make any following foreground ANSI colors bright (it has no effect on Xterm colors). This is only relevant to use with `|!` type tags and will be valid until the next `|n`, `|H` or normal (upper-case) `|#` tag. This tag will never affect background colors, those have to be set bright/normal explicitly. Technically, `|h|!G` is identical to `|g`. -- `|H` negates the effects `|h` and returns all ANSI foreground colors (`|!` and `|` types) to 'normal' intensity. It has no effect on background and Xterm colors. - -> Note: The ANSI standard does not actually support bright backgrounds like `|[r` - the standard only supports "normal" intensity backgrounds. To get around this Evennia instead implements these as [Xterm256 colours](./TextTags#xterm256-colours) behind the scenes. If the client does not support Xterm256 the ANSI colors will be used instead and there will be no visible difference between using upper- and lower-case background tags. - -If you want to display an ANSI marker as output text (without having any effect), you need to escape it by preceding its `|` with another `|`: - -``` -say The ||r ANSI marker changes text color to bright red. -``` - -This will output the raw `|r` without any color change. This can also be necessary if you are doing ansi art that uses `|` with a letter directly following it. - -Use the command - - @color ansi - -to get a list of all supported ANSI colours and the tags used to produce them. - -A few additional ANSI codes are supported: - -- `|/` A line break. You cannot put the normal Python `\n` line breaks in text entered inside the game (Evennia will filter this for security reasons). This is what you use instead: use the `|/` marker to format text with line breaks from the game command line. -- `` This will translate into a `TAB` character. This will not always show (or show differently) to the client since it depends on their local settings. It's often better to use multiple spaces. -- `|_` This is a space. You can usually use the normal space character, but if the space is *at the end of the line*, Evennia will likely crop it. This tag will not be cropped but always result in a space. -- `|*` This will invert the current text/background colours. Can be useful to mark things (but see below). - -##### Caveats of `|*` - -The `|*` tag (inverse video) is an old ANSI standard and should usually not be used for more than to mark short snippets of text. If combined with other tags it comes with a series of potentially confusing behaviors: - -* The `|*` tag will only work once in a row:, ie: after using it once it won't have an effect again until you declare another tag. This is an example: - - ``` - Normal text, |*reversed text|*, still reversed text. - ``` - - that is, it will not reverse to normal at the second `|*`. You need to reset it manually: - - ``` - Normal text, |*reversed text|n, normal again. - ``` - -* The `|*` tag does not take "bright" colors into account: - - ``` - |RNormal red, |hnow brightened. |*BG is normal red. - ``` - - So `|*` only considers the 'true' foreground color, ignoring any highlighting. Think of the bright state (`|h`) as something like like `` in HTML: it modifies the _appearance_ of a normal foreground color to match its bright counterpart, without changing its normal color. -* Finally, after a `|*`, if the previous background was set to a dark color (via `|[`), `|!#`) will actually change the background color instead of the foreground: - - ``` - |*reversed text |!R now BG is red. - ``` -For a detailed explanation of these caveats, see the [Understanding Color Tags](./Understanding-Color-Tags) tutorial. But most of the time you might be better off to simply avoid `|*` and mark your text manually instead. - -### Xterm256 Colours - -The _Xterm256_ standard is a colour scheme that supports 256 colours for text and/or background. While this offers many more possibilities than traditional ANSI colours, be wary that too many text colors will be confusing to the eye. Also, not all clients support Xterm256 - these will instead see the closest equivalent ANSI color. You can mix Xterm256 tags with ANSI tags as you please. - - |555 This is pure white text.|n This is normal text. - |230 This is olive green text. - |[300 This text has a dark red background. - |005|[054 This is dark blue text on a bright cyan background. - |=a This is a greyscale value, equal to black. - |=m This is a greyscale value, midway between white and black. - |=z This is a greyscale value, equal to white. - |[=m This is a background greyscale value. - -- `|###` - markup consists of three digits, each an integer from 0 to 5. The three digits describe the amount of **r**ed, **g**reen and **b**lue (RGB) components used in the colour. So `|500` means maximum red and none of the other colours - the result is a bright red. `|520` is red with a touch of green - the result is orange. As opposed to ANSI colors, Xterm256 syntax does not worry about bright/normal intensity, a brighter (lighter) color is just achieved by upping all RGB values with the same amount. -- `|[###` - this works the same way but produces a coloured background. -- `|=#` - markup produces the xterm256 gray scale tones, where `#` is a letter from `a` (black) to `z` (white). This offers many more nuances of gray than the normal `|###` markup (which only has four gray tones between solid black and white (`|000`, `|111`, `|222`, `|333` and `|444`)). -- `|[=#` - this works in the same way but produces background gray scale tones. - -If you have a client that supports Xterm256, you can use - - @color xterm256 - -to get a table of all the 256 colours and the codes that produce them. If the table looks broken up into a few blocks of colors, it means Xterm256 is not supported and ANSI are used as a replacement. You can use the `@options` command to see if xterm256 is active for you. This depends on if your client told Evennia what it supports - if not, and you know what your client supports, you may have to activate some features manually. - -## Clickable links - -Evennia supports clickable links for clients that supports it. This marks certain text so it can be clicked by a mouse and trigger a given Evennia command. To support clickable links, Evennia requires the webclient or an third-party telnet client with [MXP](http://www.zuggsoft.com/zmud/mxp.htm) support (*Note: Evennia only supports clickable links, no other MXP features*). - - - `|lc` to start the link, by defining the command to execute. - - `|lt` to continue with the text to show to the user (the link text). - - `|le` to end the link text and the link definition. - -All elements must appear in exactly this order to make a valid link. For example, - -``` -"If you go |lcnorth|ltto the north|le you will find a cottage." -``` - -This will display as "If you go __to the north__ you will find a cottage." where clicking the link will execute the command `north`. If the client does not support clickable links, only the link text will be shown. - -## Inline functions - -> Note: Inlinefuncs are **not** activated by default. To use them you need to add `INLINEFUNC_ENABLED=True` to your settings file. - -Evennia has its own inline text formatting language, known as *inlinefuncs*. It allows the builder to include special function calls in code. They are executed dynamically by each session that receives them. - -To add an inlinefunc, you embed it in a text string like this: - -``` -"A normal string with $funcname(arg, arg, ...) embedded inside it." -``` - -When this string is sent to a session (with the `msg()` method), these embedded inlinefuncs will be parsed. Their return value (which always is a string) replace their call location in the finalized string. The interesting thing with this is that the function called will have access to which session is seeing the string, meaning the string can end up looking different depending on who is looking. It could of course also vary depending on other factors like game time. - -Any number of comma-separated arguments can be given (or none). No keywords are supported. You can also nest inlinefuncs by letting an argument itself also be another `$funcname(arg, arg, ...)` call (down to any depth of nesting). Function call resolution happens as in all programming languages inside-out, with the nested calls replacing the argument with their return strings before calling he parent. - -``` - > say "This is $pad(a center-padded text, 30,c,-) of width 30." - You say, "This is ---- a center-padded text----- of width 30." -``` - -A special case happens if wanting to use an inlinefunc argument that itself includes a comma - this would be parsed as an argument separator. To escape commas you can either escape each comma manually with a backslash `\,`, or you can embed the entire string in python triple-quotes `"""` or `'''` - this will escape the entire argument, including commas and any nested inlinefunc calls within. - -Only certain functions are available to use as inlinefuncs and the game developer may add their own functions as needed. - -### New inlinefuncs - -To add new inlinefuncs, edit the file `mygame/server/conf/inlinefuncs.py`. - -*All globally defined functions in this module* are considered inline functions by the system. The only exception is functions whose name starts with an underscore `_`. An inlinefunc must be of the following form: - -```python -def funcname(*args, **kwargs): - # ... - return modified_text -``` - -where `*args` denotes all the arguments this function will accept as an `$inlinefunc`. The inline function is expected to clean arguments and check that they are valid. If needed arguments are not given, default values should be used. The function should always return a string (even if it's empty). An inlinefunc should never cause a traceback regardless of the input (but it could log errors if desired). - -Note that whereas the function should accept `**kwargs`, keyword inputs are *not* usable in the call to the inlinefunction. The `kwargs` part is instead intended for Evennia to be able to supply extra information. Currently Evennia sends a single keyword to every inline function and that is `session`, which holds the [serversession](./Sessions) this text is targeted at. Through the session object, a lot of dynamic possibilities are opened up for your inline functions. - -The `settings.INLINEFUNC_MODULES` configuration option is a list that decides which modules should be parsed for inline function definitions. This will include `mygame/server/conf/inlinefuncs.py` but more could be added. The list is read from left to right so if you want to overload default functions you just have to put your custom module-paths later in the list and name your functions the same as default ones. - -Here is an example, the `crop` default inlinefunction: - -```python -from evennia.utils import utils - -def crop(*args, **kwargs): - """ - Inlinefunc. Crops ingoing text to given widths. - Args: - text (str, optional): Text to crop. - width (str, optional): Will be converted to an integer. Width of - crop in characters. - suffix (str, optional): End string to mark the fact that a part - of the string was cropped. Defaults to `[...]`. - Kwargs: - session (Session): Session performing the crop. - Example: - `$crop(text, 50, [...])` - - """ - text, width, suffix = "", 78, "[...]" - nargs = len(args) - if nargs > 0: - text = args[0] - if nargs > 1: - width = int(args[1]) if args[1].strip().isdigit() else 78 - if nargs > 2: - suffix = args[2] - return utils.crop(text, width=width, suffix=suffix) -``` -Another example, making use of the Session: - -```python -def charactername(*args, **kwargs): - """ - Inserts the character name of whomever sees the string - (so everyone will see their own name). Uses the account - name for OOC communications. - - Example: - say "This means YOU, $charactername()!" - - """ - session = kwargs["session"] - if session.puppet: - return kwargs["session"].puppet.key - else: - return session.account.key -``` - -Evennia itself offers the following default inline functions (mostly as examples): - -* `crop(text, width, suffix)` - See above. -* `pad(text, width, align, fillchar)` - this pads the text to `width` (default 78), alignment ("c", "l" or "r", defaulting to "c") and fill-in character (defaults to space). Example: `$pad(40,l,-)` -* `clr(startclr, text, endclr)` - A programmatic way to enter colored text for those who don't want to use the normal `|c` type color markers for some reason. The `color` argument is the same as the color markers except without the actual pre-marker, so `|r` would be just `r`. If `endclr` is not given, it defaults to resetting the color (`n`). Example: `$clr(b, A blue text)` -* `space(number)` - Inserts the given number of spaces. If no argument is given, use 4 spaces. \ No newline at end of file diff --git a/docs/0.9.1/_sources/TickerHandler.md.txt b/docs/0.9.1/_sources/TickerHandler.md.txt deleted file mode 100644 index a572b89109..0000000000 --- a/docs/0.9.1/_sources/TickerHandler.md.txt +++ /dev/null @@ -1,94 +0,0 @@ -# TickerHandler - - -One way to implement a dynamic MUD is by using "tickers", also known as "heartbeats". A ticker is a timer that fires ("ticks") at a given interval. The tick triggers updates in various game systems. - -## About Tickers - -Tickers are very common or even unavoidable in other mud code bases. Certain code bases are even hard-coded to rely on the concept of the global 'tick'. Evennia has no such notion - the decision to use tickers is very much up to the need of your game and which requirements you have. The "ticker recipe" is just one way of cranking the wheels. - -The most fine-grained way to manage the flow of time is of course to use [Scripts](./Scripts). Many types of operations (weather being the classic example) are however done on multiple objects in the same way at regular intervals, and for this, storing separate Scripts on each object is inefficient. The way to do this is to use a ticker with a "subscription model" - let objects sign up to be triggered at the same interval, unsubscribing when the updating is no longer desired. - -Evennia offers an optimized implementation of the subscription model - the *TickerHandler*. This is a singleton global handler reachable from `evennia.TICKER_HANDLER`. You can assign any *callable* (a function or, more commonly, a method on a database object) to this handler. The TickerHandler will then call this callable at an interval you specify, and with the arguments you supply when adding it. This continues until the callable un-subscribes from the ticker. The handler survives a reboot and is highly optimized in resource usage. - -Here is an example of importing `TICKER_HANDLER` and using it: - -```python - # we assume that obj has a hook "at_tick" defined on itself - from evennia import TICKER_HANDLER as tickerhandler - - tickerhandler.add(20, obj.at_tick) -``` - -That's it - from now on, `obj.at_tick()` will be called every 20 seconds. - -You can also import function and tick that: - -```python - from evennia import TICKER_HANDLER as tickerhandler - from mymodule import myfunc - - tickerhandler.add(30, myfunc) -``` - -Removing (stopping) the ticker works as expected: - -```python - tickerhandler.remove(20, obj.at_tick) - tickerhandler.remove(30, myfunc) -``` - -Note that you have to also supply `interval` to identify which subscription to remove. This is because the TickerHandler maintains a pool of tickers and a given callable can subscribe to be ticked at any number of different intervals. - -The full definition of the `tickerhandler.add` method is - -```python - tickerhandler.add(interval, callback, - idstring="", persistent=True, *args, **kwargs) -``` - -Here `*args` and `**kwargs` will be passed to `callback` every `interval` seconds. If `persistent` is `False`, this subscription will not survive a server reload. - -Tickers are identified and stored by making a key of the callable itself, the ticker-interval, the `persistent` flag and the `idstring` (the latter being an empty string when not given explicitly). - -Since the arguments are not included in the ticker's identification, the `idstring` must be used to have a specific callback triggered multiple times on the same interval but with different arguments: - -```python - tickerhandler.add(10, obj.update, "ticker1", True, 1, 2, 3) - tickerhandler.add(10, obj.update, "ticker2", True, 4, 5) -``` - -> Note that, when we want to send arguments to our callback within a ticker handler, we need to specify `idstring` and `persistent` before, unless we call our arguments as keywords, which would often be more readable: - -```python - tickerhandler.add(10, obj.update, caller=self, value=118) -``` - -If you add a ticker with exactly the same combination of callback, interval and idstring, it will overload the existing ticker. This identification is also crucial for later removing (stopping) the subscription: - -```python - tickerhandler.remove(10, obj.update, idstring="ticker1") - tickerhandler.remove(10, obj.update, idstring="ticker2") -``` - -The `callable` can be on any form as long as it accepts the arguments you give to send to it in `TickerHandler.add`. - -> Note that everything you supply to the TickerHandler will need to be pickled at some point to be saved into the database. Most of the time the handler will correctly store things like database objects, but the same restrictions as for [Attributes](./Attributes) apply to what the TickerHandler may store. - -When testing, you can stop all tickers in the entire game with `tickerhandler.clear()`. You can also view the currently subscribed objects with `tickerhandler.all()`. - -See the [Weather Tutorial](./Weather-Tutorial) for an example of using the TickerHandler. - -### When *not* to use TickerHandler - -Using the TickerHandler may sound very useful but it is important to consider when not to use it. Even if you are used to habitually relying on tickers for everything in other code bases, stop and think about what you really need it for. This is the main point: - -> You should *never* use a ticker to catch *changes*. - -Think about it - you might have to run the ticker every second to react to the change fast enough. Most likely nothing will have changed at a given moment. So you are doing pointless calls (since skipping the call gives the same result as doing it). Making sure nothing's changed might even be computationally expensive depending on the complexity of your system. Not to mention that you might need to run the check *on every object in the database*. Every second. Just to maintain status quo ... - -Rather than checking over and over on the off-chance that something changed, consider a more proactive approach. Could you implement your rarely changing system to *itself* report when its status changes? It's almost always much cheaper/efficient if you can do things "on demand". Evennia itself uses hook methods for this very reason. - -So, if you consider a ticker that will fire very often but which you expect to have no effect 99% of the time, consider handling things things some other way. A self-reporting on-demand solution is usually cheaper also for fast-updating properties. Also remember that some things may not need to be updated until someone actually is examining or using them - any interim changes happening up to that moment are pointless waste of computing time. - -The main reason for needing a ticker is when you want things to happen to multiple objects at the same time without input from something else. \ No newline at end of file diff --git a/docs/0.9.1/_sources/Tutorial-Searching-For-Objects.md.txt b/docs/0.9.1/_sources/Tutorial-Searching-For-Objects.md.txt deleted file mode 100644 index 75190242ba..0000000000 --- a/docs/0.9.1/_sources/Tutorial-Searching-For-Objects.md.txt +++ /dev/null @@ -1,295 +0,0 @@ -# Tutorial Searching For Objects - - -You will often want to operate on a specific object in the database. For example when a player attacks a named target you'll need to find that target so it can be attacked. Or when a rain storm draws in you need to find all outdoor-rooms so you can show it raining in them. This tutorial explains Evennia's tools for searching. - -## Things to search for - -The first thing to consider is the base type of the thing you are searching for. Evennia organizes its database into a few main tables: [Objects](./Objects), [Accounts](./Accounts), [Scripts](./Scripts), [Channels](./Communications#channels), [Messages](Communication#Msg) and [Help Entries](./Help-System). Most of the time you'll likely spend your time searching for Objects and the occasional Accounts. - -So to find an entity, what can be searched for? - - - The `key` is the name of the entity. While you can get this from `obj.key` the *database field* is actually named `obj.db_key` - this is useful to know only when you do [direct database queries](./Tutorial-Searching-For-Objects#queries-in-django). The one exception is `Accounts`, where the database field for `.key` is instead named `username` (this is a Django requirement). When you don't specify search-type, you'll usually search based on key. *Aliases* are extra names given to Objects using something like `@alias` or `obj.aliases.add('name')`. The main search functions (see below) will automatically search for aliases whenever you search by-key. - - [Tags](./Tags) are the main way to group and identify objects in Evennia. Tags can most often be used (sometimes together with keys) to uniquely identify an object. For example, even though you have two locations with the same name, you can separate them by their tagging (this is how Evennia implements 'zones' seen in other systems). Tags can also have categories, to further organize your data for quick lookups. - - An object's [Attributes](./Attributes) can also used to find an object. This can be very useful but since Attributes can store almost any data they are far less optimized to search for than Tags or keys. -- The object's [Typeclass](./Typeclasses) indicate the sub-type of entity. A Character, Flower or Sword are all types of Objects. A Bot is a kind of Account. The database field is called `typeclass_path` and holds the full Python-path to the class. You can usually specify the `typeclass` as an argument to Evennia's search functions as well as use the class directly to limit queries. -- The `location` is only relevant for [Objects](./Objects) but is a very common way to weed down the number of candidates before starting to search. The reason is that most in-game commands tend to operate on things nearby (in the same room) so the choices can be limited from the start. -- The database id or the '#dbref' is unique (and never re-used) within each database table. So while there is one and only one Object with dbref `#42` there could also be an Account or Script with the dbref `#42` at the same time. In almost all search methods you can replace the "key" search criterion with `"#dbref"` to search for that id. This can occasionally be practical and may be what you are used to from other code bases. But it is considered *bad practice* in Evennia to rely on hard-coded #dbrefs to do your searches. It makes your code tied to the exact layout of the database. It's also not very maintainable to have to remember abstract numbers. Passing the actual objects around and searching by Tags and/or keys will usually get you what you need. - - -## Getting objects inside another - -All in-game [Objects](./Objects) have a `.contents` property that returns all objects 'inside' them (that is, all objects which has its `.location` property set to that object. This is a simple way to get everything in a room and is also faster since this lookup is cached and won't hit the database. - -- `roomobj.contents` returns a list of all objects inside `roomobj`. -- `obj.contents` same as for a room, except this usually represents the object's inventory -- `obj.location.contents` gets everything in `obj`'s location (including `obj` itself). -- `roomobj.exits` returns all exits starting from `roomobj` (Exits are here defined as Objects with their `destination` field set). -- `obj.location.contents_get(exclude=obj)` - this helper method returns all objects in `obj`'s location except `obj`. - -## Searching using `Object.search` - -Say you have a [command](./Commands), and you want it to do something to a target. You might be wondering how you retrieve that target in code, and that's where Evennia's search utilities come in. In the most common case, you'll often use the `search` method of the `Object` or `Account` typeclasses. In a command, the `.caller` property will refer back to the object using the command (usually a `Character`, which is a type of `Object`) while `.args` will contain Command's arguments: - -```python -# e.g. in file mygame/commands/command.py - -from evennia import default_cmds - -class CmdPoke(default_cmds.MuxCommand): - """ - Pokes someone. - - Usage: poke - """ - key = "poke" - - def func(self): - """Executes poke command""" - target = self.caller.search(self.args) - if not target: - # we didn't find anyone, but search has already let the - # caller know. We'll just return, since we're done - return - # we found a target! we'll do stuff to them. - target.msg("You have been poked by %s." % self.caller) - self.caller.msg("You have poked %s." % target) -``` -By default, the search method of a Character will attempt to find a unique object match for the string sent to it (`self.args`, in this case, which is the arguments passed to the command by the player) in the surroundings of the Character - the room or their inventory. If there is no match found, the return value (which is assigned to `target`) will be `None`, and an appropriate failure message will be sent to the Character. If there's not a unique match, `None` will again be returned, and a different error message will be sent asking them to disambiguate the multi-match. By default, the user can then pick out a specific match using with a number and dash preceding the name of the object: `character.search("2-pink unicorn")` will try to find the second pink unicorn in the room. - -The search method has many [arguments](github:evennia.objects.objects#defaultcharactersearch) that allow you to refine the search, such as by designating the location to search in or only matching specific typeclasses. - -## Searching using `utils.search` - -Sometimes you will want to find something that isn't tied to the search methods of a character or account. In these cases, Evennia provides a [utility module with a number of search functions](github:evennia.utils.search). For example, suppose you want a command that will find and display all the rooms that are tagged as a 'hangout', for people to gather by. Here's a simple Command to do this: - -```python -# e.g. in file mygame/commands/command.py - -from evennia import default_cmds -from evennia.utils.search import search_tag - -class CmdListHangouts(default_cmds.MuxCommand): - """Lists hangouts""" - key = "hangouts" - - def func(self): - """Executes 'hangouts' command""" - hangouts = search_tag(key="hangout", - category="location tags") - self.caller.msg("Hangouts available: {}".format( - ", ".join(str(ob) for ob in hangouts))) -``` - -This uses the `search_tag` function to find all objects previously tagged with [Tags](./Tags) "hangout" and with category "location tags". - -Other important search methods in `utils.search` are - -- `search_object` -- `search_account` -- `search_scripts` -- `search_channel` -- `search_message` -- `search_help` -- `search_tag` - find Objects with a given Tag. -- `search_account_tag` - find Accounts with a given Tag. -- `search_script_tag` - find Scripts with a given Tag. -- `search_channel_tag` - find Channels with a given Tag. -- `search_object_attribute` - find Objects with a given Attribute. -- `search_account_attribute` - find Accounts with a given Attribute. -- `search_attribute_object` - this returns the actual Attribute, not the object it sits on. - -> Note: All search functions return a Django `queryset` which is technically a list-like representation of the database-query it's about to do. Only when you convert it to a real list, loop over it or try to slice or access any of its contents will the datbase-lookup happen. This means you could yourself customize the query further if you know what you are doing (see the next section). - -## Queries in Django - -*This is an advanced topic.* - -Evennia's search methods should be sufficient for the vast majority of situations. But eventually you might find yourself trying to figure out how to get searches for unusual circumstances: Maybe you want to find all characters who are *not* in rooms tagged as hangouts *and* have the lycanthrope tag *and* whose names start with a vowel, but *not* with 'Ab', and *only if* they have 3 or more objects in their inventory ... You could in principle use one of the earlier search methods to find all candidates and then loop over them with a lot of if statements in raw Python. But you can do this much more efficiently by querying the database directly. - -Enter [django's querysets](https://docs.djangoproject.com/en/1.11/ref/models/querysets/). A QuerySet is the representation of a database query and can be modified as desired. Only once one tries to retrieve the data of that query is it *evaluated* and does an actual database request. This is useful because it means you can modify a query as much as you want (even pass it around) and only hit the database once you are happy with it. -Evennia's search functions are themselves an even higher level wrapper around Django's queries, and many search methods return querysets. That means that you could get the result from a search function and modify the resulting query to your own ends to further tweak what you search for. - -Evaluated querysets can either contain objects such as Character objects, or lists of values derived from the objects. Queries usually use the 'manager' object of a class, which by convention is the `.objects` attribute of a class. For example, a query of Accounts that contain the letter 'a' could be: - -```python - from typeclasses.accounts import Account - -queryset = Account.objects.filter(username__contains='a') - -``` - -The `filter` method of a manager takes arguments that allow you to define the query, and you can continue to refine the query by calling additional methods until you evaluate the queryset, causing the query to be executed and return a result. For example, if you have the result above, you could, without causing the queryset to be evaluated yet, get rid of matches that contain the letter 'e by doing this: - -```python -queryset = result.exclude(username__contains='e') - -``` - -> You could also have chained `.exclude` directly to the end of the previous line. - -Once you try to access the result, the queryset will be evaluated automatically under the hood: - -```python -accounts = list(queryset) # this fills list with matches - -for account in queryset: - # do something with account - -accounts = queryset[:4] # get first four matches -account = queryset[0] # get first match -# etc - -``` - -### Limiting by typeclass - -Although `Character`s, `Exit`s, `Room`s, and other children of `DefaultObject` all shares the same underlying database table, Evennia provides a shortcut to do more specific queries only for those typeclasses. For example, to find only `Character`s whose names start with 'A', you might do: - -```python -Character.objects.filter(db_key__startswith="A") - -``` - -If Character has a subclass `Npc` and you wanted to find only Npc's you'd instead do - -```python -Npc.objects.filter(db_key__startswith="A") - -``` - -If you wanted to search both Characters and all its subclasses (like Npc) you use the `*_family` method which is added by Evennia: - - -```python -Character.objects.filter_family(db_key__startswith="A") -``` - -The higher up in the inheritance hierarchy you go the more objects will be included in these searches. There is one special case, if you really want to include *everything* from a given database table. You do that by searching on the database model itself. These are named `ObjectDB`, `AccountDB`, `ScriptDB` etc. - -```python -from evennia import AccountDB - -# all Accounts in the database, regardless of typeclass -all = AccountDB.objects.all() - -``` - -Here are the most commonly used methods to use with the `objects` managers: - -- `filter` - query for a listing of objects based on search criteria. Gives empty queryset if none were found. -- `get` - query for a single match - raises exception if none were found, or more than one was found. -- `all` - get all instances of the particular type. -- `filter_family` - like `filter`, but search all sub classes as well. -- `get_family` - like `get`, but search all sub classes as well. -- `all_family` - like `all`, but return entities of all subclasses as well. - -## Multiple conditions - -If you pass more than one keyword argument to a query method, the query becomes an `AND` relationship. For example, if we want to find characters whose names start with "A" *and* are also werewolves (have the `lycanthrope` tag), we might do: - -```python -queryset = Character.objects.filter(db_key__startswith="A", db_tags__db_key="lycanthrope") -``` - -To exclude lycanthropes currently in rooms tagged as hangouts, we might tack on an `.exclude` as before: - -```python -queryset = quersyet.exclude(db_location__db_tags__db_key="hangout") -``` - -Note the syntax of the keywords in building the queryset. For example, `db_location` is the name of the database field sitting on (in this case) the `Character` (Object). Double underscore `__` works like dot-notation in normal Python (it's used since dots are not allowed in keyword names). So the instruction `db_location__db_tags__db_key="hangout"` should be read as such: - -1. "On the `Character` object ... (this comes from us building this queryset using the `Character.objects` manager) -2. ... get the value of the `db_location` field ... (this references a Room object, normally) -3. ... on that location, get the value of the `db_tags` field ... (this is a many-to-many field that can be treated like an object for this purpose. It references all tags on the location) -4. ... through the `db_tag` manager, find all Tags having a field `db_key` set to the value "hangout"." - -This may seem a little complex at first, but this syntax will work the same for all queries. Just remember that all *database-fields* in Evennia are prefaced with `db_`. So even though Evennia is nice enough to alias the `db_key` field so you can normally just do `char.key` to get a character's name, the database field is actually called `db_key` and the real name must be used for the purpose of building a query. - -> Don't confuse database fields with [Attributes](./Attributes) you set via `obj.db.attr = 'foo'` or `obj.attributes.add()`. Attributes are custom database entities *linked* to an object. They are not separate fields *on* that object like `db_key` or `db_location` are. You can get attached Attributes manually through the `db_attributes` many-to-many field in the same way as `db_tags` above. - -### Complex queries - -What if you want to have a query with with `OR` conditions or negated requirements (`NOT`)? Enter Django's Complex Query object, [Q](https://docs.djangoproject.com/en/1.11/topics/db/queries/#complex-lookups-with-q-objects). `Q()` objects take a normal django keyword query as its arguments. The special thing is that these Q objects can then be chained together with set operations: `|` for OR, `&` for AND, and preceded with `~` for NOT to build a combined, complex query. - -In our original Lycanthrope example we wanted our werewolves to have names that could start with any vowel except for the specific beginning "ab". - -```python -from django.db.models import Q -from typeclasses.characters import Character - -query = Q() -for letter in ("aeiouy"): - query |= Q(db_key__istartswith=letter) -query &= ~Q(db_key__istartswith="ab") -query = Character.objects.filter(query) - -list_of_lycanthropes = list(query) -``` - -In the above example, we construct our query our of several Q objects that each represent one part of the query. We iterate over the list of vowels, and add an `OR` condition to the query using `|=` (this is the same idea as using `+=` which may be more familiar). Each `OR` condition checks that the name starts with one of the valid vowels. Afterwards, we add (using `&=`) an `AND` condition that is negated with the `~` symbol. In other words we require that any match should *not* start with the string "ab". Note that we don't actually hit the database until we convert the query to a list at the end (we didn't need to do that either, but could just have kept the query until we needed to do something with the matches). - -### Annotations and `F` objects - -What if we wanted to filter on some condition that isn't represented easily by a field on the object? Maybe we want to find rooms only containing five or more objects? - -We *could* retrieve all interesting candidates and run them through a for-loop to get and count their `.content` properties. We'd then just return a list of only those objects with enough contents. It would look something like this (note: don't actually do this!): - -```python -# probably not a good idea to do it this way - -from typeclasses.rooms import Room - -queryset = Room.objects.all() # get all Rooms -rooms = [room for room in queryset if len(room.contents) >= 5] - -``` - -Once the number of rooms in your game increases, this could become quite expensive. Additionally, in some particular contexts, like when using the web features of Evennia, you must have the result as a queryset in order to use it in operations, such as in Django's admin interface when creating list filters. - -Enter [F objects](https://docs.djangoproject.com/en/1.11/ref/models/expressions/#f-expressions) and *annotations*. So-called F expressions allow you to do a query that looks at a value of each object in the database, while annotations allow you to calculate and attach a value to a query. So, let's do the same example as before directly in the database: - -```python -from typeclasses.rooms import Room -from django.db.models import Count - -room_count = Room.objects.annotate(num_objects=Count('locations_set')) -queryset = room_count.filter(num_objects__gte=5) - -rooms = (Room.objects.annotate(num_objects=Count('locations_set')) - .filter(num_objects__gte=5)) - -rooms = list(rooms) - -``` -Here we first create an annotation `num_objects` of type `Count`, which is a Django class. Note that use of `location_set` in that `Count`. The `*_set` is a back-reference automatically created by Django. In this case it allows you to find all objects that *has the current object as location*. Once we have those, they are counted. -Next we filter on this annotation, using the name `num_objects` as something we can filter for. We use `num_objects__gte=5` which means that `num_objects` should be greater than 5. This is a little harder to get one's head around but much more efficient than lopping over all objects in Python. - -What if we wanted to compare two parameters against one another in a query? For example, what if instead of having 5 or more objects, we only wanted objects that had a bigger inventory than they had tags? Here an F-object comes in handy: - -```python -from django.db.models import Count, F -from typeclasses.rooms import Room - -result = (Room.objects.annotate(num_objects=Count('locations_set'), - num_tags=Count('db_tags')) - .filter(num_objects__gt=F('num_tags'))) -``` - -F-objects allows for wrapping an annotated structure on the right-hand-side of the expression. It will be evaluated on-the-fly as needed. - -### Grouping By and Values - -Suppose you used tags to mark someone belonging an organization. Now you want to make a list and need to get the membership count of every organization all at once. That's where annotations and the `.values_list` queryset method come in. Values/Values Lists are an alternate way of returning a queryset - instead of objects, you get a list of dicts or tuples that hold selected properties from the the matches. It also allows you a way to 'group up' queries for returning information. For example, to get a display about each tag per Character and the names of the tag: - -```python -result = (Character.objects.filter(db_tags__db_category="organization") - .values_list('db_tags__db_key') - .annotate(cnt=Count('id')) - .order_by('-cnt')) -``` -The result queryset will be a list of tuples ordered in descending order by the number of matches, in a format like the following: -``` -[('Griatch Fanclub', 3872), ("Chainsol's Ainneve Testers", 2076), ("Blaufeuer's Whitespace Fixers", 1903), - ("Volund's Bikeshed Design Crew", 1764), ("Tehom's Misanthropes", 1)] diff --git a/docs/0.9.1/_sources/Tutorial-World-Introduction.md.txt b/docs/0.9.1/_sources/Tutorial-World-Introduction.md.txt deleted file mode 100644 index abff1e9734..0000000000 --- a/docs/0.9.1/_sources/Tutorial-World-Introduction.md.txt +++ /dev/null @@ -1,79 +0,0 @@ -# Tutorial World Introduction - - -The *Tutorial World* is a small and functioning MUD-style game world. It is intended to be deconstructed and used as a way to learn Evennia. The game consists of a single-player quest and has some 20 rooms that you can explore as you seek to discover the whereabouts of a mythical weapon. - -The source code is fully documented. You can find the whole thing in `evennia/contrib/tutorial_world/`. - -Some features exemplified by the tutorial world: - -- Tutorial command, giving "behind-the-scenes" help for every room and some of the special objects -- Rooms with custom `return_appearance` to show details. -- Hidden exits -- Objects with multiple custom interactions -- Large-area rooms -- Outdoor weather rooms -- Dark room, needing light source -- Puzzle object -- Multi-room puzzle -- Aggressive mobile with roam, pursue and battle state-engine AI -- Weapons, also used by mobs -- Simple combat system with attack/defend commands -- Object spawning -- Teleporter trap rooms - - -## Install - -The tutorial world consists of a few modules in `evennia/contrib/tutorial_world/` containing custom [Typeclasses](./Typeclasses) for [rooms and objects](./Objects) and associated [Commands](./Commands). - -These reusable bits and pieces are then put together into a functioning game area ("world" is maybe too big a word for such a small zone) using a [batch script](./Batch-Processors) called `build.ev`. To install, log into the server as the superuser (user #1) and run: - - @batchcommand tutorial_world.build - -The world will be built (this might take a while, so don't rerun the command even if it seems the system has frozen). After finishing you will end up back in Limbo with a new exit called `tutorial`. - -An alternative is - - @batchcommand/interactive tutorial_world.build - -with the /interactive switch you are able to step through the building process at your own pace to see what happens in detail. - -To play the tutorial "correctly", you should *not* do so as superuser. The reason for this is that many game systems ignore the presence of a superuser and will thus not work as normal. Use the `@quell` command to limit your powers or log out and reconnect as a different user. As superuser you can of course examine things "under the hood" later if you want. - -## Gameplay - -![the castle off the moor](https://images-wixmp-ed30a86b8c4ca887773594c2.wixmp.com/f/22916c25-6299-453d-a221-446ec839f567/da2pmzu-46d63c6d-9cdc-41dd-87d6-1106db5a5e1a.jpg/v1/fill/w_600,h_849,q_75,strp/the_castle_off_the_moor_by_griatch_art_da2pmzu-fullview.jpg?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1cm46YXBwOiIsImlzcyI6InVybjphcHA6Iiwib2JqIjpbW3siaGVpZ2h0IjoiPD04NDkiLCJwYXRoIjoiXC9mXC8yMjkxNmMyNS02Mjk5LTQ1M2QtYTIyMS00NDZlYzgzOWY1NjdcL2RhMnBtenUtNDZkNjNjNmQtOWNkYy00MWRkLTg3ZDYtMTEwNmRiNWE1ZTFhLmpwZyIsIndpZHRoIjoiPD02MDAifV1dLCJhdWQiOlsidXJuOnNlcnZpY2U6aW1hZ2Uub3BlcmF0aW9ucyJdfQ.omuS3D1RmFiZCy9OSXiIita-HxVGrBok3_7asq0rflw) - - -*To get into the mood of this miniature quest, imagine you are an adventurer out to find fame and fortune. You have heard rumours of an old castle ruin by the coast. In its depth a warrior princess was buried together with her powerful magical weapon - a valuable prize, if it's true. Of course this is a chance to adventure that you cannot turn down!* - -*You reach the ocean in the midst of a raging thunderstorm. With wind and rain screaming in your face you stand where the moor meets the sea along a high, rocky coast ...* - -- Look at everything. -- Some objects are interactive in more than one way. Use the normal `help` command to get a feel for which commands are available at any given time. (use the command `tutorial` to get insight behind the scenes of the tutorial). - -- In order to fight, you need to first find some type of weapon. -- *slash* is a normal attack -- *stab* launches an attack that makes more damage but has a lower chance to hit. -- *defend* will lower the chance to taking damage on your enemy's next attack. -- You *can* run from a fight that feels too deadly. Expect to be chased though. -- Being defeated is a part of the experience ... - -## Uninstall - -Uninstalling the tutorial world basically means deleting all the rooms and objects it consists of. First, move out of the tutorial area. - - @find tut#01 - @find tut#16 - -This should locate the first and last rooms created by `build.ev` - *Intro* and *Outro*. If you installed normally, everything created between these two numbers should be part of the tutorial. Note their dbref numbers, for example 5 and 80. Next we just delete all objects in that range: - - @del 5-80 - -You will see some errors since some objects are auto-deleted and so cannot be found when the delete mechanism gets to them. That's fine. You should have removed the tutorial completely once the command finishes. - -## Notes - -When reading and learning from the code, keep in mind that *Tutorial World* was created with a very specific goal: to install easily and to not permanently modify the rest of the server. It therefore goes to some length to use only temporary solutions and to clean up after -itself. diff --git a/docs/0.9.1/_sources/Tutorial-for-basic-MUSH-like-game.md.txt b/docs/0.9.1/_sources/Tutorial-for-basic-MUSH-like-game.md.txt deleted file mode 100644 index c362b4efaa..0000000000 --- a/docs/0.9.1/_sources/Tutorial-for-basic-MUSH-like-game.md.txt +++ /dev/null @@ -1,520 +0,0 @@ -# Tutorial for basic MUSH like game - - -This tutorial lets you code a small but complete and functioning MUSH-like game in Evennia. A [MUSH](http://en.wikipedia.org/wiki/MUSH) is, for our purposes, a class of roleplay-centric games focused on free form storytelling. Even if you are not interested in MUSH:es, this is still a good first game-type to try since it's not so code heavy. You will be able to use the same principles for building other types of games. - -The tutorial starts from scratch. If you did the [First Steps Coding](./First-Steps-Coding) tutorial already you should have some ideas about how to do some of the steps already. - -The following are the (very simplistic and cut-down) features we will implement (this was taken from a feature request from a MUSH user new to Evennia). A Character in this system should: - -- Have a “Power” score from 1 to 10 that measures how strong they are (stand-in for the stat system). -- Have a command (e.g. `+setpower 4`) that sets their power (stand-in for character generation code). -- Have a command (e.g. `+attack`) that lets them roll their power and produce a "Combat Score" between `1` and `10*Power`, displaying the result and editing their object to record this number (stand-in for `+actions` in the command code). -- Have a command that displays everyone in the room and what their most recent "Combat Score" roll was (stand-in for the combat code). -- Have a command (e.g. `+createNPC Jenkins`) that creates an NPC with full abilities. -- Have a command to control NPCs, such as `+npc/cmd (name)=(command)` (stand-in for the NPC controlling code). - -In this tutorial we will assume you are starting from an empty database without any previous modifications. - -## Server Settings - -To emulate a MUSH, the default `MULTISESSION_MODE=0` is enough (one unique session per account/character). This is the default so you don't need to change anything. You will still be able to puppet/unpuppet objects you have permission to, but there is no character selection out of the box in this mode. - -We will assume our game folder is called `mygame` henceforth. You should be fine with the default SQLite3 database. - -## Creating the Character - -First thing is to choose how our Character class works. We don't need to define a special NPC object -- an NPC is after all just a Character without an Account currently controlling them. - -Make your changes in the `mygame/typeclasses/characters.py` file: - -```python -# mygame/typeclasses/characters.py - -from evennia import DefaultCharacter - -class Character(DefaultCharacter): - """ - [...] - """ - def at_object_creation(self): - "This is called when object is first created, only." - self.db.power = 1 - self.db.combat_score = 1 -``` - -We defined two new [Attributes](./Attributes) `power` and `combat_score` and set them to default values. Make sure to `@reload` the server if you had it already running (you need to reload every time you update your python code, don't worry, no accounts will be disconnected by the reload). - -Note that only *new* characters will see your new Attributes (since the `at_object_creation` hook is called when the object is first created, existing Characters won't have it). To update yourself, run - - @typeclass/force self - -This resets your own typeclass (the `/force` switch is a safety measure to not do this accidentally), this means that `at_object_creation` is re-run. - - examine self - -Under the "Persistent attributes" heading you should now find the new Attributes `power` and `score` set on yourself by `at_object_creation`. If you don't, first make sure you `@reload`ed into the new code, next look at your server log (in the terminal/console) to see if there were any syntax errors in your code that may have stopped your new code from loading correctly. - -## Character Generation - -We assume in this example that Accounts first connect into a "character generation area". Evennia also supports full OOC menu-driven character generation, but for this example, a simple start room is enough. When in this room (or rooms) we allow character generation commands. In fact, character generation commands will *only* be available in such rooms. - -Note that this again is made so as to be easy to expand to a full-fledged game. With our simple example, we could simply set an `is_in_chargen` flag on the account and have the `+setpower` command check it. Using this method however will make it easy to add more functionality later. - -What we need are the following: - -- One character generation [Command](./Commands) to set the "Power" on the `Character`. -- A chargen [CmdSet](./Command-Sets) to hold this command. Lets call it `ChargenCmdset`. -- A custom `ChargenRoom` type that makes this set of commands available to players in such rooms. -- One such room to test things in. - -### The +setpower command - -For this tutorial we will add all our new commands to `mygame/commands/command.py` but you could split your commands into multiple module if you prefered. - -For this tutorial character generation will only consist of one [Command](./Commands) to set the Character s "power" stat. It will be called on the following MUSH-like form: - - +setpower 4 - -Open `command.py` file. It contains documented empty templates for the base command and the "MuxCommand" type used by default in Evennia. We will use the plain `Command` type here, the `MuxCommand` class offers some extra features like stripping whitespace that may be useful - if so, just import from that instead. - -Add the following to the end of the `command.py` file: - -```python -# end of command.py -from evennia import Command # just for clarity; already imported above - -class CmdSetPower(Command): - """ - set the power of a character - - Usage: - +setpower <1-10> - - This sets the power of the current character. This can only be - used during character generation. - """ - - key = "+setpower" - help_category = "mush" - - def func(self): - "This performs the actual command" - errmsg = "You must supply a number between 1 and 10." - if not self.args: - self.caller.msg(errmsg) - return - try: - power = int(self.args) - except ValueError: - self.caller.msg(errmsg) - return - if not (1 <= power <= 10): - self.caller.msg(errmsg) - return - # at this point the argument is tested as valid. Let's set it. - self.caller.db.power = power - self.caller.msg("Your Power was set to %i." % power) -``` -This is a pretty straightforward command. We do some error checking, then set the power on ourself. We use a `help_category` of "mush" for all our commands, just so they are easy to find and separate in the help list. - -Save the file. We will now add it to a new [CmdSet](./Command-Sets) so it can be accessed (in a full chargen system you would of course have more than one command here). - -Open `mygame/commands/default_cmdsets.py` and import your `command.py` module at the top. We also import the default `CmdSet` class for the next step: - -```python -from evennia import CmdSet -from commands import command -``` - -Next scroll down and define a new command set (based on the base `CmdSet` class we just imported at the end of this file, to hold only our chargen-specific command(s): - -```python -# end of default_cmdsets.py - -class ChargenCmdset(CmdSet): - """ - This cmdset it used in character generation areas. - """ - key = "Chargen" - def at_cmdset_creation(self): - "This is called at initialization" - self.add(command.CmdSetPower()) -``` - -In the future you can add any number of commands to this cmdset, to expand your character generation system as you desire. Now we need to actually put that cmdset on something so it's made available to users. We could put it directly on the Character, but that would make it available all the time. It's cleaner to put it on a room, so it's only available when players are in that room. - -### Chargen areas - -We will create a simple Room typeclass to act as a template for all our Chargen areas. Edit `mygame/typeclasses/rooms.py` next: - -```python -from commands.default_cmdsets import ChargenCmdset - -# ... -# down at the end of rooms.py - -class ChargenRoom(Room): - """ - This room class is used by character-generation rooms. It makes - the ChargenCmdset available. - """ - def at_object_creation(self): - "this is called only at first creation" - self.cmdset.add(ChargenCmdset, permanent=True) -``` -Note how new rooms created with this typeclass will always start with `ChargenCmdset` on themselves. Don't forget the `permanent=True` keyword or you will lose the cmdset after a server reload. For more information about [Command Sets](./Command-Sets) and [Commands](./Commands), see the respective links. - -### Testing chargen - -First, make sure you have `@reload`ed the server (or use `evennia reload` from the terminal) to have your new python code added to the game. Check your terminal and fix any errors you see - the error traceback lists exactly where the error is found - look line numbers in files you have changed. - -We can't test things unless we have some chargen areas to test. Log into the game (you should at this point be using the new, custom Character class). Let's dig a chargen area to test. - - @dig chargen:rooms.ChargenRoom = chargen,finish - -If you read the help for `@dig` you will find that this will create a new room named `chargen`. The part after the `:` is the python-path to the Typeclass you want to use. Since Evennia will automatically try the `typeclasses` folder of our game directory, we just specify `rooms.ChargenRoom`, meaning it will look inside the module `rooms.py` for a class named `ChargenRoom` (which is what we created above). The names given after `=` are the names of exits to and from the room from your current location. You could also append aliases to each one name, such as `chargen;character generation`. - -So in summary, this will create a new room of type ChargenRoom and open an exit `chargen` to it and an exit back here named `finish`. If you see errors at this stage, you must fix them in your code. `@reload` -between fixes. Don't continue until the creation seems to have worked okay. - - chargen - -This should bring you to the chargen room. Being in there you should now have the `+setpower` command available, so test it out. When you leave (via the `finish` exit), the command will go away and trying `+setpower` should now give you a command-not-found error. Use `ex me` (as a privileged user) to check so the `Power` [Attribute](./Attributes) has been set correctly. - -If things are not working, make sure your typeclasses and commands are free of bugs and that you have entered the paths to the various command sets and commands correctly. Check the logs or command line for tracebacks and errors. - -## Combat System - -We will add our combat command to the default command set, meaning it will be available to everyone at all times. The combat system consists of a `+attack` command to get how successful our attack is. We also change the default `look` command to display the current combat score. - - -### Attacking with the +attack command - -Attacking in this simple system means rolling a random "combat score" influenced by the `power` stat set during Character generation: - - > +attack - You +attack with a combat score of 12! - -Go back to `mygame/commands/command.py` and add the command to the end like this: - -```python -import random - -# ... - -class CmdAttack(Command): - """ - issues an attack - - Usage: - +attack - - This will calculate a new combat score based on your Power. - Your combat score is visible to everyone in the same location. - """ - key = "+attack" - help_category = "mush" - - def func(self): - "Calculate the random score between 1-10*Power" - caller = self.caller - power = caller.db.power - if not power: - # this can happen if caller is not of - # our custom Character typeclass - power = 1 - combat_score = random.randint(1, 10 * power) - caller.db.combat_score = combat_score - - # announce - message = "%s +attack%s with a combat score of %s!" - caller.msg(message % ("You", "", combat_score)) - caller.location.msg_contents(message % - (caller.key, "s", combat_score), - exclude=caller) -``` - -What we do here is simply to generate a "combat score" using Python's inbuilt `random.randint()` function. We then store that and echo the result to everyone involved. - -To make the `+attack` command available to you in game, go back to `mygame/commands/default_cmdsets.py` and scroll down to the `CharacterCmdSet` class. At the correct place add this line: - -```python -self.add(command.CmdAttack()) -``` - -`@reload` Evennia and the `+attack` command should be available to you. Run it and use e.g. `@ex` to make sure the `combat_score` attribute is saved correctly. - -### Have "look" show combat scores - -Players should be able to view all current combat scores in the room. We could do this by simply adding a second command named something like `+combatscores`, but we will instead let the default `look` command do the heavy lifting for us and display our scores as part of its normal output, like this: - - > look Tom - Tom (combat score: 3) - This is a great warrior. - -We don't actually have to modify the `look` command itself however. To understand why, take a look at how the default `look` is actually defined. It sits in `evennia/commands/default/general.py` (or browse it online [here](https://github.com/evennia/evennia/blob/master/evennia/commands/default/general.py#L44)). You will find that the actual return text is done by the `look` command calling a *hook method* named `return_appearance` on the object looked at. All the `look` does is to echo whatever this hook returns. So what we need to do is to edit our custom Character typeclass and overload its `return_appearance` to return what we want (this is where the advantage of having a custom typeclass comes into play for real). - -Go back to your custom Character typeclass in `mygame/typeclasses/characters.py`. The default implementation of `return appearance` is found in `evennia.DefaultCharacter` (or online [here](https://github.com/evennia/evennia/blob/master/evennia/objects/objects.py#L1438)). If you want to make bigger changes you could copy & paste the whole default thing into our overloading method. In our case the change is small though: - -```python -class Character(DefaultCharacter): - """ - [...] - """ - def at_object_creation(self): - "This is called when object is first created, only." - self.db.power = 1 - self.db.combat_score = 1 - - def return_appearance(self, looker): - """ - The return from this method is what - looker sees when looking at this object. - """ - text = super().return_appearance(looker) - cscore = " (combat score: %s)" % self.db.combat_score - if "\n" in text: - # text is multi-line, add score after first line - first_line, rest = text.split("\n", 1) - text = first_line + cscore + "\n" + rest - else: - # text is only one line; add score to end - text += cscore - return text -``` - -What we do is to simply let the default `return_appearance` do its thing (`super` will call the parent's version of the same method). We then split out the first line of this text, append our `combat_score` and put it back together again. - -`@reload` the server and you should be able to look at other Characters and see their current combat scores. - -> Note: A potentially more useful way to do this would be to overload the entire `return_appearance` of the `Room`s of your mush and change how they list their contents; in that way one could see all combat scores of all present Characters at the same time as looking at the room. We leave this as an exercise. - -## NPC system - -Here we will re-use the Character class by introducing a command that can create NPC objects. We should also be able to set its Power and order it around. - -There are a few ways to define the NPC class. We could in theory create a custom typeclass for it and put a custom NPC-specific cmdset on all NPCs. This cmdset could hold all manipulation commands. Since we expect NPC manipulation to be a common occurrence among the user base however, we will instead put all relevant NPC commands in the default command set and limit eventual access with [Permissions and Locks](./Locks#Permissions). - -### Creating an NPC with +createNPC - -We need a command for creating the NPC, this is a very straightforward command: - - > +createnpc Anna - You created the NPC 'Anna'. - -At the end of `command.py`, create our new command: - -```python -from evennia import create_object - -class CmdCreateNPC(Command): - """ - create a new npc - - Usage: - +createNPC - - Creates a new, named NPC. The NPC will start with a Power of 1. - """ - key = "+createnpc" - aliases = ["+createNPC"] - locks = "call:not perm(nonpcs)" - help_category = "mush" - - def func(self): - "creates the object and names it" - caller = self.caller - if not self.args: - caller.msg("Usage: +createNPC ") - return - if not caller.location: - # may not create npc when OOC - caller.msg("You must have a location to create an npc.") - return - # make name always start with capital letter - name = self.args.strip().capitalize() - # create npc in caller's location - npc = create_object("characters.Character", - key=name, - location=caller.location, - locks="edit:id(%i) and perm(Builders);call:false()" % caller.id) - # announce - message = "%s created the NPC '%s'." - caller.msg(message % ("You", name)) - caller.location.msg_contents(message % (caller.key, name), - exclude=caller) -``` -Here we define a `+createnpc` (`+createNPC` works too) that is callable by everyone *not* having the `nonpcs` "[permission](./Locks#Permissions)" (in Evennia, a "permission" can just as well be used to block access, it depends on the lock we define). We create the NPC object in the caller's current location, using our custom `Character` typeclass to do so. - -We set an extra lock condition on the NPC, which we will use to check who may edit the NPC later -- we allow the creator to do so, and anyone with the Builders permission (or higher). See [Locks](./Locks) for more information about the lock system. - -Note that we just give the object default permissions (by not specifying the `permissions` keyword to the `create_object()` call). In some games one might want to give the NPC the same permissions as the Character creating them, this might be a security risk though. - -Add this command to your default cmdset the same way you did the `+attack` command earlier. `@reload` and it will be available to test. - -### Editing the NPC with +editNPC - -Since we re-used our custom character typeclass, our new NPC already has a *Power* value - it defaults to 1. How do we change this? - -There are a few ways we can do this. The easiest is to remember that the `power` attribute is just a simple [Attribute](./Attributes) stored on the NPC object. So as a Builder or Admin we could set this right away with the default `@set` command: - - @set mynpc/power = 6 - -The `@set` command is too generally powerful though, and thus only available to staff. We will add a custom command that only changes the things we want players to be allowed to change. We could in principle re-work our old `+setpower` command, but let's try something more useful. Let's make a `+editNPC` command. - - > +editNPC Anna/power = 10 - Set Anna's property 'power' to 10. - -This is a slightly more complex command. It goes at the end of your `command.py` file as before. - -```python -class CmdEditNPC(Command): - """ - edit an existing NPC - - Usage: - +editnpc [/ [= value]] - - Examples: - +editnpc mynpc/power = 5 - +editnpc mynpc/power - displays power value - +editnpc mynpc - shows all editable - attributes and values - - This command edits an existing NPC. You must have - permission to edit the NPC to use this. - """ - key = "+editnpc" - aliases = ["+editNPC"] - locks = "cmd:not perm(nonpcs)" - help_category = "mush" - - def parse(self): - "We need to do some parsing here" - args = self.args - propname, propval = None, None - if "=" in args: - args, propval = [part.strip() for part in args.rsplit("=", 1)] - if "/" in args: - args, propname = [part.strip() for part in args.rsplit("/", 1)] - # store, so we can access it below in func() - self.name = args - self.propname = propname - # a propval without a propname is meaningless - self.propval = propval if propname else None - - def func(self): - "do the editing" - - allowed_propnames = ("power", "attribute1", "attribute2") - - caller = self.caller - if not self.args or not self.name: - caller.msg("Usage: +editnpc name[/propname][=propval]") - return - npc = caller.search(self.name) - if not npc: - return - if not npc.access(caller, "edit"): - caller.msg("You cannot change this NPC.") - return - if not self.propname: - # this means we just list the values - output = "Properties of %s:" % npc.key - for propname in allowed_propnames: - propvalue = npc.attributes.get(propname, default="N/A") - output += "\n %s = %s" % (propname, propvalue) - caller.msg(output) - elif self.propname not in allowed_propnames: - caller.msg("You may only change %s." % - ", ".join(allowed_propnames)) - elif self.propval: - # assigning a new propvalue - # in this example, the properties are all integers... - intpropval = int(self.propval) - npc.attributes.add(self.propname, intpropval) - caller.msg("Set %s's property '%s' to %s" % - (npc.key, self.propname, self.propval)) - else: - # propname set, but not propval - show current value - caller.msg("%s has property %s = %s" % - (npc.key, self.propname, - npc.attributes.get(self.propname, default="N/A"))) -``` - -This command example shows off the use of more advanced parsing but otherwise it's mostly error checking. It searches for the given npc in the same room, and checks so the caller actually has permission to "edit" it before continuing. An account without the proper permission won't even be able to view the properties on the given NPC. It's up to each game if this is the way it should be. - -Add this to the default command set like before and you should be able to try it out. - -_Note: If you wanted a player to use this command to change an on-object property like the NPC's name (the `key` property), you'd need to modify the command since "key" is not an Attribute (it is not retrievable via `npc.attributes.get` but directly via `npc.key`). We leave this as an optional exercise._ - -### Making the NPC do stuff - the +npc command - -Finally, we will make a command to order our NPC around. For now, we will limit this command to only be usable by those having the "edit" permission on the NPC. This can be changed if it's possible for anyone to use the NPC. - -The NPC, since it inherited our Character typeclass has access to most commands a player does. What it doesn't have access to are Session and Player-based cmdsets (which means, among other things that they cannot chat on channels, but they could do that if you just added those commands). This makes the `+npc` command simple: - - +npc Anna = say Hello! - Anna says, 'Hello!' - -Again, add to the end of your `command.py` module: - -```python -class CmdNPC(Command): - """ - controls an NPC - - Usage: - +npc = - - This causes the npc to perform a command as itself. It will do so - with its own permissions and accesses. - """ - key = "+npc" - locks = "call:not perm(nonpcs)" - help_category = "mush" - - def parse(self): - "Simple split of the = sign" - name, cmdname = None, None - if "=" in self.args: - name, cmdname = [part.strip() - for part in self.args.rsplit("=", 1)] - self.name, self.cmdname = name, cmdname - - def func(self): - "Run the command" - caller = self.caller - if not self.cmdname: - caller.msg("Usage: +npc = ") - return - npc = caller.search(self.name) - if not npc: - return - if not npc.access(caller, "edit"): - caller.msg("You may not order this NPC to do anything.") - return - # send the command order - npc.execute_cmd(self.cmdname) - caller.msg("You told %s to do '%s'." % (npc.key, self.cmdname)) -``` - -Note that if you give an erroneous command, you will not see any error message, since that error will be returned to the npc object, not to you. If you want players to see this, you can give the caller's session ID to the `execute_cmd` call, like this: - -```python -npc.execute_cmd(self.cmdname, sessid=self.caller.sessid) -``` - -Another thing to remember is however that this is a very simplistic way to control NPCs. Evennia supports full puppeting very easily. An Account (assuming the "puppet" permission was set correctly) could simply do `@ic mynpc` and be able to play the game "as" that NPC. This is in fact just what happens when an Account takes control of their normal Character as well. - -## Concluding remarks - -This ends the tutorial. It looks like a lot of text but the amount of code you have to write is actually relatively short. At this point you should have a basic skeleton of a game and a feel for what is involved in coding your game. - -From here on you could build a few more ChargenRooms and link that to a bigger grid. The `+setpower` command can either be built upon or accompanied by many more to get a more elaborate character generation. - -The simple "Power" game mechanic should be easily expandable to something more full-fledged and useful, same is true for the combat score principle. The `+attack` could be made to target a specific player (or npc) and automatically compare their relevant attributes to determine a result. - -To continue from here, you can take a look at the [Tutorial World](./Tutorial-World-Introduction). For more specific ideas, see the [other tutorials and hints](./Tutorials) as well -as the [Developer Central](./Developer-Central). diff --git a/docs/0.9.1/_sources/Typeclasses.md.txt b/docs/0.9.1/_sources/Typeclasses.md.txt deleted file mode 100644 index b5891e9dbb..0000000000 --- a/docs/0.9.1/_sources/Typeclasses.md.txt +++ /dev/null @@ -1,247 +0,0 @@ -# Typeclasses - - -*Typeclasses* form the core of Evennia data storage. It allows Evennia to represent any number of different game entities as Python classes, without having to modify the database schema for every new type. - -In Evennia the most important game entities, [Accounts](./Accounts), [Objects](./Objects), [Scripts](./Scripts) and [Channels](./Communications#Channels) are all Python classes inheriting, at varying distance, from `evennia.typeclasses.models.TypedObject`. In the documentation we refer to these objects as being "typeclassed" or even "being a typeclass". - -This is how the inheritance looks for the typeclasses in Evennia: - -``` - TypedObject - _________________|_________________________________ - | | | | -1: AccountDB ObjectDB ScriptDB ChannelDB - | | | | -2: DefaultAccount DefaultObject DefaultScript DefaultChannel - | DefaultCharacter | | - | DefaultRoom | | - | DefaultExit | | - | | | | -3: Account Object Script Channel - Character - Room - Exit -``` - -- **Level 1** above is the "database model" level. This describes the database tables and fields (this is technically a [Django model](https://docs.djangoproject.com/en/2.2/topics/db/models/)). -- **Level 2** is where we find Evennia's default implementations of the various game entities, on top of the database. These classes define all the hook methods that Evennia calls in various situations. `DefaultObject` is a little special since it's the parent for `DefaultCharacter`, `DefaultRoom` and `DefaultExit`. They are all grouped under level 2 because they all represents defaults to build from. -- **Level 3**, finally, holds empty template classes created in your game directory. This is the level you are meant to modify and tweak as you please, overloading the defaults as befits your game. The templates inherit directly from their defaults, so `Object` inherits from `DefaultObject` and `Room` inherits from `DefaultRoom`. - -The `typeclass/list` command will provide a list of all typeclasses known to -Evennia. This can be useful for getting a feel for what is available. Note -however that if you add a new module with a class in it but do not import that -module from anywhere, the `typeclass/list` will not find it. To make it known -to Evennia you must import that module from somewhere. - - -### Difference between typeclasses and classes - -All Evennia classes inheriting from class in the table above share one important feature and two important limitations. This is why we don't simply call them "classes" but "typeclasses". - - 1. A typeclass can save itself to the database. This means that some properties (actually not that many) on the class actually represents database fields and can only hold very specific data types. This is detailed [below](./Typeclasses#about-typeclass-properties). - 1. Due to its connection to the database, the typeclass' name must be *unique* across the _entire_ server namespace. That is, there must never be two same-named classes defined anywhere. So the below code would give an error (since `DefaultObject` is now globally found both in this module and in the default library): - - ```python - from evennia import DefaultObject as BaseObject - class DefaultObject(BaseObject): - pass - ``` - - 1. A typeclass' `__init__` method should normally not be overloaded. This has mostly to do with the fact that the `__init__` method is not called in a predictable way. Instead Evennia suggest you use the `at_*_creation` hooks (like `at_object_creation` for Objects) for setting things the very first time the typeclass is saved to the database or the `at_init` hook which is called every time the object is cached to memory. If you know what you are doing and want to use `__init__`, it *must* both accept arbitrary keyword arguments and use `super` to call its parent:: - - ```python - def __init__(self, **kwargs): - # my content - super().__init__(**kwargs) - # my content - ``` - -Apart from this, a typeclass works like any normal Python class and you can -treat it as such. - - -## Creating a new typeclass - -It's easy to work with Typeclasses. Either you use an existing typeclass or you create a new Python class inheriting from an existing typeclass. Here is an example of creating a new type of Object: - -```python - from evennia import DefaultObject - - class Furniture(DefaultObject): - # this defines what 'furniture' is, like - # storing who sits on it or something. - pass - -``` - -You can now create a new `Furniture` object in two ways. First (and usually not the most convenient) way is to create an instance of the class and then save it manually to the database: - -```python -chair = Furniture(db_key="Chair") -chair.save() - -``` - -To use this you must give the database field names as keywords to the call. Which are available depends on the entity you are creating, but all start with `db_*` in Evennia. This is a method you may be familiar with if you know Django from before. - -It is recommended that you instead use the `create_*` functions to create typeclassed entities: - - -```python -from evennia import create_object - -chair = create_object(Furniture, key="Chair") -# or (if your typeclass is in a module furniture.py) -chair = create_object("furniture.Furniture", key="Chair") -``` - -The `create_object` (`create_account`, `create_script` etc) takes the typeclass as its first argument; this can both be the actual class or the python path to the typeclass as found under your game directory. So if your `Furniture` typeclass sits in `mygame/typeclasses/furniture.py`, you could point to it as `typeclasses.furniture.Furniture`. Since Evennia will itself look in `mygame/typeclasses`, you can shorten this even further to just `furniture.Furniture`. The create-functions take a lot of extra keywords allowing you to set things like [Attributes](./Attributes) and [Tags](./Tags) all in one go. These keywords don't use the `db_*` prefix. This will also automatically save the new instance to the database, so you don't need to call `save()` explicitly. - -### About typeclass properties - -An example of a database field is `db_key`. This stores the "name" of the entity you are modifying and can thus only hold a string. This is one way of making sure to update the `db_key`: - -```python -chair.db_key = "Table" -chair.save() - -print(chair.db_key) -<<< Table -``` - -That is, we change the chair object to have the `db_key` "Table", then save this to the database. However, you almost never do things this way; Evennia defines property wrappers for all the database fields. These are named the same as the field, but without the `db_` part: - -```python -chair.key = "Table" - -print(chair.key) -<<< Table - -``` - -The `key` wrapper is not only shorter to write, it will make sure to save the field for you, and does so more efficiently by levering sql update mechanics under the hood. So whereas it is good to be aware that the field is named `db_key` you should use `key` as much as you can. - -Each typeclass entity has some unique fields relevant to that type. But all also share the following fields (the wrapper name without `db_` is given): - - - `key` (str): The main identifier for the entity, like "Rose", "myscript" or "Paul". `name` is an alias. - - `date_created` (datetime): Time stamp when this object was created. - - `typeclass_path` (str): A python path pointing to the location of this (type)class - -There is one special field that doesn't use the `db_` prefix (it's defined by Django): - - - `id` (int): the database id (database ref) of the object. This is an ever-increasing, unique integer. It can also be accessed as `dbid` (database ID) or `pk` (primary key). The `dbref` property returns the string form "#id". - -The typeclassed entity has several common handlers: - - - `tags` - the [TagHandler](./Tags) that handles tagging. Use `tags.add()` , `tags.get()` etc. - - `locks` - the [LockHandler](./Locks) that manages access restrictions. Use `locks.add()`, `locks.get()` etc. - - `attributes` - the [AttributeHandler](./Attributes) that manages Attributes on the object. Use `attributes.add()` -etc. - - `db` (DataBase) - a shortcut property to the AttributeHandler; allowing `obj.db.attrname = value` - - `nattributes` - the [Non-persistent AttributeHandler](./Attributes) for attributes not saved in the database. - - `ndb` (NotDataBase) - a shortcut property to the Non-peristent AttributeHandler. Allows `obj.ndb.attrname = value` - - -Each of the typeclassed entities then extend this list with their own properties. Go to the respective pages for [Objects](./Objects), [Scripts](./Scripts), [Accounts](./Accounts) and [Channels](./Communications) for more info. It's also recommended that you explore the available entities using [Evennia's flat API](./Evennia-API) to explore which properties and methods they have available. - -### Overloading hooks - -The way to customize typeclasses is usually to overload *hook methods* on them. Hooks are methods that Evennia call in various situations. An example is the `at_object_creation` hook on `Objects`, which is only called once, the very first time this object is saved to the database. Other examples are the `at_login` hook of Accounts and the `at_repeat` hook of Scripts. - -### Querying for typeclasses - -Most of the time you search for objects in the database by using convenience methods like the `caller.search()` of [Commands](./Commands) or the search functions like `evennia.search_objects`. - -You can however also query for them directly using [Django's query language](https://docs.djangoproject.com/en/1.7/topics/db/queries/). This makes use of a _database manager_ that sits on all typeclasses, named `objects`. This manager holds methods that allow database searches against that particular type of object (this is the way Django normally works too). When using Django queries, you need to use the full field names (like `db_key`) to search: - -```python -matches = Furniture.objects.get(db_key="Chair") - -``` - -It is important that this will *only* find objects inheriting directly from `Furniture` in your database. If there was a subclass of `Furniture` named `Sitables` you would not find any chairs derived from `Sitables` with this query (this is not a Django feature but special to Evennia). To find objects from subclasses Evennia instead makes the `get_family` and `filter_family` query methods available: - -```python -# search for all furnitures and subclasses of furnitures -# whose names starts with "Chair" -matches = Furniture.objects.filter_family(db_key__startswith="Chair") - -``` - -To make sure to search, say, all `Scripts` *regardless* of typeclass, you need to query from the database model itself. So for Objects, this would be `ObjectDB` in the diagram above. Here's an example for Scripts: - -```python -from evennia import ScriptDB -matches = ScriptDB.objects.filter(db_key__contains="Combat") -``` - -When querying from the database model parent you don't need to use `filter_family` or `get_family` - you will always query all children on the database model. - -## Updating existing typeclass instances - -If you already have created instances of Typeclasses, you can modify the *Python code* at any time - due to how Python inheritance works your changes will automatically be applied to all children once you have reloaded the server. - -However, database-saved data, like `db_*` fields, [Attributes](./Attributes), [Tags](./Tags) etc, are not themselves embedded into the class and will *not* be updated automatically. This you need to manage yourself, by searching for all relevant objects and updating or adding the data: - -```python -# add a worth Attribute to all existing Furniture -for obj in Furniture.objects.all(): - # this will loop over all Furniture instances - obj.db.worth = 100 -``` - -A common use case is putting all Attributes in the `at_*_creation` hook of the entity, such as `at_object_creation` for `Objects`. This is called every time an object is created - and only then. This is usually what you want but it does mean already existing objects won't get updated if you change the contents of `at_object_creation` later. You can fix this in a similar way as above (manually setting each Attribute) or with something like this: - -```python -# Re-run at_object_creation only on those objects not having the new Attribute -for obj in Furniture.objects.all(): - if not obj.db.worth: - obj.at_object_creation() -``` - -The above examples can be run in the command prompt created by `evennia shell`. You could also run it all in-game using `@py`. That however requires you to put the code (including imports) as one single line using `;` and [list comprehensions](http://www.secnetix.de/olli/Python/list_comprehensions.hawk), like this (ignore the line break, that's only for readability in the wiki): - -``` -@py from typeclasses.furniture import Furniture; -[obj.at_object_creation() for obj in Furniture.objects.all() if not obj.db.worth] -``` - -It is recommended that you plan your game properly before starting to build, to avoid having to retroactively update objects more than necessary. - -## Swap typeclass - -If you want to swap an already existing typeclass, there are two ways to do so: From in-game and via code. From inside the game you can use the default `@typeclass` command: - -``` -@typeclass objname = path.to.new.typeclass -``` - -There are two important switches to this command: -- `/reset` - This will purge all existing Attributes on the object and re-run the creation hook (like `at_object_creation` for Objects). This assures you get an object which is purely of this new class. -- `/force` - This is required if you are changing the class to be *the same* class the object already has - it's a safety check to avoid user errors. This is usually used together with `/reset` to re-run the creation hook on an existing class. - -In code you instead use the `swap_typeclass` method which you can find on all typeclassed entities: - -```python -obj_to_change.swap_typeclass(new_typeclass_path, clean_attributes=False, - run_start_hooks="all", no_default=True, clean_cmdsets=False) -``` - -The arguments to this method are described [in the API docs here](github:evennia.typeclasses.models#typedobjectswap_typeclass). - - -## How typeclasses actually work - -*This is considered an advanced section.* - -Technically, typeclasses are [Django proxy models](https://docs.djangoproject.com/en/1.7/topics/db/models/#proxy-models). The only database models that are "real" in the typeclass system (that is, are represented by actual tables in the database) are `AccountDB`, `ObjectDB`, `ScriptDB` and `ChannelDB` (there are also [Attributes](./Attributes) and [Tags](./Tags) but they are not typeclasses themselves). All the subclasses of them are "proxies", extending them with Python code without actually modifying the database layout. - -Evennia modifies Django's proxy model in various ways to allow them to work without any boiler plate (for example you don't need to set the Django "proxy" property in the model `Meta` subclass, Evennia handles this for you using metaclasses). Evennia also makes sure you can query subclasses as well as patches django to allow multiple inheritance from the same base class. - -### Caveats - -Evennia uses the *idmapper* to cache its typeclasses (Django proxy models) in memory. The idmapper allows things like on-object handlers and properties to be stored on typeclass instances and to not get lost as long as the server is running (they will only be cleared on a Server reload). Django does not work like this by default; by default every time you search for an object in the database you'll get a *different* instance of that object back and anything you stored on it that was not in the database would be lost. The bottom line is that Evennia's Typeclass instances subside in memory a lot longer than vanilla Django model instance do. - -There is one caveat to consider with this, and that relates to [making your own models](./New-Models): Foreign relationships to typeclasses are cached by Django and that means that if you were to change an object in a foreign relationship via some other means than via that relationship, the object seeing the relationship may not reliably update but will still see its old cached version. Due to typeclasses staying so long in memory, stale caches of such relationships could be more visible than common in Django. See the [closed issue #1098 and its comments](https://github.com/evennia/evennia/issues/1098) for examples and solutions. - diff --git a/docs/0.9.1/_sources/Understanding-Color-Tags.md.txt b/docs/0.9.1/_sources/Understanding-Color-Tags.md.txt deleted file mode 100644 index 7386f8ac59..0000000000 --- a/docs/0.9.1/_sources/Understanding-Color-Tags.md.txt +++ /dev/null @@ -1,132 +0,0 @@ -# Understanding Color Tags - -This tutorial aims at dispelling confusions regarding the use of color tags within Evennia. - -Correct understanding of this topic requires having read the [TextTags](./TextTags) page and learned Evennia's color tags. Here we'll explain by examples the reasons behind the unexpected (or apparently incoherent) behaviors of some color tags, as mentioned _en passant_ in the [TextTags](./TextTags) page. - - -All you'll need for this tutorial is access to a running instance of Evennia via a color-enabled client. The examples provided are just commands that you can type in your client. - -Evennia, ANSI and Xterm256 -========================== - -All modern MUD clients support colors; nevertheless, the standards to which all clients abide dates back to old day of terminals, and when it comes to colors we are dealing with ANSI and Xterm256 standards. - -Evennia handles transparently, behind the scenes, all the code required to enforce these standards—so, if a user connects with a client which doesn't support colors, or supports only ANSI (16 colors), Evennia will take all due steps to ensure that the output will be adjusted to look right at the client side. - -As for you, the developer, all you need to care about is knowing how to correctly use the color tags within your MUD. Most likely, you'll be adding colors to help pages, descriptions, automatically generated text, etc. - -You are free to mix together ANSI and Xterm256 color tags, but you should be aware of a few pitfalls. ANSI and Xterm256 coexist without conflicts in Evennia, but in many ways they don't «see» each other: ANSI-specific color tags will have no effect on Xterm-defined colors, as we shall see here. - -ANSI -==== - -ANSI has a set of 16 colors, to be more precise: ANSI has 8 basic colors which come in _dark_ and _bright_ flavours—with _dark_ being _normal_. The colors are: red, green, yellow, blue, magenta, cyan, white and black. White in its dark version is usually referred to as gray, and black in its bright version as darkgray. Here, for sake of simplicity they'll be referred to as dark and bright: bright/dark black, bright/dark white. - -The default colors of MUD clients is normal (dark) white on normal black (ie: gray on black). - -It's important to grasp that in the ANSI standard bright colors apply only to text (foreground), not to background. Evennia allows to bypass this limitation via Xterm256, but doing so will impact the behavior of ANSI tags, as we shall see. - -Also, it's important to remember that the 16 ANSI colors are a convention, and the final user can always customize their appearance—he might decide to have green show as red, and dark green as blue, etc. - -Xterm256 -======== - -The 16 colors of ANSI should be more than enough to handle simple coloring of text. But when an author wants to be sure that a given color will show as he intended it, she might choose to rely on Xterm256 colors. - -Xterm256 doesn't rely on a palette of named colors, it instead represent colors by their values. So, a red color could be `|[500` (bright and pure red), or `|[300` (darker red), and so on. - -ANSI Color Tags in Evennia -========================== - -> NOTE: for ease of reading, the examples contain extra white spaces after the -> color tags (eg: `|g green |b blue` ). This is done only so that it's easier -> to see the tags separated from their context; it wouldn't be good practice -> in real-life coding. - -Let's proceed by examples. In your MUD client type: - - - say Normal |* Negative - -Evennia should output the word "Normal" normally (ie: gray on black) and "Negative" in reversed colors (ie: black on gray). - -This is pretty straight forward, the `|*` ANSI *invert* tag switches between foreground and background—from now on, **FG** and **BG** shorthands will be used to refer to foreground and background. - -But take mental note of this: `|*` has switched *dark white* and *dark black*. - -Now try this: - - say |w Bright white FG |* Negative - -You'll notice that the word "Negative" is not black on white, it's darkgray on gray. Why is this? Shouldn't it be black text on a white BG? Two things are happening here. - -As mentioned, ANSI has 8 base colors, the dark ones. The bright ones are achieved by means of *highlighting* the base/dark/normal colors, and they only apply to FG. - -What happened here is that when we set the bright white FG with `|w`, Evennia translated this into the ANSI sequence of Highlight On + White FG. In terms of Evennia's color tags, it's as if we typed: - - - say |h|!W Bright white FG |* Negative - -Furthermore, the Highlight-On property (which only works for BG!) is preserved after the FG/BG switch, this being the reason why we see black as darkgray: highlighting makes it *bright black* (ie: darkgray). - -As for the BG being also grey, that is normal—ie: you are seeing *normal white* (ie: dark white = gray). Remember that since there are no bright BG colors, the ANSI `|*` tag will transpose any FG color in its normal/dark version. So here the FG's bright white became dark white in the BG! In reality, it was always normal/dark white, except that in the FG is seen as bright because of the highlight tag behind the scenes. - -Let's try the same thing with some color: - - say |m |[G Bright Magenta on Dark Green |* Negative - -Again, the BG stays dark because of ANSI rules, and the FG stays bright because of the implicit `|h` in `|m`. - -Now, let's see what happens if we set a bright BG and then invert—yes, Evennia kindly allows us to do it, even if it's not within ANSI expectations. - - say |[b Dark White on Bright Blue |* Negative - -Before color inversion, the BG does show in bright blue, and after inversion (as expected) it's *dark white* (gray). The bright blue of the BG survived the inversion and gave us a bright blue FG. This behavior is tricky though, and not as simple as it might look. - -If the inversion were to be pure ANSI, the bright blue would have been accounted just as normal blue, and should have converted to normal blue in the FG (after all, there was no highlighting on). The fact is that in reality this color is not bright blue at all, it just an Xterm version of it! - -To demonstrate this, type: - - say |[b Dark White on Bright Blue |* Negative |H un-bright - -The `|H` Highlight-Off tag should have turned *dark blue* the last word; but it didn't because it couldn't: in order to enforce the non-ANSI bright BG Evennia turned to Xterm, and Xterm entities are not affected by ANSI tags! - -So, we are getting at the heart of all confusions and possible odd-behaviors pertaining color tags in Evennia: apart from Evennia's translations from- and to- ANSI/Xterm, the two systems are independent and transparent to each other. - -The bright blue of the previous example was just an Xterm representation of the ANSI standard blue. Try to change the default settings of your client, so that blue shows as some other color, you'll then realize the difference when Evennia is sending a true ANSI color (which will show up according to your settings) and when instead it's sending an Xterm representation of that color (which will show up always as defined by Evennia). - -You'll have to keep in mind that the presence of an Xterm BG or FG color might affect the way your tags work on the text. For example: - - say |[b Bright Blue BG |* Negative |!Y Dark Yellow |h not bright - -Here the `|h` tag no longer affects the FG color. Even though it was changed via the `|!` tag, the ANSI system is out-of-tune because of the intrusion of an Xterm color (bright blue BG, then moved to FG with `|*`). - -All unexpected ANSI behaviours are the result of mixing Xterm colors (either on purpose or either via bright BG colors). The `|n` tag will restore things in place and ANSI tags will respond properly again. So, at the end is just an issue of being mindful when using Xterm colors or bright BGs, and avoid wild mixing them with ANSI tags without normalizing (`|n`) things again. - -Try this: - - say |[b Bright Blue BG |* Negative |!R Red FG - -And then: - - say |[B Dark Blue BG |* Negative |!R Red BG?? - -In this second example the `|!` changes the BG color instead of the FG! In fact, the odd behavior is the one from the former example, non the latter. When you invert FG and BG with `|*` you actually inverting their references. This is why the last example (which has a normal/dark BG!) allows `|!` to change the BG color. In the first example, it's again the presence of an Xterm color (bright blue BG) which changes the default behavior. - -Try this: - -`say Normal |* Negative |!R Red BG` - -This is the normal behavior, and as you can see it allows `|!` to change BG color after the inversion of FG and BG. - -As long as you have an understanding of how ANSI works, it should be easy to handle color tags avoiding the pitfalls of Xterm-ANSI promisquity. - -One last example: - -`say Normal |* Negative |* still Negative` - -Shows that `|*` only works once in a row and will not (and should not!) revert back if used again. Nor it will have any effect until the `|n` tag is called to "reset" ANSI back to normal. This is how it is meant to work. - -ANSI operates according to a simple states-based mechanism, and it's important to understand the positive effect of resetting with the `|n` tag, and not try to -push it over the limit, so to speak. diff --git a/docs/0.9.1/_sources/Unit-Testing.md.txt b/docs/0.9.1/_sources/Unit-Testing.md.txt deleted file mode 100644 index a5e4d5d6b3..0000000000 --- a/docs/0.9.1/_sources/Unit-Testing.md.txt +++ /dev/null @@ -1,296 +0,0 @@ -# Unit Testing - - -*Unit testing* means testing components of a program in isolation from each other to make sure every part works on its own before using it with others. Extensive testing helps avoid new updates causing unexpected side effects as well as alleviates general code rot (a more comprehensive wikipedia article on unit testing can be found [here](http://en.wikipedia.org/wiki/Unit_test)). - -A typical unit test set calls some function or method with a given input, looks at the result and makes sure that this result looks as expected. Rather than having lots of stand-alone test programs, Evennia makes use of a central *test runner*. This is a program that gathers all available tests all over the Evennia source code (called *test suites*) and runs them all in one go. Errors and tracebacks are reported. - -By default Evennia only tests itself. But you can also add your own tests to your game code and have Evennia run those for you. - -## Running the Evennia test suite - -To run the full Evennia test suite, go to your game folder and issue the command - - evennia test evennia - -This will run all the evennia tests using the default settings. You could also run only a subset of all tests by specifying a subpackage of the library: - - evennia test evennia.commands.default - -A temporary database will be instantiated to manage the tests. If everything works out you will see how many tests were run and how long it took. If something went wrong you will get error messages. If you contribute to Evennia, this is a useful sanity check to see you haven't introduced an unexpected bug. - -## Running tests with custom settings file - -If you have implemented your own tests for your game (see below) you can run them from your game dir with - - evennia test . - -The period (`.`) means to run all tests found in the current directory and all subdirectories. You could also specify, say, `typeclasses` or `world` if you wanted to just run tests in those subdirs. - -Those tests will all be run using the default settings. To run the tests with your own settings file you must use the `--settings` option: - - evennia test --settings settings.py . - -The `--settings` option of Evennia takes a file name in the `mygame/server/conf` folder. It is normally used to swap settings files for testing and development. In combination with `test`, it forces Evennia to use this settings file over the default one. - -## Writing new tests - -Evennia's test suite makes use of Django unit test system, which in turn relies on Python's *unittest* module. - -> If you want to help out writing unittests for Evennia, take a look at Evennia's [coveralls.io page](https://coveralls.io/github/evennia/evennia). There you see which modules have any form of test coverage and which does not. - -To make the test runner find the tests, they must be put in a module named `test*.py` (so `test.py`, `tests.py` etc). Such a test module will be found wherever it is in the package. It can be a good idea to look at some of Evennia's `tests.py` modules to see how they look. - -Inside a testing file, a `unittest.TestCase` class is used to test a single aspect or component in various ways. Each test case contains one or more *test methods* - these define the actual tests to run. You can name the test methods anything you want as long as the name starts with "`test_`". Your `TestCase` class can also have a method `setUp()`. This is run before each test, setting up and storing whatever preparations the test methods need. Conversely, a `tearDown()` method can optionally do cleanup after each test. - -To test the results, you use special methods of the `TestCase` class. Many of those start with "`assert`", such as `assertEqual` or `assertTrue`. - -Example of a `TestCase` class: - -```python - import unittest - - # the function we want to test - from mypath import myfunc - - class TestObj(unittest.TestCase): - "This tests a function myfunc." - - def test_return_value(self): - "test method. Makes sure return value is as expected." - expected_return = "This is me being nice." - actual_return = myfunc() - # test - self.assertEqual(expected_return, actual_return) - def test_alternative_call(self): - "test method. Calls with a keyword argument." - expected_return = "This is me being baaaad." - actual_return = myfunc(bad=True) - # test - self.assertEqual(expected_return, actual_return) -``` - -You might also want to read the [documentation for the unittest module](http://docs.python.org/library/unittest.html). - -### Using the EvenniaTest class - -Evennia offers a custom TestCase, the `evennia.utils.test_resources.EvenniaTest` class. This class initiates a range of useful properties on themselves for testing Evennia systems. Examples are `.account` and `.session` representing a mock connected Account and its Session and `.char1` and `char2` representing Characters complete with a location in the test database. These are all useful when testing Evennia system requiring any of the default Evennia typeclasses as inputs. See the full definition of the `EvenniaTest` class in [evennia/utils/test_resources.py](https://github.com/evennia/evennia/blob/master/evennia/utils/test_resources.py). - -```python -# in a test module - -from evennia.utils.test_resources import EvenniaTest - -class TestObject(EvenniaTest): - def test_object_search(self): - # char1 and char2 are both created in room1 - self.assertEqual(self.char1.search(self.char2.key), self.char2) - self.assertEqual(self.char1.search(self.char1.location.key), self.char1.location) - # ... -``` - -### Testing in-game Commands - -In-game Commands are a special case. Tests for the default commands are put in `evennia/commands/default/tests.py`. This uses a custom `CommandTest` class that inherits from `evennia.utils.test_resources.EvenniaTest` described above. `CommandTest` supplies extra convenience functions for executing commands and check that their return values (calls of `msg()` returns expected values. It uses Characters and Sessions generated on the `EvenniaTest` class to call each class). - -Each command tested should have its own `TestCase` class. Inherit this class from the `CommandTest` class in the same module to get access to the command-specific utilities mentioned. - -```python - from evennia.commands.default.tests import CommandTest - from evennia.commands.default import general - class TestSet(CommandTest): - "tests the look command by simple call, using Char2 as a target" - def test_mycmd_char(self): - self.call(general.CmdLook(), "Char2", "Char2(#7)") - "tests the look command by simple call, with target as room" - def test_mycmd_room(self): - self.call(general.CmdLook(), "Room", - "Room(#1)\nroom_desc\nExits: out(#3)\n" - "You see: Obj(#4), Obj2(#5), Char2(#7)") -``` - -### Unit testing contribs with custom models - -A special case is if you were to create a contribution to go to the `evennia/contrib` folder that uses its [own database models](./New-Models). The problem with this is that Evennia (and Django) will only recognize models in `settings.INSTALLED_APPS`. If a user wants to use your contrib, they will be required to add your models to their settings file. But since contribs are optional you cannot add the model to Evennia's central `settings_default.py` file - this would always create your optional models regardless of if the user wants them. But at the same time a contribution is a part of the Evennia distribution and its unit tests should be run with all other Evennia tests using `evennia test evennia`. - -The way to do this is to only temporarily add your models to the `INSTALLED_APPS` directory when the test runs. here is an example of how to do it. - -> Note that this solution, derived from this [stackexchange answer](http://stackoverflow.com/questions/502916/django-how-to-create-a-model-dynamically-just-for-testing#503435) is currently untested! Please report your findings. - -```python -# a file contrib/mycontrib/tests.py - -from django.conf import settings -import django -from evennia.utils.test_resources import EvenniaTest - -OLD_DEFAULT_SETTINGS = settings.INSTALLED_APPS -DEFAULT_SETTINGS = dict( - INSTALLED_APPS=( - 'contrib.mycontrib.tests', - ), - DATABASES={ - "default": { - "ENGINE": "django.db.backends.sqlite3" - } - }, - SILENCED_SYSTEM_CHECKS=["1_7.W001"], - ) - -class TestMyModel(EvenniaTest): - def setUp(self): - - if not settings.configured: - settings.configure(**DEFAULT_SETTINGS) - django.setup() - - from django.core.management import call_command - from django.db.models import loading - loading.cache.loaded = False - call_command('syncdb', verbosity=0) - - def tearDown(self): - settings.configure(**OLD_DEFAULT_SETTINGS) - django.setup() - - from django.core.management import call_command - from django.db.models import loading - loading.cache.loaded = False - call_command('syncdb', verbosity=0) - - # test cases below ... - - def test_case(self): - # test case here -``` - -### A note on adding new tests - -Having an extensive tests suite is very important for avoiding code degradation as Evennia is developed. Only a small fraction of the Evennia codebase is covered by test suites at this point. Writing new tests is not hard, it's more a matter of finding the time to do so. So adding new tests is really an area where everyone can contribute, also with only limited Python skills. - -### A note on making the test runner faster - -If you have custom models with a large number of migrations, creating the test database can take a very long time. If you don't require migrations to run for your tests, you can disable them with the django-test-without-migrations package. To install it, simply: - -``` -$ pip install django-test-without-migrations -``` - -Then add it to your `INSTALLED_APPS` in your `server.conf.settings.py`: - -```python -INSTALLED_APPS = ( - # ... - 'test_without_migrations', -) -``` - -After doing so, you can then run tests without migrations by adding the `--nomigrations` argument: - -``` -evennia test --settings settings.py --nomigrations . -``` - -## Testing for Game development (mini-tutorial) - -Unit testing can be of paramount importance to game developers. When starting with a new game, it is recommended to look into unit testing as soon as possible; an already huge game is much harder to write tests for. The benefits of testing a game aren't different from the ones regarding library testing. For example it is easy to introduce bugs that affect previously working code. Testing is there to ensure your project behaves the way it should and continue to do so. - -If you have never used unit testing (with Python or another language), you might want to check the [official Python documentation about unit testing](https://docs.python.org/2/library/unittest.html), particularly the first section dedicated to a basic example. - -### Basic testing using Evennia - -Evennia's test runner can be used to launch tests in your game directory (let's call it 'mygame'). Evennia's test runner does a few useful things beyond the normal Python unittest module: - -* It creates and sets up an empty database, with some useful objects (accounts, characters and rooms, among others). -* It provides simple ways to test commands, which can be somewhat tricky at times, if not tested properly. - -Therefore, you should use the command-line to execute the test runner, while specifying your own game directories (not the one containing evennia). Go to your game directory (referred as 'mygame' in this section) and execute the test runner: - - evennia --settings settings.py test commands - -This command will execute Evennia's test runner using your own settings file. It will set up a dummy database of your choice and look into the 'commands' package defined in your game directory (`mygame/commands` in this example) to find tests. The test module's name should begin with 'test' and contain one or more `TestCase`. A full example can be found below. - -### A simple example - -In your game directory, go to `commands` and create a new file `tests.py` inside (it could be named anything starting with `test`). We will start by making a test that has nothing to do with Commands, just to show how unit testing works: - -```python - # mygame/commands/tests.py - - import unittest - - class TestString(unittest.TestCase): - - """Unittest for strings (just a basic example).""" - - def test_upper(self): - """Test the upper() str method.""" - self.assertEqual('foo'.upper(), 'FOO') -``` - -This example, inspired from the Python documentation, is used to test the 'upper()' method of the 'str' class. Not very useful, but it should give you a basic idea of how tests are used. - -Let's execute that test to see if it works. - - > evennia --settings settings.py test commands - - TESTING: Using specified settings file 'server.conf.settings'. - - (Obs: Evennia's full test suite may not pass if the settings are very - different from the default. Use 'test .' as arguments to run only tests - on the game dir.) - - Creating test database for alias 'default'... - . - ---------------------------------------------------------------------- - Ran 1 test in 0.001s - - OK - Destroying test database for alias 'default'... - -We specified the `commands` package to the evennia test command since that's where we put our test file. In this case we could just as well just said `.` to search all of `mygame` for testing files. If we have a lot of tests it may be useful to test only a single set at a time though. We get an information text telling us we are using our custom settings file (instead of Evennia's default file) and then the test runs. The test passes! Change the "FOO" string to something else in the test to see how it looks when it fails. - -### Testing commands - -This section will test the proper execution of the 'abilities' command, as described in the [First Steps Coding](./First-Steps-Coding) page. Follow this tutorial to create the 'abilities' command, we will need it to test it. - -Testing commands in Evennia is a bit more complex than the simple testing example we have seen. Luckily, Evennia supplies a special test class to do just that ... we just need to inherit from it and use it properly. This class is called 'CommandTest' and is defined in the 'evennia.commands.default.tests' package. To create a test for our 'abilities' command, we just need to create a class that inherits from 'CommandTest' and add methods. - -We could create a new test file for this but for now we just append to the `tests.py` file we already have in `commands` from before. - -```python - # bottom of mygame/commands/tests.py - - from evennia.commands.default.tests import CommandTest - - from commands.command import CmdAbilities - from typeclasses.characters import Character - - class TestAbilities(CommandTest): - - character_typeclass = Character - - def test_simple(self): - self.call(CmdAbilities(), "", "STR: 5, AGI: 4, MAG: 2") -``` - -* Line 1-4: we do some importing. 'CommandTest' is going to be our base class for our test, so we need it. We also import our command ('CmdAbilities' in this case). Finally we import the 'Character' typeclass. We need it, since 'CommandTest' doesn't use 'Character', but 'DefaultCharacter', which means the character calling the command won't have the abilities we have written in the 'Character' typeclass. -* Line 6-8: that's the body of our test. Here, a single command is tested in an entire class. Default commands are usually grouped by category in a single class. There is no rule, as long as you know where you put your tests. Note that we set the 'character_typeclass' class attribute to Character. As explained above, if you didn't do that, the system would create a 'DefaultCharacter' object, not a 'Character'. You can try to remove line 4 and 8 to see what happens when running the test. -* Line 10-11: our unique testing method. Note its name: it should begin by 'test_'. Apart from that, the method is quite simple: it's an instance method (so it takes the 'self' argument) but no other arguments are needed. Line 11 uses the 'call' method, which is defined in 'CommandTest'. It's a useful method that compares a command against an expected result. It would be like comparing two strings with 'assertEqual', but the 'call' method does more things, including testing the command in a realistic way (calling its hooks in the right order, so you don't have to worry about that). - -Line 11 can be understood as: test the 'abilities' command (first parameter), with no argument (second parameter), and check that the character using it receives his/her abilities (third parameter). - -Let's run our new test: - - > evennia --settings settings.py test commands - [...] - Creating test database for alias 'default'... - .. - ---------------------------------------------------------------------- - Ran 2 tests in 0.156s - - OK - Destroying test database for alias 'default'... - -Two tests were executed, since we have kept 'TestString' from last time. In case of failure, you will get much more information to help you fix the bug. - diff --git a/docs/0.9.1/_sources/Updating-Your-Game.md.txt b/docs/0.9.1/_sources/Updating-Your-Game.md.txt deleted file mode 100644 index 1cd548b27d..0000000000 --- a/docs/0.9.1/_sources/Updating-Your-Game.md.txt +++ /dev/null @@ -1,86 +0,0 @@ -# Updating Your Game - - -Fortunately, it's extremely easy to keep your Evennia server up-to-date. If you haven't already, see the [Getting Started guide](./Getting-Started) and get everything running. - -### Updating with the latest Evennia code changes - -Very commonly we make changes to the Evennia code to improve things. There are many ways to get told when to update: You can subscribe to the RSS feed or manually check up on the feeds from http://www.evennia.com. You can also simply fetch the latest regularly. - -When you're wanting to apply updates, simply `cd` to your cloned `evennia` root directory and type: - - git pull - -assuming you've got the command line client. If you're using a graphical client, you will probably want to navigate to the `evennia` directory and either right click and find your client's pull function, or use one of the menus (if applicable). - -You can review the latest changes with - - git log - -or the equivalent in the graphical client. You can also see the latest changes online [here](https://github.com/evennia/evennia/blob/master/CHANGELOG.md). - -You will always need to do `evennia reload` (or `reload` from -in-game) from your game-dir to have the new code affect your game. If you want to be really sure you should run a full `evennia reboot` so that both Server and Portal can restart (this will disconnect everyone though, so if you know the Portal has had no updates you don't have to do that). - -### Upgrading Evennia dependencies - -On occasion we update the versions of third-party libraries Evennia depend on (or we may add a new dependency). This will be announced on the mailing list/forum. If you run into errors when starting Evennia, always make sure you have the latest versions of everything. In some cases, like for Django, starting the server may also give warning saying that you are using a working, but too-old version that should not be used in production. - -Upgrading `evennia` will automatically fetch all the latest packages that it now need. First `cd` to your cloned `evennia` folder. Make sure your `virtualenv` is active and use - - pip install --upgrade -e . - -Remember the period (`.`) at the end - that applies the upgrade to the current location (your `evennia` dir). - -> The `-e` means that we are _linking_ the evennia sources rather than copying them into the environment. This means we can most of the time just update the sources (with `git pull`) and see those changes directly applied to our installed `evennia` package. Without installing/upgrading the package with `-e`, we would have to remember to upgrade the package every time we downloaded any new source-code changes. - -Follow the upgrade output to make sure it finishes without errors. To check what packages are currently available in your python environment after the upgrade, use - - pip list - -This will show you the version of all installed packages. The `evennia` package will also show the location of its source code. - -## Migrating the Database Schema - -Whenever we change the database layout of Evennia upstream (such as when we add new features) you will need to *migrate* your existing database. When this happens it will be clearly noted in the `git log` (it will say something to the effect of "Run migrations"). Database changes will also be announced on the Evennia [mailing list](https://groups.google.com/forum/#!forum/evennia). - -When the database schema changes, you just go to your game folder and run - - evennia migrate - -> Hint: If the `evennia` command is not found, you most likely need to activate your [virtualenv](./Glossary#virtualenv). - -## Resetting your database - -Should you ever want to start over completely from scratch, there is no need to re-download Evennia or anything like that. You just need to clear your database. Once you are done, you just rebuild it from scratch as described in [step 2](./Getting-Started#step-2-setting-up-your-game) of the [Getting Started guide](./Getting-Started). - -First stop a running server with - - evennia stop - -If you run the default `SQlite3` database (to change this you need to edit your `settings.py` file), the database is actually just a normal file in `mygame/server/` called `evennia.db3`. *Simply delete that file* - that's it. Now run `evennia migrate` to recreate a new, fresh one. - -If you run some other database system you can instead flush the database: - - evennia flush - -This will empty the database. However, it will not reset the internal counters of the database, so you will start with higher dbref values. If this is okay, this is all you need. - -Django also offers an easy way to start the database's own management should we want more direct control: - - evennia dbshell - -In e.g. MySQL you can then do something like this (assuming your MySQL database is named "Evennia": - - mysql> DROP DATABASE Evennia; - mysql> exit - -> NOTE: Under Windows OS, in order to access SQLite dbshell you need to [download the SQLite command-line shell program](https://www.sqlite.org/download.html). It's a single executable file (sqlite3.exe) that you should place in the root of either your MUD folder or Evennia's (it's the same, in both cases Django will find it). - -## More about schema migrations - -If and when an Evennia update modifies the database *schema* (that is, the under-the-hood details as to how data is stored in the database), you must update your existing database correspondingly to match the change. If you don't, the updated Evennia will complain that it cannot read the database properly. Whereas schema changes should become more and more rare as Evennia matures, it may still happen from time to time. - -One way one could handle this is to apply the changes manually to your database using the database's command line. This often means adding/removing new tables or fields as well as possibly convert existing data to match what the new Evennia version expects. It should be quite obvious that this quickly becomes cumbersome and error-prone. If your database doesn't contain anything critical yet it's probably easiest to simply reset it and start over rather than to bother converting. - -Enter *migrations*. Migrations keeps track of changes in the database schema and applies them automatically for you. Basically, whenever the schema changes we distribute small files called "migrations" with the source. Those tell the system exactly how to implement the change so you don't have to do so manually. When a migration has been added we will tell you so on Evennia's mailing lists and in commit messages - -you then just run `evennia migrate` to be up-to-date again. diff --git a/docs/0.9.1/_sources/Using-Travis.md.txt b/docs/0.9.1/_sources/Using-Travis.md.txt deleted file mode 100644 index 448f831df7..0000000000 --- a/docs/0.9.1/_sources/Using-Travis.md.txt +++ /dev/null @@ -1,25 +0,0 @@ -# Using Travis - -Evennia uses [Travis CI](http://travis-ci.org/) to check that it's building successfully after every commit to its Github repository (you can for example see the `build: passing` badge at the top of Evennia's [Readme file](https://github.com/evennia/evennia)). If your game is open source on Github you may also use Travis for free. See [the Travis docs](http://docs.travis-ci.com/user/getting-started/) for how to get started. - -After logging in you will get to point Travis to your repository on github. One further thing you need to set up yourself is a Travis config file named `.travis.yml` (note the initial period `.`). This should be created in the root of your game directory. The idea with this file is that it describes what Travis needs to import and build in order to create an instance of Evennia from scratch and then run validation tests on it. Here is an example: - -``` yaml -language: python -python: - - "2.7" -install: - - git clone https://github.com/evennia/evennia.git - - cd evennia - - pip install -e . - - cd $TRAVIS_BUILD_DIR -script: - - evennia migrate - - evennia test evennia - - evennia test -``` - -This will tell travis how to download Evennia, install it, set up a database and then run the test suite. -You need to add this file to git (`git add .travis.yml`) and then commit your changes before Travis will be able to see it. - -For properly testing your game you of course also need to write unittests. [We have a page](./Unit-Testing) on how we set those up for Evennia, you should be able to refer to that for making tests fitting your game. \ No newline at end of file diff --git a/docs/0.9.1/_sources/Version-Control.md.txt b/docs/0.9.1/_sources/Version-Control.md.txt deleted file mode 100644 index 1bff149831..0000000000 --- a/docs/0.9.1/_sources/Version-Control.md.txt +++ /dev/null @@ -1,333 +0,0 @@ -# Version Control - - -Version control software allows you to track the changes you make to your code, as well as being able to easily backtrack these changes, share your development efforts and more. Even if you are not contributing to Evennia itself, and only wish to develop your own MU* using Evennia, having a version control system in place is a good idea (and standard coding practice). For an introduction to the concept, start with the Wikipedia article [here](http://en.wikipedia.org/wiki/Version_control). Evennia uses the version control system [Git](https://git-scm.com/) and this is what will be covered henceforth. Note that this page also deals with commands for Linux operating systems, and the steps below may vary for other systems, however where possible links will be provided for alternative instructions. - -For more help on using Git, please refer to the [Official GitHub documentation](https://help.github.com/articles/set-up-git#platform-all). - -## Setting up Git - -If you have gotten Evennia installed, you will have Git already and can skip to **Step 2** below. Otherwise you will need to install Git on your platform. You can find expanded instructions for installation [here](http://git-scm.com/book/en/Getting-Started-Installing-Git). - -### Step 1: Install Git - -- **Fedora Linux** - - yum install git-core - -- **Debian Linux** _(Ubuntu, Linux Mint, etc.)_ - - apt-get install git - -- **Windows**: It is recommended to use [Git for Windows](http://msysgit.github.io/). -- **Mac**: Mac platforms offer two methods for installation, one via MacPorts, which you can find out about [here](http://git-scm.com/book/en/Getting-Started-Installing-Git#Installing-on-Mac), or you can use the [Git OSX Installer](https://sourceforge.net/projects/git-osx-installer/). - -### Step 2: Define user/e-mail Settings for Git - -To avoid a common issue later, you will need to set a couple of settings; first you will need to tell Git your username, followed by your e-mail address, so that when you commit code later you will be properly credited. - -> Note that your commit information will be visible to everyone if you ever contribute to Evennia or use an online service like github to host your code. So if you are not comfortable with using your real, full name online, put a nickname here. - -1. Set the default name for git to use when you commit: - - git config --global user.name "Your Name Here" - -2. Set the default email for git to use when you commit: - - git config --global user.email "your_email@example.com" - - -## Putting your game folder under version control - -> Note: The game folder's version control is completely separate from Evennia's repository. - -After you have set up your game you will have created a new folder to host your particular game (let's call this folder `mygame` for now). - -This folder is *not* under version control at this point. - - git init mygame - -Your mygame folder is now ready for version control! Now add all the content and make a first commit: - - cd mygame - git add * - git commit -m "Initial commit" - -Read on for help on what these commands do. - - -### Tracking files - -When working on your code or fix bugs in your local branches you may end up creating new files. If you do you must tell Git to track them by using the add command: - -``` -git add -``` - -You can check the current status of version control with `git status`. This will show if you have any modified, added or otherwise changed files. Some files, like database files, logs and temporary PID files are usually *not* tracked in version control. These should either not show up or have a question mark in front of them. - -### Controlling tracking - -You will notice that some files are not covered by your git version control, notably your settings file (`mygame/server/conf/settings.py`) and your sqlite3 database file `mygame/server/evennia.db3`. This is controlled by the hidden file `mygame/.gitignore`. Evennia creates this file as part of the creation of your game directory. Everything matched in this file will be ignored by GIT. If you want to, for example, include your settings file for collaborators to access, remove that entry in `.gitignore`. - -> Note: You should *never* put your sqlite3 database file into git by removing its entry in `.gitignore`. GIT is for backing up your code, not your database. That way lies madness and a good chance you'll confuse yourself so that after a few commits and reverts don't know what is in your database or not. If you want to backup your database, do so by simply copying the file on your hard drive to a backup-name. - -### Committing your Code - -> Committing means storing the current snapshot of your code within git. This creates a "save point" or "history" of your development process. You can later jump back and forth in your history, for example to figure out just when a bug was introduced or see what results the code used to produce compared to now. - -It's usually a good idea to commit your changes often. Committing is fast and local only - you will never commit anything online at this point. To commit your changes, use - -``` -git commit --all -``` - -This will save all changes you made since last commit. The command will open a text editor where you can add a message detailing the changes you've made. Make it brief but informative. You can see the history of commits with `git log`. If you don't want to use the editor you can set the message directly by using the `-m` flag: - -``` -git commit --all -m "This fixes a bug in the combat code." -``` - -### Changing your mind - -If you have non-committed changes that you realize you want to throw away, you can do the following: - -``` -git checkout -``` - -This will revert the file to the state it was in at your last `commit`, throwing away the changes you did to it since. It's a good way to make wild experiments without having to remember just what you changed. If you do ` git checkout .` you will throw away _all_ changes since the last commit. - -### Pushing your code online - -So far your code is only located on your private machine. A good idea is to back it up online. The easiest way to do this is to push it to your own remote repository on GitHub. - -1. Make sure you have your game directory setup under git version control as described above. Make sure to commit any changes. -2. Create a new, empty repository on Github. Github explains how [here](https://help.github.com/articles/create-a-repo/) (do *not* "Initialize the repository with a README" or else you'll create unrelated histories). -3. From your local game dir, do `git remote add origin ` where `` is the URL to your online repo. This tells your game dir that it should be pushing to the remote online dir. -4. `git remote -v` to verify the online dir. -5. `git push origin master` now pushes your game dir online so you can see it on github.com. - -You can commit your work locally (`git commit --all -m "Make a change that ..."`) as many times as you want. When you want to push those changes to your online repo, you do `git push`. You can also `git clone ` from your online repo to somewhere else (like your production server) and henceforth do `git pull` to update that to the latest thing you pushed. - -Note that GitHub's repos are, by default publicly visible by all. Creating a publicly visible online clone might not be what you want for all parts of your development process - you may prefer a more private venue when sharing your revolutionary work with your team. If that's the case you can change your repository to "Private" in the github settings. Then your code will only be visible to those you specifically grant access. - - -## Forking Evennia - -This helps you set up an online *fork* of Evennia so you can easily commit fixes and help with upstream development. - -### Step 1: Fork the evennia/master repository - -> Before proceeding with the following step, make sure you have registered and created an account on [GitHub.com](https://github.com/). This is necessary in order to create a fork of Evennia's master repository, and to push your commits to your fork either for yourself or for contributing to Evennia. - -A _fork_ is a clone of the master repository that you can make your own commits and changes to. At the top of [this page](https://github.com/evennia/evennia), click the "Fork" button, as it appears below. ![](https://github-images.s3.amazonaws.com/help/bootcamp/Bootcamp-Fork.png) - -### Step 2: Clone your fork - -The fork only exists online as of yet. In a terminal, change your directory to the folder you wish to develop in. From this directory run the following command: - -``` -git clone https://github.com/yourusername/evennia.git -``` - -This will download your fork to your computer. It creates a new folder `evennia/` at your current location. - -### Step 3: Configure remotes - -A _remote_ is a repository stored on another computer, in this case on GitHub's server. When a repository is cloned, it has a default remote called `origin`. This points to your fork on GitHub, not the original repository it was forked from. To easily keep track of the original repository (that is, Evennia's official repository), you need to add another remote. The standard name for this remote is "upstream". - -Below we change the active directory to the newly cloned "evennia" directory and then assign the original Evennia repository to a remote called "upstream": - -``` -cd evennia -git remote add upstream https://github.com/evennia/evennia.git -``` - -If you also want to access Evennia's `develop` branch (the bleeding edge development branch) do the following: - -``` -git fetch upstream develop -git checkout develop -``` - -You should now have the upstream branch available locally. You can use this instead of `master` below if you are contributing new features rather than bug fixes. - - -## Working with your fork - -> A _branch_ is a separate instance of your code. Changes you do to code in a branch does not affect that in other branches (so if you for example add/commit a file to one branch and then switches to another branch, that file will be gone until you switch back to the first branch again). One can switch between branches at will and create as many branches as one needs for a given project. The content of branches can also be merged together or deleted without affecting other branches. This is not only a common way to organize development but also to test features without messing with existing code. - -The default _branch_ of git is called the "master" branch. As a rule of thumb, you should *never* make modifications directly to your local copy of the master branch. Rather keep the master clean and only update it by pulling our latest changes to it. Any work you do should instead happen in a local, other branches. - -### Making a work branch - -``` -git checkout -b myfixes -``` - -This command will checkout and automatically create the new branch `myfixes` on your machine. If you stared out in the master branch, *myfixes* will be a perfect copy of the master branch. You can see which branch you are on with `git branch` and change between different branches with `git checkout `. - -Branches are fast and cheap to create and manage. It is common practice to create a new branch for every bug you want to work on or feature you want to create, then create a *pull request* for that branch to be merged upstream (see below). Not only will this organize your work, it will also make sure that *your* master branch version of Evennia is always exactly in sync with the upstream version's master branch. - -### Updating with upstream changes - -When Evennia's official repository updates, first make sure to commit all your changes to your branch and then checkout the "clean" master branch: - -``` -git commit --all -git checkout master -``` - -Pull the latest changes from upstream: - -``` -git pull upstream master -``` - -This should sync your local master branch with upstream Evennia's master branch. Now we go back to our own work-branch (let's say it's still called "myfixes") and _merge_ the updated master into our branch. - -``` -git checkout myfixes -git merge master -``` - -If everything went well, your `myfixes` branch will now have the latest version of Evennia merged with whatever changes you have done. Use `git log` to see what has changed. You may need to restart the server or run `manage.py migrate` if the database schema changed (this will be seen in the commit log and on the mailing list). See the [Git manuals](http://git-scm.com/documentation) for learning more about useful day-to-day commands, and special situations such as dealing with merge collisions. - -## Sharing your Code Publicly - -Up to this point your `myfixes` branch only exists on your local computer. No one else can see it. If you want a copy of this branch to also appear in your online fork on GitHub, make sure to have checked out your "myfixes" branch and then run the following: - -``` -git push -u origin myfixes -``` - -This will create a new _remote branch_ named "myfixes" in your online repository (which is refered to as "origin" by default); the `-u` flag makes sure to set this to the default push location. Henceforth you can just use `git push` from your myfixes branch to push your changes online. This is a great way to keep your source backed-up and accessible. Remember though that by default your repository will be public so everyone will be able to browse and download your code (same way as you can with Evennia itself). If you want secrecy you can change your repository to "Private" in the Github settings. Note though that if you do, you might have trouble contributing to Evennia (since we can't see the code you want to share). - -*Note: If you hadn't setup a public key on GitHub or aren't asked for a username/password, you might get an error `403: Forbidden Access` at this stage. In that case, some users have reported that the workaround is to create a file `.netrc` under your home directory and add your credentials there:* - -```bash -machine github.com -login -password -``` - -## Committing fixes to Evennia - -_Contributing_ can mean both bug-fixes or adding new features to Evennia. Please note that if your change is not already listed and accepted in the [Issue Tracker](https://github.com/evennia/evennia/issues), it is recommended that you first hit the developer mailing list or IRC chat to see beforehand if your feature is deemed suitable to include as a core feature in the engine. When it comes to bug-fixes, other developers may also have good input on how to go about resolving the issue. - -To contribute you need to have [forked Evennia](./Version-Control#forking-evennia) first. As described above you should do your modification in a separate local branch (not in the master branch). This branch is what you then present to us (as a *Pull request*, PR, see below). We can then merge your change into the upstream master and you then do `git pull` to update master usual. Now that the master is updated with your fixes, you can safely delete your local work branch. Below we describe this work flow. - -First update the Evennia master branch to the latest Evennia version: - -``` -git checkout master -git pull upstream master -``` - -Next, create a new branch to hold your contribution. Let's call it the "fixing_strange_bug" branch: - -``` -git checkout -b fixing_strange_bug -``` - -It is wise to make separate branches for every fix or series of fixes you want to contribute. You are now in your new `fixing_strange_bug` branch. You can list all branches with `git branch` and jump between branches with `git checkout `. Code and test things in here, committing as you go: - -``` -git commit --all -m "Fix strange bug in look command. Resolves #123." -``` - -You can make multiple commits if you want, depending on your work flow and progress. Make sure to always make clear and descriptive commit messages so it's easy to see what you intended. To refer to, say, issue number 123, write `#123`, it will turn to a link on GitHub. If you include the text "Resolves #123", that issue will be auto-closed on GitHub if your commit gets merged into main Evennia. - ->If you refer to in-game commands that start with `@`(such as `@examine`), please put them in backticks \`, for example \`@examine\`. The reason for this is that GitHub uses `@username` to refer to GitHub users, so if you forget the ticks, any user happening to be named `examine` will get a notification .... - -If you implement multiple separate features/bug-fixes, split them into different branches if they are very different and should be handled as separate PRs. You can do any number of commits to your branch as you work. Once you are at a stage where you want to show the world what you did you might want to consider making it clean for merging into Evennia's master branch by using [git rebase](https://www.git-scm.com/book/en/v2/Git-Branching-Rebasing) (this is not always necessary, and if it sounds too hard, say so and we'll handle it on our end). - -Once you are ready, push your work to your online Evennia fork on github, in a new remote branch: - -``` -git push -u origin fixing_strange_bug -``` - -The `-u` flag is only needed the first time - this tells GIT to create a remote branch. If you already created the remote branch earlier, just stand in your `fixing_strange_bug` branch and do `git push`. - -Now you should tell the Evennia developers that they should consider merging your brilliant changes into Evennia proper. [Create a pull request](https://github.com/evennia/evennia/pulls) and follow the instructions. Make sure to specifically select your `fixing_strange_bug` branch to be the source of the merge. Evennia developers will then be able to examine your request and merge it if it's deemed suitable. - -Once your changes have been merged into Evennia your local `fixing_strange_bug` can be deleted (since your changes are now available in the "clean" Evennia repository). Do - -``` -git branch -D fixing_strange_bug -``` - -to delete your work branch. Update your master branch (`checkout master` and then `git pull`) and you should get your fix back, now as a part of official Evennia! - - -## GIT tips and tricks - -Some of the GIT commands can feel a little long and clunky if you need to do them often. Luckily you can create aliases for those. Here are some useful commands to run: - - -``` -# git st -# - view brief status info -git config --global alias.st 'status -s' -``` - -Above, you only need to ever enter the `git config ...` command once - you have then added the new alias. Afterwards, just do `git st` to get status info. All the examples below follow the same template. - -``` -# git cl -# - clone a repository -git config --global alias.cl clone -``` - -``` -# git cma "commit message" -# - commit all changes without opening editor for message -git config --global alias.cma 'commit -a -m' -``` - -``` -# git ca -# - amend text to your latest commit message -git config --global alias.ca 'commit --amend' -``` - -``` -# git fl -# - file log; shows diffs of files in latest commits -git config --global alias.fl 'log -u' -``` - -``` -# git co [branchname] -# - checkout -git config --global alias.co checkout -``` - -``` -# git br -# - create branch -git config --global alias.br branch -``` - -``` -# git ls -# - view log tree -git config --global alias.ls 'log --pretty=format:"%C(green)%h\ %C(yellow)[%ad]%Cred%d\ %Creset%s%Cblue\ [%cn]" --decorate --date=relative --graph' -``` - -``` -# git diff -# - show current uncommitted changes -git config --global alias.diff 'diff --word-diff' -``` - -``` -# git grep -# - search (grep) codebase for a search criterion -git config --global alias.grep 'grep -Ii' -``` - -To get a further feel for GIT there is also [a good YouTube talk about it](https://www.youtube.com/watch?v=1ffBJ4sVUb4#t=1m58s) - it's a bit long but it will help you understand the underlying ideas behind GIT -(which in turn makes it a lot more intuitive to use). diff --git a/docs/0.9.1/_sources/Weather-Tutorial.md.txt b/docs/0.9.1/_sources/Weather-Tutorial.md.txt deleted file mode 100644 index 6997bc2679..0000000000 --- a/docs/0.9.1/_sources/Weather-Tutorial.md.txt +++ /dev/null @@ -1,40 +0,0 @@ -# Weather Tutorial - - -This tutorial will have us create a simple weather system for our MUD. The way we want to use this is to have all outdoor rooms echo weather-related messages to the room at regular and semi-random intervals. Things like "Clouds gather above", "It starts to rain" and so on. - -One could imagine every outdoor room in the game having a script running on themselves that fires regularly. For this particular example it is however more efficient to do it another way, namely by using a "ticker-subscription" model. The principle is simple: Instead of having each Object individually track the time, they instead subscribe to be called by a global ticker who handles time keeping. Not only does this centralize and organize much of the code in one place, it also has less computing overhead. - -Evennia offers the [TickerHandler](./TickerHandler) specifically for using the subscription model. We will use it for our weather system. - -We will assume you know how to make your own Typeclasses. If not see one of the beginning tutorials. We will create a new WeatherRoom typeclass that is aware of the day-night cycle. - -```python - - import random - from evennia import DefaultRoom, TICKER_HANDLER - - ECHOES = ["The sky is clear.", - "Clouds gather overhead.", - "It's starting to drizzle.", - "A breeze of wind is felt.", - "The wind is picking up"] # etc - - class WeatherRoom(DefaultRoom): - "This room is ticked at regular intervals" - - def at_object_creation(self): - "called only when the object is first created" - TICKER_HANDLER.add(60 * 60, self.at_weather_update) - - def at_weather_update(self, *args, **kwargs): - "ticked at regular intervals" - echo = random.choice(ECHOES) - self.msg_contents(echo) -``` - -In the `at_object_creation` method, we simply added ourselves to the TickerHandler and tell it to call `at_weather_update` every hour (`60*60` seconds). During testing you might want to play with a shorter time duration. - -For this to work we also create a custom hook `at_weather_update(*args, **kwargs)`, which is the call sign required by TickerHandler hooks. - -Henceforth the room will inform everyone inside it when the weather changes. This particular example is of course very simplistic - the weather echoes are just randomly chosen and don't care what weather came before it. Expanding it to be more realistic is a useful exercise. diff --git a/docs/0.9.1/_sources/Web-Character-View-Tutorial.md.txt b/docs/0.9.1/_sources/Web-Character-View-Tutorial.md.txt deleted file mode 100644 index 2d2c244021..0000000000 --- a/docs/0.9.1/_sources/Web-Character-View-Tutorial.md.txt +++ /dev/null @@ -1,165 +0,0 @@ -# Web Character View Tutorial - - -**Before doing this tutorial you will probably want to read the intro in [Basic Web tutorial](./Web-Tutorial).** - -In this tutorial we will create a web page that displays the stats of a game character. For this, and all other pages we want to make specific to our game, we'll need to create our own Django "app" - -We'll call our app `character`, since it will be dealing with character information. From your game dir, run - - evennia startapp character - -This will create a directory named `character` in the root of your game dir. It contains all basic files that a Django app needs. To keep `mygame` well ordered, move it to your `mygame/web/` directory instead: - - mv character web/ - -Note that we will not edit all files in this new directory, many of the generated files are outside the scope of this tutorial. - -In order for Django to find our new web app, we'll need to add it to the `INSTALLED_APPS` setting. Evennia's default installed apps are already set, so in `server/conf/settings.py`, we'll just extend them: - -```python -INSTALLED_APPS += ('web.character',) -``` - -> Note: That end comma is important. It makes sure that Python interprets the addition as a tuple instead of a string. - -The first thing we need to do is to create a *view* and an *URL pattern* to point to it. A view is a function that generates the web page that a visitor wants to see, while the URL pattern lets Django know what URL should trigger the view. The pattern may also provide some information of its own as we shall see. - -Here is our `character/urls.py` file (**Note**: you may have to create this file if a blank one wasn't generated for you): - -```python -# URL patterns for the character app - -from django.conf.urls import url -from web.character.views import sheet - -urlpatterns = [ - url(r'^sheet/(?P\d+)/$', sheet, name="sheet") -] -``` - -This file contains all of the URL patterns for the application. The `url` function in the `urlpatterns` list are given three arguments. The first argument is a pattern-string used to identify which URLs are valid. Patterns are specified as *regular expressions*. Regular expressions are used to match strings and are written in a special, very compact, syntax. A detailed description of regular expressions is beyond this tutorial but you can learn more about them [here](https://docs.python.org/2/howto/regex.html). For now, just accept that this regular expression requires that the visitor's URL looks something like this: - -```` -sheet/123/ -```` - -That is, `sheet/` followed by a number, rather than some other possible URL pattern. We will interpret this number as object ID. Thanks to how the regular expression is formulated, the pattern recognizer stores the number in a variable called `object_id`. This will be passed to the view (see below). We add the imported view function (`sheet`) in the second argument. We also add the `name` keyword to identify the URL pattern itself. You should always name your URL patterns, this makes them easy to refer to in html templates using the `{% url %}` tag (but we won't get more into that in this tutorial). - -> Security Note: Normally, users do not have the ability to see object IDs within the game (it's restricted to superusers only). Exposing the game's object IDs to the public like this enables griefers to perform what is known as an [account enumeration attack](http://www.sans.edu/research/security-laboratory/article/attacks-browsing) in the efforts of hijacking your superuser account. Consider this: in every Evennia installation, there are two objects that we can *always* expect to exist and have the same object IDs-- Limbo (#2) and the superuser you create in the beginning (#1). Thus, the griefer can get 50% of the information they need to hijack the admin account (the admin's username) just by navigating to `sheet/1`! - -Next we create `views.py`, the view file that `urls.py` refers to. - -```python -# Views for our character app - -from django.http import Http404 -from django.shortcuts import render -from django.conf import settings - -from evennia.utils.search import object_search -from evennia.utils.utils import inherits_from - -def sheet(request, object_id): - object_id = '#' + object_id - try: - character = object_search(object_id)[0] - except IndexError: - raise Http404("I couldn't find a character with that ID.") - if not inherits_from(character, settings.BASE_CHARACTER_TYPECLASS): - raise Http404("I couldn't find a character with that ID. " - "Found something else instead.") - return render(request, 'character/sheet.html', {'character': character}) -``` - -As explained earlier, the URL pattern parser in `urls.py` parses the URL and passes `object_id` to our view function `sheet`. We do a database search for the object using this number. We also make sure such an object exists and that it is actually a Character. The view function is also handed a `request` object. This gives us information about the request, such as if a logged-in user viewed it - we won't use that information here but it is good to keep in mind. - -On the last line, we call the `render` function. Apart from the `request` object, the `render` function takes a path to an html template and a dictionary with extra data you want to pass into said template. As extra data we pass the Character object we just found. In the template it will be available as the variable "character". - -The html template is created as `templates/character/sheet.html` under your `character` app folder. You may have to manually create both `template` and its subfolder `character`. Here's the template to create: - -````html -{% extends "base.html" %} -{% block content %} - -

{{ character.name }}

- -

{{ character.db.desc }}

- -

Stats

- - - - - - - - - - - - - - - - - - - - - -
StatValue
Strength{{ character.db.str }}
Intelligence{{ character.db.int }}
Speed{{ character.db.spd }}
- -

Skills

-
    - {% for skill in character.db.skills %} -
  • {{ skill }}
  • - {% empty %} -
  • This character has no skills yet.
  • - {% endfor %} -
- - {% if character.db.approved %} -

This character has been approved!

- {% else %} -

This character has not yet been approved!

- {% endif %} -{% endblock %} -```` - -In Django templates, `{% ... %}` denotes special in-template "functions" that Django understands. The `{{ ... }}` blocks work as "slots". They are replaced with whatever value the code inside the block returns. - -The first line, `{% extends "base.html" %}`, tells Django that this template extends the base template that Evennia is using. The base template is provided by the theme. Evennia comes with the open-source third-party theme `prosimii`. You can find it and its `base.html` in `evennia/web/templates/prosimii`. Like other templates, these can be overwritten. - -The next line is `{% block content %}`. The `base.html` file has `block`s, which are placeholders that templates can extend. The main block, and the one we use, is named `content`. - -We can access the `character` variable anywhere in the template because we passed it in the `render` call at the end of `view.py`. That means we also have access to the Character's `db` attributes, much like you would in normal Python code. You don't have the ability to call functions with arguments in the template-- in fact, if you need to do any complicated logic, you should do it in `view.py` and pass the results as more variables to the template. But you still have a great deal of flexibility in how you display the data. - -We can do a little bit of logic here as well. We use the `{% for %} ... {% endfor %}` and `{% if %} ... {% else %} ... {% endif %}` structures to change how the template renders depending on how many skills the user has, or if the user is approved (assuming your game has an approval system). - -The last file we need to edit is the master URLs file. This is needed in order to smoothly integrate the URLs from your new `character` app with the URLs from Evennia's existing pages. Find the file `web/urls.py` and update its `patterns` list as follows: - -```python -# web/urls.py - -custom_patterns = [ - url(r'^character/', include('web.character.urls')) - ] -``` - -Now reload the server with `evennia reload` and visit the page in your browser. If you haven't changed your defaults, you should be able to find the sheet for character `#1` at `http://localhost:4001/character/sheet/1/` - -Try updating the stats in-game and refresh the page in your browser. The results should show immediately. - -As an optional final step, you can also change your character typeclass to have a method called 'get_absolute_url'. -```python -# typeclasses/characters.py - - # inside Character - def get_absolute_url(self): - from django.urls import reverse - return reverse('character:sheet', kwargs={'object_id':self.id}) -``` -Doing so will give you a 'view on site' button in the top right of the Django Admin Objects changepage that links to your new character sheet, and allow you to get the link to a character's page by using {{ object.get_absolute_url }} in any template where you have a given object. - -*Now that you've made a basic page and app with Django, you may want to read the full Django tutorial to get a better idea of what it can do. [You can find Django's tutorial here](https://docs.djangoproject.com/en/1.8/intro/tutorial01/).* \ No newline at end of file diff --git a/docs/0.9.1/_sources/Web-Features.md.txt b/docs/0.9.1/_sources/Web-Features.md.txt deleted file mode 100644 index 4f03f1a516..0000000000 --- a/docs/0.9.1/_sources/Web-Features.md.txt +++ /dev/null @@ -1,78 +0,0 @@ -# Web Features - - -Evennia is its own webserver and hosts a default website and browser webclient. - -## Web site - -The Evennia website is a Django application that ties in with the MUD database. Since the website shares this database you could, for example, tell website visitors how many accounts are logged into the game at the moment, how long the server has been up and any other database information you may want. During development you can access the website by pointing your browser to `http://localhost:4001`. - -> You may also want to set `DEBUG = True` in your settings file for debugging the website. You will then see proper tracebacks in the browser rather than just error codes. Note however that this will *leak memory a lot* (it stores everything all the time) and is *not to be used in production*. It's recommended to only use `DEBUG` for active web development and to turn it off otherwise. - -A Django (and thus Evennia) website basically consists of three parts, a [view](https://docs.djangoproject.com/en/1.9/topics/http/views/) an associated [template](https://docs.djangoproject.com/en/1.9/topics/templates/) and an `urls.py` file. Think of the view as the Python back-end and the template as the HTML files you are served, optionally filled with data from the back-end. The urls file is a sort of mapping that tells Django that if a specific URL is given in the browser, a particular view should be triggered. You are wise to review the Django documentation for details on how to use these components. - -Evennia's default website is located in [evennia/web/website](https://github.com/evennia/evennia/tree/master/evennia/web/website). In this folder you'll find the simple default view as well as subfolders `templates` and `static`. Static files are things like images, CSS files and Javascript. - -### Customizing the Website - -You customize your website from your game directory. In the folder `web` you'll find folders `static`, `templates`, `static_overrides` and `templates_overrides`. The first two of those are populated automatically by Django and used to serve the website. You should not edit anything in them - the change will be lost. To customize the website you'll need to copy the file you want to change from the `web/website/template/` or `web/website/static/ path to the corresponding place under one of `_overrides` directories. - -Example: To override or modify `evennia/web/website/template/website/index.html` you need to add/modify `mygame/web/template_overrides/website/index.html`. - -The detailed description on how to customize the website is best described in tutorial form. See the [Web Tutorial](./Web-Tutorial) for more information. - -### Overloading Django views - -The Python backend for every HTML page is called a [Django view](https://docs.djangoproject.com/en/1.9/topics/http/views/). A view can do all sorts of functions, but the main one is to update variables data that the page can display, like how your out-of-the-box website will display statistics about number of users and database objects. - -To re-point a given page to a `view.py` of your own, you need to modify `mygame/web/urls.py`. An [URL pattern](https://docs.djangoproject.com/en/1.9/topics/http/urls/) is a [regular expression](https://en.wikipedia.org/wiki/Regular_expression) that you need to enter in the address field of your web browser to get to the page in question. If you put your own URL pattern *before* the default ones, your own view will be used instead. The file `urls.py` even marks where you should put your change. - -Here's an example: - -```python -# mygame/web/urls.py - -from django.conf.urls import url, include -# default patterns -from evennia.web.urls import urlpatterns - -# our own view to use as a replacement -from web.myviews import myview - -# custom patterns to add -patterns = [ - # overload the main page view - url(r'^', myview, name='mycustomview'), -] - -urlpatterns = patterns + urlpatterns - -``` - -Django will always look for a list named `urlpatterns` which consists of the results of `url()` calls. It will use the *first* match it finds in this list. Above, we add a new URL redirect from the root of the website. It will now our own function `myview` from a new module `mygame/web/myviews.py`. - -> If our game is found on `http://mygame.com`, the regular expression `"^"` means we just entered `mygame.com` in the address bar. If we had wanted to add a view for `http://mygame.com/awesome`, the regular expression would have been `^/awesome`. - -Look at [evennia/web/website/views.py](https://github.com/evennia/evennia/blob/master/evennia/web/website/views.py#L82) to see the inputs and outputs you must have to define a view. Easiest may be to copy the default file to `mygame/web` to have something to modify and expand on. - -Restart the server and reload the page in the browser - the website will now use your custom view. If there are errors, consider turning on `settings.DEBUG` to see the full tracebacks - in debug mode you will also log all requests in `mygame/server/logs/http_requests.log`. - -## Web client - - -Evennia comes with a MUD client accessible from a normal web browser. During -development you can try it at `http://localhost:4001/webclient`. -[See the Webclient page](./Webclient) for more details. - - -## The Django 'Admin' Page - -Django comes with a built-in [admin website](https://docs.djangoproject.com/en/1.10/ref/contrib/admin/). This is accessible by clicking the 'admin' button from your game website. The admin site allows you to see, edit and create objects in your database from a graphical interface. - -The behavior of default Evennia models are controlled by files `admin.py` in the Evennia package. New database models you choose to add yourself (such as in the Web Character View Tutorial) can/will also have `admin.py` files. New models are registered to the admin website by a call of `admin.site.register(model class, admin class)` inside an admin.py file. It is an error to attempt to register a model that has already been registered. - -To overload Evennia's admin files you don't need to modify Evennia itself. To customize you can call `admin.site.unregister(model class)`, then follow that with `admin.site.register` in one of your own admin.py files in a new app that you add. - -## More reading - -Evennia relies on Django for its web features. For details on expanding your web experience, the [Django documentation](https://docs.djangoproject.com/en) or the [Django Book](http://www.djangobook.com/en/2.0/index.html) are the main resources to look into. In Django lingo, the Evennia is a django "project" that consists of Django "applications". For the sake of web implementation, the relevant django "applications" in default Evennia are `web/website` or `web/webclient`. diff --git a/docs/0.9.1/_sources/Web-Tutorial.md.txt b/docs/0.9.1/_sources/Web-Tutorial.md.txt deleted file mode 100644 index f99ece569c..0000000000 --- a/docs/0.9.1/_sources/Web-Tutorial.md.txt +++ /dev/null @@ -1,64 +0,0 @@ -# Web Tutorial - - -Evennia uses the [Django](https://www.djangoproject.com/) web framework as the basis of both its database configuration and the website it provides. While a full understanding of Django requires reading the Django documentation, we have provided this tutorial to get you running with the basics and how they pertain to Evennia. This text details getting everything set up. The [Web-based Character view Tutorial](./Web-Character-View-Tutorial) gives a more explicit example of making a custom web page connected to your game, and you may want to read that after finishing this guide. - -## A Basic Overview - -Django is a web framework. It gives you a set of development tools for building a website quickly and easily. - -Django projects are split up into *apps* and these apps all contribute to one project. For instance, you might have an app for conducting polls, or an app for showing news posts or, like us, one for creating a web client. - -Each of these applications has a `urls.py` file, which specifies what [URL](http://en.wikipedia.org/wiki/Uniform_resource_locator)s are used by the app, a `views.py` file for the code that the URLs activate, a `templates` directory for displaying the results of that code in [HTML](http://en.wikipedia.org/wiki/Html) for the user, and a `static` folder that holds assets like [CSS](http://en.wikipedia.org/wiki/CSS), [Javascript](http://en.wikipedia.org/wiki/Javascript), and Image files (You may note your mygame/web folder does not have a `static` or `template` folder. This is intended and explained further below). Django applications may also have a `models.py` file for storing information in the database. We will not change any models here, take a look at the [New Models](./New-Models) page (as well as the [Django docs](https://docs.djangoproject.com/en/1.7/topics/db/models/) on models) if you are interested. - -There is also a root `urls.py` that determines the URL structure for the entire project. A starter `urls.py` is included in the default game template, and automatically imports all of Evennia's default URLs for you. This is located in `web/urls.py`. - -## Changing the logo on the front page - -Evennia's default logo is a fun little googly-eyed snake wrapped around a gear globe. As cute as it is, it probably doesn't represent your game. So one of the first things you may wish to do is replace it with a logo of your own. - -Django web apps all have _static assets_: CSS files, Javascript files, and Image files. In order to make sure the final project has all the static files it needs, the system collects the files from every app's `static` folder and places it in the `STATIC_ROOT` defined in `settings.py`. By default, the Evennia `STATIC_ROOT` is in `web/static`. - -Because Django pulls files from all of those separate places and puts them in one folder, it's possible for one file to overwrite another. We will use this to plug in our own files without having to change anything in the Evennia itself. - -By default, Evennia is configured to pull files you put in the `web/static_overrides` *after* all other static files. That means that files in `static_overrides` folder will overwrite any previously loaded files *having the same path under its static folder*. This last part is important to repeat: To overload the static resource from a standard `static` folder you need to replicate the path of folders and file names from that `static` folder in exactly the same way inside `static_overrides`. - -Let's see how this works for our logo. The default web application is in the Evennia library itself, in `evennia/web/`. We can see that there is a `static` folder here. If we browse down, we'll eventually find the full path to the Evennia logo file: `evennia/web/static/evennia_general/images/evennia_logo.png`. - -Inside our `static_overrides` we must replicate the part of the path inside the `static` folder, in other words, we must replicate `evennia_general/images/evennia_logo.png`. - -So, to change the logo, we need to create the folder path `evennia_general/images/` in `static_overrides`. We then rename our own logo file to `evennia_logo.png` and copy it there. The final path for this file would thus be: `web/static_overrides/evennia_general/images/evennia_logo.png` in your local game folder. - -To get this file pulled in, just change to your own game directory and reload the server: - -``` -evennia reload -``` - -This will reload the configuration and bring in the new static file(s). If you didn't want to reload the server you could instead use - -``` -evennia collectstatic -``` - -to only update the static files without any other changes. - -> **Note**: Evennia will collect static files automatically during startup. So if `evennia collectstatic` reports finding 0 files to collect, make sure you didn't start the engine at some point - if so the collector has already done its work! To make sure, connect to the website and check so the logo has actually changed to your own version. - -> **Note**: Sometimes the static asset collector can get confused. If no matter what you do, your overridden files aren't getting copied over the defaults, try removing the target file (or everything) in the `web/static` directory, and re-running `collectstatic` to gather everything from scratch. - -## Changing the Front Page's Text - -The default front page for Evennia contains information about the Evennia project. You'll probably want to replace this information with information about your own project. Changing the page template is done in a similar way to changing static resources. - -Like static files, Django looks through a series of template folders to find the file it wants. The difference is that Django does not copy all of the template files into one place, it just searches through the template folders until it finds a template that matches what it's looking for. This means that when you edit a template, the changes are instant. You don't have to reload the server or run any extra commands to see these changes - reloading the web page in your browser is enough. - -To replace the index page's text, we'll need to find the template for it. We'll go into more detail about how to determine which template is used for rendering a page in the [Web-based Character view Tutorial](./Web-Character-View-Tutorial). For now, you should know that the template we want to change is stored in `evennia/web/website/templates/website/index.html`. - -To replace this template file, you will put your changed template inside the `web/template_overrides/website` directory in your game folder. In the same way as with static resources you must replicate the path inside the default `template` directory exactly. So we must copy our replacement template named `index.html` there (or create the `website` directory in web/template_overrides` if it does not exist, first). The final path to the file should thus be: `web/template_overrides/website/index.html` within your game directory. - -Note that it is usually easier to just copy the original template over and edit it in place. The original file already has all the markup and tags, ready for editing. - -## Further reading - -For further hints on working with the web presence, you could now continue to the [Web-based Character view Tutorial](./Web-Character-View-Tutorial) where you learn to make a web page that displays in-game character stats. You can also look at [Django's own tutorial](https://docs.djangoproject.com/en/1.7/intro/tutorial01/) to get more insight in how Django works and what possibilities exist. diff --git a/docs/0.9.1/_sources/Webclient.md.txt b/docs/0.9.1/_sources/Webclient.md.txt deleted file mode 100644 index 610ad667cf..0000000000 --- a/docs/0.9.1/_sources/Webclient.md.txt +++ /dev/null @@ -1,261 +0,0 @@ -# Webclient - -# **Web client** - -Evennia comes with a MUD client accessible from a normal web browser. During development you can try it at `http://localhost:4001/webclient`. The client consists of several parts, all under `evennia/web/webclient/`: - -`templates/webclient/webclient.html` and `templates/webclient/base.html` are the very simplistic django html templates describing the webclient layout. - -`static/webclient/js/evennia.js` is the main evennia javascript library. This handles all communication between Evennia and the client over websockets and via AJAX/COMET if the browser can't handle websockets. It will make the Evennia object available to the javascript namespace, which offers methods for sending and receiving data to/from the server transparently. This is intended to be used also if swapping out the gui front end. - -`static/webclient/js/webclient_gui.js` is the default plugin manager. It adds the `plugins` and `plugin_manager` objects to the javascript namespace, coordinates the GUI operations between the various plugins, and uses the Evennia object library for all in/out. - -`static/webclient/js/plugins` provides a default set of plugins that implement a "telnet-like" interface. - -`static/webclient/css/webclient.css` is the CSS file for the client; it also defines things like how to display ANSI/Xterm256 colors etc. - -The server-side webclient protocols are found in `evennia/server/portal/webclient.py` and `webclient_ajax.py` for the two types of connections. You can't (and should not need to) modify these. - -## Customizing the web client - -Like was the case for the website, you override the webclient from your game directory. You need to add/modify a file in the matching directory location within one of the _overrides directories. These _override directories are NOT directly used by the web server when the game is running, the server copies everything web related in the Evennia folder over to `mygame/web/static/` and then copies in all of your _overrides. This can cause some cases were you edit a file, but it doesn't seem to make any difference in the servers behavior. **Before doing anything else, try shutting down the game and running `evennia collectstatic` from the command line then start it back up, clear your browser cache, and see if your edit shows up.** - -Example: To change the utilized plugin list, you need to override base.html by copying -`evennia/web/webclient/templates/webclient/base.html` to `mygame/web/template_overrides/webclient/base.html` and editing it to add your new plugin. - -# Evennia Web Client API (from evennia.js) -* `Evennia.init( opts )` -* `Evennia.connect()` -* `Evennia.isConnected()` -* `Evennia.msg( cmdname, args, kwargs, callback )` -* `Evennia.emit( cmdname, args, kwargs )` -* `log()` - -# Plugin Manager API (from webclient_gui.js) -* `options` Object, Stores key/value 'state' that can be used by plugins to coordinate behavior. -* `plugins` Object, key/value list of the all the loaded plugins. -* `plugin_handler` Object - * `plugin_handler.add("name", plugin)` - * `plugin_handler.onSend(string)` - -# Plugin callbacks API -* `init()` -- The only required callback -* `boolean onKeydown(event)` This plugin listens for Keydown events -* `onBeforeUnload()` This plugin does something special just before the webclient page/tab is closed. -* `onLoggedIn(args, kwargs)` This plugin does something when the webclient first logs in. -* `onGotOptions(args, kwargs)` This plugin does something with options sent from the server. -* `boolean onText(args, kwargs)` This plugin does something with messages sent from the server. -* `boolean onPrompt(args, kwargs)` This plugin does something when the server sends a prompt. -* `boolean onUnknownCmd(cmdname, args, kwargs)` This plugin does something with "unknown commands". -* `onConnectionClose(args, kwargs)` This plugin does something when the webclient disconnects from the server. -* `newstring onSend(string)` This plugin examines/alters text that other plugins generate. **Use with caution** - -The order of the plugins defined in `base.html` is important. All the callbacks for each plugin will be executed in that order. Functions marked "boolean" above must return true/false. Returning true will short-circuit the execution, so no other plugins lower in the base.html list will have their callback for this event called. This enables things like the up/down arrow keys for the history.js plugin to always occur before the default_in.js plugin adds that key to the current input buffer. - -# Example/Default Plugins (plugins/*.js) -* `clienthelp.js` Defines onOptionsUI from the options2 plugin. This is a mostly empty plugin to add some "How To" information for your game. -* `default_in.js` Defines onKeydown. key or mouse clicking the arrow will send the currently typed text. -* `default_out.js` Defines onText, onPrompt, and onUnknownCmd. Generates HTML output for the user. -* `default_unload.js` Defines onBeforeUnload. Prompts the user to confirm that they meant to leave/close the game. -* `font.js` Defines onOptionsUI. The plugin adds the ability to select your font and font size. -* `goldenlayout_default_config.js` Not actually a plugin, defines a global variable that goldenlayout uses to determine its window layout, known tag routing, etc. -* `goldenlayout.js` Defines onKeydown, onText and custom functions. A very powerful "tabbed" window manager for drag-n-drop windows, text routing and more. -* `history.js` Defines onKeydown and onSend. Creates a history of past sent commands, and uses arrow keys to peruse. -* `hotbuttons.js` Defines onGotOptions. A Disabled-by-default plugin that defines a button bar with user-assignable commands. -* `iframe.js` Defines onOptionsUI. A goldenlayout-only plugin to create a restricted browsing sub-window for a side-by-side web/text interface, mostly an example of how to build new HTML "components" for goldenlayout. -* `message_routing.js` Defines onOptionsUI, onText, onKeydown. This goldenlayout-only plugin implements regex matching to allow users to "tag" arbitrary text that matches, so that it gets routed to proper windows. Similar to "Spawn" functions for other clients. -* `multimedia.js` An basic plugin to allow the client to handle "image" "audio" and "video" messages from the server and display them as inline HTML. -* `notifications.js` Defines onText. Generates browser notification events for each new message while the tab is hidden. -* `oob.js` Defines onSend. Allows the user to test/send Out Of Band json messages to the server. -* `options.js` Defines most callbacks. Provides a popup-based UI to coordinate options settings with the server. -* `options2.js` Defines most callbacks. Provides a goldenlayout-based version of the options/settings tab. Integrates with other plugins via the custom onOptionsUI callback. -* `popups.js` Provides default popups/Dialog UI for other plugins to use. -* `splithandler.js` Defines onText. Provides an older, less-flexible alternative to goldenlayout for multi-window UI to automatically separate out screen real-estate by type of message. - -# Writing your own Plugins - -So, you love the functionality of the webclient, but your game has specific types of text that need to be separated out into their own space, visually. There are two plugins to help with this. The Goldenlayout plugin framework, and the older Splithandler framework. - -## GoldenLayout - -GoldenLayout is a web framework that allows web developers and their users to create their own tabbed/windowed layouts. Windows/tabs can be click-and-dragged from location to location by clicking on their titlebar and dragging until the "frame lines" appear. Dragging a window onto another window's titlebar will create a tabbed "Stack". The Evennia goldenlayout plugin defines 3 basic types of window: The Main window, input windows and non-main text output windows. The Main window and the first input window are unique in that they can't be "closed". - -The most basic customization is to provide your users with a default layout other than just one Main output and the one starting input window. This is done by modifying your server's goldenlayout_default_config.js. - -Start by creating a new `mygame/web/static_overrides/webclient/js/plugins/goldenlayout_default_config.js` file, and adding the following JSON variable: - -``` -var goldenlayout_config = { - content: [{ - type: 'column', - content: [{ - type: 'row', - content: [{ - type: 'column', - content: [{ - type: 'component', - componentName: 'Main', - isClosable: false, - tooltip: 'Main - drag to desired position.', - componentState: { - cssClass: 'content', - types: 'untagged', - updateMethod: 'newlines', - }, - }, { - type: 'component', - componentName: 'input', - id: 'inputComponent', - height: 10, - tooltip: 'Input - The last input in the layout is always the default.', - }, { - type: 'component', - componentName: 'input', - id: 'inputComponent', - height: 10, - isClosable: false, - tooltip: 'Input - The last input in the layout is always the default.', - }] - },{ - type: 'column', - content: [{ - type: 'component', - componentName: 'evennia', - componentId: 'evennia', - title: 'example', - height: 60, - isClosable: false, - componentState: { - types: 'some-tag-here', - updateMethod: 'newlines', - }, - }, { - type: 'component', - componentName: 'evennia', - componentId: 'evennia', - title: 'sheet', - isClosable: false, - componentState: { - types: 'sheet', - updateMethod: 'replace', - }, - }], - }], - }] - }] -}; -``` -This is a bit ugly, but hopefully, from the indentation, you can see that it creates a side-by-side (2-column) interface with 3 windows down the left side (The Main and 2 inputs) and a pair of windows on the right side for extra outputs. Any text tagged with "some-tag-here" will flow to the bottom of the "example" window, and any text tagged "sheet" will replace the text already in the "sheet" window. - -Note: GoldenLayout gets VERY confused and will break if you create two windows with the "Main" componentName. - -Now, let's say you want to display text on each window using different CSS. This is where new goldenlayout "components" come in. Each component is like a blueprint that gets stamped out when you create a new instance of that component, once it is defined, it won't be easily altered. You will need to define a new component, preferably in a new plugin file, and then add that into your page (either dynamically to the DOM via javascript, or by including the new plugin file into the base.html). - -First up, follow the directions in Customizing the Web Client section above to override the base.html. - -Next, add the new plugin to your copy of base.html: -``` - -``` -Remember, plugins are load-order dependent, so make sure the new ` -``` -Remember, plugins are load-order dependent, so make sure the new ` - - - - - - - - - - -
-
-
-
- -
-

evennia.prototypes.menus

-

OLC Prototype menu nodes

-
-
-evennia.prototypes.menus.node_validate_prototype(caller, raw_string, **kwargs)[source]
-

General node to view and validate a protototype

-
- -
-
-evennia.prototypes.menus.node_examine_entity(caller, raw_string, **kwargs)[source]
-

General node to view a text and then return to previous node. Kwargs should contain “text” for -the text to show and ‘back” pointing to the node to return to.

-
- -
-
-evennia.prototypes.menus.node_index(caller)[source]
-
- -
-
-evennia.prototypes.menus.node_prototype_key(caller)[source]
-
- -
-
-evennia.prototypes.menus.node_key(caller)[source]
-
- -
-
-evennia.prototypes.menus.node_location(caller)[source]
-
- -
-
-evennia.prototypes.menus.node_home(caller)[source]
-
- -
-
-evennia.prototypes.menus.node_destination(caller)[source]
-
- -
-
-evennia.prototypes.menus.node_prototype_desc(caller)[source]
-
- -
-
-evennia.prototypes.menus.node_apply_diff(caller, **kwargs)[source]
-

Offer options for updating objects

-
- -
-
-evennia.prototypes.menus.node_prototype_save(caller, **kwargs)[source]
-

Save prototype to disk

-
- -
-
-evennia.prototypes.menus.node_prototype_spawn(caller, **kwargs)[source]
-

Submenu for spawning the prototype

-
- -
-
-class evennia.prototypes.menus.OLCMenu(caller, menudata, startnode='start', cmdset_mergetype='Replace', cmdset_priority=1, auto_quit=True, auto_look=True, auto_help=True, cmd_on_exit='look', persistent=False, startnode_input='', session=None, debug=False, **kwargs)[source]
-

Bases: evennia.utils.evmenu.EvMenu

-

A custom EvMenu with a different formatting for the options.

-
-
-nodetext_formatter(nodetext)[source]
-

Format the node text itself.

-
- -
-
-options_formatter(optionlist)[source]
-

Split the options into two blocks - olc options and normal options

-
- -
-
-helptext_formatter(helptext)[source]
-

Show help text

-
- -
-
-display_helptext()[source]
-
- -
- -
-
-evennia.prototypes.menus.start_olc(caller, session=None, prototype=None)[source]
-

Start menu-driven olc system for prototypes.

-
-
Parameters
-
    -
  • caller (Object or Account) – The entity starting the menu.

  • -
  • session (Session, optional) – The individual session to get data.

  • -
  • prototype (dict, optional) – Given when editing an existing -prototype rather than creating a new one.

  • -
-
-
-
- -
- - -
-
-
-
- -
-
- - - - \ No newline at end of file diff --git a/docs/0.9.1/objects.inv b/docs/0.9.1/objects.inv deleted file mode 100644 index eac366b618..0000000000 Binary files a/docs/0.9.1/objects.inv and /dev/null differ diff --git a/docs/0.9.1/searchindex.js b/docs/0.9.1/searchindex.js deleted file mode 100644 index efedb5d118..0000000000 --- a/docs/0.9.1/searchindex.js +++ /dev/null @@ -1 +0,0 @@ -Search.setIndex({docnames:["A-voice-operated-elevator-using-events","API-refactoring","Accounts","Add-a-simple-new-web-page","Add-a-wiki-on-your-website","Adding-Command-Tutorial","Adding-Object-Typeclass-Tutorial","Administrative-Docs","Apache-Config","Arxcode-installing-help","Async-Process","Attributes","Banning","Batch-Code-Processor","Batch-Command-Processor","Batch-Processors","Bootstrap-&-Evennia","Bootstrap-Components-and-Utilities","Builder-Docs","Building-Permissions","Building-Quickstart","Building-a-mech-tutorial","Building-menus","Choosing-An-SQL-Server","Client-Support-Grid","Coding-FAQ","Coding-Introduction","Coding-Utils","Command-Cooldown","Command-Duration","Command-Prompt","Command-Sets","Command-System","Commands","Communications","Connection-Screen","Continuous-Integration","Contributing","Coordinates","Custom-Protocols","Customize-channels","Debugging","Default-Command-Help","Default-Exit-Errors","Developer-Central","Dialogues-in-events","Directory-Overview","Docs-refactoring","Dynamic-In-Game-Map","EvEditor","EvMenu","EvMore","Evennia-API","Evennia-Game-Index","Evennia-Introduction","Evennia-for-Diku-Users","Evennia-for-MUSH-Users","Evennia-for-roleplaying-sessions","Execute-Python-Code","First-Steps-Coding","Game-Planning","Gametime-Tutorial","Getting-Started","Glossary","Grapevine","Guest-Logins","HAProxy-Config-(Optional)","Help-System","Help-System-Tutorial","How-To-Get-And-Give-Help","How-to-connect-Evennia-to-Twitter","IRC","Implementing-a-game-rule-system","Inputfuncs","Installing-on-Android","Internationalization","Learn-Python-for-Evennia-The-Hard-Way","Licensing","Links","Locks","Manually-Configuring-Color","Mass-and-weight-for-objects","Messagepath","MonitorHandler","NPC-shop-Tutorial","New-Models","Nicks","OOB","Objects","Online-Setup","Parsing-command-arguments,-theory-and-best-practices","Portal-And-Server","Profiling","Python-3","Python-basic-introduction","Python-basic-tutorial-part-two","Quirks","RSS","Roadmap","Running-Evennia-in-Docker","Screenshot","Scripts","Security","Server-Conf","Sessions","Setting-up-PyCharm","Signals","Soft-Code","Spawner-and-Prototypes","Start-Stop-Reload","Static-In-Game-Map","Tags","Text-Encodings","TextTags","TickerHandler","Turn-based-Combat-System","Tutorial-Aggressive-NPCs","Tutorial-NPCs-listening","Tutorial-Searching-For-Objects","Tutorial-Tweeting-Game-Stats","Tutorial-Vehicles","Tutorial-World-Introduction","Tutorial-for-basic-MUSH-like-game","Tutorials","Typeclasses","Understanding-Color-Tags","Unit-Testing","Updating-Your-Game","Using-MUX-as-a-Standard","Using-Travis","Version-Control","Weather-Tutorial","Web-Character-Generation","Web-Character-View-Tutorial","Web-Features","Web-Tutorial","Webclient","Webclient-brainstorm","Wiki-Index","Zones","api/evennia","api/evennia-api","api/evennia.accounts","api/evennia.accounts.accounts","api/evennia.accounts.admin","api/evennia.accounts.bots","api/evennia.accounts.manager","api/evennia.accounts.models","api/evennia.commands","api/evennia.commands.cmdhandler","api/evennia.commands.cmdparser","api/evennia.commands.cmdset","api/evennia.commands.cmdsethandler","api/evennia.commands.command","api/evennia.commands.default","api/evennia.commands.default.account","api/evennia.commands.default.admin","api/evennia.commands.default.batchprocess","api/evennia.commands.default.building","api/evennia.commands.default.cmdset_account","api/evennia.commands.default.cmdset_character","api/evennia.commands.default.cmdset_session","api/evennia.commands.default.cmdset_unloggedin","api/evennia.commands.default.comms","api/evennia.commands.default.general","api/evennia.commands.default.help","api/evennia.commands.default.muxcommand","api/evennia.commands.default.syscommands","api/evennia.commands.default.system","api/evennia.commands.default.tests","api/evennia.commands.default.unloggedin","api/evennia.comms","api/evennia.comms.admin","api/evennia.comms.channelhandler","api/evennia.comms.comms","api/evennia.comms.managers","api/evennia.comms.models","api/evennia.contrib","api/evennia.contrib.barter","api/evennia.contrib.building_menu","api/evennia.contrib.chargen","api/evennia.contrib.clothing","api/evennia.contrib.color_markups","api/evennia.contrib.custom_gametime","api/evennia.contrib.dice","api/evennia.contrib.email_login","api/evennia.contrib.extended_room","api/evennia.contrib.fieldfill","api/evennia.contrib.gendersub","api/evennia.contrib.health_bar","api/evennia.contrib.ingame_python","api/evennia.contrib.ingame_python.callbackhandler","api/evennia.contrib.ingame_python.commands","api/evennia.contrib.ingame_python.eventfuncs","api/evennia.contrib.ingame_python.scripts","api/evennia.contrib.ingame_python.tests","api/evennia.contrib.ingame_python.typeclasses","api/evennia.contrib.ingame_python.utils","api/evennia.contrib.mail","api/evennia.contrib.mapbuilder","api/evennia.contrib.menu_login","api/evennia.contrib.multidescer","api/evennia.contrib.puzzles","api/evennia.contrib.random_string_generator","api/evennia.contrib.rplanguage","api/evennia.contrib.rpsystem","api/evennia.contrib.security","api/evennia.contrib.security.auditing","api/evennia.contrib.security.auditing.outputs","api/evennia.contrib.security.auditing.server","api/evennia.contrib.security.auditing.tests","api/evennia.contrib.simpledoor","api/evennia.contrib.slow_exit","api/evennia.contrib.talking_npc","api/evennia.contrib.tree_select","api/evennia.contrib.turnbattle","api/evennia.contrib.turnbattle.tb_basic","api/evennia.contrib.turnbattle.tb_equip","api/evennia.contrib.turnbattle.tb_items","api/evennia.contrib.turnbattle.tb_magic","api/evennia.contrib.turnbattle.tb_range","api/evennia.contrib.tutorial_examples","api/evennia.contrib.tutorial_examples.bodyfunctions","api/evennia.contrib.tutorial_examples.cmdset_red_button","api/evennia.contrib.tutorial_examples.example_batch_code","api/evennia.contrib.tutorial_examples.red_button","api/evennia.contrib.tutorial_examples.red_button_scripts","api/evennia.contrib.tutorial_examples.tests","api/evennia.contrib.tutorial_world","api/evennia.contrib.tutorial_world.mob","api/evennia.contrib.tutorial_world.objects","api/evennia.contrib.tutorial_world.rooms","api/evennia.contrib.unixcommand","api/evennia.contrib.wilderness","api/evennia.help","api/evennia.help.admin","api/evennia.help.manager","api/evennia.help.models","api/evennia.locks","api/evennia.locks.lockfuncs","api/evennia.locks.lockhandler","api/evennia.objects","api/evennia.objects.admin","api/evennia.objects.manager","api/evennia.objects.models","api/evennia.objects.objects","api/evennia.prototypes","api/evennia.prototypes.menus","api/evennia.prototypes.protfuncs","api/evennia.prototypes.prototypes","api/evennia.prototypes.spawner","api/evennia.scripts","api/evennia.scripts.admin","api/evennia.scripts.manager","api/evennia.scripts.models","api/evennia.scripts.monitorhandler","api/evennia.scripts.scripthandler","api/evennia.scripts.scripts","api/evennia.scripts.taskhandler","api/evennia.scripts.tickerhandler","api/evennia.server","api/evennia.server.admin","api/evennia.server.amp_client","api/evennia.server.connection_wizard","api/evennia.server.deprecations","api/evennia.server.evennia_launcher","api/evennia.server.game_index_client","api/evennia.server.game_index_client.client","api/evennia.server.game_index_client.service","api/evennia.server.initial_setup","api/evennia.server.inputfuncs","api/evennia.server.manager","api/evennia.server.models","api/evennia.server.portal","api/evennia.server.portal.amp","api/evennia.server.portal.amp_server","api/evennia.server.portal.grapevine","api/evennia.server.portal.irc","api/evennia.server.portal.mccp","api/evennia.server.portal.mssp","api/evennia.server.portal.mxp","api/evennia.server.portal.naws","api/evennia.server.portal.portal","api/evennia.server.portal.portalsessionhandler","api/evennia.server.portal.rss","api/evennia.server.portal.ssh","api/evennia.server.portal.ssl","api/evennia.server.portal.suppress_ga","api/evennia.server.portal.telnet","api/evennia.server.portal.telnet_oob","api/evennia.server.portal.telnet_ssl","api/evennia.server.portal.tests","api/evennia.server.portal.ttype","api/evennia.server.portal.webclient","api/evennia.server.portal.webclient_ajax","api/evennia.server.profiling","api/evennia.server.profiling.dummyrunner","api/evennia.server.profiling.dummyrunner_settings","api/evennia.server.profiling.memplot","api/evennia.server.profiling.settings_mixin","api/evennia.server.profiling.test_queries","api/evennia.server.profiling.tests","api/evennia.server.profiling.timetrace","api/evennia.server.server","api/evennia.server.serversession","api/evennia.server.session","api/evennia.server.sessionhandler","api/evennia.server.signals","api/evennia.server.throttle","api/evennia.server.validators","api/evennia.server.webserver","api/evennia.settings_default","api/evennia.typeclasses","api/evennia.typeclasses.admin","api/evennia.typeclasses.attributes","api/evennia.typeclasses.managers","api/evennia.typeclasses.models","api/evennia.typeclasses.tags","api/evennia.utils","api/evennia.utils.ansi","api/evennia.utils.batchprocessors","api/evennia.utils.containers","api/evennia.utils.create","api/evennia.utils.dbserialize","api/evennia.utils.eveditor","api/evennia.utils.evform","api/evennia.utils.evmenu","api/evennia.utils.evmore","api/evennia.utils.evtable","api/evennia.utils.gametime","api/evennia.utils.idmapper","api/evennia.utils.idmapper.manager","api/evennia.utils.idmapper.models","api/evennia.utils.idmapper.tests","api/evennia.utils.inlinefuncs","api/evennia.utils.logger","api/evennia.utils.optionclasses","api/evennia.utils.optionhandler","api/evennia.utils.picklefield","api/evennia.utils.search","api/evennia.utils.test_resources","api/evennia.utils.text2html","api/evennia.utils.utils","api/evennia.utils.validatorfuncs","api/evennia.web","api/evennia.web.urls","api/evennia.web.utils","api/evennia.web.utils.backends","api/evennia.web.utils.general_context","api/evennia.web.utils.middleware","api/evennia.web.utils.tests","api/evennia.web.webclient","api/evennia.web.webclient.urls","api/evennia.web.webclient.views","api/evennia.web.website","api/evennia.web.website.forms","api/evennia.web.website.templatetags","api/evennia.web.website.templatetags.addclass","api/evennia.web.website.tests","api/evennia.web.website.urls","api/evennia.web.website.views","index","toc"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":1,"sphinx.ext.todo":2,"sphinx.ext.viewcode":1,sphinx:56},filenames:["A-voice-operated-elevator-using-events.md","API-refactoring.md","Accounts.md","Add-a-simple-new-web-page.md","Add-a-wiki-on-your-website.md","Adding-Command-Tutorial.md","Adding-Object-Typeclass-Tutorial.md","Administrative-Docs.md","Apache-Config.md","Arxcode-installing-help.md","Async-Process.md","Attributes.md","Banning.md","Batch-Code-Processor.md","Batch-Command-Processor.md","Batch-Processors.md","Bootstrap-&-Evennia.md","Bootstrap-Components-and-Utilities.md","Builder-Docs.md","Building-Permissions.md","Building-Quickstart.md","Building-a-mech-tutorial.md","Building-menus.md","Choosing-An-SQL-Server.md","Client-Support-Grid.md","Coding-FAQ.md","Coding-Introduction.md","Coding-Utils.md","Command-Cooldown.md","Command-Duration.md","Command-Prompt.md","Command-Sets.md","Command-System.md","Commands.md","Communications.md","Connection-Screen.md","Continuous-Integration.md","Contributing.md","Coordinates.md","Custom-Protocols.md","Customize-channels.md","Debugging.md","Default-Command-Help.md","Default-Exit-Errors.md","Developer-Central.md","Dialogues-in-events.md","Directory-Overview.md","Docs-refactoring.md","Dynamic-In-Game-Map.md","EvEditor.md","EvMenu.md","EvMore.md","Evennia-API.md","Evennia-Game-Index.md","Evennia-Introduction.md","Evennia-for-Diku-Users.md","Evennia-for-MUSH-Users.md","Evennia-for-roleplaying-sessions.md","Execute-Python-Code.md","First-Steps-Coding.md","Game-Planning.md","Gametime-Tutorial.md","Getting-Started.md","Glossary.md","Grapevine.md","Guest-Logins.md","HAProxy-Config-(Optional).md","Help-System.md","Help-System-Tutorial.md","How-To-Get-And-Give-Help.md","How-to-connect-Evennia-to-Twitter.md","IRC.md","Implementing-a-game-rule-system.md","Inputfuncs.md","Installing-on-Android.md","Internationalization.md","Learn-Python-for-Evennia-The-Hard-Way.md","Licensing.md","Links.md","Locks.md","Manually-Configuring-Color.md","Mass-and-weight-for-objects.md","Messagepath.md","MonitorHandler.md","NPC-shop-Tutorial.md","New-Models.md","Nicks.md","OOB.md","Objects.md","Online-Setup.md","Parsing-command-arguments,-theory-and-best-practices.md","Portal-And-Server.md","Profiling.md","Python-3.md","Python-basic-introduction.md","Python-basic-tutorial-part-two.md","Quirks.md","RSS.md","Roadmap.md","Running-Evennia-in-Docker.md","Screenshot.md","Scripts.md","Security.md","Server-Conf.md","Sessions.md","Setting-up-PyCharm.md","Signals.md","Soft-Code.md","Spawner-and-Prototypes.md","Start-Stop-Reload.md","Static-In-Game-Map.md","Tags.md","Text-Encodings.md","TextTags.md","TickerHandler.md","Turn-based-Combat-System.md","Tutorial-Aggressive-NPCs.md","Tutorial-NPCs-listening.md","Tutorial-Searching-For-Objects.md","Tutorial-Tweeting-Game-Stats.md","Tutorial-Vehicles.md","Tutorial-World-Introduction.md","Tutorial-for-basic-MUSH-like-game.md","Tutorials.md","Typeclasses.md","Understanding-Color-Tags.md","Unit-Testing.md","Updating-Your-Game.md","Using-MUX-as-a-Standard.md","Using-Travis.md","Version-Control.md","Weather-Tutorial.md","Web-Character-Generation.md","Web-Character-View-Tutorial.md","Web-Features.md","Web-Tutorial.md","Webclient.md","Webclient-brainstorm.md","Wiki-Index.md","Zones.md","api/evennia.rst","api/evennia-api.rst","api/evennia.accounts.rst","api/evennia.accounts.accounts.rst","api/evennia.accounts.admin.rst","api/evennia.accounts.bots.rst","api/evennia.accounts.manager.rst","api/evennia.accounts.models.rst","api/evennia.commands.rst","api/evennia.commands.cmdhandler.rst","api/evennia.commands.cmdparser.rst","api/evennia.commands.cmdset.rst","api/evennia.commands.cmdsethandler.rst","api/evennia.commands.command.rst","api/evennia.commands.default.rst","api/evennia.commands.default.account.rst","api/evennia.commands.default.admin.rst","api/evennia.commands.default.batchprocess.rst","api/evennia.commands.default.building.rst","api/evennia.commands.default.cmdset_account.rst","api/evennia.commands.default.cmdset_character.rst","api/evennia.commands.default.cmdset_session.rst","api/evennia.commands.default.cmdset_unloggedin.rst","api/evennia.commands.default.comms.rst","api/evennia.commands.default.general.rst","api/evennia.commands.default.help.rst","api/evennia.commands.default.muxcommand.rst","api/evennia.commands.default.syscommands.rst","api/evennia.commands.default.system.rst","api/evennia.commands.default.tests.rst","api/evennia.commands.default.unloggedin.rst","api/evennia.comms.rst","api/evennia.comms.admin.rst","api/evennia.comms.channelhandler.rst","api/evennia.comms.comms.rst","api/evennia.comms.managers.rst","api/evennia.comms.models.rst","api/evennia.contrib.rst","api/evennia.contrib.barter.rst","api/evennia.contrib.building_menu.rst","api/evennia.contrib.chargen.rst","api/evennia.contrib.clothing.rst","api/evennia.contrib.color_markups.rst","api/evennia.contrib.custom_gametime.rst","api/evennia.contrib.dice.rst","api/evennia.contrib.email_login.rst","api/evennia.contrib.extended_room.rst","api/evennia.contrib.fieldfill.rst","api/evennia.contrib.gendersub.rst","api/evennia.contrib.health_bar.rst","api/evennia.contrib.ingame_python.rst","api/evennia.contrib.ingame_python.callbackhandler.rst","api/evennia.contrib.ingame_python.commands.rst","api/evennia.contrib.ingame_python.eventfuncs.rst","api/evennia.contrib.ingame_python.scripts.rst","api/evennia.contrib.ingame_python.tests.rst","api/evennia.contrib.ingame_python.typeclasses.rst","api/evennia.contrib.ingame_python.utils.rst","api/evennia.contrib.mail.rst","api/evennia.contrib.mapbuilder.rst","api/evennia.contrib.menu_login.rst","api/evennia.contrib.multidescer.rst","api/evennia.contrib.puzzles.rst","api/evennia.contrib.random_string_generator.rst","api/evennia.contrib.rplanguage.rst","api/evennia.contrib.rpsystem.rst","api/evennia.contrib.security.rst","api/evennia.contrib.security.auditing.rst","api/evennia.contrib.security.auditing.outputs.rst","api/evennia.contrib.security.auditing.server.rst","api/evennia.contrib.security.auditing.tests.rst","api/evennia.contrib.simpledoor.rst","api/evennia.contrib.slow_exit.rst","api/evennia.contrib.talking_npc.rst","api/evennia.contrib.tree_select.rst","api/evennia.contrib.turnbattle.rst","api/evennia.contrib.turnbattle.tb_basic.rst","api/evennia.contrib.turnbattle.tb_equip.rst","api/evennia.contrib.turnbattle.tb_items.rst","api/evennia.contrib.turnbattle.tb_magic.rst","api/evennia.contrib.turnbattle.tb_range.rst","api/evennia.contrib.tutorial_examples.rst","api/evennia.contrib.tutorial_examples.bodyfunctions.rst","api/evennia.contrib.tutorial_examples.cmdset_red_button.rst","api/evennia.contrib.tutorial_examples.example_batch_code.rst","api/evennia.contrib.tutorial_examples.red_button.rst","api/evennia.contrib.tutorial_examples.red_button_scripts.rst","api/evennia.contrib.tutorial_examples.tests.rst","api/evennia.contrib.tutorial_world.rst","api/evennia.contrib.tutorial_world.mob.rst","api/evennia.contrib.tutorial_world.objects.rst","api/evennia.contrib.tutorial_world.rooms.rst","api/evennia.contrib.unixcommand.rst","api/evennia.contrib.wilderness.rst","api/evennia.help.rst","api/evennia.help.admin.rst","api/evennia.help.manager.rst","api/evennia.help.models.rst","api/evennia.locks.rst","api/evennia.locks.lockfuncs.rst","api/evennia.locks.lockhandler.rst","api/evennia.objects.rst","api/evennia.objects.admin.rst","api/evennia.objects.manager.rst","api/evennia.objects.models.rst","api/evennia.objects.objects.rst","api/evennia.prototypes.rst","api/evennia.prototypes.menus.rst","api/evennia.prototypes.protfuncs.rst","api/evennia.prototypes.prototypes.rst","api/evennia.prototypes.spawner.rst","api/evennia.scripts.rst","api/evennia.scripts.admin.rst","api/evennia.scripts.manager.rst","api/evennia.scripts.models.rst","api/evennia.scripts.monitorhandler.rst","api/evennia.scripts.scripthandler.rst","api/evennia.scripts.scripts.rst","api/evennia.scripts.taskhandler.rst","api/evennia.scripts.tickerhandler.rst","api/evennia.server.rst","api/evennia.server.admin.rst","api/evennia.server.amp_client.rst","api/evennia.server.connection_wizard.rst","api/evennia.server.deprecations.rst","api/evennia.server.evennia_launcher.rst","api/evennia.server.game_index_client.rst","api/evennia.server.game_index_client.client.rst","api/evennia.server.game_index_client.service.rst","api/evennia.server.initial_setup.rst","api/evennia.server.inputfuncs.rst","api/evennia.server.manager.rst","api/evennia.server.models.rst","api/evennia.server.portal.rst","api/evennia.server.portal.amp.rst","api/evennia.server.portal.amp_server.rst","api/evennia.server.portal.grapevine.rst","api/evennia.server.portal.irc.rst","api/evennia.server.portal.mccp.rst","api/evennia.server.portal.mssp.rst","api/evennia.server.portal.mxp.rst","api/evennia.server.portal.naws.rst","api/evennia.server.portal.portal.rst","api/evennia.server.portal.portalsessionhandler.rst","api/evennia.server.portal.rss.rst","api/evennia.server.portal.ssh.rst","api/evennia.server.portal.ssl.rst","api/evennia.server.portal.suppress_ga.rst","api/evennia.server.portal.telnet.rst","api/evennia.server.portal.telnet_oob.rst","api/evennia.server.portal.telnet_ssl.rst","api/evennia.server.portal.tests.rst","api/evennia.server.portal.ttype.rst","api/evennia.server.portal.webclient.rst","api/evennia.server.portal.webclient_ajax.rst","api/evennia.server.profiling.rst","api/evennia.server.profiling.dummyrunner.rst","api/evennia.server.profiling.dummyrunner_settings.rst","api/evennia.server.profiling.memplot.rst","api/evennia.server.profiling.settings_mixin.rst","api/evennia.server.profiling.test_queries.rst","api/evennia.server.profiling.tests.rst","api/evennia.server.profiling.timetrace.rst","api/evennia.server.server.rst","api/evennia.server.serversession.rst","api/evennia.server.session.rst","api/evennia.server.sessionhandler.rst","api/evennia.server.signals.rst","api/evennia.server.throttle.rst","api/evennia.server.validators.rst","api/evennia.server.webserver.rst","api/evennia.settings_default.rst","api/evennia.typeclasses.rst","api/evennia.typeclasses.admin.rst","api/evennia.typeclasses.attributes.rst","api/evennia.typeclasses.managers.rst","api/evennia.typeclasses.models.rst","api/evennia.typeclasses.tags.rst","api/evennia.utils.rst","api/evennia.utils.ansi.rst","api/evennia.utils.batchprocessors.rst","api/evennia.utils.containers.rst","api/evennia.utils.create.rst","api/evennia.utils.dbserialize.rst","api/evennia.utils.eveditor.rst","api/evennia.utils.evform.rst","api/evennia.utils.evmenu.rst","api/evennia.utils.evmore.rst","api/evennia.utils.evtable.rst","api/evennia.utils.gametime.rst","api/evennia.utils.idmapper.rst","api/evennia.utils.idmapper.manager.rst","api/evennia.utils.idmapper.models.rst","api/evennia.utils.idmapper.tests.rst","api/evennia.utils.inlinefuncs.rst","api/evennia.utils.logger.rst","api/evennia.utils.optionclasses.rst","api/evennia.utils.optionhandler.rst","api/evennia.utils.picklefield.rst","api/evennia.utils.search.rst","api/evennia.utils.test_resources.rst","api/evennia.utils.text2html.rst","api/evennia.utils.utils.rst","api/evennia.utils.validatorfuncs.rst","api/evennia.web.rst","api/evennia.web.urls.rst","api/evennia.web.utils.rst","api/evennia.web.utils.backends.rst","api/evennia.web.utils.general_context.rst","api/evennia.web.utils.middleware.rst","api/evennia.web.utils.tests.rst","api/evennia.web.webclient.rst","api/evennia.web.webclient.urls.rst","api/evennia.web.webclient.views.rst","api/evennia.web.website.rst","api/evennia.web.website.forms.rst","api/evennia.web.website.templatetags.rst","api/evennia.web.website.templatetags.addclass.rst","api/evennia.web.website.tests.rst","api/evennia.web.website.urls.rst","api/evennia.web.website.views.rst","index.md","toc.md"],objects:{"":{evennia:[140,0,0,"-"]},"evennia.accounts":{accounts:[143,0,0,"-"],admin:[144,0,0,"-"],bots:[145,0,0,"-"],manager:[146,0,0,"-"],models:[147,0,0,"-"]},"evennia.accounts.accounts":{DefaultAccount:[143,1,1,""],DefaultGuest:[143,1,1,""]},"evennia.accounts.accounts.DefaultAccount":{"delete":[143,3,1,""],DoesNotExist:[143,2,1,""],MultipleObjectsReturned:[143,2,1,""],access:[143,3,1,""],at_access:[143,3,1,""],at_account_creation:[143,3,1,""],at_cmdset_get:[143,3,1,""],at_disconnect:[143,3,1,""],at_failed_login:[143,3,1,""],at_first_login:[143,3,1,""],at_first_save:[143,3,1,""],at_init:[143,3,1,""],at_look:[143,3,1,""],at_msg_receive:[143,3,1,""],at_msg_send:[143,3,1,""],at_password_change:[143,3,1,""],at_post_disconnect:[143,3,1,""],at_post_login:[143,3,1,""],at_pre_login:[143,3,1,""],at_server_reload:[143,3,1,""],at_server_shutdown:[143,3,1,""],authenticate:[143,3,1,""],basetype_setup:[143,3,1,""],character:[143,3,1,""],characters:[143,3,1,""],cmdset:[143,4,1,""],connection_time:[143,3,1,""],create:[143,3,1,""],create_character:[143,3,1,""],disconnect_session_from_account:[143,3,1,""],execute_cmd:[143,3,1,""],get_all_puppets:[143,3,1,""],get_puppet:[143,3,1,""],get_username_validators:[143,3,1,""],idle_time:[143,3,1,""],is_banned:[143,3,1,""],msg:[143,3,1,""],nicks:[143,4,1,""],normalize_username:[143,3,1,""],objects:[143,4,1,""],options:[143,4,1,""],path:[143,4,1,""],puppet:[143,3,1,""],puppet_object:[143,3,1,""],scripts:[143,4,1,""],search:[143,3,1,""],sessions:[143,4,1,""],set_password:[143,3,1,""],typename:[143,4,1,""],unpuppet_all:[143,3,1,""],unpuppet_object:[143,3,1,""],validate_password:[143,3,1,""],validate_username:[143,3,1,""]},"evennia.accounts.accounts.DefaultGuest":{DoesNotExist:[143,2,1,""],MultipleObjectsReturned:[143,2,1,""],at_post_disconnect:[143,3,1,""],at_post_login:[143,3,1,""],at_server_shutdown:[143,3,1,""],authenticate:[143,3,1,""],create:[143,3,1,""],path:[143,4,1,""],typename:[143,4,1,""]},"evennia.accounts.admin":{AccountAttributeInline:[144,1,1,""],AccountDBAdmin:[144,1,1,""],AccountDBChangeForm:[144,1,1,""],AccountDBCreationForm:[144,1,1,""],AccountForm:[144,1,1,""],AccountInline:[144,1,1,""],AccountTagInline:[144,1,1,""]},"evennia.accounts.admin.AccountAttributeInline":{media:[144,3,1,""],model:[144,4,1,""],related_field:[144,4,1,""]},"evennia.accounts.admin.AccountDBAdmin":{add_fieldsets:[144,4,1,""],add_form:[144,4,1,""],fieldsets:[144,4,1,""],form:[144,4,1,""],inlines:[144,4,1,""],list_display:[144,4,1,""],media:[144,3,1,""],response_add:[144,3,1,""],save_model:[144,3,1,""],user_change_password:[144,3,1,""]},"evennia.accounts.admin.AccountDBChangeForm":{Meta:[144,1,1,""],base_fields:[144,4,1,""],clean_username:[144,3,1,""],declared_fields:[144,4,1,""],media:[144,3,1,""]},"evennia.accounts.admin.AccountDBChangeForm.Meta":{fields:[144,4,1,""],model:[144,4,1,""]},"evennia.accounts.admin.AccountDBCreationForm":{Meta:[144,1,1,""],base_fields:[144,4,1,""],clean_username:[144,3,1,""],declared_fields:[144,4,1,""],media:[144,3,1,""]},"evennia.accounts.admin.AccountDBCreationForm.Meta":{fields:[144,4,1,""],model:[144,4,1,""]},"evennia.accounts.admin.AccountForm":{Meta:[144,1,1,""],base_fields:[144,4,1,""],declared_fields:[144,4,1,""],media:[144,3,1,""]},"evennia.accounts.admin.AccountForm.Meta":{app_label:[144,4,1,""],fields:[144,4,1,""],model:[144,4,1,""]},"evennia.accounts.admin.AccountInline":{extra:[144,4,1,""],fieldsets:[144,4,1,""],form:[144,4,1,""],max_num:[144,4,1,""],media:[144,3,1,""],model:[144,4,1,""],template:[144,4,1,""]},"evennia.accounts.admin.AccountTagInline":{media:[144,3,1,""],model:[144,4,1,""],related_field:[144,4,1,""]},"evennia.accounts.bots":{Bot:[145,1,1,""],BotStarter:[145,1,1,""],GrapevineBot:[145,1,1,""],IRCBot:[145,1,1,""],RSSBot:[145,1,1,""]},"evennia.accounts.bots.Bot":{DoesNotExist:[145,2,1,""],MultipleObjectsReturned:[145,2,1,""],at_server_shutdown:[145,3,1,""],basetype_setup:[145,3,1,""],execute_cmd:[145,3,1,""],msg:[145,3,1,""],path:[145,4,1,""],start:[145,3,1,""],typename:[145,4,1,""]},"evennia.accounts.bots.BotStarter":{DoesNotExist:[145,2,1,""],MultipleObjectsReturned:[145,2,1,""],at_repeat:[145,3,1,""],at_script_creation:[145,3,1,""],at_server_reload:[145,3,1,""],at_server_shutdown:[145,3,1,""],at_start:[145,3,1,""],path:[145,4,1,""],typename:[145,4,1,""]},"evennia.accounts.bots.GrapevineBot":{DoesNotExist:[145,2,1,""],MultipleObjectsReturned:[145,2,1,""],at_msg_send:[145,3,1,""],execute_cmd:[145,3,1,""],factory_path:[145,4,1,""],msg:[145,3,1,""],path:[145,4,1,""],start:[145,3,1,""],typename:[145,4,1,""]},"evennia.accounts.bots.IRCBot":{DoesNotExist:[145,2,1,""],MultipleObjectsReturned:[145,2,1,""],at_msg_send:[145,3,1,""],execute_cmd:[145,3,1,""],factory_path:[145,4,1,""],get_nicklist:[145,3,1,""],msg:[145,3,1,""],path:[145,4,1,""],ping:[145,3,1,""],reconnect:[145,3,1,""],start:[145,3,1,""],typename:[145,4,1,""]},"evennia.accounts.bots.RSSBot":{DoesNotExist:[145,2,1,""],MultipleObjectsReturned:[145,2,1,""],execute_cmd:[145,3,1,""],path:[145,4,1,""],start:[145,3,1,""],typename:[145,4,1,""]},"evennia.accounts.manager":{AccountManager:[146,1,1,""]},"evennia.accounts.models":{AccountDB:[147,1,1,""]},"evennia.accounts.models.AccountDB":{DoesNotExist:[147,2,1,""],MultipleObjectsReturned:[147,2,1,""],account_subscription_set:[147,4,1,""],cmdset_storage:[147,3,1,""],db_attributes:[147,4,1,""],db_cmdset_storage:[147,4,1,""],db_is_bot:[147,4,1,""],db_is_connected:[147,4,1,""],db_tags:[147,4,1,""],get_next_by_date_joined:[147,3,1,""],get_next_by_db_date_created:[147,3,1,""],get_previous_by_date_joined:[147,3,1,""],get_previous_by_db_date_created:[147,3,1,""],groups:[147,4,1,""],hide_from_accounts_set:[147,4,1,""],id:[147,4,1,""],is_bot:[147,3,1,""],is_connected:[147,3,1,""],key:[147,3,1,""],logentry_set:[147,4,1,""],name:[147,3,1,""],objectdb_set:[147,4,1,""],objects:[147,4,1,""],path:[147,4,1,""],receiver_account_set:[147,4,1,""],scriptdb_set:[147,4,1,""],sender_account_set:[147,4,1,""],typename:[147,4,1,""],uid:[147,3,1,""],user_permissions:[147,4,1,""]},"evennia.commands":{"default":[154,0,0,"-"],cmdhandler:[149,0,0,"-"],cmdparser:[150,0,0,"-"],cmdset:[151,0,0,"-"],cmdsethandler:[152,0,0,"-"],command:[153,0,0,"-"]},"evennia.commands.cmdhandler":{InterruptCommand:[149,2,1,""],cmdhandler:[149,5,1,""]},"evennia.commands.cmdparser":{build_matches:[150,5,1,""],cmdparser:[150,5,1,""],create_match:[150,5,1,""],try_num_prefixes:[150,5,1,""]},"evennia.commands.cmdset":{CmdSet:[151,1,1,""]},"evennia.commands.cmdset.CmdSet":{__init__:[151,3,1,""],add:[151,3,1,""],at_cmdset_creation:[151,3,1,""],count:[151,3,1,""],duplicates:[151,4,1,""],errmessage:[151,4,1,""],get:[151,3,1,""],get_all_cmd_keys_and_aliases:[151,3,1,""],get_system_cmds:[151,3,1,""],key:[151,4,1,""],key_mergetypes:[151,4,1,""],make_unique:[151,3,1,""],mergetype:[151,4,1,""],no_channels:[151,4,1,""],no_exits:[151,4,1,""],no_objs:[151,4,1,""],path:[151,4,1,""],permanent:[151,4,1,""],priority:[151,4,1,""],remove:[151,3,1,""],to_duplicate:[151,4,1,""]},"evennia.commands.cmdsethandler":{CmdSetHandler:[152,1,1,""],import_cmdset:[152,5,1,""]},"evennia.commands.cmdsethandler.CmdSetHandler":{"delete":[152,3,1,""],__init__:[152,3,1,""],add:[152,3,1,""],add_default:[152,3,1,""],all:[152,3,1,""],clear:[152,3,1,""],delete_default:[152,3,1,""],get:[152,3,1,""],has:[152,3,1,""],has_cmdset:[152,3,1,""],remove:[152,3,1,""],remove_default:[152,3,1,""],reset:[152,3,1,""],update:[152,3,1,""]},"evennia.commands.command":{Command:[153,1,1,""],CommandMeta:[153,1,1,""],InterruptCommand:[153,2,1,""]},"evennia.commands.command.Command":{__init__:[153,3,1,""],access:[153,3,1,""],aliases:[153,4,1,""],arg_regex:[153,4,1,""],at_post_cmd:[153,3,1,""],at_pre_cmd:[153,3,1,""],auto_help:[153,4,1,""],client_width:[153,3,1,""],execute_cmd:[153,3,1,""],func:[153,3,1,""],get_command_info:[153,3,1,""],get_extra_info:[153,3,1,""],get_help:[153,3,1,""],help_category:[153,4,1,""],is_exit:[153,4,1,""],key:[153,4,1,""],lock_storage:[153,4,1,""],lockhandler:[153,4,1,""],locks:[153,4,1,""],match:[153,3,1,""],msg:[153,3,1,""],msg_all_sessions:[153,4,1,""],parse:[153,3,1,""],save_for_next:[153,4,1,""],search_index_entry:[153,4,1,""],set_aliases:[153,3,1,""],set_key:[153,3,1,""],styled_footer:[153,3,1,""],styled_header:[153,3,1,""],styled_separator:[153,3,1,""],styled_table:[153,3,1,""]},"evennia.commands.command.CommandMeta":{__init__:[153,3,1,""]},"evennia.commands.default":{account:[155,0,0,"-"],admin:[156,0,0,"-"],batchprocess:[157,0,0,"-"],building:[158,0,0,"-"],cmdset_account:[159,0,0,"-"],cmdset_character:[160,0,0,"-"],cmdset_session:[161,0,0,"-"],cmdset_unloggedin:[162,0,0,"-"],comms:[163,0,0,"-"],general:[164,0,0,"-"],help:[165,0,0,"-"],muxcommand:[166,0,0,"-"],syscommands:[167,0,0,"-"],system:[168,0,0,"-"],unloggedin:[170,0,0,"-"]},"evennia.commands.default.account":{CmdCharCreate:[155,1,1,""],CmdCharDelete:[155,1,1,""],CmdColorTest:[155,1,1,""],CmdIC:[155,1,1,""],CmdOOC:[155,1,1,""],CmdOOCLook:[155,1,1,""],CmdOption:[155,1,1,""],CmdPassword:[155,1,1,""],CmdQuell:[155,1,1,""],CmdQuit:[155,1,1,""],CmdSessions:[155,1,1,""],CmdStyle:[155,1,1,""],CmdWho:[155,1,1,""]},"evennia.commands.default.account.CmdCharCreate":{account_caller:[155,4,1,""],aliases:[155,4,1,""],func:[155,3,1,""],help_category:[155,4,1,""],key:[155,4,1,""],lock_storage:[155,4,1,""],locks:[155,4,1,""],search_index_entry:[155,4,1,""]},"evennia.commands.default.account.CmdCharDelete":{aliases:[155,4,1,""],func:[155,3,1,""],help_category:[155,4,1,""],key:[155,4,1,""],lock_storage:[155,4,1,""],locks:[155,4,1,""],search_index_entry:[155,4,1,""]},"evennia.commands.default.account.CmdColorTest":{account_caller:[155,4,1,""],aliases:[155,4,1,""],func:[155,3,1,""],help_category:[155,4,1,""],key:[155,4,1,""],lock_storage:[155,4,1,""],locks:[155,4,1,""],search_index_entry:[155,4,1,""],slice_bright_bg:[155,4,1,""],slice_bright_fg:[155,4,1,""],slice_dark_bg:[155,4,1,""],slice_dark_fg:[155,4,1,""],table_format:[155,3,1,""]},"evennia.commands.default.account.CmdIC":{account_caller:[155,4,1,""],aliases:[155,4,1,""],func:[155,3,1,""],help_category:[155,4,1,""],key:[155,4,1,""],lock_storage:[155,4,1,""],locks:[155,4,1,""],search_index_entry:[155,4,1,""]},"evennia.commands.default.account.CmdOOC":{account_caller:[155,4,1,""],aliases:[155,4,1,""],func:[155,3,1,""],help_category:[155,4,1,""],key:[155,4,1,""],lock_storage:[155,4,1,""],locks:[155,4,1,""],search_index_entry:[155,4,1,""]},"evennia.commands.default.account.CmdOOCLook":{account_caller:[155,4,1,""],aliases:[155,4,1,""],func:[155,3,1,""],help_category:[155,4,1,""],key:[155,4,1,""],lock_storage:[155,4,1,""],locks:[155,4,1,""],search_index_entry:[155,4,1,""]},"evennia.commands.default.account.CmdOption":{account_caller:[155,4,1,""],aliases:[155,4,1,""],func:[155,3,1,""],help_category:[155,4,1,""],key:[155,4,1,""],lock_storage:[155,4,1,""],locks:[155,4,1,""],search_index_entry:[155,4,1,""],switch_options:[155,4,1,""]},"evennia.commands.default.account.CmdPassword":{account_caller:[155,4,1,""],aliases:[155,4,1,""],func:[155,3,1,""],help_category:[155,4,1,""],key:[155,4,1,""],lock_storage:[155,4,1,""],locks:[155,4,1,""],search_index_entry:[155,4,1,""]},"evennia.commands.default.account.CmdQuell":{account_caller:[155,4,1,""],aliases:[155,4,1,""],func:[155,3,1,""],help_category:[155,4,1,""],key:[155,4,1,""],lock_storage:[155,4,1,""],locks:[155,4,1,""],search_index_entry:[155,4,1,""]},"evennia.commands.default.account.CmdQuit":{account_caller:[155,4,1,""],aliases:[155,4,1,""],func:[155,3,1,""],help_category:[155,4,1,""],key:[155,4,1,""],lock_storage:[155,4,1,""],locks:[155,4,1,""],search_index_entry:[155,4,1,""],switch_options:[155,4,1,""]},"evennia.commands.default.account.CmdSessions":{account_caller:[155,4,1,""],aliases:[155,4,1,""],func:[155,3,1,""],help_category:[155,4,1,""],key:[155,4,1,""],lock_storage:[155,4,1,""],locks:[155,4,1,""],search_index_entry:[155,4,1,""]},"evennia.commands.default.account.CmdStyle":{aliases:[155,4,1,""],func:[155,3,1,""],help_category:[155,4,1,""],key:[155,4,1,""],list_styles:[155,3,1,""],lock_storage:[155,4,1,""],search_index_entry:[155,4,1,""],set:[155,3,1,""],switch_options:[155,4,1,""]},"evennia.commands.default.account.CmdWho":{account_caller:[155,4,1,""],aliases:[155,4,1,""],func:[155,3,1,""],help_category:[155,4,1,""],key:[155,4,1,""],lock_storage:[155,4,1,""],locks:[155,4,1,""],search_index_entry:[155,4,1,""]},"evennia.commands.default.admin":{CmdBan:[156,1,1,""],CmdBoot:[156,1,1,""],CmdEmit:[156,1,1,""],CmdForce:[156,1,1,""],CmdNewPassword:[156,1,1,""],CmdPerm:[156,1,1,""],CmdUnban:[156,1,1,""],CmdWall:[156,1,1,""]},"evennia.commands.default.admin.CmdBan":{aliases:[156,4,1,""],func:[156,3,1,""],help_category:[156,4,1,""],key:[156,4,1,""],lock_storage:[156,4,1,""],locks:[156,4,1,""],search_index_entry:[156,4,1,""]},"evennia.commands.default.admin.CmdBoot":{aliases:[156,4,1,""],func:[156,3,1,""],help_category:[156,4,1,""],key:[156,4,1,""],lock_storage:[156,4,1,""],locks:[156,4,1,""],search_index_entry:[156,4,1,""],switch_options:[156,4,1,""]},"evennia.commands.default.admin.CmdEmit":{aliases:[156,4,1,""],func:[156,3,1,""],help_category:[156,4,1,""],key:[156,4,1,""],lock_storage:[156,4,1,""],locks:[156,4,1,""],search_index_entry:[156,4,1,""],switch_options:[156,4,1,""]},"evennia.commands.default.admin.CmdForce":{aliases:[156,4,1,""],func:[156,3,1,""],help_category:[156,4,1,""],key:[156,4,1,""],lock_storage:[156,4,1,""],locks:[156,4,1,""],perm_used:[156,4,1,""],search_index_entry:[156,4,1,""]},"evennia.commands.default.admin.CmdNewPassword":{aliases:[156,4,1,""],func:[156,3,1,""],help_category:[156,4,1,""],key:[156,4,1,""],lock_storage:[156,4,1,""],locks:[156,4,1,""],search_index_entry:[156,4,1,""]},"evennia.commands.default.admin.CmdPerm":{aliases:[156,4,1,""],func:[156,3,1,""],help_category:[156,4,1,""],key:[156,4,1,""],lock_storage:[156,4,1,""],locks:[156,4,1,""],search_index_entry:[156,4,1,""],switch_options:[156,4,1,""]},"evennia.commands.default.admin.CmdUnban":{aliases:[156,4,1,""],func:[156,3,1,""],help_category:[156,4,1,""],key:[156,4,1,""],lock_storage:[156,4,1,""],locks:[156,4,1,""],search_index_entry:[156,4,1,""]},"evennia.commands.default.admin.CmdWall":{aliases:[156,4,1,""],func:[156,3,1,""],help_category:[156,4,1,""],key:[156,4,1,""],lock_storage:[156,4,1,""],locks:[156,4,1,""],search_index_entry:[156,4,1,""]},"evennia.commands.default.batchprocess":{CmdBatchCode:[157,1,1,""],CmdBatchCommands:[157,1,1,""]},"evennia.commands.default.batchprocess.CmdBatchCode":{aliases:[157,4,1,""],func:[157,3,1,""],help_category:[157,4,1,""],key:[157,4,1,""],lock_storage:[157,4,1,""],locks:[157,4,1,""],search_index_entry:[157,4,1,""],switch_options:[157,4,1,""]},"evennia.commands.default.batchprocess.CmdBatchCommands":{aliases:[157,4,1,""],func:[157,3,1,""],help_category:[157,4,1,""],key:[157,4,1,""],lock_storage:[157,4,1,""],locks:[157,4,1,""],search_index_entry:[157,4,1,""],switch_options:[157,4,1,""]},"evennia.commands.default.building":{CmdCopy:[158,1,1,""],CmdCpAttr:[158,1,1,""],CmdCreate:[158,1,1,""],CmdDesc:[158,1,1,""],CmdDestroy:[158,1,1,""],CmdDig:[158,1,1,""],CmdExamine:[158,1,1,""],CmdFind:[158,1,1,""],CmdLink:[158,1,1,""],CmdListCmdSets:[158,1,1,""],CmdLock:[158,1,1,""],CmdMvAttr:[158,1,1,""],CmdName:[158,1,1,""],CmdOpen:[158,1,1,""],CmdScript:[158,1,1,""],CmdSetAttribute:[158,1,1,""],CmdSetHome:[158,1,1,""],CmdSetObjAlias:[158,1,1,""],CmdSpawn:[158,1,1,""],CmdTag:[158,1,1,""],CmdTeleport:[158,1,1,""],CmdTunnel:[158,1,1,""],CmdTypeclass:[158,1,1,""],CmdUnLink:[158,1,1,""],CmdWipe:[158,1,1,""],ObjManipCommand:[158,1,1,""]},"evennia.commands.default.building.CmdCopy":{aliases:[158,4,1,""],func:[158,3,1,""],help_category:[158,4,1,""],key:[158,4,1,""],lock_storage:[158,4,1,""],locks:[158,4,1,""],search_index_entry:[158,4,1,""]},"evennia.commands.default.building.CmdCpAttr":{aliases:[158,4,1,""],check_from_attr:[158,3,1,""],check_has_attr:[158,3,1,""],check_to_attr:[158,3,1,""],func:[158,3,1,""],get_attr:[158,3,1,""],help_category:[158,4,1,""],key:[158,4,1,""],lock_storage:[158,4,1,""],locks:[158,4,1,""],search_index_entry:[158,4,1,""],switch_options:[158,4,1,""]},"evennia.commands.default.building.CmdCreate":{aliases:[158,4,1,""],func:[158,3,1,""],help_category:[158,4,1,""],key:[158,4,1,""],lock_storage:[158,4,1,""],locks:[158,4,1,""],new_obj_lockstring:[158,4,1,""],search_index_entry:[158,4,1,""],switch_options:[158,4,1,""]},"evennia.commands.default.building.CmdDesc":{aliases:[158,4,1,""],edit_handler:[158,3,1,""],func:[158,3,1,""],help_category:[158,4,1,""],key:[158,4,1,""],lock_storage:[158,4,1,""],locks:[158,4,1,""],search_index_entry:[158,4,1,""],switch_options:[158,4,1,""]},"evennia.commands.default.building.CmdDestroy":{aliases:[158,4,1,""],confirm:[158,4,1,""],default_confirm:[158,4,1,""],func:[158,3,1,""],help_category:[158,4,1,""],key:[158,4,1,""],lock_storage:[158,4,1,""],locks:[158,4,1,""],search_index_entry:[158,4,1,""],switch_options:[158,4,1,""]},"evennia.commands.default.building.CmdDig":{aliases:[158,4,1,""],func:[158,3,1,""],help_category:[158,4,1,""],key:[158,4,1,""],lock_storage:[158,4,1,""],locks:[158,4,1,""],new_room_lockstring:[158,4,1,""],search_index_entry:[158,4,1,""],switch_options:[158,4,1,""]},"evennia.commands.default.building.CmdExamine":{account_mode:[158,4,1,""],aliases:[158,4,1,""],arg_regex:[158,4,1,""],detail_color:[158,4,1,""],format_attributes:[158,3,1,""],format_output:[158,3,1,""],func:[158,3,1,""],header_color:[158,4,1,""],help_category:[158,4,1,""],key:[158,4,1,""],list_attribute:[158,3,1,""],lock_storage:[158,4,1,""],locks:[158,4,1,""],quell_color:[158,4,1,""],search_index_entry:[158,4,1,""],separator:[158,4,1,""]},"evennia.commands.default.building.CmdFind":{aliases:[158,4,1,""],func:[158,3,1,""],help_category:[158,4,1,""],key:[158,4,1,""],lock_storage:[158,4,1,""],locks:[158,4,1,""],search_index_entry:[158,4,1,""],switch_options:[158,4,1,""]},"evennia.commands.default.building.CmdLink":{aliases:[158,4,1,""],func:[158,3,1,""],help_category:[158,4,1,""],key:[158,4,1,""],lock_storage:[158,4,1,""],locks:[158,4,1,""],search_index_entry:[158,4,1,""]},"evennia.commands.default.building.CmdListCmdSets":{aliases:[158,4,1,""],func:[158,3,1,""],help_category:[158,4,1,""],key:[158,4,1,""],lock_storage:[158,4,1,""],locks:[158,4,1,""],search_index_entry:[158,4,1,""]},"evennia.commands.default.building.CmdLock":{aliases:[158,4,1,""],func:[158,3,1,""],help_category:[158,4,1,""],key:[158,4,1,""],lock_storage:[158,4,1,""],locks:[158,4,1,""],search_index_entry:[158,4,1,""]},"evennia.commands.default.building.CmdMvAttr":{aliases:[158,4,1,""],func:[158,3,1,""],help_category:[158,4,1,""],key:[158,4,1,""],lock_storage:[158,4,1,""],locks:[158,4,1,""],search_index_entry:[158,4,1,""],switch_options:[158,4,1,""]},"evennia.commands.default.building.CmdName":{aliases:[158,4,1,""],func:[158,3,1,""],help_category:[158,4,1,""],key:[158,4,1,""],lock_storage:[158,4,1,""],locks:[158,4,1,""],search_index_entry:[158,4,1,""]},"evennia.commands.default.building.CmdOpen":{aliases:[158,4,1,""],create_exit:[158,3,1,""],func:[158,3,1,""],help_category:[158,4,1,""],key:[158,4,1,""],lock_storage:[158,4,1,""],locks:[158,4,1,""],new_obj_lockstring:[158,4,1,""],search_index_entry:[158,4,1,""]},"evennia.commands.default.building.CmdScript":{aliases:[158,4,1,""],func:[158,3,1,""],help_category:[158,4,1,""],key:[158,4,1,""],lock_storage:[158,4,1,""],locks:[158,4,1,""],search_index_entry:[158,4,1,""],switch_options:[158,4,1,""]},"evennia.commands.default.building.CmdSetAttribute":{aliases:[158,4,1,""],check_attr:[158,3,1,""],check_obj:[158,3,1,""],do_nested_lookup:[158,3,1,""],edit_handler:[158,3,1,""],func:[158,3,1,""],help_category:[158,4,1,""],key:[158,4,1,""],lock_storage:[158,4,1,""],locks:[158,4,1,""],nested_re:[158,4,1,""],not_found:[158,4,1,""],rm_attr:[158,3,1,""],search_for_obj:[158,3,1,""],search_index_entry:[158,4,1,""],set_attr:[158,3,1,""],split_nested_attr:[158,3,1,""],view_attr:[158,3,1,""]},"evennia.commands.default.building.CmdSetHome":{aliases:[158,4,1,""],func:[158,3,1,""],help_category:[158,4,1,""],key:[158,4,1,""],lock_storage:[158,4,1,""],locks:[158,4,1,""],search_index_entry:[158,4,1,""]},"evennia.commands.default.building.CmdSetObjAlias":{aliases:[158,4,1,""],func:[158,3,1,""],help_category:[158,4,1,""],key:[158,4,1,""],lock_storage:[158,4,1,""],locks:[158,4,1,""],search_index_entry:[158,4,1,""],switch_options:[158,4,1,""]},"evennia.commands.default.building.CmdSpawn":{aliases:[158,4,1,""],func:[158,3,1,""],help_category:[158,4,1,""],key:[158,4,1,""],lock_storage:[158,4,1,""],locks:[158,4,1,""],search_index_entry:[158,4,1,""],switch_options:[158,4,1,""]},"evennia.commands.default.building.CmdTag":{aliases:[158,4,1,""],arg_regex:[158,4,1,""],func:[158,3,1,""],help_category:[158,4,1,""],key:[158,4,1,""],lock_storage:[158,4,1,""],locks:[158,4,1,""],options:[158,4,1,""],search_index_entry:[158,4,1,""]},"evennia.commands.default.building.CmdTeleport":{aliases:[158,4,1,""],func:[158,3,1,""],help_category:[158,4,1,""],key:[158,4,1,""],lock_storage:[158,4,1,""],locks:[158,4,1,""],rhs_split:[158,4,1,""],search_index_entry:[158,4,1,""],switch_options:[158,4,1,""]},"evennia.commands.default.building.CmdTunnel":{aliases:[158,4,1,""],directions:[158,4,1,""],func:[158,3,1,""],help_category:[158,4,1,""],key:[158,4,1,""],lock_storage:[158,4,1,""],locks:[158,4,1,""],search_index_entry:[158,4,1,""],switch_options:[158,4,1,""]},"evennia.commands.default.building.CmdTypeclass":{aliases:[158,4,1,""],func:[158,3,1,""],help_category:[158,4,1,""],key:[158,4,1,""],lock_storage:[158,4,1,""],locks:[158,4,1,""],search_index_entry:[158,4,1,""],switch_options:[158,4,1,""]},"evennia.commands.default.building.CmdUnLink":{aliases:[158,4,1,""],func:[158,3,1,""],help_category:[158,4,1,""],help_key:[158,4,1,""],key:[158,4,1,""],lock_storage:[158,4,1,""],locks:[158,4,1,""],search_index_entry:[158,4,1,""]},"evennia.commands.default.building.CmdWipe":{aliases:[158,4,1,""],func:[158,3,1,""],help_category:[158,4,1,""],key:[158,4,1,""],lock_storage:[158,4,1,""],locks:[158,4,1,""],search_index_entry:[158,4,1,""]},"evennia.commands.default.building.ObjManipCommand":{aliases:[158,4,1,""],help_category:[158,4,1,""],key:[158,4,1,""],lock_storage:[158,4,1,""],parse:[158,3,1,""],search_index_entry:[158,4,1,""]},"evennia.commands.default.cmdset_account":{AccountCmdSet:[159,1,1,""]},"evennia.commands.default.cmdset_account.AccountCmdSet":{at_cmdset_creation:[159,3,1,""],key:[159,4,1,""],path:[159,4,1,""],priority:[159,4,1,""]},"evennia.commands.default.cmdset_character":{CharacterCmdSet:[160,1,1,""]},"evennia.commands.default.cmdset_character.CharacterCmdSet":{at_cmdset_creation:[160,3,1,""],key:[160,4,1,""],path:[160,4,1,""],priority:[160,4,1,""]},"evennia.commands.default.cmdset_session":{SessionCmdSet:[161,1,1,""]},"evennia.commands.default.cmdset_session.SessionCmdSet":{at_cmdset_creation:[161,3,1,""],key:[161,4,1,""],path:[161,4,1,""],priority:[161,4,1,""]},"evennia.commands.default.cmdset_unloggedin":{UnloggedinCmdSet:[162,1,1,""]},"evennia.commands.default.cmdset_unloggedin.UnloggedinCmdSet":{at_cmdset_creation:[162,3,1,""],key:[162,4,1,""],path:[162,4,1,""],priority:[162,4,1,""]},"evennia.commands.default.comms":{CmdAddCom:[163,1,1,""],CmdAllCom:[163,1,1,""],CmdCBoot:[163,1,1,""],CmdCWho:[163,1,1,""],CmdCdesc:[163,1,1,""],CmdCdestroy:[163,1,1,""],CmdCemit:[163,1,1,""],CmdChannelCreate:[163,1,1,""],CmdChannels:[163,1,1,""],CmdClock:[163,1,1,""],CmdDelCom:[163,1,1,""],CmdIRC2Chan:[163,1,1,""],CmdPage:[163,1,1,""],CmdRSS2Chan:[163,1,1,""]},"evennia.commands.default.comms.CmdAddCom":{account_caller:[163,4,1,""],aliases:[163,4,1,""],func:[163,3,1,""],help_category:[163,4,1,""],key:[163,4,1,""],lock_storage:[163,4,1,""],locks:[163,4,1,""],search_index_entry:[163,4,1,""]},"evennia.commands.default.comms.CmdAllCom":{account_caller:[163,4,1,""],aliases:[163,4,1,""],func:[163,3,1,""],help_category:[163,4,1,""],key:[163,4,1,""],lock_storage:[163,4,1,""],locks:[163,4,1,""],search_index_entry:[163,4,1,""]},"evennia.commands.default.comms.CmdCBoot":{account_caller:[163,4,1,""],aliases:[163,4,1,""],func:[163,3,1,""],help_category:[163,4,1,""],key:[163,4,1,""],lock_storage:[163,4,1,""],locks:[163,4,1,""],search_index_entry:[163,4,1,""],switch_options:[163,4,1,""]},"evennia.commands.default.comms.CmdCWho":{account_caller:[163,4,1,""],aliases:[163,4,1,""],func:[163,3,1,""],help_category:[163,4,1,""],key:[163,4,1,""],lock_storage:[163,4,1,""],locks:[163,4,1,""],search_index_entry:[163,4,1,""]},"evennia.commands.default.comms.CmdCdesc":{account_caller:[163,4,1,""],aliases:[163,4,1,""],func:[163,3,1,""],help_category:[163,4,1,""],key:[163,4,1,""],lock_storage:[163,4,1,""],locks:[163,4,1,""],search_index_entry:[163,4,1,""]},"evennia.commands.default.comms.CmdCdestroy":{account_caller:[163,4,1,""],aliases:[163,4,1,""],func:[163,3,1,""],help_category:[163,4,1,""],key:[163,4,1,""],lock_storage:[163,4,1,""],locks:[163,4,1,""],search_index_entry:[163,4,1,""]},"evennia.commands.default.comms.CmdCemit":{account_caller:[163,4,1,""],aliases:[163,4,1,""],func:[163,3,1,""],help_category:[163,4,1,""],key:[163,4,1,""],lock_storage:[163,4,1,""],locks:[163,4,1,""],search_index_entry:[163,4,1,""],switch_options:[163,4,1,""]},"evennia.commands.default.comms.CmdChannelCreate":{account_caller:[163,4,1,""],aliases:[163,4,1,""],func:[163,3,1,""],help_category:[163,4,1,""],key:[163,4,1,""],lock_storage:[163,4,1,""],locks:[163,4,1,""],search_index_entry:[163,4,1,""]},"evennia.commands.default.comms.CmdChannels":{account_caller:[163,4,1,""],aliases:[163,4,1,""],func:[163,3,1,""],help_category:[163,4,1,""],key:[163,4,1,""],lock_storage:[163,4,1,""],locks:[163,4,1,""],search_index_entry:[163,4,1,""]},"evennia.commands.default.comms.CmdClock":{account_caller:[163,4,1,""],aliases:[163,4,1,""],func:[163,3,1,""],help_category:[163,4,1,""],key:[163,4,1,""],lock_storage:[163,4,1,""],locks:[163,4,1,""],search_index_entry:[163,4,1,""]},"evennia.commands.default.comms.CmdDelCom":{account_caller:[163,4,1,""],aliases:[163,4,1,""],func:[163,3,1,""],help_category:[163,4,1,""],key:[163,4,1,""],lock_storage:[163,4,1,""],locks:[163,4,1,""],search_index_entry:[163,4,1,""]},"evennia.commands.default.comms.CmdIRC2Chan":{aliases:[163,4,1,""],func:[163,3,1,""],help_category:[163,4,1,""],key:[163,4,1,""],lock_storage:[163,4,1,""],locks:[163,4,1,""],search_index_entry:[163,4,1,""],switch_options:[163,4,1,""]},"evennia.commands.default.comms.CmdPage":{account_caller:[163,4,1,""],aliases:[163,4,1,""],func:[163,3,1,""],help_category:[163,4,1,""],key:[163,4,1,""],lock_storage:[163,4,1,""],locks:[163,4,1,""],search_index_entry:[163,4,1,""],switch_options:[163,4,1,""]},"evennia.commands.default.comms.CmdRSS2Chan":{aliases:[163,4,1,""],func:[163,3,1,""],help_category:[163,4,1,""],key:[163,4,1,""],lock_storage:[163,4,1,""],locks:[163,4,1,""],search_index_entry:[163,4,1,""],switch_options:[163,4,1,""]},"evennia.commands.default.general":{CmdAccess:[164,1,1,""],CmdDrop:[164,1,1,""],CmdGet:[164,1,1,""],CmdGive:[164,1,1,""],CmdHome:[164,1,1,""],CmdInventory:[164,1,1,""],CmdLook:[164,1,1,""],CmdNick:[164,1,1,""],CmdPose:[164,1,1,""],CmdSay:[164,1,1,""],CmdSetDesc:[164,1,1,""],CmdWhisper:[164,1,1,""]},"evennia.commands.default.general.CmdAccess":{aliases:[164,4,1,""],arg_regex:[164,4,1,""],func:[164,3,1,""],help_category:[164,4,1,""],key:[164,4,1,""],lock_storage:[164,4,1,""],locks:[164,4,1,""],search_index_entry:[164,4,1,""]},"evennia.commands.default.general.CmdDrop":{aliases:[164,4,1,""],arg_regex:[164,4,1,""],func:[164,3,1,""],help_category:[164,4,1,""],key:[164,4,1,""],lock_storage:[164,4,1,""],locks:[164,4,1,""],search_index_entry:[164,4,1,""]},"evennia.commands.default.general.CmdGet":{aliases:[164,4,1,""],arg_regex:[164,4,1,""],func:[164,3,1,""],help_category:[164,4,1,""],key:[164,4,1,""],lock_storage:[164,4,1,""],locks:[164,4,1,""],search_index_entry:[164,4,1,""]},"evennia.commands.default.general.CmdGive":{aliases:[164,4,1,""],arg_regex:[164,4,1,""],func:[164,3,1,""],help_category:[164,4,1,""],key:[164,4,1,""],lock_storage:[164,4,1,""],locks:[164,4,1,""],rhs_split:[164,4,1,""],search_index_entry:[164,4,1,""]},"evennia.commands.default.general.CmdHome":{aliases:[164,4,1,""],arg_regex:[164,4,1,""],func:[164,3,1,""],help_category:[164,4,1,""],key:[164,4,1,""],lock_storage:[164,4,1,""],locks:[164,4,1,""],search_index_entry:[164,4,1,""]},"evennia.commands.default.general.CmdInventory":{aliases:[164,4,1,""],arg_regex:[164,4,1,""],func:[164,3,1,""],help_category:[164,4,1,""],key:[164,4,1,""],lock_storage:[164,4,1,""],locks:[164,4,1,""],search_index_entry:[164,4,1,""]},"evennia.commands.default.general.CmdLook":{aliases:[164,4,1,""],arg_regex:[164,4,1,""],func:[164,3,1,""],help_category:[164,4,1,""],key:[164,4,1,""],lock_storage:[164,4,1,""],locks:[164,4,1,""],search_index_entry:[164,4,1,""]},"evennia.commands.default.general.CmdNick":{aliases:[164,4,1,""],func:[164,3,1,""],help_category:[164,4,1,""],key:[164,4,1,""],lock_storage:[164,4,1,""],locks:[164,4,1,""],parse:[164,3,1,""],search_index_entry:[164,4,1,""],switch_options:[164,4,1,""]},"evennia.commands.default.general.CmdPose":{aliases:[164,4,1,""],func:[164,3,1,""],help_category:[164,4,1,""],key:[164,4,1,""],lock_storage:[164,4,1,""],locks:[164,4,1,""],parse:[164,3,1,""],search_index_entry:[164,4,1,""]},"evennia.commands.default.general.CmdSay":{aliases:[164,4,1,""],func:[164,3,1,""],help_category:[164,4,1,""],key:[164,4,1,""],lock_storage:[164,4,1,""],locks:[164,4,1,""],search_index_entry:[164,4,1,""]},"evennia.commands.default.general.CmdSetDesc":{aliases:[164,4,1,""],arg_regex:[164,4,1,""],func:[164,3,1,""],help_category:[164,4,1,""],key:[164,4,1,""],lock_storage:[164,4,1,""],locks:[164,4,1,""],search_index_entry:[164,4,1,""]},"evennia.commands.default.general.CmdWhisper":{aliases:[164,4,1,""],func:[164,3,1,""],help_category:[164,4,1,""],key:[164,4,1,""],lock_storage:[164,4,1,""],locks:[164,4,1,""],search_index_entry:[164,4,1,""]},"evennia.commands.default.help":{CmdHelp:[165,1,1,""],CmdSetHelp:[165,1,1,""]},"evennia.commands.default.help.CmdHelp":{aliases:[165,4,1,""],arg_regex:[165,4,1,""],check_show_help:[165,3,1,""],format_help_entry:[165,3,1,""],format_help_list:[165,3,1,""],func:[165,3,1,""],help_category:[165,4,1,""],help_more:[165,4,1,""],key:[165,4,1,""],lock_storage:[165,4,1,""],locks:[165,4,1,""],msg_help:[165,3,1,""],parse:[165,3,1,""],return_cmdset:[165,4,1,""],search_index_entry:[165,4,1,""],should_list_cmd:[165,3,1,""],suggestion_cutoff:[165,4,1,""],suggestion_maxnum:[165,4,1,""]},"evennia.commands.default.help.CmdSetHelp":{aliases:[165,4,1,""],func:[165,3,1,""],help_category:[165,4,1,""],key:[165,4,1,""],lock_storage:[165,4,1,""],locks:[165,4,1,""],search_index_entry:[165,4,1,""],switch_options:[165,4,1,""]},"evennia.commands.default.muxcommand":{MuxAccountCommand:[166,1,1,""],MuxCommand:[166,1,1,""]},"evennia.commands.default.muxcommand.MuxAccountCommand":{account_caller:[166,4,1,""],aliases:[166,4,1,""],help_category:[166,4,1,""],key:[166,4,1,""],lock_storage:[166,4,1,""],search_index_entry:[166,4,1,""]},"evennia.commands.default.muxcommand.MuxCommand":{aliases:[166,4,1,""],at_post_cmd:[166,3,1,""],at_pre_cmd:[166,3,1,""],func:[166,3,1,""],get_command_info:[166,3,1,""],has_perm:[166,3,1,""],help_category:[166,4,1,""],key:[166,4,1,""],lock_storage:[166,4,1,""],parse:[166,3,1,""],search_index_entry:[166,4,1,""]},"evennia.commands.default.syscommands":{SystemMultimatch:[167,1,1,""],SystemNoInput:[167,1,1,""],SystemNoMatch:[167,1,1,""],SystemSendToChannel:[167,1,1,""]},"evennia.commands.default.syscommands.SystemMultimatch":{aliases:[167,4,1,""],func:[167,3,1,""],help_category:[167,4,1,""],key:[167,4,1,""],lock_storage:[167,4,1,""],locks:[167,4,1,""],search_index_entry:[167,4,1,""]},"evennia.commands.default.syscommands.SystemNoInput":{aliases:[167,4,1,""],func:[167,3,1,""],help_category:[167,4,1,""],key:[167,4,1,""],lock_storage:[167,4,1,""],locks:[167,4,1,""],search_index_entry:[167,4,1,""]},"evennia.commands.default.syscommands.SystemNoMatch":{aliases:[167,4,1,""],func:[167,3,1,""],help_category:[167,4,1,""],key:[167,4,1,""],lock_storage:[167,4,1,""],locks:[167,4,1,""],search_index_entry:[167,4,1,""]},"evennia.commands.default.syscommands.SystemSendToChannel":{aliases:[167,4,1,""],func:[167,3,1,""],help_category:[167,4,1,""],key:[167,4,1,""],lock_storage:[167,4,1,""],locks:[167,4,1,""],parse:[167,3,1,""],search_index_entry:[167,4,1,""]},"evennia.commands.default.system":{CmdAbout:[168,1,1,""],CmdObjects:[168,1,1,""],CmdPy:[168,1,1,""],CmdReload:[168,1,1,""],CmdReset:[168,1,1,""],CmdScripts:[168,1,1,""],CmdServerLoad:[168,1,1,""],CmdService:[168,1,1,""],CmdShutdown:[168,1,1,""],CmdTime:[168,1,1,""]},"evennia.commands.default.system.CmdAbout":{aliases:[168,4,1,""],func:[168,3,1,""],help_category:[168,4,1,""],key:[168,4,1,""],lock_storage:[168,4,1,""],locks:[168,4,1,""],search_index_entry:[168,4,1,""]},"evennia.commands.default.system.CmdObjects":{aliases:[168,4,1,""],func:[168,3,1,""],help_category:[168,4,1,""],key:[168,4,1,""],lock_storage:[168,4,1,""],locks:[168,4,1,""],search_index_entry:[168,4,1,""]},"evennia.commands.default.system.CmdPy":{aliases:[168,4,1,""],func:[168,3,1,""],help_category:[168,4,1,""],key:[168,4,1,""],lock_storage:[168,4,1,""],locks:[168,4,1,""],search_index_entry:[168,4,1,""],switch_options:[168,4,1,""]},"evennia.commands.default.system.CmdReload":{aliases:[168,4,1,""],func:[168,3,1,""],help_category:[168,4,1,""],key:[168,4,1,""],lock_storage:[168,4,1,""],locks:[168,4,1,""],search_index_entry:[168,4,1,""]},"evennia.commands.default.system.CmdReset":{aliases:[168,4,1,""],func:[168,3,1,""],help_category:[168,4,1,""],key:[168,4,1,""],lock_storage:[168,4,1,""],locks:[168,4,1,""],search_index_entry:[168,4,1,""]},"evennia.commands.default.system.CmdScripts":{aliases:[168,4,1,""],excluded_typeclass_paths:[168,4,1,""],func:[168,3,1,""],help_category:[168,4,1,""],key:[168,4,1,""],lock_storage:[168,4,1,""],locks:[168,4,1,""],search_index_entry:[168,4,1,""],switch_options:[168,4,1,""]},"evennia.commands.default.system.CmdServerLoad":{aliases:[168,4,1,""],func:[168,3,1,""],help_category:[168,4,1,""],key:[168,4,1,""],lock_storage:[168,4,1,""],locks:[168,4,1,""],search_index_entry:[168,4,1,""],switch_options:[168,4,1,""]},"evennia.commands.default.system.CmdService":{aliases:[168,4,1,""],func:[168,3,1,""],help_category:[168,4,1,""],key:[168,4,1,""],lock_storage:[168,4,1,""],locks:[168,4,1,""],search_index_entry:[168,4,1,""],switch_options:[168,4,1,""]},"evennia.commands.default.system.CmdShutdown":{aliases:[168,4,1,""],func:[168,3,1,""],help_category:[168,4,1,""],key:[168,4,1,""],lock_storage:[168,4,1,""],locks:[168,4,1,""],search_index_entry:[168,4,1,""]},"evennia.commands.default.system.CmdTime":{aliases:[168,4,1,""],func:[168,3,1,""],help_category:[168,4,1,""],key:[168,4,1,""],lock_storage:[168,4,1,""],locks:[168,4,1,""],search_index_entry:[168,4,1,""]},"evennia.commands.default.tests":{CmdInterrupt:[169,1,1,""],CommandTest:[169,1,1,""],TestAccount:[169,1,1,""],TestAdmin:[169,1,1,""],TestBatchProcess:[169,1,1,""],TestBuilding:[169,1,1,""],TestComms:[169,1,1,""],TestGeneral:[169,1,1,""],TestHelp:[169,1,1,""],TestInterruptCommand:[169,1,1,""],TestSystem:[169,1,1,""],TestSystemCommands:[169,1,1,""],TestUnconnectedCommand:[169,1,1,""]},"evennia.commands.default.tests.CmdInterrupt":{aliases:[169,4,1,""],func:[169,3,1,""],help_category:[169,4,1,""],key:[169,4,1,""],lock_storage:[169,4,1,""],parse:[169,3,1,""],search_index_entry:[169,4,1,""]},"evennia.commands.default.tests.CommandTest":{call:[169,3,1,""]},"evennia.commands.default.tests.TestAccount":{test_char_create:[169,3,1,""],test_char_delete:[169,3,1,""],test_color_test:[169,3,1,""],test_ic:[169,3,1,""],test_ic__nonaccess:[169,3,1,""],test_ic__other_object:[169,3,1,""],test_ooc:[169,3,1,""],test_ooc_look:[169,3,1,""],test_option:[169,3,1,""],test_password:[169,3,1,""],test_quell:[169,3,1,""],test_quit:[169,3,1,""],test_sessions:[169,3,1,""],test_who:[169,3,1,""]},"evennia.commands.default.tests.TestAdmin":{test_ban:[169,3,1,""],test_emit:[169,3,1,""],test_force:[169,3,1,""],test_perm:[169,3,1,""],test_wall:[169,3,1,""]},"evennia.commands.default.tests.TestBatchProcess":{test_batch_commands:[169,3,1,""]},"evennia.commands.default.tests.TestBuilding":{test_attribute_commands:[169,3,1,""],test_copy:[169,3,1,""],test_create:[169,3,1,""],test_desc:[169,3,1,""],test_desc_default_to_room:[169,3,1,""],test_destroy:[169,3,1,""],test_destroy_sequence:[169,3,1,""],test_dig:[169,3,1,""],test_do_nested_lookup:[169,3,1,""],test_empty_desc:[169,3,1,""],test_examine:[169,3,1,""],test_exit_commands:[169,3,1,""],test_find:[169,3,1,""],test_list_cmdsets:[169,3,1,""],test_lock:[169,3,1,""],test_name:[169,3,1,""],test_nested_attribute_commands:[169,3,1,""],test_script:[169,3,1,""],test_set_home:[169,3,1,""],test_set_obj_alias:[169,3,1,""],test_spawn:[169,3,1,""],test_split_nested_attr:[169,3,1,""],test_tag:[169,3,1,""],test_teleport:[169,3,1,""],test_tunnel:[169,3,1,""],test_tunnel_exit_typeclass:[169,3,1,""],test_typeclass:[169,3,1,""]},"evennia.commands.default.tests.TestComms":{setUp:[169,3,1,""],test_all_com:[169,3,1,""],test_cboot:[169,3,1,""],test_cdesc:[169,3,1,""],test_cdestroy:[169,3,1,""],test_cemit:[169,3,1,""],test_channels:[169,3,1,""],test_clock:[169,3,1,""],test_cwho:[169,3,1,""],test_page:[169,3,1,""],test_toggle_com:[169,3,1,""]},"evennia.commands.default.tests.TestGeneral":{test_access:[169,3,1,""],test_get_and_drop:[169,3,1,""],test_give:[169,3,1,""],test_home:[169,3,1,""],test_inventory:[169,3,1,""],test_look:[169,3,1,""],test_mux_command:[169,3,1,""],test_nick:[169,3,1,""],test_pose:[169,3,1,""],test_say:[169,3,1,""],test_whisper:[169,3,1,""]},"evennia.commands.default.tests.TestHelp":{setUp:[169,3,1,""],tearDown:[169,3,1,""],test_help:[169,3,1,""],test_set_help:[169,3,1,""]},"evennia.commands.default.tests.TestInterruptCommand":{test_interrupt_command:[169,3,1,""]},"evennia.commands.default.tests.TestSystem":{test_about:[169,3,1,""],test_objects:[169,3,1,""],test_py:[169,3,1,""],test_scripts:[169,3,1,""],test_server_load:[169,3,1,""]},"evennia.commands.default.tests.TestSystemCommands":{test_channelcommand:[169,3,1,""],test_multimatch:[169,3,1,""],test_simple_defaults:[169,3,1,""]},"evennia.commands.default.tests.TestUnconnectedCommand":{test_info_command:[169,3,1,""]},"evennia.commands.default.unloggedin":{CmdUnconnectedConnect:[170,1,1,""],CmdUnconnectedCreate:[170,1,1,""],CmdUnconnectedHelp:[170,1,1,""],CmdUnconnectedLook:[170,1,1,""],CmdUnconnectedQuit:[170,1,1,""]},"evennia.commands.default.unloggedin.CmdUnconnectedConnect":{aliases:[170,4,1,""],arg_regex:[170,4,1,""],func:[170,3,1,""],help_category:[170,4,1,""],key:[170,4,1,""],lock_storage:[170,4,1,""],locks:[170,4,1,""],search_index_entry:[170,4,1,""]},"evennia.commands.default.unloggedin.CmdUnconnectedCreate":{aliases:[170,4,1,""],arg_regex:[170,4,1,""],func:[170,3,1,""],help_category:[170,4,1,""],key:[170,4,1,""],lock_storage:[170,4,1,""],locks:[170,4,1,""],search_index_entry:[170,4,1,""]},"evennia.commands.default.unloggedin.CmdUnconnectedHelp":{aliases:[170,4,1,""],func:[170,3,1,""],help_category:[170,4,1,""],key:[170,4,1,""],lock_storage:[170,4,1,""],locks:[170,4,1,""],search_index_entry:[170,4,1,""]},"evennia.commands.default.unloggedin.CmdUnconnectedLook":{aliases:[170,4,1,""],func:[170,3,1,""],help_category:[170,4,1,""],key:[170,4,1,""],lock_storage:[170,4,1,""],locks:[170,4,1,""],search_index_entry:[170,4,1,""]},"evennia.commands.default.unloggedin.CmdUnconnectedQuit":{aliases:[170,4,1,""],func:[170,3,1,""],help_category:[170,4,1,""],key:[170,4,1,""],lock_storage:[170,4,1,""],locks:[170,4,1,""],search_index_entry:[170,4,1,""]},"evennia.comms":{admin:[172,0,0,"-"],channelhandler:[173,0,0,"-"],comms:[174,0,0,"-"],managers:[175,0,0,"-"],models:[176,0,0,"-"]},"evennia.comms.admin":{ChannelAdmin:[172,1,1,""],ChannelAttributeInline:[172,1,1,""],ChannelTagInline:[172,1,1,""],MsgAdmin:[172,1,1,""]},"evennia.comms.admin.ChannelAdmin":{fieldsets:[172,4,1,""],inlines:[172,4,1,""],list_display:[172,4,1,""],list_display_links:[172,4,1,""],list_select_related:[172,4,1,""],media:[172,3,1,""],ordering:[172,4,1,""],raw_id_fields:[172,4,1,""],response_add:[172,3,1,""],save_as:[172,4,1,""],save_model:[172,3,1,""],save_on_top:[172,4,1,""],search_fields:[172,4,1,""],subscriptions:[172,3,1,""]},"evennia.comms.admin.ChannelAttributeInline":{media:[172,3,1,""],model:[172,4,1,""],related_field:[172,4,1,""]},"evennia.comms.admin.ChannelTagInline":{media:[172,3,1,""],model:[172,4,1,""],related_field:[172,4,1,""]},"evennia.comms.admin.MsgAdmin":{list_display:[172,4,1,""],list_display_links:[172,4,1,""],list_select_related:[172,4,1,""],media:[172,3,1,""],ordering:[172,4,1,""],save_as:[172,4,1,""],save_on_top:[172,4,1,""],search_fields:[172,4,1,""]},"evennia.comms.channelhandler":{ChannelCommand:[173,1,1,""],ChannelHandler:[173,1,1,""]},"evennia.comms.channelhandler.ChannelCommand":{aliases:[173,4,1,""],arg_regex:[173,4,1,""],func:[173,3,1,""],get_extra_info:[173,3,1,""],help_category:[173,4,1,""],is_channel:[173,4,1,""],key:[173,4,1,""],lock_storage:[173,4,1,""],obj:[173,4,1,""],parse:[173,3,1,""],search_index_entry:[173,4,1,""]},"evennia.comms.channelhandler.ChannelHandler":{__init__:[173,3,1,""],add:[173,3,1,""],add_channel:[173,3,1,""],clear:[173,3,1,""],get:[173,3,1,""],get_cmdset:[173,3,1,""],remove:[173,3,1,""],update:[173,3,1,""]},"evennia.comms.comms":{DefaultChannel:[174,1,1,""]},"evennia.comms.comms.DefaultChannel":{"delete":[174,3,1,""],DoesNotExist:[174,2,1,""],MultipleObjectsReturned:[174,2,1,""],access:[174,3,1,""],at_channel_creation:[174,3,1,""],at_first_save:[174,3,1,""],at_init:[174,3,1,""],basetype_setup:[174,3,1,""],channel_prefix:[174,3,1,""],connect:[174,3,1,""],create:[174,3,1,""],disconnect:[174,3,1,""],distribute_message:[174,3,1,""],format_external:[174,3,1,""],format_message:[174,3,1,""],format_senders:[174,3,1,""],get_absolute_url:[174,3,1,""],has_connection:[174,3,1,""],message_transform:[174,3,1,""],msg:[174,3,1,""],mute:[174,3,1,""],mutelist:[174,3,1,""],objects:[174,4,1,""],path:[174,4,1,""],pose_transform:[174,3,1,""],post_join_channel:[174,3,1,""],post_leave_channel:[174,3,1,""],post_send_message:[174,3,1,""],pre_join_channel:[174,3,1,""],pre_leave_channel:[174,3,1,""],pre_send_message:[174,3,1,""],tempmsg:[174,3,1,""],typename:[174,4,1,""],unmute:[174,3,1,""],web_get_admin_url:[174,3,1,""],web_get_create_url:[174,3,1,""],web_get_delete_url:[174,3,1,""],web_get_detail_url:[174,3,1,""],web_get_update_url:[174,3,1,""],wholist:[174,3,1,""]},"evennia.comms.managers":{ChannelDBManager:[175,1,1,""],ChannelManager:[175,1,1,""],CommError:[175,2,1,""],MsgManager:[175,1,1,""],identify_object:[175,5,1,""],to_object:[175,5,1,""]},"evennia.comms.managers.ChannelDBManager":{channel_search:[175,3,1,""],get_all_channels:[175,3,1,""],get_channel:[175,3,1,""],get_subscriptions:[175,3,1,""],search_channel:[175,3,1,""]},"evennia.comms.managers.MsgManager":{get_message_by_id:[175,3,1,""],get_messages_by_channel:[175,3,1,""],get_messages_by_receiver:[175,3,1,""],get_messages_by_sender:[175,3,1,""],identify_object:[175,3,1,""],message_search:[175,3,1,""],search_message:[175,3,1,""]},"evennia.comms.models":{ChannelDB:[176,1,1,""],Msg:[176,1,1,""],TempMsg:[176,1,1,""]},"evennia.comms.models.ChannelDB":{DoesNotExist:[176,2,1,""],MultipleObjectsReturned:[176,2,1,""],channel_set:[176,4,1,""],db_account_subscriptions:[176,4,1,""],db_attributes:[176,4,1,""],db_object_subscriptions:[176,4,1,""],db_tags:[176,4,1,""],get_next_by_db_date_created:[176,3,1,""],get_previous_by_db_date_created:[176,3,1,""],hide_from_channels_set:[176,4,1,""],id:[176,4,1,""],objects:[176,4,1,""],path:[176,4,1,""],subscriptions:[176,4,1,""],typename:[176,4,1,""]},"evennia.comms.models.Msg":{DoesNotExist:[176,2,1,""],MultipleObjectsReturned:[176,2,1,""],__init__:[176,3,1,""],access:[176,3,1,""],channels:[176,3,1,""],date_created:[176,3,1,""],db_date_created:[176,4,1,""],db_header:[176,4,1,""],db_hide_from_accounts:[176,4,1,""],db_hide_from_channels:[176,4,1,""],db_hide_from_objects:[176,4,1,""],db_lock_storage:[176,4,1,""],db_message:[176,4,1,""],db_receivers_accounts:[176,4,1,""],db_receivers_channels:[176,4,1,""],db_receivers_objects:[176,4,1,""],db_receivers_scripts:[176,4,1,""],db_sender_accounts:[176,4,1,""],db_sender_external:[176,4,1,""],db_sender_objects:[176,4,1,""],db_sender_scripts:[176,4,1,""],db_tags:[176,4,1,""],get_next_by_db_date_created:[176,3,1,""],get_previous_by_db_date_created:[176,3,1,""],header:[176,3,1,""],hide_from:[176,3,1,""],id:[176,4,1,""],lock_storage:[176,3,1,""],locks:[176,4,1,""],message:[176,3,1,""],objects:[176,4,1,""],path:[176,4,1,""],receivers:[176,3,1,""],remove_receiver:[176,3,1,""],remove_sender:[176,3,1,""],sender_external:[176,3,1,""],senders:[176,3,1,""],tags:[176,4,1,""],typename:[176,4,1,""]},"evennia.comms.models.TempMsg":{__init__:[176,3,1,""],access:[176,3,1,""],locks:[176,4,1,""],remove_receiver:[176,3,1,""],remove_sender:[176,3,1,""]},"evennia.contrib":{barter:[178,0,0,"-"],building_menu:[179,0,0,"-"],chargen:[180,0,0,"-"],clothing:[181,0,0,"-"],color_markups:[182,0,0,"-"],custom_gametime:[183,0,0,"-"],dice:[184,0,0,"-"],email_login:[185,0,0,"-"],extended_room:[186,0,0,"-"],fieldfill:[187,0,0,"-"],gendersub:[188,0,0,"-"],health_bar:[189,0,0,"-"],ingame_python:[190,0,0,"-"],mail:[198,0,0,"-"],mapbuilder:[199,0,0,"-"],menu_login:[200,0,0,"-"],multidescer:[201,0,0,"-"],puzzles:[202,0,0,"-"],random_string_generator:[203,0,0,"-"],rplanguage:[204,0,0,"-"],rpsystem:[205,0,0,"-"],security:[206,0,0,"-"],simpledoor:[211,0,0,"-"],slow_exit:[212,0,0,"-"],talking_npc:[213,0,0,"-"],tree_select:[214,0,0,"-"],turnbattle:[215,0,0,"-"],tutorial_examples:[221,0,0,"-"],tutorial_world:[228,0,0,"-"],unixcommand:[232,0,0,"-"],wilderness:[233,0,0,"-"]},"evennia.contrib.barter":{CmdAccept:[178,1,1,""],CmdDecline:[178,1,1,""],CmdEvaluate:[178,1,1,""],CmdFinish:[178,1,1,""],CmdOffer:[178,1,1,""],CmdStatus:[178,1,1,""],CmdTrade:[178,1,1,""],CmdTradeBase:[178,1,1,""],CmdTradeHelp:[178,1,1,""],CmdsetTrade:[178,1,1,""],TradeHandler:[178,1,1,""],TradeTimeout:[178,1,1,""]},"evennia.contrib.barter.CmdAccept":{aliases:[178,4,1,""],func:[178,3,1,""],help_category:[178,4,1,""],key:[178,4,1,""],lock_storage:[178,4,1,""],locks:[178,4,1,""],search_index_entry:[178,4,1,""]},"evennia.contrib.barter.CmdDecline":{aliases:[178,4,1,""],func:[178,3,1,""],help_category:[178,4,1,""],key:[178,4,1,""],lock_storage:[178,4,1,""],locks:[178,4,1,""],search_index_entry:[178,4,1,""]},"evennia.contrib.barter.CmdEvaluate":{aliases:[178,4,1,""],func:[178,3,1,""],help_category:[178,4,1,""],key:[178,4,1,""],lock_storage:[178,4,1,""],locks:[178,4,1,""],search_index_entry:[178,4,1,""]},"evennia.contrib.barter.CmdFinish":{aliases:[178,4,1,""],func:[178,3,1,""],help_category:[178,4,1,""],key:[178,4,1,""],lock_storage:[178,4,1,""],locks:[178,4,1,""],search_index_entry:[178,4,1,""]},"evennia.contrib.barter.CmdOffer":{aliases:[178,4,1,""],func:[178,3,1,""],help_category:[178,4,1,""],key:[178,4,1,""],lock_storage:[178,4,1,""],locks:[178,4,1,""],search_index_entry:[178,4,1,""]},"evennia.contrib.barter.CmdStatus":{aliases:[178,4,1,""],func:[178,3,1,""],help_category:[178,4,1,""],key:[178,4,1,""],lock_storage:[178,4,1,""],locks:[178,4,1,""],search_index_entry:[178,4,1,""]},"evennia.contrib.barter.CmdTrade":{aliases:[178,4,1,""],func:[178,3,1,""],help_category:[178,4,1,""],key:[178,4,1,""],lock_storage:[178,4,1,""],locks:[178,4,1,""],search_index_entry:[178,4,1,""]},"evennia.contrib.barter.CmdTradeBase":{aliases:[178,4,1,""],help_category:[178,4,1,""],key:[178,4,1,""],lock_storage:[178,4,1,""],parse:[178,3,1,""],search_index_entry:[178,4,1,""]},"evennia.contrib.barter.CmdTradeHelp":{aliases:[178,4,1,""],func:[178,3,1,""],help_category:[178,4,1,""],key:[178,4,1,""],lock_storage:[178,4,1,""],locks:[178,4,1,""],search_index_entry:[178,4,1,""]},"evennia.contrib.barter.CmdsetTrade":{at_cmdset_creation:[178,3,1,""],key:[178,4,1,""],path:[178,4,1,""]},"evennia.contrib.barter.TradeHandler":{__init__:[178,3,1,""],accept:[178,3,1,""],decline:[178,3,1,""],finish:[178,3,1,""],get_other:[178,3,1,""],join:[178,3,1,""],list:[178,3,1,""],msg_other:[178,3,1,""],offer:[178,3,1,""],search:[178,3,1,""],unjoin:[178,3,1,""]},"evennia.contrib.barter.TradeTimeout":{DoesNotExist:[178,2,1,""],MultipleObjectsReturned:[178,2,1,""],at_repeat:[178,3,1,""],at_script_creation:[178,3,1,""],is_valid:[178,3,1,""],path:[178,4,1,""],typename:[178,4,1,""]},"evennia.contrib.building_menu":{BuildingMenu:[179,1,1,""],BuildingMenuCmdSet:[179,1,1,""],Choice:[179,1,1,""],CmdNoInput:[179,1,1,""],CmdNoMatch:[179,1,1,""],GenericBuildingCmd:[179,1,1,""],GenericBuildingMenu:[179,1,1,""],menu_edit:[179,5,1,""],menu_quit:[179,5,1,""],menu_setattr:[179,5,1,""]},"evennia.contrib.building_menu.BuildingMenu":{__init__:[179,3,1,""],add_choice:[179,3,1,""],add_choice_edit:[179,3,1,""],add_choice_quit:[179,3,1,""],close:[179,3,1,""],current_choice:[179,3,1,""],display:[179,3,1,""],display_choice:[179,3,1,""],display_title:[179,3,1,""],init:[179,3,1,""],joker_key:[179,4,1,""],keys_go_back:[179,4,1,""],min_shortcut:[179,4,1,""],move:[179,3,1,""],open:[179,3,1,""],open_parent_menu:[179,3,1,""],open_submenu:[179,3,1,""],relevant_choices:[179,3,1,""],restore:[179,3,1,""],sep_keys:[179,4,1,""]},"evennia.contrib.building_menu.BuildingMenuCmdSet":{at_cmdset_creation:[179,3,1,""],key:[179,4,1,""],path:[179,4,1,""],priority:[179,4,1,""]},"evennia.contrib.building_menu.Choice":{__init__:[179,3,1,""],enter:[179,3,1,""],format_text:[179,3,1,""],keys:[179,3,1,""],leave:[179,3,1,""],nomatch:[179,3,1,""]},"evennia.contrib.building_menu.CmdNoInput":{__init__:[179,3,1,""],aliases:[179,4,1,""],func:[179,3,1,""],help_category:[179,4,1,""],key:[179,4,1,""],lock_storage:[179,4,1,""],locks:[179,4,1,""],search_index_entry:[179,4,1,""]},"evennia.contrib.building_menu.CmdNoMatch":{__init__:[179,3,1,""],aliases:[179,4,1,""],func:[179,3,1,""],help_category:[179,4,1,""],key:[179,4,1,""],lock_storage:[179,4,1,""],locks:[179,4,1,""],search_index_entry:[179,4,1,""]},"evennia.contrib.building_menu.GenericBuildingCmd":{aliases:[179,4,1,""],func:[179,3,1,""],help_category:[179,4,1,""],key:[179,4,1,""],lock_storage:[179,4,1,""],search_index_entry:[179,4,1,""]},"evennia.contrib.building_menu.GenericBuildingMenu":{init:[179,3,1,""]},"evennia.contrib.chargen":{CmdOOCCharacterCreate:[180,1,1,""],CmdOOCLook:[180,1,1,""],OOCCmdSetCharGen:[180,1,1,""]},"evennia.contrib.chargen.CmdOOCCharacterCreate":{aliases:[180,4,1,""],func:[180,3,1,""],help_category:[180,4,1,""],key:[180,4,1,""],lock_storage:[180,4,1,""],locks:[180,4,1,""],search_index_entry:[180,4,1,""]},"evennia.contrib.chargen.CmdOOCLook":{aliases:[180,4,1,""],func:[180,3,1,""],help_category:[180,4,1,""],key:[180,4,1,""],lock_storage:[180,4,1,""],locks:[180,4,1,""],search_index_entry:[180,4,1,""]},"evennia.contrib.chargen.OOCCmdSetCharGen":{at_cmdset_creation:[180,3,1,""],path:[180,4,1,""]},"evennia.contrib.clothing":{ClothedCharacter:[181,1,1,""],ClothedCharacterCmdSet:[181,1,1,""],Clothing:[181,1,1,""],CmdCover:[181,1,1,""],CmdDrop:[181,1,1,""],CmdGive:[181,1,1,""],CmdInventory:[181,1,1,""],CmdRemove:[181,1,1,""],CmdUncover:[181,1,1,""],CmdWear:[181,1,1,""],clothing_type_count:[181,5,1,""],get_worn_clothes:[181,5,1,""],order_clothes_list:[181,5,1,""],single_type_count:[181,5,1,""]},"evennia.contrib.clothing.ClothedCharacter":{DoesNotExist:[181,2,1,""],MultipleObjectsReturned:[181,2,1,""],path:[181,4,1,""],return_appearance:[181,3,1,""],typename:[181,4,1,""]},"evennia.contrib.clothing.ClothedCharacterCmdSet":{at_cmdset_creation:[181,3,1,""],key:[181,4,1,""],path:[181,4,1,""]},"evennia.contrib.clothing.Clothing":{DoesNotExist:[181,2,1,""],MultipleObjectsReturned:[181,2,1,""],at_get:[181,3,1,""],path:[181,4,1,""],remove:[181,3,1,""],typename:[181,4,1,""],wear:[181,3,1,""]},"evennia.contrib.clothing.CmdCover":{aliases:[181,4,1,""],func:[181,3,1,""],help_category:[181,4,1,""],key:[181,4,1,""],lock_storage:[181,4,1,""],search_index_entry:[181,4,1,""]},"evennia.contrib.clothing.CmdDrop":{aliases:[181,4,1,""],arg_regex:[181,4,1,""],func:[181,3,1,""],help_category:[181,4,1,""],key:[181,4,1,""],lock_storage:[181,4,1,""],locks:[181,4,1,""],search_index_entry:[181,4,1,""]},"evennia.contrib.clothing.CmdGive":{aliases:[181,4,1,""],arg_regex:[181,4,1,""],func:[181,3,1,""],help_category:[181,4,1,""],key:[181,4,1,""],lock_storage:[181,4,1,""],locks:[181,4,1,""],search_index_entry:[181,4,1,""]},"evennia.contrib.clothing.CmdInventory":{aliases:[181,4,1,""],arg_regex:[181,4,1,""],func:[181,3,1,""],help_category:[181,4,1,""],key:[181,4,1,""],lock_storage:[181,4,1,""],locks:[181,4,1,""],search_index_entry:[181,4,1,""]},"evennia.contrib.clothing.CmdRemove":{aliases:[181,4,1,""],func:[181,3,1,""],help_category:[181,4,1,""],key:[181,4,1,""],lock_storage:[181,4,1,""],search_index_entry:[181,4,1,""]},"evennia.contrib.clothing.CmdUncover":{aliases:[181,4,1,""],func:[181,3,1,""],help_category:[181,4,1,""],key:[181,4,1,""],lock_storage:[181,4,1,""],search_index_entry:[181,4,1,""]},"evennia.contrib.clothing.CmdWear":{aliases:[181,4,1,""],func:[181,3,1,""],help_category:[181,4,1,""],key:[181,4,1,""],lock_storage:[181,4,1,""],search_index_entry:[181,4,1,""]},"evennia.contrib.custom_gametime":{GametimeScript:[183,1,1,""],custom_gametime:[183,5,1,""],gametime_to_realtime:[183,5,1,""],real_seconds_until:[183,5,1,""],realtime_to_gametime:[183,5,1,""],schedule:[183,5,1,""],time_to_tuple:[183,5,1,""]},"evennia.contrib.custom_gametime.GametimeScript":{DoesNotExist:[183,2,1,""],MultipleObjectsReturned:[183,2,1,""],at_repeat:[183,3,1,""],at_script_creation:[183,3,1,""],path:[183,4,1,""],typename:[183,4,1,""]},"evennia.contrib.dice":{CmdDice:[184,1,1,""],DiceCmdSet:[184,1,1,""],roll_dice:[184,5,1,""]},"evennia.contrib.dice.CmdDice":{aliases:[184,4,1,""],func:[184,3,1,""],help_category:[184,4,1,""],key:[184,4,1,""],lock_storage:[184,4,1,""],locks:[184,4,1,""],search_index_entry:[184,4,1,""]},"evennia.contrib.dice.DiceCmdSet":{at_cmdset_creation:[184,3,1,""],path:[184,4,1,""]},"evennia.contrib.email_login":{CmdUnconnectedConnect:[185,1,1,""],CmdUnconnectedCreate:[185,1,1,""],CmdUnconnectedHelp:[185,1,1,""],CmdUnconnectedLook:[185,1,1,""],CmdUnconnectedQuit:[185,1,1,""]},"evennia.contrib.email_login.CmdUnconnectedConnect":{aliases:[185,4,1,""],func:[185,3,1,""],help_category:[185,4,1,""],key:[185,4,1,""],lock_storage:[185,4,1,""],locks:[185,4,1,""],search_index_entry:[185,4,1,""]},"evennia.contrib.email_login.CmdUnconnectedCreate":{aliases:[185,4,1,""],func:[185,3,1,""],help_category:[185,4,1,""],key:[185,4,1,""],lock_storage:[185,4,1,""],locks:[185,4,1,""],parse:[185,3,1,""],search_index_entry:[185,4,1,""]},"evennia.contrib.email_login.CmdUnconnectedHelp":{aliases:[185,4,1,""],func:[185,3,1,""],help_category:[185,4,1,""],key:[185,4,1,""],lock_storage:[185,4,1,""],locks:[185,4,1,""],search_index_entry:[185,4,1,""]},"evennia.contrib.email_login.CmdUnconnectedLook":{aliases:[185,4,1,""],func:[185,3,1,""],help_category:[185,4,1,""],key:[185,4,1,""],lock_storage:[185,4,1,""],locks:[185,4,1,""],search_index_entry:[185,4,1,""]},"evennia.contrib.email_login.CmdUnconnectedQuit":{aliases:[185,4,1,""],func:[185,3,1,""],help_category:[185,4,1,""],key:[185,4,1,""],lock_storage:[185,4,1,""],locks:[185,4,1,""],search_index_entry:[185,4,1,""]},"evennia.contrib.extended_room":{CmdExtendedRoomDesc:[186,1,1,""],CmdExtendedRoomDetail:[186,1,1,""],CmdExtendedRoomGameTime:[186,1,1,""],CmdExtendedRoomLook:[186,1,1,""],ExtendedRoom:[186,1,1,""],ExtendedRoomCmdSet:[186,1,1,""]},"evennia.contrib.extended_room.CmdExtendedRoomDesc":{aliases:[186,4,1,""],func:[186,3,1,""],help_category:[186,4,1,""],key:[186,4,1,""],lock_storage:[186,4,1,""],reset_times:[186,3,1,""],search_index_entry:[186,4,1,""],switch_options:[186,4,1,""]},"evennia.contrib.extended_room.CmdExtendedRoomDetail":{aliases:[186,4,1,""],func:[186,3,1,""],help_category:[186,4,1,""],key:[186,4,1,""],lock_storage:[186,4,1,""],locks:[186,4,1,""],search_index_entry:[186,4,1,""]},"evennia.contrib.extended_room.CmdExtendedRoomGameTime":{aliases:[186,4,1,""],func:[186,3,1,""],help_category:[186,4,1,""],key:[186,4,1,""],lock_storage:[186,4,1,""],locks:[186,4,1,""],search_index_entry:[186,4,1,""]},"evennia.contrib.extended_room.CmdExtendedRoomLook":{aliases:[186,4,1,""],func:[186,3,1,""],help_category:[186,4,1,""],key:[186,4,1,""],lock_storage:[186,4,1,""],search_index_entry:[186,4,1,""]},"evennia.contrib.extended_room.ExtendedRoom":{DoesNotExist:[186,2,1,""],MultipleObjectsReturned:[186,2,1,""],at_object_creation:[186,3,1,""],del_detail:[186,3,1,""],get_time_and_season:[186,3,1,""],path:[186,4,1,""],replace_timeslots:[186,3,1,""],return_appearance:[186,3,1,""],return_detail:[186,3,1,""],set_detail:[186,3,1,""],typename:[186,4,1,""],update_current_description:[186,3,1,""]},"evennia.contrib.extended_room.ExtendedRoomCmdSet":{at_cmdset_creation:[186,3,1,""],path:[186,4,1,""]},"evennia.contrib.fieldfill":{CmdTestMenu:[187,1,1,""],FieldEvMenu:[187,1,1,""],display_formdata:[187,5,1,""],form_template_to_dict:[187,5,1,""],init_delayed_message:[187,5,1,""],init_fill_field:[187,5,1,""],menunode_fieldfill:[187,5,1,""],sendmessage:[187,5,1,""],verify_online_player:[187,5,1,""]},"evennia.contrib.fieldfill.CmdTestMenu":{aliases:[187,4,1,""],func:[187,3,1,""],help_category:[187,4,1,""],key:[187,4,1,""],lock_storage:[187,4,1,""],search_index_entry:[187,4,1,""]},"evennia.contrib.fieldfill.FieldEvMenu":{node_formatter:[187,3,1,""]},"evennia.contrib.gendersub":{GenderCharacter:[188,1,1,""],SetGender:[188,1,1,""]},"evennia.contrib.gendersub.GenderCharacter":{DoesNotExist:[188,2,1,""],MultipleObjectsReturned:[188,2,1,""],at_object_creation:[188,3,1,""],msg:[188,3,1,""],path:[188,4,1,""],typename:[188,4,1,""]},"evennia.contrib.gendersub.SetGender":{aliases:[188,4,1,""],func:[188,3,1,""],help_category:[188,4,1,""],key:[188,4,1,""],lock_storage:[188,4,1,""],locks:[188,4,1,""],search_index_entry:[188,4,1,""]},"evennia.contrib.health_bar":{display_meter:[189,5,1,""]},"evennia.contrib.ingame_python":{callbackhandler:[191,0,0,"-"],commands:[192,0,0,"-"],eventfuncs:[193,0,0,"-"],scripts:[194,0,0,"-"],tests:[195,0,0,"-"],typeclasses:[196,0,0,"-"],utils:[197,0,0,"-"]},"evennia.contrib.ingame_python.callbackhandler":{Callback:[191,1,1,""],CallbackHandler:[191,1,1,""]},"evennia.contrib.ingame_python.callbackhandler.Callback":{author:[191,3,1,""],code:[191,3,1,""],created_on:[191,3,1,""],name:[191,3,1,""],number:[191,3,1,""],obj:[191,3,1,""],parameters:[191,3,1,""],updated_by:[191,3,1,""],updated_on:[191,3,1,""],valid:[191,3,1,""]},"evennia.contrib.ingame_python.callbackhandler.CallbackHandler":{__init__:[191,3,1,""],add:[191,3,1,""],all:[191,3,1,""],call:[191,3,1,""],edit:[191,3,1,""],format_callback:[191,3,1,""],get:[191,3,1,""],get_variable:[191,3,1,""],remove:[191,3,1,""],script:[191,4,1,""]},"evennia.contrib.ingame_python.commands":{CmdCallback:[192,1,1,""]},"evennia.contrib.ingame_python.commands.CmdCallback":{accept_callback:[192,3,1,""],add_callback:[192,3,1,""],aliases:[192,4,1,""],del_callback:[192,3,1,""],edit_callback:[192,3,1,""],func:[192,3,1,""],get_help:[192,3,1,""],help_category:[192,4,1,""],key:[192,4,1,""],list_callbacks:[192,3,1,""],list_tasks:[192,3,1,""],lock_storage:[192,4,1,""],locks:[192,4,1,""],search_index_entry:[192,4,1,""]},"evennia.contrib.ingame_python.eventfuncs":{call_event:[193,5,1,""],deny:[193,5,1,""],get:[193,5,1,""]},"evennia.contrib.ingame_python.scripts":{EventHandler:[194,1,1,""],TimeEventScript:[194,1,1,""],complete_task:[194,5,1,""]},"evennia.contrib.ingame_python.scripts.EventHandler":{DoesNotExist:[194,2,1,""],MultipleObjectsReturned:[194,2,1,""],accept_callback:[194,3,1,""],add_callback:[194,3,1,""],add_event:[194,3,1,""],at_script_creation:[194,3,1,""],at_start:[194,3,1,""],call:[194,3,1,""],del_callback:[194,3,1,""],edit_callback:[194,3,1,""],get_callbacks:[194,3,1,""],get_events:[194,3,1,""],get_variable:[194,3,1,""],handle_error:[194,3,1,""],path:[194,4,1,""],set_task:[194,3,1,""],typename:[194,4,1,""]},"evennia.contrib.ingame_python.scripts.TimeEventScript":{DoesNotExist:[194,2,1,""],MultipleObjectsReturned:[194,2,1,""],at_repeat:[194,3,1,""],at_script_creation:[194,3,1,""],path:[194,4,1,""],typename:[194,4,1,""]},"evennia.contrib.ingame_python.tests":{TestCmdCallback:[195,1,1,""],TestDefaultCallbacks:[195,1,1,""],TestEventHandler:[195,1,1,""]},"evennia.contrib.ingame_python.tests.TestCmdCallback":{setUp:[195,3,1,""],tearDown:[195,3,1,""],test_accept:[195,3,1,""],test_add:[195,3,1,""],test_del:[195,3,1,""],test_list:[195,3,1,""],test_lock:[195,3,1,""]},"evennia.contrib.ingame_python.tests.TestDefaultCallbacks":{setUp:[195,3,1,""],tearDown:[195,3,1,""],test_exit:[195,3,1,""]},"evennia.contrib.ingame_python.tests.TestEventHandler":{setUp:[195,3,1,""],tearDown:[195,3,1,""],test_accept:[195,3,1,""],test_add_validation:[195,3,1,""],test_call:[195,3,1,""],test_del:[195,3,1,""],test_edit:[195,3,1,""],test_edit_validation:[195,3,1,""],test_handler:[195,3,1,""],test_start:[195,3,1,""]},"evennia.contrib.ingame_python.typeclasses":{EventCharacter:[196,1,1,""],EventExit:[196,1,1,""],EventObject:[196,1,1,""],EventRoom:[196,1,1,""]},"evennia.contrib.ingame_python.typeclasses.EventCharacter":{DoesNotExist:[196,2,1,""],MultipleObjectsReturned:[196,2,1,""],announce_move_from:[196,3,1,""],announce_move_to:[196,3,1,""],at_after_move:[196,3,1,""],at_before_move:[196,3,1,""],at_before_say:[196,3,1,""],at_object_delete:[196,3,1,""],at_post_puppet:[196,3,1,""],at_pre_unpuppet:[196,3,1,""],at_say:[196,3,1,""],callbacks:[196,4,1,""],path:[196,4,1,""],typename:[196,4,1,""]},"evennia.contrib.ingame_python.typeclasses.EventExit":{DoesNotExist:[196,2,1,""],MultipleObjectsReturned:[196,2,1,""],at_traverse:[196,3,1,""],callbacks:[196,4,1,""],path:[196,4,1,""],typename:[196,4,1,""]},"evennia.contrib.ingame_python.typeclasses.EventObject":{DoesNotExist:[196,2,1,""],MultipleObjectsReturned:[196,2,1,""],at_drop:[196,3,1,""],at_get:[196,3,1,""],callbacks:[196,4,1,""],path:[196,4,1,""],typename:[196,4,1,""]},"evennia.contrib.ingame_python.typeclasses.EventRoom":{DoesNotExist:[196,2,1,""],MultipleObjectsReturned:[196,2,1,""],at_object_delete:[196,3,1,""],callbacks:[196,4,1,""],path:[196,4,1,""],typename:[196,4,1,""]},"evennia.contrib.ingame_python.utils":{InterruptEvent:[197,2,1,""],get_event_handler:[197,5,1,""],get_next_wait:[197,5,1,""],keyword_event:[197,5,1,""],phrase_event:[197,5,1,""],register_events:[197,5,1,""],time_event:[197,5,1,""]},"evennia.contrib.mail":{CmdMail:[198,1,1,""],CmdMailCharacter:[198,1,1,""]},"evennia.contrib.mail.CmdMail":{aliases:[198,4,1,""],func:[198,3,1,""],get_all_mail:[198,3,1,""],help_category:[198,4,1,""],key:[198,4,1,""],lock:[198,4,1,""],lock_storage:[198,4,1,""],parse:[198,3,1,""],search_index_entry:[198,4,1,""],search_targets:[198,3,1,""],send_mail:[198,3,1,""]},"evennia.contrib.mail.CmdMailCharacter":{account_caller:[198,4,1,""],aliases:[198,4,1,""],help_category:[198,4,1,""],key:[198,4,1,""],lock_storage:[198,4,1,""],search_index_entry:[198,4,1,""]},"evennia.contrib.mapbuilder":{CmdMapBuilder:[199,1,1,""],build_map:[199,5,1,""],example1_build_forest:[199,5,1,""],example1_build_mountains:[199,5,1,""],example1_build_temple:[199,5,1,""],example2_build_forest:[199,5,1,""],example2_build_horizontal_exit:[199,5,1,""],example2_build_verticle_exit:[199,5,1,""]},"evennia.contrib.mapbuilder.CmdMapBuilder":{aliases:[199,4,1,""],func:[199,3,1,""],help_category:[199,4,1,""],key:[199,4,1,""],lock_storage:[199,4,1,""],locks:[199,4,1,""],search_index_entry:[199,4,1,""]},"evennia.contrib.menu_login":{CmdUnloggedinLook:[200,1,1,""],UnloggedinCmdSet:[200,1,1,""],node_enter_password:[200,5,1,""],node_enter_username:[200,5,1,""],node_quit_or_login:[200,5,1,""]},"evennia.contrib.menu_login.CmdUnloggedinLook":{aliases:[200,4,1,""],arg_regex:[200,4,1,""],func:[200,3,1,""],help_category:[200,4,1,""],key:[200,4,1,""],lock_storage:[200,4,1,""],locks:[200,4,1,""],search_index_entry:[200,4,1,""]},"evennia.contrib.menu_login.UnloggedinCmdSet":{at_cmdset_creation:[200,3,1,""],key:[200,4,1,""],path:[200,4,1,""],priority:[200,4,1,""]},"evennia.contrib.multidescer":{CmdMultiDesc:[201,1,1,""],DescValidateError:[201,2,1,""]},"evennia.contrib.multidescer.CmdMultiDesc":{aliases:[201,4,1,""],func:[201,3,1,""],help_category:[201,4,1,""],key:[201,4,1,""],lock_storage:[201,4,1,""],locks:[201,4,1,""],search_index_entry:[201,4,1,""]},"evennia.contrib.puzzles":{CmdArmPuzzle:[202,1,1,""],CmdCreatePuzzleRecipe:[202,1,1,""],CmdEditPuzzle:[202,1,1,""],CmdListArmedPuzzles:[202,1,1,""],CmdListPuzzleRecipes:[202,1,1,""],CmdUsePuzzleParts:[202,1,1,""],PuzzleRecipe:[202,1,1,""],PuzzleSystemCmdSet:[202,1,1,""],maskout_protodef:[202,5,1,""],proto_def:[202,5,1,""]},"evennia.contrib.puzzles.CmdArmPuzzle":{aliases:[202,4,1,""],func:[202,3,1,""],help_category:[202,4,1,""],key:[202,4,1,""],lock_storage:[202,4,1,""],locks:[202,4,1,""],search_index_entry:[202,4,1,""]},"evennia.contrib.puzzles.CmdCreatePuzzleRecipe":{aliases:[202,4,1,""],confirm:[202,4,1,""],default_confirm:[202,4,1,""],func:[202,3,1,""],help_category:[202,4,1,""],key:[202,4,1,""],lock_storage:[202,4,1,""],locks:[202,4,1,""],search_index_entry:[202,4,1,""]},"evennia.contrib.puzzles.CmdEditPuzzle":{aliases:[202,4,1,""],func:[202,3,1,""],help_category:[202,4,1,""],key:[202,4,1,""],lock_storage:[202,4,1,""],locks:[202,4,1,""],search_index_entry:[202,4,1,""]},"evennia.contrib.puzzles.CmdListArmedPuzzles":{aliases:[202,4,1,""],func:[202,3,1,""],help_category:[202,4,1,""],key:[202,4,1,""],lock_storage:[202,4,1,""],locks:[202,4,1,""],search_index_entry:[202,4,1,""]},"evennia.contrib.puzzles.CmdListPuzzleRecipes":{aliases:[202,4,1,""],func:[202,3,1,""],help_category:[202,4,1,""],key:[202,4,1,""],lock_storage:[202,4,1,""],locks:[202,4,1,""],search_index_entry:[202,4,1,""]},"evennia.contrib.puzzles.CmdUsePuzzleParts":{aliases:[202,4,1,""],func:[202,3,1,""],help_category:[202,4,1,""],key:[202,4,1,""],lock_storage:[202,4,1,""],locks:[202,4,1,""],search_index_entry:[202,4,1,""]},"evennia.contrib.puzzles.PuzzleRecipe":{DoesNotExist:[202,2,1,""],MultipleObjectsReturned:[202,2,1,""],path:[202,4,1,""],save_recipe:[202,3,1,""],typename:[202,4,1,""]},"evennia.contrib.puzzles.PuzzleSystemCmdSet":{at_cmdset_creation:[202,3,1,""],path:[202,4,1,""]},"evennia.contrib.random_string_generator":{ExhaustedGenerator:[203,2,1,""],RandomStringGenerator:[203,1,1,""],RandomStringGeneratorScript:[203,1,1,""],RejectedRegex:[203,2,1,""]},"evennia.contrib.random_string_generator.RandomStringGenerator":{__init__:[203,3,1,""],all:[203,3,1,""],clear:[203,3,1,""],get:[203,3,1,""],remove:[203,3,1,""],script:[203,4,1,""]},"evennia.contrib.random_string_generator.RandomStringGeneratorScript":{DoesNotExist:[203,2,1,""],MultipleObjectsReturned:[203,2,1,""],at_script_creation:[203,3,1,""],path:[203,4,1,""],typename:[203,4,1,""]},"evennia.contrib.rplanguage":{LanguageError:[204,2,1,""],LanguageExistsError:[204,2,1,""],LanguageHandler:[204,1,1,""],add_language:[204,5,1,""],available_languages:[204,5,1,""],obfuscate_language:[204,5,1,""],obfuscate_whisper:[204,5,1,""]},"evennia.contrib.rplanguage.LanguageHandler":{DoesNotExist:[204,2,1,""],MultipleObjectsReturned:[204,2,1,""],add:[204,3,1,""],at_script_creation:[204,3,1,""],path:[204,4,1,""],translate:[204,3,1,""],typename:[204,4,1,""]},"evennia.contrib.rpsystem":{CmdEmote:[205,1,1,""],CmdMask:[205,1,1,""],CmdPose:[205,1,1,""],CmdRecog:[205,1,1,""],CmdSay:[205,1,1,""],CmdSdesc:[205,1,1,""],ContribRPCharacter:[205,1,1,""],ContribRPObject:[205,1,1,""],ContribRPRoom:[205,1,1,""],EmoteError:[205,2,1,""],LanguageError:[205,2,1,""],RPCommand:[205,1,1,""],RPSystemCmdSet:[205,1,1,""],RecogError:[205,2,1,""],RecogHandler:[205,1,1,""],SdescError:[205,2,1,""],SdescHandler:[205,1,1,""],ordered_permutation_regex:[205,5,1,""],parse_language:[205,5,1,""],parse_sdescs_and_recogs:[205,5,1,""],regex_tuple_from_key_alias:[205,5,1,""],send_emote:[205,5,1,""]},"evennia.contrib.rpsystem.CmdEmote":{aliases:[205,4,1,""],func:[205,3,1,""],help_category:[205,4,1,""],key:[205,4,1,""],lock_storage:[205,4,1,""],locks:[205,4,1,""],search_index_entry:[205,4,1,""]},"evennia.contrib.rpsystem.CmdMask":{aliases:[205,4,1,""],func:[205,3,1,""],help_category:[205,4,1,""],key:[205,4,1,""],lock_storage:[205,4,1,""],search_index_entry:[205,4,1,""]},"evennia.contrib.rpsystem.CmdPose":{aliases:[205,4,1,""],func:[205,3,1,""],help_category:[205,4,1,""],key:[205,4,1,""],lock_storage:[205,4,1,""],parse:[205,3,1,""],search_index_entry:[205,4,1,""]},"evennia.contrib.rpsystem.CmdRecog":{aliases:[205,4,1,""],func:[205,3,1,""],help_category:[205,4,1,""],key:[205,4,1,""],lock_storage:[205,4,1,""],parse:[205,3,1,""],search_index_entry:[205,4,1,""]},"evennia.contrib.rpsystem.CmdSay":{aliases:[205,4,1,""],func:[205,3,1,""],help_category:[205,4,1,""],key:[205,4,1,""],lock_storage:[205,4,1,""],locks:[205,4,1,""],search_index_entry:[205,4,1,""]},"evennia.contrib.rpsystem.CmdSdesc":{aliases:[205,4,1,""],func:[205,3,1,""],help_category:[205,4,1,""],key:[205,4,1,""],lock_storage:[205,4,1,""],locks:[205,4,1,""],search_index_entry:[205,4,1,""]},"evennia.contrib.rpsystem.ContribRPCharacter":{DoesNotExist:[205,2,1,""],MultipleObjectsReturned:[205,2,1,""],at_before_say:[205,3,1,""],at_object_creation:[205,3,1,""],get_display_name:[205,3,1,""],path:[205,4,1,""],process_language:[205,3,1,""],process_recog:[205,3,1,""],process_sdesc:[205,3,1,""],recog:[205,4,1,""],sdesc:[205,4,1,""],typename:[205,4,1,""]},"evennia.contrib.rpsystem.ContribRPObject":{DoesNotExist:[205,2,1,""],MultipleObjectsReturned:[205,2,1,""],at_object_creation:[205,3,1,""],get_display_name:[205,3,1,""],path:[205,4,1,""],return_appearance:[205,3,1,""],search:[205,3,1,""],typename:[205,4,1,""]},"evennia.contrib.rpsystem.ContribRPRoom":{DoesNotExist:[205,2,1,""],MultipleObjectsReturned:[205,2,1,""],path:[205,4,1,""],typename:[205,4,1,""]},"evennia.contrib.rpsystem.RPCommand":{aliases:[205,4,1,""],help_category:[205,4,1,""],key:[205,4,1,""],lock_storage:[205,4,1,""],parse:[205,3,1,""],search_index_entry:[205,4,1,""]},"evennia.contrib.rpsystem.RPSystemCmdSet":{at_cmdset_creation:[205,3,1,""],path:[205,4,1,""]},"evennia.contrib.rpsystem.RecogHandler":{__init__:[205,3,1,""],add:[205,3,1,""],all:[205,3,1,""],get:[205,3,1,""],get_regex_tuple:[205,3,1,""],remove:[205,3,1,""]},"evennia.contrib.rpsystem.SdescHandler":{__init__:[205,3,1,""],add:[205,3,1,""],get:[205,3,1,""],get_regex_tuple:[205,3,1,""]},"evennia.contrib.security":{auditing:[207,0,0,"-"]},"evennia.contrib.security.auditing":{outputs:[208,0,0,"-"],server:[209,0,0,"-"],tests:[210,0,0,"-"]},"evennia.contrib.security.auditing.outputs":{to_file:[208,5,1,""],to_syslog:[208,5,1,""]},"evennia.contrib.security.auditing.server":{AuditedServerSession:[209,1,1,""]},"evennia.contrib.security.auditing.server.AuditedServerSession":{audit:[209,3,1,""],data_in:[209,3,1,""],data_out:[209,3,1,""],mask:[209,3,1,""]},"evennia.contrib.security.auditing.tests":{AuditingTest:[210,1,1,""]},"evennia.contrib.security.auditing.tests.AuditingTest":{test_audit:[210,3,1,""],test_mask:[210,3,1,""]},"evennia.contrib.simpledoor":{CmdOpen:[211,1,1,""],CmdOpenCloseDoor:[211,1,1,""],SimpleDoor:[211,1,1,""]},"evennia.contrib.simpledoor.CmdOpen":{aliases:[211,4,1,""],create_exit:[211,3,1,""],help_category:[211,4,1,""],key:[211,4,1,""],lock_storage:[211,4,1,""],search_index_entry:[211,4,1,""]},"evennia.contrib.simpledoor.CmdOpenCloseDoor":{aliases:[211,4,1,""],func:[211,3,1,""],help_category:[211,4,1,""],key:[211,4,1,""],lock_storage:[211,4,1,""],locks:[211,4,1,""],search_index_entry:[211,4,1,""]},"evennia.contrib.simpledoor.SimpleDoor":{"delete":[211,3,1,""],DoesNotExist:[211,2,1,""],MultipleObjectsReturned:[211,2,1,""],at_failed_traverse:[211,3,1,""],at_object_creation:[211,3,1,""],path:[211,4,1,""],setdesc:[211,3,1,""],setlock:[211,3,1,""],typename:[211,4,1,""]},"evennia.contrib.slow_exit":{CmdSetSpeed:[212,1,1,""],CmdStop:[212,1,1,""],SlowExit:[212,1,1,""]},"evennia.contrib.slow_exit.CmdSetSpeed":{aliases:[212,4,1,""],func:[212,3,1,""],help_category:[212,4,1,""],key:[212,4,1,""],lock_storage:[212,4,1,""],search_index_entry:[212,4,1,""]},"evennia.contrib.slow_exit.CmdStop":{aliases:[212,4,1,""],func:[212,3,1,""],help_category:[212,4,1,""],key:[212,4,1,""],lock_storage:[212,4,1,""],search_index_entry:[212,4,1,""]},"evennia.contrib.slow_exit.SlowExit":{DoesNotExist:[212,2,1,""],MultipleObjectsReturned:[212,2,1,""],at_traverse:[212,3,1,""],path:[212,4,1,""],typename:[212,4,1,""]},"evennia.contrib.talking_npc":{CmdTalk:[213,1,1,""],END:[213,5,1,""],TalkingCmdSet:[213,1,1,""],TalkingNPC:[213,1,1,""],info1:[213,5,1,""],info2:[213,5,1,""],info3:[213,5,1,""],menu_start_node:[213,5,1,""]},"evennia.contrib.talking_npc.CmdTalk":{aliases:[213,4,1,""],func:[213,3,1,""],help_category:[213,4,1,""],key:[213,4,1,""],lock_storage:[213,4,1,""],locks:[213,4,1,""],search_index_entry:[213,4,1,""]},"evennia.contrib.talking_npc.TalkingCmdSet":{at_cmdset_creation:[213,3,1,""],key:[213,4,1,""],path:[213,4,1,""]},"evennia.contrib.talking_npc.TalkingNPC":{DoesNotExist:[213,2,1,""],MultipleObjectsReturned:[213,2,1,""],at_object_creation:[213,3,1,""],path:[213,4,1,""],typename:[213,4,1,""]},"evennia.contrib.tree_select":{CmdNameColor:[214,1,1,""],change_name_color:[214,5,1,""],dashcount:[214,5,1,""],go_up_one_category:[214,5,1,""],index_to_selection:[214,5,1,""],init_tree_selection:[214,5,1,""],is_category:[214,5,1,""],menunode_treeselect:[214,5,1,""],optlist_to_menuoptions:[214,5,1,""],parse_opts:[214,5,1,""]},"evennia.contrib.tree_select.CmdNameColor":{aliases:[214,4,1,""],func:[214,3,1,""],help_category:[214,4,1,""],key:[214,4,1,""],lock_storage:[214,4,1,""],search_index_entry:[214,4,1,""]},"evennia.contrib.turnbattle":{tb_basic:[216,0,0,"-"],tb_equip:[217,0,0,"-"],tb_items:[218,0,0,"-"],tb_magic:[219,0,0,"-"],tb_range:[220,0,0,"-"]},"evennia.contrib.turnbattle.tb_basic":{ACTIONS_PER_TURN:[216,6,1,""],BattleCmdSet:[216,1,1,""],CmdAttack:[216,1,1,""],CmdCombatHelp:[216,1,1,""],CmdDisengage:[216,1,1,""],CmdFight:[216,1,1,""],CmdPass:[216,1,1,""],CmdRest:[216,1,1,""],TBBasicCharacter:[216,1,1,""],TBBasicTurnHandler:[216,1,1,""],apply_damage:[216,5,1,""],at_defeat:[216,5,1,""],combat_cleanup:[216,5,1,""],get_attack:[216,5,1,""],get_damage:[216,5,1,""],get_defense:[216,5,1,""],is_in_combat:[216,5,1,""],is_turn:[216,5,1,""],resolve_attack:[216,5,1,""],roll_init:[216,5,1,""],spend_action:[216,5,1,""]},"evennia.contrib.turnbattle.tb_basic.BattleCmdSet":{at_cmdset_creation:[216,3,1,""],key:[216,4,1,""],path:[216,4,1,""]},"evennia.contrib.turnbattle.tb_basic.CmdAttack":{aliases:[216,4,1,""],func:[216,3,1,""],help_category:[216,4,1,""],key:[216,4,1,""],lock_storage:[216,4,1,""],search_index_entry:[216,4,1,""]},"evennia.contrib.turnbattle.tb_basic.CmdCombatHelp":{aliases:[216,4,1,""],func:[216,3,1,""],help_category:[216,4,1,""],key:[216,4,1,""],lock_storage:[216,4,1,""],search_index_entry:[216,4,1,""]},"evennia.contrib.turnbattle.tb_basic.CmdDisengage":{aliases:[216,4,1,""],func:[216,3,1,""],help_category:[216,4,1,""],key:[216,4,1,""],lock_storage:[216,4,1,""],search_index_entry:[216,4,1,""]},"evennia.contrib.turnbattle.tb_basic.CmdFight":{aliases:[216,4,1,""],func:[216,3,1,""],help_category:[216,4,1,""],key:[216,4,1,""],lock_storage:[216,4,1,""],search_index_entry:[216,4,1,""]},"evennia.contrib.turnbattle.tb_basic.CmdPass":{aliases:[216,4,1,""],func:[216,3,1,""],help_category:[216,4,1,""],key:[216,4,1,""],lock_storage:[216,4,1,""],search_index_entry:[216,4,1,""]},"evennia.contrib.turnbattle.tb_basic.CmdRest":{aliases:[216,4,1,""],func:[216,3,1,""],help_category:[216,4,1,""],key:[216,4,1,""],lock_storage:[216,4,1,""],search_index_entry:[216,4,1,""]},"evennia.contrib.turnbattle.tb_basic.TBBasicCharacter":{DoesNotExist:[216,2,1,""],MultipleObjectsReturned:[216,2,1,""],at_before_move:[216,3,1,""],at_object_creation:[216,3,1,""],path:[216,4,1,""],typename:[216,4,1,""]},"evennia.contrib.turnbattle.tb_basic.TBBasicTurnHandler":{DoesNotExist:[216,2,1,""],MultipleObjectsReturned:[216,2,1,""],at_repeat:[216,3,1,""],at_script_creation:[216,3,1,""],at_stop:[216,3,1,""],initialize_for_combat:[216,3,1,""],join_fight:[216,3,1,""],next_turn:[216,3,1,""],path:[216,4,1,""],start_turn:[216,3,1,""],turn_end_check:[216,3,1,""],typename:[216,4,1,""]},"evennia.contrib.turnbattle.tb_equip":{ACTIONS_PER_TURN:[217,6,1,""],BattleCmdSet:[217,1,1,""],CmdAttack:[217,1,1,""],CmdCombatHelp:[217,1,1,""],CmdDisengage:[217,1,1,""],CmdDoff:[217,1,1,""],CmdDon:[217,1,1,""],CmdFight:[217,1,1,""],CmdPass:[217,1,1,""],CmdRest:[217,1,1,""],CmdUnwield:[217,1,1,""],CmdWield:[217,1,1,""],TBEArmor:[217,1,1,""],TBEWeapon:[217,1,1,""],TBEquipCharacter:[217,1,1,""],TBEquipTurnHandler:[217,1,1,""],apply_damage:[217,5,1,""],at_defeat:[217,5,1,""],combat_cleanup:[217,5,1,""],get_attack:[217,5,1,""],get_damage:[217,5,1,""],get_defense:[217,5,1,""],is_in_combat:[217,5,1,""],is_turn:[217,5,1,""],resolve_attack:[217,5,1,""],roll_init:[217,5,1,""],spend_action:[217,5,1,""]},"evennia.contrib.turnbattle.tb_equip.BattleCmdSet":{at_cmdset_creation:[217,3,1,""],key:[217,4,1,""],path:[217,4,1,""]},"evennia.contrib.turnbattle.tb_equip.CmdAttack":{aliases:[217,4,1,""],func:[217,3,1,""],help_category:[217,4,1,""],key:[217,4,1,""],lock_storage:[217,4,1,""],search_index_entry:[217,4,1,""]},"evennia.contrib.turnbattle.tb_equip.CmdCombatHelp":{aliases:[217,4,1,""],func:[217,3,1,""],help_category:[217,4,1,""],key:[217,4,1,""],lock_storage:[217,4,1,""],search_index_entry:[217,4,1,""]},"evennia.contrib.turnbattle.tb_equip.CmdDisengage":{aliases:[217,4,1,""],func:[217,3,1,""],help_category:[217,4,1,""],key:[217,4,1,""],lock_storage:[217,4,1,""],search_index_entry:[217,4,1,""]},"evennia.contrib.turnbattle.tb_equip.CmdDoff":{aliases:[217,4,1,""],func:[217,3,1,""],help_category:[217,4,1,""],key:[217,4,1,""],lock_storage:[217,4,1,""],search_index_entry:[217,4,1,""]},"evennia.contrib.turnbattle.tb_equip.CmdDon":{aliases:[217,4,1,""],func:[217,3,1,""],help_category:[217,4,1,""],key:[217,4,1,""],lock_storage:[217,4,1,""],search_index_entry:[217,4,1,""]},"evennia.contrib.turnbattle.tb_equip.CmdFight":{aliases:[217,4,1,""],func:[217,3,1,""],help_category:[217,4,1,""],key:[217,4,1,""],lock_storage:[217,4,1,""],search_index_entry:[217,4,1,""]},"evennia.contrib.turnbattle.tb_equip.CmdPass":{aliases:[217,4,1,""],func:[217,3,1,""],help_category:[217,4,1,""],key:[217,4,1,""],lock_storage:[217,4,1,""],search_index_entry:[217,4,1,""]},"evennia.contrib.turnbattle.tb_equip.CmdRest":{aliases:[217,4,1,""],func:[217,3,1,""],help_category:[217,4,1,""],key:[217,4,1,""],lock_storage:[217,4,1,""],search_index_entry:[217,4,1,""]},"evennia.contrib.turnbattle.tb_equip.CmdUnwield":{aliases:[217,4,1,""],func:[217,3,1,""],help_category:[217,4,1,""],key:[217,4,1,""],lock_storage:[217,4,1,""],search_index_entry:[217,4,1,""]},"evennia.contrib.turnbattle.tb_equip.CmdWield":{aliases:[217,4,1,""],func:[217,3,1,""],help_category:[217,4,1,""],key:[217,4,1,""],lock_storage:[217,4,1,""],search_index_entry:[217,4,1,""]},"evennia.contrib.turnbattle.tb_equip.TBEArmor":{DoesNotExist:[217,2,1,""],MultipleObjectsReturned:[217,2,1,""],at_before_drop:[217,3,1,""],at_before_give:[217,3,1,""],at_drop:[217,3,1,""],at_give:[217,3,1,""],at_object_creation:[217,3,1,""],path:[217,4,1,""],typename:[217,4,1,""]},"evennia.contrib.turnbattle.tb_equip.TBEWeapon":{DoesNotExist:[217,2,1,""],MultipleObjectsReturned:[217,2,1,""],at_drop:[217,3,1,""],at_give:[217,3,1,""],at_object_creation:[217,3,1,""],path:[217,4,1,""],typename:[217,4,1,""]},"evennia.contrib.turnbattle.tb_equip.TBEquipCharacter":{DoesNotExist:[217,2,1,""],MultipleObjectsReturned:[217,2,1,""],at_before_move:[217,3,1,""],at_object_creation:[217,3,1,""],path:[217,4,1,""],typename:[217,4,1,""]},"evennia.contrib.turnbattle.tb_equip.TBEquipTurnHandler":{DoesNotExist:[217,2,1,""],MultipleObjectsReturned:[217,2,1,""],at_repeat:[217,3,1,""],at_script_creation:[217,3,1,""],at_stop:[217,3,1,""],initialize_for_combat:[217,3,1,""],join_fight:[217,3,1,""],next_turn:[217,3,1,""],path:[217,4,1,""],start_turn:[217,3,1,""],turn_end_check:[217,3,1,""],typename:[217,4,1,""]},"evennia.contrib.turnbattle.tb_items":{BattleCmdSet:[218,1,1,""],CmdAttack:[218,1,1,""],CmdCombatHelp:[218,1,1,""],CmdDisengage:[218,1,1,""],CmdFight:[218,1,1,""],CmdPass:[218,1,1,""],CmdRest:[218,1,1,""],CmdUse:[218,1,1,""],DEF_DOWN_MOD:[218,6,1,""],ITEMFUNCS:[218,6,1,""],TBItemsCharacter:[218,1,1,""],TBItemsCharacterTest:[218,1,1,""],TBItemsTurnHandler:[218,1,1,""],add_condition:[218,5,1,""],apply_damage:[218,5,1,""],at_defeat:[218,5,1,""],combat_cleanup:[218,5,1,""],condition_tickdown:[218,5,1,""],get_attack:[218,5,1,""],get_damage:[218,5,1,""],get_defense:[218,5,1,""],is_in_combat:[218,5,1,""],is_turn:[218,5,1,""],itemfunc_add_condition:[218,5,1,""],itemfunc_attack:[218,5,1,""],itemfunc_cure_condition:[218,5,1,""],itemfunc_heal:[218,5,1,""],resolve_attack:[218,5,1,""],roll_init:[218,5,1,""],spend_action:[218,5,1,""],spend_item_use:[218,5,1,""],use_item:[218,5,1,""]},"evennia.contrib.turnbattle.tb_items.BattleCmdSet":{at_cmdset_creation:[218,3,1,""],key:[218,4,1,""],path:[218,4,1,""]},"evennia.contrib.turnbattle.tb_items.CmdAttack":{aliases:[218,4,1,""],func:[218,3,1,""],help_category:[218,4,1,""],key:[218,4,1,""],lock_storage:[218,4,1,""],search_index_entry:[218,4,1,""]},"evennia.contrib.turnbattle.tb_items.CmdCombatHelp":{aliases:[218,4,1,""],func:[218,3,1,""],help_category:[218,4,1,""],key:[218,4,1,""],lock_storage:[218,4,1,""],search_index_entry:[218,4,1,""]},"evennia.contrib.turnbattle.tb_items.CmdDisengage":{aliases:[218,4,1,""],func:[218,3,1,""],help_category:[218,4,1,""],key:[218,4,1,""],lock_storage:[218,4,1,""],search_index_entry:[218,4,1,""]},"evennia.contrib.turnbattle.tb_items.CmdFight":{aliases:[218,4,1,""],func:[218,3,1,""],help_category:[218,4,1,""],key:[218,4,1,""],lock_storage:[218,4,1,""],search_index_entry:[218,4,1,""]},"evennia.contrib.turnbattle.tb_items.CmdPass":{aliases:[218,4,1,""],func:[218,3,1,""],help_category:[218,4,1,""],key:[218,4,1,""],lock_storage:[218,4,1,""],search_index_entry:[218,4,1,""]},"evennia.contrib.turnbattle.tb_items.CmdRest":{aliases:[218,4,1,""],func:[218,3,1,""],help_category:[218,4,1,""],key:[218,4,1,""],lock_storage:[218,4,1,""],search_index_entry:[218,4,1,""]},"evennia.contrib.turnbattle.tb_items.CmdUse":{aliases:[218,4,1,""],func:[218,3,1,""],help_category:[218,4,1,""],key:[218,4,1,""],lock_storage:[218,4,1,""],search_index_entry:[218,4,1,""]},"evennia.contrib.turnbattle.tb_items.TBItemsCharacter":{DoesNotExist:[218,2,1,""],MultipleObjectsReturned:[218,2,1,""],apply_turn_conditions:[218,3,1,""],at_before_move:[218,3,1,""],at_object_creation:[218,3,1,""],at_turn_start:[218,3,1,""],at_update:[218,3,1,""],path:[218,4,1,""],typename:[218,4,1,""]},"evennia.contrib.turnbattle.tb_items.TBItemsCharacterTest":{DoesNotExist:[218,2,1,""],MultipleObjectsReturned:[218,2,1,""],at_object_creation:[218,3,1,""],path:[218,4,1,""],typename:[218,4,1,""]},"evennia.contrib.turnbattle.tb_items.TBItemsTurnHandler":{DoesNotExist:[218,2,1,""],MultipleObjectsReturned:[218,2,1,""],at_repeat:[218,3,1,""],at_script_creation:[218,3,1,""],at_stop:[218,3,1,""],initialize_for_combat:[218,3,1,""],join_fight:[218,3,1,""],next_turn:[218,3,1,""],path:[218,4,1,""],start_turn:[218,3,1,""],turn_end_check:[218,3,1,""],typename:[218,4,1,""]},"evennia.contrib.turnbattle.tb_magic":{ACTIONS_PER_TURN:[219,6,1,""],BattleCmdSet:[219,1,1,""],CmdAttack:[219,1,1,""],CmdCast:[219,1,1,""],CmdCombatHelp:[219,1,1,""],CmdDisengage:[219,1,1,""],CmdFight:[219,1,1,""],CmdLearnSpell:[219,1,1,""],CmdPass:[219,1,1,""],CmdRest:[219,1,1,""],CmdStatus:[219,1,1,""],TBMagicCharacter:[219,1,1,""],TBMagicTurnHandler:[219,1,1,""],apply_damage:[219,5,1,""],at_defeat:[219,5,1,""],combat_cleanup:[219,5,1,""],get_attack:[219,5,1,""],get_damage:[219,5,1,""],get_defense:[219,5,1,""],is_in_combat:[219,5,1,""],is_turn:[219,5,1,""],resolve_attack:[219,5,1,""],roll_init:[219,5,1,""],spell_attack:[219,5,1,""],spell_conjure:[219,5,1,""],spell_healing:[219,5,1,""],spend_action:[219,5,1,""]},"evennia.contrib.turnbattle.tb_magic.BattleCmdSet":{at_cmdset_creation:[219,3,1,""],key:[219,4,1,""],path:[219,4,1,""]},"evennia.contrib.turnbattle.tb_magic.CmdAttack":{aliases:[219,4,1,""],func:[219,3,1,""],help_category:[219,4,1,""],key:[219,4,1,""],lock_storage:[219,4,1,""],search_index_entry:[219,4,1,""]},"evennia.contrib.turnbattle.tb_magic.CmdCast":{aliases:[219,4,1,""],func:[219,3,1,""],help_category:[219,4,1,""],key:[219,4,1,""],lock_storage:[219,4,1,""],search_index_entry:[219,4,1,""]},"evennia.contrib.turnbattle.tb_magic.CmdCombatHelp":{aliases:[219,4,1,""],func:[219,3,1,""],help_category:[219,4,1,""],key:[219,4,1,""],lock_storage:[219,4,1,""],search_index_entry:[219,4,1,""]},"evennia.contrib.turnbattle.tb_magic.CmdDisengage":{aliases:[219,4,1,""],func:[219,3,1,""],help_category:[219,4,1,""],key:[219,4,1,""],lock_storage:[219,4,1,""],search_index_entry:[219,4,1,""]},"evennia.contrib.turnbattle.tb_magic.CmdFight":{aliases:[219,4,1,""],func:[219,3,1,""],help_category:[219,4,1,""],key:[219,4,1,""],lock_storage:[219,4,1,""],search_index_entry:[219,4,1,""]},"evennia.contrib.turnbattle.tb_magic.CmdLearnSpell":{aliases:[219,4,1,""],func:[219,3,1,""],help_category:[219,4,1,""],key:[219,4,1,""],lock_storage:[219,4,1,""],search_index_entry:[219,4,1,""]},"evennia.contrib.turnbattle.tb_magic.CmdPass":{aliases:[219,4,1,""],func:[219,3,1,""],help_category:[219,4,1,""],key:[219,4,1,""],lock_storage:[219,4,1,""],search_index_entry:[219,4,1,""]},"evennia.contrib.turnbattle.tb_magic.CmdRest":{aliases:[219,4,1,""],func:[219,3,1,""],help_category:[219,4,1,""],key:[219,4,1,""],lock_storage:[219,4,1,""],search_index_entry:[219,4,1,""]},"evennia.contrib.turnbattle.tb_magic.CmdStatus":{aliases:[219,4,1,""],func:[219,3,1,""],help_category:[219,4,1,""],key:[219,4,1,""],lock_storage:[219,4,1,""],search_index_entry:[219,4,1,""]},"evennia.contrib.turnbattle.tb_magic.TBMagicCharacter":{DoesNotExist:[219,2,1,""],MultipleObjectsReturned:[219,2,1,""],at_before_move:[219,3,1,""],at_object_creation:[219,3,1,""],path:[219,4,1,""],typename:[219,4,1,""]},"evennia.contrib.turnbattle.tb_magic.TBMagicTurnHandler":{DoesNotExist:[219,2,1,""],MultipleObjectsReturned:[219,2,1,""],at_repeat:[219,3,1,""],at_script_creation:[219,3,1,""],at_stop:[219,3,1,""],initialize_for_combat:[219,3,1,""],join_fight:[219,3,1,""],next_turn:[219,3,1,""],path:[219,4,1,""],start_turn:[219,3,1,""],turn_end_check:[219,3,1,""],typename:[219,4,1,""]},"evennia.contrib.turnbattle.tb_range":{ACTIONS_PER_TURN:[220,6,1,""],BattleCmdSet:[220,1,1,""],CmdApproach:[220,1,1,""],CmdAttack:[220,1,1,""],CmdCombatHelp:[220,1,1,""],CmdDisengage:[220,1,1,""],CmdFight:[220,1,1,""],CmdPass:[220,1,1,""],CmdRest:[220,1,1,""],CmdShoot:[220,1,1,""],CmdStatus:[220,1,1,""],CmdWithdraw:[220,1,1,""],TBRangeCharacter:[220,1,1,""],TBRangeObject:[220,1,1,""],TBRangeTurnHandler:[220,1,1,""],apply_damage:[220,5,1,""],approach:[220,5,1,""],at_defeat:[220,5,1,""],combat_cleanup:[220,5,1,""],combat_status_message:[220,5,1,""],distance_inc:[220,5,1,""],get_attack:[220,5,1,""],get_damage:[220,5,1,""],get_defense:[220,5,1,""],get_range:[220,5,1,""],is_in_combat:[220,5,1,""],is_turn:[220,5,1,""],resolve_attack:[220,5,1,""],roll_init:[220,5,1,""],spend_action:[220,5,1,""],withdraw:[220,5,1,""]},"evennia.contrib.turnbattle.tb_range.BattleCmdSet":{at_cmdset_creation:[220,3,1,""],key:[220,4,1,""],path:[220,4,1,""]},"evennia.contrib.turnbattle.tb_range.CmdApproach":{aliases:[220,4,1,""],func:[220,3,1,""],help_category:[220,4,1,""],key:[220,4,1,""],lock_storage:[220,4,1,""],search_index_entry:[220,4,1,""]},"evennia.contrib.turnbattle.tb_range.CmdAttack":{aliases:[220,4,1,""],func:[220,3,1,""],help_category:[220,4,1,""],key:[220,4,1,""],lock_storage:[220,4,1,""],search_index_entry:[220,4,1,""]},"evennia.contrib.turnbattle.tb_range.CmdCombatHelp":{aliases:[220,4,1,""],func:[220,3,1,""],help_category:[220,4,1,""],key:[220,4,1,""],lock_storage:[220,4,1,""],search_index_entry:[220,4,1,""]},"evennia.contrib.turnbattle.tb_range.CmdDisengage":{aliases:[220,4,1,""],func:[220,3,1,""],help_category:[220,4,1,""],key:[220,4,1,""],lock_storage:[220,4,1,""],search_index_entry:[220,4,1,""]},"evennia.contrib.turnbattle.tb_range.CmdFight":{aliases:[220,4,1,""],func:[220,3,1,""],help_category:[220,4,1,""],key:[220,4,1,""],lock_storage:[220,4,1,""],search_index_entry:[220,4,1,""]},"evennia.contrib.turnbattle.tb_range.CmdPass":{aliases:[220,4,1,""],func:[220,3,1,""],help_category:[220,4,1,""],key:[220,4,1,""],lock_storage:[220,4,1,""],search_index_entry:[220,4,1,""]},"evennia.contrib.turnbattle.tb_range.CmdRest":{aliases:[220,4,1,""],func:[220,3,1,""],help_category:[220,4,1,""],key:[220,4,1,""],lock_storage:[220,4,1,""],search_index_entry:[220,4,1,""]},"evennia.contrib.turnbattle.tb_range.CmdShoot":{aliases:[220,4,1,""],func:[220,3,1,""],help_category:[220,4,1,""],key:[220,4,1,""],lock_storage:[220,4,1,""],search_index_entry:[220,4,1,""]},"evennia.contrib.turnbattle.tb_range.CmdStatus":{aliases:[220,4,1,""],func:[220,3,1,""],help_category:[220,4,1,""],key:[220,4,1,""],lock_storage:[220,4,1,""],search_index_entry:[220,4,1,""]},"evennia.contrib.turnbattle.tb_range.CmdWithdraw":{aliases:[220,4,1,""],func:[220,3,1,""],help_category:[220,4,1,""],key:[220,4,1,""],lock_storage:[220,4,1,""],search_index_entry:[220,4,1,""]},"evennia.contrib.turnbattle.tb_range.TBRangeCharacter":{DoesNotExist:[220,2,1,""],MultipleObjectsReturned:[220,2,1,""],at_before_move:[220,3,1,""],at_object_creation:[220,3,1,""],path:[220,4,1,""],typename:[220,4,1,""]},"evennia.contrib.turnbattle.tb_range.TBRangeObject":{DoesNotExist:[220,2,1,""],MultipleObjectsReturned:[220,2,1,""],at_before_drop:[220,3,1,""],at_before_get:[220,3,1,""],at_before_give:[220,3,1,""],at_drop:[220,3,1,""],at_get:[220,3,1,""],at_give:[220,3,1,""],path:[220,4,1,""],typename:[220,4,1,""]},"evennia.contrib.turnbattle.tb_range.TBRangeTurnHandler":{DoesNotExist:[220,2,1,""],MultipleObjectsReturned:[220,2,1,""],at_repeat:[220,3,1,""],at_script_creation:[220,3,1,""],at_stop:[220,3,1,""],init_range:[220,3,1,""],initialize_for_combat:[220,3,1,""],join_fight:[220,3,1,""],join_rangefield:[220,3,1,""],next_turn:[220,3,1,""],path:[220,4,1,""],start_turn:[220,3,1,""],turn_end_check:[220,3,1,""],typename:[220,4,1,""]},"evennia.contrib.tutorial_examples":{bodyfunctions:[222,0,0,"-"],cmdset_red_button:[223,0,0,"-"],red_button:[225,0,0,"-"],red_button_scripts:[226,0,0,"-"],tests:[227,0,0,"-"]},"evennia.contrib.tutorial_examples.bodyfunctions":{BodyFunctions:[222,1,1,""]},"evennia.contrib.tutorial_examples.bodyfunctions.BodyFunctions":{DoesNotExist:[222,2,1,""],MultipleObjectsReturned:[222,2,1,""],at_repeat:[222,3,1,""],at_script_creation:[222,3,1,""],path:[222,4,1,""],send_random_message:[222,3,1,""],typename:[222,4,1,""]},"evennia.contrib.tutorial_examples.cmdset_red_button":{BlindCmdSet:[223,1,1,""],CmdBlindHelp:[223,1,1,""],CmdBlindLook:[223,1,1,""],CmdCloseLid:[223,1,1,""],CmdNudge:[223,1,1,""],CmdOpenLid:[223,1,1,""],CmdPush:[223,1,1,""],CmdSmashGlass:[223,1,1,""],DefaultCmdSet:[223,1,1,""],LidClosedCmdSet:[223,1,1,""],LidOpenCmdSet:[223,1,1,""]},"evennia.contrib.tutorial_examples.cmdset_red_button.BlindCmdSet":{at_cmdset_creation:[223,3,1,""],key:[223,4,1,""],mergetype:[223,4,1,""],no_exits:[223,4,1,""],no_objs:[223,4,1,""],path:[223,4,1,""]},"evennia.contrib.tutorial_examples.cmdset_red_button.CmdBlindHelp":{aliases:[223,4,1,""],func:[223,3,1,""],help_category:[223,4,1,""],key:[223,4,1,""],lock_storage:[223,4,1,""],locks:[223,4,1,""],search_index_entry:[223,4,1,""]},"evennia.contrib.tutorial_examples.cmdset_red_button.CmdBlindLook":{aliases:[223,4,1,""],func:[223,3,1,""],help_category:[223,4,1,""],key:[223,4,1,""],lock_storage:[223,4,1,""],locks:[223,4,1,""],search_index_entry:[223,4,1,""]},"evennia.contrib.tutorial_examples.cmdset_red_button.CmdCloseLid":{aliases:[223,4,1,""],func:[223,3,1,""],help_category:[223,4,1,""],key:[223,4,1,""],lock_storage:[223,4,1,""],locks:[223,4,1,""],search_index_entry:[223,4,1,""]},"evennia.contrib.tutorial_examples.cmdset_red_button.CmdNudge":{aliases:[223,4,1,""],func:[223,3,1,""],help_category:[223,4,1,""],key:[223,4,1,""],lock_storage:[223,4,1,""],locks:[223,4,1,""],search_index_entry:[223,4,1,""]},"evennia.contrib.tutorial_examples.cmdset_red_button.CmdOpenLid":{aliases:[223,4,1,""],func:[223,3,1,""],help_category:[223,4,1,""],key:[223,4,1,""],lock_storage:[223,4,1,""],locks:[223,4,1,""],search_index_entry:[223,4,1,""]},"evennia.contrib.tutorial_examples.cmdset_red_button.CmdPush":{aliases:[223,4,1,""],func:[223,3,1,""],help_category:[223,4,1,""],key:[223,4,1,""],lock_storage:[223,4,1,""],locks:[223,4,1,""],search_index_entry:[223,4,1,""]},"evennia.contrib.tutorial_examples.cmdset_red_button.CmdSmashGlass":{aliases:[223,4,1,""],func:[223,3,1,""],help_category:[223,4,1,""],key:[223,4,1,""],lock_storage:[223,4,1,""],locks:[223,4,1,""],search_index_entry:[223,4,1,""]},"evennia.contrib.tutorial_examples.cmdset_red_button.DefaultCmdSet":{at_cmdset_creation:[223,3,1,""],key:[223,4,1,""],mergetype:[223,4,1,""],path:[223,4,1,""]},"evennia.contrib.tutorial_examples.cmdset_red_button.LidClosedCmdSet":{at_cmdset_creation:[223,3,1,""],key:[223,4,1,""],key_mergetype:[223,4,1,""],path:[223,4,1,""]},"evennia.contrib.tutorial_examples.cmdset_red_button.LidOpenCmdSet":{at_cmdset_creation:[223,3,1,""],key:[223,4,1,""],key_mergetype:[223,4,1,""],path:[223,4,1,""]},"evennia.contrib.tutorial_examples.red_button":{RedButton:[225,1,1,""]},"evennia.contrib.tutorial_examples.red_button.RedButton":{DoesNotExist:[225,2,1,""],MultipleObjectsReturned:[225,2,1,""],at_object_creation:[225,3,1,""],blink:[225,3,1,""],break_lamp:[225,3,1,""],close_lid:[225,3,1,""],open_lid:[225,3,1,""],path:[225,4,1,""],press_button:[225,3,1,""],typename:[225,4,1,""]},"evennia.contrib.tutorial_examples.red_button_scripts":{BlindedState:[226,1,1,""],BlinkButtonEvent:[226,1,1,""],CloseLidEvent:[226,1,1,""],ClosedLidState:[226,1,1,""],DeactivateButtonEvent:[226,1,1,""],OpenLidState:[226,1,1,""]},"evennia.contrib.tutorial_examples.red_button_scripts.BlindedState":{DoesNotExist:[226,2,1,""],MultipleObjectsReturned:[226,2,1,""],at_script_creation:[226,3,1,""],at_start:[226,3,1,""],at_stop:[226,3,1,""],path:[226,4,1,""],typename:[226,4,1,""]},"evennia.contrib.tutorial_examples.red_button_scripts.BlinkButtonEvent":{DoesNotExist:[226,2,1,""],MultipleObjectsReturned:[226,2,1,""],at_repeat:[226,3,1,""],at_script_creation:[226,3,1,""],is_valid:[226,3,1,""],path:[226,4,1,""],typename:[226,4,1,""]},"evennia.contrib.tutorial_examples.red_button_scripts.CloseLidEvent":{DoesNotExist:[226,2,1,""],MultipleObjectsReturned:[226,2,1,""],at_repeat:[226,3,1,""],at_script_creation:[226,3,1,""],is_valid:[226,3,1,""],path:[226,4,1,""],typename:[226,4,1,""]},"evennia.contrib.tutorial_examples.red_button_scripts.ClosedLidState":{DoesNotExist:[226,2,1,""],MultipleObjectsReturned:[226,2,1,""],at_script_creation:[226,3,1,""],at_start:[226,3,1,""],at_stop:[226,3,1,""],is_valid:[226,3,1,""],path:[226,4,1,""],typename:[226,4,1,""]},"evennia.contrib.tutorial_examples.red_button_scripts.DeactivateButtonEvent":{DoesNotExist:[226,2,1,""],MultipleObjectsReturned:[226,2,1,""],at_repeat:[226,3,1,""],at_script_creation:[226,3,1,""],at_start:[226,3,1,""],path:[226,4,1,""],typename:[226,4,1,""]},"evennia.contrib.tutorial_examples.red_button_scripts.OpenLidState":{DoesNotExist:[226,2,1,""],MultipleObjectsReturned:[226,2,1,""],at_script_creation:[226,3,1,""],at_start:[226,3,1,""],at_stop:[226,3,1,""],is_valid:[226,3,1,""],path:[226,4,1,""],typename:[226,4,1,""]},"evennia.contrib.tutorial_examples.tests":{TestBodyFunctions:[227,1,1,""]},"evennia.contrib.tutorial_examples.tests.TestBodyFunctions":{script_typeclass:[227,4,1,""],setUp:[227,3,1,""],tearDown:[227,3,1,""],test_at_repeat:[227,3,1,""],test_send_random_message:[227,3,1,""]},"evennia.contrib.tutorial_world":{mob:[229,0,0,"-"],objects:[230,0,0,"-"],rooms:[231,0,0,"-"]},"evennia.contrib.tutorial_world.mob":{CmdMobOnOff:[229,1,1,""],Mob:[229,1,1,""],MobCmdSet:[229,1,1,""]},"evennia.contrib.tutorial_world.mob.CmdMobOnOff":{aliases:[229,4,1,""],func:[229,3,1,""],help_category:[229,4,1,""],key:[229,4,1,""],lock_storage:[229,4,1,""],locks:[229,4,1,""],search_index_entry:[229,4,1,""]},"evennia.contrib.tutorial_world.mob.Mob":{DoesNotExist:[229,2,1,""],MultipleObjectsReturned:[229,2,1,""],at_hit:[229,3,1,""],at_init:[229,3,1,""],at_new_arrival:[229,3,1,""],at_object_creation:[229,3,1,""],do_attack:[229,3,1,""],do_hunting:[229,3,1,""],do_patrol:[229,3,1,""],path:[229,4,1,""],set_alive:[229,3,1,""],set_dead:[229,3,1,""],start_attacking:[229,3,1,""],start_hunting:[229,3,1,""],start_idle:[229,3,1,""],start_patrolling:[229,3,1,""],typename:[229,4,1,""]},"evennia.contrib.tutorial_world.mob.MobCmdSet":{at_cmdset_creation:[229,3,1,""],path:[229,4,1,""]},"evennia.contrib.tutorial_world.objects":{CmdAttack:[230,1,1,""],CmdClimb:[230,1,1,""],CmdGetWeapon:[230,1,1,""],CmdLight:[230,1,1,""],CmdPressButton:[230,1,1,""],CmdRead:[230,1,1,""],CmdSetClimbable:[230,1,1,""],CmdSetCrumblingWall:[230,1,1,""],CmdSetLight:[230,1,1,""],CmdSetReadable:[230,1,1,""],CmdSetWeapon:[230,1,1,""],CmdSetWeaponRack:[230,1,1,""],CmdShiftRoot:[230,1,1,""],CrumblingWall:[230,1,1,""],LightSource:[230,1,1,""],Obelisk:[230,1,1,""],TutorialClimbable:[230,1,1,""],TutorialObject:[230,1,1,""],TutorialReadable:[230,1,1,""],TutorialWeapon:[230,1,1,""],TutorialWeaponRack:[230,1,1,""]},"evennia.contrib.tutorial_world.objects.CmdAttack":{aliases:[230,4,1,""],func:[230,3,1,""],help_category:[230,4,1,""],key:[230,4,1,""],lock_storage:[230,4,1,""],locks:[230,4,1,""],search_index_entry:[230,4,1,""]},"evennia.contrib.tutorial_world.objects.CmdClimb":{aliases:[230,4,1,""],func:[230,3,1,""],help_category:[230,4,1,""],key:[230,4,1,""],lock_storage:[230,4,1,""],locks:[230,4,1,""],search_index_entry:[230,4,1,""]},"evennia.contrib.tutorial_world.objects.CmdGetWeapon":{aliases:[230,4,1,""],func:[230,3,1,""],help_category:[230,4,1,""],key:[230,4,1,""],lock_storage:[230,4,1,""],locks:[230,4,1,""],search_index_entry:[230,4,1,""]},"evennia.contrib.tutorial_world.objects.CmdLight":{aliases:[230,4,1,""],func:[230,3,1,""],help_category:[230,4,1,""],key:[230,4,1,""],lock_storage:[230,4,1,""],locks:[230,4,1,""],search_index_entry:[230,4,1,""]},"evennia.contrib.tutorial_world.objects.CmdPressButton":{aliases:[230,4,1,""],func:[230,3,1,""],help_category:[230,4,1,""],key:[230,4,1,""],lock_storage:[230,4,1,""],locks:[230,4,1,""],search_index_entry:[230,4,1,""]},"evennia.contrib.tutorial_world.objects.CmdRead":{aliases:[230,4,1,""],func:[230,3,1,""],help_category:[230,4,1,""],key:[230,4,1,""],lock_storage:[230,4,1,""],locks:[230,4,1,""],search_index_entry:[230,4,1,""]},"evennia.contrib.tutorial_world.objects.CmdSetClimbable":{at_cmdset_creation:[230,3,1,""],path:[230,4,1,""]},"evennia.contrib.tutorial_world.objects.CmdSetCrumblingWall":{at_cmdset_creation:[230,3,1,""],key:[230,4,1,""],path:[230,4,1,""],priority:[230,4,1,""]},"evennia.contrib.tutorial_world.objects.CmdSetLight":{at_cmdset_creation:[230,3,1,""],key:[230,4,1,""],path:[230,4,1,""],priority:[230,4,1,""]},"evennia.contrib.tutorial_world.objects.CmdSetReadable":{at_cmdset_creation:[230,3,1,""],path:[230,4,1,""]},"evennia.contrib.tutorial_world.objects.CmdSetWeapon":{at_cmdset_creation:[230,3,1,""],path:[230,4,1,""]},"evennia.contrib.tutorial_world.objects.CmdSetWeaponRack":{at_cmdset_creation:[230,3,1,""],key:[230,4,1,""],path:[230,4,1,""]},"evennia.contrib.tutorial_world.objects.CmdShiftRoot":{aliases:[230,4,1,""],func:[230,3,1,""],help_category:[230,4,1,""],key:[230,4,1,""],lock_storage:[230,4,1,""],locks:[230,4,1,""],parse:[230,3,1,""],search_index_entry:[230,4,1,""]},"evennia.contrib.tutorial_world.objects.CrumblingWall":{DoesNotExist:[230,2,1,""],MultipleObjectsReturned:[230,2,1,""],at_after_traverse:[230,3,1,""],at_failed_traverse:[230,3,1,""],at_init:[230,3,1,""],at_object_creation:[230,3,1,""],open_wall:[230,3,1,""],path:[230,4,1,""],reset:[230,3,1,""],return_appearance:[230,3,1,""],typename:[230,4,1,""]},"evennia.contrib.tutorial_world.objects.LightSource":{DoesNotExist:[230,2,1,""],MultipleObjectsReturned:[230,2,1,""],at_init:[230,3,1,""],at_object_creation:[230,3,1,""],light:[230,3,1,""],path:[230,4,1,""],typename:[230,4,1,""]},"evennia.contrib.tutorial_world.objects.Obelisk":{DoesNotExist:[230,2,1,""],MultipleObjectsReturned:[230,2,1,""],at_object_creation:[230,3,1,""],path:[230,4,1,""],return_appearance:[230,3,1,""],typename:[230,4,1,""]},"evennia.contrib.tutorial_world.objects.TutorialClimbable":{DoesNotExist:[230,2,1,""],MultipleObjectsReturned:[230,2,1,""],at_object_creation:[230,3,1,""],path:[230,4,1,""],typename:[230,4,1,""]},"evennia.contrib.tutorial_world.objects.TutorialObject":{DoesNotExist:[230,2,1,""],MultipleObjectsReturned:[230,2,1,""],at_object_creation:[230,3,1,""],path:[230,4,1,""],reset:[230,3,1,""],typename:[230,4,1,""]},"evennia.contrib.tutorial_world.objects.TutorialReadable":{DoesNotExist:[230,2,1,""],MultipleObjectsReturned:[230,2,1,""],at_object_creation:[230,3,1,""],path:[230,4,1,""],typename:[230,4,1,""]},"evennia.contrib.tutorial_world.objects.TutorialWeapon":{DoesNotExist:[230,2,1,""],MultipleObjectsReturned:[230,2,1,""],at_object_creation:[230,3,1,""],path:[230,4,1,""],reset:[230,3,1,""],typename:[230,4,1,""]},"evennia.contrib.tutorial_world.objects.TutorialWeaponRack":{DoesNotExist:[230,2,1,""],MultipleObjectsReturned:[230,2,1,""],at_object_creation:[230,3,1,""],path:[230,4,1,""],produce_weapon:[230,3,1,""],typename:[230,4,1,""]},"evennia.contrib.tutorial_world.rooms":{BridgeCmdSet:[231,1,1,""],BridgeRoom:[231,1,1,""],CmdBridgeHelp:[231,1,1,""],CmdDarkHelp:[231,1,1,""],CmdDarkNoMatch:[231,1,1,""],CmdEast:[231,1,1,""],CmdLookBridge:[231,1,1,""],CmdLookDark:[231,1,1,""],CmdTutorial:[231,1,1,""],CmdTutorialLook:[231,1,1,""],CmdTutorialSetDetail:[231,1,1,""],CmdWest:[231,1,1,""],DarkCmdSet:[231,1,1,""],DarkRoom:[231,1,1,""],IntroRoom:[231,1,1,""],OutroRoom:[231,1,1,""],TeleportRoom:[231,1,1,""],TutorialRoom:[231,1,1,""],TutorialRoomCmdSet:[231,1,1,""],WeatherRoom:[231,1,1,""]},"evennia.contrib.tutorial_world.rooms.BridgeCmdSet":{at_cmdset_creation:[231,3,1,""],key:[231,4,1,""],path:[231,4,1,""],priority:[231,4,1,""]},"evennia.contrib.tutorial_world.rooms.BridgeRoom":{DoesNotExist:[231,2,1,""],MultipleObjectsReturned:[231,2,1,""],at_object_creation:[231,3,1,""],at_object_leave:[231,3,1,""],at_object_receive:[231,3,1,""],path:[231,4,1,""],typename:[231,4,1,""],update_weather:[231,3,1,""]},"evennia.contrib.tutorial_world.rooms.CmdBridgeHelp":{aliases:[231,4,1,""],func:[231,3,1,""],help_category:[231,4,1,""],key:[231,4,1,""],lock_storage:[231,4,1,""],locks:[231,4,1,""],search_index_entry:[231,4,1,""]},"evennia.contrib.tutorial_world.rooms.CmdDarkHelp":{aliases:[231,4,1,""],func:[231,3,1,""],help_category:[231,4,1,""],key:[231,4,1,""],lock_storage:[231,4,1,""],locks:[231,4,1,""],search_index_entry:[231,4,1,""]},"evennia.contrib.tutorial_world.rooms.CmdDarkNoMatch":{aliases:[231,4,1,""],func:[231,3,1,""],help_category:[231,4,1,""],key:[231,4,1,""],lock_storage:[231,4,1,""],locks:[231,4,1,""],search_index_entry:[231,4,1,""]},"evennia.contrib.tutorial_world.rooms.CmdEast":{aliases:[231,4,1,""],func:[231,3,1,""],help_category:[231,4,1,""],key:[231,4,1,""],lock_storage:[231,4,1,""],locks:[231,4,1,""],search_index_entry:[231,4,1,""]},"evennia.contrib.tutorial_world.rooms.CmdLookBridge":{aliases:[231,4,1,""],func:[231,3,1,""],help_category:[231,4,1,""],key:[231,4,1,""],lock_storage:[231,4,1,""],locks:[231,4,1,""],search_index_entry:[231,4,1,""]},"evennia.contrib.tutorial_world.rooms.CmdLookDark":{aliases:[231,4,1,""],func:[231,3,1,""],help_category:[231,4,1,""],key:[231,4,1,""],lock_storage:[231,4,1,""],locks:[231,4,1,""],search_index_entry:[231,4,1,""]},"evennia.contrib.tutorial_world.rooms.CmdTutorial":{aliases:[231,4,1,""],func:[231,3,1,""],help_category:[231,4,1,""],key:[231,4,1,""],lock_storage:[231,4,1,""],locks:[231,4,1,""],search_index_entry:[231,4,1,""]},"evennia.contrib.tutorial_world.rooms.CmdTutorialLook":{aliases:[231,4,1,""],func:[231,3,1,""],help_category:[231,4,1,""],key:[231,4,1,""],lock_storage:[231,4,1,""],search_index_entry:[231,4,1,""]},"evennia.contrib.tutorial_world.rooms.CmdTutorialSetDetail":{aliases:[231,4,1,""],func:[231,3,1,""],help_category:[231,4,1,""],key:[231,4,1,""],lock_storage:[231,4,1,""],locks:[231,4,1,""],search_index_entry:[231,4,1,""]},"evennia.contrib.tutorial_world.rooms.CmdWest":{aliases:[231,4,1,""],func:[231,3,1,""],help_category:[231,4,1,""],key:[231,4,1,""],lock_storage:[231,4,1,""],locks:[231,4,1,""],search_index_entry:[231,4,1,""]},"evennia.contrib.tutorial_world.rooms.DarkCmdSet":{at_cmdset_creation:[231,3,1,""],key:[231,4,1,""],mergetype:[231,4,1,""],path:[231,4,1,""],priority:[231,4,1,""]},"evennia.contrib.tutorial_world.rooms.DarkRoom":{DoesNotExist:[231,2,1,""],MultipleObjectsReturned:[231,2,1,""],at_init:[231,3,1,""],at_object_creation:[231,3,1,""],at_object_leave:[231,3,1,""],at_object_receive:[231,3,1,""],check_light_state:[231,3,1,""],path:[231,4,1,""],typename:[231,4,1,""]},"evennia.contrib.tutorial_world.rooms.IntroRoom":{DoesNotExist:[231,2,1,""],MultipleObjectsReturned:[231,2,1,""],at_object_creation:[231,3,1,""],at_object_receive:[231,3,1,""],path:[231,4,1,""],typename:[231,4,1,""]},"evennia.contrib.tutorial_world.rooms.OutroRoom":{DoesNotExist:[231,2,1,""],MultipleObjectsReturned:[231,2,1,""],at_object_creation:[231,3,1,""],at_object_receive:[231,3,1,""],path:[231,4,1,""],typename:[231,4,1,""]},"evennia.contrib.tutorial_world.rooms.TeleportRoom":{DoesNotExist:[231,2,1,""],MultipleObjectsReturned:[231,2,1,""],at_object_creation:[231,3,1,""],at_object_receive:[231,3,1,""],path:[231,4,1,""],typename:[231,4,1,""]},"evennia.contrib.tutorial_world.rooms.TutorialRoom":{DoesNotExist:[231,2,1,""],MultipleObjectsReturned:[231,2,1,""],at_object_creation:[231,3,1,""],at_object_receive:[231,3,1,""],path:[231,4,1,""],return_detail:[231,3,1,""],set_detail:[231,3,1,""],typename:[231,4,1,""]},"evennia.contrib.tutorial_world.rooms.TutorialRoomCmdSet":{at_cmdset_creation:[231,3,1,""],key:[231,4,1,""],path:[231,4,1,""],priority:[231,4,1,""]},"evennia.contrib.tutorial_world.rooms.WeatherRoom":{DoesNotExist:[231,2,1,""],MultipleObjectsReturned:[231,2,1,""],at_object_creation:[231,3,1,""],path:[231,4,1,""],typename:[231,4,1,""],update_weather:[231,3,1,""]},"evennia.contrib.unixcommand":{HelpAction:[232,1,1,""],ParseError:[232,2,1,""],UnixCommand:[232,1,1,""],UnixCommandParser:[232,1,1,""]},"evennia.contrib.unixcommand.UnixCommand":{__init__:[232,3,1,""],aliases:[232,4,1,""],func:[232,3,1,""],get_help:[232,3,1,""],help_category:[232,4,1,""],init_parser:[232,3,1,""],key:[232,4,1,""],lock_storage:[232,4,1,""],parse:[232,3,1,""],search_index_entry:[232,4,1,""]},"evennia.contrib.unixcommand.UnixCommandParser":{__init__:[232,3,1,""],format_help:[232,3,1,""],format_usage:[232,3,1,""],print_help:[232,3,1,""],print_usage:[232,3,1,""]},"evennia.contrib.wilderness":{WildernessExit:[233,1,1,""],WildernessMapProvider:[233,1,1,""],WildernessRoom:[233,1,1,""],WildernessScript:[233,1,1,""],create_wilderness:[233,5,1,""],enter_wilderness:[233,5,1,""],get_new_coordinates:[233,5,1,""]},"evennia.contrib.wilderness.WildernessExit":{DoesNotExist:[233,2,1,""],MultipleObjectsReturned:[233,2,1,""],at_traverse:[233,3,1,""],at_traverse_coordinates:[233,3,1,""],mapprovider:[233,3,1,""],path:[233,4,1,""],typename:[233,4,1,""],wilderness:[233,3,1,""]},"evennia.contrib.wilderness.WildernessMapProvider":{at_prepare_room:[233,3,1,""],exit_typeclass:[233,4,1,""],get_location_name:[233,3,1,""],is_valid_coordinates:[233,3,1,""],room_typeclass:[233,4,1,""]},"evennia.contrib.wilderness.WildernessRoom":{DoesNotExist:[233,2,1,""],MultipleObjectsReturned:[233,2,1,""],at_object_leave:[233,3,1,""],at_object_receive:[233,3,1,""],coordinates:[233,3,1,""],get_display_name:[233,3,1,""],location_name:[233,3,1,""],path:[233,4,1,""],set_active_coordinates:[233,3,1,""],typename:[233,4,1,""],wilderness:[233,3,1,""]},"evennia.contrib.wilderness.WildernessScript":{DoesNotExist:[233,2,1,""],MultipleObjectsReturned:[233,2,1,""],at_after_object_leave:[233,3,1,""],at_script_creation:[233,3,1,""],at_start:[233,3,1,""],get_obj_coordinates:[233,3,1,""],get_objs_at_coordinates:[233,3,1,""],is_valid_coordinates:[233,3,1,""],itemcoordinates:[233,3,1,""],mapprovider:[233,3,1,""],move_obj:[233,3,1,""],path:[233,4,1,""],typename:[233,4,1,""]},"evennia.help":{admin:[235,0,0,"-"],manager:[236,0,0,"-"],models:[237,0,0,"-"]},"evennia.help.admin":{HelpEntryAdmin:[235,1,1,""],HelpEntryForm:[235,1,1,""],HelpTagInline:[235,1,1,""]},"evennia.help.admin.HelpEntryAdmin":{fieldsets:[235,4,1,""],form:[235,4,1,""],inlines:[235,4,1,""],list_display:[235,4,1,""],list_display_links:[235,4,1,""],list_select_related:[235,4,1,""],media:[235,3,1,""],ordering:[235,4,1,""],save_as:[235,4,1,""],save_on_top:[235,4,1,""],search_fields:[235,4,1,""]},"evennia.help.admin.HelpEntryForm":{Meta:[235,1,1,""],base_fields:[235,4,1,""],declared_fields:[235,4,1,""],media:[235,3,1,""]},"evennia.help.admin.HelpEntryForm.Meta":{fields:[235,4,1,""],model:[235,4,1,""]},"evennia.help.admin.HelpTagInline":{media:[235,3,1,""],model:[235,4,1,""],related_field:[235,4,1,""]},"evennia.help.manager":{HelpEntryManager:[236,1,1,""]},"evennia.help.manager.HelpEntryManager":{all_to_category:[236,3,1,""],find_apropos:[236,3,1,""],find_topicmatch:[236,3,1,""],find_topics_with_category:[236,3,1,""],find_topicsuggestions:[236,3,1,""],get_all_categories:[236,3,1,""],get_all_topics:[236,3,1,""],search_help:[236,3,1,""]},"evennia.help.models":{HelpEntry:[237,1,1,""]},"evennia.help.models.HelpEntry":{DoesNotExist:[237,2,1,""],MultipleObjectsReturned:[237,2,1,""],access:[237,3,1,""],aliases:[237,4,1,""],db_entrytext:[237,4,1,""],db_help_category:[237,4,1,""],db_key:[237,4,1,""],db_lock_storage:[237,4,1,""],db_staff_only:[237,4,1,""],db_tags:[237,4,1,""],entrytext:[237,3,1,""],get_absolute_url:[237,3,1,""],help_category:[237,3,1,""],id:[237,4,1,""],key:[237,3,1,""],lock_storage:[237,3,1,""],locks:[237,4,1,""],objects:[237,4,1,""],path:[237,4,1,""],search_index_entry:[237,3,1,""],staff_only:[237,3,1,""],tags:[237,4,1,""],typename:[237,4,1,""],web_get_admin_url:[237,3,1,""],web_get_create_url:[237,3,1,""],web_get_delete_url:[237,3,1,""],web_get_detail_url:[237,3,1,""],web_get_update_url:[237,3,1,""]},"evennia.locks":{lockfuncs:[239,0,0,"-"],lockhandler:[240,0,0,"-"]},"evennia.locks.lockfuncs":{"false":[239,5,1,""],"true":[239,5,1,""],all:[239,5,1,""],attr:[239,5,1,""],attr_eq:[239,5,1,""],attr_ge:[239,5,1,""],attr_gt:[239,5,1,""],attr_le:[239,5,1,""],attr_lt:[239,5,1,""],attr_ne:[239,5,1,""],dbref:[239,5,1,""],has_account:[239,5,1,""],holds:[239,5,1,""],id:[239,5,1,""],inside:[239,5,1,""],inside_rec:[239,5,1,""],locattr:[239,5,1,""],none:[239,5,1,""],objattr:[239,5,1,""],objlocattr:[239,5,1,""],objtag:[239,5,1,""],pdbref:[239,5,1,""],perm:[239,5,1,""],perm_above:[239,5,1,""],pid:[239,5,1,""],pperm:[239,5,1,""],pperm_above:[239,5,1,""],self:[239,5,1,""],serversetting:[239,5,1,""],superuser:[239,5,1,""],tag:[239,5,1,""]},"evennia.locks.lockhandler":{LockException:[240,2,1,""],LockHandler:[240,1,1,""]},"evennia.locks.lockhandler.LockHandler":{"delete":[240,3,1,""],__init__:[240,3,1,""],add:[240,3,1,""],all:[240,3,1,""],append:[240,3,1,""],cache_lock_bypass:[240,3,1,""],check:[240,3,1,""],check_lockstring:[240,3,1,""],clear:[240,3,1,""],get:[240,3,1,""],remove:[240,3,1,""],replace:[240,3,1,""],reset:[240,3,1,""],validate:[240,3,1,""]},"evennia.objects":{admin:[242,0,0,"-"],manager:[243,0,0,"-"],models:[244,0,0,"-"],objects:[245,0,0,"-"]},"evennia.objects.admin":{ObjectAttributeInline:[242,1,1,""],ObjectCreateForm:[242,1,1,""],ObjectDBAdmin:[242,1,1,""],ObjectEditForm:[242,1,1,""],ObjectTagInline:[242,1,1,""]},"evennia.objects.admin.ObjectAttributeInline":{media:[242,3,1,""],model:[242,4,1,""],related_field:[242,4,1,""]},"evennia.objects.admin.ObjectCreateForm":{Meta:[242,1,1,""],base_fields:[242,4,1,""],declared_fields:[242,4,1,""],media:[242,3,1,""],raw_id_fields:[242,4,1,""]},"evennia.objects.admin.ObjectCreateForm.Meta":{fields:[242,4,1,""],model:[242,4,1,""]},"evennia.objects.admin.ObjectDBAdmin":{add_fieldsets:[242,4,1,""],add_form:[242,4,1,""],fieldsets:[242,4,1,""],form:[242,4,1,""],get_fieldsets:[242,3,1,""],get_form:[242,3,1,""],inlines:[242,4,1,""],list_display:[242,4,1,""],list_display_links:[242,4,1,""],list_filter:[242,4,1,""],list_select_related:[242,4,1,""],media:[242,3,1,""],ordering:[242,4,1,""],raw_id_fields:[242,4,1,""],response_add:[242,3,1,""],save_as:[242,4,1,""],save_model:[242,3,1,""],save_on_top:[242,4,1,""],search_fields:[242,4,1,""]},"evennia.objects.admin.ObjectEditForm":{Meta:[242,1,1,""],base_fields:[242,4,1,""],declared_fields:[242,4,1,""],media:[242,3,1,""]},"evennia.objects.admin.ObjectEditForm.Meta":{fields:[242,4,1,""]},"evennia.objects.admin.ObjectTagInline":{media:[242,3,1,""],model:[242,4,1,""],related_field:[242,4,1,""]},"evennia.objects.manager":{ObjectManager:[243,1,1,""]},"evennia.objects.models":{ContentsHandler:[244,1,1,""],ObjectDB:[244,1,1,""]},"evennia.objects.models.ContentsHandler":{__init__:[244,3,1,""],add:[244,3,1,""],clear:[244,3,1,""],get:[244,3,1,""],init:[244,3,1,""],load:[244,3,1,""],remove:[244,3,1,""]},"evennia.objects.models.ObjectDB":{DoesNotExist:[244,2,1,""],MultipleObjectsReturned:[244,2,1,""],account:[244,3,1,""],at_db_location_postsave:[244,3,1,""],cmdset_storage:[244,3,1,""],contents_cache:[244,4,1,""],db_account:[244,4,1,""],db_account_id:[244,4,1,""],db_attributes:[244,4,1,""],db_cmdset_storage:[244,4,1,""],db_destination:[244,4,1,""],db_destination_id:[244,4,1,""],db_home:[244,4,1,""],db_home_id:[244,4,1,""],db_location:[244,4,1,""],db_location_id:[244,4,1,""],db_sessid:[244,4,1,""],db_tags:[244,4,1,""],destination:[244,3,1,""],destinations_set:[244,4,1,""],get_next_by_db_date_created:[244,3,1,""],get_previous_by_db_date_created:[244,3,1,""],hide_from_objects_set:[244,4,1,""],home:[244,3,1,""],homes_set:[244,4,1,""],id:[244,4,1,""],location:[244,3,1,""],locations_set:[244,4,1,""],object_subscription_set:[244,4,1,""],objects:[244,4,1,""],path:[244,4,1,""],receiver_object_set:[244,4,1,""],scriptdb_set:[244,4,1,""],sender_object_set:[244,4,1,""],sessid:[244,3,1,""],typename:[244,4,1,""]},"evennia.objects.objects":{DefaultCharacter:[245,1,1,""],DefaultExit:[245,1,1,""],DefaultObject:[245,1,1,""],DefaultRoom:[245,1,1,""],ExitCommand:[245,1,1,""],ObjectSessionHandler:[245,1,1,""]},"evennia.objects.objects.DefaultCharacter":{DoesNotExist:[245,2,1,""],MultipleObjectsReturned:[245,2,1,""],at_after_move:[245,3,1,""],at_post_puppet:[245,3,1,""],at_post_unpuppet:[245,3,1,""],at_pre_puppet:[245,3,1,""],basetype_setup:[245,3,1,""],connection_time:[245,3,1,""],create:[245,3,1,""],idle_time:[245,3,1,""],lockstring:[245,4,1,""],normalize_name:[245,3,1,""],path:[245,4,1,""],typename:[245,4,1,""],validate_name:[245,3,1,""]},"evennia.objects.objects.DefaultExit":{DoesNotExist:[245,2,1,""],MultipleObjectsReturned:[245,2,1,""],at_cmdset_get:[245,3,1,""],at_failed_traverse:[245,3,1,""],at_init:[245,3,1,""],at_traverse:[245,3,1,""],basetype_setup:[245,3,1,""],create:[245,3,1,""],create_exit_cmdset:[245,3,1,""],exit_command:[245,4,1,""],lockstring:[245,4,1,""],path:[245,4,1,""],priority:[245,4,1,""],typename:[245,4,1,""]},"evennia.objects.objects.DefaultObject":{"delete":[245,3,1,""],DoesNotExist:[245,2,1,""],MultipleObjectsReturned:[245,2,1,""],access:[245,3,1,""],announce_move_from:[245,3,1,""],announce_move_to:[245,3,1,""],at_access:[245,3,1,""],at_after_move:[245,3,1,""],at_after_traverse:[245,3,1,""],at_before_drop:[245,3,1,""],at_before_get:[245,3,1,""],at_before_give:[245,3,1,""],at_before_move:[245,3,1,""],at_before_say:[245,3,1,""],at_cmdset_get:[245,3,1,""],at_desc:[245,3,1,""],at_drop:[245,3,1,""],at_failed_traverse:[245,3,1,""],at_first_save:[245,3,1,""],at_get:[245,3,1,""],at_give:[245,3,1,""],at_init:[245,3,1,""],at_look:[245,3,1,""],at_msg_receive:[245,3,1,""],at_msg_send:[245,3,1,""],at_object_creation:[245,3,1,""],at_object_delete:[245,3,1,""],at_object_leave:[245,3,1,""],at_object_post_copy:[245,3,1,""],at_object_receive:[245,3,1,""],at_post_puppet:[245,3,1,""],at_post_unpuppet:[245,3,1,""],at_pre_puppet:[245,3,1,""],at_pre_unpuppet:[245,3,1,""],at_say:[245,3,1,""],at_server_reload:[245,3,1,""],at_server_shutdown:[245,3,1,""],at_traverse:[245,3,1,""],basetype_posthook_setup:[245,3,1,""],basetype_setup:[245,3,1,""],clear_contents:[245,3,1,""],clear_exits:[245,3,1,""],cmdset:[245,4,1,""],contents:[245,3,1,""],contents_get:[245,3,1,""],contents_set:[245,3,1,""],copy:[245,3,1,""],create:[245,3,1,""],execute_cmd:[245,3,1,""],exits:[245,3,1,""],for_contents:[245,3,1,""],get_display_name:[245,3,1,""],get_numbered_name:[245,3,1,""],has_account:[245,3,1,""],is_connected:[245,3,1,""],is_superuser:[245,3,1,""],lockstring:[245,4,1,""],move_to:[245,3,1,""],msg:[245,3,1,""],msg_contents:[245,3,1,""],nicks:[245,4,1,""],objects:[245,4,1,""],path:[245,4,1,""],return_appearance:[245,3,1,""],scripts:[245,4,1,""],search:[245,3,1,""],search_account:[245,3,1,""],sessions:[245,4,1,""],typename:[245,4,1,""]},"evennia.objects.objects.DefaultRoom":{DoesNotExist:[245,2,1,""],MultipleObjectsReturned:[245,2,1,""],basetype_setup:[245,3,1,""],create:[245,3,1,""],lockstring:[245,4,1,""],path:[245,4,1,""],typename:[245,4,1,""]},"evennia.objects.objects.ExitCommand":{aliases:[245,4,1,""],func:[245,3,1,""],get_extra_info:[245,3,1,""],help_category:[245,4,1,""],key:[245,4,1,""],lock_storage:[245,4,1,""],obj:[245,4,1,""],search_index_entry:[245,4,1,""]},"evennia.objects.objects.ObjectSessionHandler":{__init__:[245,3,1,""],add:[245,3,1,""],all:[245,3,1,""],clear:[245,3,1,""],count:[245,3,1,""],get:[245,3,1,""],remove:[245,3,1,""]},"evennia.prototypes":{menus:[247,0,0,"-"],protfuncs:[248,0,0,"-"],prototypes:[249,0,0,"-"],spawner:[250,0,0,"-"]},"evennia.prototypes.menus":{OLCMenu:[247,1,1,""],node_apply_diff:[247,5,1,""],node_destination:[247,5,1,""],node_examine_entity:[247,5,1,""],node_home:[247,5,1,""],node_index:[247,5,1,""],node_key:[247,5,1,""],node_location:[247,5,1,""],node_prototype_desc:[247,5,1,""],node_prototype_key:[247,5,1,""],node_prototype_save:[247,5,1,""],node_prototype_spawn:[247,5,1,""],node_validate_prototype:[247,5,1,""],start_olc:[247,5,1,""]},"evennia.prototypes.menus.OLCMenu":{display_helptext:[247,3,1,""],helptext_formatter:[247,3,1,""],nodetext_formatter:[247,3,1,""],options_formatter:[247,3,1,""]},"evennia.prototypes.protfuncs":{add:[248,5,1,""],base_random:[248,5,1,""],center_justify:[248,5,1,""],choice:[248,5,1,""],dbref:[248,5,1,""],div:[248,5,1,""],eval:[248,5,1,""],full_justify:[248,5,1,""],left_justify:[248,5,1,""],mult:[248,5,1,""],obj:[248,5,1,""],objlist:[248,5,1,""],protkey:[248,5,1,""],randint:[248,5,1,""],random:[248,5,1,""],right_justify:[248,5,1,""],sub:[248,5,1,""],toint:[248,5,1,""]},"evennia.prototypes.prototypes":{DbPrototype:[249,1,1,""],PermissionError:[249,2,1,""],ValidationError:[249,2,1,""],check_permission:[249,5,1,""],create_prototype:[249,5,1,""],delete_prototype:[249,5,1,""],format_available_protfuncs:[249,5,1,""],homogenize_prototype:[249,5,1,""],init_spawn_value:[249,5,1,""],list_prototypes:[249,5,1,""],protfunc_parser:[249,5,1,""],prototype_to_str:[249,5,1,""],save_prototype:[249,5,1,""],search_objects_with_prototype:[249,5,1,""],search_prototype:[249,5,1,""],validate_prototype:[249,5,1,""],value_to_obj:[249,5,1,""],value_to_obj_or_any:[249,5,1,""]},"evennia.prototypes.prototypes.DbPrototype":{DoesNotExist:[249,2,1,""],MultipleObjectsReturned:[249,2,1,""],at_script_creation:[249,3,1,""],path:[249,4,1,""],prototype:[249,3,1,""],typename:[249,4,1,""]},"evennia.prototypes.spawner":{Unset:[250,1,1,""],batch_create_object:[250,5,1,""],batch_update_objects_with_prototype:[250,5,1,""],flatten_diff:[250,5,1,""],flatten_prototype:[250,5,1,""],format_diff:[250,5,1,""],prototype_diff:[250,5,1,""],prototype_diff_from_object:[250,5,1,""],prototype_from_object:[250,5,1,""],spawn:[250,5,1,""]},"evennia.scripts":{admin:[252,0,0,"-"],manager:[253,0,0,"-"],models:[254,0,0,"-"],monitorhandler:[255,0,0,"-"],scripthandler:[256,0,0,"-"],scripts:[257,0,0,"-"],taskhandler:[258,0,0,"-"],tickerhandler:[259,0,0,"-"]},"evennia.scripts.admin":{ScriptAttributeInline:[252,1,1,""],ScriptDBAdmin:[252,1,1,""],ScriptTagInline:[252,1,1,""]},"evennia.scripts.admin.ScriptAttributeInline":{media:[252,3,1,""],model:[252,4,1,""],related_field:[252,4,1,""]},"evennia.scripts.admin.ScriptDBAdmin":{fieldsets:[252,4,1,""],inlines:[252,4,1,""],list_display:[252,4,1,""],list_display_links:[252,4,1,""],list_select_related:[252,4,1,""],media:[252,3,1,""],ordering:[252,4,1,""],raw_id_fields:[252,4,1,""],save_as:[252,4,1,""],save_model:[252,3,1,""],save_on_top:[252,4,1,""],search_fields:[252,4,1,""]},"evennia.scripts.admin.ScriptTagInline":{media:[252,3,1,""],model:[252,4,1,""],related_field:[252,4,1,""]},"evennia.scripts.manager":{ScriptManager:[253,1,1,""]},"evennia.scripts.models":{ScriptDB:[254,1,1,""]},"evennia.scripts.models.ScriptDB":{DoesNotExist:[254,2,1,""],MultipleObjectsReturned:[254,2,1,""],account:[254,3,1,""],db_account:[254,4,1,""],db_account_id:[254,4,1,""],db_attributes:[254,4,1,""],db_desc:[254,4,1,""],db_interval:[254,4,1,""],db_is_active:[254,4,1,""],db_obj:[254,4,1,""],db_obj_id:[254,4,1,""],db_persistent:[254,4,1,""],db_repeats:[254,4,1,""],db_start_delay:[254,4,1,""],db_tags:[254,4,1,""],desc:[254,3,1,""],get_next_by_db_date_created:[254,3,1,""],get_previous_by_db_date_created:[254,3,1,""],id:[254,4,1,""],interval:[254,3,1,""],is_active:[254,3,1,""],obj:[254,3,1,""],object:[254,3,1,""],objects:[254,4,1,""],path:[254,4,1,""],persistent:[254,3,1,""],receiver_script_set:[254,4,1,""],repeats:[254,3,1,""],sender_script_set:[254,4,1,""],start_delay:[254,3,1,""],typename:[254,4,1,""]},"evennia.scripts.monitorhandler":{MonitorHandler:[255,1,1,""]},"evennia.scripts.monitorhandler.MonitorHandler":{__init__:[255,3,1,""],add:[255,3,1,""],all:[255,3,1,""],at_update:[255,3,1,""],clear:[255,3,1,""],remove:[255,3,1,""],restore:[255,3,1,""],save:[255,3,1,""]},"evennia.scripts.scripthandler":{ScriptHandler:[256,1,1,""]},"evennia.scripts.scripthandler.ScriptHandler":{"delete":[256,3,1,""],__init__:[256,3,1,""],add:[256,3,1,""],all:[256,3,1,""],get:[256,3,1,""],start:[256,3,1,""],stop:[256,3,1,""],validate:[256,3,1,""]},"evennia.scripts.scripts":{DefaultScript:[257,1,1,""],DoNothing:[257,1,1,""],Store:[257,1,1,""]},"evennia.scripts.scripts.DefaultScript":{DoesNotExist:[257,2,1,""],MultipleObjectsReturned:[257,2,1,""],at_idmapper_flush:[257,3,1,""],at_repeat:[257,3,1,""],at_script_creation:[257,3,1,""],at_server_reload:[257,3,1,""],at_server_shutdown:[257,3,1,""],at_start:[257,3,1,""],at_stop:[257,3,1,""],create:[257,3,1,""],force_repeat:[257,3,1,""],is_valid:[257,3,1,""],path:[257,4,1,""],pause:[257,3,1,""],remaining_repeats:[257,3,1,""],reset_callcount:[257,3,1,""],restart:[257,3,1,""],start:[257,3,1,""],stop:[257,3,1,""],time_until_next_repeat:[257,3,1,""],typename:[257,4,1,""],unpause:[257,3,1,""]},"evennia.scripts.scripts.DoNothing":{DoesNotExist:[257,2,1,""],MultipleObjectsReturned:[257,2,1,""],at_script_creation:[257,3,1,""],path:[257,4,1,""],typename:[257,4,1,""]},"evennia.scripts.scripts.Store":{DoesNotExist:[257,2,1,""],MultipleObjectsReturned:[257,2,1,""],at_script_creation:[257,3,1,""],path:[257,4,1,""],typename:[257,4,1,""]},"evennia.scripts.taskhandler":{TaskHandler:[258,1,1,""]},"evennia.scripts.taskhandler.TaskHandler":{__init__:[258,3,1,""],add:[258,3,1,""],create_delays:[258,3,1,""],do_task:[258,3,1,""],load:[258,3,1,""],remove:[258,3,1,""],save:[258,3,1,""]},"evennia.scripts.tickerhandler":{Ticker:[259,1,1,""],TickerHandler:[259,1,1,""],TickerPool:[259,1,1,""]},"evennia.scripts.tickerhandler.Ticker":{__init__:[259,3,1,""],add:[259,3,1,""],remove:[259,3,1,""],stop:[259,3,1,""],validate:[259,3,1,""]},"evennia.scripts.tickerhandler.TickerHandler":{__init__:[259,3,1,""],add:[259,3,1,""],all:[259,3,1,""],all_display:[259,3,1,""],clear:[259,3,1,""],remove:[259,3,1,""],restore:[259,3,1,""],save:[259,3,1,""],ticker_pool_class:[259,4,1,""]},"evennia.scripts.tickerhandler.TickerPool":{__init__:[259,3,1,""],add:[259,3,1,""],remove:[259,3,1,""],stop:[259,3,1,""],ticker_class:[259,4,1,""]},"evennia.server":{admin:[261,0,0,"-"],amp_client:[262,0,0,"-"],connection_wizard:[263,0,0,"-"],deprecations:[264,0,0,"-"],evennia_launcher:[265,0,0,"-"],game_index_client:[266,0,0,"-"],initial_setup:[269,0,0,"-"],inputfuncs:[270,0,0,"-"],manager:[271,0,0,"-"],models:[272,0,0,"-"],portal:[273,0,0,"-"],profiling:[295,0,0,"-"],server:[303,0,0,"-"],serversession:[304,0,0,"-"],session:[305,0,0,"-"],sessionhandler:[306,0,0,"-"],signals:[307,0,0,"-"],throttle:[308,0,0,"-"],validators:[309,0,0,"-"],webserver:[310,0,0,"-"]},"evennia.server.admin":{ServerConfigAdmin:[261,1,1,""]},"evennia.server.admin.ServerConfigAdmin":{list_display:[261,4,1,""],list_display_links:[261,4,1,""],list_select_related:[261,4,1,""],media:[261,3,1,""],ordering:[261,4,1,""],save_as:[261,4,1,""],save_on_top:[261,4,1,""],search_fields:[261,4,1,""]},"evennia.server.amp_client":{AMPClientFactory:[262,1,1,""],AMPServerClientProtocol:[262,1,1,""]},"evennia.server.amp_client.AMPClientFactory":{__init__:[262,3,1,""],buildProtocol:[262,3,1,""],clientConnectionFailed:[262,3,1,""],clientConnectionLost:[262,3,1,""],factor:[262,4,1,""],initialDelay:[262,4,1,""],maxDelay:[262,4,1,""],noisy:[262,4,1,""],startedConnecting:[262,3,1,""]},"evennia.server.amp_client.AMPServerClientProtocol":{connectionMade:[262,3,1,""],data_to_portal:[262,3,1,""],send_AdminServer2Portal:[262,3,1,""],send_MsgServer2Portal:[262,3,1,""],server_receive_adminportal2server:[262,3,1,""],server_receive_msgportal2server:[262,3,1,""],server_receive_status:[262,3,1,""]},"evennia.server.connection_wizard":{ConnectionWizard:[263,1,1,""],node_game_index_fields:[263,5,1,""],node_game_index_start:[263,5,1,""],node_mssp_start:[263,5,1,""],node_start:[263,5,1,""],node_view_and_apply_settings:[263,5,1,""]},"evennia.server.connection_wizard.ConnectionWizard":{__init__:[263,3,1,""],ask_choice:[263,3,1,""],ask_continue:[263,3,1,""],ask_input:[263,3,1,""],ask_node:[263,3,1,""],ask_yesno:[263,3,1,""],display:[263,3,1,""]},"evennia.server.deprecations":{check_errors:[264,5,1,""],check_warnings:[264,5,1,""]},"evennia.server.evennia_launcher":{AMPLauncherProtocol:[265,1,1,""],MsgLauncher2Portal:[265,1,1,""],MsgStatus:[265,1,1,""],check_database:[265,5,1,""],check_main_evennia_dependencies:[265,5,1,""],collectstatic:[265,5,1,""],create_game_directory:[265,5,1,""],create_secret_key:[265,5,1,""],create_settings_file:[265,5,1,""],create_superuser:[265,5,1,""],del_pid:[265,5,1,""],error_check_python_modules:[265,5,1,""],evennia_version:[265,5,1,""],get_pid:[265,5,1,""],getenv:[265,5,1,""],init_game_directory:[265,5,1,""],kill:[265,5,1,""],list_settings:[265,5,1,""],main:[265,5,1,""],query_info:[265,5,1,""],query_status:[265,5,1,""],reboot_evennia:[265,5,1,""],reload_evennia:[265,5,1,""],run_connect_wizard:[265,5,1,""],run_dummyrunner:[265,5,1,""],run_menu:[265,5,1,""],send_instruction:[265,5,1,""],set_gamedir:[265,5,1,""],show_version_info:[265,5,1,""],start_evennia:[265,5,1,""],start_only_server:[265,5,1,""],start_portal_interactive:[265,5,1,""],start_server_interactive:[265,5,1,""],stop_evennia:[265,5,1,""],stop_server_only:[265,5,1,""],tail_log_files:[265,5,1,""],wait_for_status:[265,5,1,""],wait_for_status_reply:[265,5,1,""]},"evennia.server.evennia_launcher.AMPLauncherProtocol":{__init__:[265,3,1,""],receive_status_from_portal:[265,3,1,""],wait_for_status:[265,3,1,""]},"evennia.server.evennia_launcher.MsgLauncher2Portal":{allErrors:[265,4,1,""],arguments:[265,4,1,""],commandName:[265,4,1,""],errors:[265,4,1,""],key:[265,4,1,""],response:[265,4,1,""],reverseErrors:[265,4,1,""]},"evennia.server.evennia_launcher.MsgStatus":{allErrors:[265,4,1,""],arguments:[265,4,1,""],commandName:[265,4,1,""],errors:[265,4,1,""],key:[265,4,1,""],response:[265,4,1,""],reverseErrors:[265,4,1,""]},"evennia.server.game_index_client":{client:[267,0,0,"-"],service:[268,0,0,"-"]},"evennia.server.game_index_client.client":{EvenniaGameIndexClient:[267,1,1,""],QuietHTTP11ClientFactory:[267,1,1,""],SimpleResponseReceiver:[267,1,1,""],StringProducer:[267,1,1,""]},"evennia.server.game_index_client.client.EvenniaGameIndexClient":{__init__:[267,3,1,""],handle_egd_response:[267,3,1,""],send_game_details:[267,3,1,""]},"evennia.server.game_index_client.client.QuietHTTP11ClientFactory":{noisy:[267,4,1,""]},"evennia.server.game_index_client.client.SimpleResponseReceiver":{__init__:[267,3,1,""],connectionLost:[267,3,1,""],dataReceived:[267,3,1,""]},"evennia.server.game_index_client.client.StringProducer":{__init__:[267,3,1,""],pauseProducing:[267,3,1,""],startProducing:[267,3,1,""],stopProducing:[267,3,1,""]},"evennia.server.game_index_client.service":{EvenniaGameIndexService:[268,1,1,""]},"evennia.server.game_index_client.service.EvenniaGameIndexService":{__init__:[268,3,1,""],name:[268,4,1,""],startService:[268,3,1,""],stopService:[268,3,1,""]},"evennia.server.initial_setup":{at_initial_setup:[269,5,1,""],collectstatic:[269,5,1,""],create_channels:[269,5,1,""],create_objects:[269,5,1,""],get_god_account:[269,5,1,""],handle_setup:[269,5,1,""],reset_server:[269,5,1,""]},"evennia.server.inputfuncs":{"default":[270,5,1,""],bot_data_in:[270,5,1,""],client_options:[270,5,1,""],echo:[270,5,1,""],external_discord_hello:[270,5,1,""],get_client_options:[270,5,1,""],get_inputfuncs:[270,5,1,""],get_value:[270,5,1,""],hello:[270,5,1,""],login:[270,5,1,""],monitor:[270,5,1,""],monitored:[270,5,1,""],msdp_list:[270,5,1,""],msdp_report:[270,5,1,""],msdp_send:[270,5,1,""],msdp_unreport:[270,5,1,""],repeat:[270,5,1,""],supports_set:[270,5,1,""],text:[270,5,1,""],unmonitor:[270,5,1,""],unrepeat:[270,5,1,""],webclient_options:[270,5,1,""]},"evennia.server.manager":{ServerConfigManager:[271,1,1,""]},"evennia.server.manager.ServerConfigManager":{conf:[271,3,1,""]},"evennia.server.models":{ServerConfig:[272,1,1,""]},"evennia.server.models.ServerConfig":{DoesNotExist:[272,2,1,""],MultipleObjectsReturned:[272,2,1,""],db_key:[272,4,1,""],db_value:[272,4,1,""],id:[272,4,1,""],key:[272,3,1,""],objects:[272,4,1,""],path:[272,4,1,""],store:[272,3,1,""],typename:[272,4,1,""],value:[272,3,1,""]},"evennia.server.portal":{amp:[274,0,0,"-"],amp_server:[275,0,0,"-"],grapevine:[276,0,0,"-"],irc:[277,0,0,"-"],mccp:[278,0,0,"-"],mssp:[279,0,0,"-"],mxp:[280,0,0,"-"],naws:[281,0,0,"-"],portal:[282,0,0,"-"],portalsessionhandler:[283,0,0,"-"],rss:[284,0,0,"-"],ssh:[285,0,0,"-"],ssl:[286,0,0,"-"],suppress_ga:[287,0,0,"-"],telnet:[288,0,0,"-"],telnet_oob:[289,0,0,"-"],telnet_ssl:[290,0,0,"-"],tests:[291,0,0,"-"],ttype:[292,0,0,"-"],webclient:[293,0,0,"-"],webclient_ajax:[294,0,0,"-"]},"evennia.server.portal.amp":{AMPMultiConnectionProtocol:[274,1,1,""],AdminPortal2Server:[274,1,1,""],AdminServer2Portal:[274,1,1,""],Compressed:[274,1,1,""],FunctionCall:[274,1,1,""],MsgLauncher2Portal:[274,1,1,""],MsgPortal2Server:[274,1,1,""],MsgServer2Portal:[274,1,1,""],MsgStatus:[274,1,1,""],dumps:[274,5,1,""],loads:[274,5,1,""]},"evennia.server.portal.amp.AMPMultiConnectionProtocol":{__init__:[274,3,1,""],broadcast:[274,3,1,""],connectionLost:[274,3,1,""],connectionMade:[274,3,1,""],dataReceived:[274,3,1,""],data_in:[274,3,1,""],errback:[274,3,1,""],makeConnection:[274,3,1,""],receive_functioncall:[274,3,1,""],send_FunctionCall:[274,3,1,""]},"evennia.server.portal.amp.AdminPortal2Server":{allErrors:[274,4,1,""],arguments:[274,4,1,""],commandName:[274,4,1,""],errors:[274,4,1,""],key:[274,4,1,""],response:[274,4,1,""],reverseErrors:[274,4,1,""]},"evennia.server.portal.amp.AdminServer2Portal":{allErrors:[274,4,1,""],arguments:[274,4,1,""],commandName:[274,4,1,""],errors:[274,4,1,""],key:[274,4,1,""],response:[274,4,1,""],reverseErrors:[274,4,1,""]},"evennia.server.portal.amp.Compressed":{fromBox:[274,3,1,""],fromString:[274,3,1,""],toBox:[274,3,1,""],toString:[274,3,1,""]},"evennia.server.portal.amp.FunctionCall":{allErrors:[274,4,1,""],arguments:[274,4,1,""],commandName:[274,4,1,""],errors:[274,4,1,""],key:[274,4,1,""],response:[274,4,1,""],reverseErrors:[274,4,1,""]},"evennia.server.portal.amp.MsgLauncher2Portal":{allErrors:[274,4,1,""],arguments:[274,4,1,""],commandName:[274,4,1,""],errors:[274,4,1,""],key:[274,4,1,""],response:[274,4,1,""],reverseErrors:[274,4,1,""]},"evennia.server.portal.amp.MsgPortal2Server":{allErrors:[274,4,1,""],arguments:[274,4,1,""],commandName:[274,4,1,""],errors:[274,4,1,""],key:[274,4,1,""],response:[274,4,1,""],reverseErrors:[274,4,1,""]},"evennia.server.portal.amp.MsgServer2Portal":{allErrors:[274,4,1,""],arguments:[274,4,1,""],commandName:[274,4,1,""],errors:[274,4,1,""],key:[274,4,1,""],response:[274,4,1,""],reverseErrors:[274,4,1,""]},"evennia.server.portal.amp.MsgStatus":{allErrors:[274,4,1,""],arguments:[274,4,1,""],commandName:[274,4,1,""],errors:[274,4,1,""],key:[274,4,1,""],response:[274,4,1,""],reverseErrors:[274,4,1,""]},"evennia.server.portal.amp_server":{AMPServerFactory:[275,1,1,""],AMPServerProtocol:[275,1,1,""],getenv:[275,5,1,""]},"evennia.server.portal.amp_server.AMPServerFactory":{__init__:[275,3,1,""],buildProtocol:[275,3,1,""],logPrefix:[275,3,1,""],noisy:[275,4,1,""]},"evennia.server.portal.amp_server.AMPServerProtocol":{connectionLost:[275,3,1,""],data_to_server:[275,3,1,""],get_status:[275,3,1,""],portal_receive_adminserver2portal:[275,3,1,""],portal_receive_launcher2portal:[275,3,1,""],portal_receive_server2portal:[275,3,1,""],portal_receive_status:[275,3,1,""],send_AdminPortal2Server:[275,3,1,""],send_MsgPortal2Server:[275,3,1,""],send_Status2Launcher:[275,3,1,""],start_server:[275,3,1,""],stop_server:[275,3,1,""],wait_for_disconnect:[275,3,1,""],wait_for_server_connect:[275,3,1,""]},"evennia.server.portal.grapevine":{GrapevineClient:[276,1,1,""],RestartingWebsocketServerFactory:[276,1,1,""]},"evennia.server.portal.grapevine.GrapevineClient":{__init__:[276,3,1,""],at_login:[276,3,1,""],data_in:[276,3,1,""],disconnect:[276,3,1,""],onClose:[276,3,1,""],onMessage:[276,3,1,""],onOpen:[276,3,1,""],send_authenticate:[276,3,1,""],send_channel:[276,3,1,""],send_default:[276,3,1,""],send_heartbeat:[276,3,1,""],send_subscribe:[276,3,1,""],send_unsubscribe:[276,3,1,""]},"evennia.server.portal.grapevine.RestartingWebsocketServerFactory":{__init__:[276,3,1,""],buildProtocol:[276,3,1,""],clientConnectionFailed:[276,3,1,""],clientConnectionLost:[276,3,1,""],factor:[276,4,1,""],initialDelay:[276,4,1,""],maxDelay:[276,4,1,""],reconnect:[276,3,1,""],start:[276,3,1,""],startedConnecting:[276,3,1,""]},"evennia.server.portal.irc":{IRCBot:[277,1,1,""],IRCBotFactory:[277,1,1,""],parse_ansi_to_irc:[277,5,1,""],parse_irc_to_ansi:[277,5,1,""]},"evennia.server.portal.irc.IRCBot":{action:[277,3,1,""],at_login:[277,3,1,""],channel:[277,4,1,""],data_in:[277,3,1,""],disconnect:[277,3,1,""],factory:[277,4,1,""],get_nicklist:[277,3,1,""],irc_RPL_ENDOFNAMES:[277,3,1,""],irc_RPL_NAMREPLY:[277,3,1,""],lineRate:[277,4,1,""],logger:[277,4,1,""],nickname:[277,4,1,""],pong:[277,3,1,""],privmsg:[277,3,1,""],send_channel:[277,3,1,""],send_default:[277,3,1,""],send_ping:[277,3,1,""],send_privmsg:[277,3,1,""],send_reconnect:[277,3,1,""],send_request_nicklist:[277,3,1,""],signedOn:[277,3,1,""],sourceURL:[277,4,1,""]},"evennia.server.portal.irc.IRCBotFactory":{__init__:[277,3,1,""],buildProtocol:[277,3,1,""],clientConnectionFailed:[277,3,1,""],clientConnectionLost:[277,3,1,""],factor:[277,4,1,""],initialDelay:[277,4,1,""],maxDelay:[277,4,1,""],reconnect:[277,3,1,""],start:[277,3,1,""],startedConnecting:[277,3,1,""]},"evennia.server.portal.mccp":{Mccp:[278,1,1,""],mccp_compress:[278,5,1,""]},"evennia.server.portal.mccp.Mccp":{__init__:[278,3,1,""],do_mccp:[278,3,1,""],no_mccp:[278,3,1,""]},"evennia.server.portal.mssp":{Mssp:[279,1,1,""]},"evennia.server.portal.mssp.Mssp":{__init__:[279,3,1,""],do_mssp:[279,3,1,""],get_player_count:[279,3,1,""],get_uptime:[279,3,1,""],no_mssp:[279,3,1,""]},"evennia.server.portal.mxp":{Mxp:[280,1,1,""],mxp_parse:[280,5,1,""]},"evennia.server.portal.mxp.Mxp":{__init__:[280,3,1,""],do_mxp:[280,3,1,""],no_mxp:[280,3,1,""]},"evennia.server.portal.naws":{Naws:[281,1,1,""]},"evennia.server.portal.naws.Naws":{__init__:[281,3,1,""],do_naws:[281,3,1,""],negotiate_sizes:[281,3,1,""],no_naws:[281,3,1,""]},"evennia.server.portal.portal":{Portal:[282,1,1,""],Websocket:[282,1,1,""]},"evennia.server.portal.portal.Portal":{__init__:[282,3,1,""],get_info_dict:[282,3,1,""],shutdown:[282,3,1,""]},"evennia.server.portal.portalsessionhandler":{PortalSessionHandler:[283,1,1,""]},"evennia.server.portal.portalsessionhandler.PortalSessionHandler":{__init__:[283,3,1,""],announce_all:[283,3,1,""],at_server_connection:[283,3,1,""],connect:[283,3,1,""],count_loggedin:[283,3,1,""],data_in:[283,3,1,""],data_out:[283,3,1,""],disconnect:[283,3,1,""],disconnect_all:[283,3,1,""],generate_sessid:[283,3,1,""],server_connect:[283,3,1,""],server_disconnect:[283,3,1,""],server_disconnect_all:[283,3,1,""],server_logged_in:[283,3,1,""],server_session_sync:[283,3,1,""],sessions_from_csessid:[283,3,1,""],sync:[283,3,1,""]},"evennia.server.portal.rss":{RSSBotFactory:[284,1,1,""],RSSReader:[284,1,1,""]},"evennia.server.portal.rss.RSSBotFactory":{__init__:[284,3,1,""],start:[284,3,1,""]},"evennia.server.portal.rss.RSSReader":{__init__:[284,3,1,""],data_in:[284,3,1,""],disconnect:[284,3,1,""],get_new:[284,3,1,""],update:[284,3,1,""]},"evennia.server.portal.ssh":{AccountDBPasswordChecker:[285,1,1,""],ExtraInfoAuthServer:[285,1,1,""],PassAvatarIdTerminalRealm:[285,1,1,""],SSHServerFactory:[285,1,1,""],SshProtocol:[285,1,1,""],TerminalSessionTransport_getPeer:[285,1,1,""],getKeyPair:[285,5,1,""],makeFactory:[285,5,1,""]},"evennia.server.portal.ssh.AccountDBPasswordChecker":{__init__:[285,3,1,""],credentialInterfaces:[285,4,1,""],noisy:[285,4,1,""],requestAvatarId:[285,3,1,""]},"evennia.server.portal.ssh.ExtraInfoAuthServer":{auth_password:[285,3,1,""],noisy:[285,4,1,""]},"evennia.server.portal.ssh.PassAvatarIdTerminalRealm":{noisy:[285,4,1,""]},"evennia.server.portal.ssh.SSHServerFactory":{logPrefix:[285,3,1,""],noisy:[285,4,1,""]},"evennia.server.portal.ssh.SshProtocol":{__init__:[285,3,1,""],at_login:[285,3,1,""],connectionLost:[285,3,1,""],connectionMade:[285,3,1,""],data_out:[285,3,1,""],disconnect:[285,3,1,""],getClientAddress:[285,3,1,""],handle_EOF:[285,3,1,""],handle_FF:[285,3,1,""],handle_INT:[285,3,1,""],handle_QUIT:[285,3,1,""],lineReceived:[285,3,1,""],noisy:[285,4,1,""],sendLine:[285,3,1,""],send_default:[285,3,1,""],send_prompt:[285,3,1,""],send_text:[285,3,1,""],terminalSize:[285,3,1,""]},"evennia.server.portal.ssh.TerminalSessionTransport_getPeer":{__init__:[285,3,1,""],noisy:[285,4,1,""]},"evennia.server.portal.ssl":{SSLProtocol:[286,1,1,""],getSSLContext:[286,5,1,""],verify_SSL_key_and_cert:[286,5,1,""]},"evennia.server.portal.ssl.SSLProtocol":{__init__:[286,3,1,""]},"evennia.server.portal.suppress_ga":{SuppressGA:[287,1,1,""]},"evennia.server.portal.suppress_ga.SuppressGA":{__init__:[287,3,1,""],will_suppress_ga:[287,3,1,""],wont_suppress_ga:[287,3,1,""]},"evennia.server.portal.telnet":{TelnetProtocol:[288,1,1,""],TelnetServerFactory:[288,1,1,""]},"evennia.server.portal.telnet.TelnetProtocol":{__init__:[288,3,1,""],applicationDataReceived:[288,3,1,""],at_login:[288,3,1,""],connectionLost:[288,3,1,""],connectionMade:[288,3,1,""],dataReceived:[288,3,1,""],data_in:[288,3,1,""],data_out:[288,3,1,""],disableLocal:[288,3,1,""],disableRemote:[288,3,1,""],disconnect:[288,3,1,""],enableLocal:[288,3,1,""],enableRemote:[288,3,1,""],handshake_done:[288,3,1,""],sendLine:[288,3,1,""],send_default:[288,3,1,""],send_prompt:[288,3,1,""],send_text:[288,3,1,""],toggle_nop_keepalive:[288,3,1,""]},"evennia.server.portal.telnet.TelnetServerFactory":{logPrefix:[288,3,1,""],noisy:[288,4,1,""]},"evennia.server.portal.telnet_oob":{TelnetOOB:[289,1,1,""]},"evennia.server.portal.telnet_oob.TelnetOOB":{__init__:[289,3,1,""],data_out:[289,3,1,""],decode_gmcp:[289,3,1,""],decode_msdp:[289,3,1,""],do_gmcp:[289,3,1,""],do_msdp:[289,3,1,""],encode_gmcp:[289,3,1,""],encode_msdp:[289,3,1,""],no_gmcp:[289,3,1,""],no_msdp:[289,3,1,""]},"evennia.server.portal.telnet_ssl":{SSLProtocol:[290,1,1,""],getSSLContext:[290,5,1,""],verify_or_create_SSL_key_and_cert:[290,5,1,""]},"evennia.server.portal.telnet_ssl.SSLProtocol":{__init__:[290,3,1,""]},"evennia.server.portal.tests":{TestAMPServer:[291,1,1,""],TestIRC:[291,1,1,""],TestTelnet:[291,1,1,""],TestWebSocket:[291,1,1,""]},"evennia.server.portal.tests.TestAMPServer":{setUp:[291,3,1,""],test_amp_in:[291,3,1,""],test_amp_out:[291,3,1,""],test_large_msg:[291,3,1,""]},"evennia.server.portal.tests.TestIRC":{test_bold:[291,3,1,""],test_colors:[291,3,1,""],test_identity:[291,3,1,""],test_italic:[291,3,1,""],test_plain_ansi:[291,3,1,""]},"evennia.server.portal.tests.TestTelnet":{setUp:[291,3,1,""],test_mudlet_ttype:[291,3,1,""]},"evennia.server.portal.tests.TestWebSocket":{setUp:[291,3,1,""],tearDown:[291,3,1,""],test_data_in:[291,3,1,""],test_data_out:[291,3,1,""]},"evennia.server.portal.ttype":{Ttype:[292,1,1,""]},"evennia.server.portal.ttype.Ttype":{__init__:[292,3,1,""],will_ttype:[292,3,1,""],wont_ttype:[292,3,1,""]},"evennia.server.portal.webclient":{WebSocketClient:[293,1,1,""]},"evennia.server.portal.webclient.WebSocketClient":{__init__:[293,3,1,""],at_login:[293,3,1,""],data_in:[293,3,1,""],disconnect:[293,3,1,""],get_client_session:[293,3,1,""],nonce:[293,4,1,""],onClose:[293,3,1,""],onMessage:[293,3,1,""],onOpen:[293,3,1,""],sendLine:[293,3,1,""],send_default:[293,3,1,""],send_prompt:[293,3,1,""],send_text:[293,3,1,""]},"evennia.server.portal.webclient_ajax":{AjaxWebClient:[294,1,1,""],AjaxWebClientSession:[294,1,1,""],LazyEncoder:[294,1,1,""],jsonify:[294,5,1,""]},"evennia.server.portal.webclient_ajax.AjaxWebClient":{__init__:[294,3,1,""],allowedMethods:[294,4,1,""],at_login:[294,3,1,""],client_disconnect:[294,3,1,""],get_client_sessid:[294,3,1,""],isLeaf:[294,4,1,""],lineSend:[294,3,1,""],mode_close:[294,3,1,""],mode_init:[294,3,1,""],mode_input:[294,3,1,""],mode_keepalive:[294,3,1,""],mode_receive:[294,3,1,""],render_POST:[294,3,1,""]},"evennia.server.portal.webclient_ajax.AjaxWebClientSession":{__init__:[294,3,1,""],at_login:[294,3,1,""],data_in:[294,3,1,""],data_out:[294,3,1,""],disconnect:[294,3,1,""],get_client_session:[294,3,1,""],send_default:[294,3,1,""],send_prompt:[294,3,1,""],send_text:[294,3,1,""]},"evennia.server.portal.webclient_ajax.LazyEncoder":{"default":[294,3,1,""]},"evennia.server.profiling":{dummyrunner:[296,0,0,"-"],dummyrunner_settings:[297,0,0,"-"],memplot:[298,0,0,"-"],settings_mixin:[299,0,0,"-"],test_queries:[300,0,0,"-"],tests:[301,0,0,"-"],timetrace:[302,0,0,"-"]},"evennia.server.profiling.dummyrunner":{DummyClient:[296,1,1,""],DummyFactory:[296,1,1,""],gidcounter:[296,5,1,""],idcounter:[296,5,1,""],makeiter:[296,5,1,""],start_all_dummy_clients:[296,5,1,""]},"evennia.server.profiling.dummyrunner.DummyClient":{connectionLost:[296,3,1,""],connectionMade:[296,3,1,""],counter:[296,3,1,""],dataReceived:[296,3,1,""],error:[296,3,1,""],logout:[296,3,1,""],step:[296,3,1,""]},"evennia.server.profiling.dummyrunner.DummyFactory":{__init__:[296,3,1,""],protocol:[296,4,1,""]},"evennia.server.profiling.dummyrunner_settings":{c_creates_button:[297,5,1,""],c_creates_obj:[297,5,1,""],c_digs:[297,5,1,""],c_examines:[297,5,1,""],c_help:[297,5,1,""],c_idles:[297,5,1,""],c_login:[297,5,1,""],c_login_nodig:[297,5,1,""],c_logout:[297,5,1,""],c_looks:[297,5,1,""],c_moves:[297,5,1,""],c_moves_n:[297,5,1,""],c_moves_s:[297,5,1,""],c_socialize:[297,5,1,""]},"evennia.server.profiling.memplot":{Memplot:[298,1,1,""]},"evennia.server.profiling.memplot.Memplot":{DoesNotExist:[298,2,1,""],MultipleObjectsReturned:[298,2,1,""],at_repeat:[298,3,1,""],at_script_creation:[298,3,1,""],path:[298,4,1,""],typename:[298,4,1,""]},"evennia.server.profiling.test_queries":{count_queries:[300,5,1,""]},"evennia.server.profiling.tests":{TestDummyrunnerSettings:[301,1,1,""],TestMemPlot:[301,1,1,""]},"evennia.server.profiling.tests.TestDummyrunnerSettings":{clear_client_lists:[301,3,1,""],perception_method_tests:[301,3,1,""],setUp:[301,3,1,""],test_c_creates_button:[301,3,1,""],test_c_creates_obj:[301,3,1,""],test_c_digs:[301,3,1,""],test_c_examines:[301,3,1,""],test_c_help:[301,3,1,""],test_c_login:[301,3,1,""],test_c_login_no_dig:[301,3,1,""],test_c_logout:[301,3,1,""],test_c_looks:[301,3,1,""],test_c_move_n:[301,3,1,""],test_c_move_s:[301,3,1,""],test_c_moves:[301,3,1,""],test_c_socialize:[301,3,1,""],test_idles:[301,3,1,""]},"evennia.server.profiling.tests.TestMemPlot":{test_memplot:[301,3,1,""]},"evennia.server.profiling.timetrace":{timetrace:[302,5,1,""]},"evennia.server.server":{Evennia:[303,1,1,""]},"evennia.server.server.Evennia":{__init__:[303,3,1,""],at_post_portal_sync:[303,3,1,""],at_server_cold_start:[303,3,1,""],at_server_cold_stop:[303,3,1,""],at_server_reload_start:[303,3,1,""],at_server_reload_stop:[303,3,1,""],at_server_start:[303,3,1,""],at_server_stop:[303,3,1,""],get_info_dict:[303,3,1,""],run_init_hooks:[303,3,1,""],run_initial_setup:[303,3,1,""],shutdown:[303,3,1,""],sqlite3_prep:[303,3,1,""],update_defaults:[303,3,1,""]},"evennia.server.serversession":{ServerSession:[304,1,1,""]},"evennia.server.serversession.ServerSession":{__init__:[304,3,1,""],access:[304,3,1,""],at_cmdset_get:[304,3,1,""],at_disconnect:[304,3,1,""],at_login:[304,3,1,""],at_sync:[304,3,1,""],attributes:[304,4,1,""],cmdset_storage:[304,3,1,""],data_in:[304,3,1,""],data_out:[304,3,1,""],db:[304,3,1,""],execute_cmd:[304,3,1,""],get_account:[304,3,1,""],get_character:[304,3,1,""],get_client_size:[304,3,1,""],get_puppet:[304,3,1,""],get_puppet_or_account:[304,3,1,""],id:[304,3,1,""],log:[304,3,1,""],msg:[304,3,1,""],nattributes:[304,4,1,""],ndb:[304,3,1,""],ndb_del:[304,3,1,""],ndb_get:[304,3,1,""],ndb_set:[304,3,1,""],update_flags:[304,3,1,""],update_session_counters:[304,3,1,""]},"evennia.server.session":{Session:[305,1,1,""]},"evennia.server.session.Session":{at_sync:[305,3,1,""],data_in:[305,3,1,""],data_out:[305,3,1,""],disconnect:[305,3,1,""],get_sync_data:[305,3,1,""],init_session:[305,3,1,""],load_sync_data:[305,3,1,""]},"evennia.server.sessionhandler":{DummySession:[306,1,1,""],ServerSessionHandler:[306,1,1,""],SessionHandler:[306,1,1,""],delayed_import:[306,5,1,""]},"evennia.server.sessionhandler.DummySession":{sessid:[306,4,1,""]},"evennia.server.sessionhandler.ServerSessionHandler":{__init__:[306,3,1,""],account_count:[306,3,1,""],all_connected_accounts:[306,3,1,""],all_sessions_portal_sync:[306,3,1,""],announce_all:[306,3,1,""],call_inputfuncs:[306,3,1,""],data_in:[306,3,1,""],data_out:[306,3,1,""],disconnect:[306,3,1,""],disconnect_all_sessions:[306,3,1,""],disconnect_duplicate_sessions:[306,3,1,""],get_inputfuncs:[306,3,1,""],login:[306,3,1,""],portal_connect:[306,3,1,""],portal_disconnect:[306,3,1,""],portal_disconnect_all:[306,3,1,""],portal_reset_server:[306,3,1,""],portal_restart_server:[306,3,1,""],portal_session_sync:[306,3,1,""],portal_sessions_sync:[306,3,1,""],portal_shutdown:[306,3,1,""],session_from_account:[306,3,1,""],session_from_sessid:[306,3,1,""],session_portal_partial_sync:[306,3,1,""],session_portal_sync:[306,3,1,""],sessions_from_account:[306,3,1,""],sessions_from_character:[306,3,1,""],sessions_from_csessid:[306,3,1,""],sessions_from_puppet:[306,3,1,""],start_bot_session:[306,3,1,""],validate_sessions:[306,3,1,""]},"evennia.server.sessionhandler.SessionHandler":{clean_senddata:[306,3,1,""],get:[306,3,1,""],get_all_sync_data:[306,3,1,""],get_sessions:[306,3,1,""]},"evennia.server.throttle":{Throttle:[308,1,1,""]},"evennia.server.throttle.Throttle":{__init__:[308,3,1,""],check:[308,3,1,""],error_msg:[308,4,1,""],get:[308,3,1,""],update:[308,3,1,""]},"evennia.server.validators":{EvenniaPasswordValidator:[309,1,1,""],EvenniaUsernameAvailabilityValidator:[309,1,1,""]},"evennia.server.validators.EvenniaPasswordValidator":{__init__:[309,3,1,""],get_help_text:[309,3,1,""],validate:[309,3,1,""]},"evennia.server.webserver":{DjangoWebRoot:[310,1,1,""],EvenniaReverseProxyResource:[310,1,1,""],HTTPChannelWithXForwardedFor:[310,1,1,""],LockableThreadPool:[310,1,1,""],PrivateStaticRoot:[310,1,1,""],WSGIWebServer:[310,1,1,""],Website:[310,1,1,""]},"evennia.server.webserver.DjangoWebRoot":{__init__:[310,3,1,""],empty_threadpool:[310,3,1,""],getChild:[310,3,1,""]},"evennia.server.webserver.EvenniaReverseProxyResource":{getChild:[310,3,1,""],render:[310,3,1,""]},"evennia.server.webserver.HTTPChannelWithXForwardedFor":{allHeadersReceived:[310,3,1,""]},"evennia.server.webserver.LockableThreadPool":{__init__:[310,3,1,""],callInThread:[310,3,1,""],lock:[310,3,1,""]},"evennia.server.webserver.PrivateStaticRoot":{directoryListing:[310,3,1,""]},"evennia.server.webserver.WSGIWebServer":{__init__:[310,3,1,""],startService:[310,3,1,""],stopService:[310,3,1,""]},"evennia.server.webserver.Website":{log:[310,3,1,""],logPrefix:[310,3,1,""],noisy:[310,4,1,""]},"evennia.typeclasses":{admin:[313,0,0,"-"],attributes:[314,0,0,"-"],managers:[315,0,0,"-"],models:[316,0,0,"-"],tags:[317,0,0,"-"]},"evennia.typeclasses.admin":{AttributeForm:[313,1,1,""],AttributeFormSet:[313,1,1,""],AttributeInline:[313,1,1,""],TagAdmin:[313,1,1,""],TagForm:[313,1,1,""],TagFormSet:[313,1,1,""],TagInline:[313,1,1,""]},"evennia.typeclasses.admin.AttributeForm":{Meta:[313,1,1,""],__init__:[313,3,1,""],base_fields:[313,4,1,""],clean_attr_value:[313,3,1,""],declared_fields:[313,4,1,""],media:[313,3,1,""],save:[313,3,1,""]},"evennia.typeclasses.admin.AttributeForm.Meta":{fields:[313,4,1,""]},"evennia.typeclasses.admin.AttributeFormSet":{save:[313,3,1,""]},"evennia.typeclasses.admin.AttributeInline":{extra:[313,4,1,""],form:[313,4,1,""],formset:[313,4,1,""],get_formset:[313,3,1,""],media:[313,3,1,""],model:[313,4,1,""],related_field:[313,4,1,""]},"evennia.typeclasses.admin.TagAdmin":{fields:[313,4,1,""],list_display:[313,4,1,""],list_filter:[313,4,1,""],media:[313,3,1,""],search_fields:[313,4,1,""]},"evennia.typeclasses.admin.TagForm":{Meta:[313,1,1,""],__init__:[313,3,1,""],base_fields:[313,4,1,""],declared_fields:[313,4,1,""],media:[313,3,1,""],save:[313,3,1,""]},"evennia.typeclasses.admin.TagForm.Meta":{fields:[313,4,1,""]},"evennia.typeclasses.admin.TagFormSet":{save:[313,3,1,""]},"evennia.typeclasses.admin.TagInline":{extra:[313,4,1,""],form:[313,4,1,""],formset:[313,4,1,""],get_formset:[313,3,1,""],media:[313,3,1,""],model:[313,4,1,""],related_field:[313,4,1,""]},"evennia.typeclasses.attributes":{Attribute:[314,1,1,""],AttributeHandler:[314,1,1,""],DbHolder:[314,1,1,""],IAttribute:[314,1,1,""],IAttributeBackend:[314,1,1,""],InMemoryAttribute:[314,1,1,""],InMemoryAttributeBackend:[314,1,1,""],ModelAttributeBackend:[314,1,1,""],NickHandler:[314,1,1,""],NickTemplateInvalid:[314,2,1,""],initialize_nick_templates:[314,5,1,""],parse_nick_template:[314,5,1,""]},"evennia.typeclasses.attributes.Attribute":{DoesNotExist:[314,2,1,""],MultipleObjectsReturned:[314,2,1,""],accountdb_set:[314,4,1,""],attrtype:[314,3,1,""],category:[314,3,1,""],channeldb_set:[314,4,1,""],date_created:[314,3,1,""],db_attrtype:[314,4,1,""],db_category:[314,4,1,""],db_date_created:[314,4,1,""],db_key:[314,4,1,""],db_lock_storage:[314,4,1,""],db_model:[314,4,1,""],db_strvalue:[314,4,1,""],db_value:[314,4,1,""],get_next_by_db_date_created:[314,3,1,""],get_previous_by_db_date_created:[314,3,1,""],id:[314,4,1,""],key:[314,3,1,""],lock_storage:[314,3,1,""],model:[314,3,1,""],objectdb_set:[314,4,1,""],path:[314,4,1,""],scriptdb_set:[314,4,1,""],strvalue:[314,3,1,""],typename:[314,4,1,""],value:[314,3,1,""]},"evennia.typeclasses.attributes.AttributeHandler":{__init__:[314,3,1,""],add:[314,3,1,""],all:[314,3,1,""],batch_add:[314,3,1,""],clear:[314,3,1,""],get:[314,3,1,""],has:[314,3,1,""],remove:[314,3,1,""],reset_cache:[314,3,1,""]},"evennia.typeclasses.attributes.DbHolder":{__init__:[314,3,1,""],all:[314,3,1,""],get_all:[314,3,1,""]},"evennia.typeclasses.attributes.IAttribute":{access:[314,3,1,""],attrtype:[314,3,1,""],category:[314,3,1,""],date_created:[314,3,1,""],key:[314,3,1,""],lock_storage:[314,3,1,""],locks:[314,4,1,""],model:[314,3,1,""],strvalue:[314,3,1,""]},"evennia.typeclasses.attributes.IAttributeBackend":{__init__:[314,3,1,""],batch_add:[314,3,1,""],clear_attributes:[314,3,1,""],create_attribute:[314,3,1,""],delete_attribute:[314,3,1,""],do_batch_delete:[314,3,1,""],do_batch_finish:[314,3,1,""],do_batch_update_attribute:[314,3,1,""],do_create_attribute:[314,3,1,""],do_delete_attribute:[314,3,1,""],do_update_attribute:[314,3,1,""],get:[314,3,1,""],get_all_attributes:[314,3,1,""],query_all:[314,3,1,""],query_category:[314,3,1,""],query_key:[314,3,1,""],reset_cache:[314,3,1,""],update_attribute:[314,3,1,""]},"evennia.typeclasses.attributes.InMemoryAttribute":{__init__:[314,3,1,""],value:[314,3,1,""]},"evennia.typeclasses.attributes.InMemoryAttributeBackend":{__init__:[314,3,1,""],do_batch_finish:[314,3,1,""],do_batch_update_attribute:[314,3,1,""],do_create_attribute:[314,3,1,""],do_delete_attribute:[314,3,1,""],do_update_attribute:[314,3,1,""],query_all:[314,3,1,""],query_category:[314,3,1,""],query_key:[314,3,1,""]},"evennia.typeclasses.attributes.ModelAttributeBackend":{__init__:[314,3,1,""],do_batch_finish:[314,3,1,""],do_batch_update_attribute:[314,3,1,""],do_create_attribute:[314,3,1,""],do_delete_attribute:[314,3,1,""],do_update_attribute:[314,3,1,""],query_all:[314,3,1,""],query_category:[314,3,1,""],query_key:[314,3,1,""]},"evennia.typeclasses.attributes.NickHandler":{__init__:[314,3,1,""],add:[314,3,1,""],get:[314,3,1,""],has:[314,3,1,""],nickreplace:[314,3,1,""],remove:[314,3,1,""]},"evennia.typeclasses.managers":{TypedObjectManager:[315,1,1,""]},"evennia.typeclasses.managers.TypedObjectManager":{create_tag:[315,3,1,""],dbref:[315,3,1,""],dbref_search:[315,3,1,""],get_alias:[315,3,1,""],get_attribute:[315,3,1,""],get_by_alias:[315,3,1,""],get_by_attribute:[315,3,1,""],get_by_nick:[315,3,1,""],get_by_permission:[315,3,1,""],get_by_tag:[315,3,1,""],get_dbref_range:[315,3,1,""],get_id:[315,3,1,""],get_nick:[315,3,1,""],get_permission:[315,3,1,""],get_tag:[315,3,1,""],get_typeclass_totals:[315,3,1,""],object_totals:[315,3,1,""],typeclass_search:[315,3,1,""]},"evennia.typeclasses.models":{TypedObject:[316,1,1,""]},"evennia.typeclasses.models.TypedObject":{"delete":[316,3,1,""],Meta:[316,1,1,""],__init__:[316,3,1,""],access:[316,3,1,""],aliases:[316,4,1,""],at_idmapper_flush:[316,3,1,""],at_rename:[316,3,1,""],attributes:[316,4,1,""],check_permstring:[316,3,1,""],date_created:[316,3,1,""],db:[316,3,1,""],db_attributes:[316,4,1,""],db_date_created:[316,4,1,""],db_key:[316,4,1,""],db_lock_storage:[316,4,1,""],db_tags:[316,4,1,""],db_typeclass_path:[316,4,1,""],dbid:[316,3,1,""],dbref:[316,3,1,""],get_absolute_url:[316,3,1,""],get_display_name:[316,3,1,""],get_extra_info:[316,3,1,""],get_next_by_db_date_created:[316,3,1,""],get_previous_by_db_date_created:[316,3,1,""],is_typeclass:[316,3,1,""],key:[316,3,1,""],lock_storage:[316,3,1,""],locks:[316,4,1,""],name:[316,3,1,""],nattributes:[316,4,1,""],ndb:[316,3,1,""],objects:[316,4,1,""],path:[316,4,1,""],permissions:[316,4,1,""],set_class_from_typeclass:[316,3,1,""],swap_typeclass:[316,3,1,""],tags:[316,4,1,""],typeclass_path:[316,3,1,""],typename:[316,4,1,""],web_get_admin_url:[316,3,1,""],web_get_create_url:[316,3,1,""],web_get_delete_url:[316,3,1,""],web_get_detail_url:[316,3,1,""],web_get_puppet_url:[316,3,1,""],web_get_update_url:[316,3,1,""]},"evennia.typeclasses.models.TypedObject.Meta":{"abstract":[316,4,1,""],ordering:[316,4,1,""],verbose_name:[316,4,1,""]},"evennia.typeclasses.tags":{AliasHandler:[317,1,1,""],PermissionHandler:[317,1,1,""],Tag:[317,1,1,""],TagHandler:[317,1,1,""]},"evennia.typeclasses.tags.Tag":{DoesNotExist:[317,2,1,""],MultipleObjectsReturned:[317,2,1,""],accountdb_set:[317,4,1,""],channeldb_set:[317,4,1,""],db_category:[317,4,1,""],db_data:[317,4,1,""],db_key:[317,4,1,""],db_model:[317,4,1,""],db_tagtype:[317,4,1,""],helpentry_set:[317,4,1,""],id:[317,4,1,""],msg_set:[317,4,1,""],objectdb_set:[317,4,1,""],objects:[317,4,1,""],scriptdb_set:[317,4,1,""]},"evennia.typeclasses.tags.TagHandler":{__init__:[317,3,1,""],add:[317,3,1,""],all:[317,3,1,""],batch_add:[317,3,1,""],clear:[317,3,1,""],get:[317,3,1,""],remove:[317,3,1,""],reset_cache:[317,3,1,""]},"evennia.utils":{ansi:[319,0,0,"-"],batchprocessors:[320,0,0,"-"],containers:[321,0,0,"-"],create:[322,0,0,"-"],dbserialize:[323,0,0,"-"],eveditor:[324,0,0,"-"],evform:[325,0,0,"-"],evmenu:[326,0,0,"-"],evmore:[327,0,0,"-"],evtable:[328,0,0,"-"],gametime:[329,0,0,"-"],idmapper:[330,0,0,"-"],inlinefuncs:[334,0,0,"-"],logger:[335,0,0,"-"],optionclasses:[336,0,0,"-"],optionhandler:[337,0,0,"-"],picklefield:[338,0,0,"-"],search:[339,0,0,"-"],test_resources:[340,0,0,"-"],text2html:[341,0,0,"-"],utils:[342,0,0,"-"],validatorfuncs:[343,0,0,"-"]},"evennia.utils.ansi":{ANSIMeta:[319,1,1,""],ANSIParser:[319,1,1,""],ANSIString:[319,1,1,""],parse_ansi:[319,5,1,""],raw:[319,5,1,""],strip_ansi:[319,5,1,""],strip_raw_ansi:[319,5,1,""]},"evennia.utils.ansi.ANSIMeta":{__init__:[319,3,1,""]},"evennia.utils.ansi.ANSIParser":{ansi_escapes:[319,4,1,""],ansi_map:[319,4,1,""],ansi_map_dict:[319,4,1,""],ansi_re:[319,4,1,""],ansi_regex:[319,4,1,""],ansi_sub:[319,4,1,""],ansi_xterm256_bright_bg_map:[319,4,1,""],ansi_xterm256_bright_bg_map_dict:[319,4,1,""],brightbg_sub:[319,4,1,""],mxp_re:[319,4,1,""],mxp_sub:[319,4,1,""],parse_ansi:[319,3,1,""],strip_mxp:[319,3,1,""],strip_raw_codes:[319,3,1,""],sub_ansi:[319,3,1,""],sub_brightbg:[319,3,1,""],sub_xterm256:[319,3,1,""],xterm256_bg:[319,4,1,""],xterm256_bg_sub:[319,4,1,""],xterm256_fg:[319,4,1,""],xterm256_fg_sub:[319,4,1,""],xterm256_gbg:[319,4,1,""],xterm256_gbg_sub:[319,4,1,""],xterm256_gfg:[319,4,1,""],xterm256_gfg_sub:[319,4,1,""]},"evennia.utils.ansi.ANSIString":{__init__:[319,3,1,""],capitalize:[319,3,1,""],center:[319,3,1,""],clean:[319,3,1,""],count:[319,3,1,""],decode:[319,3,1,""],encode:[319,3,1,""],endswith:[319,3,1,""],expandtabs:[319,3,1,""],find:[319,3,1,""],format:[319,3,1,""],index:[319,3,1,""],isalnum:[319,3,1,""],isalpha:[319,3,1,""],isdigit:[319,3,1,""],islower:[319,3,1,""],isspace:[319,3,1,""],istitle:[319,3,1,""],isupper:[319,3,1,""],join:[319,3,1,""],ljust:[319,3,1,""],lower:[319,3,1,""],lstrip:[319,3,1,""],partition:[319,3,1,""],raw:[319,3,1,""],re_format:[319,4,1,""],replace:[319,3,1,""],rfind:[319,3,1,""],rindex:[319,3,1,""],rjust:[319,3,1,""],rsplit:[319,3,1,""],rstrip:[319,3,1,""],split:[319,3,1,""],startswith:[319,3,1,""],strip:[319,3,1,""],swapcase:[319,3,1,""],translate:[319,3,1,""],upper:[319,3,1,""]},"evennia.utils.batchprocessors":{BatchCodeProcessor:[320,1,1,""],BatchCommandProcessor:[320,1,1,""],read_batchfile:[320,5,1,""],tb_filename:[320,5,1,""],tb_iter:[320,5,1,""]},"evennia.utils.batchprocessors.BatchCodeProcessor":{code_exec:[320,3,1,""],parse_file:[320,3,1,""]},"evennia.utils.batchprocessors.BatchCommandProcessor":{parse_file:[320,3,1,""]},"evennia.utils.containers":{Container:[321,1,1,""],GlobalScriptContainer:[321,1,1,""],OptionContainer:[321,1,1,""]},"evennia.utils.containers.Container":{__init__:[321,3,1,""],all:[321,3,1,""],get:[321,3,1,""],load_data:[321,3,1,""],storage_modules:[321,4,1,""]},"evennia.utils.containers.GlobalScriptContainer":{__init__:[321,3,1,""],all:[321,3,1,""],get:[321,3,1,""],load_data:[321,3,1,""],start:[321,3,1,""]},"evennia.utils.containers.OptionContainer":{storage_modules:[321,4,1,""]},"evennia.utils.create":{create_account:[322,5,1,""],create_channel:[322,5,1,""],create_help_entry:[322,5,1,""],create_message:[322,5,1,""],create_object:[322,5,1,""],create_script:[322,5,1,""]},"evennia.utils.dbserialize":{dbserialize:[323,5,1,""],dbunserialize:[323,5,1,""],do_pickle:[323,5,1,""],do_unpickle:[323,5,1,""],from_pickle:[323,5,1,""],to_pickle:[323,5,1,""]},"evennia.utils.eveditor":{CmdEditorBase:[324,1,1,""],CmdEditorGroup:[324,1,1,""],CmdLineInput:[324,1,1,""],CmdSaveYesNo:[324,1,1,""],EvEditor:[324,1,1,""],EvEditorCmdSet:[324,1,1,""],SaveYesNoCmdSet:[324,1,1,""]},"evennia.utils.eveditor.CmdEditorBase":{aliases:[324,4,1,""],editor:[324,4,1,""],help_category:[324,4,1,""],help_entry:[324,4,1,""],key:[324,4,1,""],lock_storage:[324,4,1,""],locks:[324,4,1,""],parse:[324,3,1,""],search_index_entry:[324,4,1,""]},"evennia.utils.eveditor.CmdEditorGroup":{aliases:[324,4,1,""],arg_regex:[324,4,1,""],func:[324,3,1,""],help_category:[324,4,1,""],key:[324,4,1,""],lock_storage:[324,4,1,""],search_index_entry:[324,4,1,""]},"evennia.utils.eveditor.CmdLineInput":{aliases:[324,4,1,""],func:[324,3,1,""],help_category:[324,4,1,""],key:[324,4,1,""],lock_storage:[324,4,1,""],search_index_entry:[324,4,1,""]},"evennia.utils.eveditor.CmdSaveYesNo":{aliases:[324,4,1,""],func:[324,3,1,""],help_category:[324,4,1,""],help_cateogory:[324,4,1,""],key:[324,4,1,""],lock_storage:[324,4,1,""],locks:[324,4,1,""],search_index_entry:[324,4,1,""]},"evennia.utils.eveditor.EvEditor":{__init__:[324,3,1,""],decrease_indent:[324,3,1,""],deduce_indent:[324,3,1,""],display_buffer:[324,3,1,""],display_help:[324,3,1,""],get_buffer:[324,3,1,""],increase_indent:[324,3,1,""],load_buffer:[324,3,1,""],quit:[324,3,1,""],save_buffer:[324,3,1,""],swap_autoindent:[324,3,1,""],update_buffer:[324,3,1,""],update_undo:[324,3,1,""]},"evennia.utils.eveditor.EvEditorCmdSet":{at_cmdset_creation:[324,3,1,""],key:[324,4,1,""],mergetype:[324,4,1,""],path:[324,4,1,""]},"evennia.utils.eveditor.SaveYesNoCmdSet":{at_cmdset_creation:[324,3,1,""],key:[324,4,1,""],mergetype:[324,4,1,""],path:[324,4,1,""],priority:[324,4,1,""]},"evennia.utils.evform":{EvForm:[325,1,1,""]},"evennia.utils.evform.EvForm":{__init__:[325,3,1,""],map:[325,3,1,""],reload:[325,3,1,""]},"evennia.utils.evmenu":{CmdEvMenuNode:[326,1,1,""],CmdGetInput:[326,1,1,""],CmdTestMenu:[326,1,1,""],EvMenu:[326,1,1,""],EvMenuCmdSet:[326,1,1,""],EvMenuError:[326,2,1,""],InputCmdSet:[326,1,1,""],get_input:[326,5,1,""],list_node:[326,5,1,""],test_displayinput_node:[326,5,1,""],test_dynamic_node:[326,5,1,""],test_end_node:[326,5,1,""],test_look_node:[326,5,1,""],test_set_node:[326,5,1,""],test_start_node:[326,5,1,""],test_view_node:[326,5,1,""]},"evennia.utils.evmenu.CmdEvMenuNode":{aliases:[326,4,1,""],func:[326,3,1,""],help_category:[326,4,1,""],key:[326,4,1,""],lock_storage:[326,4,1,""],locks:[326,4,1,""],search_index_entry:[326,4,1,""]},"evennia.utils.evmenu.CmdGetInput":{aliases:[326,4,1,""],func:[326,3,1,""],help_category:[326,4,1,""],key:[326,4,1,""],lock_storage:[326,4,1,""],search_index_entry:[326,4,1,""]},"evennia.utils.evmenu.CmdTestMenu":{aliases:[326,4,1,""],func:[326,3,1,""],help_category:[326,4,1,""],key:[326,4,1,""],lock_storage:[326,4,1,""],search_index_entry:[326,4,1,""]},"evennia.utils.evmenu.EvMenu":{"goto":[326,3,1,""],__init__:[326,3,1,""],close_menu:[326,3,1,""],display_helptext:[326,3,1,""],display_nodetext:[326,3,1,""],extract_goto_exec:[326,3,1,""],helptext_formatter:[326,3,1,""],node_border_char:[326,4,1,""],node_formatter:[326,3,1,""],nodetext_formatter:[326,3,1,""],options_formatter:[326,3,1,""],parse_input:[326,3,1,""],print_debug_info:[326,3,1,""],run_exec:[326,3,1,""],run_exec_then_goto:[326,3,1,""]},"evennia.utils.evmenu.EvMenuCmdSet":{at_cmdset_creation:[326,3,1,""],key:[326,4,1,""],mergetype:[326,4,1,""],no_channels:[326,4,1,""],no_exits:[326,4,1,""],no_objs:[326,4,1,""],path:[326,4,1,""],priority:[326,4,1,""]},"evennia.utils.evmenu.InputCmdSet":{at_cmdset_creation:[326,3,1,""],key:[326,4,1,""],mergetype:[326,4,1,""],no_channels:[326,4,1,""],no_exits:[326,4,1,""],no_objs:[326,4,1,""],path:[326,4,1,""],priority:[326,4,1,""]},"evennia.utils.evmore":{CmdMore:[327,1,1,""],CmdMoreLook:[327,1,1,""],CmdSetMore:[327,1,1,""],EvMore:[327,1,1,""],msg:[327,5,1,""],queryset_maxsize:[327,5,1,""]},"evennia.utils.evmore.CmdMore":{aliases:[327,4,1,""],auto_help:[327,4,1,""],func:[327,3,1,""],help_category:[327,4,1,""],key:[327,4,1,""],lock_storage:[327,4,1,""],search_index_entry:[327,4,1,""]},"evennia.utils.evmore.CmdMoreLook":{aliases:[327,4,1,""],auto_help:[327,4,1,""],func:[327,3,1,""],help_category:[327,4,1,""],key:[327,4,1,""],lock_storage:[327,4,1,""],search_index_entry:[327,4,1,""]},"evennia.utils.evmore.CmdSetMore":{at_cmdset_creation:[327,3,1,""],key:[327,4,1,""],path:[327,4,1,""],priority:[327,4,1,""]},"evennia.utils.evmore.EvMore":{__init__:[327,3,1,""],display:[327,3,1,""],format_page:[327,3,1,""],init_evtable:[327,3,1,""],init_f_str:[327,3,1,""],init_iterable:[327,3,1,""],init_queryset:[327,3,1,""],init_str:[327,3,1,""],page_back:[327,3,1,""],page_end:[327,3,1,""],page_next:[327,3,1,""],page_quit:[327,3,1,""],page_top:[327,3,1,""],paginator_index:[327,3,1,""],paginator_slice:[327,3,1,""],start:[327,3,1,""]},"evennia.utils.evtable":{ANSITextWrapper:[328,1,1,""],EvCell:[328,1,1,""],EvColumn:[328,1,1,""],EvTable:[328,1,1,""],fill:[328,5,1,""],wrap:[328,5,1,""]},"evennia.utils.evtable.EvCell":{__init__:[328,3,1,""],get:[328,3,1,""],get_height:[328,3,1,""],get_min_height:[328,3,1,""],get_min_width:[328,3,1,""],get_width:[328,3,1,""],reformat:[328,3,1,""],replace_data:[328,3,1,""]},"evennia.utils.evtable.EvColumn":{__init__:[328,3,1,""],add_rows:[328,3,1,""],reformat:[328,3,1,""],reformat_cell:[328,3,1,""]},"evennia.utils.evtable.EvTable":{__init__:[328,3,1,""],add_column:[328,3,1,""],add_header:[328,3,1,""],add_row:[328,3,1,""],get:[328,3,1,""],reformat:[328,3,1,""],reformat_column:[328,3,1,""]},"evennia.utils.gametime":{TimeScript:[329,1,1,""],game_epoch:[329,5,1,""],gametime:[329,5,1,""],portal_uptime:[329,5,1,""],real_seconds_until:[329,5,1,""],reset_gametime:[329,5,1,""],runtime:[329,5,1,""],schedule:[329,5,1,""],server_epoch:[329,5,1,""],uptime:[329,5,1,""]},"evennia.utils.gametime.TimeScript":{DoesNotExist:[329,2,1,""],MultipleObjectsReturned:[329,2,1,""],at_repeat:[329,3,1,""],at_script_creation:[329,3,1,""],path:[329,4,1,""],typename:[329,4,1,""]},"evennia.utils.idmapper":{manager:[331,0,0,"-"],models:[332,0,0,"-"],tests:[333,0,0,"-"]},"evennia.utils.idmapper.manager":{SharedMemoryManager:[331,1,1,""]},"evennia.utils.idmapper.manager.SharedMemoryManager":{get:[331,3,1,""]},"evennia.utils.idmapper.models":{SharedMemoryModel:[332,1,1,""],SharedMemoryModelBase:[332,1,1,""],WeakSharedMemoryModel:[332,1,1,""],WeakSharedMemoryModelBase:[332,1,1,""],cache_size:[332,5,1,""],conditional_flush:[332,5,1,""],flush_cache:[332,5,1,""],flush_cached_instance:[332,5,1,""],update_cached_instance:[332,5,1,""]},"evennia.utils.idmapper.models.SharedMemoryModel":{"delete":[332,3,1,""],Meta:[332,1,1,""],at_idmapper_flush:[332,3,1,""],cache_instance:[332,3,1,""],flush_cached_instance:[332,3,1,""],flush_from_cache:[332,3,1,""],flush_instance_cache:[332,3,1,""],get_all_cached_instances:[332,3,1,""],get_cached_instance:[332,3,1,""],objects:[332,4,1,""],path:[332,4,1,""],save:[332,3,1,""],typename:[332,4,1,""]},"evennia.utils.idmapper.models.SharedMemoryModel.Meta":{"abstract":[332,4,1,""]},"evennia.utils.idmapper.models.WeakSharedMemoryModel":{Meta:[332,1,1,""],path:[332,4,1,""],typename:[332,4,1,""]},"evennia.utils.idmapper.models.WeakSharedMemoryModel.Meta":{"abstract":[332,4,1,""]},"evennia.utils.idmapper.tests":{Article:[333,1,1,""],Category:[333,1,1,""],RegularArticle:[333,1,1,""],RegularCategory:[333,1,1,""],SharedMemorysTest:[333,1,1,""]},"evennia.utils.idmapper.tests.Article":{DoesNotExist:[333,2,1,""],MultipleObjectsReturned:[333,2,1,""],category2:[333,4,1,""],category2_id:[333,4,1,""],category:[333,4,1,""],category_id:[333,4,1,""],id:[333,4,1,""],name:[333,4,1,""],path:[333,4,1,""],typename:[333,4,1,""]},"evennia.utils.idmapper.tests.Category":{DoesNotExist:[333,2,1,""],MultipleObjectsReturned:[333,2,1,""],article_set:[333,4,1,""],id:[333,4,1,""],name:[333,4,1,""],path:[333,4,1,""],regulararticle_set:[333,4,1,""],typename:[333,4,1,""]},"evennia.utils.idmapper.tests.RegularArticle":{DoesNotExist:[333,2,1,""],MultipleObjectsReturned:[333,2,1,""],category2:[333,4,1,""],category2_id:[333,4,1,""],category:[333,4,1,""],category_id:[333,4,1,""],id:[333,4,1,""],name:[333,4,1,""],objects:[333,4,1,""]},"evennia.utils.idmapper.tests.RegularCategory":{DoesNotExist:[333,2,1,""],MultipleObjectsReturned:[333,2,1,""],article_set:[333,4,1,""],id:[333,4,1,""],name:[333,4,1,""],objects:[333,4,1,""],regulararticle_set:[333,4,1,""]},"evennia.utils.idmapper.tests.SharedMemorysTest":{setUp:[333,3,1,""],testMixedReferences:[333,3,1,""],testObjectDeletion:[333,3,1,""],testRegularReferences:[333,3,1,""],testSharedMemoryReferences:[333,3,1,""]},"evennia.utils.inlinefuncs":{"null":[334,5,1,""],InlinefuncError:[334,2,1,""],NickTemplateInvalid:[334,2,1,""],ParseStack:[334,1,1,""],clr:[334,5,1,""],crop:[334,5,1,""],initialize_nick_templates:[334,5,1,""],nomatch:[334,5,1,""],pad:[334,5,1,""],parse_inlinefunc:[334,5,1,""],parse_nick_template:[334,5,1,""],random:[334,5,1,""],raw:[334,5,1,""],space:[334,5,1,""]},"evennia.utils.inlinefuncs.ParseStack":{__init__:[334,3,1,""],append:[334,3,1,""]},"evennia.utils.logger":{EvenniaLogFile:[335,1,1,""],PortalLogObserver:[335,1,1,""],ServerLogObserver:[335,1,1,""],WeeklyLogFile:[335,1,1,""],log_dep:[335,5,1,""],log_depmsg:[335,5,1,""],log_err:[335,5,1,""],log_errmsg:[335,5,1,""],log_file:[335,5,1,""],log_info:[335,5,1,""],log_infomsg:[335,5,1,""],log_msg:[335,5,1,""],log_sec:[335,5,1,""],log_secmsg:[335,5,1,""],log_server:[335,5,1,""],log_trace:[335,5,1,""],log_tracemsg:[335,5,1,""],log_warn:[335,5,1,""],log_warnmsg:[335,5,1,""],tail_log_file:[335,5,1,""],timeformat:[335,5,1,""]},"evennia.utils.logger.EvenniaLogFile":{num_lines_to_append:[335,4,1,""],readlines:[335,3,1,""],rotate:[335,3,1,""],seek:[335,3,1,""],settings:[335,4,1,""]},"evennia.utils.logger.PortalLogObserver":{emit:[335,3,1,""],prefix:[335,4,1,""],timeFormat:[335,4,1,""]},"evennia.utils.logger.ServerLogObserver":{prefix:[335,4,1,""]},"evennia.utils.logger.WeeklyLogFile":{__init__:[335,3,1,""],shouldRotate:[335,3,1,""],suffix:[335,3,1,""],write:[335,3,1,""]},"evennia.utils.optionclasses":{BaseOption:[336,1,1,""],Boolean:[336,1,1,""],Color:[336,1,1,""],Datetime:[336,1,1,""],Duration:[336,1,1,""],Email:[336,1,1,""],Future:[336,1,1,""],Lock:[336,1,1,""],PositiveInteger:[336,1,1,""],SignedInteger:[336,1,1,""],Text:[336,1,1,""],Timezone:[336,1,1,""],UnsignedInteger:[336,1,1,""]},"evennia.utils.optionclasses.BaseOption":{"default":[336,3,1,""],__init__:[336,3,1,""],changed:[336,3,1,""],deserialize:[336,3,1,""],display:[336,3,1,""],load:[336,3,1,""],save:[336,3,1,""],serialize:[336,3,1,""],set:[336,3,1,""],validate:[336,3,1,""],value:[336,3,1,""]},"evennia.utils.optionclasses.Boolean":{deserialize:[336,3,1,""],display:[336,3,1,""],serialize:[336,3,1,""],validate:[336,3,1,""]},"evennia.utils.optionclasses.Color":{deserialize:[336,3,1,""],display:[336,3,1,""],validate:[336,3,1,""]},"evennia.utils.optionclasses.Datetime":{deserialize:[336,3,1,""],serialize:[336,3,1,""],validate:[336,3,1,""]},"evennia.utils.optionclasses.Duration":{deserialize:[336,3,1,""],serialize:[336,3,1,""],validate:[336,3,1,""]},"evennia.utils.optionclasses.Email":{deserialize:[336,3,1,""],validate:[336,3,1,""]},"evennia.utils.optionclasses.Future":{validate:[336,3,1,""]},"evennia.utils.optionclasses.Lock":{validate:[336,3,1,""]},"evennia.utils.optionclasses.PositiveInteger":{deserialize:[336,3,1,""],validate:[336,3,1,""]},"evennia.utils.optionclasses.SignedInteger":{deserialize:[336,3,1,""],validate:[336,3,1,""]},"evennia.utils.optionclasses.Text":{deserialize:[336,3,1,""]},"evennia.utils.optionclasses.Timezone":{"default":[336,3,1,""],deserialize:[336,3,1,""],serialize:[336,3,1,""],validate:[336,3,1,""]},"evennia.utils.optionclasses.UnsignedInteger":{deserialize:[336,3,1,""],validate:[336,3,1,""],validator_key:[336,4,1,""]},"evennia.utils.optionhandler":{InMemorySaveHandler:[337,1,1,""],OptionHandler:[337,1,1,""]},"evennia.utils.optionhandler.InMemorySaveHandler":{__init__:[337,3,1,""],add:[337,3,1,""],get:[337,3,1,""]},"evennia.utils.optionhandler.OptionHandler":{__init__:[337,3,1,""],all:[337,3,1,""],get:[337,3,1,""],set:[337,3,1,""]},"evennia.utils.picklefield":{PickledFormField:[338,1,1,""],PickledObject:[338,1,1,""],PickledObjectField:[338,1,1,""],PickledWidget:[338,1,1,""],dbsafe_decode:[338,5,1,""],dbsafe_encode:[338,5,1,""],wrap_conflictual_object:[338,5,1,""]},"evennia.utils.picklefield.PickledFormField":{__init__:[338,3,1,""],clean:[338,3,1,""],default_error_messages:[338,4,1,""],widget:[338,4,1,""]},"evennia.utils.picklefield.PickledObjectField":{__init__:[338,3,1,""],formfield:[338,3,1,""],from_db_value:[338,3,1,""],get_db_prep_lookup:[338,3,1,""],get_db_prep_value:[338,3,1,""],get_default:[338,3,1,""],get_internal_type:[338,3,1,""],pre_save:[338,3,1,""],value_to_string:[338,3,1,""]},"evennia.utils.picklefield.PickledWidget":{media:[338,3,1,""],render:[338,3,1,""],value_from_datadict:[338,3,1,""]},"evennia.utils.search":{search_account:[339,5,1,""],search_account_tag:[339,5,1,""],search_channel:[339,5,1,""],search_channel_tag:[339,5,1,""],search_help_entry:[339,5,1,""],search_message:[339,5,1,""],search_object:[339,5,1,""],search_script:[339,5,1,""],search_script_tag:[339,5,1,""],search_tag:[339,5,1,""]},"evennia.utils.test_resources":{EvenniaTest:[340,1,1,""],LocalEvenniaTest:[340,1,1,""],mockdeferLater:[340,5,1,""],mockdelay:[340,5,1,""],unload_module:[340,5,1,""]},"evennia.utils.test_resources.EvenniaTest":{account_typeclass:[340,4,1,""],character_typeclass:[340,4,1,""],exit_typeclass:[340,4,1,""],object_typeclass:[340,4,1,""],room_typeclass:[340,4,1,""],script_typeclass:[340,4,1,""],setUp:[340,3,1,""],tearDown:[340,3,1,""]},"evennia.utils.test_resources.LocalEvenniaTest":{account_typeclass:[340,4,1,""],character_typeclass:[340,4,1,""],exit_typeclass:[340,4,1,""],object_typeclass:[340,4,1,""],room_typeclass:[340,4,1,""],script_typeclass:[340,4,1,""]},"evennia.utils.text2html":{TextToHTMLparser:[341,1,1,""],parse_html:[341,5,1,""]},"evennia.utils.text2html.TextToHTMLparser":{bg_colormap:[341,4,1,""],bgfgstart:[341,4,1,""],bgfgstop:[341,4,1,""],bgstart:[341,4,1,""],bgstop:[341,4,1,""],blink:[341,4,1,""],colorback:[341,4,1,""],colorcodes:[341,4,1,""],convert_linebreaks:[341,3,1,""],convert_urls:[341,3,1,""],fg_colormap:[341,4,1,""],fgstart:[341,4,1,""],fgstop:[341,4,1,""],hilite:[341,4,1,""],inverse:[341,4,1,""],normal:[341,4,1,""],parse:[341,3,1,""],re_bgfg:[341,4,1,""],re_bgs:[341,4,1,""],re_blink:[341,4,1,""],re_blinking:[341,3,1,""],re_bold:[341,3,1,""],re_color:[341,3,1,""],re_dblspace:[341,4,1,""],re_double_space:[341,3,1,""],re_fgs:[341,4,1,""],re_hilite:[341,4,1,""],re_inverse:[341,4,1,""],re_inversing:[341,3,1,""],re_mxplink:[341,4,1,""],re_normal:[341,4,1,""],re_string:[341,4,1,""],re_uline:[341,4,1,""],re_underline:[341,3,1,""],re_unhilite:[341,4,1,""],re_url:[341,4,1,""],remove_backspaces:[341,3,1,""],remove_bells:[341,3,1,""],sub_dblspace:[341,3,1,""],sub_mxp_links:[341,3,1,""],sub_text:[341,3,1,""],tabstop:[341,4,1,""],underline:[341,4,1,""],unhilite:[341,4,1,""]},"evennia.utils.utils":{LimitedSizeOrderedDict:[342,1,1,""],all_from_module:[342,5,1,""],at_search_result:[342,5,1,""],callables_from_module:[342,5,1,""],calledby:[342,5,1,""],check_evennia_dependencies:[342,5,1,""],class_from_module:[342,5,1,""],columnize:[342,5,1,""],crop:[342,5,1,""],datetime_format:[342,5,1,""],dbid_to_obj:[342,5,1,""],dbref:[342,5,1,""],dbref_to_obj:[342,5,1,""],dedent:[342,5,1,""],deepsize:[342,5,1,""],delay:[342,5,1,""],display_len:[342,5,1,""],fill:[342,5,1,""],format_grid:[342,5,1,""],format_table:[342,5,1,""],fuzzy_import_from_module:[342,5,1,""],get_all_typeclasses:[342,5,1,""],get_evennia_pids:[342,5,1,""],get_evennia_version:[342,5,1,""],get_game_dir_path:[342,5,1,""],has_parent:[342,5,1,""],host_os_is:[342,5,1,""],inherits_from:[342,5,1,""],init_new_account:[342,5,1,""],interactive:[342,5,1,""],is_iter:[342,5,1,""],iter_to_string:[342,5,1,""],justify:[342,5,1,""],latinify:[342,5,1,""],lazy_property:[342,1,1,""],list_to_string:[342,5,1,""],m_len:[342,5,1,""],make_iter:[342,5,1,""],mod_import:[342,5,1,""],mod_import_from_path:[342,5,1,""],object_from_module:[342,5,1,""],pad:[342,5,1,""],percent:[342,5,1,""],percentile:[342,5,1,""],pypath_to_realpath:[342,5,1,""],random_string_from_module:[342,5,1,""],run_async:[342,5,1,""],server_services:[342,5,1,""],string_from_module:[342,5,1,""],string_partial_matching:[342,5,1,""],string_similarity:[342,5,1,""],string_suggestions:[342,5,1,""],strip_control_sequences:[342,5,1,""],time_format:[342,5,1,""],to_bytes:[342,5,1,""],to_str:[342,5,1,""],uses_database:[342,5,1,""],validate_email_address:[342,5,1,""],variable_from_module:[342,5,1,""],wildcard_to_regexp:[342,5,1,""],wrap:[342,5,1,""]},"evennia.utils.utils.LimitedSizeOrderedDict":{__init__:[342,3,1,""],update:[342,3,1,""]},"evennia.utils.utils.lazy_property":{__init__:[342,3,1,""]},"evennia.utils.validatorfuncs":{"boolean":[343,5,1,""],color:[343,5,1,""],datetime:[343,5,1,""],duration:[343,5,1,""],email:[343,5,1,""],future:[343,5,1,""],lock:[343,5,1,""],positive_integer:[343,5,1,""],signed_integer:[343,5,1,""],text:[343,5,1,""],timezone:[343,5,1,""],unsigned_integer:[343,5,1,""]},"evennia.web":{urls:[345,0,0,"-"],utils:[346,0,0,"-"],webclient:[351,0,0,"-"],website:[354,0,0,"-"]},"evennia.web.utils":{backends:[347,0,0,"-"],general_context:[348,0,0,"-"],middleware:[349,0,0,"-"],tests:[350,0,0,"-"]},"evennia.web.utils.backends":{CaseInsensitiveModelBackend:[347,1,1,""]},"evennia.web.utils.backends.CaseInsensitiveModelBackend":{authenticate:[347,3,1,""]},"evennia.web.utils.general_context":{general_context:[348,5,1,""],set_game_name_and_slogan:[348,5,1,""],set_webclient_settings:[348,5,1,""]},"evennia.web.utils.middleware":{SharedLoginMiddleware:[349,1,1,""]},"evennia.web.utils.middleware.SharedLoginMiddleware":{__init__:[349,3,1,""],make_shared_login:[349,3,1,""]},"evennia.web.utils.tests":{TestGeneralContext:[350,1,1,""]},"evennia.web.utils.tests.TestGeneralContext":{maxDiff:[350,4,1,""],test_general_context:[350,3,1,""],test_set_game_name_and_slogan:[350,3,1,""],test_set_webclient_settings:[350,3,1,""]},"evennia.web.webclient":{urls:[352,0,0,"-"],views:[353,0,0,"-"]},"evennia.web.webclient.views":{webclient:[353,5,1,""]},"evennia.web.website":{forms:[355,0,0,"-"],templatetags:[356,0,0,"-"],tests:[358,0,0,"-"],urls:[359,0,0,"-"],views:[360,0,0,"-"]},"evennia.web.website.forms":{AccountForm:[355,1,1,""],CharacterForm:[355,1,1,""],CharacterUpdateForm:[355,1,1,""],EvenniaForm:[355,1,1,""],ObjectForm:[355,1,1,""]},"evennia.web.website.forms.AccountForm":{Meta:[355,1,1,""],base_fields:[355,4,1,""],declared_fields:[355,4,1,""],media:[355,3,1,""]},"evennia.web.website.forms.AccountForm.Meta":{field_classes:[355,4,1,""],fields:[355,4,1,""],model:[355,4,1,""]},"evennia.web.website.forms.CharacterForm":{Meta:[355,1,1,""],base_fields:[355,4,1,""],declared_fields:[355,4,1,""],media:[355,3,1,""]},"evennia.web.website.forms.CharacterForm.Meta":{fields:[355,4,1,""],labels:[355,4,1,""],model:[355,4,1,""]},"evennia.web.website.forms.CharacterUpdateForm":{base_fields:[355,4,1,""],declared_fields:[355,4,1,""],media:[355,3,1,""]},"evennia.web.website.forms.EvenniaForm":{base_fields:[355,4,1,""],clean:[355,3,1,""],declared_fields:[355,4,1,""],media:[355,3,1,""]},"evennia.web.website.forms.ObjectForm":{Meta:[355,1,1,""],base_fields:[355,4,1,""],declared_fields:[355,4,1,""],media:[355,3,1,""]},"evennia.web.website.forms.ObjectForm.Meta":{fields:[355,4,1,""],labels:[355,4,1,""],model:[355,4,1,""]},"evennia.web.website.templatetags":{addclass:[357,0,0,"-"]},"evennia.web.website.templatetags.addclass":{addclass:[357,5,1,""]},"evennia.web.website.tests":{AdminTest:[358,1,1,""],ChannelDetailTest:[358,1,1,""],ChannelListTest:[358,1,1,""],CharacterCreateView:[358,1,1,""],CharacterDeleteView:[358,1,1,""],CharacterListView:[358,1,1,""],CharacterManageView:[358,1,1,""],CharacterPuppetView:[358,1,1,""],CharacterUpdateView:[358,1,1,""],EvenniaWebTest:[358,1,1,""],IndexTest:[358,1,1,""],LoginTest:[358,1,1,""],LogoutTest:[358,1,1,""],PasswordResetTest:[358,1,1,""],RegisterTest:[358,1,1,""],WebclientTest:[358,1,1,""]},"evennia.web.website.tests.AdminTest":{unauthenticated_response:[358,4,1,""],url_name:[358,4,1,""]},"evennia.web.website.tests.ChannelDetailTest":{get_kwargs:[358,3,1,""],setUp:[358,3,1,""],url_name:[358,4,1,""]},"evennia.web.website.tests.ChannelListTest":{url_name:[358,4,1,""]},"evennia.web.website.tests.CharacterCreateView":{test_valid_access_multisession_0:[358,3,1,""],test_valid_access_multisession_2:[358,3,1,""],unauthenticated_response:[358,4,1,""],url_name:[358,4,1,""]},"evennia.web.website.tests.CharacterDeleteView":{get_kwargs:[358,3,1,""],test_invalid_access:[358,3,1,""],test_valid_access:[358,3,1,""],unauthenticated_response:[358,4,1,""],url_name:[358,4,1,""]},"evennia.web.website.tests.CharacterListView":{unauthenticated_response:[358,4,1,""],url_name:[358,4,1,""]},"evennia.web.website.tests.CharacterManageView":{unauthenticated_response:[358,4,1,""],url_name:[358,4,1,""]},"evennia.web.website.tests.CharacterPuppetView":{get_kwargs:[358,3,1,""],test_invalid_access:[358,3,1,""],unauthenticated_response:[358,4,1,""],url_name:[358,4,1,""]},"evennia.web.website.tests.CharacterUpdateView":{get_kwargs:[358,3,1,""],test_invalid_access:[358,3,1,""],test_valid_access:[358,3,1,""],unauthenticated_response:[358,4,1,""],url_name:[358,4,1,""]},"evennia.web.website.tests.EvenniaWebTest":{account_typeclass:[358,4,1,""],authenticated_response:[358,4,1,""],channel_typeclass:[358,4,1,""],character_typeclass:[358,4,1,""],exit_typeclass:[358,4,1,""],get_kwargs:[358,3,1,""],login:[358,3,1,""],object_typeclass:[358,4,1,""],room_typeclass:[358,4,1,""],script_typeclass:[358,4,1,""],setUp:[358,3,1,""],test_get:[358,3,1,""],test_get_authenticated:[358,3,1,""],test_valid_chars:[358,3,1,""],unauthenticated_response:[358,4,1,""],url_name:[358,4,1,""]},"evennia.web.website.tests.IndexTest":{url_name:[358,4,1,""]},"evennia.web.website.tests.LoginTest":{url_name:[358,4,1,""]},"evennia.web.website.tests.LogoutTest":{url_name:[358,4,1,""]},"evennia.web.website.tests.PasswordResetTest":{unauthenticated_response:[358,4,1,""],url_name:[358,4,1,""]},"evennia.web.website.tests.RegisterTest":{url_name:[358,4,1,""]},"evennia.web.website.tests.WebclientTest":{test_get:[358,3,1,""],test_get_disabled:[358,3,1,""],url_name:[358,4,1,""]},"evennia.web.website.views":{AccountCreateView:[360,1,1,""],AccountMixin:[360,1,1,""],ChannelDetailView:[360,1,1,""],ChannelListView:[360,1,1,""],ChannelMixin:[360,1,1,""],CharacterCreateView:[360,1,1,""],CharacterDeleteView:[360,1,1,""],CharacterDetailView:[360,1,1,""],CharacterListView:[360,1,1,""],CharacterManageView:[360,1,1,""],CharacterMixin:[360,1,1,""],CharacterPuppetView:[360,1,1,""],CharacterUpdateView:[360,1,1,""],EvenniaCreateView:[360,1,1,""],EvenniaDeleteView:[360,1,1,""],EvenniaDetailView:[360,1,1,""],EvenniaIndexView:[360,1,1,""],EvenniaUpdateView:[360,1,1,""],HelpDetailView:[360,1,1,""],HelpListView:[360,1,1,""],HelpMixin:[360,1,1,""],ObjectCreateView:[360,1,1,""],ObjectDeleteView:[360,1,1,""],ObjectDetailView:[360,1,1,""],ObjectUpdateView:[360,1,1,""],TypeclassMixin:[360,1,1,""],admin_wrapper:[360,5,1,""],evennia_admin:[360,5,1,""],to_be_implemented:[360,5,1,""]},"evennia.web.website.views.AccountCreateView":{form_valid:[360,3,1,""],success_url:[360,4,1,""],template_name:[360,4,1,""]},"evennia.web.website.views.AccountMixin":{form_class:[360,4,1,""],model:[360,4,1,""]},"evennia.web.website.views.ChannelDetailView":{attributes:[360,4,1,""],get_context_data:[360,3,1,""],get_object:[360,3,1,""],max_num_lines:[360,4,1,""],template_name:[360,4,1,""]},"evennia.web.website.views.ChannelListView":{get_context_data:[360,3,1,""],max_popular:[360,4,1,""],page_title:[360,4,1,""],paginate_by:[360,4,1,""],template_name:[360,4,1,""]},"evennia.web.website.views.ChannelMixin":{access_type:[360,4,1,""],get_queryset:[360,3,1,""],model:[360,4,1,""],page_title:[360,4,1,""]},"evennia.web.website.views.CharacterCreateView":{form_valid:[360,3,1,""],template_name:[360,4,1,""]},"evennia.web.website.views.CharacterDetailView":{access_type:[360,4,1,""],attributes:[360,4,1,""],get_queryset:[360,3,1,""],template_name:[360,4,1,""]},"evennia.web.website.views.CharacterListView":{access_type:[360,4,1,""],get_queryset:[360,3,1,""],page_title:[360,4,1,""],paginate_by:[360,4,1,""],template_name:[360,4,1,""]},"evennia.web.website.views.CharacterManageView":{page_title:[360,4,1,""],paginate_by:[360,4,1,""],template_name:[360,4,1,""]},"evennia.web.website.views.CharacterMixin":{form_class:[360,4,1,""],get_queryset:[360,3,1,""],model:[360,4,1,""],success_url:[360,4,1,""]},"evennia.web.website.views.CharacterPuppetView":{get_redirect_url:[360,3,1,""]},"evennia.web.website.views.CharacterUpdateView":{form_class:[360,4,1,""],template_name:[360,4,1,""]},"evennia.web.website.views.EvenniaCreateView":{page_title:[360,3,1,""]},"evennia.web.website.views.EvenniaDeleteView":{page_title:[360,3,1,""]},"evennia.web.website.views.EvenniaDetailView":{page_title:[360,3,1,""]},"evennia.web.website.views.EvenniaIndexView":{get_context_data:[360,3,1,""],template_name:[360,4,1,""]},"evennia.web.website.views.EvenniaUpdateView":{page_title:[360,3,1,""]},"evennia.web.website.views.HelpDetailView":{get_context_data:[360,3,1,""],get_object:[360,3,1,""],template_name:[360,4,1,""]},"evennia.web.website.views.HelpListView":{page_title:[360,4,1,""],paginate_by:[360,4,1,""],template_name:[360,4,1,""]},"evennia.web.website.views.HelpMixin":{get_queryset:[360,3,1,""],model:[360,4,1,""],page_title:[360,4,1,""]},"evennia.web.website.views.ObjectCreateView":{model:[360,4,1,""]},"evennia.web.website.views.ObjectDeleteView":{"delete":[360,3,1,""],access_type:[360,4,1,""],model:[360,4,1,""],template_name:[360,4,1,""]},"evennia.web.website.views.ObjectDetailView":{access_type:[360,4,1,""],attributes:[360,4,1,""],get_context_data:[360,3,1,""],get_object:[360,3,1,""],model:[360,4,1,""],template_name:[360,4,1,""]},"evennia.web.website.views.ObjectUpdateView":{access_type:[360,4,1,""],form_valid:[360,3,1,""],get_initial:[360,3,1,""],get_success_url:[360,3,1,""],model:[360,4,1,""]},"evennia.web.website.views.TypeclassMixin":{typeclass:[360,3,1,""]},evennia:{accounts:[142,0,0,"-"],commands:[148,0,0,"-"],comms:[171,0,0,"-"],contrib:[177,0,0,"-"],help:[234,0,0,"-"],locks:[238,0,0,"-"],objects:[241,0,0,"-"],prototypes:[246,0,0,"-"],scripts:[251,0,0,"-"],server:[260,0,0,"-"],set_trace:[140,5,1,""],settings_default:[311,0,0,"-"],typeclasses:[312,0,0,"-"],utils:[318,0,0,"-"],web:[344,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","exception","Python exception"],"3":["py","method","Python method"],"4":["py","attribute","Python attribute"],"5":["py","function","Python function"],"6":["py","data","Python data"]},objtypes:{"0":"py:module","1":"py:class","2":"py:exception","3":"py:method","4":"py:attribute","5":"py:function","6":"py:data"},terms:{"001s":126,"010S":25,"015public":25,"020t":25,"030a":25,"040f":25,"050f":25,"0b16":24,"0d0":55,"0x045a0990":41,"0x852be2c":58,"100m":341,"100mb":89,"101m":341,"102m":341,"103m":341,"104m":341,"105m":341,"106m":341,"107m":341,"108m":341,"109m":341,"10m":66,"110m":341,"111m":341,"112m":341,"113m":341,"114m":341,"115m":341,"116m":341,"117m":341,"118m":341,"119m":341,"120m":341,"121m":341,"122m":341,"123dark":80,"123m":341,"124m":341,"125m":341,"126m":341,"127m":341,"128m":341,"129m":341,"12s":27,"130m":341,"131m":341,"132m":341,"133m":341,"134m":341,"135m":341,"136m":341,"137m":341,"138m":341,"139m":341,"140m":341,"141m":341,"142m":341,"143m":341,"144m":341,"145m":341,"146m":341,"147m":341,"148m":341,"149m":341,"150m":341,"151m":341,"152m":341,"153m":341,"154m":341,"155m":341,"156m":341,"156s":126,"157m":341,"158m":341,"159m":341,"160m":341,"161m":341,"162m":341,"163m":341,"164m":341,"165m":341,"166m":341,"167m":341,"168m":341,"169m":341,"16m":341,"170m":341,"171m":341,"172m":341,"173m":341,"174m":341,"175m":341,"176m":341,"177m":341,"178m":341,"179m":341,"17m":341,"180m":341,"181m":341,"182m":341,"183m":341,"184m":341,"185m":341,"186m":341,"187m":341,"188m":341,"189m":341,"18m":341,"190m":341,"191m":341,"192m":341,"193m":341,"194m":341,"195m":341,"196m":341,"197m":341,"198m":341,"199m":341,"19m":341,"1_7":126,"1d100":[72,184],"1d2":55,"1d6":72,"1gb":89,"1st":61,"200m":341,"201m":341,"2020_01_29":335,"2020_01_29__1":335,"2020_01_29__2":335,"202m":341,"203m":341,"204m":341,"205m":341,"206m":341,"207m":341,"208m":341,"209m":341,"20m":341,"210m":341,"211m":341,"212m":341,"213m":341,"214m":341,"215m":341,"216m":341,"217m":341,"218m":341,"219m":341,"21m":341,"220m":341,"221m":341,"222m":341,"223m":341,"224m":341,"225m":341,"226m":341,"227m":341,"228m":341,"229m":341,"22m":[319,341],"22nd":342,"230m":341,"231m":341,"232m":341,"233m":341,"234m":341,"235m":341,"236m":341,"237m":341,"238m":341,"239m":341,"23m":341,"240m":341,"241m":341,"242m":341,"243m":341,"244m":341,"245m":341,"246m":341,"247m":341,"248m":341,"249m":341,"24m":341,"250m":341,"251m":341,"252m":341,"253m":341,"254m":341,"255m":341,"25m":341,"26m":341,"27m":341,"28gmcp":289,"28m":341,"29m":341,"2d6":[57,184],"2gb":89,"30m":[319,341],"31m":[319,341],"31st":61,"32bit":[24,62],"32m":[319,341],"32nd":57,"33m":[319,341],"34m":[319,341],"35m":[319,341],"36m":[319,341],"37m":[319,341],"38m":341,"39m":341,"3c3ccec30f037be174d3":342,"3d6":184,"3rd":61,"40m":[319,341],"41m":[319,341],"42m":[319,341],"43m":[319,341],"44m":[319,341],"45m":[27,319,341],"46m":[319,341],"47m":[319,341],"48m":341,"49m":341,"4er43233fwefwfw":9,"4th":78,"50m":341,"50mb":89,"51m":341,"52m":341,"53m":341,"54m":341,"550n":25,"551e":25,"552w":25,"553b":25,"554i":25,"555e":25,"55m":341,"56m":341,"57m":341,"58m":341,"59m":341,"5d5":55,"5x5":110,"60m":341,"61m":341,"62m":341,"63m":341,"64m":341,"65m":341,"66m":341,"67m":341,"68m":341,"69m":341,"6d6":55,"70m":341,"71m":341,"72m":341,"73m":341,"74m":341,"75m":341,"76m":341,"77m":341,"78m":341,"79m":341,"80m":341,"81m":341,"82m":341,"83m":341,"84m":341,"85m":341,"86m":341,"87m":341,"88m":341,"89m":341,"8f64fec2670c":89,"90m":341,"90s":343,"91m":341,"92m":341,"93m":341,"94m":341,"95m":341,"96m":341,"97m":341,"98m":341,"99m":341,"\u6d4b\u8bd5":25,"abstract":[46,63,85,118,220,314,315,316,332,336,342],"boolean":[13,33,132,136,153,184,187,240,245,248,257,285,314,319,320,336,343],"break":[10,12,14,30,37,41,53,56,57,60,90,95,102,107,110,113,124,136,140,166,167,201,223,225,274,327,342],"byte":[15,27,93,112,267,274,276,285,293,342],"case":[1,6,8,10,11,12,13,14,15,21,22,25,27,28,29,31,33,34,37,39,40,41,42,43,45,48,50,54,57,58,59,60,61,63,68,73,78,79,80,81,82,85,87,88,90,94,95,99,101,102,104,106,107,108,109,110,112,113,115,118,119,120,122,124,126,127,130,132,136,143,145,150,152,155,158,164,166,167,173,174,175,178,179,181,184,186,187,195,203,205,210,231,236,237,239,240,245,254,256,270,274,278,282,296,303,306,314,315,316,317,319,321,332,339,342,347],"catch":[15,26,27,30,42,57,86,90,96,101,114,117,145,164,231,255,265,270,277,303,304,324,332,335,338,360],"char":[42,55,57,70,72,84,87,104,110,115,116,118,119,132,143,158,164,188,231,245,262,275,288,289,310,319,325,328],"class":[1,2,3,5,6,10,11,12,16,17,20,21,25,26,28,29,30,31,38,39,41,42,43,46,48,49,50,51,54,55,56,57,59,60,61,63,67,70,72,76,80,81,84,85,88,90,96,101,104,108,115,116,117,118,119,120,122,123,131,132,133,134,143,144,145,146,147,148,151,152,153,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,172,173,174,175,176,178,179,180,181,183,184,185,186,187,188,191,192,194,195,196,197,198,199,200,201,202,203,204,205,209,210,211,212,213,214,216,217,218,219,220,222,223,225,226,227,229,230,231,232,233,235,236,237,240,241,242,243,244,245,247,249,250,252,253,254,255,256,257,258,259,261,262,263,265,267,268,271,272,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,296,298,301,303,304,305,306,308,309,310,312,313,314,315,316,317,319,320,321,322,323,324,325,326,327,328,329,331,332,333,334,335,336,337,338,339,340,341,342,347,349,350,355,358,360],"const":232,"default":[0,1,2,3,4,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,27,29,31,32,33,34,35,36,38,39,40,41,44,45,46,48,49,50,52,55,56,57,58,61,62,63,64,65,66,67,68,70,71,74,75,76,80,81,82,84,85,86,87,88,89,90,92,94,95,96,99,100,101,102,103,104,105,106,108,110,111,112,113,115,116,117,118,120,122,123,124,125,126,127,128,130,132,133,134,135,137,138,139,140,141,143,144,145,147,148,149,150,151,152,153,174,176,178,179,180,181,182,183,184,185,186,187,188,189,192,194,195,196,198,199,201,202,204,205,208,209,211,212,213,214,216,217,218,219,220,223,229,231,232,233,234,236,237,238,240,245,249,250,254,255,257,259,263,265,267,269,270,271,275,287,288,289,294,296,297,303,304,305,306,310,311,314,315,316,317,319,321,322,324,326,327,328,331,332,334,335,336,337,338,339,342,343,347,355,360,362],"export":74,"final":[10,23,26,27,29,33,36,38,40,42,57,62,67,68,69,72,75,79,82,84,85,101,102,104,108,113,115,122,124,125,126,132,133,135,136,149,150,158,167,184,214,240,250,302,306,319,321,326,327,334],"float":[48,145,183,193,194,197,248,258,265,277,315,329,334,338,342],"function":[3,4,5,6,9,10,11,13,14,18,19,20,21,23,25,26,27,29,33,34,37,39,40,42,43,45,47,49,50,51,54,56,57,58,59,60,61,62,63,67,68,72,73,74,76,80,81,82,84,85,87,90,92,95,103,105,106,107,108,109,110,114,117,118,120,121,122,123,124,126,127,132,133,134,136,137,139,140,143,147,150,152,153,155,156,157,158,159,163,164,165,166,168,169,174,175,178,179,180,183,184,186,187,189,193,194,197,198,199,202,204,205,210,211,214,216,217,218,219,220,223,225,226,230,232,233,237,238,239,240,245,248,249,250,255,257,258,259,265,270,274,285,286,291,294,297,304,306,308,316,317,318,319,320,322,323,324,326,327,329,334,335,336,337,341,342,343,348,360],"g\u00e9n\u00e9ral":78,"goto":[84,326],"import":[0,2,3,4,5,6,9,10,11,13,14,15,16,19,20,21,22,25,27,28,29,30,31,33,38,39,41,42,43,44,45,46,47,48,49,50,51,53,54,55,56,57,58,59,60,61,62,63,67,68,70,71,72,73,75,76,79,80,82,83,84,85,88,89,90,92,93,95,96,101,102,103,104,105,106,109,110,111,112,113,114,115,116,117,118,119,120,122,124,125,126,129,131,132,133,134,135,136,137,139,140,152,158,168,173,178,179,180,181,182,183,184,186,187,197,198,199,201,203,204,205,211,212,214,216,217,218,219,220,226,230,231,233,236,240,250,259,265,269,277,278,299,303,306,307,314,316,320,321,324,325,326,327,328,339,340,342,360],"int":[11,25,31,38,48,50,55,57,73,84,90,113,122,124,133,143,145,150,151,153,175,178,181,183,184,187,189,191,193,194,197,199,205,214,216,217,218,219,220,232,245,250,256,257,258,259,262,263,265,269,270,274,275,276,277,279,283,284,285,293,294,296,306,308,310,314,315,319,322,324,325,326,328,329,332,334,335,339,342],"long":[9,10,15,20,22,23,25,26,27,29,33,37,39,42,43,45,48,50,51,54,57,59,61,63,67,70,71,72,77,78,79,80,84,85,86,89,104,107,110,112,114,117,120,124,125,126,128,130,132,134,137,138,155,158,163,178,185,194,202,212,219,226,232,274,279,294,319,320,327,328,342],"new":[0,2,5,9,11,12,13,14,16,19,20,21,22,23,25,26,27,29,31,33,34,35,36,37,38,39,40,42,43,44,48,49,50,53,54,56,60,61,62,63,64,67,69,70,71,72,74,75,76,77,78,79,80,81,82,83,84,87,88,89,90,91,92,94,95,97,99,100,103,104,105,106,107,108,110,111,115,116,117,120,121,122,123,127,128,130,131,133,134,135,136,137,138,143,144,145,151,152,153,155,156,158,163,166,167,169,170,172,173,174,179,180,181,185,186,187,191,194,196,198,199,200,201,202,203,204,205,211,212,214,216,217,218,219,220,229,230,231,233,237,240,242,244,245,247,249,250,252,254,257,258,259,262,265,274,275,276,277,283,284,285,290,297,305,306,310,314,315,316,317,319,320,322,325,326,328,332,334,335,336,358,360,362],"null":[8,85,313,334],"public":[25,34,40,42,57,64,66,71,89,92,99,102,130,133,163,245,310,328],"return":[3,4,6,10,11,15,20,21,22,25,27,28,29,30,33,36,38,39,40,41,42,43,47,48,49,51,57,59,61,63,67,68,70,72,73,75,76,79,80,81,84,88,90,92,94,95,96,99,101,102,106,107,108,109,110,111,113,115,116,117,118,120,122,124,126,128,132,133,136,137,143,144,145,147,149,150,151,152,153,155,158,165,168,169,173,174,175,176,178,179,181,183,184,186,187,189,191,192,193,194,196,197,198,199,202,203,204,205,209,210,211,214,216,217,218,219,220,222,229,230,231,232,233,235,236,237,239,240,242,244,245,247,248,249,250,255,256,257,259,262,263,265,270,271,274,275,277,278,279,280,282,283,284,285,286,288,289,290,292,293,294,296,297,303,304,306,308,309,310,313,314,315,316,317,319,320,321,322,323,324,326,327,328,329,332,334,335,336,337,338,339,341,342,343,348,355,360],"short":[20,22,29,38,41,45,50,53,56,57,60,61,69,70,82,86,88,94,95,102,109,111,113,122,128,136,139,179,181,194,201,204,205,226,232,250,320,342],"static":[48,57,93,123,134,135,136,138,165,179,191,205,213,310,322,353,360,361,362],"super":[5,22,25,31,39,40,48,56,57,59,61,80,88,95,117,120,122,124,179,181,205],"switch":[0,2,9,10,13,14,16,19,20,23,25,31,33,34,42,45,49,57,64,67,71,75,79,80,81,87,89,97,113,115,120,121,122,124,125,128,130,137,155,156,157,158,163,164,165,166,167,168,173,174,184,186,198,199,201,202,217,254,316,322,343],"th\u00ed":20,"throw":[11,22,42,65,74,108,130,132,152,165,342],"true":[1,2,4,5,10,11,13,20,21,22,25,26,27,29,31,33,34,39,40,48,49,50,53,55,57,61,64,65,66,67,68,71,73,75,79,80,83,84,85,86,89,90,95,97,99,101,104,113,114,115,116,119,120,121,122,124,125,126,132,134,136,137,143,147,149,151,152,153,155,158,163,165,166,169,172,173,174,175,176,178,179,181,182,183,184,187,189,191,194,196,199,202,203,204,205,211,214,216,217,218,219,220,223,225,229,233,235,239,240,242,244,245,247,249,250,252,254,255,256,257,258,259,261,263,265,270,271,274,276,283,288,293,294,304,306,308,310,313,314,315,316,319,322,324,326,327,328,329,332,334,337,338,339,342,343],"try":[0,4,5,6,8,9,10,11,12,13,15,16,20,21,22,23,25,26,27,29,30,38,41,42,43,45,47,48,49,50,53,54,55,56,57,59,60,62,63,64,65,67,68,72,73,74,76,79,80,85,89,90,92,94,95,96,101,102,107,108,109,110,112,117,118,119,120,122,123,125,126,132,133,134,135,136,137,139,143,147,151,153,158,174,176,178,179,185,195,203,204,205,211,212,216,217,218,219,220,223,226,229,230,231,233,237,245,249,257,262,265,274,289,290,294,308,313,314,316,319,321,322,324,325,338,342],"var":[66,87,136,199,208,289,320],"void":55,"while":[0,9,10,11,13,14,20,22,23,25,28,29,31,33,35,37,40,42,48,49,50,54,55,56,57,61,62,69,74,82,85,89,90,92,94,95,102,107,108,109,110,113,115,117,118,120,121,123,126,128,132,133,135,136,137,143,155,158,166,174,178,187,195,196,202,203,217,220,223,226,229,231,233,245,250,257,289,312,313,316,326,328,342,343,360],AIs:78,AND:[42,72,79,118,158,187,240,314],ARE:76,AWS:[89,99],Adding:[18,32,33,44,52,59,70,81,107,115,123,138,186,362],Age:[187,355],And:[0,4,9,10,11,21,22,25,26,29,33,36,40,41,45,50,56,60,61,68,72,79,85,90,95,110,125,132,136,137,152,181,214,216,217,218,219,220,362],Are:[33,60,78,81],Aye:45,BGs:125,Being:[57,80,121,122],But:[0,6,10,11,13,15,20,21,22,25,26,27,28,29,31,33,37,38,40,41,43,50,53,54,56,58,59,60,61,63,68,71,72,79,81,82,84,85,90,94,95,99,101,103,106,108,110,113,118,124,125,126,132,133,137,151,152,178,226,317,360],DNS:89,DOING:187,DoS:283,Doing:[29,33,42,54,72,133,152,155],For:[0,2,5,6,8,9,12,13,14,16,17,19,20,21,22,23,25,27,29,31,33,36,37,38,40,41,42,45,48,50,52,54,55,56,57,58,61,62,63,68,71,72,75,78,79,80,82,84,85,87,89,90,92,94,95,97,99,101,102,104,108,109,110,112,113,115,120,122,125,126,128,129,130,131,132,133,134,135,137,138,139,152,158,168,173,174,175,176,179,181,184,186,187,188,196,197,199,205,211,213,214,217,229,237,240,250,285,294,314,316,319,323,326,336,338,342,355,360,362],GMs:57,Going:232,Has:[24,216,217,218,219,220],His:[56,188],IDE:[47,105],IDEs:56,IDs:[0,99,132,133,193,314,342],INTO:[42,158,187],IOS:24,IPs:[12,102,208,308],IRE:[87,289],Its:[40,61,68,79,82,85,88,104,188,250,324,326,342],LTS:96,NOT:[11,25,33,42,79,89,102,118,136,158,240,250,257,308,362],Not:[8,24,30,40,53,56,60,73,89,107,111,114,126,130,131,132,136,145,152,166,167,245,262,275,276,277,279,280,281,287,289,292,314,315,336],OBS:[19,42],ONE:102,Obs:126,One:[0,8,12,20,22,25,29,34,36,45,48,50,56,57,59,62,63,68,75,78,79,86,90,93,94,101,104,109,114,116,120,122,125,127,129,130,131,137,140,147,149,178,184,204,214,229,230,249,250,275,303,313,314,315,319,320,327,342],PRs:130,Such:[6,13,28,33,37,42,47,50,56,63,72,126,158,250,319,326],THAT:90,THE:[187,226],THEN:[152,187],THERE:187,TLS:102,That:[0,3,4,9,10,15,21,22,25,26,31,33,38,40,41,45,48,52,54,56,61,63,67,68,72,73,76,90,92,94,95,97,101,104,110,111,114,118,121,124,130,133,135,137,139,178,179,185,214,240,250,306],The:[0,2,4,5,6,7,8,9,12,15,17,20,21,23,24,25,27,28,30,31,33,34,36,37,38,39,41,42,43,44,47,51,52,53,54,55,56,58,59,60,61,62,63,65,67,69,71,72,73,74,75,77,78,79,80,81,83,85,86,87,88,89,90,91,93,94,96,97,99,100,101,102,103,104,105,106,107,109,110,111,112,113,114,117,118,119,120,121,123,124,125,126,127,128,129,130,131,132,133,135,136,137,138,139,143,145,146,147,149,150,151,152,153,155,158,162,163,164,165,166,167,168,169,170,172,173,174,175,176,178,179,181,183,184,185,186,187,188,189,191,192,193,194,196,197,198,199,202,203,204,205,211,212,214,216,217,218,219,220,222,223,225,226,229,230,231,232,233,234,236,237,239,240,244,245,247,248,249,250,253,254,255,256,257,259,262,263,264,265,267,269,270,272,274,275,276,277,278,279,280,281,282,283,284,285,287,288,289,290,292,293,294,296,297,302,303,304,305,306,310,313,314,315,316,317,319,320,321,322,323,324,325,326,327,328,329,330,332,334,335,336,337,338,339,340,342,343,355,360,361,362],Their:[50,72,102,108,113,123,188],Theirs:188,Then:[0,9,15,22,38,40,41,45,55,60,62,66,68,90,92,99,106,126,130,136,186],There:[0,5,8,10,11,13,14,15,19,20,21,22,23,25,26,27,31,33,34,40,45,48,50,54,56,57,59,60,61,63,67,68,71,72,76,78,79,80,84,85,87,88,89,90,92,94,95,96,97,101,102,103,104,106,107,110,111,112,113,115,116,117,118,120,122,124,126,127,132,135,136,137,138,166,186,187,214,216,217,218,219,220,233,250,259,270,289,306,319,320,326,334,361],These:[0,4,5,9,11,13,17,22,25,33,34,35,38,39,42,46,48,50,58,60,64,67,68,72,73,82,85,87,89,90,94,95,99,101,102,104,106,108,109,110,111,113,118,120,121,123,124,126,130,132,136,137,138,142,143,144,149,151,153,155,157,159,167,175,179,183,197,198,202,204,205,209,226,231,236,240,245,249,250,259,264,271,290,293,294,296,305,306,307,314,316,319,323,326,327,328,335,336,337,342],USE:[239,362],Use:[1,2,4,5,8,9,12,13,14,20,22,23,25,31,42,47,50,53,57,59,62,64,68,69,88,89,92,94,95,99,104,108,113,115,121,122,124,126,130,136,143,150,155,156,158,163,164,168,170,178,179,183,185,196,198,199,201,202,203,205,217,218,219,220,225,232,242,244,245,267,271,276,293,294,296,297,300,314,316,319,325,326,328,332,339,342],Used:[33,42,120,138,149,152,158,174,187,201,214,233,244,257,267,285,314,316,327,328,348],Useful:[50,89],Uses:[24,113,158,170,185,208,229,265,314,327,328,332],Using:[18,22,27,42,45,50,52,54,57,59,61,67,79,90,95,114,120,122,138,158,205,217,232,245,285,312,326,362],VCS:36,VHS:187,VPS:89,WILL:[24,90,257],WIS:57,WITH:[23,187],Will:[31,73,109,113,143,183,203,205,245,248,250,263,265,274,275,316,326,328,329,334,337,342],With:[8,11,15,19,23,52,54,56,76,86,99,110,121,122,140,143,179,205,250,319],Yes:[33,137,187,324],__1:335,__2:335,_________________:124,_________________________:50,______________________________:50,________________________________:50,_________________________________:124,______________________________________:326,______________________________________________:50,_______________________________________________:50,____________________________________________________:50,_________________________________________________________:84,__________________________________________________________:84,__all__:[144,235,242],__defaultclasspath__:316,__doc__:[33,42,58,67,153,166,168,169,237,322],__example__:96,__ge__:96,__getitem__:319,__init_:328,__init__:[3,6,11,39,46,48,52,95,96,106,124,151,152,153,173,176,178,179,191,203,205,225,232,240,244,245,255,256,258,259,262,263,265,267,268,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,292,293,294,296,303,304,306,308,309,310,313,314,316,317,319,321,324,325,326,327,328,334,335,336,337,338,342,349],__iter__:11,__multimatch_command:167,__noinput_command:[151,167,179,324,326,327],__nomatch_command:[167,179,231,324,326],__send_to_channel_command:167,__settingsclasspath__:316,__unloggedin_look_command:[170,185,200],_action_thre:50,_action_two:50,_asynctest:291,_attrs_to_sync:305,_attrtyp:314,_cach:316,_cached_cmdset:152,_call_or_get:179,_callback:[27,259],_char_index:319,_character_dbref:180,_check_password:50,_check_usernam:50,_clean_str:319,_cleanup_charact:115,_code_index:319,_copi:[42,158,245],_creation:124,_default:[50,326],_defend:50,_errorcmdset:152,_event:197,_famili:118,_file:335,_flag:249,_footer:33,_format_diff_text_and_opt:250,_get_a_random_goblin_nam:108,_get_db_hold:[304,316],_get_top:68,_getinput:326,_gettabl:270,_http11clientfactori:267,_init_charact:115,_is_fight:29,_is_in_mage_guild:50,_italic_:53,_loadfunc:324,_menutre:[25,50,326],_monitor:270,_monitor_callback:83,_nicklist_cal:145,_oob_at_:332,_option:50,_pending_request:310,_permission_hierarchi:239,_ping_cal:145,_playable_charact:[68,132],_postsav:332,_prefix:205,_quell:239,_quitfunc:324,_raw_str:319,_reactor_stop:[282,303],_recog_obj2recog:205,_recog_obj2regex:205,_recog_ref2recog:205,_regex:205,_repeat:270,_safe_contents_upd:244,_savefunc:324,_saver:[11,323],_saverdict:[11,323],_saverlist:[11,323],_saverset:323,_sdesc:205,_select:50,_sensitive_:347,_session:326,_set:118,_set_attribut:50,_set_nam:50,_some_other_monitor_callback:83,_start_delai:259,_stop_serv:282,_test:149,_validate_fieldnam:57,a2enmod:8,a8oc3d5b:99,a_off:178,aardwolf:87,abbrevi:[42,75,113,158,201,334],abcd:[42,164],abi:59,abid:125,abil:[6,10,20,31,33,51,54,55,56,57,59,72,76,79,89,99,101,107,108,122,126,133,136,137,138,204,205,212,216,217,218,219,220,245,257,265,314],abl:[0,3,4,5,8,11,13,14,19,20,21,22,23,26,27,28,29,31,33,36,40,41,42,46,48,50,51,54,56,57,58,59,60,62,63,68,70,72,74,75,80,84,85,86,88,89,90,92,94,95,99,102,103,105,108,110,111,113,115,120,121,122,129,130,132,133,137,139,152,155,156,158,159,173,176,179,183,189,198,205,211,216,217,218,219,220,226,257,314,316,323,338,342,358],abod:239,abort:[25,27,33,50,51,76,88,143,153,158,174,196,212,245,248,327],about:[0,3,9,10,11,12,13,14,15,16,17,20,21,22,23,24,25,26,30,31,33,36,37,38,40,41,43,44,45,47,50,53,54,56,58,59,60,62,63,67,68,69,70,72,74,75,76,77,78,80,82,84,85,89,90,92,93,94,95,96,99,100,102,103,107,108,109,111,112,113,115,117,118,119,122,123,125,126,130,133,134,135,137,138,143,158,168,173,178,179,181,184,213,218,219,220,225,226,230,231,237,245,265,267,270,279,281,283,292,294,304,306,313,315,317,319,332,334,342,361],abov:[2,4,8,9,10,11,12,13,14,21,23,24,27,28,29,30,31,33,36,37,39,42,43,45,48,49,50,55,56,57,58,59,61,62,63,67,68,73,79,80,83,84,85,89,90,92,94,95,99,101,104,105,108,109,110,111,113,115,117,118,120,122,124,126,130,131,132,134,136,137,139,151,152,158,179,184,187,189,198,199,203,205,212,213,214,216,218,219,220,240,245,270,313,326,337,348],abridg:40,absolut:[27,55,61,78,90,133,181,183,184,188,325,329,342],absorb:73,abspath:342,abstractus:147,abus:[7,102],academi:78,accept:[11,14,22,23,27,31,37,42,50,53,57,58,73,79,87,89,94,95,108,113,114,124,130,132,133,137,143,149,150,168,178,184,187,192,195,203,204,205,212,229,231,239,245,265,270,283,309,310,315,320,326,334,338,342],accept_callback:[192,194],accesing_obj:239,access:[0,4,7,8,11,12,13,14,19,21,22,23,25,27,29,31,33,34,38,39,40,46,48,50,51,55,56,57,58,59,62,63,65,67,68,70,72,73,79,82,83,84,85,86,88,89,90,94,95,99,100,101,102,103,104,106,107,108,110,111,113,115,118,120,122,123,124,125,126,127,130,132,133,134,136,138,143,144,147,151,152,153,155,156,158,163,164,165,166,167,168,173,174,175,176,179,186,189,191,193,202,204,205,216,217,218,219,220,231,232,237,238,239,240,244,245,248,249,250,254,256,258,259,262,265,274,275,304,306,312,313,314,316,317,320,321,322,335,341,342,355,360],access_obj:[239,314],access_opt:343,access_token_kei:[70,119],access_token_secret:[70,119],access_typ:[42,67,143,153,158,174,176,237,239,240,245,314,316,360],accessed_obj:[25,79,120,239,240],accessing_obj:[1,11,25,79,120,143,174,176,237,239,240,245,314,316],accessing_object:[11,239],accessor:[147,176,237,244,254,314,316,317,333],accessori:62,accident:[15,31,42,122,137,156,158,304],accommod:4,accomod:[100,328],accompani:122,accomplish:[12,25,40,48,54],accord:[31,33,110,115,125,179,181,199,203,204,217,258,319,320],accordingli:[48,57,89,105,174,232],account1:358,account2:358,account:[0,4,6,9,11,12,14,17,19,20,21,22,24,25,27,31,33,34,35,37,40,44,46,48,49,50,51,54,55,56,60,61,64,65,68,70,73,79,80,82,86,88,89,90,91,95,99,103,104,106,107,108,109,110,111,113,118,119,122,124,125,126,128,130,132,133,134,137,138,140,141,148,149,150,151,152,153,154,156,158,159,160,163,164,165,166,170,173,174,175,176,179,180,181,183,185,186,187,189,191,192,194,196,198,199,200,205,208,211,216,218,219,220,223,226,229,230,231,233,237,239,240,244,245,247,249,251,254,265,269,270,285,296,297,304,305,306,314,316,319,322,326,327,336,337,339,340,342,343,347,355,358,360,362],account_cal:[155,163,166,198],account_count:306,account_id:[132,245],account_mod:158,account_nam:55,account_search:[205,245],account_subscription_set:147,account_typeclass:[340,358],accountattributeinlin:144,accountcmdset:[2,22,31,40,42,56,57,61,155,159,163,180,198],accountcreateview:360,accountdb:[118,124,132,140,143,144,147,174,237,312,313,316,336,343],accountdb_db_attribut:144,accountdb_db_tag:144,accountdb_set:[314,317],accountdbadmin:144,accountdbchangeform:144,accountdbcreationform:144,accountdbmanag:[146,147],accountdbpasswordcheck:285,accountform:[144,355,360],accountid:132,accountinlin:144,accountlist:57,accountmanag:[143,146],accountmixin:360,accountnam:[42,57,158,170,175,185,322],accounttaginlin:144,accru:143,accur:[22,153,176,191,217,220,250,258,263,265,267,268,276,285,286,288,290,293,294,314,319,334,337,338,349],accuraci:[45,90,217,218,219],accus:72,accustom:[86,123],acept:187,achiev:[0,22,27,33,56,113,123,125,137,219,265],ack:51,acquaint:56,acquir:321,across:[16,20,39,50,55,60,85,90,101,104,107,108,124,143,151,152,181,187,231,236,245,248,257,259,262,274,275,289,306,328],act:[2,8,13,23,29,31,34,37,42,48,50,55,57,60,69,76,94,101,104,109,110,122,138,140,158,176,187,214,239,262,274,275,294,314,317,321,326],action1:115,action2:115,action:[0,11,22,29,38,40,41,42,45,54,56,60,61,63,72,87,89,90,92,101,113,115,116,117,122,132,137,144,145,164,174,178,187,205,216,217,218,219,220,232,236,237,248,249,254,255,277,296,297,298,308,316,332],action_count:115,action_nam:[216,217,218,219,220],actiondict:115,actions_per_turn:[216,217,219,220],activ:[4,9,12,13,26,27,28,31,33,36,42,60,61,62,63,64,65,71,74,75,78,79,80,82,88,89,92,94,97,101,104,109,113,127,130,134,135,137,143,149,152,156,158,168,173,174,192,200,209,226,229,233,244,245,248,257,270,277,278,279,280,281,285,287,288,289,296,306,308,314,315,326,327,328,334,342],activest:341,actor:220,actual:[2,5,8,10,11,13,14,19,20,21,22,26,27,29,34,36,39,40,41,42,43,45,46,48,50,52,57,58,59,60,62,63,67,68,70,72,78,79,80,82,84,85,86,87,88,89,90,92,94,95,96,99,103,104,105,108,110,111,112,113,114,115,118,120,122,125,126,127,132,133,135,136,137,143,149,153,155,158,164,166,167,169,174,176,178,179,181,186,187,196,197,201,202,204,205,212,213,214,216,217,218,219,220,226,230,231,233,237,239,240,244,245,249,250,285,288,294,296,302,304,305,306,310,311,314,316,319,321,322,324,326,332,336,337,338,342,360],actual_return:126,adapt:[0,4,21,39,68,72,132],add:[0,2,5,6,8,9,10,11,13,14,15,16,17,19,20,21,22,26,29,30,31,33,34,35,36,37,38,39,40,41,42,43,45,46,47,48,49,50,53,54,56,57,60,61,63,64,65,66,67,68,70,72,73,75,76,77,78,79,80,81,83,84,85,86,87,88,89,90,92,93,94,95,97,99,101,103,104,105,108,110,111,112,113,114,115,116,117,118,119,120,122,123,124,126,127,129,130,131,132,133,134,136,137,138,139,140,143,147,151,152,158,163,164,165,167,173,174,178,179,180,181,182,184,185,186,191,192,194,195,196,197,198,199,200,201,202,204,205,208,211,212,214,216,217,218,219,220,222,223,225,226,229,230,231,232,239,240,244,245,248,250,254,255,256,258,259,265,270,271,275,278,279,281,283,287,294,296,297,299,307,314,317,320,324,325,326,327,328,332,334,335,337,338,360,362],add_:328,add_act:115,add_argu:232,add_callback:[192,194],add_channel:173,add_charact:115,add_choic:179,add_choice_:179,add_choice_edit:[22,179],add_choice_quit:[22,179],add_collumn:153,add_column:[57,328],add_condit:218,add_default:[21,31,84,95,120,152,223],add_dist:220,add_ev:194,add_fieldset:[144,242],add_form:[144,242],add_head:328,add_languag:204,add_row:[57,81,153,328],add_view:[144,172,242],add_xp:72,addblindedcmdset:226,addcallback:[33,245],addclass:[136,344,354,356],addcom:[57,163],added:[0,4,5,17,21,22,24,25,27,31,33,34,36,39,40,41,42,54,56,57,59,64,68,69,72,74,76,77,79,85,87,90,95,99,101,105,107,108,109,110,111,113,115,116,118,120,122,127,130,131,132,137,143,149,151,152,153,167,168,178,179,181,182,184,188,191,194,197,205,216,217,218,219,220,223,233,240,245,250,256,270,304,314,317,320,326,328,334,335,342,348],addendum:37,adding:[0,3,5,9,14,17,21,22,27,29,31,35,36,39,42,45,50,56,57,61,68,75,79,80,85,90,96,101,103,105,107,108,111,113,114,115,120,122,124,125,127,130,132,136,137,138,151,152,156,158,165,179,183,187,189,191,194,198,204,205,214,216,217,218,219,226,231,232,248,249,250,256,265,296,313,314,322,328,342],addingservermxp:280,addit:[4,8,22,25,31,36,37,45,48,49,57,61,68,75,81,87,89,90,102,103,113,118,133,143,145,152,153,174,179,182,191,192,194,196,199,204,208,214,220,232,240,245,258,276,304,314,316,355],addition:[25,110,118,220],additionalcmdset:31,addpart:202,addquot:342,addr:[262,275,276,277,322],address:[3,9,12,23,33,39,42,48,66,86,89,90,102,104,130,134,143,156,174,185,188,245,262,275,277,285,305,308,342,343,361],address_and_port:285,addresult:202,addscript:[42,158],addservic:39,adjac:[199,220,229],adject:96,adjoin:205,adjust:[0,33,37,62,125,132,189,326,328],admin:[2,9,11,12,15,19,21,33,34,40,48,57,60,67,68,71,79,84,85,97,100,109,118,120,122,132,133,137,140,141,142,147,148,154,158,163,165,168,170,171,174,185,229,234,237,240,241,244,245,251,260,274,275,312,316,322,338,360,361],admin_sit:[144,172,235,242,252,261,313],admin_wrapp:360,administr:[10,23,33,36,40,54,57,62,63,67,79,102,128,138,262,274,275,362],adminportal2serv:274,adminserver2port:274,adminstr:262,admintest:358,admit:38,adopt:[21,22,26,56,63,176,289],advanc:[10,12,13,22,28,31,33,38,39,42,43,50,54,57,63,78,85,92,103,104,107,108,110,118,122,123,124,138,158,166,186,199,203,205,216,217,218,219,220,225,280,320,324,325,328,362],advantag:[3,14,15,28,36,38,45,50,54,55,57,58,61,67,68,72,89,102,103,108,115,117,122,132,178,179,208,214,216,217,218,219,220,317,320],advent:180,adventur:[20,40,76,110,121,123],advic:78,advis:[0,22,25,76],aeioui:118,aesthet:49,affair:321,affect:[11,13,14,19,25,31,33,42,60,61,72,79,80,104,111,113,115,125,126,127,130,137,140,141,143,151,168,182,197,204,211,218,238,245,249,316,320,328,336],afford:[84,104],afraid:89,after:[0,5,8,9,10,11,14,15,20,21,22,25,27,28,29,30,31,33,36,38,40,42,43,45,48,49,50,54,57,59,62,67,75,76,78,79,82,84,85,89,90,95,99,101,102,106,113,115,116,120,121,122,125,126,127,129,130,132,135,136,137,138,143,151,152,153,154,155,158,166,168,169,173,174,178,179,181,183,184,185,186,187,189,194,196,202,204,205,214,216,217,218,219,220,226,227,229,230,231,232,233,244,245,248,250,255,257,265,287,288,291,303,304,305,306,308,310,314,319,320,321,324,326,327,332,334,337,340,341,342,360],after_mov:245,afternoon:186,afterthought:47,afterward:[20,29,68,85,90,118,130,179],again:[0,6,12,13,14,20,21,22,23,24,28,29,33,38,40,41,42,46,47,48,50,53,55,56,57,59,60,61,62,63,68,72,75,79,80,84,85,89,90,92,94,95,97,99,101,104,105,109,110,113,115,118,120,122,125,127,130,132,137,145,152,163,183,194,203,216,219,220,225,226,233,257,265,282,285,288,308,319,320,323,338,340],against:[6,11,21,31,33,37,56,57,82,89,102,115,118,124,126,143,150,151,173,205,216,217,218,219,220,240,245,249,250,283,308,314,316,334,339,342],age:[187,232,355],agenc:102,agent:36,agenta:113,ages:187,aggreg:78,aggress:[11,14,74,121,123,138,229,316,362],aggressive_pac:229,agi:[11,59,126],agil:[11,59],agnost:[37,63,174],ago:[25,99,342],agre:[1,72,112,178],agree:178,ahead:[14,22,24,36,48,60,89,107,120,287],aid:[112,165,166,167,178,310],aim:[7,54,57,60,72,84,85,89,94,107,125,175,249],ain:45,ainnev:[72,118],air:[20,21,110],ajax:[24,39,54,89,136,294,305],ajaxwebcli:294,ajaxwebclientsess:294,aka:[9,11,92,202,342],alarm:[20,81],alert:[136,196,245],alexandrian:78,algebra:48,algorith:204,algorithm:342,alia:[2,6,9,20,21,22,31,33,40,43,47,56,57,58,59,62,86,88,89,94,104,110,111,118,124,126,128,130,144,147,150,153,155,158,163,164,165,166,167,169,172,173,186,191,205,211,227,229,231,233,235,239,242,244,245,248,250,252,254,259,270,296,313,315,316,317,322,338,339,340,355,360],alias1:[42,158,186],alias2:[42,158,186],alias3:186,alias:[2,13,20,21,22,25,27,29,31,33,34,40,42,43,44,47,50,57,59,73,80,81,84,86,88,108,110,115,118,122,128,130,139,143,151,153,155,156,157,158,163,164,165,166,167,168,169,170,173,174,175,178,179,180,181,184,185,186,187,188,192,198,199,200,201,202,205,211,212,213,214,216,217,218,219,220,223,229,230,231,232,233,236,237,244,245,250,315,316,317,322,324,326,327,335,339],aliaschan:[42,163],aliasdb:143,aliashandl:[313,317],aliasnam:250,aliasstr:322,align:[40,57,108,113,189,319,327,328,334,342],alik:67,alist:96,aliv:[54,229],alkarouri:341,all:[0,1,2,3,5,6,8,9,10,11,12,13,14,15,16,17,19,20,21,22,23,26,27,28,29,30,31,33,34,35,36,37,38,39,40,42,43,45,46,47,48,49,50,53,54,55,56,57,58,59,60,61,62,63,67,69,71,72,73,74,75,76,77,78,79,80,81,82,84,85,86,87,88,89,90,92,93,94,95,96,97,99,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,120,121,122,123,124,125,126,127,128,130,131,132,133,134,135,136,137,138,139,143,144,145,148,149,150,151,152,153,154,155,156,157,158,159,160,163,164,165,166,167,168,169,170,173,174,175,176,178,179,180,181,184,185,186,187,188,191,194,196,198,200,201,202,203,204,205,209,211,212,213,214,216,217,218,219,220,223,225,226,229,230,231,232,233,235,236,237,238,239,240,241,242,244,245,249,250,255,256,257,259,260,264,265,269,270,271,274,276,277,279,281,282,283,284,285,288,289,292,293,294,296,297,303,304,305,306,308,310,311,312,313,314,315,316,317,319,320,321,322,323,324,325,326,327,328,332,334,335,337,339,341,342,343,348,355,360,361],all_alias:111,all_attr:316,all_connected_account:306,all_displai:259,all_famili:118,all_from_modul:342,all_opt:337,all_receiv:245,all_room:13,all_script:101,all_sessions_portal_sync:306,all_to_categori:236,allcom:163,allerror:[265,274],allevi:[11,107,126,310],allheadersreceiv:310,alli:220,alloc:89,allow:[0,2,3,4,6,8,9,10,11,12,13,14,15,16,19,21,22,23,26,27,29,30,31,33,34,36,38,40,41,42,43,45,46,48,50,53,54,56,57,58,60,62,63,64,67,70,71,72,73,74,75,77,79,80,84,85,86,88,89,90,91,94,95,96,97,99,100,101,102,103,105,107,108,110,111,112,113,115,118,120,122,124,125,128,130,132,133,134,136,137,143,145,147,149,151,152,153,155,156,157,158,163,166,167,168,169,174,175,176,178,179,181,183,184,186,187,188,194,196,199,201,203,204,205,214,216,217,218,219,220,229,230,231,232,233,237,239,240,245,248,249,250,255,257,258,259,265,269,270,272,276,278,279,280,281,288,289,290,292,297,303,304,306,308,309,314,316,317,319,320,322,324,326,327,328,329,332,336,337,338,340,342,355,360],allow_dupl:151,allow_nan:294,allow_quit:326,allowed_attr:57,allowed_fieldnam:57,allowed_host:[89,102],allowed_propnam:122,allowedmethod:294,allowext:310,almost:[19,33,40,94,114,118,124,179,181,267,274,312],alon:[13,29,48,50,55,57,72,79,85,86,115,126,137,259,270,296,320,322,328],alone_suffix:301,along:[5,12,33,42,47,50,59,63,69,73,77,87,90,92,95,103,106,113,120,121,138,143,155,178,184,204,208,214,219,240,245,294,312],alongsid:[5,187],alonw:254,alpha:[53,89,319],alphabet:[15,110,112,319,361],alreadi:[0,2,5,6,9,11,13,15,21,22,25,27,29,31,33,34,39,40,42,45,48,49,50,53,55,56,57,59,60,62,63,67,68,69,71,72,76,79,80,81,84,87,88,90,93,94,95,99,101,102,104,105,109,111,115,116,117,118,119,120,122,124,126,127,130,132,133,134,135,136,137,138,151,152,155,158,163,166,167,168,173,174,175,178,180,181,203,204,205,216,217,218,219,220,226,229,230,233,240,245,250,257,265,274,282,283,285,290,293,298,303,304,306,317,319,322,327,342,347],alredi:39,alright:178,also:[0,1,2,3,5,6,8,9,10,11,12,13,14,15,16,17,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,45,46,47,48,49,50,52,53,54,55,56,57,58,59,60,61,62,63,64,65,67,68,69,71,72,73,74,76,78,79,80,81,82,83,84,85,86,87,88,89,90,92,94,95,96,97,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,139,143,147,150,151,152,153,155,156,157,158,160,164,166,168,169,173,174,175,176,178,179,180,181,184,186,187,189,194,198,199,201,203,204,205,212,214,218,219,220,225,229,230,231,233,238,239,240,244,245,248,249,250,251,254,257,258,259,260,265,269,270,274,276,283,285,288,289,292,293,296,297,306,310,312,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,332,334,339,342,344,360,361],alt:319,alter:[0,4,23,40,63,110,136,314],altern:[23,29,33,34,50,54,56,62,63,67,71,75,80,86,89,110,111,113,117,118,121,130,132,136,137,139,166,167,174,202,205,220,223,239,240,283,322,334,342],although:[22,29,38,41,62,118,155,179,180,184,310,338,342],althougn:45,altogeth:[49,102,113],alwai:[0,2,4,6,8,11,12,13,14,20,21,23,25,27,30,31,33,34,37,38,42,46,48,50,52,56,57,60,61,62,63,68,71,72,73,76,79,84,85,87,88,89,90,94,95,101,104,106,108,111,113,114,120,122,124,125,126,127,130,133,134,136,143,151,152,153,155,157,158,163,166,169,174,175,176,198,204,205,211,223,226,239,240,244,245,248,249,250,257,259,265,267,270,274,282,285,288,289,293,294,297,304,306,311,314,315,316,317,319,322,327,332,334,338,339,342,343,360],always_pag:327,always_return:265,amaz:74,amazon:[78,89],ambianc:107,ambigu:[40,153,173,188,245,316],ambiti:[107,128],amend:130,amfl:14,ammo:21,among:[2,35,36,42,61,63,78,88,103,110,122,126,164,181,223,230,240,328,339],amongst:[76,199],amor:195,amount:[11,16,37,42,60,67,72,101,102,113,122,168,216,217,218,219,220,245,306,324],amp:[39,82,91,93,104,140,260,262,265,273,275,283,291,303,306],amp_client:[140,141,260],amp_maxlen:291,amp_port:89,amp_serv:[140,260,273],ampclientfactori:262,ampersand:107,amphack:274,ampl:123,amplauncherprotocol:265,ampmulticonnectionprotocol:[262,274,275],ampprotocol:262,ampserverclientprotocol:262,ampserverfactori:275,ampserverprotocol:275,amsterdam:89,anaconda:9,analog:[48,82],analys:50,analysi:209,analyz:[15,33,40,50,79,117,149,158,174,205,249,250,255,265,342],anchor:[174,220,237,316],anchor_obj:220,ancient:113,andr:24,android:[138,362],anew:[62,110,265],angl:128,angri:40,angular:[42,168],ani:[0,1,2,5,6,8,10,11,12,14,15,16,19,20,21,22,23,24,25,27,30,31,33,34,36,37,38,39,40,41,42,43,47,48,49,50,53,55,56,57,58,59,60,62,63,64,67,69,71,72,73,75,76,78,79,80,81,82,83,84,85,86,87,88,89,90,94,95,96,97,99,101,102,103,104,106,108,111,113,114,115,116,117,118,120,121,122,124,125,126,127,128,130,132,133,134,135,136,137,138,139,143,147,149,150,151,152,153,155,156,158,164,168,169,174,175,176,178,179,180,181,185,186,187,188,189,193,198,201,203,204,205,208,209,212,216,217,218,219,220,222,223,229,231,232,233,239,240,245,248,249,250,254,255,257,258,259,262,263,265,267,269,270,274,275,277,283,284,285,288,293,294,296,304,305,306,314,315,316,317,319,320,321,323,324,325,326,327,328,334,335,336,337,338,339,341,342,360],anim:[27,51],anna:[42,57,62,71,116,117,122,158],annoi:[12,84,90],annot:78,announc:[25,37,42,78,115,122,127,156,168,196,216,217,218,219,220,245],announce_al:[283,306],announce_move_from:[25,76,88,196,245],announce_move_to:[25,76,88,196,245],annoy:143,anonym:[4,65,68,205],anonymous_add:205,anoth:[0,8,10,11,13,14,16,21,22,29,31,33,36,38,41,42,45,48,50,55,56,57,61,62,63,68,76,77,79,88,89,90,95,96,97,101,104,105,107,108,110,111,112,113,115,120,122,126,130,131,135,136,137,138,139,143,151,152,155,158,163,164,174,178,179,181,187,193,198,203,205,214,216,217,218,219,220,230,233,237,245,248,306,314,316,320,324,326,327,334,342],another_batch_fil:320,another_nod:326,another_script:101,ansi:[24,42,54,73,80,136,140,141,155,182,189,201,270,277,285,288,293,294,318,328,334,341,362],ansi_escap:319,ansi_map:319,ansi_map_dict:319,ansi_pars:319,ansi_r:319,ansi_regex:319,ansi_sub:319,ansi_xterm256_bright_bg_map:319,ansi_xterm256_bright_bg_map_dict:319,ansimatch:319,ansimeta:319,ansipars:319,ansistr:[140,319,328],ansitextwrapp:328,answer:[0,11,21,25,26,33,45,50,60,62,68,69,72,94,95,102,126,263,269],anul:8,anwer:43,anybodi:[58,102],anymor:[4,180,194,202,203,233,326,338],anyon:[1,4,12,21,25,29,40,41,53,57,59,75,79,84,89,115,117,118,122,137],anyth:[0,1,5,11,13,16,19,20,22,23,26,29,31,33,34,39,40,41,45,48,50,55,60,62,63,68,79,81,82,84,86,88,89,90,93,94,95,99,101,103,105,110,115,117,120,122,124,126,127,130,132,134,135,136,137,151,153,167,179,205,214,216,217,218,219,220,240,277,311,314,320,326],anywai:[0,4,14,20,50,54,74,75,90,94,107,113,139,178,180,185],anywher:[33,50,59,63,94,95,124,133,324],apach:[7,23,89,102,138,310,362],apache2:8,apache_wsgi:8,apart:[2,11,20,27,34,46,54,62,79,80,99,103,124,125,126,133,220],api:[13,15,26,27,34,41,42,46,47,51,58,59,70,72,88,95,104,108,110,119,124,132,137,138,140,143,157,168,170,176,185,304,314,316,320,321,361,362],api_kei:70,api_secret:70,apostroph:15,app:[4,39,70,79,85,133,134,135,137,138],app_id:132,app_label:144,app_nam:68,appar:[47,57,125],apparit:231,appeal:[50,60,113],appear:[9,10,21,22,25,26,27,30,42,46,47,50,59,62,64,65,67,71,79,81,89,94,95,99,101,103,105,110,113,122,125,130,136,137,140,155,165,181,194,205,211,233,245,289,290,313,316,328,334,335],append:[20,22,25,27,31,38,39,42,48,49,52,67,68,79,84,87,88,89,90,92,95,96,115,122,126,132,137,153,158,165,181,198,205,240,298,320,334,335,342],appendix:239,appendto:136,appform:132,appl:[178,245],appli:[0,8,9,13,16,22,23,31,33,36,37,59,79,80,101,105,110,114,120,124,125,127,132,143,149,151,166,182,216,217,218,219,220,233,240,245,249,250,254,259,306,314,315,316,319,320,325,328,329,339,342],applic:[8,39,52,62,78,79,85,93,99,102,111,123,127,132,133,134,135,143,186,187,220,265,268,278,282,289,303,304,310,352,360],applicationdatareceiv:288,applied_d:132,apply_damag:[216,217,218,219,220],apply_turn_condit:218,appnam:[11,79],appreci:[22,37,69,77,332],approach:[22,25,38,55,76,90,105,114,132,179,220],appropri:[8,9,23,31,33,36,54,70,90,105,118,120,128,132,137,143,156,174,189,265,304,336,338,342],approrpri:39,approv:[132,133,137],approxim:[5,42,168,342],april:61,apt:[8,62,66,74,89,102,130],arbitr:60,arbitrari:[11,13,19,27,45,58,63,79,95,96,99,110,124,136,137,138,139,143,174,186,214,220,245,250,257,263,274,294,314,323,334,335,338],arcan:128,archer:250,architectur:[79,250],archiv:[78,102],archwizard:250,area:[2,22,24,47,48,57,60,78,116,121,126,137,229,233,239,325,328,342],aren:[0,4,29,38,68,102,126,130,132,135,137,143,181,187,194,202,218,335,338],arg1:[79,153,166,167,169,248,314,334],arg2:[153,166,167,169,248,314,334],arg:[1,5,10,21,22,25,29,30,33,38,39,40,41,42,50,57,58,67,70,72,73,79,80,82,84,87,95,108,113,114,115,118,120,122,128,131,136,143,144,145,146,147,149,150,153,158,166,167,169,174,175,176,178,181,183,186,188,191,194,196,202,203,204,205,211,212,213,214,216,217,218,219,220,222,225,226,229,230,231,232,233,236,237,239,240,243,244,245,248,249,250,253,254,257,258,259,262,270,271,272,274,275,276,277,282,283,285,286,288,289,290,293,294,298,304,306,310,313,314,315,316,317,319,326,328,329,331,332,334,335,338,340,342,343,355,360],arg_regex:[40,43,153,158,164,165,169,170,173,181,200,324],arglist:[166,167],argpars:232,argu:11,argument:[3,4,5,10,12,14,20,21,22,23,25,27,29,31,33,34,39,40,41,42,45,47,49,51,56,57,58,61,66,68,73,79,80,82,84,86,87,88,92,94,95,101,108,110,113,114,118,122,123,124,126,128,133,138,143,145,149,150,152,153,155,156,158,163,164,165,166,167,168,169,174,175,179,181,183,186,187,188,191,193,194,196,199,203,204,205,209,211,216,217,218,219,220,231,232,240,245,248,249,250,255,257,258,259,263,265,270,274,275,276,277,283,284,285,288,289,293,294,296,297,304,305,306,308,309,314,315,316,317,319,320,322,324,325,326,327,328,332,334,336,338,339,342,360,362],argumentpars:232,argumnet:328,argumu:334,aribtrarili:342,aris:102,arm:[26,33,202],armi:84,armor:[29,81,181,217],armour:29,armouri:76,armpuzzl:202,armscii:[15,112],arnold:86,around:[0,4,10,13,14,15,21,23,29,31,34,38,41,42,48,54,57,60,62,63,68,69,70,72,76,78,79,84,88,89,90,95,108,110,112,113,115,116,118,120,122,128,135,137,138,158,166,167,181,183,193,202,205,220,223,229,230,231,233,245,319,320,328,335],arrai:[87,90,289,342],arrang:22,array_of_known_message_types_to_assign:136,array_of_split_percentag:136,arrayclos:[87,289],arrayopen:[87,289],arriv:[0,25,29,42,72,76,82,104,158,277],arrow:[41,136],art:[113,325],articl:[4,15,21,38,40,47,56,60,78,112,126,130,333],article_set:333,artifact:328,artifici:72,arx:78,arxcod:[138,362],as_view:[174,237,316],ascii:[9,15,110,112,143,199,325,328,342],asciiusernamevalid:143,asdf:158,ashlei:[181,187,189,214,216,217,218,219,220],asian:342,asid:[9,226],ask:[1,10,21,23,26,34,37,41,42,45,47,49,53,57,62,67,68,69,72,83,89,90,92,96,118,123,130,132,151,153,158,178,183,192,200,203,232,263,265,292,326,329,342],ask_choic:263,ask_continu:263,ask_input:263,ask_nod:263,ask_yesno:263,asn:208,aspect:[47,50,56,59,63,67,72,85,108,126,189],assert:[115,126],assertequ:126,asserttru:126,asset:[102,135,269],assetown:9,assign:[2,6,11,12,13,20,36,42,50,55,57,79,86,88,96,101,108,111,114,115,118,120,122,130,136,137,143,149,150,152,158,165,166,167,169,182,186,187,205,216,217,218,219,220,231,240,244,245,249,250,270,277,283,285,288,304,323],assist:89,associ:[4,11,29,42,50,78,82,89,104,121,134,137,143,148,158,174,191,194,205,245,304,306,315,360],assort:360,assum:[0,3,5,9,12,13,14,15,19,20,21,22,25,27,28,29,31,33,34,37,38,39,40,42,43,45,46,48,50,54,55,57,59,61,67,72,73,74,79,80,81,83,84,88,89,94,95,96,99,101,102,104,105,107,108,109,110,112,114,115,116,117,119,120,122,127,131,132,133,137,149,152,153,155,158,169,174,179,180,205,212,230,231,239,245,250,255,257,289,306,319,320,326,327,334,342,347,360],assumpt:150,assur:[48,124],asterisk:[2,12,42,156],astronaut:76,astronom:61,async:[132,138,342,362],asynccommand:10,asynchron:[27,28,29,33,44,54,63,91,92,138,145,245,274,275,289,335,342],at_:[124,332],at_access:[143,245],at_account_cr:[2,143],at_after_mov:[76,88,95,116,196,245],at_after_object_leav:233,at_after_travers:[88,196,230,245],at_befor:245,at_before_drop:[217,220,245],at_before_g:[217,220,245],at_before_get:[220,245],at_before_leav:88,at_before_mov:[25,76,88,196,216,217,218,219,220,245],at_before_sai:[95,196,205,245],at_channel_cr:174,at_char_ent:116,at_cmdset_cr:[5,21,22,25,30,31,33,40,43,56,57,61,80,84,115,120,122,151,159,160,161,162,178,179,180,181,184,186,198,200,201,202,205,213,216,217,218,219,220,223,229,230,231,324,326,327],at_cmdset_get:[143,245,304],at_db_location_postsav:244,at_defeat:[216,217,218,219,220],at_desc:245,at_disconnect:[143,304],at_drop:[196,217,220,245],at_end:254,at_err:[10,342],at_err_funct:10,at_err_kwarg:[10,342],at_failed_login:143,at_failed_travers:[88,196,211,230,245],at_first_login:143,at_first_sav:[143,174,245],at_first_start:316,at_get:[181,196,220,245],at_giv:[217,220,245],at_heard_sai:117,at_hit:229,at_idmapper_flush:[257,316,332],at_init:[6,106,124,143,174,229,230,231,245],at_initial_setup:[103,269],at_initial_setup_hook_modul:269,at_login:[39,124,276,277,285,288,293,294,304],at_look:[95,143,245],at_message_rec:143,at_message_send:143,at_msg_rec:[143,188,245],at_msg_send:[143,145,188,245],at_new_arriv:229,at_now_add:85,at_object_cr:[5,6,21,25,31,38,42,57,59,72,79,80,84,88,95,120,122,124,131,158,186,188,205,211,213,216,217,218,219,220,225,229,230,231,245,316],at_object_delet:[196,245],at_object_leav:[231,233,245],at_object_post_copi:245,at_object_rec:[88,116,231,233,245],at_password_chang:143,at_post_cmd:[30,33,149,153,166,169],at_post_command:33,at_post_disconnect:143,at_post_login:[25,143],at_post_portal_sync:303,at_post_puppet:[95,196,245],at_post_unpuppet:[95,245],at_pre_cmd:[33,149,153,166,169],at_pre_command:33,at_pre_login:143,at_pre_puppet:[95,245],at_pre_unpuppet:[196,245],at_prepare_room:233,at_reload:[42,168,303],at_renam:316,at_repeat:[101,115,119,120,124,145,178,183,194,216,217,218,219,220,222,226,257,298,329],at_return:[10,342],at_return_funct:10,at_return_kwarg:[10,342],at_sai:[117,196,245],at_script_cr:[101,115,119,120,145,178,183,194,203,204,216,217,218,219,220,222,226,233,249,257,298,329],at_search_result:[167,342],at_server_cold_start:303,at_server_cold_stop:303,at_server_connect:283,at_server_reload:[101,109,143,145,245,257],at_server_reload_start:303,at_server_reload_stop:[25,303],at_server_shutdown:[101,109,143,145,245,257],at_server_start:303,at_server_startstop:[25,103],at_server_stop:303,at_shutdown:303,at_start:[101,115,145,194,226,233,254,257],at_startstop_modul:259,at_stop:[101,115,120,216,217,218,219,220,226,257],at_sunris:61,at_sync:[304,305],at_tick:[114,259],at_travers:[88,196,212,233,245],at_traverse_coordin:233,at_turn_start:218,at_upd:[218,255],at_weather_upd:131,atlanti:24,atom:97,atop:233,atribut:323,att:50,attach:[4,11,21,40,42,55,57,63,76,88,94,101,104,109,111,118,139,153,158,163,166,188,198,214,233,240,245,256,302,313,317],attachmentsconfig:4,attack:[14,28,29,30,45,50,72,76,89,102,115,118,121,133,138,152,205,214,216,217,218,219,220,229,230,245,250,283],attack_count:219,attack_nam:219,attack_skil:250,attack_typ:220,attack_valu:[216,217,218,219,220],attempt:[0,2,22,24,29,31,42,50,59,60,86,90,102,105,118,119,134,155,158,186,209,211,216,217,218,219,220,262,265,270,303,308,316,342,360],attent:[55,57,88,102,110],attitud:56,attr1:[42,158,202],attr2:[42,158,202],attr3:[42,158],attr:[11,22,42,48,50,57,79,108,118,136,158,165,179,231,239,249,250,304,314,316,332,338],attr_categori:313,attr_eq:239,attr_g:[79,239],attr_gt:[79,239],attr_kei:313,attr_l:[79,239],attr_lockstr:313,attr_lt:[79,239],attr_n:[79,239],attr_nam:158,attr_obj:[314,316],attr_object:316,attr_typ:313,attr_valu:313,attract:37,attrcreat:[79,314],attread:11,attredit:[11,79,314],attrib:240,attribiut:314,attribut:[0,2,6,12,20,22,25,27,28,30,38,40,41,42,44,45,48,49,50,55,56,57,59,60,68,72,73,76,79,80,81,83,84,85,86,88,90,94,101,104,107,108,111,114,115,118,122,124,126,132,133,137,138,140,141,143,144,147,152,158,167,168,172,174,179,180,186,193,194,201,202,205,212,216,217,218,219,220,225,229,230,231,239,242,244,245,248,249,250,252,254,255,270,304,312,313,315,316,317,322,323,324,335,336,339,342,355,360,362],attribute1:122,attribute2:122,attribute_list:314,attribute_nam:[143,205,245,339],attributeerror:[41,59,85,304,314],attributeform:313,attributeformset:313,attributehandl:[1,124,314,337,342],attributeinlin:[144,172,242,252,313],attributeobject:11,attrkei:250,attrlist:314,attrnam:[11,42,50,79,108,124,158,239,316],attrread:[11,79,314],attrtyp:[11,314,315],attrvalu:50,attryp:315,atttribut:48,atyp:240,audibl:204,audio:136,audit:[140,174,177,206,245],audit_callback:208,auditedserversess:[208,209],auditingtest:210,aug:9,august:[9,342],aut:51,auth:[143,144,147,285,347,355,360],auth_password:285,auth_profile_modul:147,authent:[39,102,104,106,132,137,143,276,283,285,288,294,304,306,347,360],authenticated_respons:358,author:[40,89,125,143,191,194],auto:[0,5,12,14,21,31,32,33,34,41,42,44,50,52,62,70,88,94,95,104,121,130,132,137,140,143,147,149,153,157,158,165,168,169,204,205,226,234,237,240,245,250,254,257,259,262,265,276,286,293,294,303,306,316,321,327,328,347],auto_help:[33,40,43,50,67,68,153,169,187,247,326,327],auto_id:[144,235,242,355],auto_look:[50,187,247,326],auto_now_add:85,auto_quit:[50,187,247,326],auto_transl:204,autobahn:[276,282,293],autofield:132,autologin:347,autom:[14,36,56,57,78,85,99,102,109,360],automat:[0,6,10,14,19,22,23,27,30,31,34,37,40,42,45,46,49,50,52,54,57,59,61,63,64,65,67,70,71,79,80,83,84,85,89,95,96,99,101,103,104,108,110,115,116,117,118,120,122,123,124,125,127,130,134,135,136,138,139,143,151,152,153,158,163,164,166,173,178,179,180,181,193,194,195,199,200,202,203,204,205,213,220,225,226,232,240,244,245,256,257,258,259,270,279,282,285,290,303,306,320,324,326,327,328,342,348,361],automatical:259,autostart:[256,322],autumn:[96,98,186],avail:[0,5,7,8,10,11,13,16,21,22,23,24,25,26,31,33,36,38,39,40,41,42,43,45,47,48,50,52,56,57,59,61,62,63,64,71,73,74,75,76,77,78,79,80,81,84,87,88,89,90,94,95,97,99,101,103,104,105,107,108,109,110,112,113,115,118,120,121,122,124,126,127,130,132,133,136,137,138,140,143,149,150,151,152,153,155,158,160,163,164,165,166,167,168,169,170,178,179,180,184,186,188,194,198,201,203,204,205,213,214,216,217,218,219,220,223,230,231,239,240,245,248,249,250,254,270,294,297,308,319,320,321,326,327,328,334,342,360],avail_cmdset:158,available_choic:[50,326],available_func:334,available_funct:249,available_languag:204,available_weapon:230,avatar:[63,87,95,245,285],avatarid:285,avenu:181,averag:[13,42,89,92,168,194,204,232],avoid:[8,11,23,26,27,31,33,37,39,41,42,50,79,80,84,94,96,99,108,110,113,124,125,126,128,130,137,138,151,158,203,204,232,233,239,244,270,274,284,294,304,314,316,319,320,321,324,327,332],awai:[0,9,10,11,14,15,21,26,29,41,42,45,48,50,54,65,67,68,72,79,85,89,95,101,104,108,110,120,122,130,164,181,214,217,220,223,225,229,231,233,245,254,305,319,342],await:10,awar:[11,14,26,31,33,43,50,87,94,95,109,124,125,131,132,188,203,205,229,232,233,245,316,319],awesom:[62,134],aws:89,axhear:239,axi:199,azur:99,b64decod:338,b64encod:338,b_offer:178,baaaad:126,babi:137,back:[0,3,5,10,11,12,13,14,20,21,22,23,26,27,29,31,33,34,36,42,45,48,49,50,55,57,59,60,62,63,68,72,73,80,82,84,85,86,89,90,94,95,96,99,101,104,105,109,110,112,115,117,118,120,121,122,124,125,130,132,134,136,140,143,152,155,158,163,167,178,179,205,211,214,219,223,247,257,265,270,274,277,283,285,288,303,316,323,326,327,335,342],back_exit:0,backbon:[132,320],backend:[23,36,108,126,134,140,314,342,344,346],backend_class:314,background:[10,17,29,50,89,102,109,113,125,132,182,189,319,334,360],backpack:31,backslash:113,backtick:130,backtrack:130,backup:[10,88,89,104,130,167,320],backward:[49,50,57,120,335],bad:[0,22,24,37,40,57,63,69,75,84,118,126,209,267],bad_back:240,badg:129,bag:342,balanc:[29,55,60,78,115,328],balk:94,ball:[31,58,103,150,151,250],ballon:202,balloon:202,ban:[7,25,79,138,143,156,240,362],band:[44,87,136,285,288,289],bandit:45,bandwidth:278,banid:[42,156],bank:60,bar:[50,81,82,83,87,111,134,136,189,205,214,289,326,342],bare:[33,54,57,72,103,189,217],barehandattack:55,bargain:85,barkeep:[41,205],barter:[60,62,101,116,140,141,177],bartl:78,base:[3,4,6,9,13,16,17,20,21,22,23,30,33,34,36,38,40,41,42,48,50,54,55,56,57,59,60,62,63,68,71,72,74,76,78,79,82,84,85,88,89,93,95,99,101,102,104,107,110,112,114,118,119,122,123,124,125,126,128,132,133,135,136,137,138,140,143,144,145,146,147,149,151,152,153,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,172,173,174,175,176,178,179,180,181,183,184,185,186,187,188,191,192,194,195,196,197,198,199,200,201,202,203,204,205,209,210,211,212,213,214,216,217,218,219,220,222,223,225,226,227,229,230,231,232,233,235,236,237,240,242,243,244,245,247,249,250,252,253,254,255,256,257,258,259,261,262,263,265,267,268,271,272,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,296,297,298,301,303,304,305,306,308,309,310,313,314,315,316,317,319,320,321,324,325,326,327,328,329,331,332,333,334,335,336,337,338,339,340,341,342,347,349,350,355,358,360,362],base_account_typeclass:[2,140],base_channel_typeclass:140,base_char_typeclass:119,base_character_typeclass:[42,80,119,132,133,140,143,158],base_exit_typeclass:140,base_field:[144,235,242,313,355],base_guest_typeclass:[65,140],base_object_typeclass:[108,140,250,316],base_random:248,base_room_typeclass:140,base_script_path:239,base_script_typeclass:[101,140],base_set:9,baseclass:230,basecontain:321,baseinlineformset:313,baseline_index:342,baseobject:124,baseopt:336,basepath:342,basetyp:[245,320],basetype_posthook_setup:245,basetype_setup:[38,79,95,143,145,174,245],bash:[36,62],basi:[4,33,37,61,89,135,137,166,176,205,239,294,316,325],basic:[0,2,3,6,15,16,17,19,20,22,26,29,31,33,34,36,38,39,42,45,46,47,55,56,57,59,60,61,68,72,76,78,79,80,82,85,86,109,110,112,115,116,117,120,121,123,125,127,132,133,134,136,138,143,145,158,163,165,174,176,187,193,199,202,217,219,230,239,241,245,296,340,344,355,360,362],bat:[9,62],batch:[18,20,42,47,62,78,110,121,123,138,140,141,157,250,274,314,317,318,362],batch_add:[250,314,317],batch_cmd:14,batch_cod:[13,320],batch_code_insert:13,batch_create_object:250,batch_exampl:320,batch_import_path:[13,14],batch_insert_fil:14,batch_update_objects_with_prototyp:250,batchcmd:[42,157],batchcmdfil:[14,320],batchcod:[14,78,110,157],batchcode_map:110,batchcode_world:110,batchcodefil:13,batchcodeprocessor:320,batchcommand:[14,20,22,62,121,157,320],batchcommandprocessor:320,batchfil:[14,15,110,320],batchprocess:[140,148,154],batchprocessor:[13,140,141,157,318],batchscript:[13,320],batteri:143,battl:[78,102,115,121,216,217,218,219,220],battlecmdset:[216,217,218,219,220],baz:214,bazaar:107,beach:110,bear:[203,229],beat:[60,115],beaten:[115,231],beauti:[22,48,132],beazlei:78,becam:[29,125],becasu:52,becaus:[0,2,6,8,9,10,11,12,13,15,16,21,22,25,29,31,36,39,40,41,43,45,53,55,58,63,67,72,75,76,79,88,90,94,95,106,107,108,110,114,115,116,118,124,125,132,133,135,144,152,170,174,185,193,196,204,219,223,233,245,257,277,283,296,306,313,319,336,338],becom:[0,5,10,22,37,40,41,42,46,48,50,55,58,60,63,69,72,77,79,80,85,86,87,94,95,101,103,108,110,118,127,155,188,202,204,214,217,250,304,320,326],bed:60,been:[0,4,5,6,13,14,19,21,22,23,36,40,41,42,45,48,50,57,68,69,75,78,84,90,92,93,95,102,104,115,116,118,122,125,127,130,132,133,134,136,137,151,152,157,158,166,167,174,179,194,196,199,202,203,205,216,217,218,219,220,231,233,237,240,244,245,250,259,267,279,283,285,293,303,304,305,306,308,313,314,316,320,324,325,342,360],befit:124,befor:[1,4,10,11,12,13,14,15,20,21,22,25,27,28,29,31,33,37,40,41,42,45,47,48,50,55,56,57,59,60,68,70,74,76,78,79,80,83,84,85,89,90,92,95,96,99,101,102,103,105,106,107,108,110,111,112,113,114,115,116,117,118,120,122,123,124,125,126,129,130,131,132,133,134,136,137,138,143,149,150,153,158,163,166,170,174,183,185,186,187,188,189,193,196,197,200,204,205,208,209,214,216,217,218,219,220,225,226,230,233,239,240,244,245,248,250,257,258,259,265,274,283,285,291,299,301,303,304,308,310,314,319,320,321,322,326,327,328,329,333,335,338,342,360],beforehand:[11,130,321],beg:14,beggar:0,begin:[0,4,6,10,13,14,20,22,25,33,40,41,42,45,49,54,57,60,68,71,79,90,94,95,105,106,110,115,116,118,126,131,133,164,193,196,205,214,216,217,218,219,220,245,257,319,320,339],beginn:[54,59,76,78,90,94,123],behav:[11,13,20,22,29,68,90,94,106,109,126,249,342],behavior:[0,5,11,31,33,40,49,67,68,92,95,101,108,113,125,134,136,137,143,153,169,181,187,218,220,231,232,265,313],behaviour:[11,31,33,79,125,199,311,322,328,342],behind:[11,12,21,33,42,48,54,58,60,62,73,96,108,111,113,121,125,130,157,203,231,254,259,332],being:[0,5,6,10,11,13,20,21,22,25,28,31,33,34,36,37,41,42,50,53,55,58,60,62,63,68,82,87,89,90,92,94,95,101,102,106,108,110,114,117,124,125,126,128,130,132,137,143,150,158,164,168,174,183,184,188,198,204,205,216,217,218,219,220,225,226,231,237,245,267,270,277,306,308,313,314,316,319,320,322,326,327,328,342],beipmu:24,belong:[4,14,42,63,82,94,102,111,118,132,139,152,205,214,233,237,248],below:[0,1,5,8,9,10,11,12,13,14,15,19,20,22,23,25,27,29,31,33,34,36,38,41,42,47,48,49,50,56,57,58,59,60,61,62,63,68,69,72,73,79,80,86,87,89,93,94,95,99,101,104,105,108,109,110,113,116,117,118,122,124,126,130,132,133,135,137,139,147,158,166,167,176,179,181,184,189,196,199,204,205,214,216,217,218,219,220,227,232,237,239,244,245,254,277,297,314,316,317,328,333,334],belt:76,beneath:27,benefici:[48,218],benefit:[77,89,99,102,107,126,152,314,320],besid:[0,14,31,105,110,189],best:[9,22,24,26,37,49,56,57,58,60,71,75,101,102,103,107,132,134,138,165,179,204,214,232,250,265,285,328,336,362],bet:[31,104,137,316],beta:[35,53,89],betray:50,better:[0,9,15,23,25,34,40,41,43,44,50,54,57,58,60,63,67,69,72,80,84,85,90,92,94,107,108,111,113,132,133,180,212,217,223,231,245,250,282,285,288,296,314,320],bettween:72,between:[0,2,10,14,22,25,28,31,33,36,38,39,40,42,45,48,55,56,57,63,68,72,75,84,86,87,89,90,99,101,104,108,111,112,113,115,119,120,121,122,123,125,130,136,137,139,150,153,158,165,168,169,176,178,181,182,193,194,196,197,198,199,201,203,204,205,214,216,217,218,219,220,245,250,259,265,274,277,284,285,288,289,296,297,304,317,319,320,322,326,328,329,334,342,349],bew:186,bewar:38,beyond:[1,2,9,22,25,33,37,51,56,63,87,88,89,126,133,153,158,169,176,179,205,214,249,314,316,326,328],bg_colormap:341,bgcolor:341,bgfgstart:341,bgfgstop:341,bgstart:341,bgstop:341,bias:158,bidirect:274,big:[9,11,13,14,20,28,29,33,37,44,56,72,79,95,121,137,139,150,167,320,327,339,342],bigger:[21,37,39,68,118,122,136],biggest:[71,137,342],biggui:33,bigmech:21,bigsw:29,bikesh:118,bill:[89,102],bin:[4,9,36,46,62,63,74,95,99],binari:[23,46,62,92,94,276,278,293],bind:66,birth:355,bit:[0,4,9,12,17,22,26,29,35,38,40,41,42,45,58,60,61,62,68,74,75,80,95,101,105,108,120,121,126,130,133,136,137,170,185,240,245,320],bitbucket:56,bite:[60,110],black:[72,113,125],blackbird:78,blackbox:137,blacklist:102,blade:230,blank:[50,85,116,133,143,187,319],blankmsg:187,blargh:108,blatant:12,blaufeuer:118,bleed:[113,130,328],blend:202,blender:202,bless:137,blind:[113,117,223,226],blindcmdset:223,blindedst:226,blindli:240,blink:[20,225,226,341],blinkbuttonev:226,blist:96,blob:137,block:[3,12,25,28,42,49,50,54,57,63,68,79,89,90,96,101,102,109,113,122,128,132,133,138,156,157,158,186,220,229,230,233,247,284,320,326,334,342,360],blocking_cmdset:25,blockingcmdset:25,blockingroom:25,blocktitl:68,blog:[37,54,78,89,97],blowtorch:24,blue:[13,56,80,113,125,230],blueprint:[56,95,110,136],blurb:53,board:[34,48,60,78,79,120],boat:[31,120,152],bob:[33,42,80,137,156],bodi:[3,17,22,27,33,40,45,50,57,94,108,126,128,132,174,192,198,267,322,342],bodyfunct:[20,101,140,177,221,227],bog:21,boi:111,boiler:124,bold:53,bolt:250,bone:[54,72],bonu:[40,72,89,217,218,254],bonus:[29,217],book:[3,48,61,72,78,90,94,108,134],bool:[2,31,33,34,50,73,83,101,143,144,145,147,149,150,151,152,153,158,172,174,175,176,178,179,181,183,184,187,189,191,194,196,199,203,204,205,214,216,217,218,219,220,225,233,236,240,242,244,245,248,249,250,252,254,255,256,257,258,259,265,270,271,276,277,282,283,284,288,293,294,302,304,306,308,314,315,316,317,319,320,322,324,326,327,328,329,332,334,337,339,341,342],booleanfield:[132,144,235],boom:21,boot:[79,99,109,156,259],bootstrap:[4,123,137,138,362],border:[42,57,81,110,155,187,325,327,328],border_bottom:328,border_bottom_char:328,border_char:328,border_left:328,border_left_char:328,border_right:328,border_right_char:328,border_top:328,border_top_char:328,border_width:328,borderless:57,borderstyl:187,bore:[12,54,102],borrow:[31,62,151,274],bort:51,boss:57,bot:[42,46,64,71,92,102,118,132,140,141,142,147,163,174,270,276,277,284,306,360],bot_data_in:[145,270],both:[0,11,15,19,22,23,25,26,27,31,33,34,36,37,39,42,43,48,55,56,57,61,64,68,70,73,78,83,84,85,86,87,89,90,94,96,102,103,104,105,109,110,115,118,120,123,124,126,127,130,132,133,135,137,149,151,158,163,168,176,178,182,189,196,198,199,200,202,211,214,219,220,231,240,245,249,250,251,254,257,259,274,283,293,294,303,305,308,314,315,319,322,326,328,337,342],bother:[29,102,127,173,314],botnam:[42,71,163,277,306],botnet:102,botstart:145,bottom:[4,38,40,51,53,56,57,59,68,84,94,100,105,110,124,126,132,136,152,198,219,233,250,320,327,328],bought:84,bouncer:[27,102,325],bound:[6,27,56,107,191,342],boundari:342,bounti:69,bountysourc:69,bow:250,box:[0,3,8,20,41,42,45,57,62,65,68,69,70,72,79,86,89,103,105,108,110,122,134,137,158,205,239,274,320,355,361],brace:[0,22,25,40,90,196,245,319],bracket:[42,95,128,168,182],brainstorm:[138,362],branch:[9,36,37,40,62,99,203,214],branchnam:130,brandymail:198,bread:16,breadth:220,break_lamp:225,break_long_word:328,break_on_hyphen:328,breakdown:[42,168],breakpoint:[16,105,140],breez:[101,131],breviti:57,bribe:50,brick:81,bridg:[22,23,78,82,104,231],bridgecmdset:231,bridgeroom:231,brief:[3,16,19,20,21,25,45,57,59,84,85,94,95,100,109,123,130,138,187,232,245,309],briefer:[88,109],briefli:[16,89,109],bright:[80,113,125,182,319],brightbg_sub:319,brighten:113,brighter:113,brilliant:130,bring:[23,48,52,95,99,102,120,122,132,135,214,220,223,229,307],broad:38,broadcast:[42,163,274],broader:[38,205,245],broadli:93,broken:[60,107,113,204,225,226,334],brought:101,brows:[3,9,25,38,54,57,61,68,84,89,90,102,105,122,130,135,136,137,360,361],browser:[3,8,9,16,54,62,63,68,69,74,76,89,94,95,100,102,132,133,134,135,136,137,293,294,360],brutal:232,bsd:77,btest:113,btn:17,bucket:208,buf:324,buffer:[22,33,49,136,167,267,294,324],bug:[10,13,26,37,41,53,56,59,60,69,77,93,94,95,109,122,126,130,226,245,316],buggi:[11,326],bui:[84,137,178],build:[1,6,7,9,10,11,13,14,15,27,31,36,46,50,54,56,59,62,63,67,68,74,76,78,79,80,85,86,88,95,99,104,105,107,108,111,112,118,119,121,122,124,128,129,135,136,138,139,140,148,150,154,156,157,164,165,174,179,186,192,199,204,205,211,229,232,240,245,249,250,265,276,277,320,328,355,361,362],build_exit:199,build_forest:199,build_map:199,build_match:150,build_mountain:199,build_templ:199,builder:[2,4,14,19,22,25,42,55,57,59,60,67,79,84,107,108,111,113,122,123,138,156,158,164,168,179,181,186,187,199,202,205,211,231,232,233,240,245,248,296,316,320,361,362],buildier:250,building_menu:[140,141,177],buildingmenu:[22,179],buildingmenucmdset:179,buildmap:199,buildprotocol:[262,275,276,277],buildshop:84,built:[13,16,20,27,39,50,53,54,56,57,60,62,63,72,74,76,94,95,99,102,120,121,122,134,137,138,147,176,202,204,237,244,254,259,314,316,317,320,324,326,333],builtin:[93,278],bulk:[95,102],bullet:60,bulletin:[60,78,79],bunch:[15,27,57,107,112],burden:81,buri:[107,121],burn:[60,72,89,230],busi:[63,69,89,178],butch:95,butt:137,butter:16,button:[9,13,14,31,33,42,79,82,86,87,105,130,132,133,134,136,137,158,223,225,226,230,297],button_expos:230,buy_ware_result:84,byngyri:204,bypass:[4,10,19,20,42,52,57,79,115,125,143,158,174,211,239,240,316,322,339,347],bypass_superus:79,bytecod:319,bytestr:[274,342],bytestream:342,c_creates_button:297,c_creates_obj:297,c_dig:297,c_examin:297,c_help:297,c_idl:297,c_login:297,c_login_nodig:297,c_logout:297,c_look:297,c_move:297,c_moves_:297,c_moves_n:297,c_social:297,cabl:81,cach:[6,8,11,12,28,33,38,42,85,118,124,126,136,143,153,168,173,174,186,229,230,240,244,245,269,313,314,316,317,318,330,332,342],cache_inst:332,cache_lock_bypass:240,cache_s:[308,332],cached_properti:342,cactu:219,cake:31,calcul:[10,25,27,38,72,115,118,122,138,152,183,186,197,204,216,217,219,220,250,327,329,332,342,360],calculated_node_to_go_to:50,calculu:55,calendar:[183,197,329],call:[0,2,3,4,5,6,10,11,13,14,16,20,21,22,23,25,26,27,28,29,30,31,36,38,39,40,41,42,45,46,47,48,49,50,54,55,56,57,58,59,60,61,62,63,64,68,70,71,72,73,74,79,80,82,83,84,85,87,88,89,90,92,94,95,99,101,103,104,106,107,108,109,110,113,114,115,116,117,118,119,120,121,122,124,125,126,127,130,131,132,133,134,136,137,143,145,149,150,151,152,153,155,158,163,166,167,168,169,170,173,174,178,179,181,183,184,185,186,187,188,191,192,193,194,195,196,197,199,200,202,203,204,205,211,213,214,216,217,218,219,220,222,223,225,226,229,230,231,232,233,239,240,244,245,248,249,250,255,256,257,258,259,262,265,267,269,270,274,275,276,277,278,279,280,281,283,284,285,286,287,288,289,290,292,293,294,296,297,298,303,304,305,306,307,310,313,314,316,317,319,320,321,322,324,326,328,329,332,334,335,337,338,339,342,355,360],call_async:10,call_command:126,call_ev:[0,193],call_inputfunc:[82,304,306],callabl:[48,49,50,83,108,114,122,179,187,194,214,218,245,248,249,250,255,259,263,265,267,275,321,324,326,327,335,337,338,342],callables_from_modul:342,callbac:22,callback1:326,callback:[4,10,22,27,29,33,49,50,61,73,83,114,137,145,179,183,187,191,192,193,194,195,196,197,209,214,245,255,257,258,259,263,265,267,270,274,275,276,278,292,293,296,307,326,329,335,340,342,362],callback_nam:[191,194],callbackhandl:[140,177,190,196],called_bi:149,calledbi:342,caller:[5,10,11,13,21,22,25,27,28,29,30,33,40,41,42,43,48,49,55,57,58,59,70,72,79,80,81,82,84,85,86,87,88,90,110,114,115,118,120,122,124,128,145,149,150,151,153,155,158,159,163,164,165,166,167,168,169,173,179,187,192,198,199,200,202,205,213,214,230,231,232,233,240,245,247,249,320,324,326,327,334,336,342],callerdepth:342,callertyp:149,callinthread:310,calllback:193,callsign:[50,270],calm:110,came:[9,21,25,54,78,110,131,137,196,229,233,245],camp:110,campfir:110,campsit:110,can:[0,1,2,3,4,5,6,9,10,12,13,14,15,17,19,20,21,23,24,25,26,27,28,29,30,31,33,34,35,36,37,38,39,40,41,42,43,45,47,48,49,50,52,53,55,56,57,58,59,60,61,62,63,64,65,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,129,130,132,133,134,135,136,137,138,139,142,143,145,147,150,151,152,153,155,156,158,163,164,165,166,167,168,169,173,174,175,176,178,179,181,182,183,184,186,187,188,189,193,194,196,197,198,199,202,203,204,205,208,211,214,216,217,218,219,220,223,225,226,229,230,231,232,233,237,239,240,244,245,248,249,250,251,254,255,256,257,259,265,276,280,283,285,288,289,293,294,296,297,303,304,305,306,307,310,311,312,314,315,316,317,319,320,321,322,324,325,326,327,328,334,336,337,338,339,340,342,343,355,360,361],can_:193,cancel:[27,29,73,193,196,216,217,218,219,220,245],candid:[22,33,118,132,150,202,205,245,339],candl:152,cannot:[5,9,10,11,13,14,19,21,22,25,27,28,29,31,33,38,42,43,45,49,50,52,55,59,60,62,68,69,72,75,79,84,89,103,108,111,113,121,122,126,127,132,138,143,145,155,158,174,179,186,187,191,194,196,211,214,220,226,229,230,236,239,240,245,259,314,321,323,325,328,332,342],cantanker:336,cantclear:187,cantillon:78,cantmov:25,canva:48,capabl:[6,36,42,48,57,63,79,82,87,104,155,213,270,292,355],cape:56,capfirst:68,capit:[9,12,25,29,42,63,87,94,122,158,188,203,204,319],captcha:132,captur:[25,90,137,335,360],car:[86,120],card:102,cardin:[42,43,48,57,158],care:[0,4,10,12,23,33,43,48,50,55,56,61,63,77,85,90,109,115,120,125,131,143,151,174,186,202,205,229,239,245,248,316,320,324,326,327,328,342],carefulli:[54,92,104,110,132],carri:[20,31,60,79,81,84,115,116,176,181,217,229,239,304,315],cascad:332,caseinsensitivemodelbackend:347,cast:[28,108,111,214,219],caster:[28,219],castl:[13,110,121,186,231],cat:74,catchi:4,categor:111,categori:[1,5,11,33,36,38,42,50,67,68,85,108,111,118,126,139,153,154,155,156,157,158,163,164,165,166,167,168,169,170,173,178,179,180,181,184,185,186,187,188,192,198,199,200,201,202,205,211,212,213,214,216,217,218,219,220,223,229,230,231,232,236,237,239,245,249,250,314,315,317,322,324,326,327,333,336,339,342,360],categoris:55,category2:333,category2_id:333,category_id:333,category_index:214,cater:29,caught:[41,50,96,175],caus:[11,12,29,30,31,41,59,60,63,76,79,89,95,113,115,116,118,122,126,136,139,152,185,223,225,233,245,296,328,342],caution:[61,136,326],cave:45,caveat:[5,10],caveman:55,cblue:130,cboot:[12,163],cc1:62,cccacccc:325,ccccc2ccccc:57,cccccccc:325,ccccccccccc:57,cccccccccccccccccbccccccccccccccccc:325,ccccccccccccccccccccccccccccccccccc:325,ccreat:[40,57,64,71,97,163],cdesc:[40,163],cdestroi:163,cdmset:31,cdn:102,ceas:[42,76,158],cel:325,celebr:60,cell:[57,68,110,187,325,328],celltext:325,cemit:163,censu:315,center:[4,16,38,48,108,110,113,189,248,319,328,342],center_justifi:[108,248],centos7:66,centr:110,central:[26,54,60,63,73,99,110,122,123,126,131,137,138,143,176,245,250,274,322,332,361,362],centre_east:110,centre_north:110,centre_south:110,centre_west:110,centric:[9,79,104,122,205],cert:[8,66,286,290],certain:[13,14,16,19,25,29,31,33,37,42,47,63,74,79,87,89,96,101,104,106,107,113,114,120,137,158,175,178,204,208,226,230,233,239,257,265,271,288,292,307,313,314,315,324,328,339,342,355],certainli:[15,43,137],certbot:[89,102],certfil:[286,290],certif:[8,89,286,290],cet:335,cflag:74,cgi:89,cha:[50,57],chain:[0,10,29,45,50,108,118,193,194,297,326,342],chain_1:0,chainedprotocol:285,chainsol:118,chair:[13,60,88,90,111,124],challeng:[72,78],chanalia:[42,163],chanc:[21,22,28,31,53,60,65,66,72,114,115,121,130,151,216,217,218,219,220,223,230,231,297],chance_of_act:297,chance_of_login:297,chandler:115,chang:[2,3,4,7,8,9,11,12,13,14,15,16,19,20,21,22,23,26,29,30,31,33,34,35,36,37,38,40,41,42,44,46,48,49,50,53,56,60,61,62,63,65,67,70,72,73,74,76,77,79,80,82,83,84,85,86,88,89,90,93,94,95,99,101,103,104,106,108,109,110,111,113,114,115,117,120,122,124,125,126,129,131,132,133,134,136,137,138,143,144,152,153,155,156,158,163,164,169,172,174,178,179,181,185,186,188,189,191,194,196,200,201,204,205,211,212,214,216,217,218,219,220,229,230,231,232,233,237,242,245,250,252,254,255,257,259,265,270,281,296,303,304,311,313,314,316,320,323,324,327,328,335,336,337,338,360],change_name_color:214,changeabl:75,changelog:95,changepag:133,chanlist:[42,163],channam:40,channel:[2,6,7,11,12,19,27,31,33,44,54,64,69,70,71,78,79,81,85,86,89,97,106,111,118,122,123,124,137,138,143,145,149,151,152,158,163,167,171,172,173,174,175,176,194,269,276,277,284,297,304,306,314,322,335,339,358,360,362],channel_:34,channel_ban:[40,163],channel_color:25,channel_command_class:[34,40],channel_connectinfo:304,channel_detail:360,channel_handl:[140,173],channel_list:360,channel_prefix:[25,174],channel_search:175,channel_set:176,channel_typeclass:358,channeladmin:172,channelam:173,channelattributeinlin:172,channelcmdset:31,channelcommand:[34,40,173],channelconnect:176,channelcr:[42,163],channelcreateview:174,channeldb:[40,124,140,172,174,176,312],channeldb_db_attribut:172,channeldb_db_tag:172,channeldb_set:[314,317],channeldbmanag:[175,176],channeldeleteview:174,channeldesc:[40,173],channeldetailtest:358,channeldetailview:[174,360],channelhandl:[34,40,140,141,149,171,174],channelkei:[40,173,175],channellist:[42,163],channellisttest:358,channellistview:360,channelmanag:[174,175],channelmixin:360,channelnam:[34,40,71,145,173,276],channeltaginlin:172,channelupdateview:174,char1:[42,72,126,164,358],char2:[42,72,126,164,358],char_health:231,char_nam:132,charac:83,charact:[0,2,5,9,11,14,15,17,19,20,21,22,23,27,28,29,30,31,33,34,36,38,39,40,41,42,44,46,48,49,50,54,55,56,61,67,68,70,73,75,76,79,80,84,85,86,87,90,94,96,101,104,110,112,113,115,116,117,118,119,120,123,124,126,128,134,135,137,138,140,142,143,150,151,153,155,158,159,160,164,165,166,173,174,179,180,181,186,187,188,189,191,193,194,196,198,199,201,203,204,205,208,213,214,216,217,218,219,220,222,229,230,231,233,237,240,245,257,270,291,304,309,314,316,319,320,325,326,328,334,340,342,343,355,358,360,362],character1:72,character2:72,character_cmdset:186,character_form:360,character_id:245,character_list:360,character_manage_list:360,character_typeclass:[126,143,340,358],charactercmdset:[5,21,22,25,30,31,40,42,43,56,57,59,61,80,122,160,179,181,186,198,201,211,216,217,218,219,220,231],charactercreateview:[358,360],characterdeleteview:[358,360],characterdetailview:360,characterform:[355,360],characterlistview:[358,360],charactermanageview:[358,360],charactermixin:360,characternam:113,characterpuppetview:[358,360],charactersheet:50,characterupdateform:[355,360],characterupdateview:[358,360],charapp:132,charat:187,charcreat:[0,45,68,155,180],chardata:57,chardelet:155,chardeleteview:[237,316],chardetailview:[237,316],charfield:[85,132,144,235,242,313,338,355],charg:89,chargen:[132,138,140,141,174,177,237,316],chargencmdset:122,chargenroom:122,chargenview:[237,316],charnam:[42,57,155],charpuppetview:316,charset:342,charsheet:57,charsheetform:57,charupdateview:[237,316],chase:121,chat:[1,2,9,26,34,37,47,54,57,59,62,64,69,71,78,79,97,122,130,138,294,335],chatroom:56,chatzilla:71,cheap:130,cheaper:[60,114],cheapest:89,cheapli:231,cheat:[23,72],cheatsheet:47,check:[0,4,5,12,13,14,19,22,25,26,27,28,29,31,33,36,37,38,39,40,41,42,43,45,48,50,53,55,57,59,62,64,67,68,69,70,72,76,80,81,84,85,86,88,89,90,94,96,97,99,101,102,105,108,109,110,111,113,114,115,116,117,118,120,122,124,126,127,129,130,132,135,136,137,138,143,144,149,150,151,152,153,155,157,158,164,165,166,168,170,174,176,178,180,181,185,186,187,194,198,216,217,218,219,220,222,223,226,229,231,232,233,239,240,244,245,249,250,254,256,257,264,265,269,274,280,285,289,304,306,308,309,310,313,314,316,317,319,320,322,336,337,342,343,360],check_attr:158,check_circular:294,check_databas:265,check_db:265,check_defeat:72,check_end_turn:115,check_error:264,check_evennia_depend:342,check_from_attr:158,check_grid:48,check_has_attr:158,check_light_st:231,check_lockstr:[4,79,240],check_main_evennia_depend:265,check_obj:158,check_permiss:249,check_permstr:[143,316],check_show_help:165,check_to_attr:158,check_warn:264,checkbox:132,checker:[15,48,93,239,285,343],checkout:[9,99,130],checkoutdir:36,chest:[79,90],child:[6,33,42,50,63,79,95,115,145,147,153,158,169,231,244,250,254,310,333],childhood:50,children:[21,33,63,95,111,116,118,124,147,244,245,254,265,315,333],chillout:[42,158],chime:27,chines:[25,78,112],chip:57,chmod:36,choci:179,chocol:59,choic:[4,15,23,33,42,50,54,59,77,89,90,94,104,106,108,112,115,118,123,126,128,131,143,155,158,178,179,187,216,232,248,263,324,326],choice1:128,choice2:128,choice3:128,choos:[7,9,10,13,48,50,56,61,63,71,72,84,100,105,115,119,122,125,132,134,137,138,139,213,214,216,217,218,219,220,223,229,278,326,341,362],chop:[33,230],chore:67,chose:[53,57,85,102,132,214],chosen:[22,50,87,105,115,131,137,187,189,326],chown:99,chractercmdset:231,christin:95,chrome:24,chronicl:187,chroot:66,chug:33,chunk:[13,68,110,267,320,334],church:27,church_clock:27,cid:297,cillum:51,circl:38,circuit:136,circular:[267,321],circumst:[45,50,56,84,118,151,219,355],circumv:[42,156],clang:74,clank:0,clarif:[1,47],clarifi:25,clariti:[74,85,90,122],clash:[23,31,42,89,158,173,316],class_from_modul:342,classic:[3,13,78,104,111,114,115],classmethod:[38,143,174,237,245,257,316,332,349],classnam:11,classobj:316,claus:[77,117],clean:[1,4,17,25,28,42,47,50,75,109,110,113,115,121,130,144,151,153,158,174,178,205,216,217,218,219,220,226,230,231,233,245,254,265,269,283,293,306,313,316,319,324,326,332,338,341,342,355],clean_attr_valu:313,clean_attribut:[124,143,316],clean_cmdset:[124,316],clean_senddata:306,clean_str:319,clean_usernam:144,cleaned_data:132,cleaner:[90,122],cleanli:[63,101,104,109,149,153,163,173,187,267,276,282,293,306,324],cleanup:[1,11,22,33,39,42,44,49,50,101,126,144,168,178,231,326,361],clear:[1,4,11,12,15,22,29,33,37,39,42,47,49,58,60,63,68,69,72,80,103,109,110,111,112,114,124,127,128,130,131,136,137,152,155,156,158,164,173,187,203,205,226,231,240,244,245,255,259,267,304,314,316,317,326,332],clear_attribut:314,clear_client_list:301,clear_cont:[88,245],clear_exit:[88,245],clearal:[42,128,164],clearli:[12,37,47,127,226,332],cleartext:[209,322],clemesha:310,clever:[10,31,50,94,240],cleverli:104,click:[36,68,89,100,105,113,127,130,132,134,136,137,326],clickabl:18,client:[3,7,8,9,12,22,23,25,30,33,36,39,42,44,49,51,53,54,59,62,63,64,66,71,73,74,78,80,83,90,94,95,99,100,102,103,104,106,107,110,112,113,115,116,125,127,135,137,138,140,143,145,153,155,168,209,260,262,266,268,270,274,275,276,277,278,279,280,281,283,285,287,288,289,290,292,293,294,296,297,303,304,305,306,323,324,326,341,342,360,362],client_address:39,client_default_height:51,client_disconnect:294,client_encod:23,client_opt:[270,289],client_secret:64,client_width:[33,153],clientconnectionfail:[262,276,277],clientconnectionlost:[262,276,277],clientfactori:296,clienthelp:136,clientraw:[42,168],clientsess:[293,294],cliff:[20,42,158],climat:111,climb:[33,42,54,76,92,158,230],climbabl:230,clipboard:[1,47],clist:[42,163],clock:[12,27,33,72,163],clone:[46,62,63,75,95,127,129],close:[0,14,22,25,38,39,40,42,45,47,49,50,63,68,75,89,93,95,99,102,104,105,109,124,130,132,136,168,170,178,179,185,189,211,220,223,225,226,267,275,276,283,285,293,294,306,314,320,326,334],close_lid:225,close_menu:326,closedlidst:226,closelidev:226,closer:[204,220],closest:[38,113,342],cloth:[140,141,177,320],clothedcharact:181,clothedcharactercmdset:181,clothes_list:181,clothing_typ:181,clothing_type_count:181,clothing_type_ord:181,cloud:[89,99,101,102,131],cloud_keep:199,cloudi:101,clr:[113,249,334],cls:[38,143],clue:230,clunki:[130,220],clutter:152,cma:130,cmd:[12,14,22,25,28,29,31,33,40,42,43,57,59,61,70,79,81,84,87,94,120,122,151,153,155,156,157,158,163,164,165,166,167,168,169,170,173,178,179,180,181,184,185,186,187,188,192,198,199,200,201,202,205,211,212,213,214,216,217,218,219,220,223,229,230,231,232,234,245,289,293,294,320,324,326,327],cmd_arg:90,cmd_channel:[33,149],cmd_ignore_prefix:150,cmd_kei:90,cmd_last:104,cmd_last_vis:104,cmd_loginstart:33,cmd_multimatch:[33,149],cmd_na_m:87,cmd_name:87,cmd_noinput:[33,149,326],cmd_nomatch:[33,149,231,326],cmd_noperm:33,cmd_on_exit:[50,187,214,247,326],cmd_total:104,cmdabil:[59,126],cmdabout:168,cmdaccept:178,cmdaccess:164,cmdaddcom:163,cmdallcom:163,cmdapproach:220,cmdarmpuzzl:202,cmdasync:10,cmdattack:[29,72,115,122,216,217,218,219,220,230],cmdban:156,cmdbatchcod:157,cmdbatchcommand:157,cmdbigsw:29,cmdblindhelp:223,cmdblindlook:223,cmdblock:25,cmdboot:156,cmdbridgehelp:231,cmdbui:84,cmdbuildshop:84,cmdcallback:192,cmdcast:219,cmdcboot:163,cmdcdesc:163,cmdcdestroi:163,cmdcemit:163,cmdchannel:163,cmdchannelcr:163,cmdcharactercr:180,cmdcharcreat:155,cmdchardelet:155,cmdclimb:230,cmdclock:163,cmdcloselid:223,cmdcolortest:155,cmdcombathelp:[216,217,218,219,220],cmdconfigcolor:80,cmdconfirm:33,cmdconnect:40,cmdcopi:158,cmdcover:181,cmdcpattr:158,cmdcraftarmour:29,cmdcreat:158,cmdcreatenpc:122,cmdcreatepuzzlerecip:202,cmdcwho:163,cmddarkhelp:231,cmddarknomatch:231,cmddeclin:178,cmddefend:115,cmddelcom:163,cmddesc:[158,186],cmddestroi:158,cmddiagnos:30,cmddice:[57,184],cmddig:158,cmddisconnect:40,cmddisengag:[115,216,217,218,219,220],cmddoff:217,cmddon:217,cmddrop:[164,181],cmdeast:231,cmdecho:[5,29,33],cmdedit:179,cmdeditnpc:122,cmdeditorbas:324,cmdeditorgroup:324,cmdeditpuzzl:202,cmdemit:156,cmdemot:205,cmdentertrain:120,cmdevalu:178,cmdevmenunod:326,cmdexamin:158,cmdexiterror:43,cmdexiterroreast:43,cmdexiterrornorth:43,cmdexiterrorsouth:43,cmdexiterrorwest:43,cmdextendedroomdesc:186,cmdextendedroomdetail:186,cmdextendedroomgametim:186,cmdextendedroomlook:186,cmdfeint:115,cmdfight:[216,217,218,219,220],cmdfind:158,cmdfinish:178,cmdforc:156,cmdget:[25,164],cmdgetinput:326,cmdgetweapon:230,cmdgive:[164,181],cmdgmsheet:57,cmdhandler:[31,33,82,88,140,141,143,148,150,151,152,153,155,166,167,169,173,186,202,244,245,254,342],cmdhelp:[115,165,216,217,218,219,220],cmdhit:115,cmdhome:164,cmdic:155,cmdid:270,cmdinsid:120,cmdinterrupt:169,cmdinventori:[81,164,181],cmdirc2chan:163,cmdlaunch:21,cmdlearnspel:219,cmdleavetrain:120,cmdlen:[150,167],cmdlight:230,cmdline:265,cmdlineinput:324,cmdlink:158,cmdlistarmedpuzzl:202,cmdlistcmdset:158,cmdlisthangout:118,cmdlistpuzzlerecip:202,cmdlock:158,cmdlook:[30,52,126,164,180,186,231],cmdlookbridg:231,cmdlookdark:231,cmdmail:198,cmdmailcharact:198,cmdmakegm:57,cmdmapbuild:199,cmdmask:205,cmdmobonoff:229,cmdmore:327,cmdmorelook:327,cmdmultidesc:[56,201],cmdmvattr:158,cmdmycmd:[55,67],cmdname2:150,cmdname3:150,cmdname:[39,58,73,82,87,122,136,149,150,153,158,166,167,169,270,288,289,293,294,306],cmdnamecolor:214,cmdnewpassword:156,cmdnick:164,cmdnoinput:179,cmdnomatch:179,cmdnpc:122,cmdnudg:223,cmdobj:[149,150,167,169],cmdobj_kei:149,cmdobject:[149,150,168],cmdoffer:178,cmdooc:155,cmdooccharactercr:180,cmdooclook:[155,180],cmdopen:[158,211],cmdopenclosedoor:211,cmdopenlid:223,cmdoption:155,cmdpage:163,cmdparri:115,cmdparser:[103,140,141,148],cmdpass:[216,217,218,219,220],cmdpassword:155,cmdperm:156,cmdplant:232,cmdpoke:118,cmdpose:[115,164,205],cmdpressbutton:230,cmdpush:223,cmdpy:168,cmdquell:155,cmdquit:155,cmdread:230,cmdrecog:205,cmdreload:168,cmdremov:181,cmdreset:168,cmdrest:[216,217,218,219,220],cmdroll:90,cmdrss2chan:163,cmdsai:[115,164,205],cmdsaveyesno:324,cmdscript:[158,168],cmdsdesc:205,cmdser:326,cmdserverload:168,cmdservic:168,cmdsession:155,cmdset:[2,7,14,21,22,25,31,33,34,39,40,41,43,46,50,56,59,61,67,68,80,84,88,95,96,104,115,120,122,140,141,143,148,149,150,152,153,158,159,160,161,162,165,166,167,168,169,173,178,179,180,181,184,186,188,192,198,200,202,205,212,213,216,217,218,219,220,223,226,229,230,231,232,239,244,245,254,296,303,304,316,324,326,327],cmdset_account:[2,140,148,154,180],cmdset_charact:[5,95,140,148,154,181,216,217,218,219,220],cmdset_mergetyp:[50,187,247,326],cmdset_prior:[50,187,247,326],cmdset_red_button:[140,177,221],cmdset_sess:[104,140,148,154],cmdset_stack:152,cmdset_storag:[147,244,304],cmdset_trad:178,cmdset_unloggedin:[33,140,148,154,185,200],cmdsetattribut:158,cmdsetclimb:230,cmdsetcrumblingwal:230,cmdsetdesc:164,cmdsethandl:[104,140,141,148],cmdsethelp:165,cmdsethom:158,cmdsetkei:31,cmdsetkeystr:151,cmdsetlight:230,cmdsetmor:327,cmdsetobj:[151,152,159,160,161,162,178,179,180,181,184,186,200,202,205,213,216,217,218,219,220,223,229,230,231,324,326,327],cmdsetobjalia:158,cmdsetpow:122,cmdsetread:230,cmdsetspe:212,cmdsettestattr:49,cmdsettrad:178,cmdsettrain:120,cmdsetweapon:230,cmdsetweaponrack:230,cmdsheet:57,cmdshiftroot:230,cmdshoot:[21,220],cmdshutdown:168,cmdsmashglass:223,cmdsmile:33,cmdspawn:158,cmdspellfirestorm:28,cmdstatu:[178,219,220],cmdstop:212,cmdstring:[33,57,149,153,166,167,169],cmdstyle:155,cmdtag:158,cmdtalk:213,cmdteleport:158,cmdtest:[29,41,90],cmdtestid:33,cmdtestinput:50,cmdtestmenu:[50,187,326],cmdtime:[61,168],cmdtrade:178,cmdtradebas:178,cmdtradehelp:178,cmdtunnel:158,cmdtutori:231,cmdtutoriallook:231,cmdtutorialsetdetail:231,cmdtweet:70,cmdtypeclass:158,cmdunban:156,cmdunconnectedconnect:[170,185],cmdunconnectedcr:[170,185],cmdunconnectedhelp:[170,185],cmdunconnectedlook:[170,185],cmdunconnectedquit:[170,185],cmduncov:181,cmdunlink:158,cmdunloggedinlook:200,cmdunwield:217,cmduse:218,cmdusepuzzlepart:202,cmdwait:33,cmdwall:156,cmdwear:181,cmdwerewolf:25,cmdwest:231,cmdwhisper:164,cmdwho:155,cmdwield:217,cmdwipe:158,cmdwithdraw:220,cmset:152,cmsg:[42,163],cmud:24,cnf:[23,36],cnt:118,coast:[110,121],coastal:110,cockpit:21,code:[0,1,2,4,5,6,7,9,10,11,12,14,15,16,18,19,20,29,31,33,34,36,37,38,39,42,44,45,46,47,48,50,52,54,55,56,57,61,62,63,67,68,69,75,76,78,79,83,85,87,88,90,92,93,94,95,96,97,99,101,102,103,104,105,108,109,110,111,113,114,115,116,117,118,120,121,122,124,125,126,128,131,133,134,135,138,140,141,143,148,149,152,155,157,158,163,168,171,177,178,179,183,184,189,191,194,199,203,218,231,232,240,250,254,276,277,293,304,307,316,318,319,324,326,328,339,340,341,342,360,361,362],code_exec:320,codebas:[54,55,126,128,130,138,139,169],codec:319,codefunc:324,coder:[22,26,55,60,78,95,123,149,245,361],coerc:337,coexist:125,coin:[60,69,178],col:[3,16,328],cold:[12,42,109,168,250,255,259,303],cole:342,collabor:[4,60,63,89,130,165],collat:[82,249],collect:[11,26,31,52,135,149,151,202,257,314,342],collector:135,collectstat:[135,136,265,269],collid:[31,53,89,326],collis:[31,130],colon:[27,40,59,79,94,240],color:[16,18,20,33,48,50,57,58,62,68,73,78,94,108,110,113,123,128,136,138,153,155,182,189,205,214,232,249,270,277,285,288,293,294,319,328,334,336,341,343,362],color_ansi_bright_bg_extra_map:182,color_ansi_bright_bgs_extra_map:182,color_ansi_extra_map:182,color_markup:[140,141,177],color_no_default:182,color_typ:319,color_xterm256_extra_bg:182,color_xterm256_extra_fg:182,color_xterm256_extra_gbg:182,color_xterm256_extra_gfg:182,colorablecharact:80,colorback:341,colorcod:341,colour:[27,42,54,138,158,292,319,328],column:[16,45,48,57,63,68,85,110,136,153,155,233,328,342],com:[8,9,22,23,42,53,54,62,66,74,78,89,93,97,99,102,107,127,129,130,132,134,137,140,163,179,185,277,280,289,293,310,328,341,342,355],comb:1,combat:[11,14,25,28,31,45,54,62,63,72,78,101,107,108,110,116,121,123,124,130,138,152,216,217,218,219,220,229,254,362],combat_:[216,217,218,219,220],combat_cleanup:[216,217,218,219,220],combat_cmdset:115,combat_handl:115,combat_handler_:115,combat_movesleft:[216,217,218,219],combat_scor:122,combat_status_messag:220,combatcmdset:115,combathandl:115,combatscor:122,combatt:11,combin:[8,11,12,20,27,28,30,31,33,34,40,42,54,56,57,83,89,108,111,113,114,117,118,120,126,149,150,151,158,174,201,202,204,225,240,249,259,265,315,317,322,336,342],combo:104,come:[0,2,3,4,6,10,11,15,16,20,21,23,25,27,29,33,34,39,45,48,50,51,54,56,57,60,61,63,68,72,79,82,84,87,90,92,99,104,110,113,115,117,118,120,122,123,125,128,130,132,133,134,136,143,151,186,203,216,217,218,219,220,250,283,288,293,294,296,302,319,327,360],comet:[39,54,136,294],comfort:[15,54,68,90,130],comlist:[42,163],comm:[33,34,40,46,63,67,70,140,141,148,154,322],comma:[20,42,45,85,94,113,133,158,166,167,197,198,240,245,334],command:[0,2,4,6,8,9,10,11,12,13,15,18,19,20,21,23,24,26,27,34,36,39,45,46,47,48,49,50,51,54,55,56,58,60,62,63,64,65,66,68,71,72,73,74,75,76,78,79,82,85,86,88,89,91,92,94,95,97,101,102,103,104,105,107,108,109,110,111,112,113,116,117,118,119,121,123,124,125,127,128,130,135,136,137,138,139,140,141,143,145,173,174,177,178,179,180,181,184,185,186,187,188,190,193,195,196,198,199,200,201,202,205,209,211,212,213,214,216,217,218,219,220,223,225,226,229,230,231,232,233,234,237,239,240,245,249,250,254,262,265,270,274,275,283,285,288,289,293,294,296,297,303,304,316,318,319,322,324,326,327,336,339,342,360,362],command_default_arg_regex:33,command_default_class:25,command_pars:150,commandhandl:[73,152,167,342],commandmeta:153,commandnam:[33,73,82,232,265,274,304,306],commandset:[5,79,88,152,180],commandtest:[126,169,195],comment:[8,9,13,14,24,25,37,40,47,59,89,95,117,124,137,320],commerc:78,commerci:[89,105],commerror:175,commit:[15,23,25,36,37,63,65,97,99,107,127,129,208,313],commmand:[211,216,217,218,219,220],common:[1,6,10,12,15,16,20,26,27,30,33,39,40,42,50,58,59,60,61,62,63,67,68,72,73,78,79,82,87,89,90,93,96,104,106,108,111,112,114,115,118,122,123,124,130,132,138,151,158,178,204,205,212,240,254,293,297,315,325,337,339,342,348,360],commonli:[23,52,62,63,82,85,86,95,103,104,106,114,118,127,245],commun:[8,22,23,33,39,40,44,46,54,56,59,63,69,71,78,82,87,89,90,91,102,105,112,113,136,138,160,171,173,174,175,176,198,244,262,274,275,285,286,288,289,290,291,304,306,322,323,338,362],compact:[84,133],compani:[63,87],compar:[4,9,13,15,27,28,29,31,40,43,57,72,82,84,90,96,115,118,122,126,130,169,199,202,204,216,217,218,219,220,239,240,250,319,342],comparison:[13,92,239,250,326],compartment:57,compass:20,compat:[14,21,50,93,158,328,335],compet:[15,87],compil:[9,33,46,55,62,74,75,89,93,94,107,158,164,165,170,173,181,200,205,319,324,341],compilemessag:75,complain:[41,59,85,90,109,127],complement:[26,106],complementari:112,complet:[2,10,11,13,14,15,22,23,25,27,31,33,36,37,42,43,48,49,50,52,57,58,60,61,63,69,76,80,84,87,88,89,94,95,101,103,104,106,109,110,121,122,126,127,130,138,143,151,152,153,166,168,173,182,186,187,189,194,196,199,217,231,245,265,267,275,276,293,320,325,326,327,334,339,342,355],complete_task:194,completli:226,complex:[11,14,15,20,31,33,58,60,61,63,72,75,76,85,92,95,99,103,107,110,114,115,122,126,137,152,195,203,213,250,297],complianc:[24,186],compliant:[38,289],complic:[0,10,22,29,40,42,48,68,89,90,110,132,133,170,185,187,214,314],compon:[29,33,39,42,48,57,89,92,93,95,101,109,113,115,123,126,134,136,137,138,158,168,174,175,176,183,202,204,250,251,254,257,265,294,322,325,339,342,362],componentid:136,componentnam:136,componentst:[136,137],compos:[99,187],composit:[291,315],comprehens:[34,54,62,79,92,95,102,123,124,126],compress:[73,270,274,278,338],compress_object:338,compris:143,compromis:[102,208],comput:[10,12,42,48,55,59,62,63,71,72,99,112,114,123,130,131,156,168,205,342,343],computation:114,comsystem:[163,176],con:[42,57,78,170,185],concaten:[319,334],concept:[11,37,38,39,45,56,60,68,75,76,91,95,114,123,130,138,180,201],conceptu:[48,50],concern:[43,62,75,87,94,95,151,203,237],conch:[93,285,288,296],conclud:[95,178,326],concurr:23,conda:9,conder:320,condit:[8,45,48,54,60,72,84,90,92,95,122,123,149,184,205,218,240,245,257,264,265,310,342],condition:25,condition_result:184,condition_tickdown:218,conditional_flush:332,conduct:135,conductor:120,conect:306,conf:[4,8,9,23,25,35,36,39,40,46,53,61,64,66,68,73,75,79,80,85,89,92,102,108,113,119,120,126,130,132,133,134,138,143,182,200,265,271,272,311,320,335,362],confer:[78,342],confid:[37,38,41],config:[2,4,9,36,39,58,62,89,97,102,105,129,130,136,137,138,261,265,267,271,272,283,362],config_1:2,config_2:2,config_3:2,config_color:80,configcmd:80,configdict:[285,306],configur:[0,2,7,25,36,42,44,46,53,58,61,62,63,66,68,89,99,102,113,119,123,126,135,137,138,143,147,150,155,208,209,232,258,267,272,283,306,310,311,315,355,362],configut:105,configvalu:58,confirm:[8,33,42,62,102,136,158,185,202,289,292,360],conflict:[40,41,125],confus:[10,22,26,31,43,57,58,59,63,76,79,86,89,90,92,96,113,118,125,130,135,136,139,185,360],conid:284,conjur:219,conn:[42,170,185],conn_tim:104,connect:[0,2,4,7,8,9,11,12,13,17,18,23,24,25,31,33,34,39,40,45,46,48,54,56,59,62,63,64,65,68,71,73,75,76,79,82,84,87,88,90,91,92,95,97,99,100,101,102,103,104,106,109,110,113,119,122,124,125,126,135,136,138,143,145,147,155,156,158,163,170,174,176,185,189,191,192,194,196,200,209,212,244,245,251,260,262,265,267,274,275,276,277,278,283,284,285,288,293,294,296,297,303,304,305,306,307,310,314,316,322,338,362],connection_cr:106,connection_screen:[35,103,200],connection_screen_modul:185,connection_set:53,connection_tim:[143,245],connection_wizard:[140,141,260],connectiondon:267,connectionlost:[267,274,275,285,288,296],connectionmad:[262,274,285,288,296],connectionwizard:263,connector:[262,276,277,283,306],consecut:50,consequ:[89,152],consid:[0,4,10,12,13,14,23,26,27,31,33,37,38,39,43,45,50,54,56,60,62,63,69,73,77,79,81,84,85,89,92,95,96,101,102,104,108,111,112,113,114,118,120,124,130,132,133,134,143,151,187,202,204,205,220,232,245,250,254,270,285,288,315,320,321,326,327],consider:[67,85,103,110,117,239,250,328],consist:[2,11,17,33,43,45,47,50,67,79,85,91,94,95,108,109,113,115,121,122,134,136,143,150,166,175,178,202,204,234,240,248,250,289,294,304,313,314,316,322,327,328,342,360],consol:[9,19,23,26,41,42,59,62,63,74,89,92,94,95,96,99,105,113,122,136,137,168,205,265],conson:204,constant:[0,87,274,340],constantli:[95,116,231],constitu:[152,166,167],constraint:[0,23],construct:[20,29,34,36,50,63,118,132,137,250,309,314,319,327,355],constructor:[22,33,179,276],consum:[10,267,342],consumer_kei:[70,119],consumer_secret:[70,119],consumpt:[23,308],contact:[88,89,99,136],contain:[0,5,7,9,10,11,13,14,16,17,18,20,21,22,25,26,31,33,34,37,38,39,40,42,45,46,50,54,55,56,61,62,63,67,68,74,78,79,85,88,90,94,95,96,100,101,103,104,113,117,118,121,122,123,125,126,127,128,132,133,135,136,137,138,140,141,143,145,148,149,150,151,152,154,157,158,165,171,179,187,188,191,192,193,194,195,196,197,199,202,203,204,205,209,210,212,214,218,223,230,232,233,236,238,245,247,248,249,250,258,260,264,268,270,296,309,310,314,315,316,317,318,319,320,323,325,326,327,328,339,341,342,343,353,360,361],container:99,contempl:55,content:[3,4,13,16,17,21,27,38,42,47,48,52,55,57,68,76,78,81,84,88,89,90,92,94,95,116,118,120,122,124,130,132,133,136,137,138,153,156,158,205,244,245,313,317,319,320,321,324,327,328,339,344,353],content_typ:[244,245],contentof:328,contents_cach:244,contents_get:[118,245],contents_set:245,contentshandl:244,context:[45,54,68,90,113,118,125,132,179,194,286,290,348,360],contextu:111,continu:[7,10,11,21,27,29,33,37,41,44,45,48,50,54,57,59,68,70,74,84,85,89,94,95,111,113,114,115,118,122,123,126,135,138,199,245,263,274,310,314,326,335,342,362],contrari:[0,40,42,61,168,317],contrast:[55,89,95,112,137,289],contrib:[4,13,14,20,46,56,57,61,62,63,72,77,101,115,121,140,141,143,144,147,172,235,242,252,261,307,313,320,347,355,360,362],contribrpcharact:205,contribrpobject:205,contribrproom:205,contribut:[1,4,22,26,44,54,69,77,81,123,126,130,135,138,177,178,180,181,182,184,186,198,199,200,202,203,205,208,209,211,212,213,232,362],contributor:[77,179],control:[2,5,7,9,11,12,13,14,19,20,21,24,31,33,34,36,37,41,42,46,49,50,51,52,54,56,57,60,62,63,67,72,73,79,80,82,85,88,89,91,92,95,101,102,104,107,108,109,113,117,120,122,123,127,134,137,138,143,145,155,157,158,163,178,180,193,205,226,229,231,233,239,245,254,265,304,306,316,326,355,362],convei:[196,205,245],convenei:106,conveni:[8,9,10,11,21,34,36,39,40,42,50,54,56,58,68,73,79,85,88,95,97,101,105,107,108,109,124,126,132,139,143,158,168,179,198,199,245,308,320,321,326,327,335,338,339],convent:[0,31,85,95,106,118,125],convention:[40,153,173,245,316],convers:[50,86,120,126,137,204,213,293,294,319,342,361],convert:[11,27,38,39,48,58,61,63,78,80,82,84,86,87,102,108,112,113,118,125,127,156,183,184,187,214,239,249,250,255,274,276,285,288,289,306,310,319,323,327,328,329,334,338,341,342],convert_linebreak:341,convert_url:341,convinc:[50,89],cool:[3,9,21,22,26,42,60,78,158],cool_gui:79,cooldown:[29,115,123,138,362],coord:38,coordi:38,coordin:[48,123,136,138,199,220,233,362],coordx:38,coordz:38,cope:219,copi:[0,1,4,13,14,20,25,26,33,36,46,47,49,50,61,63,80,89,92,95,99,103,104,108,110,122,127,130,132,134,135,136,137,157,158,181,194,216,217,218,219,220,231,245,265,274,311,319,335,360],copy_object:245,copyright:[77,89],cor:137,core:[19,37,42,46,48,75,77,87,88,93,95,103,105,124,126,130,138,143,147,168,176,177,196,198,237,239,244,245,254,260,272,282,289,303,314,316,317,320,327,333,355,360],corner:[17,38,56,78,137,233,328],corner_bottom_left_char:328,corner_bottom_right_char:328,corner_char:328,corner_top_left_char:328,corner_top_right_char:328,corpu:204,correct:[10,11,14,21,23,27,30,31,33,37,42,47,49,59,79,90,112,113,120,122,125,136,149,155,158,175,186,202,227,240,280,283,285,291,305,319,342],correctli:[4,8,9,27,29,33,36,41,43,48,49,50,60,61,71,76,79,84,89,90,93,96,109,111,114,120,121,122,125,143,147,152,155,255,274,310,338],correl:250,correspond:[20,33,79,84,104,134,183,199,202,214,313,355],correspondingli:127,corrupt:55,cosi:110,cosin:342,cosmet:233,cost:[28,84,89,219,233],cottag:[110,113],could:[0,1,2,3,4,5,6,9,10,11,12,13,14,15,19,20,21,22,25,28,29,30,31,33,34,36,37,38,39,40,41,42,43,45,46,47,48,50,54,56,57,59,60,61,62,63,64,67,68,70,71,72,78,79,80,81,82,83,84,85,86,87,88,89,90,92,94,95,97,101,105,107,108,110,111,112,113,114,115,116,117,118,119,120,122,124,125,126,127,128,131,132,134,135,137,139,143,152,158,165,175,176,178,179,184,189,196,197,203,205,212,214,231,233,239,240,245,270,289,294,310,316,319,320,324,328,329,332,337,342],couldn:[11,19,38,43,63,75,90,125,133,139,203],count:[63,101,103,115,118,119,151,181,214,218,245,257,279,283,296,300,306,308,315,319,326,335],count_loggedin:283,count_queri:300,countdown:[20,29],counter:[6,22,29,68,84,104,115,127,145,231,283,296,297,304,326],counterpart:[13,113,270,306,323],countless:94,countri:[42,156],coupl:[22,47,68,99,116,130,212],cours:[0,4,9,12,15,21,22,26,33,40,45,56,60,63,76,77,90,92,105,107,113,114,121,122,123,129,131,139,217,220],courtesi:12,cousin:[90,128],cover:[6,8,9,13,14,23,29,37,39,47,56,58,62,78,79,85,89,94,95,119,126,130,181,186,231,245,342,361],coverag:126,coveral:126,cpanel:89,cpattr:158,cpu:[12,42,89,102,168],cpython:92,crack:[60,85],craft:[29,79,110,187],crank:[114,256],crash:[26,59,60,78,102,110,269,314],crate:[20,86,123],crawl:102,crawler:279,cre:[42,170,185],creat:[4,9,11,13,14,15,16,19,22,23,25,26,29,31,34,35,37,38,39,40,41,43,45,46,48,49,50,53,54,55,56,57,59,60,61,62,63,64,65,67,69,70,71,72,74,75,76,77,78,79,80,84,86,89,90,92,94,95,101,102,103,104,105,106,107,108,111,115,116,117,118,119,121,123,126,128,129,130,131,133,134,135,136,137,138,139,140,141,143,144,145,147,149,150,151,152,153,155,158,163,164,165,166,167,169,170,173,174,176,178,179,180,181,183,184,185,186,187,188,193,194,195,197,198,199,200,201,202,203,204,205,209,211,213,214,216,217,218,219,220,222,223,225,226,229,230,231,232,233,237,240,242,244,245,247,248,249,250,254,257,258,259,262,265,269,270,275,277,278,283,285,286,290,297,305,306,310,314,315,316,317,318,320,321,324,325,326,328,329,334,335,342,358,360,361],create_:[88,124],create_account:[106,124,140,322],create_attribut:314,create_cal:143,create_channel:[34,140,173,174,269,322],create_charact:[143,245],create_delai:258,create_exit:[158,211],create_exit_cmdset:245,create_forward_many_to_many_manag:[147,176,237,244,254,314,316,317,333],create_game_directori:265,create_grid:48,create_help_entri:[67,140,322],create_kwarg:250,create_match:150,create_messag:[34,140,322],create_object:[13,27,79,84,88,110,122,124,132,140,245,250,269,320,322],create_prototyp:[249,250],create_script:[55,101,115,124,140,257,320,322],create_secret_kei:265,create_settings_fil:265,create_superus:265,create_tag:315,create_wild:233,created_on:191,createview:360,creation:[11,14,20,21,42,46,48,50,57,59,60,78,79,80,85,88,96,104,110,122,124,130,132,138,139,140,143,144,147,158,165,174,180,199,202,205,209,211,216,217,218,219,220,230,231,237,242,244,245,250,254,259,298,313,316,322,324,325,326,328,355,360,361],creation_:322,creativ:[78,107],creator:[50,78,79,110,122,139,165,174,199,216,217,218,219,220,245,328],cred:[93,130,285],credenti:[89,102,130,143,285],credentialinterfac:285,credit:[89,102,130,341,342],creset:130,crew:118,criteria:[50,118,175,193,203,249,315,339],criterion:[118,130,143,178,205,236,245,256,339,342],critic:[19,26,31,59,62,96,101,104,113,127,240,264,265,335],critici:316,crop:[57,113,158,325,328,334,342],crop_str:328,cross:[110,137,231,328],crossbario:293,crossbow:29,crossroad:110,crowd:[60,102],crt:[8,66],crucial:[90,114],crude:0,cruft:1,crumblingwal:230,crumblingwall_cmdset:230,crush:21,cryptic:137,cryptocurr:102,cscore:122,csessid:[283,293,294,306],csession:[293,294],csrf_token:132,css:[17,54,123,134,135,136,341],cssclass:136,ctrl:[47,62,89,92,94,99,109,296],culpa:51,cumbersom:[50,120,127,214],cumul:297,cup:69,cupidatat:51,cur_valu:189,cure:[218,219],cure_condit:218,curi:48,curiou:107,curli:[40,95,182],curly_color_ansi_bright_bg_extra_map:182,curly_color_ansi_bright_bgs_extra_map:182,curly_color_ansi_extra_map:182,curly_color_xterm256_extra_bg:182,curly_color_xterm256_extra_fg:182,curly_color_xterm256_extra_gbg:182,curly_color_xterm256_extra_gfg:182,curr_sess:306,curr_tim:186,currenc:[84,119],current:[0,2,9,11,12,13,14,19,20,21,22,24,25,27,28,29,31,33,40,42,45,47,48,49,50,57,58,59,63,67,73,75,76,78,79,84,85,88,93,96,99,101,103,104,105,111,113,114,115,118,119,120,122,123,126,127,130,132,136,137,143,147,149,150,152,153,155,156,158,163,164,165,167,168,174,178,179,181,186,187,189,194,197,199,201,203,205,211,212,214,216,217,218,219,220,230,231,233,236,244,245,250,254,258,259,265,270,275,281,282,285,286,297,304,306,308,315,316,324,326,328,329,335,336,339,342,360],current_choic:179,current_coordin:233,current_kei:[248,249],current_us:132,current_weath:101,currentroom:120,curriculum:78,curs:41,curv:[54,55],curx:48,custom:[0,2,6,11,12,14,15,16,17,18,20,21,25,26,27,30,31,33,34,35,42,48,54,55,57,59,60,63,64,65,67,68,70,72,73,77,78,82,84,85,86,88,89,96,99,101,103,108,109,111,113,115,116,117,118,120,121,122,124,125,131,132,135,137,138,139,143,144,145,146,147,149,151,152,153,158,163,164,165,173,174,178,180,181,183,184,186,187,188,194,196,197,199,202,204,205,208,209,230,231,233,236,239,243,245,247,248,249,250,253,259,261,265,269,271,274,296,305,316,321,324,328,332,334,336,337,341,342,347,360,362],custom_add:194,custom_cal:[194,197],custom_gametim:[61,140,141,177],custom_kei:249,custom_pattern:[3,4,68,132,133],customis:233,customiz:[17,40,179,187,189,205],customlog:8,cut:[20,39,48,49,54,90,110,122,136,250],cute:135,cutoff:342,cvcc:204,cvccv:204,cvccvcv:204,cvcvcc:204,cvcvccc:204,cvcvccvv:204,cvcvcvcvv:204,cvcvvcvvcc:204,cvv:204,cvvc:204,cwho:163,cyan:[113,125],cyberspac:78,cycl:[13,14,25,55,60,61,131,216,217,218,219,220],cyril:15,daemon:[8,92,99,102,109,282,310],dai:[27,36,55,60,61,99,102,107,119,125,130,131,138,183,186,329,335,342,343],daili:86,dailylogfil:335,dali:204,dalnet:[42,163],dam:55,damag:[14,21,28,60,72,84,102,115,121,216,217,218,219,220,229,230],damage_rang:219,damage_taken:55,damage_valu:[216,217,218,219,220],damnedscholar:47,dandi:139,danger:[13,31,81,96,104,151],dare:33,dark:[13,14,17,31,72,78,110,113,121,125,152,186,223,231,239,254,320],darkcmdset:231,darker:[113,125],darkgrai:125,darkroom:231,darkroom_cmdset:231,darkstat:231,dash:[118,203,214],dashcount:214,data:[2,10,13,15,22,23,25,27,42,55,56,57,58,60,63,74,82,85,86,87,89,92,95,96,99,101,103,108,111,112,118,124,127,132,133,134,136,137,138,143,144,145,153,158,168,174,187,189,193,194,205,208,209,235,242,244,245,247,251,257,259,262,263,267,271,272,274,275,276,277,278,283,284,285,286,288,289,290,292,293,294,296,297,298,303,304,305,306,312,313,314,315,316,317,319,320,321,322,323,325,326,327,328,331,335,336,337,338,355,360],data_in:[39,82,209,274,276,277,283,284,288,293,294,304,305,306],data_out:[39,209,283,285,288,289,294,304,305,306],data_to_port:262,data_to_serv:275,databa:265,databas:[0,4,5,6,7,11,12,13,15,17,19,20,21,23,27,28,29,31,34,36,38,42,44,46,54,55,56,57,58,59,60,62,63,73,76,79,83,86,88,90,92,99,100,101,103,104,106,109,110,111,114,115,118,122,123,124,126,129,130,132,133,134,135,137,138,139,143,147,151,152,158,165,168,172,173,174,175,176,186,193,194,196,205,219,231,234,236,237,239,242,244,245,248,249,251,252,254,255,259,265,269,271,282,296,303,312,313,314,315,316,317,320,322,323,330,332,338,339,342,344],datareceiv:[267,274,288,296],datastor:85,datbas:118,date:[7,11,12,23,34,48,61,67,74,75,85,125,127,130,132,137,144,152,156,208,329,335,343],date_appli:132,date_cr:[124,143,147,176,254,314,316],date_join:[144,147],date_s:34,datetim:[61,124,132,314,329,335,336,342,343],datetime_format:342,datetimefield:[85,132,144,147,176,244,254,314,316,342],david:78,day_rot:335,db3:[23,110,127,130],db_:[83,85,118,124,205,245,255,270,339],db_account:[181,242,244,254],db_account__db_kei:242,db_account_id:[244,254],db_account_subscript:[172,176],db_attribut:[106,118,144,147,176,242,244,254,316],db_attrtyp:314,db_attryp:86,db_categori:[85,313,314,317],db_category__iequ:85,db_channel:172,db_cmdset_storag:[144,147,181,242,244],db_data:[313,317],db_date_cr:[85,147,172,176,181,244,254,314,316],db_desc:254,db_destin:[181,242,244],db_destination__isnul:119,db_destination_id:244,db_entrytext:[235,237],db_header:176,db_help_categori:[235,237],db_hide_from_account:176,db_hide_from_channel:176,db_hide_from_object:176,db_hide_from_receiv:176,db_hide_from_send:176,db_home:[181,242,244],db_home_id:244,db_index:85,db_interv:[252,254],db_is_act:254,db_is_bot:[144,147],db_is_connect:[144,147],db_kei:[68,83,85,118,124,144,172,181,193,235,237,242,252,255,261,272,313,314,316,317,355],db_key__contain:124,db_key__icontain:85,db_key__istartswith:118,db_key__startswith:[118,124],db_locat:[83,118,181,242,244],db_location__db_tags__db_kei:118,db_location__isnul:119,db_location_id:244,db_lock_storag:[144,172,176,181,235,237,242,314,316],db_messag:[172,176],db_model:[314,317],db_obj:[252,254,323],db_obj_id:254,db_object_subscript:[172,176],db_permiss:[85,144],db_persist:[252,254],db_properti:270,db_protototyp:249,db_receiv:172,db_receivers_account:176,db_receivers_channel:176,db_receivers_object:176,db_receivers_script:176,db_repeat:[252,254],db_sender:172,db_sender_account:176,db_sender_extern:176,db_sender_object:176,db_sender_script:176,db_sessid:[181,242,244],db_staff_onli:[235,237],db_start_delai:[252,254],db_strvalu:314,db_tag:[118,144,147,176,235,237,242,244,254,316,317],db_tags__db_categori:[38,118],db_tags__db_kei:[38,118,172],db_tags__db_key__in:38,db_tagtyp:[313,317],db_text:85,db_typeclass_path:[85,119,144,181,242,244,252,316,342],db_valu:[83,261,272,314],dbef:339,dbhandler:355,dbholder:314,dbid:[42,124,145,163,316],dbid_to_obj:342,dbmodel:315,dbobj:[11,314],dbobject:[11,315,316],dbprototyp:[168,249],dbref:[12,13,20,42,57,65,79,108,110,115,118,120,121,124,127,143,147,156,158,168,175,187,202,205,211,231,233,239,244,245,248,249,250,254,256,315,316,322,339,342],dbref_search:315,dbref_to_obj:342,dbrefmax:[42,158],dbrefmin:[42,158],dbsafe_decod:338,dbsafe_encod:338,dbserial:[11,96,140,141,255,318],dbshell:[23,85,109,127],dbunseri:323,ddesc:55,deactiv:[42,62,63,80,116,163,186,226,229,326],deactivatebuttonev:226,dead:[111,229,230,303,306,332],deadli:121,deal:[10,11,12,15,40,50,63,68,72,90,102,104,111,112,115,123,125,130,133,137,138,143,178,179,183,187,216,217,218,219,220,244,245,304,316,319,336,360],dealt:[166,167,218,219],dealth:218,death:[50,72,119],death_msg:229,death_pac:229,debat:90,debian:[8,23,62,66,130],debug:[14,27,42,44,50,58,71,73,90,94,101,105,134,138,149,153,157,168,187,247,265,270,276,277,288,310,320,326,335,342,362],debugg:[15,41,109,140],decemb:89,decend:149,decent:[92,204],decic:204,decid:[4,14,15,25,33,40,45,57,60,68,72,84,85,87,89,102,104,111,113,115,125,137,149,178,216,240,327],deciph:47,decis:[72,114],declar:[113,338],declared_field:[144,235,242,313,355],declin:[50,178],decod:[15,289,319,342],decode_gmcp:289,decode_msdp:289,decoded_text:342,decompos:132,decompress:[274,338],deconstruct:[121,169,227,291,340],decor:[0,29,33,45,106,130,147,244,254,262,274,275,316,322,326,327,342],decoupl:[9,249],decoupled_mut:11,decreas:[219,231,324],decrease_ind:324,dedent:[49,342],dedic:[72,89,126],deduc:324,deduce_ind:324,deduct:[72,84,216,217,218,219,220],deem:[37,56,128,130,177,360],deep:78,deeper:[40,214],deepest:158,deepli:11,deepsiz:342,def:[1,3,4,5,6,10,11,21,22,25,27,28,29,30,31,33,38,39,40,41,43,47,48,49,50,55,56,57,59,61,68,70,72,73,78,79,80,81,83,84,88,90,94,95,101,106,108,110,113,115,116,117,118,119,120,122,124,126,131,132,133,179,186,232,233,248,294,307,324,326,334,342],def_down_mod:218,defalt_cmdset:70,default_access:[1,11,314,322],default_categori:236,default_channel:34,default_charact:188,default_cmd:[5,21,22,25,28,29,30,40,43,52,56,57,61,80,115,118,140,179,181,186,198],default_cmdset:[5,22,25,30,35,40,43,56,57,59,61,80,104,122,152,179,180,181,186,187,199,201,211,214,216,217,218,219,220],default_command:25,default_confirm:[158,202],default_error_messag:338,default_hom:[58,108],default_in:136,default_out:136,default_pass:322,default_screen_width:33,default_set:[3,126],default_transaction_isol:23,default_unload:136,defaultaccount:[2,40,42,63,124,140,143,145,159,245,340],defaultchannel:[6,124,140,174],defaultcharact:[5,6,22,25,42,56,57,59,61,72,80,85,88,95,122,124,126,140,143,160,179,181,188,196,205,216,217,218,219,220,245,340],defaultcmdset:[184,223],defaultdict:255,defaultexit:[6,84,88,124,140,196,211,212,230,233,245,340],defaultguest:[140,143],defaultlock:239,defaultmod:335,defaultobject:[5,6,26,52,59,63,81,84,85,88,95,110,116,118,120,124,140,143,181,196,205,213,217,220,225,230,245,316,340],defaultpath:342,defaultroom:[6,38,48,55,84,88,124,131,140,186,196,205,231,233,245,340],defaultscript:[55,101,115,119,120,124,140,145,178,183,194,202,203,204,216,217,218,219,220,222,226,233,249,256,257,298,329,340],defaultsess:[42,161],defaultset:5,defaulttyp:310,defaultunloggedin:[42,162,200],defeat:[72,115,121,216,217,218,219,220,229],defeat_msg:229,defeat_msg_room:229,defend:[50,115,121,216,217,218,219,220,230,245],defens:[115,216,217,218,219,220],defense_valu:[216,217,218,219,220],defer:[10,27,29,33,93,132,144,147,149,176,186,212,237,244,245,254,258,262,272,274,275,306,310,314,316,317,333,335,342],deferredlist:310,defin:[0,2,4,5,10,11,12,13,14,20,21,22,25,27,30,35,36,39,41,42,43,45,48,49,54,55,56,57,58,60,61,63,67,68,72,73,76,77,80,82,84,87,88,90,94,95,96,103,105,108,110,112,113,114,116,118,120,122,124,125,126,128,132,134,135,136,137,138,140,142,144,147,149,151,152,153,155,158,164,166,167,168,169,172,174,175,176,179,181,182,183,184,186,187,193,194,197,199,202,203,204,205,213,214,218,219,222,223,226,230,231,234,235,236,237,238,239,240,241,242,244,245,249,250,254,257,259,260,262,265,272,275,296,297,304,305,306,309,312,314,315,316,317,319,320,321,324,326,329,333,334,337,339,342,344,355,360],define_charact:50,definit:[0,2,5,10,12,14,20,33,34,38,40,41,42,54,59,60,67,68,81,86,87,88,108,113,114,123,126,151,153,158,163,166,167,191,202,225,230,238,240,244,249,250,256,320,322,326,334,338],deflist:310,degrad:126,deindent:342,del:[11,12,29,42,57,79,115,121,156,158,186,201,202,248,316],del_callback:[192,194],del_detail:186,del_pid:265,delaccount:12,delai:[0,28,33,44,119,183,187,194,212,230,258,259,277,283,306,321,342],delaliaschan:[42,163],delayed_import:306,delchanalia:[42,163],delcom:[57,163],deleg:[147,176,237,244,254,314,316,317,333],delet:[2,4,7,11,12,13,20,22,23,31,42,49,50,62,65,67,79,86,88,97,99,101,104,106,110,111,115,121,127,130,143,152,155,156,157,158,163,164,165,168,173,174,176,186,191,192,194,195,196,198,201,202,211,226,230,237,240,245,249,255,256,257,259,271,283,304,313,314,316,319,320,326,332,358,360],delete_attribut:314,delete_default:[31,152],delete_prototyp:249,deletet:186,deleteview:360,deliber:[11,41,128],delic:181,delimit:[90,166,167,320],delin:47,deliv:[89,198,205],delpart:202,delresult:202,deltatim:342,delux:89,demand:[30,57,60,72,89,114,116,143,174,186,245,307,321],demo:[22,54,78,137,228,326],demon:108,demonin:342,demonstr:[0,4,22,125,132,179,187,208,218],demowiki:4,deni:[8,102,193,197],denot:[55,113,133,320],denounc:325,depart:48,depend:[0,4,10,11,12,14,15,16,22,27,31,33,34,37,39,42,45,48,50,54,56,57,60,62,63,68,71,72,73,74,82,84,87,89,92,94,96,99,101,102,103,104,105,110,113,114,115,117,122,124,130,132,133,136,137,142,149,151,153,155,168,174,179,180,184,186,192,204,233,240,245,249,257,259,265,285,288,294,296,306,316,317,324,342],deplet:218,deploi:[45,89,102],deploy:[36,78,89,99,105],depmsg:335,deprec:[27,50,108,140,141,250,260,335,342],deprecationwarn:264,depreci:319,depth:[16,17,36,94,113,121,123,214,250],dequ:[11,308],deriv:[23,55,62,66,99,107,118,124,126,232,319,343],desc:[14,20,21,22,34,40,56,57,59,68,73,79,81,83,84,88,101,108,110,115,119,133,152,155,158,169,179,181,186,201,202,211,214,219,233,254,263,320,322,324,325,326,355,360],desc_al:229,desc_dead:229,desc_lamp_broken:225,desc_lid_clos:225,desc_lid_open:225,descend:[118,355],describ:[5,9,11,13,14,20,21,22,30,31,33,37,42,45,50,54,57,61,62,63,67,68,70,74,75,78,79,84,85,87,89,91,95,101,108,109,110,112,113,115,123,124,126,127,129,130,132,134,136,138,151,158,162,163,164,176,181,183,186,203,205,219,225,242,250,257,262,283,285,288,298,326,341,342,361],descripion:229,descript:[0,14,15,20,21,22,34,38,40,42,45,48,50,53,54,56,57,59,60,67,73,76,84,89,95,101,108,110,111,125,128,130,132,133,134,138,144,155,158,163,164,174,178,179,181,186,201,203,205,211,214,225,229,230,231,232,233,235,239,242,245,254,320,322,326,336,337],description_str:110,descvalidateerror:201,deseri:[11,96,336],deserunt:51,design:[14,16,23,26,33,37,38,40,54,56,60,78,88,90,107,108,110,111,116,117,118,123,128,132,137,152,158,179,193,205,208,230,245,320,336,342],desir:[1,4,27,28,29,42,48,56,57,58,90,107,111,113,114,118,120,122,132,136,158,182,204,240,265,310,314,322,328,343],desired_perm:240,desktop:[15,16,137],despit:[11,13,56,62,63,78,80,104,231],dest:[232,245],destin:[0,22,25,33,42,48,73,76,84,88,90,108,110,118,120,158,196,199,208,211,212,216,217,218,219,220,230,239,244,245,250,322,360],destinations_set:244,destroi:[0,20,88,102,115,126,143,145,158,163,202,218,245],destroy:211,destruct:[31,151],detach:105,detail:[2,5,9,12,15,19,20,22,26,30,33,34,37,40,45,50,57,59,60,62,63,79,87,88,89,90,92,94,95,104,108,110,113,115,117,121,123,124,127,128,130,133,134,135,138,144,152,153,158,174,179,186,202,203,205,217,231,233,237,242,249,250,267,268,304,306,316,319,324,334,342,358,360],detail_color:158,detailkei:[186,231],detailview:360,detect:[31,33,36,60,80,87,88,102,104,117,150,153,167,174,277],determ:315,determin:[2,4,13,15,20,27,29,31,33,34,38,42,43,48,49,50,51,62,72,79,81,82,84,86,92,101,108,109,115,122,135,136,143,144,151,152,153,155,166,172,174,178,199,204,205,212,214,216,217,218,219,220,230,237,240,242,245,249,289,314,315,316,319,324,327,342],detour:[21,82,306],dev:[1,23,37,54,56,60,62,63,66,70,75,78,89,94,97,137],develop:[3,9,15,16,19,20,25,26,27,33,36,37,41,42,47,53,54,55,57,59,60,62,63,67,69,70,71,75,76,79,85,87,89,90,92,93,95,96,98,103,105,107,108,110,113,122,125,130,132,134,135,136,137,138,156,157,163,168,174,191,192,197,208,226,237,245,250,311,316,320,326,361,362],devoid:319,dex:[11,50,57,325],dexter:[216,217,218,219,220],diagnos:[30,96],diagram:124,dialog:136,dialogu:[0,123,138,362],dice:[62,72,90,115,140,141,177],dicecmdset:184,dicenum:184,dicetyp:184,dict:[0,11,13,25,31,42,45,50,87,106,108,118,126,143,145,151,153,158,174,181,183,186,187,191,194,196,197,199,204,205,208,209,214,218,220,245,247,248,249,250,257,259,262,263,265,270,275,276,278,283,285,288,293,294,305,306,308,315,320,321,323,325,326,327,334,337,342,355,360],dictat:[31,61,116],dictionari:[0,10,11,13,25,31,42,48,54,55,61,68,72,79,95,96,108,115,123,133,137,156,158,181,183,186,187,191,194,197,199,204,205,208,209,210,214,218,219,231,233,240,250,270,283,292,304,305,306,308,315,319,321,325,326,332,336,337,338,342,355,360],did:[2,21,22,29,56,59,63,67,90,94,95,103,110,122,130,143,178,245,317,338,342],did_declin:178,didn:[5,20,22,40,41,43,48,50,57,58,60,71,79,90,99,103,118,120,125,126,132,135,139],die:[72,90,105,116,184,204,306],dies:229,diff:[74,130,184,250],differ:[0,2,8,9,11,13,14,15,16,19,20,21,22,25,27,31,33,37,38,39,40,41,42,43,45,46,48,49,50,53,54,56,57,60,61,62,63,65,67,68,69,72,78,79,81,82,83,86,87,90,92,94,95,99,101,102,104,105,106,108,109,110,111,112,113,114,115,117,118,119,120,121,123,125,126,128,130,132,135,136,137,138,139,140,143,144,149,151,152,155,158,167,168,170,174,179,183,184,185,194,195,198,203,205,212,214,216,217,218,219,220,223,232,233,245,247,249,250,254,257,259,263,267,289,294,296,313,314,316,320,322,326,335,338,342,360],differenti:[55,56,57,181,205,214,245,342],differet:60,difficult:[4,38,92,102,132,219,220],difficulti:132,dig:[0,20,31,33,39,56,57,88,92,95,108,120,122,139,158,211,297],digit:[12,89,113,203,309,319,335],diku:[54,63,123,138,362],dikumud:128,dime:107,dimens:[48,54],dimension:57,diminish:113,dimli:110,dinner:45,dip:95,dir:[9,21,23,36,53,57,62,63,74,78,89,95,99,101,126,127,130,133,335,342],direct:[0,3,8,10,11,12,20,22,31,42,43,44,48,50,57,69,73,87,89,99,108,110,115,117,118,120,127,136,137,138,158,193,199,209,233,240,265,326,328,335,339,342,362],direction_of_split:136,directli:[2,5,8,13,14,20,21,23,27,29,30,33,37,39,41,43,45,49,50,52,54,55,57,58,60,61,63,71,79,87,88,89,92,93,94,95,99,101,103,108,109,110,113,115,117,118,122,124,127,130,136,137,153,169,174,175,178,179,180,184,197,205,214,219,220,226,232,236,240,244,245,249,254,271,276,285,288,293,298,304,314,316,320,322,326,340,342],director:205,directori:[4,8,9,13,20,25,27,36,37,42,44,52,57,58,61,62,63,68,74,75,94,95,99,105,122,124,126,127,129,130,132,133,134,135,136,138,158,208,265,285,286,310,320,335,342,362],directorylist:310,dirnam:265,dirti:54,disabl:[0,4,24,25,49,79,80,105,113,126,136,153,169,187,205,214,232,240,288,327,332,343],disableloc:288,disableremot:288,disadvantag:[57,89,115,220],disambigu:[40,71,118,153,173,245,316],disappear:102,discard:[174,319],disconcert:40,disconnect:[2,11,12,39,40,42,54,56,59,91,96,104,106,109,111,115,122,127,136,143,155,158,163,166,168,174,200,245,275,276,277,283,284,285,288,293,294,297,303,304,305,306],disconnect_al:283,disconnect_all_sess:306,disconnect_duplicate_sess:306,disconnect_session_from_account:143,discontinu:24,discord:[9,62,71,78],discordia:107,discourag:[63,74],discov:[90,121,314],discoveri:209,discrimin:102,discuss:[1,4,25,26,33,37,44,47,54,62,68,69,115,137,138],discworld:87,disengag:[115,143,216,217,218,219,220],disk:[11,27,85,99,107,109,204,208,247],dislik:56,disonnect:11,dispel:125,displai:[0,17,22,25,30,31,33,41,42,45,49,50,52,57,58,59,60,67,68,79,80,81,82,84,87,88,90,92,100,101,102,103,110,113,115,118,122,123,132,133,134,135,136,137,138,144,153,155,158,165,168,170,172,174,178,179,181,185,186,187,189,192,194,196,198,200,205,214,230,231,232,233,235,245,250,252,263,265,282,300,303,308,316,317,324,325,326,327,328,336,337,338,341,342,343,355,360],display:259,display_buff:324,display_choic:179,display_formdata:187,display_help:324,display_helptext:[247,326],display_len:342,display_met:189,display_nodetext:326,display_titl:179,dispos:[110,202],disput:115,disregard:33,dist3:93,dist:62,distanc:[6,27,38,45,48,63,124,204,219,220,245,342],distance_inc:220,distance_to_room:38,distant:[48,137,186,231],distinct:[54,63,104,139,220],distinguish:[22,153,214,220],distribut:[8,9,15,23,31,34,41,62,63,77,95,96,123,126,127,174,176,205,319,322,342],distribute_messag:174,distributor:34,distro:[8,23,62,66,71],disturb:[27,139],distutil:62,distutilserror:62,ditto:62,div:[3,16,17,108,136,248],dive:[22,40,62],diverg:82,divid:[13,63,68,183,231,342],dividend:183,divisiblebi:68,divisor:183,django:[2,3,4,9,15,23,25,36,38,54,62,68,72,75,78,85,93,100,102,103,106,111,112,119,123,124,126,127,133,135,136,138,143,144,147,170,172,174,176,185,235,237,242,244,252,254,261,264,265,271,272,285,291,293,294,301,307,309,310,313,314,316,317,320,323,327,331,332,333,338,340,342,344,347,350,355,360],django_admin:358,django_nyt:4,djangonytconfig:4,djangoproject:[23,355],djangowebroot:310,dmg:72,dnf:[8,62,66],do_attack:229,do_batch_delet:314,do_batch_finish:314,do_batch_update_attribut:314,do_create_attribut:314,do_delete_attribut:314,do_flush:[316,332],do_gmcp:289,do_hunt:229,do_mccp:278,do_msdp:289,do_mssp:279,do_mxp:280,do_naw:281,do_nested_lookup:158,do_not_exce:25,do_patrol:229,do_pickl:323,do_task:258,do_unpickl:323,do_update_attribut:314,do_xterm256:319,doabl:[14,137],doc:[16,17,23,25,33,44,50,59,63,67,69,78,85,94,95,108,109,124,128,129,135,138,140,158,203,232,276,342,355,361,362],docker:[7,62,78,89,138,362],dockerfil:99,dockerhub:99,docstr:[1,5,25,40,42,67,73,95,153,158,169,179,192,204,205,214,232,326],documen:95,document:[0,3,5,6,9,16,17,20,22,23,25,26,29,40,42,45,46,47,51,52,54,56,57,59,63,67,69,75,78,85,89,93,95,102,103,105,110,113,120,121,122,123,124,126,130,132,134,135,138,152,166,179,203,232,314,317,325,332,360,362],dodg:217,doe:[2,4,5,9,11,20,21,23,24,25,26,29,31,33,37,38,39,40,42,48,50,53,54,55,56,57,59,60,62,63,67,68,72,77,79,84,87,88,90,94,95,99,101,103,108,109,110,111,112,113,115,116,117,118,120,122,124,125,126,128,130,131,132,135,136,137,139,143,145,155,163,166,168,170,173,180,181,182,185,186,199,201,202,214,216,217,218,219,220,230,231,232,233,245,249,250,257,264,265,269,270,271,274,277,285,286,292,314,316,321,326,334,335,338,342,347,355,360],doesn:[0,4,9,11,13,15,22,26,29,33,36,37,38,43,45,48,50,56,59,60,62,68,70,71,72,74,75,77,85,87,88,89,90,94,95,102,109,110,120,122,124,125,126,127,132,135,136,137,176,180,186,193,194,205,218,240,258,265,278,285,289,314,319,326,337,342],doesnotexist:[143,145,147,174,176,178,181,183,186,188,194,196,202,203,204,205,211,212,213,216,217,218,219,220,222,225,226,229,230,231,233,237,244,245,249,254,257,272,298,314,317,322,329,333],doff:217,dog:[27,95],doing:[2,4,10,11,27,29,31,33,36,38,42,45,48,50,56,57,58,59,60,63,68,69,78,79,88,89,94,95,96,104,109,113,114,118,124,125,126,132,133,136,137,143,155,178,181,193,205,214,216,217,218,219,220,225,229,230,233,239,245,259,296,326,332,338],dolor:51,dom:136,domain:[8,54,89,102,137,322],domexcept:89,dominion:9,dompc:9,don:[0,1,3,4,6,9,10,11,20,21,22,23,25,26,27,29,30,31,33,34,37,38,40,41,42,43,45,46,49,50,53,57,58,60,61,62,63,67,68,69,71,72,74,79,80,82,84,85,87,89,90,92,94,95,96,101,102,103,104,105,110,113,115,118,121,122,124,125,126,127,130,131,132,133,134,135,136,137,139,143,145,151,152,158,163,164,165,166,167,173,174,179,184,193,197,204,205,217,218,219,223,226,231,232,233,240,244,245,249,250,259,269,270,277,282,283,288,290,297,304,311,316,319,320,326,332,335,338,342,355,360],donald:92,donat:[69,89],done:[1,4,6,9,10,11,20,21,22,25,29,30,31,33,34,36,37,38,40,42,43,48,50,54,55,56,57,58,60,61,62,63,68,69,72,75,79,81,84,86,89,90,92,99,106,107,109,114,115,116,117,118,119,120,122,125,127,130,132,135,136,143,153,155,173,174,178,184,204,220,226,233,240,244,245,257,259,265,278,282,284,286,290,294,300,303,304,306,311,314,319,320,327,332,342,360],donoth:257,dont:287,doom:250,door:[0,20,22,27,42,48,60,79,84,88,102,158,211],doorwai:211,dot:[22,42,52,118,152,158,320,342],dotal:[319,341],dotpath:342,doubl:[22,42,56,96,118,132,151,170,341,342],doublet:[151,152],doubt:[22,137,232],down:[0,4,6,11,12,21,22,29,31,33,36,38,40,42,48,49,50,52,54,56,57,60,62,72,80,84,85,89,90,92,95,99,101,102,103,105,107,110,113,118,121,122,135,136,143,158,168,194,208,214,217,218,230,233,239,245,250,257,259,265,267,274,275,282,283,303,304,306,319,327,328,342],download:[5,9,23,26,62,63,71,74,78,89,99,100,127,129,130,138],downtim:[29,102,329],downward:[42,155],dozen:[25,54,107],drag:136,draggabl:137,dragon:55,dramat:[11,60],drape:181,draw:[14,38,48,72,118,328],draw_room_on_map:48,drawback:[14,23,28,29,50,57,72,85,137,180,320],drawn:[48,57,110],drawtext:72,dream:[26,54,60,128],dress:181,drink:[314,316],drive:[9,19,21,60,62,63,95,99,120,130,132],driven:[25,78,122,213,247],driver:23,drizzl:[101,131],drop:[6,9,14,20,21,23,25,33,37,39,54,56,57,59,68,69,79,84,85,86,87,88,89,116,117,120,127,136,137,158,164,181,196,202,213,217,220,225,239,245,274,316,320,342,361],drop_whitespac:328,dropdown:[105,137],droplock:239,dropper:[196,217,220,245],drum:89,dtobj:342,duck:[27,94],duckclient:24,due:[5,6,12,22,29,31,33,39,42,57,59,61,62,63,75,89,90,92,94,95,103,106,124,125,139,152,168,196,244,245,267,303,306,313,319,335],duh:107,dull:[20,26,110],dumb:[20,137,306,319],dummi:[9,33,53,58,79,92,126,205,240,265,283,296,297,304],dummycli:296,dummyfactori:296,dummyrunn:[140,260,265,283,295,297,299],dummyrunner_act:296,dummyrunner_actions_modul:296,dummyrunner_set:[92,140,260,265,295],dummyrunner_settings_modul:92,dummysess:306,dump:[34,208,274],dungeon:[54,76,111],dupic:31,duplic:[31,37,95,151,158,259,316,335],durat:[10,28,131,138,218,336,343,362],dure:[9,11,29,31,39,54,59,60,62,65,67,78,79,94,96,99,101,104,106,115,122,131,134,135,136,139,143,151,169,186,199,202,226,229,231,232,240,242,256,274,284,320,322,326,335,355,361],duti:63,dwarf:110,dying:[216,217,218,219,220],dynam:[2,3,34,42,67,81,85,89,110,113,114,123,132,136,137,138,143,147,153,165,168,169,173,176,187,205,214,216,217,218,219,220,237,244,245,254,259,314,316,317,322,324,326,333,336,342,360,362],dynamic_split:136,dyndns_system:89,each:[0,1,2,4,5,10,11,13,19,20,22,27,29,31,33,34,36,38,39,41,42,47,48,50,54,55,56,57,58,60,61,63,68,72,76,79,81,82,84,85,94,95,96,99,101,103,104,107,108,110,111,113,114,115,118,120,122,123,124,125,126,131,132,135,136,137,139,143,150,151,152,156,158,167,174,178,180,181,182,186,187,199,202,204,205,214,216,218,219,220,227,233,237,240,244,245,250,256,259,267,270,283,285,288,292,297,304,305,306,314,316,317,319,320,322,324,325,326,327,328,332,334,342],eaoiui:204,earli:[36,137,216,217,218,219,220,267],earlier:[3,9,13,31,36,50,53,57,59,60,61,63,73,84,94,95,105,118,120,122,130,133,270],earn:123,earnest:123,earth:[81,102],eas:[31,33,38,85,89,99,125],easi:[0,5,10,13,17,22,23,26,29,33,38,42,45,50,54,55,60,61,67,68,71,72,75,78,80,81,84,87,88,89,99,101,105,107,110,112,115,117,122,124,125,126,127,130,132,133,137,139,152,156,163,181,187,214,326,332],easier:[1,4,10,11,12,22,25,37,38,46,50,54,55,56,57,60,61,68,72,85,89,90,94,95,101,108,125,135,204,214,216,217,218,219,220,230,258,307,317,327,342],easiest:[0,5,12,15,25,27,30,45,57,62,69,75,122,127,130,132,134,208,316],easili:[0,3,4,11,12,13,14,17,20,25,27,28,33,34,37,38,45,47,48,50,54,57,59,60,61,62,67,69,72,79,82,84,87,89,90,95,97,99,102,104,105,106,107,108,110,111,118,121,122,130,132,135,136,137,139,165,176,178,179,181,187,189,193,204,211,214,216,217,218,219,220,232,236,237,239,259,320,326,337],east:[25,43,48,110,158,199,231],east_exit:231,east_west:110,eastern:[61,110],eastward:231,eccel:328,echo1:29,echo2:29,echo3:29,echo:[5,10,12,20,26,27,28,29,33,36,42,43,48,49,54,58,64,70,89,94,95,97,99,103,108,109,115,117,122,131,139,143,145,156,158,163,168,181,184,196,205,225,229,230,231,245,263,270,285,288,324,342],echotest:5,econom:[54,78,85],economi:[60,72,101,107,119,178],ecosystem:99,edg:[16,27,130,328,342],edgi:48,edit:[0,1,4,5,6,9,11,13,14,23,25,26,30,33,35,37,39,40,42,45,47,53,55,57,58,59,60,61,66,67,68,69,74,75,78,79,80,85,94,95,96,99,100,103,105,108,110,113,127,132,133,134,135,136,137,156,158,165,168,179,185,187,191,192,194,195,200,201,202,235,240,242,245,247,249,250,314,324,355,360],edit_callback:[192,194],edit_handl:158,editcmd:22,editor:[0,5,9,15,21,22,33,42,44,45,56,59,62,75,78,94,95,96,107,108,110,130,138,158,165,167,168,179,201,254,320,324],editor_command_group:324,editorcmdset:324,editsheet:57,effect:[6,10,11,14,27,28,29,31,35,38,42,55,56,57,60,72,86,94,103,106,109,110,113,114,115,116,123,125,126,127,128,137,139,140,141,143,151,152,158,167,184,194,217,218,219,225,226,229,231,238,245,251,254,278,334,342],effici:[11,26,28,29,38,54,55,63,75,78,85,86,92,94,102,111,114,118,124,131,178,205,212,240,245,259,314,315,317,324,327],effort:[37,55,130,133,360],egg:74,egg_info:62,egi:267,either:[0,4,9,12,13,17,23,27,29,31,33,34,37,38,40,42,43,45,48,50,55,56,57,68,72,79,82,89,90,92,94,96,101,102,104,108,109,110,111,113,115,118,120,122,124,125,127,130,136,137,143,145,151,152,153,168,173,174,175,179,191,197,198,200,204,205,211,214,216,219,220,240,245,249,250,254,256,257,259,263,274,286,290,297,315,316,317,326,328,334,335,337,339,342],elabor:[4,22,84,90,122],electr:89,eleg:37,element:[16,17,22,40,42,50,54,90,113,150,155,179,183,203,204,245,250,314,315,317,320,325,326,327,342],elev:[45,81,123,138,362],elif:[0,40,48,50,57,72,101,115,116,122],elimin:[95,99,319],ellipsi:95,ellow:113,els:[0,1,2,5,9,10,12,19,20,21,22,23,25,27,29,30,33,38,40,41,45,47,48,50,57,59,67,68,72,79,80,81,83,84,89,90,94,101,102,110,113,114,115,116,119,120,122,126,130,132,133,136,178,181,187,203,216,217,218,219,220,233,244,294,316,342],elsewher:[2,29,31,57,69,95,111,132,137,152,231,265,306,314],elvish:204,emac:[14,78],email:[62,63,130,143,144,185,322,336,342,343,355],email_login:[140,141,177],emailaddress:342,emailfield:[144,355],emb:[57,108,113,186,250],embark:120,embed:[108,113,124,137,248,325,334,342],emerg:[75,79,102],emi:204,emit:[25,34,107,136,152,156,174,188,245,304,335],emit_to_obj:[152,245],emo:21,emoji:24,emot:[33,40,42,54,67,115,164,178,204,205],emoteerror:205,emoteexcept:205,emphas:60,emploi:343,empti:[0,2,3,6,9,10,14,31,33,40,41,42,46,48,50,53,57,59,62,63,68,72,76,83,85,87,88,90,95,96,99,113,114,116,118,122,124,126,127,130,133,136,137,149,150,156,158,169,179,189,191,205,249,250,263,270,274,296,297,313,320,322,326,328,339,342],empty_color:189,empty_permit:[144,235,242,355],empty_threadpool:310,emptyset:31,emul:[42,63,74,104,122,128,168],enabl:[8,24,42,70,99,102,105,113,125,133,136,143,174,187,288,343],enable_recog:205,enableloc:288,enableremot:288,encamp:45,encapsul:336,encarnia:78,encas:324,enclos:[35,42,49,170,185,334],encod:[7,27,57,110,138,276,289,293,294,319,338,342,362],encode_gmcp:289,encode_msdp:289,encoded_text:342,encompass:27,encount:[59,94,152,343],encourag:[3,22,38,69,90,93],encrypt:[7,8,42,82,102,163,285,286,290],end:[1,5,6,8,9,10,11,13,14,19,20,21,22,23,25,27,28,29,31,33,34,38,39,42,46,49,50,53,54,57,59,61,63,64,68,72,75,79,80,82,85,86,87,89,90,92,94,95,99,104,106,107,108,113,115,117,118,120,121,122,125,127,130,132,133,134,136,137,139,143,145,151,152,158,164,165,173,178,180,181,184,189,201,205,213,214,216,217,218,219,220,231,236,248,269,276,277,285,288,289,299,304,308,310,315,319,320,322,326,327,328,334,335,342,360],end_convers:50,end_turn:115,endblock:[3,68,132,133],endclr:[113,334],endfor:[68,132,133],endhour:25,endif:[68,132,133],endlessli:102,endpoint:102,endsep:342,endswith:319,enemi:[11,29,50,60,108,115,121,218,219,220,229,230,231],enemynam:50,enforc:[10,33,40,60,72,79,113,125,137,285,288,327,328,360],enforce_s:328,engag:[54,220,229],engin:[22,23,33,36,42,54,55,63,67,72,76,78,88,101,102,103,121,126,130,135,139,149,152,167,168,209,231,236,265,276,282,285,288,293,303,305,320,322],english:[15,75,78,96,112,138],enhanc:[58,80,113,136,208,319,360],enigmat:20,enjoi:[60,62,90,105],enough:[4,6,21,29,38,40,41,42,54,56,57,60,62,63,68,69,79,83,84,86,89,90,95,107,111,114,118,122,125,135,152,158,203,204,225,233,326,327,328],ensdep:342,ensur:[48,68,93,99,105,116,125,126,214,340,360],ensure_ascii:294,enter:[0,1,3,5,9,13,14,15,20,21,22,23,25,26,27,29,31,33,35,36,40,41,42,43,45,50,57,61,62,63,65,68,74,76,79,82,84,86,88,90,94,95,99,108,110,113,115,116,118,122,123,127,128,130,132,134,137,138,140,143,150,152,157,166,167,168,173,178,179,181,186,187,197,200,214,216,217,218,219,220,229,231,233,239,245,250,254,263,304,326,355],enter_guild:50,enter_nam:50,enter_wild:233,enterlock:239,enterpris:36,entir:[10,11,13,14,19,22,27,29,33,45,48,49,50,59,60,68,79,85,89,90,107,110,113,114,122,124,126,135,179,204,205,214,232,239,240,245,250,316,320,328,332,334,342,360],entireti:[50,72,187,326],entit:322,entiti:[6,11,27,34,42,46,50,52,54,58,60,63,79,83,86,88,101,104,106,108,111,115,118,124,125,138,142,143,153,158,168,174,175,176,205,211,239,245,247,248,249,250,251,254,255,257,259,306,314,315,317,322,326,327,331,339,342],entitii:106,entitl:89,entranc:110,entri:[4,5,11,15,25,27,31,33,34,42,46,47,50,53,57,58,62,68,69,71,76,79,90,94,106,118,120,130,137,138,143,153,165,166,169,189,196,203,214,216,217,218,219,220,234,235,236,237,240,245,259,284,297,314,320,322,324,326,328,335,336,339,342,343,360],entriest:[42,155],entrust:58,entrypoint:99,entrytext:[68,237,322],enul:8,enumar:342,enumer:133,env:[265,275],environ:[4,7,9,13,25,36,42,44,52,58,60,62,63,64,81,89,94,99,102,127,168,169,227,265,275,291,300,320,326,340,358],environment:265,eof:285,epic:78,epilog:232,epoch:[27,61,329],epollreactor:310,epub:78,equal:[0,16,19,20,25,31,33,38,45,90,92,95,96,113,120,151,186,205,216,217,218,219,220,245,342],equip:[14,56,113,181,216,217,219,220],equival:[10,11,13,39,42,46,62,86,87,100,102,103,109,113,127,142,158,236,283,289,314,342,360],eras:[9,94,220],err:[57,79,296,320],err_travers:[88,245],errback:[10,262,265,274,275,342],errmessag:151,errmsg:[122,335],erron:[112,122,274,328],error:[1,5,6,8,9,10,11,14,15,20,22,23,24,26,27,31,33,37,41,42,50,52,55,56,57,58,59,62,63,70,73,74,75,79,82,85,86,88,89,90,96,102,103,104,108,110,112,113,117,118,119,121,122,124,126,127,130,132,134,138,143,149,151,152,158,174,194,199,203,205,214,226,230,232,240,245,248,249,257,262,264,265,267,269,274,288,296,316,319,320,322,325,326,334,335,338,342,343,362],error_check_python_modul:265,error_class:[144,235,242,355],error_cmd:43,error_msg:308,errorlist:[144,235,242,355],errorlog:8,escal:[2,19,42,79,155,239],escap:[42,68,113,164,168,232,248,319,334,341,355],escript:[22,179],especi:[1,8,15,22,23,29,59,60,62,79,104,110,111,123,189,204,320,327],ess:51,essai:78,essenti:[28,48,55,74,78,105,112,175,265,322],est:51,establish:[33,60,72,104,143,196,216,245,262,274,276,283,285,288,293,296,303,305],estat:136,estim:[30,250,332],esult:245,etc:[2,5,6,8,11,12,20,22,23,24,25,27,29,30,33,35,39,40,42,46,47,48,50,54,55,56,57,60,61,62,63,72,78,79,82,83,85,86,87,88,94,95,99,101,102,104,106,107,108,109,115,118,119,124,125,126,130,131,136,137,143,147,149,150,151,152,155,157,158,166,167,168,174,178,182,183,187,189,202,204,205,211,217,219,223,226,232,245,248,249,250,283,285,288,292,293,294,304,305,313,314,316,319,320,322,323,324,325,326,334,335,342,360],etern:50,ev_channel:145,eval:[108,178,248],evalstr:240,evalu:[33,118,150,178,240,248],evbot:[42,163,306],evcast:78,evcel:[325,328],evcolor:78,evcolum:328,evcolumn:328,eve:342,eveditor:[22,44,138,140,141,179,318,362],eveditorcmdset:324,even:[1,4,6,9,11,12,14,19,21,22,25,26,27,29,31,37,38,40,41,42,45,48,49,50,53,54,55,56,57,59,60,61,62,63,68,69,72,76,79,84,85,89,90,92,96,101,102,104,105,107,109,113,114,115,117,118,121,122,124,125,128,130,134,137,151,153,156,181,183,186,187,196,204,216,217,218,219,220,231,232,245,250,288,328,332,342],evenli:[27,183,342],evenn:99,evenna:9,evenni:4,evennia:[0,1,2,3,6,10,11,13,14,15,17,19,20,21,22,24,27,28,29,30,31,33,34,35,36,37,38,39,42,43,47,48,49,50,51,58,59,60,61,62,63,64,65,67,68,69,71,72,73,77,79,80,82,83,84,85,86,87,88,91,92,93,96,97,98,100,101,102,103,104,106,107,110,111,112,113,114,115,116,117,118,119,120,121,122,124,128,129,131,132,133,134,135,137,138,362],evennia_access:8,evennia_admin:360,evennia_channel:[42,64,71,97,163],evennia_dir:342,evennia_error:8,evennia_gener:135,evennia_launch:[105,140,141,260,263],evennia_logo:135,evennia_vers:265,evennia_websocket_webcli:293,evennia_wsgi_apach:8,evenniacreateview:360,evenniadeleteview:360,evenniadetailview:360,evenniaform:355,evenniagameindexcli:267,evenniagameindexservic:268,evenniaindexview:360,evennialogfil:335,evennian:24,evenniapasswordvalid:309,evenniareverseproxyresourc:310,evenniatest:[169,195,210,227,291,340,358],evenniaupdateview:360,evenniausernameavailabilityvalid:[143,309],evenniawebtest:358,event:[50,63,72,102,106,136,138,140,145,178,183,193,194,195,196,197,205,208,226,254,257,307,362],event_nam:[193,197],eventcharact:196,eventdict:335,eventexit:196,eventfunc:[0,140,177,190,194],eventhandl:194,eventi:[153,179,232],eventobject:196,eventroom:196,eventu:[4,11,12,19,29,33,40,57,60,69,75,79,82,87,89,109,115,118,122,132,135,143,149,150,167,169,184,196,204,205,231,240,245,249,250,262,270,296,304,305,317,321,322,326,328,353],evenv:[4,36,62,63,74,96,105],evenwidth:328,ever:[11,12,13,14,15,22,23,33,40,56,63,72,85,90,101,104,109,110,111,112,117,124,127,130,137,239,259,276,277,283,314,326],everi:[0,4,6,11,13,20,21,26,27,28,31,33,36,37,38,40,42,45,47,48,50,56,61,62,63,68,72,73,74,76,84,85,89,90,95,99,101,103,107,108,110,111,112,113,114,115,118,119,120,121,122,124,126,127,129,130,131,132,133,134,135,136,137,143,158,163,181,187,194,204,205,214,216,217,218,219,220,222,226,233,245,250,257,259,270,287,297,303,312,313,314,316,326,327,328],everror:194,everybodi:40,everyon:[19,21,24,33,34,42,50,57,60,63,70,72,76,77,79,86,97,101,109,111,113,115,120,122,126,127,130,131,158,164,165,184,216,217,218,219,220,245,283],everyth:[9,11,19,21,26,28,31,36,41,42,46,48,52,54,57,60,62,63,68,71,72,74,78,79,80,82,84,86,89,90,96,99,102,103,108,109,110,112,114,115,118,121,126,127,130,134,135,136,137,138,148,153,163,164,166,167,168,169,170,180,185,231,239,244,254,269,296,304,314,316,320,334],everywher:[9,55,93],evform:[27,44,140,141,318],evgam:[42,163],evid:71,evil:[14,92,225,250],evmenu:[22,27,33,44,57,84,123,138,140,141,179,187,200,213,214,247,318,327,362],evmenucmdset:326,evmenuerror:326,evmor:[44,138,140,141,318,362],evtabl:[27,33,44,48,110,140,141,153,187,249,318,325,327,342],evtable_arg:327,evtable_kwarg:327,exact:[33,40,42,50,79,92,94,95,118,128,137,143,150,158,167,175,205,220,236,245,249,250,315,316,338,339,342],exactli:[2,10,19,20,39,41,45,57,61,62,63,68,72,75,82,85,90,94,95,99,101,109,110,113,114,122,127,130,135,137,205,245,265,316,339],exam:[42,158],examin:[2,11,12,20,22,33,57,59,72,79,82,84,90,95,105,114,121,122,130,136,139,143,158,178,223,230,231,297],exampl:[0,2,4,5,6,8,10,11,13,14,15,17,19,20,21,22,25,27,28,29,30,31,33,36,37,39,40,42,43,47,48,52,54,55,56,57,58,59,60,61,62,63,66,67,70,73,76,80,81,82,83,84,85,86,87,88,90,92,94,95,96,97,99,102,103,104,105,108,109,110,111,113,114,116,117,118,120,121,122,123,124,125,128,129,130,131,132,134,135,137,138,139,140,143,147,150,151,152,153,156,157,158,163,164,165,166,167,169,173,175,176,178,179,181,183,184,186,187,188,189,198,199,202,203,204,205,208,211,212,213,214,216,217,218,219,220,222,225,226,229,231,232,233,237,240,244,245,250,254,257,259,270,285,288,289,294,297,306,310,313,314,316,317,318,319,321,325,326,327,328,329,333,334,335,336,339,340,342,343,355,360,361,362],example1_build_forest:199,example1_build_mountain:199,example1_build_templ:199,example1_legend:199,example1_map:199,example2_build_forest:199,example2_build_horizontal_exit:199,example2_build_verticle_exit:199,example2_legend:199,example2_map:199,example_batch_cod:[13,140,177,221],exapmpl:5,excalibur:84,exce:[81,216,217,218,219,220,308,332],exceed:308,excel:[55,78,79,101,107],excempt:151,except:[4,9,10,11,14,19,20,21,22,27,28,29,31,33,38,40,45,49,57,62,63,74,79,82,88,89,90,94,96,101,108,110,113,115,117,118,119,120,122,125,132,133,143,145,147,149,152,153,166,167,174,175,176,178,181,183,186,188,193,194,196,197,201,202,203,204,205,211,212,213,216,217,218,219,220,222,225,226,229,230,231,232,233,237,239,240,244,245,249,254,257,265,270,272,274,286,288,290,294,298,310,314,317,319,322,325,326,328,329,333,334,335,337,342],excepteur:51,excerpt:49,excess:[22,79,108,166,167,244,320],exchang:[13,89,101,178,323],excit:[20,35,53],exclam:21,exclud:[63,118,119,122,181,202,231,244,245,324,326],exclude_channel_messag:175,exclude_cov:181,excluded_typeclass_path:168,exclus:[50,60,79,245,254,315,326],exclusiv:322,exe:[62,105,127],exec:[50,84,108,250,326],exec_kwarg:326,exec_str:300,execcgi:8,execut:[0,9,10,12,13,14,19,22,25,28,29,31,33,36,42,44,45,46,49,50,54,61,62,63,68,74,82,84,86,88,90,94,101,105,108,110,113,118,126,127,136,138,143,145,147,148,149,153,156,157,165,166,168,169,176,179,194,199,205,214,232,237,239,240,244,245,249,250,251,254,258,262,270,272,275,276,282,285,288,293,297,300,303,304,314,316,317,320,326,327,333,334,342,362],execute_cmd:[2,33,88,116,117,122,143,145,153,245,270,304],execute_command:33,executor:36,exemplifi:[28,39,121],exercis:[21,40,41,57,84,94,95,110,115,122,131,291,301,333],exhaust:22,exhaustedgener:203,exidbobj:245,exis:43,exist:[0,2,3,5,11,12,13,20,21,22,25,27,31,33,35,36,38,39,40,42,43,45,47,48,50,55,56,57,59,60,63,64,67,68,69,71,75,79,85,95,96,99,101,104,108,110,111,114,115,116,122,123,127,130,133,135,137,138,142,143,144,145,151,152,153,158,165,166,167,168,174,179,180,186,191,193,194,197,198,201,202,204,205,212,219,230,233,239,240,244,245,247,250,257,258,265,269,271,285,286,290,298,303,304,306,314,315,316,317,320,322,324,325,326,328,335,337,342],existen:304,exit:[20,21,22,23,31,38,40,42,44,48,49,50,54,57,62,79,84,85,90,99,105,108,110,118,120,121,122,123,124,127,138,140,149,151,152,158,168,178,179,195,196,199,200,211,212,214,220,229,230,231,232,233,239,244,245,250,285,297,314,322,324,326,327,340,358,362],exit_alias:[158,211],exit_back:57,exit_cmd:[50,327],exit_command:245,exit_nam:[48,158,211],exit_on_lastpag:327,exit_ther:57,exit_to_her:[42,158],exit_to_ther:[42,158],exit_typeclass:[233,340,358],exitbuildingmenu:22,exitcmdset:[31,245],exitcommand:245,exitnam:211,exitobject:43,exixt:283,exot:33,exp:325,expand:[0,1,4,5,6,20,21,23,48,54,56,57,60,63,69,73,80,84,88,89,103,110,113,116,119,122,123,130,131,134,138,139,158,185,211,216,217,218,219,220,245,319,328],expand_tab:328,expandtab:[319,328],expans:[43,60],expect:[0,1,6,9,10,33,34,37,46,55,57,60,74,79,82,86,87,88,89,90,93,94,95,96,106,112,113,114,121,122,123,125,126,127,133,137,158,166,167,179,191,193,203,226,233,239,245,249,250,263,313,316,326,327,332,347,360],expected_return:126,expedit:95,expens:[89,114,118,339],experi:[26,41,50,56,59,60,61,62,72,76,80,89,94,99,110,121,130,134,138],experienc:[50,60,63,78,94],experienced_betray:50,experienced_viol:50,experiment:[42,73,168,172,242,361],explain:[20,22,33,38,47,50,54,57,63,70,78,85,118,120,123,125,126,128,130,133,135,138],explan:[25,31,33,38,63,68,76,113,123,138,309],explicit:[0,1,22,31,39,47,68,70,87,90,103,128,135,203,265,287,314],explicitli:[4,9,21,30,31,42,57,58,62,67,79,82,83,84,85,86,95,96,108,111,113,114,123,124,152,153,158,203,245,250,259,316,319,322,338],explor:[0,2,10,20,41,42,52,58,62,68,82,94,103,110,115,121,124,168],expos:[102,133],express:[3,33,42,50,55,79,108,118,133,134,139,158,183,203,220,248,342],ext:50,extend:[1,3,5,27,34,38,42,54,55,68,72,78,84,85,107,110,116,117,124,132,133,147,153,165,169,174,180,182,186,194,197,233,242,244,245,316,319,336,355,360],extended_room:[140,141,177],extendedloopingcal:259,extendedroom:186,extendedroomcmdset:186,extens:[1,3,9,23,50,54,55,60,62,63,87,95,96,103,110,113,126,137,147,209,216,280,288,322,331,341],extent:[22,55,72],extern:[8,15,23,34,39,40,42,53,54,56,62,64,71,89,97,105,107,108,110,123,138,140,163,171,174,176,208,249,263,265,267],external_discord_hello:270,extra:[1,6,8,14,16,21,23,25,29,31,33,37,40,50,56,57,79,88,89,92,94,95,106,113,118,122,124,125,126,133,135,136,137,143,144,147,153,165,178,186,188,201,205,231,245,248,259,262,313,315,319,320,324,326,328,335,336,337,341,342],extra_environ:320,extra_spac:342,extract:[11,40,55,90,95,96,106,137,153,205,209,240,279,293,327,342],extract_goto_exec:326,extrainfoauthserv:285,extran:187,extrem:[26,55,90,109,127,216,217,219,220,278,336],eye:[59,96,110,113,250,327],eyed:135,eyes:[33,37,56],eyesight:[57,79,113],f6d4ca9b2b22:99,face:[89,102,121,188,309,326],facil:335,fact:[10,11,14,21,29,33,54,56,57,60,75,82,88,102,105,113,116,122,124,125,133,137,139,306,334],facter:137,factor:[0,61,81,113,217,219,262,276,277],factori:[39,95,262,267,275,276,277,283,284,285,286,288,296],factory_path:145,fade:[107,204],fail:[4,9,10,11,12,13,14,24,27,31,40,50,59,60,62,88,90,102,106,108,109,112,115,116,120,126,152,167,174,184,205,211,230,239,240,245,249,257,262,263,265,269,276,277,287,308,313,314,316,334,336,338,342,360],failmsg:308,failtext:72,failur:[10,14,62,72,118,126,143,231,267,274,276,277,296,308,319,342],failure_teleport_msg:231,failure_teleport_to:231,faint:101,fair:[72,184],fairli:[38,68,74,181,187,214,217],fake:[182,296,306,314],fall:[26,31,59,61,63,72,96,101,110,112,140,143,167,188,205,231,342,355,360],fall_exit:231,fallback:[43,48,54,149,153,176,186,240,257,265,289,294,314,326,337,342],fals:[1,2,4,6,11,20,21,22,25,27,29,31,33,40,43,48,49,50,57,61,67,73,76,79,80,81,83,85,88,95,101,102,114,115,117,119,120,122,124,126,132,136,143,144,147,150,151,152,153,158,165,174,175,176,178,179,181,182,183,184,187,191,194,196,198,204,205,211,214,216,217,218,219,220,232,233,235,236,237,239,240,242,244,245,247,249,250,254,255,256,257,259,262,265,267,271,274,275,282,283,284,285,288,294,302,304,306,308,310,313,314,315,316,317,319,320,322,324,326,327,328,329,332,334,337,338,339,341,342,343,355],falsestr:187,falter:60,fame:121,famili:[9,50,56],familiar:[3,9,20,29,31,33,38,57,59,62,84,89,90,94,95,110,118,123,124,132],famou:[51,324],fan:78,fanci:[15,17,36,72,137,181],fanclub:118,faq:[44,123,138,287,362],far:[0,13,20,21,22,31,33,38,40,43,45,48,53,54,56,58,60,74,87,89,90,94,95,99,105,110,113,118,130,137,151,220,233,239,267,292,314,324,332],fashion:110,fast:[11,15,23,26,27,29,55,61,63,81,88,107,114,130,156],faster:[23,61,92,118,174,176,178,314],fastest:5,fatal:265,faulti:94,favor:27,favorit:[21,37],fear:27,featgmcp:289,featur:[0,4,15,17,20,22,25,26,27,31,33,34,36,37,41,44,45,46,47,48,49,55,56,58,60,61,62,63,69,71,77,80,84,90,95,102,106,108,110,113,118,121,122,123,124,127,128,130,137,138,143,152,153,186,194,205,214,232,259,282,303,307,316,324,342,360,362],februari:61,fed:[10,33,79,283,314,323,325],fedora:[8,62,66,130],feed:[7,15,42,48,50,54,72,97,108,127,138,145,163,267,284,285,316],feedback:[37,41,60,69,88,117,175,225,324],feedpars:[97,284],feedread:145,feel:[0,10,17,22,37,38,45,54,56,59,60,62,63,68,69,70,72,76,89,90,107,117,121,122,124,130,132,137,204,214,217,223,231],feend78:198,feint:115,felin:27,fellow:325,felt:[101,131],femal:188,fetch:[11,62,89,99,127,130,132,199,314,327,360],few:[0,4,6,9,10,11,15,17,20,23,31,33,34,36,40,41,42,48,49,54,58,59,60,63,65,72,73,78,79,85,87,88,90,102,109,113,115,118,120,121,122,125,126,130,137,168,183,204,226,244,280,289,308,319,328,342,360],fewer:[107,306,315],fg_colormap:341,fgstart:341,fgstop:341,fiction:[50,54,61,76,326],fictional_word:204,fictiv:204,fiddl:231,fido:95,field:[3,11,23,34,53,55,57,73,83,85,86,88,101,105,106,111,118,124,127,132,134,144,147,172,176,187,191,205,220,229,235,237,239,242,244,245,249,250,252,254,255,259,272,313,314,315,316,317,325,333,338,339,355,357,360],field_class:355,field_or_argnam:73,field_ord:355,fieldevmenu:187,fieldfil:[140,141,177],fieldnam:[57,83,187,255,316,332,355],fieldset:[144,172,235,242,252],fieldtyp:187,fifi:95,fifo:342,fifth:48,fight:[29,31,60,115,121,216,217,218,219,220,230],fighter:[216,217,218,219,220],figur:[3,12,26,33,37,41,48,79,82,89,90,92,95,96,118,120,130,132,137,178,180,183,205,265],file:[2,3,4,5,6,8,9,19,20,21,22,23,25,26,27,31,34,36,37,39,40,41,43,46,47,53,55,56,57,58,59,61,62,63,64,65,66,67,68,71,74,75,78,79,80,84,85,89,92,94,95,96,97,99,102,105,109,110,113,116,118,119,120,122,127,129,132,133,134,135,136,137,138,140,141,143,144,157,165,174,179,181,182,183,185,199,200,204,208,232,233,235,239,242,250,264,265,285,286,289,290,297,298,299,303,310,311,313,318,325,326,335,338,339,342,355,360],file_end:[320,342],filelogobserv:335,filenam:[27,59,130,320,325,335],filename1:265,filename2:265,filesystem:[62,99,102],fill:[36,40,48,49,57,60,64,69,105,110,113,118,132,134,187,248,313,314,319,325,327,328,342],fill_char:328,fill_color:189,fillabl:187,fillchar:[113,319,334,342],filo:342,filter:[31,34,38,42,68,85,105,113,118,119,124,132,137,151,156,174,179,186,205,244,245,342,360],filter_famili:[118,124],filthi:77,final_valu:10,find:[0,3,4,6,10,11,12,13,14,17,20,21,22,23,24,25,26,27,29,31,33,34,37,39,40,41,45,46,47,48,49,54,55,56,57,59,60,61,62,67,68,69,72,73,74,75,77,78,79,83,85,86,88,89,90,92,94,95,96,99,101,102,107,108,109,111,113,118,121,122,123,124,126,127,130,132,133,134,135,138,139,143,150,158,175,183,186,199,205,211,214,231,232,245,249,250,256,265,279,314,315,319,321,339,342],find_apropo:236,find_topicmatch:236,find_topics_with_categori:236,find_topicsuggest:236,fine:[12,15,20,33,40,43,45,63,84,85,88,94,104,111,114,117,121,122,137,145,231,314,322,342],finer:12,finish:[10,14,29,33,57,58,60,99,106,121,122,123,127,132,135,140,143,153,155,166,178,186,202,230,245,265,269,277,288,303,310,321,326,342],finish_chargen:50,finit:90,fire:[2,20,21,27,28,29,33,45,50,57,60,95,101,105,106,110,114,117,119,131,138,145,149,194,218,219,245,248,250,257,265,274,276,293,326,327,332,342],firebreath:57,firefox:71,firestorm:28,firestorm_lastcast:28,firewal:89,first:[2,3,4,5,6,7,9,10,11,12,13,14,15,16,19,20,21,23,24,26,27,29,31,33,35,38,39,40,41,42,44,47,48,49,50,54,55,57,58,60,61,62,64,67,68,69,70,72,74,75,76,79,80,82,84,85,88,89,90,92,95,96,97,99,101,102,103,104,105,106,107,108,109,112,113,115,117,118,119,120,121,122,124,125,126,127,130,131,132,133,134,135,136,137,138,143,145,147,150,151,158,166,167,170,174,176,178,179,181,182,183,185,186,199,200,203,204,205,211,213,216,217,218,219,220,222,226,229,230,231,232,233,237,239,244,245,249,250,254,257,265,269,270,272,283,285,288,289,293,294,296,297,303,306,314,316,317,319,320,322,324,325,326,328,329,332,333,334,341,342,361,362],first_lin:122,first_nam:144,firsthand:79,firstli:[9,88,89,95,96],firstspac:341,fish:[72,152,202],fist:250,fit:[11,23,38,46,57,79,87,120,128,129,132,217,220,325,327,328,342],five:[28,33,89,110,118,152,214,342,343],fix:[13,14,16,26,27,33,37,41,42,50,56,59,60,62,63,69,74,77,82,84,89,94,95,96,108,109,120,122,124,126,137,204,265,325,327,328,338],fix_sentence_end:328,fixer:118,fixing_strange_bug:130,fixtur:[169,227,291,301,333,340],flag:[9,13,14,20,28,29,30,31,33,39,40,42,50,57,60,73,75,82,85,107,114,122,130,143,149,153,158,229,239,240,245,265,272,276,285,288,293,304,324,326,342],flame:[28,219],flash:[14,226],flat:[22,26,27,44,46,47,52,55,58,59,95,124,140,250],flatfil:55,flaticon:78,flatten:250,flatten_diff:250,flatten_prototyp:250,flattened_diff:250,flatul:101,flavor:[20,89,219],flavour:[86,125],flaw:120,fled:[115,229],fledg:[15,89,107,122,132,157,184],flee:[115,116,220,229],fleevalu:115,flesh:[20,57],flexibl:[1,13,21,22,29,38,42,50,52,56,58,72,87,89,101,107,108,110,115,133,136,137,147,158,178,179,187,214,239,314,342,360],flick:343,flip:[50,80],flood:[27,49],floor:[0,81,205],flow:[17,36,39,54,60,82,85,114,130,136,322,334],flower:[12,20,42,60,86,88,118,158],flowerpot:[12,56],fluent:78,fluid:[16,17],flurri:205,flush:[23,33,42,110,127,168,257,314,316,332],flush_cach:332,flush_cached_inst:332,flush_from_cach:332,flush_instance_cach:332,flusher:332,flushmem:[42,168],fly:[3,12,21,27,31,33,34,42,50,54,63,84,101,108,118,137,143,164,166,167,174,176,237,245,259,272,283,286,290,314,320,329,342,360],focu:[4,60,115,123],focus:[55,56,60,76,78,105,122,123,220],foe:217,fold:214,folder:[3,5,8,13,14,21,27,30,46,48,54,56,57,59,62,63,68,72,74,75,85,94,95,99,102,105,109,110,115,116,117,122,126,127,132,133,134,135,136,199,216,217,218,219,220,265],folder_nam:63,foldernam:59,follow:[0,2,4,5,7,8,9,10,11,13,14,16,17,19,20,22,23,25,31,33,34,37,38,39,40,41,42,45,46,47,48,49,50,52,53,57,59,60,61,62,64,67,68,70,72,73,74,75,78,79,81,84,85,87,88,89,90,92,94,95,96,99,101,102,105,109,111,113,115,116,118,119,120,122,124,126,127,130,132,133,134,136,143,145,147,149,150,153,158,166,167,169,174,176,179,181,182,184,188,194,196,198,199,205,214,218,219,225,231,237,239,240,244,245,248,250,254,255,269,270,280,289,293,294,297,307,314,316,319,320,322,325,326,328,334,335,342],follwo:240,fond:61,font:[25,110,136],foo:[33,39,50,82,83,87,94,106,111,118,126,214,326,340],foo_bar:87,foobarfoo:12,foolish:225,footer:[68,132,153],footnot:15,footprint:[42,168],footwear:56,for_cont:245,forai:95,forbid:40,forbidden:130,forc:[0,6,8,10,31,33,57,59,62,72,80,81,90,99,102,109,115,120,122,124,126,136,137,145,152,156,158,178,186,188,202,204,205,240,245,249,256,276,277,283,288,306,327,328,332],force_init:245,force_repeat:[101,115,257],force_restart:257,force_str:338,forcibl:[101,256],fore:303,forebod:186,foreground:[41,99,113,125,182,265,334],foreign:124,foreignkei:[147,244,254,313,316,333],forens:209,forest:[13,110,111,139,186,199],forest_meadow:111,forest_room:111,forestobj:139,forev:[60,101],forget:[3,9,10,13,25,27,33,40,53,61,71,84,85,94,95,99,122,130,205,320],forgo:230,forgotten:[28,48,76,84],fork:[9,78],forloop:68,form:[11,13,27,31,33,34,42,44,50,54,57,58,60,63,67,69,73,75,76,79,82,87,88,92,95,96,108,111,112,113,114,115,117,122,123,124,126,128,134,140,143,144,145,150,152,153,156,158,166,167,169,172,174,175,176,178,187,188,204,205,209,235,237,239,240,242,245,249,250,252,255,257,259,263,283,285,289,293,304,306,313,314,315,316,319,320,322,323,324,325,328,334,335,338,339,342,343,344,354,360],form_char:325,form_class:360,form_template_to_dict:187,form_valid:360,formal:[60,79,95,137,245,289],format:[0,14,17,19,22,23,27,31,33,37,40,41,45,47,54,57,61,67,68,75,78,80,82,87,95,97,102,107,108,110,112,113,118,123,128,130,132,137,151,153,155,158,165,167,169,173,174,179,181,182,183,187,197,205,208,214,218,232,233,237,245,247,249,250,255,265,270,280,285,305,307,314,316,319,320,322,324,326,327,328,329,334,335,337,342,343,361],format_attribut:158,format_available_protfunc:249,format_callback:191,format_diff:250,format_extern:174,format_grid:342,format_help:232,format_help_entri:165,format_help_list:165,format_messag:174,format_output:158,format_pag:327,format_send:174,format_t:342,format_text:179,format_usag:232,formatt:[187,249,326,327],formatted_list:174,formcallback:187,formchar:[57,325],formdata:187,former:[17,23,63,125,326],formfield:338,formhelptext:187,formset:313,formstr:57,formtempl:187,formul:133,forth:[27,42,130,158,219],fortress:110,fortun:[4,33,38,47,68,121,127],forum:[1,9,37,47,54,56,62,89,97,127],forward:[13,14,20,41,44,49,50,61,68,89,120,125,143,147,176,198,208,237,244,254,310,314,316,317,325,327,333],forwardfor:66,forwardmanytoonedescriptor:[244,254,333],forwardonetoonedescriptor:[244,254,333],foul:108,found:[2,4,6,9,10,13,14,15,20,22,23,25,27,31,33,38,39,40,41,42,48,50,52,54,56,57,58,62,67,72,73,75,77,79,82,84,88,89,90,93,96,102,103,108,111,115,118,121,122,124,126,127,133,134,136,137,140,143,148,149,150,151,153,158,166,167,174,178,179,191,193,194,196,199,205,231,237,240,245,248,249,250,256,259,264,265,271,280,283,294,304,306,314,315,316,319,320,321,322,326,328,332,334,337,339,342,344],foundat:[48,54,76,78,216],four:[4,14,27,38,39,67,72,81,85,86,110,113,118,152,176,186,240],fourth:38,fqdn:89,fractal:55,fraction:126,frame:[136,137],framework:[3,16,63,93,123,132,135,136,169,216,219,338],frankli:128,free:[0,22,29,37,47,54,56,59,60,63,75,76,78,89,105,111,115,122,123,125,129,132,138,178,205,214,217,249],freedn:89,freedom:[14,26,43,62],freeform:[72,115,181],freeli:[54,76,99,102,320],freenod:[9,42,62,69,71,78,89,145,163,306],freepik:78,freetext:[175,339],freez:[29,33,41,193],frequenc:204,frequent:[90,179],fresh:[11,31,57,127,265],freshli:110,fri:12,friarzen:137,friend:[37,57,60,81,102],friendli:[22,77,94,132,137,147],friendlier:[174,245],frighten:218,from:[0,2,3,5,6,8,9,10,11,12,13,14,15,16,17,19,21,22,23,26,27,28,29,30,31,33,34,35,36,38,39,40,41,42,43,45,46,47,48,49,51,53,55,56,57,58,60,61,62,63,65,67,68,69,70,71,72,73,74,75,78,79,80,81,82,83,84,85,86,88,90,91,92,94,96,97,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,133,134,135,138,139,140,143,145,147,148,149,150,151,152,153,155,156,157,158,163,164,165,166,167,168,169,170,172,173,174,175,176,178,179,180,181,182,183,184,185,186,187,188,193,194,196,197,198,199,201,202,203,204,205,208,209,210,211,212,214,216,217,218,219,220,223,225,226,229,230,231,232,233,236,237,239,240,241,244,245,249,250,254,255,256,257,258,259,262,265,270,271,272,274,275,276,277,278,282,283,284,285,288,293,294,297,299,303,304,305,306,310,311,312,313,314,315,316,317,319,320,321,322,323,324,325,326,327,328,329,332,333,334,335,336,338,339,341,342,343,355,360,361,362],from_channel:145,from_db_valu:338,from_obj:[80,82,117,143,145,153,188,245],from_pickl:323,from_tz:343,frombox:274,fromstr:274,fromtimestamp:329,front:[8,13,20,52,72,79,84,95,102,108,130,136,138],frontend:[214,314],frozen:[29,33,121,194],fruit:202,ftabl:342,ftp:341,fuel:[21,219],fugiat:51,fulfil:265,full:[4,9,13,14,15,16,17,20,21,23,24,25,26,27,33,37,42,50,52,54,56,57,58,59,60,63,72,74,79,83,87,88,89,94,95,96,99,100,101,104,107,108,109,110,114,115,116,118,120,122,123,124,126,127,130,132,133,134,135,145,150,152,153,157,158,163,167,168,169,178,179,184,186,189,201,204,205,214,219,232,240,250,255,277,283,296,306,307,314,316,320,324,326,328,342],full_justifi:[108,248],full_nam:86,full_result:184,fuller:57,fulli:[4,11,19,33,50,54,57,58,60,62,84,85,89,92,102,109,121,143,204,240,245,257,293,305,322,342],fun:[20,26,60,78,80,110,135],func1:[42,158,240,297],func2:[42,158,240,297],func:[5,10,21,22,25,28,29,30,33,41,43,49,50,55,57,59,61,70,72,79,80,81,82,84,90,115,118,120,122,149,153,155,156,157,158,163,164,165,166,167,168,169,170,173,178,179,180,181,183,184,185,186,187,188,192,198,199,200,201,202,205,211,212,213,214,216,217,218,219,220,223,229,230,231,232,239,240,245,276,297,301,310,324,326,327,329,342,360],func_arg:274,func_kwarg:274,funciton:219,funcnam:[73,113,240,248,259,334],functioncal:274,functionnam:[274,334],functool:62,fund:69,fundament:[33,56,76,88,94,95,111,245],furnitur:[13,111,124],further:[0,9,11,27,31,34,41,42,43,48,56,82,84,85,89,90,95,99,103,104,105,108,109,110,118,123,124,129,130,137,152,158,180,204,218,220,250,265,289,342],furthermor:[37,123,125],fuss:99,futur:[9,10,11,20,23,42,44,49,54,57,59,60,61,62,75,86,94,99,122,138,155,194,230,233,270,315,336,343,362],futurist:61,fuzzi:[75,236,339,342],fuzzy_import_from_modul:342,gag:24,gain:[11,29,60,92,153,176,205,240,245],galosch:204,gambl:184,game:[0,2,3,4,5,6,8,9,10,11,13,14,15,17,18,19,20,21,22,23,24,25,28,29,30,31,33,34,35,36,37,40,41,42,43,45,49,50,51,52,55,59,62,63,64,65,67,68,70,71,74,75,76,77,78,79,80,82,84,85,86,87,88,90,91,92,94,95,96,97,100,101,102,103,104,105,106,107,108,109,111,112,113,114,115,116,117,118,120,121,124,128,129,131,132,133,134,135,136,137,138,139,142,143,144,145,147,149,151,152,153,155,156,157,158,162,164,165,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,186,187,189,192,193,194,195,196,198,199,203,204,205,212,214,216,217,218,219,220,228,231,232,237,239,241,244,245,254,256,257,260,265,267,268,269,270,276,277,282,284,285,288,289,296,297,298,303,304,306,313,315,316,317,320,321,322,324,325,329,332,334,335,342,361,362],game_dir:[335,342],game_epoch:[27,329],game_index_cli:[140,141,260],game_index_en:53,game_index_list:53,game_map:199,game_nam:[53,348],game_slogan:[9,348],game_statu:53,game_templ:46,game_websit:53,gamedir:[50,108,265,311],gamedirnam:57,gameindexcli:268,gamemap:199,gameplai:[89,144],gamer:[64,71],gamesrc:27,gametim:[27,58,138,140,141,183,186,194,318,362],gametime_to_realtim:183,gametimescript:183,gammon:[78,280],gandalf:50,garbag:314,garden:78,garment:181,gatewai:[109,294],gather:[24,33,47,82,93,118,126,131,135,149,150,231,263,267,322,339],gave:[5,21,59,63,90,101,125],gbg:319,gcc:62,gear:[42,89,105,135,145,152,170,185],gemer:203,gen:17,gender:188,gendercharact:188,gendersub:[140,141,177],gener:[0,1,5,9,10,11,12,20,23,25,29,31,33,34,36,37,47,48,50,52,54,56,57,58,59,61,62,63,67,69,72,75,79,82,85,86,87,89,92,95,103,104,105,108,110,111,113,115,125,126,133,136,137,138,140,143,145,148,153,154,155,158,165,166,167,169,170,173,174,178,179,180,181,184,185,186,187,188,194,198,199,200,201,203,204,205,208,209,211,212,213,214,216,217,218,219,220,223,229,231,232,237,240,245,247,250,276,283,285,288,289,293,304,305,306,310,314,317,319,321,322,324,326,327,328,335,337,338,342,347,355,360,361,362],general_context:[140,344,346],generate_sessid:283,generic_mud_communication_protocol:289,genericbuildingcmd:179,genericbuildingmenu:179,genesi:89,geniu:202,genr:[37,63,279],geoff:232,geograph:139,geographi:38,geoip:208,geometr:110,geometri:110,get:[0,1,2,3,5,6,7,8,9,10,11,12,13,15,17,21,22,23,25,26,28,29,30,31,33,38,39,40,41,43,44,45,46,47,48,49,52,53,54,55,56,57,58,59,60,61,63,64,67,68,70,71,72,73,74,75,76,79,80,81,82,83,84,85,86,87,89,90,91,92,94,95,96,99,101,102,103,104,105,106,109,110,111,113,115,117,120,121,122,124,125,126,127,129,130,132,133,134,135,136,137,138,143,145,147,151,152,153,155,156,158,159,163,164,170,172,173,175,176,179,181,184,191,193,194,196,197,198,202,203,205,212,213,214,216,217,218,219,220,222,223,230,231,233,236,237,239,240,244,245,247,249,250,254,256,257,259,263,265,270,274,275,279,283,285,288,289,291,293,294,302,304,305,306,308,314,315,316,317,319,320,321,324,326,328,329,331,332,334,335,336,337,339,342,355,360,361,362],get_abl:59,get_absolute_url:[133,174,237,316],get_account:[240,304],get_al:314,get_alia:315,get_all_attribut:314,get_all_cached_inst:332,get_all_categori:236,get_all_channel:175,get_all_cmd_keys_and_alias:151,get_all_mail:198,get_all_puppet:143,get_all_sync_data:306,get_all_top:236,get_all_typeclass:342,get_attack:[216,217,218,219,220],get_attr:158,get_attribut:315,get_buff:324,get_by_alia:315,get_by_attribut:315,get_by_nick:315,get_by_permiss:315,get_by_tag:315,get_cach:314,get_cached_inst:332,get_callback:194,get_channel:[40,175],get_charact:304,get_client_opt:270,get_client_s:304,get_client_sess:[293,294],get_client_sessid:294,get_cmdset:173,get_command_info:[153,166],get_context_data:360,get_damag:[216,217,218,219,220],get_db_prep_lookup:338,get_db_prep_valu:338,get_dbref_rang:315,get_default:338,get_defens:[216,217,218,219,220],get_display_nam:[22,41,45,57,81,205,233,245,316],get_err_msg:[6,20,79],get_ev:194,get_evennia_pid:342,get_evennia_vers:342,get_event_handl:197,get_extra_info:[40,153,173,245,316],get_famili:[118,124],get_fieldset:242,get_form:242,get_formset:313,get_game_dir_path:342,get_god_account:269,get_height:328,get_help:[33,67,68,153,169,192,232],get_help_text:309,get_id:[132,315],get_info_dict:[282,303],get_initi:360,get_input:326,get_inputfunc:[270,289,306],get_internal_typ:338,get_kwarg:358,get_location_nam:233,get_mass:81,get_message_by_id:175,get_messages_by_channel:175,get_messages_by_receiv:175,get_messages_by_send:175,get_min_height:328,get_min_width:328,get_new:284,get_new_coordin:233,get_next_by_date_join:147,get_next_by_db_date_cr:[147,176,244,254,314,316],get_next_wait:197,get_nick:315,get_nicklist:[145,277],get_numbered_nam:245,get_obj_coordin:233,get_object:360,get_object_with_account:339,get_objs_at_coordin:233,get_oth:178,get_permiss:315,get_pid:265,get_player_count:279,get_previous_by_date_join:147,get_previous_by_db_date_cr:[147,176,244,254,314,316],get_puppet:[2,143,304],get_puppet_or_account:304,get_queryset:360,get_rang:220,get_redirect_url:360,get_regex_tupl:205,get_respons:349,get_room_at:38,get_rooms_around:38,get_sess:306,get_statu:275,get_subscript:175,get_success_url:360,get_sync_data:305,get_system_cmd:151,get_tag:315,get_time_and_season:186,get_typeclass_tot:315,get_uptim:279,get_username_valid:143,get_valu:[270,289],get_vari:[191,194],get_width:328,get_worn_cloth:181,getattr:83,getchild:310,getclientaddress:[39,285],getel:136,getenv:[265,275],getfromlock:239,getgl:136,getinput:326,getkeypair:285,getloadavg:74,getpeer:285,getpid:342,getsizof:332,getsslcontext:[286,290],getston:33,getter:[147,176,181,196,205,217,220,244,245,272,314],gettext:75,gfg:319,ghostli:231,giant:[21,123],gid:[99,297],gidcount:296,gift:68,gist:[204,342],git:[9,23,25,36,44,46,62,74,75,78,85,89,99,107,123,127,129],github:[9,25,37,40,44,56,62,69,74,75,78,95,97,129,130,137,179,293,310,342],gitignor:130,give:[0,1,2,3,4,5,9,10,11,12,13,15,18,19,20,21,22,23,25,26,27,30,33,38,40,45,47,50,51,52,54,56,57,58,59,60,61,62,63,66,67,68,72,74,76,78,79,81,84,87,88,89,90,92,93,95,97,99,101,102,104,106,108,109,110,111,112,114,115,116,117,118,121,122,123,124,126,127,132,133,135,137,138,139,149,151,152,155,164,166,167,168,173,175,179,180,181,186,203,204,213,214,216,217,218,219,220,223,231,233,239,245,254,291,304,310,316,319,328,339,340,342,361,362],givelock:239,given:[0,2,4,10,11,12,13,14,20,21,22,25,27,31,33,34,38,41,42,45,48,49,50,57,61,63,66,69,72,73,79,82,83,84,85,87,88,89,92,96,99,101,104,108,109,112,113,114,115,116,118,121,122,124,125,126,130,132,133,134,137,139,143,149,150,151,152,153,155,156,158,163,165,167,168,174,175,176,179,180,181,183,184,185,186,187,188,189,191,193,197,202,203,204,205,211,214,216,217,218,219,220,230,231,232,239,240,245,247,248,249,250,255,256,257,259,263,265,270,271,274,283,288,289,294,297,300,304,305,306,307,309,310,314,315,316,317,319,320,322,323,324,325,326,327,328,329,332,334,335,337,338,339,340,342,347,360],given_class:357,giver:[217,220,245],glad:90,glanc:[22,27,31,33,38,47,52,57,60,90,95,179,205],glance_exit:22,glass:[202,223,225,226],glob:[42,164],global:[13,22,33,34,35,42,44,50,55,60,63,66,73,84,88,99,103,104,107,108,113,114,119,124,130,131,136,137,139,158,186,194,203,205,211,239,245,248,250,251,254,262,265,270,272,275,296,297,320,321,322,326,329,334,339,340,342,348],global_script:[101,140,321],global_search:[13,22,27,57,90,143,205,245,315],globalscript:[42,168],globalscriptcontain:321,globalth:340,globe:[89,135],gloss:60,glossari:[62,138,362],glow:110,glu:91,glyph:274,gmcp:[54,73,82,289],gmsheet:57,gmud:24,gno:22,gnome:24,gnu:14,go_back:214,go_up_one_categori:214,goal:[60,75,78,90,101,102,121,123,204],goals_of_input_valid:355,goblin:[42,50,108,158,250],goblin_arch:250,goblin_archwizard:250,goblin_wizard:250,goblinwieldingclub:108,god:[20,79,269],godlik:205,goe:[0,5,9,22,26,29,33,37,39,41,48,63,68,72,74,85,89,94,95,117,120,121,122,138,151,152,220,233,245,285,288,303,304,341,342,360],goff:203,going:[0,3,20,25,26,39,44,45,48,50,57,60,61,64,68,69,81,87,89,90,94,95,99,110,115,120,126,132,136,137,138,179,196,205,216,217,218,219,220,233,245,262,267,319,326],goings:267,gold:[50,81,84,108,320],gold_valu:84,golden:137,goldenlayout:137,goldenlayout_config:[136,137],goldenlayout_default_config:[136,137],gone:[5,12,76,79,84,99,101,130,257],good:[0,2,4,5,9,11,12,14,20,21,22,25,26,27,31,33,37,38,39,40,45,47,48,50,52,53,54,55,56,59,60,62,68,69,71,72,78,79,84,86,89,90,92,93,94,95,96,99,101,102,103,105,108,109,110,113,118,120,122,124,125,126,130,132,133,137,143,151,152,153,169,178,193,205,288,326],goodby:285,goodgui:240,googl:[42,74,78,89,163,328],googli:135,gossip:[64,78],got:[10,13,94,95,115,127,137,214,230],goto_kwarg:326,goto_next_room:120,gotten:[54,94,130,220,230,245,292],graaah:116,grab:[20,33,42,72,132,164,174,230,360],gracefulli:[26,42,155,168,205,245,265,342],gradual:[13,14,29,60,78,95,204],grai:[113,125],grain:[114,322],gram:81,grammar:204,grammat:204,grand:11,grant:[19,23,79,130,176,216,217,218,219,220,239,240,249,314],granular:220,grapevin:[7,138,140,145,260,273,362],grapevine2chan:64,grapevine_channel:[64,145],grapevine_client_id:64,grapevine_client_secret:64,grapevine_en:64,grapevinebot:145,grapevinecli:276,graph:[48,130],graphic:[41,57,79,82,83,92,110,127,134,140,185,189,289],grasp:[125,132],grave:59,grayscal:182,great:[0,4,14,16,21,22,29,37,38,50,56,60,68,69,72,76,78,90,94,106,107,122,130,133,179,187,310],greater:[22,31,79,96,104,118,239,326],greatli:77,greek:15,green:[31,42,79,108,113,125,130,158,168,230],greenskin:250,greet:[9,35,45,94,103,104,116,270],greetjack:86,greg:78,grei:[108,125],grenad:88,grep:[74,130],greyscal:113,greyskinnedgoblin:108,griatch:[21,85,118,178,180,182,183,184,185,186,188,198,200,201,204,205,211,212,213,230,325,332,338,341],grid:[7,16,110,122,138,220,233,342,362],gridstr:342,grief:12,griefer:133,grin:[33,40],gritti:33,ground:[20,21,54,110],group:[4,9,10,12,19,21,26,33,37,40,42,45,54,67,69,78,90,99,101,108,111,124,126,138,139,144,147,154,158,164,175,186,202,230,231,245,249,250,274,313,314,317,319,322],grow:[13,25,26,60,62,78,109,276,277,328,342],grown:[9,25,50,128],grudg:72,grumbl:59,grungies1138:[198,213],grunt:[42,158,250],gthi:80,guarante:[11,37,60,79,85,89,101,184,194,249,283,304,316],guard:50,guess:[15,22,45,49,68,90,102,112,137,179,250],guest1:65,guest9:65,guest:[7,79,138,143,362],guest_en:[65,79],guest_hom:[65,132],guest_list:65,guest_start_loc:65,guestaccount:111,gui:[44,56,82,136,198,362],guid:[36,37,44,80,94,95,127,132,135],guidelin:[37,78],guild:[78,85,111,117],guild_memb:50,gun:[21,76],guru:54,habit:55,habitu:114,hack:[54,72,115,274],hacker:[78,102],had:[8,9,14,15,19,20,21,29,31,37,54,60,89,94,95,99,101,118,122,127,134,137,157,181,230,249,250,254,257,265,316,320,327,355],hadn:[60,61,130],half:[107,137,237],hall:48,hallwai:48,halt:[101,110],hand:[1,15,37,39,42,50,54,55,56,57,60,69,72,86,88,95,104,107,118,133,153,164,166,167,168,178,200],handi:[41,74,118,132,218],handl:[0,2,4,5,7,8,9,11,13,15,22,24,27,33,34,37,39,40,42,43,46,48,49,50,54,55,59,60,61,63,67,73,74,79,82,84,85,86,87,88,90,92,94,96,99,103,104,107,114,115,116,123,124,125,127,128,130,131,136,137,138,143,145,148,149,151,152,158,159,163,164,167,173,178,185,186,194,196,197,200,205,209,211,213,214,216,217,218,219,220,225,230,231,232,234,244,245,248,249,250,254,255,262,265,269,270,274,275,277,278,285,288,289,292,294,296,305,306,313,314,316,319,320,322,323,324,326,328,329,332,341,342,349],handle_egd_respons:267,handle_eof:285,handle_error:194,handle_ff:285,handle_int:285,handle_quit:285,handle_setup:269,handler:[2,11,31,33,40,46,63,72,79,82,83,85,86,88,101,103,104,111,114,124,138,143,149,152,167,171,173,176,178,191,194,195,197,205,229,233,239,240,244,245,250,255,256,258,259,270,282,283,303,306,312,313,314,316,317,321,322,325,326,336,337,342],handlertyp:317,handshak:[24,51,82,275,281,283,288],handshake_don:288,hang:[3,60,69,123],hangout:118,happen:[0,6,12,19,20,26,27,31,33,37,38,40,41,43,50,53,54,56,57,59,60,61,63,71,72,76,79,82,85,87,89,90,94,95,96,101,104,106,107,109,110,113,114,115,118,121,122,125,126,127,130,132,137,143,151,152,174,183,196,212,216,217,218,219,220,226,229,231,233,245,248,250,267,274,277,297,302,304,305,306,316,326,327,332,334,335,342,361],happend:250,happi:[13,118],happier:90,happili:95,haproxi:[89,138,362],hard:[9,10,11,13,15,19,26,27,31,33,39,40,57,60,62,63,75,78,87,89,92,95,96,99,101,108,111,114,118,120,126,130,132,137,138,167,187,214,254,265,314,316,326,362],hardcod:[56,57,76,99,110,139,314],harden:62,harder:[12,55,60,92,118,126,230],hardwar:[89,278],hare:78,harm:[11,29,218],harri:58,harvest:360,has:[0,2,4,8,9,10,11,12,13,14,15,16,19,20,21,22,23,25,27,28,29,31,33,34,36,37,38,39,40,41,42,43,45,46,48,49,50,53,55,56,57,58,59,60,61,62,63,64,67,68,69,70,73,74,75,76,77,78,79,82,84,85,86,87,88,89,90,92,93,94,95,96,99,100,101,102,103,104,106,108,109,111,112,113,114,115,116,117,118,120,121,122,124,125,126,127,128,130,131,132,133,134,135,136,137,138,142,143,144,145,150,151,152,153,155,157,158,166,167,168,169,170,173,174,175,178,179,183,184,185,186,187,194,196,198,199,202,203,205,214,216,217,218,219,220,222,229,230,231,232,233,237,239,240,244,245,249,250,254,257,259,265,267,269,270,274,277,279,283,287,292,293,297,303,304,305,306,308,313,314,315,316,322,324,325,326,328,332,334,335,336,339,342,355,358,360],has_account:[88,229,239,244,245],has_attribut:314,has_cmdset:152,has_connect:[40,174],has_drawn:48,has_nick:314,has_par:342,has_perm:[166,240],has_sub:174,has_thorn:11,hasattr:[28,33],hash:[14,89,108,250,259,293,297,306,315],hasn:[22,48,203,230,313,314,360],hassl:61,hast:218,hat:[37,69,181],hau:[64,145,276],have:[0,1,2,3,4,5,6,9,10,11,12,13,14,15,16,19,20,21,22,23,25,26,27,28,29,30,31,33,34,35,36,37,38,39,40,41,42,43,45,46,47,48,49,50,52,53,54,55,56,57,58,59,60,61,62,63,64,65,67,68,69,70,71,72,73,74,75,76,77,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,99,101,102,103,104,105,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,143,145,149,151,152,153,155,158,160,163,166,167,168,169,170,174,175,176,178,179,180,181,183,185,186,187,188,193,194,196,197,201,203,204,205,208,209,214,216,217,218,219,220,223,226,231,232,236,237,239,244,245,248,249,250,251,254,256,257,258,259,270,275,278,279,283,285,288,289,303,304,305,306,308,311,312,313,314,315,316,317,319,320,321,322,323,325,326,327,328,334,335,338,339,340,342,343,355,360,361],haven:[4,22,29,41,61,76,108,110,116,117,119,126,127,132,133,137,308],hdict_cmd:165,hdict_db:165,head:[20,21,31,45,68,75,76,95,105,118,120,122,137,138],headach:[60,137],header1:327,header2:327,header:[9,13,14,27,34,37,62,81,88,94,102,128,137,153,174,176,198,205,245,289,320,322,328],header_color:158,header_line_char:328,headi:328,heading1:328,heading2:328,headless:[95,245],headlong:62,heal:[218,219,231],healing_rang:219,health:[30,60,72,83,87,89,108,115,189,250,289],health_bar:[140,141,177],hear:[29,45,60],heard:[110,121,239],heart:125,heartbeat:[114,276],heavi:[6,11,20,23,27,33,63,72,79,81,95,115,122,178,205,217,278,342],heavier:217,heavili:[9,27,37,39,56,74,85,103,179,216,217,218,219,220,316],heed:[104,240],heh:137,hei:[20,178,198],height:[51,73,136,140,270,285,304,325,328],held:[1,31,47,115,239],hello:[0,29,34,40,42,45,50,71,73,82,86,87,90,95,104,107,122,128,136,164,173,205,270,319],hello_funct:94,hello_valu:107,hello_world:[94,95,107],helmet:[29,76],help:[0,1,4,5,12,13,14,15,19,22,23,27,29,32,33,35,38,40,41,43,44,45,46,47,48,49,50,56,57,59,60,62,63,70,71,75,76,79,85,89,90,92,95,104,106,107,108,109,110,111,112,115,118,121,122,123,125,126,130,132,136,137,138,140,141,148,149,151,153,154,155,166,167,169,170,176,178,183,185,187,191,192,194,198,204,208,216,217,218,219,220,223,231,232,239,247,258,263,265,267,268,276,283,285,286,288,290,293,294,296,297,314,315,319,322,323,324,326,334,337,338,339,340,349,355,360,361,362],help_categori:[22,33,40,42,57,59,67,68,70,84,115,122,153,155,156,157,158,163,164,165,166,167,168,169,170,173,178,179,180,181,184,185,186,187,188,192,198,199,200,201,202,205,211,212,213,214,216,217,218,219,220,223,229,230,231,232,236,237,245,324,326,327,339],help_cateogori:324,help_detail:360,help_entri:324,help_kei:158,help_list:360,help_mor:165,help_system:68,help_text:[165,194,355],helpact:232,helpdetailview:360,helpentri:[68,79,235,236,237,322,360],helpentry_db_tag:235,helpentry_set:317,helpentryadmin:235,helpentryform:235,helpentrymanag:[236,237],helper:[19,40,42,50,57,79,108,118,140,143,152,155,158,165,172,175,179,183,204,245,249,250,262,274,275,294,306,320,326,335,340,341,342],helpfil:165,helplistview:360,helpmixin:360,helptaginlin:235,helptext:[50,247,326],helptext_formatt:[50,247,326],henc:[0,22,45,52,75,94,105,231,232,239,320],henceforth:[13,43,59,65,79,89,94,96,101,104,110,122,130,131,139,306],henddher:202,her:[121,126,181,188],herbal:325,herd:23,here:[0,2,3,4,5,9,10,11,13,14,15,16,17,19,20,21,22,23,24,25,27,29,30,33,36,37,38,39,40,41,42,43,45,46,47,48,50,55,56,57,58,60,61,62,63,64,68,69,70,71,72,73,74,75,76,78,79,80,82,83,84,85,86,87,88,90,91,94,97,99,100,101,102,103,104,105,106,107,108,109,110,112,113,114,115,116,117,118,119,120,122,124,125,126,127,128,129,130,132,133,134,135,136,143,145,151,152,153,158,166,167,168,170,174,178,179,180,181,183,184,185,193,194,203,204,205,212,216,217,218,219,222,223,226,229,230,231,232,233,237,240,245,249,250,257,265,267,270,274,276,282,283,285,288,303,304,306,312,313,314,316,319,322,326,328,332,334,342,344,360],hesit:[22,38],hfill_char:328,hidden:[11,48,60,63,95,121,130,136,176,181,184,232],hide:[9,11,20,31,33,34,40,60,72,79,95,110,137,165,176,184,205,223,230],hide_from:[34,176],hide_from_accounts_set:147,hide_from_channels_set:176,hide_from_objects_set:244,hieararci:239,hierarch:[2,19,42,79,155],hierarchi:[4,19,22,42,60,65,68,79,118,138,164,181,239],high:[4,8,20,31,54,62,79,121,151,219,245,307],higher:[7,19,25,31,40,42,43,50,55,57,61,62,72,79,89,104,107,118,122,127,143,151,155,168,204,216,217,218,219,220,231,239,267,326,342],highest:[31,57,319,342],highest_protocol:338,highli:[9,17,50,54,55,63,79,85,106,114,116,189,320,332],highlight:[14,56,57,113,125],hijack:133,hilight:341,hilit:341,hill:86,him:[40,45,50,188,205],hint:[1,25,54,62,78,92,94,108,109,122,123,127,135,138,183,311],hire:[84,102],his:[45,50,57,76,95,108,126,181,188,205,341],histogram:342,histor:[61,128,264,335],histori:[4,23,34,40,49,57,63,94,99,130,136,137,138,152,173,187,335],hit:[6,9,21,29,51,60,72,115,118,121,130,145,216,217,218,219,220,229,230,263,304,335,338],hit_msg:229,hite:113,hmm:137,hnow:113,hobbi:[60,89],hobbit:61,hoc:54,hold:[2,6,9,13,14,16,21,26,31,34,36,40,46,48,50,57,60,62,63,65,72,76,79,84,88,95,96,99,101,103,104,105,108,110,111,113,115,118,122,124,130,132,135,139,151,152,177,179,181,184,203,213,214,216,217,218,219,220,228,229,230,234,239,240,249,250,251,255,260,272,274,283,293,294,296,306,316,317,318,322,325,326,328,330,335,342,344],holder:[9,68,89,314],home:[8,16,26,62,63,65,78,88,89,102,108,130,132,138,152,158,164,229,239,244,245,250,322,342],home_loc:[42,158],homepag:[27,62,78,89,92],homes_set:244,homogen:[27,163,249,250,254],homogenize_prototyp:249,honor:205,hood:[20,33,50,56,59,60,63,85,86,118,121,124,127,205,232],hook:[2,25,30,33,42,48,54,59,60,72,73,75,79,80,88,95,101,106,109,114,115,116,117,119,120,122,126,131,143,149,151,153,155,158,164,166,168,169,172,174,181,186,194,196,202,203,205,209,216,217,218,219,220,227,229,230,231,233,242,245,252,254,257,259,269,276,288,291,293,301,303,304,305,307,316,324,327,332,333,336,340,342,355,360],hooligan:12,hop:54,hope:[41,57,90],hopefulli:[8,26,40,48,89,110,132,136],horizon:61,horizont:[136,137,230,328,342],hors:27,host1plu:89,host:[7,12,23,26,27,60,63,88,97,99,101,102,130,134,204,310,342],host_os_i:342,hotbutton:136,hotel:89,hotspot:102,hour:[27,61,131,183,329,342],hous:[42,89,108,158],housecat:27,hover:137,how:[0,1,3,4,5,6,7,8,10,11,12,13,14,15,17,19,20,21,22,25,26,27,28,29,30,31,35,37,38,39,40,41,42,43,44,45,47,48,50,54,55,56,59,60,61,62,63,65,67,68,71,72,74,76,79,80,81,82,83,84,85,86,87,89,90,92,93,94,95,96,101,102,103,104,105,107,108,109,110,111,115,116,117,118,119,122,123,125,126,127,129,130,131,132,133,134,135,136,137,138,139,144,145,150,152,153,167,168,169,172,173,174,179,181,183,184,188,199,203,204,205,212,214,218,219,220,225,229,233,235,239,244,245,250,254,259,265,270,275,279,284,289,292,296,303,304,305,306,310,313,316,320,324,326,328,335,336,341,342,355,361,362],howev:[0,2,4,5,10,11,12,13,14,15,17,20,22,23,29,30,31,33,37,39,40,42,43,45,49,54,57,58,59,61,69,72,76,79,84,87,89,90,107,108,109,110,112,113,114,119,122,124,127,128,130,131,134,152,153,158,165,168,169,179,187,189,194,203,214,219,226,239,319,327],howto:93,hpad_char:328,href:[17,68,132],hrs:183,htm:280,html5:54,html:[24,42,54,63,68,78,93,95,102,113,133,134,135,136,137,144,168,174,203,232,237,287,289,293,294,310,316,338,341,360],htmlchar:341,htop:109,http404:[68,133],http:[3,4,9,22,23,36,42,53,54,62,64,68,74,89,93,97,102,106,107,127,129,130,132,133,134,136,137,140,145,163,179,203,232,267,274,276,277,278,279,280,281,287,289,292,293,294,310,319,328,341,342,355],http_request:[102,134],httpchannel:310,httpchannelwithxforwardedfor:310,httpd:8,httprequest:143,httprespons:[144,172,242],httpresponseredirect:132,hub:[78,99,138,322],hue:113,huge:[3,16,21,29,38,60,61,85,126,233],huh:[22,33],human:[4,12,39,56,60,63,72,84,92,95,116,132,360],humanizeconfig:4,hundr:[71,112,132],hungri:85,hunt:[72,229],hunting_pac:229,hunting_skil:72,hurdl:48,hurt:30,huzzah:9,hwejfpoiwjrpw09:9,hybrid:72,i18n:[46,75,245],iac:87,iattribut:314,iattributebackend:314,icon:[78,105,137],id_:[144,235,242,355],id_str:83,idcount:296,idea:[0,9,12,26,33,37,38,44,48,54,55,59,60,62,68,70,71,72,76,79,84,105,106,107,118,120,122,126,129,130,132,133,138,153,165,166,169,178,204,250,332,341,360,362],ideal:[1,6,33,37,45,47,89,128,137,147,240],idenfi:151,ident:[9,31,33,43,56,60,82,95,96,109,113,143,166,167,205,211,240,245,319,320],identif:[27,114,306],identifi:[0,8,23,28,30,31,33,38,40,41,42,48,49,50,57,60,68,73,82,83,87,92,96,101,108,114,115,118,124,133,137,150,153,158,163,166,167,169,173,175,179,186,204,205,214,231,240,245,249,256,259,262,265,270,272,275,289,293,302,304,306,314,315,319,325,326,334],identify_object:175,idl:[12,104,143,145,229,245,297,304,306],idle_command:33,idle_tim:[143,245],idle_timeout:145,idmap:332,idmapp:[42,85,124,140,141,168,176,237,272,298,314,315,316,318],idnum:175,ids:[12,57,120,186,296,306,325],idstr:[83,114,255,259,302],idtifi:175,idx:120,ietf:281,ifram:[136,137],ignor:[6,14,20,23,27,29,31,33,34,41,42,50,57,72,73,79,82,85,89,90,94,95,104,113,116,120,121,124,130,143,150,151,152,153,158,174,186,205,239,244,245,259,265,270,276,277,292,293,294,314,316,319,320,325,326,334,337,342,343],ignore_error:143,ignorecas:[158,164,165,170,173,181,200,319,324,341],ignoredext:310,illumin:110,illus:[10,95],imag:[4,17,62,68,89,100,105,132,134,135,136,137],imagesconfig:4,imagin:[14,29,31,45,47,50,60,76,115,116,121,131,137,320],imaginari:[21,60,78],imc2:34,imeplement:233,img:17,immedi:[0,5,15,27,29,33,42,47,48,50,63,69,73,82,89,94,99,101,108,115,119,132,133,149,156,168,229,276,320,322,326,327],immobil:25,immort:229,immut:[11,259],imo:1,impact:[93,125],impati:62,imper:101,implement:[1,6,11,21,25,26,28,29,31,33,34,37,39,40,48,50,54,55,56,57,59,60,77,78,79,80,85,87,88,95,96,107,110,111,113,114,115,116,117,118,119,122,123,124,126,127,130,134,136,137,138,139,144,147,151,152,155,156,157,158,159,160,163,164,165,166,167,168,175,176,178,180,181,183,184,186,188,196,201,204,205,209,211,212,213,214,216,217,220,223,229,230,231,233,236,237,239,240,244,245,254,256,259,271,276,278,279,280,281,282,283,285,287,288,289,292,293,294,296,303,310,314,315,316,317,319,320,323,324,326,327,333,334,337,338,341,342,360,362],impli:[22,111],implicit:[90,113,125],implicit_keep:250,impmement:240,import_cmdset:152,importantli:[50,132,240],importerror:[4,9,52,342],impos:[54,78,308],imposs:[15,19,48,50,89,110,112,120,132,137,328],impract:[33,108,250],imprecis:332,impress:[41,110],improv:[0,11,37,60,69,75,90,127],in_game_error:[26,102],in_templ:[314,334],inabl:102,inaccess:[0,79],inact:[101,229],inactiv:[42,168],inadvert:220,inadyn:89,inarticul:107,inbuilt:[111,122],incant:74,incarn:355,incid:209,includ:[2,4,6,9,12,13,16,20,21,22,27,30,31,33,36,37,38,40,42,43,47,50,54,57,59,60,61,62,63,68,72,73,74,77,78,79,83,84,87,88,90,92,94,95,99,100,101,103,104,105,106,107,108,110,111,113,114,115,118,120,124,126,130,132,133,134,135,136,137,143,149,150,151,153,156,157,158,166,167,169,173,178,181,186,187,188,194,196,199,204,205,209,214,216,217,218,219,220,223,226,231,232,233,239,245,265,283,285,288,289,302,305,314,315,316,317,320,321,322,323,325,326,328,329,335,342],include_account:314,include_children:315,include_par:315,include_prefix:150,include_unloggedin:[283,306],inclus:[315,334],incoher:125,incol:[57,325,328],incom:[33,39,87,89,95,103,138,144,145,150,167,172,209,217,242,252,274,278,281,284,288,289,293,294,296,304,305,306,310,326,334],incomplet:[153,212,328],inconsist:[10,96,203],incorpor:[42,155,328],incorrect:175,increas:[61,72,79,102,113,118,124,178,217,219,220,231,277,283,297,324],increase_ind:324,incred:[214,267],increment:[62,314],incur:27,indata:[39,314],inde:[9,54,89,90],indefinit:[101,218,230,322],indent:[0,9,13,14,27,49,56,59,94,128,136,294,320,324,326,342],independ:[0,55,63,101,125,178,200,208],indetermin:267,index:[7,42,48,55,60,67,78,84,85,89,107,120,134,135,150,164,178,214,230,237,263,267,268,310,317,319,327,328,342,355,358,360,361,362],index_to_select:214,indexerror:[133,233,315],indextest:358,indic:[0,8,22,42,48,61,84,90,94,110,118,145,158,165,166,167,188,209,214,254,276,277,285,292,293,306,308,310,320,326,327,342],individu:[0,11,13,14,18,21,22,33,34,40,42,45,47,48,54,56,57,58,70,72,77,84,87,89,95,108,110,131,152,156,173,184,191,194,219,226,239,247,248,250,304,317,319,328,334,336,337],ineffici:[114,116,319],infact:33,infinit:[0,60,62,145,233,249],inflict:[101,218],inflict_condit:218,influenc:[10,16,22,45,50,101,122,178,342],influenti:78,info1:213,info2:213,info3:213,info:[3,5,11,13,16,17,20,23,25,26,27,33,35,37,42,51,54,57,58,62,63,67,77,85,87,88,94,99,100,101,103,104,105,111,123,124,130,137,138,143,145,147,155,156,158,168,170,174,177,178,180,185,186,189,198,231,237,245,265,270,274,282,283,303,304,306,315,316,317,322,325,335,342],infomsg:335,inforamt:[205,233,245,316],inform:[0,2,3,6,8,9,18,20,22,23,25,27,28,33,34,36,40,42,45,47,50,54,59,64,65,67,68,72,82,83,84,85,90,93,94,95,99,101,102,103,104,108,111,113,115,116,118,119,122,123,126,130,131,132,133,134,135,136,137,138,143,145,153,156,158,164,168,173,176,179,184,196,203,205,209,210,218,219,220,237,245,257,265,270,279,280,281,283,292,305,306,315,316,319,322,324,335,342,355],infrastructur:[63,82,89,102,149,275],infrequ:45,ing:[9,14,57,184],ingame_python:[140,141,177],ingame_tim:61,ingo:[31,50,57,73,113,151,277,334],inher:[4,10,86,107],inherit:[2,5,6,22,27,30,31,33,36,39,41,42,56,59,63,68,80,85,88,95,101,108,113,116,118,122,124,126,147,151,153,158,166,168,169,174,176,178,179,181,186,188,196,202,205,212,216,217,218,219,220,229,231,232,241,244,245,250,254,256,305,312,315,316,324,327,328,332,340,342,360],inheritng:250,inherits_from:[42,116,133,168,342],inifinit:249,init:[6,9,22,39,46,48,57,59,62,74,94,103,105,130,136,137,178,179,187,223,244,256,265,283,284,294,306,342],init_delayed_messag:187,init_evt:327,init_f_str:327,init_fill_field:187,init_game_directori:265,init_iter:327,init_mod:[152,256],init_new_account:342,init_pars:232,init_queryset:327,init_rang:220,init_sess:[39,305],init_spawn_valu:249,init_str:327,init_tree_select:214,init_tru:152,initi:[5,9,11,21,29,33,46,48,49,50,57,59,60,63,67,72,84,96,104,106,109,119,122,126,129,130,132,136,137,143,144,145,152,153,169,173,174,176,178,185,187,191,195,197,204,205,214,216,217,218,219,220,229,230,235,242,244,245,255,258,259,262,263,265,267,268,269,274,275,276,278,279,280,281,283,284,285,286,287,288,289,290,292,293,294,296,304,305,306,313,314,319,321,324,325,326,334,337,338,342,349,355,360],initial_formdata:187,initial_ind:328,initial_setup:[140,141,260,303],initialdelai:[262,276,277],initialize_for_combat:[216,217,218,219,220],initialize_nick_templ:[314,334],initil:293,inject:[95,102,304,320,326],inlin:[18,56,84,103,136,144,172,235,242,252,263,313,334],inlinefunc:[44,82,103,108,140,141,248,306,318],inlinefunc_en:[113,334],inlinefunc_modul:[113,334],inlinefuncerror:334,inlinefunct:[113,334],inlinepars:334,inmemori:314,inmemoryattribut:314,inmemoryattributebackend:314,inmemorybackend:314,inmemorysavehandl:337,inner:76,innoc:[12,42,156],innocu:102,inobject:274,inp:[50,158,175,263,327,342],inpect:50,input:[1,5,9,10,14,15,17,20,22,27,30,31,39,40,42,49,54,56,57,69,73,78,82,86,90,94,95,103,104,108,109,110,112,113,114,117,126,130,132,134,136,137,143,148,149,150,153,158,163,165,166,167,168,169,173,175,179,184,187,199,200,204,205,209,214,219,230,236,245,248,250,263,270,274,285,293,304,306,314,315,317,324,325,326,327,328,334,336,338,342,343,355],input_cmdset:326,input_func_modul:[73,270],input_str:326,input_validation_cheat_sheet:355,inputcmdset:326,inputcommand:[73,82,87],inputcompon:136,inputdebug:[73,270],inputfunc:[39,44,103,138,140,141,145,260,293,304,306,362],inputfunc_nam:293,inputfunct:73,inputhandl:140,inputlin:[42,86,164,314,315],insecur:89,insensit:[173,186,205,231,315,347],insert:[13,14,25,49,57,63,70,86,95,108,113,137,152,188,201,248,320,328,334,342],insid:[0,5,10,11,13,15,19,20,21,23,25,27,28,31,33,41,42,45,46,50,52,56,58,63,67,68,70,71,72,79,81,84,85,87,88,90,91,92,94,95,99,101,104,105,107,108,109,110,113,116,120,122,124,126,131,132,133,134,135,138,140,145,168,179,186,189,193,194,205,229,233,239,244,245,248,265,282,303,310,320,321,334,342],inside_rec:239,insiderecurs:239,insight:[20,40,41,121,135],insist:[89,90],inspect:[12,23,42,50,84,143,158,178,263,265,326],inspectdb:85,inspir:[33,40,72,115,126,128,180,188,328,342],instac:[153,245,304],instal:[0,3,5,14,20,26,37,40,41,45,46,52,53,54,56,57,58,59,63,64,66,75,76,78,94,95,96,97,100,102,105,107,109,123,126,127,129,133,137,138,140,178,180,181,182,184,185,186,198,200,201,202,205,209,211,212,216,217,218,219,220,361,362],installed_app:[4,68,85,126,132,133],instanc:[0,2,3,8,11,16,17,22,25,27,28,29,38,40,41,42,45,49,50,55,56,57,58,59,60,61,63,68,75,83,84,90,94,95,96,101,102,104,106,108,115,118,120,125,126,129,130,135,136,143,144,147,149,150,151,152,153,162,165,167,168,172,174,176,179,194,196,197,199,203,214,232,233,235,237,242,244,245,249,250,252,254,258,259,262,265,274,275,276,277,278,279,280,281,283,287,288,292,296,297,305,306,310,313,314,316,317,319,322,323,326,328,332,333,338,342,343,355],instanci:179,instant:135,instanti:[33,85,126,143,152,169,223,256,259,282,303,306,314,325],instantli:313,instead:[0,3,6,9,10,11,12,14,16,19,20,21,22,23,25,26,27,29,30,31,33,34,37,38,40,42,45,47,48,50,56,57,59,61,62,63,66,78,79,82,83,84,85,88,89,90,92,94,95,99,101,102,103,104,105,108,109,110,111,113,115,116,117,118,120,122,124,125,126,127,130,131,132,133,134,135,137,138,143,145,152,153,155,156,158,160,163,167,168,170,179,184,185,187,196,197,200,205,212,214,216,217,218,219,220,225,230,232,233,239,240,245,250,259,265,293,294,304,308,313,314,316,317,322,326,332,335,337,338,339,342,355,360,361],instig:156,instil:[139,218],instr:[274,342],instruct:[0,8,9,13,14,23,27,30,37,41,42,45,46,54,56,57,59,60,62,73,74,76,78,82,84,89,92,95,96,99,105,118,123,130,138,143,153,168,199,205,209,250,259,262,265,275,277,283,288,289,293,294,296,304,306,326,336],insult:93,integ:[31,33,38,84,90,104,108,113,122,124,150,181,183,184,187,216,217,218,219,220,231,239,245,248,315,334,338,342,343],integerfield:[132,355],integr:[4,7,40,44,60,63,75,78,102,133,136,138,169,205,268,270,326,362],intellig:[72,82,90,102,133,152,296],intend:[13,17,20,22,27,31,33,34,37,41,54,60,89,102,107,108,110,111,113,121,125,130,135,136,143,163,178,179,205,226,237,245,250,283,315,317,322,323,325,328,334,339,340,343,360],intens:[78,92,113],intent:[75,95,102,204,342],inter:13,interact:[2,20,23,29,33,39,41,42,50,52,54,55,58,60,76,78,99,105,107,109,115,121,132,137,140,157,220,225,265,282,320,335,342],intercept:306,interchang:[115,326,360],interest:[0,1,4,11,14,20,21,22,26,33,37,39,41,45,48,54,56,59,60,69,78,85,89,90,92,95,102,108,113,118,119,120,122,135,152,167,178,183,231,233],interf:62,interfac:[9,21,22,23,25,36,39,41,42,52,62,63,68,69,78,79,89,93,95,96,100,103,118,132,134,136,137,138,155,158,172,174,245,257,276,305,310,314,317,319,360],interfaceclass:285,interfer:[23,96],interim:[29,114],interlink:[282,303],intermediari:[205,240,255,326],intern:[10,11,15,27,34,39,50,62,75,79,86,87,89,99,101,102,103,104,106,108,109,111,112,115,127,143,145,173,176,185,188,205,233,245,249,256,293,294,314,316,317,319,323,326,328,334,342],internal_port:89,internation:[7,112,138,362],internet:[10,12,16,33,39,42,62,71,89,93,102,123,156,262,267,275,276,277,285,288,296,310],interpret:[33,41,42,55,58,59,90,92,95,101,102,103,108,133,153,157,158,249,250,293,319,334,338],interrupt:[62,149,153,169,191,194,197,285],interruptcommand:[33,90,140,149,153],interruptev:197,intersect:[31,151],interv:[63,73,101,114,115,119,120,131,145,183,194,216,217,218,219,220,222,225,226,229,231,248,254,257,259,270,322,329,342],interval1:259,intim:[31,33],intimid:57,intoexit:[42,158],intpropv:122,intricaci:61,intrigu:53,intro:[4,68,121,123,133,231],introduc:[26,29,31,56,72,96,122,123,126,130,138,205],introduct:[3,13,14,15,18,19,20,44,59,62,123,130,138,179,361,362],introductori:[54,62],introroom:231,introspect:202,intrus:125,intuit:[22,50,60,85,90,130,138],intxt:27,inv:[31,42,81,164,181],invalid:[11,40,59,90,108,143,187,205,226,249,328,338,342,343],invalid_formchar:325,inventori:[20,21,25,27,31,79,84,90,96,118,137,164,181,205,239,245,316],invers:[79,113,125,205,291,341],invert:[113,125],invis:24,invit:[0,10,60,76],invitingli:20,invok:[11,13,14,101,208,239],involv:[39,55,60,67,74,79,88,104,106,115,122,187,220,316,317,319],ioerror:320,ipregex:156,ipstart:[62,99,109],iptabl:102,ipython:[26,52,57,58,95],irc2chan:[71,163],irc:[7,9,26,34,42,54,59,62,69,78,93,97,130,137,138,140,145,163,171,260,270,273,283,306,361,362],irc_botnam:145,irc_channel:145,irc_en:[71,163,239],irc_network:145,irc_port:145,irc_rpl_endofnam:277,irc_rpl_namrepli:277,irc_ssl:145,ircbot:[145,277],ircbotfactori:[145,277],ircclient:[277,306],ircclientfactori:283,irchannel:[42,71,163],ircnetwork:[42,71,163],iron:178,ironrealm:289,irregular:[222,229,231],irregular_echo:229,irrelev:[102,274],irur:51,is_account_object:55,is_act:[144,254],is_aggress:116,is_anonym:[4,68],is_anyon:4,is_authent:132,is_ban:143,is_bot:147,is_build:4,is_categori:214,is_channel:[33,40,173],is_connect:[147,245],is_craft:29,is_exit:[33,153],is_fight:29,is_full_moon:25,is_giving_light:230,is_gm:57,is_in_chargen:122,is_in_combat:[216,217,218,219,220],is_inst:27,is_it:342,is_iter:342,is_lit:[230,231],is_next:[147,176,244,254,314,316],is_o:342,is_ouch:11,is_prototype_bas:249,is_sai:117,is_staff:144,is_subprocess:342,is_superus:[2,4,143,144,147,240,245,322],is_thief:[42,165],is_turn:[216,217,218,219,220],is_typeclass:[143,316],is_valid:[101,120,132,178,226,254,257],is_valid_coordin:233,isalnum:319,isalpha:319,isbinari:[276,293],isclos:136,isconnect:136,isdigit:[57,113,319],isfiremag:28,isinst:[38,342],island:199,isleaf:294,islow:319,isn:[0,4,17,22,40,41,45,49,55,61,62,68,90,118,137,179,191,195,220,231,232,267,313,319,336,347],isnul:338,iso:[15,112],isol:[13,37,60,62,63,90,94,99,126],isp:[89,102],isspac:319,issu:[7,8,10,11,13,14,21,22,23,29,31,33,37,41,42,47,53,57,59,62,69,78,84,88,89,92,102,107,122,124,125,126,130,137,139,249,265,296,297,328,361],istart:[41,109,140],istep:297,istitl:319,isub:115,isupp:319,itch:[60,62],item:[20,42,46,50,58,62,67,68,81,84,85,115,116,136,137,164,178,181,187,205,218,223,233,245,284,314,334,342],item_consum:218,item_func:218,item_kwarg:218,item_selfonli:218,item_us:218,itemcoordin:233,itemfunc:218,itemfunc_add_condit:218,itemfunc_attack:218,itemfunc_cure_condit:218,itemfunc_h:218,iter:[11,48,50,58,96,111,118,137,143,199,205,233,245,250,257,294,296,314,316,319,320,323,327,342],iter_cal:327,iter_to_str:342,itl:[22,179],its:[0,2,3,5,9,11,12,14,15,16,20,21,22,23,25,27,29,31,33,37,38,39,40,41,42,43,48,49,50,51,52,54,55,56,57,59,60,61,62,63,64,67,68,69,71,72,74,79,80,81,82,83,84,85,87,88,89,90,92,93,94,95,97,99,100,101,102,103,104,108,110,113,114,116,117,118,120,121,122,123,124,125,126,127,128,129,130,132,133,134,135,136,137,138,143,144,145,147,149,150,151,152,153,156,158,166,167,168,174,175,178,179,187,188,194,196,202,204,205,212,214,216,217,218,219,220,225,226,229,230,232,233,239,244,245,250,257,258,259,265,270,274,278,291,292,293,294,297,305,306,310,311,313,314,315,316,317,320,325,326,328,332,334,335,336,337,338,339,342,355,360],itself:[0,4,9,11,15,17,20,21,22,23,25,27,29,33,36,37,39,40,43,44,45,46,48,50,54,59,62,63,67,74,76,77,79,81,84,85,88,95,103,104,105,110,113,114,115,117,118,121,122,124,126,130,132,133,134,135,143,145,173,174,179,184,187,197,203,205,214,219,222,230,231,233,234,239,245,247,250,258,265,289,294,306,310,313,314,317,319,322,324,326,337,339,344,355,360],iusernamepassword:285,iwar:84,iweb:89,iwebsocketclientchannelfactori:276,iwth:259,jack:86,jail:[12,13],jamochamud:24,jan:[12,61],januari:61,jarin:89,javascript:[54,87,102,134,135,136,137,293,294],jenkin:[122,181,187,189,214,216,217,218,219,220],jet:219,jetbrain:[78,105],jnwidufhjw4545_oifej:9,job:[33,40,68,79,143],jobfusc:204,john:[57,213],johnni:[208,209],johnsson:86,join:[9,22,34,42,48,57,60,62,64,71,95,111,115,118,122,132,143,163,174,178,204,319,342],join_fight:[216,217,218,219,220],join_rangefield:220,joiner:174,jointli:[63,152],joke:58,joker_kei:[22,179],jqueri:137,json:[82,87,136,137,208,276,289,293,294,323],jsondata:87,jsonencod:294,jsonifi:294,judgement:72,jump:[13,14,21,40,43,48,50,51,54,60,62,76,88,107,130,138,214,263],junk:274,just:[0,1,3,4,5,6,9,10,11,12,13,14,15,17,19,20,21,22,23,25,26,27,28,29,30,31,33,34,37,38,39,40,41,42,43,45,46,47,48,50,51,52,53,55,56,57,58,59,60,61,62,63,67,68,69,72,73,75,76,78,79,80,82,84,85,86,87,88,89,90,92,94,95,96,99,100,101,104,105,106,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,124,125,126,127,130,131,132,133,134,135,136,137,139,143,151,152,153,156,158,166,167,168,169,173,178,179,181,184,186,191,193,194,196,205,213,214,216,217,218,219,220,223,226,229,231,233,239,240,245,249,250,255,270,283,293,303,310,314,315,316,319,323,324,326,328,337,338,342,343,360],justif:[327,342],justifi:[95,108,248,319,327,342],justifii:327,justify_kwarg:327,kavir:289,kcachegrind:92,keen:37,keep:[0,1,4,7,9,11,13,14,15,16,20,25,26,29,30,33,34,41,44,47,50,55,56,57,59,60,61,62,63,67,68,72,74,75,76,77,80,81,84,90,91,94,95,96,99,104,108,115,117,120,121,125,127,130,131,132,133,137,145,186,189,194,203,208,226,230,231,249,250,256,267,308,326,328,342],keep_log:[34,174,322],keepal:[104,288,294],keeper:84,keepint:63,kei:[0,1,5,8,9,10,11,13,21,25,26,27,28,29,30,31,33,34,38,40,41,42,43,48,49,51,52,55,56,57,59,61,68,70,73,79,80,81,83,84,85,87,88,90,93,94,95,96,101,106,110,111,113,114,115,118,119,120,122,124,126,128,130,132,136,137,143,145,147,149,151,152,153,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,173,174,175,178,179,180,181,183,184,185,186,187,188,192,193,198,199,200,201,202,204,205,211,212,213,214,216,217,218,219,220,223,229,230,231,232,233,237,239,244,245,248,249,250,254,255,256,257,259,263,265,270,271,272,274,283,286,289,290,292,293,294,297,304,305,306,308,314,315,316,317,321,322,324,325,326,327,335,336,337,339,342,355,360],kept:[33,42,56,79,90,118,126,158,193,194,250,314],kept_opt:214,key1:201,key2:[50,201,245],key_mergetyp:[31,151,223],keyboard:137,keydown:136,keyerror:[249,259,337],keyfil:[286,290],keynam:[174,250,322],keypair:285,keys_go_back:[22,179],keystr:317,keystrok:285,keywarg:[169,227,291,301,340,350],keywod:328,keyword:[0,1,5,10,11,22,25,27,29,30,33,34,42,49,50,51,57,61,73,79,80,82,85,90,92,94,101,106,108,113,114,118,122,124,126,133,143,145,149,153,158,164,174,181,183,186,191,193,194,196,197,204,205,209,216,217,218,219,220,231,232,240,245,248,249,250,255,258,259,263,265,270,274,276,277,283,284,285,288,293,294,304,305,306,308,314,315,316,322,325,326,327,328,332,334,336,338,339,342,360],keyword_ev:197,kick:[12,31,42,50,57,89,145,151,156,163,170,185,245,327],kildclient:24,kill:[20,27,42,50,60,74,92,99,101,104,115,168,178,229,230,255,256,257,259,265,303,310],killsign:265,kilogram:81,kind:[0,11,37,39,79,90,96,103,115,117,118,120,132,137,216,217,218,219,240,316,343],kinda:137,kindli:125,kitchen:[42,43,158],knew:94,knock:50,knot:181,know:[0,2,5,6,8,10,11,13,14,15,16,20,21,22,23,26,29,31,33,37,38,39,40,41,42,43,47,48,50,53,55,56,57,59,60,63,68,69,71,72,73,78,79,80,81,82,83,84,85,88,89,90,92,94,95,96,97,99,101,103,104,109,110,112,113,115,116,117,118,120,124,125,126,127,130,131,132,133,135,137,138,153,157,158,166,167,169,173,178,193,198,204,214,219,230,244,245,270,304,306,313,314,320,321,326,342,360,361],knowledg:[13,15,24,33,54,76,287,306],known:[7,20,24,33,49,72,78,79,86,91,95,113,114,124,133,136,142,167,219,327,361],knuth:92,kobold:60,koster:78,kovash:50,kwar:316,kwarg:[1,10,25,29,33,39,40,50,57,58,73,79,80,82,83,87,95,106,108,113,114,117,120,124,131,133,136,143,144,145,146,147,149,153,155,156,157,158,163,164,165,166,167,168,169,170,173,174,175,176,178,179,180,181,183,184,185,186,187,188,191,192,193,194,196,198,199,200,201,202,203,204,205,209,211,212,213,214,216,217,218,219,220,222,223,225,226,229,230,231,232,233,236,237,239,240,242,243,244,245,247,248,249,250,253,254,255,257,258,259,262,263,267,270,271,272,274,275,276,277,282,283,284,285,286,288,289,290,293,294,298,303,304,305,306,307,308,310,313,314,315,316,317,319,324,325,326,327,328,329,331,332,334,335,336,337,338,339,340,342,343,355,358,360],label:[47,85,111,132,139,355],label_suffix:[144,235,242,355],laborum:51,lack:[13,55,60,69,128,205,245,314,342],ladder:57,lag:[48,62],lai:[1,47],lair:14,lambda:[10,38,50,68,108,194,250,342],lamp:[110,223,225,226],land:[90,115,229,230],landscap:[102,110],lang:204,langcod:205,langnam:205,languag:[7,15,39,46,54,55,56,57,63,78,90,94,102,107,112,113,117,123,124,126,128,129,136,138,204,205],language_cod:75,languageerror:[204,205],languageexistserror:204,languagehandl:204,larg:[10,11,13,14,16,20,23,37,50,54,55,60,85,89,95,96,107,108,121,126,204,233,283,320,325,332],larger:[14,20,48,56,60,67,79,81,85,107,186,291,319,332,342],largesword:85,laser:76,last:[4,11,13,14,22,26,29,31,33,34,36,41,42,47,50,53,57,59,68,73,75,85,86,88,90,94,95,104,106,109,115,120,121,125,126,130,133,135,136,149,150,152,158,163,164,178,183,186,194,196,205,214,216,217,218,219,220,226,245,269,319,320,321,326,327,328,329,335,342],last_cmd:33,last_initial_setup_step:303,last_login:144,last_nam:144,last_step:269,lastcast:28,lastli:[80,110,132,149],lastsit:25,late:321,later:[0,2,9,11,12,13,22,23,33,34,39,42,45,54,57,59,60,62,63,68,72,73,75,80,82,83,85,89,94,96,108,110,113,114,116,119,120,121,122,124,130,132,137,138,139,151,155,156,158,166,167,183,202,205,250,259,285,317,342],latest:[20,21,27,31,36,42,57,62,63,74,97,130,158,163,168,196,245,250,284,308,326,335,361],latin:[15,112,245,342],latin_nam:245,latinifi:[245,342],latter:[6,27,29,34,63,76,79,88,90,94,114,125,205,254,256,317],launch:[14,21,53,62,74,84,89,92,101,105,109,121,126,137,152,223,264,265,275,277,296,324,342],launcher:[92,105,264,265,274,275,296],law:78,layer:[22,31,244,316],layout:[27,48,55,57,95,118,124,127,136,137,233],lazi:342,lazy_properti:342,lazyencod:294,lazyset:335,lc_messag:75,lcnorth:113,ldesc:55,ldflag:74,lead:[0,11,13,17,20,22,23,31,37,42,48,50,55,59,60,63,68,78,82,85,101,102,110,120,143,150,151,158,168,194,197,203,211,245,250,289,304,314,316,326,328,334,342],leak:134,lean:205,leap:[61,117],learn:[0,15,16,17,20,22,29,31,33,41,45,48,52,55,56,59,62,67,68,78,79,80,94,95,105,107,121,123,125,130,133,135,138,204,219,362],learnspel:219,least:[3,8,33,38,41,46,48,50,54,56,57,60,72,79,85,89,95,101,105,120,137,143,152,175,178,204,236,245,250,257,319,325,328,339,342],leasur:229,leather:84,leav:[0,2,20,21,22,25,42,57,59,72,73,76,84,92,94,101,102,115,122,136,137,155,157,158,163,174,178,179,231,233,239,245,293,294,326,332],leavelock:239,leaver:174,left:[22,27,33,36,38,40,42,56,68,73,79,84,85,90,100,101,108,110,113,136,137,143,158,164,166,167,189,216,217,218,219,220,230,233,240,248,250,316,319,328,342],left_justifi:[108,248],leg:302,legaci:[87,108,143,205],legal:[89,102],legend:[48,49,199],leisur:343,len:[25,48,57,70,84,108,113,115,118,119,120,150,167,183,342],lend:49,length:[22,23,25,48,61,65,67,70,85,89,90,94,121,150,183,187,189,197,204,205,267,308,314,319,328,342,360],lengthi:[1,25],lengthier:361,lenient:108,less:[22,34,43,50,55,60,63,72,85,89,90,105,107,115,118,131,132,136,138,183,217,219,314],let:[0,3,5,7,8,9,11,12,14,15,20,21,22,25,28,31,33,37,38,39,40,42,43,45,47,48,50,55,56,57,59,60,61,62,63,64,69,71,72,73,74,76,79,80,81,82,84,88,90,92,94,95,97,102,105,110,113,114,116,117,118,120,122,123,125,126,130,132,133,135,136,139,143,153,158,164,165,169,173,178,181,184,187,189,214,226,233,240,245,275,294,306,322,326,336,341,355,360,361],letsencrypt:89,letter:[15,22,38,42,75,89,94,110,112,113,118,122,132,155,164,179,203,309,342],level:[2,11,13,19,20,22,26,27,30,36,39,40,42,46,49,50,52,54,56,57,60,65,68,70,72,78,79,84,89,94,95,103,104,107,110,111,118,124,132,137,138,139,143,155,160,161,179,180,183,198,204,214,239,245,249,250,267,304,314,316,322,324,329,334,342,360],lever:[33,124],leverag:3,levi:85,lhs:[25,57,166,167],lhslist:[166,167],lib:[62,66,74,96],libapache2:8,libcrypt:74,libjpeg:74,librari:[6,13,26,44,52,55,56,62,63,74,75,77,78,90,94,99,102,107,108,124,126,127,132,135,136,137,177,203,232,249,250,278,316,328,342],licenc:319,licens:[37,44,78,105,138,203,319,362],lid:[223,225,226],lidclosedcmdset:223,lidopencmdset:223,lie:110,lies:[33,130],life:[11,37,61,86,94,125,183,229],lift:[20,72,79,95,122,220,240],lifter:79,light:[14,23,27,60,101,107,121,152,217,230,231,239,250,258,319],lightabl:230,lighter:[113,217],lightest:27,lightli:[16,217],lightsail:89,lightsourc:230,lightsource_cmdset:230,like:[0,2,3,5,6,8,9,10,11,12,14,15,16,17,19,20,21,22,23,24,25,26,27,28,29,30,31,33,34,35,36,37,38,39,40,41,42,43,44,45,47,48,50,51,53,54,56,57,58,59,60,61,62,63,64,67,68,69,70,71,72,73,74,75,76,78,79,80,82,83,84,85,87,88,89,90,92,94,95,96,99,101,102,103,104,105,106,107,108,110,111,113,114,115,116,118,119,120,124,125,126,127,128,130,131,132,133,134,135,136,137,138,139,143,145,147,148,150,151,152,155,157,158,163,166,167,170,171,174,175,178,179,181,185,186,187,188,189,197,199,203,204,205,211,212,214,216,217,218,219,220,223,226,231,232,233,237,239,240,244,245,248,249,250,270,278,294,299,303,305,306,314,315,316,319,320,322,325,326,327,328,329,332,336,338,339,342,355,360,362],limbo:[0,9,13,14,20,22,27,42,58,62,65,103,110,120,121,133,158,179,269],limbo_exit:110,limit:[0,2,6,11,16,19,20,25,26,27,28,31,33,34,37,42,45,50,54,57,60,63,67,70,79,85,89,90,94,101,103,108,111,115,121,122,124,125,126,137,139,143,155,156,157,158,174,175,181,194,205,214,216,218,219,226,236,237,240,245,250,254,257,259,270,283,308,314,315,316,317,320,322,324,335,339,342,360],limit_valu:143,limitedsizeordereddict:342,line:[0,4,5,9,10,13,14,15,19,22,23,25,26,27,29,30,31,33,34,36,38,40,42,44,45,47,50,53,55,56,57,58,59,60,61,62,66,68,73,75,80,82,85,86,88,89,90,91,92,94,95,96,97,99,103,107,108,109,110,113,118,120,122,124,126,127,132,133,136,137,138,140,143,149,152,158,165,167,168,179,184,185,187,199,200,201,204,205,214,232,233,249,265,270,285,288,293,304,316,320,324,325,326,327,328,335,342,355,360],linear:48,linebreak:[68,341],lineeditor:324,lineend:341,linefe:136,linenum:324,liner:277,linereceiv:[285,288],linesend:294,lingo:[56,85,104,134],linguist:342,link:[2,3,4,9,14,17,18,20,22,25,29,31,33,37,38,39,45,47,48,50,53,54,56,62,63,68,69,71,84,88,89,95,97,104,110,118,120,122,123,127,130,132,133,138,143,147,158,163,191,196,223,226,232,239,240,245,254,263,265,276,280,285,288,316,341,342,362],link_ok:239,linklock:239,linknam:53,linod:89,linux:[4,8,9,23,25,63,71,74,86,89,92,96,99,105,130,208,342],liquid:316,list:[0,1,2,3,4,6,7,11,12,13,14,15,20,22,23,25,27,31,33,34,37,38,39,40,42,44,45,47,48,50,53,54,56,57,58,59,60,62,65,67,68,69,71,72,73,75,76,78,79,81,84,85,87,88,89,90,92,93,95,96,97,101,102,104,105,108,109,110,111,112,113,115,118,120,122,123,124,127,128,130,132,133,134,136,137,138,143,145,147,150,151,152,153,155,156,157,158,163,164,165,166,167,168,169,173,174,175,176,178,179,180,181,182,186,187,188,189,191,192,194,195,196,197,198,199,201,202,203,204,205,208,209,214,216,217,218,219,220,229,230,233,236,239,240,244,245,248,249,250,255,256,257,258,259,263,265,270,271,275,277,279,281,283,284,289,294,297,306,308,310,313,314,315,316,317,319,320,321,322,323,326,327,328,334,335,336,339,342,360,361],list_attribut:158,list_callback:192,list_displai:[144,172,235,242,252,261,313],list_display_link:[172,235,242,252,261],list_filt:[242,313],list_nod:326,list_of_all_rose_attribut:11,list_of_all_rose_ndb_attr:11,list_of_lycanthrop:118,list_of_myscript:101,list_prototyp:249,list_select_rel:[172,235,242,252,261],list_set:265,list_styl:155,list_task:192,list_to_str:342,listabl:[42,158],listcmdset:[42,158],listcmset:[42,158],listen:[2,12,34,40,42,66,79,102,104,123,136,138,163,174,204,205,223,239,360,362],listing_contact:53,listobj:[42,168],listobject:[42,168],listscript:[42,168],listview:360,lit:[230,231],liter:[13,20,42,56,65,108,164,248,319,338,342],literal_ev:[249,313],littl:[0,4,9,10,15,20,21,25,28,33,34,40,41,56,57,59,63,68,69,70,84,89,90,95,99,101,108,109,110,116,117,118,124,130,133,135,137,138,199,217,231,300,314,326,342,355],live:[8,23,59,62,69,78,89,99,105],ljust:319,lne:214,load:[6,11,12,13,15,26,29,31,33,42,43,49,50,55,56,57,59,60,68,72,81,96,102,105,108,110,120,122,126,135,136,137,147,152,164,165,168,176,186,194,204,237,240,244,245,254,258,269,272,274,305,314,316,317,320,321,324,333,336,337,340,342,353],load_buff:324,load_data:321,load_kwarg:337,load_sync_data:305,loader:[50,316,342],loadfunc:[49,324,337],loc:[42,158],local0:66,local:[23,25,36,37,46,58,61,63,71,75,96,99,102,105,113,130,132,135,137,191,194,205,250,288,314],localecho:89,localevenniatest:340,localhost:[3,4,9,23,24,62,66,68,74,89,94,132,133,134,136,294],localstorag:137,locat:[0,2,4,6,8,9,11,12,13,20,21,25,27,30,31,33,35,38,42,45,46,47,48,50,52,56,57,58,62,63,65,73,76,79,84,88,89,90,95,99,101,102,108,110,111,113,116,117,118,120,121,122,124,126,127,130,132,134,135,136,139,143,149,158,164,168,175,179,180,181,186,196,199,202,205,211,229,231,233,239,244,245,250,294,303,315,316,317,320,322,326,328,335,339],location_nam:233,location_set:118,locations_set:[118,244],locattr:[230,239],lock:[4,6,10,12,19,20,21,22,23,25,28,29,31,33,34,38,40,43,44,46,47,57,59,61,67,70,81,84,88,89,95,103,108,109,111,122,124,132,137,138,140,141,143,144,153,155,156,157,158,163,164,165,167,168,169,170,174,176,178,179,180,181,184,185,186,188,191,192,194,195,198,199,200,201,202,205,211,213,223,229,230,231,233,235,237,244,245,249,250,310,314,316,322,324,326,336,343,362],lock_definit:240,lock_func_modul:[79,240],lock_storag:[153,155,156,157,158,163,164,165,166,167,168,169,170,173,176,178,179,180,181,184,185,186,187,188,192,198,199,200,201,202,205,211,212,213,214,216,217,218,219,220,223,229,230,231,232,237,245,314,316,324,326,327],lockabl:[57,211],lockablethreadpool:310,lockdown:[79,314],lockdown_mod:[66,89],lockexcept:240,lockfunc1:79,lockfunc2:79,lockfunc:[25,33,42,79,103,120,140,141,158,238],lockhandl:[11,47,79,124,140,141,153,179,232,238,239],lockset:245,lockstr:[4,11,33,42,79,96,108,158,163,165,174,176,211,239,240,245,250,314,322],locktyp:[151,250],log:[2,4,5,6,8,10,11,12,20,21,23,24,25,33,34,35,36,38,42,43,44,46,50,54,56,57,58,59,62,63,64,65,66,70,71,72,73,74,75,85,88,89,92,93,99,100,101,104,105,106,109,110,113,120,121,122,127,129,130,132,133,134,136,137,143,152,156,170,174,180,185,187,200,208,209,245,254,265,270,274,275,279,282,283,285,288,296,297,298,304,306,308,310,316,322,334,335,342,360,362],log_dep:[27,335],log_depmsg:335,log_dir:208,log_err:[27,335],log_errmsg:335,log_fil:[27,335],log_info:[27,335],log_infomsg:335,log_msg:335,log_sec:335,log_secmsg:335,log_serv:335,log_trac:[27,101,117,119,335],log_tracemsg:335,log_typ:335,log_typemsg:335,log_warn:[27,335],log_warnmsg:335,logdir:36,logentry_set:147,logfil:[265,335,360],logged_in:104,loggedin:283,logger:[27,101,117,119,140,141,208,277,318],logic:[0,4,10,38,40,41,43,48,68,96,110,133,204,244,248,269,314,326,343],login:[2,4,7,9,25,33,35,42,50,54,68,69,79,89,96,100,104,106,130,132,138,143,155,170,185,200,240,269,270,285,288,293,294,297,306,342,347,349,358,360,362],login_func:297,loginrequiredmixin:360,logintest:358,logout:[296,297,358],logout_func:297,logouttest:358,logprefix:[275,285,288,310],lone:[42,60,110,158],long_descript:53,long_running_funct:10,long_text:51,longer:[0,21,25,29,33,40,42,49,51,53,57,68,78,85,90,101,114,123,124,125,128,151,156,174,181,204,205,212,216,217,218,219,220,255,324,328],longest:[27,205],longrun:33,loo:[153,169],look:[0,3,4,6,9,10,11,12,13,14,15,16,17,19,20,21,22,23,25,26,27,29,30,31,33,35,36,37,38,39,40,41,43,45,47,48,50,54,56,57,59,60,61,62,63,67,68,69,70,72,73,74,75,76,79,80,81,82,84,85,86,87,88,89,90,93,95,96,99,102,104,107,108,109,110,111,113,115,116,117,118,120,121,123,124,125,126,130,132,133,134,135,136,137,138,143,145,150,152,153,155,158,164,166,167,169,170,173,180,181,185,186,187,193,200,201,202,204,205,214,218,223,230,231,233,236,239,240,242,244,245,247,250,270,285,286,293,297,314,316,320,326,327,328,336,339,341,342,355,362],look_str:143,lookaccount:57,lookat:33,looker:[48,57,59,122,181,186,205,233,239,245,316],lookm:33,lookstr:245,lookup:[11,33,42,79,85,96,111,118,149,164,208,244,284,317,319,331,332,338,339,342,343],lookup_typ:338,lookup_usernam:50,lookuperror:319,loom:110,loop:[0,5,6,11,21,45,48,54,59,63,68,84,92,95,115,117,118,123,124,140,145,216,250,283],loopingcal:[257,268],loos:[14,37,143,181,220,236,285,296,320],loot:60,lop:118,lore:57,lose:[11,55,60,99,104,109,115,122,137,208,218,276,277,285,288],lost:[0,38,42,55,78,90,109,110,124,134,138,212,262,275,276,277,285,288,293,314,319],lot:[0,4,10,13,15,22,26,27,28,34,37,38,40,41,45,54,56,57,58,60,61,62,68,69,72,78,79,85,89,90,92,94,95,107,108,110,111,113,118,120,122,124,126,130,132,134,137,179,183,185,187,205,213,217,230,233,310],loud:21,love:136,low:[31,39,45,65,89,94,151],lower:[2,10,19,25,29,31,33,40,42,48,50,57,61,79,84,85,89,92,113,121,136,150,151,155,166,168,205,270,319],lower_channelkei:[40,173],lowercas:[94,153,319],lowest:[65,89,239,319],lpmud:128,lpthw:76,lsarmedpuzzl:202,lspuzzlerecip:202,lst:[48,322],lstart:49,lstrip:[90,319],ltto:113,luc:325,luciano:78,luck:[8,50,90,95],luckili:[59,79,110,126,130],lue:113,lug:54,lunch:45,luxuri:[111,312],lycanthrop:118,lying:110,m2m:317,m2m_chang:106,m_len:342,mac:[9,23,24,63,92,99,105,130,342],machin:[13,25,99,105,130,229],macport:[62,130],macro:[4,115],macrosconfig:4,mad:130,made:[3,11,19,20,21,25,26,35,36,42,50,55,57,58,60,78,79,89,95,97,102,103,108,110,120,122,130,133,149,151,163,168,178,181,187,214,218,219,220,240,267,311,319,320,324,326,342],mag:[59,126,325],magazin:78,mage:50,mage_guild_block:50,mage_guild_welcom:50,magenta:125,magic:[30,59,60,79,111,120,121,139,178,189,219,267],magic_meadow:111,magicalforest:139,magnific:50,mai:[0,4,6,8,9,10,11,13,19,20,21,23,25,27,28,29,31,33,34,37,39,40,41,42,47,50,53,55,56,59,61,62,63,65,66,68,69,70,72,74,76,78,79,80,82,83,85,86,87,88,89,92,93,94,95,96,99,101,102,103,104,105,107,108,109,110,113,114,115,117,118,119,122,124,126,127,129,130,132,133,134,135,143,145,149,150,151,153,155,156,158,168,174,175,177,178,180,181,183,187,189,196,204,205,216,217,218,219,220,223,230,231,239,240,245,248,249,250,251,267,297,304,306,307,311,313,314,316,317,319,321,322,323,324,326,328,329,334,336,339,342,360],mail:[9,34,37,50,54,56,59,60,69,78,92,115,127,140,141,175,176,177,239,361],mailbox:[34,198],maillock:239,main:[13,14,15,20,21,22,30,31,33,34,37,39,42,48,50,53,55,63,67,68,75,78,79,80,82,83,84,85,88,89,90,91,99,103,104,108,109,111,114,115,118,123,124,130,132,133,134,136,137,138,143,144,147,149,155,158,169,176,179,187,194,198,204,205,233,237,244,250,252,254,265,269,270,272,277,282,284,289,303,305,310,316,317,327,330,339,341,342],mainli:[10,12,33,34,42,50,56,78,82,88,92,95,104,155,234,314,320,334,342],maintain:[4,19,23,37,40,42,55,67,89,92,99,107,114,118,136,168,170,185,259,361],mainten:[89,102],major:[14,15,23,44,56,59,62,63,118,120,132],make:[0,1,2,4,5,6,7,8,9,10,11,12,13,14,15,16,19,22,23,24,25,26,28,29,30,31,33,36,37,38,39,40,41,42,43,45,46,47,48,49,50,52,53,54,55,58,60,61,62,63,67,69,70,71,72,73,74,76,77,78,79,80,82,84,85,86,88,89,90,92,93,94,95,96,99,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,121,123,124,125,127,129,131,132,133,135,136,137,138,139,143,145,147,150,151,152,153,155,156,158,163,166,169,173,174,175,178,179,181,186,187,189,195,198,199,204,205,210,211,212,214,216,217,218,219,222,223,225,226,229,230,231,236,239,240,245,249,250,256,257,259,265,269,277,282,296,297,303,304,306,307,309,310,313,314,315,316,317,319,320,321,322,323,324,326,328,329,332,334,339,341,342,358,360],make_it:342,make_shared_login:349,make_uniqu:151,makeconnect:274,makefactori:285,makeit:296,makemessag:75,makemigr:[36,85,132],male:188,malevol:14,malform:343,malici:102,malign:240,man2x1:107,man:[42,86,89,107,128,164,198,205],mana:[28,30],manaag:235,manag:[2,7,9,11,31,38,39,42,55,56,58,79,82,84,85,88,92,95,99,101,104,109,114,118,124,126,127,130,132,137,140,141,142,143,147,168,169,171,173,174,176,196,201,205,220,226,231,234,237,241,244,245,249,251,254,259,260,265,272,312,314,316,317,318,321,322,330,333,335,339,342,358,360,362],manager_nam:314,manchest:342,mandat:355,mandatori:[0,22,106,108,128],maneuv:214,mangl:291,mango:202,manhol:[93,285],manhole_ssh:285,mani:[0,1,2,4,5,9,10,11,12,14,15,17,20,26,27,30,31,33,34,39,42,43,48,50,54,55,56,57,60,61,62,63,65,67,69,71,72,75,76,84,85,87,88,89,90,92,94,95,97,101,102,103,104,106,107,108,109,110,112,113,114,115,117,118,119,120,121,122,123,124,125,126,127,128,130,132,133,134,139,147,151,153,158,169,176,178,181,185,187,199,205,212,213,214,218,219,223,229,232,237,239,240,244,250,254,259,265,279,287,289,308,314,316,317,319,326,332,333,335,360],manifest:96,manipul:[0,11,22,31,40,42,43,50,63,85,101,108,122,158,165,175,186,191,236,245,271,322,327],manner:[14,174,205,233,245,283,316],manpow:37,manual:[4,6,14,20,21,23,30,33,34,39,54,57,59,60,62,67,78,79,84,85,88,89,96,101,108,109,110,113,116,118,120,123,124,127,130,133,138,139,140,145,158,214,223,226,232,245,250,257,265,282,289,326,327,361,362],manual_paus:257,manual_transl:204,manual_unpaus:257,manytomanydescriptor:[147,176,237,244,254,314,316,317],manytomanyfield:[147,176,237,244,254,314,316,317],map:[0,15,25,38,42,45,50,56,57,60,63,86,87,96,99,123,134,137,138,155,163,182,183,196,199,204,205,233,245,249,250,289,314,316,319,325,326,334,342,362],map_legend:199,map_modul:110,map_str:[48,110,233],mapbuild:[140,141,177],maplegend:199,mapnam:199,mapper:332,mapprovid:233,march:[78,335],margin:17,mark:[13,14,20,21,33,42,48,52,57,62,71,75,79,89,94,113,118,130,134,136,137,139,150,157,186,194,203,214,306,316,320,325,326,334,338],mark_categori:214,markdown:[1,4,47,53],marker:[13,20,33,42,63,86,113,137,164,186,188,196,205,214,245,277,285,288,293,294,314,317,319,325,327,334],market:89,markup:[80,113,135,138,182,319,341],mask:[202,205,209,210],maskout_protodef:202,mass:[60,123,138,362],massiv:[28,54],master:[7,9,37,56,60,62,72,97,99,115,117,133,311],match:[9,11,20,22,27,31,33,38,40,42,43,48,50,56,57,61,67,73,75,79,82,85,86,87,88,90,101,103,104,108,110,111,113,117,118,124,127,130,132,133,134,135,136,137,143,149,150,151,153,156,158,164,165,167,169,173,175,179,182,183,186,187,197,198,199,200,201,202,205,219,233,236,239,240,245,249,250,256,259,270,271,283,296,306,314,315,316,317,319,324,326,328,334,337,339,341,342,343,360],match_index:150,matched_charact:187,matches2:85,matchobject:[319,341],mate:63,math:38,mathemat:151,matplotlib:298,matrix:328,matt:101,matter:[0,4,9,11,25,31,36,40,50,56,60,61,62,68,72,75,83,90,94,102,104,106,107,115,116,126,135,151,220,229,244,270,314],matur:[107,127,128],maverick:63,max:[16,48,70,115,187,205,308,335,342],max_damag:218,max_dbref:315,max_depth:342,max_dist:48,max_heal:218,max_l:48,max_length:[48,85,132,205],max_lin:328,max_num:144,max_num_lin:360,max_popular:360,max_rmem:332,max_siz:335,max_valu:[189,355],max_w:48,max_width:48,maxconn:66,maxdelai:[262,276,277],maxdepth:250,maxdiff:350,maximum:[16,38,70,85,90,110,113,143,187,189,216,217,218,219,220,245,250,310,319,328,334,342],maxlengthvalid:143,maxnum:342,maxrotatedfil:335,maxsplit:319,maxthread:310,maxval:[334,342],maxvalu:334,maxwidth:328,may_use_red_door:108,mayb:[6,9,11,13,14,21,22,25,27,31,33,43,47,48,53,60,62,67,68,69,72,81,84,85,89,108,115,118,121,137,139,152,178,197,283],mccp:[24,54,73,140,260,270,273],mccp_compress:278,meadow:[22,111,139],mean:[0,5,10,11,12,13,14,15,20,22,23,27,28,31,33,34,37,39,40,41,42,45,48,50,52,54,56,57,59,60,61,63,67,72,73,76,77,79,80,82,83,84,85,86,87,89,92,94,95,96,99,101,102,103,104,109,110,111,112,113,115,116,118,120,121,122,124,125,126,127,130,133,134,135,136,137,143,145,152,158,174,184,194,204,225,226,230,232,239,245,249,250,255,259,265,289,305,314,316,319,326,328,332,335,338,339],meaningless:122,meant:[16,20,22,31,34,43,53,61,67,75,82,95,101,124,125,136,137,139,151,179,188,205,213,216,217,218,219,220,226,231,233,245,270,320],meantim:1,meanwhil:95,measur:[89,92,122,150,167,342],meat:132,mech:[123,138,362],mechan:[27,28,33,38,49,50,52,54,57,60,68,72,90,101,108,115,121,122,124,125,138,143,145,149,186,205,219,238,250,257,259,265,269,275,283,294,305,316,324,327,330,337,360],mechcmdset:21,mechcommand:21,mechcommandset:21,meck:21,media:[16,144,172,235,242,252,261,293,310,313,338,355],median:48,mediat:72,medium:16,mediumbox:274,meet:[25,36,60,121,193,233,309],mele:220,mem:[42,168],member:[9,11,42,69,85,164,166,167,245,342],membership:[4,9,118],memori:[6,12,23,28,31,33,42,55,74,85,89,92,112,124,134,143,168,174,226,245,259,298,308,314,318,327,332,337,342],memoryerror:62,memoryusag:298,memplot:[140,260,295],meni:179,mental:125,mention:[6,9,10,11,13,14,15,21,29,33,39,40,48,55,56,60,62,69,73,79,89,101,107,112,114,125,126,152,185],menu:[11,25,31,42,44,45,46,53,54,62,64,68,104,105,108,109,122,127,137,138,140,141,158,179,187,200,213,214,246,250,263,265,326,336,362],menu_cmdset:326,menu_data:50,menu_edit:179,menu_login:[140,141,177],menu_modul:326,menu_module_path:326,menu_quit:179,menu_setattr:179,menu_start_nod:213,menuchoic:[50,326],menudata:[187,247,326],menudebug:[50,326],menufil:326,menumodul:326,menunode_fieldfil:187,menunode_inspect_and_bui:84,menunode_shopfront:84,menunode_treeselect:214,menunodename1:50,menunodename2:50,menunodename3:50,menuopt:214,merc:319,merchant:45,mercuri:107,mere:[116,189],merg:[3,5,22,33,37,42,43,50,56,61,63,96,130,138,149,150,151,152,165,223,231,233,250,254,289,326,334],merge_prior:326,merger:[5,31,37,110,151,152],mergetyp:[31,50,115,151,223,231,324,326],mess:[11,19,27,89,92,130,137,214],messag:[5,6,8,10,13,15,20,21,22,27,28,29,33,34,39,40,42,43,44,45,49,50,51,54,57,58,59,60,61,62,63,64,69,70,72,73,75,79,80,81,84,88,89,90,91,94,95,100,101,102,103,104,109,110,112,115,117,118,122,123,126,127,130,131,136,137,138,139,143,145,149,152,153,156,158,163,164,165,167,169,171,173,174,175,176,178,179,181,187,188,192,194,196,198,202,203,205,209,216,217,218,219,220,222,223,225,227,229,230,231,232,239,245,265,267,274,276,277,283,284,285,288,289,291,293,302,304,306,308,310,322,324,326,327,334,335,339,342],message_rout:136,message_search:175,message_transform:174,messagepath:[138,362],messagewindow:136,meta:[103,124,144,235,242,313,316,332,355],metaclass:[85,95,124,153,316],metadata:[209,267],metavar:232,meteor:81,meter:189,metho:173,method:[1,2,5,6,9,10,11,22,25,27,28,29,30,31,34,38,39,41,45,47,48,50,54,57,58,59,61,63,67,68,72,76,79,82,85,87,88,90,94,95,101,103,104,106,108,110,111,113,114,115,116,117,118,119,120,122,124,126,130,131,132,133,136,138,143,147,149,151,152,153,155,158,159,163,165,166,167,168,169,172,173,174,175,176,178,179,183,186,191,194,196,200,201,202,203,204,205,208,209,211,216,217,218,219,220,226,227,229,230,231,232,233,236,237,239,240,245,257,258,259,262,267,270,271,272,274,275,276,277,278,283,285,288,291,293,294,297,301,303,304,305,306,308,313,314,316,319,320,322,324,326,327,328,329,332,333,334,335,336,337,339,340,341,342,360],methodnam:[169,195,210,227,259,291,301,333,340,350,358],metric:81,microsecond:11,microsoft:[62,110],mid:[29,107,120],middl:[29,33,48,89,217,319],middlewar:[140,344,346],midnight:[25,61],midst:121,midwai:113,mighht:90,might:[0,4,8,10,11,12,14,15,17,20,22,23,25,26,27,28,29,30,31,33,34,38,39,40,41,42,45,50,51,54,57,59,60,61,62,68,69,72,74,75,76,79,80,81,84,88,89,90,94,95,96,97,99,101,102,103,104,109,110,113,114,115,118,119,121,122,123,125,126,130,131,132,135,137,152,156,158,178,203,209,212,216,217,218,219,232,245,294,316,319,324,335,336,342,355,361],mighti:[29,110],migrat:[9,23,36,62,74,85,106,109,110,126,129,130,132,250],mike:[42,158],mileston:138,million:[23,132],mime:322,mimic:[23,34,49,54,72,92,176,304,324],mimick:[49,63,72,137,296,324,327],mimim:317,min:[48,61,101,183,187,329,334],min_damag:218,min_dbref:315,min_heal:218,min_height:328,min_shortcut:[22,179],min_valu:355,min_width:328,mind:[10,12,13,14,37,40,44,50,53,54,55,56,59,60,121,125,133,137,178,189,194,203,267,342],mindex:150,mine:[45,102,137],mini:[54,110],miniatur:[60,121],minim:[60,102,104,115,137,204,250],minimalist:[33,57,107],minimum:[22,57,63,72,104,136,187,216,217,218,219,220,270,310,316,328,334,337,342],mininum:328,minlengthvalid:143,minor:[40,152],mint:[62,130],minthread:310,minu:[85,245,329],minut:[27,28,42,61,78,90,99,101,115,163,178,183,308,329,342],minval:[334,342],mirc:277,mirror:[71,78,104],mis:56,misanthrop:118,misc:[136,137],miscelan:318,miscellan:46,mislead:40,mismatch:[73,342],miss:[48,56,59,62,69,89,93,94,96,216,217,218,219,220,249,270],missil:[21,219],mission:[40,68],mistak:59,misus:89,mit:[78,123,319],mitig:[56,102,360],mix:[11,30,33,34,50,113,125,132,143,178,205,249,250,309,317,320,328],mixin:[249,299,360],mixtur:80,mkdir:[9,36,62],mktime:61,mob0:55,mob:[14,42,54,55,60,79,104,121,140,152,158,177,228,231,250,320],mob_data:55,mob_db:55,mob_vnum_1:55,mobcmdset:229,mobdb:55,mobil:[14,70,108,121,137,229,239],moboff:229,mobon:229,mock:[126,340],mockdeferlat:340,mockdelai:340,mockup:137,mockval:340,mod:[8,102],mod_import:342,mod_import_from_path:342,mod_proxy_http:8,mod_proxy_wstunnel:8,mod_sslj:8,mode:[2,8,31,40,41,42,49,50,66,68,73,78,92,99,102,105,115,116,122,132,134,137,140,157,168,174,180,196,198,229,245,249,256,265,270,275,282,293,294,303,320,324,326,335,342],mode_clos:294,mode_init:294,mode_input:294,mode_keepal:294,mode_rec:294,model:[9,11,34,40,44,58,63,68,72,79,86,95,103,111,114,118,124,131,134,135,138,140,141,142,143,144,171,172,174,175,234,235,241,242,245,251,252,255,259,260,261,271,312,313,314,315,317,318,323,330,331,333,338,339,342,355,360,362],model_inst:338,modeladmin:[172,235,242,252,261,313],modelattributebackend:314,modelbackend:347,modelbas:332,modelchoicefield:242,modelclass:[11,111],modelform:[144,235,242,313,355],modelmultiplechoicefield:[144,235,242],modelnam:[174,237,316],moder:[4,38,178],modern:[10,11,15,30,78,102,107,125,137,200,278],modif:[0,8,25,33,37,45,82,90,99,122,130,137,311,355],modifi:[0,2,4,11,20,22,25,26,31,33,34,38,39,42,43,45,50,54,55,56,57,59,67,72,77,84,88,92,95,99,103,104,108,109,110,113,117,118,121,122,124,127,130,134,136,137,138,139,143,144,152,174,179,184,186,188,194,196,202,205,212,216,217,218,219,220,230,232,237,245,250,259,316,320,326,332,338,341,355,360],modified_text:113,modul:[3,5,6,11,13,15,20,21,26,27,29,31,35,37,39,42,44,46,49,50,52,54,55,56,57,58,59,61,64,67,73,74,79,80,81,82,84,88,92,95,96,97,101,102,103,104,106,107,109,110,113,116,118,120,121,122,123,124,126,134,137,138,149,150,152,153,158,160,161,162,163,167,169,173,178,179,180,181,182,183,184,185,186,187,189,191,192,193,195,196,199,200,203,204,205,210,211,212,214,216,217,218,219,220,223,229,230,231,232,239,240,244,245,248,249,250,255,257,258,259,262,264,265,269,270,274,282,284,285,288,289,292,294,296,297,298,303,305,306,307,314,316,317,318,320,321,322,323,324,325,326,327,329,334,340,342,362],modular:54,modulepath:274,moifi:186,mollit:51,moment:[21,31,45,56,75,84,90,95,114,134,138,143,248,254],monei:[9,60,69,85,89,239],monetari:[37,178],monitor:[83,87,92,138,255,270,289,332],monitor_handl:[83,140,255],monitorhandl:[44,73,138,140,141,251,362],mono:25,monster:[29,42,56,60,63,88,108,158,250],month:[37,61,89,183,329,335,342],monthli:61,montorhandl:83,moo:[54,56,78,107,128],mood:[45,121],moon:[25,60,61,81],moor:121,moral:96,more:[0,1,2,3,4,5,9,10,11,12,13,14,15,17,19,20,21,22,23,25,26,27,28,31,33,34,35,36,37,38,39,40,41,42,43,45,48,49,50,51,52,54,55,57,58,59,60,61,62,63,65,67,68,69,70,71,72,73,74,75,76,78,82,84,85,86,87,88,89,90,92,93,94,95,96,99,101,102,103,104,107,108,109,110,111,112,113,114,115,117,118,120,121,122,123,124,125,126,130,131,132,133,135,136,137,140,142,143,144,147,150,151,152,157,158,164,168,170,173,177,178,179,180,181,183,185,186,189,194,197,199,203,204,205,212,213,214,216,217,218,219,220,225,229,230,231,232,233,239,242,245,248,249,250,275,277,280,296,297,306,311,314,315,319,320,322,323,324,325,326,327,328,332,339,342,343,355,360],more_command:327,moreov:[89,101],morn:[186,187],most:[0,4,6,8,9,10,11,13,17,22,23,25,27,30,31,33,35,37,38,39,40,41,42,45,46,47,48,50,52,55,56,57,58,59,60,61,62,63,68,72,73,76,79,81,82,85,87,88,89,90,92,94,95,96,99,102,103,104,106,107,110,112,113,114,115,116,118,120,122,124,125,127,128,132,136,137,139,143,147,151,152,155,158,166,176,179,189,204,205,212,216,217,218,219,220,237,239,240,244,245,250,254,288,293,303,314,315,316,317,326,327,332,333,342,360],mostli:[39,50,56,68,72,89,90,94,113,122,124,136,137,144,151,184,204,218,233,285,319],motiv:[13,14,37,54,60,69,88,276,277,283,284,285,288,293,294,305,306],mount:99,mountain:[107,110,199],mous:[113,136,326],move:[0,4,9,14,15,21,22,23,29,33,34,40,42,43,45,48,49,50,51,53,57,60,62,68,76,78,81,84,88,90,94,95,110,115,116,121,125,132,133,137,152,158,164,178,179,187,193,196,212,216,217,218,219,220,229,230,231,233,236,239,245,297,316,320,327],move_hook:245,move_obj:233,move_to:[0,84,88,120,196,212,245],movecommand:43,moved_obj:[233,245],moved_object:245,movement:[57,108,120,212,216,217,218,219,220,245],mover:220,mptt:4,mratio:[150,167],msdp:[54,82,270,289],msdp_list:270,msdp_report:270,msdp_send:270,msdp_unreport:270,msdp_var:289,msg:[0,2,5,10,11,13,22,25,27,28,29,30,33,39,40,41,43,45,49,50,51,55,57,58,59,61,70,72,79,81,83,84,85,87,88,90,94,95,104,110,113,115,117,118,120,122,126,128,136,137,140,143,145,153,155,159,163,169,172,174,175,176,188,196,198,209,232,240,245,276,277,304,313,320,322,324,326,327,335,339,342],msg_all:115,msg_all_sess:[33,153],msg_arriv:0,msg_content:[0,21,27,33,45,61,88,101,117,120,122,131,196,245],msg_help:165,msg_leav:0,msg_locat:[196,245],msg_other:178,msg_receiv:[196,245],msg_self:[196,245],msg_set:317,msgadmin:172,msglauncher2port:[265,274],msgmanag:[175,176],msgobj:[34,174],msgportal2serv:274,msgreturn:169,msgserver2port:274,msgstatu:[265,274],mssp:[54,103,140,260,273],mtt:292,much:[0,4,10,11,13,14,15,20,22,23,25,26,29,37,38,40,41,48,50,52,55,58,60,61,62,63,68,72,75,78,79,81,88,89,90,92,93,95,108,110,112,114,115,118,119,120,124,126,131,132,133,137,147,152,157,166,179,183,184,205,214,220,223,230,305,319,320,321,328,342],muck:56,mud:[8,15,21,22,23,24,30,39,42,48,54,55,59,60,62,63,71,72,73,79,86,87,89,90,91,94,96,97,99,100,103,104,107,109,110,113,114,115,116,121,123,125,127,131,134,136,137,139,147,152,155,220,262,278,279,280,285,288,289,292,320,329],mudbyt:78,mudconnector:78,mudderi:78,muddev:62,mudform:325,mudinfo:34,mudlab:78,mudlet:[24,95,100,270,280],mudmast:24,mudramm:24,muhammad:341,mukluk:24,mul:248,mult:[108,248],multi:[10,22,31,42,50,54,60,94,95,99,103,104,118,121,122,136,150,168,205,214,306,326,342],multi_page_t:327,multiaccount_mod:96,multidesc:[140,141,177],multilin:341,multimatch:[31,150,205,245,342],multimatch_str:[143,205,245,342],multimedia:136,multipl:[6,12,14,22,23,27,30,31,33,39,42,54,57,60,61,63,72,78,83,87,88,89,94,95,103,104,106,107,108,113,114,121,122,124,130,137,143,149,151,156,157,158,163,167,168,182,184,185,186,188,189,195,201,205,214,216,217,218,219,231,240,245,248,249,250,259,263,267,270,274,289,297,313,314,315,320,328,339,342],multiplay:[54,56,78],multipleobjectsreturn:[143,145,147,174,176,178,181,183,186,188,194,196,202,203,204,205,211,212,213,216,217,218,219,220,222,225,226,229,230,231,233,237,244,245,249,254,257,272,298,314,317,329,333],multipli:248,multisess:[2,40,68,326],multisession_mod:[24,33,63,104,122,132,143,155,159,180,188,245,306],multisession_modd:50,multitud:[56,110,113],multumatch:245,mundan:21,murri:342,muse:78,mush:[9,36,54,59,72,78,107,115,123,138,182,201,362],mushclient:[24,73,95,270,280],musher:78,mushman:107,musoapbox:[56,78],must:[0,1,2,4,5,8,10,11,15,24,25,29,31,33,37,39,42,47,48,49,50,55,57,60,61,62,63,64,70,71,73,75,79,80,82,83,84,86,88,89,92,94,95,96,99,102,103,108,109,111,112,113,114,115,116,118,122,124,126,127,130,132,134,135,136,139,145,150,153,158,168,169,173,174,175,178,181,182,183,185,196,200,202,204,205,209,214,216,217,218,219,220,225,226,230,231,237,239,245,248,255,259,265,270,283,285,288,305,307,308,313,314,315,316,319,320,321,322,323,324,325,326,327,329,334,336,337,338,339,341,342,343,360],must_be_default:152,mutabl:323,mute:[17,40,173,174],mutelist:[40,174],mutltidesc:201,mutual:315,mux2:128,mux:[20,21,33,34,40,44,54,57,102,107,138,140,141,148,166,167,182,238,362],mux_color_ansi_extra_map:182,mux_color_xterm256_extra_bg:182,mux_color_xterm256_extra_fg:182,mux_color_xterm256_extra_gbg:182,mux_color_xterm256_extra_gfg:182,muxaccountcommand:[166,198],muxaccountlookcommand:155,muxcommand:[5,25,28,29,30,33,43,57,81,118,122,140,148,154,155,156,157,158,163,164,165,167,168,170,181,184,185,186,192,198,199,201,202,211,213,218,219,231],mvattr:158,mxp:[24,54,73,113,140,260,270,273,285,288,319,326,341,342],mxp_pars:280,mxp_re:319,mxp_sub:319,my_callback:307,my_datastor:85,my_funct:29,my_github_password:130,my_github_usernam:130,my_identsystem:86,my_object:29,my_plugin:136,my_port:39,my_portal_plugin:39,my_script:101,my_server_plugin:39,my_servic:39,my_word_fil:204,myaccount:111,myapp:85,myarx:9,myattr:[11,143],mybot:[42,163],mycar2:86,mychair:111,mychan:34,mychannel:[12,42,163],mycharact:80,mychargen:50,myclass:59,mycmd:[33,67],mycmdset:[5,31,33],mycommand1:31,mycommand2:31,mycommand3:31,mycommand:[30,31,33,82],mycompon:136,myconf:36,mycontrib:126,mycss:136,mycssdiv:136,mycustom_protocol:39,mycustomcli:39,mycustomview:134,mydatastor:85,mydhaccount:99,mydhaccountt:99,mydhacct:99,myevennia:71,myevilcmdset:[31,151],myevmenu:50,myfix:130,myfunc:[10,114,126,342],mygam:[2,3,5,6,9,13,14,21,23,25,26,27,30,31,35,39,41,43,46,48,50,53,55,56,57,59,61,62,64,66,68,70,72,73,74,75,79,80,81,84,85,88,89,92,94,95,99,101,103,105,108,109,110,113,115,117,118,119,120,122,124,126,127,130,132,133,134,135,136,179,180,182,186,198,199,200,201,211,212,290,340,342],mygamegam:80,myglobaleconomi:101,myhandl:106,myhousetypeclass:[42,158],myinstanc:85,myircchan:[42,163],mykwarg:50,mylayout:136,mylist2:11,mylist:[6,11,96,316],mylog:27,mymap:199,mymenu:50,mymethod:55,mymodul:114,mymud:[8,105],mymudgam:89,mynam:99,mynestedlist:323,mynod:50,mynoinputcommand:33,mynpc:122,myobj1:111,myobj2:111,myobj:[11,27,79,101,259],myobject:[5,11],myobjectcommand:25,myothercmdset:31,myownfactori:39,myownprototyp:108,mypassw:185,mypath:126,myplugin:136,myproc:39,myproc_en:39,myprotfunc:108,myroom:[42,55,101,111,158],myros:88,myscript:[101,111,124],myscriptpath:101,myserv:185,myservic:39,mysess:104,mysql:[36,54,63,127,342],mysqlclient:23,mysteri:[74,86],mytag:136,mythic:121,mytick:259,mytickerhandl:259,mytickerpool:259,mytop:20,mytup1:11,mytup:11,myvar:33,myview:134,naccount:306,naiv:[174,233,237,316],nake:33,name1:[42,158],name2:[42,158],name:[0,2,3,4,5,6,9,10,11,13,14,15,19,20,22,23,24,25,29,31,33,34,36,39,40,41,43,45,46,48,50,51,52,53,54,55,56,57,58,59,60,61,63,64,65,67,68,70,71,73,74,75,78,79,80,81,82,83,84,85,86,88,89,90,92,94,95,99,101,102,103,104,105,106,108,109,110,111,112,113,115,116,118,120,122,124,125,126,127,129,130,131,132,133,134,135,136,137,138,139,140,141,143,145,147,149,150,151,152,153,155,156,158,163,164,165,166,167,168,169,170,173,174,175,176,179,180,181,183,185,187,191,193,194,197,200,202,203,204,205,211,214,218,219,229,231,232,233,236,237,238,244,245,249,250,254,255,257,259,265,268,270,271,272,274,275,277,282,285,288,289,292,293,294,297,310,313,314,315,316,317,319,320,321,322,324,325,326,327,332,333,334,335,336,338,339,341,342,343,347,355,360],namecolor:214,namedtupl:191,nameerror:[41,94],namelist:198,namesak:96,namespac:[68,124,136,194,232,250,320],narg:[113,232],narr:220,narrow:90,nativ:[34,41,87,101,208,310,360],nattempt:50,nattribut:[11,42,50,115,124,158,250,304,314,316,322,326],nattributehandl:314,natur:[11,15,27,54,78,87,111,145,328],natural_height:328,natural_kei:314,natural_width:328,navig:[9,47,48,50,105,110,127,132,133,220,360],naw:[24,51,140,260,273],nbsp:341,nchar:119,nclient:296,ncolumn:328,ncurs:140,ndb:[6,13,22,25,29,33,42,50,101,104,115,124,143,147,168,244,254,304,316,326],ndb_:[42,108,158,250],ndb_del:304,ndb_get:304,ndb_set:304,ndk:74,nearbi:[118,151,152,153,220],nearli:319,neat:[0,3,137,355],neatli:[107,342],necess:[39,94],necessari:[0,4,22,36,38,39,56,57,58,60,76,90,107,109,113,117,120,124,130,137,153,176,180,194,209,231,232,250,258,294,313,320,328,336,338,342],necessarili:[40,56,87,89,108,342],necessit:307,neck:[108,181],necklac:181,need:[1,2,3,4,5,6,8,9,10,11,13,14,15,19,20,21,22,23,25,26,27,28,29,30,31,33,34,35,36,37,38,39,40,41,42,43,44,45,47,48,49,50,53,55,56,57,58,59,60,61,62,63,64,65,67,68,69,70,71,72,73,74,75,76,78,79,80,81,82,83,84,85,86,87,88,89,90,92,93,94,95,96,97,99,101,102,103,104,105,108,109,110,111,112,113,114,115,116,117,118,120,121,122,123,124,125,126,127,129,130,132,133,134,135,136,137,139,143,145,147,151,153,155,158,163,164,166,169,173,174,178,179,185,186,188,192,193,194,195,199,202,203,204,205,214,216,217,218,219,220,226,229,230,231,232,233,239,240,244,245,249,250,257,265,267,269,270,274,282,289,294,296,304,305,306,310,313,314,316,319,320,322,326,327,328,329,334,336,337,339,342,360],need_gamedir:265,needl:202,neg:[61,125,151,324,342],negat:[113,118,240],negoti:[54,178,279,281,283,292,306],negotiate_s:281,neighbor:38,neither:[11,53,60,72,96,109,184,249,289,314,317,343],nenter:50,nest:[11,14,33,42,50,52,113,143,158,205,214,239,245,248,250,289,323,334],nested_mut:11,nested_r:158,nestl:110,net:[9,42,56,62,71,78,89,145,163,278,279,289,292,306],netrc:130,network:[39,42,54,63,64,69,70,71,78,89,102,112,138,145,163,276,277,282,303,306],neu:179,neutral:188,never:[12,14,26,27,31,33,50,53,55,59,60,61,63,79,85,87,90,94,95,103,113,114,117,118,120,124,126,130,132,143,193,204,205,219,220,229,240,245,304,323,334,342],nevertheless:[26,42,50,85,125,155,179],new_alias:153,new_arriv:231,new_attrobj:314,new_channel:57,new_charact:229,new_coordin:233,new_datastor:85,new_goto:326,new_kei:[106,153,245],new_loc:[42,158],new_menu:179,new_nam:[42,106,158],new_name2:[42,158],new_obj:[79,245,250],new_obj_lockstr:158,new_object:[108,250],new_pane_name1:136,new_pane_name2:136,new_raw_str:150,new_room_lockstr:158,new_ros:88,new_script:101,new_typeclass:[143,316],new_typeclass_path:124,new_valu:[83,314],newbi:[25,47,54,123,173],newcom:[95,116],newer:9,newindex:214,newli:[42,45,57,59,65,130,132,158,174,179,198,203,232,245,250,257,322],newlin:[24,33,42,136,165,320,328],newnam:[33,42,158,316],newpassword:[42,156],newstr:136,nexist:22,nexit:[119,126],next:[0,4,5,6,9,10,11,12,13,14,20,21,22,23,25,28,29,30,31,33,36,38,40,41,45,48,49,50,51,55,57,59,60,61,63,64,67,71,72,74,75,76,78,79,80,82,84,85,88,89,94,95,97,99,101,102,105,109,110,113,115,118,120,121,122,130,132,133,136,137,179,183,199,201,214,216,217,218,219,220,230,240,257,265,320,326,327,329,334,342,360],next_nod:50,next_turn:[216,217,218,219,220],nextrpi:78,nexu:44,nfkc:143,ng2:328,nginx:8,nice:[0,12,22,27,48,53,57,60,61,67,69,80,89,95,99,110,118,126,136,137,139,158,178,181,205,249],nicer:[20,59,95],niceti:[42,158],nick:[2,11,44,56,73,78,88,128,138,143,145,158,164,205,239,244,245,277,314,315,334,362],nick_typ:86,nickhandl:[11,86,314],nicklist:[145,277],nicknam:[42,86,88,128,130,164,205,244,245,277,314,315],nickreplac:314,nicktemplateinvalid:[314,334],nicktyp:[205,245],nifti:8,night:[57,60,131,137,186],nine:65,nineti:343,nit:[59,61],nline:335,no_channel:[31,33,151,326],no_default:[124,143,316],no_exit:[31,33,115,151,223,326],no_gmcp:289,no_log:152,no_match:179,no_mccp:278,no_more_weapons_msg:230,no_msdp:289,no_mssp:279,no_mxp:280,no_naw:281,no_obj:[31,151,223,326],no_superuser_bypass:[143,174,240,245,316],no_tel:79,noansi:169,nobj:119,nocaptcha:132,nocaptcha_recaptcha:132,nocolor:[80,270,285,288,293,294],nodaemon:105,node1:[50,326],node2:[50,326],node3:[50,326],node:[13,84,108,187,200,214,247,263,326],node_abort:50,node_apply_diff:247,node_attack:50,node_background:50,node_betrayal_background:50,node_border_char:326,node_destin:247,node_enter_password:200,node_enter_usernam:200,node_examine_ent:247,node_exit:50,node_formatt:[50,187,326],node_four:50,node_game_index_field:263,node_game_index_start:263,node_hom:247,node_index:[247,326],node_kei:247,node_loc:247,node_login:50,node_mssp_start:263,node_mylist:50,node_on:50,node_parse_input:50,node_password:50,node_prototype_desc:247,node_prototype_kei:247,node_prototype_sav:247,node_prototype_spawn:247,node_quit_or_login:200,node_readus:50,node_select:50,node_set_nam:50,node_start:263,node_test:50,node_usernam:50,node_validate_prototyp:247,node_view_and_apply_set:263,node_view_sheet:50,node_violent_background:50,node_with_other_nam:326,nodekei:326,nodenam:[50,326],nodetext:[50,187,247,326],nodetext_formatt:[50,187,247,326],noecho:[42,168],noerror:245,nofound_str:[143,205,245,342],nogoahead:287,nohom:322,nois:21,noisi:[89,262,267,275,285,288,310],noloc:[42,158],nomarkup:[73,80],nomatch:[22,167,179,324,334,342],nomatch_exit:22,nomatch_single_exit:22,nomigr:126,nomin:360,non:[4,6,14,15,20,22,27,29,31,33,42,43,48,49,51,54,57,60,61,62,63,64,67,69,73,81,85,87,101,104,108,109,113,123,124,125,130,136,138,139,143,145,147,149,151,158,168,174,176,184,194,203,211,213,214,230,236,244,245,249,250,254,255,256,257,258,259,265,274,288,289,303,304,306,314,316,319,322,323,324,326,328,334,339,342],nonc:293,nondatabas:[11,304,316],none:[0,1,2,10,11,13,14,15,22,25,30,31,33,34,38,39,40,41,42,43,48,49,50,55,57,59,61,63,68,73,76,79,80,82,83,84,85,86,87,90,95,101,104,110,111,113,115,117,118,120,122,143,144,145,150,151,152,153,155,158,159,160,161,162,165,166,167,169,172,173,174,175,176,178,179,180,181,184,186,187,188,191,193,194,196,197,200,202,203,204,205,211,213,214,216,217,218,219,220,223,229,230,231,232,233,235,236,239,240,242,244,245,247,248,249,250,252,255,256,257,259,262,263,265,267,271,274,275,276,277,284,285,293,294,304,305,306,308,309,310,313,314,315,316,317,319,320,321,322,323,324,325,326,327,328,329,332,334,335,337,338,339,342,343,347,350,355,360],nonpc:122,nonsens:204,noon:[20,59,72,75,79,95],nop:288,nopkeepal:[24,288],nor:[11,13,29,31,41,53,105,107,115,125,184,185,232,249,289,314,317],norecapcha:132,norecaptcha_secret_kei:132,norecaptcha_site_kei:132,norecaptchafield:132,normal:[2,3,5,6,9,10,11,13,14,15,19,20,21,23,25,27,29,30,31,33,34,42,43,45,48,50,52,54,55,56,57,59,61,63,65,67,68,71,73,74,75,79,80,81,82,84,85,86,87,89,92,95,96,99,101,103,104,108,109,110,111,112,113,115,118,120,121,122,124,125,126,127,133,134,136,137,139,143,145,147,149,150,152,153,155,158,165,168,173,174,178,183,184,196,216,217,218,219,220,229,232,233,244,245,247,250,257,259,265,274,277,278,279,281,283,297,304,306,312,314,315,316,319,320,323,326,327,332,334,339,341,342,344],normal_turn_end:115,normalize_nam:245,normalize_usernam:143,north:[0,20,22,42,43,45,48,88,110,113,120,158,179,199,212,297],north_south:110,northeast:[20,42,158,233],northern:[22,110],northwest:158,nose:314,not_don:310,not_error:265,not_found:158,notabl:[6,9,10,39,42,62,96,130,153,158,169,178,316,323,334,342],notat:[42,52,118,158,319,342],notdatabas:124,note:[0,1,2,4,5,6,9,11,12,13,19,20,21,23,24,25,27,29,40,41,42,47,48,56,57,58,59,60,61,62,63,68,69,72,73,74,75,79,82,84,85,87,88,89,92,93,94,95,99,101,102,104,105,106,108,109,112,113,114,115,116,118,120,122,123,124,125,127,129,130,132,133,134,135,136,140,143,145,150,151,152,153,155,158,159,160,164,165,166,168,169,170,173,174,175,178,180,181,182,183,184,185,186,188,193,194,196,197,199,200,201,202,203,204,205,211,212,214,216,217,218,219,220,223,225,226,231,232,233,239,240,244,245,249,250,257,259,262,265,270,274,275,277,278,282,283,284,285,288,289,290,292,293,296,298,299,304,306,310,311,314,315,316,317,319,320,321,322,323,324,325,326,327,328,329,332,334,335,337,338,339,342,348,361,362],notepad:62,notfound:342,notgm:57,noth:[0,10,11,14,20,22,27,29,33,34,41,55,56,59,61,82,84,88,94,107,110,114,115,126,143,158,167,214,216,219,220,229,233,245,257,277,314,316,326],nother:119,notic:[0,10,12,13,20,22,23,29,33,36,37,38,40,41,45,61,68,69,90,95,116,120,125,130,179,222,278,360],notif:[4,74,130,136,137,198],notifi:[42,97,163,216,217,218,219,220,231],notificationsconfig:4,notimplementederror:288,notion:[61,114,115],noun:[204,205],noun_postfix:204,noun_prefix:204,noun_transl:204,now:[0,2,3,5,6,9,10,11,12,14,20,21,22,23,25,27,28,29,31,33,36,38,40,45,47,48,50,54,55,56,57,59,60,61,62,63,64,68,70,71,72,74,75,76,78,79,80,81,84,85,88,89,90,94,95,96,97,99,101,102,104,105,107,108,109,110,113,114,116,117,118,120,122,124,125,126,127,130,132,133,134,135,136,137,139,152,178,183,187,194,196,214,225,233,240,245,277,285,306,338,340,342],nowher:[94,110],noxterm256:288,npc:[9,33,45,50,60,63,72,110,118,123,138,178,213,239,245,362],npcname:117,npcshop:84,nprot:119,nr_start:256,nroom:[22,119],nroom_desc:126,nrow:328,ntf:62,nuanc:113,nudg:[77,223,226,310],nuisanc:102,nulla:51,num:[48,79,205,245],num_lines_to_append:335,num_object:118,num_objects__gt:118,num_tag:118,number:[0,6,10,11,12,13,20,21,23,26,27,31,33,34,36,40,42,48,49,50,56,57,59,60,61,63,70,72,76,80,84,86,89,92,94,95,96,97,99,101,103,104,106,110,111,113,114,115,118,119,121,122,124,126,130,133,134,139,140,143,145,150,151,152,156,158,163,164,173,175,176,181,183,184,187,189,191,193,194,197,199,203,204,205,214,216,217,218,219,220,245,248,250,256,257,263,265,270,276,277,279,283,296,306,308,310,314,315,317,319,320,322,324,326,328,329,332,334,335,339,342,355],number_of_dummi:265,number_tweet_output:119,numbertweetoutput:119,numer:[60,72,96,189,319],numpi:298,o_o:137,obelisk:230,obfusc:[204,205],obfuscate_languag:[204,205],obfuscate_whisp:[204,205],obj1:[11,42,79,96,108,158,202,220],obj2:[11,42,79,96,108,126,158,202,220,320],obj3:[11,42,158],obj4:11,obj5:11,obj:[2,6,10,11,22,25,27,31,33,40,41,42,47,55,57,58,59,79,81,83,85,86,88,90,101,108,111,114,116,118,120,124,126,138,143,144,151,152,153,156,158,164,166,167,168,169,172,173,175,179,181,186,187,188,191,193,194,197,198,202,205,214,216,217,218,219,220,223,226,230,231,233,239,240,242,244,245,248,250,252,254,255,256,257,294,296,297,304,313,314,315,316,317,320,322,323,327,337,338,339,342],obj_desc:219,obj_detail:231,obj_kei:219,obj_prototyp:250,obj_to_chang:124,obj_typeclass:219,objattr:[230,239],objclass:[332,342],object1:33,object2:[33,178,245],object:[0,2,9,10,12,13,14,15,18,19,21,22,23,26,29,30,31,33,34,36,38,39,40,41,43,44,45,46,48,49,50,51,52,54,55,56,57,61,68,72,73,76,78,80,82,83,84,85,86,87,90,92,94,101,102,103,106,107,108,109,113,114,115,116,117,119,121,122,124,126,128,131,132,133,134,136,137,138,139,140,141,142,143,144,145,146,147,149,150,151,152,153,155,156,157,158,159,160,163,164,166,167,168,169,170,172,173,174,175,176,177,178,179,180,181,185,186,187,188,191,192,193,194,195,196,197,198,199,202,203,205,208,209,210,211,212,213,214,216,217,218,219,220,222,223,225,226,228,229,231,232,233,235,236,237,239,240,247,248,249,250,251,252,254,255,256,257,258,259,263,265,267,269,270,271,272,274,275,278,279,280,281,282,283,284,285,287,289,292,294,296,297,303,304,305,306,308,309,310,313,314,315,316,317,319,320,321,322,323,324,325,326,327,328,332,333,334,336,337,338,339,340,341,342,343,347,349,355,358,360,362],object_confirm_delet:360,object_detail:360,object_from_modul:342,object_id:133,object_search:133,object_subscription_set:244,object_tot:315,object_typeclass:[340,358],objectattributeinlin:242,objectcr:355,objectcreateform:242,objectcreateview:360,objectdb:[11,58,95,111,118,119,124,132,140,242,244,245,250,312,313,314,322,327,339],objectdb_db_attribut:242,objectdb_db_tag:[242,313],objectdb_set:[147,314,317],objectdbadmin:242,objectdbmanag:[243,244],objectdeleteview:360,objectdetailview:360,objectdoesnotexist:[147,176,237,244,254,272,314,317,333],objecteditform:242,objectform:355,objectmanag:[243,245,315],objectnam:[6,57],objects_objectdb:85,objectsessionhandl:[2,245],objecttaginlin:242,objectupd:355,objectupdateview:360,objid:79,objlist:[108,248],objlocattr:[230,239],objmanip:[42,158],objmanipcommand:158,objnam:[27,42,124,158],objparam:250,objs2:111,objsparam:250,objtag:239,objtyp:175,obnoxi:267,obs:316,obscur:[47,71,81,204,205],observ:[13,14,20,42,80,87,158,164,186,205,222,226,231,289,320,342],obtain:[0,33,38,62,76,89,90,92,99,179,230],obviou:[0,58,60,102,120,127,137,189,360],obvious:[0,4,14,48,54,104,107,120,317],occaecat:51,occas:127,occasion:[89,118],occation:328,occur:[9,10,25,33,41,56,59,101,136,167,174,203,218,232,240,245,297,326,335],occurr:[45,90,122,319],ocean:[89,121],odd:[22,48,60,102,125],odor:57,off:[0,11,14,20,23,24,29,31,33,36,39,40,42,48,49,50,54,60,63,65,73,79,80,85,87,89,99,102,106,107,109,113,114,122,125,134,137,138,143,153,163,168,169,173,174,181,187,199,200,205,226,229,231,240,245,270,278,285,288,304,316,319,320,322,324,326,327,328,334,335,343],off_bal:29,offend:12,offer:[1,4,11,14,22,26,28,31,33,34,37,38,39,42,43,49,50,54,55,56,58,61,63,71,72,73,75,82,85,86,88,89,90,95,101,105,107,108,110,113,114,115,122,123,126,127,128,130,131,136,137,151,152,157,158,168,178,179,186,204,231,247,255,306,326],offernam:178,offici:[71,99,102,126,130,335],officia:51,offlin:[9,15,78,89,108,157,174,320],offscreen:9,offset:[205,324,335],often:[2,5,10,11,15,22,26,28,31,33,39,40,41,42,45,47,48,50,52,56,58,60,61,63,75,85,87,89,90,92,94,95,96,101,102,103,104,111,113,114,115,118,127,130,145,151,156,166,167,168,174,179,214,216,217,218,219,220,223,225,240,244,254,256,265,270,284,304,314,316,320,322,328,335],ohloh:37,okai:[40,41,47,48,50,57,74,76,110,122,127,197],olc:[42,46,158,247,250],olcmenu:247,old:[0,1,5,9,21,25,27,31,38,42,49,50,54,55,57,59,62,79,80,84,87,89,104,105,110,113,121,122,124,125,127,137,143,151,152,155,158,173,178,196,205,240,245,250,274,315,316,319,322],old_default_set:126,old_kei:[106,245],old_nam:106,older:[2,9,24,54,62,63,78,104,158],oldnam:316,oliv:113,omiss:59,omit:[90,99,108],ommand:149,on_:179,on_bad_request:267,on_ent:[22,179],on_leav:[22,179],on_nomatch:[22,179],onbeforeunload:136,onbuild:99,onc:[0,2,5,6,9,10,13,16,21,22,23,25,33,34,37,38,39,40,41,42,45,46,48,50,54,56,57,59,60,61,62,63,71,78,79,82,84,88,89,92,94,95,96,99,101,104,107,113,115,118,120,121,124,125,127,130,132,136,143,145,150,153,158,163,166,167,169,174,178,179,187,188,194,198,199,200,202,204,211,214,216,217,218,219,220,222,226,229,230,231,232,233,245,249,254,257,270,275,288,292,303,314,319,326,335,340,342],onclos:[39,276,293],onconnectionclos:136,ond:317,one:[0,1,2,3,4,5,9,10,11,12,13,14,15,16,19,20,21,22,23,25,26,27,28,29,31,33,34,35,36,37,40,41,42,43,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,67,68,69,71,72,73,75,76,78,79,80,81,82,84,85,86,87,88,89,90,91,92,94,95,96,97,99,101,102,103,104,105,107,108,110,111,112,113,114,115,117,118,120,121,122,124,125,126,127,130,131,132,133,134,135,136,137,139,142,143,147,150,151,152,153,155,156,158,164,167,169,173,174,175,176,178,179,181,184,186,188,194,197,198,199,203,204,205,213,214,216,217,218,219,220,223,226,230,231,232,233,236,237,239,240,242,244,245,247,248,249,250,254,258,259,265,267,269,270,275,276,277,285,288,289,304,305,306,310,312,314,315,316,319,320,322,323,325,326,327,328,329,332,333,334,335,337,338,339,340,342,343,355,358,360],ones:[4,9,14,20,22,27,31,33,56,57,64,71,73,79,80,82,89,94,99,102,108,113,115,125,126,134,151,152,153,176,179,194,196,216,217,218,219,220,239,249,250,269,274,306,319,328,336],onewai:[42,158],ongo:[28,90,115,178,212],ongotopt:136,onkeydown:136,onli:[0,2,4,5,6,9,10,11,12,13,14,15,19,20,21,22,24,25,26,27,28,29,31,33,34,37,38,39,40,41,42,43,45,47,48,49,50,51,53,54,55,56,57,58,59,60,61,62,63,64,67,68,70,71,72,73,76,78,79,80,81,82,84,85,86,87,88,89,90,92,93,94,95,99,101,102,103,104,105,106,108,110,111,113,115,116,117,118,120,121,122,123,124,125,126,130,131,132,133,134,135,136,137,139,140,143,144,145,149,150,151,152,153,155,156,157,158,163,164,165,166,167,168,169,174,175,176,178,179,180,181,184,186,187,189,194,196,198,204,205,213,214,216,217,218,219,220,222,225,226,230,231,232,233,237,239,240,245,248,249,250,254,256,257,259,265,269,270,277,280,282,283,285,288,297,303,304,306,308,309,310,313,314,315,316,317,319,320,321,322,324,326,327,328,332,334,335,337,338,339,340,342,355,360],onlin:[7,12,15,21,37,40,42,54,56,57,59,60,63,64,67,68,69,70,72,76,78,88,95,97,100,103,107,115,122,127,128,138,140,155,163,174,179,187,279,320,361,362],onloggedin:136,onlook:245,only_tim:339,only_valid:250,onmessag:[39,276,293],onopen:[39,276,293],onoptionsui:136,onprompt:136,onsend:136,onset:[5,11],ontext:136,onto:[25,31,33,43,54,59,60,71,89,94,120,136,152,223,231,244,277,323,326],onunknowncmd:136,onward:106,oob:[24,30,33,44,82,103,136,137,138,143,145,165,188,245,270,288,289,293,294,306,362],oobfunc:103,oobhandl:332,oobobject:101,ooc:[2,57,101,104,113,122,143,147,155,158,159,163,166,176,180,198,245],ooccmdsetchargen:180,ooclook:[104,180,327],opaqu:[15,102],open:[0,3,4,5,9,20,22,23,26,31,34,37,41,45,49,54,56,57,59,62,63,64,68,69,70,71,72,74,78,79,89,94,95,102,104,105,110,113,115,122,129,130,132,133,137,158,165,168,178,179,187,211,212,220,223,225,226,230,239,308,314,322,335,342,361],open_lid:225,open_parent_menu:179,open_submenu:[22,179],open_wal:230,openhatch:78,openlidst:226,openlock:239,opensourc:319,oper:[9,11,12,14,22,27,33,40,41,42,45,50,56,58,59,60,62,63,71,73,79,81,87,88,89,94,95,96,101,109,111,114,118,123,125,130,136,138,143,149,151,153,155,158,163,168,174,179,184,205,226,230,240,245,248,250,259,262,265,274,275,279,281,285,287,288,294,296,297,304,305,314,315,316,319,322,326,328,332,342,362],opinion:[1,47],opnli:314,oppon:[11,72,217,219,229],opportun:[0,4,22,90,132,220],oppos:[27,88,102,109,113,304,317],opposit:[40,42,57,110,120,158,223],opt:[57,136,232],optim:[23,27,33,34,38,55,63,85,92,114,118,153,250,300,303,314],option100:50,option10:50,option11:50,option12:50,option13:50,option14:50,option1:50,option2:50,option3:50,option4:50,option5:50,option6:50,option7:50,option8:50,option9:50,option:[2,4,7,8,10,11,17,20,23,24,25,27,29,31,33,34,36,40,41,46,49,53,54,56,61,62,63,73,75,78,79,80,82,84,85,87,95,99,101,103,105,107,108,110,111,112,113,115,116,122,126,128,132,133,134,136,137,138,140,143,144,145,149,150,151,152,153,155,156,158,163,166,167,169,172,173,174,175,176,178,179,180,181,183,184,186,187,188,189,191,193,194,196,198,199,202,203,204,205,213,214,218,220,232,233,235,236,239,240,242,244,245,247,249,250,252,254,255,256,257,258,259,261,262,263,265,267,270,271,274,275,278,279,280,281,282,283,284,285,287,288,289,292,293,294,296,297,304,306,308,313,314,315,316,317,319,320,321,322,324,325,326,327,328,329,332,334,335,336,337,338,339,341,342,343,347,362],option_class:[140,321],option_dict:326,option_gener:326,option_kei:343,option_str:232,option_typ:337,option_valu:337,optiona:[143,262,316],optionclass:[140,141,318,321],optioncontain:321,optionhandl:[140,141,318,336],optionlist:[50,247,326],options2:136,options_dict:337,options_formatt:[50,187,247,326],optionsl:249,optionstext:[50,187,326],optlist:214,optlist_to_menuopt:214,optuon:204,oracl:[23,342],orang:[113,202,232],orc:[56,60,108,116],orc_shaman:108,orchestr:99,order:[0,2,5,6,9,10,11,13,14,22,27,31,33,36,37,38,42,43,48,49,50,57,59,60,61,62,63,67,68,69,70,79,83,86,88,92,101,103,108,110,112,113,115,118,120,121,122,125,126,127,129,130,132,133,135,136,137,143,149,153,159,164,165,168,169,172,178,179,180,181,182,184,187,202,203,205,216,217,218,219,220,226,229,230,231,232,235,239,240,242,245,250,252,261,276,288,293,297,304,314,316,319,320,326,327,328,335,339,342,360],order_bi:118,order_clothes_list:181,ordered_clothes_list:181,ordered_permutation_regex:205,ordereddict:[11,342],ordin:319,org:[89,203,232,281,287,293,319,342,355],organ:[5,6,9,22,68,72,79,88,101,107,110,111,118,123,128,130,131,153,169],orient:[54,56,63,95,123],origin:[0,4,9,21,25,29,40,42,48,50,54,56,59,74,75,78,80,88,90,95,101,102,104,105,118,130,135,137,145,151,158,179,196,198,204,205,232,245,249,250,274,316,319,326,334,338,341,361],oscar:[174,237,316],osnam:342,oss:105,ostr:[143,175,236,339],osx:[62,130],other:[0,1,2,4,5,6,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,24,25,27,28,29,31,34,36,37,38,39,40,42,43,45,46,47,48,49,50,52,54,56,57,58,59,60,61,62,63,64,67,68,69,70,72,73,75,79,80,81,82,84,85,86,87,88,90,94,95,96,99,101,102,104,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,122,123,124,125,126,127,130,132,133,134,135,136,137,138,139,143,149,150,151,152,153,158,164,165,166,169,170,175,178,181,183,185,187,193,196,198,204,205,209,211,214,216,217,218,219,220,223,226,231,232,233,237,240,244,245,249,250,255,257,259,263,269,270,274,276,277,283,285,288,297,304,305,307,314,316,318,319,320,322,324,325,326,327,328,334,336,337,339,342,343,360],otherroom:211,otherwis:[0,4,11,15,23,25,27,29,31,33,37,38,40,41,42,50,58,61,67,68,75,77,82,85,88,89,90,94,96,99,101,102,104,108,113,120,122,130,134,140,150,151,155,158,174,178,182,186,187,191,194,205,216,217,218,219,220,233,240,245,248,249,250,257,265,276,277,285,304,308,309,313,319,326,327,334,335,339,340,342,360],our:[2,3,4,8,9,11,14,16,20,21,23,25,26,30,31,33,36,37,38,39,40,41,42,43,45,48,54,56,57,58,59,60,61,62,63,69,71,72,74,76,77,78,79,80,81,82,84,87,89,90,97,99,100,102,110,114,115,116,118,122,123,126,127,128,130,131,133,134,135,136,137,139,147,152,166,167,186,199,214,229,230,233,240,255,310,313,335,361],ourself:122,ourselv:[0,20,57,79,86,117,131,137,143,180,278,279,281,292],out:[0,1,3,6,8,9,10,12,13,14,15,16,17,19,20,21,22,23,25,26,28,29,33,34,37,38,40,41,42,43,44,45,46,47,48,50,53,54,55,56,58,59,60,61,62,63,65,68,69,70,76,78,79,85,87,88,89,90,92,94,95,96,99,101,103,104,107,108,110,113,115,116,118,120,121,122,125,126,128,130,132,134,136,137,138,142,143,150,151,155,157,158,178,180,183,185,187,198,204,205,208,209,211,212,216,217,218,219,220,226,230,239,249,250,257,265,267,289,293,294,296,305,306,313,314,323,325,326,328,334,341,342,355],out_templ:[314,334],outcom:[72,85,184,240,245,249],outdat:8,outdata:[39,306],outdoor:[111,118,121,131,231],outer:328,outermost:[11,29,73],outerwear:181,outfunc_nam:39,outgo:[87,89,95,104,145,196,245,277,289,305,342],outgoing_port:89,outlet:89,outlin:[36,42,110,132,276],outmessag:245,output:[4,14,20,22,26,27,34,39,42,50,51,57,73,78,87,90,94,95,99,104,105,107,109,110,112,113,115,119,120,122,125,127,128,134,136,137,153,158,165,168,169,177,179,183,188,206,207,209,216,217,218,219,220,249,265,270,285,289,297,304,319,327,335,338,342],outputcmd:289,outputcommand:[73,82],outputfunc:[39,58,82,245,270,276],outputfunc_nam:[39,270],outputfunct:82,outrank:315,outright:[12,89],outro:[121,231],outroroom:231,outsid:[0,13,15,20,21,38,56,63,72,87,95,99,103,107,108,109,111,120,133,203,219,229,239,289,304,305,314,317,328],outtempl:[314,334],outtxt:27,outward:[48,89],over:[1,6,8,11,13,14,15,16,17,27,28,31,33,34,36,37,38,39,42,44,47,48,50,52,53,56,57,58,59,60,72,76,80,82,84,87,89,92,93,95,96,99,102,104,107,110,111,112,113,114,115,117,118,124,125,126,127,128,132,135,136,137,143,152,163,173,175,187,199,211,214,216,217,218,219,220,226,231,259,269,283,285,288,290,294,296,298,311,316,320,332,338,342,360,361],overal:[10,55,56,67,70,85,89,151,166,167,217],overcom:110,overhead:[23,27,34,112,131,205,233,314],overhear:204,overlap:[31,61,204,319,328],overload:[5,22,30,31,33,39,43,46,50,54,56,59,73,75,88,95,96,103,113,114,116,122,135,143,151,153,167,174,179,180,186,188,202,205,211,212,216,217,218,219,220,229,230,231,232,245,250,259,269,288,305,324,326,327,328,336],overrid:[1,3,4,9,20,21,22,25,31,36,42,50,53,67,68,79,82,90,95,101,104,106,108,116,117,120,134,135,136,143,153,158,165,169,174,175,179,186,194,196,204,218,220,231,232,240,245,250,257,288,306,310,313,314,327,332,335,336,339,360],overridden:[4,39,95,135,137,143,158,179,232,360],override_set:106,overriden:[143,165,205],overrod:16,overrul:[2,79,143,152,205,245,328],overseen:72,overshadow:60,overshoot:342,oversight:56,overview:[15,16,18,23,44,45,56,67,76,95,102,138,362],overwhelm:[45,60],overwrit:[5,42,75,135,137,158,165,283,315,360],overwritten:[33,133,231,317],owasp:355,own:[1,3,4,5,6,8,9,10,11,13,17,19,20,21,22,25,26,27,29,30,31,34,37,40,42,44,46,50,52,54,56,60,61,62,63,67,70,71,74,75,76,77,79,80,82,84,85,86,87,90,92,94,95,97,100,101,102,103,104,106,107,108,110,111,113,118,120,121,122,123,124,126,127,128,130,131,132,133,134,135,137,138,147,149,150,151,152,158,163,166,181,183,186,187,198,200,204,205,209,216,217,218,219,220,230,232,233,239,240,245,250,270,297,305,316,319,320,321,327,328,332,335,336,340,342,360,362],owner:[4,19,79,84,143,240,336],owner_object:79,ownership:[89,99],p_id:132,pace:[121,229],pack:[82,274],packag:[8,9,23,40,46,52,62,63,71,74,77,87,89,92,95,96,99,107,126,127,134,140,142,148,154,171,177,228,234,238,241,251,260,265,274,289,293,312,318,344],package_nam:63,packagenam:63,packed_data:[262,274,275],packeddict:[96,316],packedlist:[96,316],packet:[82,285],pad:[17,113,319,328,334,342],pad_bottom:328,pad_char:328,pad_left:328,pad_right:328,pad_top:328,pad_width:328,page:[7,8,9,12,13,14,16,17,20,21,23,25,26,28,31,33,36,37,39,44,47,50,51,54,56,57,58,59,60,63,69,71,72,74,75,76,78,79,80,87,88,89,93,95,98,99,100,102,103,105,107,109,123,124,125,126,128,129,130,132,133,136,137,138,163,164,174,237,239,242,252,294,313,316,326,327,342,344,353,360,361,362],page_back:327,page_ban:163,page_end:327,page_formatt:327,page_next:327,page_quit:327,page_titl:360,page_top:327,pagelock:239,pageno:327,pager:[51,138,327],pages:[50,326],pagin:327,paginate_bi:360,paginator_index:327,paginator_slic:327,pai:[55,84,89,102,230,239],paid:89,pain:[89,137],painstakingli:13,pair:[31,82,115,136,137,143,151,181,239,245,306,355,360],pal:86,palett:125,pallet:110,palm:187,pane:[42,87,136,137,170,185],pane_name_to_cut_apart:136,pane_to_set:136,panel:105,panic:108,paper:[60,78,115],paperback:72,par:23,paradigm:[9,60,117,217],paragraph:[14,27,201,320,328,342],parallel:[56,61,68,315],paralyz:218,param:[158,245,257,259,267,277,310,335,343],paramat:[143,153,245,304],paramet:[0,22,24,31,36,38,41,45,48,61,90,99,105,118,126,140,143,144,145,149,150,151,152,153,158,165,172,173,174,175,176,178,179,181,183,184,186,187,188,189,191,192,193,194,196,197,198,199,203,204,205,208,209,211,214,216,217,218,219,220,225,231,232,233,236,240,242,244,245,247,249,250,252,255,256,257,258,259,262,263,264,265,267,269,270,271,272,274,275,276,277,278,279,280,281,282,283,284,285,287,288,289,290,292,293,294,296,302,303,304,305,306,308,309,310,314,315,316,317,319,320,321,322,323,324,325,326,327,328,329,332,334,335,336,337,339,340,341,342,343,347],paramount:126,paramt:343,paremt:250,parent1:108,parent2:108,parent:[2,6,22,25,27,31,33,39,42,43,59,63,80,88,95,108,113,117,120,122,124,139,147,155,158,166,168,179,196,205,214,232,239,244,245,249,250,254,314,315,316,324,333,335,342,360],parent_categori:214,parent_kei:[22,179],parent_model:[144,172,235,242,252,313],parentesi:334,parenthes:94,parentlock:239,pari:[78,89],pariatur:51,paricular:33,park:179,parlanc:3,parri:[115,230],parrot:117,pars:[3,15,31,33,39,42,49,50,62,80,82,87,96,103,107,108,113,122,123,128,133,138,148,149,150,153,158,164,165,166,167,168,169,173,178,179,184,185,186,198,205,208,209,210,214,230,231,232,240,245,248,249,250,270,277,280,289,293,294,314,319,320,324,325,326,334,341,342,362],parse_ansi:319,parse_ansi_to_irc:277,parse_fil:320,parse_html:341,parse_inlinefunc:334,parse_input:326,parse_irc_to_ansi:277,parse_languag:205,parse_nick_templ:[314,334],parse_opt:214,parse_sdescs_and_recog:205,parseabl:249,parsed_str:277,parseerror:232,parser:[33,40,46,78,103,107,108,133,149,150,155,158,166,167,173,185,186,202,204,205,230,232,248,249,284,319,334,341],parsestack:334,part1:202,part2:202,part:[1,4,5,9,11,13,14,15,16,20,22,23,26,29,33,36,37,38,39,40,41,43,44,45,47,48,50,56,57,59,60,67,68,69,72,75,79,84,85,87,89,90,91,93,94,101,104,105,110,113,115,116,118,121,122,123,124,126,130,134,135,136,137,138,139,150,151,153,166,167,169,174,178,179,184,202,205,214,219,236,239,240,248,249,265,269,294,305,308,310,314,315,319,320,324,326,334,342,362],part_a:178,part_b:178,parth:290,parti:[8,9,13,23,27,37,41,63,71,74,89,100,113,127,133,176,178,184],partial:[25,67,93,204,249,267,280,306,337,339,342,343],particip:[40,102,216,217,218,219,220],particular:[5,8,12,13,14,20,22,28,31,39,40,42,43,47,57,58,63,67,69,71,73,74,78,79,82,84,87,88,92,95,96,103,104,106,111,112,113,117,118,120,123,124,130,131,134,138,143,150,151,158,175,186,209,218,219,226,236,239,240,245,254,306,308,316,332,339,360],particularli:[0,4,12,38,50,54,126,166,205,250,269],partit:319,partli:[11,31,46,85,128,151],party_oth:178,pass:[4,10,21,23,25,27,28,29,30,33,36,39,42,48,50,51,61,68,73,79,81,82,84,87,89,90,94,95,99,104,106,108,109,110,114,116,118,120,124,126,129,133,137,138,143,145,151,170,181,183,184,187,188,193,199,208,209,211,214,216,217,218,219,220,230,239,240,245,249,255,259,263,275,283,285,288,293,294,304,310,314,316,325,326,327,328,334,335,336,337,338,341,342,360],passag:[82,115,181,230,231,329],passant:125,passavataridterminalrealm:285,passiv:[29,115,132],passthrough:[1,31,257],password1:[144,355],password2:[144,355],password:[4,9,12,23,35,36,50,63,73,79,102,130,138,143,144,155,156,170,185,200,203,209,270,285,288,309,322,347,355],password_chang:358,passwordresettest:358,past:[0,13,20,26,37,45,49,57,61,68,95,103,107,110,115,122,132,136,218,311,320,329,360],pastebin:37,patch:[124,340],path:[0,2,4,8,14,20,21,22,27,29,38,39,42,44,47,50,52,58,59,62,63,65,66,73,79,84,85,87,88,89,94,95,99,101,104,105,108,113,116,117,118,120,122,123,124,133,134,135,137,138,143,145,147,150,151,152,157,158,159,160,161,162,163,168,174,176,178,179,180,181,183,184,186,188,194,196,197,199,200,202,203,204,205,211,212,213,216,217,218,219,220,222,223,225,226,229,230,231,233,237,244,245,249,250,254,256,257,259,265,272,274,283,290,296,298,302,306,310,314,315,316,320,322,324,325,326,327,329,332,333,339,342,360],path_or_typeclass:197,pathnam:340,patient:[20,69],patreon:69,patrol:229,patrolling_pac:229,patron:[37,69],pattern:[3,4,16,68,86,132,133,134,139,156,205,309,342],paul:124,paus:[10,38,45,50,99,101,109,115,193,257,342],pausabl:342,pauseproduc:267,paxboard:78,payload:[276,293],paypal:[37,69],pdb:[138,140],pdbref:[79,239],pdf:78,peac:116,peek:[20,26,50,90],peer:[276,293],peform:270,peg:102,pem:66,pemit:[42,107,156],penalti:[85,218],pend:310,pennmush:[56,107,128],pentagon:102,peopl:[2,20,21,26,37,42,53,54,57,60,63,67,70,71,72,78,79,80,84,89,94,95,96,102,107,113,115,118,138,164,185,205,230,231,313,322],pep8:26,per:[2,4,11,19,33,40,46,50,57,59,61,63,68,82,85,88,92,99,104,108,115,118,122,137,143,174,186,204,216,217,218,219,220,229,278,279,281,289,292,308,326,327,328,332,335,336],perceiv:61,percent:[33,342],percentag:[115,315,342],percentil:342,perception_method_test:301,perfect:[49,54,60,74,99,130],perfectli:[4,68,95,111,128,137,319],perform:[11,13,14,22,23,25,38,40,41,42,51,54,58,70,73,74,79,88,90,92,96,101,102,113,115,116,122,132,133,149,151,155,158,163,174,179,181,187,193,194,205,208,214,216,217,218,219,220,226,245,248,254,255,274,288,296,297,314,315,316,323,334,336,339,342,343,355],perhap:[16,22,41,45,61,68,76,90,93,96,107,137],period:[89,94,95,99,102,126,127,129,342],perist:[34,124],perm:[4,11,12,19,22,25,33,57,67,70,79,84,108,111,122,132,147,156,157,158,163,164,165,168,186,192,202,211,231,237,239,240,244,245,254,314,316],perm_abov:[79,239],perm_us:156,perman:[4,5,12,21,24,25,31,42,50,84,89,95,121,122,137,143,151,152,155,158,163,164,168,196,204,245,258,316],permiss:[2,4,7,8,9,11,12,18,20,21,23,25,31,40,42,44,65,67,69,70,74,92,107,108,122,132,138,143,144,146,147,151,153,155,156,157,158,164,166,167,174,192,196,205,220,237,239,240,244,245,249,250,254,314,315,316,317,320,322,335,339,360,362],permission_account_default:[79,296],permission_func_modul:239,permission_guest_default:65,permission_hierarchi:[19,79,239,240],permissionerror:249,permissionhandl:[132,317],permissionshandl:313,permit:[40,77,158,309],permstr:[79,143,316,322],permut:205,perpetu:92,persis:29,persist:[0,6,21,22,27,31,33,34,42,50,54,55,56,59,63,78,83,85,88,101,103,104,108,109,114,115,120,122,124,143,147,158,168,174,175,176,179,183,187,194,204,205,212,214,216,217,218,219,220,226,230,237,244,245,247,248,249,254,255,256,257,258,259,270,271,272,303,304,312,316,322,324,326,328,329,342],person:[12,21,42,60,62,69,72,89,101,104,117,128,138,143,158,164,178,184,205,225],persona:95,perspect:[72,75,76,104],pertain:[102,125,135,348],pertin:[67,132],perus:[52,136],peski:84,pester:[56,60],phase:[48,60],philosophi:79,phone:[16,63,74,138,203],phone_gener:203,phonem:204,php:[107,355],phrase:[45,197],phrase_ev:197,physic:[2,48,219,229],pick:[6,9,13,15,20,21,31,33,35,37,38,42,50,54,61,67,71,72,79,84,89,94,95,99,101,103,105,110,118,131,150,155,158,164,166,167,173,181,189,196,205,220,223,230,231,245,297],pickl:[11,29,82,114,255,259,262,272,274,275,314,315,323,324,326,338],pickle_protocol:338,pickledfield:338,pickledformfield:[313,338],pickledobject:338,pickledobjectfield:338,pickledwidget:338,picklefield:[140,141,313,318],pickpocket:[42,165],pickup:[196,220,245],pictur:[21,39,56,105,137],pid:[36,79,99,109,130,132,239,245,265,275,342],piddir:36,pidfil:265,piec:[10,13,58,60,63,92,121,202,292,320],pierc:230,piggyback:143,pile:[152,320],pillow:74,ping:[145,265,277],pink:118,pip:[9,23,26,41,46,52,58,62,64,70,74,92,95,96,97,99,126,127,129,132,140],pipe:[104,277,323],pitfal:[14,26,113,125],pixel:24,pizza:[147,176,237,244,254,314,316,317],pkg:74,pki:8,place:[0,2,3,4,5,8,9,11,14,15,20,21,25,26,30,37,40,42,45,48,50,52,54,61,62,63,68,70,72,74,75,79,82,88,89,90,94,95,99,101,102,103,104,108,110,120,122,123,125,127,128,130,131,132,134,135,137,143,156,158,164,178,179,181,183,187,196,202,205,208,216,217,218,219,220,230,231,233,245,257,274,283,288,304,305,306,320,321,323,326,342],placehold:[133,240,245,328],plai:[0,2,11,14,19,22,29,38,45,54,57,60,63,67,72,74,80,82,89,90,94,104,110,113,115,120,121,122,123,131,132,137,143,216,220,289,306,322],plain:[13,14,57,85,87,122,178,179,201,250,270,296,323,360],plaintext:209,plan:[9,14,15,39,40,41,44,54,55,89,93,95,99,123,124,138,320,362],plane:120,planet:[61,78],plant:232,plate:[81,124,203],platform:[9,16,55,62,89,101,105,130],playabl:[132,358],player:[9,10,11,12,19,20,21,22,25,29,31,34,39,40,42,50,53,54,57,59,60,63,64,67,70,72,76,79,80,82,84,89,90,92,94,96,97,104,107,109,110,111,112,115,116,117,118,119,120,121,122,123,132,136,137,138,152,155,158,163,168,175,178,179,187,189,197,198,199,202,204,205,209,213,214,219,220,231,232,233,236,254,279,288,305,320,325,342,355,360],playernam:70,playerornpc:9,pleas:[4,5,8,16,17,26,31,37,42,50,62,69,70,71,74,77,89,92,93,108,110,113,116,117,119,123,124,126,130,132,136,168,267,296,332,338,355,361],pleasur:16,plenti:[14,54,59,128],plot:298,plu:[22,27,42,63,105,168],pluck:33,plug:[95,102,106,135,233],plugin:[4,39,44,46,54,71,78,82,103,107,137,205,263,362],plugin_handl:136,plugin_manag:136,plural:[19,57,79,219,245],png:135,pobject:225,pocoo:342,point:[0,2,4,5,8,13,14,15,20,21,22,25,27,29,31,33,34,36,37,38,41,42,48,50,54,55,59,60,61,62,68,72,74,80,82,84,85,87,88,89,90,92,94,96,99,101,103,104,105,111,112,114,115,120,122,124,126,129,130,132,133,134,135,137,138,143,149,153,158,166,167,168,178,188,196,199,205,211,216,231,232,233,245,247,249,259,265,269,283,285,293,304,306,313,314,316,320,326,334,342,360],pointer:[26,48,55,90],pointless:[6,10,88,114],poison:[218,250],poke:118,pole:202,polici:[42,44,89,93,102,138,209,237,309,314],polit:102,poll:[39,135,155,229,265,294],pong:277,pool:[23,31,114,259,310,323],poor:[47,57],poorli:102,pop:[10,23,25,47,52,57,84,105,137],popen:275,popul:[22,23,36,40,56,60,61,80,123,134,137,151,159,160,161,162,179,181,186,202,205,213,216,217,218,219,220,223,229,230,231,258,259,313,320,324,325,327,334],popular:[9,56,63,78,102,107,360],popup:[136,137],port:[0,8,9,23,36,42,53,54,62,66,71,93,99,100,109,145,163,274,277,285,297,306,310],portal:[39,42,44,46,78,87,88,89,92,93,102,103,105,109,120,127,136,138,140,141,145,168,182,260,262,265,303,304,305,306,329,335,342,362],portal_connect:306,portal_disconnect:306,portal_disconnect_al:306,portal_l:275,portal_pid:[275,342],portal_receive_adminserver2port:275,portal_receive_launcher2port:275,portal_receive_server2port:275,portal_receive_statu:275,portal_reset_serv:306,portal_restart_serv:306,portal_run:265,portal_service_plugin_modul:39,portal_services_plugin:[39,103],portal_services_plugin_modul:39,portal_sess:39,portal_session_sync:306,portal_sessions_sync:306,portal_shutdown:306,portal_st:265,portal_uptim:329,portallogobserv:335,portalsess:[39,104,283],portalsessiondata:306,portalsessionhandl:[39,140,260,273,284,306],portalsessionsdata:306,portion:[76,179,189],pose:[29,57,115,164,174,194,205],pose_transform:174,poser:174,posgresql:23,posit:[13,20,22,38,48,50,90,110,115,125,136,137,138,152,170,179,185,199,201,220,230,231,232,233,258,319,320,323,324,328,342,343],positive_integ:343,positiveinteg:336,posix:[335,342],possess:[7,76,188],possibl:[0,5,9,10,11,22,23,25,26,31,33,34,37,38,42,45,49,50,54,56,57,62,63,65,72,73,74,75,79,90,92,99,101,103,104,108,110,111,113,115,122,125,126,127,130,133,135,137,140,143,147,149,151,158,166,167,178,186,193,196,199,202,204,205,213,226,229,231,233,239,240,245,248,249,250,255,259,270,290,294,304,306,315,317,319,322,324,325,326,328,338,339,342],post:[5,31,34,37,54,56,57,60,62,68,69,70,79,97,106,110,119,132,135,209,294,360],post_delet:106,post_init:106,post_join_channel:174,post_leave_channel:174,post_migr:106,post_sav:106,post_send_messag:174,post_text:189,post_url_continu:[144,172,242],postfix:204,postgr:[23,63],postgresql:[54,342],postgresql_psycopg2:23,postinit:136,posttext:187,postupd:[70,119],pot:12,potato:[24,232],potenti:[10,11,13,26,40,81,82,89,97,110,113,115,122,153,175,209,210,239,240,245,249,336,339,342],potion:[76,316],power:[15,19,20,29,30,31,33,41,42,45,49,50,54,55,57,60,63,79,88,95,108,110,115,121,122,136,137,151,152,157,158,214,219,232,320,326,342],powerfulli:0,pperm:[12,40,42,70,79,132,155,163,202,239,245],pperm_abov:239,pprofil:265,pprogram:265,practial:15,practic:[0,13,14,22,26,29,33,34,36,37,56,57,62,63,69,79,88,89,95,104,108,118,123,125,130,138,320,362],pre:[33,42,46,48,53,60,62,70,88,89,110,113,137,143,158,165,204,240,245,249,250,293,294,324,338],pre_delet:106,pre_init:106,pre_join_channel:174,pre_leave_channel:174,pre_migr:106,pre_sav:[106,338],pre_send_messag:174,pre_text:189,preced:[19,31,40,95,108,113,118,151,153,173,214,245,250,315,328],precend:149,precis:[11,95,125,319],predefin:[120,309],predict:[124,132],prefac:118,prefer:[21,22,23,31,37,42,46,54,56,70,79,89,90,95,105,108,110,122,130,136,137,151,153,156,174,179,205,217,229,236,245],prefix:[20,22,23,41,75,85,96,102,124,144,150,167,174,189,204,235,242,270,277,313,319,334,335,339,342,355],prefix_str:25,prematur:[27,92,178,257],prepai:89,prepar:[3,48,56,86,108,126,143,205,216,217,218,219,220,229,254,323,338],prepend:[198,205,245,319,320,326,342],prepopul:[313,360],preprocess:158,prerequisit:[9,36],prescrib:[54,56],preselect:137,presenc:[9,17,23,54,55,89,121,123,125,135,143,245,310,344],present:[1,4,8,22,41,45,47,48,50,61,68,76,84,90,95,96,103,104,115,122,130,137,179,187,189,203,204,213,214,232,250,324,342],preserv:[125,166,167,316,319,320,335,342],press:[9,14,15,22,26,31,33,41,50,52,62,79,82,87,94,95,99,105,109,179,223,225,226,230,263,326],press_button:225,pressabl:226,pressur:81,presto:20,presum:[61,72,152,335,336],pretend:74,pretext:187,pretti:[0,22,25,26,37,38,40,59,63,71,84,87,88,89,115,120,122,125,130,132,137,153,181,203,234,240,249,325,327,336,342],prettier:[0,355],prettifi:[56,342],prettili:61,pretty_corn:328,prettyt:[27,81,328],prev:50,prev_entri:50,prevent:[11,20,33,45,61,94,193,220,232,313,327,360],previou:[0,10,11,14,16,22,29,31,33,40,41,50,51,57,59,61,68,79,84,85,86,90,94,95,99,103,106,113,118,122,125,173,214,231,247,257,326,335,360],previous:[20,31,34,42,48,49,71,73,90,101,103,113,118,126,132,135,153,156,158,178,199,270,286,290,297,306,317],prgmr:89,price:[89,230],primari:[17,99,124,132,205,245,314,339],primarili:[2,12,34,36,37,54,60,107,143,178,205,236,283,323,342],primary_kei:132,prime:[149,178],primit:[42,60,158,249],princess:[110,121],principl:[2,9,19,26,30,33,37,39,42,50,54,56,59,79,84,88,89,95,97,118,122,131,137,152,155,178,231],print:[4,9,10,11,21,25,26,27,39,41,42,49,50,52,57,58,85,90,94,95,96,109,112,124,155,184,204,232,249,264,265,325,326,327,328,334,335,342],print_debug_info:326,print_help:232,print_usag:232,printabl:291,printout:288,prio:[25,31,33,149,231],prior:[116,193,245],priorit:204,prioriti:[4,25,31,33,43,50,96,115,151,155,159,160,161,162,166,167,179,200,230,231,245,324,326,327],privat:[4,8,42,56,60,68,89,130,163,164,175,277,290],private_set:9,privatestaticroot:310,privileg:[21,23,42,59,62,64,71,97,122,164,205,233,245,316],privkeyfil:285,privmsg:277,prize:121,proactiv:114,probabl:[4,5,11,16,21,22,23,25,29,33,37,45,47,50,54,56,60,63,66,68,84,85,88,89,95,107,115,118,120,127,132,133,135,137,179,197,203,231,267,277,285,332,342,343],problem:[11,13,15,21,22,23,25,26,27,36,42,55,60,63,68,69,74,76,79,89,94,96,99,102,109,110,112,126,137,139,143,152,194,245,274,320],problemat:[25,342],proce:[14,15,99,120,125,292,360],procedur:[137,214,285,288],proceed:[130,342],process:[0,4,8,9,11,13,14,15,22,23,25,29,33,36,38,40,41,42,48,50,54,58,60,63,72,74,75,82,87,88,89,90,91,92,93,99,105,121,130,132,137,138,143,149,151,158,168,178,199,205,214,232,238,240,245,249,255,265,270,274,275,282,285,288,293,294,303,304,306,319,320,323,326,336,341,342,343,360,362],process_languag:205,process_recog:205,process_sdesc:205,processed_result:342,processj:[314,334],processor:[18,42,92,109,110,138,140,141,157,168,199,318,362],procpool:342,produc:[33,42,50,95,113,122,130,155,158,202,204,230,233,245,249,250,264,296,314,316,325,326,334,342],produce_weapon:230,producion:27,product:[23,26,36,89,92,102,105,127,130,134,296,299,326],production_set:9,prof:92,profession:[3,56,63,107],profil:[44,64,138,140,141,144,147,187,260,362],profile_templ:187,profit:137,profunc:108,prog:232,progmat:55,program:[2,10,15,23,42,52,55,56,62,63,69,74,76,78,85,89,91,92,94,95,99,102,105,107,109,113,123,126,127,168,232,260,265,288,294,296],programm:[90,94],programmat:[113,137],progress:[69,72,78,84,93,130,216,217,218,219,220,324,362],proident:51,project:[4,15,25,37,48,63,69,71,76,78,90,98,107,110,123,126,130,134,135,336],projectil:219,promis:26,promisqu:125,prompt:[9,23,24,26,41,53,62,63,74,82,87,95,99,110,123,124,136,138,153,214,263,277,288,293,294,320,326,362],promptli:14,prone:[1,127,152,316],pronoun:188,prop:60,propag:[8,269,338],proper:[15,21,23,27,36,38,42,43,55,56,60,63,84,90,95,99,102,115,122,126,130,132,134,136,137,158,178,179,195,204,325],properli:[9,29,57,61,68,83,105,107,116,124,125,126,127,129,130,132,139,153,178,210,231,239,259,285,342,360],properti:[5,6,13,22,25,38,42,52,54,55,56,58,60,67,72,79,80,83,85,86,95,96,103,108,109,110,114,115,118,120,122,125,126,143,144,145,147,153,155,158,166,168,169,172,174,176,179,187,191,193,202,205,214,216,218,219,220,229,230,231,232,233,235,237,239,240,242,244,245,249,250,252,254,256,257,261,270,272,277,283,297,304,305,306,313,314,316,317,321,323,326,336,337,338,339,342,355,360],propnam:122,propos:[49,137],proprietari:23,propval:122,propvalu:122,prosimii:[132,133],prospect:60,prot:250,prot_func_modul:[108,248],protect:[6,31,42,89,158],protfunc:[140,141,246,249],protfunc_modul:249,protfunc_pars:249,protfunct:249,protkei:[108,248,249],proto:[274,285],proto_def:202,protocol:[24,27,33,42,46,63,71,73,78,82,89,91,93,100,102,103,104,109,136,138,143,145,153,156,188,209,245,260,262,265,267,270,274,275,276,277,278,279,280,281,283,284,285,287,288,289,290,292,293,294,296,303,304,305,306,324,338,342,362],protocol_flag:[287,288,292,304],protocol_kei:305,protocol_path:[283,306],protodef:202,prototocol:[42,168],protototyp:[247,249,250],protototype_tag:108,prototoyp:248,prototyp:[42,44,45,46,54,119,138,140,141,158,168,202,217,218,230,362],prototype1:250,prototype2:250,prototype_:108,prototype_desc:[108,250],prototype_dict:[42,158],prototype_diff:250,prototype_diff_from_object:250,prototype_from_object:250,prototype_kei:[42,108,158,249,250],prototype_keykei:[42,158],prototype_lock:[108,250],prototype_modul:[42,108,158,249,250],prototype_par:[42,108,158,250],prototype_tag:250,prototype_to_str:249,prototypefunc:250,protpar:[249,250],protpart:249,provid:[0,3,4,11,12,16,17,22,25,29,33,36,40,42,46,54,66,68,74,76,89,90,95,96,99,101,102,107,108,118,123,124,125,126,130,132,133,135,136,137,143,153,158,163,174,179,181,187,189,192,199,202,203,214,216,217,218,219,220,232,233,239,245,257,285,308,315,326,336,337,338,342,343,355,360],provok:[41,78],proxi:[46,59,93,102,124,310,313],proxypass:8,proxypassrevers:8,prudent:36,prune:31,pseudo:[39,48,90,107,203,204],psionic:219,psql:23,psycopg2:23,pty:9,pub:40,pubkeyfil:285,publicli:[53,60,78],publish:[21,36,78,99],pudb:140,puff:55,pull:[25,31,33,36,37,63,99,127,130,135,197,226,230,267],punch:31,punish:220,puppet:[2,9,19,21,22,31,33,38,39,40,42,54,56,57,61,73,79,95,96,104,106,113,117,122,132,142,143,149,155,158,166,180,196,198,239,245,304,306,316,334,358,360],puppet_object:[2,143],purchas:84,pure:[45,55,87,113,124,125,254,265,314,319],pure_ascii:342,purg:[11,42,109,124,168],purpos:[4,11,82,89,91,94,111,118,122,125,132,145,149,153,184,193,285,314,323,326,342],pursu:[121,229],push:[22,75,99,102,125,197,223,225,226,230],pushd:62,put:[0,2,3,5,6,10,12,13,14,19,20,21,23,25,33,37,41,42,45,48,49,50,56,57,59,60,63,69,72,76,78,79,82,84,85,86,88,89,94,95,101,102,103,104,105,108,110,113,115,120,121,122,124,126,128,132,134,135,137,152,155,156,158,160,164,180,181,187,189,205,214,216,217,218,219,220,222,226,240,274,288,327,328,342],putti:89,puzzl:[78,121,140,141,177,230,231],puzzle_desc:230,puzzle_kei:231,puzzle_nam:202,puzzle_valu:231,puzzleedit:202,puzzlerecip:202,puzzlesystemcmdset:202,pwd:99,py3:274,pyc:[46,94],pycharm:[44,138,362],pyflak:26,pylint:26,pyopenssl:64,pypath:342,pypath_prefix:342,pypath_to_realpath:342,pypi:[63,78,89,92,319],pypiwin32:[9,62],pyprof2calltre:92,pyramid:233,pyramidmapprovid:233,pyreadlin:52,python2:[9,62,96],python37:62,python3:[62,74,93],python:[0,2,3,4,9,10,11,12,14,15,19,20,21,22,23,27,29,31,33,37,38,41,42,44,45,46,48,49,50,52,55,57,59,61,62,63,64,65,68,71,72,74,75,79,81,84,85,88,89,90,92,96,97,99,102,103,105,107,108,109,110,112,113,115,117,118,122,123,124,126,127,129,132,133,134,138,150,152,157,158,162,168,169,179,184,191,192,193,194,195,196,197,203,232,233,240,244,248,249,250,256,259,265,267,274,278,283,293,304,306,310,312,315,316,319,320,322,323,324,325,326,328,329,332,335,338,342,361,362],python_execut:63,python_path:[152,342],pythonista:78,pythonpath:[152,265,275,320],pytz:343,qualiti:[60,150],quell:[2,6,20,120,121,155,211],quell_color:158,queri:[11,16,34,38,55,63,82,85,108,111,130,147,176,205,236,237,244,245,248,249,250,254,272,285,300,314,315,316,317,327,333,339,342,343],quersyet:118,query_al:314,query_categori:314,query_info:265,query_kei:314,query_statu:265,queryset:[63,101,111,118,175,198,236,249,271,313,315,327,360],queryset_maxs:327,quest:[54,56,60,62,116,121,138],question:[8,10,22,26,33,34,42,49,50,52,56,60,62,69,72,89,95,123,130,134,158,244,262,263,314,324,326,342],queu:265,queue:[36,115,310],qui:51,quick:[5,18,22,31,33,38,42,47,54,60,69,78,89,90,94,96,107,111,115,118,123,137,139,145,158,179,204,250,270,314,317,328,361],quicker:[0,37,85,86],quickli:[10,11,15,25,33,34,38,42,47,50,52,85,88,95,111,113,119,127,135,138,158,179,204,317,320],quickstart:[94,138,362],quiescentcallback:267,quiet:[25,42,84,143,156,158,163,179,181,196,205,245,327,342],quiethttp11clientfactori:267,quietli:[29,82,87,314],quirk:[24,44,138,152,362],quit:[0,2,4,10,17,21,22,23,30,33,38,39,41,45,49,50,53,54,56,59,74,84,92,95,104,118,126,127,132,155,170,179,185,187,193,219,285,324,326,327],quitfunc:[49,324],quitfunc_arg:324,quitsave_yesno:324,quo:114,quot:[23,27,35,42,49,79,94,95,108,113,117,158,170,185,205,324,334,338,342],qux:214,ra4d24e8a3cab:35,race:[8,54,55,60,72,78,116,132,342],rack:230,radiu:[38,48,110],rage:121,rail:[63,120],railroad:120,rain:[101,118,121,131],raini:231,rais:[10,15,27,33,68,72,76,82,90,108,118,133,143,145,175,179,184,186,191,193,194,203,204,205,240,248,249,257,259,264,265,283,288,294,309,314,315,319,320,322,325,326,328,334,335,336,337,338,342,343],raise_error:[337,342],raise_except:[1,314],ram:[11,89],ramalho:78,ran:[13,36,41,126],rand:101,randint:[72,90,108,115,119,122,216,217,218,219,220,248,250],random:[9,20,35,45,59,72,89,90,101,103,108,115,119,122,131,203,204,216,217,218,219,220,222,223,225,227,230,231,233,248,250,296,297,334,342],random_string_from_modul:342,random_string_gener:[140,141,177],randomli:[85,92,101,119,131,216,217,218,219,220,229,230,248,265,297],randomstringgener:203,randomstringgeneratorscript:203,rang:[24,31,38,41,42,48,49,55,58,62,87,90,92,102,108,110,115,117,119,121,126,158,183,187,217,220,315,324,334,355,360],rank:[19,239],raph:78,rapidli:152,raptur:289,rare:[10,22,33,34,62,85,103,105,114,127,240,322],rascal:111,rate:[33,37,42,63,89,163,259,265,284,342],rather:[2,3,11,13,20,22,25,26,29,33,37,38,40,42,46,54,56,59,60,63,70,85,88,90,92,94,96,101,103,109,110,111,114,115,126,127,128,130,133,134,137,143,147,151,155,158,159,163,166,168,178,189,193,196,201,205,216,217,218,219,220,234,239,245,247,250,313,314,316,319,328,334,337,338,341,360],ration:178,raw:[3,12,20,33,40,55,63,73,82,85,94,108,113,118,143,150,153,158,166,167,169,205,209,232,245,270,285,288,293,294,304,319,324,326,334,336,342],raw_cmdnam:[150,167],raw_desc:186,raw_id_field:[172,242,252],raw_input:[84,326],raw_nick:86,raw_str:[33,50,84,143,145,149,150,153,169,187,200,214,245,247,304,314,326],raw_templ:86,raw_text:200,rawstr:[153,169],rcannot:22,re_bg:341,re_bgfg:341,re_blink:341,re_bold:341,re_color:341,re_dblspac:341,re_double_spac:341,re_fg:341,re_format:319,re_hilit:341,re_invers:341,re_mxplink:341,re_norm:341,re_str:341,re_ulin:341,re_underlin:341,re_unhilit:341,re_url:341,reach:[20,22,38,50,72,86,87,89,94,100,120,121,140,153,187,191,220,239,285,289,308,326,327,334,339],reachabl:[63,114],react:[50,114,116,117,229,245],reactiv:[42,168],reactor:[93,276,303,310,340],read:[0,1,4,5,8,9,11,13,15,16,17,20,22,23,25,27,29,31,33,34,37,38,40,42,45,50,54,55,57,58,59,60,63,68,69,70,71,75,76,78,79,84,85,87,89,90,92,94,95,101,102,103,104,108,113,118,121,122,123,125,126,127,130,132,133,137,138,143,147,157,165,176,179,186,189,197,198,203,205,230,231,237,244,245,249,250,254,272,274,297,314,316,317,320,321,325,327,333,335,360,361],read_batchfil:320,read_default_fil:36,readabl:[1,27,48,92,95,107,113,114,124,230,319],readable_text:230,reader:[42,47,57,73,78,80,97,132,163,189,220,270,284],readi:[2,10,12,15,20,25,29,36,37,39,41,53,62,74,76,79,88,92,105,120,130,135,137,143,153,165,205,216,217,218,219,220,245,294,336,342],readili:[23,110],readin:325,readlin:335,readm:[14,37,46,129,130,177,209],readonlypasswordhashfield:144,readthedoc:78,real:[2,10,21,22,27,31,38,41,45,52,54,57,58,61,62,65,71,72,88,89,92,94,99,107,108,109,110,115,118,122,124,125,130,136,147,152,176,178,183,204,205,218,239,296,320,329],real_address:2,real_nam:2,real_seconds_until:[183,329],real_word:204,realis:76,realist:[126,131],realiti:[21,54,55,60,76,78,125],realiz:[47,95,125,130],realli:[4,10,11,12,13,14,19,20,22,25,26,31,33,38,41,50,52,57,61,63,71,76,79,84,88,90,95,97,103,107,109,110,111,114,117,118,120,126,127,137,138,178,179,180,214,232,240,274,319,320,326,338],realm:285,realnam:88,realtim:[57,183],realtime_to_gametim:183,reason:[8,9,11,12,13,22,25,29,34,37,38,39,40,42,43,48,50,55,56,57,59,60,62,63,68,72,79,81,82,85,86,88,92,96,101,102,103,105,108,113,114,115,118,121,125,128,130,137,143,156,158,163,168,185,203,204,245,249,255,262,267,274,275,276,277,283,284,285,288,293,294,296,304,305,306,316,324,335,342,360],reasourc:108,reassign:48,reattach:[105,276,277],rebas:130,reboot:[11,27,28,42,49,54,83,85,89,99,101,104,114,115,127,143,152,168,182,187,229,230,245,254,255,256,257,259,265,305,306,324,326,342],reboot_evennia:265,rebuild:[57,62,99,127,277],rebuilt:33,rec:205,recach:231,recal:[94,137,230,360],recaptcha:132,receipt:[102,267],receiv:[31,33,34,37,40,41,50,51,57,76,82,86,90,104,112,113,116,126,132,136,137,143,151,152,169,170,174,175,176,185,196,198,199,205,209,245,267,270,274,276,277,283,293,294,303,304,322,327,339,342],receive_functioncal:274,receive_status_from_port:265,receivelock:239,receiver_account_set:147,receiver_object_set:244,receiver_script_set:254,recent:[4,17,25,59,66,93,122,308],recev:294,recip:[0,28,114,202],recipi:[34,57,143,175,198,274],reckon:9,reclaim:101,recog:[86,205],recog_regex:205,recogerror:205,recoghandl:205,recogn:[16,20,62,73,88,89,95,109,126,133,205,310],recognit:[205,314,334],recommend:[9,12,23,24,25,26,36,37,42,50,54,57,58,59,60,62,68,72,78,85,87,88,89,92,94,107,108,123,124,126,130,134,168,189,193,208,232,240,245,267,320,326,339],reconfigur:89,reconnect:[121,143,145,262,265,274,276,277,303,306],reconnectingclientfactori:[262,276,277],record:[15,23,89,122,209,220,308,355],recours:12,recov:[27,28,29,55,216,217,218,219,220,240,342],recoveri:115,recreat:[23,62,101,110,127,145,152,320,321],rectangl:325,rectangular:[57,325],recur:63,recurs:[11,239,249],red:[13,14,20,31,42,58,79,86,94,108,113,125,158,168,223,225,226,230,334,343],red_bal:58,red_button:[13,14,20,42,86,140,158,177,221,223,226],red_button_script:[140,177,221,225],red_kei:79,redbutton:[13,14,20,42,86,158,223,225,226],redbuttonblind:226,redbuttonclos:226,redbuttondefault:223,redbuttonopen:226,redd:102,reddit:102,redefin:[22,33,54,88,245,355],redhat:[62,66],redirect:[8,22,39,68,95,104,132,134,179,326,360],redirectview:360,redistribut:34,redit:179,redo:[49,60,324],redon:269,redraw:285,reduc:[93,115,216,217,218,219,220,278],redund:319,reel:152,reen:113,ref:[23,124,205,342,355],refactor:[44,56,138,245,362],refenc:52,refer:[0,8,9,13,19,20,22,31,33,34,37,39,42,45,47,48,50,52,55,56,61,63,68,72,78,79,85,86,87,88,89,94,95,99,103,104,105,108,109,110,115,118,123,124,125,126,128,129,130,132,133,143,152,158,163,167,178,187,196,199,203,205,216,217,218,219,220,239,245,256,259,267,277,297,305,313,315,332,338,339,360,361],referenc:[42,55,88,103,108,158,174,205,237,316,342],referenti:342,referr:89,refin:[48,118],reflect:[95,360],reflow:16,reformat:[250,328,335],reformat_cel:328,reformat_column:[110,328],refresh:[26,133,285],refus:12,regain:29,regard:[47,125,126,137,203],regardless:[12,19,31,33,57,72,79,80,82,101,104,113,118,120,124,126,137,143,151,178,188,196,205,223,226,245,257,259,282,285,288,303,305,314,317,320,332,335],regener:218,regex:[5,33,49,86,136,153,156,169,182,203,205,309,314,334,342],regex_nick:86,regex_tupl:205,regex_tuple_from_key_alia:205,regexfield:144,region:[42,57,89,139,156],regist:[64,70,82,102,103,115,119,130,132,134,136,137,143,197,229,230,255,265,276,277,283,306,310,319,334,358,360],register_error:319,register_ev:197,registercompon:136,registertest:358,registr:[64,360,361],registri:[203,310],regress:249,regul:240,regular:[3,17,33,68,78,89,95,104,114,131,133,134,145,151,181,202,203,225,226,231,240,259,317,332,342,361],regulararticl:333,regulararticle_set:333,regularcategori:333,regularli:[84,97,101,119,127,131,183,225,229,231,256,257,259,268,298,329],reilli:78,reinforc:78,reiniti:109,reinstal:62,reinvent:56,reject:[187,203],rejectedregex:203,rel:[10,13,14,19,22,31,48,50,81,103,122,130,132,183,199,220,320,326],relai:[27,33,42,71,104,143,163,178,188,245,283,306,326,327,342],relat:[28,31,33,34,42,46,50,55,56,71,78,93,95,101,102,103,109,124,131,136,137,138,144,147,148,151,165,166,171,175,176,183,197,209,216,217,218,219,220,231,237,244,245,254,257,259,270,306,313,314,316,317,319,326,333,335,344,348,355],related_field:[144,172,235,242,252,313],related_nam:[147,176,237,244,254,314,316,317,333],relationship:[34,48,118,124],relay:145,releas:[9,28,37,42,54,62,77,78,89,95,168],releg:1,relev:[3,9,11,14,22,30,33,37,46,57,61,78,79,88,93,95,106,111,113,115,118,122,123,124,132,134,139,143,144,149,151,178,179,239,240,256,257,279,297,304,305,306,313,319,324,326,336],relevant_choic:179,reli:[9,34,40,50,61,69,80,84,85,87,90,113,114,118,125,126,134,188,205,226,231,265,316,326],reliabl:[13,23,25,29,124,332],reliant:199,reload:[0,2,3,5,6,7,12,13,14,19,21,22,26,27,28,29,31,33,35,36,38,39,40,41,43,47,49,50,54,56,57,59,61,62,64,65,67,68,70,72,73,80,91,94,95,97,101,103,104,105,114,115,116,117,120,122,124,127,132,133,134,135,136,138,143,145,152,157,158,168,174,179,180,184,185,186,194,200,201,205,211,212,230,231,233,240,245,255,256,257,259,265,274,275,277,279,303,306,310,314,320,322,324,325,326,329,342,362],reload_evennia:265,remain:[13,19,30,31,33,42,49,50,57,76,89,90,95,96,106,108,109,112,150,152,158,160,164,174,180,183,186,216,217,218,219,220,229,245,257,265,293,294,326,327,334],remaind:[21,33,183],remaining_repeat:[101,257],remap:[314,334],remedi:59,rememb:[0,1,4,5,11,12,13,21,22,28,29,31,33,38,40,42,47,48,50,53,55,57,60,61,62,68,76,79,85,87,89,90,92,94,95,96,110,111,113,114,118,122,125,127,130,136,138,156,158,180,193,245,255,320,339],remind:[0,4,49],remit:[42,156],remnisc:56,remot:[25,99,102,274,276,288],remov:[0,1,4,9,11,12,21,22,27,31,36,38,40,42,47,49,50,54,57,68,79,80,83,84,86,88,90,92,97,101,114,115,121,126,127,130,132,135,137,140,151,152,156,158,163,164,165,168,173,174,176,179,181,186,187,191,195,202,203,204,205,214,216,217,218,219,220,223,240,244,245,250,255,258,259,265,283,294,306,308,314,317,319,323,326,332,338,340,341,342],remove_backspac:341,remove_bel:341,remove_charact:115,remove_default:[31,152],remove_receiv:176,remove_send:176,removeth:314,renam:[9,20,42,57,80,135,158,164,245,316],render:[3,22,68,80,101,106,132,133,135,144,165,189,235,242,310,313,336,338,353,355,360],render_post:294,renew:[29,57],reorgan:[44,46],repair:[21,60],repeat:[0,41,60,61,74,87,92,101,109,110,115,117,120,135,138,143,145,178,183,203,214,254,257,265,270,289,314,322,326,329],repeatedli:[14,41,61,73,101,138,229,254,257,259,265,270,296],repeatlist:73,repetit:[61,115,203],replac:[5,6,9,22,23,25,29,30,31,33,36,40,42,49,50,56,68,73,79,86,88,93,94,95,99,103,104,108,110,113,115,118,133,134,135,136,137,143,150,151,152,153,156,164,165,169,178,180,182,185,186,187,191,194,196,201,202,204,205,223,226,231,232,240,245,247,249,250,277,280,293,294,304,314,319,324,325,326,328,334,341,342],replace_data:328,replace_timeslot:186,replace_whitespac:328,replacement_str:[42,164],replacement_templ:[42,164],replenish:[216,217,218,219,220],repli:[33,50,64,69,138,145,178,198,263,287,288,294,306,326],replic:[22,135],repo:[46,56,78,105,130,138],report:[22,24,26,33,37,42,60,62,69,72,74,83,90,92,93,96,101,102,103,114,115,126,130,135,137,158,191,194,205,232,245,265,270,277,280,281,288,289,293,304,306,319,322,326,342],report_to:322,repositori:[8,9,23,25,36,75,77,95,99,129,250],repositri:75,repr:[90,327,342],reprehenderit:51,repres:[0,2,9,20,21,22,25,31,33,39,45,48,55,60,61,63,68,76,85,88,94,95,104,106,112,115,118,124,125,126,132,135,143,149,173,175,181,187,189,191,196,197,199,203,205,209,211,214,218,230,231,232,245,250,259,262,276,277,293,294,304,305,306,310,314,315,319,321,322,326,328,338,342],represent:[2,11,28,39,57,63,72,76,85,86,87,104,112,118,125,175,191,194,205,249,254,274,293,294,317,323,329],reprocess:102,reproduc:[10,95,245],reput:208,reqhash:[315,342],reqiur:187,request:[3,8,26,37,39,42,50,62,68,79,89,102,106,118,122,130,132,133,134,138,143,144,145,156,172,178,194,242,245,249,252,265,267,274,277,279,284,285,287,294,310,313,317,326,347,348,349,353,360],request_finish:106,request_start:106,requestavatarid:285,requestfactori:310,requestor:[143,308],requir:[1,4,8,9,10,11,14,15,22,23,33,36,37,42,45,46,48,49,53,57,59,60,66,67,68,69,70,74,76,77,78,79,83,84,85,88,89,92,93,101,108,109,110,113,114,115,117,118,124,125,126,128,131,132,133,135,136,144,157,158,163,168,175,176,184,185,186,187,199,200,201,203,205,214,218,219,231,232,235,236,239,242,245,249,265,276,277,290,298,309,313,315,320,325,326,327,328,332,337,338,339,342,355,360],require_singl:249,requr:108,rerout:[137,155,159,277],rerun:[13,14,50,121],resart:257,research:[78,193],resembl:[25,54,128],resend:33,reserv:[1,10,33,94,95,110,249,309,315,334,342],reset:[0,7,12,15,17,23,27,29,31,33,43,49,59,65,72,80,101,103,104,110,113,115,120,122,124,125,138,143,145,152,158,168,173,183,194,205,226,230,240,256,257,265,269,275,285,303,314,317,320,328,329,334,340,342],reset_cach:[314,317],reset_callcount:[101,257],reset_gametim:[27,329],reset_serv:269,reset_tim:186,resid:[46,95,107,226,240],residu:[42,168,218],resist:[250,342],resiz:[57,137,325,328],resolut:[113,115],resolv:[26,29,41,59,69,89,94,103,115,130,202,216,217,218,219,220],resolve_attack:[216,217,218,219,220],resolve_combat:115,resort:[33,53,57,205,342],resourc:[9,23,26,28,40,46,47,52,55,89,93,94,95,102,107,114,123,126,134,135,138,219,255,263,294,310,321,340],respect:[0,6,23,33,42,47,57,79,103,104,122,124,156,158,165,178,198,202,205,212,223,240,245,304,305,316,317,320,322,328,339,342,355],respond:[0,45,50,60,82,83,106,109,116,117,125,292,296],respons:[7,10,16,17,37,48,50,59,62,63,69,84,87,89,90,117,119,120,143,145,174,196,231,233,237,245,263,265,267,274,297,306,316,336,338,342],response_add:[144,172,242],rest:[17,29,33,50,55,62,72,81,84,85,86,103,105,110,121,122,150,166,167,216,217,218,219,220,314,319,328],restart:[12,41,42,57,59,75,89,91,92,101,102,103,105,109,115,127,130,134,136,137,140,143,168,174,179,182,194,226,245,255,257,259,269,282,303,304,305,342],restartingwebsocketserverfactori:[145,276],restock:84,restor:[0,31,101,125,179,219,226,255,259],restrain:[42,158,239,325,342],restrict:[4,8,11,19,20,42,46,58,67,72,79,89,108,110,114,124,133,136,158,163,181,203,219,220,235,240,250,322,324,326,328,339],restructur:55,result1:202,result2:[50,202],result:[10,11,23,27,30,31,33,42,43,47,50,57,58,72,79,87,89,90,94,95,96,103,104,108,113,114,115,117,118,122,123,125,126,130,133,134,135,143,150,151,153,158,165,174,176,178,184,187,199,202,203,204,205,208,216,217,218,219,220,231,236,240,245,248,249,250,257,265,274,297,314,316,319,324,325,326,328,332,334,335,336,339,342,343],result_nam:202,resum:[29,33,101],resurrect:229,resync:[145,274,304],ret:33,ret_index:342,retain:[10,27,31,96,110,137,188,237,250,311,316,320,322,335,342],retract:178,retreat:220,retri:265,retriev:[0,33,42,68,73,85,95,96,107,111,118,122,138,139,143,147,149,152,158,168,173,175,186,193,236,239,244,249,263,270,271,277,283,292,314,317,323,332,337,339,342,360],retriv:[145,321],retroact:[57,124],retur:51,return_appear:[48,59,121,122,181,186,205,230,245],return_cmdset:165,return_detail:[186,231],return_key_and_categori:317,return_list:[1,314,317],return_map:110,return_minimap:110,return_obj:[1,11,86,314,317,337],return_par:250,return_prototyp:119,return_puppet:143,return_tagobj:317,return_tupl:[86,184,314],returnvalu:[10,33],reus:332,reusabl:121,rev342453534:342,reveal:181,revers:[29,31,33,38,110,113,120,125,133,147,176,233,237,244,254,310,314,316,317,319,333],reverseerror:[265,274],reversemanytoonedescriptor:[147,244,333],reverseproxyresourc:310,revert:[42,89,125,130,155,236],review:[0,31,37,40,63,69,127,134],revis:60,revisit:[36,326],reviu:50,revok:57,revolutionari:130,rework:[29,60,200],rfc1073:281,rfc858:287,rfc:[281,287],rfind:319,rgb:113,rgbmatch:319,rhel:8,rhostmush:[56,107,128],rhs:[25,57,166,167,169],rhs_split:[158,164,166,167],rhslist:[166,167],ricardo:342,riccardomurri:342,rich:[22,56,77,78,323],richard:78,rick:108,rid:[55,118,138],riddanc:12,ridden:[1,95],riddick:187,ride:120,right:[0,5,8,10,14,20,21,23,25,28,29,33,38,40,41,42,45,50,52,54,55,56,57,59,60,62,67,73,74,75,79,84,86,89,90,95,100,101,108,110,113,116,118,120,122,125,126,127,132,133,136,137,144,152,155,158,166,167,174,180,186,187,189,194,195,202,220,223,226,229,230,233,240,248,250,254,305,319,320,324,328,342,343],right_justifi:[108,248],rigid:56,rindex:319,ring:204,ripe:95,rise:[31,61],risen:61,risk:[42,56,62,89,122,137,157,168],rival:110,rjust:319,rm_attr:158,rnormal:113,rnote:[42,168],road:[31,45,110,120,151],roadmap:[44,138,362],roam:[121,152,229],roar:110,robot:[76,132],robust:[84,90,102],rock:[6,59,85,115,123,152],rocki:121,rod:152,role:[17,23,54,56,60,72,90,216],roleplai:[9,11,56,60,67,72,78,115,122,138,184,205,362],roll1:72,roll2:72,roll:[11,57,60,62,72,90,115,122,184,216,217,218,219,220,308],roll_challeng:72,roll_dic:184,roll_dmg:72,roll_hit:72,roll_init:[216,217,218,219,220],roll_result:184,roll_skil:72,roller:[72,115,184],rom:78,roof:[42,158],room1:126,room56:13,room:[9,12,13,14,15,20,21,22,27,31,33,41,42,43,44,45,54,55,56,58,61,62,63,72,76,79,84,90,95,101,103,107,108,110,111,115,116,117,118,119,120,121,122,123,124,126,128,131,132,139,140,149,150,151,152,156,158,164,169,177,179,181,184,186,193,196,199,205,211,212,213,216,217,218,219,220,228,229,230,232,233,239,245,254,269,297,320,340,358,362],room_count:118,room_dict:199,room_flag:55,room_lava:55,room_typeclass:[233,340,358],roombuildingmenu:[22,179],roomnam:[42,57,158],roomobj:118,roomref:120,root:[9,13,22,23,36,46,52,62,63,68,74,77,79,80,85,88,89,92,95,96,99,105,127,129,133,134,135,230,245,250,265,310,323,362],rose:[11,86,88,124],roster:[9,216,217,218,219,220],rosterentri:9,rot:126,rotat:335,rotatelength:335,roughli:[57,60,93,95,342],round:[17,204,220,328],rounder:204,rout:[5,20,48,55,120,136,143],router:89,routin:[205,300,339,342],row:[0,3,16,48,57,63,68,85,110,113,115,125,136,328,342],rpcharact:205,rpcommand:205,rpg:[57,59,72,123,184,220],rpi:78,rplanguag:[140,141,177,205],rpm:62,rpobject:205,rpsystem:[140,141,177,201,204],rpsystemcmdset:205,rred:319,rsa:[285,286],rspli8t:90,rsplit:[122,319],rss2chan:[97,163],rss:[7,42,54,78,127,138,140,145,163,171,260,270,273,283,362],rss_enabl:[97,163],rss_rate:145,rss_update_interv:[42,163],rss_url:[42,97,145,163],rssbot:145,rssbotfactori:284,rsschan:[42,163],rssfactori:284,rssreader:284,rstrip:[90,319],rsyslog:208,rtest2:113,rtext:84,rthe:22,rthi:113,rtype:310,rubbish:[42,155],rubi:63,rudimentari:229,ruin:[121,186,231],rule:[12,13,14,21,33,46,52,54,57,60,67,76,78,79,95,113,123,125,126,130,138,179,203,204,216,217,220,237,320,362],rulebook:115,rumour:121,run:[0,2,3,5,6,8,9,10,11,13,14,15,20,21,23,24,25,26,27,28,29,31,35,36,39,42,44,45,46,50,52,53,55,56,58,59,60,61,62,63,67,68,71,72,75,78,79,80,84,85,89,90,91,92,94,95,96,100,101,102,103,108,109,110,114,118,120,121,122,123,124,125,127,129,130,131,132,133,135,136,137,138,140,143,145,149,150,153,157,158,163,164,165,168,169,173,174,194,195,200,205,208,212,214,216,217,218,219,220,226,233,239,240,245,249,250,254,256,257,259,265,269,271,275,282,283,290,294,296,299,303,304,308,310,316,319,320,324,326,327,329,335,339,340,342,360,361,362],run_async:[10,342],run_connect_wizard:265,run_dummyrunn:265,run_exec:326,run_exec_then_goto:326,run_init_hook:303,run_initial_setup:303,run_menu:265,run_start_hook:[59,124,316],runexec:326,runexec_kwarg:326,runnabl:108,runner:[36,105,230,296],runsnak:92,runtest:[169,195,210,227,291,301,333,340,350,358],runtim:[12,27,33,61,153,179,232,329,342],runtimeerror:[72,143,145,191,194,197,203,204,249,257,283,314,326,334,342],runtimewarn:249,rusernam:50,rush:29,rusti:84,ruv:36,ryou:22,sad:[132,288],safe:[11,26,30,31,42,45,55,59,63,81,88,96,103,130,132,143,155,178,226,240,259,274,306,310,316,320,323,332,342],safer:[12,13],safest:[0,89,104,316],safeti:[2,42,55,88,89,122,124,138,158,178,244,320],sai:[0,5,6,10,12,14,17,20,22,25,26,27,29,31,33,38,39,40,43,45,50,55,56,57,59,60,61,62,63,68,72,76,77,79,88,89,90,92,95,108,113,115,116,117,118,122,124,125,126,127,128,130,136,137,138,139,152,164,178,180,184,187,196,197,204,205,214,226,231,245,326],said:[0,4,10,22,26,42,43,45,48,50,56,82,90,95,110,111,117,126,133,150,163,167,196,205,233,245,277,316],sake:[13,42,56,125,134,170,185,360],sale:84,same:[0,2,5,6,9,10,11,12,13,14,15,16,19,20,21,22,23,26,27,28,29,31,33,34,37,39,40,41,42,43,49,54,56,57,58,59,60,61,62,63,65,68,72,73,77,79,80,82,83,84,85,87,88,89,90,94,95,96,97,99,101,103,104,105,107,108,109,110,111,112,113,114,115,118,120,122,124,125,126,127,130,132,133,135,137,143,149,150,151,152,153,156,158,166,167,168,169,174,179,181,183,186,189,193,194,198,203,204,205,211,213,214,216,217,218,219,220,223,229,231,232,233,239,245,250,254,255,259,269,274,286,289,290,304,305,306,308,310,313,314,315,316,317,319,320,322,326,327,328,329,335,336,342,355,360],sampl:[8,36,55,99,214],san:189,sand:61,sandi:110,sane:[60,78,95,360],sanit:[355,360],saniti:[9,48,110,126,138,336],sarah:[42,128,164],sat:[21,139],satisfi:[107,166,314],satur:102,save:[0,1,9,15,21,22,24,27,29,33,34,36,40,41,42,45,47,49,50,53,55,63,83,85,86,88,94,96,99,101,102,104,106,108,109,111,114,115,122,124,130,132,137,143,144,155,158,168,172,174,175,176,179,194,240,242,244,245,247,249,252,255,257,258,259,263,270,283,297,298,303,310,313,314,316,323,324,332,336,337,338,342],save_a:[172,235,242,252,261],save_as_new:313,save_buff:324,save_data:336,save_for_next:[33,153],save_handl:336,save_kwarg:337,save_model:[144,172,242,252],save_nam:259,save_on_top:[172,235,242,252,261],save_prototyp:249,save_recip:202,savefunc:[49,324,337],savehandl:337,saver:323,saverdict:323,saverlist:323,saverset:323,saveyesnocmdset:324,saw:[10,45,68],say_text:117,saytext:205,scale:[23,56,60,72,105,113,204],scalewai:89,scan:[8,149,229,231],scarf:181,scatter:[218,320],scedul:329,scenario:57,scene:[11,21,54,58,60,72,73,96,108,111,113,115,121,125,203,231,254,259,332],schedul:[27,61,183,194,329],schema:[4,63,85,124,130,342],scheme:[28,33,42,62,85,113,158,168,319],scienc:[48,123],scientif:78,scissor:115,scm:9,scope:[29,54,63,73,123,133,137,203,322],score:[57,59,342],scraper:360,scratch:[39,45,56,57,60,62,122,123,127,129,135,138],scream:121,screen:[7,16,18,33,42,50,51,60,65,73,80,84,96,99,100,103,104,108,113,132,136,137,138,144,170,185,189,200,220,248,270,285,327,342,362],screenheight:[73,270],screenread:[73,270,293,294],screenshot:[54,132,138,362],screenwidth:[73,153,270],script:[6,11,13,14,20,27,36,44,46,54,55,56,58,60,61,62,70,79,83,84,85,88,89,92,102,103,104,105,106,107,108,109,111,114,115,116,118,119,121,124,129,131,132,136,137,138,140,141,143,145,157,158,168,176,177,178,183,186,190,191,197,202,203,204,212,216,217,218,219,220,222,223,225,226,231,233,239,244,245,249,250,265,298,303,320,321,322,329,337,339,340,342,358,362],script_path:[42,158],script_search:58,script_typeclass:[227,340,358],scriptattributeinlin:252,scriptbas:257,scriptclass:256,scriptdb:[118,124,140,252,254,312],scriptdb_db_attribut:252,scriptdb_db_tag:252,scriptdb_set:[147,244,314,317],scriptdbadmin:252,scriptdbmanag:[253,254],scripthandl:[140,141,251],scriptkei:[42,158],scriptmanag:253,scriptnam:321,scripttaginlin:252,scroll:[20,44,51,62,76,94,95,96,122,137,327],scrub:306,sdesc:[55,201,205],sdesc_regex:205,sdescerror:205,sdeschandl:205,sdk:62,sea:[110,121],seamless:205,seamlessli:[91,101],search:[0,2,9,13,21,22,30,33,40,41,42,47,49,54,57,58,59,63,67,69,72,75,86,88,93,95,101,103,108,115,122,123,124,126,130,133,135,138,139,140,141,143,149,151,153,158,165,168,175,178,193,198,202,205,216,217,218,219,220,231,233,236,237,239,245,248,249,256,271,314,315,316,317,318,319,322,324,342,361,362],search_:[27,58],search_account:[57,106,118,140,245,339],search_account_attribut:118,search_account_tag:[118,339],search_at_multimatch_input:245,search_at_result:[205,245],search_attribute_object:118,search_channel:[40,118,140,175,339],search_channel_tag:[118,339],search_field:[172,235,242,252,261,313],search_for_obj:158,search_help:[118,140,236],search_help_entri:339,search_helpentri:236,search_index_entri:[153,155,156,157,158,163,164,165,166,167,168,169,170,173,178,179,180,181,184,185,186,187,188,192,198,199,200,201,202,205,211,212,213,214,216,217,218,219,220,223,229,230,231,232,237,245,324,326,327],search_messag:[118,140,175,339],search_mod:205,search_object:[11,13,27,110,118,120,124,140,143,339],search_object_attribut:118,search_objects_with_prototyp:249,search_prototyp:249,search_script:[58,101,118,140,339],search_script_tag:[118,339],search_tag:[47,111,118,139,140,339],search_tag_account:111,search_tag_script:111,search_target:198,searchabl:193,searchdata:[143,205,245,339],searchstr:67,season:[60,186],sec:[10,29,61,73,183,277,329],secmsg:335,second:[0,10,11,14,16,21,22,25,27,29,31,33,38,40,42,50,61,62,68,79,81,84,85,87,89,90,94,101,102,103,108,109,113,114,115,118,119,120,122,125,126,131,133,143,145,150,158,183,193,194,197,199,205,212,216,217,218,219,220,222,226,229,239,245,250,257,259,265,270,279,284,297,308,319,322,326,329,335,342,343],secondari:[80,305],secondli:88,secreci:130,secret:[9,23,64,70,184,265],secret_kei:9,secret_set:[4,9,23,64,265],sect_insid:48,section:[1,4,9,11,15,18,21,22,23,25,26,29,31,33,35,36,38,39,47,50,57,59,61,62,67,68,74,76,79,85,88,89,92,94,95,99,110,112,118,123,124,126,132,136,137,138,186,204,250,319,320,343],sector:48,sector_typ:48,secur:[7,11,13,22,26,40,42,56,62,79,84,89,95,107,108,113,122,132,133,138,140,141,157,168,174,177,237,245,285,316,335,355,362],secure_attr:79,sed:36,sedcond:258,see:[0,1,2,3,4,5,8,9,10,11,12,13,14,19,20,21,22,23,25,26,27,28,29,30,31,32,33,34,35,37,38,39,40,41,42,43,45,47,48,49,50,51,52,54,55,56,57,58,59,60,61,62,63,64,67,69,70,71,73,74,75,79,80,81,85,86,87,88,89,90,92,94,95,97,99,100,101,102,103,104,105,107,108,109,110,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,129,130,131,132,133,134,135,136,137,138,143,153,155,157,158,164,165,166,167,169,174,176,177,178,179,185,189,191,198,202,203,204,205,209,212,213,214,216,217,218,219,220,222,223,225,229,232,233,239,244,245,258,263,265,267,268,276,277,278,279,281,285,286,288,290,292,293,294,296,297,305,306,310,314,319,322,323,324,325,326,328,334,337,338,342,349,355,360],seek:[121,240,335],seem:[4,22,24,31,38,40,55,60,62,74,93,108,109,118,120,121,122,136,137,314,320],seen:[0,22,29,31,34,39,45,48,50,56,57,68,80,90,94,95,101,104,110,118,119,120,125,126,130,179,249,277,328],sefsefiwwj3:9,segment:[120,310],seldomli:[153,169],select:[2,20,22,27,31,42,50,53,62,68,76,79,84,85,103,104,105,110,118,119,122,130,132,136,137,139,150,151,156,165,214,217,316,324,326],selet:326,self:[0,1,2,5,6,9,10,11,13,20,21,22,25,27,28,29,30,31,33,38,39,40,41,42,43,48,49,50,55,56,57,58,59,61,62,70,71,72,75,76,79,80,81,84,85,86,88,94,95,101,108,114,115,116,117,118,119,120,122,124,126,128,131,133,143,145,147,149,151,152,153,155,158,159,163,166,167,168,169,173,174,176,178,179,180,181,184,186,187,191,196,198,199,201,202,205,214,216,217,218,219,220,222,223,226,229,230,231,232,233,239,245,257,258,263,265,267,268,272,276,277,283,285,286,288,290,292,293,294,304,305,306,314,316,317,319,324,326,327,332,334,336,337,338,342,349],self_pid:342,selfaccount:57,sell:[77,84,178],semi:[92,131,137,204],semicolon:[79,240,322],send:[2,12,22,25,27,29,33,34,40,42,50,51,57,58,60,63,69,70,72,73,75,79,80,82,88,90,92,94,95,101,102,104,106,109,112,113,114,115,117,119,122,125,132,136,137,138,139,143,145,149,152,153,156,163,167,173,174,175,176,178,187,188,198,205,209,220,222,229,239,245,258,259,262,265,267,268,270,274,275,276,277,278,280,283,284,285,287,288,289,291,293,294,296,304,305,306,307,319,322,323,326,328,342],send_:[39,82,283],send_adminportal2serv:275,send_adminserver2port:262,send_authent:276,send_channel:[276,277],send_default:[39,82,276,277,283,285,288,293,294],send_defeated_to:229,send_emot:205,send_functioncal:274,send_game_detail:267,send_heartbeat:276,send_instruct:265,send_mail:198,send_msgportal2serv:275,send_msgserver2port:262,send_p:277,send_privmsg:277,send_prompt:[285,288,293,294],send_random_messag:222,send_reconnect:277,send_request_nicklist:277,send_status2launch:275,send_subscrib:276,send_text:[39,82,285,288,293,294],send_unsubscrib:276,sender:[34,40,42,106,143,145,163,174,175,176,178,205,245,276,307,332,339],sender_account_set:147,sender_extern:176,sender_object:307,sender_object_set:244,sender_script_set:254,sender_str:174,sendernam:[42,163],senderobj:322,sendlin:[285,288,293],sendmessag:[39,187],sens:[1,10,22,31,37,55,57,79,85,88,95,101,120,137,151,223,322,323],sensibl:[89,269],sensit:[11,50,57,79,175,179,183,186,194,209,210,236,315,329,339],sensivit:203,sent:[25,34,50,57,68,73,82,87,90,104,106,112,113,118,136,137,143,145,149,165,169,174,175,176,179,185,187,194,196,198,209,227,232,245,262,265,267,270,274,275,276,277,285,289,293,304,306,314,326,334,339],sentenc:[45,90,197,204,205],sep:[319,342],sep_kei:[22,179],separ:[8,11,13,14,20,23,29,31,33,37,39,42,45,47,56,57,60,61,63,70,71,74,76,79,83,84,85,86,88,90,91,92,94,95,97,100,102,104,105,111,113,114,118,120,122,125,128,130,132,135,136,137,139,150,152,153,158,164,165,166,167,168,174,179,194,197,198,204,205,214,216,217,218,219,220,223,231,233,236,240,244,245,255,259,284,289,294,306,319,320,322,325,334,339,342],separatli:29,seq:86,sequenc:[10,13,14,15,33,63,79,80,86,88,112,125,153,157,183,200,205,240,263,269,319,320,326,328,341,342],seri:[50,60,78,113,130,135,137,225,328],serial:[11,82,137,248,259,283,323,336,338],serializ:294,seriou:[38,109],serious:62,serv:[44,48,54,63,82,100,102,103,110,134,151,218,294,310,320,322,353],server:[0,2,4,9,10,11,12,13,15,19,21,25,26,27,28,29,31,33,34,35,36,37,39,40,44,46,50,53,54,55,56,57,58,59,61,62,63,64,65,66,68,69,70,71,72,73,74,77,78,79,80,82,83,85,87,88,90,92,93,94,95,96,99,100,101,102,105,106,108,109,110,112,113,114,115,117,120,121,123,124,126,127,130,132,133,134,135,136,137,138,140,141,143,145,152,156,158,163,168,170,174,177,179,182,185,186,194,200,201,205,206,207,208,211,212,226,229,230,233,245,254,255,256,257,259,311,316,320,322,323,326,329,332,335,342,344,361,362],server_connect:283,server_disconnect:283,server_disconnect_al:283,server_epoch:[27,329],server_l:275,server_logged_in:283,server_nam:103,server_pid:[275,342],server_receive_adminportal2serv:262,server_receive_msgportal2serv:262,server_receive_statu:262,server_reload:[255,259],server_run:265,server_runn:303,server_servic:342,server_services_plugin:[39,103],server_services_plugin_modul:39,server_session_class:104,server_session_sync:283,server_st:265,server_twistd_cmd:275,server_twisted_cmd:275,serverconf:[156,259],serverconfig:[258,259,271,272],serverconfigadmin:261,serverconfigmanag:[271,272],serverfactori:[275,285,288],serverload:[42,168],serverlogobserv:335,servermsg:335,servernam:[4,8,9,53,73,89,103],serverprocess:[42,168],serversess:[39,104,113,140,141,209,240,260,283,306,314],serversessionhandl:[39,104,306],serverset:[42,79,163,239],servic:[12,23,39,44,70,89,93,99,102,103,109,130,132,140,168,260,262,265,266,274,275,282,303,310,342],sessdata:[305,306],sessid:[2,33,104,122,244,245,262,274,275,283,306],session:[2,12,15,24,31,33,39,44,46,50,56,73,80,81,83,87,88,90,95,99,106,113,122,126,137,138,140,141,143,145,147,149,150,151,153,155,156,159,161,165,166,170,185,187,188,196,208,209,210,244,245,247,248,249,255,260,262,270,274,275,276,277,283,284,285,288,293,294,303,304,306,308,324,326,327,334,342,343,362],session_data:306,session_from_account:306,session_from_sessid:306,session_handl:[104,140],session_portal_partial_sync:306,session_portal_sync:306,sessioncmdset:[31,42,161],sessionhandl:[39,82,140,141,143,245,260,270,276,277,283,284,304,305],sessionid:283,sessionobject:334,sessions_from_account:306,sessions_from_charact:306,sessions_from_csessid:[283,306],sessions_from_puppet:306,sesslen:245,set:[0,2,3,6,7,8,10,11,12,13,14,15,16,17,19,20,21,22,23,24,25,26,27,29,30,32,33,34,35,36,37,38,39,40,41,43,44,45,46,49,51,54,55,56,57,58,59,60,62,63,65,66,67,68,70,73,74,75,81,82,84,85,86,88,90,92,94,95,96,99,101,104,106,107,108,109,110,111,112,113,115,116,118,119,120,123,124,125,127,128,129,132,133,134,135,136,137,138,140,142,143,145,147,149,150,151,152,153,155,156,158,159,160,161,162,163,165,166,167,169,171,173,179,180,181,182,183,184,185,186,187,188,192,194,196,197,200,201,202,204,205,208,211,212,214,216,217,218,219,220,223,225,226,227,229,230,231,232,233,235,239,240,244,245,248,249,250,256,257,259,262,264,265,269,270,271,272,275,276,278,279,281,282,285,287,288,290,291,296,297,299,301,303,304,305,306,308,310,311,313,314,315,316,317,319,320,321,322,323,324,325,326,327,328,329,332,333,334,335,336,337,338,339,340,341,342,343,348,355,358,362],set_active_coordin:233,set_al:229,set_alias:153,set_attr:158,set_cach:314,set_class_from_typeclass:316,set_dead:229,set_descript:50,set_detail:[186,231],set_game_name_and_slogan:348,set_gamedir:265,set_kei:153,set_nam:50,set_pane_typ:136,set_password:143,set_task:194,set_trac:[41,140],set_webclient_set:348,setcolor:80,setdesc:[56,164,211],setgend:188,sethelp:[20,67,165],sethom:158,setlock:211,setnam:39,setobjalia:[42,158],setperm:[42,156],setspe:212,sett:97,settabl:[73,85,288],setter:38,settestattr:49,settingnam:79,settings_chang:106,settings_default:[4,5,34,46,103,126,140,141,342],settings_ful:103,settings_mixin:[140,260,295],settl:[110,115],setup:[5,15,18,26,39,46,60,62,70,84,92,95,99,115,119,126,128,130,137,138,143,155,163,169,183,195,223,227,231,245,257,269,282,291,296,300,301,303,310,314,316,332,333,340,358,362],setup_str:300,setuptool:[62,74],sever:[0,11,14,19,22,29,31,33,36,40,41,42,47,49,51,54,55,56,58,61,68,78,79,101,103,108,112,115,118,124,136,157,158,166,167,168,186,193,194,229,231,245,291,292,317,322],sex:188,shall:[125,133],shaman:[56,108],shape:[20,22,38,57,60,110,233,328],sharabl:108,share:[9,25,31,36,37,41,45,56,58,62,63,64,79,85,89,101,102,104,111,115,118,124,132,134,144,193,194,250,259,296,314,315,317,328,342,349],sharedloginmiddlewar:349,sharedmemorymanag:[315,331],sharedmemorymodel:[176,237,314,316,332,333],sharedmemorymodelbas:[147,176,237,244,254,314,316,332,333],sharedmemorystest:333,shaw:[76,78],she:[0,22,33,55,90,125,179,188,204],sheer:[42,158],sheet:[23,50,132,133,136,325],sheet_lock:57,shell:[7,23,25,26,36,52,56,57,58,59,62,74,85,86,89,99,102,107,109,124,127,285],shield:[29,76,85],shift:[14,15,27,107,194,230,236,342],shiftroot:230,shine:[21,231],shini:342,ship:[54,63,74,110],shire:61,shirt:181,shoe:181,shoot:[21,219,220,325],shop:[50,56,107,123,138,362],shop_exit:84,shopcmdset:84,shopnam:84,shopper:84,short_descript:53,shortcom:84,shortcut:[0,3,22,23,27,29,31,33,42,46,52,58,68,90,95,99,106,115,118,124,128,132,133,140,145,152,153,158,179,191,233,240,245,336,342],shorten:[41,45,124,250],shorter:[39,60,103,107,116,117,124,131,174,204,315,322,335],shortest:[38,205],shorthand:[42,88,125,158],shortli:[0,22,76],shot:219,should:[0,1,2,3,4,5,6,8,9,10,11,12,13,14,15,16,19,20,22,23,24,25,26,27,29,31,33,34,37,38,39,40,41,42,45,46,47,50,52,54,56,57,58,59,60,61,62,63,64,65,67,68,71,72,73,74,75,76,79,80,81,82,84,85,87,88,89,90,92,93,94,95,96,97,99,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,118,120,121,122,123,124,125,126,127,128,129,130,132,133,134,135,136,137,138,139,143,145,147,149,151,152,153,155,157,158,159,162,165,166,168,169,173,174,176,179,181,183,186,191,194,196,197,198,199,201,202,203,204,205,208,216,217,218,219,220,223,226,229,231,232,239,240,244,245,247,248,249,250,254,256,257,258,259,263,264,265,269,272,276,282,285,288,289,291,293,294,297,303,304,305,306,309,311,313,314,316,317,319,320,322,323,324,326,327,328,329,334,335,336,337,338,340,342,343,355,358,360],should_join:174,should_leav:174,should_list_cmd:165,shoulddrop:[220,245],shoulder:[57,181],shouldget:[220,245],shouldgiv:[220,245],shouldmov:[196,216,217,218,219,220,245],shouldn:[0,13,21,22,29,40,47,57,92,125,165,179,194,197,219,296],shouldrot:335,shout:29,shove:21,show:[0,12,13,14,20,22,24,26,27,30,33,35,37,38,39,41,42,45,47,48,50,51,52,53,54,56,57,59,60,61,62,63,67,68,69,70,72,80,81,84,85,89,90,94,95,96,97,100,101,102,103,104,105,109,110,113,115,116,117,118,119,121,123,125,126,127,128,130,132,133,135,136,137,138,143,155,156,158,163,164,166,168,170,178,180,181,184,185,186,187,189,201,214,219,220,225,231,232,233,245,247,249,250,263,265,274,324,326,335,336,337,342,355],show_foot:327,show_map:48,show_non_edit:249,show_non_us:249,show_valu:189,show_version_info:265,show_warn:265,showcas:[31,110,199],shown:[0,4,9,22,25,29,35,40,42,48,50,53,56,61,67,108,113,120,132,137,156,163,165,167,179,181,203,205,230,245,265,326,327],showtim:61,shrink:328,shrug:45,shrunk:100,shuffl:27,shun:[26,89,107],shut:[0,4,29,42,92,99,101,103,136,143,168,245,257,259,265,267,274,275,282,283,303,306],shutdown:[12,19,31,57,92,101,104,109,143,145,168,259,265,274,275,282,303,304,316,322,326],shy:[26,60,128],sibl:[10,56,95,101],sid:[42,156],side:[0,1,11,24,36,42,47,48,57,72,73,82,90,104,111,118,125,126,132,136,137,143,145,147,164,166,167,176,178,184,211,237,244,254,262,274,275,283,286,289,290,293,304,305,306,314,316,317,319,328,333],sidestep:19,sidewai:328,sigint:265,sign:[0,14,20,45,82,89,90,105,114,122,131,186,245,259,314,319,343],signal:[44,92,109,138,140,141,216,217,218,219,220,260,265,288,294,296,332,362],signal_acccount_post_first_login:106,signal_account_:106,signal_account_post_connect:106,signal_account_post_cr:106,signal_account_post_last_logout:106,signal_account_post_login:106,signal_account_post_login_fail:106,signal_account_post_logout:106,signal_account_post_renam:106,signal_channel_post_cr:106,signal_helpentry_post_cr:106,signal_object_:106,signal_object_post_cr:106,signal_object_post_puppet:106,signal_object_post_unpuppet:106,signal_script_post_cr:106,signal_typed_object_post_renam:106,signatur:[33,72,153,176,191,258,263,265,267,268,276,285,286,288,290,293,294,314,319,326,334,337,338,349],signed_integ:343,signedinteg:336,signedon:277,signifi:[14,239,314],signific:96,significantli:49,signup:4,silenc:267,silenced_system_check:126,silent:[10,42,61,117,156,269,277],silli:[59,88,95,108],silvren:[54,89],similar:[0,11,13,20,21,22,25,33,40,47,50,54,57,63,67,72,76,85,88,89,95,101,105,120,124,128,135,136,139,143,153,155,169,179,187,196,204,216,217,218,219,220,233,237,245,306,317,322,326,342,360],similarli:[57,61,89,111,217,232,313],simpl:[0,2,4,5,6,9,10,13,14,15,17,25,26,28,30,31,33,35,38,39,40,42,45,48,49,54,55,56,57,58,59,60,66,68,69,72,73,75,76,80,84,85,87,88,89,90,94,95,97,99,102,104,107,108,110,111,115,116,117,118,119,121,122,123,125,131,132,134,138,158,173,178,179,180,185,186,187,188,193,196,198,202,203,205,211,212,213,214,216,217,218,219,220,222,223,229,230,231,233,234,244,245,248,250,257,275,284,286,320,321,352,353,355,362],simpledoor:[140,141,177],simplemu:24,simpler:[10,15,42,55,157,158,323,360],simpleresponsereceiv:267,simplest:[6,29,57,72,89,115,152,320,343],simpli:[5,8,11,12,13,17,20,21,22,23,25,29,31,37,38,39,40,46,48,50,52,54,57,58,60,62,70,71,72,79,80,82,84,95,101,102,103,108,111,113,117,120,122,124,126,127,130,131,137,139,143,151,152,153,169,170,173,174,179,185,186,195,196,199,205,212,214,216,217,218,219,220,223,230,237,245,283,314,316,320,321,325,327,342],simplic:[22,38,42,54,125,170,185,230],simplif:[44,115],simplifi:[10,68,93,99,110,115,117,191],simplist:[115,122,131,136,204,213],simul:[33,72,92,212],simultan:[57,87,115,342],sinc:[0,1,3,4,5,6,9,10,11,13,14,19,21,22,23,25,26,27,28,29,31,33,34,35,38,39,40,41,42,43,46,47,48,49,50,53,54,55,56,57,58,59,60,61,63,68,73,75,79,82,83,84,85,87,88,89,90,95,96,99,101,103,109,110,113,114,115,117,118,120,121,122,124,125,126,130,132,133,134,136,137,143,145,147,151,152,153,158,166,167,168,174,175,178,179,180,183,186,198,205,214,216,217,218,219,220,226,230,231,239,245,250,255,259,265,267,270,282,287,289,297,303,304,306,313,314,315,316,320,321,322,324,326,329,332,335,338,339,340,342,355],singl:[0,5,10,14,16,22,23,24,31,33,37,42,43,47,50,54,56,57,58,60,63,66,72,76,82,86,87,89,94,95,104,107,110,111,113,118,121,124,126,127,128,138,143,149,156,158,164,175,176,179,203,208,214,216,217,218,219,220,231,232,233,245,249,250,259,297,304,306,314,315,317,319,320,325,326,327,328,334,339,342,355],single_type_count:181,singleton:[83,104,114,173,255,258,321],singular:[57,60,245],sink:26,sint:51,sir:45,sit:[11,14,29,33,46,54,62,79,82,89,94,95,118,120,122,124,166,197,198,205,223,230,231,240,256,259,278,322,337,340],sitabl:124,sitat:231,site:[8,16,17,23,37,68,70,78,79,89,96,97,99,100,102,110,132,133,144,310,360],site_nam:58,situ:[11,316,323],situat:[0,6,11,22,33,37,41,42,45,61,75,82,85,101,104,118,124,130,152,153,158,193,332],six:[72,90,184,214],sixti:61,size:[16,24,41,48,57,96,100,107,110,136,137,140,233,267,281,319,325,327,328,332,335,342],size_limit:342,skeleton:[122,136],sketch:[115,137],skill:[28,29,30,54,59,60,69,72,78,109,115,120,126,132,133,204,205,325],skill_combat:72,skillnam:72,skin:108,skip:[31,33,40,42,48,60,61,74,87,99,105,108,114,130,143,157,158,199,245,314,323],skipkei:294,skippabl:128,skull:108,sky:[101,131],slack:78,slam:187,slash:[20,40,54,72,115,121,230],slate:110,sleep:[10,29,33,72],slew:[60,72,74,320],slice:[118,155,319,327],slice_bright_bg:155,slice_bright_fg:155,slice_dark_bg:155,slice_dark_fg:155,slight:[8,90,183,194],slightli:[41,61,62,78,115,122,144,176,186,217,232,360],slightly_smiling_fac:137,slip:341,slogan:9,slot:[57,133,186,187,217,219,250,342],slow:[27,115,175,212,229,233,278,284,319,339,342],slow_exit:[140,141,177],slower:[61,76,89,92],slowexit:212,slowli:78,slug:[174,237,316,360],slugifi:360,small:[4,14,15,16,25,30,33,37,54,56,57,60,62,68,69,78,80,84,89,90,92,95,96,97,107,110,121,122,123,126,127,138,184,219,223,233,288,324,325,328,342],smaller:[13,14,16,100,136,328],smallest:[57,61,79,89,183,325,342],smallshield:85,smart:[40,76,90,233],smarter:108,smash:[60,223,226],smell:60,smelli:108,smile:[33,42,164],smith:325,smithi:29,smoothi:202,smoothli:133,smush:47,snake:135,snap:81,snapshot:130,snazzi:77,sneak:240,snippet:[10,13,21,31,42,54,63,79,108,113,138,168,274,289,341,342],snoop:102,snuff:26,social:[54,70],socializechat:297,soft:[4,63,138,204,362],softcod:[128,138],softli:77,softwar:[36,62,89,130],solar:61,soldier:84,sole:[56,68,145],solid:[48,54,113],solo:[20,62,123],solut:[0,9,14,25,27,29,38,55,68,72,84,89,90,102,110,114,117,120,121,124,126,137,167,240],solv:[21,27,43,48,60,62,76,96,110,202,230],some:[0,3,4,5,6,8,9,11,12,13,14,15,16,20,21,22,23,24,25,26,27,28,29,31,33,36,37,39,41,42,44,45,47,48,49,50,54,56,57,59,60,61,62,63,68,69,71,72,73,74,76,77,78,79,81,82,84,85,86,88,89,90,93,94,95,96,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,120,121,122,123,124,125,126,127,130,132,133,135,136,137,138,143,152,153,158,160,164,167,168,174,175,178,179,180,185,194,196,197,203,204,211,214,217,218,219,220,225,226,230,231,232,233,240,245,249,250,254,267,269,274,277,303,314,316,319,320,325,326,329,332,335,336,342,355,360],some_long_text_output:327,somebodi:[0,137],somehow:[33,39,72,79,86,89,112,139,181,324],someon:[0,1,29,33,42,45,47,48,57,59,79,84,89,95,102,106,114,116,117,118,137,143,164,181,225,229,230,245],somepassword:23,someplac:229,someth:[0,3,4,6,8,9,10,11,12,14,20,22,23,25,27,29,30,33,38,39,40,42,43,45,48,50,51,55,56,57,58,59,60,61,63,64,67,68,69,70,71,72,74,79,81,82,84,85,88,89,90,92,94,95,101,103,106,107,108,110,113,114,118,122,124,126,127,128,132,133,134,136,137,138,143,151,153,158,164,165,166,178,179,181,188,196,197,199,203,205,212,216,217,218,219,220,230,231,232,233,240,245,304,316,320,326,327,336,342,360],sometim:[6,22,27,33,39,41,49,50,59,61,63,79,85,90,92,94,95,101,108,109,118,135,137,165],somewhat:[4,22,40,56,126,137,179],somewher:[0,12,37,42,72,79,89,108,120,124,130,158,174,237,316,342],soon:[41,60,68,71,95,99,104,126,225,294,342],sophist:[10,27,54,107,115],sorl:4,sorri:[79,240],sort:[3,6,11,31,38,48,58,60,63,68,72,82,83,89,104,109,111,115,116,134,139,178,189,216,217,218,219,220,231,245,250,254,314,315,316,342,355,360],sort_kei:294,sought:[143,150,174,237,245,314,316],soul:110,sound:[22,29,37,57,60,79,81,82,101,103,110,114,130,137,204,289],sourc:[0,4,9,10,12,15,16,17,20,21,22,23,27,31,36,37,45,46,52,54,56,59,62,63,67,71,74,75,78,87,88,93,95,96,107,121,126,127,129,130,133,138,140,143,144,145,146,147,149,150,151,152,153,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,172,173,174,175,176,178,179,180,181,183,184,185,186,187,188,189,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,208,209,210,211,212,213,214,216,217,218,219,220,222,223,225,226,227,229,230,231,232,233,235,236,237,239,240,242,243,244,245,247,248,249,250,252,253,254,255,256,257,258,259,261,262,263,264,265,267,268,269,270,271,272,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,296,297,298,300,301,302,303,304,305,306,308,309,310,313,314,315,316,317,319,320,321,322,323,324,325,326,327,328,329,331,332,333,334,335,336,337,338,339,340,341,342,343,347,348,349,350,353,355,357,358,360,361],source_loc:[25,76,95,116,196,230,231,233,245],source_object:[170,173,185],sourceforg:[278,279,289,292],sourceurl:277,south:[0,22,42,43,48,110,120,158,199,297],south_north:110,southeast:158,southern:110,southwest:[20,42,158],space:[9,20,21,22,25,33,35,40,42,45,47,48,56,67,79,86,90,94,101,108,110,113,115,117,125,128,136,137,150,153,158,164,166,167,169,170,173,199,201,204,205,220,230,245,248,309,316,319,320,325,328,334,341,342],spaceship:120,spacestart:341,spaghetti:[13,326],spam:[12,28,102,115,137,308],spammi:[12,115],span:[16,17,107],spanish:75,spare:[216,217,218,219,220],spars:308,spatial:110,spawen:202,spawn:[46,54,92,119,121,136,137,140,156,158,202,217,218,247,248,249,250],spawner:[18,44,88,119,138,140,141,158,218,219,246,362],spd:133,speak:[0,15,19,40,42,45,59,93,95,112,116,117,125,132,164,196,205,239,245],speaker:[45,204,205],spear:108,special:[2,10,11,13,14,15,19,20,25,26,27,30,31,33,35,37,40,41,50,57,59,60,63,68,75,76,79,80,82,84,85,87,88,94,101,102,103,106,110,111,112,113,115,118,121,122,124,126,130,133,136,145,147,149,152,164,167,186,188,205,214,218,219,230,231,233,240,242,245,269,270,293,314,316,320,326,341],specif:[0,2,4,9,11,12,22,23,24,25,26,27,31,33,36,37,38,39,40,41,42,45,46,49,50,54,55,58,60,61,63,66,68,76,77,78,79,81,86,87,88,89,90,94,95,99,104,106,109,110,111,114,115,118,120,121,122,123,124,125,126,130,131,132,133,134,136,137,143,144,149,156,158,168,174,176,177,178,179,191,192,193,194,196,198,203,205,236,239,245,255,265,270,277,293,294,304,314,316,319,320,324,326,327,328,342,360],specifi:[3,11,12,16,19,21,22,27,29,31,38,42,45,48,50,53,57,61,62,67,82,83,85,87,89,90,97,99,101,102,104,108,110,111,113,114,118,122,126,133,135,149,150,158,165,174,179,181,182,184,186,187,191,193,194,198,202,203,205,214,217,218,219,233,239,240,245,248,249,250,255,276,302,314,317,319,320,322,325,326,327,329,336,337,338,342,355,360],spectacular:41,speech:[196,245],speechlock:239,speed:[11,46,61,81,85,86,92,115,133,212,250,283,317,339],spell:[15,19,28,56,59,108,111,214,219,250],spell_attack:219,spell_conjur:219,spell_heal:219,spell_nam:219,spellnam:219,spend:[38,88,90,118,216,217,218,219,220],spend_act:[216,217,218,219,220],spend_item_us:218,spent:219,spin:[61,89],spit:[3,59,115],splashscreen:185,split:[9,25,31,33,40,57,90,103,104,110,117,120,122,130,135,136,137,150,166,167,183,230,233,247,291,306,319,320,329],split_2:137,split_nested_attr:158,splithandl:137,spoken:[0,45,71,196,204,205,245],spoof:313,spool:62,sport:86,spot:[56,63,143],spread:[69,72,108],spring:[81,186],sprint:212,sprofil:265,spunki:76,spyrit:24,sql:[7,36,55,56,63,85,124,138,300,362],sqlite3:[54,63,85,122,126,127,130,342],sqlite3_prep:303,sqlite:[23,85,127,303],sqllite:36,sqrt:38,squar:[38,128],squeez:85,src:[10,17,20,58,74,79,88,99,101,132,136,138,209],srcobj:[153,166],srun:269,srv:36,ssessionhandl:82,ssh:[9,24,25,39,54,63,82,89,93,104,109,140,260,273,304,305],ssh_interfac:89,ssh_port:89,sshd:102,sshfactori:285,sshprotocol:285,sshserverfactori:285,sshuserauthserv:285,ssl:[7,8,42,54,63,66,82,87,93,140,145,163,260,273,277,290,305],ssl_context:[286,290],ssl_interfac:89,ssl_port:89,sslcertificatefil:8,sslcertificatekeyfil:8,sslciphersuit:8,sslengin:8,ssllab:8,sslprotocol:[8,286,290],ssltest:8,sslv3:66,sstem:68,sta:325,stab:[29,121,230],stabil:[60,169,204],stabl:[37,39,55,59,99],stabli:[96,259],stack:[13,31,60,120,136,144,152,226,249,306,326,334],stackedinlin:144,stackexchang:126,stackful:334,stacktrac:[249,334],staf:107,staff:[9,19,25,56,60,67,72,79,107,108,110,122,132,151,250,320],staff_onli:237,staffer:9,staffernam:9,stage:[2,36,55,60,76,110,122,130,132,144,172,242],stagger:277,stai:[1,31,48,50,62,89,90,120,124,125,137,233],stale:[99,124],stalker:360,stamina:[30,189,219],stamp:[27,42,95,104,124,136,143,147,156,168,244,254,297,302,316],stanc:[115,205],stand:[13,17,20,21,22,25,29,42,48,55,60,62,71,72,79,85,89,94,95,110,115,120,121,122,126,130,132,137,164,178,196,205,229,245,254,259,296,317,320,322,328],standalon:102,standard:[0,1,6,8,9,15,21,27,30,40,42,49,56,57,58,62,63,78,82,87,90,94,102,112,113,115,119,125,130,135,138,140,143,155,184,185,205,232,239,245,285,287,292,309,314,319,328,329,334,343,362],stanza:275,star:[42,158],stare:130,start:[0,1,2,3,4,5,7,12,13,14,15,16,18,20,21,23,25,26,27,29,31,33,34,38,39,40,41,42,43,44,46,47,48,49,50,52,53,54,56,58,59,60,61,63,64,65,68,69,71,72,73,74,75,76,78,79,82,83,85,86,89,90,92,94,95,96,97,100,101,102,103,104,105,106,107,108,110,113,115,118,119,120,122,123,124,126,127,129,130,131,132,135,136,137,138,143,145,150,151,157,158,163,164,166,167,168,169,173,178,179,184,186,187,188,189,194,196,199,200,204,205,214,216,217,218,219,220,225,226,229,231,233,245,247,248,254,256,257,258,259,262,265,267,269,270,275,276,277,278,282,283,284,289,290,296,302,303,306,310,315,319,320,321,322,324,326,327,328,329,334,335,342,361,362],start_all_dummy_cli:296,start_attack:229,start_bot_sess:306,start_delai:[101,115,119,120,226,254,257,259,322],start_driv:120,start_evennia:265,start_hunt:229,start_idl:229,start_lines1:265,start_lines2:265,start_loc_on_grid:48,start_olc:247,start_only_serv:265,start_ov:50,start_patrol:229,start_plugin_servic:39,start_portal_interact:265,start_serv:275,start_server_interact:265,start_sunrise_ev:61,start_text:214,start_turn:[216,217,218,219,220],startapp:[68,85,132,133],startclr:[113,334],startedconnect:[262,276,277],starter:[9,135],starthour:25,startnod:[50,84,187,247,326],startnode_input:[50,187,247,326],startproduc:267,startservic:[268,310],startswith:[40,42,83,158,319],starttupl:285,startup:[11,35,39,59,61,89,101,103,135,245,254,294,303,335],stat:[17,42,59,60,70,84,115,122,132,133,135,138,168,178,216,217,218,219,220,362],state:[11,13,14,31,33,41,42,49,50,54,55,63,79,94,99,101,104,109,113,115,120,121,125,130,136,137,143,149,151,155,162,170,173,200,211,216,217,218,219,220,223,226,229,231,250,254,256,257,259,265,285,314,324,326],state_unlog:162,statefultelnetprotocol:[288,296],statement:[10,13,14,27,31,41,48,50,54,57,58,85,93,94,95,117,118,123,245,320,341],static_overrid:[134,135,136],static_root:135,statict:[42,168],station:120,stationari:229,statist:[3,12,42,103,104,119,123,134,168,189,298,315,332],statu:[20,29,50,57,60,87,89,103,104,114,130,174,178,218,219,220,229,259,263,265,274,275,276,279,293,362],status:60,status_cod:267,stderr:232,stdin_open:99,stdout:[58,99,232,265,335],steadi:63,steal:[42,84,165],steer:120,step1:29,step2:29,step3:29,step:[0,4,7,8,13,14,21,23,29,31,33,36,38,40,42,44,45,49,57,62,68,72,76,81,84,85,90,96,99,101,105,107,120,121,122,125,126,127,133,137,138,157,179,231,257,259,269,281,292,296,297,306,316,320,323,324,326,327,361,362],stick:[15,33,42,50,62,112,156],still:[0,1,4,6,9,11,13,14,15,19,20,22,25,26,29,31,33,37,38,39,40,42,48,54,56,57,59,61,62,63,76,77,78,82,90,93,94,95,101,102,104,105,106,107,109,113,120,122,124,125,127,130,133,137,151,158,165,185,196,214,216,217,218,219,220,231,233,245,249,256,297,326,328,329,338,342],sting:110,stock:[34,54,84,100,209,355],stolen:[102,319],stone:[20,33,59],stoni:59,stop:[7,9,10,12,14,20,25,27,29,34,40,41,42,48,50,56,57,61,62,73,76,79,81,88,89,92,94,95,99,101,103,104,105,107,114,115,119,120,122,127,136,138,155,158,163,168,178,183,193,195,196,205,211,212,217,220,225,226,245,256,257,259,264,265,267,270,282,283,303,304,310,319,320,322,342,362],stop_driv:120,stop_evennia:265,stop_serv:275,stop_server_onli:265,stopproduc:267,stopservic:[268,310],storag:[11,13,23,28,29,33,42,46,55,63,72,84,85,95,101,124,132,137,147,168,173,176,197,204,233,240,244,245,249,250,254,257,259,272,308,312,314,316,321,336,337],storage_modul:321,storagecontain:101,storagescript:101,store:[0,2,9,13,15,21,23,27,28,29,31,33,34,37,38,39,40,42,43,45,46,48,49,52,54,55,56,57,59,60,63,68,72,74,79,81,84,85,86,88,90,94,96,99,101,103,104,111,112,114,115,118,120,122,124,126,127,130,132,133,134,135,136,137,138,143,145,147,152,155,156,158,159,161,166,167,173,176,178,186,187,194,201,203,204,205,209,212,213,218,222,230,231,233,239,240,244,248,249,250,251,255,256,257,258,259,265,269,270,271,272,275,277,278,279,281,289,292,297,303,304,305,306,308,310,314,315,316,317,319,321,322,323,324,325,326,327,332,334,336,337,338,342,355,360],store_kei:259,store_result:47,store_tru:232,stored_obj:25,storekei:[84,259],storenam:84,storeroom:84,storeroom_exit:84,storeroom_kei:84,storeroom_key_nam:84,stori:[3,9,96,132],storm:[28,118],storypag:3,storytel:122,stove:245,str:[0,10,11,22,25,27,38,39,49,50,57,58,59,72,73,83,90,95,112,113,118,124,126,132,133,140,143,145,149,150,151,152,153,158,165,169,173,174,175,176,178,179,181,183,186,187,188,189,191,192,193,194,196,197,198,199,203,204,205,209,211,214,216,217,218,219,220,231,232,233,236,237,240,244,245,248,249,250,255,256,257,259,262,263,265,270,271,272,274,275,276,277,278,280,283,284,285,288,289,290,293,294,296,302,303,304,305,306,308,309,310,313,314,315,316,317,319,320,321,322,324,325,326,327,328,334,335,336,337,338,339,340,341,342,343,347,360],straight:[48,67,125],straightforward:[25,40,84,90,120,122],strang:[6,8,14,29,40,55,130,152],strangl:89,strategi:[41,220],strattr:[1,11,314],strawberri:232,stream:[105,274,278,304],streamlin:[36,178],strength:[11,56,57,59,60,72,79,115,133],stress:[92,296],stretch:110,stribg:342,strict:[10,249,319],stricter:249,strictli:[19,50,58,76,132,185,219,328],strike:[42,50,81,115,164,213,219,220],string1:342,string2:342,string:[5,9,11,12,13,15,19,20,22,23,25,27,29,31,33,34,35,40,41,42,48,49,50,53,54,56,57,58,59,61,67,70,75,81,82,83,85,86,87,88,89,92,94,95,96,103,108,110,111,112,113,114,115,118,123,124,126,128,132,133,136,137,138,143,145,147,149,150,153,156,158,164,165,166,167,168,169,173,174,175,176,178,179,181,185,187,196,197,198,199,202,203,204,205,209,210,214,216,217,218,219,220,229,233,236,237,238,239,240,244,245,248,249,250,254,257,259,265,267,270,274,277,285,288,289,291,297,302,304,306,309,313,314,315,316,317,319,320,322,323,324,325,326,327,328,334,335,336,338,339,340,341,342,343,360,362],string_from_modul:342,string_partial_match:342,string_similar:342,string_suggest:342,stringproduc:267,strip:[21,22,33,40,42,50,57,73,80,84,107,108,113,117,122,150,158,166,167,205,250,270,285,288,289,319,320,324,326,334,342],strip_ansi:[80,319,341],strip_control_sequ:342,strip_mxp:319,strip_raw_ansi:319,strip_raw_cod:319,stroll:212,strong:[79,113,122,341],strongest:79,strongli:[63,72,94,123,204],strr:203,struct:55,structur:[9,11,33,37,40,42,44,46,47,48,54,55,58,62,63,67,68,79,82,87,94,95,108,118,132,133,135,137,158,205,245,248,249,250,289,294,317,323,326,352,359,360],strvalu:[11,314,315],stuck:[50,62],studi:58,stuff:[3,9,11,21,29,31,37,46,48,50,56,60,66,72,79,84,95,101,104,106,108,118,137,152,158,188,232,259,303,348],stumbl:96,stupidli:34,sturdi:325,stutter:107,style:[3,16,20,21,27,33,37,39,40,44,50,54,56,57,60,78,86,94,105,110,113,115,121,123,128,137,147,153,155,166,181,182,187,198,200,216,232,245,249,319,324,328,342],styled_foot:153,styled_head:[33,153],styled_separ:153,styled_t:[33,153],sub:[9,11,36,37,56,64,68,87,89,107,108,115,118,136,137,142,148,171,172,177,179,205,232,234,236,238,241,248,250,251,260,312,318,319,341,344],sub_ansi:319,sub_app:132,sub_brightbg:319,sub_dblspac:341,sub_mxp_link:341,sub_text:341,sub_xterm256:319,subclass:[27,63,104,108,117,118,124,158,179,233,244,254,275,288,294,313,316,333,338,342],subdir:126,subdirectori:[37,126],subdomain:[8,89,102],subfold:[46,85,94,95,133,134],subject:[36,38,80,85,89,123,188,198],submarin:120,submenu:[105,179,247],submenu_class:179,submenu_obj:179,submiss:[187,355],submit:[17,37,102,132,187,355,360],submitcmd:187,submodul:[141,206,289],subnegoti:289,subnet:[12,42,156],subpackag:[87,126,141],subprocess:[25,342],subreddit:78,subscrib:[12,33,34,40,42,57,63,79,114,127,131,145,163,173,174,175,218,259,276,307],subscript:[33,42,57,78,114,131,163,172,175,176,259],subsequ:[10,11,33,42,94,115,163,320,342],subsequent_ind:328,subset:[55,111,126],subsid:124,substitut:[70,86,105,245,319,341],substr:319,subsystem:[9,62,85,240],subtitl:17,subtract:[84,248],subturn:115,subword:342,succ:239,succe:[60,115,184],succeed:[184,232],success:[72,115,122,133,143,174,178,184,216,217,218,219,220,223,230,231,240,249,265,269,316,324,336,342,360],success_teleport_msg:231,success_teleport_to:231,success_url:360,successfuli:202,successfulli:[10,28,33,36,59,76,109,110,129,143,202,230,233,245,257,265,277,309,316,360],suddenli:[26,96,316],sudo:[62,99,102],suffic:[17,56,60],suffici:[85,89,93,118],suffix:[27,96,113,319,334,335,342],suggest:[1,23,25,37,47,50,51,54,60,66,67,69,89,94,96,124,137,139,150,165,178,196,205,231,245,342,361],suggestion_cutoff:165,suggestion_maxnum:165,suit:[29,34,54,63,116,129,138,169,342,360],suitabl:[21,25,33,37,54,62,63,79,82,86,87,89,111,130,151,240,299,306,322],sum:[37,81,90,138,152],summar:[0,78,138],summari:[0,7,45,78,95,109,122,179],summer:186,sun:61,sunris:61,sunt:51,super_long_text:327,superclass:144,superfici:204,superflu:341,supersus:240,superus:[2,4,5,6,9,13,14,19,20,21,23,25,40,42,57,59,62,80,94,95,110,121,133,143,147,157,168,174,181,199,211,229,239,240,245,250,265,316,320,322],supplement:50,suppli:[10,11,27,34,37,42,50,57,58,62,67,71,73,83,87,92,101,104,108,111,113,114,115,122,126,147,152,153,156,158,163,168,169,175,179,183,185,186,189,244,245,249,254,259,276,306,316,324,329,339,342],supporst:292,support:[2,4,7,8,9,11,23,26,33,37,39,41,42,43,46,48,49,50,55,56,57,60,62,63,64,65,69,73,74,75,80,82,85,86,89,90,93,97,99,102,108,109,112,113,122,125,138,155,164,182,183,184,186,197,232,239,245,248,249,250,259,270,278,279,280,281,285,287,288,289,290,292,294,305,314,319,323,326,327,328,334,339,342,347,362],supports_set:[73,270],suppos:[0,33,50,60,75,82,108,118,137,143,179],supposedli:[204,289],suppress:[24,287],suppress_ga:[140,260,273],suppressga:287,supress:287,sur:78,sure:[0,2,4,5,8,9,11,12,13,14,15,19,20,21,23,25,28,29,30,31,33,36,37,40,41,42,43,48,50,56,57,59,60,61,62,70,71,72,74,77,79,80,85,86,88,89,90,92,94,95,96,99,101,104,105,108,109,110,111,112,114,115,117,122,124,125,126,127,130,132,133,135,136,137,139,143,145,151,152,153,155,158,163,166,173,175,179,181,195,199,203,204,205,210,214,219,222,226,229,230,231,236,239,240,245,249,250,256,257,265,269,275,277,282,303,309,310,311,313,315,316,319,321,323,326,332,338,339,341,342,358,360],surfac:[57,81,102],surpris:[22,38,68,79,90],surround:[31,33,42,110,115,118,128,156,199,229,338,342],surviv:[5,11,27,28,31,42,49,50,83,101,104,114,115,125,145,152,168,179,254,255,259,322,324,326],suscept:[27,55,240],suspect:132,suspend:[99,102,105],suspens:101,suspici:50,suspicion:132,svn:[36,107],swallow:[95,117,274,341],swap:[42,113,126,136,137,158,186,201,316,324],swap_autoind:324,swap_object:316,swap_typeclass:[59,124,143,316],swapcas:319,swapcont:137,swapper:316,swedish:75,sweep:101,swiftli:10,swing:[28,29,33,81],switch1:128,switch2:128,switch_opt:[155,156,157,158,163,164,165,166,167,168,186],sword:[20,28,33,60,72,76,84,85,118,178,205,250,339,342],symbol:[14,15,33,48,74,105,107,118,199,214,233,327],symlink:62,symmetr:328,sync:[63,82,104,130,173,283,288,303,304,305,306,314,323],sync_port:306,syncdata:[305,306],syncdb:126,synchron:335,syntact:[240,342],syntax:[5,6,13,14,15,21,22,23,29,33,40,42,45,47,54,57,59,61,75,79,90,96,113,118,122,128,133,140,141,153,157,158,166,167,169,179,184,186,187,232,240,245,265,277,304,316,318,319,334],syntaxerror:59,sys_cmd:151,sys_game_tim:58,syscmdkei:[33,140],syscommand:[140,148,154,245],syslog:208,sysroot:74,system:[0,2,4,5,9,10,11,19,21,22,23,26,27,28,29,31,34,36,37,38,39,40,43,45,46,48,54,55,58,59,61,62,63,73,74,75,76,78,80,82,83,84,85,86,89,92,94,96,101,102,103,104,106,107,108,109,110,111,113,114,118,120,121,124,125,126,127,128,130,131,133,135,137,138,139,140,144,145,147,148,149,151,153,154,155,157,165,167,169,171,174,175,176,178,179,181,185,192,193,194,195,196,197,198,200,201,202,204,205,208,209,210,214,216,217,218,219,220,225,231,233,234,237,239,240,244,245,247,250,251,257,265,288,294,302,312,316,320,322,325,326,335,361,362],system_command:33,systemat:38,systemctl:8,systemmultimatch:167,systemnoinput:167,systemnomatch:167,systemsendtochannel:167,tab:[9,14,26,30,36,52,58,68,94,95,105,113,136,137,319,328],tabl:[0,4,13,15,42,44,45,47,57,58,63,68,81,87,96,110,112,113,118,124,127,133,153,155,165,168,187,249,289,308,319,325,327,328,339,342],table_char:325,table_format:155,table_lin:328,table_str:57,tablea:325,tableb:325,tablechar:[57,325],tableclos:[87,289],tablecol:[327,328],tableopen:[87,289],tablet:16,tabletop:[57,72,78,123,216,220],tabsiz:[319,328],tabstop:341,tabularinlin:313,tack:[20,118,152],tackl:37,tactic:[72,115],taction:115,tag:[9,12,13,18,20,24,27,33,44,47,50,54,56,57,63,73,85,86,87,94,95,99,108,113,118,123,124,133,135,136,137,138,139,140,141,144,153,155,156,157,158,163,164,165,166,167,168,169,170,172,173,176,178,179,180,181,182,184,185,186,187,188,192,198,199,200,201,202,203,205,208,211,212,213,214,216,217,218,219,220,223,229,230,231,232,237,239,242,245,249,250,252,280,294,302,312,313,315,316,319,322,324,325,326,327,328,339,342,362],tag_categori:313,tag_data:313,tag_kei:313,tag_typ:313,tagadmin:313,tagform:313,tagformset:313,taghandl:[111,124,313,317],taginlin:[144,172,235,242,252,313],tagkei:[239,317,322],taglin:17,tagnam:250,tagstr:[250,317],tagtyp:[111,315,317,339],tail:[75,89,99,265,335],tail_log_fil:[265,335],tail_log_funct:335,tailor:[4,68,355],take:[0,3,4,9,10,11,13,14,15,16,17,19,20,21,22,25,26,27,28,29,31,33,37,39,41,45,48,50,51,54,55,56,57,61,63,68,69,73,74,75,76,78,79,82,84,89,90,94,95,102,103,104,105,107,108,110,113,115,118,120,121,122,123,124,125,126,132,133,135,137,138,143,145,150,151,155,167,173,176,178,181,183,186,187,199,202,203,205,208,212,214,216,217,218,219,220,229,231,240,248,250,269,285,293,305,306,315,316,319,324,325,326,327,336,342,343],taken:[31,42,55,63,102,115,119,120,122,164,185,208,216,217,218,219,220,285,309,319,322],takeov:307,taladan:47,tale:3,talk:[23,27,33,34,37,39,40,42,45,57,59,89,90,130,137,164,178,204,205,213,231,262],talker:[54,60],talki:63,talking_npc:[140,141,177],talkingcmdset:213,talkingnpc:213,tall:[42,128,164,205],tallman:[42,164],tandem:60,tantal:14,target1:219,target2:219,target:[21,25,28,29,30,33,34,39,42,57,72,87,102,113,115,118,122,126,135,137,143,153,158,163,164,168,176,181,184,186,196,198,214,216,217,218,219,220,229,233,245,315,319,322,326,342],target_loc:[196,212,231,233,245],target_obj:240,targetlist:198,task:[0,27,36,39,40,90,92,93,101,109,111,137,192,194,214,258,259,342],task_handl:[140,258,342],task_id:[194,258],taskhandl:[140,141,251,342],tast:[22,34,132],tavern:205,tax:[74,92],taylor:78,tb_basic:[140,177,215],tb_equip:[140,177,215],tb_filenam:320,tb_item:[140,177,215],tb_iter:320,tb_magic:[140,177,215],tb_rang:[140,177,215],tbbasiccharact:216,tbbasicturnhandl:216,tbearmor:217,tbequipcharact:217,tbequipturnhandl:217,tbeweapon:217,tbitemscharact:218,tbitemscharactertest:218,tbitemsturnhandl:218,tbmagiccharact:219,tbmagicturnhandl:219,tbodi:133,tbrangecharact:220,tbrangeobject:220,tbrangeturnhandl:220,tchar:115,tcp:[54,102],tcpserver:[39,310],teach:123,team:[33,36,60,63,107,130],teardown:[126,169,195,227,291,340],teaser:89,tech:78,technic:[4,6,9,10,11,19,20,23,38,39,50,63,69,82,89,107,111,113,118,124,138,178,314],techniqu:[29,138,319],tediou:[1,105,110],teenag:[21,102],tehom:[9,118],tehomcd:9,tel:[0,12,57,62,90,120,158],teleport:[12,14,20,42,57,84,121,139,158,164,231,239,320],teleportroom:231,televis:31,tell:[0,3,5,8,10,12,13,19,21,22,23,26,29,31,33,40,41,42,45,48,50,52,57,58,59,60,68,72,73,74,75,76,79,82,85,86,89,90,92,94,95,99,101,102,108,109,115,116,120,126,127,129,130,131,133,134,138,145,155,163,164,175,176,184,205,231,245,265,283,294,306,324,360],telnet:[9,15,25,30,39,42,54,62,63,74,78,82,93,99,100,102,104,109,113,136,137,140,168,260,273,278,279,280,281,285,286,287,289,290,292,296,304,305,341],telnet_:89,telnet_hostnam:53,telnet_interfac:89,telnet_oob:[87,140,260,273],telnet_port:[9,36,53,89,297],telnet_ssl:[140,260,273],telnetoob:289,telnetprotocol:[286,288,290],telnetserverfactori:288,teloutlock:239,temp:176,tempat:187,templ:199,templat:[2,3,4,5,27,31,42,46,63,80,86,103,106,108,122,124,130,133,134,135,136,137,144,164,166,187,265,294,304,305,314,325,334,353,360],template_nam:360,template_overrid:[4,134,135,136],template_regex:[314,334],template_rend:106,template_str:86,templates_overrid:134,templatestr:325,templatetag:[140,344,354],templateview:360,tempmsg:[174,176],temporari:[6,11,109,121,126,130,152,176,197,216,217,218,219,220,259,326],temporarili:[20,26,31,42,50,59,89,96,101,126,163,168,174,194,202],tempt:[42,60,94,103,156],ten:[29,89,110],tend:[40,42,56,60,63,72,75,85,89,96,102,118,120,123,128,137,158,204,208],tent:[44,110,138],term:[0,10,31,61,62,63,68,89,90,95,125,138,153,203],term_siz:[41,140],termin:[4,23,26,27,41,46,58,59,62,63,74,89,92,94,95,96,99,102,105,109,113,122,125,130,137,138,140,193,214,216,217,218,219,220,264,265,285,292,308,360],terminalrealm:285,terminals:285,terminalsessiontransport:285,terminalsessiontransport_getp:285,terrain:48,terribl:278,ters:101,test1:[11,73,328],test2:[11,33,73,113],test3:[11,328],test4:[11,328],test5:11,test6:11,test7:11,test8:11,test:[0,5,10,11,13,14,15,17,19,20,21,22,23,24,25,29,31,33,36,37,40,41,42,44,45,49,50,55,57,59,60,61,62,64,67,68,71,73,78,79,80,84,88,89,90,93,94,95,97,105,106,108,110,114,115,119,123,129,130,131,132,136,137,138,140,148,150,154,155,157,165,168,177,181,184,186,187,190,206,207,214,216,217,218,219,220,221,222,248,249,260,267,270,273,294,295,296,300,316,318,319,320,322,326,330,340,342,344,346,348,354,362],test_:126,test_about:169,test_accept:195,test_access:169,test_add:195,test_add_valid:195,test_all_com:169,test_alternative_cal:126,test_amp_in:291,test_amp_out:291,test_at_repeat:227,test_attribute_command:169,test_audit:210,test_ban:169,test_batch_command:169,test_bold:291,test_c_creates_button:301,test_c_creates_obj:301,test_c_dig:301,test_c_examin:301,test_c_help:301,test_c_login:301,test_c_login_no_dig:301,test_c_logout:301,test_c_look:301,test_c_mov:301,test_c_move_:301,test_c_move_n:301,test_c_soci:301,test_cal:195,test_cas:126,test_cboot:169,test_cdesc:169,test_cdestroi:169,test_cemit:169,test_channel:169,test_channelcommand:169,test_char_cr:169,test_char_delet:169,test_clock:169,test_color:291,test_color_test:169,test_copi:169,test_creat:169,test_cwho:169,test_data_in:291,test_data_out:291,test_del:195,test_desc:169,test_desc_default_to_room:169,test_destroi:169,test_destroy_sequ:169,test_dig:169,test_displayinput_nod:326,test_do_nested_lookup:169,test_dynamic_nod:326,test_edit:195,test_edit_valid:195,test_emit:169,test_empty_desc:169,test_end_nod:326,test_examin:169,test_exit:195,test_exit_command:169,test_find:169,test_forc:169,test_general_context:350,test_get:358,test_get_and_drop:169,test_get_authent:358,test_get_dis:358,test_giv:169,test_handl:195,test_help:169,test_hom:169,test_ic:169,test_ic__nonaccess:169,test_ic__other_object:169,test_ident:291,test_idl:301,test_info_command:169,test_interrupt_command:169,test_invalid_access:358,test_inventori:169,test_ital:291,test_large_msg:291,test_list:195,test_list_cmdset:169,test_lock:[169,195],test_look:169,test_look_nod:326,test_mask:210,test_memplot:301,test_menu:214,test_messag:302,test_mudlet_ttyp:291,test_multimatch:169,test_mux_command:169,test_mycmd_char:126,test_mycmd_room:126,test_nam:169,test_nested_attribute_command:169,test_nick:169,test_object:169,test_object_search:126,test_ooc:169,test_ooc_look:169,test_opt:169,test_pag:169,test_password:169,test_perm:169,test_pi:169,test_plain_ansi:291,test_pos:169,test_quel:169,test_queri:[140,260,295],test_quit:169,test_resourc:[126,140,141,169,195,210,227,291,318,358],test_return_valu:126,test_sai:169,test_script:169,test_send_random_messag:227,test_server_load:169,test_sess:169,test_set_game_name_and_slogan:350,test_set_help:169,test_set_hom:169,test_set_nod:326,test_set_obj_alia:169,test_set_webclient_set:350,test_simpl:126,test_simple_default:169,test_spawn:169,test_split_nested_attr:169,test_start:195,test_start_nod:326,test_tag:169,test_teleport:169,test_toggle_com:169,test_tunnel:169,test_tunnel_exit_typeclass:169,test_typeclass:169,test_upp:126,test_valid_access:358,test_valid_access_multisession_0:358,test_valid_access_multisession_2:358,test_valid_char:358,test_view_nod:326,test_wal:169,test_whisp:169,test_who:169,test_without_migr:126,testabl:126,testaccount:169,testadmin:169,testampserv:291,testapp:132,testbatchprocess:169,testbodyfunct:227,testbuild:169,testcas:[126,291,301,333,340,350],testcmdcallback:195,testcomm:169,testcommand:50,testdefaultcallback:195,testdummyrunnerset:301,tester:[89,118,283],testeventhandl:195,testform:325,testgener:169,testgeneralcontext:350,testhelp:169,testid:33,testinterruptcommand:169,testirc:291,testmemplot:301,testmenu:[187,326],testmixedrefer:333,testmod:306,testmymodel:126,testobj:126,testobject:126,testobjectdelet:333,testok:90,testregularrefer:333,testresult:249,testset:126,testsharedmemoryrefer:333,teststr:126,testsystem:169,testsystemcommand:169,testtelnet:291,testunconnectedcommand:169,testvalu:11,testwebsocket:291,text2html:[140,141,318],text:[0,1,2,5,7,9,10,13,14,15,17,18,21,22,24,26,30,33,34,35,37,39,42,44,45,47,49,51,54,55,56,57,58,59,62,67,71,72,75,76,77,78,79,80,82,84,85,86,87,89,90,94,95,96,97,99,107,108,109,110,111,117,120,122,123,125,126,130,132,136,137,138,143,145,150,153,155,156,157,158,163,164,165,166,167,168,169,170,173,174,175,176,178,179,180,181,184,185,186,187,188,189,192,194,196,198,199,200,201,202,204,205,209,211,212,213,214,216,217,218,219,220,223,229,230,231,232,237,240,245,247,248,250,254,262,263,270,276,277,280,283,284,285,288,289,293,294,304,305,306,309,310,314,315,317,319,320,322,324,325,326,327,328,334,336,339,341,342,343,355,362],text_color:189,text_exit:[22,179],text_flow_pane1:136,text_flow_pane2:136,text_single_exit:22,textarea:[338,355],textbook:39,textbox:355,textfield:[85,132],textstr:73,texttag:[125,138,362],texttohtmlpars:341,textual:38,textwrap:328,textwrapp:328,than:[0,2,4,6,8,11,13,14,16,19,23,24,25,26,29,31,33,35,37,38,41,42,45,46,48,50,51,52,53,54,56,57,59,60,61,63,67,68,70,72,75,79,81,85,88,89,90,92,94,96,102,103,104,105,108,109,111,112,113,114,115,118,121,122,124,125,126,127,128,130,133,134,136,137,138,143,147,150,151,152,155,156,157,158,159,163,166,168,178,179,180,183,189,194,196,203,204,205,212,214,216,217,218,219,220,230,232,239,245,247,248,265,291,306,311,313,314,315,316,319,320,326,327,328,332,334,335,337,338,339,341,342,360],thank:[4,101,133,137,198,310],thankfulli:132,thead:133,thei:[0,1,2,4,5,6,8,9,10,11,12,13,14,15,16,17,19,20,21,22,23,25,27,29,30,31,33,34,37,38,39,40,41,42,43,45,47,50,52,54,55,56,57,60,62,63,65,67,68,72,74,76,77,79,80,82,84,85,87,88,89,90,91,92,94,95,96,101,102,104,105,106,107,108,109,110,111,112,113,115,117,118,120,122,123,124,125,126,130,131,133,135,136,137,138,139,143,144,151,152,155,157,158,163,164,166,167,168,173,178,179,181,184,186,188,193,199,204,205,216,217,218,219,220,230,231,232,233,239,240,244,245,248,250,251,254,256,257,259,265,285,286,288,289,290,294,297,303,304,305,306,308,313,314,319,320,321,323,326,328,334,342,343,355,360],theirs:[115,180,188],them:[0,2,4,5,6,9,10,11,12,13,14,15,16,21,22,23,26,27,28,29,30,31,33,34,35,37,38,39,40,42,45,47,49,50,53,54,56,57,58,59,60,61,63,65,67,68,70,72,73,74,75,76,79,81,82,84,85,86,87,88,89,90,94,95,96,97,101,102,103,104,105,108,109,110,111,112,113,114,115,117,118,120,121,122,123,124,125,126,127,130,132,133,134,135,136,137,138,139,143,149,150,151,153,155,157,158,163,165,166,167,169,174,180,181,182,186,187,188,189,191,193,196,202,203,205,214,216,217,218,219,220,223,229,231,232,236,240,245,250,256,259,265,283,285,288,296,300,303,304,306,313,314,316,317,319,320,322,326,334,338,341,360],themat:60,theme:[60,133],themself:218,themselv:[0,11,19,21,28,31,33,42,48,50,54,57,68,71,72,79,80,84,88,96,101,106,112,118,120,122,124,126,131,137,139,158,205,245,254,257,265,315,317,338],theoret:[31,107],theori:[31,41,56,78,122,138,143,151,362],thereaft:86,therefor:[0,48,61,67,90,101,121,126,157,179,191],therein:[15,33,155,166,186,202],thereof:[205,245],thi:[0,1,2,3,4,5,6,8,9,10,11,12,13,14,15,16,18,19,20,21,22,23,24,25,26,27,28,29,30,31,33,34,35,36,37,38,39,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,67,69,70,71,72,73,74,75,76,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,142,143,144,145,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,191,192,193,194,196,197,198,199,200,201,202,203,204,205,208,209,211,212,213,214,216,217,218,219,220,222,223,225,226,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,244,245,248,249,250,251,252,254,255,256,257,258,259,260,262,263,264,265,267,269,270,271,272,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,292,293,294,296,297,298,299,300,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,332,333,334,335,336,337,338,339,340,341,342,343,344,347,348,352,353,355,359,360,361],thie:50,thief:60,thieveri:[42,165],thin:[10,22,29,110,181,335],thing:[0,1,3,4,5,6,8,9,10,11,12,13,15,19,20,21,22,25,26,27,28,29,30,31,33,34,37,38,39,40,42,45,46,47,48,49,50,54,57,58,59,60,62,63,68,69,70,72,73,74,75,78,79,81,82,84,85,88,89,90,92,94,95,96,99,101,102,103,104,106,107,108,109,110,113,114,115,117,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,143,151,152,158,174,178,179,186,194,204,205,214,220,226,231,232,239,240,244,245,248,269,274,278,310,313,314,316,319,320,328,334,338,360],think:[1,20,29,31,34,37,45,47,50,54,58,60,61,69,72,78,80,90,93,94,95,96,108,110,111,113,114,134,137,138,306,360],third:[0,8,9,23,27,37,38,41,42,50,63,68,71,74,89,95,100,113,120,126,127,133,158,319],thirdnod:50,this_sign:307,thoma:[12,42,86,156],thorn:[11,88],thorough:26,those:[2,3,4,6,9,11,13,14,15,19,20,21,23,28,30,31,33,35,36,42,43,46,47,50,54,55,56,57,59,60,61,63,67,70,72,76,77,78,79,80,84,85,87,88,89,94,95,102,104,108,109,110,111,113,117,118,120,122,123,124,126,127,129,130,134,135,137,152,153,155,158,164,165,169,175,179,205,209,214,216,230,231,240,248,249,250,288,293,315,316,326,328,336,337,340,342,355,360],though:[2,10,11,12,13,14,15,22,23,26,27,30,31,37,38,40,50,56,58,59,61,62,63,68,71,74,78,80,88,89,90,93,95,96,99,101,102,103,109,115,118,120,121,122,125,126,127,128,130,137,143,153,179,180,189,216,217,219,220,225,231,232,245,250,319,342],thought:[23,38,60,78,79,83,137],thousand:[38,89,110,132],thread:[23,27,54,78,93,109,284,310,335,342],threadpool:[93,310],threadsaf:313,threat:102,three:[0,4,12,13,16,22,25,31,33,45,50,68,79,82,84,86,88,89,113,132,133,134,150,214,219,240,256,319,326],threshold:[227,308,320],thrill:84,throttl:[140,141,143,260,270,283],through:[0,1,2,5,9,13,14,17,23,25,27,30,31,33,34,38,39,40,43,45,47,50,51,52,54,55,56,57,58,59,60,61,63,67,68,69,70,75,76,79,82,84,86,87,88,89,90,92,95,96,97,98,102,103,104,105,106,107,108,109,113,115,116,118,120,121,123,135,137,138,139,140,143,152,158,165,173,178,186,191,209,211,216,217,218,219,220,233,238,240,244,245,249,255,256,259,265,267,272,281,285,288,294,297,302,304,305,313,315,316,320,322,325,326,327,334,341,342,355,360],throughout:[11,20,48,50,54,103,218],throughput:[174,322],thrown:115,thrust:230,thu:[14,19,31,33,38,42,43,50,53,56,57,72,79,82,85,95,107,110,113,120,121,122,124,133,134,135,155,159,180,204,240,245,259,297,311,314,315,322],thud:188,thumb:[52,113,130],thumbnail:4,thunder:23,thunderstorm:121,thusli:74,tick:[23,33,50,63,114,130,131,138,218,229,231,259,297],ticker1:[114,259],ticker2:[114,259],ticker:[54,73,101,131,138,145,229,231,255,259,270],ticker_class:259,ticker_handl:[114,131,140,259],ticker_pool_class:259,ticker_storag:259,tickerhandl:[27,44,101,115,131,138,140,141,212,218,231,251,362],tickerpool:259,tickerpool_layout:259,ticket:93,tidbit:54,tidi:99,tie:[115,137],tied:[63,118,152,165,181,223,226,237],tier:89,ties:[48,134,160],tight:181,tightli:102,tim:[181,187,189,214,216,217,218,219,220],time:[0,1,2,4,5,6,8,9,10,11,12,13,14,17,20,21,22,23,25,26,28,29,30,31,34,36,37,38,39,40,41,44,48,50,51,53,54,55,57,58,59,60,62,63,64,65,68,69,71,72,74,79,82,85,87,88,89,90,92,93,94,95,99,103,104,105,108,109,112,113,114,115,116,118,120,121,122,123,124,126,127,128,130,131,132,134,136,137,138,143,145,147,149,150,152,153,156,163,168,174,176,178,183,184,186,193,194,197,199,202,203,211,212,214,216,217,218,219,220,222,226,229,230,231,237,244,245,248,250,251,254,257,258,259,265,267,269,271,272,277,283,288,290,297,298,302,303,304,306,308,313,314,316,317,319,320,321,322,327,329,332,333,335,338,342,361],time_ev:197,time_factor:[27,61,183,329],time_format:[58,342],time_game_epoch:[27,61,329],time_to_tupl:183,time_unit:[61,183],time_until_next_repeat:[101,257],timedelai:[29,258,340,342],timedelta:[336,343],timeeventscript:194,timefactor:61,timeformat:[335,342],timeit:92,timeout:[66,115,119,288,308,332],timer:[20,27,33,46,55,63,82,101,114,115,186,218,222,225,230,251,257,259,296,304,339],timerobject:101,timescript:329,timeslot:186,timestamp:[25,27,308,329],timestep:297,timestr:335,timetrac:[140,260,295],timetupl:61,timezon:[23,335,336,343],tini:[23,38,80],tinker:96,tintin:[24,278,279,289,292],tinyfugu:24,tinymud:[56,107],tinymush:[56,107,128],tinymux:[56,107],tip:[37,69,78,102,111],tire:[20,152],titeuf87:233,titl:[17,22,34,42,47,68,97,136,163,165,179,236,319,322,360],titlebar:136,titleblock:68,tlen:70,tls:8,tlsv10:66,tlsv1:8,tmp:[36,62],to_be_impl:360,to_byt:342,to_cur:218,to_displai:179,to_dupl:151,to_execut:342,to_exit:0,to_fil:208,to_init:220,to_non:245,to_obj:[143,153,245],to_object:175,to_pickl:323,to_str:342,to_syslog:208,tobox:274,toc:361,todai:[137,189],todo:57,toe:107,togeth:[0,3,8,9,14,22,29,31,33,42,47,48,56,57,60,63,67,70,72,82,88,89,91,115,118,121,122,123,124,125,130,137,149,158,160,174,186,201,202,204,205,230,231,244,250,274,293,306,313,319,320,334,339],toggl:[80,288],toggle_nop_keepal:288,togglecolor:80,toint:[108,248],token:[70,245,285,288,320,334],told:[43,58,89,90,94,112,113,122,127,338],tolkien:61,tom:[42,57,86,122,128,158,164,188,205,325],tommi:[19,79,86],ton:[56,81],tone:113,tonon:[42,158],too:[0,4,6,9,11,12,13,14,17,20,21,22,24,25,27,29,33,38,40,41,42,45,46,47,48,50,56,57,58,59,60,62,72,79,82,83,84,90,92,95,105,113,115,120,121,122,124,127,130,132,137,156,158,177,214,219,223,239,257,270,274,308,310,320,325,326,327,328,339,342],took:[126,342],tool:[4,6,7,8,23,29,52,56,61,62,63,85,89,95,99,107,108,110,111,113,118,135,138],toolbox:78,tooltip:136,top:[5,9,13,22,26,29,31,33,38,46,47,49,51,52,56,57,58,59,62,67,68,74,78,84,92,94,95,100,101,103,109,110,111,116,122,124,129,130,132,133,136,137,138,147,152,176,179,181,183,201,205,214,232,233,237,244,254,265,307,314,316,317,320,327,328,335],topcistr:236,topic:[4,10,20,31,33,39,41,42,54,67,68,85,92,104,118,125,165,216,217,218,219,220,236,339,355,360],topicstr:236,tos:239,tostr:274,total:[27,42,61,79,81,90,92,101,103,104,113,117,138,168,184,302,328,329],total_num:332,touch:[8,53,59,95,96,102,103,113],tour:90,toward:[22,33,39,41,90,101,110,189,199,220,229],tower:[110,186,231],tportlock:239,trac:93,trace:[82,95,194,302,326],traceback:[6,13,27,56,59,94,96,101,109,113,122,126,132,134,194,201,248,274,316,320,334,335,342],tracemessag:302,track:[11,27,30,48,56,60,63,72,76,81,85,94,97,98,99,101,104,115,120,127,131,132,137,143,152,220,255,276,277,282,285,288,303,308,323,324,336],tracker:[42,60,69,130],trade:[45,178],tradehandl:178,trader:45,tradetimeout:178,tradit:[10,15,36,72,73,82,89,102,113,115,137,233,288,304,327],tradition:[56,82],traffic:[8,102,278],train:78,traindriv:120,traindrivingscript:120,trainobject:120,trainscript:120,trainstop:120,trainstoppedscript:120,trait:[27,72,250],transact:178,transfer:[84,132,152,276,286,290,328],transform:[36,174],transit:[88,123],translat:[14,39,44,78,86,87,112,113,125,204,205,250,267,319],transmiss:208,transmit:112,transpar:[104,125,136,137,244,259],transport:[274,285,294],transportfactori:285,transpos:125,trap:[14,81,121],traumat:50,travel:[48,81,82,87,95,212,233],travers:[11,43,48,79,84,88,120,196,211,212,229,230,233,239,245],traverse_:33,traversing_object:[196,211,212,233,245],travi:[44,138,362],travis_build_dir:129,treasur:[9,233],treat:[10,14,33,63,94,95,104,110,111,118,124,137,143,149,152,174,188,245,250,306,328,339],tree:[3,11,33,46,50,60,62,63,76,79,95,130,139,179,205,214,232,245,250,265,294,310,326,342],tree_select:[140,141,177],treestr:214,treshold:332,tri:[11,12,14,24,29,33,42,52,57,60,79,82,86,89,90,104,106,112,115,118,132,137,150,168,178,180,187,223,230,231,269,308,342,343],trial:[93,105,291],tribal:110,trick:[8,22,78,137,316,355],tricki:[108,125,126,137],trickier:[9,68],trigger:[21,24,31,33,36,41,45,48,50,55,56,68,73,82,83,88,99,104,106,113,114,115,116,117,120,133,134,137,143,145,149,150,153,155,169,174,179,197,199,200,229,231,244,245,250,257,259,267,270,274,296,303,307,322,334],trim:319,trip:95,tripl:[27,95,113,334,342],trivial:[27,33,39,41,90,92,137],troll:12,troubl:[5,8,9,23,40,45,57,62,69,74,90,104,130,138,314,361],troubleshoot:9,troublesom:[12,13,14],trove:9,truestr:187,truli:[0,12,38,40,104,186],trust:[19,42,50,56,168,320],truth:41,truthfulli:33,try_num_prefix:150,ttarget:115,tto:288,tty:[9,99],ttype:[54,140,260,273,285,288],ttype_step:292,tuck:[110,223],tun:[42,158],tune:125,tunnel:[0,20,22,43,48,57,120,158,290],tup:[38,205],tupl:[11,38,40,41,42,50,58,59,79,85,86,87,89,108,115,118,133,140,143,150,156,158,166,167,175,178,179,183,184,188,191,199,205,218,219,233,239,240,245,248,249,250,259,262,274,275,285,286,290,297,304,306,314,317,319,321,322,324,326,329,334,335,337,342],tupled:335,turbo:74,turkish:143,turn:[0,10,12,27,31,33,40,42,49,50,56,57,63,65,76,78,79,80,82,87,89,95,101,104,106,109,110,113,116,117,120,121,125,126,130,132,134,137,138,143,153,163,168,169,174,197,199,205,214,216,217,218,219,220,229,231,245,250,265,270,278,285,288,296,306,312,313,316,320,322,326,327,328,334,342,362],turn_act:115,turn_end_check:[216,217,218,219,220],turnbattl:[140,141,177],turnchar:218,tut:[121,231],tutori:[3,4,10,16,17,20,22,25,26,28,29,31,32,33,35,37,38,40,41,44,47,48,50,54,56,57,59,60,62,63,69,70,76,78,80,81,90,94,101,110,111,113,114,125,132,134,138,179,212,217,230,231,361,362],tutorial_bridge_posist:231,tutorial_cmdset:231,tutorial_exampl:[13,14,20,101,140,141,177],tutorial_info:231,tutorial_world:[20,22,62,121,140,141,177],tutorialclimb:230,tutorialobject:[229,230],tutorialread:230,tutorialroom:[229,231],tutorialroomcmdset:231,tutorialroomlook:231,tutorialweapon:[229,230],tutorialweaponrack:230,tutorialworld:[230,231],tweak:[8,9,25,56,57,96,101,108,116,118,124,137,310,319],tweet:[123,138,362],tweet_output:119,tweet_stat:119,tweetstat:119,twenti:57,twice:[25,50,61,115,194,199,220,326],twist:[10,27,29,33,39,62,71,74,78,96,102,245,262,265,267,268,274,275,276,277,282,285,288,291,293,294,296,303,306,310,335,362],twistd:[62,105,109,282,303],twistedcli:39,twistedmatrix:93,twistedweb:102,twitch:[40,115],twitter:[7,54,119,138,362],twitter_api:70,two:[0,4,11,13,14,15,16,19,22,23,25,26,27,28,29,31,33,34,38,39,40,42,43,45,46,48,49,50,52,56,57,63,64,67,68,72,73,75,79,82,83,84,85,87,88,89,90,91,94,96,99,101,102,103,104,107,108,109,110,111,112,115,118,120,121,122,124,125,126,128,130,132,133,134,136,137,138,139,151,158,176,178,179,184,198,199,203,211,212,214,218,220,223,231,232,245,247,265,294,305,306,315,317,320,326,328,334,335,342,343,362],twowai:[42,158],txt:[9,39,49,74,77,89,95,145,204,281,289,324],tying:89,typclass:205,type:[0,8,12,14,16,17,19,20,21,22,24,25,26,27,28,29,31,33,34,35,37,40,41,42,43,45,46,48,49,50,54,55,56,57,58,60,61,63,72,74,76,78,79,80,81,82,85,86,87,89,90,94,95,96,101,102,104,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,124,125,127,132,136,137,138,143,145,153,158,165,168,169,170,174,175,176,179,181,185,187,191,194,196,197,198,199,205,212,216,217,218,219,220,226,230,231,232,237,239,240,244,245,249,250,258,259,263,265,267,268,276,277,283,285,286,288,289,290,292,293,294,296,304,306,310,313,314,315,316,317,319,320,322,323,326,328,334,337,338,339,342,343,349,355],type_count:181,typecalass:314,typecalss:194,typeclass:[0,2,5,9,11,12,13,20,21,22,25,26,27,33,34,38,43,46,47,48,55,57,59,60,61,65,68,72,75,76,79,81,82,83,84,88,90,95,101,104,106,108,110,111,115,116,117,119,120,121,122,126,131,132,133,138,140,141,143,144,145,146,147,152,158,163,172,174,175,176,177,181,186,190,193,194,197,202,205,211,212,213,216,217,218,219,220,225,231,233,235,236,239,240,242,243,244,245,249,250,252,253,254,255,257,259,303,321,322,339,340,342,355,358,360,362],typeclass_path:[42,101,118,124,147,158,254,315,316],typeclass_search:315,typeclassbas:95,typeclassmanag:[146,175,243,253],typeclassmixin:360,typedobject:[40,124,147,153,173,176,205,233,244,245,254,314,315,316,317,337,342],typedobjectmanag:[175,236,315],typeerror:[41,184,294],typenam:[22,143,145,147,174,176,178,181,183,186,188,194,196,202,203,204,205,211,212,213,216,217,218,219,220,222,225,226,229,230,231,233,237,244,245,249,254,257,272,298,314,316,329,332,333],typeobject:317,types_count:181,typic:[27,54,90,126,219,220,360],typo:[37,69,102],ubuntu:[8,62,96,102,130],ufw:102,ugli:[55,108,136,336],uid:[99,147,277,284,305,306],uit:[22,179],ulrik:57,ultima:78,umlaut:15,unabl:[70,189],unaccept:33,unaffect:[50,115,218],unarm:217,unarmor:217,unassign:137,unauthenticated_respons:358,unavoid:114,unban:[12,156],unbias:184,unbroken:325,uncas:319,uncategor:339,unchang:[86,96,204,250,342],unclear:[30,361],uncolor:[80,113],uncom:89,uncommit:130,uncompress:278,unconnect:[42,170,185],uncov:181,undefin:[36,85,111],under:[6,9,20,24,33,36,40,41,42,45,47,50,56,59,60,62,63,72,74,76,77,78,85,92,99,105,107,109,118,121,122,124,127,132,133,134,135,136,153,155,158,187,214,232,240,257,265,292,314,319,327,328,342,344,360],undergar:181,undergon:194,underli:[56,60,63,79,118,123,130],underlin:[328,341],underneath:[9,316],underscor:[0,50,73,87,94,96,113,118,151,342],underscror:151,understand:[4,10,15,24,25,26,29,30,31,33,37,38,40,41,43,47,48,54,59,60,62,78,80,82,90,94,95,102,103,104,108,110,112,113,122,123,130,132,133,135,138,150,151,203,204,205,310,319,342,362],understood:[82,90,110,126,293,294],undestand:25,undo:[49,102,324],undon:[42,155],undoubtedli:56,unexpect:[90,125,126,326],unexpectedli:332,unfamiliar:[62,73,79,87,89,117,123],unformat:[50,326,329],unfortun:[4,40,60],unhandl:59,unhappi:9,unhilit:341,unicod:[15,82,93,112,143,319,342],unicodeencodeerror:319,unicorn:118,unifi:[132,305],uniform:104,uninform:8,uninstal:62,uninstati:342,unintent:232,union:[31,50,151,223,326],uniqu:[2,12,13,20,31,33,35,36,39,42,45,54,56,59,60,63,70,79,82,83,89,94,95,101,104,108,111,118,122,124,126,136,137,143,149,151,153,158,163,168,170,174,175,180,183,185,193,199,203,204,205,211,214,217,218,229,231,236,245,249,250,259,262,274,275,283,296,297,305,306,314,315,316,317,322,324,336,339],unit:[27,31,34,36,37,44,46,54,61,63,78,81,106,123,138,175,183,197,218,267,322,329,342,348,362],unittest:[25,126,129,169,306,322,340],univers:[14,15,42,61,163],unix:[24,42,51,62,86,164,232,327,335,342],unixcommand:[140,141,177],unixcommandpars:232,unixtim:335,unjoin:178,unknown:[40,42,55,68,136,249,334,342],unleash:28,unless:[4,5,11,12,21,22,23,27,29,33,42,50,71,77,79,83,87,88,89,95,101,109,114,122,137,139,143,152,156,158,163,166,173,174,193,203,204,205,220,226,230,235,239,240,245,250,263,278,294,306,314,316,339,342,343],unlik:[37,63,72,89,106,143,179,218,316],unlimit:[233,257],unlink:158,unload:340,unload_modul:340,unlock:[57,76,79,314],unlocks_red_chest:79,unlog:[42,156,161,162,170,174,185,306],unloggedin:[104,140,148,154,200,306],unloggedincmdset:[35,42,104,162,185,200],unlucki:12,unmask:205,unmodifi:[150,167,186,326],unmonitor:270,unmut:[173,174],unnam:[111,151],unneccesari:112,unnecessari:[36,60],unneed:233,unpaced_data:274,unpack:[90,239],unpars:[73,86,150,293,294,334],unpaus:[99,101,257],unpickl:[82,274,314,323,338],unplay:[25,104],unpredict:342,unprivileg:250,unprogram:72,unpuppet:[42,95,106,122,155],unpuppet_al:143,unpuppet_object:[2,143],unquel:[20,42,79,155],unreal:78,unregist:134,unrel:[50,130,144],unrepeat:270,unreport:270,unsaf:[109,151,231],unsatisfactori:110,unsav:324,unsel:84,unset:[33,48,57,88,115,156,205,229,240,245,249,250,257,259,322,326,327,328,334,335],unsign:343,unsigned_integ:[336,343],unsignedinteg:336,unstabl:99,unstrip:150,unsubscrib:[42,57,114,163,259,276],unsuit:[19,249,317],unsur:[15,37,62,70,75,89,115,137,212],untag:136,untest:[24,60,62,126],until:[5,8,10,11,12,13,20,26,29,30,31,33,36,47,50,60,62,63,85,86,92,94,96,101,113,114,118,122,125,130,135,136,137,138,178,181,183,197,199,216,217,218,219,220,229,230,231,245,257,265,294,296,319,320,329,342],untouch:319,untrust:13,unus:[33,80,143,149,153,174,186,214,220,245,257,288,304,309,315],unusu:[102,118],unwant:138,unwield:217,unwieldli:152,upcom:[53,361],updat:[2,4,5,8,9,11,13,14,20,23,28,29,30,33,36,38,42,44,48,50,54,56,57,60,61,62,63,67,70,72,74,75,78,80,82,83,85,87,88,89,90,94,96,97,99,101,114,115,122,126,132,133,134,135,137,138,144,145,152,153,158,163,166,168,169,173,174,182,186,194,205,219,231,237,240,244,245,247,248,250,255,281,283,284,289,303,304,306,308,313,314,316,323,324,325,326,327,328,332,342,355,358,360,362],update_attribut:314,update_buff:324,update_cached_inst:332,update_charsheet:57,update_current_descript:186,update_default:303,update_flag:304,update_method:136,update_po:48,update_session_count:304,update_undo:324,update_weath:231,updated_bi:191,updated_on:191,updatemethod:[136,137],updateview:360,upfir:105,upgrad:[62,63,74],upload:[4,62,63,89,99],upon:[14,29,60,79,85,89,95,99,102,112,116,122,187,209,216,217,218,219,220,256,267,276,308,360],upp:231,upper:[29,38,42,85,100,113,126,137,155,319],uppercas:[113,319],upping:113,ups:7,upsel:89,upsid:[40,233],upstart:[39,256],upstream:[26,63,103,127],uptim:[12,27,42,61,168,279,329],urfgar:108,uri:[174,237,316],url:[8,42,63,89,97,130,133,134,135,137,140,141,145,163,174,237,284,294,310,316,341,344,351,354,360],url_nam:358,url_to_online_repo:130,urlencod:68,urlpattern:[3,4,68,132,133,134],usabl:[4,42,65,113,122,158,179,189,218,239,308,326],usag:[0,5,12,21,22,23,28,29,30,33,40,41,42,50,57,59,63,67,70,72,80,81,84,89,90,92,93,108,114,115,118,120,122,123,128,153,155,156,157,158,163,164,165,168,169,170,173,178,179,180,181,183,184,185,186,187,188,198,199,201,202,204,205,209,211,212,213,216,217,218,219,220,223,229,230,231,232,233,239,248,265,326,328,332],use:[0,2,3,4,5,6,8,9,10,11,12,13,14,15,16,17,19,20,21,22,23,24,25,26,27,28,29,31,33,34,35,36,37,38,39,40,41,42,45,46,47,48,49,50,51,52,53,55,56,57,58,59,60,61,62,63,64,65,67,68,69,70,71,72,73,75,78,79,80,81,82,83,84,85,86,87,88,89,90,92,93,94,95,97,99,101,102,103,104,105,106,107,108,110,111,112,113,115,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,143,144,145,147,149,150,151,152,153,155,158,159,163,164,166,167,168,169,173,174,176,178,179,180,181,184,186,188,189,193,196,197,198,199,201,202,203,204,205,211,213,214,216,217,218,219,220,222,223,225,229,230,231,232,233,239,240,244,245,249,250,257,258,259,263,270,274,287,289,290,293,296,297,304,305,306,313,314,315,316,317,319,320,321,322,324,325,326,327,328,332,334,335,336,338,342,343,360],use_dbref:[205,245,339],use_destin:245,use_evt:327,use_i18n:75,use_item:218,use_nick:[143,205,245],use_required_attribut:[144,235,242,355],use_success_location_messag:202,use_success_messag:202,use_xterm256:319,useabl:233,used:[0,2,3,7,9,10,11,13,15,16,17,19,20,22,23,24,27,29,30,31,34,35,39,40,42,45,46,47,49,50,51,52,53,54,55,56,57,58,59,61,62,63,67,68,71,72,73,78,79,81,82,83,84,85,86,87,88,89,90,92,93,94,95,99,101,102,103,104,106,107,108,109,110,111,112,113,114,115,117,118,119,120,121,122,123,124,125,126,127,128,130,132,133,134,135,136,138,140,143,144,145,149,151,152,153,155,158,163,165,166,167,168,169,174,178,179,181,183,185,186,187,188,189,191,193,194,196,197,198,199,203,204,205,212,214,216,217,218,219,220,229,230,231,232,233,236,238,239,240,242,245,248,250,256,257,258,259,260,262,263,267,270,271,274,275,276,277,278,279,280,281,282,283,285,287,288,289,292,293,294,297,304,306,307,313,314,315,316,317,318,319,320,322,323,324,326,327,328,334,335,336,337,338,339,342,343,348,355,360,361],used_kei:79,useful:[0,1,4,5,10,11,12,13,14,15,16,17,18,19,20,22,23,25,26,27,28,29,30,31,34,36,37,38,40,41,42,45,46,47,49,50,56,57,58,59,62,63,65,68,69,79,80,86,88,89,90,92,94,95,101,103,106,108,109,110,111,113,114,115,118,119,122,123,124,126,130,131,132,137,138,149,151,152,153,155,157,158,165,166,167,169,177,178,179,193,194,198,204,205,209,231,232,233,239,245,249,250,257,265,285,314,316,320,326,327,329,338,342],useless:229,uselock:239,user:[2,4,7,8,10,11,12,13,14,20,22,23,25,28,29,30,31,35,36,37,39,40,41,42,48,49,50,51,52,54,59,62,63,64,65,66,67,69,70,71,73,74,75,76,78,79,80,84,86,87,89,90,92,94,96,97,99,100,103,104,106,108,112,113,118,120,121,122,124,125,126,132,133,134,135,136,137,138,143,144,145,147,150,153,156,158,163,168,173,174,175,176,179,181,186,188,192,194,199,200,205,208,209,214,218,220,226,233,237,239,240,245,250,257,260,263,269,277,284,285,288,293,294,304,306,309,314,316,319,324,326,327,328,334,336,342,343,347,355,360,362],user_change_password:144,user_input:50,user_permiss:[144,147],useradmin:144,userauth:[93,285],userchangeform:144,usercreationform:[144,355],usernam:[2,4,35,50,73,99,106,118,130,133,143,144,147,185,285,309,347,355],username__contain:118,usernamefield:355,userpassword:[12,156],uses:[0,5,9,13,15,16,17,22,23,29,30,31,33,34,38,39,43,50,56,63,67,68,79,80,85,87,89,93,97,106,108,111,112,113,114,118,123,124,126,129,130,135,136,151,178,184,186,198,200,205,218,225,226,231,232,233,240,254,259,274,294,314,317,334,335,336,342],uses_databas:342,using:[2,4,5,6,8,9,10,11,12,13,14,15,19,20,21,22,23,24,25,26,27,28,29,30,31,33,34,36,37,38,40,42,44,45,46,48,49,50,54,55,56,57,58,59,60,61,62,63,66,67,69,70,71,72,73,76,77,78,79,80,82,84,85,86,87,88,89,90,92,94,95,96,99,100,101,102,104,106,107,108,109,110,111,113,114,115,116,117,119,120,121,122,123,124,125,127,128,130,131,132,133,136,137,138,139,143,147,149,152,153,155,157,158,163,166,167,168,173,178,179,180,183,184,186,187,189,193,199,200,202,204,205,211,212,213,214,216,217,218,219,220,223,229,231,232,233,240,245,248,249,250,254,257,258,259,276,277,278,283,284,288,294,297,307,308,310,314,316,317,319,320,324,326,327,329,334,335,336,337,338,339,340,342,344,355,360,361,362],usr:[62,63,74,99],usual:[0,2,4,5,6,8,9,11,19,20,21,22,23,25,26,27,29,30,31,33,34,37,39,40,42,45,46,49,50,51,56,58,59,61,62,63,66,71,73,79,80,86,88,89,90,92,94,95,96,99,101,104,105,108,109,111,113,114,118,123,124,125,126,130,132,135,143,145,150,151,152,153,155,158,164,168,169,173,174,176,183,193,194,196,197,203,204,205,231,232,240,244,245,250,257,265,267,272,297,304,313,314,316,321,322,326,327,335,337,339,342],utc:[23,343],utf8:[23,36],utf:[15,24,57,73,110,112,270,276,293,328,342],util:[8,10,11,13,14,16,34,40,44,46,47,48,49,50,51,56,57,58,61,62,80,84,85,88,95,96,101,102,110,113,116,123,126,132,133,136,138,140,141,144,157,169,174,176,177,183,186,187,190,194,195,210,212,219,227,235,237,242,245,247,249,257,258,272,291,296,313,314,315,316,344,355,358,362],utilis:326,uyi:204,v19:62,vagu:21,val1:248,val2:248,val:[11,87,143,155,248,289,342],valid:[1,11,13,26,30,31,33,41,42,43,50,57,59,68,87,88,89,90,94,95,96,101,102,108,109,113,118,122,129,132,133,140,141,143,150,152,158,166,167,168,175,178,179,187,191,194,195,199,203,205,214,219,225,226,230,231,232,233,240,245,247,248,249,250,255,256,257,258,259,260,263,265,289,293,304,315,317,320,322,326,336,337,338,339,341,342,343,355,360],valid_handl:336,validate_email_address:342,validate_nam:245,validate_onli:240,validate_password:[50,143],validate_prototyp:249,validate_sess:306,validate_usernam:143,validationerror:[143,249,309,336,338],validator_config:143,validator_kei:336,validatorfunc:[140,141,318],valign:328,valu:[0,2,4,6,10,11,12,17,20,22,25,27,28,31,33,38,40,41,42,48,49,57,58,59,60,61,63,68,72,73,76,79,80,81,83,84,85,86,87,89,96,101,110,113,114,115,122,124,125,126,127,132,133,136,137,138,143,147,149,153,155,156,158,169,174,176,179,181,184,187,188,189,191,194,195,199,202,203,204,205,210,216,217,218,219,220,226,227,231,233,237,239,240,244,245,248,249,250,254,256,257,259,263,270,271,272,274,283,288,289,304,305,306,311,314,315,316,317,319,321,322,323,324,325,326,332,333,334,336,337,338,339,342,343,348,355,360],valuabl:121,value1:108,value2:108,value_from_datadict:338,value_to_obj:249,value_to_obj_or_ani:249,value_to_str:338,valueerror:[40,90,108,122,179,201,203,314,319,322,334,342,343],valuei:110,values_list:118,valuex:110,vanilla:[9,26,48,55,57,85,100,124],vaniti:50,vari:[30,39,59,63,81,107,113,124,130,192,204,220,304,314,316],variabl:[0,3,5,11,13,28,31,33,40,42,45,48,50,52,54,55,57,63,65,68,79,87,90,94,95,96,99,102,103,105,108,112,120,123,132,133,134,136,137,143,147,149,153,155,158,163,166,167,168,169,182,186,187,191,193,194,197,202,231,239,244,245,249,250,262,265,275,278,279,281,285,287,297,304,311,319,320,326,342,348],variable_from_modul:342,variable_nam:[191,194],variablenam:342,varianc:204,variant:[11,54,111,152,179,185,212,276],variat:[61,72,115,151,186,204,226,342],varieti:[54,81,115,119,218,219],variou:[5,6,11,15,24,33,37,39,40,45,46,47,56,61,68,72,76,80,87,88,89,92,93,96,101,102,104,108,109,111,113,114,115,122,123,124,126,136,138,151,167,183,204,205,214,218,219,229,230,240,244,245,250,251,259,297,322,328,339,340],varnam:289,vast:[23,59,85,107,110,118],vastli:63,vcc:204,vccv:204,vccvccvc:204,vcpython27:9,vcv:204,vcvccv:204,vcvcvcc:204,vcvcvvccvcvv:204,vcvvccvvc:204,vector:342,vehicl:[21,123,138,362],velit:51,venu:[130,175],venv:[62,74],verb:[25,301],verbal:[196,245],verbatim_el:342,verbos:[26,115,126,205],verbose_nam:[132,316],veri:[0,2,4,5,6,8,9,10,11,13,14,17,20,21,22,23,26,27,28,29,31,33,35,37,38,39,40,41,45,48,49,50,51,54,55,56,57,59,60,63,66,67,69,71,72,73,76,77,78,79,84,85,87,89,90,92,94,95,96,103,106,107,108,109,110,111,113,114,115,118,120,121,122,124,126,127,128,130,131,133,136,137,138,139,143,145,151,153,169,174,176,179,181,193,194,203,204,205,211,212,213,214,219,226,229,232,233,236,244,269,315,317,322,324,326,342,360],verif:89,verifi:[36,50,62,89,130,158,187,219,290],verify_online_play:187,verify_or_create_ssl_key_and_cert:290,verify_ssl_key_and_cert:286,verifyfunc:187,versa:[39,42,60,87,104,115,163,274],version:[2,4,7,11,13,14,20,21,23,24,29,30,31,33,35,36,37,40,42,46,50,52,53,56,59,60,62,63,73,74,75,78,80,85,86,89,90,94,95,99,107,110,113,122,123,124,125,127,135,136,138,158,166,168,170,180,181,185,186,200,205,217,218,219,220,223,230,245,250,265,270,284,308,313,314,319,327,342,355,362],version_info:265,versu:54,vertic:[136,137,230,328,342],very_strong:240,very_weak:79,vest:102,vet:108,veteran:78,vfill_char:328,via:[10,11,27,37,39,50,51,54,55,56,62,69,72,73,82,84,85,89,91,92,100,102,107,108,113,118,122,124,125,130,136,171,175,176,208,244,254,314,317,319,333],viabl:229,vice:[39,42,60,87,104,115,163,274],vicin:[33,42,164,186,231],video:[78,94,113,136],vienv:9,view:[1,4,17,27,34,40,41,42,49,50,51,54,57,59,62,63,71,79,81,85,89,95,100,101,109,110,114,115,122,123,130,135,138,140,143,155,156,158,163,164,165,168,173,174,181,205,216,217,218,219,220,233,235,237,245,247,300,316,344,348,351,354,355,362],view_attr:158,viewabl:[54,165],viewer:[25,68,205,233,239,245,316],viewport:41,vim:[14,49,78,324],vincent:[179,186,200,203,232],violent:50,virtual:[4,40,42,52,54,56,58,62,78,89,123,168,186,329],virtual_env:74,virtualenv:[9,23,26,36,62,74,75,89,92,94,95,96,99,105,109,127],virtualhost:8,visibl:[13,25,31,36,42,47,53,60,62,68,80,89,95,104,113,122,124,130,138,164,205,239,245,277,310,326,342],visiblelock:239,vision:[11,57,60],visit:[22,48,89,110,132,133,232,326],visitor:[102,133,134],vista:62,visual:[25,56,62,92,113,136,143,165,189],vital:90,vlgeoff:183,vniftg:62,vnum:55,vocabulari:[45,342],voic:[33,45,123,138,362],volum:[21,60,99],volund:118,voluntari:37,volupt:51,vowel:[118,204],vpad_char:328,vulner:[29,102],vvc:204,vvcc:204,vvccv:204,vvccvvcc:204,w001:126,wai:[0,2,5,6,9,10,11,12,13,14,15,19,20,21,22,23,27,28,30,31,33,37,38,39,40,41,42,43,45,47,48,52,53,54,55,56,57,60,61,62,63,67,68,69,71,72,73,74,78,79,81,82,83,84,85,86,87,88,89,90,91,92,94,95,96,97,101,102,103,104,105,106,108,109,110,111,112,113,114,115,116,117,118,120,121,122,123,124,125,126,127,128,130,131,132,135,137,138,139,143,150,151,158,165,174,178,183,184,186,187,189,193,196,197,204,211,212,214,216,217,218,219,220,223,229,230,232,240,245,257,259,265,270,274,285,306,310,311,312,315,317,320,325,326,328,332,335,338,360,362],wail:48,waist:181,wait:[0,10,20,25,27,28,29,33,41,50,101,120,137,145,193,197,216,217,218,219,220,257,265,275,294,296,308,322,342],wait_for_disconnect:275,wait_for_server_connect:275,wait_for_statu:265,wait_for_status_repli:265,waiter:265,wake:187,walias:[42,158],walk:[0,14,21,31,38,45,48,59,61,84,138,212,213,214,233,320],walki:63,wall:[110,156,164,186,230,231],wanna:[37,178],want:[0,2,3,4,5,6,8,9,10,11,12,13,14,15,19,20,21,22,23,25,26,27,28,29,30,31,33,34,35,37,38,39,40,41,42,43,45,47,48,49,50,52,53,56,57,59,60,61,62,63,65,67,68,69,70,71,72,73,74,75,76,77,79,80,81,82,83,84,85,86,87,88,89,90,92,94,95,96,97,101,102,103,104,105,106,107,108,109,110,112,113,114,117,118,120,121,122,124,125,126,127,130,131,132,133,134,135,136,137,139,143,151,152,153,155,164,169,173,178,179,185,186,187,189,196,203,205,208,214,216,217,218,219,220,226,231,233,235,239,240,245,250,257,259,281,283,289,296,306,311,313,314,316,324,327,332,338,342,355,360,361],wanted_id:79,ware:84,warehous:[208,320],wari:[113,233,245,316],warm:[101,109,269],warn:[8,23,27,31,58,59,62,63,89,90,92,103,104,110,127,133,137,139,151,173,209,264,265,290,335,362],warnmsg:335,warrior:[28,56,57,60,121,122],wasclean:[276,293],wasn:[0,41,133],wast:[6,14,114],watch:[14,83,105,138],water:[152,199,202],waterballon:202,wave:110,wcach:[42,168],wcactu:219,wcommandnam:232,wcure:219,wdestin:[42,158],weak:250,weakref:332,weaksharedmemorymodel:[272,332],weaksharedmemorymodelbas:[272,332],weakvalu:332,wealth:84,weapon:[29,50,60,63,72,76,81,84,85,108,115,121,217,229,230,250],weapon_ineffective_msg:229,weapon_prototyp:230,weaponrack_cmdset:230,wear:[81,181,205,217],wearabl:181,wearer:181,wearstyl:181,weather:[30,60,72,101,110,111,114,121,123,138,139,231,362],weather_script:101,weatherroom:[131,231],web:[4,8,9,16,17,23,25,30,46,54,60,62,63,66,68,71,74,75,78,79,93,94,100,108,109,118,138,140,141,172,267,269,279,283,289,293,294,304,308,310,317,323,362],web_client_url:53,web_get_admin_url:[174,237,316],web_get_create_url:[174,237,316],web_get_delete_url:[174,237,316],web_get_detail_url:[174,237,316],web_get_puppet_url:316,web_get_update_url:[174,237,316],webclient:[24,30,39,42,44,53,63,68,82,87,94,102,104,109,113,134,138,140,141,168,260,270,273,289,294,305,344,348,349,358,362],webclient_ajax:[136,140,260,273],webclient_en:102,webclient_opt:270,webclientdata:294,webclienttest:358,webpag:[8,17,76,89,352],webport:36,webserv:[3,7,8,9,23,39,46,54,89,99,100,103,134,138,140,141,260,344],webserver_en:102,webserver_interfac:[66,89],webserver_port:[36,89],webservic:102,websit:[3,9,17,54,56,63,66,68,78,89,97,100,102,123,132,135,136,137,138,140,141,144,294,310,344,349,362],websocket:[24,39,54,63,89,99,136,276,282,293,305],websocket_client_interfac:[66,89],websocket_client_port:89,websocket_client_url:[8,66,89],websocket_clos:293,websocketcli:293,websocketclientfactori:276,websocketclientprotocol:276,websocketserverfactori:282,websocketserverprotocol:293,weed:[26,118,151],week:[61,183,335,343],weeklylogfil:335,weigh:[81,296],weight:[23,60,107,123,138,189,204,315,362],weird:342,weirdli:95,welcom:[3,4,22,24,35,37,62,71,75,84],well:[2,4,6,9,11,12,16,17,19,21,22,23,25,26,33,37,38,39,40,42,43,44,45,48,49,50,51,54,56,57,60,61,63,65,67,68,70,73,74,80,84,87,88,90,95,97,102,103,104,105,107,108,112,115,117,118,119,122,123,124,126,127,130,132,133,134,135,137,147,151,152,153,158,163,168,171,178,181,186,193,201,204,205,214,218,219,220,225,229,245,254,260,265,274,276,277,283,300,308,313,314,315,319,323,326,329,338,342,361],went:[56,109,126,130,255,259],were:[1,10,11,13,24,31,33,37,41,43,50,57,58,63,68,76,81,84,85,90,99,101,103,107,108,118,122,124,125,126,136,143,150,151,152,203,214,245,249,312,316,320,339,342],weren:61,werewolf:25,werewolv:118,werkzeug:342,west:[20,25,43,48,110,158,199,231],west_east:110,west_exit:231,western:110,westward:231,wether:[178,322],wevennia:22,wflame:219,wflushmem:[42,168],wfull:219,what:[0,1,2,4,8,9,10,12,13,14,19,20,21,22,23,25,26,27,29,31,33,38,39,41,42,43,44,45,47,48,50,52,55,56,57,59,60,61,62,63,67,68,69,71,72,73,76,77,78,79,80,82,84,85,87,88,89,92,93,94,95,96,97,101,102,103,104,107,108,109,110,112,113,114,115,116,117,118,120,121,122,123,124,125,126,127,128,129,130,131,132,133,135,137,138,139,143,149,151,152,153,155,158,165,169,174,194,202,203,205,208,213,218,219,223,226,229,231,237,240,245,249,250,265,267,270,277,289,294,309,311,314,316,317,319,320,326,336,337,342,343,347,355,360,362],whatev:[2,11,14,21,22,23,27,33,39,42,45,47,50,55,57,60,63,77,81,88,90,99,101,110,122,126,130,132,133,137,143,145,152,158,187,219,229,230,245,250,254,255,276,285,288,293,306,314,327,336,360],whatnot:137,wheel:[56,62,74,114,256],whelp:232,when:[0,2,3,4,5,6,8,9,10,11,12,13,14,15,17,19,20,21,22,23,26,27,29,30,31,33,34,35,36,37,38,39,40,41,42,43,45,46,48,49,50,51,55,56,57,58,59,60,61,62,63,64,65,67,68,72,73,74,75,76,77,78,79,81,82,83,84,85,86,87,88,89,90,92,94,95,96,97,99,101,102,103,104,105,106,107,108,109,110,111,112,113,115,116,117,118,119,120,121,122,123,124,125,126,127,128,130,131,132,135,136,137,138,140,143,145,147,149,151,152,153,155,157,158,163,164,166,167,168,170,174,175,176,178,179,180,181,183,184,185,186,187,188,189,194,195,196,197,198,199,200,201,202,203,204,205,211,213,214,216,217,218,219,220,222,223,225,226,227,229,230,231,232,233,236,237,239,240,244,245,247,249,250,254,255,257,258,259,262,265,267,271,272,274,275,276,277,278,279,280,281,283,285,286,287,288,289,290,293,294,296,297,303,304,305,306,307,308,314,316,317,319,320,322,323,324,325,326,327,328,332,333,334,335,337,342,355,360],when_stop:265,whenev:[6,10,11,22,25,33,45,63,65,73,75,79,83,86,89,94,97,99,101,105,106,108,110,112,116,118,127,143,152,173,174,229,230,231,245,255,257,267,284,304,305,306],where:[0,1,3,6,9,10,11,12,13,14,20,21,22,25,26,29,31,33,36,38,39,40,41,42,45,47,48,49,50,51,52,55,56,57,58,60,61,63,68,72,74,75,79,82,84,85,87,89,90,94,99,101,102,103,104,107,108,110,112,113,116,117,118,120,121,122,123,124,126,130,132,133,134,135,136,137,138,150,151,156,158,164,167,174,175,180,184,196,198,199,204,205,209,218,230,231,233,239,240,245,248,249,250,255,265,267,270,274,289,297,302,306,313,316,319,320,324,326,327,328,334,336,337,342,360],wherea:[11,12,13,19,21,26,31,33,34,39,41,54,55,60,79,80,84,85,92,96,102,104,108,112,113,115,124,127,204,223,226,259,294,314,332],whereabout:121,wherebi:219,wherev:[11,62,63,99,110,126,179,208,218],whether:[0,12,38,42,45,50,54,61,68,76,120,143,145,152,158,163,165,174,187,214,216,217,218,219,220,239,245,259,276,293,308,314,315,319,334,336,338,342],whewiu:9,which:[0,1,3,4,5,6,9,10,11,12,13,14,15,19,20,22,24,25,26,27,28,29,30,31,33,34,36,37,38,39,40,41,42,43,45,48,50,51,52,55,56,57,58,59,60,61,62,63,64,65,68,70,71,72,73,75,76,79,80,81,82,84,85,86,87,88,89,90,92,93,94,95,96,99,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,124,125,126,130,131,132,133,134,135,136,137,138,139,143,145,149,151,152,153,155,156,158,164,166,167,168,169,173,174,175,176,178,179,180,181,182,183,186,187,189,196,197,198,199,201,205,208,209,211,213,214,216,217,218,219,220,225,226,229,230,231,232,233,237,240,244,245,249,250,254,255,257,258,259,262,264,265,269,270,277,283,285,293,294,296,297,304,305,306,308,311,313,314,315,316,317,319,320,322,323,326,327,328,329,332,334,335,336,338,339,340,342,347,348,355,360,361],whichev:[27,89,102,231],whilst:[76,110,199],whim:138,whisp:204,whisper:[45,164,196,197,204,205,245],white:[47,73,113,125,342],whitelist:73,whitepag:[1,47,137],whitespac:[14,27,33,57,80,118,122,166,167,201,205,319,320,328,342],who:[4,10,11,12,21,34,40,45,48,50,54,55,57,60,72,79,86,94,102,108,113,115,118,120,122,123,124,131,132,137,145,153,155,158,163,173,174,178,187,194,205,216,217,218,219,220,230,237,239,240,245,250,316,324],whoever:132,whole:[4,16,42,48,54,56,59,60,86,95,110,111,121,122,128,137,158,168,220,328],wholist:174,whome:[42,158],whomev:[72,113,120],whose:[87,113,118,124,143,194,205,214,216,217,218,219,220,270,321,326,342],whould:326,why:[0,11,12,20,22,25,38,40,42,43,45,50,54,59,62,63,81,90,94,95,102,110,122,124,125,138,156,203,216,219,220,262,263,326],wide:[16,25,27,38,42,57,60,72,85,90,137,156,218,219,233,325,328,342],widen:12,wider:[12,25,38,42,156,328],widest:342,widget:[144,235,242,313,338,355],width:[16,17,25,27,33,48,73,108,110,113,140,153,248,270,285,304,319,324,325,327,328,334,342],wield:[60,81,108,217],wifi:[89,102],wiki:[1,9,33,37,44,47,54,57,69,78,93,107,110,123,124,137,179,293,361,362],wiki_account_handl:4,wiki_account_signup_allow:4,wiki_can:4,wiki_can_admin:4,wiki_can_assign:4,wiki_can_assign_own:4,wiki_can_change_permiss:4,wiki_can_delet:4,wiki_can_moder:4,wiki_can_read:4,wiki_can_writ:4,wikiconfig:4,wikipedia:[15,54,112,126,130,293],wild:[107,125,130],wildcard:[12,42,56,86,156,158,342],wildcard_to_regexp:342,wilder:[140,141,177],wildernessexit:233,wildernessmap:233,wildernessmapprovid:233,wildernessroom:233,wildernessscript:233,wildli:204,will_suppress_ga:287,will_ttyp:292,willing:[57,60,78],win10:62,win7:62,win8:62,win:[9,24,90,115],wind:[121,131],window:[4,23,25,31,43,44,48,51,52,63,71,75,82,87,88,92,94,95,96,100,104,105,109,127,130,136,137,153,165,265,281,304,308,327,342],windowid:304,windows10:62,wingd:110,winpti:9,winter:186,wintext:72,wipe:[9,13,23,110,137,151,158,168,218],wire:[27,39,63,82,87,89,112,137,167,262,274,275,306,319],wis:57,wisdom:[59,92],wise:[6,11,13,14,15,26,57,59,79,95,117,130,134],wise_text:59,wiseobject:59,wiser:20,wiseword:59,wish:[33,36,38,74,119,130,135,179,220,319,341,355],with_metaclass:95,with_tag:202,withdraw:[115,220],withdrawl:220,within:[1,8,9,10,11,22,24,26,31,33,37,38,42,46,48,50,55,57,63,89,93,94,96,99,113,114,115,116,117,118,119,123,125,130,133,135,136,137,143,147,149,158,178,186,189,191,209,236,245,250,308,314,315,319,334,335,342,355,360],without:[0,8,11,12,13,14,16,20,21,22,23,25,27,29,30,31,33,35,37,39,41,42,43,45,48,49,50,54,56,57,58,59,60,62,63,65,75,79,85,87,89,90,91,92,95,96,99,100,103,106,107,108,113,114,117,118,120,122,124,125,126,127,128,130,132,135,137,138,143,145,150,153,155,156,158,163,164,166,167,168,169,176,178,180,181,186,191,194,196,199,204,205,211,214,216,219,220,229,231,240,245,248,249,250,257,258,274,285,288,289,296,306,307,314,316,319,320,322,323,324,326,327,334,338,339],withstand:79,wiz:57,wizard:[108,250,263,265],wkei:[42,158],wlocat:[42,158],wlock:[42,158],wmagic:219,wmass:219,wndb_:[42,158],won:[0,2,4,10,11,12,13,15,21,22,23,29,31,40,41,45,56,60,62,68,72,77,80,82,84,85,90,94,95,99,110,113,118,122,124,126,133,136,137,152,187,203,222,223,225,226,310,319,334,338],wonder:[9,16,55,81,118,137],wont_suppress_ga:287,wont_ttyp:292,wooden:108,woosh:21,word:[14,27,33,42,45,48,49,52,61,68,69,71,75,87,88,90,92,93,94,95,96,110,118,121,125,130,135,150,166,167,170,185,197,204,205,277,324,339,342],word_fil:204,word_length_vari:204,wordi:204,work:[0,2,4,5,8,9,10,11,13,14,15,16,20,21,22,23,24,25,26,27,28,29,31,34,36,37,40,41,42,43,47,48,50,52,55,56,57,58,59,60,61,62,63,65,69,70,71,74,79,80,82,83,84,85,88,89,92,93,94,95,96,101,102,104,105,107,108,110,111,113,114,115,116,118,121,122,123,125,126,127,128,131,132,133,135,137,138,149,152,153,155,158,163,164,166,168,173,174,178,179,180,186,201,202,205,211,214,218,219,220,231,232,233,237,239,240,245,249,250,265,269,270,282,297,310,312,314,316,320,325,328,336,342,360,361,362],workaround:[62,99,130],workflow:[60,144],world:[9,10,11,13,14,15,21,27,31,33,34,38,40,46,48,50,54,56,57,59,61,62,63,67,71,72,77,78,79,81,85,89,95,103,107,108,110,112,115,116,120,122,123,126,130,136,138,143,157,158,165,173,178,183,199,201,205,216,217,218,219,220,230,231,233,237,254,304,306,319,320,329,361,362],world_map:110,worm:48,worm_has_map:48,worn:[181,217],worri:[0,11,15,36,38,40,50,54,103,112,113,122,126,137,178,226],worst:60,worth:[0,8,21,29,50,60,69,78,90,92,123,124,132,178],worthi:60,worthless:89,would:[0,1,4,6,8,9,10,11,13,14,15,16,19,20,21,22,25,27,29,31,33,36,38,40,41,42,43,45,47,48,50,54,55,56,57,59,60,61,62,63,67,68,72,76,79,80,81,84,85,87,88,89,90,92,94,95,99,101,104,105,108,110,111,113,114,115,116,117,118,120,122,124,125,126,127,132,133,134,135,137,139,143,150,151,152,158,167,174,178,183,194,196,204,214,223,226,232,233,237,239,240,249,250,277,313,316,319,320,323,326,334,337,338,340],wouldn:[38,125,137],wound:219,wow:[68,137],wpermiss:[42,158],wprototype_desc:[42,158],wprototype_kei:[42,158],wprototype_lock:[42,158],wprototype_par:[42,158],wprototype_tag:[42,158],wrap:[10,30,48,50,58,95,101,108,118,135,181,187,205,272,312,328,342],wrap_conflictual_object:338,wrapper:[10,27,29,50,73,85,92,104,118,124,143,147,174,175,176,211,237,244,245,254,258,270,272,304,313,314,316,317,319,328,332,333,335,342,360],wresid:[42,168],write:[0,4,10,11,14,15,16,20,22,23,25,27,31,33,34,37,40,42,43,44,45,47,50,52,55,57,61,62,64,67,68,70,71,86,87,90,92,93,95,107,122,123,124,128,129,130,137,158,165,173,179,196,208,209,232,245,278,335,340,360,362],writeabl:74,written:[15,27,53,55,56,57,60,78,102,108,126,132,133,165,208,320,360],wrong:[26,40,41,42,59,62,80,84,94,109,126,151,158,168,205],wserver:[42,168],wservic:[42,163],wsgi:[8,93,310],wsgi_resourc:310,wsgiwebserv:310,wsl:62,wss:[8,66,89],wtypeclass:[42,158],wwhere:[196,245],www:[8,9,22,54,107,127,132,140,280,281,287,289,341,355],wyou:81,x0c:158,x1b:[319,341],x2x:57,x4x:325,x5x:325,x6x:325,x7x:325,x8x:325,x9x:325,x_r:38,xcode:62,xforward:310,xgettext:75,xit:[22,179],xmlcharrefreplac:319,xp_gain:72,xpo:328,xterm256:[42,54,73,80,82,136,155,182,189,270,285,288,319,362],xterm256_bg:319,xterm256_bg_sub:319,xterm256_fg:319,xterm256_fg_sub:319,xterm256_gbg:319,xterm256_gbg_sub:319,xterm256_gfg:319,xterm256_gfg_sub:319,xterm:[113,125],xterms256:113,xval:33,xxx:[25,41,203],xxxx:203,xxxxx1xxxxx:325,xxxxx3xxxxx:325,xxxxxxx2xxxxxxx:325,xxxxxxxxxx3xxxxxxxxxxx:57,xxxxxxxxxx4xxxxxxxxxxx:57,xxxxxxxxxxx:325,xxxxxxxxxxxxxx1xxxxxxxxxxxxxxx:57,xxxxxxxxxxxxxxxxxxxxxx:57,xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:57,xyz:86,y_r:38,yan:113,yank:49,yeah:137,year:[54,60,61,87,89,107,183,329,335,342,355],yearli:[61,89],yellow:[113,125,130,230],yep:137,yes:[10,33,38,45,50,125,137,158,197,263,324,342],yesno:[50,324],yet:[0,2,4,12,14,22,25,28,35,36,40,41,45,48,50,53,59,62,63,75,78,85,89,93,95,104,108,110,118,120,127,130,132,133,137,143,170,178,185,194,199,240,244,283,306,310,319,360],yield:[10,23,33,79,107,158,209,328,342],yml:[99,129],yogurt:202,you:[0,1,2,3,4,5,6,8,9,10,11,12,13,14,15,16,17,19,20,21,22,23,25,27,28,29,30,31,33,34,35,36,37,38,39,40,41,42,43,45,46,47,48,49,50,52,53,55,56,57,58,59,60,61,62,63,64,65,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,94,95,96,97,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,143,152,153,155,158,163,164,165,166,167,168,169,170,173,178,179,180,181,182,183,186,187,189,192,193,194,196,197,198,199,200,201,202,203,204,205,208,209,211,212,213,214,216,217,218,219,220,222,223,225,226,230,231,232,233,235,239,240,245,250,256,257,259,267,276,277,278,294,296,306,308,310,311,314,316,319,320,322,325,326,328,329,338,339,342,355,360,361],young:76,your:[0,1,3,5,6,7,8,9,10,11,12,13,14,15,16,17,21,22,23,25,27,29,30,31,34,35,36,37,40,41,42,43,44,45,46,47,48,49,50,52,53,54,55,56,57,58,60,61,62,63,64,65,66,67,68,69,70,71,72,74,75,76,77,78,79,80,81,82,84,86,87,90,92,94,95,97,100,101,103,104,105,106,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,128,129,131,133,134,135,137,138,139,143,147,150,152,153,155,156,158,163,164,168,169,170,178,179,181,182,183,184,185,186,187,189,193,196,199,203,204,205,208,209,212,214,216,217,218,219,220,222,230,231,232,233,239,240,244,296,313,316,319,324,326,328,338,339,340,342,343,355,360,362],your_email:130,yourgam:208,yourhost:66,yournam:8,yourpassword:23,yourrepo:105,yourself:[0,2,5,6,14,16,19,22,23,26,31,37,41,42,50,54,57,62,68,69,72,77,79,85,88,89,90,95,101,107,110,118,122,124,129,130,134,158,164,178,188,205,211,219,222,326],yoursit:132,yourusernam:130,yourwebsit:132,yousuck:12,yousuckmor:12,youth:187,youtub:130,ypo:328,yrs:183,ythi:113,yum:[8,66,130],yvonn:57,z_r:38,zed:[76,78],zero:[20,27,108,205,245,314,319],zine:60,zip:102,zlib:[74,274,278],zmud:[24,280],zone:[18,45,54,55,69,78,111,118,121,123,138,317,335,362],zope:96,zopeinterfac:62,zuggsoft:280},titles:["A voice operated elevator using events","API refactoring","Accounts","Add a simple new web page","Add a wiki on your website","Adding Command Tutorial","Adding Object Typeclass Tutorial","Administrative Docs","Apache Config","Arxcode installing help","Async Process","Attributes","Banning","Batch Code Processor","Batch Command Processor","Batch Processors","Bootstrap & Evennia","Bootstrap Components and Utilities","Builder Docs","Building Permissions","Building Quickstart","Building a mech tutorial","Building menus","Choosing An SQL Server","Client Support Grid","Coding FAQ","Coding Introduction","Coding Utils","Command Cooldown","Command Duration","Command Prompt","Command Sets","Command System","Commands","Communications","Connection Screen","Continuous Integration","Contributing","Coordinates","Custom Protocols","Customize channels","Debugging","Default Command Help","Default Exit Errors","Developer Central","Dialogues in events","Directory Overview","Docs refactoring","Dynamic In Game Map","EvEditor","EvMenu","EvMore","Evennia API","Evennia Game Index","Evennia Introduction","Evennia for Diku Users","Evennia for MUSH Users","Evennia for roleplaying sessions","Execute Python Code","First Steps Coding","Game Planning","Gametime Tutorial","Getting Started","Glossary","Grapevine","Guest Logins","HAProxy Config (Optional)","Help System","Help System Tutorial","How To Get And Give Help","How to connect Evennia to Twitter","IRC","Implementing a game rule system","Inputfuncs","Installing on Android","Internationalization","Learn Python for Evennia The Hard Way","Licensing","Links","Locks","Manually Configuring Color","Mass and weight for objects","Messagepath","MonitorHandler","NPC shop Tutorial","New Models","Nicks","OOB","Objects","Online Setup","Parsing command arguments, theory and best practices","Portal And Server","Profiling","Python 3","Python basic introduction","Python basic tutorial part two","Quirks","RSS","Roadmap","Running Evennia in Docker","Screenshot","Scripts","Security","Server Conf","Sessions","Setting up PyCharm","Signals","Soft Code","Spawner and Prototypes","Start Stop Reload","Static In Game Map","Tags","Text Encodings","TextTags","TickerHandler","Turn based Combat System","Tutorial Aggressive NPCs","Tutorial NPCs listening","Tutorial Searching For Objects","Tutorial Tweeting Game Stats","Tutorial Vehicles","Tutorial World Introduction","Tutorial for basic MUSH like game","Tutorials","Typeclasses","Understanding Color Tags","Unit Testing","Updating Your Game","Using MUX as a Standard","Using Travis","Version Control","Weather Tutorial","Web Character Generation","Web Character View Tutorial","Web Features","Web Tutorial","Webclient","Webclient brainstorm","Wiki Index","Zones","evennia","evennia","evennia.accounts","evennia.accounts.accounts","evennia.accounts.admin","evennia.accounts.bots","evennia.accounts.manager","evennia.accounts.models","evennia.commands","evennia.commands.cmdhandler","evennia.commands.cmdparser","evennia.commands.cmdset","evennia.commands.cmdsethandler","evennia.commands.command","evennia.commands.default","evennia.commands.default.account","evennia.commands.default.admin","evennia.commands.default.batchprocess","evennia.commands.default.building","evennia.commands.default.cmdset_account","evennia.commands.default.cmdset_character","evennia.commands.default.cmdset_session","evennia.commands.default.cmdset_unloggedin","evennia.commands.default.comms","evennia.commands.default.general","evennia.commands.default.help","evennia.commands.default.muxcommand","evennia.commands.default.syscommands","evennia.commands.default.system","evennia.commands.default.tests","evennia.commands.default.unloggedin","evennia.comms","evennia.comms.admin","evennia.comms.channelhandler","evennia.comms.comms","evennia.comms.managers","evennia.comms.models","evennia.contrib","evennia.contrib.barter","evennia.contrib.building_menu","evennia.contrib.chargen","evennia.contrib.clothing","evennia.contrib.color_markups","evennia.contrib.custom_gametime","evennia.contrib.dice","evennia.contrib.email_login","evennia.contrib.extended_room","evennia.contrib.fieldfill","evennia.contrib.gendersub","evennia.contrib.health_bar","evennia.contrib.ingame_python","evennia.contrib.ingame_python.callbackhandler","evennia.contrib.ingame_python.commands","evennia.contrib.ingame_python.eventfuncs","evennia.contrib.ingame_python.scripts","evennia.contrib.ingame_python.tests","evennia.contrib.ingame_python.typeclasses","evennia.contrib.ingame_python.utils","evennia.contrib.mail","evennia.contrib.mapbuilder","evennia.contrib.menu_login","evennia.contrib.multidescer","evennia.contrib.puzzles","evennia.contrib.random_string_generator","evennia.contrib.rplanguage","evennia.contrib.rpsystem","evennia.contrib.security","evennia.contrib.security.auditing","evennia.contrib.security.auditing.outputs","evennia.contrib.security.auditing.server","evennia.contrib.security.auditing.tests","evennia.contrib.simpledoor","evennia.contrib.slow_exit","evennia.contrib.talking_npc","evennia.contrib.tree_select","evennia.contrib.turnbattle","evennia.contrib.turnbattle.tb_basic","evennia.contrib.turnbattle.tb_equip","evennia.contrib.turnbattle.tb_items","evennia.contrib.turnbattle.tb_magic","evennia.contrib.turnbattle.tb_range","evennia.contrib.tutorial_examples","evennia.contrib.tutorial_examples.bodyfunctions","evennia.contrib.tutorial_examples.cmdset_red_button","evennia.contrib.tutorial_examples.example_batch_code","evennia.contrib.tutorial_examples.red_button","evennia.contrib.tutorial_examples.red_button_scripts","evennia.contrib.tutorial_examples.tests","evennia.contrib.tutorial_world","evennia.contrib.tutorial_world.mob","evennia.contrib.tutorial_world.objects","evennia.contrib.tutorial_world.rooms","evennia.contrib.unixcommand","evennia.contrib.wilderness","evennia.help","evennia.help.admin","evennia.help.manager","evennia.help.models","evennia.locks","evennia.locks.lockfuncs","evennia.locks.lockhandler","evennia.objects","evennia.objects.admin","evennia.objects.manager","evennia.objects.models","evennia.objects.objects","evennia.prototypes","evennia.prototypes.menus","evennia.prototypes.protfuncs","evennia.prototypes.prototypes","evennia.prototypes.spawner","evennia.scripts","evennia.scripts.admin","evennia.scripts.manager","evennia.scripts.models","evennia.scripts.monitorhandler","evennia.scripts.scripthandler","evennia.scripts.scripts","evennia.scripts.taskhandler","evennia.scripts.tickerhandler","evennia.server","evennia.server.admin","evennia.server.amp_client","evennia.server.connection_wizard","evennia.server.deprecations","evennia.server.evennia_launcher","evennia.server.game_index_client","evennia.server.game_index_client.client","evennia.server.game_index_client.service","evennia.server.initial_setup","evennia.server.inputfuncs","evennia.server.manager","evennia.server.models","evennia.server.portal","evennia.server.portal.amp","evennia.server.portal.amp_server","evennia.server.portal.grapevine","evennia.server.portal.irc","evennia.server.portal.mccp","evennia.server.portal.mssp","evennia.server.portal.mxp","evennia.server.portal.naws","evennia.server.portal.portal","evennia.server.portal.portalsessionhandler","evennia.server.portal.rss","evennia.server.portal.ssh","evennia.server.portal.ssl","evennia.server.portal.suppress_ga","evennia.server.portal.telnet","evennia.server.portal.telnet_oob","evennia.server.portal.telnet_ssl","evennia.server.portal.tests","evennia.server.portal.ttype","evennia.server.portal.webclient","evennia.server.portal.webclient_ajax","evennia.server.profiling","evennia.server.profiling.dummyrunner","evennia.server.profiling.dummyrunner_settings","evennia.server.profiling.memplot","evennia.server.profiling.settings_mixin","evennia.server.profiling.test_queries","evennia.server.profiling.tests","evennia.server.profiling.timetrace","evennia.server.server","evennia.server.serversession","evennia.server.session","evennia.server.sessionhandler","evennia.server.signals","evennia.server.throttle","evennia.server.validators","evennia.server.webserver","evennia.settings_default","evennia.typeclasses","evennia.typeclasses.admin","evennia.typeclasses.attributes","evennia.typeclasses.managers","evennia.typeclasses.models","evennia.typeclasses.tags","evennia.utils","evennia.utils.ansi","evennia.utils.batchprocessors","evennia.utils.containers","evennia.utils.create","evennia.utils.dbserialize","evennia.utils.eveditor","evennia.utils.evform","evennia.utils.evmenu","evennia.utils.evmore","evennia.utils.evtable","evennia.utils.gametime","evennia.utils.idmapper","evennia.utils.idmapper.manager","evennia.utils.idmapper.models","evennia.utils.idmapper.tests","evennia.utils.inlinefuncs","evennia.utils.logger","evennia.utils.optionclasses","evennia.utils.optionhandler","evennia.utils.picklefield","evennia.utils.search","evennia.utils.test_resources","evennia.utils.text2html","evennia.utils.utils","evennia.utils.validatorfuncs","evennia.web","evennia.web.urls","evennia.web.utils","evennia.web.utils.backends","evennia.web.utils.general_context","evennia.web.utils.middleware","evennia.web.utils.tests","evennia.web.webclient","evennia.web.webclient.urls","evennia.web.webclient.views","evennia.web.website","evennia.web.website.forms","evennia.web.website.templatetags","evennia.web.website.templatetags.addclass","evennia.web.website.tests","evennia.web.website.urls","evennia.web.website.views","VERSION WARNING","Toc"],titleterms:{"3rd":137,"9th":137,"case":0,"class":[22,27,33,40,95,124,126],"default":[5,6,25,30,42,43,54,59,73,79,136,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170],"final":[48,74],"function":[22,41,79,88,94,101,113],"goto":50,"import":[26,40,52,94],"new":[3,4,6,57,59,68,85,96,101,113,124,126,132],"public":53,"return":[50,58,104],"static":110,"super":19,"switch":40,"try":40,Adding:[0,4,5,6,9,20,25,31,38,39,40,43,73,85,111,120,132],And:[69,91],For:118,NOT:76,PMs:57,TLS:8,The:[3,10,11,13,14,16,18,19,22,26,29,40,45,46,48,49,50,57,68,76,82,84,92,95,108,115,122,134],USE:76,Use:[26,102],Using:[48,51,83,85,89,92,108,111,126,128,129,139],Yes:50,__unloggedin_look_command:42,abort:29,about:[29,42,114,124,127],abus:12,access:42,access_typ:79,account:[2,42,57,63,96,142,143,144,145,146,147,155],activ:[56,132],actual:[33,124],add:[3,4,23,25,59],add_choic:22,addclass:357,addcom:42,adding:126,addit:[9,38,40,43,99],address:25,admin:[42,63,96,134,144,156,172,235,242,252,261,313],administr:7,advanc:[18,29,86,109],affect:239,aggress:116,alia:[42,96],alias:111,all:[25,68],allcom:42,alpha:60,altern:[9,105],amp:274,amp_client:262,amp_serv:275,analyz:92,android:74,ani:[13,54],annot:118,anoth:[40,118],ansi:[27,113,125,319],apach:8,api:[1,44,52,136],app:[68,132],arbitrari:50,area:[110,122],arg:90,arg_regex:33,argument:[1,50,90],arm:21,arx:9,arxcod:9,ascii:27,ask:[33,50],assign:[19,33],assort:[10,14,31,33,39,50,111,117],async:10,asynchron:10,attach:[105,106],attack:122,attribut:[11,63,96,314],attributehandl:11,audit:[207,208,209,210],aug:[1,47],auto:67,automat:25,avail:[35,58,106],backend:347,ban:[12,42],barter:178,base:[25,108,115],basic:[4,13,14,18,54,70,94,95,122,126,135],batch:[13,14,15,320],batchcod:[13,42],batchcommand:42,batchprocess:[42,157],batchprocessor:320,befor:26,best:90,beta:60,between:[13,50,124],blank:24,block:[13,29],bodyfunct:222,boot:[12,42],bootstrap:[16,17],border:17,bot:145,brainstorm:[44,137],branch:[50,130],bridg:76,brief:[54,68],briefli:87,bug:96,build:[18,19,20,21,22,42,48,57,60,84,110,123,158],builder:18,building_menu:[22,179],busi:84,button:[17,20],calendar:61,call:33,callback:[0,45,136],callbackhandl:191,caller:50,can:[11,22,54,66],capcha:132,card:17,care:102,caveat:[13,14,74,113,124],cboot:42,ccreat:42,cdesc:42,cdestroi:42,cemit:42,central:44,chainsol:137,chang:[0,5,6,25,57,59,75,96,102,107,127,130,135],channel:[25,34,40,42,57,63],channelhandl:173,charact:[6,24,25,45,57,59,60,63,72,81,88,95,122,132,133],charcreat:42,chardelet:42,chargen:[122,180],chat:137,cheat:41,check:[11,79],checker:26,checkpoint:132,choic:22,choos:23,clean:9,clickabl:113,client:[24,82,87,89,134,136,267],client_opt:73,clock:42,clone:[9,130],cloth:181,cloud9:89,cmdabout:42,cmdaccess:42,cmdaddcom:42,cmdallcom:42,cmdban:42,cmdbatchcod:42,cmdbatchcommand:42,cmdboot:42,cmdcboot:42,cmdcdesc:42,cmdcdestroi:42,cmdcemit:42,cmdchannel:42,cmdchannelcr:42,cmdcharcreat:42,cmdchardelet:42,cmdclock:42,cmdcolortest:42,cmdcopi:42,cmdcpattr:42,cmdcreat:42,cmdcwho:42,cmddelcom:42,cmddesc:42,cmddestroi:42,cmddig:42,cmddrop:42,cmdemit:42,cmdexamin:42,cmdfind:42,cmdforc:42,cmdget:42,cmdgive:42,cmdhandler:149,cmdhelp:42,cmdhome:42,cmdic:42,cmdinventori:42,cmdirc2chan:42,cmdlink:42,cmdlistcmdset:42,cmdlock:42,cmdlook:42,cmdmvattr:42,cmdname:42,cmdnewpassword:42,cmdnick:42,cmdobject:42,cmdooc:42,cmdooclook:42,cmdopen:42,cmdoption:42,cmdpage:42,cmdparser:150,cmdpassword:42,cmdperm:42,cmdpose:42,cmdpy:42,cmdquell:42,cmdquit:42,cmdreload:42,cmdreset:42,cmdrss2chan:42,cmdsai:42,cmdscript:42,cmdserverload:42,cmdservic:42,cmdsession:42,cmdset:[5,42,151],cmdset_account:159,cmdset_charact:160,cmdset_red_button:223,cmdset_sess:161,cmdset_unloggedin:162,cmdsetattribut:42,cmdsetdesc:42,cmdsethandl:152,cmdsethelp:42,cmdsethom:42,cmdsetobjalia:42,cmdshutdown:42,cmdspawn:42,cmdstyle:42,cmdtag:42,cmdteleport:42,cmdtime:42,cmdtunnel:42,cmdtypeclass:42,cmdunban:42,cmdunconnectedconnect:42,cmdunconnectedcr:42,cmdunconnectedhelp:42,cmdunconnectedlook:42,cmdunconnectedquit:42,cmdunlink:42,cmdwall:42,cmdwhisper:42,cmdwho:42,cmdwipe:42,code:[8,13,22,25,26,27,40,41,49,58,59,60,72,84,86,107,123,127,130,320],collabor:56,color:[17,25,27,42,80,125],color_markup:182,colour:113,combat:[115,122],comfort:99,comm:[42,163,171,172,173,174,175,176],command:[5,14,22,25,28,29,30,31,32,33,35,40,41,42,43,44,57,59,61,67,70,80,84,87,90,96,99,115,120,122,126,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,192,320],comment:[43,48],commit:130,commun:[13,34],complet:79,complex:[22,118],compon:[17,44],comput:89,concept:[44,48,115],conclud:[38,122],conclus:[22,40,90,110],condit:[25,118],conf:103,config:[8,66,80],configur:[8,23,64,70,71,80,97,105,130,132],congratul:60,connect:[35,42,53,70,89,96],connection_wizard:263,contain:[99,321],content:[25,54],continu:36,contrib:[22,37,123,126,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233],contribut:37,control:130,convert:90,cooldown:28,coordin:38,copi:[8,42],core:[44,55,63],cpattr:42,cprofil:92,creat:[0,2,3,5,6,12,20,21,27,33,36,42,68,85,88,96,99,110,120,122,124,132,322],createnpc:122,creatur:99,credit:78,crop:27,current:[41,61],custom:[4,5,7,10,22,39,40,50,56,61,79,80,104,112,123,126,134,136],custom_gametim:183,cwho:42,data:[6,11,39,50,104,105],databas:[9,67,85,96,108,127],dbserial:323,deal:101,debug:[13,41,102],debugg:105,decor:[10,50],dedent:27,dedic:132,defaultobject:96,defin:[31,33,34,50,79,85,101,130],definit:79,delai:[10,27,29],delcom:42,delimit:25,demo:60,depend:[9,127],deploi:99,deprec:264,desc:[42,50],descer:56,descript:99,design:84,destroi:42,detail:[42,68,132],develop:[44,56,78,99,102,109,123,126],dialogu:45,dice:[57,184],dictionari:50,differ:[55,124],dig:42,diku:55,direct:105,directori:[46,89,103],disabl:102,discuss:78,displai:[24,27,48,61],django:[63,79,109,118,132,134],doc:[7,18,26,47],docker:99,document:[37,128,361],don:[13,54,99],donat:37,down:[20,109,120],drop:42,dummyrunn:[92,296],dummyrunner_set:297,durat:29,dure:109,dynam:[33,48,50],earli:7,echo:73,edit:[22,49,122],editnpc:122,editor:49,effect:239,elev:0,email_login:185,emit:42,emul:55,encod:[15,112],encrypt:89,end:40,engin:123,enjoi:8,enter:[24,120],entir:0,entri:[20,67],error:[43,94,101,109],eveditor:[49,324],evennia:[4,5,7,8,9,16,23,25,26,40,41,44,46,52,53,54,55,56,57,66,70,74,75,76,78,89,90,94,95,99,105,108,109,123,125,126,127,130,136,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361],evennia_launch:265,evenniatest:126,event:[0,45,61],eventfunc:193,everi:30,everyth:22,evform:[57,325],evmenu:[25,50,326],evmor:[51,327],evtabl:[25,57,328],examin:[41,42],exampl:[38,41,45,49,50,72,79,89,101,107,115,126,136,320],example_batch_cod:224,execut:[41,58],exercis:76,exist:[6,124],exit:[0,6,25,33,43,88],expand:[115,120],explan:22,explor:[26,95],extended_room:186,extern:102,familiar:[55,56],faq:25,faster:126,featur:[54,68,134],feel:55,field:63,fieldfil:187,file:[13,14,15,42,103,126,130,320],fill:27,find:[38,42,58],firewal:102,first:[0,22,45,56,59,94,123],fix:130,folder:[9,26,130],forc:42,foreground:109,forget:96,fork:[37,130],form:[17,132,355],format:50,forum:78,framework:78,from:[4,20,25,50,52,54,59,89,95,99,132,136,137],front:135,full:[22,40,68],func:40,further:[8,10,135],futur:[21,137],game:[7,26,27,38,44,46,48,53,54,56,57,58,60,61,72,89,99,110,119,122,123,126,127,130],game_index_cli:[266,267,268],gameplai:121,gametim:[61,329],gap:76,gendersub:188,gener:[17,22,40,42,44,78,122,123,132,164],general_context:348,get:[20,42,50,62,69,118],get_client_opt:73,get_input:50,get_inputfunc:73,get_valu:73,git:[63,130],github:63,give:[42,69],given:111,global:[90,101],glossari:63,gmcp:87,godhood:20,goldenlayout:136,googl:132,grant:57,grapevin:[64,276],griatch:[1,47,137],grid:[24,48],group:118,guest:65,gui:137,guid:9,handl:[12,68,102,109],handler:[106,115],haproxi:66,hard:76,have:122,health_bar:189,hello:94,help:[9,20,26,37,42,67,68,69,165,234,235,236,237],here:[26,54,59,95],hierarchi:57,hint:8,home:42,hook:124,host:89,hous:20,how:[2,33,57,69,70,88,99,112,120,124],html:[3,132],http:[8,66],idea:137,idmapp:[330,331,332,333],imag:[99,102],implement:72,improv:68,index:[53,68,132,138],info:[78,109],inform:[44,89],infrastructur:72,ingame_python:[190,191,192,193,194,195,196,197],ingo:82,inherit:139,inherits_from:27,initi:[6,23,25,115],initial_setup:269,inlin:113,inlinefunc:[113,334],input:[33,50,87],inputfunc:[73,82,87,270],insid:118,instal:[4,7,8,9,23,62,70,74,89,99,121,130,132],instanc:[33,85,124],instruct:87,integr:36,interact:[10,13,14,26],interfac:102,internation:75,interpret:105,introduct:[9,26,48,50,54,92,94,110,121,132],inventori:[42,81],irc2chan:42,irc:[71,277],issu:24,jan:137,johnni:1,join:40,jumbotron:17,just:54,kei:[22,24,50,108],keyword:45,kill:109,know:[54,102],known:96,kovitiku:47,languag:75,last:25,latest:[99,127],latin:25,launch:[49,50],layout:[16,40,46],learn:[26,54,76],leav:[40,120],legend:24,let:[13,41,68,89],librari:[46,95],licens:77,life:7,lift:12,like:[13,55,122],limit:[13,14,118],line:[21,24,41,49],link:[42,78,93,113],linux:[36,62,109],list:41,list_nod:50,listen:117,literatur:78,live:109,local:[89,90],lock:[11,42,79,120,238,239,240],lockdown:89,lockfunc:239,lockhandl:240,log:[9,27,68,94,102],logfil:105,logger:335,login:[65,73],logo:135,longer:45,look:[5,42,55,94,122],mac:[62,109],machin:89,magic:96,mail:[130,198],make:[20,21,27,56,57,59,120,122,126,130],manag:[4,136,146,175,236,243,253,271,315,331],manual:[53,80],map:[48,110],mapbuild:199,mapper:48,mariadb:23,mass:81,master:[57,130],match:96,mccp:278,mech:21,mechan:123,memplot:298,menu:[22,27,50,84,247],menu_login:200,merg:31,messag:[0,25,82,87],messagepath:82,method:[33,40,80,96],middlewar:349,migrat:[4,63,127],mind:130,mini:126,minimap:110,miscellan:123,mob:229,mod_proxi:8,mod_ssl:8,mod_wsgi:8,mode:[13,14,63,89,104,109],model:[85,126,132,147,176,237,244,254,272,316,332],modif:57,modifi:[8,30],modul:[70,72,93,94,108,115],monitor:73,monitorhandl:[83,255],more:[16,29,56,79,80,127,134],most:26,move:[25,120],msdp:87,msg:[34,80,82],mssp:279,mud:78,multi:56,multidesc:[56,201],multipl:[11,118],multisess:[63,104],mush:[56,122],mutabl:[11,96],mux:[128,239],muxcommand:166,mvattr:42,mxp:280,mysql:23,name:[12,42,87,96,239],naw:281,ndb:11,need:[0,54],nest:22,next:[56,62,70],nice:66,nick:[42,86],node:50,non:[11,25,28,53],nop:24,note:[8,10,14,15,31,33,39,50,86,111,117,121,126],npc:[84,116,117,122],number:90,object:[5,6,11,20,25,27,42,58,59,60,63,79,81,88,95,96,104,110,111,118,120,123,230,241,242,243,244,245],objmanipcommand:42,obtain:132,oct:137,octob:137,off:25,offici:78,olc:108,older:136,one:38,onli:109,onlin:[89,130],oob:87,ooc:42,open:[42,84],oper:[0,10],option:[1,22,42,50,57,66,89,90,102,109],optionclass:336,optionhandl:337,other:[23,33,44,78,89,103],our:[0,22,68,94,95,107,120,132],out:[39,57],outgo:82,output:[58,208],outputcommand:87,outputfunc:87,outsid:[58,89],overal:72,overload:[80,124,134],overrid:96,overview:[36,46,85,115,135],own:[2,33,39,73,88,89,99,136],page:[3,4,42,68,134,135],parent:[56,85],pars:[25,40,90,94],part:95,parti:78,password:42,patch:37,path:[13,82],paus:[0,29,33],pax:9,pdb:41,perm:42,permiss:[19,57,79,111],perpetu:60,persist:[11,28,29,49],person:20,picklefield:338,pictur:132,pip:[4,63],plai:66,plan:[26,60,110],player:56,plugin:136,point:26,polici:128,port:[89,102],portal:[82,91,104,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294],portalsess:82,portalsessionhandl:[82,283],pose:42,posit:1,post:137,postgresql:23,practic:90,prepar:36,prerequisit:74,press:24,prevent:25,privileg:4,problem:107,process:[10,109],processor:[13,14,15,320],product:[21,99],profil:[92,295,296,297,298,299,300,301,302],program:[41,54],progress:76,project:[36,105],prompt:[30,50],properti:[2,11,31,33,34,50,63,88,101,104,111,124],protfunc:[108,248],protocol:[39,44,54,87],prototyp:[108,246,247,248,249,250],proxi:[8,89],publicli:130,pudb:41,puppet:63,push:[20,130],put:[68,130],puzzl:202,pycharm:105,python:[13,26,54,56,58,70,76,78,93,94,95],quell:[19,42,79],queri:[118,124],quick:[36,62],quickli:66,quickstart:20,quiet:90,quirk:96,quit:42,random_string_gener:203,read:[10,26,134,135],real:13,reboot:109,recapcha:132,receiv:[39,87],red_button:225,red_button_script:226,reduc:1,refactor:[1,47],refer:25,regist:89,relat:[44,61],releas:60,relev:89,reli:13,reload:[8,25,42,96,109],remark:122,rememb:52,remind:68,remot:[89,130],remov:[25,111],repeat:[50,73],repo:9,repositori:[26,37,63,130],requir:62,reset:[42,109,127],reshuffl:20,resourc:78,restart:8,retriev:11,roadmap:98,role:57,roleplai:57,roller:57,rom:55,room:[0,6,25,38,48,57,60,81,88,231],rplanguag:204,rpsystem:205,rss2chan:42,rss:[97,284],rule:[31,72,115],run:[4,7,33,41,54,74,99,105,126],runner:126,safeti:13,sage:47,sai:42,same:[45,50],save:11,schema:127,score:122,screen:35,screenshot:100,script:[42,63,101,120,194,251,252,253,254,255,256,257,258,259],scripthandl:256,search:[27,31,38,85,90,111,118,339],secret:132,secur:[8,66,102,206,207,208,209,210],see:[68,96],select:25,self:90,send:[24,30,39,87],sent:30,separ:22,sept:[1,47],server:[7,8,23,42,75,89,91,103,104,122,209,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310],serverconf:103,serversess:[82,304],serversessionhandl:82,servic:[42,268],session:[25,42,57,63,82,104,305],sessionhandl:[104,306],set:[4,5,9,31,42,48,50,53,61,64,71,79,80,89,97,102,103,105,122,126,130],setdesc:42,sethelp:42,sethom:42,setpow:122,settings_default:311,settings_mixin:299,setup:[8,9,23,36,89],sever:[38,45,90],share:130,sharedmemorymodel:85,sheet:[41,57],shell:95,shop:84,shortcut:11,show:122,shut:109,shutdown:42,signal:[106,307],simpl:[3,22,29,41,50,79,92,126],simpledoor:211,singl:11,site:[63,134],sitekei:132,slow_exit:212,soft:107,softcod:[56,107],solut:107,some:[38,40,55],somewher:54,sourc:[42,105],space:17,spawn:[42,56,108],spawner:[108,250],specif:5,splithandl:136,spread:37,spuriou:24,sql:23,sqlite3:23,ssh:[87,102,285],ssl:[89,286],standard:[54,61,128],start:[9,57,62,84,99,109],stat:119,statu:[93,109],step:[5,9,20,41,56,59,60,64,70,71,74,97,123,130,132],stop:109,storag:50,store:[6,11,25,50,108],string:[79,90,93],strip:90,studi:0,stuff:[54,122],style:[17,42],sub:22,subclass:88,subject:95,submodul:[140,142,148,154,171,177,190,207,215,221,228,234,238,241,246,251,260,266,273,295,312,318,330,344,346,351,354,356],subpackag:[140,148,177,206,260,318,344,354],suit:126,summari:[12,54],superus:79,support:[24,54,87],suppress_ga:287,surround:41,swap:124,synchron:10,syntax:[26,56,109,320],syscommand:167,system:[16,32,33,42,44,60,67,68,72,79,115,122,123,168],tabl:[25,27,85],tag:[38,42,111,125,317],talking_npc:213,taskhandl:258,tb_basic:216,tb_equip:217,tb_item:218,tb_magic:219,tb_rang:220,teamciti:36,tech:60,technic:54,tel:42,telnet:[24,87,89,288],telnet_oob:289,telnet_ssl:290,templat:[36,68,132],templatetag:[356,357],tempmsg:34,temporari:50,termux:74,test:[54,58,92,122,126,169,195,210,227,291,301,333,350,358],test_queri:300,test_resourc:340,text2html:341,text:[27,50,73,112,113,135],texttag:113,theori:90,thi:[40,68],thing:[55,56,118],third:78,throttl:308,through:[37,41,99],ticker:[63,114],tickerhandl:[114,259],tie:57,time:[27,33,42,61,101,107],time_format:27,timer:92,timetrac:302,tip:130,titeuf87:137,to_byt:27,to_str:27,toc:362,togeth:[66,68],tool:[12,27,78],traceback:26,track:130,train:120,translat:75,travi:129,treat:13,tree_select:214,trick:130,troubleshoot:[59,62,74],ttype:292,tunnel:42,turn:[25,96,115],turnbattl:[215,216,217,218,219,220],tutori:[0,5,6,18,21,45,61,68,84,95,115,116,117,118,119,120,121,122,123,126,131,133,135],tutorial_exampl:[221,222,223,224,225,226,227],tutorial_world:[228,229,230,231],tweak:[59,95],tweet:[70,119],twist:[63,93],twitter:70,two:95,type:[2,5,6,11,59,88],typeclass:[6,42,44,56,63,80,96,118,123,124,139,196,312,313,314,315,316,317],unban:42,under:130,understand:125,ungm:57,uninstal:121,unit:126,unixcommand:232,unlink:42,unloggedin:[42,170],unmonitor:73,unrepeat:73,updat:[6,25,59,124,127,130],upgrad:127,upload:102,upstream:[96,130],url:[3,4,68,132,345,352,359],usag:[1,13,14,49],use:[54,96,114],used:[25,33],useful:[33,78],user:[19,33,55,56,68,102,123,130],userpassword:42,using:[0,41,118,126],util:[17,27,29,33,78,105,118,197,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,346,347,348,349,350],valid:[79,309],validatorfunc:343,valu:[50,108,118],variabl:[41,58],vehicl:120,version:[130,361],versu:10,vhost:8,view:[3,67,68,132,133,134,353,360],virtualenv:63,voic:0,wai:[29,50,76],wall:42,want:[54,99],warn:361,weather:131,web:[3,44,87,89,96,102,123,132,133,134,135,136,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360],webclient:[136,137,293,351,352,353],webclient_ajax:294,webclient_gui:136,webserv:[102,310],websit:[4,134,354,355,356,357,358,359,360],websocket:[8,66],weight:81,what:[11,16,36,40,54,90,99],when:[25,52,114],where:[5,54,59,62,95],whisper:42,whitepag:44,who:[33,42],wiki:[4,138],wilder:233,willing:54,window:[9,62],wipe:42,wizard:53,won:24,word:37,work:[7,33,54,68,76,90,99,120,124,130],workaround:24,world:[18,20,60,94,121],write:[39,126,136],xterm256:[113,125],yield:[29,50],you:[26,54],your:[2,4,19,20,26,33,38,39,59,73,85,88,89,96,99,102,107,127,130,132,136],yourself:[20,59,60],zone:139}}) \ No newline at end of file diff --git a/docs/0.9.1/.buildinfo b/docs/0.9.5/.buildinfo similarity index 82% rename from docs/0.9.1/.buildinfo rename to docs/0.9.5/.buildinfo index a3069cb6ae..fac4f778ac 100644 --- a/docs/0.9.1/.buildinfo +++ b/docs/0.9.5/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: f3467f5c1225c147020ad92909044bf5 +config: 7e3e18bbc03756854a014e3852a3143a tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/0.9.1/.nojekyll b/docs/0.9.5/.nojekyll similarity index 100% rename from docs/0.9.1/.nojekyll rename to docs/0.9.5/.nojekyll diff --git a/docs/0.9.1/A-voice-operated-elevator-using-events.html b/docs/0.9.5/A-voice-operated-elevator-using-events.html similarity index 74% rename from docs/0.9.1/A-voice-operated-elevator-using-events.html rename to docs/0.9.5/A-voice-operated-elevator-using-events.html index be39cc411d..807f652536 100644 --- a/docs/0.9.1/A-voice-operated-elevator-using-events.html +++ b/docs/0.9.5/A-voice-operated-elevator-using-events.html @@ -1,11 +1,10 @@ - + - - A voice operated elevator using events — Evennia 0.9.1 documentation + A voice operated elevator using events — Evennia 0.9.5 documentation @@ -26,8 +25,7 @@
  • modules |
  • - - + @@ -41,12 +39,23 @@ -

    This tutorial will walk you through the steps to create a voice-operated elevator, using the in-game Python system. This tutorial assumes the in-game Python system is installed in your game. If it isn’t, you can follow the installation steps given in the documentation on in-game Python, and come back on this tutorial once the system is installed. You do not need to read the entire documentation, it’s a good reference, but not the easiest way to learn about it. Hence these tutorials.

    -

    The in-game Python system allows to run code on individual objects in some situations. You don’t have to modify the source code to add these features, past the installation. The entire system makes it easy to add specific features to some objects, but not all.

    +

    This tutorial will walk you through the steps to create a voice-operated elevator, using the in- +game Python +system. +This tutorial assumes the in-game Python system is installed in your game. If it isn’t, you can +follow the installation steps given in the documentation on in-game +Python, and +come back on this tutorial once the system is installed. You do not need to read the entire +documentation, it’s a good reference, but not the easiest way to learn about it. Hence these +tutorials.

    +

    The in-game Python system allows to run code on individual objects in some situations. You don’t +have to modify the source code to add these features, past the installation. The entire system +makes it easy to add specific features to some objects, but not all.

    What will we try to do?

    -

    In this tutorial, we are going to create a simple voice-operated elevator. In terms of features, we will:

    +

    In this tutorial, we are going to create a simple voice-operated elevator. In terms of features, we +will:

    • Explore events with parameters.

    • Work on more interesting callbacks.

    • @@ -55,16 +64,26 @@

    Our study case

    -

    Let’s summarize what we want to achieve first. We would like to create a room that will represent the inside of our elevator. In this room, a character could just say “1”, “2” or “3”, and the elevator will start moving. The doors will close and open on the new floor (the exits leading in and out of the elevator will be modified).

    -

    We will work on basic features first, and then will adjust some, showing you how easy and powerfully independent actions can be configured through the in-game Python system.

    +

    Let’s summarize what we want to achieve first. We would like to create a room that will represent +the inside of our elevator. In this room, a character could just say “1”, “2” or “3”, and the +elevator will start moving. The doors will close and open on the new floor (the exits leading in +and out of the elevator will be modified).

    +

    We will work on basic features first, and then will adjust some, showing you how easy and powerfully +independent actions can be configured through the in-game Python system.

    Creating the rooms and exits we need

    -

    We’ll create an elevator right in our room (generally called “Limbo”, of ID 2). You could easily adapt the following instructions if you already have some rooms and exits, of course, just remember to check the IDs.

    +

    We’ll create an elevator right in our room (generally called “Limbo”, of ID 2). You could easily +adapt the following instructions if you already have some rooms and exits, of course, just remember +to check the IDs.

    -

    Note: the in-game Python system uses IDs for a lot of things. While it is not mandatory, it is good practice to know the IDs you have for your callbacks, because it will make manipulation much quicker. There are other ways to identify objects, but as they depend on many factors, IDs are usually the safest path in our callbacks.

    +

    Note: the in-game Python system uses IDs for a lot of things. While it is not mandatory, it is +good practice to know the IDs you have for your callbacks, because it will make manipulation much +quicker. There are other ways to identify objects, but as they depend on many factors, IDs are +usually the safest path in our callbacks.

    -

    Let’s go into limbo (#2) to add our elevator. We’ll add it to the north. To create this room, in-game you could type:

    +

    Let’s go into limbo (#2) to add our elevator. We’ll add it to the north. To create this room, +in-game you could type:

    tunnel n = Inside of an elevator
     
    @@ -85,8 +104,11 @@

    Why have we created exits to our elevator and back to Limbo? Isn’t the elevator supposed to move?

    -

    It is. But we need to have exits that will represent the way inside the elevator and out. What we will do, at every floor, will be to change these exits so they become connected to the right room. You’ll see this process a bit later.

    -

    We have two more rooms to create: our floor 2 and 3. This time, we’ll use dig, because we don’t need exits leading there, not yet anyway.

    +

    It is. But we need to have exits that will represent the way inside the elevator and out. What we +will do, at every floor, will be to change these exits so they become connected to the right room. +You’ll see this process a bit later.

    +

    We have two more rooms to create: our floor 2 and 3. This time, we’ll use dig, because we don’t +need exits leading there, not yet anyway.

    dig The second floor
     dig The third floor
     
    @@ -101,21 +123,36 @@

    Our first callback in the elevator

    Let’s go to the elevator (you could use tel #3 if you have the same IDs I have).

    -

    This is our elevator room. It looks a bit empty, feel free to add a prettier description or other things to decorate it a bit.

    -

    But what we want now is to be able to say “1”, “2” or “3” and have the elevator move in that direction.

    -

    If you have read the previous tutorial about adding dialogues in events, you may remember what we need to do. If not, here’s a summary: we need to run some code when somebody speaks in the room. So we need to create a callback (the callback will contain our lines of code). We just need to know on which event this should be set. You can enter call here to see the possible events in this room.

    -

    In the table, you should see the “say” event, which is called when somebody says something in the room. So we’ll need to add a callback to this event. Don’t worry if you’re a bit lost, just follow the following steps, the way they connect together will become more obvious.

    +

    This is our elevator room. It looks a bit empty, feel free to add a prettier description or other +things to decorate it a bit.

    +

    But what we want now is to be able to say “1”, “2” or “3” and have the elevator move in that +direction.

    +

    If you have read the previous tutorial about adding dialogues in events, you +may remember what we need to do. If not, here’s a summary: we need to run some code when somebody +speaks in the room. So we need to create a callback (the callback will contain our lines of code). +We just need to know on which event this should be set. You can enter call here to see the +possible events in this room.

    +

    In the table, you should see the “say” event, which is called when somebody says something in the +room. So we’ll need to add a callback to this event. Don’t worry if you’re a bit lost, just follow +the following steps, the way they connect together will become more obvious.

    call/add here = say 1, 2, 3
     
      -
    1. We need to add a callback. A callback contains the code that will be executed at a given time. So we use the call/add command and switch.

    2. +
    3. We need to add a callback. A callback contains the code that will be executed at a given time. +So we use the call/add command and switch.

    4. here is our object, the room in which we are.

    5. An equal sign.

    6. -
    7. The name of the event to which the callback should be connected. Here, the event is “say”. Meaning this callback will be executed every time somebody says something in the room.

    8. -
    9. But we add an event parameter to indicate the keywords said in the room that should execute our callback. Otherwise, our callback would be called every time somebody speaks, no matter what. Here we limit, indicating our callback should be executed only if the spoken message contains “1”, “2” or “3”.

    10. +
    11. The name of the event to which the callback should be connected. Here, the event is “say”. +Meaning this callback will be executed every time somebody says something in the room.

    12. +
    13. But we add an event parameter to indicate the keywords said in the room that should execute our +callback. Otherwise, our callback would be called every time somebody speaks, no matter what. Here +we limit, indicating our callback should be executed only if the spoken message contains “1”, “2” or +“3”.

    -

    An editor should open, inviting you to enter the Python code that should be executed. The first thing to remember is to read the text provided (it can contain important information) and, most of all, the list of variables that are available in this callback:

    +

    An editor should open, inviting you to enter the Python code that should be executed. The first +thing to remember is to read the text provided (it can contain important information) and, most of +all, the list of variables that are available in this callback:

    Variables you can use in this event:
     
         character: the character having spoken in this room.
    @@ -123,26 +160,31 @@
         message: the text having been spoken by the character.
     
     ----------Line Editor [Callback say of Inside of an elevator]---------------------
    -01| 
    +01|
     ----------[l:01 w:000 c:0000]------------(:h for help)----------------------------
     
    -

    This is important, in order to know what variables we can use in our callback out-of-the-box. Let’s write a single line to be sure our callback is called when we expect it to:

    +

    This is important, in order to know what variables we can use in our callback out-of-the-box. Let’s +write a single line to be sure our callback is called when we expect it to:

    1
    character.msg("You just said {}.".format(message))
     
    -

    You can paste this line in-game, then type the :wq command to exit the editor and save your modifications.

    -

    Let’s check. Try to say “hello” in the room. You should see the standard message, but nothing more. Now try to say “1”. Below the standard message, you should see:

    +

    You can paste this line in-game, then type the :wq command to exit the editor and save your +modifications.

    +

    Let’s check. Try to say “hello” in the room. You should see the standard message, but nothing +more. Now try to say “1”. Below the standard message, you should see:

    You just said 1.
     
    -

    You can try it. Our callback is only called when we say “1”, “2” or “3”. Which is just what we want.

    +

    You can try it. Our callback is only called when we say “1”, “2” or “3”. Which is just what we +want.

    Let’s go back in our code editor and add something more useful.

    call/edit here = say
     
    -

    Notice that we used the “edit” switch this time, since the callback exists, we just want to edit it.

    +

    Notice that we used the “edit” switch this time, since the callback exists, we just want to edit +it.

    The editor opens again. Let’s empty it first:

    :DD
    @@ -153,7 +195,8 @@
     
    -

    Auto-indentation is an interesting feature of the code editor, but we’d better not use it at this point, it will make copy/pasting more complicated.

    +

    Auto-indentation is an interesting feature of the code editor, but we’d better not use it at this +point, it will make copy/pasting more complicated.

    @@ -161,9 +204,11 @@

    So here’s the time to truly code our callback in-game. Here’s a little reminder:

    1. We have all the IDs of our three rooms and two exits.

    2. -
    3. When we say “1”, “2” or “3”, the elevator should move to the right room, that is change the exits. Remember, we already have the exits, we just need to change their location and destination.

    4. +
    5. When we say “1”, “2” or “3”, the elevator should move to the right room, that is change the +exits. Remember, we already have the exits, we just need to change their location and destination.

    -

    It’s a good idea to try to write this callback yourself, but don’t feel bad about checking the solution right now. Here’s a possible code that you could paste in the code editor:

    +

    It’s a good idea to try to write this callback yourself, but don’t feel bad about checking the +solution right now. Here’s a possible code that you could paste in the code editor:

     1
      2
      3
    @@ -213,33 +258,53 @@
     

    Let’s review this longer callback:

      -
    1. We first obtain the objects of both exits and our three floors. We use the get() eventfunc, which is a shortcut to obtaining objects. We usually use it to retrieve specific objects with an ID. We put the floors in a dictionary. The keys of the dictionary are the floor number (as str), the values are room objects.

    2. -
    3. Remember, the message variable contains the message spoken in the room. So either “1”, “2”, or “3”. We still need to check it, however, because if the character says something like “1 2” in the room, our callback will be executed. Let’s be sure what she says is a floor number.

    4. -
    5. We then check if the elevator is already at this floor. Notice that we use TO_EXIT.location. TO_EXIT contains our “north” exit, leading inside of our elevator. Therefore, its location will be the room where the elevator currently is.

    6. -
    7. If the floor is a different one, have the elevator “move”, changing just the location and destination of both exits.

      +
    8. We first obtain the objects of both exits and our three floors. We use the get() eventfunc, +which is a shortcut to obtaining objects. We usually use it to retrieve specific objects with an +ID. We put the floors in a dictionary. The keys of the dictionary are the floor number (as str), +the values are room objects.

    9. +
    10. Remember, the message variable contains the message spoken in the room. So either “1”, “2”, or +“3”. We still need to check it, however, because if the character says something like “1 2” in the +room, our callback will be executed. Let’s be sure what she says is a floor number.

    11. +
    12. We then check if the elevator is already at this floor. Notice that we use TO_EXIT.location. +TO_EXIT contains our “north” exit, leading inside of our elevator. Therefore, its location will +be the room where the elevator currently is.

    13. +
    14. If the floor is a different one, have the elevator “move”, changing just the location and +destination of both exits.

        -
      • The BACK_EXIT (that is “north”) should change its location. The elevator shouldn’t be accessible through our old floor.

      • -
      • The TO_EXIT (that is “south”, the exit leading out of the elevator) should have a different destination. When we go out of the elevator, we should find ourselves in the new floor, not the old one.

      • +
      • The BACK_EXIT (that is “north”) should change its location. The elevator shouldn’t be +accessible through our old floor.

      • +
      • The TO_EXIT (that is “south”, the exit leading out of the elevator) should have a different +destination. When we go out of the elevator, we should find ourselves in the new floor, not the old +one.

    -

    Feel free to expand on this example, changing messages, making further checks. Usage and practice are keys.

    +

    Feel free to expand on this example, changing messages, making further checks. Usage and practice +are keys.

    You can quit the editor as usual with :wq and test it out.

    Adding a pause in our callback

    -

    Let’s improve our callback. One thing that’s worth adding would be a pause: for the time being, when we say the floor number in the elevator, the doors close and open right away. It would be better to have a pause of several seconds. More logical.

    -

    This is a great opportunity to learn about chained events. Chained events are very useful to create pauses. Contrary to the events we have seen so far, chained events aren’t called automatically. They must be called by you, and can be called after some time.

    +

    Let’s improve our callback. One thing that’s worth adding would be a pause: for the time being, +when we say the floor number in the elevator, the doors close and open right away. It would be +better to have a pause of several seconds. More logical.

    +

    This is a great opportunity to learn about chained events. Chained events are very useful to create +pauses. Contrary to the events we have seen so far, chained events aren’t called automatically. +They must be called by you, and can be called after some time.

      -
    • Chained events always have the name “chain_X”. Usually, X is a number, but you can give the chained event a more explicit name.

    • +
    • Chained events always have the name “chain_X”. Usually, X is a number, but you can give the +chained event a more explicit name.

    • In our original callback, we will call our chained events in, say, 15 seconds.

    • We’ll also have to make sure the elevator isn’t already moving.

    -

    Other than that, a chained event can be connected to a callback as usual. We’ll create a chained event in our elevator, that will only contain the code necessary to open the doors to the new floor.

    +

    Other than that, a chained event can be connected to a callback as usual. We’ll create a chained +event in our elevator, that will only contain the code necessary to open the doors to the new floor.

    call/add here = chain_1
     
    -

    The callback is added to the “chain_1” event, an event that will not be automatically called by the system when something happens. Inside this event, you can paste the code to open the doors at the new floor. You can notice a few differences:

    +

    The callback is added to the “chain_1” event, an event that will not be automatically called by the +system when something happens. Inside this event, you can paste the code to open the doors at the +new floor. You can notice a few differences:

    1
     2
     3
    @@ -321,20 +386,37 @@
     

    What changed?

      -
    1. We added a little test to make sure the elevator wasn’t already moving. If it is, the BACK_EXIT.location (the “south” exit leading out of the elevator) should be None. We’ll remove the exit while the elevator is moving.

    2. -
    3. When the doors close, we set both exits’ location to None. Which “removes” them from their room but doesn’t destroy them. The exits still exist but they don’t connect anything. If you say “2” in the elevator and look around while the elevator is moving, you won’t see any exits.

    4. -
    5. Instead of opening the doors immediately, we call call_event. We give it the object containing the event to be called (here, our elevator), the name of the event to be called (here, “chain_1”) and the number of seconds from now when the event should be called (here, 15).

    6. -
    7. The chain_1 callback we have created contains the code to “re-open” the elevator doors. That is, besides displaying a message, it reset the exits’ location and destination.

    8. +
    9. We added a little test to make sure the elevator wasn’t already moving. If it is, the +BACK_EXIT.location (the “south” exit leading out of the elevator) should be None. We’ll remove +the exit while the elevator is moving.

    10. +
    11. When the doors close, we set both exits’ location to None. Which “removes” them from their +room but doesn’t destroy them. The exits still exist but they don’t connect anything. If you say +“2” in the elevator and look around while the elevator is moving, you won’t see any exits.

    12. +
    13. Instead of opening the doors immediately, we call call_event. We give it the object containing +the event to be called (here, our elevator), the name of the event to be called (here, “chain_1”) +and the number of seconds from now when the event should be called (here, 15).

    14. +
    15. The chain_1 callback we have created contains the code to “re-open” the elevator doors. That +is, besides displaying a message, it reset the exits’ location and destination.

    -

    If you try to say “3” in the elevator, you should see the doors closing. Look around you and you won’t see any exit. Then, 15 seconds later, the doors should open, and you can leave the elevator to go to the third floor. While the elevator is moving, the exit leading to it will be inaccessible.

    +

    If you try to say “3” in the elevator, you should see the doors closing. Look around you and you +won’t see any exit. Then, 15 seconds later, the doors should open, and you can leave the elevator +to go to the third floor. While the elevator is moving, the exit leading to it will be +inaccessible.

    -

    Note: we don’t define the variables again in our chained event, we just call them. When we execute call_event, a copy of our current variables is placed in the database. These variables will be restored and accessible again when the chained event is called.

    +

    Note: we don’t define the variables again in our chained event, we just call them. When we +execute call_event, a copy of our current variables is placed in the database. These variables +will be restored and accessible again when the chained event is called.

    -

    You can use the call/tasks command to see the tasks waiting to be executed. For instance, say “2” in the room, notice the doors closing, and then type the call/tasks command. You will see a task in the elevator, waiting to call the chain_1 event.

    +

    You can use the call/tasks command to see the tasks waiting to be executed. For instance, say “2” +in the room, notice the doors closing, and then type the call/tasks command. You will see a task +in the elevator, waiting to call the chain_1 event.

    Changing exit messages

    -

    Here’s another nice little feature of events: you can modify the message of a single exit without altering the others. In this case, when someone goes north into our elevator, we’d like to see something like: “someone walks into the elevator.” Something similar for the back exit would be great too.

    +

    Here’s another nice little feature of events: you can modify the message of a single exit without +altering the others. In this case, when someone goes north into our elevator, we’d like to see +something like: “someone walks into the elevator.” Something similar for the back exit would be +great too.

    Inside of the elevator, you can look at the available events on the exit leading outside (south).

    call south
     
    @@ -346,11 +428,14 @@ | | | through this exit. |
    -

    So we can change the message others see when a character leaves, by editing the “msg_leave” event. Let’s do that:

    +

    So we can change the message others see when a character leaves, by editing the “msg_leave” event. +Let’s do that:

    call/add south = msg_leave
     
    -

    Take the time to read the help. It gives you all the information you should need. We’ll need to change the “message” variable, and use custom mapping (between braces) to alter the message. We’re given an example, let’s use it. In the code editor, you can paste the following line:

    +

    Take the time to read the help. It gives you all the information you should need. We’ll need to +change the “message” variable, and use custom mapping (between braces) to alter the message. We’re +given an example, let’s use it. In the code editor, you can paste the following line:

    1
    message = "{character} walks out of the elevator."
     
    @@ -363,41 +448,62 @@
    py self.search("beggar").move_to(self.search("south"))
     
    -

    This is a crude way to force our beggar out of the elevator, but it allows us to test. You should see:

    +

    This is a crude way to force our beggar out of the elevator, but it allows us to test. You should +see:

    A beggar(#8) walks out of the elevator.
     
    -

    Great! Let’s do the same thing for the exit leading inside of the elevator. Follow the beggar, then edit “msg_leave” of “north”:

    +

    Great! Let’s do the same thing for the exit leading inside of the elevator. Follow the beggar, +then edit “msg_leave” of “north”:

    call/add north = msg_leave
     
    1
    message = "{character} walks into the elevator."
     
    -

    Again, you can force our beggar to move and see the message we have just set. This modification applies to these two exits, obviously: the custom message won’t be used for other exits. Since we use the same exits for every floor, this will be available no matter at what floor the elevator is, which is pretty neat!

    +

    Again, you can force our beggar to move and see the message we have just set. This modification +applies to these two exits, obviously: the custom message won’t be used for other exits. Since we +use the same exits for every floor, this will be available no matter at what floor the elevator is, +which is pretty neat!

    Tutorial F.A.Q.

    • Q: what happens if the game reloads or shuts down while a task is waiting to happen?

    • -
    • A: if your game reloads while a task is in pause (like our elevator between floors), when the game is accessible again, the task will be called (if necessary, with a new time difference to take into account the reload). If the server shuts down, obviously, the task will not be called, but will be stored and executed when the server is up again.

    • +
    • A: if your game reloads while a task is in pause (like our elevator between floors), when the +game is accessible again, the task will be called (if necessary, with a new time difference to take +into account the reload). If the server shuts down, obviously, the task will not be called, but +will be stored and executed when the server is up again.

    • Q: can I use all kinds of variables in my callback? Whether chained or not?

    • -
    • A: you can use every variable type you like in your original callback. However, if you execute call_event, since your variables are stored in the database, they will need to respect the constraints on persistent attributes. A callback will not be stored in this way, for instance. This variable will not be available in your chained event.

    • -
    • Q: when you say I can call my chained events something else than “chain_1”, “chain_2” and such, what is the naming convention?

    • -
    • A: chained events have names beginning by “chain_”. This is useful for you and for the system. But after the underscore, you can give a more useful name, like “chain_open_doors” in our case.

    • +
    • A: you can use every variable type you like in your original callback. However, if you +execute call_event, since your variables are stored in the database, they will need to respect the +constraints on persistent attributes. A callback will not be stored in this way, for instance. +This variable will not be available in your chained event.

    • +
    • Q: when you say I can call my chained events something else than “chain_1”, “chain_2” and +such, what is the naming convention?

    • +
    • A: chained events have names beginning by “chain_”. This is useful for you and for the +system. But after the underscore, you can give a more useful name, like “chain_open_doors” in our +case.

    • Q: do I have to pause several seconds to call a chained event?

    • -
    • A: no, you can call it right away. Just leave the third parameter of call_event out (it will default to 0, meaning the chained event will be called right away). This will not create a task.

    • +
    • A: no, you can call it right away. Just leave the third parameter of call_event out (it +will default to 0, meaning the chained event will be called right away). This will not create a +task.

    • Q: can I have chained events calling themselves?

    • -
    • A: you can. There’s no limitation. Just be careful, a callback that calls itself, particularly without delay, might be a good recipe for an infinite loop. However, in some cases, it is useful to have chained events calling themselves, to do the same repeated action every X seconds for instance.

    • +
    • A: you can. There’s no limitation. Just be careful, a callback that calls itself, +particularly without delay, might be a good recipe for an infinite loop. However, in some cases, it +is useful to have chained events calling themselves, to do the same repeated action every X seconds +for instance.

    • Q: what if I need several elevators, do I need to copy/paste these callbacks each time?

    • -
    • A: not advisable. There are definitely better ways to handle this situation. One of them is to consider adding the code in the source itself. Another possibility is to call chained events with the expected behavior, which makes porting code very easy. This side of chained events will be shown in the next tutorial.

    • +
    • A: not advisable. There are definitely better ways to handle this situation. One of them is +to consider adding the code in the source itself. Another possibility is to call chained events +with the expected behavior, which makes porting code very easy. This side of chained events will be +shown in the next tutorial.

    • Previous tutorial: Adding dialogues in events

    -
    @@ -440,7 +546,7 @@

    Versions

    @@ -456,13 +562,12 @@
  • modules |
  • - - + \ No newline at end of file diff --git a/docs/0.9.1/API-refactoring.html b/docs/0.9.5/API-refactoring.html similarity index 74% rename from docs/0.9.1/API-refactoring.html rename to docs/0.9.5/API-refactoring.html index bbcf52075f..f24443e5cd 100644 --- a/docs/0.9.1/API-refactoring.html +++ b/docs/0.9.5/API-refactoring.html @@ -1,11 +1,10 @@ - + - - API refactoring — Evennia 0.9.1 documentation + API refactoring — Evennia 0.9.5 documentation @@ -26,8 +25,7 @@
  • modules |
  • - - + @@ -38,17 +36,30 @@

    API refactoring

    -

    Building up to Evennia 1.0 and beyond, it’s time to comb through the Evennia API for old cruft. This whitepage is for anyone interested to contribute with their views on what part of the API needs refactoring, cleanup or clarification (or extension!)

    -

    Note that this is not a forum. To keep things clean, each opinion text should ideally present a clear argument or lay out a suggestion. Asking for clarification and any side-discussions should be held in chat or forum.

    +

    Building up to Evennia 1.0 and beyond, it’s time to comb through the Evennia API for old cruft. This +whitepage is for anyone interested to contribute with their views on what part of the API needs +refactoring, cleanup or clarification (or extension!)

    +

    Note that this is not a forum. To keep things clean, each opinion text should ideally present a +clear argument or lay out a suggestion. Asking for clarification and any side-discussions should be +held in chat or forum.


    Griatch (Aug 13, 2019)

    -

    This is how to enter an opinion. Use any markdown needed but stay within your section. Also remember to copy your text to the clipboard before saving since if someone else edited the wiki in the meantime you’ll have to start over.

    +

    This is how to enter an opinion. Use any markdown needed but stay within your section. Also remember +to copy your text to the clipboard before saving since if someone else edited the wiki in the +meantime you’ll have to start over.

    Griatch (Sept 2, 2019)

    -

    I don’t agree with removing explicit keywords as suggested by Johnny on Aug 29 below. Overriding such a method can still be done by get(self, **kwargs) if so desired, making the kwargs explicit helps IMO readability of the API. If just giving a generic **kwargs, one must read the docstring or even the code to see which keywords are valid.

    -

    On the other hand, I think it makes sense to as a standard offer an extra **kwargs at the end of arg-lists for common methods that are expected to be over-ridden. This make the API more flexible by hinting to the dev that they could expand their own over-ridden implementation with their own keyword arguments if so desired.

    +

    I don’t agree with removing explicit keywords as suggested by [Johnny on Aug 29 below](API- +refactoring#reduce-usage-of-optionalpositional-arguments-aug-29-2019). Overriding such a method can +still be done by get(self, **kwargs) if so desired, making the kwargs explicit helps IMO +readability of the API. If just giving a generic **kwargs, one must read the docstring or even the +code to see which keywords are valid.

    +

    On the other hand, I think it makes sense to as a standard offer an extra **kwargs at the end of +arg-lists for common methods that are expected to be over-ridden. This make the API more flexible by +hinting to the dev that they could expand their own over-ridden implementation with their own +keyword arguments if so desired.


    @@ -61,13 +72,15 @@ default_access=True, return_list=False):
    -

    Many classes have methods requiring lengthy positional argument lists, which are tedious and error-prone to extend and override especially in cases where not all arguments are even required. It would be useful if arguments were reserved for required inputs and anything else relegated to kwargs for easier passthrough on extension.

    +

    Many classes have methods requiring lengthy positional argument lists, which are tedious and error- +prone to extend and override especially in cases where not all arguments are even required. It would +be useful if arguments were reserved for required inputs and anything else relegated to kwargs for +easier passthrough on extension.

    -
    @@ -109,7 +122,7 @@

    Versions

    @@ -125,13 +138,12 @@
  • modules |
  • - - + \ No newline at end of file diff --git a/docs/0.9.1/Accounts.html b/docs/0.9.5/Accounts.html similarity index 87% rename from docs/0.9.1/Accounts.html rename to docs/0.9.5/Accounts.html index 02523f5fe4..007603b4b4 100644 --- a/docs/0.9.1/Accounts.html +++ b/docs/0.9.5/Accounts.html @@ -1,11 +1,10 @@ - + - - Accounts — Evennia 0.9.1 documentation + Accounts — Evennia 0.9.5 documentation @@ -26,8 +25,7 @@
  • modules |
  • - - + @@ -79,18 +77,20 @@ Evennia defaults to using this (it inherits directly from
        # in mygame/typeclasses/accounts.py
    +12
    +13
        # in mygame/typeclasses/accounts.py
     
         from evennia import DefaultAccount
     
         class Account(DefaultAccount): # [...]
     
    -	at_account_creation(self): "this is called only once, when account is first created"
    -	    self.db.real_name = None      # this is set later self.db.real_address = None   #       "
    -	    self.db.config_1 = True       # default config self.db.config_2 = False      #       "
    -	    self.db.config_3 = 1          #       "
    +        at_account_creation(self): "this is called only once, when account is first created"
    +            self.db.real_name = None      # this is set later self.db.real_address = None   #
    +"
    +            self.db.config_1 = True       # default config self.db.config_2 = False      #       "
    +            self.db.config_3 = 1          #       "
     
    -	    # ... whatever else our game needs to know ``` Reload the server with `reload`. 
    +            # ... whatever else our game needs to know ``` Reload the server with `reload`.
     

    … However, if you use examine *self (the asterisk makes you examine your Account object rather @@ -119,7 +119,8 @@ Account also has the following custom properties:

  • sessions - an instance of ObjectSessionHandler managing all connected Sessions (physical connections) this object listens to (Note: In older -versions of Evennia, this was a list). The so-called session-id (used in many places) is found as +versions of Evennia, this was a list). The so-called session-id (used in many places) is found +as a property sessid on each Session instance.

  • is_superuser (bool: True/False) - if this account is a superuser.

  • @@ -128,7 +129,8 @@ a property sessid

    cmdset - This holds all the current Commands of this Account. By default these are the commands found in the cmdset defined by settings.CMDSET_ACCOUNT.

  • nicks - This stores and handles Nicks, in the same way as nicks it works on Objects. -For Accounts, nicks are primarily used to store custom aliases for Channels.

  • +For Accounts, nicks are primarily used to store custom aliases for +Channels.

    Selection of special methods (see evennia.DefaultAccount for details):

    \ No newline at end of file diff --git a/docs/0.9.1/Add-a-simple-new-web-page.html b/docs/0.9.5/Add-a-simple-new-web-page.html similarity index 94% rename from docs/0.9.1/Add-a-simple-new-web-page.html rename to docs/0.9.5/Add-a-simple-new-web-page.html index 2468ffde47..66c548a27d 100644 --- a/docs/0.9.1/Add-a-simple-new-web-page.html +++ b/docs/0.9.5/Add-a-simple-new-web-page.html @@ -1,11 +1,10 @@ - + - - Add a simple new web page — Evennia 0.9.1 documentation + Add a simple new web page — Evennia 0.9.5 documentation @@ -26,8 +25,7 @@
  • modules |
  • - - + @@ -123,7 +121,8 @@ Django parlance). You can specify such places in your settings (see the When you enter the address http://localhost:4001/story in your web browser, Django will parse that field to figure out which page you want to go to. You tell it which patterns are relevant in the file -mygame/web/urls.py. +[mygame/web/urls.py](https://github.com/evennia/evennia/blob/master/evennia/game_template/web/urls.p +y). Open it now.

    Django looks for the variable urlpatterns in this file. You want to add your new pattern to the custom_patterns list we have prepared - that is then merged with the default urlpatterns. Here’s @@ -152,7 +151,6 @@ to.

    -
    @@ -191,7 +189,7 @@ to.

    Versions

    @@ -207,13 +205,12 @@ to.

  • modules |
  • - - + \ No newline at end of file diff --git a/docs/0.9.1/Add-a-wiki-on-your-website.html b/docs/0.9.5/Add-a-wiki-on-your-website.html similarity index 88% rename from docs/0.9.1/Add-a-wiki-on-your-website.html rename to docs/0.9.5/Add-a-wiki-on-your-website.html index 5775d31988..a6fcd8336d 100644 --- a/docs/0.9.1/Add-a-wiki-on-your-website.html +++ b/docs/0.9.5/Add-a-wiki-on-your-website.html @@ -1,11 +1,10 @@ - + - - Add a wiki on your website — Evennia 0.9.1 documentation + Add a wiki on your website — Evennia 0.9.5 documentation @@ -26,8 +25,7 @@
  • modules |
  • - - + @@ -46,9 +44,12 @@ Fortunately, you don’t have to create the features manually, since it has been we can integrate their work quite easily with Django. I have decided to focus on the Django-wiki.

    -

    Note: this article has been updated for Evennia 0.9. If you’re not yet using this version, be careful, as the django wiki doesn’t support Python 2 anymore. (Remove this note when enough time has passed.)

    +

    Note: this article has been updated for Evennia 0.9. If you’re not yet using this version, be +careful, as the django wiki doesn’t support Python 2 anymore. (Remove this note when enough time +has passed.)

    -

    The Django-wiki offers a lot of features associated with wikis, is +

    The Django-wiki offers a lot of features associated with +wikis, is actively maintained (at this time, anyway), and isn’t too difficult to install in Evennia. You can see a demonstration of Django-wiki here.

    @@ -75,14 +76,17 @@ one you use to run the

    Adding the wiki in the settings

    You will need to add a few settings to have the wiki app on your website. Open your -server/conf/settings.py file and add the following at the bottom (but before importing secret_settings). Here’s what you’ll find in my own setting file (add the whole Django-wiki section):

    +server/conf/settings.py file and add the following at the bottom (but before importing +secret_settings). Here’s what you’ll find in my own setting file (add the whole Django-wiki +section):

     1
      2
      3
    @@ -192,7 +196,7 @@ you will need to add two URLs in 
    from django.conf.urls import url, include
     from django.urls import path # NEW!
     
    -# default evenni	a patterns
    +# default evenni        a patterns
     from evennia.web.urls import urlpatterns
     
     # eventual custom patterns
    @@ -235,7 +239,8 @@ who can write, a specific article.

    These settings must be placed, as usual, in your server/conf/settings.py file. They take a function as argument, said function (or callback) will be called with the article and the user. Remember, a Django user, for us, is an account. So we could check lockstrings on them if needed. -Here is a default setting to restrict the wiki: only builders can write in it, but anyone (including non-logged in users) can read it. The superuser has some additional privileges.

    +Here is a default setting to restrict the wiki: only builders can write in it, but anyone (including +non-logged in users) can read it. The superuser has some additional privileges.

     1
      2
      3
    @@ -300,7 +305,9 @@ Here is a default setting to restrict the wiki: only builders can write in it, b
     

    Here, we have created three functions: one to return True if the user is the superuser, one to -return True if the user is a builder, one to return True no matter what (this includes if the user is anonymous, E.G. if it’s not logged-in). We then change settings to allow either the superuser or +return True if the user is a builder, one to return True no matter what (this includes if the +user is anonymous, E.G. if it’s not logged-in). We then change settings to allow either the +superuser or each builder to moderate, read, write, delete, and more. You can, of course, add more functions, adapting them to your need. This is just a demonstration.

    Providing the WIKI_CAN*... settings will bypass the original permission system. The superuser @@ -308,29 +315,40 @@ could change permissions of an article, but still, only builders would be able t need something more custom, you will have to expand on the functions you use.

    Managing wiki pages from Evennia

    -

    Unfortunately, Django wiki doesn’t provide a clear and clean entry point to read and write articles from Evennia and it doesn’t seem to be a very high priority. If you really need to keep Django wiki and to create and manage wiki pages from your code, you can do so, but this article won’t elaborate, as this is somewhat more technical.

    -

    However, it is a good opportunity to present a small project that has been created more recently: evennia-wiki has been created to provide a simple wiki, more tailored to Evennia and easier to connect. It doesn’t, as yet, provide as many options as does Django wiki, but it’s perfectly usable:

    +

    Unfortunately, Django wiki doesn’t provide a clear and clean entry point to read and write articles +from Evennia and it doesn’t seem to be a very high priority. If you really need to keep Django wiki +and to create and manage wiki pages from your code, you can do so, but this article won’t elaborate, +as this is somewhat more technical.

    +

    However, it is a good opportunity to present a small project that has been created more recently: +evennia-wiki has been created to provide a simple +wiki, more tailored to Evennia and easier to connect. It doesn’t, as yet, provide as many options +as does Django wiki, but it’s perfectly usable:

    • Pages have an inherent and much-easier to understand hierarchy based on URLs.

    • -
    • Article permissions are connected to Evennia groups and are much easier to accommodate specific requirements.

    • +
    • Article permissions are connected to Evennia groups and are much easier to accommodate specific +requirements.

    • Articles can easily be created, read or updated from the Evennia code itself.

    • -
    • Markdown is fully-supported with a default integration to Bootstrap to look good on an Evennia website. Tables and table of contents are supported as well as wiki links.

    • +
    • Markdown is fully-supported with a default integration to Bootstrap to look good on an Evennia +website. Tables and table of contents are supported as well as wiki links.

    • The process to override wiki templates makes full use of the template_overrides directory.

    However evennia-wiki doesn’t yet support:

      -
    • Images in markdown and the uploading schema. If images are important to you, please consider contributing to this new project.

    • +
    • Images in markdown and the uploading schema. If images are important to you, please consider +contributing to this new project.

    • Modifying permissions on a per page/setting basis.

    • Moving pages to new locations.

    • Viewing page history.

    -

    Considering the list of features in Django wiki, obviously other things could be added to the list. However, these features may be the most important and useful. Additional ones might not be that necessary. If you’re interested in supporting this little project, you are more than welcome to contribute to it. Thanks!

    +

    Considering the list of features in Django wiki, obviously other things could be added to the list. +However, these features may be the most important and useful. Additional ones might not be that +necessary. If you’re interested in supporting this little project, you are more than welcome to +contribute to it. Thanks!

    -
    @@ -377,7 +395,7 @@ need something more custom, you will have to expand on the functions you use.

    Versions @@ -393,13 +411,12 @@ need something more custom, you will have to expand on the functions you use.

    modules | - - + \ No newline at end of file diff --git a/docs/0.9.1/Adding-Command-Tutorial.html b/docs/0.9.5/Adding-Command-Tutorial.html similarity index 92% rename from docs/0.9.1/Adding-Command-Tutorial.html rename to docs/0.9.5/Adding-Command-Tutorial.html index 0806634691..91cfb28657 100644 --- a/docs/0.9.1/Adding-Command-Tutorial.html +++ b/docs/0.9.5/Adding-Command-Tutorial.html @@ -1,11 +1,10 @@ - + - - Adding Command Tutorial — Evennia 0.9.1 documentation + Adding Command Tutorial — Evennia 0.9.5 documentation @@ -26,8 +25,7 @@
  • modules |
  • - - + @@ -44,11 +42,15 @@ it just mygame

    Step 1: Creating a custom command

      -
    1. Open mygame/commands/command.py in a text editor. This is just one place commands could be placed but you get it setup from the onset as an easy place to start. It also already contains some example code.

    2. +
    3. Open mygame/commands/command.py in a text editor. This is just one place commands could be +placed but you get it setup from the onset as an easy place to start. It also already contains some +example code.

    4. Create a new class in command.py inheriting from default_cmds.MuxCommand. Let’s call it CmdEcho in this example.

    5. Set the class variable key to a good command name, like echo.

    6. -
    7. Give your class a useful docstring. A docstring is the string at the very top of a class or function/method. The docstring at the top of the command class is read by Evennia to become the help entry for the Command (see +

    8. Give your class a useful docstring. A docstring is the string at the very top of a class or +function/method. The docstring at the top of the command class is read by Evennia to become the help +entry for the Command (see Command Auto-help).

    9. Define a class method func(self) that echoes your input back to you.

    @@ -80,7 +82,7 @@ it just mygame""" Simple command example - Usage: + Usage: echo [text] This command simply echoes text back to the caller. @@ -89,9 +91,9 @@ it just mygamekey = "echo" def func(self): - "This actually does things" + "This actually does things" if not self.args: - self.caller.msg("You didn't enter anything!") + self.caller.msg("You didn't enter anything!") else: self.caller.msg("You gave the string: '%s'" % self.args) @@ -135,10 +137,10 @@ template tells you where).

    def at_cmdset_creation(self): # this first adds all default commands - super(DefaultSet, self).at_cmdset_creation() + super().at_cmdset_creation() - # all commands added after this point will extend or - # overwrite the default commands. + # all commands added after this point will extend or + # overwrite the default commands. self.add(CmdEcho())
    @@ -147,8 +149,10 @@ the game. Use help<

    If you have trouble, make sure to check the log for error messages (probably due to syntax errors in your command definition).

    -

    Note: Typing echotest will also work. It will be handled as the command echo directly followed by -its argument test (which will end up in self.args). To change this behavior, you can add the arg_regexproperty alongsidekey, help_category` etc. See the arg_regex documentation for more info.

    +

    Note: Typing echotest will also work. It will be handled as the command echo directly followed +by +its argument test (which will end up in self.args). To change this behavior, you can add the arg_regexproperty alongsidekey, help_category` etc. See the arg_regex +documentation for more info.

    If you want to overload existing default commands (such as look or get), just add your new command with the same key as the old one - it will then replace it. Just remember that you must use @@ -181,7 +185,7 @@ documentation).

    key = "MyCmdSet" - def at_cmdset_creation(self): + def at_cmdset_creation(self): self.add(CmdEcho())
    @@ -221,9 +225,10 @@ object is first created. This means that if you already have existing objects in using that typeclass, they will not have been initiated the same way. There are many ways to update them; since it’s a one-time update you can usually just simply loop through them. As superuser, try the following:

    -
     @py from typeclasses.objects import MyObject; [o.cmdset.add("mycmdset.MyCmdSet") for o in MyObject.objects.all()]
    +
     @py from typeclasses.objects import MyObject; [o.cmdset.add("mycmdset.MyCmdSet") for o in
     
    +

    MyObject.objects.all()]

    This goes through all objects in your database having the right typeclass, adding the new cmdset to each. The good news is that you only have to do this if you want to post-add cmdsets. If you just want to add a new command, you can simply add that command to the cmdset’s at_cmdset_creation @@ -242,7 +247,6 @@ default character cmdset defaults to being defined as

    -
    @@ -282,7 +286,7 @@ default character cmdset defaults to being defined as

    Versions

    @@ -298,13 +302,12 @@ default character cmdset defaults to being defined as

  • modules |
  • - - + \ No newline at end of file diff --git a/docs/0.9.1/Adding-Object-Typeclass-Tutorial.html b/docs/0.9.5/Adding-Object-Typeclass-Tutorial.html similarity index 96% rename from docs/0.9.1/Adding-Object-Typeclass-Tutorial.html rename to docs/0.9.5/Adding-Object-Typeclass-Tutorial.html index 1cd16d87dd..beae118c58 100644 --- a/docs/0.9.1/Adding-Object-Typeclass-Tutorial.html +++ b/docs/0.9.5/Adding-Object-Typeclass-Tutorial.html @@ -1,11 +1,10 @@ - + - - Adding Object Typeclass Tutorial — Evennia 0.9.1 documentation + Adding Object Typeclass Tutorial — Evennia 0.9.5 documentation @@ -26,8 +25,7 @@
  • modules |
  • - - + @@ -40,7 +38,7 @@

    Adding Object Typeclass Tutorial

    Evennia comes with a few very basic classes of in-game entities:

    DefaultObject
    -   |           
    +   |
        DefaultCharacter
        DefaultRoom
        DefaultExit
    @@ -159,7 +157,6 @@ objects you can use 
     
     
    -            
    @@ -199,7 +196,7 @@ objects you can use Versions @@ -215,13 +212,12 @@ objects you can use modules | - - + \ No newline at end of file diff --git a/docs/0.9.1/Administrative-Docs.html b/docs/0.9.5/Administrative-Docs.html similarity index 92% rename from docs/0.9.1/Administrative-Docs.html rename to docs/0.9.5/Administrative-Docs.html index d254506b82..c67a5dbd46 100644 --- a/docs/0.9.1/Administrative-Docs.html +++ b/docs/0.9.5/Administrative-Docs.html @@ -1,11 +1,10 @@ - + - - Administrative Docs — Evennia 0.9.1 documentation + Administrative Docs — Evennia 0.9.5 documentation @@ -26,8 +25,7 @@
  • modules |
  • - - + @@ -38,7 +36,8 @@

    Administrative Docs

    -

    The following pages are aimed at game administrators – the higher-ups that possess shell access and are responsible for managing the game.

    +

    The following pages are aimed at game administrators – the higher-ups that possess shell access and +are responsible for managing the game.

    Installation and Early Life

    -
  • Listing your game at the online Evennia game index

  • +
  • Listing your game at the online Evennia game +index

  • @@ -62,7 +62,8 @@
    -
    @@ -139,7 +139,7 @@

    Versions

    @@ -155,13 +155,12 @@
  • modules |
  • - - + \ No newline at end of file diff --git a/docs/0.9.1/Apache-Config.html b/docs/0.9.5/Apache-Config.html similarity index 93% rename from docs/0.9.1/Apache-Config.html rename to docs/0.9.5/Apache-Config.html index c241350f93..471e8e063f 100644 --- a/docs/0.9.1/Apache-Config.html +++ b/docs/0.9.5/Apache-Config.html @@ -1,11 +1,10 @@ - + - - Apache Config — Evennia 0.9.1 documentation + Apache Config — Evennia 0.9.5 documentation @@ -26,8 +25,7 @@
  • modules |
  • - - + @@ -54,14 +52,16 @@ you would like covered, please let us know.

    Install mod_wsgi

      -
    • Fedora/RHEL - Apache HTTP Server and mod_wsgi are available in the standard package repositories for Fedora and RHEL:

      +
    • Fedora/RHEL - Apache HTTP Server and mod_wsgi are available in the standard package +repositories for Fedora and RHEL:

      $ dnf install httpd mod_wsgi
       or
       $ yum install httpd mod_wsgi
       
    • -
    • Ubuntu/Debian - Apache HTTP Server and mod_wsgi are available in the standard package repositories for Ubuntu and Debian:

      +
    • Ubuntu/Debian - Apache HTTP Server and mod_wsgi are available in the standard package +repositories for Ubuntu and Debian:

      $ apt-get update
       $ apt-get install apache2 libapache2-mod-wsgi
       
      @@ -106,7 +106,8 @@ Ubuntu), you may tell evennia/game/web/utils/apache_wsgi.conf. When mod_wsgi sees that the file modification time has changed, it will force a code reload. Any modifications to the code will not be propagated to the live instance of your site until reloaded.

      -

      If you are not running in daemon mode or want to force the issue, simply restart or reload apache2 to apply your changes.

      +

      If you are not running in daemon mode or want to force the issue, simply restart or reload apache2 +to apply your changes.

      Further notes and hints:

      @@ -127,22 +128,26 @@ Not confirmed, but worth trying if there are trouble.

      mod_proxy and mod_ssl setup

      Below are steps on running Evennia using a front-end proxy (Apache HTTP), mod_proxy_http, -mod_proxy_wstunnel, and mod_ssl. mod_proxy_http and mod_proxy_wstunnel will simply be referred to as +mod_proxy_wstunnel, and mod_ssl. mod_proxy_http and mod_proxy_wstunnel will simply be +referred to as mod_proxy below.

      Install mod_ssl

        -
      • Fedora/RHEL - Apache HTTP Server and mod_ssl are available in the standard package repositories for Fedora and RHEL:

        +
      • Fedora/RHEL - Apache HTTP Server and mod_ssl are available in the standard package +repositories for Fedora and RHEL:

        $ dnf install httpd mod_ssl
         or
         $ yum install httpd mod_ssl
         
      • -
      • Ubuntu/Debian - Apache HTTP Server and mod_ssljkl are installed together in the apache2 package and available in the -standard package repositories for Ubuntu and Debian. mod_ssl needs to be enabled after installation:

        +
      • Ubuntu/Debian - Apache HTTP Server and mod_ssljkl are installed together in the apache2 +package and available in the +standard package repositories for Ubuntu and Debian. mod_ssl needs to be enabled after +installation:

        $ apt-get update
        -$ apt-get install apache2 
        +$ apt-get install apache2
         $ a2enmod ssl
         
        @@ -206,7 +211,6 @@ port but this should be applicable also to other types of proxies (like nginx).<
      -
    @@ -260,7 +264,7 @@ port but this should be applicable also to other types of proxies (like nginx).<

    Versions

    @@ -276,13 +280,12 @@ port but this should be applicable also to other types of proxies (like nginx).<
  • modules |
  • - - + \ No newline at end of file diff --git a/docs/0.9.1/Arxcode-installing-help.html b/docs/0.9.5/Arxcode-installing-help.html similarity index 94% rename from docs/0.9.1/Arxcode-installing-help.html rename to docs/0.9.5/Arxcode-installing-help.html index 614efd6be4..1eef659286 100644 --- a/docs/0.9.1/Arxcode-installing-help.html +++ b/docs/0.9.5/Arxcode-installing-help.html @@ -1,11 +1,10 @@ - + - - Arxcode installing help — Evennia 0.9.1 documentation + Arxcode installing help — Evennia 0.9.5 documentation @@ -26,8 +25,7 @@
  • modules |
  • - - + @@ -57,8 +55,11 @@ better match with the vanilla Evennia install.

    Installing Evennia

    Firstly, set aside a folder/directory on your drive for everything to follow.

    -

    You need to start by installing Evennia by following most of the Getting Started -Instructions for your OS. The difference is that you need to git clone https://github.com/TehomCD/evennia.git instead of Evennia’s repo because Arx uses TehomCD’s older Evennia 0.8 fork, notably still using Python2. This detail is important if referring to newer Evennia documentation.

    +

    You need to start by installing Evennia by following most of the Getting +Started +Instructions for your OS. The difference is that you need to git clone https://github.com/TehomCD/evennia.git instead of Evennia’s repo because Arx uses TehomCD’s older +Evennia 0.8 fork, notably still using Python2. This detail is +important if referring to newer Evennia documentation.

    If you are new to Evennia it’s highly recommended that you run through the instructions in full - including initializing and starting a new empty game and connecting to it. That way you can be sure Evennia works correctly as a base line. If you have trouble, make sure to @@ -66,7 +67,8 @@ read the forums, join #evennia on irc.freenode.net or chat from the linked Discord Server.

    -

    After installing you should have a virtualenv running and you should have the following file structure in your set-aside folder:

    +

    After installing you should have a virtualenv running and you should have the following file +structure in your set-aside folder:

    vienv/
     evennia/
     mygame/
    @@ -82,12 +84,13 @@ to compare to.

    Clone the arxcode repo

    Cd to the root of your directory and clone the released source code from github:

    -
    git clone https://github.com/Arx-Game/arxcode.git myarx 
    +
    git clone https://github.com/Arx-Game/arxcode.git myarx
     

    A new folder myarx should appear next to the ones you already had. You could rename this to something else if you want.

    -

    Cd into myarx. If you wonder about the structure of the game dir, you can read more about it here.

    +

    Cd into myarx. If you wonder about the structure of the game dir, you can read more about it +here.

    Clean up settings

    @@ -111,7 +114,8 @@ way but remove the secret-handling and replace it with the normal Evennia method

    Note: Indents and capitalization matter in Python. Make indents 4 spaces (not tabs) for your own -sanity. If you want a starter on Python in Evennia, you can look here.

    +sanity. If you want a starter on Python in Evennia, [you can look here](Python-basic- +introduction).

    This will import Arx’ base settings and override them with the Evennia-default telnet port and give the game a name. The slogan changes the sub-text shown under the name of your game in the website @@ -192,7 +196,8 @@ up an Admin Group in Django).

    account. Move to where you want the new staffer character to appear.

  • In the game client, run @create/drop <staffername>:typeclasses.characters.Character, where <staffername> is usually the same name you used for the Staffer account you created in the -Admin earlier (if you are creating a Character for your superuser, use your superuser account name). +Admin earlier (if you are creating a Character for your superuser, use your superuser account +name). This creates a new in-game Character and places it in your current location.

  • Have the new Admin player log into the game.

  • Have the new Admin puppet the character with @ic StafferName.

  • @@ -216,7 +221,9 @@ AssetOwner holds information about a character or organization’s money and res

    Alternate guide by Pax for installing on Windows

    -

    If for some reason you cannot use the Windows Subsystem for Linux (which would use instructions identical to the ones above), it’s possible to get Evennia running under Anaconda for Windows. The process is a little bit trickier.

    +

    If for some reason you cannot use the Windows Subsystem for Linux (which would use instructions +identical to the ones above), it’s possible to get Evennia running under Anaconda for Windows. The +process is a little bit trickier.

    Make sure you have:

    • Git for Windows https://git-scm.com/download/win

    • @@ -266,7 +273,6 @@ on localhost at port 4000, and the webserver at http://localhost:4001/

    -
    @@ -314,7 +320,7 @@ on localhost at port 4000, and the webserver at http://localhost:4001/

    Versions

    @@ -330,13 +336,12 @@ on localhost at port 4000, and the webserver at http://localhost:4001/

  • modules |
  • - - + \ No newline at end of file diff --git a/docs/0.9.1/Async-Process.html b/docs/0.9.5/Async-Process.html similarity index 95% rename from docs/0.9.1/Async-Process.html rename to docs/0.9.5/Async-Process.html index 1198d5a1d6..4e3ac635f4 100644 --- a/docs/0.9.1/Async-Process.html +++ b/docs/0.9.5/Async-Process.html @@ -1,11 +1,10 @@ - + - - Async Process — Evennia 0.9.1 documentation + Async Process — Evennia 0.9.5 documentation @@ -26,8 +25,7 @@
  • modules |
  • - - + @@ -104,7 +102,8 @@ above) finishes successfully. The argument at_return_kwargs - an optional dictionary that will be fed as keyword arguments to the at_return callback.

    +
  • at_return_kwargs - an optional dictionary that will be fed as keyword arguments to the +at_return callback.

  • at_err(e) (the errback) is called if the asynchronous function fails and raises an exception. This exception is passed to the errback wrapped in a Failure object e. If you do not supply an errback of your own, Evennia will automatically add one that silently writes errors to the evennia @@ -139,15 +138,16 @@ errback.

  • 17 18 19 -20
        from evennia import utils, Command
    +20
    +21
        from evennia import utils, Command
     
         class CmdAsync(Command):
     
            key = "asynccommand"
         
    -       def func(self):     
    +       def func(self):
                
    -           def long_running_function():  
    +           def long_running_function():
                    #[... lots of time-consuming code  ...]
                    return final_value
                
    @@ -158,11 +158,13 @@ errback.

    self.caller.msg("There was an error: %s" % e) # do the async call, setting all callbacks - utils.run_async(long_running_function, at_return=at_return_function, at_err=at_err_function) + utils.run_async(long_running_function, at_return=at_return_function, +at_err=at_err_function)

    That’s it - from here on we can forget about long_running_function and go on with what else need -to be done. Whenever it finishes, the at_return_function function will be called and the final value will +to be done. Whenever it finishes, the at_return_function function will be called and the final +value will pop up for us to see. If not we will see an error message.

    @@ -196,7 +198,8 @@ the

    The @interactive decorator

    -

    As of Evennia 0.9, the @interactive decorator +

    As of Evennia 0.9, the @interactive [decorator](https://realpython.com/primer-on-python- +decorators/) is available. This makes any function or method possible to ‘pause’ and/or await player input in an interactive way.

     1
    @@ -222,10 +225,10 @@ in an interactive way.

    yield(5) caller.msg("Now 5 seconds have passed.") - response = yield("Do you want to wait another 5 secs?") + response = yield("Do you want to wait another 5 secs?") if response.lower() not in ("yes", "y"): - break + break

    The @interactive decorator gives the function the ability to pause. The use @@ -261,7 +264,7 @@ conveniently available from @interactive def myfunc(): - # ... + # ... result = 10 # this must be used instead of `return result` @@ -284,7 +287,8 @@ expected, but they may appear with delays or in groups.

    Further reading

    Technically, run_async is just a very thin and simplified wrapper around a -Twisted Deferred object; the wrapper sets +Twisted Deferred object; the +wrapper sets up a default errback also if none is supplied. If you know what you are doing there is nothing stopping you from bypassing the utility function, building a more sophisticated callback chain after your own liking.

    @@ -292,7 +296,6 @@ your own liking.

    -
    @@ -334,7 +337,7 @@ your own liking.

    Versions

    @@ -350,13 +353,12 @@ your own liking.

  • modules |
  • - - + \ No newline at end of file diff --git a/docs/0.9.1/Attributes.html b/docs/0.9.5/Attributes.html similarity index 96% rename from docs/0.9.1/Attributes.html rename to docs/0.9.5/Attributes.html index f66467378d..a375234e32 100644 --- a/docs/0.9.1/Attributes.html +++ b/docs/0.9.5/Attributes.html @@ -1,11 +1,10 @@ - + - - Attributes — Evennia 0.9.1 documentation + Attributes — Evennia 0.9.5 documentation @@ -26,8 +25,7 @@
  • modules |
  • - - + @@ -50,7 +48,8 @@ data in properties already defined on entities (such as key property no matter how hard you tried). Attributes come into play when you want to assign arbitrary data to arbitrary names.

    -

    Attributes are not secure by default and any player may be able to change them unless you prevent this behavior.

    +

    Attributes are not secure by default and any player may be able to change them unless you +prevent this behavior.

    The .db and .ndb shortcuts

    To save persistent data on a Typeclassed object you normally use the db (DataBase) operator. Let’s @@ -85,7 +84,8 @@ use ndbndb (as well as db) will also be easily listed by example the @examine command.

    -

    You can also del properties on db and ndb as normal. This will for example delete an Attribute:

    +

    You can also del properties on db and ndb as normal. This will for example delete an +Attribute:

    1
        del rose.db.has_thorns
     
    @@ -149,12 +149,15 @@ access and editing. The attrname.

  • value - this is the value of the Attribute. This value can be anything which can be pickled - objects, lists, numbers or what have you (see -this section for more info). In the example +this section for more info). In the +example obj.db.attrname = value, the value is stored here.

  • category - this is an optional property that is set to None for most Attributes. Setting this allows to use Attributes for different functionality. This is usually not needed unless you want -to use Attributes for very different functionality (Nicks is an example of using Attributes -in this way). To modify this property you need to use the Attribute Handler.

  • +to use Attributes for very different functionality (Nicks is an example of using +Attributes +in this way). To modify this property you need to use the Attribute +Handler.

  • strvalue - this is a separate value field that only accepts strings. This severely limits the data possible to store, but allows for easier database lookups. This property is usually not used except when re-using Attributes for some other purpose (Nicks use it). It is only @@ -183,13 +186,15 @@ useful in a few situations though.

    this is not an issue unless you are reading and writing to your Attribute very often (like many times per second). Reading from an already cached Attribute is as fast as reading any Python property. But even then this is not likely something to worry about: Apart from Evennia’s own -caching, modern database systems themselves also cache data very efficiently for speed. Our default +caching, modern database systems themselves also cache data very efficiently for speed. Our +default database even runs completely in RAM if possible, alleviating much of the need to write to disk during heavy loads.

  • A more valid reason for using non-persistent data is if you want to lose your state when logging off. Maybe you are storing throw-away data that are re-initialized at server startup. Maybe you are implementing some caching of your own. Or maybe you are testing a buggy Script that -does potentially harmful stuff to your character object. With non-persistent storage you can be sure +does potentially harmful stuff to your character object. With non-persistent storage you can be +sure that whatever is messed up, it’s nothing a server reboot can’t clear up.

  • NAttributes have no restrictions at all on what they can store (see next section), since they don’t need to worry about being saved to the database - they work very well for temporary storage.

  • @@ -218,10 +223,12 @@ not a big deal. But if you are accessing the Attribute as part of some big loop amount of reads/writes you should first extract it to a temporary variable, operate on that and then save the result back to the Attribute. If you are storing a more complex structure like a dict or a list you should make sure to “disconnect” it from the database before looping over it, -as mentioned in the Retrieving Mutable Objects section below.

    +as mentioned in the Retrieving Mutable Objects section +below.

    Storing single objects

    -

    With a single object, we mean anything that is not iterable, like numbers, strings or custom class instances without the __iter__ method.

    +

    With a single object, we mean anything that is not iterable, like numbers, strings or custom class +instances without the __iter__ method.

    • You can generally store any non-iterable Python entity that can be pickled.

    • @@ -270,14 +277,18 @@ entities you can loop over in a for-loop. Attribute-saving supports the followin
    • Lists, like [1,2,"test", <dbobj>].

    • Dicts, like {1:2, "test":<dbobj>].

    • Sets, like {1,2,"test",<dbobj>}.

    • -
    • collections.OrderedDict, like OrderedDict((1,2), ("test", <dbobj>)).

    • -
    • collections.Deque, like deque((1,2,"test",<dbobj>)).

    • -
    • Nestings of any combinations of the above, like lists in dicts or an OrderedDict of tuples, each containing dicts, etc.

    • +
    • [collections.OrderedDict](https://docs.python.org/2/library/collections.html#collections.OrderedDi +ct), like OrderedDict((1,2), ("test", <dbobj>)).

    • +
    • collections.Deque, like +deque((1,2,"test",<dbobj>)).

    • +
    • Nestings of any combinations of the above, like lists in dicts or an OrderedDict of tuples, each +containing dicts, etc.

    • All other iterables (i.e. entities with the __iter__ method) will be converted to a list. Since you can use any combination of the above iterables, this is generally not much of a limitation.

    -

    Any entity listed in the Single object section above can be stored in the iterable.

    +

    Any entity listed in the Single object section above can be +stored in the iterable.

    As mentioned in the previous section, database entities (aka typeclasses) are not possible to pickle. So when storing an iterable, Evennia must recursively traverse the iterable and all its @@ -402,7 +413,8 @@ way.

    Locking and checking Attributes

    Attributes are normally not locked down by default, but you can easily change that for individual Attributes (like those that may be game-sensitive in games with user-level building).

    -

    First you need to set a lock string on your Attribute. Lock strings are specified Locks. The relevant lock types are

    +

    First you need to set a lock string on your Attribute. Lock strings are specified Locks. +The relevant lock types are

    • attrread - limits who may read the value of the Attribute

    • attredit - limits who may set/change this Attribute

    • @@ -449,7 +461,6 @@ those will check for the -
    @@ -496,7 +507,7 @@ those will check for the Versions @@ -512,13 +523,12 @@ those will check for the modules | - - + \ No newline at end of file diff --git a/docs/0.9.1/Banning.html b/docs/0.9.5/Banning.html similarity index 77% rename from docs/0.9.1/Banning.html rename to docs/0.9.5/Banning.html index d24b1920b7..f8a54629e4 100644 --- a/docs/0.9.1/Banning.html +++ b/docs/0.9.5/Banning.html @@ -1,11 +1,10 @@ - + - - Banning — Evennia 0.9.1 documentation + Banning — Evennia 0.9.5 documentation @@ -26,8 +25,7 @@
  • modules |
  • - - + @@ -43,7 +41,8 @@ no other recourse but to kick out a particularly troublesome player. The default admin tools to handle this, primarily @ban, @unban, and @boot.

    Creating a ban

    -

    Say we have a troublesome player “YouSuck” - this is a person that refuses common courtesy - an abusive +

    Say we have a troublesome player “YouSuck” - this is a person that refuses common courtesy - an +abusive and spammy account that is clearly created by some bored internet hooligan only to cause grief. You have tried to be nice. Now you just want this troll gone.

    @@ -52,52 +51,70 @@ have tried to be nice. Now you just want this troll gone.

     @ban YouSuck
     
    -

    This will lock the name YouSuck (as well as ‘yousuck’ and any other capitalization combination), and next time they try to log in with this name the server will not let them!

    -

    You can also give a reason so you remember later why this was a good thing (the banned account will never see this)

    +

    This will lock the name YouSuck (as well as ‘yousuck’ and any other capitalization combination), and +next time they try to log in with this name the server will not let them!

    +

    You can also give a reason so you remember later why this was a good thing (the banned account will +never see this)

     @ban YouSuck:This is just a troll.
     
    -

    If you are sure this is just a spam account, you might even consider deleting the player account outright:

    +

    If you are sure this is just a spam account, you might even consider deleting the player account +outright:

     @delaccount YouSuck
     
    -

    Generally, banning the name is the easier and safer way to stop the use of an account – if you change your mind you can always remove the block later whereas a deletion is permanent.

    +

    Generally, banning the name is the easier and safer way to stop the use of an account – if you +change your mind you can always remove the block later whereas a deletion is permanent.

    IP ban

    -

    Just because you block YouSuck’s name might not mean the trolling human behind that account gives up. They can just create a new account YouSuckMore and be back at it. One way to make things harder for them is to tell the server to not allow connections from their particular IP address.

    -

    First, when the offending account is online, check which IP address they use. This you can do with the who command, which will show you something like this:

    -
     Account Name     On for     Idle     Room     Cmds     Host          
    - YouSuckMore      01:12      2m       22       212      237.333.0.223 
    +

    Just because you block YouSuck’s name might not mean the trolling human behind that account gives +up. They can just create a new account YouSuckMore and be back at it. One way to make things harder +for them is to tell the server to not allow connections from their particular IP address.

    +

    First, when the offending account is online, check which IP address they use. This you can do with +the who command, which will show you something like this:

    +
     Account Name     On for     Idle     Room     Cmds     Host
    + YouSuckMore      01:12      2m       22       212      237.333.0.223
     
    -

    The “Host” bit is the IP address from which the account is connecting. Use this to define the ban instead of the name:

    +

    The “Host” bit is the IP address from which the account is connecting. Use this to define the ban +instead of the name:

     @ban 237.333.0.223
     
    -

    This will stop YouSuckMore connecting from their computer. Note however that IP address might change easily - either due to how the player’s Internet Service Provider operates or by the user simply changing computers. You can make a more general ban by putting asterisks * as wildcards for the groups of three digits in the address. So if you figure out that !YouSuckMore mainly connects from 237.333.0.223, 237.333.0.225, and 237.333.0.256 (only changes in their subnet), it might be an idea to put down a ban like this to include any number in that subnet:

    +

    This will stop YouSuckMore connecting from their computer. Note however that IP address might change +easily - either due to how the player’s Internet Service Provider operates or by the user simply +changing computers. You can make a more general ban by putting asterisks * as wildcards for the +groups of three digits in the address. So if you figure out that !YouSuckMore mainly connects from +237.333.0.223, 237.333.0.225, and 237.333.0.256 (only changes in their subnet), it might be an idea +to put down a ban like this to include any number in that subnet:

     @ban 237.333.0.*
     
    -

    You should combine the IP ban with a name-ban too of course, so the account YouSuckMore is truly locked regardless of where they connect from.

    -

    Be careful with too general IP bans however (more asterisks above). If you are unlucky you could be blocking out innocent players who just happen to connect from the same subnet as the offender.

    +

    You should combine the IP ban with a name-ban too of course, so the account YouSuckMore is truly +locked regardless of where they connect from.

    +

    Be careful with too general IP bans however (more asterisks above). If you are unlucky you could be +blocking out innocent players who just happen to connect from the same subnet as the offender.

    Booting

    -

    YouSuck is not really noticing all this banning yet though - and won’t until having logged out and trying to log back in again. Let’s help the troll along.

    +

    YouSuck is not really noticing all this banning yet though - and won’t until having logged out and +trying to log back in again. Let’s help the troll along.

     @boot YouSuck
     
    -

    Good riddance. You can give a reason for booting too (to be echoed to the player before getting kicked out).

    +

    Good riddance. You can give a reason for booting too (to be echoed to the player before getting +kicked out).

     @boot YouSuck:Go troll somewhere else.
     

    Lifting a ban

    -

    Use the @unban (or @ban) command without any arguments and you will see a list of all currently active bans:

    +

    Use the @unban (or @ban) command without any arguments and you will see a list of all currently +active bans:

    Active bans
    -id   name/ip       date                      reason 
    +id   name/ip       date                      reason
     1    yousuck       Fri Jan 3 23:00:22 2020   This is just a Troll.
     2    237.333.0.*   Fri Jan 3 23:01:03 2020   YouSuck's IP.
     
    @@ -114,8 +131,11 @@ have tried to be nice. Now you just want this troll gone.

    Summary of abuse-handling tools

    Below are other useful commands for dealing with annoying players.

      -
    • who – (as admin) Find the IP of a account. Note that one account can be connected to from multiple IPs depending on what you allow in your settings.

    • -
    • examine/account thomas – Get all details about an account. You can also use *thomas to get the account. If not given, you will get the Object thomas if it exists in the same location, which is not what you want in this case.

    • +
    • who – (as admin) Find the IP of a account. Note that one account can be connected to from +multiple IPs depending on what you allow in your settings.

    • +
    • examine/account thomas – Get all details about an account. You can also use *thomas to get +the account. If not given, you will get the Object thomas if it exists in the same location, which +is not what you want in this case.

    • boot thomas – Boot all sessions of the given account name.

    • boot 23 – Boot one specific client session/IP by its unique id.

    • ban – List all bans (listed with ids)

    • @@ -125,31 +145,41 @@ have tried to be nice. Now you just want this troll gone.

    • ban/ip 134.233.*.* – Even wider IP ban

    • unban 34 – Remove ban with id #34

    • cboot mychannel = thomas – Boot a subscriber from a channel you control

    • -
    • clock mychannel = control:perm(Admin);listen:all();send:all() – Fine control of access to your channel using lock definitions.

    • +
    • clock mychannel = control:perm(Admin);listen:all();send:all() – Fine control of access to +your channel using lock definitions.

    Locking a specific command (like page) is accomplished like so:

      -
    1. Examine the source of the command. The default page command class has the lock string “cmd:not pperm(page_banned)”. This means that unless the player has the ‘permission’ “page_banned” they can use this command. You can assign any lock string to allow finer customization in your commands. You might look for the value of an Attribute or Tag, your current location etc.

    2. -
    3. perm/account thomas = page_banned – Give the account the ‘permission’ which causes (in this case) the lock to fail.

    4. +
    5. Examine the source of the command. The default page command class has the lock +string “cmd:not pperm(page_banned)”. This means that unless the player has the ‘permission’ +“page_banned” they can use this command. You can assign any lock string to allow finer customization +in your commands. You might look for the value of an Attribute or Tag, your +current location etc.

    6. +
    7. perm/account thomas = page_banned – Give the account the ‘permission’ which causes (in this +case) the lock to fail.

    • perm/del/account thomas = page_banned – Remove the given permission

    • tel thomas = jail – Teleport a player to a specified location or #dbref

    • -
    • type thomas = FlowerPot – Turn an annoying player into a flower pot (assuming you have a FlowerPot typeclass ready)

    • +
    • type thomas = FlowerPot – Turn an annoying player into a flower pot (assuming you have a +FlowerPot typeclass ready)

    • userpassword thomas = fooBarFoo – Change a user’s password

    • delaccount thomas – Delete a player account (not recommended, use ban instead)

    • -
    • server – Show server statistics, such as CPU load, memory usage, and how many objects are cached

    • +
    • server – Show server statistics, such as CPU load, memory usage, and how many objects are +cached

    • time – Gives server uptime, runtime, etc

    • reload – Reloads the server without disconnecting anyone

    • reset – Restarts the server, kicking all connections

    • shutdown – Stops the server cold without it auto-starting again

    • -
    • py – Executes raw Python code, allows for direct inspection of the database and account objects on the fly. For advanced users.

    • +
    • py – Executes raw Python code, allows for direct inspection of the database and account +objects on the fly. For advanced users.

    +

    Useful Tip: evennia changepassword <username> entered into the command prompt will reset the +password of any account, including the superuser or admin accounts. This is a feature of Django.

    -
    @@ -195,7 +225,7 @@ have tried to be nice. Now you just want this troll gone.

    Versions

    @@ -211,13 +241,12 @@ have tried to be nice. Now you just want this troll gone.

  • modules |
  • - - + \ No newline at end of file diff --git a/docs/0.9.1/Batch-Code-Processor.html b/docs/0.9.5/Batch-Code-Processor.html similarity index 65% rename from docs/0.9.1/Batch-Code-Processor.html rename to docs/0.9.5/Batch-Code-Processor.html index 0ab1c37a9a..be1c8cf959 100644 --- a/docs/0.9.1/Batch-Code-Processor.html +++ b/docs/0.9.5/Batch-Code-Processor.html @@ -1,11 +1,10 @@ - + - - Batch Code Processor — Evennia 0.9.1 documentation + Batch Code Processor — Evennia 0.9.5 documentation @@ -26,8 +25,7 @@
  • modules |
  • - - + @@ -38,34 +36,59 @@

    Batch Code Processor

    -

    For an introduction and motivation to using batch processors, see here. This page describes the Batch-code processor. The Batch-command one is covered here.

    +

    For an introduction and motivation to using batch processors, see here. This +page describes the Batch-code processor. The Batch-command one is covered [here](Batch-Command- +Processor).

    Basic Usage

    The batch-code processor is a superuser-only function, invoked by

     > @batchcode path.to.batchcodefile
     
    -

    Where path.to.batchcodefile is the path to a batch-code file. Such a file should have a name ending in “.py” (but you shouldn’t include that in the path). The path is given like a python path relative to a folder you define to hold your batch files, set by BATCH_IMPORT_PATH in your settings. Default folder is (assuming your game is called “mygame”) mygame/world/. So if you want to run the example batch file in mygame/world/batch_code.py, you could simply use

    +

    Where path.to.batchcodefile is the path to a batch-code file. Such a file should have a name +ending in “.py” (but you shouldn’t include that in the path). The path is given like a python path +relative to a folder you define to hold your batch files, set by BATCH_IMPORT_PATH in your +settings. Default folder is (assuming your game is called “mygame”) mygame/world/. So if you want +to run the example batch file in mygame/world/batch_code.py, you could simply use

     > @batchcode batch_code
     
    -

    This will try to run through the entire batch file in one go. For more gradual, interactive control you can use the /interactive switch. The switch /debug will put the processor in debug mode. Read below for more info.

    +

    This will try to run through the entire batch file in one go. For more gradual, interactive +control you can use the /interactive switch. The switch /debug will put the processor in +debug mode. Read below for more info.

    The batch file

    -

    A batch-code file is a normal Python file. The difference is that since the batch processor loads and executes the file rather than importing it, you can reliably update the file, then call it again, over and over and see your changes without needing to @reload the server. This makes for easy testing. In the batch-code file you have also access to the following global variables:

    +

    A batch-code file is a normal Python file. The difference is that since the batch processor loads +and executes the file rather than importing it, you can reliably update the file, then call it +again, over and over and see your changes without needing to @reload the server. This makes for +easy testing. In the batch-code file you have also access to the following global variables:

    • caller - This is a reference to the object running the batchprocessor.

    • -
    • DEBUG - This is a boolean that lets you determine if this file is currently being run in debug-mode or not. See below how this can be useful.

    • +
    • DEBUG - This is a boolean that lets you determine if this file is currently being run in debug- +mode or not. See below how this can be useful.

    -

    Running a plain Python file through the processor will just execute the file from beginning to end. If you want to get more control over the execution you can use the processor’s interactive mode. This runs certain code blocks on their own, rerunning only that part until you are happy with it. In order to do this you need to add special markers to your file to divide it up into smaller chunks. These take the form of comments, so the file remains valid Python.

    +

    Running a plain Python file through the processor will just execute the file from beginning to end. +If you want to get more control over the execution you can use the processor’s interactive mode. +This runs certain code blocks on their own, rerunning only that part until you are happy with it. In +order to do this you need to add special markers to your file to divide it up into smaller chunks. +These take the form of comments, so the file remains valid Python.

    Here are the rules of syntax of the batch-code *.py file.

      -
    • #CODE as the first on a line marks the start of a code block. It will last until the beginning of another marker or the end of the file. Code blocks contain functional python code. Each #CODE block will be run in complete isolation from other parts of the file, so make sure it’s self-contained.

    • -
    • #HEADER as the first on a line marks the start of a header block. It lasts until the next marker or the end of the file. This is intended to hold imports and variables you will need for all other blocks .All python code defined in a header block will always be inserted at the top of every #CODE blocks in the file. You may have more than one #HEADER block, but that is equivalent to having one big one. Note that you can’t exchange data between code blocks, so editing a header-variable in one code block won’t affect that variable in any other code block!

    • +
    • #CODE as the first on a line marks the start of a code block. It will last until the beginning +of another marker or the end of the file. Code blocks contain functional python code. Each #CODE +block will be run in complete isolation from other parts of the file, so make sure it’s self- +contained.

    • +
    • #HEADER as the first on a line marks the start of a header block. It lasts until the next +marker or the end of the file. This is intended to hold imports and variables you will need for all +other blocks .All python code defined in a header block will always be inserted at the top of every +#CODE blocks in the file. You may have more than one #HEADER block, but that is equivalent to +having one big one. Note that you can’t exchange data between code blocks, so editing a header- +variable in one code block won’t affect that variable in any other code block!

    • #INSERT path.to.file will insert another batchcode (Python) file at that position.

    • A # that is not starting a #HEADER, #CODE or #INSERT instruction is considered a comment.

    • -
    • Inside a block, normal Python syntax rules apply. For the sake of indentation, each block acts as a separate python module.

    • +
    • Inside a block, normal Python syntax rules apply. For the sake of indentation, each block acts as +a separate python module.

    Below is a version of the example file found in evennia/contrib/tutorial_examples/.

     1
    @@ -106,7 +129,7 @@
     36
     37
     38
        #
    -    # This is an example batch-code build file for Evennia. 
    +    # This is an example batch-code build file for Evennia.
         #
         
         #HEADER
    @@ -120,9 +143,9 @@
         limbo = search_object('Limbo')[0]
         
         
    -    #CODE 
    +    #CODE
      
    -    red_button = create_object(red_button.RedButton, key="Red button", 
    +    red_button = create_object(red_button.RedButton, key="Red button",
                                    location=limbo, aliases=["button"])
         
         # caller points to the one running the script
    @@ -141,7 +164,7 @@
             table.delete()
             chair.delete()
             string += " Since debug was active, " \
    -             "they were deleted again." 
    +             "they were deleted again."
         caller.msg(string % (table, chair))
     
    @@ -153,21 +176,33 @@
     > @batchcode/debug tutorial_examples.example_batch_code
     
    -

    The batch script will run to the end and tell you it completed. You will also get messages that the button and the two pieces of furniture were created. Look around and you should see the button there. But you won’t see any chair nor a table! This is because we ran this with the /debug switch, which is directly visible as DEBUG==True inside the script. In the above example we handled this state by deleting the chair and table again.

    -

    The debug mode is intended to be used when you test out a batchscript. Maybe you are looking for bugs in your code or try to see if things behave as they should. Running the script over and over would then create an ever-growing stack of chairs and tables, all with the same name. You would have to go back and painstakingly delete them later.

    +

    The batch script will run to the end and tell you it completed. You will also get messages that the +button and the two pieces of furniture were created. Look around and you should see the button +there. But you won’t see any chair nor a table! This is because we ran this with the /debug +switch, which is directly visible as DEBUG==True inside the script. In the above example we +handled this state by deleting the chair and table again.

    +

    The debug mode is intended to be used when you test out a batchscript. Maybe you are looking for +bugs in your code or try to see if things behave as they should. Running the script over and over +would then create an ever-growing stack of chairs and tables, all with the same name. You would have +to go back and painstakingly delete them later.

    Interactive mode

    -

    Interactive mode works very similar to the batch-command processor counterpart. It allows you more step-wise control over how the batch file is executed. This is useful for debugging or for picking and choosing only particular blocks to run. Use @batchcode with the /interactive flag to enter interactive mode.

    -
     > @batchcode/interactive tutorial_examples.batch_code
    +

    Interactive mode works very similar to the [batch-command processor counterpart](Batch-Command- +Processor). It allows you more step-wise control over how the batch file is executed. This is useful +for debugging or for picking and choosing only particular blocks to run. Use @batchcode with the +/interactive flag to enter interactive mode.

    +
     > @batchcode/interactive tutorial_examples.example_batch_code
     

    You should see the following:

    -
    01/02: red_button = create_object(red_button.RedButton, [...]         (hh for help) 
    +
    01/02: red_button = create_object(red_button.RedButton, [...]         (hh for help)
     
    -

    This shows that you are on the first #CODE block, the first of only two commands in this batch file. Observe that the block has not actually been executed at this point!

    -

    To take a look at the full code snippet you are about to run, use ll (a batch-processor version of look).

    +

    This shows that you are on the first #CODE block, the first of only two commands in this batch +file. Observe that the block has not actually been executed at this point!

    +

    To take a look at the full code snippet you are about to run, use ll (a batch-processor version of +look).

     1
      2
      3
    @@ -184,31 +219,59 @@
         
         limbo = search.objects(caller, 'Limbo', global_search=True)[0]
     
    -    red_button = create.create_object(red_button.RedButton, key="Red button", 
    +    red_button = create.create_object(red_button.RedButton, key="Red button",
                                           location=limbo, aliases=["button"])
         
         # caller points to the one running the script
         caller.msg("A red button was created.")
     
    -

    Compare with the example code given earlier. Notice how the content of #HEADER has been pasted at the top of the #CODE block. Use pp to actually execute this block (this will create the button and give you a message). Use nn (next) to go to the next command. Use hh for a list of commands.

    -

    If there are tracebacks, fix them in the batch file, then use rr to reload the file. You will still be at the same code block and can rerun it easily with pp as needed. This makes for a simple debug cycle. It also allows you to rerun individual troublesome blocks - as mentioned, in a large batch file this can be very useful (don’t forget the /debug mode either).

    -

    Use nn and bb (next and back) to step through the file; e.g. nn 12 will jump 12 steps forward (without processing any blocks in between). All normal commands of Evennia should work too while working in interactive mode.

    +

    Compare with the example code given earlier. Notice how the content of #HEADER has been pasted at +the top of the #CODE block. Use pp to actually execute this block (this will create the button +and give you a message). Use nn (next) to go to the next command. Use hh for a list of commands.

    +

    If there are tracebacks, fix them in the batch file, then use rr to reload the file. You will +still be at the same code block and can rerun it easily with pp as needed. This makes for a simple +debug cycle. It also allows you to rerun individual troublesome blocks - as mentioned, in a large +batch file this can be very useful (don’t forget the /debug mode either).

    +

    Use nn and bb (next and back) to step through the file; e.g. nn 12 will jump 12 steps forward +(without processing any blocks in between). All normal commands of Evennia should work too while +working in interactive mode.

    Limitations and Caveats

    -

    The batch-code processor is by far the most flexible way to build a world in Evennia. There are however some caveats you need to keep in mind.

    +

    The batch-code processor is by far the most flexible way to build a world in Evennia. There are +however some caveats you need to keep in mind.

    Safety

    -

    Or rather the lack of it. There is a reason only superusers are allowed to run the batch-code processor by default. The code-processor runs without any Evennia security checks and allows full access to Python. If an untrusted party could run the code-processor they could execute arbitrary python code on your machine, which is potentially a very dangerous thing. If you want to allow other users to access the batch-code processor you should make sure to run Evennia as a separate and very limited-access user on your machine (i.e. in a ‘jail’). By comparison, the batch-command processor is much safer since the user running it is still ‘inside’ the game and can’t really do anything outside what the game commands allow them to.

    +

    Or rather the lack of it. There is a reason only superusers are allowed to run the batch-code +processor by default. The code-processor runs without any Evennia security checks and allows +full access to Python. If an untrusted party could run the code-processor they could execute +arbitrary python code on your machine, which is potentially a very dangerous thing. If you want to +allow other users to access the batch-code processor you should make sure to run Evennia as a +separate and very limited-access user on your machine (i.e. in a ‘jail’). By comparison, the batch- +command processor is much safer since the user running it is still ‘inside’ the game and can’t +really do anything outside what the game commands allow them to.

    No communication between code blocks

    -

    Global variables won’t work in code batch files, each block is executed as stand-alone environments. #HEADER blocks are literally pasted on top of each #CODE block so updating some header-variable in your block will not make that change available in another block. Whereas a python execution limitation, allowing this would also lead to very hard-to-debug code when using the interactive mode - this would be a classical example of “spaghetti code”.

    -

    The main practical issue with this is when building e.g. a room in one code block and later want to connect that room with a room you built in the current block. There are two ways to do this:

    +

    Global variables won’t work in code batch files, each block is executed as stand-alone environments. +#HEADER blocks are literally pasted on top of each #CODE block so updating some header-variable +in your block will not make that change available in another block. Whereas a python execution +limitation, allowing this would also lead to very hard-to-debug code when using the interactive mode

    +
      +
    • this would be a classical example of “spaghetti code”.

    • +
    +

    The main practical issue with this is when building e.g. a room in one code block and later want to +connect that room with a room you built in the current block. There are two ways to do this:

      -
    • Perform a database search for the name of the room you created (since you cannot know in advance which dbref it got assigned). The problem is that a name may not be unique (you may have a lot of “A dark forest” rooms). There is an easy way to handle this though - use Tags or Aliases. You can assign any number of tags and/or aliases to any object. Make sure that one of those tags or aliases is unique to the room (like “room56”) and you will henceforth be able to always uniquely search and find it later.

    • -
    • Use the caller global property as an inter-block storage. For example, you could have a dictionary of room references in an ndb:

      +
    • Perform a database search for the name of the room you created (since you cannot know in advance +which dbref it got assigned). The problem is that a name may not be unique (you may have a lot of “A +dark forest” rooms). There is an easy way to handle this though - use Tags or Aliases. You +can assign any number of tags and/or aliases to any object. Make sure that one of those tags or +aliases is unique to the room (like “room56”) and you will henceforth be able to always uniquely +search and find it later.

    • +
    • Use the caller global property as an inter-block storage. For example, you could have a +dictionary of room references in an ndb:

       1
        2
        3
      @@ -220,37 +283,44 @@
        9
       10
       11
      -12
      #HEADER 
      +12
      #HEADER
       if caller.ndb.all_rooms is None:
           caller.ndb.all_rooms = {}
       
      -#CODE 
      +#CODE
       # create and store the castle
       castle = create_object("rooms.Room", key="Castle")
       caller.ndb.all_rooms["castle"] = castle
       
      -#CODE 
      +#CODE
       # in another node we want to access the castle
       castle = caller.ndb.all_rooms.get("castle")
       
    -

    Note how we check in #HEADER if caller.ndb.all_rooms doesn’t already exist before creating the dict. Remember that #HEADER is copied in front of every #CODE block. Without that if statement we’d be wiping the dict every block!

    +

    Note how we check in #HEADER if caller.ndb.all_rooms doesn’t already exist before creating the +dict. Remember that #HEADER is copied in front of every #CODE block. Without that if statement +we’d be wiping the dict every block!

    Don’t treat a batchcode file like any Python file

    -

    Despite being a valid Python file, a batchcode file should only be run by the batchcode processor. You should not do things like define Typeclasses or Commands in them, or import them into other code. Importing a module in Python will execute base level of the module, which in the case of your average batchcode file could mean creating a lot of new objects every time.

    +

    Despite being a valid Python file, a batchcode file should only be run by the batchcode processor. +You should not do things like define Typeclasses or Commands in them, or import them into other +code. Importing a module in Python will execute base level of the module, which in the case of your +average batchcode file could mean creating a lot of new objects every time.

    Don’t let code rely on the batch-file’s real file path

    -

    When you import things into your batchcode file, don’t use relative imports but always import with paths starting from the root of your game directory or evennia library. Code that relies on the batch file’s “actual” location will fail. Batch code files are read as text and the strings executed. When the code runs it has no knowledge of what file those strings where once a part of.

    +

    When you import things into your batchcode file, don’t use relative imports but always import with +paths starting from the root of your game directory or evennia library. Code that relies on the +batch file’s “actual” location will fail. Batch code files are read as text and the strings +executed. When the code runs it has no knowledge of what file those strings where once a part of.

    -
    @@ -297,7 +367,7 @@

    Versions

    @@ -313,13 +383,12 @@
  • modules |
  • - - + \ No newline at end of file diff --git a/docs/0.9.1/Batch-Command-Processor.html b/docs/0.9.5/Batch-Command-Processor.html similarity index 56% rename from docs/0.9.1/Batch-Command-Processor.html rename to docs/0.9.5/Batch-Command-Processor.html index d642dcdbf1..420d711272 100644 --- a/docs/0.9.1/Batch-Command-Processor.html +++ b/docs/0.9.5/Batch-Command-Processor.html @@ -1,11 +1,10 @@ - + - - Batch Command Processor — Evennia 0.9.1 documentation + Batch Command Processor — Evennia 0.9.5 documentation @@ -26,8 +25,7 @@
  • modules |
  • - - + @@ -38,30 +36,52 @@

    Batch Command Processor

    -

    For an introduction and motivation to using batch processors, see here. This page describes the Batch-command processor. The Batch-code one is covered here.

    +

    For an introduction and motivation to using batch processors, see here. This +page describes the Batch-command processor. The Batch-code one is covered [here](Batch-Code- +Processor).

    Basic Usage

    The batch-command processor is a superuser-only function, invoked by

     > @batchcommand path.to.batchcmdfile
     
    -

    Where path.to.batchcmdfile is the path to a batch-command file with the “.ev” file ending. This path is given like a python path relative to a folder you define to hold your batch files, set with BATCH_IMPORT_PATH in your settings. Default folder is (assuming your game is in the mygame folder) mygame/world. So if you want to run the example batch file in mygame/world/batch_cmds.ev, you could use

    +

    Where path.to.batchcmdfile is the path to a batch-command file with the “.ev” file ending. +This path is given like a python path relative to a folder you define to hold your batch files, set +with BATCH_IMPORT_PATH in your settings. Default folder is (assuming your game is in the mygame +folder) mygame/world. So if you want to run the example batch file in +mygame/world/batch_cmds.ev, you could use

     > @batchcommand batch_cmds
     
    -

    A batch-command file contains a list of Evennia in-game commands separated by comments. The processor will run the batch file from beginning to end. Note that it will not stop if commands in it fail (there is no universal way for the processor to know what a failure looks like for all different commands). So keep a close watch on the output, or use Interactive mode (see below) to run the file in a more controlled, gradual manner.

    +

    A batch-command file contains a list of Evennia in-game commands separated by comments. The +processor will run the batch file from beginning to end. Note that it will not stop if commands in +it fail (there is no universal way for the processor to know what a failure looks like for all +different commands). So keep a close watch on the output, or use Interactive mode (see below) to +run the file in a more controlled, gradual manner.

    The batch file

    -

    The batch file is a simple plain-text file containing Evennia commands. Just like you would write them in-game, except you have more freedom with line breaks.

    +

    The batch file is a simple plain-text file containing Evennia commands. Just like you would write +them in-game, except you have more freedom with line breaks.

    Here are the rules of syntax of an *.ev file. You’ll find it’s really, really simple:

      -
    • All lines having the # (hash)-symbol as the first one on the line are considered comments. All non-comment lines are treated as a command and/or their arguments.

    • -
    • Comment lines have an actual function – they mark the end of the previous command definition. So never put two commands directly after one another in the file - separate them with a comment, or the second of the two will be considered an argument to the first one. Besides, using plenty of comments is good practice anyway.

    • -
    • A line that starts with the word #INSERT is a comment line but also signifies a special instruction. The syntax is #INSERT <path.batchfile> and tries to import a given batch-cmd file into this one. The inserted batch file (file ending .ev) will run normally from the point of the #INSERT instruction.

    • -
    • Extra whitespace in a command definition is ignored. - A completely empty line translates in to a line break in texts. Two empty lines thus means a new paragraph (this is obviously only relevant for commands accepting such formatting, such as the @desc command).

    • +
    • All lines having the # (hash)-symbol as the first one on the line are considered comments. +All non-comment lines are treated as a command and/or their arguments.

    • +
    • Comment lines have an actual function – they mark the end of the previous command definition. +So never put two commands directly after one another in the file - separate them with a comment, or +the second of the two will be considered an argument to the first one. Besides, using plenty of +comments is good practice anyway.

    • +
    • A line that starts with the word #INSERT is a comment line but also signifies a special +instruction. The syntax is #INSERT <path.batchfile> and tries to import a given batch-cmd file +into this one. The inserted batch file (file ending .ev) will run normally from the point of the +#INSERT instruction.

    • +
    • Extra whitespace in a command definition is ignored. - A completely empty line translates in to +a line break in texts. Two empty lines thus means a new paragraph (this is obviously only relevant +for commands accepting such formatting, such as the @desc command).

    • The very last command in the file is not required to end with a comment.

    • -
    • You cannot nest another @batchcommand statement into your batch file. If you want to link many batch-files together, use the #INSERT batch instruction instead. You also cannot launch the @batchcode command from your batch file, the two batch processors are not compatible.

    • +
    • You cannot nest another @batchcommand statement into your batch file. If you want to link many +batch-files together, use the #INSERT batch instruction instead. You also cannot launch the +@batchcode command from your batch file, the two batch processors are not compatible.

    Below is a version of the example file found in evennia/contrib/tutorial_examples/batch_cmds.ev.

     1
    @@ -104,43 +124,43 @@
     38
     39
     40
        #
    -    # This is an example batch build file for Evennia. 
    +    # This is an example batch build file for Evennia.
         #
         
         # This creates a red button
         @create button:tutorial_examples.red_button.RedButton
         # (This comment ends input for @create)
    -    # Next command. Let's create something. 
    -    @set button/desc = 
    -      This is a large red button. Now and then 
    -      it flashes in an evil, yet strangely tantalizing way. 
    +    # Next command. Let's create something.
    +    @set button/desc =
    +      This is a large red button. Now and then
    +      it flashes in an evil, yet strangely tantalizing way.
         
           A big sign sits next to it. It says:
     
         
         -----------
         
    -     Press me! 
    +     Press me!
         
         -----------
     
         
    -      ... It really begs to be pressed! You 
    -    know you want to! 
    +      ... It really begs to be pressed! You
    +    know you want to!
         
         # This inserts the commands from another batch-cmd file named
         # batch_insert_file.ev.
         #INSERT examples.batch_insert_file
         
           
    -    # (This ends the @set command). Note that single line breaks 
    -    # and extra whitespace in the argument are ignored. Empty lines 
    +    # (This ends the @set command). Note that single line breaks
    +    # and extra whitespace in the argument are ignored. Empty lines
         # translate into line breaks in the output.
    -    # Now let's place the button where it belongs (let's say limbo #2 is 
    +    # Now let's place the button where it belongs (let's say limbo #2 is
         # the evil lair in our example)
         @teleport #2
    -    # (This comments ends the @teleport command.) 
    -    # Now we drop it so others can see it. 
    +    # (This comments ends the @teleport command.)
    +    # Now we drop it so others can see it.
         # The very last command in the file needs not be ended with #.
         drop button
     
    @@ -149,50 +169,88 @@
    > @batchcommand contrib.tutorial_examples.batch_cmds
     
    -

    A button will be created, described and dropped in Limbo. All commands will be executed by the user calling the command.

    +

    A button will be created, described and dropped in Limbo. All commands will be executed by the user +calling the command.

    -

    Note that if you interact with the button, you might find that its description changes, loosing your custom-set description above. This is just the way this particular object works.

    +

    Note that if you interact with the button, you might find that its description changes, loosing +your custom-set description above. This is just the way this particular object works.

    Interactive mode

    -

    Interactive mode allows you to more step-wise control over how the batch file is executed. This is useful for debugging and also if you have a large batch file and is only updating a small part of it – running the entire file again would be a waste of time (and in the case of @create-ing objects you would to end up with multiple copies of same-named objects, for example). Use @batchcommand with the /interactive flag to enter interactive mode.

    +

    Interactive mode allows you to more step-wise control over how the batch file is executed. This is +useful for debugging and also if you have a large batch file and is only updating a small part of it +– running the entire file again would be a waste of time (and in the case of @create-ing objects +you would to end up with multiple copies of same-named objects, for example). Use @batchcommand +with the /interactive flag to enter interactive mode.

     > @batchcommand/interactive tutorial_examples.batch_cmds
     

    You will see this:

    -
    01/04: @create button:tutorial_examples.red_button.RedButton  (hh for help) 
    +
    01/04: @create button:tutorial_examples.red_button.RedButton  (hh for help)
     
    -

    This shows that you are on the @create command, the first out of only four commands in this batch file. Observe that the command @create has not been actually processed at this point!

    -

    To take a look at the full command you are about to run, use ll (a batch-processor version of look). Use pp to actually process the current command (this will actually @create the button) – and make sure it worked as planned. Use nn (next) to go to the next command. Use hh for a list of commands.

    -

    If there are errors, fix them in the batch file, then use rr to reload the file. You will still be at the same command and can rerun it easily with pp as needed. This makes for a simple debug cycle. It also allows you to rerun individual troublesome commands - as mentioned, in a large batch file this can be very useful. Do note that in many cases, commands depend on the previous ones (e.g. if @create in the example above had failed, the following commands would have had nothing to operate on).

    -

    Use nn and bb (next and back) to step through the file; e.g. nn 12 will jump 12 steps forward (without processing any command in between). All normal commands of Evennia should work too while working in interactive mode.

    +

    This shows that you are on the @create command, the first out of only four commands in this batch +file. Observe that the command @create has not been actually processed at this point!

    +

    To take a look at the full command you are about to run, use ll (a batch-processor version of +look). Use pp to actually process the current command (this will actually @create the button) +– and make sure it worked as planned. Use nn (next) to go to the next command. Use hh for a +list of commands.

    +

    If there are errors, fix them in the batch file, then use rr to reload the file. You will still be +at the same command and can rerun it easily with pp as needed. This makes for a simple debug +cycle. It also allows you to rerun individual troublesome commands - as mentioned, in a large batch +file this can be very useful. Do note that in many cases, commands depend on the previous ones (e.g. +if @create in the example above had failed, the following commands would have had nothing to +operate on).

    +

    Use nn and bb (next and back) to step through the file; e.g. nn 12 will jump 12 steps forward +(without processing any command in between). All normal commands of Evennia should work too while +working in interactive mode.

    Limitations and Caveats

    -

    The batch-command processor is great for automating smaller builds or for testing new commands and objects repeatedly without having to write so much. There are several caveats you have to be aware of when using the batch-command processor for building larger, complex worlds though.

    -

    The main issue is that when you run a batch-command script you (you, as in your superuser character) are actually moving around in the game creating and building rooms in sequence, just as if you had been entering those commands manually, one by one. You have to take this into account when creating the file, so that you can ‘walk’ (or teleport) to the right places in order.

    -

    This also means there are several pitfalls when designing and adding certain types of objects. Here are some examples:

    +

    The batch-command processor is great for automating smaller builds or for testing new commands and +objects repeatedly without having to write so much. There are several caveats you have to be aware +of when using the batch-command processor for building larger, complex worlds though.

    +

    The main issue is that when you run a batch-command script you (you, as in your superuser +character) are actually moving around in the game creating and building rooms in sequence, just as +if you had been entering those commands manually, one by one. You have to take this into account +when creating the file, so that you can ‘walk’ (or teleport) to the right places in order.

    +

    This also means there are several pitfalls when designing and adding certain types of objects. Here +are some examples:

      -
    • Rooms that change your Command Set: Imagine that you build a ‘dark’ room, which severely limits the cmdsets of those entering it (maybe you have to find the light switch to proceed). In your batch script you would create this room, then teleport to it - and promptly be shifted into the dark state where none of your normal build commands work …

    • -
    • Auto-teleportation: Rooms that automatically teleport those that enter them to another place (like a trap room, for example). You would be teleported away too.

    • -
    • Mobiles: If you add aggressive mobs, they might attack you, drawing you into combat. If they have AI they might even follow you around when building - or they might move away from you before you’ve had time to finish describing and equipping them!

    • +
    • Rooms that change your Command Set: Imagine that you build a ‘dark’ room, which +severely limits the cmdsets of those entering it (maybe you have to find the light switch to +proceed). In your batch script you would create this room, then teleport to it - and promptly be +shifted into the dark state where none of your normal build commands work …

    • +
    • Auto-teleportation: Rooms that automatically teleport those that enter them to another place +(like a trap room, for example). You would be teleported away too.

    • +
    • Mobiles: If you add aggressive mobs, they might attack you, drawing you into combat. If they +have AI they might even follow you around when building - or they might move away from you before +you’ve had time to finish describing and equipping them!

    -

    The solution to all these is to plan ahead. Make sure that superusers are never affected by whatever effects are in play. Add an on/off switch to objects and make sure it’s always set to off upon creation. It’s all doable, one just needs to keep it in mind.

    +

    The solution to all these is to plan ahead. Make sure that superusers are never affected by whatever +effects are in play. Add an on/off switch to objects and make sure it’s always set to off upon +creation. It’s all doable, one just needs to keep it in mind.

    Assorted notes

    -

    The fact that you build as ‘yourself’ can also be considered an advantage however, should you ever decide to change the default command to allow others than superusers to call the processor. Since normal access-checks are still performed, a malevolent builder with access to the processor should not be able to do all that much damage (this is the main drawback of the Batch Code Processor)

    +

    The fact that you build as ‘yourself’ can also be considered an advantage however, should you ever +decide to change the default command to allow others than superusers to call the processor. Since +normal access-checks are still performed, a malevolent builder with access to the processor should +not be able to do all that much damage (this is the main drawback of the Batch Code +Processor)

      -
    • GNU Emacs users might find it interesting to use emacs’ evennia mode. This is an Emacs major mode found in evennia/utils/evennia-mode.el. It offers correct syntax highlighting and indentation with <tab> when editing .ev files in Emacs. See the header of that file for installation instructions.

    • -
    • VIM users can use amfl’s vim-evennia mode instead, see its readme for install instructions.

    • +
    • GNU Emacs users might find it interesting to use emacs’ +evennia mode. This is an Emacs major mode found in evennia/utils/evennia-mode.el. It offers +correct syntax highlighting and indentation with <tab> when editing .ev files in Emacs. See the +header of that file for installation instructions.

    • +
    • VIM users can use amfl’s vim-evennia +mode instead, see its readme for install instructions.

    -
    @@ -233,7 +291,7 @@

    Versions

    @@ -249,13 +307,12 @@
  • modules |
  • - - + \ No newline at end of file diff --git a/docs/0.9.5/Batch-Processors.html b/docs/0.9.5/Batch-Processors.html new file mode 100644 index 0000000000..caef957bf6 --- /dev/null +++ b/docs/0.9.5/Batch-Processors.html @@ -0,0 +1,172 @@ + + + + + + + Batch Processors — Evennia 0.9.5 documentation + + + + + + + + + + + + + +
    +
    +
    +
    + +
    +

    Batch Processors

    +

    Building a game world is a lot of work, especially when starting out. Rooms should be created, +descriptions have to be written, objects must be detailed and placed in their proper places. In many +traditional MUD setups you had to do all this online, line by line, over a telnet session.

    +

    Evennia already moves away from much of this by shifting the main coding work to external Python +modules. But also building would be helped if one could do some or all of it externally. Enter +Evennia’s batch processors (there are two of them). The processors allows you, as a game admin, to +build your game completely offline in normal text files (batch files) that the processors +understands. Then, when you are ready, you use the processors to read it all into Evennia (and into +the database) in one go.

    +

    You can of course still build completely online should you want to - this is certainly the easiest +way to go when learning and for small build projects. But for major building work, the advantages of +using the batch-processors are many:

    +
      +
    • It’s hard to compete with the comfort of a modern desktop text editor; Compared to a traditional +MUD line input, you can get much better overview and many more features. Also, accidentally pressing +Return won’t immediately commit things to the database.

    • +
    • You might run external spell checkers on your batch files. In the case of one of the batch- +processors (the one that deals with Python code), you could also run external debuggers and code +analyzers on your file to catch problems before feeding it to Evennia.

    • +
    • The batch files (as long as you keep them) are records of your work. They make a natural starting +point for quickly re-building your world should you ever decide to start over.

    • +
    • If you are an Evennia developer, using a batch file is a fast way to setup a test-game after +having reset the database.

    • +
    • The batch files might come in useful should you ever decide to distribute all or part of your +world to others.

    • +
    +

    There are two batch processors, the Batch-command processor and the Batch-code processor. The +first one is the simpler of the two. It doesn’t require any programming knowledge - you basically +just list in-game commands in a text file. The code-processor on the other hand is much more +powerful but also more complex - it lets you use Evennia’s API to code your world in full-fledged +Python code.

    + +

    If you plan to use international characters in your batchfiles you are wise to read about file +encodings below.

    +
    +

    A note on File Encodings

    +

    As mentioned, both the processors take text files as input and then proceed to process them. As long +as you stick to the standard ASCII character set (which means +the normal English characters, basically) you should not have to worry much about this section.

    +

    Many languages however use characters outside the simple ASCII table. Common examples are various +apostrophes and umlauts but also completely different symbols like those of the greek or cyrillic +alphabets.

    +

    First, we should make it clear that Evennia itself handles international characters just fine. It +(and Django) uses unicode strings internally.

    +

    The problem is that when reading a text file like the batchfile, we need to know how to decode the +byte-data stored therein to universal unicode. That means we need an encoding (a mapping) for how +the file stores its data. There are many, many byte-encodings used around the world, with opaque +names such as Latin-1, ISO-8859-3 or ARMSCII-8 to pick just a few examples. Problem is that +it’s practially impossible to determine which encoding was used to save a file just by looking at it +(it’s just a bunch of bytes!). You have to know.

    +

    With this little introduction it should be clear that Evennia can’t guess but has to assume an +encoding when trying to load a batchfile. The text editor and Evennia must speak the same “language” +so to speak. Evennia will by default first try the international UTF-8 encoding, but you can have +Evennia try any sequence of different encodings by customizing the ENCODINGS list in your settings +file. Evennia will use the first encoding in the list that do not raise any errors. Only if none +work will the server give up and return an error message.

    +

    You can often change the text editor encoding (this depends on your editor though), otherwise you +need to add the editor’s encoding to Evennia’s ENCODINGS list. If you are unsure, write a test +file with lots of non-ASCII letters in the editor of your choice, then import to make sure it works +as it should.

    +

    More help with encodings can be found in the entry Text Encodings and also in the +Wikipedia article here.

    +

    A footnote for the batch-code processor: Just because Evennia can parse your file and your +fancy special characters, doesn’t mean that Python allows their use. Python syntax only allows +international characters inside strings. In all other source code only ASCII set characters are +allowed.

    +
    +
    + + +
    +
    +
    + +
    +
    + + + + \ No newline at end of file diff --git a/docs/0.9.1/Bootstrap-&-Evennia.html b/docs/0.9.5/Bootstrap-&-Evennia.html similarity index 78% rename from docs/0.9.1/Bootstrap-&-Evennia.html rename to docs/0.9.5/Bootstrap-&-Evennia.html index 717266fd25..b4f5702a7d 100644 --- a/docs/0.9.1/Bootstrap-&-Evennia.html +++ b/docs/0.9.5/Bootstrap-&-Evennia.html @@ -1,11 +1,10 @@ - + - - Bootstrap & Evennia — Evennia 0.9.1 documentation + Bootstrap & Evennia — Evennia 0.9.5 documentation @@ -26,8 +25,7 @@
  • modules |
  • - - + @@ -41,32 +39,53 @@

    What is Bootstrap?

    -

    Evennia’s new default web page uses a framework called Bootstrap. This framework is in use across the internet - you’ll probably start to recognize its influence once you learn some of the common design patterns. This switch is great for web developers, perhaps like yourself, because instead of wondering about setting up different grid systems or what custom class another designer used, we have a base, a bootstrap, to work from. Bootstrap is responsive by default, and comes with some default styles that Evennia has lightly overrode to keep some of the same colors and styles you’re used to from the previous design.

    -

    For your reading pleasure, a brief overview of Bootstrap follows. For more in-depth info, please read the documentation.

    +

    Evennia’s new default web page uses a framework called Bootstrap. This +framework is in use across the internet - you’ll probably start to recognize its influence once you +learn some of the common design patterns. This switch is great for web developers, perhaps like +yourself, because instead of wondering about setting up different grid systems or what custom class +another designer used, we have a base, a bootstrap, to work from. Bootstrap is responsive by +default, and comes with some default styles that Evennia has lightly overrode to keep some of the +same colors and styles you’re used to from the previous design.

    +

    For your reading pleasure, a brief overview of Bootstrap follows. For more in-depth info, please +read the documentation.


    The Layout System

    -

    Other than the basic styling Bootstrap includes, it also includes a built in layout and grid system. -The first part of this system is the container.

    -

    The container is meant to hold all your page content. Bootstrap provides two types: fixed-width and full-width. -Fixed-width containers take up a certain max-width of the page - they’re useful for limiting the width on Desktop or Tablet platforms, instead of making the content span the width of the page.

    +

    Other than the basic styling Bootstrap includes, it also includes a built in layout and grid +system. +The first part of this system is the +container.

    +

    The container is meant to hold all your page content. Bootstrap provides two types: fixed-width and +full-width. +Fixed-width containers take up a certain max-width of the page - they’re useful for limiting the +width on Desktop or Tablet platforms, instead of making the content span the width of the page.

    <div class="container">
         <!--- Your content here -->
     </div>
     
    -

    Full width containers take up the maximum width available to them - they’ll span across a wide-screen desktop or a smaller screen phone, edge-to-edge.

    +

    Full width containers take up the maximum width available to them - they’ll span across a wide- +screen desktop or a smaller screen phone, edge-to-edge.

    <div class="container-fluid">
         <!--- This content will span the whole page -->
     </div>
     
    -

    The second part of the layout system is the grid. This is the bread-and-butter of the layout of Bootstrap - it allows you to change the size of elements depending on the size of the screen, without writing any media queries. We’ll briefly go over it - to learn more, please read the docs or look at the source code for Evennia’s home page in your browser.

    +

    The second part of the layout system is the grid. +This is the bread-and-butter of the layout of Bootstrap - it allows you to change the size of +elements depending on the size of the screen, without writing any media queries. We’ll briefly go +over it - to learn more, please read the docs or look at the source code for Evennia’s home page in +your browser.

    -

    Important! Grid elements should be in a .container or .container-fluid. This will center the contents of your site.

    +

    Important! Grid elements should be in a .container or .container-fluid. This will center the +contents of your site.

    -

    Bootstrap’s grid system allows you to create rows and columns by applying classes based on breakpoints. The default breakpoints are extra small, small, medium, large, and extra-large. If you’d like to know more about these breakpoints, please take a look at the documentation for them.

    -

    To use the grid system, first create a container for your content, then add your rows and columns like so:

    +

    Bootstrap’s grid system allows you to create rows and columns by applying classes based on +breakpoints. The default breakpoints are extra small, small, medium, large, and extra-large. If +you’d like to know more about these breakpoints, please take a look at the documentation for +them.

    +

    To use the grid system, first create a container for your content, then add your rows and columns +like so:

    <div class="container">
         <div class="row">
             <div class="col">
    @@ -83,7 +102,8 @@ Fixed-width containers take up a certain max-width of the page - they’re usefu
     

    This layout would create three equal-width columns.

    -

    To specify your sizes - for instance, Evennia’s default site has three columns on desktop and tablet, but reflows to single-column on smaller screens. Try it out!

    +

    To specify your sizes - for instance, Evennia’s default site has three columns on desktop and +tablet, but reflows to single-column on smaller screens. Try it out!

    <div class="container">
         <div class="row">
             <div class="col col-md-6 col-lg-3">
    @@ -102,18 +122,21 @@ Fixed-width containers take up a certain max-width of the page - they’re usefu
     </div>
     
    -

    This layout would be 4 columns on large screens, 2 columns on medium screens, and 1 column on anything smaller.

    -

    To learn more about Bootstrap’s grid, please take a look at the docs

    +

    This layout would be 4 columns on large screens, 2 columns on medium screens, and 1 column on +anything smaller.

    +

    To learn more about Bootstrap’s grid, please take a look at the +docs


    More Bootstrap

    -

    Bootstrap also provides a huge amount of utilities, as well as styling and content elements. To learn more about them, please read the Bootstrap docs or read one of our other web tutorials.

    +

    Bootstrap also provides a huge amount of utilities, as well as styling and content elements. To +learn more about them, please [read the Bootstrap docs](https://getbootstrap.com/docs/4.0/getting- +started/introduction/) or read one of our other web tutorials.

    -
    @@ -152,7 +175,7 @@ Fixed-width containers take up a certain max-width of the page - they’re usefu

    Versions

    @@ -168,13 +191,12 @@ Fixed-width containers take up a certain max-width of the page - they’re usefu
  • modules |
  • - - + \ No newline at end of file diff --git a/docs/0.9.1/Bootstrap-Components-and-Utilities.html b/docs/0.9.5/Bootstrap-Components-and-Utilities.html similarity index 81% rename from docs/0.9.1/Bootstrap-Components-and-Utilities.html rename to docs/0.9.5/Bootstrap-Components-and-Utilities.html index 1d7ce63891..da83306aef 100644 --- a/docs/0.9.1/Bootstrap-Components-and-Utilities.html +++ b/docs/0.9.5/Bootstrap-Components-and-Utilities.html @@ -1,11 +1,10 @@ - + - - Bootstrap Components and Utilities — Evennia 0.9.1 documentation + Bootstrap Components and Utilities — Evennia 0.9.5 documentation @@ -26,8 +25,7 @@
  • modules |
  • - - + @@ -38,21 +36,31 @@

    Bootstrap Components and Utilities

    -

    Bootstrap provides many utilities and components you can use when customizing Evennia’s web presence. We’ll go over a few examples here that you might find useful.

    +

    Bootstrap provides many utilities and components you can use when customizing Evennia’s web +presence. We’ll go over a few examples here that you might find useful.

    -

    Please take a look at either the basic web tutorial or the web character view tutorial +

    Please take a look at either the basic web tutorial or the web +character view tutorial to get a feel for how to add pages to Evennia’s website to test these examples.

    General Styling

    -

    Bootstrap provides base styles for your site. These can be customized through CSS, but the default styles are intended to provide a consistent, clean look for sites.

    +

    Bootstrap provides base styles for your site. These can be customized through CSS, but the default +styles are intended to provide a consistent, clean look for sites.

    Color

    -

    Most elements can be styled with default colors. Take a look at the documentation to learn more about these colors - suffice to say, adding a class of text-* or bg-*, for instance, text-primary, sets the text color or background color.

    +

    Most elements can be styled with default colors. Take a look at the +documentation to learn more about these colors

    +
      +
    • suffice to say, adding a class of text-* or bg-*, for instance, text-primary, sets the text color +or background color.

    • +

    Borders

    -

    Simply adding a class of ‘border’ to an element adds a border to the element. For more in-depth info, please read the documentation on borders..

    +

    Simply adding a class of ‘border’ to an element adds a border to the element. For more in-depth +info, please read the documentation on +borders..

    <span class="border border-dark"></span>
     
    @@ -63,7 +71,10 @@ to get a feel for how to add pages to Evennia’s website to test these examples

    Spacing

    -

    Bootstrap provides classes to easily add responsive margin and padding. Most of the time, you might like to add margins or padding through CSS itself - however these classes are used in the default Evennia site. Take a look at the docs to learn more.

    +

    Bootstrap provides classes to easily add responsive margin and padding. Most of the time, you might +like to add margins or padding through CSS itself - however these classes are used in the default +Evennia site. Take a look at the docs to +learn more.


    @@ -71,7 +82,8 @@ to get a feel for how to add pages to Evennia’s website to test these examples

    Components

    Buttons

    -

    Buttons in Bootstrap are very easy to use - button styling can be added to <button>, <a>, and <input> elements.

    +

    Buttons in Bootstrap are very easy to use - +button styling can be added to <button>, <a>, and <input> elements.

    <a class="btn btn-primary" href="#" role="button">I'm a Button</a>
     <button class="btn btn-primary" type="submit">Me too!</button>
     <input class="btn btn-primary" type="button" value="Button">
    @@ -82,7 +94,10 @@ to get a feel for how to add pages to Evennia’s website to test these examples
     

    Cards

    -

    Cards provide a container for other elements that stands out from the rest of the page. The “Accounts”, “Recently Connected”, and “Database Stats” on the default webpage are all in cards. Cards provide quite a bit of formatting options - the following is a simple example, but read the documentation or look at the site’s source for more.

    +

    Cards provide a container for other elements +that stands out from the rest of the page. The “Accounts”, “Recently Connected”, and “Database +Stats” on the default webpage are all in cards. Cards provide quite a bit of formatting options - +the following is a simple example, but read the documentation or look at the site’s source for more.

    <div class="card">
       <div class="card-body">
         <h4 class="card-title">Card title</h4>
    @@ -96,7 +111,9 @@ to get a feel for how to add pages to Evennia’s website to test these examples
     

    Jumbotron

    -

    Jumbotrons are useful for featuring an image or tagline for your game. They can flow with the rest of your content or take up the full width of the page - Evennia’s base site uses the former.

    +

    Jumbotrons are useful for featuring an +image or tagline for your game. They can flow with the rest of your content or take up the full +width of the page - Evennia’s base site uses the former.

    <div class="jumbotron jumbotron-fluid">
       <div class="container">
         <h1 class="display-3">Full Width Jumbotron</h1>
    @@ -108,13 +125,14 @@ to get a feel for how to add pages to Evennia’s website to test these examples
     

    Forms

    -

    Forms are highly customizable with Bootstrap. For a more in-depth look at how to use forms and their styles in your own Evennia site, please read over the web character gen tutorial.

    +

    Forms are highly customizable with Bootstrap. +For a more in-depth look at how to use forms and their styles in your own Evennia site, please read +over the web character gen tutorial.

    -
    @@ -163,7 +181,7 @@ to get a feel for how to add pages to Evennia’s website to test these examples

    Versions

    @@ -179,13 +197,12 @@ to get a feel for how to add pages to Evennia’s website to test these examples
  • modules |
  • - - +
    \ No newline at end of file diff --git a/docs/0.9.1/Builder-Docs.html b/docs/0.9.5/Builder-Docs.html similarity index 91% rename from docs/0.9.1/Builder-Docs.html rename to docs/0.9.5/Builder-Docs.html index f91878c154..dbec1ab456 100644 --- a/docs/0.9.1/Builder-Docs.html +++ b/docs/0.9.5/Builder-Docs.html @@ -1,11 +1,10 @@ - + - - Builder Docs — Evennia 0.9.1 documentation + Builder Docs — Evennia 0.9.5 documentation @@ -26,8 +25,7 @@
  • modules |
  • - - + @@ -77,7 +75,6 @@ -
    @@ -116,7 +113,7 @@

    Versions

    @@ -132,13 +129,12 @@
  • modules |
  • - - + \ No newline at end of file diff --git a/docs/0.9.1/Building-Permissions.html b/docs/0.9.5/Building-Permissions.html similarity index 56% rename from docs/0.9.1/Building-Permissions.html rename to docs/0.9.5/Building-Permissions.html index f1bb386235..b30c1f3788 100644 --- a/docs/0.9.1/Building-Permissions.html +++ b/docs/0.9.5/Building-Permissions.html @@ -1,11 +1,10 @@ - + - - Building Permissions — Evennia 0.9.1 documentation + Building Permissions — Evennia 0.9.5 documentation @@ -26,8 +25,7 @@
  • modules |
  • - - + @@ -38,23 +36,45 @@

    Building Permissions

    -

    OBS: This gives only a brief introduction to the access system. Locks and permissions are fully detailed here.

    +

    OBS: This gives only a brief introduction to the access system. Locks and permissions are fully +detailed here.

    The super user

    -

    There are strictly speaking two types of users in Evennia, the super user and everyone else. The superuser is the first user you create, object #1. This is the all-powerful server-owner account. Technically the superuser not only has access to everything, it bypasses the permission checks entirely. This makes the superuser impossible to lock out, but makes it unsuitable to actually play-test the game’s locks and restrictions with (see @quell below). Usually there is no need to have but one superuser.

    +

    There are strictly speaking two types of users in Evennia, the super user and everyone else. The +superuser is the first user you create, object #1. This is the all-powerful server-owner account. +Technically the superuser not only has access to everything, it bypasses the permission checks +entirely. This makes the superuser impossible to lock out, but makes it unsuitable to actually play- +test the game’s locks and restrictions with (see @quell below). Usually there is no need to have +but one superuser.

    Assigning permissions

    -

    Whereas permissions can be used for anything, those put in settings.PERMISSION_HIERARCHY will have a ranking relative each other as well. We refer to these types of permissions as hierarchical permissions. When building locks to check these permissions, the perm() lock function is used. By default Evennia creates the following hierarchy (spelled exactly like this):

    +

    Whereas permissions can be used for anything, those put in settings.PERMISSION_HIERARCHY will have +a ranking relative each other as well. We refer to these types of permissions as hierarchical +permissions. When building locks to check these permissions, the perm() lock function is +used. By default Evennia creates the following hierarchy (spelled exactly like this):

      -
    1. Developers basically have the same access as superusers except that they do not sidestep the Permission system. Assign only to really trusted server-admin staff since this level gives access both to server reload/shutdown functionality as well as (and this may be more critical) gives access to the all-powerful @py command that allows the execution of arbitrary Python code on the command line.

    2. -
    3. Admins can do everything except affecting the server functions themselves. So an Admin couldn’t reload or shutdown the server for example. They also cannot execute arbitrary Python code on the console or import files from the hard drive.

    4. -
    5. Builders - have all the build commands, but cannot affect other accounts or mess with the server.

    6. +
    7. Developers basically have the same access as superusers except that they do not sidestep +the Permission system. Assign only to really trusted server-admin staff since this level gives +access both to server reload/shutdown functionality as well as (and this may be more critical) gives +access to the all-powerful @py command that allows the execution of arbitrary Python code on the +command line.

    8. +
    9. Admins can do everything except affecting the server functions themselves. So an Admin +couldn’t reload or shutdown the server for example. They also cannot execute arbitrary Python code +on the console or import files from the hard drive.

    10. +
    11. Builders - have all the build commands, but cannot affect other accounts or mess with the +server.

    12. Helpers are almost like a normal Player, but they can also add help files to the database.

    13. -
    14. Players is the default group that new players end up in. A new player have permission to use tells and to use and create new channels.

    15. +
    16. Players is the default group that new players end up in. A new player have permission to use +tells and to use and create new channels.

    -

    A user having a certain level of permission automatically have access to locks specifying access of a lower level.

    -

    To assign a new permission from inside the game, you need to be able to use the @perm command. This is an Developer-level command, but it could in principle be made lower-access since it only allows assignments equal or lower to your current level (so you cannot use it to escalate your own permission level). So, assuming you yourself have Developer access (or is superuser), you assign a new account “Tommy” to your core staff with the command

    +

    A user having a certain level of permission automatically have access to locks specifying access of +a lower level.

    +

    To assign a new permission from inside the game, you need to be able to use the @perm command. +This is an Developer-level command, but it could in principle be made lower-access since it only +allows assignments equal or lower to your current level (so you cannot use it to escalate your own +permission level). So, assuming you yourself have Developer access (or is superuser), you assign +a new account “Tommy” to your core staff with the command

    @perm/account Tommy = Developer
     
    @@ -62,20 +82,31 @@
    @perm *Tommy = Developer
     
    -

    We use a switch or the *name format to make sure to put the permission on the Account and not on any eventual Character that may also be named “Tommy”. This is usually what you want since the Account will then remain an Developer regardless of which Character they are currently controlling. To limit permission to a per-Character level you should instead use quelling (see below). Normally permissions can be any string, but for these special hierarchical permissions you can also use plural (“Developer” and “Developers” both grant the same powers).

    +

    We use a switch or the *name format to make sure to put the permission on the Account and not on +any eventual Character that may also be named “Tommy”. This is usually what you want since the +Account will then remain an Developer regardless of which Character they are currently controlling. +To limit permission to a per-Character level you should instead use quelling (see below). Normally +permissions can be any string, but for these special hierarchical permissions you can also use +plural (“Developer” and “Developers” both grant the same powers).

    Quelling your permissions

    -

    When developing it can be useful to check just how things would look had your permission-level been lower. For this you can use quelling. Normally, when you puppet a Character you are using your Account-level permission. So even if your Character only has Accounts level permissions, your Developer-level Account will take precedence. With the @quell command you can change so that the Character’s permission takes precedence instead:

    +

    When developing it can be useful to check just how things would look had your permission-level been +lower. For this you can use quelling. Normally, when you puppet a Character you are using your +Account-level permission. So even if your Character only has Accounts level permissions, your +Developer-level Account will take precedence. With the @quell command you can change so that the +Character’s permission takes precedence instead:

     @quell
     
    -

    This will allow you to test out the game using the current Character’s permission level. A developer or builder can thus in principle maintain several test characters, all using different permission levels. Note that you cannot escalate your permissions this way; If the Character happens to have a higher permission level than the Account, the Account’s (lower) permission will still be used.

    +

    This will allow you to test out the game using the current Character’s permission level. A developer +or builder can thus in principle maintain several test characters, all using different permission +levels. Note that you cannot escalate your permissions this way; If the Character happens to have a +higher permission level than the Account, the Account’s (lower) permission will still be used.

    -
    @@ -114,7 +145,7 @@

    Versions

    @@ -130,13 +161,12 @@
  • modules |
  • - - + \ No newline at end of file diff --git a/docs/0.9.1/Building-Quickstart.html b/docs/0.9.5/Building-Quickstart.html similarity index 65% rename from docs/0.9.1/Building-Quickstart.html rename to docs/0.9.5/Building-Quickstart.html index 0762d7f52d..0d3c32f5fa 100644 --- a/docs/0.9.1/Building-Quickstart.html +++ b/docs/0.9.5/Building-Quickstart.html @@ -1,11 +1,10 @@ - + - - Building Quickstart — Evennia 0.9.1 documentation + Building Quickstart — Evennia 0.9.5 documentation @@ -26,8 +25,7 @@
  • modules |
  • - - + @@ -51,37 +49,56 @@ your command (so entering
     command[/switch/switch...] [arguments ...]
     
    -

    A switch is a special, optional flag to the command to make it behave differently. It is always put directly after the command name, and begins with a forward slash (/). The arguments are one or more inputs to the commands. It’s common to use an equal sign (=) when assigning something to an object.

    -

    Below are some examples of commands you can try when logged in to the game. Use help <command> for learning more about each command and their detailed options.

    +

    A switch is a special, optional flag to the command to make it behave differently. It is always +put directly after the command name, and begins with a forward slash (/). The arguments are one +or more inputs to the commands. It’s common to use an equal sign (=) when assigning something to +an object.

    +

    Below are some examples of commands you can try when logged in to the game. Use help <command> for +learning more about each command and their detailed options.

    Stepping Down From Godhood

    -

    If you just installed Evennia, your very first player account is called user #1, also known as the superuser or god user. This user is very powerful, so powerful that it will override many game restrictions such as locks. This can be useful, but it also hides some functionality that you might want to test.

    +

    If you just installed Evennia, your very first player account is called user #1, also known as the +superuser or god user. This user is very powerful, so powerful that it will override many game +restrictions such as locks. This can be useful, but it also hides some functionality that you might +want to test.

    To temporarily step down from your superuser position you can use the quell command in-game:

    quell
     
    -

    This will make you start using the permission of your current character’s level instead of your superuser level. If you didn’t change any settings your game Character should have an Developer level permission - high as can be without bypassing locks like the superuser does. This will work fine for the examples on this page. Use unquell to get back to superuser status again afterwards.

    +

    This will make you start using the permission of your current character’s level instead of your +superuser level. If you didn’t change any settings your game Character should have an Developer +level permission - high as can be without bypassing locks like the superuser does. This will work +fine for the examples on this page. Use unquell to get back to superuser status again afterwards.

    Creating an Object

    -

    Basic objects can be anything – swords, flowers and non-player characters. They are created using the create command:

    +

    Basic objects can be anything – swords, flowers and non-player characters. They are created using +the create command:

    create box
     
    -

    This created a new ‘box’ (of the default object type) in your inventory. Use the command inventory (or i) to see it. Now, ‘box’ is a rather short name, let’s rename it and tack on a few aliases.

    +

    This created a new ‘box’ (of the default object type) in your inventory. Use the command inventory +(or i) to see it. Now, ‘box’ is a rather short name, let’s rename it and tack on a few aliases.

    name box = very large box;box;very;crate
     
    -

    We now renamed the box to very large box (and this is what we will see when looking at it), but we will also recognize it by any of the other names we give - like crate or simply box as before. We could have given these aliases directly after the name in the create command, this is true for all creation commands - you can always tag on a list of ;-separated aliases to the name of your new object. If you had wanted to not change the name itself, but to only add aliases, you could have used the alias command.

    -

    We are currently carrying the box. Let’s drop it (there is also a short cut to create and drop in one go by using the /drop switch, for example create/drop box).

    -
    drop box 
    +

    We now renamed the box to very large box (and this is what we will see when looking at it), but we +will also recognize it by any of the other names we give - like crate or simply box as before. +We could have given these aliases directly after the name in the create command, this is true for +all creation commands - you can always tag on a list of ;-separated aliases to the name of your +new object. If you had wanted to not change the name itself, but to only add aliases, you could have +used the alias command.

    +

    We are currently carrying the box. Let’s drop it (there is also a short cut to create and drop in +one go by using the /drop switch, for example create/drop box).

    +
    drop box
     

    Hey presto - there it is on the ground, in all its normality.

    examine box
     
    -

    This will show some technical details about the box object. For now we will ignore what this information means.

    +

    This will show some technical details about the box object. For now we will ignore what this +information means.

    Try to look at the box to see the (default) description.

    look box
     You see nothing special.
    @@ -91,73 +108,120 @@ your command (so entering 
    describe box = This is a large and very heavy box.
     
    -

    If you try the get command we will pick up the box. So far so good, but if we really want this to be a large and heavy box, people should not be able to run off with it that easily. To prevent this we need to lock it down. This is done by assigning a Lock to it. Make sure the box was dropped in the room, then try this:

    +

    If you try the get command we will pick up the box. So far so good, but if we really want this to +be a large and heavy box, people should not be able to run off with it that easily. To prevent +this we need to lock it down. This is done by assigning a Lock to it. Make sure the box was +dropped in the room, then try this:

    lock box = get:false()
     
    -

    Locks represent a rather big topic, but for now that will do what we want. This will lock the box so noone can lift it. The exception is superusers, they override all locks and will pick it up anyway. Make sure you are quelling your superuser powers and try to get the box now:

    +

    Locks represent a rather big topic, but for now that will do what we want. This will lock +the box so noone can lift it. The exception is superusers, they override all locks and will pick it +up anyway. Make sure you are quelling your superuser powers and try to get the box now:

    > get box
     You can't get that.
     
    -

    Think thís default error message looks dull? The get command looks for an Attribute named get_err_msg for returning a nicer error message (we just happen to know this, you would need to peek into the code for the get command to find out.). You set attributes using the set command:

    -
    set box/get_err_msg = It's way too heavy for you to lift. 
    +

    Think thís default error message looks dull? The get command looks for an Attribute +named get_err_msg for returning a nicer error message (we just happen to know this, you would need +to peek into the +code for +the get command to find out.). You set attributes using the set command:

    +
    set box/get_err_msg = It's way too heavy for you to lift.
     
    -

    Try to get it now and you should see a nicer error message echoed back to you. To see what this message string is in the future, you can use ‘examine.’

    +

    Try to get it now and you should see a nicer error message echoed back to you. To see what this +message string is in the future, you can use ‘examine.’

    examine box/get_err_msg
     
    -

    Examine will return the value of attributes, including color codes. examine here/desc would return the raw description of your current room (including color codes), so that you can copy-and-paste to set its description to something else.

    -

    You create new Commands (or modify existing ones) in Python outside the game. See the Adding Commands tutorial for help with creating your first own Command.

    +

    Examine will return the value of attributes, including color codes. examine here/desc would return +the raw description of your current room (including color codes), so that you can copy-and-paste to +set its description to something else.

    +

    You create new Commands (or modify existing ones) in Python outside the game. See the Adding +Commands tutorial for help with creating your first own Command.

    Get a Personality

    -

    Scripts are powerful out-of-character objects useful for many “under the hood” things. One of their optional abilities is to do things on a timer. To try out a first script, let’s put one on ourselves. There is an example script in evennia/contrib/tutorial_examples/bodyfunctions.py that is called BodyFunctions. To add this to us we will use the script command:

    +

    Scripts are powerful out-of-character objects useful for many “under the hood” things. +One of their optional abilities is to do things on a timer. To try out a first script, let’s put one +on ourselves. There is an example script in evennia/contrib/tutorial_examples/bodyfunctions.py +that is called BodyFunctions. To add this to us we will use the script command:

    script self = tutorial_examples.bodyfunctions.BodyFunctions
     
    -

    (note that you don’t have to give the full path as long as you are pointing to a place inside the contrib directory, it’s one of the places Evennia looks for Scripts). Wait a while and you will notice yourself starting making random observations.

    -
    script self 
    +

    (note that you don’t have to give the full path as long as you are pointing to a place inside the +contrib directory, it’s one of the places Evennia looks for Scripts). Wait a while and you will +notice yourself starting making random observations.

    +
    script self
     
    -

    This will show details about scripts on yourself (also examine works). You will see how long it is until it “fires” next. Don’t be alarmed if nothing happens when the countdown reaches zero - this particular script has a randomizer to determine if it will say something or not. So you will not see output every time it fires.

    +

    This will show details about scripts on yourself (also examine works). You will see how long it is +until it “fires” next. Don’t be alarmed if nothing happens when the countdown reaches zero - this +particular script has a randomizer to determine if it will say something or not. So you will not see +output every time it fires.

    When you are tired of your character’s “insights”, kill the script with

    script/stop self = tutorial_examples.bodyfunctions.BodyFunctions
     
    -

    You create your own scripts in Python, outside the game; the path you give to script is literally the Python path to your script file. The Scripts page explains more details.

    +

    You create your own scripts in Python, outside the game; the path you give to script is literally +the Python path to your script file. The Scripts page explains more details.

    Pushing Your Buttons

    -

    If we get back to the box we made, there is only so much fun you can do with it at this point. It’s just a dumb generic object. If you renamed it to stone and changed its description noone would be the wiser. However, with the combined use of custom Typeclasses, Scripts and object-based Commands, you could expand it and other items to be as unique, complex and interactive as you want.

    -

    Let’s take an example. So far we have only created objects that use the default object typeclass named simply Object. Let’s create an object that is a little more interesting. Under evennia/contrib/tutorial_examples there is a module red_button.py. It contains the enigmatic RedButton typeclass.

    +

    If we get back to the box we made, there is only so much fun you can do with it at this point. It’s +just a dumb generic object. If you renamed it to stone and changed its description noone would be +the wiser. However, with the combined use of custom Typeclasses, Scripts +and object-based Commands, you could expand it and other items to be as unique, complex +and interactive as you want.

    +

    Let’s take an example. So far we have only created objects that use the default object typeclass +named simply Object. Let’s create an object that is a little more interesting. Under +evennia/contrib/tutorial_examples there is a module red_button.py. It contains the enigmatic +RedButton typeclass.

    Let’s make us one of those!

    create/drop button:tutorial_examples.red_button.RedButton
     
    -

    We import the RedButton python class the same way you would import it in Python except Evennia makes sure to look inevennia/contrib/ so you don’t have to write the full path every time. There you go - one red button.

    -

    The RedButton is an example object intended to show off a few of Evennia’s features. You will find that the Typeclass and Commands controlling it are inside evennia/contrib/tutorial_examples/.

    -

    If you wait for a while (make sure you dropped it!) the button will blink invitingly. Why don’t you try to push it …? Surely a big red button is meant to be pushed. You know you want to.

    +

    We import the RedButton python class the same way you would import it in Python except Evennia makes +sure to look inevennia/contrib/ so you don’t have to write the full path every time. There you go

    +
      +
    • one red button.

    • +
    +

    The RedButton is an example object intended to show off a few of Evennia’s features. You will find +that the Typeclass and Commands controlling it are inside +evennia/contrib/tutorial_examples/.

    +

    If you wait for a while (make sure you dropped it!) the button will blink invitingly. Why don’t you +try to push it …? Surely a big red button is meant to be pushed. You know you want to.

    Making Yourself a House

    -

    The main command for shaping the game world is dig. For example, if you are standing in Limbo you can dig a route to your new house location like this:

    +

    The main command for shaping the game world is dig. For example, if you are standing in Limbo you +can dig a route to your new house location like this:

    dig house = large red door;door;in,to the outside;out
     
    -

    This will create a new room named ‘house’. Spaces at the start/end of names and aliases are ignored so you could put more air if you wanted. This call will directly create an exit from your current location named ‘large red door’ and a corresponding exit named ‘to the outside’ in the house room leading back to Limbo. We also define a few aliases to those exits, so people don’t have to write the full thing all the time.

    -

    If you wanted to use normal compass directions (north, west, southwest etc), you could do that with dig too. But Evennia also has a limited version of dig that helps for compass directions (and also up/down and in/out). It’s called tunnel:

    +

    This will create a new room named ‘house’. Spaces at the start/end of names and aliases are ignored +so you could put more air if you wanted. This call will directly create an exit from your current +location named ‘large red door’ and a corresponding exit named ‘to the outside’ in the house room +leading back to Limbo. We also define a few aliases to those exits, so people don’t have to write +the full thing all the time.

    +

    If you wanted to use normal compass directions (north, west, southwest etc), you could do that with +dig too. But Evennia also has a limited version of dig that helps for compass directions (and +also up/down and in/out). It’s called tunnel:

    tunnel sw = cliff
     
    -

    This will create a new room “cliff” with an exit “southwest” leading there and a path “northeast” leading back from the cliff to your current location.

    +

    This will create a new room “cliff” with an exit “southwest” leading there and a path “northeast” +leading back from the cliff to your current location.

    You can create new exits from where you are using the open command:

    open north;n = house
     

    This opens an exit north (with an alias n) to the previously created room house.

    -

    If you have many rooms named house you will get a list of matches and have to select which one you want to link to. You can also give its database (#dbref) number, which is unique to every object. This can be found with the examine command or by looking at the latest constructions with objects.

    +

    If you have many rooms named house you will get a list of matches and have to select which one you +want to link to. You can also give its database (#dbref) number, which is unique to every object. +This can be found with the examine command or by looking at the latest constructions with +objects.

    Follow the north exit to your ‘house’ or teleport to it:

    north
     
    @@ -174,7 +238,8 @@ your command (so entering

    Reshuffling the World

    -

    You can find things using the find command. Assuming you are back at Limbo, let’s teleport the large box to our house.

    +

    You can find things using the find command. Assuming you are back at Limbo, let’s teleport the +large box to our house.

    > teleport box = house
     very large box is leaving Limbo, heading for house.
     Teleported very large box -> house.
    @@ -186,39 +251,50 @@ your command (so entering very large box(#8) - src.objects.objects.Object
     
    -

    Knowing the #dbref of the box (#8 in this example), you can grab the box and get it back here without actually yourself going to house first:

    +

    Knowing the #dbref of the box (#8 in this example), you can grab the box and get it back here +without actually yourself going to house first:

    teleport #8 = here
     
    -

    (You can usually use here to refer to your current location. To refer to yourself you can use self or me). The box should now be back in Limbo with you.

    +

    (You can usually use here to refer to your current location. To refer to yourself you can use +self or me). The box should now be back in Limbo with you.

    We are getting tired of the box. Let’s destroy it.

    destroy box
     
    -

    You can destroy many objects in one go by giving a comma-separated list of objects (or their #dbrefs, if they are not in the same location) to the command.

    +

    You can destroy many objects in one go by giving a comma-separated list of objects (or their +#dbrefs, if they are not in the same location) to the command.

    Adding a Help Entry

    -

    An important part of building is keeping the help files updated. You can add, delete and append to existing help entries using the sethelp command.

    -
    sethelp/add MyTopic = This help topic is about ... 
    +

    An important part of building is keeping the help files updated. You can add, delete and append to +existing help entries using the sethelp command.

    +
    sethelp/add MyTopic = This help topic is about ...
     

    Adding a World

    -

    After this brief introduction to building you may be ready to see a more fleshed-out example. Evennia comes with a tutorial world for you to explore.

    -

    First you need to switch back to superuser by using the unquell command. Next, place yourself in Limbo and run the following command:

    +

    After this brief introduction to building you may be ready to see a more fleshed-out example. +Evennia comes with a tutorial world for you to explore.

    +

    First you need to switch back to superuser by using the unquell command. Next, place yourself in +Limbo and run the following command:

    batchcommand tutorial_world.build
     
    -

    This will take a while (be patient and don’t re-run the command). You will see all the commands used to build the world scroll by as the world is built for you.

    -

    You will end up with a new exit from Limbo named tutorial. Apart from being a little solo-adventure in its own right, the tutorial world is a good source for learning Evennia building (and coding).

    -

    Read the batch file to see exactly how it’s built, step by step. See also more info about the tutorial world here.

    +

    This will take a while (be patient and don’t re-run the command). You will see all the commands used +to build the world scroll by as the world is built for you.

    +

    You will end up with a new exit from Limbo named tutorial. Apart from being a little solo- +adventure in its own right, the tutorial world is a good source for learning Evennia building (and +coding).

    +

    Read the batch +file to see +exactly how it’s built, step by step. See also more info about the tutorial world [here](Tutorial- +World-Introduction).

    -
    @@ -262,7 +338,7 @@ your command (so entering Versions
    @@ -278,13 +354,12 @@ your command (so entering modules | - - +
    \ No newline at end of file diff --git a/docs/0.9.1/Building-a-mech-tutorial.html b/docs/0.9.5/Building-a-mech-tutorial.html similarity index 75% rename from docs/0.9.1/Building-a-mech-tutorial.html rename to docs/0.9.5/Building-a-mech-tutorial.html index 1784d6617a..bd720f78f6 100644 --- a/docs/0.9.1/Building-a-mech-tutorial.html +++ b/docs/0.9.5/Building-a-mech-tutorial.html @@ -1,11 +1,10 @@ - + - - Building a mech tutorial — Evennia 0.9.1 documentation + Building a mech tutorial — Evennia 0.9.5 documentation @@ -26,8 +25,7 @@
  • modules |
  • - - +
    @@ -39,15 +37,19 @@

    Building a mech tutorial

    -

    This page was adapted from the article “Building a Giant Mech in Evennia” by Griatch, published in Imaginary Realities Volume 6, issue 1, 2014. The original article is no longer available online, this is a version adopted to be compatible with the latest Evennia.

    +

    This page was adapted from the article “Building a Giant Mech in Evennia” by Griatch, published in +Imaginary Realities Volume 6, issue 1, 2014. The original article is no longer available online, +this is a version adopted to be compatible with the latest Evennia.

    Creating the Mech

    -

    Let us create a functioning giant mech using the Python MUD-creation system Evennia. Everyone likes a giant mech, right? Start in-game as a character with build privileges (or the superuser).

    +

    Let us create a functioning giant mech using the Python MUD-creation system Evennia. Everyone likes +a giant mech, right? Start in-game as a character with build privileges (or the superuser).

    @create/drop Giant Mech ; mech
     
    -

    Boom. We created a Giant Mech Object and dropped it in the room. We also gave it an alias mech. Let’s describe it.

    +

    Boom. We created a Giant Mech Object and dropped it in the room. We also gave it an alias mech. +Let’s describe it.

    @desc mech = This is a huge mech. It has missiles and stuff.
     
    @@ -55,37 +57,52 @@
    @lock mech = puppet:all()
     
    -

    This makes it so that everyone can control the mech. More mechs to the people! (Note that whereas Evennia’s default commands may look vaguely MUX-like, you can change the syntax to look like whatever interface style you prefer.)

    -

    Before we continue, let’s make a brief detour. Evennia is very flexible about its objects and even more flexible about using and adding commands to those objects. Here are some ground rules well worth remembering for the remainder of this article:

    +

    This makes it so that everyone can control the mech. More mechs to the people! (Note that whereas +Evennia’s default commands may look vaguely MUX-like, you can change the syntax to look like +whatever interface style you prefer.)

    +

    Before we continue, let’s make a brief detour. Evennia is very flexible about its objects and even +more flexible about using and adding commands to those objects. Here are some ground rules well +worth remembering for the remainder of this article:

    • 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.

    • +
    • 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:

      • be made available to the puppeteer (Account),

      • be made available to anyone in the same location as the Object, and

      • be made available to anyone “inside” the Object

      • -
      • Also Accounts can store commands on themselves. Account commands are always available unless commands on a puppeted Object explicitly override them.

      • +
      • Also Accounts can store commands on themselves. Account commands are always available unless +commands on a puppeted Object explicitly override them.

    -

    In Evennia, using the @ic command will allow you to puppet a given Object (assuming you have puppet-access to do so). As mentioned above, the bog-standard Character class is in fact like any Object: it is auto-puppeted when logging in and just has a command set on it containing the normal in-game commands, like look, inventory, get and so on.

    +

    In Evennia, using the @ic command will allow you to puppet a given Object (assuming you have +puppet-access to do so). As mentioned above, the bog-standard Character class is in fact like any +Object: it is auto-puppeted when logging in and just has a command set on it containing the normal +in-game commands, like look, inventory, get and so on.

    @ic mech
     
    -

    You just jumped out of your Character and are now the mech! If people look at you in-game, they will look at a mech. The problem at this point is that the mech Object has no commands of its own. The usual things like look, inventory and get sat on the Character object, remember? So at the moment the mech is not quite as cool as it could be.

    +

    You just jumped out of your Character and are now the mech! If people look at you in-game, they +will look at a mech. The problem at this point is that the mech Object has no commands of its own. +The usual things like look, inventory and get sat on the Character object, remember? So at the +moment the mech is not quite as cool as it could be.

    @ic <Your old Character>
     

    You just jumped back to puppeting your normal, mundane Character again. All is well.

    -

    (But, you ask, where did that @ic command come from, if the mech had no commands on it? The answer is that it came from the Account’s command set. This is important. Without the Account being the one with the @ic command, we would not have been able to get back out of our mech again.)

    +

    (But, you ask, where did that @ic command come from, if the mech had no commands on it? The +answer is that it came from the Account’s command set. This is important. Without the Account being +the one with the @ic command, we would not have been able to get back out of our mech again.)

    Arming the Mech

    -

    Let us make the mech a little more interesting. In our favorite text editor, we will create some new mech-suitable commands. In Evennia, commands are defined as Python classes.

    +

    Let us make the mech a little more interesting. In our favorite text editor, we will create some new +mech-suitable commands. In Evennia, commands are defined as Python classes.

     1
      2
      3
    @@ -163,13 +180,18 @@
         # (it's very similar to the 'shoot' command above).
     
    -

    This is saved as a normal Python module (let’s call it mechcommands.py), in a place Evennia looks for such modules (mygame/commands/). This command will trigger when the player gives the command “shoot”, “fire,” or even “fire!” with an exclamation mark. The mech can shoot in the air or at a target if you give one. In a real game the gun would probably be given a chance to hit and give damage to the target, but this is enough for now.

    +

    This is saved as a normal Python module (let’s call it mechcommands.py), in a place Evennia looks +for such modules (mygame/commands/). This command will trigger when the player gives the command +“shoot”, “fire,” or even “fire!” with an exclamation mark. The mech can shoot in the air or at a +target if you give one. In a real game the gun would probably be given a chance to hit and give +damage to the target, but this is enough for now.

    We also make a second command for launching missiles (CmdLaunch). To save space we won’t describe it here; it looks the same except it returns a text about the missiles being fired and has different key and aliases. We leave that up to you to create as an exercise. You could have it print “WOOSH! The mech launches missiles against !”, for example.

    -

    Now we shove our commands into a command set. A Command Set (CmdSet) is a container holding any number of commands. The command set is what we will store on the mech.

    +

    Now we shove our commands into a command set. A Command Set (CmdSet) is a container +holding any number of commands. The command set is what we will store on the mech.

     1
      2
      3
    @@ -201,11 +223,14 @@ mech launches missiles against !”, for example.

    self.add(CmdLaunch())
    -

    This simply groups all the commands we want. We add our new shoot/launch commands. Let’s head back into the game. For testing we will manually attach our new CmdSet to the mech.

    +

    This simply groups all the commands we want. We add our new shoot/launch commands. Let’s head back +into the game. For testing we will manually attach our new CmdSet to the mech.

    @py self.search("mech").cmdset.add("commands.mechcommands.MechCmdSet")
     
    -

    This is a little Python snippet (run from the command line as an admin) that searches for the mech in our current location and attaches our new MechCmdSet to it. What we add is actually the Python path to our cmdset class. Evennia will import and initialize it behind the scenes.

    +

    This is a little Python snippet (run from the command line as an admin) that searches for the mech +in our current location and attaches our new MechCmdSet to it. What we add is actually the Python +path to our cmdset class. Evennia will import and initialize it behind the scenes.

    @ic mech
     
    @@ -214,16 +239,25 @@ mech launches missiles against !”, for example.

    BOOM! The mech fires its gun in the air!
    -

    There we go, one functioning mech. Try your own launch command and see that it works too. We can not only walk around as the mech — since the CharacterCmdSet is included in our MechCmdSet, the mech can also do everything a Character could do, like look around, pick up stuff, and have an inventory. We could now shoot the gun at a target or try the missile launch command. Once you have your own mech, what else do you need?

    +

    There we go, one functioning mech. Try your own launch command and see that it works too. We can +not only walk around as the mech — since the CharacterCmdSet is included in our MechCmdSet, the mech +can also do everything a Character could do, like look around, pick up stuff, and have an inventory. +We could now shoot the gun at a target or try the missile launch command. Once you have your own +mech, what else do you need?

    -

    Note: You’ll find that the mech’s commands are available to you by just standing in the same location (not just by puppeting it). We’ll solve this with a lock in the next section.

    +

    Note: You’ll find that the mech’s commands are available to you by just standing in the same +location (not just by puppeting it). We’ll solve this with a lock in the next section.

    Making a Mech production line

    -

    What we’ve done so far is just to make a normal Object, describe it and put some commands on it. This is great for testing. The way we added it, the MechCmdSet will even go away if we reload the server. Now we want to make the mech an actual object “type” so we can create mechs without those extra steps. For this we need to create a new Typeclass.

    -

    A Typeclass is a near-normal Python class that stores its existence to the database behind the scenes. A Typeclass is created in a normal Python source file:

    +

    What we’ve done so far is just to make a normal Object, describe it and put some commands on it. +This is great for testing. The way we added it, the MechCmdSet will even go away if we reload the +server. Now we want to make the mech an actual object “type” so we can create mechs without those +extra steps. For this we need to create a new Typeclass.

    +

    A Typeclass is a near-normal Python class that stores its existence to the database +behind the scenes. A Typeclass is created in a normal Python source file:

     1
      2
      3
    @@ -257,13 +291,22 @@ BOOM! The mech fires its gun in the air!
             self.db.desc = "This is a huge mech. It has missiles and stuff."
     
    -

    For convenience we include the full contents of the default CharacterCmdSet in there. This will make a Character’s normal commands available to the mech. We also add the mech-commands from before, making sure they are stored persistently in the database. The locks specify that anyone can puppet the meck and no-one can “call” the mech’s Commands from ‘outside’ it - you have to puppet it to be able to shoot.

    -

    That’s it. When Objects of this type are created, they will always start out with the mech’s command set and the correct lock. We set a default description, but you would probably change this with @desc to individualize your mechs as you build them.

    +

    For convenience we include the full contents of the default CharacterCmdSet in there. This will +make a Character’s normal commands available to the mech. We also add the mech-commands from before, +making sure they are stored persistently in the database. The locks specify that anyone can puppet +the meck and no-one can “call” the mech’s Commands from ‘outside’ it - you have to puppet it to be +able to shoot.

    +

    That’s it. When Objects of this type are created, they will always start out with the mech’s command +set and the correct lock. We set a default description, but you would probably change this with +@desc to individualize your mechs as you build them.

    Back in the game, just exit the old mech (@ic back to your old character) then do

    @create/drop The Bigger Mech ; bigmech : mech.Mech
     
    -

    We create a new, bigger mech with an alias bigmech. Note how we give the python-path to our Typeclass at the end — this tells Evennia to create the new object based on that class (we don’t have to give the full path in our game dir typeclasses.mech.Mech because Evennia knows to look in the typeclasses folder already). A shining new mech will appear in the room! Just use

    +

    We create a new, bigger mech with an alias bigmech. Note how we give the python-path to our +Typeclass at the end — this tells Evennia to create the new object based on that class (we don’t +have to give the full path in our game dir typeclasses.mech.Mech because Evennia knows to look in +the typeclasses folder already). A shining new mech will appear in the room! Just use

    @ic bigmech
     
    @@ -271,15 +314,21 @@ BOOM! The mech fires its gun in the air!

    Future Mechs

    -

    To expand on this you could add more commands to the mech and remove others. Maybe the mech shouldn’t work just like a Character after all. Maybe it makes loud noises every time it passes from room to room. Maybe it cannot pick up things without crushing them. Maybe it needs fuel, ammo and repairs. Maybe you’ll lock it down so it can only be puppeted by emo teenagers.

    -

    Having you puppet the mech-object directly is also just one way to implement a giant mech in Evennia.

    -

    For example, you could instead picture a mech as a “vehicle” that you “enter” as your normal Character (since any Object can move inside another). In that case the “insides” of the mech Object could be the “cockpit”. The cockpit would have the MechCommandSet stored on itself and all the shooting goodness would be made available to you only when you enter it.

    +

    To expand on this you could add more commands to the mech and remove others. Maybe the mech +shouldn’t work just like a Character after all. Maybe it makes loud noises every time it passes from +room to room. Maybe it cannot pick up things without crushing them. Maybe it needs fuel, ammo and +repairs. Maybe you’ll lock it down so it can only be puppeted by emo teenagers.

    +

    Having you puppet the mech-object directly is also just one way to implement a giant mech in +Evennia.

    +

    For example, you could instead picture a mech as a “vehicle” that you “enter” as your normal +Character (since any Object can move inside another). In that case the “insides” of the mech Object +could be the “cockpit”. The cockpit would have the MechCommandSet stored on itself and all the +shooting goodness would be made available to you only when you enter it.

    And of course you could put more guns on it. And make it fly.

    -
    @@ -321,7 +370,7 @@ BOOM! The mech fires its gun in the air!

    Versions

    @@ -337,13 +386,12 @@ BOOM! The mech fires its gun in the air!
  • modules |
  • - - + \ No newline at end of file diff --git a/docs/0.9.1/Building-menus.html b/docs/0.9.5/Building-menus.html similarity index 81% rename from docs/0.9.1/Building-menus.html rename to docs/0.9.5/Building-menus.html index 8642219727..70cdc60ff7 100644 --- a/docs/0.9.1/Building-menus.html +++ b/docs/0.9.5/Building-menus.html @@ -1,11 +1,10 @@ - + - - Building menus — Evennia 0.9.1 documentation + Building menus — Evennia 0.9.5 documentation @@ -26,8 +25,7 @@
  • modules |
  • - - + @@ -41,20 +39,33 @@

    The building_menu contrib

    -

    This contrib allows you to write custom and easy to use building menus. As the name implies, these menus are most useful for building things, that is, your builders might appreciate them, although you can use them for your players as well.

    -

    Building menus are somewhat similar to EvMenu although they don’t use the same system at all and are intended to make building easier. They replicate what other engines refer to as “building editors”, which allow to you to build in a menu instead of having to enter a lot of complex commands. Builders might appreciate this simplicity, and if the code that was used to create them is simple as well, coders could find this contrib useful.

    +

    This contrib allows you to write custom and easy to use building menus. As the name implies, these +menus are most useful for building things, that is, your builders might appreciate them, although +you can use them for your players as well.

    +

    Building menus are somewhat similar to EvMenu although they don’t use the same system at all and +are intended to make building easier. They replicate what other engines refer to as “building +editors”, which allow to you to build in a menu instead of having to enter a lot of complex +commands. Builders might appreciate this simplicity, and if the code that was used to create them +is simple as well, coders could find this contrib useful.

    A simple menu

    Before diving in, there are some things to point out:

      -
    • Building menus work on an object. This object will be edited by manipulations in the menu. So you can create a menu to add/edit a room, an exit, a character and so on.

    • -
    • Building menus are arranged in layers of choices. A choice gives access to an option or to a sub-menu. Choices are linked to commands (usually very short). For instance, in the example shown below, to edit the room key, after opening the building menu, you can type k. That will lead you to the key choice where you can enter a new key for the room. Then you can enter @ to leave this choice and go back to the entire menu. (All of this can be changed).

    • -
    • To open the menu, you will need something like a command. This contrib offers a basic command for demonstration, but we will override it in this example, using the same code with more flexibility.

    • +
    • Building menus work on an object. This object will be edited by manipulations in the menu. So +you can create a menu to add/edit a room, an exit, a character and so on.

    • +
    • Building menus are arranged in layers of choices. A choice gives access to an option or to a sub- +menu. Choices are linked to commands (usually very short). For instance, in the example shown +below, to edit the room key, after opening the building menu, you can type k. That will lead you +to the key choice where you can enter a new key for the room. Then you can enter @ to leave this +choice and go back to the entire menu. (All of this can be changed).

    • +
    • To open the menu, you will need something like a command. This contrib offers a basic command for +demonstration, but we will override it in this example, using the same code with more flexibility.

    So let’s add a very basic example to begin with.

    A generic editing command

    -

    Let’s begin by adding a new command. You could add or edit the following file (there’s no trick here, feel free to organize the code differently):

    +

    Let’s begin by adding a new command. You could add or edit the following file (there’s no trick +here, feel free to organize the code differently):

     1
      2
      3
    @@ -97,7 +108,8 @@
     40
     41
     42
    -43
    # file: commands/building.py
    +43
    +44
    # file: commands/building.py
     from evennia.contrib.building_menu import BuildingMenu
     from commands.command import Command
     
    @@ -135,7 +147,8 @@
             if obj.typename == "Room":
                 Menu = RoomBuildingMenu
             else:
    -            self.msg("|rThe object {} cannot be edited.|n".format(obj.get_display_name(self.caller)))
    +            self.msg("|rThe object {} cannot be
    +edited.|n".format(obj.get_display_name(self.caller)))
                 return
     
             menu = Menu(self.caller, obj)
    @@ -145,18 +158,28 @@
     

    This command is rather simple in itself:

    1. It has a key @edit and a lock to only allow builders to use it.

    2. -
    3. In its func method, it begins by checking the arguments, returning an error if no argument is specified.

    4. -
    5. It then searches for the given argument. We search globally. The search method used in this way will return the found object or None. It will also send the error message to the caller if necessary.

    6. -
    7. Assuming we have found an object, we check the object typename. This will be used later when we want to display several building menus. For the time being, we only handle Room. If the caller specified something else, we’ll display an error.

    8. -
    9. Assuming this object is a Room, we have defined a Menu object containing the class of our building menu. We build this class (creating an instance), giving it the caller and the object to edit.

    10. +
    11. In its func method, it begins by checking the arguments, returning an error if no argument is +specified.

    12. +
    13. It then searches for the given argument. We search globally. The search method used in this +way will return the found object or None. It will also send the error message to the caller if +necessary.

    14. +
    15. Assuming we have found an object, we check the object typename. This will be used later when +we want to display several building menus. For the time being, we only handle Room. If the +caller specified something else, we’ll display an error.

    16. +
    17. Assuming this object is a Room, we have defined a Menu object containing the class of our +building menu. We build this class (creating an instance), giving it the caller and the object to +edit.

    18. We then open the building menu, using the open method.

    -

    The end might sound a bit surprising at first glance. But the process is still very simple: we create an instance of our building menu and call its open method. Nothing more.

    +

    The end might sound a bit surprising at first glance. But the process is still very simple: we +create an instance of our building menu and call its open method. Nothing more.

    Where is our building menu?

    -

    If you go ahead and add this command and test it, you’ll get an error. We haven’t defined RoomBuildingMenu yet.

    -

    To add this command, edit commands/default_cmdsets.py. Import our command, adding an import line at the top of the file:

    +

    If you go ahead and add this command and test it, you’ll get an error. We haven’t defined +RoomBuildingMenu yet.

    +

    To add this command, edit commands/default_cmdsets.py. Import our command, adding an import line +at the top of the file:

    1
     2
     3
    @@ -213,7 +236,8 @@
     

    Our first menu

    -

    So far, we can’t use our building menu. Our @edit command will throw an error. We have to define the RoomBuildingMenu class. Open the commands/building.py file and add to the end of the file:

    +

    So far, we can’t use our building menu. Our @edit command will throw an error. We have to define +the RoomBuildingMenu class. Open the commands/building.py file and add to the end of the file:

     1
      2
      3
    @@ -243,7 +267,9 @@
             self.add_choice("key", "k", attr="key")
     
    -

    Save these changes, reload your game. You can now use the @edit command. Here’s what we get (notice that the commands we enter into the game are prefixed with > , though this prefix will probably not appear in your MUD client):

    +

    Save these changes, reload your game. You can now use the @edit command. Here’s what we get +(notice that the commands we enter into the game are prefixed with > , though this prefix will +probably not appear in your MUD client):

    > look
     Limbo(#2)
     Welcome to your new Evennia-based game! Visit http://www.evennia.com if you need
    @@ -308,12 +334,14 @@ As Account #1 you can create a demo/tutorial area with @batchcommand tutorial_wo
     
  • When we use the @edit here command, a building menu for this room appears.

  • This menu has two choices:

      -
    • Enter k to edit the room key. You will go into a choice where you can simply type the key room key (the way we have done here). You can use @ to go back to the menu.

    • +
    • Enter k to edit the room key. You will go into a choice where you can simply type the key +room key (the way we have done here). You can use @ to go back to the menu.

    • You can use q to quit the menu.

  • -

    We then check, with the look command, that the menu has modified this room key. So by adding a class, with a method and a single line of code within, we’ve added a menu with two choices.

    +

    We then check, with the look command, that the menu has modified this room key. So by adding a +class, with a method and a single line of code within, we’ve added a menu with two choices.

    Code explanation

    @@ -342,40 +370,59 @@ As Account #1 you can create a demo/tutorial area with @batchcommand tutorial_wo
      -
    • We first create a class inheriting from BuildingMenu. This is usually the case when we want to create a building menu with this contrib.

    • +
    • We first create a class inheriting from BuildingMenu. This is usually the case when we want to +create a building menu with this contrib.

    • In this class, we override the init method, which is called when the menu opens.

    • -
    • In this init method, we call add_choice. This takes several arguments, but we’ve defined only three here:

      +
    • In this init method, we call add_choice. This takes several arguments, but we’ve defined only +three here:

        -
      • The choice name. This is mandatory and will be used by the building menu to know how to display this choice.

      • -
      • The command key to access this choice. We’ve given a simple "k". Menu commands usually are pretty short (that’s part of the reason building menus are appreciated by builders). You can also specify additional aliases, but we’ll see that later.

      • -
      • We’ve added a keyword argument, attr. This tells the building menu that when we are in this choice, the text we enter goes into this attribute name. It’s called attr, but it could be a room attribute or a typeclass persistent or non-persistent attribute (we’ll see other examples as well).

      • +
      • The choice name. This is mandatory and will be used by the building menu to know how to +display this choice.

      • +
      • The command key to access this choice. We’ve given a simple "k". Menu commands usually are +pretty short (that’s part of the reason building menus are appreciated by builders). You can also +specify additional aliases, but we’ll see that later.

      • +
      • We’ve added a keyword argument, attr. This tells the building menu that when we are in this +choice, the text we enter goes into this attribute name. It’s called attr, but it could be a room +attribute or a typeclass persistent or non-persistent attribute (we’ll see other examples as well).

    We’ve added the menu choice for key here, why is another menu choice defined for quit?

    -

    Our building menu creates a choice at the end of our choice list if it’s a top-level menu (sub-menus don’t have this feature). You can, however, override it to provide a different “quit” message or to perform some actions.

    +

    Our building menu creates a choice at the end of our choice list if it’s a top-level menu (sub-menus +don’t have this feature). You can, however, override it to provide a different “quit” message or to +perform some actions.

    I encourage you to play with this code. As simple as it is, it offers some functionalities already.

    Customizing building menus

    -

    This somewhat long section explains how to customize building menus. There are different ways depending on what you would like to achieve. We’ll go from specific to more advanced here.

    +

    This somewhat long section explains how to customize building menus. There are different ways +depending on what you would like to achieve. We’ll go from specific to more advanced here.

    Generic choices

    -

    In the previous example, we’ve used add_choice. This is one of three methods you can use to add choices. The other two are to handle more generic actions:

    +

    In the previous example, we’ve used add_choice. This is one of three methods you can use to add +choices. The other two are to handle more generic actions:

      -
    • add_choice_edit: this is called to add a choice which points to the EvEditor. It is used to edit a description in most cases, although you could edit other things. We’ll see an example shortly. add_choice_edit uses most of the add_choice keyword arguments we’ll see, but usually we specify only two (sometimes three):

      +
    • add_choice_edit: this is called to add a choice which points to the EvEditor. It is used to +edit a description in most cases, although you could edit other things. We’ll see an example +shortly. add_choice_edit uses most of the add_choice keyword arguments we’ll see, but usually +we specify only two (sometimes three):

      • The choice title as usual.

      • The choice key (command key) as usual.

      • -
      • Optionally, the attribute of the object to edit, with the attr keyword argument. By default, attr contains db.desc. It means that this persistent data attribute will be edited by the EvEditor. You can change that to whatever you want though.

      • +
      • Optionally, the attribute of the object to edit, with the attr keyword argument. By +default, attr contains db.desc. It means that this persistent data attribute will be edited by +the EvEditor. You can change that to whatever you want though.

    • -
    • add_choice_quit: this allows to add a choice to quit the editor. Most advisable! If you don’t do it, the building menu will do it automatically, except if you really tell it not to. Again, you can specify the title and key of this menu. You can also call a function when this menu closes.

    • +
    • add_choice_quit: this allows to add a choice to quit the editor. Most advisable! If you don’t +do it, the building menu will do it automatically, except if you really tell it not to. Again, you +can specify the title and key of this menu. You can also call a function when this menu closes.

    -

    So here’s a more complete example (you can replace your RoomBuildingMenu class in commands/building.py to see it):

    +

    So here’s a more complete example (you can replace your RoomBuildingMenu class in +commands/building.py to see it):

     1
      2
      3
    @@ -397,14 +444,16 @@ As Account #1 you can create a demo/tutorial area with @batchcommand tutorial_wo
             self.add_choice_quit("quit this editor", "q")
     
    -

    So far, our building menu class is still thin… and yet we already have some interesting feature. See for yourself the following MUD client output (again, the commands are prefixed with > to distinguish them):

    +

    So far, our building menu class is still thin… and yet we already have some interesting feature. +See for yourself the following MUD client output (again, the commands are prefixed with > to +distinguish them):

    > @reload
     
     > @edit here
     Building menu: A beautiful meadow
     
      [K]ey: A beautiful meadow
    - [D]escription: 
    + [D]escription:
        Welcome to your new Evennia-based game! Visit http://www.evennia.com if you need
     help, want to contribute, report issues or just join the community.
     As Account #1 you can create a demo/tutorial area with @batchcommand tutorial_world.build.
    @@ -430,7 +479,7 @@ Cleared 3 lines from buffer.
     Building menu: A beautiful meadow
     
      [K]ey: A beautiful meadow
    - [D]escription: 
    + [D]escription:
        This is a beautiful meadow.  But so beautiful I can't describe it.
      [Q]uit this editor
     
    @@ -442,25 +491,50 @@ A beautiful meadow(#2)
     This is a beautiful meadow.  But so beautiful I can't describe it.
     
    -

    So by using the d shortcut in our building menu, an EvEditor opens. You can use the EvEditor commands (like we did here, :DD to remove all, :wq to save and quit). When you quit the editor, the description is saved (here, in room.db.desc) and you go back to the building menu.

    -

    Notice that the choice to quit has changed too, which is due to our adding add_choice_quit. In most cases, you will probably not use this method, since the quit menu is added automatically.

    +

    So by using the d shortcut in our building menu, an EvEditor opens. You can use the EvEditor +commands (like we did here, :DD to remove all, :wq to save and quit). When you quit the editor, +the description is saved (here, in room.db.desc) and you go back to the building menu.

    +

    Notice that the choice to quit has changed too, which is due to our adding add_choice_quit. In +most cases, you will probably not use this method, since the quit menu is added automatically.

    add_choice options

    -

    add_choice and the two methods add_choice_edit and add_choice_quit take a lot of optional arguments to make customization easier. Some of these options might not apply to add_choice_edit or add_choice_quit however.

    +

    add_choice and the two methods add_choice_edit and add_choice_quit take a lot of optional +arguments to make customization easier. Some of these options might not apply to add_choice_edit +or add_choice_quit however.

    Below are the options of add_choice, specify them as arguments:

      -
    • The first positional, mandatory argument is the choice title, as we have seen. This will influence how the choice appears in the menu.

    • -
    • The second positional, mandatory argument is the command key to access to this menu. It is best to use keyword arguments for the other arguments.

    • -
    • The aliases keyword argument can contain a list of aliases that can be used to access to this menu. For instance: add_choice(..., aliases=['t'])

    • -
    • The attr keyword argument contains the attribute to edit when this choice is selected. It’s a string, it has to be the name, from the object (specified in the menu constructor) to reach this attribute. For instance, a attr of "key" will try to find obj.key to read and write the attribute. You can specify more complex attribute names, for instance, attr="db.desc" to set the desc persistent attribute, or attr="ndb.something" so use a non-persistent data attribute on the object.

    • -
    • The text keyword argument is used to change the text that will be displayed when the menu choice is selected. Menu choices provide a default text that you can change. Since this is a long text, it’s useful to use multi-line strings (see an example below).

    • -
    • The glance keyword argument is used to specify how to display the current information while in the menu, when the choice hasn’t been opened. If you examine the previous examples, you will see that the current (key or db.desc) was shown in the menu, next to the command key. This is useful for seeing at a glance the current value (hence the name). Again, menu choices will provide a default glance if you don’t specify one.

    • -
    • The on_enter keyword argument allows to add a callback to use when the menu choice is opened. This is more advanced, but sometimes useful.

    • -
    • The on_nomatch keyword argument is called when, once in the menu, the caller enters some text that doesn’t match any command (including the @ command). By default, this will edit the specified attr.

    • -
    • The on_leave keyword argument allows to specify a callback used when the caller leaves the menu choice. This can be useful for cleanup as well.

    • +
    • The first positional, mandatory argument is the choice title, as we have seen. This will +influence how the choice appears in the menu.

    • +
    • The second positional, mandatory argument is the command key to access to this menu. It is best +to use keyword arguments for the other arguments.

    • +
    • The aliases keyword argument can contain a list of aliases that can be used to access to this +menu. For instance: add_choice(..., aliases=['t'])

    • +
    • The attr keyword argument contains the attribute to edit when this choice is selected. It’s a +string, it has to be the name, from the object (specified in the menu constructor) to reach this +attribute. For instance, a attr of "key" will try to find obj.key to read and write the +attribute. You can specify more complex attribute names, for instance, attr="db.desc" to set the +desc persistent attribute, or attr="ndb.something" so use a non-persistent data attribute on the +object.

    • +
    • The text keyword argument is used to change the text that will be displayed when the menu choice +is selected. Menu choices provide a default text that you can change. Since this is a long text, +it’s useful to use multi-line strings (see an example below).

    • +
    • The glance keyword argument is used to specify how to display the current information while in +the menu, when the choice hasn’t been opened. If you examine the previous examples, you will see +that the current (key or db.desc) was shown in the menu, next to the command key. This is +useful for seeing at a glance the current value (hence the name). Again, menu choices will provide +a default glance if you don’t specify one.

    • +
    • The on_enter keyword argument allows to add a callback to use when the menu choice is opened. +This is more advanced, but sometimes useful.

    • +
    • The on_nomatch keyword argument is called when, once in the menu, the caller enters some text +that doesn’t match any command (including the @ command). By default, this will edit the +specified attr.

    • +
    • The on_leave keyword argument allows to specify a callback used when the caller leaves the menu +choice. This can be useful for cleanup as well.

    -

    These are a lot of possibilities, and most of the time you won’t need them all. Here is a short example using some of these arguments (again, replace the RoomBuildingMenu class in commands/building.py with the following code to see it working):

    +

    These are a lot of possibilities, and most of the time you won’t need them all. Here is a short +example using some of these arguments (again, replace the RoomBuildingMenu class in +commands/building.py with the following code to see it working):

     1
      2
      3
    @@ -507,7 +581,7 @@ This is a beautiful meadow.  But so beautiful I can't describe it.
     Building menu: A beautiful meadow
     
      [T]itle: A beautiful meadow
    - [D]escription: 
    + [D]escription:
        This is a beautiful meadow.  But so beautiful I can't describe it.
      [Q]uit the menu
     
    @@ -526,7 +600,7 @@ This is a beautiful meadow.  But so beautiful I can't describe it.
     Building menu: A beautiful meadow
     
      [T]itle: A beautiful meadow
    - [D]escription: 
    + [D]escription:
        This is a beautiful meadow.  But so beautiful I can't describe it.
      [Q]uit the menu
     
    @@ -534,17 +608,26 @@ This is a beautiful meadow.  But so beautiful I can't describe it.
     Closing the building menu.
     
    -

    The most surprising part is no doubt the text. We use the multi-line syntax (with """). Excessive spaces will be removed from the left for each line automatically. We specify some information between braces… sometimes using double braces. What might be a bit odd:

    +

    The most surprising part is no doubt the text. We use the multi-line syntax (with """). +Excessive spaces will be removed from the left for each line automatically. We specify some +information between braces… sometimes using double braces. What might be a bit odd:

    • {back} is a direct format argument we’ll use (see the .format specifiers).

    • -
    • {{obj...}} refers to the object being edited.  We use two braces, because .format` will remove them.

    • +
    • {{obj...}} refers to the object being edited.  We use two braces, because .format` will remove +them.

    In glance, we also use {obj.key} to indicate we want to show the room’s key.

    Everything can be a function

    -

    The keyword arguments of add_choice are often strings (type str). But each of these arguments can also be a function. This allows for a lot of customization, since we define the callbacks that will be executed to achieve such and such an operation.

    -

    To demonstrate, we will try to add a new feature. Our building menu for rooms isn’t that bad, but it would be great to be able to edit exits too. So we can add a new menu choice below description… but how to actually edit exits? Exits are not just an attribute to set: exits are objects (of type Exit by default) which stands between two rooms (object of type Room). So how can we show that?

    +

    The keyword arguments of add_choice are often strings (type str). But each of these arguments +can also be a function. This allows for a lot of customization, since we define the callbacks that +will be executed to achieve such and such an operation.

    +

    To demonstrate, we will try to add a new feature. Our building menu for rooms isn’t that bad, but +it would be great to be able to edit exits too. So we can add a new menu choice below +description… but how to actually edit exits? Exits are not just an attribute to set: exits are +objects (of type Exit by default) which stands between two rooms (object of type Room). So how +can we show that?

    First let’s add a couple of exits in limbo, so we have something to work with:

    @tunnel n
     @tunnel s
    @@ -562,8 +645,10 @@ This is a beautiful meadow.  But so beautiful I can't describe it.
     [<Exit: north>, <Exit: south>]
     
    -

    So what we need is to display this list in our building menu… and to allow to edit it would be great. Perhaps even add new exits?

    -

    First of all, let’s write a function to display the glance on existing exits. Here’s the code, it’s explained below:

    +

    So what we need is to display this list in our building menu… and to allow to edit it would be +great. Perhaps even add new exits?

    +

    First of all, let’s write a function to display the glance on existing exits. Here’s the code, +it’s explained below:

     1
      2
      3
    @@ -629,14 +714,17 @@ This is a beautiful meadow.  But so beautiful I can't describe it.
         return "\n  |gNo exit yet|n"
     
    -

    When the building menu opens, it displays each choice to the caller. A choice is displayed with its title (rendered a bit nicely to show the key as well) and the glance. In the case of the exits choice, the glance is a function, so the building menu calls this function giving it the object being edited (the room here). The function should return the text to see.

    +

    When the building menu opens, it displays each choice to the caller. A choice is displayed with its +title (rendered a bit nicely to show the key as well) and the glance. In the case of the exits +choice, the glance is a function, so the building menu calls this function giving it the object +being edited (the room here). The function should return the text to see.

    > @edit here
     Building menu: A beautiful meadow
     
      [T]itle: A beautiful meadow
    - [D]escription: 
    + [D]escription:
        This is a beautiful meadow.  But so beautiful I can't describe it.
    - [E]xits: 
    + [E]xits:
       north
       south
      [Q]uit the menu
    @@ -648,25 +736,41 @@ This is a beautiful meadow.  But so beautiful I can't describe it.
     

    How do I know the parameters of the function to give?

    -

    The function you give can accept a lot of different parameters. This allows for a flexible approach but might seem complicated at first. Basically, your function can accept any parameter, and the building menu will send only the parameter based on their names. If your function defines an argument named caller for instance (like def func(caller): ), then the building menu knows that the first argument should contain the caller of the building menu. Here are the arguments, you don’t have to specify them (if you do, they need to have the same name):

    +

    The function you give can accept a lot of different parameters. This allows for a flexible approach +but might seem complicated at first. Basically, your function can accept any parameter, and the +building menu will send only the parameter based on their names. If your function defines an +argument named caller for instance (like def func(caller): ), then the building menu knows that +the first argument should contain the caller of the building menu. Here are the arguments, you +don’t have to specify them (if you do, they need to have the same name):

      -
    • menu: if your function defines an argument named menu, it will contain the building menu itself.

    • -
    • choice: if your function defines an argument named choice, it will contain the Choice object representing this menu choice.

    • -
    • string: if your function defines an argument named string, it will contain the user input to reach this menu choice. This is not very useful, except on nomatch callbacks which we’ll see later.

    • -
    • obj: if your function defines an argument named obj, it will contain the building menu edited object.

    • -
    • caller: if your function defines an argument named caller, it will contain the caller of the building menu.

    • +
    • menu: if your function defines an argument named menu, it will contain the building menu +itself.

    • +
    • choice: if your function defines an argument named choice, it will contain the Choice object +representing this menu choice.

    • +
    • string: if your function defines an argument named string, it will contain the user input to +reach this menu choice. This is not very useful, except on nomatch callbacks which we’ll see +later.

    • +
    • obj: if your function defines an argument named obj, it will contain the building menu edited +object.

    • +
    • caller: if your function defines an argument named caller, it will contain the caller of the +building menu.

    • Anything else: any other argument will contain the object being edited by the building menu.

    So in our case:

    1
    def glance_exits(room):
     
    -

    The only argument we need is room. It’s not present in the list of possible arguments, so the editing object of the building menu (the room, here) is given.

    +

    The only argument we need is room. It’s not present in the list of possible arguments, so the +editing object of the building menu (the room, here) is given.

    Why is it useful to get the menu or choice object?

    -

    Most of the time, you will not need these arguments. In very rare cases, you will use them to get specific data (like the default attribute that was set). This tutorial will not elaborate on these possibilities. Just know that they exist.

    -

    We should also define a text callback, so that we can enter our menu to see the room exits. We’ll see how to edit them in the next section but this is a good opportunity to show a more complete callback. To see it in action, as usual, replace the class and functions in commands/building.py:

    +

    Most of the time, you will not need these arguments. In very rare cases, you will use them to get +specific data (like the default attribute that was set). This tutorial will not elaborate on these +possibilities. Just know that they exist.

    +

    We should also define a text callback, so that we can enter our menu to see the room exits. We’ll +see how to edit them in the next section but this is a good opportunity to show a more complete +callback. To see it in action, as usual, replace the class and functions in commands/building.py:

     1
      2
      3
    @@ -774,14 +878,16 @@ This is a beautiful meadow.  But so beautiful I can't describe it.
         return text
     
    -

    Look at the second callback in particular. It takes an additional argument, the caller (remember, the argument names are important, their order is not relevant). This is useful for displaying destination of exits accurately. Here is a demonstration of this menu:

    +

    Look at the second callback in particular. It takes an additional argument, the caller (remember, +the argument names are important, their order is not relevant). This is useful for displaying +destination of exits accurately. Here is a demonstration of this menu:

    > @edit here
     Building menu: A beautiful meadow
     
      [T]itle: A beautiful meadow
    - [D]escription: 
    + [D]escription:
        This is a beautiful meadow.  But so beautiful I can't describe it.
    - [E]xits: 
    + [E]xits:
       north
       south
      [Q]uit the menu
    @@ -800,9 +906,9 @@ This is a beautiful meadow.  But so beautiful I can't describe it.
     Building menu: A beautiful meadow
     
      [T]itle: A beautiful meadow
    - [D]escription: 
    + [D]escription:
        This is a beautiful meadow.  But so beautiful I can't describe it.
    - [E]xits: 
    + [E]xits:
       north
       south
      [Q]uit the menu
    @@ -815,15 +921,30 @@ This is a beautiful meadow.  But so beautiful I can't describe it.