예제 #1
0
        public void BattleManager_CorrectlyCalculatesDamageForShield()
        {
            int shieldDefense = 10;

            IronBattleShield shield = new IronBattleShield((shieldDefense * 2) + 1, shieldDefense, 0);

            _humanPlayer1.SetBattleShield(shield);

            _logger.SubscribeAll(_humanPlayer1.BattleShield);

            _humanPlayer1.SetDefense(shieldDefense);
            _humanPlayer1.SetStrength(_enemyPlayer1.MaxHealth + _enemyPlayer1.Defense);
            _humanPlayer1.SetMove(_basicAttackMove);
            _humanPlayer1.SetMoveTarget(_enemyPlayer1);

            _enemyPlayer1.SetSpeed(1);
            _enemyPlayer1.SetStrength(shieldDefense * 2);
            _enemyPlayer1.SetMove(_basicAttackMove);

            _chanceService.PushEventsOccur(true, false, true, false); //attacks hit, 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);

            PhysicalDamageTakenEventArgs e = logs[0].E as PhysicalDamageTakenEventArgs;

            Assert.NotNull(e);
            Assert.AreEqual(shieldDefense, e.Damage);
        }
예제 #2
0
        public void AttackMovePower_AppropriatelyAffectsDamage()
        {
            _logger.Subscribe(_team2Fighter, EventType.DamageTaken);

            int weakAttackPower   = 4;
            int strongAttackPower = 8;

            AttackBattleMove weakerAttack   = new AttackBattleMove("foo", TargetType.SingleEnemy, 100, 0, weakAttackPower);
            AttackBattleMove strongerAttack = new AttackBattleMove("foo", TargetType.SingleEnemy, 100, 0, strongAttackPower);

            _team1Fighter.SetStrength(0);

            _team1Fighter.SetMove(weakerAttack, 1);
            _team1Fighter.SetMove(strongerAttack, 1);
            _chanceService.PushEventsOccur(true, false, true, false); //attacks hit, not crits

            _team2Fighter.SetHealth(weakAttackPower + strongAttackPower);
            _team2Fighter.SetMove(_doNothingMove);

            _battleManager.Battle(_team1, _team2);

            List <EventLog> logs = _logger.Logs;

            Assert.AreEqual(2, logs.Count);

            PhysicalDamageTakenEventArgs e = logs[0].E as PhysicalDamageTakenEventArgs;

            Assert.NotNull(e);
            Assert.AreEqual(weakAttackPower, e.Damage);

            e = logs[1].E as PhysicalDamageTakenEventArgs;
            Assert.NotNull(e);
            Assert.AreEqual(strongAttackPower, e.Damage);
        }
예제 #3
0
        public virtual int DecrementHealth(int damage)
        {
            if (damage < 0)
            {
                throw new ArgumentException("DecrementHealth cannot be given a negative amount of damage!", nameof(damage));
            }
            var previousHealth = CurrentHealth;

            CurrentHealth -= damage;

            if (CurrentHealth < 0)
            {
                CurrentHealth = 0;
            }

            PhysicalDamageTakenEventArgs e = new PhysicalDamageTakenEventArgs(damage);

            OnDamageTaken(e);

            if (CurrentHealth == 0)
            {
                OnShieldDestroyed(new ShieldDestroyedEventArgs());
            }

            return(previousHealth - CurrentHealth);
        }
예제 #4
0
        public void AttackMethod_AppropriatelyRaisesEvents_WhenEnemySurvives()
        {
            var expectedDamage = _fighter.Strength - _enemy.Defense;

            _enemy.SetHealth(expectedDamage + 1);

            _fighter.Attack(_enemy);

            var logs = _logger.Logs;

            Assert.AreEqual(2, logs.Count);

            Assert.AreEqual(EventType.DamageTaken, logs[0].Type);
            Assert.AreEqual(_enemy, logs[0].Sender);
            PhysicalDamageTakenEventArgs e1 = logs[0].E as PhysicalDamageTakenEventArgs;

            Assert.NotNull(e1);
            Assert.AreEqual(expectedDamage, e1.Damage);

            Assert.AreEqual(EventType.AttackSuccessful, logs[1].Type);
            Assert.AreEqual(_fighter, logs[1].Sender);
            AttackSuccessfulEventArgs e2 = logs[1].E as AttackSuccessfulEventArgs;

            Assert.NotNull(e2);
            Assert.AreEqual(expectedDamage, e2.DamageDealt);
        }
