Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Toggle main menu visibility
Loading...
Searching...
No Matches
SpellCalculations.cpp
Go to the documentation of this file.
1
/*
2
* This file is part of Project SkyFire https://www.projectskyfire.org.
3
* See LICENSE.md file for Copyright information
4
*/
5
6
#include "
SpellCalculations.h
"
7
8
#include "
SpellAuraDefines.h
"
9
#include "
Util.h
"
10
11
namespace
Skyfire
12
{
13
namespace
Spells
14
{
15
int32
CalculateBaseCastTime
(
uint8
level,
int32
castTimeMin,
int32
castTimeMax,
int32
castTimeMaxLevel,
int32
fallbackCastTime)
16
{
17
if
(!level || castTimeMax <= 0)
18
return
fallbackCastTime;
19
20
if
(castTimeMaxLevel > level)
21
return
castTimeMin +
int32
(level - 1) * (castTimeMax - castTimeMin) / (castTimeMaxLevel - 1);
22
23
return
castTimeMax;
24
}
25
26
uint32
FinalizeCastTime
(
int32
castTime,
bool
addRangedAmmoDelay)
27
{
28
if
(addRangedAmmoDelay)
29
castTime += 500;
30
31
return
castTime > 0 ?
uint32
(castTime) : 0;
32
}
33
34
int32
NormalizeDurationValue
(
int32
duration)
35
{
36
if
(duration == -1)
37
return
-1;
38
39
return
duration < 0 ? -duration : duration;
40
}
41
42
int32
CalculateDuration
(
bool
hasDurationEntry,
int32
duration)
43
{
44
return
hasDurationEntry ?
NormalizeDurationValue
(duration) : 0;
45
}
46
47
namespace
48
{
49
bool
IsCountedPeriodicAura(
uint32
auraName)
50
{
51
switch
(auraName)
52
{
53
case
SPELL_AURA_PERIODIC_DAMAGE
:
54
case
SPELL_AURA_PERIODIC_HEAL
:
55
case
SPELL_AURA_PERIODIC_LEECH
:
56
return
true
;
57
default
:
58
return
false
;
59
}
60
}
61
}
62
63
uint32
CalculateMaxTicks
(
int32
duration,
SpellTickEffectInfo
const
* effects,
uint32
effectCount)
64
{
65
if
(duration == 0)
66
return
1;
67
68
int32
tickDuration = duration;
69
if
(tickDuration > 30000)
70
tickDuration = 30000;
71
72
for
(
uint32
i = 0; i < effectCount; ++i)
73
{
74
if
(effects[i].Effect ==
SPELL_EFFECT_APPLY_AURA
&&
75
IsCountedPeriodicAura(effects[i].ApplyAuraName) &&
76
effects[i].ApplyAuraTickCount != 0)
77
return
tickDuration / effects[i].
ApplyAuraTickCount
;
78
}
79
80
return
6;
81
}
82
83
int32
CalculateEffectBaseValue
(
int32
value,
int32
dieSides)
84
{
85
return
dieSides == 0 ? value : value - 1;
86
}
87
88
float
CalculateRadius
(
SpellRadiusCalculationData
const
& data)
89
{
90
if
(!data.
HasRadius
)
91
return
data.
HasMaxRadius
? data.
MaxRadiusMin
: 0.0f;
92
93
float
radius = data.
RadiusMin
;
94
if
(data.
HasCaster
)
95
{
96
radius += data.
RadiusPerLevel
* data.
CasterLevel
;
97
if
(radius > data.
RadiusMax
)
98
radius = data.
RadiusMax
;
99
}
100
101
return
radius;
102
}
103
104
float
SelectSpellRange
(
bool
hasRangeEntry,
float
friendRange,
float
hostileRange,
bool
positive)
105
{
106
if
(!hasRangeEntry)
107
return
0.0f;
108
109
return
positive ? friendRange : hostileRange;
110
}
111
112
uint32
CalculateRecoveryTime
(
uint32
recoveryTime,
uint32
categoryRecoveryTime)
113
{
114
return
recoveryTime > categoryRecoveryTime ? recoveryTime : categoryRecoveryTime;
115
}
116
117
SpellPowerCostCalculationResult
CalculateSpellPowerCosts
(
SpellPowerCostCalculationData
const
& data)
118
{
119
SpellPowerCostCalculationResult
result =
120
{
121
data.
BasePowerCost
,
122
data.
BasePeriodicPowerCost
,
123
SPELL_POWER_COST_OK
124
};
125
126
if
(data.
ChannelCostPercentage
)
127
result.
PeriodicPowerCost
+=
CalculatePct
(data.
MaxPower
, data.
ChannelCostPercentage
);
128
129
if
(!data.
PowerCostPercentage
)
130
return
result;
131
132
switch
(data.
PowerType
)
133
{
134
case
POWER_HEALTH
:
135
result.
PowerCost
+=
CalculatePct
(data.
CreatedHealth
, data.
PowerCostPercentage
);
136
break
;
137
case
POWER_MANA
:
138
case
POWER_DEMONIC_FURY
:
139
result.
PowerCost
+=
CalculatePct
(data.
MaxPower
, data.
PowerCostPercentage
);
140
break
;
141
case
POWER_RUNIC_POWER
:
142
result.
Status
=
SPELL_POWER_COST_UNSUPPORTED_POWER_TYPE
;
143
break
;
144
default
:
145
result.
PowerCost
= 0;
146
result.
Status
=
SPELL_POWER_COST_UNKNOWN_POWER_TYPE
;
147
break
;
148
}
149
150
return
result;
151
}
152
}
153
}
int32
std::int32_t int32
Definition
Define.h:73
uint8
std::uint8_t uint8
Definition
Define.h:79
uint32
std::uint32_t uint32
Definition
Define.h:77
POWER_DEMONIC_FURY
@ POWER_DEMONIC_FURY
Definition
SharedDefines.h:230
POWER_HEALTH
@ POWER_HEALTH
Definition
SharedDefines.h:214
POWER_RUNIC_POWER
@ POWER_RUNIC_POWER
Definition
SharedDefines.h:221
POWER_MANA
@ POWER_MANA
Definition
SharedDefines.h:215
SPELL_EFFECT_APPLY_AURA
@ SPELL_EFFECT_APPLY_AURA
Definition
SharedDefines.h:894
SpellAuraDefines.h
SPELL_AURA_PERIODIC_DAMAGE
@ SPELL_AURA_PERIODIC_DAMAGE
Definition
SpellAuraDefines.h:50
SPELL_AURA_PERIODIC_HEAL
@ SPELL_AURA_PERIODIC_HEAL
Definition
SpellAuraDefines.h:55
SPELL_AURA_PERIODIC_LEECH
@ SPELL_AURA_PERIODIC_LEECH
Definition
SpellAuraDefines.h:100
SpellCalculations.h
Util.h
CalculatePct
T CalculatePct(T base, U pct)
Definition
Util.h:103
Skyfire::Spells
Definition
SpellAuraMetadata.cpp:13
Skyfire::Spells::CalculateMaxTicks
uint32 CalculateMaxTicks(int32 duration, SpellTickEffectInfo const *effects, uint32 effectCount)
Definition
SpellCalculations.cpp:63
Skyfire::Spells::SPELL_POWER_COST_OK
@ SPELL_POWER_COST_OK
Definition
SpellCalculations.h:36
Skyfire::Spells::SPELL_POWER_COST_UNSUPPORTED_POWER_TYPE
@ SPELL_POWER_COST_UNSUPPORTED_POWER_TYPE
Definition
SpellCalculations.h:37
Skyfire::Spells::SPELL_POWER_COST_UNKNOWN_POWER_TYPE
@ SPELL_POWER_COST_UNKNOWN_POWER_TYPE
Definition
SpellCalculations.h:38
Skyfire::Spells::CalculateBaseCastTime
int32 CalculateBaseCastTime(uint8 level, int32 castTimeMin, int32 castTimeMax, int32 castTimeMaxLevel, int32 fallbackCastTime)
Definition
SpellCalculations.cpp:15
Skyfire::Spells::CalculateRecoveryTime
uint32 CalculateRecoveryTime(uint32 recoveryTime, uint32 categoryRecoveryTime)
Definition
SpellCalculations.cpp:112
Skyfire::Spells::CalculateDuration
int32 CalculateDuration(bool hasDurationEntry, int32 duration)
Definition
SpellCalculations.cpp:42
Skyfire::Spells::CalculateSpellPowerCosts
SpellPowerCostCalculationResult CalculateSpellPowerCosts(SpellPowerCostCalculationData const &data)
Definition
SpellCalculations.cpp:117
Skyfire::Spells::SelectSpellRange
float SelectSpellRange(bool hasRangeEntry, float friendRange, float hostileRange, bool positive)
Definition
SpellCalculations.cpp:104
Skyfire::Spells::CalculateRadius
float CalculateRadius(SpellRadiusCalculationData const &data)
Definition
SpellCalculations.cpp:88
Skyfire::Spells::FinalizeCastTime
uint32 FinalizeCastTime(int32 castTime, bool addRangedAmmoDelay)
Definition
SpellCalculations.cpp:26
Skyfire::Spells::CalculateEffectBaseValue
int32 CalculateEffectBaseValue(int32 value, int32 dieSides)
Definition
SpellCalculations.cpp:83
Skyfire::Spells::NormalizeDurationValue
int32 NormalizeDurationValue(int32 duration)
Definition
SpellCalculations.cpp:34
Skyfire
Definition
AuthPatchTransfer.h:12
Skyfire::Spells::SpellPowerCostCalculationData
Definition
SpellCalculations.h:42
Skyfire::Spells::SpellPowerCostCalculationData::BasePeriodicPowerCost
uint32 BasePeriodicPowerCost
Definition
SpellCalculations.h:44
Skyfire::Spells::SpellPowerCostCalculationData::ChannelCostPercentage
float ChannelCostPercentage
Definition
SpellCalculations.h:46
Skyfire::Spells::SpellPowerCostCalculationData::BasePowerCost
uint32 BasePowerCost
Definition
SpellCalculations.h:43
Skyfire::Spells::SpellPowerCostCalculationData::PowerType
int32 PowerType
Definition
SpellCalculations.h:47
Skyfire::Spells::SpellPowerCostCalculationData::PowerCostPercentage
float PowerCostPercentage
Definition
SpellCalculations.h:45
Skyfire::Spells::SpellPowerCostCalculationData::MaxPower
uint32 MaxPower
Definition
SpellCalculations.h:49
Skyfire::Spells::SpellPowerCostCalculationData::CreatedHealth
uint32 CreatedHealth
Definition
SpellCalculations.h:48
Skyfire::Spells::SpellPowerCostCalculationResult
Definition
SpellCalculations.h:53
Skyfire::Spells::SpellPowerCostCalculationResult::PowerCost
uint32 PowerCost
Definition
SpellCalculations.h:54
Skyfire::Spells::SpellPowerCostCalculationResult::Status
SpellPowerCostCalculationStatus Status
Definition
SpellCalculations.h:56
Skyfire::Spells::SpellPowerCostCalculationResult::PeriodicPowerCost
uint32 PeriodicPowerCost
Definition
SpellCalculations.h:55
Skyfire::Spells::SpellRadiusCalculationData
Definition
SpellCalculations.h:23
Skyfire::Spells::SpellRadiusCalculationData::RadiusMax
float RadiusMax
Definition
SpellCalculations.h:27
Skyfire::Spells::SpellRadiusCalculationData::MaxRadiusMin
float MaxRadiusMin
Definition
SpellCalculations.h:29
Skyfire::Spells::SpellRadiusCalculationData::HasMaxRadius
bool HasMaxRadius
Definition
SpellCalculations.h:28
Skyfire::Spells::SpellRadiusCalculationData::RadiusMin
float RadiusMin
Definition
SpellCalculations.h:25
Skyfire::Spells::SpellRadiusCalculationData::HasCaster
bool HasCaster
Definition
SpellCalculations.h:30
Skyfire::Spells::SpellRadiusCalculationData::RadiusPerLevel
float RadiusPerLevel
Definition
SpellCalculations.h:26
Skyfire::Spells::SpellRadiusCalculationData::CasterLevel
uint8 CasterLevel
Definition
SpellCalculations.h:31
Skyfire::Spells::SpellRadiusCalculationData::HasRadius
bool HasRadius
Definition
SpellCalculations.h:24
Skyfire::Spells::SpellTickEffectInfo
Definition
SpellCalculations.h:16
Skyfire::Spells::SpellTickEffectInfo::ApplyAuraTickCount
uint32 ApplyAuraTickCount
Definition
SpellCalculations.h:19
src
server
game
Spells
SpellCalculations.cpp
Generated on
for Project SkyFire Core by
1.17.0