using System; using System.Collections.Generic; using Robust.Shared.IoC; using Robust.Shared.Prototypes; using Robust.Shared.Serialization; using Robust.Shared.ViewVariables; namespace Content.Shared.Damage.Resistances { /// /// Set of resistances used by damageable objects. /// Each has a multiplier and flat damage /// reduction value. /// [Serializable, NetSerializable] public class ResistanceSet { [ViewVariables] public string? ID { get; } = string.Empty; [ViewVariables] public Dictionary Resistances { get; } = new(); public ResistanceSet() { } public ResistanceSet(ResistanceSetPrototype data) { ID = data.ID; Resistances = data.Resistances; } /// /// Adjusts input damage with the resistance set values. /// Only applies reduction if the amount is damage (positive), not /// healing (negative). /// /// Type of damage. /// Incoming amount of damage. public int CalculateDamage(DamageTypePrototype damageType, int amount) { // Do nothing if the damage type is not specified in resistance set. if (!Resistances.TryGetValue(damageType, out var resistance)) { return amount; } if (amount > 0) // Only apply reduction if it's healing, not damage. { amount -= resistance.FlatReduction; if (amount <= 0) { return 0; } } amount = (int) Math.Ceiling(amount * resistance.Coefficient); return amount; } } }