From: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Date: Fri, 15 Dec 2023 09:52:46 +0000 (-0500) Subject: Electrolysis and Centrifuge (#22517) X-Git-Url: https://git.smokeofanarchy.ru/gitweb.cgi?a=commitdiff_plain;h=245598009086b80384618b1d671421a11aaabfbd;p=space-station-14.git Electrolysis and Centrifuge (#22517) * electrolysis and centrifuge * sprote * final * bomp! * COUGH COUGH SPROTE * boarsd --- diff --git a/Content.Client/Chemistry/EntitySystems/SolutionContainerMixerSystem.cs b/Content.Client/Chemistry/EntitySystems/SolutionContainerMixerSystem.cs new file mode 100644 index 0000000000..b6401c113d --- /dev/null +++ b/Content.Client/Chemistry/EntitySystems/SolutionContainerMixerSystem.cs @@ -0,0 +1,9 @@ +using Content.Shared.Chemistry.EntitySystems; + +namespace Content.Client.Chemistry.EntitySystems; + +/// +public sealed class SolutionContainerMixerSystem : SharedSolutionContainerMixerSystem +{ + +} diff --git a/Content.Server/Chemistry/EntitySystems/SolutionContainerMixerSystem.cs b/Content.Server/Chemistry/EntitySystems/SolutionContainerMixerSystem.cs new file mode 100644 index 0000000000..a942d34e7a --- /dev/null +++ b/Content.Server/Chemistry/EntitySystems/SolutionContainerMixerSystem.cs @@ -0,0 +1,29 @@ +using Content.Server.Power.Components; +using Content.Server.Power.EntitySystems; +using Content.Shared.Chemistry.Components; +using Content.Shared.Chemistry.EntitySystems; + +namespace Content.Server.Chemistry.EntitySystems; + +/// +public sealed class SolutionContainerMixerSystem : SharedSolutionContainerMixerSystem +{ + /// + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnPowerChanged); + } + + private void OnPowerChanged(Entity ent, ref PowerChangedEvent args) + { + if (!args.Powered) + StopMix(ent); + } + + protected override bool HasPower(Entity entity) + { + return this.IsPowered(entity, EntityManager); + } +} diff --git a/Content.Shared/Chemistry/Components/SolutionContainerMixerComponent.cs b/Content.Shared/Chemistry/Components/SolutionContainerMixerComponent.cs new file mode 100644 index 0000000000..8e4b6f52d8 --- /dev/null +++ b/Content.Shared/Chemistry/Components/SolutionContainerMixerComponent.cs @@ -0,0 +1,44 @@ +using Content.Shared.Chemistry.EntitySystems; +using Content.Shared.Chemistry.Reaction; +using Robust.Shared.Audio; +using Robust.Shared.Audio.Components; +using Robust.Shared.GameStates; +using Robust.Shared.Serialization; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; + +namespace Content.Shared.Chemistry.Components; + +/// +/// This is used for an entity that uses to mix any container with a solution after a period of time. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +[Access(typeof(SharedSolutionContainerMixerSystem))] +public sealed partial class SolutionContainerMixerComponent : Component +{ + [DataField, ViewVariables(VVAccess.ReadWrite)] + public string ContainerId = "mixer"; + + [DataField, AutoNetworkedField] + public bool Mixing; + + /// + /// How long it takes for mixing to occurs. + /// + [DataField, ViewVariables(VVAccess.ReadWrite), AutoNetworkedField] + public TimeSpan MixDuration; + + [DataField(customTypeSerializer: typeof(TimeOffsetSerializer)), ViewVariables(VVAccess.ReadWrite), AutoNetworkedField] + public TimeSpan MixTimeEnd; + + [DataField, AutoNetworkedField] + public SoundSpecifier? MixingSound; + + [DataField] + public Entity? MixingSoundEntity; +} + +[Serializable, NetSerializable] +public enum SolutionContainerMixerVisuals : byte +{ + Mixing +} diff --git a/Content.Shared/Chemistry/EntitySystems/SharedSolutionContainerMixerSystem.cs b/Content.Shared/Chemistry/EntitySystems/SharedSolutionContainerMixerSystem.cs new file mode 100644 index 0000000000..ab92425608 --- /dev/null +++ b/Content.Shared/Chemistry/EntitySystems/SharedSolutionContainerMixerSystem.cs @@ -0,0 +1,125 @@ +using Content.Shared.Chemistry.Components; +using Content.Shared.Chemistry.Reaction; +using Content.Shared.Interaction; +using Content.Shared.Popups; +using Robust.Shared.Audio.Systems; +using Robust.Shared.Containers; +using Robust.Shared.Network; +using Robust.Shared.Timing; + +namespace Content.Shared.Chemistry.EntitySystems; + +/// +/// This handles +/// +public abstract class SharedSolutionContainerMixerSystem : EntitySystem +{ + [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly INetManager _net = default!; + [Dependency] private readonly SharedAppearanceSystem _appearance = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] private readonly ChemicalReactionSystem _chemicalReaction = default!; + [Dependency] private readonly SharedContainerSystem _container = default!; + [Dependency] private readonly SharedPopupSystem _popup = default!; + [Dependency] private readonly SolutionContainerSystem _solution = default!; + + /// + public override void Initialize() + { + SubscribeLocalEvent(OnActivateInWorld); + SubscribeLocalEvent(OnRemoveAttempt); + } + + private void OnActivateInWorld(Entity entity, ref ActivateInWorldEvent args) + { + TryStartMix(entity, args.User); + } + + private void OnRemoveAttempt(Entity ent, ref ContainerIsRemovingAttemptEvent args) + { + if (args.Container.ID == ent.Comp.ContainerId && ent.Comp.Mixing) + args.Cancel(); + } + + protected virtual bool HasPower(Entity entity) + { + return true; + } + + public void TryStartMix(Entity entity, EntityUid? user) + { + var (uid, comp) = entity; + if (comp.Mixing) + return; + + if (!HasPower(entity)) + { + if (user != null) + _popup.PopupClient(Loc.GetString("solution-container-mixer-no-power"), entity, user.Value); + return; + } + + if (!_container.TryGetContainer(uid, comp.ContainerId, out var container) || container.Count == 0) + { + if (user != null) + _popup.PopupClient(Loc.GetString("solution-container-mixer-popup-nothing-to-mix"), entity, user.Value); + return; + } + + comp.Mixing = true; + if (_net.IsServer) + comp.MixingSoundEntity = _audio.PlayPvs(comp.MixingSound, entity, comp.MixingSound?.Params.WithLoop(true)); + comp.MixTimeEnd = _timing.CurTime + comp.MixDuration; + _appearance.SetData(entity, SolutionContainerMixerVisuals.Mixing, true); + Dirty(uid, comp); + } + + public void StopMix(Entity entity) + { + var (uid, comp) = entity; + if (!comp.Mixing) + return; + _audio.Stop(comp.MixingSoundEntity); + _appearance.SetData(entity, SolutionContainerMixerVisuals.Mixing, false); + comp.Mixing = false; + comp.MixingSoundEntity = null; + Dirty(uid, comp); + } + + public void FinishMix(Entity entity) + { + var (uid, comp) = entity; + if (!comp.Mixing) + return; + StopMix(entity); + + if (!TryComp(entity, out var reactionMixer) + || !_container.TryGetContainer(uid, comp.ContainerId, out var container)) + return; + + foreach (var ent in container.ContainedEntities) + { + if (!_solution.TryGetFitsInDispenser(ent, out var solution)) + continue; + + _chemicalReaction.FullyReactSolution(solution, ent, solution.MaxVolume, reactionMixer); + } + } + + public override void Update(float frameTime) + { + base.Update(frameTime); + + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var comp)) + { + if (!comp.Mixing) + continue; + + if (_timing.CurTime < comp.MixTimeEnd) + continue; + + FinishMix((uid, comp)); + } + } +} diff --git a/Content.Shared/Chemistry/Reaction/ChemicalReactionSystem.cs b/Content.Shared/Chemistry/Reaction/ChemicalReactionSystem.cs index 1a55408916..1bf7e7888b 100644 --- a/Content.Shared/Chemistry/Reaction/ChemicalReactionSystem.cs +++ b/Content.Shared/Chemistry/Reaction/ChemicalReactionSystem.cs @@ -112,7 +112,8 @@ namespace Content.Shared.Chemistry.Reaction { lowestUnitReactions = FixedPoint2.Zero; return false; - } else if(solution.Temperature > reaction.MaximumTemperature) + } + if (solution.Temperature > reaction.MaximumTemperature) { lowestUnitReactions = FixedPoint2.Zero; return false; @@ -126,7 +127,7 @@ namespace Content.Shared.Chemistry.Reaction } var attempt = new ReactionAttemptEvent(reaction, solution); - RaiseLocalEvent(owner, attempt, false); + RaiseLocalEvent(owner, attempt); if (attempt.Cancelled) { lowestUnitReactions = FixedPoint2.Zero; diff --git a/Content.Shared/Chemistry/Reaction/MixingCategoryPrototype.cs b/Content.Shared/Chemistry/Reaction/MixingCategoryPrototype.cs new file mode 100644 index 0000000000..30d110a459 --- /dev/null +++ b/Content.Shared/Chemistry/Reaction/MixingCategoryPrototype.cs @@ -0,0 +1,14 @@ +using Robust.Shared.Prototypes; + +namespace Content.Shared.Chemistry.Reaction; + +/// +/// This is a prototype for a method of chemical mixing, to be used by +/// +[Prototype("mixingCategory")] +public sealed partial class MixingCategoryPrototype : IPrototype +{ + /// + [IdDataField] + public string ID { get; } = default!; +} diff --git a/Content.Shared/Chemistry/Reaction/ReactionMixerComponent.cs b/Content.Shared/Chemistry/Reaction/ReactionMixerComponent.cs index 6969723953..a88bf02bf8 100644 --- a/Content.Shared/Chemistry/Reaction/ReactionMixerComponent.cs +++ b/Content.Shared/Chemistry/Reaction/ReactionMixerComponent.cs @@ -1,4 +1,5 @@ using Content.Shared.Chemistry.Components; +using Robust.Shared.Prototypes; namespace Content.Shared.Chemistry.Reaction; @@ -10,7 +11,7 @@ public sealed partial class ReactionMixerComponent : Component /// [ViewVariables] [DataField] - public List ReactionTypes = default!; + public List> ReactionTypes = default!; /// /// A string which identifies the string to be sent when successfully mixing a solution diff --git a/Content.Shared/Chemistry/Reaction/ReactionPrototype.cs b/Content.Shared/Chemistry/Reaction/ReactionPrototype.cs index 37b5d44140..7541784905 100644 --- a/Content.Shared/Chemistry/Reaction/ReactionPrototype.cs +++ b/Content.Shared/Chemistry/Reaction/ReactionPrototype.cs @@ -48,7 +48,7 @@ namespace Content.Shared.Chemistry.Reaction /// The required mixing categories for an entity to mix the solution with for the reaction to occur /// [DataField("requiredMixerCategories")] - public List? MixingCategories = null; + public List>? MixingCategories; /// /// Reagents created when the reaction occurs. diff --git a/Resources/Audio/Machines/attributions.yml b/Resources/Audio/Machines/attributions.yml index 411e1aa825..c7859e9ba1 100644 --- a/Resources/Audio/Machines/attributions.yml +++ b/Resources/Audio/Machines/attributions.yml @@ -8,6 +8,16 @@ copyright: "Created by dotY21." source: "https://freesound.org/people/dotY21/sounds/330726/" +- files: ["buzz_loop.ogg"] + license: "CC0-1.0" + copyright: "Created by Duasun, converted to OGG by EmoGarbage404 (github)." + source: "https://freesound.org/people/Duasun/sounds/712127/" + +- files: ["spinning.ogg"] + license: "CC0-1.0" + copyright: "Created by MrLindstrom, modified and converted to OGG by EmoGarbage404 (github)." + source: "https://freesound.org/people/MrLindstrom/sounds/543964/" + - files: ["vending_restock_start.ogg"] license: "CC0-1.0" copyright: "https://freesound.org/people/Defaultv/" diff --git a/Resources/Audio/Machines/buzz_loop.ogg b/Resources/Audio/Machines/buzz_loop.ogg new file mode 100644 index 0000000000..5893b2aac1 Binary files /dev/null and b/Resources/Audio/Machines/buzz_loop.ogg differ diff --git a/Resources/Audio/Machines/spinning.ogg b/Resources/Audio/Machines/spinning.ogg new file mode 100644 index 0000000000..e85d46f07d Binary files /dev/null and b/Resources/Audio/Machines/spinning.ogg differ diff --git a/Resources/Locale/en-US/chemistry/components/solution-container-mixer-component.ftl b/Resources/Locale/en-US/chemistry/components/solution-container-mixer-component.ftl new file mode 100644 index 0000000000..9402903477 --- /dev/null +++ b/Resources/Locale/en-US/chemistry/components/solution-container-mixer-component.ftl @@ -0,0 +1,3 @@ +solution-container-mixer-activate = Activate +solution-container-mixer-no-power = No power! +solution-container-mixer-popup-nothing-to-mix = Nothing inside! diff --git a/Resources/Prototypes/Chemistry/mixing_types.yml b/Resources/Prototypes/Chemistry/mixing_types.yml new file mode 100644 index 0000000000..e32afa43fa --- /dev/null +++ b/Resources/Prototypes/Chemistry/mixing_types.yml @@ -0,0 +1,8 @@ +- type: mixingCategory + id: Centrifuge + +- type: mixingCategory + id: Electrolysis + +- type: mixingCategory + id: Holy diff --git a/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/production.yml b/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/production.yml index 7af85a09f0..e7fdde9397 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/production.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/production.yml @@ -808,6 +808,36 @@ Cable: 3 Steel: 2 +- type: entity + id: ElectrolysisUnitMachineCircuitboard + parent: BaseMachineCircuitboard + name: electrolysis unit machine board + description: A machine printed circuit board for an electrolysis unit. + components: + - type: Sprite + state: medical + - type: MachineBoard + prototype: MachineElectrolysisUnit + requirements: + Capacitor: 2 + materialRequirements: + Cable: 1 + +- type: entity + id: CentrifugeMachineCircuitboard + parent: BaseMachineCircuitboard + name: centrifuge machine board + description: A machine printed circuit board for a centrifuge. + components: + - type: Sprite + state: medical + - type: MachineBoard + prototype: MachineCentrifuge + requirements: + Manipulator: 1 + materialRequirements: + Steel: 1 + - type: entity id: MaterialReclaimerMachineCircuitboard parent: BaseMachineCircuitboard diff --git a/Resources/Prototypes/Entities/Structures/Machines/Medical/chemistry_machines.yml b/Resources/Prototypes/Entities/Structures/Machines/Medical/chemistry_machines.yml new file mode 100644 index 0000000000..6a46064ac4 --- /dev/null +++ b/Resources/Prototypes/Entities/Structures/Machines/Medical/chemistry_machines.yml @@ -0,0 +1,119 @@ +- type: entity + id: BaseTabletopChemicalMachine + parent: [ BaseMachinePowered, ConstructibleMachine ] + abstract: true + components: + - type: Transform + anchored: true + - type: SolutionContainerMixer + - type: ReactionMixer + - type: Sprite + drawdepth: SmallObjects + snapCardinals: true + - type: Appearance + - type: Physics + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeAabb + bounds: "-0.17,0,0.20,0.4" + mask: + - TabletopMachineMask + layer: + - TabletopMachineLayer + - type: ItemSlots + slots: + mixer: + whitelist: + components: + - FitsInDispenser + - type: Machine + - type: Wires + layoutId: chem + - type: WiresPanel + - type: WiresVisuals + - type: ContainerContainer + containers: + mixer: !type:ContainerSlot + machine_board: !type:Container + machine_parts: !type:Container + +- type: entity + id: MachineElectrolysisUnit + parent: BaseTabletopChemicalMachine + name: electrolysis unit + description: The latest in medicinal electrocution technology. + components: + - type: SolutionContainerMixer + mixDuration: 5 + mixingSound: + path: /Audio/Machines/buzz_loop.ogg + params: + volume: -5 + - type: ReactionMixer + reactionTypes: + - Electrolysis + - type: Sprite + sprite: Structures/Machines/Medical/electrolysis.rsi + offset: "0.0,0.4" + layers: + - state: base + - state: panel + map: ["enum.WiresVisualLayers.MaintenancePanel"] + visible: false + - state: unshaded + map: ["enum.PowerDeviceVisualLayers.Powered"] + shader: unshaded + - type: GenericVisualizer + visuals: + enum.SolutionContainerMixerVisuals.Mixing: + enum.PowerDeviceVisualLayers.Powered: + True: {state: "spinning"} + False: {state: "unshaded"} + enum.PowerDeviceVisuals.Powered: + enum.PowerDeviceVisualLayers.Powered: + True: { visible: True } + False: { visible: False } + - type: Machine + board: ElectrolysisUnitMachineCircuitboard + +- type: entity + id: MachineCentrifuge + parent: BaseTabletopChemicalMachine + name: tabletop centrifuge + description: Around and around it goes... + components: + - type: SolutionContainerMixer + mixDuration: 10 + mixingSound: + path: /Audio/Machines/spinning.ogg + params: + volume: -4 + - type: ReactionMixer + reactionTypes: + - Centrifuge + - type: Sprite + sprite: Structures/Machines/Medical/centrifuge.rsi + offset: "0.0,0.4" + layers: + - state: base + map: ["beyblade"] + - state: panel + map: ["enum.WiresVisualLayers.MaintenancePanel"] + visible: false + - state: unshaded + map: ["enum.PowerDeviceVisualLayers.Powered"] + shader: unshaded + - type: GenericVisualizer + visuals: + enum.SolutionContainerMixerVisuals.Mixing: + beyblade: + True: {state: "base-spinning"} + False: {state: "base"} + enum.PowerDeviceVisuals.Powered: + enum.PowerDeviceVisualLayers.Powered: + True: { visible: True } + False: { visible: False } + - type: Machine + board: CentrifugeMachineCircuitboard diff --git a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml index 535564496d..9bdf3834c4 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml @@ -308,6 +308,8 @@ idleState: icon runningState: building staticRecipes: + - ElectrolysisUnitMachineCircuitboard + - CentrifugeMachineCircuitboard - CondenserMachineCircuitBoard dynamicRecipes: - ThermomachineFreezerMachineCircuitBoard diff --git a/Resources/Prototypes/Recipes/Lathes/electronics.yml b/Resources/Prototypes/Recipes/Lathes/electronics.yml index 9ab48db864..7a92402428 100644 --- a/Resources/Prototypes/Recipes/Lathes/electronics.yml +++ b/Resources/Prototypes/Recipes/Lathes/electronics.yml @@ -360,6 +360,22 @@ Glass: 900 Gold: 100 +- type: latheRecipe + id: ElectrolysisUnitMachineCircuitboard + result: ElectrolysisUnitMachineCircuitboard + completetime: 4 + materials: + Steel: 100 + Glass: 900 + +- type: latheRecipe + id: CentrifugeMachineCircuitboard + result: CentrifugeMachineCircuitboard + completetime: 4 + materials: + Steel: 100 + Glass: 900 + - type: latheRecipe id: MaterialReclaimerMachineCircuitboard result: MaterialReclaimerMachineCircuitboard diff --git a/Resources/Textures/Structures/Machines/Medical/centrifuge.rsi/base-spinning.png b/Resources/Textures/Structures/Machines/Medical/centrifuge.rsi/base-spinning.png new file mode 100644 index 0000000000..16daad92ac Binary files /dev/null and b/Resources/Textures/Structures/Machines/Medical/centrifuge.rsi/base-spinning.png differ diff --git a/Resources/Textures/Structures/Machines/Medical/centrifuge.rsi/base.png b/Resources/Textures/Structures/Machines/Medical/centrifuge.rsi/base.png new file mode 100644 index 0000000000..c145d0322e Binary files /dev/null and b/Resources/Textures/Structures/Machines/Medical/centrifuge.rsi/base.png differ diff --git a/Resources/Textures/Structures/Machines/Medical/centrifuge.rsi/meta.json b/Resources/Textures/Structures/Machines/Medical/centrifuge.rsi/meta.json new file mode 100644 index 0000000000..808d1dbe7f --- /dev/null +++ b/Resources/Textures/Structures/Machines/Medical/centrifuge.rsi/meta.json @@ -0,0 +1,31 @@ +{ + "version": 1, + "license": "CC0-1.0", + "copyright": "Adapted from CEV-Eris by EmoGarbage404 (github) for Space Station 14.", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "base" + }, + { + "name": "base-spinning", + "delays": + [ + [ + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "panel" + }, + { + "name": "unshaded" + } + ] +} diff --git a/Resources/Textures/Structures/Machines/Medical/centrifuge.rsi/panel.png b/Resources/Textures/Structures/Machines/Medical/centrifuge.rsi/panel.png new file mode 100644 index 0000000000..55550305ed Binary files /dev/null and b/Resources/Textures/Structures/Machines/Medical/centrifuge.rsi/panel.png differ diff --git a/Resources/Textures/Structures/Machines/Medical/centrifuge.rsi/unshaded.png b/Resources/Textures/Structures/Machines/Medical/centrifuge.rsi/unshaded.png new file mode 100644 index 0000000000..fcb54a8b9f Binary files /dev/null and b/Resources/Textures/Structures/Machines/Medical/centrifuge.rsi/unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/Medical/electrolysis.rsi/base.png b/Resources/Textures/Structures/Machines/Medical/electrolysis.rsi/base.png new file mode 100644 index 0000000000..ef9305ae2a Binary files /dev/null and b/Resources/Textures/Structures/Machines/Medical/electrolysis.rsi/base.png differ diff --git a/Resources/Textures/Structures/Machines/Medical/electrolysis.rsi/meta.json b/Resources/Textures/Structures/Machines/Medical/electrolysis.rsi/meta.json new file mode 100644 index 0000000000..71eacfdf23 --- /dev/null +++ b/Resources/Textures/Structures/Machines/Medical/electrolysis.rsi/meta.json @@ -0,0 +1,32 @@ +{ + "version": 1, + "license": "CC0-1.0", + "copyright": "Adapted from CEV-Eris by EmoGarbage404 (github) for Space Station 14.", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "base" + }, + { + "name": "spinning", + "delays": + [ + [ + 0.25, + 0.25, + 0.25, + 0.25 + ] + ] + }, + { + "name": "panel" + }, + { + "name": "unshaded" + } + ] +} diff --git a/Resources/Textures/Structures/Machines/Medical/electrolysis.rsi/panel.png b/Resources/Textures/Structures/Machines/Medical/electrolysis.rsi/panel.png new file mode 100644 index 0000000000..4208f69693 Binary files /dev/null and b/Resources/Textures/Structures/Machines/Medical/electrolysis.rsi/panel.png differ diff --git a/Resources/Textures/Structures/Machines/Medical/electrolysis.rsi/spinning.png b/Resources/Textures/Structures/Machines/Medical/electrolysis.rsi/spinning.png new file mode 100644 index 0000000000..b2fc90cc12 Binary files /dev/null and b/Resources/Textures/Structures/Machines/Medical/electrolysis.rsi/spinning.png differ diff --git a/Resources/Textures/Structures/Machines/Medical/electrolysis.rsi/unshaded.png b/Resources/Textures/Structures/Machines/Medical/electrolysis.rsi/unshaded.png new file mode 100644 index 0000000000..5c2c1aaff2 Binary files /dev/null and b/Resources/Textures/Structures/Machines/Medical/electrolysis.rsi/unshaded.png differ