Skip to content

Commit

Permalink
Support for hundredths after the decimal point (otland#4524)
Browse files Browse the repository at this point in the history
  • Loading branch information
ArturKnopik committed Sep 16, 2023
1 parent 419124f commit feda3fe
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 22 deletions.
7 changes: 4 additions & 3 deletions src/iologindata.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -294,7 +294,8 @@ bool IOLoginData::loadPlayer(Player* player, DBResult_ptr result)
player->experience = experience;

if (currExpCount < nextExpCount) {
player->levelPercent = Player::getPercentLevel(player->experience - currExpCount, nextExpCount - currExpCount);
player->levelPercent = static_cast<uint8_t>(
Player::getBasisPointLevel(player->experience - currExpCount, nextExpCount - currExpCount) / 100);
} else {
player->levelPercent = 0;
}
Expand Down Expand Up @@ -334,7 +335,7 @@ bool IOLoginData::loadPlayer(Player* player, DBResult_ptr result)
}

player->manaSpent = manaSpent;
player->magLevelPercent = Player::getPercentLevel(player->manaSpent, nextManaCount);
player->magLevelPercent = Player::getBasisPointLevel(player->manaSpent, nextManaCount);

player->health = result->getNumber<int32_t>("health");
player->healthMax = result->getNumber<int32_t>("healthmax");
Expand Down Expand Up @@ -411,7 +412,7 @@ bool IOLoginData::loadPlayer(Player* player, DBResult_ptr result)

player->skills[i].level = skillLevel;
player->skills[i].tries = skillTries;
player->skills[i].percent = Player::getPercentLevel(skillTries, nextSkillTries);
player->skills[i].percent = Player::getBasisPointLevel(skillTries, nextSkillTries);
}

