예제 #1
0
        // TODO: 吸血技能.
        // 吸取敌人攻击力,转换其中一部分变成自己的攻击力
        // /num 吸取敌人血的百分比
        // /type 0:固定值 1:比例
        // /convert 吸取血之后加到自己身上的百分比
        // /angryCost 怒气
        // /selfInc 0:convert吸取血之后加到自己身上的百分比 1:自身攻击力增加convert
        private void castSuckSkill(float num, int type, float convert, int angryCost = 0, int selfInc = 0)
        {
            BT_Logical     war      = owner._war;
            BT_Monster     enemy    = war.enemy(owner);
            BT_MonsterTeam selfTeam = owner.ownerTeam;

            if (selfTeam.curAngry >= angryCost)
            {
                if (enemy.alive)
                {
                    float suck = num;
                    if (type == 1)
                    {
                        suck = num * Consts.oneHundred * enemy.curAtt;
                    }

                    if (suck > enemy.curAtt)
                    {
                        suck = enemy.curAtt;
                    }

                    if (angryCost > 0)   // 扣怒气...
                    {
                        selfTeam.costAngry(angryCost);
                    }

                    CMsgSkillSuckAttack msg = new CMsgSkillSuckAttack(this, enemy.pveId, MathHelper.MidpointRounding(suck));
                    war.addMsgToRecorder(msg);

                    // 减敌方血,加给自己.
                    BT_Hurt hurt = new BT_Hurt()
                    {
                        damageVal = suck,
                        hurtType  = BT_Hurt_Type.HURT_SKILL,
                    };

                    int   finalSuck = enemy.sufferAttack(hurt, owner);
                    float addAtt    = 0f;
                    if (selfInc == 0)
                    {
                        addAtt = convert * Consts.oneHundred * finalSuck;
                    }
                    else
                    {
                        addAtt = convert * Consts.oneHundred * owner.curAtt;
                    }

                    owner.curAttAdd(addAtt);
                    msg.convertAttack = MathHelper.MidpointRounding(addAtt);
                    msg.finalSuckAtt  = finalSuck;
                    msg.sufferCurAtt  = enemy.curAtt;
                    msg.casterCurAtt  = owner.curAtt;
                    msg.curAngry      = selfTeam.curAngry;
                }
            }
        }
예제 #2
0
        // TODO: 直接攻击型技能
        // 对对方造成damage的伤害...
        private CMsgSkillAttack makeAttackMsg(BT_Monster enemy, float damage)
        {
            BT_Hurt hurt = new BT_Hurt()
            {
                damageVal = damage,
                hurtType  = BT_Hurt_Type.HURT_SKILL,
            };

            CMsgSkillAttack msg         = new CMsgSkillAttack(this, enemy.pveId, MathHelper.MidpointRounding(damage));
            int             finalDamage = enemy.sufferAttack(hurt, owner);

            msg.finalAtt = finalDamage;
            msg.curAtt   = enemy.curAtt;
            msg.curAngry = enemy.ownerTeam.curAngry;
            return(msg);
        }
예제 #3
0
        //受到普通伤害.
        public void sufferNormalAttack(int att, BT_Monster enemy, bool beReBound = false)
        {
            CMsgNormalAttack msg = new CMsgNormalAttack(_pveIndex, att, beReBound ? CMsgHeader.STATUS_REBOUND_ATT : CMsgHeader.STATUS_ATTACK);

            _war.addMsgToRecorder(msg);

            BT_Hurt hurt = new BT_Hurt()
            {
                hurtType  = BT_Hurt_Type.HURT_COMMON,
                damageVal = att
            };

            int finalDamage = sufferAttack(hurt, enemy);

            msg.finalAtt = finalDamage;
            msg.curAtt   = curAtt;
        }
예제 #4
0
        //返回实现伤害值
        public int sufferAttack(BT_Hurt damage, BT_Monster enemy)
        {
            int finalDamage = MathHelper.MidpointRounding(damage.damageVal);

            //技能来的攻击
            if ((damage.hurtType == BT_Hurt_Type.HURT_SKILL || damage.hurtType == BT_Hurt_Type.HURT_ANGRY_SKILL) && canSufferSkillDamage() == false)
            {
                finalDamage = 0;
            }

            #region 各种buff or defbuff处理...

            //伤害全部防御技能
            short           bufDebuffType = CMsgHeader.BUFF_DEBUFF_GOLDDEFENSE;
            BT_BuffOrDebuff goldShieldBuf = getBuffOrDebuff(bufDebuffType);
            if (goldShieldBuf != null && --goldShieldBuf.round >= 0)
            {
                finalDamage = 0;

                CMsgSkillBuffDebuffEffect msg = new CMsgSkillBuffDebuffEffect(this, goldShieldBuf);
                _war.addMsgToRecorder(msg);

                _buffArr[bufDebuffType] = goldShieldBuf;
            }

            //伤害加深
            bufDebuffType = CMsgHeader.BUFF_DEBUFF_HURTUP;
            BT_BuffOrDebuff hurtUpDebuff = getBuffOrDebuff(bufDebuffType, false);
            if (hurtUpDebuff != null && --hurtUpDebuff.round >= 0)
            {
                int rDamage = MathHelper.MidpointRounding(damage.damageVal * (1 + hurtUpDebuff.rate * Consts.oneHundred));

                CMsgSkillBuffDebuffEffect msg = new CMsgSkillBuffDebuffEffect(this, hurtUpDebuff);
                msg.arg1 = MathHelper.MidpointRounding(damage.damageVal);
                msg.arg2 = rDamage;
                _war.addMsgToRecorder(msg);
                _debuffArr[bufDebuffType] = hurtUpDebuff;

                finalDamage = rDamage;
            }

            //反弹部分伤害到敌人...
            bufDebuffType = CMsgHeader.BUFF_DEBUFF_REBOUND;
            BT_BuffOrDebuff reboundBuff = getBuffOrDebuff(bufDebuffType);
            if (reboundBuff != null && --reboundBuff.round >= 0 && enemy.alive)
            {
                float rebound = damage.damageVal * reboundBuff.rate * Consts.oneHundred;
                damage.damageVal -= rebound;

                enemy.sufferNormalAttack(MathHelper.MidpointRounding(rebound), this, true);
                _buffArr[bufDebuffType] = reboundBuff;

                finalDamage = MathHelper.MidpointRounding(damage.damageVal);
            }

            //护盾技能...
            bufDebuffType = CMsgHeader.BUFF_DEBUFF_DEFENSE;
            BT_BuffOrDebuff shieldBuff = getBuffOrDebuff(bufDebuffType);
            if (shieldBuff != null && shieldBuff.suckDmg > 0)
            {
                int beforeShield = shieldBuff.suckDmg;
                if (beforeShield > damage.damageVal)
                {
                    shieldBuff.suckDmg -= MathHelper.MidpointRounding(damage.damageVal);
                    finalDamage         = 0;
                }
                else
                {
                    damage.damageVal  -= beforeShield;
                    shieldBuff.suckDmg = 0;
                    finalDamage        = MathHelper.MidpointRounding(damage.damageVal);
                }

                CMsgSkillBuffDebuffEffect msg = new CMsgSkillBuffDebuffEffect(this, shieldBuff);
                msg.arg1 = beforeShield;
                msg.arg2 = shieldBuff.suckDmg;
                _war.addMsgToRecorder(msg);

                _buffArr[bufDebuffType] = shieldBuff;
            }

            #endregion

            setCurAtt(_curAtt - finalDamage);

            return(finalDamage);
        }