aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/DataStores/GameTables.cpp2
-rw-r--r--src/server/game/DataStores/GameTables.h33
-rw-r--r--src/server/game/Entities/Player/Player.cpp14
-rw-r--r--src/server/game/Entities/Player/PlayerTaxi.cpp2
-rw-r--r--src/server/game/Entities/Unit/StatSystem.cpp4
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp29
-rw-r--r--src/server/game/Globals/ObjectMgr.h3
-rw-r--r--src/server/game/Handlers/CharacterHandler.cpp6
-rw-r--r--src/server/game/Miscellaneous/RaceMask.h15
-rw-r--r--src/server/game/Miscellaneous/enuminfo_RaceMask.cpp6
-rw-r--r--src/server/scripts/Spells/spell_generic.cpp6
-rw-r--r--src/tools/map_extractor/System.cpp2
12 files changed, 42 insertions, 80 deletions
diff --git a/src/server/game/DataStores/GameTables.cpp b/src/server/game/DataStores/GameTables.cpp
index e47033e3655..429bf0c1644 100644
--- a/src/server/game/DataStores/GameTables.cpp
+++ b/src/server/game/DataStores/GameTables.cpp
@@ -31,7 +31,6 @@ GameTable<GtChanceToSpellCritEntry> sChanceToSpellCritGameTable;
GameTable<GtChanceToSpellCritBaseEntry> sChanceToSpellCritBaseGameTable;
GameTable<GtCombatRatingsEntry> sCombatRatingsGameTable;
GameTable<GtNpcManaCostScalerEntry> sNpcManaCostScalerGameTable;
-GameTable<GtOctBaseHpByClassEntry> sOctBaseHpByClassGameTable;
GameTable<GtOctBaseMpByClassEntry> sOctBaseMpByClassGameTable;
GameTable<GtOctClassCombatRatingScalarEntry> sOctClassCombatRatingScalarGameTable;
GameTable<GtOctHpPerStaminaEntry> sOctHpPerStaminaGameTable;
@@ -127,7 +126,6 @@ void LoadGameTables(std::string const& dataPath)
LOAD_GT(sChanceToSpellCritBaseGameTable, "ChanceToSpellCritBase.txt");
LOAD_GT(sCombatRatingsGameTable, "CombatRatings.txt");
LOAD_GT(sNpcManaCostScalerGameTable, "NPCManaCostScaler.txt");
- LOAD_GT(sOctBaseHpByClassGameTable, "OCTBaseHPByClass.txt");
LOAD_GT(sOctBaseMpByClassGameTable, "OCTBaseMPByClass.txt");
LOAD_GT(sOctClassCombatRatingScalarGameTable, "OCTClassCombatRatingScalar.txt");
LOAD_GT(sOctHpPerStaminaGameTable, "OCTHPPerStamina.txt");
diff --git a/src/server/game/DataStores/GameTables.h b/src/server/game/DataStores/GameTables.h
index 02292e50876..43466237d81 100644
--- a/src/server/game/DataStores/GameTables.h
+++ b/src/server/game/DataStores/GameTables.h
@@ -130,21 +130,6 @@ struct GtNpcManaCostScalerEntry
float Scaler = 0.0f;
};
-struct GtOctBaseHpByClassEntry
-{
- float Warrior = 0.0f;
- float Paladin = 0.0f;
- float Hunter = 0.0f;
- float Rogue = 0.0f;
- float Priest = 0.0f;
- float DeathKnight = 0.0f;
- float Shaman = 0.0f;
- float Mage = 0.0f;
- float Warlock = 0.0f;
- float Monk = 0.0f;
- float Druid = 0.0f;
-};
-
struct GtOctBaseMpByClassEntry
{
float Warrior = 0.0f;
@@ -254,19 +239,24 @@ struct GtShieldBlockRegularEntry
struct GtSpellScalingEntry
{
- float Warrior = 0.0f;
- float Paladin = 0.0f;
- float Hunter = 0.0f;
float Rogue = 0.0f;
+ float Druid = 0.0f;
+ float Hunter = 0.0f;
+ float Mage = 0.0f;
+ float Paladin = 0.0f;
float Priest = 0.0f;
- float DeathKnight = 0.0f;
float Shaman = 0.0f;
- float Mage = 0.0f;
float Warlock = 0.0f;
+ float Warrior = 0.0f;
+ float DeathKnight = 0.0f;
float Monk = 0.0f;
- float Druid = 0.0f;
+ float DemonHunter = 0.0f;
float Item = 0.0f;
float Consumable = 0.0f;
+ float Gem1 = 0.0f;
+ float Gem2 = 0.0f;
+ float Gem3 = 0.0f;
+ float Health = 0.0f;
};
struct GtTeamContributionPointsEntry
@@ -301,7 +291,6 @@ TC_GAME_API extern GameTable<GtChanceToSpellCritEntry> sChanceToSpe
TC_GAME_API extern GameTable<GtChanceToSpellCritBaseEntry> sChanceToSpellCritBaseGameTable;
TC_GAME_API extern GameTable<GtCombatRatingsEntry> sCombatRatingsGameTable;
TC_GAME_API extern GameTable<GtNpcManaCostScalerEntry> sNpcManaCostScalerGameTable;
-TC_GAME_API extern GameTable<GtOctBaseHpByClassEntry> sOctBaseHpByClassGameTable;
TC_GAME_API extern GameTable<GtOctBaseMpByClassEntry> sOctBaseMpByClassGameTable;
TC_GAME_API extern GameTable<GtOctClassCombatRatingScalarEntry> sOctClassCombatRatingScalarGameTable;
TC_GAME_API extern GameTable<GtOctHpPerStaminaEntry> sOctHpPerStaminaGameTable;
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index f3853f65e42..d17c9f73a6a 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -2068,12 +2068,12 @@ void Player::GiveLevel(uint8 level)
PlayerLevelInfo info;
sObjectMgr->GetPlayerLevelInfo(GetRace(), GetClass(), level, &info);
- uint32 basemana = 0, baseHp = 0;
- sObjectMgr->GetPlayerClassLevelInfo(GetClass(), level, basemana, baseHp);
+ uint32 basemana = 0;
+ sObjectMgr->GetPlayerClassLevelInfo(GetClass(), level, basemana);
WorldPackets::Misc::LevelUpInfo packet;
packet.Level = level;
- packet.HealthDelta = int32(baseHp) - int32(GetCreateHealth());
+ packet.HealthDelta = int32(info.base_hp) - int32(GetCreateHealth());
/// @todo find some better solution
// for (int i = 0; i < MAX_STORED_POWERS; ++i)
@@ -2102,7 +2102,7 @@ void Player::GiveLevel(uint8 level)
for (uint8 i = STAT_STRENGTH; i < MAX_STATS; ++i)
SetCreateStat(Stats(i), info.stats[i]);
- SetCreateHealth(baseHp);
+ SetCreateHealth(info.base_hp);
SetCreateMana(basemana);
InitGlyphsForLevel();
@@ -2155,8 +2155,8 @@ void Player::InitStatsForLevel(bool reapplyMods)
if (reapplyMods) //reapply stats values only on .reset stats (level) command
_RemoveAllStatBonuses();
- uint32 basemana = 0, baseHp = 0;
- sObjectMgr->GetPlayerClassLevelInfo(GetClass(), GetLevel(), basemana, baseHp);
+ uint32 basemana = 0;
+ sObjectMgr->GetPlayerClassLevelInfo(GetClass(), GetLevel(), basemana);
PlayerLevelInfo info;
sObjectMgr->GetPlayerLevelInfo(GetRace(), GetClass(), GetLevel(), &info);
@@ -2194,7 +2194,7 @@ void Player::InitStatsForLevel(bool reapplyMods)
for (uint8 i = STAT_STRENGTH; i < MAX_STATS; ++i)
SetStat(Stats(i), info.stats[i]);
- SetCreateHealth(baseHp);
+ SetCreateHealth(info.base_hp);
//set create powers
SetCreateMana(basemana);
diff --git a/src/server/game/Entities/Player/PlayerTaxi.cpp b/src/server/game/Entities/Player/PlayerTaxi.cpp
index 70bc584baff..1716b18175c 100644
--- a/src/server/game/Entities/Player/PlayerTaxi.cpp
+++ b/src/server/game/Entities/Player/PlayerTaxi.cpp
@@ -45,7 +45,6 @@ void PlayerTaxi::InitTaxiNodesForLevel(uint32 race, uint32 chrClass, uint8 level
case RACE_NIGHTELF:
case RACE_GNOME:
case RACE_DRAENEI:
- case RACE_WORGEN:
SetTaximaskNode(2); // Stormwind, Elwynn
SetTaximaskNode(6); // Ironforge, Dun Morogh
SetTaximaskNode(26); // Lor'danel, Darkshore
@@ -65,7 +64,6 @@ void PlayerTaxi::InitTaxiNodesForLevel(uint32 race, uint32 chrClass, uint8 level
case RACE_TAUREN:
case RACE_TROLL:
case RACE_BLOODELF:
- case RACE_GOBLIN:
SetTaximaskNode(11); // Undercity, Tirisfal
SetTaximaskNode(22); // Thunder Bluff, Mulgore
SetTaximaskNode(23); // Orgrimmar, Durotar
diff --git a/src/server/game/Entities/Unit/StatSystem.cpp b/src/server/game/Entities/Unit/StatSystem.cpp
index ec4a41e89c5..bfcb4149d90 100644
--- a/src/server/game/Entities/Unit/StatSystem.cpp
+++ b/src/server/game/Entities/Unit/StatSystem.cpp
@@ -111,10 +111,10 @@ void Unit::UpdatePowerRegen(Powers powerType)
case POWER_MANA:
{
// Get base of Mana Pool in sBaseMPGameTable
- uint32 basemana = 0, basehp = 0;
+ uint32 basemana = 0;
if (IsPlayer())
- sObjectMgr->GetPlayerClassLevelInfo(GetClass(), GetLevel(), basemana, basehp);
+ sObjectMgr->GetPlayerClassLevelInfo(GetClass(), GetLevel(), basemana);
else
basemana = GetCreateMana(); // this should also get replaced by the base mana game table in the future.
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index b1db5850e65..25ff87d474b 100644
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -4013,8 +4013,8 @@ void ObjectMgr::LoadPlayerInfo()
} while (raceStatsResult->NextRow());
- // 0 1 2 3 4 5 6
- QueryResult result = WorldDatabase.Query("SELECT class, level, str, agi, sta, inte, spi FROM player_classlevelstats");
+ // 0 1 2 3 4 5 6 7
+ QueryResult result = WorldDatabase.Query("SELECT class, level, str, agi, sta, inte, spi, basehp FROM player_classlevelstats");
if (!result)
{
@@ -4056,6 +4056,8 @@ void ObjectMgr::LoadPlayerInfo()
PlayerLevelInfo& levelInfo = playerInfo->levelInfo[current_level - 1];
for (uint8 i = 0; i < MAX_STATS; ++i)
levelInfo.stats[i] = fields[i + 2].GetUInt16() + raceStatModifiers[race].StatModifier[i];
+
+ levelInfo.base_hp = fields[7].GetUInt32();
}
}
@@ -4089,14 +4091,14 @@ void ObjectMgr::LoadPlayerInfo()
continue;
// skip expansion races if not playing with expansion
- if (sWorld->getIntConfig(CONFIG_EXPANSION) < EXPANSION_CATACLYSM && (race == RACE_GOBLIN || race == RACE_WORGEN))
- continue;
-
- if (sWorld->getIntConfig(CONFIG_EXPANSION) < EXPANSION_LEGION && class_ == CLASS_DEMON_HUNTER)
- continue;
-
- if (sWorld->getIntConfig(CONFIG_EXPANSION) < EXPANSION_DRAGONFLIGHT && class_ == CLASS_EVOKER)
- continue;
+ // if (sWorld->getIntConfig(CONFIG_EXPANSION) < EXPANSION_CATACLYSM && (race == RACE_GOBLIN || race == RACE_WORGEN))
+ // continue;
+ //
+ // if (sWorld->getIntConfig(CONFIG_EXPANSION) < EXPANSION_LEGION && class_ == CLASS_DEMON_HUNTER)
+ // continue;
+ //
+ // if (sWorld->getIntConfig(CONFIG_EXPANSION) < EXPANSION_DRAGONFLIGHT && class_ == CLASS_EVOKER)
+ // continue;
// fatal error if no level 1 data
if (!playerInfo->levelInfo || playerInfo->levelInfo[0].stats[0] == 0)
@@ -4174,7 +4176,7 @@ void ObjectMgr::LoadPlayerInfo()
}
}
-void ObjectMgr::GetPlayerClassLevelInfo(uint32 class_, uint8 level, uint32& baseMana, uint32& baseHp) const
+void ObjectMgr::GetPlayerClassLevelInfo(uint32 class_, uint8 level, uint32& baseMana) const
{
if (level < 1 || class_ >= MAX_CLASSES)
return;
@@ -4186,11 +4188,6 @@ void ObjectMgr::GetPlayerClassLevelInfo(uint32 class_, uint8 level, uint32& base
baseMana = uint32(GetGameTableColumnForClass(mp, class_));
else
baseMana = 0;
-
- if (GtOctBaseHpByClassEntry const* hp = sOctBaseHpByClassGameTable.GetRow(level))
- baseHp = uint32(GetGameTableColumnForClass(hp, class_));
- else
- baseHp = 0;
}
void ObjectMgr::GetPlayerLevelInfo(uint32 race, uint32 class_, uint8 level, PlayerLevelInfo* info) const
diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h
index f645ddacf38..f5c31e91260 100644
--- a/src/server/game/Globals/ObjectMgr.h
+++ b/src/server/game/Globals/ObjectMgr.h
@@ -630,6 +630,7 @@ typedef std::vector<PlayerCreateInfoItem> PlayerCreateInfoItems;
struct PlayerLevelInfo
{
uint16 stats[MAX_STATS] = { };
+ uint32 base_hp = 1;
};
typedef std::vector<uint32> PlayerCreateInfoSpells;
@@ -1154,7 +1155,7 @@ class TC_GAME_API ObjectMgr
PetLevelInfo const* GetPetLevelInfo(uint32 creature_id, uint8 level) const;
- void GetPlayerClassLevelInfo(uint32 class_, uint8 level, uint32& baseMana, uint32& baseHp) const;
+ void GetPlayerClassLevelInfo(uint32 class_, uint8 level, uint32& baseMana) const;
PlayerInfo const* GetPlayerInfo(uint32 race, uint32 class_) const;
diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp
index b0fcfe262c8..6566698c649 100644
--- a/src/server/game/Handlers/CharacterHandler.cpp
+++ b/src/server/game/Handlers/CharacterHandler.cpp
@@ -2138,9 +2138,6 @@ void WorldSession::HandleCharRaceOrFactionChangeCallback(std::shared_ptr<WorldPa
case RACE_NIGHTELF:
stmt->setUInt16(1, 113);
break;
- case RACE_WORGEN:
- stmt->setUInt16(1, 791);
- break;
case RACE_UNDEAD_PLAYER:
stmt->setUInt16(1, 673);
break;
@@ -2153,9 +2150,6 @@ void WorldSession::HandleCharRaceOrFactionChangeCallback(std::shared_ptr<WorldPa
case RACE_BLOODELF:
stmt->setUInt16(1, 137);
break;
- case RACE_GOBLIN:
- stmt->setUInt16(1, 792);
- break;
default:
TC_LOG_ERROR("entities.player", "Could not find language data for race ({}).", factionChangeInfo->RaceID);
SendCharFactionChange(CHAR_CREATE_ERROR, factionChangeInfo.get());
diff --git a/src/server/game/Miscellaneous/RaceMask.h b/src/server/game/Miscellaneous/RaceMask.h
index 6cb511f8cff..d22a2852ab8 100644
--- a/src/server/game/Miscellaneous/RaceMask.h
+++ b/src/server/game/Miscellaneous/RaceMask.h
@@ -33,7 +33,7 @@ enum Races
RACE_TAUREN = 6, // TITLE Tauren
RACE_GNOME = 7, // TITLE Gnome
RACE_TROLL = 8, // TITLE Troll
- RACE_GOBLIN = 9, // TITLE Goblin
+ //RACE_GOBLIN = 9, // TITLE Goblin
RACE_BLOODELF = 10, // TITLE Blood Elf
RACE_DRAENEI = 11, // TITLE Draenei
//RACE_FEL_ORC = 12,
@@ -46,7 +46,7 @@ enum Races
//RACE_TAUNKA = 19,
//RACE_NORTHREND_SKELETON = 20,
//RACE_ICE_TROLL = 21,
- RACE_WORGEN = 22, // TITLE Worgen
+ //RACE_WORGEN = 22, // TITLE Worgen
//RACE_GILNEAN = 23,
//RACE_PANDAREN_NEUTRAL = 24, // TITLE Pandaren DESCRIPTION Pandaren (Neutral)
//RACE_PANDAREN_ALLIANCE = 25, // TITLE Pandaren DESCRIPTION Pandaren (Alliance)
@@ -81,7 +81,7 @@ enum Races
};
// max+1 for player race
-#define MAX_RACES 23
+#define MAX_RACES 12
namespace Trinity
{
@@ -109,10 +109,8 @@ struct RaceMask
case RACE_TAUREN:
case RACE_GNOME:
case RACE_TROLL:
- case RACE_GOBLIN:
case RACE_BLOODELF:
case RACE_DRAENEI:
- case RACE_WORGEN:
return raceId - 1;
default:
break;
@@ -145,17 +143,14 @@ constexpr Trinity::RaceMask<uint64> RACEMASK_ALL_PLAYABLE = { std::integral_cons
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_GNOME) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_TROLL) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_BLOODELF) |
- Trinity::RaceMask<uint64>::GetMaskForRace(RACE_DRAENEI) |
- Trinity::RaceMask<uint64>::GetMaskForRace(RACE_GOBLIN) |
- Trinity::RaceMask<uint64>::GetMaskForRace(RACE_WORGEN)>::value };
+ Trinity::RaceMask<uint64>::GetMaskForRace(RACE_DRAENEI)>::value };
constexpr Trinity::RaceMask<uint64> RACEMASK_ALLIANCE = { std::integral_constant<uint64,
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_HUMAN) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_DWARF) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_NIGHTELF) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_GNOME) |
- Trinity::RaceMask<uint64>::GetMaskForRace(RACE_DRAENEI) |
- Trinity::RaceMask<uint64>::GetMaskForRace(RACE_WORGEN)>::value };
+ Trinity::RaceMask<uint64>::GetMaskForRace(RACE_DRAENEI)>::value };
constexpr Trinity::RaceMask<uint64> RACEMASK_HORDE = { std::integral_constant<uint64, (RACEMASK_ALL_PLAYABLE & ~RACEMASK_ALLIANCE).RawValue>::value };
diff --git a/src/server/game/Miscellaneous/enuminfo_RaceMask.cpp b/src/server/game/Miscellaneous/enuminfo_RaceMask.cpp
index ccb1bf88880..ea55661950e 100644
--- a/src/server/game/Miscellaneous/enuminfo_RaceMask.cpp
+++ b/src/server/game/Miscellaneous/enuminfo_RaceMask.cpp
@@ -39,10 +39,8 @@ TC_API_EXPORT EnumText EnumUtils<Races>::ToString(Races value)
case RACE_TAUREN: return { "RACE_TAUREN", "Tauren", "" };
case RACE_GNOME: return { "RACE_GNOME", "Gnome", "" };
case RACE_TROLL: return { "RACE_TROLL", "Troll", "" };
- case RACE_GOBLIN: return { "RACE_GOBLIN", "Goblin", "" };
case RACE_BLOODELF: return { "RACE_BLOODELF", "Blood Elf", "" };
case RACE_DRAENEI: return { "RACE_DRAENEI", "Draenei", "" };
- case RACE_WORGEN: return { "RACE_WORGEN", "Worgen", "" };
default: throw std::out_of_range("value");
}
}
@@ -63,10 +61,8 @@ TC_API_EXPORT Races EnumUtils<Races>::FromIndex(size_t index)
case 5: return RACE_TAUREN;
case 6: return RACE_GNOME;
case 7: return RACE_TROLL;
- case 8: return RACE_GOBLIN;
case 9: return RACE_BLOODELF;
case 10: return RACE_DRAENEI;
- case 11: return RACE_WORGEN;
default: throw std::out_of_range("index");
}
}
@@ -84,10 +80,8 @@ TC_API_EXPORT size_t EnumUtils<Races>::ToIndex(Races value)
case RACE_TAUREN: return 5;
case RACE_GNOME: return 6;
case RACE_TROLL: return 7;
- case RACE_GOBLIN: return 8;
case RACE_BLOODELF: return 9;
case RACE_DRAENEI: return 10;
- case RACE_WORGEN: return 11;
default: throw std::out_of_range("value");
}
}
diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp
index ae3615e29a1..7afa893198b 100644
--- a/src/server/scripts/Spells/spell_generic.cpp
+++ b/src/server/scripts/Spells/spell_generic.cpp
@@ -420,12 +420,10 @@ class spell_gen_battleground_mercenary_shapeshift : public AuraScript
{ RACE_NIGHTELF, { RACE_TROLL, RACE_BLOODELF } },
{ RACE_UNDEAD_PLAYER, { RACE_HUMAN } },
{ RACE_TAUREN, { RACE_DRAENEI, RACE_NIGHTELF } },
- { RACE_GNOME, { RACE_GOBLIN, RACE_BLOODELF } },
+ { RACE_GNOME, { RACE_BLOODELF } },
{ RACE_TROLL, { RACE_NIGHTELF, RACE_HUMAN, RACE_DRAENEI } },
- { RACE_GOBLIN, { RACE_GNOME, RACE_DWARF } },
{ RACE_BLOODELF, { RACE_HUMAN, RACE_NIGHTELF } },
{ RACE_DRAENEI, { RACE_TAUREN, RACE_ORC } },
- { RACE_WORGEN, { RACE_TROLL } }
};
inline static std::unordered_map<Races, std::array<uint32, 2>> const RaceDisplayIds =
@@ -438,10 +436,8 @@ class spell_gen_battleground_mercenary_shapeshift : public AuraScript
{ RACE_TAUREN, { 55261, 55260 } },
{ RACE_GNOME, { 55245, 55244 } },
{ RACE_TROLL, { 55263, 55262 } },
- { RACE_GOBLIN, { 55267, 57244 } },
{ RACE_BLOODELF, { 55265, 55264 } },
{ RACE_DRAENEI, { 55247, 55246 } },
- { RACE_WORGEN, { 55255, 55254 } }
};
inline static std::vector<uint32> RacialSkills;
diff --git a/src/tools/map_extractor/System.cpp b/src/tools/map_extractor/System.cpp
index 04f916dc43b..aaf69832af7 100644
--- a/src/tools/map_extractor/System.cpp
+++ b/src/tools/map_extractor/System.cpp
@@ -1351,7 +1351,7 @@ void ExtractGameTables()
// { 1391653, "NpcTotalHpExp1.txt" },
// { 1391654, "NpcTotalHpExp2.txt" },
// { 1391655, "NpcTotalHpExp3.txt" },
- { 5464960, "OCTBaseHPByClass.txt" },
+ // { 5464960, "OCTBaseHPByClass.txt" },
{ 4049853, "OCTBaseMPByClass.txt" },
{ 4526467, "OCTClassCombatRatingScalar.txt" },
{ 5464961, "OCTHPPerStamina.txt" },