使用MUDCORE框架从零开发LPMUD游戏:表情动作系统和中文翻译功能

表情功能

使用 mudcore 框架,在前面章节我们快速实现了很多基本的功能,包括指令系统和别名,本节我们继续实现和指令相似的功能-表情动作。

在主流的MUD中我们习惯了直接输入 hi 打招呼,或输入 chat* hi 表达动作。mudcore 框架的 CORE_EMOTE_D 也提供了这个功能,我们可以快速实现表情动作系统。

我们先实现表情管理指令 /cmds/wiz/emote.c,代码如下:

inherit CLEAN_UP;

int main(object me, string arg)
{
    string *emote;
    int i;

    if (!wizardp(me))
        return 0;

    if (!arg)
        return notify_fail("你要编辑什么 emote ?\n");

    if (arg == "-d" || arg == "-p")
        return notify_fail("指令格式 : emote [-d|-p] <emote>\n");

    if (sscanf(arg, "-d %s", arg))
    {
        write("删除 emote:" + arg + "\n");
        return EMOTE_D->delete_emote(arg);
    }

    if (sscanf(arg, "-p %s", arg))
    {
        if (!arrayp(emote = EMOTE_D->query_emote(arg)) || !sizeof(emote))
        {
            write("没有这个表情动词。\n");
            return 1;
        }
        write(sprintf("—————————————————————\n%s\n%s\n", emote[0], emote[1]));
        return 1;
    }

    if (arrayp(emote = EMOTE_D->query_emote(arg)) && sizeof(emote))
    {
        write("系统存在这个表情,如果需要编辑请先删除。\n");
        return 1;
    }

    write(sprintf("arg = %s\n", arg));

    for (i = 0; i < strlen(arg); i++)
        if (arg[i] <= 32 || arg[i] > 'z')
            return notify_fail("表情动词必须由字母或数字、标点构成。\n");

    emote = EMOTE_D->query_emote(arg);
    if (!arrayp(emote))
        emote = allocate(2);

    write("编辑 emote:" + arg + "\n");
    write("讯息可以有好几行,用 . 表示结束,用 x 取消编辑。\n");
    write("讯息中可使用的参数有以下几种:\n");
    write("  $ME  自己;$YOU  对象\n");
    write("————————————————————————————————————\n");
    write("不指定对象使用这个 emote 时的讯息:\n->");
    input_to("get_msg_myself", emote, arg);
    return 1;
}

int get_msg_myself(string msg, string *emote, string pattern, int n)
{
    msg = replace_string(msg, "\\n", "\n");
    if (msg == "x")
    {
        write("你取消了表情编辑。\n");
        return 1;
    }

    if (msg == ".")
    {
        if (!n)
            write("忽略该项描述。\n");
        write("指定对象使用这个 emote 时的讯息:\n->");
        input_to("get_msg_others", emote, pattern);
        return 1;
    }

    emote[0] = msg;
    write(msg + "\n->");
    input_to("get_msg_myself", emote, pattern, n + 1);
    return 1;
}

int get_msg_others(string msg, string *emote, string pattern, int n)
{
    msg = replace_string(msg, "\\n", "\n");
    if (msg == "x")
    {
        write("你取消了表情编辑。\n");
        return 1;
    }
    if (msg == ".")
    {
        if (!n)
            write("忽略该项描述。\n");
        write("OK!");
        EMOTE_D->set_emote(pattern, emote);
        return 1;
    }
    emote[1] = msg;
    write(msg + "\n->");
    input_to("get_msg_others", emote, pattern, n + 1);
    return 1;
}

int help(object me)
{
    if (!wizardp(me))
        return 0;

    write(@HELP
指令格式 : emote [-d|-p] <emote>

这个指令可以修改,删除 emote 或列出其内容。 加上 -d 参数会删
除指定的 emote,-p 参数则会列出指定 emote 的内容.

一个 emote 讯息可以有很多行, 在空白行输入 '.' 表示结束输入该
项 emote.

编辑 emote 时可以用以下的符号来表示:
$ME : 自己的名字.
$YOU : 目标的名字.

HELP );
    return 1;
}

在ES2底层的MUD中,把人称状态分了太多类,在 mudcore 框架把这一切精简为 $ME 和 $YOU 二种,并自动针对不同对象自动改变显示。

我们先编辑一个基本的表情 hi,试试。输入 emote hi,然后输入如下内容:

不指定对象时的表情:$ME热情的和大家打招呼:hi! 指定对象时的表情:$ME热情的和$YOU打招呼:hi~

现在在游戏中输入这个动作表情试试吧。

只要按这个样式补充表情库就能完善你的游戏表情,表情存档文件为/data/emote_d.o一切就这么简单^_^

中文翻译

和表情系统类似的是中文翻译系统,mudcore 提供的 CORE_CHINESE_D 守护进程让这个变得简单。

我们先实现一个翻译管理指令 /cmds/wiz/chinese.c,代码如下:

// chinese.c
inherit CLEAN_UP;

int help(object me);

int main(object me, string arg)
{
    string key, chinz;

    if (!wizardp(me))
        return 0;

    if (!arg || arg == "")
    {
        return help(me);
    }

    if (arg == "-dump")
    {
        CHINESE_D->dump_translate();
        write("CHINESE_DUMP!\n");
        return 1;
    }

    if (sscanf(arg, "-d %s", key))
    {
        CHINESE_D->remove_translate(key);
        write(sprintf("删除字典 %s.\n", key));
        return 1;
    }

    if (sscanf(arg, "%s to %s", key, chinz) == 2)
    {
        CHINESE_D->add_translate(key, chinz);
        write(key + " <==> " + chinz + "!\n");
        return 1;
    }
    else
    {
        write(sprintf("%s 翻译结果为 %s。\n",
                      arg, chinese(arg)));
    }

    return 1;
}

int help(object me)
{
    if (!wizardp(me))
        return 0;

    write(@HELP
查询、设置中英文字典,或导出字典到 CHINESE_DUMP 文件。

指令格式:chinese <英文>
      或  chinese <英文> to <中文>
      或  chinese -d <英文>
      或  chinese -dump
HELP );
    return 1 ;
}

通过这个指令,我们可以使用框架提供的 CHINESE_D 守护进程管理游戏中的英文ID和中文翻译,翻译词典文件为/data/e2c_dict.o

只要我们加入翻译,就可以快捷的使用模拟外部函数 chinese 快速获取指定内容的中文翻译。

最后 commit 我们当前版本:

git add .
git commit -m 'v2.3'

本节代码

附本节版本源码下载地址,如果下载使用,请在项目目录执行 git submodule update

京ICP备13031296号-4