예제 #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 Setup()
        {
            _fighter = new TestHumanFighter("Hero", 1);
            _fighter.SetHealth(FighterHealth);
            _fighter.SetMana(FighterMana);
            _fighter.SetStrength(FighterAttack);
            _fighter.SetDefense(FighterDefense);
            _fighter.SetSpeed(FighterSpeed);
            _fighter.SetEvade(FighterEvade);
            _fighter.SetLuck(FighterLuck);

            _factoryFighter = (TestHumanFighter)TestFighterFactory.GetFighter(TestFighterType.TestHuman, 1, "Ted");
            _factoryFighter.AddSpell(SpellFactory.GetSpell(MagicType.Fire, 1));
            _enemy             = (TestEnemyFighter)TestFighterFactory.GetFighter(TestFighterType.TestEnemy, 1, "enemy");
            _armoredEnemy      = (TestEnemyFighter)TestFighterFactory.GetFighter(TestFighterType.TestEnemy, 1, "armored");
            _superArmoredEnemy = (TestEnemyFighter)TestFighterFactory.GetFighter(TestFighterType.TestEnemy, 1, "super armored");

            _input         = new MockInput();
            _output        = new MockOutput();
            _menuManager   = new TestMenuManager(_input, _output);
            _chanceService = new MockChanceService();

            _battleManager = new TestBattleManager(_chanceService, _input, _output);

            var humanTeam = new Team(_menuManager, _fighter);

            _battleManager.SetHumanTeam(humanTeam);

            var enemyTeam = new Team(_menuManager, _enemy);

            _battleManager.SetEnemyTeam(enemyTeam);

            _battleManager.SetConfig(new BattleManagerBattleConfiguration());
        }
예제 #3
0
        public void TestUndoDebuffsEffect_IndividualEffect()
        {
            StatMultiplierStatus lowerAttackStatus    = new StatMultiplierStatus(3, StatType.Strength, 1.0 / 3);
            StatusMove           lowerEnemyAttackMove = new StatusMove("raise attack", TargetType.SingleEnemy, lowerAttackStatus);

            UndoDebuffsStatus undoDebuffStatus = new UndoDebuffsStatus(1);
            StatusMove        undoDebuffMove   = new StatusMove("reset stats", TargetType.SingleAlly, undoDebuffStatus);

            TestHumanFighter fighter2 = new TestHumanFighter("foo 2", 1);

            _humanTeam = new TestTeam(_humanFighter, fighter2);

            //enemy won't be killed if the status isn't assigned to _fighter2
            _enemy.SetHealth(3);
            _enemy.SetSpeed(2);
            _enemy.SetMove(lowerEnemyAttackMove);
            _chanceService.PushEventOccurs(true); //status hits
            _enemy.SetMoveTarget(fighter2);

            _humanFighter.SetSpeed(1);
            _humanFighter.SetMove(undoDebuffMove);
            _chanceService.PushEventOccurs(true); //status hits
            _humanFighter.SetMoveTarget(fighter2);
            _logger.Subscribe(EventType.StatusAdded, fighter2);
            _logger.Subscribe(EventType.StatusRemoved, fighter2);

            BattleMove attack = MoveFactory.Get(BattleMoveType.Attack);

            fighter2.SetStrength(3);
            fighter2.SetMove(attack);
            fighter2.SetMoveTarget(_enemy);
            _chanceService.PushEventOccurs(true);  //attack hits
            _chanceService.PushEventOccurs(false); //attack is not a crit

            //once Statuses are removed after battle, won't be able to
            _battleManager.Battle(_humanTeam, _enemyTeam);

            List <EventLog> logs = _logger.Logs;

            Assert.AreEqual(2, logs.Count);

            EventLog log = logs[1];

            Assert.AreEqual(EventType.StatusRemoved, log.Type);
            StatusRemovedEventArgs e = log.E as StatusRemovedEventArgs;

            Assert.NotNull(e);
            Assert.IsTrue(lowerAttackStatus.AreEqual(e.Status));
        }
예제 #4
0
        public void BattleManager_AppropriatelyDisplaysAbsorbMessage()
        {
            _humanFighter.SetStrength(_shade1.MaxHealth + _shade1.Defense);
            _humanFighter.SetMove(_basicAttack, 1);
            _humanFighter.SetMoveTarget(_shade1);
            _humanFighter.SetMove(_runawayMove);
            _chanceService.PushAttackHitsNotCrit();

            //which moves will be selected by the shades
            _chanceService.PushWhichEventsOccur(_malevolenceChargeIndex, _malevolenceChargeIndex, _malevolenceChargeIndex);

            _chanceService.PushWhichEventsOccur(0, 0); //first is which remaining shade absorbs the fallen shade, second is which stat is boosted

            //define the expected string here, since the shade's display name will be updated after the absorption
            string expectedAbsorbMessage = $"{_shade1.DisplayName}'s essence was absorbed by {_shade2.DisplayName}!\n";

            _battleManager.Battle(_humanTeam, _shadeTeam, null, new SilentBattleConfiguration());

            MockOutputMessage[] outputs = _output.GetOutputs();

            MockOutputMessage absorbOutputMessage = outputs.FirstOrDefault(o => o.Message == expectedAbsorbMessage);

            Assert.NotNull(absorbOutputMessage);
        }
예제 #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);
        }
