/// <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));
 }
Exemple #6
0
        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);
 }