private static void RegisterActUsageServices(IServiceCollection container)
        {
            container.AddScoped <IActUsageHandlerSelector>(serviceProvider =>
            {
                var handlers        = serviceProvider.GetServices <IActUsageHandler>();
                var handlersArray   = handlers.ToArray();
                var handlerSelector = new ActUsageHandlerSelector(handlersArray);
                return(handlerSelector);
            });
            container.AddScoped <IActUsageHandler>(serviceProvider =>
            {
                var perkResolver = serviceProvider.GetRequiredService <IPerkResolver>();
                var randomSource = serviceProvider.GetRequiredService <ITacticalActUsageRandomSource>();
                var handler      = new ActorActUsageHandler(perkResolver, randomSource);
                ConfigurateActorActUsageHandler(serviceProvider, handler);
                return(handler);
            });
            container.AddScoped <IActUsageHandler, StaticObjectActUsageHandler>();
            container.AddScoped <ITacticalActUsageService>(serviceProvider =>
            {
                var randomSource       = serviceProvider.GetRequiredService <ITacticalActUsageRandomSource>();
                var actHandlerSelector = serviceProvider.GetRequiredService <IActUsageHandlerSelector>();
                var sectorManager      = serviceProvider.GetRequiredService <ISectorManager>();

                var tacticalActUsageService = new TacticalActUsageService(randomSource, sectorManager, actHandlerSelector);

                ConfigurateTacticalActUsageService(serviceProvider, tacticalActUsageService);

                return(tacticalActUsageService);
            });
        }
Esempio n. 2
0
        public void ProcessActUsage_HealSelfWithHalfHp_HpRestored()
        {
            // ARRANGE
            const int HEAL_EFFICIENT = 1;

            var actUsageRandomSourceMock = new Mock <ITacticalActUsageRandomSource>();

            actUsageRandomSourceMock.Setup(x => x.RollEfficient(It.IsAny <Roll>())).Returns(HEAL_EFFICIENT);
            var actUsageRandomSource = actUsageRandomSourceMock.Object;

            var perkResolverMock = new Mock <IPerkResolver>();
            var perkResolver     = perkResolverMock.Object;

            var actUsageService = new ActorActUsageHandler(perkResolver, actUsageRandomSource);

            var survivalModuleMock = new Mock <ISurvivalModule>();
            var survivalModule     = survivalModuleMock.Object;

            var personMock = new Mock <IPerson>();

            personMock.Setup(x => x.GetModule <ISurvivalModule>(It.IsAny <string>())).Returns(survivalModule);
            personMock.Setup(x => x.HasModule(It.Is <string>(x => x == nameof(ISurvivalModule)))).Returns(true);
            var person = personMock.Object;

            var actorMock = new Mock <IActor>();

            actorMock.SetupGet(x => x.Node).Returns(new HexNode(0, 0));
            actorMock.SetupGet(x => x.Person).Returns(person);
            actorMock.Setup(x => x.UseAct(It.IsAny <IGraphNode>(), It.IsAny <ICombatAct>()))
            .Raises <IGraphNode, ICombatAct>(x => x.UsedAct += null,
                                             (target1, act1) => new UsedActEventArgs(target1, act1));
            var actor = actorMock.Object;

            var actStatScheme = new TestTacticalActStatsSubScheme
            {
                Effect    = TacticalActEffectType.Heal,
                Efficient = new Roll(6, 1),
                Targets   = TacticalActTargets.Self
            };

            var tacticalActMock = new Mock <ICombatAct>();

            tacticalActMock.SetupGet(x => x.Stats).Returns(actStatScheme);
            var tacticalAct = tacticalActMock.Object;

            var usedActs = new CombatActRoll(tacticalAct, 1);

            var map = Mock.Of <ISectorMap>();

            // ACT
            actUsageService.ProcessActUsage(actor, actor, usedActs, map);

            // ASSERT
            survivalModuleMock.Verify(x =>
                                      x.RestoreStat(It.Is <SurvivalStatType>(type => type == SurvivalStatType.Health),
                                                    It.Is <int>(v => v == HEAL_EFFICIENT)));
        }
