14#include <unordered_map>
18 enum BattlePetAbilityEffectProperties
20 BATTLE_PET_EFFECT_DAMAGE = 24,
21 BATTLE_PET_EFFECT_RAMPING_DAMAGE = 27,
22 BATTLE_PET_EFFECT_DAMAGE_TOGGLE_AURA = 76,
23 BATTLE_PET_EFFECT_DAMAGE_HIT_STATE = 96,
24 BATTLE_PET_EFFECT_EXTRA_ATTACK_FIRST = 103,
25 BATTLE_PET_EFFECT_DAMAGE_NON_LETHAL = 149
28 typedef std::unordered_map<uint32, BattlePetAbilityEffectEntry const*> BattlePetAbilityEffectByTurnCache;
29 typedef std::unordered_map<uint64, int32> BattlePetAbilityStateCache;
30 typedef std::unordered_map<uint32, uint16> BattlePetSpeciesByNpcCache;
32 bool BattlePetAbilityEffectDealsDamage(
uint32 propertiesId)
36 case BATTLE_PET_EFFECT_DAMAGE:
37 case BATTLE_PET_EFFECT_RAMPING_DAMAGE:
38 case BATTLE_PET_EFFECT_DAMAGE_TOGGLE_AURA:
39 case BATTLE_PET_EFFECT_DAMAGE_HIT_STATE:
40 case BATTLE_PET_EFFECT_EXTRA_ATTACK_FIRST:
41 case BATTLE_PET_EFFECT_DAMAGE_NON_LETHAL:
48 BattlePetSpeciesByNpcCache
const& BattlePetSpeciesByNpc()
50 static BattlePetSpeciesByNpcCache speciesByNpc;
51 if (!speciesByNpc.empty())
57 if (speciesEntry && speciesEntry->
NpcId)
58 speciesByNpc[speciesEntry->
NpcId] =
uint16(speciesId);
64 void BuildBattlePetAbilityEffectCaches(BattlePetAbilityEffectByTurnCache& firstEffectByTurn,
65 BattlePetAbilityEffectByTurnCache& firstDamageEffectByTurn)
67 if (!firstEffectByTurn.empty())
76 if (firstEffectByTurn.find(effectEntry->
TurnEntryId) == firstEffectByTurn.end())
77 firstEffectByTurn[effectEntry->
TurnEntryId] = effectEntry;
79 if (BattlePetAbilityEffectDealsDamage(effectEntry->
PropertiesId)
80 && firstDamageEffectByTurn.find(effectEntry->
TurnEntryId) == firstDamageEffectByTurn.end())
81 firstDamageEffectByTurn[effectEntry->
TurnEntryId] = effectEntry;
87 static BattlePetAbilityEffectByTurnCache firstEffectByTurn;
88 static BattlePetAbilityEffectByTurnCache firstDamageEffectByTurn;
89 BuildBattlePetAbilityEffectCaches(firstEffectByTurn, firstDamageEffectByTurn);
91 BattlePetAbilityEffectByTurnCache::const_iterator itr = firstDamageEffectByTurn.find(turnId);
92 if (itr != firstDamageEffectByTurn.end())
98 itr = firstEffectByTurn.find(turnId);
99 return itr != firstEffectByTurn.end() ? itr->second :
nullptr;
104 return (
uint64(abilityId) << 32) | stateId;
107 BattlePetAbilityStateCache
const& BattlePetAbilityStates()
109 static BattlePetAbilityStateCache abilityStates;
110 if (!abilityStates.empty())
111 return abilityStates;
120 return abilityStates;
126 if (!maxHealth || !percent)
132 return uint16(std::min<uint32>(maxHealth, (
uint32(maxHealth) * percent + 99) / 100));
143 if (base && multiplier)
145 float const threshold = base->
value * multiplier->
value;
146 if (threshold > 0.0f)
147 return uint16(std::min<uint32>(
uint32(threshold + 0.5f), 0xFFFF));
150 return uint16(level) * 100;
159 levelDifference = std::min<int32>(levelDifference, 2);
160 levelDifference = std::max<int32>(levelDifference, -4);
163 return uint16(std::min<uint32>(reward / participatingPetCount, 0xFFFF));
184 BattlePetSpeciesByNpcCache
const& speciesByNpc = BattlePetSpeciesByNpc();
185 BattlePetSpeciesByNpcCache::const_iterator itr = speciesByNpc.find(npcId);
186 return itr != speciesByNpc.end() ? itr->second : 0;
192 return speciesEntry ? speciesEntry->
NpcId : 0;
198 if (!speciesEntry || speciesEntry->
FamilyId >= 32)
206 std::pair<BattlePetAbilityTurnByAbilityStore::const_iterator, BattlePetAbilityTurnByAbilityStore::const_iterator> turnRange =
211 for (BattlePetAbilityTurnByAbilityStore::const_iterator itr = turnRange.first; itr != turnRange.second; ++itr)
217 if (damageOnly || BattlePetAbilityEffectDealsDamage(effectEntry->
PropertiesId))
221 firstEffect = effectEntry;
224 return damageOnly ? nullptr : firstEffect;
229 BattlePetAbilityStateCache
const& abilityStates = BattlePetAbilityStates();
230 BattlePetAbilityStateCache::const_iterator itr = abilityStates.find(BattlePetAbilityStateKey(abilityId, stateId));
231 return itr != abilityStates.end() ? itr->second : 0;
245 uint32 const safeLevel = std::max<uint32>(level, 1);
246 uint32 const safePower = std::max<uint32>(power, safeLevel * 8);
247 uint32 const powerBonusPct = (safePower * 5) / 100;
248 uint32 const scaledPoints = points + ((points * powerBonusPct) / 100);
249 return std::max<uint32>(1, scaledPoints);
268 return uint16(std::max<float>(1.0f, std::floor((basePower * std::max<uint8>(level, 1) * qualityMod) + 0.5f)));
328 return effectEntry ? effectEntry->
Id : 0;
435 if (!nextLevelXp || remainingXp < nextLevelXp)
438 remainingXp -= nextLevelXp;
445 SetXp(
uint16(std::min<uint32>(remainingXp, 0xFFFF)));
uint32 BattlePetInputEffectForAbility(uint32 abilityId)
bool BattlePetSpeciesFlagsAllowWildCapture(uint32 flags)
uint8 BattlePetNormalizeWildLevel(uint8 level)
int32 BattlePetAbilityStateValue(uint32 abilityId, uint32 stateId)
BattlePetAbilityEffectEntry const * BattlePetAbilityEffectForAbility(uint32 abilityId, bool damageOnly)
uint16 BattlePetExperienceReward(uint8 petLevel, uint8 enemyLevel, uint8 participatingPetCount)
uint32 BattlePetAbilityBasePoints(uint32 abilityId)
uint16 BattlePetSpeciesIdByNpcId(uint32 npcId)
uint32 BattlePetDamageFromStats(uint32 abilityId, uint16 power, uint8 level)
uint8 BattlePetIncomingDamageReductionRounds(uint32 abilityId)
uint16 BattlePetHealthFromPercent(uint16 maxHealth, uint8 percent)
uint32 BattlePetInputIncomingDamageReductionForAbility(uint32 abilityId, BattlePet const *caster)
uint16 BattlePetAbilityCooldown(uint32 abilityId)
uint16 BattlePetExperienceForNextLevel(uint8 level)
uint16 BattlePetPowerFromBattleState(uint16 species, uint8 level, uint8 quality, uint8 breed)
uint32 BattlePetScalePointsFromStats(uint32 points, uint16 power, uint8 level)
uint32 BattlePetInputDamageForAbility(uint32 abilityId, BattlePet const *caster)
uint32 BattlePetIncomingDamageReductionFromStats(uint32 abilityId, uint16 power, uint8 level)
uint32 BattlePetSpeciesFamilyMask(uint16 speciesId)
uint32 BattlePetSpeciesNpcId(uint16 speciesId)
@ BATTLE_PET_DB_STATE_SAVE
#define BATTLE_PET_MAX_LEVEL
@ BATTLE_PET_STATE_STAT_STAMINA
@ BATTLE_PET_STATE_STAT_SPEED
@ BATTLE_PET_STATE_STAT_POWER
@ BATTLE_PET_STATE_DAMAGE_TAKEN_FLAT
uint16 BattlePetExperienceForNextLevel(uint8 level)
@ BATTLE_PET_FLAG_NOT_TAMEABLE
DB2Storage< BattlePetAbilityEntry > sBattlePetAbilityStore(BattlePetAbilityfmt)
float BattlePetSpeciesMainStat(uint16 stateId, uint16 speciesId)
DB2Storage< BattlePetAbilityStateEntry > sBattlePetAbilityStateStore(BattlePetAbilityStatefmt)
float BattlePetBreedMainStatModifier(uint16 stateId, uint8 breedId)
float BattlePetQualityMultiplier(uint8 quality)
DB2Storage< BattlePetSpeciesEntry > sBattlePetSpeciesStore(BattlePetSpeciesfmt)
BattlePetAbilityTurnByAbilityStore sBattlePetAbilityTurnByAbilityStore
DB2Storage< BattlePetAbilityEffectEntry > sBattlePetAbilityEffectStore(BattlePetAbilityEffectfmt)
DBCStorage< GtBattlePetXpEntry > sGtBattlePetXpStore(GtBattlePetXpfmt)
BattlePetDbState m_dbState
void SetFlag(uint16 flag)
void SetNickname(std::string const &nickname)
bool HasFlag(uint16 flag) const
void UnSetFlag(uint16 flag)
void SetLevel(uint8 level)
void CalculateStats(bool currentHealth=false)
void SetCurrentHealth(uint16 health)
void SetTimestamp(uint32 timestamp)
void SetQuality(ItemQualities quality)
uint16 AddExperience(uint16 xp)
uint32 PropertyValues[MAX_BATTLE_PET_EFFECT_PROPERTIES]