Fix thermoregulation + rebalance/refactor FlammableComponent (#5406)
Co-authored-by: Paul Ritter <ritter.paul1@googlemail.com> Co-authored-by: Tomeno <tomeno@lulzsec.co.uk>
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Content.Server.Alert;
|
||||
using Content.Server.Atmos.Components;
|
||||
using Content.Server.Stunnable;
|
||||
@@ -25,16 +26,23 @@ namespace Content.Server.Atmos.EntitySystems
|
||||
[Dependency] private readonly AtmosphereSystem _atmosphereSystem = default!;
|
||||
[Dependency] private readonly StunSystem _stunSystem = default!;
|
||||
[Dependency] private readonly TemperatureSystem _temperatureSystem = default!;
|
||||
[Dependency] private readonly DamageableSystem _damageableSystem = default!;
|
||||
|
||||
private const float MinimumFireStacks = -10f;
|
||||
private const float MaximumFireStacks = 20f;
|
||||
private const float UpdateTime = 1f;
|
||||
|
||||
private const float MinIgnitionTemperature = 373.15f;
|
||||
|
||||
private float _timer = 0f;
|
||||
|
||||
private Dictionary<FlammableComponent, float> _fireEvents = new();
|
||||
|
||||
// TODO: Port the rest of Flammable.
|
||||
public override void Initialize()
|
||||
{
|
||||
UpdatesAfter.Add(typeof(AtmosphereSystem));
|
||||
|
||||
SubscribeLocalEvent<FlammableComponent, InteractUsingEvent>(OnInteractUsingEvent);
|
||||
SubscribeLocalEvent<FlammableComponent, StartCollideEvent>(OnCollideEvent);
|
||||
SubscribeLocalEvent<FlammableComponent, IsHotEvent>(OnIsHotEvent);
|
||||
@@ -94,8 +102,13 @@ namespace Content.Server.Atmos.EntitySystems
|
||||
|
||||
private void OnTileFireEvent(EntityUid uid, FlammableComponent flammable, TileFireEvent args)
|
||||
{
|
||||
AdjustFireStacks(uid, 3, flammable);
|
||||
Ignite(uid, flammable);
|
||||
var tempDelta = args.Temperature - MinIgnitionTemperature;
|
||||
|
||||
var maxTemp = 0f;
|
||||
_fireEvents.TryGetValue(flammable, out maxTemp);
|
||||
|
||||
if (tempDelta > maxTemp)
|
||||
_fireEvents[flammable] = tempDelta;
|
||||
}
|
||||
|
||||
public void UpdateAppearance(EntityUid uid, FlammableComponent? flammable = null, AppearanceComponent? appearance = null)
|
||||
@@ -168,13 +181,27 @@ namespace Content.Server.Atmos.EntitySystems
|
||||
flammable.Owner.SpawnTimer(2000, () =>
|
||||
{
|
||||
flammable.Resisting = false;
|
||||
flammable.FireStacks -= 3f;
|
||||
flammable.FireStacks -= 1f;
|
||||
UpdateAppearance(uid, flammable);
|
||||
});
|
||||
}
|
||||
|
||||
public override void Update(float frameTime)
|
||||
{
|
||||
// process all fire events
|
||||
foreach (var (flammable, deltaTemp) in _fireEvents)
|
||||
{
|
||||
// 100 -> 1, 200 -> 2, 400 -> 3...
|
||||
var fireStackMod = Math.Max(MathF.Log2(deltaTemp / 100) + 1, 0);
|
||||
var fireStackDelta = fireStackMod - flammable.FireStacks;
|
||||
if (fireStackDelta > 0)
|
||||
{
|
||||
AdjustFireStacks(flammable.OwnerUid, fireStackDelta, flammable);
|
||||
}
|
||||
Ignite(flammable.OwnerUid, flammable);
|
||||
}
|
||||
_fireEvents.Clear();
|
||||
|
||||
_timer += frameTime;
|
||||
|
||||
if (_timer < UpdateTime)
|
||||
@@ -205,7 +232,11 @@ namespace Content.Server.Atmos.EntitySystems
|
||||
|
||||
if (flammable.FireStacks > 0)
|
||||
{
|
||||
_temperatureSystem.ChangeHeat(uid, 80000 * flammable.FireStacks);
|
||||
// TODO FLAMMABLE: further balancing
|
||||
var damageScale = Math.Min((int)flammable.FireStacks, 5);
|
||||
_temperatureSystem.ChangeHeat(uid, 12500 * damageScale);
|
||||
_damageableSystem.TryChangeDamage(uid, flammable.Damage * damageScale);
|
||||
|
||||
AdjustFireStacks(uid, -0.1f * (flammable.Resisting ? 10f : 1f), flammable);
|
||||
}
|
||||
else
|
||||
|
||||
Reference in New Issue
Block a user