220 lines
7.3 KiB
Python
220 lines
7.3 KiB
Python
|
"""
|
||
|
Prototypes
|
||
|
|
||
|
A prototype is a simple way to create individualized instances of a
|
||
|
given typeclass. It is dictionary with specific key names.
|
||
|
|
||
|
For example, you might have a Sword typeclass that implements everything a
|
||
|
Sword would need to do. The only difference between different individual Swords
|
||
|
would be their key, description and some Attributes. The Prototype system
|
||
|
allows to create a range of such Swords with only minor variations. Prototypes
|
||
|
can also inherit and combine together to form entire hierarchies (such as
|
||
|
giving all Sabres and all Broadswords some common properties). Note that bigger
|
||
|
variations, such as custom commands or functionality belong in a hierarchy of
|
||
|
typeclasses instead.
|
||
|
|
||
|
A prototype can either be a dictionary placed into a global variable in a
|
||
|
python module (a 'module-prototype') or stored in the database as a dict on a
|
||
|
special Script (a db-prototype). The former can be created just by adding dicts
|
||
|
to modules Evennia looks at for prototypes, the latter is easiest created
|
||
|
in-game via the `olc` command/menu.
|
||
|
|
||
|
Prototypes are read and used to create new objects with the `spawn` command
|
||
|
or directly via `evennia.spawn` or the full path `evennia.prototypes.spawner.spawn`.
|
||
|
|
||
|
A prototype dictionary have the following keywords:
|
||
|
|
||
|
Possible keywords are:
|
||
|
- `prototype_key` - the name of the prototype. This is required for db-prototypes,
|
||
|
for module-prototypes, the global variable name of the dict is used instead
|
||
|
- `prototype_parent` - string pointing to parent prototype if any. Prototype inherits
|
||
|
in a similar way as classes, with children overriding values in their partents.
|
||
|
- `key` - string, the main object identifier.
|
||
|
- `typeclass` - string, if not set, will use `settings.BASE_OBJECT_TYPECLASS`.
|
||
|
- `location` - this should be a valid object or #dbref.
|
||
|
- `home` - valid object or #dbref.
|
||
|
- `destination` - only valid for exits (object or #dbref).
|
||
|
- `permissions` - string or list of permission strings.
|
||
|
- `locks` - a lock-string to use for the spawned object.
|
||
|
- `aliases` - string or list of strings.
|
||
|
- `attrs` - Attributes, expressed as a list of tuples on the form `(attrname, value)`,
|
||
|
`(attrname, value, category)`, or `(attrname, value, category, locks)`. If using one
|
||
|
of the shorter forms, defaults are used for the rest.
|
||
|
- `tags` - Tags, as a list of tuples `(tag,)`, `(tag, category)` or `(tag, category, data)`.
|
||
|
- Any other keywords are interpreted as Attributes with no category or lock.
|
||
|
These will internally be added to `attrs` (eqivalent to `(attrname, value)`.
|
||
|
|
||
|
See the `spawn` command and `evennia.prototypes.spawner.spawn` for more info.
|
||
|
|
||
|
"""
|
||
|
|
||
|
ROOM_EMPTY = {
|
||
|
"prototype_key": "room_empty",
|
||
|
"key": "empty room",
|
||
|
"desc": "An empty room.",
|
||
|
"typeclass": "typeclasses.rooms.IndoorRoom"
|
||
|
}
|
||
|
|
||
|
EXIT_EMPTY = {
|
||
|
"prototype_key": "exit_empty",
|
||
|
"key": "corridor",
|
||
|
"desc": "An empty corridor.",
|
||
|
"typeclass": "typeclasses.exits.BaseDoor"
|
||
|
}
|
||
|
|
||
|
BROKEN_CROWN = {
|
||
|
"prototype_key": "broken_crown",
|
||
|
"key": "broken crown",
|
||
|
"desc": "An old iron crown, dented and covered in rust.",
|
||
|
"typeclass": "typeclasses.objects.EquippableItem",
|
||
|
"slot": 'head'
|
||
|
}
|
||
|
|
||
|
|
||
|
MULTICOLORED_ROBE = {
|
||
|
"prototype_key": "multicolored robe",
|
||
|
"key": "multicolored robe",
|
||
|
"desc": "A long robe, made of many different colored cloth patches.",
|
||
|
"typeclass": "typeclasses.objects.EquippableItem",
|
||
|
"slot": 'torso'
|
||
|
}
|
||
|
|
||
|
PLAIN_TROUSERS = {
|
||
|
"prototype_key": "plain trousers",
|
||
|
"key": "plain trousers",
|
||
|
"desc": "Simple but robust cloth trousers.",
|
||
|
"typeclass": "typeclasses.objects.EquippableItem",
|
||
|
"slot": 'legs'
|
||
|
}
|
||
|
|
||
|
LEATHER_BOOTS = {
|
||
|
"prototype_key": "leather boots",
|
||
|
"key": "leather boots",
|
||
|
"desc": "A worn pair of leather boots.",
|
||
|
"typeclass": "typeclasses.objects.EquippableItem",
|
||
|
"slot": 'foot'
|
||
|
}
|
||
|
|
||
|
FEATURE_CONTAINER = {
|
||
|
"prototype_key": "feature_container",
|
||
|
"key": "chest",
|
||
|
"desc": "A chest.",
|
||
|
"feature_desc": "A |wchest|n lies on the floor.",
|
||
|
"typeclass": "typeclasses.objects.ContainerFeature"
|
||
|
}
|
||
|
|
||
|
FEATURE_SKELETON = {
|
||
|
"prototype_key": "feature_skeleton",
|
||
|
"key": "rugged skeleton",
|
||
|
"desc": "An old humanoid skeleton, eroded by the passage of time.",
|
||
|
"feature_desc": "A rugged humanoid |wskeleton|n lies on the floor, theirs bony hand still clutching a broken spear. What remains of theirs armor and clothings is too battered to let you recognize their origins.",
|
||
|
"typeclass": "typeclasses.objects.Feature"
|
||
|
}
|
||
|
|
||
|
STONE = {
|
||
|
"prototype_key": "stone",
|
||
|
"key": "stone",
|
||
|
"desc": "An unremarkable stone made of granite.",
|
||
|
"aliases": ["granite stone"],
|
||
|
"typeclass": "typeclasses.objects.Item"
|
||
|
}
|
||
|
|
||
|
BIG_STONE = {
|
||
|
"prototype_key": "big stone",
|
||
|
"key": "big stone",
|
||
|
"desc": "An unremarkable stone made of granite. It seems very heavy.",
|
||
|
"aliases": ["big granite stone"],
|
||
|
"get_err_msg": "You are not strong enough to lift this stone.",
|
||
|
"locks": "get:attr_gt(strength, 50)",
|
||
|
"typeclass": "typeclasses.objects.Item"
|
||
|
}
|
||
|
|
||
|
LANTERN = {
|
||
|
"prototype_key": "lantern",
|
||
|
"key": "old lantern",
|
||
|
"desc": "An old lantern, still filled with oil.",
|
||
|
"aliases": ["lantern"],
|
||
|
"attrs": [("is_lit", True, None, None)],
|
||
|
"tags": [("emit_light", "effect", None)],
|
||
|
"locks": "light:all()",
|
||
|
"typeclass": "typeclasses.objects.Item"
|
||
|
}
|
||
|
|
||
|
BLADE_TOOL = {
|
||
|
"prototype_key": "blade tool",
|
||
|
"key": "steel blade",
|
||
|
"desc": "A steel blade, with an oak handle wrapped in cloth.",
|
||
|
"aliases": ["blade"],
|
||
|
"tags": [("blade", "crafting_tool", None)],
|
||
|
"typeclass": "typeclasses.objects.EquippableItem",
|
||
|
"slot": 'foot'
|
||
|
}
|
||
|
|
||
|
WOOD_MATERIAL = {
|
||
|
"prototype_key": "wood_material",
|
||
|
"key": "piece of wood",
|
||
|
"desc": "An unremarkable piece of wood.",
|
||
|
"aliases": ["wood"],
|
||
|
"tags": [("wood", "crafting_material", None)],
|
||
|
"typeclass": "typeclasses.objects.Item"
|
||
|
}
|
||
|
|
||
|
BLOOD_MATERIAL = {
|
||
|
"prototype_key": "blood_material",
|
||
|
"key": "vial of blood",
|
||
|
"desc": "A vial of blood. Fresh.",
|
||
|
"aliases": ["blood, vial"],
|
||
|
"tags": [("blood", "crafting_material", None)],
|
||
|
"typeclass": "typeclasses.objects.Item"
|
||
|
}
|
||
|
|
||
|
SUMMONING_CIRCLE = {
|
||
|
"prototype_key": "summoning_circle",
|
||
|
"key": "summoning circle",
|
||
|
"aliases": ["circle"],
|
||
|
"desc": "A circular pattern of mystical runes drawn with blood.",
|
||
|
"feature_desc": "An arcane |wcircle of summoning|n is draw with blood on the floor.",
|
||
|
"typeclass": "typeclasses.objects.Feature"
|
||
|
}
|
||
|
|
||
|
## example of module-based prototypes using
|
||
|
## the variable name as `prototype_key` and
|
||
|
## simple Attributes
|
||
|
|
||
|
# from random import randint
|
||
|
#
|
||
|
# GOBLIN = {
|
||
|
# "key": "goblin grunt",
|
||
|
# "health": lambda: randint(20,30),
|
||
|
# "resists": ["cold", "poison"],
|
||
|
# "attacks": ["fists"],
|
||
|
# "weaknesses": ["fire", "light"],
|
||
|
# "tags": = [("greenskin", "monster"), ("humanoid", "monster")]
|
||
|
# }
|
||
|
#
|
||
|
# GOBLIN_WIZARD = {
|
||
|
# "prototype_parent": "GOBLIN",
|
||
|
# "key": "goblin wizard",
|
||
|
# "spells": ["fire ball", "lighting bolt"]
|
||
|
# }
|
||
|
#
|
||
|
# GOBLIN_ARCHER = {
|
||
|
# "prototype_parent": "GOBLIN",
|
||
|
# "key": "goblin archer",
|
||
|
# "attacks": ["short bow"]
|
||
|
# }
|
||
|
#
|
||
|
# This is an example of a prototype without a prototype
|
||
|
# (nor key) of its own, so it should normally only be
|
||
|
# used as a mix-in, as in the example of the goblin
|
||
|
# archwizard below.
|
||
|
# ARCHWIZARD_MIXIN = {
|
||
|
# "attacks": ["archwizard staff"],
|
||
|
# "spells": ["greater fire ball", "greater lighting"]
|
||
|
# }
|
||
|
#
|
||
|
# GOBLIN_ARCHWIZARD = {
|
||
|
# "key": "goblin archwizard",
|
||
|
# "prototype_parent" : ("GOBLIN_WIZARD", "ARCHWIZARD_MIXIN")
|
||
|
# }
|