private void DoWork(Player me)
        {
            var myVehicles    = VehicleRegistry.MyVehicles(me);
            var tanks         = myVehicles.Where(v => v.Type == VehicleType.Tank).ToList();
            var centerOfTanks = tanks.GetCenterPoint();

            var arrvs         = myVehicles.Where(v => v.Type == VehicleType.Arrv).ToList();
            var centerOfArrvs = arrvs.GetCenterPoint();

            var ifvs         = myVehicles.Where(v => v.Type == VehicleType.Ifv).ToList();
            var centerOfIfvs = ifvs.GetCenterPoint();

            var xTanskArrvs = Math.Abs(centerOfTanks.X - centerOfArrvs.X) < MagicConstants.Eps;
            var xArrvsIfvs  = Math.Abs(centerOfArrvs.X - centerOfIfvs.X) < MagicConstants.Eps;

            var allUnits = new List <Vehicle>();

            allUnits.AddRange(tanks);
            allUnits.AddRange(arrvs);
            allUnits.AddRange(ifvs);

            var x1 = allUnits.Select(v => v.X).Min();
            var y1 = allUnits.Select(v => v.Y).Min();
            var x2 = allUnits.Select(v => v.X).Max();
            var y2 = allUnits.Select(v => v.Y).Max();

            if (xTanskArrvs && xArrvsIfvs)
            {
                VerticalFormation(x1, y1, x2, y2, allUnits, centerOfTanks, centerOfArrvs, centerOfIfvs);
            }
            else
            {
                HorizontalFormation(x1, y1, x2, y2, allUnits, centerOfTanks, centerOfArrvs, centerOfIfvs);
            }
        }
        private void DoWork(Player me, World world)
        {
            var myVehicles    = VehicleRegistry.MyVehicles(me);
            var tanks         = myVehicles.Where(v => v.Type == VehicleType.Tank).ToList();
            var centerOfTanks = tanks.GetCenterPoint();

            var arrvs         = myVehicles.Where(v => v.Type == VehicleType.Arrv).ToList();
            var centerOfArrvs = arrvs.GetCenterPoint();

            var ifvs         = myVehicles.Where(v => v.Type == VehicleType.Ifv).ToList();
            var centerOfIfvs = ifvs.GetCenterPoint();

            var leftGroupType = GetLeftGroupType(centerOfTanks.X, centerOfArrvs.X, centerOfIfvs.X);
            var leftGroup     = leftGroupType == VehicleType.Tank
                                ? tanks
                                : leftGroupType == VehicleType.Arrv
                                        ? arrvs
                                        : ifvs;

            CommandManager.EnqueueCommand(new SelectAllCommand(Id, world, leftGroupType));
            var command = new MoveCommand(Id, leftGroup.Select(v => v.Id).ToList(), MagicConstants.InitialGapSize, 0);

            CommandManager.EnqueueCommand(command);
            commands.Add(command);
        }
        public override VehicleFormationResult PerformAction(World world, Player me, Game game)
        {
            var myVehicles = VehicleRegistry.MyVehicles(me);

            var tanks         = myVehicles.Where(v => v.Type == VehicleType.Tank).ToList();
            var centerOfTanks = tanks.GetCenterPoint();

            var arrvs         = myVehicles.Where(v => v.Type == VehicleType.Arrv).ToList();
            var centerOfArrvs = arrvs.GetCenterPoint();

            var ifvs         = myVehicles.Where(v => v.Type == VehicleType.Ifv).ToList();
            var centerOfIfvs = ifvs.GetCenterPoint();

            var xTanksArrvs = Math.Abs(centerOfTanks.X - centerOfArrvs.X) < MagicConstants.Eps;
            var xArrvsIfvs  = Math.Abs(centerOfArrvs.X - centerOfIfvs.X) < MagicConstants.Eps;
            var xTanksIfvs  = Math.Abs(centerOfTanks.X - centerOfIfvs.X) < MagicConstants.Eps;
            var yTanksArrvs = Math.Abs(centerOfTanks.Y - centerOfArrvs.Y) < MagicConstants.Eps;
            var yArrvsIfvs  = Math.Abs(centerOfArrvs.Y - centerOfIfvs.Y) < MagicConstants.Eps;
            var yTanksIfvs  = Math.Abs(centerOfTanks.Y - centerOfIfvs.Y) < MagicConstants.Eps;

            var xTanksArrvsGap = yTanksArrvs && Math.Abs(centerOfTanks.X - centerOfArrvs.X) > MagicConstants.InitialGapSize + MagicConstants.Eps;
            var xArrvsIfvsGap  = yArrvsIfvs && Math.Abs(centerOfArrvs.X - centerOfIfvs.X) > MagicConstants.InitialGapSize + MagicConstants.Eps;
            var xTanksIfvsGap  = yTanksIfvs && Math.Abs(centerOfTanks.X - centerOfIfvs.X) > MagicConstants.InitialGapSize + MagicConstants.Eps;
            var yTanksArrvsGap = xTanksArrvs && Math.Abs(centerOfTanks.Y - centerOfArrvs.Y) > MagicConstants.InitialGapSize + MagicConstants.Eps;
            var yArrvsIfvsGap  = xArrvsIfvs && Math.Abs(centerOfArrvs.Y - centerOfIfvs.Y) > MagicConstants.InitialGapSize + MagicConstants.Eps;
            var yTanksIfvsGap  = xTanksIfvs && Math.Abs(centerOfTanks.Y - centerOfIfvs.Y) > MagicConstants.InitialGapSize + MagicConstants.Eps;

            if (xTanksArrvs && xArrvsIfvs || yTanksArrvs && yArrvsIfvs)
            {
                return(new VehicleFormationResult(new FinishGroundVehicleFormation(Id, VehicleIds, CommandManager, VehicleRegistry)));
            }

            if (xTanksArrvs && !yTanksArrvsGap && !yTanksIfvs && !yArrvsIfvs ||
                xArrvsIfvs && !yArrvsIfvsGap && !yTanksArrvs && !yTanksIfvs ||
                xTanksIfvs && !yTanksIfvsGap && !yArrvsIfvs && !yTanksArrvs ||
                yTanksArrvs && !xTanksArrvsGap && !xTanksIfvs && !xArrvsIfvs ||
                yArrvsIfvs && !xArrvsIfvsGap && !xTanksArrvs && !xTanksIfvs ||
                yTanksIfvs && !xTanksIfvsGap && !xTanksArrvs && !xArrvsIfvs)
            {
                return(new VehicleFormationResult(new TwoOnOneLineVehicleFormation(Id, VehicleIds, CommandManager, VehicleRegistry)));
            }

            if (xTanksArrvs && !yTanksArrvsGap && (yTanksIfvs && !xTanksIfvsGap || yArrvsIfvs && !xArrvsIfvsGap) ||
                xArrvsIfvs && !yArrvsIfvsGap && (yTanksArrvs && !xTanksArrvsGap || yTanksIfvs && !xTanksIfvsGap) ||
                xTanksIfvs && !yTanksIfvsGap && (yTanksArrvs && !xTanksArrvsGap || yArrvsIfvs && !xArrvsIfvsGap))
            {
                return(new VehicleFormationResult(new CornerVehicleFormation(Id, VehicleIds, CommandManager, VehicleRegistry)));
            }

            if (xTanksArrvsGap || xTanksIfvsGap || xArrvsIfvsGap ||
                yTanksArrvsGap || yTanksIfvsGap || yArrvsIfvsGap)
            {
                return(new VehicleFormationResult(new GappedVehicleFormation(Id, VehicleIds, CommandManager, VehicleRegistry)));
            }
            return(new VehicleFormationResult(new DiagonalVehicleFormation(Id, VehicleIds, CommandManager, VehicleRegistry)));
        }
        private void DoWork(Player me)
        {
            var myVehicles    = VehicleRegistry.MyVehicles(me);
            var tanks         = myVehicles.Where(v => v.Type == VehicleType.Tank).ToList();
            var centerOfTanks = tanks.GetCenterPoint();

            var arrvs         = myVehicles.Where(v => v.Type == VehicleType.Arrv).ToList();
            var centerOfArrvs = arrvs.GetCenterPoint();

            var ifvs         = myVehicles.Where(v => v.Type == VehicleType.Ifv).ToList();
            var centerOfIfvs = ifvs.GetCenterPoint();

            var xTanksArrvs = Math.Abs(centerOfTanks.X - centerOfArrvs.X) < MagicConstants.Eps;
            var xArrvsIfvs  = Math.Abs(centerOfArrvs.X - centerOfIfvs.X) < MagicConstants.Eps;
            var xTanksIfvs  = Math.Abs(centerOfTanks.X - centerOfIfvs.X) < MagicConstants.Eps;
            var yTanksArrvs = Math.Abs(centerOfTanks.Y - centerOfArrvs.Y) < MagicConstants.Eps;
            var yArrvsIfvs  = Math.Abs(centerOfArrvs.Y - centerOfIfvs.Y) < MagicConstants.Eps;
            var yTanksIfvs  = Math.Abs(centerOfTanks.Y - centerOfIfvs.Y) < MagicConstants.Eps;

            var xTanksArrvsGap = yTanksArrvs && Math.Abs(centerOfTanks.X - centerOfArrvs.X) > MagicConstants.InitialGapSize + MagicConstants.Eps;
            var xArrvsIfvsGap  = yArrvsIfvs && Math.Abs(centerOfArrvs.X - centerOfIfvs.X) > MagicConstants.InitialGapSize + MagicConstants.Eps;
            var xTanksIfvsGap  = yTanksIfvs && Math.Abs(centerOfTanks.X - centerOfIfvs.X) > MagicConstants.InitialGapSize + MagicConstants.Eps;
            var yTanksArrvsGap = xTanksArrvs && Math.Abs(centerOfTanks.Y - centerOfArrvs.Y) > MagicConstants.InitialGapSize + MagicConstants.Eps;
            var yArrvsIfvsGap  = xArrvsIfvs && Math.Abs(centerOfArrvs.Y - centerOfIfvs.Y) > MagicConstants.InitialGapSize + MagicConstants.Eps;
            var yTanksIfvsGap  = xTanksIfvs && Math.Abs(centerOfTanks.Y - centerOfIfvs.Y) > MagicConstants.InitialGapSize + MagicConstants.Eps;

            var arrvsGroup = new VehiclesGroup(Id, arrvs.Select(v => v.Id).ToList(), VehicleRegistry, CommandManager);
            var ifvsGroup  = new VehiclesGroup(Id, ifvs.Select(v => v.Id).ToList(), VehicleRegistry, CommandManager);

            if (xTanksArrvsGap)
            {
                MoveCloserX(arrvsGroup, centerOfTanks.X);
            }
            else if (xArrvsIfvsGap)
            {
                MoveCloserX(arrvsGroup, centerOfIfvs.X);
            }
            else if (xTanksIfvsGap)
            {
                MoveCloserX(ifvsGroup, centerOfTanks.X);
            }
            else if (yTanksArrvsGap)
            {
                MoveCloserY(arrvsGroup, centerOfTanks.Y);
            }
            else if (yArrvsIfvsGap)
            {
                MoveCloserY(arrvsGroup, centerOfIfvs.Y);
            }
            else
            {
                MoveCloserY(ifvsGroup, centerOfTanks.Y);
            }
            command = CommandManager.PeekLastCommand(Id) as MoveCommand;
        }
