1
Fork 0
mirror of https://github.com/SapphireServer/Sapphire.git synced 2025-04-27 06:47:45 +00:00

Dmg calc reworked

This commit is contained in:
Mordred 2022-01-02 23:31:02 +01:00
parent d9e7e42a6d
commit 76dfa7912e

View file

@ -314,7 +314,7 @@ float CalcStats::criticalHitProbability( const Chara& chara )
float CalcStats::potency( uint16_t potency ) float CalcStats::potency( uint16_t potency )
{ {
return potency / 100.f; return static_cast< float >( potency ) / 100.f;
} }
float CalcStats::autoAttackPotency( const Sapphire::Entity::Chara& chara ) float CalcStats::autoAttackPotency( const Sapphire::Entity::Chara& chara )
@ -342,7 +342,7 @@ float CalcStats::autoAttackPotency( const Sapphire::Entity::Chara& chara )
// factors in f(PTC) in order to not lose precision // factors in f(PTC) in order to not lose precision
//return std::floor( aaPotency / 3.f * autoAttackDelay ) / 100.f; //return std::floor( aaPotency / 3.f * autoAttackDelay ) / 100.f;
return std::floor( aaPotency / 100.f ); return aaPotency / 100.f;
} }
float CalcStats::weaponDamage( const Sapphire::Entity::Chara& chara, float weaponDamage ) float CalcStats::weaponDamage( const Sapphire::Entity::Chara& chara, float weaponDamage )
@ -352,30 +352,54 @@ float CalcStats::weaponDamage( const Sapphire::Entity::Chara& chara, float weapo
auto mainVal = static_cast< float >( levelTable[ level ][ Common::LevelTableEntry::MAIN ] ); auto mainVal = static_cast< float >( levelTable[ level ][ Common::LevelTableEntry::MAIN ] );
uint32_t jobAttribute = 1; uint32_t jobMod = 1;
auto& exdData = Common::Service< Data::ExdData >::ref();
auto classInfo = exdData.getRow< Component::Excel::ClassJob >( static_cast< uint8_t >( chara.getClass() ) );
if( !classInfo )
return 0.f;
switch( chara.getPrimaryStat() ) switch( chara.getPrimaryStat() )
{ {
case Common::BaseParam::Intelligence: case Common::BaseParam::Intelligence:
{ {
// todo: wtf did i do here??? healing magic potency/ why ythr fuc? jobMod = classInfo->data().INT_;
jobAttribute = chara.getStatValue( Common::BaseParam::HealingMagicPotency );
break; break;
} }
case Common::BaseParam::Mind: case Common::BaseParam::Mind:
{ {
jobAttribute = chara.getStatValue( Common::BaseParam::AttackMagicPotency );; jobMod = classInfo->data().MND;
break;
}
case Common::BaseParam::Strength:
{
jobMod = classInfo->data().STR;
break;
}
case Common::BaseParam::Dexterity:
{
jobMod = classInfo->data().DEX;
break;
}
case Common::BaseParam::Vitality:
{
jobMod = classInfo->data().VIT;
break;
}
case Common::BaseParam::Piety:
{
jobMod = classInfo->data().PIE;
break; break;
} }
default: default:
{ {
jobAttribute = chara.getStatValue( Common::BaseParam::AttackPower ); jobMod = 100;
break; break;
} }
} }
return std::floor( ( ( mainVal * jobAttribute ) / 1000.f ) + weaponDamage ); return ( std::floor( mainVal * jobMod / 1000.f ) + weaponDamage );
} }
float CalcStats::calcAttackPower( const Sapphire::Entity::Chara& chara, uint32_t attackPower ) float CalcStats::calcAttackPower( const Sapphire::Entity::Chara& chara, uint32_t attackPower )
@ -510,7 +534,7 @@ float CalcStats::autoAttack( const Sapphire::Entity::Chara& chara )
{ {
// todo: default values for NPCs, not sure what we should have here // todo: default values for NPCs, not sure what we should have here
float autoAttackDelay = 2.f; float autoAttackDelay = 2.f;
float weaponDamage = 10.f; float dmg = 10.f;
// fetch actual auto attack delay if its a player // fetch actual auto attack delay if its a player
if( chara.isPlayer() ) if( chara.isPlayer() )
@ -523,13 +547,13 @@ float CalcStats::autoAttack( const Sapphire::Entity::Chara& chara )
assert( pItem ); assert( pItem );
autoAttackDelay = pItem->getDelay() / 1000.f; autoAttackDelay = pItem->getDelay() / 1000.f;
weaponDamage = pItem->getWeaponDmg(); dmg = pItem->getWeaponDmg();
} }
auto level = chara.getLevel(); auto level = chara.getLevel();
auto mainVal = static_cast< float >( levelTable[ level ][ Common::LevelTableEntry::MAIN ] ); auto mainVal = static_cast< float >( levelTable[ level ][ Common::LevelTableEntry::MAIN ] );
auto innerCalc = std::floor( ( mainVal * static_cast< float >( primaryStatValue( chara ) ) / 1000.f ) + weaponDamage ); auto innerCalc = weaponDamage( chara, dmg );
return std::floor( innerCalc * ( autoAttackDelay / 3.f ) ); return std::floor( innerCalc * ( autoAttackDelay / 3.f ) );
} }