diff --git a/Content.Client/Goobstation/Supermatter/Systems/SupermatterSystem.cs b/Content.Client/Goobstation/Supermatter/Systems/SupermatterSystem.cs deleted file mode 100644 index ba40cbe271..0000000000 --- a/Content.Client/Goobstation/Supermatter/Systems/SupermatterSystem.cs +++ /dev/null @@ -1,21 +0,0 @@ -using Content.Shared.Supermatter.Components; -using Content.Shared.Supermatter.Systems; -using Robust.Shared.GameStates; - -namespace Content.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 state) - return; - } -} diff --git a/Content.Server/Goobstation/Supermatter/Systems/SupermatterSystem.cs b/Content.Server/Goobstation/Supermatter/Systems/SupermatterSystem.cs deleted file mode 100644 index 527fcfcfeb..0000000000 --- a/Content.Server/Goobstation/Supermatter/Systems/SupermatterSystem.cs +++ /dev/null @@ -1,605 +0,0 @@ -using System.Linq; -using Robust.Shared.Audio.Systems; -using Robust.Shared.Containers; -using Robust.Shared.Physics; -using Robust.Shared.Physics.Events; -using Robust.Shared.Timing; -using Robust.Server.GameObjects; -using Content.Shared.Atmos; -using Content.Shared.Interaction; -using Content.Shared.Projectiles; -using Content.Shared.Tag; -using Content.Shared.Mobs.Components; -using Content.Shared.Radiation.Components; -using Content.Server.Audio; -using Content.Server.Atmos.EntitySystems; -using Content.Server.Chat.Systems; -using Content.Server.Explosion.EntitySystems; -using Content.Shared.Supermatter.Components; -using Content.Shared.Supermatter.Systems; -using Content.Server.Lightning; -using Content.Server.AlertLevel; -using Content.Server.Station.Systems; -using System.Text; -using Content.Server.Kitchen.Components; -using Content.Shared.DoAfter; -using Content.Shared.Examine; -using Content.Server.DoAfter; -using Content.Server.Popups; - -namespace Content.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 TagSystem _tagSystem = 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 PopupSystem _popup = 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; - - foreach (var sm in EntityManager.EntityQuery()) - { - if (!sm.Activated) - return; - - var uid = sm.Owner; - sm.UpdateAccumulator += frameTime; - - if (sm.UpdateAccumulator >= sm.UpdateTimer) - { - sm.UpdateAccumulator -= sm.UpdateTimer; - Cycle(uid, sm); - } - } - } - - public void Cycle(EntityUid uid, SupermatterComponent sm) - { - sm.ZapAccumulator++; - sm.YellAccumulator++; - - ProcessAtmos(uid, sm); - HandleDamage(uid, sm); - - if (sm.Damage >= sm.DelaminationPoint || sm.Delamming) - HandleDelamination(uid, sm); - - HandleSoundLoop(uid, sm); - - if (sm.ZapAccumulator >= sm.ZapTimer) - { - sm.ZapAccumulator -= sm.ZapTimer; - SupermatterZap(uid, sm); - } - - if (sm.YellAccumulator >= sm.YellTimer) - { - sm.YellAccumulator -= sm.YellTimer; - HandleAnnouncements(uid, sm); - } - } - - #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)) - rad.Intensity = sm.Power * Math.Max(0, 1f + transmissionBonus / 10f) * 0.003f; - - //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)); - - // 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); - } - - /// - /// 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); - } - - /// - /// 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 loc = string.Empty; - var alertLevel = "yellow"; - - switch (_delamType) - { - case DelamType.Explosion: - default: - loc = "supermatter-delam-explosion"; - alertLevel = "altdelta"; - break; - - case DelamType.Cascade: - loc = "supermatter-delam-cascade"; - alertLevel = "C.A.S.C.A.D.E"; - 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 != null ? 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 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); - - { - return DelamType.Explosion; - } - - // при добавлении анти-ноблиума, добавить реакцию "каскад" - // if (sm.Power >= sm.PowerPenaltyThreshold) - // return DelamType.Tesla; - } - - /// - /// 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.DelamTimerAccumulator < sm.DelamTimer) - return; - - switch (_delamType) - { - case DelamType.Explosion: - default: - _explosion.TriggerExplosive(uid); - break; - - case DelamType.Cascade: - Spawn(sm.SupermatterKudzuPrototypeId, xform.Coordinates); - break; - } - } - - private void HandleSoundLoop(EntityUid uid, 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) - { - if (!sm.Activated) - sm.Activated = true; - - var target = args.OtherEntity; - if (args.OtherBody.BodyType == BodyType.Static - || HasComp(target) - || _container.IsEntityInContainer(uid)) - return; - - 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)) - { - EntityManager.SpawnEntity("Ash", Transform(target).Coordinates); - _audio.PlayPvs(sm.DustSound, uid); - } - - EntityManager.QueueDeleteEntity(target); - } - - private void OnHandInteract(EntityUid uid, SupermatterComponent sm, ref InteractHandEvent args) - { - if (!sm.Activated) - sm.Activated = true; - - var target = args.User; - - if (HasComp(target)) - return; - - 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 (!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)); - - sm.DelamTimer /= 2; - } - - 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/Content.Shared/Goobstation/Clothing/Components/ClothingGrantComponentComponent.cs b/Content.Shared/Goobstation/Clothing/Components/ClothingGrantComponentComponent.cs deleted file mode 100644 index b558f697d3..0000000000 --- a/Content.Shared/Goobstation/Clothing/Components/ClothingGrantComponentComponent.cs +++ /dev/null @@ -1,15 +0,0 @@ -using Robust.Shared.Prototypes; - -namespace Content.Shared.SimpleStation14.Clothing -{ - [RegisterComponent] - public sealed partial class ClothingGrantComponentComponent : Component - { - [DataField("component", required: true)] - [AlwaysPushInheritance] - public ComponentRegistry Components { get; private set; } = new(); - - [ViewVariables(VVAccess.ReadWrite)] - public bool IsActive = false; - } -} diff --git a/Content.Shared/Goobstation/Clothing/Components/ClothingGrantTagComponent.cs b/Content.Shared/Goobstation/Clothing/Components/ClothingGrantTagComponent.cs deleted file mode 100644 index 312430cb73..0000000000 --- a/Content.Shared/Goobstation/Clothing/Components/ClothingGrantTagComponent.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace Content.Shared.SimpleStation14.Clothing; - -[RegisterComponent] -public sealed partial class ClothingGrantTagComponent : Component -{ - [DataField("tag", required: true), ViewVariables(VVAccess.ReadWrite)] - public string Tag = ""; - - [ViewVariables(VVAccess.ReadWrite)] - public bool IsActive = false; -} diff --git a/Content.Shared/Goobstation/Clothing/Systems/ClothingGrantingSystem.cs b/Content.Shared/Goobstation/Clothing/Systems/ClothingGrantingSystem.cs deleted file mode 100644 index 5fbc83a4b0..0000000000 --- a/Content.Shared/Goobstation/Clothing/Systems/ClothingGrantingSystem.cs +++ /dev/null @@ -1,92 +0,0 @@ -using Content.Shared.Clothing.Components; -using Content.Shared.Inventory.Events; -using Robust.Shared.Serialization.Manager; -using Content.Shared.Tag; - -namespace Content.Shared.SimpleStation14.Clothing; - -public sealed class ClothingGrantingSystem : EntitySystem -{ - [Dependency] private readonly IComponentFactory _componentFactory = default!; - [Dependency] private readonly ISerializationManager _serializationManager = default!; - [Dependency] private readonly TagSystem _tagSystem = default!; - - public override void Initialize() - { - base.Initialize(); - - SubscribeLocalEvent(OnCompEquip); - SubscribeLocalEvent(OnCompUnequip); - - SubscribeLocalEvent(OnTagEquip); - SubscribeLocalEvent(OnTagUnequip); - } - - private void OnCompEquip(EntityUid uid, ClothingGrantComponentComponent component, GotEquippedEvent args) - { - if (!TryComp(uid, out var clothing)) return; - - if (!clothing.Slots.HasFlag(args.SlotFlags)) return; - - if (component.Components.Count > 1) - { - Logger.Error("Although a component registry supports multiple components, we cannot bookkeep more than 1 component for ClothingGrantComponent at this time."); - return; - } - - foreach (var (name, data) in component.Components) - { - var newComp = (Component) _componentFactory.GetComponent(name); - - if (HasComp(args.Equipee, newComp.GetType())) - continue; - - newComp.Owner = args.Equipee; - - var temp = (object) newComp; - _serializationManager.CopyTo(data.Component, ref temp); - EntityManager.AddComponent(args.Equipee, (Component)temp!); - - component.IsActive = true; - } - } - - private void OnCompUnequip(EntityUid uid, ClothingGrantComponentComponent component, GotUnequippedEvent args) - { - if (!component.IsActive) return; - - foreach (var (name, data) in component.Components) - { - var newComp = (Component) _componentFactory.GetComponent(name); - - RemComp(args.Equipee, newComp.GetType()); - } - - component.IsActive = false; - } - - - private void OnTagEquip(EntityUid uid, ClothingGrantTagComponent component, GotEquippedEvent args) - { - if (!TryComp(uid, out var clothing)) - return; - - if (!clothing.Slots.HasFlag(args.SlotFlags)) - return; - - EnsureComp(args.Equipee); - _tagSystem.AddTag(args.Equipee, component.Tag); - - component.IsActive = true; - } - - private void OnTagUnequip(EntityUid uid, ClothingGrantTagComponent component, GotUnequippedEvent args) - { - if (!component.IsActive) - return; - - _tagSystem.RemoveTag(args.Equipee, component.Tag); - - component.IsActive = false; - } -} diff --git a/Content.Shared/Goobstation/Supermatter/Components/SupermatterComponent.cs b/Content.Shared/Goobstation/Supermatter/Components/SupermatterComponent.cs deleted file mode 100644 index 9729663b33..0000000000 --- a/Content.Shared/Goobstation/Supermatter/Components/SupermatterComponent.cs +++ /dev/null @@ -1,383 +0,0 @@ -using Robust.Shared.GameStates; -using Robust.Shared.Audio; -using Content.Shared.Atmos; -using Content.Shared.Supermatter.Systems; -using Content.Shared.Whitelist; -using Content.Shared.DoAfter; -using Robust.Shared.Serialization; - -namespace Content.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; - - /// - /// 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; - - #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/Effects/Grenades/Supermatter/supermatter_start.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 Dictionary() - { - {Gas.Oxygen, 0f}, - {Gas.Nitrogen, 0f}, - {Gas.CarbonDioxide, 0f}, - {Gas.Plasma, 0f}, - {Gas.Tritium, 0f}, - {Gas.WaterVapor, 0f} - }; - - /// - /// 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 -} - -[Serializable, NetSerializable] -public sealed partial class SupermatterDoAfterEvent : SimpleDoAfterEvent -{ - -} diff --git a/Content.Shared/Goobstation/Supermatter/Components/SupermatterFoodComponent.cs b/Content.Shared/Goobstation/Supermatter/Components/SupermatterFoodComponent.cs deleted file mode 100644 index 16ee486bfc..0000000000 --- a/Content.Shared/Goobstation/Supermatter/Components/SupermatterFoodComponent.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace Content.Shared.Supermatter.Components; - -[RegisterComponent] -public sealed partial class SupermatterFoodComponent : Component -{ - [ViewVariables(VVAccess.ReadWrite)] - [DataField("energy")] - public int Energy { get; set; } = 1; -} diff --git a/Content.Shared/Goobstation/Supermatter/Components/SupermatterImmuneComponent.cs b/Content.Shared/Goobstation/Supermatter/Components/SupermatterImmuneComponent.cs deleted file mode 100644 index b517115eca..0000000000 --- a/Content.Shared/Goobstation/Supermatter/Components/SupermatterImmuneComponent.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Robust.Shared.GameStates; - -namespace Content.Shared.Supermatter.Components; - -[RegisterComponent, NetworkedComponent] -public sealed partial class SupermatterImmuneComponent : Component -{ - -} diff --git a/Content.Shared/Goobstation/Supermatter/Systems/SharedSupermatterSystem.cs b/Content.Shared/Goobstation/Supermatter/Systems/SharedSupermatterSystem.cs deleted file mode 100644 index 7f5656c0e1..0000000000 --- a/Content.Shared/Goobstation/Supermatter/Systems/SharedSupermatterSystem.cs +++ /dev/null @@ -1,47 +0,0 @@ -using Content.Shared.Supermatter.Components; -using Robust.Shared.Serialization; - -namespace Content.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, - Cascade = 1 // save for later - } - #region Getters/Setters - - public 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 : ComponentState - { - public SupermatterComponentState(SupermatterComponent supermatter) - { - } - } - - #endregion Serialization - -} diff --git a/Resources/Audio/Goobstation/Supermatter/attributions.yml b/Resources/Audio/Goobstation/Supermatter/attributions.yml deleted file mode 100644 index 4bf86a4212..0000000000 --- a/Resources/Audio/Goobstation/Supermatter/attributions.yml +++ /dev/null @@ -1,15 +0,0 @@ -- 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" - -- files: ["dust.ogg"] - license: "CC-BY-3.0" - copyright: "Unknown" - source: "https://forums.goobstation.com" - diff --git a/Resources/Audio/Goobstation/Supermatter/calm.ogg b/Resources/Audio/Goobstation/Supermatter/calm.ogg deleted file mode 100644 index dc3102e578..0000000000 Binary files a/Resources/Audio/Goobstation/Supermatter/calm.ogg and /dev/null differ diff --git a/Resources/Audio/Goobstation/Supermatter/delamming.ogg b/Resources/Audio/Goobstation/Supermatter/delamming.ogg deleted file mode 100644 index a48878ec42..0000000000 Binary files a/Resources/Audio/Goobstation/Supermatter/delamming.ogg and /dev/null differ diff --git a/Resources/Audio/Stories/Misc/altdelta.ogg b/Resources/Audio/Stories/Misc/altdelta.ogg deleted file mode 100644 index caeeabc3ff..0000000000 Binary files a/Resources/Audio/Stories/Misc/altdelta.ogg and /dev/null differ diff --git a/Resources/Locale/en-US/Goobstation/supermatter/supermatter.ftl b/Resources/Locale/en-US/Goobstation/supermatter/supermatter.ftl deleted file mode 100644 index 8e75116bca..0000000000 --- a/Resources/Locale/en-US/Goobstation/supermatter/supermatter.ftl +++ /dev/null @@ -1,38 +0,0 @@ -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/Resources/Locale/ru-RU/_stories/supermatter/supermatter.ftl b/Resources/Locale/ru-RU/_stories/supermatter/supermatter.ftl deleted file mode 100644 index dd188d8582..0000000000 --- a/Resources/Locale/ru-RU/_stories/supermatter/supermatter.ftl +++ /dev/null @@ -1,41 +0,0 @@ -guide-entry-sm = - Сверхматерия - -ent-Supermatter = Кристалл Сверхматерии - .desc = Необычно полупрозрачный и переливающийся кристалл. - -ent-SupermatterSliver = Осколок кристалла сверхматерии - .desc = Осколок кристалла сверхматерии. Высокорадиоактивный. - -supermatter-announcer = Автоматический Двигатель Сверхматерии - -supermatter-examine-integrity = - Его целостность [color=yellow]{$integrity}%[/color]. - -supermatter-warning = - Внимание! Нарушается целостность гиперструктуры кристалла! Целостность: {$integrity}%. - -supermatter-emergency = - ОПАСНОСТЬ! Целостность гиперструктуры кристалла достигает критического уровня! Целостность: {$integrity}%. - -supermatter-delam-explosion = - РАССЛОЕНИЕ КРИСТАЛЛА НЕИЗБЕЖНО! Целостность кристалла достигла критического уровня! Задействовано поле непредвиденных ситуаций. - -supermatter-delam-cascade = - РАс№#%ЕнИЕ КРиСтаЛЛА НЕИ№?%#! ПревЫШены ПреДЕлы ЧасТоТы гАРмоНик! ПоЛе неПредвид#нных ситуаций не может быть задействовано из-за непредвиденной ситуации! - -supermatter-delam-cancel = - Кристаллическая гиперструктура возвращается к безопасным рабочим параметрам. Система защиты от сбоев отключена. Целостность: {$integrity}%. - -supermatter-seconds-before-delam = - Расчетное время до расслоение: {$seconds} секунд. - -supermatter-tamper-begin = - Вы начинаете осторожно отрезать кусочек от кристалла сверхматерии... - -supermatter-tamper-end = - Вы чувствуете, как на ваши ладони ложится энергия тысячи солнц. Или это все радиация? - -supermatter-announcement-cc-tamper = - Наша автоматическая система обнаружения несчастных случаев обнаружила, что структурная целостность кристалла сверхматерии была нарушена в результате воздействия внешней силы. - Инженерный отдел, немедленно явиться к двигателю сверхматерии. diff --git a/Resources/Prototypes/AlertLevels/alert_levels.yml b/Resources/Prototypes/AlertLevels/alert_levels.yml index 5bb033949e..d08e1d00a7 100644 --- a/Resources/Prototypes/AlertLevels/alert_levels.yml +++ b/Resources/Prototypes/AlertLevels/alert_levels.yml @@ -58,17 +58,6 @@ emergencyLightColor: Orange forceEnableEmergencyLights: true shuttleTime: 1200 - altdelta: - announcement: alert-level-altdelta-announcement - selectable: false - sound: - path: /Audio/Stories/Misc/altdelta.ogg - params: - volume: -3 - color: DarkRed - emergencyLightColor: Orange - forceEnableEmergencyLights: true - shuttleTime: 1200 epsilon: announcement: alert-level-epsilon-announcement selectable: false diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml index b6c5f69043..cb489cd963 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml @@ -340,10 +340,6 @@ - type: HeldSpeedModifier - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitEngineeringWhite - - type: SupermatterImmune - - type: ClothingGrantComponent # Goobstation - Make sure the CE doesn't get cooked by supermatter - component: - - type: SupermatterImmune #Chief Medical Officer's Hardsuit - type: entity @@ -875,10 +871,6 @@ sprite: Clothing/OuterClothing/Hardsuits/ERTSuits/ertengineer.rsi - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitERTEngineer - - type: SupermatterImmune - - type: ClothingGrantComponent # Goobstation - Make sure the CE doesn't get cooked by supermatter - component: - - type: SupermatterImmune #ERT Medic Hardsuit - type: entity @@ -979,10 +971,6 @@ - type: HeldSpeedModifier - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitDeathsquad - - type: SupermatterImmune - - type: ClothingGrantComponent # Goobstation - Make sure the CE doesn't get cooked by supermatter - component: - - type: SupermatterImmune #CBURN Hardsuit - type: entity diff --git a/Resources/Prototypes/Entities/Objects/Specific/Medical/morgue.yml b/Resources/Prototypes/Entities/Objects/Specific/Medical/morgue.yml index b66e32070d..d1085ff5de 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Medical/morgue.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Medical/morgue.yml @@ -133,7 +133,6 @@ solution: food - type: Extractable grindableSolutionName: food - - type: SupermatterImmune # Goobstation - type: entity parent: Ash diff --git a/Resources/Prototypes/Entities/Structures/Power/Generation/Singularity/singularity.yml b/Resources/Prototypes/Entities/Structures/Power/Generation/Singularity/singularity.yml index caa0f5d23d..53c53fb5dc 100644 --- a/Resources/Prototypes/Entities/Structures/Power/Generation/Singularity/singularity.yml +++ b/Resources/Prototypes/Entities/Structures/Power/Generation/Singularity/singularity.yml @@ -100,4 +100,3 @@ sprite: Structures/Power/Generation/Singularity/singularity_6.rsi state: singularity_6 scale: .9,.9 - - type: SupermatterImmune # Goobstation \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Structures/Power/Generation/Tesla/energyball.yml b/Resources/Prototypes/Entities/Structures/Power/Generation/Tesla/energyball.yml index 2f9a19aa31..558504d579 100644 --- a/Resources/Prototypes/Entities/Structures/Power/Generation/Tesla/energyball.yml +++ b/Resources/Prototypes/Entities/Structures/Power/Generation/Tesla/energyball.yml @@ -31,7 +31,6 @@ shootMaxInterval: 10 shootRange: 3 lightningPrototype: Lightning - - type: SupermatterImmune # Goobstation - type: entity id: TeslaEnergyBall diff --git a/Resources/Prototypes/Guidebook/engineering.yml b/Resources/Prototypes/Guidebook/engineering.yml index c98a0c5004..21d17f0227 100644 --- a/Resources/Prototypes/Guidebook/engineering.yml +++ b/Resources/Prototypes/Guidebook/engineering.yml @@ -66,7 +66,6 @@ - Singularity - TEG - RTG - - Supermatter - type: guideEntry id: AME diff --git a/Resources/Prototypes/Recipes/Construction/Graphs/utilities/atmos_binary.yml b/Resources/Prototypes/Recipes/Construction/Graphs/utilities/atmos_binary.yml index b1f5312d3e..63ae324910 100644 --- a/Resources/Prototypes/Recipes/Construction/Graphs/utilities/atmos_binary.yml +++ b/Resources/Prototypes/Recipes/Construction/Graphs/utilities/atmos_binary.yml @@ -52,12 +52,6 @@ amount: 2 doAfter: 1 - - to: radiatorbend - steps: - - material: Steel - amount: 2 - doAfter: 1 - - node: pressurepump entity: GasPressurePump edges: @@ -189,21 +183,3 @@ doAfter: 1 - tool: Welding doAfter: 1 - - - node: radiatorbend - entity: HeatExchangerBend - edges: - - to: start - conditions: - - !type:EntityAnchored - anchored: false - completed: - - !type:SpawnPrototype - prototype: SheetSteel1 - amount: 2 - - !type:DeleteEntity - steps: - - tool: Screwing - doAfter: 1 - - tool: Welding - doAfter: 1 diff --git a/Resources/Prototypes/Stories/Entities/Objects/Misc/supermatter_sliver.yml b/Resources/Prototypes/Stories/Entities/Objects/Misc/supermatter_sliver.yml deleted file mode 100644 index 585f076ab0..0000000000 --- a/Resources/Prototypes/Stories/Entities/Objects/Misc/supermatter_sliver.yml +++ /dev/null @@ -1,25 +0,0 @@ -- type: entity - parent: BaseItem - id: SupermatterSliver - name: Осколок Сверхматерии - description: Осколок кристалла сверхматерии. Высокорадиоактивный. - components: - - type: PointLight - enabled: true - radius: 3 - energy: 2 - color: "#fff633" - - type: RadiationSource - intensity: .75 - - type: Icon - sprite: Goobstation/Supermatter/supermatter_sliver.rsi - state: icon - - type: Sprite - sprite: Goobstation/Supermatter/supermatter_sliver.rsi - state: icon - - type: StealTarget - stealGroup: SupermatterSliver - - type: Tag - tags: - - HighRiskItem - - type: SupermatterImmune \ No newline at end of file diff --git a/Resources/Prototypes/Stories/Entities/Structures/Piping/Atmospherics/binary.yml b/Resources/Prototypes/Stories/Entities/Structures/Piping/Atmospherics/binary.yml deleted file mode 100644 index d4aeda6503..0000000000 --- a/Resources/Prototypes/Stories/Entities/Structures/Piping/Atmospherics/binary.yml +++ /dev/null @@ -1,40 +0,0 @@ -- type: entity - parent: GasBinaryBase - id: HeatExchangerBend - name: радиатор - suffix: Угловой - description: Переносит тепло между трубой и окружающей средой. - placement: - mode: SnapgridCenter - components: - - type: Rotatable - - type: Transform - noRot: false - - type: Sprite - sprite: Structures/Piping/Atmospherics/heatexchanger.rsi - layers: - - sprite: Structures/Piping/Atmospherics/pipe.rsi - state: pipeBend - map: [ "enum.PipeVisualLayers.Pipe" ] - - state: heBend - map: [ "enum.SubfloorLayers.FirstLayer" ] - - type: SubFloorHide - visibleLayers: - - enum.SubfloorLayers.FirstLayer - - type: Appearance - - type: PipeColorVisuals - - type: AtmosDevice - - type: HeatExchanger - - type: NodeContainer - nodes: - inlet: - !type:PipeNode - nodeGroupID: Pipe - pipeDirection: South - outlet: - !type:PipeNode - nodeGroupID: Pipe - pipeDirection: West - - type: Construction - graph: GasBinary - node: radiator diff --git a/Resources/Prototypes/Stories/Entities/Structures/Supermatter/explosions.yml b/Resources/Prototypes/Stories/Entities/Structures/Supermatter/explosions.yml deleted file mode 100644 index 8633630c6f..0000000000 --- a/Resources/Prototypes/Stories/Entities/Structures/Supermatter/explosions.yml +++ /dev/null @@ -1,15 +0,0 @@ -- type: explosion - id: Supermatter - damagePerIntensity: - types: - Radiation: 5 - Heat: 4 - Blunt: 3 - Piercing: 3 - tileBreakChance: [0, 0.5, 1] - tileBreakIntensity: [0, 10, 30] - tileBreakRerollReduction: 20 - lightColor: Yellow - fireColor: Green - texturePath: /Textures/Effects/fire_greyscale.rsi - fireStates: 3 diff --git a/Resources/Prototypes/Stories/Entities/Structures/Supermatter/supermatter.yml b/Resources/Prototypes/Stories/Entities/Structures/Supermatter/supermatter.yml deleted file mode 100644 index aef9c8d4a8..0000000000 --- a/Resources/Prototypes/Stories/Entities/Structures/Supermatter/supermatter.yml +++ /dev/null @@ -1,73 +0,0 @@ -- type: entity - id: Supermatter - name: Кристалл Сверхматерии - description: Необычно полупрозрачный и переливающийся кристалл - placement: - mode: SnapgridCenter - components: - - type: Supermatter - alertCodeDeltaId: altDelta - 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: Goobstation/Supermatter/supermatter.rsi - state: supermatter - - type: Icon - sprite: Goobstation/Supermatter/supermatter.rsi - state: supermatter - - type: PointLight - enabled: true - radius: 10 - energy: 5 - color: "#ffe000" - - type: Explosive - explosionType: Supermatter - maxIntensity: 25000 - intensitySlope: 5 - totalIntensity: 25000 - - type: GuideHelp - guides: [ Supermatter, Power ] - - type: WarpPoint - follow: true - location: Сверхматерия - - type: SinguloFood - energy: 10000 diff --git a/Resources/Prototypes/Stories/Entities/Structures/Supermatter/tags.yml b/Resources/Prototypes/Stories/Entities/Structures/Supermatter/tags.yml deleted file mode 100644 index 5f31ab44d1..0000000000 --- a/Resources/Prototypes/Stories/Entities/Structures/Supermatter/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -- type: Tag - id: SnapPop diff --git a/Resources/Prototypes/Stories/Guidebook/engineering.yml b/Resources/Prototypes/Stories/Guidebook/engineering.yml deleted file mode 100644 index b17f7122e8..0000000000 --- a/Resources/Prototypes/Stories/Guidebook/engineering.yml +++ /dev/null @@ -1,4 +0,0 @@ -- type: guideEntry - id: Supermatter - name: guide-entry-sm - text: "/ServerInfo/Goobstation/Guidebook/Engineering/Supermatter.xml" diff --git a/Resources/Prototypes/Stories/Recipes/Construction/utilities.yml b/Resources/Prototypes/Stories/Recipes/Construction/utilities.yml deleted file mode 100644 index b8cf798938..0000000000 --- a/Resources/Prototypes/Stories/Recipes/Construction/utilities.yml +++ /dev/null @@ -1,14 +0,0 @@ -- type: construction - id: HeatExchangerBend - name: radiator - suffix: Bend - description: Transfers heat between the pipe and its surroundings. - graph: GasBinary - startNode: start - targetNode: radiatorbend - category: construction-category-utilities - placementMode: SnapgridCenter - canBuildInImpassable: false - icon: - sprite: Structures/Piping/Atmospherics/heatexchanger.rsi - state: heBend \ No newline at end of file diff --git a/Resources/ServerInfo/Goobstation/Guidebook/Engineering/Supermatter.xml b/Resources/ServerInfo/Goobstation/Guidebook/Engineering/Supermatter.xml deleted file mode 100644 index ff6d6ed941..0000000000 --- a/Resources/ServerInfo/Goobstation/Guidebook/Engineering/Supermatter.xml +++ /dev/null @@ -1,60 +0,0 @@ - - - - - # Двигатель Сверхматерии - - Итак, вы решили принять вызов и настроить Двигатель Сверхматерии? Во первых, давайте предварительно дадим вам краткий обзор основного кристалла Сверхматерии - - Его основными возможностями являются излучение электрических дуг, которые используются для питания станции с помощью катушек Теслы. - - Побочные эффекты включают излучение радиации, выделение горячего кислорода и плазмы, нагрев воздуха вокруг и взрыв, превращение в Сингулярность или Теслу и пожирание всей станции, если вы достаточно сильно облажаетесь. - - Вначале он инертен, но попадание предмета или снаряда активирует его, и он начнет проявлять почти все вышеупомянутые свойства. - - ## Слова предупреждения - - 1. Кристалл сверхматерии [color=red]ОЧЕНЬ ОПАСЕН[/color]. Активация кристалла должна быть последним шагом в настройке любой формы силы, основанной на Сверхматерии! - - 2. [color=red]НАДЕНЬ СВОЙ ЧЕРТОВ РАДИАЦИОННЫЙ КОСТЮМ[/color]!! - - 3. Большая часть настройки Сверхматерии включает газовый контур, предназначенный для охлаждения камеры сверхматерии. Пожалуйста, имейте хотя бы некоторые знания о газах и их атмосферных свойствах. - - 4. Все, что сталкивается со Сверхматерией [color=red]фундаментально уничтожается[/color]. [color=red]Не прикасайтесь к этому[/color]. Это означает заваривание и болтирование шлюза камеры сгорания. - - ## Взаимодействие газов - - Вот список всех газов от наименее опасных до наиболее опасных. - - 1. [color=#bffffe]Фрезон[/color]. Помимо охлаждения Сверхматерии, это в основном останавливает выработку электроэнергии и отходов, что может пригодиться, если Сверхматерия близка к расслаиванию и вам нужно быстро отключить ее. - - 2. [color=#c20000]Азот[/color]. N2 - это базовый газ, на котором будет работать исключительно большинство установок Сверхматерии, и его очень просто настроить. Это снижает выработку энергии за счет тепла и уменьшает количество плазмы, выделяемой СМ, что делает его полезным, когда вы не пытаетесь сделать что-то глупое. - - 3. [color=#b16d6d]Оксид Азота[/color]. Повышает термостойкость кристалла, позволяя устанавливать его на гораздо более высокую температуру, чем обычно. Однако при высоких температурах он разлагается на азот и кислород. В то время как N2 хорош, O2, безусловно, нет. Этот O2 также вступит в реакцию с плазмой с образованием трития, а затем... Тритиевый пожар.. - - 4. [color=#62d5ca]Кислород[/color]. Обеспечивает ускорение передачи энергии без активного увеличения количества отходных газов или температуры. Использование довольно рискованно, поскольку любое нарушение контура охлаждения вскоре вызовет плазменный пожар в кристаллической камере. Даже просто высокая концентрация O2 активирует кристалл и будет непрерывно питать его. - - 5. [color=#19b348]Аммиак[/color]. Незначительно увеличивает выработку электроэнергии при незначительных затратах на тепловую энергию. - - 6. [color=#979797]Углекислый газ[/color]. В низких концентрациях он увеличивает выработку энергии кристаллом. В высоких концентрациях это поднимает энергию кристалла до чрезвычайно высокого уровня. При плохом управлении и недостаточной или совершенно плохой подготовке он в конечном итоге превысит безопасные уровни энергии и начнет расслоение кристалла, создавая электрические дуги и аномалии, пока в конечном итоге не взорвется в шар Теслы. - - [color=red]7[/color]. [color=#ff9d00]Плазма[/color]. Очень похож на кислород, но обеспечивает более высокий прирост мощности, а также гораздо более высокие потери тепла. Экстремальные давления и объемы газа, производимого этим газом, с большой вероятностью приводят к засорению труб и перегреву камеры. - - [color=red]8[/color]. [color=#08a800]Тритий[/color]. Увеличивает выработку энергии Сверхматерии в 3 раза, с этим связана одна небольшая проблема. Это опасно. Это очень опасно. Тритий - ужасно раздражительный и вспыльчивый газ. Хотя он не так вреден с точки зрения тепловыделения, как плазма (едва ли), он также занимает второе место по теплоемкости среди всех газов, в то время как плазма занимает второе место по величине. Это означает, что плазму можно поддерживать в хорошем состоянии при достаточном охлаждении, в то время как тритий охотно переходит из безопасной космической петли в пылающий адский огонь. Добавьте к этому побочный продукт производства большого количества кислорода (не только трития. Проблема и в плазменном двигателе), и вы получите тритиевое пламя и очень горячий кристалл. Не используйте этот газ, если только вы не обладаете очень глубокими знаниями об атмосфере и сверхматерии и не готовы проявить творческий подход. - - ## Практическое руководство по Сверхматерии - - Теперь, когда вы познакомились с теорией, давайте перейдём к практике. Начнем с самого простого контура, который можно настроить - азотного контура. - - Вот как должна выглядеть базовая атмосферная настройка: - - 1. Азот закачивается в камеру через пассивные вентиляции с одной стороны. - - 2. Весь газ откачивается из камеры с помощью скрубберов в режиме Сифона, включенном в воздушной сигнализации. - - 3. Выходной поток охлаждается, фильтруется, и избыточный азот либо выводится в космос, либо перенаправляется на вход. - - Вот, в принципе, и всё. Надеюсь, вы поняли этот пример. Теперь приступайте к делу! - - - diff --git a/Resources/Textures/Goobstation/Supermatter/supermatter.rsi/meta.json b/Resources/Textures/Goobstation/Supermatter/supermatter.rsi/meta.json deleted file mode 100644 index d0a000ae2b..0000000000 --- a/Resources/Textures/Goobstation/Supermatter/supermatter.rsi/meta.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "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/Resources/Textures/Goobstation/Supermatter/supermatter.rsi/supermatter.png b/Resources/Textures/Goobstation/Supermatter/supermatter.rsi/supermatter.png deleted file mode 100644 index 0c5747a315..0000000000 Binary files a/Resources/Textures/Goobstation/Supermatter/supermatter.rsi/supermatter.png and /dev/null differ diff --git a/Resources/Textures/Goobstation/Supermatter/supermatter_sliver.rsi/icon.png b/Resources/Textures/Goobstation/Supermatter/supermatter_sliver.rsi/icon.png deleted file mode 100644 index 2187706b10..0000000000 Binary files a/Resources/Textures/Goobstation/Supermatter/supermatter_sliver.rsi/icon.png and /dev/null differ diff --git a/Resources/Textures/Goobstation/Supermatter/supermatter_sliver.rsi/meta.json b/Resources/Textures/Goobstation/Supermatter/supermatter_sliver.rsi/meta.json deleted file mode 100644 index 744651bea0..0000000000 --- a/Resources/Textures/Goobstation/Supermatter/supermatter_sliver.rsi/meta.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "version": 1, - "copyright": "Taken and edited from https://github.com/tgstation/tgstation/blob/master/icons/obj/antags/syndicate_tools.dmi", - "license": "CC-BY-SA-3.0", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "icon" - } - ] -}