Skip to content

Commit

Permalink
[Balance] Atmos. (Rxup#1016)
Browse files Browse the repository at this point in the history
* Atmos changes try one

* Fixes

* Update Content.Server/Backmen/Atmos/Reactions/HalonProductionReaction.cs

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

---------

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
  • Loading branch information
Roudenn and coderabbitai[bot] authored Jan 26, 2025
1 parent 2c659d4 commit 3939e98
Show file tree
Hide file tree
Showing 15 changed files with 297 additions and 52 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,10 @@ public ReactionResult React(GasMixture mixture, IGasMixtureHolder? holder, Atmos
var initialNitrousOxide = mixture.GetMoles(Gas.NitrousOxide);
var initialPlasma = mixture.GetMoles(Gas.Plasma);

var environmentEfficiency = mixture.Volume / mixture.Pressure;
var environmentEfficiency = mixture.Volume / mixture.Pressure * Atmospherics.BZFormationPressurePenalty;
var ratioEfficiency = Math.Min(initialNitrousOxide / initialPlasma, 1);

var bZFormed = Math.Min(0.01f * ratioEfficiency * environmentEfficiency, Math.Min(initialNitrousOxide * 0.4f, initialPlasma * 0.8f));
var bZFormed = Math.Min(ratioEfficiency * environmentEfficiency * 0.5f, Math.Min(initialNitrousOxide * 0.4f, initialPlasma * 0.8f));

if (initialNitrousOxide - bZFormed * 0.4f < 0 || initialPlasma - (0.8f - bZFormed) < 0 || bZFormed <= 0)
return ReactionResult.NoReaction;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
using Content.Server.Atmos.EntitySystems;
using Content.Shared.Atmos;
using Content.Shared.Atmos.Reactions;
using JetBrains.Annotations;

namespace Content.Server.Atmos.Reactions;

[UsedImplicitly]
public sealed partial class HalonFrezonDecompositionReaction : IGasReactionEffect
{
public ReactionResult React(GasMixture mixture, IGasMixtureHolder? holder, AtmosphereSystem atmosphereSystem, float heatScale)
{
var initialHyperNoblium = mixture.GetMoles(Gas.HyperNoblium);
if (initialHyperNoblium >= 5.0f && mixture.Temperature > 20f)
return ReactionResult.NoReaction;

var initialHalon = mixture.GetMoles(Gas.Halon);
var initialFrezon = mixture.GetMoles(Gas.Frezon);

var environmentEfficiency = mixture.Pressure * Atmospherics.HalonFrezonDecompositionPressureBonus / mixture.Volume;
var ratioEfficiency = Math.Min(initialHalon / initialFrezon, 1);

var producedAmount = Math.Min(ratioEfficiency * environmentEfficiency * 2f, Math.Min(initialFrezon * 0.5f, initialHalon * 0.5f));

if (producedAmount <= 0 || initialHalon - producedAmount * 0.5f < 0 || initialFrezon - producedAmount * 0.5f < 0)
return ReactionResult.NoReaction;

var oldHeatCapacity = atmosphereSystem.GetHeatCapacity(mixture, true);
mixture.AdjustMoles(Gas.Halon, -producedAmount * 0.5f);
mixture.AdjustMoles(Gas.Frezon, -producedAmount * 0.5f);
mixture.AdjustMoles(Gas.Helium, producedAmount * 1f);
mixture.AdjustMoles(Gas.CarbonDioxide, producedAmount * 0.25f);
mixture.AdjustMoles(Gas.Hydrogen, producedAmount * 2f);

var energyReleased = producedAmount * Atmospherics.HalonFrezonDecompositionEnergy;

var newHeatCapacity = atmosphereSystem.GetHeatCapacity(mixture, true);
if (newHeatCapacity > Atmospherics.MinimumHeatCapacity)
mixture.Temperature = Math.Max((mixture.Temperature * oldHeatCapacity + energyReleased) / newHeatCapacity, Atmospherics.TCMB);

return ReactionResult.Reacting;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,7 @@ public ReactionResult React(GasMixture mixture, IGasMixtureHolder? holder, Atmos
var initialOxygen = mixture.GetMoles(Gas.Oxygen);

var temperature = mixture.Temperature;

var heatEfficiency = Math.Min(temperature / (Atmospherics.FireMinimumTemperatureToExist * 10f), Math.Min(initialHalon, initialOxygen * 20f));
var heatEfficiency = Math.Min(temperature / (Atmospherics.FireMinimumTemperatureToExist * Atmospherics.HalonOxygenAbsorptionEfficiency), Math.Min(initialHalon, initialOxygen * 20f));
if (heatEfficiency <= 0f || initialHalon - heatEfficiency < 0f || initialOxygen - heatEfficiency * 20f < 0f)
return ReactionResult.NoReaction;

Expand All @@ -32,7 +31,7 @@ public ReactionResult React(GasMixture mixture, IGasMixtureHolder? holder, Atmos
var energyUsed = heatEfficiency * Atmospherics.HalonCombustionEnergy;
var newHeatCapacity = atmosphereSystem.GetHeatCapacity(mixture, true);
if (newHeatCapacity > Atmospherics.MinimumHeatCapacity)
mixture.Temperature = Math.Max((mixture.Temperature * oldHeatCapacity + energyUsed) / newHeatCapacity, Atmospherics.TCMB);
mixture.Temperature = Math.Max((mixture.Temperature * oldHeatCapacity - energyUsed) / newHeatCapacity, Atmospherics.TCMB);

return ReactionResult.Reacting;
}
Expand Down
39 changes: 39 additions & 0 deletions Content.Server/Backmen/Atmos/Reactions/HalonProductionReaction.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
using Content.Server.Atmos.EntitySystems;
using Content.Shared.Atmos;
using Content.Shared.Atmos.Reactions;
using JetBrains.Annotations;

namespace Content.Server.Atmos.Reactions;

[UsedImplicitly]
public sealed partial class HalonProductionReaction : IGasReactionEffect
{
public ReactionResult React(GasMixture mixture, IGasMixtureHolder? holder, AtmosphereSystem atmosphereSystem, float heatScale)
{
var initialHyperNoblium = mixture.GetMoles(Gas.HyperNoblium);
if (initialHyperNoblium >= 5.0f && mixture.Temperature > 20f)
return ReactionResult.NoReaction;

var initialBZ = mixture.GetMoles(Gas.BZ);
var initialTritium = mixture.GetMoles(Gas.Tritium);
var initialHalon = mixture.GetMoles(Gas.Halon);

var producedAmount = Math.Min(Atmospherics.HalonMaxRate, Math.Min(initialTritium * 0.5f, initialBZ * 0.2f));

if (producedAmount <= 0 || initialBZ - producedAmount * 0.2f < 0 || initialTritium - producedAmount * 0.5f < 0 || initialBZ > initialTritium + initialHalon)
return ReactionResult.NoReaction;

var oldHeatCapacity = atmosphereSystem.GetHeatCapacity(mixture, true);

mixture.AdjustMoles(Gas.BZ, -producedAmount * 0.2f);
mixture.AdjustMoles(Gas.Tritium, -producedAmount * 0.5f);
mixture.AdjustMoles(Gas.Halon, producedAmount * 0.7f);

var energyReleased = producedAmount * Atmospherics.HalonFormationEnergy;
var newHeatCapacity = atmosphereSystem.GetHeatCapacity(mixture, true);
if (newHeatCapacity > Atmospherics.MinimumHeatCapacity)
mixture.Temperature = Math.Max((mixture.Temperature * oldHeatCapacity + energyReleased) / newHeatCapacity, Atmospherics.TCMB);

return ReactionResult.Reacting;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ public ReactionResult React(GasMixture mixture, IGasMixtureHolder? holder, Atmos
var initialFrezon = mixture.GetMoles(Gas.Frezon);

var temperature = mixture.Temperature;
var heatEfficiency = Math.Min(temperature * 0.3f, Math.Min(initialFrezon * 2.75f, initialBZ * 0.25f));
var heatEfficiency = Math.Min(temperature * 0.08f, Math.Min(initialFrezon * 2.75f, initialBZ * 0.25f));

if (heatEfficiency <= 0 || initialFrezon - heatEfficiency * 2.75f < 0 || initialBZ - heatEfficiency * 0.25f < 0)
return ReactionResult.NoReaction;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,12 @@ public sealed partial class HyperNobliumProductionReaction : IGasReactionEffect
{
public ReactionResult React(GasMixture mixture, IGasMixtureHolder? holder, AtmosphereSystem atmosphereSystem, float heatScale)
{
var initialHyperNoblium = mixture.GetMoles(Gas.HyperNoblium);
if (initialHyperNoblium >= 5.0f && mixture.Temperature > 20f)
return ReactionResult.NoReaction;

var initialNitrogen = mixture.GetMoles(Gas.Nitrogen);
var initialTritium = mixture.GetMoles(Gas.Tritium);
var initialBZ = mixture.GetMoles(Gas.BZ);
var temperature = mixture.Temperature;

var nobFormed = Math.Min((initialNitrogen + initialTritium) * 0.01f, Math.Min(initialTritium * 5f, initialNitrogen * 10f));
var nobFormed = Math.Min(Atmospherics.NobliumFormationTemperatureBonus * temperature, Math.Min(initialTritium * 5f, initialNitrogen * 10f));
if (nobFormed <= 0 || (initialTritium - 5f) * nobFormed < 0 || (initialNitrogen - 10f) * nobFormed < 0)
return ReactionResult.NoReaction;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,16 +18,16 @@ public ReactionResult React(GasMixture mixture, IGasMixtureHolder? holder, Atmos
var initialOxygen = mixture.GetMoles(Gas.Oxygen);
var initialTritium = mixture.GetMoles(Gas.Tritium);

var producedAmount = Math.Min(Atmospherics.PluoxiumMaxRate, Math.Min(initialCarbonDioxide, Math.Min(initialOxygen * 0.5f, initialTritium * 0.01f)));
var producedAmount = Math.Min(Atmospherics.PluoxiumMaxRate, Math.Min(initialCarbonDioxide, Math.Min(initialOxygen * 0.5f, initialTritium * Atmospherics.PluoxiumTritiumConversion)));

if (producedAmount <= 0 || initialCarbonDioxide - producedAmount < 0 || initialOxygen - producedAmount * 0.5f < 0 || initialTritium - producedAmount * 0.01f < 0)
if (producedAmount <= 0 || initialCarbonDioxide - producedAmount < 0 || initialOxygen - producedAmount * 0.5f < 0 || initialTritium - producedAmount * Atmospherics.PluoxiumTritiumConversion < 0)
return ReactionResult.NoReaction;

mixture.AdjustMoles(Gas.CarbonDioxide, -producedAmount);
mixture.AdjustMoles(Gas.Oxygen, -producedAmount * 0.5f);
mixture.AdjustMoles(Gas.Tritium, -producedAmount * 0.01f);
mixture.AdjustMoles(Gas.Tritium, -producedAmount * Atmospherics.PluoxiumTritiumConversion);
mixture.AdjustMoles(Gas.Pluoxium, producedAmount);
mixture.AdjustMoles(Gas.Hydrogen, producedAmount * 0.01f);
mixture.AdjustMoles(Gas.Hydrogen, producedAmount * Atmospherics.PluoxiumTritiumConversion);

var energyReleased = producedAmount * Atmospherics.PluoxiumFormationEnergy;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,6 @@ public sealed partial class ZaukerProductionReaction : IGasReactionEffect
{
public ReactionResult React(GasMixture mixture, IGasMixtureHolder? holder, AtmosphereSystem atmosphereSystem, float heatScale)
{
var initialHyperNoblium = mixture.GetMoles(Gas.HyperNoblium);
if (initialHyperNoblium >= 5.0f && mixture.Temperature > 20f)
return ReactionResult.NoReaction;

var initialHypernoblium = mixture.GetMoles(Gas.HyperNoblium);
var initialNitrium = mixture.GetMoles(Gas.Nitrium);

Expand Down
109 changes: 96 additions & 13 deletions Content.Shared/Atmos/Atmospherics.cs
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,19 @@ public static class Atmospherics
[Gas.Plasma] = Loc.GetString("gas-plasma-abbreviation"),
[Gas.Tritium] = Loc.GetString("gas-tritium-abbreviation"),
[Gas.WaterVapor] = Loc.GetString("gas-water-vapor-abbreviation"),
// start-backmen: gases
[Gas.BZ] = Loc.GetString("gas-bz-abbreviation"),
[Gas.Pluoxium] = Loc.GetString("gas-pluoxium-abbreviation"),
[Gas.Hydrogen] = Loc.GetString("gas-hydrogen-abbreviation"),
[Gas.Nitrium] = Loc.GetString("gas-nitrium-abbreviation"),
[Gas.Healium] = Loc.GetString("gas-healium-abbreviation"),
[Gas.HyperNoblium] = Loc.GetString("gas-hyper-nobilium-abbreviation"),
[Gas.ProtoNitrate] = Loc.GetString("gas-proto-nitrate-abbreviation"),
[Gas.Zauker] = Loc.GetString("gas-zauker-abbreviation"),
[Gas.Halon] = Loc.GetString("gas-halon-abbreviation"),
[Gas.Helium] = Loc.GetString("gas-helium-abbreviation"),
[Gas.AntiNoblium] = Loc.GetString("gas-anti-nobilium-abbreviation"),
// end-backmen: gases
};

#region Excited Groups
Expand Down Expand Up @@ -341,7 +354,12 @@ public static class Atmospherics
/// <summary>
/// Defines energy released in BZ formation.
/// </summary>
public const float BZFormationEnergy = 80000f;
public const float BZFormationEnergy = 10000f;

/// <summary>
/// Defines the multiplier to penalty high pressure.
/// </summary>
public const float BZFormationPressurePenalty = 0.1f;

/// <summary>
/// Defines energy released in N2O decomposition reaction.
Expand All @@ -351,37 +369,102 @@ public static class Atmospherics
/// <summary>
/// Defines energy released in Pluoxium formation.
/// </summary>
public const float PluoxiumFormationEnergy = 250f;
public const float PluoxiumFormationEnergy = 750f;

/// <summary>
/// The maximum amount of pluoxium that can form per reaction tick.
/// </summary>
public const float PluoxiumMaxRate = 5f;
public const float FireH2EnergyReleased = 2800000f;
public const float PluoxiumMaxRate = 3f;

/// <summary>
/// Amount of tritium that will be converted to Hydrogen during Pluoxium creation.
/// </summary>
public const float PluoxiumTritiumConversion = 0.1f;

/// <summary>
/// Amount of energy consumed during Halon Oxygen Absorption.
/// </summary>
public const float HalonCombustionEnergy = 2500f;

/// <summary>
/// Efficiency for Halon Oxygen Absorption.
/// </summary>
public const float HalonOxygenAbsorptionEfficiency = 2f;

/// <summary>
/// The maximum amount of Halon that can form per reaction tick.
/// </summary>
public const float HalonMaxRate = 4f;

/// <summary>
/// Defines energy released in Halon formation.
/// </summary>
public const float HalonFormationEnergy = 1000f;

/// <summary>
/// Defines energy released in Halon and Frezon decomposition.
/// </summary>
public const float HalonFrezonDecompositionEnergy = 20000f;

/// <summary>
/// Defines the multiplier to penalty high pressure.
/// </summary>
public const float HalonFrezonDecompositionPressureBonus = 10f;

/// <summary>
/// Amount of releasing heat per every mole of Hydrogen.
/// </summary>
public const float FireH2EnergyReleased = 2800e3f; // 10 times stronger than tritium (maybe should be equal instead?)

public const float H2OxygenFullBurn = 10f;

public const float FireH2BurnRateDelta = 2f;
public const float H2MinimumBurnTemperature = T0C + 100f;

public const float NitriumFormationTempDivisor = (T0C + 100f) * 8f;
public const float NitriumFormationEnergy = 100000f;

public const float NitriumDecompositionTempDivisor = (T0C + 100f) * 8f;

/// <summary>
/// Energy released during Nitrium formation.
/// </summary>
public const float NitriumFormationEnergy = 10000f;

/// <summary>
/// Energy released during Nitrium decomposion.
/// </summary>
public const float NitriumDecompositionEnergy = 30000f;
public const float NitriumDecompositionMaxTemp = T0C + 70f;
public const float NobliumFormationEnergy = 20000000f;
public const float ReactionOpperssionThreshold = 5f;
public const float HalonFormationEnergy = 300f;
public const float HalonCombustionEnergy = 2500f;

/// <summary>
/// Energy released during Nobilium formation.
/// Gets lower when more BZ is added.
/// </summary>
public const float NobliumFormationEnergy = 200e3f; // Is actually close to tritium energy release

/// <summary>
/// Scales Nobilium formation speed per lower temperature.
/// </summary>
public const float NobliumFormationTemperatureBonus = 0.08f;

public const float HealiumFormationEnergy = 9000f;

public const float ZaukerFormationEnergy = 5000f;

public const float ZaukerFormationTemperatureScale = 0.000005f;

public const float ZaukerDecompositionMaxRate = 20f;

public const float ZaukerDecompositionEnergy = 460f;
public const float ProtoNitrateTemperatureScale = 0.005f;

public const float ProtoNitrateFormationEnergy = 650f;
public const float ProtoNitrateHydrogenConversionThreshold = 150f;

public const float ProtoNitrateHydrogenConversionMaxRate = 5f;

public const float ProtoNitrateHydrogenConversionEnergy = 2500f;

public const float ProtoNitrateTritiumConversionEnergy = 10000f;

public const float ProtoNitrateBZaseConversionEnergy = 60000f;

#endregion
}

Expand Down
17 changes: 15 additions & 2 deletions Resources/Locale/en-US/atmos/gases.ftl
Original file line number Diff line number Diff line change
@@ -1,10 +1,23 @@
gas-ammonia-abbreviation = NH₃
gas-carbon-dioxide-abbreviation = CO₂
gas-frezon-abbreviation = F
gas-frezon-abbreviation = Fr # backmen change
gas-nitrogen-abbreviation = N₂
gas-nitrous-oxide-abbreviation = N₂O
gas-oxygen-abbreviation = O₂
gas-plasma-abbreviation = P
gas-plasma-abbreviation = Pl # backmen change
gas-tritium-abbreviation = T
gas-water-vapor-abbreviation = H₂O
gas-unknown-abbreviation = X
# backmen gases
gas-bz-abbreviation = Bz
gas-pluoxium-abbreviation = Pu
gas-hydrogen-abbreviation = H₂
gas-nitrium-abbreviation = Ni
gas-healium-abbreviation = Hi
gas-hyper-nobilium-abbreviation = No
gas-proto-nitrate-abbreviation = Pn
gas-zauker-abbreviation = Zk
gas-halon-abbreviation = Hl
gas-helium-abbreviation = He
gas-anti-nobilium-abbreviation = An
17 changes: 15 additions & 2 deletions Resources/Locale/ru-RU/atmos/gases.ftl
Original file line number Diff line number Diff line change
@@ -1,10 +1,23 @@
gas-ammonia-abbreviation = NH₃
gas-carbon-dioxide-abbreviation = CO₂
gas-frezon-abbreviation = F
gas-frezon-abbreviation = Fr # backmen change
gas-nitrogen-abbreviation = N₂
gas-nitrous-oxide-abbreviation = N₂O
gas-oxygen-abbreviation = O₂
gas-plasma-abbreviation = P
gas-plasma-abbreviation = Pl # backmen change
gas-tritium-abbreviation = T
gas-water-vapor-abbreviation = H₂O
gas-unknown-abbreviation = X
# backmen gases
gas-bz-abbreviation = Bz
gas-pluoxium-abbreviation = Pu
gas-hydrogen-abbreviation = H₂
gas-nitrium-abbreviation = Ni
gas-healium-abbreviation = Hi
gas-hyper-nobilium-abbreviation = No
gas-proto-nitrate-abbreviation = Pn
gas-zauker-abbreviation = Zk
gas-halon-abbreviation = Hl
gas-helium-abbreviation = He
gas-anti-nobilium-abbreviation = An
2 changes: 2 additions & 0 deletions Resources/Prototypes/_Backmen/Atmospherics/gases.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@
specificHeat: 15
heatCapacityRatio: 1.4
molarMass: 2
gasOverlaySprite: /Textures/Effects/atmospherics.rsi
gasOverlayState: hydrogen
color: FFFFFF
reagent: Hydrogen
pricePerMole: 5
Expand Down
Loading

0 comments on commit 3939e98

Please sign in to comment.