From: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Date: Mon, 6 Feb 2023 19:53:59 +0000 (-0500) Subject: Anomaly Generator Tweaks (#13856) X-Git-Url: https://git.smokeofanarchy.ru/gitweb.cgi?a=commitdiff_plain;h=1b8c48180b3869329a9fca452a803c6acebfeceb;p=space-station-14.git Anomaly Generator Tweaks (#13856) --- diff --git a/Content.Client/Anomaly/Ui/AnomalyGeneratorWindow.xaml.cs b/Content.Client/Anomaly/Ui/AnomalyGeneratorWindow.xaml.cs index cf46f0f8fd..cda9c21239 100644 --- a/Content.Client/Anomaly/Ui/AnomalyGeneratorWindow.xaml.cs +++ b/Content.Client/Anomaly/Ui/AnomalyGeneratorWindow.xaml.cs @@ -37,7 +37,9 @@ public sealed partial class AnomalyGeneratorWindow : FancyWindow var fuelCompletion = Math.Clamp((float) state.FuelAmount / state.FuelCost, 0f, 1f); FuelBar.Value = fuelCompletion; - FuelText.Text = $"{fuelCompletion:P}"; + + var charges = state.FuelAmount / state.FuelCost; + FuelText.Text = Loc.GetString("anomaly-generator-charges", ("charges", charges)); UpdateTimer(); UpdateReady(); // yes this can trigger twice. no i don't care diff --git a/Content.Server/Anomaly/AnomalySystem.Generator.cs b/Content.Server/Anomaly/AnomalySystem.Generator.cs index 7a2deb8611..2b20ce75a2 100644 --- a/Content.Server/Anomaly/AnomalySystem.Generator.cs +++ b/Content.Server/Anomaly/AnomalySystem.Generator.cs @@ -1,9 +1,11 @@ -using Content.Server.Anomaly.Components; +using Content.Server.Anomaly.Components; using Content.Server.Power.Components; using Content.Server.Power.EntitySystems; using Content.Shared.Anomaly; using Content.Shared.CCVar; using Content.Shared.Materials; +using Content.Shared.Radio; +using Robust.Shared.Audio; using Content.Shared.Physics; using Robust.Shared.Map.Components; using Robust.Shared.Physics; @@ -24,6 +26,9 @@ public sealed partial class AnomalySystem SubscribeLocalEvent(OnGeneratorMaterialAmountChanged); SubscribeLocalEvent(OnGenerateButtonPressed); SubscribeLocalEvent(OnGeneratorPowerChanged); + SubscribeLocalEvent(OnGeneratorUnpaused); + SubscribeLocalEvent(OnGeneratingStartup); + SubscribeLocalEvent(OnGeneratingUnpaused); } private void OnGeneratorPowerChanged(EntityUid uid, AnomalyGeneratorComponent component, ref PowerChangedEvent args) @@ -46,6 +51,11 @@ public sealed partial class AnomalySystem TryGeneratorCreateAnomaly(uid, component); } + private void OnGeneratorUnpaused(EntityUid uid, AnomalyGeneratorComponent component, ref EntityUnpausedEvent args) + { + component.CooldownEndTime += args.PausedTime; + } + public void UpdateGeneratorUi(EntityUid uid, AnomalyGeneratorComponent component) { var materialAmount = _material.GetMaterialAmount(uid, component.RequiredMaterial); @@ -65,14 +75,12 @@ public sealed partial class AnomalySystem if (Timing.CurTime < component.CooldownEndTime) return; - var grid = Transform(uid).GridUid; - if (grid == null) - return; - if (!_material.TryChangeMaterialAmount(uid, component.RequiredMaterial, -component.MaterialPerAnomaly)) return; - SpawnOnRandomGridLocation(grid.Value, component.SpawnerPrototype); + var generating = EnsureComp(uid); + generating.EndTime = Timing.CurTime + component.GenerationLength; + generating.AudioStream = Audio.PlayPvs(component.GeneratingSound, uid, AudioParams.Default.WithLoop(true)); component.CooldownEndTime = Timing.CurTime + component.CooldownLength; UpdateGeneratorUi(uid, component); } @@ -126,4 +134,42 @@ public sealed partial class AnomalySystem Spawn(toSpawn, targetCoords); } + + private void OnGeneratingStartup(EntityUid uid, GeneratingAnomalyGeneratorComponent component, ComponentStartup args) + { + Appearance.SetData(uid, AnomalyGeneratorVisuals.Generating, true); + } + + private void OnGeneratingUnpaused(EntityUid uid, GeneratingAnomalyGeneratorComponent component, ref EntityUnpausedEvent args) + { + component.EndTime += args.PausedTime; + } + + private void OnGeneratingFinished(EntityUid uid, AnomalyGeneratorComponent component) + { + var grid = Transform(uid).GridUid; + if (grid == null) + return; + + SpawnOnRandomGridLocation(grid.Value, component.SpawnerPrototype); + RemComp(uid); + Appearance.SetData(uid, AnomalyGeneratorVisuals.Generating, false); + Audio.PlayPvs(component.GeneratingFinishedSound, uid); + + var message = Loc.GetString("anomaly-generator-announcement"); + _radio.SendRadioMessage(uid, message, _prototype.Index(component.ScienceChannel)); + } + + private void UpdateGenerator() + { + foreach (var (active, gen) in EntityQuery()) + { + var ent = active.Owner; + + if (Timing.CurTime < active.EndTime) + continue; + active.AudioStream?.Stop(); + OnGeneratingFinished(ent, gen); + } + } } diff --git a/Content.Server/Anomaly/AnomalySystem.cs b/Content.Server/Anomaly/AnomalySystem.cs index e48fc328c4..3de46afb46 100644 --- a/Content.Server/Anomaly/AnomalySystem.cs +++ b/Content.Server/Anomaly/AnomalySystem.cs @@ -4,12 +4,15 @@ using Content.Server.Audio; using Content.Server.DoAfter; using Content.Server.Explosion.EntitySystems; using Content.Server.Materials; +using Content.Server.Radio.EntitySystems; using Content.Shared.Anomaly; using Content.Shared.Anomaly.Components; using Robust.Server.GameObjects; using Robust.Shared.Configuration; using Robust.Shared.Physics.Events; +using Robust.Shared.Prototypes; using Robust.Shared.Random; + namespace Content.Server.Anomaly; /// @@ -18,11 +21,13 @@ namespace Content.Server.Anomaly; public sealed partial class AnomalySystem : SharedAnomalySystem { [Dependency] private readonly IConfigurationManager _configuration = default!; + [Dependency] private readonly IPrototypeManager _prototype = default!; [Dependency] private readonly AmbientSoundSystem _ambient = default!; [Dependency] private readonly AtmosphereSystem _atmosphere = default!; [Dependency] private readonly DoAfterSystem _doAfter = default!; [Dependency] private readonly ExplosionSystem _explosion = default!; [Dependency] private readonly MaterialStorageSystem _material = default!; + [Dependency] private readonly RadioSystem _radio = default!; [Dependency] private readonly UserInterfaceSystem _ui = default!; public const float MinParticleVariation = 0.8f; @@ -128,6 +133,7 @@ public sealed partial class AnomalySystem : SharedAnomalySystem { base.Update(frameTime); + UpdateGenerator(); UpdateVessels(); } } diff --git a/Content.Server/Anomaly/Components/AnomalyGeneratorComponent.cs b/Content.Server/Anomaly/Components/AnomalyGeneratorComponent.cs index 4c9fc39442..0b27ee7d1b 100644 --- a/Content.Server/Anomaly/Components/AnomalyGeneratorComponent.cs +++ b/Content.Server/Anomaly/Components/AnomalyGeneratorComponent.cs @@ -1,4 +1,6 @@ using Content.Shared.Materials; +using Content.Shared.Radio; +using Robust.Shared.Audio; using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; @@ -24,6 +26,12 @@ public sealed class AnomalyGeneratorComponent : Component [DataField("cooldownLength"), ViewVariables(VVAccess.ReadWrite)] public TimeSpan CooldownLength = TimeSpan.FromMinutes(5); + /// + /// How long it takes to generate an anomaly after pushing the button. + /// + [DataField("generationLength"), ViewVariables(VVAccess.ReadWrite)] + public TimeSpan GenerationLength = TimeSpan.FromSeconds(8); + /// /// The material needed to generate an anomaly /// @@ -41,4 +49,22 @@ public sealed class AnomalyGeneratorComponent : Component /// [DataField("spawnerPrototype", customTypeSerializer: typeof(PrototypeIdSerializer)), ViewVariables(VVAccess.ReadWrite)] public string SpawnerPrototype = "RandomAnomalySpawner"; + + /// + /// The radio channel for science + /// + [DataField("scienceChannel", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string ScienceChannel = "Science"; + + /// + /// The sound looped while an anomaly generates + /// + [DataField("generatingSound")] + public SoundSpecifier? GeneratingSound; + + /// + /// Sound played on generation completion. + /// + [DataField("generatingFinishedSound")] + public SoundSpecifier? GeneratingFinishedSound; } diff --git a/Content.Server/Anomaly/Components/GeneratingAnomalyGeneratorComponent.cs b/Content.Server/Anomaly/Components/GeneratingAnomalyGeneratorComponent.cs new file mode 100644 index 0000000000..9e30d66c90 --- /dev/null +++ b/Content.Server/Anomaly/Components/GeneratingAnomalyGeneratorComponent.cs @@ -0,0 +1,16 @@ +using Robust.Shared.Audio; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; + +namespace Content.Server.Anomaly.Components; + +[RegisterComponent] +public sealed class GeneratingAnomalyGeneratorComponent : Component +{ + /// + /// When the generating period will end. + /// + [DataField("endTime", customTypeSerializer: typeof(TimeOffsetSerializer))] + public TimeSpan EndTime = TimeSpan.Zero; + + public IPlayingAudioStream? AudioStream; +} diff --git a/Content.Shared/Anomaly/SharedAnomaly.cs b/Content.Shared/Anomaly/SharedAnomaly.cs index 9ee1f847a9..cf94e2c6b1 100644 --- a/Content.Shared/Anomaly/SharedAnomaly.cs +++ b/Content.Shared/Anomaly/SharedAnomaly.cs @@ -48,6 +48,18 @@ public enum AnomalyVesselVisualLayers : byte Base } +[Serializable, NetSerializable] +public enum AnomalyGeneratorVisuals : byte +{ + Generating +} + +[Serializable, NetSerializable] +public enum AnomalyGeneratorVisualLayers : byte +{ + Base +} + [Serializable, NetSerializable] public enum AnomalyScannerUiKey : byte { diff --git a/Resources/Audio/Machines/anomaly_generate.ogg b/Resources/Audio/Machines/anomaly_generate.ogg new file mode 100644 index 0000000000..fd5384a2f5 Binary files /dev/null and b/Resources/Audio/Machines/anomaly_generate.ogg differ diff --git a/Resources/Audio/Machines/attributions.yml b/Resources/Audio/Machines/attributions.yml index 4ac0ac9cfb..4f47ff53be 100644 --- a/Resources/Audio/Machines/attributions.yml +++ b/Resources/Audio/Machines/attributions.yml @@ -1,3 +1,13 @@ +- files: ["anomaly_generate.ogg"] + license: "CC0-1.0" + copyright: "Created by szegvari, converted to mono and .ogg by EmoGarbage404 (github)." + source: "https://freesound.org/people/szegvari/sounds/536794/" + +- files: ["beep.ogg"] + license: "CC0-1.0" + copyright: "Created by dotY21." + source: "https://freesound.org/people/dotY21/sounds/330726/" + - files: ["vending_restock_start.ogg"] license: "CC0-1.0" copyright: "https://freesound.org/people/Defaultv/" diff --git a/Resources/Audio/Machines/beep.ogg b/Resources/Audio/Machines/beep.ogg new file mode 100644 index 0000000000..820f550781 Binary files /dev/null and b/Resources/Audio/Machines/beep.ogg differ diff --git a/Resources/Locale/en-US/anomaly/anomaly.ftl b/Resources/Locale/en-US/anomaly/anomaly.ftl index ae98207115..f9fa6d0639 100644 --- a/Resources/Locale/en-US/anomaly/anomaly.ftl +++ b/Resources/Locale/en-US/anomaly/anomaly.ftl @@ -30,4 +30,9 @@ anomaly-generator-cooldown = Cooldown: [color=gray]{$time}[/color] anomaly-generator-no-cooldown = Cooldown: [color=gray]Complete[/color] anomaly-generator-yes-fire = Status: [color=forestgreen]Ready[/color] anomaly-generator-no-fire = Status: [color=crimson]Not ready[/color] -anomaly-generator-generate = Generate Anomaly \ No newline at end of file +anomaly-generator-generate = Generate Anomaly +anomaly-generator-charges = {$charges -> + [one] {$charges} charge + *[other] {$charges} charges +} +anomaly-generator-announcement = An anomaly has been generated! \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Structures/Machines/anomaly_equipment.yml b/Resources/Prototypes/Entities/Structures/Machines/anomaly_equipment.yml index cfce5ca910..acc32a5195 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/anomaly_equipment.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/anomaly_equipment.yml @@ -196,6 +196,10 @@ - state: inserting visible: false map: ["enum.MaterialStorageVisualLayers.Inserting"] + - state: generating + visible: false + shader: unshaded + map: ["enum.AnomalyGeneratorVisualLayers.Base"] - type: Transform anchored: true - type: ApcPowerReceiver @@ -203,12 +207,16 @@ - type: ExtensionCableReceiver - type: AmbientSound range: 5 - volume: -3 + volume: -6 sound: path: /Audio/Ambience/Objects/anomaly_generator.ogg - type: Physics bodyType: Static - type: AnomalyGenerator + generatingSound: + path: /Audio/Machines/anomaly_generate.ogg + generatingFinishedSound: + path: /Audio/Machines/beep.ogg - type: MaterialStorage whitelist: tags: @@ -247,12 +255,19 @@ - key: enum.AnomalyGeneratorUiKey.Key type: AnomalyGeneratorBoundUserInterface - type: Appearance + - type: ActiveRadio + channels: + - Science - type: GenericVisualizer visuals: enum.PowerDeviceVisuals.Powered: enum.PowerDeviceVisualLayers.Powered: True: { visible: true } False: { visible: false } + enum.AnomalyGeneratorVisuals.Generating: + enum.AnomalyGeneratorVisualLayers.Base: + True: { visible: true } + False: { visible: false } - type: WiresVisuals - type: StaticPrice price: 5000 diff --git a/Resources/Textures/Structures/Machines/Anomaly/anomaly_generator.rsi/generating.png b/Resources/Textures/Structures/Machines/Anomaly/anomaly_generator.rsi/generating.png new file mode 100644 index 0000000000..e530750e10 Binary files /dev/null and b/Resources/Textures/Structures/Machines/Anomaly/anomaly_generator.rsi/generating.png differ diff --git a/Resources/Textures/Structures/Machines/Anomaly/anomaly_generator.rsi/meta.json b/Resources/Textures/Structures/Machines/Anomaly/anomaly_generator.rsi/meta.json index cd4793cdd2..a70802f017 100644 --- a/Resources/Textures/Structures/Machines/Anomaly/anomaly_generator.rsi/meta.json +++ b/Resources/Textures/Structures/Machines/Anomaly/anomaly_generator.rsi/meta.json @@ -7,6 +7,21 @@ "license":"CC0-1.0", "copyright":"Created by EmoGarbage", "states":[ + { + "name": "generating", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, { "name":"base" },