Fixes in accordance with Griatch's suggestions
Made a few changes: - Put the helper functions above the typeclasses in the module. - Changed the example command given and changed the default clothing type 'body' to 'fullbody', so that clothing types aren't taken to mean wear locations by default - Added note to CLOTHING_TYPE_AUTOCOVER explaining that only clothes that are already worn get auto-covered - Fixed a traceback issue in CmdGive
This commit is contained in:
parent
5cc508393b
commit
8da7f45de8
1 changed files with 114 additions and 111 deletions
|
|
@ -61,8 +61,8 @@ default_cmdsets.py:
|
||||||
From here, you can use the default builder commands to create clothes
|
From here, you can use the default builder commands to create clothes
|
||||||
with which to test the system:
|
with which to test the system:
|
||||||
|
|
||||||
@create a pretty dress : evennia.contrib.clothing.Clothing
|
@create a pretty shirt : evennia.contrib.clothing.Clothing
|
||||||
@set dress/clothing_type = 'body'
|
@set shirt/clothing_type = 'top'
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from evennia import DefaultObject
|
from evennia import DefaultObject
|
||||||
|
|
@ -77,7 +77,7 @@ from evennia.utils import evtable
|
||||||
# Maximum character length of 'wear style' strings, or None for unlimited.
|
# Maximum character length of 'wear style' strings, or None for unlimited.
|
||||||
WEARSTYLE_MAXLENGTH = 50
|
WEARSTYLE_MAXLENGTH = 50
|
||||||
# The order in which clothing types appear on the description. Untyped clothing goes last.
|
# The order in which clothing types appear on the description. Untyped clothing goes last.
|
||||||
CLOTHING_TYPE_ORDER = ['hat','jewelry','top','undershirt','gloves','body','bottom','underpants','socks','shoes','accessory']
|
CLOTHING_TYPE_ORDER = ['hat','jewelry','top','undershirt','gloves','fullbody','bottom','underpants','socks','shoes','accessory']
|
||||||
# The maximum number of each type of clothes that can be worn. Unlimited if untyped or not specified.
|
# The maximum number of each type of clothes that can be worn. Unlimited if untyped or not specified.
|
||||||
CLOTHING_TYPE_LIMIT = {
|
CLOTHING_TYPE_LIMIT = {
|
||||||
'hat':1,
|
'hat':1,
|
||||||
|
|
@ -88,15 +88,123 @@ CLOTHING_TYPE_LIMIT = {
|
||||||
# The maximum number of clothing items that can be worn, or None for unlimited.
|
# The maximum number of clothing items that can be worn, or None for unlimited.
|
||||||
CLOTHING_OVERALL_LIMIT = 20
|
CLOTHING_OVERALL_LIMIT = 20
|
||||||
# What types of clothes will automatically cover what other types of clothes when worn.
|
# What types of clothes will automatically cover what other types of clothes when worn.
|
||||||
|
# Note that clothing only gets auto-covered if it's already worn when you put something
|
||||||
|
# on that auto-covers it - for example, it's perfectly possible to have your underpants
|
||||||
|
# showing if you put them on after your pants!
|
||||||
CLOTHING_TYPE_AUTOCOVER = {
|
CLOTHING_TYPE_AUTOCOVER = {
|
||||||
'top':['undershirt'],
|
'top':['undershirt'],
|
||||||
'bottom':['underpants'],
|
'bottom':['underpants'],
|
||||||
'body':['undershirt','underpants'],
|
'fullbody':['undershirt','underpants'],
|
||||||
'shoes':['socks']
|
'shoes':['socks']
|
||||||
}
|
}
|
||||||
# Types of clothes that can't be used to cover other clothes.
|
# Types of clothes that can't be used to cover other clothes.
|
||||||
CLOTHING_TYPE_CANT_COVER_WITH = ['jewelry']
|
CLOTHING_TYPE_CANT_COVER_WITH = ['jewelry']
|
||||||
|
|
||||||
|
"""
|
||||||
|
----------------------------------------------------------------------------
|
||||||
|
HELPER FUNCTIONS START HERE
|
||||||
|
----------------------------------------------------------------------------
|
||||||
|
"""
|
||||||
|
|
||||||
|
def order_clothes_list(clothes_list):
|
||||||
|
"""
|
||||||
|
Orders a given clothes list by the order specified in CLOTHING_TYPE_ORDER.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
clothes_list (list): List of clothing items to put in order
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
ordered_clothes_list (list): The same list as passed, but re-ordered
|
||||||
|
according to the hierarchy of clothing types
|
||||||
|
specified in CLOTHING_TYPE_ORDER.
|
||||||
|
"""
|
||||||
|
ordered_clothes_list = clothes_list
|
||||||
|
# For each type of clothing that exists...
|
||||||
|
for current_type in reversed(CLOTHING_TYPE_ORDER):
|
||||||
|
# Check each item in the given clothes list.
|
||||||
|
for clothes in clothes_list:
|
||||||
|
# If the item has a clothing type...
|
||||||
|
if clothes.db.clothing_type:
|
||||||
|
item_type = clothes.db.clothing_type
|
||||||
|
# And the clothing type matches the current type...
|
||||||
|
if item_type == current_type:
|
||||||
|
# Move it to the front of the list!
|
||||||
|
ordered_clothes_list.remove(clothes)
|
||||||
|
ordered_clothes_list.insert(0, clothes)
|
||||||
|
return ordered_clothes_list
|
||||||
|
|
||||||
|
def get_worn_clothes(character, exclude_covered=False):
|
||||||
|
"""
|
||||||
|
Get a list of clothes worn by a given character.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
character (obj): The character to get a list of worn clothes from.
|
||||||
|
|
||||||
|
Kwargs:
|
||||||
|
exclude_covered (bool): If True, excludes clothes covered by other
|
||||||
|
clothing from the returned list.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
ordered_clothes_list (list): A list of clothing items worn by the
|
||||||
|
given character, ordered according to
|
||||||
|
the CLOTHING_TYPE_ORDER option specified
|
||||||
|
in this module.
|
||||||
|
"""
|
||||||
|
clothes_list = []
|
||||||
|
for thing in character.contents:
|
||||||
|
# If uncovered or not excluding covered items
|
||||||
|
if not thing.db.covered_by or exclude_covered == False:
|
||||||
|
# If 'worn' is True, add to the list
|
||||||
|
if thing.db.worn:
|
||||||
|
clothes_list.append(thing)
|
||||||
|
# Might as well put them in order here too.
|
||||||
|
ordered_clothes_list = order_clothes_list(clothes_list)
|
||||||
|
return ordered_clothes_list
|
||||||
|
|
||||||
|
def clothing_type_count(clothes_list):
|
||||||
|
"""
|
||||||
|
Returns a dictionary of the number of each clothing type
|
||||||
|
in a given list of clothing objects.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
clothes_list (list): A list of clothing items from which
|
||||||
|
to count the number of clothing types
|
||||||
|
represented among them.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
types_count (dict): A dictionary of clothing types represented
|
||||||
|
in the given list and the number of each
|
||||||
|
clothing type represented.
|
||||||
|
"""
|
||||||
|
types_count = {}
|
||||||
|
for garment in clothes_list:
|
||||||
|
if garment.db.clothing_type:
|
||||||
|
type = garment.db.clothing_type
|
||||||
|
if type not in types_count.keys():
|
||||||
|
types_count[type] = 1
|
||||||
|
else:
|
||||||
|
types_count[type] += 1
|
||||||
|
return types_count
|
||||||
|
|
||||||
|
def single_type_count(clothes_list, type):
|
||||||
|
"""
|
||||||
|
Returns an integer value of the number of a given type of clothing in a list.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
clothes_list (list): List of clothing objects to count from
|
||||||
|
type (str): Clothing type to count
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
type_count (int): Number of garments of the specified type in the given
|
||||||
|
list of clothing objects
|
||||||
|
"""
|
||||||
|
type_count = 0
|
||||||
|
for garment in clothes_list:
|
||||||
|
if garment.db.clothing_type:
|
||||||
|
if garment.db.clothing_type == type:
|
||||||
|
type_count += 1
|
||||||
|
return type_count
|
||||||
|
|
||||||
class Clothing(DefaultObject):
|
class Clothing(DefaultObject):
|
||||||
|
|
||||||
def wear(self, wearer, wearstyle, quiet=False):
|
def wear(self, wearer, wearstyle, quiet=False):
|
||||||
|
|
@ -215,111 +323,6 @@ class ClothedCharacter(DefaultCharacter):
|
||||||
string += "|/|/%s is not wearing anything." % self
|
string += "|/|/%s is not wearing anything." % self
|
||||||
return string
|
return string
|
||||||
|
|
||||||
"""
|
|
||||||
----------------------------------------------------------------------------
|
|
||||||
HELPER FUNCTIONS START HERE
|
|
||||||
----------------------------------------------------------------------------
|
|
||||||
"""
|
|
||||||
|
|
||||||
def order_clothes_list(clothes_list):
|
|
||||||
"""
|
|
||||||
Orders a given clothes list by the order specified in CLOTHING_TYPE_ORDER.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
clothes_list (list): List of clothing items to put in order
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
ordered_clothes_list (list): The same list as passed, but re-ordered
|
|
||||||
according to the hierarchy of clothing types
|
|
||||||
specified in CLOTHING_TYPE_ORDER.
|
|
||||||
"""
|
|
||||||
ordered_clothes_list = clothes_list
|
|
||||||
# For each type of clothing that exists...
|
|
||||||
for current_type in reversed(CLOTHING_TYPE_ORDER):
|
|
||||||
# Check each item in the given clothes list.
|
|
||||||
for clothes in clothes_list:
|
|
||||||
# If the item has a clothing type...
|
|
||||||
if clothes.db.clothing_type:
|
|
||||||
item_type = clothes.db.clothing_type
|
|
||||||
# And the clothing type matches the current type...
|
|
||||||
if item_type == current_type:
|
|
||||||
# Move it to the front of the list!
|
|
||||||
ordered_clothes_list.remove(clothes)
|
|
||||||
ordered_clothes_list.insert(0, clothes)
|
|
||||||
return ordered_clothes_list
|
|
||||||
|
|
||||||
def get_worn_clothes(character, exclude_covered=False):
|
|
||||||
"""
|
|
||||||
Get a list of clothes worn by a given character.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
character (obj): The character to get a list of worn clothes from.
|
|
||||||
|
|
||||||
Kwargs:
|
|
||||||
exclude_covered (bool): If True, excludes clothes covered by other
|
|
||||||
clothing from the returned list.
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
ordered_clothes_list (list): A list of clothing items worn by the
|
|
||||||
given character, ordered according to
|
|
||||||
the CLOTHING_TYPE_ORDER option specified
|
|
||||||
in this module.
|
|
||||||
"""
|
|
||||||
clothes_list = []
|
|
||||||
for thing in character.contents:
|
|
||||||
# If uncovered or not excluding covered items
|
|
||||||
if not thing.db.covered_by or exclude_covered == False:
|
|
||||||
# If 'worn' is True, add to the list
|
|
||||||
if thing.db.worn:
|
|
||||||
clothes_list.append(thing)
|
|
||||||
# Might as well put them in order here too.
|
|
||||||
ordered_clothes_list = order_clothes_list(clothes_list)
|
|
||||||
return ordered_clothes_list
|
|
||||||
|
|
||||||
def clothing_type_count(clothes_list):
|
|
||||||
"""
|
|
||||||
Returns a dictionary of the number of each clothing type
|
|
||||||
in a given list of clothing objects.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
clothes_list (list): A list of clothing items from which
|
|
||||||
to count the number of clothing types
|
|
||||||
represented among them.
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
types_count (dict): A dictionary of clothing types represented
|
|
||||||
in the given list and the number of each
|
|
||||||
clothing type represented.
|
|
||||||
"""
|
|
||||||
types_count = {}
|
|
||||||
for garment in clothes_list:
|
|
||||||
if garment.db.clothing_type:
|
|
||||||
type = garment.db.clothing_type
|
|
||||||
if type not in types_count.keys():
|
|
||||||
types_count[type] = 1
|
|
||||||
else:
|
|
||||||
types_count[type] += 1
|
|
||||||
return types_count
|
|
||||||
|
|
||||||
def single_type_count(clothes_list, type):
|
|
||||||
"""
|
|
||||||
Returns an integer value of the number of a given type of clothing in a list.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
clothes_list (list): List of clothing objects to count from
|
|
||||||
type (str): Clothing type to count
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
type_count (int): Number of garments of the specified type in the given
|
|
||||||
list of clothing objects
|
|
||||||
"""
|
|
||||||
type_count = 0
|
|
||||||
for garment in clothes_list:
|
|
||||||
if garment.db.clothing_type:
|
|
||||||
if garment.db.clothing_type == type:
|
|
||||||
type_count += 1
|
|
||||||
return type_count
|
|
||||||
|
|
||||||
"""
|
"""
|
||||||
----------------------------------------------------------------------------
|
----------------------------------------------------------------------------
|
||||||
COMMANDS START HERE
|
COMMANDS START HERE
|
||||||
|
|
@ -624,10 +627,10 @@ class CmdGive(MuxCommand):
|
||||||
if to_give.db.covered_by:
|
if to_give.db.covered_by:
|
||||||
caller.msg("You can't give that away because it's covered by %s." % to_give.db.covered_by)
|
caller.msg("You can't give that away because it's covered by %s." % to_give.db.covered_by)
|
||||||
return
|
return
|
||||||
# Remove clothes if they're dropped.
|
# Remove clothes if they're given.
|
||||||
if to_give.db.worn:
|
if to_give.db.worn:
|
||||||
to_give.remove(caller)
|
to_give.remove(caller)
|
||||||
obj.move_to(caller.location, quiet=True)
|
to_give.move_to(caller.location, quiet=True)
|
||||||
# give object
|
# give object
|
||||||
caller.msg("You give %s to %s." % (to_give.key, target.key))
|
caller.msg("You give %s to %s." % (to_give.key, target.key))
|
||||||
to_give.move_to(target, quiet=True)
|
to_give.move_to(target, quiet=True)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue