Example #1
0
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);
    }
}
Example #2
0
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));
}
Example #3
0
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);
	}
}
Example #4
0
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;
}
Example #5
0
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;
}
Example #6
0
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;
}
Example #7
0
uint16  CBattleEntity::EVA()
{
    return dsp_max(0, (m_modStat[MOD_EVA] * (100 + m_modStat[MOD_EVAP])) / 100 + AGI() / 2);
}
Example #8
0
uint16 CBattleEntity::CHR()
{
    return dsp_max(0, stats.CHR + m_modStat[MOD_CHR]);
}
Example #9
0
uint16 CBattleEntity::MND()
{
    return dsp_max(0, stats.MND + m_modStat[MOD_MND]);
}
Example #10
0
uint16 CBattleEntity::INT()
{
    return dsp_max(0, stats.INT + m_modStat[MOD_INT]);
}
Example #11
0
uint16 CBattleEntity::AGI()
{
    return dsp_max(0, stats.AGI + m_modStat[MOD_AGI]);
}
Example #12
0
uint16 CBattleEntity::VIT()
{
    return dsp_max(0, stats.VIT + m_modStat[MOD_VIT]);
}
Example #13
0
uint16 CBattleEntity::DEX()
{
    return dsp_max(0, stats.DEX + m_modStat[MOD_DEX]);
}
Example #14
0
uint16 CBattleEntity::STR()
{
    return dsp_max(0, stats.STR + m_modStat[MOD_STR]);
}
Example #15
0
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;
}