Browse Source

Refactor CreatePlayer() (#6288)

pull/6289/head^2
Eric Robinson 3 years ago committed by GitHub
parent
commit
a2af3b5942
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 51
      Source/player.cpp
  2. 6
      Source/player.h
  3. 14
      Source/playerdat.cpp
  4. 16
      Source/playerdat.hpp

51
Source/player.cpp

@ -2055,6 +2055,18 @@ void Player::UpdatePreviewCelSprite(_cmd_id cmdId, Point point, uint16_t wParam1
} }
} }
int32_t Player::calculateBaseLife() const
{
const PlayerData playerData = PlayersData[static_cast<size_t>(_pClass)];
return playerData.adjLife + (playerData.lvlLife * _pLevel) + (playerData.chrLife * _pBaseVit);
}
int32_t Player::calculateBaseMana() const
{
const PlayerData playerData = PlayersData[static_cast<size_t>(_pClass)];
return playerData.adjMana + (playerData.lvlMana * _pLevel) + (playerData.chrMana * _pBaseMag);
}
Player *PlayerAtPosition(Point position) Player *PlayerAtPosition(Point position)
{ {
if (!InDungeonBounds(position)) if (!InDungeonBounds(position))
@ -2265,44 +2277,31 @@ void CreatePlayer(Player &player, HeroClass c)
player = {}; player = {};
SetRndSeed(SDL_GetTicks()); SetRndSeed(SDL_GetTicks());
PlayerData playerData = PlayersData[static_cast<size_t>(c)];
player._pLevel = 1;
player._pClass = c; player._pClass = c;
player._pBaseStr = PlayersData[static_cast<std::size_t>(c)].baseStr; player._pBaseStr = playerData.baseStr;
player._pStrength = player._pBaseStr; player._pStrength = player._pBaseStr;
player._pBaseMag = PlayersData[static_cast<std::size_t>(c)].baseMag; player._pBaseMag = playerData.baseMag;
player._pMagic = player._pBaseMag; player._pMagic = player._pBaseMag;
player._pBaseDex = PlayersData[static_cast<std::size_t>(c)].baseDex; player._pBaseDex = playerData.baseDex;
player._pDexterity = player._pBaseDex; player._pDexterity = player._pBaseDex;
player._pBaseVit = PlayersData[static_cast<std::size_t>(c)].baseVit; player._pBaseVit = playerData.baseVit;
player._pVitality = player._pBaseVit; player._pVitality = player._pBaseVit;
player._pLevel = 1; player._pBaseToBlk = playerData.blockBonus;
player._pBaseToBlk = PlayersData[static_cast<std::size_t>(c)].blockBonus;
player._pHitPoints = (player._pVitality + 10) << 6;
if (player._pClass == HeroClass::Warrior || player._pClass == HeroClass::Barbarian) {
player._pHitPoints *= 2;
} else if (player._pClass == HeroClass::Rogue || player._pClass == HeroClass::Monk || player._pClass == HeroClass::Bard) {
player._pHitPoints += player._pHitPoints / 2;
}
player._pHitPoints = player.calculateBaseLife();
player._pMaxHP = player._pHitPoints; player._pMaxHP = player._pHitPoints;
player._pHPBase = player._pHitPoints; player._pHPBase = player._pHitPoints;
player._pMaxHPBase = player._pHitPoints; player._pMaxHPBase = player._pHitPoints;
player._pMana = player._pMagic << 6; player._pMana = player.calculateBaseMana();
if (player._pClass == HeroClass::Sorcerer) {
player._pMana *= 2;
} else if (player._pClass == HeroClass::Bard) {
player._pMana += player._pMana * 3 / 4;
} else if (player._pClass == HeroClass::Rogue || player._pClass == HeroClass::Monk) {
player._pMana += player._pMana / 2;
}
player._pMaxMana = player._pMana; player._pMaxMana = player._pMana;
player._pManaBase = player._pMana; player._pManaBase = player._pMana;
player._pMaxManaBase = player._pMana; player._pMaxManaBase = player._pMana;
@ -2315,7 +2314,7 @@ void CreatePlayer(Player &player, HeroClass c)
player._pInfraFlag = false; player._pInfraFlag = false;
player._pRSplType = SpellType::Skill; player._pRSplType = SpellType::Skill;
SpellID s = PlayersData[static_cast<size_t>(c)].skill; SpellID s = playerData.skill;
player._pAblSpells = GetSpellBitmask(s); player._pAblSpells = GetSpellBitmask(s);
player._pRSpell = s; player._pRSpell = s;
@ -2401,7 +2400,7 @@ void NextPlrLevel(Player &player)
} }
player._pNextExper = ExpLvlsTbl[std::min<int8_t>(player._pLevel, MaxCharacterLevel - 1)]; player._pNextExper = ExpLvlsTbl[std::min<int8_t>(player._pLevel, MaxCharacterLevel - 1)];
int hp = PlayersData[static_cast<size_t>(player._pClass)].lvlUpLife; int hp = PlayersData[static_cast<size_t>(player._pClass)].lvlLife;
player._pMaxHP += hp; player._pMaxHP += hp;
player._pHitPoints = player._pMaxHP; player._pHitPoints = player._pMaxHP;
@ -2412,7 +2411,7 @@ void NextPlrLevel(Player &player)
RedrawComponent(PanelDrawComponent::Health); RedrawComponent(PanelDrawComponent::Health);
} }
int mana = PlayersData[static_cast<size_t>(player._pClass)].lvlUpMana; int mana = PlayersData[static_cast<size_t>(player._pClass)].lvlMana;
player._pMaxMana += mana; player._pMaxMana += mana;
player._pMaxManaBase += mana; player._pMaxManaBase += mana;