Esempio n. 5
0
        public void Move(Player me, World world, Game game, Move move)
        {
            VehicleRegistry.Update(world, me, game);
            if (world.TickIndex == 0)
            {
                InitFormations(world, me);
            }
#if DEBUG
            RewindClient.Instance.Message($"=== Commands queue size: {CommandManager.GetCurrentQueueSize()} ===");
            RewindClient.Instance.Message($"=== My points: {world.GetMyPlayer().Score} ===");
            RewindClient.Instance.Message($"=== Opponent points: {world.GetOpponentPlayer().Score} ===");
            if (!isGridDrawn)
            {
                DrawGrid(world);
                isGridDrawn = true;
            }
#endif
            if (CommandManager.PlayCommandIfPossible(VehicleRegistry, me, move, world.TickIndex))
            {
                return;
            }
            var unusedFacilities = VehicleRegistry.GetUnusedFacilities(world, me).ToList();
            if (unusedFacilities.Any())
            {
                var facility = unusedFacilities.First();
                if (!AnyVehiclesNearFacility(facility, VehicleRegistry.MyVehicles(me), game))
                {
                    CommandManager.EnqueueCommand(new SetProductionCommand(facility.Id, VehicleType.Tank));
                    return;
                }
            }
            var nextTickFormations = new List <IVehicleFormation>();
            foreach (var formation in formations)
            {
                var result = formation.PerformAction(world, me, game);
                nextTickFormations.AddRange(result.NewFormations);
            }
            formations = nextTickFormations;
            TryIntroduceNewFormations();
        }
