private void Spark() { if (RobustRandom.NextFloat() <= SparkChance) { if (!_foundTile || _targetGrid == default || (!EntityManager.EntityExists(_targetGrid) ? EntityLifeStage.Deleted : EntityManager.GetComponent <MetaDataComponent>(_targetGrid).EntityLifeStage) >= EntityLifeStage.Deleted || !_atmosphere.IsSimulatedGrid(_targetGrid)) { return; } // Don't want it to be so obnoxious as to instantly murder anyone in the area but enough that // it COULD start potentially start a bigger fire. _atmosphere.HotspotExpose(_targetGrid, _targetTile, 700f, 50f, true); SoundSystem.Play("/Audio/Effects/sparks4.ogg", Filter.Pvs(_targetCoords), _targetCoords); } }
public ReactionResult React(GasMixture mixture, IGasMixtureHolder?holder, AtmosphereSystem atmosphereSystem) { var energyReleased = 0f; var oldHeatCapacity = atmosphereSystem.GetHeatCapacity(mixture); var temperature = mixture.Temperature; var location = holder as TileAtmosphere; mixture.ReactionResults[GasReaction.Fire] = 0; // More plasma released at higher temperatures. var temperatureScale = 0f; if (temperature > Atmospherics.PlasmaUpperTemperature) { temperatureScale = 1f; } else { temperatureScale = (temperature - Atmospherics.PlasmaMinimumBurnTemperature) / (Atmospherics.PlasmaUpperTemperature - Atmospherics.PlasmaMinimumBurnTemperature); } if (temperatureScale > 0) { var oxygenBurnRate = Atmospherics.OxygenBurnRateBase - temperatureScale; var plasmaBurnRate = 0f; var initialOxygenMoles = mixture.GetMoles(Gas.Oxygen); var initialPlasmaMoles = mixture.GetMoles(Gas.Plasma); // Supersaturation makes tritium. var supersaturation = initialOxygenMoles / initialPlasmaMoles > Atmospherics.SuperSaturationThreshold; if (initialOxygenMoles > initialPlasmaMoles * Atmospherics.PlasmaOxygenFullburn) { plasmaBurnRate = initialPlasmaMoles * temperatureScale / Atmospherics.PlasmaBurnRateDelta; } else { plasmaBurnRate = temperatureScale * (initialOxygenMoles / Atmospherics.PlasmaOxygenFullburn) / Atmospherics.PlasmaBurnRateDelta; } if (plasmaBurnRate > Atmospherics.MinimumHeatCapacity) { plasmaBurnRate = MathF.Min(plasmaBurnRate, MathF.Min(initialPlasmaMoles, initialOxygenMoles / oxygenBurnRate)); mixture.SetMoles(Gas.Plasma, initialPlasmaMoles - plasmaBurnRate); mixture.SetMoles(Gas.Oxygen, initialOxygenMoles - plasmaBurnRate * oxygenBurnRate); mixture.AdjustMoles(supersaturation ? Gas.Tritium : Gas.CarbonDioxide, plasmaBurnRate); energyReleased += Atmospherics.FirePlasmaEnergyReleased * plasmaBurnRate; mixture.ReactionResults[GasReaction.Fire] += plasmaBurnRate * (1 + oxygenBurnRate); } } if (energyReleased > 0) { var newHeatCapacity = atmosphereSystem.GetHeatCapacity(mixture); if (newHeatCapacity > Atmospherics.MinimumHeatCapacity) { mixture.Temperature = (temperature * oldHeatCapacity + energyReleased) / newHeatCapacity; } } if (location != null) { var mixTemperature = mixture.Temperature; if (mixTemperature > Atmospherics.FireMinimumTemperatureToExist) { atmosphereSystem.HotspotExpose(location.GridIndex, location.GridIndices, mixTemperature, mixture.Volume); } } return(mixture.ReactionResults[GasReaction.Fire] != 0 ? ReactionResult.Reacting : ReactionResult.NoReaction); }
public ReactionResult React(GasMixture mixture, IGasMixtureHolder?holder, AtmosphereSystem atmosphereSystem) { var energyReleased = 0f; var oldHeatCapacity = atmosphereSystem.GetHeatCapacity(mixture); var temperature = mixture.Temperature; var location = holder as TileAtmosphere; mixture.ReactionResults[GasReaction.Fire] = 0f; var burnedFuel = 0f; var initialTrit = mixture.GetMoles(Gas.Tritium); if (mixture.GetMoles(Gas.Oxygen) < initialTrit || Atmospherics.MinimumTritiumOxyburnEnergy > (temperature * oldHeatCapacity)) { burnedFuel = mixture.GetMoles(Gas.Oxygen) / Atmospherics.TritiumBurnOxyFactor; if (burnedFuel > initialTrit) { burnedFuel = initialTrit; } mixture.AdjustMoles(Gas.Tritium, -burnedFuel); } else { burnedFuel = initialTrit; mixture.SetMoles(Gas.Tritium, mixture.GetMoles(Gas.Tritium) * (1 - 1 / Atmospherics.TritiumBurnTritFactor)); mixture.AdjustMoles(Gas.Oxygen, -mixture.GetMoles(Gas.Tritium)); energyReleased += (Atmospherics.FireHydrogenEnergyReleased * burnedFuel * (Atmospherics.TritiumBurnTritFactor - 1)); } if (burnedFuel > 0) { energyReleased += (Atmospherics.FireHydrogenEnergyReleased * burnedFuel); // TODO ATMOS Radiation pulse here! // Conservation of mass is important. mixture.AdjustMoles(Gas.WaterVapor, burnedFuel); mixture.ReactionResults[GasReaction.Fire] += burnedFuel; } if (energyReleased > 0) { var newHeatCapacity = atmosphereSystem.GetHeatCapacity(mixture); if (newHeatCapacity > Atmospherics.MinimumHeatCapacity) { mixture.Temperature = ((temperature * oldHeatCapacity + energyReleased) / newHeatCapacity); } } if (location != null) { temperature = mixture.Temperature; if (temperature > Atmospherics.FireMinimumTemperatureToExist) { atmosphereSystem.HotspotExpose(location.GridIndex, location.GridIndices, temperature, mixture.Volume); } } return(mixture.ReactionResults[GasReaction.Fire] != 0 ? ReactionResult.Reacting : ReactionResult.NoReaction); }