diff --git a/Content.Server/EntityEffects/Effects/FlashReactionEffect.cs b/Content.Server/EntityEffects/Effects/FlashReactionEffect.cs new file mode 100644 index 00000000000000..fbf99e902d35cc --- /dev/null +++ b/Content.Server/EntityEffects/Effects/FlashReactionEffect.cs @@ -0,0 +1,82 @@ +using Content.Shared.EntityEffects; +using Content.Server.Flash; +using Robust.Server.GameObjects; +using Robust.Shared.Audio; +using Robust.Shared.Prototypes; + +namespace Content.Server.EntityEffects.Effects; + +[DataDefinition] +public sealed partial class FlashReactionEffect : EntityEffect +{ + /// + /// Flash range per unit of reagent. + /// + [DataField] + public float RangePerUnit = 0.2f; + + /// + /// Maximum flash range. + /// + [DataField] + public float MaxRange = 10f; + + /// + /// How much to entities are slowed down. + /// + [DataField] + public float SlowTo = 0.5f; + + /// + /// The time entities will be flashed in seconds. + /// The default is chosen to be better than the hand flash so it is worth using it for grenades etc. + /// + [DataField] + public float Duration = 4f; + + /// + /// The prototype ID used for the visual effect. + /// + [DataField] + public EntProtoId? FlashEffectPrototype = "ReactionFlash"; + + /// + /// The sound the flash creates. + /// + [DataField] + public SoundSpecifier? Sound = new SoundPathSpecifier("/Audio/Weapons/flash.ogg"); + + protected override string? ReagentEffectGuidebookText(IPrototypeManager prototype, IEntitySystemManager entSys) + => Loc.GetString("reagent-effect-guidebook-flash-reaction-effect", ("chance", Probability)); + + public override void Effect(EntityEffectBaseArgs args) + { + var transform = args.EntityManager.GetComponent(args.TargetEntity); + var transformSystem = args.EntityManager.System(); + + var range = 1f; + + if (args is EntityEffectReagentArgs reagentArgs) + range = MathF.Min((float)(reagentArgs.Quantity * RangePerUnit), MaxRange); + + args.EntityManager.System().FlashArea( + args.TargetEntity, + null, + range, + Duration * 1000, + slowTo: SlowTo, + sound: Sound); + + if (FlashEffectPrototype == null) + return; + + var uid = args.EntityManager.SpawnEntity(FlashEffectPrototype, transformSystem.GetMapCoordinates(transform)); + transformSystem.AttachToGridOrMap(uid); + + if (!args.EntityManager.TryGetComponent(uid, out var pointLightComp)) + return; + var pointLightSystem = args.EntityManager.System(); + // PointLights with a radius lower than 1.1 are too small to be visible, so this is hardcoded + pointLightSystem.SetRadius(uid, MathF.Max(1.1f, range), pointLightComp); + } +} diff --git a/Resources/Locale/en-US/guidebook/chemistry/effects.ftl b/Resources/Locale/en-US/guidebook/chemistry/effects.ftl index b65c332346a923..642555b237eaa2 100644 --- a/Resources/Locale/en-US/guidebook/chemistry/effects.ftl +++ b/Resources/Locale/en-US/guidebook/chemistry/effects.ftl @@ -37,6 +37,12 @@ reagent-effect-guidebook-emp-reaction-effect = *[other] cause } an electromagnetic pulse +reagent-effect-guidebook-flash-reaction-effect = + { $chance -> + [1] Causes + *[other] cause + } a blinding flash + reagent-effect-guidebook-foam-area-reaction-effect = { $chance -> [1] Creates diff --git a/Resources/Prototypes/Entities/Effects/chemistry_effects.yml b/Resources/Prototypes/Entities/Effects/chemistry_effects.yml index 59fa1b0d1a6e79..8784ed77cecd70 100644 --- a/Resources/Prototypes/Entities/Effects/chemistry_effects.yml +++ b/Resources/Prototypes/Entities/Effects/chemistry_effects.yml @@ -222,3 +222,16 @@ state: metal_foam-north - map: [ "enum.EdgeLayer.West" ] state: metal_foam-west + +- type: entity + id: ReactionFlash + categories: [ HideSpawnMenu ] + components: + - type: PointLight + enabled: true + radius: 2 + energy: 8 + - type: LightFade + duration: 0.5 + - type: TimedDespawn + lifetime: 0.5 diff --git a/Resources/Prototypes/Recipes/Reactions/chemicals.yml b/Resources/Prototypes/Recipes/Reactions/chemicals.yml index 537a792e8596a4..78fdfec7c9a37d 100644 --- a/Resources/Prototypes/Recipes/Reactions/chemicals.yml +++ b/Resources/Prototypes/Recipes/Reactions/chemicals.yml @@ -81,7 +81,7 @@ amount: 1 Sulfur: amount: 1 - Oxygen: + Oxygen: amount: 2 products: SulfuricAcid: 3 @@ -205,6 +205,20 @@ energyConsumption: 12500 duration: 15 +- type: reaction + id: Flash + impact: High + priority: 20 + reactants: + Aluminium: + amount: 1 + Potassium: + amount: 1 + Sulfur: + amount: 1 + effects: + - !type:FlashReactionEffect + - type: reaction id: TableSalt minTemp: 370 @@ -501,3 +515,4 @@ amount: 1 products: Tazinide: 1 +