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);
        }
Beispiel #2
0
        public void GivenWorldState_WhenApplyAfterTickStateChanges_ReturnPlayerSmaller()
        {
            WorldStateService.GenerateStartingWorld();
            var state = WorldStateService.GetState();

            state.World.Radius = 1900;

            var bot = FakeGameObjectProvider.GetBotAt(new Position(0, 2000));

            bot.Size = 50;
            WorldStateService.UpdateBotSpeed(bot);

            WorldStateService.ApplyAfterTickStateChanges();
            Assert.AreEqual(49, bot.Size);

            WorldStateService.ApplyAfterTickStateChanges();
            Assert.AreEqual(48, bot.Size);

            bot.Position = new Position(0, 1900);
            WorldStateService.ApplyAfterTickStateChanges();
            Assert.AreEqual(47, bot.Size);

            bot.Position = new Position(0, 1849);
            WorldStateService.ApplyAfterTickStateChanges();
            Assert.AreEqual(47, bot.Size);
        }
Beispiel #3
0
        public void GivenBotAndGasCloud_WhenResolveCollision_ReturnBotWithReducedSize()
        {
            WorldStateService.GenerateStartingWorld();
            var state = WorldStateService.GetState();

            List <GameObject> gasClouds = state.GasClouds;
            var gasCloud = gasClouds[0];

            var bot = FakeGameObjectProvider.GetBotAt(gasCloud.Position);

            var handler = collisionHandlerResolver.ResolveHandler(gasCloud, bot);

            handler.ResolveCollision(gasCloud, bot);

            Assert.DoesNotThrow(() => WorldStateService.ApplyAfterTickStateChanges());

            var activeEffect = WorldStateService.GetActiveEffectByType(bot.Id, Effects.GasCloud);
            var botAfter     = WorldStateService.GetState().PlayerGameObjects.Find(g => g.Id == bot.Id);

            Assert.True(activeEffect != default);
            Assert.True(activeEffect.Effect == Effects.GasCloud);
            Assert.True(botAfter != default);
            Assert.True(botAfter.Effects == Effects.GasCloud);
            Assert.AreEqual(8, bot.Size);
        }
        public void GivenBot_WithAfterburnerNotStarted_ThenStartAfterburner()
        {
            SetupFakeWorld();
            var bot         = FakeGameObjectProvider.GetBotAtDefault();
            var firstAction = FakeGameObjectProvider.GetStartAfterburnerPlayerAction(bot.Id);

            bot.PendingActions = new List <PlayerAction>
            {
                firstAction
            };

            Assert.DoesNotThrow(() => actionService.ApplyActionToBot(bot));
            var activeEffect = WorldStateService.GetActiveEffectByType(bot.Id, Effects.Afterburner);
            var botAfter     = WorldStateService.GetState().PlayerGameObjects.Find(g => g.Id == bot.Id);

            Assert.True(activeEffect != default);
            Assert.True(activeEffect.Bot.Size == 10);
            Assert.True(activeEffect.Bot.Speed == 40);
            Assert.True(botAfter != default);
            Assert.True(botAfter.Effects == Effects.Afterburner);

            Assert.DoesNotThrow(() => WorldStateService.ApplyAfterTickStateChanges());

            Assert.True(activeEffect.Bot.Size == 9);
            Assert.True(activeEffect.Bot.Speed == 40);
            Assert.True(botAfter != default);
            Assert.True(botAfter.Effects == Effects.Afterburner);
        }
Beispiel #5
0
        public void GivenWorldState_WhenApplyAfterTickStateChanges_ReturnFirstWormholePairRemoved()
        {
            WorldStateService.GenerateStartingWorld();
            var state = WorldStateService.GetState();

            List <Tuple <GameObject, GameObject> > wormholes = state.WormholePairs;
            var countBefore        = state.WormholePairs.Count;
            var distanceFromOrigin = 0;

            foreach (Tuple <GameObject, GameObject> t in wormholes)
            {
                var item1Distance = VectorCalculatorService.GetDistanceBetween(new Position(0, 0), t.Item1.Position) + t.Item1.Size;
                var item2Distance = VectorCalculatorService.GetDistanceBetween(new Position(0, 0), t.Item2.Position) + t.Item2.Size;

                var longerDistance = item1Distance > item2Distance ? item1Distance : item2Distance;
                distanceFromOrigin = distanceFromOrigin > longerDistance ? distanceFromOrigin : longerDistance;
            }

            var firstSize = wormholes[0].Item1.Size;

            for (var i = 0; i < EngineConfigFake.Value.MapRadius - (distanceFromOrigin - firstSize); i++)
            {
                WorldStateService.ApplyAfterTickStateChanges();
            }

            Assert.Less(state.WormholePairs.Count, countBefore);
        }
        public void GivenBot_WithAfterburnerStarted_ThenStopAfterburner()
        {
            SetupFakeWorld();
            var bot         = FakeGameObjectProvider.GetBotAtDefault();
            var firstAction = FakeGameObjectProvider.GetStartAfterburnerPlayerAction(bot.Id);

            bot.PendingActions = new List <PlayerAction>
            {
                firstAction
            };

            Assert.DoesNotThrow(() => actionService.ApplyActionToBot(bot));
            Assert.DoesNotThrow(() => WorldStateService.ApplyAfterTickStateChanges());

            var secondAction = FakeGameObjectProvider.GetStopAfterburnerPlayerAction(bot.Id);

            bot.PendingActions = new List <PlayerAction>
            {
                secondAction
            };

            Assert.DoesNotThrow(() => actionService.ApplyActionToBot(bot));
            var activeEffect = WorldStateService.GetActiveEffectByType(bot.Id, Effects.Afterburner);

            Assert.True(activeEffect == default);
            Assert.AreEqual(9, bot.Size);
            Assert.AreEqual(23, bot.Speed);
        }
        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);
        }
