Revert "Добавлены mux/demux" (#3512)

This commit is contained in:
ThereDrD 2025-12-25 20:44:51 +03:00 committed by GitHub
parent f1eb4ac903
commit 0d1bc48d24
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
15 changed files with 1 additions and 531 deletions

View file

@ -1,72 +0,0 @@
using Content.Shared.DeviceLinking;
using Robust.Shared.Prototypes;
using Robust.Shared.Audio;
using Content.Shared.Tools;
using Content.Shared._Sunrise.AdvancedDevices;
namespace Content.Server._Sunrise.AdvancedDevices;
[RegisterComponent, Access(typeof(MultiplexerSystem))]
public sealed partial class MultiplexerComponent : Component
{
[DataField]
public MuxState State = MuxState.Mux;
[DataField]
public SoundSpecifier CycleSound = new SoundPathSpecifier("/Audio/Machines/lightswitch.ogg");
[DataField]
public ProtoId<ToolQualityPrototype> CycleQuality = "Screwing";
[DataField]
public ProtoId<SinkPortPrototype> InputPortA = "MuxInputA";
[DataField]
public ProtoId<SinkPortPrototype> InputPortB = "MuxInputB";
[DataField]
public ProtoId<SinkPortPrototype> InputPortC = "MuxInputC";
[DataField]
public ProtoId<SinkPortPrototype> InputPortD = "MuxInputD";
[DataField]
public ProtoId<SourcePortPrototype> OutputPortA = "MuxOutputA";
[DataField]
public ProtoId<SourcePortPrototype> OutputPortB = "MuxOutputB";
[DataField]
public ProtoId<SourcePortPrototype> OutputPortC = "MuxOutputC";
[DataField]
public ProtoId<SourcePortPrototype> OutputPortD = "MuxOutputD";
[DataField]
public ProtoId<SinkPortPrototype> SelectPortA = "MuxSelectA";
[DataField]
public ProtoId<SinkPortPrototype> SelectPortB = "MuxSelectB";
[DataField]
public ProtoId<SourcePortPrototype> OutputMuxPort = "MuxOutput";
[DataField]
public ProtoId<SinkPortPrototype> InputDemuxPort = "DemuxInput";
[DataField]
public SignalState StateA = SignalState.Low;
[DataField]
public SignalState StateB = SignalState.Low;
[DataField]
public SignalState StateC = SignalState.Low;
[DataField]
public SignalState StateD = SignalState.Low;
[DataField]
public SignalState SelectA = SignalState.Low;
[DataField]
public SignalState SelectB = SignalState.Low;
[DataField]
public SignalState DemuxInputState = SignalState.Low;
[DataField]
public bool LastMuxOutput;
[DataField]
public bool LastDemuxOutputA;
[DataField]
public bool LastDemuxOutputB;
[DataField]
public bool LastDemuxOutputC;
[DataField]
public bool LastDemuxOutputD;
}

View file

@ -1,196 +0,0 @@
using Content.Server.DeviceLinking.Systems;
using Content.Shared.DeviceLinking;
using Content.Shared.DeviceLinking.Events;
using Content.Shared.DeviceNetwork;
using Content.Shared.Examine;
using Content.Shared.Interaction;
using Content.Shared.Tools.Systems;
using Content.Shared.Popups;
using Robust.Shared.Audio.Systems;
using Content.Shared.Timing;
using Content.Shared._Sunrise.AdvancedDevices;
namespace Content.Server._Sunrise.AdvancedDevices;
public sealed class MultiplexerSystem : EntitySystem
{
[Dependency] private readonly DeviceLinkSystem _deviceLink = default!;
[Dependency] private readonly SharedToolSystem _tool = default!;
[Dependency] private readonly SharedAudioSystem _audio = default!;
[Dependency] private readonly SharedPopupSystem _popup = default!;
[Dependency] private readonly SharedAppearanceSystem _appearance = default!;
[Dependency] private readonly UseDelaySystem _useDelay = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<MultiplexerComponent, ComponentInit>(OnInit);
SubscribeLocalEvent<MultiplexerComponent, SignalReceivedEvent>(OnSignalReceived);
SubscribeLocalEvent<MultiplexerComponent, InteractUsingEvent>(OnInteractUsing);
SubscribeLocalEvent<MultiplexerComponent, ExaminedEvent>(OnExamined);
}
public override void Update(float frameTime)
{
var query = EntityQueryEnumerator<MultiplexerComponent>();
while (query.MoveNext(out var uid, out var component))
{
component.StateA = component.StateA == SignalState.Momentary ? SignalState.Low : component.StateA;
component.StateB = component.StateB == SignalState.Momentary ? SignalState.Low : component.StateB;
component.StateC = component.StateC == SignalState.Momentary ? SignalState.Low : component.StateC;
component.StateD = component.StateD == SignalState.Momentary ? SignalState.Low : component.StateD;
component.SelectA = component.SelectA == SignalState.Momentary ? SignalState.Low : component.SelectA;
component.SelectB = component.SelectB == SignalState.Momentary ? SignalState.Low : component.SelectB;
component.DemuxInputState = component.DemuxInputState == SignalState.Momentary ? SignalState.Low : component.DemuxInputState;
UpdateOutputs(uid, component);
}
}
private void OnInit(EntityUid uid, MultiplexerComponent comp, ComponentInit args)
{
SwitchPorts(uid, comp);
}
private void SwitchPorts(EntityUid uid, MultiplexerComponent comp)
{
RemComp<DeviceLinkSinkComponent>(uid);
RemComp<DeviceLinkSourceComponent>(uid);
if (comp.State == MuxState.Mux)
{
_deviceLink.EnsureSinkPorts(uid, comp.InputPortA, comp.InputPortB, comp.InputPortC, comp.InputPortD, comp.SelectPortA, comp.SelectPortB);
_deviceLink.EnsureSourcePorts(uid, comp.OutputMuxPort);
}
else
{
_deviceLink.EnsureSinkPorts(uid, comp.InputDemuxPort, comp.SelectPortA, comp.SelectPortB);
_deviceLink.EnsureSourcePorts(uid, comp.OutputPortA, comp.OutputPortB, comp.OutputPortC, comp.OutputPortD);
}
}
private void OnExamined(EntityUid uid, MultiplexerComponent comp, ExaminedEvent args)
{
if (!args.IsInDetailsRange)
return;
var stateText = comp.State == MuxState.Mux ? "multiplexer" : "demultiplexer";
args.PushMarkup(Loc.GetString("multiplexer-state", ("state", stateText)));
}
private void OnInteractUsing(EntityUid uid, MultiplexerComponent comp, InteractUsingEvent args)
{
if (args.Handled || !_tool.HasQuality(args.Used, comp.CycleQuality))
return;
if (TryComp<UseDelayComponent>(uid, out var useDelay)
&& !_useDelay.TryResetDelay((uid, useDelay), true))
return;
comp.State = comp.State == MuxState.Mux ? MuxState.Demux : MuxState.Mux;
SwitchPorts(uid, comp);
UpdateOutputs(uid, comp);
_audio.PlayPvs(comp.CycleSound, uid);
var msg = Loc.GetString("multiplexer-mode-switch", ("mode", comp.State == MuxState.Mux ? "MUX" : "DEMUX"));
_popup.PopupEntity(msg, uid, args.User);
_appearance.SetData(uid, MultiplexerVisuals.Gate, comp.State);
args.Handled = true;
}
private void OnSignalReceived(EntityUid uid, MultiplexerComponent comp, ref SignalReceivedEvent args)
{
var state = SignalState.Momentary;
args.Data?.TryGetValue(DeviceNetworkConstants.LogicState, out state);
switch (args.Port)
{
case var _ when args.Port == comp.InputPortA: comp.StateA = state; break;
case var _ when args.Port == comp.InputPortB: comp.StateB = state; break;
case var _ when args.Port == comp.InputPortC: comp.StateC = state; break;
case var _ when args.Port == comp.InputPortD: comp.StateD = state; break;
case var _ when args.Port == comp.SelectPortA: comp.SelectA = state; break;
case var _ when args.Port == comp.SelectPortB: comp.SelectB = state; break;
case var _ when args.Port == comp.InputDemuxPort: comp.DemuxInputState = state; break;
}
UpdateOutputs(uid, comp);
}
private void UpdateOutputs(EntityUid uid, MultiplexerComponent comp)
{
if (comp.State == MuxState.Mux)
{
UpdateMuxOutput(uid, comp);
}
else
{
UpdateDemuxOutputs(uid, comp);
}
}
private void UpdateMuxOutput(EntityUid uid, MultiplexerComponent comp)
{
var a = comp.StateA != SignalState.Low;
var b = comp.StateB != SignalState.Low;
var c = comp.StateC != SignalState.Low;
var d = comp.StateD != SignalState.Low;
var selA = comp.SelectA != SignalState.Low;
var selB = comp.SelectB != SignalState.Low;
var output = selB ? (selA ? d : c) : (selA ? b : a);
if (output != comp.LastMuxOutput)
{
comp.LastMuxOutput = output;
_deviceLink.SendSignal(uid, comp.OutputMuxPort, output);
}
}
private void UpdateDemuxOutputs(EntityUid uid, MultiplexerComponent comp)
{
var input = comp.DemuxInputState != SignalState.Low;
var selA = comp.SelectA != SignalState.Low;
var selB = comp.SelectB != SignalState.Low;
var outputA = false;
var outputB = false;
var outputC = false;
var outputD = false;
if (input)
{
if (!selB && !selA) outputA = true;
else if (!selB && selA) outputB = true;
else if (selB && !selA) outputC = true;
else if (selB && selA) outputD = true;
}
if (outputA != comp.LastDemuxOutputA)
{
comp.LastDemuxOutputA = outputA;
_deviceLink.SendSignal(uid, comp.OutputPortA, outputA);
}
if (outputB != comp.LastDemuxOutputB)
{
comp.LastDemuxOutputB = outputB;
_deviceLink.SendSignal(uid, comp.OutputPortB, outputB);
}
if (outputC != comp.LastDemuxOutputC)
{
comp.LastDemuxOutputC = outputC;
_deviceLink.SendSignal(uid, comp.OutputPortC, outputC);
}
if (outputD != comp.LastDemuxOutputD)
{
comp.LastDemuxOutputD = outputD;
_deviceLink.SendSignal(uid, comp.OutputPortD, outputD);
}
}
}

