Esempio n. 1
0
        public void StatusMove_AppropriatelyDisplaysExecutionText()
        {
            const string executionText = "performs the foo ritual";
            Status       status        = new MagicMultiplierStatus(2, MagicType.Water, 2);
            StatusMove   move          = new StatusMove("foo", TargetType.Self, status, executionText);

            _team1Fighter.SetMove(move, 1);
            _team1Fighter.SetMove(_runawayMove);

            _team2Fighter.SetMove(_doNothingMove);

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

            //status move hits
            _chanceService.PushEventOccurs(true);

            _battleManager.Battle(_team1, _team2, config: config);

            MockOutputMessage[] outputs = _output.GetOutputs();

            Assert.AreEqual(2, outputs.Length);

            string expectedStatusOutput = $"{_team1Fighter.DisplayName} {executionText}!\n";

            Assert.AreEqual(expectedStatusOutput, outputs[0].Message);
        }
        protected void PrintStatusAddedMessage(object sender, StatusAddedEventArgs e)
        {
            Status status = e.Status;

            IFighter senderAsFighter = sender as IFighter;

            if (senderAsFighter == null)
            {
                throw new InvalidOperationException("BattleManager.PrintStatusAddedMessage() should only subscribe to instances of IFighter");
            }

            CriticalChanceMultiplierStatus  criticalChanceStatus       = status as CriticalChanceMultiplierStatus;
            StatMultiplierStatus            statMultiplierStatus       = status as StatMultiplierStatus;
            MagicMultiplierStatus           magicMultiplierStatus      = status as MagicMultiplierStatus;
            MagicResistanceMultiplierStatus resistanceMultiplierStatus = status as MagicResistanceMultiplierStatus;
            ReflectStatus             reflectStatus             = status as ReflectStatus;
            SpellCostMultiplierStatus spellCostMultiplierStatus = status as SpellCostMultiplierStatus;
            AutoEvadeStatus           autoEvadeStatus           = status as AutoEvadeStatus;
            CounterAttackStatus       counterAttackStatus       = status as CounterAttackStatus;
            BlindStatus blindStatus = status as BlindStatus;

            if (criticalChanceStatus != null)
            {
                PrintStatusAddedMessage(senderAsFighter, criticalChanceStatus);
            }
            if (statMultiplierStatus != null)
            {
                PrintStatusAddedMessage(senderAsFighter, statMultiplierStatus);
            }
            if (magicMultiplierStatus != null)
            {
                PrintStatusAddedMessage(senderAsFighter, magicMultiplierStatus);
            }
            if (resistanceMultiplierStatus != null)
            {
                PrintStatusAddedMessage(senderAsFighter, resistanceMultiplierStatus);
            }
            if (reflectStatus != null)
            {
                PrintStatusAddedMessage(senderAsFighter, reflectStatus);
            }
            if (spellCostMultiplierStatus != null)
            {
                PrintStatusAddedMessage(senderAsFighter, spellCostMultiplierStatus);
            }
            if (autoEvadeStatus != null)
            {
                PrintStatusAddedMessage(senderAsFighter, autoEvadeStatus);
            }
            if (counterAttackStatus != null)
            {
                PrintStatusAddedMessage(senderAsFighter, counterAttackStatus);
            }
            if (blindStatus != null)
            {
                PrintStatusAddedMessage(senderAsFighter, blindStatus);
            }
        }
Esempio n. 3
0
        public void FighterStatusCounterTicksDown_OnTurnEnd()
        {
            Status status = new MagicMultiplierStatus(3, MagicType.Lightning, 1.25);

            _humanFighter.AddStatus(status);

            _humanFighter.OnTurnEnded(new TurnEndedEventArgs(_humanFighter));

            Status returnedStatus = _humanFighter.Statuses[0];

            Assert.AreEqual(2, returnedStatus.TurnCounter);
        }
        protected void PrintStatusAddedMessage(IFighter fighter, MagicMultiplierStatus status)
        {
            string    strengthenedOrWeakened = (status.Multiplier > 1.0) ? "strengthened" : "weakened";
            MagicType magicType = status.MagicType;

            string output = $"{fighter.DisplayName} has {strengthenedOrWeakened}";

            if (magicType != MagicType.All)
            {
                string magicTypeString = magicType.ToString().ToLower();
                output = $"{output} {magicTypeString}";
            }

            output = $"{output} magic for {GetDurationString(status)}!";

            _output.WriteLine(output);
        }
Esempio n. 5
0
        public void FighterStatus_MultipleInstancesOfStatus_HaveSeparateCounters()
        {
            MagicMultiplierStatus status = new MagicMultiplierStatus(4, MagicType.All, 1.25);

            _humanFighter.AddStatus(status);

            for (var i = 0; i < 2; ++i)
            {
                _humanFighter.OnTurnEnded(new TurnEndedEventArgs(_humanFighter));
            }

            TestHumanFighter fighter2 = new TestHumanFighter("Bob", 1);

            fighter2.AddStatus(status);

            Status returnedStatus = fighter2.Statuses[0];

            Assert.AreEqual(4, returnedStatus.TurnCounter);
        }
