使用MUDCORE框架从零开发LPMUD游戏:基础指令和自定义指令

《使用MUDCORE框架从零开发LPMUD游戏》系列内容,通过教程既能熟悉 MUDCORE 框架的使用,也能学习LPCMUD游戏的开发,版权所有 mud.ren。

上一节中我们使用 mudcore 框架快速实现了MUD项目的核心功能,但是除了聊天外没有指令交互,本节我们先实现最基本的游戏指令。

基本指令

mudcore 框架实现的指令系统有二种:以add_action为核心的cmd指令系统和以parse_sentence为核心的verb指令系统,这二种系统的实现在基础教程中有讲解。这里只简单说一下区别:在游戏中玩家的操作应该分为命令和行动二种,比如:管理员要更新一个文件,需要执行update,这是一个cmd命令,玩家需要看看这里有什么,需要执行look,这是一个verb行动。因为命令系统实现更为简单,所以国内MUD把的有指令都基于add_action用命令实实现,但mudcore框架把两种方式都实现了。

cmd指令目录有二个:管理指令目录 /mudcore/cmds/wizard/ 和标准指令目录 /mudcore/cmds/player/,指令需要实现以下方法:

int main(object me, string arg);

这个方法是所有cmd命令的入口函数,其中arg是指令的参数,要求执行成功必须返回1 return 1;,执行失败必须返回0 return 0;或者return notify_fail("失败消息");

MUDCORE框架已经实现管理指令 shutdownupdatevariables 和玩家指令 quithelpemoji等。

file

输入emoji显示表情的指令效果示例

框架的 shutdown 没有玩家存档数据功能处理。update 代码中的 VOID_OB 是 mudcore 框架中默认定义的宏,代表默认的环境对象,后期我们在自己开发的游戏中会覆盖它。框架默认等帮助指令 help 只能查看指令的帮助,游戏中除了指令帮助。其他指令大家可以自己看框架。

管理指令 shutdown 等需要管理员才能使用,框架默认设置管理员ID为 mudren,我们在 globals.h 中可以新增 WIZARD 定义修改,如:

// The global include file is included automatically.
#ifndef GLOBALS_H
#define GLOBALS_H

// 游戏管理员帐号
#define WIZARD "test"

// mudcore框架头文件(请放在最底部)
#include <mudcore.h>

#endif

这里我们重新定义管理员为 test

再次重新启动游戏,连线体验看看变化,使用管理员 test 登录后可以使用在线关闭游戏服务器、更新游戏文件等功能指令了。

verb指令目录有二个:管理指令目录 /mudcore/verbs/wizard/和通用指令目录 /mudcore/verbs/common,verb指令更为灵活,但实现起来比较复杂,需要通过 can_*direct_*do_*indirect_* 等一系列apply方法来设置指令的权限和功能。

MUDCORE框架已经实现的通用指令包括lookgo,这二个指令都是游戏的核心。

本教程为避免开局难度过大,先以cmd指令系统为主来教学开发,对verb指令系统在后继教程讲解。

自定义cmd指令系统

框架默认的指令不一定满足我们的需有,这是就需要我们实现自己的指令功能。自定义指令可以选择保留框架指令或仅仅使用我们自己开发的指令,我们先做基本的配置,定义CMD_PATH_WIZCMD_PATH_STD

// The global include file is included automatically.
#ifndef GLOBALS_H
#define GLOBALS_H

// 游戏管理员帐号
#define WIZARD "test"

// 指令路径
#define CMD_PATH_WIZ ({"/cmds/wiz/", "/mudcore/cmds/wizard/"})
#define CMD_PATH_STD ({"/cmds/std/", "/mudcore/cmds/player/"})

// mudcore框架头文件(请放在最底部)
#include <mudcore.h>

#endif

路径定义为指令路径数组,注意我们要把自己游戏的指令放在前面,框架提供的放在后面,这可以实现自定义指令覆盖框架指令的能力,如果你完全不需要框架自来的指令,那在数组中不包括mudcore框架指令目录就可以了。

我们自定义help指令实现查看帮助文件的功能来演示自定义指令系统。我们先在 /cmds/std/ 目录新建 help.c,代码如下:

#include <ansi.h>

#define HELP_DIR "help/"

int help(object me);

int main(object me, string arg)
{
    object file;

    if(!arg)
    {
        arg = "tutorial";
    }

    if (file_size(HELP_DIR + arg) > 0)
    {
        me->more_file(HELP_DIR + arg);
        return 1;
    }
    else if( objectp(file = COMMAND_D->find_command(arg)) ) {
        return file->help(me);
    }
    else
        return notify_fail(HIR "对不起,没有找到相关帮助文档。\n" NOR);

    return 1;
}

int help(object me)
{
    write(@HELP
指令格式 : help [topic]

这个指令可以查看指定主题的帮助说明。

HELP );
    return 1;
}

help 先查找 "help" 目录中是否有相关文件,如果有就读取显示,否则查找指令并调用指令的 help 方法。 代码中的 COMMAND_D 是 mudcore 定义的宏,后期如果我们需要扩展指令功能,可以重新定义。

如果 help 不指定主题,会显示 /help/tutorial 文件内容,文件内容可以使用颜色控制,我们测试一下,新建 /help/tutorial,内容如下:

──────────────────────────────────────────────
1. $HIG$新手指南$NOR$
    如果没有接触过文字游戏,一定记住一个指令($HIY$help$NOR$),直接输入 help 查看游戏中的可用指令,在游