Esempio n. 6
0
        private void DoWork(Player me)
        {
            var myVehicles = VehicleRegistry.MyVehicles(me);

            var fightersGroup = new VehiclesGroup(Id,
                                                  myVehicles
                                                  .Where(v => v.Type == VehicleType.Fighter)
                                                  .Select(v => v.Id)
                                                  .ToList(),
                                                  VehicleRegistry,
                                                  CommandManager);
            var helicoptersGroup = new VehiclesGroup(Id,
                                                     myVehicles
                                                     .Where(v => v.Type == VehicleType.Helicopter)
                                                     .Select(v => v.Id)
                                                     .ToList(),
                                                     VehicleRegistry,
                                                     CommandManager);
            var fightersToTheRight = fightersGroup.Center.X > helicoptersGroup.Center.X;

            fightersGroup
            .SelectVehicles(VehicleType.Fighter)
            .Scale(ScaleFactor)
            .MoveByVector(0, 5);

            helicoptersGroup
            .SelectVehicles(VehicleType.Helicopter)
            .ResetIdleness()
            .Scale(ScaleFactor);
            commands.Add(CommandManager.PeekLastCommand(Id));

            fightersGroup
            .SelectVehicles(VehicleType.Fighter)
            .MoveByVector(fightersToTheRight ? -MagicConstants.InitialGapSize - 5 : MagicConstants.InitialGapSize + 5, 0, canBeParallel: true);

            helicoptersGroup
            .SelectVehicles(VehicleType.Helicopter)
            .MoveByVector(fightersToTheRight ? MagicConstants.InitialGapSize : -MagicConstants.InitialGapSize, 0);
            commands.Add(CommandManager.PeekLastCommand(Id));
        }
