<!-- Mode buttons -->
<BoxContainer Orientation="Horizontal">
<Label Text="{Loc 'air-alarm-ui-window-mode-label'}" Margin="0 0 2 0" />
- <OptionButton Name="CModeButton" HorizontalExpand="True" />
+ <Control HorizontalExpand="True">
+ <OptionButton Name="CModeButton" />
+ <ui:StripeBack Name="CModeSelectLocked">
+ <RichTextLabel Text="{Loc 'air-alarm-ui-window-mode-select-locked-label'}"
+ HorizontalAlignment="Center" />
+ </ui:StripeBack>
+ </Control>
<CheckBox Name="AutoModeCheckBox" Text="{Loc 'air-alarm-ui-window-auto-mode-label'}" />
</BoxContainer>
</BoxContainer>
{
UpdateDeviceData(addr, dev);
}
+ _modes.Visible = !state.PanicWireCut;
+ CModeSelectLocked.Visible = state.PanicWireCut;
}
public void UpdateModeSelector(AirAlarmMode mode)
_data.PumpDirection = (ScrubberPumpDirection) args.Id;
ScrubberDataChanged?.Invoke(_address, _data);
};
+ _pumpDirection.Disabled = data.AirAlarmPanicWireCut;
_copySettings.OnPressed += _ =>
{
_data.PumpDirection = data.PumpDirection;
_pumpDirection.Select((int) _data.PumpDirection);
+ _pumpDirection.Disabled = data.AirAlarmPanicWireCut;
_data.VolumeRate = data.VolumeRate;
_volumeRate.Value = _data.VolumeRate;
/// </summary>
[DataField("normalPort", customTypeSerializer: typeof(PrototypeIdSerializer<SourcePortPrototype>))]
public string NormalPort = "AirNormal";
+
+ /// <summary>
+ /// Whether the panic wire is cut, forcing the alarm into panic mode.
+ /// </summary>
+ [DataField, ViewVariables]
+ public bool PanicWireCut;
}
/// <param name="uiOnly">Whether this change is for the UI only, or if it changes the air alarm's operating mode. Defaults to true.</param>
public void SetMode(EntityUid uid, string origin, AirAlarmMode mode, bool uiOnly = true, AirAlarmComponent? controller = null)
{
- if (!Resolve(uid, ref controller) || controller.CurrentMode == mode)
+ if (!Resolve(uid, ref controller))
{
return;
}
+ if (controller.PanicWireCut)
+ {
+ mode = AirAlarmMode.Panic;
+ }
+
+
controller.CurrentMode = mode;
// setting it to UI only means we don't have
}
foreach (var (addr, data) in alarm.ScrubberData)
{
+ data.AirAlarmPanicWireCut = alarm.PanicWireCut;
dataToSend.Add((addr, data));
}
foreach (var (addr, data) in alarm.SensorData)
_ui.SetUiState(
uid,
SharedAirAlarmInterfaceKey.Key,
- new AirAlarmUIState(devNet.Address, deviceCount, pressure, temperature, dataToSend, alarm.CurrentMode, highestAlarm.Value, alarm.AutoMode));
+ new AirAlarmUIState(devNet.Address, deviceCount, pressure, temperature, dataToSend, alarm.CurrentMode, highestAlarm.Value, alarm.AutoMode, alarm.PanicWireCut));
}
private const float Delay = 8f;
public override bool Cut(EntityUid user, Wire wire, AirAlarmComponent comp)
{
+ comp.PanicWireCut = true;
if (EntityManager.TryGetComponent<DeviceNetworkComponent>(wire.Owner, out var devNet))
{
_airAlarmSystem.SetMode(wire.Owner, devNet.Address, AirAlarmMode.Panic, false);
public override bool Mend(EntityUid user, Wire wire, AirAlarmComponent alarm)
{
+ alarm.PanicWireCut = false;
if (EntityManager.TryGetComponent<DeviceNetworkComponent>(wire.Owner, out var devNet)
&& alarm.CurrentMode == AirAlarmMode.Panic)
{
[Serializable, NetSerializable]
public sealed class AirAlarmUIState : BoundUserInterfaceState
{
- public AirAlarmUIState(string address, int deviceCount, float pressureAverage, float temperatureAverage, List<(string, IAtmosDeviceData)> deviceData, AirAlarmMode mode, AtmosAlarmType alarmType, bool autoMode)
+ public AirAlarmUIState(string address, int deviceCount, float pressureAverage, float temperatureAverage, List<(string, IAtmosDeviceData)> deviceData, AirAlarmMode mode, AtmosAlarmType alarmType, bool autoMode, bool panicWireCut)
{
Address = address;
DeviceCount = deviceCount;
Mode = mode;
AlarmType = alarmType;
AutoMode = autoMode;
+ PanicWireCut = panicWireCut;
}
public string Address { get; }
public AirAlarmMode Mode { get; }
public AtmosAlarmType AlarmType { get; }
public bool AutoMode { get; }
+ public bool PanicWireCut { get; }
}
[Serializable, NetSerializable]
public ScrubberPumpDirection PumpDirection { get; set; } = ScrubberPumpDirection.Scrubbing;
public float VolumeRate { get; set; } = 200f;
public bool WideNet { get; set; } = false;
+ public bool AirAlarmPanicWireCut { get; set; }
public static HashSet<Gas> DefaultFilterGases = new()
{
air-alarm-ui-window-resync-devices-label = Resync
air-alarm-ui-window-mode-label = Mode
+air-alarm-ui-window-mode-select-locked-label = [bold][color=red] Mode selector failure! [/color][/bold]
air-alarm-ui-window-auto-mode-label = Auto mode
-air-alarm-state-name = { $state ->