More nodes to menu-tutorial contrib
This commit is contained in:
parent
8c443a9b07
commit
32a13b63e7
6 changed files with 317 additions and 130 deletions
|
|
@ -808,27 +808,42 @@ class CmdPage(COMMAND_DEFAULT_CLASS):
|
||||||
lastpages = pages[-number:]
|
lastpages = pages[-number:]
|
||||||
else:
|
else:
|
||||||
lastpages = pages
|
lastpages = pages
|
||||||
to_template = "|w{date}|n{sender}|n |cto {receiver}|n:> {message}"
|
to_template = "|w{date}{clr} {sender}|nto{clr}{receiver}|n:> {message}"
|
||||||
from_template = "|w{date}|n{receiver}|n |gfrom {sender}|n:< {message}"
|
from_template = "|w{date}{clr} {receiver}|nfrom{clr}{sender}|n:< {message}"
|
||||||
listing = []
|
listing = []
|
||||||
|
prev_selfsend = False
|
||||||
for page in lastpages:
|
for page in lastpages:
|
||||||
receiver = ""
|
multi_send = len(page.senders) > 1
|
||||||
sender = ""
|
multi_recv = len(page.receivers) > 1
|
||||||
template = from_template
|
sending = self.caller in page.senders
|
||||||
sending = False
|
# self-messages all look like sends, so we assume they always
|
||||||
if self.caller in page.senders:
|
# come in close pairs and treat the second of the pair as the recv.
|
||||||
|
selfsend = sending and self.caller in page.receivers
|
||||||
|
if selfsend:
|
||||||
|
if prev_selfsend:
|
||||||
|
# this is actually a receive of a self-message
|
||||||
|
sending = False
|
||||||
|
prev_selfsend = False
|
||||||
|
else:
|
||||||
|
prev_selfsend = True
|
||||||
|
|
||||||
|
clr = "|c" if sending else "|g"
|
||||||
|
|
||||||
|
sender = f"|n,{clr}".join(obj.key for obj in page.senders)
|
||||||
|
receiver = f"|n,{clr}".join([obj.name for obj in page.receivers])
|
||||||
|
if sending:
|
||||||
template = to_template
|
template = to_template
|
||||||
sending = True
|
sender = f"{sender} " if multi_send else ""
|
||||||
|
receiver = f" {receiver}" if multi_recv else f" {receiver}"
|
||||||
if len(page.receivers) > 1 or sending:
|
else:
|
||||||
receiver = "|n,|c ".join([obj.name for obj in page.receivers])
|
template = from_template
|
||||||
|
receiver = f"{receiver} " if multi_recv else ""
|
||||||
if len(page.senders) > 1 or not sending:
|
sender = f" {sender} " if multi_send else f" {sender}"
|
||||||
sender = "|n,|c".join(obj.key for obj in page.senders)
|
|
||||||
|
|
||||||
listing.append(
|
listing.append(
|
||||||
template.format(
|
template.format(
|
||||||
date=utils.datetime_format(page.date_created),
|
date=utils.datetime_format(page.date_created),
|
||||||
|
clr=clr,
|
||||||
sender=sender,
|
sender=sender,
|
||||||
receiver=receiver,
|
receiver=receiver,
|
||||||
message=page.message,
|
message=page.message,
|
||||||
|
|
|
||||||
|
|
@ -378,10 +378,12 @@ class CmdInventory(COMMAND_DEFAULT_CLASS):
|
||||||
if not items:
|
if not items:
|
||||||
string = "You are not carrying anything."
|
string = "You are not carrying anything."
|
||||||
else:
|
else:
|
||||||
|
from evennia.utils.ansi import raw as raw_ansi
|
||||||
table = self.styled_table(border="header")
|
table = self.styled_table(border="header")
|
||||||
for item in items:
|
for item in items:
|
||||||
table.add_row("|C%s|n" % item.name, item.db.desc or "")
|
table.add_row(f"|C{item.name}|n",
|
||||||
string = "|wYou are carrying:\n%s" % table
|
"{}|n".format(utils.crop(raw_ansi(item.db.desc), width=50) or ""))
|
||||||
|
string = f"|wYou are carrying:\n{table}"
|
||||||
self.caller.msg(string)
|
self.caller.msg(string)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,14 @@
|
||||||
"""
|
"""
|
||||||
Game tutor
|
Intro menu / game tutor
|
||||||
|
|
||||||
Evennia contrib - Griatch 2020
|
Evennia contrib - Griatch 2020
|
||||||
|
|
||||||
This contrib is a tutorial menu using the EvMenu menu-templating system.
|
This contrib is an intro-menu for general MUD and evennia usage using the
|
||||||
|
EvMenu menu-templating system.
|
||||||
|
|
||||||
|
EvMenu templating is a way to create a menu using a string-format instead
|
||||||
|
of creating all nodes manually. Of course, for full functionality one must
|
||||||
|
still create the goto-callbacks.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
@ -11,24 +16,92 @@ from evennia import create_object
|
||||||
from evennia import CmdSet
|
from evennia import CmdSet
|
||||||
from evennia.utils.evmenu import parse_menu_template, EvMenu
|
from evennia.utils.evmenu import parse_menu_template, EvMenu
|
||||||
|
|
||||||
# goto callables
|
# Goto callbacks and helper resources for the menu
|
||||||
|
|
||||||
|
|
||||||
def do_nothing(caller, raw_string, **kwargs):
|
def do_nothing(caller, raw_string, **kwargs):
|
||||||
|
"""
|
||||||
|
Re-runs the current node
|
||||||
|
"""
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
def send_testing_tagged(caller, raw_string, **kwargs):
|
def send_testing_tagged(caller, raw_string, **kwargs):
|
||||||
caller.msg(("This is a message tagged with 'testing' and "
|
"""
|
||||||
"should appear in the pane you selected!\n "
|
Test to send a message to a pane tagged with 'testing' in the webclient.
|
||||||
f"You wrote: '{raw_string}'", {"type": "testing"}))
|
|
||||||
return None
|
|
||||||
|
|
||||||
def send_string(caller, raw_string, **kwargs):
|
"""
|
||||||
caller.msg(raw_string)
|
caller.msg(
|
||||||
|
(
|
||||||
|
"This is a message tagged with 'testing' and "
|
||||||
|
"should appear in the pane you selected!\n "
|
||||||
|
f"You wrote: '{raw_string}'",
|
||||||
|
{"type": "testing"},
|
||||||
|
)
|
||||||
|
)
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
# resources for the look-demo
|
# Resources for the first help-command demo
|
||||||
|
|
||||||
|
|
||||||
|
class DemoCommandSetHelp(CmdSet):
|
||||||
|
"""
|
||||||
|
Demo the help command
|
||||||
|
"""
|
||||||
|
|
||||||
|
key = "Help Demo Set"
|
||||||
|
priority = 2
|
||||||
|
|
||||||
|
def at_cmdset_creation(self):
|
||||||
|
from evennia import default_cmds
|
||||||
|
|
||||||
|
self.add(default_cmds.CmdHelp())
|
||||||
|
|
||||||
|
|
||||||
|
def goto_command_demo_help(caller, raw_string, **kwargs):
|
||||||
|
"Sets things up before going to the help-demo node"
|
||||||
|
_maintain_demo_room(caller, delete=True)
|
||||||
|
caller.cmdset.remove(DemoCommandSetRoom)
|
||||||
|
caller.cmdset.remove(DemoCommandSetComms)
|
||||||
|
caller.cmdset.add(DemoCommandSetHelp) # TODO - make persistent
|
||||||
|
return kwargs.get("gotonode") or "command_demo_help"
|
||||||
|
|
||||||
|
|
||||||
|
# Resources for the comms demo
|
||||||
|
|
||||||
|
|
||||||
|
class DemoCommandSetComms(CmdSet):
|
||||||
|
"""
|
||||||
|
Demo communications
|
||||||
|
"""
|
||||||
|
|
||||||
|
key = "Color Demo Set"
|
||||||
|
priority = 2
|
||||||
|
no_exits = True
|
||||||
|
no_objs = True
|
||||||
|
|
||||||
|
def at_cmdset_creation(self):
|
||||||
|
from evennia import default_cmds
|
||||||
|
|
||||||
|
self.add(default_cmds.CmdHelp())
|
||||||
|
self.add(default_cmds.CmdSay())
|
||||||
|
self.add(default_cmds.CmdPose())
|
||||||
|
self.add(default_cmds.CmdPage())
|
||||||
|
self.add(default_cmds.CmdColorTest())
|
||||||
|
|
||||||
|
|
||||||
|
def goto_command_demo_comms(caller, raw_string, **kwargs):
|
||||||
|
"""
|
||||||
|
Setup and go to the color demo node.
|
||||||
|
"""
|
||||||
|
caller.cmdset.remove(DemoCommandSetHelp)
|
||||||
|
caller.cmdset.remove(DemoCommandSetRoom)
|
||||||
|
caller.cmdset.add(DemoCommandSetComms)
|
||||||
|
return kwargs.get("gotonode") or "comms_demo_start"
|
||||||
|
|
||||||
|
|
||||||
|
# Resources for the room demo
|
||||||
|
|
||||||
_ROOM_DESC = """
|
_ROOM_DESC = """
|
||||||
This is a small and comfortable wood cabin. Bright sunlight is shining in
|
This is a small and comfortable wood cabin. Bright sunlight is shining in
|
||||||
|
|
@ -111,6 +184,7 @@ This is a fist-sized stone covered in runes:
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
def _maintain_demo_room(caller, delete=False):
|
def _maintain_demo_room(caller, delete=False):
|
||||||
"""
|
"""
|
||||||
Handle the creation/cleanup of demo assets. We store them
|
Handle the creation/cleanup of demo assets. We store them
|
||||||
|
|
@ -135,98 +209,95 @@ def _maintain_demo_room(caller, delete=False):
|
||||||
del caller.db.tutorial_world_demo_room_data
|
del caller.db.tutorial_world_demo_room_data
|
||||||
elif not roomdata:
|
elif not roomdata:
|
||||||
# create and describe the cabin and box
|
# create and describe the cabin and box
|
||||||
room1 = create_object("evennia.objects.objects.DefaultRoom",
|
room1 = create_object("evennia.objects.objects.DefaultRoom", key="A small, cozy cabin")
|
||||||
key="A small, cozy cabin")
|
|
||||||
room1.db.desc = _ROOM_DESC.strip()
|
room1.db.desc = _ROOM_DESC.strip()
|
||||||
box = create_object("evennia.objects.objects.DefaultObject",
|
box = create_object(
|
||||||
key="small wooden box")
|
"evennia.objects.objects.DefaultObject", key="small wooden box", location=room1
|
||||||
|
)
|
||||||
box.db.desc = _BOX_DESC.strip()
|
box.db.desc = _BOX_DESC.strip()
|
||||||
box.location = room1
|
|
||||||
|
|
||||||
# create and describe the meadow and stone
|
# create and describe the meadow and stone
|
||||||
room2 = create_object("evennia.objects.objects.DefaultRoom",
|
room2 = create_object("evennia.objects.objects.DefaultRoom", key="A lush summer meadow")
|
||||||
key="A lush summer meadow")
|
|
||||||
room2.db.desc = _MEADOW_DESC.strip()
|
room2.db.desc = _MEADOW_DESC.strip()
|
||||||
stone = create_object("evennia.objects.objects.DefaultObject",
|
stone = create_object(
|
||||||
key="carved stone")
|
"evennia.objects.objects.DefaultObject", key="carved stone", location=room2
|
||||||
|
)
|
||||||
stone.db.desc = _STONE_DESC.strip()
|
stone.db.desc = _STONE_DESC.strip()
|
||||||
|
|
||||||
# make the linking exits
|
# make the linking exits
|
||||||
door_out = create_object("evennia.objects.objects.DefaultExit",
|
door_out = create_object(
|
||||||
key="Door",
|
"evennia.objects.objects.DefaultExit", key="Door", location=room1, destination=room2
|
||||||
location=room1,
|
)
|
||||||
destination=room2)
|
|
||||||
door_out.db.desc = _DOOR_DESC_OUT.strip()
|
door_out.db.desc = _DOOR_DESC_OUT.strip()
|
||||||
door_in = create_object("evennia.objects.objects.DefaultExit",
|
door_in = create_object(
|
||||||
key="entrance to the cabin",
|
"evennia.objects.objects.DefaultExit",
|
||||||
aliases=["door", "in"],
|
key="entrance to the cabin",
|
||||||
location=room2,
|
aliases=["door", "in", "entrance"],
|
||||||
destination=room1)
|
location=room2,
|
||||||
|
destination=room1,
|
||||||
|
)
|
||||||
door_in.db.desc = _DOOR_DESC_IN.strip()
|
door_in.db.desc = _DOOR_DESC_IN.strip()
|
||||||
|
|
||||||
# store references for easy removal later
|
# store references for easy removal later
|
||||||
caller.db.tutorial_world_demo_room_data = (caller.location,
|
caller.db.tutorial_world_demo_room_data = (
|
||||||
room1, box,
|
caller.location,
|
||||||
room2, stone,
|
room1,
|
||||||
door_out, door_in)
|
box,
|
||||||
|
room2,
|
||||||
|
stone,
|
||||||
|
door_out,
|
||||||
|
door_in,
|
||||||
|
)
|
||||||
# move caller into room
|
# move caller into room
|
||||||
caller.location = room1
|
caller.location = room1
|
||||||
|
|
||||||
|
|
||||||
class DemoCommandSetRoom(CmdSet):
|
class DemoCommandSetRoom(CmdSet):
|
||||||
"""
|
"""
|
||||||
Demo the `look` command.
|
Demo some general in-game commands command.
|
||||||
"""
|
"""
|
||||||
key = "cmd_demo_cmdset_room"
|
|
||||||
|
key = "Room Demo Set"
|
||||||
priority = 2
|
priority = 2
|
||||||
no_exits = False
|
no_exits = False
|
||||||
no_objs = False
|
no_objs = False
|
||||||
|
|
||||||
def at_cmdset_creation(self):
|
def at_cmdset_creation(self):
|
||||||
from evennia import default_cmds
|
from evennia import default_cmds
|
||||||
|
|
||||||
self.add(default_cmds.CmdHelp())
|
self.add(default_cmds.CmdHelp())
|
||||||
self.add(default_cmds.CmdLook())
|
self.add(default_cmds.CmdLook())
|
||||||
self.add(default_cmds.CmdGet())
|
self.add(default_cmds.CmdGet())
|
||||||
self.add(default_cmds.CmdDrop())
|
self.add(default_cmds.CmdDrop())
|
||||||
|
self.add(default_cmds.CmdInventory())
|
||||||
self.add(default_cmds.CmdExamine())
|
self.add(default_cmds.CmdExamine())
|
||||||
self.add(default_cmds.CmdPy())
|
self.add(default_cmds.CmdPy())
|
||||||
|
|
||||||
|
|
||||||
def goto_command_demo_room(caller, raw_string, **kwargs):
|
def goto_command_demo_room(caller, raw_string, **kwargs):
|
||||||
"""Generate a little 2-room environment for testing out some commands."""
|
"""
|
||||||
|
Setup and go to the demo-room node. Generates a little 2-room environment
|
||||||
|
for testing out some commands.
|
||||||
|
"""
|
||||||
_maintain_demo_room(caller)
|
_maintain_demo_room(caller)
|
||||||
caller.cmdset.remove(DemoCommandSetRoom)
|
caller.cmdset.remove(DemoCommandSetHelp)
|
||||||
|
caller.cmdset.remove(DemoCommandSetComms)
|
||||||
caller.cmdset.add(DemoCommandSetRoom) # TODO - make persistent
|
caller.cmdset.add(DemoCommandSetRoom) # TODO - make persistent
|
||||||
return "command_demo_room"
|
return "command_demo_room"
|
||||||
|
|
||||||
# resources for the general command demo
|
|
||||||
|
|
||||||
class DemoCommandSetHelp(CmdSet):
|
# register all callables that can be used in the menu template
|
||||||
"""
|
|
||||||
Demo other commands.
|
|
||||||
"""
|
|
||||||
key = "cmd_demo_cmdset_help"
|
|
||||||
priority = 2
|
|
||||||
|
|
||||||
def at_cmdset_creation(self):
|
GOTO_CALLABLES = {
|
||||||
from evennia import default_cmds
|
"send_testing_tagged": send_testing_tagged,
|
||||||
self.add(default_cmds.CmdHelp())
|
"do_nothing": do_nothing,
|
||||||
|
"goto_command_demo_help": goto_command_demo_help,
|
||||||
|
"goto_command_demo_comms": goto_command_demo_comms,
|
||||||
|
"goto_command_demo_room": goto_command_demo_room,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
def goto_command_demo_help(caller, raw_string, **kwargs):
|
# Main menu definition
|
||||||
_maintain_demo_room(caller, delete=True)
|
|
||||||
caller.cmdset.remove(DemoCommandSetRoom)
|
|
||||||
caller.cmdset.add(DemoCommandSetHelp) # TODO - make persistent
|
|
||||||
return "command_demo_help"
|
|
||||||
|
|
||||||
|
|
||||||
def command_passthrough(caller, raw_string, **kwargs):
|
|
||||||
cmd = kwargs.get("cmd")
|
|
||||||
on_success = kwargs.get('on_success')
|
|
||||||
if cmd:
|
|
||||||
caller.execute_cmd(cmd)
|
|
||||||
else:
|
|
||||||
caller.execute_cmd(raw_string)
|
|
||||||
return on_success
|
|
||||||
|
|
||||||
|
|
||||||
MENU_TEMPLATE = """
|
MENU_TEMPLATE = """
|
||||||
|
|
||||||
|
|
@ -245,7 +316,10 @@ Write |wnext|n to continue or select a number to jump to that lesson.
|
||||||
1 (next);1;next;n: About Evennia -> about_evennia
|
1 (next);1;next;n: About Evennia -> about_evennia
|
||||||
2: What is a MUD/MU*? -> about_muds
|
2: What is a MUD/MU*? -> about_muds
|
||||||
3: Using the webclient -> using webclient
|
3: Using the webclient -> using webclient
|
||||||
4: Playing the game -> goto_command_demo_help()
|
4: The help command -> goto_command_demo_help()
|
||||||
|
5: Communicating with others -> goto_command_demo_help(gotonode='talk on channels')
|
||||||
|
6: Using colors -> goto_command_demo_comms(gotonode='testing_colors')
|
||||||
|
7: Moving and exploring -> goto_command_demo_room()
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
@ -271,7 +345,7 @@ to graphical MMORPG-style games like World of Warcraft.
|
||||||
|
|
||||||
back;b: About Evennia -> about_evennia
|
back;b: About Evennia -> about_evennia
|
||||||
next;n: Using the webclient -> using webclient
|
next;n: Using the webclient -> using webclient
|
||||||
back to top;t: start
|
back to start;start;t: start
|
||||||
>: using webclient
|
>: using webclient
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------------
|
||||||
|
|
@ -299,10 +373,10 @@ There is also some |wextra|n info to learn about customizing the webclient.
|
||||||
|
|
||||||
## OPTIONS
|
## OPTIONS
|
||||||
|
|
||||||
back: About MUDs -> about_muds
|
back;b: About MUDs -> about_muds
|
||||||
extra: Customizing the webclient -> customizing the webclient
|
extra: Customizing the webclient -> customizing the webclient
|
||||||
next: Playing the game -> goto_command_demo_help()
|
next;n: Playing the game -> goto_command_demo_help()
|
||||||
back to top: start
|
back to start;start: start
|
||||||
>: goto_command_demo_help()
|
>: goto_command_demo_help()
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------------
|
||||||
|
|
@ -334,7 +408,7 @@ to a web client pane with a specific tag that you set yourself.
|
||||||
|
|
||||||
## OPTIONS
|
## OPTIONS
|
||||||
|
|
||||||
back: using webclient
|
back;b: using webclient
|
||||||
> test *: send tagged message to new pane -> send_testing_tagged()
|
> test *: send tagged message to new pane -> send_testing_tagged()
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------------
|
||||||
|
|
@ -357,21 +431,21 @@ At the moment you only have |whelp|n and some |wChannel Names|n (the '<menu comm
|
||||||
is just a placeholder to indicate you are using this menu).
|
is just a placeholder to indicate you are using this menu).
|
||||||
|
|
||||||
We'll add more commands as we get to them in this tutorial - but we'll only
|
We'll add more commands as we get to them in this tutorial - but we'll only
|
||||||
cover a small handfull. Once you exit you'll find a lot more! Now let's try
|
cover a small handful. Once you exit you'll find a lot more! Now let's try
|
||||||
those channels ...
|
those channels ...
|
||||||
|
|
||||||
## OPTIONS
|
## OPTIONS
|
||||||
|
|
||||||
back: Using the webclient -> using webclient
|
back;b: Using the webclient -> using webclient
|
||||||
next: Channel commands -> talk on channels
|
next;n: Talk on Channels -> talk on channels
|
||||||
back to top: start
|
back to start;start: start
|
||||||
>: talk on channels
|
>: talk on channels
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------------
|
||||||
|
|
||||||
## NODE talk on channels
|
## NODE talk on channels
|
||||||
|
|
||||||
|wChannels|n are like in-game chatrooms. The |wChannel names|n help-category
|
|wChannels|n are like in-game chatrooms. The |wChannel Names|n help-category
|
||||||
holds the names of the channels available to you right now. One such channel is
|
holds the names of the channels available to you right now. One such channel is
|
||||||
|wpublic|n. Use |yhelp public|n to see how to use it. Try it:
|
|wpublic|n. Use |yhelp public|n to see how to use it. Try it:
|
||||||
|
|
||||||
|
|
@ -387,10 +461,103 @@ IRC support channel.
|
||||||
|
|
||||||
## OPTIONS
|
## OPTIONS
|
||||||
|
|
||||||
back: help on help -> goto_command_demo_help()
|
back;b: Finding help -> goto_command_demo_help()
|
||||||
next: Moving and exploring -> goto_command_demo_room()
|
next;n: Talk to people in-game -> goto_command_demo_comms()
|
||||||
back to top: start
|
back to start;start: start
|
||||||
>: goto_command_demo_room()
|
|
||||||
|
# ---------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
# we get here via goto_command_demo_comms()
|
||||||
|
|
||||||
|
## NODE comms_demo_start
|
||||||
|
|
||||||
|
You can also chat with people inside the game. If you try |yhelp|n now you'll
|
||||||
|
find you have a few more commands available for trying this out.
|
||||||
|
|
||||||
|
|ysay Hello there!|n
|
||||||
|
|y"Hello there!|n
|
||||||
|
|
||||||
|
|wsay|n is used to talk to people in the same location you are. Everyone in the
|
||||||
|
room will see what you have to say. A single quote |y"|n is a convenient shortcut.
|
||||||
|
|
||||||
|
|ypose smiles|n
|
||||||
|
|y:smiles|n
|
||||||
|
|
||||||
|
|wpose|n (or |wemote|n) describes what you do to those nearby. This is a very simple
|
||||||
|
command by default, but it can be extended to much more complex parsing in order to
|
||||||
|
include other people/objects in the emote, reference things by a short-description etc.
|
||||||
|
|
||||||
|
## OPTIONS
|
||||||
|
|
||||||
|
next;n: Paging people -> paging_people
|
||||||
|
back;b: Talk on Channels -> talk on channels
|
||||||
|
back to start;start: start
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
## NODE paging_people
|
||||||
|
|
||||||
|
Halfway between talking on a |wChannel|n and chatting in your current location
|
||||||
|
with |wsay|n and |wpose|n, you can also |wpage|n people. This is like a private
|
||||||
|
message only they can see.
|
||||||
|
|
||||||
|
|ypage <name> = Hello there!
|
||||||
|
page <name1>, <name2> = Hello both of you!|n
|
||||||
|
|
||||||
|
If you are alone on the server, put your own name as |w<name>|n to test it and
|
||||||
|
page yourself. Write just |ypage|n to see your latest pages. This will also show
|
||||||
|
you if anyone paged you while you were offline.
|
||||||
|
|
||||||
|
(By the way - do you think that the use of |y=|n above is strange? This is a
|
||||||
|
MUSH/MUX-style of syntax. If you don't like it, you can change it for your own
|
||||||
|
game by simply changing how the |wpose|n command parses its input.)
|
||||||
|
|
||||||
|
|
||||||
|
## OPTIONS
|
||||||
|
|
||||||
|
next;n: Using colors -> testing_colors
|
||||||
|
back;b: Talk to people in-game -> comms_demo_start
|
||||||
|
back to start;start: start
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
## NODE testing_colors
|
||||||
|
|
||||||
|
You can add color in your text by the help of tags. However, remember that not
|
||||||
|
everyone will see your colors - it depends on their client (and some use
|
||||||
|
screenreaders). Using color can also make text harder to read. So use it
|
||||||
|
sparingly.
|
||||||
|
|
||||||
|
To start coloring something |rred|n, add a ||r (red) marker and then
|
||||||
|
end with ||n (to go back to neutral/no-color):
|
||||||
|
|
||||||
|
|ysay This is a ||rred||n text!
|
||||||
|
say This is a ||Rdark red||n text!|n
|
||||||
|
|
||||||
|
You can also change the background:
|
||||||
|
|
||||||
|
|ysay This is a ||[x||bblue text on a light-grey background!|n
|
||||||
|
|
||||||
|
There are 16 base colors and as many background colors (called ANSI colors). Some
|
||||||
|
clients also supports so-called Xterm256 which gives a total of 256 colors. These are
|
||||||
|
given as |w||rgb|n, where r, g, b are the components of red, green and blue from 0-5:
|
||||||
|
|
||||||
|
|ysay This is ||050solid green!|n
|
||||||
|
|ysay This is ||520an orange color!|n
|
||||||
|
|ysay This is ||[005||555white on bright blue background!|n
|
||||||
|
|
||||||
|
If you don't see the expected colors from the above examples, it's because your
|
||||||
|
client does not support it - try out the Evennia webclient instead. To see all
|
||||||
|
color codes printed, try
|
||||||
|
|
||||||
|
|ycolor ansi
|
||||||
|
|ycolor xterm
|
||||||
|
|
||||||
|
## OPTIONS
|
||||||
|
|
||||||
|
next;n: Moving and Exploring -> goto_command_demo_room()
|
||||||
|
back;b: Paging people -> paging_people
|
||||||
|
back to start;start: start
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
@ -398,42 +565,36 @@ IRC support channel.
|
||||||
|
|
||||||
## NODE command_demo_room
|
## NODE command_demo_room
|
||||||
|
|
||||||
Another important command is '|ylook|n'. It's also abbreviated '|yl|n' since
|
For exploring the game, a very important command is '|ylook|n'. It's also
|
||||||
it's used so much. Looking displays/redisplays your current location. So far in
|
abbreviated '|yl|n' since it's used so much. Looking displays/redisplays your
|
||||||
this tutorial, using 'look' would just redisplay the menu.
|
current location. You can also use it to look closer at items in the world. So
|
||||||
|
far in this tutorial, using 'look' would just redisplay the menu.
|
||||||
|
|
||||||
Try |ylook|n now. You have been quietly transported to a sunny cabin to look
|
Try |ylook|n now. You have been quietly transported to a sunny cabin to look
|
||||||
around in. Explore a little. Use |ynext|n when you are done.
|
around in. Explore a little and use |ynext|n when you are done.
|
||||||
|
|
||||||
## OPTIONS
|
## OPTIONS
|
||||||
|
|
||||||
back: Channel commands -> talk on channels
|
back;b: Channel commands -> talk on channels
|
||||||
next: end
|
next;n: end
|
||||||
back to top: start
|
back to start;start: start
|
||||||
|
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------------
|
||||||
|
|
||||||
## NODE end
|
## NODE end
|
||||||
|
|
||||||
Thankyou for going through the tutorial!
|
Thank you for going through the tutorial!
|
||||||
|
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
GOTO_CALLABLES = {
|
|
||||||
"command_passthrough": command_passthrough,
|
|
||||||
"send_testing_tagged": send_testing_tagged,
|
|
||||||
"do_nothing": do_nothing,
|
|
||||||
"send_string": send_string,
|
|
||||||
"goto_command_demo_help": goto_command_demo_help,
|
|
||||||
"goto_command_demo_room": goto_command_demo_room,
|
|
||||||
}
|
|
||||||
|
|
||||||
class TutorialEvMenu(EvMenu):
|
class TutorialEvMenu(EvMenu):
|
||||||
def close_menu(self):
|
def close_menu(self):
|
||||||
"""Custom cleanup actions when closing menu"""
|
"""Custom cleanup actions when closing menu"""
|
||||||
|
self.caller.cmdset.remove(DemoCommandSetHelp)
|
||||||
|
self.caller.cmdset.remove(DemoCommandSetRoom)
|
||||||
|
self.caller.cmdset.remove(DemoCommandSetComms)
|
||||||
_maintain_demo_room(self.caller, delete=True)
|
_maintain_demo_room(self.caller, delete=True)
|
||||||
super().close_menu()
|
super().close_menu()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1940,12 +1940,12 @@ class DefaultObject(ObjectDB, metaclass=TypeclassBase):
|
||||||
# whisper mode
|
# whisper mode
|
||||||
msg_type = "whisper"
|
msg_type = "whisper"
|
||||||
msg_self = (
|
msg_self = (
|
||||||
'{self} whisper to {all_receivers}, "{speech}"' if msg_self is True else msg_self
|
'{self} whisper to {all_receivers}, "|n{speech}|n"' if msg_self is True else msg_self
|
||||||
)
|
)
|
||||||
msg_receivers = msg_receivers or '{object} whispers: "{speech}"'
|
msg_receivers = msg_receivers or '{object} whispers: "|n{speech}|n"'
|
||||||
msg_location = None
|
msg_location = None
|
||||||
else:
|
else:
|
||||||
msg_self = '{self} say, "{speech}"' if msg_self is True else msg_self
|
msg_self = '{self} say, "|n{speech}|n"' if msg_self is True else msg_self
|
||||||
msg_location = msg_location or '{object} says, "{speech}"'
|
msg_location = msg_location or '{object} says, "{speech}"'
|
||||||
msg_receivers = msg_receivers or message
|
msg_receivers = msg_receivers or message
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ There main function is `spawn(*prototype)`, where the `prototype`
|
||||||
is a dictionary like this:
|
is a dictionary like this:
|
||||||
|
|
||||||
```python
|
```python
|
||||||
from evennia.prototypes import prototypes
|
from evennia.prototypes import prototypes, spawner
|
||||||
|
|
||||||
prot = {
|
prot = {
|
||||||
"prototype_key": "goblin",
|
"prototype_key": "goblin",
|
||||||
|
|
@ -22,7 +22,10 @@ prot = {
|
||||||
"tags": ["mob", "evil", ('greenskin','mob')]
|
"tags": ["mob", "evil", ('greenskin','mob')]
|
||||||
"attrs": [("weapon", "sword")]
|
"attrs": [("weapon", "sword")]
|
||||||
}
|
}
|
||||||
|
# spawn something with the prototype
|
||||||
|
goblin = spawner.spawn(prot)
|
||||||
|
|
||||||
|
# make this into a db-saved prototype (optional)
|
||||||
prot = prototypes.create_prototype(prot)
|
prot = prototypes.create_prototype(prot)
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
@ -82,13 +85,13 @@ import random
|
||||||
|
|
||||||
{
|
{
|
||||||
"prototype_key": "goblin_wizard",
|
"prototype_key": "goblin_wizard",
|
||||||
"prototype_parent": GOBLIN,
|
"prototype_parent": "GOBLIN",
|
||||||
"key": "goblin wizard",
|
"key": "goblin wizard",
|
||||||
"spells": ["fire ball", "lighting bolt"]
|
"spells": ["fire ball", "lighting bolt"]
|
||||||
}
|
}
|
||||||
|
|
||||||
GOBLIN_ARCHER = {
|
GOBLIN_ARCHER = {
|
||||||
"prototype_parent": GOBLIN,
|
"prototype_parent": "GOBLIN",
|
||||||
"key": "goblin archer",
|
"key": "goblin archer",
|
||||||
"attack_skill": (random, (5, 10))"
|
"attack_skill": (random, (5, 10))"
|
||||||
"attacks": ["short bow"]
|
"attacks": ["short bow"]
|
||||||
|
|
@ -104,7 +107,7 @@ ARCHWIZARD = {
|
||||||
|
|
||||||
GOBLIN_ARCHWIZARD = {
|
GOBLIN_ARCHWIZARD = {
|
||||||
"key" : "goblin archwizard"
|
"key" : "goblin archwizard"
|
||||||
"prototype_parent": (GOBLIN_WIZARD, ARCHWIZARD),
|
"prototype_parent": ("GOBLIN_WIZARD", "ARCHWIZARD"),
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1659,6 +1659,12 @@ def _process_callable(caller, goto, goto_callables, raw_string,
|
||||||
for kwarg in gotokwargs.split(","):
|
for kwarg in gotokwargs.split(","):
|
||||||
if kwarg and "=" in kwarg:
|
if kwarg and "=" in kwarg:
|
||||||
key, value = [part.strip() for part in kwarg.split("=", 1)]
|
key, value = [part.strip() for part in kwarg.split("=", 1)]
|
||||||
|
if key in ("evmenu_goto", "evmenu_gotomap", "_current_nodename",
|
||||||
|
"evmenu_current_nodename", "evmenu_goto_callables"):
|
||||||
|
raise RuntimeError(
|
||||||
|
f"EvMenu template error: goto-callable '{goto}' uses a "
|
||||||
|
f"kwarg ({key}) that is reserved for the EvMenu templating "
|
||||||
|
"system. Rename the kwarg.")
|
||||||
try:
|
try:
|
||||||
key = literal_eval(key)
|
key = literal_eval(key)
|
||||||
except ValueError:
|
except ValueError:
|
||||||
|
|
@ -1675,17 +1681,17 @@ def _process_callable(caller, goto, goto_callables, raw_string,
|
||||||
|
|
||||||
|
|
||||||
def _generated_goto_func(caller, raw_string, **kwargs):
|
def _generated_goto_func(caller, raw_string, **kwargs):
|
||||||
goto = kwargs["goto"]
|
goto = kwargs["evmenu_goto"]
|
||||||
goto_callables = kwargs["goto_callables"]
|
goto_callables = kwargs["evmenu_goto_callables"]
|
||||||
current_nodename = kwargs["current_nodename"]
|
current_nodename = kwargs["evmenu_current_nodename"]
|
||||||
return _process_callable(caller, goto, goto_callables, raw_string,
|
return _process_callable(caller, goto, goto_callables, raw_string,
|
||||||
current_nodename, kwargs)
|
current_nodename, kwargs)
|
||||||
|
|
||||||
|
|
||||||
def _generated_input_goto_func(caller, raw_string, **kwargs):
|
def _generated_input_goto_func(caller, raw_string, **kwargs):
|
||||||
gotomap = kwargs["gotomap"]
|
gotomap = kwargs["evmenu_gotomap"]
|
||||||
goto_callables = kwargs["goto_callables"]
|
goto_callables = kwargs["evmenu_goto_callables"]
|
||||||
current_nodename = kwargs["current_nodename"]
|
current_nodename = kwargs["evmenu_current_nodename"]
|
||||||
|
|
||||||
# start with glob patterns
|
# start with glob patterns
|
||||||
for pattern, goto in gotomap.items():
|
for pattern, goto in gotomap.items():
|
||||||
|
|
@ -1761,9 +1767,9 @@ def parse_menu_template(caller, menu_template, goto_callables=None):
|
||||||
"goto": (
|
"goto": (
|
||||||
_generated_goto_func,
|
_generated_goto_func,
|
||||||
{
|
{
|
||||||
"goto": goto,
|
"evmenu_goto": goto,
|
||||||
"current_nodename": nodename,
|
"evmenu_current_nodename": nodename,
|
||||||
"goto_callables": goto_callables,
|
"evmenu_goto_callables": goto_callables,
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
}
|
}
|
||||||
|
|
@ -1779,9 +1785,9 @@ def parse_menu_template(caller, menu_template, goto_callables=None):
|
||||||
"goto": (
|
"goto": (
|
||||||
_generated_input_goto_func,
|
_generated_input_goto_func,
|
||||||
{
|
{
|
||||||
"gotomap": inputparsemap,
|
"evmenu_gotomap": inputparsemap,
|
||||||
"current_nodename": nodename,
|
"evmenu_current_nodename": nodename,
|
||||||
"goto_callables": goto_callables,
|
"evmenu_goto_callables": goto_callables,
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue