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);
        }
Beispiel #7
0
        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);
        }