Esempio n. 3
0
        public void UseOn_ArmorSavePassed_ActEfficientDecrease()
        {
            // ARRANGE
            const OffenseType OFFENCETYPE              = OffenseType.Tactical;
            const int         FAKE_TOHIT_DICE_ROLL     = 2;                          // успех в ToHit 2+
            const int         FAKE_ARMORSAVE_DICE_ROLL = 6;                          // успех в ArmorSave 4+ при раных рангах
            const int         FAKE_ACTEFFICIENT_ROLL   = 3;                          // эффективность пробрасывается D3, максимальный бросок
            const int         EXPECTED_ACTEFFICIENT    = FAKE_ACTEFFICIENT_ROLL - 1; // -1 даёт текущая броня

            var actUsageRandomSourceMock = new Mock <ITacticalActUsageRandomSource>();

            actUsageRandomSourceMock.Setup(x => x.RollToHit(It.IsAny <Roll>())).Returns(FAKE_TOHIT_DICE_ROLL);
            actUsageRandomSourceMock.Setup(x => x.RollArmorSave()).Returns(FAKE_ARMORSAVE_DICE_ROLL);
            actUsageRandomSourceMock.Setup(x => x.RollEfficient(It.IsAny <Roll>())).Returns(FAKE_ACTEFFICIENT_ROLL);
            var actUsageRandomSource = actUsageRandomSourceMock.Object;

            var perkResolverMock = new Mock <IPerkResolver>();
            var perkResolver     = perkResolverMock.Object;

            var actUsageService = new ActorActUsageHandler(perkResolver, actUsageRandomSource);

            var actorMock = new Mock <IActor>();

            actorMock.SetupGet(x => x.Node).Returns(new HexNode(0, 0));
            var actor = actorMock.Object;

            var armors      = new[] { new PersonArmorItem(ImpactType.Kinetic, PersonRuleLevel.Lesser, 10) };
            var monsterMock = CreateMonsterMock(armors: armors);
            var monster     = monsterMock.Object;

            // Настройка дествия
            var actScheme = new TestTacticalActStatsSubScheme
            {
                Offence = new TestTacticalActOffenceSubScheme
                {
                    Type   = OFFENCETYPE,
                    ApRank = 10,
                    Impact = ImpactType.Kinetic
                }
            };

            var actMock = new Mock <ICombatAct>();

            actMock.SetupGet(x => x.Stats).Returns(actScheme);
            var act = actMock.Object;

            var map = Mock.Of <ISectorMap>();

            // ACT
            var usedActs = new CombatActRoll(act, FAKE_ACTEFFICIENT_ROLL);

            actUsageService.ProcessActUsage(actor, monster, usedActs, map);

            // ASSERT
            actUsageRandomSourceMock.Verify(x => x.RollArmorSave(), Times.Once);
            monsterMock.Verify(x => x.TakeDamage(It.Is <int>(damage => damage == EXPECTED_ACTEFFICIENT)), Times.Once);
        }
