1
Fork 0
mirror of https://github.com/SapphireServer/Sapphire.git synced 2025-05-04 09:47:46 +00:00

Further improvement of damage calculations

This commit is contained in:
Mordred 2022-01-03 13:24:33 +01:00
parent 76dfa7912e
commit a5ba5bb2fb
3 changed files with 20 additions and 12 deletions

View file

@ -133,3 +133,13 @@ float Util::eulerToDirection( const FFXIVARR_POSITION3 &euler )
return atan2f( v2, v1 );
}
float Util::trunc( float value, uint8_t digitsToRemain )
{
if( digitsToRemain == 0 )
return std::floor( value );
float factor = std::pow( 10, digitsToRemain );
return std::floor( value * factor ) / factor;
}

View file

@ -21,6 +21,8 @@ namespace Sapphire::Common::Util
float calcAngFrom( float x, float y, float x1, float y1 );
float trunc( float value, uint8_t digitsToRemain );
uint16_t floatToUInt16( float val );
uint16_t floatToUInt16Rot( float val );

View file

@ -7,6 +7,7 @@
#include "Actor/Chara.h"
#include "Actor/Player.h"
#include "Util/UtilMath.h"
#include "Inventory/Item.h"
@ -408,8 +409,7 @@ float CalcStats::calcAttackPower( const Sapphire::Entity::Chara& chara, uint32_t
auto mainVal = static_cast< float >( levelTable[ level ][ Common::LevelTableEntry::MAIN ] );
auto divVal = static_cast< float >( levelTable[ level ][ Common::LevelTableEntry::DIV ] );
// todo: not sure if its ( ap - mv ) / mv or ( ap - mv ) / dv
return std::floor( ( 125.f * ( attackPower - mainVal ) / divVal ) + 100.f ) / 100.f;
return Common::Util::trunc( static_cast< float >( attackPower ) / divVal + ( 1.0f - mainVal / divVal ), 2 );
}
float CalcStats::getPrimaryAttackPower( const Sapphire::Entity::Chara& chara )
@ -456,7 +456,7 @@ float CalcStats::determination( const Sapphire::Entity::Chara& chara )
auto mainVal = static_cast< float >( levelTable[ level ][ Common::LevelTableEntry::MAIN ] );
auto divVal = static_cast< float >( levelTable[ level ][ Common::LevelTableEntry::DIV ] );
return std::floor( 130.f * ( chara.getStatValue( Common::BaseParam::Determination ) - mainVal ) / divVal + 1000.f ) / 1000.f;
return Common::Util::trunc( 1.0f + ( chara.getStatValue( Common::BaseParam::Determination ) - mainVal ) / divVal, 3 );
}
float CalcStats::tenacity( const Sapphire::Entity::Chara& chara )
@ -575,7 +575,7 @@ std::pair< float, Sapphire::Common::ActionHitSeverityType > CalcStats::calcAutoA
// todo: everything after tenacity
auto factor = std::floor( pot * aa * ap * det );
auto factor = Common::Util::trunc( pot * aa * ap * det, 0 );
Sapphire::Common::ActionHitSeverityType hitType = Sapphire::Common::ActionHitSeverityType::NormalDamage;
// todo: traits
@ -624,11 +624,7 @@ std::pair< float, Sapphire::Common::ActionHitSeverityType > CalcStats::calcActio
auto ap = getPrimaryAttackPower( chara );
auto det = determination( chara );
auto ten = 1.f;
if( chara.getRole() == Common::Role::Tank )
ten = tenacity( chara );
auto factor = std::floor( pot * wd * ap * det * ten );
auto factor = Common::Util::trunc( pot * wd * ap * det, 0 );
Sapphire::Common::ActionHitSeverityType hitType = Sapphire::Common::ActionHitSeverityType::NormalDamage;
if( criticalHitProbability( chara ) > range100( rng ) )
@ -649,15 +645,15 @@ std::pair< float, Sapphire::Common::ActionHitSeverityType > CalcStats::calcActio
// todo: buffs
constexpr auto format = "dmg: pot: {} ({}) wd: {} ({}) ap: {} det: {} ten: {} = {}";
constexpr auto format = "dmg: pot: {} ({}) wd: {} ({}) ap: {} det: {} = {}";
if( auto player = const_cast< Entity::Chara& >( chara ).getAsPlayer() )
{
PlayerMgr::sendDebug( *player, format, pot, ptc, wd, wepDmg, ap, det, ten, factor );
PlayerMgr::sendDebug( *player, format, pot, ptc, wd, wepDmg, ap, det, factor );
}
else
{
Logger::debug( format, pot, ptc, wd, wepDmg, ap, det, ten, factor );
Logger::debug( format, pot, ptc, wd, wepDmg, ap, det, factor );
}
return std::pair( factor, hitType );