Made several tutorial doc pages

This commit is contained in:
Griatch 2022-08-06 22:50:53 +02:00
parent fe9157da16
commit 39735626e1
393 changed files with 4534 additions and 170 deletions

View file

@ -0,0 +1,354 @@
# Player Characters
In the [previous lesson about rules and dice rolling](Beginner-Gutorial-Rules) we made some assumptions
about the "Player Character" entity:
- It should store Abilities on itself as `character.strength`, `character.constitution` etc.
- It should have a `.heal(amount)` method.
So we have some guidelines of how it should look! A Character is a database entity with values that
should be able to be changed over time. It makes sense to base it off Evennia's
[DefaultCharacter Typeclass](../../../Components/Typeclasses.md). The Character class is like a 'character sheet' in a tabletop
RPG, it will hold everything relevant to that PC.
## Inheritance structure
Player Characters (PCs) are not the only "living" things in our world. We also have _NPCs_
(like shopkeepers and other friendlies) as well as _monsters_ (mobs) that can attack us.
In code, there are a few ways we could structure this. If NPCs/monsters were just special cases of PCs,
we could use a class inheritance like this:
```python
from evennia import DefaultCharacter
class EvAdventureCharacter(DefaultCharacter):
# stuff
class EvAdventureNPC(EvAdventureCharacter):
# more stuff
class EvAdventureMob(EvAdventureNPC):
# more stuff
```
All code we put on the `Character` class would now be inherited to `NPC` and `Mob` automatically.
However, in _Knave_, NPCs and particularly monsters are _not_ using the same rules as PCs - they are
simplified to use a Hit-Die (HD) concept. So while still character-like, NPCs should be separate from
PCs like this:
```python
from evennia import DefaultCharacter
class EvAdventureCharacter(DefaultCharacter):
# stuff
class EvAdventureNPC(DefaultCharacter):
# separate stuff
class EvAdventureMob(EvadventureNPC):
# more separate stuff
```
Nevertheless, there are some things that _should_ be common for all 'living things':
- All can take damage.
- All can die.
- All can heal
- All can hold and lose coins
- All can loot their fallen foes.
- All can get looted when defeated.
We don't want to code this separately for every class but we no longer have a common parent
class to put it on. So instead we'll use the concept of a _mixin_ class:
```python
from evennia import DefaultCharacter
class LivingMixin:
# stuff common for all living things
class EvAdventureCharacter(LivingMixin, DefaultCharacter):
# stuff
class EvAdventureNPC(LivingMixin, DefaultCharacter):
# stuff
class EvAdventureMob(LivingMixin, EvadventureNPC):
# more stuff
```
```{sidebar}
In [evennia/contrib/tutorials/evadventure/characters.py](evennia.contrib.tutorials.evadventure.characters)
is an example of a character class structure.
```
Above, the `LivingMixin` class cannot work on its own - it just 'patches' the other classes with some
extra functionality all living things should be able to do. This is an example of
_multiple inheritance_. It's useful to know about, but one should not over-do multiple inheritance
since it can also get confusing to follow the code.
## Living mixin class
> Create a new module `mygame/evadventure/characters.py`
Let's get some useful common methods all living things should have in our game.
```python
# in mygame/evadventure/characters.py
from .rules import dice
class LivingMixin:
# makes it easy for mobs to know to attack PCs
is_pc = False
def heal(self, hp):
"""
Heal hp amount of health, not allowing to exceed our max hp
"""
damage = self.hp_max - self.hp
healed = min(damage, hp)
self.hp += healed
self.msg("You heal for {healed} HP.")
def at_pay(self, amount):
"""When paying coins, make sure to never detract more than we have"""
amount = min(amount, self.coins)
self.coins -= amount
return amount
def at_damage(self, damage, attacker=None):
"""Called when attacked and taking damage."""
self.hp -= damage
def at_defeat(self):
"""Called when defeated. By default this means death."""
self.at_death()
def at_death(self):
"""Called when this thing dies."""
# this will mean different things for different living things
pass
def at_do_loot(self, looted):
"""Called when looting another entity"""
looted.at_looted(self)
def at_looted(self, looter):
"""Called when looted by another entity"""
# default to stealing some coins
max_steal = dice.roll("1d10")
stolen = self.at_pay(max_steal)
looter.coins += stolen
```
Most of these are empty since they will behave differently for characters and npcs. But having them
in the mixin means we can expect these methods to be available for all living things.
## Character class
We will now start making the basic Character class, based on what we need from _Knave_.
```python
# in mygame/evadventure/characters.py
from evennia import DefaultCharacter, AttributeProperty
from .rules import dice
class LivingMixin:
# ...
class EvAdventureCharacter(LivingMixin, DefaultCharacter):
"""
A character to use for EvAdventure.
"""
is_pc = True
strength = AttributeProperty(1)
dexterity = AttributeProperty(1)
constitution = AttributeProperty(1)
intelligence = AttributeProperty(1)
wisdom = AttributeProperty(1)
charisma = AttributeProperty(1)
hp = AttributeProperty(8)
hp_max = AttributeProperty(8)
level = AttributeProperty(1)
xp = AttributeProperty(0)
coins = AttributeProperty(0)
def at_defeat(self):
"""Characters roll on the death table"""
if self.location.allow_death:
# this allow rooms to have non-lethal battles
dice.roll_death(self)
else:
self.location.msg_contents(
"$You() $conj(collapse) in a heap, alive but beaten.",
from_obj=self)
self.heal(self.hp_max)
def at_death(self):
"""We rolled 'dead' on the death table."""
self.location.msg_contents(
"$You() collapse in a heap, embraced by death.",
from_obj=self)
# TODO - go back into chargen to make a new character!
```
We make an assumption about our rooms here - that they have a property `.allow_death`. We need
to make a note to actually add such a property to rooms later!
In our `Character` class we implement all attributes we want to simulate from the _Knave_ ruleset.
The `AttributeProperty` is one way to add an Attribute in a field-like way; these will be accessible
on every character in several ways:
- As `character.strength`
- As `character.db.strength`
- As `character.attributes.get("strength")`
See [Attributes](../../../Components/Attributes.md) for seeing how Attributes work.
Unlike in base _Knave_, we store `coins` as a separate Attribute rather than as items in the inventory,
this makes it easier to handle barter and trading later.
We implement the Player Character versions of `at_defeat` and `at_death`. We also make use of `.heal()`
from the `LivingMixin` class.
### Funcparser inlines
This piece of code is worth some more explanation:
```python
self.location.msg_contents(
"$You() $conj(collapse) in a heap, alive but beaten.",
from_obj=self)
```
Remember that `self` is the Character instance here. So `self.location.msg_contents` means "send a
message to everything inside my current location". In other words, send a message to everyone
in the same place as the character.
The `$You() $conj(collapse)` are [Funcparser inlines](Funcparser). These are functions that execute
in the string. The resulting string may look different for different audiences. The `$You()` inline
function will use `from_obj` to figure out who 'you' are and either show your name or 'You'.
The `$conj()` (verb conjugator) will tweak the (English) verb to match.
- You will see: `"You collapse in a heap, alive but beaten."`
- Others in the room will see: `"Thomas collapses in a heap, alive but beaten."`
Note how `$conj()` chose `collapse/collapses` to make the sentences grammatically correct.
### Backtracking
We make our first use of the `rules.dice` roller to roll on the death table! As you may recall, in the
previous lesson, we didn't know just what to do when rolling 'dead' on this table. Now we know - we
should be calling `at_death` on the character. So let's add that where we had TODOs before:
```python
# mygame/evadventure/rules.py
class EvAdventureRollEngine:
# ...
def roll_death(self, character):
ability_name = self.roll_random_table("1d8", death_table)
if ability_name == "dead":
# kill the character!
character.at_death() # <------ TODO no more
else:
# ...
if current_ability < -10:
# kill the character!
character.at_death() # <------- TODO no more
else:
# ...
```
## Unit Testing
> Create a new module `mygame/evadventure/tests/test_characters.py`
For testing, we just need to create a new EvAdventure character and check
that calling the methods on it doesn't error out.
```python
# mygame/evadventure/tests/test_characters.py
from evennia.utils import create
from evennia.utils.test_resources import BaseEvenniaTest
from ..characters import EvAdventureCharacter
class TestCharacters(BaseEvenniaTest):
def setUp(self):
super().setUp()
self.character = create.create_object(EvAdventureCharacter, key="testchar")
def test_heal(self):
self.character.hp = 0
self.character.hp_max = 8
self.character.heal(1)
self.assertEqual(self.character.hp, 1)
# make sure we can't heal more than max
self.character.heal(100)
self.assertEqual(self.character.hp, 8)
def test_at_pay(self):
self.character.coins = 100
result = self.character.at_pay(60)
self.assertEqual(result, 60)
self.assertEqual(self.character.coins, 40)
# can't get more coins than we have
result = self.character.at_pay(100)
self.assertEqual(result, 40)
self.assertEqual(self.character.coins, 0)
# tests for other methods ...
```
If you followed the previous lessons, these tests should look familiar. Consider adding
tests for other methods as practice. Refer to previous lessons for details.
For running the tests you do:
evennia test --settings settings.py .evadventure.tests.test_character
## Summary
With the `EvAdventureCharacter` class in place, we have a better understanding of how our PCs will look
like under _Knave_.
For now, we only have bits and pieces and haven't been testing this code in-game. But if you want
you can swap yourself into `EvAdventureCharacter` right now. Log into your game and run
the command
type self = evadventure.characters.EvAdventureCharacter
If all went well, `ex self` will now show your typeclass as being `EvAdventureCharacter`.
Check out your strength with
py self.strength = 3
```{important}
When doing `ex self` you will _not_ see all your Abilities listed yet. That's because
Attributes added with `AttributeProperty` are not available until they have been accessed at
least once. So once you set (or look at) `.strength` above, `strength` will show in `examine` from
then on.
```

