diff --git a/evennia/contrib/tutorial_world/build.ev b/evennia/contrib/tutorial_world/build.ev index b809e3693c..239ce7a009 100644 --- a/evennia/contrib/tutorial_world/build.ev +++ b/evennia/contrib/tutorial_world/build.ev @@ -739,7 +739,7 @@ hole the remains of the castle. There is also a standing archway offering passage to a path along the old {wsouth{nern inner wall. # -@detail portoculis;fall;fallen;grating +@detail portoculis;fall;fallen;grating = This heavy iron grating used to block off the inner part of the gate house, now it has fallen to the ground together with the stone archway that once help it up. # @@ -834,7 +834,7 @@ archway # @set ghost/get_err_msg = Your fingers just pass straight through it! # -@desc ghost/desc_alive = +@set ghost/desc_alive = This ghostly shape could momentarily be mistaken for a thick fog had it not moved with such determination and giving echoing hollow screams as it did. The shape is hard to determine, now and then it @@ -842,7 +842,7 @@ archway later. The thing reeks of almost tangible spite at your presence. This must be the ruin's eternal guardian. # -@desc ghost/desc_dead = +@set ghost/desc_dead = The ghostly apparition is nothing but a howling on the wind, an eternal cold spot that can never be fully eradicated from these walls. While harmless in this state, there is no doubt that it shall eventually return to this plane @@ -970,6 +970,7 @@ mobon ghost @detail altar = The altar is a massive stone slab. It might once have had ornate decorations but time and the salty air has broken everything down into dust. +# @detail ceiling = The dome still looming intact above you is a marvel of engineering. @@ -1248,6 +1249,8 @@ stairs down # @set sarcophagus/rack_id = rack_sarcophagus # +@set sarcophagus/available_weapons = ["ornate_longsword","warhammer","rune axe","thruning","slayer waraxe","ghostblade","hawkblade"] +# @set sarcophagus/no_more_weapons_msg = The tomb has already granted you all the might it will ever do. # @@ -1284,7 +1287,7 @@ stairs down # rack_id. This we can use to check if any such weapon is in inventory # before unlocking the exit. # -@lock Exit tutorial: view:holds(rack_sarcophagus) ; traverse:holds(rack_sarcophagus) +@lock Exit tutorial = view:holds(rack_sarcophagus) ; traverse:holds(rack_sarcophagus) # # to tutorial outro @tel tut#17 diff --git a/evennia/contrib/tutorial_world/mob.py b/evennia/contrib/tutorial_world/mob.py index 82fdf0c2fc..9583ba7cdb 100644 --- a/evennia/contrib/tutorial_world/mob.py +++ b/evennia/contrib/tutorial_world/mob.py @@ -41,7 +41,7 @@ class CmdMobOnOff(Command): mob = self.caller.search(self.args) if not mob: return - if self.cmdname == "mobon": + if self.cmdstring == "mobon": mob.set_alive() else: mob.set_dead() @@ -91,7 +91,7 @@ class Mob(tut_objects.TutorialObject): happen to roam into a room with no exits. """ - def __init__(self): + def at_init(self): """ When initialized from cache (after a server reboot), set up the AI state. @@ -107,7 +107,7 @@ class Mob(tut_objects.TutorialObject): Called the first time the object is created. We set up the base properties and flags here. """ - self.cmdsets.add(MobCmdSet, permanent=True) + self.cmdset.add(MobCmdSet, permanent=True) # Main AI flags. We start in dead mode so we don't have to # chase the mob around when building. self.db.patrolling = True diff --git a/evennia/contrib/tutorial_world/objects.py b/evennia/contrib/tutorial_world/objects.py index 392c5d09c8..9280f307ee 100644 --- a/evennia/contrib/tutorial_world/objects.py +++ b/evennia/contrib/tutorial_world/objects.py @@ -576,9 +576,9 @@ class CrumblingWall(TutorialObject, DefaultExit): whenever the button is pushed (this hides it as an exit until it actually is) """ - def __init__(self): + def at_init(self): """ - We make sure to reset the puzzle after a server reload/reboot. + Called when object is recalled from cache. """ self.reset() @@ -913,42 +913,51 @@ WEAPON_PROTOTYPES = { "hit": 0.4, "damage": 6, "parry": 0.2}, + "axe": { + "prototype": "weapon", + "key":"Axe", + "desc": "A woodcutter's axe with a keen edge.", + "hit": 0.4, + "damage": 6, + "parry": 0.2}, "ornate longsword": { "prototype":"sword", "key": "Ornate longsword", "desc": "A fine longsword with some swirling patterns on the handle.", "hit": 0.5, + "magic": True, "damage": 5}, - "rune axe": { - "prototype": "club", - "key": "Runeaxe", - "aliases": ["axe"], - "hit": 0.4, - "damage": 6}, - "thruning": { - "prototype": "sword", - "key": "Broadsword named Thruning", - "desc": "This heavy bladed weapon is marked with the name 'Thruning'. It is very powerful in skilled hands.", - "hit": 0.6, - "parry": 0.6, - "damage": 7}, "warhammer": { "prototype": "club", "key": "Silver Warhammer", "aliases": ["hammer", "warhammer", "war"], "desc": "A heavy war hammer with silver ornaments. This huge weapon causes massive damage - if you can hit.", "hit": 0.4, - "damage": 10}, - "slayer waraxe": { + "magic": True, + "damage": 8}, + "rune axe": { "prototype": "axe", + "key": "Runeaxe", + "aliases": ["axe"], + "hit": 0.4, + "magic": True, + "damage": 6}, + "thruning": { + "prototype": "ornate longsword", + "key": "Broadsword named Thruning", + "desc": "This heavy bladed weapon is marked with the name 'Thruning'. It is very powerful in skilled hands.", + "hit": 0.6, + "parry": 0.6, + "damage": 7}, + "slayer waraxe": { + "prototype": "rune axe", "key": "Slayer waraxe", "aliases": ["waraxe", "war", "slayer"], "desc": "A huge double-bladed axe marked with the runes for 'Slayer'. It has more runic inscriptions on its head, which you cannot decipher.", - "magic": True, "hit": 0.7, "damage": 8}, "ghostblade": { - "prototype": "slayer waraxe", + "prototype": "ornate longsword", "key": "The Ghostblade", "aliases": ["blade", "ghost"], "desc": "This massive sword is large as you are tall, yet seems to weigh almost nothing. It's almost like it's not really there.", @@ -960,9 +969,9 @@ WEAPON_PROTOTYPES = { "key": "The Hawblade", "aliases": ["hawk", "blade"], "desc": "The weapon of a long-dead heroine and a more civilized age, the hawk-shaped hilt of this blade almost has a life of its own.", - "hit": 0.95, - "parry": 0.8, - "damage": 12} + "hit": 0.85, + "parry": 0.7, + "damage": 11} } diff --git a/evennia/locks/lockfuncs.py b/evennia/locks/lockfuncs.py index caeb4b2ba3..60be135d7a 100644 --- a/evennia/locks/lockfuncs.py +++ b/evennia/locks/lockfuncs.py @@ -524,7 +524,7 @@ def has_player(accessing_obj, accessed_obj, *args, **kwargs): This is a useful lock for traverse-locking Exits to restrain NPC mobiles from moving outside their areas. """ - return hasattr(accessing_obj, "has_player") and accessing_obj.has_player + return hasattr(accessing_obj, "has_player") and accessing_obj.has_player() def serversetting(accessing_obj, accessed_obj, *args, **kwargs): """