View file

@ -1,22 +0,0 @@
using Robust.Shared.Serialization;
namespace Content.Shared._Sunrise.AdvancedDevices;
[Serializable, NetSerializable]
public enum MultiplexerVisuals : byte
{
Gate
}
[Serializable, NetSerializable]
public enum MultiplexerLayers : byte
{
Gate
}
[Serializable, NetSerializable]
public enum MuxState : byte
{
Demux,
Mux
}

View file

@ -1,3 +0,0 @@
ent-Multiplexer = multiplexer
.desc = A high-level logic element for routing signals. You can change the executable function using a screwdriver.
.suffix = Mux

View file

@ -1,39 +0,0 @@
multiplexer-state = Currently set to: { $state }
multiplexer-mode-switch = Mode switched to: { $mode }
# Port names and descriptions
signal-port-name-multiplexer-input-a = Input A
signal-port-description-multiplexer-input-a = First multiplexer input signal
signal-port-name-multiplexer-input-b = Input B
signal-port-description-multiplexer-input-b = Second multiplexer input signal
signal-port-name-multiplexer-input-c = Input C
signal-port-description-multiplexer-input-c = Third multiplexer input signal
signal-port-name-multiplexer-input-d = Input D
signal-port-description-multiplexer-input-d = Fourth multiplexer input signal
signal-port-name-demultiplexer-input = Input
signal-port-description-demultiplexer-input = Demultiplexer input signal
signal-port-name-multiplexer-select-a = Select A
signal-port-description-multiplexer-select-a = Channel selection least significant bit
signal-port-name-multiplexer-select-b = Select B
signal-port-description-multiplexer-select-b = Channel selection most significant bit
signal-port-name-multiplexer-output = Output
signal-port-description-multiplexer-output = Multiplexer output signal
signal-port-name-demultiplexer-output-a = Output A
signal-port-description-demultiplexer-output-a = First demultiplexer output signal
signal-port-name-demultiplexer-output-b = Output B
signal-port-description-demultiplexer-output-b = Second demultiplexer output signal
signal-port-name-demultiplexer-output-c = Output C
signal-port-description-demultiplexer-output-c = Third demultiplexer output signal
signal-port-name-demultiplexer-output-d = Output D
signal-port-description-demultiplexer-output-d = Fourth demultiplexer output signal