Esempio n. 6
0
        public void FighterOnRoundEnd_CorrectlyRemovesStatusesWithTurnCounter0_MultipleStatuses([Values(1, 2, 3)] int turnCount)
        {
            ReflectStatus         firstStatus  = new ReflectStatus(turnCount, MagicType.Ice);
            MagicMultiplierStatus secondStatus = new MagicMultiplierStatus(turnCount, MagicType.Ice, 2.0);

            _humanFighter.AddStatus(firstStatus);
            _humanFighter.AddStatus(secondStatus);

            _logger.Subscribe(EventType.StatusRemoved, _humanFighter);

            for (var i = 0; i < turnCount; ++i)
            {
                _humanFighter.OnTurnEnded(new TurnEndedEventArgs(_humanFighter));
            }

            _humanFighter.OnRoundEnded(new RoundEndedEventArgs(_humanTeam, _humanFighter));

            List <EventLog> logs = _logger.Logs;

            Assert.AreEqual(2, logs.Count);

            EventLog log = logs[0];

            Assert.AreEqual(EventType.StatusRemoved, log.Type);
            Assert.AreEqual(_humanFighter, log.Sender);

            StatusRemovedEventArgs args = log.E as StatusRemovedEventArgs;

            Assert.NotNull(args);
            Assert.IsTrue(firstStatus.AreEqual(args.Status));

            log = logs[1];
            Assert.AreEqual(EventType.StatusRemoved, log.Type);
            Assert.AreEqual(_humanFighter, log.Sender);

            args = log.E as StatusRemovedEventArgs;
            Assert.NotNull(args);
            Assert.IsTrue(secondStatus.AreEqual(args.Status));
        }
Esempio n. 7
0
        public void CastSpell_CalculatesCorrectDamage(
            [Values(40, 80)] int magicStrength,
            [Values(0, 6)] int magicBonus,
            [Values(null, 0.25, 1.5)] double?individualMagicStrengthMultiplier,
            [Values(null, 0.5, 2.0)] double?teamMagicStrengthMultiplier,
            [Values(0, 4)] int resistance,
            [Values(0, 2)] int resistanceBonus,
            [Values(FighterMagicRelationshipType.Weak, FighterMagicRelationshipType.Resistant, FighterMagicRelationshipType.Immune)] FighterMagicRelationshipType relationshipType,
            [Values(MagicType.Ice, MagicType.All)] MagicType affinityMagicType,
            [Values(MagicType.Ice, MagicType.Lightning)] MagicType spellMagicType,
            [Values(false, true)] bool useAllTypeMultiplier
            )
        {
            const int maxHealth     = 500;
            const int spellStrength = 10;
            int       totalStrength = magicStrength + spellStrength + magicBonus;

            totalStrength = ApplyNullableMultiplier(totalStrength, individualMagicStrengthMultiplier);
            totalStrength = ApplyNullableMultiplier(totalStrength, teamMagicStrengthMultiplier);

            MagicType magicMultiplierType = (useAllTypeMultiplier) ? MagicType.All : spellMagicType;

            if (individualMagicStrengthMultiplier != null)
            {
                MagicMultiplierStatus status = new MagicMultiplierStatus(1, magicMultiplierType, individualMagicStrengthMultiplier.Value);
                _human.AddStatus(status);
            }

            if (teamMagicStrengthMultiplier != null)
            {
                MagicMultiplierStatus status = new MagicMultiplierStatus(1, magicMultiplierType, teamMagicStrengthMultiplier.Value);
                _humanTeam.AddStatus(status);
            }

            int totalResistance = resistance + resistanceBonus;

            int total = totalStrength - totalResistance;

            switch (relationshipType)
            {
            case FighterMagicRelationshipType.Immune:
                _enemy.SetElementalImmunity(affinityMagicType);
                if (affinityMagicType == MagicType.All || affinityMagicType == spellMagicType)
                {
                    total = 0;
                }
                break;

            case FighterMagicRelationshipType.Resistant:
                _enemy.SetElementalResistance(affinityMagicType);
                if (affinityMagicType == MagicType.All || affinityMagicType == spellMagicType)
                {
                    total /= 2;
                }
                break;

            case FighterMagicRelationshipType.Weak:
                _enemy.SetElementalWeakness(affinityMagicType);
                if (affinityMagicType == MagicType.All || affinityMagicType == spellMagicType)
                {
                    total *= 2;
                }
                break;
            }

            int expectedRemainingHealth = (total >= maxHealth) ? 0 : maxHealth - total;

            var spell = new Spell("foo", spellMagicType, SpellType.Attack, TargetType.SingleEnemy, 0, spellStrength);

            _human.SetMagicStrength(magicStrength);
            _human.SetMagicBonus(spellMagicType, magicBonus);
            _human.SetDeathOnTurnEndEvent();
            _human.AddSpell(spell);
            _human.SetMove(spell);
            _human.SetMoveTarget(_enemy);

            _enemy.SetHealth(500);
            _enemy.SetMagicResistance(resistance);
            _enemy.SetResistanceBonus(spellMagicType, resistanceBonus);

            _battleManager.Battle(_humanTeam, _enemyTeam);

            Assert.AreEqual(expectedRemainingHealth, _enemy.CurrentHealth);
        }