Skip to content

Commit c0d4d41

Browse files
authored
Merge pull request MUnique#652 from ze-dom/skill_multipliers_addition_and_refactoring
Skill multipliers addition and refactoring
2 parents f0a3eda + 34456d9 commit c0d4d41

File tree

10 files changed

+423
-29
lines changed

10 files changed

+423
-29
lines changed

src/DataModel/Configuration/Skill.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -223,9 +223,9 @@ public partial class Skill
223223
/// </summary>
224224
/// <remarks>
225225
/// For example, horse skill:
226-
/// * new AttributeRelationship(Stats.SkillDamageBonus, 1.0f / 10, Stats.TotalStrength)
227-
/// * new AttributeRelationship(Stats.SkillDamageBonus, 1.0f / 5, Stats.TotalLeadership)
228-
/// * new AttributeRelationship(Stats.SkillDamageBonus, 10, Stats.HorseLevel).
226+
/// * new AttributeRelationship(Stats.SkillBaseDamageBonus, 1.0f / 10, Stats.TotalStrength)
227+
/// * new AttributeRelationship(Stats.SkillBaseDamageBonus, 1.0f / 5, Stats.TotalLeadership)
228+
/// * new AttributeRelationship(Stats.SkillBaseDamageBonus, 10, Stats.HorseLevel).
229229
/// </remarks>
230230
[MemberOfAggregate]
231231
public virtual ICollection<AttributeRelationship> AttributeRelationships { get; protected set; } = null!;