View file

@ -0,0 +1,120 @@
# Handling Equipment
In _Knave_, you have a certain number of inventory "slots". The amount of slots is given by `CON + 10`.
All items (except coins) have a `size`, indicating how many slots it uses. You can't carry more items
than you have slot-space for. Also items wielded or worn count towards the slots.
We still need to track what the character is using however: What weapon they have readied affects the damage
they can do. The shield, helmet and armor they use affects their defense.
We have already set up the possible 'wear/wield locations' when we defined our Objects
[in the previous lesson](Beginner-Tutorial-Objects). This is what we have in `enums.py`:
```python
# mygame/evadventure/enums.py
# ...
class WieldLocation(Enum):
BACKPACK = "backpack"
WEAPON_HAND = "weapon_hand"
SHIELD_HAND = "shield_hand"
TWO_HANDS = "two_handed_weapons"
BODY = "body" # armor
HEAD = "head" # helmets
```
Basically, all the weapon/armor locations are exclusive - you can only have one item in each (or none).
The BACKPACK is special - it contains any number of items (up to the maximum slot usage).
## EquipmentHandler
> Create a new module `mygame/evadventure/equipment.py`.
In default Evennia, everything you pick up will end up "inside" your character object (that is, have
you as its `.location`). This is called your _inventory_ and has no limit. We will keep 'moving items into us'
when we pick them up, but we will add more functionality using an _Equipment handler_.
```{sidebar}
If you want to understand more about behind how Evennia uses handlers, there is a
[dedicated tutorial](Tutorial-Persistent-Handler) talking about the principle.
```
A handler is (for our purposes) an object that sits "on" another entity, containing functionality
for doing one specific thing (managing equipment, in our case).
This is the start of our handler:
```python
# in mygame/evadventure/equipment.py
from .enums import WieldLocation
class EquipmentHandler:
save_attribute = "inventory_slots"
def __init__(self, obj):
# here obj is the character we store the handler on
self.obj = obj
self._load()
def _load(self):
"""Load our data from an Attribute on `self.obj`"""
self.slots = self.obj.attributes.get(
self.save_attribute,
category="inventory",
default={
WieldLocation.WEAPON_HAND: None,
WieldLocation.SHIELD_HAND: None,
WieldLocation.TWO_HANDS: None,
WieldLocation.BODY: None,
WieldLocation.HEAD: None,
WieldLocation.BACKPACK: []
}
)
def _save(self):
"""Save our data back to the same Attribute"""
self.obj.attributes.add(self.save_attribute, self.slots, category="inventory")
```
This is a compact and functioning little handler. Before analyzing how it works, this is how
we will add it to the Character:
```python
# mygame/evadventure/characters.py
# ...
from evennia.utils.utils import lazy_property
from .equipment import EquipmentHandler
# ...
class EvAdventureCharacter(LivingMixin, DefaultCharacter):
# ...
@lazy_property
def equipment(self):
return EquipmentHandler(self)
```
After reloading the server, the equipment-handler will now be accessible on the character as
character.equipment
The `@lazy_property` works such that it will not load the handler until it is first accessed. When that
happens, we start up the handler and feed it `self` (the Character itself). This is what enters `__init__`
as `.obj` in the `EquipmentHandler` code above.
So we now have a handler on the character, and the handler has a back-reference to the character it sits
on.
Since the handler itself is just a regular Python object, we need to use the `Character` to store
our data - our _Knave_ slots. We must save them to the database, because we want the server to remember
them even after reloading.
Using `self.obj.attributes.add()` and `.get()` we save the data to the Character in a specially named
[Attribute](Attributes). Since we use a `category`, we are unlikely to collide with other Attributes.

