Skip to content

Commit

Permalink
Новые газы, изменения экономики и РТ (#295)
Browse files Browse the repository at this point in the history
<!-- ЭТО ШАБЛОН ВАШЕГО PULL REQUEST. Текст между стрелками - это
комментарии - они не будут видны в PR. -->

## Описание PR
Тут настолько много всего, что мне не описать словами прям-таки
<!-- Ниже опишите ваш Pull Request. Что он изменяет? На что еще это
может повлиять? Постарайтесь описать все внесённые вами изменения! -->

**Медиа**
Когда-то я научусь делать скрины, честно-честно
<!-- Если приемлемо, добавьте скриншоты для демонстрации вашего PR. Если
ваш PR представляет собой визуальное изменение, добавьте
скриншоты, иначе он может быть закрыт. -->

**Проверки**
<!-- Выполнение всех следующих действий, если это приемлемо для вида
изменений сильно ускорит разбор вашего PR -->
- [x] PR полностью завершён и мне не нужна помощь чтобы его закончить.
- [x] Я внимательно просмотрел все свои изменения и багов в них не
нашёл.
- [x] Я запускал локальный сервер со своими изменениями и всё
протестировал.
- [x] Я добавил скриншот/видео демонстрации PR в игре, **или** этот PR
этого не требует.

**Изменения**
<!--
Здесь вы можете написать список изменений, который будет автоматически
добавлен в игру, когда ваш PR будет принят.

В журнал изменений следует помещать только то, что действительно важно
игрокам.

В списке изменений тип значка не является часть предложения, поэтому
явно указывайте - Добавлен, Удалён, Изменён.
плохо: - add: Новый инструмент для инженеров
хорошо: - add: Добавлен новый инструмент для инженеров

Вы можете указать своё имя после символа 🆑 именно оно будет
отображаться в журнале изменений (иначе будет использоваться ваше имя на
GitHub)
Например: 🆑 Ian

-->

🆑 KashRas2
- add: Атмос апдейт vol.1 - добавлено 11 новых газов прямиком из ТГ
стейшн.
- add: Атмос апдейт vol.2 - добавлен универсальный раздатчик труб,
который позволяет дешево печатать трубы.
- add: Разработчикам была добавлена возможность делать вендоматы
бесплатными.
- tweak: Цены в алкомате теперь чуть дороже.
- tweak: РРТ теперь можно найти в шкафах СИ.
- tweak: Утилизационные трубы теперь можно носить в двух руках.
- tweak: Респрайт алкомата, портативного скруббера, воздушной
сигнализации, а также раздатчика баллонов.
- fix: Новакиды вновь дышат в плазме
- fix: Центральное командование наконец-то выплачивает зарплату АВД и
пилоту.

---------

Co-authored-by: KashRas2 <[email protected]>
  • Loading branch information
KashRas2 and KashRas authored Aug 19, 2024
1 parent d1e4f96 commit edb5f88
Show file tree
Hide file tree
Showing 116 changed files with 3,123 additions and 47 deletions.
18 changes: 15 additions & 3 deletions Content.Client/VendingMachines/UI/VendingMachineMenu.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ protected override void Dispose(bool disposing)
/// Populates the list of available items on the vending machine interface
/// and sets icons based on their prototypes
/// </summary>
public void Populate(List<VendingMachineInventoryEntry> inventory, out List<int> filteredInventory, double priceMultiplier, int credits, string? filter = null) //ADT-Economy
public void Populate(EntityUid entityUid, List<VendingMachineInventoryEntry> inventory, out List<int> filteredInventory, double priceMultiplier, int credits, string? filter = null) //ADT-Economy
{
//ADT-Economy-Start
CreditsLabel.Text = Loc.GetString("vending-ui-credits-amount", ("credits", credits));
Expand All @@ -72,6 +72,7 @@ public void Populate(List<VendingMachineInventoryEntry> inventory, out List<int>
return;
OnWithdraw?.Invoke(new VendingMachineWithdrawMessage());
};
var vendComp = _entityManager.GetComponent<VendingMachineComponent>(entityUid); //ADT-Economy
//ADT-Economy-End
filteredInventory = new();

Expand Down Expand Up @@ -99,7 +100,6 @@ public void Populate(List<VendingMachineInventoryEntry> inventory, out List<int>
for (var i = 0; i < inventory.Count; i++)
{
var entry = inventory[i];
var price = (int)(entry.Price * priceMultiplier); //ADT-Economy
var vendingItem = VendingContents[i - filterCount];
vendingItem.Text = string.Empty;
vendingItem.Icon = null;
Expand All @@ -110,6 +110,18 @@ public void Populate(List<VendingMachineInventoryEntry> inventory, out List<int>
_dummies.Add(entry.ID, dummy);
}

//ADT-Economy-Start
var price = 0;
if (!vendComp.AllForFree)
{
price = (int)(entry.Price * priceMultiplier);
}
else
{
price = 0; // Это работает только если заспавненный вендомат уже был с этим значением. Спасибо визардам и их bounduserinterface емае.
}
//ADT-Economy-Start

var itemName = Identity.Name(dummy, _entityManager);
Texture? icon = null;
if (_prototypeManager.TryIndex<EntityPrototype>(entry.ID, out var prototype))
Expand All @@ -129,7 +141,7 @@ public void Populate(List<VendingMachineInventoryEntry> inventory, out List<int>
if (itemName.Length > longestEntry.Length)
longestEntry = itemName;

vendingItem.Text = $" [{price}$] {itemName} [{entry.Amount}]"; //ADT-Economy
vendingItem.Text = $"[{price}$] {itemName} [{entry.Amount}]"; //ADT-Economy
vendingItem.Icon = icon;
filteredInventory.Add(i);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ protected override void Open()
_menu.OnSearchChanged += OnSearchChanged;
_menu.OnWithdraw += SendMessage; //ADT-Economy

_menu.Populate(_cachedInventory, out _cachedFilteredIndex, component.PriceMultiplier, component.Credits); //ADT-Economy
_menu.Populate(Owner, _cachedInventory, out _cachedFilteredIndex, component.PriceMultiplier, component.Credits); //ADT-Economy
}

protected override void UpdateState(BoundUserInterfaceState state)
Expand All @@ -51,7 +51,7 @@ protected override void UpdateState(BoundUserInterfaceState state)

_cachedInventory = newState.Inventory;

_menu?.Populate(_cachedInventory, out _cachedFilteredIndex, newState.PriceMultiplier, newState.Credits); //ADT-Economy
_menu?.Populate(Owner, _cachedInventory, out _cachedFilteredIndex, newState.PriceMultiplier, newState.Credits, _menu.SearchBar.Text); //ADT-Economy
}

private void OnItemSelected(ItemList.ItemListSelectedEventArgs args)
Expand Down Expand Up @@ -85,7 +85,7 @@ private void OnSearchChanged(string? filter)
{
//ADT-Economy-Start
var component = EntMan.GetComponent<VendingMachineComponent>(Owner);
_menu?.Populate(_cachedInventory, out _cachedFilteredIndex, component.PriceMultiplier, component.Credits, filter);
_menu?.Populate(Owner, _cachedInventory, out _cachedFilteredIndex, component.PriceMultiplier, component.Credits, filter);
//ADT-Economy-End
}
}
Expand Down
51 changes: 51 additions & 0 deletions Content.Server/ADT/Atmos/Reactions/BZProductionReaction.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
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 BZProductionReaction : 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 initialNitrousOxide = mixture.GetMoles(Gas.NitrousOxide);
var initialPlasma = mixture.GetMoles(Gas.Plasma);

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

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

if (initialNitrousOxide - bZFormed * 0.4f < 0 || initialPlasma - (0.8f - bZFormed) < 0 || bZFormed <= 0)
return ReactionResult.NoReaction;

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

var amountDecomposed = 0.0f;
var nitrousOxideDecomposedFactor = Math.Max(4.0f * (initialPlasma / (initialNitrousOxide + initialPlasma) - 0.75f), 0);
if (nitrousOxideDecomposedFactor > 0)
{
amountDecomposed = 0.4f * bZFormed * nitrousOxideDecomposedFactor;
mixture.AdjustMoles(Gas.Oxygen, amountDecomposed);
mixture.AdjustMoles(Gas.Nitrogen, 0.5f * amountDecomposed);
}

mixture.AdjustMoles(Gas.BZ, Math.Max(0f, bZFormed * (1.0f - nitrousOxideDecomposedFactor)));
mixture.AdjustMoles(Gas.NitrousOxide, -0.4f * bZFormed);
mixture.AdjustMoles(Gas.Plasma, -0.8f * bZFormed * (1.0f - nitrousOxideDecomposedFactor));

var energyReleased = bZFormed * (Atmospherics.BZFormationEnergy + nitrousOxideDecomposedFactor * (Atmospherics.NitrousOxideDecompositionEnergy - Atmospherics.BZFormationEnergy));

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
@@ -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 HalonOxygenAbsorptionReaction : 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 initialOxygen = mixture.GetMoles(Gas.Oxygen);

var temperature = mixture.Temperature;

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

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

mixture.AdjustMoles(Gas.Halon, -heatEfficiency);
mixture.AdjustMoles(Gas.Oxygen, -heatEfficiency * 20f);
mixture.AdjustMoles(Gas.CarbonDioxide, heatEfficiency * 5f);

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);

return ReactionResult.Reacting;
}
}
40 changes: 40 additions & 0 deletions Content.Server/ADT/Atmos/Reactions/HealiumProductionReaction.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
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 HealiumProductionReaction : 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 initialFrezon = mixture.GetMoles(Gas.Frezon);

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

