public static bool FindAFunActivity(this TouristAI touristAI, uint citizenId, ref Citizen citizen, ushort proximityBuilding) { var visitMonument = SimulationManager.instance.m_randomizer.Int32(10) < 3; var proximityBuildingInstance = BuildingManager.instance.m_buildings.m_buffer[proximityBuilding]; if (visitMonument && proximityBuilding != 0) { var monument = touristAI.FindSomewhere(citizenId, ref citizen, proximityBuildingInstance, new[] { ItemClass.Service.Monument }, new[] { ItemClass.SubService.None }); if (monument != 0) { touristAI.GoToBuilding(citizenId, ref citizen, monument); return(true); } } var foundBuilding = touristAI.FindSomewhere(citizenId, ref citizen, proximityBuildingInstance, new[] { ItemClass.Service.Beautification, ItemClass.Service.Commercial, ItemClass.Service.Natural, ItemClass.Service.Tourism }, new[] { ItemClass.SubService.None }); if (foundBuilding != 0) { touristAI.GoToBuilding(citizenId, ref citizen, foundBuilding); return(true); } return(false); }
public static bool UpdateLocationPrefix(TouristAI __instance, uint citizenID, ref Citizen data) { if (UserModSettings.Settings.Enabled && UserModSettings.Settings.Tourists_Override) { return(!TouristLocationHandler.Process(ref __instance, citizenID, ref data)); } return(true); }
public static bool FindAShop(this TouristAI touristAI, uint citizenId, ref Citizen citizen, ushort proximityBuilding) { var proximityBuildingInstance = BuildingManager.instance.m_buildings.m_buffer[proximityBuilding]; var foundBuilding = touristAI.FindSomewhere(citizenId, ref citizen, proximityBuildingInstance, new[] { ItemClass.Service.Commercial }, new[] { ItemClass.SubService.CommercialEco, ItemClass.SubService.CommercialHigh, ItemClass.SubService.CommercialLow }); if (foundBuilding != 0) { touristAI.GoToBuilding(citizenId, ref citizen, foundBuilding); return(true); } return(false); }
public static bool FindAFunActivity(this TouristAI touristAI, uint citizenId, ushort proximityBuilding) { var entertainmentReason = new Traverse(touristAI).Method("GetEntertainmentReason").GetValue <TransferManager.TransferReason>(); if (entertainmentReason != TransferManager.TransferReason.None) { new Traverse(touristAI).Method("FindVisitPlace", citizenId, proximityBuilding, entertainmentReason); CitizenActivityMonitor.LogActivity(citizenId, CitizenActivityMonitor.Activity.AttemptingToGoForEntertainment); return(true); } return(false); }
private static bool ProcessInBuilding(ref TouristAI touristAI, uint citizenId, ref Citizen citizen) { if (citizen.ValidBuilding()) { var buildingInstance = citizen.GetBuildingInstance(); if (buildingInstance?.m_flags.IsFlagSet(Building.Flags.Evacuating) ?? false) { return(false); } if (citizen.IsVisiting()) { ProcessVisiting(ref touristAI, citizenId, ref citizen); } } return(true); }
public static bool Process(ref TouristAI touristAI, uint citizenId, ref Citizen citizen) { if (!citizen.Arrested && !citizen.Sick && !citizen.Collapsed && !citizen.Dead && !citizen.AtHome() && !citizen.AtWork() && citizen.Exists()) { CitizenActivityMonitor.LogActivity(citizenId, CitizenActivityMonitor.Activity.Unknown); if (citizen.IsAtABuilding()) { return(ProcessInBuilding(ref touristAI, citizenId, ref citizen)); } else if (citizen.IsMoving()) { return(ProcessMoving(ref touristAI, citizenId, ref citizen)); } return(true); } return(false); }
public static TransferManager.TransferReason GetLeavingReason(TouristAI thisAI, uint citizenID, ref Citizen data) { Debug.LogWarning("GetLeavingReason is not overridden!"); return(0); }
public static TransferManager.TransferReason GetLeavingReason(TouristAI thisAI, uint citizenID, ref Citizen data) { Debug.LogWarning("GetLeavingReason is not overridden!"); return 0; }
private static bool ProcessMoving(ref TouristAI touristAI, uint citizenId, ref Citizen citizen) { CitizenActivityMonitor.LogActivity(citizenId, CitizenActivityMonitor.Activity.Moving); return(citizen.m_vehicle != 0 || citizen.IsVisible()); }
private static TransferManager.TransferReason GetEntertainmentReason(TouristAI instance) { throw new InvalidOperationException(RedirectNeededMessage); }
private static void FindVisitPlace(TouristAI instance, uint citizenId, ushort sourceBuilding, TransferManager.TransferReason reason) { throw new InvalidOperationException(RedirectNeededMessage); }
private static void AddTouristVisit(TouristAI instance, uint citizenId, ushort buildingId) { throw new InvalidOperationException(RedirectNeededMessage); }
private static int GetRandomTargetType(TouristAI instance, int doNothingProbability) { throw new InvalidOperationException(RedirectNeededMessage); }
private static bool StartMoving(TouristAI instance, uint citizenId, ref Citizen citizen, ushort sourceBuilding, ushort targetBuilding) { throw new InvalidOperationException(RedirectNeededMessage); }
public static void UpdateLocation(TouristAI thisAI, uint citizenID, ref Citizen person) { if (person.m_homeBuilding == 0 && person.m_workBuilding == 0 && (person.m_visitBuilding == 0 && person.m_instance == 0)) { Singleton <CitizenManager> .instance.ReleaseCitizen(citizenID); } else { switch (person.CurrentLocation) { case Citizen.Location.Home: Singleton <CitizenManager> .instance.ReleaseCitizen(citizenID); break; case Citizen.Location.Work: Singleton <CitizenManager> .instance.ReleaseCitizen(citizenID); break; case Citizen.Location.Visit: if (person.Dead || person.Sick || (int)person.m_visitBuilding == 0) { Singleton <CitizenManager> .instance.ReleaseCitizen(citizenID); break; } if (!person.Collapsed) { SimulationManager _simulationManager = Singleton <SimulationManager> .instance; BuildingManager _buildingManager = Singleton <BuildingManager> .instance; Building _currentBuilding = _buildingManager.m_buildings.m_buffer[person.m_visitBuilding]; BuildingInfo _buildingInfo = _currentBuilding.Info; float time = _simulationManager.m_currentDayTimeHour; bool visitingHours = time > _simulationManager.m_randomizer.Int32(6, 8) && time < _simulationManager.m_randomizer.Int32(18, 23); int reduceAmount = -100; if (_currentBuilding.Info.m_class.m_service != ItemClass.Service.Disaster || !_currentBuilding.m_flags.IsFlagSet(Building.Flags.Downgrading)) { if (_currentBuilding.m_flags.IsFlagSet(Building.Flags.Evacuating)) { FindEvacuationPlace(thisAI, citizenID, person.m_visitBuilding, GetEvacuationReason(thisAI, person.m_visitBuilding)); } else if (!GameEventHelpers.EventTakingPlace(person.m_visitBuilding) && !CityEventManager.instance.EventTakingPlace(person.m_visitBuilding) && !CityEventManager.instance.EventStartsWithin(person.m_visitBuilding, 2D)) { int eventId = CityEventManager.instance.EventStartsWithin(citizenID, ref person, ResidentLocationHandler.StartMovingToEventTime); if (eventId != -1) { CityEvent _cityEvent = CityEventManager.instance.m_nextEvents[eventId]; if (_cityEvent.EventStartsWithin(ResidentLocationHandler.StartMovingToEventTime) && !_cityEvent.EventStartsWithin(ResidentLocationHandler.MaxMoveToEventTime)) { if ((person.m_instance != 0 || DoRandomMove(thisAI)) && _cityEvent.Register(citizenID, ref person)) { StartMoving(thisAI, citizenID, ref person, person.m_visitBuilding, _cityEvent.m_eventData.m_eventBuilding); person.SetVisitplace(citizenID, _cityEvent.m_eventData.m_eventBuilding, 0U); person.m_visitBuilding = _cityEvent.m_eventData.m_eventBuilding; } } } else if (visitingHours) { int chance = _simulationManager.m_randomizer.Int32(10U); if (chance == 0 && (person.m_instance != 0 || DoRandomMove(thisAI))) { FindVisitPlace(thisAI, citizenID, person.m_visitBuilding, GetLeavingReason(thisAI, citizenID, ref person)); } else if (chance > 7) { break; } else if (chance > 5) { if (person.m_instance != 0 || DoRandomMove(thisAI)) { FindVisitPlace(thisAI, citizenID, person.m_visitBuilding, GetShoppingReason(thisAI)); } _buildingInfo.m_buildingAI.ModifyMaterialBuffer(person.m_visitBuilding, ref _buildingManager.m_buildings.m_buffer[person.m_visitBuilding], TransferManager.TransferReason.Shopping, ref reduceAmount); AddTouristVisit(thisAI, citizenID, person.m_visitBuilding); } else if (chance > 3) { if (person.m_instance != 0 || DoRandomMove(thisAI)) { FindVisitPlace(thisAI, citizenID, person.m_visitBuilding, GetEntertainmentReason(thisAI)); } } else { _buildingInfo.m_buildingAI.ModifyMaterialBuffer(person.m_visitBuilding, ref _buildingManager.m_buildings.m_buffer[person.m_visitBuilding], TransferManager.TransferReason.Shopping, ref reduceAmount); AddTouristVisit(thisAI, citizenID, person.m_visitBuilding); } } else if (_buildingInfo.m_class.m_subService != ItemClass.SubService.CommercialTourist) //Not in a hotel { if (person.m_instance != 0 || DoRandomMove(thisAI)) { //Try find a hotel ushort foundHotel = _buildingManager.FindBuilding(_currentBuilding.m_position, 1000f, ItemClass.Service.Commercial, ItemClass.SubService.CommercialTourist, Building.Flags.Created | Building.Flags.Active, Building.Flags.Deleted); if (foundHotel != 0) { if (_simulationManager.m_randomizer.Int32(0, 10) > 2) { thisAI.StartMoving(citizenID, ref person, person.m_visitBuilding, foundHotel); person.SetVisitplace(citizenID, foundHotel, 0U); person.m_visitBuilding = foundHotel; AddTouristVisit(thisAI, citizenID, foundHotel); LoggingWrapper.Log("Tourist " + citizenID + " found hotel."); } else { LoggingWrapper.Log("Tourist " + citizenID + " found a hotel, but instead chose to go home."); FindVisitPlace(thisAI, citizenID, person.m_visitBuilding, GetLeavingReason(thisAI, citizenID, ref person)); } } else { LoggingWrapper.Log("Tourist " + citizenID + " couldn't find a hotel, so is heading home instead."); FindVisitPlace(thisAI, citizenID, person.m_visitBuilding, GetLeavingReason(thisAI, citizenID, ref person)); } } } } } } break; case Citizen.Location.Moving: if (person.Dead || person.Sick) { Singleton <CitizenManager> .instance.ReleaseCitizen(citizenID); break; } if ((int)person.m_vehicle != 0 || (int)person.m_instance != 0) { break; } Singleton <CitizenManager> .instance.ReleaseCitizen(citizenID); break; } } }
public static void UpdateLocation(TouristAI thisAI, uint citizenID, ref Citizen data) { if (data.m_homeBuilding == 0 && data.m_workBuilding == 0 && (data.m_visitBuilding == 0 && data.m_instance == 0)) { Singleton<CitizenManager>.instance.ReleaseCitizen(citizenID); } else { switch (data.CurrentLocation) { case Citizen.Location.Home: Singleton<CitizenManager>.instance.ReleaseCitizen(citizenID); break; case Citizen.Location.Work: Singleton<CitizenManager>.instance.ReleaseCitizen(citizenID); break; case Citizen.Location.Visit: if (data.Dead || data.Sick || (int)data.m_visitBuilding == 0) { Singleton<CitizenManager>.instance.ReleaseCitizen(citizenID); break; } SimulationManager _simulationManager = Singleton<SimulationManager>.instance; BuildingManager _buildingManager = Singleton<BuildingManager>.instance; BuildingInfo _buildingInfo = _buildingManager.m_buildings.m_buffer[data.m_visitBuilding].Info; float time = _simulationManager.m_currentDayTimeHour; bool visitingHours = time > _simulationManager.m_randomizer.Int32(6, 8) && time < _simulationManager.m_randomizer.Int32(18, 23); int reduceAmount = -100; if (visitingHours) { int chance = _simulationManager.m_randomizer.Int32(10U); if (chance == 0) { FindVisitPlace(thisAI, citizenID, data.m_visitBuilding, GetLeavingReason(thisAI, citizenID, ref data)); } else if (chance > 7) { break; } else if (chance > 5) { if (data.m_instance != 0 || DoRandomMove(thisAI)) { FindVisitPlace(thisAI, citizenID, data.m_visitBuilding, GetShoppingReason(thisAI)); } _buildingInfo.m_buildingAI.ModifyMaterialBuffer(data.m_visitBuilding, ref _buildingManager.m_buildings.m_buffer[data.m_visitBuilding], TransferManager.TransferReason.Shopping, ref reduceAmount); AddTouristVisit(thisAI, citizenID, data.m_visitBuilding); } else if (chance > 3) { if (data.m_instance != 0 || DoRandomMove(thisAI)) { FindVisitPlace(thisAI, citizenID, data.m_visitBuilding, GetEntertainmentReason(thisAI)); } } else { _buildingInfo.m_buildingAI.ModifyMaterialBuffer(data.m_visitBuilding, ref _buildingManager.m_buildings.m_buffer[data.m_visitBuilding], TransferManager.TransferReason.Shopping, ref reduceAmount); AddTouristVisit(thisAI, citizenID, data.m_visitBuilding); } } else if(_buildingInfo.m_class.m_subService != ItemClass.SubService.CommercialTourist) //Not in a hotel, so may as well go home. { FindVisitPlace(thisAI, citizenID, data.m_visitBuilding, GetLeavingReason(thisAI, citizenID, ref data)); } break; case Citizen.Location.Moving: if (data.Dead || data.Sick) { Singleton<CitizenManager>.instance.ReleaseCitizen(citizenID); break; } if ((int)data.m_vehicle != 0 || (int)data.m_instance != 0) break; Singleton<CitizenManager>.instance.ReleaseCitizen(citizenID); break; } } }
public static bool AddTouristVisit(TouristAI thisAI, uint citizenID, ushort buildingID) { Debug.LogWarning("AddTouristVisit is not overridden!"); return false; }
public static TransferManager.TransferReason GetEntertainmentReason(TouristAI thisAI) { Debug.LogWarning("GetEntertainmentReason is not overridden!"); return 0; }
public static bool DoRandomMove(TouristAI thisAI) { Debug.LogWarning("DoRandomMove is not overridden!"); return false; }
private static void UpdateLocation(TouristAI instance, uint citizenId, ref Citizen citizen) { RealTimeAI?.UpdateLocation(instance, citizenId, ref citizen); }
public static bool DoRandomMove(TouristAI thisAI) { Debug.LogWarning("DoRandomMove is not overridden!"); return(false); }
private static TransferManager.TransferReason GetLeavingReason(TouristAI instance, uint citizenId, ref Citizen citizen) { throw new InvalidOperationException(RedirectNeededMessage); }
public static TransferManager.TransferReason GetEntertainmentReason(TouristAI thisAI) { Debug.LogWarning("GetEntertainmentReason is not overridden!"); return(0); }
private static TransferManager.TransferReason GetEvacuationReason(TouristAI instance, ushort sourceBuilding) { throw new InvalidOperationException(RedirectNeededMessage); }
public static bool AddTouristVisit(TouristAI thisAI, uint citizenID, ushort buildingID) { Debug.LogWarning("AddTouristVisit is not overridden!"); return(false); }
private static bool DoRandomMove(TouristAI instance) { throw new InvalidOperationException(RedirectNeededMessage); }
public static bool StartMoving(TouristAI thisAI, uint citizenID, ref Citizen data, ushort sourceBuilding, ushort targetBuilding) { Debug.LogWarning("StartMoving is not overridden!"); return(false); }
public static bool Prefix(TouristAI __instance, ref VehicleInfo __result, ushort instanceID, ref CitizenInstance citizenData, bool forceProbability, out VehicleInfo trailer) { #if DEBUG bool citizenDebug = (DebugSettings.CitizenInstanceId == 0 || DebugSettings.CitizenInstanceId == instanceID) && (DebugSettings.CitizenId == 0 || DebugSettings.CitizenId == citizenData.m_citizen) && (DebugSettings.SourceBuildingId == 0 || DebugSettings.SourceBuildingId == citizenData.m_sourceBuilding) && (DebugSettings.TargetBuildingId == 0 || DebugSettings.TargetBuildingId == citizenData.m_targetBuilding); bool logParkingAi = DebugSwitch.BasicParkingAILog.Get() && citizenDebug; #else var logParkingAi = false; #endif trailer = null; if (citizenData.m_citizen == 0u) { __result = null; return(false); } // NON-STOCK CODE START bool forceTaxi = false; if (Options.parkingAI) { if (ExtCitizenInstanceManager.Instance.ExtInstances[instanceID].pathMode == ExtPathMode.TaxiToTarget) { forceTaxi = true; } } // NON-STOCK CODE END Citizen.Wealth wealthLevel = citizenData.m_citizen.ToCitizen().WealthLevel; int carProb; int bikeProb; int taxiProb; // NON-STOCK CODE START if (forceTaxi) { carProb = 0; bikeProb = 0; taxiProb = 100; } else // NON-STOCK CODE END if (forceProbability || (citizenData.m_flags & CitizenInstance.Flags.BorrowCar) != CitizenInstance.Flags.None) { carProb = 100; bikeProb = 0; taxiProb = 0; } else { carProb = GetCarProbability(__instance, citizenData.m_frame1.m_position); bikeProb = GetBikeProbability(__instance); taxiProb = GetTaxiProbability(__instance); } Randomizer randomizer = new Randomizer(citizenData.m_citizen); bool useCar = randomizer.Int32(100u) < carProb; bool useBike = !useCar && randomizer.Int32(100u) < bikeProb; bool useTaxi = !useCar && !useBike && randomizer.Int32(100u) < taxiProb; bool useCamper = false; bool useElectricCar = false; if (useCar) { int camperProb = GetCamperProbability(__instance, wealthLevel); useCamper = randomizer.Int32(100u) < camperProb; if (!useCamper) { int electricProb = GetElectricCarProbability(__instance, wealthLevel); useElectricCar = randomizer.Int32(100u) < electricProb; } } ItemClass.Service service = ItemClass.Service.Residential; ItemClass.SubService subService = useElectricCar ? ItemClass.SubService.ResidentialLowEco : ItemClass.SubService.ResidentialLow; if (useTaxi) { service = ItemClass.Service.PublicTransport; subService = ItemClass.SubService.PublicTransportTaxi; } // NON-STOCK CODE START VehicleInfo carInfo = null; if (Options.parkingAI && useCar && !useTaxi) { ushort parkedVehicleId = citizenData.m_citizen.ToCitizen().m_parkedVehicle; if (parkedVehicleId != 0) { Log._DebugIf( logParkingAi, () => $"CustomTouristAI.CustomGetVehicleInfo({instanceID}): " + $"Citizen instance {instanceID} owns a parked vehicle {parkedVehicleId}. " + $"Reusing vehicle info."); carInfo = parkedVehicleId.ToParkedVehicle().Info; } } if (carInfo == null && (useCar || useTaxi)) { // NON-STOCK CODE END if (useCamper) { Randomizer randomizer2 = randomizer; carInfo = VehicleManager.instance.GetRandomVehicleInfo( ref randomizer, service, subService, ItemClass.Level.Level2); if (carInfo == null || carInfo.m_vehicleAI is CarTrailerAI) { trailer = carInfo; randomizer = randomizer2; carInfo = VehicleManager.instance.GetRandomVehicleInfo( ref randomizer, service, subService, ItemClass.Level.Level1); } } else { carInfo = VehicleManager.instance.GetRandomVehicleInfo( ref randomizer, service, subService, ItemClass.Level.Level1); } } if (useBike) { VehicleInfo bikeInfo = VehicleManager.instance.GetRandomVehicleInfo( ref randomizer, ItemClass.Service.Residential, ItemClass.SubService.ResidentialHigh, ItemClass.Level.Level2); if (bikeInfo != null) { __result = bikeInfo; return(false); } } if ((useCar || useTaxi) && carInfo != null) { __result = carInfo; return(false); } __result = null; return(false); }
public static void FindEvacuationPlace(TouristAI thisAI, uint citizenID, ushort sourceBuilding, TransferManager.TransferReason reason) { Debug.LogWarning("FindEvacuationPlace is not overridden!"); }
private static bool Prefix(TouristAI __instance, uint citizenID, ref Citizen data) { RealTimeAI.UpdateLocation(__instance, citizenID, ref data); return false; }
public static TransferManager.TransferReason GetEvacuationReason(TouristAI thisAI, ushort sourceBuilding) { Debug.LogWarning("GetEvacuationReason is not overridden!"); return(TransferManager.TransferReason.None); }
private static bool ProcessMoving(ref TouristAI touristAI, uint citizenId, ref Citizen citizen) { CitizenActivityMonitor.LogActivity(citizenId, CitizenActivityMonitor.Activity.Moving); return(false); }
public static bool FindAShop(this TouristAI touristAI, uint citizenId, ref Citizen citizen) { var buildingId = citizen.GetBuilding(); return(touristAI.FindAShop(citizenId, ref citizen, buildingId)); }
private static bool ProcessVisiting(ref TouristAI touristAI, uint citizenId, ref Citizen citizen) { CitizenActivityMonitor.LogActivity(citizenId, CitizenActivityMonitor.Activity.Visiting); if (!citizen.ValidVisitBuilding()) { return(false); } var touristHotelSearchRadius = BuildingManager.BUILDINGGRID_CELL_SIZE * 4; var currentBuildingInstance = citizen.VisitBuildingInstance().Value; var simulationManager = SimulationManager.instance; if (citizen.Tired() || citizen.Tired(TimeSpan.FromHours(6))) { if (citizen.Tired() && citizen.InHotel()) { touristAI.GoToSleep(citizenId); return(true); } var foundHotel = touristAI.FindHotel(citizenId, ref citizen, currentBuildingInstance, touristHotelSearchRadius); if (foundHotel != 0 && simulationManager.m_randomizer.Int32(10) < 8) { var foundHotelInstance = BuildingManager.instance.m_buildings.m_buffer[foundHotel]; var estimatedTravelTime = TravelTime.EstimateTravelTime(currentBuildingInstance, foundHotelInstance); if (citizen.Tired(estimatedTravelTime)) { touristAI.TryVisit(citizenId, ref citizen, foundHotel); return(true); } } else if (citizen.Tired()) { touristAI.LeaveTheCity(citizenId, ref citizen); return(true); } } var goSomewhere = (simulationManager.m_randomizer.Int32(10) < 3 || citizen.InHotel()) && !citizen.AfraidOfGettingWet(); if (goSomewhere) { var keepItLocal = simulationManager.m_randomizer.Int32(10) < 8; if (keepItLocal) { var ventureDistance = (BuildingManager.BUILDINGGRID_CELL_SIZE * 2) + (simulationManager.m_randomizer.Int32(3) * BuildingManager.BUILDINGGRID_CELL_SIZE); var randomActivityNumber = simulationManager.m_randomizer.Int32(9); ushort closeActivity = 0; if (randomActivityNumber < 3 || simulationManager.m_currentGameTime.Hour >= 21) { closeActivity = touristAI.FindLeisure(citizenId, ref citizen, currentBuildingInstance, ventureDistance); } else if (randomActivityNumber < 6) { closeActivity = touristAI.FindPark(citizenId, ref citizen, currentBuildingInstance, ventureDistance); } else { closeActivity = touristAI.FindShop(citizenId, ref citizen, currentBuildingInstance, ventureDistance); } if (closeActivity != 0) { var closeActivityBuilding = BuildingManager.instance.m_buildings.m_buffer[closeActivity]; if (!citizen.Tired(TravelTime.EstimateTravelTime(currentBuildingInstance, closeActivityBuilding))) { touristAI.TryVisit(citizenId, ref citizen, closeActivity); } } } else { var goShopping = simulationManager.m_randomizer.Int32(10) < 5; var extendedVentureDistance = BuildingManager.BUILDINGGRID_CELL_SIZE * 6; if (goShopping) { touristAI.GoToAShop(citizenId, ref citizen, extendedVentureDistance); } else { touristAI.GoToAFunActivity(citizenId, ref citizen, citizen.GetBuilding(), extendedVentureDistance); } } } else if (citizen.GettingWet()) { CitizenActivityMonitor.LogActivity(citizenId, CitizenActivityMonitor.Activity.GettingWet); var hotel = touristAI.FindHotel(citizenId, ref citizen, currentBuildingInstance, touristHotelSearchRadius); if (hotel != 0) { touristAI.TryVisit(citizenId, ref citizen, hotel); } } return(true); }
public static void FindVisitPlace(TouristAI thisAI, uint citizenID, ushort sourceBuilding, TransferManager.TransferReason reason) { Debug.LogWarning("FindVisitPlace is not overridden!"); }