Convert master docs to use MyST

This commit is contained in:
Griatch 2021-10-26 21:14:33 +02:00
parent 6e03216cd9
commit d229ff024c
359 changed files with 3275 additions and 4567 deletions

View file

@ -11,6 +11,7 @@ SPHINXBUILD ?= sphinx-build
SPHINXMULTIVERSION ?= sphinx-multiversion
SPHINXAPIDOC ?= sphinx-apidoc
SPHINXAPIDOCOPTS = --tocfile evennia-api --module-first --force -d 6 --separate --templatedir=$(SOURCEDIR)/_templates/
SPHINXAPIDOCOPTSQUICK = --tocfile evennia-api --module-first -d 6 --separate --templatedir=$(SOURCEDIR)/_templates/
SPHINXAPIDOCENV = members,undoc-members,show-inheritance
SPHINXAPIDOCEXCLUDE = ../*/migrations/* ../evennia/game_template/* ../evennia/*/tests/* ../evennia/*/tests.py
@ -28,9 +29,12 @@ QUICKFILES=
help:
@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
@echo "Evennia-specific: "
@echo " $(cblue)install$(cnorm) to get build requirements"
@echo " $(cblue)install$(cnorm) to get doc build requirements"
@echo " $(cblue)clean$(cnorm) to remove remnants of a previous build"
@echo " $(cblue)quick$(cnorm) to build local docs but skip the autodocs (for quick testing)"
@echo " $(cblue)quickstrict$(cnorm) to build like 'quick' but abort immediately on any error"
@echo " $(cblue)local$(cnorm) to build local html docs of the current branch (no multiversion)."
@echo " $(cblue)localupdate$(cnorm) to build local html docs (only update changes)
@echo " $(cblue)mv-local$(cnorm) to build multiversion html docs, without deploying (req: local git commit first)"
@echo " $(cblue)deploy$(cnorm) to deploy previously built multiversion docs online (req: commit and github push access)"
@echo " $(cblue)release$(cnorm) to build + deploy multiversion docs online (req: commit and github push access)"
@ -66,6 +70,10 @@ _autodoc-index:
make _clean_api_index
@EVDIR=$(EVDIR) EVGAMEDIR=$(EVGAMEDIR) SPHINX_APIDOC_OPTIONS=$(SPHINXAPIDOCENV) $(SPHINXAPIDOC) $(SPHINXAPIDOCOPTS) -o $(SOURCEDIR)/api/ $(EVDIR) $(SPHINXAPIDOCEXCLUDE)
make _reformat_apidoc_headers
pylib/api_rst2md.py
_quick_autodoc-index:
@EVDIR=$(EVDIR) EVGAMEDIR=$(EVGAMEDIR) SPHINX_APIDOC_OPTIONS=$(SPHINXAPIDOCENV) $(SPHINXAPIDOC) $(SPHINXAPIDOCOPTSQUICK) -o $(SOURCEDIR)/api/ $(EVDIR) $(SPHINXAPIDOCEXCLUDE)
_multiversion-autodoc-index:
make _autodoc-index
@ -102,6 +110,7 @@ pdf:
@echo "To see result, open evennia/docs/build/latex/evennia.pdf in a PDF reader."
quick:
make _quick_autodoc-index
make _quick-html-build $(FILES)
@echo ""
@echo "Documentation built (single version, no autodocs)."
@ -121,6 +130,14 @@ local:
@echo "Documentation built (single version)."
@echo "To see result, open evennia/docs/build/html/index.html in a browser."
# build only that which updated since last run (no clean or index-creation)
localupdate:
make _check-env
make _html-build
@echo ""
@echo "Documentation built (single version, only updates, no auto-index)."
@echo "To see result, open evennia/docs/build/html/index.html in a browser."
# note that this should be done for each relevant multiversion branch.
mv-index:
make _multiversion-autodoc-index

View file

@ -348,7 +348,7 @@ See below for examples of this.
This will display a one-line note that will pop even more than a normal `> note`.
````
```important::
```{important}
This is important because it is!
```
````
@ -359,7 +359,7 @@ A warning block is used to draw attention to particularly dangerous things, or f
mess up.
````
```warning::
```{warning}
Be careful about this ...
````

31
docs/pylib/api_rst2md.py Executable file
View file

@ -0,0 +1,31 @@
#!/usr/bin/python
"""
Remap autodoc API rst files to md files and wrap their contents.
"""
from glob import glob
from os.path import abspath, join as pathjoin, dirname
from os import rename
def _rst2md(filename_rst):
with open(filename_rst, 'r') as fil:
# read rst file, reformat and save
txt = fil.read()
with open(filename_rst, 'w') as fil:
txt = "```{eval-rst}\n" + txt + "\n```"
fil.write(txt)
# rename .rst file to .md file
filename, _ = filename_rst.rsplit('.', 1)
filename_md = filename + ".md"
rename(filename_rst, filename_md)
if __name__ == "__main__":
apidir = pathjoin(dirname(dirname(abspath(__file__))), "source", "api")
for filename_rst in glob(pathjoin(apidir, "*.rst")):
_rst2md(filename_rst)
print(" Converted {apidir}/*.rst files to .md files".format(apidir=apidir))

View file

@ -9,7 +9,7 @@ import re
from collections import defaultdict
from sphinx.errors import DocumentError
from pathlib import Path
from os.path import abspath, dirname, join as pathjoin, sep, relpath
from os.path import abspath, dirname, join as pathjoin, relpath
_IGNORE_FILES = []
_SOURCEDIR_NAME = "source"
@ -19,15 +19,54 @@ _NO_REMAP_STARTSWITH = [
"http://",
"https://",
"github:",
"api:",
"feature-request",
"report-bug",
"issue",
"bug-report",
]
# remove these prefixes from the url
_STRIP_PREFIX = [
"../../api/",
"../api/",
"./api/",
"api/",
"api:",
]
TXT_REMAPS = {}
URL_REMAPS = {}
# "Developer Central": "Evennia Components overview",
# "Getting Started": "Setup Quickstart",
# }
URL_REMAPS = {
"Default-Command-Help": "Default-Commands",
"./Default-Command-Help.md": "Default-Commands.md"
}
# "Developer-Central": "Components/Components-Overview",
# "Tutorials": "Howto/Howto-Overview",
# "../Howto/Starting/Directory-Overview": "Gamedir-Overview",
# "Howto/Starting/Directory-Overview": "Gamedir-Overview",
# "Starting/Directory-Overview": "Gamedir-Overview",
# "Directory-Overview": "Gamedir-Overview",
# "../Setup/Getting-Started": "Setup-Quickstart",
# "Setup/Getting-Started": "Setup-Quickstart",
# "Setup-Quickstart": "Setup-Quickstart",
# "Setup-Quickstart": "Getting-Started", # back again
# "First-Steps-Coding": "Starting-Part1",
# "../Howto/Starting/Adding-Command-Tutorial": "Adding-Commands",
# "Howto/Starting/Adding-Command-Tutorial": "Adding-Commands",
# "Starting/Adding-Command-Tutorial": "Adding-Commands",
# "Adding-Command-Tutorial": "Adding-Commands",
# "CmdSet": "Command-Sets",
# "Spawner": "Prototypes",
# "issue": "github:issue",
# "issues": "github:issue",
# "bug": "github:issue",
# "bug-report": "github:issue",
# "./Default-Command-Help": "api:evennia.commands.default#modules",
# "../Components/Default-Command-Help": "api:evennia.commands.default#modules",
# "../../../Components/Default-Command-Help": "api:evennia.commands.default#modules",
# "./Locks.md#permissions": "Permissions",
# "Permissions": "./Locks.md#permissions", # back again
# }
_USED_REFS = {}
@ -96,11 +135,11 @@ def auto_link_remapper(no_autodoc=False):
# normal reference-links [txt](urls)
ref_regex = re.compile(
r"\[(?P<txt>[\w -\[\]\`]+?)\]\((?P<url>.+?)\)", re.I + re.S + re.U + re.M
r"\[(?P<txt>[\n\w -\[\]\`]+?)\]\((?P<url>.+?)\)", re.I + re.S + re.U + re.M
)
# in document references
ref_doc_regex = re.compile(
r"\[(?P<txt>[\w -\`]+?)\]:\s+?(?P<url>.+?)(?=$|\n)", re.I + re.S + re.U + re.M
r"\[(?P<txt>[\n\w -\`]+?)\]:\s+?(?P<url>.+?)(?=$|\n)", re.I + re.S + re.U + re.M
)
def _sub(match):
@ -112,27 +151,38 @@ def auto_link_remapper(no_autodoc=False):
txt = TXT_REMAPS.get(txt, txt)
url = URL_REMAPS.get(url, url)
for strip_prefix in _STRIP_PREFIX:
if url.startswith(strip_prefix):
url = url[len(strip_prefix):]
if any(url.startswith(noremap) for noremap in _NO_REMAP_STARTSWITH):
# skip regular http/s urls etc
return f"[{txt}]({url})"
if "http" in url and "://" in url:
urlout = url
else:
fname, *part = url.rsplit("/", 1)
fname = part[0] if part else fname
if url.startswith("evennia."):
# api link - we want to remove legacy #reference and remove .md
if '#' in url:
_, url = url.rsplit('#', 1)
if url.endswith(".md"):
url, _ = url.rsplit('.', 1)
return f"[{txt}]({url})"
fname, *part = url.rsplit("/", 1)
fname = part[0] if part else fname
fname, *anchor = fname.rsplit("#", 1)
if ".md" in fname:
fname = fname.rsplit(".", 1)[0]
fname, *anchor = fname.rsplit("#", 1)
if not _CURRFILE.endswith("toc.md"):
_USED_REFS[fname] = url
if not _CURRFILE.endswith("toc.md"):
_USED_REFS[fname] = url
if _CURRFILE in docref_map and fname in docref_map[_CURRFILE]:
cfilename = _CURRFILE.rsplit("/", 1)[-1]
urlout = docref_map[_CURRFILE][fname] + ("#" + anchor[0] if anchor else "")
if urlout != url:
print(f" {cfilename}: [{txt}]({url}) -> [{txt}]({urlout})")
else:
urlout = url
if _CURRFILE in docref_map and fname in docref_map[_CURRFILE]:
cfilename = _CURRFILE.rsplit("/", 1)[-1]
urlout = docref_map[_CURRFILE][fname] + ".md" + ("#" + anchor[0].lower() if anchor else "")
if urlout != url:
print(f" {cfilename}: [{txt}]({url}) -> [{txt}]({urlout})")
else:
urlout = url
return f"[{txt}]({urlout})"
@ -145,11 +195,21 @@ def auto_link_remapper(no_autodoc=False):
txt = TXT_REMAPS.get(txt, txt)
url = URL_REMAPS.get(url, url)
for strip_prefix in _STRIP_PREFIX:
if url.startswith(strip_prefix):
url = url[len(strip_prefix):]
if any(url.startswith(noremap) for noremap in _NO_REMAP_STARTSWITH):
return f"[{txt}]: {url}"
urlout = url
if "http" in url and "://" in url:
urlout = url
elif url.startswith("evennia."):
# api link - we want to remove legacy #reference
if '#' in url:
_, urlout = url.rsplit('#', 1)
else:
fname, *part = url.rsplit("/", 1)
fname = part[0] if part else fname
@ -190,12 +250,12 @@ def auto_link_remapper(no_autodoc=False):
print(f" -- Auto-corrected links in {count} documents.")
for (fname, src_url) in sorted(toc_map.items(), key=lambda tup: tup[0]):
if fname not in _USED_REFS:
if fname not in _USED_REFS and not src_url.startswith("api/"):
print(f" ORPHANED DOC: no refs found to {src_url}.md")
# write tocfile
with open(_TOC_FILE, "w") as fil:
fil.write("# Toc\n")
fil.write("```{toctree}\n")
if not no_autodoc:
fil.write("- [API root](api/evennia-api.rst)")
@ -205,17 +265,14 @@ def auto_link_remapper(no_autodoc=False):
if ref == "toc":
continue
if "Part1/" in ref:
continue
# if not "/" in ref:
# ref = "./" + ref
if not "/" in ref:
ref = "./" + ref
linkname = ref.replace("-", " ")
fil.write(f"\n- [{linkname}]({ref})")
# linkname = ref.replace("-", " ")
fil.write(f"\n{ref}") # - [{linkname}]({ref})")
# we add a self-reference so the toc itself is also a part of a toctree
fil.write("\n\n```toctree::\n :hidden:\n\n toc\n```")
fil.write("\n```\n\n```{toctree}\n :hidden:\n\ntoc\n```")
print(" -- Auto-Remapper finished.")

View file

