/// <summary> /// A method that fires the <see cref="OnMagicalDamageTaken" /> event and potentially the <seealso cref="OnShieldDestroyed"/> event /// Taking into acocunt elemental weaknesses. THe base version does not actually use the <paramref name="attackingType"/> to somehow inform the damage taken /// </summary> /// <param name="damage"></param> /// <param name="attackingType"></param> /// <returns></returns> public virtual int DecrementHealth(int damage, MagicType attackingType) { if (damage < 0) { throw new ArgumentException("DecrementHealth cannot be given a negative amount of damage!", nameof(damage)); } int previousHealth = CurrentHealth; CurrentHealth -= damage; if (CurrentHealth < 0) { CurrentHealth = 0; } MagicalDamageTakenEventArgs e = new MagicalDamageTakenEventArgs(damage, attackingType); OnMagicalDamageTaken(e); if (CurrentHealth == 0) { OnShieldDestroyed(new ShieldDestroyedEventArgs()); } return(previousHealth - CurrentHealth); }
public void FiresProperEvents_MagicalDamage_NotDestroyed() { int damage = _shield.MaxHealth - 1; _shield.DecrementHealth(damage, MagicType.Fire); var logs = _logger.Logs; Assert.AreEqual(1, logs.Count); //damage taken var log = logs[0]; Assert.AreEqual(EventType.MagicalDamageTaken, log.Type); MagicalDamageTakenEventArgs e = log.E as MagicalDamageTakenEventArgs; Assert.NotNull(e); Assert.AreEqual(damage, e.Damage); Assert.AreEqual(_shield, log.Sender); }
protected void PrintMagicalDamageTakenMessage(object sender, MagicalDamageTakenEventArgs e) { if (!Config.ShowMagicalDamageMessages) { return; } int damageTaken = e.Damage; IFighter senderAsFighter = sender as IFighter; if (senderAsFighter == null) { throw new ArgumentException("Something other than an IFighter fired a 'magicalDamageTaken' event!"); } string output = $"{senderAsFighter.DisplayName} took {damageTaken} damage!"; _output.WriteLine(output); }
public void BattleManager_CorrectlyCalculatesMagicalDamageForShield([Values(MagicType.Fire, MagicType.Ice)] MagicType spellMagicType) { int shieldResistance = 10; IronBattleShield shield = new IronBattleShield((shieldResistance * 2) + 1, 0, shieldResistance); _humanPlayer1.SetBattleShield(shield); _logger.SubscribeAll(_humanPlayer1.BattleShield); _humanPlayer1.SetMagicResistance(shieldResistance); _humanPlayer1.SetStrength(_enemyPlayer1.MaxHealth + _enemyPlayer1.Defense); _humanPlayer1.SetMove(_basicAttackMove); _humanPlayer1.SetMoveTarget(_enemyPlayer1); _enemyPlayer1.SetSpeed(1); _enemyPlayer1.SetMagicStrength(shieldResistance * 2); Spell spell = new Spell("foo", spellMagicType, SpellType.Attack, TargetType.SingleEnemy, 0, 0); _enemyPlayer1.AddSpell(spell); _enemyPlayer1.SetMove(spell); _chanceService.PushEventsOccur(true, false); //attack hits, not misses _humanTeam = new Team(_menuManager, _humanPlayer1); _enemyTeam = new Team(_menuManager, _enemyPlayer1); _battleManager.Battle(_humanTeam, _enemyTeam); List <EventLog> logs = _logger.Logs; Assert.AreEqual(1, logs.Count); MagicalDamageTakenEventArgs e = logs[0].E as MagicalDamageTakenEventArgs; Assert.NotNull(e); Assert.AreEqual(shieldResistance, e.Damage); Assert.AreEqual(spellMagicType, e.MagicType); }
private void _logMagicalDamageTaken(object sender, MagicalDamageTakenEventArgs e) { Logs.Add(new EventLog(EventType.MagicalDamageTaken, sender, e)); }
public void CastMethod_AppropriatelyRaisesEvents([Values(false, true)] bool enemyDies) { var spellDamage = _fireballSpell.Power + _human.MagicStrength; int enemyHealth = spellDamage + (enemyDies ? 0 : 1); _enemy.SetHealth(enemyHealth); _human.SetDeathOnTurnEndEvent(); _human.AddSpell(_fireballSpell); _human.SetMana(_fireballSpell.Cost); _human.SetMove(_fireballSpell); _human.SetMoveTarget(_enemy); _logger.Subscribe(EventType.ManaLost, _human); _logger.Subscribe(EventType.SpellSuccessful, _human); _logger.Subscribe(EventType.EnemyKilled, _human); _logger.Subscribe(EventType.MagicalDamageTaken, _enemy); _logger.Subscribe(EventType.Killed, _enemy); _battleManager.Battle(_humanTeam, _enemyTeam); var logs = _logger.Logs; int expectedLogCount = enemyDies ? 5 : 3; Assert.AreEqual(expectedLogCount, logs.Count); int i = 0; //first event, mana spent EventLog log = logs[i++]; Assert.AreEqual(EventType.ManaLost, log.Type); Assert.AreEqual(_human, log.Sender); ManaLostEventArgs e1 = log.E as ManaLostEventArgs; Assert.That(e1, Is.Not.Null); if (e1 != null) { Assert.AreEqual(_fireballSpell.Cost, e1.ManaSpent); } //second event, magical damage taken log = logs[i++]; Assert.AreEqual(EventType.MagicalDamageTaken, log.Type); Assert.AreEqual(_enemy, log.Sender); MagicalDamageTakenEventArgs e2 = log.E as MagicalDamageTakenEventArgs; Assert.That(e2, Is.Not.Null); if (e2 != null) { Assert.AreEqual(spellDamage, e2.Damage); Assert.AreEqual(_fireballSpell.ElementalType, e2.MagicType); } //killed event sent by enemy, potentially if (enemyDies) { log = logs[i++]; Assert.AreEqual(EventType.Killed, log.Type); Assert.AreEqual(_enemy, log.Sender); KilledEventArgs e3 = log.E as KilledEventArgs; Assert.That(e3, Is.Not.Null); } //Spell successful log = logs[i++]; Assert.AreEqual(EventType.SpellSuccessful, log.Type); Assert.AreEqual(_human, log.Sender); SpellSuccessfulEventArgs e4 = log.E as SpellSuccessfulEventArgs; Assert.That(e4, Is.Not.Null); if (e4 != null) { Assert.AreEqual(_fireballSpell, e4.Spell); Assert.AreEqual(spellDamage, e4.DamageDealt); Assert.AreEqual(_enemy, e4.TargettedFoe); } //enemy killed, potentially if (enemyDies) { log = logs[i]; Assert.AreEqual(EventType.EnemyKilled, log.Type); Assert.AreEqual(_human, log.Sender); EnemyKilledEventArgs e5 = log.E as EnemyKilledEventArgs; Assert.That(e5, Is.Not.Null); if (e5 != null) { Assert.AreEqual(_enemy, e5.Enemy); } } }
public void OnMagicalDamageTaken(MagicalDamageTakenEventArgs e) { MagicalDamageTaken?.Invoke(this, e); }