if (heatEfficiency <= 0 || initialFrezon - heatEfficiency * 2.75f < 0 || initialBZ - heatEfficiency * 0.25f < 0)
return ReactionResult.NoReaction;

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

mixture.AdjustMoles(Gas.Frezon, -heatEfficiency * 2.75f);
mixture.AdjustMoles(Gas.BZ, -heatEfficiency * 0.25f);
mixture.AdjustMoles(Gas.Healium, heatEfficiency * 3);

var energyReleased = heatEfficiency * Atmospherics.HealiumFormationEnergy;

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

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

namespace Content.Server.Atmos.Reactions
{
[UsedImplicitly]
[DataDefinition]
public sealed partial class HydrogenFireReaction : 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 energyReleased = 0f;
var oldHeatCapacity = atmosphereSystem.GetHeatCapacity(mixture, true);
var temperature = mixture.Temperature;
var location = holder as TileAtmosphere;
mixture.ReactionResults[GasReaction.Fire] = 0;

var initialOxygen = mixture.GetMoles(Gas.Oxygen);
var initialHydrogen = mixture.GetMoles(Gas.Hydrogen);

var burnedFuel = Math.Min(initialHydrogen / Atmospherics.FireH2BurnRateDelta, Math.Min(initialOxygen / (Atmospherics.FireH2BurnRateDelta * Atmospherics.H2OxygenFullBurn), Math.Min(initialHydrogen, initialOxygen * 0.5f)));

if (burnedFuel > 0)
{
energyReleased += Atmospherics.FireH2EnergyReleased * burnedFuel;

mixture.AdjustMoles(Gas.WaterVapor, burnedFuel);
mixture.AdjustMoles(Gas.Hydrogen, -burnedFuel);
mixture.AdjustMoles(Gas.Oxygen, -burnedFuel * 0.5f);

mixture.ReactionResults[GasReaction.Fire] += burnedFuel;
}

if (energyReleased > 0)
{
var newHeatCapacity = atmosphereSystem.GetHeatCapacity(mixture, true);
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;
}
}
}
Original file line number Diff line number Diff line change
@@ -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;