View file

@ -0,0 +1,334 @@
# In-game Objects and items
In the previous lesson we established what a 'Character' is in our game. Before we continue
we also need to have a notion what an 'item' or 'object' is.
Looking at _Knave_'s item lists, we can get some ideas of what we need to track:
- `size` - this is how many 'slots' the item uses in the character's inventory.
- `value` - a base value if we want to sell or buy the item.
- `inventory_use_slot` - some items can be worn or wielded. For example, a helmet needs to be
worn on the head and a shield in the shield hand. Some items can't be used this way at all, but
only belong in the backpack.
- `obj_type` - Which 'type' of item this is.
## New Enums
We added a few enumberations for Abilities back in the [Utilities tutorial](./Beginner-Tutorial-Utilities.md).
Before we continue, let's expand with enums for use-slots and object types.
```python
# mygame/evadventure/enums.py
# ...
class WieldLocation(Enum):
BACKPACK = "backpack"
WEAPON_HAND = "weapon_hand"
SHIELD_HAND = "shield_hand"
TWO_HANDS = "two_handed_weapons"
BODY = "body" # armor
HEAD = "head" # helmets
class ObjType(Enum):
WEAPON = "weapon"
ARMOR = "armor"
SHIELD = "shield"
HELMET = "helmet"
CONSUMABLE = "consumable"
GEAR = "gear"
MAGIC = "magic"
QUEST = "quest"
TREASURE = "treasure"
```
Once we have these enums, we will use them for referencing things.
## The base object
> Create a new module `mygame/evadventure/objects.py`
```{sidebar}
[evennia/contrib/tutorials/evadventure/objects.py](evennia.contrib.tutorials.evadventure.objects) has
a full set of objects implemented.
```
<div style="clear: right;"></div>
We will make a base `EvAdventureObject` class off Evennia's standard `DefaultObject`. We will then add
child classes to represent the relevant types:
```python
# mygame/evadventure/objects.py
from evennia import AttributeProperty, DefaultObject
from evennia.utils.utils import make_iter
from .utils import get_obj_stats
from .enums import WieldLocation, ObjType
class EvAdventureObject(DefaultObject):
"""
Base for all evadventure objects.
"""
inventory_use_slot = WieldLocation.BACKPACK
size = AttributeProperty(1, autocreate=False)
value = AttributeProperty(0, autocreate=False)
# this can be either a single type or a list of types (for objects able to be
# act as multiple). This is used to tag this object during creation.
obj_type = ObjType.GEAR
def at_object_creation(self):
"""Called when this object is first created. We convert the .obj_type
property to a database tag."""
for obj_type in make_iter(self.obj_type):
self.tags.add(self.obj_type.value, category="obj_type")
def get_help(self):
"""Get any help text for this item"""
return "No help for this item"
```
### Using Attributes or not
In theory, `size` and `value` does not change and _could_ also be just set as a regular Python
property on the class:
```python
class EvAdventureObject(DefaultObject):
inventory_use_slot = WieldLocation.BACKPACK
size = 1
value = 0
```
The problem with this is that if we want to make a new object of `size 3` and `value 20`, we have to
make a new class for it. We can't change it on the fly because the change would only be in memory and
be lost on next server reload.
Because we use `AttributeProperties`, we can set `size` and `value` to whatever we like when we
create the object (or later), and the Attributes will remember our changes to that object indefinitely.
To make this a little more efficient, we use `autocreate=False`. Normally when you create a
new object with defined `AttributeProperties`, a matching `Attribute` is immediately created at
the same time. So normally, the object would be created along with two Attributes `size` and `value`.
With `autocreate=False`, no Attribute will be created _unless the default is changed_. That is, as
long as your object has `size=1` no database `Attribute` will be created at all. This saves time and
resources when creating large number of objects.
The drawback is that since no Attribute is created you can't refer to it
with `obj.db.size` or `obj.attributes.get("size")` _unless you change its default_. You also can't query
the database for all objects with `size=1`, since most objects would not yet have an in-database
`size` Attribute to search for.
In our case, we'll only refer to these properties as `obj.size` etc, and have no need to find
all objects of a particular size. So we should be safe.
### Creating tags in `at_object_creation`
The `at_object_creation` is a method Evennia calls on every child of `DefaultObject` whenever it is
first created.
We do a tricky thing here, converting our `.obj_type` to one or more [Tags](../../../Components/Tags.md). Tagging the
object like this means you can later efficiently find all objects of a given type (or combination of
types) with Evennia's search functions:
```python
from .enums import ObjType
from evennia.utils import search
# get all shields in the game
all_shields = search.search_object_by_tag(ObjType.SHIELD.value, category="obj_type")
```
We allow `.obj_type` to be given as a single value or a list of values. We use `make_iter` from the
evennia utility library to make sure we don't balk at either. This means you could have a Shield that
is also Magical, for example.
## Other object types
Some of the other object types are very simple so far.
```python
# mygame/evadventure/objects.py
from evennia import AttributeProperty, DefaultObject
from .enums import ObjType
class EvAdventureObject(DefaultObject):
# ...
class EvAdventureQuestObject(EvAdventureObject):
"""Quest objects should usually not be possible to sell or trade."""
obj_type = ObjType.QUEST
class EvAdventureTreasure(EvAdventureObject):
"""Treasure is usually just for selling for coin"""
obj_type = ObjType.TREASURE
value = AttributeProperty(100, autocreate=False)
```
## Consumables
A 'consumable' is an item that has a certain number of 'uses'. Once fully consumed, it can't be used
anymore. An example would be a health potion.
```python
# mygame/evadventure/objects.py
# ...
class EvAdventureConsumable(EvAdventureObject):
"""An item that can be used up"""
obj_type = ObjType.CONSUMABLE
value = AttributeProperty(0.25, autocreate=False)
uses = AttributeProperty(1, autocreate=False)
def at_pre_use(self, user, *args, **kwargs):
"""Called before using. If returning False, abort use."""
return uses > 0
def at_use(self, user, *args, **kwargs):
"""Called when using the item"""
pass
def at_post_use(self. user, *args, **kwargs):
"""Called after using the item"""
# detract a usage, deleting the item if used up.
self.uses -= 1
if self.uses <= 0:
user.msg(f"{self.key} was used up.")
self.delete()
```
What exactly each consumable does will vary - we will need to implement children of this class
later, overriding `at_use` with different effects.
## Weapons
All weapons need properties that describe how efficient they are in battle.
```python
# mygame/evadventure/objects.py
from .enums import WieldLocation, ObjType, Ability
# ...
class EvAdventureWeapon(EvAdventureObject):
"""Base class for all weapons"""
obj_type = ObjType.WEAPON
inventory_use_slot = AttributeProperty(WieldLocation.WEAPON_HAND, autocreate=False)
quality = AttributeProperty(3, autocreate=False)
attack_type = AttibuteProperty(Ability.STR, autocreate=False)
defend_type = AttibuteProperty(Ability.ARMOR, autocreate=False)
damage_roll = AttibuteProperty("1d6", autocreate=False)
```
The `quality` is something we need to track in _Knave_. When getting critical failures on attacks,
a weapon's quality will go down. When it reaches 0, it will break.
The attack/defend type tracks how we resolve attacks with the weapon, like `roll + STR vs ARMOR + 10`.
## Magic
In _Knave_, anyone can use magic if they are wielding a rune stone (our name for spell books) in both
hands. You can only use a rune stone once per rest. So a rune stone is an example of a 'magical weapon'
that is also a 'consumable' of sorts.
```python
# mygame/evadventure/objects.py
# ...
class EvAdventureConsumable(EvAdventureObject):
# ...
class EvAdventureWeapon(EvAdventureObject):
# ...
class EvAdventureRuneStone(EvAdventureWeapon, EvAdventureConsumable):
"""Base for all magical rune stones"""
obj_type = (ObjType.WEAPON, ObjType.MAGIC)
inventory_use_slot = WieldLocation.TWO_HANDS # always two hands for magic
quality = AttributeProperty(3, autocreate=False)
attack_type = AttibuteProperty(Ability.INT, autocreate=False)
defend_type = AttibuteProperty(Ability.DEX, autocreate=False)
damage_roll = AttibuteProperty("1d8", autocreate=False)
def at_post_use(self, user, *args, **kwargs):
"""Called after usage/spell was cast"""
self.uses -= 1
# we don't delete the rune stone here, but
# it must be reset on next rest.
def refresh(self):
"""Refresh the rune stone (normally after rest)"""
self.uses = 1
```
We make the rune stone a mix of weapon and consumable. Note that we don't have to add `.uses`
again, it's inherited from `EvAdventureConsumable` parent. The `at_pre_use` and `at_use` methods
are also inherited; we only override `at_post_use` since we don't want the runestone to be deleted
when it runs out of uses.
We add a little convenience method `refresh` - we should call this when the character rests, to
make the runestone active again.
Exactly what rune stones _do_ will be implemented in the `at_use` methods of subclasses to this
base class. Since magic in _Knave_ tends to be pretty custom, it makes sense that it will lead to a lot
of custom code.
## Armor
Armor, shields and helmets increase the `ARMOR` stat of the character. In _Knave_, what is stored is the
defense value of the armor (values 11-20). We will instead store the 'armor bonus' (1-10). As we know,
defending is always `bonus + 10`, so the result will be the same - this means
we can use `Ability.ARMOR` as any other defensive ability without worrying about a special case.
``
```python
# mygame/evadventure/objects.py
# ...
class EvAdventureAmor(EvAdventureObject):
obj_type = ObjType.ARMOR
inventory_use_slot = WieldLocation.BODY
armor = AttributeProperty(1, autocreate=False)
quality = AttributeProperty(3, autocreate=False)
class EvAdventureShield(EvAdventureArmor):
obj_type = ObjType.SHIELD
inventory_use_slot = WieldLocation.SHIELD_HAND
class EvAdventureHelmet(EvAdventureArmor):
obj_type = ObjType.HELMET
inventory_use_slot = WieldLocation.HEAD
```

