找回密码
 注册
搜索
查看: 4524|回复: 18

贴段code 高人来分析下

[复制链接]
门派:不明
发表于 2008-8-15 22:07:17 | 显示全部楼层 |阅读模式
tjj pfm dongjing 的code ,为什么dj 没命中???(相关帖子请看http://www.sjever.net/bbs/viewth ... &extra=page%3D1)


inherit F_SSERVER;
#include <ansi.h>
#include <combat_msg.h>

#define TAIJI                "/kungfu/skill/yinyun-ziqi/taiji"

int is_pfm() { return 1;}
string perform_name(){ return HIR"动静诀"NOR; }

int perform(object me, object target)
{
        if( !target ) target = offensive_target(me);

        if( !target || !target->is_character() || !me->is_fighting(target) || !living(target))
                return notify_fail("「动静诀」只能对战斗中的对手使用。\n");

        if( userp(me)
        &&( me->query_skill_mapped("parry") != "taiji-quan"
        && me->query_skill_mapped("parry") != "taiji-jian") )
                return notify_fail("「动静诀」必须在用太极拳或太极剑激发招架的情况下才能使用。\n");
        if( userp(me) && (me->query_skill_mapped("force") != "yinyun-ziqi"
        || me->query_skill_prepared("cuff") != "taiji-quan") )
                return notify_fail("你的内功或拳法不对,根本不能发挥出「动静诀」的优势。\n");  
        if( !me->query_temp("tj/太极") && me->query_skill("taiji-quan", 1) < 300 )
                return notify_fail("太极拳精要在于动急则急应,动缓则缓随,你没有运用「太极」,又如何能使用「动静诀」?\n");
        if( (int)me->query("neili", 1) < 1000 )
                return notify_fail("你现在真气不够,强行使用「动静诀」是发挥不了它的威力的!\n");                  
        if( me->query_temp("weapon"))
                return notify_fail("你先放下手中的武器再说吧?!\n");     
        if( target->query_condition("no_exert") )
                return notify_fail("( 对方气息不匀,看来是已经不能施用内功了。)\n");
                        
        return (int)call_other( this_object(), "main", me, target);
}

int main(object me, object target)
{
        int damage = 1;
        string msg, force, str;

        if( !target ) target = offensive_target(me);

        if( !target || !target->is_character() || !me->is_fighting(target) || !living(target)
        || me->query("neili") < 300 || me->query("jingli") < 100 || me->query_temp("weapon"))
                return 0;     
               
        if(intp(me->query_temp("tjq/"+target->query("id")) > 3))
                me->add_temp("tjq/"+target->query("id"), -3);
        else me->delete_temp("tjq/"+target->query("id"));
        
        str = (string)me->query("env/六合劲");
        if(str != "钻翻" && str != "螺旋" && str != "软手" && str != "开合" && str != "静恒" && str != "虚灵")
                str = "无";
               
        msg = MAG"\n$N使出太极拳中"RED"「动静诀」"MAG"的功夫,";
        
        if(me->query_skill_mapped("force") != "yinyun-ziqi"
        || me->query_skill("yinyun-ziqi", 1) < 100){
                msg += "突然一下冲到$n面前,要抓住$n!\n"NOR;
                str = "无";
        }        
        
        else msg += "静之则合,无过不及,随曲就伸,让$n搭住自己的双手!\n"NOR;
        
        if(TAIJI->check_force(target) == str || me->query_skill("taiji-quan", 1) > 350)
                damage = 3;
      
        me->start_perform(3, "「动静诀」");
        if(!stringp(force = to_chinese(target->query_skill_mapped("force"))))
                force = "内功";
        
        if(wizardp(me) && (string)me->query("env/combat")=="verbose")
                tell_object(me, "Str = "+str+",Force = "+force+",Damage = "+damage+"\n");
        
        if( random(me->query("combat_exp") * (me->query_str() + me->query_int())/ 100)
        > (int)target->query("combat_exp") * (target->query_str() + target->query_dex()) / 200
        || target->is_busy() ){
                msg += HIY"$p哈哈一笑,就要起手向$P击落!\n"NOR;
                me->start_perform(6, "「动静诀」");
                me->start_busy(3);
                if(!target->is_busy()) target->start_busy(3);
                call_out("hurt",2+random(2),  me, target, damage, str, force);  
        }
        
        else{
                msg += HIY"可$p毕竟感觉不对,马上退后放开了$P的手腕!\n"NOR;
                me->start_busy(1+random(2));
        }

        message_vision(msg, me, target);
        return 1;
}

int hurt(object me, object target, int damage, string str, string force)
{
        object weapon;
        string msg;
        int p;
        
        if( !me || !living(me) || me->is_ghost() || !me->is_fighting()) return 0;
        
        if( !target || !target->is_character() || !me->is_fighting(target) || damage < 1
        || environment(target)!=environment(me) )
                return 0;
        
        msg = MAG"\n太极者,无极而生;动之则分,静之则合!";
        switch(str){
                case "钻翻": msg += "$N双手一翻,反搭住$n,太极拳的"HIW"「"+str+"劲」"MAG"猛然冲开"+force+"使出,将$n一送,甩了出去!\n"NOR;break;
                case "螺旋": msg += "$N反手一旋,抓住$n,"HIW"「"+str+"劲」"MAG"透入$n护身的"+force+"一纽,抓起$p从肩背上甩了出去!\n"NOR;break;
                case "软手": msg += "$N将"HIW"「"+str+"劲」"MAG"一送,震散了$p的"+force+",刚好又在$n要急力挣脱时一抖一放,让$p自己摔了一大交!\n"NOR;break;
                case "开合": msg += "$N双掌一分,带着"HIW"「"+str+"劲」"MAG"当胸撞$n,让$p的"+force+"来不及反应!\n"NOR;break;
                case "静恒": msg += "$N双掌不动,全身"HIW"「"+str+"劲」"MAG"催动,一下子就破掉了$n的"+force+",还将$p震得站立不稳!\n"NOR;break;
                case "虚灵": msg += "$N立如秤准,活如车轮,运起"HIW"「"+str+"劲」"MAG"带动$n的"+force+"一送,让$p马步不稳,全力都打向空处!\n"NOR;break;
                default: msg = MAG"\n$N突然反手拉住$n双掌一送一震,破了$p的内功气劲!\n"NOR;break;
        }   
        
        if (target->query("neili") <= 200){
                message_vision(msg, me, target);
                tell_object(target, "你发觉自己真气已然枯竭耗尽,根本无法相抗了!\n");
                target->receive_damage("qi", (int)target->query("qi")+1, me);
                msg = RED"结果$N措手不及,被自己的劲力震得头昏目眩,摇摇欲坠!\n"NOR;
                msg += damage_msg(target->query("max_qi"), "摔伤") + "( $N"+status_msg(5)+" )\n";
                message_vision(msg, target, target);
                me->start_busy(1);
                return 1;
        }
        
        
        else if(me->query("neili")*3 < target->query("neili"))
        {
                me->start_busy(2+random(3));
                target->start_busy(1+random(2));
               
                msg += HIR"不料$p内力雄厚,经验老到,顺势一冲,从$P身边擦过!!\n"NOR;   
                message_vision(msg, me, target);
                return 1;
        }
        
        p = (int)me->query_skill("force") + random(me->query_skill("force")*2);
        target->receive_damage("qi", p, me);
        target->receive_wound("qi", p/2, me);
        msg += damage_msg(p, "摔伤")+
        "( $n"+eff_status_msg((int)target->query("qi")*100/(int)target->query("max_qi"))+" )\n";
        
        message_vision(msg, me, target);
        
        if(wizardp(me) && (string)me->query("env/combat")=="verbose")
                tell_object(me, "Damage ="+p+"\n");

        if(random(2) == 1 && !wizardp(me)){
                if( !me->is_killing(target->query("id"))
                && !target->is_killing(me->query("id"))
                && !me->query("have_master")   // added by snowman
                && target->query("qi")*2 <= target->query("max_qi"))
                        COMBAT_D->end_fight(me, target);
                return 1;
        }
        
        if(wizardp(me) && (string)me->query("env/combat")=="verbose")
                tell_object(me, "Dongjing done.\n");
               
        force = target->query_skill_mapped("force");
        
        switch(force){
                case "huntian-qigong":
                        if( intp(p = target->query_temp("htqg/powerup")) ){
                                target->add_temp("apply/attack", - p);
                                target->add_temp("apply/dodge", - p);
                                target->delete_temp("htqg/powerup");
                                tell_object(target, HIR"你的混天气功被一下震散,提升的效应也消失了!\n"NOR);
                                break;
                        }
        
                case "yijin-jing":
                        if( intp(p = target->query_temp("fanzhen")) ){
                                p = target->query_temp("fanzhen");
                                target->add_temp("apply/armor", - p);
                                target->delete_temp("fanzhen");
                                target->delete_temp("no_skill_hit_ob");
                                tell_object(target, HIR"你的「金刚不坏体神功」被一下震散,效应也相应地消失了!\n"NOR);
                                break;
                        }
        
                case "linji-zhuang":
                        if( target->query_temp("ljz/riyue") ){
                                target->delete_temp("ljz/riyue");
                                tell_object(target, HIR"你的「日月」庄被一下震散,效应也消失了!\n"NOR);
                                break;
                        }
                        if( intp(p = target->query_temp("ljz/yinyang")) ){
                                target->add("max_qi", - p);
                                target->receive_wound("qi", p, "「阴阳」庄被破,脱力而");
                                target->delete_temp("ljz/yinyang");
                                tell_object(target, HIR"你的「阴阳」庄被一下震散,提升的效应也消失了!\n"NOR);
                                break;
                        }
                        if( intp(p = target->query_temp("ljz/fengyun")) ){
                                target->add_temp("apply/dexerity", - p);        
                                target->delete_temp("ljz/fengyun");
                                tell_object(target, HIR"你的「风云」庄被一下震散,提升的效应也消失了!\n"NOR);
                                break;
                        }
                        if( intp(p = target->query_temp("ljz/wuwo")) ){
                                target->add_temp("apply/armor", -p);
                                target->add_temp("apply/defense", -p);
                                target->add_temp("apply/parry", -p);
                                target->delete_temp("ljz/wuwo");
                                tell_object(target, HIR"你的「无我」心法被一下震散,提升的效应也消失了!\n"NOR);
                                break;
                        }
                case "yinyun-ziqi":
                        if( target->query_temp("tj/太极") ){
                                target->delete_temp("tj/太极");
                                tell_object(target, HIR"你在慌忙之中,太极不能连贯而行,效应也消失了!\n"NOR);
                                break;
                        }
                case "dulong-dafa":
                        if( intp(p = target->query_temp("sld/wudi2") ) ){
                                target->add_temp("apply/attack", - p/2*3);
                                target->add("max_qi",- target->query_temp("sld/wudiqi"));
                                target->delete_temp("sld");
                                if(target->query("eff_qi") > target->query("max_qi"))
                                        target->set("eff_qi",target->query("max_qi"));
                                tell_object(target, HIR"你给这「动静诀」一震,心神一松,再也支持不住了!!\n"NOR);
                                if(random( target->query("qi")) < 100)
                                        target->unconcious();
                                break;
                        }
                        else if( intp(p = target->query_temp("sld/wudi")) ){
                                target->add("max_qi",- target->query_temp("sld/wudiqi"));
                                target->add_temp("apply/attack", -p);
                                target->delete_temp("sld/wudiqi");
                                target->delete_temp("sld/wudi");
                                if(target->query("eff_qi") > target->query("max_qi"))
                                        target->set("eff_qi",target->query("max_qi"));
                                tell_object(target, HIR"你给这「动静诀」一震,心神一松,好象虚脱了一样,突然垮了下来!!\n"NOR);
                                break;
                        }
                case "hanbing-zhenqi":
                        if( objectp(weapon = target->query_temp("weapon"))
                        && weapon->query("jianqi") == target){
                                weapon->create();
                                weapon->set("weapon_prop/damage", weapon->query("old_damage"));
                                weapon->delete("jianqi");
                                tell_object(target, HIR"你给这「动静诀」一震,心神一松,这「嵩山剑气」便使不下去了!\n"NOR);
                                break;
                        }
                case "huagong-dafa":
                        if( intp(p = target->query_temp("hgdf/judu")) ){
                                target->add_temp("apply/armor", -p);           
                                target->delete_temp("hgdf/judu");
                                tell_object(target, HIR"你给这「动静诀」一震,心神一松,所聚毒素全都垮了!!\n"NOR);
                                break;
                        }
                        else if( intp(p = target->query_temp("hgdf/huadu")) ){
                                target->add_temp("apply/attack", -p);
                                target->add_temp("apply/armor_vs_force", -p/2);           
                                target->delete_temp("hgdf/huadu");
                                tell_object(target, HIR"你给这「动静诀」一震,心神一松,化毒所聚毒素全都垮了!!\n"NOR);
                                break;
                        }
                case "yunu-xinjing":
                        if( target->query_temp("xinjing") ){
                                p  = target->query_temp("xinjing/eff");
                                target->add_temp( target->query_temp("xinjing/bonus"), -p/5);
                                target->delete_temp("xinjing");
                                tell_object(target, HIR"你的「心经」字决被神功震散,效应也消失了!\n"NOR);
                                break;
                        }
                case "longxiang-boruo":
                        if ( intp(p = target->query_temp("xs/shield")) ) {
                                target->add_temp("apply/dodge", -p);
                                target->add_temp("apply/armor", -p);
                                target->delete_temp("xs/shield");
                                tell_object(target, HIR"你被「动静诀」一震,脸上红光一闪,骨节啪啪轻响几声,散去了护体真气。\n" NOR);
                                break;
                        }
                case "qiantian-yiyang":
                        if( intp(p = target->query_temp("dali_jing")) ){
                                target->add_temp("apply/intelligence", -p);
                                target->delete_temp("dali_jing");
                                tell_object(target, HIR"你被「动静诀」一震,无法继续潜修了。\n" NOR);
                                break;
                        }
                case "kurong-changong":
                        if( intp(p = target->query_temp("pf_ku")) ){
                                target->delete_temp("pf_ku");
                                target->add_temp("apply/armor", -p);
                                tell_object(target, HIR"你被「动静诀」一震,「枯」字大法立刻消散了!\n" NOR);
                                break;
                        }
                        else if( intp(p = target->query_temp("pf_rong")) ){
                                p = target->query_temp("pf_rong");
                                target->delete_temp("pf_ku");
                                target->add_temp("apply/strike", -p/5);
                                target->add_temp("apply/damage",-p/6);
                                tell_object(target, HIR"你被「动静诀」一震,「荣」字大法立刻消散了!\n" NOR);
                                break;
                        }
                case "bihai-chaosheng":
                        if ( intp(p = target->query_temp("thd/maze")) ){
                                target->add_temp("apply/defense", - (p/5));
                                target->delete_temp("thd/maze");
                                if(weapon = target->query_temp("thd/maze_target") && weapon->query_temp("thd/mazed")){
                                        weapon->delete_temp("thd/mazed");
                                        weapon->add_temp("apply/dexerity", p/10);
                                        weapon->add_temp("apply/dodge", p/10);
                                        weapon->add_temp("apply/damage", p/10);
                                        tell_object(weapon, target->name() + "对你布的迷阵已经被"+me->name()+"的「动静诀」震散了。\n");
                                }
                                tell_object(target, HIR"你被「动静诀」一震,布的迷阵瞬间消散了!\n" NOR);
                                break;
                        }
        }
        
        target->apply_condition("no_exert", me->query_skill("taiji-quan", 1)/20);
        if( !me->is_killing(target->query("id"))
        && !target->is_killing(me->query("id"))
        && !me->query("have_master")   // added by snowman
        && target->query("qi")*2 <= target->query("max_qi"))
                COMBAT_D->end_fight(me, target);
        return 1;
}

int help(object me)
{
        write(WHT"\n太极「动静诀」:"NOR"\n");
        write(@HELP
        太极拳经讲:动之则分,静之则合。无过不及,随曲就伸。立如秤准,活如
        车轮,偏沉则随,双重则滞。动静诀便是一以静制动,以动制静之绝招,吸
        引对手进前,伺机反制,不但能创伤对手,还能有效地破除对方的各类内功。
       
        要求:        内力 1000 以上;      
                精力 200 以上;      
                运用太极拳意且手无兵器。
HELP
        );
        return 1;
}

[ 本帖最后由 ilovemin@zy 于 2008-8-15 22:09 编辑 ]
门派:不明
发表于 2008-8-15 23:35:35 | 显示全部楼层
我不是高手,从这段上面看,if( random(me->query("combat_exp") * (me->query_str() + me->query_int())/ 100)
        > (int)target->query("combat_exp") * (target->query_str() + target->query_dex()) / 200
        || target->is_busy() ){
假如你的经验×((你的臂力加你的悟性)/100)得到值大于对手的经验×((对手的臂力加身法)/200)
那么对方就中招
门派:不明
 楼主| 发表于 2008-8-16 11:56:59 | 显示全部楼层
1、npc exp copy 玩家,所以exp 差距不大
2、query_int() 后天wx,我的先天wx 30 lit full
3、按照master 的说法job npc 的先天属性不超过20(具体的帖子忘了,要去翻一下)

所以不应该出现10+以上连续不中的问题
门派:不明
发表于 2008-8-16 17:09:59 | 显示全部楼层
if( random(me->query("combat_exp") * (me->query_str() + me->query_int())/ 100)
        > (int)target->query("combat_exp") * (target->query_str() + target->query_dex()) / 200
        || target->is_busy() ){
                msg += HIY"$p哈哈一笑,就要起手向$P击落!\n"NOR;
        }

if(aaa > (int)target->query("combat_exp") * (target->query_str() + target->query_dex()) / 200
        || target->is_busy() ){
aaa = random(bbb)
bbb = me->query("combat_exp") * ccc
ccc = (me->query_str() + me->query_int()/ 100
看出错误来了么?
门派:不明
发表于 2008-8-16 17:12:56 | 显示全部楼层
ilovemin@zy 版主不给我加分就过不去了阿。
门派:不明
发表于 2008-8-16 17:39:53 | 显示全部楼层
看来wd要选bl 30 wx 30了
门派:不明
 楼主| 发表于 2008-8-16 17:47:04 | 显示全部楼层
我没看出来有什么问题, 请明示
门派:不明
发表于 2008-8-16 17:54:39 | 显示全部楼层
简单些就是
if( random(exp * (str + int)/ 100) > exp*(str+dex)/200 )
这个概率太小了

[ 本帖最后由 clong@zy 于 2008-8-16 17:56 编辑 ]
门派:不明
 楼主| 发表于 2008-8-16 17:57:13 | 显示全部楼层
不小了, 很多化学pfm 都是这么写的.
门派:不明
发表于 2008-10-13 21:10:10 | 显示全部楼层
str+int>str+dex?

我忘了加(int)是什么效果了,变整形?大概是这个(int)的问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|书剑永恒MUD ( 闽ICP备14012032号|闽公网安备 35050202000162号 )

GMT+8, 2025-5-29 02:32 , Processed in 0.033168 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表