public void CopyMethod_ReturnsAppropriateResponse([Values(MagicType.Fire, MagicType.Water)] MagicType shieldMagicType, [Values(1, 7)] int shieldHealth,
                                                          [Values(2, 4)] int shieldDefense)
        {
            ElementalBattleShield shield     = new ElementalBattleShield(shieldHealth, shieldDefense, 0, MagicType.Lightning);
            ShieldMove            shieldMove = new ShieldMove("foo", TargetType.Self, null, shield);

            ShieldMove copy = new ShieldMove(shieldMove);

            Assert.AreNotEqual(shieldMove.Shield, copy.Shield);
            Assert.IsTrue(shieldMove.Shield.AreEqual(copy.Shield));
        }
        public void BattleManager_CorrectlyPrintsMessages_ElementalBattleShield([Values("eats pudding", null)] string executionMessage,
                                                                                [Values(MagicType.Ice, MagicType.Fire, MagicType.Earth, MagicType.Lightning)] MagicType shieldMagicType)
        {
            const int             shieldDefense = 5;
            const int             shieldHealth  = 1;
            ElementalBattleShield shield        = new ElementalBattleShield(shieldHealth, shieldDefense, 0, shieldMagicType);
            ShieldMove            shieldMove    = new ShieldMove("foo", TargetType.Self, executionMessage, shield);

            _humanFighter.SetSpeed(1);
            _humanFighter.SetMove(shieldMove, 1);
            _humanFighter.SetMove(_runawayMove);

            _enemy.SetStrength(shieldHealth + shieldDefense);
            _enemy.SetMove(_basicAttackMove);
            _chanceService.PushEventsOccur(true, false); //attack hits, is not a crit

            BattleManagerBattleConfiguration config = new BattleManagerBattleConfiguration
            {
                ShowIntroAndOutroMessages = false,
                ShowAttackMessages        = false
            };

            _battleManager.Battle(_humanTeam, _enemyTeam, config: config);

            MockOutputMessage[] outputs = _output.GetOutputs();

            int expectedLength = 3; //damage taken, "equipped with shield," and "shield destroyed" messages

            if (executionMessage != null)
            {
                expectedLength++;
            }
            Assert.AreEqual(expectedLength, outputs.Length);

            int i = 0;

            if (executionMessage != null)
            {
                Assert.AreEqual($"{_humanFighter.DisplayName} {executionMessage}!\n", outputs[i++].Message);
            }

            string aOrAn = shieldMagicType == MagicType.Ice || shieldMagicType == MagicType.Earth ? "an" : "a";

            Assert.AreEqual($"{_humanFighter.DisplayName} was equipped with {aOrAn} {shieldMagicType.ToString().ToLower()} elemental battle shield!\n", outputs[i].Message);
        }
        public void DefaultDisplayName_ElementalBattleShield([Values(MagicType.Earth, MagicType.Fire)] MagicType shieldElementalType)
        {
            ElementalBattleShield shield = new ElementalBattleShield(1, 0, 0, shieldElementalType);

            string displayText  = shield.GetDisplayText();
            string expectedText = $"{shieldElementalType.ToString().ToLower()} elemental battle shield";

            if (shieldElementalType == MagicType.Earth || shieldElementalType == MagicType.Ice)
            {
                expectedText = $"an {expectedText}";
            }
            else
            {
                expectedText = $"a {expectedText}";
            }

            Assert.AreEqual(expectedText, displayText);
        }
        protected void PrintFieldEffectImplementedMessage(IFighter effectExecutor, ShieldFieldEffect effect)
        {
            string teamString = GetFieldEffectTeamString(effectExecutor, effect);

            IBattleShield         battleShield    = effect.BattleShield;
            ElementalBattleShield elementalShield = battleShield as ElementalBattleShield;

            string shieldTypeString = "";

            if (elementalShield != null)
            {
                shieldTypeString = $"{elementalShield.ElementalType.ToString().ToLower()} elemental shields";
            }

            string output = $"{teamString} has gained {shieldTypeString}!";

            _output.WriteLine(output);
        }
        public void BattleManager_CorrectlySetsShield_WhenExecutingShieldMove()
        {
            const int             shieldDefense = 5;
            const int             shieldHealth  = 1;
            ElementalBattleShield shield        = new ElementalBattleShield(shieldHealth, shieldDefense, 0, MagicType.Lightning);
            ShieldMove            shieldMove    = new ShieldMove("foo", TargetType.Self, null, shield);

            _humanFighter.SetSpeed(1);
            _humanFighter.SetMove(shieldMove, 1);
            _humanFighter.SetMove(_runawayMove);

            _enemy.SetStrength(shieldHealth + shieldDefense);
            _enemy.SetMove(_basicAttackMove);
            _chanceService.PushEventsOccur(true, false); //attack hits, is not a crit

            _battleManager.Battle(_humanTeam, _enemyTeam);

            Assert.AreEqual(_humanFighter.MaxHealth, _humanFighter.CurrentHealth);
        }
        private static BattleShield GetShieldFromType(Type t)
        {
            BattleShield ret = null;

            if (t == typeof(IronBattleShield))
            {
                ret = new IronBattleShield(1, 0, 0);
            }
            else if (t == typeof(ElementalBattleShield))
            {
                ret = new ElementalBattleShield(1, 0, 0, MagicType.Fire);
            }
            else
            {
                throw new NotImplementedException($"GetShieldFromType() does not yet know how to handle type '{t}'");
            }

            return(ret);
        }
