1
Fork 0
mirror of https://github.com/SapphireServer/Sapphire.git synced 2025-05-06 02:37:47 +00:00

Calculate and display character stats correctly

This commit is contained in:
Mordred 2019-03-20 21:29:34 +01:00
parent 704a9df6ed
commit 986a692fcd
2 changed files with 85 additions and 91 deletions

View file

@ -254,7 +254,6 @@ void Sapphire::Entity::Player::calculateStats()
auto tribeInfo = pExdData->get< Sapphire::Data::Tribe >( tribe );
auto paramGrowthInfo = pExdData->get< Sapphire::Data::ParamGrow >( level );
// TODO: put formula somewhere else...
float base = Math::CalcStats::calculateBaseStat( getAsPlayer() );
m_baseStats.str = static_cast< uint32_t >( base * ( static_cast< float >( classInfo->modifierStrength ) / 100 ) +
@ -270,6 +269,8 @@ void Sapphire::Entity::Player::calculateStats()
m_baseStats.pie = static_cast< uint32_t >( base * ( static_cast< float >( classInfo->modifierPiety ) / 100 ) +
tribeInfo->pIE );
m_baseStats.determination = static_cast< uint32_t >( base );
m_baseStats.pie = static_cast< uint32_t >( base );
m_baseStats.skillSpeed = paramGrowthInfo->baseSpeed;
m_baseStats.spellSpeed = paramGrowthInfo->baseSpeed;
m_baseStats.accuracy = paramGrowthInfo->baseSpeed;
@ -278,6 +279,10 @@ void Sapphire::Entity::Player::calculateStats()
m_baseStats.healingPotMagic = paramGrowthInfo->baseSpeed;
m_baseStats.tenacity = paramGrowthInfo->baseSpeed;
m_baseStats.attack = m_baseStats.str;
m_baseStats.attackPotMagic = m_baseStats.inte;
m_baseStats.healingPotMagic = m_baseStats.mnd;
m_baseStats.max_mp = Math::CalcStats::calculateMaxMp( getAsPlayer(), m_pFw );
m_baseStats.max_hp = Math::CalcStats::calculateMaxHp( getAsPlayer(), m_pFw );
@ -288,9 +293,6 @@ void Sapphire::Entity::Player::calculateStats()
if( m_hp > m_baseStats.max_hp )
m_hp = m_baseStats.max_hp;
m_baseStats.determination = static_cast< uint32_t >( base );
}
@ -327,10 +329,10 @@ void Sapphire::Entity::Player::sendStats()
statPacket->data().spellSpeed1 = m_baseStats.spellSpeed;
statPacket->data().spellSpeedMod = 100;
statPacket->data().criticalHitRate = m_baseStats.spellSpeed;
statPacket->data().defense = m_baseStats.spellSpeed;
statPacket->data().magicDefense = m_baseStats.spellSpeed;
statPacket->data().attack = m_baseStats.spellSpeed;
statPacket->data().criticalHitRate = m_baseStats.critHitRate;
statPacket->data().defense = m_baseStats.defense;
statPacket->data().magicDefense = m_baseStats.magicDefense;
statPacket->data().tenacity = m_baseStats.tenacity;
queuePacket( statPacket );
}

View file

@ -13,12 +13,12 @@
using namespace Sapphire::Math;
using namespace Sapphire::Entity;
const int levelTable[70][8] =
const int levelTable[70][7] =
{
// PIE, MP, MAIN,SUB,DIV,HP,ELMT,THREAT
{ 50, 104, 20, 56, 56, 0, 52, 2 },
{ 55, 114, 21, 57, 57, 0, 54, 2 },
{ 60, 123, 22, 60, 60, 0, 56, 3 },
{ 50, 104, 20, 56, 56, 0, 52 },
{ 55, 114, 21, 57, 57, 0, 54 },
{ 60, 123, 22, 60, 60, 0, 56 },
{ 65, 133, 24, 62, 62, 0, 58 },
{ 70, 142, 26, 65, 65, 0, 60 },
{ 75, 152, 27, 68, 68, 0, 62 },
@ -87,6 +87,7 @@ const int levelTable[70][8] =
{ 890, 11450, 284, 363, 1978, 3500, 294 },
{ 890, 12000, 292, 364, 2170, 3600, 295 }
};
/*
Class used for battle-related formulas and calculations.
Big thanks to the Theoryjerks group!
@ -111,19 +112,10 @@ float CalcStats::calculateBaseStat( PlayerPtr pPlayer )
float base = 0.0f;
uint8_t level = pPlayer->getLevel();
// SB Base Stat Formula (Aligned)
if( level > 60 )
{
base = static_cast< float >( ( ( ( level == 61 ) ? 224 : 220 ) + ( level - 61 ) * 8 ) );
}
// HW Base Stat Formula (Aligned)
else if( level > 50 )
base = 1.63f * level + 121.02f;
// ARR Base Stat Formula (Off by one in several cases)
else
base = 0.052602f * ( level * level ) + ( 1.0179f * level ) + 19.6f;
if( level > 70 )
level = 70;
return base;
return static_cast< float >( levelTable[level][2] );
}
// Leggerless' HP Formula