using Content.Shared.Damage;
using Content.Shared.Damage.Systems;
using Content.Shared.Xenoarchaeology.Artifact.Components;
using Content.Shared.Xenoarchaeology.Artifact.XAT.Components;
using Robust.Shared.Prototypes;
namespace Content.Shared.Xenoarchaeology.Artifact.XAT;
///
/// System for xeno artifact trigger that requires certain damage to be applied to artifact within a timeframe.
///
public sealed class XATDamageThresholdReachedSystem : BaseXATSystem
{
[Dependency] private readonly IPrototypeManager _prototype = default!;
///
public override void Initialize()
{
base.Initialize();
XATSubscribeDirectEvent(OnDamageChanged);
}
private void OnDamageChanged(Entity artifact, Entity node, ref DamageChangedEvent args)
{
if (!args.DamageIncreased || args.DamageDelta == null || args.Origin == artifact.Owner)
return;
var damageTriggerComponent = node.Comp1;
if (Timing.IsFirstTimePredicted)
damageTriggerComponent.AccumulatedDamage += args.DamageDelta;
foreach (var (type, needed) in damageTriggerComponent.TypesNeeded)
{
if (damageTriggerComponent.AccumulatedDamage.DamageDict.GetValueOrDefault(type) >= needed)
{
InvokeTrigger(artifact, node);
return; // intentional. Do not continue checks
}
}
foreach (var (group, needed) in damageTriggerComponent.GroupsNeeded)
{
var damageGroupPrototype = _prototype.Index(group);
if (!damageTriggerComponent.AccumulatedDamage.TryGetDamageInGroup(damageGroupPrototype, out var damage))
continue;
if (damage >= needed)
{
InvokeTrigger(artifact, node);
return; // intentional. Do not continue checks
}
}
}
private void InvokeTrigger(
Entity artifact,
Entity node
)
{
var damageTriggerComponent = node.Comp1;
damageTriggerComponent.AccumulatedDamage.DamageDict.Clear();
Dirty(node, damageTriggerComponent);
Trigger(artifact, node);
}
}