using Content.Shared.Clothing.Components; using Content.Shared.Damage; using Content.Shared.Examine; using Content.Shared.Inventory; using Content.Shared.Silicons.Borgs; using Content.Shared.Verbs; using Robust.Shared.Utility; namespace Content.Shared.Armor; /// /// This handles logic relating to /// public abstract class SharedArmorSystem : EntitySystem { [Dependency] private readonly ExamineSystemShared _examine = default!; /// public override void Initialize() { base.Initialize(); SubscribeLocalEvent>(OnCoefficientQuery); SubscribeLocalEvent>(OnDamageModify); SubscribeLocalEvent>(OnBorgDamageModify); SubscribeLocalEvent>(OnArmorVerbExamine); } /// /// Get the total Damage reduction value of all equipment caught by the relay. /// /// The item that's being relayed to /// The event, contains the running count of armor percentage as a coefficient private void OnCoefficientQuery(Entity ent, ref InventoryRelayedEvent args) { if (TryComp(ent, out var mask) && mask.IsToggled) return; foreach (var armorCoefficient in ent.Comp.Modifiers.Coefficients) { args.Args.DamageModifiers.Coefficients[armorCoefficient.Key] = args.Args.DamageModifiers.Coefficients.TryGetValue(armorCoefficient.Key, out var coefficient) ? coefficient * armorCoefficient.Value : armorCoefficient.Value; } } private void OnDamageModify(EntityUid uid, ArmorComponent component, InventoryRelayedEvent args) { if (TryComp(uid, out var mask) && mask.IsToggled) return; args.Args.Damage = DamageSpecifier.ApplyModifierSet(args.Args.Damage, component.Modifiers); } private void OnBorgDamageModify(EntityUid uid, ArmorComponent component, ref BorgModuleRelayedEvent args) { if (TryComp(uid, out var mask) && mask.IsToggled) return; args.Args.Damage = DamageSpecifier.ApplyModifierSet(args.Args.Damage, component.Modifiers); } private void OnArmorVerbExamine(EntityUid uid, ArmorComponent component, GetVerbsEvent args) { if (!args.CanInteract || !args.CanAccess || !component.ShowArmorOnExamine) return; var examineMarkup = GetArmorExamine(component); // DeltaV - Changed argument type to ArmorComponent var ev = new ArmorExamineEvent(examineMarkup); RaiseLocalEvent(uid, ref ev); _examine.AddDetailedExamineVerb(args, component, examineMarkup, Loc.GetString("armor-examinable-verb-text"), "/Textures/Interface/VerbIcons/dot.svg.192dpi.png", Loc.GetString("armor-examinable-verb-message")); } // DeltaV - Changed to take ArmorComponent instead of DamageModifierSet private FormattedMessage GetArmorExamine(ArmorComponent component) { var msg = new FormattedMessage(); msg.AddMarkupOrThrow(Loc.GetString("armor-examine")); foreach (var coefficientArmor in component.Modifiers.Coefficients) // DeltaV { msg.PushNewline(); var armorType = Loc.GetString("armor-damage-type-" + coefficientArmor.Key.ToLower()); msg.AddMarkupOrThrow(Loc.GetString("armor-coefficient-value", ("type", armorType), ("value", MathF.Round((1f - coefficientArmor.Value) * 100, 1)) )); } foreach (var flatArmor in component.Modifiers.FlatReduction) // DeltaV { msg.PushNewline(); var armorType = Loc.GetString("armor-damage-type-" + flatArmor.Key.ToLower()); msg.AddMarkupOrThrow(Loc.GetString("armor-reduction-value", ("type", armorType), ("value", flatArmor.Value) )); } // Begin DeltaV Additions - Add melee stamina resistance information if it has any if (!MathHelper.CloseTo(component.StaminaMeleeDamageCoefficient, 1.0f)) { msg.PushNewline(); var reduction = (1 - component.StaminaMeleeDamageCoefficient) * 100; msg.AddMarkupOrThrow(Loc.GetString("armor-stamina-melee-coefficient-value", ("value", MathF.Round(reduction, 1)) )); } // End DeltaV return msg; } }