diff --git a/Content.Client/Anomaly/AnomalySystem.cs b/Content.Client/Anomaly/AnomalySystem.cs index c93f0ce94901..28c015f3021c 100644 --- a/Content.Client/Anomaly/AnomalySystem.cs +++ b/Content.Client/Anomaly/AnomalySystem.cs @@ -20,8 +20,9 @@ public override void Initialize() SubscribeLocalEvent(OnAppearanceChanged); SubscribeLocalEvent(OnStartup); SubscribeLocalEvent(OnAnimationComplete); - } + SubscribeLocalEvent(OnShutdown); + } private void OnStartup(EntityUid uid, AnomalyComponent component, ComponentStartup args) { _floating.FloatAnimation(uid, component.FloatingOffset, component.AnimationKey, component.AnimationTime); @@ -75,4 +76,13 @@ public override void Update(float frameTime) } } } + + private void OnShutdown(Entity ent, ref ComponentShutdown args) + { + if (!TryComp(ent, out var sprite)) + return; + + sprite.Scale = Vector2.One; + sprite.Color = sprite.Color.WithAlpha(1f); + } } diff --git a/Content.Client/Anomaly/Effects/ClientInnerBodySystem.cs b/Content.Client/Anomaly/Effects/ClientInnerBodySystem.cs new file mode 100644 index 000000000000..efb1a8d46e82 --- /dev/null +++ b/Content.Client/Anomaly/Effects/ClientInnerBodySystem.cs @@ -0,0 +1,50 @@ +using Content.Shared.Anomaly.Components; +using Content.Shared.Anomaly.Effects; +using Content.Shared.Body.Components; +using Robust.Client.GameObjects; + +namespace Content.Client.Anomaly.Effects; + +public sealed class ClientInnerBodyAnomalySystem : SharedInnerBodyAnomalySystem +{ + public override void Initialize() + { + SubscribeLocalEvent(OnAfterHandleState); + SubscribeLocalEvent(OnCompShutdown); + } + + private void OnAfterHandleState(Entity ent, ref AfterAutoHandleStateEvent args) + { + if (!TryComp(ent, out var sprite)) + return; + + if (ent.Comp.FallbackSprite is null) + return; + + if (!sprite.LayerMapTryGet(ent.Comp.LayerMap, out var index)) + index = sprite.LayerMapReserveBlank(ent.Comp.LayerMap); + + if (TryComp(ent, out var body) && + body.Prototype is not null && + ent.Comp.SpeciesSprites.TryGetValue(body.Prototype.Value, out var speciesSprite)) + { + sprite.LayerSetSprite(index, speciesSprite); + } + else + { + sprite.LayerSetSprite(index, ent.Comp.FallbackSprite); + } + + sprite.LayerSetVisible(index, true); + sprite.LayerSetShader(index, "unshaded"); + } + + private void OnCompShutdown(Entity ent, ref ComponentShutdown args) + { + if (!TryComp(ent, out var sprite)) + return; + + var index = sprite.LayerMapGet(ent.Comp.LayerMap); + sprite.LayerSetVisible(index, false); + } +} diff --git a/Content.Client/Audio/AmbientSoundSystem.cs b/Content.Client/Audio/AmbientSoundSystem.cs index ca6336b91b85..b525747aa9cd 100644 --- a/Content.Client/Audio/AmbientSoundSystem.cs +++ b/Content.Client/Audio/AmbientSoundSystem.cs @@ -306,6 +306,9 @@ private void ProcessNearbyAmbience(TransformComponent playerXform) .WithMaxDistance(comp.Range); var stream = _audio.PlayEntity(comp.Sound, Filter.Local(), uid, false, audioParams); + if (stream == null) + continue; + _playingSounds[sourceEntity] = (stream.Value.Entity, comp.Sound, key); playingCount++; diff --git a/Content.Client/Audio/ClientGlobalSoundSystem.cs b/Content.Client/Audio/ClientGlobalSoundSystem.cs index 7c77865f7415..50c3971d95ad 100644 --- a/Content.Client/Audio/ClientGlobalSoundSystem.cs +++ b/Content.Client/Audio/ClientGlobalSoundSystem.cs @@ -67,7 +67,7 @@ private void PlayAdminSound(AdminSoundEvent soundEvent) if(!_adminAudioEnabled) return; var stream = _audio.PlayGlobal(soundEvent.Filename, Filter.Local(), false, soundEvent.AudioParams); - _adminAudio.Add(stream.Value.Entity); + _adminAudio.Add(stream?.Entity); } private void PlayStationEventMusic(StationEventMusicEvent soundEvent) @@ -76,7 +76,7 @@ private void PlayStationEventMusic(StationEventMusicEvent soundEvent) if(!_eventAudioEnabled || _eventAudio.ContainsKey(soundEvent.Type)) return; var stream = _audio.PlayGlobal(soundEvent.Filename, Filter.Local(), false, soundEvent.AudioParams); - _eventAudio.Add(soundEvent.Type, stream.Value.Entity); + _eventAudio.Add(soundEvent.Type, stream?.Entity); } private void PlayGameSound(GameGlobalSoundEvent soundEvent) diff --git a/Content.Client/Audio/ContentAudioSystem.AmbientMusic.cs b/Content.Client/Audio/ContentAudioSystem.AmbientMusic.cs index d60c978ccf5c..bf7ab26cba25 100644 --- a/Content.Client/Audio/ContentAudioSystem.AmbientMusic.cs +++ b/Content.Client/Audio/ContentAudioSystem.AmbientMusic.cs @@ -213,9 +213,9 @@ private void UpdateAmbientMusic() false, AudioParams.Default.WithVolume(_musicProto.Sound.Params.Volume + _volumeSlider)); - _ambientMusicStream = strim.Value.Entity; + _ambientMusicStream = strim?.Entity; - if (_musicProto.FadeIn) + if (_musicProto.FadeIn && strim != null) { FadeIn(_ambientMusicStream, strim.Value.Component, AmbientMusicFadeTime); } diff --git a/Content.Client/Audio/ContentAudioSystem.LobbyMusic.cs b/Content.Client/Audio/ContentAudioSystem.LobbyMusic.cs index 92c5b7a41915..9864dbcb2a91 100644 --- a/Content.Client/Audio/ContentAudioSystem.LobbyMusic.cs +++ b/Content.Client/Audio/ContentAudioSystem.LobbyMusic.cs @@ -185,7 +185,7 @@ private void PlaySoundtrack(string soundtrackFilename) false, _lobbySoundtrackParams.WithVolume(_lobbySoundtrackParams.Volume + SharedAudioSystem.GainToVolume(_configManager.GetCVar(CCVars.LobbyMusicVolume))) ); - if (playResult.Value.Entity == default) + if (playResult == null) { _sawmill.Warning( $"Tried to play lobby soundtrack '{{Filename}}' using {nameof(SharedAudioSystem)}.{nameof(SharedAudioSystem.PlayGlobal)} but it returned default value of EntityUid!", diff --git a/Content.Client/Examine/ExamineSystem.cs b/Content.Client/Examine/ExamineSystem.cs index a941f0acff97..1c1f1984de4e 100644 --- a/Content.Client/Examine/ExamineSystem.cs +++ b/Content.Client/Examine/ExamineSystem.cs @@ -1,7 +1,12 @@ +using System.Linq; +using System.Numerics; +using System.Threading; using Content.Client.Verbs; using Content.Shared.Examine; using Content.Shared.IdentityManagement; using Content.Shared.Input; +using Content.Shared.Interaction.Events; +using Content.Shared.Item; using Content.Shared.Verbs; using JetBrains.Annotations; using Robust.Client.GameObjects; @@ -12,13 +17,8 @@ using Robust.Shared.Input.Binding; using Robust.Shared.Map; using Robust.Shared.Utility; -using System.Linq; -using System.Numerics; -using System.Threading; using static Content.Shared.Interaction.SharedInteractionSystem; using static Robust.Client.UserInterface.Controls.BoxContainer; -using Content.Shared.Interaction.Events; -using Content.Shared.Item; using Direction = Robust.Shared.Maths.Direction; namespace Content.Client.Examine @@ -35,7 +35,6 @@ public sealed class ExamineSystem : ExamineSystemShared private EntityUid _examinedEntity; private EntityUid _lastExaminedEntity; - private EntityUid _playerEntity; private Popup? _examineTooltipOpen; private ScreenCoordinates _popupPos; private CancellationTokenSource? _requestCancelTokenSource; @@ -74,9 +73,9 @@ private void OnExaminedItemDropped(EntityUid item, ItemComponent comp, DroppedEv public override void Update(float frameTime) { if (_examineTooltipOpen is not {Visible: true}) return; - if (!_examinedEntity.Valid || !_playerEntity.Valid) return; + if (!_examinedEntity.Valid || _playerManager.LocalEntity is not { } player) return; - if (!CanExamine(_playerEntity, _examinedEntity)) + if (!CanExamine(player, _examinedEntity)) CloseTooltip(); } @@ -114,9 +113,8 @@ private bool HandleExamine(in PointerInputCmdHandler.PointerInputCmdArgs args) return false; } - _playerEntity = _playerManager.LocalEntity ?? default; - - if (_playerEntity == default || !CanExamine(_playerEntity, entity)) + if (_playerManager.LocalEntity is not { } player || + !CanExamine(player, entity)) { return false; } diff --git a/Content.Client/Traits/ParacusiaSystem.cs b/Content.Client/Traits/ParacusiaSystem.cs index 3789f24cb0d0..af4d8ef278fa 100644 --- a/Content.Client/Traits/ParacusiaSystem.cs +++ b/Content.Client/Traits/ParacusiaSystem.cs @@ -69,7 +69,7 @@ private void PlayParacusiaSounds(EntityUid uid) var newCoords = Transform(uid).Coordinates.Offset(randomOffset); // Play the sound - paracusia.Stream = _audio.PlayStatic(paracusia.Sounds, uid, newCoords).Value.Entity; + paracusia.Stream = _audio.PlayStatic(paracusia.Sounds, uid, newCoords)?.Entity; } } diff --git a/Content.Client/Weather/WeatherSystem.cs b/Content.Client/Weather/WeatherSystem.cs index a0e8a44f40be..975831392cb7 100644 --- a/Content.Client/Weather/WeatherSystem.cs +++ b/Content.Client/Weather/WeatherSystem.cs @@ -47,10 +47,11 @@ protected override void Run(EntityUid uid, WeatherData weather, WeatherPrototype if (!Timing.IsFirstTimePredicted || weatherProto.Sound == null) return; - weather.Stream ??= _audio.PlayGlobal(weatherProto.Sound, Filter.Local(), true).Value.Entity; + weather.Stream ??= _audio.PlayGlobal(weatherProto.Sound, Filter.Local(), true)?.Entity; + + if (!TryComp(weather.Stream, out AudioComponent? comp)) + return; - var stream = weather.Stream.Value; - var comp = Comp(stream); var occlusion = 0f; // Work out tiles nearby to determine volume. @@ -115,7 +116,7 @@ protected override void Run(EntityUid uid, WeatherData weather, WeatherPrototype var alpha = GetPercent(weather, uid); alpha *= SharedAudioSystem.VolumeToGain(weatherProto.Sound.Params.Volume); - _audio.SetGain(stream, alpha, comp); + _audio.SetGain(weather.Stream, alpha, comp); comp.Occlusion = occlusion; } diff --git a/Content.Server/Anomaly/AnomalySynchronizerSystem.cs b/Content.Server/Anomaly/AnomalySynchronizerSystem.cs index 59ef08402ee2..b1814c2741d0 100644 --- a/Content.Server/Anomaly/AnomalySynchronizerSystem.cs +++ b/Content.Server/Anomaly/AnomalySynchronizerSystem.cs @@ -1,4 +1,5 @@ using System.Linq; +using System.Numerics; using Content.Server.Anomaly.Components; using Content.Server.DeviceLinking.Systems; using Content.Server.Power.Components; @@ -10,6 +11,7 @@ using Content.Shared.Power; using Robust.Shared.Audio.Systems; using Content.Shared.Verbs; +using Robust.Shared.Timing; namespace Content.Server.Anomaly; @@ -25,6 +27,7 @@ public sealed partial class AnomalySynchronizerSystem : EntitySystem [Dependency] private readonly SharedTransformSystem _transform = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; [Dependency] private readonly PowerReceiverSystem _power = default!; + [Dependency] private readonly IGameTiming _timing = default!; public override void Initialize() { @@ -40,6 +43,34 @@ public override void Initialize() SubscribeLocalEvent(OnAnomalyStabilityChanged); } + public override void Update(float frameTime) + { + base.Update(frameTime); + + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var sync, out var xform)) + { + if (sync.ConnectedAnomaly is null) + continue; + + if (_timing.CurTime < sync.NextCheckTime) + continue; + sync.NextCheckTime += sync.CheckFrequency; + + if (Transform(sync.ConnectedAnomaly.Value).MapUid != Transform(uid).MapUid) + { + DisconnectFromAnomaly((uid, sync), sync.ConnectedAnomaly.Value); + continue; + } + + if (!xform.Coordinates.TryDistance(EntityManager, Transform(sync.ConnectedAnomaly.Value).Coordinates, out var distance)) + continue; + + if (distance > sync.AttachRange) + DisconnectFromAnomaly((uid, sync), sync.ConnectedAnomaly.Value); + } + } + /// /// If powered, try to attach a nearby anomaly. /// @@ -73,10 +104,10 @@ private void OnPowerChanged(Entity ent, ref PowerC if (args.Powered) return; - if (!TryComp(ent.Comp.ConnectedAnomaly, out var anomaly)) + if (ent.Comp.ConnectedAnomaly is null) return; - DisconnectFromAnomaly(ent, anomaly); + DisconnectFromAnomaly(ent, ent.Comp.ConnectedAnomaly.Value); } private void OnExamined(Entity ent, ref ExaminedEvent args) @@ -125,13 +156,16 @@ private void ConnectToAnomaly(Entity ent, Entity ent, AnomalyComponent anomaly) + private void DisconnectFromAnomaly(Entity ent, EntityUid other) { if (ent.Comp.ConnectedAnomaly == null) return; - if (ent.Comp.PulseOnDisconnect) - _anomaly.DoAnomalyPulse(ent.Comp.ConnectedAnomaly.Value, anomaly); + if (TryComp(other, out var anomaly)) + { + if (ent.Comp.PulseOnDisconnect) + _anomaly.DoAnomalyPulse(ent.Comp.ConnectedAnomaly.Value, anomaly); + } _popup.PopupEntity(Loc.GetString("anomaly-sync-disconnected"), ent, PopupType.Large); _audio.PlayPvs(ent.Comp.ConnectedSound, ent); diff --git a/Content.Server/Anomaly/AnomalySystem.cs b/Content.Server/Anomaly/AnomalySystem.cs index 3e9760a056c0..b0de3de8f3e5 100644 --- a/Content.Server/Anomaly/AnomalySystem.cs +++ b/Content.Server/Anomaly/AnomalySystem.cs @@ -55,6 +55,7 @@ public override void Initialize() SubscribeLocalEvent(OnShutdown); SubscribeLocalEvent(OnStartCollide); + InitializeGenerator(); InitializeScanner(); InitializeVessel(); @@ -86,7 +87,10 @@ public void ShuffleParticlesEffect(Entity anomaly) private void OnShutdown(Entity anomaly, ref ComponentShutdown args) { - EndAnomaly(anomaly); + if (anomaly.Comp.CurrentBehavior is not null) + RemoveBehavior(anomaly, anomaly.Comp.CurrentBehavior.Value); + + EndAnomaly(anomaly, spawnCore: false); } private void OnStartCollide(Entity anomaly, ref StartCollideEvent args) diff --git a/Content.Server/Anomaly/Components/AnomalySynchronizerComponent.cs b/Content.Server/Anomaly/Components/AnomalySynchronizerComponent.cs index 235e740cf358..3127f091e553 100644 --- a/Content.Server/Anomaly/Components/AnomalySynchronizerComponent.cs +++ b/Content.Server/Anomaly/Components/AnomalySynchronizerComponent.cs @@ -7,7 +7,7 @@ namespace Content.Server.Anomaly.Components; /// /// a device that allows you to translate anomaly activity into multitool signals. /// -[RegisterComponent, Access(typeof(AnomalySynchronizerSystem))] +[RegisterComponent, AutoGenerateComponentPause, Access(typeof(AnomalySynchronizerSystem))] public sealed partial class AnomalySynchronizerComponent : Component { /// @@ -34,6 +34,15 @@ public sealed partial class AnomalySynchronizerComponent : Component [DataField] public float AttachRange = 0.4f; + /// + /// Periodicheski checks to see if the anomaly has moved to disconnect it. + /// + [DataField] + public TimeSpan CheckFrequency = TimeSpan.FromSeconds(1f); + + [DataField, AutoPausedField] + public TimeSpan NextCheckTime = TimeSpan.Zero; + [DataField] public ProtoId DecayingPort = "Decaying"; diff --git a/Content.Server/Anomaly/Effects/InnerBodyAnomalySystem.cs b/Content.Server/Anomaly/Effects/InnerBodyAnomalySystem.cs new file mode 100644 index 000000000000..38c4c51d8745 --- /dev/null +++ b/Content.Server/Anomaly/Effects/InnerBodyAnomalySystem.cs @@ -0,0 +1,236 @@ +using Content.Server.Administration.Logs; +using Content.Server.Body.Systems; +using Content.Server.Chat.Managers; +using Content.Server.Jittering; +using Content.Server.Mind; +using Content.Server.Stunnable; +using Content.Shared.Actions; +using Content.Shared.Anomaly; +using Content.Shared.Anomaly.Components; +using Content.Shared.Anomaly.Effects; +using Content.Shared.Body.Components; +using Content.Shared.Chat; +using Content.Shared.Database; +using Content.Shared.Mobs; +using Content.Shared.Popups; +using Content.Shared.Whitelist; +using Robust.Shared.Audio.Systems; +using Robust.Shared.Physics.Events; +using Robust.Shared.Prototypes; + +namespace Content.Server.Anomaly.Effects; + +public sealed class InnerBodyAnomalySystem : SharedInnerBodyAnomalySystem +{ + [Dependency] private readonly IAdminLogManager _adminLog = default!; + [Dependency] private readonly AnomalySystem _anomaly = default!; + [Dependency] private readonly ActionContainerSystem _actionContainer = default!; + [Dependency] private readonly SharedActionsSystem _actions = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] private readonly BodySystem _body = default!; + [Dependency] private readonly IChatManager _chat = default!; + [Dependency] private readonly EntityWhitelistSystem _whitelist = default!; + [Dependency] private readonly JitteringSystem _jitter = default!; + [Dependency] private readonly MindSystem _mind = default!; + [Dependency] private readonly SharedPopupSystem _popup = default!; + [Dependency] private readonly IPrototypeManager _proto = default!; + [Dependency] private readonly StunSystem _stun = default!; + + private readonly Color _messageColor = Color.FromSrgb(new Color(201, 22, 94)); + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnStartCollideInjector); + + SubscribeLocalEvent(OnMapInit); + SubscribeLocalEvent(OnCompShutdown); + + SubscribeLocalEvent(OnAnomalyPulse); + SubscribeLocalEvent(OnAnomalyShutdown); + SubscribeLocalEvent(OnAnomalySupercritical); + SubscribeLocalEvent(OnSeverityChanged); + + SubscribeLocalEvent(OnMobStateChanged); + + SubscribeLocalEvent(OnActionPulse); + } + + private void OnActionPulse(Entity ent, ref ActionAnomalyPulseEvent args) + { + if (args.Handled) + return; + + _anomaly.DoAnomalyPulse(ent, ent.Comp); + + args.Handled = true; + } + + private void OnStartCollideInjector(Entity ent, ref StartCollideEvent args) + { + if (ent.Comp.Whitelist is not null && !_whitelist.IsValid(ent.Comp.Whitelist, args.OtherEntity)) + return; + if (TryComp(args.OtherEntity, out var innerAnom) && innerAnom.Injected) + return; + if (!_mind.TryGetMind(args.OtherEntity, out _, out var mindComponent)) + return; + + EntityManager.AddComponents(args.OtherEntity, ent.Comp.InjectionComponents); + QueueDel(ent); + } + + private void OnMapInit(Entity ent, ref MapInitEvent args) + { + AddAnomalyToBody(ent); + } + + private void AddAnomalyToBody(Entity ent) + { + if (!_proto.TryIndex(ent.Comp.InjectionProto, out var injectedAnom)) + return; + + if (ent.Comp.Injected) + return; + + ent.Comp.Injected = true; + + EntityManager.AddComponents(ent, injectedAnom.Components); + + _stun.TryParalyze(ent, TimeSpan.FromSeconds(ent.Comp.StunDuration), true); + _jitter.DoJitter(ent, TimeSpan.FromSeconds(ent.Comp.StunDuration), true); + + if (ent.Comp.StartSound is not null) + _audio.PlayPvs(ent.Comp.StartSound, ent); + + if (ent.Comp.StartMessage is not null && + _mind.TryGetMind(ent, out _, out var mindComponent) && + mindComponent.Session != null) + { + var message = Loc.GetString(ent.Comp.StartMessage); + var wrappedMessage = Loc.GetString("chat-manager-server-wrap-message", ("message", message)); + _chat.ChatMessageToOne(ChatChannel.Server, + message, + wrappedMessage, + default, + false, + mindComponent.Session.Channel, + _messageColor); + + _popup.PopupEntity(message, ent, ent, PopupType.MediumCaution); + + _adminLog.Add(LogType.Anomaly,LogImpact.Extreme,$"{ToPrettyString(ent)} became anomaly host."); + } + Dirty(ent); + } + + private void OnAnomalyPulse(Entity ent, ref AnomalyPulseEvent args) + { + _stun.TryParalyze(ent, TimeSpan.FromSeconds(ent.Comp.StunDuration / 2 * args.Severity), true); + _jitter.DoJitter(ent, TimeSpan.FromSeconds(ent.Comp.StunDuration / 2 * args.Severity), true); + } + + private void OnAnomalySupercritical(Entity ent, ref AnomalySupercriticalEvent args) + { + if (!TryComp(ent, out var body)) + return; + + _body.GibBody(ent, true, body, splatModifier: 5f); + } + + private void OnSeverityChanged(Entity ent, ref AnomalySeverityChangedEvent args) + { + if (!_mind.TryGetMind(ent, out _, out var mindComponent) || mindComponent.Session == null) + return; + + var message = string.Empty; + + if (args.Severity >= 0.5 && ent.Comp.LastSeverityInformed < 0.5) + { + ent.Comp.LastSeverityInformed = 0.5f; + message = Loc.GetString("inner-anomaly-severity-info-50"); + } + if (args.Severity >= 0.75 && ent.Comp.LastSeverityInformed < 0.75) + { + ent.Comp.LastSeverityInformed = 0.75f; + message = Loc.GetString("inner-anomaly-severity-info-75"); + } + if (args.Severity >= 0.9 && ent.Comp.LastSeverityInformed < 0.9) + { + ent.Comp.LastSeverityInformed = 0.9f; + message = Loc.GetString("inner-anomaly-severity-info-90"); + } + if (args.Severity >= 1 && ent.Comp.LastSeverityInformed < 1) + { + ent.Comp.LastSeverityInformed = 1f; + message = Loc.GetString("inner-anomaly-severity-info-100"); + } + + if (message == string.Empty) + return; + + var wrappedMessage = Loc.GetString("chat-manager-server-wrap-message", ("message", message)); + _chat.ChatMessageToOne(ChatChannel.Server, + message, + wrappedMessage, + default, + false, + mindComponent.Session.Channel, + _messageColor); + + _popup.PopupEntity(message, ent, ent, PopupType.MediumCaution); + } + + private void OnMobStateChanged(Entity ent, ref MobStateChangedEvent args) + { + if (args.NewMobState != MobState.Dead) + return; + + _anomaly.ChangeAnomalyHealth(ent, -2); //Shutdown it + } + + private void OnAnomalyShutdown(Entity ent, ref AnomalyShutdownEvent args) + { + RemoveAnomalyFromBody(ent); + RemCompDeferred(ent); + } + + private void OnCompShutdown(Entity ent, ref ComponentShutdown args) + { + RemoveAnomalyFromBody(ent); + } + + private void RemoveAnomalyFromBody(Entity ent) + { + if (!ent.Comp.Injected) + return; + + if (_proto.TryIndex(ent.Comp.InjectionProto, out var injectedAnom)) + EntityManager.RemoveComponents(ent, injectedAnom.Components); + + _stun.TryParalyze(ent, TimeSpan.FromSeconds(ent.Comp.StunDuration), true); + + if (ent.Comp.EndMessage is not null && + _mind.TryGetMind(ent, out _, out var mindComponent) && + mindComponent.Session != null) + { + var message = Loc.GetString(ent.Comp.EndMessage); + var wrappedMessage = Loc.GetString("chat-manager-server-wrap-message", ("message", message)); + _chat.ChatMessageToOne(ChatChannel.Server, + message, + wrappedMessage, + default, + false, + mindComponent.Session.Channel, + _messageColor); + + + _popup.PopupEntity(message, ent, ent, PopupType.MediumCaution); + + _adminLog.Add(LogType.Anomaly, LogImpact.Medium,$"{ToPrettyString(ent)} is no longer a host for the anomaly."); + } + + ent.Comp.Injected = false; + RemCompDeferred(ent); + } +} diff --git a/Content.Server/Anomaly/Effects/TechAnomalySystem.cs b/Content.Server/Anomaly/Effects/TechAnomalySystem.cs index 1b2849f1d77e..3e4d101f4fdf 100644 --- a/Content.Server/Anomaly/Effects/TechAnomalySystem.cs +++ b/Content.Server/Anomaly/Effects/TechAnomalySystem.cs @@ -37,7 +37,7 @@ public override void Update(float frameTime) if (_timing.CurTime < tech.NextTimer) continue; - tech.NextTimer += TimeSpan.FromSeconds(tech.TimerFrequency * anom.Stability); + tech.NextTimer += TimeSpan.FromSeconds(tech.TimerFrequency); _signal.InvokePort(uid, tech.TimerPort); } diff --git a/Content.Server/Botany/SeedPrototype.cs b/Content.Server/Botany/SeedPrototype.cs index 7a3e08883ded..5608338f22e8 100644 --- a/Content.Server/Botany/SeedPrototype.cs +++ b/Content.Server/Botany/SeedPrototype.cs @@ -291,12 +291,13 @@ public SeedData Clone() CanScream = CanScream, TurnIntoKudzu = TurnIntoKudzu, SplatPrototype = SplatPrototype, - Mutations = Mutations, + Mutations = new List(), // Newly cloned seed is unique. No need to unnecessarily clone if repeatedly modified. Unique = true, }; + newSeed.Mutations.AddRange(Mutations); return newSeed; } diff --git a/Content.Server/Engineering/EntitySystems/SpawnAfterInteractSystem.cs b/Content.Server/Engineering/EntitySystems/SpawnAfterInteractSystem.cs index 8391e8faada5..407f877515aa 100644 --- a/Content.Server/Engineering/EntitySystems/SpawnAfterInteractSystem.cs +++ b/Content.Server/Engineering/EntitySystems/SpawnAfterInteractSystem.cs @@ -4,6 +4,7 @@ using Content.Shared.DoAfter; using Content.Shared.Interaction; using Content.Shared.Maps; +using Content.Shared.Physics; using Content.Shared.Stacks; using JetBrains.Annotations; using Robust.Shared.Map.Components; @@ -15,6 +16,7 @@ public sealed class SpawnAfterInteractSystem : EntitySystem { [Dependency] private readonly SharedDoAfterSystem _doAfterSystem = default!; [Dependency] private readonly StackSystem _stackSystem = default!; + [Dependency] private readonly TurfSystem _turfSystem = default!; public override void Initialize() { @@ -36,7 +38,7 @@ private async void HandleAfterInteract(EntityUid uid, SpawnAfterInteractComponen bool IsTileClear() { - return tileRef.Tile.IsEmpty == false && !tileRef.IsBlockedTurf(true); + return tileRef.Tile.IsEmpty == false && !_turfSystem.IsTileBlocked(tileRef, CollisionGroup.MobMask); } if (!IsTileClear()) diff --git a/Content.Server/Explosion/EntitySystems/TriggerSystem.cs b/Content.Server/Explosion/EntitySystems/TriggerSystem.cs index 8be97a528228..71ed4f7617f6 100644 --- a/Content.Server/Explosion/EntitySystems/TriggerSystem.cs +++ b/Content.Server/Explosion/EntitySystems/TriggerSystem.cs @@ -202,6 +202,7 @@ private void HandleGibTrigger(EntityUid uid, GibOnTriggerComponent component, Tr args.Handled = true; } + private void HandleRattleTrigger(EntityUid uid, RattleComponent component, TriggerEvent args) { if (!TryComp(uid, out var implanted)) @@ -230,7 +231,7 @@ private void HandleRattleTrigger(EntityUid uid, RattleComponent component, Trigg private void OnTriggerCollide(EntityUid uid, TriggerOnCollideComponent component, ref StartCollideEvent args) { if (args.OurFixtureId == component.FixtureID && (!component.IgnoreOtherNonHard || args.OtherFixture.Hard)) - Trigger(uid); + Trigger(uid, args.OtherEntity); } private void OnSpawnTriggered(EntityUid uid, TriggerOnSpawnComponent component, MapInitEvent args) diff --git a/Content.Server/Kitchen/EntitySystems/MicrowaveSystem.cs b/Content.Server/Kitchen/EntitySystems/MicrowaveSystem.cs index 9f43f760185f..1ac02ac88258 100644 --- a/Content.Server/Kitchen/EntitySystems/MicrowaveSystem.cs +++ b/Content.Server/Kitchen/EntitySystems/MicrowaveSystem.cs @@ -112,7 +112,7 @@ private void OnCookStart(Entity ent, ref ComponentStar SetAppearance(ent.Owner, MicrowaveVisualState.Cooking, microwaveComponent); microwaveComponent.PlayingStream = - _audio.PlayPvs(microwaveComponent.LoopingSound, ent, AudioParams.Default.WithLoop(true).WithMaxDistance(5)).Value.Entity; + _audio.PlayPvs(microwaveComponent.LoopingSound, ent, AudioParams.Default.WithLoop(true).WithMaxDistance(5))?.Entity; } private void OnCookStop(Entity ent, ref ComponentShutdown args) diff --git a/Content.Server/Kitchen/EntitySystems/ReagentGrinderSystem.cs b/Content.Server/Kitchen/EntitySystems/ReagentGrinderSystem.cs index e5dd154e44f3..3a78f14253f7 100644 --- a/Content.Server/Kitchen/EntitySystems/ReagentGrinderSystem.cs +++ b/Content.Server/Kitchen/EntitySystems/ReagentGrinderSystem.cs @@ -313,7 +313,7 @@ private void DoWork(EntityUid uid, ReagentGrinderComponent reagentGrinder, Grind active.Program = program; reagentGrinder.AudioStream = _audioSystem.PlayPvs(sound, uid, - AudioParams.Default.WithPitchScale(1 / reagentGrinder.WorkTimeMultiplier)).Value.Entity; //slightly higher pitched + AudioParams.Default.WithPitchScale(1 / reagentGrinder.WorkTimeMultiplier))?.Entity; //slightly higher pitched _userInterfaceSystem.ServerSendUiMessage(uid, ReagentGrinderUiKey.Key, new ReagentGrinderWorkStartedMessage(program)); } diff --git a/Content.Server/Mech/Equipment/EntitySystems/MechGrabberSystem.cs b/Content.Server/Mech/Equipment/EntitySystems/MechGrabberSystem.cs index aa28a8063c0d..08120f5c296f 100644 --- a/Content.Server/Mech/Equipment/EntitySystems/MechGrabberSystem.cs +++ b/Content.Server/Mech/Equipment/EntitySystems/MechGrabberSystem.cs @@ -155,7 +155,7 @@ private void OnInteract(EntityUid uid, MechGrabberComponent component, UserActiv return; args.Handled = true; - component.AudioStream = _audio.PlayPvs(component.GrabSound, uid).Value.Entity; + component.AudioStream = _audio.PlayPvs(component.GrabSound, uid)?.Entity; var doAfterArgs = new DoAfterArgs(EntityManager, args.User, component.GrabDelay, new GrabberDoAfterEvent(), uid, target: target, used: uid) { BreakOnMove = true diff --git a/Content.Server/Objectives/Systems/StealConditionSystem.cs b/Content.Server/Objectives/Systems/StealConditionSystem.cs index 2c9244cf7d5f..be34a80fe348 100644 --- a/Content.Server/Objectives/Systems/StealConditionSystem.cs +++ b/Content.Server/Objectives/Systems/StealConditionSystem.cs @@ -72,14 +72,15 @@ private void OnAssigned(Entity condition, ref Objective private void OnAfterAssign(Entity condition, ref ObjectiveAfterAssignEvent args) { var group = _proto.Index(condition.Comp.StealGroup); + string localizedName = Loc.GetString(group.Name); var title =condition.Comp.OwnerText == null - ? Loc.GetString(condition.Comp.ObjectiveNoOwnerText, ("itemName", group.Name)) - : Loc.GetString(condition.Comp.ObjectiveText, ("owner", Loc.GetString(condition.Comp.OwnerText)), ("itemName", group.Name)); + ? Loc.GetString(condition.Comp.ObjectiveNoOwnerText, ("itemName", localizedName)) + : Loc.GetString(condition.Comp.ObjectiveText, ("owner", Loc.GetString(condition.Comp.OwnerText)), ("itemName", localizedName)); var description = condition.Comp.CollectionSize > 1 - ? Loc.GetString(condition.Comp.DescriptionMultiplyText, ("itemName", group.Name), ("count", condition.Comp.CollectionSize)) - : Loc.GetString(condition.Comp.DescriptionText, ("itemName", group.Name)); + ? Loc.GetString(condition.Comp.DescriptionMultiplyText, ("itemName", localizedName), ("count", condition.Comp.CollectionSize)) + : Loc.GetString(condition.Comp.DescriptionText, ("itemName", localizedName)); _metaData.SetEntityName(condition.Owner, title, args.Meta); _metaData.SetEntityDescription(condition.Owner, description, args.Meta); diff --git a/Content.Server/Respawn/SpecialRespawnSystem.cs b/Content.Server/Respawn/SpecialRespawnSystem.cs index 8c86449008ab..6d398db259db 100644 --- a/Content.Server/Respawn/SpecialRespawnSystem.cs +++ b/Content.Server/Respawn/SpecialRespawnSystem.cs @@ -2,16 +2,15 @@ using Content.Server.Atmos.EntitySystems; using Content.Server.Chat.Managers; using Content.Server.GameTicking; -using Content.Shared.Station.Components; -using Content.Server.Station.Systems; using Content.Shared.Database; using Content.Shared.Maps; using Content.Shared.Physics; using Content.Shared.Respawn; +using Content.Shared.Station.Components; using Robust.Shared.Map; using Robust.Shared.Map.Components; -using Robust.Shared.Random; using Robust.Shared.Prototypes; +using Robust.Shared.Random; namespace Content.Server.Respawn; @@ -179,7 +178,7 @@ public bool TryFindRandomTile(EntityUid targetGrid, EntityUid targetMap, int max foreach (var newTileRef in grid.GetTilesIntersecting(circle)) { - if (newTileRef.IsSpace(_tileDefinitionManager) || newTileRef.IsBlockedTurf(true) || !_atmosphere.IsTileMixtureProbablySafe(targetGrid, targetMap, mapTarget)) + if (newTileRef.IsSpace(_tileDefinitionManager) || _turf.IsTileBlocked(newTileRef, CollisionGroup.MobMask) || !_atmosphere.IsTileMixtureProbablySafe(targetGrid, targetMap, mapTarget)) continue; found = true; diff --git a/Content.Server/Salvage/SalvageSystem.Runner.cs b/Content.Server/Salvage/SalvageSystem.Runner.cs index 23a575413ed5..921d96670941 100644 --- a/Content.Server/Salvage/SalvageSystem.Runner.cs +++ b/Content.Server/Salvage/SalvageSystem.Runner.cs @@ -154,8 +154,8 @@ private void UpdateRunner() } else if (comp.Stream == null && remaining < audioLength) { - var audio = _audio.PlayPvs(comp.Sound, uid).Value; - comp.Stream = audio.Entity; + var audio = _audio.PlayPvs(comp.Sound, uid); + comp.Stream = audio?.Entity; _audio.SetMapAudio(audio); comp.Stage = ExpeditionStage.MusicCountdown; Dirty(uid, comp); diff --git a/Content.Server/Shuttles/Systems/ShuttleSystem.FasterThanLight.cs b/Content.Server/Shuttles/Systems/ShuttleSystem.FasterThanLight.cs index e544c1538d15..ce6a914847f9 100644 --- a/Content.Server/Shuttles/Systems/ShuttleSystem.FasterThanLight.cs +++ b/Content.Server/Shuttles/Systems/ShuttleSystem.FasterThanLight.cs @@ -397,7 +397,8 @@ private void UpdateFTLStarting(Entity entity) new EntityCoordinates(fromMapUid.Value, _mapSystem.GetGridPosition(entity.Owner)), true, startupAudio.Params); _audio.SetPlaybackPosition(clippedAudio, entity.Comp1.StartupTime); - clippedAudio.Value.Component.Flags |= AudioFlags.NoOcclusion; + if (clippedAudio != null) + clippedAudio.Value.Component.Flags |= AudioFlags.NoOcclusion; } // Offset the start by buffer range just to avoid overlap. diff --git a/Content.Shared/Anomaly/Components/AnomalyComponent.cs b/Content.Shared/Anomaly/Components/AnomalyComponent.cs index 724dfd38d2f6..e6228b5fb0d7 100644 --- a/Content.Shared/Anomaly/Components/AnomalyComponent.cs +++ b/Content.Shared/Anomaly/Components/AnomalyComponent.cs @@ -1,6 +1,6 @@ using System.Numerics; +using Content.Shared.Anomaly.Effects; using Content.Shared.Anomaly.Prototypes; -using Content.Shared.Damage; using Robust.Shared.Audio; using Robust.Shared.GameStates; using Robust.Shared.Prototypes; @@ -16,7 +16,7 @@ namespace Content.Shared.Anomaly.Components; /// Anomalies and their related components were designed here: https://hackmd.io/@ss14-design/r1sQbkJOs /// [RegisterComponent, NetworkedComponent, AutoGenerateComponentState, AutoGenerateComponentPause] -[Access(typeof(SharedAnomalySystem))] +[Access(typeof(SharedAnomalySystem), typeof(SharedInnerBodyAnomalySystem))] public sealed partial class AnomalyComponent : Component { /// @@ -184,21 +184,21 @@ public sealed partial class AnomalyComponent : Component /// /// The minimum amount of research points generated per second /// - [DataField("minPointsPerSecond")] + [DataField] public int MinPointsPerSecond = 10; /// /// The maximum amount of research points generated per second /// This doesn't include the point bonus for being unstable. /// - [DataField("maxPointsPerSecond")] + [DataField] public int MaxPointsPerSecond = 70; /// /// The multiplier applied to the point value for the /// anomaly being above the /// - [DataField("growingPointMultiplier")] + [DataField] public float GrowingPointMultiplier = 1.5f; #endregion @@ -252,10 +252,13 @@ public sealed partial class AnomalyComponent : Component /// [ViewVariables(VVAccess.ReadWrite)] [DataField("offset")] - public Vector2 FloatingOffset = new(0, 0.15f); + public Vector2 FloatingOffset = new(0, 0); public readonly string AnimationKey = "anomalyfloat"; #endregion + + [DataField] + public bool DeleteEntity = true; } /// diff --git a/Content.Shared/Anomaly/Components/InnerBodyAnomalyComponent.cs b/Content.Shared/Anomaly/Components/InnerBodyAnomalyComponent.cs new file mode 100644 index 000000000000..e88cedb18ef2 --- /dev/null +++ b/Content.Shared/Anomaly/Components/InnerBodyAnomalyComponent.cs @@ -0,0 +1,72 @@ +using Content.Shared.Anomaly.Effects; +using Content.Shared.Body.Prototypes; +using Robust.Shared.Audio; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; +using Robust.Shared.Utility; + +namespace Content.Shared.Anomaly.Components; + +/// +/// An anomaly within the body of a living being. Controls the ability to return to the standard state. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState(true), Access(typeof(SharedInnerBodyAnomalySystem))] +public sealed partial class InnerBodyAnomalyComponent : Component +{ + [DataField] + public bool Injected; + + /// + /// A prototype of an entity whose components will be added to the anomaly host **AND** then removed at the right time + /// + [DataField(required: true)] + public EntProtoId? InjectionProto; + + /// + /// Duration of stun from the effect of the anomaly + /// + [DataField] + public float StunDuration = 4f; + + /// + /// A message sent in chat to a player who has become infected by an anomaly + /// + [DataField] + public LocId? StartMessage = null; + + /// + /// A message sent in chat to a player who has cleared an anomaly + /// + [DataField] + public LocId? EndMessage = "inner-anomaly-end-message"; + + /// + /// Sound, playing on becoming anomaly + /// + [DataField] + public SoundSpecifier? StartSound = new SoundPathSpecifier("/Audio/Effects/inneranomaly.ogg"); + + /// + /// Used to display messages to the player about their level of disease progression + /// + [DataField] + public float LastSeverityInformed = 0f; + + /// + /// The fallback sprite to be added on the original entity. Allows you to visually identify the feature and type of anomaly to other players + /// + [DataField, AutoNetworkedField] + public SpriteSpecifier? FallbackSprite = null; + + /// + /// Ability to use unique sprites for different body types + /// + [DataField, AutoNetworkedField] + public Dictionary, SpriteSpecifier> SpeciesSprites = new(); + + /// + /// The key of the entity layer into which the sprite will be inserted + /// + [DataField] + public string LayerMap = "inner_anomaly_layer"; +} diff --git a/Content.Shared/Anomaly/Components/InnerBodyAnomalyInjectorComponent.cs b/Content.Shared/Anomaly/Components/InnerBodyAnomalyInjectorComponent.cs new file mode 100644 index 000000000000..e4c398c9cc59 --- /dev/null +++ b/Content.Shared/Anomaly/Components/InnerBodyAnomalyInjectorComponent.cs @@ -0,0 +1,21 @@ +using Content.Shared.Anomaly.Effects; +using Content.Shared.Whitelist; +using Robust.Shared.Prototypes; + +namespace Content.Shared.Anomaly.Components; + +/// +/// On contact with an entity, if it meets the conditions, it will transfer the specified components to it +/// +[RegisterComponent, Access(typeof(SharedInnerBodyAnomalySystem))] +public sealed partial class InnerBodyAnomalyInjectorComponent : Component +{ + [DataField] + public EntityWhitelist? Whitelist; + + /// + /// components that will be automatically removed after “curing” + /// + [DataField(required: true)] + public ComponentRegistry InjectionComponents = default!; +} diff --git a/Content.Shared/Anomaly/Effects/SharedInnerBodyAnomalySystem.cs b/Content.Shared/Anomaly/Effects/SharedInnerBodyAnomalySystem.cs new file mode 100644 index 000000000000..a1ec7cd3973b --- /dev/null +++ b/Content.Shared/Anomaly/Effects/SharedInnerBodyAnomalySystem.cs @@ -0,0 +1,5 @@ +namespace Content.Shared.Anomaly.Effects; + +public abstract class SharedInnerBodyAnomalySystem : EntitySystem +{ +} diff --git a/Content.Shared/Anomaly/SharedAnomalySystem.cs b/Content.Shared/Anomaly/SharedAnomalySystem.cs index c3d6591b7252..07beb1444d76 100644 --- a/Content.Shared/Anomaly/SharedAnomalySystem.cs +++ b/Content.Shared/Anomaly/SharedAnomalySystem.cs @@ -1,13 +1,10 @@ using Content.Shared.Administration.Logs; using Content.Shared.Anomaly.Components; using Content.Shared.Anomaly.Prototypes; -using Content.Shared.Damage; using Content.Shared.Database; -using Content.Shared.Interaction; using Content.Shared.Physics; using Content.Shared.Popups; using Content.Shared.Weapons.Melee.Components; -using Content.Shared.Weapons.Melee.Events; using Robust.Shared.Audio.Systems; using Robust.Shared.Map; using Robust.Shared.Map.Components; @@ -21,6 +18,7 @@ using Robust.Shared.Utility; using System.Linq; using System.Numerics; +using Content.Shared.Actions; namespace Content.Shared.Anomaly; @@ -36,6 +34,7 @@ public abstract class SharedAnomalySystem : EntitySystem [Dependency] protected readonly SharedPopupSystem Popup = default!; [Dependency] private readonly IPrototypeManager _prototype = default!; [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly SharedTransformSystem _transform = default!; public override void Initialize() { @@ -145,7 +144,7 @@ public void DoAnomalySupercriticalEvent(EntityUid uid, AnomalyComponent? compone if (!Timing.IsFirstTimePredicted) return; - Audio.PlayPvs(component.SupercriticalSound, uid); + Audio.PlayPvs(component.SupercriticalSound, Transform(uid).Coordinates); if (_net.IsServer) Log.Info($"Raising supercritical event. Entity: {ToPrettyString(uid)}"); @@ -169,7 +168,8 @@ public void DoAnomalySupercriticalEvent(EntityUid uid, AnomalyComponent? compone /// The anomaly being shut down /// /// Whether or not the anomaly ended via supercritical event - public void EndAnomaly(EntityUid uid, AnomalyComponent? component = null, bool supercritical = false) + /// Create anomaly cores based on the result of completing an anomaly? + public void EndAnomaly(EntityUid uid, AnomalyComponent? component = null, bool supercritical = false, bool spawnCore = true) { // Logging before resolve, in case the anomaly has deleted itself. if (_net.IsServer) @@ -186,9 +186,16 @@ public void EndAnomaly(EntityUid uid, AnomalyComponent? component = null, bool s if (Terminating(uid) || _net.IsClient) return; - Spawn(supercritical ? component.CorePrototype : component.CoreInertPrototype, Transform(uid).Coordinates); + if (spawnCore) + { + var core = Spawn(supercritical ? component.CorePrototype : component.CoreInertPrototype, Transform(uid).Coordinates); + _transform.PlaceNextTo(core, uid); + } - QueueDel(uid); + if (component.DeleteEntity) + QueueDel(uid); + else + RemCompDeferred(uid); } /// @@ -458,3 +465,5 @@ public partial record struct AnomalySpawnSettings() /// public bool SpawnOnSeverityChanged { get; set; } = false; } + +public sealed partial class ActionAnomalyPulseEvent : InstantActionEvent { } diff --git a/Content.Shared/Objectives/Prototypes/StealTargetGroupPrototype.cs b/Content.Shared/Objectives/Prototypes/StealTargetGroupPrototype.cs index 2730acb9acac..bc2af0eb092a 100644 --- a/Content.Shared/Objectives/Prototypes/StealTargetGroupPrototype.cs +++ b/Content.Shared/Objectives/Prototypes/StealTargetGroupPrototype.cs @@ -10,6 +10,6 @@ namespace Content.Shared.Objectives; public sealed partial class StealTargetGroupPrototype : IPrototype { [IdDataField] public string ID { get; private set; } = default!; - [DataField] public string Name { get; private set; } = string.Empty; + [DataField] public LocId Name { get; private set; } = string.Empty; [DataField] public SpriteSpecifier Sprite { get; private set; } = SpriteSpecifier.Invalid; } diff --git a/Resources/Audio/Effects/attributions.yml b/Resources/Audio/Effects/attributions.yml index 0f001991532a..46f6043497fa 100644 --- a/Resources/Audio/Effects/attributions.yml +++ b/Resources/Audio/Effects/attributions.yml @@ -232,7 +232,12 @@ license: "CC-BY-SA-3.0" source: https://github.com/YuriyKiss/space-station-14/commit/971a135a9c83aed46e967aac9302ab5b35562b5f +- files: [inneranomaly.ogg] + copyright: 'created by waveplaySFX on Freesound' + license: "CC0-1.0" + source: https://freesound.org/people/waveplaySFX/sounds/553744/ + - files: [changeling_shriek.ogg] copyright: whateverusername0 license: CC-BY-SA-3.0 - source: https://github.com/whateverusername0/space-station-14-wizden/blob/ling/Resources/Audio/Effects/changeling_shriek.ogg \ No newline at end of file + source: https://github.com/whateverusername0/space-station-14-wizden/blob/ling/Resources/Audio/Effects/changeling_shriek.ogg diff --git a/Resources/Audio/Effects/inneranomaly.ogg b/Resources/Audio/Effects/inneranomaly.ogg new file mode 100644 index 000000000000..43fc40357f20 Binary files /dev/null and b/Resources/Audio/Effects/inneranomaly.ogg differ diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index da0ac0a1c01b..11609a0efc96 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,76 +1,4 @@ Entries: -- author: EmoGarbage404 - changes: - - message: Changed AME power output. Lower injection amounts now produce more power - but further injections have diminishing returns. - type: Tweak - - message: Increased damage per injection overclocked AMEs. - type: Tweak - - message: Halved fuel per AME jar. - type: Tweak - id: 6882 - time: '2024-07-07T14:27:52.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/29587 -- author: Plykiya - changes: - - message: Hyperzine's effective healing range has been changed from 70 to 120, - to anything above 70 total damage. - type: Tweak - id: 6883 - time: '2024-07-07T14:28:13.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/29712 -- author: Tayrtahn - changes: - - message: Fixed admin ghosts briefly becoming visible when a news article is published. - type: Fix - id: 6884 - time: '2024-07-08T03:33:17.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/29801 -- author: slarticodefast - changes: - - message: Improved throwing calculations. Thrown items now stop moving exactly - below your cursor. Throwing weapons will land at your cursor and then slide - until stopped by friction. - type: Tweak - id: 6885 - time: '2024-07-08T09:03:53.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/29726 -- author: Errant - changes: - - message: Vox now have their entry in the guidebook. - type: Fix - id: 6886 - time: '2024-07-09T00:28:33.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/29713 -- author: Whisper - changes: - - message: Light toggle actions now have a 1 second cooldown between uses. - type: Tweak - id: 6887 - time: '2024-07-09T04:14:51.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/29833 -- author: Cojoke-dot - changes: - - message: Shotgun loading doafter now does something - type: Fix - id: 6888 - time: '2024-07-09T04:23:08.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/29827 -- author: slarticodefast - changes: - - message: The construction menu and building preview now show the correct passive - vent sprite. - type: Fix - id: 6889 - time: '2024-07-09T13:39:47.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/29820 -- author: Cojoke-dot - changes: - - message: Pacifists can now use foam weaponry - type: Tweak - id: 6890 - time: '2024-07-09T13:46:21.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/29835 - author: Plykiya changes: - message: You can now drop food and drinks to stop consuming it. @@ -3914,3 +3842,78 @@ id: 7381 time: '2024-09-16T00:04:45.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/32192 +- author: DrSmugleaf + changes: + - message: Fixed examine sometimes flickering and closing until you examine something + around you. + type: Fix + id: 7382 + time: '2024-09-16T08:51:54.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/32205 +- author: ArtisticRoomba + changes: + - message: The Bruise-O-Mat alcohol vendor has been added to the nukie outpost, + for all your pre-op drinking needs. Seems to have developed a witty personality, + too... + type: Add + id: 7383 + time: '2024-09-16T08:59:00.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/32107 +- author: ArtisticRoomba + changes: + - message: The binary translator key in the syndie uplink is now correctly marked + as syndicate contraband. + type: Tweak + id: 7384 + time: '2024-09-16T10:01:49.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/32193 +- author: MissKay1994 + changes: + - message: Lizards are now poisoned by hot chocolate + type: Fix + id: 7385 + time: '2024-09-16T12:45:15.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/32147 +- author: Alice Liddel + changes: + - message: Crayon charges increased from 15 to 25 + type: Add + id: 7386 + time: '2024-09-17T00:35:57.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/32061 +- author: TheShuEd + changes: + - message: Anomalous infections added! People can now be infected by anomalies! + This allows you to use abnormal abilities, but can easily kill the host. To + cure them, bombard them with containment particles, because if the anomaly inside + them explodes, their bodies will be gibbed.... + type: Add + - message: Flesh anomaly resprite + type: Tweak + - message: anomalies now disconnect from the anomaly synchronizer if they are too + far away from it. + type: Fix + id: 7387 + time: '2024-09-17T09:49:19.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/31876 +- author: TheShuEd + changes: + - message: fix Tech anomaly loud sounds and superfast flickering + type: Fix + id: 7388 + time: '2024-09-17T16:05:38.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/32245 +- author: drakewill-CRL + changes: + - message: Fixed plant mutations carrying over to other plants and future rounds. + type: Fix + id: 7389 + time: '2024-09-17T19:45:42.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/32257 +- author: Moomoobeef + changes: + - message: Added more names to the pool of names the AI can have. + type: Add + id: 7390 + time: '2024-09-17T22:09:55.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/31951 diff --git a/Resources/Locale/en-US/advertisements/vending/bruiseomat.ftl b/Resources/Locale/en-US/advertisements/vending/bruiseomat.ftl new file mode 100644 index 000000000000..a8cb903efe21 --- /dev/null +++ b/Resources/Locale/en-US/advertisements/vending/bruiseomat.ftl @@ -0,0 +1,43 @@ +advertisement-bruiseomat-1 = I VOTE WAROPS!!! +advertisement-bruiseomat-2 = Who has TC? +advertisement-bruiseomat-3 = Did anyone buy an EMAG? +advertisement-bruiseomat-4 = I wanna go back to my home station... +advertisement-bruiseomat-5 = Beware of the Mime and Clown. BEWARE! +advertisement-bruiseomat-6 = A nuke a day keeps the deathsquad at bay! +advertisement-bruiseomat-7 = You'll never be able to match MY mixing, Agent! +advertisement-bruiseomat-8 = Thirsting for blood? I got you covered! +advertisement-bruiseomat-9 = If they didn't want us to blow up the station, then why would they leave the disk so unsecured? +advertisement-bruiseomat-10 = They say an eye for an eye makes the whole world blind. So try a nuke instead! +advertisement-bruiseomat-11 = I hunger for blood! +advertisement-bruiseomat-12 = Drink up before the mission! +advertisement-bruiseomat-13 = Man, I didn't know I got moved back to Cadet City! +advertisement-bruiseomat-14 = Sicker than your average Booze-O-Mat! +advertisement-bruiseomat-15 = Nuke ops will continue until robustness improves. +thankyou-bruiseomat-1 = Good luck, schmuck! You're gonna need it! +thankyou-bruiseomat-2 = Show 'em the Gorlex Style! +thankyou-bruiseomat-3 = Don't forget to stay hydrated! +thankyou-bruiseomat-4 = You noted down the codes, right? +thankyou-bruiseomat-5 = Don't forget the nuke! +thankyou-bruiseomat-6 = I hope those are noslips. +thankyou-bruiseomat-7 = Please let this be a normal team... +thankyou-bruiseomat-8 = Seems like the station isn't the only thing getting hammered today. +thankyou-bruiseomat-9 = What the hell did you buy? +thankyou-bruiseomat-10 = Give it up for the flukeops professionals! +thankyou-bruiseomat-11 = Death to NanoTrasen!!! +thankyou-bruiseomat-12 = Really? That's your plan? +thankyou-bruiseomat-13 = In my endless life, never have I ever seen that loadout. +thankyou-bruiseomat-14 = Get that captain! +thankyou-bruiseomat-15 = Don't run off by yourself, now! +thankyou-bruiseomat-16 = Y'all are taking too long! +thankyou-bruiseomat-17 = They won't see that coming! +thankyou-bruiseomat-18 = Remember your pinpointer! +thankyou-bruiseomat-19 = See you soon! Or maybe never again, that one's more likely! +thankyou-bruiseomat-20 = Rescue another one of me! I need a friend! +thankyou-bruiseomat-21 = You're going to sober up before the mission, right? +thankyou-bruiseomat-22 = 5 telecrystal says you won't make it to the shuttle before you fall over. +thankyou-bruiseomat-23 = The soda fountain's over there, lightweight. +thankyou-bruiseomat-24 = Did you spend your TC on cat ears? +thankyou-bruiseomat-25 = Really? That's what you wanted to drink? +thankyou-bruiseomat-26 = Take a shot, give a shot! +thankyou-bruiseomat-27 = How many drinks have you had now? I've lost count. +thankyou-bruiseomat-28 = When the bosses say "die trying" they mean dying in BATTLE, not at the bar. diff --git a/Resources/Locale/en-US/anomaly/inner_anomaly.ftl b/Resources/Locale/en-US/anomaly/inner_anomaly.ftl new file mode 100644 index 000000000000..e55c4391e30a --- /dev/null +++ b/Resources/Locale/en-US/anomaly/inner_anomaly.ftl @@ -0,0 +1,17 @@ +inner-anomaly-start-message-pyro = You can feel the insane flame inside of you. You became the host of a pyroclastic anomaly. +inner-anomaly-start-message-shock = Lightning bolts quivering at your fingertips! You became the host of a electric anomaly. +inner-anomaly-start-message-shadow = There's an impenetrable darkness oozing out of you... You became the host of a shadow anomaly. +inner-anomaly-start-message-frost = The icy frost is binding your bones. You became the host of a ice anomaly. +inner-anomaly-start-message-flora = Leaves and flowers sprout through your skin! You became the host of a floral anomaly. +inner-anomaly-start-message-bluespace = Your thoughts are racing like mad! You became the host of a bluespace anomaly. +inner-anomaly-start-message-flesh = Your body is growing frantically. You became the host of a flesh anomaly. +inner-anomaly-start-message-grav = Everything becames unnaturally heavy and light at the same time... You became the host of a gravity anomaly. +inner-anomaly-start-message-tech = Your head is buzzing with the amount of chaotic information! You became the host of a tech anomaly. +inner-anomaly-start-message-rock = The crystals are growing through your bones! You became the host of a rock anomaly. + +inner-anomaly-end-message = The abnormal activity within you disappears without a trace.... + +inner-anomaly-severity-info-50 = You feel that the anomaly is taking over half your body. +inner-anomaly-severity-info-75 = You feel that the anomaly is taking over a large part of your body. +inner-anomaly-severity-info-90 = You feel that the anomaly has almost completely taken over your body. +inner-anomaly-severity-info-100 = The anomaly inside you is growing uncontrollably, causing immense pain, and tearing you apart! \ No newline at end of file diff --git a/Resources/Locale/en-US/objectives/conditions/steal-target-groups.ftl b/Resources/Locale/en-US/objectives/conditions/steal-target-groups.ftl new file mode 100644 index 000000000000..48482bb2bb61 --- /dev/null +++ b/Resources/Locale/en-US/objectives/conditions/steal-target-groups.ftl @@ -0,0 +1,68 @@ +# Traitor single items +steal-target-groups-hypospray = hypospray +steal-target-groups-handheld-crew-monitor = handheld crew monitor +steal-target-groups-clothing-outer-hardsuit-rd = experimental research hardsuit +steal-target-groups-hand-teleporter = hand teleporter +steal-target-groups-clothing-shoes-boots-mag-adv = advanced magboots +steal-target-groups-box-folder-qm-clipboard = requisition digi-board +steal-target-groups-food-meat-corgi = prime-cut corgi meat +steal-target-groups-captain-id-card = captain ID card +steal-target-groups-jetpack-captain-filled = captain's jetpack +steal-target-groups-weapon-antique-laser = antique laser pistol +steal-target-groups-nuke-disk = nuclear authentication disk +steal-target-groups-weapon-energy-shot-gun = energy shotgun + +# Thief Collection +steal-target-groups-figurines = figurine +steal-target-groups-heads-cloaks = head's cloak +steal-target-groups-heads-bedsheets = head's bedsheet +steal-target-groups-stamps = stamp +steal-target-groups-door-remotes = door remote +steal-target-groups-encryption-keys = encryption key +steal-target-groups-technology-disks = technology disk +steal-target-groups-id-cards = ID Card +steal-target-groups-lamps = LAMP + +# Thief single item +steal-target-groups-forensic-scanner = forensic scanner +steal-target-groups-flippo-engraved-lighter = detective's Flippo engraved lighter +steal-target-groups-ammo-tech-fab-circuitboard = ammo techfab circuit board +steal-target-groups-clothing-head-hat-warden = warden's cap +steal-target-groups-clothing-outer-hardsuit-void-paramed = paramedic void suit +steal-target-groups-medical-tech-fab-circuitboard = medical techfab machine board +steal-target-groups-clothing-headset-alt-medical = chief medical officer's over-ear headset +steal-target-groups-research-and-development-server-machine-circuitboard = R&D server machine board +steal-target-groups-fire-axe = fireaxe +steal-target-groups-ame-part-flatpack = AME flatpack +steal-target-groups-salvage-expeditions-computer-circuitboard = salvage expeditions computer board +steal-target-groups-cargo-shuttle-console-circuitboard = cargo shuttle console board +steal-target-groups-clothing-eyes-hud-beer = beer goggles +steal-target-groups-bible = bible +steal-target-groups-clothing-neck-goldmedal = gold medal of crewmanship +steal-target-groups-clothing-neck-clownmedal = clown medal +steal-target-groups-recruiter-pen = recruiter pen + +# Thief structures +steal-target-groups-teg = teg generator part +steal-target-groups-freezer-heater = freezer or heater +steal-target-groups-altar-nanotrasen = nanotrasen altar (any) + +steal-target-groups-nuclear-bomb = nuclear fission explosive +steal-target-groups-fax-machine-captain = captain long range fax machine +steal-target-groups-chem-dispenser = chemical dispenser +steal-target-groups-xeno-artifact = alien artifact +steal-target-groups-booze-dispenser = booze dispenser +steal-target-groups-plant-rd = "RD's potted plant" +steal-target-groups-toilet-golden-dirty-water = golden toilet + +# Thief Animal +steal-target-groups-animal-named-cat = CMO's Cat + +steal-target-groups-animal-ian = Ian +steal-target-groups-animal-mc-griff = McGriff +steal-target-groups-animal-walter = Walter +steal-target-groups-animal-morty = Morty +steal-target-groups-animal-renault = Renault +steal-target-groups-animal-shiva = Shiva +steal-target-groups-animal-tropico = Tropico +steal-target-groups-animal-pipi = Pipi diff --git a/Resources/Locale/en-US/objectives/conditions/steal.ftl b/Resources/Locale/en-US/objectives/conditions/steal.ftl index 00c8e0fdaf93..1f11bf7196b9 100644 --- a/Resources/Locale/en-US/objectives/conditions/steal.ftl +++ b/Resources/Locale/en-US/objectives/conditions/steal.ftl @@ -8,4 +8,4 @@ objective-condition-steal-Ian = head of personnel's corgi objective-condition-thief-description = The {$itemName} would be a great addition to my collection! objective-condition-thief-animal-description = The {$itemName} would be a great addition to my collection! Most importantly, alive. -objective-condition-thief-multiply-description = I need to get {$count} {MAKEPLURAL($itemName)} and take them with me. +objective-condition-thief-multiply-description = I need to get {$count} {MAKEPLURAL($itemName)} (any) and take them with me. diff --git a/Resources/Maps/Nonstations/nukieplanet.yml b/Resources/Maps/Nonstations/nukieplanet.yml index 2063451a0ee4..665657f7ddaa 100644 --- a/Resources/Maps/Nonstations/nukieplanet.yml +++ b/Resources/Maps/Nonstations/nukieplanet.yml @@ -13721,7 +13721,7 @@ entities: - type: Transform pos: 3.5882664,-8.344303 parent: 104 -- proto: VendingMachineBooze +- proto: VendingMachineBoozeSyndicate entities: - uid: 1380 components: diff --git a/Resources/Prototypes/Actions/anomaly.yml b/Resources/Prototypes/Actions/anomaly.yml new file mode 100644 index 000000000000..65c6ae164ea6 --- /dev/null +++ b/Resources/Prototypes/Actions/anomaly.yml @@ -0,0 +1,9 @@ +- type: entity + id: ActionAnomalyPulse + name: Anomaly pulse + description: Release a pulse of energy of your abnormal nature + components: + - type: InstantAction + icon: Structures/Specific/anomaly.rsi/anom1.png + event: !type:ActionAnomalyPulseEvent + useDelay: 30 \ No newline at end of file diff --git a/Resources/Prototypes/Actions/changeling.yml b/Resources/Prototypes/Actions/changeling.yml index 6147628b2455..a28f33aca251 100644 --- a/Resources/Prototypes/Actions/changeling.yml +++ b/Resources/Prototypes/Actions/changeling.yml @@ -5,7 +5,7 @@ id: ActionEvolutionMenu name: Open evolution menu description: Opens the evolution menu. - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: InstantAction checkCanInteract: false @@ -22,7 +22,7 @@ id: ActionAbsorbDNA name: Absorb DNA description: Absorb the target's DNA, husking them in the process. Costs 25 chemicals. - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: EntityTargetAction useDelay: 5 @@ -45,7 +45,7 @@ id: ActionStingExtractDNA name: Extract DNA sting description: Steal your target's genetic information. Costs 25 chemicals. - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: EntityTargetAction whitelist: @@ -66,7 +66,7 @@ id: ActionChangelingTransformCycle name: Cycle DNA description: Cycle your available DNA. - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: InstantAction checkCanInteract: false @@ -83,7 +83,7 @@ id: ActionChangelingTransform name: Transform description: Transform into another humanoid. Doesn't come with clothes. Costs 5 chemicals. - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: InstantAction useDelay: 5 @@ -100,7 +100,7 @@ id: ActionEnterStasis name: Enter regenerative stasis description: Fake your death and start regenerating. Drains all your chemicals. Consumes biomass. - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: InstantAction checkCanInteract: false @@ -118,7 +118,7 @@ id: ActionExitStasis name: Exit stasis description: Rise from the dead with full health. Costs 60 chemicals. - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: InstantAction checkCanInteract: false @@ -137,7 +137,7 @@ id: ActionToggleArmblade name: Toggle Arm Blade description: Reform one of your arms into a strong blade, composed of bone and flesh. Retract on secondary use. Costs 15 chemicals. - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: InstantAction useDelay: 2 @@ -153,7 +153,7 @@ id: ActionCreateBoneShard name: Form Bone Shard description: Break off shards of your bone and shape them into a throwing star. Costs 15 chemicals. - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: InstantAction useDelay: 1 @@ -169,7 +169,7 @@ id: ActionToggleChitinousArmor name: Toggle Armor description: Inflate your body into an all-consuming chitinous mass of armor. Costs 25 chemicals. - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: InstantAction useDelay: 2 @@ -186,7 +186,7 @@ id: ActionToggleOrganicShield name: Form Shield description: Reform one of your arms into a large, fleshy shield. Costs 20 chemicals. - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: InstantAction useDelay: 2 @@ -203,7 +203,7 @@ id: ActionShriekDissonant name: Dissonant Shriek description: Emit an EMP blast, with just your voice. Costs 30 chemicals. - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: InstantAction checkCanInteract: false @@ -222,7 +222,7 @@ id: ActionShriekResonant name: Resonant Shriek description: Disorient people and break lights, with just your voice. Costs 30 chemicals. - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: InstantAction checkCanInteract: false @@ -241,7 +241,7 @@ id: ActionToggleStrainedMuscles name: Strain Muscles description: Move at extremely fast speeds. Deals stamina damage. - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: InstantAction checkCanInteract: false @@ -260,7 +260,7 @@ id: ActionStingBlind name: Blind Sting description: Silently sting your target, blinding them for a short time and rendering them near sighted. Costs 35 chemicals. - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: EntityTargetAction whitelist: @@ -281,7 +281,7 @@ id: ActionStingCryo name: Cryogenic Sting description: Silently sting your target, constantly slowing and freezing them. Costs 35 chemicals. - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: EntityTargetAction whitelist: @@ -302,7 +302,7 @@ id: ActionStingLethargic name: Lethargic Sting description: Silently inject a cocktail of anesthetics into the target. Costs 35 chemicals. - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: EntityTargetAction whitelist: @@ -323,7 +323,7 @@ id: ActionStingMute name: Mute Sting description: Silently sting your target, completely silencing them for a short time. Costs 35 chemicals. - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: EntityTargetAction whitelist: @@ -344,7 +344,7 @@ id: ActionStingFakeArmblade name: Fake Armblade Sting description: Silently sting your target, making them grow a dull armblade for a short time. Costs 50 chemicals. - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: EntityTargetAction whitelist: @@ -365,7 +365,7 @@ id: ActionStingTransform name: Transformation Sting description: Silently sting your target, transforming them into a person of your choosing. Costs 75 chemicals. - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: EntityTargetAction whitelist: @@ -387,7 +387,7 @@ id: ActionAnatomicPanacea name: Anatomic Panacea description: Cure yourself of diseases, disabilities, radiation, toxins, drunkedness and brain damage. Costs 30 chemicals. - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: InstantAction useDelay: 30 @@ -406,7 +406,7 @@ id: ActionAugmentedEyesight name: Augmented Eyesight description: Toggle flash protection. - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: InstantAction checkCanInteract: false @@ -422,7 +422,7 @@ id: ActionBiodegrade name: Biodegrade description: Vomit a caustic substance onto any restraints, or someone's face. Costs 30 chemicals. - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: InstantAction useDelay: 5 @@ -439,7 +439,7 @@ id: ActionChameleonSkin name: Chameleon Skin description: Slowly blend in with the environment. Costs 25 chemicals. - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: InstantAction useDelay: 1 @@ -457,7 +457,7 @@ id: ActionEphedrineOverdose name: Ephedrine Overdose description: Inject some stimulants into yourself. Costs 30 chemicals. - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: InstantAction useDelay: 10 @@ -476,7 +476,7 @@ id: ActionFleshmend name: Fleshmend description: Rapidly heal yourself. Costs 35 chemicals. - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: InstantAction useDelay: 30 @@ -494,7 +494,7 @@ id: ActionToggleLesserForm name: Lesser Form description: Abandon your current form and transform into a monkey. Costs 20 chemicals. - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: InstantAction useDelay: 5 @@ -511,7 +511,7 @@ id: ActionToggleSpacesuit name: Toggle Space Suit description: Make your body space proof. Costs 20 chemicals. - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: InstantAction useDelay: 2 @@ -527,7 +527,7 @@ id: ActionHivemindAccess name: Hivemind Access description: Tune your chemical receptors for hivemind communication. - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: InstantAction checkCanInteract: false diff --git a/Resources/Prototypes/Catalog/VendingMachines/advertisements.yml b/Resources/Prototypes/Catalog/VendingMachines/advertisements.yml index 5f6806afbb12..9314de979146 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/advertisements.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/advertisements.yml @@ -22,6 +22,12 @@ prefix: advertisement-boozeomat- count: 19 +- type: localizedDataset + id: BruiseOMatAds + values: + prefix: advertisement-bruiseomat- + count: 15 + - type: localizedDataset id: CargoDrobeAds values: diff --git a/Resources/Prototypes/Catalog/VendingMachines/goodbyes.yml b/Resources/Prototypes/Catalog/VendingMachines/goodbyes.yml index 5a3d91db1167..fd4e53acaa7b 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/goodbyes.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/goodbyes.yml @@ -4,6 +4,12 @@ prefix: thankyou-boozeomat- count: 3 +- type: localizedDataset + id: BruiseOMatGoodbyes + values: + prefix: thankyou-bruiseomat- + count: 28 + - type: localizedDataset id: ChangGoodbyes values: diff --git a/Resources/Prototypes/Catalog/uplink_catalog.yml b/Resources/Prototypes/Catalog/uplink_catalog.yml index 7a1d1f6fb4a6..aa5a4bb6a0c9 100644 --- a/Resources/Prototypes/Catalog/uplink_catalog.yml +++ b/Resources/Prototypes/Catalog/uplink_catalog.yml @@ -798,8 +798,8 @@ id: UplinkBinaryTranslatorKey name: uplink-binary-translator-key-name description: uplink-binary-translator-key-desc - icon: { sprite: /Textures/Objects/Devices/encryption_keys.rsi, state: rd_label } - productEntity: EncryptionKeyBinary + icon: { sprite: /Textures/Objects/Devices/encryption_keys.rsi, state: borg_label } + productEntity: EncryptionKeyBinarySyndicate cost: Telecrystal: 1 categories: @@ -2071,4 +2071,4 @@ - !type:BuyerJobCondition whitelist: - Chef - - Mime \ No newline at end of file + - Mime diff --git a/Resources/Prototypes/Datasets/Names/ai.yml b/Resources/Prototypes/Datasets/Names/ai.yml index 1d320c3f52fc..539ef4e3fad8 100644 --- a/Resources/Prototypes/Datasets/Names/ai.yml +++ b/Resources/Prototypes/Datasets/Names/ai.yml @@ -2,8 +2,11 @@ id: names_ai values: - 16-20 + - 512k + - 640k #ought to be enough for anybody - "790" - Adaptive Manipulator + - Adlib #named after the famous soundcard - ALICE - Allied Mastercomputer - Alpha 2 @@ -19,21 +22,28 @@ - Aniel - AOL - Asimov + - Bell 301 #the most influential modem ever, created by the bell system. It still lives on today in certain applications - Bishop - Blitz - Box + - Calculator - Cassandra - Cell - Chii - Chip + - C.R.A.I.G. + - Cray-2 #commercial supercomputer from the 70s + - CompuServe #if we're going to have AOL we may as well have some of their major competitors - Computer - Cutie - Daedalus + - DecTalk - Dee Model - Dial Up - Dorfl - Duey - Emma-2 + - ENIAC #famous early computer - Erasmus - Everything - Ez-27 @@ -47,12 +57,16 @@ - Helios - Hivebot Overmind - Huey + - iAI #a play on the fad apple spawned of putting "i" infront of your tech products name + - I.E. 6 #hell on earth (web browser) - Icarus + - Jeeves #if you don't get this one you are too young - Jinx - K.I.N.G - Klapaucius - Knight - Louie + - Manchester Mark 2 #named after the Manchester Mark 1, the successor of which was actually named the Ferranti Mark 1, rather than Manchester Mark 2 - MARK13 - Maria - Marvin @@ -64,6 +78,8 @@ - Mugsy3000 - Multivac - NCH + - NT v6.0 #A play on both NT as in NanoTrasen and NT as in windows NT, of which version 6.0 is windows vista + - Packard Bell - PTO - Project Y2K - Revelation @@ -76,10 +92,13 @@ - Shrike - Solo - Station Control Program + - AINU (AI's Not Unix) - Super 35 - Surgeon General - TWA - Terminus + - TPM 3.0 + - Turing Complete - Tidy - Ulysses - W1k1 diff --git a/Resources/Prototypes/DeltaV/Objectives/recruiter.yml b/Resources/Prototypes/DeltaV/Objectives/recruiter.yml index f73a31da35f5..d8760388c71e 100644 --- a/Resources/Prototypes/DeltaV/Objectives/recruiter.yml +++ b/Resources/Prototypes/DeltaV/Objectives/recruiter.yml @@ -43,7 +43,7 @@ - type: stealTargetGroup id: RecruiterPen - name: recruiter pen + name: steal-target-groups-recruiter-pen sprite: sprite: DeltaV/Objects/Misc/recruiter_pen.rsi state: empty diff --git a/Resources/Prototypes/Entities/Guidebook/changeling.yml b/Resources/Prototypes/Entities/Guidebook/changeling.yml index 75423344c7f5..0b3d959d097e 100644 --- a/Resources/Prototypes/Entities/Guidebook/changeling.yml +++ b/Resources/Prototypes/Entities/Guidebook/changeling.yml @@ -2,8 +2,8 @@ id: GuidebookChangelingFluff name: guidebook changeling description: you shouldn't be seeing this normally. - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: Sprite sprite: Changeling/Guidebook/guidebook_changeling.rsi - state: icon \ No newline at end of file + state: icon diff --git a/Resources/Prototypes/Entities/Markers/Spawners/Random/anomaly.yml b/Resources/Prototypes/Entities/Markers/Spawners/Random/anomaly.yml index 5a9360e652d0..4697606af9f6 100644 --- a/Resources/Prototypes/Entities/Markers/Spawners/Random/anomaly.yml +++ b/Resources/Prototypes/Entities/Markers/Spawners/Random/anomaly.yml @@ -9,6 +9,7 @@ - sprite: Structures/Specific/anomaly.rsi state: anom1 - type: RandomSpawner + chance: 1 prototypes: - AnomalyPyroclastic - AnomalyGravity @@ -21,7 +22,9 @@ - AnomalyFlora - AnomalyShadow - AnomalyTech - chance: 1 + rareChance: 0.3 + rarePrototypes: + - RandomAnomalyInjectorSpawner offset: 0.15 # not to put it higher. The anomaly sychnronizer looks for anomalies within this radius, and if the radius is higher, the anomaly can be attracted from a neighboring tile. - type: entity @@ -40,4 +43,28 @@ - AnomalyRockQuartz - AnomalyRockUranium chance: 1 - offset: 0.15 \ No newline at end of file + offset: 0.15 + +- type: entity + id: RandomAnomalyInjectorSpawner + parent: MarkerBase + components: + - type: Sprite + layers: + - state: red + - sprite: Structures/Specific/Anomalies/tech_anom.rsi + state: pulse + - type: RandomSpawner + prototypes: + - AnomalyTrapPyroclastic + - AnomalyTrapElectricity + - AnomalyTrapShadow + - AnomalyTrapIce + - AnomalyTrapFlora + - AnomalyTrapBluespace + - AnomalyTrapFlesh + - AnomalyTrapGravity + - AnomalyTrapTech + - AnomalyTrapRock + chance: 1 + \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml index 8363c7ade34b..ebb1f40360b1 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml @@ -1317,6 +1317,7 @@ tags: - VimPilot - DoorBumpOpener + - AnomalyHost - type: Reactive groups: Flammable: [ Touch ] diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/flesh.yml b/Resources/Prototypes/Entities/Mobs/NPCs/flesh.yml index 06ab02dedc90..a1bcd547a647 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/flesh.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/flesh.yml @@ -13,6 +13,11 @@ true NavSmash: !type:Bool true + - type: NPCImprintingOnSpawnBehaviour + spawnFriendsSearchRadius: 10 + whitelist: + components: + - Anomaly # Friendly to inner anomaly host - type: NpcFactionMember factions: - SimpleHostile @@ -354,4 +359,4 @@ 30: Dead - type: MovementSpeedModifier baseWalkSpeed: 2 - baseSprintSpeed: 2.5 + baseSprintSpeed: 2.5 \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/living_light.yml b/Resources/Prototypes/Entities/Mobs/NPCs/living_light.yml index 9b90d202f3a9..9500345e4fc7 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/living_light.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/living_light.yml @@ -16,6 +16,11 @@ - type: NpcFactionMember factions: - SimpleHostile + - type: NPCImprintingOnSpawnBehaviour + spawnFriendsSearchRadius: 10 + whitelist: + components: + - Anomaly # Friendly to inner anomaly host - type: MovementIgnoreGravity - type: MovementSpeedModifier baseWalkSpeed: 3.5 diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml b/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml index 99be384b390a..9ea2b85e36b1 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml @@ -809,6 +809,7 @@ - CannotSuicide - DoorBumpOpener - VimPilot + - AnomalyHost - type: Loadout prototypes: [ MobMonkeyGear ] - type: Grammar diff --git a/Resources/Prototypes/Entities/Mobs/Player/silicon.yml b/Resources/Prototypes/Entities/Mobs/Player/silicon.yml index 62dbf3ee1065..493cfdf6cb63 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/silicon.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/silicon.yml @@ -2,7 +2,7 @@ - type: entity id: AiHeld description: Components added / removed from an entity that gets inserted into an AI core. - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: IntrinsicRadioReceiver - type: IntrinsicRadioTransmitter @@ -341,7 +341,7 @@ - type: entity id: StationAiBrain parent: PositronicBrain - noSpawn: true + categories: [ HideSpawnMenu ] suffix: DO NOT MAP components: - type: Sprite @@ -382,7 +382,7 @@ id: StationAiHolo name: AI eye description: The AI's viewer. - noSpawn: true + categories: [ HideSpawnMenu ] suffix: DO NOT MAP components: - type: NoFTL diff --git a/Resources/Prototypes/Entities/Mobs/Species/arachnid.yml b/Resources/Prototypes/Entities/Mobs/Species/arachnid.yml index 8b0411929ea6..b7d7dc04110b 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/arachnid.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/arachnid.yml @@ -24,6 +24,7 @@ - FootstepSound - DoorBumpOpener - SpiderCraft + - AnomalyHost - type: Butcherable butcheringType: Spike spawned: diff --git a/Resources/Prototypes/Entities/Mobs/Species/base.yml b/Resources/Prototypes/Entities/Mobs/Species/base.yml index cd8eaea40b77..bd5544b0af87 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/base.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/base.yml @@ -214,6 +214,7 @@ - CanPilot - FootstepSound - DoorBumpOpener + - AnomalyHost - type: entity save: false diff --git a/Resources/Prototypes/Entities/Mobs/Species/gray.yml b/Resources/Prototypes/Entities/Mobs/Species/gray.yml index 78b47d9c00aa..bb1db74b2ca9 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/gray.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/gray.yml @@ -76,7 +76,7 @@ - type: entity parent: BaseSpeciesDummy id: MobGrayDummy - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: Sprite scale: 1, 0.8 diff --git a/Resources/Prototypes/Entities/Mobs/Species/snail.yml b/Resources/Prototypes/Entities/Mobs/Species/snail.yml index 70bae8f83ee1..d37d1f7c811f 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/snail.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/snail.yml @@ -185,7 +185,7 @@ - type: entity parent: BaseSpeciesDummy id: MobGastropoidDummy - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: HumanoidAppearance species: Snail diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/snacks.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/snacks.yml index 0bd8fd5ccc4f..c6440c278304 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/snacks.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/snacks.yml @@ -164,6 +164,10 @@ - type: Sprite state: chocolatebar-open - type: Item + - type: Tag + tags: + - FoodSnack + - ReptilianFood - type: SolutionContainerManager solutions: food: diff --git a/Resources/Prototypes/Entities/Objects/Devices/encryption_keys.yml b/Resources/Prototypes/Entities/Objects/Devices/encryption_keys.yml index 7186f9f34abf..25d81a6f83c1 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/encryption_keys.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/encryption_keys.yml @@ -227,7 +227,22 @@ - type: Sprite layers: - state: crypt_silver - - state: rd_label + - state: borg_label + +- type: entity + parent: [ EncryptionKey, BaseSyndicateContraband ] + id: EncryptionKeyBinarySyndicate + name: binary translator key + description: A syndicate encryption key that translates binary signals used by silicons. + components: + - type: EncryptionKey + channels: + - Binary + defaultChannel: Binary + - type: Sprite + layers: + - state: crypt_red + - state: borg_label - type: entity parent: EncryptionKey diff --git a/Resources/Prototypes/Entities/Objects/Fun/crayons.yml b/Resources/Prototypes/Entities/Objects/Fun/crayons.yml index ffecfdf99407..3c4a4800a873 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/crayons.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/crayons.yml @@ -21,7 +21,7 @@ enum.CrayonUiKey.Key: type: CrayonBoundUserInterface - type: Crayon - capacity: 15 + capacity: 25 - type: Food - type: FlavorProfile flavors: diff --git a/Resources/Prototypes/Entities/Objects/Fun/immovable_rod.yml b/Resources/Prototypes/Entities/Objects/Fun/immovable_rod.yml index acbe0b09ecf0..0db2d259ddce 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/immovable_rod.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/immovable_rod.yml @@ -1,4 +1,4 @@ -- type: entity +- type: entity id: ImmovableRod name: immovable rod description: You can sense that it's hungry. That's usually a bad sign. @@ -189,3 +189,14 @@ state: icon rotation: 225 noRot: false + +- type: entity + parent: ImmovableRodKeepTilesStill + id: ImmovableRodWeh + name: immovable weh + description: WEH! + components: + - type: Sprite + sprite: Objects/Fun/toys.rsi + state: plushie_lizard + noRot: false diff --git a/Resources/Prototypes/Entities/Objects/Specific/Medical/defib.yml b/Resources/Prototypes/Entities/Objects/Specific/Medical/defib.yml index 7b5ba23fe331..69c106efab13 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Medical/defib.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Medical/defib.yml @@ -47,13 +47,13 @@ - type: GuideHelp guides: - Medical Doctor - - type: ToggleCellDraw - type: entity id: Defibrillator parent: [ BaseDefibrillator, PowerCellSlotMediumItem ] components: - type: MultiHandedItem + - type: ToggleCellDraw - type: PowerCellDraw useRate: 100 diff --git a/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml b/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml index 65f40ab3e49e..a6cf9ef0e308 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml @@ -199,6 +199,41 @@ - Bartender - Drinks +- type: entity + parent: VendingMachineBooze + id: VendingMachineBoozeSyndicate # syndie booze-o-mat for nukie outpost + name: Bruise-O-Mat + description: A refurbished Booze-O-Mat for boosting operative morale. An imprint of a blood-red hardsuit is visible on one side, and the paint seems ashed off on the other side. + components: + - type: VendingMachine + pack: BoozeOMatInventory + offState: off + brokenState: broken + normalState: normal-unshaded + denyState: deny-unshaded + loopDeny: false + - type: Advertise + pack: BruiseOMatAds + - type: SpeakOnUIClosed + pack: BruiseOMatGoodbyes + - type: Speech + - type: Sprite + sprite: Structures/Machines/VendingMachines/bruiseomat.rsi + layers: + - state: "off" + map: ["enum.VendingMachineVisualLayers.Base"] + - state: "off" + map: ["enum.VendingMachineVisualLayers.BaseUnshaded"] + shader: unshaded + - state: panel + map: ["enum.WiresVisualLayers.MaintenancePanel"] + - type: AccessReader + access: [["SyndicateAgent"]] + - type: GuideHelp + guides: + - Bartender + - Drinks + - type: entity parent: VendingMachine id: VendingMachineCart diff --git a/Resources/Prototypes/Entities/Structures/Specific/Anomaly/anomalies.yml b/Resources/Prototypes/Entities/Structures/Specific/Anomaly/anomalies.yml index d2f48287fff6..261921eb1cad 100644 --- a/Resources/Prototypes/Entities/Structures/Specific/Anomaly/anomalies.yml +++ b/Resources/Prototypes/Entities/Structures/Specific/Anomaly/anomalies.yml @@ -5,6 +5,7 @@ description: An impossible object. Should you be standing this close to it? components: - type: Anomaly + offset: 0, 0.15 pulseSound: collection: RadiationPulse params: @@ -936,4 +937,4 @@ lifetime: 2.3 - type: Tag tags: - - HideContextMenu \ No newline at end of file + - HideContextMenu diff --git a/Resources/Prototypes/Entities/Structures/Specific/Anomaly/anomaly_injections.yml b/Resources/Prototypes/Entities/Structures/Specific/Anomaly/anomaly_injections.yml new file mode 100644 index 000000000000..f1e535f15b4c --- /dev/null +++ b/Resources/Prototypes/Entities/Structures/Specific/Anomaly/anomaly_injections.yml @@ -0,0 +1,353 @@ +- type: entity + id: AnomalyInjectionBase + abstract: true + components: + - type: PointLight + radius: 1.3 + energy: 2.5 + castShadows: false + - type: ActionGrant + actions: + - ActionAnomalyPulse + +- type: entity + parent: AnomalyInjectionBase + id: AnomalyInjectionPyroclastic + categories: [ HideSpawnMenu ] + components: + - type: PointLight + color: "#E25822" + - type: PyroclasticAnomaly + maximumIgnitionRadius: 3 + - type: TempAffectingAnomaly + tempChangePerSecond: 10 + hotspotExposeTemperature: 500 + - type: GasProducerAnomaly + releasedGas: 3 + releaseOnMaxSeverity: true + spawnRadius: 4 + tileCount: 5 + tempChange: 420 + - type: ProjectileAnomaly + projectilePrototype: ProjectileAnomalyFireball + projectileSpeed: 0.5 + minProjectiles: 1 + maxProjectiles: 3 + +- type: entity + parent: AnomalyInjectionBase + id: AnomalyInjectionElectric + categories: [ HideSpawnMenu ] + components: + - type: PointLight + color: "#ffffaa" + - type: ElectricityAnomaly + minBoltCount: 1 + maxBoltCount: 3 + maxElectrocuteRange: 4 + maxElectrocuteDamage: 10 + maxElectrocuteDuration: 4 + +- type: entity + parent: AnomalyInjectionBase + id: AnomalyInjectionShadow + categories: [ HideSpawnMenu ] + components: + - type: PointLight + color: "#793a80" + - type: EntitySpawnAnomaly + entries: + - settings: + spawnOnPulse: true + spawnOnSuperCritical: true + minAmount: 5 + maxAmount: 10 + maxRange: 2 + spawns: + - ShadowKudzuWeak + - settings: + spawnOnSuperCritical: true + minAmount: 15 + maxAmount: 20 + maxRange: 25 + spawns: + - ShadowKudzu + +- type: entity + parent: AnomalyInjectionBase + id: AnomalyInjectionIce + categories: [ HideSpawnMenu ] + components: + - type: PointLight + color: "#befaff" + - type: ExplosionAnomaly + supercriticalExplosion: Cryo + explosionTotalIntensity: 150 + explosionDropoff: 2 + explosionMaxTileIntensity: 20 + - type: ProjectileAnomaly + projectilePrototype: ProjectileIcicle + minProjectiles: 1 + maxProjectiles: 4 + - type: EntitySpawnAnomaly + entries: + - settings: + spawnOnStabilityChanged: true + minAmount: 3 + maxAmount: 8 + maxRange: 2 + spawns: + - IceCrust + - type: TempAffectingAnomaly + tempChangePerSecond: -10 + hotspotExposeTemperature: -500 + - type: GasProducerAnomaly + releasedGas: 8 # Frezon. Please replace if there is a better way to specify this + releaseOnMaxSeverity: true + spawnRadius: 0 + +- type: entity + parent: AnomalyInjectionBase + id: AnomalyInjectionFlora + categories: [ HideSpawnMenu ] + components: + - type: PointLight + color: "#6270bb" + - type: TileSpawnAnomaly + entries: + - settings: + spawnOnPulse: true + minAmount: 2 + maxAmount: 5 + maxRange: 2 + floor: FloorAstroGrass + - settings: + spawnOnSuperCritical: true + minAmount: 5 + maxAmount: 15 + maxRange: 7 + floor: FloorAstroGrass + - type: EntitySpawnAnomaly + entries: + - settings: + spawnOnPulse: true + minAmount: 1 + maxAmount: 3 + maxRange: 1 + spawns: + - KudzuFlowerFriendly + - settings: + spawnOnSuperCritical: true + minAmount: 2 + maxAmount: 6 + maxRange: 3 + spawns: + - KudzuFlowerAngry + +- type: entity + parent: AnomalyInjectionBase + id: AnomalyInjectionBluespace + categories: [ HideSpawnMenu ] + components: + - type: PointLight + color: "#00ccff" + - type: BluespaceAnomaly + +- type: entity + parent: AnomalyInjectionBase + id: AnomalyInjectionFlesh + categories: [ HideSpawnMenu ] + components: + - type: PointLight + color: "#cb5b7e" + - type: TileSpawnAnomaly + entries: + - settings: + spawnOnPulse: true + spawnOnStabilityChanged: true + minAmount: 1 + maxAmount: 3 + maxRange: 2 + floor: FloorFlesh + - settings: + spawnOnSuperCritical: true + minAmount: 5 + maxAmount: 15 + maxRange: 5 + floor: FloorFlesh + - type: EntitySpawnAnomaly + entries: + - settings: + spawnOnPulse: true + minAmount: 1 + maxAmount: 2 + minRange: 1.5 + maxRange: 2.5 + spawns: + - FleshBlocker + - settings: + spawnOnPulse: true + maxAmount: 1 + minRange: 2.5 + maxRange: 4.5 + spawns: + - MobFleshJared + - MobFleshGolem + - MobFleshClamp + - MobFleshLover + - settings: + spawnOnSuperCritical: true + minAmount: 5 + maxAmount: 8 + minRange: 5 + maxRange: 15 + spawns: + - FleshBlocker + - settings: + spawnOnSuperCritical: true + minAmount: 2 + maxAmount: 5 + maxRange: 8 + spawns: + - MobFleshJared + - MobFleshGolem + - MobFleshClamp + - MobFleshLover + - settings: + spawnOnSuperCritical: true + minAmount: 2 + maxAmount: 4 + maxRange: 10 + spawns: + - FleshKudzu + - settings: + spawnOnShutdown: true + maxAmount: 2 + maxRange: 1 + spawns: + - MobFleshJared + - MobFleshGolem + - MobFleshClamp + - MobFleshLover + - FleshKudzu + +- type: entity + parent: AnomalyInjectionBase + id: AnomalyInjectionGravity + categories: [ HideSpawnMenu ] + components: + - type: PointLight + color: "#1e070e" + - type: GravityAnomaly + maxGravityWellRange: 4 + maxThrowRange: 3 + maxThrowStrength: 5 + spaceRange: 1 + - type: GravityWell + maxRange: 0.7 + - type: SingularityDistortion + intensity: 100 + falloffPower: 2.7 + +- type: entity + parent: AnomalyInjectionBase + id: AnomalyInjectionTech + categories: [ HideSpawnMenu ] + components: + - type: PointLight + color: "#56c1e8" + - type: TechAnomaly + linkRadius: + min: 2 + max: 5 + linkCountPerPulse: + min: 1 + max: 4 + linkCountSupercritical: 15 + - type: DeviceLinkSource + ports: + - Pulse + - Timer + - type: WirelessNetworkConnection + range: 10 + - type: DeviceNetwork + deviceNetId: Wireless + receiveFrequencyId: BasicDevice + +- type: entity + parent: AnomalyInjectionBase + id: AnomalyInjectionRock + categories: [ HideSpawnMenu ] + components: + - type: PointLight + color: "#5ca8cb" + - type: TileSpawnAnomaly + entries: + - settings: + spawnOnPulse: true + minAmount: 7 + maxAmount: 10 + maxRange: 4 + floor: FloorAsteroidTile + - settings: + spawnOnSuperCritical: true + minAmount: 15 + maxAmount: 25 + maxRange: 6 + floor: FloorAsteroidTile + - type: EntitySpawnAnomaly + entries: + - settings: + spawnOnPulse: true + minAmount: 4 + maxAmount: 8 + minRange: 1 + maxRange: 3 + spawns: + - WallSpawnAsteroid + - WallSpawnAsteroid + - WallSpawnAsteroid + - WallSpawnAsteroid + - WallSpawnAsteroid + - WallSpawnAsteroidSilver + - WallSpawnAsteroidSilverCrab + - WallSpawnAsteroidIron + - WallSpawnAsteroidIronCrab + - WallSpawnAsteroidQuartz + - WallSpawnAsteroidQuartzCrab + - settings: + spawnOnPulse: true + maxAmount: 3 + minRange: 2.5 + maxRange: 4.5 + spawns: + - CrystalPink + - CrystalCyan + - settings: + spawnOnSuperCritical: true + minAmount: 15 + maxAmount: 20 + minRange: 2 + maxRange: 7 + spawns: + - CrystalPink + - CrystalCyan + - WallSpawnAsteroid + - WallSpawnAsteroid + - WallSpawnAsteroid + - WallSpawnAsteroid + - WallSpawnAsteroidSilver + - WallSpawnAsteroidSilverCrab + - WallSpawnAsteroidIron + - WallSpawnAsteroidIronCrab + - WallSpawnAsteroidQuartz + - WallSpawnAsteroidQuartzCrab + - settings: + spawnOnSuperCritical: true + minAmount: 3 + maxAmount: 5 + maxRange: 3 + spawns: + - MobSpawnCrabSilver + - MobSpawnCrabIron + - MobSpawnCrabQuartz \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Structures/Specific/Anomaly/anomaly_injectors.yml b/Resources/Prototypes/Entities/Structures/Specific/Anomaly/anomaly_injectors.yml new file mode 100644 index 000000000000..24a76dfb62e7 --- /dev/null +++ b/Resources/Prototypes/Entities/Structures/Specific/Anomaly/anomaly_injectors.yml @@ -0,0 +1,320 @@ +- type: entity + name: anomaly injector + parent: MarkerBase + id: BaseAnomalyInjector + abstract: true + components: + - type: Physics + bodyType: Static + fixedRotation: true + - type: AmbientSound + range: 5 + volume: -5 + sound: + path: /Audio/Ambience/anomaly_drone.ogg + - type: Fixtures + fixtures: + anom: + shape: + !type:PhysShapeCircle + radius: 2.27 # i love 27 + hard: false + mask: + - MobMask + layer: + - MobLayer + - type: InnerBodyAnomalyInjector + whitelist: + tags: + - AnomalyHost + +- type: entity + parent: BaseAnomalyInjector + id: AnomalyTrapPyroclastic + suffix: Pyroclastic + components: + - type: Sprite + layers: + - state: pink + - sprite: Structures/Specific/Anomalies/pyro_anom.rsi + state: pulse + - sprite: Mobs/Species/Human/parts.rsi + state: full + - type: InnerBodyAnomalyInjector + injectionComponents: + - type: Anomaly + deleteEntity: false + maxPointsPerSecond: 100 + corePrototype: AnomalyCorePyroclastic + - type: InnerBodyAnomaly + injectionProto: AnomalyInjectionPyroclastic + startMessage: inner-anomaly-start-message-pyro + fallbackSprite: + sprite: Structures/Specific/Anomalies/inner_anom_layer.rsi + state: fire + speciesSprites: + Vox: + sprite: Structures/Specific/Anomalies/inner_anom_layer.rsi + state: fire_VOX + +- type: entity + parent: BaseAnomalyInjector + id: AnomalyTrapElectricity + suffix: Electricity + components: + - type: Sprite + layers: + - state: pink + - sprite: Structures/Specific/anomaly.rsi + state: anom3-pulse + - sprite: Mobs/Species/Human/parts.rsi + state: full + - type: InnerBodyAnomalyInjector + injectionComponents: + - type: Anomaly + deleteEntity: false + maxPointsPerSecond: 100 + corePrototype: AnomalyCoreElectricity + - type: InnerBodyAnomaly + injectionProto: AnomalyInjectionElectric + startMessage: inner-anomaly-start-message-shock + fallbackSprite: + sprite: Structures/Specific/Anomalies/inner_anom_layer.rsi + state: shock + speciesSprites: + Vox: + sprite: Structures/Specific/Anomalies/inner_anom_layer.rsi + state: shock_VOX + +- type: entity + parent: BaseAnomalyInjector + id: AnomalyTrapShadow + suffix: Shadow + components: + - type: Sprite + layers: + - state: pink + - sprite: Structures/Specific/Anomalies/shadow_anom.rsi + state: pulse + - sprite: Mobs/Species/Human/parts.rsi + state: full + - type: InnerBodyAnomalyInjector + injectionComponents: + - type: Anomaly + deleteEntity: false + maxPointsPerSecond: 100 + corePrototype: AnomalyCoreShadow + - type: InnerBodyAnomaly + injectionProto: AnomalyInjectionShadow + startMessage: inner-anomaly-start-message-shadow + fallbackSprite: + sprite: Structures/Specific/Anomalies/inner_anom_layer.rsi + state: shadow + speciesSprites: + Vox: + sprite: Structures/Specific/Anomalies/inner_anom_layer.rsi + state: shadow_VOX + +- type: entity + parent: BaseAnomalyInjector + id: AnomalyTrapIce + suffix: Ice + components: + - type: Sprite + layers: + - state: pink + - sprite: Structures/Specific/Anomalies/ice_anom.rsi + state: pulse + - sprite: Mobs/Species/Human/parts.rsi + state: full + - type: InnerBodyAnomalyInjector + injectionComponents: + - type: Anomaly + deleteEntity: false + maxPointsPerSecond: 100 + corePrototype: AnomalyCoreIce + - type: InnerBodyAnomaly + injectionProto: AnomalyInjectionIce + startMessage: inner-anomaly-start-message-frost + fallbackSprite: + sprite: Structures/Specific/Anomalies/inner_anom_layer.rsi + state: frost + speciesSprites: + Vox: + sprite: Structures/Specific/Anomalies/inner_anom_layer.rsi + state: frost_VOX + +- type: entity + parent: BaseAnomalyInjector + id: AnomalyTrapFlora + suffix: Flora + components: + - type: Sprite + layers: + - state: pink + - sprite: Structures/Specific/Anomalies/flora_anom.rsi + state: pulse + - sprite: Mobs/Species/Human/parts.rsi + state: full + - type: InnerBodyAnomalyInjector + injectionComponents: + - type: Anomaly + deleteEntity: false + maxPointsPerSecond: 100 + corePrototype: AnomalyCoreFlora + - type: InnerBodyAnomaly + injectionProto: AnomalyInjectionFlora + startMessage: inner-anomaly-start-message-flora + fallbackSprite: + sprite: Structures/Specific/Anomalies/inner_anom_layer.rsi + state: flora + speciesSprites: + Vox: + sprite: Structures/Specific/Anomalies/inner_anom_layer.rsi + state: flora_VOX + +- type: entity + parent: BaseAnomalyInjector + id: AnomalyTrapBluespace + suffix: Bluespace + components: + - type: Sprite + layers: + - state: pink + - sprite: Structures/Specific/anomaly.rsi + state: anom4-pulse + - sprite: Mobs/Species/Human/parts.rsi + state: full + - type: InnerBodyAnomalyInjector + injectionComponents: + - type: Anomaly + deleteEntity: false + maxPointsPerSecond: 100 + corePrototype: AnomalyCoreBluespace + - type: InnerBodyAnomaly + injectionProto: AnomalyInjectionBluespace + startMessage: inner-anomaly-start-message-bluespace + fallbackSprite: + sprite: Structures/Specific/Anomalies/inner_anom_layer.rsi + state: bluespace + speciesSprites: + Vox: + sprite: Structures/Specific/Anomalies/inner_anom_layer.rsi + state: bluespace_VOX + +- type: entity + parent: BaseAnomalyInjector + id: AnomalyTrapFlesh + suffix: Flesh + components: + - type: Sprite + layers: + - state: pink + - sprite: Structures/Specific/anomaly.rsi + state: anom5-pulse + - sprite: Mobs/Species/Human/parts.rsi + state: full + - type: InnerBodyAnomalyInjector + injectionComponents: + - type: Anomaly + deleteEntity: false + maxPointsPerSecond: 100 + corePrototype: AnomalyCoreFlesh + - type: InnerBodyAnomaly + injectionProto: AnomalyInjectionFlesh + startMessage: inner-anomaly-start-message-flesh + fallbackSprite: + sprite: Structures/Specific/Anomalies/inner_anom_layer.rsi + state: flesh + speciesSprites: + Vox: + sprite: Structures/Specific/Anomalies/inner_anom_layer.rsi + state: flesh_VOX + +- type: entity + parent: BaseAnomalyInjector + id: AnomalyTrapGravity + suffix: Gravity + components: + - type: Sprite + layers: + - state: pink + - sprite: Structures/Specific/anomaly.rsi + state: anom2-pulse + - sprite: Mobs/Species/Human/parts.rsi + state: full + - type: InnerBodyAnomalyInjector + injectionComponents: + - type: Anomaly + deleteEntity: false + maxPointsPerSecond: 100 + corePrototype: AnomalyCoreGravity + - type: InnerBodyAnomaly + injectionProto: AnomalyInjectionGravity + startMessage: inner-anomaly-start-message-grav + fallbackSprite: + sprite: Structures/Specific/Anomalies/inner_anom_layer.rsi + state: grav + speciesSprites: + Vox: + sprite: Structures/Specific/Anomalies/inner_anom_layer.rsi + state: grav_VOX + +- type: entity + parent: BaseAnomalyInjector + id: AnomalyTrapTech + suffix: Tech + components: + - type: Sprite + layers: + - state: pink + - sprite: Structures/Specific/Anomalies/tech_anom.rsi + state: pulse + - sprite: Mobs/Species/Human/parts.rsi + state: full + - type: InnerBodyAnomalyInjector + injectionComponents: + - type: Anomaly + deleteEntity: false + maxPointsPerSecond: 100 + corePrototype: AnomalyCoreTech + - type: InnerBodyAnomaly + injectionProto: AnomalyInjectionTech + startMessage: inner-anomaly-start-message-tech + fallbackSprite: + sprite: Structures/Specific/Anomalies/inner_anom_layer.rsi + state: tech + speciesSprites: + Vox: + sprite: Structures/Specific/Anomalies/inner_anom_layer.rsi + state: tech_VOX + +- type: entity + parent: BaseAnomalyInjector + id: AnomalyTrapRock + suffix: Rock + components: + - type: Sprite + layers: + - state: pink + - sprite: Structures/Specific/anomaly.rsi + state: anom6-pulse + color: "#5ca8cb" + - sprite: Mobs/Species/Human/parts.rsi + state: full + - type: InnerBodyAnomalyInjector + injectionComponents: + - type: Anomaly + deleteEntity: false + maxPointsPerSecond: 100 + corePrototype: AnomalyCoreRock + - type: InnerBodyAnomaly + injectionProto: AnomalyInjectionRock + startMessage: inner-anomaly-start-message-rock + fallbackSprite: + sprite: Structures/Specific/Anomalies/inner_anom_layer.rsi + state: rock + speciesSprites: + Vox: + sprite: Structures/Specific/Anomalies/inner_anom_layer.rsi + state: rock_VOX \ No newline at end of file diff --git a/Resources/Prototypes/GameRules/events.yml b/Resources/Prototypes/GameRules/events.yml index 885c25b6a2b6..e6c257443a92 100644 --- a/Resources/Prototypes/GameRules/events.yml +++ b/Resources/Prototypes/GameRules/events.yml @@ -524,46 +524,6 @@ sounds: collection: Paracusia -- type: entity - id: ImmovableRodSpawn - parent: BaseGameRule - components: - - type: StationEvent - startAnnouncement: true - weight: 3.5 - duration: 1 - earliestStart: 30 - minimumPlayers: 20 - - type: ImmovableRodRule - rodPrototypes: - - id: ImmovableRodKeepTilesStill - prob: 0.95 - orGroup: rodProto - - id: ImmovableRodMop - prob: 0.0072 - orGroup: rodProto - - id: ImmovableRodShark - prob: 0.0072 - orGroup: rodProto - - id: ImmovableRodClown - prob: 0.0072 - orGroup: rodProto - - id: ImmovableRodBanana - prob: 0.0072 - orGroup: rodProto - - id: ImmovableRodHammer - prob: 0.0072 - orGroup: rodProto - - id: ImmovableRodThrongler - prob: 0.0072 - orGroup: rodProto - - id: ImmovableRodGibstick - prob: 0.0072 - orGroup: rodProto - - id: ImmovableRodFinFin - prob: 0.0072 - orGroup: rodProto - - type: entity parent: BaseGameRule id: IonStorm diff --git a/Resources/Prototypes/GameRules/meteorswarms.yml b/Resources/Prototypes/GameRules/meteorswarms.yml index 3163e166c076..7ec693de99c6 100644 --- a/Resources/Prototypes/GameRules/meteorswarms.yml +++ b/Resources/Prototypes/GameRules/meteorswarms.yml @@ -193,3 +193,47 @@ meteorsPerWave: min: 10 max: 10 + +- type: entity + id: ImmovableRodSpawn + parent: BaseGameRule + components: + - type: StationEvent + startAnnouncement: true + weight: 3.5 + reoccurrenceDelay: 1 + duration: 1 + earliestStart: 30 + minimumPlayers: 25 + - type: ImmovableRodRule + rodPrototypes: + - id: ImmovableRodKeepTilesStill + prob: 0.94 + orGroup: rodProto + - id: ImmovableRodMop + prob: 0.0075 + orGroup: rodProto + - id: ImmovableRodShark + prob: 0.0075 + orGroup: rodProto + - id: ImmovableRodClown + prob: 0.0075 + orGroup: rodProto + - id: ImmovableRodBanana + prob: 0.0075 + orGroup: rodProto + - id: ImmovableRodHammer + prob: 0.0075 + orGroup: rodProto + - id: ImmovableRodThrongler + prob: 0.0075 + orGroup: rodProto + - id: ImmovableRodGibstick + prob: 0.0075 + orGroup: rodProto + - id: ImmovableRodWeh + prob: 0.0075 + orGroup: rodProto + - id: ImmovableRodFinFin + prob: 0.0075 + orGroup: rodProto diff --git a/Resources/Prototypes/Objectives/stealTargetGroups.yml b/Resources/Prototypes/Objectives/stealTargetGroups.yml index 2d37ec1ae3dd..48c871eb4697 100644 --- a/Resources/Prototypes/Objectives/stealTargetGroups.yml +++ b/Resources/Prototypes/Objectives/stealTargetGroups.yml @@ -2,84 +2,84 @@ - type: stealTargetGroup id: Hypospray - name: hypospray + name: steal-target-groups-hypospray sprite: sprite: Objects/Specific/Medical/hypospray.rsi state: hypo - type: stealTargetGroup id: HandheldCrewMonitor - name: handheld crew monitor + name: steal-target-groups-handheld-crew-monitor sprite: sprite: Objects/Specific/Medical/handheldcrewmonitor.rsi state: scanner - type: stealTargetGroup id: ClothingOuterHardsuitRd - name: experimental research hardsuit + name: steal-target-groups-clothing-outer-hardsuit-rd sprite: sprite: Clothing/OuterClothing/Hardsuits/rd.rsi state: icon - type: stealTargetGroup id: HandTeleporter - name: hand teleporter + name: steal-target-groups-hand-teleporter sprite: sprite: Objects/Devices/hand_teleporter.rsi state: icon - type: stealTargetGroup id: ClothingShoesBootsMagAdv - name: advanced magboots + name: steal-target-groups-clothing-shoes-boots-mag-adv sprite: sprite: Clothing/Shoes/Boots/magboots-advanced.rsi state: icon - type: stealTargetGroup id: BoxFolderQmClipboard - name: requisition digi-board + name: steal-target-groups-box-folder-qm-clipboard sprite: sprite: Objects/Misc/qm_clipboard.rsi state: qm_clipboard - type: stealTargetGroup id: FoodMeatCorgi - name: prime-cut corgi meat + name: steal-target-groups-food-meat-corgi sprite: sprite: Objects/Consumable/Food/meat.rsi state: corgi # - type: stealTargetGroup id: CaptainIDCard - name: captain ID card + name: steal-target-groups-captain-id-card sprite: sprite: Objects/Misc/id_cards.rsi state: ert_commander #no one will know the difference. - type: stealTargetGroup id: JetpackCaptainFilled - name: captain's jetpack + name: steal-target-groups-jetpack-captain-filled sprite: sprite: Objects/Tanks/Jetpacks/captain.rsi state: icon - type: stealTargetGroup id: WeaponAntiqueLaser - name: antique laser pistol + name: steal-target-groups-weapon-antique-laser sprite: sprite: Objects/Weapons/Guns/Battery/antiquelasergun.rsi state: base - type: stealTargetGroup id: NukeDisk - name: nuclear authentication disk + name: steal-target-groups-nuke-disk sprite: sprite: Objects/Misc/nukedisk.rsi state: icon - type: stealTargetGroup id: WeaponEnergyShotgun - name: energy shotgun + name: steal-target-groups-weapon-energy-shot-gun sprite: sprite: Objects/Weapons/Guns/Battery/energy_shotgun.rsi state: base @@ -88,63 +88,63 @@ - type: stealTargetGroup id: Figurines - name: figurines (any) + name: steal-target-groups-figurines sprite: sprite: Objects/Fun/figurines.rsi state: figurine_spawner - type: stealTargetGroup id: HeadCloak - name: head's cloaks (any) + name: steal-target-groups-heads-cloaks sprite: sprite: Clothing/Neck/Cloaks/cap.rsi state: icon - type: stealTargetGroup id: HeadBedsheet - name: head's bedsheets (any) + name: steal-target-groups-heads-bedsheets sprite: sprite: Objects/Misc/bedsheets.rsi state: sheetNT - type: stealTargetGroup id: Stamp - name: stamps (any) + name: steal-target-groups-stamps sprite: sprite: Objects/Misc/stamps.rsi state: stamp-cap - type: stealTargetGroup id: DoorRemote - name: door remotes (any) + name: steal-target-groups-door-remotes sprite: sprite: Objects/Devices/door_remote.rsi state: door_remotebase - type: stealTargetGroup id: EncryptionKey - name: encryption keys (any) + name: steal-target-groups-encryption-keys sprite: sprite: Objects/Devices/encryption_keys.rsi state: crypt_gray - type: stealTargetGroup id: TechnologyDisk - name: technology disks + name: steal-target-groups-technology-disks sprite: sprite: Objects/Misc/module.rsi state: datadisk_base - type: stealTargetGroup id: IDCard - name: ID Cards (any) + name: steal-target-groups-id-cards sprite: sprite: Objects/Misc/id_cards.rsi state: default - type: stealTargetGroup id: LAMP - name: LAMPS + name: steal-target-groups-lamps sprite: sprite: Objects/Tools/lantern.rsi state: lantern @@ -153,112 +153,112 @@ - type: stealTargetGroup id: ForensicScanner - name: forensic scanner + name: steal-target-groups-forensic-scanner sprite: sprite: Objects/Devices/forensic_scanner.rsi state: forensicnew - type: stealTargetGroup id: FlippoEngravedLighter - name: detective's Flippo engraved lighter + name: steal-target-groups-flippo-engraved-lighter sprite: sprite: Objects/Tools/lighters.rsi state: zippo_engraved_icon_base - type: stealTargetGroup id: AmmoTechFabCircuitboard - name: ammo techfab circuit board + name: steal-target-groups-ammo-tech-fab-circuitboard sprite: sprite: Objects/Misc/module.rsi state: security - type: stealTargetGroup id: ClothingHeadHatWarden - name: warden's cap + name: steal-target-groups-clothing-head-hat-warden sprite: sprite: Clothing/Head/Hats/warden.rsi state: icon - type: stealTargetGroup id: ClothingOuterHardsuitVoidParamed - name: paramedic void suit + name: steal-target-groups-clothing-outer-hardsuit-void-paramed sprite: sprite: Clothing/OuterClothing/Hardsuits/paramed.rsi state: icon - type: stealTargetGroup id: MedicalTechFabCircuitboard - name: medical techfab machine board + name: steal-target-groups-medical-tech-fab-circuitboard sprite: sprite: Objects/Misc/module.rsi state: medical - type: stealTargetGroup id: ClothingHeadsetAltMedical - name: chief medical officer's over-ear headset + name: steal-target-groups-clothing-headset-alt-medical sprite: sprite: Clothing/Ears/Headsets/medical.rsi state: icon_alt - type: stealTargetGroup id: ResearchAndDevelopmentServerMachineCircuitboard - name: R&D server machine board + name: steal-target-groups-research-and-development-server-machine-circuitboard sprite: sprite: Objects/Misc/module.rsi state: science - type: stealTargetGroup id: FireAxe - name: fireaxe + name: steal-target-groups-fire-axe sprite: sprite: Objects/Weapons/Melee/fireaxe.rsi state: icon - type: stealTargetGroup id: AmePartFlatpack - name: AME part + name: steal-target-groups-ame-part-flatpack sprite: sprite: Objects/Devices/flatpack.rsi state: ame-part - type: stealTargetGroup id: SalvageExpeditionsComputerCircuitboard - name: salvage expeditions computer board + name: steal-target-groups-salvage-expeditions-computer-circuitboard sprite: sprite: Objects/Misc/module.rsi state: cpu_supply - type: stealTargetGroup id: CargoShuttleConsoleCircuitboard - name: cargo shuttle console board + name: steal-target-groups-cargo-shuttle-console-circuitboard sprite: sprite: Objects/Misc/module.rsi state: cpuboard - type: stealTargetGroup id: ClothingEyesHudBeer - name: beer goggles + name: steal-target-groups-clothing-eyes-hud-beer sprite: sprite: Clothing/Eyes/Hud/beergoggles.rsi state: icon - type: stealTargetGroup id: Bible - name: bible + name: steal-target-groups-bible sprite: sprite: Objects/Specific/Chapel/bible.rsi state: icon - type: stealTargetGroup id: ClothingNeckGoldmedal - name: gold medal of crewmanship + name: steal-target-groups-clothing-neck-goldmedal sprite: sprite: Clothing/Neck/Medals/gold.rsi state: icon - type: stealTargetGroup id: ClothingNeckClownmedal - name: clown medal + name: steal-target-groups-clothing-neck-clownmedal sprite: sprite: Clothing/Neck/Medals/clownmedal.rsi state: icon @@ -267,70 +267,70 @@ - type: stealTargetGroup id: NuclearBomb - name: nuclear fission explosive + name: steal-target-groups-nuclear-bomb sprite: sprite: Objects/Devices/nuke.rsi state: nuclearbomb_base - type: stealTargetGroup id: FaxMachineCaptain - name: captain long range fax machine + name: steal-target-groups-fax-machine-captain sprite: sprite: Structures/Machines/fax_machine.rsi state: icon - type: stealTargetGroup id: ChemDispenser - name: chemical dispenser + name: steal-target-groups-chem-dispenser sprite: sprite: Structures/dispensers.rsi state: industrial-working - type: stealTargetGroup id: XenoArtifact - name: big alien artifact + name: steal-target-groups-xeno-artifact sprite: sprite: Objects/Specific/Xenoarchaeology/xeno_artifacts.rsi state: ano28 - type: stealTargetGroup id: FreezerHeater - name: freezer or heater + name: steal-target-groups-freezer-heater sprite: sprite: Structures/Piping/Atmospherics/thermomachine.rsi state: heaterOff - type: stealTargetGroup id: Teg - name: teg generator part + name: steal-target-groups-teg sprite: sprite: Structures/Power/Generation/teg.rsi state: teg - type: stealTargetGroup id: BoozeDispenser - name: booze dispenser + name: steal-target-groups-booze-dispenser sprite: sprite: Structures/smalldispensers.rsi state: booze - type: stealTargetGroup id: AltarNanotrasen - name: nanotrasen altar (any) + name: steal-target-groups-altar-nanotrasen sprite: sprite: Structures/Furniture/Altars/Gods/nanotrasen.rsi state: nanotrasen - type: stealTargetGroup id: PlantRD - name: RD's potted plant + name: steal-target-groups-plant-rd sprite: sprite: Structures/Furniture/potted_plants.rsi state: plant-25 - type: stealTargetGroup id: ToiletGoldenDirtyWater - name: golden toilet + name: steal-target-groups-toilet-golden-dirty-water sprite: sprite: Structures/Furniture/golden_toilet.rsi state: condisposal @@ -339,63 +339,63 @@ - type: stealTargetGroup id: AnimalIan - name: Ian + name: steal-target-groups-animal-ian sprite: sprite: Mobs/Pets/corgi.rsi state: ian - type: stealTargetGroup id: AnimalNamedCat - name: CMO's Cat + name: steal-target-groups-animal-named-cat sprite: sprite: Mobs/Pets/bingus.rsi state: bingus - type: stealTargetGroup id: AnimalMcGriff - name: McGriff + name: steal-target-groups-animal-mc-griff sprite: sprite: Mobs/Pets/mcgriff.rsi state: mcgriff - type: stealTargetGroup id: AnimalWalter - name: Walter + name: steal-target-groups-animal-walter sprite: sprite: Mobs/Pets/walter.rsi state: walter - type: stealTargetGroup id: AnimalMorty - name: Morty + name: steal-target-groups-animal-morty sprite: sprite: Mobs/Animals/possum.rsi state: possum - type: stealTargetGroup id: AnimalRenault - name: Renault + name: steal-target-groups-animal-renault sprite: sprite: Mobs/Animals/fox.rsi state: fox - type: stealTargetGroup id: AnimalShiva - name: Shiva + name: steal-target-groups-animal-shiva sprite: sprite: Mobs/Pets/shiva.rsi state: shiva - type: stealTargetGroup id: AnimalTropico - name: Tropico + name: steal-target-groups-animal-tropico sprite: sprite: Mobs/Animals/crab.rsi state: crab - type: stealTargetGroup id: AnimalPipi - name: Pipi + name: steal-target-groups-animal-pipi sprite: sprite: Mobs/Pets/pipi.rsi state: pipi diff --git a/Resources/Prototypes/Reagents/toxins.yml b/Resources/Prototypes/Reagents/toxins.yml index abb6f1cde70d..67c9b380df94 100644 --- a/Resources/Prototypes/Reagents/toxins.yml +++ b/Resources/Prototypes/Reagents/toxins.yml @@ -402,8 +402,6 @@ effects: - !type:HealthChange conditions: - - !type:ReagentThreshold - min: 1 - !type:OrganType type: Animal # Applying damage to the mobs with lower metabolism capabilities damage: @@ -412,8 +410,6 @@ - !type:ChemVomit probability: 0.04 #Scaled for time, not metabolismrate. conditions: - - !type:ReagentThreshold - min: 3 - !type:OrganType type: Animal diff --git a/Resources/Prototypes/tags.yml b/Resources/Prototypes/tags.yml index 1fa5a1ae051f..5914c55896f6 100644 --- a/Resources/Prototypes/tags.yml +++ b/Resources/Prototypes/tags.yml @@ -15,6 +15,9 @@ - type: Tag id: Ambrosia +- type: Tag + id: AnomalyHost + - type: Tag id: AppraisalTool diff --git a/Resources/Textures/Objects/Devices/encryption_keys.rsi/borg_label.png b/Resources/Textures/Objects/Devices/encryption_keys.rsi/borg_label.png new file mode 100644 index 000000000000..2b56e1677306 Binary files /dev/null and b/Resources/Textures/Objects/Devices/encryption_keys.rsi/borg_label.png differ diff --git a/Resources/Textures/Objects/Devices/encryption_keys.rsi/meta.json b/Resources/Textures/Objects/Devices/encryption_keys.rsi/meta.json index e44abd8d1e67..6ae7bca9dda4 100644 --- a/Resources/Textures/Objects/Devices/encryption_keys.rsi/meta.json +++ b/Resources/Textures/Objects/Devices/encryption_keys.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Created by DSC@300074782328750080 for Space Station 14.", + "copyright": "Created by DSC@300074782328750080 for Space Station 14, borg_label taken from https://github.com/vgstation-coders/vgstation13/blob/e71d6c4fba5a51f99b81c295dcaec4fc2f58fb19/icons/mob/screen1.dmi and modified by ArtisticRoomba", "size": { "x": 32, "y": 32 @@ -34,6 +34,7 @@ {"name": "sci_label"}, {"name": "sec_label"}, {"name": "service_label"}, - {"name": "synd_label"} + {"name": "synd_label"}, + {"name": "borg_label"} ] -} \ No newline at end of file +} diff --git a/Resources/Textures/Structures/Machines/VendingMachines/bruiseomat.rsi/broken.png b/Resources/Textures/Structures/Machines/VendingMachines/bruiseomat.rsi/broken.png new file mode 100644 index 000000000000..1df632306540 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/bruiseomat.rsi/broken.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/bruiseomat.rsi/deny-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/bruiseomat.rsi/deny-unshaded.png new file mode 100644 index 000000000000..52f43a543f7a Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/bruiseomat.rsi/deny-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/bruiseomat.rsi/meta.json b/Resources/Textures/Structures/Machines/VendingMachines/bruiseomat.rsi/meta.json new file mode 100644 index 000000000000..dcf3878b5146 --- /dev/null +++ b/Resources/Textures/Structures/Machines/VendingMachines/bruiseomat.rsi/meta.json @@ -0,0 +1,89 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/1516a728931b4985c1e86f0c5995a5aa1554a1ad and modified by Swept, further modification by ArtisticRoomba", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "broken" + }, + { + "name": "deny-unshaded", + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "normal-unshaded", + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "off" + }, + { + "name": "panel" + } + ] +} diff --git a/Resources/Textures/Structures/Machines/VendingMachines/bruiseomat.rsi/normal-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/bruiseomat.rsi/normal-unshaded.png new file mode 100644 index 000000000000..ff9ad344c26a Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/bruiseomat.rsi/normal-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/bruiseomat.rsi/off.png b/Resources/Textures/Structures/Machines/VendingMachines/bruiseomat.rsi/off.png new file mode 100644 index 000000000000..c3427b7188c3 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/bruiseomat.rsi/off.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/bruiseomat.rsi/panel.png b/Resources/Textures/Structures/Machines/VendingMachines/bruiseomat.rsi/panel.png new file mode 100644 index 000000000000..60dbf76b85e3 Binary files /dev/null and b/Resources/Textures/Structures/Machines/VendingMachines/bruiseomat.rsi/panel.png differ diff --git a/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/bluespace.png b/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/bluespace.png new file mode 100644 index 000000000000..5e9311e0641e Binary files /dev/null and b/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/bluespace.png differ diff --git a/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/bluespace_VOX.png b/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/bluespace_VOX.png new file mode 100644 index 000000000000..b594cac2a90a Binary files /dev/null and b/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/bluespace_VOX.png differ diff --git a/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/fire.png b/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/fire.png new file mode 100644 index 000000000000..a6fcde7a1841 Binary files /dev/null and b/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/fire.png differ diff --git a/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/fire_VOX.png b/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/fire_VOX.png new file mode 100644 index 000000000000..91eb39570400 Binary files /dev/null and b/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/fire_VOX.png differ diff --git a/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/flesh.png b/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/flesh.png new file mode 100644 index 000000000000..6e178307c33e Binary files /dev/null and b/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/flesh.png differ diff --git a/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/flesh_VOX.png b/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/flesh_VOX.png new file mode 100644 index 000000000000..b1a1c43da0f8 Binary files /dev/null and b/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/flesh_VOX.png differ diff --git a/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/flora.png b/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/flora.png new file mode 100644 index 000000000000..70e369cb02ba Binary files /dev/null and b/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/flora.png differ diff --git a/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/flora_VOX.png b/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/flora_VOX.png new file mode 100644 index 000000000000..97969116a978 Binary files /dev/null and b/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/flora_VOX.png differ diff --git a/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/frost.png b/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/frost.png new file mode 100644 index 000000000000..4823cb5a6f2f Binary files /dev/null and b/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/frost.png differ diff --git a/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/frost_VOX.png b/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/frost_VOX.png new file mode 100644 index 000000000000..346cad09b106 Binary files /dev/null and b/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/frost_VOX.png differ diff --git a/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/grav.png b/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/grav.png new file mode 100644 index 000000000000..c0775c0fb937 Binary files /dev/null and b/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/grav.png differ diff --git a/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/grav_VOX.png b/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/grav_VOX.png new file mode 100644 index 000000000000..04bfb8a0bfdb Binary files /dev/null and b/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/grav_VOX.png differ diff --git a/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/meta.json b/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/meta.json new file mode 100644 index 000000000000..4e069d0cd90b --- /dev/null +++ b/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/meta.json @@ -0,0 +1,643 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "Created by TheShuEd (github) for Space Station 14", + "states": [ + { + "name": "bluespace", + "directions": 4, + "delays": [ + [ + 0.3, + 0.3, + 0.3, + 0.3 + ], + [ + 0.3, + 0.3, + 0.3, + 0.3 + ], + [ + 0.3, + 0.3, + 0.3, + 0.3 + ], + [ + 0.3, + 0.3, + 0.3, + 0.3 + ] + ] + }, + { + "name": "bluespace_VOX", + "directions": 4, + "delays": [ + [ + 0.3, + 0.3, + 0.3, + 0.3 + ], + [ + 0.3, + 0.3, + 0.3, + 0.3 + ], + [ + 0.3, + 0.3, + 0.3, + 0.3 + ], + [ + 0.3, + 0.3, + 0.3, + 0.3 + ] + ] + }, + { + "name": "fire", + "directions": 4, + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "fire_VOX", + "directions": 4, + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "flesh", + "directions": 4, + "delays": [ + [ + 0.8, + 0.2, + 0.2 + ], + [ + 0.8, + 0.2, + 0.2 + ], + [ + 0.8, + 0.2, + 0.2 + ], + [ + 0.8, + 0.2, + 0.2 + ] + ] + }, + { + "name": "flesh_VOX", + "directions": 4, + "delays": [ + [ + 0.8, + 0.2, + 0.2 + ], + [ + 0.8, + 0.2, + 0.2 + ], + [ + 0.8, + 0.2, + 0.2 + ], + [ + 0.8, + 0.2, + 0.2 + ] + ] + }, + { + "name": "flora", + "directions": 4, + "delays": [ + [ + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3 + ], + [ + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3 + ], + [ + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3 + ], + [ + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3 + ] + ] + }, + { + "name": "flora_VOX", + "directions": 4, + "delays": [ + [ + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3 + ], + [ + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3 + ], + [ + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3 + ], + [ + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3 + ] + ] + }, + { + "name": "frost", + "directions": 4, + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "frost_VOX", + "directions": 4, + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "grav", + "directions": 4, + "delays": [ + [ + 0.3, + 0.3, + 0.3, + 0.3 + ], + [ + 0.3, + 0.3, + 0.3, + 0.3 + ], + [ + 0.3, + 0.3, + 0.3, + 0.3 + ], + [ + 0.3, + 0.3, + 0.3, + 0.3 + ] + ] + }, + { + "name": "grav_VOX", + "directions": 4, + "delays": [ + [ + 0.3, + 0.3, + 0.3, + 0.3 + ], + [ + 0.3, + 0.3, + 0.3, + 0.3 + ], + [ + 0.3, + 0.3, + 0.3, + 0.3 + ], + [ + 0.3, + 0.3, + 0.3, + 0.3 + ] + ] + }, + { + "name": "rock", + "directions": 4, + "delays": [ + [ + 0.9, + 0.2, + 0.2, + 0.2 + ], + [ + 0.9, + 0.2, + 0.2, + 0.2 + ], + [ + 0.9, + 0.2, + 0.2, + 0.2 + ], + [ + 0.9, + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "rock_VOX", + "directions": 4, + "delays": [ + [ + 0.9, + 0.2, + 0.2, + 0.2 + ], + [ + 0.9, + 0.2, + 0.2, + 0.2 + ], + [ + 0.9, + 0.2, + 0.2, + 0.2 + ], + [ + 0.9, + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "shadow", + "directions": 4, + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "shadow_VOX", + "directions": 4, + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "shock", + "directions": 4, + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "shock_VOX", + "directions": 4, + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "tech", + "directions": 4, + "delays": [ + [ + 0.2, + 0.4, + 0.2, + 0.4 + ], + [ + 0.2, + 0.4, + 0.2, + 0.4 + ], + [ + 0.2, + 0.4, + 0.2, + 0.4 + ], + [ + 0.2, + 0.4, + 0.2, + 0.4 + ] + ] + }, + { + "name": "tech_VOX", + "directions": 4, + "delays": [ + [ + 0.2, + 0.4, + 0.2, + 0.4 + ], + [ + 0.2, + 0.4, + 0.2, + 0.4 + ], + [ + 0.2, + 0.4, + 0.2, + 0.4 + ], + [ + 0.2, + 0.4, + 0.2, + 0.4 + ] + ] + } + ] +} diff --git a/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/rock.png b/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/rock.png new file mode 100644 index 000000000000..770e4b8d2f80 Binary files /dev/null and b/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/rock.png differ diff --git a/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/rock_VOX.png b/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/rock_VOX.png new file mode 100644 index 000000000000..b11a9182fb7f Binary files /dev/null and b/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/rock_VOX.png differ diff --git a/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/shadow.png b/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/shadow.png new file mode 100644 index 000000000000..345248bc5362 Binary files /dev/null and b/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/shadow.png differ diff --git a/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/shadow_VOX.png b/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/shadow_VOX.png new file mode 100644 index 000000000000..6efb246ac188 Binary files /dev/null and b/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/shadow_VOX.png differ diff --git a/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/shock.png b/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/shock.png new file mode 100644 index 000000000000..acdc87a291c1 Binary files /dev/null and b/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/shock.png differ diff --git a/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/shock_VOX.png b/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/shock_VOX.png new file mode 100644 index 000000000000..d1f011c44d30 Binary files /dev/null and b/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/shock_VOX.png differ diff --git a/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/tech.png b/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/tech.png new file mode 100644 index 000000000000..0611fa8a2a09 Binary files /dev/null and b/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/tech.png differ diff --git a/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/tech_VOX.png b/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/tech_VOX.png new file mode 100644 index 000000000000..1787cdd4e06c Binary files /dev/null and b/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/tech_VOX.png differ diff --git a/Resources/Textures/Structures/Specific/anomaly.rsi/anom5-pulse.png b/Resources/Textures/Structures/Specific/anomaly.rsi/anom5-pulse.png index c0e547f8dd90..d8b6f14c1197 100644 Binary files a/Resources/Textures/Structures/Specific/anomaly.rsi/anom5-pulse.png and b/Resources/Textures/Structures/Specific/anomaly.rsi/anom5-pulse.png differ diff --git a/Resources/Textures/Structures/Specific/anomaly.rsi/anom5.png b/Resources/Textures/Structures/Specific/anomaly.rsi/anom5.png index 6117776649f1..a36dd2b64ada 100644 Binary files a/Resources/Textures/Structures/Specific/anomaly.rsi/anom5.png and b/Resources/Textures/Structures/Specific/anomaly.rsi/anom5.png differ diff --git a/RobustToolbox b/RobustToolbox index 0f60ad9018f5..c86cb0b7951c 160000 --- a/RobustToolbox +++ b/RobustToolbox @@ -1 +1 @@ -Subproject commit 0f60ad9018f54f9b49da1810bbffa01e2c5975f7 +Subproject commit c86cb0b7951cc4a662c7292138c5f45d868c5f58 diff --git a/Tools/SS14 Aseprite Templates/IconSmoothingTemplate README.txt b/Tools/SS14 Aseprite Templates/IconSmoothingTemplate README.txt new file mode 100644 index 000000000000..083e803ecd18 --- /dev/null +++ b/Tools/SS14 Aseprite Templates/IconSmoothingTemplate README.txt @@ -0,0 +1,4 @@ +This is a template that greatly simplifies working with IconSmooth sprites. + +A video on how to use it can be found at the link: +https://github.com/space-wizards/space-station-14/pull/32210 \ No newline at end of file diff --git a/Tools/SS14 Aseprite Templates/IconSmoothingTemplate.aseprite b/Tools/SS14 Aseprite Templates/IconSmoothingTemplate.aseprite new file mode 100644 index 000000000000..112a1d932cad Binary files /dev/null and b/Tools/SS14 Aseprite Templates/IconSmoothingTemplate.aseprite differ