使用MUDCORE框架从零开发LPMUD游戏:特别功能的NPC

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

从本节开始,不再一点点的代码演示开发功能,特别是非mudcore框架提供的功能,不做细节讲述,只做基本介绍并提供完整的项目代码,可以自己运行项目分析代码参考学习。

请先使用以下指令下载完整的项目代码:

git clone --recurse-submodules https://github.com/mudcore/MyMud.git

上一节我们实现了基本的NPC功能,但游戏中除了功能和长像差不多的普通NPC,还有大量特别的NPC,比如:交易商,这些功能需要单独开发。

因为特殊功能的NPC也是NPC,那必须继承标准NPC的代码,然后再实现自己独有的功能,如交易商std/living/dealer.c

/*****************************************************************************
Copyright: 2019, Mud.Ren
File name: dealer.c
Description: 商人标准继承对象 STD_DEALER
Author: xuefeng
Version: v1.0
Date: 2019-03-13
History:
*****************************************************************************/
#include <ansi.h>
inherit STD_NPC;
inherit DEALER;

protected varargs void create(string vocation, int lvl)
{
    if (!stringp(vocation))
    {
        vocation = "common";
    }
    if (!lvl)
    {
        lvl = 20;
    }
    npc::create(vocation, lvl);
    set_name("杂货商", ({"dealer"}));
    set("long", HIC "一个商贩,专门买卖各种千奇百怪但又实用的杂货。" NOR);
    set("gender", "男性");
    set("vendor_goods", ({
    }));
}

void init()
{
    add_action("do_buy", "buy");
    add_action("do_list", "list");
    add_action("do_sell", "sell");
    add_action("do_show", "show");
}

以上代码是交易商人的标准实现,默认增加了交易相关的指令buylistsellshow。而交易相关功能的具体实现则放在DEALER模块inherit/dealer.c中,为什么这样做?因为交易功能并不只是NPC可以用,可以在某些特别条件中我们要弄一个自动售货机啥的,这不是NPC而是一个物品,DEALER功能模块独立出来后就可以实现代码复用。具体交易功能代码这里不再演示,可以自己看inherit/dealer.c代码,如果需要扩展功能也直接改写这里即可。

把标准交易商人宏定义为STD_DEALER方便继承调用,我们可以让具体的商人直接继承标准商人对象,如代码world/dq9/1/npc/dealer.c

#include <ansi.h>
inherit STD_DEALER;

protected void create()
{
    ::create("thief", 15);
    set_name("杂货商", ({"dealer"}));
    set("long", HIC "一个商贩,专门买卖各种千奇百怪但又实用的杂货。" NOR);
    set("vendor_goods", ({
        ITEM_DIR "medicinal_herb",
        ITEM_DIR "holy_water",
        ITEM_DIR "chimaera_wing",
        ARMOUR_DIR "arm/cotton_gloves",
        ARMOUR_DIR "body/plain_clothes",
        ARMOUR_DIR "body/wayfarer_clothes",
        ARMOUR_DIR "body/leather_armour",
        ARMOUR_DIR "foot/sandals",
        ARMOUR_DIR "foot/leather_shoes",
        ARMOUR_DIR "head/bandana",
        ARMOUR_DIR "leg/boxer_shorts",
        ARMOUR_DIR "leg/cotton_trousers",
        ARMOUR_DIR "shield/pot_lid",
        ARMOUR_DIR "shield/leather_shield",
        WEAPON_DIR "sword/copper_sword",
        WEAPON_DIR "sword/soldier_sword",
        WEAPON_DIR "wand/oak_staff",
        WEAPON_DIR "whip/leather_whip",
        WEAPON_DIR "fan/feather_fan",
    }));
}

这是在地图1中的一个基础交易商人,这是一个15级的盗贼,出售部分武器、装备和道具。

杂货铺 - /world/dq9/1/village/shop
    这里是沃尔罗村的杂货铺,你可以在这里买(buy)卖(sell)物品,杂货铺还贴了
一张购物说明(readme)。
    这里唯一的出口是 out。
  杂货商(Dealer)
[62|3]l d
名称:杂货商(Dealer)
说明:一个商贩,专门买卖各种千奇百怪但又实用的杂货。
      他是一位 15 级的盗贼,他的装备你看不出来什么属性。
[62|3]list 
杂货商目前出售以下物品:
布手套(Cotton gloves)                    250
皮甲(Leather armour)                     300
布衣(Plain clothes)                      100
旅行者之服(Wayfarer clothes)             150
皮鞋(Leather shoes)                      150
凉鞋(Sandals)                            100
头巾(Bandana)                            90
大裤衩(Boxer shorts)                     100
布裤子(Cotton trousers)                  100
皮盾(Leather shield)                     120
锅盖(Pot lid)                            100
羽扇(Feather fan)                        150
铜剑(Copper sword)                       150
士兵长剑(Soldier sword)                  250
橡木杖(Oak staff)                        250
皮鞭(Leather whip)                       100
奇美拉之翼(Chimaera wing)                1500
圣水(Holy water)                         1000
草药(Medicinal herb)                     8

其它特别NPC的实现思路一样,实现一个继承标准NPCSTD_NPC的标准对象,如神父STD_DIVINE、旅店服务员STD_MAID等,然后由具体对象继承这个对象,具体代码可参考std/living/下的代码。

京ICP备13031296号-4