2007-12-07 | #1 |
黄金会员
注册: 07年11月28日
来自: 川崎
帖子: 447
声望力: 21
声望:
52
积分:19
精华:3
现金:23两梁山币
资产:117026两梁山币
致谢数: 3
获感谢文章数:2
获会员感谢数:2 |
有关攻击的计算(躲避,格挡,伤害)
<combatd.c -- do_attack> >能不能避开攻击,dodge掉 ap:攻击者的skill有效等级+攻击者的"apply/attack"(比如用perform sword时,是"qixiu-jian"的等级) dp:被攻击者的dodge有效等级 mod_val:dp按照dodge_power属性加乘(只有kugu-blade有dodge_power=加乘10%,kugu-blade理所当然的是最好的轻功,再加上yaofa的bianfu+lingfu-steps/2,轻功是wdd最强!) 再按照攻击者既能的破dodge比率,减c ap+dp的随机数<mod_val时,会被dodge避开 >dodge失败后,判断能否被parry掉 当被攻击者拿着武器,计算parry的power pp 攻击者没拿武器时,pp(parry防御)*2,对方有武器时不要空手打!!! 被攻击者没有武器时 通上,只是用unarmed算power pp,所以你就算把parry enable 到特殊拳脚上也是没用的!<-说某些拳脚可以enable到parry上所以好,这好像不科学。。。 **注:如果攻击者拿着武器,者power=0!再次提醒,别空手跟拿着刀的打,在西游记的世界里拳脚没有前途。 当被攻击者busy时,pp/3 攻击者使用技能破parry比率,减pp,算出来的为mod_val random(ap + pp)< mod_val 时算parry掉 >dodge,parry都失败时,计算伤害值 伤害=攻击者的apply/damage,加乘招数的damage 另外与有效体格(score看到的体格)有关 使用特殊拳法时,有拳法force参数的加乘,使用兵器时,所有的特殊武功都没有force加乘 使用冰刀,毒蒺黎有中毒附加效果 **注:如果被攻击者的wx随即值〉攻击者的wx,那么damage*2/3 进行下一次随即判断,wx很重要啊,差得太多就不要打了~ 最后得到damage 气血=气血-damage (damage-防御力)>0时,气血最大值=气血最大值-(damage-防御力) 另外,计算power时,power=既能立方/3+武学,还跟(精神sen/最大精神有关max_sen)有关,上面我给简化了 要注意的是,尽量让(sen/max_sen)=1吧。 >总结: kugu-blade是最好的轻功 不要空手打,拳法太吃亏 空手时,enable parry 到特殊拳法一点用都没有,似乎在拿着武器的时候倒是有用... 精神一定要是满的 wx比对手少的话,很吃亏<-废话。 |
+20 两梁山币
|
2007-12-07 | #2 |
黄金会员
注册: 07年11月28日
来自: 川崎
帖子: 447
声望力: 21
声望:
52
积分:19
精华:3
现金:23两梁山币
资产:117026两梁山币
致谢数: 3
获感谢文章数:2
获会员感谢数:2 |
回复: 有关攻击的计算(躲避,格挡,伤害)
读书笔记 // This function calculates the combined skill/combat_exp power of a certain // skill. This value is used for A/(A+B) probability use. varargs int skill_power(object ob, string skill, int usage) { int status, level, power; if( !living(ob) ) return 0; level = ob->query_skill(skill); //取得技能有效等级 switch(usage) { case SKILL_USAGE_ATTACK: //攻击技能 level = ob->eff_skill_level(level, SKILL_USAGE_ATTACK); //根据char的guild(种族?)属性,给技能加乘,这里好像没用到guild属性 level += ob->query_temp("apply/attack"); //调用do_attack时设定的,如:me->add_temp("apply/attack", me->query_skill("qixiu-jian",1)); //基本技能和特殊技能直接相加,并不像有效等级那样基本技能/2+特殊技能 break; case SKILL_USAGE_DEFENSE: //防御技能 level = ob->eff_skill_level(level, SKILL_USAGE_DEFENSE); level += ob->query_temp("apply/defense"); //除了极个别npc外,没有对这个参数设定 break; } if( !level ) return (int)ob->query("combat_exp") / 2; power = (level*level*level) / 3; if( (status = ob->query("max_sen")) > 0 ) { //技能等级power=power/最大jx*jx 所以精神一定要满,但不一定要很高 if ( power > 100000 ) power = power / status * (int)ob->query("sen"); else power = power * (int)ob->query("sen") / status; } power += ob->query("combat_exp"); return power; } // do_attack() // // Perform an attack action. This function is called by fight() or as an // interface for some special utilize in quests. // varargs int do_attack(object me, object victim, object weapon, int attack_type) { mapping my, your, action, victim_action; string limb, *limbs, result; string attack_skill, force_skill, martial_skill, dodge_skill, parry_skill; mixed foo; int ap, dp, pp; int damage, damage_bonus, defense_factor; int wounded = 0; //int cost; int mod_val; my = me->query_entire_dbase(); your = victim->query_entire_dbase(); // // (1) Find out what action the offenser will take. // action = me->query("actions"); //调用do_attack时设定的,如:me->set("actions", (: call_other, SKILL_D("qixiu-jian"), "query_action" :) ); if( !mapp(action) ) { me->reset_action(); action = me->query("actions"); if( !mapp(action) ) { CHANNEL_D->do_channel( this_object(), "sys", sprintf("%s(%s): bad action = %O", me->name(1), me->query("id"), me->query("actions", 1))); return 0; } } result = "\n" + action["action"] + "!\n"; // // (2) Prepare AP, DP for checking if hit. // if( objectp(weapon) ) { //有武器时,看武器的skill,否则skill=unarmed if( weapon->query("use_apply_skill") ) attack_skill = weapon->query("apply/skill_type"); else attack_skill = weapon->query("skill_type"); } else attack_skill = "unarmed"; limbs = victim->query("limbs"); //随即选择攻击的部位 limb = limbs[random(sizeof(limbs))]; ap = skill_power(me, attack_skill, SKILL_USAGE_ATTACK); //计算攻击power 攻击者 if( ap < 1) ap = 1; dp = skill_power(victim, "dodge", SKILL_USAGE_DEFENSE); //计算防御power 被攻击者 // mon 8/3/98 if(living(victim)) dodge_skill = victim->query_skill_mapped("dodge"); //取得被攻击者的enable dodge else dodge_skill = 0; mod_val = 0; if( dodge_skill ) { victim_action = SKILL_D(dodge_skill)->query_action(); //传回动作,西游记好像没设定dodge的action,最后mod_val=0 if( victim_action && victim_action["dodge_power"] ) //只有kugu-blade有dodge_power,kugu-blade理所当然的是最好的轻功 mod_val = victim_action["dodge_power"]; } if( victim->is_busy() ) dp /= 3; //目标在busy状态下,防御/3 if( dp < 0 ) dp = 0; // mon 8/10/99 if( dodge_skill && action["dodge"] ) //action["dodge"]攻击者使用技能的action的随机一个的dodge mod_val += action["dodge"]; if( dp > 1000000 ) //按照特殊技能的mod_val加乘目标防御dp mod_val = dp / 100 * (100 + mod_val); else mod_val = (100 + mod_val) * dp / 100; if( mod_val < 0 ) mod_val = 0; // // (3) Fight! // Give us a chance of AP/(AP+DP) to "hit" our opponent. Since both // AP and DP are greater than zero, so we always have chance to hit // or be hit. // if( random(ap + dp) < mod_val ) { // Does the victim dodge this hit? if( !dodge_skill ) { //取得dodge动作的msg dodge_skill = "dodge"; result += SKILL_D(dodge_skill)->query_dodge_msg(limb); } else { if( victim_action && victim_action["dodge_action"] ) result += victim_action["dodge_action"]; else result += SKILL_D(dodge_skill)->query_dodge_msg(limb); } if( dp < ap && (!userp(victim) || !userp(me)) // 被打的一方,随即加轻功 && random(sizeof(victim->query_enemy())) < 4 && random(your["sen"]*100/your["max_sen"] + your["int"]*your["cps"]) > 150 ) { your["combat_exp"] += 1; victim->improve_skill("dodge", 1); } // This is for NPC only. NPC have chance to get exp when fail to hit. if( (ap < dp) && !userp(me) ) { //攻击者为npc的时候,攻击〉防御 并且 智商〉15 加基本攻击技能 if( random(my["int"]) > 15 ) my["combat_exp"] += 1; me->improve_skill(attack_skill, random(my["int"])); } damage = RESULT_DODGE; //-1 } else { // // (4) Check if the victim can parry this attack. // if( victim->query_temp("weapon") ) { //当被攻击者拿着武器 pp = skill_power(victim, "parry", SKILL_USAGE_DEFENSE); //计算parry, if( !weapon ) pp *= 2; //攻击者没拿武器时,pp(parry防御)*2,对方有武器时不要空手打!!! parry_skill = victim->query_skill_mapped("parry"); //parry的enable技能 } else { if( weapon ) pp = 0; //攻击者有武器,被攻击者没有武器时,被攻击parry防御=0 else pp = skill_power(victim, "unarmed", SKILL_USAGE_DEFENSE); //否则计算unarmed的防御 parry_skill = victim->query_skill_mapped("unarmed"); //unarmed的enable技能 } if( victim->is_busy() ) pp /= 3; //当被攻击者busy时,pp/3 if( pp < 0 ) pp = 0; mod_val = 0; if( action["parry"] ) mod_val = action["parry"]; //攻击者招数里的action的parry if( pp > 1000000 ) //给pp按照mod_val加乘 mod_val = pp / 100 * (100 + mod_val); else mod_val = (100 + mod_val) * pp / 100; if(mod_val < 0) mod_val = 0; if( random(ap + pp)< mod_val ) { //parry_skill = victim->query_skill_mapped("parry"); if( !parry_skill ) parry_skill = "parry"; //取得parry msg // change to SKILL_D(parry_skill) after added parry msg to those // martial arts that can parry. // because of number of local variable limit, here use // dodge_skill dodge_skill = SKILL_D(parry_skill)->query_parry_msg(weapon); if( dodge_skill ) result += dodge_skill; else result += SKILL_D("parry")->query_parry_msg(weapon); if( pp < ap && (!userp(victim) || !userp(me)) //随即加paary技能 && random(sizeof(victim->query_enemy())) < 4 && random(your["sen"]*100/your["max_sen"] + your["int"]*your["cps"]) > 150 ) { your["combat_exp"] += 1; victim->improve_skill("parry", 1); } damage = RESULT_PARRY; -2 } else { // // (5) We hit the victim and the victim failed to parry // damage = me->query_temp("apply/damage"); //攻击者的apply/damage damage = (damage + random(damage)) / 2; //取damage的随机数 if( action["damage"] ) damage += action["damage"] * damage / 100; //招数的damage加乘 damage_bonus = me->query_str(); //有效体格 // Let force skill take effect. if( my["force_factor"] && (my["force"] > my["force_factor"]) ) { //有enforce,且内力>enforce时 if( force_skill = me->query_skill_mapped("force") ) { //有特殊内功时 foo = SKILL_D(force_skill)->hit_ob(me, victim, damage_bonus, my["force_factor"]); if( stringp(foo) ) result += foo; else if( intp(foo) ) damage_bonus += foo; } } if( action["force"] ) //技能action里有force的时候,加乘damage_bonus(只有拳法有force action) damage_bonus += action["force"] * damage_bonus / 100; if( martial_skill = me->query_skill_mapped(attack_skill) ) { //攻击技能的enable技能 foo = SKILL_D(martial_skill)->hit_ob(me, victim, damage_bonus);//击中的效果msg和伤害,只有baihua-zhang有msg if( stringp(foo) ) result += foo; else if(intp(foo) ) damage_bonus += foo; } // Let weapon or monster have their special damage. if( weapon ) { //攻击者有武器时 foo = weapon->hit_ob(me, victim, damage_bonus); //冰刀,毒蒺黎有附加效果 if( stringp(foo) ) result += foo; else if(intp(foo) ) damage_bonus += foo; } else { foo = me->hit_ob(me, victim, damage_bonus); //没用到 if( stringp(foo) ) result += foo; else if(intp(foo) ) damage_bonus += foo * 3 / 4; } if( damage_bonus > 0 ) //damage_bonus加乘到damage damage += (damage_bonus + random(damage_bonus))/2; if( damage < 0 ) damage = 0; // Let combat exp take effect defense_factor = your["combat_exp"]; while( random(defense_factor) > my["combat_exp"] ) { //如果被攻击者的wx随即值〉攻击者的wx,那么damage*2/3 进行下一次随即判断 damage -= damage / 3; defense_factor /= 2; } // // (6) Inflict the damage. // damage = victim->receive_damage("kee", damage, me ); //减qx if( (me->is_killing(victim) || weapon) //攻击者killing或者有武器 && random(damage) > (int)victim->query_temp("apply/armor") ) { //随即damage〉被攻击者防御时,减少当前气血最大值(damage-防御) // We are sure that damage is greater than victim's armor here. victim->receive_wound("kee", damage - (int)victim->query_temp("apply/armor"), me); wounded = 1; } result += damage_msg(damage, action["damage_type"]); // // (7) Give experience // if( !userp(me) || !userp(victim) ) { //随即奖励技能,潜能(潜能<100时) if( (ap < dp) && (random(my["sen"]*100/my["max_sen"] + my["int"]*my["cps"]) > 150) ) { my["combat_exp"] += 1; if( my["potential"] - my["learned_points"] < 100 ) my["potential"] += 1; me->improve_skill(attack_skill, 1); } if( random(your["max_kee"] + your["kee"]) < damage ) { your["combat_exp"] += 1; if( your["potential"] - your["learned_points"] < 100 ) your["potential"] += 1; } } } } result = replace_string( result, "$l", limb ); //编辑msg if( objectp(weapon) ) result = replace_string( result, "$w", weapon->name() ); else if( stringp(action["weapon"]) ) result = replace_string( result, "$w", action["weapon"] ); if( objectp(victim->query_temp("weapon")) ) result = replace_string( result, "$W", victim->query_temp("weapon")->name() ); if ((damage != RESULT_DODGE) && (damage != RESULT_PARRY) ) message_vision(result, me, victim ); else if ( (string)me->query("env/brief_message") != "YES" && (string)victim->query("env/brief_message") != "YES" ) message_vision(result, me, victim ); if( wizardp(me) && (string)me->query("env/combat")=="verbose" ) { if( damage > 0 ) tell_object(me, sprintf( GRN "AP:%d,DP:%d,PP:%d,Mod:%d,伤害力:%d\n" NOR, ap, dp, pp, mod_val, damage)); else tell_object(me, sprintf( GRN "AP:%d,DP:%d,PP:%d,Mod:%d\n" NOR, ap, dp, pp, mod_val)); } if( wizardp(victim) && (string)victim->query("env/combat")=="verbose" ) { if( damage > 0 ) tell_object(victim, sprintf( GRN "AP:%d,DP:%d,PP:%d,Mod:%d,伤害力:%d\n" NOR, ap/100, dp/100, pp/100, mod_val/100, damage)); else tell_object(victim, sprintf( GRN "AP:%d,DP:%d,PP:%d,Mod:%d\n" NOR, ap/100, dp/100, pp/100, mod_val/100)); } if( damage > 0 ) { report_status(victim, wounded); if( victim->is_busy() ) victim->interrupt_me(me); if( (!me->is_killing(your["id"])) && (!victim->is_killing(my["id"])) ) { // fight until one side's kee is < 50% if( victim->query("kee") < victim->query("max_kee") * 50 / 100) { me->remove_enemy(victim); victim->remove_enemy(me); message_vision( winner_msg[random(sizeof(winner_msg))], me, victim); } } } if( functionp(action["post_action"]) ) evaluate( action["post_action"], me, victim, weapon, damage); if( damage > 0 && attack_type != TYPE_QUICK && //攻击成功,且不是追加攻击 me->query_temp("perf_quick") && me->is_fighting(victim) ) { //perf_quick,战斗中 但是perf_quick没被设定 if( me->query_temp("weapon") && me->query_temp("perf_quick/"+me->query_temp("weapon")->query("skill_type")) ) { if( me->query_temp("perf_quick/msg") ) message_vision(CYN + me->query_temp("perf_quick/msg") +NOR, me, victim); else message_vision(CYN + "$N得势不饶人,对$n展开连续攻击。"+NOR, me, victim); do_attack(me, victim, me->query_temp("weapon"), TYPE_QUICK); return 1; } } // See if the victim can make a riposte. if( attack_type==TYPE_REGULAR //没击中时被反击 && damage < 1 && victim->query_temp("guarding") ) { victim->set_temp("guarding", 0); if( random(my["cps"]) < 5 ) { message_vision("$N一击不中,露出了破绽!\n", me); do_attack(victim, me, victim->query_temp("weapon"), TYPE_QUICK); } else { message_vision("$N见$n攻击失误,趁机发动攻击!\n", victim, me); do_attack(victim, me, victim->query_temp("weapon"), TYPE_RIPOSTE); } } } |
|
2007-12-07 | #3 |
黄金会员
注册: 07年11月28日
来自: 川崎
帖子: 447
声望力: 21
声望:
52
积分:19
精华:3
现金:23两梁山币
资产:117026两梁山币
致谢数: 3
获感谢文章数:2
获会员感谢数:2 |
回复: 有关攻击的计算(躲避,格挡,伤害)
使用地府的 delay=random(2)+1 perform lunhui时 "apply/damage"=原来的damage*delay+加力值 <-应该比perform qiankun的200damage高吧? "apply/attack"=query_skill("hellfire-whip") *delay delay是蓄力的招式数,delay最多=2,delay越大,攻击越强,命中越高。 即使delay=1时,意义也是巨大的 :) 别的perform基本没有"apply/attack" 并且烈火鞭的技能damage是所有技能中最高的。 所以lunhui攻击超高!命中率也超高! 使用lunhui以后自己busy 2招,busy对方1招 而且,如果能先busy住对手,有能大大的增加命中率 对方的dodge,parry都变成1/3 lunhui+p6对方应该是挂掉了<-我想... 突然觉得一直呆在hell,也是很有前途的!hahaha~ 其他的,dragonforce,tonsillit的powerup时,"apply/attack"=技能等级 /5;但是有上限,最高为50 hell的用完powerup以后再用perform lunhui,"apply/attack"不想加,即powerup对lunhui没有影响。 |
|
2007-12-07 | #4 |
黄金会员
注册: 07年11月28日
来自: 川崎
帖子: 447
声望力: 21
声望:
52
积分:19
精华:3
现金:23两梁山币
资产:117026两梁山币
致谢数: 3
获感谢文章数:2
获会员感谢数:2 |
回复: 有关攻击的计算(躲避,格挡,伤害)
>并且烈火鞭的技能damage是所有技能中最高的。 这个不对,刚才一不小心,技能damage看的是西游记2006的... 另外,perform three时,用任意一种功夫都可以,而且效果差不多,攻击只与使用的武功有关 另外两个>50就可以,不影响攻击 命中与攻击,用不同技能使出,前两招完全一样 最后一招,用zhuihun-sword的话,damage是35,比其他两个多5<-忽略吧 还有就是perform three,后面的招数比前面的命中率高,应为破dodge,parry的比率高 |
|
2007-12-08 | #5 |
初级会员
注册: 06年06月15日
帖子: 48
声望力: 0
声望:
32
积分:7
精华:1
现金:123两梁山币
资产:123两梁山币
致谢数: 0
获感谢文章数:0
获会员感谢数:0 |
回复: 有关攻击的计算(躲避,格挡,伤害)
其实单纯的硬砍,如果skill学到武学上限的话武学对攻击,防御的贡献 所占比重就很小了。实战中技能高的一方往往合适,哪怕武学低一些。 当然破绽除外。 |
|
2007-12-12 | #6 |
黄金会员
注册: 05年01月27日
来自: +1 GMT
帖子: 569
声望力: 25
声望:
72
积分:24
精华:5
现金:52两梁山币
资产:1002两梁山币
致谢数: 0
获感谢文章数:1
获会员感谢数:1 |
回复: 有关攻击的计算(躲避,格挡,伤害)
有道理,three杀妖怪的时候通常只有后边一招能打中,前两招比较土
|
燕燕轻盈, 别后书辞, 莺莺娇软, 别时针线, 分明又向华胥见。 离魂暗逐郎行远 夜长争得薄情知, 淮南皓月冷千山, 春初早被相思染。 冥冥归去无人管。 |
|
|
2007-12-12 | #7 |
正式会员
注册: 07年11月29日
帖子: 4
声望力: 0
声望:
10
现金:8两梁山币
资产:8两梁山币
致谢数: 0
获感谢文章数:0
获会员感谢数:0 |
回复: 有关攻击的计算(躲避,格挡,伤害)
这么说whip,bang,sword我只要bang级别高,其它两个>50就行了,不影响攻击效果?
|
|
2007-12-12 | #8 |
黄金会员
注册: 07年11月28日
来自: 川崎
帖子: 447
声望力: 21
声望:
52
积分:19
精华:3
现金:23两梁山币
资产:117026两梁山币
致谢数: 3
获感谢文章数:2
获会员感谢数:2 |
回复: 有关攻击的计算(躲避,格挡,伤害)
不影响 不过lijing灭妖喜欢奖励等级低的技能<-这个没研究过~ |
|
2007-12-13 | #9 |
初级会员
注册: 06年06月15日
帖子: 48
声望力: 0
声望:
32
积分:7
精华:1
现金:123两梁山币
资产:123两梁山币
致谢数: 0
获感谢文章数:0
获会员感谢数:0 |
回复: 有关攻击的计算(躲避,格挡,伤害)
李靖灭妖奖励哪个技能是分两步决定的。第一步是先决定“可能”奖励什么 技能,这一步所有技能被选中的概率均等。第二步再决定奖励不奖励这个 被选中的技能。这一步技能越高奖励概率越低。 所以,你把低的技能提高并不能增加其它技能的奖励概率。说得通俗点, 就是你把hellfire-whip,kusang-bang练到最高也不能增加奖励special force, special spells的概率。 |
|
添加到书签 |
|
|
相似的主题 | ||||
主题 | 主题作者 | 论坛 | 回复 | 最后发表 |
地府 请问perform three的命中和伤害和基本技能等级有关吗? | swordpin | 『 梁山论剑 』 | 4 | 2012-02-01 09:08 |
【转帖】和别人吃饭如何躲避买单 | ultima | 『 聊天灌水区 』 | 0 | 2005-02-22 12:04 |