mirror of
https://github.com/evennia/evennia.git
synced 2026-03-16 21:06:30 +01:00
Convert master docs to use MyST
This commit is contained in:
parent
6e03216cd9
commit
d229ff024c
359 changed files with 3275 additions and 4567 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
31
docs/pylib/api_rst2md.py
Executable 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))
|
||||
|
|
@ -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.")
|
||||
|
||||
|
|
|
|||
|
|
@ -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
45
docs/pylib/fmtwidth.py
Normal 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.")
|
||||
111
docs/pylib/update_default_cmd_index.py
Normal file
111
docs/pylib/update_default_cmd_index.py
Normal 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()
|
||||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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__`.
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -28,9 +28,9 @@ Before we continue, let’s 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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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`.
|
||||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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?
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
107
docs/source/Default-Commands.md
Normal file
107
docs/source/Default-Commands.md
Normal 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_)
|
||||
|
||||
|
|
@ -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.
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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 (it’s 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 (it’s not very MUSH-
|
||||
like but it does show many Evennia concepts in action). Beyond that there are [many more
|
||||
tutorials](Tutorials) to try out. If you feel you want a more visual overview you can also look at
|
||||
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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)!
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
||||
|
|
|
|||
|
|
@ -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!
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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).
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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 ...
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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).
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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).
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 | €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 | €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/
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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!
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@
|
|||

|
||||
*(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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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
Loading…
Add table
Add a link
Reference in a new issue