《使用MUDCORE框架从零开发LPMUD游戏》系列内容,通过教程既能熟悉 MUDCORE 框架的使用,也能学习LPCMUD游戏的开发,版权所有 mud.ren。
技能
技能系统是每个游戏的具体特色,本示例中每个职业包括职业技能和魔法技能,职业技能通过技能点数分配来学习,而魔法技能则是达到一定等级自动学习,整个体系规范的不错,只是代码实现上做的并不好,项目只是傻瓜的做一些实现,相关代码在feature目录下,由守护进程system/daemons/skill_d.c和system/daemons/spell_d.c控制,技能的使用则通过指令skill和spell来实现,因为这方面的代码还需要重构,这里就不做具体演示了,有兴趣的同学可以重写相关模块。
[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模块调用。具体流程如下:
- 生物的
heart_beat()方法在心跳时判断当前是否战斗状态 - 如果是战斗状态调用生物
ATTACK模块实现的attack()方法 attack()方法处理后调用战斗守护进程的fight()方法进行战斗