private static IPerson CreatePerson()
        {
            var tacticalActStatsScheme = new TestTacticalActStatsSubScheme();
            var tacticalActMock        = new Mock <ITacticalAct>();

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

            var tacticalCarrierMock = new Mock <ITacticalActCarrier>();

            tacticalCarrierMock.SetupProperty(x => x.Acts, new[] { tacticalAct });
            var tacticalCarrier = tacticalCarrierMock.Object;

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


            var personMock = new Mock <IPerson>();

            personMock.SetupGet(x => x.TacticalActCarrier).Returns(tacticalCarrier);
            personMock.SetupGet(x => x.Survival).Returns(survivalData);
            var person = personMock.Object;

            return(person);
        }
Пример #2
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);
        }
Пример #3
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)));
        }
Пример #4
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);
        }
Пример #5
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)));
        }
Пример #6
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);
        }
Пример #7
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);
        }
Пример #8
0
        private static ITacticalAct CreateSimpleAct()
        {
            var actMock       = new Mock <ITacticalAct>();
            var actStatScheme = new TestTacticalActStatsSubScheme
            {
                Range = new Range <int>(1, 2)
            };

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

            return(act);
        }
Пример #9
0
        private static ITacticalAct CreateActWithResolvedCooldown()
        {
            var actMock       = new Mock <ITacticalAct>();
            var actStatScheme = new TestTacticalActStatsSubScheme
            {
                Range = new Range <int>(1, 2)
            };

            actMock.SetupGet(x => x.Stats).Returns(actStatScheme);
            actMock.SetupGet(x => x.CurrentCooldown).Returns(0);
            var act = actMock.Object;

            return(act);
        }
        public async Task SetUpAsync()
        {
            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);
            _actUsageRandomSource = actUsageRandomSourceMock.Object;

            _perkResolverMock = new Mock <IPerkResolver>();
            _perkResolver     = _perkResolverMock.Object;

            var personMock = new Mock <IPerson>();

            _person = personMock.Object;

            var evolutionDataMock = new Mock <IEvolutionData>();
            var evolutionData     = evolutionDataMock.Object;

            personMock.SetupGet(x => x.EvolutionData).Returns(evolutionData);

            var actScheme = new TestTacticalActStatsSubScheme
            {
                Offence = new TestTacticalActOffenceSubScheme
                {
                    Type   = OffenseType.Tactical,
                    Impact = ImpactType.Kinetic,
                    ApRank = 10
                }
            };

            var actMock = new Mock <ITacticalAct>();

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

            var sectorManagerMock = new Mock <ISectorManager>();
            var sectorManager     = sectorManagerMock.Object;

            var map = await SquareMapFactory.CreateAsync(3);

            var sectorMock = new Mock <ISector>();

            sectorMock.SetupGet(x => x.Map).Returns(map);
            var sector = sectorMock.Object;

            sectorManagerMock.SetupGet(x => x.CurrentSector).Returns(sector);

            _sectorManager = sectorManager;
        }
Пример #11
0
        private static ITacticalAct CreateTestAct()
        {
            var actScheme = new TestTacticalActStatsSubScheme
            {
                Offence = new TestTacticalActOffenceSubScheme
                {
                    Type   = OffenseType.Tactical,
                    Impact = ImpactType.Kinetic,
                    ApRank = 10
                }
            };

            var actMock = new Mock <ITacticalAct>();

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

            return(act);
        }
Пример #12
0
        public async Task SetUpAsync()
        {
            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);
            _actUsageRandomSource = actUsageRandomSourceMock.Object;

            var personMock = new Mock <IPerson>();

            _person = personMock.Object;

            var evolutionModuleMock = new Mock <IEvolutionModule>();
            var evolutionModule     = evolutionModuleMock.Object;

            personMock.Setup(x => x.GetModule <IEvolutionModule>(It.IsAny <string>())).Returns(evolutionModule);

            var actScheme = new TestTacticalActStatsSubScheme
            {
                Offence = new TestTacticalActOffenceSubScheme
                {
                    Type   = OffenseType.Tactical,
                    Impact = ImpactType.Kinetic,
                    ApRank = 10
                }
            };

            var actMock = new Mock <ITacticalAct>();

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

            var map = await SquareMapFactory.CreateAsync(3).ConfigureAwait(false);

            var sectorMock = new Mock <ISector>();

            sectorMock.SetupGet(x => x.Map).Returns(map);
            _sector = sectorMock.Object;
        }
Пример #13
0
        public async System.Threading.Tasks.Task SetUpAsync()
        {
            Container = new ServiceContainer();

            var testMap = await SquareMapFactory.CreateAsync(10);

            var sectorMock = new Mock <ISector>();

            sectorMock.SetupGet(x => x.Map).Returns(testMap);
            var sector = sectorMock.Object;

            var sectorManagerMock = new Mock <ISectorManager>();

            sectorManagerMock.SetupGet(x => x.CurrentSector).Returns(sector);
            var sectorManager = sectorManagerMock.Object;

            var actMock       = new Mock <ITacticalAct>();
            var actStatScheme = new TestTacticalActStatsSubScheme
            {
                Range = new Range <int>(1, 2)
            };

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

            var actCarrierMock = new Mock <ITacticalActCarrier>();

            actCarrierMock.SetupGet(x => x.Acts)
            .Returns(new[] { act });
            var actCarrier = actCarrierMock.Object;

            var equipmentCarrierMock = new Mock <IEquipmentCarrier>();

            equipmentCarrierMock.SetupGet(x => x.Slots).Returns(new[] { new PersonSlotSubScheme {
                                                                            Types = EquipmentSlotTypes.Hand
                                                                        } });
            var equipmentCarrier = equipmentCarrierMock.Object;

            var personMock = new Mock <IPerson>();

            personMock.SetupGet(x => x.TacticalActCarrier).Returns(actCarrier);
            personMock.SetupGet(x => x.EquipmentCarrier).Returns(equipmentCarrier);
            var person = personMock.Object;

            var actorMock = new Mock <IActor>();
            var actorNode = testMap.Nodes.OfType <HexNode>().SelectBy(0, 0);

            actorMock.SetupGet(x => x.Node).Returns(actorNode);
            actorMock.SetupGet(x => x.Person).Returns(person);
            var actor = actorMock.Object;

            var actorVmMock = new Mock <IActorViewModel>();

            actorVmMock.SetupProperty(x => x.Actor, actor);
            var actorVm = actorVmMock.Object;

            var humanTaskSourceMock = new Mock <IHumanActorTaskSource>();
            var humanTaskSource     = humanTaskSourceMock.Object;

            var playerStateMock = new Mock <ISectorUiState>();

            playerStateMock.SetupProperty(x => x.ActiveActor, actorVm);
            playerStateMock.SetupProperty(x => x.TaskSource, humanTaskSource);
            var playerState = playerStateMock.Object;

            var gameLoopMock = new Mock <IGameLoop>();
            var gameLoop     = gameLoopMock.Object;

            var usageServiceMock = new Mock <ITacticalActUsageService>();
            var usageService     = usageServiceMock.Object;

            Container.Register(factory => sectorManager, new PerContainerLifetime());
            Container.Register(factory => humanTaskSourceMock, new PerContainerLifetime());
            Container.Register(factory => playerState, new PerContainerLifetime());
            Container.Register(factory => gameLoop, new PerContainerLifetime());
            Container.Register(factory => usageService, new PerContainerLifetime());

            RegisterSpecificServices(testMap, playerStateMock);
        }
Пример #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);
        }