notme 发表于 2004-4-28 21:37:09

讨论一下combatd里的damage计算

攻击时的damage主要计算流程(命中以后):

//只有装备武器才有效,否则 apply/damage=0
//不过perform可能设 apply/damage
//玄铁剑 apply/damage = 150 my_str = 70 my_jiali = 100
//按剑法 damage=100,force=300
damage = me->query_temp("apply/damage");
damage = (damage + random(damage)) / 2;
if( action["damage"] )
damage += action["damage"] * damage / 100;
// 此时damage=75~150

damage_bonus = me->query_str();
if( my["jiali"] && (my["neili"] > my["jiali"]) ) {
    if( force_skill = me->query_skill_mapped("force") ) {
      foo = SKILL_D(force_skill)->hit_ob(me, victim, damage_bonus, my["jiali"]);
      // force 里的 hit_ob() 写的好难懂,谁给解释一下?
      if( stringp(foo) ) result += foo;
      else if( intp(foo) ) damage_bonus += foo;
    }
}
// 加力是不是经常不起作用? damage_bonus = 70 不变
// 起作用时 damage_bonus = 170 左右

if( action["force"] )
damage_bonus += action["force"] * damage_bonus / 100;
// damage_bonus = 210

if( martial_skill = me->query_skill_mapped(attack_skill) ) {
    foo = SKILL_D(martial_skill)->hit_ob(me, victim, damage_bonus);
    if( stringp(foo) ) result += foo;
    else if(intp(foo) ) damage_bonus += foo;
}
// 一般skill里没有 hit_ob() 函数,因此damage_bonus 不变

if( damage_bonus > 0 )
    damage += (damage_bonus + random(damage_bonus))/2;
    //damage = 75~150 + 105~210 = 180~360
   
// 经验和挪移,铁布衫等的影响,略去
defense_factor = your["combat_exp"];
while( random(defense_factor) > my["combat_exp"] ) {
    damage -= damage / 3;
    defense_factor /= 2;    // 好象这句是废话,没有任何作用
}

damage = victim->receive_damage("qi", damage, me );

if( random(damage) > (int)victim->query_temp("apply/armor")
      && ( (me->is_killing(victim->query("id")))
      // 只有kill时才会受伤吗???
      && ((!weapon) && !random(4) || weapon && !random(2) )
      || ((!weapon) && !random(7) || weapon && !random(4) ) ))
      //搞这么复杂意义何在???
{
    // We are sure that damage is greater than victim's armor here.
    victim->receive_wound("qi",damage - (int)victim->query_temp("apply/armor"), me);
    wounded = 1;
}

因此带一把剑伤害在 180~360,两把剑为 255~510,空手 105~210

vast 发表于 2004-4-30 16:24:04

Re:讨论一下combatd里的damage计算

一般功夫都没有hit_ob函数
但是如果想做出一个很特别的功夫,就可以考虑自己写一个hit_ob函数,赫赫
受伤的判断比较复杂,我想是作者这样考虑的:
1.叫杀时, 拿了凶器很容易打伤对手,不拿武器打伤对手的几率也比较大,因为这是性命相博;
2.没有叫杀,拿了武器有一定的几率打伤对手,没拿武器几率就比较小,因为这是切磋武功,但是也要考虑到失手伤人,呵呵

另外,经验的高低影响了damage,个人认为不太合理

说到这里,我提一下武功的编写
一般的武功都有 damage,parry,dodge,force这四个参数
对于兵器类功夫,damage很重要
空手功夫的force是主要参数
空手功夫的damage无效,所以要在dodge上做一个补偿,
(parry目前所有功夫都无效,但是可以考虑让其发挥作用)
所以某些功夫这几个参数调节不合理,就显得bt了

icer 发表于 2004-5-2 02:12:36

Re:讨论一下combatd里的damage计算

相当一部分的功夫在编写时根本没有考虑具体的damage,parry,dodge,force参数,因为编写功夫的人可能自己也不了解这些参数的含义。所以一般是找一个相近的(甚至不相近的功夫)来改改名字、描述,最多再凭感觉改一下这些参数。导致这些参数与功夫性质不合,或者过于bt。所以我觉得在平衡功夫中也应该考虑调整这些参数,让平招也真正发挥其应有的作用。

zoom 发表于 2004-5-9 13:19:24

哇莱,好酷哦

讨论很精彩,看到的有些晚了
还有一个问题就是,如果一个不会内功的npc,如果设置才能达到与他同经验,
功夫等级差不多的其他npc的相对水平,似乎内功的影响起的作用非常大

pal 发表于 2004-5-20 17:09:58

Re:讨论一下combatd里的damage计算

有没有apply/force,apply/dodge,apply/damage,apply/attack之类的属性?
我有些忘了:(

vast 发表于 2004-5-20 21:24:59

Re:讨论一下combatd里的damage计算

apply/一般都是武器或者装备来改变的

yaoguai 发表于 2010-3-12 04:45:50

//按剑法 damage=100,force=300
....
by default 兵器武功不应该有action["force"]
理由2个
1.靠武器传递内力的效果显然不如肢体接触
2.兵器武功已经享受了武器的apply_dmg,不应该再享受force的加成
特别是考虑到现在武器动不动apply_dmg>150....

我觉得action["force"]设定的初衷就是为了平衡武器普功和空手普功的
如果给兵器普功action["force"]那就太overpower了


ps:
      if( stringp(foo) ) result += foo;
      else if( intp(foo) ) damage_bonus += foo;
这个是不是应该先判intp再判stringp?
不知道lpc里面intp是不是valid stringp....
页: [1]
查看完整版本: 讨论一下combatd里的damage计算