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); } } } }
/// <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)); }
/// <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); }