《使用MUDCORE框架从零开发LPMUD游戏》系列内容,通过教程既能熟悉 MUDCORE 框架的使用,也能学习LPCMUD游戏的开发,版权所有 mud.ren。
在上一章中我们完善了基本的结构,实现了基本的指令,但是注册和登录使用框架提供的示例,现在我们根据游戏规划,开发我们的注册登录功能。
游戏环境开发
为了方便玩家登录,我们实现出生点的游戏环境,先实现标准的房间,修改 /std/room/room.c 代码如下:
// 标准室内环境模板STD_ROOM
inherit _ROOM;
void create()
{
set("short", "虚空");
set("long", "这里是虚幻时空,四周雾蒙蒙一片,什么也看不清。");
set("dq", 0); // 设置所属世界
set("outdoors", 0); // 设置是否户外
setArea(0, 0, 0, 0); // 设置所属地区和x,y,z坐标
set("no_get", 0); // 是否禁止拾起
set("no_drop", 0); // 是否禁止丢弃
set("no_fight", 1); // 是否禁止战斗
}
这个标准房间继承了 _ROOM 接口,并实现了基本属性,将来会根据游戏需要完善。同样,我们暂时实现另外三种地形环境的模板。
/std/room/outdoors.c 代码如下:
// 标准户外环境模板STD_OUTDOORS
inherit STD_ROOM;
void create()
{
::create();
set("short", "户外");
set("long", "这里是户外,阳光明媚,让人感觉心情特别舒畅。");
set("outdoors", 1); // 设置是否户外
}
/std/room/dungeon.c 代码如下:
// 标准地牢环境模板STD_DUNGEON
inherit STD_ROOM;
void create()
{
::create();
set("short", "地牢");
set("long", "这里是废弃地牢,四周雾蒙蒙一片,什么也看不清。");
set("no_fight", 0);
}
/std/room/wild.c 代码如下:
// 标准野外环境模板STD_WILD
inherit STD_OUTDOORS;
void create()
{
::create();
set("short", "荒郊野外");
set("long", "这里是荒郊野外,四周雾蒙蒙一片,什么也看不清。");
set("no_fight", 0);
}
/std/room/area.c代码如下:
inherit _AREA;
void create()
{
set("name", "虚空幻境");
set("x_axis_size", 38); // 橫向大小
set("y_axis_size", 11); // 縱向大小
setup();
}
这几个环境模板暂时差别很少,但是将来会增加更多的区别。
自定义出生点
我们规划的游戏世界文件放置 world 目录中,现在我们新建这个目录,并在这个目录下新建出生点房间 start_room.c,房间直接继承标准房间对象,代码如下:
// 玩家出生点
#include <ansi.h>
inherit STD_ROOM;
varargs private void create(int x, int y, int z)
{
set("short", "天使界");
set("long", HIW "这里是位于星空深处的天使界,是守护世界的天使们居住的地方,据说女神就在天使界的某地沉睡。" NOR);
set("no_fight", 1);
set("exits", ([
"up" : __DIR__ "start_room/" + x + "," + y + "," + (z + 1),
"north" : __DIR__ "start_room/" + x + "," + (y + 1) + "," + z,
"south" : __DIR__ "start_room/" + x + "," + (y - 1) + "," + z,
"west" : __DIR__ "start_room/" + (x - 1) + "," + y + "," + z,
"east" : __DIR__ "start_room/" + (x + 1) + "," + y + "," + z,
]));
if (z > 0)
{
set("exits/down", __DIR__ "start_room/" + x + "," + y + "," + (z - 1));
}
if (z == 99)
{
removeExit("up");
}
setArea(0, x, y, z);
}
为了自定义登录,我们在 globals.h 中把出生点定义为宏常量START_ROOM:
// The global include file is included automatically.
#ifndef GLOBALS_H
#define GLOBALS_H
// 游戏管理员帐号
#define WIZARD "test"
// 核心目录
#define INHERIT_DIR "/inherit/"
#define DAEMON_DIR "/system/daemons/"
// 系统目录
#define WORLD_DIR "/world/"
// 功能模块
#include "_inherit.h"
// 守护进程
#include "_daemon.h"
// 标准继承对象
#include "stdob.h"
// 指令路径
#define CMD_PATH_WIZ ({"/cmds/wiz/", "/mudcore/cmds/wizard/"})
#define CMD_PATH_STD ({"/cmds/std/", "/mudcore/cmds/player/"})
// 其他
#define MOTD "/system/etc/motd"
#define PRELOAD "/system/etc/preload"
#define START_ROOM WORLD_DIR "start_room"
// mudcore框架头文件(请放在最底部)
#include <mudcore.h>
#endif
现在我们测试一下,启动游戏登录看看,登录地点变成我们自定义环境了,而且这个出生点可以随意移动,地图无限大,正常移动永远也到不了边界。

本节代码
在本节课程中我们主要是在globals.h中通过START_ROOM宏定义指定自己游戏的出生地,而出生地通过继承代码实现功能。
最后 commit 我们当前版本:
git add .
git commit -m 'v2.0'
附本节版本源码下载地址,如果下载使用,请在项目目录执行 git submodule update。