使用MUDCORE框架从零开发LPMUD游戏:技能与战斗

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

技能

技能系统是每个游戏的具体特色,本示例中每个职业包括职业技能和魔法技能,职业技能通过技能点数分配来学习,而魔法技能则是达到一定等级自动学习,整个体系规范的不错,只是代码实现上做的并不好,项目只是傻瓜的做一些实现,相关代码在feature目录下,由守护进程system/daemons/skill_d.csystem/daemons/spell_d.c控制,技能的使用则通过指令skillspell来实现,因为这方面的代码还需要重构,这里就不做具体演示了,有兴趣的同学可以重写相关模块。

[62|3]skill

≡----------------------------------------------------≡
 |                    *职业技能*                    | 
 |--------------------------------------------------| 
 |      技能类别                分配点数            | 
 |         剑                       0               | 
 |         鞭                       0               | 
 |         扇                       0               | 
 |         盾                       0               | 
 |        曲艺                      0               | 
≡----------------------------------------------------≡
  * 更多技能帮助请输入:help skill
[62|3]skill 1

≡----------------------------------------------------≡
 |                  *剑系职业技能*                  | 
 |--------------------------------------------------| 
 | 等级   SP               说明                   | 
 |   1      3   装备剑时攻击力额外+5。              | 
 |   2      7   装备剑时对龙系魔物伤害提高50%。     | 
 |   3     13   装备剑时攻击力额外+5。              | 
 |   4     22   装备剑时会心率增加3%。              | 
 |   5     35   装备剑时攻击力额外+10。             | 
 |   6     42   装备剑时攻击力额外+15。             | 
 |   7     58   (技)奇迹斩                          | 
 |   8     76   装备剑时攻击力额外+20。             | 
 |   9     88   (技)修罗斩                          | 
 |  10    100   该角色全部职业都可以装备剑。        | 
≡----------------------------------------------------≡
[62|3]skill 2

≡----------------------------------------------------≡
 |                  *鞭系职业技能*                  | 
 |--------------------------------------------------| 
 | 等级   SP               说明                   | 
 |   1      3   装备鞭时攻击力额外+5。              | 
 |   2      7   装备鞭时对怪人系怪物伤害提高50%。   | 
 |   3     13   鞭装备时攻击力数值额外+5。          | 
 |   4     22   装备鞭时会心率上升3%                | 
 |   5     35   鞭装备时攻击力额外+10。             | 
 |   6     42   装备鞭时攻击力额外+15。             | 
 |   7     58   装备鞭时会心率上升10%。             | 
 |   8     76   装备鞭时攻击力额外+20。             | 
 |   9     88   (技)治疗鞭                          | 
 |  10    100   该角色全部职业都可以装备鞭。        | 
≡----------------------------------------------------≡
[62|3]spell

≡----------------------------------------------------≡
 |                     *魔法书*                     | 
 |--------------------------------------------------| 
 |  霍伊米          吟唱咒语:cast heal             | 
 |  巴基            吟唱咒语:cast wind             | 
 |  夏德            吟唱咒语:cast ice              | 
≡----------------------------------------------------≡

战斗

战斗功能是游戏的另一大乐趣,当然不同的游戏有不同的实现方式,战斗应该是生物的能力,mudcore框架提供了基础的战斗功能,项目中直接继承使用,具体文件为inherit/attack.c

/*****************************************************************************
Copyright: 2019, Mud.Ren
File name: attack.c
Description: 战斗攻击功能接口 ATTACK
Author: xuefeng
Version: v1.0
Date: 2019-03-12
History:
*****************************************************************************/
inherit CORE_ATTACK;

另外还有伤害管理模块inherit/damage.c,因为伤害并不只是战斗才能造成,为方便使用,分为不同的模块实现,包括死亡处理也是在伤害管理模块中实现:

/*****************************************************************************
Copyright: 2019, Mud.Ren
File name: damage.c
Description: 伤害控制接口,配合战斗系统使用,由标准角色对象继承
Author: xuefeng
Version: v1.0
Date: 2019-05-01
History:
*****************************************************************************/
#include <attribute.h>
#include <dbase.h>

nosave string *dead_msg = ({
    "$ME慢慢倒在地上,身体化为一道流光消失了。",
    "$ME无力的挣扎几下后,化做泡影消失在大家眼前。",
});

nosave object last_damage_from = 0;

object query_last_damage_from()
{
    return last_damage_from;
}

// damage 为负时为恢复
varargs int receive_damage(string type, int damage, object who)
{
    int val, max;

    if (type != "hp" && type != "mp")
        error("receive_damage: 伤害种类错误(只能是 hp 或 mp)。\n");

    if (damage == 0)
        return 0;

    if (damage > 0 && objectp(who) && who != last_damage_from)
    {
        last_damage_from = who;
    }

    val = (int)query_attr(type) - damage;
    max = (type == "hp") ? query_max_hp() : query_max_mp();

    if (val >= max) // 恢复不超过最大值
        set_attr(type, max);
    else
        set_attr(type, val);

    return damage;
}

varargs void die(object killer)
{
    object me;
    string rebornroom;
    me = this_object();

    if (!killer)
    {
        killer = last_damage_from;
    }

    msg("vision", element_of(dead_msg), me);

    REWARD_D->killer_reward(killer, me);

    if (userp(me))
    {
        // 清除临时状态
        me->delete_temp("status");
        // 清除增益状态
        me->clean_condition();
        // todo 新增虚弱效果

        if (!stringp(rebornroom = me->query("reborn_room")) ||
            file_size(rebornroom + ".c") < 0)
            rebornroom = START_ROOM;
        me->move(rebornroom);
        me->start_busy(3);
        me->save();
    }
    else
    {
        set_heart_beat(0);
        destruct(me);
    }
}

而具体战斗行为控制则是由战斗守护进程system/daemons/combat_d.c管理,这个具体代码请看项目源码,注意守护进程必须实现void fight(object me, object victim)方法,由ATTACK模块调用。具体流程如下:

  1. 生物的heart_beat()方法在心跳时判断当前是否战斗状态
  2. 如果是战斗状态调用生物ATTACK模块实现的attack()方法
  3. attack()方法处理后调用战斗守护进程的fight()方法进行战斗
京ICP备13031296号-4