2011-12-03 | #1 |
高级会员
注册: 08年04月11日
来自: 盘丝洞
帖子: 311
声望力: 20
声望:
50
现金:29两梁山币
资产:1245两梁山币
致谢数: 0
获感谢文章数:0
获会员感谢数:0 |
一个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); // // 8, 接下来进行 skill level 额外加成, // if (!objectp(weapon)) // damage_bonus += (me->query_skill(attack_skill)/4 // + me->query_skill("force")/2+1)/10* (damage_bonus /10); // else damage_bonus += (me->query_skill(attack_skill)/4+1) /10* (damage_bonus /10); // 意思是,空手攻击时,加成为: // ("攻击skill的等级" 的 1/4) + (内功等级的约 1/20 * damage_bonus 的 1/10) // 那么说,一个 100 lv 的 skill, 内功即使为 0, 这里也可以得到 25 点的加成 // 但是如果是兵器类的 skill, 就只能得到几点的加成,如 100 lv sks, 甚至可能得到 // 两三点的加成而已,反差巨大。 // // 9, 接下来看兵器里有没有特殊的加成。将调用兵器文件中的 hit_ob() // 函数,该函数若返回一个 int, 则直接加入这个值到 damage_bonus 中。 // // 10, 接着看看 加劲 的加成。简易公式如下: // foo = my["jingli"]/20 + my["jiajin"] - your["jingli"]/25; // 当 foo > 0 时,直接加入 damage_bonus 中。 // 例如我的精力 1000,对手精力2000,那么就是: // 50 + 最大加劲二十分之一即50 - 对手的精力/25即80 == 20 点 // // 11, 如果攻击模式是 "快速攻击",攻击力减半 // // 12, 将 damage 与 damage_bonus 组合起来。这时将进行一个 // 计算,最多时可以得到全部的 damage_bonus ,最少时可以得到 // 一半的 damage_bonus. // 而如果 damage_bonus 的值为负的话,同理, damage 减去同样 // 随机范围的 damage_bonus 值。 // // 此时进行一个强制判断,以保证组合后的 damage 值最小为 0。 // // 13, 进行一个循环!以彼此的 combat_exp 作判断: // 取一个 random(攻击者的exp), 如果比 被攻击者的 exp 大, // 那么 damage 削减为原来的三分之二(2/3),并将作判断的 "攻击 // 者的exp" 值降半,重新循环 // // 14, 这里是一个呕吐级的判断,如果被攻击者身穿特别的防具(该防具文件 // 内以mixed is_special() 函数返回任意非零值即可),那么,调用其 // 文件的 mixed hit_ob() 函数,若此函数返回 int 或 mapping 型 // 的值,damage 将直接赋予该值(int or mapping["damage"])。 // 此时,前面所做一切均告作废,yeah,真是高章,高,实在是高 // // 15, 此时再作一个判断,如果被攻击者身备(jifa)特别的轻功(该轻功 // 文件内以 mixed is_special() 函数返回任意非零值即可),那么, // 原理同 14 ,也是让前面所做一切均告无效的一个步骤, yeah // // // 到了这时,终于得到 damage 的最终值了!但是很郁闷的是, // 它不作是否非0的判断,就直接对对手进行伤害,系统偶尔会 // 报出 “攻击力为负”的 bug, 大概是 special armor 或 // special dodge 造成的吧。 // // 接下来就暂时不关 damage 的事喽。 // ############################################################## ]), // 以上是一个 skill 招式的基本资料。 // 还有另一个特别的设置 "weapon", 该设置直接影响: // 在攻击时,如果被防御(并非“被闪躲”和“命中”)时, // 若招式里有这个值,对方防御成功的几率减半。 // 这个值好象未在其他地方有应用,而有的 skill file 里曾见到 // 招式里设置了例如 "weapon": "剑芒", 等,不知道是否有特别的含义。 // 再附: combatd.c 进行攻击流程时,有几个设在 object me 身上的值 // 是相当的有影响的,它们分别是: // me->query_temp("apply/speed") ---- 与攻击频率成正比,但亦与被快速反击的几率成正比 // me->query_temp("apply/damage") ---- 直接影响攻击的强度 // me->query_temp("apply/armor") ---- 直接影响受打击的程度 // me->query_temp("apply/dodge") ---- ?...... // 这几个值, combatd.c 都不会去改变它们,所以要体现其他的一些效果, // 必须另行设置;并且,需要非常小心避免出现无限累积的 BUG ! 其实 skill 还可以写得更精彩,而不仅仅是 damage 和描述的变化而已。配合上 "dodge", 配合 上 query_parry_msg(), 配合上 hit_ob(), 配合上 "post_action", ……真的是每一招都可以有不同的变化, 根据描述所决定的效果之多,唉。只有想不到的,没有写不成的…… 可是很多,很多,很多的 skill 中,特别的只是 pfm; 或者进一步,在 query_action() 里有一些变化(配合 pfm 或特别的 武器使用该skill);或者再进一步,在 hit_ob()里体现一些特别的效果——但是,有哪个 skill ,能在每一招每一式之间,都有着不同的 效果么? 例如我出了一招“腾空而起”的招式,那么除了这一招应该攻击力大一些之外,而很多wiz没有理会的是,在这之后的一定时间里,攻击频率就该低一些?这一招失败时被反击的几率是否就该大一些?被反击命中时,受到的损害是否就该大一些?…… 噢…… |
|