diff --git a/src/NosCore.GameObject/Services/BattleService/BattleStatsProvider.cs b/src/NosCore.GameObject/Services/BattleService/BattleStatsProvider.cs index 2d273609f..c096596da 100644 --- a/src/NosCore.GameObject/Services/BattleService/BattleStatsProvider.cs +++ b/src/NosCore.GameObject/Services/BattleService/BattleStatsProvider.cs @@ -171,6 +171,7 @@ private static CombatStats ApplyBuffs(CombatStats stats, IReadOnlyCollection + new() + { + Type = (byte)BCardType.CardType.ElementResistance, + SubType = (byte)subType, + FirstData = value + }; + + private static CombatStats StatsWith(params BCardDto[] bCards) + { + var monster = new NpcMonsterDto + { + FireResistance = BaseFire, + WaterResistance = 0, + LightResistance = 0, + DarkResistance = 0 + }; + + var entity = new Mock(); + entity.SetupGet(e => e.NpcMonster).Returns(monster); + entity.SetupGet(e => e.Level).Returns((byte)1); + entity.SetupGet(e => e.HeroLevel).Returns((byte)0); + + var buffs = new Mock(); + buffs.Setup(b => b.GetActiveBuffs(It.IsAny())).Returns(new List + { + new(CardId: 1, BuffType: BuffType.Good, Caster: null, + StartedAt: Instant.MinValue, ExpiresAt: Instant.MaxValue, BCards: bCards) + }); + + return new BattleStatsProvider(buffs.Object).GetStats(entity.Object); + } + + [TestMethod] + public void AFireResistanceBuffAddsToTheMonstersOwn() + { + var stats = StatsWith(Resistance(AdditionalTypes.ElementResistance.FireIncreased, 25)); + + Assert.AreEqual(BaseFire + 25, stats.FireResistance); + Assert.AreEqual(0, stats.WaterResistance, "only fire was named"); + } + + // "All elemental resistance is increased by %s" reaches every one of the four. Keeping it + // in a fifth field would mean remembering to add it at each of the four reads. + [TestMethod] + public void TheAllSubtypeReachesEveryElement() + { + var stats = StatsWith(Resistance(AdditionalTypes.ElementResistance.AllIncreased, 15)); + + Assert.AreEqual(BaseFire + 15, stats.FireResistance); + Assert.AreEqual(15, stats.WaterResistance); + Assert.AreEqual(15, stats.LightResistance); + Assert.AreEqual(15, stats.DarkResistance); + } + + [TestMethod] + public void AllAndOneElementAddUpOnThatElement() + { + var stats = StatsWith( + Resistance(AdditionalTypes.ElementResistance.AllIncreased, 15), + Resistance(AdditionalTypes.ElementResistance.WaterIncreased, 10)); + + Assert.AreEqual(25, stats.WaterResistance); + Assert.AreEqual(15, stats.LightResistance); + } + + // The X1/X2 pairs of this type carry different sentences - "increased by" against + // "decreased by" - so X2 really is the negation, unlike the types where the file repeats + // the same line in both slots. + [TestMethod] + public void TheDecreasingSubtypeTakesAway() + { + var stats = StatsWith(Resistance(AdditionalTypes.ElementResistance.FireDecreased, 4)); + + Assert.AreEqual(BaseFire - 4, stats.FireResistance); + } + + [TestMethod] + public void WithoutAnyOfTheseTheMonsterKeepsItsOwn() + { + var stats = StatsWith(); + + Assert.AreEqual(BaseFire, stats.FireResistance); + Assert.AreEqual(0, stats.DarkResistance); + } + } +}