Beispiel #8
0
        public void GivenWorldState_WhenApplyAfterTickStateChanges_ReturnShrunkRadius()
        {
            WorldStateService.GenerateStartingWorld();
            var state = WorldStateService.GetState();

            var radius = state.World.Radius;

            WorldStateService.ApplyAfterTickStateChanges();

            Assert.True(state.World.Radius < radius);
        }
Beispiel #9
0
        public void GivenWorldState_WhenApplyAfterTickStateChanges_ReturnGrownWormholes()
        {
            WorldStateService.GenerateStartingWorld();
            var state = WorldStateService.GetState();

            List <Tuple <GameObject, GameObject> > wormholes = state.WormholePairs;
            var wormhole     = wormholes[0].Item1;
            var wormholeSize = wormhole.Size;

            WorldStateService.ApplyAfterTickStateChanges();

            Assert.True(wormholeSize < state.WormholePairs[0].Item1.Size);
            Assert.True(wormholeSize < state.WormholePairs[0].Item2.Size);
            Assert.True(state.WormholePairs[0].Item2.Size == state.WormholePairs[0].Item1.Size);
        }
Beispiel #10
0
        public void GivenWorldState_WhenApplyAfterTickStateChanges_ReturnWormholesOutOfRadiusRemoved()
        {
            WorldStateService.GenerateStartingWorld();
            var state = WorldStateService.GetState();

            List <Tuple <GameObject, GameObject> > wormholes = state.WormholePairs;
            var wormhole           = wormholes[0].Item1;
            var distanceFromOrigin = VectorCalculatorService.GetDistanceBetween(new Position(0, 0), wormhole.Position);

            for (var i = 0; i < EngineConfigFake.Value.MapRadius - distanceFromOrigin; i++)
            {
                WorldStateService.ApplyAfterTickStateChanges();
            }

            Assert.Null(WorldStateService.GetWormholePair(wormhole.Id));
        }
Beispiel #11
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_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 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 GivenDeadBot_WithAfterburnerStarted_ThenRemoveFromWorldWhenSizeLessThan5()
        {
            SetupFakeWorld();
            var bot         = FakeGameObjectProvider.GetBotAtDefault();
            var firstAction = FakeGameObjectProvider.GetStartAfterburnerPlayerAction(bot.Id);

            bot.PendingActions = new List <PlayerAction>
            {
                firstAction
            };

            for (var j = 0; j < 6; j++)
            {
                Assert.DoesNotThrow(() => actionService.ApplyActionToBot(bot));
                Assert.DoesNotThrow(() => WorldStateService.ApplyAfterTickStateChanges());
            }

            Assert.AreEqual(4, bot.Size);
            Assert.False(WorldStateService.GameObjectIsInWorldState(bot.Id));
        }
        public void GivenBotAndAsteroidField_WhenResolveCollision_ReturnBotWithReducedSize()
        {
            WorldStateService.GenerateStartingWorld();
            var state = WorldStateService.GetState();

            List <GameObject> asteroidFields = state.AsteroidFields;
            var asteroidField = asteroidFields[0];

            var bot = FakeGameObjectProvider.GetBotAt(asteroidField.Position);

            var handler = collisionHandlerResolver.ResolveHandler(asteroidField, bot);

            handler.ResolveCollision(asteroidField, bot);

            Assert.DoesNotThrow(() => WorldStateService.ApplyAfterTickStateChanges());

            var activeEffect = WorldStateService.GetActiveEffectByType(bot.Id, Effects.AsteroidField);

            Assert.True(activeEffect != default);
            Assert.AreEqual(19, bot.Speed);
        }
Beispiel #16
0
        public void GivenWorldState_WhenApplyAfterTickStateChanges_ReturnFoodRemoved()
        {
            WorldStateService.GenerateStartingWorld();
            var state = WorldStateService.GetState();

            List <GameObject> objects = state.GameObjects;
            var countBefore           = objects.Count(a => a.GameObjectType == GameObjectType.Food);
            var distanceFromOrigin    = 0;

            foreach (var food in objects.Where(a => a.GameObjectType == GameObjectType.Food))
            {
                var itemDistance = VectorCalculatorService.GetDistanceBetween(new Position(0, 0), food.Position);
                distanceFromOrigin = distanceFromOrigin > itemDistance ? distanceFromOrigin : itemDistance;
            }

            for (var i = 0; i < EngineConfigFake.Value.MapRadius - (distanceFromOrigin - EngineConfigFake.Value.WorldFood.FoodSize); i++)
            {
                WorldStateService.ApplyAfterTickStateChanges();
            }

            Assert.AreEqual(countBefore - 1, objects.Count(a => a.GameObjectType == GameObjectType.Food));
        }
        public void GivenBotAndSuperfood_WhenResolveCollision_ReturnBotWithActiveEffects()
        {
            WorldStateService.GenerateStartingWorld();
            var state     = WorldStateService.GetState();
            var superfood = FakeGameObjectProvider.GetSuperfoodAt(new Position(0, 10));

            var bot = FakeGameObjectProvider.GetBotAt(superfood.Position);

            var handler = collisionHandlerResolver.ResolveHandler(superfood, bot);

            handler.ResolveCollision(superfood, bot);

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