diff --git a/docs/source/Components/Attributes.md b/docs/source/Components/Attributes.md index 255f877cdf..9175a8f0b0 100644 --- a/docs/source/Components/Attributes.md +++ b/docs/source/Components/Attributes.md @@ -572,7 +572,7 @@ There are also two special properties: Non-database attributes are not stored in the database and have no equivalence to `category` nor `strvalue`, `attrtype` or `model`. -# In-memory Attributes (NAttributes) +## In-memory Attributes (NAttributes) _NAttributes_ (short of Non-database Attributes) mimic Attributes in most things except they are **non-persistent** - they will _not_ survive a server reload. diff --git a/docs/source/Components/Nicks.md b/docs/source/Components/Nicks.md index 324583d3ed..e0392b501f 100644 --- a/docs/source/Components/Nicks.md +++ b/docs/source/Components/Nicks.md @@ -68,10 +68,6 @@ You can also use [shell-type wildcards](http://www.linfo.org/wildcard.html): - [seq] - matches everything in the sequence, e.g. [xyz] will match both x, y and z - [!seq] - matches everything *not* in the sequence. e.g. [!xyz] will match all but x,y z. - - - - ## Coding with nicks Nicks are stored as the `Nick` database model and are referred from the normal Evennia @@ -104,7 +100,7 @@ command in `evennia/commands/default/general.py` for more examples. As a last note, The Evennia [channel](./Channels.md) alias systems are using nicks with the `nick_type="channel"` in order to allow users to create their own custom aliases to channels. -# Advanced note +## Advanced note Internally, nicks are [Attributes](./Attributes.md) saved with the `db_attrype` set to "nick" (normal Attributes has this set to `None`). diff --git a/docs/source/Components/Scripts.md b/docs/source/Components/Scripts.md index cb6fd76c72..a351dca368 100644 --- a/docs/source/Components/Scripts.md +++ b/docs/source/Components/Scripts.md @@ -111,13 +111,13 @@ new_script.delete() timed_script.delete() ``` -# Defining new Scripts +## Defining new Scripts A Script is defined as a class and is created in the same way as other [typeclassed](./Typeclasses.md) entities. The parent class is `evennia.DefaultScript`. -## Simple storage script +### Simple storage script In `mygame/typeclasses/scripts.py` is an empty `Script` class already set up. You can use this as a base for your own scripts. @@ -303,7 +303,7 @@ You can also attach the script as part of creating it: create_script('typeclasses.weather.Weather', obj=myroom) ``` -# Other Script methods +## Other Script methods A Script has all the properties of a typeclassed object, such as `db` and `ndb`(see [Typeclasses](./Typeclasses.md)). Setting `key` is useful in order to manage scripts (delete them by name @@ -330,7 +330,7 @@ Typeclassed entities. See also the methods involved in controlling a [Timed Script](#timed-scripts) above. -# The GLOBAL_SCRIPTS container +## The GLOBAL_SCRIPTS container A Script not attached to another entity is commonly referred to as a _Global_ script since it't available to access from anywhere. This means they need to be searched for in order to be used. @@ -413,7 +413,7 @@ That is, if the script is deleted, next time you get it from `GLOBAL_SCRIPTS`, E information in settings to recreate it for you on the fly. -# Hints: Dealing with Script Errors +## Hints: Dealing with Script Errors Errors inside a timed, executing script can sometimes be rather terse or point to parts of the execution mechanism that is hard to interpret. One way to make it diff --git a/docs/source/Howtos/Beginner-Tutorial/Part1/Adding-Commands.md b/docs/source/Howtos/Beginner-Tutorial/Part1/Adding-Commands.md index dbd7c88d3b..404f252b5f 100644 --- a/docs/source/Howtos/Beginner-Tutorial/Part1/Adding-Commands.md +++ b/docs/source/Howtos/Beginner-Tutorial/Part1/Adding-Commands.md @@ -9,9 +9,9 @@ what is in it. ```{sidebar} Commands are not typeclassed - If you just came from the previous lesson, you might want to know that Commands and - CommandSets are not `typeclassed`. That is, instances of them are not saved to the - database. They are "just" normal Python classes. +If you just came from the previous lesson, you might want to know that Commands and +CommandSets are not `typeclassed`. That is, instances of them are not saved to the +database. They are "just" normal Python classes. ``` In Evennia, a Command is a Python _class_. If you are unsure about what a class is, review the @@ -271,7 +271,9 @@ Here, `` would be the one using the `hit` command and `` is the Still in `mygame/commands/mycommands.py`, add a new class, between `CmdEcho` and `MyCmdSet`. -```python +```{code-block} python +:linenos: + # ... class CmdHit(Command): @@ -299,30 +301,30 @@ class CmdHit(Command): ``` A lot of things to dissect here: -- **Line 4**: The normal `class` header. We inherit from `Command` which we imported at the top of this file. -- **Lines 5**-11: The docstring and help-entry for the command. You could expand on this as much as you wanted. -- **Line 12**: We want to write `hit` to use this command. -- **Line 15**: We strip the whitespace from the argument like before. Since we don't want to have to do +- **Line 3**: The normal `class` header. We inherit from `Command` which we imported at the top of this file. +- **Lines 4-10**: The docstring and help-entry for the command. You could expand on this as much as you wanted. +- **Line 11**: We want to write `hit` to use this command. +- **Line 14**: We strip the whitespace from the argument like before. Since we don't want to have to do `self.args.strip()` over and over, we store the stripped version in a _local variable_ `args`. Note that we don't modify `self.args` by doing this, `self.args` will still have the whitespace and is not the same as `args` in this example. ```{sidebar} if-statements - The full form of the if statement is +The full form of the if statement is - if condition: - ... - elif othercondition: - ... - else: - ... +if condition: + ... +elif othercondition: + ... +else: + ... - There can be any number of `elifs` to mark when different branches of the code should run. If - the `else` condition is given, it will run if none of the other conditions was truthy. In Python - the `if..elif..else` structure also serves the same function as `case` in some other languages. +There can be any number of `elifs` to mark when different branches of the code should run. If +the `else` condition is given, it will run if none of the other conditions was truthy. In Python +the `if..elif..else` structure also serves the same function as `case` in some other languages. ``` -- **Line 16** has our first _conditional_, an `if` statement. This is written on the form `if :` and only +- **Line 15** has our first _conditional_, an `if` statement. This is written on the form `if :` and only if that condition is 'truthy' will the indented code block under the `if` statement run. To learn what is truthy in Python it's usually easier to learn what is "falsy": - `False` - this is a reserved boolean word in Python. The opposite is `True`. @@ -334,12 +336,12 @@ A lot of things to dissect here: Line 16's condition is `not args`. The `not` _inverses_ the result, so if `args` is the empty string (falsy), the whole conditional becomes truthy. Let's continue in the code: -- **Lines 17-18**: This code will only run if the `if` statement is truthy, in this case if `args` is the empty string. -- **Line 18**: `return` is a reserved Python word that exits `func` immediately. -- **Line 19**: We use `self.caller.search` to look for the target in the current location. -- **Lines 20-21**: A feature of `.search` is that it will already inform `self.caller` if it couldn't find the target. +- **Lines 16-17**: This code will only run if the `if` statement is truthy, in this case if `args` is the empty string. +- **Line 17**: `return` is a reserved Python word that exits `func` immediately. +- **Line 18**: We use `self.caller.search` to look for the target in the current location. +- **Lines 19-20**: A feature of `.search` is that it will already inform `self.caller` if it couldn't find the target. In that case, `target` will be `None` and we should just directly `return`. -- **Lines 22-23**: At this point we have a suitable target and can send our punching strings to each. +- **Lines 21-22**: At this point we have a suitable target and can send our punching strings to each. Finally we must also add this to a CmdSet. Let's add it to `MyCmdSet` which we made persistent earlier. @@ -356,12 +358,12 @@ class MyCmdSet(CmdSet): ```{sidebar} Errors in your code - With longer code snippets to try, it gets more and more likely you'll - make an error and get a `traceback` when you reload. This will either appear - directly in-game or in your log (view it with `evennia -l` in a terminal). - Don't panic; tracebacks are your friends - they are to be read bottom-up and usually describe - exactly where your problem is. Refer to `The Python intro `_ for - more hints. If you get stuck, reach out to the Evennia community for help. +With longer code snippets to try, it gets more and more likely you'll +make an error and get a `traceback` when you reload. This will either appear +directly in-game or in your log (view it with `evennia -l` in a terminal). +Don't panic; tracebacks are your friends - they are to be read bottom-up and usually describe +exactly where your problem is. Refer to `The Python intro `_ for +more hints. If you get stuck, reach out to the Evennia community for help. ``` diff --git a/docs/source/_static/basic.css b/docs/source/_static/basic.css index 5abb60d1aa..9f42944a9b 100644 --- a/docs/source/_static/basic.css +++ b/docs/source/_static/basic.css @@ -668,11 +668,12 @@ span.pre { } td.linenos pre { - padding: 5px 0px; + padding 5px, 0px; border: 0; background-color: transparent; color: #aaa; -webkit-box-shadow: 0px 0px 0px #fff; + font-size: 1.4em; } table.highlighttable {