src/GameLogic/AttackableExtensions.cs

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,25 @@ public static async ValueTask<HitInfo> CalculateDamageAsync(this IAttacker attac
193193

194194
if (skill != null)
195195
{
196-
dmg = (int)(dmg * attacker.Attributes[Stats.SkillMultiplier]);
196+
var multiplier = attacker.Attributes[Stats.SkillMultiplier];
197+
198+
if (skill.EnsureSkillAttributes(attacker.Attributes) is { } skillAttributes)
199+
{
200+
dmg += (int)skillAttributes[Stats.SkillFinalDamageBonus];
201+
202+
var skillMultiplier = skillAttributes[Stats.SkillFinalMultiplier];
203+
if (skillMultiplier > 0)
204+
{
205+
multiplier = skillMultiplier;
206+
207+
if (skill.Skill!.Number == 265 && !isPvp) // DragonSlasher
208+
{
209+
multiplier *= 3;
210+
}
211+
}
212+
}
213+
214+
dmg = (int)(dmg * multiplier * damageFactor);
197215
}
198216
else if (attacker.Attributes[Stats.IsDinorantEquipped] > 0)
199217
{
@@ -663,10 +681,10 @@ private static void GetSkillDmg(this IAttacker attacker, SkillEntry? skillEntry,
663681

664682
if (skillEntry.EnsureSkillAttributes(attackerStats) is { } skillAttributes)
665683
{
666-
skillMinimumDamage += (int)skillAttributes[Stats.SkillDamageBonus];
667-
skillMaximumDamage += (int)skillAttributes[Stats.SkillDamageBonus];
684+
skillMinimumDamage += (int)skillAttributes[Stats.SkillBaseDamageBonus];
685+
skillMaximumDamage += (int)skillAttributes[Stats.SkillBaseDamageBonus];
668686

669-
var multiplier = skillAttributes[Stats.SkillMultiplier];
687+
var multiplier = skillAttributes[Stats.SkillBaseMultiplier];
670688
if (multiplier > 0)
671689
{
672690
skillMinimumDamage = (int)(skillMinimumDamage * multiplier);

src/GameLogic/Attributes/Stats.cs

Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -329,16 +329,21 @@ public class Stats
329329
/// <summary>
330330
/// Gets the final damage (any type) bonus attribute definition.
331331
/// </summary>
332-
/// <remarks>So far includes the ancient set option.</remarks>
332+
/// <remarks>Includes the ancient set option and the panda ring bonus.</remarks>
333333
public static AttributeDefinition FinalDamageBonus { get; } = new(new Guid("88316AEC-1D82-4103-BF09-CA6A3C0B177A"), "Late Damage Bonus (any type)", "A bonus value which gets added to the final damage value during the damage calculation.");
334334

335335
/// <summary>
336-
/// Gets the skill multiplier attribute definition.
336+
/// Gets the player's skill multiplier attribute definition.
337337
/// </summary>
338338
public static AttributeDefinition SkillMultiplier { get; } = new(new Guid("D9FB3323-6DF5-48F7-8253-FDBB5EF82114"), "Skill Damage Multiplier", string.Empty);
339339

340340
/// <summary>
341-
/// Gets the skill damage bonus attribute definition.
341+
/// Gets the vitality skill multiplier (RF) attribute definition.
342+
/// </summary>
343+
public static AttributeDefinition VitalitySkillMultiplier { get; } = new(new Guid("5E987FB1-CECB-4703-B7C7-096AAB915672"), "Vitality Skill Damage Multiplier", string.Empty);
344+
345+
/// <summary>
346+
/// Gets the player's skill damage bonus attribute definition.
342347
/// </summary>
343348
/// <remarks>Includes ancient set, harmony, and socket (ice and bonus) options. Does not apply to Fenrir's skill.</remarks>
344349
public static AttributeDefinition SkillDamageBonus { get; } = new(new Guid("B8B214B1-396B-4CA8-9A77-240AA70A989B"), "Skill Damage Bonus", "A bonus value which gets added to the damage calculation when the damage is calculated with a skill.");
@@ -630,6 +635,21 @@ public class Stats
630635
/// </summary>
631636
public static AttributeDefinition StickMasteryBonusDamage { get; } = new(new Guid("E79B2B06-9A32-451F-9B2D-2B91FD79B614"), "Stick Mastery PvP Bonus Damage (MST)", string.Empty);
632637

638+
/// <summary>
639+
/// Gets the explosion skill MST bonus damage, which rises with fire tome strengthener and is added late stage.
640+
/// </summary>
641+
public static AttributeDefinition ExplosionBonusDmg { get; } = new(new Guid("543E01C2-5C61-4473-ACF9-8A63A987A230"), "Explosion Bonus Damage (MST)", "The explosion skill (book of samut) bonus damage, which rises with fire stome strengthener and is added at a late stage.");
642+
643+
/// <summary>
644+
/// Gets the requiem skill MST bonus damage, which rises with wind tome strengthener and is added late stage.
645+
/// </summary>
646+
public static AttributeDefinition RequiemBonusDmg { get; } = new(new Guid("9354C6C8-5F85-440B-8649-3E18B7539D92"), "Requiem Bonus Damage (MST)", "The requiem skill (book of neil) bonus damage, which rises with wind tome strengthener and is added at a late stage.");
647+
648+
/// <summary>
649+
/// Gets the pollution skill MST bonus damage, which rises with lightning tome strengthener and is added late stage.
650+
/// </summary>
651+
public static AttributeDefinition PollutionBonusDmg { get; } = new(new Guid("9B7AF584-DB59-4770-BCE9-1B5131BBDE38"), "Pollution Bonus Damage (MST)", "The pollution skill (book of lagle) bonus damage, which rises with lightning tome strengthener and is added at a late stage.");
652+
633653
/// <summary>
634654
/// Gets the is a scepter equipped.
635655
/// </summary>
@@ -1338,6 +1358,26 @@ public class Stats
13381358
/// </summary>
13391359
public static AttributeDefinition PointsPerReset { get; } = new(new Guid("a34f4f57-b364-4cdb-9989-64cedd2cd831"), "Points Per Reset", "The number of points the player will receive for reset, overwrites the default 'PointsPerReset' value of the reset configuration.");
13401360

1361+
/// <summary>
1362+
/// Gets the skill's base multiplier attribute definition.
1363+
/// </summary>
1364+
public static AttributeDefinition SkillBaseMultiplier { get; } = new(new Guid("FED72F38-5807-454E-8126-F178E93C80D4"), "Skill Base Damage Multiplier (skill attribute)", string.Empty);
1365+
1366+
/// <summary>
1367+
/// Gets the skill's base damage bonus attribute definition.
1368+
/// </summary>
1369+
public static AttributeDefinition SkillBaseDamageBonus { get; } = new(new Guid("89E27E6F-2F84-4B69-9DAA-4EE2A6E3BCCC"), "Skill Base Damage Bonus (skill attribute)", string.Empty);
1370+
1371+
/// <summary>
1372+
/// Gets the skill's final multiplier attribute definition.
1373+
/// </summary>
1374+
public static AttributeDefinition SkillFinalMultiplier { get; } = new(new Guid("AC72CAE4-973C-46BB-BE3B-F6260E8DDFA8"), "Skill Final Damage Multiplier (skill attribute)", string.Empty);
1375+
1376+
/// <summary>
1377+
/// Gets the skill's final damage bonus attribute definition.
1378+
/// </summary>
1379+
public static AttributeDefinition SkillFinalDamageBonus { get; } = new(new Guid("155D8045-5CD1-4238-BEFC-FCF8C46F94E3"), "Skill Final Damage Bonus (skill attribute)", string.Empty);
1380+
13411381
/// <summary>
13421382
/// Gets the dictionary which relates the jewelry element resistance attribute to the correspondent DMG bonus attribute.
13431383
/// </summary>

src/Persistence/Initialization/CharacterClasses/ClassRageFighter.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,8 @@ private CharacterClass CreateRageFighter(CharacterClassNumber number, string nam
8787
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.MaximumPhysBaseDmg, 1.0f / 5, Stats.TotalStrength));
8888
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.MinimumPhysBaseDmg, 1.0f / 15, Stats.TotalVitality));
8989
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.MaximumPhysBaseDmg, 1.0f / 12, Stats.TotalVitality));
90+
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.SkillMultiplier, 0.001f, Stats.TotalEnergy));
91+
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.VitalitySkillMultiplier, 0.001f, Stats.TotalVitality));
9092

