找回密码
 注册
搜索
查看: 2855|回复: 6

教你如何看懂LPC(四)

[复制链接]
门派:不明
发表于 2012-4-24 14:35:16 | 显示全部楼层 |阅读模式
    今天我们来谈谈书剑世界中的武功大招——perform,这个绝对是在玩家关注度能排入前三的东东。由于前阵子论坛里关于嵩山的perform 问题,很是热闹了一番,那么现在我们就来看看嵩山剑法的第一个perform 飞舞的code。

------------------------------------------------------------------------------------------------------------------------------------
// modified by darken@SJ

#include <ansi.h>

inherit F_SSERVER;
int perform(object me, object target)
{
        object weapon;
        int i, focus;
        string str;
        
        focus = me->query_temp("ss/focus");
        if( !target ) target = offensive_target(me);

        if( !objectp(target)
        ||  !target->is_character()
        ||  !me->is_fighting(target)
        || !living(target))
                return notify_fail("飞舞攻击只能对战斗中的对手使用。\n");

        if( (int)me->query_skill("songshan-jian", 1) < 100 )
                return notify_fail("你的嵩山剑法功力太浅,无法使用飞舞攻击。\n");

        if( (int)me->query_skill("sword", 1) < 100 )
                return notify_fail("你的基本剑法功力太浅,无法使用飞舞攻击。\n");

        if( (int)me->query_skill("hanbing-zhenqi", 1) < 100 )
                return notify_fail("你的内功功力太浅,无法使用飞舞攻击。\n");
               
        if( (int)me->query("max_neili") < 1000 )
                return notify_fail("你的内力太浅,无法使用飞舞攻击。\n");

        if( (int)me->query("neili") < 400 )
                return notify_fail("你的真气不足,无法使用飞舞攻击。\n");

        if (me->query_skill_mapped("force") != "hanbing-zhenqi")
                return notify_fail("你用什么为基础来使嵩山剑绝技么?\n");

        if (!objectp(weapon = me->query_temp("weapon")) || weapon->query("skill_type") != "sword"
            || me->query_skill_mapped("sword") != "songshan-jian")
                return notify_fail("你使得了嵩山剑绝技么?\n");

        me->add("neili", -200);
        me->add("jingli", -40);
        me->start_perform(4,"飞舞");
        message_vision(BLU"$N长啸一声,举剑挺刺,在半空中划出道道剑光,空中气劲激荡,阵阵寒气向$n奔袭而去!\n" NOR,me,target);
        me->add_temp("apply/attack", me->query_skill("sword")/5 + 10*focus);
        me->add_temp("apply/damage", me->query_skill("sword")/6);
        COMBAT_D->do_attack(me, target, me->query_temp("weapon"), 1);
        if(me->is_fighting(target)) COMBAT_D->do_attack(me, target, me->query_temp("weapon"), 2);
        if(me->is_fighting(target)) COMBAT_D->do_attack(me, target, me->query_temp("weapon"), 3);        
        if(me->is_fighting(target) && me->query_skill("songshan-jian",1) > 120 && me->query_skill("sword",1) > 120
        && me->query_skill("hanbing-zhenqi",1) > 120) {
             if(stringp(str = me->query_skill_mapped("hand"))
                && me->query_skill_prepared("hand") == str
                && str == "songyang-shou"
                && me->query_skill(str, 1) >= 180) {
                       weapon->unequip();
                        COMBAT_D->do_attack(me, target, me->query_temp("weapon"), 1);
                       weapon->wield();
                } else{
                        COMBAT_D->do_attack(me, target, me->query_temp("weapon"), 2);
                        me->start_busy(1+random(3));
                }
        }
        me->add_temp("apply/attack", -me->query_skill("sword")/5 - 10*focus);
        me->add_temp("apply/damage", -me->query_skill("sword")/6);   
        me->set_temp("ss_feiwu", 1);      
        i = (int)me->query_skill("sword")/30;
        if (i > 8) i = 8;
        if (!me->is_busy()) me->start_busy(1);

        return 1;
}

评分

1

查看全部评分

门派:不明
 楼主| 发表于 2012-4-24 15:06:41 | 显示全部楼层
其实,大家最关心的就是 威力和命中 这两个问题对吧,那其他的乱七八糟的我也就不解释了,重点就讲perform 的威力和命中。

focus = me->query_temp("ss/focus");  —— 这个是什么呢?我先卖个关子,后面会提到

message_vision(BLU"$N长啸一声,举剑挺刺,在半空中划出道道剑光,空中气劲激荡,阵阵寒气向$n奔袭而去!\n" NOR,me,target);  —— 飞舞 开始攻击了

me->add_temp("apply/attack", me->query_skill("sword")/5 + 10*focus); —— 玩家临时增加sword 等级除5 再加上 10乘focus 的攻击 (其实这个就是增加命中)
me->add_temp("apply/damage", me->query_skill("sword")/6); ——玩家临时增加 sword等级除6的伤害

上面两个add_temp 就是为什么perform 要比普通攻击的命中和伤害都高的原因,基本上所有的pfm 都有此类add_temp 的语句。

COMBAT_D->do_attack(me, target, me->query_temp("weapon"), 1); —— COMBAT_D->do_attack()  这个是一个函数调用,该函数的物理位置是在  \adm\daemons\combatd.c 中的一个名为 do_attack 的函数,combatd.c也就是我们俗称的底层。

