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 void ExampleShouldWork() { using (StringWriter sw = new StringWriter()) { TextWriter stdout = Console.Out; Console.SetOut(sw); LicensePlate li1 = new LicensePlate("FI", "ABC-123"); LicensePlate li2 = new LicensePlate("FI", "UXE-465"); LicensePlate li3 = new LicensePlate("D", "B WQ-431"); LicensePlate li4 = new LicensePlate("D", "B WQ-432"); LicensePlate li5 = new LicensePlate("D", "B WQ-433"); VehicleRegistry register = new VehicleRegistry(); register.Add(li1, "Arto"); register.Add(li2, "Arto"); register.Add(li3, "Jürgen"); register.Add(li4, "Jürgen"); register.Add(li5, "Jürgen"); Console.WriteLine("Plates:"); register.PrintLicensePlates(); Console.WriteLine("Owners:"); register.PrintOwners(); Console.SetOut(stdout); string example = "Plates:\nFI ABC-123\nFI UXE-465\nD B WQ-431\nD B WQ-432\nD B WQ-433\nOwners:\nArto\nJürgen\n"; Assert.AreEqual(example, sw.ToString().Replace("\r\n", "\n"), "The example should work!"); } }
private Point2D NextTarget(VehiclesGroup myArmy, World world, Player me, Game game) { var enemyVehicles = VehicleRegistry.EnemyVehicles(me); if (world.TickIndex - lastClusteringTick <= CacheTtl) { return(cachedTarget); } var closestUncapturedFacility = VehicleRegistry.GetUncapturedFacilities(world, me, Id) .OrderBy(f => myArmy.Center.GetDistanceTo(f.ToPoint(game))) .FirstOrDefault(); if (closestUncapturedFacility != null) { VehicleRegistry.SetCaptureTarget(closestUncapturedFacility.Id, Id); cachedTarget = closestUncapturedFacility.ToPoint(game); return(cachedTarget); } var nextEnemyGroup = NextEnemyGroup(myArmy.Center, enemyVehicles, world.TickIndex)?.ToList(); if (nextEnemyGroup != null) { cachedTargetGroup = nextEnemyGroup.Select(v => v.Id).ToList(); cachedTarget = nextEnemyGroup.GetCenterPoint(); lastClusteringTick = world.TickIndex; return(cachedTarget); } return(new Point2D(world.Height, world.Width)); }
public override void Commit(Move move, VehicleRegistry registry) { var vehicles = registry.GetVehiclesByIds(vehicleIds); if (!vehicles.Any()) { isStarted = true; return; } var x1 = vehicles.Select(v => v.X).Min() - 1; var y1 = vehicles.Select(v => v.Y).Min() - 1; var x2 = vehicles.Select(v => v.X).Max() + 1; var y2 = vehicles.Select(v => v.Y).Max() + 1; move.Action = ActionType; move.Left = x1; move.Top = y1; move.Right = x2; move.Bottom = y2; if (type.HasValue) { move.VehicleType = type.Value; } isStarted = true; #if DEBUG RewindClient.Instance.Rectangle(x1, y1, x2, y2, Color.Crimson); RewindClient.Instance.End(); #endif }
public override void Commit(Move move, VehicleRegistry registry) { move.Action = ActionType; move.Group = groupId; isStarted = true; }
private List <long> NextTargetGroup(VehiclesGroup myArmy, World world, Player me) { var enemyVehicles = VehicleRegistry.EnemyVehicles(me); if (!enemyVehicles.Any()) { return(Enumerable .Empty <long>() .ToList()); } if (world.TickIndex - lastClusteringTick > CacheTtl) { var nextEnemyGroup = NextEnemyGroup(myArmy.Center, enemyVehicles, world.TickIndex)?.ToList(); cachedTargetGroup = nextEnemyGroup? .Select(v => v.Id) .ToList() ?? new List <long> { enemyVehicles .OrderBy(v => v.GetDistanceTo(myArmy.Center)) .First() .Id }; lastClusteringTick = world.TickIndex; return(cachedTargetGroup); } return(cachedTargetGroup); }
public NewVehiclesFormation(int id, IEnumerable <long> vehicleIds, CommandManager commandManager, VehicleRegistry vehicleRegistry) : base(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 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); } }
public ShrinkGroundVehicleFormation(int id, IEnumerable <long> vehicleIds, CommandManager commandManager, VehicleRegistry vehicleRegistry) : base(id, vehicleIds, commandManager, vehicleRegistry) { }
public TwoOnOneLineVehicleFormation(int id, IEnumerable <long> vehicleIds, CommandManager commandManager, VehicleRegistry vehicleRegistry) : base(id, vehicleIds, commandManager, vehicleRegistry) { }
public void AddShouldReturnFalse() { VehicleRegistry register = new VehicleRegistry(); LicensePlate li5 = new LicensePlate("D", "B WQ-433"); register.Add(li5, "Jürgen"); Assert.AreEqual(false, register.Add(new LicensePlate("D", "B WQ-433"), "Arto"), "Adding owner to existing plate should return false!"); }
public override void Commit(Move move, VehicleRegistry registry) { move.Action = ActionType; move.FacilityId = facilityId; move.VehicleType = vehicleType; isStarted = true; }
/** * Interference between tests necessitates creation of different * vehicle instances for each test **/ public GarageTests() { var gName = "GarageNo6"; var capacity = 42u; ghandler = GarageHandler.Instance; vregistry = VehicleRegistry.Instance; garage = ghandler.CreateGarage(gName, capacity); }
public void GetShouldReturnNotOwner() { VehicleRegistry register = new VehicleRegistry(); LicensePlate li5 = new LicensePlate("D", "B WQ-433"); LicensePlate li2 = new LicensePlate("FI", "UXE-465"); register.Add(li2, "Arto"); Assert.AreNotEqual("Arto", register.Get(li5), "If plate is not added, it return an error"); }
public void RemoveShouldReturnTrue() { VehicleRegistry register = new VehicleRegistry(); LicensePlate li5 = new LicensePlate("D", "B WQ-433"); LicensePlate li2 = new LicensePlate("FI", "UXE-465"); register.Add(li2, "Arto"); Assert.AreEqual(true, register.Remove(li2), "Remove should return true if the plate is removed"); }
public RotateAirVehicleFormation(int id, IEnumerable <long> vehicleIds, CommandManager commandManager, VehicleRegistry vehicleRegistry, bool r2 = false) : base(id, vehicleIds, commandManager, vehicleRegistry) { this.r2 = r2; }
public override bool IsFinished(int worldTick, VehicleRegistry registry) { if (isFinished != null) { return(isFinished(worldTick)); } vehicleIds = registry.FilterDeadVehicles(vehicleIds); return(vehicleIds.All(registry.IsVehicleIdle)); }
private void Bind(VehiclesGroup myArmy) { myArmy .SelectVehicles() .Assign(Id) .Scale(0.1); VehicleRegistry.RegisterNewFormation(Id, VehicleIds); binded = true; }
public void RemoveShouldReturnFalse() { VehicleRegistry register = new VehicleRegistry(); LicensePlate li5 = new LicensePlate("D", "B WQ-433"); LicensePlate li2 = new LicensePlate("FI", "UXE-465"); register.Add(li2, "Arto"); Assert.AreEqual(false, register.Remove(li5), "Remove should return false if a plate is not removed"); }
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))); }
protected VehicleFormationBase(int id, IEnumerable <long> vehicleIds, CommandManager commandManager, VehicleRegistry vehicleRegistry) { Id = id; VehicleIds = vehicleRegistry.FilterDeadVehicles(vehicleIds).ToList(); CommandManager = commandManager; VehicleRegistry = vehicleRegistry; }
public void GetShouldReturnOwner() { VehicleRegistry register = new VehicleRegistry(); LicensePlate li5 = new LicensePlate("D", "B WQ-433"); LicensePlate li2 = new LicensePlate("FI", "UXE-465"); register.Add(li2, "Arto"); register.Add(li5, "Jürgen"); Assert.AreEqual("Jürgen", register.Get(li5), "Get should return the license plate owner!"); }
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 override void Commit(Move move, VehicleRegistry registry) { move.Action = ActionType; move.X = 1; move.Y = 0; isStarted = true; foreach (var vehicleId in vehicleIds) { registry.ForceUnidleVehicle(vehicleId); } }
public override void Commit(Move move, VehicleRegistry registry) { move.Action = ActionType; move.VehicleId = vehicleId; move.X = x; move.Y = y; isStarted = true; #if DEBUG RewindClient.Instance.Circle(x, y, 50, Color.LawnGreen); #endif }
public override void Commit(Move move, VehicleRegistry registry) { move.Action = ActionType; move.Left = x1; move.Top = y1; move.Right = x2; move.Bottom = y2; if (type.HasValue) { move.VehicleType = type.Value; } isStarted = true; }
public override VehicleFormationResult PerformAction(World world, Player me, Game game) { var myArmy = new VehiclesGroup(Id, VehicleIds, VehicleRegistry, CommandManager); commands.RemoveAll(c => c.IsStarted() && c.IsFinished(world.TickIndex, VehicleRegistry)); if (commands.Any()) { return(new VehicleFormationResult(this)); } if (FormationHelper.IsNukeAlert(world.GetOpponentPlayer()) && world.TickIndex - nukePreventionTick > game.BaseTacticalNuclearStrikeCooldown / 2) { commands.Clear(); CommandManager.ClearCommandsQueue(Id); this.PreventNuke(myArmy, world, game, commands); nukePreventionTick = world.TickIndex; return(new VehicleFormationResult(this)); } var myVehicles = VehicleRegistry.GetVehiclesByIds(VehicleIds).ToList(); if (cachedTargetGroup != null && this.TryNuke(myArmy, myVehicles, VehicleRegistry.GetVehiclesByIds(cachedTargetGroup), me, game, world, commands)) { return(new VehicleFormationResult(new ShrinkGroundVehicleFormation(Id, VehicleIds, CommandManager, VehicleRegistry))); } if (commands.Any(c => !c.IsFinished(world.TickIndex, VehicleRegistry))) { return(new VehicleFormationResult(this)); } var nextTarget = NextTarget(myArmy, world, me, game); var direction = myArmy.Center.To(nextTarget); myArmy .Select(Id) .MoveByVector(direction.Length() > 20 ? direction.Mul(0.1) : direction, game.TankSpeed * game.ForestTerrainSpeedFactor); #if DEBUG RewindClient.Instance.Line(myArmy.Center.X, myArmy.Center.Y, nextTarget.X, nextTarget.Y, Color.Fuchsia); #endif commands.Add(CommandManager.PeekLastCommand(Id)); return(new VehicleFormationResult(this)); }
private void Bind(VehiclesGroup myArmy) { if (r2) { myArmy .SelectVehicles() .Assign(Id); } else { myArmy .SelectVehicles(VehicleType.Fighter) .AddToSelectionVehicles(VehicleType.Helicopter) .Assign(MagicConstants.AirFormationGroupId); } VehicleRegistry.RegisterNewFormation(Id, VehicleIds); binded = true; }
static void Main(string[] args) { GarageHandler gh = GarageHandler.Instance; VehicleRegistry vregistry = VehicleRegistry.Instance; IGarage <IVehicle> garage = gh.CreateGarage("Garage01", 42); Console.WriteLine($"{garage.ToString()}"); var car1 = vregistry.CreateVehicle <Car>("ABC123", "Green"); var car2 = vregistry.CreateVehicle <Car>("DEF123", "White"); var car3 = vregistry.CreateVehicle <Car>("ABC456", "Red", FuelType.FuelCell); var car4 = vregistry.CreateVehicle <Car>("DEF456", "Yellow"); var car5 = vregistry.CreateVehicle <Car>("XYZ999", "Black", FuelType.Ethanol); gh.ParkVehicle(garage, car1); gh.ParkVehicle(garage, car2); gh.ParkVehicle(garage, car1); gh.ParkVehicle(garage, car5); Console.WriteLine("---After duplicate instance added---"); Console.WriteLine($"{garage.ToString()}"); garage.EmptyGarage(); Console.WriteLine("---After emptying the garage---"); Console.WriteLine($"{garage.ToString()}"); gh.ParkVehicle(garage, car1); gh.ParkVehicle(garage, car2); gh.ParkVehicle(garage, car3); gh.ParkVehicle(garage, car4); gh.ParkVehicle(garage, car5); Console.WriteLine("---After adding 5 cars---"); Console.WriteLine($"{garage.ToString()}"); // Remove one of the parked cars var removed = gh.RemoveVehicle(garage, car2); Console.WriteLine($"Removed: {removed}"); Console.WriteLine("---After removing car2---"); Console.WriteLine($"{garage.ToString()}"); }
public override void Commit(Move move, VehicleRegistry registry) { move.Action = ActionType; move.Left = x1; move.Top = y1; move.Right = x2; move.Bottom = y2; if (type.HasValue) { move.VehicleType = type.Value; } isStarted = true; #if DEBUG RewindClient.Instance.Rectangle(x1, y1, x2, y2, Color.Crimson); RewindClient.Instance.End(); #endif }