Generalize ResistanceSets into DamageModifierSets (#4619)

* generalize ResistanceSets into DamageModifierSets

* remove unneeded test prototype
This commit is contained in:
mirrorcult
2021-09-15 15:51:13 -07:00
committed by GitHub
parent cd6c2bb373
commit cc52ebb9b5
57 changed files with 131 additions and 112 deletions

View File

@@ -53,14 +53,9 @@ namespace Content.IntegrationTests.Tests.Damageable
- TestDamage3b - TestDamage3b
- TestDamage3c - TestDamage3c
- type: resistanceSet
id: testResistances
# this space is intentionally left blank
# This container should not support TestDamage1 or TestDamage2b # This container should not support TestDamage1 or TestDamage2b
- type: damageContainer - type: damageContainer
id: testDamageContainer id: testDamageContainer
defaultResistanceSet: testResistances
supportedGroups: supportedGroups:
- TestGroup3 - TestGroup3
supportedTypes: supportedTypes:
@@ -189,9 +184,9 @@ namespace Content.IntegrationTests.Tests.Damageable
Assert.That(sDamageableComponent.TotalDamage, Is.EqualTo(damageToDeal)); Assert.That(sDamageableComponent.TotalDamage, Is.EqualTo(damageToDeal));
Assert.That(sDamageableComponent.DamagePerGroup[group3.ID], Is.EqualTo(damageToDeal)); Assert.That(sDamageableComponent.DamagePerGroup[group3.ID], Is.EqualTo(damageToDeal));
// integer rounding. In this case, first member gets 1 less than others. // integer rounding. In this case, first member gets 1 less than others.
Assert.That(sDamageableComponent.Damage.DamageDict[type3a.ID], Is.EqualTo(damageToDeal / types.Count())); Assert.That(sDamageableComponent.Damage.DamageDict[type3a.ID], Is.EqualTo(damageToDeal / types.Count()));
Assert.That(sDamageableComponent.Damage.DamageDict[type3b.ID], Is.EqualTo(1 + damageToDeal / types.Count())); Assert.That(sDamageableComponent.Damage.DamageDict[type3b.ID], Is.EqualTo(1 + damageToDeal / types.Count()));
Assert.That(sDamageableComponent.Damage.DamageDict[type3c.ID], Is.EqualTo(1 + damageToDeal / types.Count())); Assert.That(sDamageableComponent.Damage.DamageDict[type3c.ID], Is.EqualTo(1 + damageToDeal / types.Count()));
// Heal // Heal
sDamageableSystem.TryChangeDamage(uid, -damage); sDamageableSystem.TryChangeDamage(uid, -damage);

View File

@@ -1,27 +1,22 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using Robust.Shared.Prototypes; using Content.Shared.Damage.Prototypes;
using Robust.Shared.Serialization; using Robust.Shared.Serialization;
using Robust.Shared.Serialization.Manager.Attributes; using Robust.Shared.Serialization.Manager.Attributes;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.Dictionary; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.Dictionary;
using Robust.Shared.ViewVariables;
namespace Content.Shared.Damage.Prototypes namespace Content.Shared.Damage
{ {
/// <summary> /// <summary>
/// Prototype of damage resistance sets. Can be applied to <see cref="DamageSpecifier"/> using <see /// A set of coefficients or flat modifiers to damage types.. Can be applied to <see cref="DamageSpecifier"/> using <see
/// cref="DamageSpecifier.ApplyResistanceSet(ResistanceSetPrototype)"/>. This can be done several times as the /// cref="DamageSpecifier.ApplyModifierSet(DamageSpecifier, DamageModifierSet)"/>. This can be done several times as the
/// <see cref="DamageSpecifier"/> is passed to it's final target. By default the receiving <see cref="DamageableComponent"/>, will /// <see cref="DamageSpecifier"/> is passed to it's final target. By default the receiving <see cref="DamageableComponent"/>, will
/// also apply it's own <see cref="ResistanceSetPrototype"/>. /// also apply it's own <see cref="DamageModifierSet"/>.
/// </summary> /// </summary>
[Prototype("resistanceSet")] [DataDefinition]
[Serializable, NetSerializable] [Serializable, NetSerializable]
public class ResistanceSetPrototype : IPrototype public class DamageModifierSet
{ {
[ViewVariables]
[DataField("id", required: true)]
public string ID { get; } = default!;
[DataField("coefficients", customTypeSerializer: typeof(PrototypeIdDictionarySerializer<float, DamageTypePrototype>))] [DataField("coefficients", customTypeSerializer: typeof(PrototypeIdDictionarySerializer<float, DamageTypePrototype>))]
public Dictionary<string, float> Coefficients = new(); public Dictionary<string, float> Coefficients = new();

View File

@@ -41,7 +41,7 @@ namespace Content.Shared.Damage
{ {
if (_damageDict == null) if (_damageDict == null)
DeserializeDamage(); DeserializeDamage();
return _damageDict!; return _damageDict!;
} }
set => _damageDict = value; set => _damageDict = value;
} }
@@ -120,7 +120,7 @@ namespace Content.Shared.Damage
// This can happen if deserialized before prototypes are loaded. // This can happen if deserialized before prototypes are loaded.
Logger.Error($"Unknown damage group given to DamageSpecifier: {entry.Key}"); Logger.Error($"Unknown damage group given to DamageSpecifier: {entry.Key}");
continue; continue;
} }
// Simply distribute evenly (except for rounding). // Simply distribute evenly (except for rounding).
// We do this by reducing remaining the # of types and damage every loop. // We do this by reducing remaining the # of types and damage every loop.
@@ -141,12 +141,12 @@ namespace Content.Shared.Damage
} }
/// <summary> /// <summary>
/// Reduce (or increase) damages by applying a resistance set. /// Reduce (or increase) damages by applying a damage modifier set.
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// Only applies resistance to a damage type if it is dealing damage, not healing. /// Only applies resistance to a damage type if it is dealing damage, not healing.
/// </remarks> /// </remarks>
public static DamageSpecifier ApplyResistanceSet(DamageSpecifier damageSpec, ResistanceSetPrototype resistanceSet) public static DamageSpecifier ApplyModifierSet(DamageSpecifier damageSpec, DamageModifierSet modifierSet)
{ {
// Make a copy of the given data. Don't modify the one passed to this function. I did this before, and weapons became // Make a copy of the given data. Don't modify the one passed to this function. I did this before, and weapons became
// duller as you hit walls. Neat, but not intended. And confusing, when you realize your fists don't work no // duller as you hit walls. Neat, but not intended. And confusing, when you realize your fists don't work no
@@ -159,9 +159,9 @@ namespace Content.Shared.Damage
float newValue = entry.Value; float newValue = entry.Value;
if (resistanceSet.FlatReduction.TryGetValue(entry.Key, out var reduction)) if (modifierSet.FlatReduction.TryGetValue(entry.Key, out var reduction))
{ {
newValue -= reduction; newValue -= reduction;
if (newValue <= 0) if (newValue <= 0)
{ {
// flat reductions cannot heal you // flat reductions cannot heal you
@@ -170,7 +170,7 @@ namespace Content.Shared.Damage
} }
} }
if (resistanceSet.Coefficients.TryGetValue(entry.Key, out var coefficient)) if (modifierSet.Coefficients.TryGetValue(entry.Key, out var coefficient))
{ {
// negative coefficients **can** heal you. // negative coefficients **can** heal you.
newValue = MathF.Round(newValue*coefficient, MidpointRounding.AwayFromZero); newValue = MathF.Round(newValue*coefficient, MidpointRounding.AwayFromZero);

View File

@@ -19,7 +19,7 @@ namespace Content.Shared.Damage
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// The supported damage types are specified using a <see cref="DamageContainerPrototype"/>s. DamageContainers /// The supported damage types are specified using a <see cref="DamageContainerPrototype"/>s. DamageContainers
/// may also have resistances to certain damage types, defined via a <see cref="ResistanceSetPrototype"/>. /// may also have resistances to certain damage types, defined via a <see cref="DamageModifierSetPrototype"/>.
/// </remarks> /// </remarks>
[RegisterComponent] [RegisterComponent]
[NetworkedComponent()] [NetworkedComponent()]
@@ -36,12 +36,16 @@ namespace Content.Shared.Damage
public string? DamageContainerID; public string? DamageContainerID;
/// <summary> /// <summary>
/// This <see cref="ResistanceSetPrototype"/> will be applied to any damage that is dealt to this container, /// This <see cref="DamageModifierSetPrototype"/> will be applied to any damage that is dealt to this container,
/// unless the damage explicitly ignores resistances. /// unless the damage explicitly ignores resistances.
/// </summary> /// </summary>
/// <remarks>
/// Though DamageModifierSets can be deserialized directly, we only want to use the prototype version here
/// to reduce duplication.
/// </remarks>
[ViewVariables(VVAccess.ReadWrite)] [ViewVariables(VVAccess.ReadWrite)]
[DataField("resistanceSet", customTypeSerializer: typeof(PrototypeIdSerializer<ResistanceSetPrototype>))] [DataField("damageModifierSet", customTypeSerializer: typeof(PrototypeIdSerializer<DamageModifierSetPrototype>))]
public string? ResistanceSetID; public string? DamageModifierSetId;
/// <summary> /// <summary>
/// All the damage information is stored in this <see cref="DamageSpecifier"/>. /// All the damage information is stored in this <see cref="DamageSpecifier"/>.
@@ -116,14 +120,14 @@ namespace Content.Shared.Damage
public class DamageableComponentState : ComponentState public class DamageableComponentState : ComponentState
{ {
public readonly Dictionary<string, int> DamageDict; public readonly Dictionary<string, int> DamageDict;
public readonly string? ResistanceSetID; public readonly string? ModifierSetId;
public DamageableComponentState( public DamageableComponentState(
Dictionary<string, int> damageDict, Dictionary<string, int> damageDict,
string? resistanceSetID) string? modifierSetId)
{ {
DamageDict = damageDict; DamageDict = damageDict;
ResistanceSetID = resistanceSetID; ModifierSetId = modifierSetId;
} }
} }
} }

View File

@@ -25,7 +25,7 @@ namespace Content.Shared.Damage
/// </summary> /// </summary>
private void DamageableInit(EntityUid uid, DamageableComponent component, ComponentInit _) private void DamageableInit(EntityUid uid, DamageableComponent component, ComponentInit _)
{ {
if (component.DamageContainerID != null && if (component.DamageContainerID != null &&
_prototypeManager.TryIndex<DamageContainerPrototype>(component.DamageContainerID, _prototypeManager.TryIndex<DamageContainerPrototype>(component.DamageContainerID,
out var damageContainerPrototype)) out var damageContainerPrototype))
{ {
@@ -118,11 +118,11 @@ namespace Content.Shared.Damage
} }
// Apply resistances // Apply resistances
if (!ignoreResistances && damageable.ResistanceSetID != null) if (!ignoreResistances && damageable.DamageModifierSetId != null)
{ {
if (_prototypeManager.TryIndex<ResistanceSetPrototype>(damageable.ResistanceSetID, out var resistanceSet)) if (_prototypeManager.TryIndex<DamageModifierSetPrototype>(damageable.DamageModifierSetId, out var modifierSet))
{ {
damage = DamageSpecifier.ApplyResistanceSet(damage, resistanceSet); damage = DamageSpecifier.ApplyModifierSet(damage, modifierSet);
} }
if (damage.Empty) if (damage.Empty)
@@ -174,7 +174,7 @@ namespace Content.Shared.Damage
private void DamageableGetState(EntityUid uid, DamageableComponent component, ref ComponentGetState args) private void DamageableGetState(EntityUid uid, DamageableComponent component, ref ComponentGetState args)
{ {
args.State = new DamageableComponentState(component.Damage.DamageDict, component.ResistanceSetID); args.State = new DamageableComponentState(component.Damage.DamageDict, component.DamageModifierSetId);
} }
private void DamageableHandleState(EntityUid uid, DamageableComponent component, ref ComponentHandleState args) private void DamageableHandleState(EntityUid uid, DamageableComponent component, ref ComponentHandleState args)
@@ -184,7 +184,7 @@ namespace Content.Shared.Damage
return; return;
} }
component.ResistanceSetID = state.ResistanceSetID; component.DamageModifierSetId = state.ModifierSetId;
// Has the damage actually changed? // Has the damage actually changed?
DamageSpecifier newDamage = new() { DamageDict = state.DamageDict }; DamageSpecifier newDamage = new() { DamageDict = state.DamageDict };
@@ -202,7 +202,7 @@ namespace Content.Shared.Damage
public class DamageChangedEvent : EntityEventArgs public class DamageChangedEvent : EntityEventArgs
{ {
/// <summary> /// <summary>
/// This is the component whose damage was changed. /// This is the component whose damage was changed.
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// Given that nearly every component that cares about a change in the damage, needs to know the /// Given that nearly every component that cares about a change in the damage, needs to know the

View File

@@ -0,0 +1,25 @@
using System;
using System.Collections.Generic;
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization;
using Robust.Shared.Serialization.Manager.Attributes;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.Dictionary;
using Robust.Shared.ViewVariables;
namespace Content.Shared.Damage.Prototypes
{
/// <summary>
/// A version of DamageModifierSet that can be serialized as a prototype, but is functionally identical.
/// </summary>
/// <remarks>
/// Done to avoid removing the 'required' tag on the ID and passing around a 'prototype' when we really
/// just want normal data to be deserialized.
/// </remarks>
[Prototype("damageModifierSet")]
public class DamageModifierSetPrototype : DamageModifierSet, IPrototype
{
[ViewVariables]
[DataField("id", required: true)]
public string ID { get; } = default!;
}
}

View File

@@ -11,7 +11,7 @@ namespace Content.Tests.Shared
// Basic tests of various damage prototypes and classes. // Basic tests of various damage prototypes and classes.
[TestFixture] [TestFixture]
[TestOf(typeof(DamageSpecifier))] [TestOf(typeof(DamageSpecifier))]
[TestOf(typeof(ResistanceSetPrototype))] [TestOf(typeof(DamageModifierSetPrototype))]
[TestOf(typeof(DamageGroupPrototype))] [TestOf(typeof(DamageGroupPrototype))]
public class DamageTest : ContentUnitTest public class DamageTest : ContentUnitTest
{ {
@@ -26,7 +26,7 @@ namespace Content.Tests.Shared
static private Dictionary<string, float> _resistanceReductionDict = new() static private Dictionary<string, float> _resistanceReductionDict = new()
{ {
{ "Blunt", - 5 }, { "Blunt", - 5 },
// "missing" piercing entry // "missing" piercing entry
{ "Slash", 8 }, { "Slash", 8 },
{ "Radiation", 0.5f }, // Fractional adjustment { "Radiation", 0.5f }, // Fractional adjustment
@@ -132,13 +132,13 @@ namespace Content.Tests.Shared
//Check that DamageSpecifier will be properly adjusted by a resistance set //Check that DamageSpecifier will be properly adjusted by a resistance set
[Test] [Test]
public void ResistanceSetTest() public void ModifierSetTest()
{ {
// Create a copy of the damage data // Create a copy of the damage data
DamageSpecifier damageSpec = 10 * new DamageSpecifier(_damageSpec); DamageSpecifier damageSpec = 10 * new DamageSpecifier(_damageSpec);
// Create a resistance set // Create a modifier set
ResistanceSetPrototype resistanceSet = new() DamageModifierSetPrototype modifierSet = new()
{ {
Coefficients = _resistanceCoefficientDict, Coefficients = _resistanceCoefficientDict,
FlatReduction = _resistanceReductionDict FlatReduction = _resistanceReductionDict
@@ -149,14 +149,14 @@ namespace Content.Tests.Shared
//then multiply by 1 / -2 / 3 / 1.06 //then multiply by 1 / -2 / 3 / 1.06
// Apply once // Apply once
damageSpec = DamageSpecifier.ApplyResistanceSet(damageSpec, resistanceSet); damageSpec = DamageSpecifier.ApplyModifierSet(damageSpec, modifierSet);
Assert.That(damageSpec.DamageDict["Blunt"], Is.EqualTo(25)); Assert.That(damageSpec.DamageDict["Blunt"], Is.EqualTo(25));
Assert.That(damageSpec.DamageDict["Piercing"], Is.EqualTo(-40)); // became healing Assert.That(damageSpec.DamageDict["Piercing"], Is.EqualTo(-40)); // became healing
Assert.That(damageSpec.DamageDict["Slash"], Is.EqualTo(6)); Assert.That(damageSpec.DamageDict["Slash"], Is.EqualTo(6));
Assert.That(damageSpec.DamageDict["Radiation"], Is.EqualTo(31)); // would be 32 w/o fraction adjustment Assert.That(damageSpec.DamageDict["Radiation"], Is.EqualTo(31)); // would be 32 w/o fraction adjustment
// And again, checking for some other behavior // And again, checking for some other behavior
damageSpec = DamageSpecifier.ApplyResistanceSet(damageSpec, resistanceSet); damageSpec = DamageSpecifier.ApplyModifierSet(damageSpec, modifierSet);
Assert.That(damageSpec.DamageDict["Blunt"], Is.EqualTo(30)); Assert.That(damageSpec.DamageDict["Blunt"], Is.EqualTo(30));
Assert.That(damageSpec.DamageDict["Piercing"], Is.EqualTo(-40)); // resistances don't apply to healing Assert.That(damageSpec.DamageDict["Piercing"], Is.EqualTo(-40)); // resistances don't apply to healing
Assert.That(!damageSpec.DamageDict.ContainsKey("Slash")); // Reduction reduced to 0, and removed from specifier Assert.That(!damageSpec.DamageDict.ContainsKey("Slash")); // Reduction reduced to 0, and removed from specifier
@@ -241,7 +241,7 @@ namespace Content.Tests.Shared
damageTypes: damageTypes:
- Cellular - Cellular
- type: resistanceSet - type: damageModifierSet
id: Metallic id: Metallic
coefficients: coefficients:
Blunt: 0.7 Blunt: 0.7
@@ -251,7 +251,7 @@ namespace Content.Tests.Shared
flatReductions: flatReductions:
Blunt: 5 Blunt: 5
- type: resistanceSet - type: damageModifierSet
id: Inflatable id: Inflatable
coefficients: coefficients:
Blunt: 0.5 Blunt: 0.5
@@ -261,7 +261,7 @@ namespace Content.Tests.Shared
flatReductions: flatReductions:
Blunt: 5 Blunt: 5
- type: resistanceSet - type: damageModifierSet
id: Glass id: Glass
coefficients: coefficients:
Blunt: 0.5 Blunt: 0.5

View File

@@ -1,4 +1,4 @@
- type: resistanceSet - type: damageModifierSet
id: Metallic id: Metallic
coefficients: coefficients:
Blunt: 0.7 Blunt: 0.7
@@ -8,7 +8,7 @@
flatReductions: flatReductions:
Blunt: 5 Blunt: 5
- type: resistanceSet - type: damageModifierSet
id: Inflatable id: Inflatable
coefficients: coefficients:
Blunt: 0.5 Blunt: 0.5
@@ -18,7 +18,7 @@
flatReductions: flatReductions:
Blunt: 5 Blunt: 5
- type: resistanceSet - type: damageModifierSet
id: Glass id: Glass
coefficients: coefficients:
Blunt: 0.5 Blunt: 0.5
@@ -27,4 +27,4 @@
Heat: 0 Heat: 0
Shock: 0 Shock: 0
flatReductions: flatReductions:
Blunt: 5 Blunt: 5

View File

@@ -126,7 +126,7 @@
- type: Airtight - type: Airtight
- type: Damageable - type: Damageable
damageContainer: Inorganic damageContainer: Inorganic
resistanceSet: Metallic damageModifierSet: Metallic
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:

View File

@@ -31,7 +31,7 @@
isOpen: true isOpen: true
- type: Damageable - type: Damageable
damageContainer: Inorganic damageContainer: Inorganic
resistanceSet: Glass damageModifierSet: Glass
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:

View File

@@ -108,7 +108,7 @@
- type: Anchorable - type: Anchorable
- type: Damageable - type: Damageable
damageContainer: Inorganic damageContainer: Inorganic
resistanceSet: Metallic damageModifierSet: Metallic
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
@@ -141,7 +141,7 @@
- type: Anchorable - type: Anchorable
- type: Damageable - type: Damageable
damageContainer: Inorganic damageContainer: Inorganic
resistanceSet: Metallic damageModifierSet: Metallic
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:

View File

@@ -22,7 +22,7 @@
- SmallImpassable - SmallImpassable
- type: Damageable - type: Damageable
damageContainer: Inorganic damageContainer: Inorganic
resistanceSet: Inflatable damageModifierSet: Inflatable
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:

View File

@@ -27,10 +27,10 @@
- type: Lock - type: Lock
locked: false locked: false
lockOnClick: true # toggle lock just by clicking on barrier lockOnClick: true # toggle lock just by clicking on barrier
- type: DeployableBarrier - type: DeployableBarrier
- type: Damageable - type: Damageable
damageContainer: Inorganic damageContainer: Inorganic
resistanceSet: Metallic damageModifierSet: Metallic
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:

View File

@@ -46,7 +46,7 @@
fillBaseName: beaker fillBaseName: beaker
- type: Damageable - type: Damageable
damageContainer: Inorganic damageContainer: Inorganic
resistanceSet: Glass damageModifierSet: Glass
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:

View File

@@ -30,7 +30,7 @@
- type: Pullable - type: Pullable
- type: Damageable - type: Damageable
damageContainer: Inorganic damageContainer: Inorganic
resistanceSet: Metallic damageModifierSet: Metallic
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:

View File

@@ -27,7 +27,7 @@
anchored: true anchored: true
- type: Damageable - type: Damageable
damageContainer: Inorganic damageContainer: Inorganic
resistanceSet: Metallic damageModifierSet: Metallic
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:

View File

@@ -65,7 +65,7 @@
- type: Occluder - type: Occluder
- type: Damageable - type: Damageable
damageContainer: Inorganic damageContainer: Inorganic
resistanceSet: Metallic damageModifierSet: Metallic
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:

View File

@@ -7,7 +7,7 @@
- type: InteractionOutline - type: InteractionOutline
- type: Damageable - type: Damageable
damageContainer: Inorganic damageContainer: Inorganic
resistanceSet: Metallic damageModifierSet: Metallic
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:

View File

@@ -13,7 +13,7 @@
- type: InteractionOutline - type: InteractionOutline
- type: Damageable - type: Damageable
damageContainer: Inorganic damageContainer: Inorganic
resistanceSet: Metallic damageModifierSet: Metallic
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:

View File

@@ -25,7 +25,7 @@
- type: Rotatable - type: Rotatable
- type: Damageable - type: Damageable
damageContainer: Inorganic damageContainer: Inorganic
resistanceSet: Metallic damageModifierSet: Metallic
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:

View File

@@ -39,7 +39,7 @@
- type: ApcPowerReceiver - type: ApcPowerReceiver
- type: Damageable - type: Damageable
damageContainer: Inorganic damageContainer: Inorganic
resistanceSet: Glass damageModifierSet: Glass
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:

View File

@@ -7,7 +7,7 @@
components: components:
- type: Damageable - type: Damageable
damageContainer: Inorganic damageContainer: Inorganic
resistanceSet: Metallic damageModifierSet: Metallic
- type: PlaceableSurface - type: PlaceableSurface
- type: Sprite - type: Sprite
netsync: false netsync: false

View File

@@ -10,7 +10,7 @@
sprite: Structures/Furniture/Tables/frame.rsi sprite: Structures/Furniture/Tables/frame.rsi
- type: Damageable - type: Damageable
damageContainer: Inorganic damageContainer: Inorganic
resistanceSet: Metallic damageModifierSet: Metallic
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
@@ -43,7 +43,7 @@
sprite: Structures/Furniture/Tables/generic.rsi sprite: Structures/Furniture/Tables/generic.rsi
- type: Damageable - type: Damageable
damageContainer: Inorganic damageContainer: Inorganic
resistanceSet: Metallic damageModifierSet: Metallic
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:

View File

@@ -25,7 +25,7 @@
rotation: -90 rotation: -90
- type: Damageable - type: Damageable
damageContainer: Inorganic damageContainer: Inorganic
resistanceSet: Metallic damageModifierSet: Metallic
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:

View File

@@ -13,7 +13,7 @@
sprite: Structures/Furniture/instruments.rsi sprite: Structures/Furniture/instruments.rsi
- type: Damageable - type: Damageable
damageContainer: Inorganic damageContainer: Inorganic
resistanceSet: Metallic damageModifierSet: Metallic
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:

View File

@@ -25,7 +25,7 @@
- type: Pullable - type: Pullable
- type: Damageable - type: Damageable
damageContainer: Inorganic damageContainer: Inorganic
resistanceSet: Metallic damageModifierSet: Metallic
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:

View File

@@ -29,7 +29,7 @@
state: 0 state: 0
- type: Damageable - type: Damageable
damageContainer: Inorganic damageContainer: Inorganic
resistanceSet: Metallic damageModifierSet: Metallic
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:

View File

@@ -19,7 +19,7 @@
- MobMask - MobMask
- type: Damageable - type: Damageable
damageContainer: Inorganic damageContainer: Inorganic
resistanceSet: Metallic damageModifierSet: Metallic
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:

View File

@@ -33,7 +33,7 @@
- MobImpassable - MobImpassable
- type: Damageable - type: Damageable
damageContainer: Inorganic damageContainer: Inorganic
resistanceSet: Metallic damageModifierSet: Metallic
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:

View File

@@ -32,7 +32,7 @@
node: missingWires node: missingWires
- type: Damageable - type: Damageable
damageContainer: Inorganic damageContainer: Inorganic
resistanceSet: Metallic damageModifierSet: Metallic
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
@@ -80,7 +80,7 @@
node: machineFrame node: machineFrame
- type: Damageable - type: Damageable
damageContainer: Inorganic damageContainer: Inorganic
resistanceSet: Metallic damageModifierSet: Metallic
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:

View File

@@ -13,7 +13,7 @@
anchored: true anchored: true
- type: Damageable - type: Damageable
damageContainer: Inorganic damageContainer: Inorganic
resistanceSet: Metallic damageModifierSet: Metallic
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:

View File

@@ -13,7 +13,7 @@
anchored: true anchored: true
- type: Damageable - type: Damageable
damageContainer: Inorganic damageContainer: Inorganic
resistanceSet: Metallic damageModifierSet: Metallic
- type: Anchorable - type: Anchorable
- type: Rotatable - type: Rotatable
- type: Pullable - type: Pullable

View File

@@ -17,7 +17,7 @@
- type: Anchorable - type: Anchorable
- type: Damageable - type: Damageable
damageContainer: Inorganic damageContainer: Inorganic
resistanceSet: Metallic damageModifierSet: Metallic
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:

View File

@@ -46,7 +46,7 @@
nodeGroupID: MVPower nodeGroupID: MVPower
- type: Damageable - type: Damageable
damageContainer: Inorganic damageContainer: Inorganic
resistanceSet: Metallic damageModifierSet: Metallic
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:

View File

@@ -26,7 +26,7 @@
- SmallImpassable - SmallImpassable
- type: Damageable - type: Damageable
damageContainer: Inorganic damageContainer: Inorganic
resistanceSet: Metallic damageModifierSet: Metallic
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
@@ -112,7 +112,7 @@
- SmallImpassable - SmallImpassable
- type: Damageable - type: Damageable
damageContainer: Inorganic damageContainer: Inorganic
resistanceSet: Metallic damageModifierSet: Metallic
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:

View File

@@ -40,7 +40,7 @@
anchored: true anchored: true
- type: Damageable - type: Damageable
damageContainer: Inorganic damageContainer: Inorganic
resistanceSet: Metallic damageModifierSet: Metallic
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
@@ -81,7 +81,7 @@
anchored: true anchored: true
- type: Damageable - type: Damageable
damageContainer: Inorganic damageContainer: Inorganic
resistanceSet: Metallic damageModifierSet: Metallic
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:
@@ -127,7 +127,7 @@
anchored: true anchored: true
- type: Damageable - type: Damageable
damageContainer: Inorganic damageContainer: Inorganic
resistanceSet: Metallic damageModifierSet: Metallic
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:

View File

@@ -22,7 +22,7 @@
anchored: true anchored: true
- type: Damageable - type: Damageable
damageContainer: Inorganic damageContainer: Inorganic
resistanceSet: Metallic damageModifierSet: Metallic
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:

View File

@@ -20,7 +20,7 @@
drawdepth: BelowFloor drawdepth: BelowFloor
- type: Damageable - type: Damageable
damageContainer: Inorganic damageContainer: Inorganic
resistanceSet: Metallic damageModifierSet: Metallic
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:

View File

@@ -39,7 +39,7 @@
drawRate: 50 drawRate: 50
- type: Damageable - type: Damageable
damageContainer: Inorganic damageContainer: Inorganic
resistanceSet: Metallic damageModifierSet: Metallic
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:

View File

@@ -43,7 +43,7 @@
acts: [ "Destruction" ] acts: [ "Destruction" ]
- type: Damageable - type: Damageable
damageContainer: Inorganic damageContainer: Inorganic
resistanceSet: Metallic damageModifierSet: Metallic
- type: Physics - type: Physics
bodyType: Dynamic bodyType: Dynamic
fixtures: fixtures:
@@ -364,7 +364,7 @@
acts: [ "Destruction" ] acts: [ "Destruction" ]
- type: Damageable - type: Damageable
damageContainer: Inorganic damageContainer: Inorganic
resistanceSet: Metallic damageModifierSet: Metallic
- type: InteractionOutline - type: InteractionOutline
- type: Sprite - type: Sprite
sprite: Structures/Storage/canister.rsi sprite: Structures/Storage/canister.rsi

View File

@@ -41,7 +41,7 @@
placeCentered: true placeCentered: true
- type: Damageable - type: Damageable
damageContainer: Inorganic damageContainer: Inorganic
resistanceSet: Metallic damageModifierSet: Metallic
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:

View File

@@ -36,7 +36,7 @@
- type: PlaceableSurface - type: PlaceableSurface
- type: Damageable - type: Damageable
damageContainer: Inorganic damageContainer: Inorganic
resistanceSet: Metallic damageModifierSet: Metallic
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:

View File

@@ -531,7 +531,7 @@
state_closed: livestockcrate_door state_closed: livestockcrate_door
- type: Damageable - type: Damageable
damageContainer: Inorganic damageContainer: Inorganic
resistanceSet: Metallic damageModifierSet: Metallic
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:

View File

@@ -25,7 +25,7 @@
- SmallImpassable - SmallImpassable
- type: Damageable - type: Damageable
damageContainer: Inorganic damageContainer: Inorganic
resistanceSet: Metallic damageModifierSet: Metallic
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:

View File

@@ -27,7 +27,7 @@
- type: Anchorable - type: Anchorable
- type: Damageable - type: Damageable
damageContainer: Inorganic damageContainer: Inorganic
resistanceSet: Metallic damageModifierSet: Metallic
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:

View File

@@ -13,7 +13,7 @@
!type:PhysShapeAabb {} !type:PhysShapeAabb {}
- type: Damageable - type: Damageable
damageContainer: Inorganic damageContainer: Inorganic
resistanceSet: Metallic damageModifierSet: Metallic
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:

View File

@@ -36,7 +36,7 @@
type: SignalPortSelectorBoundUserInterface type: SignalPortSelectorBoundUserInterface
- type: Damageable - type: Damageable
damageContainer: Inorganic damageContainer: Inorganic
resistanceSet: Metallic damageModifierSet: Metallic
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:

View File

@@ -11,7 +11,7 @@
state: 0 state: 0
- type: Damageable - type: Damageable
damageContainer: Inorganic damageContainer: Inorganic
resistanceSet: Metallic damageModifierSet: Metallic
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:

View File

@@ -25,7 +25,7 @@
- ExplosivePassable - ExplosivePassable
- type: Damageable - type: Damageable
damageContainer: Inorganic damageContainer: Inorganic
resistanceSet: Metallic damageModifierSet: Metallic
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:

View File

@@ -19,7 +19,7 @@
state: full state: full
- type: Damageable - type: Damageable
damageContainer: Inorganic damageContainer: Inorganic
resistanceSet: Metallic damageModifierSet: Metallic
- type: Physics - type: Physics
bodyType: Static bodyType: Static
fixtures: fixtures:

View File

@@ -29,7 +29,7 @@
- ExplosivePassable - ExplosivePassable
- type: Damageable - type: Damageable
damageContainer: Inorganic damageContainer: Inorganic
resistanceSet: Metallic damageModifierSet: Metallic
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:

View File

@@ -16,7 +16,7 @@
state: metal state: metal
- type: Damageable - type: Damageable
damageContainer: Inorganic damageContainer: Inorganic
resistanceSet: Metallic damageModifierSet: Metallic
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:

View File

@@ -10,7 +10,7 @@
sprite: Structures/Windows/plasma_window.rsi sprite: Structures/Windows/plasma_window.rsi
- type: Damageable - type: Damageable
damageContainer: Inorganic damageContainer: Inorganic
resistanceSet: Glass damageModifierSet: Glass
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:

View File

@@ -31,7 +31,7 @@
- VaultImpassable - VaultImpassable
- type: Damageable - type: Damageable
damageContainer: Inorganic damageContainer: Inorganic
resistanceSet: Glass damageModifierSet: Glass
- type: Repairable - type: Repairable
- type: Destructible - type: Destructible
thresholds: thresholds:

View File

@@ -20,7 +20,7 @@
drawdepth: FloorObjects drawdepth: FloorObjects
- type: Damageable - type: Damageable
damageContainer: Inorganic damageContainer: Inorganic
resistanceSet: Metallic damageModifierSet: Metallic
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:

View File

@@ -12,7 +12,7 @@
state: spike state: spike
- type: Damageable - type: Damageable
damageContainer: Inorganic damageContainer: Inorganic
resistanceSet: Metallic damageModifierSet: Metallic
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger:

View File

@@ -26,7 +26,7 @@
- SmallImpassable - SmallImpassable
- type: Damageable - type: Damageable
damageContainer: Inorganic damageContainer: Inorganic
resistanceSet: Metallic damageModifierSet: Metallic
- type: Destructible - type: Destructible
thresholds: thresholds:
- trigger: - trigger: