public static DiningSpot FindDiningSpotFor([NotNull] Pawn pawn, bool allowDrug, Predicate <Thing> extraSpotValidator = null) { const int maxRegionsToScan = 1000; const int maxDistanceToScan = 1000; // TODO: Make mod option? var restaurant = pawn.GetRestaurant(); if (restaurant == null) { return(null); } if (!restaurant.Stock.HasAnyFoodFor(pawn, allowDrug)) { return(null); } bool Validator(Thing thing) { var spot = (DiningSpot)thing; //Log.Message($"Validating spot for {pawn.NameShortColored}: social = {spot.IsSociallyProper(pawn)}, political = {spot.IsPoliticallyProper(pawn)}, " // + $"canReserve = {pawn.CanReserve(spot, spot.GetMaxReservations(), 0)}, canDineHere = {spot.MayDineHere(pawn)}, " // + $"extraValidator = { extraSpotValidator == null || extraSpotValidator.Invoke(spot)}"); return(!spot.IsForbidden(pawn) && spot.IsSociallyProper(pawn) && spot.IsPoliticallyProper(pawn) && CanReserve(pawn, spot) && !spot.HostileTo(pawn) && spot.CanDineHere(pawn) && !RestaurantUtility.IsRegionDangerous(pawn, JobUtility.MaxDangerDining, spot.GetRegion()) && (extraSpotValidator == null || extraSpotValidator.Invoke(spot))); } var diningSpot = (DiningSpot)GenClosest.ClosestThingReachable(pawn.Position, pawn.Map, ThingRequest.ForDef(diningSpotDef), PathEndMode.ClosestTouch, TraverseParms.For(pawn), maxDistanceToScan, Validator, null, 0, maxRegionsToScan); return(diningSpot); }
public override bool HasJobOnThing(Pawn pawn, Thing t, bool forced = false) { if (!(t is DiningSpot spot)) { return(false); } if (RestaurantUtility.IsRegionDangerous(pawn, spot.GetRegion()) && !forced) { return(false); } if (spot.GetReservationSpots().Any(s => s == SpotState.Clear || s > SpotState.Ready)) { var canReserve = pawn.Map.reservationManager.CanReserve(pawn, spot); if (!canReserve) { //var reserver = pawn.Map.reservationManager.FirstRespectedReserver(spot, pawn); //Log.Message($"{pawn.NameShortColored} can't reserve {spot.Position} for making. Is reserved by {reserver?.NameShortColored}. "); return(false); } //Log.Message($"{pawn.NameShortColored} can make table at {spot.Position}."); return(true); } return(false); }
public override bool HasJobOnThing(Pawn pawn, Thing t, bool forced = false) { if (!(t is Pawn patron)) { return(false); } if (pawn == t) { return(false); } var driver = patron.GetDriver <JobDriver_Dine>(); if (driver == null || !driver.wantsToOrder) { return(false); } var canReserve = pawn.Map.reservationManager.CanReserve(pawn, patron, 1, -1, null, forced); if (!canReserve) { var reserver = pawn.Map.reservationManager.FirstRespectedReserver(patron, pawn); //Log.Message($"{pawn.NameShortColored} can't reserve {patron.NameShortColored}. Is reserved by {reserver?.NameShortColored}. "); return(false); } if (RestaurantUtility.IsRegionDangerous(pawn, patron.GetRegion()) && !forced) { return(false); } return(true); }
public static void Main(string[] args) { try { RestaurantUtility rest = new RestaurantUtility(); DButilities db = new DButilities(); Console.WriteLine("------------Welcome to Revature Eats!------------"); Console.WriteLine("Please select from the following options:"); Console.WriteLine("1. Display top 3 restaurants"); Console.WriteLine("2. Display all restaurants"); Console.WriteLine("3. Display a restaurant's details"); Console.WriteLine("4. Display all reviews of a restaurant"); Console.WriteLine("5. Search restaurants"); Console.WriteLine("6. Sort Restaurants by name"); Console.WriteLine("7. Sort Restaurants by rating"); Console.WriteLine("8. Quit Application"); int x = Convert.ToInt32(Console.ReadLine()); switch (x) { case 1: //Display top 3 restaurants based on average rating rest.DisplayTop3(); break; case 2: //Display all restaurants foreach (var restaurant in RestaurantUtility.DisplayAllRestaurants()) { Console.WriteLine( "Restaurant: " + restaurant.name + " || Address: " + restaurant.address + " || Email: " + restaurant.email + " || Phone Number: " + restaurant.phone); } break; case 3: //Display info of each restaurant break; case 4: //Display all reviews of a restaurant break; case 5: Console.WriteLine("Search Restaurant Name: "); string query = Console.ReadLine(); List <Restaurant> restaurantName = JsonConvert.DeserializeObject <List <Restaurant> >(RestaurantUtility.SearchRestaurant(query)); foreach (var restaurant in restaurantName) { Console.WriteLine(restaurant.name); } break; case 6: foreach (var restaurant in RestaurantUtility.SortByName()) { Console.WriteLine(restaurant.name); } break; case 7: foreach (var restaurant in RestaurantUtility.SortByRating()) { Console.WriteLine(restaurant.name + "Average Rating: " + restaurant.AvgRating); } break; case 8: Console.WriteLine("Thank you and come again!"); break; default: Console.WriteLine("Invalid option. Please try again."); break; } } catch (Exception e) { Logger logger = LogManager.GetCurrentClassLogger(); logger.Error(e.ToString()); } Console.ReadLine(); }
public RestaurantsController() { rutility = new RestaurantUtility(); }
public override bool HasJobOnThing(Pawn pawn, Thing t, bool forced = false) { if (!(t is Pawn patron)) { return(false); } if (pawn == t) { return(false); } var driver = patron.GetDriver <JobDriver_Dine>(); if (driver == null || driver.wantsToOrder) { return(false); } var restaurant = pawn.GetRestaurant(); var order = restaurant.Orders.GetOrderFor(patron); if (order == null) { return(false); } if (order.delivered) { return(false); } if (restaurant.Orders.IsBeingDelivered(order)) { return(false); } if (!patron.Spawned || patron.Dead) { Log.Message($"Order canceled. null? {order.patron == null} dead? {order.patron.Dead} unspawned? {!order.patron?.Spawned}"); restaurant.Orders.CancelOrder(order); return(false); } //Log.Message($"{pawn.NameShortColored} is trying to serve {patron.NameShortColored} a {order.consumableDef.label}."); var consumable = restaurant.Stock.GetServableThing(order, pawn); if (consumable == null) { Log.Message($"Nothing found that matches order."); return(false); } if (RestaurantUtility.IsRegionDangerous(pawn, JobUtility.MaxDangerServing, patron.GetRegion()) && !forced) { return(false); } if (RestaurantUtility.IsRegionDangerous(pawn, JobUtility.MaxDangerServing, consumable.GetRegion()) && !forced) { return(false); } //Log.Message($"{pawn.NameShortColored} can serve {consumable.Label} to {order.patron.NameShortColored}."); order.consumable = consumable; // Store for JobOnThing return(true); }
IEnumerator Start() { ru = GameObject.FindObjectOfType <RestaurantUtility>(); #if !UNITY_EDITOR if (!Input.location.isEnabledByUser) { yield break; } // Start service before querying location Input.location.Start(); // Wait until service initializes int maxWait = 20; while (Input.location.status == LocationServiceStatus.Initializing && maxWait > 0) { yield return(new WaitForSeconds(1)); maxWait--; } Input.location.Stop(); #endif #if UNITY_EDITOR yield return(null); yield return(new WaitForSeconds(3)); #endif loadingAnimation.SetActive(false); TextAsset r = Resources.Load <TextAsset>("Restaurants"); RestaurantList json = JsonUtility.FromJson <RestaurantList>(r.ToString()); ru.RestaurantList = json; foreach (var restaurant in json.restaurants) { GameObject newRestaurant = Instantiate(restuarantPrefab, transform); TextMeshProUGUI name = newRestaurant.transform.Find("Name").GetComponent <TextMeshProUGUI>(); name.text = restaurant.name; TextMeshProUGUI type = newRestaurant.transform.Find("Type").GetComponent <TextMeshProUGUI>(); type.text = restaurant.foodType; TextMeshProUGUI meal = newRestaurant.transform.Find("Meal").GetComponent <TextMeshProUGUI>(); string tempText = ""; foreach (var m in restaurant.mealType) { tempText = tempText + (MealType)m + " • "; } meal.text = tempText.Substring(0, tempText.Length - 3); TextMeshProUGUI distance = newRestaurant.transform.Find("Distance").GetComponent <TextMeshProUGUI>(); Vector2 restaurantLocation; Vector2 userLocation; #if UNITY_EDITOR restaurantLocation = new Vector2((float)restaurant.longitude, (float)restaurant.latitude); userLocation = new Vector2((float)10.1, (float)9.9); #endif #if !UNITY_EDITOR restaurantLocation = new Vector2((float)restaurant.longitude, (float)restaurant.latitude); userLocation = new Vector2(Input.location.lastData.longitude, Input.location.lastData.latitude); #endif distance.text = (Mathf.Round(Vector2.Distance(restaurantLocation, userLocation) * 100) / 100.0f).ToString() + " MILES"; ru.RestaurantButtons.Add(newRestaurant); } }