Merge branch 'develop' into contrib/tutorial-game
This commit is contained in:
commit
7c1b59d6a8
3 changed files with 55 additions and 7 deletions
|
|
@ -64,6 +64,7 @@ class ComponentHandler:
|
||||||
"""
|
"""
|
||||||
self._set_component(component)
|
self._set_component(component)
|
||||||
self.db_names.append(component.name)
|
self.db_names.append(component.name)
|
||||||
|
self.host.tags.add(component.name, category="components")
|
||||||
component.at_added(self.host)
|
component.at_added(self.host)
|
||||||
|
|
||||||
def add_default(self, name):
|
def add_default(self, name):
|
||||||
|
|
@ -84,6 +85,7 @@ class ComponentHandler:
|
||||||
new_component = component.default_create(self.host)
|
new_component = component.default_create(self.host)
|
||||||
self._set_component(new_component)
|
self._set_component(new_component)
|
||||||
self.db_names.append(name)
|
self.db_names.append(name)
|
||||||
|
self.host.tags.add(name, category="components")
|
||||||
new_component.at_added(self.host)
|
new_component.at_added(self.host)
|
||||||
|
|
||||||
def remove(self, component):
|
def remove(self, component):
|
||||||
|
|
@ -100,6 +102,7 @@ class ComponentHandler:
|
||||||
if component_name in self._loaded_components:
|
if component_name in self._loaded_components:
|
||||||
component.at_removed(self.host)
|
component.at_removed(self.host)
|
||||||
self.db_names.remove(component_name)
|
self.db_names.remove(component_name)
|
||||||
|
self.host.tags.remove(component_name, category="components")
|
||||||
del self._loaded_components[component_name]
|
del self._loaded_components[component_name]
|
||||||
else:
|
else:
|
||||||
message = f"Cannot remove {component_name} from {self.host.name} as it is not registered."
|
message = f"Cannot remove {component_name} from {self.host.name} as it is not registered."
|
||||||
|
|
@ -122,6 +125,7 @@ class ComponentHandler:
|
||||||
|
|
||||||
instance.at_removed(self.host)
|
instance.at_removed(self.host)
|
||||||
self.db_names.remove(name)
|
self.db_names.remove(name)
|
||||||
|
self.host.tags.remove(name, category="components")
|
||||||
del self._loaded_components[name]
|
del self._loaded_components[name]
|
||||||
|
|
||||||
def get(self, name):
|
def get(self, name):
|
||||||
|
|
@ -216,6 +220,14 @@ class ComponentHolderMixin(object):
|
||||||
|
|
||||||
self.db.component_names = component_names
|
self.db.component_names = component_names
|
||||||
|
|
||||||
|
def basetype_posthook_setup(self):
|
||||||
|
"""
|
||||||
|
Method that add component related tags that were set using ComponentProperty.
|
||||||
|
"""
|
||||||
|
super().basetype_posthook_setup()
|
||||||
|
for component_name in self.db.component_names:
|
||||||
|
self.tags.add(component_name, category="components")
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def components(self) -> ComponentHandler:
|
def components(self) -> ComponentHandler:
|
||||||
"""
|
"""
|
||||||
|
|
|
||||||
|
|
@ -107,3 +107,39 @@ class TestComponents(EvenniaTest):
|
||||||
|
|
||||||
def test_returns_none_with_regular_get_when_no_attribute(self):
|
def test_returns_none_with_regular_get_when_no_attribute(self):
|
||||||
assert self.char1.cmp.does_not_exist is None
|
assert self.char1.cmp.does_not_exist is None
|
||||||
|
|
||||||
|
def test_host_has_class_component_tags(self):
|
||||||
|
assert self.char1.tags.has(key="test_a", category="components")
|
||||||
|
assert self.char1.tags.has(key="test_b", category="components")
|
||||||
|
assert not self.char1.tags.has(key="test_c", category="components")
|
||||||
|
|
||||||
|
def test_host_has_added_component_tags(self):
|
||||||
|
rct = RuntimeComponentTestC.create(self.char1)
|
||||||
|
self.char1.components.add(rct)
|
||||||
|
test_c = self.char1.components.get('test_c')
|
||||||
|
|
||||||
|
assert self.char1.tags.has(key="test_c", category="components")
|
||||||
|
|
||||||
|
def test_host_has_added_default_component_tags(self):
|
||||||
|
self.char1.components.add_default("test_c")
|
||||||
|
test_c = self.char1.components.get("test_c")
|
||||||
|
|
||||||
|
assert self.char1.tags.has(key="test_c", category="components")
|
||||||
|
|
||||||
|
def test_host_remove_component_tags(self):
|
||||||
|
rct = RuntimeComponentTestC.create(self.char1)
|
||||||
|
handler = self.char1.components
|
||||||
|
handler.add(rct)
|
||||||
|
assert self.char1.tags.has(key="test_c", category="components")
|
||||||
|
handler.remove(rct)
|
||||||
|
|
||||||
|
assert not self.char1.tags.has(key="test_c", category="components")
|
||||||
|
|
||||||
|
def test_host_remove_by_name_component_tags(self):
|
||||||
|
rct = RuntimeComponentTestC.create(self.char1)
|
||||||
|
handler = self.char1.components
|
||||||
|
handler.add(rct)
|
||||||
|
assert self.char1.tags.has(key="test_c", category="components")
|
||||||
|
handler.remove_by_name("test_c")
|
||||||
|
|
||||||
|
assert not self.char1.tags.has(key="test_c", category="components")
|
||||||
|
|
@ -22,7 +22,7 @@ def _helper(x):
|
||||||
# use underscore to NOT make the function available as a callable
|
# use underscore to NOT make the function available as a callable
|
||||||
|
|
||||||
def funcname(*args, **kwargs):
|
def funcname(*args, **kwargs):
|
||||||
# this can be accecssed as $funcname(*args, **kwargs)
|
# this can be accessed as $funcname(*args, **kwargs)
|
||||||
# it must always accept *args and **kwargs.
|
# it must always accept *args and **kwargs.
|
||||||
...
|
...
|
||||||
return something
|
return something
|
||||||
|
|
@ -31,7 +31,7 @@ def funcname(*args, **kwargs):
|
||||||
Usage:
|
Usage:
|
||||||
|
|
||||||
```python
|
```python
|
||||||
from evennia.utils.funcparser
|
from evennia.utils.funcparser import FuncParser
|
||||||
|
|
||||||
parser = FuncParser("path.to.module_with_callables")
|
parser = FuncParser("path.to.module_with_callables")
|
||||||
result = parser.parse("String with $funcname() in it")
|
result = parser.parse("String with $funcname() in it")
|
||||||
|
|
@ -1159,7 +1159,7 @@ def funcparser_callable_you(
|
||||||
|
|
||||||
Examples:
|
Examples:
|
||||||
This can be used by the say or emote hooks to pass actor stance
|
This can be used by the say or emote hooks to pass actor stance
|
||||||
strings. This should usually be combined with the $inflect() callable.
|
strings. This should usually be combined with the $conj() callable.
|
||||||
|
|
||||||
- `With a grin, $you() $conj(jump) at $you(tommy).`
|
- `With a grin, $you() $conj(jump) at $you(tommy).`
|
||||||
|
|
||||||
|
|
@ -1243,7 +1243,7 @@ def funcparser_callable_conjugate(*args, caller=None, receiver=None, **kwargs):
|
||||||
def funcparser_callable_pronoun(*args, caller=None, receiver=None, capitalize=False, **kwargs):
|
def funcparser_callable_pronoun(*args, caller=None, receiver=None, capitalize=False, **kwargs):
|
||||||
"""
|
"""
|
||||||
|
|
||||||
Usage: $prop(word, [options])
|
Usage: $pron(word, [options])
|
||||||
|
|
||||||
Adjust pronouns to the expected form. Pronouns are words you use instead of a
|
Adjust pronouns to the expected form. Pronouns are words you use instead of a
|
||||||
proper name, such as 'him', 'herself', 'theirs' etc. These look different
|
proper name, such as 'him', 'herself', 'theirs' etc. These look different
|
||||||
|
|
@ -1279,7 +1279,7 @@ def funcparser_callable_pronoun(*args, caller=None, receiver=None, capitalize=Fa
|
||||||
`male`/`female`/`neutral`/`plural` (plural is considered a gender for this purpose).
|
`male`/`female`/`neutral`/`plural` (plural is considered a gender for this purpose).
|
||||||
If no `gender` property/callable is found, `neutral` is used as a fallback.
|
If no `gender` property/callable is found, `neutral` is used as a fallback.
|
||||||
|
|
||||||
The pronoun-type default (if not spefified in call) is `subject pronoun`.
|
The pronoun-type default (if not specified in call) is `subject pronoun`.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
pronoun (str): Input argument to parsed call. This can be any of the pronouns
|
pronoun (str): Input argument to parsed call. This can be any of the pronouns
|
||||||
|
|
@ -1349,7 +1349,7 @@ def funcparser_callable_pronoun(*args, caller=None, receiver=None, capitalize=Fa
|
||||||
default_viewpoint = "2nd person"
|
default_viewpoint = "2nd person"
|
||||||
|
|
||||||
if hasattr(caller, "gender"):
|
if hasattr(caller, "gender"):
|
||||||
if callable(caller, gender):
|
if callable(caller.gender):
|
||||||
default_gender = caller.gender()
|
default_gender = caller.gender()
|
||||||
else:
|
else:
|
||||||
default_gender = caller.gender
|
default_gender = caller.gender
|
||||||
|
|
@ -1377,7 +1377,7 @@ def funcparser_callable_pronoun_capitalize(
|
||||||
*args, caller=None, receiver=None, capitalize=True, **kwargs
|
*args, caller=None, receiver=None, capitalize=True, **kwargs
|
||||||
):
|
):
|
||||||
"""
|
"""
|
||||||
Usage: $Pron(word) - always maps to a capitalized word.
|
Usage: $Pron(word, [options]) - always maps to a capitalized word.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
return funcparser_callable_pronoun(
|
return funcparser_callable_pronoun(
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue