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); }
/// <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; } }