from evennia.contrib.base_systems import building_menu
@@ -266,52 +267,52 @@ copy its entire folder to your game directory and modify/use it from there.
crafting |
custom_gametime |
+debugpy |
dice |
email_login |
evadventure |
-evscaperoom |
-extended_room |
+
evscaperoom |
+extended_room |
fieldfill |
gendersub |
git_integration |
-godotwebsocket |
-health_bar |
+
godotwebsocket |
+health_bar |
ingame_map_display |
ingame_python |
ingame_reports |
-llm |
-mail |
+
llm |
+mail |
mapbuilder |
menu_login |
mirror |
-multidescer |
-mux_comms_cmds |
+
multidescer |
+mux_comms_cmds |
name_generator |
puzzles |
random_string_generator |
-red_button |
-rpsystem |
+
red_button |
+rpsystem |
simpledoor |
slow_exit |
storage |
-talking_npc |
-traits |
+
talking_npc |
+traits |
tree_select |
turnbattle |
tutorial_world |
-unixcommand |
-wilderness |
+
unixcommand |
+wilderness |
xyzgrid |
|
|
- |
@@ -843,6 +844,7 @@ is a great way to start learning the system.
- Input/Output Auditing
+- DebugPy VSCode debugger integration
- Easy fillable form
- In-game Git Integration
- Random Name Generator
@@ -858,6 +860,13 @@ server and passes it to a callback of your choosing. This is intended for
quality assurance, post-incident investigations and debugging.
Read the documentation - Browse the Code
+
+debugpy
+Contribution by electroglyph, 2025
+This registers an in-game command debugpy which starts the debugpy debugger and listens on port 5678.
+For now this is only available for Visual Studio Code (VS Code).
+Read the documentation - Browse the Code
+
fieldfill
Contribution by Tim Ashley Jenkins, 2018
diff --git a/docs/latest/_modules/evennia/commands/default/batchprocess.html b/docs/latest/_modules/evennia/commands/default/batchprocess.html
index 34a37dd778..06310c4d9e 100644
--- a/docs/latest/_modules/evennia/commands/default/batchprocess.html
+++ b/docs/latest/_modules/evennia/commands/default/batchprocess.html
@@ -113,7 +113,6 @@
import re
from django.conf import settings
-
from evennia.commands.cmdset import CmdSet
from evennia.utils import logger, utils
from evennia.utils.batchprocessors import BATCHCMD, BATCHCODE
@@ -504,7 +503,7 @@
key = "ll"
help_category = "BatchProcess"
- locks = "cmd:perm(batchcommands)"
+ locks = "cmd:perm(batchcommands) or perm(Developer)"
def func(self):
show_curr(self.caller, showall=True)
diff --git a/docs/latest/_modules/evennia/objects/objects.html b/docs/latest/_modules/evennia/objects/objects.html
index 97939efb2b..a3ff5e338c 100644
--- a/docs/latest/_modules/evennia/objects/objects.html
+++ b/docs/latest/_modules/evennia/objects/objects.html
@@ -102,11 +102,10 @@
import typing
from collections import defaultdict
+import evennia
import inflect
from django.conf import settings
from django.utils.translation import gettext as _
-
-import evennia
from evennia.commands import cmdset
from evennia.commands.cmdsethandler import CmdSetHandler
from evennia.objects.manager import ObjectManager
diff --git a/docs/latest/_modules/evennia/server/evennia_launcher.html b/docs/latest/_modules/evennia/server/evennia_launcher.html
index 889a9e1070..79ebdbcb91 100644
--- a/docs/latest/_modules/evennia/server/evennia_launcher.html
+++ b/docs/latest/_modules/evennia/server/evennia_launcher.html
@@ -340,7 +340,7 @@
ERROR_DATABASE = """
ERROR: Your database does not exist or is not set up correctly.
- Missing tables: {missing_tables}
+ (error was '{traceback}')
If you think your database should work, make sure you are running your
commands from inside your game directory. If this error persists, run
@@ -912,7 +912,7 @@
if response:
_, _, _, _, pinfo, sinfo = response
_print_info(pinfo, sinfo)
- _reactor_stop()
+ _reactor_stop()
def _portal_started(*args):
print(
@@ -1552,15 +1552,9 @@
[docs]def create_superuser():
"""
-
Auto-create the superuser account. Returns `True` if superuser was created.
+
Create the superuser account
"""
-
from evennia.accounts.models import AccountDB
-
-
if AccountDB.objects.filter(is_superuser=True).exists():
-
# if superuser already exists, do nothing here
-
return False
-
print(
"\nCreate a superuser below. The superuser is Account #1, the 'owner' "
"account of the server. Email is optional and can be empty.\n"
@@ -1572,95 +1566,79 @@
password = environ.get("EVENNIA_SUPERUSER_PASSWORD")
if (username is not None) and (password is not None) and len(password) > 0:
+
from evennia.accounts.models import AccountDB
superuser = AccountDB.objects.create_superuser(username, email, password)
superuser.save()
else:
-
django.core.management.call_command("createsuperuser", interactive=True)
-
-
return True
+ django.core.management.call_command("createsuperuser", interactive=True)
[docs]def check_database(always_return=False):
"""
-
Check if the database exists and has basic tables. This is only run by the launcher.
+
Check so the database exists.
Args:
-
always_return (bool, optional): If True, will not raise exceptions on errors.
-
+
always_return (bool, optional): If set, will always return True/False
+
also on critical errors. No output will be printed.
Returns:
-
exists (bool): `True` if database exists and seems set up, `False` otherwise.
-
If `always_return` is `False`, this will raise exceptions instead of
-
returning `False`.
+
exists (bool): `True` if the database exists, otherwise `False`.
+
+
"""
-
# Check if database exists
-
from django.conf import settings
+
# Check so a database exists and is accessible
from django.db import connection
-
tables_to_check = [
-
"accounts_accountdb", # base account table
-
"objects_objectdb", # base object table
-
"scripts_scriptdb", # base script table
-
"typeclasses_tag", # base tag table
-
]
+
tables = connection.introspection.get_table_list(connection.cursor())
+
if not tables or not isinstance(tables[0], str): # django 1.8+
+
tables = [tableinfo.name for tableinfo in tables]
+
if tables and "accounts_accountdb" in tables:
+
# database exists and seems set up. Initialize evennia.
+
evennia._init()
+
# Try to get Account#1
+
from evennia.accounts.models import AccountDB
try:
-
with connection.cursor() as cursor:
-
# Get all table names in the database
-
if connection.vendor == "postgresql":
-
cursor.execute(
-
"""
-
SELECT tablename FROM pg_tables
-
WHERE schemaname = 'public'
-
"""
-
)
-
elif connection.vendor == "mysql":
-
cursor.execute(
-
"""
-
SELECT table_name FROM information_schema.tables
-
WHERE table_schema = %s
-
""",
-
[settings.DATABASES["default"]["NAME"]],
-
)
-
elif connection.vendor == "sqlite":
-
cursor.execute(
-
"""
-
SELECT name FROM sqlite_master
-
WHERE type='table' AND name NOT LIKE 'sqlite_%'
-
"""
-
)
-
else:
-
if not always_return:
-
raise Exception(
-
f"Unsupported database: {connection.vendor}"
-
"Evennia supports PostgreSQL, MySQL, and SQLite only."
-
)
-
return False
+
AccountDB.objects.get(id=1)
+
except (django.db.utils.OperationalError, ProgrammingError) as e:
+
if always_return:
+
return False
+
print(ERROR_DATABASE.format(traceback=e))
+
sys.exit()
+
except AccountDB.DoesNotExist:
+
# no superuser yet. We need to create it.
-
existing_tables = {row[0].lower() for row in cursor.fetchall()}
+
other_superuser = AccountDB.objects.filter(is_superuser=True)
+
if other_superuser:
+
# Another superuser was found, but not with id=1. This may
+
# happen if using flush (the auto-id starts at a higher
+
# value). Wwe copy this superuser into id=1. To do
+
# this we must deepcopy it, delete it then save the copy
+
# with the new id. This allows us to avoid the UNIQUE
+
# constraint on usernames.
+
other = other_superuser[0]
+
other_id = other.id
+
other_key = other.username
+
print(WARNING_MOVING_SUPERUSER.format(other_key=other_key, other_id=other_id))
+
res = ""
+
while res.upper() != "Y":
+
# ask for permission
+
res = eval(input("Continue [Y]/N: "))
+
if res.upper() == "N":
+
sys.exit()
+
elif not res:
+
break
+
# continue with the
+
from copy import deepcopy
-
# Check if essential tables exist
-
missing_tables = [table for table in tables_to_check if table not in existing_tables]
-
-
if missing_tables:
-
if always_return:
-
return False
-
raise Exception(
-
f"Database tables missing: {', '.join(missing_tables)}. "
-
"\nDid you remember to run migrations?"
-
)
-
else:
-
create_superuser()
-
-
return True
-
-
except Exception as exc:
-
if not always_return:
-
raise
-
import traceback
-
-
traceback.print_exc()
-
return False
+ new = deepcopy(other)
+ other.delete()
+ new.id = 1
+ new.save()
+ else:
+ create_superuser()
+ check_database(always_return=always_return)
+ return True
[docs]def getenv():
@@ -1902,12 +1880,11 @@
else:
os.environ["DJANGO_SETTINGS_MODULE"] = SETTINGS_DOTPATH
+
# required since django1.7
+
django.setup()
+
# test existence of the settings module
try:
-
-
# required since django1.7
-
django.setup()
-
from django.conf import settings
except Exception as ex:
if not str(ex).startswith("No module named"):
@@ -1920,7 +1897,6 @@
# this will both check the database and initialize the evennia dir.
if check_db:
check_database()
-
evennia._init()
# if we don't have to check the game directory, return right away
if not need_gamedir:
diff --git a/docs/latest/_modules/evennia/utils/containers.html b/docs/latest/_modules/evennia/utils/containers.html
index 153e10b6c1..eda3d100c0 100644
--- a/docs/latest/_modules/evennia/utils/containers.html
+++ b/docs/latest/_modules/evennia/utils/containers.html
@@ -106,7 +106,6 @@
from django.conf import settings
from django.db.utils import OperationalError, ProgrammingError
-
from evennia.scripts.models import ScriptDB
from evennia.utils import logger
from evennia.utils.utils import callables_from_module, class_from_module
@@ -342,7 +341,7 @@
"""
if not self.loaded:
self.load_data()
-
managed_scripts = list(self.loaded_data.values())
+
managed_scripts = [self._load_script(key) for key in self.typeclass_storage.keys()]
unmanaged_scripts = list(
ScriptDB.objects.filter(db_obj__isnull=True).exclude(
id__in=[scr.id for scr in managed_scripts]
diff --git a/docs/latest/_modules/evennia/utils/utils.html b/docs/latest/_modules/evennia/utils/utils.html
index 4b5e9801ad..dd0091a273 100644
--- a/docs/latest/_modules/evennia/utils/utils.html
+++ b/docs/latest/_modules/evennia/utils/utils.html
@@ -119,6 +119,8 @@
from os.path import join as osjoin
from string import punctuation
from unicodedata import east_asian_width
+
from collections.abc import Callable
+
from typing import Generic, TypeVar, overload
from django.apps import apps
from django.conf import settings
@@ -2272,8 +2274,10 @@
# lazy load handler
_missing = object()
+
TProp = TypeVar("TProp")
-
[docs]class lazy_property:
+
+
[docs]class lazy_property(Generic[TProp]):
"""
Delays loading of property until first access. Credit goes to the
Implementation in the werkzeug suite:
@@ -2294,18 +2298,24 @@
"""
-
[docs] def __init__(self, func, name=None, doc=None):
+
[docs] def __init__(self, func: Callable[..., TProp], name=None, doc=None):
"""Store all properties for now"""
self.__name__ = name or func.__name__
self.__module__ = func.__module__
self.__doc__ = doc or func.__doc__
self.func = func
-
def __get__(self, obj, type=None):
+
@overload
+
def __get__(self, obj: None, type=None) -> "lazy_property": ...
+
+
@overload
+
def __get__(self, obj, type=None) -> TProp: ...
+
+
def __get__(self, obj, type=None) -> TProp | "lazy_property":
"""Triggers initialization"""
if obj is None:
return self
-
value = obj.__dict__.get(self.__name__, _missing)
+
value: TProp = obj.__dict__.get(self.__name__, _missing)
if value is _missing:
value = self.func(obj)
obj.__dict__[self.__name__] = value
diff --git a/docs/latest/_sources/Coding/Changelog.md.txt b/docs/latest/_sources/Coding/Changelog.md.txt
index 361cc75197..5f50bd0ca6 100644
--- a/docs/latest/_sources/Coding/Changelog.md.txt
+++ b/docs/latest/_sources/Coding/Changelog.md.txt
@@ -17,6 +17,7 @@ This upgrade requires running `evennia migrate` on your existing database
- [Feat][pull3756]: Updated German translation (JohnFi)
- [Feat][pull3757]: Add more i18n strings to `DefaultObject` for easier translation (JohnFi)
- [Feat][pull3783]: Support users of `ruff` linter by adding compatible config in `pyproject.toml` (jaborsh)
+- [Feat][pull3777]: New contrib `debugpy` for debugging Evennia with in VSCode with `debugpy` adapter (electroglyph)
- [Fix][pull3677]: Make sure that `DefaultAccount.create` normalizes to empty
strings instead of `None` if no name is provided, also enforce string type (InspectorCaracal)
- [Fix][pull3682]: Allow in-game help searching for commands natively starting
@@ -49,6 +50,8 @@ This upgrade requires running `evennia migrate` on your existing database
- [Fix][pull3751]: The `access` and `inventory` commands would traceback if run on a character without an Account (EliasWatson)
- [Fix][pull3768]: Make sure the `CmdCopy` command copies object categories,
since otherwise plurals were lost (jaborsh)
+- [Fix][issue3788]: `GLOBAL_SCRIPTS.all()` raised error (Griatch)
+- [Fix][issue3790]: Fix migration issue due to new db init-check code in launcher (Griatch)
- Fix: `options` setting `NOPROMPTGOAHEAD` was not possible to set (Griatch)
- Fix: Make `\\` properly preserve one backlash in funcparser (Griatch)
- Fix: The testing 'echo' inputfunc didn't work correctly; now returns both args/kwargs (Griatch)
@@ -86,8 +89,11 @@ This upgrade requires running `evennia migrate` on your existing database
[pull3757]: https://github.com/evennia/evennia/pull/3757
[pull3768]: https://github.com/evennia/evennia/pull/3768
[pull3783]: https://github.com/evennia/evennia/pull/3783
+[pull3777]: https://github.com/evennia/evennia/pull/3777
[issue3688]: https://github.com/evennia/evennia/issues/3688
[issue3687]: https://github.com/evennia/evennia/issues/3687
+[issue3788]: https://github.com/evennia/evennia/issues/3788
+[issue3790]: https://github.com/evennia/evennia/issues/3790
diff --git a/docs/latest/_sources/Coding/Debugging.md.txt b/docs/latest/_sources/Coding/Debugging.md.txt
index 7fc291e471..cd168a2ca8 100644
--- a/docs/latest/_sources/Coding/Debugging.md.txt
+++ b/docs/latest/_sources/Coding/Debugging.md.txt
@@ -251,4 +251,10 @@ this directly). |
| `
` | Repeat the last command (don't type `n` repeatedly, just type it once and then press
`` to repeat it). |
-If you want to learn more about debugging with Pdb, you will find an [interesting tutorial on that topic here](https://pymotw.com/3/pdb/).
\ No newline at end of file
+If you want to learn more about debugging with Pdb, you will find an [interesting tutorial on that topic here](https://pymotw.com/3/pdb/).
+
+## Debugging with debugpy
+
+If you use Visual Studio Code and would like to debug Evennia using a graphical debugger, please follow the instructions here:
+
+[debugpy contrib](https://github.com/evennia/evennia/tree/main/evennia/contrib/utils/debugpy)
\ No newline at end of file
diff --git a/docs/latest/_sources/Contribs/Contrib-Debugpy.md.txt b/docs/latest/_sources/Contribs/Contrib-Debugpy.md.txt
new file mode 100644
index 0000000000..24ad91e149
--- /dev/null
+++ b/docs/latest/_sources/Contribs/Contrib-Debugpy.md.txt
@@ -0,0 +1,121 @@
+# DebugPy VSCode debugger integration
+
+Contribution by electroglyph, 2025
+
+This registers an in-game command `debugpy` which starts the debugpy debugger and listens on port 5678.
+For now this is only available for Visual Studio Code (VS Code).
+
+If you are a JetBrains PyCharm user and would like to use this, make some noise at:
+https://youtrack.jetbrains.com/issue/PY-63403/Support-debugpy
+
+
+Credit for this goes to Moony on the Evennia Discord getting-help channel, thx Moony!
+
+
+## Installation
+
+This requires VS Code and debugpy, so make sure you're using VS Code.
+
+From the venv where you installed Evennia run:
+
+`pip install debugpy`
+
+### Enable the command in Evennia
+
+In your Evennia mygame folder, open up `/commands/default_cmdsets.py`
+
+add `from evennia.contrib.utils.debugpy import CmdDebugPy` somewhere near the top.
+
+in `CharacterCmdSet.at_cmdset_creation` add this under `super().at_cmdset_creation()`:
+
+`self.add(CmdDebugPy)`
+
+
+### Add "remote attach" option to VS Code debugger
+
+Start VS Code and open your launch.json like this:
+
+
+
+Add this to your configuration:
+
+```json
+ {
+ "name": "Python Debugger: Remote Attach",
+ "justMyCode": false,
+ "type": "debugpy",
+ "request": "attach",
+ "connect": {
+ "host": "127.0.0.1",
+ "port": 5678
+ },
+ "pathMappings": [
+ {
+ "localRoot": "${workspaceFolder}",
+ "remoteRoot": "${workspaceFolder}"
+ }
+ ]
+ },
+```
+
+Use `127.0.0.1` for the host if you are running Evennia from the same machine you'll be debugging from. Otherwise, if you want to debug a remote server, change host (and possibly remoteRoot mapping) as necessary.
+
+Afterwards it should look something like this:
+
+```json
+{
+ // Use IntelliSense to learn about possible attributes.
+ // Hover to view descriptions of existing attributes.
+ // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
+ "version": "0.2.0",
+ "configurations": [
+ {
+ "name": "Python Debugger: Current File",
+ "type": "debugpy",
+ "request": "launch",
+ "program": "${file}",
+ "console": "integratedTerminal",
+ },
+ {
+ "name": "Python Debugger: Remote Attach",
+ "justMyCode": false,
+ "type": "debugpy",
+ "request": "attach",
+ "connect": {
+ "host": "127.0.0.1",
+ "port": 5678
+ },
+ "pathMappings": [
+ {
+ "localRoot": "${workspaceFolder}",
+ "remoteRoot": "${workspaceFolder}"
+ }
+ ]
+ },
+ ]
+}
+```
+
+(notice the comma between the curly braces)
+
+## Usage
+
+Set a breakpoint in VS Code where you want the debugger to stop at.
+
+In Evennia run `debugpy` command.
+
+You should see "Waiting for debugger attach..."
+
+Back in VS Code attach the debugger:
+
+
+
+Back in Evennia you should see "Debugger attached."
+
+Now trigger the breakpoint you set and you'll be using a nice graphical debugger.
+
+
+----
+
+This document page is generated from `evennia/contrib/utils/debugpy/README.md`. Changes to this
+file will be overwritten, so edit that file rather than this one.
diff --git a/docs/latest/_sources/Contribs/Contribs-Overview.md.txt b/docs/latest/_sources/Contribs/Contribs-Overview.md.txt
index 232284616e..0f40423933 100644
--- a/docs/latest/_sources/Contribs/Contribs-Overview.md.txt
+++ b/docs/latest/_sources/Contribs/Contribs-Overview.md.txt
@@ -7,7 +7,7 @@ in the [Community Contribs & Snippets][forum] forum.
_Contribs_ are optional code snippets and systems contributed by
the Evennia community. They vary in size and complexity and
may be more specific about game types and styles than 'core' Evennia.
-This page is auto-generated and summarizes all **52** contribs currently included
+This page is auto-generated and summarizes all **53** contribs currently included
with the Evennia distribution.
All contrib categories are imported from `evennia.contrib`, such as
@@ -32,14 +32,14 @@ If you want to add a contrib, see [the contrib guidelines](./Contribs-Guidelines
| [achievements](#achievements) | [auditing](#auditing) | [awsstorage](#awsstorage) | [barter](#barter) | [batchprocessor](#batchprocessor) |
| [bodyfunctions](#bodyfunctions) | [buffs](#buffs) | [building_menu](#building_menu) | [character_creator](#character_creator) | [clothing](#clothing) |
| [color_markups](#color_markups) | [components](#components) | [containers](#containers) | [cooldowns](#cooldowns) | [crafting](#crafting) |
-| [custom_gametime](#custom_gametime) | [dice](#dice) | [email_login](#email_login) | [evadventure](#evadventure) | [evscaperoom](#evscaperoom) |
-| [extended_room](#extended_room) | [fieldfill](#fieldfill) | [gendersub](#gendersub) | [git_integration](#git_integration) | [godotwebsocket](#godotwebsocket) |
-| [health_bar](#health_bar) | [ingame_map_display](#ingame_map_display) | [ingame_python](#ingame_python) | [ingame_reports](#ingame_reports) | [llm](#llm) |
-| [mail](#mail) | [mapbuilder](#mapbuilder) | [menu_login](#menu_login) | [mirror](#mirror) | [multidescer](#multidescer) |
-| [mux_comms_cmds](#mux_comms_cmds) | [name_generator](#name_generator) | [puzzles](#puzzles) | [random_string_generator](#random_string_generator) | [red_button](#red_button) |
-| [rpsystem](#rpsystem) | [simpledoor](#simpledoor) | [slow_exit](#slow_exit) | [storage](#storage) | [talking_npc](#talking_npc) |
-| [traits](#traits) | [tree_select](#tree_select) | [turnbattle](#turnbattle) | [tutorial_world](#tutorial_world) | [unixcommand](#unixcommand) |
-| [wilderness](#wilderness) | [xyzgrid](#xyzgrid) |
+| [custom_gametime](#custom_gametime) | [debugpy](#debugpy) | [dice](#dice) | [email_login](#email_login) | [evadventure](#evadventure) |
+| [evscaperoom](#evscaperoom) | [extended_room](#extended_room) | [fieldfill](#fieldfill) | [gendersub](#gendersub) | [git_integration](#git_integration) |
+| [godotwebsocket](#godotwebsocket) | [health_bar](#health_bar) | [ingame_map_display](#ingame_map_display) | [ingame_python](#ingame_python) | [ingame_reports](#ingame_reports) |
+| [llm](#llm) | [mail](#mail) | [mapbuilder](#mapbuilder) | [menu_login](#menu_login) | [mirror](#mirror) |
+| [multidescer](#multidescer) | [mux_comms_cmds](#mux_comms_cmds) | [name_generator](#name_generator) | [puzzles](#puzzles) | [random_string_generator](#random_string_generator) |
+| [red_button](#red_button) | [rpsystem](#rpsystem) | [simpledoor](#simpledoor) | [slow_exit](#slow_exit) | [storage](#storage) |
+| [talking_npc](#talking_npc) | [traits](#traits) | [tree_select](#tree_select) | [turnbattle](#turnbattle) | [tutorial_world](#tutorial_world) |
+| [unixcommand](#unixcommand) | [wilderness](#wilderness) | [xyzgrid](#xyzgrid) |
@@ -804,6 +804,7 @@ Contribs-Guidelines.md
:maxdepth: 1
Contrib-Auditing.md
+Contrib-Debugpy.md
Contrib-Fieldfill.md
Contrib-Git-Integration.md
Contrib-Name-Generator.md
@@ -824,6 +825,17 @@ quality assurance, post-incident investigations and debugging.
+### `debugpy`
+
+_Contribution by electroglyph, 2025_
+
+This registers an in-game command `debugpy` which starts the debugpy debugger and listens on port 5678.
+For now this is only available for Visual Studio Code (VS Code).
+
+[Read the documentation](./Contrib-Debugpy.md) - [Browse the Code](evennia.contrib.utils.debugpy)
+
+
+
### `fieldfill`
_Contribution by Tim Ashley Jenkins, 2018_
diff --git a/docs/latest/api/evennia.commands.default.batchprocess.html b/docs/latest/api/evennia.commands.default.batchprocess.html
index 5a7b88c2de..9b80e97757 100644
--- a/docs/latest/api/evennia.commands.default.batchprocess.html
+++ b/docs/latest/api/evennia.commands.default.batchprocess.html
@@ -152,7 +152,7 @@ skipping, reloading etc.
-
-
aliases = ['batchcmd', 'batchcommand']
+aliases = ['batchcommand', 'batchcmd']
@@ -183,7 +183,7 @@ skipping, reloading etc.
-
-
search_index_entry = {'aliases': 'batchcmd batchcommand', 'category': 'building', 'key': 'batchcommands', 'no_prefix': ' batchcmd batchcommand', 'tags': '', 'text': '\n build from batch-command file\n\n Usage:\n batchcommands[/interactive] <python.path.to.file>\n\n Switch:\n interactive - this mode will offer more control when\n executing the batch file, like stepping,\n skipping, reloading etc.\n\n Runs batches of commands from a batch-cmd text file (*.ev).\n\n '}
+search_index_entry = {'aliases': 'batchcommand batchcmd', 'category': 'building', 'key': 'batchcommands', 'no_prefix': ' batchcommand batchcmd', 'tags': '', 'text': '\n build from batch-command file\n\n Usage:\n batchcommands[/interactive] <python.path.to.file>\n\n Switch:\n interactive - this mode will offer more control when\n executing the batch file, like stepping,\n skipping, reloading etc.\n\n Runs batches of commands from a batch-cmd text file (*.ev).\n\n '}
diff --git a/docs/latest/api/evennia.commands.default.building.html b/docs/latest/api/evennia.commands.default.building.html
index 313098d118..0aee480a4a 100644
--- a/docs/latest/api/evennia.commands.default.building.html
+++ b/docs/latest/api/evennia.commands.default.building.html
@@ -651,7 +651,7 @@ You can specify the /force switch to bypass this confirmation.
-
-
aliases = ['@delete', '@del']
+aliases = ['@del', '@delete']
@@ -692,7 +692,7 @@ You can specify the /force switch to bypass this confirmation.
-
-
search_index_entry = {'aliases': '@delete @del', 'category': 'building', 'key': '@destroy', 'no_prefix': 'destroy delete del', 'tags': '', 'text': '\n permanently delete objects\n\n Usage:\n destroy[/switches] [obj, obj2, obj3, [dbref-dbref], ...]\n\n Switches:\n override - The destroy command will usually avoid accidentally\n destroying account objects. This switch overrides this safety.\n force - destroy without confirmation.\n Examples:\n destroy house, roof, door, 44-78\n destroy 5-10, flower, 45\n destroy/force north\n\n Destroys one or many objects. If dbrefs are used, a range to delete can be\n given, e.g. 4-10. Also the end points will be deleted. This command\n displays a confirmation before destroying, to make sure of your choice.\n You can specify the /force switch to bypass this confirmation.\n '}
+search_index_entry = {'aliases': '@del @delete', 'category': 'building', 'key': '@destroy', 'no_prefix': 'destroy del delete', 'tags': '', 'text': '\n permanently delete objects\n\n Usage:\n destroy[/switches] [obj, obj2, obj3, [dbref-dbref], ...]\n\n Switches:\n override - The destroy command will usually avoid accidentally\n destroying account objects. This switch overrides this safety.\n force - destroy without confirmation.\n Examples:\n destroy house, roof, door, 44-78\n destroy 5-10, flower, 45\n destroy/force north\n\n Destroys one or many objects. If dbrefs are used, a range to delete can be\n given, e.g. 4-10. Also the end points will be deleted. This command\n displays a confirmation before destroying, to make sure of your choice.\n You can specify the /force switch to bypass this confirmation.\n '}
@@ -1419,7 +1419,7 @@ server settings.
-
-
aliases = ['@swap', '@parent', '@update', '@type', '@typeclasses']
+aliases = ['@type', '@parent', '@update', '@typeclasses', '@swap']
@@ -1450,7 +1450,7 @@ server settings.
-
-
search_index_entry = {'aliases': '@swap @parent @update @type @typeclasses', 'category': 'building', 'key': '@typeclass', 'no_prefix': 'typeclass swap parent update type typeclasses', 'tags': '', 'text': "\n set or change an object's typeclass\n\n Usage:\n typeclass[/switch] <object> [= typeclass.path]\n typeclass/prototype <object> = prototype_key\n\n typeclasses or typeclass/list/show [typeclass.path]\n swap - this is a shorthand for using /force/reset flags.\n update - this is a shorthand for using the /force/reload flag.\n\n Switch:\n show, examine - display the current typeclass of object (default) or, if\n given a typeclass path, show the docstring of that typeclass.\n update - *only* re-run at_object_creation on this object\n meaning locks or other properties set later may remain.\n reset - clean out *all* the attributes and properties on the\n object - basically making this a new clean object. This will also\n reset cmdsets!\n force - change to the typeclass also if the object\n already has a typeclass of the same name.\n list - show available typeclasses. Only typeclasses in modules actually\n imported or used from somewhere in the code will show up here\n (those typeclasses are still available if you know the path)\n prototype - clean and overwrite the object with the specified\n prototype key - effectively making a whole new object.\n\n Example:\n type button = examples.red_button.RedButton\n type/prototype button=a red button\n\n If the typeclass_path is not given, the current object's typeclass is\n assumed.\n\n View or set an object's typeclass. If setting, the creation hooks of the\n new typeclass will be run on the object. If you have clashing properties on\n the old class, use /reset. By default you are protected from changing to a\n typeclass of the same name as the one you already have - use /force to\n override this protection.\n\n The given typeclass must be identified by its location using python\n dot-notation pointing to the correct module and class. If no typeclass is\n given (or a wrong typeclass is given). Errors in the path or new typeclass\n will lead to the old typeclass being kept. The location of the typeclass\n module is searched from the default typeclass directory, as defined in the\n server settings.\n\n "}
+search_index_entry = {'aliases': '@type @parent @update @typeclasses @swap', 'category': 'building', 'key': '@typeclass', 'no_prefix': 'typeclass type parent update typeclasses swap', 'tags': '', 'text': "\n set or change an object's typeclass\n\n Usage:\n typeclass[/switch] <object> [= typeclass.path]\n typeclass/prototype <object> = prototype_key\n\n typeclasses or typeclass/list/show [typeclass.path]\n swap - this is a shorthand for using /force/reset flags.\n update - this is a shorthand for using the /force/reload flag.\n\n Switch:\n show, examine - display the current typeclass of object (default) or, if\n given a typeclass path, show the docstring of that typeclass.\n update - *only* re-run at_object_creation on this object\n meaning locks or other properties set later may remain.\n reset - clean out *all* the attributes and properties on the\n object - basically making this a new clean object. This will also\n reset cmdsets!\n force - change to the typeclass also if the object\n already has a typeclass of the same name.\n list - show available typeclasses. Only typeclasses in modules actually\n imported or used from somewhere in the code will show up here\n (those typeclasses are still available if you know the path)\n prototype - clean and overwrite the object with the specified\n prototype key - effectively making a whole new object.\n\n Example:\n type button = examples.red_button.RedButton\n type/prototype button=a red button\n\n If the typeclass_path is not given, the current object's typeclass is\n assumed.\n\n View or set an object's typeclass. If setting, the creation hooks of the\n new typeclass will be run on the object. If you have clashing properties on\n the old class, use /reset. By default you are protected from changing to a\n typeclass of the same name as the one you already have - use /force to\n override this protection.\n\n The given typeclass must be identified by its location using python\n dot-notation pointing to the correct module and class. If no typeclass is\n given (or a wrong typeclass is given). Errors in the path or new typeclass\n will lead to the old typeclass being kept. The location of the typeclass\n module is searched from the default typeclass directory, as defined in the\n server settings.\n\n "}
diff --git a/docs/latest/api/evennia.commands.default.general.html b/docs/latest/api/evennia.commands.default.general.html
index 1ac666ad7c..3694dde611 100644
--- a/docs/latest/api/evennia.commands.default.general.html
+++ b/docs/latest/api/evennia.commands.default.general.html
@@ -282,7 +282,7 @@ for everyone to use, you need build privileges and the alias command.
-
-
aliases = ['nickname', 'nicks']
+aliases = ['nicks', 'nickname']
@@ -314,7 +314,7 @@ for everyone to use, you need build privileges and the alias command.
-
-
search_index_entry = {'aliases': 'nickname nicks', 'category': 'general', 'key': 'nick', 'no_prefix': ' nickname nicks', 'tags': '', 'text': '\n define a personal alias/nick by defining a string to\n match and replace it with another on the fly\n\n Usage:\n nick[/switches] <string> [= [replacement_string]]\n nick[/switches] <template> = <replacement_template>\n nick/delete <string> or number\n nicks\n\n Switches:\n inputline - replace on the inputline (default)\n object - replace on object-lookup\n account - replace on account-lookup\n list - show all defined aliases (also "nicks" works)\n delete - remove nick by index in /list\n clearall - clear all nicks\n\n Examples:\n nick hi = say Hello, I\'m Sarah!\n nick/object tom = the tall man\n nick build $1 $2 = create/drop $1;$2\n nick tell $1 $2=page $1=$2\n nick tm?$1=page tallman=$1\n nick tm\\\\=$1=page tallman=$1\n\n A \'nick\' is a personal string replacement. Use $1, $2, ... to catch arguments.\n Put the last $-marker without an ending space to catch all remaining text. You\n can also use unix-glob matching for the left-hand side <string>:\n\n * - matches everything\n ? - matches 0 or 1 single characters\n [abcd] - matches these chars in any order\n [!abcd] - matches everything not among these chars\n \\\\= - escape literal \'=\' you want in your <string>\n\n Note that no objects are actually renamed or changed by this command - your nicks\n are only available to you. If you want to permanently add keywords to an object\n for everyone to use, you need build privileges and the alias command.\n\n '}
+search_index_entry = {'aliases': 'nicks nickname', 'category': 'general', 'key': 'nick', 'no_prefix': ' nicks nickname', 'tags': '', 'text': '\n define a personal alias/nick by defining a string to\n match and replace it with another on the fly\n\n Usage:\n nick[/switches] <string> [= [replacement_string]]\n nick[/switches] <template> = <replacement_template>\n nick/delete <string> or number\n nicks\n\n Switches:\n inputline - replace on the inputline (default)\n object - replace on object-lookup\n account - replace on account-lookup\n list - show all defined aliases (also "nicks" works)\n delete - remove nick by index in /list\n clearall - clear all nicks\n\n Examples:\n nick hi = say Hello, I\'m Sarah!\n nick/object tom = the tall man\n nick build $1 $2 = create/drop $1;$2\n nick tell $1 $2=page $1=$2\n nick tm?$1=page tallman=$1\n nick tm\\\\=$1=page tallman=$1\n\n A \'nick\' is a personal string replacement. Use $1, $2, ... to catch arguments.\n Put the last $-marker without an ending space to catch all remaining text. You\n can also use unix-glob matching for the left-hand side <string>:\n\n * - matches everything\n ? - matches 0 or 1 single characters\n [abcd] - matches these chars in any order\n [!abcd] - matches everything not among these chars\n \\\\= - escape literal \'=\' you want in your <string>\n\n Note that no objects are actually renamed or changed by this command - your nicks\n are only available to you. If you want to permanently add keywords to an object\n for everyone to use, you need build privileges and the alias command.\n\n '}
diff --git a/docs/latest/api/evennia.commands.default.tests.html b/docs/latest/api/evennia.commands.default.tests.html
index 702b1adc0e..f6ee1ca002 100644
--- a/docs/latest/api/evennia.commands.default.tests.html
+++ b/docs/latest/api/evennia.commands.default.tests.html
@@ -985,7 +985,7 @@ main test suite started with
Test the batch processor.
-
-
red_button = <module 'evennia.contrib.tutorials.red_button.red_button' from '/tmp/tmpejn0pwih/0779ec82b6b7c15d2c99a943155f9db319d5c8ba/evennia/contrib/tutorials/red_button/red_button.py'>
+red_button = <module 'evennia.contrib.tutorials.red_button.red_button' from '/tmp/tmpmve69gxe/bb54ed75f7c0c047ac59b71317872908dc175bf9/evennia/contrib/tutorials/red_button/red_button.py'>
diff --git a/docs/latest/api/evennia.contrib.base_systems.mux_comms_cmds.mux_comms_cmds.html b/docs/latest/api/evennia.contrib.base_systems.mux_comms_cmds.mux_comms_cmds.html
index 22242d70f0..23bea37924 100644
--- a/docs/latest/api/evennia.contrib.base_systems.mux_comms_cmds.mux_comms_cmds.html
+++ b/docs/latest/api/evennia.contrib.base_systems.mux_comms_cmds.mux_comms_cmds.html
@@ -231,7 +231,7 @@ for that channel.
-
-
aliases = ['delaliaschan', 'delchanalias']
+aliases = ['delchanalias', 'delaliaschan']
@@ -262,7 +262,7 @@ for that channel.
-
-
search_index_entry = {'aliases': 'delaliaschan delchanalias', 'category': 'comms', 'key': 'delcom', 'no_prefix': ' delaliaschan delchanalias', 'tags': '', 'text': "\n remove a channel alias and/or unsubscribe from channel\n\n Usage:\n delcom <alias or channel>\n delcom/all <channel>\n\n If the full channel name is given, unsubscribe from the\n channel. If an alias is given, remove the alias but don't\n unsubscribe. If the 'all' switch is used, remove all aliases\n for that channel.\n "}
+search_index_entry = {'aliases': 'delchanalias delaliaschan', 'category': 'comms', 'key': 'delcom', 'no_prefix': ' delchanalias delaliaschan', 'tags': '', 'text': "\n remove a channel alias and/or unsubscribe from channel\n\n Usage:\n delcom <alias or channel>\n delcom/all <channel>\n\n If the full channel name is given, unsubscribe from the\n channel. If an alias is given, remove the alias but don't\n unsubscribe. If the 'all' switch is used, remove all aliases\n for that channel.\n "}
diff --git a/docs/latest/api/evennia.contrib.full_systems.evscaperoom.commands.html b/docs/latest/api/evennia.contrib.full_systems.evscaperoom.commands.html
index 8c5a15b112..44b4b13728 100644
--- a/docs/latest/api/evennia.contrib.full_systems.evscaperoom.commands.html
+++ b/docs/latest/api/evennia.contrib.full_systems.evscaperoom.commands.html
@@ -225,7 +225,7 @@ the operation will be general or on the room.
-
-
aliases = ['chicken out', 'abort', 'q', 'quit']
+aliases = ['abort', 'q', 'chicken out', 'quit']
@@ -249,7 +249,7 @@ set in self.parse())
-
-
search_index_entry = {'aliases': 'chicken out abort q quit', 'category': 'evscaperoom', 'key': 'give up', 'no_prefix': ' chicken out abort q quit', 'tags': '', 'text': '\n Give up\n\n Usage:\n give up\n\n Abandons your attempts at escaping and of ever winning the pie-eating contest.\n\n '}
+search_index_entry = {'aliases': 'abort q chicken out quit', 'category': 'evscaperoom', 'key': 'give up', 'no_prefix': ' abort q chicken out quit', 'tags': '', 'text': '\n Give up\n\n Usage:\n give up\n\n Abandons your attempts at escaping and of ever winning the pie-eating contest.\n\n '}
@@ -504,7 +504,7 @@ looks and what actions is available.
-
-
aliases = ['ex', 'unfocus', 'e', 'examine']
+aliases = ['unfocus', 'ex', 'e', 'examine']
@@ -533,7 +533,7 @@ set in self.parse())
-
-
search_index_entry = {'aliases': 'ex unfocus e examine', 'category': 'evscaperoom', 'key': 'focus', 'no_prefix': ' ex unfocus e examine', 'tags': '', 'text': '\n Focus your attention on a target.\n\n Usage:\n focus <obj>\n\n Once focusing on an object, use look to get more information about how it\n looks and what actions is available.\n\n '}
+search_index_entry = {'aliases': 'unfocus ex e examine', 'category': 'evscaperoom', 'key': 'focus', 'no_prefix': ' unfocus ex e examine', 'tags': '', 'text': '\n Focus your attention on a target.\n\n Usage:\n focus <obj>\n\n Once focusing on an object, use look to get more information about how it\n looks and what actions is available.\n\n '}
@@ -595,7 +595,7 @@ set in self.parse())
-
-
aliases = ['give', 'i', 'inv', 'inventory']
+aliases = ['inv', 'i', 'inventory', 'give']
@@ -619,7 +619,7 @@ set in self.parse())
-
-
search_index_entry = {'aliases': 'give i inv inventory', 'category': 'evscaperoom', 'key': 'get', 'no_prefix': ' give i inv inventory', 'tags': '', 'text': '\n Use focus / examine instead.\n\n '}
+search_index_entry = {'aliases': 'inv i inventory give', 'category': 'evscaperoom', 'key': 'get', 'no_prefix': ' inv i inventory give', 'tags': '', 'text': '\n Use focus / examine instead.\n\n '}
@@ -640,7 +640,7 @@ set in self.parse())
-
-
aliases = ['@dig', '@open']
+aliases = ['@open', '@dig']
@@ -663,7 +663,7 @@ to all the variables defined therein.
-
-
search_index_entry = {'aliases': '@dig @open', 'category': 'general', 'key': 'open', 'no_prefix': ' dig open', 'tags': '', 'text': '\n Interact with an object in focus.\n\n Usage:\n <action> [arg]\n\n '}
+search_index_entry = {'aliases': '@open @dig', 'category': 'general', 'key': 'open', 'no_prefix': ' open dig', 'tags': '', 'text': '\n Interact with an object in focus.\n\n Usage:\n <action> [arg]\n\n '}
diff --git a/docs/latest/api/evennia.contrib.game_systems.achievements.achievements.html b/docs/latest/api/evennia.contrib.game_systems.achievements.achievements.html
index 2e8ab78baa..47a6ce4f06 100644
--- a/docs/latest/api/evennia.contrib.game_systems.achievements.achievements.html
+++ b/docs/latest/api/evennia.contrib.game_systems.achievements.achievements.html
@@ -289,7 +289,7 @@ achievements/progress rats
-
-
aliases = ['achievement', 'achieves', 'achieve']
+aliases = ['achieves', 'achievement', 'achieve']
@@ -337,7 +337,7 @@ to all the variables defined therein.
-
-
search_index_entry = {'aliases': 'achievement achieves achieve', 'category': 'general', 'key': 'achievements', 'no_prefix': ' achievement achieves achieve', 'tags': '', 'text': '\n view achievements\n\n Usage:\n achievements[/switches] [args]\n\n Switches:\n all View all achievements, including locked ones.\n completed View achievements you\'ve completed.\n progress View achievements you have partially completed\n\n Check your achievement statuses or browse the list. Providing a command argument\n will search all your currently unlocked achievements for matches, and the switches\n will filter the list to something other than "all unlocked". Combining a command\n argument with a switch will search only in that list.\n\n Examples:\n achievements apples\n achievements/all\n achievements/progress rats\n '}
+search_index_entry = {'aliases': 'achieves achievement achieve', 'category': 'general', 'key': 'achievements', 'no_prefix': ' achieves achievement achieve', 'tags': '', 'text': '\n view achievements\n\n Usage:\n achievements[/switches] [args]\n\n Switches:\n all View all achievements, including locked ones.\n completed View achievements you\'ve completed.\n progress View achievements you have partially completed\n\n Check your achievement statuses or browse the list. Providing a command argument\n will search all your currently unlocked achievements for matches, and the switches\n will filter the list to something other than "all unlocked". Combining a command\n argument with a switch will search only in that list.\n\n Examples:\n achievements apples\n achievements/all\n achievements/progress rats\n '}
diff --git a/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_basic.html b/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_basic.html
index 9dd6a535f0..c662d4ed02 100644
--- a/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_basic.html
+++ b/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_basic.html
@@ -686,7 +686,7 @@ if there are still any actions you can take.
-
-
aliases = ['hold', 'wait']
+aliases = ['wait', 'hold']
@@ -712,7 +712,7 @@ if there are still any actions you can take.
-
-
search_index_entry = {'aliases': 'hold wait', 'category': 'combat', 'key': 'pass', 'no_prefix': ' hold wait', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}
+search_index_entry = {'aliases': 'wait hold', 'category': 'combat', 'key': 'pass', 'no_prefix': ' wait hold', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}
diff --git a/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_equip.html b/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_equip.html
index 0bed424fda..b43d0f5a48 100644
--- a/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_equip.html
+++ b/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_equip.html
@@ -581,7 +581,7 @@ if there are still any actions you can take.
-
-
aliases = ['hold', 'wait']
+aliases = ['wait', 'hold']
@@ -601,7 +601,7 @@ if there are still any actions you can take.
-
-
search_index_entry = {'aliases': 'hold wait', 'category': 'combat', 'key': 'pass', 'no_prefix': ' hold wait', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}
+search_index_entry = {'aliases': 'wait hold', 'category': 'combat', 'key': 'pass', 'no_prefix': ' wait hold', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}
diff --git a/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_items.html b/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_items.html
index 9b7607f915..1e2a340556 100644
--- a/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_items.html
+++ b/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_items.html
@@ -704,7 +704,7 @@ if there are still any actions you can take.
-
-
aliases = ['hold', 'wait']
+aliases = ['wait', 'hold']
@@ -724,7 +724,7 @@ if there are still any actions you can take.
-
-
search_index_entry = {'aliases': 'hold wait', 'category': 'combat', 'key': 'pass', 'no_prefix': ' hold wait', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}
+search_index_entry = {'aliases': 'wait hold', 'category': 'combat', 'key': 'pass', 'no_prefix': ' wait hold', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}
diff --git a/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_magic.html b/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_magic.html
index 0f29530eac..62ecd7c88e 100644
--- a/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_magic.html
+++ b/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_magic.html
@@ -483,7 +483,7 @@ if there are still any actions you can take.
-
-
aliases = ['hold', 'wait']
+aliases = ['wait', 'hold']
@@ -503,7 +503,7 @@ if there are still any actions you can take.
-
-
search_index_entry = {'aliases': 'hold wait', 'category': 'combat', 'key': 'pass', 'no_prefix': ' hold wait', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}
+search_index_entry = {'aliases': 'wait hold', 'category': 'combat', 'key': 'pass', 'no_prefix': ' wait hold', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}
diff --git a/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_range.html b/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_range.html
index d06a19f299..66eedd87ae 100644
--- a/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_range.html
+++ b/docs/latest/api/evennia.contrib.game_systems.turnbattle.tb_range.html
@@ -943,7 +943,7 @@ if there are still any actions you can take.
-
-
aliases = ['hold', 'wait']
+aliases = ['wait', 'hold']
@@ -963,7 +963,7 @@ if there are still any actions you can take.
-
-
search_index_entry = {'aliases': 'hold wait', 'category': 'combat', 'key': 'pass', 'no_prefix': ' hold wait', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}
+search_index_entry = {'aliases': 'wait hold', 'category': 'combat', 'key': 'pass', 'no_prefix': ' wait hold', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}
diff --git a/docs/latest/api/evennia.contrib.grid.xyzgrid.commands.html b/docs/latest/api/evennia.contrib.grid.xyzgrid.commands.html
index f6516a49a8..fd3910210f 100644
--- a/docs/latest/api/evennia.contrib.grid.xyzgrid.commands.html
+++ b/docs/latest/api/evennia.contrib.grid.xyzgrid.commands.html
@@ -436,7 +436,7 @@ there is no room above/below you, your movement will fail.
-
-
aliases = ['dive', 'fly']
+aliases = ['fly', 'dive']
@@ -459,7 +459,7 @@ to all the variables defined therein.
-
-
search_index_entry = {'aliases': 'dive fly', 'category': 'general', 'key': 'fly or dive', 'no_prefix': ' dive fly', 'tags': '', 'text': '\n Fly or Dive up and down.\n\n Usage:\n fly\n dive\n\n Will fly up one room or dive down one room at your current position. If\n there is no room above/below you, your movement will fail.\n\n '}
+search_index_entry = {'aliases': 'fly dive', 'category': 'general', 'key': 'fly or dive', 'no_prefix': ' fly dive', 'tags': '', 'text': '\n Fly or Dive up and down.\n\n Usage:\n fly\n dive\n\n Will fly up one room or dive down one room at your current position. If\n there is no room above/below you, your movement will fail.\n\n '}
diff --git a/docs/latest/api/evennia.contrib.tutorials.evadventure.combat_turnbased.html b/docs/latest/api/evennia.contrib.tutorials.evadventure.combat_turnbased.html
index 269a797481..5749a8d5e1 100644
--- a/docs/latest/api/evennia.contrib.tutorials.evadventure.combat_turnbased.html
+++ b/docs/latest/api/evennia.contrib.tutorials.evadventure.combat_turnbased.html
@@ -480,7 +480,7 @@ turn of combat, performing everyone’s actions in random order.
-
-
aliases = ['hit', 'turnbased combat']
+aliases = ['turnbased combat', 'hit']
@@ -526,7 +526,7 @@ set in self.parse())
-
-
search_index_entry = {'aliases': 'hit turnbased combat', 'category': 'general', 'key': 'attack', 'no_prefix': ' hit turnbased combat', 'tags': '', 'text': '\n Start or join combat.\n\n Usage:\n attack [<target>]\n\n '}
+search_index_entry = {'aliases': 'turnbased combat hit', 'category': 'general', 'key': 'attack', 'no_prefix': ' turnbased combat hit', 'tags': '', 'text': '\n Start or join combat.\n\n Usage:\n attack [<target>]\n\n '}
diff --git a/docs/latest/api/evennia.contrib.tutorials.evadventure.combat_twitch.html b/docs/latest/api/evennia.contrib.tutorials.evadventure.combat_twitch.html
index 2d9f9a7a5d..b4a3e80767 100644
--- a/docs/latest/api/evennia.contrib.tutorials.evadventure.combat_twitch.html
+++ b/docs/latest/api/evennia.contrib.tutorials.evadventure.combat_twitch.html
@@ -491,7 +491,7 @@ boost INT Wizard Goblin
-
-
aliases = ['boost', 'foil']
+aliases = ['foil', 'boost']
@@ -525,7 +525,7 @@ set in self.parse())
-
-
search_index_entry = {'aliases': 'boost foil', 'category': 'combat', 'key': 'stunt', 'no_prefix': ' boost foil', 'tags': '', 'text': '\n Perform a combat stunt, that boosts an ally against a target, or\n foils an enemy, giving them disadvantage against an ally.\n\n Usage:\n boost [ability] <recipient> <target>\n foil [ability] <recipient> <target>\n boost [ability] <target> (same as boost me <target>)\n foil [ability] <target> (same as foil <target> me)\n\n Example:\n boost STR me Goblin\n boost DEX Goblin\n foil STR Goblin me\n foil INT Goblin\n boost INT Wizard Goblin\n\n '}
+search_index_entry = {'aliases': 'foil boost', 'category': 'combat', 'key': 'stunt', 'no_prefix': ' foil boost', 'tags': '', 'text': '\n Perform a combat stunt, that boosts an ally against a target, or\n foils an enemy, giving them disadvantage against an ally.\n\n Usage:\n boost [ability] <recipient> <target>\n foil [ability] <recipient> <target>\n boost [ability] <target> (same as boost me <target>)\n foil [ability] <target> (same as foil <target> me)\n\n Example:\n boost STR me Goblin\n boost DEX Goblin\n foil STR Goblin me\n foil INT Goblin\n boost INT Wizard Goblin\n\n '}
diff --git a/docs/latest/api/evennia.contrib.tutorials.red_button.red_button.html b/docs/latest/api/evennia.contrib.tutorials.red_button.red_button.html
index bc663d4cd5..1b2fd97ee0 100644
--- a/docs/latest/api/evennia.contrib.tutorials.red_button.red_button.html
+++ b/docs/latest/api/evennia.contrib.tutorials.red_button.red_button.html
@@ -167,7 +167,7 @@ such as when closing the lid and un-blinding a character.
-
-
aliases = ['push', 'press button', 'press']
+aliases = ['press button', 'push', 'press']
@@ -196,7 +196,7 @@ check if the lid is open or closed.
-
-
search_index_entry = {'aliases': 'push press button press', 'category': 'general', 'key': 'push button', 'no_prefix': ' push press button press', 'tags': '', 'text': '\n Push the red button (lid closed)\n\n Usage:\n push button\n\n '}
+search_index_entry = {'aliases': 'press button push press', 'category': 'general', 'key': 'push button', 'no_prefix': ' press button push press', 'tags': '', 'text': '\n Push the red button (lid closed)\n\n Usage:\n push button\n\n '}
@@ -266,7 +266,7 @@ check if the lid is open or closed.
-
-
aliases = ['smash lid', 'smash', 'break lid']
+aliases = ['break lid', 'smash', 'smash lid']
@@ -293,7 +293,7 @@ break.
-
-
search_index_entry = {'aliases': 'smash lid smash break lid', 'category': 'general', 'key': 'smash glass', 'no_prefix': ' smash lid smash break lid', 'tags': '', 'text': '\n Smash the protective glass.\n\n Usage:\n smash glass\n\n Try to smash the glass of the button.\n\n '}
+search_index_entry = {'aliases': 'break lid smash smash lid', 'category': 'general', 'key': 'smash glass', 'no_prefix': ' break lid smash smash lid', 'tags': '', 'text': '\n Smash the protective glass.\n\n Usage:\n smash glass\n\n Try to smash the glass of the button.\n\n '}
@@ -393,7 +393,7 @@ be mutually exclusive.
-
-
aliases = ['push', 'press button', 'press']
+aliases = ['press button', 'push', 'press']
@@ -422,7 +422,7 @@ set in self.parse())
-
-
search_index_entry = {'aliases': 'push press button press', 'category': 'general', 'key': 'push button', 'no_prefix': ' push press button press', 'tags': '', 'text': '\n Push the red button\n\n Usage:\n push button\n\n '}
+search_index_entry = {'aliases': 'press button push press', 'category': 'general', 'key': 'push button', 'no_prefix': ' press button push press', 'tags': '', 'text': '\n Push the red button\n\n Usage:\n push button\n\n '}
@@ -520,7 +520,7 @@ be mutually exclusive.
-
-
aliases = ['get', 'feel', 'examine', 'ex', 'listen', 'l']
+aliases = ['feel', 'listen', 'l', 'ex', 'get', 'examine']
@@ -546,7 +546,7 @@ be mutually exclusive.
-
-
search_index_entry = {'aliases': 'get feel examine ex listen l', 'category': 'general', 'key': 'look', 'no_prefix': ' get feel examine ex listen l', 'tags': '', 'text': "\n Looking around in darkness\n\n Usage:\n look <obj>\n\n ... not that there's much to see in the dark.\n\n "}
+search_index_entry = {'aliases': 'feel listen l ex get examine', 'category': 'general', 'key': 'look', 'no_prefix': ' feel listen l ex get examine', 'tags': '', 'text': "\n Looking around in darkness\n\n Usage:\n look <obj>\n\n ... not that there's much to see in the dark.\n\n "}
diff --git a/docs/latest/api/evennia.contrib.tutorials.tutorial_world.objects.html b/docs/latest/api/evennia.contrib.tutorials.tutorial_world.objects.html
index 1c0bd7ed1b..f0f503656c 100644
--- a/docs/latest/api/evennia.contrib.tutorials.tutorial_world.objects.html
+++ b/docs/latest/api/evennia.contrib.tutorials.tutorial_world.objects.html
@@ -439,7 +439,7 @@ of the object. We overload it with our own version.
-
-
aliases = ['burn', 'light']
+aliases = ['light', 'burn']
@@ -466,7 +466,7 @@ to sit on a “lightable” object, we operate only on self.obj.
-
-
search_index_entry = {'aliases': 'burn light', 'category': 'tutorialworld', 'key': 'on', 'no_prefix': ' burn light', 'tags': '', 'text': '\n Creates light where there was none. Something to burn.\n '}
+search_index_entry = {'aliases': 'light burn', 'category': 'tutorialworld', 'key': 'on', 'no_prefix': ' light burn', 'tags': '', 'text': '\n Creates light where there was none. Something to burn.\n '}
@@ -570,7 +570,7 @@ shift green root up/down
-
-
aliases = ['push', 'pull', 'move', 'shiftroot']
+aliases = ['shiftroot', 'move', 'push', 'pull']
@@ -606,7 +606,7 @@ yellow/green - horizontal roots
-
-
search_index_entry = {'aliases': 'push pull move shiftroot', 'category': 'tutorialworld', 'key': 'shift', 'no_prefix': ' push pull move shiftroot', 'tags': '', 'text': '\n Shifts roots around.\n\n Usage:\n shift blue root left/right\n shift red root left/right\n shift yellow root up/down\n shift green root up/down\n\n '}
+search_index_entry = {'aliases': 'shiftroot move push pull', 'category': 'tutorialworld', 'key': 'shift', 'no_prefix': ' shiftroot move push pull', 'tags': '', 'text': '\n Shifts roots around.\n\n Usage:\n shift blue root left/right\n shift red root left/right\n shift yellow root up/down\n shift green root up/down\n\n '}
@@ -623,7 +623,7 @@ yellow/green - horizontal roots
-
-
aliases = ['button', 'push button', 'press button']
+aliases = ['push button', 'press button', 'button']
@@ -649,7 +649,7 @@ yellow/green - horizontal roots
-
-
search_index_entry = {'aliases': 'button push button press button', 'category': 'tutorialworld', 'key': 'press', 'no_prefix': ' button push button press button', 'tags': '', 'text': '\n Presses a button.\n '}
+search_index_entry = {'aliases': 'push button press button button', 'category': 'tutorialworld', 'key': 'press', 'no_prefix': ' push button press button button', 'tags': '', 'text': '\n Presses a button.\n '}
@@ -793,7 +793,7 @@ parry - forgoes your attack but will make you harder to hit on next
-
-
aliases = ['chop', 'kill', 'fight', 'slash', 'parry', 'thrust', 'pierce', 'stab', 'hit', 'bash', 'defend']
+aliases = ['stab', 'parry', 'slash', 'chop', 'bash', 'fight', 'kill', 'hit', 'pierce', 'defend', 'thrust']
@@ -819,7 +819,7 @@ parry - forgoes your attack but will make you harder to hit on next
-
-
search_index_entry = {'aliases': 'chop kill fight slash parry thrust pierce stab hit bash defend', 'category': 'tutorialworld', 'key': 'attack', 'no_prefix': ' chop kill fight slash parry thrust pierce stab hit bash defend', 'tags': '', 'text': '\n Attack the enemy. Commands:\n\n stab <enemy>\n slash <enemy>\n parry\n\n stab - (thrust) makes a lot of damage but is harder to hit with.\n slash - is easier to land, but does not make as much damage.\n parry - forgoes your attack but will make you harder to hit on next\n enemy attack.\n\n '}
+search_index_entry = {'aliases': 'stab parry slash chop bash fight kill hit pierce defend thrust', 'category': 'tutorialworld', 'key': 'attack', 'no_prefix': ' stab parry slash chop bash fight kill hit pierce defend thrust', 'tags': '', 'text': '\n Attack the enemy. Commands:\n\n stab <enemy>\n slash <enemy>\n parry\n\n stab - (thrust) makes a lot of damage but is harder to hit with.\n slash - is easier to land, but does not make as much damage.\n parry - forgoes your attack but will make you harder to hit on next\n enemy attack.\n\n '}
diff --git a/docs/latest/api/evennia.contrib.tutorials.tutorial_world.rooms.html b/docs/latest/api/evennia.contrib.tutorials.tutorial_world.rooms.html
index 50201bde0f..b2c1a78035 100644
--- a/docs/latest/api/evennia.contrib.tutorials.tutorial_world.rooms.html
+++ b/docs/latest/api/evennia.contrib.tutorials.tutorial_world.rooms.html
@@ -982,7 +982,7 @@ to find something.
-
-
aliases = ['search', 'feel around', 'feel', 'l', 'fiddle']
+aliases = ['feel', 'fiddle', 'feel around', 'l', 'search']
@@ -1010,7 +1010,7 @@ random chance of eventually finding a light source.
-
-
search_index_entry = {'aliases': 'search feel around feel l fiddle', 'category': 'tutorialworld', 'key': 'look', 'no_prefix': ' search feel around feel l fiddle', 'tags': '', 'text': '\n Look around in darkness\n\n Usage:\n look\n\n Look around in the darkness, trying\n to find something.\n '}
+search_index_entry = {'aliases': 'feel fiddle feel around l search', 'category': 'tutorialworld', 'key': 'look', 'no_prefix': ' feel fiddle feel around l search', 'tags': '', 'text': '\n Look around in darkness\n\n Usage:\n look\n\n Look around in the darkness, trying\n to find something.\n '}
diff --git a/docs/latest/api/evennia.contrib.utils.git_integration.git_integration.html b/docs/latest/api/evennia.contrib.utils.git_integration.git_integration.html
index 8124730b6b..63064c3815 100644
--- a/docs/latest/api/evennia.contrib.utils.git_integration.git_integration.html
+++ b/docs/latest/api/evennia.contrib.utils.git_integration.git_integration.html
@@ -222,7 +222,7 @@ git evennia pull - Pull the latest evennia code.
-
-
directory = '/tmp/tmpejn0pwih/0779ec82b6b7c15d2c99a943155f9db319d5c8ba/evennia'
+directory = '/tmp/tmpmve69gxe/bb54ed75f7c0c047ac59b71317872908dc175bf9/evennia'
@@ -283,7 +283,7 @@ git pull - Pull the latest code from your current branch.
-
-
directory = '/tmp/tmpejn0pwih/0779ec82b6b7c15d2c99a943155f9db319d5c8ba/evennia/game_template'
+directory = '/tmp/tmpmve69gxe/bb54ed75f7c0c047ac59b71317872908dc175bf9/evennia/game_template'
diff --git a/docs/latest/api/evennia.server.evennia_launcher.html b/docs/latest/api/evennia.server.evennia_launcher.html
index 5ae0cce6a4..1db346f40b 100644
--- a/docs/latest/api/evennia.server.evennia_launcher.html
+++ b/docs/latest/api/evennia.server.evennia_launcher.html
@@ -437,25 +437,20 @@ template directory from evennia’s root.
-
evennia.server.evennia_launcher.create_superuser()[source]
-Auto-create the superuser account. Returns True if superuser was created.
+Create the superuser account
-
evennia.server.evennia_launcher.check_database(always_return=False)[source]
-Check if the database exists and has basic tables. This is only run by the launcher.
+Check so the database exists.
- Parameters
-always_return (bool, optional) – If True, will not raise exceptions on errors.
+always_return (bool, optional) – If set, will always return True/False
+also on critical errors. No output will be printed.
- Returns
-exists (bool) –
-
-- True if database exists and seems set up, False otherwise.
If always_return is False, this will raise exceptions instead of
-returning False.
-
-
-
+exists (bool) – True if the database exists, otherwise False.
diff --git a/docs/latest/api/evennia.utils.eveditor.html b/docs/latest/api/evennia.utils.eveditor.html
index 479215c21d..25a61d344d 100644
--- a/docs/latest/api/evennia.utils.eveditor.html
+++ b/docs/latest/api/evennia.utils.eveditor.html
@@ -356,7 +356,7 @@ indentation.
-
-
aliases = [':j', ':S', ':I', ':echo', ':<', ':w', ':>', ':q', ':fd', ':UU', ':h', ':fi', ':dw', ':DD', ':u', ':y', ':::', ':x', ':i', ':', ':wq', ':uu', ':s', ':p', ':f', '::', ':r', ':!', ':dd', ':A', ':q!', ':=']
+aliases = [':echo', ':=', ':y', ':::', '::', ':dd', ':', ':w', ':q', ':fi', ':uu', ':f', ':<', ':q!', ':DD', ':r', ':i', ':p', ':>', ':UU', ':wq', ':h', ':I', ':!', ':u', ':x', ':s', ':fd', ':dw', ':S', ':A', ':j']
@@ -384,7 +384,7 @@ efficient presentation.
-
-
search_index_entry = {'aliases': ':j :S :I :echo :< :w :> :q :fd :UU :h :fi :dw :DD :u :y ::: :x :i : :wq :uu :s :p :f :: :r :! :dd :A :q! :=', 'category': 'general', 'key': ':editor_command_group', 'no_prefix': ' :j :S :I :echo :< :w :> :q :fd :UU :h :fi :dw :DD :u :y ::: :x :i : :wq :uu :s :p :f :: :r :! :dd :A :q! :=', 'tags': '', 'text': '\n Commands for the editor\n '}
+search_index_entry = {'aliases': ':echo := :y ::: :: :dd : :w :q :fi :uu :f :< :q! :DD :r :i :p :> :UU :wq :h :I :! :u :x :s :fd :dw :S :A :j', 'category': 'general', 'key': ':editor_command_group', 'no_prefix': ' :echo := :y ::: :: :dd : :w :q :fi :uu :f :< :q! :DD :r :i :p :> :UU :wq :h :I :! :u :x :s :fd :dw :S :A :j', 'tags': '', 'text': '\n Commands for the editor\n '}
diff --git a/docs/latest/api/evennia.utils.evmenu.html b/docs/latest/api/evennia.utils.evmenu.html
index 25f9de88be..33a6aae45b 100644
--- a/docs/latest/api/evennia.utils.evmenu.html
+++ b/docs/latest/api/evennia.utils.evmenu.html
@@ -955,7 +955,7 @@ single question.
+aliases = ['n', 'abort', 'yes', 'y', '__nomatch_command', 'a', 'no']
@@ -981,7 +981,7 @@ single question.
+search_index_entry = {'aliases': 'n abort yes y __nomatch_command a no', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' n abort yes y __nomatch_command a no', 'tags': '', 'text': '\n Handle a prompt for yes or no. Press [return] for the default choice.\n\n '}
diff --git a/docs/latest/api/evennia.utils.evmore.html b/docs/latest/api/evennia.utils.evmore.html
index 46bc4d7d86..9efd08933f 100644
--- a/docs/latest/api/evennia.utils.evmore.html
+++ b/docs/latest/api/evennia.utils.evmore.html
@@ -151,7 +151,7 @@ the caller.msg() construct every time the page is updated.
-
-
aliases = ['abort', 'e', 'n', 'quit', 'top', 'previous', 'a', 'p', 'end', 'next', 'q', 't']
+aliases = ['abort', 'n', 'p', 'quit', 't', 'end', 'e', 'a', 'top', 'previous', 'next', 'q']
@@ -177,7 +177,7 @@ the caller.msg() construct every time the page is updated.
-
-
search_index_entry = {'aliases': 'abort e n quit top previous a p end next q t', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' abort e n quit top previous a p end next q t', 'tags': '', 'text': '\n Manipulate the text paging. Catch no-input with aliases.\n '}
+search_index_entry = {'aliases': 'abort n p quit t end e a top previous next q', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' abort n p quit t end e a top previous next q', 'tags': '', 'text': '\n Manipulate the text paging. Catch no-input with aliases.\n '}
diff --git a/docs/latest/api/evennia.utils.utils.html b/docs/latest/api/evennia.utils.utils.html
index da35c747f0..989fa204e3 100644
--- a/docs/latest/api/evennia.utils.utils.html
+++ b/docs/latest/api/evennia.utils.utils.html
@@ -1470,8 +1470,8 @@ and their handlers.
-
-class
evennia.utils.utils.lazy_property(func, name=None, doc=None)[source]
-Bases: object
+class evennia.utils.utils.lazy_property(func: collections.abc.Callable[…, TProp], name=None, doc=None)[source]
+Bases: typing.Generic
Delays loading of property until first access. Credit goes to the
Implementation in the werkzeug suite:
http://werkzeug.pocoo.org/docs/utils/#werkzeug.utils.cached_property
@@ -1489,7 +1489,7 @@ property “attributes” on the object. This is read-only since
this functionality is pretty much exclusively used by handlers.
-
-
__init__(func, name=None, doc=None)[source]
+__init__(func: collections.abc.Callable[…, TProp], name=None, doc=None)[source]
Store all properties for now
diff --git a/docs/latest/index.html b/docs/latest/index.html
index 579c87f6a1..0dcf79b929 100644
--- a/docs/latest/index.html
+++ b/docs/latest/index.html
@@ -433,6 +433,7 @@
- Debugging Evennia
- A simple example using pdb
- Cheat-sheet of pdb/pudb commands
+- Debugging with debugpy
- Unit Testing
- utils