View file

@ -1,3 +0,0 @@
ent-Multiplexer = мультиплексор
.desc = Высокоуровневый логический элемент для маршрутизации сигналов. Можно изменить исполняемую функцию с помощью отвертки.
.suffix = Mux

View file

@ -1,39 +0,0 @@
multiplexer-state = Сейчас установлен режим: { $state }.
multiplexer-mode-switch = Режим переключен на: { $mode }
# Порт names and descriptions
signal-port-name-multiplexer-input-a = Вход A
signal-port-description-multiplexer-input-a = Первый входной сигнал мультиплексора
signal-port-name-multiplexer-input-b = Вход B
signal-port-description-multiplexer-input-b = Второй входной сигнал мультиплексора
signal-port-name-multiplexer-input-c = Вход C
signal-port-description-multiplexer-input-c = Третий входной сигнал мультиплексора
signal-port-name-multiplexer-input-d = Вход D
signal-port-description-multiplexer-input-d = Четвертый входной сигнал мультиплексора
signal-port-name-demultiplexer-input = Вход
signal-port-description-demultiplexer-input = Входной сигнал демультиплексора
signal-port-name-multiplexer-select-a = Выбор A
signal-port-description-multiplexer-select-a = Младший бит выбора канала
signal-port-name-multiplexer-select-b = Выбор B
signal-port-description-multiplexer-select-b = Старший бит выбора канала
signal-port-name-multiplexer-output = Выход
signal-port-description-multiplexer-output = Выходной сигнал мультиплексора
signal-port-name-demultiplexer-output-a = Выход A
signal-port-description-demultiplexer-output-a = Первый выходной сигнал демультиплексора
signal-port-name-demultiplexer-output-b = Выход B
signal-port-description-demultiplexer-output-b = Второй выходной сигнал демультиплексора
signal-port-name-demultiplexer-output-c = Выход C
signal-port-description-demultiplexer-output-c = Третий выходной сигнал демультиплексора
signal-port-name-demultiplexer-output-d = Выход D
signal-port-description-demultiplexer-output-d = Четвертый выходной сигнал демультиплексора

