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