]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Emergency Lights now changes color depending on alert level and whether or not the...
authorsuperjj18 <gagnonjake@gmail.com>
Thu, 18 Apr 2024 10:50:08 +0000 (06:50 -0400)
committerGitHub <noreply@github.com>
Thu, 18 Apr 2024 10:50:08 +0000 (20:50 +1000)
* Emergency Lights now change color depending on alert level and whether or not they are powered.

* Made a condition for null alert level, added summary doc.

* Refactored uid and emergencylightcomponent into Entity<EmergencyLightComponent>

Content.Server/Light/Components/EmergencyLightComponent.cs
Content.Server/Light/EntitySystems/EmergencyLightSystem.cs
Resources/Prototypes/AlertLevels/alert_levels.yml
Resources/Prototypes/Entities/Structures/Lighting/base_lighting.yml

index 20de7f1c03bb42b2f9696b987fb541235a4b2318..b49a8c3868a065d15aaef2fa67ad601595741ccd 100644 (file)
@@ -14,7 +14,7 @@ public sealed partial class EmergencyLightComponent : SharedEmergencyLightCompon
 
     /// <summary>
     ///     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?)
     /// </summary>
     public bool ForciblyEnabled = false;
 
index 3fa5237948cd80b04679a0bc28b3713543437bf5..f2c4c7dcc59e6c1bf7200f15e649b012b92ae065 100644 (file)
@@ -31,9 +31,9 @@ public sealed class EmergencyLightSystem : SharedEmergencyLightSystem
         SubscribeLocalEvent<EmergencyLightComponent, PowerChangedEvent>(OnEmergencyPower);
     }
 
-    private void OnEmergencyPower(EntityUid uid, EmergencyLightComponent component, ref PowerChangedEvent args)
+    private void OnEmergencyPower(Entity<EmergencyLightComponent> 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<ActiveEmergencyLightComponent, EmergencyLightComponent, BatteryComponent>();
         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<EmergencyLightComponent> 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<ApcPowerReceiverComponent>(uid, out var receiver))
+                if (TryComp<ApcPowerReceiverComponent>(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
     /// <summary>
     ///     Updates the light's power drain, battery drain, sprite and actual light state.
     /// </summary>
-    public void UpdateState(EntityUid uid, EmergencyLightComponent component)
+    public void UpdateState(Entity<EmergencyLightComponent> entity)
     {
-        if (!TryComp<ApcPowerReceiverComponent>(uid, out var receiver))
+        if (!TryComp<ApcPowerReceiverComponent>(entity.Owner, out var receiver))
             return;
 
-        if (receiver.Powered && !component.ForciblyEnabled)
+        if (!TryComp<AlertLevelComponent>(_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<EmergencyLightComponent> 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)
+    /// <summary>
+    ///     Turn off emergency light and set color.
+    /// </summary>
+    private void TurnOff(Entity<EmergencyLightComponent> entity, Color color)
+    {
+        _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<EmergencyLightComponent> entity)
+    {
+        _pointLight.SetEnabled(entity.Owner, true);
+        _appearance.SetData(entity.Owner, EmergencyLightVisuals.On, true);
+        _ambient.SetAmbience(entity.Owner, true);
+    }
+
+    /// <summary>
+    ///     Turn on emergency light and set color.
+    /// </summary>
+    private void TurnOn(Entity<EmergencyLightComponent> entity, Color color)
     {
-        _pointLight.SetEnabled(uid, true);
-        _appearance.SetData(uid, EmergencyLightVisuals.On, true);
-        _ambient.SetAmbience(uid, true);
+        _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); 
     }
 }
index 2d01a29fef63f42239d3b7b2c95ddf9925ee3a55..fb6e316ed0271c4b1738d47048a3a208e22cfc3a 100644 (file)
@@ -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
index ef89088d1abf36672dd6dd4a10d5a85883b3b05e..167b3762141c3ac4c0fb0787c7eac8c70d473685 100644 (file)
     radius: 5
     energy: 0.6
     offset: "0, 0.4"
-    color: "#FF4020"
+    color: "#7CFC00"
     mask: /Textures/Effects/LightMasks/double_cone.png
   - type: ApcPowerReceiver
   - type: ExtensionCableReceiver
       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