示例#1
0
        public void UseOn_Attack_RaiseUsedAct()
        {
            // ARRANGE

            var handlerSelector = CreateEmptyHandlerSelector();

            var actUsageService = new TacticalActUsageService(
                _actUsageRandomSource,
                handlerSelector);

            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 <ITacticalAct>()))
            .Raises <IGraphNode, ITacticalAct>(x => x.UsedAct += null,
                                               (target1, act1) => new UsedActEventArgs(target1, act1));
            var actor = actorMock.Object;

            var monsterMock = CreateMonsterMock();
            var monster     = monsterMock.Object;

            var usedActs = new UsedTacticalActs(new[] { _act });

            var actTargetInfo = new ActTargetInfo(monster, monster.Node);

            using var monitor = actor.Monitor();

            // ACT
            actUsageService.UseOn(actor, actTargetInfo, usedActs, _sector);

            // ASSERT
            monitor.Should().Raise(nameof(IActor.UsedAct));
        }
        public void UseOn_MonsterHitByAct_MonsterTakesDamage()
        {
            // ARRANGE



            var actUsageService = new TacticalActUsageService(_actUsageRandomSource, _perkResolver);

            var actorMock = new Mock <IActor>();

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

            var monsterMock = new Mock <IActor>();

            monsterMock.SetupGet(x => x.Node).Returns(new HexNode(1, 0));
            var monster = monsterMock.Object;

            var monsterStateMock = new Mock <IActorState>();

            monsterStateMock.SetupGet(x => x.IsDead).Returns(false);
            var monsterState = monsterStateMock.Object;

            monsterMock.SetupGet(x => x.State).Returns(monsterState);



            // ACT
            actUsageService.UseOn(actor, monster, _act);



            // ASSERT
            monsterMock.Verify(x => x.TakeDamage(It.IsAny <float>()), Times.Once);
        }
        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);
            });
        }
        public void UseOn_Wall_ThrowsInvalidOperationException()
        {
            // ARRANGE

            var sectorManager = CreateSectorManagerWithWall();

            var actUsageService = new TacticalActUsageService(
                _actUsageRandomSource,
                _perkResolver,
                sectorManager);

            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 = CreateMonsterMock();
            var monster     = monsterMock.Object;

            // ACT
            var usedActs = new UsedTacticalActs(new[] { _act });

            Action act = () =>
            {
                actUsageService.UseOn(actor, monster, usedActs);
            };

            // ASSERT
            act.Should().Throw <InvalidOperationException>();
        }
示例#5
0
        public void UseOn_Wall_ThrowsUsageThroughtWallException()
        {
            // ARRANGE

            var sector = CreateSectorManagerWithWall();

            var handlerSelector = CreateEmptyHandlerSelector();

            var actUsageService = new TacticalActUsageService(
                _actUsageRandomSource,
                handlerSelector);

            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 = CreateMonsterMock();
            var monster     = monsterMock.Object;

            var actTargetInfo = new ActTargetInfo(monster, monster.Node);
            var usedActs      = new UsedTacticalActs(new[] { _act });

            // ACT

            Action act = () =>
            {
                actUsageService.UseOn(actor, actTargetInfo, usedActs, sector);
            };

            // ASSERT
            act.Should().Throw <UsageThroughtWallException>();
        }
        public void UseOn_MonsterHitByActAndKill_SetPerkProgress()
        {
            // ARRANGE

            var actUsageService = new TacticalActUsageService(_actUsageRandomSource,
                                                              _perkResolver,
                                                              _sectorManager);

            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;

            // ACT
            var usedActs = new UsedTacticalActs(new[] { _act });

            actUsageService.UseOn(actor, monster, usedActs);

            // ASSERT
            _perkResolverMock.Verify(x => x.ApplyProgress(
                                         It.Is <IJobProgress>(progress => CheckDefeateProgress(progress, monster)),
                                         It.IsAny <IEvolutionData>()
                                         ), Times.Once);
        }
        public void UseOn_Attack_RaiseUsedAct()
        {
            // ARRANGE

            var actUsageService = new TacticalActUsageService(
                _actUsageRandomSource,
                _perkResolver,
                _sectorManager);

            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 <IAttackTarget>(), It.IsAny <ITacticalAct>()))
            .Raises <IAttackTarget, ITacticalAct>(x => x.UsedAct += null, (target1, act1) => new UsedActEventArgs(target1, act1));
            var actor = actorMock.Object;

            var monsterMock = CreateMonsterMock();
            var monster     = monsterMock.Object;

            // ACT
            var usedActs = new UsedTacticalActs(new[] { _act });

            using (var monitor = actor.Monitor())
            {
                actUsageService.UseOn(actor, monster, usedActs);

                // ASSERT
                monitor.Should().Raise(nameof(IActor.UsedAct));
            }
        }
