예제 #1
0
        private void UpdateLightState(ushort step, bool updateBuilding)
        {
            ushort first = (ushort)(step * BuildingStepSize);
            ushort last  = (ushort)(((step + 1) * BuildingStepSize) - 1);

            for (ushort i = first; i <= last; ++i)
            {
                buildingManager.GetBuildingService(i, out ItemClass.Service service, out ItemClass.SubService subService);
                bool lightsOn = !ShouldSwitchBuildingLightsOff(i, service, subService);
                if (lightsOn == lightStates[i])
                {
                    continue;
                }

                lightStates[i] = lightsOn;
                if (updateBuilding)
                {
                    buildingManager.UpdateBuildingColors(i);
                    if (!lightsOn)
                    {
                        buildingManager.DeactivateVisually(i);
                    }
                }
            }
        }
예제 #2
0
        /// <summary>Updates the citizen's work shift parameters in the specified citizen's <paramref name="schedule"/>.</summary>
        /// <param name="schedule">The citizen's schedule to update the work shift in.</param>
        /// <param name="citizenAge">The age of the citizen.</param>
        public void UpdateWorkShift(ref CitizenSchedule schedule, Citizen.AgeGroup citizenAge)
        {
            if (schedule.WorkBuilding == 0 || citizenAge == Citizen.AgeGroup.Senior)
            {
                schedule.UpdateWorkShift(WorkShift.Unemployed, 0, 0, false);
                return;
            }

            ItemClass.Service    buildingSevice     = buildingManager.GetBuildingService(schedule.WorkBuilding);
            ItemClass.SubService buildingSubService = buildingManager.GetBuildingSubService(schedule.WorkBuilding);

            float     workBegin, workEnd;
            WorkShift workShift = schedule.WorkShift;

            switch (citizenAge)
            {
            case Citizen.AgeGroup.Child:
            case Citizen.AgeGroup.Teen:
                workShift = WorkShift.First;
                workBegin = config.SchoolBegin;
                workEnd   = config.SchoolEnd;
                break;

            case Citizen.AgeGroup.Young:
            case Citizen.AgeGroup.Adult:
                if (workShift == WorkShift.Unemployed)
                {
                    workShift = GetWorkShift(GetBuildingWorkShiftCount(buildingSevice, buildingSubService));
                }

                workBegin = config.WorkBegin;
                workEnd   = config.WorkEnd;
                break;

            default:
                return;
            }

            switch (workShift)
            {
            case WorkShift.First when HasExtendedFirstWorkShift(buildingSevice, buildingSubService):
                workBegin = Math.Min(config.WakeupHour, EarliestWakeUp);

                break;

            case WorkShift.Second:
                workBegin = workEnd;
                workEnd   = 0;
                break;

            case WorkShift.Night:
                workEnd   = workBegin;
                workBegin = 0;
                break;
            }

            schedule.UpdateWorkShift(workShift, workBegin, workEnd, IsBuildingActiveOnWeekend(buildingSevice, buildingSubService));
        }
예제 #3
0
        /// <summary>
        /// Determines whether the building with the specified ID is an entertainment target.
        /// </summary>
        /// <param name="buildingId">The building ID to check.</param>
        /// <returns>
        ///   <c>true</c> if the building is an entertainment target; otherwise, <c>false</c>.
        /// </returns>
        public bool IsEntertainmentTarget(ushort buildingId)
        {
            if (buildingId == 0)
            {
                return(true);
            }

            // A building still can post outgoing offers while inactive.
            // This is to prevent those offers from being dispatched.
            if (!buildingManager.BuildingHasFlags(buildingId, Building.Flags.Active))
            {
                return(false);
            }

            var buildingService = buildingManager.GetBuildingService(buildingId);

            if (buildingService == ItemClass.Service.VarsitySports)
            {
                // Do not visit varsity sport arenas for entertainment when no active events
                return(false);
            }

            string className = buildingManager.GetBuildingClassName(buildingId);

            if (string.IsNullOrEmpty(className))
            {
                return(true);
            }

            for (int i = 0; i < BannedEntertainmentBuildings.Length; ++i)
            {
                if (className.IndexOf(BannedEntertainmentBuildings[i], 0, StringComparison.OrdinalIgnoreCase) >= 0)
                {
                    return(false);
                }
            }

            return(true);
        }