uint16 CBattleEntity::ACC(uint8 attackNumber, uint8 offsetAccuracy) { if (this->objtype & TYPE_PC) { uint8 skill = 0; uint16 iLvlSkill = 0; if (attackNumber == 0) { skill = m_Weapons[SLOT_MAIN]->getSkillType(); iLvlSkill = m_Weapons[SLOT_MAIN]->getILvlSkill(); if (skill == SKILL_NON && GetSkill(SKILL_H2H) > 0) skill = SKILL_H2H; } else if (attackNumber == 1) { skill = m_Weapons[SLOT_SUB]->getSkillType(); iLvlSkill = m_Weapons[SLOT_SUB]->getILvlSkill(); if (skill == SKILL_NON && GetSkill(SKILL_H2H) > 0 && (m_Weapons[SLOT_MAIN]->getSkillType() == SKILL_NON || m_Weapons[SLOT_MAIN]->getSkillType() == SKILL_H2H)) skill = SKILL_H2H; } else if (attackNumber == 2) { iLvlSkill = m_Weapons[SLOT_MAIN]->getILvlSkill(); skill = SKILL_H2H; } int16 ACC = GetSkill(skill) + iLvlSkill; ACC = (ACC > 200 ? (((ACC - 200)*0.9) + 200) : ACC); if (m_Weapons[SLOT_MAIN]->isTwoHanded() == true) { ACC += DEX() * 0.75; } else { ACC += DEX() * 0.5; } ACC = (ACC + m_modStat[MOD_ACC] + offsetAccuracy); ACC = ACC + (ACC * m_modStat[MOD_ACCP] / 100) + dsp_min((ACC * m_modStat[MOD_FOOD_ACCP] / 100), m_modStat[MOD_FOOD_ACC_CAP]); return dsp_max(0, ACC); } else if (this->objtype == TYPE_PET && ((CPetEntity*)this)->getPetType() == PETTYPE_AUTOMATON) { int16 ACC = PMaster->GetSkill(SKILL_AME); ACC = (ACC > 200 ? (((ACC - 200)*0.9) + 200) : ACC); ACC += DEX() * 0.5; ACC += m_modStat[MOD_ACC] + offsetAccuracy + ((CCharEntity*)PMaster)->PMeritPoints->GetMeritValue(MERIT_FINE_TUNING, (CCharEntity*)PMaster); ACC = ACC + (ACC * m_modStat[MOD_ACCP] / 100) + dsp_min((ACC * m_modStat[MOD_FOOD_ACCP] / 100), m_modStat[MOD_FOOD_ACC_CAP]); return dsp_max(0, ACC); } else { int16 ACC = m_modStat[MOD_ACC]; ACC = ACC + (ACC * m_modStat[MOD_ACCP] / 100) + dsp_min((ACC * m_modStat[MOD_FOOD_ACCP] / 100), m_modStat[MOD_FOOD_ACC_CAP]) + DEX() / 2; //food mods here for Snatch Morsel return dsp_max(0, ACC); } }
uint16 CBattleEntity::EVA() { int16 evasion = GetSkill(SKILL_EVA); if (evasion > 200) { //Evasion skill is 0.9 evasion post-200 evasion = 200 + (evasion - 200)*0.9; } return dsp_max(0, (m_modStat[MOD_EVA] + evasion + AGI() / 2) * ((100 + m_modStat[MOD_EVAP]) / 100)); }
uint16 CBattleEntity::ACC(uint8 attackNumber, uint8 offsetAccuracy) { if (this->objtype & TYPE_PC){ uint8 skill = 0; if (attackNumber == 0) { skill = m_Weapons[SLOT_MAIN]->getSkillType(); if(skill == SKILL_NON && GetSkill(SKILL_H2H) > 0) skill = SKILL_H2H; } else if (attackNumber == 1) { skill = m_Weapons[SLOT_SUB]->getSkillType(); if(skill == SKILL_NON && GetSkill(SKILL_H2H) > 0 && (m_Weapons[SLOT_MAIN]->getSkillType() == SKILL_NON || m_Weapons[SLOT_MAIN]->getSkillType() == SKILL_H2H)) skill = SKILL_H2H; } else if (attackNumber == 2) { skill = SKILL_H2H; } int16 ACC = GetSkill(skill); ACC = (ACC > 200 ? (((ACC - 200)*0.9)+200) : ACC); if(m_Weapons[SLOT_MAIN]->isTwoHanded() == true) { ACC += DEX() * 0.75; } else { ACC += DEX() * 0.5; } ACC = (ACC + m_modStat[MOD_ACC] + offsetAccuracy); ACC = ACC + (ACC * m_modStat[MOD_ACCP] / 100) + dsp_min((ACC * m_modStat[MOD_FOOD_ACCP] / 100), m_modStat[MOD_FOOD_ACC_CAP]); return dsp_max(0, ACC); } else{ int16 ACC = m_modStat[MOD_ACC]; ACC = ACC + (ACC * m_modStat[MOD_ACCP] / 100) + dsp_min((ACC * m_modStat[MOD_FOOD_ACCP] / 100), m_modStat[MOD_FOOD_ACC_CAP]) + DEX() / 2; //food mods here for Snatch Morsel return dsp_max(0, ACC); } }
inline int32 CLuaStatusEffect::getTimeRemaining(lua_State* L) { DSP_DEBUG_BREAK_IF(m_PLuaStatusEffect == NULL); uint32 remaining = 0; if (m_PLuaStatusEffect->GetStartTime() > 0) { remaining = dsp_max(m_PLuaStatusEffect->GetDuration() - (gettick() - m_PLuaStatusEffect->GetStartTime()), 0); } lua_pushinteger(L, remaining); return 1; }
inline int32 CLuaStatusEffect::getTimeRemaining(lua_State* L) { DSP_DEBUG_BREAK_IF(m_PLuaStatusEffect == nullptr); uint32 remaining = 0; if (m_PLuaStatusEffect->GetDuration() > 0) { remaining = dsp_max(m_PLuaStatusEffect->GetDuration() - std::chrono::duration_cast<std::chrono::milliseconds>(server_clock::now() - m_PLuaStatusEffect->GetStartTime()).count(), 0); } lua_pushinteger(L, remaining); return 1; }
uint32 CMagicState::CalculateRecastTime(CSpell* PSpell) { if(PSpell == NULL) { return 0; } bool applyArts = true; uint32 base = PSpell->getRecastTime(); uint32 recast = base; //apply Fast Cast recast *= ((100.0f-dsp_cap((float)m_PEntity->getMod(MOD_FASTCAST)/2.0f,0.0f,25.0f))/100.0f); int16 haste = m_PEntity->getMod(MOD_HASTE_MAGIC) + m_PEntity->getMod(MOD_HASTE_GEAR); recast *= ((float)(1024-haste)/1024); recast = dsp_max(recast, base * 0.2f); if (m_PEntity->StatusEffectContainer->HasStatusEffect(EFFECT_COMPOSURE)) { recast *= 1.25; } if (PSpell->getSpellGroup() == SPELLGROUP_BLACK) { if (PSpell->getAOE() == SPELLAOE_RADIAL_MANI && m_PEntity->StatusEffectContainer->HasStatusEffect(EFFECT_MANIFESTATION)) { if (m_PEntity->GetMJob() == JOB_SCH) { recast *= 2; } else { recast *= 3; } applyArts = false; } if (m_PEntity->StatusEffectContainer->HasStatusEffect(EFFECT_ALACRITY)) { uint16 bonus = 0; //Only apply Alacrity/celerity mod if the spell element matches the weather. if (battleutils::WeatherMatchesElement(battleutils::GetWeather(m_PEntity,false), PSpell->getElement())) { bonus = m_PEntity->getMod(MOD_ALACRITY_CELERITY_EFFECT); } recast *= ((50 - bonus) / 100.0f); applyArts = false; } if (applyArts) { if (m_PEntity->StatusEffectContainer->HasStatusEffect(EFFECT_DARK_ARTS) || m_PEntity->StatusEffectContainer->HasStatusEffect(EFFECT_ADDENDUM_BLACK)) { // Add any "Grimoire: Reduces spellcasting time" bonuses recast *= (1.0f + (m_PEntity->getMod(MOD_BLACK_MAGIC_RECAST)+m_PEntity->getMod(MOD_GRIMOIRE_SPELLCASTING))/100.0f); } else { recast *= (1.0f + m_PEntity->getMod(MOD_BLACK_MAGIC_RECAST)/100.0f); } } } else if (PSpell->getSpellGroup() == SPELLGROUP_WHITE) { if (PSpell->getAOE() == SPELLAOE_RADIAL_ACCE && m_PEntity->StatusEffectContainer->HasStatusEffect(EFFECT_ACCESSION)) { if (m_PEntity->GetMJob() == JOB_SCH) { recast *= 2; } else { recast *= 3; } applyArts = false; } if (m_PEntity->StatusEffectContainer->HasStatusEffect(EFFECT_CELERITY)) { uint16 bonus = 0; //Only apply Alacrity/celerity mod if the spell element matches the weather. if (battleutils::WeatherMatchesElement(battleutils::GetWeather(m_PEntity, true), PSpell->getElement())) { bonus = m_PEntity->getMod(MOD_ALACRITY_CELERITY_EFFECT); } recast *= ((50 - bonus) / 100.0f); applyArts = false; } if (applyArts) { if (m_PEntity->StatusEffectContainer->HasStatusEffect(EFFECT_LIGHT_ARTS) || m_PEntity->StatusEffectContainer->HasStatusEffect(EFFECT_ADDENDUM_WHITE)) { // Add any "Grimoire: Reduces spellcasting time" bonuses recast *= (1.0f + (m_PEntity->getMod(MOD_WHITE_MAGIC_RECAST)+m_PEntity->getMod(MOD_GRIMOIRE_SPELLCASTING))/100.0f); } else { recast *= (1.0f + m_PEntity->getMod(MOD_WHITE_MAGIC_RECAST)/100.0f); } } } else if (PSpell->getSpellGroup() == SPELLGROUP_SONG) { if (m_PEntity->StatusEffectContainer->HasStatusEffect(EFFECT_NIGHTINGALE)) { recast *= 0.5f; } } return recast; }
uint16 CBattleEntity::EVA() { return dsp_max(0, (m_modStat[MOD_EVA] * (100 + m_modStat[MOD_EVAP])) / 100 + AGI() / 2); }
uint16 CBattleEntity::CHR() { return dsp_max(0, stats.CHR + m_modStat[MOD_CHR]); }
uint16 CBattleEntity::MND() { return dsp_max(0, stats.MND + m_modStat[MOD_MND]); }
uint16 CBattleEntity::INT() { return dsp_max(0, stats.INT + m_modStat[MOD_INT]); }
uint16 CBattleEntity::AGI() { return dsp_max(0, stats.AGI + m_modStat[MOD_AGI]); }
uint16 CBattleEntity::VIT() { return dsp_max(0, stats.VIT + m_modStat[MOD_VIT]); }
uint16 CBattleEntity::DEX() { return dsp_max(0, stats.DEX + m_modStat[MOD_DEX]); }
uint16 CBattleEntity::STR() { return dsp_max(0, stats.STR + m_modStat[MOD_STR]); }
uint32 CMagicState::CalculateRecastTime(CSpell* PSpell) { if(PSpell == NULL) { return 0; } bool applyArts = true; uint32 base = PSpell->getRecastTime(); uint32 recast = base; //apply Fast Cast recast *= ((100.0f-dsp_cap((float)m_PEntity->getMod(MOD_FASTCAST)/2.0f,0.0f,25.0f))/100.0f); int16 haste = m_PEntity->getMod(MOD_HASTE_MAGIC) + m_PEntity->getMod(MOD_HASTE_GEAR); recast *= ((float)(1024-haste)/1024); recast = dsp_max(recast, base * 0.2f); if (m_PEntity->StatusEffectContainer->HasStatusEffect(EFFECT_COMPOSURE)) { recast *= 1.25; } if (PSpell->getSpellGroup() == SPELLGROUP_BLACK) { if (PSpell->getAOE() == SPELLAOE_RADIAL_MANI && m_PEntity->StatusEffectContainer->HasStatusEffect(EFFECT_MANIFESTATION)) { if (m_PEntity->GetMJob() == JOB_SCH) { recast *= 2; } else { recast *= 3; } applyArts = false; } if (m_PEntity->StatusEffectContainer->HasStatusEffect(EFFECT_ALACRITY)) { uint16 bonus = m_PEntity->getMod(MOD_ALACRITY_CELERITY_EFFECT); recast *= ((50 - bonus) / 100.0f); applyArts = false; } if (applyArts) { recast *= (1.0f + m_PEntity->getMod(MOD_BLACK_MAGIC_RECAST)/100.0f); } } else if (PSpell->getSpellGroup() == SPELLGROUP_WHITE) { if (PSpell->getAOE() == SPELLAOE_RADIAL_ACCE && m_PEntity->StatusEffectContainer->HasStatusEffect(EFFECT_ACCESSION)) { if (m_PEntity->GetMJob() == JOB_SCH) { recast *= 2; } else { recast *= 3; } applyArts = false; } if (m_PEntity->StatusEffectContainer->HasStatusEffect(EFFECT_CELERITY)) { uint16 bonus = m_PEntity->getMod(MOD_ALACRITY_CELERITY_EFFECT); recast *= ((50 - bonus) / 100.0f); applyArts = false; } if (applyArts) { recast *= (1.0f + m_PEntity->getMod(MOD_WHITE_MAGIC_RECAST)/100.0f); } } else if (PSpell->getSpellGroup() == SPELLGROUP_SONG) { if (m_PEntity->StatusEffectContainer->HasStatusEffect(EFFECT_NIGHTINGALE)) { recast *= 0.5f; } } return recast; }