using System; using System.Collections.Generic; using Robust.Shared.Serialization; using Robust.Shared.ViewVariables; namespace Content.Shared.Damage.ResistanceSet { /// /// Set of resistances used by damageable objects. /// Each has a multiplier and flat damage /// reduction value. /// [NetSerializable] [Serializable] public class ResistanceSet { [ViewVariables] private Dictionary _resistances = new(); public ResistanceSet() { foreach (var damageType in (DamageType[]) Enum.GetValues(typeof(DamageType))) { _resistances.Add(damageType, new ResistanceSetSettings(1f, 0)); } } public ResistanceSet(ResistanceSetPrototype data) { ID = data.ID; _resistances = data.Resistances; } public string ID { get; } /// /// 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(DamageType damageType, int amount) { if (amount > 0) // Only apply reduction if it's healing, not damage. { amount -= _resistances[damageType].FlatReduction; if (amount <= 0) { return 0; } } amount = (int) Math.Ceiling(amount * _resistances[damageType].Coefficient); return amount; } } /// /// Settings for a specific damage type in a resistance set. Flat reduction is applied before the coefficient. /// [Serializable, NetSerializable] public struct ResistanceSetSettings { [ViewVariables] public float Coefficient { get; private set; } [ViewVariables] public int FlatReduction { get; private set; } public ResistanceSetSettings(float coefficient, int flatReduction) { Coefficient = coefficient; FlatReduction = flatReduction; } } }