diff --git a/evennia/commands/default/building.py b/evennia/commands/default/building.py index 54536ff355..503a9c15e9 100644 --- a/evennia/commands/default/building.py +++ b/evennia/commands/default/building.py @@ -2856,7 +2856,7 @@ class CmdSpawn(COMMAND_DEFAULT_CLASS): key = "@spawn" aliases = ["olc"] - switch_options = ("noloc", "search", "list", "show", "save", "delete", "menu", "olc", "update") + switch_options = ("noloc", "search", "list", "show", "examine", "save", "delete", "menu", "olc", "update", "edit") locks = "cmd:perm(spawn) or perm(Builder)" help_category = "Building" @@ -2907,12 +2907,13 @@ class CmdSpawn(COMMAND_DEFAULT_CLASS): caller = self.caller - if self.cmdstring == "olc" or 'menu' in self.switches or 'olc' in self.switches: + if self.cmdstring == "olc" or 'menu' in self.switches \ + or 'olc' in self.switches or 'edit' in self.switches: # OLC menu mode prototype = None if self.lhs: key = self.lhs - prototype = spawner.search_prototype(key=key, return_meta=True) + prototype = protlib.search_prototype(key=key) if len(prototype) > 1: caller.msg("More than one match for {}:\n{}".format( key, "\n".join(proto.get('prototype_key', '') for proto in prototype))) @@ -2920,6 +2921,10 @@ class CmdSpawn(COMMAND_DEFAULT_CLASS): elif prototype: # one match prototype = prototype[0] + else: + # no match + caller.msg("No prototype '{}' was found.".format(key)) + return olc_menus.start_olc(caller, session=self.session, prototype=prototype) return diff --git a/evennia/commands/default/tests.py b/evennia/commands/default/tests.py index 386aef0905..7b2c78951b 100644 --- a/evennia/commands/default/tests.py +++ b/evennia/commands/default/tests.py @@ -478,6 +478,61 @@ class TestBuilding(CommandTest): # Test listing commands self.call(building.CmdSpawn(), "/list", "Key ") + # @spawn/edit (missing prototype) + # brings up olc menu + msg = self.call( + building.CmdSpawn(), + '/edit') + assert 'Prototype wizard' in msg + + # @spawn/edit with valid prototype + # brings up olc menu loaded with prototype + msg = self.call( + building.CmdSpawn(), + '/edit testball') + assert 'Prototype wizard' in msg + assert hasattr(self.char1.ndb._menutree, "olc_prototype") + assert dict == type(self.char1.ndb._menutree.olc_prototype) \ + and 'prototype_key' in self.char1.ndb._menutree.olc_prototype \ + and 'key' in self.char1.ndb._menutree.olc_prototype \ + and 'testball' == self.char1.ndb._menutree.olc_prototype['prototype_key'] \ + and 'Ball' == self.char1.ndb._menutree.olc_prototype['key'] + assert 'Ball' in msg and 'testball' in msg + + # @spawn/edit with valid prototype (synomym) + msg = self.call( + building.CmdSpawn(), + '/edit BALL') + assert 'Prototype wizard' in msg + assert 'Ball' in msg and 'testball' in msg + + # @spawn/edit with invalid prototype + msg = self.call( + building.CmdSpawn(), + '/edit NO_EXISTS', + "No prototype 'NO_EXISTS' was found.") + + # @spawn/examine (missing prototype) + # lists all prototypes that exist + msg = self.call( + building.CmdSpawn(), + '/examine') + assert 'testball' in msg and 'testprot' in msg + + # @spawn/examine with valid prototype + # prints the prototype + msg = self.call( + building.CmdSpawn(), + '/examine BALL') + assert 'Ball' in msg and 'testball' in msg + + # @spawn/examine with invalid prototype + # shows error + self.call( + building.CmdSpawn(), + '/examine NO_EXISTS', + "No prototype 'NO_EXISTS' was found.") + class TestComms(CommandTest): diff --git a/evennia/prototypes/menus.py b/evennia/prototypes/menus.py index 9605ea1a8f..c10f32429f 100644 --- a/evennia/prototypes/menus.py +++ b/evennia/prototypes/menus.py @@ -562,6 +562,7 @@ def node_index(caller): text = """ |c --- Prototype wizard --- |n + %s A |cprototype|n is a 'template' for |wspawning|n an in-game entity. A field of the prototype can either be hard-coded, left empty or scripted using |w$protfuncs|n - for example to @@ -599,6 +600,17 @@ def node_index(caller): {pfuncs} """.format(pfuncs=_format_protfuncs()) + # If a prototype is being edited, show its key and + # prototype_key under the title + loaded_prototype = '' + if 'prototype_key' in prototype \ + or 'key' in prototype: + loaded_prototype = ' --- Editing: |y{}({})|n --- '.format( + prototype.get('key', ''), + prototype.get('prototype_key', '') + ) + text = text % (loaded_prototype) + text = (text, helptxt) options = []