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_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>(); }
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); }
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); }