示例#8
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()).Returns(fakeToHitDiceRoll);
            actUsageRandomSourceMock.Setup(x => x.RollArmorSave()).Returns(fakeArmorSaveDiceRoll);
            actUsageRandomSourceMock.Setup(x => x.RollEfficient(It.IsAny <Roll>())).Returns(fakeActEfficientRoll);
            var actUsageRandomSource = actUsageRandomSourceMock.Object;

            var actUsageService = new TacticalActUsageService(
                actUsageRandomSource,
                _perkResolver,
                _sectorManager);

            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 UsedTacticalActs(new[] { act });

            actUsageService.UseOn(actor, monster, usedActs);



            // ASSERT
            actUsageRandomSourceMock.Verify(x => x.RollArmorSave(), Times.Once);
            monsterMock.Verify(x => x.TakeDamage(It.Is <int>(damage => damage == expectedActEfficient)), Times.Once);
        }
示例#9
0
        public void UseOn_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 actUsageService = new TacticalActUsageService(
                actUsageRandomSource,
                _perkResolver,
                _sectorManager);

            var survivalDataMock = new Mock <ISurvivalData>();
            var survivalData     = survivalDataMock.Object;

            var personMock = new Mock <IPerson>();

            personMock.Setup(x => x.Survival).Returns(survivalData);
            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 <IAttackTarget>(), It.IsAny <ITacticalAct>()))
            .Raises <IAttackTarget, ITacticalAct>(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 <ITacticalAct>();

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

            var usedActs = new UsedTacticalActs(new[] { tacticalAct });



            // ACT
            actUsageService.UseOn(actor, actor, usedActs);



            // ASSERT
            survivalDataMock.Verify(x => x.RestoreStat(It.Is <SurvivalStatType>(type => type == SurvivalStatType.Health),
                                                       It.Is <int>(v => v == HEAL_EFFICIENT)));
        }
示例#10
0
        public void UseOn_ActApGreaterRankThatArmorRank_IgnoreArmor()
        {
            // ARRANGE
            var offenceType       = OffenseType.Tactical;
            var fakeToHitDiceRoll = 2; // успех в ToHit 2+

            var actUsageRandomSourceMock = new Mock <ITacticalActUsageRandomSource>();

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

            var actUsageService = new TacticalActUsageService(actUsageRandomSource,
                                                              _perkResolver,
                                                              _sectorManager);

            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 <ITacticalAct>();

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



            // ACT
            var usedActs = new UsedTacticalActs(new[] { act });

            actUsageService.UseOn(actor, monster, usedActs);



            // ASSERT
            monsterMock.Verify(x => x.TakeDamage(It.IsAny <int>()), Times.Once);
            actUsageRandomSourceMock.Verify(x => x.RollArmorSave(), Times.Never);
        }
