예제 #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));
        }
예제 #2
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>();
        }
예제 #3
0
        protected override void ExecuteTask()
        {
            if (Actor.Person.GetModuleSafe <ICombatActModule>() is null)
            {
                throw new NotImplementedException("Не неализована возможность атаковать без навыков.");
            }

            if (!TargetObject.CanBeDamaged())
            {
                // Эта ситуация может произойти, когда:
                // 1. Текущий актёр начал выполнять задачу.
                // 2. Цель убили/умерла сама.
                // 3. Наступил момент, когда задача текущего актёра должна выполниться.

                // Эту првоерку нужно проводить выше, когда пользователю сообщаяется возможность
                // выполнить эту задачу до её начала.
                return;
            }

            var availableSlotAct = GetSecondaryUsedActs();

            var primary   = new[] { TacticalAct };
            var secondary = availableSlotAct.Where(x => x != TacticalAct).Skip(1).ToArray();

            var usedActs = new UsedTacticalActs(primary, secondary);

            var actTargetInfo = new ActTargetInfo(TargetObject, TargetNode);

            _actService.UseOn(Actor, actTargetInfo, usedActs, Context.Sector);
        }
예제 #4
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);
        }