From de40b76b2b452c4231fc2244768171bb7f243bbc Mon Sep 17 00:00:00 2001 From: TERRISS <59435888+TERRISS@users.noreply.github.com> Date: Tue, 25 Mar 2025 09:50:48 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9D=D0=B8=D1=82=D1=80=D0=B8=D1=83=D0=BC=20(#?= =?UTF-8?q?1538)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Consoles/AtmosAlarmEntryContainer.xaml.cs | 21 +++++- .../Portable/PortableScrubberComponent.cs | 1 + .../Reactions/NitriumSynthesisReaction.cs | 41 +++++++++++ .../Components/GasLeakRuleComponent.cs | 3 +- .../Components/GasArtifactComponent.cs | 3 +- .../Components/ArtifactGasTriggerComponent.cs | 1 + Content.Shared/Atmos/Atmospherics.cs | 4 +- .../Components/SharedVentScrubberComponent.cs | 1 + .../storage/canisters/gas_canisters.ftl | 4 ++ .../storage/canisters/gas_canisters.ftl | 4 ++ .../_sunrise/reagents/meta/gases.ftl | 3 + .../ru-RU/_strings/_sunrise/atmos/gases.ftl | 1 + .../Specific/Atmospherics/sensor.yml | 1 + .../_Sunrise/Atmospherics/gases.yml | 13 ++++ .../_Sunrise/Atmospherics/reactions.yml | 19 +++++- .../Storage/Canisters/gas_canisters.yml | 61 +++++++++++++++++ .../Prototypes/_Sunrise/Reagents/gases.yml | 64 +++++++++++++++++- .../Effects/atmospherics.rsi/meta.json | 4 ++ .../Effects/atmospherics.rsi/nitriumGas.png | Bin 0 -> 4156 bytes .../Structures/Storage/canister.rsi/meta.json | 6 ++ .../Storage/canister.rsi/nitrium-1.png | Bin 0 -> 1232 bytes .../Storage/canister.rsi/nitrium.png | Bin 0 -> 1304 bytes 22 files changed, 248 insertions(+), 7 deletions(-) create mode 100644 Content.Server/Atmos/Reactions/NitriumSynthesisReaction.cs create mode 100644 Resources/Textures/_Sunrise/Effects/atmospherics.rsi/nitriumGas.png create mode 100644 Resources/Textures/_Sunrise/Structures/Storage/canister.rsi/nitrium-1.png create mode 100644 Resources/Textures/_Sunrise/Structures/Storage/canister.rsi/nitrium.png diff --git a/Content.Client/Atmos/Consoles/AtmosAlarmEntryContainer.xaml.cs b/Content.Client/Atmos/Consoles/AtmosAlarmEntryContainer.xaml.cs index f0e4b13356..e537728331 100644 --- a/Content.Client/Atmos/Consoles/AtmosAlarmEntryContainer.xaml.cs +++ b/Content.Client/Atmos/Consoles/AtmosAlarmEntryContainer.xaml.cs @@ -31,6 +31,22 @@ public sealed partial class AtmosAlarmEntryContainer : BoxContainer [AtmosAlarmType.Danger] = "atmos-alerts-window-danger-state", }; + private Dictionary _gasShorthands = new Dictionary() + { + [Gas.Ammonia] = "NH₃", + [Gas.CarbonDioxide] = "CO₂", + [Gas.Frezon] = "F", + [Gas.Nitrogen] = "N₂", + [Gas.NitrousOxide] = "N₂O", + [Gas.Oxygen] = "O₂", + [Gas.Plasma] = "P", + [Gas.Tritium] = "T", + [Gas.WaterVapor] = "H₂O", + [Gas.BZ] = "BZ", //SunRise edit + [Gas.Healium] = "F₃BZ", //SunRise edit + [Gas.Nitrium] = "N" //SunRise edit + }; + public AtmosAlarmEntryContainer(NetEntity uid, EntityCoordinates? coordinates) { RobustXamlLoader.Load(this); @@ -149,11 +165,12 @@ public sealed partial class AtmosAlarmEntryContainer : BoxContainer foreach ((var gas, (var mol, var percent, var alert)) in keyValuePairs) { FixedPoint2 gasPercent = percent * 100f; - var gasAbbreviation = Atmospherics.GasAbbreviations.GetValueOrDefault(gas, Loc.GetString("gas-unknown-abbreviation")); + + var gasShorthand = _gasShorthands.GetValueOrDefault(gas, "X"); var gasLabel = new Label() { - Text = Loc.GetString("atmos-alerts-window-other-gases-value", ("shorthand", gasAbbreviation), ("value", gasPercent)), + Text = Loc.GetString("atmos-alerts-window-other-gases-value", ("shorthand", gasShorthand), ("value", gasPercent)), FontOverride = normalFont, FontColorOverride = GetAlarmStateColor(alert), HorizontalAlignment = HAlignment.Center, diff --git a/Content.Server/Atmos/Portable/PortableScrubberComponent.cs b/Content.Server/Atmos/Portable/PortableScrubberComponent.cs index e94f5e5e0e..74ffe21e60 100644 --- a/Content.Server/Atmos/Portable/PortableScrubberComponent.cs +++ b/Content.Server/Atmos/Portable/PortableScrubberComponent.cs @@ -32,6 +32,7 @@ namespace Content.Server.Atmos.Portable Gas.Frezon, Gas.BZ, //SunRise edit Gas.Healium, //SunRise edit + Gas.Nitrium, //SunRise edit }; [ViewVariables(VVAccess.ReadWrite)] diff --git a/Content.Server/Atmos/Reactions/NitriumSynthesisReaction.cs b/Content.Server/Atmos/Reactions/NitriumSynthesisReaction.cs new file mode 100644 index 0000000000..310f4b7b63 --- /dev/null +++ b/Content.Server/Atmos/Reactions/NitriumSynthesisReaction.cs @@ -0,0 +1,41 @@ +using Content.Server.Atmos.EntitySystems; +using Content.Shared.Atmos; +using Content.Shared.Atmos.Reactions; +using JetBrains.Annotations; + +namespace Content.Server.Atmos.Reactions; + +/// +/// Реакция для синтеза Нитриума из трития, азота и BZ. by TERRISS +/// +[UsedImplicitly] +public sealed partial class NitriumSynthesisReaction : IGasReactionEffect +{ + public ReactionResult React(GasMixture mixture, IGasMixtureHolder? holder, AtmosphereSystem atmosphereSystem, float heatScale) + { + var initTritium = mixture.GetMoles(Gas.Tritium); + var initNitrogen = mixture.GetMoles(Gas.Nitrogen); + var initBZ = mixture.GetMoles(Gas.BZ); + var temperature = mixture.Temperature; + + // Проверка условий для реакции + if (initTritium < 2 || initNitrogen < 2 || initBZ < 1 || temperature < 1500 || temperature > 100000) + return ReactionResult.NoReaction; + + // Логика реакции + var tritiumRemoved = 2f; // Количество удаляемого трития + var nitrogenRemoved = 2f; // Количество удаляемого азота + var bzRemoved = 1f; // Количество удаляемого BZ + var nitriumProduced = 3f; // Количество производимого Нитриума + + if (tritiumRemoved > initTritium || nitrogenRemoved > initNitrogen || bzRemoved > initBZ) + return ReactionResult.NoReaction; + + mixture.AdjustMoles(Gas.Tritium, -tritiumRemoved); + mixture.AdjustMoles(Gas.Nitrogen, -nitrogenRemoved); + mixture.AdjustMoles(Gas.BZ, -bzRemoved); + mixture.AdjustMoles(Gas.Nitrium, nitriumProduced); + + return ReactionResult.Reacting; + } +} diff --git a/Content.Server/StationEvents/Components/GasLeakRuleComponent.cs b/Content.Server/StationEvents/Components/GasLeakRuleComponent.cs index 040e3acbf5..7a96c720a0 100644 --- a/Content.Server/StationEvents/Components/GasLeakRuleComponent.cs +++ b/Content.Server/StationEvents/Components/GasLeakRuleComponent.cs @@ -15,7 +15,8 @@ public sealed partial class GasLeakRuleComponent : Component Gas.Frezon, Gas.WaterVapor, // the fog Gas.BZ, //SunRise edit - Gas.Healium //SunRise edit + Gas.Healium, //SunRise edit + Gas.Nitrium, //SunRise edit }; /// diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/GasArtifactComponent.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/GasArtifactComponent.cs index d76c2833cc..612df83b5e 100644 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/GasArtifactComponent.cs +++ b/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/GasArtifactComponent.cs @@ -31,7 +31,8 @@ public sealed partial class GasArtifactComponent : Component Gas.NitrousOxide, Gas.Frezon, Gas.BZ, //SunRise edit - Gas.Healium //SunRise edit + Gas.Healium, //SunRise edit + Gas.Nitrium, //SunRise edit }; /// diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Components/ArtifactGasTriggerComponent.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Components/ArtifactGasTriggerComponent.cs index cb64c9c4c0..3eeaccf72c 100644 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Components/ArtifactGasTriggerComponent.cs +++ b/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Components/ArtifactGasTriggerComponent.cs @@ -22,6 +22,7 @@ public sealed partial class ArtifactGasTriggerComponent : Component Gas.NitrousOxide, Gas.BZ, //SunRise edit Gas.Healium, //SunRise edit + Gas.Nitrium, //SunRise edit }; /// diff --git a/Content.Shared/Atmos/Atmospherics.cs b/Content.Shared/Atmos/Atmospherics.cs index 6e7d860980..1f68988530 100644 --- a/Content.Shared/Atmos/Atmospherics.cs +++ b/Content.Shared/Atmos/Atmospherics.cs @@ -176,6 +176,7 @@ namespace Content.Shared.Atmos [Gas.WaterVapor] = Loc.GetString("gas-water-vapor-abbreviation"), [Gas.BZ] = Loc.GetString("gas-bz-abbreviation"), //SunRise edit [Gas.Healium] = Loc.GetString("gas-healium-abbreviation"), //SunRise edit + [Gas.Nitrium] = Loc.GetString("gas-nitrium-abbreviation"), //SunRise edit }; #region Excited Groups @@ -205,7 +206,7 @@ namespace Content.Shared.Atmos /// /// Total number of gases. Increase this if you want to add more! /// - public const int TotalNumberOfGases = 11; //SunRise edit + public const int TotalNumberOfGases = 12; //SunRise edit /// /// This is the actual length of the gases arrays in mixtures. @@ -391,5 +392,6 @@ namespace Content.Shared.Atmos Frezon = 8, BZ = 9, //SunRise edit Healium = 10, //SunRise edit + Nitrium = 11 //SunRise edit } } diff --git a/Content.Shared/Atmos/Piping/Unary/Components/SharedVentScrubberComponent.cs b/Content.Shared/Atmos/Piping/Unary/Components/SharedVentScrubberComponent.cs index 738fd9b8a9..57800b653b 100644 --- a/Content.Shared/Atmos/Piping/Unary/Components/SharedVentScrubberComponent.cs +++ b/Content.Shared/Atmos/Piping/Unary/Components/SharedVentScrubberComponent.cs @@ -25,6 +25,7 @@ namespace Content.Shared.Atmos.Piping.Unary.Components Gas.Frezon, Gas.BZ, // Sunrise-Edit Gas.Healium, // Sunrise-Edit + Gas.Nitrium, //SunRise edit }; // Presets for 'dumb' air alarm modes diff --git a/Resources/Locale/en-US/_prototypes/_sunrise/entities/structures/storage/canisters/gas_canisters.ftl b/Resources/Locale/en-US/_prototypes/_sunrise/entities/structures/storage/canisters/gas_canisters.ftl index 76d1d6a754..fde654b406 100644 --- a/Resources/Locale/en-US/_prototypes/_sunrise/entities/structures/storage/canisters/gas_canisters.ftl +++ b/Resources/Locale/en-US/_prototypes/_sunrise/entities/structures/storage/canisters/gas_canisters.ftl @@ -2,7 +2,11 @@ ent-BZCanister = BZ Canister .desc = A canister that can contain any type of gas. This one presumably contains BZ. Can be attached to a connector port using a wrench. ent-HealiumCanister = Healium Canister .desc = A canister that can contain any type of gas. This one presumably contains Healium. Can be attached to a connector port using a wrench. +ent-NitriumCanister = Nitrium Canister + .desc = A canister that can contain any type of gas. This one presumably contains Nitrium. Can be attached to a connector port using a wrench. ent-BZCanisterBroken = { ent-GasCanisterBrokenBase } .desc = { ent-GasCanisterBrokenBase.desc } ent-HealiumCanisterBroken = { ent-GasCanisterBrokenBase } .desc = { ent-GasCanisterBrokenBase.desc } +ent-NitriumCanisterBroken = { ent-GasCanisterBrokenBase } + .desc = { ent-GasCanisterBrokenBase.desc } diff --git a/Resources/Locale/ru-RU/_prototypes/_sunrise/entities/structures/storage/canisters/gas_canisters.ftl b/Resources/Locale/ru-RU/_prototypes/_sunrise/entities/structures/storage/canisters/gas_canisters.ftl index fb1c122c60..ffd5213721 100644 --- a/Resources/Locale/ru-RU/_prototypes/_sunrise/entities/structures/storage/canisters/gas_canisters.ftl +++ b/Resources/Locale/ru-RU/_prototypes/_sunrise/entities/structures/storage/canisters/gas_canisters.ftl @@ -2,7 +2,11 @@ ent-BZCanister = Канистра БЗ .desc = Канистра, в которой может содержаться газ любого вида. В этой, предположительно, содержится БЗ. Можно прикрепить к порту коннектора с помощью гаечного ключа. ent-HealiumCanister = Канистра хилиума .desc = Канистра, в которой может содержаться газ любого вида. В этой, предположительно, содержится хилиум. Можно прикрепить к порту коннектора с помощью гаечного ключа. +ent-NitriumCanister = канистра нитриума + .desc = Канистра, в которой может содержаться газ любого вида. В этой, предположительно, содержится Нитриум. Можно прикрепить к порту коннектора с помощью гаечного ключа. ent-BZCanisterBroken = { ent-GasCanisterBrokenBase } .desc = { ent-GasCanisterBrokenBase.desc } ent-HealiumCanisterBroken = { ent-GasCanisterBrokenBase } .desc = { ent-GasCanisterBrokenBase.desc } +ent-NitriumCanisterBroken = { ent-GasCanisterBrokenBase } + .desc = { ent-GasCanisterBrokenBase.desc } diff --git a/Resources/Locale/ru-RU/_prototypes/_sunrise/reagents/meta/gases.ftl b/Resources/Locale/ru-RU/_prototypes/_sunrise/reagents/meta/gases.ftl index b55d661d84..669ed3b006 100644 --- a/Resources/Locale/ru-RU/_prototypes/_sunrise/reagents/meta/gases.ftl +++ b/Resources/Locale/ru-RU/_prototypes/_sunrise/reagents/meta/gases.ftl @@ -2,5 +2,8 @@ reagent-name-bz = БЗ reagent-desc-bz = Мощный галлюциноген, который также усыпляет слаймолюдов. reagent-name-healium = хилиум reagent-desc-healium = Мощное снотворное средство с регенерирующими свойствами. +reagent-name-nitrium = нитриум +reagent-desc-nitrium = Мощный стимулятор, при вдыхании повышает скорость и выносливость. gases-healium = Хилиум gases-bz = БЗ +gases-nitrium = Нитриум diff --git a/Resources/Locale/ru-RU/_strings/_sunrise/atmos/gases.ftl b/Resources/Locale/ru-RU/_strings/_sunrise/atmos/gases.ftl index aef73ef84c..54a6238f88 100644 --- a/Resources/Locale/ru-RU/_strings/_sunrise/atmos/gases.ftl +++ b/Resources/Locale/ru-RU/_strings/_sunrise/atmos/gases.ftl @@ -1,2 +1,3 @@ gas-bz-abbreviation = BZ gas-healium-abbreviation = F₃BZ +gas-nitrium-abbreviation = N diff --git a/Resources/Prototypes/Entities/Structures/Specific/Atmospherics/sensor.yml b/Resources/Prototypes/Entities/Structures/Specific/Atmospherics/sensor.yml index 7b9fbf08de..50c5124a8d 100644 --- a/Resources/Prototypes/Entities/Structures/Specific/Atmospherics/sensor.yml +++ b/Resources/Prototypes/Entities/Structures/Specific/Atmospherics/sensor.yml @@ -27,6 +27,7 @@ Frezon: danger BZ: danger #SunRise edit Healium: stationNO #SunRise edit + Nitrium: stationNO #SunRise edit - type: Tag tags: - AirSensor diff --git a/Resources/Prototypes/_Sunrise/Atmospherics/gases.yml b/Resources/Prototypes/_Sunrise/Atmospherics/gases.yml index f507a1c917..25965dad3e 100644 --- a/Resources/Prototypes/_Sunrise/Atmospherics/gases.yml +++ b/Resources/Prototypes/_Sunrise/Atmospherics/gases.yml @@ -21,3 +21,16 @@ pricePerMole: 3 gasOverlaySprite: /Textures/_Sunrise/Effects/atmospherics.rsi gasOverlayState: healium + +- type: gas + id: 11 + name: gases-nitrium + specificHeat: 20 + heatCapacityRatio: 1.4 + molarMass: 30 + color: 8B4513 + reagent: Nitrium + pricePerMole: 0.2 + gasOverlaySprite: /Textures/_Sunrise/Effects/atmospherics.rsi + gasOverlayState: nitriumGas + diff --git a/Resources/Prototypes/_Sunrise/Atmospherics/reactions.yml b/Resources/Prototypes/_Sunrise/Atmospherics/reactions.yml index 825787aaf4..3b6db95525 100644 --- a/Resources/Prototypes/_Sunrise/Atmospherics/reactions.yml +++ b/Resources/Prototypes/_Sunrise/Atmospherics/reactions.yml @@ -30,4 +30,21 @@ - 0.01 # frezon - 0.01 # bz effects: - - !type:HealiumProductionReaction {} \ No newline at end of file + - !type:HealiumProductionReaction {} + +- type: gasReaction + id: NitriumSynthesis + priority: 2 + minimumRequirements: + - 0 # oxygen + - 2 # nitrogen + - 0 # carbon dioxide + - 0 # plasma + - 2 # tritium + - 0 # vapor + - 0 # miasma + - 0 # n2o + - 0 # frezon + - 0.01 # bz + effects: + - !type:NitriumSynthesisReaction {} diff --git a/Resources/Prototypes/_Sunrise/Entities/Structures/Storage/Canisters/gas_canisters.yml b/Resources/Prototypes/_Sunrise/Entities/Structures/Storage/Canisters/gas_canisters.yml index 8efc321906..855ffda39a 100644 --- a/Resources/Prototypes/_Sunrise/Entities/Structures/Storage/Canisters/gas_canisters.yml +++ b/Resources/Prototypes/_Sunrise/Entities/Structures/Storage/Canisters/gas_canisters.yml @@ -101,6 +101,58 @@ - type: Lock locked: true +- type: entity + parent: GasCanister + id: NitriumCanister + name: Nitrium Canister + description: "Канистра, которая может содержать любой тип газа. Эта, предположительно, содержит Нитриум. Может быть подключена к разъему с помощью ключа." + components: + - type: Sprite + sprite: _Sunrise/Structures/Storage/canister.rsi + layers: + - state: nitrium + - type: GasCanister + gasMixture: + volume: 1000 + moles: + - 0 # oxygen + - 0 # nitrogen + - 0 # CO2 + - 0 # Plasma + - 0 # Tritium + - 0 # Water vapor + - 0 # Miasma + - 0 # N2O + - 0 # Frezon + - 0 # BZ + - 0 # Healium + - 1871.71051 # Nitrium + temperature: 293.15 + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 600 + behaviors: + - !type:DoActsBehavior + acts: [ "Destruction" ] + - trigger: + !type:DamageTrigger + damage: 300 + behaviors: + - !type:PlaySoundBehavior + sound: + collection: MetalBreak + - !type:SpawnEntitiesBehavior + spawn: + NitriumCanisterBroken: + min: 1 + max: 1 + - !type:DoActsBehavior + acts: [ "Destruction" ] + - !type:DumpCanisterBehavior + - type: Lock + locked: true - type: entity @@ -120,3 +172,12 @@ - type: Sprite sprite: _Sunrise/Structures/Storage/canister.rsi state: healium-1 + +- type: entity + parent: GasCanisterBrokenBase + id: NitriumCanisterBroken + categories: [ HideSpawnMenu ] + components: + - type: Sprite + sprite: _Sunrise/Structures/Storage/canister.rsi + state: nitrium-1 diff --git a/Resources/Prototypes/_Sunrise/Reagents/gases.yml b/Resources/Prototypes/_Sunrise/Reagents/gases.yml index 0ede2f2615..c97bf172e2 100644 --- a/Resources/Prototypes/_Sunrise/Reagents/gases.yml +++ b/Resources/Prototypes/_Sunrise/Reagents/gases.yml @@ -168,4 +168,66 @@ conditions: - !type:ReagentThreshold reagent: Healium - min: 1 \ No newline at end of file + min: 1 + +- type: reagent + id: Nitrium + name: reagent-name-nitrium + desc: reagent-desc-nitrium + physicalDesc: reagent-physical-desc-gaseous + flavor: bitter + color: "#8B4513" + metabolisms: + Gas: + Medicine: + metabolismRate: 1.0 + effects: + - !type:MovespeedModifier + walkSpeedModifier: 1.5 + sprintSpeedModifier: 1.5 + - !type:MovespeedModifier + walkSpeedModifier: 1.5 + sprintSpeedModifier: 1.5 + - !type:MovespeedModifier + walkSpeedModifier: 1.5 + sprintSpeedModifier: 1.5 + - !type:MovespeedModifier + walkSpeedModifier: 1.5 + sprintSpeedModifier: 1.5 + - !type:HealthChange + conditions: + - !type:ReagentThreshold + min: 80 + damage: + types: + Poison: 20 + - !type:AdjustReagent + conditions: + - !type:ReagentThreshold + reagent: ChloralHydrate + min: 1 + reagent: ChloralHydrate + amount: -10 + - !type:GenericStatusEffect + key: Stun + time: 10 + type: Remove + - !type:GenericStatusEffect + key: KnockedDown + time: 10 + type: Remove + - !type:GenericStatusEffect + key: StaminaModifier + component: StaminaModifier + time: 10 + type: Add + - !type:GenericStatusEffect + key: ForcedSleep + time: 10 + type: Remove + - !type:Jitter + - !type:PopupMessage + visualType: Medium + messages: ["Вы чувствуете как ваше тело наполняется энергией", "Вы чувствуете как начинают болеть ваши мышцы"] + type: Local + probability: 0.05 diff --git a/Resources/Textures/_Sunrise/Effects/atmospherics.rsi/meta.json b/Resources/Textures/_Sunrise/Effects/atmospherics.rsi/meta.json index a3604c29b8..c26aa2aeec 100644 --- a/Resources/Textures/_Sunrise/Effects/atmospherics.rsi/meta.json +++ b/Resources/Textures/_Sunrise/Effects/atmospherics.rsi/meta.json @@ -14,6 +14,10 @@ { "name": "bz", "delays": [[0.1, 0.1, 0.1, 0.1, 0.1]] + }, + { + "name": "nitriumGas", + "delays": [[0.1, 0.1, 0.1, 0.1, 0.1]] } ] } diff --git a/Resources/Textures/_Sunrise/Effects/atmospherics.rsi/nitriumGas.png b/Resources/Textures/_Sunrise/Effects/atmospherics.rsi/nitriumGas.png new file mode 100644 index 0000000000000000000000000000000000000000..bd1d5aff6e415bcc243f7fa3365a8ef19b626387 GIT binary patch literal 4156 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 O0000|3 literal 0 HcmV?d00001