Esempio n. 7
0
        private void DoWork(Player me, World world)
        {
            var myVehicles    = VehicleRegistry.MyVehicles(me);
            var tanks         = myVehicles.Where(v => v.Type == VehicleType.Tank).ToList();
            var centerOfTanks = tanks.GetCenterPoint();

            var arrvs         = myVehicles.Where(v => v.Type == VehicleType.Arrv).ToList();
            var centerOfArrvs = arrvs.GetCenterPoint();

            var ifvs         = myVehicles.Where(v => v.Type == VehicleType.Ifv).ToList();
            var centerOfIfvs = ifvs.GetCenterPoint();

            var xTanksArrvs = Math.Abs(centerOfTanks.X - centerOfArrvs.X) < MagicConstants.Eps;
            var xArrvsIfvs  = Math.Abs(centerOfArrvs.X - centerOfIfvs.X) < MagicConstants.Eps;
            var xTanksIfvs  = Math.Abs(centerOfTanks.X - centerOfIfvs.X) < MagicConstants.Eps;
            var yTanksArrvs = Math.Abs(centerOfTanks.Y - centerOfArrvs.Y) < MagicConstants.Eps;
            var yArrvsIfvs  = Math.Abs(centerOfArrvs.Y - centerOfIfvs.Y) < MagicConstants.Eps;

            if (xTanksArrvs || xArrvsIfvs || xTanksIfvs)
            {
                if (xTanksArrvs)
                {
                    CommandManager.EnqueueCommand(new SelectAllCommand(Id, world, VehicleType.Ifv));
                    var moveCommand = new MoveCommand(Id, ifvs.Select(v => v.Id).ToList(), centerOfTanks.X - centerOfIfvs.X, 0);
                    CommandManager.EnqueueCommand(moveCommand);
                    commands.Add(moveCommand);
                }
                else if (xArrvsIfvs)
                {
                    CommandManager.EnqueueCommand(new SelectAllCommand(Id, world, VehicleType.Tank));
                    var moveCommand = new MoveCommand(Id, tanks.Select(v => v.Id).ToList(), centerOfArrvs.X - centerOfTanks.X, 0);
                    CommandManager.EnqueueCommand(moveCommand);
                    commands.Add(moveCommand);
                }
                else
                {
                    CommandManager.EnqueueCommand(new SelectAllCommand(Id, world, VehicleType.Arrv));
                    var moveCommand = new MoveCommand(Id, arrvs.Select(v => v.Id).ToList(), centerOfTanks.X - centerOfArrvs.X, 0);
                    CommandManager.EnqueueCommand(moveCommand);
                    commands.Add(moveCommand);
                }
            }
            else
            {
                if (yTanksArrvs)
                {
                    CommandManager.EnqueueCommand(new SelectAllCommand(Id, world, VehicleType.Ifv));
                    var moveCommand = new MoveCommand(Id, ifvs.Select(v => v.Id).ToList(), 0, centerOfTanks.Y - centerOfIfvs.Y);
                    CommandManager.EnqueueCommand(moveCommand);
                    commands.Add(moveCommand);
                }
                else if (yArrvsIfvs)
                {
                    CommandManager.EnqueueCommand(new SelectAllCommand(Id, world, VehicleType.Tank));
                    var moveCommand = new MoveCommand(Id, tanks.Select(v => v.Id).ToList(), 0, centerOfArrvs.Y - centerOfTanks.Y);
                    CommandManager.EnqueueCommand(moveCommand);
                    commands.Add(moveCommand);
                }
                else
                {
                    CommandManager.EnqueueCommand(new SelectAllCommand(Id, world, VehicleType.Arrv));
                    var moveCommand = new MoveCommand(Id, arrvs.Select(v => v.Id).ToList(), 0, centerOfTanks.Y - centerOfArrvs.Y);
                    CommandManager.EnqueueCommand(moveCommand);
                    commands.Add(moveCommand);
                }
            }
        }
        private void DoWork(Player me)
        {
            var myVehicles = VehicleRegistry.MyVehicles(me);

            var fightersGroup = new VehiclesGroup(Id,
                                                  myVehicles
                                                  .Where(v => v.Type == VehicleType.Fighter)
                                                  .Select(v => v.Id)
                                                  .ToList(),
                                                  VehicleRegistry,
                                                  CommandManager);
            var helicoptersGroup = new VehiclesGroup(Id,
                                                     myVehicles
                                                     .Where(v => v.Type == VehicleType.Helicopter)
                                                     .Select(v => v.Id)
                                                     .ToList(),
                                                     VehicleRegistry,
                                                     CommandManager);

            var leftPoint  = new Point2D(MagicConstants.InitialGapSize * 1, MagicConstants.InitialGapSize * 3);
            var rightPoint = new Point2D(MagicConstants.InitialGapSize * 3, MagicConstants.InitialGapSize * 1);


            if (fightersGroup.Center.GetDistanceTo(leftPoint) < helicoptersGroup.Center.GetDistanceTo(leftPoint))
            {
                fightersGroup
                .SelectVehicles(VehicleType.Fighter)
                .MoveTo(leftPoint);

                helicoptersGroup
                .SelectVehicles(VehicleType.Helicopter)
                .MoveTo(rightPoint);

                fightersGroup
                .SelectVehicles(VehicleType.Fighter)
                .MoveByVector(0, -MagicConstants.InitialGapSize, canBeParallel: true);
                commands.Add(CommandManager.PeekLastCommand(Id) as MoveCommand);

                helicoptersGroup
                .SelectVehicles(VehicleType.Helicopter)
                .MoveByVector(0, MagicConstants.InitialGapSize);
                commands.Add(CommandManager.PeekLastCommand(Id) as MoveCommand);
            }
            else
            {
                fightersGroup
                .SelectVehicles(VehicleType.Fighter)
                .MoveTo(rightPoint);

                helicoptersGroup
                .SelectVehicles(VehicleType.Helicopter)
                .MoveTo(leftPoint);

                fightersGroup
                .SelectVehicles(VehicleType.Fighter)
                .MoveByVector(0, MagicConstants.InitialGapSize, canBeParallel: true);
                commands.Add(CommandManager.PeekLastCommand(Id) as MoveCommand);

                helicoptersGroup
                .SelectVehicles(VehicleType.Helicopter)
                .MoveByVector(0, -MagicConstants.InitialGapSize);
                commands.Add(CommandManager.PeekLastCommand(Id) as MoveCommand);
            }
        }