Files
tbd-station-14/Content.Shared/Atmos/Atmospherics.cs
Errant 02b06cce39 Reduce gas and jetpack capacity (#18288)
Emergency tank: 4 minutes (down from 12)
Extended Etank: 9 minutes (down from 37)
Double Etank : 15 minutes (down from 62)
Full tank : 31 minutes (down from 94)

This will make it so EVA crews actually need to watch their pressure if they spend significant time outside the station, and/or have a canister in their general vicinity.

Emergency tanks can no longer be used on timescales that far exceed escaping an emergency situation, but will probably be insufficient in extended emergencies, where access to canisters will now be much more important. How well this works in practice will have to be carefully watched.
2023-08-04 14:40:41 -08:00

351 lines
13 KiB
C#

using Robust.Shared.Serialization;
// ReSharper disable InconsistentNaming
namespace Content.Shared.Atmos
{
/// <summary>
/// Class to store atmos constants.
/// </summary>
public static class Atmospherics
{
static Atmospherics()
{
AdjustedNumberOfGases = MathHelper.NextMultipleOf(TotalNumberOfGases, 4);
}
#region ATMOS
/// <summary>
/// The universal gas constant, in kPa*L/(K*mol)
/// </summary>
public const float R = 8.314462618f;
/// <summary>
/// 1 ATM in kPA.
/// </summary>
public const float OneAtmosphere = 101.325f;
/// <summary>
/// Maximum external pressure (in kPA) a gas miner will, by default, output to.
/// This is used to initialize roundstart atmos rooms.
/// </summary>
public const float GasMinerDefaultMaxExternalPressure = 6500f;
/// <summary>
/// -270.3ºC in K. CMB stands for Cosmic Microwave Background.
/// </summary>
public const float TCMB = 2.7f;
/// <summary>
/// 0ºC in K
/// </summary>
public const float T0C = 273.15f;
/// <summary>
/// 20ºC in K
/// </summary>
public const float T20C = 293.15f;
/// <summary>
/// Liters in a cell.
/// </summary>
public const float CellVolume = 2500f;
// Liters in a normal breath
public const float BreathVolume = 0.5f;
// Amount of air to take from a tile
public const float BreathPercentage = BreathVolume / CellVolume;
/// <summary>
/// Moles in a 2.5 m^3 cell at 101.325 kPa and 20ºC
/// </summary>
public const float MolesCellStandard = (OneAtmosphere * CellVolume / (T20C * R));
/// <summary>
/// Moles in a 2.5 m^3 cell at GasMinerDefaultMaxExternalPressure kPa and 20ºC
/// </summary>
public const float MolesCellGasMiner = (GasMinerDefaultMaxExternalPressure * CellVolume / (T20C * R));
/// <summary>
/// Compared against for superconduction.
/// </summary>
public const float MCellWithRatio = (MolesCellStandard * 0.005f);
public const float OxygenStandard = 0.21f;
public const float NitrogenStandard = 0.79f;
public const float OxygenMolesStandard = MolesCellStandard * OxygenStandard;
public const float NitrogenMolesStandard = MolesCellStandard * NitrogenStandard;
#endregion
/// <summary>
/// Visible moles multiplied by this factor to get moles at which gas is at max visibility.
/// </summary>
public const float FactorGasVisibleMax = 20f;
/// <summary>
/// Minimum number of moles a gas can have.
/// </summary>
public const float GasMinMoles = 0.00000005f;
public const float OpenHeatTransferCoefficient = 0.4f;
/// <summary>
/// Hack to make vacuums cold, sacrificing realism for gameplay.
/// </summary>
public const float HeatCapacityVacuum = 7000f;
/// <summary>
/// Ratio of air that must move to/from a tile to reset group processing
/// </summary>
public const float MinimumAirRatioToSuspend = 0.1f;
/// <summary>
/// Minimum ratio of air that must move to/from a tile
/// </summary>
public const float MinimumAirRatioToMove = 0.001f;
/// <summary>
/// Minimum amount of air that has to move before a group processing can be suspended
/// </summary>
public const float MinimumAirToSuspend = (MolesCellStandard * MinimumAirRatioToSuspend);
public const float MinimumTemperatureToMove = (T20C + 100f);
public const float MinimumMolesDeltaToMove = (MolesCellStandard * MinimumAirRatioToMove);
/// <summary>
/// Minimum temperature difference before group processing is suspended
/// </summary>
public const float MinimumTemperatureDeltaToSuspend = 4.0f;
/// <summary>
/// Minimum temperature difference before the gas temperatures are just set to be equal.
/// </summary>
public const float MinimumTemperatureDeltaToConsider = 0.5f;
/// <summary>
/// Minimum temperature for starting superconduction.
/// </summary>
public const float MinimumTemperatureStartSuperConduction = (T20C + 400f);
public const float MinimumTemperatureForSuperconduction = (T20C + 80f);
/// <summary>
/// Minimum heat capacity.
/// </summary>
public const float MinimumHeatCapacity = 0.0003f;
/// <summary>
/// For the purposes of making space "colder"
/// </summary>
public const float SpaceHeatCapacity = 7000f;
#region Excited Groups
/// <summary>
/// Number of full atmos updates ticks before an excited group breaks down (averages gas contents across turfs)
/// </summary>
public const int ExcitedGroupBreakdownCycles = 4;
/// <summary>
/// Number of full atmos updates before an excited group dismantles and removes its turfs from active
/// </summary>
public const int ExcitedGroupsDismantleCycles = 16;
#endregion
/// <summary>
/// Hard limit for zone-based tile equalization.
/// </summary>
public const int MonstermosHardTileLimit = 2000;
/// <summary>
/// Limit for zone-based tile equalization.
/// </summary>
public const int MonstermosTileLimit = 200;
/// <summary>
/// Total number of gases. Increase this if you want to add more!
/// </summary>
public const int TotalNumberOfGases = 9;
/// <summary>
/// This is the actual length of the gases arrays in mixtures.
/// Set to the closest multiple of 4 relative to <see cref="TotalNumberOfGases"/> for SIMD reasons.
/// </summary>
public static readonly int AdjustedNumberOfGases;
/// <summary>
/// Amount of heat released per mole of burnt hydrogen or tritium (hydrogen isotope)
/// </summary>
public const float FireHydrogenEnergyReleased = 560000f;
public const float FireMinimumTemperatureToExist = T0C + 100f;
public const float FireMinimumTemperatureToSpread = T0C + 150f;
public const float FireSpreadRadiosityScale = 0.85f;
public const float FirePlasmaEnergyReleased = 3000000f;
public const float FireGrowthRate = 40000f;
public const float SuperSaturationThreshold = 96f;
public const float SuperSaturationEnds = SuperSaturationThreshold / 3;
public const float OxygenBurnRateBase = 1.4f;
public const float PlasmaMinimumBurnTemperature = (100f+T0C);
public const float PlasmaUpperTemperature = (1370f+T0C);
public const float PlasmaOxygenFullburn = 10f;
public const float PlasmaBurnRateDelta = 9f;
/// <summary>
/// This is calculated to help prevent singlecap bombs (Overpowered tritium/oxygen single tank bombs)
/// </summary>
public const float MinimumTritiumOxyburnEnergy = 143000f;
public const float TritiumBurnOxyFactor = 100f;
public const float TritiumBurnTritFactor = 10f;
public const float FrezonCoolLowerTemperature = 23.15f;
/// <summary>
/// Frezon cools better at higher temperatures.
/// </summary>
public const float FrezonCoolMidTemperature = 373.15f;
public const float FrezonCoolMaximumEnergyModifier = 10f;
/// <summary>
/// Remove X mol of nitrogen for each mol of frezon.
/// </summary>
public const float FrezonNitrogenCoolRatio = 5;
public const float FrezonCoolEnergyReleased = -3000000f;
public const float FrezonCoolRateModifier = 20f;
public const float FrezonProductionMaxEfficiencyTemperature = 73.15f;
/// <summary>
/// 1 mol of N2 is required per X mol of tritium and oxygen.
/// </summary>
public const float FrezonProductionNitrogenRatio = 10f;
/// <summary>
/// 1 mol of Tritium is required per X mol of oxygen.
/// </summary>
public const float FrezonProductionTritRatio = 50.0f;
/// <summary>
/// 1 / X of the tritium is converted into Frezon each tick
/// </summary>
public const float FrezonProductionConversionRate = 50f;
/// <summary>
/// How many mol of frezon can be converted into miasma in one cycle.
/// </summary>
public const float MiasmicSubsumationMaxConversionRate = 5f;
/// <summary>
/// Determines at what pressure the ultra-high pressure red icon is displayed.
/// </summary>
public const float HazardHighPressure = 550f;
/// <summary>
/// Determines when the orange pressure icon is displayed.
/// </summary>
public const float WarningHighPressure = 0.7f * HazardHighPressure;
/// <summary>
/// Determines when the gray low pressure icon is displayed.
/// </summary>
public const float WarningLowPressure = 2.5f * HazardLowPressure;
/// <summary>
/// Determines when the black ultra-low pressure icon is displayed.
/// </summary>
public const float HazardLowPressure = 20f;
/// <summary>
/// The amount of pressure damage someone takes is equal to (pressure / HAZARD_HIGH_PRESSURE)*PRESSURE_DAMAGE_COEFFICIENT,
/// with the maximum of MaxHighPressureDamage.
/// </summary>
public const float PressureDamageCoefficient = 4;
/// <summary>
/// Maximum amount of damage that can be endured with high pressure.
/// </summary>
public const int MaxHighPressureDamage = 4;
/// <summary>
/// The amount of damage someone takes when in a low pressure area
/// (The pressure threshold is so low that it doesn't make sense to do any calculations,
/// so it just applies this flat value).
/// </summary>
public const int LowPressureDamage = 4;
public const float WindowHeatTransferCoefficient = 0.1f;
/// <summary>
/// Directions that atmos currently supports. Modify in case of multi-z.
/// See <see cref="AtmosDirection"/> on the server.
/// </summary>
public const int Directions = 4;
/// <summary>
/// The normal body temperature in degrees Celsius.
/// </summary>
public const float NormalBodyTemperature = 37f;
/// <summary>
/// I hereby decree. This is Arbitrary Suck my Dick
/// </summary>
public const float BreathMolesToReagentMultiplier = 1144;
#region Pipes
/// <summary>
/// The default pressure at which pumps and powered equipment max out at, in kPa.
/// </summary>
public const float MaxOutputPressure = 4500;
/// <summary>
/// The default maximum speed powered equipment can work at, in L/s.
/// </summary>
public const float MaxTransferRate = 200;
/// <summary>
/// What fraction of air from a spaced tile escapes every tick.
/// 1.0 for instant spacing, 0.2 means 20% of remaining air lost each time
/// </summary>
public const float SpacingEscapeRatio = 0.05f;
/// <summary>
/// Minimum amount of air allowed on a spaced tile before it is reset to 0 immediately in kPa
/// Since the decay due to SpacingEscapeRatio follows a curve, it would never reach 0.0 exactly
/// unless we truncate it somewhere.
/// </summary>
public const float SpacingMinGas = 2.0f;
/// <summary>
/// How much wind can go through a single tile before that tile doesn't depressurize itself
/// (I.e spacing is limited in large rooms heading into smaller spaces)
/// </summary>
public const float SpacingMaxWind = 500.0f;
#endregion
}
/// <summary>
/// Gases to Ids. Keep these updated with the prototypes!
/// </summary>
[Serializable, NetSerializable]
public enum Gas : sbyte
{
Oxygen = 0,
Nitrogen = 1,
CarbonDioxide = 2,
Plasma = 3,
Tritium = 4,
WaterVapor = 5,
Miasma = 6,
NitrousOxide = 7,
Frezon = 8
}
}