View file

@ -15,6 +15,4 @@ recipe-gauze-description = Несколько стерильных марлев
recipe-blingfold-name = повязка на глаза
recipe-blingfold-description = Полоса непроницаемого материала.
recipe-makeshifthandcuffs-name = самодельные наручники
recipe-makeshifthandcuffs-description = Самодельные наручники, изготовленные из запасных кабелей.
recipe-Multiplexer-name = мультиплексор
recipe-Multiplexer-description = Высокоуровневый логический элемент для маршрутизации сигналов. Можно изменить исполняемую функцию с помощью отвертки.
recipe-makeshifthandcuffs-description = Самодельные наручники, изготовленные из запасных кабелей.

View file

@ -51,15 +51,6 @@
- material: Cable
amount: 2
doAfter: 1
#Sunrise-start
- to: multiplexer
steps:
- material: Steel
amount: 1
- material: Manipulator
amount: 2
doAfter: 1
#Sunrise-end
- node: logic_gate
entity: LogicGateOr
edges:
@ -111,19 +102,3 @@
- !type:SpawnPrototype
prototype: CableApcStack1
amount: 2
#Sunrise-start
- node: multiplexer
entity: Multiplexer
edges:
- to: empty
steps:
- tool: Prying
doAfter: 2
completed:
- !type:SpawnPrototype
prototype: SheetSteel1
amount: 1
- !type:SpawnPrototype
prototype: MicroManipulatorStockPart
amount: 2
#Sunrise-end

