Clean up api doc header suprocessing, other fixes
This commit is contained in:
parent
ba717a437e
commit
dd6a7875bf
8 changed files with 332 additions and 57 deletions
|
|
@ -36,12 +36,13 @@ primarily be accessed as link refs (e.g. `Component/Account`)
|
||||||
- `source/Howtos/` holds docs that describe how to achieve a specific goal, effect or
|
- `source/Howtos/` holds docs that describe how to achieve a specific goal, effect or
|
||||||
result in Evennia. This is often on a tutorial or FAQ form and will refer to the rest of the
|
result in Evennia. This is often on a tutorial or FAQ form and will refer to the rest of the
|
||||||
documentation for further reading.
|
documentation for further reading.
|
||||||
- `source/Howtos/StartingTutorial/` holds all documents part of the initial tutorial sequence.
|
- `source/Howtos/Starting/` holds all documents part of the initial tutorial sequence.
|
||||||
|
|
||||||
|
|
||||||
Other files and folders:
|
Other files and folders:
|
||||||
- `source/api/` contains the auto-generated API documentation as `.rst` files. Don't edit these
|
- `source/api/` contains the auto-generated API documentation as `.rst` files. Don't edit these
|
||||||
files manually, your changes will be lost.
|
files manually, your changes will be lost. To refer to these files, use `api:` followed by
|
||||||
|
the Python path, for example `[rpsystem contrib](api:evennia.contrib.rpsystem)`.
|
||||||
- `source/_templates` and `source/_static` should not be modified unless adding a new doc-page
|
- `source/_templates` and `source/_static` should not be modified unless adding a new doc-page
|
||||||
feature or changing the look of the HTML documentation.
|
feature or changing the look of the HTML documentation.
|
||||||
- `conf.py` holds the Sphinx configuration. It should usually not be modified except to update
|
- `conf.py` holds the Sphinx configuration. It should usually not be modified except to update
|
||||||
|
|
@ -62,7 +63,7 @@ not hard and is very readable on its raw text-form.
|
||||||
|
|
||||||
You can furthermore get a good feel for how things will look using a
|
You can furthermore get a good feel for how things will look using a
|
||||||
Markdown-viewer like [Grip][grip]. Editors like [ReText][retext] or IDE's like
|
Markdown-viewer like [Grip][grip]. Editors like [ReText][retext] or IDE's like
|
||||||
[PyCharm][pycharm] also have Markdown previews. Building the docs locally is
|
[PyCharm][pycharm] also have native Markdown previews. Building the docs locally is
|
||||||
however the only way to make sure the outcome is exactly as you expect. The process
|
however the only way to make sure the outcome is exactly as you expect. The process
|
||||||
will also find any mistakes you made, like making a typo in a link.
|
will also find any mistakes you made, like making a typo in a link.
|
||||||
|
|
||||||
|
|
@ -98,13 +99,17 @@ done in your terminal/console.
|
||||||
|
|
||||||
The full documentation includes both the doc pages and the API documentation
|
The full documentation includes both the doc pages and the API documentation
|
||||||
generated from the Evennia source. For this you must install Evennia and
|
generated from the Evennia source. For this you must install Evennia and
|
||||||
initialize a new game with a default database (you don't need to have it
|
initialize a new game with a default database (you don't need to have any server
|
||||||
running)
|
running)
|
||||||
|
|
||||||
- Follow the normal [Evennia Getting-Started instructions][getting-started]
|
- It's recommended that you use a virtualenv. Install your cloned version of Evennia into
|
||||||
to install Evennia into a virtualenv. Get back here once everything is installed but
|
by pointing to the repo folder (the one containing `/docs`):
|
||||||
before creating a new game.
|
|
||||||
- Make sure you `cd` to the folder _containing_ your `evennia/` repo (so two levels
|
```
|
||||||
|
pip install -e evennia
|
||||||
|
```
|
||||||
|
|
||||||
|
- Make sure you are in the parent folder _containing_ your `evennia/` repo (so _two_ levels
|
||||||
up from `evennia/docs/`).
|
up from `evennia/docs/`).
|
||||||
- Create a new game folder called exactly `gamedir` at the same level as your `evennia`
|
- Create a new game folder called exactly `gamedir` at the same level as your `evennia`
|
||||||
repo with
|
repo with
|
||||||
|
|
@ -113,8 +118,8 @@ repo with
|
||||||
evennia --init gamedir
|
evennia --init gamedir
|
||||||
```
|
```
|
||||||
|
|
||||||
- Then `cd` into it and create a new, empty database. You don't need to start the game
|
- Then `cd` into it and create a new, empty database. You don't need to start the
|
||||||
or do any further changes.
|
game or do any further changes after this.
|
||||||
|
|
||||||
```
|
```
|
||||||
evennia migrate
|
evennia migrate
|
||||||
|
|
@ -130,11 +135,10 @@ repo with
|
||||||
----- gamedir/
|
----- gamedir/
|
||||||
```
|
```
|
||||||
|
|
||||||
If you are already working on a game, you may of course have your 'real' game folder there as
|
(If you are already working on a game, you may of course have your 'real' game folder there as
|
||||||
well. We won't touch that.
|
well. We won't touch that.)
|
||||||
|
|
||||||
- Make sure you are still in your virtualenv, then go to `evennia/docs/` and
|
- Go to `evennia/docs/` and install the doc-building requirements (you only need to do this once):
|
||||||
install the doc-building requirements:
|
|
||||||
|
|
||||||
```
|
```
|
||||||
make install
|
make install
|
||||||
|
|
@ -180,8 +184,8 @@ docs are built by looking at the git tree.
|
||||||
make mv-local
|
make mv-local
|
||||||
```
|
```
|
||||||
|
|
||||||
This is as close to the 'real' version as you can get locally. The different versions
|
This is as close to the 'real' version of the docs as you can get locally. The different versions
|
||||||
will be found under `evennia/docs/build`. During deploy a symlink `latest` will point
|
will be found under `evennia/docs/build/versions/`. During deploy a symlink `latest` will point
|
||||||
to the latest version of the docs.
|
to the latest version of the docs.
|
||||||
|
|
||||||
#### Release
|
#### Release
|
||||||
|
|
@ -221,16 +225,16 @@ We generally use underscores for italics and double-asterisks for bold:
|
||||||
### Headings
|
### Headings
|
||||||
|
|
||||||
We use `#` to indicate sections/headings. The more `#` the more of a sub-heading it is (will get
|
We use `#` to indicate sections/headings. The more `#` the more of a sub-heading it is (will get
|
||||||
smaller
|
smaller and smaller font).
|
||||||
and smaller font).
|
|
||||||
|
|
||||||
- `# Heading`
|
- `# Heading`
|
||||||
- `## SubHeading`
|
- `## SubHeading`
|
||||||
- `## SubSubHeading`
|
- `### SubSubHeading`
|
||||||
|
- `#### SubSubSubHeading`
|
||||||
|
|
||||||
> Don't reuse the same heading/subheading name over and over in the same document. While Markdown
|
> Don't use the same heading/subheading name more than once in one page. While Markdown
|
||||||
does not prevent
|
does not prevent it, it will make it impossible to refer to that heading uniquely.
|
||||||
it, it makes it impossible to link to those duplicates properly (see next section).
|
The Evennia documentation preparser will detect this and give you an error.
|
||||||
|
|
||||||
### Lists
|
### Lists
|
||||||
|
|
||||||
|
|
@ -283,13 +287,13 @@ full `http://` linking unless really referring to an external resource.
|
||||||
|
|
||||||
You can point to sub-sections (headings) in a document by using a single `#` and the name of the
|
You can point to sub-sections (headings) in a document by using a single `#` and the name of the
|
||||||
heading, replacing spaces with dashes. So to refer to a heading `## Cool Stuff` inside `My-Document`
|
heading, replacing spaces with dashes. So to refer to a heading `## Cool Stuff` inside `My-Document`
|
||||||
would be a link `[cool stuff](My-Document#Cool-Stuff)`.
|
would be a link `[cool stuff](My-Document#Cool-Stuff)`. This is why headings must be uniquely named
|
||||||
|
within on document.
|
||||||
|
|
||||||
- `[linktext][linkref]` - refer to a reference defined later in the document.
|
- `[linktext][linkref]` - refer to a reference defined later in the document.
|
||||||
|
|
||||||
Urls can get long and if you are using the same url in many places it can get a little cluttered. So
|
Urls can get long and if you are using the same url in many places it can get a little cluttered. So
|
||||||
you can also put
|
you can also put the url as a 'footnote' at the end of your document
|
||||||
the url as a 'footnote' at the end of your document
|
|
||||||
and refer to it by putting your reference within square brackets `[ ]`. Here's an example:
|
and refer to it by putting your reference within square brackets `[ ]`. Here's an example:
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
@ -298,7 +302,7 @@ This is a [clickable link][mylink]. This is [another link][1].
|
||||||
...
|
...
|
||||||
|
|
||||||
|
|
||||||
[mylink](http://...)
|
[mylink]: http://...
|
||||||
[1]: My-Document
|
[1]: My-Document
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
@ -309,8 +313,8 @@ The Evennia documentation supports some special reference shortcuts in links:
|
||||||
|
|
||||||
##### Github online repository
|
##### Github online repository
|
||||||
|
|
||||||
- `github:` - a shortcut for the full path to the Evennia repository on github. This will refer to
|
- `github:` - a shortcut for the full path to the Evennia repository on github. This must be given
|
||||||
the `master` branch by default:
|
with forward-slashes and include the `.py` file ending. It will refer to the `master` branch by default:
|
||||||
|
|
||||||
[link to objects.py](github:evennia/objects/objects.py)
|
[link to objects.py](github:evennia/objects/objects.py)
|
||||||
|
|
||||||
|
|
@ -328,21 +332,18 @@ The Evennia documentation supports some special reference shortcuts in links:
|
||||||
This will create a link to the auto-generated `evennia/source/api/evennia.objects.rst` document.
|
This will create a link to the auto-generated `evennia/source/api/evennia.objects.rst` document.
|
||||||
|
|
||||||
Since api-docs are generated alongside the documentation, this will always be the api docs for
|
Since api-docs are generated alongside the documentation, this will always be the api docs for
|
||||||
the
|
the current version/branch of the docs.
|
||||||
current version/branch of the docs.
|
|
||||||
|
|
||||||
##### Bug reports/feature request
|
##### Bug reports/feature request
|
||||||
|
|
||||||
|
|
||||||
- `issue`, `bug-report`, `feature-request` - links to the same github issue select page.
|
- `github:issue` - links to the github issue selection page, where the user can choose which type of
|
||||||
|
issue to create.
|
||||||
|
|
||||||
If you find a problem, make a [bug report](github:issue)!
|
If you find a problem, make a [bug report](github:issue)!
|
||||||
|
|
||||||
This will generate a link to https://github.com/evennia/evennia/issues/new/choose.
|
This will generate a link to https://github.com/evennia/evennia/issues/new/choose.
|
||||||
|
|
||||||
> For some reason these particular shortcuts gives a warning during documentation compilation. This
|
|
||||||
> can be ignored.
|
|
||||||
|
|
||||||
### Verbatim text
|
### Verbatim text
|
||||||
|
|
||||||
It's common to want to mark something to be displayed verbatim - just as written - without any
|
It's common to want to mark something to be displayed verbatim - just as written - without any
|
||||||
|
|
@ -396,13 +397,13 @@ def a_python_func(x):
|
||||||
Markdown is easy to read and use. But while it does most of what we need, there are some things it's
|
Markdown is easy to read and use. But while it does most of what we need, there are some things it's
|
||||||
not quite as expressive as it needs to be. For this we need to fall back to the [ReST][ReST] markup
|
not quite as expressive as it needs to be. For this we need to fall back to the [ReST][ReST] markup
|
||||||
language which the documentation system uses under the hood. This is done by specifying `eval_rst`
|
language which the documentation system uses under the hood. This is done by specifying `eval_rst`
|
||||||
as
|
as the name of the `language` of a literal block:
|
||||||
the name of the `language` of a literal block:
|
|
||||||
|
|
||||||
````
|
````
|
||||||
```eval_rst
|
```eval_rst
|
||||||
|
|
||||||
This will be evaluated as ReST.
|
This will be evaluated as ReST.
|
||||||
|
All content must be indented.
|
||||||
|
|
||||||
```
|
```
|
||||||
````
|
````
|
||||||
|
|
@ -413,13 +414,23 @@ There is also a short-hand form for starting a [ReST directive][ReST-directives]
|
||||||
````
|
````
|
||||||
```directive:: possible-option
|
```directive:: possible-option
|
||||||
|
|
||||||
Content that *must* be indented for it to be included in the directive.
|
Content *must* be indented for it to be included in the directive.
|
||||||
|
|
||||||
New lines are ignored except if separated by an empty line.
|
New lines are ignored, empty lines starts a new paragraph.
|
||||||
```
|
```
|
||||||
````
|
````
|
||||||
|
|
||||||
See below for examples of this.
|
Within a ReST block, one must use Restructured Text syntax, which is not the same as Markdown.
|
||||||
|
|
||||||
|
- Single backticks around text makes it _italic_.
|
||||||
|
- Double backticks around text makes it `verbatim`.
|
||||||
|
- A link is written within back-ticks, with an underscore at the end:
|
||||||
|
|
||||||
|
`python <www.python.org>`_
|
||||||
|
|
||||||
|
[Here is a ReST formatting cheat sheet](https://thomas-cokelaer.info/tutorials/sphinx/rest_syntax.html).
|
||||||
|
|
||||||
|
Below are examples of ReST-block structures.
|
||||||
|
|
||||||
#### Note
|
#### Note
|
||||||
|
|
||||||
|
|
@ -598,9 +609,9 @@ or the more flexible but verbose
|
||||||
|
|
||||||
#### A more flexible code block
|
#### A more flexible code block
|
||||||
|
|
||||||
The regular Markdown codeblock is usually enough but for more direct control over the style, one
|
The regular Markdown Python codeblock is usually enough but for more direct control over the style, one
|
||||||
can also specify the code block explicitly in `ReST`.
|
can also specify the code block explicitly in `ReST` for more flexibility.
|
||||||
for more flexibility. It also provides a link to the code block, identified by its name.
|
It also provides a link to the code block, identified by its name.
|
||||||
|
|
||||||
|
|
||||||
````
|
````
|
||||||
|
|
@ -642,11 +653,21 @@ this
|
||||||
block through the link that will appear (so it should be unique for a give document).
|
block through the link that will appear (so it should be unique for a give document).
|
||||||
|
|
||||||
> The default markdown syntax will actually generate a code-block ReST instruction like this
|
> The default markdown syntax will actually generate a code-block ReST instruction like this
|
||||||
> automatically for us behind the scenes. The automatic generation can't know things like emphasize-
|
> automatically for us behind the scenes. But the automatic generation can't know things like emphasize-
|
||||||
lines
|
lines or captions since that's not a part of the Markdown specification.
|
||||||
> or caption since that's not a part of the Markdown specification.
|
|
||||||
|
|
||||||
# Technical
|
## Code documentation
|
||||||
|
|
||||||
|
The source code docstrings will be parsed as Markdown. When writing a module docstring, you can use Markdown formatting,
|
||||||
|
including header levels down to 4th level (`#### SubSubSubHeader`). After the module documentation it's
|
||||||
|
a good idea to end with four dashes `----`. This will create a visible line between the documentation and the
|
||||||
|
class/function docs to follow. See for example [the Traits docs](api:evennia.contrib.traits).
|
||||||
|
|
||||||
|
All non-private classes, methods and functions must have a Google-style docstring, as per the
|
||||||
|
[Evennia coding style guidelines][github:evennia/CODING_STYLE.md]. This will then be correctly formatted
|
||||||
|
into pretty api docs.
|
||||||
|
|
||||||
|
## Technical
|
||||||
|
|
||||||
Evennia leverages [Sphinx][sphinx] with the [recommonmark][recommonmark] extension, which allows us
|
Evennia leverages [Sphinx][sphinx] with the [recommonmark][recommonmark] extension, which allows us
|
||||||
to write our
|
to write our
|
||||||
|
|
|
||||||
|
|
@ -48,12 +48,12 @@ world is "about": The theme, the world concept, cool monsters and so on. Such th
|
||||||
unfortunately, they are not enough to make your game. You need to figure out how to accomplish your ideas in
|
unfortunately, they are not enough to make your game. You need to figure out how to accomplish your ideas in
|
||||||
Evennia.
|
Evennia.
|
||||||
|
|
||||||
Below are some questions to get you going. Depending on your game, there are many more possible questions you
|
Below are some questions to get you going. In the next lesson we will try to answer them for our particular
|
||||||
could ask yourself.
|
tutorial game. There are of course many more questions you could be asking yourself.
|
||||||
|
|
||||||
### Administration
|
### Administration
|
||||||
|
|
||||||
- Should your game rules be enforced by coded systems by human game masters?
|
- Should your game rules be enforced by coded systems or by human game masters?
|
||||||
- What is the staff hierarchy in your game? Is vanilla Evennia roles enough or do you need something else?
|
- What is the staff hierarchy in your game? Is vanilla Evennia roles enough or do you need something else?
|
||||||
- Should players be able to post out-of-characters on channels and via other means like bulletin-boards?
|
- Should players be able to post out-of-characters on channels and via other means like bulletin-boards?
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,255 @@
|
||||||
|
[prev lesson](./Planning-The-Tutorial-Game) | [next lesson](../Starting-Part3)
|
||||||
|
|
||||||
|
# Planning the use of some useful contribs
|
||||||
|
|
||||||
|
Evennia is deliberately bare-bones out of the box. The idea is that you should be as unrestricted as possible
|
||||||
|
in designing your game. This is why you can easily replace the few defaults we have and why we don't try to
|
||||||
|
prescribe any major game systems on you.
|
||||||
|
|
||||||
|
That said, Evennia _does_ offer some more game-opinionated _optional_ stuff. These are referred to as _Contribs_
|
||||||
|
and is an ever-growing treasure trove of code snippets, concepts and even full systems you can pick and choose
|
||||||
|
from to use, tweak or take inspiration from when you make your game.
|
||||||
|
|
||||||
|
The [Contrib overview](../../../Contribs/Contrib-Overview) page gives the full list of the current roster of contributions. On
|
||||||
|
this page we will review a few contribs we will make use of for our game. We will do the actual installation
|
||||||
|
of them when we start coding in the next part of this tutorial series. While we will introduce them here, you
|
||||||
|
are wise to read their doc-strings yourself for the details.
|
||||||
|
|
||||||
|
This is the things we know we need:
|
||||||
|
|
||||||
|
- A barter system
|
||||||
|
- Character generation
|
||||||
|
- Some concept of wearing armor
|
||||||
|
- The ability to roll dice
|
||||||
|
- Rooms with awareness of day, night and season
|
||||||
|
- Roleplaying with short-descs, poses and emotes
|
||||||
|
- Quests
|
||||||
|
- Combat (with players and against monsters)
|
||||||
|
|
||||||
|
## Barter contrib
|
||||||
|
|
||||||
|
[source](api:evennia.contrib.barter)
|
||||||
|
|
||||||
|
Reviewing this contrib suggests that it allows for safe trading between two parties. The basic principle
|
||||||
|
is that the parties puts up the stuff they want to sell and the system will guarantee that these systems are
|
||||||
|
exactly what is being offered. Both sides can modify their offers (bartering) until both mark themselves happy
|
||||||
|
with the deal. Only then the deal is sealed and the objects are exchanged automatically. Interestingly, this
|
||||||
|
works just fine for money too - just put coin objects on one side of the transaction.
|
||||||
|
|
||||||
|
Sue > trade Tom: Hi, I have a necklace to sell; wanna trade for a healing potion?
|
||||||
|
Tom > trade Sue: Hm, I could use a necklace ...
|
||||||
|
<both accepted trade. Start trade>
|
||||||
|
Sue > offer necklace: This necklace is really worth it.
|
||||||
|
Tom > evaluate necklace:
|
||||||
|
<Tom sees necklace stats>
|
||||||
|
Tom > offer ration: I don't have a healing potion, but I'll trade you an iron ration!
|
||||||
|
Sue > Hey, this is a nice necklace, I need more than a ration for it...
|
||||||
|
Tom > offer ration, 10gold: Ok, a ration and 10 gold as well.
|
||||||
|
Sue > accept: Ok, that sounds fair!
|
||||||
|
Tom > accept: Good! Nice doing business with you.
|
||||||
|
<goods change hands automatically. Trade ends>
|
||||||
|
|
||||||
|
Arguably, in a small game you are just fine to just talk to people and use `give` to do the exchange. The
|
||||||
|
barter system guarantees trading safety if you don't trust your counterpart to try to give you the wrong thing or
|
||||||
|
to run away with your money.
|
||||||
|
|
||||||
|
We will use the barter contrib as an optional feature for player-player bartering. More importantly we can
|
||||||
|
add it for NPC shopkeepers and expand it with a little AI, which allows them to potentially trade in other
|
||||||
|
things than boring gold coin.
|
||||||
|
|
||||||
|
## Character generation contrib
|
||||||
|
|
||||||
|
[source](api:evennia.contrib.chargen)
|
||||||
|
|
||||||
|
This contrib is an example module for creating characters. Since we will be using `MULTISESSION_MODE=3` we will
|
||||||
|
get a selection screen like this automatically. We also plan to use a proper menu to build our character, so
|
||||||
|
we will _not_ be using this contrib.
|
||||||
|
|
||||||
|
## Clothing contrib
|
||||||
|
|
||||||
|
[source](api:evennia.contrib.clothing)
|
||||||
|
|
||||||
|
This contrib provides a full system primarily aimed at wearing clothes, but it could also work for armor. You wear
|
||||||
|
an object in a particular location and this will then be reflected in your character's description. You can
|
||||||
|
also add roleplaying flavor:
|
||||||
|
|
||||||
|
> wear helmet slightly askew on her head
|
||||||
|
look self
|
||||||
|
Username is wearing a helmet slightly askew on her head.
|
||||||
|
|
||||||
|
By default there are no 'body locations' in this contrib, we will need to expand on it a little to make it useful
|
||||||
|
for things like armor. It's a good contrib to build from though, so that's what we'll do.
|
||||||
|
|
||||||
|
## Dice contrib
|
||||||
|
|
||||||
|
[source](api:evennia.contrib.dice)
|
||||||
|
|
||||||
|
The dice contrib presents a general dice roller to use in game.
|
||||||
|
|
||||||
|
> roll 2d6
|
||||||
|
Roll(s): 2 and 5. Total result is 7.
|
||||||
|
> roll 1d100 + 2
|
||||||
|
Roll(s): 43. Total result is 47
|
||||||
|
> roll 1d20 > 12
|
||||||
|
Roll(s): 7. Total result is 7. This is a failure (by 5)
|
||||||
|
> roll/hidden 1d20 > 12
|
||||||
|
Roll(s): 18. Total result is 17. This is a success (by 6). (not echoed)
|
||||||
|
|
||||||
|
The contrib also has a python function for producing these results in-code. However, while
|
||||||
|
we will emulate rolls for our rule system, we'll do this as simply as possible with Python's `random`
|
||||||
|
module.
|
||||||
|
|
||||||
|
So while this contrib is fun to have around for GMs or for players who want to get a random result
|
||||||
|
or play a game, we will not need it for the core of our game.
|
||||||
|
|
||||||
|
## Extended room contrib
|
||||||
|
|
||||||
|
[source](api:evennia.contrib.extended_room)
|
||||||
|
|
||||||
|
This is a custom Room typeclass that changes its description based on time of day and season.
|
||||||
|
|
||||||
|
For example, at night, in wintertime you could show the room as being dark and frost-covered while in daylight
|
||||||
|
at summer it could describe a flowering meadow. The description can also contain special markers, so
|
||||||
|
`<morning> ... </morning>` would include text only visible at morning.
|
||||||
|
|
||||||
|
The extended room also supports _details_, which are things to "look at" in the room without there having
|
||||||
|
to be a separate database object created for it. For example, a player in a church may do `look window` and
|
||||||
|
get a description of the windows without there needing to be an actual `window` object in the room.
|
||||||
|
|
||||||
|
Adding all those extra descriptions can be a lot of work, so they are optional; if not given the room works
|
||||||
|
like a normal room.
|
||||||
|
|
||||||
|
The contrib is simple to add and provides a lot of optional flexibility, so we'll add it to our
|
||||||
|
game, why not!
|
||||||
|
|
||||||
|
## RP-System contrib
|
||||||
|
|
||||||
|
[source](api:evennia.contrib.rpsystem)
|
||||||
|
|
||||||
|
This contrib adds a full roleplaying subsystem to your game. It gives every character a "short-description"
|
||||||
|
(sdesc) that is what people will see when first meeting them. Let's say Tom has an sdesc "A tall man" and
|
||||||
|
Sue has the sdesc "A muscular, blonde woman"
|
||||||
|
|
||||||
|
Tom > look
|
||||||
|
Tom: <room desc> ... You see: A muscular, blonde woman
|
||||||
|
Tom > emote /me smiles to /muscular.
|
||||||
|
Tom: Tom smiles to A muscular, blonde woman.
|
||||||
|
Sue: A tall man smiles to Sue.
|
||||||
|
Tom > emote Leaning forward, /me says, "Well hello, what's yer name?"
|
||||||
|
Tom: Leaning forward, Tom says, "Well hello..."
|
||||||
|
Sue: Leaning forward, A tall man says, "Well hello, what's yer name?"
|
||||||
|
Sue > emote /me grins. "I'm Angelica", she says.
|
||||||
|
Sue: Sue grins. "I'm Angelica", she says.
|
||||||
|
Tom: A muscular, blonde woman grins. "I'm Angelica", she says.
|
||||||
|
Tom > recog muscular Angelica
|
||||||
|
Tom > emote /me nods to /angelica: "I have a message for you ..."
|
||||||
|
Tom: Tom nods to Angelica: "I have a message for you ..."
|
||||||
|
Sue: A tall man nods to Sue: "I have a message for you ..."
|
||||||
|
|
||||||
|
Above, Sue introduces herself as "Angelica" and Tom uses this info to `recoc` her as "Angelica" hereafter. He
|
||||||
|
could have `recoc`-ed her with whatever name he liked - it's only for his own benefit. There is no separate
|
||||||
|
`say`, the spoken words are embedded in the emotes in quotes `"..."`.
|
||||||
|
|
||||||
|
The RPSystem module also includes options for `poses`, which help to establish your position in the room
|
||||||
|
when others look at you.
|
||||||
|
|
||||||
|
Tom > pose stands by the bar, looking bored.
|
||||||
|
Sue > look
|
||||||
|
Sue: <room desc> ... A tall man stands by the bar, looking bored.
|
||||||
|
|
||||||
|
You can also wear a mask to hide your identity; your sdesc will then be changed to the sdesc of the mask,
|
||||||
|
like `a person with a mask`.
|
||||||
|
|
||||||
|
The RPSystem gives a lot of roleplaying power out of the box, so we will add it. There is also a separate
|
||||||
|
[rplanguage](api:evennia.contrib.rplanguage) module that integrates with the spoken words in your emotes and garbles them if you don't understand
|
||||||
|
the language spoken. In order to restrict the scope we will not include languages for the tutorial game.
|
||||||
|
|
||||||
|
|
||||||
|
## Talking NPC contrib
|
||||||
|
|
||||||
|
[source](api:evennia.contrib.talking_npc)
|
||||||
|
|
||||||
|
This exemplifies an NPC with a menu-driven dialogue tree. We will not use this contrib explicitly, but it's
|
||||||
|
good as inspiration for how we'll do quest-givers later.
|
||||||
|
|
||||||
|
## Traits contrib
|
||||||
|
|
||||||
|
[source](api:evennia.contrib.traits)
|
||||||
|
|
||||||
|
An issue with dealing with roleplaying attributes like strength, dexterity, or skills like hunting, sword etc
|
||||||
|
is how to keep track of the values in the moment. Your strength may temporarily be buffed by a strength-potion.
|
||||||
|
Your swordmanship may be worse because you are encumbered. And when you drink your health potion you must make
|
||||||
|
sure that those +20 health does not bring your health higher than its maximum. All this adds complexity.
|
||||||
|
|
||||||
|
The _Traits_ contrib consists of several types of objects to help track and manage values like this. When
|
||||||
|
installed, the traits are accessed on a new handler `.traits`, for example
|
||||||
|
|
||||||
|
> py self.traits.hp.value
|
||||||
|
100
|
||||||
|
> py self.traits.hp -= 20 # getting hurt
|
||||||
|
> py self.traits.hp.value
|
||||||
|
80
|
||||||
|
> py self.traits.hp.reset() # drink a potion
|
||||||
|
> py self.traits.hp.value
|
||||||
|
100
|
||||||
|
|
||||||
|
A Trait is persistent (it uses an Attribute under the hood) and tracks changes, min/max and other things
|
||||||
|
automatically. They can also be added together in various mathematical operations.
|
||||||
|
|
||||||
|
The contrib introduces three main Trait-classes
|
||||||
|
|
||||||
|
- _Static_ traits for single values like str, dex, things that at most gets a modifier.
|
||||||
|
- _Counters_ is a value that never moves outside a given range, even with modifiers. For example a skill
|
||||||
|
that can at most get a maximum amount of buff. Counters can also easily be _timed_ so that they decrease
|
||||||
|
or increase with a certain rate per second. This could be good for a time-limited curse for example.
|
||||||
|
- _Gauge_ is like a fuel-gauge; it starts at a max value and then empties gradually. This is perfect for
|
||||||
|
things like health, stamina and the like. Gauges can also change with a rate, which works well for the
|
||||||
|
effects of slow poisons and healing both.
|
||||||
|
|
||||||
|
```
|
||||||
|
> py self.traits.hp.value
|
||||||
|
100
|
||||||
|
> py self.traits.hp.rate = -1 # poisoned!
|
||||||
|
> py self.traits.hp.ratetarget = 50 # stop at 50 hp
|
||||||
|
# Wait 30s
|
||||||
|
> py self.traits.hp.value
|
||||||
|
70
|
||||||
|
# Wait another 30s
|
||||||
|
> py self.traits.hp.value
|
||||||
|
50 # stopped at 50
|
||||||
|
> py self.traits.hp.rate = 0 # no more poison
|
||||||
|
> py self.traits.hp.rate = 5 # healing magic!
|
||||||
|
# wait 5s
|
||||||
|
> pyself.traits.hp.value
|
||||||
|
75
|
||||||
|
```
|
||||||
|
|
||||||
|
Traits will be very practical to use for our character sheets.
|
||||||
|
|
||||||
|
## Turnbattle contrib
|
||||||
|
|
||||||
|
[source](api:evennia.contrib.turnbattle)
|
||||||
|
|
||||||
|
This contrib consists of several implementations of a turn-based combat system, divivided into complexity:
|
||||||
|
|
||||||
|
- basic - initiative and turn order, attacks against defense values, damage.
|
||||||
|
- equip - considers weapons and armor, wielding and weapon accuracy.
|
||||||
|
- items - adds usable items with conditions and status effects
|
||||||
|
- magic - adds spellcasting system using MP.
|
||||||
|
- range - adds abstract positioning and 1D movement to differentiate between melee and ranged attacks.
|
||||||
|
|
||||||
|
The turnbattle system is comprehensive, but it's meant as a base to start from rather than offer
|
||||||
|
a complete system. It's also not built with _Traits_ in mind, so we will need to adjust it for that.
|
||||||
|
|
||||||
|
## Conclusions
|
||||||
|
|
||||||
|
With some contribs selected, we have pieces to build from and don't have to write everything from scratch.
|
||||||
|
We will need Quests and will likely need to do a bunch of work on Combat to adapt the combat contrib
|
||||||
|
to our needs.
|
||||||
|
|
||||||
|
We will now move into actually starting to implement our tutorial game
|
||||||
|
in the next part of this tutorial series. When doing this for yourself, remember to refer
|
||||||
|
back to your planning and adjust it as you learn what works and what does not.
|
||||||
|
|
||||||
|
|
||||||
|
[prev lesson](./Planning-The-Tutorial-Game) | [next lesson](../Starting-Part3)
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
[prev lesson](Game-Planningd) | [next lesson](../../../Unimplemented)
|
[prev lesson](./Game-Planning) | [next lesson](./Planning-Some-Useful-Contribs)
|
||||||
|
|
||||||
# Planning our tutorial game
|
# Planning our tutorial game
|
||||||
|
|
||||||
|
|
@ -411,4 +411,4 @@ Before starting to code in earnest a good coder should always do an inventory of
|
||||||
to code themselves. So in the next lesson we will check out what help we have from Evennia's _contribs_.
|
to code themselves. So in the next lesson we will check out what help we have from Evennia's _contribs_.
|
||||||
|
|
||||||
|
|
||||||
[prev lesson](Game-Planningd) | [next lesson](../../../Unimplemented)
|
[prev lesson](./Game-Planning) | [next lesson](./Planning-Some-Useful-Contribs)
|
||||||
|
|
@ -1,3 +0,0 @@
|
||||||
# Some useful contribs
|
|
||||||
|
|
||||||
TODO
|
|
||||||
|
|
@ -276,7 +276,7 @@ def autodoc_post_process_docstring(app, what, name, obj, options, lines):
|
||||||
doc = re.sub(r"```", "", doc, flags=re.MULTILINE)
|
doc = re.sub(r"```", "", doc, flags=re.MULTILINE)
|
||||||
doc = re.sub(r"`{1}", "**", doc, flags=re.MULTILINE)
|
doc = re.sub(r"`{1}", "**", doc, flags=re.MULTILINE)
|
||||||
doc = re.sub(
|
doc = re.sub(
|
||||||
r"^(?P<hashes>#{1,2})\s*?(?P<title>.*?)$", _sub_header, doc, flags=re.MULTILINE
|
r"^(?P<hashes>#{1,4})\s*?(?P<title>.*?)$", _sub_header, doc, flags=re.MULTILINE
|
||||||
)
|
)
|
||||||
|
|
||||||
newlines = doc.split("\n")
|
newlines = doc.split("\n")
|
||||||
|
|
|
||||||
|
|
@ -99,8 +99,8 @@
|
||||||
- [Howto/NPC shop Tutorial](Howto/NPC-shop-Tutorial)
|
- [Howto/NPC shop Tutorial](Howto/NPC-shop-Tutorial)
|
||||||
- [Howto/Parsing commands tutorial](Howto/Parsing-commands-tutorial)
|
- [Howto/Parsing commands tutorial](Howto/Parsing-commands-tutorial)
|
||||||
- [Howto/Starting/Part2/Game Planning](Howto/Starting/Part2/Game-Planning)
|
- [Howto/Starting/Part2/Game Planning](Howto/Starting/Part2/Game-Planning)
|
||||||
|
- [Howto/Starting/Part2/Planning Some Useful Contribs](Howto/Starting/Part2/Planning-Some-Useful-Contribs)
|
||||||
- [Howto/Starting/Part2/Planning The Tutorial Game](Howto/Starting/Part2/Planning-The-Tutorial-Game)
|
- [Howto/Starting/Part2/Planning The Tutorial Game](Howto/Starting/Part2/Planning-The-Tutorial-Game)
|
||||||
- [Howto/Starting/Part2/Some Useful Contribs](Howto/Starting/Part2/Some-Useful-Contribs)
|
|
||||||
- [Howto/Starting/Part3/A Sittable Object](Howto/Starting/Part3/A-Sittable-Object)
|
- [Howto/Starting/Part3/A Sittable Object](Howto/Starting/Part3/A-Sittable-Object)
|
||||||
- [Howto/Starting/Part3/Implementing a game rule system](Howto/Starting/Part3/Implementing-a-game-rule-system)
|
- [Howto/Starting/Part3/Implementing a game rule system](Howto/Starting/Part3/Implementing-a-game-rule-system)
|
||||||
- [Howto/Starting/Part3/Turn based Combat System](Howto/Starting/Part3/Turn-based-Combat-System)
|
- [Howto/Starting/Part3/Turn based Combat System](Howto/Starting/Part3/Turn-based-Combat-System)
|
||||||
|
|
|
||||||
|
|
@ -328,6 +328,8 @@ Reload the server and you should now be able to use your trait:
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
----
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue