private void ValidateThatTeleportationServiceIsApplicable(IUnit unitToTeleport, ILocation targetLocation, out IPath pathToTheTargetPlanet) { if (unitToTeleport.IsNull()) { throw new ArgumentNullException("unitToTeleport"); } if (targetLocation.IsNull()) { throw new ArgumentNullException("destination"); } if (!this.LocationsMatch(this.LocationOfStation, unitToTeleport.CurrentLocation)) { throw new TeleportOutOfRangeException("unitToTeleport.CurrentLocation"); } var pathsToTheTargetGalaxy = this.GalacticMapOfStation .Where(path => path.TargetLocation.Planet.Galaxy.Name == targetLocation.Planet.Galaxy.Name) .ToList(); if (pathsToTheTargetGalaxy.IsNullOrEmpty()) { throw new LocationNotFoundException("A path to a Galaxy with the provided name cannot be found in the TeleportStation's galactic map."); } pathToTheTargetPlanet = pathsToTheTargetGalaxy.FirstOrDefault(path => path.TargetLocation.Planet.Name == targetLocation.Planet.Name); if (pathToTheTargetPlanet.IsNull()) { throw new LocationNotFoundException("A path to a Planet with the provided name cannot be found in the TeleportStation's galactic map."); } foreach (var unitInCity in pathToTheTargetPlanet.TargetLocation.Planet.Units) { if (this.LocationsAndCoordinatesMatch(targetLocation, unitInCity.CurrentLocation)) { throw new InvalidTeleportationLocationException("There is already a unit placed on the desired location. Cannot activate the teleportation service because the units will overlap."); } } if (!unitToTeleport.CanPay(pathToTheTargetPlanet.Cost)) { throw new InsufficientResourcesException("The unit cannot be teleported, because THERE AIN'T NO SUCH THING AS A FREE LUNCH."); } }
private void ValidateThatTeleportationServiceIsApplicable(IUnit unitToTeleport, ILocation targetLocation, out IPath pathToTheTargetPlanet) { if (unitToTeleport.IsNull()) { throw new ArgumentNullException("unitToTeleport"); } if (targetLocation.IsNull()) { throw new ArgumentNullException("destination"); } if (!this.LocationsMatch(this.location, unitToTeleport.CurrentLocation)) { throw new TeleportOutOfRangeException("unitToTeleport.CurrentLocation"); } var pathsToTheTargetGalaxy = galacticMap .Where(path => path.TargetLocation.Planet.Galaxy.Name == targetLocation.Planet.Galaxy.Name) .ToList(); if (pathsToTheTargetGalaxy.IsNullOrEmpty()) { throw new LocationNotFoundException("A path to a Galaxy with the provided name cannot be found in the TeleportStation's galactic map."); } pathToTheTargetPlanet = pathsToTheTargetGalaxy.FirstOrDefault(path => path.TargetLocation.Planet.Name == targetLocation.Planet.Name); if (pathToTheTargetPlanet.IsNull()) { throw new LocationNotFoundException("A path to a Planet with the provided name cannot be found in the TeleportStation's galactic map."); } foreach (var unitInCity in pathToTheTargetPlanet.TargetLocation.Planet.Units) { if (this.LocationsAndCoordinatesMatch(targetLocation, unitInCity.CurrentLocation)) { throw new InvalidTeleportationLocationException("There is already a unit placed on the desired location. Cannot activate the teleportation service because the units will overlap."); } } if (!unitToTeleport.CanPay(pathToTheTargetPlanet.Cost)) { throw new InsufficientResourcesException("The unit cannot be teleported, because THERE AIN'T NO SUCH THING AS A FREE LUNCH."); } }