if ((result = db.storeQuery(
Expand Down
24 changes: 12 additions & 12 deletions src/player.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -515,7 +515,7 @@ void Player::addSkillAdvance(skills_t skill, uint64_t count)

uint32_t newPercent;
if (nextReqTries > currReqTries) {
newPercent = Player::getPercentLevel(skills[skill].tries, nextReqTries);
newPercent = Player::getBasisPointLevel(skills[skill].tries, nextReqTries);
} else {
newPercent = 0;
}
Expand Down Expand Up @@ -551,7 +551,7 @@ void Player::removeSkillTries(skills_t skill, uint64_t count, bool notify /* = f

skills[skill].tries = std::max<int32_t>(0, skills[skill].tries - count);
skills[skill].percent =
Player::getPercentLevel(skills[skill].tries, vocation->getReqSkillTries(skill, skills[skill].level));
Player::getBasisPointLevel(skills[skill].tries, vocation->getReqSkillTries(skill, skills[skill].level));

if (notify) {
bool sendUpdateSkills = false;
Expand Down Expand Up @@ -1683,7 +1683,7 @@ void Player::addManaSpent(uint64_t amount)

uint8_t oldPercent = magLevelPercent;
if (nextReqMana > currReqMana) {
magLevelPercent = Player::getPercentLevel(manaSpent, nextReqMana);
magLevelPercent = Player::getBasisPointLevel(manaSpent, nextReqMana);
} else {
magLevelPercent = 0;
}
Expand Down Expand Up @@ -1717,7 +1717,7 @@ void Player::removeManaSpent(uint64_t amount, bool notify /* = false*/)

uint64_t nextReqMana = vocation->getReqMana(magLevel + 1);
if (nextReqMana > vocation->getReqMana(magLevel)) {
magLevelPercent = Player::getPercentLevel(manaSpent, nextReqMana);
magLevelPercent = Player::getBasisPointLevel(manaSpent, nextReqMana);
} else {
magLevelPercent = 0;
}
Expand Down Expand Up @@ -1798,7 +1798,7 @@ void Player::addExperience(Creature* source, uint64_t exp, bool sendText /* = fa
}

if (nextLevelExp > currLevelExp) {
levelPercent = Player::getPercentLevel(experience - currLevelExp, nextLevelExp - currLevelExp);
levelPercent = Player::getBasisPointLevel(experience - currLevelExp, nextLevelExp - currLevelExp) / 100;
} else {
levelPercent = 0;
}
Expand Down Expand Up @@ -1881,7 +1881,7 @@ void Player::removeExperience(uint64_t exp, bool sendText /* = false*/)

uint64_t nextLevelExp = Player::getExpForLevel(level + 1);
if (nextLevelExp > currLevelExp) {
levelPercent = Player::getPercentLevel(experience - currLevelExp, nextLevelExp - currLevelExp);
levelPercent = Player::getBasisPointLevel(experience - currLevelExp, nextLevelExp - currLevelExp) / 100;
} else {
levelPercent = 0;
}
Expand All @@ -1890,14 +1890,14 @@ void Player::removeExperience(uint64_t exp, bool sendText /* = false*/)
sendExperienceTracker(0, -static_cast<int64_t>(exp));
}

uint8_t Player::getPercentLevel(uint64_t count, uint64_t nextLevelCount)
uint16_t Player::getBasisPointLevel(uint64_t count, uint64_t nextLevelCount)
{
if (nextLevelCount == 0) {
return 0;
}

uint8_t result = (count * 100) / nextLevelCount;
if (result > 100) {
uint16_t result = ((count * 10000.) / nextLevelCount);
if (result > 10000) {
return 0;
}
return result;
Expand Down Expand Up @@ -2128,7 +2128,7 @@ void Player::death(Creature* lastHitCreature)
uint64_t currLevelExp = Player::getExpForLevel(level);
uint64_t nextLevelExp = Player::getExpForLevel(level + 1);
if (nextLevelExp > currLevelExp) {
levelPercent = Player::getPercentLevel(experience - currLevelExp, nextLevelExp - currLevelExp);
levelPercent = Player::getBasisPointLevel(experience - currLevelExp, nextLevelExp - currLevelExp) / 100;
} else {
levelPercent = 0;
}
Expand Down Expand Up @@ -4496,7 +4496,7 @@ bool Player::addOfflineTrainingTries(skills_t skill, uint64_t tries)

uint8_t newPercent;
if (nextReqMana > currReqMana) {
newPercent = Player::getPercentLevel(manaSpent, nextReqMana);
newPercent = Player::getBasisPointLevel(manaSpent, nextReqMana);
newPercentToNextLevel = static_cast<long double>(manaSpent * 100) / nextReqMana;
} else {
newPercent = 0;
Expand Down Expand Up @@ -4550,7 +4550,7 @@ bool Player::addOfflineTrainingTries(skills_t skill, uint64_t tries)

uint8_t newPercent;
if (nextReqTries > currReqTries) {
newPercent = Player::getPercentLevel(skills[skill].tries, nextReqTries);
newPercent = Player::getBasisPointLevel(skills[skill].tries, nextReqTries);
newPercentToNextLevel = static_cast<long double>(skills[skill].tries * 100) / nextReqTries;
} else {
newPercent = 0;
Expand Down
10 changes: 5 additions & 5 deletions src/player.h
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ struct Skill
{
uint64_t tries = 0;
uint16_t level = MINIMUM_SKILL_LEVEL;
uint8_t percent = 0;
uint16_t percent = 0;
};

using MuteCountMap = std::map<uint32_t, uint32_t>;
Expand Down Expand Up @@ -282,7 +282,7 @@ class Player final : public Creature, public Cylinder
return std::max<int32_t>(0, specialMagicLevelSkill[combatTypeToIndex(type)]);
}
uint32_t getBaseMagicLevel() const { return magLevel; }
uint8_t getMagicLevelPercent() const { return magLevelPercent; }
uint16_t getMagicLevelPercent() const { return magLevelPercent; }
uint8_t getSoul() const { return soul; }
bool isAccessPlayer() const { return group->access; }
bool isPremium() const;
Expand Down Expand Up @@ -463,7 +463,7 @@ class Player final : public Creature, public Cylinder
return std::max<int32_t>(0, specialMagicLevelSkill[combatTypeToIndex(type)]);
}
uint16_t getBaseSkill(uint8_t skill) const { return skills[skill].level; }
uint8_t getSkillPercent(uint8_t skill) const { return skills[skill].percent; }
uint16_t getSkillPercent(uint8_t skill) const { return skills[skill].percent; }

bool getAddAttackSkill() const { return addAttackSkillPoint; }
BlockType_t getLastAttackBlockType() const { return lastAttackBlockType; }
Expand Down Expand Up @@ -1271,7 +1271,7 @@ class Player final : public Creature, public Cylinder
uint8_t soul = 0;
std::bitset<6> blessings;
uint8_t levelPercent = 0;
uint8_t magLevelPercent = 0;
uint16_t magLevelPercent = 0;

PlayerSex_t sex = PLAYERSEX_FEMALE;
OperatingSystem_t operatingSystem = CLIENTOS_NONE;
Expand Down Expand Up @@ -1312,7 +1312,7 @@ class Player final : public Creature, public Cylinder

uint32_t getAttackSpeed() const;

static uint8_t getPercentLevel(uint64_t count, uint64_t nextLevelCount);
static uint16_t getBasisPointLevel(uint64_t count, uint64_t nextLevelCount);
double getLostPercent() const;
uint64_t getLostExperience() const override
{
Expand Down
4 changes: 2 additions & 2 deletions src/protocolgame.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3600,13 +3600,13 @@ void ProtocolGame::AddPlayerSkills(NetworkMessage& msg)
msg.add<uint16_t>(player->getMagicLevel());
msg.add<uint16_t>(player->getBaseMagicLevel());
msg.add<uint16_t>(player->getBaseMagicLevel()); // base + loyalty bonus(?)
msg.add<uint16_t>(player->getMagicLevelPercent() * 100);
msg.add<uint16_t>(player->getMagicLevelPercent());

for (uint8_t i = SKILL_FIRST; i <= SKILL_LAST; ++i) {
msg.add<uint16_t>(std::min<int32_t>(player->getSkillLevel(i), std::numeric_limits<uint16_t>::max()));
msg.add<uint16_t>(player->getBaseSkill(i));
msg.add<uint16_t>(player->getBaseSkill(i)); // base + loyalty bonus(?)
msg.add<uint16_t>(player->getSkillPercent(i) * 100);
msg.add<uint16_t>(player->getSkillPercent(i));
}

for (uint8_t i = SPECIALSKILL_FIRST; i <= SPECIALSKILL_LAST; ++i) {
Expand Down

0 comments on commit feda3fe

Please sign in to comment.