Example #7
0
        public void BattleManager_CorrectlyExecutes_ShieldFortifyingMove([Values(ShieldFortifyingType.Defense, ShieldFortifyingType.Health)] ShieldFortifyingType shieldFortifyingType)
        {
            ElementalBattleShield shield = new ElementalBattleShield(10, 5, 0, MagicType.Fire);

            shield.DecrementHealth(5);
            _humanFighter.SetBattleShield(shield);
            IBattleShield copiedShield = _humanFighter.BattleShield;

            ShieldFortifyingMove shieldFortifyingMove = new ShieldFortifyingMove("foo", TargetType.Self, null, shieldFortifyingType, 5);

            _humanFighter.SetMove(shieldFortifyingMove, 1);
            _humanFighter.SetMove(_runawayMove);
            _humanFighter.SetMoveTarget(_humanFighter);

            _enemy.SetMove(_doNothing);

            _battleManager.Battle(_humanTeam, _enemyTeam);

            Assert.NotNull(copiedShield);

            int actualValue = shieldFortifyingType == ShieldFortifyingType.Defense ? copiedShield.Defense : copiedShield.CurrentHealth;

            Assert.AreEqual(10, actualValue);
        }
        public virtual CombinedFieldEffect Combine(DanceEffectType effect1, DanceEffectType effect2)
        {
            CombinedFieldEffect ret = null;
            string combinedName;
            var    first  = (DanceEffectType)Math.Min((int)effect1, (int)effect2);
            var    second = (DanceEffectType)Math.Max((int)effect1, (int)effect2);

            switch (first)
            {
            case DanceEffectType.Fire:
                switch (second)
                {
                case DanceEffectType.Wind:
                    combinedName = "lightning dance";
                    ret          = new CombinedFieldEffect(combinedName,
                                                           new CriticalChanceMultiplierFieldEffect(TargetType.OwnTeam, combinedName, 2.0),
                                                           new CriticalChanceMultiplierFieldEffect(TargetType.EnemyTeam, combinedName, 0.5));
                    break;

                case DanceEffectType.Soul:
                    combinedName = "courage dance";
                    ret          = new CombinedFieldEffect(combinedName,
                                                           new StatMultiplierFieldEffect(TargetType.OwnTeam, combinedName, StatType.Strength, 1.5),
                                                           new MagicMultiplierFieldEffect(TargetType.OwnTeam, combinedName, MagicType.Fire, 1.25));
                    break;

                case DanceEffectType.Heart:
                    combinedName = "passion tempo";
                    ret          = new CombinedFieldEffect(combinedName,
                                                           new CriticalChanceMultiplierFieldEffect(TargetType.OwnTeam, combinedName, 3),
                                                           new SpellCostMultiplierFieldEffect(TargetType.OwnTeam, combinedName, 2),
                                                           new MagicMultiplierFieldEffect(TargetType.OwnTeam, combinedName, MagicType.All, 2));
                    break;

                case DanceEffectType.Mind:
                    combinedName = "burning ballet";
                    ret          = new CombinedFieldEffect(combinedName,
                                                           new SpellCostMultiplierFieldEffect(TargetType.OwnTeam, combinedName, 2),
                                                           new MagicMultiplierFieldEffect(TargetType.OwnTeam, combinedName, MagicType.All, 2));
                    break;

                case DanceEffectType.Danger:
                    combinedName = "eruption festival";
                    ret          = new CombinedFieldEffect(combinedName,
                                                           new MagicAttackFieldEffect(TargetType.EnemyTeam, combinedName, MagicType.Fire, 2, 1, true));
                    break;
                }
                break;

            case DanceEffectType.Water:
                switch (second)
                {
                case DanceEffectType.Soul:
                    combinedName = "river rumba";
                    ret          = new CombinedFieldEffect(combinedName,
                                                           new StatMultiplierFieldEffect(TargetType.OwnTeam, combinedName, StatType.Speed, 2));
                    break;

                case DanceEffectType.Heart:
                    combinedName = "cleansing calypso";
                    ret          = new CombinedFieldEffect(combinedName,
                                                           new RestoreHealthPercentageFieldEffect(TargetType.OwnTeam, combinedName, 25, immediatelyExecuted: true),
                                                           new UndoDebuffsFieldEffect(TargetType.OwnTeam, combinedName)
                                                           );
                    break;

                case DanceEffectType.Mind:
                    combinedName = "clearsong conga";
                    ret          = new CombinedFieldEffect(combinedName,
                                                           new RestoreManaPercentageFieldEffect(TargetType.OwnTeam, combinedName, 25, immediatelyExecuted: true));
                    break;

                case DanceEffectType.Danger:
                    combinedName = "whirlpool fesitval";
                    ret          = new CombinedFieldEffect(combinedName,
                                                           new MagicAttackFieldEffect(TargetType.EnemyTeam, combinedName, MagicType.Water, 2, 1, true));
                    break;
                }
                break;

            case DanceEffectType.Wind:
                switch (second)
                {
                case DanceEffectType.Soul:
                    combinedName = "breeze form";
                    ret          = new CombinedFieldEffect(combinedName,
                                                           new StatMultiplierFieldEffect(TargetType.OwnTeam, combinedName, StatType.Evade, 1.4));
                    break;

                case DanceEffectType.Heart:
                    combinedName = "carefree waltz";
                    ret          = new CombinedFieldEffect(combinedName,
                                                           new RestoreHealthPercentageFieldEffect(TargetType.OwnTeam, combinedName, 10));
                    break;

                case DanceEffectType.Mind:
                    combinedName = "gusty mamba";
                    ret          = new CombinedFieldEffect(combinedName,
                                                           new ReflectFieldEffect(TargetType.OwnTeam, combinedName, MagicType.All));
                    break;

                case DanceEffectType.Danger:
                    combinedName = "tornado festival";
                    ret          = new CombinedFieldEffect(combinedName,
                                                           new MagicAttackFieldEffect(TargetType.EnemyTeam, combinedName, MagicType.Wind, 2, 1, true));
                    break;
                }
                break;

            case DanceEffectType.Earth:
                switch (second)
                {
                case DanceEffectType.Soul:
                    combinedName = "desert swing";
                    ret          = new CombinedFieldEffect(combinedName,
                                                           new StatMultiplierFieldEffect(TargetType.OwnTeam, combinedName, StatType.Defense, 2));
                    break;

                case DanceEffectType.Heart:
                    combinedName = "steadfast stance";
                    var earthShield = new ElementalBattleShield(5, 0, 0, MagicType.Earth);
                    ret = new CombinedFieldEffect(combinedName,
                                                  new ShieldFieldEffect(TargetType.OwnTeam, combinedName, earthShield));
                    break;

                case DanceEffectType.Mind:
                    combinedName = "gaia galla";
                    ret          = new CombinedFieldEffect(combinedName,
                                                           new RestoreHealthPercentageFieldEffect(TargetType.OwnTeam, combinedName, 10));
                    break;

                case DanceEffectType.Danger:
                    combinedName = "earthquake fesitval";
                    ret          = new CombinedFieldEffect(combinedName,
                                                           new MagicAttackFieldEffect(TargetType.EnemyTeam, combinedName, MagicType.Earth, 2, 1, true));
                    break;
                }
                break;
            }

            return(ret);
        }