internal static void _DrawFieldEdges( this Room room ) { if( ( room.RegionCount >= 20 )|| ( room.TouchesMapEdge ) ) { return; } //Color color = room.isPrisonCell ? PrisonFieldColor : // room.IsSlaveWorkArea() ? SlaveFieldColor : // NonPrisonFieldColor; Color color = NonPrisonFieldColor; if( room.isPrisonCell ) { color = PrisonFieldColor; } else if( room.Role == Data.RoomRoleDefOf.SlaveWorkArea ) { color = SlaveFieldColor; } else { var markers = room.ContainedMarkers(); if( ( !markers.NullOrEmpty() )&& ( markers.Any( marker => marker.IsActive ) ) ) { color = CustomFieldColor; } } color.a = Pulser.PulseBrightness( 1f, 0.6f ); GenDraw.DrawFieldEdges( room.Cells.ToList(), color ); }
internal static bool IsSlaveWorkArea( this Room room ) { if( room.CellCount == 1 ) { var door = room.Cells.ElementAt( 0 ).GetRegion().portal; if( door != null ) { var comp = door.TryGetComp<CompRestrictedDoor>(); if( comp != null ) { return comp.AllowSlaves; } return false; } } if( room.ContainedMarkers().NullOrEmpty() ) { return false; } return room.ContainedMarkers().Any( marker => ( ( marker.IsActive )&& ( marker.AllowSlaves ) ) ); }
internal static void _RoomChanged( this Room room ) { ProfilerThreadCheck.BeginSample( "RoomChanged" ); room.CachedCellCountSet( -1 ); room.CachedOpenRoofCountSet( -1 ); if( Current.ProgramState == ProgramState.MapPlaying ) { ProfilerThreadCheck.BeginSample( "RoofGenerationRequest" ); AutoBuildRoofZoneSetter.TryGenerateRoofFor( room ); ProfilerThreadCheck.EndSample(); } room.isPrisonCell = false; var allContainedThings = room.AllContainedThings; if( !room.TouchesMapEdge ) { for( int index = 0; index < allContainedThings.Count; ++index ) { var bed = allContainedThings[ index ] as Building_Bed; if( ( bed != null )&& ( bed.ForPrisoners ) ) { room.isPrisonCell = true; break; } } } var markers = room.ContainedMarkers( allContainedThings ); if( !markers.NullOrEmpty() ) { foreach( var marker in markers ) { if( ( marker.IsActive )&& ( marker.AllowPrisoners )&& ( !room.TouchesMapEdge ) ) { room.isPrisonCell = true; break; } } } if( Current.ProgramState == ProgramState.MapPlaying ) { if( room.isPrisonCell ) { foreach( var bed in room.ContainedBeds ) { bed.ForPrisoners = true; } } } room.lastChangeTick = Find.TickManager.TicksGame; room.TempTracker.RoomChanged(); room.StatsAndRoleDirtySet( true ); room.Notify_BedTypeChanged(); FacilitiesUtility.NotifyFacilitiesAboutChangedLOSBlockers( room.Regions ); if( Current.ProgramState != ProgramState.Entry ) { foreach( var door in room.Portals() ) { // Inform doors that this room has changed var restrictedDoor = door as Building_RestrictedDoor; if( restrictedDoor != null ) { //restrictedDoor.QueueDoorStatusUpdate( true ); restrictedDoor.ClearCache( true ); } //door.BroadcastCompSignal( Data.Signal.InternalRecache ); } } ProfilerThreadCheck.EndSample(); }