diff --git a/Content.Shared/Damage/DamageClass.cs b/Content.Shared/Damage/DamageClass.cs index 55e6a47045..0801728f39 100644 --- a/Content.Shared/Damage/DamageClass.cs +++ b/Content.Shared/Damage/DamageClass.cs @@ -2,6 +2,8 @@ using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; +using Content.Shared.GameObjects.EntitySystems; +using Robust.Shared.GameObjects.Systems; using Robust.Shared.Serialization; namespace Content.Shared.Damage @@ -18,27 +20,21 @@ namespace Content.Shared.Damage public static class DamageClassExtensions { - // TODO DAMAGE This but not hardcoded - private static readonly ImmutableDictionary> ClassToType = - new Dictionary> - { - {DamageClass.Brute, new List {DamageType.Blunt, DamageType.Slash, DamageType.Piercing}}, - {DamageClass.Burn, new List {DamageType.Heat, DamageType.Shock, DamageType.Cold}}, - {DamageClass.Toxin, new List {DamageType.Poison, DamageType.Radiation}}, - {DamageClass.Airloss, new List {DamageType.Asphyxiation, DamageType.Bloodloss}}, - {DamageClass.Genetic, new List {DamageType.Cellular}} - }.ToImmutableDictionary(); - - public static List ToTypes(this DamageClass @class) + public static ImmutableList ToTypes(this DamageClass @class) { - return ClassToType[@class]; + return DamageSystem.ClassToType[@class]; } - public static Dictionary ToDictionary() + public static Dictionary ToNewDictionary() { return Enum.GetValues(typeof(DamageClass)) .Cast() - .ToDictionary(@class => @class, type => 0); + .ToDictionary(@class => @class, _ => default(T)); + } + + public static Dictionary ToNewDictionary() + { + return ToNewDictionary(); } } } diff --git a/Content.Shared/Damage/DamageType.cs b/Content.Shared/Damage/DamageType.cs index 6b139e2569..a16bc2794a 100644 --- a/Content.Shared/Damage/DamageType.cs +++ b/Content.Shared/Damage/DamageType.cs @@ -1,7 +1,8 @@ using System; using System.Collections.Generic; -using System.Collections.Immutable; using System.Linq; +using Content.Shared.GameObjects.EntitySystems; +using Robust.Shared.GameObjects.Systems; using Robust.Shared.Serialization; namespace Content.Shared.Damage @@ -24,38 +25,26 @@ namespace Content.Shared.Damage public static class DamageTypeExtensions { - // TODO: Automatically generate this - private static readonly ImmutableDictionary TypeToClass = - new Dictionary - { - {DamageType.Blunt, DamageClass.Brute}, - {DamageType.Slash, DamageClass.Brute}, - {DamageType.Piercing, DamageClass.Brute}, - {DamageType.Heat, DamageClass.Burn}, - {DamageType.Shock, DamageClass.Burn}, - {DamageType.Cold, DamageClass.Burn}, - {DamageType.Poison, DamageClass.Toxin}, - {DamageType.Radiation, DamageClass.Toxin}, - {DamageType.Asphyxiation, DamageClass.Airloss}, - {DamageType.Bloodloss, DamageClass.Airloss}, - {DamageType.Cellular, DamageClass.Genetic} - }.ToImmutableDictionary(); - public static DamageClass ToClass(this DamageType type) { - return TypeToClass[type]; + return DamageSystem.TypeToClass[type]; } - public static Dictionary ToDictionary() + public static Dictionary ToNewDictionary() { return Enum.GetValues(typeof(DamageType)) .Cast() - .ToDictionary(type => type, type => 0); + .ToDictionary(type => type, _ => default(T)); + } + + public static Dictionary ToNewDictionary() + { + return ToNewDictionary(); } public static Dictionary ToClassDictionary(IReadOnlyDictionary types) { - var classes = DamageClassExtensions.ToDictionary(); + var classes = DamageClassExtensions.ToNewDictionary(); foreach (var @class in classes.Keys.ToList()) { diff --git a/Content.Shared/GameObjects/Components/Damage/DamageableComponent.cs b/Content.Shared/GameObjects/Components/Damage/DamageableComponent.cs index c42f6f7cc9..548d546044 100644 --- a/Content.Shared/GameObjects/Components/Damage/DamageableComponent.cs +++ b/Content.Shared/GameObjects/Components/Damage/DamageableComponent.cs @@ -34,7 +34,7 @@ namespace Content.Shared.GameObjects.Components.Damage public override uint? NetID => ContentNetIDs.DAMAGEABLE; - private readonly Dictionary _damageList = DamageTypeExtensions.ToDictionary(); + private readonly Dictionary _damageList = DamageTypeExtensions.ToNewDictionary(); private readonly HashSet _supportedTypes = new(); private readonly HashSet _supportedClasses = new(); private DamageFlag _flags; diff --git a/Content.Shared/GameObjects/EntitySystems/DamageSystem.cs b/Content.Shared/GameObjects/EntitySystems/DamageSystem.cs new file mode 100644 index 0000000000..502d71062d --- /dev/null +++ b/Content.Shared/GameObjects/EntitySystems/DamageSystem.cs @@ -0,0 +1,67 @@ +using System.Collections.Generic; +using System.Collections.Immutable; +using Content.Shared.Damage; +using JetBrains.Annotations; +using Robust.Shared.GameObjects.Systems; + +namespace Content.Shared.GameObjects.EntitySystems +{ + [UsedImplicitly] + public class DamageSystem : EntitySystem + { + public static ImmutableDictionary> ClassToType { get; } = DefaultClassToType(); + + public static ImmutableDictionary TypeToClass { get; } = DefaultTypeToClass(); + + private static ImmutableDictionary> DefaultClassToType() + { + return new Dictionary> + { + [DamageClass.Brute] = new List + { + DamageType.Blunt, + DamageType.Slash, + DamageType.Piercing + }.ToImmutableList(), + [DamageClass.Burn] = new List + { + DamageType.Heat, + DamageType.Shock, + DamageType.Cold + }.ToImmutableList(), + [DamageClass.Toxin] = new List + { + DamageType.Poison, + DamageType.Radiation + }.ToImmutableList(), + [DamageClass.Airloss] = new List + { + DamageType.Asphyxiation, + DamageType.Bloodloss + }.ToImmutableList(), + [DamageClass.Genetic] = new List + { + DamageType.Cellular + }.ToImmutableList() + }.ToImmutableDictionary(); + } + + private static ImmutableDictionary DefaultTypeToClass() + { + return new Dictionary + { + {DamageType.Blunt, DamageClass.Brute}, + {DamageType.Slash, DamageClass.Brute}, + {DamageType.Piercing, DamageClass.Brute}, + {DamageType.Heat, DamageClass.Burn}, + {DamageType.Shock, DamageClass.Burn}, + {DamageType.Cold, DamageClass.Burn}, + {DamageType.Poison, DamageClass.Toxin}, + {DamageType.Radiation, DamageClass.Toxin}, + {DamageType.Asphyxiation, DamageClass.Airloss}, + {DamageType.Bloodloss, DamageClass.Airloss}, + {DamageType.Cellular, DamageClass.Genetic} + }.ToImmutableDictionary(); + } + } +}