9193
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.FenrirBaseDmg, 1.0f / 5, Stats.TotalStrength));
9294
result.AttributeCombinations.Add(this.CreateAttributeRelationship(Stats.FenrirBaseDmg, 1.0f / 5, Stats.TotalAgility));
@@ -95,7 +97,8 @@ private CharacterClass CreateRageFighter(CharacterClassNumber number, string nam
9597

9698
result.BaseAttributeValues.Add(this.CreateConstValueAttribute(57, Stats.MaximumHealth));
9799
result.BaseAttributeValues.Add(this.CreateConstValueAttribute(7, Stats.MaximumMana));
98-
result.BaseAttributeValues.Add(this.CreateConstValueAttribute(2, Stats.SkillMultiplier));
100+
result.BaseAttributeValues.Add(this.CreateConstValueAttribute(0.5f, Stats.SkillMultiplier));
101+
result.BaseAttributeValues.Add(this.CreateConstValueAttribute(0.5f, Stats.VitalitySkillMultiplier));
99102
result.BaseAttributeValues.Add(this.CreateConstValueAttribute(1.0f / 33f, Stats.AbilityRecoveryMultiplier));
100103

101104
this.AddCommonBaseAttributeValues(result.BaseAttributeValues, isMaster);

src/Persistence/Initialization/Skills/IncreaseHealthEffectInitializer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public override void Initialize()
4646

4747
var powerUpDefinition = this.Context.CreateNew<PowerUpDefinition>();
4848
magicEffect.PowerUpDefinitions.Add(powerUpDefinition);
49-
powerUpDefinition.TargetAttribute = Stats.MaximumHealth.GetPersistent(this.GameConfiguration);
49+
powerUpDefinition.TargetAttribute = Stats.TotalVitality.GetPersistent(this.GameConfiguration);
5050

5151
// one per 10 energy
5252
var boostPerEnergy = this.Context.CreateNew<AttributeRelationship>();
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
// <copyright file="WeaknessEffectInitializer.cs" company="MUnique">
2+
// Licensed under the MIT License. See LICENSE file in the project root for full license information.
3+
// </copyright>
4+
5+
namespace MUnique.OpenMU.Persistence.Initialization.Skills;
6+
7+
using MUnique.OpenMU.AttributeSystem;
8+
using MUnique.OpenMU.DataModel.Attributes;
9+
using MUnique.OpenMU.DataModel.Configuration;
10+
using MUnique.OpenMU.GameLogic.Attributes;
11+
12+
/// <summary>
13+
/// Initializer for the weakness effect, which can result from Killing Blow (RF) or Weakness (Sum) skills.
14+
/// </summary>
15+
public class WeaknessEffectInitializer : InitializerBase
16+
{
17+
/// <summary>
18+
/// Initializes a new instance of the <see cref="WeaknessEffectInitializer"/> class.
19+
/// </summary>
20+
/// <param name="context">The context.</param>
21+
/// <param name="gameConfiguration">The game configuration.</param>
22+
public WeaknessEffectInitializer(IContext context, GameConfiguration gameConfiguration)
23+
: base(context, gameConfiguration)
24+
{
25+
}
26+
27+
/// <inheritdoc />
28+
public override void Initialize()
29+
{
30+
var magicEffect = this.Context.CreateNew<MagicEffectDefinition>();
31+
this.GameConfiguration.MagicEffects.Add(magicEffect);
32+
magicEffect.Number = (short)MagicEffectNumber.Weakness;
33+
magicEffect.Name = "Weakness Effect";
34+
magicEffect.InformObservers = true;
35+
magicEffect.SendDuration = false;
36+
magicEffect.StopByDeath = true;
37+
magicEffect.Duration = this.Context.CreateNew<PowerUpDefinitionValue>();
38+
magicEffect.Duration.ConstantValue.Value = 10; // 10 seconds
39+
40+
// Target's physical damage decreases by 5%
41+
var decDmgPowerUpDefinition = this.Context.CreateNew<PowerUpDefinition>();
42+
magicEffect.PowerUpDefinitions.Add(decDmgPowerUpDefinition);
43+
decDmgPowerUpDefinition.TargetAttribute = Stats.WeaknessPhysDmgDecrement.GetPersistent(this.GameConfiguration);
44+
decDmgPowerUpDefinition.Boost = this.Context.CreateNew<PowerUpDefinitionValue>();
45+
decDmgPowerUpDefinition.Boost.ConstantValue.Value = 0.05f;
46+
decDmgPowerUpDefinition.Boost.ConstantValue.AggregateType = AggregateType.AddRaw;
47+
}
48+
}

0 commit comments

Comments
 (0)