update rpsystem contrib
This commit is contained in:
parent
86318b7559
commit
04f8dcdb4c
2 changed files with 76 additions and 34 deletions
|
|
@ -150,6 +150,7 @@ Extra Installation Instructions:
|
||||||
"""
|
"""
|
||||||
import re
|
import re
|
||||||
from string import punctuation
|
from string import punctuation
|
||||||
|
from collections import defaultdict
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
|
|
||||||
|
|
@ -158,7 +159,10 @@ from evennia.commands.command import Command
|
||||||
from evennia.objects.models import ObjectDB
|
from evennia.objects.models import ObjectDB
|
||||||
from evennia.objects.objects import DefaultCharacter, DefaultObject
|
from evennia.objects.objects import DefaultCharacter, DefaultObject
|
||||||
from evennia.utils import ansi, logger
|
from evennia.utils import ansi, logger
|
||||||
from evennia.utils.utils import lazy_property, make_iter, variable_from_module
|
from evennia.utils.utils import iter_to_str, lazy_property, make_iter, variable_from_module
|
||||||
|
|
||||||
|
import inflect
|
||||||
|
_INFLECT = inflect.engine()
|
||||||
|
|
||||||
_AT_SEARCH_RESULT = variable_from_module(*settings.SEARCH_AT_RESULT.rsplit(".", 1))
|
_AT_SEARCH_RESULT = variable_from_module(*settings.SEARCH_AT_RESULT.rsplit(".", 1))
|
||||||
# ------------------------------------------------------------
|
# ------------------------------------------------------------
|
||||||
|
|
@ -1283,10 +1287,7 @@ class ContribRPObject(DefaultObject):
|
||||||
# emoting/recog data
|
# emoting/recog data
|
||||||
self.db.pose = ""
|
self.db.pose = ""
|
||||||
self.db.pose_default = "is here."
|
self.db.pose_default = "is here."
|
||||||
|
|
||||||
# initializing sdesc
|
|
||||||
self.db._sdesc = ""
|
self.db._sdesc = ""
|
||||||
self.sdesc.add("Something")
|
|
||||||
|
|
||||||
def search(
|
def search(
|
||||||
self,
|
self,
|
||||||
|
|
@ -1520,42 +1521,73 @@ class ContribRPObject(DefaultObject):
|
||||||
|
|
||||||
return self.get_posed_sdesc(sdesc) if kwargs.get("pose", False) else sdesc
|
return self.get_posed_sdesc(sdesc) if kwargs.get("pose", False) else sdesc
|
||||||
|
|
||||||
def return_appearance(self, looker):
|
def get_display_characters(self, looker, pose=True, **kwargs):
|
||||||
"""
|
"""
|
||||||
This formats a description. It is the hook a 'look' command
|
Get the ‘characters’ component of the object description. Called by return_appearance.
|
||||||
should call.
|
"""
|
||||||
|
def _filter_visible(obj_list):
|
||||||
|
return (obj for obj in obj_list if obj != looker and obj.access(looker, "view"))
|
||||||
|
|
||||||
|
characters = _filter_visible(self.contents_get(content_type="character"))
|
||||||
|
character_names = "\n".join(
|
||||||
|
char.get_display_name(looker, pose=pose, **kwargs) for char in characters
|
||||||
|
)
|
||||||
|
|
||||||
|
return f"\n{character_names}" if character_names else ""
|
||||||
|
|
||||||
|
def get_display_things(self, looker, pose=True, **kwargs):
|
||||||
|
"""
|
||||||
|
Get the 'things' component of the object description. Called by `return_appearance`.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
looker (Object): Object doing the looking.
|
looker (Object): Object doing the looking.
|
||||||
|
**kwargs: Arbitrary data for use when overriding.
|
||||||
Returns:
|
Returns:
|
||||||
string (str): A string containing the name, appearance and contents
|
str: The things display data.
|
||||||
of the object.
|
|
||||||
"""
|
|
||||||
if not looker:
|
|
||||||
return ""
|
|
||||||
# get and identify all objects
|
|
||||||
visible = (con for con in self.contents if con != looker and con.access(looker, "view"))
|
|
||||||
exits, users, things = [], [], []
|
|
||||||
for con in visible:
|
|
||||||
key = con.get_display_name(looker, pose=True)
|
|
||||||
if con.destination:
|
|
||||||
exits.append(key)
|
|
||||||
elif con.has_account:
|
|
||||||
users.append(key)
|
|
||||||
else:
|
|
||||||
things.append(key)
|
|
||||||
# get description, build string
|
|
||||||
string = "|c%s|n\n" % self.get_display_name(looker, pose=True)
|
|
||||||
desc = self.db.desc
|
|
||||||
if desc:
|
|
||||||
string += "%s" % desc
|
|
||||||
if exits:
|
|
||||||
string += "\n|wExits:|n " + ", ".join(exits)
|
|
||||||
if users or things:
|
|
||||||
string += "\n " + "\n ".join(users + things)
|
|
||||||
|
|
||||||
return string
|
"""
|
||||||
|
if not pose:
|
||||||
|
# if poses aren't included, we can use the core version instead
|
||||||
|
return super().get_display_things(looker, **kwargs)
|
||||||
|
|
||||||
|
def _filter_visible(obj_list):
|
||||||
|
return [obj for obj in obj_list if obj != looker and obj.access(looker, "view")]
|
||||||
|
|
||||||
|
# sort and handle same-named things
|
||||||
|
things = _filter_visible(self.contents_get(content_type="object"))
|
||||||
|
|
||||||
|
posed_things = defaultdict(list)
|
||||||
|
for thing in things:
|
||||||
|
pose = thing.db.pose or thing.db.pose_default
|
||||||
|
if not pose:
|
||||||
|
pose = ""
|
||||||
|
posed_things[pose].append(thing)
|
||||||
|
|
||||||
|
display_strings = []
|
||||||
|
|
||||||
|
for pose, thinglist in posed_things.items():
|
||||||
|
grouped_things = defaultdict(list)
|
||||||
|
for thing in thinglist:
|
||||||
|
grouped_things[thing.get_display_name(looker, pose=False, **kwargs)].append(thing)
|
||||||
|
|
||||||
|
thing_names = []
|
||||||
|
for thingname, samethings in sorted(grouped_things.items()):
|
||||||
|
nthings = len(samethings)
|
||||||
|
thing = samethings[0]
|
||||||
|
singular, plural = thing.get_numbered_name(nthings, looker, key=thingname)
|
||||||
|
thing_names.append(singular if nthings == 1 else plural)
|
||||||
|
thing_names = iter_to_str(thing_names)
|
||||||
|
|
||||||
|
if pose:
|
||||||
|
pose = _INFLECT.plural(pose) if nthings != 1 else pose
|
||||||
|
grouped_names = f"{thing_names} {pose}"
|
||||||
|
grouped_names = grouped_names[0].upper() + grouped_names[1:]
|
||||||
|
display_strings.append(grouped_names)
|
||||||
|
|
||||||
|
if not display_strings:
|
||||||
|
return ""
|
||||||
|
|
||||||
|
return "\n" + "\n".join(display_strings)
|
||||||
|
|
||||||
|
|
||||||
class ContribRPRoom(ContribRPObject):
|
class ContribRPRoom(ContribRPObject):
|
||||||
|
|
|
||||||
|
|
@ -89,7 +89,6 @@ class TestLanguage(BaseEvenniaTest):
|
||||||
|
|
||||||
# Testing of emoting / sdesc / recog system
|
# Testing of emoting / sdesc / recog system
|
||||||
|
|
||||||
|
|
||||||
sdesc0 = "A nice sender of emotes"
|
sdesc0 = "A nice sender of emotes"
|
||||||
sdesc1 = "The first receiver of emotes."
|
sdesc1 = "The first receiver of emotes."
|
||||||
sdesc2 = "Another nice colliding sdesc-guy for tests"
|
sdesc2 = "Another nice colliding sdesc-guy for tests"
|
||||||
|
|
@ -116,6 +115,17 @@ class TestRPSystem(BaseEvenniaTest):
|
||||||
rpsystem.ContribRPCharacter, key="Receiver2", location=self.room
|
rpsystem.ContribRPCharacter, key="Receiver2", location=self.room
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def test_posed_contents(self):
|
||||||
|
self.obj1 = create_object(rpsystem.ContribRPObject, key="thing", location=self.room)
|
||||||
|
self.obj2 = create_object(rpsystem.ContribRPObject, key="thing", location=self.room)
|
||||||
|
self.obj3 = create_object(rpsystem.ContribRPObject, key="object", location=self.room)
|
||||||
|
room_display = self.room.return_appearance(self.speaker)
|
||||||
|
self.assertIn("An object and two things are here.", room_display)
|
||||||
|
self.obj3.db.pose = "is on the ground."
|
||||||
|
room_display = self.room.return_appearance(self.speaker)
|
||||||
|
self.assertIn("Two things are here.", room_display)
|
||||||
|
self.assertIn("An object is on the ground.", room_display)
|
||||||
|
|
||||||
def test_sdesc_handler(self):
|
def test_sdesc_handler(self):
|
||||||
self.speaker.sdesc.add(sdesc0)
|
self.speaker.sdesc.add(sdesc0)
|
||||||
self.assertEqual(self.speaker.sdesc.get(), sdesc0)
|
self.assertEqual(self.speaker.sdesc.get(), sdesc0)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue