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);
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
        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);
        }
Ejemplo n.º 6
0
        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);
        }
Ejemplo n.º 7
0
 public static TransferManager.TransferReason GetLeavingReason(TouristAI thisAI, uint citizenID, ref Citizen data)
 {
     Debug.LogWarning("GetLeavingReason is not overridden!");
     return(0);
 }
Ejemplo n.º 8
0
 public static TransferManager.TransferReason GetLeavingReason(TouristAI thisAI, uint citizenID, ref Citizen data)
 {
     Debug.LogWarning("GetLeavingReason is not overridden!");
     return 0;
 }
Ejemplo n.º 9
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());
        }
Ejemplo n.º 10
0
 private static TransferManager.TransferReason GetEntertainmentReason(TouristAI instance)
 {
     throw new InvalidOperationException(RedirectNeededMessage);
 }
Ejemplo n.º 11
0
 private static void FindVisitPlace(TouristAI instance, uint citizenId, ushort sourceBuilding, TransferManager.TransferReason reason)
 {
     throw new InvalidOperationException(RedirectNeededMessage);
 }
Ejemplo n.º 12
0
 private static void AddTouristVisit(TouristAI instance, uint citizenId, ushort buildingId)
 {
     throw new InvalidOperationException(RedirectNeededMessage);
 }
Ejemplo n.º 13
0
 private static int GetRandomTargetType(TouristAI instance, int doNothingProbability)
 {
     throw new InvalidOperationException(RedirectNeededMessage);
 }
Ejemplo n.º 14
0
 private static bool StartMoving(TouristAI instance, uint citizenId, ref Citizen citizen, ushort sourceBuilding, ushort targetBuilding)
 {
     throw new InvalidOperationException(RedirectNeededMessage);
 }
Ejemplo n.º 15
0
        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;
                }
            }
        }
Ejemplo n.º 16
0
        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;
                }
            }
        }
Ejemplo n.º 17
0
 public static bool AddTouristVisit(TouristAI thisAI, uint citizenID, ushort buildingID)
 {
     Debug.LogWarning("AddTouristVisit is not overridden!");
     return false;
 }
Ejemplo n.º 18
0
 public static TransferManager.TransferReason GetEntertainmentReason(TouristAI thisAI)
 {
     Debug.LogWarning("GetEntertainmentReason is not overridden!");
     return 0;
 }
Ejemplo n.º 19
0
 public static bool DoRandomMove(TouristAI thisAI)
 {
     Debug.LogWarning("DoRandomMove is not overridden!");
     return false;
 }
Ejemplo n.º 20
0
 private static void UpdateLocation(TouristAI instance, uint citizenId, ref Citizen citizen)
 {
     RealTimeAI?.UpdateLocation(instance, citizenId, ref citizen);
 }
Ejemplo n.º 21
0
 public static bool DoRandomMove(TouristAI thisAI)
 {
     Debug.LogWarning("DoRandomMove is not overridden!");
     return(false);
 }
Ejemplo n.º 22
0
 private static TransferManager.TransferReason GetLeavingReason(TouristAI instance, uint citizenId, ref Citizen citizen)
 {
     throw new InvalidOperationException(RedirectNeededMessage);
 }
Ejemplo n.º 23
0
 public static TransferManager.TransferReason GetEntertainmentReason(TouristAI thisAI)
 {
     Debug.LogWarning("GetEntertainmentReason is not overridden!");
     return(0);
 }
Ejemplo n.º 24
0
 private static TransferManager.TransferReason GetEvacuationReason(TouristAI instance, ushort sourceBuilding)
 {
     throw new InvalidOperationException(RedirectNeededMessage);
 }
Ejemplo n.º 25
0
 public static bool AddTouristVisit(TouristAI thisAI, uint citizenID, ushort buildingID)
 {
     Debug.LogWarning("AddTouristVisit is not overridden!");
     return(false);
 }
Ejemplo n.º 26
0
 private static bool DoRandomMove(TouristAI instance)
 {
     throw new InvalidOperationException(RedirectNeededMessage);
 }
Ejemplo n.º 27
0
 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);
        }
Ejemplo n.º 29
0
 public static void FindEvacuationPlace(TouristAI thisAI, uint citizenID, ushort sourceBuilding, TransferManager.TransferReason reason)
 {
     Debug.LogWarning("FindEvacuationPlace is not overridden!");
 }
Ejemplo n.º 30
0
 private static bool Prefix(TouristAI __instance, uint citizenID, ref Citizen data)
 {
     RealTimeAI.UpdateLocation(__instance, citizenID, ref data);
     return false;
 }
Ejemplo n.º 31
0
 public static TransferManager.TransferReason GetEvacuationReason(TouristAI thisAI, ushort sourceBuilding)
 {
     Debug.LogWarning("GetEvacuationReason is not overridden!");
     return(TransferManager.TransferReason.None);
 }
Ejemplo n.º 32
0
        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));
        }
Ejemplo n.º 34
0
        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);
        }
Ejemplo n.º 35
0
 public static void FindVisitPlace(TouristAI thisAI, uint citizenID, ushort sourceBuilding, TransferManager.TransferReason reason)
 {
     Debug.LogWarning("FindVisitPlace is not overridden!");
 }