From 8a2c0ead3d3c911ea2e8b4993e174c4cf7eb0c97 Mon Sep 17 00:00:00 2001 From: Kamron Batman <3953314+kamronbatman@users.noreply.github.com> Date: Sat, 1 Oct 2022 12:25:40 -0700 Subject: [PATCH] fix: Fixes cast spell speeds for various expansions (#1178) * Adds 0.25s for all spells for SA+ Era * Fixes Summon Creature & Blade Spirits cast delay * Fixes minimum cast delay for chivalry spells * Fixes poison strike and wither spells --- Projects/UOContent/Spells/Base/MagerySpell.cs | 17 +++++++++-- Projects/UOContent/Spells/Base/Spell.cs | 7 +++++ .../UOContent/Spells/Chivalry/PaladinSpell.cs | 28 ++++++------------ .../UOContent/Spells/Chivalry/RemoveCurse.cs | 4 ++- .../UOContent/Spells/Fifth/BladeSpirits.cs | 29 ++++++++++--------- .../UOContent/Spells/Fifth/SummonCreature.cs | 10 +++++-- .../Spells/Necromancy/NecromancerSpell.cs | 5 +--- .../UOContent/Spells/Necromancy/Wither.cs | 7 ++++- 8 files changed, 62 insertions(+), 45 deletions(-) diff --git a/Projects/UOContent/Spells/Base/MagerySpell.cs b/Projects/UOContent/Spells/Base/MagerySpell.cs index c25d8ac6a..4408c1eeb 100644 --- a/Projects/UOContent/Spells/Base/MagerySpell.cs +++ b/Projects/UOContent/Spells/Base/MagerySpell.cs @@ -98,8 +98,19 @@ namespace Server.Spells public virtual double GetResistPercent(Mobile target) => GetResistPercentForCircle(target, Circle); - public override TimeSpan GetCastDelay() => - !Core.ML && Scroll is BaseWand ? TimeSpan.Zero : - !Core.AOS ? TimeSpan.FromSeconds(0.5 + 0.25 * (int)Circle) : base.GetCastDelay(); + public override TimeSpan GetCastDelay() + { + if (!Core.ML || Scroll is BaseWand) + { + return TimeSpan.Zero; + } + + if (!Core.AOS) + { + return TimeSpan.FromSeconds(0.5 + 0.25 * (int)Circle); + } + + return base.GetCastDelay(); + } } } diff --git a/Projects/UOContent/Spells/Base/Spell.cs b/Projects/UOContent/Spells/Base/Spell.cs index 04da7be38..2bb2dd45f 100644 --- a/Projects/UOContent/Spells/Base/Spell.cs +++ b/Projects/UOContent/Spells/Base/Spell.cs @@ -705,6 +705,13 @@ namespace Server.Spells fc -= EssenceOfWindSpell.GetFCMalus(Caster); } + if (Core.SA) + { + // At some point OSI added 0.25s to every spell. This makes the minimum 0.5s + // Note: This is done after multiplying for summon creature & blade spirits. + fc--; + } + var fcDelay = TimeSpan.FromSeconds(-(CastDelayFastScalar * fc * CastDelaySecondsPerTick)); return Utility.Max(CastDelayBase + fcDelay, CastDelayMinimum); diff --git a/Projects/UOContent/Spells/Chivalry/PaladinSpell.cs b/Projects/UOContent/Spells/Chivalry/PaladinSpell.cs index b65ded8e2..65d768ad3 100644 --- a/Projects/UOContent/Spells/Chivalry/PaladinSpell.cs +++ b/Projects/UOContent/Spells/Chivalry/PaladinSpell.cs @@ -19,7 +19,7 @@ namespace Server.Spells.Chivalry public override bool ClearHandsOnCast => false; - // public override int CastDelayBase => 1; + public override TimeSpan CastDelayMinimum => TimeSpan.FromSeconds(Core.SA ? 0.5 : 0.25); public override int CastRecoveryBase => 7; @@ -34,20 +34,15 @@ namespace Server.Spells.Chivalry if (Caster.TithingPoints < RequiredTithing) { - Caster.SendLocalizedMessage( - 1060173, - RequiredTithing - .ToString() - ); // You must have at least ~1_TITHE_REQUIREMENT~ Tithing Points to use this ability, + // You must have at least ~1_TITHE_REQUIREMENT~ Tithing Points to use this ability, + Caster.SendLocalizedMessage(1060173, RequiredTithing.ToString()); return false; } if (Caster.Mana < mana) { - Caster.SendLocalizedMessage( - 1060174, - mana.ToString() - ); // You must have at least ~1_MANA_REQUIREMENT~ Mana to use this ability. + // You must have at least ~1_MANA_REQUIREMENT~ Mana to use this ability. + Caster.SendLocalizedMessage(1060174, mana.ToString()); return false; } @@ -67,20 +62,15 @@ namespace Server.Spells.Chivalry if (Caster.TithingPoints < requiredTithing) { - Caster.SendLocalizedMessage( - 1060173, - RequiredTithing - .ToString() - ); // You must have at least ~1_TITHE_REQUIREMENT~ Tithing Points to use this ability, + // You must have at least ~1_TITHE_REQUIREMENT~ Tithing Points to use this ability, + Caster.SendLocalizedMessage(1060173, RequiredTithing.ToString()); return false; } if (Caster.Mana < mana) { - Caster.SendLocalizedMessage( - 1060174, - mana.ToString() - ); // You must have at least ~1_MANA_REQUIREMENT~ Mana to use this ability. + // You must have at least ~1_MANA_REQUIREMENT~ Mana to use this ability. + Caster.SendLocalizedMessage(1060174, mana.ToString()); return false; } diff --git a/Projects/UOContent/Spells/Chivalry/RemoveCurse.cs b/Projects/UOContent/Spells/Chivalry/RemoveCurse.cs index 9c407706e..43c582331 100644 --- a/Projects/UOContent/Spells/Chivalry/RemoveCurse.cs +++ b/Projects/UOContent/Spells/Chivalry/RemoveCurse.cs @@ -21,7 +21,9 @@ namespace Server.Spells.Chivalry { } - public override TimeSpan CastDelayBase => TimeSpan.FromSeconds(1.5); + // https://uo.com/wiki/ultima-online-wiki/publish-notes/publish-108/ - 1.5 -> 2.0 + // According to tests, this includes the 0.25s added penalty, so we are adjusting to 1.75s base. + public override TimeSpan CastDelayBase => TimeSpan.FromSeconds(Core.EJ ? 1.75 : 1.5); public override double RequiredSkill => 5.0; public override int RequiredMana => 20; diff --git a/Projects/UOContent/Spells/Fifth/BladeSpirits.cs b/Projects/UOContent/Spells/Fifth/BladeSpirits.cs index 6bf8cf6a0..82e94f9b7 100644 --- a/Projects/UOContent/Spells/Fifth/BladeSpirits.cs +++ b/Projects/UOContent/Spells/Fifth/BladeSpirits.cs @@ -34,17 +34,7 @@ namespace Server.Spells.Fifth } else if (SpellHelper.CheckTown(p, Caster) && CheckSequence()) { - TimeSpan duration; - - if (Core.AOS) - { - duration = TimeSpan.FromSeconds(120); - } - else - { - duration = TimeSpan.FromSeconds(Utility.Random(80, 40)); - } - + var duration = TimeSpan.FromSeconds(Core.AOS ? 120 : Utility.Random(80, 40)); BaseCreature.Summon(new BladeSpirits(), false, Caster, new Point3D(p), 0x212, duration); } @@ -53,12 +43,23 @@ namespace Server.Spells.Fifth public override TimeSpan GetCastDelay() { - if (Core.AOS) + var scalar = Core.Expansion switch { - return TimeSpan.FromTicks(base.GetCastDelay().Ticks * (Core.SE ? 3 : 5)); + >= Expansion.SE => 3, + >= Expansion.AOS => 5, + _ => 4 + }; + + var delay = base.GetCastDelay() * scalar; + + // SA made everything 0.25s slower, but that is applied after the scalar + // So remove 0.25 * scalar to compensate + if (Core.SA) + { + delay -= TimeSpan.FromSeconds(0.25 * scalar); } - return base.GetCastDelay() + TimeSpan.FromSeconds(6.0); + return delay; } public override bool CheckCast() diff --git a/Projects/UOContent/Spells/Fifth/SummonCreature.cs b/Projects/UOContent/Spells/Fifth/SummonCreature.cs index 639b82d86..c4896a763 100644 --- a/Projects/UOContent/Spells/Fifth/SummonCreature.cs +++ b/Projects/UOContent/Spells/Fifth/SummonCreature.cs @@ -91,12 +91,16 @@ namespace Server.Spells.Fifth public override TimeSpan GetCastDelay() { - if (Core.AOS) + var delay = base.GetCastDelay() * (Core.AOS ? 5 : 4); + + // SA made everything 0.25 slower, but that is applied after the scalar + // So remove 0.25 * 5 to compensate + if (Core.SA) { - return TimeSpan.FromTicks(base.GetCastDelay().Ticks * 5); + delay -= TimeSpan.FromSeconds(1.25); } - return base.GetCastDelay() + TimeSpan.FromSeconds(6.0); + return delay; } } } diff --git a/Projects/UOContent/Spells/Necromancy/NecromancerSpell.cs b/Projects/UOContent/Spells/Necromancy/NecromancerSpell.cs index ec46553e3..e1b6c33b5 100644 --- a/Projects/UOContent/Spells/Necromancy/NecromancerSpell.cs +++ b/Projects/UOContent/Spells/Necromancy/NecromancerSpell.cs @@ -14,13 +14,10 @@ namespace Server.Spells.Necromancy public override SkillName CastSkill => SkillName.Necromancy; public override SkillName DamageSkill => SkillName.SpiritSpeak; - // public override int CastDelayBase => base.CastDelayBase; // Reference, 3 - public override bool ClearHandsOnCast => false; // Necromancer spells are not affected by fast cast items, though they are by fast cast recovery - public override double CastDelayFastScalar => - Core.SE ? base.CastDelayFastScalar : 0; + public override double CastDelayFastScalar => Core.SE ? base.CastDelayFastScalar : 0; public override int ComputeKarmaAward() { diff --git a/Projects/UOContent/Spells/Necromancy/Wither.cs b/Projects/UOContent/Spells/Necromancy/Wither.cs index bba496417..b134850af 100644 --- a/Projects/UOContent/Spells/Necromancy/Wither.cs +++ b/Projects/UOContent/Spells/Necromancy/Wither.cs @@ -21,7 +21,12 @@ namespace Server.Spells.Necromancy { } - public override TimeSpan CastDelayBase => TimeSpan.FromSeconds(1.5); + public override TimeSpan CastDelayBase => TimeSpan.FromSeconds(Core.Expansion switch + { + >= Expansion.SA => 1.25, + >= Expansion.ML => 1.5, + _ => 1.0 + }); public override double RequiredSkill => 60.0;