예제 #5
0
        public void AttackMethod_AppropriatelyRaisesEvents_WhenEnemyDies()
        {
            _fighter = (TestHumanFighter)TestFighterFactory.GetFighter(TestFighterType.TestHuman, 1, "Ted");
            _logger.SubscribeAll(_fighter);

            _fighter.SetStrength(_enemy.MaxHealth + 1);

            _fighter.Attack(_enemy);

            var logs = _logger.Logs;

            Assert.AreEqual(4, logs.Count);

            //first event, damage taken
            Assert.AreEqual(EventType.DamageTaken, logs[0].Type);
            Assert.AreEqual(_enemy, logs[0].Sender);
            PhysicalDamageTakenEventArgs e1 = logs[0].E as PhysicalDamageTakenEventArgs;

            Assert.NotNull(e1);
            Assert.AreEqual(_fighter.Strength, e1.Damage);

            //second event, killed - fired by enemy
            Assert.AreEqual(EventType.Killed, logs[1].Type);
            Assert.AreEqual(_enemy, logs[1].Sender);
            KilledEventArgs e2 = logs[1].E as KilledEventArgs;

            Assert.That(e2, Is.Not.Null);

            //third event, damageDealt to enemy
            Assert.AreEqual(EventType.AttackSuccessful, logs[2].Type);
            Assert.AreEqual(_fighter, logs[2].Sender);
            AttackSuccessfulEventArgs e3 = logs[2].E as AttackSuccessfulEventArgs;

            Assert.NotNull(e3);
            Assert.AreEqual(_enemy.MaxHealth, e3.DamageDealt);

            //fourth event, killed enemy
            Assert.AreEqual(EventType.EnemyKilled, logs[3].Type);
            Assert.AreEqual(_fighter, logs[3].Sender);
            EnemyKilledEventArgs e4 = logs[3].E as EnemyKilledEventArgs;

            Assert.NotNull(e4);
            Assert.AreEqual(_enemy, e4.Enemy);
        }
        protected void PrintPhysicalDamageMessage(object sender, PhysicalDamageTakenEventArgs e)
        {
            int damage = e.Damage;

            if (Config.ShowPhysicalDamageMessages)
            {
                IBattleShield senderAsShield = sender as IBattleShield;

                string output;

                if (senderAsShield != null)
                {
                    output = $"{senderAsShield.Owner.DisplayName}'s {senderAsShield.GetDisplayText(false)} took {damage} damage!";
                }
                else
                {
                    output = $"It did {damage} damage!";
                }

                _output.WriteLine(output);
            }
        }
예제 #7
0
        public void CalculatedAttackPowerCannotBeNegative()
        {
            _logger.Subscribe(_team2Fighter, EventType.DamageTaken);

            AttackBattleMove attack = new AttackBattleMove("foo", TargetType.SingleEnemy, 100, 0, -1);

            _team1Fighter.SetStrength(0);
            _team1Fighter.SetMove(attack, 1);
            _team1Fighter.SetMove(_runawayMove, 1);
            _chanceService.PushEventsOccur(true, false); //attack hit, not crits

            _team2Fighter.SetMove(_doNothingMove);

            _battleManager.Battle(_team1, _team2);

            List <EventLog> logs = _logger.Logs;

            Assert.AreEqual(1, logs.Count);

            PhysicalDamageTakenEventArgs e = logs[0].E as PhysicalDamageTakenEventArgs;

            Assert.NotNull(e);
            Assert.AreEqual(0, e.Damage);
        }
예제 #8
0
 private void _logDamageTaken(object sender, PhysicalDamageTakenEventArgs e)
 {
     Logs.Add(new EventLog(EventType.DamageTaken, sender, e));
 }
예제 #9
0
 public void OnDamageTaken(PhysicalDamageTakenEventArgs e)
 {
     DamageTaken?.Invoke(this, e);
 }