[Spells] Update to SPA 130 and SPA 131 focus calculation, focus code improvements (#1486)

[Spells] Update to SPA 130 and SPA 131 focus calculation, focus code improvements
#use instead of PR 1483
This commit is contained in:
KayenEQ 2021-08-01 20:23:59 -04:00 committed by GitHub
parent e71b11fcba
commit 0e7cfe96ef
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 52 additions and 121 deletions

View File

@ -837,6 +837,8 @@ public:
inline void SetSpellPowerDistanceMod(int16 value) { SpellPowerDistanceMod = value; };
int32 GetSpellStat(uint32 spell_id, const char *identifier, uint8 slot = 0);
bool HarmonySpellLevelCheck(int32 spell_id, Mob* target = nullptr);
bool CanFocusUseRandomEffectivenessByType(focusType type);
int GetFocusRandomEffectivenessValue(int focus_base, int focus_base2, bool best_focus = 0);
void CastSpellOnLand(Mob* caster, int32 spell_id);
void FocusProcLimitProcess();

View File

@ -5462,44 +5462,13 @@ int32 Mob::CalcFocusEffect(focusType type, uint16 focus_id, uint16 spell_id, boo
// handle effects
case SE_ImprovedDamage:
if (type == focusImprovedDamage) {
// This is used to determine which focus should be used for the random calculation
if (best_focus) {
// If the spell contains a value in the base2 field then that is the max value
if (focus_spell.base2[i] != 0) {
value = focus_spell.base2[i];
}
// If the spell does not contain a base2 value, then its a straight non random
// value
else {
value = focus_spell.base[i];
}
}
// Actual focus calculation starts here
else if (focus_spell.base2[i] == 0 || focus_spell.base[i] == focus_spell.base2[i]) {
value = focus_spell.base[i];
}
else {
value = zone->random.Int(focus_spell.base[i], focus_spell.base2[i]);
}
value = GetFocusRandomEffectivenessValue(focus_spell.base[i], focus_spell.base2[i], best_focus);
}
break;
case SE_ImprovedDamage2:
if (type == focusImprovedDamage2) {
if (best_focus) {
if (focus_spell.base2[i] != 0) {
value = focus_spell.base2[i];
}
else {
value = focus_spell.base[i];
}
}
else if (focus_spell.base2[i] == 0 || focus_spell.base[i] == focus_spell.base2[i]) {
value = focus_spell.base[i];
}
else {
value = zone->random.Int(focus_spell.base[i], focus_spell.base2[i]);
}
value = GetFocusRandomEffectivenessValue(focus_spell.base[i], focus_spell.base2[i], best_focus);
}
break;
@ -5511,39 +5480,13 @@ int32 Mob::CalcFocusEffect(focusType type, uint16 focus_id, uint16 spell_id, boo
case SE_ImprovedHeal:
if (type == focusImprovedHeal) {
if (best_focus) {
if (focus_spell.base2[i] != 0) {
value = focus_spell.base2[i];
}
else {
value = focus_spell.base[i];
}
}
else if (focus_spell.base2[i] == 0 || focus_spell.base[i] == focus_spell.base2[i]) {
value = focus_spell.base[i];
}
else {
value = zone->random.Int(focus_spell.base[i], focus_spell.base2[i]);
}
value = GetFocusRandomEffectivenessValue(focus_spell.base[i], focus_spell.base2[i], best_focus);
}
break;
case SE_ReduceManaCost:
if (type == focusManaCost) {
if (best_focus) {
if (focus_spell.base2[i] != 0) {
value = focus_spell.base2[i];
}
else {
value = focus_spell.base[i];
}
}
else if (focus_spell.base2[i] == 0 || focus_spell.base[i] == focus_spell.base2[i]) {
value = focus_spell.base[i];
}
else {
value = zone->random.Int(focus_spell.base[i], focus_spell.base2[i]);
}
value = GetFocusRandomEffectivenessValue(focus_spell.base[i], focus_spell.base2[i], best_focus);
}
break;
@ -5590,8 +5533,8 @@ int32 Mob::CalcFocusEffect(focusType type, uint16 focus_id, uint16 spell_id, boo
break;
case SE_ReduceReagentCost:
if (type == focusReagentCost && focus_spell.base[i] > value) {
value = focus_spell.base[i];
if (type == focusReagentCost) {
value = GetFocusRandomEffectivenessValue(focus_spell.base[i], focus_spell.base2[i], best_focus);
}
break;
@ -5603,20 +5546,7 @@ int32 Mob::CalcFocusEffect(focusType type, uint16 focus_id, uint16 spell_id, boo
case SE_SpellResistReduction:
if (type == focusResistRate) {
if (best_focus) {
if (focus_spell.base2[i] != 0) {
value = focus_spell.base2[i];
}
else {
value = focus_spell.base[i];
}
}
else if (focus_spell.base2[i] == 0 || focus_spell.base[i] == focus_spell.base2[i]) {
value = focus_spell.base[i];
}
else {
value = zone->random.Int(focus_spell.base[i], focus_spell.base2[i]);
}
value = GetFocusRandomEffectivenessValue(focus_spell.base[i], focus_spell.base2[i], best_focus);
}
break;
@ -5628,21 +5558,7 @@ int32 Mob::CalcFocusEffect(focusType type, uint16 focus_id, uint16 spell_id, boo
case SE_SpellHateMod:
if (type == focusSpellHateMod) {
if (value != 0) {
if (value > 0) {
if (focus_spell.base[i] > value) {
value = focus_spell.base[i];
}
}
else {
if (focus_spell.base[i] < value) {
value = focus_spell.base[i];
}
}
}
else {
value = focus_spell.base[i];
}
value = GetFocusRandomEffectivenessValue(focus_spell.base[i], focus_spell.base2[i], best_focus);
}
break;
@ -5679,39 +5595,13 @@ int32 Mob::CalcFocusEffect(focusType type, uint16 focus_id, uint16 spell_id, boo
case SE_FcSpellVulnerability:
if (type == focusSpellVulnerability) {
if (best_focus) {
if (focus_spell.base2[i] != 0) {
value = focus_spell.base2[i]; //max damage
}
else {
value = focus_spell.base[i];
} //min damage
}
else if (focus_spell.base2[i] == 0 || focus_spell.base[i] == focus_spell.base2[i]) {
value = focus_spell.base[i]; //If no max damage set, then default to min damage
}
else {
value = zone->random.Int(focus_spell.base[i], focus_spell.base2[i]); //else random for value
}
value = GetFocusRandomEffectivenessValue(focus_spell.base[i], focus_spell.base2[i], best_focus);
}
break;
case SE_Fc_Spell_Damage_Pct_IncomingPC:
if (type == focusFcSpellDamagePctIncomingPC) {
if (best_focus) {
if (focus_spell.base2[i] != 0) {
value = focus_spell.base2[i]; //max damage
}
else {
value = focus_spell.base[i];
} //min damage
}
else if (focus_spell.base2[i] == 0 || focus_spell.base[i] == focus_spell.base2[i]) {
value = focus_spell.base[i]; //If no max damage set, then default to min damage
}
else {
value = zone->random.Int(focus_spell.base[i], focus_spell.base2[i]); //else random for value
}
value = GetFocusRandomEffectivenessValue(focus_spell.base[i], focus_spell.base2[i], best_focus);
}
break;
@ -6122,7 +6012,7 @@ int32 Client::GetFocusEffect(focusType type, uint16 spell_id)
//Improved Healing, Damage & Mana Reduction are handled differently in that some are random percentages
//In these cases we need to find the most powerful effect, so that each piece of gear wont get its own chance
if (RuleB(Spells, LiveLikeFocusEffects) && (type == focusManaCost || type == focusImprovedHeal || type == focusImprovedDamage || type == focusImprovedDamage2 || type == focusResistRate)) {
if (RuleB(Spells, LiveLikeFocusEffects) && CanFocusUseRandomEffectivenessByType(type)) {
rand_effectiveness = true;
}
@ -7889,3 +7779,42 @@ bool Mob::HarmonySpellLevelCheck(int32 spell_id, Mob *target)
}
return true;
}
bool Mob::CanFocusUseRandomEffectivenessByType(focusType type)
{
switch (type) {
case focusImprovedDamage:
case focusImprovedDamage2:
case focusImprovedHeal:
case focusManaCost:
case focusResistRate:
case focusFcDamagePctCrit:
case focusReagentCost:
case focusSpellHateMod:
case focusSpellVulnerability:
case focusFcSpellDamagePctIncomingPC:
return true;
}
return false;
}
int Mob::GetFocusRandomEffectivenessValue(int focus_base, int focus_base2, bool best_focus)
{
int value = 0;
// This is used to determine which focus should be used for the random calculation
if (best_focus) {
// If the spell does not contain a base2 value, then its a straight non random
value = focus_base;
// If the spell contains a value in the base2 field then that is the max value
if (focus_base2 != 0) {
value = focus_base2;
}
return value;
}
else if (focus_base2 == 0 || focus_base == focus_base2) { // Actual focus calculation starts here
return focus_base;
}
return zone->random.Int(focus_base, focus_base2);
}