Esempio n. 1
0
        public bool ActiveOnce()
        {
            //释放技能音效
            //AudioControler.Inst.PlaySound(m_pSpellInfo.GetSpellRow().getAttackSound());

            List <SPELL_EVENT> pList = m_pHolder.GetSpellEventQueue().GetEventList(SPELL_EVENT_ID.SPELL_EVENT_ID_USESPELL);

            LogManager.LogAssert(pList);
            foreach (var item in pList)
            {
                Impact pImpact = item.m_pImpact;
                if (pImpact != null)
                {
                    pImpact.OnSpellUse(m_pSpellInfo, m_SpellTarget);
                }
            }

            LogManager.LogAssert(m_pHolder);
            LogManager.LogAssert(m_pSpellInfo);
            int  m_Hitcount = 0;//命中个数
            bool bRet       = false;

            //目标逻辑
            //FIGHTOBJECT_LIST targetlist = new FIGHTOBJECT_LIST();
            __CalculateSpellTarget(ref m_TargetList);
            AddLinkEff();
            if (m_TargetList.m_nCount > 0)
            {
                SkillTemplate pSpellRow = m_pSpellInfo.GetSpellRow();
                LogManager.LogAssert(pSpellRow);
                // 将该技能的效果作用于目标身上
                ObjectCreature pScanObject = null;
                //产生impact
                for (int TargetIndex = 0; TargetIndex < m_TargetList.m_nCount; TargetIndex++)
                {
                    pScanObject = m_TargetList.m_pObjectList[TargetIndex].m_pTargetObject;
                    //目标临时buff
                    __ImpactEffectOnSpellStartToTarget(pScanObject);

                    //根据圆桌算法 返回行为结果:暴击,闪避,普通攻击 [10/16/2015 Zmy]
                    EM_SPELL_RESULT nResult = EM_SPELL_RESULT.EM_SPELL_RESULT_FAIL;
                    OnRoundTableOperation(pScanObject, ref nResult);
                    //计算命中并且未命中
                    if (/*__HitLogic(pScanObject)*/ nResult == EM_SPELL_RESULT.EM_SPELL_RESULT_MISS)
                    {
                        pScanObject.OnDodge(m_pHolder, m_pSpellInfo);
                        m_TargetList.OnUpdateTargetHit(pScanObject);
                        //发送消息
                        continue;
                    }

                    //命中可以震动
                    m_Hitcount++;

                    //每命中一个单位 奖励怒气
                    //if (FightControler.Inst != null)
                    //    FightControler.Inst.OnUpdatePowerValue(m_pHolder.GetGroupType(), m_pSpellInfo.GetSpellRow().getInitHitFury());


                    //bool bCritical = __CriticalAttack(pScanObject);
                    bool bCritical = nResult == EM_SPELL_RESULT.EM_SPELL_RESULT_CRITICAL ? true : false;
                    //爆击逻辑
                    m_pHolder.OnCritical(pScanObject, m_pSpellInfo, bCritical);
                    //被爆击逻辑
                    pScanObject.OnBeCritical(m_pHolder, m_pSpellInfo, bCritical);
                    //逻辑
                    bRet = __DoSpellLogic(pSpellRow.getSkillLogicID(), pScanObject, bCritical);
                    LogManager.LogAssert(bRet);

                    for (int m = 0; m < pSpellRow.getBuffList().Length; ++m)
                    {
                        if (pSpellRow.getBuffList()[m] != -1)
                        {
                            EM_IMPACT_RESULT bImpactRet = pScanObject.AddImpact(pSpellRow.getBuffList()[m], m_pHolder, bCritical, GetSpellID());
                            if (bImpactRet == EM_IMPACT_RESULT.EM_IMPACT_RESULT_NORMAL)
                            {
                                m_TargetList.OnUpdateTargetImpact(pScanObject, pSpellRow.getBuffList()[m]);
                            }
                        }
                    }
                }
                //命中结算
                __SpellOverLogic(m_Hitcount);
            }
            //技能结尾部分,缓存所产生的战斗信息 [3/23/2015 Zmy]
            OnCacheSepllInfo();
            return(true);
        }