예제 #6
0
        public void BattleManager_AppropriatelyExecutesDanceTechnique_DoesNotThrowException()
        {
            _enemy1.SetMove(_testTechnique);
            _enemy1.SetSpeed(10);
            _enemy2.SetMove(_doNothingMove);

            _human1.SetMove(_basicAttack);
            _human1.SetMoveTarget(_enemy1);
            _human1.SetStrength(EnemyDefenseAfterDanceMove + _enemy1.MaxHealth);

            _human2.SetMove(_basicAttack);
            _human2.SetMoveTarget(_enemy2);
            _human2.SetStrength(EnemyDefenseAfterDanceMove + _enemy2.MaxHealth);
            _chanceService.PushEventsOccur(true, false, true, false); //set up attack hits, attack crits for both attacks

            Assert.DoesNotThrow(() => { _battleManager.Battle(_humanTeam, _enemyTeam); });
        }
예제 #7
0
        public void StatusTechnique_AppropriatelyAssignsStatusToTarget()
        {
            StatMultiplierStatus status     = new StatMultiplierStatus(3, StatType.Strength, 1.5);
            StatusMove           statusMove = new StatusMove("raise attack", TargetType.SingleAlly, status);

            TestHumanFighter fighter2 = new TestHumanFighter("foo 2", 1);

            _humanTeam = new TestTeam(_humanFighter, fighter2);

            _humanFighter.SetSpeed(1);
            _humanFighter.SetMove(statusMove);
            _chanceService.PushEventOccurs(true);
            _humanFighter.SetMoveTarget(fighter2);
            _logger.Subscribe(EventType.StatusAdded, fighter2);

            BattleMove attack = MoveFactory.Get(BattleMoveType.Attack);

            fighter2.SetStrength(2);
            fighter2.SetMove(attack);
            fighter2.SetMoveTarget(_enemy);
            _chanceService.PushEventOccurs(true);  //attack hits
            _chanceService.PushEventOccurs(false); //attack is not a crit

            //enemy won't be killed if the status isn't assigned to _fighter2
            _enemy.SetHealth(3);
            _enemy.SetMove(_doNothing);
            _enemy.SetMoveTarget(_enemy);

            //once Statuses are removed after battle, won't be able to
            _battleManager.Battle(_humanTeam, _enemyTeam);

            List <EventLog> logs = _logger.Logs;

            Assert.AreEqual(1, logs.Count);

            EventLog log = logs[0];

            Assert.AreEqual(EventType.StatusAdded, log.Type);
            StatusAddedEventArgs e = log.E as StatusAddedEventArgs;

            Assert.NotNull(e);
            Assert.IsTrue(status.AreEqual(e.Status));
        }
예제 #8
0
        public void MoveWithAttackBoostEffect_CorrectlyCalculatesDamage([Values(0.25, 0.5, 2.0, 3.0)] double multiplier)
        {
            const int humanStrength = 4;
            AttackBoostBattleMoveEffect attackBoostEffect = new AttackBoostBattleMoveEffect(multiplier);
            AttackBattleMove            attackBoostAttack = new AttackBattleMove("foo", TargetType.SingleEnemy, 100, 10, effects: attackBoostEffect);

            _human.SetStrength(humanStrength);
            _human.SetMove(attackBoostAttack, 1);
            _human.SetMove(_runawayMove);
            _human.SetMoveTarget(_enemy);
            _chanceService.PushAttackHitsNotCrit(); //attack hits, not a crit

            _enemy.SetMove(_doNothingMove);
            _enemy.SetHealth(100);

            _battleManager.Battle(_humanTeam, _enemyTeam);

            int expectedDamage          = (int)(humanStrength * multiplier);
            int expectedRemainingHealth = 100 - expectedDamage;
            int actualDamage            = 100 - _enemy.CurrentHealth;

            Assert.AreEqual(expectedRemainingHealth, _enemy.CurrentHealth, $"attack should have hit for {expectedDamage} damage, isntead of {actualDamage}!");
        }
        private void PhysicalDamageEvent_Setup(int expectedDamage, bool showPhysicalDamageMessages)
        {
            Team             mixedPlayerTeam = new Team(_menuManager, _humanPlayer1, _enemyPlayer1);
            TestEnemyFighter enemy3          = (TestEnemyFighter)TestFighterFactory.GetFighter(TestFighterType.TestEnemy, 1);
            Team             enemyTeam       = new Team(_menuManager, _enemyPlayer2, enemy3);

            _humanPlayer1.SetSpeed(2);
            _humanPlayer1.SetStrength(expectedDamage);
            _humanPlayer1.SetMove(_basicAttackMove, 1);
            _humanPlayer1.SetMove(_runawayMove);
            _humanPlayer1.SetMoveTarget(_enemyPlayer2);
            _enemyPlayer2.SetHealth(expectedDamage + 1);

            _enemyPlayer1.SetSpeed(1);
            _enemyPlayer1.SetStrength(expectedDamage);
            _enemyPlayer1.SetMove(_basicAttackMove);
            _enemyPlayer1.SetMoveTarget(enemy3);
            enemy3.SetHealth(expectedDamage + 1);

            _mockChanceService.PushEventsOccur(true, false, true, false); //both attacks hit, neither are crits
            _logger.Subscribe(EventType.DamageTaken, _enemyPlayer2);
            _logger.Subscribe(EventType.DamageTaken, enemy3);

            _enemyPlayer2.SetMove(_doNothingMove);
            enemy3.SetMove(_doNothingMove);

            BattleManagerBattleConfiguration config = new BattleManagerBattleConfiguration
            {
                ShowIntroAndOutroMessages  = false,
                ShowExpAndLevelUpMessages  = false,
                ShowDeathMessages          = false,
                ShowAttackMessages         = false,
                ShowPhysicalDamageMessages = showPhysicalDamageMessages
            };

            _battleManager.Battle(mixedPlayerTeam, enemyTeam, config: config);
        }