mirror of
https://github.com/WWhiteDreamProject/wwdpublic.git
synced 2026-04-17 21:48:58 +03:00
# Description I promised I would return to this code when I had gotten down the basics of Calculus, and so I have. This PR reworks Space Wind to be even more efficient, while also making it run significantly smoother. Previously, my last optimization to this system involved replacing the need to take the square root of a large float a few thousand times per tick by adding an early exit, cleverly rearranging the math so that it multiplies a few times instead of square rooting, and changing it to use the throwing system. That is no longer necessary, it now operates on the Derivative of said function with respect to time. It's no longer necessary to square anything. This new space wind is significantly smoother than before. <details><summary><h1>Media</h1></summary> <p> Final refinements of V3 courtesy of review by Mu Alpha Theta. https://github.com/user-attachments/assets/a48d43ae-7b79-4d83-81d5-028dd4e8c6c3 </p> </details> # Changelog 🆑 - add: Added Space Wind Version 3. Smoother motion, better performance. - add: Monstermos rip tiles has returned as a default CVar. - tweak: Floor Tiles once again are embeddable projectiles. (cherry picked from commit a8cb5a9703df0b38a3fefa87aca1ee24e7c9aba8)
71 lines
4.7 KiB
C#
71 lines
4.7 KiB
C#
using Content.Shared.CCVar;
|
|
using Robust.Shared.Configuration;
|
|
|
|
namespace Content.Server.Atmos.EntitySystems
|
|
{
|
|
public sealed partial class AtmosphereSystem
|
|
{
|
|
[Dependency] private readonly IConfigurationManager _cfg = default!;
|
|
|
|
public bool SpaceWind { get; private set; }
|
|
public float SpaceWindPressureForceDivisorThrow { get; private set; }
|
|
public float SpaceWindPressureForceDivisorPush { get; private set; }
|
|
public float SpaceWindMaxVelocity { get; private set; }
|
|
public float SpaceWindMaxPushForce { get; private set; }
|
|
public float SpaceWindMinimumCalculatedMass { get; private set; }
|
|
public float SpaceWindMaximumCalculatedInverseMass { get; private set; }
|
|
public bool MonstermosUseExpensiveAirflow { get; private set; }
|
|
public bool MonstermosEqualization { get; private set; }
|
|
public bool MonstermosDepressurization { get; private set; }
|
|
public bool MonstermosRipTiles { get; private set; }
|
|
public float MonstermosRipTilesMinimumPressure { get; private set; }
|
|
public bool GridImpulse { get; private set; }
|
|
public float SpacingEscapeRatio { get; private set; }
|
|
public float SpacingMinGas { get; private set; }
|
|
public float SpacingMaxWind { get; private set; }
|
|
public bool Superconduction { get; private set; }
|
|
public bool ExcitedGroups { get; private set; }
|
|
public bool ExcitedGroupsSpaceIsAllConsuming { get; private set; }
|
|
public float AtmosMaxProcessTime { get; private set; }
|
|
public float AtmosTickRate { get; private set; }
|
|
public float Speedup { get; private set; }
|
|
public float HeatScale { get; private set; }
|
|
public float HumanoidThrowMultiplier { get; private set; }
|
|
|
|
/// <summary>
|
|
/// Time between each atmos sub-update. If you are writing an atmos device, use AtmosDeviceUpdateEvent.dt
|
|
/// instead of this value, because atmos devices do not update each are sub-update and sometimes are skipped to
|
|
/// meet the tick deadline.
|
|
/// </summary>
|
|
public float AtmosTime => 1f / AtmosTickRate;
|
|
|
|
private void InitializeCVars()
|
|
{
|
|
Subs.CVar(_cfg, CCVars.SpaceWind, value => SpaceWind = value, true);
|
|
Subs.CVar(_cfg, CCVars.SpaceWindPressureForceDivisorThrow, value => SpaceWindPressureForceDivisorThrow = value, true);
|
|
Subs.CVar(_cfg, CCVars.SpaceWindPressureForceDivisorPush, value => SpaceWindPressureForceDivisorPush = value, true);
|
|
Subs.CVar(_cfg, CCVars.SpaceWindMaxVelocity, value => SpaceWindMaxVelocity = value, true);
|
|
Subs.CVar(_cfg, CCVars.SpaceWindMaxPushForce, value => SpaceWindMaxPushForce = value, true);
|
|
Subs.CVar(_cfg, CCVars.SpaceWindMinimumCalculatedMass, value => SpaceWindMinimumCalculatedMass = value, true);
|
|
Subs.CVar(_cfg, CCVars.SpaceWindMaximumCalculatedInverseMass, value => SpaceWindMaximumCalculatedInverseMass = value, true);
|
|
Subs.CVar(_cfg, CCVars.MonstermosUseExpensiveAirflow, value => MonstermosUseExpensiveAirflow = value, true);
|
|
Subs.CVar(_cfg, CCVars.MonstermosEqualization, value => MonstermosEqualization = value, true);
|
|
Subs.CVar(_cfg, CCVars.MonstermosDepressurization, value => MonstermosDepressurization = value, true);
|
|
Subs.CVar(_cfg, CCVars.MonstermosRipTiles, value => MonstermosRipTiles = value, true);
|
|
Subs.CVar(_cfg, CCVars.MonstermosRipTilesMinimumPressure, value => MonstermosRipTilesMinimumPressure = value, true);
|
|
Subs.CVar(_cfg, CCVars.AtmosGridImpulse, value => GridImpulse = value, true);
|
|
Subs.CVar(_cfg, CCVars.AtmosSpacingEscapeRatio, value => SpacingEscapeRatio = value, true);
|
|
Subs.CVar(_cfg, CCVars.AtmosSpacingMinGas, value => SpacingMinGas = value, true);
|
|
Subs.CVar(_cfg, CCVars.AtmosSpacingMaxWind, value => SpacingMaxWind = value, true);
|
|
Subs.CVar(_cfg, CCVars.Superconduction, value => Superconduction = value, true);
|
|
Subs.CVar(_cfg, CCVars.AtmosMaxProcessTime, value => AtmosMaxProcessTime = value, true);
|
|
Subs.CVar(_cfg, CCVars.AtmosTickRate, value => AtmosTickRate = value, true);
|
|
Subs.CVar(_cfg, CCVars.AtmosSpeedup, value => Speedup = value, true);
|
|
Subs.CVar(_cfg, CCVars.AtmosHeatScale, value => { HeatScale = value; InitializeGases(); }, true);
|
|
Subs.CVar(_cfg, CCVars.ExcitedGroups, value => ExcitedGroups = value, true);
|
|
Subs.CVar(_cfg, CCVars.ExcitedGroupsSpaceIsAllConsuming, value => ExcitedGroupsSpaceIsAllConsuming = value, true);
|
|
Subs.CVar(_cfg, CCVars.AtmosHumanoidThrowMultiplier, value => HumanoidThrowMultiplier = value, true);
|
|
}
|
|
}
|
|
}
|