@ -16,7 +16,6 @@ We also need to build the toc-tree and should do so automatically for now.
import glob
import re
import datetime
import textwrap
_RE_MD_LINK = re.compile(r"\[(?P<txt>[\w -\[\]]+?)\]\((?P<url>.+?)\)", re.I + re.S + re.U)
_RE_REF_LINK = re.compile(r"\[[\w -\[\]]*?\]\(.+?\)", re.I + re.S + re.U)
@ -33,7 +32,7 @@ _INDEX_PREFIX = f"""
# VERSION WARNING
> This is the experimental static v0.95 documentation of Evennia, _automatically_ generated from the
> This is the experimental static v0.9 documentation of Evennia, _automatically_ generated from the
> [evennia wiki](https://github.com/evennia/evennia/wiki/) at {datetime.datetime.now()}.
> There are known conversion issues which will _not_ be addressed in this version - refer to
> the original wiki if you have trouble.
@ -214,7 +213,6 @@ def _sub_link(match):
def create_toctree(files):
with open("../source/toc.md", "w") as fil:
fil.write("# Toc\n")
@ -266,25 +264,16 @@ def convert_links(files, outdir):
if text.split("\n")[0].strip().startswith("[]")
else text.split("\n")
)
# wrap text
formatted_lines = []
for line in text:
if line.strip():
formatted_lines.append(textwrap.fill(line, width=100))
else:
formatted_lines.append(line)
text = "\n".join(formatted_lines)
text = "\n".join(text)
if not is_index:
text = f"# {title}\n\n{text}"
with open(outfile, "w") as fil:
fil.write(text)
if __name__ == "__main__":
create_toctree(_INFILES)
convert_links(_INFILES, _OUTDIR)
print("This should not be run on develop files, it would overwrite changes.")
# create_toctree(_INFILES)
# convert_links(_INFILES, _OUTDIR)

45
docs/pylib/fmtwidth.py Normal file
View file

@ -0,0 +1,45 @@
#!/usr/bin python
# -*- coding: utf-8 -*-
"""
Format given files to a max width.
Usage:
python fmtwidth.py --width 79 ../source/**.md
"""
import glob
import textwrap
import argparse
_DEFAULT_WIDTH = 100
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("files")
parser.add_argument("-w", "--width", dest="width", type=int, default=_DEFAULT_WIDTH)
args = parser.parse_args()
filepaths = glob.glob(args.files, recursive=True)
width = args.width
wrapper = textwrap.TextWrapper(width=width, break_long_words=False, expand_tabs=True,)
count = 0
for filepath in filepaths:
with open(filepath, "r") as fil:
lines = fil.readlines()
outlines = [
"\n".join(wrapper.wrap(line)) if len(line) > width else line.strip("\n")
for line in lines
]
txt = "\n".join(outlines)
with open(filepath, "w") as fil:
fil.write(txt)
count += 1
print(f"Wrapped {count} files.")

View file

@ -0,0 +1,111 @@
#
# This creates a Google wiki page for all default commands with __doc__ strings.
#
# Import this from a Django-aware shell, then call run_update.
#
#
from os.path import dirname, abspath, join as pathjoin
from evennia.utils.utils import (
mod_import, variable_from_module, callables_from_module
)
__all__ = ("run_update")
PAGE = """
# Default Commands
The full set of default Evennia commands currently contains {ncommands} commands in {nfiles} source
files. Our policy for adding default commands is outlined [here](Using-MUX-as-a-Standard). The
[Commands](Commands) documentation explains how Commands work as well as make new or customize
existing ones. Note that this page is auto-generated. Report problems to the [issue
tracker](github:issues).
```{{note}}
Some game-states adds their own Commands which are not listed here. Examples include editing a text
with [EvEditor](EvEditor), flipping pages in [EvMore](EvMore) or using the
[Batch-Processor](Batch-Processors)'s interactive mode.
```
{alphabetical}
"""
def run_update(no_autodoc=False):
if no_autodoc:
return
cmdsets = (
("evennia.commands.default.cmdset_character", "CharacterCmdSet"),
("evennia.commands.default.cmdset_account", "AccountCmdSet"),
("evennia.commands.default.cmdset_unloggedin", "UnloggedinCmdSet"),
("evennia.commands.default.cmdset_session", "SessionCmdSet"),
)
cmd_modules = (
"evennia.commands.default.account",
"evennia.commands.default.batchprocess",
"evennia.commands.default.building",
"evennia.commands.default.comms",
"evennia.commands.default.general",
"evennia.commands.default.help",
"evennia.commands.default.syscommandsyyp",
"evennia.commands.default.system",
"evennia.commands.default.unloggedin",
)
cmds_per_cmdset = {}
cmd_to_cmdset_map = {}
for modname, cmdsetname in cmdsets:
cmdset = variable_from_module(modname, variable=cmdsetname)()
cmdset.at_cmdset_creation()
cmds_per_cmdset[cmdsetname] = cmdset.commands
for cmd in cmdset.commands:
cmd_to_cmdset_map[f"{cmd.__module__}.{cmd.__class__.__name__}"] = cmdset
cmds_per_module = {}
cmd_to_module_map = {}
cmds_alphabetically = []
for modname in cmd_modules:
module = mod_import(modname)
cmds_per_module[module] = [
cmd for cmd in callables_from_module(module).values() if cmd.__name__.startswith("Cmd")]
for cmd in cmds_per_module[module]:
cmd_to_module_map[cmd] = module
cmds_alphabetically.append(cmd)
cmds_alphabetically = list(sorted(cmds_alphabetically, key=lambda c: c.key))
cmd_infos = []
for cmd in cmds_alphabetically:
aliases = f" [{', '.join(cmd.aliases)}]" if cmd.aliases else ""
cmdlink = f"[**{cmd.key}**{aliases}]({cmd.__module__}.{cmd.__name__})"
category = f"help-category: _{cmd.help_category.capitalize()}_"
cmdset = cmd_to_cmdset_map.get(f"{cmd.__module__}.{cmd.__name__}", None)
if cmdset:
cmodule = cmdset.__module__
cname = cmdset.__class__.__name__
cmdsetlink = f"cmdset: [{cname}]({cmodule}.{cname}), "
else:
# we skip commands not in the default cmdsets
continue
cmd_infos.append(f"{cmdlink} ({cmdsetlink}{category})")
txt = PAGE.format(
ncommands=len(cmd_to_cmdset_map),
nfiles=len(cmds_per_module),
alphabetical="\n".join(f"- {info}" for info in cmd_infos))
outdir = pathjoin(dirname(dirname(abspath(__file__))), "source")
fname = pathjoin(outdir, "Default-Commands.md")
with open(fname, 'w') as fil:
fil.write(txt)
print(" -- Updated Default Command index.")
if __name__ == "__main__":
run_update()

View file

@ -1,7 +1,7 @@
# A voice operated elevator using events
- Previous tutorial: [Adding dialogues in events](./Dialogues-in-events)
- Previous tutorial: [Adding dialogues in events](./Dialogues-in-events.md)
This tutorial will walk you through the steps to create a voice-operated elevator, using the [in-
game Python
@ -97,7 +97,7 @@ things to decorate it a bit.
But what we want now is to be able to say "1", "2" or "3" and have the elevator move in that
direction.
If you have read [the previous tutorial about adding dialogues in events](./Dialogues-in-events), you
If you have read [the previous tutorial about adding dialogues in events](./Dialogues-in-events.md), you
may remember what we need to do. If not, here's a summary: we need to run some code when somebody
speaks in the room. So we need to create a callback (the callback will contain our lines of code).
We just need to know on which event this should be set. You can enter `call here` to see the
@ -433,4 +433,4 @@ to consider adding the code in the source itself. Another possibility is to cal
with the expected behavior, which makes porting code very easy. This side of chained events will be
shown in the next tutorial.
- Previous tutorial: [Adding dialogues in events](./Dialogues-in-events)
- Previous tutorial: [Adding dialogues in events](./Dialogues-in-events.md)

View file

@ -1,27 +1,27 @@
# Accounts
All *users* (real people) that starts a game [Session](./Sessions) on Evennia are doing so through an
All *users* (real people) that starts a game [Session](./Sessions.md) on Evennia are doing so through an
object called *Account*. The Account object has no in-game representation, it represents a unique
game account. In order to actually get on the game the Account must *puppet* an [Object](./Objects)
(normally a [Character](./Objects#Character)).
game account. In order to actually get on the game the Account must *puppet* an [Object](./Objects.md)
(normally a [Character](./Objects.md#characters)).
Exactly how many Sessions can interact with an Account and its Puppets at once is determined by
Evennia's [MULTISESSION_MODE](./Sessions#Multisession-mode) setting.
Evennia's [MULTISESSION_MODE](./Sessions.md#multisession-mode) setting.
Apart from storing login information and other account-specific data, the Account object is what is
chatting on [Channels](./Communications). It is also a good place to store [Permissions](./Locks) to be
chatting on [Channels](./Communications.md). It is also a good place to store [Permissions](./Locks.md) to be
consistent between different in-game characters as well as configuration options. The Account
object also has its own [CmdSet](./Command-Sets), the `AccountCmdSet`.
object also has its own [CmdSet](./Command-Sets.md), the `AccountCmdSet`.
Logged into default evennia, you can use the `ooc` command to leave your current
[character](./Objects) and go into OOC mode. You are quite limited in this mode, basically it works
[character](./Objects.md) and go into OOC mode. You are quite limited in this mode, basically it works
like a simple chat program. It acts as a staging area for switching between Characters (if your
game supports that) or as a safety mode if your Character gets deleted. Use `ic` to attempt to
(re)puppet a Character.
Note that the Account object can have, and often does have, a different set of
[Permissions](./Locks#Permissions) from the Character they control. Normally you should put your
[Permissions](./Locks.md#permissions) from the Character they control. Normally you should put your
permissions on the Account level - this will overrule permissions set on the Character level. For
the permissions of the Character to come into play the default `quell` command can be used. This
allows for exploring the game using a different permission set (but you can't escalate your
@ -77,7 +77,7 @@ You should now see the Attributes on yourself.
## Properties on Accounts
Beyond those properties assigned to all typeclassed objects (see [Typeclasses](./Typeclasses)), the
Beyond those properties assigned to all typeclassed objects (see [Typeclasses](./Typeclasses.md)), the
Account also has the following custom properties:
- `user` - a unique link to a `User` Django object, representing the logged-in user.
@ -92,11 +92,11 @@ as
- `is_superuser` (bool: True/False) - if this account is a superuser.
Special handlers:
- `cmdset` - This holds all the current [Commands](./Commands) of this Account. By default these are
- `cmdset` - This holds all the current [Commands](./Commands.md) of this Account. By default these are
the commands found in the cmdset defined by `settings.CMDSET_ACCOUNT`.
- `nicks` - This stores and handles [Nicks](./Nicks), in the same way as nicks it works on Objects.
- `nicks` - This stores and handles [Nicks](./Nicks.md), in the same way as nicks it works on Objects.
For Accounts, nicks are primarily used to store custom aliases for
[Channels](./Communications#Channels).
[Channels](./Communications.md#channels).
Selection of special methods (see `evennia.DefaultAccount` for details):
- `get_puppet` - get a currently puppeted object connected to the Account and a given session id, if

View file

@ -2,7 +2,7 @@
**Before doing this tutorial you will probably want to read the intro in
[Basic Web tutorial](./Web-Tutorial).** Reading the three first parts of the
[Basic Web tutorial](./Web-Tutorial.md).** Reading the three first parts of the
[Django tutorial](https://docs.djangoproject.com/en/1.9/intro/tutorial01/) might help as well.
This tutorial will provide a step-by-step process to installing a wiki on your website.

View file

@ -1,6 +1,6 @@
# Adding Command Tutorial
This is a quick first-time tutorial expanding on the [Commands](./Commands) documentation.
This is a quick first-time tutorial expanding on the [Commands](./Commands.md) documentation.
Let's assume you have just downloaded Evennia, installed it and created your game folder (let's call
it just `mygame` here). Now you want to try to add a new command. This is the fastest way to do it.
@ -16,7 +16,7 @@ example code.
1. Give your class a useful _docstring_. A docstring is the string at the very top of a class or
function/method. The docstring at the top of the command class is read by Evennia to become the help
entry for the Command (see
[Command Auto-help](./Help-System#command-auto-help-system)).
[Command Auto-help](./Help-System.md#command-auto-help-system)).
1. Define a class method `func(self)` that echoes your input back to you.
Below is an example how this all could look for the echo command:
@ -47,7 +47,7 @@ Below is an example how this all could look for the echo command:
## Step 2: Adding the Command to a default Cmdset
The command is not available to use until it is part of a [Command Set](./Command-Sets). In this
The command is not available to use until it is part of a [Command Set](./Command-Sets.md). In this
example we will go the easiest route and add it to the default Character commandset that already
exists.
@ -87,13 +87,13 @@ your command definition).
by
its argument `test` (which will end up in `self.args). To change this behavior, you can add the
`arg_regex` property alongside `key`, `help_category` etc. [See the arg_regex
documentation](Commands#on-arg_regex) for more info.
documentation](./Commands.md#on-arg_regex) for more info.
If you want to overload existing default commands (such as `look` or `get`), just add your new
command with the same key as the old one - it will then replace it. Just remember that you must use
`@reload` to see any changes.
See [Commands](./Commands) for many more details and possibilities when defining Commands and using
See [Commands](./Commands.md) for many more details and possibilities when defining Commands and using
Cmdsets in various ways.
@ -102,7 +102,7 @@ Cmdsets in various ways.
Adding your Command to the `CharacterCmdSet` is just one easy exapmple. The cmdset system is very
generic. You can create your own cmdsets (let's say in a module `mycmdsets.py`) and add them to
objects as you please (how to control their merging is described in detail in the [Command Set
documentation](Command-Sets)).
documentation](./Command-Sets.md)).
```python
# file mygame/commands/mycmdsets.py
@ -131,7 +131,7 @@ only make the new merged cmdset permanent on that *single* object. Often you wan
this particular class to have this cmdset.
To make sure all new created objects get your new merged set, put the `cmdset.add` call in your
custom [Typeclasses](./Typeclasses)' `at_object_creation` method:
custom [Typeclasses](./Typeclasses.md)' `at_object_creation` method:
```python
# e.g. in mygame/typeclasses/objects.py

View file

@ -13,9 +13,9 @@ When you create a new Evennia game (with for example `evennia --init mygame`) Ev
automatically create empty child classes `Object`, `Character`, `Room` and `Exit` respectively. They
are found `mygame/typeclasses/objects.py`, `mygame/typeclasses/rooms.py` etc.
> Technically these are all [Typeclassed](./Typeclasses), which can be ignored for now. In
> Technically these are all [Typeclassed](./Typeclasses.md), which can be ignored for now. In
> `mygame/typeclasses` are also base typeclasses for out-of-character things, notably
> [Channels](./Communications), [Accounts](./Accounts) and [Scripts](./Scripts). We don't cover those in
> [Channels](./Communications.md), [Accounts](./Accounts.md) and [Scripts](./Scripts.md). We don't cover those in
> this tutorial.
For your own game you will most likely want to expand on these very simple beginnings. It's normal
@ -62,13 +62,13 @@ up.
you will find the traceback. The most common error is that you have some sort of syntax error in
your class.
Note that the [Locks](./Locks) and [Attribute](./Attributes) which are set in the typeclass could just
Note that the [Locks](./Locks.md) and [Attribute](./Attributes.md) which are set in the typeclass could just
as well have been set using commands in-game, so this is a *very* simple example.
## Storing data on initialization
The `at_object_creation` is only called once, when the object is first created. This makes it ideal
for database-bound things like [Attributes](./Attributes). But sometimes you want to create temporary
for database-bound things like [Attributes](./Attributes.md). But sometimes you want to create temporary
properties (things that are not to be stored in the database but still always exist every time the
object is created). Such properties can be initialized in the `at_init` method on the object.
`at_init` is called every time the object is loaded into memory.
@ -86,7 +86,7 @@ def at_init(self):
self.ndb.mylist = []
```
> Note: As mentioned in the [Typeclasses](./Typeclasses) documentation, `at_init` replaces the use of
> Note: As mentioned in the [Typeclasses](./Typeclasses.md) documentation, `at_init` replaces the use of
> the standard `__init__` method of typeclasses due to how the latter may be called in situations
> other than you'd expect. So use `at_init` where you would normally use `__init__`.

View file

@ -5,48 +5,48 @@ are responsible for managing the game.
### Installation and Early Life
- [Choosing (and installing) an SQL Server](./Choosing-An-SQL-Server)
- [Getting Started - Installing Evennia](./Getting-Started)
- [Running Evennia in Docker Containers](./Running-Evennia-in-Docker)
- [Starting, stopping, reloading and resetting Evennia](./Start-Stop-Reload)
- [Keeping your game up to date](./Updating-Your-Game)
- [Resetting your database](./Updating-Your-Game#resetting-your-database)
- [Making your game available online](./Online-Setup)
- [Hosting options](./Online-Setup#hosting-options)
- [Securing your server with SSL/Let's Encrypt](./Online-Setup#ssl)
- [Listing your game](./Evennia-Game-Index) at the online [Evennia game
- [Choosing (and installing) an SQL Server](./Choosing-An-SQL-Server.md)
- [Getting Started - Installing Evennia](./Getting-Started.md)
- [Running Evennia in Docker Containers](./Running-Evennia-in-Docker.md)
- [Starting, stopping, reloading and resetting Evennia](./Start-Stop-Reload.md)
- [Keeping your game up to date](./Updating-Your-Game.md)
- [Resetting your database](./Updating-Your-Game.md#resetting-your-database)
- [Making your game available online](./Online-Setup.md)
- [Hosting options](./Online-Setup.md#hosting-options)
- [Securing your server with SSL/Let's Encrypt](./Online-Setup.md#ssl)
- [Listing your game](./Evennia-Game-Index.md) at the online [Evennia game
index](http://games.evennia.com)
### Customizing the server
- [Changing the Settings](./Server-Conf#Settings-file)
- [Changing the Settings](./Server-Conf.md#settings-file)
- [Available Master
Settings](https://github.com/evennia/evennia/blob/master/evennia/settings_default.py)
- [Change Evennia's language](./Internationalization) (internationalization)
- [Apache webserver configuration](./Apache-Config) (optional)
- [Changing text encodings used by the server](./Text-Encodings)
- [The Connection Screen](./Connection-Screen)
- [Guest Logins](./Guest-Logins)
- [How to connect Evennia to IRC channels](./IRC)
- [How to connect Evennia to RSS feeds](./RSS)
- [How to connect Evennia to Grapevine](./Grapevine)
- [How to connect Evennia to Twitter](./How-to-connect-Evennia-to-Twitter)
- [Change Evennia's language](./Internationalization.md) (internationalization)
- [Apache webserver configuration](./Apache-Config.md) (optional)
- [Changing text encodings used by the server](./Text-Encodings.md)
- [The Connection Screen](./Connection-Screen.md)
- [Guest Logins](./Guest-Logins.md)
- [How to connect Evennia to IRC channels](./IRC.md)
- [How to connect Evennia to RSS feeds](./RSS.md)
- [How to connect Evennia to Grapevine](./Grapevine.md)
- [How to connect Evennia to Twitter](./How-to-connect-Evennia-to-Twitter.md)
### Administrating the running game
- [Supported clients](./Client-Support-Grid) (grid of known client issues)
- [Changing Permissions](./Building-Permissions) of users
- [Banning](./Banning) and deleting users
- [Summary of abuse-handling tools](./Banning#summary-of-abuse-handling-tools) in the default cmdset
- [Supported clients](./Client-Support-Grid.md) (grid of known client issues)
- [Changing Permissions](./Building-Permissions.md) of users
- [Banning](./Banning.md) and deleting users
- [Summary of abuse-handling tools](./Banning.md#summary-of-abuse-handling-tools) in the default cmdset
### Working with Evennia
- [Setting up your work environment with version control](./Version-Control)
- [First steps coding with Evennia](./First-Steps-Coding)
- [Setting up a continuous integration build environment](./Continuous-Integration)
- [Setting up your work environment with version control](./Version-Control.md)
- [First steps coding with Evennia](./First-Steps-Coding.md)
- [Setting up a continuous integration build environment](./Continuous-Integration.md)
```toctree::
```{toctree}
:hidden:
Choosing-An-SQL-Server

View file

@ -11,7 +11,7 @@ to pick ideas or even get a starting game to build on. These instructions are ba
released as of *Aug 12, 2018*.
If you are not familiar with what Evennia is, you can read
[an introduction here](./Evennia-Introduction).
[an introduction here](./Evennia-Introduction.md).
It's not too hard to run Arx from the sources (of course you'll start with an empty database) but
since part of Arx has grown organically, it doesn't follow standard Evennia paradigms everywhere.
@ -24,7 +24,7 @@ Firstly, set aside a folder/directory on your drive for everything to follow.
You need to start by installing [Evennia](http://www.evennia.com) by following most of the [Getting
Started
Instructions](Getting-Started) for your OS. The difference is that you need to `git clone
Instructions](./Getting-Started.md) for your OS. The difference is that you need to `git clone
https://github.com/TehomCD/evennia.git` instead of Evennia's repo because Arx uses TehomCD's older
Evennia 0.8 [fork](https://github.com/TehomCD/evennia), notably still using Python2. This detail is
important if referring to newer Evennia documentation.
@ -32,7 +32,7 @@ important if referring to newer Evennia documentation.
If you are new to Evennia it's *highly* recommended that you run through the
instructions in full - including initializing and starting a new empty game and connecting to it.
That way you can be sure Evennia works correctly as a base line. If you have trouble, make sure to
read the [Troubleshooting instructions](./Getting-Started#troubleshooting) for your
read the [Troubleshooting instructions](./Getting-Started.md#troubleshooting) for your
operating system. You can also drop into our
[forums](https://groups.google.com/forum/#%21forum/evennia), join `#evennia` on `irc.freenode.net`
or chat from the linked [Discord Server](https://discord.gg/NecFePw).
@ -64,7 +64,7 @@ A new folder `myarx` should appear next to the ones you already had. You could r
something else if you want.
Cd into `myarx`. If you wonder about the structure of the game dir, you can [read more about it
here](Directory-Overview).
here](./Directory-Overview.md).
### Clean up settings

View file

@ -90,7 +90,7 @@ line quite pointless for processing any data from the function. Instead one has
- `at_err_kwargs` - an optional dictionary that will be fed as keyword arguments to the `at_err`
errback.
An example of making an asynchronous call from inside a [Command](./Commands) definition:
An example of making an asynchronous call from inside a [Command](./Commands.md) definition:
```python
from evennia import utils, Command
@ -139,7 +139,7 @@ sleep.
```
This will delay the execution of the callback for 10 seconds. This function is explored much more in
the [Command Duration Tutorial](./Command-Duration).
the [Command Duration Tutorial](./Command-Duration.md).
You can also try the following snippet just see how it works:

View file

@ -7,8 +7,8 @@ can give correct subsequent commands. If you are writing a combat system, you mi
combattant's next roll get easier dependent on if their opponent failed. Your characters will
probably need to store roleplaying-attributes like strength and agility. And so on.
[Typeclassed](./Typeclasses) game entities ([Accounts](./Accounts), [Objects](./Objects),
[Scripts](./Scripts) and [Channels](./Communications)) always have *Attributes* associated with them.
[Typeclassed](./Typeclasses.md) game entities ([Accounts](./Accounts.md), [Objects](./Objects.md),
[Scripts](./Scripts.md) and [Channels](./Communications.md)) always have *Attributes* associated with them.
Attributes are used to store any type of data 'on' such entities. This is different from storing
data in properties already defined on entities (such as `key` or `location`) - these have very
specific names and require very specific types of data (for example you couldn't assign a python
@ -16,12 +16,12 @@ specific names and require very specific types of data (for example you couldn't
want to assign arbitrary data to arbitrary names.
**Attributes are _not_ secure by default and any player may be able to change them unless you
[prevent this behavior](./Attributes#locking-and-checking-attributes).**
[prevent this behavior](./Attributes.md#locking-and-checking-attributes).**
## The .db and .ndb shortcuts
To save persistent data on a Typeclassed object you normally use the `db` (DataBase) operator. Let's
try to save some data to a *Rose* (an [Object](./Objects)):
try to save some data to a *Rose* (an [Object](./Objects.md)):
```python
# saving
@ -87,13 +87,13 @@ The handlers have normal access methods that allow you to manage and retrieve `A
returned, but the method takes keywords for returning the Attribute object itself. By supplying an
`accessing_object` to the call one can also make sure to check permissions before modifying
anything.
- `add(...)` - this adds a new Attribute to the object. An optional [lockstring](./Locks) can be
- `add(...)` - this adds a new Attribute to the object. An optional [lockstring](./Locks.md) can be
supplied here to restrict future access and also the call itself may be checked against locks.
- `remove(...)` - Remove the given Attribute. This can optionally be made to check for permission
before performing the deletion. - `clear(...)` - removes all Attributes from object.
- `all(...)` - returns all Attributes (of the given category) attached to this object.
See [this section](./Attributes#locking-and-checking-attributes) for more about locking down Attribute
See [this section](./Attributes.md#locking-and-checking-attributes) for more about locking down Attribute
access and editing. The `Nattribute` offers no concept of access control.
Some examples:
@ -118,23 +118,23 @@ An Attribute object is stored in the database. It has the following properties:
to `attrname`.
- `value` - this is the value of the Attribute. This value can be anything which can be pickled -
objects, lists, numbers or what have you (see
[this section](./Attributes#What_types_of_data_can_I_save_in_an_Attribute) for more info). In the
[this section](./Attributes.md#what-types-of-data-can-i-save-in-an-attribute) for more info). In the
example
`obj.db.attrname = value`, the `value` is stored here.
- `category` - this is an optional property that is set to None for most Attributes. Setting this
allows to use Attributes for different functionality. This is usually not needed unless you want
to use Attributes for very different functionality ([Nicks](./Nicks) is an example of using
to use Attributes for very different functionality ([Nicks](./Nicks.md) is an example of using
Attributes
in this way). To modify this property you need to use the [Attribute
Handler](Attributes#The_Attribute_Handler).
Handler](#the-attributehandler).
- `strvalue` - this is a separate value field that only accepts strings. This severely limits the
data possible to store, but allows for easier database lookups. This property is usually not used
except when re-using Attributes for some other purpose ([Nicks](./Nicks) use it). It is only
accessible via the [Attribute Handler](./Attributes#The_Attribute_Handler).
except when re-using Attributes for some other purpose ([Nicks](./Nicks.md) use it). It is only
accessible via the [Attribute Handler](./Attributes.md#the-attributehandler).
There are also two special properties:
- `attrtype` - this is used internally by Evennia to separate [Nicks](./Nicks), from Attributes (Nicks
- `attrtype` - this is used internally by Evennia to separate [Nicks](./Nicks.md), from Attributes (Nicks
use Attributes behind the scenes).
- `model` - this is a *natural-key* describing the model this Attribute is attached to. This is on
the form *appname.modelclass*, like `objects.objectdb`. It is used by the Attribute and
@ -162,7 +162,7 @@ default
during heavy loads.
- A more valid reason for using non-persistent data is if you *want* to lose your state when logging
off. Maybe you are storing throw-away data that are re-initialized at server startup. Maybe you
are implementing some caching of your own. Or maybe you are testing a buggy [Script](./Scripts) that
are implementing some caching of your own. Or maybe you are testing a buggy [Script](./Scripts.md) that
does potentially harmful stuff to your character object. With non-persistent storage you can be
sure
that whatever is messed up, it's nothing a server reboot can't clear up.
@ -192,7 +192,7 @@ not a big deal. But if you are accessing the Attribute as part of some big loop
amount of reads/writes you should first extract it to a temporary variable, operate on *that* and
then save the result back to the Attribute. If you are storing a more complex structure like a
`dict` or a `list` you should make sure to "disconnect" it from the database before looping over it,
as mentioned in the [Retrieving Mutable Objects](./Attributes#retrieving-mutable-objects) section
as mentioned in the [Retrieving Mutable Objects](./Attributes.md#retrieving-mutable-objects) section
below.
### Storing single objects
@ -246,7 +246,7 @@ containing dicts, etc.
Since you can use any combination of the above iterables, this is generally not much of a
limitation.
Any entity listed in the [Single object](./Attributes#Storing-Single-Objects) section above can be
Any entity listed in the [Single object](./Attributes.md#storing-single-objects) section above can be
stored in the iterable.
> As mentioned in the previous section, database entities (aka typeclasses) are not possible to
@ -353,7 +353,7 @@ already disconnected from the database from the onset.
Attributes are normally not locked down by default, but you can easily change that for individual
Attributes (like those that may be game-sensitive in games with user-level building).
First you need to set a *lock string* on your Attribute. Lock strings are specified [Locks](./Locks).
First you need to set a *lock string* on your Attribute. Lock strings are specified [Locks](./Locks.md).
The relevant lock types are
- `attrread` - limits who may read the value of the Attribute

View file

@ -114,14 +114,14 @@ is not what you want in this case.
- **cboot mychannel = thomas** -- Boot a subscriber from a channel you control
- **clock mychannel = control:perm(Admin);listen:all();send:all()** -- Fine control of access to
your channel using [lock definitions](./Locks).
your channel using [lock definitions](./Locks.md).
Locking a specific command (like `page`) is accomplished like so:
1. Examine the source of the command. [The default `page` command class](
https://github.com/evennia/evennia/blob/master/evennia/commands/default/comms.py#L686) has the lock
string **"cmd:not pperm(page_banned)"**. This means that unless the player has the 'permission'
"page_banned" they can use this command. You can assign any lock string to allow finer customization
in your commands. You might look for the value of an [Attribute](./Attributes) or [Tag](./Tags), your
in your commands. You might look for the value of an [Attribute](./Attributes.md) or [Tag](./Tags.md), your
current location etc.
2. **perm/account thomas = page_banned** -- Give the account the 'permission' which causes (in this
case) the lock to fail.

View file

@ -1,7 +1,7 @@
# Batch Code Processor
For an introduction and motivation to using batch processors, see [here](./Batch-Processors). This
For an introduction and motivation to using batch processors, see [here](./Batch-Processors.md). This
page describes the Batch-*code* processor. The Batch-*command* one is covered [here](Batch-Command-
Processor).
@ -192,7 +192,7 @@ connect that room with a room you built in the current block. There are two ways
- Perform a database search for the name of the room you created (since you cannot know in advance
which dbref it got assigned). The problem is that a name may not be unique (you may have a lot of "A
dark forest" rooms). There is an easy way to handle this though - use [Tags](./Tags) or *Aliases*. You
dark forest" rooms). There is an easy way to handle this though - use [Tags](./Tags.md) or *Aliases*. You
can assign any number of tags and/or aliases to any object. Make sure that one of those tags or
aliases is unique to the room (like "room56") and you will henceforth be able to always uniquely
search and find it later.

View file

@ -1,7 +1,7 @@
# Batch Command Processor
For an introduction and motivation to using batch processors, see [here](./Batch-Processors). This
For an introduction and motivation to using batch processors, see [here](./Batch-Processors.md). This
page describes the Batch-*command* processor. The Batch-*code* one is covered [here](Batch-Code-
Processor).
@ -152,7 +152,7 @@ when creating the file, so that you can 'walk' (or teleport) to the right places
This also means there are several pitfalls when designing and adding certain types of objects. Here
are some examples:
- *Rooms that change your [Command Set](./Command-Sets)*: Imagine that you build a 'dark' room, which
- *Rooms that change your [Command Set](./Command-Sets.md)*: Imagine that you build a 'dark' room, which
severely limits the cmdsets of those entering it (maybe you have to find the light switch to
proceed). In your batch script you would create this room, then teleport to it - and promptly be
shifted into the dark state where none of your normal build commands work ...
@ -172,7 +172,7 @@ The fact that you build as 'yourself' can also be considered an advantage howeve
decide to change the default command to allow others than superusers to call the processor. Since
normal access-checks are still performed, a malevolent builder with access to the processor should
not be able to do all that much damage (this is the main drawback of the [Batch Code
Processor](Batch-Code-Processor))
Processor](./Batch-Code-Processor.md))
- [GNU Emacs](https://www.gnu.org/software/emacs/) users might find it interesting to use emacs'
*evennia mode*. This is an Emacs major mode found in `evennia/utils/evennia-mode.el`. It offers

View file

@ -35,8 +35,8 @@ just list in-game commands in a text file. The code-processor on the other hand
powerful but also more complex - it lets you use Evennia's API to code your world in full-fledged
Python code.
- The [Batch Command Processor](./Batch-Command-Processor)
- The [Batch Code Processor](./Batch-Code-Processor)
- The [Batch Command Processor](./Batch-Command-Processor.md)
- The [Batch Code Processor](./Batch-Code-Processor.md)
If you plan to use international characters in your batchfiles you are wise to read about *file
encodings* below.
@ -73,7 +73,7 @@ need to add the editor's encoding to Evennia's `ENCODINGS` list. If you are unsu
file with lots of non-ASCII letters in the editor of your choice, then import to make sure it works
as it should.
More help with encodings can be found in the entry [Text Encodings](./Text-Encodings) and also in the
More help with encodings can be found in the entry [Text Encodings](./Text-Encodings.md) and also in the
Wikipedia article [here](http://en.wikipedia.org/wiki/Text_encodings).
**A footnote for the batch-code processor**: Just because *Evennia* can parse your file and your

View file

@ -2,8 +2,8 @@
Bootstrap provides many utilities and components you can use when customizing Evennia's web
presence. We'll go over a few examples here that you might find useful.
> Please take a look at either [the basic web tutorial](./Add-a-simple-new-web-page) or [the web
character view tutorial](Web-Character-View-Tutorial)
> Please take a look at either [the basic web tutorial](./Add-a-simple-new-web-page.md) or [the web
character view tutorial](./Web-Character-View-Tutorial.md)
> to get a feel for how to add pages to Evennia's website to test these examples.
## General Styling
@ -79,4 +79,4 @@ width of the page - Evennia's base site uses the former.
### Forms
[Forms](https://getbootstrap.com/docs/4.0/components/forms/) are highly customizable with Bootstrap.
For a more in-depth look at how to use forms and their styles in your own Evennia site, please read
over [the web character gen tutorial.](./Web-Character-Generation)
over [the web character gen tutorial.](./Web-Character-Generation.md)

View file

@ -4,29 +4,29 @@ This section contains information useful to world builders.
### Building basics
- [Default in-game commands](api:evennia.commands.default)
- [Building Quick-start](./Building-Quickstart)
- [Giving build permissions to others](./Building-Permissions)
- [Adding text tags](./TextTags)
- [Colored text](./TextTags#coloured-text)
- [Clickable links](./TextTags#clickable-links)
- [Inline functions](./TextTags#inline-functions)
- [Customizing the connection screen](./Connection-Screen)
- [Default in-game commands](evennia.commands.default)
- [Building Quick-start](./Building-Quickstart.md)
- [Giving build permissions to others](./Building-Permissions.md)
- [Adding text tags](./TextTags.md)
- [Colored text](./TextTags.md#coloured-text)
- [Clickable links](./TextTags.md#clickable-links)
- [Inline functions](./TextTags.md#inline-functions)
- [Customizing the connection screen](./Connection-Screen.md)
### Advanced building and World building
- [Overview of batch processors](./Batch-Processors)
- [Batch-command processor](./Batch-Command-Processor)
- [Batch-code processor](./Batch-Code-Processor)
- [Using the Spawner for individualizing objects](./Spawner-and-Prototypes)
- [Adding Zones](./Zones)
- [Overview of batch processors](./Batch-Processors.md)
- [Batch-command processor](./Batch-Command-Processor.md)
- [Batch-code processor](./Batch-Code-Processor.md)
- [Using the Spawner for individualizing objects](./Spawner-and-Prototypes.md)
- [Adding Zones](./Zones.md)
### The Tutorial world
- [Introduction and setup](./Tutorial-World-Introduction)
- [Introduction and setup](./Tutorial-World-Introduction.md)
```toctree::
```{toctree}
:hidden:
Building-Quickstart

View file

@ -2,7 +2,7 @@
*OBS: This gives only a brief introduction to the access system. Locks and permissions are fully
detailed* [here](./Locks).
detailed* [here](./Locks.md).
## The super user
@ -17,7 +17,7 @@ but one superuser.
Whereas permissions can be used for anything, those put in `settings.PERMISSION_HIERARCHY` will have
a ranking relative each other as well. We refer to these types of permissions as *hierarchical
permissions*. When building locks to check these permissions, the `perm()` [lock function](./Locks) is
permissions*. When building locks to check these permissions, the `perm()` [lock function](./Locks.md) is
used. By default Evennia creates the following hierarchy (spelled exactly like this):
1. **Developers** basically have the same access as superusers except that they do *not* sidestep

View file

@ -1,8 +1,8 @@
# Building Quickstart
The [default command](./Default-Command-Help) definitions coming with Evennia
follows a style [similar](./Using-MUX-as-a-Standard) to that of MUX, so the
The [default command](./Default-Commands.md) definitions coming with Evennia
follows a style [similar](./Using-MUX-as-a-Standard.md) to that of MUX, so the
commands should be familiar if you used any such code bases before.
> Throughout the larger documentation you may come across commands prefixed
@ -85,14 +85,14 @@ dropped in the room, then try this:
lock box = get:false()
Locks represent a rather [big topic](./Locks), but for now that will do what we want. This will lock
Locks represent a rather [big topic](./Locks.md), but for now that will do what we want. This will lock
the box so noone can lift it. The exception is superusers, they override all locks and will pick it
up anyway. Make sure you are quelling your superuser powers and try to get the box now:
> get box
You can't get that.
Think thís default error message looks dull? The `get` command looks for an [Attribute](./Attributes)
Think thís default error message looks dull? The `get` command looks for an [Attribute](./Attributes.md)
named `get_err_msg` for returning a nicer error message (we just happen to know this, you would need
to peek into the
[code](https://github.com/evennia/evennia/blob/master/evennia/commands/default/general.py#L235) for
@ -110,11 +110,11 @@ the raw description of your current room (including color codes), so that you ca
set its description to something else.
You create new Commands (or modify existing ones) in Python outside the game. See the [Adding
Commands tutorial](Adding-Command-Tutorial) for help with creating your first own Command.
Commands tutorial](./Adding-Command-Tutorial.md) for help with creating your first own Command.
## Get a Personality
[Scripts](./Scripts) are powerful out-of-character objects useful for many "under the hood" things.
[Scripts](./Scripts.md) are powerful out-of-character objects useful for many "under the hood" things.
One of their optional abilities is to do things on a timer. To try out a first script, let's put one
on ourselves. There is an example script in `evennia/contrib/tutorial_examples/bodyfunctions.py`
that is called `BodyFunctions`. To add this to us we will use the `script` command:
@ -137,14 +137,14 @@ When you are tired of your character's "insights", kill the script with
script/stop self = tutorial_examples.bodyfunctions.BodyFunctions
You create your own scripts in Python, outside the game; the path you give to `script` is literally
the Python path to your script file. The [Scripts](./Scripts) page explains more details.
the Python path to your script file. The [Scripts](./Scripts.md) page explains more details.
## Pushing Your Buttons
If we get back to the box we made, there is only so much fun you can do with it at this point. It's
just a dumb generic object. If you renamed it to `stone` and changed its description noone would be
the wiser. However, with the combined use of custom [Typeclasses](./Typeclasses), [Scripts](./Scripts)
and object-based [Commands](./Commands), you could expand it and other items to be as unique, complex
the wiser. However, with the combined use of custom [Typeclasses](./Typeclasses.md), [Scripts](./Scripts.md)
and object-based [Commands](./Commands.md), you could expand it and other items to be as unique, complex
and interactive as you want.
Let's take an example. So far we have only created objects that use the default object typeclass
@ -161,7 +161,7 @@ sure to look in`evennia/contrib/` so you don't have to write the full path every
- one red button.
The RedButton is an example object intended to show off a few of Evennia's features. You will find
that the [Typeclass](./Typeclasses) and [Commands](./Commands) controlling it are inside
that the [Typeclass](./Typeclasses.md) and [Commands](./Commands.md) controlling it are inside
`evennia/contrib/tutorial_examples/`.
If you wait for a while (make sure you dropped it!) the button will blink invitingly. Why don't you

View file

@ -28,9 +28,9 @@ Before we continue, lets make a brief detour. Evennia is very flexible about
more flexible about using and adding commands to those objects. Here are some ground rules well
worth remembering for the remainder of this article:
- The [Account](./Accounts) represents the real person logging in and has no game-world existence.
- Any [Object](./Objects) can be puppeted by an Account (with proper permissions).
- [Characters](./Objects#characters), [Rooms](./Objects#rooms), and [Exits](./Objects#exits) are just
- The [Account](./Accounts.md) represents the real person logging in and has no game-world existence.
- Any [Object](./Objects.md) can be puppeted by an Account (with proper permissions).
- [Characters](./Objects.md#characters), [Rooms](./Objects.md#rooms), and [Exits](./Objects.md#exits) are just
children of normal Objects.
- Any Object can be inside another (except if it creates a loop).
- Any Object can store custom sets of commands on it. Those commands can:
@ -120,7 +120,7 @@ about the missiles being fired and has different `key` and `aliases`. We leave
that up to you to create as an exercise. You could have it print "WOOSH! The
mech launches missiles against <target>!", for example.
Now we shove our commands into a command set. A [Command Set](./Command-Sets) (CmdSet) is a container
Now we shove our commands into a command set. A [Command Set](./Command-Sets.md) (CmdSet) is a container
holding any number of commands. The command set is what we will store on the mech.
```python
@ -173,7 +173,7 @@ This is great for testing. The way we added it, the MechCmdSet will even go away
server. Now we want to make the mech an actual object “type” so we can create mechs without those
extra steps. For this we need to create a new Typeclass.
A [Typeclass](./Typeclasses) is a near-normal Python class that stores its existence to the database
A [Typeclass](./Typeclasses.md) is a near-normal Python class that stores its existence to the database
behind the scenes. A Typeclass is created in a normal Python source file:
```python

View file

@ -1,96 +1,73 @@
# Client Support Grid
This grid tries to gather info about different MU clients when used with Evennia.
If you want to report a problem, update an entry or add a client, make a
If you want to report a problem, update an entry or add a client, make a
new [documentation issue](github:issue) for it. Everyone's encouraged to report their findings.
##### Legend:
## Client Grid
Legend:
- **Name**: The name of the client. Also note if it's OS-specific.
- **Version**: Which version or range of client versions were tested.
- **Comments**: Any quirks on using this client with Evennia should be added here.
## Client Grid
```eval_rst
| Name | Version tested | Comments |
| --- | --- | --- |
| [Evennia Webclient][1] | 1.0+ | Evennia-specific |
| [tintin++][2] | 2.0+ | No MXP support |
| [tinyfugue][3] | 5.0+ | No UTF-8 support |
| [MUSHclient][4] (Win) | 4.94 | NAWS reports full text area |
| [Zmud][5] (Win) | 7.21 | *UNTESTED* |
| [Cmud][6] (Win) | v3 | *UNTESTED* |
| [Potato][7]_ | 2.0.0b16 | No MXP, MCCP support. Win 32bit does not understand |
| | | "localhost", must use `127.0.0.1`. |
| [Mudlet][8] | 3.4+ | No known issues. Some older versions showed <> as html |
| | | under MXP. |
| [SimpleMU][9] (Win) | full | Discontinued. NAWS reports pixel size. |
| [Atlantis][10] (Mac) | 0.9.9.4 | No known issues. |
| [GMUD][11] | 0.0.1 | Can't handle any telnet handshakes. Not recommended. |
| [BeipMU][12] (Win) | 3.0.255 | No MXP support. Best to enable "MUD prompt handling", disable |
| | | "Handle HTML tags". |
| [MudRammer][13] (IOS) | 1.8.7 | Bad Telnet Protocol compliance: displays spurious characters. |
| [MUDMaster][14] | 1.3.1 | *UNTESTED* |
| [BlowTorch][15] (Andr) | 1.1.3 | Telnet NOP displays as spurious character. |
| [Mukluk][16] (Andr) | 2015.11.20| Telnet NOP displays as spurious character. Has UTF-8/Emoji |
| | | support. |
| [Gnome-MUD][17] (Unix) | 0.11.2 | Telnet handshake errors. First (only) attempt at logging in |
| | | fails. |
| [Spyrit][18] | 0.4 | No MXP, OOB support. |
| [JamochaMUD][19] | 5.2 | Does not support ANSI within MXP text. |
| [DuckClient][20] (Chrome) | 4.2 | No MXP support. Displays Telnet Go-Ahead and |
| | | WILL SUPPRESS-GO-AHEAD as ù character. Also seems to run |
| | | the `version` command on connection, which will not work in |
| | | `MULTISESSION_MODES` above 1. |
| [KildClient][21] | 2.11.1 | No known issues. |
+----------------------------+-----------+----------------------------------------------------------------+
| Name | Version | Comments |
+============================+===========+================================================================+
| `Evennia Webclient`_ | 0.9 | Evennia-specific |
+----------------------------+-----------+----------------------------------------------------------------+
| `tintin++`_ | 2.0+ | No MXP support |
+----------------------------+-----------+----------------------------------------------------------------+
| tinyfugue_ | 5.0+ | No UTF-8 support |
+----------------------------+-----------+----------------------------------------------------------------+
| MUSHclient_ (Win) | 4.94 | NAWS reports full text area |
+----------------------------+-----------+----------------------------------------------------------------+
| Zmud_ (Win) | 7.21 | *UNTESTED* |
+----------------------------+-----------+----------------------------------------------------------------+
| Cmud_ (Win) | v3 | *UNTESTED* |
+----------------------------+-----------+----------------------------------------------------------------+
| Potato_ | 2.0.0b16 | No MXP, MCCP support. Win 32bit does not understand |
| | | "localhost", must use `127.0.0.1`. |
+----------------------------+-----------+----------------------------------------------------------------+
| Mudlet_ | 3.4+ | No known issues. Some older versions showed <> as html |
| | | under MXP. |
+----------------------------+-----------+----------------------------------------------------------------+
| SimpleMU_ (Win) | full | Discontinued. NAWS reports pixel size. |
+----------------------------+-----------+----------------------------------------------------------------+
| Atlantis_ (Mac) | 0.9.9.4 | No known issues. |
+----------------------------+-----------+----------------------------------------------------------------+
| GMUD_ | 0.0.1 | Can't handle any telnet handshakes. Not recommended. |
+----------------------------+-----------+----------------------------------------------------------------+
| BeipMU_ (Win) | 3.0.255 | No MXP support. Best to enable "MUD prompt handling", disable |
| | | "Handle HTML tags". |
+----------------------------+-----------+----------------------------------------------------------------+
| MudRammer_ (IOS) | 1.8.7 | Bad Telnet Protocol compliance: displays spurious characters. |
+----------------------------+-----------+----------------------------------------------------------------+
| MUDMaster_ | 1.3.1 | *UNTESTED* |
+----------------------------+-----------+----------------------------------------------------------------+
| BlowTorch_ (Andr) | 1.1.3 | Telnet NOP displays as spurious character. |
+----------------------------+-----------+----------------------------------------------------------------+
| Mukluk_ (Andr) | 2015.11.20| Telnet NOP displays as spurious character. Has UTF-8/Emoji |
| | | support. |
+----------------------------+-----------+----------------------------------------------------------------+
| Gnome-MUD_ (Unix) | 0.11.2 | Telnet handshake errors. First (only) attempt at logging in |
| | | fails. |
+----------------------------+-----------+----------------------------------------------------------------+
| Spyrit_ | 0.4 | No MXP, OOB support. |
+----------------------------+-----------+----------------------------------------------------------------+
| JamochaMUD_ | 5.2 | Does not support ANSI within MXP text. |
+----------------------------+-----------+----------------------------------------------------------------+
| DuckClient_ (Chrome) | 4.2 | No MXP support. Displays Telnet Go-Ahead and |
| | | WILL SUPPRESS-GO-AHEAD as ù character. Also seems to run |
| | | the `version` command on connection, which will not work in |
| | | `MULTISESSION_MODES` above 1. |
+----------------------------+-----------+----------------------------------------------------------------+
| KildClient_ | 2.11.1 | No known issues. |
+----------------------------+-----------+----------------------------------------------------------------+
.. _Evennia Webclient: ../Components/Webclient.html
.. _tintin++: http://tintin.sourceforge.net/
.. _tinyfugue: http://tinyfugue.sourceforge.net/
.. _MUSHclient: http://mushclient.com/
.. _Zmud: http://forums.zuggsoft.com/index.php?page=4&action=file&file_id=65
.. _Cmud: http://forums.zuggsoft.com/index.php?page=4&action=category&cat_id=11
.. _Potato: http://www.potatomushclient.com/
.. _Mudlet: http://www.mudlet.org/
.. _SimpleMU: https://archive.org/details/tucows_196173_SimpleMU_MU_Client
.. _Atlantis: http://www.riverdark.net/atlantis/
.. _GMUD: https://sourceforge.net/projects/g-mud/
.. _BeipMU: http://www.beipmu.com/
.. _MudRammer: https://itunes.apple.com/us/app/mudrammer-a-modern-mud-client/id597157072
.. _MUDMaster: https://itunes.apple.com/us/app/mudmaster/id341160033
.. _BlowTorch: http://bt.happygoatstudios.com/
.. _Mukluk: https://play.google.com/store/apps/details?id=com.crap.mukluk
.. _Gnome-MUD: https://github.com/GNOME/gnome-mud
.. _Spyrit: https://spyrit.ierne.eu.org/
.. _JamochaMUD: http://jamochamud.org/
.. _DuckClient: http://duckclient.com/
.. _KildClient: https://www.kildclient.org/
[1]: ./Webclient
[2]: http://tintin.sourceforge.net/
[3]: http://tinyfugue.sourceforge.net/
[4]: https://mushclient.com/
[5]: http://forums.zuggsoft.com/index.php?page=4&action=file&file_id=65
[6]: http://forums.zuggsoft.com/index.php?page=4&action=category&cat_id=11
[7]: https://www.potatomushclient.com/
[8]: https://www.mudlet.org/
[9]: https://archive.org/details/tucows_196173_SimpleMU_MU_Client
[10]: https://www.riverdark.net/atlantis/
[11]: https://sourceforge.net/projects/g-mud/
[12]: http://www.beipmu.com/
[13]: https://itunes.apple.com/us/app/mudrammer-a-modern-mud-client/id597157072
[14]: https://itunes.apple.com/us/app/mudmaster/id341160033
[15]: https://bt.happygoatstudios.com/
[16]: https://play.google.com/store/apps/details?id=com.crap.mukluk
[17]: https://github.com/GNOME/gnome-mud
[18]: https://spyrit.ierne.eu.org/
[19]: https://jamochamud.org/
[20]: http://duckclient.com/
[21]: https://www.kildclient.org/
```
## Workarounds for client issues:
### Issue: Telnet NOP displays as spurious character.
@ -105,5 +82,3 @@ Workaround:
* In-game: Use `@option NOPKEEPALIVE=off` for the session, or use the `/save`
parameter to disable it for that Evennia account permanently.
* Client-side: Set a gag-type trigger on the NOP character to make it invisible to the client.

View file

@ -7,21 +7,21 @@ exists before answering - maybe you can clarify that answer rather than to make
## Table of Contents
- [Will I run out of dbrefs?](./Coding-FAQ#will-i-run-out-of-dbrefs)
- [Removing default commands](./Coding-FAQ#removing-default-commands)
- [Preventing character from moving based on a condition](./Coding-FAQ#preventing-character-from-
- [Will I run out of dbrefs?](./Coding-FAQ.md#will-i-run-out-of-dbrefs)
- [Removing default commands](./Coding-FAQ.md#removing-default-commands)
- [Preventing character from moving based on a condition](./Coding-FAQ.md#preventing-character-from-
moving-based-on-a-condition)
- [Reference initiating object in an EvMenu command](./Coding-FAQ#reference-initiating-object-in-an-
- [Reference initiating object in an EvMenu command](./Coding-FAQ.md#reference-initiating-object-in-an-
evmenu-command)
- [Adding color to default Evennia Channels](./Coding-FAQ#adding-color-to-default-evennia-channels)
- [Selectively turn off commands in a room](./Coding-FAQ#selectively-turn-off-commands-in-a-room)
- [Select Command based on a condition](./Coding-FAQ#select-command-based-on-a-condition)
- [Automatically updating code when reloading](./Coding-FAQ#automatically-updating-code-when-
- [Adding color to default Evennia Channels](./Coding-FAQ.md#adding-color-to-default-evennia-channels)
- [Selectively turn off commands in a room](./Coding-FAQ.md#selectively-turn-off-commands-in-a-room)
- [Select Command based on a condition](./Coding-FAQ.md#select-command-based-on-a-condition)
- [Automatically updating code when reloading](./Coding-FAQ.md#automatically-updating-code-when-
reloading)
- [Changing all exit messages](./Coding-FAQ#changing-all-exit-messages)
- [Add parsing with the "to" delimiter](./Coding-FAQ#add-parsing-with-the-to-delimiter)
- [Store last used session IP address](./Coding-FAQ#store-last-used-session-ip-address)
- [Use wide characters with EvTable](./Coding-FAQ#non-latin-characters-in-evtable)
- [Changing all exit messages](./Coding-FAQ.md#changing-all-exit-messages)
- [Add parsing with the "to" delimiter](./Coding-FAQ.md#add-parsing-with-the-to-delimiter)
- [Store last used session IP address](./Coding-FAQ.md#store-last-used-session-ip-address)
- [Use wide characters with EvTable](./Coding-FAQ.md#non-latin-characters-in-evtable)
## Will I run out of dbrefs?
**Q:** The `#dbref` of a database object is ever-increasing. Evennia doesn't allow you to change or
@ -34,12 +34,12 @@ still using Evennia at that point and has this concern, get back to us and we ca
dbref reuse then.
## Removing default commands
**Q:** How does one *remove* (not replace) e.g. the default `get` [Command](./Commands) from the
Character [Command Set](./Command-Sets)?
**Q:** How does one *remove* (not replace) e.g. the default `get` [Command](./Commands.md) from the
Character [Command Set](./Command-Sets.md)?
**A:** Go to `mygame/commands/default_cmdsets.py`. Find the `CharacterCmdSet` class. It has one
method named `at_cmdset_creation`. At the end of that method, add the following line:
`self.remove(default_cmds.CmdGet())`. See the [Adding Commands Tutorial](./Adding-Command-Tutorial)
`self.remove(default_cmds.CmdGet())`. See the [Adding Commands Tutorial](./Adding-Command-Tutorial.md)
for more info.
## Preventing character from moving based on a condition
@ -47,7 +47,7 @@ for more info.
combat, immobilized, etc.)
**A:** The `at_before_move` hook is called by Evennia just before performing any move. If it returns
`False`, the move is aborted. Let's say we want to check for an [Attribute](./Attributes) `cantmove`.
`False`, the move is aborted. Let's say we want to check for an [Attribute](./Attributes.md) `cantmove`.
Add the following code to the `Character` class:
```python
@ -63,7 +63,7 @@ def at_before_move(self, destination):
**Q:** An object has a Command on it starts up an EvMenu instance. How do I capture a reference to
that object for use in the menu?
**A:** When an [EvMenu](./EvMenu) is started, the menu object is stored as `caller.ndb._menutree`.
**A:** When an [EvMenu](./EvMenu.md) is started, the menu object is stored as `caller.ndb._menutree`.
This is a good place to store menu-specific things since it will clean itself up when the menu
closes. When initiating the menu, any additional keywords you give will be available for you as
properties on this menu object:
@ -112,7 +112,7 @@ CHANNEL_COLORS`.
**Q:** I want certain commands to turn off in a given room. They should still work normally for
staff.
**A:** This is done using a custom cmdset on a room [locked with the 'call' lock type](./Locks). Only
**A:** This is done using a custom cmdset on a room [locked with the 'call' lock type](./Locks.md). Only
if this lock is passed will the commands on the room be made available to an object inside it. Here
is an example of a room where certain commands are disabled for non-staff:
@ -153,7 +153,7 @@ superusers).
command to only be available on a full moon, from midnight to three in-game time.
**A:** This is easiest accomplished by putting the "werewolf" command on the Character as normal,
but to [lock](./Locks) it with the "cmd" type lock. Only if the "cmd" lock type is passed will the
but to [lock](./Locks.md) it with the "cmd" type lock. Only if the "cmd" lock type is passed will the
command be available.
```python
@ -168,8 +168,8 @@ class CmdWerewolf(Command):
def func(self):
# ...
```
Add this to the [default cmdset as usual](./Adding-Command-Tutorial). The `is_full_moon` [lock
function](Locks#lock-functions) does not yet exist. We must create that:
Add this to the [default cmdset as usual](./Adding-Command-Tutorial.md). The `is_full_moon` [lock
function](./Locks.md#lock-functions) does not yet exist. We must create that:
```python
# in mygame/server/conf/lockfuncs.py

View file

@ -10,7 +10,7 @@ Here are some pointers to get you going.
Evennia is developed using Python. Even if you are more of a designer than a coder, it is wise to
learn how to read and understand basic Python code. If you are new to Python, or need a refresher,
take a look at our two-part [Python introduction](./Python-basic-introduction).
take a look at our two-part [Python introduction](./Python-basic-introduction.md).
### Explore Evennia interactively
@ -31,11 +31,11 @@ This will open an Evennia-aware python shell (using ipython). From within this s
evennia.<TAB>
That is, enter `evennia.` and press the `<TAB>` key. This will show you all the resources made
available at the top level of Evennia's "flat API". See the [flat API](./Evennia-API) page for more
available at the top level of Evennia's "flat API". See the [flat API](./Evennia-API.md) page for more
info on how to explore it efficiently.
You can complement your exploration by peeking at the sections of the much more detailed
[Developer Central](./Developer-Central). The [Tutorials](./Tutorials) section also contains a growing collection
[Developer Central](./Developer-Central.md). The [Tutorials](./Tutorials.md) section also contains a growing collection
of system- or implementation-specific help.
### Use a python syntax checker
@ -52,7 +52,7 @@ using such a checker can be a good start to weed out the simple problems.
### Plan before you code
Before you start coding away at your dream game, take a look at our [Game Planning](./Game-Planning)
Before you start coding away at your dream game, take a look at our [Game Planning](./Game-Planning.md)
page. It might hopefully help you avoid some common pitfalls and time sinks.
### Code in your game folder, not in the evennia/ repository
@ -64,7 +64,7 @@ it out into your game folder and edit it there.
If you find that Evennia doesn't support some functionality you need, make a
[Feature Request](github:issue) about it. Same goes for [bugs](github:issue). If you add features or fix bugs
yourself, please consider [Contributing](./Contributing) your changes upstream!
yourself, please consider [Contributing](./Contributing.md) your changes upstream!
### Learn to read tracebacks

View file

@ -29,13 +29,13 @@ If you need to search for objects in a code module you can use the functions in
obj = search_object(objname)
```
- [evennia.search_account](../wiki/evennia.accounts.manager#accountdbmanagersearch_account)
- [evennia.search_object](../wiki/evennia.objects.manager#objectdbmanagersearch_object)
- [evennia.search_object_by_tag](../wiki/evennia.utils.search#search_object_by_tag)
- [evennia.search_script](../wiki/evennia.scripts.manager#scriptdbmanagersearch_script)
- [evennia.search_channel](../wiki/evennia.comms.managers#channeldbmanagersearch_channel)
- [evennia.search_message](../wiki/evennia.comms.managers#msgmanagersearch_message)
- [evennia.search_help](../wiki/evennia.help.manager#helpentrymanagersearch_help)
- [evennia.search_account](evennia.accounts.manager.AccountDBManager.search_account)
- [evennia.search_object](evennia.objects.manager.ObjectDBManager.search_object)
- [evennia.search_tag](evennia.utils.search.search_tag)
- [evennia.search_script](evennia.scripts.manager.ScriptDBManager.search_script)
- [evennia.search_channel](evennia.comms.managers.ChannelDBManager.search_channel)
- [evennia.search_message](evennia.comms.managers.MsgManager.search_message)
- [evennia.search_help](evennia.utils.search.search_help_entry)
Note that these latter methods will always return a `list` of results, even if the list has one or
zero entries.
@ -50,12 +50,12 @@ entities directly in code (for example when defining new create commands).
myobj = evennia.create_objects("game.gamesrc.objects.myobj.MyObj", key="MyObj")
```
- [evennia.create_account](../wiki/evennia.utils.create#create_account)
- [evennia.create_object](../wiki/evennia.utils.create#create_object)
- [evennia.create_script](../wiki/evennia.utils.create#create_script)
- [evennia.create_channel](../wiki/evennia.utils.create#create_channel)
- [evennia.create_help_entry](../wiki/evennia.utils.create#create_help_entry)
- [evennia.create_message](../wiki/evennia.utils.create#create_message)
- [evennia.create_account](create_account)
- [evennia.create_object](create_object)
- [evennia.create_script](create_script)
- [evennia.create_channel](create_channel)
- [evennia.create_help_entry](create_help_entry)
- [evennia.create_message](create_message)
Each of these create-functions have a host of arguments to further customize the created entity. See
`evennia/utils/create.py` for more information.
@ -181,13 +181,13 @@ number of seconds. This is a very light wrapper over a Twisted
non-persistently, which means that if the server is `@reload`ed before the delay is over, the
callback will never run (the server forgets it). If setting `persistent` to True, the delay will be
stored in the database and survive a `@reload` - but for this to work it is susceptible to the same
limitations incurred when saving to an [Attribute](./Attributes).
limitations incurred when saving to an [Attribute](./Attributes.md).
The `deferred` return object can usually be ignored, but calling its `.cancel()` method will abort
the delay prematurely.
`utils.delay` is the lightest form of delayed call in Evennia. For other way to create time-bound
tasks, see the [TickerHandler](./TickerHandler) and [Scripts](./Scripts).
tasks, see the [TickerHandler](./TickerHandler.md) and [Scripts](./Scripts.md).
> Note that many delayed effects can be achieved without any need for an active timer. For example
if you have a trait that should recover a point every 5 seconds you might just need its value when
@ -203,7 +203,7 @@ classes, instances or python-paths-to-classes.
Note that Python code should usually work with [duck
typing](http://en.wikipedia.org/wiki/Duck_typing). But in Evennia's case it can sometimes be useful
to check if an object inherits from a given [Typeclass](./Typeclasses) as a way of identification. Say
to check if an object inherits from a given [Typeclass](./Typeclasses.md) as a way of identification. Say
for example that we have a typeclass *Animal*. This has a subclass *Felines* which in turn has a
subclass *HouseCat*. Maybe there are a bunch of other animal types too, like horses and dogs. Using
`inherits_from` will allow you to check for all animals in one go:
@ -274,10 +274,10 @@ need to send byte-data over the wire, `to_str` is the only one you'll need.
The difference from Python's in-built `str()` and `bytes()` operators are that
the Evennia ones makes use of the `ENCODINGS` setting and will try very hard to
never raise a traceback but instead echo errors through logging. See
[here](./Text-Encodings) for more info.
[here](./Text-Encodings.md) for more info.
### Ansi Coloring Tools
- [evennia.ansi](api:evennia.utils.ansi)
- [evennia.ansi](evennia.utils.ansi)
## Display utilities
### Making ascii tables

View file

@ -9,7 +9,7 @@ a while. Such effects are called *cooldowns*.
This page exemplifies a very resource-efficient way to do cooldowns. A more
'active' way is to use asynchronous delays as in the [command duration
tutorial](Command-Duration#Blocking-Commands), the two might be useful to
tutorial](./Command-Duration.md#blocking-commands), the two might be useful to
combine if you want to echo some message to the user after the cooldown ends.
## Non-persistent cooldown
@ -88,7 +88,7 @@ database, you need to use the caster for the storage.
self.caller.db.firestorm_lastcast = now
```
Since we are storing as an [Attribute](./Attributes), we need to identify the
Since we are storing as an [Attribute](./Attributes.md), we need to identify the
variable as `firestorm_lastcast` so we are sure we get the right one (we'll
likely have other skills with cooldowns after all). But this method of
using cooldowns also has the advantage of working *between* commands - you can

View file

@ -2,7 +2,7 @@
Before reading this tutorial, if you haven't done so already, you might want to
read [the documentation on commands](./Commands) to get a basic understanding of
read [the documentation on commands](./Commands.md) to get a basic understanding of
how commands work in Evennia.
In some types of games a command should not start and finish immediately.
@ -40,7 +40,7 @@ class CmdTest(Command):
> Important: The `yield` functionality will *only* work in the `func` method of
> Commands. It only works because Evennia has especially
> catered for it in Commands. If you want the same functionality elsewhere you
> must use the [interactive decorator](./Async-Process#The-@interactive-decorator).
> must use the [interactive decorator](./Async-Process.md#the-interactive-decorator).
The important line is the `yield 10`. It tells Evennia to "pause" the command
and to wait for 10 seconds to execute the rest. If you add this command and
@ -187,7 +187,7 @@ start crafting a shield at the same time, or if you just did a huge power-swing
should not be able to do it again immediately.
The simplest way of implementing blocking is to use the technique covered in the [Command
Cooldown](Command-Cooldown) tutorial. In that tutorial we implemented cooldowns by having the
Cooldown](./Command-Cooldown.md) tutorial. In that tutorial we implemented cooldowns by having the
Command store the current time. Next time the Command was called, we compared the current time to
the stored time to determine if enough time had passed for a renewed use. This is a *very*
efficient, reliable and passive solution. The drawback is that there is nothing to tell the Player

View file

@ -21,7 +21,7 @@ You can combine the sending of normal text with the sending (updating of the pro
self.msg("This is a text", prompt="This is a prompt")
```
You can update the prompt on demand, this is normally done using [OOB](./OOB)-tracking of the relevant
You can update the prompt on demand, this is normally done using [OOB](./OOB.md)-tracking of the relevant
Attributes (like the character's health). You could also make sure that attacking commands update
the prompt when they cause a change in health, for example.

View file

@ -1,7 +1,7 @@
# Command Sets
Command Sets are intimately linked with [Commands](./Commands) and you should be familiar with
Command Sets are intimately linked with [Commands](./Commands.md) and you should be familiar with
Commands before reading this page. The two pages were split for ease of reading.
A *Command Set* (often referred to as a CmdSet or cmdset) is the basic unit for storing one or more
@ -11,7 +11,7 @@ classes in a command set is the way to make commands available to use in your ga
When storing a CmdSet on an object, you will make the commands in that command set available to the
object. An example is the default command set stored on new Characters. This command set contains
all the useful commands, from `look` and `inventory` to `@dig` and `@reload`
([permissions](./Locks#Permissions) then limit which players may use them, but that's a separate
([permissions](./Locks.md#permissions) then limit which players may use them, but that's a separate
topic).
When an account enters a command, cmdsets from the Account, Character, its location, and elsewhere
@ -26,7 +26,7 @@ on. The tutorial world included with Evennia showcases a dark room that replaces
commands with its own versions because the Character cannot see.
If you want a quick start into defining your first commands and using them with command sets, you
can head over to the [Adding Command Tutorial](./Adding-Command-Tutorial) which steps through things
can head over to the [Adding Command Tutorial](./Adding-Command-Tutorial.md) which steps through things
without the explanations.
## Defining Command Sets
@ -112,11 +112,11 @@ back even if all other cmdsets fail or are removed. It is always persistent and
by `cmdset.delete()`. To remove a default cmdset you must explicitly call `cmdset.remove_default()`.
Command sets are often added to an object in its `at_object_creation` method. For more examples of
adding commands, read the [Step by step tutorial](./Adding-Command-Tutorial). Generally you can
adding commands, read the [Step by step tutorial](./Adding-Command-Tutorial.md). Generally you can
customize which command sets are added to your objects by using `self.cmdset.add()` or
`self.cmdset.add_default()`.
> Important: Commands are identified uniquely by key *or* alias (see [Commands](./Commands)). If any
> Important: Commands are identified uniquely by key *or* alias (see [Commands](./Commands.md)). If any
overlap exists, two commands are considered identical. Adding a Command to a command set that
already has an identical command will *replace* the previous command. This is very important. You
must take this behavior into account when attempting to overload any default Evennia commands with
@ -127,7 +127,7 @@ new one that has a matching alias.
There are several extra flags that you can set on CmdSets in order to modify how they work. All are
optional and will be set to defaults otherwise. Since many of these relate to *merging* cmdsets,
you might want to read the [Adding and Merging Command Sets](./Command-Sets#adding-and-merging-
you might want to read the [Adding and Merging Command Sets](./Command-Sets.md#adding-and-merging-
command-sets) section for some of these to make sense.
- `key` (string) - an identifier for the cmdset. This is optional, but should be unique. It is used
@ -138,7 +138,7 @@ dictionary below.
- `priority` (int) - This defines the merge order of the merge stack - cmdsets will merge in rising
order of priority with the highest priority set merging last. During a merger, the commands from the
set with the higher priority will have precedence (just what happens depends on the [merge
type](Command-Sets#adding-and-merging-command-sets)). If priority is identical, the order in the
type](./Command-Sets.md#adding-and-merging-command-sets)). If priority is identical, the order in the
merge stack determines preference. The priority value must be greater or equal to `-100`. Most in-
game sets should usually have priorities between `0` and `100`. Evennia default sets have priorities
as follows (these can be changed if you want a different distribution):
@ -154,7 +154,7 @@ arguments, there is no collision between exits named the same as a channel even
differently with certain named cmdsets. If the cmdset to merge with has a `key` matching an entry in
`key_mergetype`, it will not be merged according to the setting in `mergetype` but according to the
mode in this dict. Please note that this is more complex than it may seem due to the [merge
order](Command-Sets#adding-and-merging-command-sets) of command sets. Please review that section
order](./Command-Sets.md#adding-and-merging-command-sets) of command sets. Please review that section
before using `key_mergetype`.
- `duplicates` (bool/None default `None`) - this determines what happens when merging same-priority
cmdsets containing same-key commands together. The`dupicate` option will *only* apply when merging
@ -195,15 +195,15 @@ priority determines what is used.
## Command Sets Searched
When a user issues a command, it is matched against the [merged](./Command-Sets#adding-and-merging-
When a user issues a command, it is matched against the [merged](./Command-Sets.md#adding-and-merging-
command-sets) command sets available to the player at the moment. Which those are may change at any
time (such as when the player walks into the room with the `Window` object described earlier).
The currently valid command sets are collected from the following sources:
- The cmdsets stored on the currently active [Session](./Sessions). Default is the empty
- The cmdsets stored on the currently active [Session](./Sessions.md). Default is the empty
`SessionCmdSet` with merge priority `-20`.
- The cmdsets defined on the [Account](./Accounts). Default is the AccountCmdSet with merge priority
- The cmdsets defined on the [Account](./Accounts.md). Default is the AccountCmdSet with merge priority
`-10`.
- All cmdsets on the Character/Object (assuming the Account is currently puppeting such a
Character/Object). Merge priority `0`.
@ -215,14 +215,14 @@ included if `no_objs` option is active in the merge stack.
`no_objs` option is active in the merge stack.
- The cmdsets of Exits in the location. Merge priority `+101`. Will not be included if `no_exits`
*or* `no_objs` option is active in the merge stack.
- The [channel](./Communications) cmdset containing commands for posting to all channels the account
- The [channel](./Communications.md) cmdset containing commands for posting to all channels the account
or character is currently connected to. Merge priority `+101`. Will not be included if `no_channels`
option is active in the merge stack.
Note that an object does not *have* to share its commands with its surroundings. A Character's
cmdsets should not be shared for example, or all other Characters would get multi-match errors just
by being in the same room. The ability of an object to share its cmdsets is managed by its `call`
[lock](./Locks). For example, [Character objects](./Objects) defaults to `call:false()` so that any
[lock](./Locks.md). For example, [Character objects](./Objects.md) defaults to `call:false()` so that any
cmdsets on them can only be accessed by themselves, not by other objects around them. Another
example might be to lock an object with `call:inside()` to only make their commands available to
objects inside them, or `cmd:holds()` to make their commands available only if they are held.

View file

@ -1,9 +1,9 @@
# Command System
- [Commands](./Commands)
- [Command Sets](./Command-Sets)
- [Command Auto-help](./Help-System#command-auto-help-system)
- [Commands](./Commands.md)
- [Command Sets](./Command-Sets.md)
- [Command Auto-help](./Help-System.md#command-auto-help-system)
See also:
- [Default Command Help](./Default-Command-Help)
- [Adding Command Tutorial](./Adding-Command-Tutorial)
- [Default Command Help](./Default-Commands.md)
- [Adding Command Tutorial](./Adding-Command-Tutorial.md)

View file

@ -1,14 +1,14 @@
# Commands
Commands are intimately linked to [Command Sets](./Command-Sets) and you need to read that page too to
Commands are intimately linked to [Command Sets](./Command-Sets.md) and you need to read that page too to
be familiar with how the command system works. The two pages were split for easy reading.
The basic way for users to communicate with the game is through *Commands*. These can be commands
directly related to the game world such as *look*, *get*, *drop* and so on, or administrative
commands such as *examine* or *@dig*.
The [default commands](./Default-Command-Help) coming with Evennia are 'MUX-like' in that they use @
The [default commands](./Default-Commands.md) coming with Evennia are 'MUX-like' in that they use @
for admin commands, support things like switches, syntax with the '=' symbol etc, but there is
nothing that prevents you from implementing a completely different command scheme for your game. You
can find the default commands in `evennia/commands/default`. You should not edit these directly -
@ -16,7 +16,7 @@ they will be updated by the Evennia team as new features are added. Rather you s
for inspiration and inherit your own designs from them.
There are two components to having a command running - the *Command* class and the [Command
Set](Command-Sets) (command sets were split into a separate wiki page for ease of reading).
Set](./Command-Sets.md) (command sets were split into a separate wiki page for ease of reading).
1. A *Command* is a python class containing all the functioning code for what a command does - for
example, a *get* command would contain code for picking up objects.
@ -28,8 +28,8 @@ object in various ways. Consider a "Tree" object with a cmdset defining the comm
*chop down*. Or a "Clock" with a cmdset containing the single command *check time*.
This page goes into full detail about how to use Commands. To fully use them you must also read the
page detailing [Command Sets](./Command-Sets). There is also a step-by-step [Adding Command
Tutorial](Adding-Command-Tutorial) that will get you started quickly without the extra explanations.
page detailing [Command Sets](./Command-Sets.md). There is also a step-by-step [Adding Command
Tutorial](./Adding-Command-Tutorial.md) that will get you started quickly without the extra explanations.
## Defining Commands
@ -80,15 +80,15 @@ In Evennia there are three types of objects that may call the command. It is im
of this since this will also assign appropriate `caller`, `session`, `sessid` and `account`
properties on the command body at runtime. Most often the calling type is `Session`.
* A [Session](./Sessions). This is by far the most common case when a user is entering a command in
* A [Session](./Sessions.md). This is by far the most common case when a user is entering a command in
their client.
* `caller` - this is set to the puppeted [Object](./Objects) if such an object exists. If no
* `caller` - this is set to the puppeted [Object](./Objects.md) if such an object exists. If no
puppet is found, `caller` is set equal to `account`. Only if an Account is not found either (such as
before being logged in) will this be set to the Session object itself.
* `session` - a reference to the [Session](./Sessions) object itself.
* `session` - a reference to the [Session](./Sessions.md) object itself.
* `sessid` - `sessid.id`, a unique integer identifier of the session.
* `account` - the [Account](./Accounts) object connected to this Session. None if not logged in.
* An [Account](./Accounts). This only happens if `account.execute_cmd()` was used. No Session
* `account` - the [Account](./Accounts.md) object connected to this Session. None if not logged in.
* An [Account](./Accounts.md). This only happens if `account.execute_cmd()` was used. No Session
information can be obtained in this case.
* `caller` - this is set to the puppeted Object if such an object can be determined (without
Session info this can only be determined in `MULTISESSION_MODE=0` or `1`). If no puppet is found,
@ -96,7 +96,7 @@ this is equal to `account`.
* `session` - `None*`
* `sessid` - `None*`
* `account` - Set to the Account object.
* An [Object](./Objects). This only happens if `object.execute_cmd()` was used (for example by an
* An [Object](./Objects.md). This only happens if `object.execute_cmd()` was used (for example by an
NPC).
* `caller` - This is set to the calling Object in question.
* `session` - `None*`
@ -119,10 +119,10 @@ it the following properties:
- `caller` - The character BigGuy, in this example. This is a reference to the object executing the
command. The value of this depends on what type of object is calling the command; see the previous
section.
- `session` - the [Session](./Sessions) Bob uses to connect to the game and control BigGuy (see also
- `session` - the [Session](./Sessions.md) Bob uses to connect to the game and control BigGuy (see also
previous section).
- `sessid` - the unique id of `self.session`, for quick lookup.
- `account` - the [Account](./Accounts) Bob (see previous section).
- `account` - the [Account](./Accounts.md) Bob (see previous section).
- `cmdstring` - the matched key for the command. This would be *look* in our example.
- `args` - this is the rest of the string, except the command name. So if the string entered was
*look at sword*, `args` would be " *at sword*". Note the space kept - Evennia would correctly
@ -130,7 +130,7 @@ interpret `lookat sword` too. This is useful for things like `/switches` that sh
In the `MuxCommand` class used for default commands, this space is stripped. Also see the
`arg_regex` property if you want to enforce a space to make `lookat sword` give a command-not-found
error.
- `obj` - the game [Object](./Objects) on which this command is defined. This need not be the caller,
- `obj` - the game [Object](./Objects.md) on which this command is defined. This need not be the caller,
but since `look` is a common (default) command, this is probably defined directly on *BigGuy* - so
`obj` will point to BigGuy. Otherwise `obj` could be an Account or any interactive object with
commands defined on it, like in the example of the "check time" command defined on a "Clock" object.
@ -149,7 +149,7 @@ not
used, but they could be used to implement alternate help-display systems.
- `.client_width()` - Shortcut for getting the client's screen-width. Note that not all clients will
truthfully report this value - that case the `settings.DEFAULT_SCREEN_WIDTH` will be returned.
- `.styled_table(*args, **kwargs)` - This returns an [EvTable](api:evennia.utils#module-
- `.styled_table(*args, **kwargs)` - This returns an [EvTable](module-
evennia.utils.evtable) styled based on the
session calling this command. The args/kwargs are the same as for EvTable, except styling defaults
are set.
@ -168,7 +168,7 @@ key can consist of more than one word, like "press button" or "pull left lever".
either matches. This is important for merging cmdsets described below.
- `aliases` (optional list) - a list of alternate names for the command (`["glance", "see", "l"]`).
Same name rules as for `key` applies.
- `locks` (string) - a [lock definition](./Locks), usually on the form `cmd:<lockfuncs>`. Locks is a
- `locks` (string) - a [lock definition](./Locks.md), usually on the form `cmd:<lockfuncs>`. Locks is a
rather big topic, so until you learn more about locks, stick to giving the lockstring `"cmd:all()"`
to make the command available to everyone (if you don't provide a lock string, this will be assigned
for you).
@ -180,9 +180,9 @@ by the next command by retrieving `self.caller.ndb.last_cmd`. The next run comma
or replace the storage.
- `arg_regex` (optional raw string): Used to force the parser to limit itself and tell it when the
command-name ends and arguments begin (such as requiring this to be a space or a /switch). This is
done with a regular expression. [See the arg_regex section](./Commands#on-arg_regex) for the details.
done with a regular expression. [See the arg_regex section](./Commands.md#on-arg_regex) for the details.
- `auto_help` (optional boolean). Defaults to `True`. This allows for turning off the [auto-help
system](Help-System#command-auto-help-system) on a per-command basis. This could be useful if you
system](./Help-System.md#command-auto-help-system) on a per-command basis. This could be useful if you
either want to write your help entries manually or hide the existence of a command from `help`'s
generated list.
- `is_exit` (bool) - this marks the command as being used for an in-game exit. This is, by default,
@ -218,7 +218,7 @@ from this method will be returned from the execution as a Twisted Deferred.
Finally, you should always make an informative [doc
string](http://www.python.org/dev/peps/pep-0257/#what-is-a-docstring) (`__doc__`) at the top of your
class. This string is dynamically read by the [Help System](./Help-System) to create the help entry
class. This string is dynamically read by the [Help System](./Help-System.md) to create the help entry
for this command. You should decide on a way to format your help and stick to that.
Below is how you define a simple alternative "`smile`" command:
@ -276,7 +276,7 @@ default commands thus need to implement `parse()` at all, but can assume the
incoming string is already split up and parsed in suitable ways by its parent.
Before you can actually use the command in your game, you must now store it
within a *command set*. See the [Command Sets](./Command-Sets) page.
within a *command set*. See the [Command Sets](./Command-Sets.md) page.
### On arg_regex
@ -427,7 +427,7 @@ will show.
> Note again that the `yield` keyword does not store state. If the game reloads while waiting for
the user to answer, the user will have to start over. It is not a good idea to use `yield` for
important or complex choices, a persistent [EvMenu](./EvMenu) might be more appropriate in this case.
important or complex choices, a persistent [EvMenu](./EvMenu.md) might be more appropriate in this case.
## System commands
@ -457,7 +457,7 @@ display the "Huh?" error message.
matches.
- User is not allowed to execute the command (`syscmdkeys.CMD_NOPERM`) - Default is to display the
"Huh?" error message.
- Channel (`syscmdkeys.CMD_CHANNEL`) - This is a [Channel](./Communications) name of a channel you are
- Channel (`syscmdkeys.CMD_CHANNEL`) - This is a [Channel](./Communications.md) name of a channel you are
subscribing to - Default is to relay the command's argument to that channel. Such commands are
created by the Comm system on the fly depending on your subscriptions.
- New session connection (`syscmdkeys.CMD_LOGINSTART`). This command name should be put in the
@ -484,7 +484,7 @@ work.
Normally Commands are created as fixed classes and used without modification. There are however
situations when the exact key, alias or other properties is not possible (or impractical) to pre-
code ([Exits](./Commands#Exits) is an example of this).
code ([Exits](./Commands.md#exits) is an example of this).
To create a command with a dynamic call signature, first define the command body normally in a class
(set your `key`, `aliases` to default values), then use the following call (assuming the command
@ -508,10 +508,10 @@ make your command completely customized at run-time.
*Note: This is an advanced topic.*
Exits are examples of the use of a [Dynamic Command](./Commands#Dynamic_Commands).
Exits are examples of the use of a [Dynamic Command](./Commands.md#dynamic-commands).
The functionality of [Exit](./Objects) objects in Evennia is not hard-coded in the engine. Instead
Exits are normal [typeclassed](./Typeclasses) objects that auto-create a [CmdSet](./Commands#CmdSets) on
The functionality of [Exit](./Objects.md) objects in Evennia is not hard-coded in the engine. Instead
Exits are normal [typeclassed](./Typeclasses.md) objects that auto-create a [CmdSet](./Command-Sets.md) on
themselves when they load. This cmdset has a single dynamically created Command with the same
properties (key, aliases and locks) as the Exit object itself. When entering the name of the exit,
this dynamic exit-command is triggered and (after access checks) moves the Character to the exit's
@ -609,9 +609,9 @@ cmdset, ignore.
- CmdSets defined on the current account, if caller is a puppeted object.
- CmdSets defined on the Session itself.
- The active CmdSets of eventual objects in the same location (if any). This includes commands
on [Exits](./Objects#Exits).
on [Exits](./Objects.md#exits).
- Sets of dynamically created *System commands* representing available
[Communications](./Communications#Channels).
[Communications](./Communications.md#channels).
7. All CmdSets *of the same priority* are merged together in groups. Grouping avoids order-
dependent issues of merging multiple same-prio sets onto lower ones.
8. All the grouped CmdSets are *merged* in reverse priority into one combined CmdSet according to

View file

@ -12,7 +12,7 @@ mimics the API of a `Msg` but has no connection to the database.
## Msg
The `Msg` object is the basic unit of communication in Evennia. A message works a little like an
e-mail; it always has a sender (a [Account](./Accounts)) and one or more recipients. The recipients
e-mail; it always has a sender (a [Account](./Accounts.md)) and one or more recipients. The recipients
may be either other Accounts, or a *Channel* (see below). You can mix recipients to send the message
to both Channels and Accounts if you like.
@ -22,16 +22,16 @@ have 'mailboxes' with the messages they want to keep.
### Properties defined on `Msg`
- `senders` - this is a reference to one or many [Account](./Accounts) or [Objects](./Objects) (normally
- `senders` - this is a reference to one or many [Account](./Accounts.md) or [Objects](./Objects.md) (normally
*Characters*) sending the message. This could also be an *External Connection* such as a message
coming in over IRC/IMC2 (see below). There is usually only one sender, but the types can also be
mixed in any combination.
- `receivers` - a list of target [Accounts](./Accounts), [Objects](./Objects) (usually *Characters*) or
- `receivers` - a list of target [Accounts](./Accounts.md), [Objects](./Objects.md) (usually *Characters*) or
*Channels* to send the message to. The types of receivers can be mixed in any combination.
- `header` - this is a text field for storing a title or header for the message.
- `message` - the actual text being sent.
- `date_sent` - when message was sent (auto-created).
- `locks` - a [lock definition](./Locks).
- `locks` - a [lock definition](./Locks.md).
- `hide_from` - this can optionally hold a list of objects, accounts or channels to hide this `Msg`
from. This relationship is stored in the database primarily for optimization reasons, allowing for
quickly post-filter out messages not intended for a given target. There is no in-game methods for
@ -48,16 +48,16 @@ system expecting a `Msg` but when you don't actually want to save anything.
## Channels
Channels are [Typeclassed](./Typeclasses) entities, which mean they can be easily extended and their
Channels are [Typeclassed](./Typeclasses.md) entities, which mean they can be easily extended and their
functionality modified. To change which channel typeclass Evennia uses, change
settings.BASE_CHANNEL_TYPECLASS.
Channels act as generic distributors of messages. Think of them as "switch boards" redistributing
`Msg` or `TempMsg` objects. Internally they hold a list of "listening" objects and any `Msg` (or
`TempMsg`) sent to the channel will be distributed out to all channel listeners. Channels have
[Locks](./Locks) to limit who may listen and/or send messages through them.
[Locks](./Locks.md) to limit who may listen and/or send messages through them.
The *sending* of text to a channel is handled by a dynamically created [Command](./Commands) that
The *sending* of text to a channel is handled by a dynamically created [Command](./Commands.md) that
always have the same name as the channel. This is created for each channel by the global
`ChannelHandler`. The Channel command is added to the Account's cmdset and normal command locks are
used to determine which channels are possible to write to. When subscribing to a channel, you can
@ -109,5 +109,5 @@ for channel communication (since the default ChannelCommand instead logs to a fi
- `aliases` - alternative native names for channels
- `desc` - optional description of channel (seen in listings)
- `keep_log` (bool) - if the channel should store messages (default)
- `locks` - A [lock definition](./Locks). Channels normally use the access_types `send, control` and
- `locks` - A [lock definition](./Locks.md). Channels normally use the access_types `send, control` and
`listen`.

View file

@ -20,7 +20,7 @@ Effective, but not very exciting. You will most likely want to change this to be
your game. This is simple:
1. Edit `mygame/server/conf/connection_screens.py`.
1. [Reload](./Start-Stop-Reload) Evennia.
1. [Reload](./Start-Stop-Reload.md) Evennia.
Evennia will look into this module and locate all *globally defined strings* in it. These strings
are used as the text in your connection screen and are shown to the user at startup. If more than
@ -29,8 +29,8 @@ available.
### Commands available at the Connection Screen
You can also customize the [Commands](./Commands) available to use while the connection screen is
You can also customize the [Commands](./Commands.md) available to use while the connection screen is
shown (`connect`, `create` etc). These commands are a bit special since when the screen is running
the account is not yet logged in. A command is made available at the login screen by adding them to
`UnloggedinCmdSet` in `mygame/commands/default_cmdset.py`. See [Commands](./Commands) and the
`UnloggedinCmdSet` in `mygame/commands/default_cmdset.py`. See [Commands](./Commands.md) and the
tutorial section on how to add new commands to a default command set.

View file

@ -27,7 +27,7 @@ Among those you will need:
* A Continuous Integration Environment.
* I recommend [TeamCity](https://www.jetbrains.com/teamcity/) which has an in-depth [Setup
Guide](https://confluence.jetbrains.com/display/TCD8/Installing+and+Configuring+the+TeamCity+Server)
* [Source Control](./Version-Control)
* [Source Control](./Version-Control.md)
* This could be Git or SVN or any other available SC.
## Linux TeamCity Setup

File diff suppressed because it is too large Load diff

View file

@ -90,9 +90,9 @@ a new `README.md` file within that directory.
amount of game-style-specific code. Assume your code will be applied to a very different game than
you had in mind when creating it.
* To make the licensing situation clear we assume all contributions are released with the same
[license as Evennia](./Licensing). If this is not possible for some reason, talk to us and we'll
[license as Evennia](./Licensing.md). If this is not possible for some reason, talk to us and we'll
handle it on a case-by-case basis.
* Your contribution must be covered by [unit tests](./Unit-Testing). Having unit tests will both help
* Your contribution must be covered by [unit tests](./Unit-Testing.md). Having unit tests will both help
make your code more stable and make sure small changes does not break it without it being noticed,
it will also help us test its functionality and merge it quicker. If your contribution is a single
module, you can add your unit tests to `evennia/contribs/tests.py`. If your contribution is bigger

View file

@ -23,7 +23,7 @@ instance.
## Coordinates as tags
The first concept might be the most surprising at first glance: we will create coordinates as
[tags](./Tags).
[tags](./Tags.md).
> Why not attributes, wouldn't that be easier?

View file

@ -5,9 +5,9 @@
their own custom client protocol.*
A [PortalSession](./Sessions#Portal-and-Server-Sessions) is the basic data object representing an
A [PortalSession](./Sessions.md#portal-and-server-sessions) is the basic data object representing an
external
connection to the Evennia [Portal](./Portal-And-Server) -- usually a human player running a mud client
connection to the Evennia [Portal](./Portal-And-Server.md) -- usually a human player running a mud client
of some kind. The way they connect (the language the player's client and Evennia use to talk to
each other) is called the connection *Protocol*. The most common such protocol for MUD:s is the
*Telnet* protocol. All Portal Sessions are stored and managed by the Portal's *sessionhandler*.
@ -27,7 +27,7 @@ You <->
InputFunc
```
(See the [Message Path](./Messagepath) for the bigger picture of how data flows through Evennia). The
(See the [Message Path](./Messagepath.md) for the bigger picture of how data flows through Evennia). The
parts that needs to be customized to make your own custom protocol is the `Protocol + PortalSession`
(which translates between data coming in/out over the wire to/from Evennia internal representation)
as well as the `InputFunc` (which handles incoming data).
@ -219,11 +219,11 @@ in our case means sending "foo" across the network.
### Receiving data
Just because the protocol is there, does not mean Evennia knows what to do with it. An
[Inputfunc](./Inputfuncs) must exist to receive it. In the case of the `text` input exemplified above,
[Inputfunc](./Inputfuncs.md) must exist to receive it. In the case of the `text` input exemplified above,
Evennia alredy handles this input - it will parse it as a Command name followed by its inputs. So
handle that you need to simply add a cmdset with commands on your receiving Session (and/or the
Object/Character it is puppeting). If not you may need to add your own Inputfunc (see the
[Inputfunc](./Inputfuncs) page for how to do this.
[Inputfunc](./Inputfuncs.md) page for how to do this.
These might not be as clear-cut in all protocols, but the principle is there. These four basic
components - however they are accessed - links to the *Portal Session*, which is the actual common

View file

@ -106,7 +106,7 @@ Evennia is smart enough to understand that when we type `+something`, `+` is the
`something` is the command argument. This will, of course, fail if you have a command beginning by
`+` conflicting with the `CmdConnect` key.
4. We have altered some class attributes, like `auto_help`. If you want to know what they do and
why they have changed here, you can check the [documentation on commands](./Commands).
why they have changed here, you can check the [documentation on commands](./Commands.md).
5. In the command body, we begin by extracting the channel name. Remember that this name should be
in the command arguments (that is, in `self.args`). Following the same example, if a player enters
`+something`, `self.args` should contain `"something"`. We use `search_channel` to see if this

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,107 @@
# Default Commands
The full set of default Evennia commands currently contains 98 commands in 9 source
files. Our policy for adding default commands is outlined [here](./Using-MUX-as-a-Standard.md). The
[Commands](./Commands.md) documentation explains how Commands work as well as make new or customize
existing ones. Note that this page is auto-generated. Report problems to the [issue
tracker](github:issues).
```{note}
Some game-states adds their own Commands which are not listed here. Examples include editing a text
with [EvEditor](./EvEditor.md), flipping pages in [EvMore](./EvMore.md) or using the
[Batch-Processor](./Batch-Processors.md)'s interactive mode.
```
- [**__unloggedin_look_command** [l, look]](evennia.commands.default.unloggedin.CmdUnconnectedLook) (cmdset: [UnloggedinCmdSet](evennia.commands.default.cmdset_unloggedin.UnloggedinCmdSet), help-category: _General_)
- [**about** [version]](evennia.commands.default.system.CmdAbout) (cmdset: [CharacterCmdSet](evennia.commands.default.cmdset_character.CharacterCmdSet), help-category: _System_)
- [**access** [hierarchy, groups]](evennia.commands.default.general.CmdAccess) (cmdset: [CharacterCmdSet](evennia.commands.default.cmdset_character.CharacterCmdSet), help-category: _General_)
- [**accounts** [account, listaccounts]](evennia.commands.default.system.CmdAccounts) (cmdset: [CharacterCmdSet](evennia.commands.default.cmdset_character.CharacterCmdSet), help-category: _System_)
- [**addcom** [chanalias, aliaschan]](evennia.commands.default.comms.CmdAddCom) (cmdset: [AccountCmdSet](evennia.commands.default.cmdset_account.AccountCmdSet), help-category: _Comms_)
- [**alias** [setobjalias]](evennia.commands.default.building.CmdSetObjAlias) (cmdset: [CharacterCmdSet](evennia.commands.default.cmdset_character.CharacterCmdSet), help-category: _Building_)
- [**allcom**](evennia.commands.default.comms.CmdAllCom) (cmdset: [AccountCmdSet](evennia.commands.default.cmdset_account.AccountCmdSet), help-category: _Comms_)
- [**batchcode** [batchcodes]](evennia.commands.default.batchprocess.CmdBatchCode) (cmdset: [CharacterCmdSet](evennia.commands.default.cmdset_character.CharacterCmdSet), help-category: _Building_)
- [**batchcommands** [batchcmd, batchcommand]](evennia.commands.default.batchprocess.CmdBatchCommands) (cmdset: [CharacterCmdSet](evennia.commands.default.cmdset_character.CharacterCmdSet), help-category: _Building_)
- [**cboot**](evennia.commands.default.comms.CmdCBoot) (cmdset: [AccountCmdSet](evennia.commands.default.cmdset_account.AccountCmdSet), help-category: _Comms_)
- [**ccreate** [channelcreate]](evennia.commands.default.comms.CmdChannelCreate) (cmdset: [AccountCmdSet](evennia.commands.default.cmdset_account.AccountCmdSet), help-category: _Comms_)
- [**cdesc**](evennia.commands.default.comms.CmdCdesc) (cmdset: [AccountCmdSet](evennia.commands.default.cmdset_account.AccountCmdSet), help-category: _Comms_)
- [**cdestroy**](evennia.commands.default.comms.CmdCdestroy) (cmdset: [AccountCmdSet](evennia.commands.default.cmdset_account.AccountCmdSet), help-category: _Comms_)
- [**cemit** [cmsg]](evennia.commands.default.comms.CmdCemit) (cmdset: [AccountCmdSet](evennia.commands.default.cmdset_account.AccountCmdSet), help-category: _Comms_)
- [**channels** [clist, chanlist, all channels, channellist, comlist]](evennia.commands.default.comms.CmdChannels) (cmdset: [AccountCmdSet](evennia.commands.default.cmdset_account.AccountCmdSet), help-category: _Comms_)
- [**charcreate**](evennia.commands.default.account.CmdCharCreate) (cmdset: [AccountCmdSet](evennia.commands.default.cmdset_account.AccountCmdSet), help-category: _General_)
- [**chardelete**](evennia.commands.default.account.CmdCharDelete) (cmdset: [AccountCmdSet](evennia.commands.default.cmdset_account.AccountCmdSet), help-category: _General_)
- [**clock**](evennia.commands.default.comms.CmdClock) (cmdset: [AccountCmdSet](evennia.commands.default.cmdset_account.AccountCmdSet), help-category: _Comms_)
- [**cmdsets** [listcmsets]](evennia.commands.default.building.CmdListCmdSets) (cmdset: [CharacterCmdSet](evennia.commands.default.cmdset_character.CharacterCmdSet), help-category: _Building_)
- [**color**](evennia.commands.default.account.CmdColorTest) (cmdset: [AccountCmdSet](evennia.commands.default.cmdset_account.AccountCmdSet), help-category: _General_)
- [**connect** [conn, co, con]](evennia.commands.default.unloggedin.CmdUnconnectedConnect) (cmdset: [UnloggedinCmdSet](evennia.commands.default.cmdset_unloggedin.UnloggedinCmdSet), help-category: _General_)
- [**copy**](evennia.commands.default.building.CmdCopy) (cmdset: [CharacterCmdSet](evennia.commands.default.cmdset_character.CharacterCmdSet), help-category: _Building_)
- [**cpattr**](evennia.commands.default.building.CmdCpAttr) (cmdset: [CharacterCmdSet](evennia.commands.default.cmdset_character.CharacterCmdSet), help-category: _Building_)
- [**create**](evennia.commands.default.building.CmdCreate) (cmdset: [CharacterCmdSet](evennia.commands.default.cmdset_character.CharacterCmdSet), help-category: _Building_)
- [**create** [cre, cr]](evennia.commands.default.unloggedin.CmdUnconnectedCreate) (cmdset: [UnloggedinCmdSet](evennia.commands.default.cmdset_unloggedin.UnloggedinCmdSet), help-category: _General_)
- [**cwho**](evennia.commands.default.comms.CmdCWho) (cmdset: [AccountCmdSet](evennia.commands.default.cmdset_account.AccountCmdSet), help-category: _Comms_)
- [**delcom** [delchanalias, delaliaschan]](evennia.commands.default.comms.CmdDelCom) (cmdset: [AccountCmdSet](evennia.commands.default.cmdset_account.AccountCmdSet), help-category: _Comms_)
- [**desc** [describe]](evennia.commands.default.building.CmdDesc) (cmdset: [CharacterCmdSet](evennia.commands.default.cmdset_character.CharacterCmdSet), help-category: _Building_)
- [**destroy** [delete, del]](evennia.commands.default.building.CmdDestroy) (cmdset: [CharacterCmdSet](evennia.commands.default.cmdset_character.CharacterCmdSet), help-category: _Building_)
- [**dig**](evennia.commands.default.building.CmdDig) (cmdset: [CharacterCmdSet](evennia.commands.default.cmdset_character.CharacterCmdSet), help-category: _Building_)
- [**drop**](evennia.commands.default.general.CmdDrop) (cmdset: [CharacterCmdSet](evennia.commands.default.cmdset_character.CharacterCmdSet), help-category: _General_)
- [**encoding** [encode]](evennia.commands.default.unloggedin.CmdUnconnectedEncoding) (cmdset: [UnloggedinCmdSet](evennia.commands.default.cmdset_unloggedin.UnloggedinCmdSet), help-category: _General_)
- [**examine** [ex, exam]](evennia.commands.default.building.CmdExamine) (cmdset: [AccountCmdSet](evennia.commands.default.cmdset_account.AccountCmdSet), help-category: _Building_)
- [**find** [search, locate]](evennia.commands.default.building.CmdFind) (cmdset: [CharacterCmdSet](evennia.commands.default.cmdset_character.CharacterCmdSet), help-category: _Building_)
- [**get** [grab]](evennia.commands.default.general.CmdGet) (cmdset: [CharacterCmdSet](evennia.commands.default.cmdset_character.CharacterCmdSet), help-category: _General_)
- [**give**](evennia.commands.default.general.CmdGive) (cmdset: [CharacterCmdSet](evennia.commands.default.cmdset_character.CharacterCmdSet), help-category: _General_)
- [**grapevine2chan**](evennia.commands.default.comms.CmdGrapevine2Chan) (cmdset: [AccountCmdSet](evennia.commands.default.cmdset_account.AccountCmdSet), help-category: _Comms_)
- [**help** [?]](evennia.commands.default.help.CmdHelp) (cmdset: [AccountCmdSet](evennia.commands.default.cmdset_account.AccountCmdSet), help-category: _General_)
- [**help** [h, ?]](evennia.commands.default.unloggedin.CmdUnconnectedHelp) (cmdset: [UnloggedinCmdSet](evennia.commands.default.cmdset_unloggedin.UnloggedinCmdSet), help-category: _General_)
- [**home**](evennia.commands.default.general.CmdHome) (cmdset: [CharacterCmdSet](evennia.commands.default.cmdset_character.CharacterCmdSet), help-category: _General_)
- [**ic** [puppet]](evennia.commands.default.account.CmdIC) (cmdset: [AccountCmdSet](evennia.commands.default.cmdset_account.AccountCmdSet), help-category: _General_)
- [**info**](evennia.commands.default.unloggedin.CmdUnconnectedInfo) (cmdset: [UnloggedinCmdSet](evennia.commands.default.cmdset_unloggedin.UnloggedinCmdSet), help-category: _General_)
- [**inventory** [inv, i]](evennia.commands.default.general.CmdInventory) (cmdset: [CharacterCmdSet](evennia.commands.default.cmdset_character.CharacterCmdSet), help-category: _General_)
- [**irc2chan**](evennia.commands.default.comms.CmdIRC2Chan) (cmdset: [AccountCmdSet](evennia.commands.default.cmdset_account.AccountCmdSet), help-category: _Comms_)
- [**ircstatus**](evennia.commands.default.comms.CmdIRCStatus) (cmdset: [AccountCmdSet](evennia.commands.default.cmdset_account.AccountCmdSet), help-category: _Comms_)
- [**link**](evennia.commands.default.building.CmdLink) (cmdset: [CharacterCmdSet](evennia.commands.default.cmdset_character.CharacterCmdSet), help-category: _Building_)
- [**lock** [locks]](evennia.commands.default.building.CmdLock) (cmdset: [CharacterCmdSet](evennia.commands.default.cmdset_character.CharacterCmdSet), help-category: _Building_)
- [**look** [l, ls]](evennia.commands.default.account.CmdOOCLook) (cmdset: [AccountCmdSet](evennia.commands.default.cmdset_account.AccountCmdSet), help-category: _General_)
- [**look** [l, ls]](evennia.commands.default.general.CmdLook) (cmdset: [CharacterCmdSet](evennia.commands.default.cmdset_character.CharacterCmdSet), help-category: _General_)
- [**mvattr**](evennia.commands.default.building.CmdMvAttr) (cmdset: [CharacterCmdSet](evennia.commands.default.cmdset_character.CharacterCmdSet), help-category: _Building_)
- [**name** [rename]](evennia.commands.default.building.CmdName) (cmdset: [CharacterCmdSet](evennia.commands.default.cmdset_character.CharacterCmdSet), help-category: _Building_)
- [**nick** [nickname, nicks]](evennia.commands.default.general.CmdNick) (cmdset: [AccountCmdSet](evennia.commands.default.cmdset_account.AccountCmdSet), help-category: _General_)
- [**objects** [listobjects, db, listobjs, stats]](evennia.commands.default.system.CmdObjects) (cmdset: [CharacterCmdSet](evennia.commands.default.cmdset_character.CharacterCmdSet), help-category: _System_)
- [**ooc** [unpuppet]](evennia.commands.default.account.CmdOOC) (cmdset: [AccountCmdSet](evennia.commands.default.cmdset_account.AccountCmdSet), help-category: _General_)
- [**open**](evennia.commands.default.building.CmdOpen) (cmdset: [CharacterCmdSet](evennia.commands.default.cmdset_character.CharacterCmdSet), help-category: _Building_)
- [**option** [options]](evennia.commands.default.account.CmdOption) (cmdset: [AccountCmdSet](evennia.commands.default.cmdset_account.AccountCmdSet), help-category: _General_)
- [**page** [tell]](evennia.commands.default.comms.CmdPage) (cmdset: [AccountCmdSet](evennia.commands.default.cmdset_account.AccountCmdSet), help-category: _Comms_)
- [**password**](evennia.commands.default.account.CmdPassword) (cmdset: [AccountCmdSet](evennia.commands.default.cmdset_account.AccountCmdSet), help-category: _General_)
- [**pose** [emote, :]](evennia.commands.default.general.CmdPose) (cmdset: [CharacterCmdSet](evennia.commands.default.cmdset_character.CharacterCmdSet), help-category: _General_)
- [**py** [!]](evennia.commands.default.system.CmdPy) (cmdset: [AccountCmdSet](evennia.commands.default.cmdset_account.AccountCmdSet), help-category: _System_)
- [**quell** [unquell]](evennia.commands.default.account.CmdQuell) (cmdset: [AccountCmdSet](evennia.commands.default.cmdset_account.AccountCmdSet), help-category: _General_)
- [**quit**](evennia.commands.default.account.CmdQuit) (cmdset: [AccountCmdSet](evennia.commands.default.cmdset_account.AccountCmdSet), help-category: _General_)
- [**quit** [qu, q]](evennia.commands.default.unloggedin.CmdUnconnectedQuit) (cmdset: [UnloggedinCmdSet](evennia.commands.default.cmdset_unloggedin.UnloggedinCmdSet), help-category: _General_)
- [**reload** [restart]](evennia.commands.default.system.CmdReload) (cmdset: [AccountCmdSet](evennia.commands.default.cmdset_account.AccountCmdSet), help-category: _System_)
- [**reset** [reboot]](evennia.commands.default.system.CmdReset) (cmdset: [AccountCmdSet](evennia.commands.default.cmdset_account.AccountCmdSet), help-category: _System_)
- [**rss2chan**](evennia.commands.default.comms.CmdRSS2Chan) (cmdset: [AccountCmdSet](evennia.commands.default.cmdset_account.AccountCmdSet), help-category: _Comms_)
- [**say** [', "]](evennia.commands.default.general.CmdSay) (cmdset: [CharacterCmdSet](evennia.commands.default.cmdset_character.CharacterCmdSet), help-category: _General_)
- [**screenreader**](evennia.commands.default.unloggedin.CmdUnconnectedScreenreader) (cmdset: [UnloggedinCmdSet](evennia.commands.default.cmdset_unloggedin.UnloggedinCmdSet), help-category: _General_)
- [**script** [addscript]](evennia.commands.default.building.CmdScript) (cmdset: [CharacterCmdSet](evennia.commands.default.cmdset_character.CharacterCmdSet), help-category: _Building_)
- [**scripts** [listscripts, globalscript]](evennia.commands.default.system.CmdScripts) (cmdset: [CharacterCmdSet](evennia.commands.default.cmdset_character.CharacterCmdSet), help-category: _System_)
- [**server** [serverload, serverprocess]](evennia.commands.default.system.CmdServerLoad) (cmdset: [CharacterCmdSet](evennia.commands.default.cmdset_character.CharacterCmdSet), help-category: _System_)
- [**service** [services]](evennia.commands.default.system.CmdService) (cmdset: [CharacterCmdSet](evennia.commands.default.cmdset_character.CharacterCmdSet), help-category: _System_)
- [**sessions**](evennia.commands.default.account.CmdSessions) (cmdset: [SessionCmdSet](evennia.commands.default.cmdset_session.SessionCmdSet), help-category: _General_)
- [**set**](evennia.commands.default.building.CmdSetAttribute) (cmdset: [CharacterCmdSet](evennia.commands.default.cmdset_character.CharacterCmdSet), help-category: _Building_)
- [**setdesc**](evennia.commands.default.general.CmdSetDesc) (cmdset: [CharacterCmdSet](evennia.commands.default.cmdset_character.CharacterCmdSet), help-category: _General_)
- [**sethelp**](evennia.commands.default.help.CmdSetHelp) (cmdset: [CharacterCmdSet](evennia.commands.default.cmdset_character.CharacterCmdSet), help-category: _Building_)
- [**sethome**](evennia.commands.default.building.CmdSetHome) (cmdset: [CharacterCmdSet](evennia.commands.default.cmdset_character.CharacterCmdSet), help-category: _Building_)
- [**shutdown**](evennia.commands.default.system.CmdShutdown) (cmdset: [AccountCmdSet](evennia.commands.default.cmdset_account.AccountCmdSet), help-category: _System_)
- [**spawn** [olc]](evennia.commands.default.building.CmdSpawn) (cmdset: [CharacterCmdSet](evennia.commands.default.cmdset_character.CharacterCmdSet), help-category: _Building_)
- [**style**](evennia.commands.default.account.CmdStyle) (cmdset: [AccountCmdSet](evennia.commands.default.cmdset_account.AccountCmdSet), help-category: _General_)
- [**tag** [tags]](evennia.commands.default.building.CmdTag) (cmdset: [CharacterCmdSet](evennia.commands.default.cmdset_character.CharacterCmdSet), help-category: _Building_)
- [**tel** [teleport]](evennia.commands.default.building.CmdTeleport) (cmdset: [CharacterCmdSet](evennia.commands.default.cmdset_character.CharacterCmdSet), help-category: _Building_)
- [**tickers**](evennia.commands.default.system.CmdTickers) (cmdset: [CharacterCmdSet](evennia.commands.default.cmdset_character.CharacterCmdSet), help-category: _System_)
- [**time** [uptime]](evennia.commands.default.system.CmdTime) (cmdset: [CharacterCmdSet](evennia.commands.default.cmdset_character.CharacterCmdSet), help-category: _System_)
- [**tunnel** [tun]](evennia.commands.default.building.CmdTunnel) (cmdset: [CharacterCmdSet](evennia.commands.default.cmdset_character.CharacterCmdSet), help-category: _Building_)
- [**typeclass** [swap, parent, update, type]](evennia.commands.default.building.CmdTypeclass) (cmdset: [CharacterCmdSet](evennia.commands.default.cmdset_character.CharacterCmdSet), help-category: _Building_)
- [**unlink**](evennia.commands.default.building.CmdUnLink) (cmdset: [CharacterCmdSet](evennia.commands.default.cmdset_character.CharacterCmdSet), help-category: _Building_)
- [**whisper**](evennia.commands.default.general.CmdWhisper) (cmdset: [CharacterCmdSet](evennia.commands.default.cmdset_character.CharacterCmdSet), help-category: _General_)
- [**who** [doing]](evennia.commands.default.account.CmdWho) (cmdset: [AccountCmdSet](evennia.commands.default.cmdset_account.AccountCmdSet), help-category: _General_)
- [**wipe**](evennia.commands.default.building.CmdWipe) (cmdset: [CharacterCmdSet](evennia.commands.default.cmdset_character.CharacterCmdSet), help-category: _Building_)

View file

@ -2,8 +2,8 @@
Evennia allows for exits to have any name. The command "kitchen" is a valid exit name as well as
"jump out the window" or "north". An exit actually consists of two parts: an [Exit Object](./Objects)
and an [Exit Command](./Commands) stored on said exit object. The command has the same key and aliases
"jump out the window" or "north". An exit actually consists of two parts: an [Exit Object](./Objects.md)
and an [Exit Command](./Commands.md) stored on said exit object. The command has the same key and aliases
as the object, which is why you can see the exit in the room and just write its name to traverse it.
If you try to enter the name of a non-existing exit, it is thus the same as trying a non-exising
@ -24,7 +24,7 @@ error message just told us that we couldn't go there.
## Adding default error commands
To solve this you need to be aware of how to [write and add new commands](./Adding-Command-Tutorial).
To solve this you need to be aware of how to [write and add new commands](./Adding-Command-Tutorial.md).
What you need to do is to create new commands for all directions you want to support in your game.
In this example all we'll do is echo an error message, but you could certainly consider more
advanced uses. You add these commands to the default command set. Here is an example of such a set
@ -90,7 +90,7 @@ commands:
You cannot move east.
Further expansions by the exit system (including manipulating the way the Exit command itself is
created) can be done by modifying the [Exit typeclass](./Typeclasses) directly.
created) can be done by modifying the [Exit typeclass](./Typeclasses.md) directly.
## Additional Comments
@ -109,7 +109,7 @@ So why didn't we create a single error command above? Something like this:
The anwer is that this would *not* work and understanding why is important in order to not be
confused when working with commands and command sets.
The reason it doesn't work is because Evennia's [command system](./Commands) compares commands *both*
The reason it doesn't work is because Evennia's [command system](./Commands.md) compares commands *both*
by `key` and by `aliases`. If *either* of those match, the two commands are considered *identical*
as far as cmdset merging system is concerned.

View file

@ -6,98 +6,98 @@ library itself.
### General Evennia development information
- [Introduction to coding with Evennia](./Coding-Introduction)
- [Evennia Licensing FAQ](./Licensing)
- [Contributing to Evennia](./Contributing)
- [Introduction to coding with Evennia](./Coding-Introduction.md)
- [Evennia Licensing FAQ](./Licensing.md)
- [Contributing to Evennia](./Contributing.md)
- [Code Style Guide](https://github.com/evennia/evennia/blob/master/CODING_STYLE.md) (Important!)
- [Policy for 'MUX-like' default commands](./Using-MUX-as-a-Standard)
- [Setting up a Git environment for coding](./Version-Control)
- [Getting started with Travis and Github for continuous integration testing](./Using-Travis)
- [Planning your own Evennia game](./Game-Planning)
- [First steps coding Evennia](./First-Steps-Coding)
- [Translating Evennia](./Internationalization#translating-evennia)
- [Evennia Quirks](./Quirks) to keep in mind.
- [Directions for configuring PyCharm with Evennia on Windows](./Setting-up-PyCharm)
- [Policy for 'MUX-like' default commands](./Using-MUX-as-a-Standard.md)
- [Setting up a Git environment for coding](./Version-Control.md)
- [Getting started with Travis and Github for continuous integration testing](./Using-Travis.md)
- [Planning your own Evennia game](./Game-Planning.md)
- [First steps coding Evennia](./First-Steps-Coding.md)
- [Translating Evennia](./Internationalization.md#translating-evennia)
- [Evennia Quirks](./Quirks.md) to keep in mind.
- [Directions for configuring PyCharm with Evennia on Windows](./Setting-up-PyCharm.md)
### Evennia API
- [Directory Overview](./Directory-Overview)
- [evennia - the flat API](./Evennia-API)
- [Running and Testing Python code](./Execute-Python-Code)
- [Directory Overview](./Directory-Overview.md)
- [evennia - the flat API](./Evennia-API.md)
- [Running and Testing Python code](./Execute-Python-Code.md)
#### Core components and protocols
- [Server and Portal](./Portal-And-Server)
- [Sessions](./Sessions)
- [Configuration and module plugins](./Server-Conf)
- [The message path](./Messagepath)
- [OOB](./OOB) - Out-of-band communication
- [Inputfuncs](./Inputfuncs)
- [Adding new protocols (client APIs) and services](./Custom-Protocols)
- [Adding new database models](./New-Models)
- [Unit Testing](./Unit-Testing)
- [Running profiling](./Profiling)
- [Debugging your code](./Debugging)
- [Server and Portal](./Portal-And-Server.md)
- [Sessions](./Sessions.md)
- [Configuration and module plugins](./Server-Conf.md)
- [The message path](./Messagepath.md)
- [OOB](./OOB.md) - Out-of-band communication
- [Inputfuncs](./Inputfuncs.md)
- [Adding new protocols (client APIs) and services](./Custom-Protocols.md)
- [Adding new database models](./New-Models.md)
- [Unit Testing](./Unit-Testing.md)
- [Running profiling](./Profiling.md)
- [Debugging your code](./Debugging.md)
#### In-game Commands
- [Command System overview](./Command-System)
- [Commands](./Commands)
- [Command Sets](./Command-Sets)
- [Command Auto-help](./Help-System#command-auto-help-system)
- [Command System overview](./Command-System.md)
- [Commands](./Commands.md)
- [Command Sets](./Command-Sets.md)
- [Command Auto-help](./Help-System.md#command-auto-help-system)
#### Typeclasses and related concepts
- [General about Typeclasses](./Typeclasses)
- [Objects](./Objects)
- [Characters](./Objects#characters)
- [Rooms](./Objects#rooms)
- [Exits](./Objects#exits)
- [Accounts](./Accounts)
- [Communications](./Communications)
- [Channels](./Communications#channels)
- [Scripts](./Scripts)
- [Global Scripts](./Scripts#Global-Scripts)
- [TickerHandler](./TickerHandler)
- [utils.delay](./Coding-Utils#utilsdelay)
- [MonitorHandler](./MonitorHandler)
- [Attributes](./Attributes)
- [Nicks](./Nicks)
- [Tags](./Tags)
- [Tags for Aliases and Permissions](./Tags#using-aliases-and-permissions)
- [General about Typeclasses](./Typeclasses.md)
- [Objects](./Objects.md)
- [Characters](./Objects.md#characters)
- [Rooms](./Objects.md#rooms)
- [Exits](./Objects.md#exits)
- [Accounts](./Accounts.md)
- [Communications](./Communications.md)
- [Channels](./Communications.md#channels)
- [Scripts](./Scripts.md)
- [Global Scripts](./Scripts.md#global-scripts)
- [TickerHandler](./TickerHandler.md)
- [utils.delay](./Coding-Utils.md#utilsdelay)
- [MonitorHandler](./MonitorHandler.md)
- [Attributes](./Attributes.md)
- [Nicks](./Nicks.md)
- [Tags](./Tags.md)
- [Tags for Aliases and Permissions](./Tags.md#using-aliases-and-permissions)
#### Web
- [Web features overview](./Web-Features)
- [The Webclient](./Webclient)
- [Web tutorials](./Web-Tutorial)
- [Web features overview](./Web-Features.md)
- [The Webclient](./Webclient.md)
- [Web tutorials](./Web-Tutorial.md)
#### Other systems
- [Locks](./Locks)
- [Permissions](./Locks#permissions)
- [Help System](./Help-System)
- [Signals](./Signals)
- [General coding utilities](./Coding-Utils)
- [Utils in evennia.utils.utils](api:evennia.utils.utils)
- [Game time](./Coding-Utils#game-time)
- [Game Menus](./EvMenu) (EvMenu)
- [Text paging/scrolling](./EvMore) (EvMore)
- [Text Line Editor](./EvEditor) (EvEditor)
- [Locks](./Locks.md)
- [Permissions](./Locks.md#permissions)
- [Help System](./Help-System.md)
- [Signals](./Signals.md)
- [General coding utilities](./Coding-Utils.md)
- [Utils in evennia.utils.utils](evennia.utils.utils)
- [Game time](./Coding-Utils.md#game-time)
- [Game Menus](./EvMenu.md) (EvMenu)
- [Text paging/scrolling](./EvMore.md) (EvMore)
- [Text Line Editor](./EvEditor.md) (EvEditor)
- [Text Tables](github:evennia.utils.evtable) (EvTable)
- [Text Form generation](github:evennia.utils.evform) (EvForm)
- [Spawner and Prototypes](./Spawner-and-Prototypes)
- [Inlinefuncs](./TextTags#inline-functions)
- [Asynchronous execution](./Async-Process)
- [Spawner and Prototypes](./Spawner-and-Prototypes.md)
- [Inlinefuncs](./TextTags.md#inline-functions)
- [Asynchronous execution](./Async-Process.md)
### Developer brainstorms and whitepages
- [API refactoring](./API-refactoring), discussing what parts of the Evennia API needs a
- [API refactoring](./API-refactoring.md), discussing what parts of the Evennia API needs a
refactoring/cleanup/simplification
- [Docs refactoring](./Docs-refactoring), discussing how to reorganize and structure this wiki/docs
- [Docs refactoring](./Docs-refactoring.md), discussing how to reorganize and structure this wiki/docs
better going forward
- [Webclient brainstorm](./Webclient-brainstorm), some ideas for a future webclient gui
- [Roadmap](./Roadmap), a tentative list of future major features
- [Webclient brainstorm](./Webclient-brainstorm.md), some ideas for a future webclient gui
- [Roadmap](./Roadmap.md), a tentative list of future major features
- [Change log](https://github.com/evennia/evennia/blob/master/CHANGELOG.md) of big Evennia updates
over time
@ -108,7 +108,7 @@ zY1RoZGc6MQ#gid=0
[issues]: https://github.com/evennia/evennia/issues
```toctree::
```{toctree}
:hidden:
Coding-Introduction

View file

@ -10,8 +10,8 @@ assume it's called `mygame`. Apart from the `server/` subfolder within, you coul
folder if you preferred a different code structure for your game.
- `mygame/`
- `commands/` - Overload default [Commands](./Commands) or add your own Commands/[Command
sets](Command-Sets) here.
- `commands/` - Overload default [Commands](./Commands.md) or add your own Commands/[Command
sets](./Command-Sets.md) here.
- `server`/ - The structure of this folder should not change since Evennia expects it.
- [`conf/`](https://github.com/evennia/evennia/tree/master/evennia/game_template/server) - All
server configuration files sits here. The most important file is `settings.py`.
@ -19,7 +19,7 @@ server configuration files sits here. The most important file is `settings.py`.
- `typeclasses/` - this folder contains empty templates for overloading default game entities of
Evennia. Evennia will automatically use the changes in those templates for the game entities it
creates.
- `web/` - This holds the [Web features](./Web-Features) of your game.
- `web/` - This holds the [Web features](./Web-Features.md) of your game.
- `world/` - this is a "miscellaneous" folder holding everything related to the world you are
building, such as build scripts and rules modules that don't fit with one of the other folders.
@ -30,30 +30,30 @@ top level of it contains Python package specific stuff such as a readme file, `s
also has two subfolders`bin/` and `evennia/` (again).
The `bin/` directory holds OS-specific binaries that will be used when installing Evennia with `pip`
as per the [Getting started](./Getting-Started) instructions. The library itself is in the `evennia`
as per the [Getting started](./Getting-Started.md) instructions. The library itself is in the `evennia`
subfolder. From your code you will access this subfolder simply by `import evennia`.
- evennia
- [`__init__.py`](./Evennia-API) - The "flat API" of Evennia resides here.
- [`commands/`](./Commands) - The command parser and handler.
- `default/` - The [default commands](./Default-Command-Help) and cmdsets.
- [`comms/`](./Communications) - Systems for communicating in-game.
- [`__init__.py`](./Evennia-API.md) - The "flat API" of Evennia resides here.
- [`commands/`](./Commands.md) - The command parser and handler.
- `default/` - The [default commands](./Default-Commands.md) and cmdsets.
- [`comms/`](./Communications.md) - Systems for communicating in-game.
- `contrib/` - Optional plugins too game-specific for core Evennia.
- `game_template/` - Copied to become the "game directory" when using `evennia --init`.
- [`help/`](./Help-System) - Handles the storage and creation of help entries.
- `locale/` - Language files ([i18n](./Internationalization)).
- [`locks/`](./Locks) - Lock system for restricting access to in-game entities.
- [`objects/`](./Objects) - In-game entities (all types of items and Characters).
- [`prototypes/`](./Spawner-and-Prototypes) - Object Prototype/spawning system and OLC menu
- [`accounts/`](./Accounts) - Out-of-game Session-controlled entities (accounts, bots etc)
- [`scripts/`](./Scripts) - Out-of-game entities equivalence to Objects, also with timer support.
- [`server/`](./Portal-And-Server) - Core server code and Session handling.
- [`help/`](./Help-System.md) - Handles the storage and creation of help entries.
- `locale/` - Language files ([i18n](./Internationalization.md)).
- [`locks/`](./Locks.md) - Lock system for restricting access to in-game entities.
- [`objects/`](./Objects.md) - In-game entities (all types of items and Characters).
- [`prototypes/`](./Spawner-and-Prototypes.md) - Object Prototype/spawning system and OLC menu
- [`accounts/`](./Accounts.md) - Out-of-game Session-controlled entities (accounts, bots etc)
- [`scripts/`](./Scripts.md) - Out-of-game entities equivalence to Objects, also with timer support.
- [`server/`](./Portal-And-Server.md) - Core server code and Session handling.
- `portal/` - Portal proxy and connection protocols.
- [`settings_default.py`](./Server-Conf#Settings-file) - Root settings of Evennia. Copy settings
- [`settings_default.py`](./Server-Conf.md#settings-file) - Root settings of Evennia. Copy settings
from here to `mygame/server/settings.py` file.
- [`typeclasses/`](./Typeclasses) - Abstract classes for the typeclass storage and database system.
- [`utils/`](./Coding-Utils) - Various miscellaneous useful coding resources.
- [`web/`](./Web-Features) - Web resources and webserver. Partly copied into game directory on
- [`typeclasses/`](./Typeclasses.md) - Abstract classes for the typeclass storage and database system.
- [`utils/`](./Coding-Utils.md) - Various miscellaneous useful coding resources.
- [`web/`](./Web-Features.md) - Web resources and webserver. Partly copied into game directory on
initialization.
All directories contain files ending in `.py`. These are Python *modules* and are the basic units of
@ -62,7 +62,7 @@ required by Python so as to be able to find and import modules in other director
run Evennia at least once you will find that there will also be `.pyc` files appearing, these are
pre-compiled binary versions of the `.py` files to speed up execution.
The root of the `evennia` folder has an `__init__.py` file containing the "[flat API](./Evennia-API)".
The root of the `evennia` folder has an `__init__.py` file containing the "[flat API](./Evennia-API.md)".
This holds shortcuts to various subfolders in the evennia library. It is provided to make it easier
to find things; it allows you to just import `evennia` and access things from that rather than
having to import from their actual locations inside the source tree.

View file

@ -31,19 +31,19 @@ This would help in development to quickly refer to where a resource is located.
### Kovitikus (Sept. 11, 2019)
[Batch Code](./Batch-Code-Processor) should have a link in the developer area. It is currently only
[Batch Code](./Batch-Code-Processor.md) should have a link in the developer area. It is currently only
listed in the tutorials section as an afterthought to a tutorial title.
***
In regards to the general structure of each wiki page: I'd like to see a table of contents at the
top of each one, so that it can be quickly navigated and is immediately apparent what sections are
covered on the page. Similar to the current [Getting Started](./Getting-Started) page.
covered on the page. Similar to the current [Getting Started](./Getting-Started.md) page.
***
The structuring of the page should also include a quick reference cheatsheet for certain aspects.
Such as [Tags](./Tags) including a quick reference section at the top that lists an example of every
Such as [Tags](./Tags.md) including a quick reference section at the top that lists an example of every
available method you can use in a clear and consistent format, along with a comment. Readers
shouldn't have to decipher the article to gather such basic information and it should instead be
available at first glance.

View file

@ -4,7 +4,7 @@
## Introduction
An often desired feature in a MUD is to show an in-game map to help navigation. The [Static in-game
map](Static-In-Game-Map) tutorial solves this by creating a *static* map, meaning the map is pre-
map](./Static-In-Game-Map.md) tutorial solves this by creating a *static* map, meaning the map is pre-
drawn once and for all - the rooms are then created to match that map. When walking around, parts of
the static map is then cut out and displayed next to the room description.
@ -20,9 +20,9 @@ world to be 'logically' impossible with rooms looping to themselves or exits lea
side of the map. Exits can also be named anything, from "jumping out the window" to "into the fifth
dimension". This tutorial assumes you can only move in the cardinal directions (N, E, S and W).
2. Rooms must be connected and linked together for the map to be generated correctly. Vanilla
Evennia comes with a admin command [@tunnel](./Default-Command-Help#tunnel-cmdtunnel) that allows a
Evennia comes with a admin command [tunnel](evennia.commands.default.building.CmdTunnel) that allows a
user to create rooms in the cardinal directions, but additional work is needed to assure that rooms
are connected. For example, if you `@tunnel east` and then immediately do `@tunnel west` you'll find
are connected. For example, if you `tunnel east` and then immediately do `tunnel west` you'll find
that you have created two completely stand-alone rooms. So care is needed if you want to create a
"logical" layout. In this tutorial we assume you have such a grid of rooms that we can generate the
map from.
@ -361,7 +361,7 @@ looping rooms that will show on your in-game map.
The above example will display the map above the room description. You could also use an
[EvTable](github:evennia.utils.evtable) to place description and map next to each other. Some other
things you can do is to have a [Command](./Commands) that displays with a larger radius, maybe with a
things you can do is to have a [Command](./Commands.md) that displays with a larger radius, maybe with a
legend and other features.
Below is the whole `map.py` for your reference. You need to update your `Room` typeclass (see above)

View file

@ -44,13 +44,13 @@ Python function. For that, there is the _EvMenu templating_ language. This allow
menu
in a more human-readable string with a simple format. This is then parsed to produce the
`{"nodename": <function>, ...}` mapping for you, for the EvMenu to use normally. The templating
language is described in the [Menu templating section](./EvMenu#Evmenu-templating-language).
language is described in the [Menu templating section](./EvMenu.md#evmenu-templating-language).
## Launching the menu
Initializing the menu is done using a call to the `evennia.utils.evmenu.EvMenu` class. This is the
most common way to do so - from inside a [Command](./Commands):
most common way to do so - from inside a [Command](./Commands.md):
```python
# in, for example gamedir/commands/command.py
@ -91,7 +91,7 @@ This menutree can also be generated from an *EvMenu template*
```
The `template_string` and `goto_callables` are described in [Template language
section](EvMenu#Evmenu-templating-language).
section](./EvMenu.md#evmenu-templating-language).
## The EvMenu class
@ -113,7 +113,7 @@ EvMenu(caller, menu_data,
```
- `caller` (Object or Account): is a reference to the object using the menu. This object will get a
new [CmdSet](./Command-Sets) assigned to it, for handling the menu.
new [CmdSet](./Command-Sets.md) assigned to it, for handling the menu.
- `menu_data` (str, module or dict): is a module or python path to a module where the global-level
functions will each be considered to be a menu node. Their names in the module will be the names
by which they are referred to in the module. Importantly, function names starting with an
@ -150,7 +150,7 @@ after
- `startnode_input` (str or (str, dict) tuple): Pass an input text or a input text + kwargs to the
start node as if it was entered on a fictional previous node. This can be very useful in order to
start a menu differently depending on the Command's arguments in which it was initialized.
- `session` (Session): Useful when calling the menu from an [Account](./Accounts) in
- `session` (Session): Useful when calling the menu from an [Account](./Accounts.md) in
`MULTISESSION_MODDE` higher than 2, to make sure only the right Session sees the menu output.
- `debug` (bool): If set, the `menudebug` command will be made available in the menu. Use it to
list the current state of the menu and use `menudebug <variable>` to inspect a specific state
@ -739,15 +739,15 @@ template2menu(caller, template_string, goto_callables)
## Examples:
- **[Simple branching menu](./EvMenu#example-simple-branching-menu)** - choose from options
- **[Dynamic goto](./EvMenu#example-dynamic-goto)** - jumping to different nodes based on response
- **[Set caller properties](./EvMenu#example-set-caller-properties)** - a menu that changes things
- **[Getting arbitrary input](./EvMenu#example-get-arbitrary-input)** - entering text
- **[Storing data between nodes](./EvMenu#example-storing-data-between-nodes)** - keeping states and
- **[Simple branching menu](./EvMenu.md#example-simple-branching-menu)** - choose from options
- **[Dynamic goto](./EvMenu.md#example-dynamic-goto)** - jumping to different nodes based on response
- **[Set caller properties](./EvMenu.md#example-set-caller-properties)** - a menu that changes things
- **[Getting arbitrary input](./EvMenu.md#example-get-arbitrary-input)** - entering text
- **[Storing data between nodes](./EvMenu.md#example-storing-data-between-nodes)** - keeping states and
information while in the menu
- **[Repeating the same node](./EvMenu#example-repeating-the-same-node)** - validating within the node
- **[Repeating the same node](./EvMenu.md#example-repeating-the-same-node)** - validating within the node
before moving to the next
- **[Yes/No prompt](./EvMenu#example-yesno-prompt)** - entering text with limited possible responses
- **[Yes/No prompt](./EvMenu.md#example-yesno-prompt)** - entering text with limited possible responses
(this is *not* using EvMenu but the conceptually similar yet technically unrelated `get_input`
helper function accessed as `evennia.utils.evmenu.get_input`).
@ -817,7 +817,7 @@ def enter_guild:
This simple callable goto will analyse what happens depending on who the `caller` is. The
`enter_guild` node will give you a choice of what to say to the guard. If you try to enter, you will
end up in different nodes depending on (in this example) if you have the right [Tag](./Tags) set on
end up in different nodes depending on (in this example) if you have the right [Tag](./Tags.md) set on
yourself or not. Note that since we don't include any 'key's in the option dictionary, you will just
get to pick between numbers.
@ -1115,7 +1115,7 @@ function - for example you can't use other Python keywords like `if` inside the
Unless you are dealing with a relatively simple dynamic menu, defining menus with lambda's is
probably more work than it's worth: You can create dynamic menus by instead making each node
function more clever. See the [NPC shop tutorial](./NPC-shop-Tutorial) for an example of this.
function more clever. See the [NPC shop tutorial](./NPC-shop-Tutorial.md) for an example of this.
## Ask for simple input
@ -1216,7 +1216,7 @@ return True from the callback to repeat the prompt until you pass whatever check
> Note: You *cannot* link consecutive questions by putting a new `get_input` call inside the
> callback. If you want that you should use an EvMenu instead (see the [Repeating the same
> node](EvMenu#example-repeating-the-same-node) example above). Otherwise you can either peek at the
> node](./EvMenu.md#example-repeating-the-same-node) example above). Otherwise you can either peek at the
> implementation of `get_input` and implement your own mechanism (it's just using cmdset nesting) or
> you can look at [this extension suggested on the mailing
> list](https://groups.google.com/forum/#!category-topic/evennia/evennia-questions/16pi0SfMO5U).
@ -1304,8 +1304,8 @@ auto-created by the `list_node` decorator.
## Assorted notes
The EvMenu is implemented using [Commands](./Commands). When you start a new EvMenu, the user of the
menu will be assigned a [CmdSet](./Command-Sets) with the commands they need to navigate the menu.
The EvMenu is implemented using [Commands](./Commands.md). When you start a new EvMenu, the user of the
menu will be assigned a [CmdSet](./Command-Sets.md) with the commands they need to navigate the menu.
This means that if you were to, from inside the menu, assign a new command set to the caller, *you
may override the Menu Cmdset and kill the menu*. If you want to assign cmdsets to the caller as part
of the menu, you should store the cmdset on `caller.ndb._menutree` and wait to actually assign it

View file

@ -16,7 +16,7 @@ from evennia.utils import evmore
evmore.msg(receiver, long_text)
```
Where receiver is an [Object](./Objects) or a [Account](./Accounts). If the text is longer than the
Where receiver is an [Object](./Objects.md) or a [Account](./Accounts.md). If the text is longer than the
client's screen height (as determined by the NAWS handshake or by `settings.CLIENT_DEFAULT_HEIGHT`)
the pager will show up, something like this:

View file

@ -1,19 +1,19 @@
# API Summary
[evennia](api:evennia) - library root
- [evennia.accounts](api:evennia.accounts) - the out-of-character entities representing players
- [evennia.commands](api:evennia.commands) - handle all inputs. Also includes default commands
- [evennia.comms](api:evennia.comms) - in-game channels and messaging
- [evennia.contrib](api:evennia.contrib) - game-specific tools and code contributed by the community
- [evennia.help](api:evennia.help) - in-game help system
- [evennia.locks](api:evennia.locks) - limiting access to various systems and resources
- [evennia.objects](api:evennia.objects) - all in-game entities, like Rooms, Characters, Exits etc
- [evennia.prototypes](api:evennia.prototypes) - customize entities using dicts
- [evennia.scripts](api:evennia.scripts) - all out-of-character game objects
- [evennia.server](api:evennia.server) - core Server and Portal programs, also network protocols
- [evennia.typeclasses](api:evennia.typeclasses) - core database-python bridge
- [evennia.utils](api:evennia.utils) - lots of useful coding tools and utilities
- [evennia.web](api:evennia.web) - webclient, website and other web resources
[evennia](evennia) - library root
- [evennia.accounts](evennia.accounts) - the out-of-character entities representing players
- [evennia.commands](evennia.commands) - handle all inputs. Also includes default commands
- [evennia.comms](evennia.comms) - in-game channels and messaging
- [evennia.contrib](evennia.contrib) - game-specific tools and code contributed by the community
- [evennia.help](evennia.help) - in-game help system
- [evennia.locks](evennia.locks) - limiting access to various systems and resources
- [evennia.objects](evennia.objects) - all in-game entities, like Rooms, Characters, Exits etc
- [evennia.prototypes](evennia.prototypes) - customize entities using dicts
- [evennia.scripts](evennia.scripts) - all out-of-character game objects
- [evennia.server](evennia.server) - core Server and Portal programs, also network protocols
- [evennia.typeclasses](evennia.typeclasses) - core database-python bridge
- [evennia.utils](evennia.utils) - lots of useful coding tools and utilities
- [evennia.web](evennia.web) - webclient, website and other web resources
## Shortcuts
@ -28,70 +28,70 @@ The flat API is defined in `__init__.py` [viewable here](github:evennia/__init__
### Search functions
- [evennia.search_account](api:evennia.utils.search#evennia.utils.search.search_account)
- [evennia.search_object](api:evennia.utils.search#evennia.utils.search.search_object)
- [evennia.search_object_by_tag](api:evennia.utils.search#evennia.utils.search_object_by_tag)
- [evennia.search_script](api:evennia.utils.search#evennia.utils.search_script)
- [evennia.search_channel](api:evennia.utils.search#evennia.utils.search_channel)
- [evennia.search_message](api:evennia.utils.search#evennia.utils.search_message)
- [evennia.search_help](api:evennia.utils.search#evennia.utils.search.search_help)
- [evennia.search_account](evennia.utils.search.search_account)
- [evennia.search_object](evennia.utils.search.search_object)
- [evennia.search_object_by_tag](evennia.utils.search.search_tag)
- [evennia.search_script](evennia.utils.search.search_script)
- [evennia.search_channel](evennia.utils.search.search_channel)
- [evennia.search_message](evennia.utils.search.search_message)
- [evennia.search_help](evennia.utils.search.search_help_entry)
### Create functions
- [evennia.create_account](api:evennia.utils.create#evennia.utils.create.create_account)
- [evennia.create_object](api:evennia.utils.create#evennia.utils.create.create_object)
- [evennia.create_script](api:evennia.utils.create#evennia.utils.create.create_script)
- [evennia.create_channel](api:evennia.utils.create#evennia.utils.create.create_channel)
- [evennia.create_help_entry](api:evennia.utils.create#evennia.utils.create.create_help_entry)
- [evennia.create_message](api:evennia.utils.create#evennia.utils.create.create_message)
- [evennia.create_account](evennia.utils.create.create_account)
- [evennia.create_object](evennia.utils.create.create_object)
- [evennia.create_script](evennia.utils.create.create_script)
- [evennia.create_channel](evennia.utils.create.create_channel)
- [evennia.create_help_entry](evennia.utils.create.create_help_entry)
- [evennia.create_message](evennia.utils.create.create_message)
### Typeclasses
- [evennia.Defaultaccount](api:evennia.accounts.accounts#evennia.accounts.accounts.DefaultAccount) - player account class ([docs](./Accounts))
- [evennia.DefaultGuest](api:evennia.accounts.accounts#evennia.accounts.accounts.DefaultGuest) - base guest account class
- [evennia.DefaultObject](api:evennia.objects.objects#evennia.objects.objects.DefaultObject) - base class for all objects ([docs](./Objects))
- [evennia.DefaultCharacter](api:evennia.objects.objects#evennia.objects.objects.DefaultCharacter) - base class for in-game characters ([docs](./Objects#Character))
- [evennia.DefaultRoom](api:evennia.objects.objects#evennia.objects.objects.DefaultRoom) - base class for rooms ([docs](./Objects#Room))
- [evennia.DefaultExit](api:evennia.objects.objects#evennia.objects.objects.DefaultExit) - base class for exits ([docs](./Objects#Exit))
- [evennia.DefaultScript](api:evennia.scripts.scripts#evennia.scripts.scripts.DefaultScript) - base class for OOC-objects ([docs](./Scripts))
- [evennia.DefaultChannel](api:evennia.comms.comms#evennia.comms.comms.DefaultChannel) - base class for in-game channels ([docs](./Communications))
- [evennia.Defaultaccount](evennia.accounts.accounts.DefaultAccount) - player account class ([docs](./Accounts.md))
- [evennia.DefaultGuest](evennia.accounts.accounts.DefaultGuest) - base guest account class
- [evennia.DefaultObject](evennia.objects.objects.DefaultObject) - base class for all objects ([docs](./Objects.md))
- [evennia.DefaultCharacter](evennia.objects.objects.DefaultCharacter) - base class for in-game characters ([docs](./Objects.md#characters))
- [evennia.DefaultRoom](evennia.objects.objects.DefaultRoom) - base class for rooms ([docs](./Objects.md#rooms))
- [evennia.DefaultExit](evennia.objects.objects.DefaultExit) - base class for exits ([docs](./Objects.md#exits))
- [evennia.DefaultScript](evennia.scripts.scripts.DefaultScript) - base class for OOC-objects ([docs](./Scripts.md))
- [evennia.DefaultChannel](evennia.comms.comms.DefaultChannel) - base class for in-game channels ([docs](./Communications.md))
### Commands
- [evennia.Command](api:evennia.commands.command#evennia.commands.command.Command) - base [Command](./Commands) class. See also `evennia.default_cmds.MuxCommand`
- [evennia.CmdSet](api:evennia.commands.cmdset#evennia.commands.cmdset.CmdSet) - base [Cmdset](./Command-Sets) class
- evennia.default_cmds - access to all [default command classes](api:evennia.commands.default) as properties
- evennia.syscmdkeys - access to all [system command](./Commands#system-commands) names as properties
- [evennia.Command](evennia.commands.command.Command) - base [Command](./Commands.md) class. See also `evennia.default_cmds.MuxCommand`
- [evennia.CmdSet](evennia.commands.cmdset.CmdSet) - base [Cmdset](./Command-Sets.md) class
- evennia.default_cmds - access to all [default command classes](evennia.commands.default) as properties
- evennia.syscmdkeys - access to all [system command](./Commands.md#system-commands) names as properties
### Utilities
- [evennia.utils.utils](api:evennia.utils.utils) - mixed useful utilities
- [evennia.gametime](api:evennia.utils.gametime) - server run- and game time ([docs](./Coding-Utils#gametime))
- [evennia.logger](api:evennia.utils.logger) - logging tools
- [evennia.ansi](api:evennia.utils.ansi) - ansi coloring tools
- [evennia.spawn](api:evennia.prototypes.spawner#evennia.prototypes.spawner.Spawn) - spawn/prototype system ([docs](./Spawner-and-Prototypes))
- [evennia.lockfuncs](api:evennia.locks.lockfuncs) - default lock functions for access control ([docs](./Locks))
- [evennia.EvMenu](api:evennia.utils.evmenu#evennia.utils.evmenu.EvMenu) - menu system ([docs](./EvMenu))
- [evennia.EvTable](api:evennia.utils.evtable#evennia.utils.evtable.EvTable) - text table creater
- [evennia.EvForm](api:evennia.utils.evform#evennia.utils.evform.EvForm) - text form creator
- [evennia.EvEditor](api:evennia.utils.eveditor#evennia.utils.eveditor.EvEditor) - in game text line editor ([docs](./EvEditor))
- [evennia.utils.utils](evennia.utils.utils) - mixed useful utilities
- [evennia.gametime](evennia.utils.gametime) - server run- and game time ([docs](./Coding-Utils.md#game-time))
- [evennia.logger](evennia.utils.logger) - logging tools
- [evennia.ansi](evennia.utils.ansi) - ansi coloring tools
- [evennia.spawn](evennia.prototypes.spawner.spawn) - spawn/prototype system ([docs](./Spawner-and-Prototypes.md))
- [evennia.lockfuncs](evennia.locks.lockfuncs) - default lock functions for access control ([docs](./Locks.md))
- [evennia.EvMenu](evennia.utils.evmenu.EvMenu) - menu system ([docs](./EvMenu.md))
- [evennia.EvTable](evennia.utils.evtable.EvTable) - text table creater
- [evennia.EvForm](evennia.utils.evform.EvForm) - text form creator
- [evennia.EvEditor](evennia.utils.eveditor.EvEditor) - in game text line editor ([docs](./EvEditor.md))
### Global singleton handlers
- [evennia.TICKER_HANDLER](api:evennia.scripts.tickerhandler) - allow objects subscribe to tickers ([docs](./TickerHandler))
- [evennia.MONITOR_HANDLER](api:evennia.scripts.monitorhandler) - monitor changes ([docs](./MonitorHandler))
- [evennia.CHANNEL_HANDLER](api:evennia.comms.channelhandler) - maintains channels
- [evennia.SESSION_HANDLER](api:evennia.server.sessionhandler) - manages all sessions
- [evennia.TICKER_HANDLER](evennia.scripts.tickerhandler) - allow objects subscribe to tickers ([docs](./TickerHandler.md))
- [evennia.MONITOR_HANDLER](evennia.scripts.monitorhandler) - monitor changes ([docs](./MonitorHandler.md))
- [evennia.CHANNEL_HANDLER](evennia.comms.channelhandler) - maintains channels
- [evennia.SESSION_HANDLER](evennia.server.sessionhandler) - manages all sessions
### Database core models (for more advanced lookups)
- [evennia.ObjectDB](api:evennia.objects.models#evennia.objects.models.ObjectDB)
- [evennia.accountDB](api:evennia.accounts.models#evennia.accounts.models.AccountDB)
- [evennia.ScriptDB](api:evennia.scripts.models#evennia.scripts.models.ScriptDB)
- [evennia.ChannelDB](api:evennia.comms.models#evennia.comms.models.ChannelDB)
- [evennia.Msg](api:evennia.comms.models#evennia.comms.models.Msg)
- [evennia.ObjectDB](evennia.objects.models.ObjectDB)
- [evennia.accountDB](evennia.accounts.models.AccountDB)
- [evennia.ScriptDB](evennia.scripts.models.ScriptDB)
- [evennia.ChannelDB](evennia.comms.models.ChannelDB)
- [evennia.Msg](evennia.comms.models.Msg)
- evennia.managers - contains shortcuts to all database managers
### Contributions
- [evennia.contrib](api:evennia.contrib) - game-specific contributions and plugins ([README](github:evennia/contrib/README.md))
- [evennia.contrib](evennia.contrib) - game-specific contributions and plugins ([README](github:evennia/contrib/README.md))

View file

@ -35,7 +35,7 @@ implementations indeed.
The server ships with a default set of player commands that are similar to the MUX command set. We
*do not* aim specifically to be a MUX server, but we had to pick some default to go with (see
[this](./Soft-Code) for more about our original motivations). It's easy to remove or add commands, or
[this](./Soft-Code.md) for more about our original motivations). It's easy to remove or add commands, or
to have the command syntax mimic other systems, like Diku, LP, MOO and so on. Or why not create a
new and better command system of your own design.
@ -43,11 +43,11 @@ new and better command system of your own design.
Evennia's demo server can be found at [demo.evennia.com](http://demo.evennia.com). If you prefer to
connect to the demo via your own telnet client you can do so at `silvren.com`, port `4280`. Here is
a [screenshot](./Screenshot).
a [screenshot](./Screenshot.md).
Once you installed Evennia yourself it comes with its own tutorial - this shows off some of the
possibilities _and_ gives you a small single-player quest to play. The tutorial takes only one
single in-game command to install as explained [here](./Tutorial-World-Introduction).
single in-game command to install as explained [here](./Tutorial-World-Introduction.md).
## Brief summary of features
@ -100,11 +100,11 @@ generation and more
- RSS feeds can be echoed to in-game channels (things like Twitter can easily be added)
- Several different databases supported (SQLite3, MySQL, PostgreSQL, ...)
For more extensive feature information, see the [Developer Central](./Developer-Central).
For more extensive feature information, see the [Developer Central](./Developer-Central.md).
## What you need to know to work with Evennia
Assuming you have Evennia working (see the [quick start instructions](./Getting-Started)) and have
Assuming you have Evennia working (see the [quick start instructions](./Getting-Started.md)) and have
gotten as far as to start the server and connect to it with the client of your choice, here's what
you need to know depending on your skills and needs.
@ -119,13 +119,13 @@ very basic game indeed if you are not willing to do at least *some* coding.
### I know basic Python, or I am willing to learn
Evennia's source code is extensively documented and is [viewable online](https://github.com/evennia/evennia).
We also have a comprehensive [online manual](https://github.com/evennia/evennia/wiki) with lots of examples.
We also have a comprehensive [online manual](https://www/evennia/com/docs) with lots of examples.
But while Python is
considered a very easy programming language to get into, you do have a learning curve to climb if
you are new to programming. You should probably sit down
with a Python beginner's [tutorial](http://docs.python.org/tutorial/) (there are plenty of them on
the web if you look around) so you at least know what you are seeing. See also our
[link page](./Links#wiki-litterature) for some reading suggestions. To efficiently code your dream game in
[link page](./Links.md) for some reading suggestions. To efficiently code your dream game in
Evennia you don't need to be a Python guru, but you do need to be able to read example code
containing at least these basic Python features:
@ -140,8 +140,8 @@ containing at least these basic Python features:
[Classes](http://docs.python.org/tutorial/classes.html), their methods and properties
Obviously, the more things you feel comfortable with, the easier time you'll have to find your way.
With just basic knowledge you should be able to define your own [Commands](./Commands), create custom
[Objects](./Objects) as well as make your world come alive with basic [Scripts](./Scripts). You can
With just basic knowledge you should be able to define your own [Commands](./Commands.md), create custom
[Objects](./Objects.md) as well as make your world come alive with basic [Scripts](./Scripts.md). You can
definitely build a whole advanced and customized game from extending Evennia's examples only.
### I know my Python stuff and I am willing to use it!
@ -158,8 +158,8 @@ presence (a website and a mud web client) to play around with ...
### Where to from here?
From here you can continue browsing the [online documentation](./index) to
find more info about Evennia. Or you can jump into the [Tutorials](./Tutorials) and get your hands
From here you can continue browsing the [online documentation](./index.md) to
find more info about Evennia. Or you can jump into the [Tutorials](./Tutorials.md) and get your hands
dirty with code right away. You can also read the developer's [dev blog](https://evennia.blogspot.com/) for many tidbits and snippets about Evennia's development and
structure.
@ -170,9 +170,9 @@ highly recommended you hop onto our [Developer chat](http://webchat.freenode.net
on IRC. This allows you to chat directly with other developers new and old as well as with the devs
of Evennia itself. This chat is logged (you can find links on http://www.evennia.com) and can also
be searched from the same place for discussion topics you are interested in.
2. Read the [Game Planning](./Game-Planning) wiki page. It gives some ideas for your work flow and the
2. Read the [Game Planning](./Game-Planning.md) wiki page. It gives some ideas for your work flow and the
state of mind you should aim for - including cutting down the scope of your game for its first
release.
3. Do the [Tutorial for basic MUSH-like game](./Tutorial-for-basic-MUSH-like-game) carefully from
3. Do the [Tutorial for basic MUSH-like game](./Tutorial-for-basic-MUSH-like-game.md) carefully from
beginning to end and try to understand what does what. Even if you are not interested in a MUSH for
your own game, you will end up with a small (very small) game that you can build or learn from.

View file

@ -38,7 +38,7 @@ to use. So the *Player* usually operates by making use of the tools prepared for
For a *Player*, collaborating on a game need not be too different between MUSH and Evennia. The
building and description of the game world can still happen mostly in-game using build commands,
using text tags and [inline functions](./TextTags#inline-functions) to prettify and customize the
using text tags and [inline functions](./TextTags.md#inline-functions) to prettify and customize the
experience. Evennia offers external ways to build a world but those are optional. There is also
nothing *in principle* stopping a Developer from offering a softcode-like language to Players if
that is deemed necessary.
@ -89,7 +89,7 @@ based inheritance of MUSH.
There are other differences for sure, but that should give some feel for things. Enough with the
theory. Let's get down to more practical matters next. To install, see the
[Getting Started instructions](./Getting-Started).
[Getting Started instructions](./Getting-Started.md).
## A first step making things more familiar
@ -203,15 +203,15 @@ developer changing the underlying Python code.
## Next steps
If you are a *Developer* and are interested in making a more MUSH-like Evennia game, a good start is
to look into the Evennia [Tutorial for a first MUSH-like game](./Tutorial-for-basic-MUSH-like-game).
to look into the Evennia [Tutorial for a first MUSH-like game](./Tutorial-for-basic-MUSH-like-game.md).
That steps through building a simple little game from scratch and helps to acquaint you with the
various corners of Evennia. There is also the [Tutorial for running roleplaying sessions](./Evennia-for-roleplaying-sessions) that can be of interest.
various corners of Evennia. There is also the [Tutorial for running roleplaying sessions](./Evennia-for-roleplaying-sessions.md) that can be of interest.
An important aspect of making things more familiar for *Players* is adding new and tweaking existing
commands. How this is done is covered by the [Tutorial on adding new commands](./Adding-Command-Tutorial). You may also find it useful to shop through the `evennia/contrib/` folder. The [Tutorial
world](Tutorial-World-Introduction) is a small single-player quest you can try (its not very MUSH-
commands. How this is done is covered by the [Tutorial on adding new commands](./Adding-Command-Tutorial.md). You may also find it useful to shop through the `evennia/contrib/` folder. The [Tutorial
world](./Tutorial-World-Introduction.md) is a small single-player quest you can try (its not very MUSH-
like but it does show many Evennia concepts in action). Beyond that there are [many more
tutorials](Tutorials) to try out. If you feel you want a more visual overview you can also look at
tutorials](./Tutorials.md) to try out. If you feel you want a more visual overview you can also look at
[Evennia in pictures](https://evennia.blogspot.se/2016/05/evennia-in-pictures.html).
… And of course, if you need further help you can always drop into the [Evennia chatroom](http://webchat.freenode.net/?channels=evennia&uio=MT1mYWxzZSY5PXRydWUmMTE9MTk1JjEyPXRydWUbb) or post a

View file

@ -27,7 +27,7 @@ defaults for our particular use-case. Below we will flesh out these components f
## Starting out
We will assume you start from scratch. You need Evennia installed, as per the [Getting
Started](Getting-Started) instructions. Initialize a new game directory with `evennia init
Started](./Getting-Started.md) instructions. Initialize a new game directory with `evennia init
<gamedirname>`. In this tutorial we assume your game dir is simply named `mygame`. You can use the
default database and keep all other settings to default for now. Familiarize yourself with the
`mygame` folder before continuing. You might want to browse the [First Steps Coding](First-Steps-
@ -44,7 +44,7 @@ to show your renewed GM status to the other accounts.
### The permission hierarchy
Evennia has the following [permission hierarchy](./Building-Permissions#assigning-permissions) out of
Evennia has the following [permission hierarchy](./Building-Permissions.md#assigning-permissions) out of
the box: *Players, Helpers, Builders, Admins* and finally *Developers*. We could change these but
then we'd need to update our Default commands to use the changes. We want to keep this simple, so
instead we map our different roles on top of this permission ladder.
@ -60,7 +60,7 @@ everyone.
5. `Developers`-level permission are the server administrators, the ones with the ability to
restart/shutdown the server as well as changing the permission levels.
> The [superuser](./Building-Permissions#the-super-user) is not part of the hierarchy and actually
> The [superuser](./Building-Permissions.md#the-super-user) is not part of the hierarchy and actually
completely bypasses it. We'll assume server admin(s) will "just" be Developers.
### How to grant permissions
@ -102,7 +102,7 @@ its name will have the string`(GM)` added to the end.
#### Character modification
Let's first start by customizing the Character. We recommend you browse the beginning of the
[Account](./Accounts) page to make sure you know how Evennia differentiates between the OOC "Account
[Account](./Accounts.md) page to make sure you know how Evennia differentiates between the OOC "Account
objects" (not to be confused with the `Accounts` permission, which is just a string specifying your
access) and the IC "Character objects".
@ -142,7 +142,7 @@ Above, we change how the Character's name is displayed: If the account controlli
a GM, we attach the string `(GM)` to the Character's name so everyone can tell who's the boss. If we
ourselves are Developers or GM's we will see database ids attached to Characters names, which can
help if doing database searches against Characters of exactly the same name. We base the "gm-
ingness" on having an flag (an [Attribute](./Attributes)) named `is_gm`. We'll make sure new GM's
ingness" on having an flag (an [Attribute](./Attributes.md)) named `is_gm`. We'll make sure new GM's
actually get this flag below.
> **Extra exercise:** This will only show the `(GM)` text on *Characters* puppeted by a GM account,
@ -152,7 +152,7 @@ that is, it will show only to those in the same location. If we wanted it to als
#### New @gm/@ungm command
We will describe in some detail how to create and add an Evennia [command](./Commands) here with the
We will describe in some detail how to create and add an Evennia [command](./Commands.md) here with the
hope that we don't need to be as detailed when adding commands in the future. We will build on
Evennia's default "mux-like" commands here.
@ -267,7 +267,7 @@ We will here show two examples using the *EvTable* and *EvForm* utilities.Later
Commands to edit and display the output from those utilities.
> Note that due to the limitations of the wiki, no color is used in any of the examples. See [the
text tag documentation](TextTags) for how to add color to the tables and forms.
text tag documentation](./TextTags.md) for how to add color to the tables and forms.
#### Making a sheet with EvTable
@ -687,7 +687,7 @@ implemented.
Evennia comes with rooms out of the box, so no extra work needed. A GM will automatically have all
needed building commands available. A fuller go-through is found in the [Building
tutorial](Building-Quickstart). Here are some useful highlights:
tutorial](./Building-Quickstart.md). Here are some useful highlights:
* `@dig roomname;alias = exit_there;alias, exit_back;alias` - this is the basic command for digging
a new room. You can specify any exit-names and just enter the name of that exit to go there.
@ -704,7 +704,7 @@ access after the fact.
## Channels
Evennia comes with [Channels](./Communications#Channels) in-built and they are described fully in the
Evennia comes with [Channels](./Communications.md#channels) in-built and they are described fully in the
documentation. For brevity, here are the relevant commands for normal use:
* `@ccreate new_channel;alias;alias = short description` - Creates a new channel.

View file

@ -16,11 +16,11 @@ system.
- **self** / **me** - the calling object (i.e. you)
- **here** - the current caller's location
- **obj** - a dummy [Object](./Objects) instance
- **evennia** - Evennia's [flat API](./Evennia-API) - through this you can access all of Evennia.
- **obj** - a dummy [Object](./Objects.md) instance
- **evennia** - Evennia's [flat API](./Evennia-API.md) - through this you can access all of Evennia.
For accessing other objects in the same room you need to use `self.search(name)`. For objects in
other locations, use one of the `evennia.search_*` methods. See [below](./Execute-Python-Code#finding-
other locations, use one of the `evennia.search_*` methods. See [below](./Execute-Python-Code.md#finding-
objects).
## Returning output
@ -46,7 +46,7 @@ string behind the scenes for you). But for *lists* and *tuples* you will be conf
if you don't wrap them in `str()`: only the first item of the iterable will be returned. This is
because doing `msg(text)` is actually just a convenience shortcut; the full argument that `msg`
accepts is something called an *outputfunc* on the form `(cmdname, (args), {kwargs})` (see [the
message path](Messagepath) for more info). Sending a list/tuple confuses Evennia to think you are
message path](./Messagepath.md) for more info). Sending a list/tuple confuses Evennia to think you are
sending such a structure. Converting it to a string however makes it clear it should just be
displayed as-is.
@ -117,4 +117,4 @@ of other editing features, such as tab-completion and `__doc__`-string reading.
In [2]: evennia.managers.objects.all()
Out[3]: [<ObjectDB: Harry>, <ObjectDB: Limbo>, ...]
See the page about the [Evennia-API](./Evennia-API) for more things to explore.
See the page about the [Evennia-API](./Evennia-API.md) for more things to explore.

View file

@ -6,11 +6,11 @@ you can modify and overload the defaults easily. You should only need to do thes
also walks through you making your first few tweaks.
Before continuing, make sure you have Evennia installed and running by following the [Getting
Started](Getting-Started) instructions. You should have initialized a new game folder with the
Started](./Getting-Started.md) instructions. You should have initialized a new game folder with the
`evennia --init foldername` command. We will in the following assume this folder is called
"mygame".
It might be a good idea to eye through the brief [Coding Introduction](./Coding-Introduction) too
It might be a good idea to eye through the brief [Coding Introduction](./Coding-Introduction.md) too
(especially the recommendations in the section about the evennia "flat" API and about using `evennia
shell` will help you here and in the future).
@ -23,7 +23,7 @@ editors. We will assume these things are already familiar to you henceforth.
## Your First Changes
Below are some first things to try with your new custom modules. You can test these to get a feel
for the system. See also [Tutorials](./Tutorials) for more step-by-step help and special cases.
for the system. See also [Tutorials](./Tutorials.md) for more step-by-step help and special cases.
### Tweak Default Character
@ -57,13 +57,13 @@ up with a new command to view those attributes.
return self.db.strength, self.db.agility, self.db.magic
```
1. [Reload](./Start-Stop-Reload) the server (you will still be connected to the game after doing
1. [Reload](./Start-Stop-Reload.md) the server (you will still be connected to the game after doing
this). Note that if you examine *yourself* you will *not* see any new Attributes appear yet. Read
the next section to understand why.
#### Updating Yourself
It's important to note that the new [Attributes](./Attributes) we added above will only be stored on
It's important to note that the new [Attributes](./Attributes.md) we added above will only be stored on
*newly* created characters. The reason for this is simple: The `at_object_creation` method, where we
added those Attributes, is per definition only called when the object is *first created*, then never
again. This is usually a good thing since those Attributes may change over time - calling that hook
@ -112,8 +112,8 @@ what the `@update` command does under the hood). From in-game you can do the sam
MyClass.objects.all()]
```
See the [Object Typeclass tutorial](./Adding-Object-Typeclass-Tutorial) for more help and the
[Typeclasses](./Typeclasses) and [Attributes](./Attributes) page for detailed documentation about
See the [Object Typeclass tutorial](./Adding-Object-Typeclass-Tutorial.md) for more help and the
[Typeclasses](./Typeclasses.md) and [Attributes](./Attributes.md) page for detailed documentation about
Typeclasses and Attributes.
#### Troubleshooting: Updating Yourself
@ -159,7 +159,7 @@ tracebacks and you'll be able to resolve the vast majority of common errors easi
### Add a New Default Command
The `@py` command used above is only available to privileged users. We want any player to be able to
see their stats. Let's add a new [command](./Commands) to list the abilities we added in the previous
see their stats. Let's add a new [command](./Commands.md) to list the abilities we added in the previous
section.
1. Open `mygame/commands/command.py`. You could in principle put your command anywhere but this
@ -201,7 +201,7 @@ the bottom of this file:
self.add(CmdAbilities())
```
1. [Reload](./Start-Stop-Reload) the server (noone will be disconnected by doing this).
1. [Reload](./Start-Stop-Reload.md) the server (noone will be disconnected by doing this).
You (and anyone else) should now be able to use `abilities` (or its alias `abi`) as part of your
normal commands in-game:
@ -211,8 +211,8 @@ abilities
STR: 5, AGI: 4, MAG: 2
```
See the [Adding a Command tutorial](./Adding-Command-Tutorial) for more examples and the
[Commands](./Commands) section for detailed documentation about the Command system.
See the [Adding a Command tutorial](./Adding-Command-Tutorial.md) for more examples and the
[Commands](./Commands.md) section for detailed documentation about the Command system.
### Make a New Type of Object
@ -263,7 +263,7 @@ functionality. Here is an example of how the file could look:
1. Check your code for bugs. Tracebacks will appear on your command line or log. If you have a grave
Syntax Error in your code, the source file itself will fail to load which can cause issues with the
entire cmdset. If so, fix your bug and [reload the server from the command line](./Start-Stop-Reload)
entire cmdset. If so, fix your bug and [reload the server from the command line](./Start-Stop-Reload.md)
(noone will be disconnected by doing this).
1. Use `@create/drop stone:wiseobject.WiseObject` to create a talkative stone. If the `@create`
command spits out a warning or cannot find the typeclass (it will tell you which paths it searched),
@ -271,7 +271,7 @@ re-check your code for bugs and that you gave the correct path. The `@create` co
for Typeclasses in `mygame/typeclasses/`.
1. Use `look stone` to test. You will see the default description ("You see nothing special")
followed by a random message of stony wisdom. Use `@desc stone = This is a wise old stone.` to make
it look nicer. See the [Builder Docs](./Builder-Docs) for more information.
it look nicer. See the [Builder Docs](./Builder-Docs.md) for more information.
Note that `at_object_creation` is only called once, when the stone is first created. If you make
changes to this method later, already existing stones will not see those changes. As with the
@ -284,8 +284,8 @@ automatically to all existing objects.
## Where to Go From Here?
There are more [Tutorials](./Tutorials), including one for building a [whole little MUSH-like
game](Tutorial-for-basic-MUSH-like-game) - that is instructive also if you have no interest in
There are more [Tutorials](./Tutorials.md), including one for building a [whole little MUSH-like
game](./Tutorial-for-basic-MUSH-like-game.md) - that is instructive also if you have no interest in
MUSHes per se. A good idea is to also get onto the [IRC
chat](http://webchat.freenode.net/?channels=evennia) and the [mailing
list](https://groups.google.com/forum/#!forum/evennia) to get in touch with the community and other

View file

@ -121,18 +121,18 @@ gloss over this bit and jump directly to **World Building**. Vice versa, many "g
tend to jump directly to this part without doing the **Planning** first. Neither way is good and
*will* lead to you having to redo all your hard work at least once, probably more.
Evennia's [Developer Central](./Developer-Central) tries to help you with this bit of development. We
also have a slew of [Tutorials](./Tutorials) with worked examples. Evennia tries hard to make this
Evennia's [Developer Central](./Developer-Central.md) tries to help you with this bit of development. We
also have a slew of [Tutorials](./Tutorials.md) with worked examples. Evennia tries hard to make this
part easier for you, but there is no way around the fact that if you want anything but a very basic
Talker-type game you *will* have to bite the bullet and code your game (or find a coder willing to
do it for you).
Even if you won't code anything yourself, as a designer you need to at least understand the basic
paradigms of Evennia, such as [Objects](./Objects), [Commands](./Commands) and [Scripts](./Scripts) and
paradigms of Evennia, such as [Objects](./Objects.md), [Commands](./Commands.md) and [Scripts](./Scripts.md) and
how they hang together. We recommend you go through the [Tutorial World](Tutorial-World-
Introduction) in detail (as well as glancing at its code) to get at least a feel for what is
involved behind the scenes. You could also look through the tutorial for [building a game from
scratch](Tutorial-for-basic-MUSH-like-game).
scratch](./Tutorial-for-basic-MUSH-like-game.md).
During Coding you look back at the things you wanted during the **Planning** phase and try to
implement them. Don't be shy to update your plans if you find things easier/harder than you thought.
@ -140,7 +140,7 @@ The earlier you revise problems, the easier they will be to fix.
A good idea is to host your code online (publicly or privately) using version control. Not only will
this make it easy for multiple coders to collaborate (and have a bug-tracker etc), it also means
your work is backed up at all times. The [Version Control](./Version-Control) tutorial has
your work is backed up at all times. The [Version Control](./Version-Control.md) tutorial has
instructions for setting up a sane developer environment with proper version control.
### "Tech Demo" Building
@ -195,7 +195,7 @@ flag and let people try it! Call upon your alpha-players to try everything - the
to break your game in ways that you never could have imagined. In Alpha you might be best off to
focus on inviting friends and maybe other MUD developers, people who you can pester to give proper
feedback and bug reports (there *will* be bugs, there is no way around it). Follow the quick
instructions for [Online Setup](./Online-Setup) to make your game visible online. If you hadn't
instructions for [Online Setup](./Online-Setup.md) to make your game visible online. If you hadn't
already, make sure to put up your game on the [Evennia game index](http://games.evennia.com/) so
people know it's in the works (actually, even pre-alpha games are allowed in the index so don't be
shy)!

View file

@ -98,7 +98,7 @@ time, and assuming a standard calendar (see below for the same feature with a cu
instance, it can be used to have a specific message every (in-game) day at 6:00 AM showing how the
sun rises.
The function `schedule()` should be used here. It will create a [script](./Scripts) with some
The function `schedule()` should be used here. It will create a [script](./Scripts.md) with some
additional features to make sure the script is always executed when the game time matches the given
parameters.

View file

@ -7,15 +7,15 @@ This will help you download, install and start Evennia for the first time.
> test out Evennia. Apart from downloading and updating you don't even need an
> internet connection until you feel ready to share your game with the world.
- [Quick Start](./Getting-Started#quick-start)
- [Requirements](./Getting-Started#requirements)
- [Linux Install](./Getting-Started#linux-install)
- [Mac Install](./Getting-Started#mac-install)
- [Windows Install](./Getting-Started#windows-install)
- [Running in Docker](./Running-Evennia-in-Docker)
- [Where to Go Next](./Getting-Started#where-to-go-next)
- [Troubleshooting](./Getting-Started#troubleshooting)
- [Glossary of terms](./Glossary)
- [Quick Start](./Getting-Started.md#quick-start)
- [Requirements](./Getting-Started.md#requirements)
- [Linux Install](./Getting-Started.md#linux-install)
- [Mac Install](./Getting-Started.md#mac-install)
- [Windows Install](./Getting-Started.md#windows-install)
- [Running in Docker](./Running-Evennia-in-Docker.md)
- [Where to Go Next](./Getting-Started.md#where-to-go-next)
- [Troubleshooting](./Getting-Started.md#troubleshooting)
- [Glossary of terms](./Glossary.md)
## Quick Start
@ -37,7 +37,7 @@ Evennia should now be running and you can connect to it by pointing a web browse
`http://localhost:4001` or a MUD telnet client to `localhost:4000` (use `127.0.0.1` if your OS does
not recognize `localhost`).
We also release [Docker images](./Running-Evennia-in-Docker)
We also release [Docker images](./Running-Evennia-in-Docker.md)
based on `master` and `develop` branches.
## Requirements
@ -68,10 +68,10 @@ Twisted packages
## Linux Install
If you run into any issues during the installation and first start, please
check out [Linux Troubleshooting](./Getting-Started#linux-troubleshooting).
check out [Linux Troubleshooting](./Getting-Started.md#linux-troubleshooting).
For Debian-derived systems (like Ubuntu, Mint etc), start a terminal and
install the [dependencies](./Getting-Started#requirements):
install the [dependencies](./Getting-Started.md#requirements):
```
sudo apt-get update
@ -104,7 +104,7 @@ contains the source code though, it is not *installed* yet. To isolate the
Evennia install and its dependencies from the rest of the system, it is good
Python practice to install into a _virtualenv_. If you are unsure about what a
virtualenv is and why it's useful, see the [Glossary entry on
virtualenv](Glossary#virtualenv).
virtualenv](./Glossary.md#virtualenv).
Run `python -V` to see which version of Python your system defaults to.
@ -142,8 +142,8 @@ folders) and run
pip install -e evennia
```
For more info about `pip`, see the [Glossary entry on pip](./Glossary#pip). If
install failed with any issues, see [Linux Troubleshooting](./Getting-Started#linux-troubleshooting).
For more info about `pip`, see the [Glossary entry on pip](./Glossary.md#pip). If
install failed with any issues, see [Linux Troubleshooting](./Getting-Started.md#linux-troubleshooting).
Next we'll start our new game, here called "mygame". This will create yet
another new folder where you will be creating your new game:
@ -160,8 +160,8 @@ Your final folder structure should look like this:
mygame/
```
You can [configure Evennia](./Server-Conf#settings-file) extensively, for example
to use a [different database](./Choosing-An-SQL-Server). For now we'll just stick
You can [configure Evennia](./Server-Conf.md#settings-file) extensively, for example
to use a [different database](./Choosing-An-SQL-Server.md). For now we'll just stick
to the defaults though.
```
@ -175,7 +175,7 @@ evennia start # (create a superuser when asked. Email is optional.)
Your game should now be running! Open a web browser at `http://localhost:4001`
or point a telnet client to `localhost:4000` and log in with the user you
created. Check out [where to go next](./Getting-Started#where-to-go-next).
created. Check out [where to go next](./Getting-Started.md#where-to-go-next).
## Mac Install
@ -184,7 +184,7 @@ The Evennia server is a terminal program. Open the terminal e.g. from
*Applications->Utilities->Terminal*. [Here is an introduction to the Mac
terminal](http://blog.teamtreehouse.com/introduction-to-the-mac-os-x-command-line)
if you are unsure how it works. If you run into any issues during the
installation, please check out [Mac Troubleshooting](./Getting-Started#mac-troubleshooting).
installation, please check out [Mac Troubleshooting](./Getting-Started.md#mac-troubleshooting).
* Python should already be installed but you must make sure it's a high enough version.
([This](http://docs.python-guide.org/en/latest/starting/install/osx/) discusses
@ -215,7 +215,7 @@ A new folder `evennia` will appear containing the Evennia library. This only
contains the source code though, it is not *installed* yet. To isolate the
Evennia install and its dependencies from the rest of the system, it is good
Python practice to install into a _virtualenv_. If you are unsure about what a
virtualenv is and why it's useful, see the [Glossary entry on virtualenv](./Glossary#virtualenv).
virtualenv is and why it's useful, see the [Glossary entry on virtualenv](./Glossary.md#virtualenv).
Run `python -V` to check which Python your system defaults to.
@ -253,8 +253,8 @@ pip install --upgrade setuptools # Ditto concerning Mac issues.
pip install -e evennia
```
For more info about `pip`, see the [Glossary entry on pip](./Glossary#pip). If
install failed with any issues, see [Mac Troubleshooting](./Getting-Started#mac-troubleshooting).
For more info about `pip`, see the [Glossary entry on pip](./Glossary.md#pip). If
install failed with any issues, see [Mac Troubleshooting](./Getting-Started.md#mac-troubleshooting).
Next we'll start our new game. We'll call it "mygame" here. This creates a new
folder where you will be creating your new game:
@ -272,8 +272,8 @@ Your final folder structure should look like this:
mygame/
```
You can [configure Evennia](./Server-Conf#settings-file) extensively, for example
to use a [different database](./Choosing-An-SQL-Server). We'll go with the
You can [configure Evennia](./Server-Conf.md#settings-file) extensively, for example
to use a [different database](./Choosing-An-SQL-Server.md). We'll go with the
defaults here.
```
@ -287,13 +287,13 @@ evennia start # (create a superuser when asked. Email is optional.)
Your game should now be running! Open a web browser at `http://localhost:4001`
or point a telnet client to `localhost:4000` and log in with the user you
created. Check out [where to go next](./Getting-Started#where-to-go-next).
created. Check out [where to go next](./Getting-Started.md#where-to-go-next).
## Windows Install
If you run into any issues during the installation, please check out
[Windows Troubleshooting](./Getting-Started#windows-troubleshooting).
[Windows Troubleshooting](./Getting-Started.md#windows-troubleshooting).
> If you are running Windows10, consider using the Windows Subsystem for Linux
> ([WSL](https://en.wikipedia.org/wiki/Windows_Subsystem_for_Linux)) instead.
@ -348,7 +348,7 @@ A new folder `evennia` will appear containing the Evennia library. This only
contains the source code though, it is not *installed* yet. To isolate the
Evennia install and its dependencies from the rest of the system, it is good
Python practice to install into a _virtualenv_. If you are unsure about what a
virtualenv is and why it's useful, see the [Glossary entry on virtualenv](./Glossary#virtualenv).
virtualenv is and why it's useful, see the [Glossary entry on virtualenv](./Glossary.md#virtualenv).
In your console, try `python -V` to see which version of Python your system
defaults to.
@ -393,8 +393,8 @@ folders when you use the `dir` command) and run
```
pip install -e evennia
```
For more info about `pip`, see the [Glossary entry on pip](./Glossary#pip). If
the install failed with any issues, see [Windows Troubleshooting](./Getting-Started#windows-
For more info about `pip`, see the [Glossary entry on pip](./Glossary.md#pip). If
the install failed with any issues, see [Windows Troubleshooting](./Getting-Started.md#windows-
troubleshooting).
Next we'll start our new game, we'll call it "mygame" here. This creates a new folder where you will
be
@ -413,8 +413,8 @@ path\to\muddev
mygame\
```
You can [configure Evennia](./Server-Conf#settings-file) extensively, for example
to use a [different database](./Choosing-An-SQL-Server). We'll go with the
You can [configure Evennia](./Server-Conf.md#settings-file) extensively, for example
to use a [different database](./Choosing-An-SQL-Server.md). We'll go with the
defaults here.
```
@ -428,7 +428,7 @@ evennia start # (create a superuser when asked. Email is optional.)
Your game should now be running! Open a web browser at `http://localhost:4001`
or point a telnet client to `localhost:4000` and log in with the user you
created. Check out [where to go next](./Getting-Started#where-to-go-next).
created. Check out [where to go next](./Getting-Started.md#where-to-go-next).
## Where to Go Next
@ -438,7 +438,7 @@ logged in, stand in the `Limbo` room and run
@batchcommand tutorial_world.build
to build [Evennia's tutorial world](./Tutorial-World-Introduction) - it's a small solo quest to
to build [Evennia's tutorial world](./Tutorial-World-Introduction.md) - it's a small solo quest to
explore. Only run the instructed `@batchcommand` once. You'll get a lot of text scrolling by as the
tutorial is built. Once done, the `tutorial` exit will have appeared out of Limbo - just write
`tutorial` to enter it.
@ -446,10 +446,10 @@ tutorial is built. Once done, the `tutorial` exit will have appeared out of Limb
Once you get back to `Limbo` from the tutorial (if you get stuck in the tutorial quest you can do
`@tel #2` to jump to Limbo), a good idea is to learn how to [start, stop and reload](Start-Stop-
Reload) the Evennia server. You may also want to familiarize yourself with some [commonly used terms
in our Glossary](Glossary). After that, why not experiment with [creating some new items and build
some new rooms](Building-Quickstart) out from Limbo.
in our Glossary](./Glossary.md). After that, why not experiment with [creating some new items and build
some new rooms](./Building-Quickstart.md) out from Limbo.
From here on, you could move on to do one of our [introductory tutorials](./Tutorials) or simply dive
From here on, you could move on to do one of our [introductory tutorials](./Tutorials.md) or simply dive
headlong into Evennia's comprehensive [manual](https://github.com/evennia/evennia/wiki). While
Evennia has no major game systems out of the box, we do supply a range of optional *contribs* that
you can use or borrow from. They range from dice rolling and alternative color schemes to barter and
@ -463,7 +463,7 @@ forums](https://groups.google.com/forum/#%21forum/evennia). You can also join th
Server](https://discord.gg/NecFePw).
Finally, if you are itching to help out or support Evennia (awesome!) have an
issue to report or a feature to request, [see here](./How-To-Get-And-Give-Help).
issue to report or a feature to request, [see here](./How-To-Get-And-Give-Help.md).
Enjoy your stay!

View file

@ -3,92 +3,92 @@
This explains common recurring terms used in the Evennia docs. It will be expanded as needed.
- _[account](./Glossary#account)_ - the player's account on the game
- _[admin-site](./Glossary#admin-site)_ - the Django web page for manipulating the database
- _[attribute](./Glossary#attribute)_ - persistent, custom data stored on typeclasses
- _[channel](./Glossary#channel)_ - game communication channels
- _[character](./Glossary#character)_ - the player's avatar in the game, controlled from
_[account](./Glossary#account)_
- _[core](./Glossary#core)_ - a term used for the code distributed with Evennia proper
- _[django](./Glossary#django)_ - web framework Evennia uses for database access and web integration
- _[field](./Glossary#field)_ - a _[typeclass](./Glossary#typeclass)_ property representing a database
- _[account](./Glossary.md#account)_ - the player's account on the game
- _[admin-site](./Glossary.md#admin-site)_ - the Django web page for manipulating the database
- _[attribute](./Glossary.md#attribute)_ - persistent, custom data stored on typeclasses
- _[channel](./Glossary.md#channel)_ - game communication channels
- _[character](./Glossary.md#character)_ - the player's avatar in the game, controlled from
_[account](./Glossary.md#account)_
- _[core](./Glossary.md#core)_ - a term used for the code distributed with Evennia proper
- _[django](./Glossary.md#django)_ - web framework Evennia uses for database access and web integration
- _[field](./Glossary.md#field)_ - a _[typeclass](./Glossary.md#typeclass)_ property representing a database
column
- _[git](./Glossary#git)_ - the version-control system we use
- _[github](./Glossary#github)_ - the online hosting of our source code
- _[migrate](./Glossary#migrate)_ - updating the database schema
- _[git](./Glossary.md#git)_ - the version-control system we use
- _[github](./Glossary.md#github)_ - the online hosting of our source code
- _[migrate](./Glossary.md#migrate)_ - updating the database schema
- _[multisession mode`](#multisession-mode)_ - a setting defining how users connect to Evennia
- _[object](./Glossary#object)_ - Python instance, general term or in-game
_[typeclass](./Glossary#typeclass)_
- _[pip](./Glossary#pip)_ - the Python installer
- _[object](./Glossary.md#object)_ - Python instance, general term or in-game
_[typeclass](./Glossary.md#typeclass)_
- _[pip](./Glossary.md#pip)_ - the Python installer
- _player_ - the human connecting to the game with their client
- _[puppet](./Glossary#puppet)_ - when an [account](./Glossary#account) controls an in-game
[object](./Glossary#object)
- _[property](./Glossary#property)_ - a python property
- _evenv_ - see _[virtualenv](./Glossary#virtualenv)_
- _[repository](./Glossary#repository)_ - a store of source code + source history
- _[script](./Glossary#script)_ - a building block for custom storage, systems and time-keepint
- _[session](./Glossary#session)_ - represents one client connection
- _[ticker](./Glossary#ticker)_ - Allows to run events on a steady 'tick'
- _[twisted](./Glossary#twisted)_ - networking engine responsible for Evennia's event loop and
- _[puppet](./Glossary.md#puppet)_ - when an [account](./Glossary.md#account) controls an in-game
[object](./Glossary.md#object)
- _[property](./Glossary.md#property)_ - a python property
- _evenv_ - see _[virtualenv](./Glossary.md#virtualenv)_
- _[repository](./Glossary.md#repository)_ - a store of source code + source history
- _[script](./Glossary.md#script)_ - a building block for custom storage, systems and time-keepint
- _[session](./Glossary.md#session)_ - represents one client connection
- _[ticker](./Glossary.md#ticker)_ - Allows to run events on a steady 'tick'
- _[twisted](./Glossary.md#twisted)_ - networking engine responsible for Evennia's event loop and
communications
- _[typeclass](./Glossary#typeclass)_ - Evennia's database-connected Python class
- _upstream_ - see _[github](./Glossary#github)_
- _[virtualenv](./Glossary#virtualenv)_ - a Python program and way to make an isolated Python install
- _[typeclass](./Glossary.md#typeclass)_ - Evennia's database-connected Python class
- _upstream_ - see _[github](./Glossary.md#github)_
- _[virtualenv](./Glossary.md#virtualenv)_ - a Python program and way to make an isolated Python install
---
### _account_
The term 'account' refers to the [player's](./Glossary#player) unique account on the game. It is
represented by the `Account` [typeclass](./Glossary#typeclass) and holds things like email, password,
The term 'account' refers to the player's unique account on the game. It is
represented by the `Account` [typeclass](./Glossary.md#typeclass) and holds things like email, password,
configuration etc.
When a player connects to the game, they connect to their account. The account has *no*
representation in the game world. Through their Account they can instead choose to
[puppet](./Glossary#puppet) one (or more, depending on game mode) [Characters](./Glossary#character) in
[puppet](./Glossary.md#puppet) one (or more, depending on game mode) [Characters](./Glossary.md#character) in
the game.
In the default [multisession mode](./Sessions#multisession-mode) of Evennia, you immediately start
In the default [multisession mode](./Sessions.md#multisession-mode) of Evennia, you immediately start
puppeting a Character with the same name as your Account when you log in - mimicking how older
servers used to work.
### _admin-site_
This usually refers to [Django's](./Glossary#django) *Admin site* or database-administration web page
This usually refers to [Django's](./Glossary.md#django) *Admin site* or database-administration web page
([link to Django docs](https://docs.djangoproject.com/en/2.1/ref/contrib/admin/)). The admin site is
an automatically generated web interface to the database (it can be customized extensively). It's
reachable from the `admin` link on the default Evennia website you get with your server.
### _attribute_
The term _Attribute_ should not be confused with ([properties](./Glossary#property) or
[fields](./Glossary#field). The `Attribute` represents arbitrary pieces of data that can be attached
to any [typeclassed](./Glossary#typeclass) entity in Evennia. Attributes allows storing new persistent
The term _Attribute_ should not be confused with ([properties](./Glossary.md#property) or
[fields](./Glossary.md#field). The `Attribute` represents arbitrary pieces of data that can be attached
to any [typeclassed](./Glossary.md#typeclass) entity in Evennia. Attributes allows storing new persistent
data on typeclasses without changing their underlying database schemas. [Read more about Attributes
here](Attributes).
here](./Attributes.md).
### _channel_
A _Channel_ refers to an in-game communication channel. It's an entity that people subscribe to and
which re-distributes messages between all subscribers. Such subscribers default to being
[Accounts](./Glossary#account), for out-of-game communication but could also be [Objects (usually
Characters)](Glossary#character) if one wanted to adopt Channels for things like in-game walkie-
[Accounts](./Glossary.md#account), for out-of-game communication but could also be [Objects (usually
Characters)](./Glossary.md#character) if one wanted to adopt Channels for things like in-game walkie-
talkies or phone systems. It is represented by the `Channel` typeclass. [You can read more about the
comm system here](Communications#channels).
comm system here](./Communications.md#channels).
### _character_
The _Character_ is the term we use for the default avatar being [puppeted](./Glossary#puppet) by the
[account](./Glossary#account) in the game world. It is represented by the `Character` typeclass (which
is a child of [Object](./Glossary#object)). Many developers use children of this class to represent
monsters and other NPCs. You can [read more about it here](./Objects#subclasses-of-object).
The _Character_ is the term we use for the default avatar being [puppeted](./Glossary.md#puppet) by the
[account](./Glossary.md#account) in the game world. It is represented by the `Character` typeclass (which
is a child of [Object](./Glossary.md#object)). Many developers use children of this class to represent
monsters and other NPCs. You can [read more about it here](./Objects.md#subclasses-of-object).
### _django_
[Django](https://www.djangoproject.com/) is a professional and very popular Python web framework,
similar to Rails for the Ruby language. It is one of Evennia's central library dependencies (the
other one is [Twisted](./Glossary#twisted)). Evennia uses Django for two main things - to map all
other one is [Twisted](./Glossary.md#twisted)). Evennia uses Django for two main things - to map all
database operations to Python and for structuring our web site.
Through Django, we can work with any supported database (SQlite3, Postgres, MySQL ...) using generic
@ -97,9 +97,9 @@ Python instead of database-specific SQL: A database table is represented in Djan
There is usually no need to know the details of Django's database handling in order to use Evennia -
it will handle most of the complexity for you under the hood using what we call
[typeclasses](./Glossary#typeclass). But should you need the power of Django you can always get it.
[typeclasses](./Glossary.md#typeclass). But should you need the power of Django you can always get it.
Most commonly people want to use "raw" Django when doing more advanced/custom database queries than
offered by Evennia's [default search functions](./Tutorial-Searching-For-Objects). One will then need
offered by Evennia's [default search functions](./Tutorial-Searching-For-Objects.md). One will then need
to read about Django's _querysets_. Querysets are Python method calls on a special form that lets
you build complex queries. They get converted into optimized SQL queries under the hood, suitable
for your current database. [Here is our tutorial/explanation of Django queries](Tutorial-Searching-
@ -115,25 +115,30 @@ when a user goes that URL in their browser, enters data into a form etc. The ret
to show. Django also offers templating with features such as being able to add special markers in
HTML where it will insert the values of Python variables on the fly (like showing the current player
count on the web page). [Here is one of our tutorials on wiring up such a web page](Add-a-simple-
new-web-page). Django also comes with the [admin site](./Glossary#admin-site), which automatically
new-web-page). Django also comes with the [admin site](./Glossary.md#admin-site), which automatically
maps the database into a form accessible from a web browser.
### _contrib_
Contribs are optional and often more game-specific code-snippets contributed by the Evennia community.
They are distributed with Evennia in the `contrib/` folder.
### _core_
This term is sometimes used to represent the main Evennia library code suite, *excluding* its
[contrib](./Glossary#contrib) directory. It can sometimes come up in code reviews, such as
[contrib](./Glossary.md#contrib) directory. It can sometimes come up in code reviews, such as
> Evennia is game-agnostic but this feature is for a particular game genre. So it does not belong in
core. Better make it a contrib.
### _field_
A _field_ or _database field_ in Evennia refers to a [property](./Glossary#property) on a
[typeclass](./Glossary#typeclass) directly linked to an underlying database column. Only a few fixed
A _field_ or _database field_ in Evennia refers to a [property](./Glossary.md#property) on a
[typeclass](./Glossary.md#typeclass) directly linked to an underlying database column. Only a few fixed
properties per typeclass are database fields but they are often tied to the core functionality of
that base typeclass (for example [Objects](./Glossary#object) store its location as a field). In all
other cases, [attributes](./Glossary#attribute) are used to add new persistent data to the typeclass.
[Read more about typeclass properties here](./Typeclasses#about-typeclass-properties).
that base typeclass (for example [Objects](./Glossary.md#object) store its location as a field). In all
other cases, [attributes](./Glossary.md#attribute) are used to add new persistent data to the typeclass.
[Read more about typeclass properties here](./Typeclasses.md#about-typeclass-properties).
### _git_
@ -143,12 +148,12 @@ tool. It allows us to track the development of the Evennia code by dividing it i
come back to it later if later changes caused problems. By tracking commits we know what 'version'
of the code we are currently using.
Evennia's source code + its source history is jointly called a [repository](./Glossary#repository).
This is centrally stored at our online home on [GitHub](./Glossary#github). Everyone using or
Evennia's source code + its source history is jointly called a [repository](./Glossary.md#repository).
This is centrally stored at our online home on [GitHub](./Glossary.md#github). Everyone using or
developing Evennia makes a 'clone' of this repository to their own computer - everyone
automatically gets everything that is online, including all the code history.
> Don't confuse Git and [GitHub](./Glossary#github). The former is the version control system. The
> Don't confuse Git and [GitHub](./Glossary.md#github). The former is the version control system. The
latter is a website (run by a company) that allows you to upload source code controlled by Git for
others to see (among other things).
@ -167,19 +172,19 @@ you 'download' Evennia. You only need to do this once.
- `git pull` (inside local copy of repository) - sync your local repository with what is online.
> Full usage of Git is way beyond the scope of this glossary. See [Tutorial - version
control](Version-Control) for more info and links to the Git documentation.
control](./Version-Control.md) for more info and links to the Git documentation.
### _migrate_
This term is used for upgrading the database structure (it's _schema_ )to a new version. Most often
this is due to Evennia's [upstream](./Glossary#github) schema changing. When that happens you need to
migrate that schema to the new version as well. Once you have used [git](./Glossary#git) to pull the
this is due to Evennia's [upstream](./Glossary.md#github) schema changing. When that happens you need to
migrate that schema to the new version as well. Once you have used [git](./Glossary.md#git) to pull the
latest changes, just `cd` into your game dir and run
evennia migrate
That should be it (see [virtualenv](./Glossary#virtualenv) if you get a warning that the `evennia`
command is not available). See also [Updating your game](./Updating-Your-Game) for more details.
That should be it (see [virtualenv](./Glossary.md#virtualenv) if you get a warning that the `evennia`
command is not available). See also [Updating your game](./Updating-Your-Game.md) for more details.
> Technically, migrations are shipped as little Python snippets of code that explains which database
actions must be taken to upgrade from one version of the schema to the next. When you run the
@ -190,28 +195,28 @@ command above, those snippets are run in sequence.
This term refers to the `MULTISESSION_MODE` setting, which has a value of 0 to 3. The mode alters
how players can connect to the game, such as how many Sessions a player can start with one account
and how many Characters they can control at the same time. It is [described in detail
here](Sessions#multisession-mode).
here](./Sessions.md#multisession-mode).
### _github_
[Github](https://github.com/evennia) is where Evennia's source code and documentation is hosted.
This online [repository](./Glossary#repository) of code we also sometimes refer to as _upstream_.
This online [repository](./Glossary.md#repository) of code we also sometimes refer to as _upstream_.
GitHub is a business, offering free hosting to Open-source projects like Evennia. Despite the
similarity in name, don't confuse GitHub the website with [Git](./Glossary#git), the versioning
system. Github hosts Git [repositories](./Glossary#repository) online and helps with collaboration and
similarity in name, don't confuse GitHub the website with [Git](./Glossary.md#git), the versioning
system. Github hosts Git [repositories](./Glossary.md#repository) online and helps with collaboration and
infrastructure. Git itself is a separate project.
### _object_
In general Python (and other [object-oriented languages](https://en.wikipedia.org/wiki/Object-oriented_programming)), an `object` is what we call the instance of a *class*. But one of Evennia's
core [typeclasses](./Glossary#typeclasss) is also called "Object". To separate these in the docs we
core [typeclasses](./Glossary.md#typeclass) is also called "Object". To separate these in the docs we
try to use `object` to refer to the general term and capitalized `Object` when we refer to the
typeclass.
The `Object` is a typeclass that represents all *in-game* entities, including
[Characters](./Glossary#character), rooms, trees, weapons etc. [Read more about Objects
here](Objects).
[Characters](./Glossary.md#character), rooms, trees, weapons etc. [Read more about Objects
here](./Objects.md).
### _pip_
@ -232,58 +237,64 @@ means that if the code in `<folder>` changes, the installed Python package is im
If not using `-e`, one would need to run `pip install --upgrade <folder>` every time to make the
changes available when you import this package into your code. Evennia is installed this way.
For development, `pip` is usually used together with a [virtualenv](./Glossary#virtualenv) to install
For development, `pip` is usually used together with a [virtualenv](./Glossary.md#virtualenv) to install
all packages and dependencies needed for a project in one, isolated location on the hard drive.
### _puppet_
An [account](./Glossary#account) can take control and "play as" any [Object](./Glossary#object). When
An [account](./Glossary.md#account) can take control and "play as" any [Object](./Glossary.md#object). When
doing so, we call this _puppeting_, (like [puppeteering](https://en.wikipedia.org/wiki/Puppeteer)).
Normally the entity being puppeted is of the [Character](./Glossary#character) subclass but it does
Normally the entity being puppeted is of the [Character](./Glossary.md#character) subclass but it does
not have to be.
### _property_
A _property_ is a general term used for properties on any Python object. The term also sometimes
refers to the `property` built-in function of Python ([read more here](https://www.python-course.eu/python3_properties.php)). Note the distinction between properties,
[fields](./Glossary#field) and [Attributes](./Glossary#attribute).
[fields](./Glossary.md#field) and [Attributes](./Glossary.md#attribute).
### _repository_
A _repository_ is a version control/[git](./Glossary#git) term. It represents a folder containing
A _repository_ is a version control/[git](./Glossary.md#git) term. It represents a folder containing
source code plus its versioning history.
> In Git's case, that history is stored in a hidden folder `.git`. If you ever feel the need to look
into this folder you probably already know enough Git to know why.
The `evennia` folder you download from us with `git clone` is a repository. The code on
[GitHub](./Glossary#github) is often referred to as the 'online repository' (or the _upstream_
[GitHub](./Glossary.md#github) is often referred to as the 'online repository' (or the _upstream_
repository). If you put your game dir under version control, that of course becomes a repository as
well.
### _script_
When we refer to _Scripts_, we generally refer to the `Script` [typeclass](./Typeclasses). Scripts are
the mavericks of Evennia - they are like [Objects](./Glossary#object) but without any in-game
When we refer to _Scripts_, we generally refer to the `Script` [typeclass](./Typeclasses.md). Scripts are
the mavericks of Evennia - they are like [Objects](./Glossary.md#object) but without any in-game
existence. They are useful as custom places to store data but also as building blocks in persistent
game systems. Since the can be initialized with timing capabilities they can also be used for long-
time persistent time keeping (for fast updates other types of timers may be better though). [Read
more about Scripts here](Scripts)
more about Scripts here](./Scripts.md)
### _session_
A [Session](./Sessions) is a Python object representing a single client connection to the server. A
A [Session](./Sessions.md) is a Python object representing a single client connection to the server. A
given human player could connect to the game from different clients and each would get a Session
(even if you did not allow them to actually log in and get access to an
[account](./Glossary#account)).
[account](./Glossary.md#account)).
Sessions are _not_ [typeclassed](./Glossary#typeclass) and has no database persistence. But since they
Sessions are _not_ [typeclassed](./Glossary.md#typeclass) and has no database persistence. But since they
always exist (also when not logged in), they share some common functionality with typeclasses that
can be useful for certain game states.
### _tag_
A [Tag](./Tags.md) is a simple label one can attach to one or more objects in the game. Tagging is a
powerful way to group entities and can also be used to indicate they have particular shared abilities.
Tags are shared between objects (unlike [Attributes](#attribute)).
### _ticker_
The [Ticker handler](./TickerHandler) runs Evennia's optional 'ticker' system. In other engines, such
The [Ticker handler](./TickerHandler.md) runs Evennia's optional 'ticker' system. In other engines, such
as [DIKU](https://en.wikipedia.org/wiki/DikuMUD), all game events are processed only at specific
intervals called 'ticks'. Evennia has no such technical limitation (events are processed whenever
needed) but using a fixed tick can still be useful for certain types of game systems, like combat.
@ -292,27 +303,27 @@ to be called when those ticks come around.
### _typeclass_
The [typeclass](./Typeclasses) is an Evennia-specific term. A typeclass allows developers to work with
The [typeclass](./Typeclasses.md) is an Evennia-specific term. A typeclass allows developers to work with
database-persistent objects as if they were normal Python objects. It makes use of specific
[Django](./Glossary#django) features to link a Python class to a database table. Sometimes we refer to
[Django](./Glossary.md#django) features to link a Python class to a database table. Sometimes we refer to
such code entities as _being typeclassed_.
Evennia's main typeclasses are [Account](./Glossary#account), [Object](./Glossary#object),
[Script](./Glossary#script) and [Channel](./Glossary#channel). Children of the base class (such as
[Character](./Glossary#character)) will use the same database table as the parent, but can have vastly
different Python capabilities (and persistent features through [Attributes](./Glossary#attributes) and
[Tags](./Glossary#tags). A typeclass can be coded and treated pretty much like any other Python class
Evennia's main typeclasses are [Account](./Glossary.md#account), [Object](./Glossary.md#object),
[Script](./Glossary.md#script) and [Channel](./Glossary.md#channel). Children of the base class (such as
[Character](./Glossary.md#character)) will use the same database table as the parent, but can have vastly
different Python capabilities (and persistent features through [Attributes](./Glossary.md#attribute) and
[Tags](./Glossary.md#tag). A typeclass can be coded and treated pretty much like any other Python class
except it must inherit (at any distance) from one of the base typeclasses. Also, creating a new
instance of a typeclass will add a new row to the database table to which it is linked.
The [core](./Glossary#core) typeclasses in the Evennia library are all named `DefaultAccount`,
The [core](./Glossary.md#core) typeclasses in the Evennia library are all named `DefaultAccount`,
`DefaultObject` etc. When you initialize your [game dir] you automatically get empty children of
these, called `Account`, `Object` etc that you can start working with.
### _twisted_
[Twisted](https://twistedmatrix.com/trac/) is a heavy-duty asynchronous networking engine. It is one
of Evennia's two major library dependencies (the other one is [Django](./Glossary#django)). Twisted is
of Evennia's two major library dependencies (the other one is [Django](./Glossary.md#django)). Twisted is
what "runs" Evennia - it handles Evennia's event loop. Twisted also has the building blocks we need
to construct network protocols and communicate with the outside world; such as our MUD-custom
version of Telnet, Telnet+SSL, SSH, webclient-websockets etc. Twisted also runs our integrated web
@ -338,7 +349,7 @@ Python version than default.
A virtualenv is 'activated' only for the console/terminal it was started in, but it's safe to
activate the same virtualenv many times in different windows if you want. Once activated, all Python
packages now installed with [pip](./Glossary#pip) will install to `evenv` rather than to a global
packages now installed with [pip](./Glossary.md#pip) will install to `evenv` rather than to a global
location like `/usr/local/bin` or `C:\Program Files`.
> Note that if you have root/admin access you *could* install Evennia globally just fine, without

View file

@ -10,16 +10,16 @@ Guest accounts are turned off by default. To activate, add this to your `game/se
GUEST_ENABLED = True
Henceforth users can use `connect guest` (in the default command set) to login with a guest account.
You may need to change your [Connection Screen](./Connection-Screen) to inform them of this
You may need to change your [Connection Screen](./Connection-Screen.md) to inform them of this
possibility. Guest accounts work differently from normal accounts - they are automatically *deleted*
whenever the user logs off or the server resets (but not during a reload). They are literally re-
usable throw-away accounts.
You can add a few more variables to your `settings.py` file to customize your guests:
- `BASE_GUEST_TYPECLASS` - the python-path to the default [typeclass](./Typeclasses) for guests.
- `BASE_GUEST_TYPECLASS` - the python-path to the default [typeclass](./Typeclasses.md) for guests.
Defaults to `"typeclasses.accounts.Guest"`.
- `PERMISSION_GUEST_DEFAULT` - [permission level](./Locks) for guest accounts. Defaults to `"Guests"`,
- `PERMISSION_GUEST_DEFAULT` - [permission level](./Locks.md) for guest accounts. Defaults to `"Guests"`,
which is the lowest permission level in the hierarchy.
- `GUEST_START_LOCATION` - the `#dbref` to the starting location newly logged-in guests should
appear at. Defaults to `"#2` (Limbo).

View file

@ -1,7 +1,7 @@
# Help System Tutorial
**Before doing this tutorial you will probably want to read the intro in [Basic Web tutorial](./Web-Tutorial).** Reading the three first parts of the [Django tutorial](https://docs.djangoproject.com/en/2.2/) might help as well.
**Before doing this tutorial you will probably want to read the intro in [Basic Web tutorial](./Web-Tutorial.md).** Reading the three first parts of the [Django tutorial](https://docs.djangoproject.com/en/2.2/) might help as well.
This tutorial will show you how to access the help system through your website. Both help commands
and regular help entries will be visible, depending on the logged-in user or an anonymous character.

View file

@ -67,7 +67,7 @@ entries together for people to more easily find them. See the `help` command in-
default categories. If you don't specify the category, "General" is assumed.
If you don't want your command to be picked up by the auto-help system at all (like if you want to
write its docs manually using the info in the next section or you use a [cmdset](./Command-Sets) that
write its docs manually using the info in the next section or you use a [cmdset](./Command-Sets.md) that
has its own help functionality) you can explicitly set `auto_help` class property to `False` in your
command definition.
@ -79,7 +79,7 @@ returned by this method will be displayed to the character asking for help in th
## Database help entries
These are all help entries not involving commands (this is handled automatically by the [Command
Auto-help system](Help-System#command-auto-help-system)). Non-automatic help entries describe how
Auto-help system](./Help-System.md#command-auto-help-system)). Non-automatic help entries describe how
your particular game is played - its rules, world descriptions and so on.
A help entry consists of four parts:
@ -89,7 +89,7 @@ looking for help. The topic can contain spaces and also partial matches will be
- The *help category*. Examples are *Administration*, *Building*, *Comms* or *General*. This is an
overall grouping of similar help topics, used by the engine to give a better overview.
- The *text* - the help text itself, of any length.
- locks - a [lock definition](./Locks). This can be used to limit access to this help entry, maybe
- locks - a [lock definition](./Locks.md). This can be used to limit access to this help entry, maybe
because it's staff-only or otherwise meant to be restricted. Help commands check for `access_type`s
`view` and `edit`. An example of a lock string would be `view:perm(Builders)`.
@ -117,6 +117,6 @@ If the category *Roleplaying* did not already exist, it is created and will appe
index.
You can, finally, define a lock for the help entry by following the category with a [lock
definition](Locks):
definition](./Locks.md):
> @sethelp/add emote, Roleplaying, view:all() = Emoting is ...

View file

@ -3,7 +3,7 @@
### How to *get* Help
If you cannot find what you are looking for in the [online documentation](./index), here's what to do:
If you cannot find what you are looking for in the [online documentation](./index.md), here's what to do:
- If you think the documentation is not clear enough and are short on time, fill in our quick little
[online form][form] and let us know - no login required. Maybe the docs need to be improved or a new
@ -36,7 +36,7 @@ also a nice way to spread the word.
If you'd like to help develop Evennia more hands-on, here are some ways to get going:
- Look through our [online documentation wiki](./index) and see if you
- Look through our [online documentation wiki](./index.md) and see if you
can help improve or expand the documentation (even small things like fixing typos!). You don't need
any particular permissions to edit the wiki.
- Send a message to our [discussion group][group] and/or our [IRC chat][chat] asking about what
@ -46,7 +46,7 @@ needs doing, along with what your interests and skills are.
[bounties][issues-bounties] open - these are issues members of the community has put up money to see
fixed (if you want to put up a bounty yourself you can do so via our page on
[bountysource][bountysource]).
- Check out the [Contributing](./Contributing) page on how to practically contribute with code using
- Check out the [Contributing](./Contributing.md) page on how to practically contribute with code using
github.
... And finally, if you want to help motivate and support development you can also drop some coins

View file

@ -29,8 +29,8 @@ pip install python-twitter
## A basic tweet command
Evennia doesn't have a `tweet` command out of the box so you need to write your own little
[Command](./Commands) in order to tweet. If you are unsure about how commands work and how to add
them, it can be an idea to go through the [Adding a Command Tutorial](./Adding-Command-Tutorial)
[Command](./Commands.md) in order to tweet. If you are unsure about how commands work and how to add
them, it can be an idea to go through the [Adding a Command Tutorial](./Adding-Command-Tutorial.md)
before continuing.
You can create the command in a separate command module (something like `mygame/commands/tweet.py`)
@ -89,7 +89,7 @@ Be sure to substitute your own actual API/Access keys and secrets in the appropr
We default to limiting tweet access to players with `Developers`-level access *or* to those players
that have the permission "tweet" (allow individual characters to tweet with `@perm/player playername
= tweet`). You may change the [lock](./Locks) as you feel is appropriate. Change the overall
= tweet`). You may change the [lock](./Locks.md) as you feel is appropriate. Change the overall
permission to `Players` if you want everyone to be able to tweet.
Now add this command to your default command set (e.g in `mygame/commands/defalt_cmdsets.py`") and
@ -106,5 +106,5 @@ This shows only a basic tweet setup, other things to do could be:
* Echo your tweets to an in-game channel
Rather than using an explicit command you can set up a Script to send automatic tweets, for example
to post updated game stats. See the [Tweeting Game Stats tutorial](./Tutorial-Tweeting-Game-Stats) for
to post updated game stats. See the [Tweeting Game Stats tutorial](./Tutorial-Tweeting-Game-Stats.md) for
help.

View file

@ -7,7 +7,7 @@ Discord](https://discord.gg/NecFePw), which is mirrored to IRC._
[IRC (Internet Relay Chat)](http://en.wikipedia.org/wiki/Internet_Relay_Chat) is a long standing
chat protocol used by many open-source projects for communicating in real time. By connecting one of
Evennia's [Channels](./Communications) to an IRC channel you can communicate also with people not on
Evennia's [Channels](./Communications.md) to an IRC channel you can communicate also with people not on
an mud themselves. You can also use IRC if you are only running your Evennia MUD locally on your
computer (your game doesn't need to be open to the public)! All you need is an internet connection.
For IRC operation you also need [twisted.words](http://twistedmatrix.com/trac/wiki/TwistedWords).

View file

@ -45,12 +45,12 @@ makes it easier to change and update things in one place later.
values for Health, a list of skills etc, store those things on the Character - don't store how to
roll or change them.
- Next is to determine just how you want to store things on your Objects and Characters. You can
choose to either store things as individual [Attributes](./Attributes), like `character.db.STR=34` and
choose to either store things as individual [Attributes](./Attributes.md), like `character.db.STR=34` and
`character.db.Hunting_skill=20`. But you could also use some custom storage method, like a
dictionary `character.db.skills = {"Hunting":34, "Fishing":20, ...}`. A much more fancy solution is
to look at the Ainneve [Trait
handler](https://github.com/evennia/ainneve/blob/master/world/traits.py). Finally you could even go
with a [custom django model](./New-Models). Which is the better depends on your game and the
with a [custom django model](./New-Models.md). Which is the better depends on your game and the
complexity of your system.
- Make a clear [API](http://en.wikipedia.org/wiki/Application_programming_interface) into your
rules. That is, make methods/functions that you feed with, say, your Character and which skill you

View file

@ -1,9 +1,9 @@
# Inputfuncs
An *inputfunc* is an Evennia function that handles a particular input (an [inputcommand](./OOB)) from
An *inputfunc* is an Evennia function that handles a particular input (an [inputcommand](./OOB.md)) from
the client. The inputfunc is the last destination for the inputcommand along the [ingoing message
path](Messagepath#the-ingoing-message-path). The inputcommand always has the form `(commandname,
path](./Messagepath.md#the-ingoing-message-path). The inputcommand always has the form `(commandname,
(args), {kwargs})` and Evennia will use this to try to find and call an inputfunc on the form
```python
@ -42,7 +42,7 @@ Evennia defines a few default inputfuncs to handle the common cases. These are d
This is the most common of inputcommands, and the only one supported by every traditional mud. The
argument is usually what the user sent from their command line. Since all text input from the user
like this is considered a [Command](./Commands), this inputfunc will do things like nick-replacement
like this is considered a [Command](./Commands.md), this inputfunc will do things like nick-replacement
and then pass on the input to the central Commandhandler.
### echo
@ -134,7 +134,7 @@ to expand. By default the following values can be retrieved:
accepted names if given an unfamiliar callback name.
This will tell evennia to repeatedly call a named function at a given interval. Behind the scenes
this will set up a [Ticker](./TickerHandler). Only previously acceptable functions are possible to
this will set up a [Ticker](./TickerHandler.md). Only previously acceptable functions are possible to
repeat-call in this way, you'll need to overload this inputfunc to add the ones you want to offer.
By default only two example functions are allowed, "test1" and "test2", which will just echo a text
back at the given interval. Stop the repeat by sending `"stop": True` (note that you must include
@ -155,7 +155,7 @@ This is a convenience wrapper for sending "stop" to the `repeat` inputfunc.
This sets up on-object monitoring of Attributes or database fields. Whenever the field or Attribute
changes in any way, the outputcommand will be sent. This is using the
[MonitorHandler](./MonitorHandler) behind the scenes. Pass the "stop" key to stop monitoring. Note
[MonitorHandler](./MonitorHandler.md) behind the scenes. Pass the "stop" key to stop monitoring. Note
that you must supply the name also when stopping to let the system know which monitor should be
cancelled.

View file

@ -80,7 +80,7 @@ Install the latest Evennia in a way that lets you edit the source
This step will possibly take quite a while - we are downloading Evennia and are then installing it,
building all of the requirements for Evennia to run. If you run into trouble on this step, please
see [Troubleshooting](./Installing-on-Android#troubleshooting).
see [Troubleshooting](./Installing-on-Android.md#troubleshooting).
You can go to the dir where Evennia is installed with `cd $VIRTUAL_ENV/src/evennia`. `git grep
(something)` can be handy, as can `git diff`
@ -88,7 +88,7 @@ You can go to the dir where Evennia is installed with `cd $VIRTUAL_ENV/src/evenn
### Final steps
At this point, Evennia is installed on your phone! You can now continue with the original [Getting
Started](Getting-Started) instruction, we repeat them here for clarity.
Started](./Getting-Started.md) instruction, we repeat them here for clarity.
To start a new game:
@ -120,7 +120,7 @@ $ cd ~ && source evenv/bin/activate
(evenv) $ evennia start
```
You may wish to look at the [Linux Instructions](./Getting-Started#linux-install) for more.
You may wish to look at the [Linux Instructions](./Getting-Started.md#linux-install) for more.
## Caveats

View file

@ -43,7 +43,7 @@ Alternatively you might have the language but find the translation bad ... You a
improve the situation!
To start a new translation you need to first have cloned the Evennia repositry with GIT and
activated a python virtualenv as described on the [Getting Started](./Getting-Started) page. You now
activated a python virtualenv as described on the [Getting Started](./Getting-Started.md) page. You now
need to `cd` to the `evennia/` directory. This is *not* your created game folder but the main
Evennia library folder. If you see a folder `locale/` then you are in the right place. From here you
run:

View file

@ -171,6 +171,6 @@ programming curriculum for different skill levels
### Credits
- Wiki [Home](./index) Icons made by [Freepik](http://www.freepik.com"-title="Freepik">Freepik) from
- Wiki [Home](./index.md) Icons made by [Freepik](http://www.freepik.com"-title="Freepik">Freepik) from
[flaticon.com](http://www.flaticon.com), licensed under [Creative Commons BY
3.0](http://creativecommons.org/licenses/by/3.0).

View file

@ -2,9 +2,9 @@
For most games it is a good idea to restrict what people can do. In Evennia such restrictions are
applied and checked by something called *locks*. All Evennia entities ([Commands](./Commands),
[Objects](./Objects), [Scripts](./Scripts), [Accounts](./Accounts), [Help System](./Help-System),
[messages](./Communications#Msg) and [channels](./Communications#Channels)) are accessed through locks.
applied and checked by something called *locks*. All Evennia entities ([Commands](./Commands.md),
[Objects](./Objects.md), [Scripts](./Scripts.md), [Accounts](./Accounts.md), [Help System](./Help-System.md),
[messages](./Communications.md#msg) and [channels](./Communications.md#channels)) are accessed through locks.
A lock can be thought of as an "access rule" restricting a particular use of an Evennia entity.
Whenever another entity wants that kind of access the lock will analyze that entity in different
@ -92,9 +92,9 @@ the default command set) actually checks for, as in the example of `delete` abov
Below are the access_types checked by the default commandset.
- [Commands](./Commands)
- [Commands](./Commands.md)
- `cmd` - this defines who may call this command at all.
- [Objects](./Objects):
- [Objects](./Objects.md):
- `control` - who is the "owner" of the object. Can set locks, delete it etc. Defaults to the
creator of the object.
- `call` - who may call Object-commands stored on this Object except for the Object itself. By
@ -109,26 +109,26 @@ something like `call:false()`.
- `get`- who may pick up the object and carry it around.
- `puppet` - who may "become" this object and control it as their "character".
- `attrcreate` - who may create new attributes on the object (default True)
- [Characters](./Objects#Characters):
- [Characters](./Objects.md#characters):
- Same as for Objects
- [Exits](./Objects#Exits):
- [Exits](./Objects.md#exits):
- Same as for Objects
- `traverse` - who may pass the exit.
- [Accounts](./Accounts):
- [Accounts](./Accounts.md):
- `examine` - who may examine the account's properties.
- `delete` - who may delete the account.
- `edit` - who may edit the account's attributes and properties.
- `msg` - who may send messages to the account.
- `boot` - who may boot the account.
- [Attributes](./Attributes): (only checked by `obj.secure_attr`)
- [Attributes](./Attributes.md): (only checked by `obj.secure_attr`)
- `attrread` - see/access attribute
- `attredit` - change/delete attribute
- [Channels](./Communications#Channels):
- [Channels](./Communications.md#channels):
- `control` - who is administrating the channel. This means the ability to delete the channel,
boot listeners etc.
- `send` - who may send to the channel.
- `listen` - who may subscribe and listen to the channel.
- [HelpEntry](./Help-System):
- [HelpEntry](./Help-System.md):
- `examine` - who may view this help entry (usually everyone)
- `edit` - who may edit this help entry.
@ -214,10 +214,10 @@ Some useful default lockfuncs (see `src/locks/lockfuncs.py` for more):
- `false()/none()/superuser()` - give access to none. Superusers bypass the check entirely and are
thus the only ones who will pass this check.
- `perm(perm)` - this tries to match a given `permission` property, on an Account firsthand, on a
Character second. See [below](./Locks#permissions).
Character second. See [below](./Locks.md#permissions).
- `perm_above(perm)` - like `perm` but requires a "higher" permission level than the one given.
- `id(num)/dbref(num)` - checks so the access_object has a certain dbref/id.
- `attr(attrname)` - checks if a certain [Attribute](./Attributes) exists on accessing_object.
- `attr(attrname)` - checks if a certain [Attribute](./Attributes.md) exists on accessing_object.
- `attr(attrname, value)` - checks so an attribute exists on accessing_object *and* has the given
value.
- `attr_gt(attrname, value)` - checks so accessing_object has a value larger (`>`) than the given
@ -250,7 +250,7 @@ a Lock lookup.
## Default locks
Evennia sets up a few basic locks on all new objects and accounts (if we didn't, noone would have
any access to anything from the start). This is all defined in the root [Typeclasses](./Typeclasses)
any access to anything from the start). This is all defined in the root [Typeclasses](./Typeclasses.md)
of the respective entity, in the hook method `basetype_setup()` (which you usually don't want to
edit unless you want to change how basic stuff like rooms and exits store their internal variables).
This is called once, before `at_object_creation`, so just put them in the latter method on your
@ -261,7 +261,7 @@ control and delete the object.
# Permissions
> This section covers the underlying code use of permissions. If you just want to learn how to
practically assign permissions in-game, refer to the [Building Permissions](./Building-Permissions)
practically assign permissions in-game, refer to the [Building Permissions](./Building-Permissions.md)
page, which details how you use the `perm` command.
A *permission* is simply a list of text strings stored in the handler `permissions` on `Objects`
@ -316,7 +316,7 @@ a particular permission in the hierarchy will *also* grant access to those with
access. So if you have the permission "Admin" you will also pass a lock defined as `perm(Builder)`
or any of those levels below "Admin".
When doing an access check from an [Object](./Objects) or Character, the `perm()` lock function will
When doing an access check from an [Object](./Objects.md) or Character, the `perm()` lock function will
always first use the permissions of any Account connected to that Object before checking for
permissions on the Object. In the case of hierarchical permissions (Admins, Builders etc), the
Account permission will always be used (this stops an Account from escalating their permission by
@ -330,14 +330,14 @@ Here is how you use `perm` to give an account more permissions:
perm/account/del Tommy = Builders # remove it again
Note the use of the `/account` switch. It means you assign the permission to the
[Accounts](./Accounts) Tommy instead of any [Character](./Objects) that also happens to be named
[Accounts](./Accounts.md) Tommy instead of any [Character](./Objects.md) that also happens to be named
"Tommy".
Putting permissions on the *Account* guarantees that they are kept, *regardless* of which Character
they are currently puppeting. This is especially important to remember when assigning permissions
from the *hierarchy tree* - as mentioned above, an Account's permissions will overrule that of its
character. So to be sure to avoid confusion you should generally put hierarchy permissions on the
Account, not on their Characters (but see also [quelling](./Locks#Quelling)).
Account, not on their Characters (but see also [quelling](./Locks.md#quelling)).
Below is an example of an object without any connected account
@ -417,7 +417,7 @@ whereas only Admins and the creator may delete it. Everyone can pick it up.
## A complete example of setting locks on an object
Assume we have two objects - one is ourselves (not superuser) and the other is an [Object](./Objects)
Assume we have two objects - one is ourselves (not superuser) and the other is an [Object](./Objects.md)
called `box`.
> create/drop box
@ -443,7 +443,7 @@ This is defined in `evennia/commands/default/general.py`. In its code we find th
```
So the `get` command looks for a lock with the type *get* (not so surprising). It also looks for an
[Attribute](./Attributes) on the checked object called _get_err_msg_ in order to return a customized
[Attribute](./Attributes.md) on the checked object called _get_err_msg_ in order to return a customized
error message. Sounds good! Let's start by setting that on the box:
> set box/get_err_msg = You are not strong enough to lift this box.

View file

@ -5,7 +5,7 @@ This is a small tutorial for customizing your character objects, using the examp
turn on and off ANSI color parsing as an example. `@options NOCOLOR=True` will now do what this
tutorial shows, but the tutorial subject can be applied to other toggles you may want, as well.
In the Building guide's [Colors](./TextTags#coloured-text) page you can learn how to add color to your
In the Building guide's [Colors](./TextTags.md#coloured-text) page you can learn how to add color to your
game by using special markup. Colors enhance the gaming experience, but not all users want color.
Examples would be users working from clients that don't support color, or people with various seeing
disabilities that rely on screen readers to play your game. Also, whereas Evennia normally
@ -26,7 +26,7 @@ configuration system for your characters. This is the basic sequence:
Create a new module in `mygame/typeclasses` named, for example, `mycharacter.py`. Alternatively you
can simply add a new class to 'mygamegame/typeclasses/characters.py'.
In your new module(or characters.py), create a new [Typeclass](./Typeclasses) inheriting from
In your new module(or characters.py), create a new [Typeclass](./Typeclasses.md) inheriting from
`evennia.DefaultCharacter`. We will also import `evennia.utils.ansi`, which we will use later.
```python
@ -39,7 +39,7 @@ In your new module(or characters.py), create a new [Typeclass](./Typeclasses) in
self.db.config_color = True
```
Above we set a simple config value as an [Attribute](./Attributes).
Above we set a simple config value as an [Attribute](./Attributes.md).
Let's make sure that new characters are created of this type. Edit your
`mygame/server/conf/settings.py` file and add/change `BASE_CHARACTER_TYPECLASS` to point to your new
@ -158,7 +158,7 @@ class CharacterCmdSet(default_cmds.CharacterCmdSet):
## More colors
Apart from ANSI colors, Evennia also supports **Xterm256** colors (See [Colors](./TextTags#colored-
Apart from ANSI colors, Evennia also supports **Xterm256** colors (See [Colors](./TextTags.md#colored-
text)). The `msg()` method supports the `xterm256` keyword for manually activating/deactiving
xterm256. It should be easy to expand the above example to allow players to customize xterm256
regardless of if Evennia thinks their client supports it or not.

View file

@ -25,7 +25,7 @@ The client sends data to Evennia in two ways.
- When first connecting, the client can send data to the server about its
capabilities. This is things like "I support xterm256 but not unicode" and is
mainly used when a Telnet client connects. This is called a "handshake" and
will generally set some flags on the [Portal Session](./Portal-And-Server) that
will generally set some flags on the [Portal Session](./Portal-And-Server.md) that
are later synced to the Server Session. Since this is not something the player
controls, we'll not explore this further here.
- The client can send an *inputcommand* to the server. Traditionally this only
@ -34,7 +34,7 @@ The client sends data to Evennia in two ways.
the client may send commands based on a timer or some trigger.
Exactly how the inputcommand looks when it travels from the client to Evennia
depends on the [Protocol](./Custom-Protocols) used:
depends on the [Protocol](./Custom-Protocols.md) used:
- Telnet: A string. If GMCP or MSDP OOB protocols are used, this string will
be formatted in a special way, but it's still a raw string. If Telnet SSL is
active, the string will be encrypted.
@ -73,7 +73,7 @@ it belongs. This is then sent over the AMP connection.
### ServerSessionHandler (ingoing)
On the Server side, the AMP unpickles the data and associates the session id with the server-side
[Session](./Sessions). Data and Session are passed to the server-side `SessionHandler.data_in`. This
[Session](./Sessions.md). Data and Session are passed to the server-side `SessionHandler.data_in`. This
in turn calls `ServerSession.data_in()`
### ServerSession (ingoing)
@ -101,7 +101,7 @@ not found, an error will be raised.
### Inputfunc
The [Inputfunc](./Inputfuncs) must be on the form `func(session, *args, **kwargs)`. An exception is
The [Inputfunc](./Inputfuncs.md) must be on the form `func(session, *args, **kwargs)`. An exception is
the `default` inputfunc which has form `default(session, cmdname, *args, **kwargs)`, where `cmdname`
is the un-matched inputcommand string.
@ -175,7 +175,7 @@ In the *ServerSessionhandler*, the keywords from the `msg` method are collated i
This will intelligently convert different input to the same form. So `msg("Hello")` will end up as
an outputcommand `("text", ("Hello",), {})`.
This is also the point where [Inlinefuncs](./TextTags#inline-functions) are parsed, depending on the
This is also the point where [Inlinefuncs](./TextTags.md#inline-functions) are parsed, depending on the
session to receive the data. Said data is pickled together with the Session id then sent over the
AMP bridge.

View file

@ -23,10 +23,10 @@ MONITOR_HANDLER.add(obj, fieldname, callback,
```
- `obj` ([Typeclassed](./Typeclasses) entity) - the object to monitor. Since this must be
typeclassed, it means you can't monitor changes on [Sessions](./Sessions) with the monitorhandler, for
- `obj` ([Typeclassed](./Typeclasses.md) entity) - the object to monitor. Since this must be
typeclassed, it means you can't monitor changes on [Sessions](./Sessions.md) with the monitorhandler, for
example.
- `fieldname` (str) - the name of a field or [Attribute](./Attributes) on `obj`. If you want to
- `fieldname` (str) - the name of a field or [Attribute](./Attributes.md) on `obj`. If you want to
monitor a database field you must specify its full name, including the starting `db_` (like
`db_key`, `db_location` etc). Any names not starting with `db_` are instead assumed to be the names
of Attributes. This difference matters, since the MonitorHandler will automatically know to watch

View file

@ -1,6 +1,6 @@
# NPC shop Tutorial
This tutorial will describe how to make an NPC-run shop. We will make use of the [EvMenu](./EvMenu)
This tutorial will describe how to make an NPC-run shop. We will make use of the [EvMenu](./EvMenu.md)
system to present shoppers with a menu where they can buy things from the store's stock.
Our shop extends over two rooms - a "front" room open to the shop's customers and a locked "store
@ -23,7 +23,7 @@ deducted and the goods transferred from the store room to the inventory of the c
We want to show a menu to the customer where they can list, examine and buy items in the store. This
menu should change depending on what is currently for sale. Evennia's *EvMenu* utility will manage
the menu for us. It's a good idea to [read up on EvMenu](./EvMenu) if you are not familiar with it.
the menu for us. It's a good idea to [read up on EvMenu](./EvMenu.md) if you are not familiar with it.
#### Designing the menu
@ -167,7 +167,7 @@ of the customer.
#### The command to start the menu
We could *in principle* launch the shopping menu the moment a customer steps into our shop room, but
this would probably be considered pretty annoying. It's better to create a [Command](./Commands) for
this would probably be considered pretty annoying. It's better to create a [Command](./Commands.md) for
customers to explicitly wanting to shop around.
```python
@ -200,7 +200,7 @@ class CmdBuy(Command):
This will launch the menu. The `EvMenu` instance is initialized with the path to this very module -
since the only global functions available in this module are our menu nodes, this will work fine
(you could also have put those in a separate module). We now just need to put this command in a
[CmdSet](./Command-Sets) so we can add it correctly to the game:
[CmdSet](./Command-Sets.md) so we can add it correctly to the game:
```python
from evennia import CmdSet
@ -219,7 +219,7 @@ There are really only two things that separate our shop from any other Room:
the shop.
For testing we could easily add these features manually to a room using `@py` or other admin
commands. Just to show how it can be done we'll instead make a custom [Typeclass](./Typeclasses) for
commands. Just to show how it can be done we'll instead make a custom [Typeclass](./Typeclasses.md) for
the shop room and make a small command that builders can use to build both the shop and the
storeroom at once.
@ -295,12 +295,12 @@ class CmdBuildShop(Command):
Our typeclass is simple and so is our `buildshop` command. The command (which is for Builders only)
just takes the name of the shop and builds the front room and a store room to go with it (always
named `"<shopname>-storage"`. It connects the rooms with a two-way exit. You need to add
`CmdBuildShop` [to the default cmdset](./Adding-Command-Tutorial#step-2-adding-the-command-to-a-
`CmdBuildShop` [to the default cmdset](./Adding-Command-Tutorial.md#step-2-adding-the-command-to-a-
default-cmdset) before you can use it. Once having created the shop you can now `@teleport` to it or
`@open` a new exit to it. You could also easily expand the above command to automatically create
exits to and from the new shop from your current location.
To avoid customers walking in and stealing everything, we create a [Lock](./Locks) on the storage
To avoid customers walking in and stealing everything, we create a [Lock](./Locks.md) on the storage
door. It's a simple lock that requires the one entering to carry an object named
`<shopname>-storekey`. We even create such a key object and drop it in the shop for the new shop
keeper to pick up.
@ -328,7 +328,7 @@ would then be gone and the counter be wrong - the shop would pass us the next it
Fixing these issues are left as an exercise.
If you want to keep the shop fully NPC-run you could add a [Script](./Scripts) to restock the shop's
If you want to keep the shop fully NPC-run you could add a [Script](./Scripts.md) to restock the shop's
store room regularly. This shop example could also easily be owned by a human Player (run for them
by a hired NPC) - the shop owner would get the key to the store room and be responsible for keeping
it well stocked.

View file

@ -7,7 +7,7 @@ sufficient for most use cases. But if you aim to build a large stand-alone syste
your storage requirements into those may be more complex than you bargain for. Examples may be to
store guild data for guild members to be able to change, tracking the flow of money across a game-
wide economic system or implement other custom game systems that requires the storage of custom data
in a quickly accessible way. Whereas [Tags](./Tags) or [Scripts](./Scripts) can handle many situations,
in a quickly accessible way. Whereas [Tags](./Tags.md) or [Scripts](./Scripts.md) can handle many situations,
sometimes things may be easier to handle by adding your own database model.
## Overview of database tables
@ -81,7 +81,7 @@ you put `myapp` and don't forget the comma at the end of the tuple):
evennia migrate
This will add your new database table to the database. If you have put your game under version
control (if not, [you should](./Version-Control)), don't forget to `git add myapp/*` to add all items
control (if not, [you should](./Version-Control.md)), don't forget to `git add myapp/*` to add all items
to version control.
## Defining your models
@ -113,7 +113,7 @@ We create four fields: two character fields of limited length and one text field
maximum length. Finally we create a field containing the current time of us creating this object.
> The `db_date_created` field, with exactly this name, is *required* if you want to be able to store
instances of your custom model in an Evennia [Attribute](./Attributes). It will automatically be set
instances of your custom model in an Evennia [Attribute](./Attributes.md). It will automatically be set
upon creation and can after that not be changed. Having this field will allow you to do e.g.
`obj.db.myinstance = mydatastore`. If you know you'll never store your model instances in Attributes
the `db_date_created` field is optional.

View file

@ -1,7 +1,7 @@
# Nicks
*Nicks*, short for *Nicknames* is a system allowing an object (usually a [Account](./Accounts)) to
*Nicks*, short for *Nicknames* is a system allowing an object (usually a [Account](./Accounts.md)) to
assign custom replacement names for other game entities.
Nicks are not to be confused with *Aliases*. Setting an Alias on a game entity actually changes an
@ -75,7 +75,7 @@ You can also use [shell-type wildcards](http://www.linfo.org/wildcard.html):
## Coding with nicks
Nicks are stored as the `Nick` database model and are referred from the normal Evennia
[object](./Objects) through the `nicks` property - this is known as the *NickHandler*. The NickHandler
[object](./Objects.md) through the `nicks` property - this is known as the *NickHandler*. The NickHandler
offers effective error checking, searches and conversion.
```python
@ -101,12 +101,12 @@ offers effective error checking, searches and conversion.
In a command definition you can reach the nick handler through `self.caller.nicks`. See the `nick`
command in `evennia/commands/default/general.py` for more examples.
As a last note, The Evennia [channel](./Communications) alias systems are using nicks with the
As a last note, The Evennia [channel](./Communications.md) alias systems are using nicks with the
`nick_type="channel"` in order to allow users to create their own custom aliases to channels.
# Advanced note
Internally, nicks are [Attributes](./Attributes) saved with the `db_attrype` set to "nick" (normal
Internally, nicks are [Attributes](./Attributes.md) saved with the `db_attrype` set to "nick" (normal
Attributes has this set to `None`).
The nick stores the replacement data in the Attribute.db_value field as a tuple with four fields

View file

@ -8,7 +8,7 @@ window pane.
## Briefly on input/outputcommands
Inside Evennia, all server-client communication happens in the same way (so plain text is also an
'OOB message' as far as Evennia is concerned). The message follows the [Message Path](./Messagepath).
'OOB message' as far as Evennia is concerned). The message follows the [Message Path](./Messagepath.md).
You should read up on that if you are unfamiliar with it. As the message travels along the path it
has a standardized internal form: a tuple with a string, a tuple and a dict:
@ -16,9 +16,9 @@ has a standardized internal form: a tuple with a string, a tuple and a dict:
This is often referred to as an *inputcommand* or *outputcommand*, depending on the direction it's
traveling. The end point for an inputcommand, (the 'Evennia-end' of the message path) is a matching
[Inputfunc](./Inputfuncs). This function is called as `cmdname(session, *args, **kwargs)` where
[Inputfunc](./Inputfuncs.md). This function is called as `cmdname(session, *args, **kwargs)` where
`session` is the Session-source of the command. Inputfuncs can easily be added by the developer to
support/map client commands to actions inside Evennia (see the [inputfunc](./Inputfuncs) page for more
support/map client commands to actions inside Evennia (see the [inputfunc](./Inputfuncs.md) page for more
details).
When a message is outgoing (at the 'Client-end' of the message path) the outputcommand is handled by
@ -26,7 +26,7 @@ a matching *Outputfunc*. This is responsible for converting the internal Evennia
form suitable to send over the wire to the Client. Outputfuncs are hard-coded. Which is chosen and
how it processes the outgoing data depends on the nature of the client it's connected to. The only
time one would want to add new outputfuncs is as part of developing support for a new Evennia
[Protocol](./Custom-Protocols).
[Protocol](./Custom-Protocols.md).
## Sending and receiving an OOB message
@ -59,7 +59,7 @@ drop any other types of outputfuncs.
you turn off telnet completely and only rely on the webclient, you should never rely on non-`text`
OOB messages always reaching all targets.
[Inputfuncs](./Inputfuncs) lists the default inputfuncs available to handle incoming OOB messages. To
[Inputfuncs](./Inputfuncs.md) lists the default inputfuncs available to handle incoming OOB messages. To
accept more you need to add more inputfuncs (see that page for more info).
## Supported OOB protocols

View file

@ -3,7 +3,7 @@
All in-game objects in Evennia, be it characters, chairs, monsters, rooms or hand grenades are
represented by an Evennia *Object*. Objects form the core of Evennia and is probably what you'll
spend most time working with. Objects are [Typeclassed](./Typeclasses) entities.
spend most time working with. Objects are [Typeclassed](./Typeclasses.md) entities.
## How to create your own object types
@ -48,17 +48,17 @@ thing yourself in code:
call manually you have to give the full path to the class. The `create.create_object` function is
powerful and should be used for all coded object creating (so this is what you use when defining
your own building commands). Check out the `ev.create_*` functions for how to build other entities
like [Scripts](./Scripts)).
like [Scripts](./Scripts.md)).
This particular Rose class doesn't really do much, all it does it make sure the attribute
`desc`(which is what the `look` command looks for) is pre-set, which is pretty pointless since you
will usually want to change this at build time (using the `@desc` command or using the
[Spawner](./Spawner-and-Prototypes)). The `Object` typeclass offers many more hooks that is available
[Spawner](./Spawner-and-Prototypes.md)). The `Object` typeclass offers many more hooks that is available
to use though - see next section.
## Properties and functions on Objects
Beyond the properties assigned to all [typeclassed](./Typeclasses) objects (see that page for a list
Beyond the properties assigned to all [typeclassed](./Typeclasses.md) objects (see that page for a list
of those), the Object also has the following custom properties:
- `aliases` - a handler that allows you to add and remove aliases from this object. Use
@ -67,12 +67,12 @@ of those), the Object also has the following custom properties:
- `home` is a backup location. The main motivation is to have a safe place to move the object to if
its `location` is destroyed. All objects should usually have a home location for safety.
- `destination` - this holds a reference to another object this object links to in some way. Its
main use is for [Exits](./Objects#Exits), it's otherwise usually unset.
- `nicks` - as opposed to aliases, a [Nick](./Nicks) holds a convenient nickname replacement for a
main use is for [Exits](./Objects.md#exits), it's otherwise usually unset.
- `nicks` - as opposed to aliases, a [Nick](./Nicks.md) holds a convenient nickname replacement for a
real name, word or sequence, only valid for this object. This mainly makes sense if the Object is
used as a game character - it can then store briefer shorts, example so as to quickly reference game
commands or other characters. Use nicks.add(alias, realname) to add a new one.
- `account` - this holds a reference to a connected [Account](./Accounts) controlling this object (if
- `account` - this holds a reference to a connected [Account](./Accounts.md) controlling this object (if
any). Note that this is set also if the controlling account is *not* currently online - to test if
an account is online, use the `has_account` property instead.
- `sessions` - if `account` field is set *and the account is online*, this is a list of all active
@ -87,9 +87,9 @@ object set as their `location`).
The last two properties are special:
- `cmdset` - this is a handler that stores all [command sets](./Commands#Command_Sets) defined on the
- `cmdset` - this is a handler that stores all [command sets](./Command-Sets.md) defined on the
object (if any).
- `scripts` - this is a handler that manages [Scripts](./Scripts) attached to the object (if any).
- `scripts` - this is a handler that manages [Scripts](./Scripts.md) attached to the object (if any).
The Object also has a host of useful utility functions. See the function headers in
`src/objects/objects.py` for their arguments and more details.
@ -104,7 +104,7 @@ on).
- `execute_cmd()` - Lets the object execute the given string as if it was given on the command line.
- `move_to` - perform a full move of this object to a new location. This is the main move method
and will call all relevant hooks, do all checks etc.
- `clear_exits()` - will delete all [Exits](./Objects#Exits) to *and* from this object.
- `clear_exits()` - will delete all [Exits](./Objects.md#exits) to *and* from this object.
- `clear_contents()` - this will not delete anything, but rather move all contents (except Exits) to
their designated `Home` locations.
- `delete()` - deletes this object, first calling `clear_exits()` and
@ -114,7 +114,7 @@ The Object Typeclass defines many more *hook methods* beyond `at_object_creation
these hooks at various points. When implementing your custom objects, you will inherit from the
base parent and overload these hooks with your own custom code. See `evennia.objects.objects` for an
updated list of all the available hooks or the [API for DefaultObject
here](api:evennia.objects.objects#defaultobject).
here](evennia.objects.objects.DefaultObject).
## Subclasses of `Object`
@ -126,10 +126,10 @@ practice they are all pretty similar to the base Object.
### Characters
Characters are objects controlled by [Accounts](./Accounts). When a new Account
Characters are objects controlled by [Accounts](./Accounts.md). When a new Account
logs in to Evennia for the first time, a new `Character` object is created and
the Account object is assigned to the `account` attribute. A `Character` object
must have a [Default Commandset](./Commands#Command_Sets) set on itself at
must have a [Default Commandset](./Command-Sets.md) set on itself at
creation, or the account will not be able to issue any commands! If you just
inherit your own class from `evennia.DefaultCharacter` and make sure to use
`super()` to call the parent methods you should be fine. In
@ -150,21 +150,21 @@ you to modify.
*in* might be an exit, as well as *door*, *portal* or *jump out the window*. An exit has two things
that separate them from other objects. Firstly, their *destination* property is set and points to a
valid object. This fact makes it easy and fast to locate exits in the database. Secondly, exits
define a special [Transit Command](./Commands) on themselves when they are created. This command is
define a special [Transit Command](./Commands.md) on themselves when they are created. This command is
named the same as the exit object and will, when called, handle the practicalities of moving the
character to the Exits's *destination* - this allows you to just enter the name of the exit on its
own to move around, just as you would expect.
The exit functionality is all defined on the Exit typeclass, so you could in principle completely
change how exits work in your game (it's not recommended though, unless you really know what you are
doing). Exits are [locked](./Locks) using an access_type called *traverse* and also make use of a few
doing). Exits are [locked](./Locks.md) using an access_type called *traverse* and also make use of a few
hook methods for giving feedback if the traversal fails. See `evennia.DefaultExit` for more info.
In `mygame/typeclasses/exits.py` there is an empty `Exit` class for you to modify.
The process of traversing an exit is as follows:
1. The traversing `obj` sends a command that matches the Exit-command name on the Exit object. The
[cmdhandler](./Commands) detects this and triggers the command defined on the Exit. Traversal always
[cmdhandler](./Commands.md) detects this and triggers the command defined on the Exit. Traversal always
involves the "source" (the current location) and the `destination` (this is stored on the Exit
object).
1. The Exit command checks the `traverse` lock on the Exit object

View file

@ -32,7 +32,7 @@ terminal.
> Note: If you need to close the log-view, use `Ctrl-C`. Use just `evennia --log` on its own to
start tailing the logs again.
- Make sure you can connect with your web browser to `http://localhost:4001` or, alternatively,
`http:127.0.0.1:4001` which is the same thing. You should get your Evennia web site and be able to
`http://127.0.0.1:4001` which is the same thing. You should get your Evennia web site and be able to
play the game in the web client. Also check so that you can connect with a mud client to host
`localhost`, port `4000` or host `127.0.0.1`, port `4000`.
- [Google for "my ip"](https://www.google.se/search?q=my+ip) or use any online service to figure out
@ -66,7 +66,7 @@ web services you are running through this router though.
You can connect Evennia to the Internet without any changes to your settings. The default settings
are easy to use but are not necessarily the safest. You can customize your online presence in your
[settings file](./Server-Conf#settings-file). To have Evennia recognize changed port settings you have
[settings file](./Server-Conf.md#settings-file). To have Evennia recognize changed port settings you have
to do a full `evennia reboot` to also restart the Portal and not just the Server component.
Below is an example of a simple set of settings, mostly using the defaults. Evennia will require
@ -101,11 +101,11 @@ Read on for a description of the individual settings.
### Telnet
```python
# Required. Change to whichever outgoing Telnet port(s)
# Required. Change to whichever outgoing Telnet port(s)
# you are allowed to use on your host.
TELNET_PORTS = [4000]
# Optional for security. Restrict which telnet
# interfaces we should accept. Should be set to your
# Optional for security. Restrict which telnet
# interfaces we should accept. Should be set to your
# outward-facing IP address(es). Default is ´0.0.0.0´
# which accepts all interfaces.
TELNET_INTERFACES = ['0.0.0.0']
@ -115,22 +115,22 @@ The `TELNET_*` settings are the most important ones for getting a traditional ba
IP addresses you have available depends on your server hosting solution (see the next sections).
Some hosts will restrict which ports you are allowed you use so make sure to check.
### Web server
### Web server
```python
# Required. This is a list of tuples
# Required. This is a list of tuples
# (outgoing_port, internal_port). Only the outgoing
# port should be open to the world!
# port should be open to the world!
# set outgoing port to 80 if you want to run Evennia
# as the only web server on your machine (if available).
WEBSERVER_PORTS = [(4001, 4005)]
# Optional for security. Change this to the IP your
# server can be reached at (normally the same
# Optional for security. Change this to the IP your
# server can be reached at (normally the same
# as TELNET_INTERFACES)
WEBSERVER_INTERFACES = ['0.0.0.0']
# Optional for security. Protects against
# man-in-the-middle attacks. Change it to your server's
# IP address or URL when you run a production server.
# Optional for security. Protects against
# man-in-the-middle attacks. Change it to your server's
# IP address or URL when you run a production server.
ALLOWED_HOSTS = ['*']
```
@ -147,14 +147,14 @@ change the outgoing port unless the default internal port is clashing with some
```python
# Required. Change this to the main IP address of your server.
WEBSOCKET_CLIENT_INTERFACE = '0.0.0.0'
# Optional and needed only if using a proxy or similar. Change
# to the IP or address where the client can reach
# Optional and needed only if using a proxy or similar. Change
# to the IP or address where the client can reach
# your server. The ws:// part is then required. If not given, the client
# will use its host location.
# will use its host location.
WEBSOCKET_CLIENT_URL = ""
# Required. Change to a free port for the websocket client to reach
# the server on. This will be automatically appended
# to WEBSOCKET_CLIENT_URL by the web client.
# the server on. This will be automatically appended
# to WEBSOCKET_CLIENT_URL by the web client.
WEBSOCKET_CLIENT_PORT = 4002
```
@ -171,15 +171,15 @@ SSL_PORTS = [4003]
SSL_INTERFACES = ['0.0.0.0']
# Optional public facing. Only if you allow SSH connections (off by default).
SSH_PORTS = [4004]
SSH_INTERFACES = ['0.0.0.0']
SSH_INTERFACES = ['0.0.0.0']
# Required private. You should only change this if there is a clash
# with other services on your host. Should NOT be open to the
# outside world.
# with other services on your host. Should NOT be open to the
# outside world.
AMP_PORT = 4006
```
The `AMP_PORT` is required to work, since this is the internal port linking Evennia's [Server and
Portal](Portal-And-Server) components together. The other ports are encrypted ports that may be
The `AMP_PORT` is required to work, since this is the internal port linking Evennia's
[Server and Portal](../Components/Portal-And-Server.md) components together. The other ports are encrypted ports that may be
useful for custom protocols but are otherwise not used.
### Lockdown mode
@ -198,11 +198,11 @@ drum up interest for your game and also shows people that Evennia is being used.
even if you are just starting development - if you don't give any telnet/web address it will appear
as _Not yet public_ and just be a teaser. If so, pick _pre-alpha_ as the development status.
To register, stand in your game dir, run
To register, stand in your game dir, run
evennia connections
evennia connections
and follow the instructions. See the [Game index page](./Evennia-Game-Index) for more details.
and follow the instructions. See the [Game index page](./Evennia-Game-Index.md) for more details.
## SSL
@ -238,7 +238,8 @@ Also, on Freenode visit the #letsencrypt channel for assistance from the communi
additional resource, Let's Encrypt has a very active [community
forum](https://community.letsencrypt.org/).
[A blog where someone sets up Let's Encrypt](https://www.digitalocean.com/community/tutorials/how-to-secure-apache-with-let-s-encrypt-on-ubuntu-16-04)
[A blog where someone sets up Let's Encrypt](https://www.digitalocean.com/community/tutorials/how-
to-secure-apache-with-let-s-encrypt-on-ubuntu-16-04)
The only process missing from all of the above documentation is how to pass verification. This is
how Let's Encrypt verifies that you have control over your domain (not necessarily ownership, it's
@ -248,9 +249,8 @@ also be based on your hosting choice. In a controlled/cPanel environment, you wi
to use DNS verification.
## Relevant SSL Proxy Setup Information
- [HAProxy Config](./HAProxy-Config) - this is recommended for use with letsencrypt. This
page also has a more full description on how to set things up.
- [Apache webserver configuration](./Apache-Config) (optional)
- [Apache webserver configuration](./Apache-Config.md) (optional)
- [HAProxy Config](./HAProxy-Config.md)
## Hosting locally or remotely?
@ -283,7 +283,7 @@ main internet connection terminated as a consequence.
#### Setting up your own machine as a server
[The first section](./Online-Setup#connecting-from-the-outside) of this page describes how to do this
[The first section](./Online-Setup.md#connecting-from-the-outside) of this page describes how to do this
and allow users to connect to the IP address of your machine/router.
A complication with using a specific IP address like this is that your home IP might not remain the
@ -294,7 +294,7 @@ your game. What you need is to alias it to a more sensible domain name - an alia
around also when the IP changes.
1. To set up a domain name alias, we recommend starting with a free domain name from
[FreeDNS](http://freedns.afraid.org/). Once you register there (it's free) you have access to tens
[FreeDNS](https://freedns.afraid.org/). Once you register there (it's free) you have access to tens
of thousands domain names that people have "donated" to allow you to use for your own sub domain.
For example, `strangled.net` is one of those available domains. So tying our IP address to
`strangled.net` using the subdomain `evennia` would mean that one could henceforth direct people to
@ -305,7 +305,7 @@ and tell FreeDNS that. There are many alternatives to be found from FreeDNS:s ho
works on multiple platforms is [inadyn](http://www.inatech.eu/inadyn/). Get it from their page or,
in Linux, through something like `apt-get install inadyn`.
1. Next, you login to your account on FreeDNS and go to the
[Dynamic](http://freedns.afraid.org/dynamic/) page. You should have a list of your subdomains. Click
[Dynamic](https://freedns.afraid.org/dynamic/) page. You should have a list of your subdomains. Click
the `Direct URL` link and you'll get a page with a text message. Ignore that and look at the URL of
the page. It should be ending in a lot of random letters. Everything after the question mark is your
unique "hash". Copy this string.
@ -344,7 +344,7 @@ game stays online. Many services guarantee a certain level of up-time and also d
for you. Make sure to check, some offer lower rates in exchange for you yourself being fully
responsible for your data/backups.
- Usually offers a fixed domain name, so no need to mess with IP addresses.
- May have the ability to easily deploy [docker](./Running-Evennia-in-Docker) versions of evennia
- May have the ability to easily deploy [docker](./Running-Evennia-in-Docker.md) versions of evennia
and/or your game.
**Disadvantages**
@ -362,7 +362,7 @@ Docker) to deploy your game to the remote server; it will likely ease installati
Docker images may be a little confusing if you are completely new to them though.
If not using docker, and assuming you know how to connect to your account over ssh/PuTTy, you should
be able to follow the [Getting Started](./Getting-Started) instructions normally. You only need Python
be able to follow the [Setup Quickstart](./Setup-Quickstart.md) instructions normally. You only need Python
and GIT pre-installed; these should both be available on any servers (if not you should be able to
easily ask for them to be installed). On a VPS or Cloud service you can install them yourself as
needed.
@ -382,62 +382,31 @@ region. You may find useful offers for "low cost" VPS hosting on [Low End Box][7
There are all sorts of services available. Below are some international suggestions offered by
Evennia users:
```eval_rst
| Hosting name | Type | Lowest price | Comments |
|---|---| ---| --- |
| [silvren.com][1] | Shell account | Free for MU* | Private hobby provider so don't assume backups or expect immediate support. To ask for an account,connect with a MUD client to iweb.localecho.net, port 4201 and ask for "Jarin". |
| [Digital Ocean][2] | VPS | $5/month | You can get a $50 credit if you use the referral link https://m.do.co/c/8f64fec2670c - if you do, once you've had it long enough to have paid $25 we will get that as a referral bonus to help Evennia development.|
| [Amazon Web services][3] | Cloud | ~$5/month / on-demand | Free Tier first 12 months. Regions available around the globe.|
| [Amazon Lightsail][9] | Cloud | $5/month | Free first month. AWS's new "fixed cost" offering.|
| [Genesis MUD hosting][4] | Shell account | $8/month | Dedicated MUD host with very limited memory offerings. As for 2017, runs a 13 years old Python version (2.4) so you'd need to either convince them to update or compile yourself. Note that Evennia needs *at least* the "Deluxe" package (50MB RAM) and probably *a lot* higher for a production game. This host is *not* recommended for Evennia.|
| [Host1Plus][5] | VPS & Cloud | $4/month | $4-$8/month depending on length of sign-up period.
| [Scaleway][6] | Cloud | &euro;3/month / on-demand | EU based (Paris, Amsterdam). Smallest option provides 2GB RAM. |
| [Prgmr][10] | VPS | $5/month | 1 month free with a year prepay. You likely want some experience with servers with this option as they don't have a lot of support.|
| [Linode][11] | Cloud | $5/month / on-demand | Multiple regions. Smallest option provides 1GB RAM|
+------------------------+----------------+----------------+----------------------------------------------------------+
| Hosting name | Type | Lowest price | Comments |
+========================+================+================+==========================================================+
| `silvren.com`_ | Shell account | Free for MU* | Private hobby provider so don't assume backups or expect |
| | | | immediate support. To ask for an account, connect with a |
| | | | MUD client to iweb.localecho.net, port 4201 and ask for |
| | | | "Jarin". |
+------------------------+----------------+----------------+----------------------------------------------------------+
| `Digital Ocean`_ | VPS | $5/month | You get a credit if you use the referral link |
| | | | https://m.do.co/c/8f64fec2670c - if you do, once you've |
| | | | had it long enough to have paid $25 we will get that as |
| | | | a referral bonus to help Evennia development! |
+------------------------+----------------+----------------+----------------------------------------------------------+
+`Amazon Web services`_ | Cloud | $5/month / | Free Tier first 12 months. Regions available around the |
| | | on-demand | globe. |
+------------------------+----------------+----------------+----------------------------------------------------------+
| `Amazon Lightsail`_ | Cloud | $5/month | Free first month. AWS's new "fixed cost" offering. |
+------------------------+----------------+----------------+----------------------------------------------------------+
| `Host1Plus`_ | VPS & Cloud | $4/month | $4-$8/month depending on length of sign-up period. |
+------------------------+----------------+----------------+----------------------------------------------------------+
| `Scaleway`_ | Cloud | &euro;3/month /| EU based (Paris, Amsterdam). Smallest option |
| | | on-demand | provides 2GB RAM. |
+------------------------+----------------+----------------+----------------------------------------------------------+
| `Prgmr`_ | VPS | $5/month | 1 month free with a year prepay. You likely want some |
| | | | experience with servers with this option as they don't |
| | | | have a lot of support. |
+------------------------+----------------+----------------+----------------------------------------------------------+
| `Linode`_ | Cloud | $5/month / | Multiple regions. Smallest option provides 1GB RAM |
| | | on-demand | |
+------------------------+----------------+----------------+----------------------------------------------------------+
| `Genesis MUD hosting`_ | Shell account | $8/month | Dedicated MUD host with very limited memory offerings. |
| | | | When last investigated (2017) ran a 13 years old Python |
| | | | version (2.4) (convince them to update or compile). |
| | | | Note that Evennia needs *at least* the "Deluxe" package |
| | | | (50MB RAM) and probably *a lot* higher for a production |
| | | | game. This host is *not* recommended for Evennia. |
+------------------------+----------------+----------------+----------------------------------------------------------+
.. _silvren.com: http:silvren.com
.. _Digital Ocean: https://www.digitalocean.com/pricing
.. _Amazon Web services: https://aws.amazon.com/pricing/
.. _Host1Plus: https://www.host1plus.com/
.. _Scaleway: https://www.scaleway.com/
.. _Amazon Lightsail: https://amazonlightsail.com
.. _Prgmr: https://prgmr.com/
.. _Linode: https://www.linode.com/
.. _Genesis MUD hosting: http://www.genesismuds.com/
```
*Please help us expand this list.*
*Please help us expand this list.*
[1]: https://silvren.com
[2]: https://www.digitalocean.com/pricing
[3]: https://aws.amazon.com/pricing/
[4]: https://www.genesismuds.com/
[5]: https://www.host1plus.com/
[6]: https://www.scaleway.com/
[7]: https://lowendbox.com/
[8]: https://www.lowendtalk.com
[9]: https://amazonlightsail.com
[10]: https://prgmr.com/
[11]: https://www.linode.com/
## Cloud9
@ -451,4 +420,3 @@ Note that, as of December 2017, Cloud9 was re-released by Amazon as a service wi
service offering. New customers entitled to the 1 year AWS "free tier" may find it provides
sufficient resources to operate a Cloud9 development environment without charge.
https://aws.amazon.com/cloud9/

View file

@ -2,7 +2,7 @@
This tutorial will elaborate on the many ways one can parse command arguments. The first step after
[adding a command](./Adding-Command-Tutorial) usually is to parse its arguments. There are lots of
[adding a command](./Adding-Command-Tutorial.md) usually is to parse its arguments. There are lots of
ways to do it, but some are indeed better than others and this tutorial will try to present them.
If you're a Python beginner, this tutorial might help you a lot. If you're already familiar with
@ -652,7 +652,7 @@ about... what is this `"book"`?
To get an object from a string, we perform an Evennia search. Evennia provides a `search` method on
all typeclassed objects (you will most likely use the one on characters or accounts). This method
supports a very wide array of arguments and has [its own tutorial](./Tutorial-Searching-For-Objects).
supports a very wide array of arguments and has [its own tutorial](./Tutorial-Searching-For-Objects.md).
Some examples of useful cases follow:
### Local searches

View file

@ -2,7 +2,7 @@
Evennia consists of two processes, known as *Portal* and *Server*. They can be controlled from
inside the game or from the command line as described [here](./Start-Stop-Reload).
inside the game or from the command line as described [here](./Start-Stop-Reload.md).
If you are new to the concept, the main purpose of separating the two is to have accounts connect to
the Portal but keep the MUD running on the Server. This way one can restart/reload the game (the

View file

@ -52,7 +52,7 @@ profiler through the launcher:
This will start Evennia with the Server component running (in daemon mode) under cProfile. You could
instead try `--profile` with the `portal` argument to profile the Portal (you would then need to
[start the Server separately](./Start-Stop-Reload)).
[start the Server separately](./Start-Stop-Reload.md)).
Please note that while the profiler is running, your process will use a lot more memory than usual.
Memory usage is even likely to climb over time. So don't leave it running perpetually but monitor it

View file

@ -7,14 +7,14 @@ and low on detail. There are countless Python guides and tutorials, books and vi
learning more in-depth - use them!
**Contents:**
- [Evennia Hello world](./Python-basic-introduction#evennia-hello-world)
- [Importing modules](./Python-basic-introduction#importing-modules)
- [Parsing Python errors](./Python-basic-introduction#parsing-python-errors)
- [Our first function](./Python-basic-introduction#our-first-function)
- [Looking at the log](./Python-basic-introduction#looking-at-the-log)
- (continued in [part 2](./Python-basic-tutorial-part-two))
- [Evennia Hello world](./Python-basic-introduction.md#evennia-hello-world)
- [Importing modules](./Python-basic-introduction.md#importing-modules)
- [Parsing Python errors](./Python-basic-introduction.md#parsing-python-errors)
- [Our first function](./Python-basic-introduction.md#our-first-function)
- [Looking at the log](./Python-basic-introduction.md#looking-at-the-log)
- (continued in [part 2](./Python-basic-tutorial-part-two.md))
This quickstart assumes you have [gotten Evennia started](./Getting-Started). You should make sure
This quickstart assumes you have [gotten Evennia started](./Getting-Started.md). You should make sure
that you are able to see the output from the server in the console from which you started it. Log
into the game either with a mud client on `localhost:4000` or by pointing a web browser to
`localhost:4001/webclient`. Log in as your superuser (the user you created during install).
@ -262,5 +262,5 @@ enter `Ctrl-C` or `Cmd-C` depending on your system. As a game dev it is importa
log output when working in Evennia - many errors will only appear with full details here. You may
sometimes have to scroll up in the history if you miss it.
This tutorial is continued in [Part 2](./Python-basic-tutorial-part-two), where we'll start learning
This tutorial is continued in [Part 2](./Python-basic-tutorial-part-two.md), where we'll start learning
about objects and to explore the Evennia library.

View file

@ -1,16 +1,16 @@
# Python basic tutorial part two
[In the first part](./Python-basic-introduction) of this Python-for-Evennia basic tutorial we learned
[In the first part](./Python-basic-introduction.md) of this Python-for-Evennia basic tutorial we learned
how to run some simple Python code from inside the game. We also made our first new *module*
containing a *function* that we called. Now we're going to start exploring the very important
subject of *objects*.
**Contents:**
- [On the subject of objects](./Python-basic-tutorial-part-two#on-the-subject-of-objects)
- [Exploring the Evennia library](./Python-basic-tutorial-part-two#exploring-the-evennia-library)
- [Tweaking our Character class](./Python-basic-tutorial-part-two#tweaking-our-character-class)
- [The Evennia shell](./Python-basic-tutorial-part-two#the-evennia-shell)
- [Where to go from here](./Python-basic-tutorial-part-two#where-to-go-from-here)
- [On the subject of objects](./Python-basic-tutorial-part-two.md#on-the-subject-of-objects)
- [Exploring the Evennia library](./Python-basic-tutorial-part-two.md#exploring-the-evennia-library)
- [Tweaking our Character class](./Python-basic-tutorial-part-two.md#tweaking-our-character-class)
- [The Evennia shell](./Python-basic-tutorial-part-two.md#the-evennia-shell)
- [Where to go from here](./Python-basic-tutorial-part-two.md#where-to-go-from-here)
### On the subject of objects
@ -170,7 +170,7 @@ There are lots of things in there. There are some docs but most of those have to
distribution of Evennia and does not concern us right now. The `evennia` subfolder is what we are
looking for. *This* is what you are accessing when you do `from evennia import ...`. It's set up by
Evennia as a good place to find modules when the server starts. The exact layout of the Evennia
library [is covered by our directory overview](./Directory-Overview#evennia-library-layout). You can
library [is covered by our directory overview](./Directory-Overview.md#evennia-library-layout). You can
also explore it [online on github](https://github.com/evennia/evennia/tree/master/evennia).
The structure of the library directly reflects how you import from it.
@ -189,7 +189,7 @@ import in Python.
Now, remember that our `characters.py` module did `from evennia import DefaultCharacter`. But if we
look at the contents of the `evennia` folder, there is no `DefaultCharacter` anywhere! This is
because Evennia gives a large number of optional "shortcuts", known as [the "flat" API](./Evennia-API). The intention is to make it easier to remember where to find stuff. The flat API is defined in
because Evennia gives a large number of optional "shortcuts", known as [the "flat" API](./Evennia-API.md). The intention is to make it easier to remember where to find stuff. The flat API is defined in
that weirdly named `__init__.py` file. This file just basically imports useful things from all over
Evennia so you can more easily find them in one place.
@ -220,7 +220,7 @@ is the same thing, just a little easier to remember.
> To access the shortcuts of the flat API you *must* use `from evennia import
> ...`. Using something like `import evennia.DefaultCharacter` will not work.
> See [more about the Flat API here](./Evennia-API).
> See [more about the Flat API here](./Evennia-API.md).
### Tweaking our Character class
@ -278,8 +278,8 @@ brief summary of the methods we find in `DefaultCharacter` (follow in the code t
roughly where things happen)::
- `basetype_setup` is called by Evennia only once, when a Character is first created. In the
`DefaultCharacter` class it sets some particular [Locks](./Locks) so that people can't pick up and
puppet Characters just like that. It also adds the [Character Cmdset](./Command-Sets) so that
`DefaultCharacter` class it sets some particular [Locks](./Locks.md) so that people can't pick up and
puppet Characters just like that. It also adds the [Character Cmdset](./Command-Sets.md) so that
Characters always can accept command-input (this should usually not be modified - the normal hook to
override is `at_object_creation`, which is called after `basetype_setup` (it's in the parent)).
- `at_after_move` makes it so that every time the Character moves, the `look` command is
@ -472,7 +472,7 @@ convenient for quickly exploring code without having to go digging through the f
This should give you a running start using Python with Evennia. If you are completely new to
programming or Python you might want to look at a more formal Python tutorial. You can find links
and resources [on our link page](./Links).
and resources [on our link page](./Links.md).
We have touched upon many of the concepts here but to use Evennia and to be able to follow along in
the code, you will need basic understanding of Python
@ -487,6 +487,6 @@ understanding of [object-oriented programming](http://www.tutorialspoint.com/pyt
and what Python [Classes](http://docs.python.org/tutorial/classes.html) are.
Once you have familiarized yourself, or if you prefer to pick Python up as you go, continue to one
of the beginning-level [Evennia tutorials](./Tutorials) to gradually build up your understanding.
of the beginning-level [Evennia tutorials](./Tutorials.md) to gradually build up your understanding.
Good luck!

View file

@ -64,7 +64,7 @@ update the database you'd need to explicitly re-assign the updated data to the `
### Commands are matched by name *or* alias
When merging [command sets](./Commands) it's important to remember that command objects are identified
When merging [command sets](./Commands.md) it's important to remember that command objects are identified
*both* by key *or* alias. So if you have a command with a key `look` and an alias `ls`, introducing
another command with a key `ls` will be assumed by the system to be *identical* to the first one.
This usually means merging cmdsets will overload one of them depending on priority. Whereas this is
@ -110,7 +110,7 @@ Try to avoid doing so.
distributions (notably Ubuntu 16.04 LTS). Zope is a dependency of Twisted. The error manifests in
the server not starting with an error that `zope.interface` is not found even though `pip list`
shows it's installed. The reason is a missing empty `__init__.py` file at the root of the zope
package. If the virtualenv is named "evenv" as suggested in the [Getting Started](./Getting-Started)
package. If the virtualenv is named "evenv" as suggested in the [Getting Started](./Getting-Started.md)
instructions, use the following command to fix it:
```shell

View file

@ -44,4 +44,4 @@ switch:
@rss2chan/delete rss = https://github.com/evennia/evennia/commits/master.atom
You can connect any number of RSS feeds to a channel this way. You could also connect them to the
same channels as [IRC](./IRC) to have the feed echo to external chat channels as well.
same channels as [IRC](./IRC.md) to have the feed echo to external chat channels as well.

View file

@ -34,7 +34,7 @@ evennia|docker /usr/src/game $
This is a normal shell prompt. We are in the `/usr/src/game` location inside the docker container.
If you had anything in the folder you started from, you should see it here (with `ls`) since we
mounted the current directory to `/usr/src/game` (with `-v` above). You have the `evennia` command
available and can now proceed to create a new game as per the [Getting Started](./Getting-Started)
available and can now proceed to create a new game as per the [Getting Started](./Getting-Started.md)
instructions (you can skip the virtualenv and install 'globally' in the container though).
You can run Evennia from inside this container if you want to, it's like you are root in a little

View file

@ -4,7 +4,7 @@
![evennia_screenshot2017](https://user-images.githubusercontent.com/294267/30773728-ea45afb6-a076-11e7-8820-49be2168a6b8.png)
*(right-click and choose your browser's equivalent of "view image" to see it full size)*
This screenshot shows a vanilla [install](./Getting-Started) of the just started Evennia MUD server.
This screenshot shows a vanilla [install](./Getting-Started.md) of the just started Evennia MUD server.
In the bottom window we can see the log messages from the running server.
In the top left window we see the default website of our new game displayed in a web browser (it has

View file

@ -2,7 +2,7 @@
*Scripts* are the out-of-character siblings to the in-character
[Objects](./Objects). Scripts are so flexible that the "Script" is a bit limiting
[Objects](./Objects.md). Scripts are so flexible that the "Script" is a bit limiting
- we had to pick something to name them after all. Other possible names
(depending on what you'd use them for) would be `OOBObjects`,
`StorageContainers` or `TimerObjects`.
@ -14,7 +14,7 @@ Scripts can be used for many different things in Evennia:
- They can work as timers and tickers - anything that may change with Time. But
they can also have no time dependence at all. Note though that if all you want
is just to have an object method called repeatedly, you should consider using
the [TickerHandler](./TickerHandler) which is more limited but is specialized on
the [TickerHandler](./TickerHandler.md) which is more limited but is specialized on
just this task.
- They can describe State changes. A Script is an excellent platform for
hosting a persistent, but unique system handler. For example, a Script could be
@ -22,11 +22,11 @@ used as the base to track the state of a turn-based combat system. Since
Scripts can also operate on a timer they can also update themselves regularly
to perform various actions.
- They can act as data stores for storing game data persistently in the database
(thanks to its ability to have [Attributes](./Attributes)).
(thanks to its ability to have [Attributes](./Attributes.md)).
- They can be used as OOC stores for sharing data between groups of objects, for
example for tracking the turns in a turn-based combat system or barter exchange.
Scripts are [Typeclassed](./Typeclasses) entities and are manipulated in a similar
Scripts are [Typeclassed](./Typeclasses.md) entities and are manipulated in a similar
way to how it works for other such Evennia entities:
```python
@ -41,7 +41,7 @@ list_of_myscript = evennia.search_script("myscript")
## Defining new Scripts
A Script is defined as a class and is created in the same way as other
[typeclassed](./Typeclasses) entities. The class has several properties
[typeclassed](./Typeclasses.md) entities. The class has several properties
to control the timer-component of the scripts. These are all _optional_ -
leaving them out will just create a Script with no timer components (useful to act as
a database store or to hold a persistent game system, for example).
@ -104,7 +104,7 @@ If we put this script on a room, it will randomly report some weather
to everyone in the room every 5 minutes.
To activate it, just add it to the script handler (`scripts`) on an
[Room](./Objects). That object becomes `self.obj` in the example above. Here we
[Room](./Objects.md). That object becomes `self.obj` in the example above. Here we
put it on a room called `myroom`:
```
@ -115,7 +115,7 @@ put it on a room called `myroom`:
> Therefore we don't need to give the full path (`typeclasses.scripts.Weather`
> but only `scripts.Weather` above.
If you wanted to stop and delete that script on the [Room](./Objects). You could do that
If you wanted to stop and delete that script on the [Room](./Objects.md). You could do that
with the script handler by passing the `delete` method with the script key (`self.key`) as:
```
@ -153,7 +153,7 @@ command in-game.
## Properties and functions defined on Scripts
A Script has all the properties of a typeclassed object, such as `db` and `ndb`(see
[Typeclasses](./Typeclasses)). Setting `key` is useful in order to manage scripts (delete them by name
[Typeclasses](./Typeclasses.md)). Setting `key` is useful in order to manage scripts (delete them by name
etc). These are usually set up in the Script's typeclass, but can also be assigned on the fly as
keyword arguments to `evennia.create_script`.
@ -173,7 +173,7 @@ after the reload is complete).
There is one special property:
- `obj` - the [Object](./Objects) this script is attached to (if any). You should not need to set
- `obj` - the [Object](./Objects.md) this script is attached to (if any). You should not need to set
this manually. If you add the script to the Object with `myobj.scripts.add(myscriptpath)` or give
`myobj` as an argument to the `utils.create.create_script` function, the `obj` property will be set
to `myobj` for you.

View file

@ -131,7 +131,7 @@ Now the only ports open will be your administrative ssh port (whichever you chos
4000-4001.
### Use an external webserver
Though not officially supported, there are some benefits to [deploying a webserver](./Apache-Config)
Though not officially supported, there are some benefits to [deploying a webserver](./Apache-Config.md)
to handle/proxy traffic to your Evennia instance.
For example, Evennia's game engine and webservice are tightly integrated. If you bring your game

View file

@ -8,7 +8,7 @@ ways to customize the server and expand it with your own plugins.
The "Settings" file referenced throughout the documentation is the file
`mygame/server/conf/settings.py`. This is automatically created on the first run of `evennia --init`
(see the [Getting Started](./Getting-Started) page).
(see the [Getting Started](./Getting-Started.md) page).
Your new `settings.py` is relatively bare out of the box. Evennia's core settings file is actually
[evennia/settings_default.py](https://github.com/evennia/evennia/blob/master/evennia/settings_default
@ -66,15 +66,15 @@ other things that must run in your game but which has no database persistence.
- `connection_screens.py` - all global string variables in this module are interpreted by Evennia as
a greeting screen to show when an Account first connects. If more than one string variable is
present in the module a random one will be picked.
- `inlinefuncs.py` - this is where you can define custom [Inline functions](./TextTags#inlinefuncs).
- `inputfuncs.py` - this is where you define custom [Input functions](./Inputfuncs) to handle data
- `inlinefuncs.py` - this is where you can define custom [Inline functions](./TextTags.md#inline-functions).
- `inputfuncs.py` - this is where you define custom [Input functions](./Inputfuncs.md) to handle data
from the client.
- `lockfuncs.py` - this is one of many possible modules to hold your own "safe" *lock functions* to
make available to Evennia's [Locks](./Locks).
make available to Evennia's [Locks](./Locks.md).
- `mssp.py` - this holds meta information about your game. It is used by MUD search engines (which
you often have to register with) in order to display what kind of game you are running along with
statistics such as number of online accounts and online status.
- `oobfuncs.py` - in here you can define custom [OOB functions](./OOB).
- `oobfuncs.py` - in here you can define custom [OOB functions](./OOB.md).
- `portal_services_plugin.py` - this allows for adding your own custom services/protocols to the
Portal. It must define one particular function that will be called by Evennia at startup. There can
be any number of service plugin modules, all will be imported and used if defined. More info can be

View file

@ -5,14 +5,14 @@ An Evennia *Session* represents one single established connection to the server.
Evennia session, it is possible for a person to connect multiple times, for example using different
clients in multiple windows. Each such connection is represented by a session object.
A session object has its own [cmdset](./Command-Sets), usually the "unloggedin" cmdset. This is what
A session object has its own [cmdset](./Command-Sets.md), usually the "unloggedin" cmdset. This is what
is used to show the login screen and to handle commands to create a new account (or
[Account](./Accounts) in evennia lingo) read initial help and to log into the game with an existing
[Account](./Accounts.md) in evennia lingo) read initial help and to log into the game with an existing
account. A session object can either be "logged in" or not. Logged in means that the user has
authenticated. When this happens the session is associated with an Account object (which is what
holds account-centric stuff). The account can then in turn puppet any number of objects/characters.
> Warning: A Session is not *persistent* - it is not a [Typeclass](./Typeclasses) and has no
> Warning: A Session is not *persistent* - it is not a [Typeclass](./Typeclasses.md) and has no
connection to the database. The Session will go away when a user disconnects and you will lose any
custom data on it if the server reloads. The `.db` handler on Sessions is there to present a uniform
API (so you can assume `.db` exists even if you don't know if you receive an Object or a Session),
@ -26,13 +26,13 @@ Here are some important properties available on (Server-)Sessions
- `sessid` - The unique session-id. This is an integer starting from 1.
- `address` - The connected client's address. Different protocols give different information here.
- `logged_in` - `True` if the user authenticated to this session.
- `account` - The [Account](./Accounts) this Session is attached to. If not logged in yet, this is
- `account` - The [Account](./Accounts.md) this Session is attached to. If not logged in yet, this is
`None`.
- `puppet` - The [Character/Object](./Objects) currently puppeted by this Account/Session combo. If
- `puppet` - The [Character/Object](./Objects.md) currently puppeted by this Account/Session combo. If
not logged in or in OOC mode, this is `None`.
- `ndb` - The [Non-persistent Attribute](./Attributes) handler.
- `ndb` - The [Non-persistent Attribute](./Attributes.md) handler.
- `db` - As noted above, Sessions don't have regular Attributes. This is an alias to `ndb`.
- `cmdset` - The Session's [CmdSetHandler](./Command-Sets)
- `cmdset` - The Session's [CmdSetHandler](./Command-Sets.md)
Session statistics are mainly used internally by Evennia.
@ -99,7 +99,7 @@ transparently detect which session was triggering the command (if any) and redir
`command.msg()` is often the safest bet.
You can get the `session` in two main ways:
* [Accounts](./Accounts) and [Objects](./Objects) (including Characters) have a `sessions` property.
* [Accounts](./Accounts.md) and [Objects](./Objects.md) (including Characters) have a `sessions` property.
This is a *handler* that tracks all Sessions attached to or puppeting them. Use e.g.
`accounts.sessions.get()` to get a list of Sessions attached to that entity.
* A Command instance has a `session` property that always points back to the Session that triggered
@ -132,7 +132,7 @@ changes carefully.
*Note: This is considered an advanced topic. You don't need to know this on a first read-through.*
Evennia is split into two parts, the [Portal and the Server](./Portal-And-Server). Each side tracks
Evennia is split into two parts, the [Portal and the Server](./Portal-And-Server.md). Each side tracks
its own Sessions, syncing them to each other.
The "Session" we normally refer to is actually the `ServerSession`. Its counter-part on the Portal
@ -172,7 +172,7 @@ server reboot (assuming the Portal is not stopped at the same time, obviously).
Both the Portal and Server each have a *sessionhandler* to manage the connections. These handlers
are global entities contain all methods for relaying data across the AMP bridge. All types of
Sessions hold a reference to their respective Sessionhandler (the property is called
`sessionhandler`) so they can relay data. See [protocols](./Custom-Protocols) for more info
`sessionhandler`) so they can relay data. See [protocols](./Custom-Protocols.md) for more info
on building new protocols.
To get all Sessions in the game (i.e. all currently connected clients), you access the server-side

View file

@ -69,7 +69,7 @@ be extracted from the `**kwargs` dict in the signal handler.
used way for users to themselves create accounts during login. It passes and extra kwarg `ip` with
the client IP of the connecting account.
- `SIGNAL_ACCOUNT_POST_LOGIN` - this will always fire when the account has authenticated. Sends
extra kwarg `session` with the new [Session](./Sessions) object involved.
extra kwarg `session` with the new [Session](./Sessions.md) object involved.
- `SIGNAL_ACCCOUNT_POST_FIRST_LOGIN` - this fires just before `SIGNAL_ACCOUNT_POST_LOGIN` but only
if
this is the *first* connection done (that is, if there are no previous sessions connected). Also

View file

@ -90,5 +90,5 @@ Adding advanced and flexible building commands to your game is easy and will pro
satisfy most creative builders. However, if you really, *really* want to offer online coding, there
is of course nothing stopping you from adding that to Evennia, no matter our recommendations. You
could even re-implement MUX' softcode in Python should you be very ambitious. The
[in-game-python](./Dialogues-in-events) is an optional
[in-game-python](./Dialogues-in-events.md) is an optional
pseudo-softcode plugin aimed at developers wanting to script their game from inside it.

View file

@ -2,10 +2,10 @@
The *spawner* is a system for defining and creating individual objects from a base template called a
*prototype*. It is only designed for use with in-game [Objects](./Objects), not any other type of
*prototype*. It is only designed for use with in-game [Objects](./Objects.md), not any other type of
entity.
The normal way to create a custom object in Evennia is to make a [Typeclass](./Typeclasses). If you
The normal way to create a custom object in Evennia is to make a [Typeclass](./Typeclasses.md). If you
haven't read up on Typeclasses yet, think of them as normal Python classes that save to the database
behind the scenes. Say you wanted to create a "Goblin" enemy. A common way to do this would be to
first create a `Mobile` typeclass that holds everything common to mobiles in the game, like generic
@ -105,12 +105,12 @@ instead.
exist.
- `destination` - a valid `#dbref`. Only used by exits.
- `permissions` - list of permission strings, like `["Accounts", "may_use_red_door"]`
- `locks` - a [lock-string](./Locks) like `"edit:all();control:perm(Builder)"`
- `locks` - a [lock-string](./Locks.md) like `"edit:all();control:perm(Builder)"`
- `aliases` - list of strings for use as aliases
- `tags` - list [Tags](./Tags). These are given as tuples `(tag, category, data)`.
- `attrs` - list of [Attributes](./Attributes). These are given as tuples `(attrname, value,
- `tags` - list [Tags](./Tags.md). These are given as tuples `(tag, category, data)`.
- `attrs` - list of [Attributes](./Attributes.md). These are given as tuples `(attrname, value,
category, lockstring)`
- Any other keywords are interpreted as non-category [Attributes](./Attributes) and their values.
- Any other keywords are interpreted as non-category [Attributes](./Attributes.md) and their values.
This is
convenient for simple Attributes - use `attrs` for full control of Attributes.
@ -119,7 +119,7 @@ Deprecated as of Evennia 0.8:
- `ndb_<name>` - sets the value of a non-persistent attribute (`"ndb_"` is stripped from the name).
This is simply not useful in a prototype and is deprecated.
- `exec` - This accepts a code snippet or a list of code snippets to run. This should not be used -
use callables or [$protfuncs](./Spawner-and-Prototypes#protfuncs) instead (see below).
use callables or [$protfuncs](./Spawner-and-Prototypes.md#protfuncs) instead (see below).
### Prototype values
@ -161,7 +161,7 @@ that you embed in strings and that has a `$` in front, like
```
At execution time, the place of the protfunc will be replaced with the result of that protfunc being
called (this is always a string). A protfunc works in much the same way as an
[InlineFunc](./TextTags#inline-functions) - they are actually
[InlineFunc](./TextTags.md#inline-functions) - they are actually
parsed using the same parser - except protfuncs are run every time the prototype is used to spawn a
new object (whereas an inlinefunc is called when a text is returned to the user).
@ -233,7 +233,7 @@ A prototype can be defined and stored in two ways, either in the database or as
### Database prototypes
Stored as [Scripts](./Scripts) in the database. These are sometimes referred to as *database-
Stored as [Scripts](./Scripts.md) in the database. These are sometimes referred to as *database-
prototypes* This is the only way for in-game builders to modify and add prototypes. They have the
advantage of being easily modifiable and sharable between builders but you need to work with them
using in-game tools.

View file

@ -3,10 +3,10 @@
You control Evennia from your game folder (we refer to it as `mygame/` here), using the `evennia`
program. If the `evennia` program is not available on the command line you must first install
Evennia as described in the [Getting Started](./Getting-Started) page.
Evennia as described in the [Getting Started](./Getting-Started.md) page.
> Hint: If you ever try the `evennia` command and get an error complaining that the command is not
available, make sure your [virtualenv](./Glossary#virtualenv) is active.
available, make sure your [virtualenv](./Glossary.md#virtualenv) is active.
Below are described the various management options. Run
@ -20,7 +20,7 @@ to give you a menu with options.
## Starting Evennia
Evennia consists of two components, the Evennia [Server and Portal](./Portal-And-Server). Briefly,
Evennia consists of two components, the Evennia [Server and Portal](./Portal-And-Server.md). Briefly,
the *Server* is what is running the mud. It handles all game-specific things but doesn't care
exactly how players connect, only that they have. The *Portal* is a gateway to which players
connect. It knows everything about telnet, ssh, webclient protocols etc but very little about the
@ -67,7 +67,7 @@ reboots. Since they are connected to the *Portal*, their connections are not los
Reloading is as close to a "warm reboot" you can get. It reinitializes all code of Evennia, but
doesn't kill "persistent" [Scripts](./Scripts). It also calls `at_server_reload()` hooks on all
doesn't kill "persistent" [Scripts](./Scripts.md). It also calls `at_server_reload()` hooks on all
objects so you
can save eventual temporary properties you want.

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