using Content.Shared.Damage; using Content.Shared.Damage.Components; using Content.Shared.Damage.Prototypes; using Content.Shared.FixedPoint; using Content.Shared.Localizations; using Robust.Shared.Prototypes; namespace Content.Shared.EntityEffects.Effects; /// /// Adjust the damages on this entity by specified amounts. /// Amounts are modified by scale. /// /// public sealed partial class HealthChangeEntityEffectSystem : EntityEffectSystem { [Dependency] private readonly Damage.Systems.DamageableSystem _damageable = default!; protected override void Effect(Entity entity, ref EntityEffectEvent args) { var damageSpec = new DamageSpecifier(args.Effect.Damage); damageSpec *= args.Scale; _damageable.TryChangeDamage( entity.AsNullable(), damageSpec, args.Effect.IgnoreResistances, interruptsDoAfters: false); } } /// public sealed partial class HealthChange : EntityEffectBase { /// /// Damage to apply every cycle. Damage Ignores resistances. /// [DataField(required: true)] public DamageSpecifier Damage = default!; [DataField] public bool IgnoreResistances = true; public override string EntityEffectGuidebookText(IPrototypeManager prototype, IEntitySystemManager entSys) { var damages = new List(); var heals = false; var deals = false; var damageSpec = new DamageSpecifier(Damage); var universalReagentDamageModifier = entSys.GetEntitySystem().UniversalReagentDamageModifier; var universalReagentHealModifier = entSys.GetEntitySystem().UniversalReagentHealModifier; damageSpec = entSys.GetEntitySystem().ApplyUniversalAllModifiers(damageSpec); foreach (var (kind, amount) in damageSpec.DamageDict) { var sign = FixedPoint2.Sign(amount); float mod; switch (sign) { case < 0: heals = true; mod = universalReagentHealModifier; break; case > 0: deals = true; mod = universalReagentDamageModifier; break; default: continue; // Don't need to show damage types of 0... } damages.Add( Loc.GetString("health-change-display", ("kind", prototype.Index(kind).LocalizedName), ("amount", MathF.Abs(amount.Float() * mod)), ("deltasign", sign) )); } var healsordeals = heals ? (deals ? "both" : "heals") : (deals ? "deals" : "none"); return Loc.GetString("entity-effect-guidebook-health-change", ("chance", Probability), ("changes", ContentLocalizationManager.FormatList(damages)), ("healsordeals", healsordeals)); } }