VOID ImpactLogic_T::ContinuanceCalc(OWN_IMPACT& rImp, Obj_Character& rMe, INT nDeltaTime) const { __ENTER_FUNCTION //取得总持续时间 INT const nContinuance = rImp.GetContinuance(); //取得逝去的持续时间 INT nContinuanceElapsed = rImp.GetContinuanceElapsed(); //如果不是消散状态 if(FALSE == rImp.IsFadeOut()) { //如果是持续性效果 if(TRUE == IsOverTimed()) { if(-1==nContinuance) { return; //-1为持续时间无限长 } if(nContinuanceElapsed<=nContinuance) { nContinuanceElapsed += nDeltaTime; } //如果超时,则消散 if(nContinuanceElapsed>nContinuance) { // prepare delete this impact rMe.Impact_OnImpactFadeOut(rImp); } //更新逝去时间 rImp.SetContinuanceElapsed(nContinuanceElapsed); } } __LEAVE_FUNCTION }
BOOL ImpactCore_T::SendImpactToUnit(Obj_Character& rTar, ID_t nDataIndex, ObjID_t nSender, Time_t nDelayTime, BOOL bCriticalFlag, INT nRefixRate, INT nReserveParam1, INT nReserveParam2) const { __ENTER_FUNCTION OWN_IMPACT impact; if(INVALID_ID == nDataIndex) { return FALSE; } //根据nDataIndex对应的效果逻辑初始化rImp if(TRUE == InitImpactFromData(nDataIndex, impact, rTar, nReserveParam1)) { //获得逻辑对象 ImpactLogic_T const* pLogic = Impact_GetLogic(impact); if(NULL==pLogic) { Assert(NULL=="[ImpactCore_T::SendImpactToUnit]: Can't find sprcific logic for this impact."); return FALSE; } //设置会心标记 if(TRUE == bCriticalFlag) { impact.MarkCriticalFlag(); } if(0!=nRefixRate) { //向效果逻辑设置修正率 pLogic->RefixPowerByRate(impact, nRefixRate); } if(0>nDelayTime) { nDelayTime = 0; } Scene* pScene = rTar.getScene(); Obj_Character* pChar = NULL; if(NULL!=pScene) { Obj* pObj = pScene->GetSpecificObjByID( nSender ); if( IsCharacterObj(pObj->GetObjType()) ) { pChar = static_cast<Obj_Character*>(pObj); SkillInfo_T& rSkillInfo = pChar->GetSkillInfo(); impact.SetSkillID( rSkillInfo.GetSkillID() ); rSkillInfo.SetSendSkillImpactID(impact.GetDataIndex()); } pScene->GetEventCore().RegisterImpactEvent(rTar.GetID(), nSender, impact, nDelayTime); return TRUE; } } // start to fill impact struct return TRUE; __LEAVE_FUNCTION return FALSE; }
VOID StdImpact001_T::CriticalRefix(OWN_IMPACT& rImp) const { __ENTER_FUNCTION SetDamage(rImp, GetDamage(rImp)*2); rImp.MarkCriticalFlag(); __LEAVE_FUNCTION }
BOOL StdImpact059_T::ScanUnitForTarget( OWN_IMPACT& rImp, Obj_Character& rMe, FLOAT fX,FLOAT fZ, OBJLIST& rTargets) const { __ENTER_FUNCTION UINT uCurrentBallCount = rImp.GetLayerCount(); //初始化搜索需要的基础属性 SkillInfo_T rSkillInfo = rMe.GetSkillInfo(); //为了此类buff可以和其它技能并存,所以给ScanOperatorIniter提供造成此类buff的技能SkillInfo_T g_SkillCore.InstanceSkill( rSkillInfo, rMe, rImp.GetSkillID() ); TargetingAndDepletingParams_T& rParams = rMe.GetTargetingAndDepletingParams(); Scene* pScene = rMe.getScene(); SCANOPERATOR_SECTORSKILL_INIT ScanOperatorIniter; ScanOperatorIniter.m_pSkillInfo = &rSkillInfo; ScanOperatorIniter.m_pMe = &rMe; ScanOperatorIniter.m_pScene = rMe.getScene(); ScanOperatorIniter.m_pTargets = &rTargets; ScanOperatorIniter.m_fRadius = rSkillInfo.GetRadius(); ScanOperatorIniter.m_CentrePoint.m_fX = fX; ScanOperatorIniter.m_CentrePoint.m_fZ = fZ; //保护 if( rTargets.MAX_OBJ_LIST_SIZE < uCurrentBallCount ) return FALSE; //搜索人数上限为当前自身实际的小球个数 ScanOperatorIniter.m_nCount = uCurrentBallCount; //初始化搜索对象 ScanOperator_SectorSkill ScanOperator; ScanOperator.Init(&ScanOperatorIniter); //执行搜索 if(NULL!=pScene) { if(FALSE==pScene->Scan(&ScanOperator)) { rParams.SetErrCode(OR_ERROR); return FALSE; } } else { rParams.SetErrCode(OR_ERROR); return FALSE; } return TRUE; __LEAVE_FUNCTION return FALSE; }
BOOL StdImpact059_T::LayerFadeOut( OWN_IMPACT& rImp ) const { __ENTER_FUNCTION //获得当前效果的最大叠加层数 INT iMaxLayerCount = rImp.GetMaxLayerCount(); //获得当前效果的当前叠加层数 INT iCurrentLayer = rImp.GetLayerCount(); INT iMaxLayer = iMaxLayerCount-rImp.GetLayerCount(); BOOL ret = FALSE; //处理当前所有正在计时的层是否到时,如果到时则恢复 for( INT i=0; i<iMaxLayer; ++i ) { Time_t iContinuance = rImp.GetLayerContinuanceByIdx( i ); if( g_pTimeManager->CurrentTime() >= (UINT)iContinuance ) { rImp.SetLayerCount( ++iCurrentLayer ); ret = TRUE; for( INT j=i; j<iMaxLayer; ++j ) { //OWN_IMPACT::SetLayerContinuanceByIdx中已经为此预留了最后一个元素的位置 //所以j+1是安全的,不需要额外判定是否是最后一个元素,此元素将永为0 Time_t iTemp = rImp.GetLayerContinuanceByIdx( j+1 ); rImp.SetLayerContinuanceByIdx( j, iTemp ); } --iMaxLayer; --i; } } return ret; __LEAVE_FUNCTION return FALSE; }
VOID StdImpact059_T::SendLayerChangeMsg( OWN_IMPACT& rImp, Obj_Character& rMe ) const { __ENTER_FUNCTION //通知客户端层数改变 // Info Other Impact //通知其它客户端效果生效 Scene * pScene = rMe.getScene(); if(NULL==pScene||FALSE==rMe.IsActiveObj()) { return; } GCCharBuff Msg2Other; Msg2Other.SetReceiverID(rImp.GetCasterObjID()); Msg2Other.SetSenderID(rImp.GetCasterObjID()); Msg2Other.SetEnable(TRUE); Msg2Other.SetSN(rImp.GetSN()); Msg2Other.SetBuffID(Impact_GetImpactID(rImp)); Msg2Other.SetSenderLogicCount(rImp.GetCasterLogicCount()); Msg2Other.SetSkillID( rImp.GetSkillID() ); Msg2Other.SetLayerCount( rImp.GetLayerCount() ); // 设置技能效果的持续时间 20100531 BLL Msg2Other.SetContinuance( rImp.GetContinuance() ); if(INVALID_ID!=Impact_GetImpactID(rImp)) { pScene->BroadCast(&Msg2Other, &rMe, TRUE); } __LEAVE_FUNCTION }
VOID StdImpact059_T::ComputeLayerChange( OWN_IMPACT& rImp, Obj_Character& rMe, INT nCount, INT iCurrentLayer ) const { __ENTER_FUNCTION INT iMaxLayerCount = rImp.GetMaxLayerCount(); //获取子效果的DataIndex INT nDataIndex = GetSubImpactDataIndexByIndex(rImp, 0); //获取子效果的描述对象 const ImpactData_T* pSubImpactData = Impact_GetDataBlock( nDataIndex ); //获得子效果的总持续时间 Time_t iSubImpactContinuance = pSubImpactData->GetContinuance(); for( INT i=0; i<nCount; ++i ) { //设置新添加的层的计时 rImp.SetLayerContinuanceByIdx( iMaxLayerCount-iCurrentLayer+i, g_pTimeManager->CurrentTime()+iSubImpactContinuance ); } __LEAVE_FUNCTION }
BOOL StdImpact059_T::IsCanSendToUnit( OWN_IMPACT& rImp, Obj_Character& rMe, Obj_Character* pChar ) const { //获得技能使用者身上的效果列表 __ENTER_FUNCTION OWN_IMPACT* pImpact = pChar->Impact_GetFirstImpactOfSpecificSkillID( rImp.GetSkillID() ); if( NULL == pImpact ) { if( pChar->Impact_IsCanReciveBallImpact( rImp ) ) return TRUE; } else if( pImpact->GetCasterObjID()!=rMe.GetID() ) { return TRUE; } return FALSE; __LEAVE_FUNCTION return FALSE; }
VOID ImpactLogic_T::IntervalCalc(OWN_IMPACT& rImp, Obj_Character& rMe, INT nDeltaTime) const { __ENTER_FUNCTION //process interval INT nElapsedInterval = rImp.GetIntervalElapsed(); INT nContinuance = rImp.GetContinuance(); if(nDeltaTime>nContinuance && 0<=nContinuance) { nDeltaTime = nContinuance; } nElapsedInterval += nDeltaTime; INT const nInterval = Impact_GetInterval(rImp); while (nElapsedInterval >= nInterval) { // Impact activited OnIntervalOver(rImp, rMe); nElapsedInterval -= nInterval; } rImp.SetIntervalElapsed(nElapsedInterval); __LEAVE_FUNCTION }
VOID StdImpact082_T::InitDamages( OWN_IMPACT& rImp ) const { __ENTER_FUNCTION INT iRefixType = Impact_GetImpactDataDescriptorValueByIndex ( rImp.GetDataIndex(), ImpactDataDescriptorIndex_T::IDX_REFIX_TYPE, rImp.GetSkillLevel() ); SetHP(rImp, Impact_GetImpactDataDescriptorValueByIndex (rImp.GetDataIndex(), ImpactDataDescriptorIndex_T::IDX_REFIX_HP, rImp.GetSkillLevel() ) ); SetMP(rImp, Impact_GetImpactDataDescriptorValueByIndex (rImp.GetDataIndex(), ImpactDataDescriptorIndex_T::IDX_REFIX_MP, rImp.GetSkillLevel() ) ); SetPneuma(rImp, Impact_GetImpactDataDescriptorValueByIndex (rImp.GetDataIndex(), ImpactDataDescriptorIndex_T::IDX_REFIX_PNEUMA, rImp.GetSkillLevel() ) ); SetRage(rImp, Impact_GetImpactDataDescriptorValueByIndex (rImp.GetDataIndex(), ImpactDataDescriptorIndex_T::IDX_REFIX_RAGE, rImp.GetSkillLevel() ) ); __LEAVE_FUNCTION }
BOOL Impact_GetMutexByCasterFlag(OWN_IMPACT& rImp) { __ENTER_FUNCTION ID_t nDataIndex = rImp.GetDataIndex(); ImpactData_T const* pData = Impact_GetDataBlock(nDataIndex); if(NULL!=pData) { return pData->GetMutexByCasterFlag(); } return 0; __LEAVE_FUNCTION return 0; }
ID_t Impact_GetMutexID(OWN_IMPACT& rImp) { __ENTER_FUNCTION ID_t nDataIndex = rImp.GetDataIndex(); ImpactData_T const* pData = Impact_GetDataBlock(nDataIndex); if(NULL!=pData) { return pData->GetMutexID(); } return INVALID_ID; __LEAVE_FUNCTION return INVALID_ID; }
ID_t Impact_GetStandFlag(OWN_IMPACT& rImp) { __ENTER_FUNCTION ID_t nDataIndex = rImp.GetDataIndex(); ImpactData_T const* pData = Impact_GetDataBlock(nDataIndex); if(NULL!=pData) { return pData->GetStandFlag(); } return BEHAVIOR_TYPE_NEUTRALITY; __LEAVE_FUNCTION return BEHAVIOR_TYPE_NEUTRALITY; }
BOOL Impact_IsFadeOutWhenUnitStartActions(OWN_IMPACT& rImp) { __ENTER_FUNCTION ID_t nDataIndex = rImp.GetDataIndex(); ImpactData_T const* pData = Impact_GetDataBlock(nDataIndex); if(NULL!=pData) { return pData->IsFadeOutWhenUnitStartActions(); } return TRUE; __LEAVE_FUNCTION return TRUE; }
BOOL Impact_NeedChannelSupport(OWN_IMPACT& rImp) { __ENTER_FUNCTION ID_t nDataIndex = rImp.GetDataIndex(); ImpactData_T const* pData = Impact_GetDataBlock(nDataIndex); if(NULL!=pData) { return pData->NeedChannelSupport(); } return FALSE; __LEAVE_FUNCTION return FALSE; }
BOOL Impact_IsStillTimingWhenUnitOffline(OWN_IMPACT& rImp) { __ENTER_FUNCTION ID_t nDataIndex = rImp.GetDataIndex(); ImpactData_T const* pData = Impact_GetDataBlock(nDataIndex); if(NULL!=pData) { return pData->IsStillTimingWhenUnitOffline(); } return FALSE; __LEAVE_FUNCTION return FALSE; }
ID_t Impact_IgnoreFliter(OWN_IMPACT& rImp) { __ENTER_FUNCTION ID_t nDataIndex = rImp.GetDataIndex(); ImpactData_T const* pData = Impact_GetDataBlock(nDataIndex); if(NULL!=pData) { return pData->IgnoreFliter(); } return FALSE; __LEAVE_FUNCTION return FALSE; }
Time_t Impact_GetInterval(OWN_IMPACT& rImp) { __ENTER_FUNCTION ID_t nDataIndex = rImp.GetDataIndex(); ImpactData_T const* pData = Impact_GetDataBlock(nDataIndex); if(NULL!=pData) { return pData->GetInterval(); } return 0; __LEAVE_FUNCTION return 0; }
BOOL Impact_CanBeCanceled(OWN_IMPACT& rImp) { __ENTER_FUNCTION ID_t nDataIndex = rImp.GetDataIndex(); ImpactData_T const* pData = Impact_GetDataBlock(nDataIndex); if(NULL!=pData) { return pData->CanBeCanceled(); } return TRUE; __LEAVE_FUNCTION return TRUE; }
BOOL Impact_IsRemainOnCorpse(OWN_IMPACT& rImp) { __ENTER_FUNCTION ID_t nDataIndex = rImp.GetDataIndex(); ImpactData_T const* pData = Impact_GetDataBlock(nDataIndex); if(NULL!=pData) { return pData->IsRemainOnCorpse(); } return FALSE; __LEAVE_FUNCTION return FALSE; }
VOID StdImpact059_T::DoHitTarget( OWN_IMPACT& rImp, Obj_Character& rMe, OBJLIST& rTargets, HitFlagsForOBJLIST_T& HitFlagList, UINT& nCount ) const { __ENTER_FUNCTION WORLD_POS const* pPos = rMe.getWorldPos(); //搜索目标列表 if(NULL!=pPos) { ScanUnitForTarget( rImp, rMe, pPos->m_fX, pPos->m_fZ, rTargets ); } SkillID_t nSkillID = rImp.GetSkillID(); ////根据技能ID从全局技能模板管理器中获得技能模板实例 //const SkillTemplateData_T* pSkillTemplate = g_SkillTemplateDataMgr.GetInstanceByID( iID ); HitFlagList.ClearAllFlags(); INT nIdx = 0; for(nIdx=0; rTargets.m_Count>nIdx; ++nIdx) { Obj* pTarget = rTargets.m_aObj[nIdx]; if(NULL!=pTarget) { Obj_Character* pChar = (Obj_Character*)pTarget; //如果命中,则把命中与否的列表置为命中 if(TRUE==HitThisTarget(rMe, *pChar, nSkillID)) { //判断小球投送对象身上是否已经有同类型的效果存在,如果有 if( !IsCanSendToUnit( rImp, rMe, pChar ) ) { continue; } ////记录小球投送的对象 //(Obj_Character*)(m_aBallUniqueID[nIdx].m_pCharacter) = pChar; ////记录小球的全局ID //(UINT)(m_aBallUniqueID[nIdx].m_uUniqueID) = g_ImpactCore.GetUniqueID(); //pChar->Impact_SetImpactUniqueID( m_aBallUniqueID[nIdx].m_uUniqueID ); INT nDataIndex = GetSubImpactDataIndexByIndex(rImp, 0); if(0<nDataIndex) { g_ImpactCore.SendImpactToUnit( *pChar, nDataIndex, rMe.GetID(), nSkillID ); } //g_ImpactCore.SendBallImpactToUnit( *pChar, STD_IMPACT_058, rMe.GetID() ); //Mark this Target Hitted HitFlagList.MarkFlagByIndex(nIdx); ++nCount; } } } __LEAVE_FUNCTION }
VOID StdImpact069_T::CriticalRefix(OWN_IMPACT& rImp) const { __ENTER_FUNCTION SetDamageNear(rImp, GetDamageNear(rImp)*2); SetDamageFar(rImp, GetDamageFar(rImp)*2); SetDamageMagicNear(rImp, GetDamageMagicNear(rImp)*2); SetDamageMagicFar(rImp, GetDamageMagicFar(rImp)*2); SetDamageGold(rImp, GetDamageGold(rImp)*2); SetDamageWood(rImp, GetDamageWood(rImp)*2); SetDamageWater(rImp, GetDamageWater(rImp)*2); SetDamageFire(rImp, GetDamageFire(rImp)*2); SetDamageSoil(rImp, GetDamageSoil(rImp)*2); rImp.MarkCriticalFlag(); __LEAVE_FUNCTION }
BOOL Impact_IsImpactInCollection(OWN_IMPACT& rImp, INT nCollectionID) { __ENTER_FUNCTION INT nID=INVALID_ID; IDCollection_T const* pCollection = NULL; pCollection = g_IDCollectionMgr.GetInstanceByID(nCollectionID); if(NULL!=pCollection) { switch (pCollection->GetType()) { case IDCollection_T::TYPE_BUFF_ID: if(TRUE==Impact_IsOverTimed(rImp)) { nID = Impact_GetImpactID(rImp); } break; case IDCollection_T::TYPE_IMPACT_LOGIC_ID: nID = Impact_GetLogicID(rImp); break; case IDCollection_T::TYPE_IMPACT_MUTEX_ID: nID = Impact_GetMutexID(rImp); break; case IDCollection_T::TYPE_SKILL_ID: nID = rImp.GetSkillID(); break; case IDCollection_T::TYPE_DIRECT_IMPACT_ID: if(TRUE==Impact_IsOverTimed(rImp)) { nID = Impact_GetImpactID(rImp); } break; case IDCollection_T::TYPE_SKILL_LOGIC_ID: default: break; } if(INVALID_ID != nID) { if(0<pCollection->GetCollectionSize()) { return pCollection->IsThisIDInCollection(nID); } } } return FALSE; __LEAVE_FUNCTION return FALSE; }
VOID StdImpact059_T::BroadcastTargetListMessage( OWN_IMPACT& rImp, Obj_Character& rMe, OBJLIST& rTargets, HitFlagsForOBJLIST_T& rHitFlagsForObjList ) const { __ENTER_FUNCTION SkillInfo_T& rSkillInfo = rMe.GetSkillInfo(); TargetingAndDepletingParams_T& rParams = rMe.GetTargetingAndDepletingParams(); GCTargetListAndHitFlags msg; GCTargetListAndHitFlags::HitFlagList_T& rHitFlags = msg.GetHitFlagList(); msg.SetDataType(msg.BUFF_ACTIVETE); msg.SetObjID(rMe.GetID()); msg.SetUserPos(*(rMe.getWorldPos())); msg.SetLogicCount(rMe.GetLogicCount()); msg.SetSkillOrSpecialObjDataID(rImp.GetSkillID()); msg.SetTargetID(rParams.GetTargetObj()); msg.SetTargetPos(rParams.GetTargetPosition()); msg.SetDir(rParams.GetTargetDirection()); BYTE nNum = rTargets.m_Count; if(msg.MAX_TARGET_LIST_SIZE<nNum) { nNum = msg.MAX_TARGET_LIST_SIZE; } msg.SetTargetNum(nNum); int iTemp = nNum; INT nIdx=0; for(nIdx=0; nNum>nIdx; ++nIdx) { Obj* pTarget = rTargets.m_aObj[nIdx]; if(NULL!=pTarget) { msg.SetTargetObjIDByIndex(nIdx, pTarget->GetID()); if(TRUE == rHitFlagsForObjList.GetFlagByIndex(nIdx)) { rHitFlags.MarkFlagByIndex(nIdx); //msg.SetBallIDByIndex( nIdx, m_aBallUniqueID[nIdx].m_uUniqueID ); } } } Scene* pScene = rMe.getScene(); if(NULL!=pScene) { pScene->BroadCast(&msg, &rMe, TRUE); } __LEAVE_FUNCTION }
VOID StdImpact023_T::OnDamageTarget(OWN_IMPACT& rImp, Obj_Character& rMe, Obj_Character& rTar, INT& rDamage, SkillID_t nSkillID) const { __ENTER_FUNCTION INT nMpDamageRate = GetMpDamageRate(rImp); INT nRageDamageRate = GetRageDamageRate(rImp); if(TRUE==rImp.IsFadeOut()) { return; } if(0>=nMpDamageRate && 0>= nRageDamageRate) { return; } Scene* pScene = rMe.getScene(); if(NULL==pScene) { return; } // 生效几率 INT nActivateOdds = GetActivateOdds(rImp); INT nRet = pScene->GetRand100(); if (nRet > nActivateOdds) {// 没有生效则直接返回 return; } // 命中时吸取敌人MP百分率 if(0<nMpDamageRate) { INT nMP = Float2Int((nMpDamageRate*rDamage)/100.0f); rTar.ManaIncrement(-nMP, &rMe); } // 命中时吸取敌人怒气百分率 if(0<nRageDamageRate) { INT nRage = rTar.GetRage(); nRage = Float2Int((nRageDamageRate*nRage)/100.0f); rTar.RageIncrement(-nRage, &rMe); } __LEAVE_FUNCTION }
BOOL Impact_IsOverTimed(OWN_IMPACT& rImp) { __ENTER_FUNCTION ID_t nDataIndex = rImp.GetDataIndex(); ImpactData_T const* pData = Impact_GetDataBlock(nDataIndex); if(NULL==pData) { return FALSE; } BOOL bIsOverTimed = pData->IsOverTimed(); ImpactLogic_T const* pLogic = Impact_GetLogic(rImp); if(NULL!=pLogic) { if(pLogic->IsOverTimed()!=bIsOverTimed) { Assert(NULL=="[Impact_IsOverTimed] Logic is not match the data."); return pLogic->IsOverTimed(); } } return bIsOverTimed; __LEAVE_FUNCTION return FALSE; }
BOOL CombatCore_T::GetResultImpact(Obj_Character& rAttacker, Obj_Character& rDefencer, OWN_IMPACT& rImp) { __ENTER_FUNCTION INT nDamage = 0; INT nMaxDamage = 0; INT nSpecialEffectID = DAMAGE_SPECIAL_EFFECT_NEAR; //Init DI_DamagesByValue_T logic; if(INVALID_ID==rImp.GetDataIndex()) { g_ImpactCore.InitImpactFromData(IMP_DAMAGES_OF_ATTACKS, rImp, rAttacker); } else if(logic.ID!=Impact_GetLogicID(rImp) && DI_DamagesByRate_T::ID!=Impact_GetLogicID(rImp) ) { g_ImpactCore.InitImpactFromData(IMP_DAMAGES_OF_ATTACKS, rImp, rAttacker); } m_nAdditionalAttackNear += logic.GetDamageNear(rImp); m_nAdditionalAttackFar += logic.GetDamageFar(rImp); m_nAdditionalAttackMagicNear+= logic.GetDamageMagicNear(rImp); m_nAdditionalAttackMagicFar += logic.GetDamageMagicFar(rImp); m_nAdditionalAttackGold += logic.GetDamageGold(rImp); m_nAdditionalAttackWood += logic.GetDamageWood(rImp); m_nAdditionalAttackWater += logic.GetDamageWater(rImp); m_nAdditionalAttackFire += logic.GetDamageFire(rImp); m_nAdditionalAttackSoil += logic.GetDamageSoil(rImp); //Damage fluctuation INT nFluctuation = g_Config.m_ConfigInfo.m_nDefaultDamageFluctuation; MenPaiID_t nMenPai = 9; MenPai_Module::MenPai_T const* pMenPai = NULL; if(Obj::OBJ_TYPE_HUMAN==rAttacker.GetObjType()) { Obj_Human& rHuman = (Obj_Human&)rAttacker; nMenPai = rHuman.GetMenPai(); pMenPai = g_MenPaiLogicList.GetLogicById(nMenPai); if(NULL!=pMenPai) { nFluctuation=pMenPai->GetAttackFluctuation(); } } Scene* pScene = rAttacker.getScene(); // calculate the fluctuation INT nRand=50; if(NULL!=pScene) { nRand -= pScene->GetRand100(); } nFluctuation = Float2Int((2*nFluctuation*nRand)/100.0f); //Calculate Damages //Near nDamage = NearDamage(rAttacker, rDefencer, m_nAdditionalAttackNear, m_nAdditionalDefenceNear); // Refix damage with fluctuation nDamage = nDamage + nDamage*nFluctuation/100; logicDamages.SetDamageNear(rImp, nDamage); nMaxDamage = nDamage; nSpecialEffectID = DAMAGE_SPECIAL_EFFECT_NEAR; //Far nDamage = FarDamage(rAttacker, rDefencer, m_nAdditionalAttackFar, m_nAdditionalDefenceFar); // Refix damage with fluctuation nDamage = nDamage + nDamage*nFluctuation/100; logicDamages.SetDamageFar(rImp, nDamage); if(nMaxDamage<nDamage) { nMaxDamage = nDamage; nSpecialEffectID = DAMAGE_SPECIAL_EFFECT_FAR; } //近程内功 nDamage = MagicalNearDamage(rAttacker, rDefencer, m_nAdditionalAttackMagicNear, m_nAdditionalDefenceMagicNear); // Refix damage with fluctuation nDamage = nDamage + nDamage*nFluctuation/100; logicDamages.SetDamageMagicNear(rImp, nDamage); if(nMaxDamage<nDamage) { nMaxDamage = nDamage; nSpecialEffectID = DAMAGE_SPECIAL_EFFECT_MAGIC_NEAR; } //近程外功 nDamage = MagicalFarDamage(rAttacker, rDefencer, m_nAdditionalAttackMagicFar, m_nAdditionalDefenceMagicFar); // Refix damage with fluctuation nDamage = nDamage + nDamage*nFluctuation/100; logicDamages.SetDamageMagicFar(rImp, nDamage); if(nMaxDamage<nDamage) { nMaxDamage = nDamage; nSpecialEffectID = DAMAGE_SPECIAL_EFFECT_MAGIC_FAR; } //Gold nDamage = GoldDamage(rAttacker, rDefencer, m_nAdditionalAttackGold, m_nAdditionalDefenceGold); // Refix damage with fluctuation nDamage = nDamage + nDamage*nFluctuation/100; logicDamages.SetDamageGold(rImp, nDamage); if(nMaxDamage<nDamage) { nMaxDamage = nDamage; nSpecialEffectID = DAMAGE_SPECIAL_EFFECT_GOLD; } //Wood nDamage = WoodDamage(rAttacker, rDefencer, m_nAdditionalAttackWood, m_nAdditionalDefenceWood); // Refix damage with fluctuation nDamage = nDamage + nDamage*nFluctuation/100; logicDamages.SetDamageWood(rImp, nDamage); if(nMaxDamage<nDamage) { nMaxDamage = nDamage; nSpecialEffectID = DAMAGE_SPECIAL_EFFECT_WOOD; } //Water nDamage = WaterDamage(rAttacker, rDefencer, m_nAdditionalAttackWater, m_nAdditionalDefenceWater); // Refix damage with fluctuation nDamage = nDamage + nDamage*nFluctuation/100; logicDamages.SetDamageWater(rImp, nDamage); if(nMaxDamage<nDamage) { nMaxDamage = nDamage; nSpecialEffectID = DAMAGE_SPECIAL_EFFECT_WATER; } //Fire nDamage = FireDamage(rAttacker, rDefencer, m_nAdditionalAttackFire, m_nAdditionalDefenceFire); // Refix damage with fluctuation nDamage = nDamage + nDamage*nFluctuation/100; logicDamages.SetDamageFire(rImp, nDamage); if(nMaxDamage<nDamage) { nMaxDamage = nDamage; nSpecialEffectID = DAMAGE_SPECIAL_EFFECT_FIRE; } //Soil nDamage = SoilDamage(rAttacker, rDefencer, m_nAdditionalAttackSoil, m_nAdditionalDefenceSoil); // Refix damage with fluctuation nDamage = nDamage + nDamage*nFluctuation/100; logicDamages.SetDamageSoil(rImp, nDamage); if(nMaxDamage<nDamage) { nMaxDamage = nDamage; nSpecialEffectID = DAMAGE_SPECIAL_EFFECT_SOIL; } rImp.SetImpactID(nSpecialEffectID); return TRUE; __LEAVE_FUNCTION return FALSE; }
VOID StdImpact071_T::InitDamages( OWN_IMPACT& rImp ) const { __ENTER_FUNCTION SetHP (rImp, Impact_GetImpactDataDescriptorValueByIndex (rImp.GetDataIndex(), ImpactDataDescriptorIndex_T::IDX_REFIX_HP, rImp.GetSkillLevel() ) ); SetRage0 (rImp, Impact_GetImpactDataDescriptorValueByIndex (rImp.GetDataIndex(), ImpactDataDescriptorIndex_T::IDX_REFIX_RAGE0, rImp.GetSkillLevel() ) ); SetRage1 (rImp, Impact_GetImpactDataDescriptorValueByIndex (rImp.GetDataIndex(), ImpactDataDescriptorIndex_T::IDX_REFIX_RAGE1, rImp.GetSkillLevel() ) ); SetRage2 (rImp, Impact_GetImpactDataDescriptorValueByIndex (rImp.GetDataIndex(), ImpactDataDescriptorIndex_T::IDX_REFIX_RAGE2, rImp.GetSkillLevel() ) ); SetRage3 (rImp, Impact_GetImpactDataDescriptorValueByIndex (rImp.GetDataIndex(), ImpactDataDescriptorIndex_T::IDX_REFIX_RAGE3, rImp.GetSkillLevel() ) ); SetRage4 (rImp, Impact_GetImpactDataDescriptorValueByIndex (rImp.GetDataIndex(), ImpactDataDescriptorIndex_T::IDX_REFIX_RAGE4, rImp.GetSkillLevel() ) ); SetRage5 (rImp, Impact_GetImpactDataDescriptorValueByIndex (rImp.GetDataIndex(), ImpactDataDescriptorIndex_T::IDX_REFIX_RAGE5, rImp.GetSkillLevel() ) ); __LEAVE_FUNCTION }
VOID StdImpact069_T::InitDamages( OWN_IMPACT& rImp ) const { __ENTER_FUNCTION SetParaID ( rImp, Impact_GetImpactDataDescriptorValueByIndex (rImp.GetDataIndex(), ImpactDataDescriptorIndex_T::IDX_PARA_ID, rImp.GetSkillLevel() ) ); SetRefixRate ( rImp, Impact_GetImpactDataDescriptorValueByIndex (rImp.GetDataIndex(), ImpactDataDescriptorIndex_T::IDX_REFIX_RATE, rImp.GetSkillLevel() ) ); SetDamageNear (rImp, Impact_GetImpactDataDescriptorValueByIndex (rImp.GetDataIndex(), ImpactDataDescriptorIndex_T::IDX_DAMAGE_NEAR, rImp.GetSkillLevel() ) ); SetDamageFar (rImp, Impact_GetImpactDataDescriptorValueByIndex (rImp.GetDataIndex(), ImpactDataDescriptorIndex_T::IDX_DAMAGE_FAR, rImp.GetSkillLevel() ) ); SetDamageMagicNear (rImp, Impact_GetImpactDataDescriptorValueByIndex (rImp.GetDataIndex(), ImpactDataDescriptorIndex_T::IDX_DAMAGE_MAGIC_NEAR, rImp.GetSkillLevel() ) ); SetDamageMagicFar (rImp, Impact_GetImpactDataDescriptorValueByIndex (rImp.GetDataIndex(), ImpactDataDescriptorIndex_T::IDX_DAMAGE_MAGIC_FAR, rImp.GetSkillLevel() ) ); SetDamageGold (rImp, Impact_GetImpactDataDescriptorValueByIndex (rImp.GetDataIndex(), ImpactDataDescriptorIndex_T::IDX_DAMAGE_GOLD, rImp.GetSkillLevel() ) ); SetDamageWood (rImp, Impact_GetImpactDataDescriptorValueByIndex (rImp.GetDataIndex(), ImpactDataDescriptorIndex_T::IDX_DAMAGE_WOOD, rImp.GetSkillLevel() ) ); SetDamageWater (rImp, Impact_GetImpactDataDescriptorValueByIndex (rImp.GetDataIndex(), ImpactDataDescriptorIndex_T::IDX_DAMAGE_WATER, rImp.GetSkillLevel() ) ); SetDamageFire (rImp, Impact_GetImpactDataDescriptorValueByIndex (rImp.GetDataIndex(), ImpactDataDescriptorIndex_T::IDX_DAMAGE_FIRE, rImp.GetSkillLevel() ) ); SetDamageSoil (rImp, Impact_GetImpactDataDescriptorValueByIndex (rImp.GetDataIndex(), ImpactDataDescriptorIndex_T::IDX_DAMAGE_SOIL, rImp.GetSkillLevel() ) ); __LEAVE_FUNCTION }