现在很多新巫师对combatd不了解,写skill的时候经常是把以前的skill拿过来跟着感觉改改几个参数、名字和描述,造成很多问题。转一篇skill的详细说明,希望能有帮助:
// 注:一切只是依据 combatd.c 所作出的解释。
// 如仍有其他的公用的、必要的程序会用到这些设置,
// 那么这里所说的一切解释皆有可能不正确。
// 以奈何单机内现行的华山剑法第一式为例。
([ "action":"$N一招「白云出岫」,剑势灵动轻盈,手中$w点向$n的$l",
"force" : 150,
"dodge" : 5,
"parry" : 5,
"damage": 15,
"lvl" : 0,
"skill_name" : "白云出岫",
"damage_type": "刺伤"
]),
([
"skill_name" : "白云出岫",
// 招式名
"lvl" : 0,
// 技能在多少等级或以上时,能出这一招
"action":"$N一招「白云出岫」,剑势灵动轻盈,手中$w点向$n的$l",
// 描述。描述要遵循一个规则,就是只有前部分,没有后果,
// 后果还要经过判断才知晓。
// $N, 攻击者 $n,被攻击者,$w,兵器,$l,攻击部位
"force" : 150,
// 仅在攻击成功时,这个会给伤害力加成……整十数有效。
// 但是很多 skill file 里,总会见到一些非整十的设置,例如 125,意义是?……
// 公式如下:
// if( !objectp(weapon) )
// damage_bonus += action["force"] /10 * (damage_bonus / 100);
// else damage_bonus += action["force"] /10 * (damage_bonus/300);
// 意思是如果是空手打,加成大很多
// damage_bonus 最初值是攻击者的后天膂力,即 query_str()
// damage_bonus 好象乱78糟的,一时间也看不了那么多
// 暂时不理它
// 不过我怀疑……如果是后天膂力低,并且用的又不是空手时,damage_bonus 怎么加
// 也很难加到 300,一算,即使这里设置 10000000,结果还是0,搞什么啊
"dodge" : 5,
// 这个是有好处的,在 combatd.c 的 do_attack() 里,
// 判断攻防成功率之前,给 me 设置了一个 set_temp("fight/dodge")
//
// fight/dodge 将在计算躲闪概率的时候有加成,整十数有效。
// 当技能等级越高时,它的加成将会越高。
// 而在某些 code 里见到一些 5,8,12,15等,还有设置为 -0 的,
// 要么就是他们写 code 时根本不了解参数含义,要么就是还有别的用途,
// 暂时不理会罢。
//
// 就 combatd.c 来说,这个值的设置非常的有用。object 在发出一个招式
// 进攻后,以这个值的多少,可以设定其随后一次防御时的成功率加大或是降低。
// 例如某招式设置了 action["dodge"] = 100, 那么自然的,这一招过后,
// object 的躲闪概率就会加大一些。而设置了 -100 时,就会降低了。
// 有了这个值,招式是否“拼命”,就能够体现出来了。值得注意的是,
// 当一个新的招式发出时(即再次调用 do_attack() 时),它将被重新
// 设置一次。如果新招式资料里无 "dodge",将被设置为 0。
//
// 附:skill 等级低时,似乎其变化要十分的大,才能见到更显眼的效果。
// 一些CODE里的各招式有 5,8,12,15 的递增,就此看来,似乎是该 wiz 的
// 一厢情愿而已,实际可以说是没什么效果变化的。
// 此值具体变化未测试亦无法精确测试,无建议值。
"parry" : 5,
// 这个又是??……这个值的原意大概是和 dodge 一样,
// 不同的是,它是计算 防御概率 的,而 dodge 是 躲闪概率 的。
// 问题是! 整个 combatd.c 里也没见到哪里有应用到它,所以?……
// 注:dodge 和 parry 有的招式没有而 force, damage 就好象个个有。
// 另外还有一个影响非常大的 query_tmep( "apply/speed" ) 值是与
// combat 相关的,后面再说。
"damage_type": "割伤",
// 伤害类型,一般的剑法都是 “刺伤”和“割伤”
"post_action": (: call_other, "/adm/daemons/weapond.c", "bash_weapon" :),
// 特别的附加效果,可以用 call_other 方式调用其他文件的函数,亦可以
// 直接使用如: "post_action" : (: special_func :),
// 的方式来调用本文件内的函数。该函数将被默认传入4个参数,分别是:
// object me(攻击者), object victim(攻击目标), object weapon(兵器) 和 int damage(伤害力)
// 例子里的函数是有机会把对手的兵器搞断或脱手的。
// 在 combatd.c 的 do_attack() 里,每进行一回进攻,无论被躲闪、被防御
// 或是成功击中,都会在 attack 结束后,调用这个附加的函数一次。
"damage": 15,
// 伤害力,整十有效,这里是 combatd.c 的公式
// damage += action["damage"] /10 * (damage / 30);
// 那这个 15 岂非白痴行为,会误导我的,5555555
// 附:
// ##############################################################
// damage 处理全过程:
// 1, damage = me->query_temp("apply/damage")
// 即临时攻击力。此值一般是武器的攻击力,又或者是 pfm 时被
// 临时增加的攻击力。
//
// 2, damage = (damage + random(damage)) / 2;
// 好,这里有个随机!!!此时最少 damage 需要 2,否则将会
// 得到 0 的结果。
//
// 2-1, damage += (me->query_temp("apply/attack")+1) /10 * (damage /10);
// 这是 NPC 的加成,玩家跳过这一步。
//
// 3, damage += action["damage"] /10 * (damage / 30);
// 注意!!!!!!这里的情况是,如果剑招(即本文件设置的值)
// damage < 10 ,无加成;或者之前两步统计下来的 damage 不足30的话,
// 任你剑招里设置的 damage 比天还高,都是白废,无加成。
//
// 4, damage += (me->query_skill(attack_skill)+1)/10 * (damage /10);
// 好,开始进行 skill level 加成了,以下情况不加成:
// 1 -- skill level 为9或以下时,无加成
// 2 -- 之前的几步统计下来, damage < 10,无加成
//
// 5, damage_bonus = me->query_str();
// 然后,开始计算 "damage_bonus",这个值初始是后天膂力
//
// 6, 如果有 加力,将执行一个 mixed 型的函数,damage_bonus 将
// 会在该函数的返回值中,可能得到加成。这要视各 skill 而定,
// 各 skill 可以 mixed hit_ob() 函数返回一个 int ,或返回
// 一个带有 ["damage"] 的 mapping ,来达到更改 damage_bonus
// 的效果。
// 加成时,若是无兵器的招式,damage_bonus 将直接加入该值,
// 如有兵器,则只加上 1/3 .
//
// 7, 如果招式里定义了 "force" ----- 就是这个文件里的 action["force"] 啦
// 那么来点加成。不过,如果 force<10 ,又或者自己的 query_str() 不足
// 100 的话,毫无用处,我晕。可以看出,这个东西在空手攻击时加成比较大。
// if( !objectp(weapon) )
// damage_bonus += action["force"] /10 * (damage_bonus / 100);
// else damage_bonus += action["force"] /10 * (damage_bonus/300);