底层里有大量烦琐的code,以后随着文章的深入我会有选择的给大家介绍,这里大家只要记得 最后的参数为 1 时代表 普通攻击、2 代表 快速攻击、3 代表强力攻击。

那么作为飞舞的第一击,实际是一个普通攻击(当然这个比一般的干捅,威力和命中还是要大的)

if(me->is_fighting(target)) COMBAT_D->do_attack(me, target, me->query_temp("weapon"), 2);
—— 如果在第一击之后,me->is_fighting(target) 的意思就是 perform 的使用者仍然处于战斗状态,那么飞舞出第二击

if(me->is_fighting(target)) COMBAT_D->do_attack(me, target, me->query_temp("weapon"), 3);    —— 这是飞舞的第三击,这是个强力攻击

if(me->is_fighting(target) && me->query_skill("songshan-jian",1) > 120 && me->query_skill("sword",1) > 120
        && me->query_skill("hanbing-zhenqi",1) > 120) {
             if(stringp(str = me->query_skill_mapped("hand"))
                && me->query_skill_prepared("hand") == str
                && str == "songyang-shou"
                && me->query_skill(str, 1) >= 180) {
                       weapon->unequip();
                        COMBAT_D->do_attack(me, target, me->query_temp("weapon"), 1);
                       weapon->wield();
                } else{
                        COMBAT_D->do_attack(me, target, me->query_temp("weapon"), 2);
                        me->start_busy(1+random(3));
                }
如果三击之后,perform 使用者仍然在战斗状态并且他的嵩山剑大于120、基本剑法大于120、寒冰真气大于120,嵩阳手大于180、enable hand songyang-shou、bei songyang-shou,那么

  weapon->unequip();
  COMBAT_D->do_attack(me, target, me->query_temp("weapon"), 1);
  weapon->wield()               会有一招songyang-shou 的 hit

否则只有   COMBAT_D->do_attack(me, target, me->query_temp("weapon"), 2);  嵩山剑的一招快速攻击

me->add_temp("apply/attack", -me->query_skill("sword")/5 - 10*focus);
me->add_temp("apply/damage", -me->query_skill("sword")/6);   
—— 这两句就是将前面临时增加的攻击和伤害都去掉

看到这里大家觉得少了什么? focus! 对,在这个code里并没有focus的定义,那它是怎么来的呢?

     

门派:不明
 楼主| 发表于 2012-4-24 15:07:41 | 显示全部楼层
在 寒冰真气的 yun juhan 中,我们找到了focus

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

int exert(object me)
{
        string msg;
        int lv = me->query_skill("hanbing-zhenqi",1);
        
        if (!me->is_fighting())
            return notify_fail("你只能在战斗中使用聚寒。\n");

        if (lv < 60)
            return notify_fail("以你目前的内功修为尚无法使用「聚寒」。\n");

        if (me->query("qi") < me->query("max_qi")/3)
            return notify_fail("你的气血不足。\n");

        msg = HIW"$N内息流动,周身温度陡然降低,居然结了薄薄一层寒霜!\n"NOR;
        if (!me->query_temp("ss/focus")) {
           call_out("remove_effect", lv/5 + random(10), me);
        }
        me->receive_damage("qi", 200+random(50));
        me->add_temp("ss/focus", random(lv/200)+1);
        message_vision(msg, me);
        me->start_exert(1);
        return 1;
}

void remove_effect(object me)
{
        if (!me) return;
        message_vision(HIW"$N周身的寒气渐渐的散去了。\n"NOR,me);
        me->delete_temp("ss/focus");
}
门派:不明
 楼主| 发表于 2012-4-24 15:12:38 | 显示全部楼层
int lv = me->query_skill("hanbing-zhenqi",1); —— 寒冰真气的等级

msg = HIW"$N内息流动,周身温度陡然降低,居然结了薄薄一层寒霜!\n"NOR; —— 每次yun juhan 后

if (!me->query_temp("ss/focus")) {
           call_out("remove_effect", lv/5 + random(10), me);  系统会在寒冰真气的等级/5加上random(10) 的单位时间内,call_out() 调用 remove_effect() 模块,实际也就是消除yun juhan 效果

me->receive_damage("qi", 200+random(50));   yun juhan 降低自身qi 200+random(50)
me->add_temp("ss/focus", random(lv/200)+1); 增加 "ss/focus"  寒冰真气的等级除200 再加1 的随机数

由此我们可以得出结论,在飞舞之前yun juhan 是会增加飞舞命中的
门派:不明
发表于 2012-4-24 19:31:17 | 显示全部楼层
大神又出现了啊,大神说的是明白了,但是从code上看feiwu威力到底如何呢?
门派:不明
 楼主| 发表于 2012-4-24 20:24:25 | 显示全部楼层
simida@tx 发表于 2012-4-24 19:31
大神又出现了啊,大神说的是明白了,但是从code上看feiwu威力到底如何呢?

威力因为是调用底层的 do_attack(),所以只能和其他skills 比较了,不如你举个你认为强力的pfm,我拿它和feiwu 做个对比
门派:不明
发表于 2012-4-24 21:21:07 | 显示全部楼层
老code没玩过啥门派,对了能对比下hs的lianhuan么,我记得老站的lianhuan很犀利。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-6-29 04:47 , Processed in 0.023795 second(s), 24 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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