Esempio n. 2
0
        /// <summary>
        /// 技能行为圆桌算法
        /// </summary>
        /// <param name="pTarget">技能目标</param>
        /// <param name="nResult">返回结果</param>
        private void OnRoundTableOperation(ObjectCreature pTarget, ref EM_SPELL_RESULT nResult)
        {
            int nAttackAttributeCritical = m_pHolder.GetBaseCritical() + m_pHolder.GetDevelopAttributeSub((int)EM_EXTEND_ATTRIBUTE.EM_EXTEND_ATTRIBUTE_PERMIL_CRITICALRATE); //攻击者暴击率 [10/15/2015 Zmy]
            int nTargetAttributeTenacity = pTarget.GetBaseTenacity() + pTarget.GetDevelopAttributeSub((int)EM_EXTEND_ATTRIBUTE.EM_EXTEND_ATTRIBUTE_PERMIL_TENACITYRATE);     //目标韧性率 [10/15/2015 Zmy]

            int nAttributeCritical = Math.Min((int)DataTemplate.GetInstance().m_GameConfig.getMax_crit_limit(), nAttackAttributeCritical - nTargetAttributeTenacity);        //属性暴击率

            // 最终暴击率 = 攻击者属性暴击率+攻击者(技能附带)暴击率+攻击者暴击率buff-目标韧性率buff [10/15/2015 Zmy]
            int nFinalCritical = nAttributeCritical +
                                 m_pSpellInfo.GetSpellRow().getSkillCrit() +
                                 m_pHolder.GetSpellAttibute((int)EM_EXTEND_ATTRIBUTE.EM_EXTEND_ATTRIBUTE_PERMIL_CRITICALRATE) - pTarget.GetSpellAttibute((int)EM_EXTEND_ATTRIBUTE.EM_EXTEND_ATTRIBUTE_PERMIL_TENACITYRATE);

            //修正最终暴击率
            if (nFinalCritical <= 0)
            {
                nFinalCritical = 0;
            }
            else
            {
                nFinalCritical *= 10;
            }

            if (nFinalCritical >= 10000) //暴击达到上限,直接得出结果 [10/16/2015 Zmy]
            {
                nResult = EM_SPELL_RESULT.EM_SPELL_RESULT_CRITICAL;
                return;
            }

            int nAttackAttriHit   = m_pHolder.GetBaseHit() + m_pHolder.GetDevelopAttributeSub((int)EM_EXTEND_ATTRIBUTE.EM_EXTEND_ATTRIBUTE_PERMIL_HITRATE); //攻击者命中率 [10/15/2015 Zmy]
            int nTargetAttriDodge = pTarget.GetBaseDodge() + pTarget.GetDevelopAttributeSub((int)EM_EXTEND_ATTRIBUTE.EM_EXTEND_ATTRIBUTE_PERMIL_DODGERATE); //目标闪避率 [10/15/2015 Zmy]

            int nAttributeDodge = Math.Min((int)DataTemplate.GetInstance().m_GameConfig.getMax_hiding_limit(), nTargetAttriDodge - nAttackAttriHit);        //目标属性闪避率

            // 目标最终闪避率=目标属性闪避率-攻击方(技能附带)命中率+目标闪避率buff-攻击方命中率buff+固定未命中几率 [10/15/2015 Zmy]
            int nFinalDodge = nAttributeDodge -
                              m_pSpellInfo.GetSpellRow().getSkillHit() +
                              pTarget.GetSpellAttibute((int)EM_EXTEND_ATTRIBUTE.EM_EXTEND_ATTRIBUTE_PERMIL_DODGERATE) - m_pHolder.GetSpellAttibute((int)EM_EXTEND_ATTRIBUTE.EM_EXTEND_ATTRIBUTE_PERMIL_HITRATE) +
                              (int)DataTemplate.GetInstance().m_GameConfig.getFix_nothit_value();

            if (nFinalDodge <= 0)
            {
                nFinalDodge = 0;
            }
            else
            {
                nFinalDodge = (nFinalDodge * 10) > (10000 - nFinalCritical) ? (10000 - nFinalCritical) : (nFinalDodge * 10); //修正剩余闪避概率区间 [10/16/2015 Zmy]
            }


            //生成随机种子 [10/15/2015 Zmy]
            int iRnd = System.DateTime.Now.Millisecond;

            System.Random randomCoor = new System.Random(iRnd);
            int           nRand      = randomCoor.Next(1, 10000);

            if (nRand > 0 && nRand <= nFinalCritical)//暴击区间
            {
                nResult = EM_SPELL_RESULT.EM_SPELL_RESULT_CRITICAL;
            }
            else if (nRand <= nFinalDodge + nFinalCritical)//闪避区间
            {
                nResult = EM_SPELL_RESULT.EM_SPELL_RESULT_MISS;
            }
            else//普通命中
            {
                nResult = EM_SPELL_RESULT.EM_SPELL_RESULT_NORMAL;
            }
        }