Esempio n. 4
0
        public void UseOn_ArmorSavePassed_ActEfficientDecrease()
        {
            // ARRANGE
            const OffenseType offenceType           = OffenseType.Tactical;
            const int         fakeToHitDiceRoll     = 2;                        // успех в ToHit 2+
            const int         fakeArmorSaveDiceRoll = 6;                        // успех в ArmorSave 4+ при раных рангах
            const int         fakeActEfficientRoll  = 3;                        // эффективность пробрасывается D3, максимальный бросок
            const int         expectedActEfficient  = fakeActEfficientRoll - 1; // -1 даёт текущая броня

            var actUsageRandomSourceMock = new Mock <ITacticalActUsageRandomSource>();

            actUsageRandomSourceMock.Setup(x => x.RollToHit(It.IsAny <Roll>())).Returns(fakeToHitDiceRoll);
            actUsageRandomSourceMock.Setup(x => x.RollArmorSave()).Returns(fakeArmorSaveDiceRoll);
            actUsageRandomSourceMock.Setup(x => x.RollEfficient(It.IsAny <Roll>())).Returns(fakeActEfficientRoll);
            var actUsageRandomSource = actUsageRandomSourceMock.Object;

            var perkResolverMock = new Mock <IPerkResolver>();
            var perkResolver     = perkResolverMock.Object;

            var actUsageService = new ActorActUsageHandler(perkResolver, actUsageRandomSource);

            var actorMock = new Mock <IActor>();

            actorMock.SetupGet(x => x.Node).Returns(new HexNode(0, 0));
            var actor = actorMock.Object;

            var armors      = new[] { new PersonArmorItem(ImpactType.Kinetic, PersonRuleLevel.Lesser, 10) };
            var monsterMock = CreateMonsterMock(armors: armors);
            var monster     = monsterMock.Object;

            // Настройка дествия
            var actScheme = new TestTacticalActStatsSubScheme
            {
                Offence = new TestTacticalActOffenceSubScheme
                {
                    Type   = offenceType,
                    ApRank = 10,
                    Impact = ImpactType.Kinetic
                }
            };

            var actMock = new Mock <ITacticalAct>();

            actMock.SetupGet(x => x.Stats).Returns(actScheme);
            var act = actMock.Object;

            // ACT
            var usedActs = new TacticalActRoll(act, fakeActEfficientRoll);

            actUsageService.ProcessActUsage(actor, monster, usedActs);

            // ASSERT
            actUsageRandomSourceMock.Verify(x => x.RollArmorSave(), Times.Once);
            monsterMock.Verify(x => x.TakeDamage(It.Is <int>(damage => damage == expectedActEfficient)), Times.Once);
        }
Esempio n. 5
0
        private static void ConfigurateActorActUsageHandler(IServiceProvider serviceProvider,
                                                            ActorActUsageHandler handler)
        {
            // Указание необязательных зависимостей
            handler.EquipmentDurableService = serviceProvider.GetService <IEquipmentDurableService>();

            handler.ActorInteractionBus = serviceProvider.GetService <IActorInteractionBus>();

            handler.PlayerEventLogService = serviceProvider.GetService <IPlayerEventLogService>();

            handler.ScoreManager = serviceProvider.GetService <IScoreManager>();
        }
Esempio n. 6
0
        public void ProcessActUsage_ActApGreaterRankThatArmorRank_IgnoreArmor()
        {
            // ARRANGE
            var offenceType       = OffenseType.Tactical;
            var fakeToHitDiceRoll = 2; // успех в ToHit 2+

            var actUsageRandomSourceMock = new Mock <ITacticalActUsageRandomSource>();

            actUsageRandomSourceMock.Setup(x => x.RollToHit(It.IsAny <Roll>())).Returns(fakeToHitDiceRoll);
            actUsageRandomSourceMock.Setup(x => x.RollEfficient(It.IsAny <Roll>())).Returns(1);
            var actUsageRandomSource = actUsageRandomSourceMock.Object;

            var perkResolverMock = new Mock <IPerkResolver>();
            var perkResolver     = perkResolverMock.Object;

            var actUsageService = new ActorActUsageHandler(perkResolver, actUsageRandomSource);

            var actorMock = new Mock <IActor>();

            actorMock.SetupGet(x => x.Node).Returns(new HexNode(0, 0));
            var actor = actorMock.Object;

            var armors      = new[] { new PersonArmorItem(ImpactType.Kinetic, PersonRuleLevel.Normal, 10) };
            var monsterMock = CreateMonsterMock(armors: armors);
            var monster     = monsterMock.Object;

            // Настройка дествия
            var actScheme = new TestTacticalActStatsSubScheme
            {
                Offence = new TestTacticalActOffenceSubScheme
                {
                    Type   = offenceType,
                    ApRank = 20,
                    Impact = ImpactType.Kinetic
                }
            };

            var actMock = new Mock <ICombatAct>();

            actMock.SetupGet(x => x.Stats).Returns(actScheme);
            var act = actMock.Object;

            var map = Mock.Of <ISectorMap>();

            // ACT
            var usedActs = new CombatActRoll(act, 1);

            actUsageService.ProcessActUsage(actor, monster, usedActs, map);

            // ASSERT
            monsterMock.Verify(x => x.TakeDamage(It.IsAny <int>()), Times.Once);
            actUsageRandomSourceMock.Verify(x => x.RollArmorSave(), Times.Never);
        }
