📄 hitroll.cpp
字号:
//////////////////////////////////////////////////////////////////////////////// Filename : HitRoll.cpp// Written by : excel96// Description ://////////////////////////////////////////////////////////////////////////////#include "HitRoll.h"#include "SkillInfo.h"#include "Slayer.h"#include "Vampire.h"#include "Ousters.h"#include "Monster.h"#include "LogClient.h"#include "RankBonus.h"#include "Skill.h"#include "Zone.h"//#include <math.h>#include "EffectPrecedence.h"#include "EffectHymn.h"//////////////////////////////////////////////////////////////////////////////// 老馆 傍拜 hitroll 窃荐//////////////////////////////////////////////////////////////////////////////bool HitRoll::isSuccess(Creature* pAttacker, Creature* pDefender, int ToHitBonus){ Assert(pAttacker != NULL); Assert(pDefender != NULL); Zone* pZone = pAttacker->getZone(); Assert( pZone != NULL ); // 公利惑怕 眉农. by sigi. 2002.9.5 if (pDefender->isFlag(Effect::EFFECT_CLASS_NO_DAMAGE)) { return false; } ToHit_t ToHit = 0; Defense_t Defense = 0; uint timeband = pZone->getTimeband(); bool isMonster = false; // 傍拜磊狼 捧三阑 拌魂茄促. if (pAttacker->isSlayer()) { Slayer* pSlayerAttacker = dynamic_cast<Slayer*>(pAttacker); Assert(pSlayerAttacker != NULL); ToHit = pSlayerAttacker->getToHit(); //cout << "HitRoll: " << pSlayerAttacker->getName().c_str() << " --> "; } else if (pAttacker->isVampire()) { Vampire* pVampireAttacker = dynamic_cast<Vampire*>(pAttacker); Assert(pVampireAttacker != NULL); ToHit = pVampireAttacker->getToHit(); ToHit = (ToHit_t)getPercentValue(ToHit, VampireTimebandFactor[timeband]); // 攫哩啊 弥利拳甫 窍霸 等促搁.. -_-; // Creature俊促啊 Penalty包访 member甸阑 持绰霸 唱阑 巴捞促. if (pAttacker->isFlag(Effect::EFFECT_CLASS_HYMN)) { EffectHymn* pHymn = dynamic_cast<EffectHymn*>( pAttacker->getEffectManager()->findEffect( Effect::EFFECT_CLASS_HYMN ) ); ToHit = ToHit*(100-pHymn->getToHitPenalty())/100; } } else if (pAttacker->isOusters()) { Ousters* pOustersAttacker = dynamic_cast<Ousters*>(pAttacker); Assert(pOustersAttacker != NULL); ToHit = pOustersAttacker->getToHit(); } else if (pAttacker->isMonster()) { Monster* pMonsterAttacker = dynamic_cast<Monster*>(pAttacker); Assert(pMonsterAttacker != NULL); ToHit = pMonsterAttacker->getToHit(); ToHit = (ToHit_t)getPercentValue(ToHit, MonsterTimebandFactor[timeband]); isMonster = true; // 攫哩啊 弥利拳甫 窍霸 等促搁.. -_-; // Creature俊促啊 Penalty包访 member甸阑 持绰霸 唱阑 巴捞促. if (pAttacker->isFlag(Effect::EFFECT_CLASS_HYMN)) { EffectHymn* pHymn = dynamic_cast<EffectHymn*>( pAttacker->getEffectManager()->findEffect( Effect::EFFECT_CLASS_HYMN ) ); ToHit = ToHit*(100-pHymn->getToHitPenalty())/100; } } else { // 泅犁 农府媚狼 努贰胶绰 Slayer, Vampire, Monster, NPC 挥牢单... // 捞鳖瘤 吭促绰 富篮 傍拜磊啊 NPC扼绰 富捞瘤. // NPC AI绰 备泅登瘤 臼篮 惑怕捞骨肺, 公炼扒 府畔捞促. return false; } // 规绢磊狼 叼奇胶甫 拌魂秦 霖促. if (pDefender->isSlayer()) { Slayer* pSlayerDefender = dynamic_cast<Slayer*>(pDefender); Defense = pSlayerDefender->getDefense(); //cout << pSlayerDefender->getName().c_str() << " : "; } else if (pDefender->isVampire()) { Vampire* pVampireDefender = dynamic_cast<Vampire*>(pDefender); Defense = pVampireDefender->getDefense(); Defense = (Defense_t)getPercentValue(Defense, VampireTimebandFactor[timeband]); } else if (pDefender->isOusters()) { Ousters* pOustersDefender = dynamic_cast<Ousters*>(pDefender); Defense = pOustersDefender->getDefense(); } else if (pDefender->isMonster()) { Monster* pMonsterDefender= dynamic_cast<Monster*>(pDefender); Defense = pMonsterDefender->getDefense(); Defense = (Defense_t)getPercentValue(Defense, MonsterTimebandFactor[timeband]); } else { // 泅犁 农府媚狼 努贰胶绰 Slayer, Vampire, Monster, NPC 挥牢单... // 捞鳖瘤 吭促绰 富篮 规绢磊啊 NPC扼绰 富捞瘤. // NPC AI绰 备泅登瘤 臼篮 惑怕捞骨肺, 公炼扒 府畔捞促. return false; } int RandValue = Random(0, 100); int Result = 0; if (ToHit >= Defense) { // 捧三捞 叼奇胶焊促 臭篮 版快俊绰 嘎免 犬伏捞 蚕...臭促.#ifdef __CHINA_SERVER__ Result = min(90, (int)(((ToHit - Defense) / 1.5) + 60) + ToHitBonus);#else Result = min(95, (int)(((ToHit - Defense) / 3) + 50) + ToHitBonus/2);#endif } else { // 捧三捞 叼奇胶焊促 撤篮 版快俊绰 嘎免 犬伏捞 腹捞 冻绢柳促.#ifdef __CHINA_SERVER__ if( isMonster ) { Result = max(10, (int)(60 - ((Defense - ToHit) / 1.5) + ToHitBonus)); } else { Result = max(20, (int)(60 - ((Defense - ToHit) / 1.5) + ToHitBonus)); }#else// if( isMonster ) { Result = max(5, (int)(50 - ((Defense - ToHit) / 3) + ToHitBonus/2));// } else {// Result = max(20, (int)(50 - ((Defense - ToHit) / 3) + ToHitBonus/2));// }#endif } //cout << ToHit << " --> " << Defense << " : " << RandValue << "<=" << Result // << (RandValue <= Result? "Success" : "Fail") << endl; if (RandValue <= Result) return true; return false;}//////////////////////////////////////////////////////////////////////////////// 老馆 傍拜 hitroll 窃荐//////////////////////////////////////////////////////////////////////////////bool HitRoll::isSuccess(ToHit_t ToHit, Creature* pDefender, int ToHitBonus){ Assert(pDefender != NULL); Zone* pZone = pDefender->getZone(); Assert( pZone != NULL ); // 公利惑怕 眉农. by sigi. 2002.9.5 if (pDefender->isFlag(Effect::EFFECT_CLASS_NO_DAMAGE)) { return false; } Defense_t Defense = 0; uint timeband = pZone->getTimeband(); // 规绢磊狼 叼奇胶甫 拌魂秦 霖促. if (pDefender->isSlayer()) { Slayer* pSlayerDefender = dynamic_cast<Slayer*>(pDefender); Defense = pSlayerDefender->getDefense(); } else if (pDefender->isVampire()) { Vampire* pVampireDefender = dynamic_cast<Vampire*>(pDefender); Defense = pVampireDefender->getDefense(); Defense = (Defense_t)getPercentValue(Defense, VampireTimebandFactor[timeband]); } else if (pDefender->isOusters()) { Ousters* pOustersDefender = dynamic_cast<Ousters*>(pDefender); Defense = pOustersDefender->getDefense(); } else if (pDefender->isMonster()) { Monster* pMonsterDefender= dynamic_cast<Monster*>(pDefender); Defense = pMonsterDefender->getDefense(); Defense = (Defense_t)getPercentValue(Defense, MonsterTimebandFactor[timeband]); } else { // 泅犁 农府媚狼 努贰胶绰 Slayer, Vampire, Monster, NPC 挥牢单... // 捞鳖瘤 吭促绰 富篮 规绢磊啊 NPC扼绰 富捞瘤. // NPC AI绰 备泅登瘤 臼篮 惑怕捞骨肺, 公炼扒 府畔捞促. return false; } int RandValue = Random(0, 100); int Result = 0; if (ToHit >= Defense) { // 捧三捞 叼奇胶焊促 臭篮 版快俊绰 嘎免 犬伏捞 蚕...臭促.#ifdef __CHINA_SERVER__ Result = min(90, (int)(((ToHit - Defense) / 1.5) + 60) + ToHitBonus);#else Result = min(95, (int)(((ToHit - Defense) / 3) + 50) + ToHitBonus/2);#endif } else { // 捧三捞 叼奇胶焊促 撤篮 版快俊绰 嘎免 犬伏捞 腹捞 冻绢柳促.#ifdef __CHINA_SERVER__ Result = max(20, (int)(60 - ((Defense - ToHit) / 1.5) + ToHitBonus));#else Result = max(5, (int)(50 - ((Defense - ToHit) / 3) + ToHitBonus/2));#endif } if (RandValue <= Result) return true; return false;}//////////////////////////////////////////////////////////////////////////////// 浇饭捞绢侩 付过 hitroll 窃荐//////////////////////////////////////////////////////////////////////////////bool HitRoll::isSuccessMagic(Slayer* pSlayer, SkillInfo* pSkillInfo, SkillSlot* pSkillSlot){ Assert(pSlayer != NULL); Assert(pSkillInfo != NULL); Assert(pSkillSlot != NULL); int RandValue = Random (1, 100);#ifdef __CHINA_SERVER__ int SuccessRatio = (int)(45 - pSkillInfo->getLevel() / 2 + (int)((pSlayer->getINT() + pSkillSlot->getExpLevel()) / 2.5));#else int SuccessRatio = (int)(60 - pSkillInfo->getLevel() / 3 + (int)((pSlayer->getINT() + pSkillSlot->getExpLevel()) / 2.5));#endif // 浇饭捞绢 伎橇 胶懦老 版快 弥家 犬伏捞 50%捞促. if ( isSlayerSelfSkill( pSkillSlot->getSkillType() ) ) SuccessRatio = max( 50, SuccessRatio ); if (RandValue < SuccessRatio ) return true; return false;}//////////////////////////////////////////////////////////////////////////////// 轨颇捞绢侩 付过 hitroll 窃荐//////////////////////////////////////////////////////////////////////////////bool HitRoll::isSuccessMagic(Vampire* pVampire, SkillInfo* pSkillInfo, VampireSkillSlot* pVampireSkillSlot, int BonusPoint){ Assert(pVampire != NULL); Assert(pSkillInfo != NULL); Assert(pVampireSkillSlot != NULL); int RandValue = Random(1, 100); int Success = (int)(45 - pSkillInfo->getLevel() / 2 + (pVampire->getINT() + pVampire->getLevel()) / 4); if ( BonusPoint != 0 ) { Success = getPercentValue( Success, 100 + BonusPoint ); } if ( RandValue < Success ) return true; // if (RandValue < (int)(45 - pSkillInfo->getLevel() / 2 + (pVampire->getINT() + pVampire->getLevel()) / 4)) return true; return false;}//////////////////////////////////////////////////////////////////////////////// 酒快胶磐胶侩 付过 hitroll 窃荐//////////////////////////////////////////////////////////////////////////////bool HitRoll::isSuccessMagic(Ousters* pOusters, SkillInfo* pSkillInfo, OustersSkillSlot* pOustersSkillSlot, int BonusPoint){ Assert(pOusters != NULL); Assert(pSkillInfo != NULL); Assert(pOustersSkillSlot != NULL); int RandValue = Random(1, 100); // int Success = (int)( 45 - pSkillInfo->getLevel() / 2 + (pOusters->getINT() + pOusters->getLevel())/10 ); int Success = (int)( 45 + (pOusters->getINT() + pOusters->getLevel())/4 + pOustersSkillSlot->getExpLevel()/3 ); if ( isOustersSelfSkill( pOustersSkillSlot->getSkillType() ) ) { Success = max( Success, 60 ); } if ( BonusPoint != 0 ) { Success = getPercentValue( Success, 100 + BonusPoint ); } if ( RandValue < Success ) return true; return false;} //////////////////////////////////////////////////////////////////////////////// 阁胶磐侩 老馆 付过 疙吝 奔覆 窃荐//////////////////////////////////////////////////////////////////////////////bool HitRoll::isSuccessMagic(Monster* pMonster, SkillInfo* pSkillInfo){ Assert(pMonster != NULL); Assert(pSkillInfo != NULL); int ratio = (int)(45 - pSkillInfo->getLevel() / 2 + (pMonster->getINT() + pMonster->getLevel()) / 4); if (rand()%100 < ratio) return true; return false;}//////////////////////////////////////////////////////////////////////////////// 轨颇捞绢 棺 阁胶磐侩 软趋 疙吝 奔覆 窃荐//////////////////////////////////////////////////////////////////////////////// multiplier绰 焊烹篮 3捞促. 溜.. 33%捞窍啊 软趋 啊瓷荐摹牢单..// 付胶磐牢 版快俊绰 multiplier甫 2肺 秦辑.. 50% 捞窍啊 软趋 啊瓷荐摹肺 荤侩// by sigi. 2002.9.16//////////////////////////////////////////////////////////////////////////////bool HitRoll::isSuccessBloodDrain(Creature* pAttacker, Creature* pDefender, int multiplier){ Assert(pAttacker != NULL); Assert(pDefender != NULL); Zone* pZone = pAttacker->getZone(); Assert( pZone != NULL ); // 公利惑怕 眉农. by sigi. 2002.9.5 if (pDefender->isFlag(Effect::EFFECT_CLASS_NO_DAMAGE)) { return false; } const int normalMultiplier = 3; // master flag甫 parameter肺 罐绊 捞扒 哗具茄促. - -; bool bHPCheck = false; bool bEffected = false; uint timeband = pZone->getTimeband(); int ToHit = 0; int Defense = 0; int VampLevel = 0; int OtherLevel = 0; int ratio = 0; // 鸥百捞 乔甫 弧 荐 乐绰 惑怕牢瘤, // 叼奇胶啊 倔付牢瘤, 饭骇捞 倔付牢瘤甫 拌魂茄促. if (pDefender->isSlayer()) { Slayer* pTargetSlayer = dynamic_cast<Slayer*>(pDefender); int MaxHP = pTargetSlayer->getHP(ATTR_MAX); int CurHP = pTargetSlayer->getHP(ATTR_CURRENT); bHPCheck = (CurHP*multiplier <= MaxHP) ? true : false; bEffected = (normalMultiplier==multiplier) && pTargetSlayer->isFlag(Effect::EFFECT_CLASS_BLOOD_DRAIN); Defense = pTargetSlayer->getDefense(); OtherLevel = pTargetSlayer->getSTR(ATTR_CURRENT) + pTargetSlayer->getDEX(ATTR_CURRENT) + pTargetSlayer->getINT(ATTR_CURRENT) + pTargetSlayer->getSkillDomainLevel(SKILL_DOMAIN_BLADE) + pTargetSlayer->getSkillDomainLevel(SKILL_DOMAIN_SWORD) + pTargetSlayer->getSkillDomainLevel(SKILL_DOMAIN_GUN) + pTargetSlayer->getSkillDomainLevel(SKILL_DOMAIN_HEAL) + pTargetSlayer->getSkillDomainLevel(SKILL_DOMAIN_ENCHANT); OtherLevel = (int)(OtherLevel/350); // 眉仿捞 酒流 1/3捞 逞芭唱, // 捞固 软趋阑 寸茄 惑怕扼搁 软趋阑 且 荐 绝促. if (!bHPCheck || bEffected) return false; } else if (pDefender->isVampire()) { Vampire* pTargetVampire = dynamic_cast<Vampire*>(pDefender); int MaxHP = pTargetVampire->getHP(ATTR_MAX); int CurHP = pTargetVampire->getHP(ATTR_CURRENT); bHPCheck = (CurHP*multiplier <= MaxHP) ? true : false; //bEffected = pTargetVampire->isFlag(Effect::EFFECT_CLASS_BLOOD_DRAIN); bEffected = (normalMultiplier==multiplier) && pTargetVampire->isFlag(Effect::EFFECT_CLASS_BLOOD_DRAIN); Defense = pTargetVampire->getDefense() + pTargetVampire->getLevel() / 5; OtherLevel = pTargetVampire->getLevel(); Defense = (Defense_t)getPercentValue(Defense, VampireTimebandFactor[timeband]); // 眉仿捞 酒流 1/3捞 逞芭唱, // 捞固 软趋阑 寸茄 惑怕扼搁 软趋阑 且 荐 绝促. if (!bHPCheck || bEffected) return false;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -