使用MUDCORE框架从零开发LPMUD游戏:自定义登录位置

《使用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

现在我们测试一下,启动游戏登录看看,登录地点变成我们自定义环境了,而且这个出生点可以随意移动,地图无限大,正常移动永远也到不了边界。

file

本节代码

在本节课程中我们主要是在globals.h中通过START_ROOM宏定义指定自己游戏的出生地,而出生地通过继承代码实现功能。

最后 commit 我们当前版本:

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

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

京ICP备13031296号-4