[UsedImplicitly]
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 nobFormed = Math.Min((initialNitrogen + initialTritium) * 0.01f, Math.Min(initialTritium * 5f, initialNitrogen * 10f));
if (nobFormed <= 0 || (initialTritium - 5f) * nobFormed < 0 || (initialNitrogen - 10f) * nobFormed < 0)
return ReactionResult.NoReaction;

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

var reductionFactor = Math.Clamp(initialTritium / (initialTritium + initialBZ), 0.001f, 1f);

mixture.AdjustMoles(Gas.Tritium, -5f * nobFormed * reductionFactor);
mixture.AdjustMoles(Gas.Nitrogen, -10f * nobFormed);
mixture.AdjustMoles(Gas.HyperNoblium, nobFormed);

var energyReleased = nobFormed * (Atmospherics.NobliumFormationEnergy / Math.Max(initialBZ, 1));

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

return ReactionResult.Reacting;
}
}
39 changes: 39 additions & 0 deletions Content.Server/ADT/Atmos/Reactions/NitriumDecompositionReaction.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 NitriumDecompositionReaction : 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 initialNitrium = mixture.GetMoles(Gas.Nitrium);

var temperature = mixture.Temperature;
var heatEfficiency = Math.Min(temperature / Atmospherics.NitriumDecompositionTempDivisor, initialNitrium);

if (heatEfficiency <= 0 || initialNitrium - heatEfficiency < 0)
return ReactionResult.NoReaction;

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

mixture.AdjustMoles(Gas.Nitrium, -heatEfficiency);
mixture.AdjustMoles(Gas.Hydrogen, heatEfficiency);
mixture.AdjustMoles(Gas.Nitrogen, heatEfficiency);

var energyReleased = heatEfficiency * Atmospherics.NitriumDecompositionEnergy;

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

return ReactionResult.Reacting;
}
}
41 changes: 41 additions & 0 deletions Content.Server/ADT/Atmos/Reactions/NitriumProductionReaction.cs
Original file line number Diff line number Diff line change
@@ -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;

[UsedImplicitly]
public sealed partial class NitriumProductionReaction : 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 initialTritium = mixture.GetMoles(Gas.Tritium);
var initialNitrogen = mixture.GetMoles(Gas.Nitrogen);
var initialBZ = mixture.GetMoles(Gas.BZ);

var temperature = mixture.Temperature;
var heatEfficiency = Math.Min(temperature / Atmospherics.NitriumFormationTempDivisor, Math.Min(initialTritium, Math.Min(initialNitrogen, initialBZ * 0.05f)));

if (heatEfficiency <= 0 || initialTritium - heatEfficiency < 0 || initialNitrogen - heatEfficiency < 0 || initialBZ - heatEfficiency * 0.05f < 0)
return ReactionResult.NoReaction;

var oldHeatCapacity = atmosphereSystem.GetHeatCapacity(mixture, true);
mixture.AdjustMoles(Gas.Tritium, -heatEfficiency);
mixture.AdjustMoles(Gas.Nitrogen, -heatEfficiency);
mixture.AdjustMoles(Gas.BZ, -heatEfficiency * 0.05f);
mixture.AdjustMoles(Gas.Nitrium, heatEfficiency);

var energyUsed = heatEfficiency * Atmospherics.NitriumFormationEnergy;

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

return ReactionResult.Reacting;
}
}
Loading

0 comments on commit edb5f88

Please sign in to comment.