From 73174a8bfaa3deb0e0f7d942a6c9a97661ebf9b0 Mon Sep 17 00:00:00 2001 From: SX-7 Date: Wed, 18 Feb 2026 16:48:07 +0100 Subject: [PATCH 01/16] Init --- .../SupermatterConsoleBoundUserInterface.cs | 31 + .../Consoles/SupermatterConsoleWindow.xaml | 34 + .../Consoles/SupermatterConsoleWindow.xaml.cs | 249 +++++++ .../Consoles/SupermatterEntryContainer.xaml | 106 +++ .../SupermatterEntryContainer.xaml.cs | 243 +++++++ .../Consoles/SupermatterGasBarContainer.xaml | 16 + .../SupermatterGasBarContainer.xaml.cs | 48 ++ .../Supermatter/Systems/SupermatterSystem.cs | 21 + .../Consoles/SupermatterConsoleSystem.cs | 201 +++++ .../Supermatter/Systems/SupermatterSystem.cs | 684 ++++++++++++++++++ .../Content.Goobstation.Shared.csproj | 1 + .../Components/SupermatterComponent.cs | 408 +++++++++++ .../Components/SupermatterFoodComponent.cs | 9 + .../Components/SupermatterImmuneComponent.cs | 9 + .../SharedSupermatterConsoleSystem.cs | 4 + .../Consoles/SupermatterConsoleComponent.cs | 168 +++++ .../Monitor/SupermatterStatusType.cs | 16 + .../Systems/SharedSupermatterSystem.cs | 47 ++ 18 files changed, 2295 insertions(+) create mode 100644 Modules/GoobStation/Content.Goobstation.Client/Supermatter/Consoles/SupermatterConsoleBoundUserInterface.cs create mode 100644 Modules/GoobStation/Content.Goobstation.Client/Supermatter/Consoles/SupermatterConsoleWindow.xaml create mode 100644 Modules/GoobStation/Content.Goobstation.Client/Supermatter/Consoles/SupermatterConsoleWindow.xaml.cs create mode 100644 Modules/GoobStation/Content.Goobstation.Client/Supermatter/Consoles/SupermatterEntryContainer.xaml create mode 100644 Modules/GoobStation/Content.Goobstation.Client/Supermatter/Consoles/SupermatterEntryContainer.xaml.cs create mode 100644 Modules/GoobStation/Content.Goobstation.Client/Supermatter/Consoles/SupermatterGasBarContainer.xaml create mode 100644 Modules/GoobStation/Content.Goobstation.Client/Supermatter/Consoles/SupermatterGasBarContainer.xaml.cs create mode 100644 Modules/GoobStation/Content.Goobstation.Client/Supermatter/Systems/SupermatterSystem.cs create mode 100644 Modules/GoobStation/Content.Goobstation.Server/Supermatter/Consoles/SupermatterConsoleSystem.cs create mode 100644 Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.cs create mode 100644 Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Components/SupermatterComponent.cs create mode 100644 Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Components/SupermatterFoodComponent.cs create mode 100644 Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Components/SupermatterImmuneComponent.cs create mode 100644 Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Consoles/SharedSupermatterConsoleSystem.cs create mode 100644 Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Consoles/SupermatterConsoleComponent.cs create mode 100644 Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Monitor/SupermatterStatusType.cs create mode 100644 Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Systems/SharedSupermatterSystem.cs diff --git a/Modules/GoobStation/Content.Goobstation.Client/Supermatter/Consoles/SupermatterConsoleBoundUserInterface.cs b/Modules/GoobStation/Content.Goobstation.Client/Supermatter/Consoles/SupermatterConsoleBoundUserInterface.cs new file mode 100644 index 0000000000..5c8c5901e0 --- /dev/null +++ b/Modules/GoobStation/Content.Goobstation.Client/Supermatter/Consoles/SupermatterConsoleBoundUserInterface.cs @@ -0,0 +1,31 @@ +using Content.Goobstation.Shared.Supermatter.Consoles; + +namespace Content.Goobstation.Client.Supermatter.Consoles; + +public sealed class SupermatterConsoleBoundUserInterface(EntityUid owner, Enum uiKey) : BoundUserInterface(owner, uiKey) +{ + [ViewVariables] + private SupermatterConsoleWindow? _menu; + + protected override void Open() + { + base.Open(); + + _menu = new SupermatterConsoleWindow(this, Owner); + _menu.OpenCentered(); + _menu.OnClose += Close; + } + + protected override void UpdateState(BoundUserInterfaceState state) + { + base.UpdateState(state); + + var castState = (SupermatterConsoleBoundInterfaceState)state; + _menu?.UpdateUI(castState.Supermatters, castState.FocusData); + } + + public void SendFocusChangeMessage(NetEntity? netEntity) + { + SendMessage(new SupermatterConsoleFocusChangeMessage(netEntity)); + } +} diff --git a/Modules/GoobStation/Content.Goobstation.Client/Supermatter/Consoles/SupermatterConsoleWindow.xaml b/Modules/GoobStation/Content.Goobstation.Client/Supermatter/Consoles/SupermatterConsoleWindow.xaml new file mode 100644 index 0000000000..f817172483 --- /dev/null +++ b/Modules/GoobStation/Content.Goobstation.Client/Supermatter/Consoles/SupermatterConsoleWindow.xaml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Modules/GoobStation/Content.Goobstation.Client/Supermatter/Consoles/SupermatterConsoleWindow.xaml.cs b/Modules/GoobStation/Content.Goobstation.Client/Supermatter/Consoles/SupermatterConsoleWindow.xaml.cs new file mode 100644 index 0000000000..76e8ba9491 --- /dev/null +++ b/Modules/GoobStation/Content.Goobstation.Client/Supermatter/Consoles/SupermatterConsoleWindow.xaml.cs @@ -0,0 +1,249 @@ +using Content.Client.Message; +using Content.Client.Stylesheets; +using Content.Client.Stylesheets.Palette; +using Content.Client.Stylesheets.Sheetlets; +using Content.Client.UserInterface.Controls; +using Content.Goobstation.Shared.Supermatter.Consoles; +using Content.Goobstation.Shared.Supermatter.Components; +using Content.Goobstation.Shared.Supermatter.Monitor; +using Content.Shared.Pinpointer; +using Robust.Client.AutoGenerated; +using Robust.Client.GameObjects; +using Robust.Client.UserInterface; +using Robust.Client.UserInterface.Controls; +using Robust.Client.UserInterface.XAML; +using Robust.Shared.Maths; +using Robust.Shared.Timing; +using Robust.Shared.Utility; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.Linq; + +namespace Content.Goobstation.Client.Supermatter.Consoles; + +[GenerateTypedNameReferences] +public sealed partial class SupermatterConsoleWindow : FancyWindow +{ + private readonly IEntityManager _entManager; + private readonly SpriteSystem _spriteSystem; + private readonly SharedNavMapSystem _navMapSystem; + + private readonly EntityUid? _owner; + private NetEntity? _trackedEntity; + + private SupermatterConsoleEntry[]? _supermatters = null; + + public event Action? SendFocusChangeMessageAction; + + private bool _autoScrollActive = false; + private bool _autoScrollAwaitsUpdate = false; + + // Colors + private Color _wallColor = new(64, 64, 64); + private Color _tileColor = new(28, 28, 28); + private Color _monitorBlipColor = Color.Cyan; + private Color _untrackedEntColor = Color.DimGray; + private Color _regionBaseColor = new(154, 154, 154); + private Color _inactiveColor = Color.DarkGray; + private Color _statusTextColor = Palettes.Status.Good; + private Color _goodColor = Color.LimeGreen; + private Color _warningColor = new(255, 182, 72); + private Color _dangerColor = new(255, 67, 67); + + public SupermatterConsoleWindow(SupermatterConsoleBoundUserInterface userInterface, EntityUid? owner) + { + RobustXamlLoader.Load(this); + _entManager = IoCManager.Resolve(); + _spriteSystem = _entManager.System(); + _navMapSystem = _entManager.System(); + + // Pass the owner to nav map + _owner = owner; + + // Set supermatter monitoring message action + SendFocusChangeMessageAction += userInterface.SendFocusChangeMessage; + } + + public void UpdateUI(SupermatterConsoleEntry[] supermatters, SupermatterFocusData? focusData) + { + if (_owner == null + || !_entManager.TryGetComponent(_owner.Value, out var console)) + return; + + if (_trackedEntity != focusData?.NetEntity) + { + SendFocusChangeMessageAction?.Invoke(_trackedEntity); + focusData = null; + } + + // Retain supermatter data for use inbetween updates + _supermatters = supermatters; + + // Clear excess children from the tables + var supermattersCount = _supermatters.Length; + + while (SupermattersTable.ChildCount > supermattersCount) + SupermattersTable.RemoveChild(SupermattersTable.GetChild(SupermattersTable.ChildCount - 1)); + + // Update all entries in each table + for (var index = 0; index < _supermatters.Length; index++) + { + var entry = _supermatters.ElementAt(index); + UpdateUIEntry(entry, index, SupermattersTable, console, focusData); + } + + // If no alerts are active, display a message + if (supermattersCount == 0) + { + var label = new RichTextLabel() + { + HorizontalExpand = true, + VerticalExpand = true, + HorizontalAlignment = HAlignment.Center, + VerticalAlignment = VAlignment.Center, + }; + + label.SetMarkup(Loc.GetString("supermatter-console-window-no-supermatters")); + + SupermattersTable.AddChild(label); + } + + // Auto-scroll re-enable + if (_autoScrollAwaitsUpdate) + { + _autoScrollActive = true; + _autoScrollAwaitsUpdate = false; + } + } + + private void UpdateUIEntry(SupermatterConsoleEntry entry, int index, Control table, SupermatterConsoleComponent console, SupermatterFocusData? focusData = null) + { + // Make new UI entry if required + if (index >= table.ChildCount) + { + var newEntryContainer = new SupermatterEntryContainer(entry.NetEntity); + + // On click + newEntryContainer.FocusButton.OnButtonUp += args => + { + if (_trackedEntity == newEntryContainer.NetEntity) + _trackedEntity = null; + else + _trackedEntity = newEntryContainer.NetEntity; + + // Send message to console that the focus has changed + SendFocusChangeMessageAction?.Invoke(_trackedEntity); + }; + + // Add the entry to the current table + table.AddChild(newEntryContainer); + } + + // Update values and UI elements + var tableChild = table.GetChild(index); + + if (tableChild is not SupermatterEntryContainer) + { + table.RemoveChild(tableChild); + UpdateUIEntry(entry, index, table, console, focusData); + + return; + } + + var entryContainer = (SupermatterEntryContainer)tableChild; + + entryContainer.UpdateEntry(entry, entry.NetEntity == _trackedEntity, focusData); + } + + protected override void FrameUpdate(FrameEventArgs args) + { + AutoScrollToFocus(); + } + + private void ActivateAutoScrollToFocus() + { + _autoScrollActive = false; + _autoScrollAwaitsUpdate = true; + } + + private void AutoScrollToFocus() + { + if (!_autoScrollActive) + return; + + if (SupermattersTable.Parent is not ScrollContainer scroll + || !TryGetVerticalScrollbar(scroll, out var vScrollbar) + || !TryGetNextScrollPosition(out var nextScrollPosition)) + return; + + vScrollbar.ValueTarget = nextScrollPosition.Value; + + if (MathHelper.CloseToPercent(vScrollbar.Value, vScrollbar.ValueTarget)) + _autoScrollActive = false; + } + + private static bool TryGetVerticalScrollbar(ScrollContainer scroll, [NotNullWhen(true)] out VScrollBar? vScrollBar) + { + vScrollBar = null; + + foreach (var child in scroll.Children) + { + if (child is not VScrollBar) + continue; + + + if (child is VScrollBar castChild) + { + vScrollBar = castChild; + return true; + } + } + + return false; + } + + private bool TryGetNextScrollPosition([NotNullWhen(true)] out float? nextScrollPosition) + { + nextScrollPosition = null; + + if (SupermattersTable.Parent is not ScrollContainer scroll) + return false; + + if (scroll.Children.ElementAt(0) is not BoxContainer container + || !container.Children.Any()) + return false; + + // Exit if the heights of the children haven't been initialized yet + if (!container.Children.Any(x => x.Height > 0)) + return false; + + nextScrollPosition = 0; + + foreach (var control in container.Children) + { + if (control == null + || control is not SupermatterEntryContainer) + continue; + + if (((SupermatterEntryContainer)control).NetEntity == _trackedEntity) + return true; + + nextScrollPosition += control.Height; + } + + // Failed to find control + nextScrollPosition = null; + + return false; + } + + private SupermatterStatusType GetStatus(NetEntity netEntity) + { + var status = _supermatters?.FirstOrNull(x => x.NetEntity == netEntity)?.EntityStatus; + + if (status == null) + return SupermatterStatusType.Error; + + return status.Value; + } +} diff --git a/Modules/GoobStation/Content.Goobstation.Client/Supermatter/Consoles/SupermatterEntryContainer.xaml b/Modules/GoobStation/Content.Goobstation.Client/Supermatter/Consoles/SupermatterEntryContainer.xaml new file mode 100644 index 0000000000..d4dcb80ae4 --- /dev/null +++ b/Modules/GoobStation/Content.Goobstation.Client/Supermatter/Consoles/SupermatterEntryContainer.xaml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Modules/GoobStation/Content.Goobstation.Client/Supermatter/Consoles/SupermatterEntryContainer.xaml.cs b/Modules/GoobStation/Content.Goobstation.Client/Supermatter/Consoles/SupermatterEntryContainer.xaml.cs new file mode 100644 index 0000000000..c69560c0cc --- /dev/null +++ b/Modules/GoobStation/Content.Goobstation.Client/Supermatter/Consoles/SupermatterEntryContainer.xaml.cs @@ -0,0 +1,243 @@ +using System.Collections.Generic; +using System.Linq; +using System.Numerics; +using Content.Client.Atmos.EntitySystems; +using Content.Client.Stylesheets; +using Content.Client.Stylesheets.Palette; +using Content.Goobstation.Shared.Supermatter.Components; +using Content.Goobstation.Shared.Supermatter.Consoles; +using Content.Shared.Atmos; +using Content.Shared.Atmos.Prototypes; +using Robust.Client.AutoGenerated; +using Robust.Client.Graphics; +using Robust.Client.ResourceManagement; +using Robust.Client.UserInterface; +using Robust.Client.UserInterface.Controls; +using Robust.Client.UserInterface.XAML; +using Robust.Shared.Maths; + +namespace Content.Goobstation.Client.Supermatter.Consoles; + +[GenerateTypedNameReferences] +public sealed partial class SupermatterEntryContainer : BoxContainer +{ + public NetEntity NetEntity; + + private readonly IEntityManager _entManager; + private readonly Dictionary _engineDictionary; + + public SupermatterEntryContainer(NetEntity uid) + { + RobustXamlLoader.Load(this); + + _entManager = IoCManager.Resolve(); + var cache = IoCManager.Resolve(); + + NetEntity = uid; + + // Load fonts + var normalFont = new VectorFont(cache.GetResource("/Fonts/NotoSansDisplay/NotoSansDisplay-Regular.ttf"), 11); + var monoFont = new VectorFont(cache.GetResource("/EngineFonts/NotoSans/NotoSansMono-Regular.ttf"), 10); + + // Set fonts + //SupermatterNameLabel.FontOverride = headerFont; + + //SupermatterStatusLabel.FontOverride = normalFont; + + IntegrityLabel.FontOverride = normalFont; + PowerLabel.FontOverride = normalFont; + RadiationLabel.FontOverride = normalFont; + MolesLabel.FontOverride = normalFont; + TemperatureLabel.FontOverride = normalFont; + TemperatureLimitLabel.FontOverride = normalFont; + WasteLabel.FontOverride = normalFont; + AbsorptionLabel.FontOverride = normalFont; + + IntegrityBarLabel.FontOverride = monoFont; + PowerBarLabel.FontOverride = monoFont; + RadiationBarLabel.FontOverride = monoFont; + MolesBarLabel.FontOverride = monoFont; + TemperatureBarLabel.FontOverride = monoFont; + TemperatureLimitBarLabel.FontOverride = monoFont; + WasteBarLabel.FontOverride = monoFont; + AbsorptionBarLabel.FontOverride = monoFont; + + var red = Palettes.Status.Critical; + var orange = Palettes.Status.Warning; + var green = Palettes.Status.Good; + var turqoise = Color.FromHex("#009893"); + + _engineDictionary = new Dictionary + { + { "integrity", new EngineBarEntry(IntegrityBarLabel, IntegrityBar, IntegrityBarBorder, 0.9f, 0.1f, red, orange, green) }, + { "power", new EngineBarEntry(PowerBarLabel, PowerBar, PowerBarBorder, 0.9f, 0.1f, green, orange, red) }, + { "radiation", new EngineBarEntry(RadiationBarLabel, RadiationBar, RadiationBarBorder, 0.1f, 0.9f, green, orange, red) }, + { "moles", new EngineBarEntry(MolesBarLabel, MolesBar, MolesBarBorder, 0.5f, 0.5f, green, orange, red) }, + { "temperature", new EngineBarEntry(TemperatureBarLabel, TemperatureBar, TemperatureBarBorder, 0.5f, 0.5f, turqoise, green, red) }, + { "waste", new EngineBarEntry(WasteBarLabel, WasteBar, WasteBarBorder, 0.5f, 0.5f, green, orange, red) } + }; + } + + public void UpdateEntry(SupermatterConsoleEntry entry, bool isFocus, SupermatterFocusData? focusData = null) + { + NetEntity = entry.NetEntity; + + // Update supermatter name + SupermatterNameLabel.Text = Loc.GetString("supermatter-console-window-label-sm", ("name", entry.EntityName)); + + // Update supermatter status + //SupermatterStatusLabel.Text = Loc.GetString(GetStatusLabel(entry.EntityStatus)); + //SupermatterStatusLabel.FontColorOverride = GetStatusColor(entry.EntityStatus); + + // Focus updates + FocusContainer.Visible = isFocus; + + if (isFocus) + { + if (focusData != null) + { + _engineDictionary["integrity"].Value = focusData.Value.Integrity; + _engineDictionary["power"].Value = focusData.Value.Power; + _engineDictionary["radiation"].Value = focusData.Value.Radiation; + _engineDictionary["moles"].Value = focusData.Value.AbsorbedMoles; + _engineDictionary["temperature"].Value = focusData.Value.Temperature; + _engineDictionary["waste"].Value = focusData.Value.WasteMultiplier; + + // Special cases + var powerBar = _engineDictionary["power"]; + var powerPrefix = powerBar.Value switch { >= 1000 => "G", >= 1 => "M", _ => "" }; + var powerMultiplier = powerBar.Value switch { >= 1000 => 0.001, >= 1 => 1, _ => 1000 }; + powerBar.Label.Text = Loc.GetString("supermatter-console-window-label-power-bar", ("power", (powerBar.Value * powerMultiplier).ToString("0.000")), ("prefix", powerPrefix)); + + var temperatureLimit = focusData.Value.TemperatureLimit; + TemperatureBar.MaxValue = temperatureLimit; + TemperatureLimitBarLabel.Text = Loc.GetString("supermatter-console-window-label-temperature-bar", ("temperature", temperatureLimit.ToString("0.00"))); + + var absorptionRatio = focusData.Value.AbsorptionRatio; + AbsorptionBarLabel.Text = Loc.GetString("supermatter-console-window-label-absorption-bar", ("absorption", absorptionRatio.ToString("0"))); + + // Update engine bars + foreach (var bar in _engineDictionary) + { + var current = bar.Value; + UpdateEngineBar(current.Bar, current.Border, current.Value, current.LeftSize, current.RightSize, current.LeftColor, current.MiddleColor, current.RightColor); + + if (bar.Key == "power") + continue; + + current.Label.Text = Loc.GetString("supermatter-console-window-label-" + bar.Key + "-bar", (bar.Key, current.Value.ToString("0.00"))); + } + + // Update gas bars + var atmosphereSystem = _entManager.System(); + var gases = atmosphereSystem.Gases.OrderByDescending(gas => GetStoredGas(gas, focusData)); + var index = 0; + + foreach (var gas in gases) + { + var name = gas.Name; + var color = Color.FromHex(gas.Color.StartsWith('#') ? gas.Color : $"#{gas.Color}"); + var value = GetStoredGas(gas, focusData) / focusData.Value.AbsorbedMoles * 100; + + //Log.Debug(string.Format("{0:N2}", value)); + + UpdateGasBar(index, GasTable, name, color, value); + index++; + } + } + } + } + + private static float GetStoredGas(GasPrototype gas, SupermatterFocusData? focusData) + { + var id = int.Parse(gas.ID); + + if (focusData == null) + return 0; + + return focusData.Value.GasStorage[(Gas)id]; + } + + private static void UpdateEngineBar(ProgressBar bar, PanelContainer border, float value, float leftSize, float rightSize, Color leftColor, Color middleColor, Color rightColor) + { + var clamped = Math.Clamp(value, bar.MinValue, bar.MaxValue); + + var normalized = clamped / bar.MaxValue; + var leftHsv = Color.ToHsv(leftColor); + var middleHsv = Color.ToHsv(middleColor); + var rightHsv = Color.ToHsv(rightColor); + + // Ensure leftSize and rightSize add up to 1.0 or the transition won't be smooth + var minColor = new Vector4(0, 0, 0, 0); + var maxColor = new Vector4(1, 1, 1, 1); + Color finalColor; + + if (normalized <= leftSize) + { + normalized /= leftSize; // Adjust range to 0.0 to 1.0 + var calcColor = Vector4.Lerp(leftHsv, middleHsv, normalized); + var clampedColor = Vector4.Clamp(calcColor, minColor, maxColor); + finalColor = Color.FromHsv(clampedColor); + } + + else + { + normalized = (normalized - leftSize) / rightSize; // Adjust range to 0.0 to 1.0 + var calcColor = Vector4.Lerp(middleHsv, rightHsv, normalized); + var clampedColor = Vector4.Clamp(calcColor, minColor, maxColor); + finalColor = Color.FromHsv(clampedColor); + } + + // Check if null first to avoid repeatedly creating this. + bar.ForegroundStyleBoxOverride ??= new StyleBoxFlat(); + border.PanelOverride ??= new StyleBoxFlat(); + + var barOverride = (StyleBoxFlat)bar.ForegroundStyleBoxOverride; + barOverride.BackgroundColor = finalColor; + + var panelOverride = (StyleBoxFlat)border.PanelOverride; + panelOverride.BackgroundColor = finalColor; + + bar.Value = clamped; + } + + private static void UpdateGasBar(int index, Control table, string name, Color color, float value) + { + // Make new UI entry if required + if (index >= table.ChildCount) + { + var newEntryContainer = new SupermatterGasBarContainer(); + + // Add the entry to the current table + table.AddChild(newEntryContainer); + } + + // Update values and UI elements + var tableChild = table.GetChild(index); + + if (tableChild is not SupermatterGasBarContainer) + { + table.RemoveChild(tableChild); + UpdateGasBar(index, table, name, color, value); + + return; + } + + var entryContainer = (SupermatterGasBarContainer)tableChild; + + entryContainer.UpdateEntry(name, color, value); + } + + private sealed class EngineBarEntry(Label label, ProgressBar bar, PanelContainer border, float leftSize, float rightSize, Color leftColor, Color middleColor, Color rightColor) + { + public readonly Label Label = label; + public readonly ProgressBar Bar = bar; + public readonly PanelContainer Border = border; + public float Value; + public readonly float LeftSize = leftSize; + public readonly float RightSize = rightSize; + public readonly Color LeftColor = leftColor; + public readonly Color MiddleColor = middleColor; + public readonly Color RightColor = rightColor; + } +} diff --git a/Modules/GoobStation/Content.Goobstation.Client/Supermatter/Consoles/SupermatterGasBarContainer.xaml b/Modules/GoobStation/Content.Goobstation.Client/Supermatter/Consoles/SupermatterGasBarContainer.xaml new file mode 100644 index 0000000000..1d119ceeab --- /dev/null +++ b/Modules/GoobStation/Content.Goobstation.Client/Supermatter/Consoles/SupermatterGasBarContainer.xaml @@ -0,0 +1,16 @@ + + + + + + diff --git a/Modules/GoobStation/Content.Goobstation.Client/Supermatter/Consoles/SupermatterGasBarContainer.xaml.cs b/Modules/GoobStation/Content.Goobstation.Client/Supermatter/Consoles/SupermatterGasBarContainer.xaml.cs new file mode 100644 index 0000000000..d4dc76e02c --- /dev/null +++ b/Modules/GoobStation/Content.Goobstation.Client/Supermatter/Consoles/SupermatterGasBarContainer.xaml.cs @@ -0,0 +1,48 @@ +using Robust.Client.AutoGenerated; +using Robust.Client.Graphics; +using Robust.Client.ResourceManagement; +using Robust.Client.UserInterface.Controls; +using Robust.Client.UserInterface.XAML; +using Robust.Shared.Maths; + +namespace Content.Goobstation.Client.Supermatter.Consoles; + +[GenerateTypedNameReferences] +public sealed partial class SupermatterGasBarContainer : BoxContainer +{ + private readonly IEntityManager _entManager; + private readonly IResourceCache _cache; + + public SupermatterGasBarContainer() + { + RobustXamlLoader.Load(this); + + _entManager = IoCManager.Resolve(); + _cache = IoCManager.Resolve(); + + // Load fonts + var normalFont = new VectorFont(_cache.GetResource("/Fonts/NotoSansDisplay/NotoSansDisplay-Regular.ttf"), 11); + var monoFont = new VectorFont(_cache.GetResource("/EngineFonts/NotoSans/NotoSansMono-Regular.ttf"), 10); + + // Set fonts + GasLabel.FontOverride = normalFont; + GasBarLabel.FontOverride = monoFont; + } + + public void UpdateEntry(string name, Color color, float value) + { + GasBar.Value = value; + GasLabel.Text = Loc.GetString(name) + ":"; + GasBarLabel.Text = Loc.GetString("supermatter-console-window-label-gas-bar", ("gas", value.ToString("0.00"))); + + // Check if null first to avoid repeatedly creating this. + GasBar.ForegroundStyleBoxOverride ??= new StyleBoxFlat(); + GasBarBorder.PanelOverride ??= new StyleBoxFlat(); + + var barOverride = (StyleBoxFlat)GasBar.ForegroundStyleBoxOverride; + barOverride.BackgroundColor = color; + + var borderOverride = (StyleBoxFlat)GasBarBorder.PanelOverride; + borderOverride.BackgroundColor = color; + } +} diff --git a/Modules/GoobStation/Content.Goobstation.Client/Supermatter/Systems/SupermatterSystem.cs b/Modules/GoobStation/Content.Goobstation.Client/Supermatter/Systems/SupermatterSystem.cs new file mode 100644 index 0000000000..c709edb1df --- /dev/null +++ b/Modules/GoobStation/Content.Goobstation.Client/Supermatter/Systems/SupermatterSystem.cs @@ -0,0 +1,21 @@ +using Content.Goobstation.Shared.Supermatter.Components; +using Content.Goobstation.Shared.Supermatter.Systems; +using Robust.Shared.GameStates; + +namespace Content.Goobstation.Client.Supermatter.Systems; + +public sealed class SupermatterSystem : SharedSupermatterSystem +{ + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(HandleSupermatterState); + } + + private void HandleSupermatterState(EntityUid uid, SupermatterComponent comp, ref ComponentHandleState args) + { + if (args.Current is not SupermatterComponentState) + return; + } +} diff --git a/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Consoles/SupermatterConsoleSystem.cs b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Consoles/SupermatterConsoleSystem.cs new file mode 100644 index 0000000000..649329cec5 --- /dev/null +++ b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Consoles/SupermatterConsoleSystem.cs @@ -0,0 +1,201 @@ +using Content.Server.Pinpointer; +using Content.Goobstation.Shared.Supermatter.Components; +using Content.Goobstation.Shared.Supermatter.Consoles; +using Content.Goobstation.Shared.Supermatter.Monitor; +using Content.Shared.Atmos; +using Content.Shared.Radiation.Components; +using Robust.Server.GameObjects; +using System.Linq; + +namespace Content.Goobstation.Server.Supermatter.Consoles; + +public sealed class SupermatterConsoleSystem : SharedSupermatterConsoleSystem +{ + [Dependency] private readonly UserInterfaceSystem _userInterfaceSystem = default!; + [Dependency] private readonly SharedAppearanceSystem _appearance = default!; + + private const float UpdateTime = 1.0f; + + public override void Initialize() + { + base.Initialize(); + + // Console events + SubscribeLocalEvent(OnConsoleInit); + SubscribeLocalEvent(OnConsoleParentChanged); + SubscribeLocalEvent(OnFocusChangedMessage); + + // Grid events + SubscribeLocalEvent(OnGridSplit); + } + + #region Event handling + + private void OnConsoleInit(EntityUid uid, SupermatterConsoleComponent component, ComponentInit args) + { + InitalizeConsole(uid, component); + } + + private void OnConsoleParentChanged(EntityUid uid, SupermatterConsoleComponent component, EntParentChangedMessage args) + { + InitalizeConsole(uid, component); + } + + private void OnFocusChangedMessage(EntityUid uid, SupermatterConsoleComponent component, SupermatterConsoleFocusChangeMessage args) + { + component.FocusSupermatter = args.FocusSupermatter; + } + + private void OnGridSplit(ref GridSplitEvent args) + { + // Collect grids + var allGrids = args.NewGrids.ToList(); + + if (!allGrids.Contains(args.Grid)) + allGrids.Add(args.Grid); + + // Update supermatter monitoring consoles that stand upon an updated grid + var query = AllEntityQuery(); + while (query.MoveNext(out var ent, out var entConsole, out var entXform)) + { + if (entXform.GridUid == null + || !allGrids.Contains(entXform.GridUid.Value)) + continue; + + InitalizeConsole(ent, entConsole); + } + } + + #endregion + + public override void Update(float frameTime) + { + base.Update(frameTime); + + // Keep a list of UI entries for each gridUid, in case multiple consoles stand on the same grid + var supermatterEntriesForEachGrid = new Dictionary(); + + var query = AllEntityQuery(); + while (query.MoveNext(out var ent, out var entConsole, out var entXform)) + { + if (entXform?.GridUid == null) + continue; + + // Make a list of alarm state data for all the supermatters on the grid + if (!supermatterEntriesForEachGrid.TryGetValue(entXform.GridUid.Value, out var supermatterEntries)) + { + supermatterEntries = [.. GetSupermatterStateData(entXform.GridUid.Value)]; + supermatterEntriesForEachGrid[entXform.GridUid.Value] = supermatterEntries; + } + + // Determine the highest level of status for the console + var highestStatus = SupermatterStatusType.Inactive; + + foreach (var entry in supermatterEntries) + { + var status = entry.EntityStatus; + + if (status > highestStatus) + highestStatus = status; + } + + // Update the appearance of the console based on the highest recorded level of alert + if (TryComp(ent, out var entAppearance)) + _appearance.SetData(ent, SupermatterConsoleVisuals.ComputerLayerScreen, (int)highestStatus, entAppearance); + + // If the console UI is open, send UI data to each subscribed session + UpdateUIState(ent, supermatterEntries, entConsole, entXform); + } + } + + public void UpdateUIState + (EntityUid uid, + SupermatterConsoleEntry[] supermatterStateData, + SupermatterConsoleComponent component, + TransformComponent xform) + { + if (!_userInterfaceSystem.IsUiOpen(uid, SupermatterConsoleUiKey.Key)) + return; + + var gridUid = xform.GridUid!.Value; + + // Gathering remaining data to be send to the client + var focusSupermatterData = GetFocusSupermatterData(GetEntity(component.FocusSupermatter), gridUid); + + // Set the UI state + _userInterfaceSystem.SetUiState(uid, SupermatterConsoleUiKey.Key, + new SupermatterConsoleBoundInterfaceState(supermatterStateData, focusSupermatterData)); + } + + private List GetSupermatterStateData(EntityUid gridUid) + { + var supermatterStateData = new List(); + + var querySupermatters = AllEntityQuery(); + while (querySupermatters.MoveNext(out var ent, out var entSupermatter, out var entXform)) + { + if (entXform.GridUid != gridUid + || !entXform.Anchored) + continue; + + // Create entry + var netEnt = GetNetEntity(ent); + + var entry = new SupermatterConsoleEntry + (netEnt, + MetaData(ent).EntityName, + entSupermatter.Status); + + supermatterStateData.Add(entry); + } + + return supermatterStateData; + } + + private SupermatterFocusData? GetFocusSupermatterData(EntityUid? focusSupermatter, EntityUid gridUid) + { + if (focusSupermatter == null) + return null; + + var focusSupermatterXform = Transform(focusSupermatter.Value); + + if (!focusSupermatterXform.Anchored + || focusSupermatterXform.GridUid != gridUid + || !TryComp(focusSupermatter.Value, out var sm) + || !TryComp(focusSupermatter.Value, out var radiationComp)) + return null; + + var gases = sm.GasStorage; + var tempThreshold = Atmospherics.T0C + sm.HeatPenaltyThreshold; + + return new SupermatterFocusData( + GetNetEntity(focusSupermatter.Value), + GetIntegrity(sm), + sm.Power, + radiationComp.Intensity, + gases.Sum(gas => gases[gas.Key]), + sm.Temperature, + tempThreshold * sm.DynamicHeatResistance, + sm.WasteMultiplier, + sm.GasEfficiency * 100, + sm.GasStorage); + } + + public static float GetIntegrity(SupermatterComponent sm) + { + var integrity = sm.Damage / sm.DelaminationPoint; + integrity = (float)Math.Round(100 - integrity * 100, 2); + integrity = integrity < 0 ? 0 : integrity; + return integrity; + } + + private void InitalizeConsole(EntityUid uid, SupermatterConsoleComponent component) + { + var xform = Transform(uid); + + if (xform.GridUid == null) + return; + + Dirty(uid, component); + } +} diff --git a/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.cs b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.cs new file mode 100644 index 0000000000..5a35b1b7f8 --- /dev/null +++ b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.cs @@ -0,0 +1,684 @@ +using Content.Goobstation.Shared.Supermatter.Components; +using Content.Goobstation.Shared.Supermatter.Systems; +using Content.Server.AlertLevel; +using Content.Server.Atmos.EntitySystems; +using Content.Server.Audio; +using Content.Server.Chat.Systems; +using Content.Server.DoAfter; +using Content.Server.Explosion.EntitySystems; +using Content.Server.Lightning; +using Content.Server.Station.Systems; +using Content.Shared.Administration.Logs; +using Content.Shared.Atmos; +using Content.Shared.Chat; +using Content.Shared.Database; +using Content.Shared.DoAfter; +using Content.Shared.Examine; +using Content.Shared.Interaction; +using Content.Shared.Kitchen.Components; +using Content.Shared.Mobs.Components; +using Content.Shared.Projectiles; +using Content.Shared.Radiation.Components; +using Robust.Server.GameObjects; +using Robust.Shared.Audio.Systems; +using Robust.Shared.Containers; +using Robust.Shared.Maths; +using Robust.Shared.Physics; +using Robust.Shared.Physics.Events; +using Robust.Shared.Timing; +using System.Linq; +using System.Text; + +namespace Content.Goobstation.Server.Supermatter.Systems; + +public sealed class SupermatterSystem : SharedSupermatterSystem +{ + [Dependency] private readonly AtmosphereSystem _atmosphere = default!; + [Dependency] private readonly ChatSystem _chat = default!; + [Dependency] private readonly SharedContainerSystem _container = default!; + [Dependency] private readonly ExplosionSystem _explosion = default!; + [Dependency] private readonly TransformSystem _xform = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] private readonly IGameTiming _gameTiming = default!; + [Dependency] private readonly AmbientSoundSystem _ambient = default!; + [Dependency] private readonly LightningSystem _lightning = default!; + [Dependency] private readonly AlertLevelSystem _alert = default!; + [Dependency] private readonly StationSystem _station = default!; + [Dependency] private readonly DoAfterSystem _doAfter = default!; + [Dependency] private readonly SharedTransformSystem _transform = default!; + [Dependency] private readonly ISharedAdminLogManager _adminLog = default!; + + private DelamType _delamType = DelamType.Explosion; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnComponentRemove); + SubscribeLocalEvent(OnMapInit); + + SubscribeLocalEvent(OnCollideEvent); + SubscribeLocalEvent(OnHandInteract); + SubscribeLocalEvent(OnItemInteract); + SubscribeLocalEvent(OnExamine); + SubscribeLocalEvent(OnGetSliver); + } + + private void OnComponentRemove(EntityUid uid, SupermatterComponent component, ComponentRemove args) + { + // turn off any ambient if component is removed (ex. entity deleted) + _ambient.SetAmbience(uid, false); + component.AudioStream = _audio.Stop(component.AudioStream); + } + + private void OnMapInit(EntityUid uid, SupermatterComponent component, MapInitEvent args) + { + // Set the Sound + _ambient.SetAmbience(uid, true); + + //Add Air to the initialized SM in the Map so it doesnt delam on default + var mix = _atmosphere.GetContainingMixture(uid, true, true); + mix?.AdjustMoles(Gas.Oxygen, Atmospherics.OxygenMolesStandard); + mix?.AdjustMoles(Gas.Nitrogen, Atmospherics.NitrogenMolesStandard); + } + + public override void Update(float frameTime) + { + base.Update(frameTime); + + if (!_gameTiming.IsFirstTimePredicted) + return; + + var smEqe = EntityManager.EntityQueryEnumerator(); + + while (smEqe.MoveNext(out var entity, out var comp)) + { + if (!comp.Activated) + continue; + + comp.UpdateAccumulator += frameTime; + + if (comp.UpdateAccumulator >= comp.UpdateTimer) + { + comp.UpdateAccumulator -= comp.UpdateTimer; + Cycle(entity, comp); + } + } + } + + public void Cycle(EntityUid ent, SupermatterComponent comp) + { + comp.ZapAccumulator++; + comp.YellAccumulator++; + + ProcessAtmos(ent, comp); + HandleDamage(ent, comp); + + if (comp.Damage >= comp.DelaminationPoint || comp.Delamming) + HandleDelamination(ent, comp); + + HandleSoundLoop(comp); + + if (comp.ZapAccumulator >= comp.ZapTimer) + { + comp.ZapAccumulator -= comp.ZapTimer; + SupermatterZap(ent, comp); + } + + if (comp.YellAccumulator >= comp.YellTimer) + { + comp.YellAccumulator -= comp.YellTimer; + HandleAnnouncements(ent, comp); + } + } + + #region Processing + + /// + /// Handle power and radiation output depending on atmospheric things. + /// + private void ProcessAtmos(EntityUid uid, SupermatterComponent sm) + { + var mix = _atmosphere.GetContainingMixture(uid, true, true); + + if (mix is not { }) + return; + + var absorbedGas = mix.Remove(sm.GasEfficiency * mix.TotalMoles); + var moles = absorbedGas.TotalMoles; + + if (!(moles > 0f)) + return; + + var gases = sm.GasStorage; + var facts = sm.GasDataFields; + + //Lets get the proportions of the gasses in the mix for scaling stuff later + //They range between 0 and 1 + gases = gases.ToDictionary( + gas => gas.Key, + gas => Math.Clamp(absorbedGas.GetMoles(gas.Key) / moles, 0, 1) + ); + + //No less then zero, and no greater then one, we use this to do explosions and heat to power transfer. + var powerRatio = gases.Sum(gas => gases[gas.Key] * facts[gas.Key].PowerMixRatio); + + // Minimum value of -10, maximum value of 23. Affects plasma, o2 and heat output. + var heatModifier = gases.Sum(gas => gases[gas.Key] * facts[gas.Key].HeatPenalty); + + // Minimum value of -10, maximum value of 23. Affects plasma, o2 and heat output. + var transmissionBonus = gases.Sum(gas => gases[gas.Key] * facts[gas.Key].TransmitModifier); + + var h2OBonus = 1 - gases[Gas.WaterVapor] * 0.25f; + + powerRatio = Math.Clamp(powerRatio, 0, 1); + heatModifier = Math.Max(heatModifier, 0.5f); + transmissionBonus *= h2OBonus; + + // Effects the damage heat does to the crystal + sm.DynamicHeatResistance = 1f; + + // more moles of gases are harder to heat than fewer, + // so let's scale heat damage around them + sm.MoleHeatPenaltyThreshold = (float)Math.Max(moles * sm.MoleHeatPenalty, 0.25); + + // Ramps up or down in increments of 0.02 up to the proportion of co2 + // Given infinite time, powerloss_dynamic_scaling = co2comp + // Some value between 0 and 1 + if (moles > sm.PowerlossInhibitionMoleThreshold && gases[Gas.CarbonDioxide] > sm.PowerlossInhibitionGasThreshold) + { + var co2powerloss = Math.Clamp(gases[Gas.CarbonDioxide] - sm.PowerlossDynamicScaling, -0.02f, 0.02f); + sm.PowerlossDynamicScaling = Math.Clamp(sm.PowerlossDynamicScaling + co2powerloss, 0f, 1f); + } + else + { + sm.PowerlossDynamicScaling = Math.Clamp(sm.PowerlossDynamicScaling - 0.05f, 0f, 1f); + } + + // Ranges from 0 to 1(1-(value between 0 and 1 * ranges from 1 to 1.5(mol / 500))) + // We take the mol count, and scale it to be our inhibitor + var powerlossInhibitor = + Math.Clamp( + 1 - sm.PowerlossDynamicScaling * + Math.Clamp(moles / sm.PowerlossInhibitionMoleBoostThreshold, 1f, 1.5f), + 0f, 1f); + + if (sm.MatterPower != 0) //We base our removed power off one 10th of the matter_power. + { + var removedMatter = Math.Max(sm.MatterPower / sm.MatterPowerConversion, 40); + //Adds at least 40 power + sm.Power = Math.Max(sm.Power + removedMatter, 0); + //Removes at least 40 matter power + sm.MatterPower = Math.Max(sm.MatterPower - removedMatter, 0); + } + + //based on gas mix, makes the power more based on heat or less effected by heat + var tempFactor = powerRatio > 0.8 ? 50f : 30f; + + //if there is more pluox and n2 then anything else, we receive no power increase from heat + sm.Power = Math.Max(absorbedGas.Temperature * tempFactor / Atmospherics.T0C * powerRatio + sm.Power, 0); + + //Radiate stuff + if (TryComp(uid, out var rad)) + { + var transmittedpower = sm.Power * Math.Max(0, 1f + transmissionBonus / 10f); + rad.Intensity = transmittedpower * sm.RadiationOutputFactor; + } + + //Power * 0.55 * a value between 1 and 0.8 + var energy = sm.Power * sm.ReactionPowerModifier; + + // Keep in mind we are only adding this temperature to (efficiency)% of the one tile the rock + // is on. An increase of 4*C @ 25% efficiency here results in an increase of 1*C / (#tilesincore) overall. + // Power * 0.55 * (some value between 1.5 and 23) / 5 + absorbedGas.Temperature += energy * heatModifier * sm.ThermalReleaseModifier; + absorbedGas.Temperature = Math.Max(0, + Math.Min(absorbedGas.Temperature, sm.HeatThreshold * heatModifier)); + + // Assmos - /tg/ gases + // Checks for carbon dioxide and spits out pluoxium if both CO2 and oxygen are present. + if (mix.GetMoles(Gas.CarbonDioxide) > 0.01f) + { + var co2PP = absorbedGas.Pressure * (mix.GetMoles(Gas.CarbonDioxide) / mix.TotalMoles * 100); + var co2Ratio = Math.Clamp(0.5f * (co2PP - 101.325f * 0.01f) / (co2PP + 101.325f * 0.25f), 0, 1); + var consumedCO2 = absorbedGas.GetMoles(Gas.CarbonDioxide) * co2Ratio; + consumedCO2 = Math.Min(consumedCO2, Math.Min(absorbedGas.GetMoles(Gas.Oxygen), absorbedGas.GetMoles(Gas.CarbonDioxide))); + + if (consumedCO2 > 0) + { + absorbedGas.AdjustMoles(Gas.CarbonDioxide, -consumedCO2); + absorbedGas.AdjustMoles(Gas.Oxygen, -consumedCO2); + } + } + // Assmos - /tg/ gases end + + // Release the waste + absorbedGas.AdjustMoles(Gas.Plasma, Math.Max(energy * heatModifier * sm.PlasmaReleaseModifier, 0f)); + absorbedGas.AdjustMoles(Gas.Oxygen, Math.Max((energy + absorbedGas.Temperature * heatModifier - Atmospherics.T0C) * sm.OxygenReleaseEfficiencyModifier, 0f)); + + _atmosphere.Merge(mix, absorbedGas); + + var powerReduction = (float)Math.Pow(sm.Power / 500, 3); + + // After this point power is lowered + // This wraps around to the begining of the function + sm.Power = Math.Max(sm.Power - Math.Min(powerReduction * powerlossInhibitor, sm.Power * 0.83f * powerlossInhibitor), 0f); + + sm.GasStorage = sm.GasStorage.ToDictionary( + gas => gas.Key, + gas => absorbedGas.GetMoles(gas.Key) + ); + + // Console Compatibility from EE + sm.Temperature = absorbedGas.Temperature; + sm.WasteMultiplier = heatModifier; + } + + /// + /// Shoot lightning bolts depensing on accumulated power. + /// + private void SupermatterZap(EntityUid uid, SupermatterComponent sm) + { + // Divide power by it's threshold to get a value from 0 to 1, then multiply by the amount of possible lightnings + // Makes it pretty obvious that if SM is shooting out red lightnings something is wrong. + // And if it shoots too weak lightnings it means that it's underfed. Feed the SM :godo: + var zapPower = sm.Power / sm.PowerPenaltyThreshold * sm.LightningPrototypes.Length; + var zapPowerNorm = (int)Math.Clamp(zapPower, 0, sm.LightningPrototypes.Length - 1); + _lightning.ShootRandomLightnings(uid, 3.5f, sm.Power > sm.PowerPenaltyThreshold ? 3 : 1, sm.LightningPrototypes[zapPowerNorm]); + } + + /// + /// Handles environmental damage. + /// + private void HandleDamage(EntityUid uid, SupermatterComponent sm) + { + var xform = Transform(uid); + var indices = _xform.GetGridOrMapTilePosition(uid, xform); + + sm.DamageArchived = sm.Damage; + + var mix = _atmosphere.GetContainingMixture(uid, true, true); + + // We're in space or there is no gas to process + if (!xform.GridUid.HasValue || mix is not { } || mix.TotalMoles == 0f) + { + sm.Damage += Math.Max(sm.Power / 1000 * sm.DamageIncreaseMultiplier, 0.1f); + return; + } + + // Absorbed gas from surrounding area + var absorbedGas = mix.Remove(sm.GasEfficiency * mix.TotalMoles); + var moles = absorbedGas.TotalMoles; + + var totalDamage = 0f; + + var tempThreshold = Atmospherics.T0C + sm.HeatPenaltyThreshold; + + // Temperature start to have a positive effect on damage after 350 + var tempDamage = Math.Max(Math.Clamp(moles / 200f, .5f, 1f) * absorbedGas.Temperature - tempThreshold * sm.DynamicHeatResistance, 0f) * sm.MoleHeatThreshold / 150f * sm.DamageIncreaseMultiplier; + totalDamage += tempDamage; + + // Power only starts affecting damage when it is above 5000 + var powerDamage = Math.Max(sm.Power - sm.PowerPenaltyThreshold, 0f) / 500f * sm.DamageIncreaseMultiplier; + totalDamage += powerDamage; + + // Molar count only starts affecting damage when it is above 1800 + var moleDamage = Math.Max(moles - sm.MolePenaltyThreshold, 0) / 80 * sm.DamageIncreaseMultiplier; + totalDamage += moleDamage; + + // Healing damage + if (moles < sm.MolePenaltyThreshold) + { + // left there a very small float value so that it doesn't eventually divide by 0. + var healHeatDamage = Math.Min(absorbedGas.Temperature - tempThreshold, 0.001f) / 150; + totalDamage += healHeatDamage; + } + + // Check for space tiles next to SM + // TODO: change moles out for checking if adjacent tiles exist + var enumerator = _atmosphere.GetAdjacentTileMixtures(xform.GridUid.Value, indices, false, false); + while (enumerator.MoveNext(out var ind)) + { + if (ind.TotalMoles != 0) + continue; + + var integrity = GetIntegrity(sm); + + // this is some magic number shit + var factor = integrity switch + { + < 10 => 0.0005f, + < 25 => 0.0009f, + < 45 => 0.005f, + < 75 => 0.002f, + _ => 0f + }; + + totalDamage += Math.Clamp(sm.Power * factor * sm.DamageIncreaseMultiplier, 0, sm.MaxSpaceExposureDamage); + + break; + } + + sm.Damage = Math.Min(sm.DamageArchived + sm.DamageHardcap * sm.DelaminationPoint, totalDamage); + + // Return the manipulated gas back to the mix + _atmosphere.Merge(mix, absorbedGas); + } + + /// + /// Handles announcements. + /// + private void HandleAnnouncements(EntityUid uid, SupermatterComponent sm) + { + var message = string.Empty; + var global = false; + + var integrity = GetIntegrity(sm).ToString("0.00"); + + // Special cases + if (sm.Damage < sm.DelaminationPoint && sm.Delamming) + { + message = Loc.GetString("supermatter-delam-cancel", ("integrity", integrity)); + sm.DelamAnnounced = false; + global = true; + } + if (sm.Delamming && !sm.DelamAnnounced) + { + var sb = new StringBuilder(); + var alertLevel = "yellow"; + + string? loc; + switch (_delamType) + { + case DelamType.Explosion: + default: + loc = "supermatter-delam-explosion"; + break; + + case DelamType.Singulo: + loc = "supermatter-delam-overmass"; + alertLevel = "delta"; + break; + + case DelamType.Tesla: + loc = "supermatter-delam-tesla"; + alertLevel = "delta"; + break; + + case DelamType.Cascade: + loc = "supermatter-delam-cascade"; + alertLevel = "delta"; + break; + } + + var station = _station.GetOwningStation(uid); + if (station != null) + _alert.SetLevel((EntityUid)station, alertLevel, true, true, true, false); + + sb.AppendLine(Loc.GetString(loc)); + sb.AppendLine(Loc.GetString("supermatter-seconds-before-delam", ("seconds", sm.DelamTimer))); + + message = sb.ToString(); + global = true; + sm.DelamAnnounced = true; + + SupermatterAnnouncement(uid, message, global); + return; + } + + // We are not taking consistent damage. Engis not needed. + if (sm.Damage <= sm.DamageArchived) + return; + + if (sm.Damage >= sm.WarningPoint) + { + message = Loc.GetString("supermatter-warning", ("integrity", integrity)); + if (sm.Damage >= sm.EmergencyPoint) + { + message = Loc.GetString("supermatter-emergency", ("integrity", integrity)); + global = true; + } + } + SupermatterAnnouncement(uid, message, global); + } + + /// + /// Help the SM announce something. + /// + /// If true, does the station announcement. + /// If true, sends the announcement from Central Command. + public void SupermatterAnnouncement(EntityUid uid, string message, bool global = false, string? customSender = null) + { + if (global) + { + var sender = customSender ?? Loc.GetString("supermatter-announcer"); + _chat.DispatchStationAnnouncement(uid, message, sender, colorOverride: Color.Yellow); + return; + } + _chat.TrySendInGameICMessage(uid, message, InGameICChatType.Speak, hideChat: false, checkRadioPrefix: true); + } + + /// + /// Returns the integrity rounded to hundreds, e.g. 100.00% + /// + public static float GetIntegrity(SupermatterComponent sm) + { + var integrity = sm.Damage / sm.DelaminationPoint; + integrity = (float)Math.Round(100 - integrity * 100, 2); + integrity = integrity < 0 ? 0 : integrity; + return integrity; + } + + /// + /// Decide on how to delaminate. + /// + public DelamType ChooseDelamType(EntityUid uid, SupermatterComponent sm) + { + var mix = _atmosphere.GetContainingMixture(uid, true, true); + + if (mix is { }) + { + // var absorbedGas = mix.Remove(sm.GasEfficiency * mix.TotalMoles); + var moles = mix.TotalMoles; + + if (moles >= sm.MolePenaltyThreshold) + return DelamType.Singulo; + } + + if (sm.Power >= sm.PowerPenaltyThreshold) + return DelamType.Tesla; + + // TODO: add resonance cascade when there's crazy conditions, or a destabilizing crystal :godo: + + return DelamType.Explosion; + } + + /// + /// Handle the end of the station. + /// + private void HandleDelamination(EntityUid uid, SupermatterComponent sm) + { + var xform = Transform(uid); + + _delamType = ChooseDelamType(uid, sm); + + if (!sm.Delamming) + { + sm.Delamming = true; + HandleAnnouncements(uid, sm); + } + if (sm.Damage < sm.DelaminationPoint && sm.Delamming) + { + sm.Delamming = false; + HandleAnnouncements(uid, sm); + } + + sm.DelamTimerAccumulator++; + + if (sm.DelamTimer > sm.DelamTimerAccumulator) + return; + + switch (_delamType) + { + case DelamType.Explosion: + default: + _explosion.TriggerExplosive(uid); + break; + + case DelamType.Singulo: + Spawn(sm.SingularityPrototypeId, xform.Coordinates); + break; + + case DelamType.Tesla: + Spawn(sm.TeslaPrototypeId, xform.Coordinates); + break; + + case DelamType.Cascade: + Spawn(sm.SupermatterKudzuPrototypeId, xform.Coordinates); + break; + } + } + + private void HandleSoundLoop(SupermatterComponent sm) + { + var isAggressive = sm.Damage > sm.WarningPoint; + var isDelamming = sm.Damage > sm.DelaminationPoint; + + if (!isAggressive && !isDelamming) + { + sm.AudioStream = _audio.Stop(sm.AudioStream); + return; + } + + var smSound = isDelamming ? SuperMatterSound.Delam : SuperMatterSound.Aggressive; + + if (sm.SmSound == smSound) + return; + + sm.AudioStream = _audio.Stop(sm.AudioStream); + sm.SmSound = smSound; + } + + #endregion + + + #region Event Handlers + + private void OnCollideEvent(EntityUid uid, SupermatterComponent sm, ref StartCollideEvent args) + { + var target = args.OtherEntity; + + // Stop immune entities from activating the sm. + if (args.OtherBody.BodyType == BodyType.Static + || HasComp(target) + || _container.IsEntityInContainer(uid)) + return; + + if (!sm.Activated) + { + // Extra logging for supermatter + var activator = ToPrettyString(args.OtherEntity); + + // Original log entry + //_adminLog.Add(LogType.Supermatter, impact, + // $"{activator:actor} activated Supermatter {ToPrettyString(uid):subject}"); + + // New admin alert + _adminLog.Add(LogType.AdminMessage, LogImpact.Extreme, + $"SUPERMATTER ACTIVATED BY {activator} AT {Transform(uid).Coordinates}"); + + sm.Activated = true; + } + + if (TryComp(target, out var food)) + sm.Power += food.Energy; + else if (TryComp(target, out var projectile)) + sm.Power += (float)projectile.Damage.GetTotal(); + else + sm.Power++; + + sm.MatterPower += HasComp(target) ? 200 : 0; + + if (!HasComp(target)) + { + //_adminLog.Add(LogType.Supermatter, LogImpact.Medium, $"Supermatter {ToPrettyString(uid)} has consumed {ToPrettyString(target)}"); + EntityManager.SpawnEntity("Ash", Transform(target).Coordinates); + _audio.PlayPvs(sm.DustSound, uid); + } + + EntityManager.QueueDeleteEntity(target); + } + + private void OnHandInteract(EntityUid uid, SupermatterComponent sm, ref InteractHandEvent args) + { + var target = args.User; + + if (HasComp(target)) + return; + + if (!sm.Activated) + sm.Activated = true; + + sm.MatterPower += 200; + + EntityManager.SpawnEntity("Ash", Transform(target).Coordinates); + _audio.PlayPvs(sm.DustSound, uid); + EntityManager.QueueDeleteEntity(target); + } + + private void OnItemInteract(EntityUid uid, SupermatterComponent sm, ref InteractUsingEvent args) + { + if (!HasComp(args.User)) + return; + + if (!sm.Activated) + sm.Activated = true; + + if (sm.SliverRemoved) + return; + + if (!HasComp(args.Used)) + return; + + var dae = new DoAfterArgs(EntityManager, args.User, 30f, new SupermatterDoAfterEvent(), uid) + { + BreakOnDamage = true, + BreakOnHandChange = false, + BreakOnMove = true, + BreakOnWeightlessMove = false, + NeedHand = true, + RequireCanInteract = true, + }; + + _doAfter.TryStartDoAfter(dae); + } + + private void OnGetSliver(EntityUid uid, SupermatterComponent sm, ref SupermatterDoAfterEvent args) + { + if (args.Cancelled) + return; + + // your criminal actions will not go unnoticed + sm.Damage += sm.DelaminationPoint / 10; + sm.DamageArchived += sm.DelaminationPoint / 10; + + var integrity = GetIntegrity(sm).ToString("0.00"); + SupermatterAnnouncement(uid, Loc.GetString("supermatter-announcement-cc-tamper", ("integrity", integrity)), true, "Central Command"); + + Spawn(sm.SliverPrototypeId, _transform.GetMapCoordinates(args.User)); + + if (sm.DelamTimer > 30f) + sm.DelamTimer -= 10f; + } + + private void OnExamine(EntityUid uid, SupermatterComponent sm, ref ExaminedEvent args) + { + // get all close and personal to it + if (args.IsInDetailsRange) + { + args.PushMarkup(Loc.GetString("supermatter-examine-integrity", ("integrity", GetIntegrity(sm).ToString("0.00")))); + } + } + + #endregion +} diff --git a/Modules/GoobStation/Content.Goobstation.Shared/Content.Goobstation.Shared.csproj b/Modules/GoobStation/Content.Goobstation.Shared/Content.Goobstation.Shared.csproj index c04cc9949c..145930baa9 100644 --- a/Modules/GoobStation/Content.Goobstation.Shared/Content.Goobstation.Shared.csproj +++ b/Modules/GoobStation/Content.Goobstation.Shared/Content.Goobstation.Shared.csproj @@ -10,6 +10,7 @@ + diff --git a/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Components/SupermatterComponent.cs b/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Components/SupermatterComponent.cs new file mode 100644 index 0000000000..6311eca495 --- /dev/null +++ b/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Components/SupermatterComponent.cs @@ -0,0 +1,408 @@ +using Content.Goobstation.Shared.Supermatter.Systems; +using Content.Goobstation.Shared.Supermatter.Monitor; +using Content.Shared.Atmos; +using Content.Shared.DoAfter; +using Content.Shared.Whitelist; +using Robust.Shared.Audio; +using Robust.Shared.GameStates; +using Robust.Shared.Serialization; + +namespace Content.Goobstation.Shared.Supermatter.Components; + +[RegisterComponent, NetworkedComponent] +public sealed partial class SupermatterComponent : Component +{ + #region SM Base + + /// + /// The SM will only cycle if activated. + /// + [DataField("activated")] + [ViewVariables(VVAccess.ReadWrite)] + public bool Activated = false; + + [DataField("supermatterSliverPrototype")] + public string SliverPrototypeId = "SupermatterSliver"; + + /// + /// Affects delamination timer. If removed - delamination timer is divided by 2. + /// + [DataField("sliverRemoved")] + [ViewVariables(VVAccess.ReadWrite)] + public bool SliverRemoved = false; + + [DataField("whitelist")] + public EntityWhitelist Whitelist = new(); + public string IdTag = "EmitterBolt"; + + public string[] LightningPrototypes = + [ + "Lightning", + "ChargedLightning", + "SuperchargedLightning", + "HyperchargedLightning" + ]; + + [DataField("singularitySpawnPrototype")] + public string SingularityPrototypeId = "Singularity"; + + [DataField("teslaSpawnPrototype")] + public string TeslaPrototypeId = "TeslaEnergyBall"; + + [DataField("supermatterKudzuSpawnPrototype")] + public string SupermatterKudzuPrototypeId = "SupermatterKudzu"; + + [ViewVariables(VVAccess.ReadWrite)] + public float Power; + + /// + /// EE Console Compatibility + /// + [ViewVariables(VVAccess.ReadWrite)] + public float Temperature; + + /// + /// EE Console Compatibility + /// + [ViewVariables(VVAccess.ReadWrite)] + public float WasteMultiplier; + + /// + /// The amount of damage we have currently + /// + [ViewVariables(VVAccess.ReadWrite)] + public float Damage = 0f; + + [ViewVariables(VVAccess.ReadWrite)] + public float MatterPower; + + [ViewVariables(VVAccess.ReadWrite)] + public float MatterPowerConversion = 10f; + + /// + /// The portion of the gasmix we're on + /// + [ViewVariables(VVAccess.ReadWrite)] + public float GasEfficiency = 0.15f; + + /// + /// The amount of heat we apply scaled + /// + [ViewVariables(VVAccess.ReadWrite)] + public float HeatThreshold = 2500f; + + [DataField("radiationOutputFactor")] + [ViewVariables(VVAccess.ReadWrite)] + public float RadiationOutputFactor = 0.03f; + #endregion SM Base + + #region SM Sound + /// + /// Current stream of SM audio. + /// + public EntityUid? AudioStream; + + public SharedSupermatterSystem.SuperMatterSound? SmSound; + + [DataField("dustSound")] + public SoundSpecifier DustSound = new SoundPathSpecifier("/Audio/_Goobstation/Wizard/supermatter.ogg"); + + [DataField("delamSound")] + public SoundSpecifier DelamSound = new SoundPathSpecifier("/Audio/_Goobstation/Supermatter/delamming.ogg"); + + [DataField("delamAlarm")] + public SoundSpecifier DelamAlarm = new SoundPathSpecifier("/Audio/Machines/alarm.ogg"); + + #endregion SM Sound + + #region SM Calculation + + /// + /// Based on co2 percentage, slowly moves between + /// 0 and 1. We use it to calc the powerloss_inhibitor + /// + [ViewVariables(VVAccess.ReadOnly)] + public float PowerlossDynamicScaling; + + /// + /// Affects the amount of damage and minimum point + /// at which the sm takes heat damage + /// + [ViewVariables(VVAccess.ReadOnly)] + public float DynamicHeatResistance = 1; + + /// + /// Multiplier on damage the core takes from absorbing hot gas + /// Default is ~1/350 + /// + [ViewVariables(VVAccess.ReadOnly)] + public float MoleHeatPenalty = 0.00286f; + + /// + /// Inverse of MoleHeatPenalty + /// + [ViewVariables(VVAccess.ReadOnly)] + public float MoleHeatThreshold = 350f; + + /// + /// Multiplier on power generated by nuclear reactions + /// + [ViewVariables(VVAccess.ReadOnly)] + [DataField("reactionpowerModifier")] + public float ReactionPowerModifier = 0.55f; + + /// + /// Acts as a multiplier on the amount that nuclear reactions increase the supermatter core temperature + /// + [ViewVariables(VVAccess.ReadWrite)] + [DataField("thermalreleaseModifier")] + public float ThermalReleaseModifier = 0.2f; + + /// + /// Multiplier on how much plasma is released during supermatter reactions + /// Default is ~1/750 + /// + [ViewVariables(VVAccess.ReadOnly)] + [DataField("plasmareleaseModifier")] + public float PlasmaReleaseModifier = 0.001333f; + + /// + /// Multiplier on how much oxygen is released during supermatter reactions. + /// Default is ~1/325 + /// + [ViewVariables(VVAccess.ReadOnly)] + [DataField("oxygenreleaseModifier")] + public float OxygenReleaseEfficiencyModifier = 0.0031f; + + #endregion SM Calculation + + #region SM Timer + + /// + /// The point at which we should start sending messeges + /// about the damage to the engi channels. + /// + [ViewVariables(VVAccess.ReadWrite)] + [DataField("WarningPoint")] + public float WarningPoint = 50; + + /// + /// The point at which we start sending messages to the common channel + /// + [ViewVariables(VVAccess.ReadWrite)] + [DataField("emergencyPoint")] + public float EmergencyPoint = 500; + + /// + /// we yell if over 50 damage every YellTimer Seconds + /// + [ViewVariables(VVAccess.ReadWrite)] + public float YellTimer = 60f; + + /// + /// set to YellTimer at first so it doesnt yell a minute after being hit + /// + [ViewVariables(VVAccess.ReadOnly)] + public float YellAccumulator = 60f; + + /// + /// Timer for delam + /// + [ViewVariables(VVAccess.ReadOnly)] + public float DelamTimerAccumulator; + + /// + /// Time until delam + /// + [ViewVariables(VVAccess.ReadWrite)] + [DataField("delamTimer")] + public float DelamTimer = 120f; + + /// + /// The message timer + /// + [ViewVariables(VVAccess.ReadWrite)] + public float SpeakAccumulator = 60f; + + [ViewVariables(VVAccess.ReadOnly)] + public float UpdateAccumulator = 0f; + + [ViewVariables(VVAccess.ReadWrite)] + public float UpdateTimer = 1f; + + [ViewVariables(VVAccess.ReadOnly)] + public float ZapAccumulator = 0f; + + [ViewVariables(VVAccess.ReadWrite)] + public float ZapTimer = 10f; + #endregion SM Timer + + #region SM Threshold + + /// + /// Higher == Higher percentage of inhibitor gas needed + /// before the charge inertia chain reaction effect starts. + /// + [ViewVariables(VVAccess.ReadOnly)] + [DataField("powerlossinhibitiongasThreshold")] + public float PowerlossInhibitionGasThreshold = 0.20f; + + /// + /// Higher == More moles of the gas are needed before the charge + /// inertia chain reaction effect starts. + /// Scales powerloss inhibition down until this amount of moles is reached + /// + [ViewVariables(VVAccess.ReadOnly)] + [DataField("powerlossinhibitionmoleThreshold")] + public float PowerlossInhibitionMoleThreshold = 20f; + + /// + /// bonus powerloss inhibition boost if this amount of moles is reached + /// + [ViewVariables(VVAccess.ReadOnly)] + [DataField("powerlossinhibitionmoleboostThreshold")] + public float PowerlossInhibitionMoleBoostThreshold = 500f; + + /// + /// Above this value we can get lord singulo and independent mol damage, + /// below it we can heal damage + /// + [ViewVariables(VVAccess.ReadOnly)] + [DataField("molepenaltyThreshold")] + public float MolePenaltyThreshold = 900f; + + /// + /// more moles of gases are harder to heat than fewer, + /// so let's scale heat damage around them + /// + [ViewVariables(VVAccess.ReadOnly)] + [DataField("moleheatpenaltyThreshold")] + public float MoleHeatPenaltyThreshold; + + /// + /// The cutoff on power properly doing damage, pulling shit around, + /// and delamming into a tesla. Low chance of pyro anomalies, +2 bolts of electricity + /// + [ViewVariables(VVAccess.ReadOnly)] + [DataField("powerPenaltyThreshold")] + public float PowerPenaltyThreshold = 2500f; + + /// + /// Maximum safe operational temperature in degrees Celsius. Supermatter begins taking damage above this temperature. + /// + [ViewVariables(VVAccess.ReadOnly)] + [DataField("heatpenaltyThreshold")] + public float HeatPenaltyThreshold = 40f; + + /// + /// The damage we had before this cycle. Used to limit the damage we can take each cycle, and for safe alert + /// + [ViewVariables(VVAccess.ReadWrite)] + public float DamageArchived = 0f; + + /// + /// is multiplied by ExplosionPoint to cap + /// evironmental damage per cycle + /// + [ViewVariables(VVAccess.ReadOnly)] + public float DamageHardcap = 0.002f; + + /// + /// environmental damage is scaled by this + /// + [ViewVariables(VVAccess.ReadOnly)] + [DataField("damageincreaseMultiplier")] + public float DamageIncreaseMultiplier = 0.25f; + + /// + /// if spaced sm wont take more than 2 damage per cycle + /// + [ViewVariables(VVAccess.ReadOnly)] + [DataField("maxspaceexposureDamage")] + public float MaxSpaceExposureDamage = 2; + + #endregion SM Threshold + + #region SM Delamm + + public bool DelamAnnounced = false; + + /// + /// The point at which we delamm + /// + [ViewVariables(VVAccess.ReadOnly)] + [DataField("explosionPoint")] + public int DelaminationPoint = 900; + + //Are we delamming? + [ViewVariables(VVAccess.ReadOnly)] + public bool Delamming = false; + + //Explosion totalIntensity value + [ViewVariables(VVAccess.ReadOnly)] + [DataField("totalIntensity")] + public float TotalIntensity = 50000f; + + //Explosion radius value + [ViewVariables(VVAccess.ReadOnly)] + [DataField("radius")] + public float Radius = 50f; + + /// + /// These would be what you would get at point blank, decreases with distance + /// + [ViewVariables(VVAccess.ReadOnly)] + [DataField("detonationRads")] + public float DetonationRads = 200f; + + #endregion SM Delamm + + #region SM Gas + /// + /// Is used to store gas + /// + [ViewVariables(VVAccess.ReadOnly)] + [DataField("gasStorage")] + public Dictionary GasStorage = new() + { + {Gas.Oxygen, 0f}, + {Gas.Nitrogen, 0f}, + {Gas.CarbonDioxide, 0f}, + {Gas.Plasma, 0f}, + {Gas.Tritium, 0f}, + {Gas.WaterVapor, 0f}, + {Gas.Frezon, 0f }, // EE Compatibility + {Gas.Ammonia, 0f }, // EE Compatibility + {Gas.NitrousOxide, 0f }, // EE Compatibility + }; + + /// + /// Stores each gas facts + /// + public readonly Dictionary GasDataFields = new() + { + [Gas.Oxygen] = (TransmitModifier: 1.5f, HeatPenalty: 1f, PowerMixRatio: 1f), + [Gas.Nitrogen] = (TransmitModifier: 0f, HeatPenalty: -1.5f, PowerMixRatio: -1f), + [Gas.CarbonDioxide] = (TransmitModifier: 0f, HeatPenalty: 0.1f, PowerMixRatio: 1f), + [Gas.Plasma] = (TransmitModifier: 4f, HeatPenalty: 15f, PowerMixRatio: 1f), + [Gas.Tritium] = (TransmitModifier: 30f, HeatPenalty: 10f, PowerMixRatio: 1f), + [Gas.WaterVapor] = (TransmitModifier: 2f, HeatPenalty: 12f, PowerMixRatio: 1f), + [Gas.Frezon] = (TransmitModifier: 3f, HeatPenalty: -10f, PowerMixRatio: -1f), + [Gas.Ammonia] = (TransmitModifier: 0f, HeatPenalty: .5f, PowerMixRatio: 1f), + [Gas.NitrousOxide] = (TransmitModifier: 0f, HeatPenalty: -5f, PowerMixRatio: -1f), + }; + + #endregion SM Gas + + #region EE + + [DataField] + public SupermatterStatusType Status = SupermatterStatusType.Inactive; + #endregion EE +} + +[Serializable, NetSerializable] +public sealed partial class SupermatterDoAfterEvent : SimpleDoAfterEvent +{ + +} diff --git a/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Components/SupermatterFoodComponent.cs b/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Components/SupermatterFoodComponent.cs new file mode 100644 index 0000000000..ef5070cb5f --- /dev/null +++ b/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Components/SupermatterFoodComponent.cs @@ -0,0 +1,9 @@ +namespace Content.Goobstation.Shared.Supermatter.Components; + +[RegisterComponent] +public sealed partial class SupermatterFoodComponent : Component +{ + [ViewVariables(VVAccess.ReadWrite)] + [DataField("energy")] + public int Energy { get; set; } = 1; +} diff --git a/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Components/SupermatterImmuneComponent.cs b/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Components/SupermatterImmuneComponent.cs new file mode 100644 index 0000000000..b3cfe88954 --- /dev/null +++ b/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Components/SupermatterImmuneComponent.cs @@ -0,0 +1,9 @@ +using Robust.Shared.GameStates; + +namespace Content.Goobstation.Shared.Supermatter.Components; + +[RegisterComponent, NetworkedComponent] +public sealed partial class SupermatterImmuneComponent : Component +{ + +} diff --git a/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Consoles/SharedSupermatterConsoleSystem.cs b/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Consoles/SharedSupermatterConsoleSystem.cs new file mode 100644 index 0000000000..f37b5df82e --- /dev/null +++ b/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Consoles/SharedSupermatterConsoleSystem.cs @@ -0,0 +1,4 @@ +namespace Content.Goobstation.Shared.Supermatter.Consoles; + +public abstract partial class SharedSupermatterConsoleSystem : EntitySystem +{ } diff --git a/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Consoles/SupermatterConsoleComponent.cs b/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Consoles/SupermatterConsoleComponent.cs new file mode 100644 index 0000000000..ca9bbca4e3 --- /dev/null +++ b/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Consoles/SupermatterConsoleComponent.cs @@ -0,0 +1,168 @@ +using Content.Goobstation.Shared.Supermatter.Consoles; +using Content.Goobstation.Shared.Supermatter.Monitor; +using Content.Shared.Atmos; +using Robust.Shared.GameStates; +using Robust.Shared.Map; +using Robust.Shared.Serialization; + +namespace Content.Goobstation.Shared.Supermatter.Consoles; + +[RegisterComponent, NetworkedComponent] +[Access(typeof(SharedSupermatterConsoleSystem))] +public sealed partial class SupermatterConsoleComponent : Component +{ + /// + /// The current entity of interest (selected via the console UI) + /// + [ViewVariables] + public NetEntity? FocusSupermatter; +} + +/// +/// Populate the supermatter console nav map with a single entity +/// +[Serializable, NetSerializable] +public struct SupermatterNavMapData(NetEntity netEntity, NetCoordinates netCoordinates) +{ + /// + /// The entity in question + /// + public NetEntity NetEntity = netEntity; + + /// + /// Location of the entity + /// + public NetCoordinates NetCoordinates = netCoordinates; +} + +/// +/// Populates the supermatter console focus entry with supermatter data +/// +[Serializable, NetSerializable] +public struct SupermatterFocusData(NetEntity netEntity, + float integrity, + float power, + float radiation, + float absorbedMoles, + float temperature, + float temperatureLimit, + float wasteMultiplier, + float absorptionRatio, + Dictionary gasStorage) +{ + /// + /// Focus entity + /// + public NetEntity NetEntity = netEntity; + + /// + /// The supermatter's integrity, from 0 to 100 + /// + public float Integrity = integrity; + + /// + /// The supermatter's power + /// + public float Power = power; + + /// + /// The supermatter's emitted radiation + /// + public float Radiation = radiation; + + /// + /// The supermatter's total absorbed moles + /// + public float AbsorbedMoles = absorbedMoles; + + /// + /// The supermatter's temperature + /// + public float Temperature = temperature; + + /// + /// The supermatter's temperature limit + /// + public float TemperatureLimit = temperatureLimit; + + /// + /// The supermatter's waste multiplier + /// + public float WasteMultiplier = wasteMultiplier; + + /// + /// The supermatter's absorption ratio + /// + public float AbsorptionRatio = absorptionRatio; + + /// + /// The supermatter's gas storage + /// + [DataField] + public Dictionary GasStorage = gasStorage; +} + +/// +/// Sends data from the server to the client to populate the atmos monitoring console UI +/// +[Serializable, NetSerializable] +public sealed class SupermatterConsoleBoundInterfaceState(SupermatterConsoleEntry[] supermatters, SupermatterFocusData? focusData) : BoundUserInterfaceState +{ + /// + /// A list of all supermatters + /// + public SupermatterConsoleEntry[] Supermatters = supermatters; + + /// + /// Data for the UI focus (if applicable) + /// + public SupermatterFocusData? FocusData = focusData; +} + +/// +/// Used to populate the supermatter console UI with data from a single supermatter +/// +[Serializable, NetSerializable] +public struct SupermatterConsoleEntry(NetEntity entity, + string entityName, + SupermatterStatusType status) +{ + /// + /// The entity in question + /// + public NetEntity NetEntity = entity; + + /// + /// Name of the entity + /// + public string EntityName = entityName; + + /// + /// Current alert level + /// + public SupermatterStatusType EntityStatus = status; +} + +/// +/// Used to inform the server that the specified focus for the atmos monitoring console has been changed by the client +/// +[Serializable, NetSerializable] +public sealed class SupermatterConsoleFocusChangeMessage(NetEntity? focusSupermatter) : BoundUserInterfaceMessage +{ + public NetEntity? FocusSupermatter = focusSupermatter; +} + +[NetSerializable, Serializable] +public enum SupermatterConsoleVisuals +{ + ComputerLayerScreen, +} + +/// +/// UI key associated with the supermatter monitoring console +/// +[Serializable, NetSerializable] +public enum SupermatterConsoleUiKey +{ + Key +} diff --git a/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Monitor/SupermatterStatusType.cs b/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Monitor/SupermatterStatusType.cs new file mode 100644 index 0000000000..e748889f0b --- /dev/null +++ b/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Monitor/SupermatterStatusType.cs @@ -0,0 +1,16 @@ +using Robust.Shared.Serialization; + +namespace Content.Goobstation.Shared.Supermatter.Monitor; + +[Serializable, NetSerializable] +public enum SupermatterStatusType : sbyte +{ + Error = -1, + Inactive = 0, + Normal = 1, + Caution = 2, + Warning = 3, + Danger = 4, + Emergency = 5, + Delaminating = 6 +} diff --git a/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Systems/SharedSupermatterSystem.cs b/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Systems/SharedSupermatterSystem.cs new file mode 100644 index 0000000000..e61910f382 --- /dev/null +++ b/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Systems/SharedSupermatterSystem.cs @@ -0,0 +1,47 @@ +using Content.Goobstation.Shared.Supermatter.Components; +using Robust.Shared.Serialization; + +namespace Content.Goobstation.Shared.Supermatter.Systems; + +public abstract class SharedSupermatterSystem : EntitySystem +{ + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnSupermatterStartup); + } + + public enum SuperMatterSound : sbyte + { + Aggressive = 0, + Delam = 1 + } + + public enum DelamType : sbyte + { + Explosion = 0, + Singulo = 1, + Tesla = 2, + Cascade = 3 + } + #region Getters/Setters + + public static void OnSupermatterStartup(EntityUid uid, SupermatterComponent comp, ComponentStartup args) + { + } + + #endregion Getters/Setters + + #region Serialization + /// + /// A state wrapper used to sync the supermatter between the server and client. + /// + [Serializable, NetSerializable] + protected sealed class SupermatterComponentState(SupermatterComponent supermatter) : ComponentState + { + private readonly SupermatterComponent _supermatter = supermatter; + } + + #endregion Serialization + +} From 7120b83951f524eadb42ee89193029dacd9b1ad4 Mon Sep 17 00:00:00 2001 From: SX-7 Date: Sat, 21 Feb 2026 21:23:32 +0100 Subject: [PATCH 02/16] Improve effect functions of SM, remove monitors --- .../Content.Goobstation.Client.csproj | 4 + .../SupermatterConsoleBoundUserInterface.cs | 31 --- .../Consoles/SupermatterConsoleWindow.xaml | 34 --- .../Consoles/SupermatterConsoleWindow.xaml.cs | 249 ------------------ .../Consoles/SupermatterEntryContainer.xaml | 106 -------- .../SupermatterEntryContainer.xaml.cs | 243 ----------------- .../Consoles/SupermatterGasBarContainer.xaml | 16 -- .../SupermatterGasBarContainer.xaml.cs | 48 ---- .../Consoles/SupermatterConsoleSystem.cs | 201 -------------- .../Supermatter/Systems/SupermatterSystem.cs | 178 +++++++------ .../Components/SupermatterComponent.cs | 105 ++++---- .../Monitor/SupermatterStatusType.cs | 16 -- 12 files changed, 162 insertions(+), 1069 deletions(-) delete mode 100644 Modules/GoobStation/Content.Goobstation.Client/Supermatter/Consoles/SupermatterConsoleBoundUserInterface.cs delete mode 100644 Modules/GoobStation/Content.Goobstation.Client/Supermatter/Consoles/SupermatterConsoleWindow.xaml delete mode 100644 Modules/GoobStation/Content.Goobstation.Client/Supermatter/Consoles/SupermatterConsoleWindow.xaml.cs delete mode 100644 Modules/GoobStation/Content.Goobstation.Client/Supermatter/Consoles/SupermatterEntryContainer.xaml delete mode 100644 Modules/GoobStation/Content.Goobstation.Client/Supermatter/Consoles/SupermatterEntryContainer.xaml.cs delete mode 100644 Modules/GoobStation/Content.Goobstation.Client/Supermatter/Consoles/SupermatterGasBarContainer.xaml delete mode 100644 Modules/GoobStation/Content.Goobstation.Client/Supermatter/Consoles/SupermatterGasBarContainer.xaml.cs delete mode 100644 Modules/GoobStation/Content.Goobstation.Server/Supermatter/Consoles/SupermatterConsoleSystem.cs delete mode 100644 Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Monitor/SupermatterStatusType.cs diff --git a/Modules/GoobStation/Content.Goobstation.Client/Content.Goobstation.Client.csproj b/Modules/GoobStation/Content.Goobstation.Client/Content.Goobstation.Client.csproj index 303f596a9b..5b45092236 100644 --- a/Modules/GoobStation/Content.Goobstation.Client/Content.Goobstation.Client.csproj +++ b/Modules/GoobStation/Content.Goobstation.Client/Content.Goobstation.Client.csproj @@ -20,6 +20,10 @@ + + + + diff --git a/Modules/GoobStation/Content.Goobstation.Client/Supermatter/Consoles/SupermatterConsoleBoundUserInterface.cs b/Modules/GoobStation/Content.Goobstation.Client/Supermatter/Consoles/SupermatterConsoleBoundUserInterface.cs deleted file mode 100644 index 5c8c5901e0..0000000000 --- a/Modules/GoobStation/Content.Goobstation.Client/Supermatter/Consoles/SupermatterConsoleBoundUserInterface.cs +++ /dev/null @@ -1,31 +0,0 @@ -using Content.Goobstation.Shared.Supermatter.Consoles; - -namespace Content.Goobstation.Client.Supermatter.Consoles; - -public sealed class SupermatterConsoleBoundUserInterface(EntityUid owner, Enum uiKey) : BoundUserInterface(owner, uiKey) -{ - [ViewVariables] - private SupermatterConsoleWindow? _menu; - - protected override void Open() - { - base.Open(); - - _menu = new SupermatterConsoleWindow(this, Owner); - _menu.OpenCentered(); - _menu.OnClose += Close; - } - - protected override void UpdateState(BoundUserInterfaceState state) - { - base.UpdateState(state); - - var castState = (SupermatterConsoleBoundInterfaceState)state; - _menu?.UpdateUI(castState.Supermatters, castState.FocusData); - } - - public void SendFocusChangeMessage(NetEntity? netEntity) - { - SendMessage(new SupermatterConsoleFocusChangeMessage(netEntity)); - } -} diff --git a/Modules/GoobStation/Content.Goobstation.Client/Supermatter/Consoles/SupermatterConsoleWindow.xaml b/Modules/GoobStation/Content.Goobstation.Client/Supermatter/Consoles/SupermatterConsoleWindow.xaml deleted file mode 100644 index f817172483..0000000000 --- a/Modules/GoobStation/Content.Goobstation.Client/Supermatter/Consoles/SupermatterConsoleWindow.xaml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Modules/GoobStation/Content.Goobstation.Client/Supermatter/Consoles/SupermatterConsoleWindow.xaml.cs b/Modules/GoobStation/Content.Goobstation.Client/Supermatter/Consoles/SupermatterConsoleWindow.xaml.cs deleted file mode 100644 index 76e8ba9491..0000000000 --- a/Modules/GoobStation/Content.Goobstation.Client/Supermatter/Consoles/SupermatterConsoleWindow.xaml.cs +++ /dev/null @@ -1,249 +0,0 @@ -using Content.Client.Message; -using Content.Client.Stylesheets; -using Content.Client.Stylesheets.Palette; -using Content.Client.Stylesheets.Sheetlets; -using Content.Client.UserInterface.Controls; -using Content.Goobstation.Shared.Supermatter.Consoles; -using Content.Goobstation.Shared.Supermatter.Components; -using Content.Goobstation.Shared.Supermatter.Monitor; -using Content.Shared.Pinpointer; -using Robust.Client.AutoGenerated; -using Robust.Client.GameObjects; -using Robust.Client.UserInterface; -using Robust.Client.UserInterface.Controls; -using Robust.Client.UserInterface.XAML; -using Robust.Shared.Maths; -using Robust.Shared.Timing; -using Robust.Shared.Utility; -using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; -using System.Linq; - -namespace Content.Goobstation.Client.Supermatter.Consoles; - -[GenerateTypedNameReferences] -public sealed partial class SupermatterConsoleWindow : FancyWindow -{ - private readonly IEntityManager _entManager; - private readonly SpriteSystem _spriteSystem; - private readonly SharedNavMapSystem _navMapSystem; - - private readonly EntityUid? _owner; - private NetEntity? _trackedEntity; - - private SupermatterConsoleEntry[]? _supermatters = null; - - public event Action? SendFocusChangeMessageAction; - - private bool _autoScrollActive = false; - private bool _autoScrollAwaitsUpdate = false; - - // Colors - private Color _wallColor = new(64, 64, 64); - private Color _tileColor = new(28, 28, 28); - private Color _monitorBlipColor = Color.Cyan; - private Color _untrackedEntColor = Color.DimGray; - private Color _regionBaseColor = new(154, 154, 154); - private Color _inactiveColor = Color.DarkGray; - private Color _statusTextColor = Palettes.Status.Good; - private Color _goodColor = Color.LimeGreen; - private Color _warningColor = new(255, 182, 72); - private Color _dangerColor = new(255, 67, 67); - - public SupermatterConsoleWindow(SupermatterConsoleBoundUserInterface userInterface, EntityUid? owner) - { - RobustXamlLoader.Load(this); - _entManager = IoCManager.Resolve(); - _spriteSystem = _entManager.System(); - _navMapSystem = _entManager.System(); - - // Pass the owner to nav map - _owner = owner; - - // Set supermatter monitoring message action - SendFocusChangeMessageAction += userInterface.SendFocusChangeMessage; - } - - public void UpdateUI(SupermatterConsoleEntry[] supermatters, SupermatterFocusData? focusData) - { - if (_owner == null - || !_entManager.TryGetComponent(_owner.Value, out var console)) - return; - - if (_trackedEntity != focusData?.NetEntity) - { - SendFocusChangeMessageAction?.Invoke(_trackedEntity); - focusData = null; - } - - // Retain supermatter data for use inbetween updates - _supermatters = supermatters; - - // Clear excess children from the tables - var supermattersCount = _supermatters.Length; - - while (SupermattersTable.ChildCount > supermattersCount) - SupermattersTable.RemoveChild(SupermattersTable.GetChild(SupermattersTable.ChildCount - 1)); - - // Update all entries in each table - for (var index = 0; index < _supermatters.Length; index++) - { - var entry = _supermatters.ElementAt(index); - UpdateUIEntry(entry, index, SupermattersTable, console, focusData); - } - - // If no alerts are active, display a message - if (supermattersCount == 0) - { - var label = new RichTextLabel() - { - HorizontalExpand = true, - VerticalExpand = true, - HorizontalAlignment = HAlignment.Center, - VerticalAlignment = VAlignment.Center, - }; - - label.SetMarkup(Loc.GetString("supermatter-console-window-no-supermatters")); - - SupermattersTable.AddChild(label); - } - - // Auto-scroll re-enable - if (_autoScrollAwaitsUpdate) - { - _autoScrollActive = true; - _autoScrollAwaitsUpdate = false; - } - } - - private void UpdateUIEntry(SupermatterConsoleEntry entry, int index, Control table, SupermatterConsoleComponent console, SupermatterFocusData? focusData = null) - { - // Make new UI entry if required - if (index >= table.ChildCount) - { - var newEntryContainer = new SupermatterEntryContainer(entry.NetEntity); - - // On click - newEntryContainer.FocusButton.OnButtonUp += args => - { - if (_trackedEntity == newEntryContainer.NetEntity) - _trackedEntity = null; - else - _trackedEntity = newEntryContainer.NetEntity; - - // Send message to console that the focus has changed - SendFocusChangeMessageAction?.Invoke(_trackedEntity); - }; - - // Add the entry to the current table - table.AddChild(newEntryContainer); - } - - // Update values and UI elements - var tableChild = table.GetChild(index); - - if (tableChild is not SupermatterEntryContainer) - { - table.RemoveChild(tableChild); - UpdateUIEntry(entry, index, table, console, focusData); - - return; - } - - var entryContainer = (SupermatterEntryContainer)tableChild; - - entryContainer.UpdateEntry(entry, entry.NetEntity == _trackedEntity, focusData); - } - - protected override void FrameUpdate(FrameEventArgs args) - { - AutoScrollToFocus(); - } - - private void ActivateAutoScrollToFocus() - { - _autoScrollActive = false; - _autoScrollAwaitsUpdate = true; - } - - private void AutoScrollToFocus() - { - if (!_autoScrollActive) - return; - - if (SupermattersTable.Parent is not ScrollContainer scroll - || !TryGetVerticalScrollbar(scroll, out var vScrollbar) - || !TryGetNextScrollPosition(out var nextScrollPosition)) - return; - - vScrollbar.ValueTarget = nextScrollPosition.Value; - - if (MathHelper.CloseToPercent(vScrollbar.Value, vScrollbar.ValueTarget)) - _autoScrollActive = false; - } - - private static bool TryGetVerticalScrollbar(ScrollContainer scroll, [NotNullWhen(true)] out VScrollBar? vScrollBar) - { - vScrollBar = null; - - foreach (var child in scroll.Children) - { - if (child is not VScrollBar) - continue; - - - if (child is VScrollBar castChild) - { - vScrollBar = castChild; - return true; - } - } - - return false; - } - - private bool TryGetNextScrollPosition([NotNullWhen(true)] out float? nextScrollPosition) - { - nextScrollPosition = null; - - if (SupermattersTable.Parent is not ScrollContainer scroll) - return false; - - if (scroll.Children.ElementAt(0) is not BoxContainer container - || !container.Children.Any()) - return false; - - // Exit if the heights of the children haven't been initialized yet - if (!container.Children.Any(x => x.Height > 0)) - return false; - - nextScrollPosition = 0; - - foreach (var control in container.Children) - { - if (control == null - || control is not SupermatterEntryContainer) - continue; - - if (((SupermatterEntryContainer)control).NetEntity == _trackedEntity) - return true; - - nextScrollPosition += control.Height; - } - - // Failed to find control - nextScrollPosition = null; - - return false; - } - - private SupermatterStatusType GetStatus(NetEntity netEntity) - { - var status = _supermatters?.FirstOrNull(x => x.NetEntity == netEntity)?.EntityStatus; - - if (status == null) - return SupermatterStatusType.Error; - - return status.Value; - } -} diff --git a/Modules/GoobStation/Content.Goobstation.Client/Supermatter/Consoles/SupermatterEntryContainer.xaml b/Modules/GoobStation/Content.Goobstation.Client/Supermatter/Consoles/SupermatterEntryContainer.xaml deleted file mode 100644 index d4dcb80ae4..0000000000 --- a/Modules/GoobStation/Content.Goobstation.Client/Supermatter/Consoles/SupermatterEntryContainer.xaml +++ /dev/null @@ -1,106 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Modules/GoobStation/Content.Goobstation.Client/Supermatter/Consoles/SupermatterEntryContainer.xaml.cs b/Modules/GoobStation/Content.Goobstation.Client/Supermatter/Consoles/SupermatterEntryContainer.xaml.cs deleted file mode 100644 index c69560c0cc..0000000000 --- a/Modules/GoobStation/Content.Goobstation.Client/Supermatter/Consoles/SupermatterEntryContainer.xaml.cs +++ /dev/null @@ -1,243 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using System.Numerics; -using Content.Client.Atmos.EntitySystems; -using Content.Client.Stylesheets; -using Content.Client.Stylesheets.Palette; -using Content.Goobstation.Shared.Supermatter.Components; -using Content.Goobstation.Shared.Supermatter.Consoles; -using Content.Shared.Atmos; -using Content.Shared.Atmos.Prototypes; -using Robust.Client.AutoGenerated; -using Robust.Client.Graphics; -using Robust.Client.ResourceManagement; -using Robust.Client.UserInterface; -using Robust.Client.UserInterface.Controls; -using Robust.Client.UserInterface.XAML; -using Robust.Shared.Maths; - -namespace Content.Goobstation.Client.Supermatter.Consoles; - -[GenerateTypedNameReferences] -public sealed partial class SupermatterEntryContainer : BoxContainer -{ - public NetEntity NetEntity; - - private readonly IEntityManager _entManager; - private readonly Dictionary _engineDictionary; - - public SupermatterEntryContainer(NetEntity uid) - { - RobustXamlLoader.Load(this); - - _entManager = IoCManager.Resolve(); - var cache = IoCManager.Resolve(); - - NetEntity = uid; - - // Load fonts - var normalFont = new VectorFont(cache.GetResource("/Fonts/NotoSansDisplay/NotoSansDisplay-Regular.ttf"), 11); - var monoFont = new VectorFont(cache.GetResource("/EngineFonts/NotoSans/NotoSansMono-Regular.ttf"), 10); - - // Set fonts - //SupermatterNameLabel.FontOverride = headerFont; - - //SupermatterStatusLabel.FontOverride = normalFont; - - IntegrityLabel.FontOverride = normalFont; - PowerLabel.FontOverride = normalFont; - RadiationLabel.FontOverride = normalFont; - MolesLabel.FontOverride = normalFont; - TemperatureLabel.FontOverride = normalFont; - TemperatureLimitLabel.FontOverride = normalFont; - WasteLabel.FontOverride = normalFont; - AbsorptionLabel.FontOverride = normalFont; - - IntegrityBarLabel.FontOverride = monoFont; - PowerBarLabel.FontOverride = monoFont; - RadiationBarLabel.FontOverride = monoFont; - MolesBarLabel.FontOverride = monoFont; - TemperatureBarLabel.FontOverride = monoFont; - TemperatureLimitBarLabel.FontOverride = monoFont; - WasteBarLabel.FontOverride = monoFont; - AbsorptionBarLabel.FontOverride = monoFont; - - var red = Palettes.Status.Critical; - var orange = Palettes.Status.Warning; - var green = Palettes.Status.Good; - var turqoise = Color.FromHex("#009893"); - - _engineDictionary = new Dictionary - { - { "integrity", new EngineBarEntry(IntegrityBarLabel, IntegrityBar, IntegrityBarBorder, 0.9f, 0.1f, red, orange, green) }, - { "power", new EngineBarEntry(PowerBarLabel, PowerBar, PowerBarBorder, 0.9f, 0.1f, green, orange, red) }, - { "radiation", new EngineBarEntry(RadiationBarLabel, RadiationBar, RadiationBarBorder, 0.1f, 0.9f, green, orange, red) }, - { "moles", new EngineBarEntry(MolesBarLabel, MolesBar, MolesBarBorder, 0.5f, 0.5f, green, orange, red) }, - { "temperature", new EngineBarEntry(TemperatureBarLabel, TemperatureBar, TemperatureBarBorder, 0.5f, 0.5f, turqoise, green, red) }, - { "waste", new EngineBarEntry(WasteBarLabel, WasteBar, WasteBarBorder, 0.5f, 0.5f, green, orange, red) } - }; - } - - public void UpdateEntry(SupermatterConsoleEntry entry, bool isFocus, SupermatterFocusData? focusData = null) - { - NetEntity = entry.NetEntity; - - // Update supermatter name - SupermatterNameLabel.Text = Loc.GetString("supermatter-console-window-label-sm", ("name", entry.EntityName)); - - // Update supermatter status - //SupermatterStatusLabel.Text = Loc.GetString(GetStatusLabel(entry.EntityStatus)); - //SupermatterStatusLabel.FontColorOverride = GetStatusColor(entry.EntityStatus); - - // Focus updates - FocusContainer.Visible = isFocus; - - if (isFocus) - { - if (focusData != null) - { - _engineDictionary["integrity"].Value = focusData.Value.Integrity; - _engineDictionary["power"].Value = focusData.Value.Power; - _engineDictionary["radiation"].Value = focusData.Value.Radiation; - _engineDictionary["moles"].Value = focusData.Value.AbsorbedMoles; - _engineDictionary["temperature"].Value = focusData.Value.Temperature; - _engineDictionary["waste"].Value = focusData.Value.WasteMultiplier; - - // Special cases - var powerBar = _engineDictionary["power"]; - var powerPrefix = powerBar.Value switch { >= 1000 => "G", >= 1 => "M", _ => "" }; - var powerMultiplier = powerBar.Value switch { >= 1000 => 0.001, >= 1 => 1, _ => 1000 }; - powerBar.Label.Text = Loc.GetString("supermatter-console-window-label-power-bar", ("power", (powerBar.Value * powerMultiplier).ToString("0.000")), ("prefix", powerPrefix)); - - var temperatureLimit = focusData.Value.TemperatureLimit; - TemperatureBar.MaxValue = temperatureLimit; - TemperatureLimitBarLabel.Text = Loc.GetString("supermatter-console-window-label-temperature-bar", ("temperature", temperatureLimit.ToString("0.00"))); - - var absorptionRatio = focusData.Value.AbsorptionRatio; - AbsorptionBarLabel.Text = Loc.GetString("supermatter-console-window-label-absorption-bar", ("absorption", absorptionRatio.ToString("0"))); - - // Update engine bars - foreach (var bar in _engineDictionary) - { - var current = bar.Value; - UpdateEngineBar(current.Bar, current.Border, current.Value, current.LeftSize, current.RightSize, current.LeftColor, current.MiddleColor, current.RightColor); - - if (bar.Key == "power") - continue; - - current.Label.Text = Loc.GetString("supermatter-console-window-label-" + bar.Key + "-bar", (bar.Key, current.Value.ToString("0.00"))); - } - - // Update gas bars - var atmosphereSystem = _entManager.System(); - var gases = atmosphereSystem.Gases.OrderByDescending(gas => GetStoredGas(gas, focusData)); - var index = 0; - - foreach (var gas in gases) - { - var name = gas.Name; - var color = Color.FromHex(gas.Color.StartsWith('#') ? gas.Color : $"#{gas.Color}"); - var value = GetStoredGas(gas, focusData) / focusData.Value.AbsorbedMoles * 100; - - //Log.Debug(string.Format("{0:N2}", value)); - - UpdateGasBar(index, GasTable, name, color, value); - index++; - } - } - } - } - - private static float GetStoredGas(GasPrototype gas, SupermatterFocusData? focusData) - { - var id = int.Parse(gas.ID); - - if (focusData == null) - return 0; - - return focusData.Value.GasStorage[(Gas)id]; - } - - private static void UpdateEngineBar(ProgressBar bar, PanelContainer border, float value, float leftSize, float rightSize, Color leftColor, Color middleColor, Color rightColor) - { - var clamped = Math.Clamp(value, bar.MinValue, bar.MaxValue); - - var normalized = clamped / bar.MaxValue; - var leftHsv = Color.ToHsv(leftColor); - var middleHsv = Color.ToHsv(middleColor); - var rightHsv = Color.ToHsv(rightColor); - - // Ensure leftSize and rightSize add up to 1.0 or the transition won't be smooth - var minColor = new Vector4(0, 0, 0, 0); - var maxColor = new Vector4(1, 1, 1, 1); - Color finalColor; - - if (normalized <= leftSize) - { - normalized /= leftSize; // Adjust range to 0.0 to 1.0 - var calcColor = Vector4.Lerp(leftHsv, middleHsv, normalized); - var clampedColor = Vector4.Clamp(calcColor, minColor, maxColor); - finalColor = Color.FromHsv(clampedColor); - } - - else - { - normalized = (normalized - leftSize) / rightSize; // Adjust range to 0.0 to 1.0 - var calcColor = Vector4.Lerp(middleHsv, rightHsv, normalized); - var clampedColor = Vector4.Clamp(calcColor, minColor, maxColor); - finalColor = Color.FromHsv(clampedColor); - } - - // Check if null first to avoid repeatedly creating this. - bar.ForegroundStyleBoxOverride ??= new StyleBoxFlat(); - border.PanelOverride ??= new StyleBoxFlat(); - - var barOverride = (StyleBoxFlat)bar.ForegroundStyleBoxOverride; - barOverride.BackgroundColor = finalColor; - - var panelOverride = (StyleBoxFlat)border.PanelOverride; - panelOverride.BackgroundColor = finalColor; - - bar.Value = clamped; - } - - private static void UpdateGasBar(int index, Control table, string name, Color color, float value) - { - // Make new UI entry if required - if (index >= table.ChildCount) - { - var newEntryContainer = new SupermatterGasBarContainer(); - - // Add the entry to the current table - table.AddChild(newEntryContainer); - } - - // Update values and UI elements - var tableChild = table.GetChild(index); - - if (tableChild is not SupermatterGasBarContainer) - { - table.RemoveChild(tableChild); - UpdateGasBar(index, table, name, color, value); - - return; - } - - var entryContainer = (SupermatterGasBarContainer)tableChild; - - entryContainer.UpdateEntry(name, color, value); - } - - private sealed class EngineBarEntry(Label label, ProgressBar bar, PanelContainer border, float leftSize, float rightSize, Color leftColor, Color middleColor, Color rightColor) - { - public readonly Label Label = label; - public readonly ProgressBar Bar = bar; - public readonly PanelContainer Border = border; - public float Value; - public readonly float LeftSize = leftSize; - public readonly float RightSize = rightSize; - public readonly Color LeftColor = leftColor; - public readonly Color MiddleColor = middleColor; - public readonly Color RightColor = rightColor; - } -} diff --git a/Modules/GoobStation/Content.Goobstation.Client/Supermatter/Consoles/SupermatterGasBarContainer.xaml b/Modules/GoobStation/Content.Goobstation.Client/Supermatter/Consoles/SupermatterGasBarContainer.xaml deleted file mode 100644 index 1d119ceeab..0000000000 --- a/Modules/GoobStation/Content.Goobstation.Client/Supermatter/Consoles/SupermatterGasBarContainer.xaml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - diff --git a/Modules/GoobStation/Content.Goobstation.Client/Supermatter/Consoles/SupermatterGasBarContainer.xaml.cs b/Modules/GoobStation/Content.Goobstation.Client/Supermatter/Consoles/SupermatterGasBarContainer.xaml.cs deleted file mode 100644 index d4dc76e02c..0000000000 --- a/Modules/GoobStation/Content.Goobstation.Client/Supermatter/Consoles/SupermatterGasBarContainer.xaml.cs +++ /dev/null @@ -1,48 +0,0 @@ -using Robust.Client.AutoGenerated; -using Robust.Client.Graphics; -using Robust.Client.ResourceManagement; -using Robust.Client.UserInterface.Controls; -using Robust.Client.UserInterface.XAML; -using Robust.Shared.Maths; - -namespace Content.Goobstation.Client.Supermatter.Consoles; - -[GenerateTypedNameReferences] -public sealed partial class SupermatterGasBarContainer : BoxContainer -{ - private readonly IEntityManager _entManager; - private readonly IResourceCache _cache; - - public SupermatterGasBarContainer() - { - RobustXamlLoader.Load(this); - - _entManager = IoCManager.Resolve(); - _cache = IoCManager.Resolve(); - - // Load fonts - var normalFont = new VectorFont(_cache.GetResource("/Fonts/NotoSansDisplay/NotoSansDisplay-Regular.ttf"), 11); - var monoFont = new VectorFont(_cache.GetResource("/EngineFonts/NotoSans/NotoSansMono-Regular.ttf"), 10); - - // Set fonts - GasLabel.FontOverride = normalFont; - GasBarLabel.FontOverride = monoFont; - } - - public void UpdateEntry(string name, Color color, float value) - { - GasBar.Value = value; - GasLabel.Text = Loc.GetString(name) + ":"; - GasBarLabel.Text = Loc.GetString("supermatter-console-window-label-gas-bar", ("gas", value.ToString("0.00"))); - - // Check if null first to avoid repeatedly creating this. - GasBar.ForegroundStyleBoxOverride ??= new StyleBoxFlat(); - GasBarBorder.PanelOverride ??= new StyleBoxFlat(); - - var barOverride = (StyleBoxFlat)GasBar.ForegroundStyleBoxOverride; - barOverride.BackgroundColor = color; - - var borderOverride = (StyleBoxFlat)GasBarBorder.PanelOverride; - borderOverride.BackgroundColor = color; - } -} diff --git a/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Consoles/SupermatterConsoleSystem.cs b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Consoles/SupermatterConsoleSystem.cs deleted file mode 100644 index 649329cec5..0000000000 --- a/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Consoles/SupermatterConsoleSystem.cs +++ /dev/null @@ -1,201 +0,0 @@ -using Content.Server.Pinpointer; -using Content.Goobstation.Shared.Supermatter.Components; -using Content.Goobstation.Shared.Supermatter.Consoles; -using Content.Goobstation.Shared.Supermatter.Monitor; -using Content.Shared.Atmos; -using Content.Shared.Radiation.Components; -using Robust.Server.GameObjects; -using System.Linq; - -namespace Content.Goobstation.Server.Supermatter.Consoles; - -public sealed class SupermatterConsoleSystem : SharedSupermatterConsoleSystem -{ - [Dependency] private readonly UserInterfaceSystem _userInterfaceSystem = default!; - [Dependency] private readonly SharedAppearanceSystem _appearance = default!; - - private const float UpdateTime = 1.0f; - - public override void Initialize() - { - base.Initialize(); - - // Console events - SubscribeLocalEvent(OnConsoleInit); - SubscribeLocalEvent(OnConsoleParentChanged); - SubscribeLocalEvent(OnFocusChangedMessage); - - // Grid events - SubscribeLocalEvent(OnGridSplit); - } - - #region Event handling - - private void OnConsoleInit(EntityUid uid, SupermatterConsoleComponent component, ComponentInit args) - { - InitalizeConsole(uid, component); - } - - private void OnConsoleParentChanged(EntityUid uid, SupermatterConsoleComponent component, EntParentChangedMessage args) - { - InitalizeConsole(uid, component); - } - - private void OnFocusChangedMessage(EntityUid uid, SupermatterConsoleComponent component, SupermatterConsoleFocusChangeMessage args) - { - component.FocusSupermatter = args.FocusSupermatter; - } - - private void OnGridSplit(ref GridSplitEvent args) - { - // Collect grids - var allGrids = args.NewGrids.ToList(); - - if (!allGrids.Contains(args.Grid)) - allGrids.Add(args.Grid); - - // Update supermatter monitoring consoles that stand upon an updated grid - var query = AllEntityQuery(); - while (query.MoveNext(out var ent, out var entConsole, out var entXform)) - { - if (entXform.GridUid == null - || !allGrids.Contains(entXform.GridUid.Value)) - continue; - - InitalizeConsole(ent, entConsole); - } - } - - #endregion - - public override void Update(float frameTime) - { - base.Update(frameTime); - - // Keep a list of UI entries for each gridUid, in case multiple consoles stand on the same grid - var supermatterEntriesForEachGrid = new Dictionary(); - - var query = AllEntityQuery(); - while (query.MoveNext(out var ent, out var entConsole, out var entXform)) - { - if (entXform?.GridUid == null) - continue; - - // Make a list of alarm state data for all the supermatters on the grid - if (!supermatterEntriesForEachGrid.TryGetValue(entXform.GridUid.Value, out var supermatterEntries)) - { - supermatterEntries = [.. GetSupermatterStateData(entXform.GridUid.Value)]; - supermatterEntriesForEachGrid[entXform.GridUid.Value] = supermatterEntries; - } - - // Determine the highest level of status for the console - var highestStatus = SupermatterStatusType.Inactive; - - foreach (var entry in supermatterEntries) - { - var status = entry.EntityStatus; - - if (status > highestStatus) - highestStatus = status; - } - - // Update the appearance of the console based on the highest recorded level of alert - if (TryComp(ent, out var entAppearance)) - _appearance.SetData(ent, SupermatterConsoleVisuals.ComputerLayerScreen, (int)highestStatus, entAppearance); - - // If the console UI is open, send UI data to each subscribed session - UpdateUIState(ent, supermatterEntries, entConsole, entXform); - } - } - - public void UpdateUIState - (EntityUid uid, - SupermatterConsoleEntry[] supermatterStateData, - SupermatterConsoleComponent component, - TransformComponent xform) - { - if (!_userInterfaceSystem.IsUiOpen(uid, SupermatterConsoleUiKey.Key)) - return; - - var gridUid = xform.GridUid!.Value; - - // Gathering remaining data to be send to the client - var focusSupermatterData = GetFocusSupermatterData(GetEntity(component.FocusSupermatter), gridUid); - - // Set the UI state - _userInterfaceSystem.SetUiState(uid, SupermatterConsoleUiKey.Key, - new SupermatterConsoleBoundInterfaceState(supermatterStateData, focusSupermatterData)); - } - - private List GetSupermatterStateData(EntityUid gridUid) - { - var supermatterStateData = new List(); - - var querySupermatters = AllEntityQuery(); - while (querySupermatters.MoveNext(out var ent, out var entSupermatter, out var entXform)) - { - if (entXform.GridUid != gridUid - || !entXform.Anchored) - continue; - - // Create entry - var netEnt = GetNetEntity(ent); - - var entry = new SupermatterConsoleEntry - (netEnt, - MetaData(ent).EntityName, - entSupermatter.Status); - - supermatterStateData.Add(entry); - } - - return supermatterStateData; - } - - private SupermatterFocusData? GetFocusSupermatterData(EntityUid? focusSupermatter, EntityUid gridUid) - { - if (focusSupermatter == null) - return null; - - var focusSupermatterXform = Transform(focusSupermatter.Value); - - if (!focusSupermatterXform.Anchored - || focusSupermatterXform.GridUid != gridUid - || !TryComp(focusSupermatter.Value, out var sm) - || !TryComp(focusSupermatter.Value, out var radiationComp)) - return null; - - var gases = sm.GasStorage; - var tempThreshold = Atmospherics.T0C + sm.HeatPenaltyThreshold; - - return new SupermatterFocusData( - GetNetEntity(focusSupermatter.Value), - GetIntegrity(sm), - sm.Power, - radiationComp.Intensity, - gases.Sum(gas => gases[gas.Key]), - sm.Temperature, - tempThreshold * sm.DynamicHeatResistance, - sm.WasteMultiplier, - sm.GasEfficiency * 100, - sm.GasStorage); - } - - public static float GetIntegrity(SupermatterComponent sm) - { - var integrity = sm.Damage / sm.DelaminationPoint; - integrity = (float)Math.Round(100 - integrity * 100, 2); - integrity = integrity < 0 ? 0 : integrity; - return integrity; - } - - private void InitalizeConsole(EntityUid uid, SupermatterConsoleComponent component) - { - var xform = Transform(uid); - - if (xform.GridUid == null) - return; - - Dirty(uid, component); - } -} diff --git a/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.cs b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.cs index 5a35b1b7f8..ee2c2b68d9 100644 --- a/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.cs +++ b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.cs @@ -26,7 +26,6 @@ using Robust.Shared.Physics; using Robust.Shared.Physics.Events; using Robust.Shared.Timing; -using System.Linq; using System.Text; namespace Content.Goobstation.Server.Supermatter.Systems; @@ -139,6 +138,8 @@ public void Cycle(EntityUid ent, SupermatterComponent comp) /// private void ProcessAtmos(EntityUid uid, SupermatterComponent sm) { + #region Get gas mix + var mix = _atmosphere.GetContainingMixture(uid, true, true); if (mix is not { }) @@ -150,44 +151,19 @@ private void ProcessAtmos(EntityUid uid, SupermatterComponent sm) if (!(moles > 0f)) return; - var gases = sm.GasStorage; - var facts = sm.GasDataFields; - - //Lets get the proportions of the gasses in the mix for scaling stuff later - //They range between 0 and 1 - gases = gases.ToDictionary( - gas => gas.Key, - gas => Math.Clamp(absorbedGas.GetMoles(gas.Key) / moles, 0, 1) - ); - - //No less then zero, and no greater then one, we use this to do explosions and heat to power transfer. - var powerRatio = gases.Sum(gas => gases[gas.Key] * facts[gas.Key].PowerMixRatio); - - // Minimum value of -10, maximum value of 23. Affects plasma, o2 and heat output. - var heatModifier = gases.Sum(gas => gases[gas.Key] * facts[gas.Key].HeatPenalty); - - // Minimum value of -10, maximum value of 23. Affects plasma, o2 and heat output. - var transmissionBonus = gases.Sum(gas => gases[gas.Key] * facts[gas.Key].TransmitModifier); + #endregion - var h2OBonus = 1 - gases[Gas.WaterVapor] * 0.25f; + var (radModifier, zapModifier, moleModifier, heatModifier, heatResistModifier) = GetGasModifiers(absorbedGas); - powerRatio = Math.Clamp(powerRatio, 0, 1); - heatModifier = Math.Max(heatModifier, 0.5f); - transmissionBonus *= h2OBonus; - - // Effects the damage heat does to the crystal - sm.DynamicHeatResistance = 1f; - - // more moles of gases are harder to heat than fewer, - // so let's scale heat damage around them - sm.MoleHeatPenaltyThreshold = (float)Math.Max(moles * sm.MoleHeatPenalty, 0.25); + #region Calculate CO2 powerloss inhibition effect + // Calculate powerloss modifier based on CO2 // Ramps up or down in increments of 0.02 up to the proportion of co2 // Given infinite time, powerloss_dynamic_scaling = co2comp // Some value between 0 and 1 - if (moles > sm.PowerlossInhibitionMoleThreshold && gases[Gas.CarbonDioxide] > sm.PowerlossInhibitionGasThreshold) + if (moles > sm.PowerlossInhibitionMoleThreshold && absorbedGas.GetMoles(Gas.CarbonDioxide) / moles > sm.PowerlossInhibitionGasThreshold) { - var co2powerloss = Math.Clamp(gases[Gas.CarbonDioxide] - sm.PowerlossDynamicScaling, -0.02f, 0.02f); + var co2powerloss = Math.Clamp(absorbedGas.GetMoles(Gas.CarbonDioxide) / moles - sm.PowerlossDynamicScaling, -0.02f, 0.02f); sm.PowerlossDynamicScaling = Math.Clamp(sm.PowerlossDynamicScaling + co2powerloss, 0f, 1f); } else @@ -203,75 +179,104 @@ private void ProcessAtmos(EntityUid uid, SupermatterComponent sm) Math.Clamp(moles / sm.PowerlossInhibitionMoleBoostThreshold, 1f, 1.5f), 0f, 1f); - if (sm.MatterPower != 0) //We base our removed power off one 10th of the matter_power. + #endregion + + #region Add power to crystal + + // Transfer matter power to power + if (sm.MatterPower != 0) { - var removedMatter = Math.Max(sm.MatterPower / sm.MatterPowerConversion, 40); - //Adds at least 40 power + // Get how much matter power to transfer. Above 400 starts scaling. Min wrapped to ensure we don't magically create more power. + var removedMatter = Math.Min(Math.Max(sm.MatterPower / sm.MatterPowerConversion, 40), sm.MatterPower); + //Adds at least 40 power sm.Power = Math.Max(sm.Power + removedMatter, 0); //Removes at least 40 matter power sm.MatterPower = Math.Max(sm.MatterPower - removedMatter, 0); } - //based on gas mix, makes the power more based on heat or less effected by heat - var tempFactor = powerRatio > 0.8 ? 50f : 30f; + // Additional scaling of power gen from temperature above .8 factor. + var tempFactor = heatModifier > 0.8 ? 50f : 30f; + + // Increase power from temperature + sm.Power = Math.Max(absorbedGas.Temperature * heatModifier * tempFactor / Atmospherics.T0C + sm.Power, 0); - //if there is more pluox and n2 then anything else, we receive no power increase from heat - sm.Power = Math.Max(absorbedGas.Temperature * tempFactor / Atmospherics.T0C * powerRatio + sm.Power, 0); + // Yeah, it consumes all ammonia in one tick cuz it's funny af + sm.Power = Math.Max(absorbedGas.GetMoles(Gas.Ammonia) * sm.AmmoniaEnergyPerMole + sm.Power, 0); + absorbedGas.SetMoles(Gas.Ammonia, 0f); + + #endregion + + #region Generate outputs //Radiate stuff if (TryComp(uid, out var rad)) { - var transmittedpower = sm.Power * Math.Max(0, 1f + transmissionBonus / 10f); - rad.Intensity = transmittedpower * sm.RadiationOutputFactor; + rad.Intensity = sm.Power * radModifier * sm.RadiationOutputFactor; } - //Power * 0.55 * a value between 1 and 0.8 + // Convert power to energy var energy = sm.Power * sm.ReactionPowerModifier; - // Keep in mind we are only adding this temperature to (efficiency)% of the one tile the rock - // is on. An increase of 4*C @ 25% efficiency here results in an increase of 1*C / (#tilesincore) overall. - // Power * 0.55 * (some value between 1.5 and 23) / 5 - absorbedGas.Temperature += energy * heatModifier * sm.ThermalReleaseModifier; - absorbedGas.Temperature = Math.Max(0, - Math.Min(absorbedGas.Temperature, sm.HeatThreshold * heatModifier)); + // Release the waste. Both are scaled by modifier and energy, but o2 also scales with temperatures. + absorbedGas.AdjustMoles(Gas.Oxygen, Math.Max(moleModifier * (energy + absorbedGas.Temperature - Atmospherics.T0C) * sm.OxygenReleaseEfficiencyModifier, 0f)); + absorbedGas.AdjustMoles(Gas.Plasma, Math.Max(moleModifier * sm.PlasmaReleaseModifier * energy, 0f)); - // Assmos - /tg/ gases - // Checks for carbon dioxide and spits out pluoxium if both CO2 and oxygen are present. - if (mix.GetMoles(Gas.CarbonDioxide) > 0.01f) - { - var co2PP = absorbedGas.Pressure * (mix.GetMoles(Gas.CarbonDioxide) / mix.TotalMoles * 100); - var co2Ratio = Math.Clamp(0.5f * (co2PP - 101.325f * 0.01f) / (co2PP + 101.325f * 0.25f), 0, 1); - var consumedCO2 = absorbedGas.GetMoles(Gas.CarbonDioxide) * co2Ratio; - consumedCO2 = Math.Min(consumedCO2, Math.Min(absorbedGas.GetMoles(Gas.Oxygen), absorbedGas.GetMoles(Gas.CarbonDioxide))); + // Increase temperature + absorbedGas.Temperature += energy * sm.ThermalReleaseModifier; - if (consumedCO2 > 0) - { - absorbedGas.AdjustMoles(Gas.CarbonDioxide, -consumedCO2); - absorbedGas.AdjustMoles(Gas.Oxygen, -consumedCO2); - } - } - // Assmos - /tg/ gases end + // Return the gas to nature :) + _atmosphere.Merge(mix, absorbedGas); - // Release the waste - absorbedGas.AdjustMoles(Gas.Plasma, Math.Max(energy * heatModifier * sm.PlasmaReleaseModifier, 0f)); - absorbedGas.AdjustMoles(Gas.Oxygen, Math.Max((energy + absorbedGas.Temperature * heatModifier - Atmospherics.T0C) * sm.OxygenReleaseEfficiencyModifier, 0f)); + #endregion - _atmosphere.Merge(mix, absorbedGas); + #region Scale down power - var powerReduction = (float)Math.Pow(sm.Power / 500, 3); + var powerReduction = (float)Math.Pow(sm.Power / 500f, 3f); // After this point power is lowered // This wraps around to the begining of the function sm.Power = Math.Max(sm.Power - Math.Min(powerReduction * powerlossInhibitor, sm.Power * 0.83f * powerlossInhibitor), 0f); - sm.GasStorage = sm.GasStorage.ToDictionary( - gas => gas.Key, - gas => absorbedGas.GetMoles(gas.Key) - ); + #endregion + } + + /// + /// Get SM related data about a provided gas mix. + /// + /// Mix to be parsed + /// A selection of values, check + private (float radModifier, float zapModifier, float moleModifier, float heatModifier, float heatResistModifier) GetGasModifiers(GasMixture absorbedGas) + { + // Get the proportions of the gasses in the mix, which range between 0 and 1 + // Also get their corresponding facts and calculate mods from it. + // Preallocate variables + var facts = SupermatterComponent.GasDataFields(); + var gasPercentages = new Dictionary(Enum.GetNames().Length); + var radModifier = 1f; + var zapModifier = 1f; + var moleModifier = 1f; + var heatModifier = 1f; + var heatResistModifier = 1f; + for (int i = 0; i < Enum.GetNames().Length; i++) + { + gasPercentages[(Gas)i] = absorbedGas[i] / absorbedGas.TotalMoles; + facts = SupermatterComponent.GasDataFields((Gas)i); + radModifier += gasPercentages[(Gas)i] * facts.RadMod; + zapModifier += gasPercentages[(Gas)i] * facts.ZapMod; + moleModifier += gasPercentages[(Gas)i] * facts.MoleMod; + heatModifier += gasPercentages[(Gas)i] * facts.HeatMod; + heatResistModifier += gasPercentages[(Gas)i] * facts.HeatResistMod; + } + + // Ensure we don't do something stupid later + return ( + Math.Max(radModifier, 0f), + Math.Max(zapModifier, 0f), + Math.Max(moleModifier, 0f), + Math.Max(heatModifier, 0f), + Math.Max(heatResistModifier, 0f) + ); - // Console Compatibility from EE - sm.Temperature = absorbedGas.Temperature; - sm.WasteMultiplier = heatModifier; } /// @@ -279,10 +284,31 @@ private void ProcessAtmos(EntityUid uid, SupermatterComponent sm) /// private void SupermatterZap(EntityUid uid, SupermatterComponent sm) { + + #region Calc modifiers for zap + + // This isn't DRY but erm whatever. Alternatively I can surface this. And add a few params or some weird struct. + // (Also I can't cleanly run it on top level anyways since damage is independent + + var mix = _atmosphere.GetContainingMixture(uid, true, true); + + if (mix is not { }) + return; + + var gas = mix.Clone(); + var moles = gas.TotalMoles; + + if (!(moles > 0f)) + return; + + var (_,zapModifier,_,_,_) = GetGasModifiers(gas); + + #endregion + // Divide power by it's threshold to get a value from 0 to 1, then multiply by the amount of possible lightnings // Makes it pretty obvious that if SM is shooting out red lightnings something is wrong. // And if it shoots too weak lightnings it means that it's underfed. Feed the SM :godo: - var zapPower = sm.Power / sm.PowerPenaltyThreshold * sm.LightningPrototypes.Length; + var zapPower = sm.Power * zapModifier / sm.PowerPenaltyThreshold * sm.LightningPrototypes.Length; var zapPowerNorm = (int)Math.Clamp(zapPower, 0, sm.LightningPrototypes.Length - 1); _lightning.ShootRandomLightnings(uid, 3.5f, sm.Power > sm.PowerPenaltyThreshold ? 3 : 1, sm.LightningPrototypes[zapPowerNorm]); } diff --git a/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Components/SupermatterComponent.cs b/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Components/SupermatterComponent.cs index 6311eca495..01c2670d12 100644 --- a/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Components/SupermatterComponent.cs +++ b/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Components/SupermatterComponent.cs @@ -1,11 +1,12 @@ using Content.Goobstation.Shared.Supermatter.Systems; -using Content.Goobstation.Shared.Supermatter.Monitor; using Content.Shared.Atmos; using Content.Shared.DoAfter; using Content.Shared.Whitelist; using Robust.Shared.Audio; using Robust.Shared.GameStates; using Robust.Shared.Serialization; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; +using Robust.Shared.Prototypes; namespace Content.Goobstation.Shared.Supermatter.Components; @@ -21,8 +22,8 @@ public sealed partial class SupermatterComponent : Component [ViewVariables(VVAccess.ReadWrite)] public bool Activated = false; - [DataField("supermatterSliverPrototype")] - public string SliverPrototypeId = "SupermatterSliver"; + [DataField("supermatterSliverPrototype", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string SliverPrototypeId { get; private set; } = "SupermatterSliver"; /// /// Affects delamination timer. If removed - delamination timer is divided by 2. @@ -43,13 +44,13 @@ public sealed partial class SupermatterComponent : Component "HyperchargedLightning" ]; - [DataField("singularitySpawnPrototype")] + [DataField("singularitySpawnPrototype", customTypeSerializer: typeof(PrototypeIdSerializer))] public string SingularityPrototypeId = "Singularity"; - [DataField("teslaSpawnPrototype")] + [DataField("teslaSpawnPrototype", customTypeSerializer: typeof(PrototypeIdSerializer))] public string TeslaPrototypeId = "TeslaEnergyBall"; - [DataField("supermatterKudzuSpawnPrototype")] + [DataField("supermatterKudzuSpawnPrototype", customTypeSerializer: typeof(PrototypeIdSerializer))] public string SupermatterKudzuPrototypeId = "SupermatterKudzu"; [ViewVariables(VVAccess.ReadWrite)] @@ -271,14 +272,6 @@ public sealed partial class SupermatterComponent : Component [DataField("molepenaltyThreshold")] public float MolePenaltyThreshold = 900f; - /// - /// more moles of gases are harder to heat than fewer, - /// so let's scale heat damage around them - /// - [ViewVariables(VVAccess.ReadOnly)] - [DataField("moleheatpenaltyThreshold")] - public float MoleHeatPenaltyThreshold; - /// /// The cutoff on power properly doing damage, pulling shit around, /// and delamming into a tesla. Low chance of pyro anomalies, +2 bolts of electricity @@ -358,47 +351,61 @@ public sealed partial class SupermatterComponent : Component #endregion SM Delamm #region SM Gas - /// - /// Is used to store gas - /// - [ViewVariables(VVAccess.ReadOnly)] - [DataField("gasStorage")] - public Dictionary GasStorage = new() - { - {Gas.Oxygen, 0f}, - {Gas.Nitrogen, 0f}, - {Gas.CarbonDioxide, 0f}, - {Gas.Plasma, 0f}, - {Gas.Tritium, 0f}, - {Gas.WaterVapor, 0f}, - {Gas.Frezon, 0f }, // EE Compatibility - {Gas.Ammonia, 0f }, // EE Compatibility - {Gas.NitrousOxide, 0f }, // EE Compatibility - }; /// - /// Stores each gas facts - /// - public readonly Dictionary GasDataFields = new() + /// Stores every gas fact + /// + /// + /// Given gasses: + /// + /// + /// RadMod + /// - radiation power modifier. + /// + /// + /// ZapMod + /// - tesla zap power modifier. + /// + /// + /// HeatMod + /// - modifier to crystal power gain from heat. + /// + /// + /// MoleMod + /// - produced gas mole count modifier. + /// + /// + /// HeatResistMod + /// - modifies threshold for crystal receiving heat damage. + /// + /// + /// + /// + /// RadMod has no /tg/ equivalents, however since SS14 meta is centered slightly more around rad collectors, this helps designs that rely on them instead of coils. Usually similar to ZapMod. + /// ZapMod = "Power Transmission" on /tg/ wiki. High values will naturally create more powerful zaps. + /// HeatMod = "Heat Power Gain" on /tg/ wiki. Makes SM get energy from temperature. + /// MoleMod ~= "Gas Waste Multiplier" on /tg/ wiki. Temperature (not energy!) of produced gas depends on crystal energy instead. + /// HeatResistMod = "Heat Resistance" on /tg/ wiki. Should never be so high as to shield from a trit fire. + /// These values are for a 100% mix of such gas. These are additive, not multiplicative (so, 100%+mod) + /// + public static (float RadMod, float ZapMod, float HeatMod, float MoleMod, float HeatResistMod) GasDataFields(Gas? gas = null) => gas switch { - [Gas.Oxygen] = (TransmitModifier: 1.5f, HeatPenalty: 1f, PowerMixRatio: 1f), - [Gas.Nitrogen] = (TransmitModifier: 0f, HeatPenalty: -1.5f, PowerMixRatio: -1f), - [Gas.CarbonDioxide] = (TransmitModifier: 0f, HeatPenalty: 0.1f, PowerMixRatio: 1f), - [Gas.Plasma] = (TransmitModifier: 4f, HeatPenalty: 15f, PowerMixRatio: 1f), - [Gas.Tritium] = (TransmitModifier: 30f, HeatPenalty: 10f, PowerMixRatio: 1f), - [Gas.WaterVapor] = (TransmitModifier: 2f, HeatPenalty: 12f, PowerMixRatio: 1f), - [Gas.Frezon] = (TransmitModifier: 3f, HeatPenalty: -10f, PowerMixRatio: -1f), - [Gas.Ammonia] = (TransmitModifier: 0f, HeatPenalty: .5f, PowerMixRatio: 1f), - [Gas.NitrousOxide] = (TransmitModifier: 0f, HeatPenalty: -5f, PowerMixRatio: -1f), + // /tg/ values are an ok start, but definitely don't have to be adhered to. + // Some values might seem extreme - completely intentional to encourage mixes. + Gas.Oxygen => (0.8f, 0.4f, 1f, 0f, 0f), // Baby's first performance booster. + Gas.Nitrogen => (0f, 0f, -1f, -2.5f, 0f), // Baseline. If SM doesn't work safely with 100% N2 something is wrong. + Gas.CarbonDioxide => (0f, 0f, 1f, 1f, 0f), // Only useful for its special effect, decreasing power decay. + Gas.Plasma => (2f, 1.5f, 1f, 19f, 0f), // Gives more power, and a lot more gases. + Gas.Tritium => (4f, 3f, 1f, 9f, 0f), // Go-to for massive power gains :) + Gas.WaterVapor => (-0.25f, -0.25f, 1f, 11f, 0.25f), // Dangerous and useless. Or useless and dangerous? + Gas.Frezon => (-3f, -3f, -1f, -9f, -0.5f), // Quick cooling, but won't save you at the last second due to heat mod. It's your fault ngl. + Gas.Ammonia => (0f, 0f, .3f, 0f, 0f), // Another special effect, it's being consumed to give more power to the crystal. + Gas.NitrousOxide => (0f, 0f, 0f, 0f, 5f), // Just gives heat resist + _ => (0f, 0f, 0f, 0f, 0f) }; #endregion SM Gas - - #region EE - - [DataField] - public SupermatterStatusType Status = SupermatterStatusType.Inactive; - #endregion EE + public float AmmoniaEnergyPerMole; } [Serializable, NetSerializable] diff --git a/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Monitor/SupermatterStatusType.cs b/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Monitor/SupermatterStatusType.cs deleted file mode 100644 index e748889f0b..0000000000 --- a/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Monitor/SupermatterStatusType.cs +++ /dev/null @@ -1,16 +0,0 @@ -using Robust.Shared.Serialization; - -namespace Content.Goobstation.Shared.Supermatter.Monitor; - -[Serializable, NetSerializable] -public enum SupermatterStatusType : sbyte -{ - Error = -1, - Inactive = 0, - Normal = 1, - Caution = 2, - Warning = 3, - Danger = 4, - Emergency = 5, - Delaminating = 6 -} From 111b03e2b6cbd9852489e0cf00aae2dca8edbddb Mon Sep 17 00:00:00 2001 From: SX-7 Date: Sun, 22 Feb 2026 12:29:44 +0100 Subject: [PATCH 03/16] More tweaks --- .../Supermatter/Systems/SupermatterSystem.cs | 100 +++++++----------- .../Components/SupermatterComponent.cs | 22 ++-- 2 files changed, 47 insertions(+), 75 deletions(-) diff --git a/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.cs b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.cs index ee2c2b68d9..f952e653fd 100644 --- a/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.cs +++ b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.cs @@ -301,7 +301,7 @@ private void SupermatterZap(EntityUid uid, SupermatterComponent sm) if (!(moles > 0f)) return; - var (_,zapModifier,_,_,_) = GetGasModifiers(gas); + var (_, zapModifier, _, _, _) = GetGasModifiers(gas); #endregion @@ -318,30 +318,32 @@ private void SupermatterZap(EntityUid uid, SupermatterComponent sm) /// private void HandleDamage(EntityUid uid, SupermatterComponent sm) { - var xform = Transform(uid); - var indices = _xform.GetGridOrMapTilePosition(uid, xform); + var damageArchived = sm.Damage; - sm.DamageArchived = sm.Damage; + #region Get gas info var mix = _atmosphere.GetContainingMixture(uid, true, true); // We're in space or there is no gas to process - if (!xform.GridUid.HasValue || mix is not { } || mix.TotalMoles == 0f) + if (mix is not { } || mix.TotalMoles == 0f) { sm.Damage += Math.Max(sm.Power / 1000 * sm.DamageIncreaseMultiplier, 0.1f); return; } // Absorbed gas from surrounding area - var absorbedGas = mix.Remove(sm.GasEfficiency * mix.TotalMoles); - var moles = absorbedGas.TotalMoles; + var gas = mix.Clone(); + var moles = gas.TotalMoles; + var (_, _, _, _, heatResistModifier) = GetGasModifiers(gas); + + #endregion var totalDamage = 0f; - var tempThreshold = Atmospherics.T0C + sm.HeatPenaltyThreshold; + var tempThreshold = (Atmospherics.T0C + sm.HeatPenaltyThreshold) * heatResistModifier; // Temperature start to have a positive effect on damage after 350 - var tempDamage = Math.Max(Math.Clamp(moles / 200f, .5f, 1f) * absorbedGas.Temperature - tempThreshold * sm.DynamicHeatResistance, 0f) * sm.MoleHeatThreshold / 150f * sm.DamageIncreaseMultiplier; + var tempDamage = Math.Max(Math.Clamp(moles / 200f, .5f, 1f) * gas.Temperature - tempThreshold, 0f) * sm.MoleHeatThreshold / 150f * sm.DamageIncreaseMultiplier; totalDamage += tempDamage; // Power only starts affecting damage when it is above 5000 @@ -356,39 +358,12 @@ private void HandleDamage(EntityUid uid, SupermatterComponent sm) if (moles < sm.MolePenaltyThreshold) { // left there a very small float value so that it doesn't eventually divide by 0. - var healHeatDamage = Math.Min(absorbedGas.Temperature - tempThreshold, 0.001f) / 150; + var healHeatDamage = Math.Min(gas.Temperature - tempThreshold, 0.001f) / 150; totalDamage += healHeatDamage; } - // Check for space tiles next to SM - // TODO: change moles out for checking if adjacent tiles exist - var enumerator = _atmosphere.GetAdjacentTileMixtures(xform.GridUid.Value, indices, false, false); - while (enumerator.MoveNext(out var ind)) - { - if (ind.TotalMoles != 0) - continue; - - var integrity = GetIntegrity(sm); - - // this is some magic number shit - var factor = integrity switch - { - < 10 => 0.0005f, - < 25 => 0.0009f, - < 45 => 0.005f, - < 75 => 0.002f, - _ => 0f - }; - - totalDamage += Math.Clamp(sm.Power * factor * sm.DamageIncreaseMultiplier, 0, sm.MaxSpaceExposureDamage); - - break; - } - - sm.Damage = Math.Min(sm.DamageArchived + sm.DamageHardcap * sm.DelaminationPoint, totalDamage); - - // Return the manipulated gas back to the mix - _atmosphere.Merge(mix, absorbedGas); + sm.Damage = Math.Min(damageArchived + sm.DamageHardcap * sm.DelaminationPoint, totalDamage); + sm.DamageDelta = sm.Damage - damageArchived; } /// @@ -401,13 +376,7 @@ private void HandleAnnouncements(EntityUid uid, SupermatterComponent sm) var integrity = GetIntegrity(sm).ToString("0.00"); - // Special cases - if (sm.Damage < sm.DelaminationPoint && sm.Delamming) - { - message = Loc.GetString("supermatter-delam-cancel", ("integrity", integrity)); - sm.DelamAnnounced = false; - global = true; - } + // Delam is happening if (sm.Delamming && !sm.DelamAnnounced) { var sb = new StringBuilder(); @@ -452,22 +421,39 @@ private void HandleAnnouncements(EntityUid uid, SupermatterComponent sm) return; } - // We are not taking consistent damage. Engis not needed. - if (sm.Damage <= sm.DamageArchived) + // Delam stopped, let everyone know. + if (sm.Damage < sm.DelaminationPoint && sm.Delamming) + { + message = Loc.GetString("supermatter-delam-cancel", ("integrity", integrity)); + sm.DelamAnnounced = false; + global = true; + SupermatterAnnouncement(uid, message, global); + return; + } + + // We are not taking consistent damage. Engis/warn not needed. + if (sm.DamageDelta >= 0) return; - if (sm.Damage >= sm.WarningPoint) + // Check if we need to warn anyone + switch (sm.Damage) { - message = Loc.GetString("supermatter-warning", ("integrity", integrity)); - if (sm.Damage >= sm.EmergencyPoint) - { + case >= SupermatterComponent.EmergencyPoint: message = Loc.GetString("supermatter-emergency", ("integrity", integrity)); global = true; - } + break; + case >= SupermatterComponent.WarningPoint: + message = Loc.GetString("supermatter-warning", ("integrity", integrity)); + break; } + SupermatterAnnouncement(uid, message, global); } + #endregion + + #region Helper functions + /// /// Help the SM announce something. /// @@ -504,7 +490,6 @@ public DelamType ChooseDelamType(EntityUid uid, SupermatterComponent sm) if (mix is { }) { - // var absorbedGas = mix.Remove(sm.GasEfficiency * mix.TotalMoles); var moles = mix.TotalMoles; if (moles >= sm.MolePenaltyThreshold) @@ -514,8 +499,6 @@ public DelamType ChooseDelamType(EntityUid uid, SupermatterComponent sm) if (sm.Power >= sm.PowerPenaltyThreshold) return DelamType.Tesla; - // TODO: add resonance cascade when there's crazy conditions, or a destabilizing crystal :godo: - return DelamType.Explosion; } @@ -567,7 +550,7 @@ private void HandleDelamination(EntityUid uid, SupermatterComponent sm) private void HandleSoundLoop(SupermatterComponent sm) { - var isAggressive = sm.Damage > sm.WarningPoint; + var isAggressive = sm.Damage > SupermatterComponent.WarningPoint; var isDelamming = sm.Damage > sm.DelaminationPoint; if (!isAggressive && !isDelamming) @@ -587,7 +570,6 @@ private void HandleSoundLoop(SupermatterComponent sm) #endregion - #region Event Handlers private void OnCollideEvent(EntityUid uid, SupermatterComponent sm, ref StartCollideEvent args) @@ -686,7 +668,7 @@ private void OnGetSliver(EntityUid uid, SupermatterComponent sm, ref Supermatter // your criminal actions will not go unnoticed sm.Damage += sm.DelaminationPoint / 10; - sm.DamageArchived += sm.DelaminationPoint / 10; + sm.DamageDelta += sm.DelaminationPoint / 10; var integrity = GetIntegrity(sm).ToString("0.00"); SupermatterAnnouncement(uid, Loc.GetString("supermatter-announcement-cc-tamper", ("integrity", integrity)), true, "Central Command"); diff --git a/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Components/SupermatterComponent.cs b/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Components/SupermatterComponent.cs index 01c2670d12..2765e844fe 100644 --- a/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Components/SupermatterComponent.cs +++ b/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Components/SupermatterComponent.cs @@ -4,9 +4,9 @@ using Content.Shared.Whitelist; using Robust.Shared.Audio; using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; using Robust.Shared.Serialization; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; -using Robust.Shared.Prototypes; namespace Content.Goobstation.Shared.Supermatter.Components; @@ -74,6 +74,9 @@ public sealed partial class SupermatterComponent : Component [ViewVariables(VVAccess.ReadWrite)] public float Damage = 0f; + [ViewVariables(VVAccess.ReadWrite)] + public float DamageDelta = 0f; + [ViewVariables(VVAccess.ReadWrite)] public float MatterPower; @@ -125,13 +128,6 @@ public sealed partial class SupermatterComponent : Component [ViewVariables(VVAccess.ReadOnly)] public float PowerlossDynamicScaling; - /// - /// Affects the amount of damage and minimum point - /// at which the sm takes heat damage - /// - [ViewVariables(VVAccess.ReadOnly)] - public float DynamicHeatResistance = 1; - /// /// Multiplier on damage the core takes from absorbing hot gas /// Default is ~1/350 @@ -185,14 +181,14 @@ public sealed partial class SupermatterComponent : Component /// [ViewVariables(VVAccess.ReadWrite)] [DataField("WarningPoint")] - public float WarningPoint = 50; + public const float WarningPoint = 50; /// /// The point at which we start sending messages to the common channel /// [ViewVariables(VVAccess.ReadWrite)] [DataField("emergencyPoint")] - public float EmergencyPoint = 500; + public const float EmergencyPoint = 500; /// /// we yell if over 50 damage every YellTimer Seconds @@ -287,12 +283,6 @@ public sealed partial class SupermatterComponent : Component [DataField("heatpenaltyThreshold")] public float HeatPenaltyThreshold = 40f; - /// - /// The damage we had before this cycle. Used to limit the damage we can take each cycle, and for safe alert - /// - [ViewVariables(VVAccess.ReadWrite)] - public float DamageArchived = 0f; - /// /// is multiplied by ExplosionPoint to cap /// evironmental damage per cycle From 088a761d1dda11c60181f4c49fe2ab4a6c38e42a Mon Sep 17 00:00:00 2001 From: SX-7 Date: Sun, 22 Feb 2026 12:48:24 +0100 Subject: [PATCH 04/16] Add some protos --- .../Audio/Supermatter/attributions.yml | 9 +++ .../Resources/Audio/Supermatter/calm.ogg | Bin 0 -> 172011 bytes .../Resources/Audio/Supermatter/delamming.ogg | Bin 0 -> 160153 bytes .../Locale/en-US/supermatter/supermatter.ftl | 46 +++++++++++ .../Entities/Supermatter/supermatter.yml | 74 ++++++++++++++++++ .../Supermatter/supermatter.rsi/meta.json | 21 +++++ .../supermatter.rsi/supermatter.png | Bin 0 -> 28899 bytes .../supermatter_sliver.rsi/icon.png | Bin 0 -> 357 bytes .../supermatter_sliver.rsi/meta.json | 14 ++++ 9 files changed, 164 insertions(+) create mode 100644 Modules/GoobStation/Resources/Audio/Supermatter/attributions.yml create mode 100644 Modules/GoobStation/Resources/Audio/Supermatter/calm.ogg create mode 100644 Modules/GoobStation/Resources/Audio/Supermatter/delamming.ogg create mode 100644 Modules/GoobStation/Resources/Locale/en-US/supermatter/supermatter.ftl create mode 100644 Modules/GoobStation/Resources/Prototypes/Entities/Supermatter/supermatter.yml create mode 100644 Modules/GoobStation/Resources/Textures/Supermatter/supermatter.rsi/meta.json create mode 100644 Modules/GoobStation/Resources/Textures/Supermatter/supermatter.rsi/supermatter.png create mode 100644 Modules/GoobStation/Resources/Textures/Supermatter/supermatter_sliver.rsi/icon.png create mode 100644 Modules/GoobStation/Resources/Textures/Supermatter/supermatter_sliver.rsi/meta.json diff --git a/Modules/GoobStation/Resources/Audio/Supermatter/attributions.yml b/Modules/GoobStation/Resources/Audio/Supermatter/attributions.yml new file mode 100644 index 0000000000..0105f7edfd --- /dev/null +++ b/Modules/GoobStation/Resources/Audio/Supermatter/attributions.yml @@ -0,0 +1,9 @@ +- files: ["calm.ogg"] + license: "CC-BY-3.0" + copyright: "Unknown" + source: "https://forums.goobstation.com" + +- files: ["delamming.ogg"] + license: "CC-BY-3.0" + copyright: "Unknown" + source: "https://forums.goobstation.com" diff --git a/Modules/GoobStation/Resources/Audio/Supermatter/calm.ogg b/Modules/GoobStation/Resources/Audio/Supermatter/calm.ogg new file mode 100644 index 0000000000000000000000000000000000000000..dc3102e57866eb386ca4f7977b5e9f3696db1a98 GIT binary patch literal 172011 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 EdSVilTuz2 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

)P%>x$;)u7(ofnE>YR_`jm~glc-b8) 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 literal 0 HcmV?d00001 diff --git a/Modules/GoobStation/Resources/Locale/en-US/supermatter/supermatter.ftl b/Modules/GoobStation/Resources/Locale/en-US/supermatter/supermatter.ftl new file mode 100644 index 0000000000..78081e6640 --- /dev/null +++ b/Modules/GoobStation/Resources/Locale/en-US/supermatter/supermatter.ftl @@ -0,0 +1,46 @@ +# SPDX-FileCopyrightText: 2024 Piras314 +# SPDX-FileCopyrightText: 2024 VMSolidus +# SPDX-FileCopyrightText: 2024 username <113782077+whateverusername0@users.noreply.github.com> +# SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com> +# SPDX-FileCopyrightText: 2025 Aiden +# +# SPDX-License-Identifier: AGPL-3.0-or-later + +supermatter-announcer = Automatic Supermatter Engine + +supermatter-examine-integrity = + It's integrity is [color=yellow]{$integrity}%[/color]. + +supermatter-warning = + Warning! Crystal hyperstructure integrity faltering! Integrity: {$integrity}%. + +supermatter-emergency = + DANGER! Crystal hyperstructure integrity reaching critical levels! Integrity: {$integrity}%. + +supermatter-delam-explosion = + CRYSTAL DELAMINATION IMMINENT! The crystal has reached critical integrity failure! Emergency causality destabilization field has been engaged. + +supermatter-delam-overmass = + CRYSTAL DELAMINATION IMMINENT! Crystal hyperstructure integrity has reached critical mass failure! Singularity formation imminent! + +supermatter-delam-tesla = + CRYSTAL DELAMINATION IMMINENT! Crystal hyperstructure integrity has reached critical power surge failure! Energy ball formation imminent! + +supermatter-delam-cascade = + CRYSTAL DELAMINATION IMMINENT! Harmonic frequency limits exceeded, casualty destabilization field could not be engaged! + +supermatter-delam-cancel = + Crystalline hyperstructure returning to safe operating parameters. Failsafe has been Disengaged. Integrity: {$integrity}%. + +supermatter-seconds-before-delam = + Estimated time before delamination: {$seconds} seconds. + +supermatter-tamper-begin = + You begin carefully cutting a piece off the supermatter crystal... + +supermatter-tamper-end = + You feel the power of a thousand suns laying on your palms. Or is it all the radiation? + +supermatter-announcement-cc-tamper = + Our automatic casualty system has detected that the supermatter crystal structural integrity was compromised by an external force. + Engineering department, report to the supermatter engine immediately. diff --git a/Modules/GoobStation/Resources/Prototypes/Entities/Supermatter/supermatter.yml b/Modules/GoobStation/Resources/Prototypes/Entities/Supermatter/supermatter.yml new file mode 100644 index 0000000000..258fb95db2 --- /dev/null +++ b/Modules/GoobStation/Resources/Prototypes/Entities/Supermatter/supermatter.yml @@ -0,0 +1,74 @@ +- type: entity + id: Supermatter + name: supermatter crystal + description: A strangely translucent and iridescent crystal. + placement: + mode: SnapgridCenter + components: + - type: Supermatter + radiationOutputFactor: 0.005 + whitelist: + tags: + - EmitterBolt + components: + - Body + - Item + - type: RadiationSource + - type: AmbientSound + range: 5 + volume: 0 + sound: + path: /Audio/_Goobstation/Supermatter/calm.ogg + - type: Physics + - type: Speech + speechSounds: Pai + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeAabb + bounds: "-0.25,-0.25,0.25,0.25" + mask: + - Impassable + - MidImpassable + - HighImpassable + - LowImpassable + - InteractImpassable + - Opaque + layer: + - MidImpassable + - HighImpassable + - BulletImpassable + - InteractImpassable + - type: Transform + anchored: true + noRot: true + - type: CollisionWake + enabled: false + - type: Clickable + - type: InteractionOutline + - type: Sprite + drawdepth: WallMountedItems + sprite: Supermatter/supermatter.rsi + state: supermatter + - type: Icon + sprite: Supermatter/supermatter.rsi + state: supermatter + - type: PointLight + enabled: true + radius: 10 + energy: 5 + color: "#ffe000" + - type: Explosive + explosionType: Supermatter + maxIntensity: 10000 + intensitySlope: 5 + totalIntensity: 10000 + - type: GuideHelp + guides: [ Supermatter, Power ] + - type: WarpPoint + follow: true + location: supermatter + - type: StealTarget + stealGroup: SupermatterSliver # uses to verify sm existense on map + - type: PhysicsGunBlacklist diff --git a/Modules/GoobStation/Resources/Textures/Supermatter/supermatter.rsi/meta.json b/Modules/GoobStation/Resources/Textures/Supermatter/supermatter.rsi/meta.json new file mode 100644 index 0000000000..d0a000ae2b --- /dev/null +++ b/Modules/GoobStation/Resources/Textures/Supermatter/supermatter.rsi/meta.json @@ -0,0 +1,21 @@ +{ + "version": 1, + "copyright": "Taken and edited from https://tgstation13.org/wiki/images/a/a4/Supermatter-bg.gif", + "license": "CC-BY-SA-3.0", + "size": { + "x": 32, + "y": 48 + }, + "states": [ + { + "name": "supermatter", + "delays": [ + [ + 0.08, + 0.08, + 0.08 + ] + ] + } + ] +} diff --git a/Modules/GoobStation/Resources/Textures/Supermatter/supermatter.rsi/supermatter.png b/Modules/GoobStation/Resources/Textures/Supermatter/supermatter.rsi/supermatter.png new file mode 100644 index 0000000000000000000000000000000000000000..0c5747a315fec5fc2d2965078fe08a0dd9296681 GIT binary patch literal 28899 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 literal 0 HcmV?d00001 diff --git a/Modules/GoobStation/Resources/Textures/Supermatter/supermatter_sliver.rsi/icon.png b/Modules/GoobStation/Resources/Textures/Supermatter/supermatter_sliver.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..2187706b107afd46d3d977ef25092feee253cd8b GIT binary patch literal 357 zcmV-r0h<1aP)ugi+s(f3-PG?@+kv<2$y(1BY3}*}r{UA3Re!wlF Date: Sun, 22 Feb 2026 14:15:51 +0100 Subject: [PATCH 05/16] warn tweaks --- .../Supermatter/Systems/SupermatterSystem.cs | 1 - .../SharedSupermatterConsoleSystem.cs | 4 - .../Consoles/SupermatterConsoleComponent.cs | 168 ------------------ .../Entities/Supermatter/supermatter.yml | 1 - 4 files changed, 174 deletions(-) delete mode 100644 Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Consoles/SharedSupermatterConsoleSystem.cs delete mode 100644 Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Consoles/SupermatterConsoleComponent.cs diff --git a/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.cs b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.cs index f952e653fd..06b6f12fb1 100644 --- a/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.cs +++ b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.cs @@ -36,7 +36,6 @@ public sealed class SupermatterSystem : SharedSupermatterSystem [Dependency] private readonly ChatSystem _chat = default!; [Dependency] private readonly SharedContainerSystem _container = default!; [Dependency] private readonly ExplosionSystem _explosion = default!; - [Dependency] private readonly TransformSystem _xform = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly IGameTiming _gameTiming = default!; [Dependency] private readonly AmbientSoundSystem _ambient = default!; diff --git a/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Consoles/SharedSupermatterConsoleSystem.cs b/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Consoles/SharedSupermatterConsoleSystem.cs deleted file mode 100644 index f37b5df82e..0000000000 --- a/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Consoles/SharedSupermatterConsoleSystem.cs +++ /dev/null @@ -1,4 +0,0 @@ -namespace Content.Goobstation.Shared.Supermatter.Consoles; - -public abstract partial class SharedSupermatterConsoleSystem : EntitySystem -{ } diff --git a/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Consoles/SupermatterConsoleComponent.cs b/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Consoles/SupermatterConsoleComponent.cs deleted file mode 100644 index ca9bbca4e3..0000000000 --- a/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Consoles/SupermatterConsoleComponent.cs +++ /dev/null @@ -1,168 +0,0 @@ -using Content.Goobstation.Shared.Supermatter.Consoles; -using Content.Goobstation.Shared.Supermatter.Monitor; -using Content.Shared.Atmos; -using Robust.Shared.GameStates; -using Robust.Shared.Map; -using Robust.Shared.Serialization; - -namespace Content.Goobstation.Shared.Supermatter.Consoles; - -[RegisterComponent, NetworkedComponent] -[Access(typeof(SharedSupermatterConsoleSystem))] -public sealed partial class SupermatterConsoleComponent : Component -{ - ///

- /// The current entity of interest (selected via the console UI) - /// - [ViewVariables] - public NetEntity? FocusSupermatter; -} - -/// -/// Populate the supermatter console nav map with a single entity -/// -[Serializable, NetSerializable] -public struct SupermatterNavMapData(NetEntity netEntity, NetCoordinates netCoordinates) -{ - /// - /// The entity in question - /// - public NetEntity NetEntity = netEntity; - - /// - /// Location of the entity - /// - public NetCoordinates NetCoordinates = netCoordinates; -} - -/// -/// Populates the supermatter console focus entry with supermatter data -/// -[Serializable, NetSerializable] -public struct SupermatterFocusData(NetEntity netEntity, - float integrity, - float power, - float radiation, - float absorbedMoles, - float temperature, - float temperatureLimit, - float wasteMultiplier, - float absorptionRatio, - Dictionary gasStorage) -{ - /// - /// Focus entity - /// - public NetEntity NetEntity = netEntity; - - /// - /// The supermatter's integrity, from 0 to 100 - /// - public float Integrity = integrity; - - /// - /// The supermatter's power - /// - public float Power = power; - - /// - /// The supermatter's emitted radiation - /// - public float Radiation = radiation; - - /// - /// The supermatter's total absorbed moles - /// - public float AbsorbedMoles = absorbedMoles; - - /// - /// The supermatter's temperature - /// - public float Temperature = temperature; - - /// - /// The supermatter's temperature limit - /// - public float TemperatureLimit = temperatureLimit; - - /// - /// The supermatter's waste multiplier - /// - public float WasteMultiplier = wasteMultiplier; - - /// - /// The supermatter's absorption ratio - /// - public float AbsorptionRatio = absorptionRatio; - - /// - /// The supermatter's gas storage - /// - [DataField] - public Dictionary GasStorage = gasStorage; -} - -/// -/// Sends data from the server to the client to populate the atmos monitoring console UI -/// -[Serializable, NetSerializable] -public sealed class SupermatterConsoleBoundInterfaceState(SupermatterConsoleEntry[] supermatters, SupermatterFocusData? focusData) : BoundUserInterfaceState -{ - /// - /// A list of all supermatters - /// - public SupermatterConsoleEntry[] Supermatters = supermatters; - - /// - /// Data for the UI focus (if applicable) - /// - public SupermatterFocusData? FocusData = focusData; -} - -/// -/// Used to populate the supermatter console UI with data from a single supermatter -/// -[Serializable, NetSerializable] -public struct SupermatterConsoleEntry(NetEntity entity, - string entityName, - SupermatterStatusType status) -{ - /// - /// The entity in question - /// - public NetEntity NetEntity = entity; - - /// - /// Name of the entity - /// - public string EntityName = entityName; - - /// - /// Current alert level - /// - public SupermatterStatusType EntityStatus = status; -} - -/// -/// Used to inform the server that the specified focus for the atmos monitoring console has been changed by the client -/// -[Serializable, NetSerializable] -public sealed class SupermatterConsoleFocusChangeMessage(NetEntity? focusSupermatter) : BoundUserInterfaceMessage -{ - public NetEntity? FocusSupermatter = focusSupermatter; -} - -[NetSerializable, Serializable] -public enum SupermatterConsoleVisuals -{ - ComputerLayerScreen, -} - -/// -/// UI key associated with the supermatter monitoring console -/// -[Serializable, NetSerializable] -public enum SupermatterConsoleUiKey -{ - Key -} diff --git a/Modules/GoobStation/Resources/Prototypes/Entities/Supermatter/supermatter.yml b/Modules/GoobStation/Resources/Prototypes/Entities/Supermatter/supermatter.yml index 258fb95db2..e4efd60e71 100644 --- a/Modules/GoobStation/Resources/Prototypes/Entities/Supermatter/supermatter.yml +++ b/Modules/GoobStation/Resources/Prototypes/Entities/Supermatter/supermatter.yml @@ -71,4 +71,3 @@ location: supermatter - type: StealTarget stealGroup: SupermatterSliver # uses to verify sm existense on map - - type: PhysicsGunBlacklist From 22c243910799ce2008c3a3887812f5b6c698d519 Mon Sep 17 00:00:00 2001 From: SX-7 Date: Sun, 22 Feb 2026 15:02:37 +0100 Subject: [PATCH 06/16] fixups --- .../Content.Goobstation.Client.csproj | 6 +----- .../Content.Goobstation.Shared.csproj | 2 +- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/Modules/GoobStation/Content.Goobstation.Client/Content.Goobstation.Client.csproj b/Modules/GoobStation/Content.Goobstation.Client/Content.Goobstation.Client.csproj index 5b45092236..a6dcec4af4 100644 --- a/Modules/GoobStation/Content.Goobstation.Client/Content.Goobstation.Client.csproj +++ b/Modules/GoobStation/Content.Goobstation.Client/Content.Goobstation.Client.csproj @@ -1,4 +1,4 @@ - + $(TargetFramework) false @@ -20,10 +20,6 @@ - - - - diff --git a/Modules/GoobStation/Content.Goobstation.Shared/Content.Goobstation.Shared.csproj b/Modules/GoobStation/Content.Goobstation.Shared/Content.Goobstation.Shared.csproj index 145930baa9..200fd59107 100644 --- a/Modules/GoobStation/Content.Goobstation.Shared/Content.Goobstation.Shared.csproj +++ b/Modules/GoobStation/Content.Goobstation.Shared/Content.Goobstation.Shared.csproj @@ -1,4 +1,4 @@ - + net10.0 From 215575ef44a0e10ffc3682dfdc2dc447e4767117 Mon Sep 17 00:00:00 2001 From: SX-7 Date: Sun, 22 Feb 2026 18:36:08 +0100 Subject: [PATCH 07/16] Improve --- .../Supermatter/Systems/SupermatterSystem.cs | 8 -------- .../Supermatter/Systems/SupermatterSystem.cs | 3 ++- .../Components/SupermatterComponent.cs | 7 +++++-- .../Systems/SharedSupermatterSystem.cs | 12 ------------ .../Audio/Supermatter/attributions.yml | 5 +++++ .../Resources/Audio/Supermatter/dust.ogg | Bin 0 -> 16678 bytes .../Entities/Supermatter/supermatter.yml | 8 +++----- .../Entities/Mobs/Player/observer.yml | 1 + 8 files changed, 16 insertions(+), 28 deletions(-) create mode 100644 Modules/GoobStation/Resources/Audio/Supermatter/dust.ogg diff --git a/Modules/GoobStation/Content.Goobstation.Client/Supermatter/Systems/SupermatterSystem.cs b/Modules/GoobStation/Content.Goobstation.Client/Supermatter/Systems/SupermatterSystem.cs index c709edb1df..8da952c97b 100644 --- a/Modules/GoobStation/Content.Goobstation.Client/Supermatter/Systems/SupermatterSystem.cs +++ b/Modules/GoobStation/Content.Goobstation.Client/Supermatter/Systems/SupermatterSystem.cs @@ -9,13 +9,5 @@ public sealed class SupermatterSystem : SharedSupermatterSystem public override void Initialize() { base.Initialize(); - - SubscribeLocalEvent(HandleSupermatterState); - } - - private void HandleSupermatterState(EntityUid uid, SupermatterComponent comp, ref ComponentHandleState args) - { - if (args.Current is not SupermatterComponentState) - return; } } diff --git a/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.cs b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.cs index 06b6f12fb1..29e9e445f1 100644 --- a/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.cs +++ b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.cs @@ -578,6 +578,7 @@ private void OnCollideEvent(EntityUid uid, SupermatterComponent sm, ref StartCol // Stop immune entities from activating the sm. if (args.OtherBody.BodyType == BodyType.Static || HasComp(target) + || MetaData(target).EntityPrototype?.ID == sm.AshPrototypeId || _container.IsEntityInContainer(uid)) return; @@ -609,7 +610,7 @@ private void OnCollideEvent(EntityUid uid, SupermatterComponent sm, ref StartCol if (!HasComp(target)) { //_adminLog.Add(LogType.Supermatter, LogImpact.Medium, $"Supermatter {ToPrettyString(uid)} has consumed {ToPrettyString(target)}"); - EntityManager.SpawnEntity("Ash", Transform(target).Coordinates); + EntityManager.SpawnAttachedTo(sm.AshPrototypeId, Transform(target).Coordinates); _audio.PlayPvs(sm.DustSound, uid); } diff --git a/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Components/SupermatterComponent.cs b/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Components/SupermatterComponent.cs index 2765e844fe..6b18e3a2b1 100644 --- a/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Components/SupermatterComponent.cs +++ b/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Components/SupermatterComponent.cs @@ -32,6 +32,9 @@ public sealed partial class SupermatterComponent : Component [ViewVariables(VVAccess.ReadWrite)] public bool SliverRemoved = false; + [DataField("ashPrototype", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string AshPrototypeId { get; private set; } = "Ash"; + [DataField("whitelist")] public EntityWhitelist Whitelist = new(); public string IdTag = "EmitterBolt"; @@ -109,10 +112,10 @@ public sealed partial class SupermatterComponent : Component public SharedSupermatterSystem.SuperMatterSound? SmSound; [DataField("dustSound")] - public SoundSpecifier DustSound = new SoundPathSpecifier("/Audio/_Goobstation/Wizard/supermatter.ogg"); + public SoundSpecifier DustSound = new SoundPathSpecifier("/Audio/Supermatter/dust.ogg"); [DataField("delamSound")] - public SoundSpecifier DelamSound = new SoundPathSpecifier("/Audio/_Goobstation/Supermatter/delamming.ogg"); + public SoundSpecifier DelamSound = new SoundPathSpecifier("/Audio/Supermatter/delamming.ogg"); [DataField("delamAlarm")] public SoundSpecifier DelamAlarm = new SoundPathSpecifier("/Audio/Machines/alarm.ogg"); diff --git a/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Systems/SharedSupermatterSystem.cs b/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Systems/SharedSupermatterSystem.cs index e61910f382..3105e6f6c2 100644 --- a/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Systems/SharedSupermatterSystem.cs +++ b/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Systems/SharedSupermatterSystem.cs @@ -32,16 +32,4 @@ public static void OnSupermatterStartup(EntityUid uid, SupermatterComponent comp #endregion Getters/Setters - #region Serialization - /// - /// A state wrapper used to sync the supermatter between the server and client. - /// - [Serializable, NetSerializable] - protected sealed class SupermatterComponentState(SupermatterComponent supermatter) : ComponentState - { - private readonly SupermatterComponent _supermatter = supermatter; - } - - #endregion Serialization - } diff --git a/Modules/GoobStation/Resources/Audio/Supermatter/attributions.yml b/Modules/GoobStation/Resources/Audio/Supermatter/attributions.yml index 0105f7edfd..acc4c36f71 100644 --- a/Modules/GoobStation/Resources/Audio/Supermatter/attributions.yml +++ b/Modules/GoobStation/Resources/Audio/Supermatter/attributions.yml @@ -7,3 +7,8 @@ license: "CC-BY-3.0" copyright: "Unknown" source: "https://forums.goobstation.com" + +- files: ["dust.ogg"] + license: "CC-BY-3.0" + copyright: "Unknown" + source: "https://forums.goobstation.com" diff --git a/Modules/GoobStation/Resources/Audio/Supermatter/dust.ogg b/Modules/GoobStation/Resources/Audio/Supermatter/dust.ogg new file mode 100644 index 0000000000000000000000000000000000000000..0e9abf3ad8126ef1728a4df5562c8cee30401704 GIT binary patch literal 16678 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 Date: Sun, 22 Feb 2026 17:42:22 +0000 Subject: [PATCH 08/16] chore: Automatically update REUSE headers --- .../Supermatter/Systems/SupermatterSystem.cs | 4 ++++ .../Supermatter/Systems/SupermatterSystem.cs | 4 ++++ .../Supermatter/Components/SupermatterComponent.cs | 4 ++++ .../Supermatter/Components/SupermatterFoodComponent.cs | 4 ++++ .../Supermatter/Components/SupermatterImmuneComponent.cs | 4 ++++ .../Supermatter/Systems/SharedSupermatterSystem.cs | 4 ++++ .../GoobStation/Resources/Audio/Supermatter/attributions.yml | 4 ++++ .../Resources/Prototypes/Entities/Supermatter/supermatter.yml | 4 ++++ 8 files changed, 32 insertions(+) diff --git a/Modules/GoobStation/Content.Goobstation.Client/Supermatter/Systems/SupermatterSystem.cs b/Modules/GoobStation/Content.Goobstation.Client/Supermatter/Systems/SupermatterSystem.cs index c709edb1df..39c16f8914 100644 --- a/Modules/GoobStation/Content.Goobstation.Client/Supermatter/Systems/SupermatterSystem.cs +++ b/Modules/GoobStation/Content.Goobstation.Client/Supermatter/Systems/SupermatterSystem.cs @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2026 Goob Station Contributors +// +// SPDX-License-Identifier: MPL-2.0 + using Content.Goobstation.Shared.Supermatter.Components; using Content.Goobstation.Shared.Supermatter.Systems; using Robust.Shared.GameStates; diff --git a/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.cs b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.cs index 06b6f12fb1..0bccc7f218 100644 --- a/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.cs +++ b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.cs @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2026 Goob Station Contributors +// +// SPDX-License-Identifier: MPL-2.0 + using Content.Goobstation.Shared.Supermatter.Components; using Content.Goobstation.Shared.Supermatter.Systems; using Content.Server.AlertLevel; diff --git a/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Components/SupermatterComponent.cs b/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Components/SupermatterComponent.cs index 2765e844fe..9b7909ec95 100644 --- a/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Components/SupermatterComponent.cs +++ b/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Components/SupermatterComponent.cs @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2026 Goob Station Contributors +// +// SPDX-License-Identifier: MPL-2.0 + using Content.Goobstation.Shared.Supermatter.Systems; using Content.Shared.Atmos; using Content.Shared.DoAfter; diff --git a/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Components/SupermatterFoodComponent.cs b/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Components/SupermatterFoodComponent.cs index ef5070cb5f..1fb96da164 100644 --- a/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Components/SupermatterFoodComponent.cs +++ b/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Components/SupermatterFoodComponent.cs @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2026 Goob Station Contributors +// +// SPDX-License-Identifier: MPL-2.0 + namespace Content.Goobstation.Shared.Supermatter.Components; [RegisterComponent] diff --git a/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Components/SupermatterImmuneComponent.cs b/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Components/SupermatterImmuneComponent.cs index b3cfe88954..64d77ea4c6 100644 --- a/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Components/SupermatterImmuneComponent.cs +++ b/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Components/SupermatterImmuneComponent.cs @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2026 Goob Station Contributors +// +// SPDX-License-Identifier: MPL-2.0 + using Robust.Shared.GameStates; namespace Content.Goobstation.Shared.Supermatter.Components; diff --git a/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Systems/SharedSupermatterSystem.cs b/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Systems/SharedSupermatterSystem.cs index e61910f382..e473af6830 100644 --- a/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Systems/SharedSupermatterSystem.cs +++ b/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Systems/SharedSupermatterSystem.cs @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2026 Goob Station Contributors +// +// SPDX-License-Identifier: MPL-2.0 + using Content.Goobstation.Shared.Supermatter.Components; using Robust.Shared.Serialization; diff --git a/Modules/GoobStation/Resources/Audio/Supermatter/attributions.yml b/Modules/GoobStation/Resources/Audio/Supermatter/attributions.yml index 0105f7edfd..34dcd29900 100644 --- a/Modules/GoobStation/Resources/Audio/Supermatter/attributions.yml +++ b/Modules/GoobStation/Resources/Audio/Supermatter/attributions.yml @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Space Station 14 Contributors +# +# SPDX-License-Identifier: MPL-2.0 + - files: ["calm.ogg"] license: "CC-BY-3.0" copyright: "Unknown" diff --git a/Modules/GoobStation/Resources/Prototypes/Entities/Supermatter/supermatter.yml b/Modules/GoobStation/Resources/Prototypes/Entities/Supermatter/supermatter.yml index e4efd60e71..2def8baf5a 100644 --- a/Modules/GoobStation/Resources/Prototypes/Entities/Supermatter/supermatter.yml +++ b/Modules/GoobStation/Resources/Prototypes/Entities/Supermatter/supermatter.yml @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2026 Space Station 14 Contributors +# +# SPDX-License-Identifier: MPL-2.0 + - type: entity id: Supermatter name: supermatter crystal From 3d1d70170d6d27a91d97671e3454d43abed864a8 Mon Sep 17 00:00:00 2001 From: SX-7 Date: Sun, 22 Feb 2026 19:00:07 +0100 Subject: [PATCH 09/16] Improve logging a bit --- .../Supermatter/Systems/SupermatterSystem.cs | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.cs b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.cs index 29e9e445f1..32339a3d6d 100644 --- a/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.cs +++ b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.cs @@ -45,6 +45,7 @@ public sealed class SupermatterSystem : SharedSupermatterSystem [Dependency] private readonly DoAfterSystem _doAfter = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; [Dependency] private readonly ISharedAdminLogManager _adminLog = default!; + [Dependency] private readonly ISharedChatManager _sharedChat = default!; private DelamType _delamType = DelamType.Explosion; @@ -587,13 +588,10 @@ private void OnCollideEvent(EntityUid uid, SupermatterComponent sm, ref StartCol // Extra logging for supermatter var activator = ToPrettyString(args.OtherEntity); - // Original log entry - //_adminLog.Add(LogType.Supermatter, impact, - // $"{activator:actor} activated Supermatter {ToPrettyString(uid):subject}"); + _sharedChat.SendAdminAlert($"Supermatter activated by {activator} at {Transform(uid).Coordinates}"); - // New admin alert - _adminLog.Add(LogType.AdminMessage, LogImpact.Extreme, - $"SUPERMATTER ACTIVATED BY {activator} AT {Transform(uid).Coordinates}"); + _adminLog.Add(LogType.Action, LogImpact.High, + $"Supermatter activated by {activator} at {Transform(uid).Coordinates}"); sm.Activated = true; } @@ -609,7 +607,7 @@ private void OnCollideEvent(EntityUid uid, SupermatterComponent sm, ref StartCol if (!HasComp(target)) { - //_adminLog.Add(LogType.Supermatter, LogImpact.Medium, $"Supermatter {ToPrettyString(uid)} has consumed {ToPrettyString(target)}"); + _adminLog.Add(LogType.EntityDelete, LogImpact.Medium, $"Supermatter {ToPrettyString(uid)} has consumed {ToPrettyString(target)}"); EntityManager.SpawnAttachedTo(sm.AshPrototypeId, Transform(target).Coordinates); _audio.PlayPvs(sm.DustSound, uid); } From dfb4c3fd043f071755f00d449b1de5ab049ba677 Mon Sep 17 00:00:00 2001 From: SX-7 Date: Tue, 24 Feb 2026 10:40:52 +0100 Subject: [PATCH 10/16] tweak rads to be more 1:1 with power --- .../Supermatter/Systems/SupermatterSystem.cs | 25 +++++----- .../Components/SupermatterComponent.cs | 49 +++++++++---------- .../Entities/Supermatter/supermatter.yml | 7 --- 3 files changed, 37 insertions(+), 44 deletions(-) diff --git a/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.cs b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.cs index 561c17a7ef..1a6609a1ce 100644 --- a/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.cs +++ b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.cs @@ -190,19 +190,15 @@ private void ProcessAtmos(EntityUid uid, SupermatterComponent sm) // Transfer matter power to power if (sm.MatterPower != 0) { - // Get how much matter power to transfer. Above 400 starts scaling. Min wrapped to ensure we don't magically create more power. - var removedMatter = Math.Min(Math.Max(sm.MatterPower / sm.MatterPowerConversion, 40), sm.MatterPower); - //Adds at least 40 power + // Get how much matter power to transfer + var removedMatter = Math.Clamp(sm.MatterPower, 0f, 1f * sm.MatterPowerConversion); + sm.Power = Math.Max(sm.Power + removedMatter, 0); - //Removes at least 40 matter power sm.MatterPower = Math.Max(sm.MatterPower - removedMatter, 0); } - // Additional scaling of power gen from temperature above .8 factor. - var tempFactor = heatModifier > 0.8 ? 50f : 30f; - // Increase power from temperature - sm.Power = Math.Max(absorbedGas.Temperature * heatModifier * tempFactor / Atmospherics.T0C + sm.Power, 0); + sm.Power = Math.Max(absorbedGas.Temperature * heatModifier / Atmospherics.T0C + sm.Power, 0); // Yeah, it consumes all ammonia in one tick cuz it's funny af sm.Power = Math.Max(absorbedGas.GetMoles(Gas.Ammonia) * sm.AmmoniaEnergyPerMole + sm.Power, 0); @@ -235,11 +231,16 @@ private void ProcessAtmos(EntityUid uid, SupermatterComponent sm) #region Scale down power - var powerReduction = (float)Math.Pow(sm.Power / 500f, 3f); + // I'd recommend plotting these two if you want to get it + // but in general this lets it need less input to stay under 10 power than above + // Below 10 power it substracts very little, and above it substracts 1/10 + // 10f (and 0.9f) hardcoded to discourage yaml majors messing with it since it impacts a lot + // (And would require massive structural changes, all to minuscule benefit) + var powerReduction = (float)Math.Pow(sm.Power / 5f, 3f); // After this point power is lowered // This wraps around to the begining of the function - sm.Power = Math.Max(sm.Power - Math.Min(powerReduction * powerlossInhibitor, sm.Power * 0.83f * powerlossInhibitor), 0f); + sm.Power = Math.Max(sm.Power - Math.Min(powerReduction, sm.Power * 0.8f) * powerlossInhibitor, 0f); #endregion } @@ -607,7 +608,7 @@ private void OnCollideEvent(EntityUid uid, SupermatterComponent sm, ref StartCol else sm.Power++; - sm.MatterPower += HasComp(target) ? 200 : 0; + sm.MatterPower += HasComp(target) ? 10 : 0; if (!HasComp(target)) { @@ -629,7 +630,7 @@ private void OnHandInteract(EntityUid uid, SupermatterComponent sm, ref Interact if (!sm.Activated) sm.Activated = true; - sm.MatterPower += 200; + sm.MatterPower += 10; EntityManager.SpawnEntity("Ash", Transform(target).Coordinates); _audio.PlayPvs(sm.DustSound, uid); diff --git a/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Components/SupermatterComponent.cs b/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Components/SupermatterComponent.cs index dcbe9ae967..2790d4340e 100644 --- a/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Components/SupermatterComponent.cs +++ b/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Components/SupermatterComponent.cs @@ -11,6 +11,7 @@ using Robust.Shared.Prototypes; using Robust.Shared.Serialization; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.Array; namespace Content.Goobstation.Shared.Supermatter.Components; @@ -23,7 +24,6 @@ public sealed partial class SupermatterComponent : Component /// The SM will only cycle if activated. ///
[DataField("activated")] - [ViewVariables(VVAccess.ReadWrite)] public bool Activated = false; [DataField("supermatterSliverPrototype", customTypeSerializer: typeof(PrototypeIdSerializer))] @@ -33,17 +33,18 @@ public sealed partial class SupermatterComponent : Component /// Affects delamination timer. If removed - delamination timer is divided by 2. ///
[DataField("sliverRemoved")] - [ViewVariables(VVAccess.ReadWrite)] public bool SliverRemoved = false; + /// + /// What will be spawned when an entity that's not supermatter immune interacts with it. + /// [DataField("ashPrototype", customTypeSerializer: typeof(PrototypeIdSerializer))] public string AshPrototypeId { get; private set; } = "Ash"; - [DataField("whitelist")] - public EntityWhitelist Whitelist = new(); - public string IdTag = "EmitterBolt"; - - public string[] LightningPrototypes = + /// + /// There has to be a way to serialize this properly + /// + public readonly string[] LightningPrototypes = [ "Lightning", "ChargedLightning", @@ -60,20 +61,11 @@ public sealed partial class SupermatterComponent : Component [DataField("supermatterKudzuSpawnPrototype", customTypeSerializer: typeof(PrototypeIdSerializer))] public string SupermatterKudzuPrototypeId = "SupermatterKudzu"; - [ViewVariables(VVAccess.ReadWrite)] - public float Power; - - /// - /// EE Console Compatibility - /// - [ViewVariables(VVAccess.ReadWrite)] - public float Temperature; - /// - /// EE Console Compatibility + /// This is what you're here for /// [ViewVariables(VVAccess.ReadWrite)] - public float WasteMultiplier; + public float Power; /// /// The amount of damage we have currently @@ -81,30 +73,37 @@ public sealed partial class SupermatterComponent : Component [ViewVariables(VVAccess.ReadWrite)] public float Damage = 0f; + /// + /// Damage change since last cycle + /// [ViewVariables(VVAccess.ReadWrite)] public float DamageDelta = 0f; + /// + /// Temporary power gained from mob consumption. Purely to not instaspike power to 2000 or something. + /// [ViewVariables(VVAccess.ReadWrite)] public float MatterPower; + /// + /// Ratio of matter power to power conversion rate. 1 mob = 10 matter power + /// [ViewVariables(VVAccess.ReadWrite)] - public float MatterPowerConversion = 10f; + public float MatterPowerConversion = 1f; /// - /// The portion of the gasmix we're on + /// The portion of the gasmix we're on. Relevant for gas processing but not for plain checks. /// [ViewVariables(VVAccess.ReadWrite)] public float GasEfficiency = 0.15f; /// - /// The amount of heat we apply scaled + /// Multiply outgoing rads by this. Generic knob. /// - [ViewVariables(VVAccess.ReadWrite)] - public float HeatThreshold = 2500f; - [DataField("radiationOutputFactor")] [ViewVariables(VVAccess.ReadWrite)] - public float RadiationOutputFactor = 0.03f; + public float RadiationOutputFactor = 1f; + #endregion SM Base #region SM Sound diff --git a/Modules/GoobStation/Resources/Prototypes/Entities/Supermatter/supermatter.yml b/Modules/GoobStation/Resources/Prototypes/Entities/Supermatter/supermatter.yml index c4afdbcd7c..d7d1404ebb 100644 --- a/Modules/GoobStation/Resources/Prototypes/Entities/Supermatter/supermatter.yml +++ b/Modules/GoobStation/Resources/Prototypes/Entities/Supermatter/supermatter.yml @@ -10,13 +10,6 @@ mode: SnapgridCenter components: - type: Supermatter - radiationOutputFactor: 0.005 - whitelist: - tags: - - EmitterBolt - components: - - Body - - Item - type: RadiationSource - type: AmbientSound range: 5 From fa3e6cdf62ca9c096d04b44c536d1a73c4a00c6e Mon Sep 17 00:00:00 2001 From: SX-7 Date: Tue, 24 Feb 2026 21:14:20 +0100 Subject: [PATCH 11/16] I KNOW! JUST USE EXTENSION METHODS !!! --- .../Supermatter/Systems/SupermatterSystem.cs | 218 ++++++++++-------- .../Components/SupermatterComponent.cs | 2 +- 2 files changed, 126 insertions(+), 94 deletions(-) diff --git a/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.cs b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.cs index 1a6609a1ce..b9d4ba6702 100644 --- a/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.cs +++ b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.cs @@ -23,20 +23,20 @@ using Content.Shared.Mobs.Components; using Content.Shared.Projectiles; using Content.Shared.Radiation.Components; -using Robust.Server.GameObjects; using Robust.Shared.Audio.Systems; using Robust.Shared.Containers; using Robust.Shared.Maths; using Robust.Shared.Physics; using Robust.Shared.Physics.Events; using Robust.Shared.Timing; +using System.Diagnostics.CodeAnalysis; using System.Text; namespace Content.Goobstation.Server.Supermatter.Systems; public sealed class SupermatterSystem : SharedSupermatterSystem { - [Dependency] private readonly AtmosphereSystem _atmosphere = default!; + [Dependency] private static readonly AtmosphereSystem Atmosphere = default!; [Dependency] private readonly ChatSystem _chat = default!; [Dependency] private readonly SharedContainerSystem _container = default!; [Dependency] private readonly ExplosionSystem _explosion = default!; @@ -80,7 +80,7 @@ private void OnMapInit(EntityUid uid, SupermatterComponent component, MapInitEve _ambient.SetAmbience(uid, true); //Add Air to the initialized SM in the Map so it doesnt delam on default - var mix = _atmosphere.GetContainingMixture(uid, true, true); + var mix = Atmosphere.GetContainingMixture(uid, true, true); mix?.AdjustMoles(Gas.Oxygen, Atmospherics.OxygenMolesStandard); mix?.AdjustMoles(Gas.Nitrogen, Atmospherics.NitrogenMolesStandard); } @@ -144,65 +144,54 @@ private void ProcessAtmos(EntityUid uid, SupermatterComponent sm) { #region Get gas mix - var mix = _atmosphere.GetContainingMixture(uid, true, true); + var mix = Atmosphere.GetContainingMixture(uid, true, true); if (mix is not { }) return; - var absorbedGas = mix.Remove(sm.GasEfficiency * mix.TotalMoles); - var moles = absorbedGas.TotalMoles; + using var absorbed = new GasWrapper(mix, sm.GasEfficiency); + + var moles = absorbed.Gas.TotalMoles; if (!(moles > 0f)) return; #endregion - var (radModifier, zapModifier, moleModifier, heatModifier, heatResistModifier) = GetGasModifiers(absorbedGas); + var (radModifier, zapModifier, moleModifier, heatModifier, heatResistModifier) = SupermatterComponent.GetGasModifiers(absorbed.Gas); #region Calculate CO2 powerloss inhibition effect - // Calculate powerloss modifier based on CO2 - // Ramps up or down in increments of 0.02 up to the proportion of co2 - // Given infinite time, powerloss_dynamic_scaling = co2comp - // Some value between 0 and 1 - if (moles > sm.PowerlossInhibitionMoleThreshold && absorbedGas.GetMoles(Gas.CarbonDioxide) / moles > sm.PowerlossInhibitionGasThreshold) - { - var co2powerloss = Math.Clamp(absorbedGas.GetMoles(Gas.CarbonDioxide) / moles - sm.PowerlossDynamicScaling, -0.02f, 0.02f); - sm.PowerlossDynamicScaling = Math.Clamp(sm.PowerlossDynamicScaling + co2powerloss, 0f, 1f); - } - else - { - sm.PowerlossDynamicScaling = Math.Clamp(sm.PowerlossDynamicScaling - 0.05f, 0f, 1f); - } + //var co2Ratio = absorbed.Gas.GetMoles(Gas.CarbonDioxide) / moles; - // Ranges from 0 to 1(1-(value between 0 and 1 * ranges from 1 to 1.5(mol / 500))) - // We take the mol count, and scale it to be our inhibitor - var powerlossInhibitor = - Math.Clamp( - 1 - sm.PowerlossDynamicScaling * - Math.Clamp(moles / sm.PowerlossInhibitionMoleBoostThreshold, 1f, 1.5f), - 0f, 1f); + //// Instantly apply CO2 ratio if thresholds are met, otherwise 0 + //sm.PowerlossDynamicScaling = (moles > sm.PowerlossInhibitionMoleThreshold && co2Ratio > sm.PowerlossInhibitionGasThreshold) + // ? co2Ratio + // : 0f; + + //var moleBoost = Math.Clamp(moles / sm.PowerlossInhibitionMoleBoostThreshold, 1f, 1.5f); + //var powerlossInhibitor = Math.Clamp(1f - sm.PowerlossDynamicScaling * moleBoost, 0f, 1f); #endregion #region Add power to crystal - // Transfer matter power to power - if (sm.MatterPower != 0) - { - // Get how much matter power to transfer - var removedMatter = Math.Clamp(sm.MatterPower, 0f, 1f * sm.MatterPowerConversion); + //// Transfer matter power to power + //if (sm.MatterPower != 0) + //{ + // // Get how much matter power to transfer + // var removedMatter = Math.Clamp(sm.MatterPower, 0f, 1f * sm.MatterPowerConversion); - sm.Power = Math.Max(sm.Power + removedMatter, 0); - sm.MatterPower = Math.Max(sm.MatterPower - removedMatter, 0); - } + // sm.Power = Math.Max(sm.Power + removedMatter, 0); + // sm.MatterPower = Math.Max(sm.MatterPower - removedMatter, 0); + //} // Increase power from temperature - sm.Power = Math.Max(absorbedGas.Temperature * heatModifier / Atmospherics.T0C + sm.Power, 0); + sm.Power = Math.Max(absorbed.Gas.Temperature * heatModifier / Atmospherics.T0C + sm.Power, 0); - // Yeah, it consumes all ammonia in one tick cuz it's funny af - sm.Power = Math.Max(absorbedGas.GetMoles(Gas.Ammonia) * sm.AmmoniaEnergyPerMole + sm.Power, 0); - absorbedGas.SetMoles(Gas.Ammonia, 0f); + //// Yeah, it consumes all ammonia in one tick cuz it's funny af + //sm.Power = Math.Max(absorbed.Gas.GetMoles(Gas.Ammonia) * sm.AmmoniaEnergyPerMole + sm.Power, 0); + //absorbed.Gas.SetMoles(Gas.Ammonia, 0f); #endregion @@ -218,14 +207,11 @@ private void ProcessAtmos(EntityUid uid, SupermatterComponent sm) var energy = sm.Power * sm.ReactionPowerModifier; // Release the waste. Both are scaled by modifier and energy, but o2 also scales with temperatures. - absorbedGas.AdjustMoles(Gas.Oxygen, Math.Max(moleModifier * (energy + absorbedGas.Temperature - Atmospherics.T0C) * sm.OxygenReleaseEfficiencyModifier, 0f)); - absorbedGas.AdjustMoles(Gas.Plasma, Math.Max(moleModifier * sm.PlasmaReleaseModifier * energy, 0f)); + absorbed.Gas.AdjustMoles(Gas.Oxygen, Math.Max(moleModifier * (energy + absorbed.Gas.Temperature - Atmospherics.T0C) * sm.OxygenReleaseEfficiencyModifier, 0f)); + absorbed.Gas.AdjustMoles(Gas.Plasma, Math.Max(moleModifier * sm.PlasmaReleaseModifier * energy, 0f)); // Increase temperature - absorbedGas.Temperature += energy * sm.ThermalReleaseModifier; - - // Return the gas to nature :) - _atmosphere.Merge(mix, absorbedGas); + absorbed.Gas.Temperature += energy * sm.ThermalReleaseModifier; #endregion @@ -245,45 +231,6 @@ private void ProcessAtmos(EntityUid uid, SupermatterComponent sm) #endregion } - /// - /// Get SM related data about a provided gas mix. - /// - /// Mix to be parsed - /// A selection of values, check - private (float radModifier, float zapModifier, float moleModifier, float heatModifier, float heatResistModifier) GetGasModifiers(GasMixture absorbedGas) - { - // Get the proportions of the gasses in the mix, which range between 0 and 1 - // Also get their corresponding facts and calculate mods from it. - // Preallocate variables - var facts = SupermatterComponent.GasDataFields(); - var gasPercentages = new Dictionary(Enum.GetNames().Length); - var radModifier = 1f; - var zapModifier = 1f; - var moleModifier = 1f; - var heatModifier = 1f; - var heatResistModifier = 1f; - for (int i = 0; i < Enum.GetNames().Length; i++) - { - gasPercentages[(Gas)i] = absorbedGas[i] / absorbedGas.TotalMoles; - facts = SupermatterComponent.GasDataFields((Gas)i); - radModifier += gasPercentages[(Gas)i] * facts.RadMod; - zapModifier += gasPercentages[(Gas)i] * facts.ZapMod; - moleModifier += gasPercentages[(Gas)i] * facts.MoleMod; - heatModifier += gasPercentages[(Gas)i] * facts.HeatMod; - heatResistModifier += gasPercentages[(Gas)i] * facts.HeatResistMod; - } - - // Ensure we don't do something stupid later - return ( - Math.Max(radModifier, 0f), - Math.Max(zapModifier, 0f), - Math.Max(moleModifier, 0f), - Math.Max(heatModifier, 0f), - Math.Max(heatResistModifier, 0f) - ); - - } - /// /// Shoot lightning bolts depensing on accumulated power. /// @@ -295,7 +242,7 @@ private void SupermatterZap(EntityUid uid, SupermatterComponent sm) // This isn't DRY but erm whatever. Alternatively I can surface this. And add a few params or some weird struct. // (Also I can't cleanly run it on top level anyways since damage is independent - var mix = _atmosphere.GetContainingMixture(uid, true, true); + var mix = Atmosphere.GetContainingMixture(uid, true, true); if (mix is not { }) return; @@ -306,7 +253,7 @@ private void SupermatterZap(EntityUid uid, SupermatterComponent sm) if (!(moles > 0f)) return; - var (_, zapModifier, _, _, _) = GetGasModifiers(gas); + var (_, zapModifier, _, _, _) = gas.GetGasModifiers(); #endregion @@ -327,7 +274,7 @@ private void HandleDamage(EntityUid uid, SupermatterComponent sm) #region Get gas info - var mix = _atmosphere.GetContainingMixture(uid, true, true); + var mix = Atmosphere.GetContainingMixture(uid, true, true); // We're in space or there is no gas to process if (mix is not { } || mix.TotalMoles == 0f) @@ -337,9 +284,9 @@ private void HandleDamage(EntityUid uid, SupermatterComponent sm) } // Absorbed gas from surrounding area - var gas = mix.Clone(); - var moles = gas.TotalMoles; - var (_, _, _, _, heatResistModifier) = GetGasModifiers(gas); + using var surrounding = new GasWrapper(mix, sm.GasEfficiency); + var moles = surrounding.Gas.TotalMoles; + var (_, _, _, _, heatResistModifier) = SupermatterComponent.GetGasModifiers(surrounding.Gas); #endregion @@ -348,7 +295,7 @@ private void HandleDamage(EntityUid uid, SupermatterComponent sm) var tempThreshold = (Atmospherics.T0C + sm.HeatPenaltyThreshold) * heatResistModifier; // Temperature start to have a positive effect on damage after 350 - var tempDamage = Math.Max(Math.Clamp(moles / 200f, .5f, 1f) * gas.Temperature - tempThreshold, 0f) * sm.MoleHeatThreshold / 150f * sm.DamageIncreaseMultiplier; + var tempDamage = Math.Max(Math.Clamp(moles / 200f, .5f, 1f) * surrounding.Gas.Temperature - tempThreshold, 0f) * sm.MoleHeatThreshold / 150f * sm.DamageIncreaseMultiplier; totalDamage += tempDamage; // Power only starts affecting damage when it is above 5000 @@ -363,7 +310,7 @@ private void HandleDamage(EntityUid uid, SupermatterComponent sm) if (moles < sm.MolePenaltyThreshold) { // left there a very small float value so that it doesn't eventually divide by 0. - var healHeatDamage = Math.Min(gas.Temperature - tempThreshold, 0.001f) / 150; + var healHeatDamage = Math.Min(surrounding.Gas.Temperature - tempThreshold, 0.001f) / 150; totalDamage += healHeatDamage; } @@ -491,7 +438,7 @@ public static float GetIntegrity(SupermatterComponent sm) /// public DelamType ChooseDelamType(EntityUid uid, SupermatterComponent sm) { - var mix = _atmosphere.GetContainingMixture(uid, true, true); + var mix = Atmosphere.GetContainingMixture(uid, true, true); if (mix is { }) { @@ -692,4 +639,89 @@ private void OnExamine(EntityUid uid, SupermatterComponent sm, ref ExaminedEvent } #endregion + + /// + /// Simple wrapper around + /// Splits off a part of gas, and merges them together later + /// is automatically called at the end - + /// use instead if you want to handle it manually + /// + private readonly struct GasWrapper(GasMixture surroundingMix, float ratio) : IDisposable + { + private readonly GasMixture _surrounding = surroundingMix; + + /// + /// The split off part of your gas. + /// + public readonly GasMixture Gas = surroundingMix.RemoveRatio(ratio); + + public void Dispose() + { + Atmosphere.Merge(_surrounding, Gas); + } + } + + private bool GetGasmix(EntityUid uid, [NotNullWhen(true)] out GasWrapper? gasWrapper, float? ratio = null) + { + var mix = Atmosphere.GetContainingMixture(uid, true, true); + gasWrapper = null; + + if (mix is not { } || !(mix.TotalMoles > 0f)) + return false; + + gasWrapper = new GasWrapper(mix, ratio??0); + return true; + } +} + +public static class SmExtensions +{ + /// + /// Get SM related data about a provided gas mix. + /// + /// Mix to be parsed + /// A selection of values, check + public static (float radModifier, float zapModifier, float moleModifier, float heatModifier, float heatResistModifier) GetGasModifiers(this GasMixture absorbedGas) + { + var totalMoles = absorbedGas.TotalMoles; + + // Safety check: Prevent a divide-by-zero NaN cascade if the mix is completely empty + if (totalMoles <= 0f) + { + return (1f, 1f, 1f, 1f, 1f); + } + + var radModifier = 1f; + var zapModifier = 1f; + var moleModifier = 1f; + var heatModifier = 1f; + var heatResistModifier = 1f; + + // Safely iterate through the actual enum values, regardless of their integer backing + foreach (Gas gas in Enum.GetValues()) + { + // Note: Assuming absorbedGas indexer accepts an int. If it takes the enum directly, just use [gas] + var proportion = absorbedGas[(int)gas] / totalMoles; + + // Optional: Skip doing math if there's none of this gas in the mix + if (proportion <= 0f) continue; + + var facts = SupermatterComponent.GasDataFields(gas); + + radModifier += proportion * facts.RadMod; + zapModifier += proportion * facts.ZapMod; + moleModifier += proportion * facts.MoleMod; + heatModifier += proportion * facts.HeatMod; + heatResistModifier += proportion * facts.HeatResistMod; + } + + // Ensure we don't do something stupid later + return ( + Math.Max(radModifier, 0f), + Math.Max(zapModifier, 0f), + Math.Max(moleModifier, 0f), + Math.Max(heatModifier, 0f), + Math.Max(heatResistModifier, 0f) + ); + } } diff --git a/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Components/SupermatterComponent.cs b/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Components/SupermatterComponent.cs index 2790d4340e..7021dfa395 100644 --- a/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Components/SupermatterComponent.cs +++ b/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Components/SupermatterComponent.cs @@ -384,7 +384,7 @@ public sealed partial class SupermatterComponent : Component /// HeatResistMod = "Heat Resistance" on /tg/ wiki. Should never be so high as to shield from a trit fire. /// These values are for a 100% mix of such gas. These are additive, not multiplicative (so, 100%+mod) /// - public static (float RadMod, float ZapMod, float HeatMod, float MoleMod, float HeatResistMod) GasDataFields(Gas? gas = null) => gas switch + public static (float RadMod, float ZapMod, float HeatMod, float MoleMod, float HeatResistMod) GasDataFields(Gas gas) => gas switch { // /tg/ values are an ok start, but definitely don't have to be adhered to. // Some values might seem extreme - completely intentional to encourage mixes. From 503e6a261c6dc211229440c63ee0b7acabbd9b7f Mon Sep 17 00:00:00 2001 From: SX-7 Date: Wed, 25 Feb 2026 13:13:57 +0100 Subject: [PATCH 12/16] Extended more --- .../Supermatter/Systems/SupermatterSystem.cs | 77 ++++++++++--------- 1 file changed, 40 insertions(+), 37 deletions(-) diff --git a/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.cs b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.cs index b9d4ba6702..05ec1dfb2a 100644 --- a/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.cs +++ b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.cs @@ -29,14 +29,13 @@ using Robust.Shared.Physics; using Robust.Shared.Physics.Events; using Robust.Shared.Timing; -using System.Diagnostics.CodeAnalysis; using System.Text; namespace Content.Goobstation.Server.Supermatter.Systems; public sealed class SupermatterSystem : SharedSupermatterSystem { - [Dependency] private static readonly AtmosphereSystem Atmosphere = default!; + [Dependency] private static readonly AtmosphereSystem Atmosphere = default!; // Static since enum uses it to implement IDisposable [Dependency] private readonly ChatSystem _chat = default!; [Dependency] private readonly SharedContainerSystem _container = default!; [Dependency] private readonly ExplosionSystem _explosion = default!; @@ -158,40 +157,43 @@ private void ProcessAtmos(EntityUid uid, SupermatterComponent sm) #endregion - var (radModifier, zapModifier, moleModifier, heatModifier, heatResistModifier) = SupermatterComponent.GetGasModifiers(absorbed.Gas); + var (radModifier, zapModifier, moleModifier, heatModifier, heatResistModifier) = absorbed.Gas.GetGasModifiers(); #region Calculate CO2 powerloss inhibition effect - //var co2Ratio = absorbed.Gas.GetMoles(Gas.CarbonDioxide) / moles; + var co2Ratio = absorbed.Gas.GetGasMolarPercentage(Gas.CarbonDioxide); + var underThresholdScaler = Math.Min( + Math.Clamp(co2Ratio / sm.PowerlossInhibitionGasThreshold, 0, 1), + Math.Clamp(moles / sm.PowerlossInhibitionMoleThreshold, 0, 1) + ); - //// Instantly apply CO2 ratio if thresholds are met, otherwise 0 - //sm.PowerlossDynamicScaling = (moles > sm.PowerlossInhibitionMoleThreshold && co2Ratio > sm.PowerlossInhibitionGasThreshold) - // ? co2Ratio - // : 0f; + // Apply CO2 ratio if thresholds are met, otherwise limit the ratio according to how far away we are from thresholds + sm.PowerlossDynamicScaling = co2Ratio * underThresholdScaler; - //var moleBoost = Math.Clamp(moles / sm.PowerlossInhibitionMoleBoostThreshold, 1f, 1.5f); - //var powerlossInhibitor = Math.Clamp(1f - sm.PowerlossDynamicScaling * moleBoost, 0f, 1f); + // + var moleBoost = Math.Clamp(moles / sm.PowerlossInhibitionMoleBoostThreshold, 1f, 1.5f); + var powerlossInhibitor = Math.Clamp(1f - sm.PowerlossDynamicScaling * moleBoost, 0f, 1f); #endregion #region Add power to crystal - //// Transfer matter power to power - //if (sm.MatterPower != 0) - //{ - // // Get how much matter power to transfer - // var removedMatter = Math.Clamp(sm.MatterPower, 0f, 1f * sm.MatterPowerConversion); + // Transfer matter power to power + if (sm.MatterPower != 0) + { + // Get how much matter power to transfer + var removedMatter = Math.Clamp(sm.MatterPower, 0f, 1f * sm.MatterPowerConversion); - // sm.Power = Math.Max(sm.Power + removedMatter, 0); - // sm.MatterPower = Math.Max(sm.MatterPower - removedMatter, 0); - //} + sm.Power = Math.Max(sm.Power + removedMatter, 0); + sm.MatterPower = Math.Max(sm.MatterPower - removedMatter, 0); + } // Increase power from temperature sm.Power = Math.Max(absorbed.Gas.Temperature * heatModifier / Atmospherics.T0C + sm.Power, 0); - //// Yeah, it consumes all ammonia in one tick cuz it's funny af - //sm.Power = Math.Max(absorbed.Gas.GetMoles(Gas.Ammonia) * sm.AmmoniaEnergyPerMole + sm.Power, 0); - //absorbed.Gas.SetMoles(Gas.Ammonia, 0f); + // Yeah, it consumes all ammonia in one tick cuz it's funny af + sm.Power = Math.Max(absorbed.Gas.GetMoles(Gas.Ammonia) * sm.AmmoniaEnergyPerMole + sm.Power, 0); + absorbed.Gas.SetMoles(Gas.Ammonia, 0f); #endregion @@ -286,7 +288,7 @@ private void HandleDamage(EntityUid uid, SupermatterComponent sm) // Absorbed gas from surrounding area using var surrounding = new GasWrapper(mix, sm.GasEfficiency); var moles = surrounding.Gas.TotalMoles; - var (_, _, _, _, heatResistModifier) = SupermatterComponent.GetGasModifiers(surrounding.Gas); + var (_, _, _, _, heatResistModifier) = surrounding.Gas.GetGasModifiers(); #endregion @@ -660,18 +662,6 @@ public void Dispose() Atmosphere.Merge(_surrounding, Gas); } } - - private bool GetGasmix(EntityUid uid, [NotNullWhen(true)] out GasWrapper? gasWrapper, float? ratio = null) - { - var mix = Atmosphere.GetContainingMixture(uid, true, true); - gasWrapper = null; - - if (mix is not { } || !(mix.TotalMoles > 0f)) - return false; - - gasWrapper = new GasWrapper(mix, ratio??0); - return true; - } } public static class SmExtensions @@ -700,10 +690,9 @@ public static (float radModifier, float zapModifier, float moleModifier, float h // Safely iterate through the actual enum values, regardless of their integer backing foreach (Gas gas in Enum.GetValues()) { - // Note: Assuming absorbedGas indexer accepts an int. If it takes the enum directly, just use [gas] - var proportion = absorbedGas[(int)gas] / totalMoles; + var proportion = absorbedGas.GetGasMolarPercentage(gas); - // Optional: Skip doing math if there's none of this gas in the mix + // Skip doing math if there's none of this gas in the mix if (proportion <= 0f) continue; var facts = SupermatterComponent.GasDataFields(gas); @@ -724,4 +713,18 @@ public static (float radModifier, float zapModifier, float moleModifier, float h Math.Max(heatResistModifier, 0f) ); } + + public static float GetGasMolarPercentage(this GasMixture gasMix, Gas gas) + { + if (!(gasMix.TotalMoles > 0f)) + return 0f; + return gasMix.GetMoles(gas) / gasMix.TotalMoles; + } + + public static float GetGasMolarPercentage(this GasMixture gasMix, int gas) + { + if (!(gasMix.TotalMoles > 0f)) + return 0f; + return gasMix.GetMoles(gas) / gasMix.TotalMoles; + } } From 08f9e60223e821828882db24684049a821076ae4 Mon Sep 17 00:00:00 2001 From: SX-7 Date: Wed, 25 Feb 2026 15:36:01 +0100 Subject: [PATCH 13/16] Banana split --- .../Supermatter/Systems/SupermatterSystem.cs | 2 - .../Supermatter/SupermatterHelpers.cs | 122 ++++ .../Systems/SupermatterAtmosSystem.cs | 114 +++ .../Systems/SupermatterDamageSystem.cs | 69 ++ .../Systems/SupermatterDestructiveSystem.cs | 120 ++++ .../Systems/SupermatterSystem.Handlers.cs | 165 +++++ .../Supermatter/Systems/SupermatterSystem.cs | 647 +----------------- .../Systems/SupermatterYapSystem.cs | 108 +++ .../Components/SupermatterComponent.cs | 15 + .../Systems/SharedSupermatterSystem.cs | 1 - 10 files changed, 726 insertions(+), 637 deletions(-) create mode 100644 Modules/GoobStation/Content.Goobstation.Server/Supermatter/SupermatterHelpers.cs create mode 100644 Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterAtmosSystem.cs create mode 100644 Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterDamageSystem.cs create mode 100644 Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterDestructiveSystem.cs create mode 100644 Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.Handlers.cs create mode 100644 Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterYapSystem.cs diff --git a/Modules/GoobStation/Content.Goobstation.Client/Supermatter/Systems/SupermatterSystem.cs b/Modules/GoobStation/Content.Goobstation.Client/Supermatter/Systems/SupermatterSystem.cs index 0a07609151..01ec2559b4 100644 --- a/Modules/GoobStation/Content.Goobstation.Client/Supermatter/Systems/SupermatterSystem.cs +++ b/Modules/GoobStation/Content.Goobstation.Client/Supermatter/Systems/SupermatterSystem.cs @@ -2,9 +2,7 @@ // // SPDX-License-Identifier: MPL-2.0 -using Content.Goobstation.Shared.Supermatter.Components; using Content.Goobstation.Shared.Supermatter.Systems; -using Robust.Shared.GameStates; namespace Content.Goobstation.Client.Supermatter.Systems; diff --git a/Modules/GoobStation/Content.Goobstation.Server/Supermatter/SupermatterHelpers.cs b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/SupermatterHelpers.cs new file mode 100644 index 0000000000..0e2006766d --- /dev/null +++ b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/SupermatterHelpers.cs @@ -0,0 +1,122 @@ +using Content.Goobstation.Shared.Supermatter.Components; +using Content.Server.Atmos.EntitySystems; +using Content.Server.Chat.Systems; +using Content.Shared.Atmos; +using Content.Shared.Chat; +using Robust.Shared.Maths; +namespace Content.Goobstation.Server.Supermatter; + +/// +/// Simple wrapper around +/// Splits off a part of gas, and merges them together later +/// is automatically called at the end - +/// use instead if you want to handle it manually +/// +readonly struct GasWrapper(GasMixture surroundingMix, float ratio, AtmosphereSystem atmosphere) : IDisposable +{ + private readonly GasMixture _surrounding = surroundingMix; + + /// + /// The split off part of your gas. + /// + public readonly GasMixture Gas = surroundingMix.RemoveRatio(ratio); + + public void Dispose() + { + atmosphere.Merge(_surrounding, Gas); + } +} + +public static class SmExtensions +{ + /// + /// Get SM related data about a provided gas mix. + /// + /// Mix to be parsed + /// A selection of values, check + public static (float radModifier, float zapModifier, float moleModifier, float heatModifier, float heatResistModifier) GetGasModifiers(this GasMixture absorbedGas) + { + var totalMoles = absorbedGas.TotalMoles; + + // Safety check: Prevent a divide-by-zero NaN cascade if the mix is completely empty + if (totalMoles <= 0f) + { + return (1f, 1f, 1f, 1f, 1f); + } + + var radModifier = 1f; + var zapModifier = 1f; + var moleModifier = 1f; + var heatModifier = 1f; + var heatResistModifier = 1f; + + // Safely iterate through the actual enum values, regardless of their integer backing + foreach (Gas gas in Enum.GetValues()) + { + var proportion = absorbedGas.GetGasMolarPercentage(gas); + + // Skip doing math if there's none of this gas in the mix + if (proportion <= 0f) continue; + + var facts = SupermatterComponent.GasDataFields(gas); + + radModifier += proportion * facts.RadMod; + zapModifier += proportion * facts.ZapMod; + moleModifier += proportion * facts.MoleMod; + heatModifier += proportion * facts.HeatMod; + heatResistModifier += proportion * facts.HeatResistMod; + } + + // Ensure we don't do something stupid later + return ( + Math.Max(radModifier, 0f), + Math.Max(zapModifier, 0f), + Math.Max(moleModifier, 0f), + Math.Max(heatModifier, 0f), + Math.Max(heatResistModifier, 0f) + ); + } + + public static float GetGasMolarPercentage(this GasMixture gasMix, Gas gas) + { + if (!(gasMix.TotalMoles > 0f)) + return 0f; + return gasMix.GetMoles(gas) / gasMix.TotalMoles; + } + + public static float GetGasMolarPercentage(this GasMixture gasMix, int gas) + { + if (!(gasMix.TotalMoles > 0f)) + return 0f; + return gasMix.GetMoles(gas) / gasMix.TotalMoles; + } + + /// + /// Help the SM announce something. + /// + /// If true, does the station announcement. + /// If true, sends the announcement from Central Command. + public static void SupermatterAnnouncement(this ChatSystem chat, EntityUid uid, string message, bool global = false, string? customSender = null) + { + if (global) + { + var sender = customSender ?? Loc.GetString("supermatter-announcer"); + chat.DispatchStationAnnouncement(uid, message, sender, colorOverride: Color.Yellow); + return; + } + chat.TrySendInGameICMessage(uid, message, InGameICChatType.Speak, hideChat: false, checkRadioPrefix: true); + } +} + + +[ByRefEvent] +public record struct SupermatterTickEvent(SupermatterComponent Component); + +[ByRefEvent] +public record struct SupermatterYapEvent(SupermatterComponent Component); + +[ByRefEvent] +public record struct SupermatterZapEvent(SupermatterComponent Component); + +[ByRefEvent] +public record struct SupermatterDelamEvent(SupermatterComponent Component); diff --git a/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterAtmosSystem.cs b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterAtmosSystem.cs new file mode 100644 index 0000000000..a67854da47 --- /dev/null +++ b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterAtmosSystem.cs @@ -0,0 +1,114 @@ +using Content.Goobstation.Shared.Supermatter.Components; +using Content.Server.Atmos.EntitySystems; +using Content.Shared.Atmos; +using Content.Shared.Radiation.Components; + +namespace Content.Goobstation.Server.Supermatter.Systems; + +public sealed class SupermatterAtmosSystem : EntitySystem +{ + [Dependency] private readonly AtmosphereSystem _atmosphere = default!; + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(ProcessAtmos); + } + + /// + /// Handle power and radiation output depending on atmospheric things. + /// + private void ProcessAtmos(EntityUid uid, SupermatterComponent sm, SupermatterTickEvent ev) + { + #region Get gas mix + + var mix = _atmosphere.GetContainingMixture(uid, true, true); + + if (mix is not { }) + return; + + using var absorbed = new GasWrapper(mix, sm.GasEfficiency, _atmosphere); + + var moles = absorbed.Gas.TotalMoles; + + if (!(moles > 0f)) + return; + + #endregion + + var (radModifier, zapModifier, moleModifier, heatModifier, heatResistModifier) = absorbed.Gas.GetGasModifiers(); + + #region Calculate CO2 powerloss inhibition effect + + var co2Ratio = absorbed.Gas.GetGasMolarPercentage(Gas.CarbonDioxide); + var underThresholdScaler = Math.Min( + Math.Clamp(co2Ratio / sm.PowerlossInhibitionGasThreshold, 0, 1), + Math.Clamp(moles / sm.PowerlossInhibitionMoleThreshold, 0, 1) + ); + + // Apply CO2 ratio if thresholds are met, otherwise limit the ratio according to how far away we are from thresholds + sm.PowerlossDynamicScaling = co2Ratio * underThresholdScaler; + + // + var moleBoost = Math.Clamp(moles / sm.PowerlossInhibitionMoleBoostThreshold, 1f, 1.5f); + var powerlossInhibitor = Math.Clamp(1f - sm.PowerlossDynamicScaling * moleBoost, 0f, 1f); + + #endregion + + #region Add power to crystal + + // Transfer matter power to power + if (sm.MatterPower != 0) + { + // Get how much matter power to transfer + var removedMatter = Math.Clamp(sm.MatterPower, 0f, 1f * sm.MatterPowerConversion); + + sm.Power = Math.Max(sm.Power + removedMatter, 0); + sm.MatterPower = Math.Max(sm.MatterPower - removedMatter, 0); + } + + // Increase power from temperature + sm.Power = Math.Max(absorbed.Gas.Temperature * heatModifier / Atmospherics.T0C + sm.Power, 0); + + // Yeah, it consumes all ammonia in one tick cuz it's funny af + sm.Power = Math.Max(absorbed.Gas.GetMoles(Gas.Ammonia) * sm.AmmoniaEnergyPerMole + sm.Power, 0); + absorbed.Gas.SetMoles(Gas.Ammonia, 0f); + + #endregion + + #region Generate outputs + + //Radiate stuff + if (TryComp(uid, out var rad)) + { + rad.Intensity = sm.Power * radModifier * sm.RadiationOutputFactor; + } + + // Convert power to energy + var energy = sm.Power * sm.ReactionPowerModifier; + + // Release the waste. Both are scaled by modifier and energy, but o2 also scales with temperatures. + absorbed.Gas.AdjustMoles(Gas.Oxygen, Math.Max(moleModifier * (energy + absorbed.Gas.Temperature - Atmospherics.T0C) * sm.OxygenReleaseEfficiencyModifier, 0f)); + absorbed.Gas.AdjustMoles(Gas.Plasma, Math.Max(moleModifier * sm.PlasmaReleaseModifier * energy, 0f)); + + // Increase temperature + absorbed.Gas.Temperature += energy * sm.ThermalReleaseModifier; + + #endregion + + #region Scale down power + + // I'd recommend plotting these two if you want to get it + // but in general this lets it need less input to stay under 10 power than above + // Below 10 power it substracts very little, and above it substracts 1/10 + // 10f (and 0.9f) hardcoded to discourage yaml majors messing with it since it impacts a lot + // (And would require massive structural changes, all to minuscule benefit) + var powerReduction = (float)Math.Pow(sm.Power / 5f, 3f); + + // After this point power is lowered + // This wraps around to the begining of the function + sm.Power = Math.Max(sm.Power - Math.Min(powerReduction, sm.Power * 0.8f) * powerlossInhibitor, 0f); + + #endregion + } +} diff --git a/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterDamageSystem.cs b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterDamageSystem.cs new file mode 100644 index 0000000000..d5731debad --- /dev/null +++ b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterDamageSystem.cs @@ -0,0 +1,69 @@ +using Content.Goobstation.Shared.Supermatter.Components; +using Content.Server.Atmos.EntitySystems; +using Content.Shared.Atmos; + +namespace Content.Goobstation.Server.Supermatter.Systems; + +public sealed class SupermatterDamageSystem : EntitySystem +{ + [Dependency] private readonly AtmosphereSystem _atmosphere = default!; + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(HandleDamage); + } + + /// + /// Handles environmental damage. + /// + private void HandleDamage(EntityUid uid, SupermatterComponent sm, SupermatterTickEvent ev) + { + var damageArchived = sm.Damage; + + #region Get gas info + + var mix = _atmosphere.GetContainingMixture(uid, true, true); + + // We're in space or there is no gas to process + if (mix is not { } || mix.TotalMoles == 0f) + { + sm.Damage += Math.Max(sm.Power / 1000 * sm.DamageIncreaseMultiplier, 0.1f); + return; + } + + // Absorbed gas from surrounding area + using var surrounding = new GasWrapper(mix, sm.GasEfficiency, _atmosphere); + var moles = surrounding.Gas.TotalMoles; + var (_, _, _, _, heatResistModifier) = surrounding.Gas.GetGasModifiers(); + + #endregion + + var totalDamage = 0f; + + var tempThreshold = (Atmospherics.T0C + sm.HeatPenaltyThreshold) * heatResistModifier; + + // Temperature start to have a positive effect on damage after 350 + var tempDamage = Math.Max(Math.Clamp(moles / 200f, .5f, 1f) * surrounding.Gas.Temperature - tempThreshold, 0f) * sm.MoleHeatThreshold / 150f * sm.DamageIncreaseMultiplier; + totalDamage += tempDamage; + + // Power only starts affecting damage when it is above 5000 + var powerDamage = Math.Max(sm.Power - sm.PowerPenaltyThreshold, 0f) / 500f * sm.DamageIncreaseMultiplier; + totalDamage += powerDamage; + + // Molar count only starts affecting damage when it is above 1800 + var moleDamage = Math.Max(moles - sm.MolePenaltyThreshold, 0) / 80 * sm.DamageIncreaseMultiplier; + totalDamage += moleDamage; + + // Healing damage + if (moles < sm.MolePenaltyThreshold) + { + // left there a very small float value so that it doesn't eventually divide by 0. + var healHeatDamage = Math.Min(surrounding.Gas.Temperature - tempThreshold, 0.001f) / 150; + totalDamage += healHeatDamage; + } + + sm.Damage = Math.Min(damageArchived + sm.DamageHardcap * sm.DelaminationPoint, totalDamage); + sm.DamageDelta = sm.Damage - damageArchived; + } +} diff --git a/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterDestructiveSystem.cs b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterDestructiveSystem.cs new file mode 100644 index 0000000000..79f61341f5 --- /dev/null +++ b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterDestructiveSystem.cs @@ -0,0 +1,120 @@ +using Content.Goobstation.Shared.Supermatter.Components; +using Content.Server.Atmos.EntitySystems; +using Content.Server.Explosion.EntitySystems; +using Content.Server.Lightning; +using static Content.Goobstation.Shared.Supermatter.Systems.SharedSupermatterSystem; + +namespace Content.Goobstation.Server.Supermatter.Systems; + +public sealed class SupermatterDestructiveSystem : EntitySystem +{ + [Dependency] private readonly AtmosphereSystem _atmosphere = default!; + [Dependency] private readonly LightningSystem _lightning = default!; + [Dependency] private readonly ExplosionSystem _explosion = default!; + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(HandleZap); + SubscribeLocalEvent(HandleDelam); + } + + /// + /// Shoot lightning bolts depensing on accumulated power. + /// + private void HandleZap(EntityUid uid, SupermatterComponent sm, SupermatterZapEvent ev) + { + // This isn't DRY but erm whatever. Alternatively I can surface this. And add a few params or some weird struct. + // (Also I can't cleanly run it on top level anyways since damage is independent + + var mix = _atmosphere.GetContainingMixture(uid, true, true); + + if (mix is not { }) + return; + + var gas = mix.Clone(); + var moles = gas.TotalMoles; + + if (!(moles > 0f)) + return; + + var (_, zapModifier, _, _, _) = gas.GetGasModifiers(); + + // Divide power by it's threshold to get a value from 0 to 1, then multiply by the amount of possible lightnings + // Makes it pretty obvious that if SM is shooting out red lightnings something is wrong. + // And if it shoots too weak lightnings it means that it's underfed. Feed the SM :godo: + var zapPower = sm.Power * zapModifier / sm.PowerPenaltyThreshold * sm.LightningPrototypes.Length; + var zapPowerNorm = (int)Math.Clamp(zapPower, 0, sm.LightningPrototypes.Length - 1); + _lightning.ShootRandomLightnings(uid, 3.5f, sm.Power > sm.PowerPenaltyThreshold ? 3 : 1, sm.LightningPrototypes[zapPowerNorm]); + } + + + /// + /// Decide on how to delaminate. + /// + public DelamType ChooseDelamType(EntityUid uid, SupermatterComponent sm) + { + var mix = _atmosphere.GetContainingMixture(uid, true, true); + + if (mix is { }) + { + var moles = mix.TotalMoles; + + if (moles >= sm.MolePenaltyThreshold) + return DelamType.Singulo; + } + + if (sm.Power >= sm.PowerPenaltyThreshold) + return DelamType.Tesla; + + return DelamType.Explosion; + } + + /// + /// Handle the end of the station. + /// + private void HandleDelam(EntityUid uid, SupermatterComponent sm, SupermatterDelamEvent ev) + { + var xform = Transform(uid); + + sm.DelamType = ChooseDelamType(uid, sm); + + if (!sm.Delamming) + { + sm.Delamming = true; + var evYap = new SupermatterYapEvent(sm); + RaiseLocalEvent(ref evYap); + } + if (sm.Damage < sm.DelaminationPoint && sm.Delamming) + { + sm.Delamming = false; + var evYap = new SupermatterYapEvent(sm); + RaiseLocalEvent(ref evYap); + } + + sm.DelamTimerAccumulator++; + + if (sm.DelamTimer > sm.DelamTimerAccumulator) + return; + + switch (sm.DelamType) + { + case DelamType.Explosion: + default: + _explosion.TriggerExplosive(uid); + break; + + case DelamType.Singulo: + Spawn(sm.SingularityPrototypeId, xform.Coordinates); + break; + + case DelamType.Tesla: + Spawn(sm.TeslaPrototypeId, xform.Coordinates); + break; + + case DelamType.Cascade: + Spawn(sm.SupermatterKudzuPrototypeId, xform.Coordinates); + break; + } + } +} diff --git a/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.Handlers.cs b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.Handlers.cs new file mode 100644 index 0000000000..1398cff5e6 --- /dev/null +++ b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.Handlers.cs @@ -0,0 +1,165 @@ +using Content.Goobstation.Shared.Supermatter.Components; +using Content.Goobstation.Shared.Supermatter.Systems; +using Content.Server.Atmos.EntitySystems; +using Content.Server.Audio; +using Content.Server.Chat.Systems; +using Content.Server.DoAfter; +using Content.Shared.Administration.Logs; +using Content.Shared.Atmos; +using Content.Shared.Chat; +using Content.Shared.Database; +using Content.Shared.DoAfter; +using Content.Shared.Examine; +using Content.Shared.Interaction; +using Content.Shared.Kitchen.Components; +using Content.Shared.Mobs.Components; +using Content.Shared.Projectiles; +using Robust.Shared.Containers; +using Robust.Shared.Physics; +using Robust.Shared.Physics.Events; + +namespace Content.Goobstation.Server.Supermatter.Systems; + +public sealed partial class SupermatterSystem : SharedSupermatterSystem +{ + [Dependency] private readonly AmbientSoundSystem _ambient = default!; + [Dependency] private readonly DoAfterSystem _doAfter = default!; + [Dependency] private readonly SharedTransformSystem _transform = default!; + [Dependency] private readonly ISharedAdminLogManager _adminLog = default!; + [Dependency] private readonly ISharedChatManager _sharedChat = default!; + [Dependency] private readonly ChatSystem _chat = default!; + [Dependency] private readonly AtmosphereSystem _atmosphere = default!; + [Dependency] private readonly SharedContainerSystem _container = default!; + + private void OnCollideEvent(EntityUid uid, SupermatterComponent sm, ref StartCollideEvent args) + { + var target = args.OtherEntity; + + // Stop immune entities from activating the sm. + if (args.OtherBody.BodyType == BodyType.Static + || HasComp(target) + || MetaData(target).EntityPrototype?.ID == sm.AshPrototypeId + || _container.IsEntityInContainer(uid)) + return; + + if (!sm.Activated) + { + // Extra logging for supermatter + var activator = ToPrettyString(args.OtherEntity); + + _sharedChat.SendAdminAlert($"Supermatter activated by {activator} at {Transform(uid).Coordinates}"); + + _adminLog.Add(LogType.Action, LogImpact.High, + $"Supermatter activated by {activator} at {Transform(uid).Coordinates}"); + + sm.Activated = true; + } + + if (TryComp(target, out var food)) + sm.Power += food.Energy; + else if (TryComp(target, out var projectile)) + sm.Power += (float)projectile.Damage.GetTotal(); + else + sm.Power++; + + sm.MatterPower += HasComp(target) ? 10 : 0; + + if (!HasComp(target)) + { + _adminLog.Add(LogType.EntityDelete, LogImpact.Medium, $"Supermatter {ToPrettyString(uid)} has consumed {ToPrettyString(target)}"); + EntityManager.SpawnAttachedTo(sm.AshPrototypeId, Transform(target).Coordinates); + _audio.PlayPvs(sm.DustSound, uid); + } + + EntityManager.QueueDeleteEntity(target); + } + + private void OnHandInteract(EntityUid uid, SupermatterComponent sm, ref InteractHandEvent args) + { + var target = args.User; + + if (HasComp(target)) + return; + + if (!sm.Activated) + sm.Activated = true; + + sm.MatterPower += 10; + + EntityManager.SpawnEntity("Ash", Transform(target).Coordinates); + _audio.PlayPvs(sm.DustSound, uid); + EntityManager.QueueDeleteEntity(target); + } + + private void OnItemInteract(EntityUid uid, SupermatterComponent sm, ref InteractUsingEvent args) + { + if (!HasComp(args.User)) + return; + + if (!sm.Activated) + sm.Activated = true; + + if (sm.SliverRemoved) + return; + + if (!HasComp(args.Used)) + return; + + var dae = new DoAfterArgs(EntityManager, args.User, 30f, new SupermatterDoAfterEvent(), uid) + { + BreakOnDamage = true, + BreakOnHandChange = false, + BreakOnMove = true, + BreakOnWeightlessMove = false, + NeedHand = true, + RequireCanInteract = true, + }; + + _doAfter.TryStartDoAfter(dae); + } + + private void OnGetSliver(EntityUid uid, SupermatterComponent sm, ref SupermatterDoAfterEvent args) + { + if (args.Cancelled) + return; + + // your criminal actions will not go unnoticed + sm.Damage += sm.DelaminationPoint / 10; + sm.DamageDelta += sm.DelaminationPoint / 10; + + var integrity = sm.GetIntegrity().ToString("0.00"); + _chat.SupermatterAnnouncement(uid, Loc.GetString("supermatter-announcement-cc-tamper", ("integrity", integrity)), true, "Central Command"); + + Spawn(sm.SliverPrototypeId, _transform.GetMapCoordinates(args.User)); + + if (sm.DelamTimer > 30f) + sm.DelamTimer -= 10f; + } + + private void OnExamine(EntityUid uid, SupermatterComponent sm, ref ExaminedEvent args) + { + // get all close and personal to it + if (args.IsInDetailsRange) + { + args.PushMarkup(Loc.GetString("supermatter-examine-integrity", ("integrity", sm.GetIntegrity().ToString("0.00")))); + } + } + + private void OnComponentRemove(EntityUid uid, SupermatterComponent component, ComponentRemove args) + { + // turn off any ambient if component is removed (ex. entity deleted) + _ambient.SetAmbience(uid, false); + component.AudioStream = _audio.Stop(component.AudioStream); + } + + private void OnMapInit(EntityUid uid, SupermatterComponent component, MapInitEvent args) + { + // Set the Sound + _ambient.SetAmbience(uid, true); + + //Add Air to the initialized SM in the Map so it doesnt delam on default + var mix = _atmosphere.GetContainingMixture(uid, true, true); + mix?.AdjustMoles(Gas.Oxygen, Atmospherics.OxygenMolesStandard); + mix?.AdjustMoles(Gas.Nitrogen, Atmospherics.NitrogenMolesStandard); + } +} diff --git a/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.cs b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.cs index 05ec1dfb2a..fa62a99e26 100644 --- a/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.cs +++ b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.cs @@ -4,53 +4,18 @@ using Content.Goobstation.Shared.Supermatter.Components; using Content.Goobstation.Shared.Supermatter.Systems; -using Content.Server.AlertLevel; -using Content.Server.Atmos.EntitySystems; -using Content.Server.Audio; -using Content.Server.Chat.Systems; -using Content.Server.DoAfter; -using Content.Server.Explosion.EntitySystems; -using Content.Server.Lightning; -using Content.Server.Station.Systems; -using Content.Shared.Administration.Logs; -using Content.Shared.Atmos; -using Content.Shared.Chat; -using Content.Shared.Database; -using Content.Shared.DoAfter; using Content.Shared.Examine; using Content.Shared.Interaction; -using Content.Shared.Kitchen.Components; -using Content.Shared.Mobs.Components; -using Content.Shared.Projectiles; -using Content.Shared.Radiation.Components; using Robust.Shared.Audio.Systems; -using Robust.Shared.Containers; -using Robust.Shared.Maths; -using Robust.Shared.Physics; using Robust.Shared.Physics.Events; using Robust.Shared.Timing; -using System.Text; namespace Content.Goobstation.Server.Supermatter.Systems; -public sealed class SupermatterSystem : SharedSupermatterSystem +public sealed partial class SupermatterSystem : SharedSupermatterSystem { - [Dependency] private static readonly AtmosphereSystem Atmosphere = default!; // Static since enum uses it to implement IDisposable - [Dependency] private readonly ChatSystem _chat = default!; - [Dependency] private readonly SharedContainerSystem _container = default!; - [Dependency] private readonly ExplosionSystem _explosion = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly IGameTiming _gameTiming = default!; - [Dependency] private readonly AmbientSoundSystem _ambient = default!; - [Dependency] private readonly LightningSystem _lightning = default!; - [Dependency] private readonly AlertLevelSystem _alert = default!; - [Dependency] private readonly StationSystem _station = default!; - [Dependency] private readonly DoAfterSystem _doAfter = default!; - [Dependency] private readonly SharedTransformSystem _transform = default!; - [Dependency] private readonly ISharedAdminLogManager _adminLog = default!; - [Dependency] private readonly ISharedChatManager _sharedChat = default!; - - private DelamType _delamType = DelamType.Explosion; public override void Initialize() { @@ -58,7 +23,6 @@ public override void Initialize() SubscribeLocalEvent(OnComponentRemove); SubscribeLocalEvent(OnMapInit); - SubscribeLocalEvent(OnCollideEvent); SubscribeLocalEvent(OnHandInteract); SubscribeLocalEvent(OnItemInteract); @@ -66,24 +30,6 @@ public override void Initialize() SubscribeLocalEvent(OnGetSliver); } - private void OnComponentRemove(EntityUid uid, SupermatterComponent component, ComponentRemove args) - { - // turn off any ambient if component is removed (ex. entity deleted) - _ambient.SetAmbience(uid, false); - component.AudioStream = _audio.Stop(component.AudioStream); - } - - private void OnMapInit(EntityUid uid, SupermatterComponent component, MapInitEvent args) - { - // Set the Sound - _ambient.SetAmbience(uid, true); - - //Add Air to the initialized SM in the Map so it doesnt delam on default - var mix = Atmosphere.GetContainingMixture(uid, true, true); - mix?.AdjustMoles(Gas.Oxygen, Atmospherics.OxygenMolesStandard); - mix?.AdjustMoles(Gas.Nitrogen, Atmospherics.NitrogenMolesStandard); - } - public override void Update(float frameTime) { base.Update(frameTime); @@ -113,392 +59,31 @@ public void Cycle(EntityUid ent, SupermatterComponent comp) comp.ZapAccumulator++; comp.YellAccumulator++; - ProcessAtmos(ent, comp); - HandleDamage(ent, comp); + { + var ev = new SupermatterTickEvent(comp); + RaiseLocalEvent(ref ev); + } if (comp.Damage >= comp.DelaminationPoint || comp.Delamming) - HandleDelamination(ent, comp); + { + var ev = new SupermatterDelamEvent(comp); + RaiseLocalEvent(ref ev); + } HandleSoundLoop(comp); if (comp.ZapAccumulator >= comp.ZapTimer) { comp.ZapAccumulator -= comp.ZapTimer; - SupermatterZap(ent, comp); + var ev = new SupermatterZapEvent(comp); + RaiseLocalEvent(ref ev); } if (comp.YellAccumulator >= comp.YellTimer) { comp.YellAccumulator -= comp.YellTimer; - HandleAnnouncements(ent, comp); - } - } - - #region Processing - - /// - /// Handle power and radiation output depending on atmospheric things. - /// - private void ProcessAtmos(EntityUid uid, SupermatterComponent sm) - { - #region Get gas mix - - var mix = Atmosphere.GetContainingMixture(uid, true, true); - - if (mix is not { }) - return; - - using var absorbed = new GasWrapper(mix, sm.GasEfficiency); - - var moles = absorbed.Gas.TotalMoles; - - if (!(moles > 0f)) - return; - - #endregion - - var (radModifier, zapModifier, moleModifier, heatModifier, heatResistModifier) = absorbed.Gas.GetGasModifiers(); - - #region Calculate CO2 powerloss inhibition effect - - var co2Ratio = absorbed.Gas.GetGasMolarPercentage(Gas.CarbonDioxide); - var underThresholdScaler = Math.Min( - Math.Clamp(co2Ratio / sm.PowerlossInhibitionGasThreshold, 0, 1), - Math.Clamp(moles / sm.PowerlossInhibitionMoleThreshold, 0, 1) - ); - - // Apply CO2 ratio if thresholds are met, otherwise limit the ratio according to how far away we are from thresholds - sm.PowerlossDynamicScaling = co2Ratio * underThresholdScaler; - - // - var moleBoost = Math.Clamp(moles / sm.PowerlossInhibitionMoleBoostThreshold, 1f, 1.5f); - var powerlossInhibitor = Math.Clamp(1f - sm.PowerlossDynamicScaling * moleBoost, 0f, 1f); - - #endregion - - #region Add power to crystal - - // Transfer matter power to power - if (sm.MatterPower != 0) - { - // Get how much matter power to transfer - var removedMatter = Math.Clamp(sm.MatterPower, 0f, 1f * sm.MatterPowerConversion); - - sm.Power = Math.Max(sm.Power + removedMatter, 0); - sm.MatterPower = Math.Max(sm.MatterPower - removedMatter, 0); - } - - // Increase power from temperature - sm.Power = Math.Max(absorbed.Gas.Temperature * heatModifier / Atmospherics.T0C + sm.Power, 0); - - // Yeah, it consumes all ammonia in one tick cuz it's funny af - sm.Power = Math.Max(absorbed.Gas.GetMoles(Gas.Ammonia) * sm.AmmoniaEnergyPerMole + sm.Power, 0); - absorbed.Gas.SetMoles(Gas.Ammonia, 0f); - - #endregion - - #region Generate outputs - - //Radiate stuff - if (TryComp(uid, out var rad)) - { - rad.Intensity = sm.Power * radModifier * sm.RadiationOutputFactor; - } - - // Convert power to energy - var energy = sm.Power * sm.ReactionPowerModifier; - - // Release the waste. Both are scaled by modifier and energy, but o2 also scales with temperatures. - absorbed.Gas.AdjustMoles(Gas.Oxygen, Math.Max(moleModifier * (energy + absorbed.Gas.Temperature - Atmospherics.T0C) * sm.OxygenReleaseEfficiencyModifier, 0f)); - absorbed.Gas.AdjustMoles(Gas.Plasma, Math.Max(moleModifier * sm.PlasmaReleaseModifier * energy, 0f)); - - // Increase temperature - absorbed.Gas.Temperature += energy * sm.ThermalReleaseModifier; - - #endregion - - #region Scale down power - - // I'd recommend plotting these two if you want to get it - // but in general this lets it need less input to stay under 10 power than above - // Below 10 power it substracts very little, and above it substracts 1/10 - // 10f (and 0.9f) hardcoded to discourage yaml majors messing with it since it impacts a lot - // (And would require massive structural changes, all to minuscule benefit) - var powerReduction = (float)Math.Pow(sm.Power / 5f, 3f); - - // After this point power is lowered - // This wraps around to the begining of the function - sm.Power = Math.Max(sm.Power - Math.Min(powerReduction, sm.Power * 0.8f) * powerlossInhibitor, 0f); - - #endregion - } - - /// - /// Shoot lightning bolts depensing on accumulated power. - /// - private void SupermatterZap(EntityUid uid, SupermatterComponent sm) - { - - #region Calc modifiers for zap - - // This isn't DRY but erm whatever. Alternatively I can surface this. And add a few params or some weird struct. - // (Also I can't cleanly run it on top level anyways since damage is independent - - var mix = Atmosphere.GetContainingMixture(uid, true, true); - - if (mix is not { }) - return; - - var gas = mix.Clone(); - var moles = gas.TotalMoles; - - if (!(moles > 0f)) - return; - - var (_, zapModifier, _, _, _) = gas.GetGasModifiers(); - - #endregion - - // Divide power by it's threshold to get a value from 0 to 1, then multiply by the amount of possible lightnings - // Makes it pretty obvious that if SM is shooting out red lightnings something is wrong. - // And if it shoots too weak lightnings it means that it's underfed. Feed the SM :godo: - var zapPower = sm.Power * zapModifier / sm.PowerPenaltyThreshold * sm.LightningPrototypes.Length; - var zapPowerNorm = (int)Math.Clamp(zapPower, 0, sm.LightningPrototypes.Length - 1); - _lightning.ShootRandomLightnings(uid, 3.5f, sm.Power > sm.PowerPenaltyThreshold ? 3 : 1, sm.LightningPrototypes[zapPowerNorm]); - } - - /// - /// Handles environmental damage. - /// - private void HandleDamage(EntityUid uid, SupermatterComponent sm) - { - var damageArchived = sm.Damage; - - #region Get gas info - - var mix = Atmosphere.GetContainingMixture(uid, true, true); - - // We're in space or there is no gas to process - if (mix is not { } || mix.TotalMoles == 0f) - { - sm.Damage += Math.Max(sm.Power / 1000 * sm.DamageIncreaseMultiplier, 0.1f); - return; - } - - // Absorbed gas from surrounding area - using var surrounding = new GasWrapper(mix, sm.GasEfficiency); - var moles = surrounding.Gas.TotalMoles; - var (_, _, _, _, heatResistModifier) = surrounding.Gas.GetGasModifiers(); - - #endregion - - var totalDamage = 0f; - - var tempThreshold = (Atmospherics.T0C + sm.HeatPenaltyThreshold) * heatResistModifier; - - // Temperature start to have a positive effect on damage after 350 - var tempDamage = Math.Max(Math.Clamp(moles / 200f, .5f, 1f) * surrounding.Gas.Temperature - tempThreshold, 0f) * sm.MoleHeatThreshold / 150f * sm.DamageIncreaseMultiplier; - totalDamage += tempDamage; - - // Power only starts affecting damage when it is above 5000 - var powerDamage = Math.Max(sm.Power - sm.PowerPenaltyThreshold, 0f) / 500f * sm.DamageIncreaseMultiplier; - totalDamage += powerDamage; - - // Molar count only starts affecting damage when it is above 1800 - var moleDamage = Math.Max(moles - sm.MolePenaltyThreshold, 0) / 80 * sm.DamageIncreaseMultiplier; - totalDamage += moleDamage; - - // Healing damage - if (moles < sm.MolePenaltyThreshold) - { - // left there a very small float value so that it doesn't eventually divide by 0. - var healHeatDamage = Math.Min(surrounding.Gas.Temperature - tempThreshold, 0.001f) / 150; - totalDamage += healHeatDamage; - } - - sm.Damage = Math.Min(damageArchived + sm.DamageHardcap * sm.DelaminationPoint, totalDamage); - sm.DamageDelta = sm.Damage - damageArchived; - } - - /// - /// Handles announcements. - /// - private void HandleAnnouncements(EntityUid uid, SupermatterComponent sm) - { - var message = string.Empty; - var global = false; - - var integrity = GetIntegrity(sm).ToString("0.00"); - - // Delam is happening - if (sm.Delamming && !sm.DelamAnnounced) - { - var sb = new StringBuilder(); - var alertLevel = "yellow"; - - string? loc; - switch (_delamType) - { - case DelamType.Explosion: - default: - loc = "supermatter-delam-explosion"; - break; - - case DelamType.Singulo: - loc = "supermatter-delam-overmass"; - alertLevel = "delta"; - break; - - case DelamType.Tesla: - loc = "supermatter-delam-tesla"; - alertLevel = "delta"; - break; - - case DelamType.Cascade: - loc = "supermatter-delam-cascade"; - alertLevel = "delta"; - break; - } - - var station = _station.GetOwningStation(uid); - if (station != null) - _alert.SetLevel((EntityUid)station, alertLevel, true, true, true, false); - - sb.AppendLine(Loc.GetString(loc)); - sb.AppendLine(Loc.GetString("supermatter-seconds-before-delam", ("seconds", sm.DelamTimer))); - - message = sb.ToString(); - global = true; - sm.DelamAnnounced = true; - - SupermatterAnnouncement(uid, message, global); - return; - } - - // Delam stopped, let everyone know. - if (sm.Damage < sm.DelaminationPoint && sm.Delamming) - { - message = Loc.GetString("supermatter-delam-cancel", ("integrity", integrity)); - sm.DelamAnnounced = false; - global = true; - SupermatterAnnouncement(uid, message, global); - return; - } - - // We are not taking consistent damage. Engis/warn not needed. - if (sm.DamageDelta >= 0) - return; - - // Check if we need to warn anyone - switch (sm.Damage) - { - case >= SupermatterComponent.EmergencyPoint: - message = Loc.GetString("supermatter-emergency", ("integrity", integrity)); - global = true; - break; - case >= SupermatterComponent.WarningPoint: - message = Loc.GetString("supermatter-warning", ("integrity", integrity)); - break; - } - - SupermatterAnnouncement(uid, message, global); - } - - #endregion - - #region Helper functions - - /// - /// Help the SM announce something. - /// - /// If true, does the station announcement. - /// If true, sends the announcement from Central Command. - public void SupermatterAnnouncement(EntityUid uid, string message, bool global = false, string? customSender = null) - { - if (global) - { - var sender = customSender ?? Loc.GetString("supermatter-announcer"); - _chat.DispatchStationAnnouncement(uid, message, sender, colorOverride: Color.Yellow); - return; - } - _chat.TrySendInGameICMessage(uid, message, InGameICChatType.Speak, hideChat: false, checkRadioPrefix: true); - } - - /// - /// Returns the integrity rounded to hundreds, e.g. 100.00% - /// - public static float GetIntegrity(SupermatterComponent sm) - { - var integrity = sm.Damage / sm.DelaminationPoint; - integrity = (float)Math.Round(100 - integrity * 100, 2); - integrity = integrity < 0 ? 0 : integrity; - return integrity; - } - - /// - /// Decide on how to delaminate. - /// - public DelamType ChooseDelamType(EntityUid uid, SupermatterComponent sm) - { - var mix = Atmosphere.GetContainingMixture(uid, true, true); - - if (mix is { }) - { - var moles = mix.TotalMoles; - - if (moles >= sm.MolePenaltyThreshold) - return DelamType.Singulo; - } - - if (sm.Power >= sm.PowerPenaltyThreshold) - return DelamType.Tesla; - - return DelamType.Explosion; - } - - /// - /// Handle the end of the station. - /// - private void HandleDelamination(EntityUid uid, SupermatterComponent sm) - { - var xform = Transform(uid); - - _delamType = ChooseDelamType(uid, sm); - - if (!sm.Delamming) - { - sm.Delamming = true; - HandleAnnouncements(uid, sm); - } - if (sm.Damage < sm.DelaminationPoint && sm.Delamming) - { - sm.Delamming = false; - HandleAnnouncements(uid, sm); - } - - sm.DelamTimerAccumulator++; - - if (sm.DelamTimer > sm.DelamTimerAccumulator) - return; - - switch (_delamType) - { - case DelamType.Explosion: - default: - _explosion.TriggerExplosive(uid); - break; - - case DelamType.Singulo: - Spawn(sm.SingularityPrototypeId, xform.Coordinates); - break; - - case DelamType.Tesla: - Spawn(sm.TeslaPrototypeId, xform.Coordinates); - break; - - case DelamType.Cascade: - Spawn(sm.SupermatterKudzuPrototypeId, xform.Coordinates); - break; + var ev = new SupermatterYapEvent(comp); + RaiseLocalEvent(ref ev); } } @@ -521,210 +106,4 @@ private void HandleSoundLoop(SupermatterComponent sm) sm.AudioStream = _audio.Stop(sm.AudioStream); sm.SmSound = smSound; } - - #endregion - - #region Event Handlers - - private void OnCollideEvent(EntityUid uid, SupermatterComponent sm, ref StartCollideEvent args) - { - var target = args.OtherEntity; - - // Stop immune entities from activating the sm. - if (args.OtherBody.BodyType == BodyType.Static - || HasComp(target) - || MetaData(target).EntityPrototype?.ID == sm.AshPrototypeId - || _container.IsEntityInContainer(uid)) - return; - - if (!sm.Activated) - { - // Extra logging for supermatter - var activator = ToPrettyString(args.OtherEntity); - - _sharedChat.SendAdminAlert($"Supermatter activated by {activator} at {Transform(uid).Coordinates}"); - - _adminLog.Add(LogType.Action, LogImpact.High, - $"Supermatter activated by {activator} at {Transform(uid).Coordinates}"); - - sm.Activated = true; - } - - if (TryComp(target, out var food)) - sm.Power += food.Energy; - else if (TryComp(target, out var projectile)) - sm.Power += (float)projectile.Damage.GetTotal(); - else - sm.Power++; - - sm.MatterPower += HasComp(target) ? 10 : 0; - - if (!HasComp(target)) - { - _adminLog.Add(LogType.EntityDelete, LogImpact.Medium, $"Supermatter {ToPrettyString(uid)} has consumed {ToPrettyString(target)}"); - EntityManager.SpawnAttachedTo(sm.AshPrototypeId, Transform(target).Coordinates); - _audio.PlayPvs(sm.DustSound, uid); - } - - EntityManager.QueueDeleteEntity(target); - } - - private void OnHandInteract(EntityUid uid, SupermatterComponent sm, ref InteractHandEvent args) - { - var target = args.User; - - if (HasComp(target)) - return; - - if (!sm.Activated) - sm.Activated = true; - - sm.MatterPower += 10; - - EntityManager.SpawnEntity("Ash", Transform(target).Coordinates); - _audio.PlayPvs(sm.DustSound, uid); - EntityManager.QueueDeleteEntity(target); - } - - private void OnItemInteract(EntityUid uid, SupermatterComponent sm, ref InteractUsingEvent args) - { - if (!HasComp(args.User)) - return; - - if (!sm.Activated) - sm.Activated = true; - - if (sm.SliverRemoved) - return; - - if (!HasComp(args.Used)) - return; - - var dae = new DoAfterArgs(EntityManager, args.User, 30f, new SupermatterDoAfterEvent(), uid) - { - BreakOnDamage = true, - BreakOnHandChange = false, - BreakOnMove = true, - BreakOnWeightlessMove = false, - NeedHand = true, - RequireCanInteract = true, - }; - - _doAfter.TryStartDoAfter(dae); - } - - private void OnGetSliver(EntityUid uid, SupermatterComponent sm, ref SupermatterDoAfterEvent args) - { - if (args.Cancelled) - return; - - // your criminal actions will not go unnoticed - sm.Damage += sm.DelaminationPoint / 10; - sm.DamageDelta += sm.DelaminationPoint / 10; - - var integrity = GetIntegrity(sm).ToString("0.00"); - SupermatterAnnouncement(uid, Loc.GetString("supermatter-announcement-cc-tamper", ("integrity", integrity)), true, "Central Command"); - - Spawn(sm.SliverPrototypeId, _transform.GetMapCoordinates(args.User)); - - if (sm.DelamTimer > 30f) - sm.DelamTimer -= 10f; - } - - private void OnExamine(EntityUid uid, SupermatterComponent sm, ref ExaminedEvent args) - { - // get all close and personal to it - if (args.IsInDetailsRange) - { - args.PushMarkup(Loc.GetString("supermatter-examine-integrity", ("integrity", GetIntegrity(sm).ToString("0.00")))); - } - } - - #endregion - - /// - /// Simple wrapper around - /// Splits off a part of gas, and merges them together later - /// is automatically called at the end - - /// use instead if you want to handle it manually - /// - private readonly struct GasWrapper(GasMixture surroundingMix, float ratio) : IDisposable - { - private readonly GasMixture _surrounding = surroundingMix; - - /// - /// The split off part of your gas. - /// - public readonly GasMixture Gas = surroundingMix.RemoveRatio(ratio); - - public void Dispose() - { - Atmosphere.Merge(_surrounding, Gas); - } - } -} - -public static class SmExtensions -{ - /// - /// Get SM related data about a provided gas mix. - /// - /// Mix to be parsed - /// A selection of values, check - public static (float radModifier, float zapModifier, float moleModifier, float heatModifier, float heatResistModifier) GetGasModifiers(this GasMixture absorbedGas) - { - var totalMoles = absorbedGas.TotalMoles; - - // Safety check: Prevent a divide-by-zero NaN cascade if the mix is completely empty - if (totalMoles <= 0f) - { - return (1f, 1f, 1f, 1f, 1f); - } - - var radModifier = 1f; - var zapModifier = 1f; - var moleModifier = 1f; - var heatModifier = 1f; - var heatResistModifier = 1f; - - // Safely iterate through the actual enum values, regardless of their integer backing - foreach (Gas gas in Enum.GetValues()) - { - var proportion = absorbedGas.GetGasMolarPercentage(gas); - - // Skip doing math if there's none of this gas in the mix - if (proportion <= 0f) continue; - - var facts = SupermatterComponent.GasDataFields(gas); - - radModifier += proportion * facts.RadMod; - zapModifier += proportion * facts.ZapMod; - moleModifier += proportion * facts.MoleMod; - heatModifier += proportion * facts.HeatMod; - heatResistModifier += proportion * facts.HeatResistMod; - } - - // Ensure we don't do something stupid later - return ( - Math.Max(radModifier, 0f), - Math.Max(zapModifier, 0f), - Math.Max(moleModifier, 0f), - Math.Max(heatModifier, 0f), - Math.Max(heatResistModifier, 0f) - ); - } - - public static float GetGasMolarPercentage(this GasMixture gasMix, Gas gas) - { - if (!(gasMix.TotalMoles > 0f)) - return 0f; - return gasMix.GetMoles(gas) / gasMix.TotalMoles; - } - - public static float GetGasMolarPercentage(this GasMixture gasMix, int gas) - { - if (!(gasMix.TotalMoles > 0f)) - return 0f; - return gasMix.GetMoles(gas) / gasMix.TotalMoles; - } } diff --git a/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterYapSystem.cs b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterYapSystem.cs new file mode 100644 index 0000000000..4aa4d51562 --- /dev/null +++ b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterYapSystem.cs @@ -0,0 +1,108 @@ + +using Content.Goobstation.Shared.Supermatter.Components; +using Content.Server.AlertLevel; +using Content.Server.Atmos.EntitySystems; +using Content.Server.Chat.Systems; +using Content.Server.Station.Systems; +using System.Text; +using static Content.Goobstation.Shared.Supermatter.Systems.SharedSupermatterSystem; + +namespace Content.Goobstation.Server.Supermatter.Systems; + +public sealed class SupermatterYapSystem : EntitySystem +{ + [Dependency] private readonly AtmosphereSystem _atmosphere = default!; + [Dependency] private readonly ChatSystem _chat = default!; + [Dependency] private readonly AlertLevelSystem _alert = default!; + [Dependency] private readonly StationSystem _station = default!; + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(HandleAnnouncements); + } + + /// + /// Handles announcements. + /// + private void HandleAnnouncements(EntityUid uid, SupermatterComponent sm, SupermatterYapEvent ev) + { + var message = string.Empty; + var global = false; + + var integrity = sm.GetIntegrity().ToString("0.00"); + + // Delam is happening + if (sm.Delamming && !sm.DelamAnnounced) + { + var sb = new StringBuilder(); + var alertLevel = "yellow"; + + string? loc; + switch (sm.DelamType) + { + case DelamType.Explosion: + default: + loc = "supermatter-delam-explosion"; + break; + + case DelamType.Singulo: + loc = "supermatter-delam-overmass"; + alertLevel = "delta"; + break; + + case DelamType.Tesla: + loc = "supermatter-delam-tesla"; + alertLevel = "delta"; + break; + + case DelamType.Cascade: + loc = "supermatter-delam-cascade"; + alertLevel = "delta"; + break; + } + + var station = _station.GetOwningStation(uid); + if (station != null) + _alert.SetLevel((EntityUid)station, alertLevel, true, true, true, false); + + sb.AppendLine(Loc.GetString(loc)); + sb.AppendLine(Loc.GetString("supermatter-seconds-before-delam", ("seconds", sm.DelamTimer))); + + message = sb.ToString(); + global = true; + sm.DelamAnnounced = true; + + _chat.SupermatterAnnouncement(uid, message, global); + return; + } + + // Delam stopped, let everyone know. + if (sm.Damage < sm.DelaminationPoint && sm.Delamming) + { + message = Loc.GetString("supermatter-delam-cancel", ("integrity", integrity)); + sm.DelamAnnounced = false; + global = true; + _chat.SupermatterAnnouncement(uid, message, global); + return; + } + + // We are not taking consistent damage. Engis/warn not needed. + if (sm.DamageDelta >= 0) + return; + + // Check if we need to warn anyone + switch (sm.Damage) + { + case >= SupermatterComponent.EmergencyPoint: + message = Loc.GetString("supermatter-emergency", ("integrity", integrity)); + global = true; + break; + case >= SupermatterComponent.WarningPoint: + message = Loc.GetString("supermatter-warning", ("integrity", integrity)); + break; + } + + _chat.SupermatterAnnouncement(uid, message, global); + } +} diff --git a/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Components/SupermatterComponent.cs b/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Components/SupermatterComponent.cs index 7021dfa395..24038cce84 100644 --- a/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Components/SupermatterComponent.cs +++ b/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Components/SupermatterComponent.cs @@ -12,6 +12,7 @@ using Robust.Shared.Serialization; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.Array; +using static Content.Goobstation.Shared.Supermatter.Systems.SharedSupermatterSystem; namespace Content.Goobstation.Shared.Supermatter.Components; @@ -344,6 +345,9 @@ public sealed partial class SupermatterComponent : Component [DataField("detonationRads")] public float DetonationRads = 200f; + [ViewVariables(VVAccess.ReadOnly)] + public DelamType DelamType = DelamType.Explosion; + #endregion SM Delamm #region SM Gas @@ -402,6 +406,17 @@ public sealed partial class SupermatterComponent : Component #endregion SM Gas public float AmmoniaEnergyPerMole; + + /// + /// Returns the integrity rounded to hundreds, e.g. 100.00% + /// + public float GetIntegrity() + { + var integrity = Damage / DelaminationPoint; + integrity = (float)Math.Round(100 - integrity * 100, 2); + integrity = integrity < 0 ? 0 : integrity; + return integrity; + } } [Serializable, NetSerializable] diff --git a/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Systems/SharedSupermatterSystem.cs b/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Systems/SharedSupermatterSystem.cs index 9d72bfa339..5071db2a03 100644 --- a/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Systems/SharedSupermatterSystem.cs +++ b/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Systems/SharedSupermatterSystem.cs @@ -3,7 +3,6 @@ // SPDX-License-Identifier: MPL-2.0 using Content.Goobstation.Shared.Supermatter.Components; -using Robust.Shared.Serialization; namespace Content.Goobstation.Shared.Supermatter.Systems; From bd7777c93e456d195bc34251d91a8b2ff43eb7de Mon Sep 17 00:00:00 2001 From: GoobAutomatedBot Date: Wed, 25 Feb 2026 14:37:42 +0000 Subject: [PATCH 14/16] chore: Automatically update REUSE headers --- .../Supermatter/SupermatterHelpers.cs | 4 ++++ .../Supermatter/Systems/SupermatterAtmosSystem.cs | 4 ++++ .../Supermatter/Systems/SupermatterDamageSystem.cs | 4 ++++ .../Supermatter/Systems/SupermatterDestructiveSystem.cs | 4 ++++ .../Supermatter/Systems/SupermatterSystem.Handlers.cs | 4 ++++ .../Supermatter/Systems/SupermatterYapSystem.cs | 4 ++++ 6 files changed, 24 insertions(+) diff --git a/Modules/GoobStation/Content.Goobstation.Server/Supermatter/SupermatterHelpers.cs b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/SupermatterHelpers.cs index 0e2006766d..1231a1058f 100644 --- a/Modules/GoobStation/Content.Goobstation.Server/Supermatter/SupermatterHelpers.cs +++ b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/SupermatterHelpers.cs @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2026 Goob Station Contributors +// +// SPDX-License-Identifier: MPL-2.0 + using Content.Goobstation.Shared.Supermatter.Components; using Content.Server.Atmos.EntitySystems; using Content.Server.Chat.Systems; diff --git a/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterAtmosSystem.cs b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterAtmosSystem.cs index a67854da47..d2c90e4d43 100644 --- a/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterAtmosSystem.cs +++ b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterAtmosSystem.cs @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2026 Goob Station Contributors +// +// SPDX-License-Identifier: MPL-2.0 + using Content.Goobstation.Shared.Supermatter.Components; using Content.Server.Atmos.EntitySystems; using Content.Shared.Atmos; diff --git a/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterDamageSystem.cs b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterDamageSystem.cs index d5731debad..8956f50245 100644 --- a/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterDamageSystem.cs +++ b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterDamageSystem.cs @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2026 Goob Station Contributors +// +// SPDX-License-Identifier: MPL-2.0 + using Content.Goobstation.Shared.Supermatter.Components; using Content.Server.Atmos.EntitySystems; using Content.Shared.Atmos; diff --git a/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterDestructiveSystem.cs b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterDestructiveSystem.cs index 79f61341f5..05fb268d30 100644 --- a/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterDestructiveSystem.cs +++ b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterDestructiveSystem.cs @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2026 Goob Station Contributors +// +// SPDX-License-Identifier: MPL-2.0 + using Content.Goobstation.Shared.Supermatter.Components; using Content.Server.Atmos.EntitySystems; using Content.Server.Explosion.EntitySystems; diff --git a/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.Handlers.cs b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.Handlers.cs index 1398cff5e6..349bb33b98 100644 --- a/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.Handlers.cs +++ b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.Handlers.cs @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2026 Goob Station Contributors +// +// SPDX-License-Identifier: MPL-2.0 + using Content.Goobstation.Shared.Supermatter.Components; using Content.Goobstation.Shared.Supermatter.Systems; using Content.Server.Atmos.EntitySystems; diff --git a/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterYapSystem.cs b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterYapSystem.cs index 4aa4d51562..34e4d6c411 100644 --- a/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterYapSystem.cs +++ b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterYapSystem.cs @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2026 Goob Station Contributors +// +// SPDX-License-Identifier: MPL-2.0 + using Content.Goobstation.Shared.Supermatter.Components; using Content.Server.AlertLevel; From d143c30ac74555b32dc4a15df751493c7c5f8fd2 Mon Sep 17 00:00:00 2001 From: SX-7 Date: Sat, 28 Feb 2026 20:32:33 +0100 Subject: [PATCH 15/16] Move to partials --- .../Supermatter/SupermatterHelpers.cs | 13 ----------- ...osSystem.cs => SupermatterSystem.Atmos.cs} | 11 +++------ ...eSystem.cs => SupermatterSystem.Damage.cs} | 14 +++-------- ...em.cs => SupermatterSystem.Destructive.cs} | 23 +++++-------------- .../Systems/SupermatterSystem.Handlers.cs | 2 -- ...rYapSystem.cs => SupermatterSystem.Yap.cs} | 14 +++-------- .../Supermatter/Systems/SupermatterSystem.cs | 14 ++++------- .../Components/SupermatterComponent.cs | 2 -- 8 files changed, 19 insertions(+), 74 deletions(-) rename Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/{SupermatterAtmosSystem.cs => SupermatterSystem.Atmos.cs} (94%) rename Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/{SupermatterDamageSystem.cs => SupermatterSystem.Damage.cs} (86%) rename Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/{SupermatterDestructiveSystem.cs => SupermatterSystem.Destructive.cs} (80%) rename Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/{SupermatterYapSystem.cs => SupermatterSystem.Yap.cs} (87%) diff --git a/Modules/GoobStation/Content.Goobstation.Server/Supermatter/SupermatterHelpers.cs b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/SupermatterHelpers.cs index 0e2006766d..8421d422ea 100644 --- a/Modules/GoobStation/Content.Goobstation.Server/Supermatter/SupermatterHelpers.cs +++ b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/SupermatterHelpers.cs @@ -107,16 +107,3 @@ public static void SupermatterAnnouncement(this ChatSystem chat, EntityUid uid, chat.TrySendInGameICMessage(uid, message, InGameICChatType.Speak, hideChat: false, checkRadioPrefix: true); } } - - -[ByRefEvent] -public record struct SupermatterTickEvent(SupermatterComponent Component); - -[ByRefEvent] -public record struct SupermatterYapEvent(SupermatterComponent Component); - -[ByRefEvent] -public record struct SupermatterZapEvent(SupermatterComponent Component); - -[ByRefEvent] -public record struct SupermatterDelamEvent(SupermatterComponent Component); diff --git a/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterAtmosSystem.cs b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.Atmos.cs similarity index 94% rename from Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterAtmosSystem.cs rename to Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.Atmos.cs index a67854da47..6a72872123 100644 --- a/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterAtmosSystem.cs +++ b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.Atmos.cs @@ -1,24 +1,19 @@ using Content.Goobstation.Shared.Supermatter.Components; +using Content.Goobstation.Shared.Supermatter.Systems; using Content.Server.Atmos.EntitySystems; using Content.Shared.Atmos; using Content.Shared.Radiation.Components; namespace Content.Goobstation.Server.Supermatter.Systems; -public sealed class SupermatterAtmosSystem : EntitySystem +public sealed partial class SupermatterSystem : SharedSupermatterSystem { [Dependency] private readonly AtmosphereSystem _atmosphere = default!; - public override void Initialize() - { - base.Initialize(); - - SubscribeLocalEvent(ProcessAtmos); - } /// /// Handle power and radiation output depending on atmospheric things. /// - private void ProcessAtmos(EntityUid uid, SupermatterComponent sm, SupermatterTickEvent ev) + private void ProcessAtmos(EntityUid uid, SupermatterComponent sm) { #region Get gas mix diff --git a/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterDamageSystem.cs b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.Damage.cs similarity index 86% rename from Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterDamageSystem.cs rename to Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.Damage.cs index d5731debad..91922f0bb3 100644 --- a/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterDamageSystem.cs +++ b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.Damage.cs @@ -1,23 +1,15 @@ using Content.Goobstation.Shared.Supermatter.Components; -using Content.Server.Atmos.EntitySystems; +using Content.Goobstation.Shared.Supermatter.Systems; using Content.Shared.Atmos; namespace Content.Goobstation.Server.Supermatter.Systems; -public sealed class SupermatterDamageSystem : EntitySystem +public sealed partial class SupermatterSystem : SharedSupermatterSystem { - [Dependency] private readonly AtmosphereSystem _atmosphere = default!; - public override void Initialize() - { - base.Initialize(); - - SubscribeLocalEvent(HandleDamage); - } - /// /// Handles environmental damage. /// - private void HandleDamage(EntityUid uid, SupermatterComponent sm, SupermatterTickEvent ev) + private void HandleDamage(EntityUid uid, SupermatterComponent sm) { var damageArchived = sm.Damage; diff --git a/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterDestructiveSystem.cs b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.Destructive.cs similarity index 80% rename from Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterDestructiveSystem.cs rename to Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.Destructive.cs index 79f61341f5..ef7454cfdf 100644 --- a/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterDestructiveSystem.cs +++ b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.Destructive.cs @@ -1,28 +1,19 @@ using Content.Goobstation.Shared.Supermatter.Components; -using Content.Server.Atmos.EntitySystems; +using Content.Goobstation.Shared.Supermatter.Systems; using Content.Server.Explosion.EntitySystems; using Content.Server.Lightning; -using static Content.Goobstation.Shared.Supermatter.Systems.SharedSupermatterSystem; namespace Content.Goobstation.Server.Supermatter.Systems; -public sealed class SupermatterDestructiveSystem : EntitySystem +public sealed partial class SupermatterSystem : SharedSupermatterSystem { - [Dependency] private readonly AtmosphereSystem _atmosphere = default!; [Dependency] private readonly LightningSystem _lightning = default!; [Dependency] private readonly ExplosionSystem _explosion = default!; - public override void Initialize() - { - base.Initialize(); - - SubscribeLocalEvent(HandleZap); - SubscribeLocalEvent(HandleDelam); - } /// /// Shoot lightning bolts depensing on accumulated power. /// - private void HandleZap(EntityUid uid, SupermatterComponent sm, SupermatterZapEvent ev) + private void HandleZap(EntityUid uid, SupermatterComponent sm) { // This isn't DRY but erm whatever. Alternatively I can surface this. And add a few params or some weird struct. // (Also I can't cleanly run it on top level anyways since damage is independent @@ -73,7 +64,7 @@ public DelamType ChooseDelamType(EntityUid uid, SupermatterComponent sm) /// /// Handle the end of the station. /// - private void HandleDelam(EntityUid uid, SupermatterComponent sm, SupermatterDelamEvent ev) + private void HandleDelam(EntityUid uid, SupermatterComponent sm) { var xform = Transform(uid); @@ -82,14 +73,12 @@ private void HandleDelam(EntityUid uid, SupermatterComponent sm, SupermatterDela if (!sm.Delamming) { sm.Delamming = true; - var evYap = new SupermatterYapEvent(sm); - RaiseLocalEvent(ref evYap); + HandleAnnouncements(uid, sm); } if (sm.Damage < sm.DelaminationPoint && sm.Delamming) { sm.Delamming = false; - var evYap = new SupermatterYapEvent(sm); - RaiseLocalEvent(ref evYap); + HandleAnnouncements(uid, sm); } sm.DelamTimerAccumulator++; diff --git a/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.Handlers.cs b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.Handlers.cs index 1398cff5e6..3ab72f8ff3 100644 --- a/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.Handlers.cs +++ b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.Handlers.cs @@ -27,8 +27,6 @@ public sealed partial class SupermatterSystem : SharedSupermatterSystem [Dependency] private readonly SharedTransformSystem _transform = default!; [Dependency] private readonly ISharedAdminLogManager _adminLog = default!; [Dependency] private readonly ISharedChatManager _sharedChat = default!; - [Dependency] private readonly ChatSystem _chat = default!; - [Dependency] private readonly AtmosphereSystem _atmosphere = default!; [Dependency] private readonly SharedContainerSystem _container = default!; private void OnCollideEvent(EntityUid uid, SupermatterComponent sm, ref StartCollideEvent args) diff --git a/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterYapSystem.cs b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.Yap.cs similarity index 87% rename from Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterYapSystem.cs rename to Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.Yap.cs index 4aa4d51562..a37a95566b 100644 --- a/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterYapSystem.cs +++ b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.Yap.cs @@ -1,31 +1,23 @@ using Content.Goobstation.Shared.Supermatter.Components; +using Content.Goobstation.Shared.Supermatter.Systems; using Content.Server.AlertLevel; -using Content.Server.Atmos.EntitySystems; using Content.Server.Chat.Systems; using Content.Server.Station.Systems; using System.Text; -using static Content.Goobstation.Shared.Supermatter.Systems.SharedSupermatterSystem; namespace Content.Goobstation.Server.Supermatter.Systems; -public sealed class SupermatterYapSystem : EntitySystem +public sealed partial class SupermatterSystem : SharedSupermatterSystem { - [Dependency] private readonly AtmosphereSystem _atmosphere = default!; [Dependency] private readonly ChatSystem _chat = default!; [Dependency] private readonly AlertLevelSystem _alert = default!; [Dependency] private readonly StationSystem _station = default!; - public override void Initialize() - { - base.Initialize(); - - SubscribeLocalEvent(HandleAnnouncements); - } /// /// Handles announcements. /// - private void HandleAnnouncements(EntityUid uid, SupermatterComponent sm, SupermatterYapEvent ev) + private void HandleAnnouncements(EntityUid uid, SupermatterComponent sm) { var message = string.Empty; var global = false; diff --git a/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.cs b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.cs index fa62a99e26..0fcf466365 100644 --- a/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.cs +++ b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.cs @@ -59,15 +59,11 @@ public void Cycle(EntityUid ent, SupermatterComponent comp) comp.ZapAccumulator++; comp.YellAccumulator++; - { - var ev = new SupermatterTickEvent(comp); - RaiseLocalEvent(ref ev); - } + ProcessAtmos(ent, comp); if (comp.Damage >= comp.DelaminationPoint || comp.Delamming) { - var ev = new SupermatterDelamEvent(comp); - RaiseLocalEvent(ref ev); + HandleDelam(ent, comp); } HandleSoundLoop(comp); @@ -75,15 +71,13 @@ public void Cycle(EntityUid ent, SupermatterComponent comp) if (comp.ZapAccumulator >= comp.ZapTimer) { comp.ZapAccumulator -= comp.ZapTimer; - var ev = new SupermatterZapEvent(comp); - RaiseLocalEvent(ref ev); + HandleZap(ent, comp); } if (comp.YellAccumulator >= comp.YellTimer) { comp.YellAccumulator -= comp.YellTimer; - var ev = new SupermatterYapEvent(comp); - RaiseLocalEvent(ref ev); + HandleAnnouncements(ent, comp); } } diff --git a/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Components/SupermatterComponent.cs b/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Components/SupermatterComponent.cs index 24038cce84..6aaa7a0571 100644 --- a/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Components/SupermatterComponent.cs +++ b/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Components/SupermatterComponent.cs @@ -5,13 +5,11 @@ using Content.Goobstation.Shared.Supermatter.Systems; using Content.Shared.Atmos; using Content.Shared.DoAfter; -using Content.Shared.Whitelist; using Robust.Shared.Audio; using Robust.Shared.GameStates; using Robust.Shared.Prototypes; using Robust.Shared.Serialization; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.Array; using static Content.Goobstation.Shared.Supermatter.Systems.SharedSupermatterSystem; namespace Content.Goobstation.Shared.Supermatter.Components; From e426ea0e2b6507a26b1a6dde47772d33962ca651 Mon Sep 17 00:00:00 2001 From: SX-7 Date: Sat, 28 Feb 2026 21:51:34 +0100 Subject: [PATCH 16/16] some updates --- .../Systems/SupermatterSystem.Destructive.cs | 2 +- .../Systems/SupermatterSystem.Handlers.cs | 4 +- .../Supermatter/Systems/SupermatterSystem.cs | 1 + .../Components/SupermatterComponent.cs | 161 ++++++++---------- 4 files changed, 77 insertions(+), 91 deletions(-) diff --git a/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.Destructive.cs b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.Destructive.cs index 38a4311fb7..c9e77e6a3c 100644 --- a/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.Destructive.cs +++ b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.Destructive.cs @@ -20,7 +20,7 @@ public sealed partial class SupermatterSystem : SharedSupermatterSystem private void HandleZap(EntityUid uid, SupermatterComponent sm) { // This isn't DRY but erm whatever. Alternatively I can surface this. And add a few params or some weird struct. - // (Also I can't cleanly run it on top level anyways since damage is independent + // (Also I can't cleanly run it on top level anyways since damage is independent) var mix = _atmosphere.GetContainingMixture(uid, true, true); diff --git a/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.Handlers.cs b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.Handlers.cs index 8a587ed568..96599454a1 100644 --- a/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.Handlers.cs +++ b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.Handlers.cs @@ -4,9 +4,7 @@ using Content.Goobstation.Shared.Supermatter.Components; using Content.Goobstation.Shared.Supermatter.Systems; -using Content.Server.Atmos.EntitySystems; using Content.Server.Audio; -using Content.Server.Chat.Systems; using Content.Server.DoAfter; using Content.Shared.Administration.Logs; using Content.Shared.Atmos; @@ -88,7 +86,7 @@ private void OnHandInteract(EntityUid uid, SupermatterComponent sm, ref Interact sm.MatterPower += 10; - EntityManager.SpawnEntity("Ash", Transform(target).Coordinates); + EntityManager.SpawnEntity(sm.AshPrototypeId, Transform(target).Coordinates); _audio.PlayPvs(sm.DustSound, uid); EntityManager.QueueDeleteEntity(target); } diff --git a/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.cs b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.cs index 0fcf466365..ed4d108292 100644 --- a/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.cs +++ b/Modules/GoobStation/Content.Goobstation.Server/Supermatter/Systems/SupermatterSystem.cs @@ -60,6 +60,7 @@ public void Cycle(EntityUid ent, SupermatterComponent comp) comp.YellAccumulator++; ProcessAtmos(ent, comp); + HandleDamage(ent, comp); if (comp.Damage >= comp.DelaminationPoint || comp.Delamming) { diff --git a/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Components/SupermatterComponent.cs b/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Components/SupermatterComponent.cs index 6aaa7a0571..8e4492e7c7 100644 --- a/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Components/SupermatterComponent.cs +++ b/Modules/GoobStation/Content.Goobstation.Shared/Supermatter/Components/SupermatterComponent.cs @@ -2,7 +2,6 @@ // // SPDX-License-Identifier: MPL-2.0 -using Content.Goobstation.Shared.Supermatter.Systems; using Content.Shared.Atmos; using Content.Shared.DoAfter; using Robust.Shared.Audio; @@ -17,113 +16,65 @@ namespace Content.Goobstation.Shared.Supermatter.Components; [RegisterComponent, NetworkedComponent] public sealed partial class SupermatterComponent : Component { + #region SM Base /// /// The SM will only cycle if activated. /// - [DataField("activated")] + [DataField] public bool Activated = false; - [DataField("supermatterSliverPrototype", customTypeSerializer: typeof(PrototypeIdSerializer))] - public string SliverPrototypeId { get; private set; } = "SupermatterSliver"; - /// /// Affects delamination timer. If removed - delamination timer is divided by 2. /// - [DataField("sliverRemoved")] + [DataField] public bool SliverRemoved = false; - /// - /// What will be spawned when an entity that's not supermatter immune interacts with it. - /// - [DataField("ashPrototype", customTypeSerializer: typeof(PrototypeIdSerializer))] - public string AshPrototypeId { get; private set; } = "Ash"; - - /// - /// There has to be a way to serialize this properly - /// - public readonly string[] LightningPrototypes = - [ - "Lightning", - "ChargedLightning", - "SuperchargedLightning", - "HyperchargedLightning" - ]; - - [DataField("singularitySpawnPrototype", customTypeSerializer: typeof(PrototypeIdSerializer))] - public string SingularityPrototypeId = "Singularity"; - - [DataField("teslaSpawnPrototype", customTypeSerializer: typeof(PrototypeIdSerializer))] - public string TeslaPrototypeId = "TeslaEnergyBall"; - - [DataField("supermatterKudzuSpawnPrototype", customTypeSerializer: typeof(PrototypeIdSerializer))] - public string SupermatterKudzuPrototypeId = "SupermatterKudzu"; - /// /// This is what you're here for /// - [ViewVariables(VVAccess.ReadWrite)] + [DataField] public float Power; /// /// The amount of damage we have currently /// - [ViewVariables(VVAccess.ReadWrite)] + [DataField] public float Damage = 0f; /// /// Damage change since last cycle /// - [ViewVariables(VVAccess.ReadWrite)] + [DataField] public float DamageDelta = 0f; /// /// Temporary power gained from mob consumption. Purely to not instaspike power to 2000 or something. /// - [ViewVariables(VVAccess.ReadWrite)] + [DataField] public float MatterPower; /// /// Ratio of matter power to power conversion rate. 1 mob = 10 matter power /// - [ViewVariables(VVAccess.ReadWrite)] + [DataField] public float MatterPowerConversion = 1f; /// /// The portion of the gasmix we're on. Relevant for gas processing but not for plain checks. /// - [ViewVariables(VVAccess.ReadWrite)] + [DataField] public float GasEfficiency = 0.15f; /// /// Multiply outgoing rads by this. Generic knob. /// - [DataField("radiationOutputFactor")] - [ViewVariables(VVAccess.ReadWrite)] + [DataField] public float RadiationOutputFactor = 1f; #endregion SM Base - #region SM Sound - /// - /// Current stream of SM audio. - /// - public EntityUid? AudioStream; - - public SharedSupermatterSystem.SuperMatterSound? SmSound; - - [DataField("dustSound")] - public SoundSpecifier DustSound = new SoundPathSpecifier("/Audio/Supermatter/dust.ogg"); - - [DataField("delamSound")] - public SoundSpecifier DelamSound = new SoundPathSpecifier("/Audio/Supermatter/delamming.ogg"); - - [DataField("delamAlarm")] - public SoundSpecifier DelamAlarm = new SoundPathSpecifier("/Audio/Machines/alarm.ogg"); - - #endregion SM Sound - #region SM Calculation /// @@ -150,14 +101,12 @@ public sealed partial class SupermatterComponent : Component /// Multiplier on power generated by nuclear reactions /// [ViewVariables(VVAccess.ReadOnly)] - [DataField("reactionpowerModifier")] public float ReactionPowerModifier = 0.55f; /// /// Acts as a multiplier on the amount that nuclear reactions increase the supermatter core temperature /// - [ViewVariables(VVAccess.ReadWrite)] - [DataField("thermalreleaseModifier")] + [DataField] public float ThermalReleaseModifier = 0.2f; /// @@ -165,7 +114,6 @@ public sealed partial class SupermatterComponent : Component /// Default is ~1/750 /// [ViewVariables(VVAccess.ReadOnly)] - [DataField("plasmareleaseModifier")] public float PlasmaReleaseModifier = 0.001333f; /// @@ -173,9 +121,14 @@ public sealed partial class SupermatterComponent : Component /// Default is ~1/325 /// [ViewVariables(VVAccess.ReadOnly)] - [DataField("oxygenreleaseModifier")] public float OxygenReleaseEfficiencyModifier = 0.0031f; + /// + /// As stated + /// + [ViewVariables(VVAccess.ReadOnly)] + public float AmmoniaEnergyPerMole; + #endregion SM Calculation #region SM Timer @@ -184,21 +137,19 @@ public sealed partial class SupermatterComponent : Component /// The point at which we should start sending messeges /// about the damage to the engi channels. ///
- [ViewVariables(VVAccess.ReadWrite)] - [DataField("WarningPoint")] + [DataField] public const float WarningPoint = 50; /// /// The point at which we start sending messages to the common channel /// - [ViewVariables(VVAccess.ReadWrite)] - [DataField("emergencyPoint")] + [DataField] public const float EmergencyPoint = 500; /// /// we yell if over 50 damage every YellTimer Seconds /// - [ViewVariables(VVAccess.ReadWrite)] + [DataField] public float YellTimer = 60f; /// @@ -216,26 +167,25 @@ public sealed partial class SupermatterComponent : Component /// /// Time until delam /// - [ViewVariables(VVAccess.ReadWrite)] - [DataField("delamTimer")] + [DataField] public float DelamTimer = 120f; /// /// The message timer /// - [ViewVariables(VVAccess.ReadWrite)] + [DataField] public float SpeakAccumulator = 60f; [ViewVariables(VVAccess.ReadOnly)] public float UpdateAccumulator = 0f; - [ViewVariables(VVAccess.ReadWrite)] + [DataField] public float UpdateTimer = 1f; [ViewVariables(VVAccess.ReadOnly)] public float ZapAccumulator = 0f; - [ViewVariables(VVAccess.ReadWrite)] + [DataField] public float ZapTimer = 10f; #endregion SM Timer @@ -246,7 +196,6 @@ public sealed partial class SupermatterComponent : Component /// before the charge inertia chain reaction effect starts. /// [ViewVariables(VVAccess.ReadOnly)] - [DataField("powerlossinhibitiongasThreshold")] public float PowerlossInhibitionGasThreshold = 0.20f; /// @@ -255,14 +204,12 @@ public sealed partial class SupermatterComponent : Component /// Scales powerloss inhibition down until this amount of moles is reached /// [ViewVariables(VVAccess.ReadOnly)] - [DataField("powerlossinhibitionmoleThreshold")] public float PowerlossInhibitionMoleThreshold = 20f; /// /// bonus powerloss inhibition boost if this amount of moles is reached /// [ViewVariables(VVAccess.ReadOnly)] - [DataField("powerlossinhibitionmoleboostThreshold")] public float PowerlossInhibitionMoleBoostThreshold = 500f; /// @@ -270,7 +217,6 @@ public sealed partial class SupermatterComponent : Component /// below it we can heal damage /// [ViewVariables(VVAccess.ReadOnly)] - [DataField("molepenaltyThreshold")] public float MolePenaltyThreshold = 900f; /// @@ -278,14 +224,12 @@ public sealed partial class SupermatterComponent : Component /// and delamming into a tesla. Low chance of pyro anomalies, +2 bolts of electricity /// [ViewVariables(VVAccess.ReadOnly)] - [DataField("powerPenaltyThreshold")] public float PowerPenaltyThreshold = 2500f; /// /// Maximum safe operational temperature in degrees Celsius. Supermatter begins taking damage above this temperature. /// [ViewVariables(VVAccess.ReadOnly)] - [DataField("heatpenaltyThreshold")] public float HeatPenaltyThreshold = 40f; /// @@ -299,14 +243,12 @@ public sealed partial class SupermatterComponent : Component /// environmental damage is scaled by this /// [ViewVariables(VVAccess.ReadOnly)] - [DataField("damageincreaseMultiplier")] public float DamageIncreaseMultiplier = 0.25f; /// /// if spaced sm wont take more than 2 damage per cycle /// [ViewVariables(VVAccess.ReadOnly)] - [DataField("maxspaceexposureDamage")] public float MaxSpaceExposureDamage = 2; #endregion SM Threshold @@ -319,7 +261,6 @@ public sealed partial class SupermatterComponent : Component /// The point at which we delamm /// [ViewVariables(VVAccess.ReadOnly)] - [DataField("explosionPoint")] public int DelaminationPoint = 900; //Are we delamming? @@ -328,19 +269,16 @@ public sealed partial class SupermatterComponent : Component //Explosion totalIntensity value [ViewVariables(VVAccess.ReadOnly)] - [DataField("totalIntensity")] public float TotalIntensity = 50000f; //Explosion radius value [ViewVariables(VVAccess.ReadOnly)] - [DataField("radius")] public float Radius = 50f; /// /// These would be what you would get at point blank, decreases with distance /// [ViewVariables(VVAccess.ReadOnly)] - [DataField("detonationRads")] public float DetonationRads = 200f; [ViewVariables(VVAccess.ReadOnly)] @@ -403,7 +341,56 @@ public sealed partial class SupermatterComponent : Component }; #endregion SM Gas - public float AmmoniaEnergyPerMole; + + #region SM Prototypes + + [DataField("supermatterSliverPrototype", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string SliverPrototypeId { get; private set; } = "SupermatterSliver"; + + /// + /// What will be spawned when an entity that's not supermatter immune interacts with it. + /// + [DataField("ashPrototype", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string AshPrototypeId { get; private set; } = "Ash"; + + /// + /// There has to be a way to serialize this properly + /// + [DataField] + public readonly string[] LightningPrototypes = + [ + "Lightning", + "ChargedLightning", + "SuperchargedLightning", + "HyperchargedLightning" + ]; + + [DataField("singularitySpawnPrototype", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string SingularityPrototypeId = "Singularity"; + + [DataField("teslaSpawnPrototype", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string TeslaPrototypeId = "TeslaEnergyBall"; + + [DataField("supermatterKudzuSpawnPrototype", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string SupermatterKudzuPrototypeId = "SupermatterKudzu"; + + #endregion + + #region SM Sound + /// + /// Current stream of SM audio. + /// + public EntityUid? AudioStream; + + public SuperMatterSound? SmSound; + + public SoundSpecifier DustSound = new SoundPathSpecifier("/Audio/Supermatter/dust.ogg"); + + public SoundSpecifier DelamSound = new SoundPathSpecifier("/Audio/Supermatter/delamming.ogg"); + + public SoundSpecifier DelamAlarm = new SoundPathSpecifier("/Audio/Machines/alarm.ogg"); + + #endregion SM Sound /// /// Returns the integrity rounded to hundreds, e.g. 100.00%