示例#11
0
        public void UseOn_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()).Returns(fakeToHitDiceRoll);
            actUsageRandomSourceMock.Setup(x => x.RollEfficient(It.IsAny <Roll>())).Returns(1);
            var actUsageRandomSource = actUsageRandomSourceMock.Object;

            var actUsageService = new TacticalActUsageService(actUsageRandomSource,
                                                              _perkResolver,
                                                              _sectorManager);

            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 <ITacticalAct>();

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



            // ACT
            var usedActs = new UsedTacticalActs(new[] { act });

            actUsageService.UseOn(actor, monster, usedActs);



            // ASSERT
            monsterMock.Verify(x => x.TakeDamage(It.IsAny <int>()), Times.Once);
        }
示例#12
0
        public void UseOn_MonsterHitByActAndKill_SetPerkProgress()
        {
            // ARRANGE



            var actUsageService = new TacticalActUsageService(_actUsageRandomSource, _perkResolver);

            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 = new Mock <IActor>();

            monsterMock.SetupGet(x => x.Node).Returns(new HexNode(1, 0));
            var monster = monsterMock.Object;

            var monsterStateMock = new Mock <IActorState>();
            var monsterState     = monsterStateMock.Object;

            monsterMock.SetupGet(x => x.State).Returns(monsterState);

            var monsterIsDead = false;

            monsterStateMock.SetupGet(x => x.IsDead).Returns(() => monsterIsDead);
            monsterStateMock.Setup(x => x.TakeDamage(It.IsAny <float>())).Callback(() => monsterIsDead = true);
            monsterMock.Setup(x => x.TakeDamage(It.IsAny <float>())).Callback <float>(damage => monsterState.TakeDamage(damage));



            // ACT
            actUsageService.UseOn(actor, monster, _act);



            // ASSERT
            _perkResolverMock.Verify(x => x.ApplyProgress(
                                         It.Is <IJobProgress>(progress => CheckDefeateProgress(progress, monster)),
                                         It.IsAny <IEvolutionData>()
                                         ), Times.Once);
        }
 private static void ConfigurateTacticalActUsageService(IServiceProvider serviceProvider, TacticalActUsageService tacticalActUsageService)
 {
     // Указание необязательных зависимостей
     tacticalActUsageService.EquipmentDurableService = serviceProvider.GetService <IEquipmentDurableService>();
 }
示例#14
0
        public void UseOn_DecreaseBullets_BulletRemovedFromInventory()
        {
            // ARRANGE

            var handlerSelector = CreateEmptyHandlerSelector();

            var actUsageService = new TacticalActUsageService(
                _actUsageRandomSource,
                handlerSelector);

            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 actStatsSubScheme = new TestTacticalActStatsSubScheme
            {
                Offence = new TestTacticalActOffenceSubScheme
                {
                    Type   = OffenseType.Tactical,
                    Impact = ImpactType.Kinetic,
                    ApRank = 10
                }
            };

            var actConstrainsSubScheme = new TestTacticalActConstrainsSubScheme
            {
                PropResourceType  = "7-62",
                PropResourceCount = 1
            };

            var inventory    = new InventoryModule();
            var bulletScheme = new TestPropScheme
            {
                Sid    = "bullet-7-62",
                Bullet = new TestPropBulletSubScheme
                {
                    Caliber = "7-62"
                }
            };

            inventory.Add(new Resource(bulletScheme, 10));
            personMock.Setup(x => x.GetModule <IInventoryModule>(It.IsAny <string>())).Returns(inventory);

            var actMock = new Mock <ITacticalAct>();

            actMock.SetupGet(x => x.Stats).Returns(actStatsSubScheme);
            actMock.SetupGet(x => x.Constrains).Returns(actConstrainsSubScheme);
            var shootAct = actMock.Object;

            var actTargetInfo = new ActTargetInfo(monster, monster.Node);

            var usedActs = new UsedTacticalActs(new[] { shootAct });

            // ACT

            actUsageService.UseOn(actor, actTargetInfo, usedActs, _sector);

            // ASSERT

            var bullets = inventory.CalcActualItems().Single(x => x.Scheme.Sid == "bullet-7-62") as Resource;

            bullets.Count.Should().Be(9);
        }