From 6a497d3f55d96829dcee9a33104a32709585c7de Mon Sep 17 00:00:00 2001 From: rolfero <45628623+rolfero@users.noreply.github.com> Date: Tue, 8 Nov 2022 01:36:53 +0100 Subject: [PATCH] Armor price calculations (#11417) Co-authored-by: CommieFlowers fixes https://github.com/space-wizards/space-station-14/issues/11299 --- Content.Server/Armor/ArmorSystem.cs | 43 +++++++++++++++++++ .../Damage/Prototypes/DamageTypePrototype.cs | 12 ++++++ .../Catalog/Cargo/cargo_emergency.yml | 6 +-- .../Catalog/Cargo/cargo_security.yml | 6 +-- Resources/Prototypes/Damage/types.yml | 27 +++++++++++- 5 files changed, 87 insertions(+), 7 deletions(-) diff --git a/Content.Server/Armor/ArmorSystem.cs b/Content.Server/Armor/ArmorSystem.cs index edef28b1f1..477fd60cea 100644 --- a/Content.Server/Armor/ArmorSystem.cs +++ b/Content.Server/Armor/ArmorSystem.cs @@ -2,14 +2,20 @@ using Content.Shared.Damage; using Content.Server.Examine; using Content.Shared.Verbs; using Robust.Shared.Utility; +using Content.Server.Cargo.Systems; +using Robust.Shared.Prototypes; +using Content.Shared.Damage.Prototypes; using Content.Shared.Inventory; namespace Content.Server.Armor { public sealed class ArmorSystem : EntitySystem { + const double CoefDefaultPrice = 2; // default price of 1% protection against any type of damage + const double FlatDefaultPrice = 10; //default price of 1 damage protection against a certain type of damage [Dependency] private readonly ExamineSystem _examine = default!; + [Dependency] private readonly IPrototypeManager _protoManager = default!; public override void Initialize() { @@ -17,6 +23,43 @@ namespace Content.Server.Armor SubscribeLocalEvent>(OnDamageModify); SubscribeLocalEvent>(OnArmorVerbExamine); + SubscribeLocalEvent(GetArmorPrice); + } + + private void GetArmorPrice(EntityUid uid, ArmorComponent component, ref PriceCalculationEvent args) + { + if (component.Modifiers == null) + return; + + double price = 0; + + foreach (var modifier in component.Modifiers.Coefficients) + { + _protoManager.TryIndex(modifier.Key, out DamageTypePrototype? damageType); + + if (damageType != null) + { + price += damageType.ArmorPriceCoefficient * 100 * (1 - modifier.Value); + } + else + { + price += CoefDefaultPrice * 100 * (1 - modifier.Value); + } + } + foreach (var modifier in component.Modifiers.FlatReduction) + { + _protoManager.TryIndex(modifier.Key, out DamageTypePrototype? damageType); + + if (damageType != null) + { + price += damageType.ArmorPriceFlat * modifier.Value; + } + else + { + price += FlatDefaultPrice * modifier.Value; + } + } + args.Price += price; } private void OnDamageModify(EntityUid uid, ArmorComponent component, InventoryRelayedEvent args) diff --git a/Content.Shared/Damage/Prototypes/DamageTypePrototype.cs b/Content.Shared/Damage/Prototypes/DamageTypePrototype.cs index dc8ceff456..0c563b7a1d 100644 --- a/Content.Shared/Damage/Prototypes/DamageTypePrototype.cs +++ b/Content.Shared/Damage/Prototypes/DamageTypePrototype.cs @@ -12,5 +12,17 @@ namespace Content.Shared.Damage.Prototypes { [IdDataFieldAttribute] public string ID { get; } = default!; + + /// + /// The price for each 1% damage reduction in armors + /// + [DataField("armorCoefficientPrice")] + public double ArmorPriceCoefficient { get; set; } + + /// + /// The price for each flat damage reduction in armors + /// + [DataField("armorFlatPrice")] + public double ArmorPriceFlat { get; set; } } } diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_emergency.yml b/Resources/Prototypes/Catalog/Cargo/cargo_emergency.yml index e2f4f814f7..bdf6eb0c2c 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_emergency.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_emergency.yml @@ -4,7 +4,7 @@ sprite: Clothing/Head/Helmets/bombsuit.rsi state: icon product: CrateEmergencyExplosive - cost: 500 + cost: 650 category: Emergency group: market @@ -14,7 +14,7 @@ sprite: Objects/Misc/fire_extinguisher.rsi state: fire_extinguisher_closed product: CrateEmergencyFire - cost: 1000 + cost: 1200 category: Emergency group: market @@ -34,7 +34,7 @@ sprite: Structures/Wallmounts/signs.rsi state: radiation product: CrateEmergencyRadiation - cost: 500 + cost: 900 category: Emergency group: market diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_security.yml b/Resources/Prototypes/Catalog/Cargo/cargo_security.yml index 03b189891c..c3d0d26a0a 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_security.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_security.yml @@ -4,7 +4,7 @@ sprite: Clothing/OuterClothing/Vests/oldarmor.rsi state: icon product: CrateSecurityArmor - cost: 500 + cost: 700 category: Security group: market @@ -14,7 +14,7 @@ sprite: Clothing/Head/Helmets/security.rsi state: icon product: CrateSecurityHelmet - cost: 500 + cost: 550 category: Security group: market @@ -44,7 +44,7 @@ sprite: Clothing/OuterClothing/Armor/riot.rsi state: icon product: CrateSecurityRiot - cost: 2000 + cost: 2800 category: Security group: market diff --git a/Resources/Prototypes/Damage/types.yml b/Resources/Prototypes/Damage/types.yml index 7a8b9a8df4..642f7e3440 100644 --- a/Resources/Prototypes/Damage/types.yml +++ b/Resources/Prototypes/Damage/types.yml @@ -3,41 +3,66 @@ # Usually healed automatically if entity can breathe - type: damageType id: Asphyxiation + armorCoefficientPrice: 5 + armorFlatPrice: 50 + # Damage representing not having enough blood. # Represents there not enough blood to supply oxygen (or equivalent). - type: damageType id: Bloodloss + armorCoefficientPrice: 5 + armorFlatPrice: 50 - type: damageType id: Blunt - + armorCoefficientPrice: 2 + armorFlatPrice: 10 + - type: damageType id: Cellular + armorCoefficientPrice: 5 + armorFlatPrice: 30 - type: damageType id: Cold + armorCoefficientPrice: 2.5 + armorFlatPrice: 20 - type: damageType id: Heat + armorCoefficientPrice: 2.5 + armorFlatPrice: 20 - type: damageType id: Piercing + armorCoefficientPrice: 2 + armorFlatPrice: 10 # Poison damage. Generally caused by various reagents being metabolised. - type: damageType id: Poison + armorCoefficientPrice: 10 + armorFlatPrice: 60 - type: damageType id: Radiation + armorCoefficientPrice: 2.5 + armorFlatPrice: 16 - type: damageType id: Shock + armorCoefficientPrice: 2.5 + armorFlatPrice: 20 - type: damageType id: Slash + armorCoefficientPrice: 2 + armorFlatPrice: 10 # Damage represent structures internal integrity. # Exclusive for structures such as walls, airlocks and others. - type: damageType id: Structural + armorCoefficientPrice: 1 + armorFlatPrice: 1