mirror of
https://github.com/SapphireServer/Sapphire.git
synced 2025-05-04 17:57:47 +00:00
Further improvement of damage calculations
This commit is contained in:
parent
76dfa7912e
commit
a5ba5bb2fb
3 changed files with 20 additions and 12 deletions
|
@ -133,3 +133,13 @@ float Util::eulerToDirection( const FFXIVARR_POSITION3 &euler )
|
||||||
|
|
||||||
return atan2f( v2, v1 );
|
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;
|
||||||
|
}
|
||||||
|
|
|
@ -21,6 +21,8 @@ namespace Sapphire::Common::Util
|
||||||
|
|
||||||
float calcAngFrom( float x, float y, float x1, float y1 );
|
float calcAngFrom( float x, float y, float x1, float y1 );
|
||||||
|
|
||||||
|
float trunc( float value, uint8_t digitsToRemain );
|
||||||
|
|
||||||
uint16_t floatToUInt16( float val );
|
uint16_t floatToUInt16( float val );
|
||||||
|
|
||||||
uint16_t floatToUInt16Rot( float val );
|
uint16_t floatToUInt16Rot( float val );
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
|
|
||||||
#include "Actor/Chara.h"
|
#include "Actor/Chara.h"
|
||||||
#include "Actor/Player.h"
|
#include "Actor/Player.h"
|
||||||
|
#include "Util/UtilMath.h"
|
||||||
|
|
||||||
#include "Inventory/Item.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 mainVal = static_cast< float >( levelTable[ level ][ Common::LevelTableEntry::MAIN ] );
|
||||||
auto divVal = static_cast< float >( levelTable[ level ][ Common::LevelTableEntry::DIV ] );
|
auto divVal = static_cast< float >( levelTable[ level ][ Common::LevelTableEntry::DIV ] );
|
||||||
|
|
||||||
// todo: not sure if its ( ap - mv ) / mv or ( ap - mv ) / dv
|
return Common::Util::trunc( static_cast< float >( attackPower ) / divVal + ( 1.0f - mainVal / divVal ), 2 );
|
||||||
return std::floor( ( 125.f * ( attackPower - mainVal ) / divVal ) + 100.f ) / 100.f;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
float CalcStats::getPrimaryAttackPower( const Sapphire::Entity::Chara& chara )
|
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 mainVal = static_cast< float >( levelTable[ level ][ Common::LevelTableEntry::MAIN ] );
|
||||||
auto divVal = static_cast< float >( levelTable[ level ][ Common::LevelTableEntry::DIV ] );
|
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 )
|
float CalcStats::tenacity( const Sapphire::Entity::Chara& chara )
|
||||||
|
@ -575,7 +575,7 @@ std::pair< float, Sapphire::Common::ActionHitSeverityType > CalcStats::calcAutoA
|
||||||
|
|
||||||
|
|
||||||
// todo: everything after tenacity
|
// 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;
|
Sapphire::Common::ActionHitSeverityType hitType = Sapphire::Common::ActionHitSeverityType::NormalDamage;
|
||||||
|
|
||||||
// todo: traits
|
// todo: traits
|
||||||
|
@ -624,11 +624,7 @@ std::pair< float, Sapphire::Common::ActionHitSeverityType > CalcStats::calcActio
|
||||||
auto ap = getPrimaryAttackPower( chara );
|
auto ap = getPrimaryAttackPower( chara );
|
||||||
auto det = determination( chara );
|
auto det = determination( chara );
|
||||||
|
|
||||||
auto ten = 1.f;
|
auto factor = Common::Util::trunc( pot * wd * ap * det, 0 );
|
||||||
if( chara.getRole() == Common::Role::Tank )
|
|
||||||
ten = tenacity( chara );
|
|
||||||
|
|
||||||
auto factor = std::floor( pot * wd * ap * det * ten );
|
|
||||||
Sapphire::Common::ActionHitSeverityType hitType = Sapphire::Common::ActionHitSeverityType::NormalDamage;
|
Sapphire::Common::ActionHitSeverityType hitType = Sapphire::Common::ActionHitSeverityType::NormalDamage;
|
||||||
|
|
||||||
if( criticalHitProbability( chara ) > range100( rng ) )
|
if( criticalHitProbability( chara ) > range100( rng ) )
|
||||||
|
@ -649,15 +645,15 @@ std::pair< float, Sapphire::Common::ActionHitSeverityType > CalcStats::calcActio
|
||||||
|
|
||||||
// todo: buffs
|
// 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() )
|
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
|
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 );
|
return std::pair( factor, hitType );
|
||||||
|
|
Loading…
Add table
Reference in a new issue