using System; using System.Collections.Generic; using Content.Shared.GameObjects.EntitySystems; using Robust.Server.GameObjects; using Robust.Shared.GameObjects; using Robust.Shared.IoC; using Robust.Shared.Localization; using Robust.Shared.Serialization; using Robust.Shared.Utility; using Robust.Shared.ViewVariables; namespace Content.Server.GameObjects.Components.Power.ApcNetComponents.PowerReceiverUsers { /// /// Component that represents an emergency light, it has an internal battery that charges when the power is on. /// [RegisterComponent] public class EmergencyLightComponent : Component, IExamine { public override string Name => "EmergencyLight"; [ViewVariables] private EmergencyLightState _lightState = EmergencyLightState.Charging; [ViewVariables] private BatteryComponent Battery => Owner.GetComponent(); [ViewVariables] private PointLightComponent Light => Owner.GetComponent(); [ViewVariables] private PowerReceiverComponent PowerReceiver => Owner.GetComponent(); private SpriteComponent Sprite => Owner.GetComponent(); [ViewVariables(VVAccess.ReadWrite)] private float _wattage; [ViewVariables(VVAccess.ReadWrite)] private float _chargingWattage; [ViewVariables(VVAccess.ReadWrite)] private float _chargingEfficiency; public override void ExposeData(ObjectSerializer serializer) { base.ExposeData(serializer); serializer.DataField(ref _wattage, "wattage", 5); serializer.DataField(ref _chargingWattage, "chargingWattage", 60); serializer.DataField(ref _chargingEfficiency, "chargingEfficiency", 0.85f); } /// /// For attaching UpdateState() to events. /// public void UpdateState(object sender, EventArgs e) { UpdateState(); } /// /// Updates the light's power drain, battery drain, sprite and actual light state. /// public void UpdateState() { if (PowerReceiver.Powered) { PowerReceiver.Load = (int) Math.Abs(_wattage); TurnOff(); _lightState = EmergencyLightState.Charging; } else { TurnOn(); _lightState = EmergencyLightState.On; } } public void OnUpdate(float frameTime) { if (_lightState == EmergencyLightState.Empty || _lightState == EmergencyLightState.Full) return; if(_lightState == EmergencyLightState.On) { if (!Battery.TryUseCharge(_wattage * frameTime)) { _lightState = EmergencyLightState.Empty; TurnOff(); } } else { Battery.CurrentCharge += _chargingWattage * frameTime * _chargingEfficiency; if (Battery.BatteryState == BatteryState.Full) { PowerReceiver.Load = 1; _lightState = EmergencyLightState.Full; } } } private void TurnOff() { Sprite.LayerSetState(0, "emergency_light_off"); Light.Enabled = false; } private void TurnOn() { Sprite.LayerSetState(0, "emergency_light_on"); Light.Enabled = true; } public override void Initialize() { base.Initialize(); Owner.GetComponent().OnPowerStateChanged += UpdateState; } public override void OnRemove() { Owner.GetComponent().OnPowerStateChanged -= UpdateState; base.OnRemove(); } void IExamine.Examine(FormattedMessage message, bool inDetailsRange) { message.AddMarkup(Loc.GetString($"The battery indicator displays: {BatteryStateText[_lightState]}.")); } public enum EmergencyLightState { Charging, Full, Empty, On } public Dictionary BatteryStateText = new Dictionary { { EmergencyLightState.Full, "[color=darkgreen]Full[/color]"}, { EmergencyLightState.Empty, "[color=darkred]Empty[/color]"}, { EmergencyLightState.Charging, "[color=darkorange]Charging[/color]"}, { EmergencyLightState.On, "[color=darkorange]Discharging[/color]"} }; } }