Files

84 lines
2.8 KiB
C#
Raw Permalink Normal View History

using Content.Server.Revenant.Components;
2022-08-13 09:49:41 -04:00
using Content.Shared.Examine;
using Content.Shared.Mind.Components;
using Content.Shared.Mobs;
using Content.Shared.Mobs.Components;
using Content.Shared.Revenant.Components;
2022-08-13 09:49:41 -04:00
using Robust.Shared.Random;
namespace Content.Server.Revenant.EntitySystems;
/// <summary>
/// Attached to entities when a revenant drains them in order to
/// manage their essence.
/// </summary>
public sealed class EssenceSystem : EntitySystem
{
[Dependency] private readonly IRobustRandom _random = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<EssenceComponent, ComponentStartup>(OnEssenceEventReceived);
SubscribeLocalEvent<EssenceComponent, MobStateChangedEvent>(OnMobstateChanged);
SubscribeLocalEvent<EssenceComponent, MindAddedMessage>(OnEssenceEventReceived);
SubscribeLocalEvent<EssenceComponent, MindRemovedMessage>(OnEssenceEventReceived);
2022-08-13 09:49:41 -04:00
SubscribeLocalEvent<EssenceComponent, ExaminedEvent>(OnExamine);
}
private void OnMobstateChanged(EntityUid uid, EssenceComponent component, MobStateChangedEvent args)
{
UpdateEssenceAmount(uid, component);
}
2022-08-13 09:49:41 -04:00
private void OnExamine(EntityUid uid, EssenceComponent component, ExaminedEvent args)
{
if (!component.SearchComplete || !HasComp<RevenantComponent>(args.Examiner))
return;
string message;
switch (component.EssenceAmount)
{
case <= 45:
message = "revenant-soul-yield-low";
break;
case >= 90:
message = "revenant-soul-yield-high";
break;
default:
message = "revenant-soul-yield-average";
break;
}
args.PushMarkup(Loc.GetString(message, ("target", uid)));
}
private void OnEssenceEventReceived(EntityUid uid, EssenceComponent component, EntityEventArgs args)
{
UpdateEssenceAmount(uid, component);
}
private void UpdateEssenceAmount(EntityUid uid, EssenceComponent component)
2022-08-13 09:49:41 -04:00
{
if (!TryComp<MobStateComponent>(uid, out var mob))
return;
switch (mob.CurrentState)
{
case MobState.Alive:
2023-06-18 11:33:19 -07:00
if (TryComp<MindContainerComponent>(uid, out var mind) && mind.Mind != null)
2022-08-13 09:49:41 -04:00
component.EssenceAmount = _random.NextFloat(75f, 100f);
else
component.EssenceAmount = _random.NextFloat(45f, 70f);
break;
case MobState.Critical:
2022-08-13 09:49:41 -04:00
component.EssenceAmount = _random.NextFloat(35f, 50f);
break;
case MobState.Dead:
2022-08-13 09:49:41 -04:00
component.EssenceAmount = _random.NextFloat(15f, 20f);
break;
}
}
}