diff --git a/docs/0.9.5/api/evennia.commands.default.general.html b/docs/0.9.5/api/evennia.commands.default.general.html
index 2155b2df6e..2860fe060f 100644
--- a/docs/0.9.5/api/evennia.commands.default.general.html
+++ b/docs/0.9.5/api/evennia.commands.default.general.html
@@ -197,7 +197,7 @@ for everyone to use, you need build privileges and the alias command.
diff --git a/docs/0.9.5/api/evennia.contrib.dice.html b/docs/0.9.5/api/evennia.contrib.dice.html
index 31f97ae1cb..6dc941e2e3 100644
--- a/docs/0.9.5/api/evennia.contrib.dice.html
+++ b/docs/0.9.5/api/evennia.contrib.dice.html
@@ -151,7 +151,7 @@ everyone but the person rolling.
diff --git a/docs/0.9.5/api/evennia.contrib.email_login.html b/docs/0.9.5/api/evennia.contrib.email_login.html
index cbf4009ec9..42359b31b5 100644
--- a/docs/0.9.5/api/evennia.contrib.email_login.html
+++ b/docs/0.9.5/api/evennia.contrib.email_login.html
@@ -76,7 +76,7 @@ the module given by settings.CONNECTION_SCREEN_MODULE.
diff --git a/docs/0.9.5/api/evennia.contrib.turnbattle.tb_basic.html b/docs/0.9.5/api/evennia.contrib.turnbattle.tb_basic.html
index c337ec3963..4383f10009 100644
--- a/docs/0.9.5/api/evennia.contrib.turnbattle.tb_basic.html
+++ b/docs/0.9.5/api/evennia.contrib.turnbattle.tb_basic.html
@@ -562,7 +562,7 @@ if there are still any actions you can take.
diff --git a/docs/0.9.5/api/evennia.contrib.turnbattle.tb_equip.html b/docs/0.9.5/api/evennia.contrib.turnbattle.tb_equip.html
index 76ba8cab38..a9e6929a11 100644
--- a/docs/0.9.5/api/evennia.contrib.turnbattle.tb_equip.html
+++ b/docs/0.9.5/api/evennia.contrib.turnbattle.tb_equip.html
@@ -679,7 +679,7 @@ if there are still any actions you can take.
diff --git a/docs/0.9.5/api/evennia.contrib.turnbattle.tb_items.html b/docs/0.9.5/api/evennia.contrib.turnbattle.tb_items.html
index 5a993996d6..c58f087ca3 100644
--- a/docs/0.9.5/api/evennia.contrib.turnbattle.tb_items.html
+++ b/docs/0.9.5/api/evennia.contrib.turnbattle.tb_items.html
@@ -713,7 +713,7 @@ if there are still any actions you can take.
diff --git a/docs/0.9.5/api/evennia.contrib.turnbattle.tb_magic.html b/docs/0.9.5/api/evennia.contrib.turnbattle.tb_magic.html
index 9d00e31190..45e59490ce 100644
--- a/docs/0.9.5/api/evennia.contrib.turnbattle.tb_magic.html
+++ b/docs/0.9.5/api/evennia.contrib.turnbattle.tb_magic.html
@@ -585,7 +585,7 @@ if there are still any actions you can take.
diff --git a/docs/0.9.5/api/evennia.contrib.turnbattle.tb_range.html b/docs/0.9.5/api/evennia.contrib.turnbattle.tb_range.html
index bbd3dfc46f..91da9c133f 100644
--- a/docs/0.9.5/api/evennia.contrib.turnbattle.tb_range.html
+++ b/docs/0.9.5/api/evennia.contrib.turnbattle.tb_range.html
@@ -997,7 +997,7 @@ if there are still any actions you can take.
diff --git a/docs/0.9.5/api/evennia.contrib.tutorial_examples.cmdset_red_button.html b/docs/0.9.5/api/evennia.contrib.tutorial_examples.cmdset_red_button.html
index afb36bf336..4d3e1fa776 100644
--- a/docs/0.9.5/api/evennia.contrib.tutorial_examples.cmdset_red_button.html
+++ b/docs/0.9.5/api/evennia.contrib.tutorial_examples.cmdset_red_button.html
@@ -107,7 +107,7 @@ push the lid of the button away.
diff --git a/docs/0.9.5/api/evennia.utils.evmore.html b/docs/0.9.5/api/evennia.utils.evmore.html
index f38aa12603..3d13e535ab 100644
--- a/docs/0.9.5/api/evennia.utils.evmore.html
+++ b/docs/0.9.5/api/evennia.utils.evmore.html
@@ -77,7 +77,7 @@ the caller.msg() construct every time the page is updated.
diff --git a/docs/1.0-dev/.buildinfo b/docs/1.0-dev/.buildinfo
index de368e1597..41499b19b0 100644
--- a/docs/1.0-dev/.buildinfo
+++ b/docs/1.0-dev/.buildinfo
@@ -1,4 +1,4 @@
# Sphinx build info version 1
# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
-config: 9f8cf16894d3749b2dd3817ea1772a23
+config: ce4c6f213faaf9506a72d057125012df
tags: 645f666f9bcd5a90fca523b33c5a78b7
diff --git a/docs/1.0-dev/Contribs/Contribs-Overview.html b/docs/1.0-dev/Contribs/Contribs-Overview.html
index 994468ec16..441def977b 100644
--- a/docs/1.0-dev/Contribs/Contribs-Overview.html
+++ b/docs/1.0-dev/Contribs/Contribs-Overview.html
@@ -123,7 +123,7 @@ that will edit any default object, offering to change its key and description.
Source code for evennia.contrib.base_systems.components
+"""
+Components - ChrisLR 2022
+
+This is a basic Component System.
+It allows you to use components on typeclasses using a simple syntax.
+This helps writing isolated code and reusing it over multiple objects.
+
+See the docs for more information.
+"""
+
+fromevennia.contrib.base_systems.components.componentimportComponent
+fromevennia.contrib.base_systems.components.dbfieldimportDBField,NDBField,TagField
+fromevennia.contrib.base_systems.components.holderimportComponentHolderMixin,ComponentProperty
+
+
+
[docs]defget_component_class(component_name):
+ subclasses=Component.__subclasses__()
+ component_class=next((scforscinsubclassesifsc.name==component_name),None)
+ ifcomponent_classisNone:
+ message=(
+ f"Component named {component_name} has not been found. "
+ f"Make sure it has been imported before being used."
+ )
+ raiseException(message)
+
+ returncomponent_class
Source code for evennia.contrib.base_systems.components.component
+"""
+Components - ChrisLR 2022
+
+This file contains the base class to inherit for creating new components.
+"""
+importitertools
+
+
+
[docs]classComponent:
+ """
+ This is the base class for components.
+ Any component must inherit from this class to be considered for usage.
+
+ Each Component must supply the name, it is used as a slot name but also part of the attribute key.
+ """
+
+ name=""
+
+
[docs]def__init__(self,host=None):
+ assertself.name,"All Components must have a Name"
+ self.host=host
+
+
[docs]@classmethod
+ defdefault_create(cls,host):
+ """
+ This is called when the host is created
+ and should return the base initialized state of a component.
+
+ Args:
+ host (object): The host typeclass instance
+
+ Returns:
+ Component: The created instance of the component
+
+ """
+ new=cls(host)
+ returnnew
+
+
[docs]@classmethod
+ defcreate(cls,host,**kwargs):
+ """
+ This is the method to call when supplying kwargs to initialize a component.
+
+ Args:
+ host (object): The host typeclass instance
+ **kwargs: Key-Value of default values to replace.
+ To persist the value, the key must correspond to a DBField.
+
+ Returns:
+ Component: The created instance of the component
+
+ """
+
+ new=cls.default_create(host)
+ forkey,valueinkwargs.items():
+ setattr(new,key,value)
+
+ returnnew
+
+
[docs]defcleanup(self):
+ """
+ This deletes all component attributes from the host's db
+ """
+ forattributeinself._all_db_field_names:
+ delattr(self,attribute)
+
+
[docs]@classmethod
+ defload(cls,host):
+ """
+ Loads a component instance
+ This is called whenever a component is loaded (ex: Server Restart)
+
+ Args:
+ host (object): The host typeclass instance
+
+ Returns:
+ Component: The loaded instance of the component
+
+ """
+
+ returncls(host)
+
+
[docs]defat_added(self,host):
+ """
+ This is the method called when a component is registered on a host.
+
+ Args:
+ host (object): The host typeclass instance
+
+ """
+
+ ifself.host:
+ ifself.host==host:
+ return
+ else:
+ raiseComponentRegisterError("Components must not register twice!")
+
+ self.host=host
+
+
[docs]defat_removed(self,host):
+ """
+ This is the method called when a component is removed from a host.
+
+ Args:
+ host (object): The host typeclass instance
+
+ """
+ ifhost!=self.host:
+ raiseComponentRegisterError("Component attempted to remove from the wrong host.")
+ self.host=None
Source code for evennia.contrib.base_systems.components.dbfield
+"""
+Components - ChrisLR 2022
+
+This file contains the Descriptors used to set Fields in Components
+"""
+fromevennia.typeclasses.attributesimportAttributeProperty,NAttributeProperty
+
+
+
[docs]classDBField(AttributeProperty):
+ """
+ Component Attribute Descriptor.
+ Allows you to set attributes related to a component on the class.
+ It uses AttributeProperty under the hood but prefixes the key with the component name.
+ """
+
+ def__set_name__(self,owner,name):
+ """
+ Called when descriptor is first assigned to the class.
+
+ Args:
+ owner (object): The component classF on which this is set
+ name (str): The name that was used to set the DBField.
+ """
+ key=f"{owner.name}::{name}"
+ self._key=key
+ db_fields=getattr(owner,"_db_fields",None)
+ ifdb_fieldsisNone:
+ db_fields={}
+ setattr(owner,"_db_fields",db_fields)
+ db_fields[name]=self
+
+
+
[docs]classNDBField(NAttributeProperty):
+ """
+ Component In-Memory Attribute Descriptor.
+ Allows you to set in-memory attributes related to a component on the class.
+ It uses NAttributeProperty under the hood but prefixes the key with the component name.
+ """
+
+ def__set_name__(self,owner,name):
+ """
+ Called when descriptor is first assigned to the class.
+
+ Args:
+ owner (object): The component class on which this is set
+ name (str): The name that was used to set the DBField.
+ """
+ key=f"{owner.name}::{name}"
+ self._key=key
+ ndb_fields=getattr(owner,"_ndb_fields",None)
+ ifndb_fieldsisNone:
+ ndb_fields={}
+ setattr(owner,"_ndb_fields",ndb_fields)
+ ndb_fields[name]=self
+
+
+
[docs]classTagField:
+ """
+ Component Tags Descriptor.
+ Allows you to set Tags related to a component on the class.
+ The tags are set with a prefixed category, so it can support
+ multiple tags or enforce a single one.
+
+ Default value of a tag is added when the component is registered.
+ Tags are removed if the component itself is removed.
+ """
+
+
+
+ def__set_name__(self,owner,name):
+ """
+ Called when TagField is first assigned to the class.
+ It is called with the component class and the name of the field.
+ """
+ self._category_key=f"{owner.name}::{name}"
+ tag_fields=getattr(owner,"_tag_fields",None)
+ iftag_fieldsisNone:
+ tag_fields={}
+ setattr(owner,"_tag_fields",tag_fields)
+ tag_fields[name]=self
+
+ def__get__(self,instance,owner):
+ """
+ Called when retrieving the value of the TagField.
+ It is called with the component instance and the class.
+ """
+ tag_value=instance.host.tags.get(
+ default=self._default,
+ category=self._category_key,
+ )
+ returntag_value
+
+ def__set__(self,instance,value):
+ """
+ Called when setting a value on the TagField.
+ It is called with the component instance and the value.
+ """
+
+ tag_handler=instance.host.tags
+ ifself._enforce_single:
+ tag_handler.clear(category=self._category_key)
+
+ tag_handler.add(
+ key=value,
+ category=self._category_key,
+ )
+
+ def__delete__(self,instance):
+ """
+ Used when 'del' is called on the TagField.
+ It is called with the component instance.
+ """
+ instance.host.tags.clear(category=self._category_key)
Source code for evennia.contrib.base_systems.components.holder
+"""
+Components - ChrisLR 2022
+
+This file contains the classes that allow a typeclass to use components.
+"""
+
+fromevennia.contrib.base_systemsimportcomponents
+fromevennia.contrib.base_systems.componentsimportsignals
+
+
+
[docs]classComponentProperty:
+ """
+ This allows you to register a component on a typeclass.
+ Components registered with this property are automatically added
+ to any instance of this typeclass.
+
+ Defaults can be overridden for this typeclass by passing kwargs
+ """
+
+
[docs]def__init__(self,component_name,**kwargs):
+ """
+ Initializes the descriptor
+
+ Args:
+ component_name (str): The name of the component
+ **kwargs (any): Key=Values overriding default values of the component
+ """
+ self.component_name=component_name
+ self.values=kwargs
+
+ def__get__(self,instance,owner):
+ component=instance.components.get(self.component_name)
+ returncomponent
+
+ def__set__(self,instance,value):
+ raiseException("Cannot set a class property")
+
+ def__set_name__(self,owner,name):
+ class_components=getattr(owner,"_class_components",None)
+ ifnotclass_components:
+ class_components=[]
+ setattr(owner,"_class_components",class_components)
+
+ class_components.append((self.component_name,self.values))
+
+
+
[docs]classComponentHandler:
+ """
+ This is the handler that will be added to any typeclass that inherits from ComponentHolder.
+ It lets you add or remove components and will load components as needed.
+ It stores the list of registered components on the host .db with component_names as key.
+ """
+
+
[docs]defadd(self,component):
+ """
+ Method to add a Component to a host.
+ It caches the loaded component and appends its name to the host's component name list.
+ It will also call the component's 'at_added' method, passing its host.
+
+ Args:
+ component (object): The 'loaded' component instance to add.
+
+ """
+ self._set_component(component)
+ self.db_names.append(component.name)
+ self._add_component_tags(component)
+ component.at_added(self.host)
+ self.host.signals.add_object_listeners_and_responders(component)
+
+
[docs]defadd_default(self,name):
+ """
+ Method to add a Component initialized to default values on a host.
+ It will retrieve the proper component and instanciate it with 'default_create'.
+ It will cache this new component and add it to its list.
+ It will also call the component's 'at_added' method, passing its host.
+
+ Args:
+ name (str): The name of the component class to add.
+
+ """
+ component=components.get_component_class(name)
+ ifnotcomponent:
+ raiseComponentDoesNotExist(f"Component {name} does not exist.")
+
+ new_component=component.default_create(self.host)
+ self._set_component(new_component)
+ self.db_names.append(name)
+ self._add_component_tags(new_component)
+ new_component.at_added(self.host)
+ self.host.signals.add_object_listeners_and_responders(new_component)
+
+ def_add_component_tags(self,component):
+ """
+ Private method that adds the Tags set on a Component via TagFields
+ It will also add the name of the component so objects can be filtered
+ by the components the implement.
+
+ Args:
+ component (object): The component instance that is added.
+ """
+ self.host.tags.add(component.name,category="components")
+ fortag_field_nameincomponent.tag_field_names:
+ default_tag=type(component).__dict__[tag_field_name]._default
+ ifdefault_tag:
+ setattr(component,tag_field_name,default_tag)
+
+
[docs]defremove(self,component):
+ """
+ Method to remove a component instance from a host.
+ It removes the component from the cache and listing.
+ It will call the component's 'at_removed' method.
+
+ Args:
+ component (object): The component instance to remove.
+
+ """
+ component_name=component.name
+ ifcomponent_nameinself._loaded_components:
+ self._remove_component_tags(component)
+ component.at_removed(self.host)
+ self.db_names.remove(component_name)
+ self.host.signals.remove_object_listeners_and_responders(component)
+ delself._loaded_components[component_name]
+ else:
+ message=(
+ f"Cannot remove {component_name} from {self.host.name} as it is not registered."
+ )
+ raiseComponentIsNotRegistered(message)
+
+
[docs]defremove_by_name(self,name):
+ """
+ Method to remove a component instance from a host.
+ It removes the component from the cache and listing.
+ It will call the component's 'at_removed' method.
+
+ Args:
+ name (str): The name of the component to remove.
+
+ """
+ instance=self.get(name)
+ ifnotinstance:
+ message=f"Cannot remove {name} from {self.host.name} as it is not registered."
+ raiseComponentIsNotRegistered(message)
+
+ self._remove_component_tags(instance)
+ instance.at_removed(self.host)
+ self.host.signals.remove_object_listeners_and_responders(instance)
+ self.db_names.remove(name)
+
+ delself._loaded_components[name]
+
+ def_remove_component_tags(self,component):
+ """
+ Private method that will remove the Tags set on a Component via TagFields
+ It will also remove the component name tag.
+
+ Args:
+ component (object): The component instance that is removed.
+ """
+ self.host.tags.remove(component.name,category="components")
+ fortag_field_nameincomponent.tag_field_names:
+ delattr(component,tag_field_name)
+
+
[docs]defget(self,name):
+ """
+ Method to retrieve a cached Component instance by its name.
+
+ Args:
+ name (str): The name of the component to retrieve.
+
+ """
+ returnself._loaded_components.get(name)
+
+
[docs]defhas(self,name):
+ """
+ Method to check if a component is registered and ready.
+
+ Args:
+ name (str): The name of the component.
+
+ """
+ returnnameinself._loaded_components
+
+
[docs]definitialize(self):
+ """
+ Method that loads and caches each component currently registered on the host.
+ It retrieves the names from the registered listing and calls 'load' on each
+ prototype class that can be found from this listing.
+
+ """
+ component_names=self.db_names
+ ifnotcomponent_names:
+ return
+
+ forcomponent_nameincomponent_names:
+ component=components.get_component_class(component_name)
+ ifcomponent:
+ component_instance=component.load(self.host)
+ self._set_component(component_instance)
+ self.host.signals.add_object_listeners_and_responders(component_instance)
+ else:
+ message=(
+ f"Could not initialize runtime component {component_name} of {self.host.name}"
+ )
+ raiseComponentDoesNotExist(message)
+
+ def_set_component(self,component):
+ self._loaded_components[component.name]=component
+
+ @property
+ defdb_names(self):
+ """
+ Property shortcut to retrieve the registered component names
+
+ Returns:
+ component_names (iterable): The name of each component that is registered
+
+ """
+ returnself.host.attributes.get("component_names")
+
+ def__getattr__(self,name):
+ returnself.get(name)
+
+
+
[docs]classComponentHolderMixin:
+ """
+ Mixin to add component support to a typeclass
+
+ Components are set on objects using the component.name as an object attribute.
+ All registered components are initialized on the typeclass.
+ They will be of None value if not present in the class components or runtime components.
+ """
+
+
[docs]defbasetype_setup(self):
+ """
+ Method that initializes the ComponentHandler, creates and registers all
+ components that were set on the typeclass using ComponentProperty.
+ """
+ super().basetype_setup()
+ component_names=[]
+ setattr(self,"_component_handler",ComponentHandler(self))
+ setattr(self,"_signal_handler",signals.SignalsHandler(self))
+ class_components=getattr(self,"_class_components",())
+ forcomponent_name,valuesinclass_components:
+ component_class=components.get_component_class(component_name)
+ component=component_class.create(self,**values)
+ component_names.append(component_name)
+ self.components._loaded_components[component_name]=component
+ self.signals.add_object_listeners_and_responders(component)
+
+ self.db.component_names=component_names
+ self.signals.trigger("at_basetype_setup")
+
+
[docs]defbasetype_posthook_setup(self):
+ """
+ Method that add component related tags that were set using ComponentProperty.
+ """
+ super().basetype_posthook_setup()
+ forcomponentinself.components._loaded_components.values():
+ self.components._add_component_tags(component)
+
+ @property
+ defcomponents(self)->ComponentHandler:
+ """
+ Property getter to retrieve the component_handler.
+ Returns:
+ ComponentHandler: This Host's ComponentHandler
+ """
+ returngetattr(self,"_component_handler",None)
+
+ @property
+ defcmp(self)->ComponentHandler:
+ """
+ Shortcut Property getter to retrieve the component_handler.
+ Returns:
+ ComponentHandler: This Host's ComponentHandler
+ """
+ returnself.components
+
+ @property
+ defsignals(self)->signals.SignalsHandler:
+ returngetattr(self,"_signal_handler",None)
Source code for evennia.contrib.base_systems.components.signals
+"""
+Components - ChrisLR 2022
+
+This file contains classes functions related to signals.
+"""
+
+
+
[docs]defas_listener(func=None,signal_name=None):
+ """
+ Decorator style function that marks a method to be connected as listener.
+ It will use the provided signal name and default to the decorated function name.
+
+ Args:
+ func (callable): The method to mark as listener
+ signal_name (str): The name of the signal to listen to, defaults to function name.
+ """
+ ifnotfuncandsignal_name:
+
+ defwrapper(func):
+ func._listener_signal_name=signal_name
+ returnfunc
+
+ returnwrapper
+
+ signal_name=func.__name__
+ func._listener_signal_name=signal_name
+ returnfunc
+
+
+
[docs]defas_responder(func=None,signal_name=None):
+ """
+ Decorator style function that marks a method to be connected as responder.
+ It will use the provided signal name and default to the decorated function name.
+
+ Args:
+ func (callable): The method to mark as responder
+ signal_name (str): The name of the signal to respond to, defaults to function name.
+ """
+ ifnotfuncandsignal_name:
+
+ defwrapper(func):
+ func._responder_signal_name=signal_name
+ returnfunc
+
+ returnwrapper
+
+ signal_name=func.__name__
+ func._responder_signal_name=signal_name
+ returnfunc
+
+
+
[docs]classSignalsHandler(object):
+ """
+ This object handles all about signals.
+ It holds the connected listeners and responders.
+ It allows triggering signals or querying responders.
+ """
+
+
[docs]defadd_listener(self,signal_name,callback):
+ """
+ Connect a listener to a specific signal.
+
+ Args:
+ signal_name (str): The name of the signal to listen to
+ callback (callable): The callable that is called when the signal is triggered
+ """
+
+ signal_listeners=self.listeners.setdefault(signal_name,[])
+ ifcallbacknotinsignal_listeners:
+ signal_listeners.append(callback)
+
+
[docs]defadd_responder(self,signal_name,callback):
+ """
+ Connect a responder to a specific signal.
+
+ Args:
+ signal_name (str): The name of the signal to respond to
+ callback (callable): The callable that is called when the signal is queried
+ """
+
+ signal_responders=self.responders.setdefault(signal_name,[])
+ ifcallbacknotinsignal_responders:
+ signal_responders.append(callback)
+
+
[docs]defremove_listener(self,signal_name,callback):
+ """
+ Removes a listener for a specific signal.
+
+ Args:
+ signal_name (str): The name of the signal to disconnect from
+ callback (callable): The callable that was used to connect
+ """
+
+ signal_listeners=self.listeners.get(signal_name)
+ ifnotsignal_listeners:
+ return
+
+ ifcallbackinsignal_listeners:
+ signal_listeners.remove(callback)
+
+
[docs]defremove_responder(self,signal_name,callback):
+ """
+ Removes a responder for a specific signal.
+
+ Args:
+ signal_name (str): The name of the signal to disconnect from
+ callback (callable): The callable that was used to connect
+ """
+ signal_responders=self.responders.get(signal_name)
+ ifnotsignal_responders:
+ return
+
+ ifcallbackinsignal_responders:
+ signal_responders.remove(callback)
+
+
[docs]deftrigger(self,signal_name,*args,**kwargs):
+ """
+ Triggers a specific signal with specified args and kwargs
+ This method does not return anything
+
+ Args:
+ signal_name (str): The name of the signal to trigger
+ """
+
+ callbacks=self.listeners.get(signal_name)
+ ifnotcallbacks:
+ return
+
+ forcallbackincallbacks:
+ callback(*args,**kwargs)
+
+
[docs]defquery(self,signal_name,*args,default=None,aggregate_func=None,**kwargs):
+ """
+ Queries a specific signal with specified args and kwargs
+ This method will return the responses from its connected responders.
+ If an aggregate_func is specified, it is called with the responses
+ and its result is returned instead.
+
+ Args:
+ signal_name (str): The name of the signal to trigger
+ default (any): The value to use when no responses are given
+ It will be passed to aggregate_func if it is also given.
+ aggregate_func (callable): The function to process the results before returning.
+
+ Returns:
+ list: An iterable of the responses
+ OR the aggregated result when aggregate_func is specified.
+
+ """
+ callbacks=self.responders.get(signal_name)
+
+ ifnotcallbacks:
+ default=[]ifdefaultisNoneelsedefault
+ ifaggregate_func:
+ returnaggregate_func(default)
+ returndefault
+
+ responses=[]
+ forcallbackincallbacks:
+ response=callback(*args,**kwargs)
+ ifresponseisnotNone:
+ responses.append(response)
+
+ ifaggregate_funcandresponses:
+ returnaggregate_func(responses)
+
+ returnresponses
+
+
[docs]defadd_object_listeners_and_responders(self,obj):
+ """
+ This connects the methods marked as listener or responder from an object.
+
+ Args:
+ obj (object): The instance of an object to connect to this handler.
+ """
+ type_host=type(obj)
+ foratt_name,att_objintype_host.__dict__.items():
+ listener_signal_name=getattr(att_obj,"_listener_signal_name",None)
+ iflistener_signal_name:
+ callback=getattr(obj,att_name)
+ self.add_listener(signal_name=listener_signal_name,callback=callback)
+
+ responder_signal_name=getattr(att_obj,"_responder_signal_name",None)
+ ifresponder_signal_name:
+ callback=getattr(obj,att_name)
+ self.add_responder(signal_name=responder_signal_name,callback=callback)
+
+
[docs]defremove_object_listeners_and_responders(self,obj):
+ """
+ This disconnects the methods marked as listener or responder from an object.
+
+ Args:
+ obj (object): The instance of an object to disconnect from this handler.
+ """
+ type_host=type(obj)
+ foratt_name,att_objintype_host.__dict__.items():
+ listener_signal_name=getattr(att_obj,"_listener_signal_name",None)
+ iflistener_signal_name:
+ callback=getattr(obj,att_name)
+ self.remove_listener(signal_name=listener_signal_name,callback=callback)
+
+ responder_signal_name=getattr(att_obj,"_responder_signal_name",None)
+ ifresponder_signal_name:
+ callback=getattr(obj,att_name)
+ self.remove_responder(signal_name=responder_signal_name,callback=callback)
+
+
+
\ No newline at end of file
diff --git a/docs/1.0-dev/_modules/evennia/server/sessionhandler.html b/docs/1.0-dev/_modules/evennia/server/sessionhandler.html
index e55569d438..c02925021c 100644
--- a/docs/1.0-dev/_modules/evennia/server/sessionhandler.html
+++ b/docs/1.0-dev/_modules/evennia/server/sessionhandler.html
@@ -311,7 +311,12 @@
rkwargs[key]=[_validate(data),{}]else:rkwargs[key]=[[_validate(data)],{}]
- rkwargs[key][1]["options"]=options
+ rkwargs[key][1]["options"]=dict(options)
+ # make sure that any "prompt" message will be processed last
+ # by moving it to the end
+ if"prompt"inrkwargs:
+ prompt=rkwargs.pop("prompt")
+ rkwargs["prompt"]=promptreturnrkwargs
[docs]defiter_to_str(iterable,sep=",",endsep=", and",addquote=False):""" This pretty-formats an iterable list as string output, adding an optional alternative separator to the second to last entry. If `addquote`
@@ -414,8 +414,8 @@
iterable (any): Usually an iterable to print. Each element must be possible to present with a string. Note that if this is a generator, it will be consumed by this operation.
- endsep (str, optional): If set, the last item separator will
- be replaced with this value.
+ sep (str, optional): The string to use as a separator for each item in the iterable.
+ endsep (str, optional): The last item separator will be replaced with this value. addquote (bool, optional): This will surround all outgoing values with double quotes.
@@ -423,17 +423,20 @@
str: The list represented as a string. Notes:
- Default is to use 'Oxford comma', like 1, 2, 3, and 4. To remove, give
- `endsep` as just `and`.
+ Default is to use 'Oxford comma', like 1, 2, 3, and 4. Examples: ```python
- >>> list_to_string([1,2,3], endsep='')
+ >>> list_to_string([1,2,3], endsep=',') '1, 2, 3'
+ >>> list_to_string([1,2,3], endsep='')
+ '1, 2 3' >>> list_to_string([1,2,3], ensdep='and') '1, 2 and 3'
- >>> list_to_string([1,2,3], endsep=', and', addquote=True)
+ >>> list_to_string([1,2,3], sep=';', endsep=';')
+ '1; 2; 3'
+ >>> list_to_string([1,2,3], addquote=True) '"1", "2", and "3"' ```
@@ -448,22 +451,19 @@
else:iterable=tuple(str(val)forvaliniterable)
- ifendsep.startswith(","):
+ ifendsep.startswith(sep):# oxford comma alternativeendsep=endsep[1:]iflen_iter<3elseendsepelifendsep:# normal space-separated end separatorendsep=" "+str(endsep).strip()
- else:
- # no separator given - use comma
- endsep=","iflen_iter==1:returnstr(iterable[0])eliflen_iter==2:returnf"{endsep} ".join(str(v)forviniterable)else:
- return", ".join(str(v)forviniterable[:-1])+f"{endsep}{iterable[-1]}"
-search_index_entry = {'aliases': 'remit pemit', 'category': 'admin', 'key': 'emit', 'no_prefix': ' remit pemit', 'tags': '', 'text': '\n admin command for emitting message to multiple objects\n\n Usage:\n emit[/switches] [<obj>, <obj>, ... =] <message>\n remit [<obj>, <obj>, ... =] <message>\n pemit [<obj>, <obj>, ... =] <message>\n\n Switches:\n room - limit emits to rooms only (default)\n accounts - limit emits to accounts only\n contents - send to the contents of matched objects too\n\n Emits a message to the selected objects or to\n your immediate surroundings. If the object is a room,\n send to its contents. remit and pemit are just\n limited forms of emit, for sending to rooms and\n to accounts respectively.\n '}¶
+search_index_entry = {'aliases': 'pemit remit', 'category': 'admin', 'key': 'emit', 'no_prefix': ' pemit remit', 'tags': '', 'text': '\n admin command for emitting message to multiple objects\n\n Usage:\n emit[/switches] [<obj>, <obj>, ... =] <message>\n remit [<obj>, <obj>, ... =] <message>\n pemit [<obj>, <obj>, ... =] <message>\n\n Switches:\n room - limit emits to rooms only (default)\n accounts - limit emits to accounts only\n contents - send to the contents of matched objects too\n\n Emits a message to the selected objects or to\n your immediate surroundings. If the object is a room,\n send to its contents. remit and pemit are just\n limited forms of emit, for sending to rooms and\n to accounts respectively.\n '}¶
diff --git a/docs/1.0-dev/api/evennia.commands.default.building.html b/docs/1.0-dev/api/evennia.commands.default.building.html
index 3fe8bd4a23..a3af7a0803 100644
--- a/docs/1.0-dev/api/evennia.commands.default.building.html
+++ b/docs/1.0-dev/api/evennia.commands.default.building.html
@@ -543,7 +543,7 @@ You can specify the /force switch to bypass this confirmation.
@@ -584,7 +584,7 @@ You can specify the /force switch to bypass this confirmation.
-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 '}¶
+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': '@swap @typeclasses @update @parent @type', 'category': 'building', 'key': '@typeclass', 'no_prefix': 'typeclass swap typeclasses update parent type', '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': '@swap @update @typeclasses @parent @type', 'category': 'building', 'key': '@typeclass', 'no_prefix': 'typeclass swap update typeclasses parent type', '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/1.0-dev/api/evennia.commands.default.comms.html b/docs/1.0-dev/api/evennia.commands.default.comms.html
index 21cde9949e..7f2e94325e 100644
--- a/docs/1.0-dev/api/evennia.commands.default.comms.html
+++ b/docs/1.0-dev/api/evennia.commands.default.comms.html
@@ -207,7 +207,7 @@ ban mychannel1,mychannel2= EvilUser : Was banned for spamming.
-search_index_entry = {'aliases': '@channels @chan', 'category': 'comms', 'key': '@channel', 'no_prefix': 'channel channels chan', 'tags': '', 'text': "\n Use and manage in-game channels.\n\n Usage:\n channel channelname <msg>\n channel channel name = <msg>\n channel (show all subscription)\n channel/all (show available channels)\n channel/alias channelname = alias[;alias...]\n channel/unalias alias\n channel/who channelname\n channel/history channelname [= index]\n channel/sub channelname [= alias[;alias...]]\n channel/unsub channelname[,channelname, ...]\n channel/mute channelname[,channelname,...]\n channel/unmute channelname[,channelname,...]\n\n channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n channel/desc channelname = description\n channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n channel/ban channelname (list bans)\n channel/ban[/quiet] channelname[, channelname, ...] = subscribername [: reason]\n channel/unban[/quiet] channelname[, channelname, ...] = subscribername\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n\n # subtopics\n\n ## sending\n\n Usage: channel channelname msg\n channel channel name = msg (with space in channel name)\n\n This sends a message to the channel. Note that you will rarely use this\n command like this; instead you can use the alias\n\n channelname <msg>\n channelalias <msg>\n\n For example\n\n public Hello World\n pub Hello World\n\n (this shortcut doesn't work for aliases containing spaces)\n\n See channel/alias for help on setting channel aliases.\n\n ## alias and unalias\n\n Usage: channel/alias channel = alias[;alias[;alias...]]\n channel/unalias alias\n channel - this will list your subs and aliases to each channel\n\n Set one or more personal aliases for referencing a channel. For example:\n\n channel/alias warrior's guild = warrior;wguild;warchannel;warrior guild\n\n You can now send to the channel using all of these:\n\n warrior's guild Hello\n warrior Hello\n wguild Hello\n warchannel Hello\n\n Note that this will not work if the alias has a space in it. So the\n 'warrior guild' alias must be used with the `channel` command:\n\n channel warrior guild = Hello\n\n Channel-aliases can be removed one at a time, using the '/unalias' switch.\n\n ## who\n\n Usage: channel/who channelname\n\n List the channel's subscribers. Shows who are currently offline or are\n muting the channel. Subscribers who are 'muting' will not see messages sent\n to the channel (use channel/mute to mute a channel).\n\n ## history\n\n Usage: channel/history channel [= index]\n\n This will display the last |c20|n lines of channel history. By supplying an\n index number, you will step that many lines back before viewing those 20 lines.\n\n For example:\n\n channel/history public = 35\n\n will go back 35 lines and show the previous 20 lines from that point (so\n lines -35 to -55).\n\n ## sub and unsub\n\n Usage: channel/sub channel [=alias[;alias;...]]\n channel/unsub channel\n\n This subscribes you to a channel and optionally assigns personal shortcuts\n for you to use to send to that channel (see aliases). When you unsub, all\n your personal aliases will also be removed.\n\n ## mute and unmute\n\n Usage: channel/mute channelname\n channel/unmute channelname\n\n Muting silences all output from the channel without actually\n un-subscribing. Other channel members will see that you are muted in the /who\n list. Sending a message to the channel will automatically unmute you.\n\n ## create and destroy\n\n Usage: channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n\n Creates a new channel (or destroys one you control). You will automatically\n join the channel you create and everyone will be kicked and loose all aliases\n to a destroyed channel.\n\n ## lock and unlock\n\n Usage: channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n\n Note: this is an admin command.\n\n A lockstring is on the form locktype:lockfunc(). Channels understand three\n locktypes:\n listen - who may listen or join the channel.\n send - who may send messages to the channel\n control - who controls the channel. This is usually the one creating\n the channel.\n\n Common lockfuncs are all() and perm(). To make a channel everyone can\n listen to but only builders can talk on, use this:\n\n listen:all()\n send: perm(Builders)\n\n ## boot and ban\n\n Usage:\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n channel/ban channelname[, channelname, ...] = subscribername [: reason]\n channel/unban channelname[, channelname, ...] = subscribername\n channel/unban channelname\n channel/ban channelname (list bans)\n\n Booting will kick a named subscriber from channel(s) temporarily. The\n 'reason' will be passed to the booted user. Unless the /quiet switch is\n used, the channel will also be informed of the action. A booted user is\n still able to re-connect, but they'll have to set up their aliases again.\n\n Banning will blacklist a user from (re)joining the provided channels. It\n will then proceed to boot them from those channels if they were connected.\n The 'reason' and `/quiet` works the same as for booting.\n\n Example:\n boot mychannel1 = EvilUser : Kicking you to cool down a bit.\n ban mychannel1,mychannel2= EvilUser : Was banned for spamming.\n\n "}¶
+search_index_entry = {'aliases': '@chan @channels', 'category': 'comms', 'key': '@channel', 'no_prefix': 'channel chan channels', 'tags': '', 'text': "\n Use and manage in-game channels.\n\n Usage:\n channel channelname <msg>\n channel channel name = <msg>\n channel (show all subscription)\n channel/all (show available channels)\n channel/alias channelname = alias[;alias...]\n channel/unalias alias\n channel/who channelname\n channel/history channelname [= index]\n channel/sub channelname [= alias[;alias...]]\n channel/unsub channelname[,channelname, ...]\n channel/mute channelname[,channelname,...]\n channel/unmute channelname[,channelname,...]\n\n channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n channel/desc channelname = description\n channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n channel/ban channelname (list bans)\n channel/ban[/quiet] channelname[, channelname, ...] = subscribername [: reason]\n channel/unban[/quiet] channelname[, channelname, ...] = subscribername\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n\n # subtopics\n\n ## sending\n\n Usage: channel channelname msg\n channel channel name = msg (with space in channel name)\n\n This sends a message to the channel. Note that you will rarely use this\n command like this; instead you can use the alias\n\n channelname <msg>\n channelalias <msg>\n\n For example\n\n public Hello World\n pub Hello World\n\n (this shortcut doesn't work for aliases containing spaces)\n\n See channel/alias for help on setting channel aliases.\n\n ## alias and unalias\n\n Usage: channel/alias channel = alias[;alias[;alias...]]\n channel/unalias alias\n channel - this will list your subs and aliases to each channel\n\n Set one or more personal aliases for referencing a channel. For example:\n\n channel/alias warrior's guild = warrior;wguild;warchannel;warrior guild\n\n You can now send to the channel using all of these:\n\n warrior's guild Hello\n warrior Hello\n wguild Hello\n warchannel Hello\n\n Note that this will not work if the alias has a space in it. So the\n 'warrior guild' alias must be used with the `channel` command:\n\n channel warrior guild = Hello\n\n Channel-aliases can be removed one at a time, using the '/unalias' switch.\n\n ## who\n\n Usage: channel/who channelname\n\n List the channel's subscribers. Shows who are currently offline or are\n muting the channel. Subscribers who are 'muting' will not see messages sent\n to the channel (use channel/mute to mute a channel).\n\n ## history\n\n Usage: channel/history channel [= index]\n\n This will display the last |c20|n lines of channel history. By supplying an\n index number, you will step that many lines back before viewing those 20 lines.\n\n For example:\n\n channel/history public = 35\n\n will go back 35 lines and show the previous 20 lines from that point (so\n lines -35 to -55).\n\n ## sub and unsub\n\n Usage: channel/sub channel [=alias[;alias;...]]\n channel/unsub channel\n\n This subscribes you to a channel and optionally assigns personal shortcuts\n for you to use to send to that channel (see aliases). When you unsub, all\n your personal aliases will also be removed.\n\n ## mute and unmute\n\n Usage: channel/mute channelname\n channel/unmute channelname\n\n Muting silences all output from the channel without actually\n un-subscribing. Other channel members will see that you are muted in the /who\n list. Sending a message to the channel will automatically unmute you.\n\n ## create and destroy\n\n Usage: channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n\n Creates a new channel (or destroys one you control). You will automatically\n join the channel you create and everyone will be kicked and loose all aliases\n to a destroyed channel.\n\n ## lock and unlock\n\n Usage: channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n\n Note: this is an admin command.\n\n A lockstring is on the form locktype:lockfunc(). Channels understand three\n locktypes:\n listen - who may listen or join the channel.\n send - who may send messages to the channel\n control - who controls the channel. This is usually the one creating\n the channel.\n\n Common lockfuncs are all() and perm(). To make a channel everyone can\n listen to but only builders can talk on, use this:\n\n listen:all()\n send: perm(Builders)\n\n ## boot and ban\n\n Usage:\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n channel/ban channelname[, channelname, ...] = subscribername [: reason]\n channel/unban channelname[, channelname, ...] = subscribername\n channel/unban channelname\n channel/ban channelname (list bans)\n\n Booting will kick a named subscriber from channel(s) temporarily. The\n 'reason' will be passed to the booted user. Unless the /quiet switch is\n used, the channel will also be informed of the action. A booted user is\n still able to re-connect, but they'll have to set up their aliases again.\n\n Banning will blacklist a user from (re)joining the provided channels. It\n will then proceed to boot them from those channels if they were connected.\n The 'reason' and `/quiet` works the same as for booting.\n\n Example:\n boot mychannel1 = EvilUser : Kicking you to cool down a bit.\n ban mychannel1,mychannel2= EvilUser : Was banned for spamming.\n\n "}¶
@@ -580,7 +580,7 @@ placing it in their inventory.
-search_index_entry = {'aliases': '" \'', 'category': 'general', 'key': 'say', 'no_prefix': ' " \'', 'tags': '', 'text': '\n speak as your character\n\n Usage:\n say <message>\n\n Talk to those in your current location.\n '}¶
+search_index_entry = {'aliases': '\' "', 'category': 'general', 'key': 'say', 'no_prefix': ' \' "', 'tags': '', 'text': '\n speak as your character\n\n Usage:\n say <message>\n\n Talk to those in your current location.\n '}¶
@@ -660,7 +660,7 @@ automatically begin with your name.
-search_index_entry = {'aliases': 'emote :', 'category': 'general', 'key': 'pose', 'no_prefix': ' emote :', 'tags': '', 'text': "\n strike a pose\n\n Usage:\n pose <pose text>\n pose's <pose text>\n\n Example:\n pose is standing by the wall, smiling.\n -> others will see:\n Tom is standing by the wall, smiling.\n\n Describe an action being taken. The pose text will\n automatically begin with your name.\n "}¶
+search_index_entry = {'aliases': ': emote', 'category': 'general', 'key': 'pose', 'no_prefix': ' : emote', 'tags': '', 'text': "\n strike a pose\n\n Usage:\n pose <pose text>\n pose's <pose text>\n\n Example:\n pose is standing by the wall, smiling.\n -> others will see:\n Tom is standing by the wall, smiling.\n\n Describe an action being taken. The pose text will\n automatically begin with your name.\n "}¶
diff --git a/docs/1.0-dev/api/evennia.commands.default.system.html b/docs/1.0-dev/api/evennia.commands.default.system.html
index eb2c3f622f..0ee7cb7b8c 100644
--- a/docs/1.0-dev/api/evennia.commands.default.system.html
+++ b/docs/1.0-dev/api/evennia.commands.default.system.html
@@ -634,7 +634,7 @@ See |luhttps://ww
@@ -680,7 +680,7 @@ to all the variables defined therein.
-search_index_entry = {'aliases': '@delays @task', 'category': 'system', 'key': '@tasks', 'no_prefix': 'tasks delays task', 'tags': '', 'text': "\n Display or terminate active tasks (delays).\n\n Usage:\n tasks[/switch] [task_id or function_name]\n\n Switches:\n pause - Pause the callback of a task.\n unpause - Process all callbacks made since pause() was called.\n do_task - Execute the task (call its callback).\n call - Call the callback of this task.\n remove - Remove a task without executing it.\n cancel - Stop a task from automatically executing.\n\n Notes:\n A task is a single use method of delaying the call of a function. Calls are created\n in code, using `evennia.utils.delay`.\n See |luhttps://www.evennia.com/docs/latest/Command-Duration.html|ltthe docs|le for help.\n\n By default, tasks that are canceled and never called are cleaned up after one minute.\n\n Examples:\n - `tasks/cancel move_callback` - Cancels all movement delays from the slow_exit contrib.\n In this example slow exits creates it's tasks with\n `utils.delay(move_delay, move_callback)`\n - `tasks/cancel 2` - Cancel task id 2.\n\n "}¶
+search_index_entry = {'aliases': '@task @delays', 'category': 'system', 'key': '@tasks', 'no_prefix': 'tasks task delays', 'tags': '', 'text': "\n Display or terminate active tasks (delays).\n\n Usage:\n tasks[/switch] [task_id or function_name]\n\n Switches:\n pause - Pause the callback of a task.\n unpause - Process all callbacks made since pause() was called.\n do_task - Execute the task (call its callback).\n call - Call the callback of this task.\n remove - Remove a task without executing it.\n cancel - Stop a task from automatically executing.\n\n Notes:\n A task is a single use method of delaying the call of a function. Calls are created\n in code, using `evennia.utils.delay`.\n See |luhttps://www.evennia.com/docs/latest/Command-Duration.html|ltthe docs|le for help.\n\n By default, tasks that are canceled and never called are cleaned up after one minute.\n\n Examples:\n - `tasks/cancel move_callback` - Cancels all movement delays from the slow_exit contrib.\n In this example slow exits creates it's tasks with\n `utils.delay(move_delay, move_callback)`\n - `tasks/cancel 2` - Cancel task id 2.\n\n "}¶
diff --git a/docs/1.0-dev/api/evennia.commands.default.tests.html b/docs/1.0-dev/api/evennia.commands.default.tests.html
index 148ff302bf..5cb5f08399 100644
--- a/docs/1.0-dev/api/evennia.commands.default.tests.html
+++ b/docs/1.0-dev/api/evennia.commands.default.tests.html
@@ -772,7 +772,7 @@ main test suite started with
Test the batch processor.
-red_button = <module 'evennia.contrib.tutorials.red_button.red_button' from '/tmp/tmp2bilgfln/ce3992f999a164881462d8f878d71a47a8f946cc/evennia/contrib/tutorials/red_button/red_button.py'>¶
+red_button = <module 'evennia.contrib.tutorials.red_button.red_button' from '/tmp/tmp_gjyvxyg/a18e5d0a8173b37abf736951b1644e5500a9b820/evennia/contrib/tutorials/red_button/red_button.py'>¶
Component Attribute Descriptor.
+Allows you to set attributes related to a component on the class.
+It uses AttributeProperty under the hood but prefixes the key with the component name.
Component In-Memory Attribute Descriptor.
+Allows you to set in-memory attributes related to a component on the class.
+It uses NAttributeProperty under the hood but prefixes the key with the component name.
Component Tags Descriptor.
+Allows you to set Tags related to a component on the class.
+The tags are set with a prefixed category, so it can support
+multiple tags or enforce a single one.
+
Default value of a tag is added when the component is registered.
+Tags are removed if the component itself is removed.
This allows you to register a component on a typeclass.
+Components registered with this property are automatically added
+to any instance of this typeclass.
+
Defaults can be overridden for this typeclass by passing kwargs
This is the handler that will be added to any typeclass that inherits from ComponentHolder.
+It lets you add or remove components and will load components as needed.
+It stores the list of registered components on the host .db with component_names as key.
Method to add a Component to a host.
+It caches the loaded component and appends its name to the host’s component name list.
+It will also call the component’s ‘at_added’ method, passing its host.
+
+
Parameters
+
component (object) – The ‘loaded’ component instance to add.
Method to add a Component initialized to default values on a host.
+It will retrieve the proper component and instanciate it with ‘default_create’.
+It will cache this new component and add it to its list.
+It will also call the component’s ‘at_added’ method, passing its host.
+
+
Parameters
+
name (str) – The name of the component class to add.
Method to remove a component instance from a host.
+It removes the component from the cache and listing.
+It will call the component’s ‘at_removed’ method.
+
+
Parameters
+
component (object) – The component instance to remove.
Method to remove a component instance from a host.
+It removes the component from the cache and listing.
+It will call the component’s ‘at_removed’ method.
Method that loads and caches each component currently registered on the host.
+It retrieves the names from the registered listing and calls ‘load’ on each
+prototype class that can be found from this listing.
Components are set on objects using the component.name as an object attribute.
+All registered components are initialized on the typeclass.
+They will be of None value if not present in the class components or runtime components.
This is a basic Component System.
+It allows you to use components on typeclasses using a simple syntax.
+This helps writing isolated code and reusing it over multiple objects.
Decorator style function that marks a method to be connected as listener.
+It will use the provided signal name and default to the decorated function name.
+
+
Parameters
+
+
func (callable) – The method to mark as listener
+
signal_name (str) – The name of the signal to listen to, defaults to function name.
Decorator style function that marks a method to be connected as responder.
+It will use the provided signal name and default to the decorated function name.
+
+
Parameters
+
+
func (callable) – The method to mark as responder
+
signal_name (str) – The name of the signal to respond to, defaults to function name.
Queries a specific signal with specified args and kwargs
+This method will return the responses from its connected responders.
+If an aggregate_func is specified, it is called with the responses
+and its result is returned instead.
+
+
Parameters
+
+
signal_name (str) – The name of the signal to trigger
+
default (any) – The value to use when no responses are given
+It will be passed to aggregate_func if it is also given.
+
aggregate_func (callable) – The function to process the results before returning.
+
+
+
Returns
+
list –
+
+
An iterable of the responses
OR the aggregated result when aggregate_func is specified.
Component Attribute Descriptor.
+Allows you to set attributes related to a component on the class.
+It uses AttributeProperty under the hood but prefixes the key with the component name.
Component Attribute Descriptor.
+Allows you to set attributes related to a component on the class.
+It uses AttributeProperty under the hood but prefixes the key with the component name.
Component Attribute Descriptor.
+Allows you to set attributes related to a component on the class.
+It uses AttributeProperty under the hood but prefixes the key with the component name.
Component Attribute Descriptor.
+Allows you to set attributes related to a component on the class.
+It uses AttributeProperty under the hood but prefixes the key with the component name.
Component Tags Descriptor.
+Allows you to set Tags related to a component on the class.
+The tags are set with a prefixed category, so it can support
+multiple tags or enforce a single one.
+
Default value of a tag is added when the component is registered.
+Tags are removed if the component itself is removed.
Component Tags Descriptor.
+Allows you to set Tags related to a component on the class.
+The tags are set with a prefixed category, so it can support
+multiple tags or enforce a single one.
+
Default value of a tag is added when the component is registered.
+Tags are removed if the component itself is removed.
Component Tags Descriptor.
+Allows you to set Tags related to a component on the class.
+The tags are set with a prefixed category, so it can support
+multiple tags or enforce a single one.
+
Default value of a tag is added when the component is registered.
+Tags are removed if the component itself is removed.
Component Tags Descriptor.
+Allows you to set Tags related to a component on the class.
+The tags are set with a prefixed category, so it can support
+multiple tags or enforce a single one.
+
Default value of a tag is added when the component is registered.
+Tags are removed if the component itself is removed.
Component Attribute Descriptor.
+Allows you to set attributes related to a component on the class.
+It uses AttributeProperty under the hood but prefixes the key with the component name.
Component Attribute Descriptor.
+Allows you to set attributes related to a component on the class.
+It uses AttributeProperty under the hood but prefixes the key with the component name.
Component Tags Descriptor.
+Allows you to set Tags related to a component on the class.
+The tags are set with a prefixed category, so it can support
+multiple tags or enforce a single one.
+
Default value of a tag is added when the component is registered.
+Tags are removed if the component itself is removed.
This allows you to register a component on a typeclass.
+Components registered with this property are automatically added
+to any instance of this typeclass.
+
Defaults can be overridden for this typeclass by passing kwargs
This allows you to register a component on a typeclass.
+Components registered with this property are automatically added
+to any instance of this typeclass.
+
Defaults can be overridden for this typeclass by passing kwargs
-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 "}¶
+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 "}¶
diff --git a/docs/1.0-dev/api/evennia.contrib.full_systems.evscaperoom.commands.html b/docs/1.0-dev/api/evennia.contrib.full_systems.evscaperoom.commands.html
index 8d3b9dc583..5fc884b867 100644
--- a/docs/1.0-dev/api/evennia.contrib.full_systems.evscaperoom.commands.html
+++ b/docs/1.0-dev/api/evennia.contrib.full_systems.evscaperoom.commands.html
@@ -162,7 +162,7 @@ the operation will be general or on the room.
-search_index_entry = {'aliases': 'chicken out quit q abort', 'category': 'evscaperoom', 'key': 'give up', 'no_prefix': ' chicken out quit q abort', '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': 'chicken out q quit abort', 'category': 'evscaperoom', 'key': 'give up', 'no_prefix': ' chicken out q quit abort', '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': 'pose :', 'category': 'general', 'key': 'emote', 'no_prefix': ' pose :', 'tags': '', 'text': '\n Perform a free-form emote. Use /me to\n include yourself in the emote and /name\n to include other objects or characters.\n Use "..." to enact speech.\n\n Usage:\n emote <emote>\n :<emote\n\n Example:\n emote /me smiles at /peter\n emote /me points to /box and /lever.\n\n '}¶
+search_index_entry = {'aliases': ': pose', 'category': 'general', 'key': 'emote', 'no_prefix': ' : pose', 'tags': '', 'text': '\n Perform a free-form emote. Use /me to\n include yourself in the emote and /name\n to include other objects or characters.\n Use "..." to enact speech.\n\n Usage:\n emote <emote>\n :<emote\n\n Example:\n emote /me smiles at /peter\n emote /me points to /box and /lever.\n\n '}¶
@@ -441,7 +441,7 @@ looks and what actions is available.
-search_index_entry = {'aliases': 'ex examine unfocus e', 'category': 'evscaperoom', 'key': 'focus', 'no_prefix': ' ex examine unfocus e', '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': 'examine e ex unfocus', 'category': 'evscaperoom', 'key': 'focus', 'no_prefix': ' examine e ex unfocus', '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 '}¶
@@ -600,7 +600,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/1.0-dev/api/evennia.contrib.game_systems.barter.barter.html b/docs/1.0-dev/api/evennia.contrib.game_systems.barter.barter.html
index 86c44920d2..1da1e06dc1 100644
--- a/docs/1.0-dev/api/evennia.contrib.game_systems.barter.barter.html
+++ b/docs/1.0-dev/api/evennia.contrib.game_systems.barter.barter.html
@@ -696,7 +696,7 @@ try to influence the other part in the deal.
@@ -722,7 +722,7 @@ try to influence the other part in the deal.
-search_index_entry = {'aliases': 'offers deal', 'category': 'trading', 'key': 'status', 'no_prefix': ' offers deal', 'tags': '', 'text': "\n show a list of the current deal\n\n Usage:\n status\n deal\n offers\n\n Shows the currently suggested offers on each sides of the deal. To\n accept the current deal, use the 'accept' command. Use 'offer' to\n change your deal. You might also want to use 'say', 'emote' etc to\n try to influence the other part in the deal.\n "}¶
+search_index_entry = {'aliases': 'deal offers', 'category': 'trading', 'key': 'status', 'no_prefix': ' deal offers', 'tags': '', 'text': "\n show a list of the current deal\n\n Usage:\n status\n deal\n offers\n\n Shows the currently suggested offers on each sides of the deal. To\n accept the current deal, use the 'accept' command. Use 'offer' to\n change your deal. You might also want to use 'say', 'emote' etc to\n try to influence the other part in the deal.\n "}¶
diff --git a/docs/1.0-dev/api/evennia.contrib.game_systems.turnbattle.tb_basic.html b/docs/1.0-dev/api/evennia.contrib.game_systems.turnbattle.tb_basic.html
index 8556688b9e..a0cfe3814c 100644
--- a/docs/1.0-dev/api/evennia.contrib.game_systems.turnbattle.tb_basic.html
+++ b/docs/1.0-dev/api/evennia.contrib.game_systems.turnbattle.tb_basic.html
@@ -623,7 +623,7 @@ if there are still any actions you can take.
@@ -649,7 +649,7 @@ if there are still any actions you can take.
-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 '}¶
+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 '}¶
diff --git a/docs/1.0-dev/api/evennia.contrib.game_systems.turnbattle.tb_equip.html b/docs/1.0-dev/api/evennia.contrib.game_systems.turnbattle.tb_equip.html
index ea6c9eab80..4917940612 100644
--- a/docs/1.0-dev/api/evennia.contrib.game_systems.turnbattle.tb_equip.html
+++ b/docs/1.0-dev/api/evennia.contrib.game_systems.turnbattle.tb_equip.html
@@ -518,7 +518,7 @@ if there are still any actions you can take.
@@ -538,7 +538,7 @@ if there are still any actions you can take.
-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 '}¶
+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 '}¶
diff --git a/docs/1.0-dev/api/evennia.contrib.game_systems.turnbattle.tb_items.html b/docs/1.0-dev/api/evennia.contrib.game_systems.turnbattle.tb_items.html
index d352f4e704..7f0b2673e0 100644
--- a/docs/1.0-dev/api/evennia.contrib.game_systems.turnbattle.tb_items.html
+++ b/docs/1.0-dev/api/evennia.contrib.game_systems.turnbattle.tb_items.html
@@ -641,7 +641,7 @@ if there are still any actions you can take.
@@ -661,7 +661,7 @@ if there are still any actions you can take.
-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 '}¶
+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 '}¶
diff --git a/docs/1.0-dev/api/evennia.contrib.game_systems.turnbattle.tb_magic.html b/docs/1.0-dev/api/evennia.contrib.game_systems.turnbattle.tb_magic.html
index 069c94c28f..1fbdf077da 100644
--- a/docs/1.0-dev/api/evennia.contrib.game_systems.turnbattle.tb_magic.html
+++ b/docs/1.0-dev/api/evennia.contrib.game_systems.turnbattle.tb_magic.html
@@ -420,7 +420,7 @@ if there are still any actions you can take.
@@ -440,7 +440,7 @@ if there are still any actions you can take.
-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 '}¶
+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 '}¶
diff --git a/docs/1.0-dev/api/evennia.contrib.game_systems.turnbattle.tb_range.html b/docs/1.0-dev/api/evennia.contrib.game_systems.turnbattle.tb_range.html
index 47fe6be620..66421ba3be 100644
--- a/docs/1.0-dev/api/evennia.contrib.game_systems.turnbattle.tb_range.html
+++ b/docs/1.0-dev/api/evennia.contrib.game_systems.turnbattle.tb_range.html
@@ -880,7 +880,7 @@ if there are still any actions you can take.
@@ -900,7 +900,7 @@ if there are still any actions you can take.
-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 '}¶
+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 '}¶
diff --git a/docs/1.0-dev/api/evennia.contrib.html b/docs/1.0-dev/api/evennia.contrib.html
index 6d2bfd1d3d..e63d472b76 100644
--- a/docs/1.0-dev/api/evennia.contrib.html
+++ b/docs/1.0-dev/api/evennia.contrib.html
@@ -72,6 +72,14 @@ useful but are deemed too game-specific to go into the core library.
diff --git a/docs/1.0-dev/api/evennia.contrib.rpg.dice.dice.html b/docs/1.0-dev/api/evennia.contrib.rpg.dice.dice.html
index 426cf798dd..113012046b 100644
--- a/docs/1.0-dev/api/evennia.contrib.rpg.dice.dice.html
+++ b/docs/1.0-dev/api/evennia.contrib.rpg.dice.dice.html
@@ -246,7 +246,7 @@ everyone but the person rolling.
@@ -272,7 +272,7 @@ everyone but the person rolling.
-search_index_entry = {'aliases': '@dice roll', 'category': 'general', 'key': 'dice', 'no_prefix': ' dice roll', 'tags': '', 'text': "\n roll dice\n\n Usage:\n dice[/switch] <nr>d<sides> [modifier] [success condition]\n\n Switch:\n hidden - tell the room the roll is being done, but don't show the result\n secret - don't inform the room about neither roll nor result\n\n Examples:\n dice 3d6 + 4\n dice 1d100 - 2 < 50\n\n This will roll the given number of dice with given sides and modifiers.\n So e.g. 2d6 + 3 means to 'roll a 6-sided die 2 times and add the result,\n then add 3 to the total'.\n Accepted modifiers are +, -, * and /.\n A success condition is given as normal Python conditionals\n (<,>,<=,>=,==,!=). So e.g. 2d6 + 3 > 10 means that the roll will succeed\n only if the final result is above 8. If a success condition is given, the\n outcome (pass/fail) will be echoed along with how much it succeeded/failed\n with. The hidden/secret switches will hide all or parts of the roll from\n everyone but the person rolling.\n "}¶
+search_index_entry = {'aliases': 'roll @dice', 'category': 'general', 'key': 'dice', 'no_prefix': ' roll dice', 'tags': '', 'text': "\n roll dice\n\n Usage:\n dice[/switch] <nr>d<sides> [modifier] [success condition]\n\n Switch:\n hidden - tell the room the roll is being done, but don't show the result\n secret - don't inform the room about neither roll nor result\n\n Examples:\n dice 3d6 + 4\n dice 1d100 - 2 < 50\n\n This will roll the given number of dice with given sides and modifiers.\n So e.g. 2d6 + 3 means to 'roll a 6-sided die 2 times and add the result,\n then add 3 to the total'.\n Accepted modifiers are +, -, * and /.\n A success condition is given as normal Python conditionals\n (<,>,<=,>=,==,!=). So e.g. 2d6 + 3 > 10 means that the roll will succeed\n only if the final result is above 8. If a success condition is given, the\n outcome (pass/fail) will be echoed along with how much it succeeded/failed\n with. The hidden/secret switches will hide all or parts of the roll from\n everyone but the person rolling.\n "}¶
diff --git a/docs/1.0-dev/api/evennia.contrib.rpg.rpsystem.rpsystem.html b/docs/1.0-dev/api/evennia.contrib.rpg.rpsystem.rpsystem.html
index a1e318733c..c3f978a47a 100644
--- a/docs/1.0-dev/api/evennia.contrib.rpg.rpsystem.rpsystem.html
+++ b/docs/1.0-dev/api/evennia.contrib.rpg.rpsystem.rpsystem.html
@@ -640,7 +640,7 @@ a different language.
-search_index_entry = {'aliases': '" \'', 'category': 'general', 'key': 'say', 'no_prefix': ' " \'', 'tags': '', 'text': '\n speak as your character\n\n Usage:\n say <message>\n\n Talk to those in your current location.\n '}¶
+search_index_entry = {'aliases': '\' "', 'category': 'general', 'key': 'say', 'no_prefix': ' \' "', 'tags': '', 'text': '\n speak as your character\n\n Usage:\n say <message>\n\n Talk to those in your current location.\n '}¶
diff --git a/docs/1.0-dev/api/evennia.contrib.tutorials.red_button.red_button.html b/docs/1.0-dev/api/evennia.contrib.tutorials.red_button.red_button.html
index 6f3012636d..d422663d23 100644
--- a/docs/1.0-dev/api/evennia.contrib.tutorials.red_button.red_button.html
+++ b/docs/1.0-dev/api/evennia.contrib.tutorials.red_button.red_button.html
@@ -96,7 +96,7 @@ such as when closing the lid and un-blinding a character.
-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 lid smash', 'category': 'general', 'key': 'smash glass', 'no_prefix': ' break lid smash lid smash', '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': 'get examine listen l ex feel', 'category': 'general', 'key': 'look', 'no_prefix': ' get examine listen l ex feel', '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': 'examine feel listen l get ex', 'category': 'general', 'key': 'look', 'no_prefix': ' examine feel listen l get ex', '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/1.0-dev/api/evennia.contrib.tutorials.tutorial_world.objects.html b/docs/1.0-dev/api/evennia.contrib.tutorials.tutorial_world.objects.html
index ce02a98aa9..c12f8e3c6c 100644
--- a/docs/1.0-dev/api/evennia.contrib.tutorials.tutorial_world.objects.html
+++ b/docs/1.0-dev/api/evennia.contrib.tutorials.tutorial_world.objects.html
@@ -507,7 +507,7 @@ shift green root up/down
@@ -756,7 +756,7 @@ parry - forgoes your attack but will make you harder to hit on next
-search_index_entry = {'aliases': 'bash stab chop fight defend parry hit pierce thrust kill slash', 'category': 'tutorialworld', 'key': 'attack', 'no_prefix': ' bash stab chop fight defend parry hit pierce thrust kill slash', '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 fight slash pierce parry defend chop thrust bash hit kill', 'category': 'tutorialworld', 'key': 'attack', 'no_prefix': ' stab fight slash pierce parry defend chop thrust bash hit kill', '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/1.0-dev/api/evennia.contrib.tutorials.tutorial_world.rooms.html b/docs/1.0-dev/api/evennia.contrib.tutorials.tutorial_world.rooms.html
index 2e458e4820..d09ba93e31 100644
--- a/docs/1.0-dev/api/evennia.contrib.tutorials.tutorial_world.rooms.html
+++ b/docs/1.0-dev/api/evennia.contrib.tutorials.tutorial_world.rooms.html
@@ -919,7 +919,7 @@ to find something.
@@ -947,7 +947,7 @@ random chance of eventually finding a light source.
-search_index_entry = {'aliases': 'fiddle search feel around l feel', 'category': 'tutorialworld', 'key': 'look', 'no_prefix': ' fiddle search feel around l feel', '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': 'fiddle feel feel around search l', 'category': 'tutorialworld', 'key': 'look', 'no_prefix': ' fiddle feel feel around search l', '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/1.0-dev/api/evennia.html b/docs/1.0-dev/api/evennia.html
index d563618291..a1bf730b70 100644
--- a/docs/1.0-dev/api/evennia.html
+++ b/docs/1.0-dev/api/evennia.html
@@ -207,6 +207,14 @@ with ‘q’, remove the break line and restart server when finished.
-search_index_entry = {'aliases': 'n __nomatch_command y a yes no abort', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' n __nomatch_command y a yes no abort', 'tags': '', 'text': '\n Handle a prompt for yes or no. Press [return] for the default choice.\n\n '}¶
+search_index_entry = {'aliases': 'n no a __nomatch_command y abort yes', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' n no a __nomatch_command y abort yes', 'tags': '', 'text': '\n Handle a prompt for yes or no. Press [return] for the default choice.\n\n '}¶
diff --git a/docs/1.0-dev/api/evennia.utils.evmore.html b/docs/1.0-dev/api/evennia.utils.evmore.html
index cc872d90c3..35ee9d5d38 100644
--- a/docs/1.0-dev/api/evennia.utils.evmore.html
+++ b/docs/1.0-dev/api/evennia.utils.evmore.html
@@ -88,7 +88,7 @@ the caller.msg() construct every time the page is updated.
@@ -114,7 +114,7 @@ the caller.msg() construct every time the page is updated.
-search_index_entry = {'aliases': 'n abort previous p t end a top e quit q next', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' n abort previous p t end a top e quit q next', 'tags': '', 'text': '\n Manipulate the text paging. Catch no-input with aliases.\n '}¶
+search_index_entry = {'aliases': 'n p a quit t e next q previous top end abort', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' n p a quit t e next q previous top end abort', 'tags': '', 'text': '\n Manipulate the text paging. Catch no-input with aliases.\n '}¶
diff --git a/docs/1.0-dev/api/evennia.utils.utils.html b/docs/1.0-dev/api/evennia.utils.utils.html
index 3cac509ac8..f904575bdd 100644
--- a/docs/1.0-dev/api/evennia.utils.utils.html
+++ b/docs/1.0-dev/api/evennia.utils.utils.html
@@ -247,7 +247,7 @@ Defaults to client’s default width.
This pretty-formats an iterable list as string output, adding an optional
alternative separator to the second to last entry. If addquote
is True, the outgoing strings will be surrounded by quotes.
@@ -257,8 +257,8 @@ is True, the outgoing strings will be surrounded by quotes.
iterable (any) – Usually an iterable to print. Each element must be possible to
present with a string. Note that if this is a generator, it will be
consumed by this operation.
-
endsep (str, optional) – If set, the last item separator will
-be replaced with this value.
+
sep (str, optional) – The string to use as a separator for each item in the iterable.
+
endsep (str, optional) – The last item separator will be replaced with this value.
addquote (bool, optional) – This will surround all outgoing
values with double quotes.
@@ -268,14 +268,17 @@ values with double quotes.
Notes
-
Default is to use ‘Oxford comma’, like 1, 2, 3, and 4. To remove, give
-endsep as just and.
+
Default is to use ‘Oxford comma’, like 1, 2, 3, and 4.
This pretty-formats an iterable list as string output, adding an optional
alternative separator to the second to last entry. If addquote
is True, the outgoing strings will be surrounded by quotes.
@@ -293,8 +296,8 @@ is True, the outgoing strings will be surrounded by quotes.
iterable (any) – Usually an iterable to print. Each element must be possible to
present with a string. Note that if this is a generator, it will be
consumed by this operation.
-
endsep (str, optional) – If set, the last item separator will
-be replaced with this value.
+
sep (str, optional) – The string to use as a separator for each item in the iterable.
+
endsep (str, optional) – The last item separator will be replaced with this value.
addquote (bool, optional) – This will surround all outgoing
values with double quotes.
@@ -304,14 +307,17 @@ values with double quotes.
Notes
-
Default is to use ‘Oxford comma’, like 1, 2, 3, and 4. To remove, give
-endsep as just and.
+
Default is to use ‘Oxford comma’, like 1, 2, 3, and 4.
This pretty-formats an iterable list as string output, adding an optional
alternative separator to the second to last entry. If addquote
is True, the outgoing strings will be surrounded by quotes.
@@ -329,8 +335,8 @@ is True, the outgoing strings will be surrounded by quotes.
iterable (any) – Usually an iterable to print. Each element must be possible to
present with a string. Note that if this is a generator, it will be
consumed by this operation.
-
endsep (str, optional) – If set, the last item separator will
-be replaced with this value.
+
sep (str, optional) – The string to use as a separator for each item in the iterable.
+
endsep (str, optional) – The last item separator will be replaced with this value.
addquote (bool, optional) – This will surround all outgoing
values with double quotes.
@@ -340,14 +346,17 @@ values with double quotes.
Notes
-
Default is to use ‘Oxford comma’, like 1, 2, 3, and 4. To remove, give
-endsep as just and.
+
Default is to use ‘Oxford comma’, like 1, 2, 3, and 4.