View file

@ -25,9 +25,11 @@ This is a big part. You'll be seeing a lot of code and there are plenty of lesso
Take your time!
If you followed the previous parts of this tutorial you will have some notions about Python and where to
find and make use of things in Evennia. We also have a good idea of the type of game we want.
find and make use of things in Evennia. We also have a good idea of the type of game we will
create.
Even if this is not the game-style you are interested in, following along will give you a lot
of experience with using Evennia. This be _really_ helpful for doing your own thing later.
of experience using Evennia and be really helpful for doing your own thing later!
Fully coded examples of all code we make in this part can be found in the
[evennia/contrib/tutorials/evadventure](evennia.contrib.tutorials.evadventure) package.
@ -39,27 +41,29 @@ Fully coded examples of all code we make in this part can be found in the
Beginner-Tutorial-Utilities
Beginner-Tutorial-Rules
Beginner-Tutorial-Chargen
Beginner-Tutorial-Characters
Beginner-Tuturial-Objects
Beginner-Tutorial-Rooms
Beginner-Tutorial-NPCs
Beginner-Tutorial-Turnbased-Combat
Beginner-Tutorial-Quests
Beginner-Tutorial-Shops
Beginner-Tutorial-Dungeon
Beginner-Tutorial-Commands
## Table of Contents
```{toctree}
Beginner-Tutorial-Utilities
Beginner-Tutorial-Rules
Beginner-Tutorial-Objects
Beginner-Tutorial-Equipment
Beginner-Tutorial-Chargen
Beginner-Tutorial-Rooms
Beginner-Tutorial-NPCs
Beginner-Tutorial-Turnbased-Combat
Beginner-Tutorial-Quests
Beginner-Tutorial-Shops
Beginner-Tutorial-Dungeon
Beginner-Tutorial-Commands
```
## Table of Contents
```{toctree}
Beginner-Tutorial-Utilities
Beginner-Tutorial-Rules
Beginner-Tutorial-Characters
Beginner-Tutorial-Objects
Beginner-Tutorial-Equipment
Beginner-Tutorial-Chargen
Beginner-Tutorial-Characters
Beginner-Tuturial-Objects
Beginner-Tutorial-Rooms
Beginner-Tutorial-NPCs
Beginner-Tutorial-Turnbased-Combat

View file

@ -361,30 +361,21 @@ class EvAdventureRollEngine:
# ...
def heal(character, amount):
"""
Heal a certain amount of health, but not more
than character's `hp_max`.
"""
hp = character.hp
hp_max = character.hp_max
damage = hp_max - hp
character.hp += min(damage, amount)
def heal_from_rest(self, character):
"""
A night's rest retains 1d8 + CON HP
"""
con_bonus = getattr(character, Ability.CON.value, 1)
self.heal(character, self.roll("1d8") + con_bonus)
character.heal(self.roll("1d8") + con_bonus)
```
By splitting this into two methods, we get a free convenient `heal` method we can use for healing
also outside of sleeping.
We make another assumption here - that `character.heal()` is a thing. We tell this function how
much the character should heal, and it will do so, making sure to not heal more than its max
number of HPs
> Knowing what is available on the character and what rule rolls we need is a bit of a chicken-and-egg
> problem. We will make sure to implement the matching _Character_ class next lesson.
### Rolling on a table
@ -568,11 +559,71 @@ We don't yet know what 'killing the character' technically means, so we mark thi
return to it in a later lesson. We just know that we need to do _something_ here to kill off the
character!
## Testing
> Make a new module `mygame/evadventure/tests/test_rules.py`
Testing the `rules` module will also showcase some very useful tools when testing.
```python
# mygame/evadventure/tests/test_rules.py
from unittest.mock import patch
from evennia.utils.test_resources import BaseEvenniaTest
from .. import rules
class TestEvAdventureRuleEngine(BaseEvenniaTest):
def setUp(self):
"""Called before every test method"""
super().setUp()
self.roll_engine = rules.EvAdventureRollEngine()
@patch("evadventure.rules.randint")
def test_roll(self, mock_randint):
mock_randint.return_value = 4
self.assertEqual(self.roll_engine.roll("1d6", 4)
self.assertEqual(self.roll_engine.roll("2d6", 2 * 4)
# test of the other rule methods below ...
```
As before, run the specific test with
evennia test --settings settings.py .evadventure.tests.test_rules
### Mocking and patching
```{sidebar}
In [evennia/contrib/tutorials/evadventure/tests/test_rules.py](evennia.contrib.tutorials.evadventure.tests.test_rules)
has a complete example of rule testing.
```
The `setUp` method is a special method of the testing class. It will be run before every
test method. We use `super().setUp()` to make sure the parent class' version of this method
always fire. Then we create a fresh `EvAdventureRollEngine` we can test with.
In our test, we import `patch` from the `unittest.mock` library. This is a very useful tool for testing.
Normally the `randint` function we imported in `rules` will return a random value. That's very hard to
test for, since the value will be different every test.
With `@patch` (this is called a _decorator_), we temporarily replace `rules.randint` with a 'mock' - a
dummy entity. This mock is passed into the testing method. We then take this `mock_randint` and set
`.return_value = 4` on it.
Adding `return_value` to the mock means that every time this mock is called, it will return 4. For the
duration of the test we can now check with `self.assertEqual` that our `roll` method always returns a
result as-if the random result was 4.
There are [many resources for understanding mock](https://realpython.com/python-mock-library/), refer to
them for further help.
> The `EvAdventureRollEngine` have many methods to test. We leave this as an extra exercise!
## Summary
This concludes all the core rule mechanics of _Knave_ - the rules used during play. We noticed here
that we are going to soon need to establish how our _Character_ actually stores data. So we will
address that next, before we get to the character generation itself.
address that next.

View file

@ -128,42 +128,9 @@ class Ability(Enum):
ALLEGIANCE_FRIENDLY = "friendly"
class WieldLocation(Enum):
"""
Wield (or wear) locations.
"""
# wield/wear location
BACKPACK = "backpack"
WEAPON_HAND = "weapon_hand"
SHIELD_HAND = "shield_hand"
TWO_HANDS = "two_handed_weapons"
BODY = "body" # armor
HEAD = "head" # helmets
class ObjType(Enum):
"""
Object types.
"""
WEAPON = "weapon"
ARMOR = "armor"
SHIELD = "shield"
HELMET = "helmet"
CONSUMABLE = "consumable"
GEAR = "gear"
MAGIC = "magic"
QUEST = "quest"
TREASURE = "treasure"
```
Here the `Ability` class holds basic properties of a character sheet, while `WieldLocation` tracks
equipment and where a character would wield and wear things - since _Knave_ has these, it makes sense
to track it. Finally we have a set of different `ObjType`s, for differentiate game items. These are
extracted by reading the _Knave_ object lists and figuring out how they should be categorized.
Here the `Ability` class holds basic properties of a character sheet.
## Utility module

View file

@ -1,10 +1,11 @@
# Making a Persistent object Handler
A _handler_ is a convenient way to group functionality on an object. This allows you to logically group all actions related to that thing in one place. This tutorial expemplifies how to make your own handlers and make sure data you store in them survives a reload.
For example, when you do `obj.attributes.get("key")` or `obj.tags.add('tagname')` you are evoking handlers stored as `.attributes` and `tags` on the `obj`. On these handlers are methods (`get()` and `add()` in this example).
## Base Handler example
Here is a base way to set up an on-object handler:
```python
@ -110,7 +111,7 @@ class QuestHandler:
```
The handler is just a normal Python class and has no database-storage on its own. But it has a link to `.obj`, which is assumed to be a full typeclased entity, on which we can create persistent [Attributes](Components/Attributes.md) to store things however we like!
The handler is just a normal Python class and has no database-storage on its own. But it has a link to `.obj`, which is assumed to be a full typeclased entity, on which we can create persistent [Attributes](../Components/Attributes.md) to store things however we like!
We make two helper methods `_load` and
`_save` that handles local fetches and saves `storage` to an Attribute on the object. To avoid saving more than necessary, we have a property `do_save`. This we will set in `Quest` below.
@ -160,7 +161,7 @@ class Quest:
The `Quest.__init__` now takes `obj` as argument, to match what we pass to it in `QuestHandler.add`. We want to monitor the changing of `current_step`, so we make it into a `property`. When we edit that value, we set the `do_save` flag on the handler, which means it will save the status to database once it has checked progress on all its quests.
The `__serialize__dbobjs__` and `__deserialize_dbobjs__` methods are needed because `Attributes` can't store 'hidden' database objects (the `Quest.obj` property. The methods help Evennia serialize/deserialize `Quest` propertly when the handler saves it. For more information, see [Storing Single objects](Components/Attributes.md#storing-single-objects) in the Attributes documentation.
The `__serialize__dbobjs__` and `__deserialize_dbobjs__` methods are needed because `Attributes` can't store 'hidden' database objects (the `Quest.obj` property. The methods help Evennia serialize/deserialize `Quest` propertly when the handler saves it. For more information, see [Storing Single objects](../Components/Attributes.md#storing-single-objects) in the Attributes documentation.
### Tying it all together

View file

@ -0,0 +1,7 @@
evennia
=======
.. toctree::
:maxdepth: 6
evennia

View file

@ -0,0 +1,7 @@
evennia.accounts.accounts module
================================
.. automodule:: evennia.accounts.accounts
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,7 @@
evennia.accounts.bots module
============================
.. automodule:: evennia.accounts.bots
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,7 @@
evennia.accounts.manager module
===============================
.. automodule:: evennia.accounts.manager
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,7 @@
evennia.accounts.models module
==============================
.. automodule:: evennia.accounts.models
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,17 @@
evennia.accounts package
========================
.. automodule:: evennia.accounts
:members:
:undoc-members:
:show-inheritance:
.. toctree::
:maxdepth: 6
evennia.accounts.accounts
evennia.accounts.bots
evennia.accounts.manager
evennia.accounts.models

View file

@ -0,0 +1,7 @@
evennia.commands.cmdhandler module
==================================
.. automodule:: evennia.commands.cmdhandler
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,7 @@
evennia.commands.cmdparser module
=================================
.. automodule:: evennia.commands.cmdparser
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,7 @@
evennia.commands.cmdset module
==============================
.. automodule:: evennia.commands.cmdset
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,7 @@
evennia.commands.cmdsethandler module
=====================================
.. automodule:: evennia.commands.cmdsethandler
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,7 @@
evennia.commands.command module
===============================
.. automodule:: evennia.commands.command
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,7 @@
evennia.commands.default.account module
=======================================
.. automodule:: evennia.commands.default.account
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,7 @@
evennia.commands.default.admin module
=====================================
.. automodule:: evennia.commands.default.admin
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,7 @@
evennia.commands.default.batchprocess module
============================================
.. automodule:: evennia.commands.default.batchprocess
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,7 @@
evennia.commands.default.building module
========================================
.. automodule:: evennia.commands.default.building
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,7 @@
evennia.commands.default.cmdset\_account module
===============================================
.. automodule:: evennia.commands.default.cmdset_account
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,7 @@
evennia.commands.default.cmdset\_character module
=================================================
.. automodule:: evennia.commands.default.cmdset_character
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,7 @@
evennia.commands.default.cmdset\_session module
===============================================
.. automodule:: evennia.commands.default.cmdset_session
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,7 @@
evennia.commands.default.cmdset\_unloggedin module
==================================================
.. automodule:: evennia.commands.default.cmdset_unloggedin
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,7 @@
evennia.commands.default.comms module
=====================================
.. automodule:: evennia.commands.default.comms
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,7 @@
evennia.commands.default.general module
=======================================
.. automodule:: evennia.commands.default.general
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,7 @@
evennia.commands.default.help module
====================================
.. automodule:: evennia.commands.default.help
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,7 @@
evennia.commands.default.muxcommand module
==========================================
.. automodule:: evennia.commands.default.muxcommand
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,29 @@
evennia.commands.default package
================================
.. automodule:: evennia.commands.default
:members:
:undoc-members:
:show-inheritance:
.. toctree::
:maxdepth: 6
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

View file

@ -0,0 +1,7 @@
evennia.commands.default.syscommands module
===========================================
.. automodule:: evennia.commands.default.syscommands
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,7 @@
evennia.commands.default.system module
======================================
.. automodule:: evennia.commands.default.system
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,7 @@
evennia.commands.default.tests module
=====================================
.. automodule:: evennia.commands.default.tests
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,7 @@
evennia.commands.default.unloggedin module
==========================================
.. automodule:: evennia.commands.default.unloggedin
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,24 @@
evennia.commands package
========================
.. automodule:: evennia.commands
:members:
:undoc-members:
:show-inheritance:
.. toctree::
:maxdepth: 6
evennia.commands.cmdhandler
evennia.commands.cmdparser
evennia.commands.cmdset
evennia.commands.cmdsethandler
evennia.commands.command
.. toctree::
:maxdepth: 6
evennia.commands.default

View file

@ -0,0 +1,7 @@
evennia.comms.comms module
==========================
.. automodule:: evennia.comms.comms
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,7 @@
evennia.comms.managers module
=============================
.. automodule:: evennia.comms.managers
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,7 @@
evennia.comms.models module
===========================
.. automodule:: evennia.comms.models
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,16 @@
evennia.comms package
=====================
.. automodule:: evennia.comms
:members:
:undoc-members:
:show-inheritance:
.. toctree::
:maxdepth: 6
evennia.comms.comms
evennia.comms.managers
evennia.comms.models

View file

@ -0,0 +1,7 @@
evennia.contrib.base\_systems.awsstorage.aws\_s3\_cdn module
============================================================
.. automodule:: evennia.contrib.base_systems.awsstorage.aws_s3_cdn
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,15 @@
evennia.contrib.base\_systems.awsstorage package
================================================
.. automodule:: evennia.contrib.base_systems.awsstorage
:members:
:undoc-members:
:show-inheritance:
.. toctree::
:maxdepth: 6
evennia.contrib.base_systems.awsstorage.aws_s3_cdn
evennia.contrib.base_systems.awsstorage.tests

View file

@ -0,0 +1,7 @@
evennia.contrib.base\_systems.awsstorage.tests module
=====================================================
.. automodule:: evennia.contrib.base_systems.awsstorage.tests
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,7 @@
evennia.contrib.base\_systems.building\_menu.building\_menu module
==================================================================
.. automodule:: evennia.contrib.base_systems.building_menu.building_menu
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,15 @@
evennia.contrib.base\_systems.building\_menu package
====================================================
.. automodule:: evennia.contrib.base_systems.building_menu
:members:
:undoc-members:
:show-inheritance:
.. toctree::
:maxdepth: 6
evennia.contrib.base_systems.building_menu.building_menu
evennia.contrib.base_systems.building_menu.tests

View file

@ -0,0 +1,7 @@
evennia.contrib.base\_systems.building\_menu.tests module
=========================================================
.. automodule:: evennia.contrib.base_systems.building_menu.tests
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,7 @@
evennia.contrib.base\_systems.color\_markups.color\_markups module
==================================================================
.. automodule:: evennia.contrib.base_systems.color_markups.color_markups
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,15 @@
evennia.contrib.base\_systems.color\_markups package
====================================================
.. automodule:: evennia.contrib.base_systems.color_markups
:members:
:undoc-members:
:show-inheritance:
.. toctree::
:maxdepth: 6
evennia.contrib.base_systems.color_markups.color_markups
evennia.contrib.base_systems.color_markups.tests

View file

@ -0,0 +1,7 @@
evennia.contrib.base\_systems.color\_markups.tests module
=========================================================
.. automodule:: evennia.contrib.base_systems.color_markups.tests
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,7 @@
evennia.contrib.base\_systems.components.component module
=========================================================
.. automodule:: evennia.contrib.base_systems.components.component
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,7 @@
evennia.contrib.base\_systems.components.dbfield module
=======================================================
.. automodule:: evennia.contrib.base_systems.components.dbfield
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,7 @@
evennia.contrib.base\_systems.components.holder module
======================================================
.. automodule:: evennia.contrib.base_systems.components.holder
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,18 @@
evennia.contrib.base\_systems.components package
================================================
.. automodule:: evennia.contrib.base_systems.components
:members:
:undoc-members:
:show-inheritance:
.. toctree::
:maxdepth: 6
evennia.contrib.base_systems.components.component
evennia.contrib.base_systems.components.dbfield
evennia.contrib.base_systems.components.holder
evennia.contrib.base_systems.components.signals
evennia.contrib.base_systems.components.tests

View file

@ -0,0 +1,7 @@
evennia.contrib.base\_systems.components.signals module
=======================================================
.. automodule:: evennia.contrib.base_systems.components.signals
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,7 @@
evennia.contrib.base\_systems.components.tests module
=====================================================
.. automodule:: evennia.contrib.base_systems.components.tests
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,7 @@
evennia.contrib.base\_systems.custom\_gametime.custom\_gametime module
======================================================================
.. automodule:: evennia.contrib.base_systems.custom_gametime.custom_gametime
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,15 @@
evennia.contrib.base\_systems.custom\_gametime package
======================================================
.. automodule:: evennia.contrib.base_systems.custom_gametime
:members:
:undoc-members:
:show-inheritance:
.. toctree::
:maxdepth: 6
evennia.contrib.base_systems.custom_gametime.custom_gametime
evennia.contrib.base_systems.custom_gametime.tests

View file

@ -0,0 +1,7 @@
evennia.contrib.base\_systems.custom\_gametime.tests module
===========================================================
.. automodule:: evennia.contrib.base_systems.custom_gametime.tests
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,7 @@
evennia.contrib.base\_systems.email\_login.connection\_screens module
=====================================================================
.. automodule:: evennia.contrib.base_systems.email_login.connection_screens
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,7 @@
evennia.contrib.base\_systems.email\_login.email\_login module
==============================================================
.. automodule:: evennia.contrib.base_systems.email_login.email_login
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,16 @@
evennia.contrib.base\_systems.email\_login package
==================================================
.. automodule:: evennia.contrib.base_systems.email_login
:members:
:undoc-members:
:show-inheritance:
.. toctree::
:maxdepth: 6
evennia.contrib.base_systems.email_login.connection_screens
evennia.contrib.base_systems.email_login.email_login
evennia.contrib.base_systems.email_login.tests

View file

@ -0,0 +1,7 @@
evennia.contrib.base\_systems.email\_login.tests module
=======================================================
.. automodule:: evennia.contrib.base_systems.email_login.tests
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,7 @@
evennia.contrib.base\_systems.ingame\_python.callbackhandler module
===================================================================
.. automodule:: evennia.contrib.base_systems.ingame_python.callbackhandler
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,7 @@
evennia.contrib.base\_systems.ingame\_python.commands module
============================================================
.. automodule:: evennia.contrib.base_systems.ingame_python.commands
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,7 @@
evennia.contrib.base\_systems.ingame\_python.eventfuncs module
==============================================================
.. automodule:: evennia.contrib.base_systems.ingame_python.eventfuncs
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,20 @@
evennia.contrib.base\_systems.ingame\_python package
====================================================
.. automodule:: evennia.contrib.base_systems.ingame_python
:members:
:undoc-members:
:show-inheritance:
.. toctree::
:maxdepth: 6
evennia.contrib.base_systems.ingame_python.callbackhandler
evennia.contrib.base_systems.ingame_python.commands
evennia.contrib.base_systems.ingame_python.eventfuncs
evennia.contrib.base_systems.ingame_python.scripts
evennia.contrib.base_systems.ingame_python.tests
evennia.contrib.base_systems.ingame_python.typeclasses
evennia.contrib.base_systems.ingame_python.utils

View file

@ -0,0 +1,7 @@
evennia.contrib.base\_systems.ingame\_python.scripts module
===========================================================
.. automodule:: evennia.contrib.base_systems.ingame_python.scripts
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,7 @@
evennia.contrib.base\_systems.ingame\_python.tests module
=========================================================
.. automodule:: evennia.contrib.base_systems.ingame_python.tests
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,7 @@
evennia.contrib.base\_systems.ingame\_python.typeclasses module
===============================================================
.. automodule:: evennia.contrib.base_systems.ingame_python.typeclasses
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,7 @@
evennia.contrib.base\_systems.ingame\_python.utils module
=========================================================
.. automodule:: evennia.contrib.base_systems.ingame_python.utils
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,7 @@
evennia.contrib.base\_systems.menu\_login.connection\_screens module
====================================================================
.. automodule:: evennia.contrib.base_systems.menu_login.connection_screens
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,7 @@
evennia.contrib.base\_systems.menu\_login.menu\_login module
============================================================
.. automodule:: evennia.contrib.base_systems.menu_login.menu_login
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,16 @@
evennia.contrib.base\_systems.menu\_login package
=================================================
.. automodule:: evennia.contrib.base_systems.menu_login
:members:
:undoc-members:
:show-inheritance:
.. toctree::
:maxdepth: 6
evennia.contrib.base_systems.menu_login.connection_screens
evennia.contrib.base_systems.menu_login.menu_login
evennia.contrib.base_systems.menu_login.tests

View file

@ -0,0 +1,7 @@
evennia.contrib.base\_systems.menu\_login.tests module
======================================================
.. automodule:: evennia.contrib.base_systems.menu_login.tests
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,7 @@
evennia.contrib.base\_systems.mux\_comms\_cmds.mux\_comms\_cmds module
======================================================================
.. automodule:: evennia.contrib.base_systems.mux_comms_cmds.mux_comms_cmds
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,15 @@
evennia.contrib.base\_systems.mux\_comms\_cmds package
======================================================
.. automodule:: evennia.contrib.base_systems.mux_comms_cmds
:members:
:undoc-members:
:show-inheritance:
.. toctree::
:maxdepth: 6
evennia.contrib.base_systems.mux_comms_cmds.mux_comms_cmds
evennia.contrib.base_systems.mux_comms_cmds.tests

View file

@ -0,0 +1,7 @@
evennia.contrib.base\_systems.mux\_comms\_cmds.tests module
===========================================================
.. automodule:: evennia.contrib.base_systems.mux_comms_cmds.tests
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,22 @@
evennia.contrib.base\_systems package
=====================================
.. automodule:: evennia.contrib.base_systems
:members:
:undoc-members:
:show-inheritance:
.. toctree::
:maxdepth: 6
evennia.contrib.base_systems.awsstorage
evennia.contrib.base_systems.building_menu
evennia.contrib.base_systems.color_markups
evennia.contrib.base_systems.components
evennia.contrib.base_systems.custom_gametime
evennia.contrib.base_systems.email_login
evennia.contrib.base_systems.ingame_python
evennia.contrib.base_systems.menu_login
evennia.contrib.base_systems.mux_comms_cmds
evennia.contrib.base_systems.unixcommand

View file

@ -0,0 +1,15 @@
evennia.contrib.base\_systems.unixcommand package
=================================================
.. automodule:: evennia.contrib.base_systems.unixcommand
:members:
:undoc-members:
:show-inheritance:
.. toctree::
:maxdepth: 6
evennia.contrib.base_systems.unixcommand.tests
evennia.contrib.base_systems.unixcommand.unixcommand

View file

@ -0,0 +1,7 @@
evennia.contrib.base\_systems.unixcommand.tests module
======================================================
.. automodule:: evennia.contrib.base_systems.unixcommand.tests
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,7 @@
evennia.contrib.base\_systems.unixcommand.unixcommand module
============================================================
.. automodule:: evennia.contrib.base_systems.unixcommand.unixcommand
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,7 @@
evennia.contrib.full\_systems.evscaperoom.commands module
=========================================================
.. automodule:: evennia.contrib.full_systems.evscaperoom.commands
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,7 @@
evennia.contrib.full\_systems.evscaperoom.menu module
=====================================================
.. automodule:: evennia.contrib.full_systems.evscaperoom.menu
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,7 @@
evennia.contrib.full\_systems.evscaperoom.objects module
========================================================
.. automodule:: evennia.contrib.full_systems.evscaperoom.objects
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,7 @@
evennia.contrib.full\_systems.evscaperoom.room module
=====================================================
.. automodule:: evennia.contrib.full_systems.evscaperoom.room
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,21 @@
evennia.contrib.full\_systems.evscaperoom package
=================================================
.. automodule:: evennia.contrib.full_systems.evscaperoom
:members:
:undoc-members:
:show-inheritance:
.. toctree::
:maxdepth: 6
evennia.contrib.full_systems.evscaperoom.commands
evennia.contrib.full_systems.evscaperoom.menu
evennia.contrib.full_systems.evscaperoom.objects
evennia.contrib.full_systems.evscaperoom.room
evennia.contrib.full_systems.evscaperoom.scripts
evennia.contrib.full_systems.evscaperoom.state
evennia.contrib.full_systems.evscaperoom.tests
evennia.contrib.full_systems.evscaperoom.utils

View file

@ -0,0 +1,7 @@
evennia.contrib.full\_systems.evscaperoom.scripts module
========================================================
.. automodule:: evennia.contrib.full_systems.evscaperoom.scripts
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,7 @@
evennia.contrib.full\_systems.evscaperoom.state module
======================================================
.. automodule:: evennia.contrib.full_systems.evscaperoom.state
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,7 @@
evennia.contrib.full\_systems.evscaperoom.tests module
======================================================
.. automodule:: evennia.contrib.full_systems.evscaperoom.tests
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,7 @@
evennia.contrib.full\_systems.evscaperoom.utils module
======================================================
.. automodule:: evennia.contrib.full_systems.evscaperoom.utils
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,13 @@
evennia.contrib.full\_systems package
=====================================
.. automodule:: evennia.contrib.full_systems
:members:
:undoc-members:
:show-inheritance:
.. toctree::
:maxdepth: 6
evennia.contrib.full_systems.evscaperoom

View file

@ -0,0 +1,7 @@
evennia.contrib.game\_systems.barter.barter module
==================================================
.. automodule:: evennia.contrib.game_systems.barter.barter
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,15 @@
evennia.contrib.game\_systems.barter package
============================================
.. automodule:: evennia.contrib.game_systems.barter
:members:
:undoc-members:
:show-inheritance:
.. toctree::
:maxdepth: 6
evennia.contrib.game_systems.barter.barter
evennia.contrib.game_systems.barter.tests

View file

@ -0,0 +1,7 @@
evennia.contrib.game\_systems.barter.tests module
=================================================
.. automodule:: evennia.contrib.game_systems.barter.tests
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,7 @@
evennia.contrib.game\_systems.clothing.clothing module
======================================================
.. automodule:: evennia.contrib.game_systems.clothing.clothing
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,15 @@
evennia.contrib.game\_systems.clothing package
==============================================
.. automodule:: evennia.contrib.game_systems.clothing
:members:
:undoc-members:
:show-inheritance:
.. toctree::
:maxdepth: 6
evennia.contrib.game_systems.clothing.clothing
evennia.contrib.game_systems.clothing.tests

View file

@ -0,0 +1,7 @@
evennia.contrib.game\_systems.clothing.tests module
===================================================
.. automodule:: evennia.contrib.game_systems.clothing.tests
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,7 @@
evennia.contrib.game\_systems.cooldowns.cooldowns module
========================================================
.. automodule:: evennia.contrib.game_systems.cooldowns.cooldowns
:members:
:undoc-members:
:show-inheritance:

View file

@ -0,0 +1,15 @@
evennia.contrib.game\_systems.cooldowns package
===============================================
.. automodule:: evennia.contrib.game_systems.cooldowns
:members:
:undoc-members:
:show-inheritance:
.. toctree::
:maxdepth: 6
evennia.contrib.game_systems.cooldowns.cooldowns
evennia.contrib.game_systems.cooldowns.tests

View file

@ -0,0 +1,7 @@
evennia.contrib.game\_systems.cooldowns.tests module
====================================================
.. automodule:: evennia.contrib.game_systems.cooldowns.tests
:members:
:undoc-members:
:show-inheritance:

Some files were not shown because too many files have changed in this diff Show more