public void ApplyVisualEffects(Attack attack) { foreach (var visualEffect in VisualEffects) { visualEffect.RunEffect(attack); } }
public float CalculateAttackDamage(Attack attack) { var baseDamage = attack.Weapon.Damage; var targetBonusDamage = CombatLinkEffects.Sum(combatLinkEffect => combatLinkEffect.RunEffect(attack)); var passiveBonusDamage = CombatWeightEffects.Sum(combatLinkEffect => combatLinkEffect.RunEffect(attack.Weapon)); return baseDamage + targetBonusDamage + passiveBonusDamage; }
public bool RunEffect(Attack context) { var applicableTags = this.FindApplicableTags(context.Weapon, context.Target); if(!applicableTags.Any()) { return false; } var immolationStrenth = applicableTags.Sum(x => x.Weight); ApplyImmolationEffect(context.Target.GameObject, immolationStrenth); return true; }
public void should_only_apply_applicable_tags() { var dummyTagLink1 = new TagLink { SourceTag = "silver", DestinationTag = "werewolf", Weight = 1.0f }; var dummyTagLink2 = new TagLink { SourceTag = "silver", DestinationTag = "undead", Weight = 0.5f }; var dummyTagList = new List<TagLink>() { dummyTagLink1, dummyTagLink2 }; var dummyWeapon = new Weapon { Damage = 1.0f, Tags = { "silver" } }; var dummyTarget = new GameEntity(new List<string> { "werewolf" }); var dummyAttack = new Attack { Weapon = dummyWeapon, Target = dummyTarget }; var bonusDamageWeightEffect = new BonusDamageDependentEffect(dummyTagList); var expectedResult = 1.0f; var actualResult = bonusDamageWeightEffect.RunEffect(dummyAttack); Assert.That(actualResult, Is.EqualTo(expectedResult)); }
public void should_only_apply_applicable_tags() { var dummyTagLink1 = new TagLink { SourceTag = "magic", DestinationTag = "magic", Weight = -0.5f }; var dummyTagLink2 = new TagLink { SourceTag = "physical", DestinationTag = "stalwart", Weight = -0.3f }; var dummyTagList = new List<TagLink>() { dummyTagLink1, dummyTagLink2 }; var dummyWeapon = new Weapon { Damage = 1.0f, Tags = { "magic" } }; var dummyTarget = new GameEntity(new List<string> { "magic" }); var dummyAttack = new Attack { Weapon = dummyWeapon, Target = dummyTarget }; var resistancesLinkEffect = new ResistancesDependentEffect(dummyTagList); var expectedResult =-0.5f; var actualResult = resistancesLinkEffect.RunEffect(dummyAttack); Assert.That(actualResult, Is.EqualTo(expectedResult)); }
public void should_calculate_total_damage() { var mockBonusDamageEffect = Substitute.For<ICombatDependentEffect>(); mockBonusDamageEffect.RunEffect(Arg.Any<Attack>()).Returns(2.0f); // 200% situational damage bonus var mockResistanceEffect = Substitute.For<ICombatDependentEffect>(); mockResistanceEffect.RunEffect(Arg.Any<Attack>()).Returns(-1.0f); // 100% situational resistance var mockPassiveEffect = Substitute.For<ICombatPassiveEffect>(); mockPassiveEffect.RunEffect(Arg.Any<Weapon>()).Returns(0.5f); // 50% passive damage bonus var dummyWeapon = new Weapon { Damage = 1.0f }; var dummyTarget = new GameEntity(); var dummyAttack = new Attack { Weapon = dummyWeapon, Target = dummyTarget }; var damageCalculator = new DamageCalculator(new []{ mockBonusDamageEffect, mockResistanceEffect}, new []{ mockPassiveEffect }); var expectedResult = 2.5f; var actualResult = damageCalculator.CalculateAttackDamage(dummyAttack); Assert.That(actualResult, Is.EqualTo(expectedResult)); }
public float RunEffect(Attack context) { var applicableEffects = this.FindApplicableTags(context.Weapon, context.Target); return applicableEffects.Sum(x => context.Weapon.Damage * x.Weight); }