戏中的一切操作都是输入指令互交,具体每个指令等作用可以输入“$HIY$help [指令]$NOR$”了解,如:help top。

1.1 $GRN$怎么移动?$NOR$
    游戏中描述了这里的出口有哪些,直接输入出口对应的英文即可,比如:out、enter;其中最常用的方
向east、south、west、north等可以自己输入首字母:e、s、w、n;而northeast、southwest这种则可
以输入ne、sw代替。

1.2 $GRN$怎么聊天?$NOR$
    既然是网络游戏,就需要交流,可以直接输入“$HIY$chat 内容$NOR$”发送聊天,也可以使用“chat* hi”发送表情
,游戏中有哪些表情动作需要自己尝试。另外游戏中还有bill、shout频道可用,如果只是和身边的玩家聊天
直接“say 内容”即可。

1.3 $GRN$最常用基础指令$NOR$
    look(缩写$HIY$l$NOR$) 世界这么大,你得去看看,一个 l ,可以看一切可以看的的并反馈信息给你,比如其他玩家、
装备属性;$HIY$i$NOR$指令看看自己身上有啥;$HIY$sc$NOR$指令查看自己的属性资料;$HIY$use$NOR$指令使用物品;$HIY$equip$NOR$指令装备物品,
$HIY$remove$NOR$指令解除装备;在商人边上$HIY$list$NOR$可以查看出售的物品,$HIY$buy$NOR$、$HIY$sell$NOR$可以买卖物品;$HIY$save$NOR$主动保存个人
游戏资料;$HIY$quit$NOR$指令退出游戏。

2. $HIG$游戏说明$NOR$
    本游戏是以勇者斗恶龙为原型的文字网络游戏,DQ中的基础特色在这里都以文字互交实现。目前游戏版本
以DQ9为原型。

2.1 $GRN$教堂的作用$NOR$
    在游戏教堂中祈祷($HIY$pray$NOR$)可以查看自己还差多少经验升级,同时也会把自己的存档点改为此教堂,如果
是组队游戏,可以在教堂复活($HIY$revive$NOR$)队友,避免队友的经验和金钱损失。

2.2 $GRN$旅店的作用$NOR$
    游戏中在旅店住宿($HIY$sleep$NOR$)可以恢复HP和MP,但是需要金钱,没钱的玩家在旅店发呆也可能恢复HP,但
不会恢复MP。

2.3 $GRN$游戏职业$NOR$
    游戏中如果不算平民职业的话,共有12种职业,其中六种基础职业:$HIC$旅艺人、僧侣、魔法师、盗贼、战士
武斗家$NOR$;平民只能转职为旅艺人,然后可以随意转职,各职业数据独立,如:15级的旅艺人转职成其他职业后
再转职回旅艺人,等级还是15级,一切属性保留。基础职业转职在沃尔罗村外的基萨格纳遗迹深处的转职之间。
游戏中还有$HIC$战斗大师、魔法战士、游侠、贤者、圣骑士、超级明星$NOR$6种上级职业,需要到后续剧情的达玛神殿转
职。每个职业可装备的武器不同,属性成长也不同。
    请注意:$YEL$平民职业能力比较低,但是如果你有信心练起来,可以额外得到100点技能点数学习盾系技能。$NOR$
$YEL$同时可以学习到地图传送咒文鲁拉$NOR$。

2.4 $GRN$游戏技能$NOR$
    游戏技能分为咒文和特技,咒文为升级后自动学习,各职业不同,转职后不保留;特技则是通过技能点数
分配学习,转职后保留。可以使用$HIY$spells$NOR$、$HIY$skills$NOR$查看自己的咒文和技能,也可以使用$HIY$skill$NOR$查看职业技能
和点数分配。

2.5 $GRN$升级和死亡$NOR$
    游戏中讨伐怪物获取经验和金钱,经验积累可以自动升级,升级后属性会有成长,同时可以获取技能点数;
10级以下玩家死亡无损失,但$HIR$超过10级的玩家死亡会损失经验和金钱$NOR$,而且可能降级。

2.6 $GRN$组队冒险$NOR$
    在游戏中可以使用($HIY$team$NOR$)指令和其他玩家组队冒险,一个队伍最多四位玩家,组队只要不是团灭,死亡后
可以被队友救活,不会有任何损失。

2.7 $GRN$快速回城$NOR$
    10级以下新手可以使用($HIY$home$NOR$)指令回到出生地,10级以上玩家则需要使用道具奇美拉之翼或职业技能。

    $HIM$更多游戏特色请自己在游戏中体验,有问题可以加QQ交流群:$HBYEL$ 285533476 $NOR$$HIM$,DQMUD欢迎大家。$NOR$
──────────────────────────────────────────────

提示:帮助内容正常是开发后完善的,这里只是给个示例。

现在输入 help 试试看,是否有内容和颜色?是否可以查看帮助文档了?我们自己实现的 help 已经覆盖了框架自带的指令,我们还可以输入 which help 看看提示的指令路径。

file

从内容显示可以注意到 mudcore 框架已经自动实现内容分页显示功能,我们不需要做任何额外开发。

最后 commit 我们当前版本:

git add .
git commit -m 'v1.1'

代码总结

本节课程介绍了mudcore框架自带的指令系统和如何实现自己的指令,只用在globals.h中配置目录,然后在指令中实现int main(object me, string arg)方法即可。

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

京ICP备13031296号-4