public static bool Prefix(ref int __result, ushort instanceID, ref CitizenInstance citizenData, Citizen.AgeGroup ageGroup)
        {
            // Original method return value.
            // Array cache has already been set when GetCarProbability was called.
            __result = AIUtils.cacheArray[DataStore.TAXI];

            if (Logging.UseTransportLog)
            {
                Logging.WriteToLog(Logging.TransportLogName, "The same ", ageGroup.ToString(), " has ", __result.ToString(), "% chance of using a taxi");
            }

            // Don't execute base method after this.
            return(false);
        }
예제 #2
0
        public override bool CitizenCanGo(uint citizenID, ref Citizen person)
        {
            bool canGo = false;

            if (m_eventChances != null && m_eventData.m_registeredCitizens < GetCapacity())
            {
                canGo = true;

                Citizen.Wealth    _citizenWealth    = person.WealthLevel;
                Citizen.Education _citizenEducation = person.EducationLevel;
                Citizen.Gender    _citizenGender    = Citizen.GetGender(citizenID);
                Citizen.Happiness _citizenHappiness = Citizen.GetHappinessLevel(Citizen.GetHappiness(person.m_health, person.m_wellbeing));
                Citizen.Wellbeing _citizenWellbeing = Citizen.GetWellbeingLevel(_citizenEducation, person.m_wellbeing);
                Citizen.AgeGroup  _citizenAgeGroup  = Citizen.GetAgeGroup(person.Age);

                float percentageChange = GetAdjustedChancePercentage();
                int   randomPercentage = Singleton <SimulationManager> .instance.m_randomizer.Int32(100U);

                switch (_citizenWealth)
                {
                case Citizen.Wealth.Low:
                    canGo = canGo && randomPercentage < Adjust(m_eventChances._lowWealth, percentageChange);
                    break;

                case Citizen.Wealth.Medium:
                    canGo = canGo && randomPercentage < Adjust(m_eventChances._mediumWealth, percentageChange);
                    break;

                case Citizen.Wealth.High:
                    canGo = canGo && randomPercentage < Adjust(m_eventChances._highWealth, percentageChange);
                    break;
                }

                randomPercentage = Singleton <SimulationManager> .instance.m_randomizer.Int32(100U);

                switch (_citizenEducation)
                {
                case Citizen.Education.Uneducated:
                    canGo = canGo && randomPercentage < Adjust(m_eventChances._uneducated, percentageChange);
                    break;

                case Citizen.Education.OneSchool:
                    canGo = canGo && randomPercentage < Adjust(m_eventChances._oneSchool, percentageChange);
                    break;

                case Citizen.Education.TwoSchools:
                    canGo = canGo && randomPercentage < Adjust(m_eventChances._twoSchools, percentageChange);
                    break;

                case Citizen.Education.ThreeSchools:
                    canGo = canGo && randomPercentage < Adjust(m_eventChances._threeSchools, percentageChange);
                    break;
                }

                randomPercentage = Singleton <SimulationManager> .instance.m_randomizer.Int32(100U);

                switch (_citizenGender)
                {
                case Citizen.Gender.Female:
                    canGo = canGo && randomPercentage < Adjust(m_eventChances._females, percentageChange);
                    break;

                case Citizen.Gender.Male:
                    canGo = canGo && randomPercentage < Adjust(m_eventChances._males, percentageChange);
                    break;
                }

                randomPercentage = Singleton <SimulationManager> .instance.m_randomizer.Int32(100U);

                switch (_citizenHappiness)
                {
                case Citizen.Happiness.Bad:
                    canGo = canGo && randomPercentage < Adjust(m_eventChances._badHappiness, percentageChange);
                    break;

                case Citizen.Happiness.Poor:
                    canGo = canGo && randomPercentage < Adjust(m_eventChances._poorHappiness, percentageChange);
                    break;

                case Citizen.Happiness.Good:
                    canGo = canGo && randomPercentage < Adjust(m_eventChances._goodHappiness, percentageChange);
                    break;

                case Citizen.Happiness.Excellent:
                    canGo = canGo && randomPercentage < Adjust(m_eventChances._excellentHappiness, percentageChange);
                    break;

                case Citizen.Happiness.Suberb:
                    canGo = canGo && randomPercentage < Adjust(m_eventChances._superbHappiness, percentageChange);
                    break;
                }

                randomPercentage = Singleton <SimulationManager> .instance.m_randomizer.Int32(100U);

                switch (_citizenWellbeing)
                {
                case Citizen.Wellbeing.VeryUnhappy:
                    canGo = canGo && randomPercentage < Adjust(m_eventChances._veryUnhappyWellbeing, percentageChange);
                    break;

                case Citizen.Wellbeing.Unhappy:
                    canGo = canGo && randomPercentage < Adjust(m_eventChances._unhappyWellbeing, percentageChange);
                    break;

                case Citizen.Wellbeing.Satisfied:
                    canGo = canGo && randomPercentage < Adjust(m_eventChances._satisfiedWellbeing, percentageChange);
                    break;

                case Citizen.Wellbeing.Happy:
                    canGo = canGo && randomPercentage < Adjust(m_eventChances._happyWellbeing, percentageChange);
                    break;

                case Citizen.Wellbeing.VeryHappy:
                    canGo = canGo && randomPercentage < Adjust(m_eventChances._veryHappyWellbeing, percentageChange);
                    break;
                }

                randomPercentage = Singleton <SimulationManager> .instance.m_randomizer.Int32(100U);

                switch (_citizenAgeGroup)
                {
                case Citizen.AgeGroup.Child:
                    canGo = canGo && randomPercentage < Adjust(m_eventChances._children, percentageChange);
                    break;

                case Citizen.AgeGroup.Teen:
                    canGo = canGo && randomPercentage < Adjust(m_eventChances._teens, percentageChange);
                    break;

                case Citizen.AgeGroup.Young:
                    canGo = canGo && randomPercentage < Adjust(m_eventChances._youngAdults, percentageChange);
                    break;

                case Citizen.AgeGroup.Adult:
                    canGo = canGo && randomPercentage < Adjust(m_eventChances._adults, percentageChange);
                    break;

                case Citizen.AgeGroup.Senior:
                    canGo = canGo && randomPercentage < Adjust(m_eventChances._seniors, percentageChange);
                    break;
                }

                CimTools.CimToolsHandler.CimToolBase.DetailedLogger.Log(
                    (canGo ? "[Can Go]" : "[Ignoring]") +
                    " Citizen " + citizenID + " for " + m_eventData.m_eventName + "\n\t" +
                    _citizenWealth.ToString() + ", " + _citizenEducation.ToString() + ", " + _citizenGender.ToString() + ", " +
                    _citizenHappiness.ToString() + ", " + _citizenWellbeing.ToString() + ", " + _citizenAgeGroup.ToString());
            }

            return(canGo);
        }
        public static bool Prefix(ref int __result, ushort instanceID, ref CitizenInstance citizenData, Citizen.AgeGroup ageGroup)
        {
            // Cache as best we can. The order of calls is car, bike, taxi
            AIUtils.citizenCache = citizenData.m_citizen;  // Not needed, but just in case

            Citizen citizen      = Singleton <CitizenManager> .instance.m_citizens.m_buffer[(int)((UIntPtr)citizenData.m_citizen)];
            ushort  homeBuilding = citizen.m_homeBuilding;

            ItemClass.SubService subService = ItemClass.SubService.ResidentialLow;
            if (homeBuilding != 0)
            {
                DistrictManager instance = Singleton <DistrictManager> .instance;
                Building        building = Singleton <BuildingManager> .instance.m_buildings.m_buffer[(int)homeBuilding];
                District        district = instance.m_districts.m_buffer[instance.GetDistrict(building.m_position)];
                DistrictPolicies.CityPlanning cityPlanningPolicies = district.m_cityPlanningPolicies;

                AIUtils.livesInBike = (cityPlanningPolicies & DistrictPolicies.CityPlanning.EncourageBiking) != DistrictPolicies.CityPlanning.None;
                subService          = Singleton <BuildingManager> .instance.m_buildings.m_buffer[homeBuilding].Info.GetSubService();
            }

            // Set the cache
            AIUtils.cacheArray = AIUtils.GetArray(citizen.WealthLevel, subService, ageGroup);

            // Original method return value.
            __result = AIUtils.cacheArray[DataStore.CAR];

            if (Logging.UseTransportLog)
            {
                Logging.WriteToLog(Logging.TransportLogName, citizen.WealthLevel.ToString(), "-wealth ", ageGroup.ToString(), " has ", __result + "% chance of driving");
            }

            // Don't execute base method after this.
            return(false);
        }