INT CombatCore_T::MagicalDamage(Obj_Character& rMe, Obj_Character& rTar, INT nAdditionAttack, INT nAdditionDefence) { __ENTER_FUNCTION INT nDamage; INT nAttack = Attr_VerifyGeneralAttack(rMe.GetAttackMagic()+nAdditionAttack); INT nDefence = Attr_VerifyDefence(rTar.GetDefenceMagic()+nAdditionDefence); INT nIgnoreRate = 0; // calculate damage if(Obj::OBJ_TYPE_HUMAN==rTar.GetObjType()) { nIgnoreRate= rTar.ItemValue(IATTRIBUTE_IMMUNITY_P).m_Value; } if(0==nAttack+nDefence) { //never enter here nDamage = 0; } else { nDamage = nAttack*nAttack/(nAttack+nDefence); } 0>nIgnoreRate?nIgnoreRate=0:NULL; 100<nIgnoreRate?nIgnoreRate=100:NULL; nDamage = nDamage - Float2Int((nDamage*nIgnoreRate)/100.0f); 0>nDamage?nDamage=0:NULL; return nDamage; __LEAVE_FUNCTION return 0; }
BOOL ExplosionTrap02_T::EffectOnChar(Obj_Special& rThis, Obj_Character& rTar) const { SpecialObjData_T const* pData = rThis.GetDataRecord(); if(NULL==pData) { AssertEx(FALSE,"[ExplosionTrap02_T::EffectOnChar]: Can't find Data record."); return FALSE; } SpecialObjData_T::Descriptor_T const* pDescriptor0 = pData->GetDescriptorByIndex(0); INT nDamagePhysics = 0; if(NULL != pDescriptor0) { nDamagePhysics = pDescriptor0->GetValue(); } SpecialObjData_T::Descriptor_T const* pDescriptor1 = pData->GetDescriptorByIndex(1); INT nDamageMagic = 0; if(NULL != pDescriptor1) { nDamageMagic = pDescriptor1->GetValue(); } SpecialObjData_T::Descriptor_T const* pDescriptor2 = pData->GetDescriptorByIndex(2); INT nDamageCold = 0; if(NULL != pDescriptor2) { nDamageCold = pDescriptor2->GetValue(); } SpecialObjData_T::Descriptor_T const* pDescriptor3 = pData->GetDescriptorByIndex(3); INT nDamageFire = 0; if(NULL != pDescriptor3) { nDamageFire = pDescriptor3->GetValue(); } SpecialObjData_T::Descriptor_T const* pDescriptor4 = pData->GetDescriptorByIndex(4); INT nDamageLight = 0; if(NULL != pDescriptor4) { nDamageLight = pDescriptor4->GetValue(); } SpecialObjData_T::Descriptor_T const* pDescriptor5 = pData->GetDescriptorByIndex(5); INT nDamagePoison = 0; if(NULL != pDescriptor5) { nDamageLight = pDescriptor5->GetValue(); } INT nBodyEnchaneImpactID = pData->GetDescriptorByIndex(6)->GetValue(); INT nBodyEnchanceContinuance = pData->GetDescriptorByIndex(7)->GetValue(); INT nActiveOdds = pData->GetDescriptorByIndex(8)->GetValue(); INT nAttackRefixRate = pData->GetDescriptorByIndex(9)->GetValue(); INT nDefenceRefixRate = pData->GetDescriptorByIndex(10)->GetValue(); OWN_IMPACT impact1; DI_Damages_T impLogic1; impLogic1.InitStruct(impact1); impact1.m_nCasterID = rThis.GetOwnerID(); impact1.m_nSkillID = Skill_Module::MELEE_ATTACK; impLogic1.SetDamagePhy(impact1, nDamagePhysics); impLogic1.SetDamageMagic(impact1, nDamageMagic); impLogic1.SetDamageCold(impact1, nDamageCold); impLogic1.SetDamageFire(impact1, nDamageFire); impLogic1.SetDamageLight(impact1, nDamageLight); impLogic1.SetDamagePoison(impact1, nDamagePoison); Scene* pScene = rThis.getScene(); if(NULL!=pScene) { pScene->GetEventCore().RegisterBeSkillEvent(rTar.GetID(), rThis.GetOwnerID(), BEHAVIOR_TYPE_HOSTILITY, 500); pScene->GetEventCore().RegisterImpactEvent(rTar.GetID(), rThis.GetOwnerID(), impact1, 500); INT nRand = pScene->GetRand100(); if(nActiveOdds>nRand) { OWN_IMPACT impact2; SOT_BodyEnhance_T impLogic2; impLogic2.InitStruct(impact2); impact2.m_nCasterID = rThis.GetOwnerID(); impact2.m_nSkillID = Skill_Module::MELEE_ATTACK; impact2.m_nImpactID = nBodyEnchaneImpactID; impLogic2.SetContinuance(impact2, nBodyEnchanceContinuance); INT nAttackRefix=0; INT nDefenceRefix=0; //Calculate Physics attack refix nAttackRefix = Float2Int((rTar.GetAttackPhysics() * nAttackRefixRate + 50) / 100); impLogic2.SetAttackPhysicsRefix(impact2, nAttackRefix); //Calculate Magic attack refix nAttackRefix = Float2Int((rTar.GetAttackMagic() * nAttackRefixRate + 50) / 100); impLogic2.SetAttackMagicRefix(impact2, nAttackRefix); //Calculate Physics Defence refix nDefenceRefix = Float2Int((rTar.GetDefencePhysics() * nDefenceRefixRate + 50) / 100); impLogic2.SetDefencePhysicsRefix(impact2, nDefenceRefix); //Calculate Magic Defence refix nDefenceRefix = Float2Int((rTar.GetDefenceMagic() * nDefenceRefixRate + 50) / 100); impLogic2.SetDefencePhysicsRefix(impact2, nDefenceRefix); //don't refix Max_Health impLogic2.SetMaxHealthRefix(impact2, 0); pScene->GetEventCore().RegisterImpactEvent(rTar.GetID(), rThis.GetOwnerID(), impact2, 500); } } return FALSE; }