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