View file

@ -37,13 +37,3 @@
targetNode: memory_cell
category: construction-category-tools
objectType: Item
#Sunrise-start
- type: construction
id: Multiplexer
graph: LogicGate
startNode: start
targetNode: multiplexer
category: construction-category-tools
objectType: Item
#Sunrise-end

View file

@ -1,99 +0,0 @@
- type: entity
parent: BaseLogicItem
id: Multiplexer
name: multiplexer
description: A configurable multiplexer/demultiplexer device that can route signals between multiple inputs and outputs.
components:
- type: Sprite
drawdepth: ThinPipe
sprite: _Sunrise/DeviceAdvanced/gates.rsi
layers:
- state: base
- state: mux
map: ["enum.MultiplexerLayers.Gate"]
- type: UseDelay
delay: 0.5
- type: Multiplexer
- type: DeviceLinkSink
ports:
- MuxInputA
- MuxInputB
- MuxInputC
- MuxInputD
- MuxSelectA
- MuxSelectB
- DemuxInput
- type: DeviceLinkSource
ports:
- MuxOutput
- MuxOutputA
- MuxOutputB
- MuxOutputC
- MuxOutputD
- type: Construction
node: multiplexer
- type: Appearance
- type: GenericVisualizer
visuals:
enum.MultiplexerVisuals.Gate:
enum.MultiplexerLayers.Gate:
Mux: { state: mux }
Demux: { state: demux }
# Multiplexer Input Ports
- type: sinkPort
id: MuxInputA
name: signal-port-name-multiplexer-input-a
description: signal-port-description-multiplexer-input-a
- type: sinkPort
id: MuxInputB
name: signal-port-name-multiplexer-input-b
description: signal-port-description-multiplexer-input-b
- type: sinkPort
id: MuxInputC
name: signal-port-name-multiplexer-input-c
description: signal-port-description-multiplexer-input-c
- type: sinkPort
id: MuxInputD
name: signal-port-name-multiplexer-input-d
description: signal-port-description-multiplexer-input-d
# Demultiplexer Input Port
- type: sinkPort
id: DemuxInput
name: signal-port-name-demultiplexer-input
description: signal-port-description-demultiplexer-input
# Select Ports shared
- type: sinkPort
id: MuxSelectA
name: signal-port-name-multiplexer-select-a
description: signal-port-description-multiplexer-select-a
- type: sinkPort
id: MuxSelectB
name: signal-port-name-multiplexer-select-b
description: signal-port-description-multiplexer-select-b
# Multiplexer Output Port
- type: sourcePort
id: MuxOutput
name: signal-port-name-multiplexer-output
description: signal-port-description-multiplexer-output
# Demultiplexer Output Ports
- type: sourcePort
id: MuxOutputA
name: signal-port-name-demultiplexer-output-a
description: signal-port-description-demultiplexer-output-a
- type: sourcePort
id: MuxOutputB
name: signal-port-name-demultiplexer-output-b
description: signal-port-description-demultiplexer-output-b
- type: sourcePort
id: MuxOutputC
name: signal-port-name-demultiplexer-output-c
description: signal-port-description-demultiplexer-output-c
- type: sourcePort
id: MuxOutputD
name: signal-port-name-demultiplexer-output-d
description: signal-port-description-demultiplexer-output-d

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 293 B

View file

@ -1,20 +0,0 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
"copyright": "prl.png originally created by d0lbaeb_1(discord), 2025",
"size": {
"x": 32,
"y": 32
},
"states": [
{
"name": "base"
},
{
"name": "mux"
},
{
"name": "demux"
}
]
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 288 B