public void GivenForwardAction_WhenHeadingIs18AndSpeedIs6_ThenDistanceTraveledIs6() { SetupFakeWorld(true, false); var bot = FakeGameObjectProvider.GetBotAt(new Position(0, 0)); bot.PendingActions = new List <PlayerAction> { new PlayerAction { Action = PlayerActions.Forward, Heading = 23, PlayerId = bot.Id } }; bot.Speed = 6; var expectedEndpoint = new Position(6, 2); var expectedDistance = VectorCalculatorService.GetDistanceBetween(bot.Position, expectedEndpoint); Assert.DoesNotThrow(() => engineService.SimulateTickForBots(WorldStateService.GetPlayerBots())); Assert.DoesNotThrow(() => WorldStateService.ApplyAfterTickStateChanges()); var resultingDistanceTravelled = VectorCalculatorService.GetDistanceBetween(new Position(0, 0), bot.Position); var varianceBetweenExpectedAndActualEndpoint = VectorCalculatorService.GetDistanceBetween(bot.Position, expectedEndpoint); var pathPoints = VectorCalculatorService.CollectCollisionDetectionPointsAlongPath(new Position(0, 0), new Position(6, 2), 23); Assert.AreEqual(6, expectedDistance); Assert.AreEqual(expectedEndpoint, bot.Position); Assert.AreEqual(expectedDistance, resultingDistanceTravelled); Assert.Zero(varianceBetweenExpectedAndActualEndpoint); }
public void GivenTorpedoes_WhenHitPlayer_ThenSmallerAndTorpedoSmaller_AndFiringPlayerLarger() { SetupFakeWorld(true); var bot = WorldStateService.GetPlayerBots().First(); var playerBot = FakeGameObjectProvider.GetBotAt(new Position(100, 100)); var torpedo = new TorpedoGameObject() { Id = Guid.NewGuid(), GameObjectType = GameObjectType.TorpedoSalvo, Size = EngineConfigFake.Value.Torpedo.Size, IsMoving = true, Position = new Position(0, 10), Speed = EngineConfigFake.Value.Torpedo.Speed, FiringPlayerId = playerBot.Id }; WorldStateService.AddGameObject(torpedo); var handler = collisionHandlerResolver.ResolveHandler(torpedo, bot); handler.ResolveCollision(torpedo, bot); Assert.IsInstanceOf <TorpedoCollisionHandler>(handler); Assert.AreEqual(0, torpedo.Size); Assert.AreEqual(0, bot.Size); Assert.AreEqual(20, playerBot.Size); }
public void GivenWorldState_WhenTickIsTorpedoTick_ThenBotsGetSalvo() { SetupFakeWorld(true, false); WorldStateService.GetState().World.CurrentTick = EngineConfigFake.Value.Torpedo.ChargeRate - 1; WorldStateService.ApplyAfterTickStateChanges(); var bots = WorldStateService.GetPlayerBots(); Assert.AreEqual(1, bots.First().TorpedoSalvoCount); }
public void GivenTwoBotsCollided_WhenTick_ThenProcessingStepsStopEarly() { var bot1 = FakeGameObjectProvider.GetBotWithActions(); var bot2 = FakeGameObjectProvider.GetBigBotAt(new Position(0, 15)); bot1.IsMoving = true; bot2.IsMoving = true; Assert.DoesNotThrow(() => tickProcessingService.SimulateTick(WorldStateService.GetPlayerBots())); Assert.False(WorldStateService.GameObjectIsInWorldState(bot1.Id)); Assert.True(WorldStateService.GameObjectIsInWorldState(bot2.Id)); }
public void GivenPlayer_WhenUsesFireTorpedoes_ThenTorpedoGameObjectGenerated() { SetupFakeWorld(true); var bot = WorldStateService.GetPlayerBots().First(); bot.PendingActions.Add( new PlayerAction { Action = PlayerActions.FireTorpedoes, Heading = 180, PlayerId = bot.Id }); actionService.ApplyActionToBot(bot); Assert.IsNotEmpty(WorldStateService.GetMovableObjects() .Where(obj => obj.GameObjectType == GameObjectType.TorpedoSalvo)); }
public void GivenBot_WithMovement_AndAfterburnerStarted_ThenStopAfterburnerAndNormalSpeedCorrect() { SetupFakeWorld(true, false); var bot = new BotObject { Id = Guid.NewGuid(), Size = 60, Position = new Position(0, 0), Speed = 4, GameObjectType = GameObjectType.Player }; WorldStateService.AddBotObject(bot); var firstAction = FakeGameObjectProvider.GetForwardPlayerAction(bot.Id); var secondAction = FakeGameObjectProvider.GetStartAfterburnerPlayerAction(bot.Id); var thirdAction = FakeGameObjectProvider.GetForwardPlayerAction(bot.Id); bot.PendingActions = new List <PlayerAction> { firstAction, secondAction, thirdAction }; Assert.DoesNotThrow(() => engineService.SimulateTickForBots(WorldStateService.GetPlayerBots()));; Assert.DoesNotThrow(() => WorldStateService.ApplyAfterTickStateChanges()); Assert.DoesNotThrow(() => engineService.SimulateTickForBots(WorldStateService.GetPlayerBots()));; Assert.DoesNotThrow(() => WorldStateService.ApplyAfterTickStateChanges()); var activeEffect = WorldStateService.GetActiveEffectByType(bot.Id, Effects.Afterburner); Assert.AreEqual(59, bot.Size); Assert.AreEqual(8, bot.Speed); Assert.AreEqual(0, bot.Position.Y); Assert.AreEqual(12, bot.Position.X); Assert.DoesNotThrow(() => engineService.SimulateTickForBots(WorldStateService.GetPlayerBots())); Assert.DoesNotThrow(() => WorldStateService.ApplyAfterTickStateChanges()); Assert.AreEqual(58, bot.Size); Assert.AreEqual(8, bot.Speed); Assert.AreEqual(0, bot.Position.Y); Assert.AreEqual(20, bot.Position.X); }
public void GivenBotAndSuperfood_WhenResolveCollision_ReturnBotWithActiveEffects() { SetupFakeWorld(true, false); FakeGameObjectProvider.GetSuperfoodAt(new Position(8, 0)); FakeGameObjectProvider.GetFoodAt(new Position(80, 0)); var bot = FakeGameObjectProvider.GetBotAt(new Position(0, 0)); var firstAction = FakeGameObjectProvider.GetForwardPlayerAction(bot.Id); bot.PendingActions = new List <PlayerAction> { firstAction, }; Assert.DoesNotThrow(() => engineService.SimulateTickForBots(WorldStateService.GetPlayerBots()));; Assert.DoesNotThrow(() => WorldStateService.ApplyAfterTickStateChanges()); var activeEffect = WorldStateService.GetActiveEffectByType(bot.Id, Effects.Superfood); var botAfter = WorldStateService.GetState().PlayerGameObjects.Find(g => g.Id == bot.Id); Assert.True(activeEffect != default); Assert.True(activeEffect.Effect == Effects.Superfood); Assert.True(botAfter != default); Assert.True(botAfter.Effects == Effects.Superfood); Assert.AreEqual(11, bot.Size); Assert.DoesNotThrow(() => engineService.SimulateTickForBots(WorldStateService.GetPlayerBots()));; Assert.DoesNotThrow(() => WorldStateService.ApplyAfterTickStateChanges()); Assert.DoesNotThrow(() => engineService.SimulateTickForBots(WorldStateService.GetPlayerBots()));; Assert.DoesNotThrow(() => WorldStateService.ApplyAfterTickStateChanges()); Assert.DoesNotThrow(() => engineService.SimulateTickForBots(WorldStateService.GetPlayerBots()));; Assert.DoesNotThrow(() => WorldStateService.ApplyAfterTickStateChanges()); Assert.DoesNotThrow(() => engineService.SimulateTickForBots(WorldStateService.GetPlayerBots()));; Assert.DoesNotThrow(() => WorldStateService.ApplyAfterTickStateChanges()); Assert.DoesNotThrow(() => engineService.SimulateTickForBots(WorldStateService.GetPlayerBots()));; Assert.DoesNotThrow(() => WorldStateService.ApplyAfterTickStateChanges()); activeEffect = WorldStateService.GetActiveEffectByType(bot.Id, Effects.Superfood); botAfter = WorldStateService.GetState().PlayerGameObjects.Find(g => g.Id == bot.Id); Assert.True(activeEffect == null); Assert.True(botAfter != default); Assert.AreEqual(13, bot.Size); }
public void GivenBot_WithAfterburnerStarted_ThenStopAfterburnerAndNormalSpeedCorrect() { SetupFakeWorld(true, false); var food = FakeGameObjectProvider.GetFoodAt(new Position(60, 0)); var id = Guid.NewGuid(); var bot = new BotObject { Id = id, Size = 60, Position = new Position(0, 0), Speed = 4, GameObjectType = GameObjectType.Player, PendingActions = new List <PlayerAction>(), CurrentAction = new PlayerAction { Action = PlayerActions.Stop, Heading = 0, PlayerId = id }, Score = 0 }; WorldStateService.AddBotObject(bot); var firstAction = FakeGameObjectProvider.GetStartAfterburnerPlayerAction(bot.Id); var secondAction = FakeGameObjectProvider.GetForwardPlayerAction(bot.Id); bot.PendingActions = new List <PlayerAction> { firstAction, secondAction }; Assert.DoesNotThrow(() => engineService.SimulateTickForBots(WorldStateService.GetPlayerBots()));; Assert.DoesNotThrow(() => WorldStateService.ApplyAfterTickStateChanges()); Assert.DoesNotThrow(() => engineService.SimulateTickForBots(WorldStateService.GetPlayerBots()));; Assert.DoesNotThrow(() => WorldStateService.ApplyAfterTickStateChanges()); Assert.AreEqual(59, bot.Size); Assert.AreEqual(8, bot.Speed); Assert.AreEqual(0, bot.Position.Y); Assert.AreEqual(8, bot.Position.X); }
public void GivenBot_WhenActionIsProcessed_ThenVectorIsStepwiseCalculated() { SetupFakeWorld(true, false); var bot = FakeGameObjectProvider.GetBotWithActions(); bot.IsMoving = true; vectorCalculatorServiceMock.Setup(x => x.GetPointFrom(It.IsAny <Position>(), It.IsAny <int>(), It.IsAny <int>())) .Returns(VectorCalculatorService.GetPointFrom(bot.Position, 1, bot.CurrentHeading)); vectorCalculatorServiceMock.Setup(x => x.IsInWorldBounds(It.IsAny <Position>(), It.IsAny <int>())).Returns(true); vectorCalculatorServiceMock .Setup(vcs => vcs.CollectCollisionDetectionPointsAlongPath(It.IsAny <Position>(), It.IsAny <Position>(), It.IsAny <int>())) .Returns( new List <Position> { new Position(0, 0), new Position(1, 1), new Position(2, 2) }); Assert.DoesNotThrow(() => tickProcessingService.SimulateTick(WorldStateService.GetPlayerBots())); }
public void GivenBot_WhenSizeChangesDuringActionProcessing_ThenRemainingProcessStepsAreAdjusted() { SetupFakeWorld(true, false); var food = PlaceFoodAtPosition(new Position(0, 1)); var bot = FakeGameObjectProvider.GetBotWithActions(); bot.CurrentHeading = 90; bot.Speed = 20; bot.IsMoving = true; tickProcessingService = new TickProcessingService( collisionHandlerResolver, VectorCalculatorService, WorldStateService, collisionService); Assert.DoesNotThrow(() => tickProcessingService.SimulateTick(WorldStateService.GetPlayerBots())); Assert.AreEqual(11, bot.Size); Assert.AreEqual(19, bot.Speed); Assert.AreEqual(new Position(0, 19), bot.Position); }