📄 hitroll.cpp
字号:
} else if (pDefender->isOusters()) { Ousters* pTargetOusters = dynamic_cast<Ousters*>(pDefender); int MaxHP = pTargetOusters->getHP(ATTR_MAX); int CurHP = pTargetOusters->getHP(ATTR_CURRENT); bHPCheck = (CurHP*multiplier <= MaxHP) ? true : false; //bEffected = pTargetOusters->isFlag(Effect::EFFECT_CLASS_BLOOD_DRAIN); bEffected = (normalMultiplier==multiplier) && pTargetOusters->isFlag(Effect::EFFECT_CLASS_BLOOD_DRAIN); Defense = pTargetOusters->getDefense() + pTargetOusters->getLevel() / 5; OtherLevel = pTargetOusters->getLevel(); // 眉仿捞 酒流 1/3捞 逞芭唱, // 捞固 软趋阑 寸茄 惑怕扼搁 软趋阑 且 荐 绝促. if (!bHPCheck || bEffected) return false; } else if (pDefender->isMonster()) { Monster* pTargetMonster = dynamic_cast<Monster*>(pDefender); int MaxHP = pTargetMonster->getHP(ATTR_MAX); int CurHP = pTargetMonster->getHP(ATTR_CURRENT); bHPCheck = (CurHP*multiplier <= MaxHP) ? true : false; //bEffected = pTargetMonster->isFlag(Effect::EFFECT_CLASS_BLOOD_DRAIN); bEffected = (normalMultiplier==multiplier) && pTargetMonster->isFlag(Effect::EFFECT_CLASS_BLOOD_DRAIN); Defense = pTargetMonster->getDefense() + pTargetMonster->getLevel() / 5; OtherLevel = pTargetMonster->getLevel(); Defense = (Defense_t)getPercentValue(Defense, MonsterTimebandFactor[timeband]); // 眉仿捞 酒流 1/3捞 逞芭唱, // 捞固 软趋阑 寸茄 惑怕扼搁 软趋阑 且 荐 绝促. if (!bHPCheck || bEffected) return false; // 父老 快急鼻捞 捞固 技泼登绢 乐绰 阁胶磐扼搁... // 软趋且 荐 乐绰 炼扒篮 快急鼻阑 啊柳 磊捞芭唱, 快急鼻阑 啊柳 颇萍俊 加茄 磊咯具 茄促. if (pTargetMonster->isFlag(Effect::EFFECT_CLASS_PRECEDENCE)) { EffectPrecedence* pEffectPrecedence = dynamic_cast<EffectPrecedence*>(pTargetMonster->findEffect(Effect::EFFECT_CLASS_PRECEDENCE)); Assert(pEffectPrecedence != NULL); // 快急鼻阑 啊柳 磊啊 酒聪扼搁... if (pAttacker->getName() != pEffectPrecedence->getHostName()) { // 酒公 颇萍俊档 啊涝登绢 乐瘤 臼芭唱, // 颇萍俊 啊涝登绢 乐绰单, 龋胶飘 颇萍 ID啊 酒聪扼搁, 软趋且 荐 绝促. if (pAttacker->getPartyID() == 0 || pAttacker->getPartyID() != pEffectPrecedence->getHostPartyID()) { return false; } } } } else Assert(false); // 傍拜磊狼 捧三 棺 饭骇阑 拌魂茄促. if (pAttacker->isVampire()) { Vampire* pVampire = dynamic_cast<Vampire*>(pAttacker); ToHit = pVampire->getToHit(); VampLevel = pVampire->getLevel(); ToHit = (ToHit_t)getPercentValue(ToHit, VampireTimebandFactor[timeband]); } else if (pAttacker->isMonster()) { Monster* pMonster = dynamic_cast<Monster*>(pAttacker); ToHit = pMonster->getToHit(); VampLevel = pMonster->getLevel(); ToHit = (ToHit_t)getPercentValue(ToHit, MonsterTimebandFactor[timeband]); } if (ToHit >= Defense) { // 捧三捞 叼奇胶焊促 臭篮 版快俊绰 嘎免 犬伏捞 蚕...臭促. ratio = min(90, (ToHit - Defense) / 2 + 70); } else { // 捧三捞 叼奇胶焊促 撤篮 版快俊绰 嘎免 犬伏捞 腹捞 冻绢柳促. ratio = max(10, 70 - (Defense - ToHit) / 2); } if ((rand()%100) < ratio) return true; return false;}//////////////////////////////////////////////////////////////////////////////// 历林 付过 洒飘费 窃荐//////////////////////////////////////////////////////////////////////////////bool HitRoll::isSuccessCurse(int MagicLevel, Resist_t resist){ // MagicLevel篮 轨颇捞绢啊 弊 付过阑 硅快绰 单 鞘夸茄 饭骇捞促. // 溜 臭篮 饭骇狼 历林 付过老荐废 MagicLevel捞 臭酒柳促. // // MagicLevel捞 30捞绊, 历亲捞 20捞扼搁... // curse_prob = 110捞绊, 历林绰 亲惑 己傍窍霸 等促. // MagicLevel捞 30捞绊, 历亲捞 100捞扼搁... // curse_prob = 30捞绊, 付过篮 70% 犬伏肺 角菩窍霸 等促.#ifdef __CHINA_SERVER__ int prob_penalty = (int)(MagicLevel - resist); int curse_prob = 65 + prob_penalty;#else int prob_penalty = (int)(MagicLevel*2/1.5 - resist); int curse_prob = 75 + prob_penalty; curse_prob = max( 5, curse_prob );#endif int randomValue = rand()%100; // 酒, 揪官. 历林 吧啡促. if (randomValue < curse_prob) return true; // 历亲仿俊 狼秦辑 吧府瘤 臼疽促. 酒轿府... return false;}//////////////////////////////////////////////////////////////////////////////// 历林 付过 洒飘费 窃荐 - 轨颇捞绢啊 历林甫 吧锭//////////////////////////////////////////////////////////////////////////////bool HitRoll::isSuccessVampireCurse(int MagicLevel, Resist_t resist){ // MagicLevel篮 轨颇捞绢啊 弊 付过阑 硅快绰 单 鞘夸茄 饭骇阑 2肺 唱传 // 巴捞促. 溜 臭篮 饭骇狼 历林 付过老荐废 MagicLevel捞 臭酒柳促. // // MagicLevel捞 30捞绊, 历亲捞 20捞扼搁... // curse_prob = 110捞绊, 历林绰 亲惑 己傍窍霸 等促. // MagicLevel捞 30捞绊, 历亲捞 100捞扼搁... // curse_prob = 30捞绊, 付过篮 70% 犬伏肺 角菩窍霸 等促. int prob_penalty = (int)( (int)(MagicLevel/1.5) - resist); int curse_prob = 75 + prob_penalty; curse_prob = max( 5, curse_prob ); int randomValue = rand()%100; // 酒, 揪官. 历林 吧啡促. if (randomValue < curse_prob) return true; // 历亲仿俊 狼秦辑 吧府瘤 臼疽促. 酒轿府... return false;}//////////////////////////////////////////////////////////////////////////////// CurePoison 疙吝奔覆 窃荐//////////////////////////////////////////////////////////////////////////////bool HitRoll::isSuccessCurePoison(int Base, int SkillLevel, int Difficulty, int MagicLevel, int MinRatio){ int ratio = Base + SkillLevel - Difficulty - MagicLevel; // 弥家犬伏阑 笼绢持菌促. by Sequoia 2003. 3. 20 ratio = max( MinRatio, ratio ); if (rand()%100 < ratio) return true; return false;}//////////////////////////////////////////////////////////////////////////////// Flare 疙吝奔覆 窃荐//////////////////////////////////////////////////////////////////////////////bool HitRoll::isSuccessFlare(Creature* pTargetCreature, int SkillLevel){ Assert(pTargetCreature != NULL); // 公利惑怕 眉农. by sigi. 2002.9.5 if (pTargetCreature->isFlag(Effect::EFFECT_CLASS_NO_DAMAGE)) return false; int ratio = 0; if (pTargetCreature->isVampire()) { Vampire* pVampire = dynamic_cast<Vampire*>(pTargetCreature); ratio = 75 + SkillLevel - pVampire->getLevel(); } else if (pTargetCreature->isMonster()) { Monster* pMonster = dynamic_cast<Monster*>(pTargetCreature); // // by sigi. 2002.10.30 if (pMonster->isMaster()#ifdef __UNDERWORLD__ || pMonster->isUnderworld() || pMonster->getMonsterType() == 599#endif ) { return false; } ratio = 75 + SkillLevel - pMonster->getLevel(); } if (rand()%100 < ratio) return true; return false;}//////////////////////////////////////////////////////////////////////////////// RemoveCurse 疙吝奔覆 窃荐//////////////////////////////////////////////////////////////////////////////bool HitRoll::isSuccessRemoveCurse(int Base, int SkillLevel, int Difficulty, int MagicLevel, int MinRatio = 0){ int ratio = Base + SkillLevel - Difficulty - MagicLevel; // 弥家犬伏阑 笼绢持菌促. by Sequoia 2003. 3. 20 ratio = max( MinRatio, ratio ); if (rand()%100 < ratio) return true; return false;}//////////////////////////////////////////////////////////////////////////////// Rebuke 疙吝奔覆 窃荐//////////////////////////////////////////////////////////////////////////////bool HitRoll::isSuccessRebuke(Slayer* pSlayer, SkillSlot* pSkillSlot, Creature* pDefender){ if( pDefender->isSlayer() ) return false; // 80饭骇 捞惑狼 轨颇捞绢绰 泪甸瘤 臼绰促. if ( pDefender->isVampire() ) { Vampire* pVampire = dynamic_cast<Vampire*>(pDefender); if ( pVampire->getLevel() >= 80 ) return false; } else if ( pDefender->isOusters() ) { Ousters* pOusters = dynamic_cast<Ousters*>(pDefender); if ( pOusters->getLevel() >= 80 ) return false; } // 付胶磐 (官配府, 抛其令)绰 泪甸瘤 臼绰促. if( pDefender->isMonster() ) { Monster* pMonster = dynamic_cast<Monster*>(pDefender); if( pMonster->isMaster()#ifdef __UNDERWORLD__ || pMonster->isUnderworld() || pMonster->getMonsterType() == 599 #endif ) return false; } Attr_t INTE = pSlayer->getINT(ATTR_CURRENT); SkillLevel_t SkillLevel = pSkillSlot->getExpLevel();// int ratio = ( INTE / 10 ) + ( SkillLevel / 3 ); int ratio = 20 + ( INTE / 10 ) + ( SkillLevel / 2 ); if (rand()%100 < ratio ) return true; return false;}//////////////////////////////////////////////////////////////////////////////// Magic Elusion 疙吝奔覆 窃荐//////////////////////////////////////////////////////////////////////////////bool HitRoll::isSuccessMagicElusion(Slayer* pSlayer){ Attr_t SUM = pSlayer->getTotalAttr( ATTR_CURRENT ); int Ratio = 50 + (SUM/15); return (rand()%100) < Ratio;}//////////////////////////////////////////////////////////////////////////////// Posion Mesh 疙吝奔覆 窃荐//////////////////////////////////////////////////////////////////////////////bool HitRoll::isSuccessPoisonMesh(Vampire* pVampire){ int Ratio = 30 + (pVampire->getLevel()/5); return (rand()%100) < Ratio;}//////////////////////////////////////////////////////////////////////////////// Illusion Of Avenge 疙吝奔覆 窃荐//////////////////////////////////////////////////////////////////////////////bool HitRoll::isSuccessIllusionOfAvenge(Slayer* pSlayer){ Attr_t SUM = pSlayer->getTotalAttr( ATTR_CURRENT ); int Ratio = 50 + (SUM/15); return (rand()%100) < Ratio;}//////////////////////////////////////////////////////////////////////////////// Will Of Life 疙吝奔覆 窃荐//////////////////////////////////////////////////////////////////////////////bool HitRoll::isSuccessWillOfLife(Vampire* pVampire){ int Ratio = 50 + pVampire->getLevel()/5; return (rand()%100) < Ratio;}//////////////////////////////////////////////////////////////////////////////// 农府萍拿 洒飘 费阑 荐青茄促.//////////////////////////////////////////////////////////////////////////////bool HitRoll::isCriticalHit(Creature* pCreature, int CriticalBonus){ Assert(pCreature != NULL); int CriticalRatio = pCreature->getCriticalRatio() + CriticalBonus; if (rand()%1000 < CriticalRatio) return true; return false;}//////////////////////////////////////////////////////////////////////////////// 浇饭捞绢 伎橇 胶懦牢啊甫 眉农窍绰 窃荐//////////////////////////////////////////////////////////////////////////////bool HitRoll::isSlayerSelfSkill( SkillType_t skillType ){ switch ( skillType ) { case SKILL_DANCING_SWORD: case SKILL_CROSS_COUNTER: case SKILL_EXPANSION: case SKILL_SHARP_SHIELD: case SKILL_GHOST_BLADE: case SKILL_POTENTIAL_EXPLOSION: case SKILL_CHARGING_POWER: case SKILL_BERSERKER: case SKILL_AIR_SHIELD: case SKILL_SNIPING: case SKILL_OBSERVING_EYE: case SKILL_CREATE_HOLY_WATER: case SKILL_LIGHT: case SKILL_DETECT_HIDDEN: case SKILL_BLESS: case SKILL_STRIKING: case SKILL_DETECT_INVISIBILITY: case SKILL_AURA_SHIELD: case SKILL_REFLECTION: case SKILL_REBUKE: case SKILL_SPIRIT_GUARD: case SKILL_CURE_LIGHT_WOUNDS: case SKILL_CURE_POISON: case SKILL_PROTECTION_FROM_POISON: case SKILL_CURE_SERIOUS_WOUNDS: case SKILL_REMOVE_CURSE: case SKILL_PROTECTION_FROM_CURSE: case SKILL_CURE_CRITICAL_WOUNDS: case SKILL_PROTECTION_FROM_ACID: case SKILL_CURE_ALL: case SKILL_PEACE: case SKILL_ACTIVATION: case SKILL_REGENERATION: case SKILL_TURN_UNDEAD: return true; default: return false; }}bool HitRoll::isOustersSelfSkill( SkillType_t skillType ){ switch ( skillType ) { case SKILL_EVADE: case SKILL_BLUNTING: case SKILL_CROSS_GUARD: case SKILL_SHARP_CHAKRAM: return true; default: return false; }}bool HitRoll::isSuccessHallucination( Vampire* pAttacker, Creature* pTarget ){ if ( pTarget->isMonster() ) return true; Attr_t attackTotalAttr = pAttacker->getSTR() + pAttacker->getDEX() + pAttacker->getINT(); Attr_t targetTotalAttr = 0; int minRatio = 0, maxRatio = 100; if ( pTarget->isSlayer() ) { Slayer* pTargetSlayer = dynamic_cast<Slayer*>(pTarget); targetTotalAttr = pTargetSlayer->getTotalAttr(); minRatio = 30; maxRatio = 60; } else if ( pTarget->isVampire() ) { Vampire* pTargetVampire = dynamic_cast<Vampire*>(pTarget); targetTotalAttr = pTargetVampire->getSTR() + pTargetVampire->getDEX() + pTargetVampire->getINT(); minRatio = 10; maxRatio = 40; } else if ( pTarget->isOusters() ) { Ousters* pTargetOusters = dynamic_cast<Ousters*>(pTarget); targetTotalAttr = pTargetOusters->getSTR() + pTargetOusters->getDEX() + pTargetOusters->getINT(); minRatio = 10; maxRatio = 50; } else return false; int Ratio = attackTotalAttr - targetTotalAttr; Ratio = max( minRatio, Ratio ); Ratio = min( maxRatio, Ratio ); return ( rand() % 100 ) < Ratio;}bool HitRoll::isSuccessBackStab( Ousters* pAttacker ){ int Ratio = min( 50, (pAttacker->getINT()/5) + (pAttacker->getDEX()/5) ); if ( rand() % 100 < Ratio ) return true; return false;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -