diff --git a/Content.Client/Audio/BackgroundAudioSystem.cs b/Content.Client/Audio/BackgroundAudioSystem.cs index 100ee7458e..0b31db2463 100644 --- a/Content.Client/Audio/BackgroundAudioSystem.cs +++ b/Content.Client/Audio/BackgroundAudioSystem.cs @@ -34,7 +34,7 @@ public sealed class BackgroundAudioSystem : EntitySystem _client.PlayerLeaveServer += OnLeave; - _gameTicker.LobbyStatusUpdated += LobbySongReceived; + _gameTicker.LobbySongUpdated += LobbySongUpdated; } public override void Shutdown() @@ -48,7 +48,7 @@ public sealed class BackgroundAudioSystem : EntitySystem _client.PlayerLeaveServer -= OnLeave; - _gameTicker.LobbyStatusUpdated -= LobbySongReceived; + _gameTicker.LobbySongUpdated -= LobbySongUpdated; EndLobbyMusic(); } @@ -95,17 +95,9 @@ public sealed class BackgroundAudioSystem : EntitySystem } } - private void LobbySongReceived() + private void LobbySongUpdated() { - if (_lobbyStream != null) //Toggling Ready status fires this method. This check ensures we only start the lobby music if it's not playing. - { - return; - } - - if (_stateManager.CurrentState is LobbyState) - { - StartLobbyMusic(); - } + RestartLobbyMusic(); } public void RestartLobbyMusic() diff --git a/Content.Client/Examine/ExamineSystem.cs b/Content.Client/Examine/ExamineSystem.cs index 180777f374..89a9486483 100644 --- a/Content.Client/Examine/ExamineSystem.cs +++ b/Content.Client/Examine/ExamineSystem.cs @@ -20,6 +20,8 @@ using Content.Shared.Eye.Blinding.Components; using Robust.Client; using static Content.Shared.Interaction.SharedInteractionSystem; using static Robust.Client.UserInterface.Controls.BoxContainer; +using Content.Shared.Interaction.Events; +using Content.Shared.Item; namespace Content.Client.Examine { @@ -50,6 +52,8 @@ namespace Content.Client.Examine SubscribeNetworkEvent(OnExamineInfoResponse); + SubscribeLocalEvent(OnExaminedItemDropped); + CommandBinds.Builder .Bind(ContentKeyFunctions.ExamineEntity, new PointerInputCmdHandler(HandleExamine, outsidePrediction: true)) .Register(); @@ -57,6 +61,19 @@ namespace Content.Client.Examine _idCounter = 0; } + private void OnExaminedItemDropped(EntityUid item, ItemComponent comp, DroppedEvent args) + { + if (!args.User.Valid) + return; + if (_playerManager.LocalPlayer == null) + return; + if (_examineTooltipOpen == null) + return; + + if (item == _examinedEntity && args.User == _playerManager.LocalPlayer.ControlledEntity) + CloseTooltip(); + } + public override void Update(float frameTime) { if (_examineTooltipOpen is not {Visible: true}) return; diff --git a/Content.Client/GameTicking/Managers/ClientGameTicker.cs b/Content.Client/GameTicking/Managers/ClientGameTicker.cs index 5c255cd193..7c94a60aad 100644 --- a/Content.Client/GameTicking/Managers/ClientGameTicker.cs +++ b/Content.Client/GameTicking/Managers/ClientGameTicker.cs @@ -1,4 +1,3 @@ -using Content.Client.Audio; using Content.Client.Gameplay; using Content.Client.Lobby; using Content.Client.RoundEnd; @@ -8,7 +7,6 @@ using Content.Shared.GameWindow; using JetBrains.Annotations; using Robust.Client.Graphics; using Robust.Client.State; -using Robust.Shared.Audio; using Robust.Shared.Configuration; using Robust.Shared.Player; using Robust.Shared.Utility; @@ -21,7 +19,6 @@ namespace Content.Client.GameTicking.Managers [Dependency] private readonly IStateManager _stateManager = default!; [Dependency] private readonly IEntityManager _entityManager = default!; [Dependency] private readonly IConfigurationManager _configManager = default!; - [Dependency] private readonly BackgroundAudioSystem _backgroundAudio = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; [ViewVariables] private bool _initialized; @@ -49,6 +46,7 @@ namespace Content.Client.GameTicking.Managers public event Action? InfoBlobUpdated; public event Action? LobbyStatusUpdated; + public event Action? LobbySongUpdated; public event Action? LobbyLateJoinStatusUpdated; public event Action>>? LobbyJobsAvailableUpdated; @@ -73,6 +71,16 @@ namespace Content.Client.GameTicking.Managers _initialized = true; } + public void SetLobbySong(string? song, bool forceUpdate = false) + { + var updated = song != LobbySong; + + LobbySong = song; + + if (updated || forceUpdate) + LobbySongUpdated?.Invoke(); + } + private void LateJoinStatus(TickerLateJoinStatusEvent message) { DisallowedLateJoin = message.Disallowed; @@ -97,7 +105,7 @@ namespace Content.Client.GameTicking.Managers RoundStartTimeSpan = message.RoundStartTimeSpan; IsGameStarted = message.IsRoundStarted; AreWeReady = message.YouAreReady; - LobbySong = message.LobbySong; + SetLobbySong(message.LobbySong); LobbyBackground = message.LobbyBackground; Paused = message.Paused; @@ -124,12 +132,8 @@ namespace Content.Client.GameTicking.Managers private void RoundEnd(RoundEndMessageEvent message) { - if (message.LobbySong != null) - { - LobbySong = message.LobbySong; - _backgroundAudio.StartLobbyMusic(); - } - + // Force an update in the event of this song being the same as the last. + SetLobbySong(message.LobbySong, true); RestartSound = message.RestartSound; // Don't open duplicate windows (mainly for replays). diff --git a/Content.Client/Stealth/StealthSystem.cs b/Content.Client/Stealth/StealthSystem.cs index 2dc61f03f2..b60ffc2a40 100644 --- a/Content.Client/Stealth/StealthSystem.cs +++ b/Content.Client/Stealth/StealthSystem.cs @@ -44,7 +44,7 @@ public sealed class StealthSystem : SharedStealthSystem if (!enabled) { - if (component.HadOutline) + if (component.HadOutline && !TerminatingOrDeleted(uid)) EnsureComp(uid); return; } @@ -63,7 +63,8 @@ public sealed class StealthSystem : SharedStealthSystem private void OnShutdown(EntityUid uid, StealthComponent component, ComponentShutdown args) { - SetShader(uid, false, component); + if (!Terminating(uid)) + SetShader(uid, false, component); } private void OnShaderRender(EntityUid uid, StealthComponent component, BeforePostShaderRenderEvent args) diff --git a/Content.IntegrationTests/Tests/EntityTest.cs b/Content.IntegrationTests/Tests/EntityTest.cs index a6d7bf30f8..d89668d4b4 100644 --- a/Content.IntegrationTests/Tests/EntityTest.cs +++ b/Content.IntegrationTests/Tests/EntityTest.cs @@ -153,17 +153,10 @@ namespace Content.IntegrationTests.Tests .Select(p => p.ID) .ToList(); - // for whatever reason, stealth boxes are breaking this test. Surplus crates have a chance of spawning them. - // TODO fix whatever is going wrong here. - HashSet ignored = new() { "GhostBox", "StealthBox", "CrateSyndicateSurplusBundle", "CrateSyndicateSuperSurplusBundle" }; - await server.WaitPost(() => { foreach (var protoId in protoIds) { - if (ignored.Contains(protoId)) - continue; - var mapId = mapManager.CreateMap(); var grid = mapManager.CreateGrid(mapId); var ent = sEntMan.SpawnEntity(protoId, new EntityCoordinates(grid.Owner, 0.5f, 0.5f)); diff --git a/Content.IntegrationTests/Tests/Minds/MindTests.EntityDeletion.cs b/Content.IntegrationTests/Tests/Minds/MindTests.EntityDeletion.cs index 63bc52bbe8..0bace9fc5c 100644 --- a/Content.IntegrationTests/Tests/Minds/MindTests.EntityDeletion.cs +++ b/Content.IntegrationTests/Tests/Minds/MindTests.EntityDeletion.cs @@ -71,7 +71,7 @@ public sealed partial class MindTests [Test] public async Task TestGhostOnDeleteMap() { - await using var pairTracker = await SetupPair(); + await using var pairTracker = await SetupPair(dirty: true); var server = pairTracker.Pair.Server; var testMap = await PoolManager.CreateTestMap(pairTracker); var coordinates = testMap.GridCoords; diff --git a/Content.IntegrationTests/Tests/PrototypeSaveTest.cs b/Content.IntegrationTests/Tests/PrototypeSaveTest.cs index 74123b5bc7..6823b2d58a 100644 --- a/Content.IntegrationTests/Tests/PrototypeSaveTest.cs +++ b/Content.IntegrationTests/Tests/PrototypeSaveTest.cs @@ -29,18 +29,9 @@ namespace Content.IntegrationTests.Tests; [TestFixture] public sealed class PrototypeSaveTest { - private readonly HashSet _ignoredPrototypes = new() - { - "Singularity", // physics collision uses "AllMask" (-1). The flag serializer currently fails to save this because this features un-named bits. - "constructionghost", - // Don't add to this list unless you have a good reason - // Or it is just temporary because tests stopped working and now master has too many broken entities. - }; - [Test] public async Task UninitializedSaveTest() { - // Apparently SpawnTest fails to clean up properly. Due to the similarities, I'll assume this also fails. await using var pairTracker = await PoolManager.GetServerClient(); var server = pairTracker.Pair.Server; @@ -92,9 +83,6 @@ public sealed class PrototypeSaveTest if (!prototype.MapSavable) continue; - if (_ignoredPrototypes.Contains(prototype.ID)) - continue; - if (prototype.SetSuffix == "DEBUG") continue; @@ -165,10 +153,7 @@ public sealed class PrototypeSaveTest var diff = compMapping.Except(protoMapping); if (diff != null && diff.Children.Count != 0) - { - var modComps = string.Join(",", diff.Keys.Select(x => x.ToString())); - Assert.Fail($"Prototype {prototype.ID} modifies component on spawn: {compName}. Modified fields: {modComps}"); - } + Assert.Fail($"Prototype {prototype.ID} modifies component on spawn: {compName}. Modified yaml:\n{diff}"); } else { diff --git a/Content.Server/Atmos/Monitor/Components/AirAlarmComponent.cs b/Content.Server/Atmos/Monitor/Components/AirAlarmComponent.cs index d0c1a3a86c..7684f04bbc 100644 --- a/Content.Server/Atmos/Monitor/Components/AirAlarmComponent.cs +++ b/Content.Server/Atmos/Monitor/Components/AirAlarmComponent.cs @@ -1,7 +1,10 @@ +using Content.Server.DeviceLinking.Components; using Content.Shared.Atmos.Monitor; using Content.Shared.Atmos.Monitor.Components; using Content.Shared.Atmos.Piping.Unary.Components; +using Content.Shared.DeviceLinking; using Robust.Shared.Network; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; namespace Content.Server.Atmos.Monitor.Components; @@ -24,4 +27,28 @@ public sealed class AirAlarmComponent : Component public HashSet ActivePlayers = new(); public bool CanSync = true; + + /// + /// Previous alarm state for use with output ports. + /// + [DataField("state")] + public AtmosAlarmType State = AtmosAlarmType.Normal; + + /// + /// The port that gets set to high while the alarm is in the danger state, and low when not. + /// + [DataField("dangerPort", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string DangerPort = "AirDanger"; + + /// + /// The port that gets set to high while the alarm is in the warning state, and low when not. + /// + [DataField("warningPort", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string WarningPort = "AirWarning"; + + /// + /// The port that gets set to high while the alarm is in the normal state, and low when not. + /// + [DataField("normalPort", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string NormalPort = "AirNormal"; } diff --git a/Content.Server/Atmos/Monitor/Systems/AirAlarmSystem.cs b/Content.Server/Atmos/Monitor/Systems/AirAlarmSystem.cs index 4ee9a9ac8e..f88a36557e 100644 --- a/Content.Server/Atmos/Monitor/Systems/AirAlarmSystem.cs +++ b/Content.Server/Atmos/Monitor/Systems/AirAlarmSystem.cs @@ -1,6 +1,7 @@ using System.Linq; using Content.Server.Atmos.Monitor.Components; using Content.Server.Atmos.Piping.Components; +using Content.Server.DeviceLinking.Systems; using Content.Server.DeviceNetwork; using Content.Server.DeviceNetwork.Components; using Content.Server.DeviceNetwork.Systems; @@ -13,6 +14,7 @@ using Content.Shared.Atmos; using Content.Shared.Atmos.Monitor; using Content.Shared.Atmos.Monitor.Components; using Content.Shared.Atmos.Piping.Unary.Components; +using Content.Shared.DeviceLinking; using Content.Shared.DeviceNetwork; using Content.Shared.DeviceNetwork.Systems; using Content.Shared.Interaction; @@ -32,14 +34,14 @@ namespace Content.Server.Atmos.Monitor.Systems; // response data in its data key. public sealed class AirAlarmSystem : EntitySystem { - [Dependency] private readonly DeviceNetworkSystem _deviceNet = default!; - [Dependency] private readonly DeviceListSystem _deviceListSystem = default!; - [Dependency] private readonly AtmosDeviceNetworkSystem _atmosDevNetSystem = default!; + [Dependency] private readonly AccessReaderSystem _access = default!; [Dependency] private readonly AtmosAlarmableSystem _atmosAlarmable = default!; - [Dependency] private readonly UserInterfaceSystem _uiSystem = default!; - [Dependency] private readonly AccessReaderSystem _accessSystem = default!; + [Dependency] private readonly AtmosDeviceNetworkSystem _atmosDevNet = default!; + [Dependency] private readonly DeviceNetworkSystem _deviceNet = default!; + [Dependency] private readonly DeviceLinkSystem _deviceLink = default!; + [Dependency] private readonly DeviceListSystem _deviceList = default!; [Dependency] private readonly PopupSystem _popup = default!; - [Dependency] private readonly SharedInteractionSystem _interactionSystem = default!; + [Dependency] private readonly UserInterfaceSystem _ui = default!; #region Device Network API @@ -57,8 +59,8 @@ public sealed class AirAlarmSystem : EntitySystem /// The data to send to the device. public void SetData(EntityUid uid, string address, IAtmosDeviceData data) { - _atmosDevNetSystem.SetDeviceState(uid, address, data); - _atmosDevNetSystem.Sync(uid, address); + _atmosDevNet.SetDeviceState(uid, address, data); + _atmosDevNet.Sync(uid, address); } /// @@ -66,7 +68,7 @@ public sealed class AirAlarmSystem : EntitySystem /// private void SyncAllDevices(EntityUid uid) { - _atmosDevNetSystem.Sync(uid, null); + _atmosDevNet.Sync(uid, null); } /// @@ -75,7 +77,7 @@ public sealed class AirAlarmSystem : EntitySystem /// The address of the device. private void SyncDevice(EntityUid uid, string address) { - _atmosDevNetSystem.Sync(uid, address); + _atmosDevNet.Sync(uid, address); } /// @@ -85,8 +87,8 @@ public sealed class AirAlarmSystem : EntitySystem /// private void SyncRegisterAllDevices(EntityUid uid) { - _atmosDevNetSystem.Register(uid, null); - _atmosDevNetSystem.Sync(uid, null); + _atmosDevNet.Register(uid, null); + _atmosDevNet.Sync(uid, null); } /// @@ -133,8 +135,7 @@ public sealed class AirAlarmSystem : EntitySystem /// The mode to sync with the rest of the network. private void SyncMode(EntityUid uid, AirAlarmMode mode) { - if (EntityManager.TryGetComponent(uid, out AtmosMonitorComponent? monitor) - && !monitor.NetEnabled) + if (TryComp(uid, out var monitor) && !monitor.NetEnabled) return; var payload = new NetworkPayload @@ -165,6 +166,8 @@ public sealed class AirAlarmSystem : EntitySystem SubscribeLocalEvent(OnTabChange); SubscribeLocalEvent(OnDeviceListUpdate); SubscribeLocalEvent(OnClose); + SubscribeLocalEvent(OnInit); + SubscribeLocalEvent(OnMapInit); SubscribeLocalEvent(OnShutdown); SubscribeLocalEvent(OnActivate); } @@ -179,7 +182,7 @@ public sealed class AirAlarmSystem : EntitySystem continue; } - _atmosDevNetSystem.Deregister(uid, deviceNet.Address); + _atmosDevNet.Deregister(uid, deviceNet.Address); } component.ScrubberData.Clear(); @@ -220,6 +223,18 @@ public sealed class AirAlarmSystem : EntitySystem RemoveActiveInterface(uid); } + private void OnInit(EntityUid uid, AirAlarmComponent comp, ComponentInit args) + { + _deviceLink.EnsureSourcePorts(uid, comp.DangerPort, comp.WarningPort, comp.NormalPort); + } + + private void OnMapInit(EntityUid uid, AirAlarmComponent comp, MapInitEvent args) + { + // for mapped linked air alarms, start with high so when it changes for the first time it goes from high to low + // without this the output would suddenly get sent a low signal after nothing which is bad + _deviceLink.SendSignal(uid, GetPort(comp), true); + } + private void OnShutdown(EntityUid uid, AirAlarmComponent component, ComponentShutdown args) { _activeUserInterfaces.Remove(uid); @@ -227,9 +242,6 @@ public sealed class AirAlarmSystem : EntitySystem private void OnActivate(EntityUid uid, AirAlarmComponent component, ActivateInWorldEvent args) { - if (!_interactionSystem.InRangeUnobstructed(args.User, args.Target)) - return; - if (!TryComp(args.User, out var actor)) return; @@ -242,9 +254,9 @@ public sealed class AirAlarmSystem : EntitySystem if (!this.IsPowered(uid, EntityManager)) return; - var ui = _uiSystem.GetUiOrNull(uid, SharedAirAlarmInterfaceKey.Key); + var ui = _ui.GetUiOrNull(uid, SharedAirAlarmInterfaceKey.Key); if (ui != null) - _uiSystem.OpenUi(ui, actor.PlayerSession); + _ui.OpenUi(ui, actor.PlayerSession); component.ActivePlayers.Add(actor.PlayerSession.UserId); AddActiveInterface(uid); SyncAllDevices(uid); @@ -268,12 +280,20 @@ public sealed class AirAlarmSystem : EntitySystem private void OnUpdateAlarmMode(EntityUid uid, AirAlarmComponent component, AirAlarmUpdateAlarmModeMessage args) { - var addr = string.Empty; - if (EntityManager.TryGetComponent(uid, out DeviceNetworkComponent? netConn)) addr = netConn.Address; if (AccessCheck(uid, args.Session.AttachedEntity, component)) + { + var addr = string.Empty; + if (TryComp(uid, out var netConn)) + { + addr = netConn.Address; + } + SetMode(uid, addr, args.Mode, false); + } else + { UpdateUI(uid, component); + } } private void OnUpdateAutoMode(EntityUid uid, AirAlarmComponent component, AirAlarmUpdateAutoModeMessage args) @@ -293,7 +313,7 @@ public sealed class AirAlarmSystem : EntitySystem private void OnUpdateDeviceData(EntityUid uid, AirAlarmComponent component, AirAlarmUpdateDeviceDataMessage args) { if (AccessCheck(uid, args.Session.AttachedEntity, component) - && _deviceListSystem.ExistsInDeviceList(uid, args.Address)) + && _deviceList.ExistsInDeviceList(uid, args.Address)) { SetDeviceData(uid, args.Address, args.Data); } @@ -334,10 +354,14 @@ public sealed class AirAlarmSystem : EntitySystem if (!Resolve(uid, ref component)) return false; - if (!EntityManager.TryGetComponent(uid, out AccessReaderComponent? reader) || user == null) + // if it has no access reader behave as if the user has AA + if (!TryComp(uid, out var reader)) + return true; + + if (user == null) return false; - if (!_accessSystem.IsAllowed(user.Value, reader)) + if (!_access.IsAllowed(user.Value, reader)) { _popup.PopupEntity(Loc.GetString("air-alarm-ui-access-denied"), user.Value, user.Value); return false; @@ -354,8 +378,10 @@ public sealed class AirAlarmSystem : EntitySystem } var addr = string.Empty; - if (EntityManager.TryGetComponent(uid, out DeviceNetworkComponent? netConn)) + if (TryComp(uid, out var netConn)) + { addr = netConn.Address; + } if (component.AutoMode) { @@ -369,9 +395,32 @@ public sealed class AirAlarmSystem : EntitySystem } } + if (component.State != args.AlarmType) + { + TryComp(uid, out var source); + + // send low to old state's port + _deviceLink.SendSignal(uid, GetPort(component), false, source); + + // send high to new state's port, along with updating the cached state + component.State = args.AlarmType; + _deviceLink.SendSignal(uid, GetPort(component), true, source); + } + UpdateUI(uid, component); } + private string GetPort(AirAlarmComponent comp) + { + if (comp.State == AtmosAlarmType.Danger) + return comp.DangerPort; + + if (comp.State == AtmosAlarmType.Warning) + return comp.WarningPort; + + return comp.NormalPort; + } + #endregion #region Air Alarm Settings @@ -517,7 +566,7 @@ public sealed class AirAlarmSystem : EntitySystem /// private void ForceCloseAllInterfaces(EntityUid uid) { - _uiSystem.TryCloseAll(uid, SharedAirAlarmInterfaceKey.Key); + _ui.TryCloseAll(uid, SharedAirAlarmInterfaceKey.Key); } private void OnAtmosUpdate(EntityUid uid, AirAlarmComponent alarm, AtmosDeviceUpdateEvent args) @@ -585,7 +634,7 @@ public sealed class AirAlarmSystem : EntitySystem highestAlarm = AtmosAlarmType.Normal; } - _uiSystem.TrySetUiState( + _ui.TrySetUiState( uid, SharedAirAlarmInterfaceKey.Key, new AirAlarmUIState(devNet.Address, deviceCount, pressure, temperature, dataToSend, alarm.CurrentMode, alarm.CurrentTab, highestAlarm.Value, alarm.AutoMode)); diff --git a/Content.Server/Chat/Systems/ChatSystem.cs b/Content.Server/Chat/Systems/ChatSystem.cs index 736ebf5927..00d9cc14f3 100644 --- a/Content.Server/Chat/Systems/ChatSystem.cs +++ b/Content.Server/Chat/Systems/ChatSystem.cs @@ -1,3 +1,4 @@ +using System.Globalization; using System.Linq; using System.Text; using Content.Server.Administration.Logs; @@ -201,8 +202,11 @@ public sealed partial class ChatSystem : SharedChatSystem bool shouldCapitalize = (desiredType != InGameICChatType.Emote); bool shouldPunctuate = _configurationManager.GetCVar(CCVars.ChatPunctuation); + // Capitalizing the word I only happens in English, so we check language here + bool shouldCapitalizeTheWordI = (!CultureInfo.CurrentCulture.IsNeutralCulture && CultureInfo.CurrentCulture.Parent.Name == "en") + || (CultureInfo.CurrentCulture.IsNeutralCulture && CultureInfo.CurrentCulture.Name == "en"); - message = SanitizeInGameICMessage(source, message, out var emoteStr, shouldCapitalize, shouldPunctuate); + message = SanitizeInGameICMessage(source, message, out var emoteStr, shouldCapitalize, shouldPunctuate, shouldCapitalizeTheWordI); // Was there an emote in the message? If so, send it. if (player != null && emoteStr != message && emoteStr != null) @@ -687,12 +691,14 @@ public sealed partial class ChatSystem : SharedChatSystem } // ReSharper disable once InconsistentNaming - private string SanitizeInGameICMessage(EntityUid source, string message, out string? emoteStr, bool capitalize = true, bool punctuate = false) + private string SanitizeInGameICMessage(EntityUid source, string message, out string? emoteStr, bool capitalize = true, bool punctuate = false, bool capitalizeTheWordI = true) { var newMessage = message.Trim(); newMessage = ReplaceWords(newMessage); // Corvax-ChatSanitize if (capitalize) newMessage = SanitizeMessageCapital(newMessage); + if (capitalizeTheWordI) + newMessage = SanitizeMessageCapitalizeTheWordI(newMessage, "i"); if (punctuate) newMessage = SanitizeMessagePeriod(newMessage); diff --git a/Content.Server/DeviceLinking/Systems/DeviceLinkSystem.cs b/Content.Server/DeviceLinking/Systems/DeviceLinkSystem.cs index edf937a30c..76f1d55a6b 100644 --- a/Content.Server/DeviceLinking/Systems/DeviceLinkSystem.cs +++ b/Content.Server/DeviceLinking/Systems/DeviceLinkSystem.cs @@ -1,3 +1,4 @@ +using Content.Server.DeviceLinking.Components; using Content.Server.DeviceLinking.Events; using Content.Server.DeviceNetwork; using Content.Server.DeviceNetwork.Components; @@ -95,11 +96,25 @@ public sealed class DeviceLinkSystem : SharedDeviceLinkSystem } } - _deviceNetworkSystem.QueuePacket(uid, sinkNetworkComponent.Address, payload, sinkNetworkComponent.ReceiveFrequency); + // force using wireless network so things like atmos devices are able to send signals + var network = (int) DeviceNetworkComponent.DeviceNetIdDefaults.Wireless; + _deviceNetworkSystem.QueuePacket(uid, sinkNetworkComponent.Address, payload, sinkNetworkComponent.ReceiveFrequency, network); } } } + /// + /// Helper function that invokes a port with a high/low binary logic signal. + /// + public void SendSignal(EntityUid uid, string port, bool signal, DeviceLinkSourceComponent? comp = null) + { + var data = new NetworkPayload + { + [DeviceNetworkConstants.LogicState] = signal ? SignalState.High : SignalState.Low + }; + InvokePort(uid, port, data, comp); + } + /// /// Checks if the payload has a port defined and if the port is present on the sink. /// Raises a containing the payload when the check passes diff --git a/Content.Server/DeviceLinking/Systems/LogicGateSystem.cs b/Content.Server/DeviceLinking/Systems/LogicGateSystem.cs index d8c87a90ee..360f86eebe 100644 --- a/Content.Server/DeviceLinking/Systems/LogicGateSystem.cs +++ b/Content.Server/DeviceLinking/Systems/LogicGateSystem.cs @@ -140,12 +140,7 @@ public sealed class LogicGateSystem : EntitySystem { comp.LastOutput = output; - var data = new NetworkPayload - { - [DeviceNetworkConstants.LogicState] = output ? SignalState.High : SignalState.Low - }; - - _deviceLink.InvokePort(uid, comp.OutputPort, data); + _deviceLink.SendSignal(uid, comp.OutputPort, output); } } } diff --git a/Content.Server/DeviceLinking/Systems/SignalSwitchSystem.cs b/Content.Server/DeviceLinking/Systems/SignalSwitchSystem.cs index 7da8532f2e..7bcc438b92 100644 --- a/Content.Server/DeviceLinking/Systems/SignalSwitchSystem.cs +++ b/Content.Server/DeviceLinking/Systems/SignalSwitchSystem.cs @@ -30,15 +30,11 @@ public sealed class SignalSwitchSystem : EntitySystem comp.State = !comp.State; _deviceLink.InvokePort(uid, comp.State ? comp.OnPort : comp.OffPort); - var data = new NetworkPayload - { - [DeviceNetworkConstants.LogicState] = comp.State ? SignalState.High : SignalState.Low - }; // only send status if it's a toggle switch and not a button if (comp.OnPort != comp.OffPort) { - _deviceLink.InvokePort(uid, comp.StatusPort, data); + _deviceLink.SendSignal(uid, comp.StatusPort, comp.State); } _audio.PlayPvs(comp.ClickSound, uid, AudioParams.Default.WithVariation(0.125f).WithVolume(8f)); diff --git a/Content.Server/DeviceNetwork/Systems/DeviceNetworkSystem.cs b/Content.Server/DeviceNetwork/Systems/DeviceNetworkSystem.cs index 75204d4885..d17093c294 100644 --- a/Content.Server/DeviceNetwork/Systems/DeviceNetworkSystem.cs +++ b/Content.Server/DeviceNetwork/Systems/DeviceNetworkSystem.cs @@ -66,7 +66,7 @@ namespace Content.Server.DeviceNetwork.Systems /// The frequency to send on /// The data to be sent /// Returns true when the packet was successfully enqueued. - public bool QueuePacket(EntityUid uid, string? address, NetworkPayload data, uint? frequency = null, DeviceNetworkComponent? device = null) + public bool QueuePacket(EntityUid uid, string? address, NetworkPayload data, uint? frequency = null, int? network = null, DeviceNetworkComponent? device = null) { if (!Resolve(uid, ref device, false)) return false; @@ -79,7 +79,9 @@ namespace Content.Server.DeviceNetwork.Systems if (frequency == null) return false; - _nextQueue.Enqueue(new DeviceNetworkPacketEvent(device.DeviceNetId, address, frequency.Value, device.Address, uid, data)); + network ??= device.DeviceNetId; + + _nextQueue.Enqueue(new DeviceNetworkPacketEvent(network.Value, address, frequency.Value, device.Address, uid, data)); return true; } diff --git a/Content.Server/DeviceNetwork/Systems/WiredNetworkSystem.cs b/Content.Server/DeviceNetwork/Systems/WiredNetworkSystem.cs index 384e701d24..758a333c7a 100644 --- a/Content.Server/DeviceNetwork/Systems/WiredNetworkSystem.cs +++ b/Content.Server/DeviceNetwork/Systems/WiredNetworkSystem.cs @@ -17,7 +17,7 @@ namespace Content.Server.DeviceNetwork.Systems /// private void OnBeforePacketSent(EntityUid uid, WiredNetworkComponent component, BeforePacketSentEvent args) { - if (EntityManager.GetComponent(uid).GridUid != args.SenderTransform.GridUid) + if (Transform(uid).GridUid != args.SenderTransform.GridUid) { args.Cancel(); } diff --git a/Content.Server/DeviceNetwork/Systems/WirelessNetworkSystem.cs b/Content.Server/DeviceNetwork/Systems/WirelessNetworkSystem.cs index cbf591624d..b27ef52eca 100644 --- a/Content.Server/DeviceNetwork/Systems/WirelessNetworkSystem.cs +++ b/Content.Server/DeviceNetwork/Systems/WirelessNetworkSystem.cs @@ -20,8 +20,11 @@ namespace Content.Server.DeviceNetwork.Systems var ownPosition = args.SenderPosition; var xform = Transform(uid); + // not a wireless to wireless connection, just let it happen + if (!TryComp(args.Sender, out var sendingComponent)) + return; + if (xform.MapID != args.SenderTransform.MapID - || !TryComp(args.Sender, out var sendingComponent) || (ownPosition - xform.WorldPosition).Length() > sendingComponent.Range) { args.Cancel(); diff --git a/Content.Server/Disposal/Mailing/MailingUnitSystem.cs b/Content.Server/Disposal/Mailing/MailingUnitSystem.cs index 6e08224778..4dea3d23e1 100644 --- a/Content.Server/Disposal/Mailing/MailingUnitSystem.cs +++ b/Content.Server/Disposal/Mailing/MailingUnitSystem.cs @@ -111,7 +111,7 @@ public sealed class MailingUnitSystem : EntitySystem [NetTarget] = component.Target }; - _deviceNetworkSystem.QueuePacket(uid, null, payload, null, device); + _deviceNetworkSystem.QueuePacket(uid, null, payload, null, null, device); } /// @@ -129,7 +129,7 @@ public sealed class MailingUnitSystem : EntitySystem }; component.TargetList.Clear(); - _deviceNetworkSystem.QueuePacket(uid, null, payload, null, device); + _deviceNetworkSystem.QueuePacket(uid, null, payload, null, null, device); } /// diff --git a/Content.Server/GameTicking/GameTicker.RoundFlow.cs b/Content.Server/GameTicking/GameTicker.RoundFlow.cs index 982f52fd7a..2be765de19 100644 --- a/Content.Server/GameTicking/GameTicker.RoundFlow.cs +++ b/Content.Server/GameTicking/GameTicker.RoundFlow.cs @@ -7,7 +7,6 @@ using Content.Shared.GameTicking; using Content.Shared.Preferences; using JetBrains.Annotations; using Prometheus; -using Robust.Server.GameStates; using Robust.Server.Maps; using Robust.Server.Player; using Robust.Shared.Audio; @@ -46,22 +45,6 @@ namespace Content.Server.GameTicking [ViewVariables] private bool _startingRound; - /// - /// This is a list of players that are going to appear in the round-end - /// crew manifest so their children entities can be collected each update - /// and sent to far-away players. - /// - [ViewVariables] - private HashSet _expandPvsPlayers = new(); - - /// - /// This is the list of the children entities that should be sent to - /// all players at the end of the round, to keep distant characters from - /// looking naked in the crew manifest. - /// - [ViewVariables] - private HashSet _expandPvsEntities = new(); - [ViewVariables] private GameRunLevel _runLevel; @@ -81,16 +64,6 @@ namespace Content.Server.GameTicking } } - private void InitializeRoundFlow() - { - SubscribeLocalEvent(OnExpandPvs); - } - - private void OnEntityDeleted(EntityUid uid) - { - _expandPvsEntities.Remove(uid); - } - /// /// Returns true if the round's map is eligible to be updated. /// @@ -324,17 +297,15 @@ namespace Content.Server.GameTicking RunLevel = GameRunLevel.PostRound; + // The lobby song is set here instead of in RestartRound, + // because ShowRoundEndScoreboard triggers the start of the music playing + // at the end of a round, and this needs to be set before RestartRound + // in order for the lobby song status display to be accurate. + LobbySong = _robustRandom.Pick(_lobbyMusicCollection.PickFiles).ToString(); + ShowRoundEndScoreboard(text); } - private void OnExpandPvs(ref ExpandPvsEvent args) - { - if (RunLevel != GameRunLevel.PostRound) - return; - - args.Entities.AddRange(_expandPvsEntities); - } - public void ShowRoundEndScoreboard(string text = "") { // Log end of round @@ -352,11 +323,6 @@ namespace Content.Server.GameTicking //Get the timespan of the round. var roundDuration = RoundDuration(); - // Should already be empty, but just in case. - _expandPvsEntities.Clear(); - _expandPvsPlayers.Clear(); - EntityManager.EntityDeleted += OnEntityDeleted; - //Generate a list of basic player info to display in the end round summary. var listOfPlayerInfo = new List(); // Grab the great big book of all the Minds, we'll need them for this. @@ -390,8 +356,9 @@ namespace Content.Server.GameTicking else if (mind.CurrentEntity != null && TryName(mind.CurrentEntity.Value, out var icName)) playerIcName = icName; - if (Exists(mind.OriginalOwnedEntity)) - _expandPvsPlayers.Add(mind.OriginalOwnedEntity.Value); + var entity = mind.OriginalOwnedEntity; + if (Exists(entity)) + _pvsOverride.AddGlobalOverride(entity.Value, recursive: true); var playerEndRoundInfo = new RoundEndMessageEvent.RoundEndPlayerInfo() { @@ -400,7 +367,7 @@ namespace Content.Server.GameTicking PlayerOOCName = contentPlayerData?.Name ?? "(IMPOSSIBLE: REGISTERED MIND WITH NO OWNER)", // Character name takes precedence over current entity name PlayerICName = playerIcName, - PlayerEntityUid = mind.OriginalOwnedEntity, + PlayerEntityUid = entity, Role = antag ? mind.AllRoles.First(role => role.Antagonist).Name : mind.AllRoles.FirstOrDefault()?.Name ?? Loc.GetString("game-ticker-unknown-role"), @@ -411,20 +378,6 @@ namespace Content.Server.GameTicking listOfPlayerInfo.Add(playerEndRoundInfo); } - // Recursively collect entities for the crew manifest. - void RecursePvsEntities(IEnumerable entities) - { - _expandPvsEntities.UnionWith(entities); - - foreach (var entity in entities) - { - if (TryComp(entity, out var xform)) - RecursePvsEntities(xform.ChildEntities); - } - } - - RecursePvsEntities(_expandPvsPlayers); - // This ordering mechanism isn't great (no ordering of minds) but functions var listOfPlayerInfoFinal = listOfPlayerInfo.OrderBy(pi => pi.PlayerOOCName).ToArray(); @@ -455,7 +408,6 @@ namespace Content.Server.GameTicking PlayersJoinedRoundNormally = 0; RunLevel = GameRunLevel.PreRoundLobby; - LobbySong = _robustRandom.Pick(_lobbyMusicCollection.PickFiles).ToString(); RandomizeLobbyBackground(); ResettingCleanup(); IncrementRoundNumber(); @@ -524,10 +476,6 @@ namespace Content.Server.GameTicking _allPreviousGameRules.Clear(); - EntityManager.EntityDeleted -= OnEntityDeleted; - _expandPvsPlayers.Clear(); - _expandPvsEntities.Clear(); - // Round restart cleanup event, so entity systems can reset. var ev = new RoundRestartCleanupEvent(); RaiseLocalEvent(ev); diff --git a/Content.Server/GameTicking/GameTicker.cs b/Content.Server/GameTicking/GameTicker.cs index fbe40ee6d6..d62fb2ac60 100644 --- a/Content.Server/GameTicking/GameTicker.cs +++ b/Content.Server/GameTicking/GameTicker.cs @@ -18,6 +18,7 @@ using Content.Shared.Mobs.Systems; using Content.Shared.Roles; using Robust.Server; using Robust.Server.GameObjects; +using Robust.Server.GameStates; using Robust.Shared.Configuration; using Robust.Shared.Console; #if EXCEPTION_TOLERANCE @@ -40,6 +41,7 @@ namespace Content.Server.GameTicking [Dependency] private readonly MindSystem _mind = default!; [Dependency] private readonly MindTrackerSystem _mindTracker = default!; [Dependency] private readonly MobStateSystem _mobState = default!; + [Dependency] private readonly PvsOverrideSystem _pvsOverride = default!; [Dependency] private readonly IAdminLogManager _adminLogs = default!; [ViewVariables] private bool _initialized; @@ -70,7 +72,6 @@ namespace Content.Server.GameTicking "Overflow role does not have the correct name!"); InitializeGameRules(); InitializeReplays(); - InitializeRoundFlow(); _initialized = true; } diff --git a/Content.Server/Toilet/ToiletSystem.cs b/Content.Server/Toilet/ToiletSystem.cs index 91685640a7..e749260e94 100644 --- a/Content.Server/Toilet/ToiletSystem.cs +++ b/Content.Server/Toilet/ToiletSystem.cs @@ -15,6 +15,7 @@ using Content.Shared.Popups; using Content.Shared.Toilet; using Content.Shared.Tools; using Content.Shared.Tools.Components; +using Content.Shared.Verbs; using Robust.Shared.Audio; using Robust.Shared.Player; using Robust.Shared.Random; @@ -37,10 +38,11 @@ namespace Content.Server.Toilet SubscribeLocalEvent(OnInit); SubscribeLocalEvent(OnMapInit); SubscribeLocalEvent(OnInteractUsing); - SubscribeLocalEvent(OnInteractHand, new []{typeof(SharedBuckleSystem)}); + SubscribeLocalEvent(OnInteractHand); SubscribeLocalEvent(OnExamine); SubscribeLocalEvent(OnSuicide); SubscribeLocalEvent(OnToiletPried); + SubscribeLocalEvent>(OnToggleSeatVerb); } private void OnSuicide(EntityUid uid, ToiletComponent component, SuicideEvent args) @@ -123,13 +125,26 @@ namespace Content.Server.Toilet } } - // just want to up/down seat? - // check that nobody seats on seat right now - if (TryComp(uid, out var strap) && strap.BuckledEntities.Count != 0) + args.Handled = true; + } + + private void OnToggleSeatVerb(EntityUid uid, ToiletComponent component, GetVerbsEvent args) + { + if (!args.CanInteract || !args.CanAccess || !CanToggle(uid)) return; - ToggleToiletSeat(uid, component); - args.Handled = true; + var alterToiletSeatText = component.IsSeatUp ? Loc.GetString("toilet-seat-close") : Loc.GetString("toilet-seat-open"); + + var verb = new AlternativeVerb() + { + Act = () => { + if (CanToggle(uid)) + ToggleToiletSeat(uid, component); + }, + Text = alterToiletSeatText + }; + + args.Verbs.Add(verb); } private void OnExamine(EntityUid uid, ToiletComponent component, ExaminedEvent args) @@ -153,6 +168,11 @@ namespace Content.Server.Toilet UpdateSprite(uid, toilet); } + public bool CanToggle(EntityUid uid) + { + return TryComp(uid, out var strap) && strap.BuckledEntities.Count == 0; + } + public void ToggleToiletSeat(EntityUid uid, ToiletComponent? component = null) { if (!Resolve(uid, ref component)) diff --git a/Content.Shared/Chat/SharedChatSystem.cs b/Content.Shared/Chat/SharedChatSystem.cs index f8e089852f..05b39055e6 100644 --- a/Content.Shared/Chat/SharedChatSystem.cs +++ b/Content.Shared/Chat/SharedChatSystem.cs @@ -162,4 +162,33 @@ public abstract class SharedChatSystem : EntitySystem message = char.ToUpper(message[0]) + message.Remove(0, 1); return message; } + + public string SanitizeMessageCapitalizeTheWordI(string message, string theWordI = "i") + { + if (string.IsNullOrEmpty(message)) + return message; + + for + ( + var index = message.IndexOf(theWordI); + index != -1; + index = message.IndexOf(theWordI, index + 1) + ) + { + // Stops the code If It's tryIng to capItalIze the letter I In the mIddle of words + // Repeating the code twice is the simplest option + if (index + 1 < message.Length && char.IsLetter(message[index + 1])) + continue; + if (index - 1 >= 0 && char.IsLetter(message[index - 1])) + continue; + + var beforeTarget = message.Substring(0, index); + var target = message.Substring(index, theWordI.Length); + var afterTarget = message.Substring(index + theWordI.Length); + + message = beforeTarget + target.ToUpper() + afterTarget; + } + + return message; + } } diff --git a/Content.Shared/Damage/Components/StaminaComponent.cs b/Content.Shared/Damage/Components/StaminaComponent.cs index f75d4ec2fc..9f745c9df1 100644 --- a/Content.Shared/Damage/Components/StaminaComponent.cs +++ b/Content.Shared/Damage/Components/StaminaComponent.cs @@ -39,6 +39,12 @@ public sealed class StaminaComponent : Component [ViewVariables(VVAccess.ReadWrite), DataField("critThreshold")] public float CritThreshold = 100f; + /// + /// How long will this mob be stunned for? + /// + [ViewVariables(VVAccess.ReadWrite), DataField("stunTime")] + public TimeSpan StunTime = TimeSpan.FromSeconds(6); + /// /// To avoid continuously updating our data we track the last time we updated so we can extrapolate our current stamina. /// diff --git a/Content.Shared/Damage/Systems/StaminaSystem.cs b/Content.Shared/Damage/Systems/StaminaSystem.cs index 31abbf039c..7bf2941dac 100644 --- a/Content.Shared/Damage/Systems/StaminaSystem.cs +++ b/Content.Shared/Damage/Systems/StaminaSystem.cs @@ -394,11 +394,10 @@ public sealed partial class StaminaSystem : EntitySystem component.Critical = true; component.StaminaDamage = component.CritThreshold; - var stunTime = TimeSpan.FromSeconds(6); - _stunSystem.TryParalyze(uid, stunTime, true); + _stunSystem.TryParalyze(uid, component.StunTime, true); // Give them buffer before being able to be re-stunned - component.NextUpdate = _timing.CurTime + stunTime + StamCritBufferTime; + component.NextUpdate = _timing.CurTime + component.StunTime + StamCritBufferTime; EnsureComp(uid); Dirty(component); _adminLogger.Add(LogType.Stamina, LogImpact.Medium, $"{ToPrettyString(uid):user} entered stamina crit"); diff --git a/Content.Shared/Humanoid/HumanoidCharacterAppearance.cs b/Content.Shared/Humanoid/HumanoidCharacterAppearance.cs index e331c99334..3b97183a6a 100644 --- a/Content.Shared/Humanoid/HumanoidCharacterAppearance.cs +++ b/Content.Shared/Humanoid/HumanoidCharacterAppearance.cs @@ -163,9 +163,9 @@ namespace Content.Shared.Humanoid break; case HumanoidSkinColor.Hues: case HumanoidSkinColor.TintedHues: - var rbyte = random.Next(0, 255); - var gbyte = random.Next(0, 255); - var bbyte = random.Next(0, 255); + var rbyte = random.NextByte(); + var gbyte = random.NextByte(); + var bbyte = random.NextByte(); newSkinColor = new Color(rbyte, gbyte, bbyte); break; } diff --git a/Content.Shared/Humanoid/SkinColor.cs b/Content.Shared/Humanoid/SkinColor.cs index 44f69bf6aa..b38b426a19 100644 --- a/Content.Shared/Humanoid/SkinColor.cs +++ b/Content.Shared/Humanoid/SkinColor.cs @@ -118,7 +118,7 @@ public static class SkinColor public static Color TintedHues(Color color) { var newColor = Color.ToHsv(color); - newColor.Y = .1f; + newColor.Y *= 0.1f; return Color.FromHsv(newColor); } diff --git a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs index bc64985544..1e6a5c50e9 100644 --- a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs +++ b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs @@ -1,4 +1,5 @@ using System.Diagnostics.CodeAnalysis; +using Content.Shared.ActionBlocker; using Content.Shared.Actions; using Content.Shared.Administration.Logs; using Content.Shared.Audio; @@ -33,6 +34,7 @@ namespace Content.Shared.Weapons.Ranged.Systems; public abstract partial class SharedGunSystem : EntitySystem { + [Dependency] private readonly ActionBlockerSystem _actionBlockerSystem = default!; [Dependency] protected readonly IGameTiming Timing = default!; [Dependency] protected readonly IMapManager MapManager = default!; [Dependency] private readonly INetManager _netManager = default!; @@ -208,7 +210,8 @@ public abstract partial class SharedGunSystem : EntitySystem private void AttemptShoot(EntityUid user, EntityUid gunUid, GunComponent gun) { - if (gun.FireRate <= 0f) + if (gun.FireRate <= 0f || + !_actionBlockerSystem.CanUseHeldEntity(user)) return; var toCoordinates = gun.ShootCoordinates; diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 53db662c22..2fe0ff63fd 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,67 +1,4 @@ Entries: -- author: TemporalOroboros - changes: - - {message: The AME controller increases and decreases in steps of 2 again., type: Tweak} - id: 4146 - time: '2023-06-30T23:24:23.0000000+00:00' -- author: Nairodian - changes: - - {message: MRP rules updated., type: Tweak} - id: 4147 - time: '2023-07-01T00:15:04.0000000+00:00' -- author: Lank - changes: - - {message: 'The Cargo Telepad has been significantly improved, teleporting orders - over 4x faster.', type: Tweak} - id: 4148 - time: '2023-07-01T19:00:33.0000000+00:00' -- author: Dygon - changes: - - {message: Windoors can now be bolted through the network system., type: Tweak} - id: 4149 - time: '2023-07-01T19:00:53.0000000+00:00' -- author: Dygon - changes: - - {message: 'Shutters are able to be closed again on windoors, tables, flaps and - windows.', type: Fix} - id: 4150 - time: '2023-07-01T19:19:04.0000000+00:00' -- author: Slava0135 - changes: - - {message: added rare immovable rod event that can happen late in the game and - can literally cut through entire station, type: Add} - - {message: immovable rods now move on spawn by default, type: Fix} - - {message: you can now warp to immovable rod as ghost, type: Tweak} - id: 4151 - time: '2023-07-02T13:40:07.0000000+00:00' -- author: brainfood1183 - changes: - - {message: Fixed Hamlet sprite error on revival., type: Fix} - id: 4152 - time: '2023-07-03T07:59:29.0000000+00:00' -- author: HerCoyote23 - changes: - - {message: You can now speak on your department's radio channel using .X, type: Tweak} - id: 4153 - time: '2023-07-03T08:55:08.0000000+00:00' -- author: EmoGarbage404 - changes: - - {message: Artifacts now make noises when activated., type: Add} - id: 4154 - time: '2023-07-03T11:14:27.0000000+00:00' -- author: noudoit - changes: - - {message: Attempting to uncuff yourself damages you slightly, type: Tweak} - id: 4155 - time: '2023-07-03T21:30:09.0000000+00:00' -- author: dmnct - changes: - - {message: Added fun!, type: Add} - - {message: Removed fun!, type: Remove} - - {message: Changed fun!, type: Tweak} - - {message: Fixed fun!, type: Fix} - id: 4156 - time: '2023-07-03T21:31:53.0000000+00:00' - author: Geekyhobo changes: - {message: Nukie bundle prices have been adjusted for balance, type: Tweak} @@ -3029,3 +2966,66 @@ Entries: - {message: Changed salvage and QM locker contents, type: Tweak} id: 4645 time: '2023-08-21T01:04:43.0000000+00:00' +- author: EnDecc + changes: + - {message: 'Three "plastic crates" in cargo have now been given appropriate labels, + after Centcomm forgot to use tape on them. Disaster pizza crate, Softdrinks + crate, and Softdrinks bulk crate will now show up in orders appropriately.', + type: Fix} + id: 4646 + time: '2023-08-21T18:16:21.0000000+00:00' +- author: Errant-4 + changes: + - {message: 'Crit/Dead people that somehow end up holding a gun can no longer fire + them. The Gundead aren''t real, they can''t hurt you.', type: Fix} + id: 4647 + time: '2023-08-21T18:27:08.0000000+00:00' +- author: Verslebas + changes: + - {message: Changed admin ghost's hands order, type: Tweak} + id: 4648 + time: '2023-08-21T18:35:30.0000000+00:00' +- author: Potato1234_x + changes: + - {message: Vending machines have been polished. Again., type: Tweak} + id: 4649 + time: '2023-08-21T18:45:54.0000000+00:00' +- author: Alekshhh + changes: + - {message: Changed medical locker contents, type: Tweak} + id: 4650 + time: '2023-08-21T18:49:22.0000000+00:00' +- author: deltanedas + changes: + - {message: Air alarms now have output signal ports for each state., type: Tweak} + id: 4651 + time: '2023-08-21T21:18:30.0000000+00:00' +- author: EmoGarbage404 + changes: + - {message: Freshly spawned diona are no longer gray., type: Fix} + - {message: Skeletons are no longer extremely saturated in color., type: Fix} + id: 4652 + time: '2023-08-22T02:05:24.0000000+00:00' +- author: func_kenobi + changes: + - {message: "CentComm allowed the station architectors to place Schr\xF6dinger's\ + \ grilles.", type: Add} + id: 4653 + time: '2023-08-22T02:21:45.0000000+00:00' +- author: astriloqua + changes: + - {message: NanoTransen has hired professionals to teach people how to use toilets. + Employees can now properly sit on toilets., type: Tweak} + id: 4654 + time: '2023-08-22T04:21:51.0000000+00:00' +- author: kalane15 + changes: + - {message: Dropping item stops its examination, type: Fix} + id: 4655 + time: '2023-08-22T04:28:45.0000000+00:00' +- author: Interrobang01 + changes: + - {message: The word "i" is now automatically capitalized in IC chat! Your pinky's + structural integrity is now safe!, type: Add} + id: 4656 + time: '2023-08-22T04:43:37.0000000+00:00' diff --git a/Resources/Locale/en-US/machine-linking/transmitter_ports.ftl b/Resources/Locale/en-US/machine-linking/transmitter_ports.ftl index 02ede1e1b6..154f20eee7 100644 --- a/Resources/Locale/en-US/machine-linking/transmitter_ports.ftl +++ b/Resources/Locale/en-US/machine-linking/transmitter_ports.ftl @@ -8,7 +8,7 @@ signal-port-name-off-transmitter = Off signal-port-description-off-transmitter = This port is invoked whenever the transmitter is turned off. signal-port-name-status-transmitter = Status -signal-port-description-logic-output = This port is invoked with HIGH or LOW depending on the transmitter status. +signal-port-description-status-transmitter = This port is invoked with HIGH or LOW depending on the transmitter status. signal-port-name-left = Left signal-port-description-left = This port is invoked whenever the lever is moved to the leftmost position. @@ -36,3 +36,12 @@ signal-port-description-logic-output-high = This port is invoked whenever the in signal-port-name-logic-output-low = Low Output signal-port-description-logic-output-low = This port is invoked whenever the input has a falling edge. + +signal-port-name-air-danger = Danger +signal-port-description-air-danger = This port is invoked with HIGH when in danger mode and LOW when not. + +signal-port-name-air-warning = Warning +signal-port-description-air-warning = This port is invoked with HIGH when in warning mode and LOW when not. + +signal-port-name-air-normal = Normal +signal-port-description-air-normal = This port is invoked with HIGH when in normal mode and LOW when not. diff --git a/Resources/Locale/en-US/prototypes/catalog/cargo/cargo-food.ftl b/Resources/Locale/en-US/prototypes/catalog/cargo/cargo-food.ftl index 78f3c279ae..74405b719f 100644 --- a/Resources/Locale/en-US/prototypes/catalog/cargo/cargo-food.ftl +++ b/Resources/Locale/en-US/prototypes/catalog/cargo/cargo-food.ftl @@ -1,6 +1,9 @@ ent-FoodPizza = { ent-CrateFoodPizza } .desc = { ent-CrateFoodPizza.desc } +ent-FoodPizzaLarge = { ent-CrateFoodPizzaLarge } + .desc = { ent-CrateFoodPizzaLarge.desc } + ent-FoodMRE = { ent-CrateFoodMRE } .desc = { ent-CrateFoodMRE.desc } @@ -12,3 +15,9 @@ ent-FoodDinnerware = { ent-CrateFoodDinnerware } ent-FoodBarSupply = { ent-CrateFoodBarSupply } .desc = { ent-CrateFoodBarSupply.desc } + +ent-FoodSoftdrinks = { ent-CrateFoodSoftdrinks } + .desc = { ent-CrateFoodSoftdrinks.desc } + +ent-FoodSoftdrinksLarge = { ent-CrateFoodSoftdrinksLarge } + .desc = { ent-CrateFoodSoftdrinksLarge.desc } diff --git a/Resources/Locale/en-US/prototypes/catalog/fills/crates/food-crates.ftl b/Resources/Locale/en-US/prototypes/catalog/fills/crates/food-crates.ftl index de1accdeae..b9f67862f2 100644 --- a/Resources/Locale/en-US/prototypes/catalog/fills/crates/food-crates.ftl +++ b/Resources/Locale/en-US/prototypes/catalog/fills/crates/food-crates.ftl @@ -1,5 +1,8 @@ ent-CrateFoodPizza = Emergency pizza delivery - .desc = Help do your part to end station hunger by distributing pizza to underfunded departments! + .desc = Help do your part to end station hunger by distributing pizza to underfunded departments! Includes 4 pizzas. + +ent-CrateFoodPizzaLarge = Disaster pizza delivery + .desc = In the ultimate event that all else has failed, Find comfort in that more pizza solves everything. Includes 16 pizzas. ent-CrateFoodMRE = MRE crate .desc = A military style meal fit to feed a whole department. @@ -12,3 +15,9 @@ ent-CrateFoodDinnerware = Kitchen dinnerware crate ent-CrateFoodBarSupply = Bartending supplies crate .desc = Extra Bar supplies, in case the clown was allowed in the bar unsupervised. + +ent-CrateFoodSoftdrinks = Softdrinks crate + .desc = A variety of sodas to complement a small party, without having to empty the soda machines. Includes 14 sodas. + +ent-CrateFoodSoftdrinksLarge = Softdrinks bulk crate + .desc = Lots of sodas taken straight out of Centcomm's own vending machines, because you just can't leave your department. Includes 28 sodas. diff --git a/Resources/Locale/en-US/toilet/toilet-component.ftl b/Resources/Locale/en-US/toilet/toilet-component.ftl index 2cbfdfbff1..7807759e42 100644 --- a/Resources/Locale/en-US/toilet/toilet-component.ftl +++ b/Resources/Locale/en-US/toilet/toilet-component.ftl @@ -5,3 +5,5 @@ toilet-component-suicide-head-message-others = {CAPITALIZE(THE($victim))} sticks toilet-component-suicide-head-message = You stick your head into {THE($owner)} and flush it! toilet-component-suicide-message-others = {CAPITALIZE(THE($victim))} bashes themselves with {THE($owner)}! toilet-component-suicide-message = You bash yourself with {THE($owner)}! +toilet-seat-close = Close Seat +toilet-seat-open = Open Seat diff --git a/Resources/Prototypes/Body/Prototypes/a_ghost.yml b/Resources/Prototypes/Body/Prototypes/a_ghost.yml index f04ed70197..3a8a615ffe 100644 --- a/Resources/Prototypes/Body/Prototypes/a_ghost.yml +++ b/Resources/Prototypes/Body/Prototypes/a_ghost.yml @@ -6,8 +6,8 @@ torso: part: TorsoHuman connections: - - right arm - left arm + - right arm right arm: part: RightArmHuman connections: diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_food.yml b/Resources/Prototypes/Catalog/Cargo/cargo_food.yml index c38535bb56..e506995929 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_food.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_food.yml @@ -2,7 +2,7 @@ id: FoodPizza icon: sprite: Objects/Consumable/Food/Baked/pizza.rsi - state: margherita + state: margherita-slice product: CrateFoodPizza cost: 450 category: Food @@ -61,7 +61,7 @@ - type: cargoProduct id: FoodSoftdrinks icon: - sprite: Objects/Consumable/Drinks/beerglass.rsi + sprite: Objects/Consumable/Drinks/cola.rsi state: icon product: CrateFoodSoftdrinks cost: 1200 @@ -71,7 +71,7 @@ - type: cargoProduct id: FoodSoftdrinksLarge icon: - sprite: Objects/Consumable/Drinks/beerglass.rsi + sprite: Objects/Consumable/Drinks/colabottle.rsi state: icon product: CrateFoodSoftdrinksLarge cost: 2400 diff --git a/Resources/Prototypes/Catalog/Fills/Crates/food.yml b/Resources/Prototypes/Catalog/Fills/Crates/food.yml index 5813521424..215ce59856 100644 --- a/Resources/Prototypes/Catalog/Fills/Crates/food.yml +++ b/Resources/Prototypes/Catalog/Fills/Crates/food.yml @@ -14,14 +14,14 @@ id: CrateFoodPizzaLarge parent: CratePlastic components: - - type: StorageFill - contents: - - id: FoodBoxPizzaFilled - amount: 16 - - id: KnifePlastic - amount: 4 - - id: LidSalami - prob: 0.04 + - type: StorageFill + contents: + - id: FoodBoxPizzaFilled + amount: 16 + - id: KnifePlastic + amount: 4 + - id: LidSalami + prob: 0.04 - type: entity id: CrateFoodMRE @@ -109,37 +109,37 @@ id: CrateFoodSoftdrinks parent: CratePlastic components: - - type: StorageFill - contents: - - id: DrinkColaCan - amount: 4 - - id: DrinkGrapeCan - amount: 2 - - id: DrinkRootBeerCan - amount: 2 - - id: DrinkIcedTeaCan - amount: 2 - - id: DrinkLemonLimeCan - amount: 2 - - id: DrinkFourteenLokoCan - amount: 2 + - type: StorageFill + contents: + - id: DrinkColaCan + amount: 4 + - id: DrinkGrapeCan + amount: 2 + - id: DrinkRootBeerCan + amount: 2 + - id: DrinkIcedTeaCan + amount: 2 + - id: DrinkLemonLimeCan + amount: 2 + - id: DrinkFourteenLokoCan + amount: 2 - type: entity id: CrateFoodSoftdrinksLarge parent: CratePlastic components: - - type: StorageFill - contents: - - id: DrinkColaCan - amount: 8 - - id: DrinkGrapeCan - amount: 4 - - id: DrinkRootBeerCan - amount: 4 - - id: DrinkIcedTeaCan - amount: 4 - - id: DrinkLemonLimeCan - amount: 4 - - id: DrinkFourteenLokoCan - amount: 4 + - type: StorageFill + contents: + - id: DrinkColaCan + amount: 8 + - id: DrinkGrapeCan + amount: 4 + - id: DrinkRootBeerCan + amount: 4 + - id: DrinkIcedTeaCan + amount: 4 + - id: DrinkLemonLimeCan + amount: 4 + - id: DrinkFourteenLokoCan + amount: 4 diff --git a/Resources/Prototypes/Catalog/Fills/Lockers/heads.yml b/Resources/Prototypes/Catalog/Fills/Lockers/heads.yml index b1cb9437ed..230843b61c 100644 --- a/Resources/Prototypes/Catalog/Fills/Lockers/heads.yml +++ b/Resources/Prototypes/Catalog/Fills/Lockers/heads.yml @@ -187,15 +187,11 @@ - id: ClothingMaskSterile - id: ClothingHeadHatBeretCmo - id: ClothingOuterHardsuitMedical - - id: DiagnoserMachineCircuitboard - - id: VaccinatorMachineCircuitboard - id: Hypospray - id: HandheldCrewMonitor - id: DoorRemoteMedical - id: RubberStampCMO - id: MedicalTechFabCircuitboard - - id: MaterialBiomass - amount: 3 - id: BoxEncryptionKeyMedical - type: entity @@ -214,15 +210,11 @@ - id: ClothingOuterCoatLabCmo - id: ClothingMaskSterile - id: ClothingHeadHatBeretCmo - - id: DiagnoserMachineCircuitboard - - id: VaccinatorMachineCircuitboard - id: Hypospray - id: HandheldCrewMonitor - id: DoorRemoteMedical - id: RubberStampCMO - id: MedicalTechFabCircuitboard - - id: MaterialBiomass - amount: 3 - id: BoxEncryptionKeyMedical - type: entity diff --git a/Resources/Prototypes/Catalog/Fills/Lockers/medical.yml b/Resources/Prototypes/Catalog/Fills/Lockers/medical.yml index 3d7c371d28..705b011219 100644 --- a/Resources/Prototypes/Catalog/Fills/Lockers/medical.yml +++ b/Resources/Prototypes/Catalog/Fills/Lockers/medical.yml @@ -5,16 +5,16 @@ components: - type: StorageFill contents: - - id: BoxPillCanister - id: BoxSyringe - id: EpinephrineChemistryBottle - amount: 3 + amount: 1 - id: Brutepack amount: 2 - id: Ointment amount: 2 - id: Bloodpack amount: 2 + - id: Gauze - type: entity id: LockerWallMedicalFilled @@ -24,16 +24,16 @@ components: - type: StorageFill contents: - - id: BoxPillCanister - id: BoxSyringe - id: EpinephrineChemistryBottle - amount: 3 + amount: 1 - id: Brutepack amount: 2 - id: Ointment amount: 2 - id: Bloodpack amount: 2 + - id: Gauze - type: entity @@ -67,8 +67,6 @@ - id: UniformScrubsColorPurple prob: 0.05 orGroup: Surgshrubs - - id: NitrousOxideTankFilled - prob: 0.3 - id: ClothingMaskSterile - type: entity @@ -103,8 +101,6 @@ - id: UniformScrubsColorPurple prob: 0.05 orGroup: Surgshrubs - - id: NitrousOxideTankFilled - prob: 0.3 - id: ClothingMaskSterile - type: entity @@ -116,10 +112,17 @@ contents: - id: BoxSyringe - id: BoxBeaker + - id: BoxBeaker + prob: 0.3 - id: BoxPillCanister - id: BoxBottle - amount: 2 - + - id: ChemBag + - id: ClothingHandsGlovesLatex + - id: ClothingHeadsetMedical + - id: ClothingMaskSterile + - id: HandLabeler + prob: 0.5 + - type: entity id: LockerParamedicFilled suffix: Filled @@ -134,4 +137,8 @@ - id: ClothingUniformJumpsuitParamedic - id: ClothingUniformJumpskirtParamedic - id: ClothingEyesHudMedical - \ No newline at end of file + - id: ClothingHandsGlovesLatex + - id: ClothingHeadsetMedical + - id: ClothingMaskSterile + - id: MedkitFilled + prob: 0.3 diff --git a/Resources/Prototypes/Datasets/Names/skeleton_first.yml b/Resources/Prototypes/Datasets/Names/skeleton_first.yml index 84ab7d73af..6341e2f2ed 100644 --- a/Resources/Prototypes/Datasets/Names/skeleton_first.yml +++ b/Resources/Prototypes/Datasets/Names/skeleton_first.yml @@ -22,3 +22,9 @@ - Пателла - Тейлбоун - Бонер + - Rib + - Hyoid + - Coccyx + - Tarsus + - Lacrimal + - Bone diff --git a/Resources/Prototypes/DeviceLinking/source_ports.yml b/Resources/Prototypes/DeviceLinking/source_ports.yml index 45ee812f2e..73e96978a7 100644 --- a/Resources/Prototypes/DeviceLinking/source_ports.yml +++ b/Resources/Prototypes/DeviceLinking/source_ports.yml @@ -96,3 +96,21 @@ name: signal-port-name-logic-output-low description: signal-port-description-logic-output-low defaultLinks: [ Off, Close ] + +- type: sourcePort + id: AirDanger + name: signal-port-name-air-danger + description: signal-port-description-air-danger + defaultLinks: [ DoorBolt ] + +- type: sourcePort + id: AirWarning + name: signal-port-name-air-warning + description: signal-port-description-air-warning + defaultLinks: [ DoorBolt ] + +- type: sourcePort + id: AirNormal + name: signal-port-name-air-normal + description: signal-port-description-air-normal + defaultLinks: [ DoorBolt ] diff --git a/Resources/Prototypes/Entities/Markers/Spawners/Random/grille.yml b/Resources/Prototypes/Entities/Markers/Spawners/Random/grille.yml new file mode 100644 index 0000000000..3f5be4fdb1 --- /dev/null +++ b/Resources/Prototypes/Entities/Markers/Spawners/Random/grille.yml @@ -0,0 +1,16 @@ +- type: entity + name: Random Grille Spawner + id: GrilleSpawner + parent: MarkerBase + components: + - type: Sprite + layers: + - sprite: Structures/Walls/random.rsi + state: randomgrille + - type: RandomSpawner + prototypes: + - Grille + - GrilleBroken + chance: 1.0 + placement: + mode: AlignTileAny diff --git a/Resources/Prototypes/Entities/Structures/Power/Generation/Singularity/singularity.yml b/Resources/Prototypes/Entities/Structures/Power/Generation/Singularity/singularity.yml index ad38290c37..d2fea2870a 100644 --- a/Resources/Prototypes/Entities/Structures/Power/Generation/Singularity/singularity.yml +++ b/Resources/Prototypes/Entities/Structures/Power/Generation/Singularity/singularity.yml @@ -17,6 +17,8 @@ colliderFixtureId: EventHorizonCollider consumerFixtureId: EventHorizonConsumer - type: GravityWell # To make the singularity attract things. + baseRadialAcceleration: 10 + maxRange: 4 - type: Fixtures fixtures: EventHorizonCollider: @@ -43,11 +45,16 @@ energy: 180 level: 1 radsPerLevel: 2 + energyLoss: 1 - type: RandomWalk # To make the singularity move around. + maxSpeed: 2.5 + minSpeed: 1.875 - type: SingularityDistortion - intensity: 20 + falloffPower: 2.529822 + intensity: 3645 - type: RadiationSource slope: 0.2 # its emit really far away + intensity: 2 - type: PointLight enabled: true radius: 10 diff --git a/Resources/Prototypes/Entities/Structures/Storage/Closets/big_boxes.yml b/Resources/Prototypes/Entities/Structures/Storage/Closets/big_boxes.yml index f4033554ad..040aff42b4 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/Closets/big_boxes.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/Closets/big_boxes.yml @@ -50,7 +50,6 @@ - type: Tag tags: - DoorBumpOpener - - type: InteractionOutline - type: Construction graph: BaseBigBox node: basebigbox @@ -66,6 +65,7 @@ - type: Damageable damageModifierSet: FlimsyMetallic #Syndicate boxes should have a bit of protection - type: Stealth + hadOutline: true - type: StealthOnMove passiveVisibilityRate: -0.37 movementVisibilityRate: 0.20 @@ -74,6 +74,7 @@ id: BigBox parent: BaseBigBox components: + - type: InteractionOutline - type: Destructible thresholds: - trigger: diff --git a/Resources/Prototypes/Entities/Structures/Wallmounts/air_alarm.yml b/Resources/Prototypes/Entities/Structures/Wallmounts/air_alarm.yml index bb116d1fb5..5169bd9060 100644 --- a/Resources/Prototypes/Entities/Structures/Wallmounts/air_alarm.yml +++ b/Resources/Prototypes/Entities/Structures/Wallmounts/air_alarm.yml @@ -2,6 +2,10 @@ id: AirAlarm name: air alarm description: An air alarm. Alarms... air? + placement: + mode: SnapgridCenter + snap: + - Wallmount components: - type: WallMount - type: ApcPowerReceiver @@ -16,14 +20,22 @@ prefix: device-address-prefix-air-alarm sendBroadcastAttemptEvent: true - type: WiredNetworkConnection + # for output status ports + - type: WirelessNetworkConnection + range: 200 - type: DeviceList - type: DeviceNetworkRequiresPower + - type: DeviceLinkSource + ports: + - AirDanger + - AirWarning + - AirNormal - type: AtmosAlarmable syncWith: - - AirAlarm - - AirSensor - - GasVent - - GasScrubber + - AirAlarm + - AirSensor + - GasVent + - GasScrubber - type: AtmosAlarmableVisuals layerMap: "airAlarmBase" alarmStates: @@ -85,15 +97,15 @@ - !type:PlaySoundBehavior sound: path: /Audio/Effects/metalbreak.ogg - placement: - mode: SnapgridCenter - snap: - - Wallmount - type: entity id: AirAlarmAssembly name: air alarm assembly description: An air alarm. Doesn't look like it'll be alarming air any time soon. + placement: + mode: SnapgridCenter + snap: + - Wallmount components: - type: WallMount - type: Clickable @@ -115,7 +127,3 @@ node: assembly - type: Transform anchored: true - placement: - mode: SnapgridCenter - snap: - - Wallmount diff --git a/Resources/Prototypes/Species/diona.yml b/Resources/Prototypes/Species/diona.yml index a8e49d4428..c7cb4ea678 100644 --- a/Resources/Prototypes/Species/diona.yml +++ b/Resources/Prototypes/Species/diona.yml @@ -4,6 +4,7 @@ roundStart: true prototype: MobDiona sprites: MobDionaSprites + defaultSkinTone: "#cdb369" markingLimits: MobDionaMarkingLimits dollPrototype: MobDionaDummy skinColoration: Hues diff --git a/Resources/Prototypes/Species/skeleton.yml b/Resources/Prototypes/Species/skeleton.yml index b0e41ca30b..c4dc954662 100644 --- a/Resources/Prototypes/Species/skeleton.yml +++ b/Resources/Prototypes/Species/skeleton.yml @@ -4,6 +4,7 @@ roundStart: false prototype: MobSkeletonPerson sprites: MobSkeletonSprites + defaultSkinTone: "#fff9e2" markingLimits: MobHumanMarkingLimits maleFirstNames: skeletonNamesFirst femaleFirstNames: skeletonNamesFirst diff --git a/Resources/Textures/Structures/Machines/VendingMachines/chefvend.rsi/broken.png b/Resources/Textures/Structures/Machines/VendingMachines/chefvend.rsi/broken.png index b5259b9fb0..37cfa72c98 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/chefvend.rsi/broken.png and b/Resources/Textures/Structures/Machines/VendingMachines/chefvend.rsi/broken.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/chefvend.rsi/eject-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/chefvend.rsi/eject-unshaded.png index 0df1b9c0d6..4b3c9aa8aa 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/chefvend.rsi/eject-unshaded.png and b/Resources/Textures/Structures/Machines/VendingMachines/chefvend.rsi/eject-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/chefvend.rsi/meta.json b/Resources/Textures/Structures/Machines/VendingMachines/chefvend.rsi/meta.json index ad688300fe..6ce2fc24bd 100644 --- a/Resources/Textures/Structures/Machines/VendingMachines/chefvend.rsi/meta.json +++ b/Resources/Textures/Structures/Machines/VendingMachines/chefvend.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/1516a728931b4985c1e86f0c5995a5aa1554a1ad and modified by Swept", + "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/1516a728931b4985c1e86f0c5995a5aa1554a1ad and modified by potato1234x (Github) for ss14", "size": { "x": 32, "y": 32 @@ -14,22 +14,12 @@ "name": "eject-unshaded", "delays": [ [ - 0.1, - 0.4, - 0.4, - 0.4, - 0.4, - 0.4, - 0.4, - 0.4, - 0.4, - 0.4, - 0.4, - 0.4, - 0.4, - 0.4, - 0.4, - 0.1 + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 ] ] }, diff --git a/Resources/Textures/Structures/Machines/VendingMachines/chefvend.rsi/normal-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/chefvend.rsi/normal-unshaded.png index 1f45ce683c..9002a74836 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/chefvend.rsi/normal-unshaded.png and b/Resources/Textures/Structures/Machines/VendingMachines/chefvend.rsi/normal-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/chefvend.rsi/off.png b/Resources/Textures/Structures/Machines/VendingMachines/chefvend.rsi/off.png index 0b9062cc62..1935d262da 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/chefvend.rsi/off.png and b/Resources/Textures/Structures/Machines/VendingMachines/chefvend.rsi/off.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/cigs.rsi/broken.png b/Resources/Textures/Structures/Machines/VendingMachines/cigs.rsi/broken.png index ac264f2251..671a4701fe 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/cigs.rsi/broken.png and b/Resources/Textures/Structures/Machines/VendingMachines/cigs.rsi/broken.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/cigs.rsi/meta.json b/Resources/Textures/Structures/Machines/VendingMachines/cigs.rsi/meta.json index e80ced870e..1c53b7c6cc 100644 --- a/Resources/Textures/Structures/Machines/VendingMachines/cigs.rsi/meta.json +++ b/Resources/Textures/Structures/Machines/VendingMachines/cigs.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from baystation at https://github.com/Baystation12/Baystation12/commit/f200ae08d71ecbc91412ee650a334981892f5177", + "copyright": "Taken from baystation at https://github.com/Baystation12/Baystation12/commit/f200ae08d71ecbc91412ee650a334981892f5177 and modified by potato1234x", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Structures/Machines/VendingMachines/cigs.rsi/off.png b/Resources/Textures/Structures/Machines/VendingMachines/cigs.rsi/off.png index 7adcc79ae4..c0e947c93f 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/cigs.rsi/off.png and b/Resources/Textures/Structures/Machines/VendingMachines/cigs.rsi/off.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/coffee.rsi/broken.png b/Resources/Textures/Structures/Machines/VendingMachines/coffee.rsi/broken.png index 5d7c5ff2d1..a7608d24c1 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/coffee.rsi/broken.png and b/Resources/Textures/Structures/Machines/VendingMachines/coffee.rsi/broken.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/coffee.rsi/hellfire.png b/Resources/Textures/Structures/Machines/VendingMachines/coffee.rsi/hellfire.png deleted file mode 100644 index 02aec10265..0000000000 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/coffee.rsi/hellfire.png and /dev/null differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/coffee.rsi/meta.json b/Resources/Textures/Structures/Machines/VendingMachines/coffee.rsi/meta.json index 89e03a3ef0..6a11e09a83 100644 --- a/Resources/Textures/Structures/Machines/VendingMachines/coffee.rsi/meta.json +++ b/Resources/Textures/Structures/Machines/VendingMachines/coffee.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from baystation at https://github.com/Baystation12/Baystation12/commit/f200ae08d71ecbc91412ee650a334981892f5177", + "copyright": "Taken from baystation at https://github.com/Baystation12/Baystation12/commit/f200ae08d71ecbc91412ee650a334981892f5177 and modified by potato1234x (github) for ss14", "size": { "x": 32, "y": 32 @@ -23,16 +23,6 @@ ] ] }, - { - "name": "hellfire", - "delays": [ - [ - 0.25, - 0.25, - 0.25 - ] - ] - }, { "name": "off" }, diff --git a/Resources/Textures/Structures/Machines/VendingMachines/coffee.rsi/off.png b/Resources/Textures/Structures/Machines/VendingMachines/coffee.rsi/off.png index e4bef0b3a7..8e7814af60 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/coffee.rsi/off.png and b/Resources/Textures/Structures/Machines/VendingMachines/coffee.rsi/off.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/discount.rsi/broken.png b/Resources/Textures/Structures/Machines/VendingMachines/discount.rsi/broken.png index 4a62baccbc..aee42c80ce 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/discount.rsi/broken.png and b/Resources/Textures/Structures/Machines/VendingMachines/discount.rsi/broken.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/discount.rsi/deny-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/discount.rsi/deny-unshaded.png index 609c524fa5..b8221f982e 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/discount.rsi/deny-unshaded.png and b/Resources/Textures/Structures/Machines/VendingMachines/discount.rsi/deny-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/discount.rsi/eject-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/discount.rsi/eject-unshaded.png index ca98be38dc..49fcef45a1 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/discount.rsi/eject-unshaded.png and b/Resources/Textures/Structures/Machines/VendingMachines/discount.rsi/eject-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/discount.rsi/meta.json b/Resources/Textures/Structures/Machines/VendingMachines/discount.rsi/meta.json index c0419a1195..711bdddffd 100644 --- a/Resources/Textures/Structures/Machines/VendingMachines/discount.rsi/meta.json +++ b/Resources/Textures/Structures/Machines/VendingMachines/discount.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-4.0", - "copyright": "Created by Hyenh#6078 (313846233099927552)", + "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/1516a728931b4985c1e86f0c5995a5aa1554a1ad and modified by potato1234x", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Structures/Machines/VendingMachines/discount.rsi/normal-unshaded.png b/Resources/Textures/Structures/Machines/VendingMachines/discount.rsi/normal-unshaded.png index 58acab76a9..f04f2db2af 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/discount.rsi/normal-unshaded.png and b/Resources/Textures/Structures/Machines/VendingMachines/discount.rsi/normal-unshaded.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/discount.rsi/off.png b/Resources/Textures/Structures/Machines/VendingMachines/discount.rsi/off.png index 029cfb18b8..62c80ef27a 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/discount.rsi/off.png and b/Resources/Textures/Structures/Machines/VendingMachines/discount.rsi/off.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/discount.rsi/panel.png b/Resources/Textures/Structures/Machines/VendingMachines/discount.rsi/panel.png index e8babedfe5..c60f5c3069 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/discount.rsi/panel.png and b/Resources/Textures/Structures/Machines/VendingMachines/discount.rsi/panel.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/mining.rsi/broken.png b/Resources/Textures/Structures/Machines/VendingMachines/mining.rsi/broken.png index 99ef104517..a5a13b2fd2 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/mining.rsi/broken.png and b/Resources/Textures/Structures/Machines/VendingMachines/mining.rsi/broken.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/mining.rsi/off.png b/Resources/Textures/Structures/Machines/VendingMachines/mining.rsi/off.png index 7c760e8a15..5e802a7147 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/mining.rsi/off.png and b/Resources/Textures/Structures/Machines/VendingMachines/mining.rsi/off.png differ diff --git a/Resources/Textures/Structures/Machines/VendingMachines/snack.rsi/meta.json b/Resources/Textures/Structures/Machines/VendingMachines/snack.rsi/meta.json index 182a623278..eaf66cff8f 100644 --- a/Resources/Textures/Structures/Machines/VendingMachines/snack.rsi/meta.json +++ b/Resources/Textures/Structures/Machines/VendingMachines/snack.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/1516a728931b4985c1e86f0c5995a5aa1554a1ad and modified by Swept", + "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/1516a728931b4985c1e86f0c5995a5aa1554a1ad and modified by Swept and potato1234x", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Structures/Machines/VendingMachines/snack.rsi/off.png b/Resources/Textures/Structures/Machines/VendingMachines/snack.rsi/off.png index 6e0de0cf5a..4f84067486 100644 Binary files a/Resources/Textures/Structures/Machines/VendingMachines/snack.rsi/off.png and b/Resources/Textures/Structures/Machines/VendingMachines/snack.rsi/off.png differ diff --git a/Resources/Textures/Structures/Walls/random.rsi/meta.json b/Resources/Textures/Structures/Walls/random.rsi/meta.json new file mode 100644 index 0000000000..e3c7e14411 --- /dev/null +++ b/Resources/Textures/Structures/Walls/random.rsi/meta.json @@ -0,0 +1,14 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Grille sprite taken from https://github.com/tgstation/tgstation at commit 17c603f1d037f22081d446b9a3f3ae8d41f52e86", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "randomgrille" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Walls/random.rsi/randomgrille.png b/Resources/Textures/Structures/Walls/random.rsi/randomgrille.png new file mode 100644 index 0000000000..d01d60ae82 Binary files /dev/null and b/Resources/Textures/Structures/Walls/random.rsi/randomgrille.png differ diff --git a/RobustToolbox b/RobustToolbox index 8a440d705f..f6c55085fe 160000 --- a/RobustToolbox +++ b/RobustToolbox @@ -1 +1 @@ -Subproject commit 8a440d705f753d4cec20e1a3d81b0c5fa77ef726 +Subproject commit f6c55085fe9a798a45b531c056f5545db1bf4475