diff --git a/Content.Server/Light/Components/EmergencyLightComponent.cs b/Content.Server/Light/Components/EmergencyLightComponent.cs index 20de7f1c03..b49a8c3868 100644 --- a/Content.Server/Light/Components/EmergencyLightComponent.cs +++ b/Content.Server/Light/Components/EmergencyLightComponent.cs @@ -14,7 +14,7 @@ public sealed partial class EmergencyLightComponent : SharedEmergencyLightCompon /// /// Is this emergency light forced on for some reason and cannot be disabled through normal means - /// (i.e. delta alert level?) + /// (i.e. blue alert or higher?) /// public bool ForciblyEnabled = false; diff --git a/Content.Server/Light/EntitySystems/EmergencyLightSystem.cs b/Content.Server/Light/EntitySystems/EmergencyLightSystem.cs index 3fa5237948..f2c4c7dcc5 100644 --- a/Content.Server/Light/EntitySystems/EmergencyLightSystem.cs +++ b/Content.Server/Light/EntitySystems/EmergencyLightSystem.cs @@ -31,9 +31,9 @@ public sealed class EmergencyLightSystem : SharedEmergencyLightSystem SubscribeLocalEvent(OnEmergencyPower); } - private void OnEmergencyPower(EntityUid uid, EmergencyLightComponent component, ref PowerChangedEvent args) + private void OnEmergencyPower(Entity entity, ref PowerChangedEvent args) { - var meta = MetaData(uid); + var meta = MetaData(entity.Owner); // TODO: PowerChangedEvent shouldn't be issued for paused ents but this is the world we live in. if (meta.EntityLifeStage >= EntityLifeStage.Terminating || @@ -42,7 +42,7 @@ public sealed class EmergencyLightSystem : SharedEmergencyLightSystem return; } - UpdateState(uid, component); + UpdateState(entity); } private void OnEmergencyExamine(EntityUid uid, EmergencyLightComponent component, ExaminedEvent args) @@ -111,13 +111,13 @@ public sealed class EmergencyLightSystem : SharedEmergencyLightSystem if (details.ForceEnableEmergencyLights && !light.ForciblyEnabled) { light.ForciblyEnabled = true; - TurnOn(uid, light); + TurnOn((uid, light)); } else if (!details.ForceEnableEmergencyLights && light.ForciblyEnabled) { // Previously forcibly enabled, and we went down an alert level. light.ForciblyEnabled = false; - UpdateState(uid, light); + UpdateState((uid, light)); } } } @@ -135,31 +135,31 @@ public sealed class EmergencyLightSystem : SharedEmergencyLightSystem var query = EntityQueryEnumerator(); while (query.MoveNext(out var uid, out _, out var emergencyLight, out var battery)) { - Update(uid, emergencyLight, battery, frameTime); + Update((uid, emergencyLight), battery, frameTime); } } - private void Update(EntityUid uid, EmergencyLightComponent component, BatteryComponent battery, float frameTime) + private void Update(Entity entity, BatteryComponent battery, float frameTime) { - if (component.State == EmergencyLightState.On) + if (entity.Comp.State == EmergencyLightState.On) { - if (!_battery.TryUseCharge(uid, component.Wattage * frameTime, battery)) + if (!_battery.TryUseCharge(entity.Owner, entity.Comp.Wattage * frameTime, battery)) { - SetState(uid, component, EmergencyLightState.Empty); - TurnOff(uid, component); + SetState(entity.Owner, entity.Comp, EmergencyLightState.Empty); + TurnOff(entity); } } else { - _battery.SetCharge(uid, battery.CurrentCharge + component.ChargingWattage * frameTime * component.ChargingEfficiency, battery); + _battery.SetCharge(entity.Owner, battery.CurrentCharge + entity.Comp.ChargingWattage * frameTime * entity.Comp.ChargingEfficiency, battery); if (battery.IsFullyCharged) { - if (TryComp(uid, out var receiver)) + if (TryComp(entity.Owner, out var receiver)) { receiver.Load = 1; } - SetState(uid, component, EmergencyLightState.Full); + SetState(entity.Owner, entity.Comp, EmergencyLightState.Full); } } } @@ -167,35 +167,73 @@ public sealed class EmergencyLightSystem : SharedEmergencyLightSystem /// /// Updates the light's power drain, battery drain, sprite and actual light state. /// - public void UpdateState(EntityUid uid, EmergencyLightComponent component) + public void UpdateState(Entity entity) { - if (!TryComp(uid, out var receiver)) + if (!TryComp(entity.Owner, out var receiver)) return; - if (receiver.Powered && !component.ForciblyEnabled) + if (!TryComp(_station.GetOwningStation(entity.Owner), out var alerts)) + return; + + if (alerts.AlertLevels == null || !alerts.AlertLevels.Levels.TryGetValue(alerts.CurrentLevel, out var details)) { - receiver.Load = (int) Math.Abs(component.Wattage); - TurnOff(uid, component); - SetState(uid, component, EmergencyLightState.Charging); + TurnOff(entity, Color.Red); // if no alert, default to off red state + return; } - else + + if (receiver.Powered && !entity.Comp.ForciblyEnabled) // Green alert { - TurnOn(uid, component); - SetState(uid, component, EmergencyLightState.On); + receiver.Load = (int) Math.Abs(entity.Comp.Wattage); + TurnOff(entity, details.Color); + SetState(entity.Owner, entity.Comp, EmergencyLightState.Charging); + } + else if (!receiver.Powered) // If internal battery runs out it will end in off red state + { + TurnOn(entity, Color.Red); + SetState(entity.Owner, entity.Comp, EmergencyLightState.On); + } + else // Powered and enabled + { + TurnOn(entity, details.Color); + SetState(entity.Owner, entity.Comp, EmergencyLightState.On); } } - private void TurnOff(EntityUid uid, EmergencyLightComponent component) + private void TurnOff(Entity entity) { - _pointLight.SetEnabled(uid, false); - _appearance.SetData(uid, EmergencyLightVisuals.On, false); - _ambient.SetAmbience(uid, false); + _pointLight.SetEnabled(entity.Owner, false); + _appearance.SetData(entity.Owner, EmergencyLightVisuals.On, false); + _ambient.SetAmbience(entity.Owner, false); } - private void TurnOn(EntityUid uid, EmergencyLightComponent component) + /// + /// Turn off emergency light and set color. + /// + private void TurnOff(Entity entity, Color color) { - _pointLight.SetEnabled(uid, true); - _appearance.SetData(uid, EmergencyLightVisuals.On, true); - _ambient.SetAmbience(uid, true); + _pointLight.SetEnabled(entity.Owner, false); + _pointLight.SetColor(entity.Owner, color); + _appearance.SetData(entity.Owner, EmergencyLightVisuals.Color, color); + _appearance.SetData(entity.Owner, EmergencyLightVisuals.On, false); + _ambient.SetAmbience(entity.Owner, false); + } + + private void TurnOn(Entity entity) + { + _pointLight.SetEnabled(entity.Owner, true); + _appearance.SetData(entity.Owner, EmergencyLightVisuals.On, true); + _ambient.SetAmbience(entity.Owner, true); + } + + /// + /// Turn on emergency light and set color. + /// + private void TurnOn(Entity entity, Color color) + { + _pointLight.SetEnabled(entity.Owner, true); + _pointLight.SetColor(entity.Owner, color); + _appearance.SetData(entity.Owner, EmergencyLightVisuals.Color, color); + _appearance.SetData(entity.Owner, EmergencyLightVisuals.On, true); + _ambient.SetAmbience(entity.Owner, true); } } diff --git a/Resources/Prototypes/AlertLevels/alert_levels.yml b/Resources/Prototypes/AlertLevels/alert_levels.yml index 2d01a29fef..fb6e316ed0 100644 --- a/Resources/Prototypes/AlertLevels/alert_levels.yml +++ b/Resources/Prototypes/AlertLevels/alert_levels.yml @@ -5,28 +5,35 @@ green: announcement: alert-level-green-announcement color: Green + emergencyLightColor: LawnGreen shuttleTime: 600 blue: announcement: alert-level-blue-announcement sound: /Audio/Misc/bluealert.ogg color: DodgerBlue + forceEnableEmergencyLights: true + emergencyLightColor: DodgerBlue shuttleTime: 600 violet: announcement: alert-level-violet-announcement sound: /Audio/Misc/notice1.ogg color: Violet emergencyLightColor: Violet + forceEnableEmergencyLights: true shuttleTime: 600 yellow: announcement: alert-level-yellow-announcement sound: /Audio/Misc/notice1.ogg color: Yellow emergencyLightColor: Goldenrod + forceEnableEmergencyLights: true shuttleTime: 600 red: announcement: alert-level-red-announcement sound: /Audio/Misc/redalert.ogg color: Red + emergencyLightColor: Red + forceEnableEmergencyLights: true shuttleTime: 600 #No reduction in time as we don't have swiping for red alert like in /tg/. Shuttle times are intended to create friction, so having a way to brainlessly bypass that would be dumb. gamma: announcement: alert-level-gamma-announcement diff --git a/Resources/Prototypes/Entities/Structures/Lighting/base_lighting.yml b/Resources/Prototypes/Entities/Structures/Lighting/base_lighting.yml index ef89088d1a..167b376214 100644 --- a/Resources/Prototypes/Entities/Structures/Lighting/base_lighting.yml +++ b/Resources/Prototypes/Entities/Structures/Lighting/base_lighting.yml @@ -360,7 +360,7 @@ radius: 5 energy: 0.6 offset: "0, 0.4" - color: "#FF4020" + color: "#7CFC00" mask: /Textures/Effects/LightMasks/double_cone.png - type: ApcPowerReceiver - type: ExtensionCableReceiver @@ -377,10 +377,10 @@ map: [ "enum.EmergencyLightVisualLayers.Base" ] - state: emergency_light_off map: [ "enum.EmergencyLightVisualLayers.LightOff" ] - color: "#FF4020" + color: "#7CFC00" - state: emergency_light_on map: [ "enum.EmergencyLightVisualLayers.LightOn" ] - color: "#FF4020" + color: "#7CFC00" shader: "unshaded" visible: false - type: Appearance