Esempio n. 7
0
        public void ProcessActUsage_OffenceTypeVsDefenceType_Success()
        {
            // ARRANGE
            var offenceType       = OffenseType.Tactical;
            var defenceType       = DefenceType.TacticalDefence;
            var defenceLevel      = PersonRuleLevel.Normal;
            var fakeToHitDiceRoll = 5; // 5+ - успех при нормальном уровне обороны

            var actUsageRandomSourceMock = new Mock <ITacticalActUsageRandomSource>();

            actUsageRandomSourceMock.Setup(x => x.RollToHit(It.IsAny <Roll>())).Returns(fakeToHitDiceRoll);
            actUsageRandomSourceMock.Setup(x => x.RollEfficient(It.IsAny <Roll>())).Returns(1);
            var actUsageRandomSource = actUsageRandomSourceMock.Object;

            var perkResolverMock = new Mock <IPerkResolver>();
            var perkResolver     = perkResolverMock.Object;

            var actUsageService = new ActorActUsageHandler(perkResolver, actUsageRandomSource);

            var actorMock = new Mock <IActor>();

            actorMock.SetupGet(x => x.Node).Returns(new HexNode(0, 0));
            var actor = actorMock.Object;

            var defences    = new[] { new PersonDefenceItem(defenceType, defenceLevel) };
            var monsterMock = CreateMonsterMock(defences);
            var monster     = monsterMock.Object;

            // Настройка дествия
            var actScheme = new TestTacticalActStatsSubScheme
            {
                Offence = new TestTacticalActOffenceSubScheme
                {
                    Type = offenceType
                }
            };

            var actMock = new Mock <ICombatAct>();

            actMock.SetupGet(x => x.Stats).Returns(actScheme);
            var act = actMock.Object;

            var map = Mock.Of <ISectorMap>();

            // ACT
            var usedActs = new CombatActRoll(act, 1);

            actUsageService.ProcessActUsage(actor, monster, usedActs, map);

            // ASSERT
            monsterMock.Verify(x => x.TakeDamage(It.IsAny <int>()), Times.Once);
        }
Esempio n. 8
0
        public void ProcessActUsage_MonsterHitByActAndKill_SetPerkProgress()
        {
            // ARRANGE

            var perkResolverMock = new Mock <IPerkResolver>();
            var perkResolver     = perkResolverMock.Object;

            var actUsageRandomSourceMock = new Mock <ITacticalActUsageRandomSource>();

            actUsageRandomSourceMock.Setup(x => x.RollToHit(It.IsAny <Roll>())).Returns(6);
            actUsageRandomSourceMock.Setup(x => x.RollEfficient(It.IsAny <Roll>())).Returns(1);
            var actUsageRandomSource = actUsageRandomSourceMock.Object;

            var actUsageService = new ActorActUsageHandler(perkResolver, actUsageRandomSource);

            var personMock = new Mock <IPerson>();
            var person     = personMock.Object;

            var actorMock = new Mock <IActor>();

            actorMock.SetupGet(x => x.Node).Returns(new HexNode(0, 0));
            actorMock.SetupGet(x => x.Person).Returns(person);
            var actor = actorMock.Object;

            var monsterMock = CreateOnHitMonsterMock();
            var monster     = monsterMock.Object;
            var act         = CreateTestAct();

            var map = Mock.Of <ISectorMap>();

            // ACT
            var usedActs = new CombatActRoll(act, 1);

            actUsageService.ProcessActUsage(actor, monster, usedActs, map);

            // ASSERT
            perkResolverMock.Verify(x => x.ApplyProgress(
                                        It.Is <IJobProgress>(progress => CheckDefeateProgress(progress, monster)),
                                        It.IsAny <IEvolutionModule>()
                                        ), Times.Once);
        }