6
Source/player.h

@ -772,6 +772,12 @@ struct Player {
this->plrlevel = static_cast<uint8_t>(level); this->plrlevel = static_cast<uint8_t>(level);
this->plrIsOnSetLevel = true; this->plrIsOnSetLevel = true;
} }
/** @brief Returns a character's life based on starting life, character level, and base vitality. */
int32_t calculateBaseLife() const;
/** @brief Returns a character's mana based on starting mana, character level, and base magic. */
int32_t calculateBaseMana() const;
}; };
extern DVL_API_FOR_TEST size_t MyPlayerId; extern DVL_API_FOR_TEST size_t MyPlayerId;

14
Source/playerdat.cpp

@ -83,15 +83,15 @@ const _sfx_id herosounds[enum_size<HeroClass>::value][enum_size<HeroSpeech>::val
/** Contains the data related to each player class. */ /** Contains the data related to each player class. */
const PlayerData PlayersData[] = { const PlayerData PlayersData[] = {
// clang-format off // clang-format off
// HeroClass className, classPath, baseStr, baseMag, baseDex, baseVit, maxStr, maxMag, maxDex, maxVit, blockBonus, lvlUpLife, lvlUpMana, chrLife, chrMana, itmLife, itmMana, skill, // HeroClass className, classPath, baseStr, baseMag, baseDex, baseVit, maxStr, maxMag, maxDex, maxVit, blockBonus, adjLife, adjMana, lvlLife, lvlMana, chrLife, chrMana, itmLife, itmMana, skill,
// TRANSLATORS: Player Block start // TRANSLATORS: Player Block start
/* HeroClass::Warrior */ { N_("Warrior"), "warrior", 30, 10, 20, 25, 250, 50, 60, 100, 30, (2 << 6), (1 << 6), (2 << 6), (1 << 6), (2 << 6), (1 << 6), SpellID::ItemRepair }, /* HeroClass::Warrior */ { N_("Warrior"), "warrior", 30, 10, 20, 25, 250, 50, 60, 100, 30, (18 << 6), (-1 << 6), (2 << 6), (1 << 6), (2 << 6), (1 << 6), (2 << 6), (1 << 6), SpellID::ItemRepair },
/* HeroClass::Rogue */ { N_("Rogue"), "rogue", 20, 15, 30, 20, 55, 70, 250, 80, 20, (2 << 6), (2 << 6), (1 << 6), (1 << 6), static_cast<int>(1.5F * 64), static_cast<int>(1.5F * 64), SpellID::TrapDisarm }, /* HeroClass::Rogue */ { N_("Rogue"), "rogue", 20, 15, 30, 20, 55, 70, 250, 80, 20, (23 << 6), static_cast<int>(5.5F * 64), (2 << 6), (2 << 6), (1 << 6), (1 << 6), static_cast<int>(1.5F * 64), static_cast<int>(1.5F * 64), SpellID::TrapDisarm },
/* HeroClass::Sorcerer */ { N_("Sorcerer"), "sorceror", 15, 35, 15, 20, 45, 250, 85, 80, 10, (1 << 6), (2 << 6), (1 << 6), (2 << 6), (1 << 6), (2 << 6), SpellID::StaffRecharge }, /* HeroClass::Sorcerer */ { N_("Sorcerer"), "sorceror", 15, 35, 15, 20, 45, 250, 85, 80, 10, (9 << 6), (-2 << 6), (1 << 6), (2 << 6), (1 << 6), (2 << 6), (1 << 6), (2 << 6), SpellID::StaffRecharge },
/* HeroClass::Monk */ { N_("Monk"), "monk", 25, 15, 25, 20, 150, 80, 150, 80, 25, (2 << 6), (2 << 6), (1 << 6), (1 << 6), static_cast<int>(1.5F * 64), static_cast<int>(1.5F * 64), SpellID::Search, }, /* HeroClass::Monk */ { N_("Monk"), "monk", 25, 15, 25, 20, 150, 80, 150, 80, 25, (23 << 6), static_cast<int>(5.5F * 64), (2 << 6), (2 << 6), (1 << 6), (1 << 6), static_cast<int>(1.5F * 64), static_cast<int>(1.5F * 64), SpellID::Search, },
/* HeroClass::Bard */ { N_("Bard"), "rogue", 20, 20, 25, 20, 120, 120, 120, 100, 25, (2 << 6), (2 << 6), (1 << 6), static_cast<int>(1.5F * 64), static_cast<int>(1.5F * 64), static_cast<int>(1.75F * 64), SpellID::Identify }, /* HeroClass::Bard */ { N_("Bard"), "rogue", 20, 20, 25, 20, 120, 120, 120, 100, 25, (23 << 6), (3 << 6), (2 << 6), (2 << 6), (1 << 6), static_cast<int>(1.5F * 64), static_cast<int>(1.5F * 64), static_cast<int>(1.75F * 64), SpellID::Identify },
/* HeroClass::Barbarian */ { N_("Barbarian"), "warrior", 40, 0, 20, 25, 255, 0, 55, 150, 30, (2 << 6), (0 << 6), (2 << 6), (1 << 6), static_cast<int>(2.5F * 64), (1 << 6), SpellID::Rage }, /* HeroClass::Barbarian */ { N_("Barbarian"), "warrior", 40, 0, 20, 25, 255, 0, 55, 150, 30, (18 << 6), (0 << 6), (2 << 6), (0 << 6), (2 << 6), (1 << 6), static_cast<int>(2.5F * 64), (1 << 6), SpellID::Rage },
// clang-format on // clang-format on
}; };

16
Source/playerdat.hpp

@ -35,18 +35,22 @@ struct PlayerData {
uint8_t maxVit; uint8_t maxVit;
/* Class Block Bonus % */ /* Class Block Bonus % */
uint8_t blockBonus; uint8_t blockBonus;
/* Class Life Adjustment */
int16_t adjLife;
/* Class Mana Adjustment */
int16_t adjMana;
/* Life gained on level up */ /* Life gained on level up */
uint16_t lvlUpLife; int16_t lvlLife;
/* Mana gained on level up */ /* Mana gained on level up */
uint16_t lvlUpMana; int16_t lvlMana;
/* Life from base Vitality */ /* Life from base Vitality */
uint16_t chrLife; int16_t chrLife;
/* Mana from base Magic */ /* Mana from base Magic */
uint16_t chrMana; int16_t chrMana;
/* Life from item bonus Vitality */ /* Life from item bonus Vitality */
uint16_t itmLife; int16_t itmLife;
/* Mana from item bonus Magic */ /* Mana from item bonus Magic */
uint16_t itmMana; int16_t itmMana;
/* Class Skill */ /* Class Skill */
SpellID skill; SpellID skill;
}; };

Loading…
Cancel
Save