diff --git a/Content.Client/Administration/Systems/AdminSystem.cs b/Content.Client/Administration/Systems/AdminSystem.cs index f7451d23047..db1b721343e 100644 --- a/Content.Client/Administration/Systems/AdminSystem.cs +++ b/Content.Client/Administration/Systems/AdminSystem.cs @@ -10,16 +10,9 @@ public sealed partial class AdminSystem : EntitySystem { public event Action>? PlayerListChanged; - private Dictionary? _playerList; - public IReadOnlyList PlayerList - { - get - { - if (_playerList != null) return _playerList.Values.ToList(); - - return new List(); - } - } + public Dictionary PlayerInfos = new(); + public IReadOnlyList PlayerList => + PlayerInfos != null ? PlayerInfos.Values.ToList() : new List(); public override void Initialize() { @@ -40,15 +33,15 @@ private void OnPlayerInfoChanged(PlayerInfoChangedEvent ev) { if(ev.PlayerInfo == null) return; - if (_playerList == null) _playerList = new(); + if (PlayerInfos == null) PlayerInfos = new(); - _playerList[ev.PlayerInfo.SessionId] = ev.PlayerInfo; - PlayerListChanged?.Invoke(_playerList.Values.ToList()); + PlayerInfos[ev.PlayerInfo.SessionId] = ev.PlayerInfo; + PlayerListChanged?.Invoke(PlayerInfos.Values.ToList()); } private void OnPlayerListChanged(FullPlayerListEvent msg) { - _playerList = msg.PlayersInfo.ToDictionary(x => x.SessionId, x => x); + PlayerInfos = msg.PlayersInfo.ToDictionary(x => x.SessionId, x => x); PlayerListChanged?.Invoke(msg.PlayersInfo); } } diff --git a/Content.Client/Administration/Systems/BwoinkSystem.cs b/Content.Client/Administration/Systems/BwoinkSystem.cs index 5166dc8416b..a3b295d6b6e 100644 --- a/Content.Client/Administration/Systems/BwoinkSystem.cs +++ b/Content.Client/Administration/Systems/BwoinkSystem.cs @@ -1,7 +1,10 @@ #nullable enable +using Content.Client.UserInterface.Systems.Bwoink; using Content.Shared.Administration; using JetBrains.Annotations; +using Robust.Client.Audio; using Robust.Shared.Network; +using Robust.Shared.Player; using Robust.Shared.Timing; namespace Content.Client.Administration.Systems @@ -10,6 +13,8 @@ namespace Content.Client.Administration.Systems public sealed class BwoinkSystem : SharedBwoinkSystem { [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly AudioSystem _audio = default!; + [Dependency] private readonly AdminSystem _adminSystem = default!; public event EventHandler? OnBwoinkTextMessageRecieved; private (TimeSpan Timestamp, bool Typing) _lastTypingUpdateSent; @@ -21,6 +26,10 @@ protected override void OnBwoinkTextMessage(BwoinkTextMessage message, EntitySes public void Send(NetUserId channelId, string text, bool playSound) { + var info = _adminSystem.PlayerInfos.GetValueOrDefault(channelId)?.Connected ?? true; + _audio.PlayGlobal(info ? AHelpUIController.AHelpSendSound : AHelpUIController.AHelpErrorSound, + Filter.Local(), false); + // Reuse the channel ID as the 'true sender'. // Server will ignore this and if someone makes it not ignore this (which is bad, allows impersonation!!!), that will help. RaiseNetworkEvent(new BwoinkTextMessage(channelId, channelId, text, playSound: playSound)); @@ -31,9 +40,7 @@ public void SendInputTextUpdated(NetUserId channel, bool typing) { if (_lastTypingUpdateSent.Typing == typing && _lastTypingUpdateSent.Timestamp + TimeSpan.FromSeconds(1) > _timing.RealTime) - { return; - } _lastTypingUpdateSent = (_timing.RealTime, typing); RaiseNetworkEvent(new BwoinkClientTypingUpdated(channel, typing)); diff --git a/Content.Client/Nyanotrasen/CartridgeLoader/Cartridges/GlimmerMonitorUi.cs b/Content.Client/CartridgeLoader/Cartridges/GlimmerMonitorUi.cs similarity index 88% rename from Content.Client/Nyanotrasen/CartridgeLoader/Cartridges/GlimmerMonitorUi.cs rename to Content.Client/CartridgeLoader/Cartridges/GlimmerMonitorUi.cs index 0b5fc7ad38c..9ef968e43b1 100644 --- a/Content.Client/Nyanotrasen/CartridgeLoader/Cartridges/GlimmerMonitorUi.cs +++ b/Content.Client/CartridgeLoader/Cartridges/GlimmerMonitorUi.cs @@ -1,10 +1,9 @@ -using Robust.Client.GameObjects; -using Robust.Client.UserInterface; +using Robust.Client.UserInterface; using Content.Client.UserInterface.Fragments; using Content.Shared.CartridgeLoader.Cartridges; using Content.Shared.CartridgeLoader; -namespace Content.Client.Nyanotrasen.CartridgeLoader.Cartridges; +namespace Content.Client.CartridgeLoader.Cartridges; public sealed partial class GlimmerMonitorUi : UIFragment { diff --git a/Content.Client/Nyanotrasen/CartridgeLoader/Cartridges/GlimmerMonitorUiFragment.xaml b/Content.Client/CartridgeLoader/Cartridges/GlimmerMonitorUiFragment.xaml similarity index 93% rename from Content.Client/Nyanotrasen/CartridgeLoader/Cartridges/GlimmerMonitorUiFragment.xaml rename to Content.Client/CartridgeLoader/Cartridges/GlimmerMonitorUiFragment.xaml index 119a1831e6e..e09a422ddf7 100644 --- a/Content.Client/Nyanotrasen/CartridgeLoader/Cartridges/GlimmerMonitorUiFragment.xaml +++ b/Content.Client/CartridgeLoader/Cartridges/GlimmerMonitorUiFragment.xaml @@ -1,4 +1,4 @@ - diff --git a/Content.Client/Nyanotrasen/CartridgeLoader/Cartridges/GlimmerMonitorUiFragment.xaml.cs b/Content.Client/CartridgeLoader/Cartridges/GlimmerMonitorUiFragment.xaml.cs similarity index 96% rename from Content.Client/Nyanotrasen/CartridgeLoader/Cartridges/GlimmerMonitorUiFragment.xaml.cs rename to Content.Client/CartridgeLoader/Cartridges/GlimmerMonitorUiFragment.xaml.cs index 43d9202aa45..3325c0d379e 100644 --- a/Content.Client/Nyanotrasen/CartridgeLoader/Cartridges/GlimmerMonitorUiFragment.xaml.cs +++ b/Content.Client/CartridgeLoader/Cartridges/GlimmerMonitorUiFragment.xaml.cs @@ -1,12 +1,12 @@ using System.Linq; using System.Numerics; -using Content.Client.Nyanotrasen.UserInterface; +using Content.Client.UserInterface; using Robust.Client.AutoGenerated; using Robust.Client.ResourceManagement; using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.XAML; -namespace Content.Client.Nyanotrasen.CartridgeLoader.Cartridges; +namespace Content.Client.CartridgeLoader.Cartridges; [GenerateTypedNameReferences] public sealed partial class GlimmerMonitorUiFragment : BoxContainer diff --git a/Content.Client/Nyanotrasen/Chat/PsionicChatUpdateSystem.cs b/Content.Client/Chat/PsionicChatUpdateSystem.cs similarity index 96% rename from Content.Client/Nyanotrasen/Chat/PsionicChatUpdateSystem.cs rename to Content.Client/Chat/PsionicChatUpdateSystem.cs index 84602052fe7..066501acb78 100644 --- a/Content.Client/Nyanotrasen/Chat/PsionicChatUpdateSystem.cs +++ b/Content.Client/Chat/PsionicChatUpdateSystem.cs @@ -2,7 +2,7 @@ using Content.Client.Chat.Managers; using Robust.Client.Player; -namespace Content.Client.Nyanotrasen.Chat +namespace Content.Client.Chat { public sealed class PsionicChatUpdateSystem : EntitySystem { diff --git a/Content.Client/Eye/PenLight/UI/PenLightBoundUserInterface.cs b/Content.Client/Eye/PenLight/UI/PenLightBoundUserInterface.cs new file mode 100644 index 00000000000..c4887531151 --- /dev/null +++ b/Content.Client/Eye/PenLight/UI/PenLightBoundUserInterface.cs @@ -0,0 +1,47 @@ +using Content.Shared.Medical; +using JetBrains.Annotations; +using Robust.Client.GameObjects; + +namespace Content.Client.Eye.PenLight.UI +{ + [UsedImplicitly] + public sealed class PenLightBoundUserInterface : BoundUserInterface + { + [ViewVariables] + private PenLightWindow? _window; + + public PenLightBoundUserInterface(EntityUid owner, Enum uiKey) : base(owner, uiKey) { } + + protected override void Open() + { + base.Open(); + _window = new PenLightWindow + { + Title = EntMan.GetComponent(Owner).EntityName, + }; + _window.OnClose += Close; + _window.OpenCentered(); + } + + protected override void ReceiveMessage(BoundUserInterfaceMessage message) + { + if (_window == null + || message is not PenLightUserMessage cast) + return; + + _window.Diagnose(cast); + } + + protected override void Dispose(bool disposing) + { + base.Dispose(disposing); + if (!disposing) + return; + + if (_window != null) + _window.OnClose -= Close; + + _window?.Dispose(); + } + } +} diff --git a/Content.Client/Eye/PenLight/UI/PenLightWindow.xaml b/Content.Client/Eye/PenLight/UI/PenLightWindow.xaml new file mode 100644 index 00000000000..149b8a13828 --- /dev/null +++ b/Content.Client/Eye/PenLight/UI/PenLightWindow.xaml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/Content.Client/Eye/PenLight/UI/PenLightWindow.xaml.cs b/Content.Client/Eye/PenLight/UI/PenLightWindow.xaml.cs new file mode 100644 index 00000000000..809a569fa47 --- /dev/null +++ b/Content.Client/Eye/PenLight/UI/PenLightWindow.xaml.cs @@ -0,0 +1,78 @@ +using Content.Client.UserInterface.Controls; +using Content.Shared.Damage; +using Content.Shared.IdentityManagement; +using Content.Shared.Medical; +using Robust.Client.AutoGenerated; +using Robust.Client.UserInterface.XAML; +using System.Text; + + +namespace Content.Client.Eye.PenLight.UI +{ + [GenerateTypedNameReferences] + public sealed partial class PenLightWindow : FancyWindow + { + private readonly IEntityManager _entityManager; + private const int LightHeight = 150; + private const int LightWidth = 900; + + public PenLightWindow() + { + RobustXamlLoader.Load(this); + + var dependencies = IoCManager.Instance!; + _entityManager = dependencies.Resolve(); + } + public void Diagnose(PenLightUserMessage msg) + { + var target = _entityManager.GetEntity(msg.TargetEntity); + + if (target == null || !_entityManager.TryGetComponent(target, out var damageable)) + { + NoPatientDataText.Visible = true; + ExamDataLabel.Text = string.Empty; + return; + } + + NoPatientDataText.Visible = false; + + + string entityName = Loc.GetString("pen-light-window-entity-unknown-text"); + if (_entityManager.HasComponent(target.Value)) + entityName = Identity.Name(target.Value, _entityManager); + + var sb = new StringBuilder(); + sb.AppendLine(Loc.GetString("pen-light-window-entity-eyes-text", ("entityName", entityName))); + + // Check if Blind and return early if true + if (msg.Blind == true) + { + sb.AppendLine(Loc.GetString("pen-light-exam-blind-text")); + ExamDataLabel.Text = sb.ToString(); + SetHeight = LightHeight; + SetWidth = LightWidth; + return; + } + // EyeDamage + if (msg.EyeDamage == true) + sb.AppendLine(Loc.GetString("pen-light-exam-eyedamage-text")); + + // Drunk + if (msg.Drunk == true) + sb.AppendLine(Loc.GetString("pen-light-exam-drunk-text")); + + // Hallucinating + if (msg.SeeingRainbows == true) + sb.AppendLine(Loc.GetString("pen-light-exam-hallucinating-text")); + + // Healthy + if (msg.Healthy == true) + sb.AppendLine(Loc.GetString("pen-light-exam-healthy-text")); + + ExamDataLabel.Text = sb.ToString(); + + SetHeight = LightHeight; + SetWidth = LightWidth; + } + } +} \ No newline at end of file diff --git a/Content.Client/LateJoin/LateJoinGui.cs b/Content.Client/LateJoin/LateJoinGui.cs index ba9351d6746..92e1ee2aaf1 100644 --- a/Content.Client/LateJoin/LateJoinGui.cs +++ b/Content.Client/LateJoin/LateJoinGui.cs @@ -4,9 +4,13 @@ using Content.Client.GameTicking.Managers; using Content.Client.UserInterface.Controls; using Content.Client.Players.PlayTimeTracking; +using Content.Client.Preferences; using Content.Shared.CCVar; +using Content.Shared.Customization.Systems; +using Content.Shared.Preferences; using Content.Shared.Roles; using Content.Shared.StatusIcon; +using Microsoft.Win32.SafeHandles; using Robust.Client.Console; using Robust.Client.GameObjects; using Robust.Client.UserInterface; @@ -26,12 +30,15 @@ public sealed class LateJoinGui : DefaultWindow [Dependency] private readonly IConfigurationManager _configManager = default!; [Dependency] private readonly IEntitySystemManager _entitySystem = default!; [Dependency] private readonly JobRequirementsManager _jobRequirements = default!; + [Dependency] private readonly IEntityManager _entityManager = default!; + [Dependency] private readonly IClientPreferencesManager _prefs = default!; public event Action<(NetEntity, string)> SelectedId; private readonly ClientGameTicker _gameTicker; private readonly SpriteSystem _sprites; private readonly CrewManifestSystem _crewManifest; + private readonly CharacterRequirementsSystem _characterRequirements; private readonly Dictionary>> _jobButtons = new(); private readonly Dictionary> _jobCategories = new(); @@ -46,6 +53,7 @@ public LateJoinGui() _sprites = _entitySystem.GetEntitySystem(); _crewManifest = _entitySystem.GetEntitySystem(); _gameTicker = _entitySystem.GetEntitySystem(); + _characterRequirements = _entitySystem.GetEntitySystem(); Title = Loc.GetString("late-join-gui-title"); @@ -254,14 +262,24 @@ private void RebuildUI() jobButton.OnPressed += _ => SelectedId.Invoke((id, jobButton.JobId)); - if (!_jobRequirements.IsAllowed(prototype, out var reason)) + if (!_characterRequirements.CheckRequirementsValid( + prototype.Requirements ?? new(), + prototype, + (HumanoidCharacterProfile) (_prefs.Preferences?.SelectedCharacter + ?? HumanoidCharacterProfile.DefaultWithSpecies()), + _jobRequirements.GetRawPlayTimeTrackers(), + _jobRequirements.IsWhitelisted(), + _entityManager, + _prototypeManager, + _configManager, + out var reasons)) { jobButton.Disabled = true; - if (!reason.IsEmpty) + if (reasons.Count > 0) { var tooltip = new Tooltip(); - tooltip.SetMessage(reason); + tooltip.SetMessage(_characterRequirements.GetRequirementsText(reasons)); jobButton.TooltipSupplier = _ => tooltip; } diff --git a/Content.Client/Lobby/LobbyUIController.cs b/Content.Client/Lobby/LobbyUIController.cs index 36f43d6f4aa..47ab651c10e 100644 --- a/Content.Client/Lobby/LobbyUIController.cs +++ b/Content.Client/Lobby/LobbyUIController.cs @@ -2,6 +2,7 @@ using Content.Client.Humanoid; using Content.Client.Inventory; using Content.Client.Lobby.UI; +using Content.Client.Players.PlayTimeTracking; using Content.Client.Preferences; using Content.Client.Preferences.UI; using Content.Shared.Clothing.Loadouts.Systems; @@ -23,6 +24,7 @@ public sealed class LobbyUIController : UIController, IOnStateEntered diff --git a/Content.Client/Players/PlayTimeTracking/JobRequirementsManager.cs b/Content.Client/Players/PlayTimeTracking/JobRequirementsManager.cs index df73f5ff3f4..a2f8061d057 100644 --- a/Content.Client/Players/PlayTimeTracking/JobRequirementsManager.cs +++ b/Content.Client/Players/PlayTimeTracking/JobRequirementsManager.cs @@ -1,5 +1,6 @@ using System.Diagnostics.CodeAnalysis; using Content.Shared.CCVar; +using Content.Shared.Customization.Systems; using Content.Shared.Players; using Content.Shared.Players.PlayTimeTracking; using Content.Shared.Roles; @@ -17,9 +18,6 @@ public sealed partial class JobRequirementsManager : ISharedPlaytimeManager { [Dependency] private readonly IBaseClient _client = default!; [Dependency] private readonly IClientNetManager _net = default!; - [Dependency] private readonly IConfigurationManager _cfg = default!; - [Dependency] private readonly IEntityManager _entManager = default!; - [Dependency] private readonly IPlayerManager _playerManager = default!; [Dependency] private readonly IPrototypeManager _prototypes = default!; private readonly Dictionary _roles = new(); @@ -80,43 +78,6 @@ private void RxPlayTime(MsgPlayTime message) Updated?.Invoke(); } - public bool IsAllowed(JobPrototype job, [NotNullWhen(false)] out FormattedMessage? reason) - { - reason = null; - - if (_roleBans.Contains($"Job:{job.ID}")) - { - reason = FormattedMessage.FromUnformatted(Loc.GetString("role-ban")); - return false; - } - - var player = _playerManager.LocalSession; - if (player == null) - return true; - - return CheckRoleTime(job.Requirements, out reason); - } - - public bool CheckRoleTime(HashSet? requirements, [NotNullWhen(false)] out FormattedMessage? reason, string? localePrefix = "role-timer-") - { - reason = null; - - if (requirements == null || !_cfg.GetCVar(CCVars.GameRoleTimers)) - return true; - - var reasons = new List(); - foreach (var requirement in requirements) - { - if (JobRequirements.TryRequirementMet(requirement, _roles, out var jobReason, _entManager, _prototypes, _whitelisted, localePrefix)) - continue; - - reasons.Add(jobReason.ToMarkup()); - } - - reason = reasons.Count == 0 ? null : FormattedMessage.FromMarkup(string.Join('\n', reasons)); - return reason == null; - } - public TimeSpan FetchOverallPlaytime() { return _roles.TryGetValue("Overall", out var overallPlaytime) ? overallPlaytime : TimeSpan.Zero; @@ -137,12 +98,13 @@ public Dictionary FetchPlaytimeByRoles() public Dictionary GetPlayTimes() { - var dict = new Dictionary(); - + var dict = FetchPlaytimeByRoles(); dict.Add(PlayTimeTrackingShared.TrackerOverall, FetchOverallPlaytime()); - foreach (var role in FetchPlaytimeByRoles()) - dict.Add(role.Key, role.Value); - return dict; } + + public Dictionary GetRawPlayTimeTrackers() + { + return _roles; + } } diff --git a/Content.Client/Preferences/UI/AntagPreferenceSelector.cs b/Content.Client/Preferences/UI/AntagPreferenceSelector.cs index 06694f51168..4a339d3f659 100644 --- a/Content.Client/Preferences/UI/AntagPreferenceSelector.cs +++ b/Content.Client/Preferences/UI/AntagPreferenceSelector.cs @@ -1,5 +1,9 @@ using Content.Client.Players.PlayTimeTracking; +using Content.Shared.Customization.Systems; +using Content.Shared.Preferences; using Content.Shared.Roles; +using Robust.Shared.Configuration; +using Robust.Shared.Prototypes; namespace Content.Client.Preferences.UI; @@ -14,7 +18,7 @@ public bool Preference public event Action? PreferenceChanged; - public AntagPreferenceSelector(AntagPrototype proto) : base(proto) + public AntagPreferenceSelector(AntagPrototype proto, JobPrototype highJob) : base(proto, highJob) { Options.OnItemSelected += _ => PreferenceChanged?.Invoke(Preference); @@ -30,7 +34,23 @@ public AntagPreferenceSelector(AntagPrototype proto) : base(proto) // Immediately lock requirements if they aren't met. // Another function checks Disabled after creating the selector so this has to be done now var requirements = IoCManager.Resolve(); - if (proto.Requirements != null && !requirements.CheckRoleTime(proto.Requirements, out var reason)) - LockRequirements(reason); + var prefs = IoCManager.Resolve(); + var entMan = IoCManager.Resolve(); + var characterReqs = entMan.System(); + var protoMan = IoCManager.Resolve(); + var configMan = IoCManager.Resolve(); + + if (proto.Requirements != null + && !characterReqs.CheckRequirementsValid( + proto.Requirements, + highJob, + (HumanoidCharacterProfile) (prefs.Preferences?.SelectedCharacter ?? HumanoidCharacterProfile.DefaultWithSpecies()), + requirements.GetRawPlayTimeTrackers(), + requirements.IsWhitelisted(), + entMan, + protoMan, + configMan, + out var reasons)) + LockRequirements(characterReqs.GetRequirementsText(reasons)); } } diff --git a/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml.cs b/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml.cs index 771d928ebf9..954a705fceb 100644 --- a/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml.cs +++ b/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml.cs @@ -115,7 +115,7 @@ public HumanoidProfileEditor(IClientPreferencesManager preferencesManager, IProt _preferencesManager = preferencesManager; _configurationManager = configurationManager; _markingManager = IoCManager.Resolve(); - _characterRequirementsSystem = EntitySystem.Get(); + _characterRequirementsSystem = _entityManager.System(); _controller = UserInterfaceManager.GetUIController(); _controller.SetProfileEditor(this); @@ -642,7 +642,9 @@ private void UpdateAntagRequirements() if (!antag.SetPreference) continue; - var selector = new AntagPreferenceSelector(antag) + var selector = new AntagPreferenceSelector(antag, + _jobPriorities.FirstOrDefault(j => j.Priority == JobPriority.High)?.HighJob + ?? new()) { Margin = new Thickness(3f, 3f, 3f, 0f) }; _antagList.AddChild(selector); _antagPreferences.Add(selector); @@ -723,10 +725,17 @@ private void UpdateRoleRequirements() { var selector = new JobPrioritySelector(job, _prototypeManager); - if (!_requirements.IsAllowed(job, out var reason)) - { - selector.LockRequirements(reason); - } + if (!_characterRequirementsSystem.CheckRequirementsValid( + job.Requirements ?? new(), + job, + Profile ?? HumanoidCharacterProfile.DefaultWithSpecies(), + _requirements.GetRawPlayTimeTrackers(), + _requirements.IsWhitelisted(), + _entityManager, + _prototypeManager, + _configurationManager, + out var reasons)) + selector.LockRequirements(_characterRequirementsSystem.GetRequirementsText(reasons)); category.AddChild(selector); _jobPriorities.Add(selector); @@ -770,7 +779,17 @@ private void EnsureJobRequirementsValid() var changed = false; foreach (var selector in _jobPriorities) { - if (_requirements.IsAllowed(selector.Proto, out var _) || selector.Priority == JobPriority.Never) + if (selector.Priority == JobPriority.Never + || _characterRequirementsSystem.CheckRequirementsValid( + selector.Proto.Requirements ?? new(), + selector.Proto, + Profile ?? HumanoidCharacterProfile.DefaultWithSpecies(), + _requirements.GetRawPlayTimeTrackers(), + _requirements.IsWhitelisted(), + _entityManager, + _prototypeManager, + _configurationManager, + out _)) continue; selector.Priority = JobPriority.Never; @@ -1412,11 +1431,11 @@ private void UpdateTraits(bool showUnusable) var traits = enumeratedTraits.Where(trait => showUnusable || // Ignore everything if this is true _characterRequirementsSystem.CheckRequirementsValid( - trait, trait.Requirements, highJob?.Proto ?? new JobPrototype(), Profile ?? HumanoidCharacterProfile.DefaultWithSpecies(), - _requirements.GetPlayTimes(), + _requirements.GetRawPlayTimeTrackers(), + _requirements.IsWhitelisted(), _entityManager, _prototypeManager, _configurationManager, @@ -1427,11 +1446,11 @@ out _ // Traits to highlight red when showUnusable is true var traitsUnusable = enumeratedTraits.Where(trait => _characterRequirementsSystem.CheckRequirementsValid( - trait, trait.Requirements, highJob?.Proto ?? new JobPrototype(), Profile ?? HumanoidCharacterProfile.DefaultWithSpecies(), - _requirements.GetPlayTimes(), + _requirements.GetRawPlayTimeTrackers(), + _requirements.IsWhitelisted(), _entityManager, _prototypeManager, _configurationManager, @@ -1538,7 +1557,8 @@ out _ var selector = new TraitPreferenceSelector(trait, highJob?.Proto ?? new JobPrototype(), Profile ?? HumanoidCharacterProfile.DefaultWithSpecies(), traitsUnusable.Contains(trait) ? "" : "ButtonColorRed", - _entityManager, _prototypeManager, _configurationManager, _characterRequirementsSystem); + _entityManager, _prototypeManager, _configurationManager, _characterRequirementsSystem, + _requirements); // Look for an existing trait category BoxContainer? match = null; @@ -1570,7 +1590,8 @@ out _ { var selector = new TraitPreferenceSelector(trait, highJob?.Proto ?? new JobPrototype(), Profile ?? HumanoidCharacterProfile.DefaultWithSpecies(), "", - _entityManager, _prototypeManager, _configurationManager, _characterRequirementsSystem); + _entityManager, _prototypeManager, _configurationManager, _characterRequirementsSystem, + _requirements); AddSelector(selector, trait.Points, trait.ID); @@ -1578,7 +1599,7 @@ out _ // Hide Uncategorized tab if it's empty, other tabs already shouldn't exist if they're empty - _traitsTabs.SetTabVisible(0, uncategorized.Children.Any()); + _traitsTabs.SetTabVisible(0, uncategorized.Children.First().Children.First().Children.Any()); // Add fake tabs until tab container is happy for (var i = _traitsTabs.ChildCount - 1; i < _traitsTabs.CurrentTab; i++) @@ -1671,11 +1692,11 @@ private void UpdateLoadouts(bool showUnusable) var loadouts = enumeratedLoadouts.Where(loadout => showUnusable || // Ignore everything if this is true _characterRequirementsSystem.CheckRequirementsValid( - loadout, loadout.Requirements, highJob?.Proto ?? new JobPrototype(), Profile ?? HumanoidCharacterProfile.DefaultWithSpecies(), - _requirements.GetPlayTimes(), + _requirements.GetRawPlayTimeTrackers(), + _requirements.IsWhitelisted(), _entityManager, _prototypeManager, _configurationManager, @@ -1686,11 +1707,11 @@ out _ // Loadouts to highlight red when showUnusable is true var loadoutsUnusable = enumeratedLoadouts.Where(loadout => _characterRequirementsSystem.CheckRequirementsValid( - loadout, loadout.Requirements, highJob?.Proto ?? new JobPrototype(), Profile ?? HumanoidCharacterProfile.DefaultWithSpecies(), - _requirements.GetPlayTimes(), + _requirements.GetRawPlayTimeTrackers(), + _requirements.IsWhitelisted(), _entityManager, _prototypeManager, _configurationManager, @@ -1800,7 +1821,8 @@ out _ var selector = new LoadoutPreferenceSelector(loadout, highJob?.Proto ?? new JobPrototype(), Profile ?? HumanoidCharacterProfile.DefaultWithSpecies(), loadoutsUnusable.Contains(loadout) ? "" : "ButtonColorRed", - _entityManager, _prototypeManager, _configurationManager, _characterRequirementsSystem); + _entityManager, _prototypeManager, _configurationManager, _characterRequirementsSystem, + _requirements); // Look for an existing loadout category BoxContainer? match = null; @@ -1829,7 +1851,8 @@ out _ { var selector = new LoadoutPreferenceSelector(loadout, highJob?.Proto ?? new JobPrototype(), Profile ?? HumanoidCharacterProfile.DefaultWithSpecies(), "", - _entityManager, _prototypeManager, _configurationManager, _characterRequirementsSystem); + _entityManager, _prototypeManager, _configurationManager, _characterRequirementsSystem, + _requirements); AddSelector(selector, loadout.Cost, loadout.ID); @@ -1837,7 +1860,7 @@ out _ // Hide Uncategorized tab if it's empty, other tabs already shouldn't exist if they're empty - _loadoutsTabs.SetTabVisible(0, uncategorized.Children.Any()); + _loadoutsTabs.SetTabVisible(0, uncategorized.Children.First().Children.First().Children.Any()); // Add fake tabs until tab container is happy for (var i = _loadoutsTabs.ChildCount - 1; i < _loadoutsTabs.CurrentTab; i++) diff --git a/Content.Client/Preferences/UI/JobPrioritySelector.cs b/Content.Client/Preferences/UI/JobPrioritySelector.cs index 2e2c699c3ad..f66102d644f 100644 --- a/Content.Client/Preferences/UI/JobPrioritySelector.cs +++ b/Content.Client/Preferences/UI/JobPrioritySelector.cs @@ -4,6 +4,7 @@ using Content.Shared.StatusIcon; using Robust.Client.UserInterface.Controls; using Robust.Client.Utility; +using Robust.Shared.CPUJob.JobQueues; using Robust.Shared.Prototypes; namespace Content.Client.Preferences.UI; @@ -18,7 +19,7 @@ public JobPriority Priority public event Action? PriorityChanged; - public JobPrioritySelector(JobPrototype proto, IPrototypeManager protoMan) : base(proto) + public JobPrioritySelector(JobPrototype proto, IPrototypeManager protoMan) : base(proto, proto) { Options.OnItemSelected += _ => PriorityChanged?.Invoke(Priority); diff --git a/Content.Client/Preferences/UI/LoadoutPreferenceSelector.cs b/Content.Client/Preferences/UI/LoadoutPreferenceSelector.cs index a6839dee65f..82d8fd65b33 100644 --- a/Content.Client/Preferences/UI/LoadoutPreferenceSelector.cs +++ b/Content.Client/Preferences/UI/LoadoutPreferenceSelector.cs @@ -1,6 +1,7 @@ using System.Linq; using System.Numerics; using System.Text; +using Content.Client.Players.PlayTimeTracking; using Content.Client.Stylesheets; using Content.Shared.Clothing.Loadouts.Prototypes; using Content.Shared.Customization.Systems; @@ -32,7 +33,8 @@ public bool Preference public LoadoutPreferenceSelector(LoadoutPrototype loadout, JobPrototype highJob, HumanoidCharacterProfile profile, string style, IEntityManager entityManager, IPrototypeManager prototypeManager, - IConfigurationManager configManager, CharacterRequirementsSystem characterRequirementsSystem) + IConfigurationManager configManager, CharacterRequirementsSystem characterRequirementsSystem, + JobRequirementsManager jobRequirementsManager) { Loadout = loadout; @@ -94,8 +96,9 @@ public LoadoutPreferenceSelector(LoadoutPrototype loadout, JobPrototype highJob, // Get requirement reasons - characterRequirementsSystem.CheckRequirementsValid(loadout, loadout.Requirements, highJob, profile, - new Dictionary(), + characterRequirementsSystem.CheckRequirementsValid( + loadout.Requirements, highJob, profile, new Dictionary(), + jobRequirementsManager.IsWhitelisted(), entityManager, prototypeManager, configManager, out var reasons); diff --git a/Content.Client/Preferences/UI/RequirementsSelector.cs b/Content.Client/Preferences/UI/RequirementsSelector.cs index a4a25536d09..83b96952886 100644 --- a/Content.Client/Preferences/UI/RequirementsSelector.cs +++ b/Content.Client/Preferences/UI/RequirementsSelector.cs @@ -1,6 +1,7 @@ using System.Numerics; using Content.Client.Stylesheets; using Content.Client.UserInterface.Controls; +using Content.Shared.Roles; using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.CustomControls; using Robust.Shared.Prototypes; @@ -11,14 +12,16 @@ namespace Content.Client.Preferences.UI; public abstract class RequirementsSelector : BoxContainer where T : IPrototype { public T Proto { get; } + public JobPrototype HighJob { get; } public bool Disabled => _lockStripe.Visible; protected readonly RadioOptions Options; private readonly StripeBack _lockStripe; - protected RequirementsSelector(T proto) + protected RequirementsSelector(T proto, JobPrototype highJob) { Proto = proto; + HighJob = highJob; Options = new RadioOptions(RadioOptionsLayout.Horizontal) { diff --git a/Content.Client/Preferences/UI/TraitPreferenceSelector.cs b/Content.Client/Preferences/UI/TraitPreferenceSelector.cs index 0f843ca3a58..e9ce1a5e9be 100644 --- a/Content.Client/Preferences/UI/TraitPreferenceSelector.cs +++ b/Content.Client/Preferences/UI/TraitPreferenceSelector.cs @@ -1,4 +1,5 @@ using System.Text; +using Content.Client.Players.PlayTimeTracking; using Content.Client.Stylesheets; using Content.Shared.Customization.Systems; using Content.Shared.Preferences; @@ -30,7 +31,8 @@ public bool Preference public TraitPreferenceSelector(TraitPrototype trait, JobPrototype highJob, HumanoidCharacterProfile profile, string style, IEntityManager entityManager, IPrototypeManager prototypeManager, - IConfigurationManager configManager, CharacterRequirementsSystem characterRequirementsSystem) + IConfigurationManager configManager, CharacterRequirementsSystem characterRequirementsSystem, + JobRequirementsManager jobRequirementsManager) { Trait = trait; @@ -71,8 +73,9 @@ public TraitPreferenceSelector(TraitPrototype trait, JobPrototype highJob, // Get requirement reasons - characterRequirementsSystem.CheckRequirementsValid(trait, trait.Requirements, highJob, profile, - new Dictionary(), + characterRequirementsSystem.CheckRequirementsValid( + trait.Requirements, highJob, profile, new Dictionary(), + jobRequirementsManager.IsWhitelisted(), entityManager, prototypeManager, configManager, out var reasons); diff --git a/Content.Client/Nyanotrasen/Psionics/Glimmer/GlimmerReactiveVisuals.cs b/Content.Client/Psionics/Glimmer/GlimmerReactiveVisuals.cs similarity index 100% rename from Content.Client/Nyanotrasen/Psionics/Glimmer/GlimmerReactiveVisuals.cs rename to Content.Client/Psionics/Glimmer/GlimmerReactiveVisuals.cs diff --git a/Content.Client/Nyanotrasen/Psionics/UI/AcceptPsionicsEUI.cs b/Content.Client/Psionics/UI/AcceptPsionicsEUI.cs similarity index 100% rename from Content.Client/Nyanotrasen/Psionics/UI/AcceptPsionicsEUI.cs rename to Content.Client/Psionics/UI/AcceptPsionicsEUI.cs diff --git a/Content.Client/Nyanotrasen/Psionics/UI/AcceptPsionicsWindow.cs b/Content.Client/Psionics/UI/AcceptPsionicsWindow.cs similarity index 100% rename from Content.Client/Nyanotrasen/Psionics/UI/AcceptPsionicsWindow.cs rename to Content.Client/Psionics/UI/AcceptPsionicsWindow.cs diff --git a/Content.Client/Nyanotrasen/UserInterface/GlimmerGraph.cs b/Content.Client/UserInterface/GlimmerGraph.cs similarity index 97% rename from Content.Client/Nyanotrasen/UserInterface/GlimmerGraph.cs rename to Content.Client/UserInterface/GlimmerGraph.cs index c4a9109dcd8..188ebe2475b 100644 --- a/Content.Client/Nyanotrasen/UserInterface/GlimmerGraph.cs +++ b/Content.Client/UserInterface/GlimmerGraph.cs @@ -4,7 +4,7 @@ using Robust.Client.ResourceManagement; using Robust.Client.UserInterface; -namespace Content.Client.Nyanotrasen.UserInterface; +namespace Content.Client.UserInterface; public sealed class GlimmerGraph : Control { diff --git a/Content.Client/UserInterface/Systems/Bwoink/AHelpUIController.cs b/Content.Client/UserInterface/Systems/Bwoink/AHelpUIController.cs index 2c913a2d580..2d2be1babca 100644 --- a/Content.Client/UserInterface/Systems/Bwoink/AHelpUIController.cs +++ b/Content.Client/UserInterface/Systems/Bwoink/AHelpUIController.cs @@ -33,7 +33,6 @@ namespace Content.Client.UserInterface.Systems.Bwoink; public sealed class AHelpUIController: UIController, IOnSystemChanged, IOnStateChanged, IOnStateChanged { [Dependency] private readonly IClientAdminManager _adminManager = default!; - [Dependency] private readonly IConfigurationManager _config = default!; [Dependency] private readonly IPlayerManager _playerManager = default!; [Dependency] private readonly IClyde _clyde = default!; [Dependency] private readonly IUserInterfaceManager _uiManager = default!; @@ -43,9 +42,14 @@ public sealed class AHelpUIController: UIController, IOnSystemChanged UIManager.GetActiveUIWidgetOrNull()?.AHelpButton; private Button? LobbyAHelpButton => (UIManager.ActiveScreen as LobbyGui)?.AHelpButton; public IAHelpUIHandler? UIHelper; + private bool _discordRelayActive; private bool _hasUnreadAHelp; - private string? _aHelpSound; + + public const string AHelpErrorSound = "/Audio/Admin/ahelp_error.ogg"; + public const string AHelpReceiveSound = "/Audio/Admin/ahelp_receive.ogg"; + public const string AHelpSendSound = "/Audio/Admin/ahelp_send.ogg"; + public override void Initialize() { @@ -55,9 +59,9 @@ public override void Initialize() SubscribeNetworkEvent(PeopleTypingUpdated); _adminManager.AdminStatusUpdated += OnAdminStatusUpdated; - _config.OnValueChanged(CCVars.AHelpSound, v => _aHelpSound = v, true); } + public void UnloadButton() { if (GameAHelpButton != null) @@ -112,14 +116,10 @@ public void OnSystemUnloaded(BwoinkSystem system) private void SetAHelpPressed(bool pressed) { if (GameAHelpButton != null) - { GameAHelpButton.Pressed = pressed; - } if (LobbyAHelpButton != null) - { LobbyAHelpButton.Pressed = pressed; - } UIManager.ClickSound(); UnreadAHelpRead(); @@ -130,22 +130,18 @@ private void ReceivedBwoink(object? sender, SharedBwoinkSystem.BwoinkTextMessage Logger.InfoS("c.s.go.es.bwoink", $"@{message.UserId}: {message.Text}"); var localPlayer = _playerManager.LocalSession; if (localPlayer == null) - { return; - } - if (message.PlaySound && localPlayer.UserId != message.TrueSender) + + EnsureUIHelper(); + + if (message.PlaySound && localPlayer.UserId != message.TrueSender && !UIHelper!.IsOpen) { - if (_aHelpSound != null) - _audio.PlayGlobal(_aHelpSound, Filter.Local(), false); + _audio.PlayGlobal(AHelpReceiveSound, Filter.Local(), false); _clyde.RequestWindowAttention(); } - EnsureUIHelper(); - if (!UIHelper!.IsOpen) - { UnreadAHelpReceived(); - } UIHelper!.Receive(message); } diff --git a/Content.Client/UserInterface/Systems/Chat/ChatUIController.cs b/Content.Client/UserInterface/Systems/Chat/ChatUIController.cs index 138dc9e52be..bc79283d76e 100644 --- a/Content.Client/UserInterface/Systems/Chat/ChatUIController.cs +++ b/Content.Client/UserInterface/Systems/Chat/ChatUIController.cs @@ -38,7 +38,6 @@ using Robust.Shared.Replays; using Robust.Shared.Timing; using Robust.Shared.Utility; -using Content.Client.Nyanotrasen.Chat; //Nyano - Summary: chat namespace. namespace Content.Client.UserInterface.Systems.Chat; diff --git a/Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRolesEui.cs b/Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRolesEui.cs index 8e72eafd97c..f03289782ae 100644 --- a/Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRolesEui.cs +++ b/Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRolesEui.cs @@ -1,10 +1,15 @@ using System.Linq; using Content.Client.Eui; using Content.Client.Players.PlayTimeTracking; +using Content.Client.Preferences; +using Content.Shared.Customization.Systems; using Content.Shared.Eui; using Content.Shared.Ghost.Roles; +using Content.Shared.Preferences; using JetBrains.Annotations; using Robust.Client.GameObjects; +using Robust.Shared.Configuration; +using Robust.Shared.Prototypes; using Robust.Shared.Utility; namespace Content.Client.UserInterface.Systems.Ghost.Controls.Roles @@ -71,6 +76,10 @@ public override void HandleState(EuiStateBase state) var sysManager = entityManager.EntitySysManager; var spriteSystem = sysManager.GetEntitySystem(); var requirementsManager = IoCManager.Resolve(); + var characterReqs = entityManager.System(); + var prefs = IoCManager.Resolve(); + var protoMan = IoCManager.Resolve(); + var configManager = IoCManager.Resolve(); var groupedRoles = ghostState.GhostRoles.GroupBy( role => (role.Name, role.Description, role.Requirements)); @@ -78,15 +87,22 @@ public override void HandleState(EuiStateBase state) { var name = group.Key.Name; var description = group.Key.Description; - bool hasAccess = true; - FormattedMessage? reason; + // ReSharper disable once ReplaceWithSingleAssignment.True + var hasAccess = true; - if (!requirementsManager.CheckRoleTime(group.Key.Requirements, out reason)) - { + if (!characterReqs.CheckRequirementsValid( + group.Key.Requirements ?? new(), + new(), + (HumanoidCharacterProfile) (prefs.Preferences?.SelectedCharacter ?? HumanoidCharacterProfile.DefaultWithSpecies()), + requirementsManager.GetRawPlayTimeTrackers(), + requirementsManager.IsWhitelisted(), + entityManager, + protoMan, + configManager, + out var reasons)) hasAccess = false; - } - _window.AddEntry(name, description, hasAccess, reason, group, spriteSystem); + _window.AddEntry(name, description, hasAccess, characterReqs.GetRequirementsText(reasons), group, spriteSystem); } var closeRulesWindow = ghostState.GhostRoles.All(role => role.Identifier != _windowRulesId); diff --git a/Content.IntegrationTests/Tests/Nyanotrasen/Oracle/OracleTest.cs b/Content.IntegrationTests/Tests/Nyanotrasen/Oracle/OracleTest.cs deleted file mode 100644 index c925db3ba21..00000000000 --- a/Content.IntegrationTests/Tests/Nyanotrasen/Oracle/OracleTest.cs +++ /dev/null @@ -1,72 +0,0 @@ -#nullable enable -using NUnit.Framework; -using System.Threading.Tasks; -using Content.Shared.Item; -using Content.Shared.Mobs.Components; -using Content.Server.Research.Oracle; -using Content.Shared.Chemistry.Components; -using Robust.Shared.GameObjects; -using Robust.Shared.Map; -using Robust.Shared.Prototypes; - - -/// -/// The oracle's request pool is huge. -/// We need to test everything that the oracle could request can be turned in. -/// -namespace Content.IntegrationTests.Tests.Oracle -{ - [TestFixture] - [TestOf(typeof(OracleSystem))] - public sealed class OracleTest - { - [Test] - public async Task AllOracleItemsCanBeTurnedIn() - { - await using var pairTracker = await PoolManager.GetServerClient(); - var server = pairTracker.Server; - // Per RobustIntegrationTest.cs, wait until state is settled to access it. - await server.WaitIdleAsync(); - - var mapManager = server.ResolveDependency(); - var prototypeManager = server.ResolveDependency(); - var entityManager = server.ResolveDependency(); - var entitySystemManager = server.ResolveDependency(); - - var oracleSystem = entitySystemManager.GetEntitySystem(); - var oracleComponent = new OracleComponent(); - - var testMap = await pairTracker.CreateTestMap(); - - await server.WaitAssertion(() => - { - var allProtos = oracleSystem.GetAllProtos(oracleComponent); - var coordinates = testMap.GridCoords; - - Assert.That((allProtos.Count > 0), "Oracle has no valid prototypes!"); - - foreach (var proto in allProtos) - { - var spawned = entityManager.SpawnEntity(proto, coordinates); - - Assert.That(entityManager.HasComponent(spawned), - $"Oracle can request non-item {proto}"); - - Assert.That(!entityManager.HasComponent(spawned), - $"Oracle can request reagent container {proto} that will conflict with the fountain"); - - Assert.That(!entityManager.HasComponent(spawned), - $"Oracle can request mob {proto} that could potentially have a player-set name."); - } - - // Because Server/Client pairs can be re-used between Tests, we - // need to clean up anything that might affect other tests, - // otherwise this pair cannot be considered clean, and the - // CleanReturnAsync call would need to be removed. - mapManager.DeleteMap(testMap.MapId); - }); - - await pairTracker.CleanReturnAsync(); - } - } -} diff --git a/Content.IntegrationTests/Tests/Slipping/SlippingTest.cs b/Content.IntegrationTests/Tests/Slipping/SlippingTest.cs index 7f77146f455..511a720ed07 100644 --- a/Content.IntegrationTests/Tests/Slipping/SlippingTest.cs +++ b/Content.IntegrationTests/Tests/Slipping/SlippingTest.cs @@ -1,11 +1,14 @@ #nullable enable using System.Collections.Generic; using Content.IntegrationTests.Tests.Interaction; +using Content.Shared.CCVar; using Content.Shared.Movement.Components; using Content.Shared.Slippery; using Content.Shared.Stunnable; +using Robust.Shared.Configuration; using Robust.Shared.GameObjects; using Robust.Shared.Input; +using Robust.Shared.IoC; using Robust.Shared.Maths; namespace Content.IntegrationTests.Tests.Slipping; @@ -14,6 +17,7 @@ public sealed class SlippingTest : MovementTest { public sealed class SlipTestSystem : EntitySystem { + [Dependency] public readonly IConfigurationManager Config = default!; public HashSet Slipped = new(); public override void Initialize() { @@ -30,6 +34,7 @@ private void OnSlip(EntityUid uid, SlipperyComponent component, ref SlipEvent ar public async Task BananaSlipTest() { var sys = SEntMan.System(); + var sprintWalks = sys.Config.GetCVar(CCVars.GamePressToSprint); await SpawnTarget("TrashBananaPeel"); var modifier = Comp(Player).SprintSpeedModifier; @@ -42,7 +47,7 @@ public async Task BananaSlipTest() #pragma warning restore NUnit2045 // Walking over the banana slowly does not trigger a slip. - await SetKey(EngineKeyFunctions.Walk, BoundKeyState.Down); + await SetKey(EngineKeyFunctions.Walk, sprintWalks ? BoundKeyState.Up : BoundKeyState.Down); await Move(DirectionFlag.East, 1f); #pragma warning disable NUnit2045 Assert.That(Delta(), Is.LessThan(0.5f)); @@ -51,10 +56,9 @@ public async Task BananaSlipTest() AssertComp(false, Player); // Moving at normal speeds does trigger a slip. - await SetKey(EngineKeyFunctions.Walk, BoundKeyState.Up); + await SetKey(EngineKeyFunctions.Walk, sprintWalks ? BoundKeyState.Down : BoundKeyState.Up); await Move(DirectionFlag.West, 1f); Assert.That(sys.Slipped, Does.Contain(SEntMan.GetEntity(Player))); AssertComp(true, Player); } } - diff --git a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/DispelPowerSystem.cs b/Content.Server/Abilities/Psionics/Abilities/DispelPowerSystem.cs similarity index 100% rename from Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/DispelPowerSystem.cs rename to Content.Server/Abilities/Psionics/Abilities/DispelPowerSystem.cs diff --git a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/MetapsionicPowerSystem.cs b/Content.Server/Abilities/Psionics/Abilities/MetapsionicPowerSystem.cs similarity index 100% rename from Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/MetapsionicPowerSystem.cs rename to Content.Server/Abilities/Psionics/Abilities/MetapsionicPowerSystem.cs diff --git a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/MindSwapPowerSystem.cs b/Content.Server/Abilities/Psionics/Abilities/MindSwapPowerSystem.cs similarity index 100% rename from Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/MindSwapPowerSystem.cs rename to Content.Server/Abilities/Psionics/Abilities/MindSwapPowerSystem.cs diff --git a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/MindSwappedComponent.cs b/Content.Server/Abilities/Psionics/Abilities/MindSwappedComponent.cs similarity index 100% rename from Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/MindSwappedComponent.cs rename to Content.Server/Abilities/Psionics/Abilities/MindSwappedComponent.cs diff --git a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/NoosphericZapPowerSystem.cs b/Content.Server/Abilities/Psionics/Abilities/NoosphericZapPowerSystem.cs similarity index 100% rename from Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/NoosphericZapPowerSystem.cs rename to Content.Server/Abilities/Psionics/Abilities/NoosphericZapPowerSystem.cs diff --git a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PsionicInvisibilityPowerSystem.cs b/Content.Server/Abilities/Psionics/Abilities/PsionicInvisibilityPowerSystem.cs similarity index 100% rename from Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PsionicInvisibilityPowerSystem.cs rename to Content.Server/Abilities/Psionics/Abilities/PsionicInvisibilityPowerSystem.cs diff --git a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PsionicRegenerationPowerSystem.cs b/Content.Server/Abilities/Psionics/Abilities/PsionicRegenerationPowerSystem.cs similarity index 100% rename from Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PsionicRegenerationPowerSystem.cs rename to Content.Server/Abilities/Psionics/Abilities/PsionicRegenerationPowerSystem.cs diff --git a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PyrokinesisPowerSystem.cs b/Content.Server/Abilities/Psionics/Abilities/PyrokinesisPowerSystem.cs similarity index 100% rename from Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PyrokinesisPowerSystem.cs rename to Content.Server/Abilities/Psionics/Abilities/PyrokinesisPowerSystem.cs diff --git a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/TelegnosisPowerSystem.cs b/Content.Server/Abilities/Psionics/Abilities/TelegnosisPowerSystem.cs similarity index 100% rename from Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/TelegnosisPowerSystem.cs rename to Content.Server/Abilities/Psionics/Abilities/TelegnosisPowerSystem.cs diff --git a/Content.Server/Nyanotrasen/Abilities/Psionics/PsionicAbilitiesSystem.cs b/Content.Server/Abilities/Psionics/PsionicAbilitiesSystem.cs similarity index 74% rename from Content.Server/Nyanotrasen/Abilities/Psionics/PsionicAbilitiesSystem.cs rename to Content.Server/Abilities/Psionics/PsionicAbilitiesSystem.cs index ee16aaccfb6..e59696aa904 100644 --- a/Content.Server/Nyanotrasen/Abilities/Psionics/PsionicAbilitiesSystem.cs +++ b/Content.Server/Abilities/Psionics/PsionicAbilitiesSystem.cs @@ -6,13 +6,9 @@ using Content.Server.EUI; using Content.Server.Psionics; using Content.Server.Mind; -using Content.Shared.Mind; -using Content.Shared.Mind.Components; using Content.Shared.StatusEffect; using Robust.Shared.Random; using Robust.Shared.Prototypes; -using Robust.Server.GameObjects; -using Robust.Server.Player; using Robust.Shared.Player; namespace Content.Server.Abilities.Psionics @@ -22,13 +18,14 @@ public sealed class PsionicAbilitiesSystem : EntitySystem [Dependency] private readonly IComponentFactory _componentFactory = default!; [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly SharedActionsSystem _actionsSystem = default!; - [Dependency] private readonly IPlayerManager _playerManager = default!; [Dependency] private readonly EuiManager _euiManager = default!; [Dependency] private readonly StatusEffectsSystem _statusEffectsSystem = default!; [Dependency] private readonly GlimmerSystem _glimmerSystem = default!; [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly MindSystem _mindSystem = default!; + private ISawmill _sawmill = default!; + public override void Initialize() { base.Initialize(); @@ -46,17 +43,11 @@ private void OnPlayerAttached(EntityUid uid, PsionicAwaitingPlayerComponent comp public void AddPsionics(EntityUid uid, bool warn = true) { - if (Deleted(uid)) - return; - - if (HasComp(uid)) + if (Deleted(uid) + || HasComp(uid)) return; - //Don't know if this will work. New mind state vs old. - if (!TryComp(uid, out var mindContainer) || - !_mindSystem.TryGetMind(uid, out _, out var mind )) - //|| - //!_mindSystem.TryGetMind(uid, out var mind, mindContainer)) + if (!_mindSystem.TryGetMind(uid, out _, out var mind)) { EnsureComp(uid); return; @@ -65,7 +56,7 @@ public void AddPsionics(EntityUid uid, bool warn = true) if (!_mindSystem.TryGetSession(mind, out var client)) return; - if (warn && TryComp(uid, out var actor)) + if (warn && HasComp(uid)) _euiManager.OpenEui(new AcceptPsionicsEui(uid, this), client); else AddRandomPsionicPower(uid); @@ -73,10 +64,8 @@ public void AddPsionics(EntityUid uid, bool warn = true) public void AddPsionics(EntityUid uid, string powerComp) { - if (Deleted(uid)) - return; - - if (HasComp(uid)) + if (Deleted(uid) + || HasComp(uid)) return; AddComp(uid); @@ -93,7 +82,7 @@ public void AddRandomPsionicPower(EntityUid uid) if (!_prototypeManager.TryIndex("RandomPsionicPowerPool", out var pool)) { - Logger.Error("Can't index the random psionic power pool!"); + _sawmill.Error("Can't index the random psionic power pool!"); return; } @@ -108,15 +97,13 @@ public void AddRandomPsionicPower(EntityUid uid) public void RemovePsionics(EntityUid uid) { - if (!TryComp(uid, out var psionic)) - return; - - if (!psionic.Removable) + if (!TryComp(uid, out var psionic) + || !psionic.Removable) return; if (!_prototypeManager.TryIndex("RandomPsionicPowerPool", out var pool)) { - Logger.Error("Can't index the random psionic power pool!"); + _sawmill.Error("Can't index the random psionic power pool!"); return; } @@ -127,13 +114,10 @@ public void RemovePsionics(EntityUid uid) if (EntityManager.TryGetComponent(uid, comp.GetType(), out var psionicPower)) RemComp(uid, psionicPower); } - if (psionic.PsionicAbility != null){ - _actionsSystem.TryGetActionData( psionic.PsionicAbility, out var psiAbility ); - if (psiAbility != null){ - var owner = psiAbility.Owner; - _actionsSystem.RemoveAction(uid, psiAbility.Owner); - } - } + if (psionic.PsionicAbility != null + && _actionsSystem.TryGetActionData(psionic.PsionicAbility, out var psiAbility) + && psiAbility is not null) + _actionsSystem.RemoveAction(uid, psionic.PsionicAbility); _statusEffectsSystem.TryAddStatusEffect(uid, "Stutter", TimeSpan.FromMinutes(5), false, "StutteringAccent"); diff --git a/Content.Server/Administration/Managers/AdminManager.cs b/Content.Server/Administration/Managers/AdminManager.cs index 19c56282937..ec284fcadce 100644 --- a/Content.Server/Administration/Managers/AdminManager.cs +++ b/Content.Server/Administration/Managers/AdminManager.cs @@ -279,7 +279,13 @@ public void Initialize() _commandPermissions.LoadPermissionsFromStream(efs); } - if (_res.TryContentFileRead(new ResPath("/toolshedEngineCommandPerms.yml"), out var toolshedPerms)) + var toolshedPermsPath = new ResPath("/toolshedEngineCommandPerms.yml"); + if (_res.TryContentFileRead(toolshedPermsPath, out var toolshedPerms)) + { + _commandPermissions.LoadPermissionsFromStream(toolshedPerms); + } + // This may or may not be necessary. We read the same file again and load the same permissions into a different manager. + if (_res.TryContentFileRead(toolshedPermsPath, out toolshedPerms)) { _toolshedCommandPermissions.LoadPermissionsFromStream(toolshedPerms); } diff --git a/Content.Server/AlertLevel/AlertLevelSystem.cs b/Content.Server/AlertLevel/AlertLevelSystem.cs index d856fab9da7..b290d95a5c1 100644 --- a/Content.Server/AlertLevel/AlertLevelSystem.cs +++ b/Content.Server/AlertLevel/AlertLevelSystem.cs @@ -150,7 +150,7 @@ public void SetLevel(EntityUid station, string level, bool playSound, bool annou if (Loc.TryGetString(detail.Announcement, out var locAnnouncement)) announcement = locAnnouncement; - var alert = _announcer.GetAnnouncementId($"Alert{level}"); + var alert = $"alert{char.ToUpperInvariant(level[0]) + level[1..]}"; if (playSound) _announcer.SendAnnouncementAudio(alert, _stationSystem.GetInOwningStation(station)); if (announce) diff --git a/Content.Server/Arachne/ArachneSystem.cs b/Content.Server/Arachne/ArachneSystem.cs new file mode 100644 index 00000000000..9cdefb441be --- /dev/null +++ b/Content.Server/Arachne/ArachneSystem.cs @@ -0,0 +1,231 @@ +using Content.Shared.Arachne; +using Content.Shared.Actions; +using Content.Shared.IdentityManagement; +using Content.Shared.Verbs; +using Content.Shared.Buckle.Components; +using Content.Shared.DoAfter; +using Content.Shared.Stunnable; +using Content.Shared.Eye.Blinding.Systems; +using Content.Shared.Containers.ItemSlots; +using Content.Shared.Damage; +using Content.Shared.Inventory; +using Content.Shared.Administration.Logs; +using Content.Shared.Database; +using Content.Shared.Humanoid; +using Content.Shared.Nutrition.EntitySystems; +using Content.Server.Buckle.Systems; +using Content.Server.Popups; +using Content.Server.DoAfter; +using Content.Server.Body.Components; +using Content.Server.Vampiric; +using Content.Server.Speech.Components; +using Robust.Shared.Physics.Components; +using Robust.Shared.Containers; +using Robust.Shared.Map; +using Robust.Shared.Utility; +using Robust.Server.Console; + +namespace Content.Server.Arachne +{ + public sealed class ArachneSystem : EntitySystem + { + [Dependency] private readonly PopupSystem _popupSystem = default!; + [Dependency] private readonly DoAfterSystem _doAfter = default!; + [Dependency] private readonly BuckleSystem _buckleSystem = default!; + [Dependency] private readonly ItemSlotsSystem _itemSlots = default!; + [Dependency] private readonly BlindableSystem _blindableSystem = default!; + [Dependency] private readonly DamageableSystem _damageableSystem = default!; + + [Dependency] private readonly IServerConsoleHost _host = default!; + [Dependency] private readonly BloodSuckerSystem _bloodSuckerSystem = default!; + [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; + + private const string BodySlot = "body_slot"; + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent>(AddCocoonVerb); + + SubscribeLocalEvent(OnCocEntInserted); + SubscribeLocalEvent(OnCocEntRemoved); + SubscribeLocalEvent(OnDamageChanged); + SubscribeLocalEvent>(AddSuccVerb); + SubscribeLocalEvent(OnCocoonDoAfter); + } + + private void AddCocoonVerb(EntityUid uid, ArachneComponent component, GetVerbsEvent args) + { + if (!args.CanAccess || !args.CanInteract) + return; + + if (args.Target == uid) + return; + + if (!TryComp(args.Target, out var bloodstream)) + return; + + if (bloodstream.BloodReagent != component.WebBloodReagent) + return; + + InnateVerb verb = new() + { + Act = () => + { + StartCocooning(uid, component, args.Target); + }, + Text = Loc.GetString("cocoon"), + Priority = 2 + }; + args.Verbs.Add(verb); + } + + private void OnCocEntInserted(EntityUid uid, CocoonComponent component, EntInsertedIntoContainerMessage args) + { + _blindableSystem.UpdateIsBlind(args.Entity); + EnsureComp(args.Entity); + + if (TryComp(args.Entity, out var currentAccent)) + { + component.WasReplacementAccent = true; + component.OldAccent = currentAccent.Accent; + currentAccent.Accent = "mumble"; + } else + { + component.WasReplacementAccent = false; + var replacement = EnsureComp(args.Entity); + replacement.Accent = "mumble"; + } + } + + private void OnCocEntRemoved(EntityUid uid, CocoonComponent component, EntRemovedFromContainerMessage args) + { + if (component.WasReplacementAccent && TryComp(args.Entity, out var replacement)) + { + replacement.Accent = component.OldAccent; + } else + { + RemComp(args.Entity); + } + + RemComp(args.Entity); + _blindableSystem.UpdateIsBlind(args.Entity); + } + + private void OnDamageChanged(EntityUid uid, CocoonComponent component, DamageChangedEvent args) + { + if (!args.DamageIncreased) + return; + + if (args.DamageDelta == null) + return; + + var body = _itemSlots.GetItemOrNull(uid, BodySlot); + + if (body == null) + return; + + var damage = args.DamageDelta * component.DamagePassthrough; + _damageableSystem.TryChangeDamage(body, damage); + } + + private void AddSuccVerb(EntityUid uid, CocoonComponent component, GetVerbsEvent args) + { + if (!args.CanAccess || !args.CanInteract) + return; + + if (!TryComp(args.User, out var sucker)) + return; + + if (!sucker.WebRequired) + return; + + var victim = _itemSlots.GetItemOrNull(uid, BodySlot); + + if (victim == null) + return; + + if (!TryComp(victim, out var stream)) + return; + + AlternativeVerb verb = new() + { + Act = () => + { + _bloodSuckerSystem.StartSuccDoAfter(args.User, victim.Value, sucker, stream, false); // start doafter + }, + Text = Loc.GetString("action-name-suck-blood"), + Icon = new SpriteSpecifier.Texture(new ("/Textures/Nyanotrasen/Icons/verbiconfangs.png")), + Priority = 2 + }; + args.Verbs.Add(verb); + } + + private void OnEntRemoved(EntityUid uid, WebComponent web, EntRemovedFromContainerMessage args) + { + if (!TryComp(uid, out var strap)) + return; + + if (HasComp(args.Entity)) + _buckleSystem.StrapSetEnabled(uid, false, strap); + } + + private void StartCocooning(EntityUid uid, ArachneComponent component, EntityUid target) + { + _popupSystem.PopupEntity(Loc.GetString("cocoon-start-third-person", ("target", Identity.Entity(target, EntityManager)), ("spider", Identity.Entity(uid, EntityManager))), uid, + Shared.Popups.PopupType.MediumCaution); + + _popupSystem.PopupEntity(Loc.GetString("cocoon-start-second-person", ("target", Identity.Entity(target, EntityManager))), uid, uid, Shared.Popups.PopupType.Medium); + + var delay = component.CocoonDelay; + + if (HasComp(target)) + delay *= component.CocoonKnockdownMultiplier; + + // Is it good practice to use empty data just to disambiguate doafters + // Who knows, there's no docs! + var ev = new ArachneCocoonDoAfterEvent(); + + var args = new DoAfterArgs(EntityManager, uid, delay, ev, uid, target: target) + { + BreakOnUserMove = true, + BreakOnTargetMove = true, + }; + + _doAfter.TryStartDoAfter(args); + } + + private void OnCocoonDoAfter(EntityUid uid, ArachneComponent component, ArachneCocoonDoAfterEvent args) + { + if (args.Handled || args.Cancelled || args.Args.Target == null) + return; + + var spawnProto = HasComp(args.Args.Target) ? "CocoonedHumanoid" : "CocoonSmall"; + Transform(args.Args.Target.Value).AttachToGridOrMap(); + var cocoon = Spawn(spawnProto, Transform(args.Args.Target.Value).Coordinates); + + if (!TryComp(cocoon, out var slots)) + return; + + // todo: our species should use scale visuals probably... + // TODO: We need a client-accessible notion of scale influence here. + /* if (spawnProto == "CocoonedHumanoid" && TryComp(args.Args.Target.Value, out var sprite)) */ + /* { */ + /* // why the fuck is this only available as a console command. */ + /* _host.ExecuteCommand(null, "scale " + cocoon + " " + sprite.Scale.Y); */ + if (TryComp(args.Args.Target.Value, out var physics)) + { + var scale = Math.Clamp(1 / (35 / physics.FixturesMass), 0.35, 2.5); + _host.ExecuteCommand(null, "scale " + cocoon + " " + scale); + } + _itemSlots.SetLock(cocoon, BodySlot, false, slots); + _itemSlots.TryInsert(cocoon, BodySlot, args.Args.Target.Value, args.Args.User); + _itemSlots.SetLock(cocoon, BodySlot, true, slots); + + var impact = (spawnProto == "CocoonedHumanoid") ? LogImpact.High : LogImpact.Medium; + + _adminLogger.Add(LogType.Action, impact, $"{ToPrettyString(args.Args.User):player} cocooned {ToPrettyString(args.Args.Target.Value):target}"); + args.Handled = true; + } + } +} diff --git a/Content.Server/Arachne/CocoonComponent.cs b/Content.Server/Arachne/CocoonComponent.cs new file mode 100644 index 00000000000..42ecf27971a --- /dev/null +++ b/Content.Server/Arachne/CocoonComponent.cs @@ -0,0 +1,13 @@ +namespace Content.Server.Arachne +{ + [RegisterComponent] + public sealed partial class CocoonComponent : Component + { + public bool WasReplacementAccent = false; + + public string OldAccent = ""; + + [DataField("damagePassthrough")] + public float DamagePassthrough = 0.5f; + } +} diff --git a/Content.Server/Atmos/EntitySystems/BarotraumaSystem.cs b/Content.Server/Atmos/EntitySystems/BarotraumaSystem.cs index fc77a1c8d94..948373940e4 100644 --- a/Content.Server/Atmos/EntitySystems/BarotraumaSystem.cs +++ b/Content.Server/Atmos/EntitySystems/BarotraumaSystem.cs @@ -153,9 +153,6 @@ public float GetFeltLowPressure(EntityUid uid, BarotraumaComponent barotrauma, f return Math.Min(modified, Atmospherics.OneAtmosphere); } - /// - /// Returns adjusted pressure after having applied resistances from equipment and innate (if any), to check against a high pressure hazard threshold - /// public float GetFeltHighPressure(EntityUid uid, BarotraumaComponent barotrauma, float environmentPressure) { if (barotrauma.HasImmunity) @@ -226,69 +223,58 @@ public override void Update(float frameTime) pressure = MathF.Max(mixture.Pressure, 1f); } - switch (pressure) + pressure = pressure switch { - // Low pressure. - case <= Atmospherics.WarningLowPressure: - pressure = GetFeltLowPressure(uid, barotrauma, pressure); - - if (pressure > Atmospherics.WarningLowPressure) - goto default; - - // Deal damage and ignore resistances. Resistance to pressure damage should be done via pressure protection gear. - _damageableSystem.TryChangeDamage(uid, barotrauma.Damage * Atmospherics.LowPressureDamage, true, false); + // Adjust pressure based on equipment. Works differently depending on if it's "high" or "low". + <= Atmospherics.WarningLowPressure => GetFeltLowPressure(uid, barotrauma, pressure), + >= Atmospherics.WarningHighPressure => GetFeltHighPressure(uid, barotrauma, pressure), + _ => pressure + }; + if (pressure <= Atmospherics.HazardLowPressure) + { + // Deal damage and ignore resistances. Resistance to pressure damage should be done via pressure protection gear. + _damageableSystem.TryChangeDamage(uid, barotrauma.Damage * Atmospherics.LowPressureDamage, true, false); + if (!barotrauma.TakingDamage) + { + barotrauma.TakingDamage = true; + _adminLogger.Add(LogType.Barotrauma, $"{ToPrettyString(uid):entity} started taking low pressure damage"); + } - if (!barotrauma.TakingDamage) - { - barotrauma.TakingDamage = true; - _adminLogger.Add(LogType.Barotrauma, $"{ToPrettyString(uid):entity} started taking low pressure damage"); - } + _alertsSystem.ShowAlert(uid, AlertType.LowPressure, 2); + } + else if (pressure >= Atmospherics.HazardHighPressure) + { + var damageScale = MathF.Min(((pressure / Atmospherics.HazardHighPressure) - 1) * Atmospherics.PressureDamageCoefficient, Atmospherics.MaxHighPressureDamage); - if (pressure <= Atmospherics.HazardLowPressure) - { - _alertsSystem.ShowAlert(uid, AlertType.LowPressure, 2); + _damageableSystem.TryChangeDamage(uid, barotrauma.Damage * damageScale, true, false); + if (!barotrauma.TakingDamage) + { + barotrauma.TakingDamage = true; + _adminLogger.Add(LogType.Barotrauma, $"{ToPrettyString(uid):entity} started taking high pressure damage"); + } + _alertsSystem.ShowAlert(uid, AlertType.HighPressure, 2); + } + else + { + // Within safe pressure limits + if (barotrauma.TakingDamage) + { + barotrauma.TakingDamage = false; + _adminLogger.Add(LogType.Barotrauma, $"{ToPrettyString(uid):entity} stopped taking pressure damage"); + } + // Set correct alert. + switch (pressure) + { + case <= Atmospherics.WarningLowPressure: + _alertsSystem.ShowAlert(uid, AlertType.LowPressure, 1); break; - } - - _alertsSystem.ShowAlert(uid, AlertType.LowPressure, 1); - break; - - // High pressure. - case >= Atmospherics.WarningHighPressure: - pressure = GetFeltHighPressure(uid, barotrauma, pressure); - - if (pressure < Atmospherics.WarningHighPressure) - goto default; - - var damageScale = MathF.Min((pressure / Atmospherics.HazardHighPressure) * Atmospherics.PressureDamageCoefficient, Atmospherics.MaxHighPressureDamage); - - // Deal damage and ignore resistances. Resistance to pressure damage should be done via pressure protection gear. - _damageableSystem.TryChangeDamage(uid, barotrauma.Damage * damageScale, true, false); - - if (!barotrauma.TakingDamage) - { - barotrauma.TakingDamage = true; - _adminLogger.Add(LogType.Barotrauma, $"{ToPrettyString(uid):entity} started taking high pressure damage"); - } - - if (pressure >= Atmospherics.HazardHighPressure) - { - _alertsSystem.ShowAlert(uid, AlertType.HighPressure, 2); + case >= Atmospherics.WarningHighPressure: + _alertsSystem.ShowAlert(uid, AlertType.HighPressure, 1); break; - } - - _alertsSystem.ShowAlert(uid, AlertType.HighPressure, 1); - break; - - // Normal pressure. - default: - if (barotrauma.TakingDamage) - { - barotrauma.TakingDamage = false; - _adminLogger.Add(LogType.Barotrauma, $"{ToPrettyString(uid):entity} stopped taking pressure damage"); - } - _alertsSystem.ClearAlertCategory(uid, AlertCategory.Pressure); - break; + default: + _alertsSystem.ClearAlertCategory(uid, AlertCategory.Pressure); + break; + } } } } diff --git a/Content.Server/Atmos/Piping/Unary/EntitySystems/GasCanisterSystem.cs b/Content.Server/Atmos/Piping/Unary/EntitySystems/GasCanisterSystem.cs index 3e4340bf1db..d53e29c9499 100644 --- a/Content.Server/Atmos/Piping/Unary/EntitySystems/GasCanisterSystem.cs +++ b/Content.Server/Atmos/Piping/Unary/EntitySystems/GasCanisterSystem.cs @@ -15,6 +15,7 @@ using Content.Shared.Database; using Content.Shared.Interaction; using Content.Shared.Lock; +using Content.Server.Silicons.Borgs.Components; using Robust.Server.GameObjects; using Robust.Shared.Audio.Systems; using Robust.Shared.Containers; @@ -91,6 +92,10 @@ private void DirtyUI(EntityUid uid, if (canister.GasTankSlot.Item != null) { var tank = canister.GasTankSlot.Item.Value; + if (TryComp(tank, out var jetpack) && jetpack.JetpackUid.HasValue) + { + tank = jetpack.JetpackUid.Value; + } var tankComponent = Comp(tank); tankLabel = Name(tank); tankPressure = tankComponent.Air.Pressure; @@ -163,7 +168,12 @@ private void OnCanisterUpdated(EntityUid uid, GasCanisterComponent canister, ref { if (canister.GasTankSlot.Item != null) { - var gasTank = Comp(canister.GasTankSlot.Item.Value); + var tank = canister.GasTankSlot.Item; + if (TryComp(tank, out var jetpack) && jetpack.JetpackUid.HasValue) + { + tank = jetpack.JetpackUid.Value; + } + var gasTank = Comp(tank.Value); _atmos.ReleaseGasTo(canister.Air, gasTank.Air, canister.ReleasePressure); } else @@ -233,7 +243,19 @@ private void OnCanisterInsertAttempt(EntityUid uid, GasCanisterComponent compone if (args.Slot.ID != component.ContainerName || args.User == null) return; - if (!TryComp(args.Item, out var gasTank) || gasTank.IsValveOpen) + var tank = args.Item; + + if (TryComp(tank, out var jetpack)) + { + if (!jetpack.JetpackUid.HasValue) + { + args.Cancelled = true; + return; + } + tank = jetpack.JetpackUid.Value; + } + + if (!TryComp(tank, out var gasTank) || gasTank.IsValveOpen) { args.Cancelled = true; return; diff --git a/Content.Server/Atmos/Piping/Unary/EntitySystems/GasThermoMachineSystem.cs b/Content.Server/Atmos/Piping/Unary/EntitySystems/GasThermoMachineSystem.cs index 9b61044f03e..720fd5b5b91 100644 --- a/Content.Server/Atmos/Piping/Unary/EntitySystems/GasThermoMachineSystem.cs +++ b/Content.Server/Atmos/Piping/Unary/EntitySystems/GasThermoMachineSystem.cs @@ -143,7 +143,7 @@ private bool IsHeater(GasThermoMachineComponent comp) private void OnToggleMessage(EntityUid uid, GasThermoMachineComponent thermoMachine, GasThermomachineToggleMessage args) { - var powerState = _power.TogglePower(uid); + var powerState = _power.TryTogglePower(uid); _adminLogger.Add(LogType.AtmosPowerChanged, $"{ToPrettyString(args.Session.AttachedEntity)} turned {(powerState ? "On" : "Off")} {ToPrettyString(uid)}"); DirtyUI(uid, thermoMachine); } diff --git a/Content.Server/Atmos/Portable/SpaceHeaterSystem.cs b/Content.Server/Atmos/Portable/SpaceHeaterSystem.cs index fff15f696c4..8094b0e1a66 100644 --- a/Content.Server/Atmos/Portable/SpaceHeaterSystem.cs +++ b/Content.Server/Atmos/Portable/SpaceHeaterSystem.cs @@ -98,7 +98,7 @@ private void OnToggle(EntityUid uid, SpaceHeaterComponent spaceHeater, SpaceHeat if (!Resolve(uid, ref powerReceiver)) return; - _power.TogglePower(uid); + _power.TryTogglePower(uid); UpdateAppearance(uid); DirtyUI(uid, spaceHeater); diff --git a/Content.Server/Atmos/Rotting/RottingSystem.cs b/Content.Server/Atmos/Rotting/RottingSystem.cs index 47bac84e0ca..5070b3f197f 100644 --- a/Content.Server/Atmos/Rotting/RottingSystem.cs +++ b/Content.Server/Atmos/Rotting/RottingSystem.cs @@ -1,15 +1,9 @@ -using Content.Shared.Damage; -using Content.Shared.Atmos; using Content.Server.Atmos.EntitySystems; using Content.Server.Body.Components; using Content.Server.Temperature.Components; +using Content.Shared.Atmos; using Content.Shared.Atmos.Rotting; -using Content.Shared.Examine; -using Content.Shared.IdentityManagement; -using Content.Shared.Mobs; -using Content.Shared.Mobs.Components; -using Content.Shared.Mobs.Systems; -using Content.Shared.Rejuvenate; +using Content.Shared.Damage; using Robust.Server.Containers; using Robust.Shared.Physics.Components; using Robust.Shared.Timing; @@ -22,83 +16,16 @@ public sealed class RottingSystem : SharedRottingSystem [Dependency] private readonly AtmosphereSystem _atmosphere = default!; [Dependency] private readonly ContainerSystem _container = default!; [Dependency] private readonly DamageableSystem _damageable = default!; - [Dependency] private readonly MobStateSystem _mobState = default!; public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnPerishableMapInit); - SubscribeLocalEvent(OnMobStateChanged); - SubscribeLocalEvent(OnPerishableExamined); - - SubscribeLocalEvent(OnShutdown); - SubscribeLocalEvent(OnRottingMobStateChanged); SubscribeLocalEvent(OnGibbed); - SubscribeLocalEvent(OnRejuvenate); SubscribeLocalEvent(OnTempIsRotting); } - private void OnPerishableMapInit(EntityUid uid, PerishableComponent component, MapInitEvent args) - { - component.RotNextUpdate = _timing.CurTime + component.PerishUpdateRate; - } - - private void OnMobStateChanged(EntityUid uid, PerishableComponent component, MobStateChangedEvent args) - { - if (args.NewMobState != MobState.Dead && args.OldMobState != MobState.Dead) - return; - - if (HasComp(uid)) - return; - - component.RotAccumulator = TimeSpan.Zero; - component.RotNextUpdate = _timing.CurTime + component.PerishUpdateRate; - } - - private void OnShutdown(EntityUid uid, RottingComponent component, ComponentShutdown args) - { - if (TryComp(uid, out var perishable)) - { - perishable.RotNextUpdate = TimeSpan.Zero; - } - } - - private void OnRottingMobStateChanged(EntityUid uid, RottingComponent component, MobStateChangedEvent args) - { - if (args.NewMobState == MobState.Dead) - return; - RemCompDeferred(uid, component); - } - - public bool IsRotProgressing(EntityUid uid, PerishableComponent? perishable) - { - // things don't perish by default. - if (!Resolve(uid, ref perishable, false)) - return false; - - // only dead things or inanimate objects can rot - if (TryComp(uid, out var mobState) && !_mobState.IsDead(uid, mobState)) - return false; - - if (_container.TryGetOuterContainer(uid, Transform(uid), out var container) && - HasComp(container.Owner)) - { - return false; - } - - var ev = new IsRottingEvent(); - RaiseLocalEvent(uid, ref ev); - - return !ev.Handled; - } - - public bool IsRotten(EntityUid uid, RottingComponent? rotting = null) - { - return Resolve(uid, ref rotting, false); - } - private void OnGibbed(EntityUid uid, RottingComponent component, BeingGibbedEvent args) { if (!TryComp(uid, out var physics)) @@ -112,36 +39,6 @@ private void OnGibbed(EntityUid uid, RottingComponent component, BeingGibbedEven tileMix?.AdjustMoles(Gas.Ammonia, molsToDump); } - private void OnPerishableExamined(Entity perishable, ref ExaminedEvent args) - { - int stage = PerishStage(perishable, MaxStages); - if (stage < 1 || stage > MaxStages) - { - // We dont push an examined string if it hasen't started "perishing" or it's already rotting - return; - } - - var isMob = HasComp(perishable); - var description = "perishable-" + stage + (!isMob ? "-nonmob" : string.Empty); - args.PushMarkup(Loc.GetString(description, ("target", Identity.Entity(perishable, EntityManager)))); - } - - /// - /// Return an integer from 0 to maxStage representing how close to rotting an entity is. Used to - /// generate examine messages for items that are starting to rot. - /// - public int PerishStage(Entity perishable, int maxStages) - { - if (perishable.Comp.RotAfter.TotalSeconds == 0 || perishable.Comp.RotAccumulator.TotalSeconds == 0) - return 0; - return (int)(1 + maxStages * perishable.Comp.RotAccumulator.TotalSeconds / perishable.Comp.RotAfter.TotalSeconds); - } - - private void OnRejuvenate(EntityUid uid, RottingComponent component, RejuvenateEvent args) - { - RemCompDeferred(uid); - } - private void OnTempIsRotting(EntityUid uid, TemperatureComponent component, ref IsRottingEvent args) { if (args.Handled) diff --git a/Content.Server/Nyanotrasen/Audio/GlimmerSoundComponent.cs b/Content.Server/Audio/GlimmerSoundComponent.cs similarity index 100% rename from Content.Server/Nyanotrasen/Audio/GlimmerSoundComponent.cs rename to Content.Server/Audio/GlimmerSoundComponent.cs diff --git a/Content.Server/Body/Components/BloodstreamComponent.cs b/Content.Server/Body/Components/BloodstreamComponent.cs index 1d8aa9ffd3d..dd93da9598c 100644 --- a/Content.Server/Body/Components/BloodstreamComponent.cs +++ b/Content.Server/Body/Components/BloodstreamComponent.cs @@ -1,5 +1,6 @@ using Content.Server.Body.Systems; using Content.Server.Chemistry.EntitySystems; +using Content.Server.Traits.Assorted; using Content.Shared.Chemistry.Components; using Content.Shared.Chemistry.Reagent; using Content.Shared.Damage; @@ -11,7 +12,7 @@ namespace Content.Server.Body.Components { - [RegisterComponent, Access(typeof(BloodstreamSystem), typeof(ReactionMixerSystem))] + [RegisterComponent, Access(typeof(BloodstreamSystem), typeof(ReactionMixerSystem), typeof(BloodDeficiencySystem), typeof(HemophiliaSystem))] public sealed partial class BloodstreamComponent : Component { public static string DefaultChemicalsSolutionName = "chemicals"; @@ -171,5 +172,18 @@ public sealed partial class BloodstreamComponent : Component /// [ViewVariables(VVAccess.ReadWrite)] public TimeSpan StatusTime; + + /// + /// If this is true, the entity will not passively regenerate blood, + /// and instead will slowly lose blood. + /// + [DataField] + public bool HasBloodDeficiency = false; + + /// + /// How much reagent of blood should be removed with blood deficiency in each update interval? + /// + [DataField] + public FixedPoint2 BloodDeficiencyLossAmount; } } diff --git a/Content.Server/Body/Systems/BloodstreamSystem.cs b/Content.Server/Body/Systems/BloodstreamSystem.cs index 9e29fdf7568..b37ac5efeb4 100644 --- a/Content.Server/Body/Systems/BloodstreamSystem.cs +++ b/Content.Server/Body/Systems/BloodstreamSystem.cs @@ -118,8 +118,14 @@ public override void Update(float frameTime) if (!_solutionContainerSystem.ResolveSolution(uid, bloodstream.BloodSolutionName, ref bloodstream.BloodSolution, out var bloodSolution)) continue; - // Adds blood to their blood level if it is below the maximum; Blood regeneration. Must be alive. - if (bloodSolution.Volume < bloodSolution.MaxVolume && !_mobStateSystem.IsDead(uid)) + // Removes blood for Blood Deficiency constantly. + if (bloodstream.HasBloodDeficiency) + { + if (!_mobStateSystem.IsDead(uid)) + RemoveBlood(uid, bloodstream.BloodDeficiencyLossAmount, bloodstream); + } + // Adds blood to their blood level if it is below the maximum. + else if (bloodSolution.Volume < bloodSolution.MaxVolume && !_mobStateSystem.IsDead(uid)) { TryModifyBloodLevel(uid, bloodstream.BloodRefreshAmount, bloodstream); } @@ -242,20 +248,29 @@ private void OnHealthBeingExamined(Entity ent, ref HealthB if (ent.Comp.BleedAmount > ent.Comp.MaxBleedAmount / 2) { args.Message.PushNewline(); - args.Message.AddMarkup(Loc.GetString("bloodstream-component-profusely-bleeding", ("target", ent.Owner))); + if (!args.IsSelfAware) + args.Message.AddMarkup(Loc.GetString("bloodstream-component-profusely-bleeding", ("target", ent.Owner))); + else + args.Message.AddMarkup(Loc.GetString("bloodstream-component-selfaware-profusely-bleeding")); } // Shows bleeding message when bleeding, but less than profusely. else if (ent.Comp.BleedAmount > 0) { args.Message.PushNewline(); - args.Message.AddMarkup(Loc.GetString("bloodstream-component-bleeding", ("target", ent.Owner))); + if (!args.IsSelfAware) + args.Message.AddMarkup(Loc.GetString("bloodstream-component-bleeding", ("target", ent.Owner))); + else + args.Message.AddMarkup(Loc.GetString("bloodstream-component-selfaware-bleeding")); } // If the mob's blood level is below the damage threshhold, the pale message is added. if (GetBloodLevelPercentage(ent, ent) < ent.Comp.BloodlossThreshold) { args.Message.PushNewline(); - args.Message.AddMarkup(Loc.GetString("bloodstream-component-looks-pale", ("target", ent.Owner))); + if (!args.IsSelfAware) + args.Message.AddMarkup(Loc.GetString("bloodstream-component-looks-pale", ("target", ent.Owner))); + else + args.Message.AddMarkup(Loc.GetString("bloodstream-component-selfaware-looks-pale")); } } @@ -463,4 +478,16 @@ public void ChangeBloodReagent(EntityUid uid, string reagent, BloodstreamCompone if (currentVolume > 0) _solutionContainerSystem.TryAddReagent(component.BloodSolution.Value, component.BloodReagent, currentVolume, out _); } + + /// + /// Remove blood from an entity, without spilling it. + /// + private void RemoveBlood(EntityUid uid, FixedPoint2 amount, BloodstreamComponent? component = null) + { + if (!Resolve(uid, ref component, logMissing: false) + || !_solutionContainerSystem.ResolveSolution(uid, component.BloodSolutionName, ref component.BloodSolution, out var bloodSolution)) + return; + + bloodSolution.RemoveReagent(component.BloodReagent, amount); + } } diff --git a/Content.Server/Botany/Components/TeleportingTraitComponent.cs b/Content.Server/Botany/Components/TeleportingTraitComponent.cs new file mode 100644 index 00000000000..b5f79ac8c7e --- /dev/null +++ b/Content.Server/Botany/Components/TeleportingTraitComponent.cs @@ -0,0 +1,31 @@ +namespace Content.Server.Botany +{ + [RegisterComponent] + + public sealed partial class TeleportingTraitComponent : Component + { + /// + /// Teleportation radius of produce. + /// + [DataField] + public float ProduceTeleportRadius; + + /// + /// How much to divide the potency. + /// + [DataField] + public float PotencyDivide = 10f; + + /// + /// Potency of fruit. + /// + [DataField] + public float Potency; + + /// + /// Chance of deletion. + /// + [DataField] + public float DeletionChance = .5f; + } +} diff --git a/Content.Server/Botany/SeedPrototype.cs b/Content.Server/Botany/SeedPrototype.cs index 1a3c0473a48..2644da2a3b0 100644 --- a/Content.Server/Botany/SeedPrototype.cs +++ b/Content.Server/Botany/SeedPrototype.cs @@ -205,6 +205,11 @@ public partial class SeedData /// [DataField("ligneous")] public bool Ligneous; + /// + /// If true, teleports both fruit and player if slippable. + /// + [DataField] public bool Teleporting; + // No, I'm not removing these. // if you re-add these, make sure that they get cloned. //public PlantSpread Spread { get; set; } @@ -215,7 +220,6 @@ public partial class SeedData //public bool Hematophage { get; set; } //public bool Thorny { get; set; } //public bool Stinging { get; set; } - // public bool Teleporting { get; set; } // public PlantJuicy Juicy { get; set; } #endregion @@ -295,6 +299,7 @@ public SeedData Clone() Slip = Slip, Sentient = Sentient, Ligneous = Ligneous, + Teleporting = Teleporting, PlantRsi = PlantRsi, PlantIconState = PlantIconState, @@ -358,6 +363,7 @@ public SeedData SpeciesChange(SeedData other) Slip = Slip, Sentient = Sentient, Ligneous = Ligneous, + Teleporting = Teleporting, PlantRsi = other.PlantRsi, PlantIconState = other.PlantIconState, diff --git a/Content.Server/Botany/Systems/BotanySystem.Seed.cs b/Content.Server/Botany/Systems/BotanySystem.Seed.cs index f64fcb3c43d..82190d1c443 100644 --- a/Content.Server/Botany/Systems/BotanySystem.Seed.cs +++ b/Content.Server/Botany/Systems/BotanySystem.Seed.cs @@ -207,6 +207,11 @@ public IEnumerable GenerateProduct(SeedData proto, EntityCoordinates var collisionWake = EnsureComp(entity); _colWakeSystem.SetEnabled(entity, false, collisionWake); } + if (proto.Teleporting) + { + var teleporting = EnsureComp(entity); + TeleportingTraitSystem.SetPotencyRadius(proto.Potency, teleporting); + } } return products; diff --git a/Content.Server/Botany/Systems/MutationSystem.cs b/Content.Server/Botany/Systems/MutationSystem.cs index c7ce5d47efa..4780f8b3310 100644 --- a/Content.Server/Botany/Systems/MutationSystem.cs +++ b/Content.Server/Botany/Systems/MutationSystem.cs @@ -40,7 +40,7 @@ public void MutateSeed(ref SeedData seed, float severity) } // Add up everything in the bits column and put the number here. - const int totalbits = 275; + const int totalbits = 285; // Tolerances (55) MutateFloat(ref seed.NutrientConsumption , 0.05f, 1.2f, 5, totalbits, severity); @@ -66,11 +66,12 @@ public void MutateSeed(ref SeedData seed, float severity) // Kill the plant (30) MutateBool(ref seed.Viable , false, 30, totalbits, severity); - // Fun (90) + // Fun (100) MutateBool(ref seed.Seedless , true , 10, totalbits, severity); MutateBool(ref seed.Slip , true , 10, totalbits, severity); MutateBool(ref seed.Sentient , true , 10, totalbits, severity); MutateBool(ref seed.Ligneous , true , 10, totalbits, severity); + MutateBool(ref seed.Teleporting , true , 10, totalbits, severity); MutateBool(ref seed.Bioluminescent, true , 10, totalbits, severity); MutateBool(ref seed.TurnIntoKudzu , true , 10, totalbits, severity); MutateBool(ref seed.CanScream , true , 10, totalbits, severity); @@ -120,6 +121,7 @@ public SeedData Cross(SeedData a, SeedData b) CrossBool(ref result.Slip, a.Slip); CrossBool(ref result.Sentient, a.Sentient); CrossBool(ref result.Ligneous, a.Ligneous); + CrossBool(ref result.Teleporting, a.Teleporting); CrossBool(ref result.Bioluminescent, a.Bioluminescent); CrossBool(ref result.TurnIntoKudzu, a.TurnIntoKudzu); CrossBool(ref result.CanScream, a.CanScream); diff --git a/Content.Server/Botany/Systems/TeleportingTraitSystem.cs b/Content.Server/Botany/Systems/TeleportingTraitSystem.cs new file mode 100644 index 00000000000..7aa9a6a82ab --- /dev/null +++ b/Content.Server/Botany/Systems/TeleportingTraitSystem.cs @@ -0,0 +1,51 @@ +using Robust.Shared.Random; +using Content.Shared.Slippery; +using Content.Server.Fluids.EntitySystems; +using Content.Shared.Chemistry.Components; +using Content.Shared.Popups; + +namespace Content.Server.Botany.Systems; + +public sealed class TeleportingTraitSystem : EntitySystem +{ + [Dependency] private readonly SharedTransformSystem _xform = default!; + [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly SharedPopupSystem _popup = default!; + [Dependency] private readonly PuddleSystem _puddle = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(Teleport); + } + + // sets the potency and the radius + public static void SetPotencyRadius(float seedPotency, TeleportingTraitComponent comp) + { + comp.Potency = seedPotency; + comp.ProduceTeleportRadius = comp.Potency / comp.PotencyDivide; + } + + // teleports both the produce and the foolish fool who slipped on it to a random postion limited by the radius + private void Teleport(EntityUid uid, TeleportingTraitComponent comp, ref SlipEvent args) + { + var coordinates = Transform(uid).Coordinates; + _xform.SetCoordinates(uid, coordinates.Offset(_random.NextVector2(comp.ProduceTeleportRadius))); + _popup.PopupEntity(Loc.GetString("teleporting-trait-component-slipped"), args.Slipped, args.Slipped, PopupType.SmallCaution); + _xform.SetCoordinates(args.Slipped, coordinates.Offset(_random.NextVector2(comp.ProduceTeleportRadius))); + VanishProbablity(uid, comp); + } + + // chance of being deleted and then spawnin the goop + private void VanishProbablity(EntityUid uid, TeleportingTraitComponent comp) + { + if (!_random.Prob(comp.DeletionChance)) + return; + Solution vanishSolution = new(); + vanishSolution.AddReagent("Slime", comp.Potency / 2); + _puddle.TrySpillAt(uid, vanishSolution, out _); + QueueDel(uid); + } +} + diff --git a/Content.Server/Nyanotrasen/Carrying/BeingCarriedComponent.cs b/Content.Server/Carrying/BeingCarriedComponent.cs similarity index 100% rename from Content.Server/Nyanotrasen/Carrying/BeingCarriedComponent.cs rename to Content.Server/Carrying/BeingCarriedComponent.cs diff --git a/Content.Server/Nyanotrasen/Carrying/CarriableComponent.cs b/Content.Server/Carrying/CarriableComponent.cs similarity index 58% rename from Content.Server/Nyanotrasen/Carrying/CarriableComponent.cs rename to Content.Server/Carrying/CarriableComponent.cs index f4fd1fa6d56..eb12dbc904e 100644 --- a/Content.Server/Nyanotrasen/Carrying/CarriableComponent.cs +++ b/Content.Server/Carrying/CarriableComponent.cs @@ -9,9 +9,16 @@ public sealed partial class CarriableComponent : Component /// Number of free hands required /// to carry the entity /// - [DataField("freeHandsRequired")] + [DataField] public int FreeHandsRequired = 2; public CancellationTokenSource? CancelToken; + + /// + /// The base duration (In Seconds) of how long it should take to pick up this entity + /// before Contests are considered. + /// + [DataField] + public float PickupDuration = 3; } } diff --git a/Content.Server/Nyanotrasen/Carrying/CarryingComponent.cs b/Content.Server/Carrying/CarryingComponent.cs similarity index 100% rename from Content.Server/Nyanotrasen/Carrying/CarryingComponent.cs rename to Content.Server/Carrying/CarryingComponent.cs diff --git a/Content.Server/Nyanotrasen/Carrying/CarryingSystem.cs b/Content.Server/Carrying/CarryingSystem.cs similarity index 73% rename from Content.Server/Nyanotrasen/Carrying/CarryingSystem.cs rename to Content.Server/Carrying/CarryingSystem.cs index ff4c097080c..13338ea2b7b 100644 --- a/Content.Server/Nyanotrasen/Carrying/CarryingSystem.cs +++ b/Content.Server/Carrying/CarryingSystem.cs @@ -1,7 +1,6 @@ using System.Numerics; using System.Threading; using Content.Server.DoAfter; -using Content.Server.Body.Systems; using Content.Server.Resist; using Content.Server.Popups; using Content.Server.Inventory; @@ -14,8 +13,9 @@ using Content.Shared.Stunnable; using Content.Shared.Interaction.Events; using Content.Shared.Verbs; -using Content.Shared.Climbing.Events; // Added this. +using Content.Shared.Climbing.Events; using Content.Shared.Carrying; +using Content.Shared.Contests; using Content.Shared.Movement.Events; using Content.Shared.Movement.Systems; using Content.Shared.Standing; @@ -31,6 +31,7 @@ using Content.Shared.Storage; using Robust.Shared.Map.Components; using Robust.Shared.Physics.Components; +using Robust.Server.GameObjects; namespace Content.Server.Carrying { @@ -47,6 +48,8 @@ public sealed class CarryingSystem : EntitySystem [Dependency] private readonly PopupSystem _popupSystem = default!; [Dependency] private readonly MovementSpeedModifierSystem _movementSpeed = default!; [Dependency] private readonly PseudoItemSystem _pseudoItem = default!; + [Dependency] private readonly ContestsSystem _contests = default!; + [Dependency] private readonly TransformSystem _transform = default!; public override void Initialize() { @@ -70,22 +73,11 @@ public override void Initialize() private void AddCarryVerb(EntityUid uid, CarriableComponent component, GetVerbsEvent args) { - if (!args.CanInteract || !args.CanAccess) - return; - - if (!CanCarry(args.User, uid, component)) - return; - - if (HasComp(args.User)) // yeah not dealing with that - return; - - if (HasComp(args.User) || HasComp(args.Target)) - return; - - if (!_mobStateSystem.IsAlive(args.User)) - return; - - if (args.User == args.Target) + if (!args.CanInteract || !args.CanAccess || !_mobStateSystem.IsAlive(args.User) + || !CanCarry(args.User, uid, component) + || HasComp(args.User) + || HasComp(args.User) || HasComp(args.Target) + || args.User == args.Target) return; AlternativeVerb verb = new() @@ -105,13 +97,10 @@ private void AddInsertCarriedVerb(EntityUid uid, CarryingComponent component, Ge // If the person is carrying someone, and the carried person is a pseudo-item, and the target entity is a storage, // then add an action to insert the carried entity into the target var toInsert = args.Using; - if (toInsert is not { Valid: true } || !args.CanAccess || !TryComp(toInsert, out var pseudoItem)) - return; - - if (!TryComp(args.Target, out var storageComp)) - return; - - if (!_pseudoItem.CheckItemFits((toInsert.Value, pseudoItem), (args.Target, storageComp))) + if (toInsert is not { Valid: true } || !args.CanAccess + || !TryComp(toInsert, out var pseudoItem) + || !TryComp(args.Target, out var storageComp) + || !_pseudoItem.CheckItemFits((toInsert.Value, pseudoItem), (args.Target, storageComp))) return; InnateVerb verb = new() @@ -142,25 +131,22 @@ private void OnVirtualItemDeleted(EntityUid uid, CarryingComponent component, Vi /// Basically using virtual item passthrough to throw the carried person. A new age! /// Maybe other things besides throwing should use virt items like this... /// - private void OnThrow(EntityUid uid, CarryingComponent component, BeforeThrowEvent args) + private void OnThrow(EntityUid uid, CarryingComponent component, ref BeforeThrowEvent args) { - if (!TryComp(args.ItemUid, out var virtItem) || !HasComp(virtItem.BlockingEntity)) + if (!TryComp(args.ItemUid, out var virtItem) + || !HasComp(virtItem.BlockingEntity)) return; args.ItemUid = virtItem.BlockingEntity; - var multiplier = MassContest(uid, virtItem.BlockingEntity); - args.ThrowStrength = 5f * multiplier; + args.ThrowStrength *= _contests.MassContest(uid, virtItem.BlockingEntity, false, 2f) + * _contests.StaminaContest(uid, virtItem.BlockingEntity); } private void OnParentChanged(EntityUid uid, CarryingComponent component, ref EntParentChangedMessage args) { var xform = Transform(uid); - if (xform.MapID != args.OldMapId) - return; - - // Do not drop the carried entity if the new parent is a grid - if (xform.ParentUid == xform.GridUid) + if (xform.MapID != args.OldMapId || xform.ParentUid == xform.GridUid) return; DropCarried(uid, component.Carried); @@ -190,17 +176,14 @@ private void OnInteractionAttempt(EntityUid uid, BeingCarriedComponent component /// private void OnMoveInput(EntityUid uid, BeingCarriedComponent component, ref MoveInputEvent args) { - if (!TryComp(uid, out var escape)) - return; - - if (!args.HasDirectionalMovement) + if (!TryComp(uid, out var escape) + || !args.HasDirectionalMovement) return; + // Check if the victim is in any way incapacitated, and if not make an escape attempt. + // Escape time scales with the inverse of a mass contest. Being lighter makes escape harder. if (_actionBlockerSystem.CanInteract(uid, component.Carrier)) - { - // Note: the mass contest is inverted because weaker entities are supposed to take longer to escape - _escapeInventorySystem.AttemptEscape(uid, component.Carrier, escape, MassContest(component.Carrier, uid)); - } + _escapeInventorySystem.AttemptEscape(uid, component.Carrier, escape, _contests.MassContest(uid, component.Carrier, false, 2f)); } private void OnMoveAttempt(EntityUid uid, BeingCarriedComponent component, UpdateCanMoveEvent args) @@ -237,10 +220,8 @@ private void OnBuckleChange(EntityUid uid, BeingCarriedComponent component, ref private void OnDoAfter(EntityUid uid, CarriableComponent component, CarryDoAfterEvent args) { component.CancelToken = null; - if (args.Handled || args.Cancelled) - return; - - if (!CanCarry(args.Args.User, uid, component)) + if (args.Handled || args.Cancelled + || !CanCarry(args.Args.User, uid, component)) return; Carry(args.Args.User, uid); @@ -248,16 +229,18 @@ private void OnDoAfter(EntityUid uid, CarriableComponent component, CarryDoAfter } private void StartCarryDoAfter(EntityUid carrier, EntityUid carried, CarriableComponent component) { - TimeSpan length = GetPickupDuration(carrier, carried); - - if (length >= TimeSpan.FromSeconds(9)) + if (!TryComp(carrier, out var carrierPhysics) + || !TryComp(carried, out var carriedPhysics) + || carriedPhysics.Mass > carrierPhysics.Mass * 2f) { _popupSystem.PopupEntity(Loc.GetString("carry-too-heavy"), carried, carrier, Shared.Popups.PopupType.SmallCaution); return; } - if (!HasComp(carried)) - length *= 2f; + var length = TimeSpan.FromSeconds(component.PickupDuration + * _contests.MassContest(carriedPhysics, carrierPhysics, false, 4f) + * _contests.StaminaContest(carrier, carried) + * (_standingState.IsDown(carried) ? 0.5f : 1)); component.CancelToken = new CancellationTokenSource(); @@ -280,10 +263,10 @@ private void Carry(EntityUid carrier, EntityUid carried) if (TryComp(carried, out var pullable)) _pullingSystem.TryStopPull(carried, pullable); - Transform(carrier).AttachToGridOrMap(); - Transform(carried).AttachToGridOrMap(); - Transform(carried).Coordinates = Transform(carrier).Coordinates; - Transform(carried).AttachParent(Transform(carrier)); + _transform.AttachToGridOrMap(carrier); + _transform.AttachToGridOrMap(carried); + _transform.SetCoordinates(carried, Transform(carrier).Coordinates); + _transform.SetParent(carried, carrier); _virtualItemSystem.TrySpawnVirtualItemInHand(carried, carrier); _virtualItemSystem.TrySpawnVirtualItemInHand(carried, carrier); var carryingComp = EnsureComp(carrier); @@ -299,17 +282,13 @@ private void Carry(EntityUid carrier, EntityUid carried) public bool TryCarry(EntityUid carrier, EntityUid toCarry, CarriableComponent? carriedComp = null) { - if (!Resolve(toCarry, ref carriedComp, false)) - return false; - - if (!CanCarry(carrier, toCarry, carriedComp)) - return false; - - // The second one means that carrier is a pseudo-item and is inside a bag. - if (HasComp(carrier) || HasComp(carrier)) - return false; - - if (GetPickupDuration(carrier, toCarry) > TimeSpan.FromSeconds(9)) + if (!Resolve(toCarry, ref carriedComp, false) + || !CanCarry(carrier, toCarry, carriedComp) + || HasComp(carrier) + || HasComp(carrier) + || TryComp(carrier, out var carrierPhysics) + && TryComp(toCarry, out var toCarryPhysics) + && carrierPhysics.Mass < toCarryPhysics.Mass * 2f) return false; Carry(carrier, toCarry); @@ -319,79 +298,41 @@ public bool TryCarry(EntityUid carrier, EntityUid toCarry, CarriableComponent? c public void DropCarried(EntityUid carrier, EntityUid carried) { - RemComp(carrier); // get rid of this first so we don't recusrively fire that event + RemComp(carrier); // get rid of this first so we don't recursively fire that event RemComp(carrier); RemComp(carried); RemComp(carried); _actionBlockerSystem.UpdateCanMove(carried); _virtualItemSystem.DeleteInHandsMatching(carrier, carried); - Transform(carried).AttachToGridOrMap(); + _transform.AttachToGridOrMap(carried); _standingState.Stand(carried); _movementSpeed.RefreshMovementSpeedModifiers(carrier); } private void ApplyCarrySlowdown(EntityUid carrier, EntityUid carried) { - var massRatio = MassContest(carrier, carried); - - if (massRatio == 0) - massRatio = 1; + var massRatio = _contests.MassContest(carrier, carried, true); + var massRatioSq = MathF.Pow(massRatio, 2); + var modifier = 1 - 0.15f / massRatioSq; + modifier = Math.Max(0.1f, modifier); - var massRatioSq = Math.Pow(massRatio, 2); - var modifier = (1 - (0.15 / massRatioSq)); - modifier = Math.Max(0.1, modifier); var slowdownComp = EnsureComp(carrier); - _slowdown.SetModifier(carrier, (float) modifier, (float) modifier, slowdownComp); + _slowdown.SetModifier(carrier, modifier, modifier, slowdownComp); } public bool CanCarry(EntityUid carrier, EntityUid carried, CarriableComponent? carriedComp = null) { - if (!Resolve(carried, ref carriedComp, false)) - return false; - - if (carriedComp.CancelToken != null) - return false; - - if (!HasComp(Transform(carrier).ParentUid)) - return false; - - if (HasComp(carrier) || HasComp(carried)) - return false; - - // if (_respirator.IsReceivingCPR(carried)) - // return false; - - if (!TryComp(carrier, out var hands)) + if (!Resolve(carried, ref carriedComp, false) + || carriedComp.CancelToken != null + || !HasComp(Transform(carrier).ParentUid) + || HasComp(carrier) + || HasComp(carried) + || !TryComp(carrier, out var hands) + || hands.CountFreeHands() < carriedComp.FreeHandsRequired) return false; - - if (hands.CountFreeHands() < carriedComp.FreeHandsRequired) - return false; - return true; } - private float MassContest(EntityUid roller, EntityUid target, PhysicsComponent? rollerPhysics = null, PhysicsComponent? targetPhysics = null) - { - if (!Resolve(roller, ref rollerPhysics, false) || !Resolve(target, ref targetPhysics, false)) - return 1f; - - if (targetPhysics.FixturesMass == 0) - return 1f; - - return rollerPhysics.FixturesMass / targetPhysics.FixturesMass; - } - - private TimeSpan GetPickupDuration(EntityUid carrier, EntityUid carried) - { - var length = TimeSpan.FromSeconds(3); - - var mod = MassContest(carrier, carried); - if (mod != 0) - length /= mod; - - return length; - } - public override void Update(float frameTime) { var query = EntityQueryEnumerator(); diff --git a/Content.Server/Nyanotrasen/CartridgeLoader/GlimmerMonitorCartridgeComponent.cs b/Content.Server/CartridgeLoader/Cartridges/GlimmerMonitorCartridgeComponent.cs similarity index 100% rename from Content.Server/Nyanotrasen/CartridgeLoader/GlimmerMonitorCartridgeComponent.cs rename to Content.Server/CartridgeLoader/Cartridges/GlimmerMonitorCartridgeComponent.cs diff --git a/Content.Server/Nyanotrasen/CartridgeLoader/GlimmerMonitorCartridgeSystem.cs b/Content.Server/CartridgeLoader/Cartridges/GlimmerMonitorCartridgeSystem.cs similarity index 100% rename from Content.Server/Nyanotrasen/CartridgeLoader/GlimmerMonitorCartridgeSystem.cs rename to Content.Server/CartridgeLoader/Cartridges/GlimmerMonitorCartridgeSystem.cs diff --git a/Content.Server/Nyanotrasen/Chat/TSayCommand.cs b/Content.Server/Chat/Commands/TSayCommand.cs similarity index 100% rename from Content.Server/Nyanotrasen/Chat/TSayCommand.cs rename to Content.Server/Chat/Commands/TSayCommand.cs diff --git a/Content.Server/Chat/Systems/ChatSystem.cs b/Content.Server/Chat/Systems/ChatSystem.cs index 022520abeb0..b4641928e48 100644 --- a/Content.Server/Chat/Systems/ChatSystem.cs +++ b/Content.Server/Chat/Systems/ChatSystem.cs @@ -8,7 +8,7 @@ using Content.Server.Language; using Content.Server.Speech.Components; using Content.Server.Speech.EntitySystems; -using Content.Server.Nyanotrasen.Chat; +using Content.Server.Chat; using Content.Server.Station.Components; using Content.Server.Station.Systems; using Content.Shared.ActionBlocker; @@ -69,15 +69,14 @@ public sealed partial class ChatSystem : SharedChatSystem [Dependency] private readonly SharedInteractionSystem _interactionSystem = default!; [Dependency] private readonly ReplacementAccentSystem _wordreplacement = default!; [Dependency] private readonly LanguageSystem _language = default!; - - //Nyano - Summary: pulls in the nyano chat system for psionics. - [Dependency] private readonly NyanoChatSystem _nyanoChatSystem = default!; + [Dependency] private readonly TelepathicChatSystem _telepath = default!; public const int VoiceRange = 10; // how far voice goes in world units public const int WhisperClearRange = 2; // how far whisper goes while still being understandable, in world units public const int WhisperMuffledRange = 5; // how far whisper goes at all, in world units public const string DefaultAnnouncementSound = "/Audio/Announcements/announce.ogg"; public const float DefaultObfuscationFactor = 0.2f; // Percentage of symbols in a whispered message that can be seen even by "far" listeners + public readonly Color DefaultSpeakColor = Color.White; private bool _loocEnabled = true; private bool _deadLoocEnabled; @@ -276,7 +275,7 @@ public void TrySendInGameICMessage( break; //Nyano - Summary: case adds the telepathic chat sending ability. case InGameICChatType.Telepathic: - _nyanoChatSystem.SendTelepathicChat(source, message, range == ChatTransmitRange.HideChat); + _telepath.SendTelepathicChat(source, message, range == ChatTransmitRange.HideChat); break; } } @@ -525,28 +524,25 @@ private void SendEntityWhisper( { // Scenario 1: the listener can clearly understand the message result = perceivedMessage; - wrappedMessage = WrapWhisperMessage(source, "chat-manager-entity-whisper-wrap-message", name, perceivedMessage, language); + wrappedMessage = WrapWhisperMessage(source, "chat-manager-entity-whisper-wrap-message", name, result, language); } else if (_interactionSystem.InRangeUnobstructed(source, listener, WhisperMuffledRange, Shared.Physics.CollisionGroup.Opaque)) { - // Scenerio 2: if the listener is too far, they only hear fragments of the message + // Scenario 2: if the listener is too far, they only hear fragments of the message result = ObfuscateMessageReadability(perceivedMessage); - wrappedMessage = WrapWhisperMessage(source, "chat-manager-entity-whisper-wrap-message", nameIdentity, perceivedMessage, language); + wrappedMessage = WrapWhisperMessage(source, "chat-manager-entity-whisper-wrap-message", nameIdentity, result, language); } else { // Scenario 3: If listener is too far and has no line of sight, they can't identify the whisperer's identity result = ObfuscateMessageReadability(perceivedMessage); - wrappedMessage = WrapWhisperMessage(source, "chat-manager-entity-whisper-unknown-wrap-message", string.Empty, perceivedMessage, language); + wrappedMessage = WrapWhisperMessage(source, "chat-manager-entity-whisper-unknown-wrap-message", string.Empty, result, language); } _chatManager.ChatMessageToOne(ChatChannel.Whisper, result, wrappedMessage, source, false, session.Channel); } - var replayWrap = Loc.GetString("chat-manager-entity-whisper-wrap-message", - ("color", language.SpeechOverride.Color), - ("entityName", name), - ("message", FormattedMessage.EscapeText(message))); + var replayWrap = WrapWhisperMessage(source, "chat-manager-entity-whisper-wrap-message", name, FormattedMessage.EscapeText(message), language); _replay.RecordServerMessage(new ChatMessage(ChatChannel.Whisper, message, replayWrap, GetNetEntity(source), null, MessageRangeHideChatForReplay(range))); var ev = new EntitySpokeEvent(source, message, channel, true, language); @@ -881,9 +877,12 @@ public string WrapMessage(LocId wrapId, InGameICChatType chatType, EntityUid sou var verbId = language.SpeechOverride.SpeechVerbOverrides is { } verbsOverride ? _random.Pick(verbsOverride).ToString() : _random.Pick(speech.SpeechVerbStrings); + var color = DefaultSpeakColor; + if (language.SpeechOverride.Color is { } colorOverride) + color = Color.InterpolateBetween(color, colorOverride, colorOverride.A); return Loc.GetString(wrapId, - ("color", language.SpeechOverride.Color), + ("color", color), ("entityName", entityName), ("verb", Loc.GetString(verbId)), ("fontType", language.SpeechOverride.FontId ?? speech.FontId), diff --git a/Content.Server/Nyanotrasen/Chat/NyanoChatSystem.cs b/Content.Server/Chat/TelepathicChatSystem.cs similarity index 97% rename from Content.Server/Nyanotrasen/Chat/NyanoChatSystem.cs rename to Content.Server/Chat/TelepathicChatSystem.cs index 58ed1782741..8d44ead9d07 100644 --- a/Content.Server/Nyanotrasen/Chat/NyanoChatSystem.cs +++ b/Content.Server/Chat/TelepathicChatSystem.cs @@ -16,13 +16,13 @@ using System.Linq; using System.Text; -namespace Content.Server.Nyanotrasen.Chat +namespace Content.Server.Chat { /// - /// Extensions for nyano's chat stuff + /// Extensions for Telepathic chat stuff /// - public sealed class NyanoChatSystem : EntitySystem + public sealed class TelepathicChatSystem : EntitySystem { [Dependency] private readonly IAdminManager _adminManager = default!; [Dependency] private readonly IChatManager _chatManager = default!; diff --git a/Content.Server/Nyanotrasen/Chat/TelepathicRepeaterComponent.cs b/Content.Server/Chat/TelepathicRepeaterComponent.cs similarity index 83% rename from Content.Server/Nyanotrasen/Chat/TelepathicRepeaterComponent.cs rename to Content.Server/Chat/TelepathicRepeaterComponent.cs index fc199f4332a..2183fafd4d1 100644 --- a/Content.Server/Nyanotrasen/Chat/TelepathicRepeaterComponent.cs +++ b/Content.Server/Chat/TelepathicRepeaterComponent.cs @@ -1,4 +1,4 @@ -namespace Content.Server.Nyanotrasen.Chat +namespace Content.Server.Chat { /// /// Repeats whatever is happening in telepathic chat. diff --git a/Content.Server/Clothing/Systems/LoadoutSystem.cs b/Content.Server/Clothing/Systems/LoadoutSystem.cs index c22f7afb598..73d5ae387ab 100644 --- a/Content.Server/Clothing/Systems/LoadoutSystem.cs +++ b/Content.Server/Clothing/Systems/LoadoutSystem.cs @@ -3,6 +3,7 @@ using Content.Shared.CCVar; using Content.Shared.Inventory; using Content.Shared.Item; +using Content.Shared.Players; using Content.Shared.Storage; using Content.Shared.Storage.EntitySystems; using Robust.Shared.Configuration; @@ -31,7 +32,8 @@ private void OnPlayerSpawnComplete(PlayerSpawnCompleteEvent ev) return; // Spawn the loadout, get a list of items that failed to equip - var failedLoadouts = _loadout.ApplyCharacterLoadout(ev.Mob, ev.JobId, ev.Profile, _playTimeTracking.GetTrackerTimes(ev.Player)); + var failedLoadouts = _loadout.ApplyCharacterLoadout(ev.Mob, ev.JobId, ev.Profile, + _playTimeTracking.GetTrackerTimes(ev.Player), ev.Player.ContentData()?.Whitelisted ?? false); // Try to find back-mounted storage apparatus if (!_inventory.TryGetSlotEntity(ev.Mob, "back", out var item) || diff --git a/Content.Server/Construction/Components/WelderRefinableComponent.cs b/Content.Server/Construction/Components/WelderRefinableComponent.cs index 9d8958f7614..dc3074f1958 100644 --- a/Content.Server/Construction/Components/WelderRefinableComponent.cs +++ b/Content.Server/Construction/Components/WelderRefinableComponent.cs @@ -1,5 +1,6 @@ using Content.Shared.Tools; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; +using Content.Shared.Storage; +using Robust.Shared.Prototypes; namespace Content.Server.Construction.Components { @@ -10,13 +11,13 @@ namespace Content.Server.Construction.Components [RegisterComponent] public sealed partial class WelderRefinableComponent : Component { - [DataField("refineResult")] - public HashSet? RefineResult = new(); + [DataField] + public List RefineResult = new(); - [DataField("refineTime")] + [DataField] public float RefineTime = 2f; - [DataField("qualityNeeded", customTypeSerializer:typeof(PrototypeIdSerializer))] - public string QualityNeeded = "Welding"; + [DataField] + public ProtoId QualityNeeded = "Welding"; } } diff --git a/Content.Server/Construction/RefiningSystem.cs b/Content.Server/Construction/RefiningSystem.cs index b9d80c7170a..d4df8b0916b 100644 --- a/Content.Server/Construction/RefiningSystem.cs +++ b/Content.Server/Construction/RefiningSystem.cs @@ -1,11 +1,8 @@ using Content.Server.Construction.Components; using Content.Server.Stack; using Content.Shared.Construction; -using Content.Shared.DoAfter; using Content.Shared.Interaction; -using Content.Shared.Stacks; -using Content.Shared.Tools; -using Robust.Shared.Serialization; +using Content.Shared.Storage; using SharedToolSystem = Content.Shared.Tools.Systems.SharedToolSystem; namespace Content.Server.Construction @@ -13,7 +10,6 @@ namespace Content.Server.Construction public sealed class RefiningSystem : EntitySystem { [Dependency] private readonly SharedToolSystem _toolSystem = default!; - [Dependency] private readonly StackSystem _stackSystem = default!; public override void Initialize() { base.Initialize(); @@ -39,14 +35,9 @@ private void OnDoAfter(EntityUid uid, WelderRefinableComponent component, Welder EntityManager.DeleteEntity(uid); // spawn each result after refine - foreach (var result in component.RefineResult!) + foreach (var ent in EntitySpawnCollection.GetSpawns(component.RefineResult)) { - var droppedEnt = EntityManager.SpawnEntity(result, resultPosition); - - // TODO: If something has a stack... Just use a prototype with a single thing in the stack. - // This is not a good way to do it. - if (TryComp(droppedEnt, out var stack)) - _stackSystem.SetCount(droppedEnt, 1, stack); + Spawn(ent, resultPosition); } } } diff --git a/Content.Server/DeltaV/NPC/Roboisseur/RoboisseurSystem.cs b/Content.Server/DeltaV/NPC/Roboisseur/RoboisseurSystem.cs index b4e99e6199d..ee1c4582239 100644 --- a/Content.Server/DeltaV/NPC/Roboisseur/RoboisseurSystem.cs +++ b/Content.Server/DeltaV/NPC/Roboisseur/RoboisseurSystem.cs @@ -58,7 +58,7 @@ public override void Update(float frameTime) } else if (CheckTier(roboisseur.DesiredPrototype.ID, roboisseur) > 2) message = Loc.GetString(_random.Pick(roboisseur.DemandMessagesTier2), ("item", roboisseur.DesiredPrototype.Name)); - _chat.TrySendInGameICMessage(roboisseur.Owner, message, InGameICChatType.Speak, false); + _chat.TrySendInGameICMessage(roboisseur.Owner, message, InGameICChatType.Speak, true); } if (roboisseur.Accumulator >= roboisseur.ResetTime.TotalSeconds) @@ -100,7 +100,7 @@ private void OnInteractHand(EntityUid uid, RoboisseurComponent component, Intera if (CheckTier(component.DesiredPrototype.ID, component) > 1) message = Loc.GetString(_random.Pick(component.DemandMessagesTier2), ("item", component.DesiredPrototype.Name)); - _chat.TrySendInGameICMessage(component.Owner, message, InGameICChatType.Speak, false); + _chat.TrySendInGameICMessage(component.Owner, message, InGameICChatType.Speak, true); } private void OnInteractUsing(EntityUid uid, RoboisseurComponent component, InteractUsingEvent args) diff --git a/Content.Server/Disposal/Unit/EntitySystems/DisposalUnitSystem.cs b/Content.Server/Disposal/Unit/EntitySystems/DisposalUnitSystem.cs index f9403f33b9d..d6647bbf2eb 100644 --- a/Content.Server/Disposal/Unit/EntitySystems/DisposalUnitSystem.cs +++ b/Content.Server/Disposal/Unit/EntitySystems/DisposalUnitSystem.cs @@ -235,7 +235,7 @@ private void OnUiButtonPressed(EntityUid uid, SharedDisposalUnitComponent compon _adminLogger.Add(LogType.Action, LogImpact.Low, $"{ToPrettyString(player):player} hit flush button on {ToPrettyString(uid)}, it's now {(component.Engaged ? "on" : "off")}"); break; case SharedDisposalUnitComponent.UiButton.Power: - _power.TogglePower(uid, user: args.Session.AttachedEntity); + _power.TryTogglePower(uid, user: args.Session.AttachedEntity); break; default: throw new ArgumentOutOfRangeException($"{ToPrettyString(player):player} attempted to hit a nonexistant button on {ToPrettyString(uid)}"); diff --git a/Content.Server/Emp/EmpSystem.cs b/Content.Server/Emp/EmpSystem.cs index 7c1a6f9b5db..3a1d2d28196 100644 --- a/Content.Server/Emp/EmpSystem.cs +++ b/Content.Server/Emp/EmpSystem.cs @@ -1,7 +1,7 @@ using Content.Server.Explosion.EntitySystems; +using Content.Server.Power.Components; using Content.Server.Power.EntitySystems; using Content.Server.Radio; -using Content.Server.SurveillanceCamera; using Content.Shared.Emp; using Content.Shared.Examine; using Robust.Shared.Map; @@ -22,8 +22,6 @@ public override void Initialize() SubscribeLocalEvent(OnRadioSendAttempt); SubscribeLocalEvent(OnRadioReceiveAttempt); - SubscribeLocalEvent(OnApcToggleMainBreaker); - SubscribeLocalEvent(OnCameraSetActive); } /// @@ -75,7 +73,19 @@ public void DoEmpEffects(EntityUid uid, float energyConsumption, float duration) if (ev.Disabled) { var disabled = EnsureComp(uid); - disabled.DisabledUntil = Timing.CurTime + TimeSpan.FromSeconds(duration); + // couldnt use null-coalescing operator here sadge + if (disabled.DisabledUntil == TimeSpan.Zero) + { + disabled.DisabledUntil = Timing.CurTime; + } + disabled.DisabledUntil = disabled.DisabledUntil + TimeSpan.FromSeconds(duration); + + /// i tried my best to go through the Pow3r server code but i literally couldn't find in relation to PowerNetworkBatteryComponent that uses the event system + /// the code is otherwise too esoteric for my innocent eyes + if (TryComp(uid, out var powerNetBattery)) + { + powerNetBattery.CanCharge = false; + } } } @@ -91,6 +101,11 @@ public override void Update(float frameTime) RemComp(uid); var ev = new EmpDisabledRemoved(); RaiseLocalEvent(uid, ref ev); + + if (TryComp(uid, out var powerNetBattery)) + { + powerNetBattery.CanCharge = true; + } } } } @@ -115,16 +130,6 @@ private void OnRadioReceiveAttempt(EntityUid uid, EmpDisabledComponent component { args.Cancelled = true; } - - private void OnApcToggleMainBreaker(EntityUid uid, EmpDisabledComponent component, ref ApcToggleMainBreakerAttemptEvent args) - { - args.Cancelled = true; - } - - private void OnCameraSetActive(EntityUid uid, EmpDisabledComponent component, ref SurveillanceCameraSetActiveAttemptEvent args) - { - args.Cancelled = true; - } } /// diff --git a/Content.Server/Eye/Blinding/EyeProtection/EyeProtectionSystem.cs b/Content.Server/Eye/Blinding/EyeProtection/EyeProtectionSystem.cs index 2d54c03b51b..744483cfb82 100644 --- a/Content.Server/Eye/Blinding/EyeProtection/EyeProtectionSystem.cs +++ b/Content.Server/Eye/Blinding/EyeProtection/EyeProtectionSystem.cs @@ -11,7 +11,7 @@ public sealed class EyeProtectionSystem : EntitySystem { [Dependency] private readonly StatusEffectsSystem _statusEffectsSystem = default!; [Dependency] private readonly BlindableSystem _blindingSystem = default!; - + public override void Initialize() { base.Initialize(); diff --git a/Content.Server/Forensics/Components/FiberComponent.cs b/Content.Server/Forensics/Components/FiberComponent.cs index 2086c958702..4cbb1e7be7f 100644 --- a/Content.Server/Forensics/Components/FiberComponent.cs +++ b/Content.Server/Forensics/Components/FiberComponent.cs @@ -12,5 +12,8 @@ public sealed partial class FiberComponent : Component [DataField] public string? FiberColor; + + [DataField] + public string? Fiberprint; } } diff --git a/Content.Server/Forensics/Systems/ForensicsSystem.cs b/Content.Server/Forensics/Systems/ForensicsSystem.cs index a081429fd3a..1663c20fedb 100644 --- a/Content.Server/Forensics/Systems/ForensicsSystem.cs +++ b/Content.Server/Forensics/Systems/ForensicsSystem.cs @@ -23,6 +23,7 @@ public sealed class ForensicsSystem : EntitySystem public override void Initialize() { SubscribeLocalEvent(OnInteract); + SubscribeLocalEvent(OnFiberInit); SubscribeLocalEvent(OnFingerprintInit); SubscribeLocalEvent(OnDNAInit); @@ -39,6 +40,11 @@ private void OnInteract(EntityUid uid, FingerprintComponent component, ContactIn ApplyEvidence(uid, args.Other); } + private void OnFiberInit(EntityUid uid, FiberComponent component, MapInitEvent args) + { + component.Fiberprint = GenerateFingerprint(length: 7); + } + private void OnFingerprintInit(EntityUid uid, FingerprintComponent component, MapInitEvent args) { component.Fingerprint = GenerateFingerprint(); @@ -150,9 +156,9 @@ private void OnCleanForensicsDoAfter(EntityUid uid, ForensicsComponent component targetComp.Residues.Add(string.IsNullOrEmpty(residue.ResidueColor) ? Loc.GetString("forensic-residue", ("adjective", residue.ResidueAdjective)) : Loc.GetString("forensic-residue-colored", ("color", residue.ResidueColor), ("adjective", residue.ResidueAdjective))); } - public string GenerateFingerprint() + public string GenerateFingerprint(int length = 16) { - var fingerprint = new byte[16]; + var fingerprint = new byte[Math.Clamp(length, 0, 255)]; _random.NextBytes(fingerprint); return Convert.ToHexString(fingerprint); } @@ -179,7 +185,12 @@ private void ApplyEvidence(EntityUid user, EntityUid target) if (_inventory.TryGetSlotEntity(user, "gloves", out var gloves)) { if (TryComp(gloves, out var fiber) && !string.IsNullOrEmpty(fiber.FiberMaterial)) - component.Fibers.Add(string.IsNullOrEmpty(fiber.FiberColor) ? Loc.GetString("forensic-fibers", ("material", fiber.FiberMaterial)) : Loc.GetString("forensic-fibers-colored", ("color", fiber.FiberColor), ("material", fiber.FiberMaterial))); + { + var fiberLocale = string.IsNullOrEmpty(fiber.FiberColor) + ? Loc.GetString("forensic-fibers", ("material", fiber.FiberMaterial)) + : Loc.GetString("forensic-fibers-colored", ("color", fiber.FiberColor), ("material", fiber.FiberMaterial)); + component.Fibers.Add(fiberLocale + " ; " + fiber.Fiberprint); + } if (HasComp(gloves)) return; diff --git a/Content.Server/GameTicking/Rules/ZombieRuleSystem.cs b/Content.Server/GameTicking/Rules/ZombieRuleSystem.cs index e8dc37dc1eb..5714337d4db 100644 --- a/Content.Server/GameTicking/Rules/ZombieRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/ZombieRuleSystem.cs @@ -43,6 +43,7 @@ public sealed class ZombieRuleSystem : GameRuleSystem [Dependency] private readonly AntagSelectionSystem _antagSelection = default!; [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly AnnouncerSystem _announcer = default!; + [Dependency] private readonly GameTicker _gameTicker = default!; public override void Initialize() { @@ -89,7 +90,7 @@ private void OnRoundEndText(RoundEndTextAppendEvent ev) ("username", player.Value))); } - var healthy = GetHealthyHumans(); + var healthy = GetHealthyHumans(true); // Gets a bunch of the living players and displays them if they're under a threshold. // InitialInfected is used for the threshold because it scales with the player count well. if (healthy.Count <= 0 || healthy.Count > 2 * zombie.InitialInfectedNames.Count) @@ -185,7 +186,7 @@ private void OnZombifySelf(EntityUid uid, PendingZombieComponent component, Zomb /// Include healthy players that are not on the station grid /// Should dead zombies be included in the count /// - private float GetInfectedFraction(bool includeOffStation = true, bool includeDead = false) + private float GetInfectedFraction(bool includeOffStation = false, bool includeDead = true) { var players = GetHealthyHumans(includeOffStation); var zombieCount = 0; @@ -205,14 +206,14 @@ private float GetInfectedFraction(bool includeOffStation = true, bool includeDea /// Flying off via a shuttle disqualifies you. /// /// - private List GetHealthyHumans(bool includeOffStation = true) + private List GetHealthyHumans(bool includeOffStation = false) { var healthy = new List(); var stationGrids = new HashSet(); if (!includeOffStation) { - foreach (var station in _station.GetStationsSet()) + foreach (var station in _gameTicker.GetSpawnableStations()) { if (TryComp(station, out var data) && _station.GetLargestGrid(data) is { } grid) stationGrids.Add(grid); @@ -223,13 +224,11 @@ private List GetHealthyHumans(bool includeOffStation = true) var zombers = GetEntityQuery(); while (players.MoveNext(out var uid, out _, out _, out var mob, out var xform)) { - if (!_mobState.IsAlive(uid, mob)) - continue; - - if (zombers.HasComponent(uid)) - continue; - - if (!includeOffStation && !stationGrids.Contains(xform.GridUid ?? EntityUid.Invalid)) + if (!_mobState.IsAlive(uid, mob) + || HasComp(uid) //Do not include infected players in the "Healthy players" list. + || HasComp(uid) + || zombers.HasComponent(uid) + || !includeOffStation && !stationGrids.Contains(xform.GridUid ?? EntityUid.Invalid)) continue; healthy.Add(uid); diff --git a/Content.Server/Ghost/Roles/Components/GhostRoleComponent.cs b/Content.Server/Ghost/Roles/Components/GhostRoleComponent.cs index abb26a8c8bc..997961ae675 100644 --- a/Content.Server/Ghost/Roles/Components/GhostRoleComponent.cs +++ b/Content.Server/Ghost/Roles/Components/GhostRoleComponent.cs @@ -1,4 +1,5 @@ using Content.Server.Mind.Commands; +using Content.Shared.Customization.Systems; using Content.Shared.Roles; namespace Content.Server.Ghost.Roles.Components @@ -14,7 +15,7 @@ public sealed partial class GhostRoleComponent : Component [DataField("rules")] private string _roleRules = "ghost-role-component-default-rules"; [DataField("requirements")] - public HashSet? Requirements; + public List? Requirements; /// /// Whether the should run on the mob. diff --git a/Content.Server/Gravity/GravityGeneratorSystem.cs b/Content.Server/Gravity/GravityGeneratorSystem.cs index b0c4bb56ff3..ec5646457e2 100644 --- a/Content.Server/Gravity/GravityGeneratorSystem.cs +++ b/Content.Server/Gravity/GravityGeneratorSystem.cs @@ -1,6 +1,7 @@ using Content.Server.Administration.Logs; using Content.Server.Audio; using Content.Server.Power.Components; +using Content.Server.Emp; using Content.Shared.Database; using Content.Shared.Gravity; using Content.Shared.Interaction; @@ -28,6 +29,8 @@ public override void Initialize() SubscribeLocalEvent(OnInteractHand); SubscribeLocalEvent( OnSwitchGenerator); + + SubscribeLocalEvent(OnEmpPulse); } private void OnParentChanged(EntityUid uid, GravityGeneratorComponent component, ref EntParentChangedMessage args) @@ -289,5 +292,28 @@ private void OnSwitchGenerator( { SetSwitchedOn(uid, component, args.On, session:args.Session); } + + private void OnEmpPulse(EntityUid uid, GravityGeneratorComponent component, EmpPulseEvent args) + { + /// i really don't think that the gravity generator should use normalised 0-1 charge + /// as opposed to watts charge that every other battery uses + + ApcPowerReceiverComponent? powerReceiver = null; + if (!Resolve(uid, ref powerReceiver, false)) + return; + + var ent = (uid, component, powerReceiver); + + // convert from normalised energy to watts and subtract + float maxEnergy = component.ActivePowerUse / component.ChargeRate; + float currentEnergy = maxEnergy * component.Charge; + currentEnergy = Math.Max(0, currentEnergy - args.EnergyConsumption); + + // apply renormalised energy to charge variable + component.Charge = currentEnergy / maxEnergy; + + // update power state + UpdateState(ent); + } } } diff --git a/Content.Server/HealthExaminable/HealthExaminableComponent.cs b/Content.Server/HealthExaminable/HealthExaminableComponent.cs index 3f434a93cfe..04053aed70e 100644 --- a/Content.Server/HealthExaminable/HealthExaminableComponent.cs +++ b/Content.Server/HealthExaminable/HealthExaminableComponent.cs @@ -1,4 +1,4 @@ -using Content.Shared.Damage.Prototypes; +using Content.Shared.Damage.Prototypes; using Content.Shared.FixedPoint; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.Set; @@ -7,8 +7,12 @@ namespace Content.Server.HealthExaminable; [RegisterComponent, Access(typeof(HealthExaminableSystem))] public sealed partial class HealthExaminableComponent : Component { + // + // The thresholds for determining the examine text for certain amounts of damage. + // These are calculated as a percentage of the entity's critical threshold. + // public List Thresholds = new() - { FixedPoint2.New(10), FixedPoint2.New(25), FixedPoint2.New(50), FixedPoint2.New(75) }; + { FixedPoint2.New(0.10), FixedPoint2.New(0.25), FixedPoint2.New(0.50), FixedPoint2.New(0.75) }; [DataField("examinableTypes", required: true, customTypeSerializer:typeof(PrototypeIdHashSetSerializer))] public HashSet ExaminableTypes = default!; diff --git a/Content.Server/HealthExaminable/HealthExaminableSystem.cs b/Content.Server/HealthExaminable/HealthExaminableSystem.cs index ed69a1c096a..89291726fbe 100644 --- a/Content.Server/HealthExaminable/HealthExaminableSystem.cs +++ b/Content.Server/HealthExaminable/HealthExaminableSystem.cs @@ -1,15 +1,20 @@ -using Content.Shared.Damage; +using Content.Server.Traits.Assorted; +using Content.Shared.Damage; using Content.Shared.Examine; using Content.Shared.FixedPoint; using Content.Shared.IdentityManagement; +using Content.Shared.Mobs.Components; +using Content.Shared.Mobs.Systems; using Content.Shared.Verbs; using Robust.Shared.Utility; +using System.Linq; namespace Content.Server.HealthExaminable; public sealed class HealthExaminableSystem : EntitySystem { [Dependency] private readonly ExamineSystemShared _examineSystem = default!; + [Dependency] private readonly MobThresholdSystem _threshold = default!; public override void Initialize() { @@ -29,7 +34,13 @@ private void OnGetExamineVerbs(EntityUid uid, HealthExaminableComponent componen { Act = () => { - var markup = CreateMarkup(uid, component, damage); + FormattedMessage markup; + if (uid == args.User + && TryComp(uid, out var selfAware)) + markup = CreateMarkupSelfAware(uid, selfAware, component, damage); + else + markup = CreateMarkup(uid, component, damage); + _examineSystem.SendExamineTooltip(args.User, uid, markup, false, false); }, Text = Loc.GetString("health-examinable-verb-text"), @@ -47,6 +58,9 @@ private FormattedMessage CreateMarkup(EntityUid uid, HealthExaminableComponent c var msg = new FormattedMessage(); var first = true; + + var adjustedThresholds = GetAdjustedThresholds(uid, component.Thresholds); + foreach (var type in component.ExaminableTypes) { if (!damage.Damage.DamageDict.TryGetValue(type, out var dmg)) @@ -58,7 +72,7 @@ private FormattedMessage CreateMarkup(EntityUid uid, HealthExaminableComponent c FixedPoint2 closest = FixedPoint2.Zero; string chosenLocStr = string.Empty; - foreach (var threshold in component.Thresholds) + foreach (var threshold in adjustedThresholds) { var str = $"health-examinable-{component.LocPrefix}-{type}-{threshold}"; var tempLocStr = Loc.GetString($"health-examinable-{component.LocPrefix}-{type}-{threshold}", ("target", Identity.Entity(uid, EntityManager))); @@ -94,10 +108,100 @@ private FormattedMessage CreateMarkup(EntityUid uid, HealthExaminableComponent c } // Anything else want to add on to this? - RaiseLocalEvent(uid, new HealthBeingExaminedEvent(msg), true); + RaiseLocalEvent(uid, new HealthBeingExaminedEvent(msg, false), true); return msg; } + + private FormattedMessage CreateMarkupSelfAware(EntityUid target, SelfAwareComponent selfAware, HealthExaminableComponent component, DamageableComponent damage) + { + var msg = new FormattedMessage(); + + var first = true; + + foreach (var type in selfAware.AnalyzableTypes) + { + if (!damage.Damage.DamageDict.TryGetValue(type, out var typeDmgUnrounded)) + continue; + + var typeDmg = (int) Math.Round(typeDmgUnrounded.Float(), 0); + if (typeDmg <= 0) + continue; + + var damageString = Loc.GetString( + "health-examinable-selfaware-type-text", + ("damageType", Loc.GetString($"health-examinable-selfaware-type-{type}")), + ("amount", typeDmg) + ); + + if (!first) + msg.PushNewline(); + else + first = false; + msg.AddMarkup(damageString); + } + + var adjustedThresholds = GetAdjustedThresholds(target, selfAware.Thresholds); + + foreach (var group in selfAware.DetectableGroups) + { + if (!damage.DamagePerGroup.TryGetValue(group, out var groupDmg) + || groupDmg == FixedPoint2.Zero) + continue; + + FixedPoint2 closest = FixedPoint2.Zero; + + string chosenLocStr = string.Empty; + foreach (var threshold in adjustedThresholds) + { + var locName = $"health-examinable-selfaware-group-{group}-{threshold}"; + var locStr = Loc.GetString(locName); + + var locDoesNotExist = locStr == locName; + if (locDoesNotExist) + continue; + + if (groupDmg > threshold && threshold > closest) + { + chosenLocStr = locStr; + closest = threshold; + } + } + + if (closest == FixedPoint2.Zero) + continue; + + if (!first) + msg.PushNewline(); + else + first = false; + msg.AddMarkup(chosenLocStr); + } + + if (msg.IsEmpty) + msg.AddMarkup(Loc.GetString($"health-examinable-selfaware-none")); + + // Event listeners can know if the examination is Self-Aware. + RaiseLocalEvent(target, new HealthBeingExaminedEvent(msg, true), true); + + return msg; + } + + /// + /// Return thresholds as percentages of an entity's critical threshold. + /// + private List GetAdjustedThresholds(EntityUid uid, List thresholdPercentages) + { + FixedPoint2 critThreshold = 0; + if (TryComp(uid, out var threshold)) + critThreshold = _threshold.GetThresholdForState(uid, Shared.Mobs.MobState.Critical, threshold); + + // Fallback to 100 crit threshold if none found + if (critThreshold == 0) + critThreshold = 100; + + return thresholdPercentages.Select(percentage => critThreshold * percentage).ToList(); + } } /// @@ -108,9 +212,11 @@ private FormattedMessage CreateMarkup(EntityUid uid, HealthExaminableComponent c public sealed class HealthBeingExaminedEvent { public FormattedMessage Message; + public bool IsSelfAware; - public HealthBeingExaminedEvent(FormattedMessage message) + public HealthBeingExaminedEvent(FormattedMessage message, bool isSelfAware) { Message = message; + IsSelfAware = isSelfAware; } } diff --git a/Content.Server/Language/Commands/AdminLanguageCommand.cs b/Content.Server/Language/Commands/AdminLanguageCommand.cs new file mode 100644 index 00000000000..f02d9c7f401 --- /dev/null +++ b/Content.Server/Language/Commands/AdminLanguageCommand.cs @@ -0,0 +1,75 @@ +using Content.Server.Administration; +using Content.Shared.Administration; +using Content.Shared.Language; +using Content.Shared.Language.Components; +using Content.Shared.Language.Systems; +using Robust.Shared.Toolshed; +using Robust.Shared.Toolshed.Syntax; +using Robust.Shared.Toolshed.TypeParsers; + +namespace Content.Server.Language.Commands; + +[ToolshedCommand(Name = "language"), AdminCommand(AdminFlags.Admin)] +public sealed class AdminLanguageCommand : ToolshedCommand +{ + private LanguageSystem? _languagesField; + private LanguageSystem Languages => _languagesField ??= GetSys(); + + [CommandImplementation("add")] + public EntityUid AddLanguage( + [CommandInvocationContext] IInvocationContext ctx, + [PipedArgument] EntityUid input, + [CommandArgument] ValueRef> @ref, + [CommandArgument] bool canSpeak = true, + [CommandArgument] bool canUnderstand = true + ) + { + var language = @ref.Evaluate(ctx)!; + + if (language == SharedLanguageSystem.UniversalPrototype) + { + EnsureComp(input); + Languages.UpdateEntityLanguages(input); + } + else + { + EnsureComp(input); + Languages.AddLanguage(input, language, canSpeak, canUnderstand); + } + + return input; + } + + [CommandImplementation("rm")] + public EntityUid RemoveLanguage( + [CommandInvocationContext] IInvocationContext ctx, + [PipedArgument] EntityUid input, + [CommandArgument] ValueRef> @ref, + [CommandArgument] bool removeSpeak = true, + [CommandArgument] bool removeUnderstand = true + ) + { + var language = @ref.Evaluate(ctx)!; + if (language == SharedLanguageSystem.UniversalPrototype && HasComp(input)) + { + RemComp(input); + EnsureComp(input); + } + // We execute this branch even in case of universal so that it gets removed if it was added manually to the LanguageKnowledge + Languages.RemoveLanguage(input, language, removeSpeak, removeUnderstand); + + return input; + } + + [CommandImplementation("lsspoken")] + public IEnumerable ListSpoken([PipedArgument] EntityUid input) + { + return Languages.GetSpokenLanguages(input); + } + + [CommandImplementation("lsunderstood")] + public IEnumerable ListUnderstood([PipedArgument] EntityUid input) + { + return Languages.GetUnderstoodLanguages(input); + } +} diff --git a/Content.Server/Language/Commands/AdminTranslatorCommand.cs b/Content.Server/Language/Commands/AdminTranslatorCommand.cs new file mode 100644 index 00000000000..8a7984bc36b --- /dev/null +++ b/Content.Server/Language/Commands/AdminTranslatorCommand.cs @@ -0,0 +1,155 @@ +using System.Diagnostics.CodeAnalysis; +using Content.Server.Administration; +using Content.Shared.Administration; +using Content.Shared.Language; +using Content.Shared.Language.Components; +using Content.Shared.Language.Components.Translators; +using Content.Shared.Language.Systems; +using Robust.Server.Containers; +using Robust.Shared.Toolshed; +using Robust.Shared.Toolshed.Syntax; +using Robust.Shared.Toolshed.TypeParsers; + +namespace Content.Server.Language.Commands; + +[ToolshedCommand(Name = "translator"), AdminCommand(AdminFlags.Admin)] +public sealed class AdminTranslatorCommand : ToolshedCommand +{ + private LanguageSystem? _languagesField; + private ContainerSystem? _containersField; + + private ContainerSystem Containers => _containersField ??= GetSys(); + private LanguageSystem Languages => _languagesField ??= GetSys(); + + [CommandImplementation("addlang")] + public EntityUid AddLanguage( + [CommandInvocationContext] IInvocationContext ctx, + [PipedArgument] EntityUid input, + [CommandArgument] ValueRef> @ref, + [CommandArgument] bool addSpeak = true, + [CommandArgument] bool addUnderstand = true + ) + { + var language = @ref.Evaluate(ctx)!; + // noob trap - needs a universallanguagespeakercomponent + if (language == SharedLanguageSystem.UniversalPrototype) + throw new ArgumentException(Loc.GetString("command-language-error-this-will-not-work")); + + if (!TryGetTranslatorComp(input, out var translator)) + throw new ArgumentException(Loc.GetString("command-language-error-not-a-translator", ("entity", input))); + + if (addSpeak && !translator.SpokenLanguages.Contains(language)) + translator.SpokenLanguages.Add(language); + if (addUnderstand && !translator.UnderstoodLanguages.Contains(language)) + translator.UnderstoodLanguages.Add(language); + + UpdateTranslatorHolder(input); + + return input; + } + + [CommandImplementation("rmlang")] + public EntityUid RemoveLanguage( + [CommandInvocationContext] IInvocationContext ctx, + [PipedArgument] EntityUid input, + [CommandArgument] ValueRef> @ref, + [CommandArgument] bool removeSpeak = true, + [CommandArgument] bool removeUnderstand = true + ) + { + var language = @ref.Evaluate(ctx)!; + if (!TryGetTranslatorComp(input, out var translator)) + throw new ArgumentException(Loc.GetString("command-language-error-not-a-translator", ("entity", input))); + + if (removeSpeak) + translator.SpokenLanguages.Remove(language); + if (removeUnderstand) + translator.UnderstoodLanguages.Remove(language); + + UpdateTranslatorHolder(input); + + return input; + } + + [CommandImplementation("addrequired")] + public EntityUid AddRequiredLanguage( + [CommandInvocationContext] IInvocationContext ctx, + [PipedArgument] EntityUid input, + [CommandArgument] ValueRef> @ref) + { + var language = @ref.Evaluate(ctx)!; + if (!TryGetTranslatorComp(input, out var translator)) + throw new ArgumentException(Loc.GetString("command-language-error-not-a-translator", ("entity", input))); + + if (!translator.RequiredLanguages.Contains(language)) + { + translator.RequiredLanguages.Add(language); + UpdateTranslatorHolder(input); + } + + return input; + } + + [CommandImplementation("rmrequired")] + public EntityUid RemoveRequiredLanguage( + [CommandInvocationContext] IInvocationContext ctx, + [PipedArgument] EntityUid input, + [CommandArgument] ValueRef> @ref) + { + var language = @ref.Evaluate(ctx)!; + if (!TryGetTranslatorComp(input, out var translator)) + throw new ArgumentException(Loc.GetString("command-language-error-not-a-translator", ("entity", input))); + + if (translator.RequiredLanguages.Remove(language)) + UpdateTranslatorHolder(input); + + return input; + } + + [CommandImplementation("lsspoken")] + public IEnumerable ListSpoken([PipedArgument] EntityUid input) + { + if (!TryGetTranslatorComp(input, out var translator)) + return []; + return translator.SpokenLanguages; + } + + [CommandImplementation("lsunderstood")] + public IEnumerable ListUnderstood([PipedArgument] EntityUid input) + { + if (!TryGetTranslatorComp(input, out var translator)) + return []; + return translator.UnderstoodLanguages; + } + + [CommandImplementation("lsrequired")] + public IEnumerable ListRequired([PipedArgument] EntityUid input) + { + if (!TryGetTranslatorComp(input, out var translator)) + return []; + return translator.RequiredLanguages; + } + + private bool TryGetTranslatorComp(EntityUid uid, [NotNullWhen(true)] out BaseTranslatorComponent? translator) + { + if (TryComp(uid, out var handheld)) + translator = handheld; + else if (TryComp(uid, out var implant)) + translator = implant; + else if (TryComp(uid, out var intrinsic)) + translator = intrinsic; + else + translator = null; + + return translator != null; + } + + private void UpdateTranslatorHolder(EntityUid translator) + { + if (!Containers.TryGetContainingContainer(translator, out var cont) + || cont.Owner is not { Valid: true } holder) + return; + + Languages.UpdateEntityLanguages(holder); + } +} diff --git a/Content.Server/Language/TranslatorSystem.cs b/Content.Server/Language/TranslatorSystem.cs index adbfe2d681f..24f4cb17298 100644 --- a/Content.Server/Language/TranslatorSystem.cs +++ b/Content.Server/Language/TranslatorSystem.cs @@ -4,6 +4,7 @@ using Content.Shared.Interaction; using Content.Shared.Interaction.Events; using Content.Shared.Language; +using Content.Shared.Language.Components; using Content.Shared.Language.Systems; using Content.Shared.PowerCell; using Content.Shared.Language.Components.Translators; @@ -173,11 +174,13 @@ private void UpdateBoundIntrinsicComp(HandheldTranslatorComponent comp, HoldsTra { intrinsic.SpokenLanguages = [..comp.SpokenLanguages]; intrinsic.UnderstoodLanguages = [..comp.UnderstoodLanguages]; + intrinsic.RequiredLanguages = [..comp.RequiredLanguages]; } else { intrinsic.SpokenLanguages.Clear(); intrinsic.UnderstoodLanguages.Clear(); + intrinsic.RequiredLanguages.Clear(); } intrinsic.Enabled = isEnabled; diff --git a/Content.Server/Medical/PenLightSystem.cs b/Content.Server/Medical/PenLightSystem.cs new file mode 100644 index 00000000000..f48a84d0476 --- /dev/null +++ b/Content.Server/Medical/PenLightSystem.cs @@ -0,0 +1,118 @@ +using Content.Server.DoAfter; +using Content.Server.PowerCell; +using Content.Shared.Damage; +using Content.Shared.DoAfter; +using Content.Shared.Drugs; +using Content.Shared.Drunk; +using Content.Shared.Eye.Blinding.Components; +using Content.Shared.Interaction; +using Content.Shared.Medical; +using Content.Shared.Mobs.Systems; +using Content.Shared.Traits.Assorted.Components; +using Robust.Server.GameObjects; +using Robust.Shared.Player; +using Robust.Shared.Timing; + +namespace Content.Server.Medical; +/// +/// This stores the eye exam system for +/// +public sealed class PenLightSystem : EntitySystem +{ + [Dependency] private readonly IEntityManager _entityManager = default!; + [Dependency] private readonly DoAfterSystem _doAfter = default!; + [Dependency] private readonly PowerCellSystem _powerCell = default!; + [Dependency] private readonly UserInterfaceSystem _uiSystem = default!; + /// + public override void Initialize() + { + SubscribeLocalEvent(OnAfterInteract); + SubscribeLocalEvent(OnDoAfter); + } + + private void OnAfterInteract(EntityUid uid, PenLightComponent component, AfterInteractEvent args) + { + if (args.Handled + || args.Target is not { } target) + return; + + args.Handled = TryStartExam(uid, target, args.User, component); + } + + private void OnDoAfter(Entity uid, ref PenLightDoAfterEvent args) + { + if (args.Handled + || args.Cancelled + || args.Target == null + || !_powerCell.HasDrawCharge(uid, user: args.User)) + return; + + OpenUserInterface(args.User, uid); + Diagnose(uid, args.Target.Value); + args.Handled = true; + } + + + /// + /// Actually handles the exam interaction. + /// + public bool TryStartExam(EntityUid uid, EntityUid target, EntityUid user, PenLightComponent? component = null) + { + if (!Resolve(uid, ref component)) + return false; + + return _doAfter.TryStartDoAfter(new DoAfterArgs(EntityManager, user, component.ExamSpeed, new PenLightDoAfterEvent(), + uid, target, uid) + { + BlockDuplicate = true, + BreakOnUserMove = true, + BreakOnTargetMove = true, + BreakOnHandChange = true, + NeedHand = true + }); + } + private void OpenUserInterface(EntityUid user, EntityUid penlight) + { + if (!TryComp(user, out var actor) + || !_uiSystem.TryGetUi(penlight, PenLightUiKey.Key, out var ui)) + return; + + _uiSystem.OpenUi(ui, actor.PlayerSession); + } + + /// + /// Runs the checks for the different types of eye damage + /// + private void Diagnose(EntityUid penlight, EntityUid target) + { + if (!_uiSystem.TryGetUi(penlight, PenLightUiKey.Key, out var ui) + || !HasComp(target)) + return; + // Blind + var blind = _entityManager.HasComponent(target); + + // Drunk + var drunk = _entityManager.HasComponent(target); + + // EyeDamage + var eyeDamage = false; + if (TryComp(target, out var eyeDam)) + { + eyeDamage = eyeDam.EyeDamage > 0 && eyeDam.EyeDamage < 6; //6 means perma-blind + } + + // Hallucinating + var seeingRainbows = _entityManager.HasComponent(target); + + // Healthy + var healthy = !(blind || drunk || eyeDamage || seeingRainbows); + + _uiSystem.SendUiMessage(ui, new PenLightUserMessage(GetNetEntity(target), + blind, + drunk, + eyeDamage, + healthy, + seeingRainbows + )); + } +} diff --git a/Content.Server/Nutrition/EntitySystems/DrinkSystem.cs b/Content.Server/Nutrition/EntitySystems/DrinkSystem.cs index 47e7fa6802c..2249926baab 100644 --- a/Content.Server/Nutrition/EntitySystems/DrinkSystem.cs +++ b/Content.Server/Nutrition/EntitySystems/DrinkSystem.cs @@ -7,6 +7,7 @@ using Content.Server.Inventory; using Content.Server.Nutrition.Components; using Content.Server.Popups; +using Content.Server.Traits.Assorted.Components; using Content.Shared.Administration.Logs; using Content.Shared.Body.Components; using Content.Shared.CCVar; @@ -279,9 +280,13 @@ private bool TryDrink(EntityUid user, EntityUid target, DrinkComponent drink, En var flavors = _flavorProfile.GetLocalizedFlavorsMessage(user, drinkSolution); + var drinkDelay = drink.Delay; + if (TryComp(target, out var delayModifier)) + drinkDelay *= delayModifier.DrinkDelayMultiplier; + var doAfterEventArgs = new DoAfterArgs(EntityManager, user, - forceDrink ? drink.ForceFeedDelay : drink.Delay, + forceDrink ? drink.ForceFeedDelay : drinkDelay, new ConsumeDoAfterEvent(drink.Solution, flavors), eventTarget: item, target: target, diff --git a/Content.Server/Nutrition/EntitySystems/FoodSystem.cs b/Content.Server/Nutrition/EntitySystems/FoodSystem.cs index 06d1c4b42d3..84355f03c16 100644 --- a/Content.Server/Nutrition/EntitySystems/FoodSystem.cs +++ b/Content.Server/Nutrition/EntitySystems/FoodSystem.cs @@ -6,6 +6,7 @@ using Content.Shared.Nutrition.Components; using Content.Server.Popups; using Content.Server.Stack; +using Content.Server.Traits.Assorted.Components; using Content.Shared.Administration.Logs; using Content.Shared.Body.Components; using Content.Shared.Body.Organ; @@ -176,9 +177,13 @@ private void OnFeedFood(Entity entity, ref AfterInteractEvent arg _adminLogger.Add(LogType.Ingestion, LogImpact.Low, $"{ToPrettyString(target):target} is eating {ToPrettyString(food):food} {SolutionContainerSystem.ToPrettyString(foodSolution)}"); } + var foodDelay = foodComp.Delay; + if (TryComp(target, out var delayModifier)) + foodDelay *= delayModifier.FoodDelayMultiplier; + var doAfterArgs = new DoAfterArgs(EntityManager, user, - forceFeed ? foodComp.ForceFeedDelay : foodComp.Delay, + forceFeed ? foodComp.ForceFeedDelay : foodDelay, new ConsumeDoAfterEvent(foodComp.Solution, flavors), eventTarget: food, target: target, diff --git a/Content.Server/Nyanotrasen/Abilities/Boxer/BoxingSystem.cs b/Content.Server/Nyanotrasen/Abilities/Boxer/BoxingSystem.cs index 8bb68cb6f55..6f533c34199 100644 --- a/Content.Server/Nyanotrasen/Abilities/Boxer/BoxingSystem.cs +++ b/Content.Server/Nyanotrasen/Abilities/Boxer/BoxingSystem.cs @@ -14,7 +14,7 @@ public override void Initialize() base.Initialize(); SubscribeLocalEvent(OnInit); SubscribeLocalEvent(OnMeleeHit); - SubscribeLocalEvent(OnStamHit); + SubscribeLocalEvent(OnStamHit); } private void OnInit(EntityUid uid, BoxerComponent component, ComponentInit args) @@ -27,7 +27,7 @@ private void OnMeleeHit(EntityUid uid, BoxerComponent component, MeleeHitEvent a args.ModifiersList.Add(component.UnarmedModifiers); } - private void OnStamHit(EntityUid uid, BoxingGlovesComponent component, StaminaMeleeHitEvent args) + private void OnStamHit(EntityUid uid, BoxingGlovesComponent component, TakeStaminaDamageEvent args) { if (!_containerSystem.TryGetContainingContainer(uid, out var equipee)) return; diff --git a/Content.Server/Nyanotrasen/Abilities/Oni/OniSystem.cs b/Content.Server/Nyanotrasen/Abilities/Oni/OniSystem.cs index 6fdb27097e9..4fc078e85bc 100644 --- a/Content.Server/Nyanotrasen/Abilities/Oni/OniSystem.cs +++ b/Content.Server/Nyanotrasen/Abilities/Oni/OniSystem.cs @@ -21,7 +21,7 @@ public override void Initialize() SubscribeLocalEvent(OnEntRemoved); SubscribeLocalEvent(OnOniMeleeHit); SubscribeLocalEvent(OnHeldMeleeHit); - SubscribeLocalEvent(OnStamHit); + SubscribeLocalEvent(OnStamHit); } private void OnEntInserted(EntityUid uid, OniComponent component, EntInsertedIntoContainerMessage args) @@ -68,7 +68,7 @@ private void OnHeldMeleeHit(EntityUid uid, HeldByOniComponent component, MeleeHi args.ModifiersList.Add(oni.MeleeModifiers); } - private void OnStamHit(EntityUid uid, HeldByOniComponent component, StaminaMeleeHitEvent args) + private void OnStamHit(EntityUid uid, HeldByOniComponent component, TakeStaminaDamageEvent args) { if (!TryComp(component.Holder, out var oni)) return; diff --git a/Content.Server/Nyanotrasen/Research/Oracle/OracleComponent.cs b/Content.Server/Nyanotrasen/Research/Oracle/OracleComponent.cs deleted file mode 100644 index e238d5c7a18..00000000000 --- a/Content.Server/Nyanotrasen/Research/Oracle/OracleComponent.cs +++ /dev/null @@ -1,87 +0,0 @@ -using Content.Shared.Chemistry.Reagent; -using Robust.Shared.Prototypes; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List; - -namespace Content.Server.Research.Oracle; - -[RegisterComponent] -public sealed partial class OracleComponent : Component -{ - public const string SolutionName = "fountain"; - - [ViewVariables] - [DataField("accumulator")] - public float Accumulator; - - [ViewVariables] - [DataField("resetTime")] - public TimeSpan ResetTime = TimeSpan.FromMinutes(10); - - [DataField("barkAccumulator")] - public float BarkAccumulator; - - [DataField("barkTime")] - public TimeSpan BarkTime = TimeSpan.FromMinutes(1); - - [DataField("rejectAccumulator")] - public float RejectAccumulator; - - [DataField("rejectTime")] - public TimeSpan RejectTime = TimeSpan.FromSeconds(5); - - [ViewVariables(VVAccess.ReadWrite)] - public EntityPrototype DesiredPrototype = default!; - - [ViewVariables(VVAccess.ReadWrite)] - public EntityPrototype? LastDesiredPrototype = default!; - - [DataField("rewardReagents", customTypeSerializer: typeof(PrototypeIdListSerializer))] - public IReadOnlyList RewardReagents = new[] - { - "LotophagoiOil", "LotophagoiOil", "LotophagoiOil", "LotophagoiOil", "LotophagoiOil", "Wine", "Blood", "Ichor" - }; - - [DataField("demandMessages")] - public IReadOnlyList DemandMessages = new[] - { - "oracle-demand-1", - "oracle-demand-2", - "oracle-demand-3", - "oracle-demand-4", - "oracle-demand-5", - "oracle-demand-6", - "oracle-demand-7", - "oracle-demand-8", - "oracle-demand-9", - "oracle-demand-10", - "oracle-demand-11", - "oracle-demand-12" - }; - - [DataField("rejectMessages")] - public IReadOnlyList RejectMessages = new[] - { - "ἄγνοια", - "υλικό", - "ἀγνωσία", - "γήινος", - "σάκλας" - }; - - [DataField("blacklistedPrototypes")] - [ViewVariables(VVAccess.ReadOnly)] - public IReadOnlyList BlacklistedPrototypes = new[] - { - "Drone", - "QSI", - "HandTeleporter", - "BluespaceBeaker", - "ClothingBackpackHolding", - "ClothingBackpackSatchelHolding", - "ClothingBackpackDuffelHolding", - "TrashBagOfHolding", - "BluespaceCrystal", - "InsulativeHeadcage", - "CrystalNormality", - }; -} diff --git a/Content.Server/Nyanotrasen/Research/Oracle/OracleSystem.cs b/Content.Server/Nyanotrasen/Research/Oracle/OracleSystem.cs deleted file mode 100644 index 148598fe2c3..00000000000 --- a/Content.Server/Nyanotrasen/Research/Oracle/OracleSystem.cs +++ /dev/null @@ -1,258 +0,0 @@ -using System.Linq; -using Content.Server.Botany; -using Content.Server.Chat.Managers; -using Content.Server.Chat.Systems; -using Content.Server.Chemistry.Containers.EntitySystems; -using Content.Server.Fluids.EntitySystems; -using Content.Server.Psionics; -using Content.Shared.Abilities.Psionics; -using Content.Shared.Chat; -using Content.Shared.Chemistry.Components; -using Content.Shared.Chemistry.EntitySystems; -using Content.Shared.Chemistry.Reagent; -using Content.Shared.Interaction; -using Content.Shared.Mobs.Components; -using Content.Shared.Psionics.Glimmer; -using Content.Shared.Research.Prototypes; -using Robust.Server.GameObjects; -using Robust.Shared.Player; -using Robust.Shared.Prototypes; -using Robust.Shared.Random; - -namespace Content.Server.Research.Oracle; - -public sealed class OracleSystem : EntitySystem -{ - [Dependency] private readonly IPrototypeManager _prototypeManager = default!; - [Dependency] private readonly IRobustRandom _random = default!; - [Dependency] private readonly ChatSystem _chat = default!; - [Dependency] private readonly IChatManager _chatManager = default!; - [Dependency] private readonly SolutionContainerSystem _solutionSystem = default!; - [Dependency] private readonly GlimmerSystem _glimmerSystem = default!; - [Dependency] private readonly PuddleSystem _puddleSystem = default!; - - public override void Update(float frameTime) - { - base.Update(frameTime); - foreach (var oracle in EntityQuery()) - { - oracle.Accumulator += frameTime; - oracle.BarkAccumulator += frameTime; - oracle.RejectAccumulator += frameTime; - if (oracle.BarkAccumulator >= oracle.BarkTime.TotalSeconds) - { - oracle.BarkAccumulator = 0; - var message = Loc.GetString(_random.Pick(oracle.DemandMessages), ("item", oracle.DesiredPrototype.Name)) - .ToUpper(); - _chat.TrySendInGameICMessage(oracle.Owner, message, InGameICChatType.Speak, false); - } - - if (oracle.Accumulator >= oracle.ResetTime.TotalSeconds) - { - oracle.LastDesiredPrototype = oracle.DesiredPrototype; - NextItem(oracle); - } - } - } - - public override void Initialize() - { - base.Initialize(); - SubscribeLocalEvent(OnInit); - SubscribeLocalEvent(OnInteractHand); - SubscribeLocalEvent(OnInteractUsing); - } - - private void OnInit(EntityUid uid, OracleComponent component, ComponentInit args) - { - NextItem(component); - } - - private void OnInteractHand(EntityUid uid, OracleComponent component, InteractHandEvent args) - { - if (!HasComp(args.User) || HasComp(args.User)) - return; - - if (!TryComp(args.User, out var actor)) - return; - - var message = Loc.GetString("oracle-current-item", ("item", component.DesiredPrototype.Name)); - - var messageWrap = Loc.GetString("chat-manager-send-telepathic-chat-wrap-message", - ("telepathicChannelName", Loc.GetString("chat-manager-telepathic-channel-name")), ("message", message)); - - _chatManager.ChatMessageToOne(ChatChannel.Telepathic, - message, messageWrap, uid, false, actor.PlayerSession.ConnectedClient, Color.PaleVioletRed); - - if (component.LastDesiredPrototype != null) - { - var message2 = Loc.GetString("oracle-previous-item", ("item", component.LastDesiredPrototype.Name)); - var messageWrap2 = Loc.GetString("chat-manager-send-telepathic-chat-wrap-message", - ("telepathicChannelName", Loc.GetString("chat-manager-telepathic-channel-name")), - ("message", message2)); - - _chatManager.ChatMessageToOne(ChatChannel.Telepathic, - message2, messageWrap2, uid, false, actor.PlayerSession.ConnectedClient, Color.PaleVioletRed); - } - } - - private void OnInteractUsing(EntityUid uid, OracleComponent component, InteractUsingEvent args) - { - if (HasComp(args.Used)) - return; - - if (!TryComp(args.Used, out var meta)) - return; - - if (meta.EntityPrototype == null) - return; - - var validItem = CheckValidity(meta.EntityPrototype, component.DesiredPrototype); - - var nextItem = true; - - if (component.LastDesiredPrototype != null && - CheckValidity(meta.EntityPrototype, component.LastDesiredPrototype)) - { - nextItem = false; - validItem = true; - component.LastDesiredPrototype = null; - } - - if (!validItem) - { - if (!HasComp(args.Used) && - component.RejectAccumulator >= component.RejectTime.TotalSeconds) - { - component.RejectAccumulator = 0; - _chat.TrySendInGameICMessage(uid, _random.Pick(component.RejectMessages), InGameICChatType.Speak, true); - } - return; - } - - EntityManager.QueueDeleteEntity(args.Used); - - EntityManager.SpawnEntity("ResearchDisk5000", Transform(args.User).Coordinates); - - DispenseLiquidReward(uid, component); - - var i = _random.Next(1, 4); - - while (i != 0) - { - EntityManager.SpawnEntity("MaterialBluespace1", Transform(args.User).Coordinates); - i--; - } - - if (nextItem) - NextItem(component); - } - - private bool CheckValidity(EntityPrototype given, EntityPrototype target) - { - // 1: directly compare Names - // name instead of ID because the oracle asks for them by name - // this could potentially lead to like, labeller exploits maybe but so far only mob names can be fully player-set. - if (given.Name == target.Name) - return true; - - return false; - } - - private void DispenseLiquidReward(EntityUid uid, OracleComponent component) - { - if (!_solutionSystem.TryGetSolution(uid, OracleComponent.SolutionName, out var fountainSol)) - return; - - var allReagents = _prototypeManager.EnumeratePrototypes() - .Where(x => !x.Abstract) - .Select(x => x.ID).ToList(); - - var amount = 20 + _random.Next(1, 30) + _glimmerSystem.Glimmer / 10f; - amount = (float) Math.Round(amount); - - var sol = new Solution(); - var reagent = ""; - - if (_random.Prob(0.2f)) - reagent = _random.Pick(allReagents); - else - reagent = _random.Pick(component.RewardReagents); - - sol.AddReagent(reagent, amount); - - _solutionSystem.TryMixAndOverflow(fountainSol.Value, sol, fountainSol.Value.Comp.Solution.MaxVolume, out var overflowing); - - if (overflowing != null && overflowing.Volume > 0) - _puddleSystem.TrySpillAt(uid, overflowing, out var _); - } - - private void NextItem(OracleComponent component) - { - component.Accumulator = 0; - component.BarkAccumulator = 0; - component.RejectAccumulator = 0; - var protoString = GetDesiredItem(component); - if (_prototypeManager.TryIndex(protoString, out var proto)) - component.DesiredPrototype = proto; - else - Logger.Error("Oracle can't index prototype " + protoString); - } - - private string GetDesiredItem(OracleComponent component) - { - return _random.Pick(GetAllProtos(component)); - } - - - public List GetAllProtos(OracleComponent component) - { - var allTechs = _prototypeManager.EnumeratePrototypes(); - var allRecipes = new List(); - - foreach (var tech in allTechs) - { - foreach (var recipe in tech.RecipeUnlocks) - { - var recipeProto = _prototypeManager.Index(recipe); - allRecipes.Add(recipeProto.Result); - } - } - - var allPlants = _prototypeManager.EnumeratePrototypes().Select(x => x.ProductPrototypes[0]) - .ToList(); - var allProtos = allRecipes.Concat(allPlants).ToList(); - var blacklist = component.BlacklistedPrototypes.ToList(); - - foreach (var proto in allProtos) - { - if (!_prototypeManager.TryIndex(proto, out var entityProto)) - { - blacklist.Add(proto); - continue; - } - - if (!entityProto.Components.ContainsKey("Item")) - { - blacklist.Add(proto); - continue; - } - - if (entityProto.Components.ContainsKey("SolutionTransfer")) - { - blacklist.Add(proto); - continue; - } - - if (entityProto.Components.ContainsKey("MobState")) - blacklist.Add(proto); - } - - foreach (var proto in blacklist) - { - allProtos.Remove(proto); - } - - return allProtos; - } -} diff --git a/Content.Server/Players/PlayTimeTracking/PlayTimeTrackingSystem.cs b/Content.Server/Players/PlayTimeTracking/PlayTimeTrackingSystem.cs index 57c6466ebbb..8368388d81e 100644 --- a/Content.Server/Players/PlayTimeTracking/PlayTimeTrackingSystem.cs +++ b/Content.Server/Players/PlayTimeTracking/PlayTimeTrackingSystem.cs @@ -3,12 +3,15 @@ using Content.Server.Afk.Events; using Content.Server.GameTicking; using Content.Server.Mind; +using Content.Server.Preferences.Managers; using Content.Shared.CCVar; +using Content.Shared.Customization.Systems; using Content.Shared.GameTicking; using Content.Shared.Mobs; using Content.Shared.Mobs.Components; using Content.Shared.Players; using Content.Shared.Players.PlayTimeTracking; +using Content.Shared.Preferences; using Content.Shared.Roles; using Robust.Server.GameObjects; using Robust.Server.Player; @@ -31,6 +34,10 @@ public sealed class PlayTimeTrackingSystem : EntitySystem [Dependency] private readonly IConfigurationManager _cfg = default!; [Dependency] private readonly MindSystem _minds = default!; [Dependency] private readonly PlayTimeTrackingManager _tracking = default!; + [Dependency] private readonly CharacterRequirementsSystem _characterRequirements = default!; + [Dependency] private readonly IServerPreferencesManager _prefs = default!; + [Dependency] private readonly IConfigurationManager _config = default!; + public override void Initialize() { @@ -173,7 +180,16 @@ public bool IsAllowed(ICommonSession player, string role) var isWhitelisted = player.ContentData()?.Whitelisted ?? false; // DeltaV - Whitelist requirement - return JobRequirements.TryRequirementsMet(job, playTimes, out _, EntityManager, _prototypes, isWhitelisted); + return _characterRequirements.CheckRequirementsValid( + job.Requirements, + job, + (HumanoidCharacterProfile) _prefs.GetPreferences(player.UserId).SelectedCharacter, + playTimes, + isWhitelisted, + EntityManager, + _prototypes, + _config, + out _); } public HashSet GetDisallowedJobs(ICommonSession player) @@ -194,13 +210,19 @@ public HashSet GetDisallowedJobs(ICommonSession player) { if (job.Requirements != null) { - foreach (var requirement in job.Requirements) - { - if (JobRequirements.TryRequirementMet(requirement, playTimes, out _, EntityManager, _prototypes, isWhitelisted)) - continue; + if (_characterRequirements.CheckRequirementsValid( + job.Requirements, + job, + (HumanoidCharacterProfile) _prefs.GetPreferences(player.UserId).SelectedCharacter, + playTimes, + isWhitelisted, + EntityManager, + _prototypes, + _config, + out _)) + continue; - goto NoRole; - } + goto NoRole; } roles.Add(job.ID); @@ -234,14 +256,19 @@ public void RemoveDisallowedJobs(NetUserId userId, ref List jobs) jobber.Requirements.Count == 0) continue; - foreach (var requirement in jobber.Requirements) + if (!_characterRequirements.CheckRequirementsValid( + jobber.Requirements, + jobber, + (HumanoidCharacterProfile) _prefs.GetPreferences(userId).SelectedCharacter, + _tracking.GetPlayTimes(_playerManager.GetSessionById(userId)), + _playerManager.GetSessionById(userId).ContentData()?.Whitelisted ?? false, + EntityManager, + _prototypes, + _config, + out _)) { - if (JobRequirements.TryRequirementMet(requirement, playTimes, out _, EntityManager, _prototypes, isWhitelisted)) - continue; - jobs.RemoveSwap(i); i--; - break; } } } diff --git a/Content.Server/Power/Components/ActiveChargerComponent.cs b/Content.Server/Power/Components/ActiveChargerComponent.cs deleted file mode 100644 index f3d863c9e43..00000000000 --- a/Content.Server/Power/Components/ActiveChargerComponent.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Content.Shared.Containers.ItemSlots; -using Content.Shared.Power; - -namespace Content.Server.Power.Components -{ - [RegisterComponent] - public sealed partial class ActiveChargerComponent : Component - { - } -} diff --git a/Content.Server/Power/Components/ChargingComponent.cs b/Content.Server/Power/Components/ChargingComponent.cs new file mode 100644 index 00000000000..db7c14f7082 --- /dev/null +++ b/Content.Server/Power/Components/ChargingComponent.cs @@ -0,0 +1,19 @@ +using Content.Shared.Containers.ItemSlots; +using Content.Shared.Power; + +namespace Content.Server.Power.Components +{ + [RegisterComponent] + public sealed partial class ChargingComponent : Component + { + /// + ///References the entity of the charger that is currently powering this battery + /// + public EntityUid ChargerUid; + + /// + ///References the component of the charger that is currently powering this battery + /// + public ChargerComponent ChargerComponent; + } +} diff --git a/Content.Server/Power/EntitySystems/ApcSystem.cs b/Content.Server/Power/EntitySystems/ApcSystem.cs index 95b5d74a945..f345c9e88ea 100644 --- a/Content.Server/Power/EntitySystems/ApcSystem.cs +++ b/Content.Server/Power/EntitySystems/ApcSystem.cs @@ -7,6 +7,7 @@ using Content.Shared.APC; using Content.Shared.Emag.Components; using Content.Shared.Emag.Systems; +using Content.Shared.Emp; using Content.Shared.Popups; using Robust.Server.GameObjects; using Robust.Shared.Audio; @@ -37,6 +38,7 @@ public override void Initialize() SubscribeLocalEvent(OnEmagged); SubscribeLocalEvent(OnEmpPulse); + SubscribeLocalEvent(OnEmpDisabledRemoved); } public override void Update(float deltaTime) @@ -163,7 +165,7 @@ public void UpdateUIState(EntityUid uid, private ApcChargeState CalcChargeState(EntityUid uid, PowerState.Battery battery) { - if (HasComp(uid)) + if (HasComp(uid) || HasComp(uid)) return ApcChargeState.Emag; if (battery.CurrentStorage / battery.Capacity > ApcComponent.HighPowerThreshold) @@ -190,15 +192,16 @@ private ApcExternalPowerState CalcExtPowerState(EntityUid uid, PowerState.Batter return ApcExternalPowerState.Good; } - + private void OnEmpPulse(EntityUid uid, ApcComponent component, ref EmpPulseEvent args) { - if (component.MainBreakerEnabled) - { - args.Affected = true; - args.Disabled = true; - ApcToggleBreaker(uid, component); - } + EnsureComp(uid, out var emp); //event calls before EmpDisabledComponent is added, ensure it to force sprite update + UpdateApcState(uid); + } + + private void OnEmpDisabledRemoved(EntityUid uid, ApcComponent component, ref EmpDisabledRemoved args) + { + UpdateApcState(uid); } } diff --git a/Content.Server/Power/EntitySystems/BatterySystem.cs b/Content.Server/Power/EntitySystems/BatterySystem.cs index 0a0f2068b58..1c5d83b094d 100644 --- a/Content.Server/Power/EntitySystems/BatterySystem.cs +++ b/Content.Server/Power/EntitySystems/BatterySystem.cs @@ -1,5 +1,6 @@ using Content.Server.Cargo.Systems; using Content.Server.Emp; +using Content.Shared.Emp; using Content.Server.Power.Components; using Content.Shared.Examine; using Content.Shared.Rejuvenate; @@ -20,6 +21,7 @@ public override void Initialize() SubscribeLocalEvent(OnBatteryRejuvenate); SubscribeLocalEvent(CalculateBatteryPrice); SubscribeLocalEvent(OnEmpPulse); + SubscribeLocalEvent(OnEmpDisabledRemoved); SubscribeLocalEvent(PreSync); SubscribeLocalEvent(PostSync); @@ -85,7 +87,7 @@ public override void Update(float frameTime) { if (!comp.AutoRecharge) continue; if (batt.IsFullyCharged) continue; - SetCharge(uid, batt.CurrentCharge + comp.AutoRechargeRate * frameTime, batt); + TrySetCharge(uid, batt.CurrentCharge + comp.AutoRechargeRate * frameTime, batt); } } @@ -100,9 +102,21 @@ private void CalculateBatteryPrice(EntityUid uid, BatteryComponent component, re private void OnEmpPulse(EntityUid uid, BatteryComponent component, ref EmpPulseEvent args) { args.Affected = true; + args.Disabled = true; UseCharge(uid, args.EnergyConsumption, component); } + // if a disabled battery is put into a recharged, + // allow the recharger to start recharging again after the disable ends + private void OnEmpDisabledRemoved(EntityUid uid, BatteryComponent component, ref EmpDisabledRemoved args) + { + if (!TryComp(uid, out var charging)) + return; + + var ev = new ChargerUpdateStatusEvent(); + RaiseLocalEvent(charging.ChargerUid, ref ev); + } + public float UseCharge(EntityUid uid, float value, BatteryComponent? battery = null) { if (value <= 0 || !Resolve(uid, ref battery) || battery.CurrentCharge == 0) @@ -157,6 +171,18 @@ public bool TryUseCharge(EntityUid uid, float value, BatteryComponent? battery = return true; } + /// + /// Like SetCharge, but checks for conditions like EmpDisabled before executing + /// + public bool TrySetCharge(EntityUid uid, float value, BatteryComponent? battery = null) + { + if (!Resolve(uid, ref battery, false) || TryComp(uid, out var emp)) + return false; + + SetCharge(uid, value, battery); + return true; + } + /// /// Returns whether the battery is at least 99% charged, basically full. /// @@ -165,6 +191,10 @@ public bool IsFull(EntityUid uid, BatteryComponent? battery = null) if (!Resolve(uid, ref battery)) return false; + // If the battery is full, remove its charging component. + if (TryComp(uid, out _)) + RemComp(uid); + return battery.CurrentCharge / battery.MaxCharge >= 0.99f; } } diff --git a/Content.Server/Power/EntitySystems/ChargerSystem.cs b/Content.Server/Power/EntitySystems/ChargerSystem.cs index db16dfa008e..ae6b024162e 100644 --- a/Content.Server/Power/EntitySystems/ChargerSystem.cs +++ b/Content.Server/Power/EntitySystems/ChargerSystem.cs @@ -1,13 +1,16 @@ using Content.Server.Power.Components; +using Content.Server.Emp; using Content.Server.PowerCell; using Content.Shared.Examine; using Content.Shared.Power; using Content.Shared.PowerCell.Components; +using Content.Shared.Emp; using JetBrains.Annotations; using Robust.Shared.Containers; using System.Diagnostics.CodeAnalysis; using Content.Shared.Storage.Components; using Robust.Server.Containers; +using Content.Shared.Whitelist; namespace Content.Server.Power.EntitySystems; @@ -28,6 +31,11 @@ public override void Initialize() SubscribeLocalEvent(OnInsertAttempt); SubscribeLocalEvent(OnEntityStorageInsertAttempt); SubscribeLocalEvent(OnChargerExamine); + + SubscribeLocalEvent(OnUpdateStatus); + + SubscribeLocalEvent(OnEmpPulse); + SubscribeLocalEvent(OnEmpDisabledRemoved); } private void OnStartup(EntityUid uid, ChargerComponent component, ComponentStartup args) @@ -40,21 +48,58 @@ private void OnChargerExamine(EntityUid uid, ChargerComponent component, Examine args.PushMarkup(Loc.GetString("charger-examine", ("color", "yellow"), ("chargeRate", (int) component.ChargeRate))); } + private void StartChargingBattery(EntityUid uid, ChargerComponent component, EntityUid target) + { + bool charge = true; + + if (HasComp(uid)) + charge = false; + else + if (!TryComp(target, out var battery)) + charge = false; + else + if (Math.Abs(battery.MaxCharge - battery.CurrentCharge) < 0.01) + charge = false; + + // wrap functionality in an if statement instead of returning... + if (charge) + { + var charging = EnsureComp(target); + charging.ChargerUid = uid; + charging.ChargerComponent = component; + } + + // ...so the status always updates (for insertin a power cell) + UpdateStatus(uid, component); + } + + private void StopChargingBattery(EntityUid uid, ChargerComponent component, EntityUid target) + { + if (HasComp(target)) + RemComp(target); + UpdateStatus(uid, component); + } + public override void Update(float frameTime) { - var query = EntityQueryEnumerator(); - while (query.MoveNext(out var uid, out _, out var charger, out var containerComp)) + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var charging)) { - if (!_container.TryGetContainer(uid, charger.SlotId, out var container, containerComp)) + if (!TryComp(charging.ChargerUid, out var chargerComponent)) continue; - if (charger.Status == CellChargerStatus.Empty || charger.Status == CellChargerStatus.Charged || container.ContainedEntities.Count == 0) + if (charging.ChargerComponent.Status == CellChargerStatus.Off || charging.ChargerComponent.Status == CellChargerStatus.Empty) continue; - foreach (var contained in container.ContainedEntities) - { - TransferPower(uid, contained, charger, frameTime); - } + if (HasComp(charging.ChargerUid)) + continue; + + if (!TryComp(uid, out var battery)) + continue; + + if (Math.Abs(battery.MaxCharge - battery.CurrentCharge) < 0.01) + StopChargingBattery(charging.ChargerUid, charging.ChargerComponent, uid); + TransferPower(charging.ChargerUid, uid, charging.ChargerComponent, frameTime); } } @@ -71,7 +116,7 @@ private void OnInserted(EntityUid uid, ChargerComponent component, EntInsertedIn if (args.Container.ID != component.SlotId) return; - UpdateStatus(uid, component); + StartChargingBattery(uid, component, args.Entity); } private void OnRemoved(EntityUid uid, ChargerComponent component, EntRemovedFromContainerMessage args) @@ -79,7 +124,7 @@ private void OnRemoved(EntityUid uid, ChargerComponent component, EntRemovedFrom if (args.Container.ID != component.SlotId) return; - UpdateStatus(uid, component); + StopChargingBattery(uid, component, args.Entity); } /// @@ -112,6 +157,11 @@ private void OnEntityStorageInsertAttempt(EntityUid uid, ChargerComponent compon args.Cancelled = true; } + private void OnUpdateStatus(EntityUid uid, ChargerComponent component, ref ChargerUpdateStatusEvent args) + { + UpdateStatus(uid, component); + } + private void UpdateStatus(EntityUid uid, ChargerComponent component) { var status = GetStatus(uid, component); @@ -126,15 +176,6 @@ private void UpdateStatus(EntityUid uid, ChargerComponent component) component.Status = status; - if (component.Status == CellChargerStatus.Charging) - { - AddComp(uid); - } - else - { - RemComp(uid); - } - switch (component.Status) { case CellChargerStatus.Off: @@ -146,7 +187,7 @@ private void UpdateStatus(EntityUid uid, ChargerComponent component) _appearance.SetData(uid, CellVisual.Light, CellChargerStatus.Empty, appearance); break; case CellChargerStatus.Charging: - receiver.Load = component.ChargeRate; + receiver.Load = component.ChargeRate; //does not scale with multiple slotted batteries _appearance.SetData(uid, CellVisual.Light, CellChargerStatus.Charging, appearance); break; case CellChargerStatus.Charged: @@ -157,6 +198,42 @@ private void UpdateStatus(EntityUid uid, ChargerComponent component) throw new ArgumentOutOfRangeException(); } } + + private void OnEmpPulse(EntityUid uid, ChargerComponent component, ref EmpPulseEvent args) + { + // we don't care if we haven't been disabled + if (!args.Disabled) + return; + + // if the recharger is hit by an emp pulse, + // stop recharging contained batteries to save resources + if (!_container.TryGetContainer(uid, component.SlotId, out var container)) + return; + + foreach (var containedEntity in container.ContainedEntities) + { + if (!SearchForBattery(containedEntity, out _, out _)) + continue; + + StopChargingBattery(uid, component, containedEntity); + } + } + + private void OnEmpDisabledRemoved(EntityUid uid, ChargerComponent component, ref EmpDisabledRemoved args) + { + // if an emp disable subsides, + // attempt to start charging all batteries + if (!_container.TryGetContainer(uid, component.SlotId, out var container)) + return; + + foreach (var containedEntity in container.ContainedEntities) + { + if (!SearchForBattery(containedEntity, out _, out _)) + continue; + + StartChargingBattery(uid, component, containedEntity); + } + } private CellChargerStatus GetStatus(EntityUid uid, ChargerComponent component) { @@ -178,13 +255,28 @@ private CellChargerStatus GetStatus(EntityUid uid, ChargerComponent component) if (container.ContainedEntities.Count == 0) return CellChargerStatus.Empty; - if (!SearchForBattery(container.ContainedEntities[0], out _, out var heldBattery)) - return CellChargerStatus.Off; + var statusOut = CellChargerStatus.Off; - if (Math.Abs(heldBattery.MaxCharge - heldBattery.CurrentCharge) < 0.01) - return CellChargerStatus.Charged; + foreach (var containedEntity in container.ContainedEntities) + { + // if none of the slotted items are actually batteries, represent the charger as off + if (!SearchForBattery(containedEntity, out _, out _)) + continue; - return CellChargerStatus.Charging; + // if all batteries are either EMP'd or fully charged, represent the charger as fully charged + statusOut = CellChargerStatus.Charged; + if (HasComp(containedEntity)) + continue; + + if (!HasComp(containedEntity)) + continue; + + // if we have atleast one battery being charged, represent the charger as charging; + statusOut = CellChargerStatus.Charging; + break; + } + + return statusOut; } private void TransferPower(EntityUid uid, EntityUid targetEntity, ChargerComponent component, float frameTime) @@ -201,11 +293,11 @@ private void TransferPower(EntityUid uid, EntityUid targetEntity, ChargerCompone if (!SearchForBattery(targetEntity, out var batteryUid, out var heldBattery)) return; - _battery.SetCharge(batteryUid.Value, heldBattery.CurrentCharge + component.ChargeRate * frameTime, heldBattery); + _battery.TrySetCharge(batteryUid.Value, heldBattery.CurrentCharge + component.ChargeRate * frameTime, heldBattery); // Just so the sprite won't be set to 99.99999% visibility if (heldBattery.MaxCharge - heldBattery.CurrentCharge < 0.01) { - _battery.SetCharge(batteryUid.Value, heldBattery.MaxCharge, heldBattery); + _battery.TrySetCharge(batteryUid.Value, heldBattery.MaxCharge, heldBattery); } UpdateStatus(uid, component); @@ -223,3 +315,6 @@ private bool SearchForBattery(EntityUid uid, [NotNullWhen(true)] out EntityUid? return true; } } + +[ByRefEvent] +public record struct ChargerUpdateStatusEvent(); \ No newline at end of file diff --git a/Content.Server/Power/EntitySystems/PowerReceiverSystem.cs b/Content.Server/Power/EntitySystems/PowerReceiverSystem.cs index 048fda23553..2157a53a53d 100644 --- a/Content.Server/Power/EntitySystems/PowerReceiverSystem.cs +++ b/Content.Server/Power/EntitySystems/PowerReceiverSystem.cs @@ -1,6 +1,7 @@ using Content.Server.Administration.Logs; using Content.Server.Administration.Managers; using Content.Server.Power.Components; +using Content.Server.Emp; using Content.Shared.Administration; using Content.Shared.Database; using Content.Shared.Examine; @@ -11,6 +12,7 @@ using Robust.Server.GameObjects; using Robust.Shared.Audio; using Robust.Shared.Utility; +using Content.Shared.Emp; namespace Content.Server.Power.EntitySystems { @@ -38,6 +40,9 @@ public override void Initialize() SubscribeLocalEvent>(OnGetVerbs); SubscribeLocalEvent>(AddSwitchPowerVerb); + SubscribeLocalEvent(OnEmpPulse); + SubscribeLocalEvent(OnEmpEnd); + _recQuery = GetEntityQuery(); _provQuery = GetEntityQuery(); } @@ -131,7 +136,7 @@ private void AddSwitchPowerVerb(EntityUid uid, PowerSwitchComponent component, G { Act = () => { - TogglePower(uid, user: args.User); + TryTogglePower(uid, user: args.User); }, Icon = new SpriteSpecifier.Texture(new ("/Textures/Interface/VerbIcons/Spare/poweronoff.svg.192dpi.png")), Text = Loc.GetString("power-switch-component-toggle-verb"), @@ -192,5 +197,36 @@ public bool TogglePower(EntityUid uid, bool playSwitchSound = true, ApcPowerRece return !receiver.PowerDisabled; // i.e. PowerEnabled } + + public bool TryTogglePower(EntityUid uid, bool playSwitchSound = true, ApcPowerReceiverComponent? receiver = null, EntityUid? user = null) + { + if (HasComp(uid)) + return false; + + return TogglePower(uid, playSwitchSound, receiver, user); + } + + public void SetLoad(ApcPowerReceiverComponent comp, float load) + { + comp.Load = load; + } + + private void OnEmpPulse(EntityUid uid, ApcPowerReceiverComponent component, ref EmpPulseEvent args) + { + if (!component.PowerDisabled) + { + args.Affected = true; + args.Disabled = true; + TogglePower(uid, false); + } + } + + private void OnEmpEnd(EntityUid uid, ApcPowerReceiverComponent component, ref EmpDisabledRemoved args) + { + if (component.PowerDisabled) + { + TogglePower(uid, false); + } + } } } diff --git a/Content.Server/Power/PowerWireAction.cs b/Content.Server/Power/PowerWireAction.cs index 785eac91dba..374c1c41acb 100644 --- a/Content.Server/Power/PowerWireAction.cs +++ b/Content.Server/Power/PowerWireAction.cs @@ -1,6 +1,7 @@ using Content.Server.Electrocution; using Content.Server.Power.Components; using Content.Server.Wires; +using Content.Shared.Emp; using Content.Shared.Power; using Content.Shared.Wires; @@ -78,6 +79,9 @@ private void SetPower(EntityUid owner, bool pulsed) return; } + if (EntityManager.TryGetComponent(owner, out var emp)) + return; + power.PowerDisabled = false; } } diff --git a/Content.Server/Nyanotrasen/Psionics/AcceptPsionicsEui.cs b/Content.Server/Psionics/AcceptPsionicsEui.cs similarity index 100% rename from Content.Server/Nyanotrasen/Psionics/AcceptPsionicsEui.cs rename to Content.Server/Psionics/AcceptPsionicsEui.cs diff --git a/Content.Server/Nyanotrasen/Psionics/AntiPsychicWeaponComponent.cs b/Content.Server/Psionics/AntiPsychicWeaponComponent.cs similarity index 100% rename from Content.Server/Nyanotrasen/Psionics/AntiPsychicWeaponComponent.cs rename to Content.Server/Psionics/AntiPsychicWeaponComponent.cs diff --git a/Content.Server/Nyanotrasen/Psionics/Dreams/DreamSystem.cs b/Content.Server/Psionics/Dreams/DreamSystem.cs similarity index 100% rename from Content.Server/Nyanotrasen/Psionics/Dreams/DreamSystem.cs rename to Content.Server/Psionics/Dreams/DreamSystem.cs diff --git a/Content.Server/Nyanotrasen/Psionics/Glimmer/GlimmerCommands.cs b/Content.Server/Psionics/Glimmer/GlimmerCommands.cs similarity index 92% rename from Content.Server/Nyanotrasen/Psionics/Glimmer/GlimmerCommands.cs rename to Content.Server/Psionics/Glimmer/GlimmerCommands.cs index 744f4cdb9a8..9e05886adca 100644 --- a/Content.Server/Nyanotrasen/Psionics/Glimmer/GlimmerCommands.cs +++ b/Content.Server/Psionics/Glimmer/GlimmerCommands.cs @@ -27,10 +27,8 @@ public sealed class GlimmerSetCommand : IConsoleCommand public async void Execute(IConsoleShell shell, string argStr, string[] args) { - if (args.Length != 1) - return; - - if (!int.TryParse(args[0], out var glimmerValue)) + if (args.Length != 1 + || !int.TryParse(args[0], out var glimmerValue)) return; var entMan = IoCManager.Resolve(); diff --git a/Content.Server/Nyanotrasen/Psionics/Glimmer/GlimmerReactiveSystem.cs b/Content.Server/Psionics/Glimmer/GlimmerReactiveSystem.cs similarity index 76% rename from Content.Server/Nyanotrasen/Psionics/Glimmer/GlimmerReactiveSystem.cs rename to Content.Server/Psionics/Glimmer/GlimmerReactiveSystem.cs index da3b07d6dab..f828874aacb 100644 --- a/Content.Server/Nyanotrasen/Psionics/Glimmer/GlimmerReactiveSystem.cs +++ b/Content.Server/Psionics/Glimmer/GlimmerReactiveSystem.cs @@ -3,12 +3,10 @@ using Content.Server.Electrocution; using Content.Server.Lightning; using Content.Server.Explosion.EntitySystems; -using Content.Server.Construction; using Content.Server.Ghost; using Content.Server.Revenant.EntitySystems; using Content.Shared.Audio; using Content.Shared.Construction.EntitySystems; -using Content.Shared.Coordinates.Helpers; using Content.Shared.GameTicking; using Content.Shared.Psionics.Glimmer; using Content.Shared.Verbs; @@ -16,14 +14,12 @@ using Content.Shared.Damage; using Content.Shared.Destructible; using Content.Shared.Construction.Components; -using Content.Shared.Mind; using Content.Shared.Mind.Components; using Content.Shared.Weapons.Melee.Components; using Robust.Shared.Audio; using Robust.Shared.Audio.Systems; using Robust.Shared.Map; using Robust.Shared.Random; -using Robust.Shared.Physics.Components; using Robust.Shared.Utility; namespace Content.Server.Psionics.Glimmer @@ -39,13 +35,12 @@ public sealed class GlimmerReactiveSystem : EntitySystem [Dependency] private readonly LightningSystem _lightning = default!; [Dependency] private readonly ExplosionSystem _explosionSystem = default!; [Dependency] private readonly EntityLookupSystem _entityLookupSystem = default!; - [Dependency] private readonly AnchorableSystem _anchorableSystem = default!; [Dependency] private readonly SharedDestructibleSystem _destructibleSystem = default!; [Dependency] private readonly GhostSystem _ghostSystem = default!; [Dependency] private readonly RevenantSystem _revenantSystem = default!; - [Dependency] private readonly IMapManager _mapManager = default!; [Dependency] private readonly SharedTransformSystem _transformSystem = default!; [Dependency] private readonly SharedPointLightSystem _pointLightSystem = default!; + private ISawmill _sawmill = default!; public float Accumulator = 0; public const float UpdateFrequency = 15f; @@ -78,35 +73,28 @@ private void UpdateEntityState(EntityUid uid, SharedGlimmerReactiveComponent com { var isEnabled = true; - if (component.RequiresApcPower) - if (TryComp(uid, out ApcPowerReceiverComponent? apcPower)) - isEnabled = apcPower.Powered; + if (component.RequiresApcPower + && TryComp(uid, out ApcPowerReceiverComponent? apcPower)) + isEnabled = apcPower.Powered; _appearanceSystem.SetData(uid, GlimmerReactiveVisuals.GlimmerTier, isEnabled ? currentGlimmerTier : GlimmerTier.Minimal); - // update ambient sound + // Update ambient sound if (TryComp(uid, out GlimmerSoundComponent? glimmerSound) && TryComp(uid, out AmbientSoundComponent? ambientSoundComponent) - && glimmerSound.GetSound(currentGlimmerTier, out SoundSpecifier? spec)) + && glimmerSound.GetSound(currentGlimmerTier, out SoundSpecifier? spec) + && spec != null) + _sharedAmbientSoundSystem.SetSound(uid, spec, ambientSoundComponent); + + // Update point light + if (component.ModulatesPointLight + && _pointLightSystem.TryGetLight(uid, out var pointLight)) { - if (spec != null) - _sharedAmbientSoundSystem.SetSound(uid, spec, ambientSoundComponent); + _pointLightSystem.SetEnabled(uid, isEnabled ? currentGlimmerTier != GlimmerTier.Minimal : false, pointLight); + _pointLightSystem.SetEnergy(uid, pointLight.Energy + glimmerTierDelta * component.GlimmerToLightEnergyFactor, pointLight); + _pointLightSystem.SetRadius(uid, pointLight.Radius + glimmerTierDelta * component.GlimmerToLightRadiusFactor, pointLight); } - if (component.ModulatesPointLight) //SharedPointLightComponent is now being fetched via TryGetLight. - if (_pointLightSystem.TryGetLight(uid, out var pointLight)) - { - _pointLightSystem.SetEnabled(uid, isEnabled ? currentGlimmerTier != GlimmerTier.Minimal : false, pointLight); - // The light energy and radius are kept updated even when off - // to prevent the need to store additional state. - // - // Note that this doesn't handle edge cases where the - // PointLightComponent is removed while the - // GlimmerReactiveComponent is still present. - _pointLightSystem.SetEnergy(uid, pointLight.Energy + glimmerTierDelta * component.GlimmerToLightEnergyFactor, pointLight); - _pointLightSystem.SetRadius(uid, pointLight.Radius + glimmerTierDelta * component.GlimmerToLightRadiusFactor, pointLight); - } - } /// @@ -117,7 +105,7 @@ private void UpdateEntityState(EntityUid uid, SharedGlimmerReactiveComponent com private void OnMapInit(EntityUid uid, SharedGlimmerReactiveComponent component, MapInitEvent args) { if (component.RequiresApcPower && !HasComp(uid)) - Logger.Warning($"{ToPrettyString(uid)} had RequiresApcPower set to true but no ApcPowerReceiverComponent was found on init."); + _sawmill.Warning($"{ToPrettyString(uid)} had RequiresApcPower set to true but no ApcPowerReceiverComponent was found on init."); UpdateEntityState(uid, component, LastGlimmerTier, (int) LastGlimmerTier); } @@ -157,7 +145,8 @@ private void OnTierChanged(EntityUid uid, SharedGlimmerReactiveComponent compone receiver.PowerDisabled = false; receiver.NeedsPower = false; - } else + } + else { receiver.NeedsPower = true; } @@ -165,13 +154,10 @@ private void OnTierChanged(EntityUid uid, SharedGlimmerReactiveComponent compone private void AddShockVerb(EntityUid uid, SharedGlimmerReactiveComponent component, GetVerbsEvent args) { - if(!args.CanAccess || !args.CanInteract) - return; - - if (!TryComp(uid, out var receiver)) - return; - - if (receiver.NeedsPower) + if (!args.CanAccess + || !args.CanInteract + || !TryComp(uid, out var receiver) + || receiver.NeedsPower) return; AlternativeVerb verb = new() @@ -181,7 +167,7 @@ private void AddShockVerb(EntityUid uid, SharedGlimmerReactiveComponent componen _sharedAudioSystem.PlayPvs(component.ShockNoises, args.User); _electrocutionSystem.TryDoElectrocution(args.User, null, _glimmerSystem.Glimmer / 200, TimeSpan.FromSeconds((float) _glimmerSystem.Glimmer / 100), false); }, - Icon = new SpriteSpecifier.Texture(new ("/Textures/Interface/VerbIcons/Spare/poweronoff.svg.192dpi.png")), + Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/Spare/poweronoff.svg.192dpi.png")), Text = Loc.GetString("power-switch-component-toggle-verb"), Priority = -3 }; @@ -190,10 +176,8 @@ private void AddShockVerb(EntityUid uid, SharedGlimmerReactiveComponent componen private void OnDamageChanged(EntityUid uid, SharedGlimmerReactiveComponent component, DamageChangedEvent args) { - if (args.Origin == null) - return; - - if (!_random.Prob((float) _glimmerSystem.Glimmer / 1000)) + if (args.Origin == null + || !_random.Prob((float) _glimmerSystem.Glimmer / 1000)) return; var tier = _glimmerSystem.GetGlimmerTier(); @@ -222,27 +206,23 @@ private void OnDestroyed(EntityUid uid, SharedGlimmerReactiveComponent component private void OnUnanchorAttempt(EntityUid uid, SharedGlimmerReactiveComponent component, UnanchorAttemptEvent args) { - if (_glimmerSystem.GetGlimmerTier() >= GlimmerTier.Dangerous) - { - _sharedAudioSystem.PlayPvs(component.ShockNoises, args.User); - _electrocutionSystem.TryDoElectrocution(args.User, null, _glimmerSystem.Glimmer / 200, TimeSpan.FromSeconds((float) _glimmerSystem.Glimmer / 100), false); - args.Cancel(); - } + if (_glimmerSystem.GetGlimmerTier() < GlimmerTier.Dangerous) + return; + + _sharedAudioSystem.PlayPvs(component.ShockNoises, args.User); + _electrocutionSystem.TryDoElectrocution(args.User, null, _glimmerSystem.Glimmer / 200, TimeSpan.FromSeconds((float) _glimmerSystem.Glimmer / 100), false); + args.Cancel(); } public void BeamRandomNearProber(EntityUid prober, int targets, float range = 10f) { List targetList = new(); - foreach (var target in _entityLookupSystem.GetComponentsInRange(_transformSystem.GetMapCoordinates(prober), range)) - { - if (target.AllowedEffects.Contains("Electrocution")) - targetList.Add(target.Owner); - } + foreach (var (target, status) in _entityLookupSystem.GetEntitiesInRange(_transformSystem.GetMapCoordinates(prober), range)) + if (status.AllowedEffects.Contains("Electrocution")) + targetList.Add(target); - foreach(var reactive in _entityLookupSystem.GetComponentsInRange(_transformSystem.GetMapCoordinates(prober), range)) - { - targetList.Add(reactive.Owner); - } + foreach (var reactive in _entityLookupSystem.GetEntitiesInRange(_transformSystem.GetMapCoordinates(prober), range)) + targetList.Add(reactive); _random.Shuffle(targetList); foreach (var target in targetList) @@ -257,10 +237,9 @@ public void BeamRandomNearProber(EntityUid prober, int targets, float range = 10 private void Beam(EntityUid prober, EntityUid target, GlimmerTier tier, bool obeyCD = true) { - if (obeyCD && BeamCooldown != 0) - return; - - if (Deleted(prober) || Deleted(target)) + if (obeyCD && BeamCooldown != 0 + || Deleted(prober) + || Deleted(target)) return; var lxform = Transform(prober); @@ -293,47 +272,27 @@ private void Beam(EntityUid prober, EntityUid target, GlimmerTier tier, bool obe private void AnchorOrExplode(EntityUid uid) { - var xform = Transform(uid); - if (xform.Anchored) - return; - - if (!TryComp(uid, out var physics)) - return; - - var coordinates = xform.Coordinates; - var gridUid = xform.GridUid; - - if (_mapManager.TryGetGrid(gridUid, out var grid)) - { - var tileIndices = grid.TileIndicesFor(coordinates); + if (Transform(uid).GridUid is null) + _destructibleSystem.DestroyEntity(uid); - if (_anchorableSystem.TileFree(grid, tileIndices, physics.CollisionLayer, physics.CollisionMask) && - _transformSystem.AnchorEntity(uid, xform)) - { - return; - } - } - - // Wasn't able to get a grid or a free tile, so explode. - _destructibleSystem.DestroyEntity(uid); + if (HasComp(uid)) + _transformSystem.AnchorEntity(uid, Transform(uid)); } private void OnMeleeThrowOnHitAttempt(Entity ent, ref AttemptMeleeThrowOnHitEvent args) { - var (uid, _) = ent; - if (_glimmerSystem.GetGlimmerTier() < GlimmerTier.Dangerous) return; args.Cancelled = true; args.Handled = true; - _lightning.ShootRandomLightnings(uid, 10, 2, "SuperchargedLightning", 2, false); + _lightning.ShootRandomLightnings(ent, 10, 2, "SuperchargedLightning", 2, false); // Check if the parent of the user is alive, which will be the case if the user is an item and is being held. var zapTarget = _transformSystem.GetParentUid(args.User); if (TryComp(zapTarget, out _)) - _electrocutionSystem.TryDoElectrocution(zapTarget, uid, 5, TimeSpan.FromSeconds(3), true, + _electrocutionSystem.TryDoElectrocution(zapTarget, ent, 5, TimeSpan.FromSeconds(3), true, ignoreInsulation: true); } @@ -360,7 +319,8 @@ public override void Update(float frameTime) var currentGlimmerTier = _glimmerSystem.GetGlimmerTier(); var reactives = EntityQuery(); - if (currentGlimmerTier != LastGlimmerTier) { + if (currentGlimmerTier != LastGlimmerTier) + { var glimmerTierDelta = (int) currentGlimmerTier - (int) LastGlimmerTier; var ev = new GlimmerTierChangedEvent(LastGlimmerTier, currentGlimmerTier, glimmerTierDelta); @@ -378,10 +338,9 @@ public override void Update(float frameTime) _revenantSystem.MakeVisible(true); GhostsVisible = true; foreach (var reactive in reactives) - { BeamRandomNearProber(reactive.Owner, 1, 12); - } - } else if (GhostsVisible == true) + } + else if (GhostsVisible == true) { _ghostSystem.MakeVisible(false); _revenantSystem.MakeVisible(false); diff --git a/Content.Server/Nyanotrasen/Psionics/Glimmer/PassiveGlimmerReductionSystem.cs b/Content.Server/Psionics/Glimmer/PassiveGlimmerReductionSystem.cs similarity index 94% rename from Content.Server/Nyanotrasen/Psionics/Glimmer/PassiveGlimmerReductionSystem.cs rename to Content.Server/Psionics/Glimmer/PassiveGlimmerReductionSystem.cs index f0da85ce453..57c74398b08 100644 --- a/Content.Server/Nyanotrasen/Psionics/Glimmer/PassiveGlimmerReductionSystem.cs +++ b/Content.Server/Psionics/Glimmer/PassiveGlimmerReductionSystem.cs @@ -4,7 +4,6 @@ using Content.Shared.CCVar; using Content.Shared.Psionics.Glimmer; using Content.Shared.GameTicking; -using Content.Server.CartridgeLoader.Cartridges; namespace Content.Server.Psionics.Glimmer { @@ -17,7 +16,6 @@ public sealed class PassiveGlimmerReductionSystem : EntitySystem [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly IConfigurationManager _cfg = default!; - [Dependency] private readonly GlimmerMonitorCartridgeSystem _cartridgeSys = default!; /// List of glimmer values spaced by minute. public List GlimmerValues = new(); diff --git a/Content.Server/Nyanotrasen/Psionics/Glimmer/Structures/GlimmerSourceComponent.cs b/Content.Server/Psionics/Glimmer/Structures/GlimmerSourceComponent.cs similarity index 82% rename from Content.Server/Nyanotrasen/Psionics/Glimmer/Structures/GlimmerSourceComponent.cs rename to Content.Server/Psionics/Glimmer/Structures/GlimmerSourceComponent.cs index 5babb6c446d..c7db2a5229f 100644 --- a/Content.Server/Nyanotrasen/Psionics/Glimmer/Structures/GlimmerSourceComponent.cs +++ b/Content.Server/Psionics/Glimmer/Structures/GlimmerSourceComponent.cs @@ -6,22 +6,22 @@ namespace Content.Server.Psionics.Glimmer /// public sealed partial class GlimmerSourceComponent : Component { - [DataField("accumulator")] + [DataField] public float Accumulator = 0f; - [DataField("active")] + [DataField] public bool Active = true; /// /// Since glimmer is an int, we'll do it like this. /// - [DataField("secondsPerGlimmer")] + [DataField] public float SecondsPerGlimmer = 10f; /// /// True if it produces glimmer, false if it subtracts it. /// - [DataField("addToGlimmer")] + [DataField] public bool AddToGlimmer = true; } } diff --git a/Content.Server/Nyanotrasen/Psionics/Glimmer/Structures/GlimmerStructuresSystem.cs b/Content.Server/Psionics/Glimmer/Structures/GlimmerStructuresSystem.cs similarity index 95% rename from Content.Server/Nyanotrasen/Psionics/Glimmer/Structures/GlimmerStructuresSystem.cs rename to Content.Server/Psionics/Glimmer/Structures/GlimmerStructuresSystem.cs index 75125569cb5..8694147dc0e 100644 --- a/Content.Server/Nyanotrasen/Psionics/Glimmer/Structures/GlimmerStructuresSystem.cs +++ b/Content.Server/Psionics/Glimmer/Structures/GlimmerStructuresSystem.cs @@ -58,10 +58,8 @@ public override void Update(float frameTime) base.Update(frameTime); foreach (var source in EntityQuery()) { - if (!_powerReceiverSystem.IsPowered(source.Owner)) - continue; - - if (!source.Active) + if (!_powerReceiverSystem.IsPowered(source.Owner) + || !source.Active) continue; source.Accumulator += frameTime; @@ -70,13 +68,9 @@ public override void Update(float frameTime) { source.Accumulator -= source.SecondsPerGlimmer; if (source.AddToGlimmer) - { _glimmerSystem.Glimmer++; - } else - { _glimmerSystem.Glimmer--; - } } } } diff --git a/Content.Server/Nyanotrasen/Psionics/Invisibility/PsionicInvisibilitySystem.cs b/Content.Server/Psionics/Invisibility/PsionicInvisibilitySystem.cs similarity index 100% rename from Content.Server/Nyanotrasen/Psionics/Invisibility/PsionicInvisibilitySystem.cs rename to Content.Server/Psionics/Invisibility/PsionicInvisibilitySystem.cs diff --git a/Content.Server/Nyanotrasen/Psionics/Invisibility/PsionicInvisibleContactsComponent.cs b/Content.Server/Psionics/Invisibility/PsionicInvisibleContactsComponent.cs similarity index 100% rename from Content.Server/Nyanotrasen/Psionics/Invisibility/PsionicInvisibleContactsComponent.cs rename to Content.Server/Psionics/Invisibility/PsionicInvisibleContactsComponent.cs diff --git a/Content.Server/Nyanotrasen/Psionics/Invisibility/PsionicInvisibleContactsSystem.cs b/Content.Server/Psionics/Invisibility/PsionicInvisibleContactsSystem.cs similarity index 100% rename from Content.Server/Nyanotrasen/Psionics/Invisibility/PsionicInvisibleContactsSystem.cs rename to Content.Server/Psionics/Invisibility/PsionicInvisibleContactsSystem.cs diff --git a/Content.Server/Nyanotrasen/Psionics/Invisibility/PsionicallyInvisibleComponent.cs b/Content.Server/Psionics/Invisibility/PsionicallyInvisibleComponent.cs similarity index 100% rename from Content.Server/Nyanotrasen/Psionics/Invisibility/PsionicallyInvisibleComponent.cs rename to Content.Server/Psionics/Invisibility/PsionicallyInvisibleComponent.cs diff --git a/Content.Server/Nyanotrasen/Psionics/PotentialPsionicComponent.cs b/Content.Server/Psionics/PotentialPsionicComponent.cs similarity index 100% rename from Content.Server/Nyanotrasen/Psionics/PotentialPsionicComponent.cs rename to Content.Server/Psionics/PotentialPsionicComponent.cs diff --git a/Content.Server/Nyanotrasen/Psionics/PsionicAwaitingPlayerComponent.cs b/Content.Server/Psionics/PsionicAwaitingPlayerComponent.cs similarity index 100% rename from Content.Server/Nyanotrasen/Psionics/PsionicAwaitingPlayerComponent.cs rename to Content.Server/Psionics/PsionicAwaitingPlayerComponent.cs diff --git a/Content.Server/Nyanotrasen/Psionics/PsionicBonusChanceComponent.cs b/Content.Server/Psionics/PsionicBonusChanceComponent.cs similarity index 100% rename from Content.Server/Nyanotrasen/Psionics/PsionicBonusChanceComponent.cs rename to Content.Server/Psionics/PsionicBonusChanceComponent.cs diff --git a/Content.Server/Nyanotrasen/Psionics/PsionicsCommands.cs b/Content.Server/Psionics/PsionicsCommands.cs similarity index 100% rename from Content.Server/Nyanotrasen/Psionics/PsionicsCommands.cs rename to Content.Server/Psionics/PsionicsCommands.cs diff --git a/Content.Server/Nyanotrasen/Psionics/PsionicsSystem.cs b/Content.Server/Psionics/PsionicsSystem.cs similarity index 80% rename from Content.Server/Nyanotrasen/Psionics/PsionicsSystem.cs rename to Content.Server/Psionics/PsionicsSystem.cs index 5a96af2e96b..fb5d18f2843 100644 --- a/Content.Server/Nyanotrasen/Psionics/PsionicsSystem.cs +++ b/Content.Server/Psionics/PsionicsSystem.cs @@ -1,19 +1,15 @@ using Content.Shared.Abilities.Psionics; using Content.Shared.StatusEffect; -using Content.Shared.Mobs; using Content.Shared.Psionics.Glimmer; using Content.Shared.Weapons.Melee.Events; using Content.Shared.Damage.Events; -using Content.Shared.IdentityManagement; using Content.Shared.CCVar; using Content.Server.Abilities.Psionics; using Content.Server.Chat.Systems; using Content.Server.Electrocution; using Content.Server.NPC.Components; using Content.Server.NPC.Systems; -using Robust.Shared.Audio; using Robust.Shared.Audio.Systems; -using Robust.Shared.Player; using Robust.Shared.Configuration; using Robust.Shared.Random; @@ -27,7 +23,6 @@ public sealed class PsionicsSystem : EntitySystem [Dependency] private readonly ElectrocutionSystem _electrocutionSystem = default!; [Dependency] private readonly MindSwapPowerSystem _mindSwapPowerSystem = default!; [Dependency] private readonly GlimmerSystem _glimmerSystem = default!; - [Dependency] private readonly ChatSystem _chat = default!; [Dependency] private readonly NpcFactionSystem _npcFactonSystem = default!; [Dependency] private readonly IConfigurationManager _cfg = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; @@ -41,9 +36,7 @@ public override void Update(float frameTime) { base.Update(frameTime); foreach (var roller in _rollers) - { RollPsionics(roller.uid, roller.component, false); - } _rollers.Clear(); } public override void Initialize() @@ -51,7 +44,7 @@ public override void Initialize() base.Initialize(); SubscribeLocalEvent(OnStartup); SubscribeLocalEvent(OnMeleeHit); - SubscribeLocalEvent(OnStamHit); + SubscribeLocalEvent(OnStamHit); SubscribeLocalEvent(OnInit); SubscribeLocalEvent(OnRemove); @@ -90,13 +83,9 @@ private void OnMeleeHit(EntityUid uid, AntiPsionicWeaponComponent component, Mel private void OnInit(EntityUid uid, PsionicComponent component, ComponentInit args) { - if (!component.Removable) - return; - - if (!TryComp(uid, out var factions)) - return; - - if (_npcFactonSystem.ContainsFaction(uid, "GlimmerMonster", factions)) + if (!component.Removable + || !TryComp(uid, out var factions) + || _npcFactonSystem.ContainsFaction(uid, "GlimmerMonster", factions)) return; _npcFactonSystem.AddFaction(uid, "PsionicInterloper"); @@ -104,34 +93,22 @@ private void OnInit(EntityUid uid, PsionicComponent component, ComponentInit arg private void OnRemove(EntityUid uid, PsionicComponent component, ComponentRemove args) { - if (!TryComp(uid, out var factions)) + if (!HasComp(uid)) return; _npcFactonSystem.RemoveFaction(uid, "PsionicInterloper"); } - private void OnStamHit(EntityUid uid, AntiPsionicWeaponComponent component, StaminaMeleeHitEvent args) + private void OnStamHit(EntityUid uid, AntiPsionicWeaponComponent component, TakeStaminaDamageEvent args) { - var bonus = false; - foreach (var stam in args.HitList) - { - if (HasComp(stam.Entity)) - bonus = true; - } - - if (!bonus) - return; - - - args.FlatModifier += component.PsychicStaminaDamage; + if (HasComp(args.Target)) + args.FlatModifier += component.PsychicStaminaDamage; } public void RollPsionics(EntityUid uid, PotentialPsionicComponent component, bool applyGlimmer = true, float multiplier = 1f) { - if (HasComp(uid)) - return; - - if (!_cfg.GetCVar(CCVars.PsionicRollsEnabled)) + if (HasComp(uid) + || !_cfg.GetCVar(CCVars.PsionicRollsEnabled)) return; var chance = component.Chance; @@ -156,10 +133,8 @@ public void RollPsionics(EntityUid uid, PotentialPsionicComponent component, boo public void RerollPsionics(EntityUid uid, PotentialPsionicComponent? psionic = null, float bonusMuliplier = 1f) { - if (!Resolve(uid, ref psionic, false)) - return; - - if (psionic.Rerolled) + if (!Resolve(uid, ref psionic, false) + || psionic.Rerolled) return; RollPsionics(uid, psionic, multiplier: bonusMuliplier); diff --git a/Content.Server/Radiation/Systems/GeigerSystem.cs b/Content.Server/Radiation/Systems/GeigerSystem.cs index f889336a068..06e5911cb7c 100644 --- a/Content.Server/Radiation/Systems/GeigerSystem.cs +++ b/Content.Server/Radiation/Systems/GeigerSystem.cs @@ -6,8 +6,8 @@ using Content.Shared.Radiation.Components; using Content.Shared.Radiation.Systems; using Robust.Server.Audio; -using Robust.Server.GameObjects; using Robust.Server.Player; +using Robust.Shared.Player; namespace Content.Server.Radiation.Systems; @@ -152,19 +152,19 @@ private void UpdateSound(EntityUid uid, GeigerComponent? component = null) component.Stream = _audio.Stop(component.Stream); - if (!component.Sounds.TryGetValue(component.DangerLevel, out var sounds)) - return; - - if (component.User == null) - return; - - if (!_player.TryGetSessionByEntity(component.User.Value, out var session)) - return; - - var sound = _audio.GetSound(sounds); - var param = sounds.Params.WithLoop(true).WithVolume(-4f); - - component.Stream = _audio.PlayGlobal(sound, session, param)?.Entity; + if (component.Sounds.TryGetValue(component.DangerLevel, out var sounds)) + { + var sound = _audio.GetSound(sounds); + + if (component.LocalSoundOnly + && component.User is not null + && _player.TryGetSessionByEntity(component.User.Value, out var session)) + { + component.Stream = _audio.PlayGlobal(sound, session, component.AudioParameters)?.Entity; + return; + } + component.Stream = _audio.PlayEntity(sound, Filter.Pvs(uid), uid, true, component.AudioParameters)?.Entity; + } } public static GeigerDangerLevel RadsToLevel(float rads) diff --git a/Content.Server/Radio/EntitySystems/RadioSystem.cs b/Content.Server/Radio/EntitySystems/RadioSystem.cs index 7232a23d2c8..5fce6f770a2 100644 --- a/Content.Server/Radio/EntitySystems/RadioSystem.cs +++ b/Content.Server/Radio/EntitySystems/RadioSystem.cs @@ -178,9 +178,11 @@ public void SendRadioMessage(EntityUid messageSource, string message, RadioChann private string WrapRadioMessage(EntityUid source, RadioChannelPrototype channel, string name, string message, LanguagePrototype language) { + // TODO: code duplication with ChatSystem.WrapMessage var speech = _chat.GetSpeechVerb(source, message); - // TODO this is done just to preserve the old look of radio, perhaps we can change it as well? - var languageColor = language.SpeechOverride.Color == Color.White ? channel.Color : language.SpeechOverride.Color; + var languageColor = channel.Color; + if (language.SpeechOverride.Color is { } colorOverride) + languageColor = Color.InterpolateBetween(languageColor, colorOverride, colorOverride.A); return Loc.GetString(speech.Bold ? "chat-radio-message-wrap-bold" : "chat-radio-message-wrap", ("color", channel.Color), diff --git a/Content.Server/Remotes/DoorRemoteSystem.cs b/Content.Server/Remotes/DoorRemoteSystem.cs index e42bc700912..31fcacdaf80 100644 --- a/Content.Server/Remotes/DoorRemoteSystem.cs +++ b/Content.Server/Remotes/DoorRemoteSystem.cs @@ -50,8 +50,10 @@ private void OnBeforeInteract(Entity entity, ref BeforeRang return; } + // Holding the door remote grants you access to the relevant doors IN ADDITION to what ever access you had. + // This access is enforced in _doorSystem.HasAccess when it calls _accessReaderSystem.IsAllowed if (TryComp(args.Target, out var accessComponent) - && !_doorSystem.HasAccess(args.Target.Value, args.Used, doorComp, accessComponent)) + && !_doorSystem.HasAccess(args.Target.Value, args.User, doorComp, accessComponent)) { _doorSystem.Deny(args.Target.Value, doorComp, args.User); Popup.PopupEntity(Loc.GetString("door-remote-denied"), args.User, args.User); @@ -61,7 +63,10 @@ private void OnBeforeInteract(Entity entity, ref BeforeRang switch (entity.Comp.Mode) { case OperatingMode.OpenClose: - if (_doorSystem.TryToggleDoor(args.Target.Value, doorComp, args.Used)) + // Note we provide args.User here to TryToggleDoor as the "user" + // This means that the door will look at all access items carried by the player for access, including + // this remote, but also including anything else they are carrying such as a PDA or ID card. + if (_doorSystem.TryToggleDoor(args.Target.Value, doorComp, args.User)) _adminLogger.Add(LogType.Action, LogImpact.Medium, $"{ToPrettyString(args.User):player} used {ToPrettyString(args.Used)} on {ToPrettyString(args.Target.Value)}: {doorComp.State}"); break; case OperatingMode.ToggleBolts: @@ -69,7 +74,7 @@ private void OnBeforeInteract(Entity entity, ref BeforeRang { if (!boltsComp.BoltWireCut) { - _doorSystem.SetBoltsDown((args.Target.Value, boltsComp), !boltsComp.BoltsDown, args.Used); + _doorSystem.SetBoltsDown((args.Target.Value, boltsComp), !boltsComp.BoltsDown, args.User); _adminLogger.Add(LogType.Action, LogImpact.Medium, $"{ToPrettyString(args.User):player} used {ToPrettyString(args.Used)} on {ToPrettyString(args.Target.Value)} to {(boltsComp.BoltsDown ? "" : "un")}bolt it"); } } diff --git a/Content.Server/Research/Oracle/OracleComponent.cs b/Content.Server/Research/Oracle/OracleComponent.cs new file mode 100644 index 00000000000..6196ce95060 --- /dev/null +++ b/Content.Server/Research/Oracle/OracleComponent.cs @@ -0,0 +1,73 @@ +using Content.Shared.Random; +using Robust.Shared.Prototypes; + +namespace Content.Server.Research.Oracle; + +[RegisterComponent] +public sealed partial class OracleComponent : Component +{ + public const string SolutionName = "fountain"; + + [DataField(required: true)] + public ProtoId DemandTypes; + + [DataField] + public List> BlacklistedDemands = new(); + + [DataField(required: true)] + public List> RewardEntities; + + [DataField(required: true)] + public ProtoId RewardReagents; + + /// + /// The chance to dispense a completely random chemical instead of what's listed in + /// + [DataField] + public float AbnormalReagentChance = 0.2f; + + [DataField] + public TimeSpan + NextDemandTime = TimeSpan.Zero, + NextBarkTime = TimeSpan.Zero, + NextRejectTime = TimeSpan.Zero; + + [DataField] + public TimeSpan + DemandDelay = TimeSpan.FromMinutes(10), + BarkDelay = TimeSpan.FromMinutes(2), + RejectDelay = TimeSpan.FromSeconds(10); + + [ViewVariables(VVAccess.ReadWrite)] + public EntityPrototype DesiredPrototype = default!; + + [ViewVariables(VVAccess.ReadWrite)] + public EntityPrototype? LastDesiredPrototype = default!; + + [DataField("demandMessages")] + public IReadOnlyList DemandMessages = new[] + { + "oracle-demand-1", + "oracle-demand-2", + "oracle-demand-3", + "oracle-demand-4", + "oracle-demand-5", + "oracle-demand-6", + "oracle-demand-7", + "oracle-demand-8", + "oracle-demand-9", + "oracle-demand-10", + "oracle-demand-11", + "oracle-demand-12" + }; + + [DataField("rejectMessages")] + public IReadOnlyList RejectMessages = new[] + { + "ἄγνοια", + "υλικό", + "ἀγνωσία", + "γήινος", + "σάκλας" + }; +} diff --git a/Content.Server/Research/Oracle/OracleSystem.cs b/Content.Server/Research/Oracle/OracleSystem.cs new file mode 100644 index 00000000000..63dcefbadd7 --- /dev/null +++ b/Content.Server/Research/Oracle/OracleSystem.cs @@ -0,0 +1,288 @@ +using System.Diagnostics.CodeAnalysis; +using System.Linq; +using Content.Server.Botany; +using Content.Server.Chat.Managers; +using Content.Server.Chat.Systems; +using Content.Server.Chemistry.Containers.EntitySystems; +using Content.Server.Fluids.EntitySystems; +using Content.Server.Psionics; +using Content.Server.Research.Systems; +using Content.Shared.Abilities.Psionics; +using Content.Shared.Chat; +using Content.Shared.Chemistry.Components; +using Content.Shared.Chemistry.Reagent; +using Content.Shared.Interaction; +using Content.Shared.Mobs.Components; +using Content.Shared.Psionics.Glimmer; +using Content.Shared.Random.Helpers; +using Content.Shared.Research.Components; +using Content.Shared.Research.Prototypes; +using Content.Shared.Throwing; +using Robust.Shared.Map; +using Robust.Shared.Network; +using Robust.Shared.Player; +using Robust.Shared.Prototypes; +using Robust.Shared.Random; +using Robust.Shared.Timing; + +namespace Content.Server.Research.Oracle; + +public sealed class OracleSystem : EntitySystem +{ + [Dependency] private readonly ChatSystem _chat = default!; + [Dependency] private readonly IChatManager _chatMan = default!; + [Dependency] private readonly GlimmerSystem _glimmer = default!; + [Dependency] private readonly IPrototypeManager _protoMan = default!; + [Dependency] private readonly PuddleSystem _puddles = default!; + [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly ResearchSystem _research = default!; + [Dependency] private readonly SolutionContainerSystem _solutions = default!; + [Dependency] private readonly ThrowingSystem _throwing = default!; + [Dependency] private readonly IGameTiming _timing = default!; + + public override void Update(float frameTime) + { + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var comp)) + { + if (_timing.CurTime >= comp.NextDemandTime) + { + // Might be null if this is the first tick. In that case this will simply initialize it. + var last = (EntityPrototype?) comp.DesiredPrototype; + if (NextItem((uid, comp))) + comp.LastDesiredPrototype = last; + } + + if (_timing.CurTime >= comp.NextBarkTime) + { + comp.NextBarkTime = _timing.CurTime + comp.BarkDelay; + + var message = Loc.GetString(_random.Pick(comp.DemandMessages), ("item", comp.DesiredPrototype.Name)).ToUpper(); + _chat.TrySendInGameICMessage(uid, message, InGameICChatType.Speak, false); + } + } + + query.Dispose(); + } + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnInteractHand); + SubscribeLocalEvent(OnInteractUsing); + } + + private void OnInteractHand(Entity oracle, ref InteractHandEvent args) + { + if (!HasComp(args.User) || HasComp(args.User) + || !TryComp(args.User, out var actor)) + return; + + SendTelepathicInfo(oracle, actor.PlayerSession.Channel, + Loc.GetString("oracle-current-item", ("item", oracle.Comp.DesiredPrototype.Name))); + + if (oracle.Comp.LastDesiredPrototype != null) + SendTelepathicInfo(oracle, actor.PlayerSession.Channel, + Loc.GetString("oracle-previous-item", ("item", oracle.Comp.LastDesiredPrototype.Name))); + } + + private void OnInteractUsing(Entity oracle, ref InteractUsingEvent args) + { + if (args.Handled) + return; + + if (HasComp(args.Used) || !TryComp(args.Used, out var meta) || meta.EntityPrototype == null) + return; + + var requestValid = IsCorrectItem(meta.EntityPrototype, oracle.Comp.DesiredPrototype); + var updateRequest = true; + + if (oracle.Comp.LastDesiredPrototype != null && + IsCorrectItem(meta.EntityPrototype, oracle.Comp.LastDesiredPrototype)) + { + updateRequest = false; + requestValid = true; + oracle.Comp.LastDesiredPrototype = null; + } + + if (!requestValid) + { + if (!HasComp(args.Used) && + _timing.CurTime >= oracle.Comp.NextRejectTime) + { + oracle.Comp.NextRejectTime = _timing.CurTime + oracle.Comp.RejectDelay; + _chat.TrySendInGameICMessage(oracle, _random.Pick(oracle.Comp.RejectMessages), InGameICChatType.Speak, true); + } + + return; + } + + DispenseRewards(oracle, Transform(args.User).Coordinates); + QueueDel(args.Used); + + if (updateRequest) + NextItem(oracle); + } + + private void SendTelepathicInfo(Entity oracle, INetChannel client, string message) + { + var messageWrap = Loc.GetString("chat-manager-send-telepathic-chat-wrap-message", + ("telepathicChannelName", Loc.GetString("chat-manager-telepathic-channel-name")), + ("message", message)); + + _chatMan.ChatMessageToOne(ChatChannel.Telepathic, + message, messageWrap, oracle, false, client, Color.PaleVioletRed); + } + + private bool IsCorrectItem(EntityPrototype given, EntityPrototype target) + { + // Nyano, what is this shit? + // Why are we comparing by name instead of prototype id? + // Why is this ever necessary? + // What were you trying to accomplish?! + if (given.Name == target.Name) + return true; + + return false; + } + + private void DispenseRewards(Entity oracle, EntityCoordinates throwTarget) + { + foreach (var rewardRandom in oracle.Comp.RewardEntities) + { + // Spawn each reward next to oracle and throw towards the target + var rewardProto = _protoMan.Index(rewardRandom).Pick(_random); + var reward = EntityManager.SpawnNextToOrDrop(rewardProto, oracle); + _throwing.TryThrow(reward, throwTarget, recoil: false); + } + + DispenseLiquidReward(oracle); + } + + private void DispenseLiquidReward(Entity oracle) + { + if (!_solutions.TryGetSolution(oracle.Owner, OracleComponent.SolutionName, out var fountainSol)) + return; + + // Why is this hardcoded? + var amount = MathF.Round(20 + _random.Next(1, 30) + _glimmer.Glimmer / 10f); + var temporarySol = new Solution(); + var reagent = _protoMan.Index(oracle.Comp.RewardReagents).Pick(_random); + + if (_random.Prob(oracle.Comp.AbnormalReagentChance)) + { + var allReagents = _protoMan.EnumeratePrototypes() + .Where(x => !x.Abstract) + .Select(x => x.ID).ToList(); + + reagent = _random.Pick(allReagents); + } + + temporarySol.AddReagent(reagent, amount); + _solutions.TryMixAndOverflow(fountainSol.Value, temporarySol, fountainSol.Value.Comp.Solution.MaxVolume, out var overflowing); + + if (overflowing != null && overflowing.Volume > 0) + _puddles.TrySpillAt(oracle, overflowing, out var _); + } + + private bool NextItem(Entity oracle) + { + oracle.Comp.NextBarkTime = oracle.Comp.NextRejectTime = TimeSpan.Zero; + oracle.Comp.NextDemandTime = _timing.CurTime + oracle.Comp.DemandDelay; + + var protoId = GetDesiredItem(oracle); + if (protoId != null && _protoMan.TryIndex(protoId, out var proto)) + { + oracle.Comp.DesiredPrototype = proto; + return true; + } + + return false; + } + + // TODO: find a way to not just use string literals here (weighted random doesn't support enums) + private string? GetDesiredItem(Entity oracle) + { + var demand = _protoMan.Index(oracle.Comp.DemandTypes).Pick(_random); + + string? proto; + if (demand == "tech" && GetRandomTechProto(oracle, out proto)) + return proto; + + // This is also a fallback for when there's no research server to form an oracle tech request. + if (demand is "plant" or "tech" && GetRandomPlantProto(oracle, out proto)) + return proto; + + return null; + } + + private bool GetRandomTechProto(Entity oracle, [NotNullWhen(true)] out string? proto) + { + // Try to find the most advanced server. + var database = _research.GetServerIds() + .Select(x => _research.TryGetServerById(x, out var serverUid, out _) ? serverUid : null) + .Where(x => x != null && Transform(x.Value).GridUid == Transform(oracle).GridUid) + .Select(x => + { + TryComp(x!.Value, out var comp); + return new Entity(x.Value, comp); + }) + .Where(x => x.Comp != null) + .OrderByDescending(x => + _research.GetDisciplineTiers(x.Comp!).Select(pair => pair.Value).Max()) + .FirstOrDefault(EntityUid.Invalid); + + if (database.Owner == EntityUid.Invalid) + { + Log.Warning($"Cannot find an applicable server on grid {Transform(oracle).GridUid} to form an oracle request."); + proto = null; + return false; + } + + // Select a technology that's either already unlocked, or can be unlocked from current research + var techs = _protoMan.EnumeratePrototypes() + .Where(x => !x.Hidden) + .Where(x => + _research.IsTechnologyUnlocked(database.Owner, x, database.Comp) + || _research.IsTechnologyAvailable(database.Comp!, x)) + .SelectMany(x => x.RecipeUnlocks) + .Select(x => _protoMan.Index(x).Result) + .Where(x => IsDemandValid(oracle, x)) + .ToList(); + + // Unlikely. + if (techs.Count == 0) + { + proto = null; + return false; + } + + proto = _random.Pick(techs); + return true; + } + + private bool GetRandomPlantProto(Entity oracle, [NotNullWhen(true)] out string? proto) + { + var allPlants = _protoMan.EnumeratePrototypes() + .Select(x => x.ProductPrototypes.FirstOrDefault()) + .Where(x => IsDemandValid(oracle, x)) + .ToList(); + + if (allPlants.Count == 0) + { + proto = null; + return false; + } + + proto = _random.Pick(allPlants)!; + return true; + } + + private bool IsDemandValid(Entity oracle, ProtoId? id) + { + if (id == null || oracle.Comp.BlacklistedDemands.Contains(id.Value)) + return false; + + return _protoMan.TryIndex(id, out var proto) && proto.Components.ContainsKey("Item"); + } +} diff --git a/Content.Server/Silicons/Borgs/BorgSystem.Modules.cs b/Content.Server/Silicons/Borgs/BorgSystem.Modules.cs index cc57c34c475..7ede2342428 100644 --- a/Content.Server/Silicons/Borgs/BorgSystem.Modules.cs +++ b/Content.Server/Silicons/Borgs/BorgSystem.Modules.cs @@ -2,6 +2,7 @@ using Content.Shared.Hands.Components; using Content.Shared.Interaction.Components; using Content.Shared.Silicons.Borgs.Components; +using Content.Server.Silicons.Borgs.Components; using Robust.Shared.Containers; namespace Content.Server.Silicons.Borgs; @@ -190,6 +191,10 @@ private void ProvideItems(EntityUid chassis, EntityUid uid, BorgChassisComponent if (!component.ItemsCreated) { item = Spawn(itemProto, xform.Coordinates); + if (TryComp(uid, out var module)) + { + module.JetpackUid = item; + } } else { diff --git a/Content.Server/Silicons/Borgs/Components/BorgJetpackComponent.cs b/Content.Server/Silicons/Borgs/Components/BorgJetpackComponent.cs new file mode 100644 index 00000000000..3a71dd3a501 --- /dev/null +++ b/Content.Server/Silicons/Borgs/Components/BorgJetpackComponent.cs @@ -0,0 +1,12 @@ +using Robust.Shared.GameStates; + +namespace Content.Server.Silicons.Borgs.Components; + +/// +/// Server side indicator for a jetpack module. Used as conditional for inserting in canisters. +/// +[RegisterComponent] +public sealed partial class BorgJetpackComponent : Component +{ + public EntityUid? JetpackUid = null; +} \ No newline at end of file diff --git a/Content.Server/Standing/LayingDownSystem.cs b/Content.Server/Standing/LayingDownSystem.cs index 69787ae8308..73a929fdfc4 100644 --- a/Content.Server/Standing/LayingDownSystem.cs +++ b/Content.Server/Standing/LayingDownSystem.cs @@ -48,7 +48,7 @@ private void OnRefreshMovementSpeed(EntityUid uid, LayingDownComponent component if (TryComp(uid, out var standingState) && standingState.Standing) return; - args.ModifySpeed(component.DownedSpeedMultiplier, component.DownedSpeedMultiplier); + args.ModifySpeed(component.DownedSpeedMultiplier, component.DownedSpeedMultiplier, bypassImmunity: true); } private void OnParentChanged(EntityUid uid, LayingDownComponent component, EntParentChangedMessage args) diff --git a/Content.Server/Nyanotrasen/StationEvents/Components/FreeProberRuleComponent.cs b/Content.Server/StationEvents/Components/FreeProberRuleComponent.cs similarity index 100% rename from Content.Server/Nyanotrasen/StationEvents/Components/FreeProberRuleComponent.cs rename to Content.Server/StationEvents/Components/FreeProberRuleComponent.cs diff --git a/Content.Server/Nyanotrasen/StationEvents/Components/GlimmerEventComponent.cs b/Content.Server/StationEvents/Components/GlimmerEventComponent.cs similarity index 100% rename from Content.Server/Nyanotrasen/StationEvents/Components/GlimmerEventComponent.cs rename to Content.Server/StationEvents/Components/GlimmerEventComponent.cs diff --git a/Content.Server/Nyanotrasen/StationEvents/Components/GlimmerRandomSentienceRuleComponent.cs b/Content.Server/StationEvents/Components/GlimmerRandomSentienceRuleComponent.cs similarity index 100% rename from Content.Server/Nyanotrasen/StationEvents/Components/GlimmerRandomSentienceRuleComponent.cs rename to Content.Server/StationEvents/Components/GlimmerRandomSentienceRuleComponent.cs diff --git a/Content.Server/Nyanotrasen/StationEvents/Components/GlimmerRevenantSpawnRuleComponent.cs b/Content.Server/StationEvents/Components/GlimmerRevenantSpawnRuleComponent.cs similarity index 100% rename from Content.Server/Nyanotrasen/StationEvents/Components/GlimmerRevenantSpawnRuleComponent.cs rename to Content.Server/StationEvents/Components/GlimmerRevenantSpawnRuleComponent.cs diff --git a/Content.Server/Nyanotrasen/StationEvents/Components/GlimmerWispRuleComponent.cs b/Content.Server/StationEvents/Components/GlimmerWispRuleComponent.cs similarity index 100% rename from Content.Server/Nyanotrasen/StationEvents/Components/GlimmerWispRuleComponent.cs rename to Content.Server/StationEvents/Components/GlimmerWispRuleComponent.cs diff --git a/Content.Server/Nyanotrasen/StationEvents/Components/MassMindSwapRuleComponent.cs b/Content.Server/StationEvents/Components/MassMindSwapRuleComponent.cs similarity index 100% rename from Content.Server/Nyanotrasen/StationEvents/Components/MassMindSwapRuleComponent.cs rename to Content.Server/StationEvents/Components/MassMindSwapRuleComponent.cs diff --git a/Content.Server/Nyanotrasen/StationEvents/Components/MundaneDischargeRuleComponent.cs b/Content.Server/StationEvents/Components/MundaneDischargeRuleComponent.cs similarity index 100% rename from Content.Server/Nyanotrasen/StationEvents/Components/MundaneDischargeRuleComponent.cs rename to Content.Server/StationEvents/Components/MundaneDischargeRuleComponent.cs diff --git a/Content.Server/Nyanotrasen/StationEvents/Components/NoosphericFryRuleComponent.cs b/Content.Server/StationEvents/Components/NoosphericFryRuleComponent.cs similarity index 100% rename from Content.Server/Nyanotrasen/StationEvents/Components/NoosphericFryRuleComponent.cs rename to Content.Server/StationEvents/Components/NoosphericFryRuleComponent.cs diff --git a/Content.Server/Nyanotrasen/StationEvents/Components/NoosphericStormRuleComponent.cs b/Content.Server/StationEvents/Components/NoosphericStormRuleComponent.cs similarity index 100% rename from Content.Server/Nyanotrasen/StationEvents/Components/NoosphericStormRuleComponent.cs rename to Content.Server/StationEvents/Components/NoosphericStormRuleComponent.cs diff --git a/Content.Server/Nyanotrasen/StationEvents/Components/NoosphericZapRuleComponent.cs b/Content.Server/StationEvents/Components/NoosphericZapRuleComponent.cs similarity index 100% rename from Content.Server/Nyanotrasen/StationEvents/Components/NoosphericZapRuleComponent.cs rename to Content.Server/StationEvents/Components/NoosphericZapRuleComponent.cs diff --git a/Content.Server/Nyanotrasen/StationEvents/Components/PsionicCatGotYourTongueRuleComponent.cs b/Content.Server/StationEvents/Components/PsionicCatGotYourTongueRuleComponent.cs similarity index 100% rename from Content.Server/Nyanotrasen/StationEvents/Components/PsionicCatGotYourTongueRuleComponent.cs rename to Content.Server/StationEvents/Components/PsionicCatGotYourTongueRuleComponent.cs diff --git a/Content.Server/StationEvents/Components/RampingStationEventSchedulerComponent.cs b/Content.Server/StationEvents/Components/RampingStationEventSchedulerComponent.cs index 673c82b20f6..282ee5b612a 100644 --- a/Content.Server/StationEvents/Components/RampingStationEventSchedulerComponent.cs +++ b/Content.Server/StationEvents/Components/RampingStationEventSchedulerComponent.cs @@ -4,50 +4,38 @@ public sealed partial class RampingStationEventSchedulerComponent : Component { /// - /// Multiplies the End Time of the Ramping Event curve. Lower this number for shorter, hectic shifts, increase this number for longer shifts. + /// The maximum number by which the event rate will be multiplied when shift time reaches the end time. /// [DataField] - public float ShiftChaosModifier = 1f; + public float ChaosModifier = 3f; /// - /// The number by which all event delays will be multiplied. Unlike chaos, remains constant throughout the shift. + /// The minimum number by which the event rate will be multiplied when the shift has just begun. /// [DataField] - public float EventDelayModifier = 1f; - + public float StartingChaosRatio = 0.1f; /// - /// Shift Length(in Minutes) is directly reduced by this value. - /// - [DataField] - public float ShiftLengthOffset = 0f; - - /// - /// Minimum time between events is decreased by this value. + /// The number by which all event delays will be multiplied. Unlike chaos, remains constant throughout the shift. /// [DataField] - public float MinimumEventTimeOffset = 0f; + public float EventDelayModifier = 1f; /// - /// Maximum time between events is decreased by this value. + /// The number by which average expected shift length is multiplied. Higher values lead to slower chaos growth. /// - - [DataField] - public float MaximumEventTimeOffset = 0f; - - [DataField] - public bool IgnoreMinimumTimes = false; + public float ShiftLengthModifier = 1f; // Everything below is overridden in the RampingStationEventSchedulerSystem based on CVars - [DataField] + [DataField("endTime"), ViewVariables(VVAccess.ReadWrite)] public float EndTime; - [DataField] + [DataField("maxChaos"), ViewVariables(VVAccess.ReadWrite)] public float MaxChaos; - [DataField] + [DataField("startingChaos"), ViewVariables(VVAccess.ReadWrite)] public float StartingChaos; - [DataField] + [DataField("timeUntilNextEvent"), ViewVariables(VVAccess.ReadWrite)] public float TimeUntilNextEvent; } diff --git a/Content.Server/StationEvents/EventManagerSystem.cs b/Content.Server/StationEvents/EventManagerSystem.cs index 261e8ca46dd..2d8606e9293 100644 --- a/Content.Server/StationEvents/EventManagerSystem.cs +++ b/Content.Server/StationEvents/EventManagerSystem.cs @@ -162,7 +162,7 @@ public TimeSpan TimeSinceLastEvent(EntityPrototype stationEvent) private bool CanRun(EntityPrototype prototype, StationEventComponent stationEvent, int playerCount, TimeSpan currentTime) { - if (GameTicker.IsGameRuleActive(prototype.ID)) + if (GameTicker.IsGameRuleAdded(prototype.ID)) return false; if (stationEvent.MaxOccurrences.HasValue && GetOccurrences(prototype) >= stationEvent.MaxOccurrences.Value) diff --git a/Content.Server/Nyanotrasen/StationEvents/Events/FreeProberRule.cs b/Content.Server/StationEvents/Events/FreeProberRule.cs similarity index 100% rename from Content.Server/Nyanotrasen/StationEvents/Events/FreeProberRule.cs rename to Content.Server/StationEvents/Events/FreeProberRule.cs diff --git a/Content.Server/Nyanotrasen/StationEvents/Events/GlimmerEventSystem.cs b/Content.Server/StationEvents/Events/GlimmerEventSystem.cs similarity index 100% rename from Content.Server/Nyanotrasen/StationEvents/Events/GlimmerEventSystem.cs rename to Content.Server/StationEvents/Events/GlimmerEventSystem.cs diff --git a/Content.Server/Nyanotrasen/StationEvents/Events/GlimmerRandomSentienceRule.cs b/Content.Server/StationEvents/Events/GlimmerRandomSentienceRule.cs similarity index 100% rename from Content.Server/Nyanotrasen/StationEvents/Events/GlimmerRandomSentienceRule.cs rename to Content.Server/StationEvents/Events/GlimmerRandomSentienceRule.cs diff --git a/Content.Server/Nyanotrasen/StationEvents/Events/GlimmerRevenantSpawnRule.cs b/Content.Server/StationEvents/Events/GlimmerRevenantSpawnRule.cs similarity index 100% rename from Content.Server/Nyanotrasen/StationEvents/Events/GlimmerRevenantSpawnRule.cs rename to Content.Server/StationEvents/Events/GlimmerRevenantSpawnRule.cs diff --git a/Content.Server/Nyanotrasen/StationEvents/Events/GlimmerWispSpawnRule.cs b/Content.Server/StationEvents/Events/GlimmerWispSpawnRule.cs similarity index 100% rename from Content.Server/Nyanotrasen/StationEvents/Events/GlimmerWispSpawnRule.cs rename to Content.Server/StationEvents/Events/GlimmerWispSpawnRule.cs diff --git a/Content.Server/Nyanotrasen/StationEvents/Events/MassMindSwapRule.cs b/Content.Server/StationEvents/Events/MassMindSwapRule.cs similarity index 100% rename from Content.Server/Nyanotrasen/StationEvents/Events/MassMindSwapRule.cs rename to Content.Server/StationEvents/Events/MassMindSwapRule.cs diff --git a/Content.Server/Nyanotrasen/StationEvents/Events/MundaneDischargeRule.cs b/Content.Server/StationEvents/Events/MundaneDischargeRule.cs similarity index 100% rename from Content.Server/Nyanotrasen/StationEvents/Events/MundaneDischargeRule.cs rename to Content.Server/StationEvents/Events/MundaneDischargeRule.cs diff --git a/Content.Server/Nyanotrasen/StationEvents/Events/NoosphericFryRule.cs b/Content.Server/StationEvents/Events/NoosphericFryRule.cs similarity index 100% rename from Content.Server/Nyanotrasen/StationEvents/Events/NoosphericFryRule.cs rename to Content.Server/StationEvents/Events/NoosphericFryRule.cs diff --git a/Content.Server/Nyanotrasen/StationEvents/Events/NoosphericStormRule.cs b/Content.Server/StationEvents/Events/NoosphericStormRule.cs similarity index 100% rename from Content.Server/Nyanotrasen/StationEvents/Events/NoosphericStormRule.cs rename to Content.Server/StationEvents/Events/NoosphericStormRule.cs diff --git a/Content.Server/Nyanotrasen/StationEvents/Events/NoosphericZapRule.cs b/Content.Server/StationEvents/Events/NoosphericZapRule.cs similarity index 100% rename from Content.Server/Nyanotrasen/StationEvents/Events/NoosphericZapRule.cs rename to Content.Server/StationEvents/Events/NoosphericZapRule.cs diff --git a/Content.Server/Nyanotrasen/StationEvents/Events/PsionicCatGotYourTongueRule.cs b/Content.Server/StationEvents/Events/PsionicCatGotYourTongueRule.cs similarity index 100% rename from Content.Server/Nyanotrasen/StationEvents/Events/PsionicCatGotYourTongueRule.cs rename to Content.Server/StationEvents/Events/PsionicCatGotYourTongueRule.cs diff --git a/Content.Server/StationEvents/RampingStationEventSchedulerSystem.cs b/Content.Server/StationEvents/RampingStationEventSchedulerSystem.cs index e24578fdac9..aa0c9b214b4 100644 --- a/Content.Server/StationEvents/RampingStationEventSchedulerSystem.cs +++ b/Content.Server/StationEvents/RampingStationEventSchedulerSystem.cs @@ -2,10 +2,10 @@ using Content.Server.GameTicking.Rules; using Content.Server.GameTicking.Rules.Components; using Content.Server.StationEvents.Components; +using Content.Server.StationEvents.Events; using Content.Shared.CCVar; using Robust.Shared.Configuration; using Robust.Shared.Random; -using Robust.Shared.Utility; namespace Content.Server.StationEvents; @@ -16,35 +16,30 @@ public sealed class RampingStationEventSchedulerSystem : GameRuleSystem - /// A logistic curve equation used to smooth out the transition between event times at shift start, vs. shift end. - /// Depending on the settings used, the end time might not necessarily be the point at which timers hit the floor. - /// It is after all, an asymptote. - /// - /// - /// - /// - /// - public float RampingEventTimeEquation(RampingStationEventSchedulerComponent component, float startTime, float endTimeOffset = 0) + public float GetChaosModifier(EntityUid uid, RampingStationEventSchedulerComponent component) { - var endTime = Math.Clamp(endTimeOffset, 0.1f, startTime - 1); - var shiftLength = Math.Max(1, _cfg.GetCVar(CCVars.EventsRampingAverageEndTime) - component.ShiftLengthOffset); - return 2 * endTime - / (1 - + MathF.Exp(_cfg.GetCVar(CCVars.EventsRampingAverageChaos) - * component.ShiftChaosModifier - / shiftLength - * endTime - * (float) _gameTicker.RoundDuration().TotalSeconds - / 60)) - + (startTime - endTime); + var roundTime = (float) _gameTicker.RoundDuration().TotalSeconds; + if (roundTime > component.EndTime) + return component.MaxChaos; + + return component.MaxChaos / component.EndTime * roundTime + component.StartingChaos; } protected override void Started(EntityUid uid, RampingStationEventSchedulerComponent component, GameRuleComponent gameRule, GameRuleStartedEvent args) { base.Started(uid, component, gameRule, args); - PickNextEventTime(component); + var avgChaos = _cfg.GetCVar(CCVars.EventsRampingAverageChaos) * component.ChaosModifier; + var avgTime = _cfg.GetCVar(CCVars.EventsRampingAverageEndTime) * component.ShiftLengthModifier; + + // Worlds shittiest probability distribution + // Got a complaint? Send them to + component.MaxChaos = avgChaos * _random.NextFloat(0.75f, 1.25f); + // This is in minutes, so *60 for seconds (for the chaos calc) + component.EndTime = avgTime * _random.NextFloat(0.75f, 1.25f) * 60f; + component.StartingChaos = component.MaxChaos * component.StartingChaosRatio; + + PickNextEventTime(uid, component); } public override void Update(float frameTime) @@ -66,31 +61,17 @@ public override void Update(float frameTime) return; } - PickNextEventTime(scheduler); + PickNextEventTime(uid, scheduler); _event.RunRandomEvent(); } } - private void PickNextEventTime(RampingStationEventSchedulerComponent component) + private void PickNextEventTime(EntityUid uid, RampingStationEventSchedulerComponent component) { - // In case of server hosts being silly and setting maximum time to be lower than minimum time, sanity check the scheduler inputs and sort them by Min/Max - var minimumTime = MathF.Min(_cfg.GetCVar(CCVars.GameEventsRampingMinimumTime) - - _cfg.GetCVar(CCVars.GameEventsRampingMinimumTimeOffset) - - component.MinimumEventTimeOffset, _cfg.GetCVar(CCVars.GameEventsRampingMaximumTime) - - _cfg.GetCVar(CCVars.GameEventsRampingMaximumTimeOffset) - - component.MaximumEventTimeOffset); - - var maximumTime = MathF.Max(_cfg.GetCVar(CCVars.GameEventsRampingMinimumTime) - - _cfg.GetCVar(CCVars.GameEventsRampingMinimumTimeOffset) - - component.MinimumEventTimeOffset, _cfg.GetCVar(CCVars.GameEventsRampingMaximumTime) - - _cfg.GetCVar(CCVars.GameEventsRampingMaximumTimeOffset) - - component.MaximumEventTimeOffset); - - // Just in case someone messed up their math, set it to between 6 and 12 seconds. This absolutely isn't ideal component.TimeUntilNextEvent = _random.NextFloat( - RampingEventTimeEquation(component, MathF.Max(0.1f, minimumTime)), - RampingEventTimeEquation(component, MathF.Max(0.2f, maximumTime))); + _cfg.GetCVar(CCVars.GameEventsRampingMinimumTime), + _cfg.GetCVar(CCVars.GameEventsRampingMaximumTime)); - component.TimeUntilNextEvent *= component.EventDelayModifier; + component.TimeUntilNextEvent *= component.EventDelayModifier / GetChaosModifier(uid, component); } } diff --git a/Content.Server/Supermatter/Systems/SupermatterSystem.Processing.cs b/Content.Server/Supermatter/Systems/SupermatterSystem.Processing.cs new file mode 100644 index 00000000000..7a62eba6f7d --- /dev/null +++ b/Content.Server/Supermatter/Systems/SupermatterSystem.Processing.cs @@ -0,0 +1,412 @@ +using Content.Shared.Atmos; +using Content.Shared.Radiation.Components; +using Content.Shared.Supermatter.Components; +using System.Text; +using Content.Shared.Chat; +using System.Linq; +using Content.Shared.Audio; +using Content.Shared.CCVar; + +namespace Content.Server.Supermatter.Systems; + +public sealed partial class SupermatterSystem +{ + /// + /// Handle power and radiation output depending on atmospheric things. + /// + private void ProcessAtmos(EntityUid uid, SupermatterComponent sm) + { + var mix = _atmosphere.GetContainingMixture(uid, true, true); + + if (mix is not { }) + return; + + var absorbedGas = mix.Remove(sm.GasEfficiency * mix.TotalMoles); + var moles = absorbedGas.TotalMoles; + + if (!(moles > 0f)) + return; + + var gases = sm.GasStorage; + var facts = sm.GasDataFields; + + // Lets get the proportions of the gasses in the mix for scaling stuff later + // They range between 0 and 1 + gases = gases.ToDictionary( + gas => gas.Key, + gas => Math.Clamp(absorbedGas.GetMoles(gas.Key) / moles, 0, 1) + ); + + // No less then zero, and no greater then one, we use this to do explosions and heat to power transfer. + var powerRatio = gases.Sum(gas => gases[gas.Key] * facts[gas.Key].PowerMixRatio); + + // Minimum value of -10, maximum value of 23. Affects plasma, o2 and heat output. + var heatModifier = gases.Sum(gas => gases[gas.Key] * facts[gas.Key].HeatPenalty); + + // Minimum value of -10, maximum value of 23. Affects plasma, o2 and heat output. + var transmissionBonus = gases.Sum(gas => gases[gas.Key] * facts[gas.Key].TransmitModifier); + + var h2OBonus = 1 - gases[Gas.WaterVapor] * 0.25f; + + powerRatio = Math.Clamp(powerRatio, 0, 1); + heatModifier = Math.Max(heatModifier, 0.5f); + transmissionBonus *= h2OBonus; + + // Effects the damage heat does to the crystal + sm.DynamicHeatResistance = 1f; + + // More moles of gases are harder to heat than fewer, so let's scale heat damage around them + sm.MoleHeatPenaltyThreshold = (float) Math.Max(moles * sm.MoleHeatPenalty, 0.25); + + // Ramps up or down in increments of 0.02 up to the proportion of CO2 + // Given infinite time, powerloss_dynamic_scaling = co2comp + // Some value from 0-1 + if (moles > sm.PowerlossInhibitionMoleThreshold && gases[Gas.CarbonDioxide] > sm.PowerlossInhibitionGasThreshold) + { + var co2powerloss = Math.Clamp(gases[Gas.CarbonDioxide] - sm.PowerlossDynamicScaling, -0.02f, 0.02f); + sm.PowerlossDynamicScaling = Math.Clamp(sm.PowerlossDynamicScaling + co2powerloss, 0f, 1f); + } + else + sm.PowerlossDynamicScaling = Math.Clamp(sm.PowerlossDynamicScaling - 0.05f, 0f, 1f); + + // Ranges from 0~1(1 - (0~1 * 1~(1.5 * (mol / 500)))) + // We take the mol count, and scale it to be our inhibitor + var powerlossInhibitor = + Math.Clamp( + 1 + - sm.PowerlossDynamicScaling + * Math.Clamp( + moles / sm.PowerlossInhibitionMoleBoostThreshold, + 1f, 1.5f), + 0f, 1f); + + if (sm.MatterPower != 0) // We base our removed power off 1/10 the matter_power. + { + var removedMatter = Math.Max(sm.MatterPower / sm.MatterPowerConversion, 40); + // Adds at least 40 power + sm.Power = Math.Max(sm.Power + removedMatter, 0); + // Removes at least 40 matter power + sm.MatterPower = Math.Max(sm.MatterPower - removedMatter, 0); + } + + // Based on gas mix, makes the power more based on heat or less effected by heat + var tempFactor = powerRatio > 0.8 ? 50f : 30f; + + // If there is more pluox and N2 then anything else, we receive no power increase from heat + sm.Power = Math.Max(absorbedGas.Temperature * tempFactor / Atmospherics.T0C * powerRatio + sm.Power, 0); + + // Irradiate stuff + if (TryComp(uid, out var rad)) + rad.Intensity = + sm.Power + * Math.Max(0, 1f + transmissionBonus / 10f) + * 0.003f + * _config.GetCVar(CCVars.SupermatterRadsModifier); + + // Power * 0.55 * 0.8~1 + var energy = sm.Power * sm.ReactionPowerModifier; + + // Keep in mind we are only adding this temperature to (efficiency)% of the one tile the rock is on. + // An increase of 4°C at 25% efficiency here results in an increase of 1°C / (#tilesincore) overall. + // Power * 0.55 * 1.5~23 / 5 + absorbedGas.Temperature += energy * heatModifier * sm.ThermalReleaseModifier; + absorbedGas.Temperature = Math.Max(0, + Math.Min(absorbedGas.Temperature, sm.HeatThreshold * heatModifier)); + + // Release the waste + absorbedGas.AdjustMoles(Gas.Plasma, Math.Max(energy * heatModifier * sm.PlasmaReleaseModifier, 0f)); + absorbedGas.AdjustMoles(Gas.Oxygen, Math.Max((energy + absorbedGas.Temperature * heatModifier - Atmospherics.T0C) * sm.OxygenReleaseEfficiencyModifier, 0f)); + + _atmosphere.Merge(mix, absorbedGas); + + var powerReduction = (float) Math.Pow(sm.Power / 500, 3); + + // After this point power is lowered + // This wraps around to the begining of the function + sm.Power = Math.Max(sm.Power - Math.Min(powerReduction * powerlossInhibitor, sm.Power * 0.83f * powerlossInhibitor), 0f); + } + + /// + /// Shoot lightning bolts depensing on accumulated power. + /// + private void SupermatterZap(EntityUid uid, SupermatterComponent sm) + { + // Divide power by its' threshold to get a value from 0-1, then multiply by the amount of possible lightnings + var zapPower = sm.Power / sm.PowerPenaltyThreshold * sm.LightningPrototypes.Length; + var zapPowerNorm = (int) Math.Clamp(zapPower, 0, sm.LightningPrototypes.Length - 1); + _lightning.ShootRandomLightnings(uid, 3.5f, sm.Power > sm.PowerPenaltyThreshold ? 3 : 1, sm.LightningPrototypes[zapPowerNorm]); + } + + /// + /// Handles environmental damage. + /// + private void HandleDamage(EntityUid uid, SupermatterComponent sm) + { + var xform = Transform(uid); + var indices = _xform.GetGridOrMapTilePosition(uid, xform); + + sm.DamageArchived = sm.Damage; + + var mix = _atmosphere.GetContainingMixture(uid, true, true); + + // We're in space or there is no gas to process + if (!xform.GridUid.HasValue || mix is not { } || mix.TotalMoles == 0f) + { + sm.Damage += Math.Max(sm.Power / 1000 * sm.DamageIncreaseMultiplier, 0.1f); + return; + } + + // Absorbed gas from surrounding area + var absorbedGas = mix.Remove(sm.GasEfficiency * mix.TotalMoles); + var moles = absorbedGas.TotalMoles; + + var totalDamage = 0f; + + var tempThreshold = Atmospherics.T0C + sm.HeatPenaltyThreshold; + + // Temperature start to have a positive effect on damage after 350 + var tempDamage = + Math.Max( + Math.Clamp(moles / 200f, .5f, 1f) + * absorbedGas.Temperature + - tempThreshold + * sm.DynamicHeatResistance, + 0f) + * sm.MoleHeatThreshold + / 150f + * sm.DamageIncreaseMultiplier; + totalDamage += tempDamage; + + // Power only starts affecting damage when it is above 5000 + var powerDamage = Math.Max(sm.Power - sm.PowerPenaltyThreshold, 0f) / 500f * sm.DamageIncreaseMultiplier; + totalDamage += powerDamage; + + // Mol count only starts affecting damage when it is above 1800 + var moleDamage = Math.Max(moles - sm.MolePenaltyThreshold, 0) / 80 * sm.DamageIncreaseMultiplier; + totalDamage += moleDamage; + + // Healing damage + if (moles < sm.MolePenaltyThreshold) + { + // There's a very small float so that it doesn't divide by 0 + var healHeatDamage = Math.Min(absorbedGas.Temperature - tempThreshold, 0.001f) / 150; + totalDamage += healHeatDamage; + } + + // Check for space tiles next to SM + //TODO: Change moles out for checking if adjacent tiles exist + var enumerator = _atmosphere.GetAdjacentTileMixtures(xform.GridUid.Value, indices, false, false); + while (enumerator.MoveNext(out var ind)) + { + if (ind.TotalMoles != 0) + continue; + + var integrity = GetIntegrity(sm); + + var factor = integrity switch + { + < 10 => 0.0005f, + < 25 => 0.0009f, + < 45 => 0.005f, + < 75 => 0.002f, + _ => 0f + }; + + totalDamage += Math.Clamp(sm.Power * factor * sm.DamageIncreaseMultiplier, 0, sm.MaxSpaceExposureDamage); + + break; + } + + var damage = Math.Min(sm.DamageArchived + sm.DamageHardcap * sm.DamageDelaminationPoint, totalDamage); + + // Prevent it from going negative + sm.Damage = Math.Clamp(damage, 0, float.PositiveInfinity); + } + + /// + /// Handles core damage announcements + /// + private void AnnounceCoreDamage(EntityUid uid, SupermatterComponent sm) + { + var message = string.Empty; + var global = false; + + var integrity = GetIntegrity(sm).ToString("0.00"); + + // Special cases + if (sm.Damage < sm.DamageDelaminationPoint && sm.Delamming) + { + message = Loc.GetString("supermatter-delam-cancel", ("integrity", integrity)); + sm.DelamAnnounced = false; + global = true; + } + + if (sm.Delamming && !sm.DelamAnnounced) + { + var sb = new StringBuilder(); + var loc = string.Empty; + + switch (sm.PreferredDelamType) + { + case DelamType.Cascade: loc = "supermatter-delam-cascade"; break; + case DelamType.Singulo: loc = "supermatter-delam-overmass"; break; + case DelamType.Tesla: loc = "supermatter-delam-tesla"; break; + default: loc = "supermatter-delam-explosion"; break; + } + + var station = _station.GetOwningStation(uid); + if (station != null) + _alert.SetLevel((EntityUid) station, sm.AlertCodeDeltaId, true, true, true, false); + + sb.AppendLine(Loc.GetString(loc)); + sb.AppendLine(Loc.GetString("supermatter-seconds-before-delam", ("seconds", sm.DelamTimer))); + + message = sb.ToString(); + global = true; + sm.DelamAnnounced = true; + + SendSupermatterAnnouncement(uid, message, global); + return; + } + + // Ignore the 0% integrity alarm + if (sm.Delamming) + return; + + // We are not taking consistent damage, Engineers aren't needed + if (sm.Damage <= sm.DamageArchived) + return; + + if (sm.Damage >= sm.DamageWarningThreshold) + { + message = Loc.GetString("supermatter-warning", ("integrity", integrity)); + if (sm.Damage >= sm.DamageEmergencyThreshold) + { + message = Loc.GetString("supermatter-emergency", ("integrity", integrity)); + global = true; + } + } + + SendSupermatterAnnouncement(uid, message, global); + } + + /// If true, sends a station announcement + /// Localisation string for a custom announcer name + public void SendSupermatterAnnouncement(EntityUid uid, string message, bool global = false, string? customSender = null) + { + if (global) + { + var sender = Loc.GetString(customSender != null ? customSender : "supermatter-announcer"); + _chat.DispatchStationAnnouncement(uid, message, sender, colorOverride: Color.Yellow); + return; + } + + _chat.TrySendInGameICMessage(uid, message, InGameICChatType.Speak, hideChat: false, checkRadioPrefix: true); + } + + /// + /// Returns the integrity rounded to hundreds, e.g. 100.00% + /// + public float GetIntegrity(SupermatterComponent sm) + { + var integrity = sm.Damage / sm.DamageDelaminationPoint; + integrity = (float) Math.Round(100 - integrity * 100, 2); + integrity = integrity < 0 ? 0 : integrity; + return integrity; + } + + /// + /// Decide on how to delaminate. + /// + public DelamType ChooseDelamType(EntityUid uid, SupermatterComponent sm) + { + if (_config.GetCVar(CCVars.SupermatterDoForceDelam)) + return _config.GetCVar(CCVars.SupermatterForcedDelamType); + + var mix = _atmosphere.GetContainingMixture(uid, true, true); + + if (mix is { }) + { + var absorbedGas = mix.Remove(sm.GasEfficiency * mix.TotalMoles); + var moles = absorbedGas.TotalMoles; + + if (_config.GetCVar(CCVars.SupermatterDoSingulooseDelam) + && moles >= sm.MolePenaltyThreshold * _config.GetCVar(CCVars.SupermatterSingulooseMolesModifier)) + return DelamType.Singulo; + } + + if (_config.GetCVar(CCVars.SupermatterDoTeslooseDelam) + && sm.Power >= sm.PowerPenaltyThreshold * _config.GetCVar(CCVars.SupermatterTesloosePowerModifier)) + return DelamType.Tesla; + + //TODO: Add resonance cascade when there's crazy conditions or a destabilizing crystal + + return DelamType.Explosion; + } + + /// + /// Handle the end of the station. + /// + private void HandleDelamination(EntityUid uid, SupermatterComponent sm) + { + var xform = Transform(uid); + + sm.PreferredDelamType = ChooseDelamType(uid, sm); + + if (!sm.Delamming) + { + sm.Delamming = true; + AnnounceCoreDamage(uid, sm); + } + + if (sm.Damage < sm.DamageDelaminationPoint && sm.Delamming) + { + sm.Delamming = false; + AnnounceCoreDamage(uid, sm); + } + + sm.DelamTimerAccumulator++; + + if (sm.DelamTimerAccumulator < sm.DelamTimer) + return; + + switch (sm.PreferredDelamType) + { + case DelamType.Cascade: + Spawn(sm.KudzuSpawnPrototype, xform.Coordinates); + break; + + case DelamType.Singulo: + Spawn(sm.SingularitySpawnPrototype, xform.Coordinates); + break; + + case DelamType.Tesla: + Spawn(sm.TeslaSpawnPrototype, xform.Coordinates); + break; + + default: + _explosion.TriggerExplosive(uid); + break; + } + } + + /// + /// Swaps out ambience sounds when the SM is delamming or not. + /// + private void HandleSoundLoop(EntityUid uid, SupermatterComponent sm) + { + var ambient = Comp(uid); + + if (ambient == null) + return; + + if (sm.Delamming && sm.CurrentSoundLoop != sm.DelamSound) + sm.CurrentSoundLoop = sm.DelamSound; + + else if (!sm.Delamming && sm.CurrentSoundLoop != sm.CalmSound) + sm.CurrentSoundLoop = sm.CalmSound; + + if (ambient.Sound != sm.CurrentSoundLoop) + _ambient.SetSound(uid, sm.CurrentSoundLoop, ambient); + } +} \ No newline at end of file diff --git a/Content.Server/Supermatter/Systems/SupermatterSystem.cs b/Content.Server/Supermatter/Systems/SupermatterSystem.cs new file mode 100644 index 00000000000..3d86f57fb84 --- /dev/null +++ b/Content.Server/Supermatter/Systems/SupermatterSystem.cs @@ -0,0 +1,212 @@ +using Robust.Shared.Audio.Systems; +using Robust.Shared.Configuration; +using Robust.Shared.Containers; +using Robust.Shared.Physics; +using Robust.Shared.Physics.Events; +using Robust.Server.GameObjects; +using Content.Shared.Atmos; +using Content.Shared.Interaction; +using Content.Shared.Projectiles; +using Content.Shared.Mobs.Components; +using Content.Server.Atmos.EntitySystems; +using Content.Server.Chat.Systems; +using Content.Server.Explosion.EntitySystems; +using Content.Shared.Supermatter.Components; +using Content.Server.Lightning; +using Content.Server.AlertLevel; +using Content.Server.Station.Systems; +using Content.Server.Kitchen.Components; +using Content.Shared.DoAfter; +using Content.Shared.Examine; +using Content.Server.DoAfter; +using Content.Server.Popups; +using Content.Shared.Audio; + +namespace Content.Server.Supermatter.Systems; + +public sealed partial class SupermatterSystem : EntitySystem +{ + [Dependency] private readonly AtmosphereSystem _atmosphere = default!; + [Dependency] private readonly ChatSystem _chat = default!; + [Dependency] private readonly SharedContainerSystem _container = default!; + [Dependency] private readonly ExplosionSystem _explosion = default!; + [Dependency] private readonly TransformSystem _xform = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] private readonly SharedAmbientSoundSystem _ambient = default!; + [Dependency] private readonly LightningSystem _lightning = default!; + [Dependency] private readonly AlertLevelSystem _alert = default!; + [Dependency] private readonly StationSystem _station = default!; + [Dependency] private readonly DoAfterSystem _doAfter = default!; + [Dependency] private readonly SharedTransformSystem _transform = default!; + [Dependency] private readonly PopupSystem _popup = default!; + [Dependency] private readonly IConfigurationManager _config = default!; + + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnMapInit); + + SubscribeLocalEvent(OnCollideEvent); + SubscribeLocalEvent(OnHandInteract); + SubscribeLocalEvent(OnItemInteract); + SubscribeLocalEvent(OnExamine); + SubscribeLocalEvent(OnGetSliver); + } + + + public override void Update(float frameTime) + { + base.Update(frameTime); + + foreach (var sm in EntityManager.EntityQuery()) + { + if (!sm.Activated) + return; + + var uid = sm.Owner; + sm.UpdateAccumulator += frameTime; + + if (sm.UpdateAccumulator >= sm.UpdateTimer) + { + sm.UpdateAccumulator -= sm.UpdateTimer; + Cycle(uid, sm); + } + } + } + + + public void Cycle(EntityUid uid, SupermatterComponent sm) + { + sm.ZapAccumulator++; + sm.YellAccumulator++; + + ProcessAtmos(uid, sm); + HandleDamage(uid, sm); + + if (sm.Damage >= sm.DamageDelaminationPoint || sm.Delamming) + HandleDelamination(uid, sm); + + HandleSoundLoop(uid, sm); + + if (sm.ZapAccumulator >= sm.ZapTimer) + { + sm.ZapAccumulator -= sm.ZapTimer; + SupermatterZap(uid, sm); + } + + if (sm.YellAccumulator >= sm.YellTimer) + { + sm.YellAccumulator -= sm.YellTimer; + AnnounceCoreDamage(uid, sm); + } + } + + private void OnMapInit(EntityUid uid, SupermatterComponent sm, MapInitEvent args) + { + // Set the Sound + _ambient.SetAmbience(uid, true); + + // Add Air to the initialized SM in the Map so it doesn't delam on its' own + var mix = _atmosphere.GetContainingMixture(uid, true, true); + mix?.AdjustMoles(Gas.Oxygen, Atmospherics.OxygenMolesStandard); + mix?.AdjustMoles(Gas.Nitrogen, Atmospherics.NitrogenMolesStandard); + } + + private void OnCollideEvent(EntityUid uid, SupermatterComponent sm, ref StartCollideEvent args) + { + if (!sm.Activated) + sm.Activated = true; + + var target = args.OtherEntity; + if (args.OtherBody.BodyType == BodyType.Static + || HasComp(target) + || _container.IsEntityInContainer(uid)) + return; + + if (!HasComp(target)) + { + EntityManager.SpawnEntity(sm.CollisionResultPrototype, Transform(target).Coordinates); + _audio.PlayPvs(sm.DustSound, uid); + sm.Power += args.OtherBody.Mass; + } + + EntityManager.QueueDeleteEntity(target); + + if (TryComp(target, out var food)) + sm.Power += food.Energy; + else if (TryComp(target, out var projectile)) + sm.Power += (float) projectile.Damage.GetTotal(); + else + sm.Power++; + + sm.MatterPower += HasComp(target) ? 200 : 0; + } + + private void OnHandInteract(EntityUid uid, SupermatterComponent sm, ref InteractHandEvent args) + { + if (!sm.Activated) + sm.Activated = true; + + var target = args.User; + + if (HasComp(target)) + return; + + sm.MatterPower += 200; + + EntityManager.SpawnEntity(sm.CollisionResultPrototype, Transform(target).Coordinates); + _audio.PlayPvs(sm.DustSound, uid); + EntityManager.QueueDeleteEntity(target); + } + + private void OnItemInteract(EntityUid uid, SupermatterComponent sm, ref InteractUsingEvent args) + { + if (!sm.Activated) + sm.Activated = true; + + if (sm.SliverRemoved) + return; + + if (!HasComp(args.Used)) + return; + + var dae = new DoAfterArgs(EntityManager, args.User, 30f, new SupermatterDoAfterEvent(), args.Target) + { + BreakOnDamage = true, + BreakOnHandChange = false, + BreakOnTargetMove = true, + BreakOnUserMove = true, + BreakOnWeightlessMove = false, + NeedHand = true, + RequireCanInteract = true, + }; + + _doAfter.TryStartDoAfter(dae); + _popup.PopupClient(Loc.GetString("supermatter-tamper-begin"), uid, args.User); + } + + private void OnGetSliver(EntityUid uid, SupermatterComponent sm, ref SupermatterDoAfterEvent args) + { + if (args.Cancelled) + return; + + // Your criminal actions will not go unnoticed + sm.Damage += sm.DamageDelaminationPoint / 10; + + var integrity = GetIntegrity(sm).ToString("0.00"); + SendSupermatterAnnouncement(uid, Loc.GetString("supermatter-announcement-cc-tamper", ("integrity", integrity)), true, "Central Command"); + + Spawn(sm.SliverPrototype, _transform.GetMapCoordinates(args.User)); + _popup.PopupClient(Loc.GetString("supermatter-tamper-end"), uid, args.User); + + sm.DelamTimer /= 2; + } + + private void OnExamine(EntityUid uid, SupermatterComponent sm, ref ExaminedEvent args) + { + if (args.IsInDetailsRange) + args.PushMarkup(Loc.GetString("supermatter-examine-integrity", ("integrity", GetIntegrity(sm).ToString("0.00")))); + } +} diff --git a/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraSystem.cs b/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraSystem.cs index 410ba9f7540..ec3d33157ab 100644 --- a/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraSystem.cs +++ b/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraSystem.cs @@ -1,7 +1,6 @@ using Content.Server.DeviceNetwork; using Content.Server.DeviceNetwork.Components; using Content.Server.DeviceNetwork.Systems; -using Content.Server.Emp; using Content.Server.Power.Components; using Content.Shared.ActionBlocker; using Content.Shared.DeviceNetwork; @@ -59,9 +58,6 @@ public override void Initialize() SubscribeLocalEvent(OnSetName); SubscribeLocalEvent(OnSetNetwork); SubscribeLocalEvent>(AddVerbs); - - SubscribeLocalEvent(OnEmpPulse); - SubscribeLocalEvent(OnEmpDisabledRemoved); } private void OnPacketReceived(EntityUid uid, SurveillanceCameraComponent component, DeviceNetworkPacketEvent args) @@ -400,21 +396,6 @@ private void UpdateVisuals(EntityUid uid, SurveillanceCameraComponent? component _appearance.SetData(uid, SurveillanceCameraVisualsKey.Key, key, appearance); } - - private void OnEmpPulse(EntityUid uid, SurveillanceCameraComponent component, ref EmpPulseEvent args) - { - if (component.Active) - { - args.Affected = true; - args.Disabled = true; - SetActive(uid, false); - } - } - - private void OnEmpDisabledRemoved(EntityUid uid, SurveillanceCameraComponent component, ref EmpDisabledRemoved args) - { - SetActive(uid, true); - } } public sealed class OnSurveillanceCameraViewerAddEvent : EntityEventArgs diff --git a/Content.Server/Traits/Assorted/ConsumeDelayModifierComponent.cs b/Content.Server/Traits/Assorted/ConsumeDelayModifierComponent.cs new file mode 100644 index 00000000000..aa551a79f76 --- /dev/null +++ b/Content.Server/Traits/Assorted/ConsumeDelayModifierComponent.cs @@ -0,0 +1,22 @@ +using Robust.Shared.GameStates; + +namespace Content.Server.Traits.Assorted.Components; + +/// +/// This is used for any trait that modifies how fast an entity consumes food and drinks. +/// +[RegisterComponent] +public sealed partial class ConsumeDelayModifierComponent : Component +{ + /// + /// What to multiply the eating delay by. + /// + [DataField] + public float FoodDelayMultiplier { get; set; } = 1f; + + /// + /// What to multiply the drinking delay by. + /// + [DataField] + public float DrinkDelayMultiplier { get; set; } = 1f; +} diff --git a/Content.Server/Traits/Assorted/LanguageKnowledgeModifierComponent.cs b/Content.Server/Traits/Assorted/LanguageKnowledgeModifierComponent.cs new file mode 100644 index 00000000000..170dae40fa6 --- /dev/null +++ b/Content.Server/Traits/Assorted/LanguageKnowledgeModifierComponent.cs @@ -0,0 +1,23 @@ +using Content.Shared.Language; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List; + +namespace Content.Server.Traits.Assorted; + +/// +/// Used for traits that modify entities' language knowledge. +/// +[RegisterComponent] +public sealed partial class LanguageKnowledgeModifierComponent : Component +{ + /// + /// List of languages this entity will learn to speak. + /// + [DataField("speaks")] + public List NewSpokenLanguages = new(); + + /// + /// List of languages this entity will learn to understand. + /// + [DataField("understands")] + public List NewUnderstoodLanguages = new(); +} diff --git a/Content.Server/Traits/Assorted/LanguageKnowledgeModifierSystem.cs b/Content.Server/Traits/Assorted/LanguageKnowledgeModifierSystem.cs new file mode 100644 index 00000000000..9053c9404fe --- /dev/null +++ b/Content.Server/Traits/Assorted/LanguageKnowledgeModifierSystem.cs @@ -0,0 +1,35 @@ +using System.Linq; +using Content.Server.Language; +using Content.Shared.Language.Components; + +namespace Content.Server.Traits.Assorted; + +public sealed class LanguageKnowledgeModifierSystem : EntitySystem +{ + [Dependency] private readonly LanguageSystem _languages = default!; + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnStartup); + } + + private void OnStartup(Entity entity, ref ComponentInit args) + { + if (!TryComp(entity, out var knowledge)) + { + Log.Warning($"Entity {entity.Owner} does not have a LanguageKnowledge but has a LanguageKnowledgeModifier!"); + return; + } + + foreach (var spokenLanguage in entity.Comp.NewSpokenLanguages) + { + _languages.AddLanguage(entity, spokenLanguage, true, false, knowledge); + } + + foreach (var understoodLanguage in entity.Comp.NewUnderstoodLanguages) + { + _languages.AddLanguage(entity, understoodLanguage, false, true, knowledge); + } + } +} diff --git a/Content.Server/Traits/Assorted/LayingDownModifierComponent.cs b/Content.Server/Traits/Assorted/LayingDownModifierComponent.cs new file mode 100644 index 00000000000..22660ff4487 --- /dev/null +++ b/Content.Server/Traits/Assorted/LayingDownModifierComponent.cs @@ -0,0 +1,22 @@ +using Robust.Shared.GameStates; + +namespace Content.Server.Traits.Assorted; + +/// +/// This is used for traits that modify values related to the Laying Down system. +/// +[RegisterComponent] +public sealed partial class LayingDownModifierComponent : Component +{ + /// + /// What to multiply the cooldown of laying down and standing up by. + /// + [DataField] + public float LayingDownCooldownMultiplier = 1f; + + /// + /// What to multiply the speed multiplier when lying down by. + /// + [DataField] + public float DownedSpeedMultiplierMultiplier = 1f; +} diff --git a/Content.Server/Traits/Assorted/LayingDownModifierSystem.cs b/Content.Server/Traits/Assorted/LayingDownModifierSystem.cs new file mode 100644 index 00000000000..dc6dcd2de3b --- /dev/null +++ b/Content.Server/Traits/Assorted/LayingDownModifierSystem.cs @@ -0,0 +1,22 @@ +using Content.Server.Traits.Assorted; +using Content.Server.Standing; + +namespace Content.Shared.Traits.Assorted.Systems; + +public sealed class LayingDownModifierSystem : EntitySystem +{ + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnStartup); + } + + private void OnStartup(EntityUid uid, LayingDownModifierComponent component, ComponentStartup args) + { + if (!TryComp(uid, out var layingDown)) + return; + + layingDown.Cooldown *= component.LayingDownCooldownMultiplier; + layingDown.DownedSpeedMultiplier *= component.DownedSpeedMultiplierMultiplier; + } +} diff --git a/Content.Server/Traits/Assorted/OniDamageModifierComponent.cs b/Content.Server/Traits/Assorted/OniDamageModifierComponent.cs new file mode 100644 index 00000000000..d6cf032aabd --- /dev/null +++ b/Content.Server/Traits/Assorted/OniDamageModifierComponent.cs @@ -0,0 +1,16 @@ +using Content.Shared.Damage; + +namespace Content.Server.Traits.Assorted; + +/// +/// This is used for traits that modify Oni damage modifiers. +/// +[RegisterComponent] +public sealed partial class OniDamageModifierComponent : Component +{ + /// + /// Which damage modifiers to override. + /// + [DataField("modifiers", required: true)] + public DamageModifierSet MeleeModifierReplacers = default!; +} diff --git a/Content.Server/Traits/Assorted/OniDamageModifierSystem.cs b/Content.Server/Traits/Assorted/OniDamageModifierSystem.cs new file mode 100644 index 00000000000..9d701053769 --- /dev/null +++ b/Content.Server/Traits/Assorted/OniDamageModifierSystem.cs @@ -0,0 +1,31 @@ +using Content.Server.Abilities.Oni; +using Content.Shared.Damage; + +namespace Content.Server.Traits.Assorted; + +public sealed class OniDamageModifierSystem : EntitySystem +{ + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnStartup); + } + + private void OnStartup(EntityUid uid, OniDamageModifierComponent component, ComponentStartup args) + { + if (!TryComp(uid, out var oni)) + return; + + foreach (var (key, value) in component.MeleeModifierReplacers.Coefficients) + { + oni.MeleeModifiers.Coefficients[key] = value; + + } + + foreach (var (key, value) in component.MeleeModifierReplacers.FlatReduction) + { + oni.MeleeModifiers.FlatReduction[key] = value; + + } + } +} diff --git a/Content.Server/Traits/Assorted/SelfAwareComponent.cs b/Content.Server/Traits/Assorted/SelfAwareComponent.cs new file mode 100644 index 00000000000..03f5cd15502 --- /dev/null +++ b/Content.Server/Traits/Assorted/SelfAwareComponent.cs @@ -0,0 +1,31 @@ +using Content.Shared.Damage.Prototypes; +using Content.Shared.FixedPoint; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.Set; + +namespace Content.Server.Traits.Assorted; + +/// +/// This is used for the Self-Aware trait to enhance the information received from HealthExaminableSystem. +/// +[RegisterComponent] +public sealed partial class SelfAwareComponent : Component +{ + // + // Damage types that an entity is able to precisely analyze like a health analyzer when they examine themselves. + // + [DataField(required: true, customTypeSerializer:typeof(PrototypeIdHashSetSerializer))] + public HashSet AnalyzableTypes = default!; + + // + // Damage groups that an entity is able to detect the presence of when they examine themselves. + // + [DataField(required: true, customTypeSerializer:typeof(PrototypeIdHashSetSerializer))] + public HashSet DetectableGroups = default!; + + // + // The thresholds for determining the examine text of DetectableGroups for certain amounts of damage. + // These are calculated as a percentage of the entity's critical threshold. + // + public List Thresholds = new() + { FixedPoint2.New(0.10), FixedPoint2.New(0.25), FixedPoint2.New(0.40), FixedPoint2.New(0.60) }; +} diff --git a/Content.Server/Traits/BloodDeficiencyComponent.cs b/Content.Server/Traits/BloodDeficiencyComponent.cs new file mode 100644 index 00000000000..616f60cd834 --- /dev/null +++ b/Content.Server/Traits/BloodDeficiencyComponent.cs @@ -0,0 +1,14 @@ +namespace Content.Server.Traits.Assorted; + +/// +/// This is used for the Blood Deficiency trait. +/// +[RegisterComponent] +public sealed partial class BloodDeficiencyComponent : Component +{ + // + // How much reagent of blood should be removed in each update interval? + // + [DataField(required: true)] + public float BloodLossAmount; +} diff --git a/Content.Server/Traits/BloodDeficiencySystem.cs b/Content.Server/Traits/BloodDeficiencySystem.cs new file mode 100644 index 00000000000..f1ae4909956 --- /dev/null +++ b/Content.Server/Traits/BloodDeficiencySystem.cs @@ -0,0 +1,23 @@ +using Content.Server.Body.Systems; +using Content.Server.Body.Components; +using Content.Shared.Damage; + +namespace Content.Server.Traits.Assorted; + +public sealed class BloodDeficiencySystem : EntitySystem +{ + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnStartup); + } + + private void OnStartup(EntityUid uid, BloodDeficiencyComponent component, ComponentStartup args) + { + if (!TryComp(uid, out var bloodstream)) + return; + + bloodstream.HasBloodDeficiency = true; + bloodstream.BloodDeficiencyLossAmount = component.BloodLossAmount; + } +} diff --git a/Content.Server/Traits/HemophiliaComponent.cs b/Content.Server/Traits/HemophiliaComponent.cs new file mode 100644 index 00000000000..e8f1f57c6e5 --- /dev/null +++ b/Content.Server/Traits/HemophiliaComponent.cs @@ -0,0 +1,21 @@ +using Content.Shared.Damage; +namespace Content.Server.Traits.Assorted; + +/// +/// This is used for the Hemophilia trait. +/// +[RegisterComponent] +public sealed partial class HemophiliaComponent : Component +{ + // + // What the BleedReductionAmount should be multiplied by. + // + [DataField(required: true)] + public float BleedReductionModifier = 1f; + + /// + /// The damage increase from this trait. + /// + [DataField(required: true)] + public DamageModifierSet DamageModifiers = default!; +} diff --git a/Content.Server/Traits/HemophiliaSystem.cs b/Content.Server/Traits/HemophiliaSystem.cs new file mode 100644 index 00000000000..c70c7de37c0 --- /dev/null +++ b/Content.Server/Traits/HemophiliaSystem.cs @@ -0,0 +1,28 @@ +using Content.Server.Body.Systems; +using Content.Server.Body.Components; +using Content.Shared.Damage; + +namespace Content.Server.Traits.Assorted; + +public sealed class HemophiliaSystem : EntitySystem +{ + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnStartup); + SubscribeLocalEvent(OnDamageModify); + } + + private void OnStartup(EntityUid uid, HemophiliaComponent component, ComponentStartup args) + { + if (!TryComp(uid, out var bloodstream)) + return; + + bloodstream.BleedReductionAmount *= component.BleedReductionModifier; + } + + private void OnDamageModify(EntityUid uid, HemophiliaComponent component, DamageModifyEvent args) + { + args.Damage = DamageSpecifier.ApplyModifierSet(args.Damage, component.DamageModifiers); + } +} diff --git a/Content.Server/Traits/TraitSystem.cs b/Content.Server/Traits/TraitSystem.cs index be2c3c05039..628cb43b8d2 100644 --- a/Content.Server/Traits/TraitSystem.cs +++ b/Content.Server/Traits/TraitSystem.cs @@ -4,6 +4,7 @@ using Content.Shared.Customization.Systems; using Content.Shared.Hands.Components; using Content.Shared.Hands.EntitySystems; +using Content.Shared.Players; using Content.Shared.Roles; using Content.Shared.Traits; using Pidgin.Configuration; @@ -40,9 +41,10 @@ private void OnPlayerSpawnComplete(PlayerSpawnCompleteEvent args) return; } - if (!_characterRequirements.CheckRequirementsValid(traitPrototype, traitPrototype.Requirements, + if (!_characterRequirements.CheckRequirementsValid( + traitPrototype.Requirements, _prototype.Index(args.JobId ?? _prototype.EnumeratePrototypes().First().ID), - args.Profile, _playTimeTracking.GetTrackerTimes(args.Player), + args.Profile, _playTimeTracking.GetTrackerTimes(args.Player), args.Player.ContentData()?.Whitelisted ?? false, EntityManager, _prototype, _configuration, out _)) continue; diff --git a/Content.Server/Vampire/BloodSuckedComponent.cs b/Content.Server/Vampire/BloodSuckedComponent.cs new file mode 100644 index 00000000000..d7e402cd98a --- /dev/null +++ b/Content.Server/Vampire/BloodSuckedComponent.cs @@ -0,0 +1,9 @@ +namespace Content.Server.Vampiric +{ + /// + /// For entities who have been succed. + /// + [RegisterComponent] + public sealed partial class BloodSuckedComponent : Component + {} +} diff --git a/Content.Server/Vampire/BloodSuckerComponent.cs b/Content.Server/Vampire/BloodSuckerComponent.cs new file mode 100644 index 00000000000..f5619d1cb49 --- /dev/null +++ b/Content.Server/Vampire/BloodSuckerComponent.cs @@ -0,0 +1,44 @@ +namespace Content.Server.Vampiric +{ + [RegisterComponent] + public sealed partial class BloodSuckerComponent : Component + { + /// + /// How much to succ each time we succ. + /// + [DataField("unitsToSucc")] + public float UnitsToSucc = 20f; + + /// + /// The time (in seconds) that it takes to succ an entity. + /// + [DataField, ViewVariables(VVAccess.ReadWrite)] + public TimeSpan Delay = TimeSpan.FromSeconds(4); + + // ***INJECT WHEN SUCC*** + + /// + /// Whether to inject chems into a chemstream when we suck something. + /// + [DataField("injectWhenSucc")] + public bool InjectWhenSucc = false; + + /// + /// How many units of our injected chem to inject. + /// + [DataField("unitsToInject")] + public float UnitsToInject = 5; + + /// + /// Which reagent to inject. + /// + [DataField("injectReagent")] + public string InjectReagent = ""; + + /// + /// Whether we need to web the thing up first... + /// + [DataField("webRequired")] + public bool WebRequired = false; + } +} diff --git a/Content.Server/Vampire/BloodSuckerSystem.cs b/Content.Server/Vampire/BloodSuckerSystem.cs new file mode 100644 index 00000000000..a63334a8943 --- /dev/null +++ b/Content.Server/Vampire/BloodSuckerSystem.cs @@ -0,0 +1,213 @@ +using Content.Shared.Verbs; +using Content.Shared.Damage; +using Content.Shared.DoAfter; +using Content.Shared.Damage.Prototypes; +using Content.Shared.Interaction; +using Content.Shared.Inventory; +using Content.Shared.Administration.Logs; +using Content.Shared.Vampiric; +using Content.Server.Atmos.Components; +using Content.Server.Body.Components; +using Content.Server.Body.Systems; +using Content.Shared.Chemistry.EntitySystems; +using Content.Server.Popups; +using Content.Server.HealthExaminable; +using Content.Server.DoAfter; +using Content.Server.Nutrition.Components; +using Robust.Shared.Prototypes; +using Robust.Shared.Audio.Systems; +using Robust.Shared.Utility; + +namespace Content.Server.Vampiric +{ + public sealed class BloodSuckerSystem : EntitySystem + { + [Dependency] private readonly BodySystem _bodySystem = default!; + [Dependency] private readonly SharedSolutionContainerSystem _solutionSystem = default!; + [Dependency] private readonly PopupSystem _popups = default!; + [Dependency] private readonly DoAfterSystem _doAfter = default!; + [Dependency] private readonly IPrototypeManager _prototypeManager = default!; + [Dependency] private readonly StomachSystem _stomachSystem = default!; + [Dependency] private readonly DamageableSystem _damageableSystem = default!; + [Dependency] private readonly InventorySystem _inventorySystem = default!; + [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; + [Dependency] private readonly SharedInteractionSystem _interactionSystem = default!; + [Dependency] private readonly BloodstreamSystem _bloodstreamSystem = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent>(AddSuccVerb); + SubscribeLocalEvent(OnHealthExamined); + SubscribeLocalEvent(OnDamageChanged); + SubscribeLocalEvent(OnDoAfter); + } + + private void AddSuccVerb(EntityUid uid, BloodSuckerComponent component, GetVerbsEvent args) + { + if (args.User == args.Target) + return; + if (component.WebRequired) + return; // handled elsewhere + if (!TryComp(args.Target, out var bloodstream)) + return; + if (!args.CanAccess) + return; + + InnateVerb verb = new() + { + Act = () => + { + StartSuccDoAfter(uid, args.Target, component, bloodstream); // start doafter + }, + Text = Loc.GetString("action-name-suck-blood"), + Icon = new SpriteSpecifier.Texture(new ("/Textures/Nyanotrasen/Icons/verbiconfangs.png")), + Priority = 2 + }; + args.Verbs.Add(verb); + } + + private void OnHealthExamined(EntityUid uid, BloodSuckedComponent component, HealthBeingExaminedEvent args) + { + args.Message.PushNewline(); + args.Message.AddMarkup(Loc.GetString("bloodsucked-health-examine", ("target", uid))); + } + + private void OnDamageChanged(EntityUid uid, BloodSuckedComponent component, DamageChangedEvent args) + { + if (args.DamageIncreased) + return; + + if (_prototypeManager.TryIndex("Brute", out var brute) && args.Damageable.Damage.TryGetDamageInGroup(brute, out var bruteTotal) + && _prototypeManager.TryIndex("Airloss", out var airloss) && args.Damageable.Damage.TryGetDamageInGroup(airloss, out var airlossTotal)) + { + if (bruteTotal == 0 && airlossTotal == 0) + RemComp(uid); + } + } + + private void OnDoAfter(EntityUid uid, BloodSuckerComponent component, BloodSuckDoAfterEvent args) + { + if (args.Cancelled || args.Handled || args.Args.Target == null) + return; + + args.Handled = TrySucc(uid, args.Args.Target.Value); + } + + public void StartSuccDoAfter(EntityUid bloodsucker, EntityUid victim, BloodSuckerComponent? bloodSuckerComponent = null, BloodstreamComponent? stream = null, bool doChecks = true) + { + if (!Resolve(bloodsucker, ref bloodSuckerComponent)) + return; + + if (!Resolve(victim, ref stream)) + return; + + if (doChecks) + { + if (!_interactionSystem.InRangeUnobstructed(bloodsucker, victim)) + { + return; + } + + if (_inventorySystem.TryGetSlotEntity(victim, "head", out var headUid) && HasComp(headUid)) + { + _popups.PopupEntity(Loc.GetString("bloodsucker-fail-helmet", ("helmet", headUid)), victim, bloodsucker, Shared.Popups.PopupType.Medium); + return; + } + + if (_inventorySystem.TryGetSlotEntity(bloodsucker, "mask", out var maskUid) && + EntityManager.TryGetComponent(maskUid, out var blocker) && + blocker.Enabled) + { + _popups.PopupEntity(Loc.GetString("bloodsucker-fail-mask", ("mask", maskUid)), victim, bloodsucker, Shared.Popups.PopupType.Medium); + return; + } + } + + if (stream.BloodReagent != "Blood") + { + _popups.PopupEntity(Loc.GetString("bloodsucker-fail-not-blood", ("target", victim)), victim, bloodsucker, Shared.Popups.PopupType.Medium); + return; + } + + if (_solutionSystem.PercentFull(stream.Owner) != 0) + _popups.PopupEntity(Loc.GetString("bloodsucker-fail-no-blood", ("target", victim)), victim, bloodsucker, Shared.Popups.PopupType.Medium); + + _popups.PopupEntity(Loc.GetString("bloodsucker-doafter-start-victim", ("sucker", bloodsucker)), victim, victim, Shared.Popups.PopupType.LargeCaution); + _popups.PopupEntity(Loc.GetString("bloodsucker-doafter-start", ("target", victim)), victim, bloodsucker, Shared.Popups.PopupType.Medium); + + var ev = new BloodSuckDoAfterEvent(); + var args = new DoAfterArgs(EntityManager, bloodsucker, bloodSuckerComponent.Delay, ev, bloodsucker, target: victim) + { + BreakOnTargetMove = true, + BreakOnUserMove = false, + DistanceThreshold = 2f, + NeedHand = false + }; + + _doAfter.TryStartDoAfter(args); + } + + public bool TrySucc(EntityUid bloodsucker, EntityUid victim, BloodSuckerComponent? bloodsuckerComp = null) + { + // Is bloodsucker a bloodsucker? + if (!Resolve(bloodsucker, ref bloodsuckerComp)) + return false; + + // Does victim have a bloodstream? + if (!TryComp(victim, out var bloodstream)) + return false; + + // No blood left, yikes. + if (_bloodstreamSystem.GetBloodLevelPercentage(victim, bloodstream) == 0.0f) + return false; + + // Does bloodsucker have a stomach? + var stomachList = _bodySystem.GetBodyOrganComponents(bloodsucker); + if (stomachList.Count == 0) + return false; + + if (!_solutionSystem.TryGetSolution(stomachList[0].Comp.Owner, StomachSystem.DefaultSolutionName, out var stomachSolution)) + return false; + + // Are we too full? + + if (_solutionSystem.PercentFull(bloodsucker) >= 1) + { + _popups.PopupEntity(Loc.GetString("drink-component-try-use-drink-had-enough"), bloodsucker, bloodsucker, Shared.Popups.PopupType.MediumCaution); + return false; + } + + _adminLogger.Add(Shared.Database.LogType.MeleeHit, Shared.Database.LogImpact.Medium, $"{ToPrettyString(bloodsucker):player} sucked blood from {ToPrettyString(victim):target}"); + + // All good, succ time. + _audio.PlayPvs("/Audio/Items/drink.ogg", bloodsucker); + _popups.PopupEntity(Loc.GetString("bloodsucker-blood-sucked-victim", ("sucker", bloodsucker)), victim, victim, Shared.Popups.PopupType.LargeCaution); + _popups.PopupEntity(Loc.GetString("bloodsucker-blood-sucked", ("target", victim)), bloodsucker, bloodsucker, Shared.Popups.PopupType.Medium); + EnsureComp(victim); + + // Make everything actually ingest. + if (bloodstream.BloodSolution == null) + return false; + + var temp = _solutionSystem.SplitSolution(bloodstream.BloodSolution.Value, bloodsuckerComp.UnitsToSucc); + _stomachSystem.TryTransferSolution(stomachList[0].Comp.Owner, temp, stomachList[0].Comp); + + // Add a little pierce + DamageSpecifier damage = new(); + damage.DamageDict.Add("Piercing", 1); // Slowly accumulate enough to gib after like half an hour + + _damageableSystem.TryChangeDamage(victim, damage, true, true); + + //I'm not porting the nocturine gland, this code is deprecated, and will be reworked at a later date. + //if (bloodsuckerComp.InjectWhenSucc && _solutionSystem.TryGetInjectableSolution(victim, out var injectable)) + //{ + // _solutionSystem.TryAddReagent(victim, injectable, bloodsuckerComp.InjectReagent, bloodsuckerComp.UnitsToInject, out var acceptedQuantity); + //} + return true; + } + + private record struct BloodSuckData() + {} + } +} diff --git a/Content.Server/Vampire/Injector/BloodSuckerGlandInjectorComponent.cs b/Content.Server/Vampire/Injector/BloodSuckerGlandInjectorComponent.cs new file mode 100644 index 00000000000..1a3c9b1588a --- /dev/null +++ b/Content.Server/Vampire/Injector/BloodSuckerGlandInjectorComponent.cs @@ -0,0 +1,23 @@ +namespace Content.Server.Vampiric +{ + [RegisterComponent] + /// + /// Item that gives a bloodsucker injection glands (for poison, usually) + /// + public sealed partial class BloodSuckerGlandInjectorComponent : Component + { + public bool Used = false; + + /// + /// How many units of our injected chem to inject. + /// + [DataField("unitsToInject")] + public float UnitsToInject = 5; + + /// + /// Which reagent to inject. + /// + [DataField("injectReagent")] + public string InjectReagent = ""; + } +} diff --git a/Content.Server/Vampire/Injector/BloodSuckerGlandInjectorSystem.cs b/Content.Server/Vampire/Injector/BloodSuckerGlandInjectorSystem.cs new file mode 100644 index 00000000000..d2a92f24be6 --- /dev/null +++ b/Content.Server/Vampire/Injector/BloodSuckerGlandInjectorSystem.cs @@ -0,0 +1,39 @@ +using Content.Server.Popups; +using Content.Shared.Interaction; + +namespace Content.Server.Vampiric +{ + public sealed class BloodSuckerGlandInjectorSystem : EntitySystem + { + [Dependency] private readonly PopupSystem _popupSystem = default!; + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnAfterInteract); + } + + private void OnAfterInteract(EntityUid uid, BloodSuckerGlandInjectorComponent component, AfterInteractEvent args) + { + if (component.Used) + return; + + if (!args.CanReach) + return; + + if (!TryComp(args.Target, out var bloodSuckerComponent)) + return; + + // They already have one. + if (bloodSuckerComponent.InjectWhenSucc) + return; + + bloodSuckerComponent.InjectWhenSucc = true; + bloodSuckerComponent.InjectReagent = component.InjectReagent; + bloodSuckerComponent.UnitsToInject = component.UnitsToInject; + component.Used = true; + QueueDel(uid); + + _popupSystem.PopupEntity(Loc.GetString("bloodsucker-glands-throb"), args.Target.Value, args.Target.Value); + } + } +} diff --git a/Content.Server/VendingMachines/VendingMachineSystem.cs b/Content.Server/VendingMachines/VendingMachineSystem.cs index 7c9aed188fe..36fa69313e3 100644 --- a/Content.Server/VendingMachines/VendingMachineSystem.cs +++ b/Content.Server/VendingMachines/VendingMachineSystem.cs @@ -49,7 +49,6 @@ public override void Initialize() SubscribeLocalEvent(OnEmagged); SubscribeLocalEvent(OnDamage); SubscribeLocalEvent(OnVendingPrice); - SubscribeLocalEvent(OnEmpPulse); SubscribeLocalEvent(OnActivatableUIOpenAttempt); @@ -496,15 +495,5 @@ private void OnPriceCalculation(EntityUid uid, VendingMachineRestockComponent co args.Price += priceSets.Max(); } - - private void OnEmpPulse(EntityUid uid, VendingMachineComponent component, ref EmpPulseEvent args) - { - if (!component.Broken && this.IsPowered(uid, EntityManager)) - { - args.Affected = true; - args.Disabled = true; - component.NextEmpEject = _timing.CurTime; - } - } } } diff --git a/Content.Server/Wagging/WaggingSystem.cs b/Content.Server/Wagging/WaggingSystem.cs index 7ccc19e20c6..ed2747da198 100644 --- a/Content.Server/Wagging/WaggingSystem.cs +++ b/Content.Server/Wagging/WaggingSystem.cs @@ -65,6 +65,8 @@ public bool TryToggleWagging(EntityUid uid, WaggingComponent? wagging = null, Hu wagging.Wagging = !wagging.Wagging; + _actions.SetToggled(wagging.ActionEntity, wagging.Wagging); + for (var idx = 0; idx < markings.Count; idx++) // Animate all possible tails { var currentMarkingId = markings[idx].MarkingId; diff --git a/Content.Shared/Access/Components/IdCardConsoleComponent.cs b/Content.Shared/Access/Components/IdCardConsoleComponent.cs index 417b77855cc..c994d83d9c5 100644 --- a/Content.Shared/Access/Components/IdCardConsoleComponent.cs +++ b/Content.Shared/Access/Components/IdCardConsoleComponent.cs @@ -89,6 +89,9 @@ public WriteToTargetIdMessage(string fullName, string jobTitle, List + /// Blood reagent required to web up a mob. + /// + + [DataField("webBloodReagent")] + public string WebBloodReagent = "Blood"; + } +} diff --git a/Content.Shared/Arachne/Events.cs b/Content.Shared/Arachne/Events.cs new file mode 100644 index 00000000000..02001286ac6 --- /dev/null +++ b/Content.Shared/Arachne/Events.cs @@ -0,0 +1,11 @@ +using Robust.Shared.Map; +using Robust.Shared.Serialization; +using Content.Shared.DoAfter; + +namespace Content.Shared.Arachne +{ + [Serializable, NetSerializable] + public sealed partial class ArachneCocoonDoAfterEvent : SimpleDoAfterEvent + { + } +} diff --git a/Content.Shared/Arachne/WebComponent.cs b/Content.Shared/Arachne/WebComponent.cs new file mode 100644 index 00000000000..c8284f39434 --- /dev/null +++ b/Content.Shared/Arachne/WebComponent.cs @@ -0,0 +1,8 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Arachne +{ + [RegisterComponent, NetworkedComponent] + public sealed partial class WebComponent : Component + {} +} diff --git a/Content.Shared/Atmos/Atmospherics.cs b/Content.Shared/Atmos/Atmospherics.cs index 6a8587ca239..78b692d52de 100644 --- a/Content.Shared/Atmos/Atmospherics.cs +++ b/Content.Shared/Atmos/Atmospherics.cs @@ -271,7 +271,7 @@ public static class Atmospherics public const float HazardLowPressure = 20f; /// - /// The amount of pressure damage someone takes is equal to (pressure / HAZARD_HIGH_PRESSURE)*PRESSURE_DAMAGE_COEFFICIENT, + /// /// The amount of pressure damage someone takes is equal to ((pressure / HAZARD_HIGH_PRESSURE) - 1)*PRESSURE_DAMAGE_COEFFICIENT /// with the maximum of MaxHighPressureDamage. /// public const float PressureDamageCoefficient = 4; diff --git a/Content.Shared/Atmos/Rotting/SharedRottingSystem.cs b/Content.Shared/Atmos/Rotting/SharedRottingSystem.cs index 5e1758203a8..840818dee59 100644 --- a/Content.Shared/Atmos/Rotting/SharedRottingSystem.cs +++ b/Content.Shared/Atmos/Rotting/SharedRottingSystem.cs @@ -1,29 +1,85 @@ using Content.Shared.Examine; using Content.Shared.IdentityManagement; +using Content.Shared.Mobs; using Content.Shared.Mobs.Components; +using Content.Shared.Mobs.Systems; +using Content.Shared.Rejuvenate; +using Robust.Shared.Containers; +using Robust.Shared.Timing; namespace Content.Shared.Atmos.Rotting; public abstract class SharedRottingSystem : EntitySystem { + [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly SharedContainerSystem _container = default!; + [Dependency] private readonly MobStateSystem _mobState = default!; + public const int MaxStages = 3; public override void Initialize() { base.Initialize(); + SubscribeLocalEvent(OnPerishableMapInit); + SubscribeLocalEvent(OnMobStateChanged); + SubscribeLocalEvent(OnPerishableExamined); + + SubscribeLocalEvent(OnShutdown); + SubscribeLocalEvent(OnRottingMobStateChanged); + SubscribeLocalEvent(OnRejuvenate); SubscribeLocalEvent(OnExamined); } - /// - /// Return the rot stage, usually from 0 to 2 inclusive. - /// - public int RotStage(EntityUid uid, RottingComponent? comp = null, PerishableComponent? perishable = null) + private void OnPerishableMapInit(EntityUid uid, PerishableComponent component, MapInitEvent args) { - if (!Resolve(uid, ref comp, ref perishable)) - return 0; + component.RotNextUpdate = _timing.CurTime + component.PerishUpdateRate; + } - return (int) (comp.TotalRotTime.TotalSeconds / perishable.RotAfter.TotalSeconds); + private void OnMobStateChanged(EntityUid uid, PerishableComponent component, MobStateChangedEvent args) + { + if (args.NewMobState != MobState.Dead && args.OldMobState != MobState.Dead) + return; + + if (HasComp(uid)) + return; + + component.RotAccumulator = TimeSpan.Zero; + component.RotNextUpdate = _timing.CurTime + component.PerishUpdateRate; + } + + private void OnPerishableExamined(Entity perishable, ref ExaminedEvent args) + { + int stage = PerishStage(perishable, MaxStages); + if (stage < 1 || stage > MaxStages) + { + // We dont push an examined string if it hasen't started "perishing" or it's already rotting + return; + } + + var isMob = HasComp(perishable); + var description = "perishable-" + stage + (!isMob ? "-nonmob" : string.Empty); + args.PushMarkup(Loc.GetString(description, ("target", Identity.Entity(perishable, EntityManager)))); + } + + private void OnShutdown(EntityUid uid, RottingComponent component, ComponentShutdown args) + { + if (TryComp(uid, out var perishable)) + { + perishable.RotNextUpdate = TimeSpan.Zero; + } + } + + private void OnRottingMobStateChanged(EntityUid uid, RottingComponent component, MobStateChangedEvent args) + { + if (args.NewMobState == MobState.Dead) + return; + RemCompDeferred(uid, component); + } + + private void OnRejuvenate(EntityUid uid, RottingComponent component, RejuvenateEvent args) + { + RemCompDeferred(uid); } private void OnExamined(EntityUid uid, RottingComponent component, ExaminedEvent args) @@ -41,4 +97,75 @@ private void OnExamined(EntityUid uid, RottingComponent component, ExaminedEvent args.PushMarkup(Loc.GetString(description, ("target", Identity.Entity(uid, EntityManager)))); } + + /// + /// Return an integer from 0 to maxStage representing how close to rotting an entity is. Used to + /// generate examine messages for items that are starting to rot. + /// + public int PerishStage(Entity perishable, int maxStages) + { + if (perishable.Comp.RotAfter.TotalSeconds == 0 || perishable.Comp.RotAccumulator.TotalSeconds == 0) + return 0; + return (int)(1 + maxStages * perishable.Comp.RotAccumulator.TotalSeconds / perishable.Comp.RotAfter.TotalSeconds); + } + + public bool IsRotProgressing(EntityUid uid, PerishableComponent? perishable) + { + // things don't perish by default. + if (!Resolve(uid, ref perishable, false)) + return false; + + // only dead things or inanimate objects can rot + if (TryComp(uid, out var mobState) && !_mobState.IsDead(uid, mobState)) + return false; + + if (_container.TryGetOuterContainer(uid, Transform(uid), out var container) && + HasComp(container.Owner)) + { + return false; + } + + var ev = new IsRottingEvent(); + RaiseLocalEvent(uid, ref ev); + + return !ev.Handled; + } + + public bool IsRotten(EntityUid uid, RottingComponent? rotting = null) + { + return Resolve(uid, ref rotting, false); + } + + public void ReduceAccumulator(EntityUid uid, TimeSpan time) + { + if (!TryComp(uid, out var perishable)) + return; + + if (!TryComp(uid, out var rotting)) + { + perishable.RotAccumulator -= time; + return; + } + var total = (rotting.TotalRotTime + perishable.RotAccumulator) - time; + + if (total < perishable.RotAfter) + { + RemCompDeferred(uid, rotting); + perishable.RotAccumulator = total; + } + + else + rotting.TotalRotTime = total - perishable.RotAfter; + } + + /// + /// Return the rot stage, usually from 0 to 2 inclusive. + /// + public int RotStage(EntityUid uid, RottingComponent? comp = null, PerishableComponent? perishable = null) + { + if (!Resolve(uid, ref comp, ref perishable)) + return 0; + + return (int) (comp.TotalRotTime.TotalSeconds / perishable.RotAfter.TotalSeconds); + } } diff --git a/Content.Shared/CCVar/CCVars.cs b/Content.Shared/CCVar/CCVars.cs index 04e680390ce..3fc7e7247e6 100644 --- a/Content.Shared/CCVar/CCVars.cs +++ b/Content.Shared/CCVar/CCVars.cs @@ -1,3 +1,4 @@ +using Content.Shared.Supermatter.Components; using Robust.Shared; using Robust.Shared.Configuration; @@ -119,7 +120,7 @@ public static readonly CVarDef /// Max chaos chosen for a round will deviate from this /// public static readonly CVarDef - EventsRampingAverageChaos = CVarDef.Create("events.ramping_average_chaos", 0.8f, CVar.ARCHIVE | CVar.SERVERONLY); + EventsRampingAverageChaos = CVarDef.Create("events.ramping_average_chaos", 6f, CVar.ARCHIVE | CVar.SERVERONLY); /* * Game @@ -186,29 +187,16 @@ public static readonly CVarDef // 25 Minutes GameEventsBasicMaximumTime = CVarDef.Create("game.events_basic_maximum_time", 1500, CVar.SERVERONLY); /// - /// Minimum time between Ramping station events in minutes + /// Minimum time between Ramping station events in seconds /// - public static readonly CVarDef // 8 Minutes - GameEventsRampingMinimumTime = CVarDef.Create("game.events_ramping_minimum_time", 8f, CVar.SERVERONLY); + public static readonly CVarDef // 4 Minutes + GameEventsRampingMinimumTime = CVarDef.Create("game.events_ramping_minimum_time", 240, CVar.SERVERONLY); /// - /// After the shift's desired "Endpoint" is reached, the minimum time between events is RampingMinimumTime - Offset. + /// Maximum time between Ramping station events in seconds /// - - public static readonly CVarDef - GameEventsRampingMinimumTimeOffset = CVarDef.Create("game.events_ramping_minimum_time_offset", 6f, CVar.SERVERONLY); - - /// - /// Maximum time between Ramping station events in minutes - /// - public static readonly CVarDef // 16 Minutes - GameEventsRampingMaximumTime = CVarDef.Create("game.events_ramping_maximum_time", 16f, CVar.SERVERONLY); - - /// - /// After the shift's desired "Endpoint" is reached, the maximum time between events is RampingMaximumTime - Offset. - /// - public static readonly CVarDef - GameEventsRampingMaximumTimeOffset = CVarDef.Create("game.events_ramping_maximum_time_offset", 10f, CVar.SERVERONLY); + public static readonly CVarDef // 12 Minutes + GameEventsRampingMaximumTime = CVarDef.Create("game.events_ramping_maximum_time", 720, CVar.SERVERONLY); /// /// @@ -407,6 +395,13 @@ public static readonly CVarDef public static readonly CVarDef GameAutoEatDrinks = CVarDef.Create("game.auto_eat_drinks", false, CVar.REPLICATED); + + /// + /// When true, you have to press the change speed button to sprint. + /// + public static readonly CVarDef GamePressToSprint = + CVarDef.Create("game.press_to_sprint", true, CVar.REPLICATED); + #if EXCEPTION_TOLERANCE /// /// Amount of times round start must fail before the server is shut down. @@ -831,8 +826,6 @@ public static readonly CVarDef CVarDef.Create("audio.admin_chat_sound_path", "/Audio/Items/pop.ogg", CVar.ARCHIVE | CVar.CLIENT | CVar.REPLICATED); public static readonly CVarDef AdminChatSoundVolume = CVarDef.Create("audio.admin_chat_sound_volume", -5f, CVar.ARCHIVE | CVar.CLIENT | CVar.REPLICATED); - public static readonly CVarDef AHelpSound = - CVarDef.Create("audio.ahelp_sound", "/Audio/Effects/adminhelp.ogg", CVar.ARCHIVE | CVar.CLIENTONLY); /* * HUD @@ -1432,7 +1425,7 @@ public static readonly CVarDef /// Controls whether the server will deny any players that are not whitelisted in the DB. /// public static readonly CVarDef WhitelistEnabled = - CVarDef.Create("whitelist.enabled", false, CVar.SERVERONLY); + CVarDef.Create("whitelist.enabled", false, CVar.REPLICATED); /// /// The loc string to display as a disconnect reason when someone is not whitelisted. @@ -2298,6 +2291,55 @@ public static readonly CVarDef /// public static readonly CVarDef StationGoalsChance = CVarDef.Create("game.station_goals_chance", 0.1f, CVar.SERVERONLY); + + + #region CPR System + /// + /// Controls whether the entire CPR system runs. When false, nobody can perform CPR. You should probably remove the trait too + /// if you are wishing to permanently disable the system on your server. + /// + public static readonly CVarDef EnableCPR = + CVarDef.Create("cpr.enable", true, CVar.REPLICATED | CVar.SERVER); + + /// + /// Toggles whether or not CPR reduces rot timers(As an abstraction of delaying brain death, the IRL actual purpose of CPR) + /// + public static readonly CVarDef CPRReducesRot = + CVarDef.Create("cpr.reduces_rot", true, CVar.REPLICATED | CVar.SERVER); + + /// + /// Toggles whether or not CPR heals airloss, included for completeness sake. I'm not going to stop you if your intention is to make CPR do nothing. + /// I guess it might be funny to troll your players with? I won't judge. + /// + public static readonly CVarDef CPRHealsAirloss = + CVarDef.Create("cpr.heals_airloss", true, CVar.REPLICATED | CVar.SERVER); + + /// + /// The chance for a patient to be resuscitated when CPR is successfully performed. + /// Setting this above 0 isn't very realistic, but people who see CPR in movies and TV will expect CPR to work this way. + /// + public static readonly CVarDef CPRResuscitationChance = + CVarDef.Create("cpr.resuscitation_chance", 0.05f, CVar.REPLICATED | CVar.SERVER); + + /// + /// By default, CPR reduces rot timers by an amount of seconds equal to the time spent performing CPR. This is an optional multiplier that can increase or decrease the amount + /// of rot reduction. Set it to 2 for if you want 3 seconds of CPR to reduce 6 seconds of rot. + /// + /// + /// If you're wondering why there isn't a CVar for setting the duration of the doafter, that's because it's not actually possible to have a timespan in cvar form + /// Curiously, it's also not possible for **shared** systems to set variable timespans. Which is where this system lives. + /// + public static readonly CVarDef CPRRotReductionMultiplier = + CVarDef.Create("cpr.rot_reduction_multiplier", 1f, CVar.REPLICATED | CVar.SERVER); + + /// + /// By default, CPR heals airloss by 1 point for every second spent performing CPR. Just like above, this directly multiplies the healing amount. + /// Set it to 2 to get 6 points of airloss healing for every 3 seconds of CPR. + /// + public static readonly CVarDef CPRAirlossReductionMultiplier = + CVarDef.Create("cpr.airloss_reduction_multiplier", 1f, CVar.REPLICATED | CVar.SERVER); + + #endregion #region Contests System @@ -2347,5 +2389,54 @@ public static readonly CVarDef CVarDef.Create("contests.max_percentage", 0.25f, CVar.REPLICATED | CVar.SERVER); #endregion + + #region Supermatter System + + /// + /// With completely default supermatter values, Singuloose delamination will occur if engineers inject at least 900 moles of coolant per tile + /// in the crystal chamber. For reference, a gas canister contains 1800 moles of air. This Cvar directly multiplies the amount of moles required to singuloose. + /// + public static readonly CVarDef SupermatterSingulooseMolesModifier = + CVarDef.Create("supermatter.singuloose_moles_modifier", 1f, CVar.SERVER); + + /// + /// Toggles whether or not Singuloose delaminations can occur. If both Singuloose and Tesloose are disabled, it will always delam into a Nuke. + /// + public static readonly CVarDef SupermatterDoSingulooseDelam = + CVarDef.Create("supermatter.do_singuloose", true, CVar.SERVER); + + /// + /// By default, Supermatter will "Tesloose" if the conditions for Singuloose are not met, and the core's power is at least 4000. + /// The actual reasons for being at least this amount vary by how the core was screwed up, but traditionally it's caused by "The core is on fire". + /// This Cvar multiplies said power threshold for the purpose of determining if the delam is a Tesloose. + /// + public static readonly CVarDef SupermatterTesloosePowerModifier = + CVarDef.Create("supermatter.tesloose_power_modifier", 1f, CVar.SERVER); + + /// + /// Toggles whether or not Tesloose delaminations can occur. If both Singuloose and Tesloose are disabled, it will always delam into a Nuke. + /// + public static readonly CVarDef SupermatterDoTeslooseDelam = + CVarDef.Create("supermatter.do_tesloose", true, CVar.SERVER); + + /// + /// When true, bypass the normal checks to determine delam type, and instead use the type chosen by supermatter.forced_delam_type + /// + public static readonly CVarDef SupermatterDoForceDelam = + CVarDef.Create("supermatter.do_force_delam", false, CVar.SERVER); + + /// + /// If supermatter.do_force_delam is true, this determines the delamination type, bypassing the normal checks. + /// + public static readonly CVarDef SupermatterForcedDelamType = + CVarDef.Create("supermatter.forced_delam_type", DelamType.Singulo, CVar.SERVER); + + /// + /// Directly multiplies the amount of rads put out by the supermatter. Be VERY conservative with this. + /// + public static readonly CVarDef SupermatterRadsModifier = + CVarDef.Create("supermatter.rads_modifier", 1f, CVar.SERVER); + + #endregion } } diff --git a/Content.Shared/Nyanotrasen/Carrying/CarryingDoAfterEvent.cs b/Content.Shared/Carrying/CarryingDoAfterEvent.cs similarity index 91% rename from Content.Shared/Nyanotrasen/Carrying/CarryingDoAfterEvent.cs rename to Content.Shared/Carrying/CarryingDoAfterEvent.cs index 6acd6b775f3..fb7225461cb 100644 --- a/Content.Shared/Nyanotrasen/Carrying/CarryingDoAfterEvent.cs +++ b/Content.Shared/Carrying/CarryingDoAfterEvent.cs @@ -4,7 +4,5 @@ namespace Content.Shared.Carrying { [Serializable, NetSerializable] - public sealed partial class CarryDoAfterEvent : SimpleDoAfterEvent - { - } + public sealed partial class CarryDoAfterEvent : SimpleDoAfterEvent { } } diff --git a/Content.Shared/Nyanotrasen/Carrying/CarryingSlowdownComponent.cs b/Content.Shared/Carrying/CarryingSlowdownComponent.cs similarity index 80% rename from Content.Shared/Nyanotrasen/Carrying/CarryingSlowdownComponent.cs rename to Content.Shared/Carrying/CarryingSlowdownComponent.cs index aabde66af0d..597edc2a795 100644 --- a/Content.Shared/Nyanotrasen/Carrying/CarryingSlowdownComponent.cs +++ b/Content.Shared/Carrying/CarryingSlowdownComponent.cs @@ -7,10 +7,10 @@ namespace Content.Shared.Carrying public sealed partial class CarryingSlowdownComponent : Component { - [DataField("walkModifier", required: true)] [ViewVariables(VVAccess.ReadWrite)] + [DataField(required: true)] public float WalkModifier = 1.0f; - [DataField("sprintModifier", required: true)] [ViewVariables(VVAccess.ReadWrite)] + [DataField(required: true)] public float SprintModifier = 1.0f; } diff --git a/Content.Shared/Nyanotrasen/Carrying/CarryingSlowdownSystem.cs b/Content.Shared/Carrying/CarryingSlowdownSystem.cs similarity index 85% rename from Content.Shared/Nyanotrasen/Carrying/CarryingSlowdownSystem.cs rename to Content.Shared/Carrying/CarryingSlowdownSystem.cs index 9b9c8cec10f..04b714fdd78 100644 --- a/Content.Shared/Nyanotrasen/Carrying/CarryingSlowdownSystem.cs +++ b/Content.Shared/Carrying/CarryingSlowdownSystem.cs @@ -31,13 +31,12 @@ private void OnGetState(EntityUid uid, CarryingSlowdownComponent component, ref private void OnHandleState(EntityUid uid, CarryingSlowdownComponent component, ref ComponentHandleState args) { - if (args.Current is CarryingSlowdownComponentState state) - { - component.WalkModifier = state.WalkModifier; - component.SprintModifier = state.SprintModifier; + if (args.Current is not CarryingSlowdownComponentState state) + return; - _movementSpeed.RefreshMovementSpeedModifiers(uid); - } + component.WalkModifier = state.WalkModifier; + component.SprintModifier = state.SprintModifier; + _movementSpeed.RefreshMovementSpeedModifiers(uid); } private void OnRefreshMoveSpeed(EntityUid uid, CarryingSlowdownComponent component, RefreshMovementSpeedModifiersEvent args) { diff --git a/Content.Shared/Nyanotrasen/CartridgeLoader/Cartridges/GlimmerMonitorUiState.cs b/Content.Shared/CartridgeLoader/Cartridges/GlimmerMonitorUiState.cs similarity index 100% rename from Content.Shared/Nyanotrasen/CartridgeLoader/Cartridges/GlimmerMonitorUiState.cs rename to Content.Shared/CartridgeLoader/Cartridges/GlimmerMonitorUiState.cs diff --git a/Content.Shared/Nyanotrasen/Chapel/SacrificeDoAfterEvent.cs b/Content.Shared/Chapel/SacrificeDoAfterEvent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Chapel/SacrificeDoAfterEvent.cs rename to Content.Shared/Chapel/SacrificeDoAfterEvent.cs diff --git a/Content.Shared/Climbing/Systems/ClimbSystem.cs b/Content.Shared/Climbing/Systems/ClimbSystem.cs index 8f6e8046aa4..521f5ace99d 100644 --- a/Content.Shared/Climbing/Systems/ClimbSystem.cs +++ b/Content.Shared/Climbing/Systems/ClimbSystem.cs @@ -13,6 +13,7 @@ using Content.Shared.Physics; using Content.Shared.Popups; using Content.Shared.Stunnable; +using Content.Shared.Traits.Assorted.Components; using Content.Shared.Verbs; using Robust.Shared.Audio.Systems; using Robust.Shared.Physics; @@ -216,7 +217,11 @@ public bool TryClimb( if (ev.Cancelled) return false; - var args = new DoAfterArgs(EntityManager, user, comp.ClimbDelay, new ClimbDoAfterEvent(), + var climbDelay = comp.ClimbDelay; + if (user == entityToMove && TryComp(user, out var delayModifier)) + climbDelay *= delayModifier.ClimbDelayMultiplier; + + var args = new DoAfterArgs(EntityManager, user, climbDelay, new ClimbDoAfterEvent(), entityToMove, target: climbable, used: entityToMove) diff --git a/Content.Shared/Clothing/Loadouts/Systems/LoadoutSystem.cs b/Content.Shared/Clothing/Loadouts/Systems/LoadoutSystem.cs index 09e3db3793f..e7a0eef80ee 100644 --- a/Content.Shared/Clothing/Loadouts/Systems/LoadoutSystem.cs +++ b/Content.Shared/Clothing/Loadouts/Systems/LoadoutSystem.cs @@ -38,12 +38,11 @@ private void OnMapInit(EntityUid uid, LoadoutComponent component, MapInitEvent a } - /// - public List ApplyCharacterLoadout(EntityUid uid, string job, HumanoidCharacterProfile profile, - Dictionary? playTimes = null) + public List ApplyCharacterLoadout(EntityUid uid, ProtoId job, HumanoidCharacterProfile profile, + Dictionary playTimes, bool whitelisted) { - var jobPrototype = _prototype.Index(job); - return ApplyCharacterLoadout(uid, jobPrototype, profile, playTimes); + var jobPrototype = _prototype.Index(job); + return ApplyCharacterLoadout(uid, jobPrototype, profile, playTimes, whitelisted); } /// @@ -53,9 +52,10 @@ public List ApplyCharacterLoadout(EntityUid uid, string job, Humanoid /// The job to use for loadout whitelist/blacklist (should be the job of the entity) /// The profile to get loadout items from (should be the entity's, or at least have the same species as the entity) /// Playtime for the player for use with playtime requirements + /// If the player is whitelisted /// A list of loadout items that couldn't be equipped but passed checks public List ApplyCharacterLoadout(EntityUid uid, JobPrototype job, HumanoidCharacterProfile profile, - Dictionary? playTimes = null) + Dictionary playTimes, bool whitelisted) { var failedLoadouts = new List(); @@ -68,8 +68,8 @@ public List ApplyCharacterLoadout(EntityUid uid, JobPrototype job, Hu continue; - if (!_characterRequirements.CheckRequirementsValid(loadoutProto, loadoutProto.Requirements, job, profile, - playTimes ?? new Dictionary(), + if (!_characterRequirements.CheckRequirementsValid( + loadoutProto.Requirements, job, profile, playTimes, whitelisted, EntityManager, _prototype, _configuration, out _)) continue; diff --git a/Content.Shared/Customization/Systems/CharacterRequirements.Job.cs b/Content.Shared/Customization/Systems/CharacterRequirements.Job.cs new file mode 100644 index 00000000000..fe44f2ccc06 --- /dev/null +++ b/Content.Shared/Customization/Systems/CharacterRequirements.Job.cs @@ -0,0 +1,299 @@ +using System.Linq; +using Content.Shared.CCVar; +using Content.Shared.Players.PlayTimeTracking; +using Content.Shared.Preferences; +using Content.Shared.Roles; +using Content.Shared.Roles.Jobs; +using JetBrains.Annotations; +using Robust.Shared.Configuration; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; +using Robust.Shared.Utility; + +namespace Content.Shared.Customization.Systems; + + +/// +/// Requires the selected job to be one of the specified jobs +/// +[UsedImplicitly] +[Serializable, NetSerializable] +public sealed partial class CharacterJobRequirement : CharacterRequirement +{ + [DataField(required: true)] + public List> Jobs; + + public override bool IsValid(JobPrototype job, HumanoidCharacterProfile profile, + Dictionary playTimes, bool whitelisted, + IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, + out FormattedMessage? reason) + { + var jobs = new List(); + + // Get the job names and department colors + foreach (var j in Jobs) + { + var jobProto = prototypeManager.Index(j); + var color = Color.LightBlue; + + foreach (var dept in prototypeManager.EnumeratePrototypes() + .OrderBy(d => Loc.GetString($"department-{d.ID}"))) + { + if (!dept.Roles.Contains(j)) + continue; + + color = dept.Color; + break; + } + + jobs.Add(FormattedMessage.FromMarkup($"[color={color.ToHex()}]{Loc.GetString(jobProto.Name)}[/color]")); + } + + // Join the job names + var jobsList = string.Join(", ", jobs.Select(j => j.ToMarkup())); + var jobsString = Loc.GetString("character-job-requirement", + ("inverted", Inverted), ("jobs", jobsList)); + + reason = FormattedMessage.FromMarkup(jobsString); + return Jobs.Contains(job.ID); + } +} + +/// +/// Requires the selected job to be in one of the specified departments +/// +[UsedImplicitly] +[Serializable, NetSerializable] +public sealed partial class CharacterDepartmentRequirement : CharacterRequirement +{ + [DataField(required: true)] + public List> Departments; + + public override bool IsValid(JobPrototype job, HumanoidCharacterProfile profile, + Dictionary playTimes, bool whitelisted, + IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, + out FormattedMessage? reason) + { + var departments = new List(); + + // Get the department names and colors + foreach (var d in Departments) + { + var deptProto = prototypeManager.Index(d); + var color = deptProto.Color; + + departments.Add(FormattedMessage.FromMarkup($"[color={color.ToHex()}]{Loc.GetString($"department-{deptProto.ID}")}[/color]")); + } + + // Join the department names + var departmentsList = string.Join(", ", departments.Select(d => d.ToMarkup())); + var departmentsString = Loc.GetString("character-department-requirement", + ("inverted", Inverted), ("departments", departmentsList)); + + reason = FormattedMessage.FromMarkup(departmentsString); + return Departments.Any(d => prototypeManager.Index(d).Roles.Contains(job.ID)); + } +} + +/// +/// Requires the playtime for a department to be within a certain range +/// +[UsedImplicitly] +[Serializable, NetSerializable] +public sealed partial class CharacterDepartmentTimeRequirement : CharacterRequirement +{ + [DataField] + public TimeSpan Min = TimeSpan.MinValue; + + [DataField] + public TimeSpan Max = TimeSpan.MaxValue; + + [DataField(required: true)] + public ProtoId Department; + + public override bool IsValid(JobPrototype job, HumanoidCharacterProfile profile, + Dictionary playTimes, bool whitelisted, + IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, + out FormattedMessage? reason) + { + // Disable the requirement if the role timers are disabled + if (!configManager.GetCVar(CCVars.GameRoleTimers)) + { + reason = null; + return !Inverted; + } + + var department = prototypeManager.Index(Department); + + // Combine all of this department's job playtimes + var playtime = TimeSpan.Zero; + foreach (var other in department.Roles) + { + var proto = prototypeManager.Index(other).PlayTimeTracker; + + playTimes.TryGetValue(proto, out var otherTime); + playtime += otherTime; + } + + if (playtime > Max) + { + // Show the reason if invalid + reason = Inverted + ? null + : FormattedMessage.FromMarkup(Loc.GetString("character-timer-department-too-high", + ("time", playtime.TotalMinutes - Max.TotalMinutes), + ("department", Loc.GetString($"department-{department.ID}")), + ("departmentColor", department.Color))); + return false; + } + + if (playtime < Min) + { + // Show the reason if invalid + reason = Inverted + ? null + : FormattedMessage.FromMarkup(Loc.GetString("character-timer-department-insufficient", + ("time", Min.TotalMinutes - playtime.TotalMinutes), + ("department", Loc.GetString($"department-{department.ID}")), + ("departmentColor", department.Color))); + return false; + } + + reason = null; + return true; + } +} + +/// +/// Requires the player to have a certain amount of overall job time +/// +[UsedImplicitly] +[Serializable, NetSerializable] +public sealed partial class CharacterOverallTimeRequirement : CharacterRequirement +{ + [DataField] + public TimeSpan Min = TimeSpan.MinValue; + + [DataField] + public TimeSpan Max = TimeSpan.MaxValue; + + public override bool IsValid(JobPrototype job, HumanoidCharacterProfile profile, + Dictionary playTimes, bool whitelisted, + IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, + out FormattedMessage? reason) + { + // Disable the requirement if the role timers are disabled + if (!configManager.GetCVar(CCVars.GameRoleTimers)) + { + reason = null; + return !Inverted; + } + + // Get the overall time + var overallTime = playTimes.GetValueOrDefault(PlayTimeTrackingShared.TrackerOverall); + + if (overallTime > Max) + { + // Show the reason if invalid + reason = Inverted + ? null + : FormattedMessage.FromMarkup(Loc.GetString("character-timer-overall-too-high", + ("time", overallTime.TotalMinutes - Max.TotalMinutes))); + return false; + } + + if (overallTime < Min) + { + // Show the reason if invalid + reason = Inverted + ? null + : FormattedMessage.FromMarkup(Loc.GetString("character-timer-overall-insufficient", + ("time", Min.TotalMinutes - overallTime.TotalMinutes))); + return false; + } + + reason = null; + return true; + } +} + +/// +/// Requires the playtime for a tracker to be within a certain range +/// +[UsedImplicitly] +[Serializable, NetSerializable] +public sealed partial class CharacterPlaytimeRequirement : CharacterRequirement +{ + [DataField] + public TimeSpan Min = TimeSpan.MinValue; + + [DataField] + public TimeSpan Max = TimeSpan.MaxValue; + + [DataField(required: true)] + public ProtoId Tracker; + + public override bool IsValid(JobPrototype job, HumanoidCharacterProfile profile, + Dictionary playTimes, bool whitelisted, + IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, + out FormattedMessage? reason) + { + // Disable the requirement if the role timers are disabled + if (!configManager.GetCVar(CCVars.GameRoleTimers)) + { + reason = null; + return !Inverted; + } + + // Get SharedJobSystem + if (!entityManager.EntitySysManager.TryGetEntitySystem(out SharedJobSystem? jobSystem)) + { + DebugTools.Assert("CharacterRequirements: SharedJobSystem not found"); + reason = null; + return false; + } + + // Get the JobPrototype of the Tracker + var trackerJob = jobSystem.GetJobPrototype(Tracker); + var jobStr = prototypeManager.Index(trackerJob).LocalizedName; + + // Get the primary department of the Tracker + if (!jobSystem.TryGetPrimaryDepartment(trackerJob, out var department) && + !jobSystem.TryGetDepartment(trackerJob, out department)) + { + DebugTools.Assert($"CharacterRequirements: Department not found for job {trackerJob}"); + reason = null; + return false; + } + + // Get the time for the tracker + var time = playTimes.GetValueOrDefault(Tracker); + reason = null; + + if (time > Max) + { + // Show the reason if invalid + reason = Inverted + ? null + : FormattedMessage.FromMarkup(Loc.GetString("character-timer-role-too-high", + ("time", time.TotalMinutes - Max.TotalMinutes), + ("job", jobStr), + ("departmentColor", department.Color))); + return false; + } + + if (time < Min) + { + // Show the reason if invalid + reason = Inverted + ? null + : FormattedMessage.FromMarkup(Loc.GetString("character-timer-role-insufficient", + ("time", Min.TotalMinutes - time.TotalMinutes), + ("job", jobStr), + ("departmentColor", department.Color))); + return false; + } + + return true; + } +} diff --git a/Content.Shared/Customization/Systems/CharacterRequirements.Profile.cs b/Content.Shared/Customization/Systems/CharacterRequirements.Profile.cs new file mode 100644 index 00000000000..aaeae107b9e --- /dev/null +++ b/Content.Shared/Customization/Systems/CharacterRequirements.Profile.cs @@ -0,0 +1,157 @@ +using System.Linq; +using Content.Shared.Clothing.Loadouts.Prototypes; +using Content.Shared.Humanoid.Prototypes; +using Content.Shared.Preferences; +using Content.Shared.Roles; +using Content.Shared.Traits; +using JetBrains.Annotations; +using Robust.Shared.Configuration; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; +using Robust.Shared.Utility; + +namespace Content.Shared.Customization.Systems; + + +/// +/// Requires the profile to be within an age range +/// +[UsedImplicitly] +[Serializable, NetSerializable] +public sealed partial class CharacterAgeRequirement : CharacterRequirement +{ + [DataField(required: true)] + public int Min; + + [DataField(required: true)] + public int Max; + + public override bool IsValid(JobPrototype job, HumanoidCharacterProfile profile, + Dictionary playTimes, bool whitelisted, + IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, + out FormattedMessage? reason) + { + reason = FormattedMessage.FromMarkup(Loc.GetString("character-age-requirement", + ("inverted", Inverted), ("min", Min), ("max", Max))); + return profile.Age >= Min && profile.Age <= Max; + } +} + +/// +/// Requires the profile to use either a Backpack, Satchel, or Duffelbag +/// +[UsedImplicitly] +[Serializable, NetSerializable] +public sealed partial class CharacterBackpackTypeRequirement : CharacterRequirement +{ + [DataField(required: true)] + public BackpackPreference Preference; + + public override bool IsValid(JobPrototype job, HumanoidCharacterProfile profile, + Dictionary playTimes, bool whitelisted, + IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, + out FormattedMessage? reason) + { + reason = FormattedMessage.FromMarkup(Loc.GetString("character-backpack-type-requirement", + ("inverted", Inverted), + ("type", Loc.GetString($"humanoid-profile-editor-preference-{Preference.ToString().ToLower()}")))); + return profile.Backpack == Preference; + } +} + +/// +/// Requires the profile to use either Jumpsuits or Jumpskirts +/// +[UsedImplicitly] +[Serializable, NetSerializable] +public sealed partial class CharacterClothingPreferenceRequirement : CharacterRequirement +{ + [DataField(required: true)] + public ClothingPreference Preference; + + public override bool IsValid(JobPrototype job, HumanoidCharacterProfile profile, + Dictionary playTimes, bool whitelisted, + IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, + out FormattedMessage? reason) + { + reason = FormattedMessage.FromMarkup(Loc.GetString("character-clothing-preference-requirement", + ("inverted", Inverted), + ("preference", Loc.GetString($"humanoid-profile-editor-preference-{Preference.ToString().ToLower()}")))); + return profile.Clothing == Preference; + } +} + +/// +/// Requires the profile to be a certain species +/// +[UsedImplicitly] +[Serializable, NetSerializable] +public sealed partial class CharacterSpeciesRequirement : CharacterRequirement +{ + [DataField(required: true)] + public List> Species; + + public override bool IsValid(JobPrototype job, HumanoidCharacterProfile profile, + Dictionary playTimes, bool whitelisted, + IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, + out FormattedMessage? reason) + { + const string color = "green"; + reason = FormattedMessage.FromMarkup(Loc.GetString("character-species-requirement", + ("inverted", Inverted), + ("species", $"[color={color}]{string.Join($"[/color], [color={color}]", + Species.Select(s => Loc.GetString(prototypeManager.Index(s).Name)))}[/color]"))); + + return Species.Contains(profile.Species); + } +} + +/// +/// Requires the profile to have one of the specified traits +/// +[UsedImplicitly] +[Serializable, NetSerializable] +public sealed partial class CharacterTraitRequirement : CharacterRequirement +{ + [DataField(required: true)] + public List> Traits; + + public override bool IsValid(JobPrototype job, HumanoidCharacterProfile profile, + Dictionary playTimes, bool whitelisted, + IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, + out FormattedMessage? reason) + { + const string color = "lightblue"; + reason = FormattedMessage.FromMarkup(Loc.GetString("character-trait-requirement", + ("inverted", Inverted), + ("traits", $"[color={color}]{string.Join($"[/color], [color={color}]", + Traits.Select(t => Loc.GetString($"trait-name-{t}")))}[/color]"))); + + return Traits.Any(t => profile.TraitPreferences.Contains(t.ToString())); + } +} + +/// +/// Requires the profile to have one of the specified loadouts +/// +[UsedImplicitly] +[Serializable, NetSerializable] +public sealed partial class CharacterLoadoutRequirement : CharacterRequirement +{ + [DataField(required: true)] + public List> Loadouts; + + public override bool IsValid(JobPrototype job, HumanoidCharacterProfile profile, + Dictionary playTimes, bool whitelisted, + IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, + out FormattedMessage? reason) + { + const string color = "lightblue"; + reason = FormattedMessage.FromMarkup(Loc.GetString("character-loadout-requirement", + ("inverted", Inverted), + ("loadouts", $"[color={color}]{string.Join($"[/color], [color={color}]", + Loadouts.Select(l => Loc.GetString($"loadout-name-{l}")))}[/color]"))); + + return Loadouts.Any(l => profile.LoadoutPreferences.Contains(l.ToString())); + } +} diff --git a/Content.Shared/Customization/Systems/CharacterRequirements.Whitelist.cs b/Content.Shared/Customization/Systems/CharacterRequirements.Whitelist.cs new file mode 100644 index 00000000000..56465251cdd --- /dev/null +++ b/Content.Shared/Customization/Systems/CharacterRequirements.Whitelist.cs @@ -0,0 +1,28 @@ +using Content.Shared.CCVar; +using Content.Shared.Preferences; +using Content.Shared.Roles; +using JetBrains.Annotations; +using Robust.Shared.Configuration; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; +using Robust.Shared.Utility; + +namespace Content.Shared.Customization.Systems; + + +/// +/// Requires the player to be whitelisted if whitelists are enabled +/// +[UsedImplicitly] +[Serializable, NetSerializable] +public sealed partial class CharacterWhitelistRequirement : CharacterRequirement +{ + public override bool IsValid(JobPrototype job, HumanoidCharacterProfile profile, + Dictionary playTimes, bool whitelisted, + IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, + out FormattedMessage? reason) + { + reason = FormattedMessage.FromMarkup(Loc.GetString("character-whitelist-requirement", ("inverted", Inverted))); + return !configManager.GetCVar(CCVars.WhitelistEnabled) || whitelisted; + } +} diff --git a/Content.Shared/Customization/Systems/CharacterRequirements.cs b/Content.Shared/Customization/Systems/CharacterRequirements.cs index 4e862aa69e3..b347c9787af 100644 --- a/Content.Shared/Customization/Systems/CharacterRequirements.cs +++ b/Content.Shared/Customization/Systems/CharacterRequirements.cs @@ -1,12 +1,5 @@ -using System.Linq; -using Content.Shared.CCVar; -using Content.Shared.Clothing.Loadouts.Prototypes; -using Content.Shared.Humanoid.Prototypes; -using Content.Shared.Players.PlayTimeTracking; using Content.Shared.Preferences; using Content.Shared.Roles; -using Content.Shared.Roles.Jobs; -using Content.Shared.Traits; using JetBrains.Annotations; using Robust.Shared.Configuration; using Robust.Shared.Prototypes; @@ -22,459 +15,25 @@ public abstract partial class CharacterRequirement { /// /// If true valid requirements will be treated as invalid and vice versa + /// This inversion is done by other systems like , not this one /// [DataField] public bool Inverted; /// /// Checks if this character requirement is valid for the given parameters + ///
+ /// You should probably not be calling this directly, use ///
/// Description for the requirement, shown when not null public abstract bool IsValid( - IPrototype prototype, JobPrototype job, HumanoidCharacterProfile profile, Dictionary playTimes, + bool whitelisted, IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, out FormattedMessage? reason ); } - - -#region HumanoidCharacterProfile - -/// -/// Requires the profile to be within an age range -/// -[UsedImplicitly] -[Serializable, NetSerializable] -public sealed partial class CharacterAgeRequirement : CharacterRequirement -{ - [DataField(required: true)] - public int Min; - - [DataField(required: true)] - public int Max; - - public override bool IsValid(IPrototype prototype, JobPrototype job, HumanoidCharacterProfile profile, - Dictionary playTimes, - IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, - out FormattedMessage? reason) - { - reason = FormattedMessage.FromMarkup(Loc.GetString("character-age-requirement", - ("inverted", Inverted), ("min", Min), ("max", Max))); - return profile.Age >= Min && profile.Age <= Max; - } -} - -/// -/// Requires the profile to use either a Backpack, Satchel, or Duffelbag -/// -[UsedImplicitly] -[Serializable, NetSerializable] -public sealed partial class CharacterBackpackTypeRequirement : CharacterRequirement -{ - [DataField(required: true)] - public BackpackPreference Preference; - - public override bool IsValid(IPrototype prototype, JobPrototype job, HumanoidCharacterProfile profile, - Dictionary playTimes, - IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, - out FormattedMessage? reason) - { - reason = FormattedMessage.FromMarkup(Loc.GetString("character-backpack-type-requirement", - ("inverted", Inverted), - ("type", Loc.GetString($"humanoid-profile-editor-preference-{Preference.ToString().ToLower()}")))); - return profile.Backpack == Preference; - } -} - -/// -/// Requires the profile to use either Jumpsuits or Jumpskirts -/// -[UsedImplicitly] -[Serializable, NetSerializable] -public sealed partial class CharacterClothingPreferenceRequirement : CharacterRequirement -{ - [DataField(required: true)] - public ClothingPreference Preference; - - public override bool IsValid(IPrototype prototype, JobPrototype job, HumanoidCharacterProfile profile, - Dictionary playTimes, - IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, - out FormattedMessage? reason) - { - reason = FormattedMessage.FromMarkup(Loc.GetString("character-clothing-preference-requirement", - ("inverted", Inverted), - ("preference", Loc.GetString($"humanoid-profile-editor-preference-{Preference.ToString().ToLower()}")))); - return profile.Clothing == Preference; - } -} - -/// -/// Requires the profile to be a certain species -/// -[UsedImplicitly] -[Serializable, NetSerializable] -public sealed partial class CharacterSpeciesRequirement : CharacterRequirement -{ - [DataField(required: true)] - public List> Species; - - public override bool IsValid(IPrototype prototype, JobPrototype job, HumanoidCharacterProfile profile, - Dictionary playTimes, - IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, - out FormattedMessage? reason) - { - const string color = "green"; - reason = FormattedMessage.FromMarkup(Loc.GetString("character-species-requirement", - ("inverted", Inverted), - ("species", $"[color={color}]{string.Join($"[/color], [color={color}]", - Species.Select(s => Loc.GetString(prototypeManager.Index(s).Name)))}[/color]"))); - - return Species.Contains(profile.Species); - } -} - -/// -/// Requires the profile to have one of the specified traits -/// -[UsedImplicitly] -[Serializable, NetSerializable] -public sealed partial class CharacterTraitRequirement : CharacterRequirement -{ - [DataField(required: true)] - public List> Traits; - - public override bool IsValid(IPrototype prototype, JobPrototype job, HumanoidCharacterProfile profile, - Dictionary playTimes, - IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, - out FormattedMessage? reason) - { - const string color = "lightblue"; - reason = FormattedMessage.FromMarkup(Loc.GetString("character-trait-requirement", - ("inverted", Inverted), - ("traits", $"[color={color}]{string.Join($"[/color], [color={color}]", - Traits.Select(t => Loc.GetString($"trait-name-{t}")))}[/color]"))); - - return Traits.Any(t => profile.TraitPreferences.Contains(t.ToString())); - } -} - -/// -/// Requires the profile to have one of the specified loadouts -/// -[UsedImplicitly] -[Serializable, NetSerializable] -public sealed partial class CharacterLoadoutRequirement : CharacterRequirement -{ - [DataField(required: true)] - public List> Loadouts; - - public override bool IsValid(IPrototype prototype, JobPrototype job, HumanoidCharacterProfile profile, - Dictionary playTimes, - IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, - out FormattedMessage? reason) - { - const string color = "lightblue"; - reason = FormattedMessage.FromMarkup(Loc.GetString("character-loadout-requirement", - ("inverted", Inverted), - ("loadouts", $"[color={color}]{string.Join($"[/color], [color={color}]", - Loadouts.Select(l => Loc.GetString($"loadout-name-{l}")))}[/color]"))); - - return Loadouts.Any(l => profile.LoadoutPreferences.Contains(l.ToString())); - } -} - -#endregion - -#region Jobs - -/// -/// Requires the selected job to be one of the specified jobs -/// -[UsedImplicitly] -[Serializable, NetSerializable] -public sealed partial class CharacterJobRequirement : CharacterRequirement -{ - [DataField(required: true)] - public List> Jobs; - - public override bool IsValid(IPrototype prototype, JobPrototype job, HumanoidCharacterProfile profile, - Dictionary playTimes, - IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, - out FormattedMessage? reason) - { - var jobs = new List(); - - // Get the job names and department colors - foreach (var j in Jobs) - { - var jobProto = prototypeManager.Index(j); - var color = Color.LightBlue; - - foreach (var dept in prototypeManager.EnumeratePrototypes() - .OrderBy(d => Loc.GetString($"department-{d.ID}"))) - { - if (!dept.Roles.Contains(j)) - continue; - - color = dept.Color; - break; - } - - jobs.Add(FormattedMessage.FromMarkup($"[color={color.ToHex()}]{Loc.GetString(jobProto.Name)}[/color]")); - } - - // Join the job names - var jobsList = string.Join(", ", jobs.Select(j => j.ToMarkup())); - var jobsString = Loc.GetString("character-job-requirement", - ("inverted", Inverted), ("jobs", jobsList)); - - reason = FormattedMessage.FromMarkup(jobsString); - return Jobs.Contains(job.ID); - } -} - -/// -/// Requires the selected job to be in one of the specified departments -/// -[UsedImplicitly] -[Serializable, NetSerializable] -public sealed partial class CharacterDepartmentRequirement : CharacterRequirement -{ - [DataField(required: true)] - public List> Departments; - - public override bool IsValid(IPrototype prototype, JobPrototype job, HumanoidCharacterProfile profile, - Dictionary playTimes, - IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, - out FormattedMessage? reason) - { - var departments = new List(); - - // Get the department names and colors - foreach (var d in Departments) - { - var deptProto = prototypeManager.Index(d); - var color = deptProto.Color; - - departments.Add(FormattedMessage.FromMarkup($"[color={color.ToHex()}]{Loc.GetString($"department-{deptProto.ID}")}[/color]")); - } - - // Join the department names - var departmentsList = string.Join(", ", departments.Select(d => d.ToMarkup())); - var departmentsString = Loc.GetString("character-department-requirement", - ("inverted", Inverted), ("departments", departmentsList)); - - reason = FormattedMessage.FromMarkup(departmentsString); - return Departments.Any(d => prototypeManager.Index(d).Roles.Contains(job.ID)); - } -} - -/// -/// Requires the playtime for a department to be within a certain range -/// -[UsedImplicitly] -[Serializable, NetSerializable] -public sealed partial class CharacterDepartmentTimeRequirement : CharacterRequirement -{ - [DataField] - public TimeSpan Min = TimeSpan.MinValue; - - [DataField] - public TimeSpan Max = TimeSpan.MaxValue; - - [DataField(required: true)] - public ProtoId Department; - - public override bool IsValid(IPrototype prototype, JobPrototype job, HumanoidCharacterProfile profile, - Dictionary playTimes, - IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, - out FormattedMessage? reason) - { - // Disable the requirement if the role timers are disabled - if (!configManager.GetCVar(CCVars.GameRoleTimers)) - { - reason = null; - return !Inverted; - } - - var department = prototypeManager.Index(Department); - - // Combine all of this department's job playtimes - var playtime = TimeSpan.Zero; - foreach (var other in department.Roles) - { - var proto = prototypeManager.Index(other).PlayTimeTracker; - - playTimes.TryGetValue(proto, out var otherTime); - playtime += otherTime; - } - - if (playtime > Max) - { - // Show the reason if invalid - reason = Inverted - ? null - : FormattedMessage.FromMarkup(Loc.GetString("character-timer-department-too-high", - ("time", playtime.TotalMinutes - Max.TotalMinutes), - ("department", Loc.GetString($"department-{department.ID}")), - ("departmentColor", department.Color))); - return false; - } - - if (playtime < Min) - { - // Show the reason if invalid - reason = Inverted - ? null - : FormattedMessage.FromMarkup(Loc.GetString("character-timer-department-insufficient", - ("time", Min.TotalMinutes - playtime.TotalMinutes), - ("department", Loc.GetString($"department-{department.ID}")), - ("departmentColor", department.Color))); - return false; - } - - reason = null; - return true; - } -} - -/// -/// Requires the player to have a certain amount of overall job time -/// -[UsedImplicitly] -[Serializable, NetSerializable] -public sealed partial class CharacterOverallTimeRequirement : CharacterRequirement -{ - [DataField] - public TimeSpan Min = TimeSpan.MinValue; - - [DataField] - public TimeSpan Max = TimeSpan.MaxValue; - - public override bool IsValid(IPrototype prototype, JobPrototype job, HumanoidCharacterProfile profile, - Dictionary playTimes, - IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, - out FormattedMessage? reason) - { - // Disable the requirement if the role timers are disabled - if (!configManager.GetCVar(CCVars.GameRoleTimers)) - { - reason = null; - return !Inverted; - } - - // Get the overall time - var overallTime = playTimes.GetValueOrDefault(PlayTimeTrackingShared.TrackerOverall); - - if (overallTime > Max) - { - // Show the reason if invalid - reason = Inverted - ? null - : FormattedMessage.FromMarkup(Loc.GetString("character-timer-overall-too-high", - ("time", overallTime.TotalMinutes - Max.TotalMinutes))); - return false; - } - - if (overallTime < Min) - { - // Show the reason if invalid - reason = Inverted - ? null - : FormattedMessage.FromMarkup(Loc.GetString("character-timer-overall-insufficient", - ("time", Min.TotalMinutes - overallTime.TotalMinutes))); - return false; - } - - reason = null; - return true; - } -} - -/// -/// Requires the playtime for a tracker to be within a certain range -/// -[UsedImplicitly] -[Serializable, NetSerializable] -public sealed partial class CharacterPlaytimeRequirement : CharacterRequirement -{ - [DataField] - public TimeSpan Min = TimeSpan.MinValue; - - [DataField] - public TimeSpan Max = TimeSpan.MaxValue; - - [DataField(required: true)] - public ProtoId Tracker; - - public override bool IsValid(IPrototype prototype, JobPrototype job, HumanoidCharacterProfile profile, - Dictionary playTimes, - IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, - out FormattedMessage? reason) - { - // Disable the requirement if the role timers are disabled - if (!configManager.GetCVar(CCVars.GameRoleTimers)) - { - reason = null; - return !Inverted; - } - - // Get SharedJobSystem - if (!entityManager.EntitySysManager.TryGetEntitySystem(out SharedJobSystem? jobSystem)) - { - DebugTools.Assert("CharacterRequirements: SharedJobSystem not found"); - reason = null; - return false; - } - - // Get the JobPrototype of the Tracker - var trackerJob = jobSystem.GetJobPrototype(Tracker); - var jobStr = prototypeManager.Index(trackerJob).LocalizedName; - - // Get the primary department of the Tracker - if (!jobSystem.TryGetPrimaryDepartment(trackerJob, out var department) && - !jobSystem.TryGetDepartment(trackerJob, out department)) - { - DebugTools.Assert($"CharacterRequirements: Department not found for job {trackerJob}"); - reason = null; - return false; - } - - // Get the time for the tracker - var time = playTimes.GetValueOrDefault(Tracker); - reason = null; - - if (time > Max) - { - // Show the reason if invalid - reason = Inverted - ? null - : FormattedMessage.FromMarkup(Loc.GetString("character-timer-role-too-high", - ("time", time.TotalMinutes - Max.TotalMinutes), - ("job", jobStr), - ("departmentColor", department.Color))); - return false; - } - - if (time < Min) - { - // Show the reason if invalid - reason = Inverted - ? null - : FormattedMessage.FromMarkup(Loc.GetString("character-timer-role-insufficient", - ("time", Min.TotalMinutes - time.TotalMinutes), - ("job", jobStr), - ("departmentColor", department.Color))); - return false; - } - - return true; - } -} - -#endregion diff --git a/Content.Shared/Customization/Systems/CharacterRequirementsSystem.cs b/Content.Shared/Customization/Systems/CharacterRequirementsSystem.cs index f21971b5e68..521c4f186a2 100644 --- a/Content.Shared/Customization/Systems/CharacterRequirementsSystem.cs +++ b/Content.Shared/Customization/Systems/CharacterRequirementsSystem.cs @@ -1,3 +1,4 @@ +using System.Text; using Content.Shared.Preferences; using Content.Shared.Roles; using Robust.Shared.Configuration; @@ -9,8 +10,8 @@ namespace Content.Shared.Customization.Systems; public sealed class CharacterRequirementsSystem : EntitySystem { - public bool CheckRequirementsValid(IPrototype prototype, List requirements, JobPrototype job, - HumanoidCharacterProfile profile, Dictionary playTimes, + public bool CheckRequirementsValid(List requirements, JobPrototype job, + HumanoidCharacterProfile profile, Dictionary playTimes, bool whitelisted, IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, out List reasons) { @@ -21,7 +22,7 @@ public bool CheckRequirementsValid(IPrototype prototype, List + /// Gets the reason text from as a . + ///
+ public FormattedMessage GetRequirementsText(List reasons) + { + var text = new StringBuilder(); + foreach (var reason in reasons) + text.Append($"\n{reason.ToMarkup()}"); + + return FormattedMessage.FromMarkup(text.ToString().Trim()); + } + + /// + /// Gets the reason text from as a markup string. + /// + public string GetRequirementsMarkup(List reasons) + { + var text = new StringBuilder(); + foreach (var reason in reasons) + text.Append($"\n{reason.ToMarkup()}"); + + return text.ToString().Trim(); + } } diff --git a/Content.Shared/Damage/Events/StaminaMeleeHitEvent.cs b/Content.Shared/Damage/Events/TakeStaminaDamageEvent.cs similarity index 67% rename from Content.Shared/Damage/Events/StaminaMeleeHitEvent.cs rename to Content.Shared/Damage/Events/TakeStaminaDamageEvent.cs index c5ed0ddb602..6fca9dc2ef3 100644 --- a/Content.Shared/Damage/Events/StaminaMeleeHitEvent.cs +++ b/Content.Shared/Damage/Events/TakeStaminaDamageEvent.cs @@ -1,5 +1,5 @@ using Content.Shared.Damage.Components; -using Robust.Shared.Collections; +using Content.Shared.Inventory; namespace Content.Shared.Damage.Events; @@ -7,12 +7,14 @@ namespace Content.Shared.Damage.Events; /// The components in the list are going to be hit, /// give opportunities to change the damage or other stuff. ///
-public sealed class StaminaMeleeHitEvent : HandledEntityEventArgs +public sealed class TakeStaminaDamageEvent : HandledEntityEventArgs, IInventoryRelayEvent { + public SlotFlags TargetSlots { get; } = ~SlotFlags.POCKET; + /// /// List of hit stamina components. /// - public List<(EntityUid Entity, StaminaComponent Component)> HitList; + public EntityUid Target; /// /// The multiplier. Generally, try to use *= or /= instead of overwriting. @@ -24,8 +26,8 @@ public sealed class StaminaMeleeHitEvent : HandledEntityEventArgs /// public float FlatModifier = 0; - public StaminaMeleeHitEvent(List<(EntityUid Entity, StaminaComponent Component)> hitList) + public TakeStaminaDamageEvent(EntityUid target) { - HitList = hitList; + Target = target; } } diff --git a/Content.Shared/Damage/Systems/StaminaSystem.cs b/Content.Shared/Damage/Systems/StaminaSystem.cs index a92abeeefc0..54a88205b2d 100644 --- a/Content.Shared/Damage/Systems/StaminaSystem.cs +++ b/Content.Shared/Damage/Systems/StaminaSystem.cs @@ -166,20 +166,20 @@ private void OnMeleeHit(EntityUid uid, StaminaDamageOnHitComponent component, Me toHit.Add((ent, stam)); } - var hitEvent = new StaminaMeleeHitEvent(toHit); - RaiseLocalEvent(uid, hitEvent); + foreach (var (ent, comp) in toHit) + { + var hitEvent = new TakeStaminaDamageEvent(ent); + RaiseLocalEvent(uid, hitEvent); - if (hitEvent.Handled) - return; + if (hitEvent.Handled) + return; - var damage = component.Damage; + var damage = component.Damage; - damage *= hitEvent.Multiplier; + damage *= hitEvent.Multiplier; - damage += hitEvent.FlatModifier; + damage += hitEvent.FlatModifier; - foreach (var (ent, comp) in toHit) - { TakeStaminaDamage(ent, damage / toHit.Count, comp, source: args.User, with: args.Weapon, sound: component.Sound); } } @@ -204,12 +204,27 @@ private void OnThrowHit(EntityUid uid, StaminaDamageOnCollideComponent component private void OnCollide(EntityUid uid, StaminaDamageOnCollideComponent component, EntityUid target) { + if (!TryComp(target, out var stamComp)) + return; + var ev = new StaminaDamageOnHitAttemptEvent(); RaiseLocalEvent(uid, ref ev); if (ev.Cancelled) return; - TakeStaminaDamage(target, component.Damage, source: uid, sound: component.Sound); + var hitEvent = new TakeStaminaDamageEvent(target); + RaiseLocalEvent(target, hitEvent); + + if (hitEvent.Handled) + return; + + var damage = component.Damage; + + damage *= hitEvent.Multiplier; + + damage += hitEvent.FlatModifier; + + TakeStaminaDamage(target, damage, source: uid, sound: component.Sound); } private void SetStaminaAlert(EntityUid uid, StaminaComponent? component = null) diff --git a/Content.Shared/DeltaV/Roles/JobRequirements.Whitelist.cs b/Content.Shared/DeltaV/Roles/JobRequirements.Whitelist.cs deleted file mode 100644 index a6e352991e9..00000000000 --- a/Content.Shared/DeltaV/Roles/JobRequirements.Whitelist.cs +++ /dev/null @@ -1,11 +0,0 @@ -using JetBrains.Annotations; -using Robust.Shared.Serialization; - -namespace Content.Shared.Roles -{ - [UsedImplicitly] - [Serializable, NetSerializable] - public sealed partial class WhitelistRequirement : JobRequirement - { - } -} diff --git a/Content.Shared/DoAfter/SharedDoAfterSystem.cs b/Content.Shared/DoAfter/SharedDoAfterSystem.cs index 9e81c91550f..3b0ba58f55a 100644 --- a/Content.Shared/DoAfter/SharedDoAfterSystem.cs +++ b/Content.Shared/DoAfter/SharedDoAfterSystem.cs @@ -65,7 +65,8 @@ private void OnDamage(EntityUid uid, DoAfterComponent component, DamageChangedEv { // If we're applying state then let the server state handle the do_after prediction. // This is to avoid scenarios where a do_after is erroneously cancelled on the final tick. - if (!args.InterruptsDoAfters || !args.DamageIncreased || args.DamageDelta == null || GameTiming.ApplyingState) + if (!args.InterruptsDoAfters || !args.DamageIncreased || args.DamageDelta == null || GameTiming.ApplyingState + || args.DamageDelta.DamageDict.ContainsKey("Radiation")) //Sanity check so people can crowbar doors open to flee from Lord Singuloth return; var delta = args.DamageDelta.GetTotal(); diff --git a/Content.Shared/Ghost/Roles/GhostRolesEuiMessages.cs b/Content.Shared/Ghost/Roles/GhostRolesEuiMessages.cs index 8fbb931ca95..74af1e89ecc 100644 --- a/Content.Shared/Ghost/Roles/GhostRolesEuiMessages.cs +++ b/Content.Shared/Ghost/Roles/GhostRolesEuiMessages.cs @@ -1,3 +1,4 @@ +using Content.Shared.Customization.Systems; using Content.Shared.Eui; using Content.Shared.Roles; using Robust.Shared.Serialization; @@ -11,7 +12,7 @@ public struct GhostRoleInfo public string Name { get; set; } public string Description { get; set; } public string Rules { get; set; } - public HashSet? Requirements { get; set; } + public List? Requirements { get; set; } } [NetSerializable, Serializable] diff --git a/Content.Shared/Humanoid/SkinColor.cs b/Content.Shared/Humanoid/SkinColor.cs index 55fab4af5ba..dcc5c2d7645 100644 --- a/Content.Shared/Humanoid/SkinColor.cs +++ b/Content.Shared/Humanoid/SkinColor.cs @@ -136,7 +136,7 @@ public static Color TintedHues(Color color) /// The skin color to blend with /// Blending factor (0.0 to 1.0) /// Tinted hue color - public static Color TintedHuesSkin(Color color, Color skinColor, float blendFactor = 0.5f) + public static Color TintedHuesSkin(Color color, Color skinColor, float blendFactor = 0.0f) { blendFactor = MathHelper.Clamp(blendFactor, 0.0f, 1.0f); diff --git a/Content.Shared/Inventory/InventorySystem.Relay.cs b/Content.Shared/Inventory/InventorySystem.Relay.cs index c43a5885077..3308e881c52 100644 --- a/Content.Shared/Inventory/InventorySystem.Relay.cs +++ b/Content.Shared/Inventory/InventorySystem.Relay.cs @@ -1,5 +1,6 @@ using Content.Shared.Chemistry; using Content.Shared.Damage; +using Content.Shared.Damage.Events; using Content.Shared.Electrocution; using Content.Shared.Explosion; using Content.Shared.Eye.Blinding.Systems; @@ -20,6 +21,7 @@ public partial class InventorySystem public void InitializeRelay() { SubscribeLocalEvent(RelayInventoryEvent); + SubscribeLocalEvent(RelayInventoryEvent); SubscribeLocalEvent(RelayInventoryEvent); SubscribeLocalEvent(RelayInventoryEvent); SubscribeLocalEvent(RelayInventoryEvent); diff --git a/Content.Shared/Language/LanguagePrototype.cs b/Content.Shared/Language/LanguagePrototype.cs index d3a977202be..d40a7b40681 100644 --- a/Content.Shared/Language/LanguagePrototype.cs +++ b/Content.Shared/Language/LanguagePrototype.cs @@ -37,8 +37,12 @@ public sealed class LanguagePrototype : IPrototype [DataDefinition] public sealed partial class SpeechOverrideInfo { + /// + /// Color which text in this language will be blended with. + /// Alpha blending is used, which means the alpha component of the color controls the intensity of this color. + /// [DataField] - public Color Color = Color.White; + public Color? Color = null; [DataField] public string? FontId; diff --git a/Content.Shared/Medical/CPR/Components/CPRTrainingComponent.cs b/Content.Shared/Medical/CPR/Components/CPRTrainingComponent.cs new file mode 100644 index 00000000000..e01250858a1 --- /dev/null +++ b/Content.Shared/Medical/CPR/Components/CPRTrainingComponent.cs @@ -0,0 +1,33 @@ +using Robust.Shared.GameStates; +using Content.Shared.DoAfter; +using Robust.Shared.Audio; +using Robust.Shared.Serialization; + +namespace Content.Shared.Medical.CPR +{ + [RegisterComponent, NetworkedComponent] + public sealed partial class CPRTrainingComponent : Component + { + [DataField] + public SoundSpecifier CPRSound = new SoundPathSpecifier("/Audio/Effects/CPR.ogg"); + + /// + /// How long the doafter for CPR takes + /// + [DataField] + public TimeSpan DoAfterDuration = TimeSpan.FromSeconds(3); + + [DataField] + public int AirlossHeal = 6; + + [DataField] + public float CrackRibsModifier = 1f; + public EntityUid? CPRPlayingStream; + } + + [Serializable, NetSerializable] + public sealed partial class CPRDoAfterEvent : SimpleDoAfterEvent + { + + } +} diff --git a/Content.Shared/Medical/CPR/Systems/CPRSystem.CVars.cs b/Content.Shared/Medical/CPR/Systems/CPRSystem.CVars.cs new file mode 100644 index 00000000000..9840b8ffbd4 --- /dev/null +++ b/Content.Shared/Medical/CPR/Systems/CPRSystem.CVars.cs @@ -0,0 +1,27 @@ +using Content.Shared.CCVar; +using Robust.Shared.Configuration; + +namespace Content.Shared.Medical.CPR +{ + public sealed partial class CPRSystem + { + [Dependency] private readonly IConfigurationManager _cfg = default!; + + public bool EnableCPR { get; private set; } + public bool HealsAirloss { get; private set; } + public bool ReducesRot { get; private set; } + public float ResuscitationChance { get; private set; } + public float RotReductionMultiplier { get; private set; } + public float AirlossReductionMultiplier { get; private set; } + + private void InitializeCVars() + { + Subs.CVar(_cfg, CCVars.EnableCPR, value => EnableCPR = value, true); + Subs.CVar(_cfg, CCVars.CPRHealsAirloss, value => HealsAirloss = value, true); + Subs.CVar(_cfg, CCVars.CPRReducesRot, value => ReducesRot = value, true); + Subs.CVar(_cfg, CCVars.CPRResuscitationChance, value => ResuscitationChance = value, true); + Subs.CVar(_cfg, CCVars.CPRRotReductionMultiplier, value => RotReductionMultiplier = value, true); + Subs.CVar(_cfg, CCVars.CPRAirlossReductionMultiplier, value => AirlossReductionMultiplier = value, true); + } + } +} diff --git a/Content.Shared/Medical/CPR/Systems/CPRSystem.cs b/Content.Shared/Medical/CPR/Systems/CPRSystem.cs new file mode 100644 index 00000000000..799c0664a66 --- /dev/null +++ b/Content.Shared/Medical/CPR/Systems/CPRSystem.cs @@ -0,0 +1,132 @@ +using Content.Shared.Popups; +using Content.Shared.Atmos.Rotting; +using Content.Shared.Damage; +using Content.Shared.DoAfter; +using Content.Shared.Inventory; +using Content.Shared.Mobs; +using Content.Shared.Mobs.Components; +using Content.Shared.Mobs.Systems; +using Content.Shared.Verbs; +using Robust.Shared.Network; +using Robust.Shared.Utility; +using Robust.Shared.Random; +using Robust.Shared.Audio.Systems; + +namespace Content.Shared.Medical.CPR +{ + public sealed partial class CPRSystem : EntitySystem + { + [Dependency] private readonly SharedPopupSystem _popupSystem = default!; + [Dependency] private readonly SharedDoAfterSystem _doAfterSystem = default!; + [Dependency] private readonly MobStateSystem _mobStateSystem = default!; + [Dependency] private readonly DamageableSystem _damageable = default!; + [Dependency] private readonly MobThresholdSystem _mobThreshold = default!; + [Dependency] private readonly IRobustRandom _robustRandom = default!; + [Dependency] private readonly SharedRottingSystem _rottingSystem = default!; + [Dependency] private readonly InventorySystem _inventory = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] private readonly INetManager _net = default!; + public override void Initialize() + { + base.Initialize(); + InitializeCVars(); + SubscribeLocalEvent>(AddCPRVerb); + SubscribeLocalEvent(OnCPRDoAfter); + } + + private void AddCPRVerb(EntityUid uid, CPRTrainingComponent component, GetVerbsEvent args) + { + if (!EnableCPR || !args.CanInteract || !args.CanAccess + || !TryComp(args.Target, out var targetState) + || targetState.CurrentState == MobState.Alive) + return; + + InnateVerb verb = new() + { + Act = () => + { + StartCPR(uid, args.Target, component); + }, + Text = Loc.GetString("cpr-verb"), + Icon = new SpriteSpecifier.Rsi(new("Interface/Alerts/human_alive.rsi"), "health4"), + Priority = 2 + }; + args.Verbs.Add(verb); + } + + private void StartCPR(EntityUid performer, EntityUid target, CPRTrainingComponent cprComponent) + { + if (HasComp(target)) + { + _popupSystem.PopupEntity(Loc.GetString("cpr-target-rotting", ("entity", target)), performer, performer); + return; + } + + if (_inventory.TryGetSlotEntity(target, "outerClothing", out var outer)) + { + _popupSystem.PopupEntity(Loc.GetString("cpr-must-remove", ("clothing", outer)), performer, performer, PopupType.MediumCaution); + return; + } + + if (_inventory.TryGetSlotEntity(target, "mask", out var mask)) + { + _popupSystem.PopupEntity(Loc.GetString("cpr-must-remove", ("clothing", mask)), performer, performer, PopupType.MediumCaution); + return; + } + + if (_inventory.TryGetSlotEntity(performer, "mask", out var maskSelf)) + { + _popupSystem.PopupEntity(Loc.GetString("cpr-must-remove-own-mask", ("clothing", maskSelf)), performer, performer, PopupType.MediumCaution); + return; + } + + if (_net.IsServer) + { + _popupSystem.PopupEntity(Loc.GetString("cpr-start-second-person", ("target", target)), target, performer, PopupType.Medium); + _popupSystem.PopupEntity(Loc.GetString("cpr-start-second-person-patient", ("user", performer)), target, target, PopupType.Medium); + cprComponent.CPRPlayingStream = _audio.PlayPvs(cprComponent.CPRSound, performer).Value.Entity; + } + + _doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, performer, cprComponent.DoAfterDuration, new CPRDoAfterEvent(), performer, target, performer) + { + BreakOnTargetMove = true, + BreakOnUserMove = true, + NeedHand = true, + BlockDuplicate = true + }); + } + + private void OnCPRDoAfter(EntityUid performer, CPRTrainingComponent component, CPRDoAfterEvent args) + { + component.CPRPlayingStream = _audio.Stop(component.CPRPlayingStream); + + if (args.Target == null) + return; + + if (HealsAirloss) + { + // There is PROBABLY a better way to do this, by all means let me know + var healing = new DamageSpecifier() + { + DamageDict = new() + { + { "Asphyxiation", -component.AirlossHeal * AirlossReductionMultiplier} + } + }; + _damageable.TryChangeDamage(args.Target, healing, true, origin: performer); + } + + if (ReducesRot) + _rottingSystem.ReduceAccumulator((EntityUid) args.Target, component.DoAfterDuration * RotReductionMultiplier); + + if (_robustRandom.Prob(ResuscitationChance) + && _mobThreshold.TryGetThresholdForState((EntityUid) args.Target, MobState.Dead, out var threshold) + && TryComp(args.Target, out var damageableComponent) + && TryComp(args.Target, out var state) + && damageableComponent.TotalDamage < threshold) + { + _mobStateSystem.ChangeMobState(args.Target.Value, MobState.Critical, state, performer); + } + } + } +} diff --git a/Content.Shared/Medical/PenLightComponent.cs b/Content.Shared/Medical/PenLightComponent.cs new file mode 100644 index 00000000000..50dacae3dc8 --- /dev/null +++ b/Content.Shared/Medical/PenLightComponent.cs @@ -0,0 +1,33 @@ +using Content.Shared.DoAfter; +using Robust.Shared.GameStates; +using Robust.Shared.Serialization; +namespace Content.Shared.Medical; + +/// +/// This for penlights; a tool used to check for eye damage. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentPause] +public sealed partial class PenLightComponent : Component +{ + /// + /// Cooldown Time, exams take a bit + /// + [AutoPausedField] + public TimeSpan? NextExamTime; + + /// + /// The min time between exams + /// + [DataField] + public TimeSpan ExamDelay = TimeSpan.FromSeconds(3); + + /// + /// How long the doafter for the exam takes + /// + [DataField(required: true)] + public float ExamSpeed { get; set; } + +} + +[Serializable, NetSerializable] +public sealed partial class PenLightDoAfterEvent : SimpleDoAfterEvent { } \ No newline at end of file diff --git a/Content.Shared/Medical/PenLightUiKey.cs b/Content.Shared/Medical/PenLightUiKey.cs new file mode 100644 index 00000000000..52fc6ce3401 --- /dev/null +++ b/Content.Shared/Medical/PenLightUiKey.cs @@ -0,0 +1,9 @@ +using Robust.Shared.Serialization; + +namespace Content.Shared.Medical; + +[Serializable, NetSerializable] +public enum PenLightUiKey : byte +{ + Key +} diff --git a/Content.Shared/Medical/PenLightUserMessage.cs b/Content.Shared/Medical/PenLightUserMessage.cs new file mode 100644 index 00000000000..42502b2171b --- /dev/null +++ b/Content.Shared/Medical/PenLightUserMessage.cs @@ -0,0 +1,24 @@ +using Robust.Shared.Serialization; + +namespace Content.Shared.Medical; +[Serializable, NetSerializable] +public sealed class PenLightUserMessage : BoundUserInterfaceMessage +{ + public readonly NetEntity? TargetEntity; + public bool? Blind; + public bool? Drunk; + public bool? EyeDamage; + public bool? Healthy; + public bool? SeeingRainbows; + + public PenLightUserMessage(NetEntity? targetEntity, bool? blind, bool? drunk, bool? eyeDamage, bool? healthy, bool? seeingRainbows) + { + TargetEntity = targetEntity; + Blind = blind; + Drunk = drunk; + EyeDamage = eyeDamage; + Healthy = healthy; + SeeingRainbows = seeingRainbows; + } +} + diff --git a/Content.Shared/Movement/Components/CanWalkComponent.cs b/Content.Shared/Movement/Components/CanWalkComponent.cs deleted file mode 100644 index fab851595c7..00000000000 --- a/Content.Shared/Movement/Components/CanWalkComponent.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Robust.Shared.GameStates; - -namespace Content.Shared.Movement.Components; - -/// -/// Indicates if the entity can toggle walking or not. -/// -[NetworkedComponent, RegisterComponent] -public sealed partial class CanWalkComponent : Component -{ -} diff --git a/Content.Shared/Movement/Components/InputMoverComponent.cs b/Content.Shared/Movement/Components/InputMoverComponent.cs index 263190d46fd..916ecc90af1 100644 --- a/Content.Shared/Movement/Components/InputMoverComponent.cs +++ b/Content.Shared/Movement/Components/InputMoverComponent.cs @@ -1,6 +1,8 @@ using System.Numerics; using Content.Shared.Alert; +using Content.Shared.CCVar; using Content.Shared.Movement.Systems; +using Robust.Shared.Configuration; using Robust.Shared.GameStates; using Robust.Shared.Serialization; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; @@ -72,7 +74,10 @@ public sealed partial class InputMoverComponent : Component public const float LerpTime = 1.0f; - public bool Sprinting => (HeldMoveButtons & MoveButtons.Walk) == 0x0; + //NOTE I don't think I'm supposed to do this + public bool Sprinting => IoCManager.Resolve().GetCVar(CCVars.GamePressToSprint) + ? (HeldMoveButtons & MoveButtons.Walk) != 0x0 + : (HeldMoveButtons & MoveButtons.Walk) == 0x0; [ViewVariables(VVAccess.ReadWrite)] public bool CanMove = true; diff --git a/Content.Shared/Movement/Components/MovementSpeedModifierComponent.cs b/Content.Shared/Movement/Components/MovementSpeedModifierComponent.cs index 813a18f974c..0f404f45b97 100644 --- a/Content.Shared/Movement/Components/MovementSpeedModifierComponent.cs +++ b/Content.Shared/Movement/Components/MovementSpeedModifierComponent.cs @@ -22,8 +22,8 @@ public sealed partial class MovementSpeedModifierComponent : Component public const float DefaultFriction = 20f; public const float DefaultFrictionNoInput = 20f; - public const float DefaultBaseWalkSpeed = 2.5f; - public const float DefaultBaseSprintSpeed = 4.5f; + public const float DefaultBaseWalkSpeed = 3f; + public const float DefaultBaseSprintSpeed = 5f; [AutoNetworkedField, ViewVariables] public float WalkSpeedModifier = 1.0f; diff --git a/Content.Shared/Movement/Systems/MovementSpeedModifierSystem.cs b/Content.Shared/Movement/Systems/MovementSpeedModifierSystem.cs index 7c793d5eb89..67a238cf60f 100644 --- a/Content.Shared/Movement/Systems/MovementSpeedModifierSystem.cs +++ b/Content.Shared/Movement/Systems/MovementSpeedModifierSystem.cs @@ -1,5 +1,6 @@ using Content.Shared.Inventory; using Content.Shared.Movement.Components; +using Content.Shared.Traits.Assorted.Components; using Robust.Shared.Timing; namespace Content.Shared.Movement.Systems @@ -16,7 +17,11 @@ public void RefreshMovementSpeedModifiers(EntityUid uid, MovementSpeedModifierCo if (_timing.ApplyingState) return; - var ev = new RefreshMovementSpeedModifiersEvent(); + var isImmune = false; + if (HasComp(uid)) + isImmune = true; + + var ev = new RefreshMovementSpeedModifiersEvent(isImmune); RaiseLocalEvent(uid, ev); if (MathHelper.CloseTo(ev.WalkSpeedModifier, move.WalkSpeedModifier) && @@ -64,10 +69,24 @@ public sealed class RefreshMovementSpeedModifiersEvent : EntityEventArgs, IInven public float WalkSpeedModifier { get; private set; } = 1.0f; public float SprintSpeedModifier { get; private set; } = 1.0f; - public void ModifySpeed(float walk, float sprint) + /// + /// Whether this entity is immune to most movement speed modifiers. + /// Bypassable by setting bypassImmunity to true. + /// (player)) - { - _alerts.ShowAlert(player, AlertType.Walking, walking ? (short) 0 : (short) 1); - } + walking = _configManager.GetCVar(CCVars.GamePressToSprint) ? !walking : walking; + _alerts.ShowAlert(player, AlertType.Walking, walking ? (short) 0 : (short) 1); } public void LerpRotation(EntityUid uid, InputMoverComponent mover, float frameTime) diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/AcceptPsionicsEuiMessage.cs b/Content.Shared/Psionics/Abilities/AcceptPsionicsEuiMessage.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/AcceptPsionicsEuiMessage.cs rename to Content.Shared/Psionics/Abilities/AcceptPsionicsEuiMessage.cs diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Dispel/DamageOnDispelComponent.cs b/Content.Shared/Psionics/Abilities/Dispel/DamageOnDispelComponent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Dispel/DamageOnDispelComponent.cs rename to Content.Shared/Psionics/Abilities/Dispel/DamageOnDispelComponent.cs diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Dispel/DispelPowerComponent.cs b/Content.Shared/Psionics/Abilities/Dispel/DispelPowerComponent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Dispel/DispelPowerComponent.cs rename to Content.Shared/Psionics/Abilities/Dispel/DispelPowerComponent.cs diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Dispel/DispellableComponent.cs b/Content.Shared/Psionics/Abilities/Dispel/DispellableComponent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Dispel/DispellableComponent.cs rename to Content.Shared/Psionics/Abilities/Dispel/DispellableComponent.cs diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/MassSleep/MassSleepPowerComponent.cs b/Content.Shared/Psionics/Abilities/MassSleep/MassSleepPowerComponent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/MassSleep/MassSleepPowerComponent.cs rename to Content.Shared/Psionics/Abilities/MassSleep/MassSleepPowerComponent.cs diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/MassSleep/MassSleepPowerSystem.cs b/Content.Shared/Psionics/Abilities/MassSleep/MassSleepPowerSystem.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/MassSleep/MassSleepPowerSystem.cs rename to Content.Shared/Psionics/Abilities/MassSleep/MassSleepPowerSystem.cs diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Metapsionics/MetapsionicPowerComponent.cs b/Content.Shared/Psionics/Abilities/Metapsionics/MetapsionicPowerComponent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Metapsionics/MetapsionicPowerComponent.cs rename to Content.Shared/Psionics/Abilities/Metapsionics/MetapsionicPowerComponent.cs diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/MindSwap/MindSwapPowerComponent.cs b/Content.Shared/Psionics/Abilities/MindSwap/MindSwapPowerComponent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/MindSwap/MindSwapPowerComponent.cs rename to Content.Shared/Psionics/Abilities/MindSwap/MindSwapPowerComponent.cs diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/NoosphericZap/NoosphericZapPowerComponent.cs b/Content.Shared/Psionics/Abilities/NoosphericZap/NoosphericZapPowerComponent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/NoosphericZap/NoosphericZapPowerComponent.cs rename to Content.Shared/Psionics/Abilities/NoosphericZap/NoosphericZapPowerComponent.cs diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/PsionicInvisibility/PsionicInvisibilityPowerComponent.cs b/Content.Shared/Psionics/Abilities/PsionicInvisibility/PsionicInvisibilityPowerComponent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/PsionicInvisibility/PsionicInvisibilityPowerComponent.cs rename to Content.Shared/Psionics/Abilities/PsionicInvisibility/PsionicInvisibilityPowerComponent.cs diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/PsionicInvisibility/PsionicInvisibilityUsedComponent.cs b/Content.Shared/Psionics/Abilities/PsionicInvisibility/PsionicInvisibilityUsedComponent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/PsionicInvisibility/PsionicInvisibilityUsedComponent.cs rename to Content.Shared/Psionics/Abilities/PsionicInvisibility/PsionicInvisibilityUsedComponent.cs diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/PsionicRegeneration/PsionicRegenerationPowerComponent.cs b/Content.Shared/Psionics/Abilities/PsionicRegeneration/PsionicRegenerationPowerComponent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/PsionicRegeneration/PsionicRegenerationPowerComponent.cs rename to Content.Shared/Psionics/Abilities/PsionicRegeneration/PsionicRegenerationPowerComponent.cs diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Pyrokinesis/PyrokinesisPowerComponent.cs b/Content.Shared/Psionics/Abilities/Pyrokinesis/PyrokinesisPowerComponent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Pyrokinesis/PyrokinesisPowerComponent.cs rename to Content.Shared/Psionics/Abilities/Pyrokinesis/PyrokinesisPowerComponent.cs diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Telegnosis/TelegnosisPowerComponent.cs b/Content.Shared/Psionics/Abilities/Telegnosis/TelegnosisPowerComponent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Telegnosis/TelegnosisPowerComponent.cs rename to Content.Shared/Psionics/Abilities/Telegnosis/TelegnosisPowerComponent.cs diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Telegnosis/TelegnosticProjectionComponent.cs b/Content.Shared/Psionics/Abilities/Telegnosis/TelegnosticProjectionComponent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Telegnosis/TelegnosticProjectionComponent.cs rename to Content.Shared/Psionics/Abilities/Telegnosis/TelegnosticProjectionComponent.cs diff --git a/Content.Shared/Nyanotrasen/Psionics/Events.cs b/Content.Shared/Psionics/Events.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Psionics/Events.cs rename to Content.Shared/Psionics/Events.cs diff --git a/Content.Shared/Nyanotrasen/Psionics/Glimmer/GlimmerSystem.cs b/Content.Shared/Psionics/Glimmer/GlimmerSystem.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Psionics/Glimmer/GlimmerSystem.cs rename to Content.Shared/Psionics/Glimmer/GlimmerSystem.cs diff --git a/Content.Shared/Nyanotrasen/Psionics/Glimmer/SharedGlimmerReactiveComponent.cs b/Content.Shared/Psionics/Glimmer/SharedGlimmerReactiveComponent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Psionics/Glimmer/SharedGlimmerReactiveComponent.cs rename to Content.Shared/Psionics/Glimmer/SharedGlimmerReactiveComponent.cs diff --git a/Content.Shared/Nyanotrasen/Psionics/Glimmer/SharedGlimmerReactiveVisuals.cs b/Content.Shared/Psionics/Glimmer/SharedGlimmerReactiveVisuals.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Psionics/Glimmer/SharedGlimmerReactiveVisuals.cs rename to Content.Shared/Psionics/Glimmer/SharedGlimmerReactiveVisuals.cs diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Items/ClothingGrantPsionicPowerComponent.cs b/Content.Shared/Psionics/Items/ClothingGrantPsionicPowerComponent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/Items/ClothingGrantPsionicPowerComponent.cs rename to Content.Shared/Psionics/Items/ClothingGrantPsionicPowerComponent.cs diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Items/HeadCageComponent.cs b/Content.Shared/Psionics/Items/HeadCageComponent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/Items/HeadCageComponent.cs rename to Content.Shared/Psionics/Items/HeadCageComponent.cs diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Items/HeadCagedComponent.cs b/Content.Shared/Psionics/Items/HeadCagedComponent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/Items/HeadCagedComponent.cs rename to Content.Shared/Psionics/Items/HeadCagedComponent.cs diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Items/PsionicItemsSystem.cs b/Content.Shared/Psionics/Items/PsionicItemsSystem.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/Items/PsionicItemsSystem.cs rename to Content.Shared/Psionics/Items/PsionicItemsSystem.cs diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Items/TinfoilHatComponent.cs b/Content.Shared/Psionics/Items/TinfoilHatComponent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/Items/TinfoilHatComponent.cs rename to Content.Shared/Psionics/Items/TinfoilHatComponent.cs diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/PsionicComponent.cs b/Content.Shared/Psionics/PsionicComponent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/PsionicComponent.cs rename to Content.Shared/Psionics/PsionicComponent.cs diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/PsionicInsulationComponent.cs b/Content.Shared/Psionics/PsionicInsulationComponent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/PsionicInsulationComponent.cs rename to Content.Shared/Psionics/PsionicInsulationComponent.cs diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/PsionicsDisabledComponent.cs b/Content.Shared/Psionics/PsionicsDisabledComponent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/PsionicsDisabledComponent.cs rename to Content.Shared/Psionics/PsionicsDisabledComponent.cs diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/SharedPsionicAbilitiesSystem.cs b/Content.Shared/Psionics/SharedPsionicAbilitiesSystem.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/SharedPsionicAbilitiesSystem.cs rename to Content.Shared/Psionics/SharedPsionicAbilitiesSystem.cs diff --git a/Content.Shared/Radiation/Components/GeigerComponent.cs b/Content.Shared/Radiation/Components/GeigerComponent.cs index 71edb70b37c..710d74d9b38 100644 --- a/Content.Shared/Radiation/Components/GeigerComponent.cs +++ b/Content.Shared/Radiation/Components/GeigerComponent.cs @@ -29,14 +29,12 @@ public sealed partial class GeigerComponent : Component /// /// Should it shows examine message with current radiation level? /// - [ViewVariables(VVAccess.ReadWrite)] [DataField] public bool ShowExamine; /// /// Should it shows item control when equipped by player? /// - [ViewVariables(VVAccess.ReadWrite)] [DataField] public bool ShowControl; @@ -55,7 +53,7 @@ public sealed partial class GeigerComponent : Component /// /// Current radiation level in rad per second. /// - [ViewVariables(VVAccess.ReadOnly), AutoNetworkedField] + [DataField, AutoNetworkedField] public float CurrentRadiation; /// @@ -66,8 +64,6 @@ public sealed partial class GeigerComponent : Component /// /// Current player that equipped geiger counter. - /// Because sound is annoying, geiger counter clicks will play - /// only for player that equipped it. /// [ViewVariables(VVAccess.ReadOnly), AutoNetworkedField] public EntityUid? User; @@ -83,6 +79,19 @@ public sealed partial class GeigerComponent : Component /// Played only for current user. /// public EntityUid? Stream; + + /// + /// Controls whether the geiger counter plays only for the local player, or plays for everyone nearby. + /// Useful for things like hardsuits with integrated geigers. Alternatively, to create stationary radiation alarm objects. + /// + [DataField] + public bool LocalSoundOnly = false; + + /// + /// Used for all geiger counter audio controls, allowing entities to override default audio parameters. + /// + [DataField] + public AudioParams AudioParameters; } [Serializable, NetSerializable] diff --git a/Content.Shared/Roles/AntagPrototype.cs b/Content.Shared/Roles/AntagPrototype.cs index c6acb9b7575..824ea4be4e5 100644 --- a/Content.Shared/Roles/AntagPrototype.cs +++ b/Content.Shared/Roles/AntagPrototype.cs @@ -1,3 +1,4 @@ +using Content.Shared.Customization.Systems; using Robust.Shared.Prototypes; using Robust.Shared.Serialization; @@ -42,5 +43,5 @@ public sealed partial class AntagPrototype : IPrototype /// Requirements that must be met to opt in to this antag role. ///
[DataField("requirements")] - public HashSet? Requirements; + public List? Requirements; } diff --git a/Content.Shared/Roles/JobPrototype.cs b/Content.Shared/Roles/JobPrototype.cs index 9f158a79e08..15f8233aab8 100644 --- a/Content.Shared/Roles/JobPrototype.cs +++ b/Content.Shared/Roles/JobPrototype.cs @@ -1,4 +1,5 @@ using Content.Shared.Access; +using Content.Shared.Customization.Systems; using Content.Shared.Players.PlayTimeTracking; using Content.Shared.Roles; using Content.Shared.StatusIcon; @@ -43,7 +44,7 @@ public sealed partial class JobPrototype : IPrototype public string? LocalizedDescription => Description is null ? null : Loc.GetString(Description); [DataField("requirements")] - public HashSet? Requirements; + public List? Requirements; [DataField("joinNotifyCrew")] public bool JoinNotifyCrew { get; private set; } = false; diff --git a/Content.Shared/Roles/JobRequirements.cs b/Content.Shared/Roles/JobRequirements.cs deleted file mode 100644 index 44607fc44d9..00000000000 --- a/Content.Shared/Roles/JobRequirements.cs +++ /dev/null @@ -1,232 +0,0 @@ -using System.Diagnostics.CodeAnalysis; -using Content.Shared.Players.PlayTimeTracking; -using Content.Shared.Roles.Jobs; -using JetBrains.Annotations; -using Robust.Shared.Prototypes; -using Robust.Shared.Serialization; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; -using Robust.Shared.Utility; - -namespace Content.Shared.Roles -{ - /// - /// Abstract class for playtime and other requirements for role gates. - /// - [ImplicitDataDefinitionForInheritors] - [Serializable, NetSerializable] - public abstract partial class JobRequirement{} - - [UsedImplicitly] - [Serializable, NetSerializable] - public sealed partial class DepartmentTimeRequirement : JobRequirement - { - /// - /// Which department needs the required amount of time. - /// - [DataField("department", customTypeSerializer: typeof(PrototypeIdSerializer))] - public string Department = default!; - - /// - /// How long (in seconds) this requirement is. - /// - [DataField("time")] public TimeSpan Time; - - /// - /// If true, requirement will return false if playtime above the specified time. - /// - /// - /// False by default.
- /// True for invert general requirement - ///
- [DataField("inverted")] public bool Inverted; - } - - [UsedImplicitly] - [Serializable, NetSerializable] - public sealed partial class RoleTimeRequirement : JobRequirement - { - /// - /// What particular role they need the time requirement with. - /// - [DataField("role", customTypeSerializer: typeof(PrototypeIdSerializer))] - public string Role = default!; - - /// - [DataField("time")] public TimeSpan Time; - - /// - [DataField("inverted")] public bool Inverted; - } - - [UsedImplicitly] - [Serializable, NetSerializable] - public sealed partial class OverallPlaytimeRequirement : JobRequirement - { - /// - [DataField("time")] public TimeSpan Time; - - /// - [DataField("inverted")] public bool Inverted; - } - - public static class JobRequirements - { - public static bool TryRequirementsMet( - JobPrototype job, - IReadOnlyDictionary playTimes, - [NotNullWhen(false)] out FormattedMessage? reason, - IEntityManager entManager, - IPrototypeManager prototypes, - bool isWhitelisted) - { - reason = null; - if (job.Requirements == null) - return true; - - foreach (var requirement in job.Requirements) - { - if (!TryRequirementMet(requirement, playTimes, out reason, entManager, prototypes, isWhitelisted)) - return false; - } - - return true; - } - - /// - /// Returns a string with the reason why a particular requirement may not be met. - /// - public static bool TryRequirementMet( - JobRequirement requirement, - IReadOnlyDictionary playTimes, - [NotNullWhen(false)] out FormattedMessage? reason, - IEntityManager entManager, - IPrototypeManager prototypes, - bool isWhitelisted, - string? localePrefix = "role-timer-") - { - reason = null; - - switch (requirement) - { - case DepartmentTimeRequirement deptRequirement: - var playtime = TimeSpan.Zero; - - // Check all jobs' departments - var department = prototypes.Index(deptRequirement.Department); - var jobs = department.Roles; - string proto; - - // Check all jobs' playtime - foreach (var other in jobs) - { - // The schema is stored on the Job role but we want to explode if the timer isn't found anyway. - proto = prototypes.Index(other).PlayTimeTracker; - - playTimes.TryGetValue(proto, out var otherTime); - playtime += otherTime; - } - - var deptDiff = deptRequirement.Time.TotalMinutes - playtime.TotalMinutes; - - if (!deptRequirement.Inverted) - { - if (deptDiff <= 0) - return true; - - reason = FormattedMessage.FromMarkup(Loc.GetString( - $"{localePrefix}department-insufficient", - ("time", Math.Ceiling(deptDiff)), - ("department", Loc.GetString(deptRequirement.Department)), - ("departmentColor", department.Color.ToHex()))); - return false; - } - - if (deptDiff <= 0) - { - reason = FormattedMessage.FromMarkup(Loc.GetString( - $"{localePrefix}department-too-high", - ("time", -deptDiff), - ("department", Loc.GetString(deptRequirement.Department)), - ("departmentColor", department.Color.ToHex()))); - return false; - } - - return true; - - case OverallPlaytimeRequirement overallRequirement: - var overallTime = playTimes.GetValueOrDefault(PlayTimeTrackingShared.TrackerOverall); - var overallDiff = overallRequirement.Time.TotalMinutes - overallTime.TotalMinutes; - - if (!overallRequirement.Inverted) - { - if (overallDiff <= 0 || overallTime >= overallRequirement.Time) - return true; - - reason = FormattedMessage.FromMarkup(Loc.GetString( - $"{localePrefix}overall-insufficient", - ("time", Math.Ceiling(overallDiff)))); - return false; - } - - if (overallDiff <= 0 || overallTime >= overallRequirement.Time) - { - reason = FormattedMessage.FromMarkup(Loc.GetString($"{localePrefix}overall-too-high", ("time", -overallDiff))); - return false; - } - - return true; - - case RoleTimeRequirement roleRequirement: - proto = roleRequirement.Role; - - playTimes.TryGetValue(proto, out var roleTime); - var roleDiff = roleRequirement.Time.TotalMinutes - roleTime.TotalMinutes; - var departmentColor = Color.Yellow; - - if (entManager.EntitySysManager.TryGetEntitySystem(out SharedJobSystem? jobSystem)) - { - var jobProto = jobSystem.GetJobPrototype(proto); - - if (jobSystem.TryGetDepartment(jobProto, out var departmentProto)) - departmentColor = departmentProto.Color; - } - - if (!roleRequirement.Inverted) - { - if (roleDiff <= 0) - return true; - - reason = FormattedMessage.FromMarkup(Loc.GetString( - $"{localePrefix}role-insufficient", - ("time", Math.Ceiling(roleDiff)), - ("job", Loc.GetString(proto)), - ("departmentColor", departmentColor.ToHex()))); - return false; - } - - if (roleDiff <= 0) - { - reason = FormattedMessage.FromMarkup(Loc.GetString( - $"{localePrefix}role-too-high", - ("time", -roleDiff), - ("job", Loc.GetString(proto)), - ("departmentColor", departmentColor.ToHex()))); - return false; - } - - return true; - case WhitelistRequirement _: // DeltaV - Whitelist requirement - if (isWhitelisted == null) - throw new ArgumentNullException(nameof(isWhitelisted), "isWhitelisted cannot be null."); - - if (isWhitelisted) - return true; - - reason = FormattedMessage.FromMarkup(Loc.GetString("playtime-deny-reason-not-whitelisted")); - return false; - default: - throw new NotImplementedException(); - } - } - } -} diff --git a/Content.Shared/Nyanotrasen/Soul/GolemMessages.cs b/Content.Shared/Soul/GolemMessages.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Soul/GolemMessages.cs rename to Content.Shared/Soul/GolemMessages.cs diff --git a/Content.Shared/Nyanotrasen/Soul/GunHeldByGolemComponent.cs b/Content.Shared/Soul/GunHeldByGolemComponent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Soul/GunHeldByGolemComponent.cs rename to Content.Shared/Soul/GunHeldByGolemComponent.cs diff --git a/Content.Shared/Nyanotrasen/Soul/SharedGolemComponent.cs b/Content.Shared/Soul/SharedGolemComponent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Soul/SharedGolemComponent.cs rename to Content.Shared/Soul/SharedGolemComponent.cs diff --git a/Content.Shared/Nyanotrasen/Soul/SharedGolemSystem.cs b/Content.Shared/Soul/SharedGolemSystem.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Soul/SharedGolemSystem.cs rename to Content.Shared/Soul/SharedGolemSystem.cs diff --git a/Content.Shared/Stunnable/StaminaDamageResistanceComponent.cs b/Content.Shared/Stunnable/StaminaDamageResistanceComponent.cs new file mode 100644 index 00000000000..dc291bbe8ba --- /dev/null +++ b/Content.Shared/Stunnable/StaminaDamageResistanceComponent.cs @@ -0,0 +1,12 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Stunnable; + +[RegisterComponent, NetworkedComponent] +public sealed partial class StaminaDamageResistanceComponent : Component +{ + /// + /// 1 - no reduction, 0 - full reduction + /// + [DataField] public float Coefficient = 1; +} diff --git a/Content.Shared/Stunnable/StaminaDamageResistanceSystem.cs b/Content.Shared/Stunnable/StaminaDamageResistanceSystem.cs new file mode 100644 index 00000000000..7632eed504d --- /dev/null +++ b/Content.Shared/Stunnable/StaminaDamageResistanceSystem.cs @@ -0,0 +1,26 @@ +using Content.Shared.Damage.Events; +using Content.Shared.Examine; +using Content.Shared.Inventory; + +namespace Content.Shared.Stunnable; + +public sealed partial class StaminaDamageResistanceSystem : EntitySystem +{ + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent>(OnStaminaMeleeHit); + SubscribeLocalEvent(OnExamine); + } + + private void OnStaminaMeleeHit(Entity ent, ref InventoryRelayedEvent args) + { + args.Args.Multiplier *= ent.Comp.Coefficient; + } + private void OnExamine(Entity ent, ref ExaminedEvent args) + { + var percentage = (1 - ent.Comp.Coefficient) * 100; + args.PushMarkup(Loc.GetString("armor-examine-stamina", ("num", percentage))); + } +} diff --git a/Content.Shared/Supermatter/Components/SupermatterComponent.cs b/Content.Shared/Supermatter/Components/SupermatterComponent.cs new file mode 100644 index 00000000000..ad7604f5ba6 --- /dev/null +++ b/Content.Shared/Supermatter/Components/SupermatterComponent.cs @@ -0,0 +1,390 @@ +using Robust.Shared.GameStates; +using Robust.Shared.Audio; +using Content.Shared.Atmos; +using Content.Shared.Whitelist; +using Content.Shared.DoAfter; +using Robust.Shared.Serialization; + +namespace Content.Shared.Supermatter.Components; + +[RegisterComponent, NetworkedComponent] +public sealed partial class SupermatterComponent : Component +{ + #region Base + + /// + /// The SM will only cycle if activated. + /// + [DataField] + public bool Activated = false; + + [DataField] + public string SliverPrototype = "SupermatterSliver"; + + /// + /// Affects delamination timer. + /// If removed - delamination timer is divided by 2. + /// + [DataField] + public bool SliverRemoved = false; + + public string[] LightningPrototypes = + { + "Lightning", + "ChargedLightning", + "SuperchargedLightning", + "HyperchargedLightning" + }; + + [DataField] + public string SingularitySpawnPrototype = "Singularity"; + + [DataField] + public string TeslaSpawnPrototype = "TeslaEnergyBall"; + + [DataField] + public string KudzuSpawnPrototype = "SupermatterKudzu"; + + /// + /// What spawns in the place of an unfortunate entity that got removed by the SM. + /// + [DataField] + public string CollisionResultPrototype = "Ash"; + + [DataField] + public SoundSpecifier DustSound = new SoundPathSpecifier("/Audio/Effects/Grenades/Supermatter/supermatter_start.ogg"); + + [DataField] + public SoundSpecifier CalmSound = new SoundPathSpecifier("/Audio/Supermatter/calm.ogg"); + + [DataField] + public SoundSpecifier DelamSound = new SoundPathSpecifier("/Audio/Supermatter/delamming.ogg"); + + [DataField] + public SoundSpecifier CurrentSoundLoop = new SoundPathSpecifier("/Audio/Supermatter/calm.ogg"); + + #endregion + + #region Processing + + [DataField] + public float Power; + + [DataField] + public float MatterPower; + + [DataField] + public float MatterPowerConversion = 10f; + + /// + /// The portion of the gasmix we're on + /// + [DataField] + public float GasEfficiency = 0.15f; + + /// + /// Based on CO2 percentage, this slowly moves between 0 and 1. + /// We use it to calculate the powerloss_inhibitor. + /// + [DataField] + public float PowerlossDynamicScaling; + + /// + /// Affects the amount of damage and minimum point at which the SM takes heat damage + /// + [DataField] + public float DynamicHeatResistance = 1; + + /// + /// Multiplier on damage the core takes from absorbing hot gas. + /// Default is ~1/350. + /// + [DataField] + public float MoleHeatPenalty = 0.00286f; + + /// + /// Inverse of + /// + [DataField] + public float MoleHeatThreshold = 350f; + + /// + /// Multiplier on power generated by nuclear reactions + /// + [DataField] + public float ReactionPowerModifier = 0.55f; + + /// + /// Acts as a multiplier on the amount that nuclear reactions increase the supermatter core temperature + /// + [DataField] + public float ThermalReleaseModifier = 0.2f; + + /// + /// Multiplier on how much plasma is released during supermatter reactions + /// Default is ~1/750 + /// + [DataField] + public float PlasmaReleaseModifier = 0.001333f; + + /// + /// Multiplier on how much oxygen is released during supermatter reactions. + /// Default is ~1/325 + /// + [DataField] + public float OxygenReleaseEfficiencyModifier = 0.0031f; + + #endregion + + #region Timing + + /// + /// We yell if over 50 damage every YellTimer Seconds + /// + [DataField] + public float YellTimer = 60f; + + /// + /// Set to YellTimer at first so it doesnt yell a minute after being hit + /// + [DataField] + public float YellAccumulator = 60f; + + /// + /// Timer for delam + /// + [DataField] + public float DelamTimerAccumulator; + + /// + /// Time until delam + /// + [DataField] + public float DelamTimer = 120f; + + /// + /// The message timer + /// + [DataField] + public float SpeakAccumulator = 60f; + + [DataField] + public float UpdateAccumulator = 0f; + + [DataField] + public float UpdateTimer = 1f; + + [DataField] + public float ZapAccumulator = 0f; + + [DataField] + public float ZapTimer = 10f; + + #endregion + + #region Thresholds + + /// + /// The heat threshold in Kelvin, after which the supermatter begins taking damage. + /// + [DataField] + public float HeatThreshold = 2500f; + + /// + /// Percentage of inhibitor gas needed before the charge inertia chain reaction effect starts. + /// + [DataField] + public float PowerlossInhibitionGasThreshold = 0.20f; + + /// + /// Moles of the gas needed before the charge inertia chain reaction effect starts. + /// Scales powerloss inhibition down until this amount of moles is reached. + /// + [DataField] + public float PowerlossInhibitionMoleThreshold = 20f; + + /// + /// Bonus powerloss inhibition boost if this amount of moles is reached + /// + [DataField] + public float PowerlossInhibitionMoleBoostThreshold = 500f; + + /// + /// Above this value we can get lord singulo and independent mol damage, below it we can heal damage + /// + [DataField] + public float MolePenaltyThreshold = 900f; + + /// + /// More moles of gases are harder to heat than fewer, so let's scale heat damage around them + /// + [DataField] + public float MoleHeatPenaltyThreshold; + + /// + /// The cutoff on power properly doing damage, pulling shit around, + /// and delamming into a tesla. Low chance of pyro anomalies, +2 bolts of electricity + /// + [DataField] + public float PowerPenaltyThreshold = 4000f; + + /// + /// Maximum safe operational temperature in degrees Celsius. + /// Supermatter begins taking damage above this temperature. + /// + [DataField] + public float HeatPenaltyThreshold = 40f; + + #endregion + + #region Damage + + /// + /// The amount of damage taken + /// + [DataField] + public float Damage = 0f; + + /// + /// The damage from before this cycle. + /// Used to limit the damage we can take each cycle, and for safe alert. + /// + [DataField] + public float DamageArchived = 0f; + + /// + /// Is multiplied by ExplosionPoint to cap evironmental damage per cycle + /// + [DataField] + public float DamageHardcap = 0.002f; + + /// + /// Environmental damage is scaled by this + /// + [DataField] + public float DamageIncreaseMultiplier = 0.25f; + + /// + /// Max space damage the SM will take per cycle + /// + [DataField] + public float MaxSpaceExposureDamage = 2; + + /// + /// The point at which we should start sending radio messages about the damage. + /// + [DataField] + public float DamageWarningThreshold = 50; + + /// + /// The point at which we start sending station announcements about the damage. + /// + [DataField] + public float DamageEmergencyThreshold = 500; + + /// + /// The point at which the SM begins delaminating. + /// + [DataField] + public int DamageDelaminationPoint = 900; + + [DataField] + public bool Delamming = false; + + [DataField] + public DelamType PreferredDelamType = DelamType.Explosion; + + #endregion + + #region Announcements + + [DataField] + public string AlertCodeYellowId = "yellow"; + + [DataField] + public string AlertCodeDeltaId = "delta"; + + [DataField] + public bool DelamAnnounced = false; + + #endregion + + #region Gases + + /// + /// How much gas is in the SM + /// + [DataField] + public Dictionary GasStorage = new Dictionary() + { + { Gas.Oxygen, 0f }, + { Gas.Nitrogen, 0f }, + { Gas.CarbonDioxide, 0f }, + { Gas.Plasma, 0f }, + { Gas.Tritium, 0f }, + { Gas.WaterVapor, 0f }, + { Gas.Frezon, 0f }, + { Gas.Ammonia, 0f }, + { Gas.NitrousOxide, 0f }, + }; + + /// + /// Stores information about how every gas interacts with the SM + /// + //TODO: Replace this with serializable GasFact array something + public readonly Dictionary GasDataFields = new() + { + { Gas.Oxygen, (1.5f, 1f, 1f) }, + { Gas.Nitrogen, (0f, -1.5f, -1f) }, + { Gas.CarbonDioxide, (0f, 0.1f, 1f) }, + { Gas.Plasma, (4f, 15f, 1f) }, + { Gas.Tritium, (30f, 10f, 1f) }, + { Gas.WaterVapor, (2f, 12f, 1f) }, + { Gas.Frezon, (3f, -10f, -1f) }, + { Gas.Ammonia, (0f, .5f, 1f) }, + { Gas.NitrousOxide, (0f, -5f, -1f) }, + }; + + #endregion +} + + +public enum SupermatterSound : sbyte +{ + Aggressive = 0, + Delam = 1 +} + +public enum DelamType : int +{ + Explosion = 0, + Singulo = 1, + Tesla = 2, + Cascade = 3 +} + +[Serializable, DataDefinition] +public sealed partial class GasFact +{ + [DataField] + public float TransmitModifier; + + [DataField] + public float HeatPenalty; + + [DataField] + public float PowerMixRatio; + + public GasFact(float transmitModifier, float heatPenalty, float powerMixRatio) + { + TransmitModifier = transmitModifier; + HeatPenalty = heatPenalty; + PowerMixRatio = powerMixRatio; + } +} + +[Serializable, NetSerializable] +public sealed partial class SupermatterDoAfterEvent : SimpleDoAfterEvent +{ + +} diff --git a/Content.Shared/Supermatter/Components/SupermatterFoodComponent.cs b/Content.Shared/Supermatter/Components/SupermatterFoodComponent.cs new file mode 100644 index 00000000000..9d235a4b4d3 --- /dev/null +++ b/Content.Shared/Supermatter/Components/SupermatterFoodComponent.cs @@ -0,0 +1,8 @@ +namespace Content.Shared.Supermatter.Components; + +[RegisterComponent] +public sealed partial class SupermatterFoodComponent : Component +{ + [DataField] + public int Energy { get; set; } = 1; +} diff --git a/Content.Shared/Supermatter/Components/SupermatterImmuneComponent.cs b/Content.Shared/Supermatter/Components/SupermatterImmuneComponent.cs new file mode 100644 index 00000000000..b517115eca7 --- /dev/null +++ b/Content.Shared/Supermatter/Components/SupermatterImmuneComponent.cs @@ -0,0 +1,9 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Supermatter.Components; + +[RegisterComponent, NetworkedComponent] +public sealed partial class SupermatterImmuneComponent : Component +{ + +} diff --git a/Content.Shared/Traits/Assorted/Components/ClimbDelayModifierComponent.cs b/Content.Shared/Traits/Assorted/Components/ClimbDelayModifierComponent.cs new file mode 100644 index 00000000000..c04657a4875 --- /dev/null +++ b/Content.Shared/Traits/Assorted/Components/ClimbDelayModifierComponent.cs @@ -0,0 +1,16 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Traits.Assorted.Components; + +/// +/// This is used for any trait that modifies climbing speed. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class ClimbDelayModifierComponent : Component +{ + /// + /// What to multiply the climbing delay by. + /// + [DataField, AutoNetworkedField] + public float ClimbDelayMultiplier = 1f; +} diff --git a/Content.Shared/Traits/Assorted/Components/FootstepVolumeModifierComponent.cs b/Content.Shared/Traits/Assorted/Components/FootstepVolumeModifierComponent.cs new file mode 100644 index 00000000000..8c7e763692c --- /dev/null +++ b/Content.Shared/Traits/Assorted/Components/FootstepVolumeModifierComponent.cs @@ -0,0 +1,22 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Traits.Assorted.Components; + +/// +/// This is used for any trait that modifies footstep volumes. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class FootstepVolumeModifierComponent : Component +{ + /// + /// What to add to the volume of sprinting, in terms of decibels. + /// + [DataField, AutoNetworkedField] + public float SprintVolumeModifier; + + /// + /// What to add to the volume of walking, in terms of decibels. + /// + [DataField, AutoNetworkedField] + public float WalkVolumeModifier; +} diff --git a/Content.Shared/Traits/Assorted/Components/SpeedModifierImmunityComponent.cs b/Content.Shared/Traits/Assorted/Components/SpeedModifierImmunityComponent.cs new file mode 100644 index 00000000000..e9bec98fd8b --- /dev/null +++ b/Content.Shared/Traits/Assorted/Components/SpeedModifierImmunityComponent.cs @@ -0,0 +1,12 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Traits.Assorted.Components; + +/// +/// This is used to make an entity's movement speed constant and +/// never affected by almost all movement speed modifiers. +/// +[RegisterComponent, NetworkedComponent] +public sealed partial class SpeedModifierImmunityComponent : Component +{ +} diff --git a/Content.Shared/Traits/Assorted/Components/TraitSpeedModifierComponent.cs b/Content.Shared/Traits/Assorted/Components/TraitSpeedModifierComponent.cs new file mode 100644 index 00000000000..85dc52a21f5 --- /dev/null +++ b/Content.Shared/Traits/Assorted/Components/TraitSpeedModifierComponent.cs @@ -0,0 +1,16 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Traits.Assorted.Components; + +/// +/// This component is used for traits that modify movement speed. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class TraitSpeedModifierComponent : Component +{ + [DataField, AutoNetworkedField] + public float WalkModifier = 1.0f; + + [DataField, AutoNetworkedField] + public float SprintModifier = 1.0f; +} diff --git a/Content.Shared/Traits/Assorted/Systems/TraitSpeedModifierSystem.cs b/Content.Shared/Traits/Assorted/Systems/TraitSpeedModifierSystem.cs new file mode 100644 index 00000000000..9817ebc1560 --- /dev/null +++ b/Content.Shared/Traits/Assorted/Systems/TraitSpeedModifierSystem.cs @@ -0,0 +1,31 @@ +using Content.Shared.Movement.Components; +using Content.Shared.Movement.Systems; +using Content.Shared.Traits.Assorted.Components; + +namespace Content.Shared.Traits.Assorted.Systems; + +public sealed class TraitSpeedModifierSystem : EntitySystem +{ + [Dependency] private readonly MovementSpeedModifierSystem _movement = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnStartup); + SubscribeLocalEvent(OnRefreshMovementSpeed); + } + + private void OnRefreshMovementSpeed(EntityUid uid, TraitSpeedModifierComponent component, RefreshMovementSpeedModifiersEvent args) + { + args.ModifySpeed(component.WalkModifier, component.SprintModifier, bypassImmunity: true); + } + + private void OnStartup(EntityUid uid, TraitSpeedModifierComponent component, ComponentStartup args) + { + if (!TryComp(uid, out var move)) + return; + + _movement.RefreshMovementSpeedModifiers(uid, move); + } +} diff --git a/Content.Shared/Vampiric/BloodSuckDoAfterEvent.cs b/Content.Shared/Vampiric/BloodSuckDoAfterEvent.cs new file mode 100644 index 00000000000..6aadc258d73 --- /dev/null +++ b/Content.Shared/Vampiric/BloodSuckDoAfterEvent.cs @@ -0,0 +1,10 @@ +using Robust.Shared.Serialization; +using Content.Shared.DoAfter; + +namespace Content.Shared.Vampiric +{ + [Serializable, NetSerializable] + public sealed partial class BloodSuckDoAfterEvent : SimpleDoAfterEvent + { + } +} diff --git a/Content.Shared/Weapons/Melee/MeleeWeaponComponent.cs b/Content.Shared/Weapons/Melee/MeleeWeaponComponent.cs index 9916b9cbf5e..2708a07c6eb 100644 --- a/Content.Shared/Weapons/Melee/MeleeWeaponComponent.cs +++ b/Content.Shared/Weapons/Melee/MeleeWeaponComponent.cs @@ -128,12 +128,11 @@ public sealed partial class MeleeWeaponComponent : Component public bool SwingLeft; [DataField, AutoNetworkedField] - public float HeavyStaminaCost = 10f; + public float HeavyStaminaCost = 20f; [DataField, AutoNetworkedField] public int MaxTargets = 5; - // Sounds /// diff --git a/Content.Shared/Weapons/Ranged/Components/GunComponent.cs b/Content.Shared/Weapons/Ranged/Components/GunComponent.cs index ada99801f01..8d7ecae1a81 100644 --- a/Content.Shared/Weapons/Ranged/Components/GunComponent.cs +++ b/Content.Shared/Weapons/Ranged/Components/GunComponent.cs @@ -241,6 +241,12 @@ public sealed partial class GunComponent : Component /// [DataField] public float FireOnDropChance = 0.1f; + + /// + /// Whether or not this gun is truly Recoilless, such as Lasers, and therefore shouldn't move the user. + /// + [DataField] + public bool DoRecoil = true; } [Flags] diff --git a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs index 1dfdede1afa..3c5e5c79846 100644 --- a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs +++ b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs @@ -362,11 +362,11 @@ private void AttemptShoot(EntityUid user, EntityUid gunUid, GunComponent gun) var shotEv = new GunShotEvent(user, ev.Ammo); RaiseLocalEvent(gunUid, ref shotEv); - if (userImpulse && TryComp(user, out var userPhysics)) - { - if (_gravity.IsWeightless(user, userPhysics)) - CauseImpulse(fromCoordinates, toCoordinates.Value, user, userPhysics); - } + if (gun.DoRecoil + && userImpulse + && TryComp(user, out var userPhysics) + && _gravity.IsWeightless(user, userPhysics)) + CauseImpulse(fromCoordinates, toCoordinates.Value, user, userPhysics); Dirty(gunUid, gun); } diff --git a/Resources/Audio/Admin/ahelp_error.ogg b/Resources/Audio/Admin/ahelp_error.ogg new file mode 100755 index 00000000000..bcdb3267900 Binary files /dev/null and b/Resources/Audio/Admin/ahelp_error.ogg differ diff --git a/Resources/Audio/Admin/ahelp_receive.ogg b/Resources/Audio/Admin/ahelp_receive.ogg new file mode 100755 index 00000000000..eb31b3a8ab3 Binary files /dev/null and b/Resources/Audio/Admin/ahelp_receive.ogg differ diff --git a/Resources/Audio/Admin/ahelp_send.ogg b/Resources/Audio/Admin/ahelp_send.ogg new file mode 100755 index 00000000000..427605cfb80 Binary files /dev/null and b/Resources/Audio/Admin/ahelp_send.ogg differ diff --git a/Resources/Audio/Admin/attributions.yml b/Resources/Audio/Admin/attributions.yml new file mode 100644 index 00000000000..8df7e38c578 --- /dev/null +++ b/Resources/Audio/Admin/attributions.yml @@ -0,0 +1,9 @@ +- files: [ "ahelp_error" ] + license: "CC-BY-NC-SA-3.0" + copyright: "CM-SS13" + source: "https://github.com/cmss13-devs/cmss13/commit/497204fb1660977fb6bf1fe8de153c65c8299d7d" + +- files: [ "ahelp_receive", "ahelp_send" ] + license: "CC-BY-NC-SA-3.0" + copyright: "CM-SS13" + source: "https://github.com/cmss13-devs/cmss13/commit/21e6447cc08aea502f671c819fdbcecbb85e6028" diff --git a/Resources/Audio/Nyanotrasen/Ambience/Objects/prober_hum_dangerous.ogg b/Resources/Audio/Ambience/Objects/prober_hum_dangerous.ogg similarity index 100% rename from Resources/Audio/Nyanotrasen/Ambience/Objects/prober_hum_dangerous.ogg rename to Resources/Audio/Ambience/Objects/prober_hum_dangerous.ogg diff --git a/Resources/Audio/Nyanotrasen/Ambience/Objects/prober_hum_high.ogg b/Resources/Audio/Ambience/Objects/prober_hum_high.ogg similarity index 100% rename from Resources/Audio/Nyanotrasen/Ambience/Objects/prober_hum_high.ogg rename to Resources/Audio/Ambience/Objects/prober_hum_high.ogg diff --git a/Resources/Audio/Nyanotrasen/Ambience/Objects/prober_hum_low.ogg b/Resources/Audio/Ambience/Objects/prober_hum_low.ogg similarity index 100% rename from Resources/Audio/Nyanotrasen/Ambience/Objects/prober_hum_low.ogg rename to Resources/Audio/Ambience/Objects/prober_hum_low.ogg diff --git a/Resources/Audio/Nyanotrasen/Ambience/Objects/prober_hum_moderate.ogg b/Resources/Audio/Ambience/Objects/prober_hum_moderate.ogg similarity index 100% rename from Resources/Audio/Nyanotrasen/Ambience/Objects/prober_hum_moderate.ogg rename to Resources/Audio/Ambience/Objects/prober_hum_moderate.ogg diff --git a/Resources/Audio/Announcers/Michael/alerts/delta.ogg b/Resources/Audio/Announcers/Michael/alerts/delta.ogg new file mode 100644 index 00000000000..95bea66f77a Binary files /dev/null and b/Resources/Audio/Announcers/Michael/alerts/delta.ogg differ diff --git a/Resources/Audio/Announcers/Michael/shuttle/shuttle_called.ogg b/Resources/Audio/Announcers/Michael/shuttle/called.ogg similarity index 100% rename from Resources/Audio/Announcers/Michael/shuttle/shuttle_called.ogg rename to Resources/Audio/Announcers/Michael/shuttle/called.ogg diff --git a/Resources/Audio/Announcers/Michael/shuttle/shuttle_dock.ogg b/Resources/Audio/Announcers/Michael/shuttle/dock.ogg similarity index 100% rename from Resources/Audio/Announcers/Michael/shuttle/shuttle_dock.ogg rename to Resources/Audio/Announcers/Michael/shuttle/dock.ogg diff --git a/Resources/Audio/Announcers/Michael/shuttle/shuttle_recalled.ogg b/Resources/Audio/Announcers/Michael/shuttle/recalled.ogg similarity index 100% rename from Resources/Audio/Announcers/Michael/shuttle/shuttle_recalled.ogg rename to Resources/Audio/Announcers/Michael/shuttle/recalled.ogg diff --git a/Resources/Audio/Announcers/NEIL/alerts/code_blue.ogg b/Resources/Audio/Announcers/NEIL/alerts/blue.ogg similarity index 100% rename from Resources/Audio/Announcers/NEIL/alerts/code_blue.ogg rename to Resources/Audio/Announcers/NEIL/alerts/blue.ogg diff --git a/Resources/Audio/Announcers/NEIL/alerts/code_delta.ogg b/Resources/Audio/Announcers/NEIL/alerts/delta.ogg similarity index 100% rename from Resources/Audio/Announcers/NEIL/alerts/code_delta.ogg rename to Resources/Audio/Announcers/NEIL/alerts/delta.ogg diff --git a/Resources/Audio/Announcers/NEIL/alerts/code_epsilon.ogg b/Resources/Audio/Announcers/NEIL/alerts/epsilon.ogg similarity index 100% rename from Resources/Audio/Announcers/NEIL/alerts/code_epsilon.ogg rename to Resources/Audio/Announcers/NEIL/alerts/epsilon.ogg diff --git a/Resources/Audio/Announcers/NEIL/alerts/code_gamma.ogg b/Resources/Audio/Announcers/NEIL/alerts/gamma.ogg similarity index 100% rename from Resources/Audio/Announcers/NEIL/alerts/code_gamma.ogg rename to Resources/Audio/Announcers/NEIL/alerts/gamma.ogg diff --git a/Resources/Audio/Announcers/NEIL/alerts/code_green.ogg b/Resources/Audio/Announcers/NEIL/alerts/green.ogg similarity index 100% rename from Resources/Audio/Announcers/NEIL/alerts/code_green.ogg rename to Resources/Audio/Announcers/NEIL/alerts/green.ogg diff --git a/Resources/Audio/Announcers/NEIL/alerts/code_red.ogg b/Resources/Audio/Announcers/NEIL/alerts/red.ogg similarity index 100% rename from Resources/Audio/Announcers/NEIL/alerts/code_red.ogg rename to Resources/Audio/Announcers/NEIL/alerts/red.ogg diff --git a/Resources/Audio/Announcers/NEIL/alerts/code_violet.ogg b/Resources/Audio/Announcers/NEIL/alerts/violet.ogg similarity index 100% rename from Resources/Audio/Announcers/NEIL/alerts/code_violet.ogg rename to Resources/Audio/Announcers/NEIL/alerts/violet.ogg diff --git a/Resources/Audio/Announcers/NEIL/alerts/code_white.ogg b/Resources/Audio/Announcers/NEIL/alerts/white.ogg similarity index 100% rename from Resources/Audio/Announcers/NEIL/alerts/code_white.ogg rename to Resources/Audio/Announcers/NEIL/alerts/white.ogg diff --git a/Resources/Audio/Announcers/NEIL/alerts/code_yellow.ogg b/Resources/Audio/Announcers/NEIL/alerts/yellow.ogg similarity index 100% rename from Resources/Audio/Announcers/NEIL/alerts/code_yellow.ogg rename to Resources/Audio/Announcers/NEIL/alerts/yellow.ogg diff --git a/Resources/Audio/DeltaV/Items/gavel.ogg b/Resources/Audio/DeltaV/Items/gavel.ogg new file mode 100644 index 00000000000..c6061cbb3dd Binary files /dev/null and b/Resources/Audio/DeltaV/Items/gavel.ogg differ diff --git a/Resources/Audio/Effects/CPR.ogg b/Resources/Audio/Effects/CPR.ogg new file mode 100644 index 00000000000..2c7cedd2033 Binary files /dev/null and b/Resources/Audio/Effects/CPR.ogg differ diff --git a/Resources/Audio/Effects/adminhelp.ogg b/Resources/Audio/Effects/adminhelp.ogg deleted file mode 100644 index 704c0fd6d20..00000000000 Binary files a/Resources/Audio/Effects/adminhelp.ogg and /dev/null differ diff --git a/Resources/Audio/Nyanotrasen/Psionics/attributions.yml b/Resources/Audio/Psionics/attributions.yml similarity index 100% rename from Resources/Audio/Nyanotrasen/Psionics/attributions.yml rename to Resources/Audio/Psionics/attributions.yml diff --git a/Resources/Audio/Nyanotrasen/Psionics/heartbeat_fast.ogg b/Resources/Audio/Psionics/heartbeat_fast.ogg similarity index 100% rename from Resources/Audio/Nyanotrasen/Psionics/heartbeat_fast.ogg rename to Resources/Audio/Psionics/heartbeat_fast.ogg diff --git a/Resources/Audio/Supermatter/calm.ogg b/Resources/Audio/Supermatter/calm.ogg new file mode 100644 index 00000000000..dc3102e5786 Binary files /dev/null and b/Resources/Audio/Supermatter/calm.ogg differ diff --git a/Resources/Audio/Supermatter/delamming.ogg b/Resources/Audio/Supermatter/delamming.ogg new file mode 100644 index 00000000000..a48878ec42f Binary files /dev/null and b/Resources/Audio/Supermatter/delamming.ogg differ diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index d019ca79758..1abacbd8fe1 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4658,3 +4658,508 @@ Entries: message: Long Survival has been added as a new Game mode. id: 6185 time: '2024-07-27T06:00:24.0000000+00:00' +- author: CilliePaint + changes: + - type: Tweak + message: New Box Textures! + id: 6186 + time: '2024-07-29T05:50:43.0000000+00:00' +- author: Mnemotechnician + changes: + - type: Fix + message: >- + Fixed toolshed command permissions. This will mostly affect admins who + don't have full host access. + id: 6187 + time: '2024-07-29T05:54:01.0000000+00:00' +- author: VMSolidus + changes: + - type: Fix + message: Radiation damage no longer interrupts DoAfters. + id: 6188 + time: '2024-07-29T06:00:26.0000000+00:00' +- author: Skubman + changes: + - type: Add + message: >- + Added cybernetic limb markings from Hesphiastos Industries and Bishop + Cybernetics. + id: 6189 + time: '2024-07-30T21:33:23.0000000+00:00' +- author: Skubman + changes: + - type: Add + message: >- + Makeup is finally here: lips, blush, and nail polish! Sashay over to + Character Setup in the Markings section, then look at Head/Overlay to + give makeovers to your characters! + id: 6190 + time: '2024-07-30T21:34:37.0000000+00:00' +- author: VMSolidus + changes: + - type: Fix + message: >- + Fixed Tools, Drink Containers, Lockers, and all base items having + inconsistent sound settings. + id: 6191 + time: '2024-07-31T22:47:01.0000000+00:00' +- author: VMSolidus + changes: + - type: Fix + message: 'Lasers no longer function as jetpacks in space. ' + id: 6192 + time: '2024-07-31T22:57:33.0000000+00:00' +- author: DEATHB4DEFEAT + changes: + - type: Fix + message: Fixed the Uncategorized category not being hidden when empty + id: 6193 + time: '2024-07-31T23:32:52.0000000+00:00' +- author: Mnemotechnician + changes: + - type: Fix + message: Whisper can no longer be heard clearly outside the intended range. + - type: Fix + message: >- + Translators can no longer be used without knowing the languages they + require. + - type: Fix + message: >- + Computers (primarily RnD console) now speak GC by default instead of + Universal. + - type: Tweak + message: Readjusted colors of all languages to make them easier to read. + id: 6194 + time: '2024-07-31T23:57:25.0000000+00:00' +- author: Skubman + changes: + - type: Add + message: >- + Added dozens of new clothes and items to Loadouts, including the new + Mask category. Have fun dressing up your characters! + - type: Tweak + message: Restrict Command Loadouts from selecting uniforms outside of their job. + - type: Tweak + message: >- + Limit the selection in Security Loadouts of non-sec uniforms, hats, and + masks to those that maintain the Security aesthetic. + - type: Tweak + message: >- + Made all types of colored jumpsuits in Loadouts available to Civilian + roles (excluding HoP), and suitable jumpsuits to Epistemics, + Engineering, and Medical. + - type: Fix + message: Prevent dionas and harpies from selecting shoes in Loadouts. + id: 6195 + time: '2024-08-01T02:37:45.0000000+00:00' +- author: DEATHB4DEFEAT + changes: + - type: Tweak + message: >- + The station's crew hivemind has decided to slow down their movement and + enjoy The Park instead of sprinting everywhere + id: 6196 + time: '2024-08-01T08:30:47.0000000+00:00' +- author: VMSolidus + changes: + - type: Add + message: 'Survival Boxes have been added to loadouts. ' + id: 6197 + time: '2024-08-01T21:12:49.0000000+00:00' +- author: VMSolidus + changes: + - type: Add + message: >- + Boxes(Cardboard, Medkits, Lunchboxes) now contain slightly more + inventory slots than they occupy. + id: 6198 + time: '2024-08-01T21:55:09.0000000+00:00' +- author: VMSolidus + changes: + - type: Tweak + message: >- + Ultraviolet Vision, Deuteranopia, and Trichromat Modification are all + now 0 point Neutral traits. They still occupy one of your trait + selections. + id: 6199 + time: '2024-08-01T22:41:24.0000000+00:00' +- author: Skubman + changes: + - type: Add + message: 'Added new clothes in Loadouts: slim trench coat, and Mafia-style suits.' + - type: Add + message: >- + Added new useful items in Loadouts: lunchbox, more survival gear, + paperwork, and medkits. + id: 6200 + time: '2024-08-01T22:45:13.0000000+00:00' +- author: FoxxoTrystan + changes: + - type: Add + message: Vulpkanins can wag their tails now + id: 6201 + time: '2024-08-01T23:06:24.0000000+00:00' +- author: angelofallars + changes: + - type: Add + message: >- + Added the combat knife to the SecTech, and the ability to manufacture + combat knives in the SecLathe and emagged autolathes. + - type: Add + message: >- + Added a 1-point combat knife to Loadouts for Felinid/Harpy security + jobs. + - type: Tweak + message: Made the security belt and security webbing able to hold combat knives. + - type: Tweak + message: 'Prison Guards now start with combat boots with a combat knife. ' + id: 6202 + time: '2024-08-02T07:08:07.0000000+00:00' +- author: rosieposieeee + changes: + - type: Add + message: >- + Added breaching charges to the SecTech vendor for Security, to break + through walls. + id: 6203 + time: '2024-08-02T07:09:44.0000000+00:00' +- author: DEATHB4DEFEAT + changes: + - type: Tweak + message: >- + The AdminHelp sound has changed to three that play under different + circumstances + id: 6204 + time: '2024-08-02T07:14:01.0000000+00:00' +- author: Mnemotechnician + changes: + - type: Fix + message: >- + Reverted the station event scheduler rework due to it absolutely + breaking the game. + id: 6205 + time: '2024-08-02T22:52:41.0000000+00:00' +- author: VMSolidus + changes: + - type: Add + message: 'Supermatter Engines have been implemented. ' + id: 6206 + time: '2024-08-03T00:41:54.0000000+00:00' +- author: Tilkku + changes: + - type: Tweak + message: Rouny Sprite Changed + id: 6207 + time: '2024-08-03T11:04:01.0000000+00:00' +- author: VMSolidus + changes: + - type: Tweak + message: >- + Due to budget cuts, Nanotrasen has ceased stocking Clothesmate vendors + with more clothing than the average cargo tech can afford. Civilians are + advised to bring their own clothes to the station if they wish to wear + anything other than grey. + id: 6208 + time: '2024-08-04T00:23:53.0000000+00:00' +- author: VMSolidus + changes: + - type: Add + message: >- + SweatMAX, "hot foods", Mars Mart, and Nippon-tan vendors have all been + added to vendor spawners. + id: 6209 + time: '2024-08-04T06:26:34.0000000+00:00' +- author: Skubman + changes: + - type: Add + message: >- + Add the Voracious trait, a 1-point trait that makes you eat and drink + twice as fast. + id: 6210 + time: '2024-08-04T09:30:31.0000000+00:00' +- author: VMSolidus + changes: + - type: Fix + message: >- + Zombie events have had their Anti-Stalling mechanic improved. Dead + (Player) Zombies, Infected Players, and Initial Infected are all counted + as zombies for the purpose of determine if the shuttle should be called. + Additionally, any player who leaves the station is no longer counted as + a healthy crewman for the automatic shuttle call. + id: 6211 + time: '2024-08-04T14:14:12.0000000+00:00' +- author: Skubman + changes: + - type: Tweak + message: Rename the trait "Heavyweight Drunk" into "Alcohol Tolerance". + id: 6212 + time: '2024-08-05T03:30:41.0000000+00:00' +- author: Skubman + changes: + - type: Add + message: >- + Add the Light Step trait, a 1-point trait that makes your footsteps + quieter. + id: 6213 + time: '2024-08-05T15:29:07.0000000+00:00' +- author: Skubman + changes: + - type: Add + message: >- + Add a new 1-point trait called Sign Language, a trait that allows you to + communicate in Galactic Sign Language. + id: 6214 + time: '2024-08-05T16:55:31.0000000+00:00' +- author: Mnemotechnician + changes: + - type: Tweak + message: >- + Oracle requests are now more likely to be aligned with the current + research. + id: 6215 + time: '2024-08-05T17:10:42.0000000+00:00' +- author: VMSolidus + changes: + - type: Tweak + message: >- + The Carrying system has been reworked as a means of better supporting + having extremely large species and characters. 10kg Harpies should no + longer be oppressed by 2000kg Lamia with infinitely short carry + attempts. + id: 6216 + time: '2024-08-05T17:11:37.0000000+00:00' +- author: Rane + changes: + - type: Add + message: Lamiae should now be rendered much better. + id: 6217 + time: '2024-08-05T17:15:51.0000000+00:00' +- author: gluesniffler + changes: + - type: Add + message: Added an unlockable PKA and Jetpack module to Salvage Cyborgs + id: 6218 + time: '2024-08-06T01:14:31.0000000+00:00' +- author: VMSolidus + changes: + - type: Add + message: Arachne have been reimplemented! + - type: Add + message: Oneirophages are back! + id: 6219 + time: '2024-08-06T04:52:32.0000000+00:00' +- author: VMSolidus + changes: + - type: Add + message: >- + CPR has been added to the game. People with CPR training can now perform + CPR on anyone who is in either crit or dead states. + - type: Add + message: >- + CPR Training has been added to the game as a new positive trait. All + medical staff start with this trait for free. + id: 6220 + time: '2024-08-06T05:28:54.0000000+00:00' +- author: Skubman + changes: + - type: Add + message: >- + Add the Self-Aware trait, a 2-point trait that allows you to examine + your Brute/Burn damage numbers like a health analyzer, and estimate your + toxin/airloss damage. + id: 6221 + time: '2024-08-06T08:05:59.0000000+00:00' +- author: TJohnson + changes: + - type: Tweak + message: >- + Removed overlay restriction for vulps, you can now have as many overlay + markings as you want! + id: 6222 + time: '2024-08-06T19:05:46.0000000+00:00' +- author: whateverusername0 + changes: + - type: Add + message: Added different stamina damage resistance to hardsuits. + id: 6223 + time: '2024-08-06T19:08:48.0000000+00:00' +- author: Skubman + changes: + - type: Add + message: >- + Add the Blood Deficiency trait, a new negative trait that makes you + slowly lose blood over time. You must routinely receive blood loss + treatment to live, and even normally non-lethal bleeding can make you + start dying slowly. + id: 6224 + time: '2024-08-06T19:12:34.0000000+00:00' +- author: Skubman + changes: + - type: Add + message: >- + Add three new 1-point traits for Onis that allow you to specialize in + Slash or Piercing damage or be a melee weapons generalist. + id: 6225 + time: '2024-08-06T19:50:20.0000000+00:00' +- author: Skubman + changes: + - type: Add + message: >- + Add Parkour Training, a 3-point trait that makes you faster with + climbing tables and crawling. + id: 6226 + time: '2024-08-06T20:37:00.0000000+00:00' +- author: WarMechanic + changes: + - type: Tweak + message: >- + EMP Grenades can now disable basically any electrical device, and stack + in disable duration. + id: 6227 + time: '2024-08-06T20:47:49.0000000+00:00' +- author: Mnemotechnician + changes: + - type: Add + message: >- + Admin tooling: added several admin commands to help manipulate entities' + languages. + id: 6228 + time: '2024-08-06T21:22:11.0000000+00:00' +- author: Tilkku + changes: + - type: Add + message: Added Pen Lights + - type: Add + message: Eye Examination + id: 6229 + time: '2024-08-06T21:51:21.0000000+00:00' +- author: WarMechanic + changes: + - type: Add + message: >- + Gloves now have unique fingerprints. Items can be traced back to gloves, + which can then be traced back to people. + id: 6230 + time: '2024-08-06T22:03:36.0000000+00:00' +- author: Skubman + changes: + - type: Fix + message: Passive blood regeneration now works again. + id: 6231 + time: '2024-08-07T06:07:35.0000000+00:00' +- author: Fansana + changes: + - type: Fix + message: Barotrauma admin log spam + id: 6232 + time: '2024-08-07T17:31:55.0000000+00:00' +- author: Mnemotechnician + changes: + - type: Add + message: Mr. Butlertron can now suffer for its crimes. + id: 6233 + time: '2024-08-07T22:38:04.0000000+00:00' +- author: VMSolidus + changes: + - type: Add + message: >- + The following new markings have been added for Harpies: Bat Wings, + Simple Bionic Wings, Haven Tail, Swallow tail, and Long Forked Tail + id: 6234 + time: '2024-08-07T23:11:41.0000000+00:00' +- author: DangerRevolution + changes: + - type: Add + message: Readded Psionic Relay Orb + id: 6235 + time: '2024-08-07T23:16:30.0000000+00:00' +- author: Skubman + changes: + - type: Add + message: >- + Add two new negative traits: Sluggish (+1) and Snail-Paced (+2) that + make you move slower, and climb tables slower. + id: 6236 + time: '2024-08-07T23:38:33.0000000+00:00' +- author: Skubman + changes: + - type: Add + message: >- + Add the Hemophilia trait, a new negative trait for 1 point that makes + you bleed twice as long and makes you take 10% more Blunt damage. + id: 6237 + time: '2024-08-07T23:39:52.0000000+00:00' +- author: SleepyScarecrow + changes: + - type: Fix + message: Fixed the RegenMesh recipe + id: 6238 + time: '2024-08-07T23:51:29.0000000+00:00' +- author: dootythefrooty + changes: + - type: Add + message: >- + Added Bluespace Slips, a plant trait that teleports you randomly if you + slip. + id: 6239 + time: '2024-08-07T23:54:13.0000000+00:00' +- author: BlueHNT + changes: + - type: Tweak + message: >- + Tweaked the formatting for WelderRefinable refineResult to use + EntitySpawnEntry format + id: 6240 + time: '2024-08-08T00:16:02.0000000+00:00' +- author: VMSolidus + changes: + - type: Fix + message: Moths can now once again be colorful. + id: 6241 + time: '2024-08-08T00:18:08.0000000+00:00' +- author: ShatteredSwords + changes: + - type: Tweak + message: Skeleton ghost role description has been adjusted to be less evil. + id: 6242 + time: '2024-08-09T10:52:49.0000000+00:00' +- author: VMSolidus + changes: + - type: Add + message: >- + Geiger Counters other than ones installed in Hardsuits now generate an + audible sound when active and exposed to radiation. + - type: Add + message: Wall mounted geiger counters have been added to the game. + id: 6243 + time: '2024-08-09T11:13:13.0000000+00:00' +- author: Skubman + changes: + - type: Add + message: >- + Dionas have been given a 25% slower movement speed. In exchange for + that, they gain absolute slip immunity and movement speed modifier + immunity. This makes them immune to slowdown from things like + duffelbags, hardsuits, and spider webs. + - type: Fix + message: >- + Sluggish and Snail-Paced will now properly apply their movement + penalties upon joining. + id: 6244 + time: '2024-08-09T17:28:01.0000000+00:00' +- author: ODJ + changes: + - type: Tweak + message: >- + Melee Weapons now feel different across the board, from the Wrench to + the Chainsaw, try out their normal swings and their heavy attacks! + id: 6245 + time: '2024-08-10T12:00:06.0000000+00:00' +- author: Rane + changes: + - type: Tweak + message: >- + Renamed "Psionic Mantis" to "Mantis", as it was originally going to be + called. + id: 6246 + time: '2024-08-10T12:03:12.0000000+00:00' diff --git a/Resources/Credits/GitHub.txt b/Resources/Credits/GitHub.txt index e6c7690ad37..6e47a71e43f 100644 --- a/Resources/Credits/GitHub.txt +++ b/Resources/Credits/GitHub.txt @@ -1 +1 @@ -0x6273, 2013HORSEMEATSCANDAL, 20kdc, 21Melkuu, 4dplanner, 612git, 778b, Ablankmann, Acruid, actioninja, adamsong, Admiral-Obvious-001, Adrian16199, Aerocrux, Aexxie, africalimedrop, Agoichi, Ahion, AJCM-git, AjexRose, Alekshhh, AlexMorgan3817, AlmondFlour, AlphaQwerty, Altoids1, amylizzle, ancientpower, ArchPigeon, Arendian, arimah, Arteben, AruMoon, as334, AsikKEsel, asperger-sind, aspiringLich, avghdev, AzzyIsNotHere, BananaFlambe, BasedUser, beck-thompson, BGare, BingoJohnson-zz, BismarckShuffle, Bixkitts, Blackern5000, Blazeror, Boaz1111, BobdaBiscuit, brainfood1183, BramvanZijp, Brandon-Huu, Bribrooo, Bright0, brndd, BubblegumBlue, BYONDFuckery, c4llv07e, CaasGit, CakeQ, CaptainSqrBeard, Carbonhell, Carolyn3114, CatTheSystem, Centronias, chairbender, Charlese2, Cheackraze, cheesePizza2, Chief-Engineer, chromiumboy, Chronophylos, clement-or, Clyybber, CodedCrow, ColdAutumnRain, Colin-Tel, collinlunn, ComicIronic, coolmankid12345, corentt, crazybrain23, creadth, CrigCrag, Crotalus, CrudeWax, CrzyPotato, Cyberboss, d34d10cc, Daemon, daerSeebaer, dahnte, dakamakat, dakimasu, DamianX, DangerRevolution, daniel-cr, Darkenson, DawBla, dch-GH, Deahaka, DEATHB4DEFEAT, DeathCamel58, deathride58, DebugOk, Decappi, Deeeeja, deepdarkdepths, Delete69, deltanedas, DeltaV-Bot, DerbyX, DoctorBeard, DogZeroX, dontbetank, Doru991, DoubleRiceEddiedd, DrMelon, DrSmugleaf, drteaspoon420, DTanxxx, DubiousDoggo, Duddino, Dutch-VanDerLinde, Easypoller, eclips_e, EdenTheLiznerd, EEASAS, Efruit, ElectroSR, elthundercloud, Emisse, EmoGarbage404, Endecc, enumerate0, eoineoineoin, ERORR404V1, Errant-4, estacaoespacialpirata, exincore, exp111, Fahasor, FairlySadPanda, ficcialfaint, Fildrance, FillerVK, Fishfish458, Flareguy, FluffiestFloof, FluidRock, FoLoKe, fooberticus, Fortune117, FoxxoTrystan, freeman2651, Froffy025, Fromoriss, FungiFellow, GalacticChimp, gbasood, Geekyhobo, Genkail, geraeumig, Ghagliiarghii, Git-Nivrak, github-actions[bot], gituhabu, GNF54, Golinth, GoodWheatley, graevy, GreyMario, Guess-My-Name, gusxyz, h3half, Hanzdegloker, Hardly3D, harikattar, Hebiman, Henry12116, HerCoyote23, Hmeister-real, HoofedEar, hord-brayden, hubismal, Hugal31, Huxellberger, Hyenh, iacore, IamVelcroboy, icekot8, igorsaux, ike709, Illiux, Ilya246, IlyaElDunaev, Injazz, Insineer, IntegerTempest, Interrobang01, IProduceWidgets, ItsMeThom, Jackal298, Jackrost, jamessimo, janekvap, JerryImMouse, Jessetriesagain, jessicamaybe, Jezithyr, jicksaw, JiimBob, JoeHammad1844, JohnGinnane, johnku1, joshepvodka, jproads, Jrpl, juliangiebel, JustArt1m, JustCone14, JustinTrotter, KaiShibaa, kalane15, kalanosh, Kelrak, kerisargit, keronshb, KIBORG04, Killerqu00, KingFroozy, kira-er, Kit0vras, KittenColony, Ko4ergaPunk, komunre, koteq, Krunklehorn, kxvvv, Lamrr, LankLTE, lapatison, Leander-0, leonardo-dabepis, LetterN, Level10Cybermancer, lever1209, liltenhead, LittleBuilderJane, Lomcastar, LordCarve, LordEclipse, LovelyLophi, Lukasz825700516, lunarcomets, luringens, lvvova1, lzimann, lzk228, MACMAN2003, Macoron, MagnusCrowe, ManelNavola, Matz05, MehimoNemo, MeltedPixel, MemeProof, Menshin, Mervill, metalgearsloth, mhamsterr, MilenVolf, Minty642, Mirino97, mirrorcult, misandrie, MishaUnity, MisterMecky, Mith-randalf, Mnemotechnician, Moneyl, Moomoobeef, moony, Morb0, Mr0maks, musicmanvr, Myakot, Myctai, N3X15, Nairodian, Naive817, namespace-Memory, NickPowers43, nikthechampiongr, Nimfar11, Nirnael, nmajask, nok-ko, notafet, notquitehadouken, noudoit, noverd, nuke-haus, NULL882, OCOtheOmega, OctoRocket, OldDanceJacket, onoira, osjarw, Owai-Seek, pali6, Pangogie, patrikturi, PaulRitter, Peptide90, peptron1, Phantom-Lily, PHCodes, PixelTheKermit, PJB3005, Plykiya, pofitlo, pointer-to-null, PolterTzi, PoorMansDreams, potato1234x, ProfanedBane, PrPleGoo, ps3moira, Pspritechologist, Psychpsyo, psykzz, PuroSlavKing, quatre, QuietlyWhisper, qwerltaz, Radosvik, Radrark, Rainbeon, Rainfey, Rane, ravage123321, rbertoche, Redict, RedlineTriad, RednoWCirabrab, RemberBM, RemieRichards, RemTim, rene-descartes2021, RiceMar1244, RieBi, Rinkashikachi, Rockdtben, rolfero, rosieposieeee, Saakra, Samsterious, SaphireLattice, ScalyChimp, scrato, Scribbles0, Serkket, SethLafuente, ShadowCommander, Shadowtheprotogen546, SignalWalker, SimpleStation14, Simyon264, Sirionaut, siyengar04, Skarletto, Skrauz, Skyedra, SlamBamActionman, slarticodefast, Slava0135, Snowni, snowsignal, SonicHDC, SoulSloth, SpaceManiac, SpeltIncorrectyl, spoogemonster, ssdaniel24, Stealthbomber16, stellar-novas, StrawberryMoses, superjj18, SweptWasTaken, Szunti, TadJohnson00, takemysoult, TaralGit, Tayrtahn, tday93, TekuNut, TemporalOroboros, tentekal, tgrkzus, thatrandomcanadianguy, TheArturZh, theashtronaut, thedraccx, themias, Theomund, theOperand, TheShuEd, TimrodDX, Titian3, tkdrg, tmtmtl30, TokenStyle, tom-leys, tomasalves8, Tomeno, Tornado-Technology, tosatur, Tryded, TsjipTsjip, Tunguso4ka, TurboTrackerss14, Tyler-IN, Tyzemol, UbaserB, UKNOWH, UnicornOnLSD, Uriende, UristMcDorf, Vaaankas, Varen, VasilisThePikachu, veliebm, Veritius, Vermidia, Verslebas, VigersRay, Visne, VMSolidus, volundr-, Voomra, Vordenburg, vulppine, wafehling, WarMechanic, waylon531, weaversam8, Willhelm53, wixoaGit, WlarusFromDaSpace, wrexbe, xRiriq, yathxyz, Ygg01, YotaXP, YuriyKiss, zach-hill, Zandario, Zap527, Zealith-Gamer, ZelteHonor, zerorulez, zionnBE, zlodo, ZNixian, ZoldorfTheWizard, Zumorica, Zymem +0x6273, 2013HORSEMEATSCANDAL, 20kdc, 21Melkuu, 4dplanner, 612git, 778b, Ablankmann, Acruid, actioninja, adamsong, Admiral-Obvious-001, Adrian16199, Aerocrux, Aexxie, africalimedrop, Agoichi, Ahion, AJCM-git, AjexRose, Alekshhh, AlexMorgan3817, AlmondFlour, AlphaQwerty, Altoids1, amylizzle, ancientpower, angelofallars, ArchPigeon, Arendian, arimah, Arteben, AruMoon, as334, AsikKEsel, asperger-sind, aspiringLich, avghdev, AzzyIsNotHere, BananaFlambe, BasedUser, beck-thompson, BGare, BingoJohnson-zz, BismarckShuffle, Bixkitts, Blackern5000, Blazeror, Boaz1111, BobdaBiscuit, brainfood1183, BramvanZijp, Brandon-Huu, Bribrooo, Bright0, brndd, BubblegumBlue, BYONDFuckery, c4llv07e, CaasGit, CakeQ, CaptainSqrBeard, Carbonhell, Carolyn3114, CatTheSystem, Centronias, chairbender, Charlese2, Cheackraze, cheesePizza2, Chief-Engineer, chromiumboy, Chronophylos, clement-or, Clyybber, CodedCrow, ColdAutumnRain, Colin-Tel, collinlunn, ComicIronic, coolmankid12345, corentt, crazybrain23, creadth, CrigCrag, Crotalus, CrudeWax, CrzyPotato, Cyberboss, d34d10cc, Daemon, daerSeebaer, dahnte, dakamakat, dakimasu, DamianX, DangerRevolution, daniel-cr, Darkenson, DawBla, dch-GH, Deahaka, DEATHB4DEFEAT, DeathCamel58, deathride58, DebugOk, Decappi, Deeeeja, deepdarkdepths, Delete69, deltanedas, DeltaV-Bot, DerbyX, DoctorBeard, DogZeroX, dontbetank, Doru991, DoubleRiceEddiedd, DrMelon, DrSmugleaf, drteaspoon420, DTanxxx, DubiousDoggo, Duddino, Dutch-VanDerLinde, Easypoller, eclips_e, EdenTheLiznerd, EEASAS, Efruit, ElectroSR, elthundercloud, Emisse, EmoGarbage404, Endecc, enumerate0, eoineoineoin, ERORR404V1, Errant-4, estacaoespacialpirata, exincore, exp111, Fahasor, FairlySadPanda, ficcialfaint, Fildrance, FillerVK, Fishfish458, Flareguy, FluffiestFloof, FluidRock, FoLoKe, fooberticus, Fortune117, FoxxoTrystan, freeman2651, Froffy025, Fromoriss, FungiFellow, GalacticChimp, gbasood, Geekyhobo, Genkail, geraeumig, Ghagliiarghii, Git-Nivrak, github-actions[bot], gituhabu, GNF54, Golinth, GoodWheatley, graevy, GreyMario, Guess-My-Name, gusxyz, h3half, Hanzdegloker, Hardly3D, harikattar, Hebiman, Henry12116, HerCoyote23, Hmeister-real, HoofedEar, Hoolny, hord-brayden, hubismal, Hugal31, Huxellberger, Hyenh, iacore, IamVelcroboy, icekot8, igorsaux, ike709, Illiux, Ilya246, IlyaElDunaev, Injazz, Insineer, Interrobang01, IProduceWidgets, ItsMeThom, Jackal298, Jackrost, jamessimo, janekvap, JerryImMouse, Jessetriesagain, jessicamaybe, Jezithyr, jicksaw, JiimBob, JoeHammad1844, JohnGinnane, johnku1, joshepvodka, jproads, Jrpl, juliangiebel, JustArt1m, JustCone14, JustinTrotter, KaiShibaa, kalane15, kalanosh, Kelrak, kerisargit, keronshb, KIBORG04, Killerqu00, KingFroozy, kira-er, Kit0vras, KittenColony, Ko4ergaPunk, komunre, koteq, Krunklehorn, kxvvv, Lamrr, LankLTE, lapatison, Leander-0, leonardo-dabepis, LetterN, Level10Cybermancer, lever1209, liltenhead, LittleBuilderJane, Lomcastar, LordCarve, LordEclipse, LovelyLophi, Lukasz825700516, lunarcomets, luringens, lvvova1, lzimann, lzk228, MACMAN2003, Macoron, MagnusCrowe, ManelNavola, Matz05, MehimoNemo, MeltedPixel, MemeProof, Menshin, Mervill, metalgearsloth, mhamsterr, MilenVolf, Minty642, Mirino97, mirrorcult, misandrie, MishaUnity, MisterMecky, Mith-randalf, Mnemotechnician, Moneyl, Moomoobeef, moony, Morb0, Mr0maks, musicmanvr, Myakot, Myctai, N3X15, Nairodian, Naive817, namespace-Memory, NickPowers43, nikthechampiongr, Nimfar11, Nirnael, nmajask, nok-ko, notafet, notquitehadouken, noudoit, noverd, nuke-haus, NULL882, OCOtheOmega, OctoRocket, OldDanceJacket, onoira, osjarw, Owai-Seek, pali6, Pangogie, patrikturi, PaulRitter, Peptide90, peptron1, Phantom-Lily, PHCodes, PixelTheKermit, PJB3005, Plykiya, pofitlo, pointer-to-null, PolterTzi, PoorMansDreams, potato1234x, ProfanedBane, PrPleGoo, ps3moira, Pspritechologist, Psychpsyo, psykzz, PuroSlavKing, quatre, QuietlyWhisper, qwerltaz, Radosvik, Radrark, Rainbeon, Rainfey, Rane, ravage123321, rbertoche, Redict, RedlineTriad, RednoWCirabrab, RemberBM, RemieRichards, RemTim, rene-descartes2021, RiceMar1244, RieBi, Rinkashikachi, Rockdtben, rolfero, rosieposieeee, Saakra, Samsterious, SaphireLattice, ScalyChimp, scrato, Scribbles0, Serkket, ShadowCommander, Shadowtheprotogen546, SignalWalker, SimpleStation14, Simyon264, Sirionaut, siyengar04, Skarletto, Skrauz, Skyedra, SlamBamActionman, slarticodefast, Slava0135, Snowni, snowsignal, SonicHDC, SoulSloth, SpaceManiac, SpeltIncorrectyl, spoogemonster, ssdaniel24, stalengd, Stealthbomber16, stellar-novas, StrawberryMoses, superjj18, SweptWasTaken, Szunti, TadJohnson00, takemysoult, TaralGit, Tayrtahn, tday93, TekuNut, TemporalOroboros, tentekal, tgrkzus, thatrandomcanadianguy, TheArturZh, theashtronaut, thedraccx, themias, Theomund, theOperand, TheShuEd, TimrodDX, Titian3, tkdrg, Tmanzxd, tmtmtl30, TokenStyle, tom-leys, tomasalves8, Tomeno, Tornado-Technology, tosatur, Tryded, TsjipTsjip, Tunguso4ka, TurboTrackerss14, Tyler-IN, Tyzemol, UbaserB, UKNOWH, UnicornOnLSD, Uriende, UristMcDorf, Vaaankas, Varen, VasilisThePikachu, veliebm, Veritius, Vermidia, Verslebas, VigersRay, Visne, VMSolidus, volundr-, Voomra, Vordenburg, vulppine, wafehling, WarMechanic, waylon531, weaversam8, Willhelm53, wixoaGit, WlarusFromDaSpace, wrexbe, xRiriq, yathxyz, Ygg01, YotaXP, YuriyKiss, zach-hill, Zandario, Zap527, Zealith-Gamer, ZelteHonor, zerorulez, zionnBE, zlodo, ZNixian, ZoldorfTheWizard, Zumorica, Zymem diff --git a/Resources/Locale/en-US/abilities/arachne.ftl b/Resources/Locale/en-US/abilities/arachne.ftl new file mode 100644 index 00000000000..6f6348d7212 --- /dev/null +++ b/Resources/Locale/en-US/abilities/arachne.ftl @@ -0,0 +1,13 @@ +action-name-spin-web = Spin Web +action-desc-spin-web = Use your spinnerets to make a spider web in the current tile. Makes you hungrier and thirstier. +action-name-spin-web-space = You can't spin a web in space! +action-name-spin-web-blocked = There's no room for a web here. +spin-web-action-hungry = You're too hungry to spin a web! +spin-web-action-thirsty = You're too thirsty to spin a web! +spin-web-start-second-person = You start spinning a web. +spin-web-start-third-person = {CAPITALIZE(THE($spider))} starts spinning a web! +cocoon-start-second-person = You start cocooning {THE($target)}. +cocoon-start-third-person = {CAPITALIZE(THE($spider))} starts cocooning {THE($target)}. +spun-web-second-person = You spin up a web. +spun-web-third-person = {CAPITALIZE(THE($spider))} spins up a web! +cocoon = Cocoon diff --git a/Resources/Locale/en-US/abilities/bloodsucker.ftl b/Resources/Locale/en-US/abilities/bloodsucker.ftl new file mode 100644 index 00000000000..d956eaff84e --- /dev/null +++ b/Resources/Locale/en-US/abilities/bloodsucker.ftl @@ -0,0 +1,19 @@ +action-name-suck-blood = Suck Blood +action-description-suck-blood = Suck the blood of the victim in your hand. + +bloodsucker-fail-helmet = You'd need to remove {THE($helmet)}. +bloodsucker-fail-mask = You'd need to remove your mask! + +bloodsucker-fail-not-blood = { CAPITALIZE(SUBJECT($target)) } doesn't have delicious, nourishing mortal blood. +bloodsucker-fail-no-blood = { CAPITALIZE(SUBJECT($target)) } has no blood in { POSS-ADJ($target) } body. +bloodsucker-fail-no-blood-bloodsucked = { CAPITALIZE(SUBJECT($target)) } has been sucked dry. + +bloodsucker-blood-sucked = You suck some blood from {$target}. +bloodsucker-doafter-start = You try to suck blood from {$target}. + +bloodsucker-doafter-start-victim = {CAPITALIZE(THE($sucker))} is trying to bite your neck! +bloodsucker-blood-sucked-victim = {CAPITALIZE(THE($sucker))} sucks some of your blood! + +bloodsucked-health-examine = [color=red]{ CAPITALIZE(SUBJECT($target)) } { CONJUGATE-HAVE($target) } bite marks on { POSS-ADJ($target) } neck.[/color] + +bloodsucker-glands-throb = The glands behind your fangs feel a bit sore. diff --git a/Resources/Locale/en-US/nyanotrasen/abilities/psionic.ftl b/Resources/Locale/en-US/abilities/psionic.ftl similarity index 100% rename from Resources/Locale/en-US/nyanotrasen/abilities/psionic.ftl rename to Resources/Locale/en-US/abilities/psionic.ftl diff --git a/Resources/Locale/en-US/armor/armor-examine.ftl b/Resources/Locale/en-US/armor/armor-examine.ftl index d49a1373f28..6dc511e66e5 100644 --- a/Resources/Locale/en-US/armor/armor-examine.ftl +++ b/Resources/Locale/en-US/armor/armor-examine.ftl @@ -17,3 +17,4 @@ armor-damage-type-cold = Cold armor-damage-type-poison = Poison armor-damage-type-shock = Shock armor-damage-type-structural = Structural +armor-examine-stamina = Reduces your stamina damage by [color=cyan]{$num}%[/color]. \ No newline at end of file diff --git a/Resources/Locale/en-US/bloodstream/bloodstream.ftl b/Resources/Locale/en-US/bloodstream/bloodstream.ftl index 7d8f98c3087..65e475f1ab4 100644 --- a/Resources/Locale/en-US/bloodstream/bloodstream.ftl +++ b/Resources/Locale/en-US/bloodstream/bloodstream.ftl @@ -3,3 +3,7 @@ bloodstream-component-bleeding = [color=red]{CAPITALIZE(SUBJECT($target))} {CONJ bloodstream-component-profusely-bleeding = [color=crimson]{CAPITALIZE(SUBJECT($target))} {CONJUGATE-BE($target)} profusely bleeding![/color] bloodstream-component-wounds-cauterized = You feel your wounds painfully close! + +bloodstream-component-selfaware-looks-pale = [color=bisque]You feel dizzy from blood loss.[/color] +bloodstream-component-selfaware-bleeding = [color=red]You are bleeding.[/color] +bloodstream-component-selfaware-profusely-bleeding = [color=crimson]You are profusely bleeding![/color] diff --git a/Resources/Locale/en-US/botany/components/teleporting-trait-component.ftl b/Resources/Locale/en-US/botany/components/teleporting-trait-component.ftl new file mode 100644 index 00000000000..c38b8605f2b --- /dev/null +++ b/Resources/Locale/en-US/botany/components/teleporting-trait-component.ftl @@ -0,0 +1 @@ +teleporting-trait-component-slipped = You slip through bluespace! diff --git a/Resources/Locale/en-US/cartridge-loader/cartridges.ftl b/Resources/Locale/en-US/cartridge-loader/cartridges.ftl index f5cda2f2a18..cfa1b1424d2 100644 --- a/Resources/Locale/en-US/cartridge-loader/cartridges.ftl +++ b/Resources/Locale/en-US/cartridge-loader/cartridges.ftl @@ -19,3 +19,8 @@ log-probe-scan = Downloaded logs from {$device}! log-probe-label-time = Time log-probe-label-accessor = Accessed by log-probe-label-number = # + +glimmer-monitor-program-name = Glimmer Monitor +glimmer-monitor-current-glimmer = Current Glimmer: {$glimmer}Ψ +glimmer-monitor-interval = Interval +glimmer-monitor-sync = Sync diff --git a/Resources/Locale/en-US/chemistry/reagent-effects.ftl b/Resources/Locale/en-US/chemistry/reagent-effects.ftl index 537770b35a5..cb55db111d6 100644 --- a/Resources/Locale/en-US/chemistry/reagent-effects.ftl +++ b/Resources/Locale/en-US/chemistry/reagent-effects.ftl @@ -1 +1 @@ -effect-sleepy = You feel a bit sleepy. +effect-sleepy = You feel a bit sleepy. \ No newline at end of file diff --git a/Resources/Locale/en-US/customization/character-requirements.ftl b/Resources/Locale/en-US/customization/character-requirements.ftl index d0eeb8f9c85..a3f00dea872 100644 --- a/Resources/Locale/en-US/customization/character-requirements.ftl +++ b/Resources/Locale/en-US/customization/character-requirements.ftl @@ -1,3 +1,22 @@ +# Job +character-job-requirement = You must {$inverted -> + [true] not be + *[other] be +} one of these jobs: {$jobs} +character-department-requirement = You must {$inverted -> + [true] not be + *[other] be +} in one of these departments: {$departments} + +character-timer-department-insufficient = You require [color=yellow]{TOSTRING($time, "0")}[/color] more minutes of [color={$departmentColor}]{$department}[/color] department playtime +character-timer-department-too-high = You require [color=yellow]{TOSTRING($time, "0")}[/color] fewer minutes in [color={$departmentColor}]{$department}[/color] department +character-timer-overall-insufficient = You require [color=yellow]{TOSTRING($time, "0")}[/color] more minutes of playtime +character-timer-overall-too-high = You require [color=yellow]{TOSTRING($time, "0")}[/color] fewer minutes of playtime +character-timer-role-insufficient = You require [color=yellow]{TOSTRING($time, "0")}[/color] more minutes with [color={$departmentColor}]{$job}[/color] +character-timer-role-too-high = You require[color=yellow] {TOSTRING($time, "0")}[/color] fewer minutes with [color={$departmentColor}]{$job}[/color] + + +# Profile character-age-requirement = You must {$inverted -> [true] not be *[other] be @@ -23,18 +42,9 @@ character-clothing-preference-requirement = You must {$inverted -> *[other] wear } a [color=white]{$type}[/color] -character-job-requirement = You must {$inverted -> - [true] not be - *[other] be -} one of these jobs: {$jobs} -character-department-requirement = You must {$inverted -> + +# Whitelist +character-whitelist-requirement = You must {$inverted -> [true] not be *[other] be -} in one of these departments: {$departments} - -character-timer-department-insufficient = You require [color=yellow]{TOSTRING($time, "0")}[/color] more minutes of [color={$departmentColor}]{$department}[/color] department playtime -character-timer-department-too-high = You require [color=yellow]{TOSTRING($time, "0")}[/color] fewer minutes in [color={$departmentColor}]{$department}[/color] department -character-timer-overall-insufficient = You require [color=yellow]{TOSTRING($time, "0")}[/color] more minutes of playtime -character-timer-overall-too-high = You require [color=yellow]{TOSTRING($time, "0")}[/color] fewer minutes of playtime -character-timer-role-insufficient = You require [color=yellow]{TOSTRING($time, "0")}[/color] more minutes with [color={$departmentColor}]{$job}[/color] -character-timer-role-too-high = You require[color=yellow] {TOSTRING($time, "0")}[/color] fewer minutes with [color={$departmentColor}]{$job}[/color] +} whitelisted diff --git a/Resources/Locale/en-US/deltav/devices/device-network.ftl b/Resources/Locale/en-US/deltav/devices/device-network.ftl new file mode 100644 index 00000000000..644d2e240a8 --- /dev/null +++ b/Resources/Locale/en-US/deltav/devices/device-network.ftl @@ -0,0 +1,2 @@ +device-frequency-prototype-name-surveillance-camera-justice = Justice Cameras + diff --git a/Resources/Locale/en-US/deltav/headset/headset-component.ftl b/Resources/Locale/en-US/deltav/headset/headset-component.ftl index d3c3f2e7356..9801bce3ab2 100644 --- a/Resources/Locale/en-US/deltav/headset/headset-component.ftl +++ b/Resources/Locale/en-US/deltav/headset/headset-component.ftl @@ -1 +1,3 @@ +chat-radio-justice = Justice chat-radio-prison = Prison + diff --git a/Resources/Locale/en-US/deltav/job/department-desc.ftl b/Resources/Locale/en-US/deltav/job/department-desc.ftl new file mode 100644 index 00000000000..530a1b0a5ae --- /dev/null +++ b/Resources/Locale/en-US/deltav/job/department-desc.ftl @@ -0,0 +1,2 @@ +department-Justice-description = Uphold justice on the station. + diff --git a/Resources/Locale/en-US/deltav/job/department.ftl b/Resources/Locale/en-US/deltav/job/department.ftl index fc6d81e938c..2653e8f46cc 100644 --- a/Resources/Locale/en-US/deltav/job/department.ftl +++ b/Resources/Locale/en-US/deltav/job/department.ftl @@ -1,2 +1,4 @@ department-Epistemics = Epistemics department-Logistics = Logistics +department-Justice = Justice + diff --git a/Resources/Locale/en-US/deltav/job/job-description.ftl b/Resources/Locale/en-US/deltav/job/job-description.ftl index 5bc7be83118..9e99f5838e9 100644 --- a/Resources/Locale/en-US/deltav/job/job-description.ftl +++ b/Resources/Locale/en-US/deltav/job/job-description.ftl @@ -1 +1,5 @@ job-description-medical-borg = Half-human, Half-machine. Follow your laws, serve the crew, and assist the medical department. +job-description-chief-justice = Manage the justice department, act as a judge, and ensure everyone recieves fair and just treatment. +job-description-clerk = Organize trials, notarize documents, review charges, and act as a judge if needed. +job-description-prosecutor = Take statements from security and prepare cases against those accused of commiting crimes. +job-description-courier = Deliver mail and other packages from and to logistics. Avoid dogs. diff --git a/Resources/Locale/en-US/deltav/job/job-names.ftl b/Resources/Locale/en-US/deltav/job/job-names.ftl index dc7940ba983..175da8ba693 100644 --- a/Resources/Locale/en-US/deltav/job/job-names.ftl +++ b/Resources/Locale/en-US/deltav/job/job-names.ftl @@ -1 +1,6 @@ job-name-medical-borg = Medical Cyborg +job-name-chief-justice = Chief Justice +job-name-clerk = Clerk +job-name-prosecutor = Prosecutor +job-name-lawyer = Attorney +job-name-courier = Courier diff --git a/Resources/Locale/en-US/deltav/job/job-supervisors.ftl b/Resources/Locale/en-US/deltav/job/job-supervisors.ftl new file mode 100644 index 00000000000..f1c0ade32a5 --- /dev/null +++ b/Resources/Locale/en-US/deltav/job/job-supervisors.ftl @@ -0,0 +1,2 @@ +job-supervisors-cj = the chief justice + diff --git a/Resources/Locale/en-US/deltav/markings/vulpkanin.ftl b/Resources/Locale/en-US/deltav/markings/vulpkanin.ftl index 857cc711570..d23dd4d346a 100644 --- a/Resources/Locale/en-US/deltav/markings/vulpkanin.ftl +++ b/Resources/Locale/en-US/deltav/markings/vulpkanin.ftl @@ -102,14 +102,6 @@ marking-VulpTailTip-vulp = Vulpkanin tail (base) marking-VulpTailTip-vulp-tip = Vulpkanin tail (tip) marking-VulpTailTip = Vulpkanin (tip) -marking-VulpTailWag-vulp_wag = Vulpkanin tail (base) -marking-VulpTailWag-vulp_wag-fade = Vulpkanin tail (fade) -marking-VulpTailWag = Vulpkanin (wag) - -marking-VulpTailWagTip-vulp_wag = Vulpkanin tail (base) -marking-VulpTailWagTip-vulp_wag-tip = Vulpkanin tail (tip) -marking-VulpTailWagTip = Vulpkanin (wag, tip) - marking-VulpTailAlt-vulp_alt = Vulpkanin tail (base) marking-VulpTailAlt-vulp_alt-fade = Vulpkanin tail (fade) marking-VulpTailAlt = Vulpkanin (alt) @@ -130,29 +122,12 @@ marking-VulpTailFoxTip-fox = Fox tail (base) marking-VulpTailFoxTip-fox-tip = Fox tail (fade) marking-VulpTailFoxTip = Vulpkanin Fox (tip) -marking-VulpTailFoxWag-fox_wag = Fox tail (base) -marking-VulpTailFoxWag-fox_wag-fade = Fox tail (fade) -marking-VulpTailFoxWag = Vulpkanin Fox (wag) - -marking-VulpTailFoxWagTip-fox_wag = Fox tail (base) -marking-VulpTailFoxWagTip-fox_wag-tip = Fox tail (tip) -marking-VulpTailFoxWagTip = Vulpkanin Fox (wag, tip) - marking-VulpTailBushy-bushfluff = Bush tail marking-VulpTailBushy = Vulpkanin Bush -marking-VulpTailBushyWag-bushfluff_wag = Bush tail -marking-VulpTailBushyWag = Vulpkanin Bush (wag) - marking-VulpTailCoyote-coyote = Coyote tail marking-VulpTailCoyote = Vulpkanin Coyote -marking-VulpTailCoyoteWag-coyote_wag = Coyote tail -marking-VulpTailCoyoteWag = Vulpkanin Coyote (wag) - -marking-VulpTailCorgiWag-corgi_wag = Crogi tail -marking-VulpTailCorgiWag = Vulpkanin Corgi (wag) - marking-VulpTailHusky-husky-inner = Husky tail (inner) marking-VulpTailHusky-husky-outer = Husky tail (outer) marking-VulpTailHusky = Vulpkanin Husky @@ -176,8 +151,11 @@ marking-VulpTailOtie = Vulpkanin Otie marking-VulpTailFluffy-fluffy = Fluffy tail marking-VulpTailFluffy = Vulpkanin Fluffy -marking-VulpTailDalmatianWag-dalmatian_wag = Dalmatian tail -marking-VulpTailDalmatianWag = Vulpkanin Dalmatian (wag) +marking-VulpTailCorgi-corgi = Crogi tail +marking-VulpTailCorgi = Vulpkanin Corgi + +marking-VulpTailDalmatian-dalmatian = Dalmatian tail +marking-VulpTailDalmatian = Vulpkanin Dalmatian marking-VulpBellyCrest-belly_crest = Belly diff --git a/Resources/Locale/en-US/deltav/misc/pda.ftl b/Resources/Locale/en-US/deltav/misc/pda.ftl new file mode 100644 index 00000000000..a64a4e34231 --- /dev/null +++ b/Resources/Locale/en-US/deltav/misc/pda.ftl @@ -0,0 +1,4 @@ +ent-HoSPDA = head of security pda + .desc = Smells like donuts and gunpowder residue. +ent-LawyerPDA = attorney pda + .desc = For attornies to poach dubious clients. diff --git a/Resources/Locale/en-US/deltav/navmap-beacons/station-beacons.ftl b/Resources/Locale/en-US/deltav/navmap-beacons/station-beacons.ftl index 7b2d06a04e7..8d2571920ff 100644 --- a/Resources/Locale/en-US/deltav/navmap-beacons/station-beacons.ftl +++ b/Resources/Locale/en-US/deltav/navmap-beacons/station-beacons.ftl @@ -30,3 +30,7 @@ station-beacon-boxing-ring = Boxing station-beacon-park = Park station-beacon-corpsman = Corpsman + +station-beacon-justice = Justice +station-beacon-chiefjustice = Chief Justice +station-beacon-prosecutor = Prosecutor diff --git a/Resources/Locale/en-US/deltav/paper/stamp-component.ftl b/Resources/Locale/en-US/deltav/paper/stamp-component.ftl index 8c591e771f1..cfa5279baa0 100644 --- a/Resources/Locale/en-US/deltav/paper/stamp-component.ftl +++ b/Resources/Locale/en-US/deltav/paper/stamp-component.ftl @@ -1,2 +1,5 @@ stamp-component-stamped-name-lawyer = Lawyer -stamp-component-stamped-name-psychologist = Psychologist \ No newline at end of file +stamp-component-stamped-name-psychologist = Psychologist +stamp-component-stamped-name-notary = NOTARY +stamp-component-stamped-name-chiefjustice = Chief Justice + diff --git a/Resources/Locale/en-US/deltav/prototypes/access/accesses.ftl b/Resources/Locale/en-US/deltav/prototypes/access/accesses.ftl index 84245872f54..3ebfe8bf1b1 100644 --- a/Resources/Locale/en-US/deltav/prototypes/access/accesses.ftl +++ b/Resources/Locale/en-US/deltav/prototypes/access/accesses.ftl @@ -1,3 +1,6 @@ -id-card-access-level-orders = Orders -id-card-access-level-mantis = Psionic Mantis +id-card-access-level-orders = Orders +id-card-access-level-mantis = Mantis +id-card-access-level-chief-justice = Chief Justice +id-card-access-level-prosecutor = Prosecutor +id-card-access-level-justice = Justice id-card-access-level-corpsman = Corpsman diff --git a/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl b/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl index 8c6cf575d54..7b25b616b24 100644 --- a/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl +++ b/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl @@ -112,13 +112,13 @@ ui-options-header-dev = Development ui-options-header-general = General ui-options-hotkey-keymap = Use US QWERTY Keys -ui-options-hotkey-toggle-walk = Toggle Walk +ui-options-hotkey-toggle-walk = Toggle Speed ui-options-function-move-up = Move Up ui-options-function-move-left = Move Left ui-options-function-move-down = Move Down ui-options-function-move-right = Move Right -ui-options-function-walk = Walk +ui-options-function-walk = Change Speed ui-options-function-camera-rotate-left = Rotate left ui-options-function-camera-rotate-right = Rotate right diff --git a/Resources/Locale/en-US/game-ticking/game-presets/preset-survival.ftl b/Resources/Locale/en-US/game-ticking/game-presets/preset-survival.ftl index 10e6a4a24f2..0b8fa83ae8b 100644 --- a/Resources/Locale/en-US/game-ticking/game-presets/preset-survival.ftl +++ b/Resources/Locale/en-US/game-ticking/game-presets/preset-survival.ftl @@ -3,6 +3,3 @@ survival-description = No internal threats, but how long can the station survive hellshift-title = Hellshift hellshift-description = The station rolled a "one" in a luck check. Can the crew make it to the end? - -longsurvival-title = Long Survival -longsurvival-description = Survival, but two hours longer. Event growth is stretched over a vastly greater length of time. diff --git a/Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl b/Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl index 7b25eb660bc..9260db903fc 100644 --- a/Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl +++ b/Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl @@ -161,7 +161,7 @@ ghost-role-information-skeleton-biker-name = Skeleton Biker ghost-role-information-skeleton-biker-description = Ride around on your sweet ride. ghost-role-information-closet-skeleton-name = Closet Skeleton -ghost-role-information-closet-skeleton-description = Wreak havoc! You are a primordial force with no allegiance. Live happily with the crew or wage sweet skeletal war. +ghost-role-information-closet-skeleton-description = You are a closet skeleton! You are a primordial force of chaos with no allegiance! You can either join the crew and use your skeletal antics to help them, or be a a prankster, and hinder their efforts! ghost-role-information-onestar-mecha-name = Onestar Mecha ghost-role-information-onestar-mecha-description = You are an experimental mecha created by who-knows-what, all you know is that you have weapons and you detect fleshy moving targets nearby... diff --git a/Resources/Locale/en-US/guidebook/chemistry/effects.ftl b/Resources/Locale/en-US/guidebook/chemistry/effects.ftl index b6f45d23862..db2f3816f6b 100644 --- a/Resources/Locale/en-US/guidebook/chemistry/effects.ftl +++ b/Resources/Locale/en-US/guidebook/chemistry/effects.ftl @@ -344,3 +344,21 @@ reagent-effect-guidebook-missing = [1] Causes *[other] cause } an unknown effect as nobody has written this effect yet + +reagent-effect-guidebook-change-glimmer-reaction-effect = + { $chance -> + [1] Modifies + *[other] modify + } the glimmer count by {$count} points + +reagent-effect-guidebook-chem-remove-psionic = + { $chance -> + [1] Removes + *[other] remove + } psionic powers + +reagent-effect-guidebook-chem-reroll-psionic = + { $chance -> + [1] Allows + *[other] allow + } a chance to get a different psionic power \ No newline at end of file diff --git a/Resources/Locale/en-US/guidebook/guides.ftl b/Resources/Locale/en-US/guidebook/guides.ftl index 72746dbf51f..968d3b20038 100644 --- a/Resources/Locale/en-US/guidebook/guides.ftl +++ b/Resources/Locale/en-US/guidebook/guides.ftl @@ -70,3 +70,7 @@ guide-entry-space-ninja = Space Ninja guide-entry-writing = Writing guide-entry-glossary = Glossary + +guide-entry-altars-golemancy = Altars and Golemancy +guide-entry-psionics = Psionics +guide-entry-reverse-engineering = Reverse Engineering diff --git a/Resources/Locale/en-US/health-examinable/health-examinable-selfaware.ftl b/Resources/Locale/en-US/health-examinable/health-examinable-selfaware.ftl new file mode 100644 index 00000000000..897c3f718de --- /dev/null +++ b/Resources/Locale/en-US/health-examinable/health-examinable-selfaware.ftl @@ -0,0 +1,22 @@ +health-examinable-selfaware-none = You feel healthy and well. + +health-examinable-selfaware-type-text = You have {$damageType}, around [bold]{$amount}[/bold]. + +health-examinable-selfaware-type-Blunt = [color=red]Blunt[/color] trauma +health-examinable-selfaware-type-Slash = [color=red]Slash[/color] wounds +health-examinable-selfaware-type-Piercing = [color=red]Piercing[/color] wounds + +health-examinable-selfaware-type-Heat = [color=orange]Heat[/color] burns +health-examinable-selfaware-type-Shock = [color=lightgoldenrodyellow]Shock[/color] burns +health-examinable-selfaware-type-Cold = [color=lightblue]Cold[/color] burns +health-examinable-selfaware-type-Caustic = [color=yellowgreen]Caustic[/color] burns + +health-examinable-selfaware-group-Toxin-10 = [color=green]You feel sick.[/color] +health-examinable-selfaware-group-Toxin-25 = [color=green]You feel nauseated.[/color] +health-examinable-selfaware-group-Toxin-40 = [color=green]You feel very unwell![/color] +health-examinable-selfaware-group-Toxin-60 = [color=green]You feel gravely ill![/color] + +health-examinable-selfaware-group-Airloss-10 = [color=lightblue]You feel lightheaded.[/color] +health-examinable-selfaware-group-Airloss-25 = [color=lightblue]You feel faint and woozy.[/color] +health-examinable-selfaware-group-Airloss-40 = [color=lightblue]You're struggling to breathe![/color] +health-examinable-selfaware-group-Airloss-60 = [color=lightblue]You're suffocating badly![/color] diff --git a/Resources/Locale/en-US/job/job-names.ftl b/Resources/Locale/en-US/job/job-names.ftl index bcfdc9205de..19d2db94518 100644 --- a/Resources/Locale/en-US/job/job-names.ftl +++ b/Resources/Locale/en-US/job/job-names.ftl @@ -24,7 +24,8 @@ job-name-centcomoff = CentCom Official job-name-reporter = Reporter job-name-musician = Musician job-name-librarian = Librarian -job-name-lawyer = Lawyer +# DeltaV - Changed Lawyer to Attorney +# job-name-lawyer = Lawyer job-name-mime = Mime job-name-ce = Chief Engineer job-name-janitor = Janitor diff --git a/Resources/Locale/en-US/language/commands.ftl b/Resources/Locale/en-US/language/commands.ftl index ba2b3160094..65959e3f28f 100644 --- a/Resources/Locale/en-US/language/commands.ftl +++ b/Resources/Locale/en-US/language/commands.ftl @@ -14,3 +14,21 @@ command-language-entry = {$id}. {$language} - {$name} command-language-invalid-number = The language number must be between 0 and {$total}. Alternatively, use the language name. command-language-invalid-language = The language {$id} does not exist or you cannot speak it. + +# toolshed + +command-description-language-add = Adds a new language to the piped entity. The two last arguments indicate whether it should be spoken/understood. Example: 'self language:add "Canilunzt" true true' +command-description-language-rm = Removes a language from the piped entity. Works similarly to language:add. Example: 'self language:rm "GalacticCommon" true true'. +command-description-language-lsspoken = Lists all languages the entity can speak. Example: 'self language:lsspoken' +command-description-language-lsunderstood = Lists all languages the entity can understand. Example: 'self language:lssunderstood' + +command-description-translator-addlang = Adds a new target language to the piped translator entity. See language:add for details. +command-description-translator-rmlang = Removes a target language from the piped translator entity. See language:rm for details. +command-description-translator-addrequired = Adds a new required language to the piped translator entity. Example: 'ent 1234 translator:addrequired "GalacticCommon"' +command-description-translator-rmrequired = Removes a required language from the piped translator entity. Example: 'ent 1234 translator:rmrequired "GalacticCommon"' +command-description-translator-lsspoken = Lists all spoken languages for the piped translator entity. Example: 'ent 1234 translator:lsspoken' +command-description-translator-lsunderstood = Lists all understood languages for the piped translator entity. Example: 'ent 1234 translator:lssunderstood' +command-description-translator-lsrequired = Lists all required languages for the piped translator entity. Example: 'ent 1234 translator:lsrequired' + +command-language-error-this-will-not-work = This will not work. +command-language-error-not-a-translator = Entity {$entity} is not a translator. diff --git a/Resources/Locale/en-US/language/languages.ftl b/Resources/Locale/en-US/language/languages.ftl index 56dbe04f462..4b0c1248f28 100644 --- a/Resources/Locale/en-US/language/languages.ftl +++ b/Resources/Locale/en-US/language/languages.ftl @@ -28,6 +28,9 @@ language-Moffic-description = The language of the mothpeople borders on complete language-RobotTalk-name = RobotTalk language-RobotTalk-description = A language consisting of harsh binary chirps, whistles, hisses, and whines. Organic tongues cannot speak it without aid from special translators. +language-Sign-name = Galactic Sign Language +language-Sign-description = GSL for short, this sign language is prevalent among mute and deaf people. + language-Cat-name = Cat language-Cat-description = Meow @@ -70,5 +73,5 @@ language-Crab-description = Click! language-Kobold-name = Kobold language-Kobold-description = Hiss! -language-Sign-name = Sign Language -language-Sign-description = The standard Galactic sign language, used by those that are unable to speak Galactic Common or at all. +language-Hissing-name = Hissing +language-Hissing-description = Hiss! diff --git a/Resources/Locale/en-US/loadouts/items.ftl b/Resources/Locale/en-US/loadouts/items.ftl index b92f56bc7cb..c2ec9a1c847 100644 --- a/Resources/Locale/en-US/loadouts/items.ftl +++ b/Resources/Locale/en-US/loadouts/items.ftl @@ -13,3 +13,25 @@ loadout-description-LoadoutItemPlushieSharkGrey = Introducing the Grey Shark Plu loadout-description-LoadoutItemPlushieCarp = Brace for extraterrestrial antics with the Purple Space Carp Plushie! A fishy invader from the cosmic deep, this plushie brings a splash of humor to zero-gravity escapades. From hostile waters to interstellar giggles, it's a cuddly contradiction that's out of this world loadout-description-LoadoutSolCommonTranslator = The most common of all translators, such that it can be purchased in any civilized station. This device translates Sol Common speech into Galactic Common. +loadout-name-LoadoutItemPapers = papers (x4) +loadout-description-LoadoutItemPapers = four pieces of paper, good for filling out tedious paperwork and silent communication. +loadout-description-LoadoutItemBoxFolderGrey = A folder to store papers and top secret documents. +loadout-description-LoadoutBookRandom = A notebook with a random cover. Can be used as a diary, or for writing fanfiction drafts for SpacePad. +loadout-description-LoadoutPen = An extra pen, just in case your pen from your PDA gets robbed by skeletal space pirates. +loadout-description-LoadoutItemLunchboxGenericFilledRandom = Packed with love. + This is only useful when the chefs are either a.) nonexistent or b.) not doing their job. + In conclusion, this lunchbox is useful most of the time. +loadout-description-LoadoutHandLabeler = A hand labeler, used to label items and objects. + It's not really recommended to use this to label a fuel tank with "SOLUTION TO CLOWN PROBLEM". +loadout-description-LoadoutEmergencyMedipen = A rapid and safe way to stabilize patients in critical condition for personnel without advanced medical knowledge. + WARNING: injecting two emergency medipens at once will cause an epinephrine overdose. +loadout-description-LoadoutSpaceMedipen = Contains a mix of chemicals that protect you from the deadly effects of space. + Also known as the "poor man's hardsuit". + WARNING: injecting two space medipens at once will cause a barozine overdose. + +loadout-name-LoadoutItemBoxSurvival = survival box (standard) +loadout-name-LoadoutItemBoxSurvivalEngineering = extended-capacity survival box (engineering) +loadout-name-LoadoutItemBoxSurvivalSecurity = survival box (security) +loadout-name-LoadoutItemBoxSurvivalBrigmedic = survival box (corpsman) +loadout-name-LoadoutItemBoxSurvivalMedical = survival box (medical) +loadout-name-LoadoutItemBoxHug = box of hugs (clown) diff --git a/Resources/Locale/en-US/markings/harpy.ftl b/Resources/Locale/en-US/markings/harpy.ftl index 6d6ba75a936..724207c3ef8 100644 --- a/Resources/Locale/en-US/markings/harpy.ftl +++ b/Resources/Locale/en-US/markings/harpy.ftl @@ -40,6 +40,14 @@ marking-HarpyWingTipsClassic = Classic Wings with Feather Tips marking-HarpyWingTipsClassic-harpy_wingtip_1 = Main marking-HarpyWingTipsClassic-harpy_wingtip_2 = Feathertips +marking-HarpyWingBat = Bat Wings (Whitescale) +marking-HarpyWingBat-bat_wings_tone_1 = Limbs +marking-HarpyWingBat-bat_wings_tone_2 = Membrane + +marking-HarpyWingBionic = Simple Bionic Wings (Whitescale) +marking-HarpyWingBionic-bionic_wings_tone_1 = Wings +marking-HarpyWingBionic-bionic_wings_tone_2 = Lights (Unshaded) + marking-HarpyEarsDefault = Feather Tufts marking-HarpyEarsDefault-harpy_ears_default = Tufts @@ -65,6 +73,16 @@ marking-HarpyTailPeacock = Peacock Tail marking-HarpyTailPeacock-peacock_tail_feathers = Feathers marking-HarpyTailPeacock-peacock_tail_eyes = Eyes +marking-HarpyTailHaven = Haven Tail (Whitescale) +marking-HarpyTailHaven-haven_tone_1 = Outer Feathers +marking-HarpyTailHaven-haven_tone_2 = Inner Feathers + +marking-HarpyTailForkedLong = Long Forked Tail (Whitescale) +marking-HarpyTailForkedLong-forked_long = Tail + +marking-HarpyTailSwallow = Swallow Tail (Whitescale) +marking-HarpyTailForkedLong-forked_long = Tail + marking-HarpyChestDefault = Wing & Groin Under-Clothes marking-HarpyChestDefault-upper = Wing Under-Clothes marking-HarpyChestDefault-lower = Groin Under-Clothes diff --git a/Resources/Locale/en-US/markings/makeup.ftl b/Resources/Locale/en-US/markings/makeup.ftl new file mode 100644 index 00000000000..24ca3a10b7d --- /dev/null +++ b/Resources/Locale/en-US/markings/makeup.ftl @@ -0,0 +1,17 @@ +marking-MakeupLips-lips = Lips +marking-MakeupLips = Lips + +marking-MakeupBlush-blush = Blush +marking-MakeupBlush = Blush + +marking-MakeupNailPolishLeft-nail_polish_l = Nail Polish (Left) +marking-MakeupNailPolishLeft = Nail Polish (Left) + +marking-MakeupNailPolishRight-nail_polish_r = Nail Polish (Right) +marking-MakeupNailPolishRight = Nail Polish (Right) + +marking-MakeupMothBlush-moth_blush = Moth Blush +marking-MakeupMothBlush = Moth Blush + +marking-MakeupMothLips-moth_lips = Moth Lipstick +marking-MakeupMothLips = Moth Lipstick diff --git a/Resources/Locale/en-US/medical/components/cpr-training-component.ftl b/Resources/Locale/en-US/medical/components/cpr-training-component.ftl new file mode 100644 index 00000000000..7ed824a369f --- /dev/null +++ b/Resources/Locale/en-US/medical/components/cpr-training-component.ftl @@ -0,0 +1,6 @@ +cpr-start-second-person = You start performing CPR on {CAPITALIZE($target)}. +cpr-start-second-person-patient = {CAPITALIZE(THE($user))} starts performing CPR on you. +cpr-must-remove = You must remove {THE($clothing)} from the patient. +cpr-must-remove-own-mask = You must remove your {THE($clothing)}. +cpr-target-rotting = {CAPITALIZE($entity)} is too far gone... +cpr-verb = Perform CPR diff --git a/Resources/Locale/en-US/medical/components/penlight.ftl b/Resources/Locale/en-US/medical/components/penlight.ftl new file mode 100644 index 00000000000..f0639ad7381 --- /dev/null +++ b/Resources/Locale/en-US/medical/components/penlight.ftl @@ -0,0 +1,11 @@ +penlight-off = The pen light is off. +pen-light-exam-title = Pen Light +pen-light-window-entity-eyes-text = {$entityName}'s conditions: +pen-light-window-no-patient-data-text = No patient data. +pen-light-window-entity-unknown-text = unknown + +pen-light-exam-blind-text = The patient's eyes are glassy and unfocused. They can't follow the light at all. +pen-light-exam-drunk-text = The patient's eyes are slow to follow the light, droopy. +pen-light-exam-eyedamage-text = The patient's eyes are partially focused, though they struggle to look at the light for too long. +pen-light-exam-hallucinating-text = The patient's eyes are wandering around, with dilated pupils. They don't focus on the light. +pen-light-exam-healthy-text = The patient follows the light perfectly with no stuttering. \ No newline at end of file diff --git a/Resources/Locale/en-US/nyanotrasen/cartridge-loader/cartridges.ftl b/Resources/Locale/en-US/nyanotrasen/cartridge-loader/cartridges.ftl deleted file mode 100644 index 906466bc10f..00000000000 --- a/Resources/Locale/en-US/nyanotrasen/cartridge-loader/cartridges.ftl +++ /dev/null @@ -1,4 +0,0 @@ -glimmer-monitor-program-name = Glimmer Monitor -glimmer-monitor-current-glimmer = Current Glimmer: {$glimmer}Ψ -glimmer-monitor-interval = Interval -glimmer-monitor-sync = Sync diff --git a/Resources/Locale/en-US/nyanotrasen/chemistry/effects.ftl b/Resources/Locale/en-US/nyanotrasen/chemistry/effects.ftl index 19aeebee69e..8d0c96f13c5 100644 --- a/Resources/Locale/en-US/nyanotrasen/chemistry/effects.ftl +++ b/Resources/Locale/en-US/nyanotrasen/chemistry/effects.ftl @@ -1,21 +1,3 @@ -reagent-effect-guidebook-change-glimmer-reaction-effect = - { $chance -> - [1] Modifies - *[other] modify - } the glimmer count by {$count} points - -reagent-effect-guidebook-chem-remove-psionic = - { $chance -> - [1] Removes - *[other] remove - } psionic powers - -reagent-effect-guidebook-chem-reroll-psionic = - { $chance -> - [1] Allows - *[other] allow - } a chance to get a different psionic power - ## Disease System support reagent-effect-guidebook-chem-miasma-pool = diff --git a/Resources/Locale/en-US/nyanotrasen/guidebook/guides.ftl b/Resources/Locale/en-US/nyanotrasen/guidebook/guides.ftl deleted file mode 100644 index 60166b82598..00000000000 --- a/Resources/Locale/en-US/nyanotrasen/guidebook/guides.ftl +++ /dev/null @@ -1,3 +0,0 @@ -guide-entry-altars-golemancy = Altars and Golemancy -guide-entry-psionics = Psionics -guide-entry-reverse-engineering = Reverse Engineering diff --git a/Resources/Locale/en-US/nyanotrasen/job/job-names.ftl b/Resources/Locale/en-US/nyanotrasen/job/job-names.ftl index bc99a777f1a..8660d214615 100644 --- a/Resources/Locale/en-US/nyanotrasen/job/job-names.ftl +++ b/Resources/Locale/en-US/nyanotrasen/job/job-names.ftl @@ -3,8 +3,8 @@ job-name-guard = Prison Guard job-name-mail-carrier = Courier job-name-martialartist = Martial Artist job-name-prisoner = Prisoner -job-name-mantis = Psionic Mantis +job-name-mantis = Mantis # Role timers JobMailCarrier = Courier -JobForensicMantis = Psionic Mantis +JobForensicMantis = Mantis diff --git a/Resources/Locale/en-US/nyanotrasen/paper/stamp-component.ftl b/Resources/Locale/en-US/nyanotrasen/paper/stamp-component.ftl deleted file mode 100644 index 0434e6d26ac..00000000000 --- a/Resources/Locale/en-US/nyanotrasen/paper/stamp-component.ftl +++ /dev/null @@ -1 +0,0 @@ -stamp-component-stamped-name-mantis = Psionic Mantis diff --git a/Resources/Locale/en-US/nyanotrasen/reagents/toxins.ftl b/Resources/Locale/en-US/nyanotrasen/reagents/toxins.ftl deleted file mode 100644 index 43e35c191c9..00000000000 --- a/Resources/Locale/en-US/nyanotrasen/reagents/toxins.ftl +++ /dev/null @@ -1,8 +0,0 @@ -reagent-name-soulbreaker-toxin = soulbreaker toxin -reagent-desc-soulbreaker-toxin = An anti-psionic about 4 times as powerful as mindbreaker toxin. - -reagent-name-lotophagoi-oil = lotophagoi oil -reagent-desc-lotophagoi-oil = A super potent drug that is much better at inducing psionics than normal hallucinogens, but with worse side effects. - -reagent-name-ectoplasm = ectoplasm -reagent-desc-ectoplasm = The physical component of semi-corporeal spirits. diff --git a/Resources/Locale/en-US/nyanotrasen/xenoarchaeology/artifact-hints.ftl b/Resources/Locale/en-US/nyanotrasen/xenoarchaeology/artifact-hints.ftl deleted file mode 100644 index e07aa0a0322..00000000000 --- a/Resources/Locale/en-US/nyanotrasen/xenoarchaeology/artifact-hints.ftl +++ /dev/null @@ -1 +0,0 @@ -artifact-effect-hint-psionic = Noöspheric disturbance diff --git a/Resources/Locale/en-US/objectives/conditions/steal.ftl b/Resources/Locale/en-US/objectives/conditions/steal.ftl index 00c8e0fdaf9..0709bf6e5e6 100644 --- a/Resources/Locale/en-US/objectives/conditions/steal.ftl +++ b/Resources/Locale/en-US/objectives/conditions/steal.ftl @@ -9,3 +9,6 @@ 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-steal-smsliver-title = Cut off a sliver from the supermatter crystal. +objective-condition-steal-smsliver-description = Use any cutting tool that comes in handy. A scalpel is more recommended. Also, don't die of radiation poisoning. diff --git a/Resources/Locale/en-US/nyanotrasen/paper/book-epistemics.ftl b/Resources/Locale/en-US/psionics/book-epistemics.ftl similarity index 100% rename from Resources/Locale/en-US/nyanotrasen/paper/book-epistemics.ftl rename to Resources/Locale/en-US/psionics/book-epistemics.ftl diff --git a/Resources/Locale/en-US/nyanotrasen/prototypes/catalog/cargo/cargo-epistemics.ftl b/Resources/Locale/en-US/psionics/cargo-epistemics.ftl similarity index 100% rename from Resources/Locale/en-US/nyanotrasen/prototypes/catalog/cargo/cargo-epistemics.ftl rename to Resources/Locale/en-US/psionics/cargo-epistemics.ftl diff --git a/Resources/Locale/en-US/nyanotrasen/psionics/death-gasp.ftl b/Resources/Locale/en-US/psionics/death-gasp.ftl similarity index 100% rename from Resources/Locale/en-US/nyanotrasen/psionics/death-gasp.ftl rename to Resources/Locale/en-US/psionics/death-gasp.ftl diff --git a/Resources/Locale/en-US/nyanotrasen/prototypes/catalog/fills/crates/epistemics-crates.ftl b/Resources/Locale/en-US/psionics/epistemics-crates.ftl similarity index 100% rename from Resources/Locale/en-US/nyanotrasen/prototypes/catalog/fills/crates/epistemics-crates.ftl rename to Resources/Locale/en-US/psionics/epistemics-crates.ftl diff --git a/Resources/Locale/en-US/nyanotrasen/station-events/events/noospheric-storm.ftl b/Resources/Locale/en-US/psionics/noospheric-storm.ftl similarity index 100% rename from Resources/Locale/en-US/nyanotrasen/station-events/events/noospheric-storm.ftl rename to Resources/Locale/en-US/psionics/noospheric-storm.ftl diff --git a/Resources/Locale/en-US/nyanotrasen/objectives/conditions/conditions.ftl b/Resources/Locale/en-US/psionics/objectives.ftl similarity index 100% rename from Resources/Locale/en-US/nyanotrasen/objectives/conditions/conditions.ftl rename to Resources/Locale/en-US/psionics/objectives.ftl diff --git a/Resources/Locale/en-US/nyanotrasen/research/oracle.ftl b/Resources/Locale/en-US/psionics/oracle.ftl similarity index 100% rename from Resources/Locale/en-US/nyanotrasen/research/oracle.ftl rename to Resources/Locale/en-US/psionics/oracle.ftl diff --git a/Resources/Locale/en-US/nyanotrasen/psionics/psionic-chat.ftl b/Resources/Locale/en-US/psionics/psionic-chat.ftl similarity index 100% rename from Resources/Locale/en-US/nyanotrasen/psionics/psionic-chat.ftl rename to Resources/Locale/en-US/psionics/psionic-chat.ftl diff --git a/Resources/Locale/en-US/nyanotrasen/psionics/psionic-commands.ftl b/Resources/Locale/en-US/psionics/psionic-commands.ftl similarity index 100% rename from Resources/Locale/en-US/nyanotrasen/psionics/psionic-commands.ftl rename to Resources/Locale/en-US/psionics/psionic-commands.ftl diff --git a/Resources/Locale/en-US/psionics/stamp-component.ftl b/Resources/Locale/en-US/psionics/stamp-component.ftl new file mode 100644 index 00000000000..381278f8cf9 --- /dev/null +++ b/Resources/Locale/en-US/psionics/stamp-component.ftl @@ -0,0 +1 @@ +stamp-component-stamped-name-mantis = Mantis diff --git a/Resources/Locale/en-US/nyanotrasen/research/technologies.ftl b/Resources/Locale/en-US/psionics/technologies.ftl similarity index 100% rename from Resources/Locale/en-US/nyanotrasen/research/technologies.ftl rename to Resources/Locale/en-US/psionics/technologies.ftl diff --git a/Resources/Locale/en-US/reagents/meta/physical-desc.ftl b/Resources/Locale/en-US/reagents/meta/physical-desc.ftl index 50ea5f590c7..064b21eaa9c 100644 --- a/Resources/Locale/en-US/reagents/meta/physical-desc.ftl +++ b/Resources/Locale/en-US/reagents/meta/physical-desc.ftl @@ -1,101 +1,101 @@ -reagent-physical-desc-skunky = skunky -reagent-physical-desc-soapy = soapy -reagent-physical-desc-ferrous = ferrous -reagent-physical-desc-nothing = nothing +reagent-physical-desc-abrasive = abrasive +reagent-physical-desc-acidic = acidic reagent-physical-desc-acrid = acrid -reagent-physical-desc-thick-and-grainy = thick and grainy -reagent-physical-desc-necrotic = necrotic -reagent-physical-desc-oily = oily -reagent-physical-desc-glowing = glowing -reagent-physical-desc-heterogeneous = heterogeneous -reagent-physical-desc-mucus-like = mucus-like -reagent-physical-desc-cold = cold +reagent-physical-desc-alkaline = alkaline +reagent-physical-desc-aromatic = aromatic reagent-physical-desc-bee-guts = bee guts -reagent-physical-desc-tangy = tangy -reagent-physical-desc-fizzy = fizzy -reagent-physical-desc-fuzzy = fuzzy -reagent-physical-desc-spicy = spicy -reagent-physical-desc-abrasive = abrasive -reagent-physical-desc-chalky = chalky -reagent-physical-desc-roaring = roaring -reagent-physical-desc-robust = robust -reagent-physical-desc-sickly = sickly -reagent-physical-desc-murky = murky -reagent-physical-desc-bubbling = bubbling -reagent-physical-desc-wormy = wormy -reagent-physical-desc-frosty = frosty reagent-physical-desc-blazing = blazing -reagent-physical-desc-translucent = translucent -reagent-physical-desc-sugary = sugary -reagent-physical-desc-putrid = putrid -reagent-physical-desc-saucey = saucey -reagent-physical-desc-salty = salty -reagent-physical-desc-milky = milky -reagent-physical-desc-refreshing = refreshing -reagent-physical-desc-soothing = soothing -reagent-physical-desc-starchy = starchy -reagent-physical-desc-starry = starry -reagent-physical-desc-tart = tart -reagent-physical-desc-aromatic = aromatic -reagent-physical-desc-thick = thick -reagent-physical-desc-syrupy = syrupy -reagent-physical-desc-grainy = grainy -reagent-physical-desc-foamy = foamy -reagent-physical-desc-tropical = tropical +reagent-physical-desc-bubbling = bubbling +reagent-physical-desc-bubbly = bubbly +reagent-physical-desc-burning = burning +reagent-physical-desc-buzzy = buzzy +reagent-physical-desc-chalky = chalky +reagent-physical-desc-chewy = chewy +reagent-physical-desc-citric = citric +reagent-physical-desc-cloudy = cloudy +reagent-physical-desc-clumpy = clumpy reagent-physical-desc-coarse = coarse -reagent-physical-desc-opaque = opaque -reagent-physical-desc-pulpy = pulpy -reagent-physical-desc-reasonably-metallic = reasonably metallic -reagent-physical-desc-metallic = metallic -reagent-physical-desc-gaseous = gaseous -reagent-physical-desc-ground-brass = ground brass -reagent-physical-desc-dark-brown = dark brown +reagent-physical-desc-cold = cold +reagent-physical-desc-creamy = creamy +reagent-physical-desc-crisp = crisp reagent-physical-desc-crystalline = crystalline -reagent-physical-desc-viscous = viscous -reagent-physical-desc-shiny = shiny +reagent-physical-desc-dark-brown = dark brown reagent-physical-desc-dark-red = dark-red +reagent-physical-desc-electric = electric +reagent-physical-desc-energizing = energizing +reagent-physical-desc-enigmatic = enigmatic +reagent-physical-desc-ethereal = ethereal +reagent-physical-desc-exhilarating = exhilarating +reagent-physical-desc-exotic-smelling = exotic smelling +reagent-physical-desc-ferrous = ferrous +reagent-physical-desc-fibrous = fibrous +reagent-physical-desc-fizzy = fizzy +reagent-physical-desc-fizzy-and-creamy = fizzy and creamy +reagent-physical-desc-fluffy = fluffy +reagent-physical-desc-foamy = foamy +reagent-physical-desc-frosty = frosty +reagent-physical-desc-funny = funny +reagent-physical-desc-fuzzy = fuzzy +reagent-physical-desc-gaseous = gaseous +reagent-physical-desc-glittery = glittery +reagent-physical-desc-gloopy = gloopy +reagent-physical-desc-glowing = glowing +reagent-physical-desc-grainy = grainy +reagent-physical-desc-ground-brass = ground brass +reagent-physical-desc-heterogeneous = heterogeneous +reagent-physical-desc-holy = holy +reagent-physical-desc-inky = inky reagent-physical-desc-ionizing = ionizing +reagent-physical-desc-lemony-fresh = lemony fresh +reagent-physical-desc-metallic = metallic +reagent-physical-desc-milky = milky +reagent-physical-desc-mucus-like = mucus-like +reagent-physical-desc-murky = murky +reagent-physical-desc-necrotic = necrotic +reagent-physical-desc-neural = neural reagent-physical-desc-nondescript = nondescript -reagent-physical-desc-burning = burning +reagent-physical-desc-nothing = nothing +reagent-physical-desc-odorless = odorless +reagent-physical-desc-oily = oily +reagent-physical-desc-opaque = opaque +reagent-physical-desc-overpowering = overpowering reagent-physical-desc-porous = porous reagent-physical-desc-powdery = powdery -reagent-physical-desc-creamy = creamy -reagent-physical-desc-sticky = sticky -reagent-physical-desc-bubbly = bubbly +reagent-physical-desc-pulpy = pulpy +reagent-physical-desc-pungent = pungent +reagent-physical-desc-putrid = putrid +reagent-physical-desc-reasonably-metallic = reasonably metallic +reagent-physical-desc-reflective = reflective +reagent-physical-desc-refreshing = refreshing +reagent-physical-desc-roaring = roaring +reagent-physical-desc-robust = robust reagent-physical-desc-rocky = rocky -reagent-physical-desc-lemony-fresh = lemony fresh +reagent-physical-desc-salty = salty +reagent-physical-desc-saucey = saucey +reagent-physical-desc-shiny = shiny +reagent-physical-desc-sickly = sickly +reagent-physical-desc-skunky = skunky +reagent-physical-desc-slimy = slimy reagent-physical-desc-soapy = soapy -reagent-physical-desc-crisp = crisp -reagent-physical-desc-citric = citric -reagent-physical-desc-acidic = acidic -reagent-physical-desc-buzzy = buzzy -reagent-physical-desc-fibrous = fibrous -reagent-physical-desc-strong-smelling = strong smelling -reagent-physical-desc-fizzy-and-creamy = fizzy and creamy -reagent-physical-desc-overpowering = overpowering +reagent-physical-desc-soapy = soapy +reagent-physical-desc-soothing = soothing reagent-physical-desc-sour = sour -reagent-physical-desc-pungent = pungent -reagent-physical-desc-clumpy = clumpy +reagent-physical-desc-spicy = spicy +reagent-physical-desc-starchy = starchy +reagent-physical-desc-starry = starry +reagent-physical-desc-sticky = sticky +reagent-physical-desc-strong-smelling = strong smelling reagent-physical-desc-strong-smelling = strong-smelling -reagent-physical-desc-odorless = odorless -reagent-physical-desc-gloopy = gloopy -reagent-physical-desc-cloudy = cloudy +reagent-physical-desc-sugary = sugary reagent-physical-desc-sweet = sweet -reagent-physical-desc-electric = electric -reagent-physical-desc-chewy = chewy -reagent-physical-desc-volatile = volatile -reagent-physical-desc-inky = inky -reagent-physical-desc-enigmatic = enigmatic -reagent-physical-desc-exotic-smelling = exotic smelling -reagent-physical-desc-ethereal = ethereal -reagent-physical-desc-glittery = glittery -reagent-physical-desc-energizing = energizing -reagent-physical-desc-exhilarating = exhilarating +reagent-physical-desc-syrupy = syrupy +reagent-physical-desc-tangy = tangy +reagent-physical-desc-tart = tart +reagent-physical-desc-thick = thick +reagent-physical-desc-thick-and-grainy = thick and grainy +reagent-physical-desc-translucent = translucent +reagent-physical-desc-tropical = tropical reagent-physical-desc-vibrant = vibrant -reagent-physical-desc-fluffy = fluffy -reagent-physical-desc-funny = funny -reagent-physical-desc-alkaline = alkaline -reagent-physical-desc-reflective = reflective -reagent-physical-desc-holy = holy -reagent-physical-desc-slimy = slimy -reagent-physical-desc-neural = neural +reagent-physical-desc-viscous = viscous +reagent-physical-desc-volatile = volatile +reagent-physical-desc-wormy = wormy diff --git a/Resources/Locale/en-US/reagents/meta/toxins.ftl b/Resources/Locale/en-US/reagents/meta/toxins.ftl index eb8422e66cf..fa2a813d1d6 100644 --- a/Resources/Locale/en-US/reagents/meta/toxins.ftl +++ b/Resources/Locale/en-US/reagents/meta/toxins.ftl @@ -75,3 +75,12 @@ reagent-desc-vestine = Has an adverse reaction within the body causing major jit reagent-name-tazinide = tazinide reagent-desc-tazinide = A highly dangerous metallic mixture which can interfere with most movement through an electrifying current. + +reagent-name-soulbreaker-toxin = soulbreaker toxin +reagent-desc-soulbreaker-toxin = An anti-psionic about 4 times as powerful as mindbreaker toxin. + +reagent-name-lotophagoi-oil = lotophagoi oil +reagent-desc-lotophagoi-oil = A super potent drug that is much better at inducing psionics than normal hallucinogens, but with worse side effects. + +reagent-name-ectoplasm = ectoplasm +reagent-desc-ectoplasm = The physical component of semi-corporeal spirits. diff --git a/Resources/Locale/en-US/nyanotrasen/reagents/psionic.ftl b/Resources/Locale/en-US/reagents/psionic.ftl similarity index 100% rename from Resources/Locale/en-US/nyanotrasen/reagents/psionic.ftl rename to Resources/Locale/en-US/reagents/psionic.ftl diff --git a/Resources/Locale/en-US/research/technologies.ftl b/Resources/Locale/en-US/research/technologies.ftl index a68f9e80b4e..96cb2039116 100644 --- a/Resources/Locale/en-US/research/technologies.ftl +++ b/Resources/Locale/en-US/research/technologies.ftl @@ -16,6 +16,7 @@ research-technology-shuttlecraft = Shuttlecraft research-technology-ripley-aplu = Ripley APLU research-technology-advanced-atmospherics = Advanced Atmospherics research-technology-advanced-tools = Advanced Tools +research-technology-mechanized-salvaging = Mechanized Salvaging research-technology-super-powercells = Super Powercells research-technology-bluespace-storage = Bluespace Storage research-technology-portable-fission = Portable Fission diff --git a/Resources/Locale/en-US/silicons/cyberlimbs.ftl b/Resources/Locale/en-US/silicons/cyberlimbs.ftl new file mode 100644 index 00000000000..b7686b0a2dc --- /dev/null +++ b/Resources/Locale/en-US/silicons/cyberlimbs.ftl @@ -0,0 +1,77 @@ +marking-MobIPCHeadDefault = Standard Operational Monitor +marking-MobIPCTorsoDefault = Standard Robotic Chassis +marking-MobIPCTorsoFemaleDefault = Standard Robotic Chassis +marking-MobIPCLArmDefault = Standard Left Robotic Arm +marking-MobIPCLHandDefault = Standard Left Robotic Hand +marking-MobIPCLLegDefault = Standard Left Robotic Leg +marking-MobIPCLFootDefault = Standard Left Robotic Foot +marking-MobIPCRArmDefault = Standard Right Robotic Arm +marking-MobIPCRHandDefault = Standard Right Robotic Hand +marking-MobIPCRLegDefault = Standard Right Robotic Leg +marking-MobIPCRFootDefault = Standard Right Robotic Foot + +marking-CyberLimbsMarkingBishopHead = Operational Monitor from Bishop Cybernetics +marking-CyberLimbsMarkingBishopChest = Robotic Chassis from Bishop Cybernetics +marking-CyberLimbsMarkingBishopLArm = Left Robotic Arm from Bishop Cybernetics +marking-CyberLimbsMarkingBishopLHand = Left Robotic Hand from Bishop Cybernetics +marking-CyberLimbsMarkingBishopLLeg = Left Robotic Leg from Bishop Cybernetics +marking-CyberLimbsMarkingBishopLFoot = Left Robotic Foot from Bishop Cybernetics +marking-CyberLimbsMarkingBishopRArm = Right Robotic Arm from Bishop Cybernetics +marking-CyberLimbsMarkingBishopRHand = Right Robotic Hand from Bishop Cybernetics +marking-CyberLimbsMarkingBishopRLeg = Right Robotic Leg from Bishop Cybernetics +marking-CyberLimbsMarkingBishopRFoot = Right Robotic Foot from Bishop Cybernetics + +marking-CyberLimbsMarkingHesphiastosHead = Operational Monitor from Hesphiastos Industries +marking-CyberLimbsMarkingHesphiastosChest = Robotic Chassis from Hesphiastos Industries +marking-CyberLimbsMarkingHesphiastosLArm = Left Robotic Arm from Hesphiastos Industries +marking-CyberLimbsMarkingHesphiastosLHand = Left Robotic Hand from Hesphiastos Industries +marking-CyberLimbsMarkingHesphiastosLLeg = Left Robotic Leg from Hesphiastos Industries +marking-CyberLimbsMarkingHesphiastosLFoot = Left Robotic Foot from Hesphiastos Industries +marking-CyberLimbsMarkingHesphiastosRArm = Right Robotic Arm from Hesphiastos Industries +marking-CyberLimbsMarkingHesphiastosRHand = Right Robotic Hand from Hesphiastos Industries +marking-CyberLimbsMarkingHesphiastosRLeg = Right Robotic Leg from Hesphiastos Industries +marking-CyberLimbsMarkingHesphiastosRFoot = Right Robotic Foot from Hesphiastos Industries + +marking-CyberLimbsMarkingWardtakahashiHead = Operational Monitor from Ward-Takahashi +marking-CyberLimbsMarkingWardtakahashiChest = Robotic Chassis from Ward-Takahashi +marking-CyberLimbsMarkingWardtakahashiLArm = Left Robotic Arm from Ward-Takahashi +marking-CyberLimbsMarkingWardtakahashiLHand = Left Robotic Hand from Ward-Takahashi +marking-CyberLimbsMarkingWardtakahashiLLeg = Left Robotic Leg from Ward-Takahashi +marking-CyberLimbsMarkingWardtakahashiLFoot = Left Robotic Foot from Ward-Takahashi +marking-CyberLimbsMarkingWardtakahashiRArm = Right Robotic Arm from Ward-Takahashi +marking-CyberLimbsMarkingWardtakahashiRHand = Right Robotic Hand from Ward-Takahashi +marking-CyberLimbsMarkingWardtakahashiRLeg = Right Robotic Leg from Ward-Takahashi +marking-CyberLimbsMarkingWardtakahashiRFoot = Right Robotic Foot from Ward-Takahashi + +marking-CyberLimbsMarkingXionHead = Operational Monitor from Xion Manufacturing Group +marking-CyberLimbsMarkingXionChest = Robotic Chassis from Xion Manufacturing Group +marking-CyberLimbsMarkingXionLArm = Left Robotic Arm from Xion Manufacturing Group +marking-CyberLimbsMarkingXionLHand = Left Robotic Hand from Xion Manufacturing Group +marking-CyberLimbsMarkingXionLLeg = Left Robotic Leg from Xion Manufacturing Group +marking-CyberLimbsMarkingXionLFoot = Left Robotic Foot from Xion Manufacturing Group +marking-CyberLimbsMarkingXionRArm = Right Robotic Arm from Xion Manufacturing Group +marking-CyberLimbsMarkingXionRHand = Right Robotic Hand from Xion Manufacturing Group +marking-CyberLimbsMarkingXionRLeg = Right Robotic Leg from Xion Manufacturing Group +marking-CyberLimbsMarkingXionRFoot = Right Robotic Foot from Xion Manufacturing Group + +marking-CyberLimbsMarkingShellguardHead = Operational Monitor from Shellguard Munitions +marking-CyberLimbsMarkingShellguardChest = Robotic Chassis from Shellguard Munitions +marking-CyberLimbsMarkingShellguardLArm = Left Robotic Arm from Shellguard Munitions +marking-CyberLimbsMarkingShellguardLHand = Left Robotic Hand from Shellguard Munitions +marking-CyberLimbsMarkingShellguardLLeg = Left Robotic Leg from Shellguard Munitions +marking-CyberLimbsMarkingShellguardLFoot = Left Robotic Foot from Shellguard Munitions +marking-CyberLimbsMarkingShellguardRArm = Right Robotic Arm from Shellguard Munitions +marking-CyberLimbsMarkingShellguardRHand = Right Robotic Hand from Shellguard Munitions +marking-CyberLimbsMarkingShellguardRLeg = Right Robotic Leg from Shellguard Munitions +marking-CyberLimbsMarkingShellguardRFoot = Right Robotic Foot from Shellguard Munitions + +marking-CyberLimbsMarkingMorpheusHead = Operational Monitor from Morpheus Cyberkinetics +marking-CyberLimbsMarkingMorpheusChest = Robotic Chassis from Morpheus Cyberkinetics +marking-CyberLimbsMarkingMorpheusLArm = Left Robotic Arm from Morpheus Cyberkinetics +marking-CyberLimbsMarkingMorpheusLHand = Left Robotic Hand from Morpheus Cyberkinetics +marking-CyberLimbsMarkingMorpheusLLeg = Left Robotic Leg from Morpheus Cyberkinetics +marking-CyberLimbsMarkingMorpheusLFoot = Left Robotic Foot from Morpheus Cyberkinetics +marking-CyberLimbsMarkingMorpheusRArm = Right Robotic Arm from Morpheus Cyberkinetics +marking-CyberLimbsMarkingMorpheusRHand = Right Robotic Hand from Morpheus Cyberkinetics +marking-CyberLimbsMarkingMorpheusRLeg = Right Robotic Leg from Morpheus Cyberkinetics +marking-CyberLimbsMarkingMorpheusRFoot = Right Robotic Foot from Morpheus Cyberkinetics diff --git a/Resources/Locale/en-US/species/species.ftl b/Resources/Locale/en-US/species/species.ftl index f31b1fa0f00..79ce7fea6a1 100644 --- a/Resources/Locale/en-US/species/species.ftl +++ b/Resources/Locale/en-US/species/species.ftl @@ -6,6 +6,7 @@ species-name-reptilian = Reptilian species-name-slime = Slime Person species-name-diona = Diona species-name-arachnid = Arachnid +species-name-arachne = Arachne species-name-moth = Moth Person species-name-skeleton = Skeleton species-name-vox = Vox diff --git a/Resources/Locale/en-US/station-events/events/anomaly-spawn.ftl b/Resources/Locale/en-US/station-events/events/anomaly-spawn.ftl index 543bef949aa..30fe4971eb8 100644 --- a/Resources/Locale/en-US/station-events/events/anomaly-spawn.ftl +++ b/Resources/Locale/en-US/station-events/events/anomaly-spawn.ftl @@ -1,4 +1,4 @@ -station-event-anomaly-spawn-announcement = Our readings have detected a dangerous interspacial anomaly. Please inform the research team of { $sighting }. +anomaly-spawn-event-announcement = Our readings have detected a dangerous interspacial anomaly. Please inform the research team of { $sighting }. anomaly-spawn-sighting-1 = low pulsating sounds heard throughout the station anomaly-spawn-sighting-2 = strange sources of light diff --git a/Resources/Locale/en-US/supermatter/supermatter.ftl b/Resources/Locale/en-US/supermatter/supermatter.ftl new file mode 100644 index 00000000000..52593f5524e --- /dev/null +++ b/Resources/Locale/en-US/supermatter/supermatter.ftl @@ -0,0 +1,26 @@ +supermatter-announcer = Automatic Supermatter Engine +supermatter-examine-integrity = + Its' integrity is [color=yellow]{$integrity}%[/color]. +supermatter-announcement-warning = + Warning! Crystal hyperstructure integrity faltering! Integrity: {$integrity}%. +supermatter-announcement-emergency = + DANGER! Crystal hyperstructure integrity reaching critical levels! Integrity: {$integrity}%. +supermatter-announcement-delam-explosion = + CRYSTAL DELAMINATION IMMINENT! The crystal has reached critical integrity failure! Emergency causality destabilization field has been engaged. +supermatter-announcement-delam-overmass = + CRYSTAL DELAMINATION IMMINENT! Crystal hyperstructure integrity has reached critical mass failure! Singularity formation imminent! +supermatter-announcement-delam-tesla = + CRYSTAL DELAMINATION IMMINENT! Crystal hyperstructure integrity has reached critical power surge failure! Energy ball formation imminent! +supermatter-announcement-delam-cascade = + CRYSTAL DELAMINATION IMMINENT! Harmonic frequency limits exceeded, casualty destabilization field could not be engaged! +supermatter-announcement-delam-cancel = + Crystalline hyperstructure returning to safe operating parameters. Failsafe has been Disengaged. Integrity: {$integrity}%. +supermatter-seconds-before-delam = + Estimated time before delamination: {$seconds} seconds. +supermatter-tamper-begin = + You begin carefully cutting a piece off the supermatter crystal... +supermatter-tamper-end = + You feel the power of a thousand suns laying on your palms. Or is it all the radiation? +supermatter-announcement-cc-tamper = + Our automatic casualty system has detected that the supermatter crystal structural integrity was compromised by an external force. + Engineering department, report to the supermatter engine immediately. diff --git a/Resources/Locale/en-US/traits/traits.ftl b/Resources/Locale/en-US/traits/traits.ftl index cd5d1782ba3..16cae663009 100644 --- a/Resources/Locale/en-US/traits/traits.ftl +++ b/Resources/Locale/en-US/traits/traits.ftl @@ -8,15 +8,31 @@ trait-description-Narcolepsy = You fall asleep randomly trait-name-Pacifist = Pacifist trait-description-Pacifist = You cannot attack or hurt any living beings. +trait-name-SelfAware = Self-Aware +trait-description-SelfAware = + You possess a keen intuition of your body and senses. + You can accurately examine the severity of your wounds and burns like a health analyzer, + and can gauge if you have toxin or airloss damage. + trait-name-LightweightDrunk = Lightweight Drunk trait-description-LightweightDrunk = Alcohol has a stronger effect on you -trait-name-HeavyweightDrunk = Heavyweight Drunk -trait-description-HeavyweightDrunk = Alcohols are afraid of you +trait-name-HeavyweightDrunk = Alcohol Tolerance +trait-description-HeavyweightDrunk = Alcohol is afraid of you. trait-name-Muted = Muted trait-description-Muted = You can't speak +trait-name-BloodDeficiency = Blood Deficiency +trait-description-BloodDeficiency = + Your body loses more blood than it can replenish. + You lose blood over time, and when left untreated you will eventually die from blood loss. + +trait-name-Hemophilia = Hemophilia +trait-description-Hemophilia = + Your body's ability to form blood clots is impaired. + You bleed twice as long, and you have easy bruising, taking 10% more Blunt damage. + trait-name-Paracusia = Paracusia trait-description-Paracusia = You hear sounds that aren't really there @@ -35,6 +51,13 @@ trait-description-Stutter = You t-t-talk with a bit of a s-s-stutter... trait-name-Snoring = Snoring trait-description-Snoring = You will snore while sleeping. +trait-name-CPRTraining = CPR Training +trait-description-CPRTraining = At some point in your life, you have received training in how to perform CPR. + This trait is automatically given for free to medical doctors, and is intended for non-medical characters + +trait-name-NormalVisionHarpy = Trichromat Modification +trait-description-NormalVisionHarpy = Your eyes have been modified by means of advanced medicine to see in the standard colors of Red, Green, and Blue. + trait-name-Southern = Southern Drawl trait-description-Southern = You have a different way of speakin'. @@ -55,3 +78,47 @@ trait-name-Foreigner = Foreigner trait-description-Foreigner = For one reason or another you do not speak this station's primary language. Instead, you have a translator issued to you that only you can use. + +trait-name-SignLanguage = Sign Language +trait-description-SignLanguage = + You can understand and use Galactic Sign Language (GSL). + If you are mute for any reason, you can still communicate with sign language. + +trait-name-Voracious = Voracious +trait-description-Voracious = + Nothing gets between you and your food. + Your endless consumption of food and drinks is twice as fast. + +trait-name-ParkourTraining = Parkour Training +trait-description-ParkourTraining = + Whether as a hobby, lifestyle, or professional training, you are trained in the discipline of parkour. + You're faster with climbing, crawling, lying down, and getting up. + +trait-name-Sluggish = Sluggish +trait-description-Sluggish = + You navigate the world slower than others, perhaps due to a medical condition, inactivity, or age. + You move slower, and it takes longer for you to climb, lie down and get up. + +trait-name-SnailPaced = Snail-Paced +trait-description-SnailPaced = + You walk at a snail's pace, perhaps due to a medical condition, mobility impairment, or age. + You move substantially slower, and it takes far longer for you to climb, lie down and get up. + +trait-name-LightStep = Light Step +trait-description-LightStep = + You move with a gentle step, making your footsteps quieter. + +trait-name-Swashbuckler = Swashbuckler +trait-description-Swashbuckler = + You are an expert in swordsmanship, wielding swords, knives, and other blades with unrivaled finesse. + Your melee Slash bonus is increased to 35%, but your melee Blunt bonus is reduced to 20%. + +trait-name-Spearmaster = Spearmaster +trait-description-Spearmaster = + You have an outstanding proficiency with spears, wielding them as an extension of your body. + Your melee Piercing bonus is increased to 35%, but your melee Blunt bonus is reduced to 20%. + +trait-name-WeaponsGeneralist = Weapons Generalist +trait-description-WeaponsGeneralist = + You are a jack of all trades with melee weapons, enabling you to be versatile with your weapon arsenal. + Your melee damage bonus for all Brute damage types (Blunt, Slash, Piercing) becomes 25%. diff --git a/Resources/Locale/en-US/xenoarchaeology/artifact-hints.ftl b/Resources/Locale/en-US/xenoarchaeology/artifact-hints.ftl index 98dfa89fa9f..a139c2036e1 100644 --- a/Resources/Locale/en-US/xenoarchaeology/artifact-hints.ftl +++ b/Resources/Locale/en-US/xenoarchaeology/artifact-hints.ftl @@ -40,3 +40,6 @@ artifact-trigger-hint-regular-gases = Standard atmospheric gases artifact-trigger-hint-plasma = Gaseous plasma artifact-trigger-hint-land = Active deceleration artifact-trigger-hint-examine = Examination + +# Psionic Effects +artifact-effect-hint-psionic = Noöspheric disturbance diff --git a/Resources/Maps/hammurabi.yml b/Resources/Maps/hammurabi.yml index 022c647ba76..0afaa64934e 100644 --- a/Resources/Maps/hammurabi.yml +++ b/Resources/Maps/hammurabi.yml @@ -26862,7 +26862,7 @@ entities: - uid: 18085 components: - type: MetaData - name: psionic mantis office/epistemics hall APC + name: mantis office/epistemics hall APC - type: Transform pos: -31.5,-37.5 parent: 1 diff --git a/Resources/Prototypes/Access/misc.yml b/Resources/Prototypes/Access/misc.yml index 99ad59700e0..f402c7544a0 100644 --- a/Resources/Prototypes/Access/misc.yml +++ b/Resources/Prototypes/Access/misc.yml @@ -34,7 +34,7 @@ - Atmospherics - Mail # Nyanotrasen - MailCarrier, see Resources/Prototypes/Nyanotrasen/Roles/Jobs/Cargo/mail-carrier.yml - Orders # DeltaV - Orders, see Resources/Prototypes/DeltaV/Access/cargo.yml - - Mantis # DeltaV - Psionic Mantis, see Resources/Prototypes/DeltaV/Access/epistemics.yml + - Mantis # DeltaV - Mantis, see Resources/Prototypes/DeltaV/Access/epistemics.yml - Paramedic # DeltaV - Add Paramedic access - Psychologist # DeltaV - Add Psychologist access - Boxer # DeltaV - Add Boxer access @@ -44,4 +44,7 @@ - Musician # DeltaV - Add Musician access - Reporter # DeltaV - Add Reporter access - Zookeeper # DeltaV - Add Zookeeper access + - Justice # DeltaV - Add Justice dept access + - ChiefJustice # DeltaV - Add Chief Justice access + - Prosecutor # DeltaV - Add Prosecutor access - Corpsman # DeltaV - Add Corpsman access diff --git a/Resources/Prototypes/Access/research.yml b/Resources/Prototypes/Access/research.yml index f0de2c93db4..3e3b0432b45 100644 --- a/Resources/Prototypes/Access/research.yml +++ b/Resources/Prototypes/Access/research.yml @@ -11,4 +11,4 @@ tags: - ResearchDirector - Research - - Mantis # DeltaV - Psionic Mantis, see Resources/Prototypes/DeltaV/Access/epistemics.yml + - Mantis # DeltaV - Mantis, see Resources/Prototypes/DeltaV/Access/epistemics.yml diff --git a/Resources/Prototypes/Actions/psionics.yml b/Resources/Prototypes/Actions/psionics.yml new file mode 100644 index 00000000000..62a7fc014cd --- /dev/null +++ b/Resources/Prototypes/Actions/psionics.yml @@ -0,0 +1,136 @@ +- type: entity + id: ActionDispel + name: action-name-dispel + description: action-description-dispel + noSpawn: true + components: + - type: EntityTargetAction + icon: Interface/VerbIcons/dispel.png + useDelay: 45 + checkCanAccess: false + range: 6 + itemIconStyle: BigAction + canTargetSelf: false + event: !type:DispelPowerActionEvent + +- type: entity + id: ActionMassSleep + name: action-name-mass-sleep + description: action-description-mass-sleep + noSpawn: true + components: + - type: WorldTargetAction + icon: Interface/VerbIcons/mass_sleep.png + useDelay: 60 + checkCanAccess: false + range: 8 + itemIconStyle: BigAction + event: !type:MassSleepPowerActionEvent + +- type: entity + id: ActionMindSwap + name: action-name-mind-swap + description: action-description-mind-swap + noSpawn: true + components: + - type: EntityTargetAction + icon: Interface/VerbIcons/mind_swap.png + useDelay: 240 + checkCanAccess: false + range: 8 + itemIconStyle: BigAction + event: !type:MindSwapPowerActionEvent + +- type: entity + id: ActionMindSwapReturn + name: action-name-mind-swap-return + description: action-description-mind-swap-return + noSpawn: true + components: + - type: InstantAction + icon: Interface/VerbIcons/mind_swap_return.png + useDelay: 20 + checkCanInteract: false + event: !type:MindSwapPowerReturnActionEvent + +- type: entity + id: ActionNoosphericZap + name: action-name-noospheric-zap + description: action-description-noospheric-zap + noSpawn: true + components: + - type: EntityTargetAction + icon: Interface/VerbIcons/noospheric_zap.png + useDelay: 100 + range: 5 + itemIconStyle: BigAction + event: !type:NoosphericZapPowerActionEvent + +- type: entity + id: ActionPyrokinesis + name: action-name-pyrokinesis + description: action-description-pyrokinesis + noSpawn: true + components: + - type: EntityTargetAction + icon: Interface/VerbIcons/pyrokinesis.png + useDelay: 50 + range: 6 + checkCanAccess: false + itemIconStyle: BigAction + event: !type:PyrokinesisPowerActionEvent + +- type: entity + id: ActionMetapsionic + name: action-name-metapsionic + description: action-description-metapsionic + noSpawn: true + components: + - type: InstantAction + icon: Interface/VerbIcons/metapsionic.png + useDelay: 45 + event: !type:MetapsionicPowerActionEvent + +- type: entity + id: ActionPsionicRegeneration + name: action-name-psionic-regeneration + description: action-description-psionic-regeneration + noSpawn: true + components: + - type: InstantAction + icon: Interface/VerbIcons/psionic_regeneration.png + useDelay: 120 + event: !type:PsionicRegenerationPowerActionEvent + +- type: entity + id: ActionTelegnosis + name: action-name-telegnosis + description: action-description-telegnosis + noSpawn: true + components: + - type: InstantAction + icon: Interface/VerbIcons/telegnosis.png + useDelay: 150 + event: !type:TelegnosisPowerActionEvent + +- type: entity + id: ActionPsionicInvisibility + name: action-name-psionic-invisibility + description: action-description-psionic-invisibility + noSpawn: true + components: + - type: InstantAction + icon: Interface/VerbIcons/psionic_invisibility.png + useDelay: 120 + event: !type:PsionicInvisibilityPowerActionEvent + +- type: entity + id: ActionPsionicInvisibilityUsed + name: action-name-psionic-invisibility-off + description: action-description-psionic-invisibility-off + noSpawn: true + components: + - type: InstantAction + icon: Interface/VerbIcons/psionic_invisibility_off.png + event: !type:RemovePsionicInvisibilityOffPowerActionEvent + diff --git a/Resources/Prototypes/Actions/types.yml b/Resources/Prototypes/Actions/types.yml index f55f59daaa8..f5dff1f453a 100644 --- a/Resources/Prototypes/Actions/types.yml +++ b/Resources/Prototypes/Actions/types.yml @@ -345,8 +345,8 @@ noSpawn: true components: - type: InstantAction - icon: { sprite: Mobs/Customization/reptilian_parts.rsi, state: tail_smooth_behind } - iconOn: { sprite: Mobs/Customization/reptilian_parts.rsi, state: tail_smooth_behind } + icon: { sprite: Interface/Actions/wagging.rsi, state: icon } + iconOn: { sprite: Interface/Actions/wagging.rsi, state: icon-on } itemIconStyle: NoItem useDelay: 1 # emote spam event: !type:ToggleActionEvent diff --git a/Resources/Prototypes/Announcers/michael.yml b/Resources/Prototypes/Announcers/michael.yml index f63b934fbc6..8d4e50d0bb0 100644 --- a/Resources/Prototypes/Announcers/michael.yml +++ b/Resources/Prototypes/Announcers/michael.yml @@ -37,8 +37,8 @@ path: alerts/red.ogg - id: alertGamma # There is a massive immediate threat to the station, listen to Central Command path: alerts/gamma.ogg - # - id: alertDelta # The station is being or about to be massively destroyed, run for your life - # path: alerts/delta.ogg + - id: alertDelta # The station is being or about to be massively destroyed, run for your life + path: alerts/delta.ogg - id: alertEpsilon # The station has been terminated, good luck survivors! path: alerts/epsilon.ogg audioParams: diff --git a/Resources/Prototypes/Atmospherics/thresholds.yml b/Resources/Prototypes/Atmospherics/thresholds.yml index 9b09d64a10c..22ca42869ed 100644 --- a/Resources/Prototypes/Atmospherics/thresholds.yml +++ b/Resources/Prototypes/Atmospherics/thresholds.yml @@ -12,13 +12,14 @@ - type: alarmThreshold id: stationPressure upperBound: !type:AlarmThresholdSetting - threshold: 550 # as defined in Atmospherics.cs + threshold: 550 # HazardHighPressure from Atmospherics.cs lowerBound: !type:AlarmThresholdSetting - threshold: 20 # as defined in Atmospherics.cs + # Actual low pressure damage threshold is at 20 kPa, but below ~85 kPa you can't breathe due to lack of oxygen. + threshold: 20 upperWarnAround: !type:AlarmThresholdSetting - threshold: 0.7 + threshold: 0.7 # 385 kPa, WarningHighPressure from Atmospherics.cs lowerWarnAround: !type:AlarmThresholdSetting - threshold: 2.5 + threshold: 1.05 # ~90 kPa # a reminder that all of these are percentages (where 1 is 100%), # so 0.01 is 1%, diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_cargo.yml b/Resources/Prototypes/Catalog/Cargo/cargo_cargo.yml index fb3b2da41a8..409670636fb 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_cargo.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_cargo.yml @@ -1,13 +1,3 @@ -- type: cargoProduct - id: CargoPallet - icon: - sprite: Structures/catwalk.rsi - state: catwalk_preview - product: CargoPallet - cost: 250 - category: Logistics # DeltaV - Logistics Department replacing Cargo - group: market - - type: cargoProduct id: CargoOreBox icon: diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_vending.yml b/Resources/Prototypes/Catalog/Cargo/cargo_vending.yml index 93c60e4caa0..7062b2eb155 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_vending.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_vending.yml @@ -33,7 +33,7 @@ sprite: Objects/Specific/Service/vending_machine_restock.rsi state: base product: CrateVendingMachineRestockClothesFilled - cost: 4500 + cost: 1500 category: cargoproduct-category-name-service group: market diff --git a/Resources/Prototypes/Catalog/Fills/Backpacks/StarterGear/backpack.yml b/Resources/Prototypes/Catalog/Fills/Backpacks/StarterGear/backpack.yml index 2e09906b13e..4d33ec98a90 100644 --- a/Resources/Prototypes/Catalog/Fills/Backpacks/StarterGear/backpack.yml +++ b/Resources/Prototypes/Catalog/Fills/Backpacks/StarterGear/backpack.yml @@ -2,10 +2,6 @@ parent: ClothingBackpack id: ClothingBackpackFilled noSpawn: true - components: - - type: StorageFill - contents: - - id: BoxSurvival - type: entity noSpawn: true @@ -25,7 +21,6 @@ components: - type: StorageFill contents: - - id: BoxSurvivalSecurity - id: Flash # - id: MagazinePistol # DeltaV - Security doesn't get an extra mag @@ -36,7 +31,6 @@ components: - type: StorageFill contents: - - id: BoxSurvivalSecurity - id: Flash - id: ForensicPad - id: ForensicScanner @@ -45,10 +39,6 @@ noSpawn: true parent: ClothingBackpackMedical id: ClothingBackpackMedicalFilled - components: - - type: StorageFill - contents: - - id: BoxSurvivalMedical - type: entity noSpawn: true @@ -57,7 +47,6 @@ components: - type: StorageFill contents: - - id: BoxSurvivalMedical - id: EmergencyRollerBedSpawnFolded - type: entity @@ -67,7 +56,6 @@ components: - type: StorageFill contents: - - id: BoxSurvival - id: Flash #- name: StationCharter #- name: TelescopicBaton @@ -78,7 +66,6 @@ components: - type: StorageFill contents: - - id: BoxSurvivalEngineering - id: Flash #- id: TelescopicBaton @@ -89,7 +76,6 @@ components: - type: StorageFill contents: - - id: BoxSurvival - id: Flash #- id: TelescopicBaton @@ -100,7 +86,6 @@ components: - type: StorageFill contents: - - id: BoxSurvival - id: Flash #- id: TelescopicBaton @@ -111,7 +96,6 @@ components: - type: StorageFill contents: - - id: BoxSurvivalMedical - id: Flash #- id: TelescopicBaton @@ -122,7 +106,6 @@ components: - type: StorageFill contents: - - id: BoxSurvival - id: Flash #- id: TelescopicBaton @@ -133,7 +116,6 @@ components: - type: StorageFill contents: - - id: BoxSurvivalSecurity - id: Flash - id: MagazinePistol @@ -141,37 +123,21 @@ noSpawn: true parent: ClothingBackpackEngineering id: ClothingBackpackEngineeringFilled - components: - - type: StorageFill - contents: - - id: BoxSurvivalEngineering - type: entity noSpawn: true parent: ClothingBackpackAtmospherics id: ClothingBackpackAtmosphericsFilled - components: - - type: StorageFill - contents: - - id: BoxSurvivalEngineering - type: entity noSpawn: true parent: ClothingBackpackScience id: ClothingBackpackScienceFilled - components: - - type: StorageFill - contents: - - id: BoxSurvival - type: entity noSpawn: true parent: ClothingBackpackHydroponics id: ClothingBackpackHydroponicsFilled - components: - - type: StorageFill - contents: - - id: BoxSurvival - type: entity noSpawn: true @@ -180,17 +146,12 @@ components: - type: StorageFill contents: - - id: BoxSurvival - id: RubberStampMime - type: entity noSpawn: true parent: ClothingBackpackChemistry id: ClothingBackpackChemistryFilled - components: - - type: StorageFill - contents: - - id: BoxSurvivalMedical - type: entity noSpawn: true @@ -199,7 +160,6 @@ components: - type: StorageFill contents: - - id: BoxSurvival - id: Bible - id: RubberStampChaplain @@ -210,7 +170,6 @@ components: - type: StorageFill contents: - - id: BoxSurvival - id: AcousticGuitarInstrument - id: SaxophoneInstrument @@ -221,7 +180,6 @@ components: - type: StorageFill contents: - - id: BoxSurvival - id: BookRandom - type: entity @@ -231,7 +189,6 @@ components: - type: StorageFill contents: - - id: BoxSurvival - id: Lighter - id: CigPackBlack - id: HandLabeler @@ -372,19 +329,11 @@ noSpawn: true parent: ClothingBackpackCargo id: ClothingBackpackCargoFilled - components: - - type: StorageFill - contents: - - id: BoxSurvival - type: entity noSpawn: true parent: ClothingBackpackSalvage id: ClothingBackpackSalvageFilled - components: - - type: StorageFill - contents: - - id: BoxSurvival # Pirate diff --git a/Resources/Prototypes/Catalog/Fills/Backpacks/StarterGear/duffelbag.yml b/Resources/Prototypes/Catalog/Fills/Backpacks/StarterGear/duffelbag.yml index f7ad973b842..3cac13ab53e 100644 --- a/Resources/Prototypes/Catalog/Fills/Backpacks/StarterGear/duffelbag.yml +++ b/Resources/Prototypes/Catalog/Fills/Backpacks/StarterGear/duffelbag.yml @@ -2,10 +2,6 @@ noSpawn: true parent: ClothingBackpackDuffel id: ClothingBackpackDuffelFilled - components: - - type: StorageFill - contents: - - id: BoxSurvival - type: entity noSpawn: true @@ -14,7 +10,6 @@ components: - type: StorageFill contents: - - id: BoxHug - id: RubberStampClown - type: entity @@ -24,7 +19,6 @@ components: - type: StorageFill contents: - - id: BoxSurvivalSecurity - id: Flash # - id: MagazinePistol # DeltaV - Security doesn't get an extra mag @@ -35,7 +29,6 @@ components: - type: StorageFill contents: - - id: BoxSurvivalSecurity - id: Flash - id: ForensicPad - id: ForensicScanner @@ -53,10 +46,6 @@ noSpawn: true parent: ClothingBackpackDuffelMedical id: ClothingBackpackDuffelMedicalFilled - components: - - type: StorageFill - contents: - - id: BoxSurvivalMedical - type: entity noSpawn: true @@ -65,7 +54,6 @@ components: - type: StorageFill contents: - - id: BoxSurvivalMedical - id: EmergencyRollerBedSpawnFolded - type: entity @@ -75,10 +63,10 @@ components: - type: StorageFill contents: - - id: BoxSurvival - id: Flash #- name: StationCharter #- name: TelescopicBaton + - type: entity noSpawn: true parent: ClothingBackpackDuffelEngineering @@ -86,7 +74,6 @@ components: - type: StorageFill contents: - - id: BoxSurvivalEngineering - id: Flash #- id: TelescopicBaton @@ -97,7 +84,6 @@ components: - type: StorageFill contents: - - id: BoxSurvival - id: Flash #- id: TelescopicBaton @@ -108,7 +94,6 @@ components: - type: StorageFill contents: - - id: BoxSurvival - id: Flash #- id: TelescopicBaton @@ -119,7 +104,6 @@ components: - type: StorageFill contents: - - id: BoxSurvivalMedical - id: Flash #- id: TelescopicBaton @@ -130,7 +114,6 @@ components: - type: StorageFill contents: - - id: BoxSurvival - id: Flash #- id: TelescopicBaton @@ -141,7 +124,6 @@ components: - type: StorageFill contents: - - id: BoxSurvivalSecurity - id: Flash - id: MagazinePistol @@ -149,38 +131,21 @@ noSpawn: true parent: ClothingBackpackDuffelEngineering id: ClothingBackpackDuffelEngineeringFilled - components: - - type: StorageFill - contents: - - id: BoxSurvivalEngineering - type: entity noSpawn: true parent: ClothingBackpackDuffelAtmospherics id: ClothingBackpackDuffelAtmosphericsFilled - components: - - type: StorageFill - contents: - - id: BoxSurvivalEngineering - - type: entity noSpawn: true parent: ClothingBackpackDuffelScience id: ClothingBackpackDuffelScienceFilled - components: - - type: StorageFill - contents: - - id: BoxSurvival - type: entity noSpawn: true parent: ClothingBackpackDuffelHydroponics id: ClothingBackpackDuffelHydroponicsFilled - components: - - type: StorageFill - contents: - - id: BoxSurvival - type: entity noSpawn: true @@ -189,17 +154,12 @@ components: - type: StorageFill contents: - - id: BoxSurvival - id: RubberStampMime - type: entity noSpawn: true parent: ClothingBackpackDuffelChemistry id: ClothingBackpackDuffelChemistryFilled - components: - - type: StorageFill - contents: - - id: BoxSurvivalMedical - type: entity noSpawn: true @@ -208,7 +168,6 @@ components: - type: StorageFill contents: - - id: BoxSurvival - id: Bible - id: RubberStampChaplain @@ -219,7 +178,6 @@ components: - type: StorageFill contents: - - id: BoxSurvival - id: AcousticGuitarInstrument - id: SaxophoneInstrument @@ -230,7 +188,6 @@ components: - type: StorageFill contents: - - id: BoxSurvival - id: BookRandom - type: entity @@ -240,7 +197,6 @@ components: - type: StorageFill contents: - - id: BoxSurvival - id: Lighter - id: CigPackBlack - id: BoxForensicPad @@ -250,16 +206,8 @@ noSpawn: true parent: ClothingBackpackDuffelCargo id: ClothingBackpackDuffelCargoFilled - components: - - type: StorageFill - contents: - - id: BoxSurvival - type: entity noSpawn: true parent: ClothingBackpackDuffelSalvage id: ClothingBackpackDuffelSalvageFilled - components: - - type: StorageFill - contents: - - id: BoxSurvival diff --git a/Resources/Prototypes/Catalog/Fills/Backpacks/StarterGear/satchel.yml b/Resources/Prototypes/Catalog/Fills/Backpacks/StarterGear/satchel.yml index 1a3dda66487..89ae8fdf477 100644 --- a/Resources/Prototypes/Catalog/Fills/Backpacks/StarterGear/satchel.yml +++ b/Resources/Prototypes/Catalog/Fills/Backpacks/StarterGear/satchel.yml @@ -2,10 +2,6 @@ noSpawn: true parent: ClothingBackpackSatchel id: ClothingBackpackSatchelFilled - components: - - type: StorageFill - contents: - - id: BoxSurvival - type: entity noSpawn: true @@ -14,7 +10,6 @@ components: - type: StorageFill contents: - - id: BoxSurvival - id: Crowbar - id: Wrench - id: Screwdriver @@ -38,7 +33,6 @@ components: - type: StorageFill contents: - - id: BoxSurvivalSecurity - id: Flash # - id: MagazinePistol # DeltaV - Security doesn't get an extra mag @@ -49,7 +43,6 @@ components: - type: StorageFill contents: - - id: BoxSurvivalSecurity - id: Flash - id: ForensicPad - id: ForensicScanner @@ -67,10 +60,6 @@ noSpawn: true parent: ClothingBackpackSatchelMedical id: ClothingBackpackSatchelMedicalFilled - components: - - type: StorageFill - contents: - - id: BoxSurvivalMedical - type: entity noSpawn: true @@ -79,7 +68,6 @@ components: - type: StorageFill contents: - - id: BoxSurvivalMedical - id: EmergencyRollerBedSpawnFolded - type: entity @@ -89,10 +77,10 @@ components: - type: StorageFill contents: - - id: BoxSurvival - id: Flash #- name: StationCharter #- name: TelescopicBaton + - type: entity noSpawn: true parent: ClothingBackpackSatchelEngineering @@ -100,7 +88,6 @@ components: - type: StorageFill contents: - - id: BoxSurvivalEngineering - id: Flash #- id: TelescopicBaton @@ -111,7 +98,6 @@ components: - type: StorageFill contents: - - id: BoxSurvival - id: Flash #- id: TelescopicBaton @@ -122,7 +108,6 @@ components: - type: StorageFill contents: - - id: BoxSurvival - id: Flash #- id: TelescopicBaton @@ -133,7 +118,6 @@ components: - type: StorageFill contents: - - id: BoxSurvivalMedical - id: Flash #- id: TelescopicBaton @@ -144,7 +128,6 @@ components: - type: StorageFill contents: - - id: BoxSurvival - id: Flash #- id: TelescopicBaton @@ -155,7 +138,6 @@ components: - type: StorageFill contents: - - id: BoxSurvivalSecurity - id: Flash - id: MagazinePistol @@ -163,46 +145,26 @@ noSpawn: true parent: ClothingBackpackSatchelEngineering id: ClothingBackpackSatchelEngineeringFilled - components: - - type: StorageFill - contents: - - id: BoxSurvivalEngineering - type: entity noSpawn: true parent: ClothingBackpackSatchelAtmospherics id: ClothingBackpackSatchelAtmosphericsFilled - components: - - type: StorageFill - contents: - - id: BoxSurvivalEngineering - type: entity noSpawn: true parent: ClothingBackpackSatchelScience id: ClothingBackpackSatchelScienceFilled - components: - - type: StorageFill - contents: - - id: BoxSurvival - type: entity noSpawn: true parent: ClothingBackpackSatchelHydroponics id: ClothingBackpackSatchelHydroponicsFilled - components: - - type: StorageFill - contents: - - id: BoxSurvival - type: entity noSpawn: true parent: ClothingBackpackSatchelChemistry id: ClothingBackpackSatchelChemistryFilled - components: - - type: StorageFill - contents: - - id: BoxSurvivalMedical - type: entity noSpawn: true @@ -211,7 +173,6 @@ components: - type: StorageFill contents: - - id: BoxSurvival - id: Bible - id: RubberStampChaplain @@ -222,7 +183,6 @@ components: - type: StorageFill contents: - - id: BoxSurvival - id: AcousticGuitarInstrument - id: SaxophoneInstrument @@ -233,7 +193,6 @@ components: - type: StorageFill contents: - - id: BoxSurvival - id: BookRandom - type: entity @@ -243,7 +202,6 @@ components: - type: StorageFill contents: - - id: BoxSurvival - id: BoxForensicPad - id: Lighter - id: CigPackBlack @@ -253,19 +211,11 @@ noSpawn: true parent: ClothingBackpackSatchelCargo id: ClothingBackpackSatchelCargoFilled - components: - - type: StorageFill - contents: - - id: BoxSurvival - type: entity noSpawn: true parent: ClothingBackpackSatchelSalvage id: ClothingBackpackSatchelSalvageFilled - components: - - type: StorageFill - contents: - - id: BoxSurvival - type: entity noSpawn: true @@ -274,7 +224,6 @@ components: - type: StorageFill contents: - - id: BoxSurvival - id: RubberStampMime - type: entity diff --git a/Resources/Prototypes/Catalog/Fills/Boxes/general.yml b/Resources/Prototypes/Catalog/Fills/Boxes/general.yml index e4181d27a21..59a9e8d0056 100644 --- a/Resources/Prototypes/Catalog/Fills/Boxes/general.yml +++ b/Resources/Prototypes/Catalog/Fills/Boxes/general.yml @@ -11,7 +11,7 @@ - type: Storage maxItemSize: Small grid: - - 0,0,2,2 + - 0,0,3,3 - type: Sprite state: box - type: EmitSoundOnPickup diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/clothesmate.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/clothesmate.yml index 2c4c27137f0..bc8f73d618c 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/clothesmate.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/clothesmate.yml @@ -1,116 +1,25 @@ - type: vendingMachineInventory id: ClothesMateInventory startingInventory: - ClothingBackpack: 5 - ClothingBackpackDuffel: 5 - ClothingBackpackSatchel: 3 + # STOP! ADD NOTHING TO THIS! GO PUT YOUR CLOTHES IN LOADOUTS INSTEAD! + ClothingBackpack: 2 + ClothingBackpackDuffel: 2 + ClothingBackpackSatchel: 2 ClothingBackpackSatchelLeather: 2 - ClothingRandomSpawner: 8 - ClothingHeadHatBeret: 4 + ClothingRandomSpawner: 6 ClothingHeadBandBlack: 2 - ClothingHeadBandBlue: 2 - ClothingHeadBandGreen: 2 - ClothingHeadBandRed: 2 - ClothingHeadBandSkull: 2 - ClothingHeadHatGreyFlatcap: 3 - ClothingHeadHatBrownFlatcap: 3 - ClothingUniformJumpsuitColorGrey: 8 - ClothingUniformJumpskirtColorGrey: 8 - ClothingUniformJumpsuitColorWhite: 3 - ClothingUniformJumpskirtColorWhite: 3 - ClothingUniformJumpsuitColorBlack: 3 - ClothingUniformJumpskirtColorBlack: 3 - ClothingUniformJumpsuitColorBlue: 2 - ClothingUniformJumpskirtColorBlue: 2 - ClothingUniformJumpsuitColorYellow: 2 - ClothingUniformJumpskirtColorYellow: 2 - ClothingUniformJumpsuitColorGreen: 2 - ClothingUniformJumpskirtColorGreen: 2 - ClothingUniformJumpsuitColorOrange: 2 - ClothingUniformJumpskirtColorOrange: 2 - ClothingUniformJumpsuitColorRed: 2 - ClothingUniformJumpskirtColorRed: 2 - ClothingUniformJumpsuitColorPurple: 2 - ClothingUniformJumpskirtColorPurple: 2 - ClothingUniformJumpsuitColorPink: 2 - ClothingUniformJumpskirtColorPink: 2 - ClothingUniformJumpsuitColorDarkBlue: 2 - ClothingUniformJumpskirtColorDarkBlue: 2 - ClothingUniformJumpsuitColorDarkGreen: 2 - ClothingUniformJumpskirtColorDarkGreen: 2 - ClothingUniformJumpsuitColorTeal: 2 - ClothingUniformJumpskirtColorTeal: 2 - ClothingUniformJumpsuitHawaiBlack: 2 - ClothingUniformJumpsuitHawaiBlue: 2 - ClothingUniformJumpsuitHawaiRed: 2 - ClothingUniformJumpsuitHawaiYellow: 2 - ClothingUniformJumpsuitFlannel: 2 - ClothingUniformJumpsuitCasualBlue: 2 - ClothingUniformJumpskirtCasualBlue: 2 - ClothingUniformJumpsuitCasualPurple: 2 - ClothingUniformJumpskirtCasualPurple: 2 - ClothingUniformJumpsuitCasualRed: 2 - ClothingUniformJumpskirtCasualRed: 2 - ClothingUniformJumpsuitTshirtJeans: 2 # Nyano - Clothing addition - ClothingUniformJumpsuitTshirtJeansGray: 2 # Nyano - Clothing addition - ClothingUniformJumpsuitTshirtJeansPeach: 2 # Nyano - Clothing addition - ClothingUniformJumpsuitJeansGreen: 2 # Nyano - Clothing addition - ClothingUniformJumpsuitJeansRed: 2 # Nyano - Clothing addition - ClothingUniformJumpsuitJeansBrown: 2 # Nyano - Clothing addition - ClothingUniformJumpsuitLostTourist: 2 # Nyano - Clothing addition - ClothingShoesColorBlack: 8 - ClothingShoesColorBrown: 4 - ClothingShoesColorWhite: 3 - ClothingShoesColorBlue: 2 - ClothingShoesColorYellow: 2 - ClothingShoesColorGreen: 2 - ClothingShoesColorOrange: 2 - ClothingShoesColorRed: 2 - ClothingShoesColorPurple: 2 - ClothingHeadHatGreysoft: 8 - ClothingHeadHatMimesoft: 3 - ClothingHeadHatBluesoft: 2 - ClothingHeadHatYellowsoft: 2 - ClothingHeadHatGreensoft: 2 - ClothingHeadHatOrangesoft: 2 - ClothingHeadHatRedsoft: 2 - ClothingHeadHatBlacksoft: 2 - ClothingHeadHatPurplesoft: 2 + ClothingHeadHatGreyFlatcap: 2 + ClothingUniformJumpsuitColorGrey: 2 + ClothingUniformJumpskirtColorGrey: 2 + ClothingShoesColorBlack: 4 + ClothingHeadHatGreysoft: 2 ClothingHeadHatCorpsoft: 2 - ClothingOuterWinterCoat: 2 # Nyano - Clothing addition - ClothingOuterWinterCoatLong: 2 # Nyano - Clothing addition - ClothingOuterWinterCoatPlaid: 2 # Nyano - Clothing addition - ClothingOuterCoatHyenhSweater: 2 # Nyano - Clothing addition - ClothingOuterCoatLettermanBlue: 2 # Nyano - Clothing addition - ClothingOuterCoatLettermanRed: 2 # Nyano - Clothing addition - ClothingOuterDenimJacket: 2 # DeltaV - Clothing addition - ClothingOuterCorporateJacket: 2 # DeltaV - Clothing addition - ClothingOuterCsCorporateJacket: 2 # Einstein Engines - Clothing addition - ClothingOuterEeCorporateJacket: 2 # Einstein Engines - Clothing addition - ClothingOuterHiCorporateJacket: 2 # Einstein Engines - Clothing addition - ClothingOuterHmCorporateJacket: 2 # Einstein Engines - Clothing addition - ClothingOuterIdCorporateJacket: 2 # Einstein Engines - Clothing addition - ClothingOuterZhCorporateJacket: 2 # Einstein Engines - Clothing addition - ClothingOuterGeCorporateJacket: 2 # Einstein Engines - Clothing addition - ClothingOuterFaCorporateJacket: 2 # Einstein Engines - Clothing addition - ClothingOuterDdCorporateJacket: 2 # Einstein Engines - Clothing addition - ClothingOuterBcCorporateJacket: 2 # Einstein Engines - Clothing addition - ClothingShoesBootsFishing: 2 # Nyano - Clothing addition - ClothingHeadTinfoil: 2 # Nyano - Clothing addition - ClothingHeadFishCap: 2 - ClothingHeadRastaHat: 2 + ClothingOuterWinterCoat: 2 + ClothingOuterCorporateJacket: 2 ClothingBeltStorageWaistbag: 3 ClothingEyesGlasses: 6 ClothingHandsGlovesColorBlack: 4 - ClothingHandsGlovesColorGray: 4 - ClothingHandsGlovesColorBrown: 2 - ClothingHandsGlovesColorWhite: 2 - ClothingHandsGlovesColorRed: 2 - ClothingHandsGlovesColorBlue: 2 - ClothingHandsGlovesColorGreen: 2 - ClothingHandsGlovesColorOrange: 2 - ClothingHandsGlovesColorPurple: 2 - ClothingEyesGlassesCheapSunglasses: 3 + ClothingEyesGlassesCheapSunglasses: 2 contrabandInventory: ClothingMaskNeckGaiter: 2 ClothingUniformJumpsuitTacticool: 1 diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/sec.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/sec.yml index c071305b77c..01b58ae40fb 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/sec.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/sec.yml @@ -14,6 +14,7 @@ ClothingEyesHudSecurity: 2 ClothingEyesEyepatchHudSecurity: 2 ClothingBeltSecurityWebbing: 5 + CombatKnife: 3 Zipties: 12 RiotShield: 2 RiotLaserShield: 2 @@ -21,8 +22,9 @@ ClothingHeadHelmetInsulated: 2 # Nyanotrasen - Insulative headgear ClothingHeadCage: 2 # Nyanotrasen - Insulative headgear ClothingOuterArmorPlateCarrier: 2 # DeltaV - moved body armour from SecDrobe to SecTech - ClothingOuterArmorDuraVest: 2 + ClothingOuterArmorDuraVest: 2 ClothingHeadHelmetBasic: 2 # DeltaV - added helmets to the SecTech. Another line of defense between the tide and your grey matter. + BreachingCharge: 8 # security officers need to follow a diet regimen! contrabandInventory: FoodDonutHomer: 12 diff --git a/Resources/Prototypes/Chemistry/metabolizer_types.yml b/Resources/Prototypes/Chemistry/metabolizer_types.yml index 259387b6d5c..4d48dab9925 100644 --- a/Resources/Prototypes/Chemistry/metabolizer_types.yml +++ b/Resources/Prototypes/Chemistry/metabolizer_types.yml @@ -1,4 +1,4 @@ -# If your species wants to metabolize stuff differently, +# If your species wants to metabolize stuff differently, # you'll likely have to tag its metabolizers with something other than Human. - type: metabolizerType @@ -44,3 +44,7 @@ - type: metabolizerType id: Arachnid name: arachnid + +- type: metabolizerType + id: Vampiric + name: vampiric diff --git a/Resources/Prototypes/Damage/containers.yml b/Resources/Prototypes/Damage/containers.yml index fb40e9b658f..b01d22df3b7 100644 --- a/Resources/Prototypes/Damage/containers.yml +++ b/Resources/Prototypes/Damage/containers.yml @@ -52,3 +52,13 @@ id: ShadowHaze supportedTypes: - Heat + +- type: damageContainer + id: HalfSpirit + supportedGroups: + - Burn + - Brute + - Airloss + - Immaterial + supportedTypes: + - Poison diff --git a/Resources/Prototypes/Damage/modifier_sets.yml b/Resources/Prototypes/Damage/modifier_sets.yml index 31dd47a9e16..a6798e39cfe 100644 --- a/Resources/Prototypes/Damage/modifier_sets.yml +++ b/Resources/Prototypes/Damage/modifier_sets.yml @@ -336,3 +336,16 @@ flatReductions: # can't punch the endoskeleton to death Blunt: 5 + +- type: damageModifierSet + id: HalfSpirit + coefficients: + Cold: 0.5 + Shock: 0.75 + Blunt: 0.75 + Slash: 0.75 + Piercing: 0.75 + Heat: 1.25 + Holy: 1.5 + flatReductions: + Cold: 3 diff --git a/Resources/Prototypes/DeltaV/Access/justice.yml b/Resources/Prototypes/DeltaV/Access/justice.yml new file mode 100644 index 00000000000..33a2844ed20 --- /dev/null +++ b/Resources/Prototypes/DeltaV/Access/justice.yml @@ -0,0 +1,20 @@ +- type: accessLevel + id: ChiefJustice + name: id-card-access-level-cj + +- type: accessLevel + id: Justice + name: id-card-access-level-justice + +- type: accessLevel + id: Prosecutor + name: id-card-access-level-prosecutor + +- type: accessGroup + id: Justice + tags: + - Justice + - Prosecutor + - ChiefJustice + - Lawyer + diff --git a/Resources/Prototypes/DeltaV/Access/misc.yml b/Resources/Prototypes/DeltaV/Access/misc.yml index df3f60a4f88..ad42935662b 100644 --- a/Resources/Prototypes/DeltaV/Access/misc.yml +++ b/Resources/Prototypes/DeltaV/Access/misc.yml @@ -47,3 +47,6 @@ - Musician - Reporter - Zookeeper + - Justice + - Prosecutor + diff --git a/Resources/Prototypes/DeltaV/Catalog/Fills/Backpacks/StarterGear/backpack.yml b/Resources/Prototypes/DeltaV/Catalog/Fills/Backpacks/StarterGear/backpack.yml index dcde538f9cd..b73c1d5b4fc 100644 --- a/Resources/Prototypes/DeltaV/Catalog/Fills/Backpacks/StarterGear/backpack.yml +++ b/Resources/Prototypes/DeltaV/Catalog/Fills/Backpacks/StarterGear/backpack.yml @@ -18,7 +18,6 @@ components: - type: StorageFill contents: - - id: BoxSurvivalMedical - id: EmergencyRollerBedSpawnFolded - id: BodyBagFolded - id: Portafib @@ -30,7 +29,6 @@ components: - type: StorageFill contents: - - id: BoxSurvivalMedical - id: RubberStampPsychologist @@ -41,5 +39,4 @@ components: - type: StorageFill contents: - - id: BoxSurvival - id: RubberStampLawyer diff --git a/Resources/Prototypes/DeltaV/Catalog/Fills/Backpacks/StarterGear/duffelbag.yml b/Resources/Prototypes/DeltaV/Catalog/Fills/Backpacks/StarterGear/duffelbag.yml index 4aa423e0aed..50ef77a316f 100644 --- a/Resources/Prototypes/DeltaV/Catalog/Fills/Backpacks/StarterGear/duffelbag.yml +++ b/Resources/Prototypes/DeltaV/Catalog/Fills/Backpacks/StarterGear/duffelbag.yml @@ -5,7 +5,6 @@ components: - type: StorageFill contents: - - id: BoxSurvivalMedical - id: EmergencyRollerBedSpawnFolded - id: BodyBagFolded - id: Portafib @@ -17,7 +16,6 @@ components: - type: StorageFill contents: - - id: BoxSurvivalMedical - id: RubberStampPsychologist @@ -28,5 +26,4 @@ components: - type: StorageFill contents: - - id: BoxSurvival - id: RubberStampLawyer diff --git a/Resources/Prototypes/DeltaV/Catalog/Fills/Backpacks/StarterGear/satchel.yml b/Resources/Prototypes/DeltaV/Catalog/Fills/Backpacks/StarterGear/satchel.yml index 1ef1441b3b9..99a770e37e1 100644 --- a/Resources/Prototypes/DeltaV/Catalog/Fills/Backpacks/StarterGear/satchel.yml +++ b/Resources/Prototypes/DeltaV/Catalog/Fills/Backpacks/StarterGear/satchel.yml @@ -5,7 +5,6 @@ components: - type: StorageFill contents: - - id: BoxSurvivalMedical - id: EmergencyRollerBedSpawnFolded - id: BodyBagFolded - id: Portafib @@ -17,7 +16,6 @@ components: - type: StorageFill contents: - - id: BoxSurvivalMedical - id: RubberStampPsychologist @@ -28,5 +26,4 @@ components: - type: StorageFill contents: - - id: BoxSurvival - id: RubberStampLawyer diff --git a/Resources/Prototypes/DeltaV/Catalog/Fills/Boxes/general.yml b/Resources/Prototypes/DeltaV/Catalog/Fills/Boxes/general.yml index 804a4727ee3..0fa57aa8803 100644 --- a/Resources/Prototypes/DeltaV/Catalog/Fills/Boxes/general.yml +++ b/Resources/Prototypes/DeltaV/Catalog/Fills/Boxes/general.yml @@ -16,3 +16,29 @@ whitelist: components: - EncryptionKey + +- type: entity + name: justice encryption key box + parent: BoxEncryptionKeyPassenger + id: BoxEncryptionKeyJustice + description: A box of spare encryption keys. + components: + - type: StorageFill + contents: + - id: EncryptionKeyJustice + amount: 4 + +#- type: entity +# name: syndicate radio implanter box +# parent: BoxCardboard +# id: BoxSyndicateRadioImplanter +# description: Contains cranial radio implants favored by Syndicate agents. +# components: +# - type: Sprite +# layers: +# - state: box_of_doom +# - state: implant +# - type: StorageFill +# contents: +# - id: SyndicateRadioImplanter +# amount: 2 diff --git a/Resources/Prototypes/DeltaV/Catalog/Fills/Boxes/pda.yml b/Resources/Prototypes/DeltaV/Catalog/Fills/Boxes/pda.yml index b6140daae59..b8aff63ece5 100644 --- a/Resources/Prototypes/DeltaV/Catalog/Fills/Boxes/pda.yml +++ b/Resources/Prototypes/DeltaV/Catalog/Fills/Boxes/pda.yml @@ -74,3 +74,16 @@ amount: 1 - id: MailCarrierPDA amount: 1 + +- type: entity + name: justice PDA box + parent: BoxPDA + id: BoxPDAJustice + description: A box of spare PDA microcomputers for the justice department. + components: + - type: StorageFill + contents: + - id: LawyerPDA + amount: 2 + - id: ProsecutorPDA + - id: ClerkPDA diff --git a/Resources/Prototypes/DeltaV/Catalog/Fills/Lockers/chiefjustice.yml b/Resources/Prototypes/DeltaV/Catalog/Fills/Lockers/chiefjustice.yml new file mode 100644 index 00000000000..0f7eb99d45d --- /dev/null +++ b/Resources/Prototypes/DeltaV/Catalog/Fills/Lockers/chiefjustice.yml @@ -0,0 +1,21 @@ +- type: entity + parent: LockerChiefJustice + id: LockerChiefJusticeFilled + suffix: Filled + components: + - type: StorageFill + contents: + - id: ClothingHeadsetAltJustice + - id: ClothingNeckCloakCJ + - id: ClothingUniformJumpsuitChiefJusticeFormal + - id: ClothingUniformJumpsuitChiefJusticeWhite + - id: PaperStationWarrant + amount: 10 + - id: BoxPDAJustice + - id: BoxEncryptionKeyJustice + - id: ChiefJusticeIDCard + - id: DoorRemoteJustice + - id: Gavel + - id: RubberStampChiefJustice + - id: LunchboxCommandFilledRandom # Delta-V Lunchboxes! + prob: 0.3 diff --git a/Resources/Prototypes/DeltaV/Catalog/Fills/Lockers/clerk.yml b/Resources/Prototypes/DeltaV/Catalog/Fills/Lockers/clerk.yml new file mode 100644 index 00000000000..9e48c28c706 --- /dev/null +++ b/Resources/Prototypes/DeltaV/Catalog/Fills/Lockers/clerk.yml @@ -0,0 +1,14 @@ +- type: entity + parent: LockerClerk + id: LockerClerkFilled + suffix: Filled + components: + - type: StorageFill + contents: + - id: ClothingOuterClerkVest + - id: PaperStationWarrant + amount: 10 + - id: BoxEncryptionKeyJustice + - id: ClerkIDCard + - id: RubberStampNotary + diff --git a/Resources/Prototypes/DeltaV/Device/devicenet_frequencies.yml b/Resources/Prototypes/DeltaV/Device/devicenet_frequencies.yml new file mode 100644 index 00000000000..34f213077c7 --- /dev/null +++ b/Resources/Prototypes/DeltaV/Device/devicenet_frequencies.yml @@ -0,0 +1,5 @@ +- type: deviceFrequency + id: SurveillanceCameraJustice + name: device-frequency-prototype-name-surveillance-camera-justice + frequency: 1420 + diff --git a/Resources/Prototypes/DeltaV/Entities/Clothing/Back/backpacks.yml/backpacks.yml b/Resources/Prototypes/DeltaV/Entities/Clothing/Back/backpacks.yml/backpacks.yml index 38bbd956868..2fbc17d2585 100644 --- a/Resources/Prototypes/DeltaV/Entities/Clothing/Back/backpacks.yml/backpacks.yml +++ b/Resources/Prototypes/DeltaV/Entities/Clothing/Back/backpacks.yml/backpacks.yml @@ -5,7 +5,6 @@ components: - type: StorageFill contents: - - id: BoxSurvivalSecurity - id: EmergencyRollerBedSpawnFolded - id: BodyBagFolded - id: Portafib diff --git a/Resources/Prototypes/DeltaV/Entities/Clothing/Back/backpacks.yml/duffelbag.yml b/Resources/Prototypes/DeltaV/Entities/Clothing/Back/backpacks.yml/duffelbag.yml index caf5aa3515b..bcd12b5e1b1 100644 --- a/Resources/Prototypes/DeltaV/Entities/Clothing/Back/backpacks.yml/duffelbag.yml +++ b/Resources/Prototypes/DeltaV/Entities/Clothing/Back/backpacks.yml/duffelbag.yml @@ -5,7 +5,6 @@ components: - type: StorageFill contents: - - id: BoxSurvivalSecurity - id: EmergencyRollerBedSpawnFolded - id: BodyBagFolded - id: Portafib diff --git a/Resources/Prototypes/DeltaV/Entities/Clothing/Back/backpacks.yml/satchel.yml b/Resources/Prototypes/DeltaV/Entities/Clothing/Back/backpacks.yml/satchel.yml index 9c27500a1f7..31dc027a21e 100644 --- a/Resources/Prototypes/DeltaV/Entities/Clothing/Back/backpacks.yml/satchel.yml +++ b/Resources/Prototypes/DeltaV/Entities/Clothing/Back/backpacks.yml/satchel.yml @@ -5,7 +5,6 @@ components: - type: StorageFill contents: - - id: BoxSurvivalSecurity - id: EmergencyRollerBedSpawnFolded - id: BodyBagFolded - id: Portafib diff --git a/Resources/Prototypes/DeltaV/Entities/Clothing/Ears/headsets.yml b/Resources/Prototypes/DeltaV/Entities/Clothing/Ears/headsets.yml index c65dd62312f..b32cab7b21a 100644 --- a/Resources/Prototypes/DeltaV/Entities/Clothing/Ears/headsets.yml +++ b/Resources/Prototypes/DeltaV/Entities/Clothing/Ears/headsets.yml @@ -42,6 +42,45 @@ sprite: DeltaV/Clothing/Ears/Headsets/syndicate_listening.rsi - type: Clothing sprite: DeltaV/Clothing/Ears/Headsets/syndicate_listening.rsi + +- type: entity + parent: ClothingHeadset + id: ClothingHeadsetJustice + name: justice headset + description: This is used by the justice department. + components: + - type: ContainerFill + containers: + key_slots: + - EncryptionKeyJustice + - EncryptionKeyPrison + - EncryptionKeySecurity + - EncryptionKeyCommon + - type: Sprite + sprite: DeltaV/Clothing/Ears/Headsets/justice.rsi + state: icon + - type: Clothing + sprite: DeltaV/Clothing/Ears/Headsets/justice.rsi + +- type: entity + parent: ClothingHeadset + id: ClothingHeadsetAltJustice + name: chief justice's headset + description: The headset used by the chief justice. + components: + - type: ContainerFill + containers: + key_slots: + - EncryptionKeyJustice + - EncryptionKeyPrison + - EncryptionKeySecurity + - EncryptionKeyCommon + - EncryptionKeyCommand + - type: Sprite + sprite: DeltaV/Clothing/Ears/Headsets/justice.rsi + state: icon_alt + - type: Clothing + sprite: DeltaV/Clothing/Ears/Headsets/justice.rsi - type: entity parent: ClothingHeadset @@ -75,3 +114,4 @@ sprite: Clothing/Ears/Headsets/security.rsi - type: Clothing sprite: Clothing/Ears/Headsets/security.rsi + diff --git a/Resources/Prototypes/DeltaV/Entities/Clothing/Head/hats.yml b/Resources/Prototypes/DeltaV/Entities/Clothing/Head/hats.yml index 1c5cef39af1..bdb5ad85d9a 100644 --- a/Resources/Prototypes/DeltaV/Entities/Clothing/Head/hats.yml +++ b/Resources/Prototypes/DeltaV/Entities/Clothing/Head/hats.yml @@ -192,3 +192,15 @@ sprite: DeltaV/Clothing/Head/Hats/beret_corpsman.rsi - type: Clothing sprite: DeltaV/Clothing/Head/Hats/beret_corpsman.rsi + +- type: entity + parent: ClothingHeadBase + id: ClothingHeadHatCJToque + name: chief justice's toque + description: A standard-issue judicial hat. Wigs are old-fashioned anyway. + components: + - type: Sprite + sprite: DeltaV/Clothing/Head/Hats/cj_toque.rsi + - type: Clothing + sprite: DeltaV/Clothing/Head/Hats/cj_toque.rsi + diff --git a/Resources/Prototypes/DeltaV/Entities/Clothing/Neck/cloaks.yml b/Resources/Prototypes/DeltaV/Entities/Clothing/Neck/cloaks.yml index 5ff195cfda8..a5a9200b569 100644 --- a/Resources/Prototypes/DeltaV/Entities/Clothing/Neck/cloaks.yml +++ b/Resources/Prototypes/DeltaV/Entities/Clothing/Neck/cloaks.yml @@ -31,3 +31,15 @@ sprite: DeltaV/Clothing/Neck/Cloaks/salvage.rsi - type: Clothing sprite: DeltaV/Clothing/Neck/Cloaks/salvage.rsi + +- type: entity + parent: ClothingNeckBase + id: ClothingNeckCloakCJ + name: chief justice's cloak + description: A hefty cloak adorned with a modest insignia and grand fur trim. + components: + - type: Sprite + sprite: DeltaV/Clothing/Neck/Cloaks/cjcloak.rsi + - type: StealTarget + stealGroup: HeadCloak + diff --git a/Resources/Prototypes/DeltaV/Entities/Clothing/Neck/misc.yml b/Resources/Prototypes/DeltaV/Entities/Clothing/Neck/misc.yml new file mode 100644 index 00000000000..7ec38bb1441 --- /dev/null +++ b/Resources/Prototypes/DeltaV/Entities/Clothing/Neck/misc.yml @@ -0,0 +1,13 @@ +- type: entity + parent: ClothingNeckBase + id: ClothingNeckProsecutorbadge + name: prosecutor badge + description: A badge to show that the owner is a 'legitimate' prosecutor who passed the NT bar exam required to practice law. + components: + - type: Sprite + sprite: DeltaV/Clothing/Neck/Misc/prosecutorbadge.rsi + - type: Clothing + sprite: DeltaV/Clothing/Neck/Misc/prosecutorbadge.rsi + - type: TypingIndicatorClothing + proto: lawyer + diff --git a/Resources/Prototypes/DeltaV/Entities/Clothing/OuterClothing/coats.yml b/Resources/Prototypes/DeltaV/Entities/Clothing/OuterClothing/coats.yml index e0a38b169f0..e0f3e7f298f 100644 --- a/Resources/Prototypes/DeltaV/Entities/Clothing/OuterClothing/coats.yml +++ b/Resources/Prototypes/DeltaV/Entities/Clothing/OuterClothing/coats.yml @@ -123,3 +123,17 @@ sprite: DeltaV/Clothing/OuterClothing/Coats/repcoat.rsi - type: TemperatureProtection coefficient: 0.1 + +- type: entity + parent: ClothingOuterStorageBase + id: ClothingOuterChiefJustice + name: chief justice's robes + description: Heavy black robes with magenta and gold trim. It smells old. + components: + - type: Sprite + sprite: DeltaV/Clothing/OuterClothing/Coats/cjrobe.rsi + - type: Clothing + sprite: DeltaV/Clothing/OuterClothing/Coats/cjrobe.rsi + - type: TemperatureProtection + coefficient: 0.1 + diff --git a/Resources/Prototypes/DeltaV/Entities/Clothing/OuterClothing/vests.yml b/Resources/Prototypes/DeltaV/Entities/Clothing/OuterClothing/vests.yml index cdc79584076..445158f89b8 100644 --- a/Resources/Prototypes/DeltaV/Entities/Clothing/OuterClothing/vests.yml +++ b/Resources/Prototypes/DeltaV/Entities/Clothing/OuterClothing/vests.yml @@ -37,3 +37,15 @@ Heat: 0.9 - type: ExplosionResistance damageCoefficient: 0.9 + +- type: entity + parent: ClothingOuterBase + id: ClothingOuterClerkVest + name: clerk's vest + description: a silken magenta vest with a pocket to put your notary stamp. + components: + - type: Sprite + sprite: DeltaV/Clothing/OuterClothing/Vests/clerkvest.rsi + - type: Clothing + sprite: DeltaV/Clothing/OuterClothing/Vests/clerkvest.rsi + diff --git a/Resources/Prototypes/DeltaV/Entities/Clothing/Uniforms/jumpskirts.yml b/Resources/Prototypes/DeltaV/Entities/Clothing/Uniforms/jumpskirts.yml index 4c027637645..9e80bc4ff2f 100644 --- a/Resources/Prototypes/DeltaV/Entities/Clothing/Uniforms/jumpskirts.yml +++ b/Resources/Prototypes/DeltaV/Entities/Clothing/Uniforms/jumpskirts.yml @@ -93,3 +93,37 @@ sprite: DeltaV/Clothing/Uniforms/Jumpskirt/centcom_officer.rsi - type: Clothing sprite: DeltaV/Clothing/Uniforms/Jumpskirt/centcom_officer.rsi + +- type: entity + parent: ClothingUniformBase + id: ClothingUniformJumpskirtChiefJustice + name: chief justice's jumpskirt + description: A fancy black jumpskirt with a lace cravat to make it even more fancy. Proper judicial attire. + components: + - type: Sprite + sprite: DeltaV/Clothing/Uniforms/Jumpskirt/cj.rsi + - type: Clothing + sprite: DeltaV/Clothing/Uniform/Jumpskirt/cj.rsi + +- type: entity + parent: ClothingUniformBase + id: ClothingUniformJumpskirtClerk + name: clerk's dress skirt + description: A modest dress skirt for the person with the power to notarize anything. + components: + - type: Sprite + sprite: DeltaV/Clothing/Uniforms/Jumpskirt/clerk.rsi + - type: Clothing + sprite: DeltaV/Clothing/Uniforms/Jumpskirt/clerk.rsi + +- type: entity + parent: ClothingUniformBase + id: ClothingUniformJumpskirtProsecutor + name: prosecutor's dress skirt + description: A red suit and skirt with a fancy cravat. Perfect for a prosecutor. + components: + - type: Sprite + sprite: DeltaV/Clothing/Uniforms/Jumpskirt/prosecutorred.rsi + - type: Clothing + sprite: DeltaV/Clothing/Uniforms/Jumpskirt/prosecutorred.rsi + diff --git a/Resources/Prototypes/DeltaV/Entities/Clothing/Uniforms/jumpsuits.yml b/Resources/Prototypes/DeltaV/Entities/Clothing/Uniforms/jumpsuits.yml index 99021b47e42..9382502e740 100644 --- a/Resources/Prototypes/DeltaV/Entities/Clothing/Uniforms/jumpsuits.yml +++ b/Resources/Prototypes/DeltaV/Entities/Clothing/Uniforms/jumpsuits.yml @@ -45,8 +45,8 @@ - type: entity parent: ClothingUniformBase id: ClothingUniformJumpsuitSuitBlackMob - name: mobster's attire - description: A crisp red shirt and charcoal slacks. Reminds you of your debts. + name: red suit + description: A crisp red shirt and charcoal slacks. Reminds you of law enforcement. components: - type: Sprite sprite: DeltaV/Clothing/Uniforms/Jumpsuit/suitblackmob.rsi @@ -67,7 +67,7 @@ - type: entity parent: ClothingUniformBase id: ClothingUniformJumpsuitSuitBrownAlt - name: suspicious suit + name: dubious suit description: A crisp grey shirt and chocolate slacks. Reminds you of clandestine operators. components: - type: Sprite @@ -78,8 +78,8 @@ - type: entity parent: ClothingUniformBase id: ClothingUniformJumpsuitSuitBrownMob - name: gangster's attire - description: A crisp red shirt and chocolate slacks. Reminds you of drivebys. + name: mafioso suit + description: A crisp red shirt and chocolate slacks. Reminds you of family. components: - type: Sprite sprite: DeltaV/Clothing/Uniforms/Jumpsuit/suitbrownmob.rsi @@ -111,8 +111,8 @@ - type: entity parent: ClothingUniformBase id: ClothingUniformJumpsuitSuitWhiteMob - name: mafioso's attire - description: A crisp red shirt and ivory slacks. Reminds you of family. + name: gangster suit + description: A crisp red shirt and ivory slacks. Reminds you of organized Japanese crime. components: - type: Sprite sprite: DeltaV/Clothing/Uniforms/Jumpsuit/suitwhitemob.rsi @@ -244,6 +244,50 @@ - type: Clothing sprite: DeltaV/Clothing/Uniforms/Jumpsuit/kilt.rsi +- type: entity + parent: ClothingUniformBase + id: ClothingUniformJumpsuitChiefJustice + name: chief justice's jumpsuit + description: A fancy black jumpsuit with a lace cravat to make it even more fancy. Proper judicial attire. + components: + - type: Sprite + sprite: DeltaV/Clothing/Uniforms/Jumpsuit/cj.rsi + - type: Clothing + sprite: DeltaV/Clothing/Uniforms/Jumpsuit/cj.rsi + +- type: entity + parent: ClothingUniformBase + id: ClothingUniformJumpsuitChiefJusticeFormal + name: chief justice's formal jumpsuit + description: A fancy double-breasted suit with golden accoutrements. Sharp and authoritative. + components: + - type: Sprite + sprite: DeltaV/Clothing/Uniforms/Jumpsuit/cjformal.rsi + - type: Clothing + sprite: DeltaV/Clothing/Uniforms/Jumpsuit/cjformal.rsi + +- type: entity + parent: ClothingUniformBase + id: ClothingUniformJumpsuitChiefJusticeWhite + name: chief justice's white jumpsuit + description: A modest, white office shirt with hard-earned rank epaulets. + components: + - type: Sprite + sprite: DeltaV/Clothing/Uniforms/Jumpsuit/cj_white.rsi + - type: Clothing + sprite: DeltaV/Clothing/Uniforms/Jumpsuit/cj_white.rsi + +- type: entity + parent: ClothingUniformBase + id: ClothingUniformJumpsuitClerk + name: clerk's suit + description: A modest suit for the person with the power to notarize anything. + components: + - type: Sprite + sprite: DeltaV/Clothing/Uniforms/Jumpsuit/clerk.rsi + - type: Clothing + sprite: DeltaV/Clothing/Uniforms/Jumpsuit/clerk.rsi + - type: entity parent: ClothingUniformBase id: ClothingUniformJumpsuitChemShirt @@ -254,3 +298,15 @@ sprite: DeltaV/Clothing/Uniforms/Jumpsuit/chemshirtsuit.rsi - type: Clothing sprite: DeltaV/Clothing/Uniforms/Jumpsuit/chemshirtsuit.rsi + +- type: entity + parent: ClothingUniformBase + id: ClothingUniformJumpsuitProsecutor + name: prosecutor's suit + description: A red suit with a fancy cravat. Perfect for a prosecutor. + components: + - type: Sprite + sprite: DeltaV/Clothing/Uniforms/Jumpsuit/prosecutorred.rsi + - type: Clothing + sprite: DeltaV/Clothing/Uniforms/Jumpsuit/prosecutorred.rsi + diff --git a/Resources/Prototypes/DeltaV/Entities/Markers/Spawners/ghost_roles.yml b/Resources/Prototypes/DeltaV/Entities/Markers/Spawners/ghost_roles.yml index 1e014aab734..8534b737888 100644 --- a/Resources/Prototypes/DeltaV/Entities/Markers/Spawners/ghost_roles.yml +++ b/Resources/Prototypes/DeltaV/Entities/Markers/Spawners/ghost_roles.yml @@ -32,8 +32,8 @@ description: ghost-role-information-listeningop-description rules: ghost-role-information-listeningop-rules requirements: # Worth considering these numbers for the goal of making sure someone willing to MRP takes this. - - !type:OverallPlaytimeRequirement - time: 259200 # 72 hours + - !type:CharacterOverallTimeRequirement + min: 259200 # 72 hours - !type:DepartmentTimeRequirement department: Security time: 40000 # 11.1 hours diff --git a/Resources/Prototypes/DeltaV/Entities/Markers/Spawners/jobs.yml b/Resources/Prototypes/DeltaV/Entities/Markers/Spawners/jobs.yml index e662ecca743..12747abbcfb 100644 --- a/Resources/Prototypes/DeltaV/Entities/Markers/Spawners/jobs.yml +++ b/Resources/Prototypes/DeltaV/Entities/Markers/Spawners/jobs.yml @@ -13,3 +13,55 @@ state: medical - sprite: Mobs/Silicon/chassis.rsi state: medical_e + +- type: entity + id: SpawnPointChiefJustice + parent: SpawnPointJobBase + name: chiefjustice + components: + - type: SpawnPoint + job_id: ChiefJustice + - type: Sprite + layers: + - state: green + - sprite: DeltaV/Markers/jobs.rsi + state: chiefjustice + +- type: entity + id: SpawnPointClerk + parent: SpawnPointJobBase + name: clerk + components: + - type: SpawnPoint + job_id: Clerk + - type: Sprite + layers: + - state: green + - sprite: DeltaV/Markers/jobs.rsi + state: clerk + +- type: entity + id: SpawnPointProsecutor + parent: SpawnPointJobBase + name: prosecutor + components: + - type: SpawnPoint + job_id: Prosecutor + - type: Sprite + layers: + - state: green + - sprite: DeltaV/Markers/jobs.rsi + state: prosecutor + +- type: entity + id: SpawnPointCourier + parent: SpawnPointJobBase + name: courier + components: + - type: SpawnPoint + job_id: Courier + - type: Sprite + layers: + - state: green + - sprite: DeltaV/Markers/jobs.rsi + state: courier diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/vulpkanin.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/vulpkanin.yml index 502ddf35498..69bbb2bd96d 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/vulpkanin.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/vulpkanin.yml @@ -280,32 +280,32 @@ state: vulp-fade - type: marking - id: VulpTailTip + id: VulpTailAnimated bodyPart: Tail markingCategory: Tail - speciesRestriction: [Vulpkanin] + speciesRestriction: [] sprites: - sprite: DeltaV/Mobs/Customization/Vulpkanin/tail_markings.rsi - state: vulp + state: vulp_wag - sprite: DeltaV/Mobs/Customization/Vulpkanin/tail_markings.rsi - state: vulp-tip + state: vulp_wag-tip #fade - type: marking - id: VulpTailWag + id: VulpTailTip bodyPart: Tail markingCategory: Tail speciesRestriction: [Vulpkanin] sprites: - sprite: DeltaV/Mobs/Customization/Vulpkanin/tail_markings.rsi - state: vulp_wag + state: vulp - sprite: DeltaV/Mobs/Customization/Vulpkanin/tail_markings.rsi - state: vulp_wag-tip #fade + state: vulp-tip - type: marking - id: VulpTailWagTip + id: VulpTailTipAnimated bodyPart: Tail markingCategory: Tail - speciesRestriction: [Vulpkanin] + speciesRestriction: [] sprites: - sprite: DeltaV/Mobs/Customization/Vulpkanin/tail_markings.rsi state: vulp_wag @@ -357,32 +357,32 @@ state: fox-fade - type: marking - id: VulpTailFoxTip + id: VulpTailFoxAnimated bodyPart: Tail markingCategory: Tail - speciesRestriction: [Vulpkanin] + speciesRestriction: [] sprites: - sprite: DeltaV/Mobs/Customization/Vulpkanin/tail_markings.rsi - state: fox + state: fox_wag - sprite: DeltaV/Mobs/Customization/Vulpkanin/tail_markings.rsi - state: fox-tip + state: fox_wag-fade - type: marking - id: VulpTailFoxWag + id: VulpTailFoxTip bodyPart: Tail markingCategory: Tail speciesRestriction: [Vulpkanin] sprites: - sprite: DeltaV/Mobs/Customization/Vulpkanin/tail_markings.rsi - state: fox_wag + state: fox - sprite: DeltaV/Mobs/Customization/Vulpkanin/tail_markings.rsi - state: fox_wag-fade + state: fox-tip - type: marking - id: VulpTailFoxWagTip + id: VulpTailFoxTipAnimated bodyPart: Tail markingCategory: Tail - speciesRestriction: [Vulpkanin] + speciesRestriction: [] sprites: - sprite: DeltaV/Mobs/Customization/Vulpkanin/tail_markings.rsi state: fox_wag @@ -399,10 +399,10 @@ state: bushfluff - type: marking - id: VulpTailBushyWag + id: VulpTailBushyAnimated bodyPart: Tail markingCategory: Tail - speciesRestriction: [Vulpkanin] + speciesRestriction: [] sprites: - sprite: DeltaV/Mobs/Customization/Vulpkanin/tail_markings.rsi state: bushfluff_wag @@ -417,19 +417,28 @@ state: coyote - type: marking - id: VulpTailCoyoteWag + id: VulpTailCoyoteAnimated bodyPart: Tail markingCategory: Tail - speciesRestriction: [Vulpkanin] + speciesRestriction: [] sprites: - sprite: DeltaV/Mobs/Customization/Vulpkanin/tail_markings.rsi state: coyote_wag - type: marking - id: VulpTailCorgiWag + id: VulpTailCorgi bodyPart: Tail markingCategory: Tail speciesRestriction: [Vulpkanin] + sprites: + - sprite: DeltaV/Mobs/Customization/Vulpkanin/tail_markings.rsi + state: corgi + +- type: marking + id: VulpTailCorgiAnimated + bodyPart: Tail + markingCategory: Tail + speciesRestriction: [] sprites: - sprite: DeltaV/Mobs/Customization/Vulpkanin/tail_markings.rsi state: corgi_wag @@ -502,10 +511,19 @@ state: fluffy - type: marking - id: VulpTailDalmatianWag + id: VulpTailDalmatian bodyPart: Tail markingCategory: Tail speciesRestriction: [Vulpkanin] + sprites: + - sprite: DeltaV/Mobs/Customization/Vulpkanin/tail_markings.rsi + state: dalmatian + +- type: marking + id: VulpTailDalmatianAnimated + bodyPart: Tail + markingCategory: Tail + speciesRestriction: [] sprites: - sprite: DeltaV/Mobs/Customization/Vulpkanin/tail_markings.rsi state: dalmatian_wag diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/vulpkanin.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/vulpkanin.yml index 9e4f80bfb52..0bcd71fbadb 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/vulpkanin.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/vulpkanin.yml @@ -97,6 +97,7 @@ Female: FemaleVulpkanin Unsexed: MaleVulpkanin - type: DogVision + - type: Wagging - type: LanguageKnowledge speaks: - GalacticCommon diff --git a/Resources/Prototypes/DeltaV/Entities/Objects/Consumable/Food/Containers/lunchbox.yml b/Resources/Prototypes/DeltaV/Entities/Objects/Consumable/Food/Containers/lunchbox.yml index 46e689615b3..c7aae33c76d 100644 --- a/Resources/Prototypes/DeltaV/Entities/Objects/Consumable/Food/Containers/lunchbox.yml +++ b/Resources/Prototypes/DeltaV/Entities/Objects/Consumable/Food/Containers/lunchbox.yml @@ -18,9 +18,9 @@ - type: Storage maxItemSize: Normal grid: - - 0,0,1,1 - - 3,0,1,1 - - 4,0,4,1 + - 0,0,1,2 + - 3,0,1,2 + - 4,0,4,2 - type: PhysicalComposition materialComposition: Plastic: 100 diff --git a/Resources/Prototypes/DeltaV/Entities/Objects/Devices/door_remote.yml b/Resources/Prototypes/DeltaV/Entities/Objects/Devices/door_remote.yml new file mode 100644 index 00000000000..27fa0a36530 --- /dev/null +++ b/Resources/Prototypes/DeltaV/Entities/Objects/Devices/door_remote.yml @@ -0,0 +1,15 @@ +- type: entity + parent: DoorRemoteDefault + id: DoorRemoteJustice + name: justice door remote + components: + - type: Sprite + layers: + - state: door_remotebase + - state: door_remotelightscolour + color: "#6b2833" + - state: door_remotescreencolour + color: "#6b2833" + - type: Access + groups: + - Justice diff --git a/Resources/Prototypes/DeltaV/Entities/Objects/Devices/encryption_keys.yml b/Resources/Prototypes/DeltaV/Entities/Objects/Devices/encryption_keys.yml index c41c235c136..67b723e4310 100644 --- a/Resources/Prototypes/DeltaV/Entities/Objects/Devices/encryption_keys.yml +++ b/Resources/Prototypes/DeltaV/Entities/Objects/Devices/encryption_keys.yml @@ -1,3 +1,19 @@ +- type: entity + parent: EncryptionKey + id: EncryptionKeyJustice + name: justice encryption key + description: An encryption key used by the justice department. + components: + - type: EncryptionKey + channels: + - Justice + defaultChannel: Justice + - type: Sprite + layers: + - state: crypt_gray + - sprite: DeltaV/Objects/Devices/encryption_keys.rsi + state: justice_label + - type: entity parent: EncryptionKey id: EncryptionKeyPrison diff --git a/Resources/Prototypes/DeltaV/Entities/Objects/Devices/pda.yml b/Resources/Prototypes/DeltaV/Entities/Objects/Devices/pda.yml index d9607390cd7..d5f121bb0be 100644 --- a/Resources/Prototypes/DeltaV/Entities/Objects/Devices/pda.yml +++ b/Resources/Prototypes/DeltaV/Entities/Objects/Devices/pda.yml @@ -41,6 +41,123 @@ scanningEndSound: path: "/Audio/Items/Medical/healthscanner.ogg" +- type: entity + parent: BasePDA + id: ChiefJusticePDA + name: chief justice PDA + description: Whosoever bears this PDA is the law. + components: + - type: Sprite + sprite: DeltaV/Objects/Devices/pda.rsi + layers: + - map: [ "enum.PdaVisualLayers.Base" ] + - state: "light_overlay" + map: [ "enum.PdaVisualLayers.Flashlight" ] + shader: "unshaded" + visible: false + - state: "id_overlay" + map: [ "enum.PdaVisualLayers.IdLight" ] + shader: "unshaded" + visible: false + - type: Pda + id: ChiefJusticeIDCard + state: pda-chiefjustice + penSlot: + startingItem: LuxuryPen + priority: -1 + whitelist: + tags: + - Write + - type: PdaBorderColor + borderColor: "#470823" + - type: Icon + sprite: DeltaV/Objects/Devices/pda.rsi + state: pda-chiefjustice + - type: CartridgeLoader + preinstalled: + - CrewManifestCartridge + - NotekeeperCartridge + - NewsReaderCartridge + - CrimeAssistCartridge + +- type: entity + parent: BasePDA + id: ClerkPDA + name: clerk PDA + description: It has the stamp to prove it's been officially notarized! + components: + - type: Sprite + sprite: DeltaV/Objects/Devices/pda.rsi + layers: + - map: [ "enum.PdaVisualLayers.Base" ] + - state: "light_overlay" + map: [ "enum.PdaVisualLayers.Flashlight" ] + shader: "unshaded" + visible: false + - state: "id_overlay" + map: [ "enum.PdaVisualLayers.IdLight" ] + shader: "unshaded" + visible: false + - type: Pda + id: ClerkIDCard + state: pda-clerk + penSlot: + startingItem: LuxuryPen + priority: -1 + whitelist: + tags: + - Write + - type: PdaBorderColor + borderColor: "#611528" + - type: Icon + sprite: DeltaV/Objects/Devices/pda.rsi + state: pda-clerk + - type: CartridgeLoader + preinstalled: + - CrewManifestCartridge + - NotekeeperCartridge + - NewsReaderCartridge + - CrimeAssistCartridge + +- type: entity + parent: BasePDA + id: ProsecutorPDA + name: prosecutor PDA + description: Sharp. Looks like it could prosecute you all on its own. + components: + - type: Sprite + sprite: DeltaV/Objects/Devices/pda.rsi + layers: + - map: [ "enum.PdaVisualLayers.Base" ] + - state: "light_overlay" + map: [ "enum.PdaVisualLayers.Flashlight" ] + shader: "unshaded" + visible: false + - state: "id_overlay" + map: [ "enum.PdaVisualLayers.IdLight" ] + shader: "unshaded" + visible: false + - type: Pda + id: ProsecutorIDCard + state: pda-prosecutor + penSlot: + startingItem: LuxuryPen + priority: -1 + whitelist: + tags: + - Write + - type: PdaBorderColor + borderColor: "#6f6192" + - type: Icon + sprite: DeltaV/Objects/Devices/pda.rsi + state: pda-prosecutor + - type: CartridgeLoader # DeltaV - Crime Assist + preinstalled: + - CrewManifestCartridge + - NotekeeperCartridge + - NewsReaderCartridge + - CrimeAssistCartridge + - type: entity parent: SyndiPDA id: SyndiListeningPostPDA diff --git a/Resources/Prototypes/DeltaV/Entities/Objects/Devices/station_beacon.yml b/Resources/Prototypes/DeltaV/Entities/Objects/Devices/station_beacon.yml index d1e26bf27fb..bd3975767ba 100644 --- a/Resources/Prototypes/DeltaV/Entities/Objects/Devices/station_beacon.yml +++ b/Resources/Prototypes/DeltaV/Entities/Objects/Devices/station_beacon.yml @@ -134,3 +134,28 @@ components: - type: NavMapBeacon text: station-beacon-corpsman + +#Justice +- type: entity + parent: DefaultStationBeacon + id: DefaultStationBeaconJustice + suffix: Justice + components: + - type: NavMapBeacon + text: station-beacon-justice + +- type: entity + parent: DefaultStationBeaconJustice + id: DefaultStationBeaconChiefJustice + suffix: Chief Justice + components: + - type: NavMapBeacon + text: station-beacon-chiefjustice + +- type: entity + parent: DefaultStationBeaconJustice + id: DefaultStationBeaconProsecutor + suffix: Prosecutor + components: + - type: NavMapBeacon + text: station-beacon-prosecutor diff --git a/Resources/Prototypes/DeltaV/Entities/Objects/Misc/paper.yml b/Resources/Prototypes/DeltaV/Entities/Objects/Misc/paper.yml new file mode 100644 index 00000000000..53f4d188d40 --- /dev/null +++ b/Resources/Prototypes/DeltaV/Entities/Objects/Misc/paper.yml @@ -0,0 +1,25 @@ +- type: entity + name: station warrant + parent: Paper + id: PaperStationWarrant + description: 'A paper warrant issued by the justice department.' + components: + - type: Sprite + sprite: Objects/Misc/bureaucracy.rsi + layers: + - state: paper + color: "#e0bc99" + - state: paper_words + map: ["enum.PaperVisualLayers.Writing"] + color: "#e0bc99" + visible: false + - state: paper_stamp-generic + map: ["enum.PaperVisualLayers.Stamp"] + visible: false + - type: PaperVisuals + headerImagePath: "/Textures/DeltaV/Interface/Paper/paper_heading_warrant.svg.200dpi.png" + headerMargin: 0.0, 0.0, 10.0, 16.0 + backgroundImagePath: "/Textures/Interface/Paper/paper_background_default.svg.96dpi.png" + backgroundModulate: "#e0bc99" + backgroundPatchMargin: 16.0, 16.0, 16.0, 16.0 + contentMargin: 32.0, 16.0, 32.0, 0.0 diff --git a/Resources/Prototypes/DeltaV/Entities/Objects/Misc/rubber_stamp.yml b/Resources/Prototypes/DeltaV/Entities/Objects/Misc/rubber_stamp.yml index 2494de534e4..764d053393e 100644 --- a/Resources/Prototypes/DeltaV/Entities/Objects/Misc/rubber_stamp.yml +++ b/Resources/Prototypes/DeltaV/Entities/Objects/Misc/rubber_stamp.yml @@ -25,3 +25,33 @@ - type: Sprite sprite: DeltaV/Objects/Misc/stamps.rsi state: stamp-lawyer + +- type: entity + name: notary stamp + parent: RubberStampBase + id: RubberStampNotary + description: An old-fashioned seal for marking important documents, made of polished bronze. + components: + - type: Stamp + stampedName: stamp-component-stamped-name-notary + stampedColor: "#a81f3d" + stampState: "paper_stamp-notary" + - type: Sprite + sprite: DeltaV/Objects/Misc/stamps.rsi + state: stamp-notary + - type: StealTarget + stealGroup: RubberStampNotary + +- type: entity + name: chief justice stamp + parent: RubberStampBase + id: RubberStampChiefJustice + components: + - type: Stamp + stampedName: stamp-component-stamped-name-chiefjustice + stampedColor: "#6b2833" + stampState: "paper_stamp-notary" + - type: Sprite + sprite: DeltaV/Objects/Misc/stamps.rsi + state: stamp-cj + diff --git a/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Justice/gavel.yml b/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Justice/gavel.yml new file mode 100644 index 00000000000..52f5286e34a --- /dev/null +++ b/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Justice/gavel.yml @@ -0,0 +1,21 @@ +- type: entity + parent: BaseItem + id: Gavel + name: gavel + description: A hardwood mallet made to keep order in the court. + components: + - type: Sprite + sprite: DeltaV/Objects/Specific/Justice/gavel.rsi + layers: + - state: icon + - type: MeleeWeapon + wideAnimationRotation: -90 + damage: + types: + Blunt: 2 + - type: Item + size: Small + sprite: DeltaV/Objects/Specific/Justice/gavel.rsi + - type: Tag + tags: + - Gavel diff --git a/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Justice/gavelblock.yml b/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Justice/gavelblock.yml new file mode 100644 index 00000000000..a74ae7a9ff7 --- /dev/null +++ b/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Justice/gavelblock.yml @@ -0,0 +1,19 @@ +- type: entity + parent: BaseItem + id: GavelBlock + name: gavel block + description: A hardwood block that, when hit with a gavel, emits an aura of authority. + components: + - type: Sprite + sprite: DeltaV/Objects/Specific/Justice/gavelblock.rsi + layers: + - state: icon + - type: Item + size: Small + - type: Clickable + - type: EmitSoundOnInteractUsing + sound: + path: /Audio/DeltaV/Items/gavel.ogg + whitelist: + tags: + - Gavel diff --git a/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Justice/trialtimer.yml b/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Justice/trialtimer.yml new file mode 100644 index 00000000000..3e847b3a843 --- /dev/null +++ b/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Justice/trialtimer.yml @@ -0,0 +1,24 @@ +- type: entity + id: TrialTimer + parent: SignalTimer + name: trial timer + description: A fancy timer with a screen, designed to keep trials within their time limit. + components: + - type: SignalTimer + canEditLabel: true + - type: TextScreenVisuals + color: "#b03060" + textOffset: 1,8 + timerOffset: 1,8 + textLength: 5 + rows: 1 + - type: Sprite + drawdepth: SmallObjects + sprite: DeltaV/Objects/Specific/Justice/trialtimer.rsi + state: trialtimer + noRot: true + - type: Construction + graph: Timer + node: screen + + diff --git a/Resources/Prototypes/DeltaV/Entities/Structures/Doors/Airlocks/access.yml b/Resources/Prototypes/DeltaV/Entities/Structures/Doors/Airlocks/access.yml index fc9f2902ad0..f6e7bcf2577 100644 --- a/Resources/Prototypes/DeltaV/Entities/Structures/Doors/Airlocks/access.yml +++ b/Resources/Prototypes/DeltaV/Entities/Structures/Doors/Airlocks/access.yml @@ -15,6 +15,88 @@ - type: AccessReader access: [["Mantis"]] +- type: entity + parent: AirlockCommand + id: AirlockChiefJusticeLocked + suffix: Chief Justice, Locked + components: + - type: ContainerFill + containers: + board: [ DoorElectronicsChiefJustice ] + +- type: entity + parent: AirlockCommandGlass + id: AirlockChiefJusticeGlassLocked + suffix: ChiefJustice, Locked + components: + - type: ContainerFill + containers: + board: [ DoorElectronicsChiefJustice ] + +- type: entity + parent: AirlockJustice + id: AirlockJusticeLocked + suffix: Justice, Locked + components: + - type: ContainerFill + containers: + board: [ DoorElectronicsJustice ] + +- type: entity + parent: AirlockJusticeGlass + id: AirlockJusticeGlassLocked + suffix: Justice, Locked + components: + - type: ContainerFill + containers: + board: [ DoorElectronicsJustice ] + +- type: entity + parent: AirlockJustice + id: AirlockProsecutorLocked + suffix: Prosecutor, Locked + components: + - type: ContainerFill + containers: + board: [ DoorElectronicsProsecutor ] + +- type: entity + parent: AirlockJusticeGlass + id: AirlockProsecutorGlassLocked + suffix: Prosecutor, Locked + components: + - type: ContainerFill + containers: + board: [ DoorElectronicsProsecutor ] + +# Maintenance +- type: entity + parent: AirlockMaint + id: AirlockMaintChiefJusticeLocked + suffix: ChiefJustice, Locked + components: + - type: ContainerFill + containers: + board: [ DoorElectronicsChiefJustice ] + +- type: entity + parent: AirlockMaint + id: AirlockMaintJusticeLocked + suffix: Justice, Locked + components: + - type: ContainerFill + containers: + board: [ DoorElectronicsJustice ] + +- type: entity + parent: AirlockMaint + id: AirlockMaintProsecutorLocked + suffix: Prosecutor, Locked + components: + - type: ContainerFill + containers: + board: [ DoorElectronicsProsecutor ] + - type: entity parent: AirlockSecurity id: AirlockCorpsmanLocked diff --git a/Resources/Prototypes/DeltaV/Entities/Structures/Doors/Airlocks/airlocks.yml b/Resources/Prototypes/DeltaV/Entities/Structures/Doors/Airlocks/airlocks.yml new file mode 100644 index 00000000000..93a8cec851a --- /dev/null +++ b/Resources/Prototypes/DeltaV/Entities/Structures/Doors/Airlocks/airlocks.yml @@ -0,0 +1,22 @@ +- type: entity + parent: Airlock + id: AirlockJustice + suffix: Justice + components: + - type: Sprite + sprite: DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi + - type: PaintableAirlock + department: Justice + +# Glass + +- type: entity + parent: AirlockGlass + id: AirlockJusticeGlass + suffix: Justice + components: + - type: Sprite + sprite: DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi + - type: PaintableAirlock + department: Justice + diff --git a/Resources/Prototypes/DeltaV/Entities/Structures/Doors/Windoors/windoor.yml b/Resources/Prototypes/DeltaV/Entities/Structures/Doors/Windoors/windoor.yml index d27a8d8e70e..07938a3bf3c 100644 --- a/Resources/Prototypes/DeltaV/Entities/Structures/Doors/Windoors/windoor.yml +++ b/Resources/Prototypes/DeltaV/Entities/Structures/Doors/Windoors/windoor.yml @@ -21,3 +21,39 @@ components: - type: AccessReader access: [["Paramedic"]] + +- type: entity + parent: WindoorSecure + id: WindoorSecureChiefJusticeLocked + suffix: ChiefJustice, Locked + components: + - type: ContainerFill + containers: + board: [ DoorElectronicsChiefJustice ] + +- type: entity + parent: WindoorSecure + id: WindoorSecureJusticeLocked + suffix: Justice, Locked + components: + - type: ContainerFill + containers: + board: [ DoorElectronicsJustice ] + +- type: entity + parent: WindoorSecure + id: WindoorSecureProsecutorLocked + suffix: Prosecutor, Locked + components: + - type: ContainerFill + containers: + board: [ DoorElectronicsProsecutor ] + +- type: entity + parent: WindoorSecure + id: WindoorSecureLawyerLocked + suffix: Lawyer, Locked + components: + - type: ContainerFill + containers: + board: [ DoorElectronicsLawyer ] diff --git a/Resources/Prototypes/DeltaV/Entities/Structures/Storage/Closets/Lockers/lockers.yml b/Resources/Prototypes/DeltaV/Entities/Structures/Storage/Closets/Lockers/lockers.yml new file mode 100644 index 00000000000..b49002ab22b --- /dev/null +++ b/Resources/Prototypes/DeltaV/Entities/Structures/Storage/Closets/Lockers/lockers.yml @@ -0,0 +1,25 @@ +- type: entity + id: LockerChiefJustice + parent: LockerBaseSecure + name: chief justice's locker + components: + - type: Appearance + - type: EntityStorageVisuals + stateBaseClosed: cj + stateDoorOpen: cj_open + stateDoorClosed: cj_door + - type: AccessReader + access: [["ChiefJustice"]] + +- type: entity + id: LockerClerk + parent: LockerBaseSecure + name: clerk's locker + components: + - type: Appearance + - type: EntityStorageVisuals + stateBaseClosed: clerk + stateDoorOpen: clerk_open + stateDoorClosed: clerk_door + - type: AccessReader + access: [["Justice"]] diff --git a/Resources/Prototypes/DeltaV/Entities/Structures/Wallmounts/Signs/signs.yml b/Resources/Prototypes/DeltaV/Entities/Structures/Wallmounts/Signs/signs.yml index 6129ff6c413..3b5329e230c 100644 --- a/Resources/Prototypes/DeltaV/Entities/Structures/Wallmounts/Signs/signs.yml +++ b/Resources/Prototypes/DeltaV/Entities/Structures/Wallmounts/Signs/signs.yml @@ -17,3 +17,25 @@ - type: Sprite sprite: DeltaV/Structures/Wallmounts/signs.rsi state: direction_mail + +- type: entity + parent: BaseSignDirectional + id: SignDirectionalJustice + name: justice department sign + description: A direction sign, pointing out which way the Justice department is. + components: + - type: Sprite + sprite: DeltaV/Structures/Wallmounts/signs.rsi + state: direction_justice + +- type: entity + parent: BaseSignDirectional + id: SignDirectionaCourt + name: court room sign + description: A direction sign, pointing out which way the court room is. + components: + - type: Sprite + sprite: DeltaV/Structures/Wallmounts/signs.rsi + state: direction_court + + diff --git a/Resources/Prototypes/DeltaV/NPC/roboisseur.yml b/Resources/Prototypes/DeltaV/NPC/roboisseur.yml index 2c0b3aee8a0..e7f0b5bcd09 100644 --- a/Resources/Prototypes/DeltaV/NPC/roboisseur.yml +++ b/Resources/Prototypes/DeltaV/NPC/roboisseur.yml @@ -4,12 +4,22 @@ name: Mr. Butlertron description: It asks for food to deliver to exotic customers across the cosmos. Powered by the latest technology in bluespace food delivery. components: + - type: Anchorable + - type: Pullable - type: Sprite noRot: true drawdepth: Mobs sprite: DeltaV/Structures/Machines/roboisseur.rsi layers: - state: roboisseur-1 + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 1000 + behaviors: + - !type:DoActsBehavior + acts: [ "Destruction" ] - type: Roboisseur - type: Speech speechSounds: Pai diff --git a/Resources/Prototypes/DeltaV/Objectives/stealTargetGroups.yml b/Resources/Prototypes/DeltaV/Objectives/stealTargetGroups.yml index cf7d4f90d68..b3113308735 100644 --- a/Resources/Prototypes/DeltaV/Objectives/stealTargetGroups.yml +++ b/Resources/Prototypes/DeltaV/Objectives/stealTargetGroups.yml @@ -18,3 +18,12 @@ sprite: sprite: DeltaV/Objects/Weapons/Guns/Battery/multiphase_energygun.rsi state: base + +- type: stealTargetGroup + id: RubberStampNotary + name: notary stamp + sprite: + sprite: DeltaV/Objects/Misc/stamps.rsi + state: stamp-notary + + diff --git a/Resources/Prototypes/DeltaV/Objectives/traitor.yml b/Resources/Prototypes/DeltaV/Objectives/traitor.yml index 4fa25f26987..d27ec220fa4 100644 --- a/Resources/Prototypes/DeltaV/Objectives/traitor.yml +++ b/Resources/Prototypes/DeltaV/Objectives/traitor.yml @@ -32,3 +32,16 @@ - type: StealCondition stealGroup: WeaponEnergyGunMultiphase owner: job-name-hos + +- type: entity # Clerk steal objective. + noSpawn: true + parent: BaseTraitorStealObjective + id: ClerkNotaryStealObjective + components: + - type: NotJobRequirement + job: Clerk + - type: StealCondition + stealGroup: RubberStampNotary + owner: job-name-clerk + + diff --git a/Resources/Prototypes/DeltaV/Roles/Jobs/Justice/chief_justice.yml b/Resources/Prototypes/DeltaV/Roles/Jobs/Justice/chief_justice.yml new file mode 100644 index 00000000000..2a879472e8c --- /dev/null +++ b/Resources/Prototypes/DeltaV/Roles/Jobs/Justice/chief_justice.yml @@ -0,0 +1,59 @@ +- type: job + id: ChiefJustice + name: job-name-chief-justice + description: job-description-chief-justice + playTimeTracker: JobChiefJustice + requirements: + - !type:CharacterPlaytimeRequirement + tracker: JobClerk + min: 36000 # 10 hours + - !type:CharacterPlaytimeRequirement + tracker: JobLawyer + min: 36000 # 10 hours + - !type:CharacterPlaytimeRequirement + tracker: JobProsecutor + min: 36000 # 10 hours + - !type:CharacterOverallTimeRequirement + min: 90000 # 25 hours + - !type:WhitelistRequirement # whitelist requirement because I don't want any dingus judges + weight: 20 + startingGear: CJGear + icon: "JobIconChiefJustice" + requireAdminNotify: true + supervisors: job-supervisors-captain + canBeAntag: false + access: + - Command + - ChiefJustice + - Justice + - Security + - Maintenance + - External + special: + - !type:AddImplantSpecial + implants: [ MindShieldImplant ] + - !type:AddComponentSpecial + components: + - type: CommandStaff + - !type:AddComponentSpecial + components: + - type: PsionicBonusChance #Nyano - Summary: makes it more likely to become psionic. + flatBonus: 0.025 + +- type: startingGear + id: CJGear + equipment: + jumpsuit: ClothingUniformJumpsuitChiefJustice + back: ClothingBackpackFilled # TODO- make Justice department bags + shoes: ClothingShoesLeather + head: ClothingHeadHatCJToque + outerClothing: ClothingOuterChiefJustice + id: ChiefJusticePDA + ears: ClothingHeadsetAltJustice + gloves: ClothingHandsGlovesColorWhite + # Todo - pocket1: Gavel + innerClothingSkirt: ClothingUniformJumpskirtChiefJustice + satchel: ClothingBackpackSatchelFilled # TODO- make Justice departmebt bags + duffelbag: ClothingBackpackDuffelFilled + + diff --git a/Resources/Prototypes/DeltaV/Roles/Jobs/Justice/clerk.yml b/Resources/Prototypes/DeltaV/Roles/Jobs/Justice/clerk.yml new file mode 100644 index 00000000000..c2032b67ebe --- /dev/null +++ b/Resources/Prototypes/DeltaV/Roles/Jobs/Justice/clerk.yml @@ -0,0 +1,41 @@ +- type: job + id: Clerk + name: job-name-clerk + description: job-description-clerk + playTimeTracker: JobClerk + antagAdvantage: 2 + requirements: + - !type:CharacterDepartmentTimeRequirement + department: Security + min: 36000 # 10 hrs + - !type:CharacterPlaytimeRequirement + tracker: JobLawyer + min: 36000 # 10 hours + - !type:CharacterPlaytimeRequirement + tracker: JobProsecutor + min: 36000 # 10 hours + + + startingGear: ClerkGear + icon: "JobIconClerk" + requireAdminNotify: true + supervisors: job-supervisors-cj + canBeAntag: false + access: + - Justice + - Security + - Maintenance + +- type: startingGear + id: ClerkGear + equipment: + jumpsuit: ClothingUniformJumpsuitClerk + back: ClothingBackpackFilled + shoes: ClothingShoesBootsLaceup + id: ClerkPDA + ears: ClothingHeadsetJustice + innerClothingSkirt: ClothingUniformJumpskirtClerk + satchel: ClothingBackpackSatchelFilled + duffelbag: ClothingBackpackDuffelFilled + + diff --git a/Resources/Prototypes/DeltaV/Roles/Jobs/Justice/prosecutor.yml b/Resources/Prototypes/DeltaV/Roles/Jobs/Justice/prosecutor.yml new file mode 100644 index 00000000000..e0cebc4417a --- /dev/null +++ b/Resources/Prototypes/DeltaV/Roles/Jobs/Justice/prosecutor.yml @@ -0,0 +1,34 @@ +- type: job + id: Prosecutor + name: job-name-prosecutor + description: job-description-prosecutor + playTimeTracker: JobProsecutor + requirements: + - !type:CharacterOverallTimeRequirement + min: 36000 # 10 hrs + startingGear: ProsecutorGear + icon: "JobIconProsecutor" + supervisors: job-supervisors-cj + access: + - Prosecutor + - Justice + - Security + - Maintenance + +- type: startingGear + id: ProsecutorGear + equipment: + jumpsuit: ClothingUniformJumpsuitProsecutor + neck: ClothingNeckProsecutorbadge + back: ClothingBackpackLawyerFilled + shoes: ClothingShoesBootsLaceup + id: ProsecutorPDA + ears: ClothingHeadsetSecurity + # TODO add copy of space law + inhand: + - BriefcaseBrownFilled + innerClothingSkirt: ClothingUniformJumpskirtProsecutor + satchel: ClothingBackpackSatchelFilled + duffelbag: ClothingBackpackDuffelFilled + + diff --git a/Resources/Prototypes/DeltaV/Roles/Jobs/Medical/medical_borg.yml b/Resources/Prototypes/DeltaV/Roles/Jobs/Medical/medical_borg.yml index e2047d3c200..18a4bbf3152 100644 --- a/Resources/Prototypes/DeltaV/Roles/Jobs/Medical/medical_borg.yml +++ b/Resources/Prototypes/DeltaV/Roles/Jobs/Medical/medical_borg.yml @@ -5,11 +5,11 @@ description: job-description-medical-borg playTimeTracker: JobMedicalBorg requirements: - - !type:OverallPlaytimeRequirement - time: 216000 #60 hrs + - !type:CharacterOverallTimeRequirement + min: 216000 #60 hrs - !type:DepartmentTimeRequirement department: Medical - time: 21600 #6 hrs + min: 21600 #6 hrs canBeAntag: false icon: JobIconMedicalBorg supervisors: job-supervisors-cmo diff --git a/Resources/Prototypes/DeltaV/Roles/Jobs/Security/brigmedic.yml b/Resources/Prototypes/DeltaV/Roles/Jobs/Security/brigmedic.yml index adc6f95dfd4..f4b2fe95e14 100644 --- a/Resources/Prototypes/DeltaV/Roles/Jobs/Security/brigmedic.yml +++ b/Resources/Prototypes/DeltaV/Roles/Jobs/Security/brigmedic.yml @@ -6,10 +6,10 @@ requirements: - !type:DepartmentTimeRequirement department: Medical - time: 21600 # 6 hrs + min: 21600 # 6 hrs - !type:DepartmentTimeRequirement department: Security - time: 18000 # 4 hrs + min: 18000 # 4 hrs startingGear: CorpsmanGear icon: "JobIconBrigmedic" supervisors: job-supervisors-hos @@ -26,6 +26,9 @@ special: - !type:AddImplantSpecial implants: [ MindShieldImplant ] + - !type:AddComponentSpecial + components: + - type: CPRTraining - type: startingGear id: CorpsmanGear # see Prototypes/Roles/Jobs/Fun/misc_startinggear.yml for "BrigmedicGear" diff --git a/Resources/Prototypes/DeltaV/Roles/Jobs/departments.yml b/Resources/Prototypes/DeltaV/Roles/Jobs/departments.yml new file mode 100644 index 00000000000..c4d5fbfe20d --- /dev/null +++ b/Resources/Prototypes/DeltaV/Roles/Jobs/departments.yml @@ -0,0 +1,11 @@ +- type: department + id: Justice + description: department-justice-description + color: "#701442" + roles: + - ChiefJustice + - Clerk + - Prosecutor + - Lawyer + + diff --git a/Resources/Prototypes/DeltaV/Roles/play_time_trackers.yml b/Resources/Prototypes/DeltaV/Roles/play_time_trackers.yml index d3b983f01cd..4ab6f3eed45 100644 --- a/Resources/Prototypes/DeltaV/Roles/play_time_trackers.yml +++ b/Resources/Prototypes/DeltaV/Roles/play_time_trackers.yml @@ -3,3 +3,6 @@ - type: playTimeTracker id: JobMedicalBorg + +- type: playTimeTracker + id: JobCourier diff --git a/Resources/Prototypes/DeltaV/Species/vulpkanin.yml b/Resources/Prototypes/DeltaV/Species/vulpkanin.yml index 0b4a06af2d6..e139279dd5c 100644 --- a/Resources/Prototypes/DeltaV/Species/vulpkanin.yml +++ b/Resources/Prototypes/DeltaV/Species/vulpkanin.yml @@ -50,10 +50,10 @@ points: 1 required: false Legs: - points: 1 + points: 6 required: false Arms: - points: 1 + points: 6 required: false Snout: points: 1 @@ -62,9 +62,6 @@ points: 1 required: true defaultMarkings: [ VulpEar ] - Overlay: - points: 2 - required: false - type: humanoidBaseSprite id: MobVulpkaninHead diff --git a/Resources/Prototypes/DeltaV/StatusEffects/job.yml b/Resources/Prototypes/DeltaV/StatusEffects/job.yml index 949ac6a99e3..894e1586b40 100644 --- a/Resources/Prototypes/DeltaV/StatusEffects/job.yml +++ b/Resources/Prototypes/DeltaV/StatusEffects/job.yml @@ -4,3 +4,24 @@ icon: sprite: /Textures/DeltaV/Interface/Misc/job_icons.rsi state: MedicalBorg + +- type: statusIcon + parent: JobIcon + id: JobIconChiefJustice + icon: + sprite: /Textures/DeltaV/Interface/Misc/job_icons.rsi + state: ChiefJustice + +- type: statusIcon + parent: JobIcon + id: JobIconClerk + icon: + sprite: /Textures/DeltaV/Interface/Misc/job_icons.rsi + state: Clerk + +- type: statusIcon + parent: JobIcon + id: JobIconProsecutor + icon: + sprite: /Textures/DeltaV/Interface/Misc/job_icons.rsi + state: Prosecutor #need prosecutor diff --git a/Resources/Prototypes/DeltaV/Traits/altvision.yml b/Resources/Prototypes/DeltaV/Traits/altvision.yml index 97742d98ce5..390e14d4ad1 100644 --- a/Resources/Prototypes/DeltaV/Traits/altvision.yml +++ b/Resources/Prototypes/DeltaV/Traits/altvision.yml @@ -1,7 +1,6 @@ - type: trait id: UltraVision category: Visual - points: -1 requirements: - !type:CharacterSpeciesRequirement inverted: true @@ -18,7 +17,6 @@ - type: trait id: DogVision category: Visual - points: -1 requirements: - !type:CharacterSpeciesRequirement inverted: true diff --git a/Resources/Prototypes/DeltaV/radio_channels.yml b/Resources/Prototypes/DeltaV/radio_channels.yml index 639eea09b3a..53490d90fac 100644 --- a/Resources/Prototypes/DeltaV/radio_channels.yml +++ b/Resources/Prototypes/DeltaV/radio_channels.yml @@ -1,6 +1,15 @@ +- type: radioChannel + id: Justice + name: chat-radio-justice + keycode: "j" + frequency: 1420 + color: "#701442" + - type: radioChannel id: Prison name: chat-radio-prison keycode: 'p' frequency: 1601 - color: "#FFA500" \ No newline at end of file + color: "#FFA500" + + diff --git a/Resources/Prototypes/DeltaV/tags.yml b/Resources/Prototypes/DeltaV/tags.yml index 6a1efcfa695..36ea3e56a4e 100644 --- a/Resources/Prototypes/DeltaV/tags.yml +++ b/Resources/Prototypes/DeltaV/tags.yml @@ -15,6 +15,12 @@ - type: Tag id: ForensicBeltEquip +- type: Tag + id: Gavel + +- type: Tag + id: GasPipeHalf #Craftable Musket + - type: Tag id: HandLabeler diff --git a/Resources/Prototypes/Entities/Clothing/Belt/belts.yml b/Resources/Prototypes/Entities/Clothing/Belt/belts.yml index d90945a7eba..359165cfc50 100644 --- a/Resources/Prototypes/Entities/Clothing/Belt/belts.yml +++ b/Resources/Prototypes/Entities/Clothing/Belt/belts.yml @@ -472,6 +472,7 @@ - Sidearm - MagazinePistol - MagazineMagnum + - CombatKnife components: - Stunbaton - FlashOnTrigger diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/armor.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/armor.yml index 9a1f1427402..b62658270eb 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/armor.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/armor.yml @@ -138,6 +138,9 @@ Radiation: 0 Caustic: 0.75 - type: GroupExamine + - type: Tag + tags: + - FullBodyOuter - type: entity parent: ClothingOuterArmorHeavy @@ -234,6 +237,9 @@ - type: ExplosionResistance damageCoefficient: 0.5 - type: GroupExamine + - type: Tag + tags: + - FullBodyOuter - type: entity parent: ClothingOuterBaseLarge diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml index 8f4312e7711..358f91d2971 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml @@ -138,9 +138,15 @@ - Hardsuit - WhitelistChameleon - HidesHarpyWings #DeltaV: Used by harpies to help render their hardsuit sprites + - FullBodyOuter - type: Clothing equipDelay: 2.5 # Hardsuits are heavy and take a while to put on/off. unequipDelay: 2.5 + - type: Geiger + attachedToSuit: true + localSoundOnly: true + - type: StaminaDamageResistance + coefficient: 0.75 # 25% - type: entity abstract: true diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/coats.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/coats.yml index c78a5f9bdb5..a47a2bbcebc 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/coats.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/coats.yml @@ -66,8 +66,8 @@ - type: entity parent: ClothingOuterStorageBase id: ClothingOuterCoatInspector - name: inspector's coat - description: A strict inspector's coat for being intimidating during inspections. + name: slim trench coat + description: A slim minimalist trench coat best worn unbuttoned. components: - type: Sprite sprite: Clothing/OuterClothing/Coats/insp_coat.rsi diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml index 974da1ebccd..70ab3016469 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml @@ -100,6 +100,8 @@ - type: HeldSpeedModifier - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitEngineering + - type: StaminaDamageResistance + coefficient: 0.75 # 25% #Spationaut Hardsuit - type: entity @@ -221,6 +223,8 @@ - type: HeldSpeedModifier - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitSecurity + - type: StaminaDamageResistance + coefficient: 0.75 # 25% #Brigmedic Hardsuit - type: entity @@ -248,6 +252,8 @@ - type: HeldSpeedModifier - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitBrigmedic + - type: StaminaDamageResistance + coefficient: 0.75 # 25% #Warden's Hardsuit - type: entity @@ -278,6 +284,8 @@ - type: HeldSpeedModifier - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitWarden + - type: StaminaDamageResistance + coefficient: 0.65 # 35% #Captain's Hardsuit - type: entity @@ -310,6 +318,8 @@ - type: HeldSpeedModifier - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitCap + - type: StaminaDamageResistance + coefficient: 0.5 # 50% #Chief Engineer's Hardsuit - type: entity @@ -342,6 +352,11 @@ - type: HeldSpeedModifier - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitEngineeringWhite + - type: ClothingGrantComponent + component: + - type: SupermatterImmune + - type: StaminaDamageResistance + coefficient: 0.65 # 35% #Chief Medical Officer's Hardsuit - type: entity @@ -409,6 +424,8 @@ price: 750 - type: StealTarget stealGroup: ClothingOuterHardsuitRd + - type: StaminaDamageResistance + coefficient: 0.75 # 25% as in "shock resistance" :trollface: #Head of Security's Hardsuit - type: entity @@ -440,6 +457,8 @@ - type: HeldSpeedModifier - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitSecurityRed + - type: StaminaDamageResistance + coefficient: 0.5 # 50% #Luxury Mining Hardsuit - type: entity @@ -517,6 +536,8 @@ - Hardsuit - WhitelistChameleon - HidesHarpyWings + - type: StaminaDamageResistance + coefficient: 0.5 # 50% # Syndicate Medic Hardsuit - type: entity @@ -536,6 +557,8 @@ - Hardsuit - WhitelistChameleon - HidesHarpyWings + - type: StaminaDamageResistance + coefficient: 0.5 # 50% #Syndicate Elite Hardsuit - type: entity @@ -572,6 +595,8 @@ - type: HeldSpeedModifier - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitSyndieElite + - type: StaminaDamageResistance + coefficient: 0.5 # 50% #Syndicate Commander Hardsuit - type: entity @@ -604,6 +629,8 @@ - type: HeldSpeedModifier - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitSyndieCommander + - type: StaminaDamageResistance + coefficient: 0.5 # 50% #Cybersun Juggernaut Hardsuit - type: entity @@ -636,6 +663,8 @@ - type: HeldSpeedModifier - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitCybersun + - type: StaminaDamageResistance + coefficient: 0.5 # 50% #Wizard Hardsuit - type: entity @@ -668,6 +697,8 @@ - type: HeldSpeedModifier - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitWizard + - type: StaminaDamageResistance + coefficient: 0.5 # 50% #Ling Space Suit - type: entity @@ -763,6 +794,8 @@ clothingPrototype: ClothingHeadHelmetHardsuitPirateCap - type: StaticPrice price: 0 + - type: StaminaDamageResistance + coefficient: 0.75 # 25% #CENTCOMM / ERT HARDSUITS #ERT Leader Hardsuit @@ -778,6 +811,8 @@ sprite: Clothing/OuterClothing/Hardsuits/ERTSuits/ertleader.rsi - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitERTLeader + - type: StaminaDamageResistance + coefficient: 0.5 # 50% #ERT Chaplain Hardsuit - type: entity @@ -792,6 +827,8 @@ sprite: Clothing/OuterClothing/Hardsuits/ERTSuits/ertchaplain.rsi - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitERTChaplain + - type: StaminaDamageResistance + coefficient: 0.5 # 50% #ERT Engineer Hardsuit - type: entity @@ -806,6 +843,8 @@ sprite: Clothing/OuterClothing/Hardsuits/ERTSuits/ertengineer.rsi - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitERTEngineer + - type: StaminaDamageResistance + coefficient: 0.5 # 50% #ERT Medic Hardsuit - type: entity @@ -820,6 +859,8 @@ sprite: Clothing/OuterClothing/Hardsuits/ERTSuits/ertmedical.rsi - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitERTMedical + - type: StaminaDamageResistance + coefficient: 0.5 # 50% #ERT Security Hardsuit - type: entity @@ -838,6 +879,8 @@ tags: - Hardsuit - WhitelistChameleon + - type: StaminaDamageResistance + coefficient: 0.5 # 50% #ERT Janitor Hardsuit - type: entity @@ -852,6 +895,8 @@ sprite: Clothing/OuterClothing/Hardsuits/ERTSuits/ertjanitor.rsi - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitERTJanitor + - type: StaminaDamageResistance + coefficient: 0.5 # 50% #Deathsquad - type: entity @@ -886,6 +931,8 @@ - type: HeldSpeedModifier - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitDeathsquad + - type: StaminaDamageResistance + coefficient: 0.1 # 90% #CBURN Hardsuit - type: entity diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/suits.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/suits.yml index d6cd5295731..9f0a01cc481 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/suits.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/suits.yml @@ -25,6 +25,7 @@ tags: - Hardsuit - WhitelistChameleon + - FullBodyOuter - HidesHarpyWings - type: entity @@ -38,6 +39,17 @@ sprite: Clothing/OuterClothing/Suits/janitor_bombsuit.rsi - type: Clothing sprite: Clothing/OuterClothing/Suits/janitor_bombsuit.rsi + - type: ClothingSpeedModifier + walkModifier: 0.8 + sprintModifier: 0.8 + - type: ExplosionResistance + damageCoefficient: 0.15 + - type: GroupExamine + - type: Tag + tags: + - Hardsuit + - WhitelistChameleon + - FullBodyOuter - type: entity parent: ClothingOuterBaseLarge @@ -97,6 +109,7 @@ - type: GroupExamine - type: Tag tags: + - FullBodyOuter - WhitelistChameleon - HidesHarpyWings @@ -124,6 +137,7 @@ toggleable-clothing: !type:ContainerSlot {} - type: Tag tags: + - FullBodyOuter - WhitelistChameleon - HidesHarpyWings @@ -177,6 +191,9 @@ sprite: Clothing/OuterClothing/Suits/chicken.rsi - type: Clothing sprite: Clothing/OuterClothing/Suits/chicken.rsi + - type: Tag + tags: + - FullBodyOuter - type: entity parent: ClothingOuterBase @@ -202,6 +219,9 @@ - type: ContainerContainer containers: toggleable-clothing: !type:ContainerSlot {} + - type: Tag + tags: + - FullBodyOuter - type: entity parent: ClothingOuterBase diff --git a/Resources/Prototypes/Entities/Markers/Spawners/Random/vending.yml b/Resources/Prototypes/Entities/Markers/Spawners/Random/vending.yml index d55a7916b46..ca68d7df53b 100644 --- a/Resources/Prototypes/Entities/Markers/Spawners/Random/vending.yml +++ b/Resources/Prototypes/Entities/Markers/Spawners/Random/vending.yml @@ -31,4 +31,8 @@ - VendingMachineSoda - VendingMachineStarkist - VendingMachineSpaceUp + - VendingMachineFitness + - VendingMachineHotfood + - VendingMachineSolsnack + - VendingMachineWeeb chance: 1 diff --git a/Resources/Prototypes/Entities/Markers/Spawners/Random/vendingdrinks.yml b/Resources/Prototypes/Entities/Markers/Spawners/Random/vendingdrinks.yml index a911b7ebfc0..1e452098531 100644 --- a/Resources/Prototypes/Entities/Markers/Spawners/Random/vendingdrinks.yml +++ b/Resources/Prototypes/Entities/Markers/Spawners/Random/vendingdrinks.yml @@ -22,4 +22,5 @@ - VendingMachineSoda - VendingMachineStarkist - VendingMachineSpaceUp + - VendingMachineFitness chance: 1 diff --git a/Resources/Prototypes/Entities/Markers/Spawners/ghost_roles.yml b/Resources/Prototypes/Entities/Markers/Spawners/ghost_roles.yml index 3da346cdd65..712dfcf3a06 100644 --- a/Resources/Prototypes/Entities/Markers/Spawners/ghost_roles.yml +++ b/Resources/Prototypes/Entities/Markers/Spawners/ghost_roles.yml @@ -85,8 +85,8 @@ description: ghost-role-information-loneop-description rules: ghost-role-information-loneop-rules requirements: - - !type:OverallPlaytimeRequirement - time: 172800 # DeltaV - 48 hours + - !type:CharacterOverallTimeRequirement + min: 172800 # DeltaV - 48 hours - !type:DepartmentTimeRequirement # DeltaV - Security dept time requirement department: Security time: 36000 # DeltaV - 10 hours diff --git a/Resources/Prototypes/Entities/Mobs/Customization/Markings/harpy.yml b/Resources/Prototypes/Entities/Mobs/Customization/Markings/harpy.yml index 697781be939..2629d836516 100644 --- a/Resources/Prototypes/Entities/Mobs/Customization/Markings/harpy.yml +++ b/Resources/Prototypes/Entities/Mobs/Customization/Markings/harpy.yml @@ -253,6 +253,56 @@ - sprite: Mobs/Customization/Harpy/harpy_tails48x48.rsi state: peacock_tail_eyes +- type: marking + id: HarpyTailHaven + bodyPart: Tail + markingCategory: Tail + speciesRestriction: [Harpy] + coloring: + default: + type: + !type:CategoryColoring + category: Hair + fallbackTypes: + - !type:SimpleColoring + sprites: + - sprite: Mobs/Customization/Harpy/harpy_tails.rsi + state: haven_tone_1 + - sprite: Mobs/Customization/Harpy/harpy_tails.rsi + state: haven_tone_2 + +- type: marking + id: HarpyTailForkedLong + bodyPart: Tail + markingCategory: Tail + speciesRestriction: [Harpy] + coloring: + default: + type: + !type:CategoryColoring + category: Hair + fallbackTypes: + - !type:SimpleColoring + sprites: + - sprite: Mobs/Customization/Harpy/harpy_tails.rsi + state: forked_long + +- type: marking + id: HarpyTailSwallow + bodyPart: Tail + markingCategory: Tail + speciesRestriction: [Harpy] + coloring: + default: + type: + !type:CategoryColoring + category: Hair + fallbackTypes: + - !type:SimpleColoring + sprites: + - sprite: Mobs/Customization/Harpy/harpy_tails.rsi + state: swallow_tail + - type: marking id: HarpyWing2ToneClassic bodyPart: RArm @@ -310,6 +360,29 @@ - sprite: Mobs/Customization/Harpy/harpy_wings.rsi state: harpy_wingtip_2 +- type: marking + id: HarpyWingBat + bodyPart: RArm + markingCategory: Arms + speciesRestriction: [Harpy] + sprites: + - sprite: Mobs/Customization/Harpy/harpy_wings.rsi + state: bat_wings_tone_1 + - sprite: Mobs/Customization/Harpy/harpy_wings.rsi + state: bat_wings_tone_2 + +- type: marking + id: HarpyWingBionic + bodyPart: RArm + markingCategory: Arms + speciesRestriction: [Harpy] + sprites: + - sprite: Mobs/Customization/Harpy/harpy_wings.rsi + state: bionic_wings_tone_1 + - sprite: Mobs/Customization/Harpy/harpy_wings.rsi + state: bionic_wings_tone_2 + shader: unshaded + - type: marking id: HarpyChestDefault bodyPart: Chest diff --git a/Resources/Prototypes/Entities/Mobs/Customization/Markings/makeup.yml b/Resources/Prototypes/Entities/Mobs/Customization/Markings/makeup.yml new file mode 100644 index 00000000000..901bf6e75cf --- /dev/null +++ b/Resources/Prototypes/Entities/Mobs/Customization/Markings/makeup.yml @@ -0,0 +1,87 @@ +- type: marking + id: MakeupLips + bodyPart: Head + markingCategory: Head + speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy] # Delta V - Felinid, Oni, Harpy + coloring: + default: + type: + !type:SimpleColoring + color: "#7e2727" + sprites: + - sprite: Mobs/Customization/makeup.rsi + state: lips + +- type: marking + id: MakeupBlush + bodyPart: Head + markingCategory: Head + speciesRestriction: [Dwarf, Human, Reptilian, SlimePerson, Felinid, Oni, Vulpkanin, Harpy] # Delta V - Felinid, Oni, Vulpkanin, Harpy + coloring: + default: + type: + !type:SimpleColoring + color: "#d39394" + sprites: + - sprite: Mobs/Customization/makeup.rsi + state: blush + +- type: marking + id: MakeupNailPolishRight + bodyPart: RHand + markingCategory: Overlay + speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, SlimePerson, Felinid, Oni, Vulpkanin] # Delta V - Felinid, Oni, Vulpkanin + coloring: + default: + type: + !type:SimpleColoring + color: "#702020" + sprites: + - sprite: Mobs/Customization/makeup.rsi + state: nail_polish_r + +- type: marking + id: MakeupNailPolishLeft + bodyPart: LHand + markingCategory: Overlay + speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, SlimePerson, Felinid, Oni, Vulpkanin] # Delta V - Felinid, Oni, Vulpkanin + coloring: + default: + type: + !type:SimpleColoring + color: "#702020" + sprites: + - sprite: Mobs/Customization/makeup.rsi + state: nail_polish_l + +# Moth-specific + +- type: marking + id: MakeupMothLips + bodyPart: Head + markingCategory: Overlay # The marking category is in Overlay instead of Head + # because the Head category for moths only allows 1 + # marking and lips should be usable alongside blush + speciesRestriction: [Moth] + coloring: + default: + type: + !type:SimpleColoring + color: "#7e2727" + sprites: + - sprite: Mobs/Customization/makeup.rsi + state: moth_lips + +- type: marking + id: MakeupMothBlush + bodyPart: Head + markingCategory: Overlay + speciesRestriction: [Moth] + coloring: + default: + type: + !type:SimpleColoring + color: "#d39394" + sprites: + - sprite: Mobs/Customization/makeup.rsi + state: moth_blush diff --git a/Resources/Prototypes/Entities/Mobs/Customization/cyberlimbs/bishop.yml b/Resources/Prototypes/Entities/Mobs/Customization/cyberlimbs/bishop.yml new file mode 100644 index 00000000000..11f4967616b --- /dev/null +++ b/Resources/Prototypes/Entities/Mobs/Customization/cyberlimbs/bishop.yml @@ -0,0 +1,110 @@ +- type: marking + id: CyberLimbsMarkingBishopHead + bodyPart: Head + markingCategory: Head + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Customization/cyberlimbs/bishop/bishop_monitor.rsi + state: head + - sprite: Mobs/Customization/cyberlimbs/bishop/bishop_monitor.rsi + state: head-2 + +- type: marking + id: CyberLimbsMarkingBishopChest + bodyPart: Chest + markingCategory: Chest + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi + state: torso-primary + - sprite: Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi + state: torso-secondary + +- type: marking + id: CyberLimbsMarkingBishopLArm + bodyPart: LArm + markingCategory: Arms + speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian] + sprites: + - sprite: Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi + state: l_arm-primary + - sprite: Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi + state: l_arm-secondary + - sprite: Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi + state: l_arm-tertiary + +- type: marking + id: CyberLimbsMarkingBishopLHand + bodyPart: LHand + markingCategory: Arms + speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian] + sprites: + - sprite: Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi + state: l_hand + +- type: marking + id: CyberLimbsMarkingBishopLLeg + bodyPart: LLeg + markingCategory: Legs + speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian] + sprites: + - sprite: Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi + state: l_leg-primary + - sprite: Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi + state: l_leg-secondary + + +- type: marking + id: CyberLimbsMarkingBishopLFoot + bodyPart: LFoot + markingCategory: Legs + speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian] + sprites: + - sprite: Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi + state: l_foot + + + +- type: marking + id: CyberLimbsMarkingBishopRArm + bodyPart: RArm + markingCategory: Arms + speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian] + sprites: + - sprite: Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi + state: r_arm-primary + - sprite: Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi + state: r_arm-secondary + - sprite: Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi + state: r_arm-tertiary + + +- type: marking + id: CyberLimbsMarkingBishopRHand + bodyPart: RHand + markingCategory: Arms + speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian] + sprites: + - sprite: Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi + state: r_hand + +- type: marking + id: CyberLimbsMarkingBishopRLeg + bodyPart: RLeg + markingCategory: Legs + speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian] + sprites: + - sprite: Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi + state: r_leg-primary + - sprite: Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi + state: r_leg-secondary + + +- type: marking + id: CyberLimbsMarkingBishopRFoot + bodyPart: RFoot + markingCategory: Legs + speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian] + sprites: + - sprite: Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi + state: r_foot diff --git a/Resources/Prototypes/Entities/Mobs/Customization/cyberlimbs/hesphiastos.yml b/Resources/Prototypes/Entities/Mobs/Customization/cyberlimbs/hesphiastos.yml new file mode 100644 index 00000000000..3103c640034 --- /dev/null +++ b/Resources/Prototypes/Entities/Mobs/Customization/cyberlimbs/hesphiastos.yml @@ -0,0 +1,115 @@ +- type: marking + id: CyberLimbsMarkingHesphiastosHead + bodyPart: Head + markingCategory: Head + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_monitor.rsi + state: head-1 + - sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_monitor.rsi + state: head-2 + +- type: marking + id: CyberLimbsMarkingHesphiastosChest + bodyPart: Chest + markingCategory: Chest + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi + state: torso-1 + - sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi + state: torso-2 + +- type: marking + id: CyberLimbsMarkingHesphiastosLArm + bodyPart: LArm + markingCategory: Arms + speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian] + sprites: + - sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi + state: l_arm-1 + - sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi + state: l_arm-2 + +- type: marking + id: CyberLimbsMarkingHesphiastosLHand + bodyPart: LHand + markingCategory: Arms + speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian] + sprites: + - sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi + state: l_hand-1 + - sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi + state: l_hand-2 + +- type: marking + id: CyberLimbsMarkingHesphiastosLLeg + bodyPart: LLeg + markingCategory: Legs + speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian] + sprites: + - sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi + state: l_leg-1 + - sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi + state: l_leg-2 + + +- type: marking + id: CyberLimbsMarkingHesphiastosLFoot + bodyPart: LFoot + markingCategory: Legs + speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian] + sprites: + - sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi + state: l_foot-1 + - sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi + state: l_foot-2 + + + +- type: marking + id: CyberLimbsMarkingHesphiastosRArm + bodyPart: RArm + markingCategory: Arms + speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian] + sprites: + - sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi + state: r_arm-1 + - sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi + state: r_arm-2 + + +- type: marking + id: CyberLimbsMarkingHesphiastosRHand + bodyPart: RHand + markingCategory: Arms + speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian] + sprites: + - sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi + state: r_hand-1 + - sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi + state: r_hand-2 + + +- type: marking + id: CyberLimbsMarkingHesphiastosRLeg + bodyPart: RLeg + markingCategory: Legs + speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian] + sprites: + - sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi + state: r_leg-1 + - sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi + state: r_leg-2 + + +- type: marking + id: CyberLimbsMarkingHesphiastosRFoot + bodyPart: RFoot + markingCategory: Legs + speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian] + sprites: + - sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi + state: r_foot-1 + - sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi + state: r_foot-2 diff --git a/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml b/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml index eba1253dde4..9ff9837a3b9 100644 --- a/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml +++ b/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml @@ -223,7 +223,6 @@ understands: - GalacticCommon - RobotTalk - - type: CanWalk - type: entity id: BaseBorgChassisNT diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml index 7f3b1cae588..29234ea34cf 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml @@ -1313,7 +1313,6 @@ tags: - VimPilot - DoorBumpOpener - - type: CanWalk - type: entity name: monkey @@ -2442,6 +2441,12 @@ - type: Tag tags: - VimPilot + - type: LanguageKnowledge + speaks: + - Hissing + understands: + - Hissing + - type: entity name: possum @@ -2519,6 +2524,11 @@ - type: Tag tags: - VimPilot + - type: LanguageKnowledge + speaks: + - Hissing + understands: + - Hissing - type: entity name: fox @@ -2886,9 +2896,9 @@ - Syndicate - type: LanguageKnowledge speaks: - - Xeno + - Cat understands: - - Xeno + - Cat - GalacticCommon - type: entity @@ -3060,6 +3070,11 @@ barkMultiplier: 10 barks: - Sloth + - type: LanguageKnowledge # WHAT DOES THE SLOTH SAY??????? + speaks: + - Hissing + understands: + - Hissing - type: entity name: ferret @@ -3119,6 +3134,11 @@ - type: Tag tags: - VimPilot + - type: LanguageKnowledge + speaks: + - Hissing + understands: + - Hissing - type: entity name: hamster diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/elemental.yml b/Resources/Prototypes/Entities/Mobs/NPCs/elemental.yml index 2515c7880ac..c2380c40278 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/elemental.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/elemental.yml @@ -293,7 +293,6 @@ solution: bloodstream - type: DrainableSolution solution: bloodstream - - type: CanWalk - type: entity name: Reagent Slime Spawner diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml b/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml index e10bdbcf0ec..d1b3bd6a6a9 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml @@ -126,7 +126,6 @@ understands: - GalacticCommon - Mouse - - type: CanWalk - type: entity id: MobRatKingBuff diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/slimes.yml b/Resources/Prototypes/Entities/Mobs/NPCs/slimes.yml index 3735bcc4eca..fbf133a0f1e 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/slimes.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/slimes.yml @@ -128,7 +128,6 @@ speechSounds: Slime - type: TypingIndicator proto: slime - - type: CanWalk - type: entity name: blue slime diff --git a/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml b/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml index 6291fd23335..6c9ec2049f4 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml @@ -95,6 +95,7 @@ - type: InventorySlots - type: Loadout prototypes: [ MobAghostGear ] + - type: SupermatterImmune - type: entity id: ActionAGhostShowSolar diff --git a/Resources/Prototypes/Entities/Mobs/Player/arachne.yml b/Resources/Prototypes/Entities/Mobs/Player/arachne.yml new file mode 100644 index 00000000000..bebf42f31ba --- /dev/null +++ b/Resources/Prototypes/Entities/Mobs/Player/arachne.yml @@ -0,0 +1,35 @@ +- type: entity + save: false + name: Urist McArachne + parent: MobArachneBase + id: MobArachne + components: + - type: CombatMode + - type: InteractionPopup + successChance: 1 + interactSuccessString: hugging-success-generic + interactSuccessSound: /Audio/Effects/thudswoosh.ogg + messagePerceivedByOthers: hugging-success-generic-others + - type: MindContainer + showExamineInfo: true + - type: Input + context: "human" + - type: MobMover + - type: InputMover + - type: Respirator + damage: + types: + Asphyxiation: 1.0 + damageRecovery: + types: + Asphyxiation: -1.0 + - type: Alerts + - type: Actions + - type: Eye + - type: CameraRecoil + - type: Examiner + - type: CanHostGuardian + - type: NpcFactionMember + factions: + - NanoTrasen + - type: PotentialPsionic diff --git a/Resources/Prototypes/Entities/Mobs/Species/arachne.yml b/Resources/Prototypes/Entities/Mobs/Species/arachne.yml new file mode 100644 index 00000000000..2f6437dc14e --- /dev/null +++ b/Resources/Prototypes/Entities/Mobs/Species/arachne.yml @@ -0,0 +1,220 @@ +- type: entity + save: false + name: Urist McArachne + parent: BaseMobHuman + id: MobArachneBase + abstract: true + components: + - type: Sprite + # Arachne are one of the species that needs a manual visual layers setup. + layers: + - map: [ "enum.HumanoidVisualLayers.LLeg" ] + sprite: Mobs/Species/arachne.rsi + state: spider_body + - map: [ "enum.HumanoidVisualLayers.Chest" ] + color: "#e8b59b" + sprite: Mobs/Species/Human/parts.rsi + state: torso_m + - map: [ "enum.HumanoidVisualLayers.RLeg" ] + sprite: Mobs/Species/arachne.rsi + state: spider_body_front + - map: [ "enum.HumanoidVisualLayers.Head" ] + color: "#e8b59b" + sprite: Mobs/Species/Human/parts.rsi + state: head_m + - map: [ "enum.HumanoidVisualLayers.Eyes" ] + color: "#008800" + sprite: Mobs/Species/eyes.rsi + state: eyes + - map: [ "enum.HumanoidVisualLayers.RArm" ] + color: "#e8b59b" + sprite: Mobs/Species/Human/parts.rsi + state: r_arm + - map: [ "enum.HumanoidVisualLayers.LArm" ] + color: "#e8b59b" + sprite: Mobs/Species/Human/parts.rsi + state: l_arm + - shader: StencilClear + sprite: Mobs/Species/Human/parts.rsi + state: l_leg + - shader: StencilMask + map: [ "enum.HumanoidVisualLayers.StencilMask" ] + sprite: Mobs/Customization/anytaur_masking_helpers.rsi + state: unisex_full + visible: false + - map: [ "jumpsuit" ] + - map: [ "enum.HumanoidVisualLayers.LHand" ] + color: "#e8b59b" + sprite: Mobs/Species/Human/parts.rsi + state: l_hand + - map: [ "enum.HumanoidVisualLayers.RHand" ] + color: "#e8b59b" + sprite: Mobs/Species/Human/parts.rsi + state: r_hand + - map: [ "enum.HumanoidVisualLayers.Handcuffs" ] + color: "#ffffff" + sprite: Objects/Misc/handcuffs.rsi + state: body-overlay-2 + visible: false + - map: [ "id" ] + - map: [ "gloves" ] + - map: [ "shoes" ] + - map: [ "ears" ] + - map: [ "outerClothing" ] + - map: [ "eyes" ] + - map: [ "belt" ] + - map: [ "neck" ] + - map: [ "back" ] + - map: [ "enum.HumanoidVisualLayers.Hair" ] + state: bald + sprite: Mobs/Customization/human_hair.rsi + - map: [ "mask" ] + - map: [ "head" ] + - map: [ "pocket1" ] + - map: [ "pocket2" ] + - map: [ "enum.HumanoidVisualLayers.Tail" ] + sprite: Mobs/Customization/masking_helpers.rsi + state: none + visible: false + - map: [ "clownedon" ] # Dynamically generated + sprite: "Effects/creampie.rsi" + state: "creampie_human" + visible: false + - type: HumanoidAppearance + species: Arachne + - type: Fixtures + fixtures: # TODO: This needs a second fixture just for mob collisions. + fix1: + shape: + !type:PhysShapeCircle + radius: 0.40 + density: 140 + restitution: 0.0 + mask: + - MobMask + layer: + - MobLayer + - type: Body + prototype: Arachne + requiredLegs: 8 + - type: Speech + speechSounds: Alto + - type: Inventory + templateId: anytaur + - type: Tag + tags: + - CanPilot + - ShoesRequiredStepTriggerImmune + - DoorBumpOpener + - type: Bloodstream + bloodReagent: DemonsBlood + - type: BloodSucker + webRequired: true + - type: Arachne + - type: DamageVisuals + thresholds: [ 20, 40, 100 ] + targetLayers: + - "enum.HumanoidVisualLayers.Chest" + - "enum.HumanoidVisualLayers.Head" + - "enum.HumanoidVisualLayers.LArm" + - "enum.HumanoidVisualLayers.RArm" + - type: MovedByPressure + pressureResistance: 4 + - type: Barotrauma + damage: + types: + Blunt: 0.05 #per second, scales with pressure and other constants. Reduced Damage. This allows medicine to heal faster than damage. + - type: MovementAlwaysTouching + - type: MovementSpeedModifier + baseWalkSpeed : 3.0 + baseSprintSpeed : 5.0 + - type: FireVisuals + sprite: Mobs/Effects/onfire.rsi + normalState: Generic_mob_burning + alternateState: arachne_standing + fireStackAlternateState: 3 + - type: Spider + - type: IgnoreSpiderWeb + +- type: entity + save: false + name: Urist McHands + parent: MobHumanDummy + id: MobArachneDummy + noSpawn: true + description: A dummy arachne meant to be used in character setup. + components: + - type: Sprite + layers: + - map: [ "enum.HumanoidVisualLayers.LLeg" ] + sprite: Mobs/Species/arachne.rsi + state: spider_body + - map: [ "enum.HumanoidVisualLayers.Chest" ] + color: "#e8b59b" + sprite: Mobs/Species/Human/parts.rsi + state: torso_m + - map: [ "enum.HumanoidVisualLayers.RLeg" ] + sprite: Mobs/Species/arachne.rsi + state: spider_body_front + - map: [ "enum.HumanoidVisualLayers.Head" ] + color: "#e8b59b" + sprite: Mobs/Species/Human/parts.rsi + state: head_m + - map: [ "enum.HumanoidVisualLayers.Eyes" ] + color: "#008800" + sprite: Mobs/Species/eyes.rsi + state: eyes + - map: [ "enum.HumanoidVisualLayers.RArm" ] + color: "#e8b59b" + sprite: Mobs/Species/Human/parts.rsi + state: r_arm + - map: [ "enum.HumanoidVisualLayers.LArm" ] + color: "#e8b59b" + sprite: Mobs/Species/Human/parts.rsi + state: l_arm + - shader: StencilClear + sprite: Mobs/Species/Human/parts.rsi + state: l_leg + - shader: StencilMask + map: [ "enum.HumanoidVisualLayers.StencilMask" ] + sprite: Mobs/Customization/anytaur_masking_helpers.rsi + state: unisex_full + visible: false + - map: [ "jumpsuit" ] + - map: [ "enum.HumanoidVisualLayers.LHand" ] + color: "#e8b59b" + sprite: Mobs/Species/Human/parts.rsi + state: l_hand + - map: [ "enum.HumanoidVisualLayers.RHand" ] + color: "#e8b59b" + sprite: Mobs/Species/Human/parts.rsi + state: r_hand + - map: [ "enum.HumanoidVisualLayers.Handcuffs" ] + color: "#ffffff" + sprite: Objects/Misc/handcuffs.rsi + state: body-overlay-2 + visible: false + - map: [ "id" ] + - map: [ "gloves" ] + - map: [ "shoes" ] + - map: [ "ears" ] + - map: [ "outerClothing" ] + - map: [ "eyes" ] + - map: [ "belt" ] + - map: [ "neck" ] + - map: [ "back" ] + - map: [ "enum.HumanoidVisualLayers.Hair" ] + state: bald + sprite: Mobs/Customization/human_hair.rsi + - map: [ "mask" ] + - map: [ "head" ] + - map: [ "pocket1" ] + - map: [ "pocket2" ] + - map: [ "enum.HumanoidVisualLayers.Tail" ] + sprite: Mobs/Customization/masking_helpers.rsi + state: none + visible: false + - type: Inventory + templateId: anytaur + - type: HumanoidAppearance + species: Arachne diff --git a/Resources/Prototypes/Entities/Mobs/Species/base.yml b/Resources/Prototypes/Entities/Mobs/Species/base.yml index 1b9e9674f44..c4906f6f975 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/base.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/base.yml @@ -229,7 +229,6 @@ - CanPilot - FootstepSound - DoorBumpOpener - - type: CanWalk - type: entity save: false diff --git a/Resources/Prototypes/Entities/Mobs/Species/diona.yml b/Resources/Prototypes/Entities/Mobs/Species/diona.yml index e1628c620a2..42383d9a426 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/diona.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/diona.yml @@ -109,6 +109,11 @@ understands: - GalacticCommon - RootSpeak + - type: TraitSpeedModifier + sprintModifier: 0.75 + walkModifier: 0.75 + - type: SpeedModifierImmunity + - type: NoSlip - type: entity parent: BaseSpeciesDummy diff --git a/Resources/Prototypes/Entities/Mobs/Species/harpy.yml b/Resources/Prototypes/Entities/Mobs/Species/harpy.yml index b265d9343a3..05d70e8adc5 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/harpy.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/harpy.yml @@ -119,8 +119,8 @@ False: {visible: false} True: {visible: true} - type: MovementSpeedModifier - baseWalkSpeed: 2.5 - baseSprintSpeed: 5.0 + baseWalkSpeed: 3 + baseSprintSpeed: 5.5 weightlessAcceleration: 2.5 - type: Inventory speciesId: harpy @@ -140,7 +140,6 @@ understands: - GalacticCommon - SolCommon - - type: entity save: false name: Urist McHands diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks.yml b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks.yml index cfe5294ff05..93d4b957fe7 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks.yml @@ -34,11 +34,20 @@ - key: enum.TransferAmountUiKey.Key type: TransferAmountBoundUserInterface - type: EmitSoundOnPickup - sound: /Audio/SimpleStation14/Items/Handling/drinkglass_pickup.ogg + sound: + path: /Audio/SimpleStation14/Items/Handling/drinkglass_pickup.ogg + params: + volume: -2 - type: EmitSoundOnDrop - sound: /Audio/SimpleStation14/Items/Handling/drinkglass_drop.ogg + sound: + path: /Audio/SimpleStation14/Items/Handling/drinkglass_drop.ogg + params: + volume: -2 - type: EmitSoundOnLand - sound: /Audio/SimpleStation14/Items/Handling/drinkglass_drop.ogg + sound: + path: /Audio/SimpleStation14/Items/Handling/drinkglass_drop.ogg + params: + volume: -2 - type: entity parent: DrinkBase diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_bottles.yml b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_bottles.yml index fc35fae1af8..a6752286dd2 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_bottles.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_bottles.yml @@ -47,6 +47,15 @@ components: - type: Sprite state: icon + - type: MeleeWeapon + bluntStaminaDamageFactor: 2.0 + damage: + types: + Blunt: 7.5 + heavyRangeModifier: 1.5 + heavyStaminaCost: 5 + maxTargets: 1 + angle: 25 - type: DamageOnLand damage: types: @@ -54,7 +63,7 @@ - type: DamageOtherOnHit damage: types: - Blunt: 4 + Blunt: 5 - type: Damageable damageContainer: Inorganic - type: Destructible diff --git a/Resources/Prototypes/Entities/Objects/Devices/Electronics/door_access.yml b/Resources/Prototypes/Entities/Objects/Devices/Electronics/door_access.yml index e3944296ea7..b7934160641 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/Electronics/door_access.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/Electronics/door_access.yml @@ -294,3 +294,27 @@ components: - type: AccessReader access: [["Research"], ["Medical"]] + +- type: entity + parent: DoorElectronics + id: DoorElectronicsChiefJustice + suffix: ChiefJustice, Locked + components: + - type: AccessReader + access: [["ChiefJustice"]] + +- type: entity + parent: DoorElectronics + id: DoorElectronicsJustice + suffix: Justice, Locked + components: + - type: AccessReader + access: [["Justice"]] + +- type: entity + parent: DoorElectronics + id: DoorElectronicsProsecutor + suffix: Prosecutor, Locked + components: + - type: AccessReader + access: [["Prosecutor"]] \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Objects/Devices/encryption_keys.yml b/Resources/Prototypes/Entities/Objects/Devices/encryption_keys.yml index d270c93e50a..49ef98d7690 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/encryption_keys.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/encryption_keys.yml @@ -67,6 +67,7 @@ - Common - Command - Engineering + - Justice # Delta V- adds Justice department - Medical - Science - Security diff --git a/Resources/Prototypes/Entities/Objects/Devices/pda.yml b/Resources/Prototypes/Entities/Objects/Devices/pda.yml index 0f68afefe69..2c28f60da58 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/pda.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/pda.yml @@ -151,6 +151,12 @@ - type: Pda id: MedicalInternIDCard state: pda-internmed + penSlot: # Pen Lights + startingItem: PenLightBase + priority: -1 + whitelist: + tags: + - Write - type: PdaBorderColor borderColor: "#717059" accentVColor: "#447987" @@ -534,6 +540,12 @@ - type: Pda id: CMOIDCard state: pda-cmo + penSlot: # Fancy Pen Light + startingItem: CMOPenLight + priority: -1 + whitelist: + tags: + - Write - type: PdaBorderColor borderColor: "#d7d7d0" accentHColor: "#447987" @@ -550,6 +562,12 @@ - type: Pda id: MedicalIDCard state: pda-medical + penSlot: # Pen Lights + startingItem: PenLightBase + priority: -1 + whitelist: + tags: + - Write - type: PdaBorderColor borderColor: "#d7d7d0" accentVColor: "#447987" @@ -568,6 +586,12 @@ - type: Pda id: ParamedicIDCard state: pda-paramedic + penSlot: # Pen Lights + startingItem: PenLightBase + priority: -1 + whitelist: + tags: + - Write - type: PdaBorderColor borderColor: "#d7d7d0" accentVColor: "#2a4b5b" @@ -583,6 +607,12 @@ - type: Pda id: ChemistIDCard state: pda-chemistry + penSlot: # Pen Lights + startingItem: PenLightBase + priority: -1 + whitelist: + tags: + - Write - type: PdaBorderColor borderColor: "#d7d7d0" accentVColor: "#B34200" @@ -917,6 +947,12 @@ - type: Pda id: PsychologistIDCard state: pda-medical + penSlot: # Pen Lights + startingItem: PenLightBase + priority: -1 + whitelist: + tags: + - Write - type: PdaBorderColor borderColor: "#d7d7d0" accentVColor: "#447987" @@ -1002,6 +1038,12 @@ - type: Pda id: BrigmedicIDCard state: pda-brigmedic + penSlot: # Pen Lights + startingItem: PenLightBase + priority: -1 + whitelist: + tags: + - Write - type: PdaBorderColor borderColor: "#A32D26" accentHColor: "#d7d7d0" @@ -1079,6 +1121,12 @@ - type: Pda id: SeniorPhysicianIDCard state: pda-seniorphysician + penSlot: # Pen Lights + startingItem: PenLightBase + priority: -1 + whitelist: + tags: + - Write - type: PdaBorderColor borderColor: "#d7d7d0" accentHColor: "#447987" @@ -1129,6 +1177,12 @@ - type: Pda id: SyndicateIDCard state: pda-syndi-agent + penSlot: # Pen Lights + startingItem: PenLightBase + priority: -1 + whitelist: + tags: + - Write - type: PdaBorderColor borderColor: "#891417" - type: Icon diff --git a/Resources/Prototypes/Entities/Objects/Devices/translators.yml b/Resources/Prototypes/Entities/Objects/Devices/translators.yml index d75b7af7fd6..6aa7947c82d 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/translators.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/translators.yml @@ -215,6 +215,7 @@ - Pig - Crab - Kobold + - Hissing requires: - GalacticCommon setLanguageOnInteract: false diff --git a/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_string.yml b/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_string.yml index fab8b56b06f..947a973bbf6 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_string.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_string.yml @@ -14,6 +14,19 @@ - type: Sprite sprite: Objects/Fun/Instruments/eguitar.rsi state: icon + - type: MeleeWeapon + soundHit: + path: /Audio/Nyanotrasen/Weapons/electricguitarhit.ogg + range: 1.85 + damage: + types: + Blunt: 6 + Shock: 1 + bluntStaminaDamageFactor: 1.5 + heavyRateModifier: 0.75 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 10 + angle: 75 - type: Item size: Normal sprite: Objects/Fun/Instruments/eguitar.rsi @@ -43,6 +56,19 @@ - type: Sprite sprite: Objects/Fun/Instruments/bassguitar.rsi state: icon + - type: MeleeWeapon + soundHit: + path: /Audio/Nyanotrasen/Weapons/electricguitarhit.ogg + range: 1.85 + damage: + types: + Blunt: 6 + Shock: 1 + bluntStaminaDamageFactor: 1.5 + heavyRateModifier: 0.75 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 10 + angle: 75 - type: Item size: Normal sprite: Objects/Fun/Instruments/bassguitar.rsi @@ -71,6 +97,27 @@ - type: Sprite sprite: Objects/Fun/Instruments/rockguitar.rsi state: icon + - type: MeleeWeapon + soundHit: + path: /Audio/Nyanotrasen/Weapons/electricguitarhit.ogg + range: 1.85 + attackRate: 1.25 + wideAnimationRotation: 45 + damage: + types: + Blunt: 6 + Shock: 1 + bluntStaminaDamageFactor: 1.5 + heavyRateModifier: 0.75 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 15 + angle: 160 + - type: Wieldable + - type: IncreaseDamageOnWield + damage: + types: + Blunt: 2 + Shock: 1 - type: Item size: Normal sprite: Objects/Fun/Instruments/rockguitar.rsi @@ -82,18 +129,6 @@ - type: Tag tags: - StringInstrument - - type: MeleeWeapon - wideAnimationRotation: 45 - damage: - types: - Blunt: 6 - Slash: 2 - - type: Wieldable - - type: IncreaseDamageOnWield #they don't call it an axe for nothing - damage: - types: - Blunt: 4 - Slash: 2 - type: entity parent: BaseHandheldInstrument @@ -145,14 +180,20 @@ types: Blunt: 20 - type: MeleeWeapon + range: 1.5 wideAnimationRotation: 45 damage: types: - Blunt: 5 + Blunt: 7 + bluntStaminaDamageFactor: 2 + heavyRateModifier: 0.75 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 10 + angle: 75 - type: IncreaseDamageOnWield damage: types: - Blunt: 15 + Blunt: 2 - type: entity parent: BaseHandheldInstrument @@ -186,10 +227,15 @@ - type: MeleeWeapon soundHit: path: /Audio/SimpleStation14/Weapons/Melee/banjohit.ogg + range: 1.5 damage: types: Blunt: 7 - bluntStaminaDamageFactor: 1.5 + bluntStaminaDamageFactor: 2 + heavyRateModifier: 0.75 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 10 + angle: 75 - type: entity parent: BaseHandheldInstrument diff --git a/Resources/Prototypes/Entities/Objects/Fun/toys.yml b/Resources/Prototypes/Entities/Objects/Fun/toys.yml index 094f434c39c..66d6713fb22 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/toys.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/toys.yml @@ -628,6 +628,16 @@ - type: Sprite sprite: Objects/Fun/ducky.rsi state: icon + - type: MeleeWeapon + attackRate: 1.5 + range: 1.3 + damage: + types: + Blunt: 0.1 + heavyDamageBaseModifier: 2 + heavyStaminaCost: 5 + maxTargets: 8 + angle: 25 - type: Clothing quickEquip: false sprite: Objects/Fun/ducky.rsi diff --git a/Resources/Prototypes/Entities/Objects/Materials/bluespace.yml b/Resources/Prototypes/Entities/Objects/Materials/bluespace.yml new file mode 100644 index 00000000000..f93534ecd5c --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Materials/bluespace.yml @@ -0,0 +1,56 @@ +- type: entity + parent: MaterialBase + id: MaterialBluespace + suffix: Full + name: bluespace crystal + components: + - type: Sprite + sprite: Nyanotrasen/Objects/Materials/materials.rsi + layers: + - state: bluespace_3 + map: ["base"] + - type: Appearance + - type: Material + - type: PhysicalComposition + materialComposition: + Bluespace: 100 + - type: Tag + tags: + - BluespaceCrystal + - RawMaterial + - type: Stack + stackType: Bluespace + baseLayer: base + layerStates: + - bluespace + - bluespace_2 + - bluespace_3 + count: 5 + - type: Item + size: Small + +- type: entity + parent: MaterialBluespace + id: MaterialBluespace1 + suffix: 1 + components: + - type: Sprite + state: bluespace + - type: Stack + count: 1 + +- type: entity + parent: MaterialBluespace1 + id: MaterialBluespace3 + suffix: 3 + components: + - type: Stack + count: 3 + +- type: entity + parent: MaterialBluespace1 + id: MaterialBluespace5 + suffix: 5 + components: + - type: Stack + count: 5 diff --git a/Resources/Prototypes/Entities/Objects/Materials/shards.yml b/Resources/Prototypes/Entities/Objects/Materials/shards.yml index 5fcb006cfa5..6cdc066cf10 100644 --- a/Resources/Prototypes/Entities/Objects/Materials/shards.yml +++ b/Resources/Prototypes/Entities/Objects/Materials/shards.yml @@ -89,7 +89,7 @@ color: "#bbeeff" - type: WelderRefinable refineResult: - - SheetGlass1 + - id: SheetGlass1 - type: DamageUserOnTrigger damage: types: @@ -120,8 +120,8 @@ color: "#96cdef" - type: WelderRefinable refineResult: - - SheetGlass1 - - PartRodMetal1 + - id: SheetGlass1 + - id: PartRodMetal1 - type: DamageUserOnTrigger damage: types: @@ -152,8 +152,8 @@ color: "#FF72E7" - type: WelderRefinable refineResult: - - SheetGlass1 - - SheetPlasma1 + - id: SheetGlass1 + - id: SheetPlasma1 - type: DamageUserOnTrigger damage: types: @@ -186,8 +186,8 @@ color: "#8eff7a" - type: WelderRefinable refineResult: - - SheetGlass1 - - SheetUranium1 + - id: SheetGlass1 + - id: SheetUranium1 - type: DamageUserOnTrigger damage: types: @@ -221,8 +221,8 @@ color: "#e0aa36" - type: WelderRefinable refineResult: - - SheetGlass1 - - SheetBrass1 + - id: SheetGlass1 + - id: SheetBrass1 - type: DamageUserOnTrigger damage: types: diff --git a/Resources/Prototypes/Entities/Objects/Misc/briefcases.yml b/Resources/Prototypes/Entities/Objects/Misc/briefcases.yml index 762204701cb..760a0bafb68 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/briefcases.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/briefcases.yml @@ -9,6 +9,18 @@ - type: Storage grid: - 0,0,5,3 + - type: MeleeWeapon + bluntStaminaDamageFactor: 3.0 + attackRate: 0.9 + range: 1.75 + damage: + types: + Blunt: 3.5 + heavyRateModifier: 0.8 + heavyRangeModifier: 0.8 + heavyDamageBaseModifier: 2 + heavyStaminaCost: 5 + maxTargets: 8 - type: Tag tags: - Briefcase diff --git a/Resources/Prototypes/Entities/Objects/Misc/broken_bottle.yml b/Resources/Prototypes/Entities/Objects/Misc/broken_bottle.yml index b7c73f5e0cc..f8dbabd07a1 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/broken_bottle.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/broken_bottle.yml @@ -7,9 +7,16 @@ - type: Sharp - type: MeleeWeapon attackRate: 1.5 + range: 1.3 damage: types: - Slash: 5 + Slash: 4 + heavyRateModifier: 0.8 + heavyRangeModifier: 0.8 + heavyDamageBaseModifier: 1.5 + heavyStaminaCost: 5 + maxTargets: 3 + angle: 75 soundHit: path: /Audio/Weapons/bladeslice.ogg - type: Sprite @@ -28,4 +35,4 @@ - type: SpaceGarbage - type: WelderRefinable refineResult: - - SheetGlass1 + - id: SheetGlass1 diff --git a/Resources/Prototypes/Entities/Objects/Misc/fire_extinguisher.yml b/Resources/Prototypes/Entities/Objects/Misc/fire_extinguisher.yml index bae33f27f17..f1802e426fb 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/fire_extinguisher.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/fire_extinguisher.yml @@ -38,9 +38,16 @@ hasSafety: true - type: MeleeWeapon wideAnimationRotation: 180 + attackRate: 0.8 + bluntStaminaDamageFactor: 2.5 + range: 1.75 damage: types: - Blunt: 10 + Blunt: 8 + heavyRateModifier: 0.8 + heavyDamageBaseModifier: 2 + heavyStaminaCost: 15 + maxTargets: 8 soundHit: path: /Audio/Weapons/smash.ogg - type: Tool diff --git a/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml b/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml index f797ad5cead..7041be7b206 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml @@ -449,7 +449,7 @@ - type: entity parent: IDCardStandard id: LawyerIDCard - name: lawyer ID card + name: attorney ID card # DeltaV - Changed Lawyer to Attorney components: - type: Sprite layers: @@ -462,6 +462,55 @@ - type: PresetIdCard job: Lawyer +- type: entity + parent: IDCardStandard + id: ChiefJusticeIDCard + name: chief justice ID card + components: + - type: PresetIdCard + job: ChiefJustice + - type: Sprite + layers: + - state: default + - state: department + color: "#878787" + - state: subdepartment + color: "#CB0000" + - state: lawyer + + +- type: entity + parent: IDCardStandard + id: ClerkIDCard + name: clerk ID card + components: + - type: PresetIdCard + job: Clerk + - type: Sprite + layers: + - state: default + - state: department + color: "#878787" + - state: subdepartment + color: "#CB0000" + - state: lawyer + +- type: entity + parent: IDCardStandard + id: ProsecutorIDCard + name: presecutor ID card + components: + - type: PresetIdCard + job: Prosecutor + - type: Sprite + layers: + - state: default + - state: department + color: "#878787" + - state: subdepartment + color: "#CB0000" + - state: lawyer + - type: entity parent: IDCardStandard id: HoPIDCard @@ -822,6 +871,9 @@ - JobIconMartialArtist # Nyanotrasen - MartialArtist, see Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/martialartist.yml - JobIconGladiator # Nyanotrasen - Gladiator, see Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/gladiator.yml - JobIconForensicMantis # Nyanotrasen - ForensicMantis, see Resources/Prototypes/Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml + - JobIconClerk # Delta V - Added justice dept + - JobIconChiefJustice # Delta V - Added justice dept + - JobIconProsecutor # Delta V - Added justice dept - JobIconVisitor - type: ActivatableUI key: enum.AgentIDCardUiKey.Key @@ -1084,3 +1136,4 @@ - state: senior - type: PresetIdCard job: SeniorOfficer + diff --git a/Resources/Prototypes/Entities/Objects/Misc/supermatter_sliver.yml b/Resources/Prototypes/Entities/Objects/Misc/supermatter_sliver.yml new file mode 100644 index 00000000000..d62935523d5 --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Misc/supermatter_sliver.yml @@ -0,0 +1,25 @@ +- type: entity + parent: BaseItem + id: SupermatterSliver + name: supermatter sliver + description: A shard from the station's Supermatter crystal. Highly radioactive. + components: + - type: PointLight + enabled: true + radius: 3 + energy: 2 + color: "#fff633" + - type: RadiationSource + intensity: .75 + - type: Icon + sprite: Supermatter/supermatter_sliver.rsi + state: icon + - type: Sprite + sprite: Supermatter/supermatter_sliver.rsi + state: icon + - type: StealTarget + stealGroup: SupermatterSliver + - type: Tag + tags: + - HighRiskItem + - type: SupermatterImmune diff --git a/Resources/Prototypes/Entities/Objects/Power/lights.yml b/Resources/Prototypes/Entities/Objects/Power/lights.yml index c8089cd22d3..b18a0feaa52 100644 --- a/Resources/Prototypes/Entities/Objects/Power/lights.yml +++ b/Resources/Prototypes/Entities/Objects/Power/lights.yml @@ -68,7 +68,7 @@ - type: SpaceGarbage - type: WelderRefinable refineResult: - - SheetGlass1 + - id: SheetGlass1 - type: entity parent: BaseLightbulb @@ -276,8 +276,8 @@ node: icon - type: WelderRefinable refineResult: - - SheetGlass1 - - ShardCrystalCyan + - id: SheetGlass1 + - id: ShardCrystalCyan - type: entity parent: LightTubeCrystalCyan @@ -296,8 +296,8 @@ node: icon - type: WelderRefinable refineResult: - - SheetGlass1 - - ShardCrystalBlue + - id: SheetGlass1 + - id: ShardCrystalBlue - type: entity parent: LightTubeCrystalCyan @@ -316,8 +316,8 @@ node: icon - type: WelderRefinable refineResult: - - SheetGlass1 - - ShardCrystalPink + - id: SheetGlass1 + - id: ShardCrystalPink - type: entity parent: LightTubeCrystalCyan @@ -336,8 +336,8 @@ node: icon - type: WelderRefinable refineResult: - - SheetGlass1 - - ShardCrystalOrange + - id: SheetGlass1 + - id: ShardCrystalOrange - type: entity parent: LightTubeCrystalCyan @@ -356,8 +356,8 @@ node: icon - type: WelderRefinable refineResult: - - SheetGlass1 - - ShardCrystalRed + - id: SheetGlass1 + - id: ShardCrystalRed - type: entity parent: LightTubeCrystalCyan @@ -376,5 +376,5 @@ node: icon - type: WelderRefinable refineResult: - - SheetGlass1 - - ShardCrystalGreen + - id: SheetGlass1 + - id: ShardCrystalGreen diff --git a/Resources/Prototypes/Entities/Objects/Specific/Chapel/bibles.yml b/Resources/Prototypes/Entities/Objects/Specific/Chapel/bibles.yml index 1162a3ec71b..9ab53cebc96 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Chapel/bibles.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Chapel/bibles.yml @@ -45,8 +45,12 @@ - type: MeleeWeapon # Nyanotrasen - Bibles do Holy damage damage: types: - Blunt: 3 - Holy: 10 + Blunt: 4 + Holy: 20 + heavyRateModifier: 0.8 + heavyDamageBaseModifier: 1 + heavyStaminaCost: 5 + maxTargets: 3 - type: Tag tags: - Book diff --git a/Resources/Prototypes/Entities/Objects/Specific/Hydroponics/tools.yml b/Resources/Prototypes/Entities/Objects/Specific/Hydroponics/tools.yml index 727c75c8794..37b8daddc27 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Hydroponics/tools.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Hydroponics/tools.yml @@ -16,7 +16,14 @@ swingLeft: true damage: types: - Slash: 6 + Slash: 3.5 + Blunt: 3 + heavyRateModifier: 1 + heavyRangeModifier: 1 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 5 + maxTargets: 5 + angle: 100 - type: Item sprite: Objects/Tools/Hydroponics/hoe.rsi @@ -34,9 +41,16 @@ state: icon - type: MeleeWeapon wideAnimationRotation: 90 + attackRate: 0.8 damage: types: - Slash: 7 + Pierce: 7 + heavyRateModifier: 0.9 + heavyRangeModifier: 1.25 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 5 + maxTargets: 1 + angle: 20 - type: Item sprite: Objects/Tools/Hydroponics/clippers.rsi storedRotation: -90 @@ -53,9 +67,16 @@ state: icon - type: MeleeWeapon wideAnimationRotation: 135 + range: 1.85 damage: types: - Slash: 10 + Slash: 7 + heavyRateModifier: 0.8 + heavyRangeModifier: 1.25 + heavyDamageBaseModifier: 1.5 + heavyStaminaCost: 5 + maxTargets: 1 + angle: 120 - type: Item size: Normal - type: Clothing @@ -81,10 +102,13 @@ - type: MeleeWeapon wideAnimationRotation: 135 swingLeft: true + attackRate: 1.25 + range: 1.25 damage: types: - Slash: 8 - Piercing: 2 + Slash: 10 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 5 - type: Item sprite: Objects/Tools/Hydroponics/hatchet.rsi @@ -104,14 +128,19 @@ wideAnimationRotation: 45 damage: types: - Blunt: 8 - Piercing: 2 # I guess you can stab it into them? + Blunt: 6 + Slash: 2 # I guess you can stab it into them? + heavyRateModifier: 0.8 + heavyRangeModifier: 1.25 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 5 + angle: 80 soundHit: collection: MetalThud - type: Item sprite: Objects/Tools/Hydroponics/spade.rsi - type: Shovel - speedModifier: 0.75 # slower at digging than a full-sized shovel + speedModifier: 0.85 # slower at digging than a full-sized shovel - type: entity name: plant bag diff --git a/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml b/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml index b192401c8b8..de5c33671a8 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml @@ -8,9 +8,17 @@ sprite: Objects/Specific/Janitorial/mop.rsi state: mop - type: MeleeWeapon + range: 1.85 damage: types: - Blunt: 10 + Blunt: 2 + bluntStaminaDamageFactor: 3 + heavyRateModifier: 0.8 + heavyRangeModifier: 1.25 + heavyDamageBaseModifier: 1.25 + heavyStaminaCost: 10 + maxTargets: 2 + angle: 180 soundHit: collection: MetalThud - type: Spillable @@ -48,9 +56,17 @@ sprite: Objects/Specific/Janitorial/advmop.rsi state: advmop - type: MeleeWeapon + range: 1.85 damage: types: - Blunt: 10 + Blunt: 2 + bluntStaminaDamageFactor: 3 + heavyRateModifier: 0.8 + heavyRangeModifier: 1.25 + heavyDamageBaseModifier: 1.25 + heavyStaminaCost: 10 + maxTargets: 2 + angle: 180 soundHit: collection: MetalThud - type: Spillable diff --git a/Resources/Prototypes/Entities/Objects/Specific/Mech/mechs.yml b/Resources/Prototypes/Entities/Objects/Specific/Mech/mechs.yml index 471801f3a1f..6e5362d9bbb 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Mech/mechs.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Mech/mechs.yml @@ -92,7 +92,6 @@ - type: GuideHelp guides: - Robotics - - type: CanWalk - type: entity id: MechRipley diff --git a/Resources/Prototypes/Entities/Objects/Specific/Medical/medkits.yml b/Resources/Prototypes/Entities/Objects/Specific/Medical/medkits.yml index d7f2231ec99..62e5ab44762 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Medical/medkits.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Medical/medkits.yml @@ -10,7 +10,7 @@ - type: Storage maxItemSize: Small grid: - - 0,0,3,1 + - 0,0,3,2 - type: Item size: Large sprite: Objects/Specific/Medical/firstaidkits.rsi diff --git a/Resources/Prototypes/Entities/Objects/Specific/Medical/morgue.yml b/Resources/Prototypes/Entities/Objects/Specific/Medical/morgue.yml index 8f54bb8059c..da67b5a5928 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Medical/morgue.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Medical/morgue.yml @@ -130,6 +130,7 @@ solution: food - type: Extractable grindableSolutionName: food + - type: SupermatterImmune - type: entity parent: Ash diff --git a/Resources/Prototypes/Entities/Objects/Specific/Medical/surgery.yml b/Resources/Prototypes/Entities/Objects/Specific/Medical/surgery.yml index aa0cf461872..c81768da4d3 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Medical/surgery.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Medical/surgery.yml @@ -50,9 +50,15 @@ - 0,0,1,0 - 1,1,1,1 - type: MeleeWeapon + attackRate: 0.75 + range: 1.3 damage: types: - Piercing: 10 + Piercing: 8 + heavyDamageBaseModifier: 1.5 + heavyStaminaCost: 5 + maxTargets: 1 + angle: 20 soundHit: path: /Audio/Items/drill_hit.ogg - type: StaticPrice @@ -80,10 +86,16 @@ - type: MeleeWeapon wideAnimationRotation: 90 swingLeft: true - attackRate: 1.5 + attackRate: 1.25 + range: 1.25 damage: types: - Slash: 8 + Slash: 7.5 + heavyRateModifier: 0.8 + heavyDamageBaseModifier: 1.25 + heavyStaminaCost: 5 + maxTargets: 1 + angle: 20 soundHit: path: /Audio/Weapons/bladeslice.ogg @@ -111,7 +123,7 @@ - type: MeleeWeapon damage: types: - Slash: 12 + Slash: 8 - type: entity name: laser scalpel @@ -121,6 +133,11 @@ components: - type: Sprite state: laser + - type: MeleeWeapon + damage: + types: + Slash: 6.5 + Heat: 1 - type: Item heldPrefix: laser @@ -179,7 +196,19 @@ qualities: - Sawing speed: 1.0 -# No melee for regular saw because have you ever seen someone use a band saw as a weapon? It's dumb. + - type: MeleeWeapon + attackRate: 0.75 + range: 1.35 + damage: + types: + Blunt: 2.5 + Slash: 6.5 + heavyRateModifier: 0.8 + heavyDamageBaseModifier: 1.0 + heavyStaminaCost: 20 + maxTargets: 8 + angle: 20 +# ~~No melee for regular saw because have you ever seen someone use a band saw as a weapon? It's dumb.~~ No, I'm going to saw through your bones. - type: entity name: choppa @@ -192,9 +221,17 @@ - type: Item heldPrefix: improv - type: MeleeWeapon + attackRate: 0.85 damage: - groups: - Brute: 10 + types: + Blunt: 3 + Slash: 7 + bluntStaminaDamageFactor: 3 + heavyRateModifier: 0.8 + heavyDamageBaseModifier: 1.0 + heavyStaminaCost: 20 + maxTargets: 8 + angle: 20 soundHit: path: /Audio/Weapons/bladeslice.ogg - type: Tool @@ -214,9 +251,18 @@ heldPrefix: electric storedRotation: 90 - type: MeleeWeapon + attackRate: 1.15 + range: 1.4 + bluntStaminaDamageFactor: 3.0 damage: - groups: - Brute: 15 + types: + Blunt: 4.5 + Slash: 5.5 + heavyRateModifier: 0.5 + heavyDamageBaseModifier: 1 + heavyStaminaCost: 15 + maxTargets: 8 + angle: 360 soundHit: path: /Audio/Items/drill_hit.ogg - type: Tool @@ -236,10 +282,18 @@ heldPrefix: advanced storedRotation: 90 - type: MeleeWeapon - attackRate: 1.5 + attackRate: 1.25 + range: 1.4 + bluntStaminaDamageFactor: 5.0 damage: - groups: - Brute: 15 + types: + Blunt: 4.5 + Slash: 7.5 + heavyRateModifier: 0.5 + heavyDamageBaseModifier: 1 + heavyStaminaCost: 15 + maxTargets: 8 + angle: 360 soundHit: path: /Audio/Items/drill_hit.ogg - type: Tool diff --git a/Resources/Prototypes/Entities/Objects/Specific/Research/disk.yml b/Resources/Prototypes/Entities/Objects/Specific/Research/disk.yml index fa1b75530b6..862716c5123 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Research/disk.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Research/disk.yml @@ -36,6 +36,15 @@ - type: ResearchDisk points: 10000 +- type: entity + parent: ResearchDisk + id: ResearchDisk20000 + name: research point disk (20000) + description: A disk for the R&D server containing 20000 points. + components: + - type: ResearchDisk + points: 20000 + - type: entity parent: ResearchDisk id: ResearchDiskDebug diff --git a/Resources/Prototypes/Entities/Objects/Specific/Research/misc.yml b/Resources/Prototypes/Entities/Objects/Specific/Research/misc.yml new file mode 100644 index 00000000000..79c475900aa --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Specific/Research/misc.yml @@ -0,0 +1,9 @@ +- type: entity + parent: PonderingOrb + id: PonderingOrbTelepathic + name: telepathic relay orb + description: Relays messages intercepted from Psionics. + components: + - type: TelepathicRepeater + - type: Psionic + - type: Speech \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml b/Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml index d37523bd735..a7cf7ad5c80 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml @@ -210,6 +210,34 @@ - Crowbar - RadioHandheld +- type: entity + id: BorgModuleJetpack + parent: [ BaseBorgModuleCargo, BaseProviderBorgModule ] + name: jetpack cyborg module + description: A piece of tech that gives cyborgs new abilities. Needs to be loaded by a cyborg before you can refill the jetpack. + components: + - type: Sprite + layers: + - state: cargo + - state: icon-jetpack + - type: BorgJetpack + - type: ItemBorgModule + items: + - JetpackMicroFilled + +- type: entity + id: BorgModulePka + parent: [ BaseBorgModuleCargo, BaseProviderBorgModule ] + name: proto kinetic accelerator cyborg module + components: + - type: Sprite + layers: + - state: cargo + - state: icon-pka + - type: ItemBorgModule + items: + - WeaponProtoKineticAccelerator + - type: entity id: BorgModuleGrapplingGun parent: [ BaseBorgModuleCargo, BaseProviderBorgModule ] diff --git a/Resources/Prototypes/Entities/Objects/Tools/access_configurator.yml b/Resources/Prototypes/Entities/Objects/Tools/access_configurator.yml index 16be537891f..9504ec144a8 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/access_configurator.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/access_configurator.yml @@ -58,6 +58,9 @@ - Service - Theatre - Zookeeper #Delta V: Add Zookeeper Access + - ChiefJustice #Delta V: Add Chief Justice Access + - Prosecutor #Delta V: Add Prosecutor Access + - Justice #Delta V: Add Justice Access privilegedIdSlot: name: id-card-console-privileged-id ejectSound: /Audio/Machines/id_swipe.ogg diff --git a/Resources/Prototypes/Entities/Objects/Tools/flashlights.yml b/Resources/Prototypes/Entities/Objects/Tools/flashlights.yml index d22e9190921..2b75a7e3dd9 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/flashlights.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/flashlights.yml @@ -54,6 +54,14 @@ shader: unshaded visible: false map: [ "light" ] + - type: MeleeWeapon + attackRate: 0.8 + bluntStaminaDamageFactor: 1.5 + damage: + types: + Blunt: 6 + soundHit: + collection: MetalThud - type: Item sprite: Objects/Tools/flashlight.rsi storedRotation: -90 @@ -108,9 +116,15 @@ map: [ "light" ] - type: MeleeWeapon wideAnimationRotation: 90 + attackRate: 0.8 damage: types: - Blunt: 10 + Blunt: 6.5 + bluntStaminaDamageFactor: 1.5 + heavyRateModifier: 0.9 + heavyStaminaCost: 5 + maxTargets: 1 + angle: 20 soundHit: collection: MetalThud - type: Item diff --git a/Resources/Prototypes/Entities/Objects/Tools/gas_tanks.yml b/Resources/Prototypes/Entities/Objects/Tools/gas_tanks.yml index 2f281e141a1..f739de251cb 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/gas_tanks.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/gas_tanks.yml @@ -34,9 +34,16 @@ - type: MeleeWeapon wideAnimationRotation: 45 attackRate: 0.8 + range: 1.75 damage: types: - Blunt: 10 + Blunt: 8 + bluntStaminaDamageFactor: 2.5 + heavyRateModifier: 0.8 + heavyDamageBaseModifier: 1.5 + heavyStaminaCost: 15 + maxTargets: 1 + angle: 140 - type: PhysicalComposition materialComposition: Steel: 185 diff --git a/Resources/Prototypes/Entities/Objects/Tools/jaws_of_life.yml b/Resources/Prototypes/Entities/Objects/Tools/jaws_of_life.yml index 8e2b7597970..36d2f1308fb 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/jaws_of_life.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/jaws_of_life.yml @@ -44,9 +44,18 @@ changeSound: /Audio/Items/change_jaws.ogg - type: MeleeWeapon wideAnimationRotation: 90 + attackRate: 0.75 + range: 1.75 damage: types: Blunt: 10 + Slash: 2 + bluntStaminaDamageFactor: 2.0 + heavyRateModifier: 0.8 + heavyDamageBaseModifier: 1.5 + heavyStaminaCost: 10 + maxTargets: 1 + angle: 20 soundHit: collection: MetalThud @@ -87,4 +96,5 @@ - type: MeleeWeapon damage: types: - Blunt: 14 + Blunt: 12 + Slash: 2 diff --git a/Resources/Prototypes/Entities/Objects/Tools/jetpacks.yml b/Resources/Prototypes/Entities/Objects/Tools/jetpacks.yml index d0ac9c7a78a..a4c103847fe 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/jetpacks.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/jetpacks.yml @@ -295,3 +295,43 @@ moles: - 1.025689525 # oxygen - 1.025689525 # nitrogen + +#Empty micro - Used in the Cyborg module, visually the same as mini jetpack. +- type: entity + id: JetpackMicro + parent: BaseJetpack + name: micro jetpack + suffix: Empty + components: + - type: Item + sprite: Objects/Tanks/Jetpacks/mini.rsi + - type: Sprite + sprite: Objects/Tanks/Jetpacks/mini.rsi + - type: Clothing + sprite: Objects/Tanks/Jetpacks/mini.rsi + slots: + - Back + - suitStorage + - Belt + - type: GasTank + outputPressure: 42.6 + air: + volume: 0.75 + + +# Filled micro +- type: entity + id: JetpackMicroFilled + parent: JetpackMicro + name: micro jetpack + suffix: Filled + components: + - type: GasTank + outputPressure: 42.6 + air: + # 2 minutes of thrust + volume: 0.75 + temperature: 293.15 + moles: + - 0.153853429 # oxygen + - 0.153853429 # nitrogen diff --git a/Resources/Prototypes/Entities/Objects/Tools/penlight.yml b/Resources/Prototypes/Entities/Objects/Tools/penlight.yml new file mode 100644 index 00000000000..7f8a9b262c0 --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Tools/penlight.yml @@ -0,0 +1,90 @@ +- type: entity + name: Pen Light + parent: Pen + id: PenLightBase + description: A pen-sized light, used by medical staff. + components: + - type: HandheldLight + addPrefix: false + - type: Sprite + sprite: Objects/Tools/penlight.rsi + layers: + - state: world + - state: world-on + shader: unshaded + visible: false + map: [ "light" ] + - type: Item + sprite: Objects/Tools/penlight.rsi + heldPrefix: off + - type: PointLight + enabled: false + mask: /Textures/Effects/LightMasks/cone.png + autoRot: true + radius: 2 + netsync: false + - type: PenLight + examSpeed: 3 #time in seconds + - type: Appearance + - type: UserInterface + interfaces: + - key: enum.PenLightUiKey.Key + type: PenLightBoundUserInterface + - type: ToggleableLightVisuals + - type: ContainerContainer + containers: + cell_slot: !type:ContainerSlot {} + - type: PowerCellSlot + cellSlotId: cell_slot + - type: ItemSlots + slots: + cell_slot: + name: power-cell-slot-component-slot-name-default + startingItem: PowerCellSmall + - type: Tag + tags: + - Flashlight + - Write + - Pen + +- type: entity + name: Chief Medical Officer's Pen Light + parent: PenLightBase + id: CMOPenLight + description: A pen-sized light, this one belonging to the Chief Medical Officer. When you get promoted you get a better pen. + components: + - type: HandheldLight + addPrefix: false + - type: Sprite + sprite: Objects/Tools/cmopenlight.rsi + layers: + - state: world + - state: world-on + shader: unshaded + visible: false + map: [ "light" ] + - type: Item + sprite: Objects/Tools/cmopenlight.rsi + heldPrefix: off + - type: PointLight + enabled: false + mask: /Textures/Effects/LightMasks/cone.png + autoRot: true + radius: 2 + netsync: false + - type: PenLight + examSpeed: 1.5 #time in seconds + - type: Appearance + - type: ToggleableLightVisuals + - type: PowerCellSlot + cellSlotId: cell_slot + - type: ItemSlots + slots: + cell_slot: + name: power-cell-slot-component-slot-name-default + startingItem: PowerCellSmall + - type: Tag + tags: + - Flashlight + - Write + - Pen diff --git a/Resources/Prototypes/Entities/Objects/Tools/toolbox.yml b/Resources/Prototypes/Entities/Objects/Tools/toolbox.yml index 9e35443cd4b..6702ae39d69 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/toolbox.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/toolbox.yml @@ -21,9 +21,15 @@ - type: Item size: Ginormous - type: MeleeWeapon + attackRate: 0.9 + range: 1.75 damage: types: - Blunt: 12 + Blunt: 9 + bluntStaminaDamageFactor: 2.0 + heavyRateModifier: 0.8 + heavyStaminaCost: 10 + angle: 80.5 soundHit: path: "/Audio/Weapons/smash.ogg" - type: Tag @@ -134,7 +140,7 @@ - type: MeleeWeapon damage: types: - Blunt: 20 + Blunt: 11.5 - type: entity name: golden toolbox @@ -147,6 +153,10 @@ state: icon - type: Item sprite: Objects/Tools/Toolboxes/toolbox_gold.rsi + - type: MeleeWeapon + damage: + types: + Blunt: 12 - type: entity id: ToolboxThief diff --git a/Resources/Prototypes/Entities/Objects/Tools/tools.yml b/Resources/Prototypes/Entities/Objects/Tools/tools.yml index 9ac46dbe305..a6926f1d8c3 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/tools.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/tools.yml @@ -5,12 +5,20 @@ description: This kills the wire. components: - type: EmitSoundOnPickup - sound: /Audio/SimpleStation14/Items/Handling/wirecutter_pickup.ogg + sound: + path: /Audio/SimpleStation14/Items/Handling/wirecutter_pickup.ogg + params: + volume: -2 - type: EmitSoundOnDrop - sound: /Audio/SimpleStation14/Items/Handling/wirecutter_drop.ogg + sound: + path: /Audio/SimpleStation14/Items/Handling/wirecutter_drop.ogg + params: + volume: -2 - type: EmitSoundOnLand sound: path: /Audio/Items/wirecutter_drop.ogg + params: + volume: -2 - type: Tag tags: - PlantSampleTaker @@ -23,10 +31,16 @@ - state: cutters-cutty-thingy - type: MeleeWeapon wideAnimationRotation: -90 + attackRate: 0.9 + range: 1.6 damage: types: - Piercing: 2 - attackRate: 2 #open and close that shit on their arm like hell! because you sure aren't doing any damage with this + Blunt: 6.5 + heavyRateModifier: 0.9 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 5 + maxTargets: 4 + angle: 60 soundHit: path: "/Audio/Items/wirecutter.ogg" - type: Tool @@ -55,12 +69,20 @@ description: Industrial grade torque in a small screwdriving package. components: - type: EmitSoundOnPickup - sound: /Audio/SimpleStation14/Items/Handling/screwdriver_pickup.ogg + sound: + path: /Audio/SimpleStation14/Items/Handling/screwdriver_pickup.ogg + params: + volume: -2 - type: EmitSoundOnDrop - sound: /Audio/SimpleStation14/Items/Handling/screwdriver_drop.ogg + sound: + path: /Audio/SimpleStation14/Items/Handling/screwdriver_drop.ogg + params: + volume: -2 - type: EmitSoundOnLand sound: path: /Audio/Items/screwdriver_drop.ogg + params: + volume: -2 - type: Tag tags: - Screwdriver @@ -75,10 +97,15 @@ storedRotation: -90 - type: MeleeWeapon wideAnimationRotation: -90 - attackRate: 1 + attackRate: 1.35 damage: types: Piercing: 6 + heavyRateModifier: 0.75 + heavyDamageBaseModifier: 1.5 + heavyStaminaCost: 5 + maxTargets: 1 + angle: 20 soundHit: path: "/Audio/Weapons/bladeslice.ogg" - type: Tool @@ -103,12 +130,20 @@ description: 'A common tool for assembly and disassembly. Remember: righty tighty, lefty loosey.' components: - type: EmitSoundOnPickup - sound: /Audio/SimpleStation14/Items/Handling/wrench_pickup.ogg + sound: + path: /Audio/SimpleStation14/Items/Handling/wrench_pickup.ogg + params: + volume: -2 - type: EmitSoundOnDrop - sound: /Audio/SimpleStation14/Items/Handling/wrench_drop.ogg + sound: + path: /Audio/SimpleStation14/Items/Handling/wrench_drop.ogg + params: + volume: -2 - type: EmitSoundOnLand sound: path: /Audio/Items/wrench_drop.ogg + params: + volume: -2 - type: Tag tags: - Wrench @@ -122,10 +157,16 @@ state: storage - type: MeleeWeapon wideAnimationRotation: 135 - attackRate: 1.5 + attackRate: 0.9 + range: 1.6 damage: types: - Blunt: 4.5 + Blunt: 6.5 + bluntStaminaDamageFactor: 1.5 + heavyRateModifier: 0.75 + heavyDamageBaseModifier: 1.75 + heavyStaminaCost: 5 + angle: 100 soundHit: collection: MetalThud - type: Tool @@ -146,12 +187,20 @@ description: A multipurpose tool to pry open doors and fight interdimensional invaders. components: - type: EmitSoundOnPickup - sound: /Audio/SimpleStation14/Items/Handling/crowbar_pickup.ogg + sound: + path: /Audio/SimpleStation14/Items/Handling/crowbar_pickup.ogg + params: + volume: -2 - type: EmitSoundOnDrop - sound: /Audio/SimpleStation14/Items/Handling/crowbar_drop.ogg + sound: + path: /Audio/SimpleStation14/Items/Handling/crowbar_drop.ogg + params: + volume: -2 - type: EmitSoundOnLand sound: path: /Audio/Items/crowbar_drop.ogg + params: + volume: -2 - type: Tag tags: - Crowbar @@ -166,9 +215,12 @@ state: storage - type: MeleeWeapon wideAnimationRotation: -135 + attackRate: 1.25 damage: types: - Blunt: 8 + Blunt: 6 + bluntStaminaDamageFactor: 2 + heavyStaminaCost: 5 soundHit: collection: MetalThud - type: Tool @@ -220,6 +272,16 @@ - state: icon - state: green-unlit shader: unshaded + - type: MeleeWeapon + attackRate: 0.75 + damage: + types: + Shock: 2 + heavyRateModifier: 0.9 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 5 + maxTargets: 1 + angle: 20 - type: Item size: Small - type: Clothing @@ -359,10 +421,16 @@ price: 100 - type: MeleeWeapon wideAnimationRotation: -90 - attackRate: 1.5 + attackRate: 0.9 + range: 1.4 damage: types: - Piercing: 10 + Piercing: 8 + heavyRateModifier: 0.9 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 5 + maxTargets: 1 + angle: 20 soundHit: path: "/Audio/Items/drill_hit.ogg" @@ -568,9 +636,16 @@ state: icon - type: MeleeWeapon wideAnimationRotation: 45 + attackRate: 0.8 + range: 2.0 damage: types: - Blunt: 14 + Blunt: 8 + bluntStaminaDamageFactor: 1.5 + heavyRateModifier: 0.9 + heavyDamageBaseModifier: 1.5 + heavyStaminaCost: 10 + angle: 100 soundHit: collection: MetalThud - type: Item @@ -610,9 +685,16 @@ - Belt - type: MeleeWeapon wideAnimationRotation: -135 + attackRate: 0.9 damage: types: Blunt: 7 + bluntStaminaDamageFactor: 2.0 + heavyRateModifier: 0.8 + heavyDamageBaseModifier: 1.5 + heavyStaminaCost: 5 + maxTargets: 1 + angle: 20 soundHit: collection: MetalThud - type: Tool diff --git a/Resources/Prototypes/Entities/Objects/Tools/welders.yml b/Resources/Prototypes/Entities/Objects/Tools/welders.yml index e141f35caeb..8214ec56f34 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/welders.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/welders.yml @@ -55,7 +55,7 @@ collection: MetalThud activatedDamage: types: - Heat: 8 + Heat: 7 - type: ItemToggleSize activatedSize: Large - type: ItemToggleHot @@ -75,7 +75,7 @@ wideAnimationRotation: -90 damage: types: - Blunt: 5 #i mean... i GUESS you could use it like that + Blunt: 6 #i mean... i GUESS you could use it like that soundHit: collection: MetalThud - type: RefillableSolution diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Bombs/plastic.yml b/Resources/Prototypes/Entities/Objects/Weapons/Bombs/plastic.yml index 62f81fa5466..b39c8af9b25 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Bombs/plastic.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Bombs/plastic.yml @@ -1,4 +1,4 @@ -- type: entity +- type: entity id: BasePlasticExplosive parent: BaseItem abstract: true @@ -106,3 +106,32 @@ maxIntensity: 30 canCreateVacuum: false - type: ExplodeOnTrigger + +- type: entity + name: breaching charge + description: A breaching explosive for security officers to break through walls. + parent: SeismicCharge + id: BreachingCharge + components: + - type: Sprite + sprite: Objects/Weapons/Bombs/breaching.rsi + state: icon + layers: + - state: icon + map: ["base"] + - type: OnUseTimerTrigger + delay: 10 + delayOptions: [10, 15, 20, 25] + initialBeepDelay: 0 + beepSound: + path: /Audio/Effects/Cargo/buzz_two.ogg + params: + volume: -6 + startOnStick: true + canToggleStartOnStick: true + - type: Explosive + explosionType: DemolitionCharge + totalIntensity: 10 + intensitySlope: 10 + maxIntensity: 10 + canCreateVacuum: false diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml index fb2f56a6ed6..ec0a0a148bd 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml @@ -21,6 +21,7 @@ fireOnDropChance: 0.15 soundGunshot: path: /Audio/Weapons/Guns/Gunshots/laser.ogg + doRecoil: false - type: Battery maxCharge: 1000 startingCharge: 1000 @@ -48,6 +49,7 @@ - SemiAuto soundGunshot: path: /Audio/Weapons/Guns/Gunshots/laser.ogg + doRecoil: false - type: MagazineAmmoProvider - type: ItemSlots slots: diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/baseball_bat.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/baseball_bat.yml index 834d35a5297..8780d377e05 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/baseball_bat.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/baseball_bat.yml @@ -9,17 +9,24 @@ state: icon - type: MeleeWeapon wideAnimationRotation: -135 + range: 1.6 damage: types: - Blunt: 10 + Blunt: 7.5 Structural: 5 + bluntStaminaDamageFactor: 2.0 + heavyRateModifier: 0.5 + heavyDamageBaseModifier: 1.75 + heavyStaminaCost: 15 + maxTargets: 2 + angle: 120 soundHit: collection: MetalThud - type: Wieldable - type: IncreaseDamageOnWield damage: types: - Blunt: 5 + Blunt: 4 Structural: 10 - type: Item size: Normal diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/chainsaw.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/chainsaw.yml index bfdd94add6c..b2727b334c6 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/chainsaw.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/chainsaw.yml @@ -15,7 +15,6 @@ state: icon - type: MeleeWeapon autoAttack: true - angle: 0 wideAnimationRotation: -135 attackRate: 4 damage: @@ -23,6 +22,11 @@ Slash: 2 Blunt: 2 Structural: 4 + heavyRateModifier: 0.5 + heavyDamageBaseModifier: 1.0 + heavyStaminaCost: 15 + maxTargets: 20 + angle: 160 soundHit: path: /Audio/Weapons/chainsaw.ogg params: diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/cult.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/cult.yml index ecb6479de70..5e9d789b658 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/cult.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/cult.yml @@ -10,10 +10,14 @@ state: icon - type: MeleeWeapon wideAnimationRotation: -135 - attackRate: 1.5 + attackRate: 1.25 + range: 1.4 damage: types: - Slash: 12 + Slash: 8 + heavyRateModifier: 0.9 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 5 - type: Item size: Normal - type: Clothing @@ -35,9 +39,14 @@ - type: MeleeWeapon wideAnimationRotation: -135 attackRate: 0.75 + range: 1.75 damage: types: - Slash: 16 + Slash: 12 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 10 + maxTargets: 6 + angle: 90 - type: Item size: Normal - type: Clothing @@ -62,19 +71,24 @@ - type: MeleeWeapon wideAnimationRotation: -135 attackRate: 0.75 + range: 1.75 damage: types: - Blunt: 10 - Slash: 10 + Blunt: 2 + Slash: 13 Structural: 5 + heavyRateModifier: 0.9 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 10 + angle: 100 soundHit: collection: MetalThud - type: Wieldable - type: IncreaseDamageOnWield damage: types: - Blunt: 5 - Slash: 5 + Blunt: 2 + Slash: 3 Structural: 10 - type: Item size: Ginormous diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml index bc376df5eab..0cbc824365d 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml @@ -35,8 +35,8 @@ variation: 0.125 activatedDamage: types: - Slash: 15 - Heat: 15 + Slash: 8 + Heat: 10 Structural: 20 - type: Sprite sprite: Objects/Weapons/Melee/e_sword.rsi @@ -49,7 +49,7 @@ map: [ "blade" ] - type: MeleeWeapon wideAnimationRotation: -135 - attackRate: 1 + attackRate: 1.25 damage: types: Blunt: 4.5 @@ -106,8 +106,8 @@ variation: 0.250 activatedDamage: types: - Slash: 10 - Heat: 10 + Slash: 4 + Heat: 8 deactivatedSecret: true - type: ItemToggleActiveSound activeSound: @@ -245,8 +245,8 @@ variation: 0.250 activatedDamage: types: - Slash: 12 - Heat: 12 + Slash: 8 + Heat: 13 Structural: 15 - type: ItemToggleActiveSound activeSound: diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/fireaxe.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/fireaxe.yml index 93765ec40c3..b30a2855796 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/fireaxe.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/fireaxe.yml @@ -18,16 +18,20 @@ damage: types: # axes are kinda like sharp hammers, you know? - Blunt: 5 - Slash: 10 + Blunt: 4 + Slash: 6 Structural: 10 + heavyDamageBaseModifier: 1.0 + heavyStaminaCost: 10 + angle: 100 soundHit: collection: MetalThud - type: Wieldable - type: IncreaseDamageOnWield damage: types: - Slash: 10 + Blunt: 2 + Slash: 5 Structural: 40 - type: Item size: Ginormous diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/knife.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/knife.yml index 9cd1bb29408..68f8863d116 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/knife.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/knife.yml @@ -12,9 +12,16 @@ - Knife - type: MeleeWeapon wideAnimationRotation: -135 + attackRate: 1.25 + range: 1.4 damage: types: - Slash: 10 + Slash: 8 + heavyRateModifier: 0.8 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 5 + maxTargets: 3 + angle: 40 soundHit: path: /Audio/Weapons/bladeslice.ogg - type: Sprite @@ -60,10 +67,11 @@ state: butch - type: MeleeWeapon wideAnimationRotation: -115 - attackRate: 1.5 + attackRate: 1 damage: types: - Slash: 13 + Slash: 8 + Blunt: 1 - type: Item size: Normal sprite: Objects/Weapons/Melee/cleaver.rsi @@ -87,15 +95,16 @@ - type: MeleeWeapon wideAnimationRotation: -135 attackRate: 1.5 + range: 1.4 damage: types: - Slash: 12 + Slash: 9 - type: EmbeddableProjectile sound: /Audio/Weapons/star_hit.ogg - type: DamageOtherOnHit damage: types: - Slash: 10 + Slash: 9 - type: Item sprite: Objects/Weapons/Melee/combat_knife.rsi - type: DisarmMalus @@ -110,6 +119,13 @@ - type: Sprite sprite: Objects/Weapons/Melee/survival_knife.rsi state: icon + - type: MeleeWeapon + wideAnimationRotation: -135 + attackRate: 1.25 + range: 1.5 + damage: + types: + Slash: 8 - type: Item sprite: Objects/Weapons/Melee/survival_knife.rsi @@ -124,9 +140,10 @@ state: icon - type: MeleeWeapon attackRate: 1.0 + range: 1.75 damage: types: - Slash: 15 + Slash: 10 - type: Item sprite: Objects/Weapons/Melee/kukri_knife.rsi @@ -186,7 +203,8 @@ sprite: Objects/Weapons/Melee/shiv.rsi state: icon - type: MeleeWeapon - attackRate: 1.5 + attackRate: 1.75 + range: 0.75 damage: types: Slash: 5.5 @@ -205,7 +223,6 @@ graph: ReinforcedShiv node: icon - type: MeleeWeapon - attackRate: 1.5 damage: types: Slash: 7 #each "tier" grants an additional 2 damage @@ -224,10 +241,9 @@ graph: PlasmaShiv node: icon - type: MeleeWeapon - attackRate: 1.5 damage: types: - Slash: 9 + Slash: 8.5 - type: Item sprite: Objects/Weapons/Melee/plasma_shiv.rsi - type: Sprite @@ -243,10 +259,9 @@ graph: UraniumShiv node: icon - type: MeleeWeapon - attackRate: 1.5 damage: types: - Slash: 7 + Slash: 6.5 Radiation: 4 - type: Item sprite: Objects/Weapons/Melee/uranium_shiv.rsi diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/mining.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/mining.yml index ccf45bf59aa..a1addba2625 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/mining.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/mining.yml @@ -43,12 +43,18 @@ capacity: 1 count: 1 - type: MeleeWeapon - attackRate: 1.5 + attackRate: 0.75 + range: 1.75 wideAnimationRotation: -135 damage: types: - Blunt: 10 - Slash: 5 + Blunt: 8 + Slash: 4 + bluntStaminaDamageFactor: 2.0 + heavyRateModifier: 0.75 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 10 + angle: 120 soundHit: collection: MetalThud - type: Wieldable @@ -79,10 +85,16 @@ - type: MeleeWeapon autoAttack: true wideAnimationRotation: -135 - attackRate: 2 + attackRate: 1.25 + range: 1.4 damage: types: - Slash: 15 + Slash: 9 + heavyRateModifier: 0.9 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 5 + maxTargets: 2 + angle: 20 - type: Tag tags: - Knife diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/pickaxe.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/pickaxe.yml index 324d4ee878e..6ba659ccb40 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/pickaxe.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/pickaxe.yml @@ -11,21 +11,27 @@ sprite: Objects/Weapons/Melee/pickaxe.rsi state: pickaxe - type: MeleeWeapon - attackRate: 0.7 + attackRate: 0.75 + range: 1.75 wideAnimationRotation: -135 soundHit: path: "/Audio/Weapons/smash.ogg" params: volume: -3 damage: - groups: - Brute: 5 + types: + Blunt: 6 + Pierce: 3 + bluntStaminaDamageFactor: 2.0 + heavyDamageBaseModifier: 1.75 + heavyStaminaCost: 5 + maxTargets: 2 + angle: 60 - type: Wieldable - type: IncreaseDamageOnWield damage: - groups: - Brute: 10 types: + Blunt: 5 Structural: 30 - type: Item size: Normal @@ -52,16 +58,24 @@ state: handdrill - type: MeleeWeapon autoAttack: true - angle: 0 wideAnimationRotation: -90 soundHit: path: "/Audio/Items/drill_hit.ogg" - attackRate: 3.5 + attackRate: 0.5 + range: 1.4 damage: - groups: - Brute: 3 types: + Blunt: 9 + Slash: 3 Structural: 12 + bluntStaminaDamageFactor: 4.0 + heavyRateModifier: 1 + heavyRangeModifier: 2 + heavyDamageBaseModifier: 1 + heavyStaminaCost: 10 + maxTargets: 3 + angle: 20 + - type: ReverseEngineering # Nyano difficulty: 2 recipes: diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/sledgehammer.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/sledgehammer.yml index 0c75015d9aa..ecc84e50073 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/sledgehammer.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/sledgehammer.yml @@ -9,10 +9,18 @@ state: icon - type: MeleeWeapon wideAnimationRotation: -135 + attackRate: 0.8 + range: 1.75 damage: types: - Blunt: 10 + Blunt: 6 Structural: 10 + bluntStaminaDamageFactor: 2.0 + heavyRateModifier: 0.75 + heavyDamageBaseModifier: 1.75 + heavyStaminaCost: 15 + maxTargets: 10 + angle: 120 soundHit: collection: MetalThud - type: Wieldable diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/spear.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/spear.yml index 0def916ddc7..576d0b2a0ce 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/spear.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/spear.yml @@ -35,17 +35,24 @@ visible: false - type: MeleeWeapon wideAnimationRotation: -135 + range: 1.75 damage: types: - Piercing: 12 - angle: 0 + Piercing: 7 + Slash: 1 + heavyRateModifier: 0.75 + heavyRangeModifier: 1.25 + heavyDamageBaseModifier: 1.0 + heavyStaminaCost: 5 + maxTargets: 3 + angle: 20 animation: WeaponArcThrust soundHit: path: /Audio/Weapons/bladeslice.ogg - type: DamageOtherOnHit damage: types: - Piercing: 15 + Piercing: 10 - type: Item size: Ginormous - type: Clothing @@ -75,7 +82,8 @@ - type: IncreaseDamageOnWield damage: types: - Piercing: 4 + Piercing: 3 + Slash: 3 - type: Damageable damageContainer: Inorganic - type: Destructible @@ -124,11 +132,12 @@ wideAnimationRotation: -135 damage: types: - Piercing: 15 + Piercing: 8.5 + Slash: 1 - type: DamageOtherOnHit damage: types: - Piercing: 18 + Piercing: 12 - type: Construction graph: SpearReinforced @@ -144,11 +153,12 @@ wideAnimationRotation: -135 damage: types: - Piercing: 18 + Piercing: 9.5 + Slash: 1.5 - type: DamageOtherOnHit damage: types: - Piercing: 21 + Piercing: 14 - type: Construction graph: SpearPlasma @@ -164,13 +174,13 @@ wideAnimationRotation: -135 damage: types: - Piercing: 10 + Piercing: 8 Radiation: 8 - type: DamageOtherOnHit damage: types: - Piercing: 12 - Radiation: 9 + Piercing: 8 + Radiation: 8 - type: Construction graph: SpearUranium diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/stunprod.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/stunprod.yml index b0b166f6ce8..d8955b4defe 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/stunprod.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/stunprod.yml @@ -30,16 +30,23 @@ energyPerUse: 70 - type: MeleeWeapon wideAnimationRotation: -135 + attackRate: 0.8 + range: 1.4 damage: types: - Blunt: 9 + Blunt: 7.5 + bluntStaminaDamageFactor: 2.0 + heavyRateModifier: 0.8 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 5 + maxTargets: 3 angle: 60 animation: WeaponArcThrust - type: StaminaDamageOnHit - damage: 20 + damage: 22 sound: /Audio/Weapons/egloves.ogg - type: StaminaDamageOnCollide - damage: 20 + damage: 22 sound: /Audio/Weapons/egloves.ogg - type: Battery maxCharge: 360 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/sword.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/sword.yml index 17e31e5893c..82b99ce37e3 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/sword.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/sword.yml @@ -10,12 +10,19 @@ state: icon - type: MeleeWeapon wideAnimationRotation: -135 - attackRate: 1.5 + attackRate: 1.25 + range: 1.75 soundHit: path: /Audio/SimpleStation14/Weapons/Melee/rapierhit.ogg damage: types: Slash: 17 #cmon, it has to be at least BETTER than the rest. + heavyRateModifier: 0.8 + heavyRangeModifier: 1 + heavyDamageBaseModifier: 1 + heavyStaminaCost: 5 + maxTargets: 7 + angle: 80 - type: Reflect enabled: true reflectProb: .5 @@ -43,11 +50,18 @@ state: icon - type: MeleeWeapon wideAnimationRotation: -135 + attackRate: 1.5 soundHit: path: /Audio/SimpleStation14/Weapons/Melee/rapierhit.ogg damage: types: - Slash: 15 + Slash: 12 + heavyRateModifier: 0.5 + heavyRangeModifier: 3 #Superior Japanese folded steel + heavyDamageBaseModifier: 1.25 + heavyStaminaCost: 10 + maxTargets: 1 + angle: 20 - type: Item size: Normal sprite: DeltaV/Objects/Weapons/Melee/katana.rsi #DeltaV @@ -66,7 +80,7 @@ wideAnimationRotation: -60 damage: types: - Slash: 30 + Slash: 25 - type: Item size: Normal sprite: Objects/Weapons/Melee/energykatana.rsi @@ -99,9 +113,15 @@ state: icon - type: MeleeWeapon wideAnimationRotation: -135 + attackRate: 0.8 damage: types: Slash: 15 + heavyRateModifier: 0.8 + heavyRangeModifier: 1.25 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 10 + angle: 80 soundHit: path: /Audio/Weapons/bladeslice.ogg - type: Item @@ -121,10 +141,19 @@ state: icon - type: MeleeWeapon wideAnimationRotation: -135 - attackRate: 0.75 + attackRate: 0.65 + range: 1.85 damage: types: - Slash: 20 + Slash: 19 + Blunt: 1 + bluntStaminaDamageFactor: 25.0 + heavyRateModifier: 0.5 + heavyRangeModifier: 1 + heavyDamageBaseModifier: 1 + heavyStaminaCost: 20 + maxTargets: 10 + angle: 200 soundHit: path: /Audio/Weapons/bladeslice.ogg - type: Item @@ -150,9 +179,16 @@ state: icon - type: MeleeWeapon wideAnimationRotation: -135 + attackRate: 1.25 damage: types: - Slash: 16 + Slash: 12 + heavyRateModifier: 0.8 + heavyRangeModifier: 1.2 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 10 + maxTargets: 3 + angle: 40 soundHit: path: /Audio/Weapons/bladeslice.ogg - type: Item diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/white_cane.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/white_cane.yml index 6b24c96e309..123de813cbd 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/white_cane.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/white_cane.yml @@ -12,16 +12,23 @@ sprite: Objects/Weapons/Melee/white_cane.rsi - type: MeleeWeapon wideAnimationRotation: 45 + attackRate: 0.9 + range: 1.6 damage: types: - Blunt: 5 - - type: StaminaDamageOnHit - damage: 5 + Blunt: 6 + bluntStaminaDamageFactor: 2.5 + heavyRateModifier: 0.5 + heavyRangeModifier: 1.75 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 0 + maxTargets: 1 + angle: 20 - type: Wieldable - type: IncreaseDamageOnWield damage: types: - Blunt: 3 + Blunt: 2 - type: UseDelay delay: 1 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/grenades.yml b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/grenades.yml index 1cad73e30ea..f25023b4541 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/grenades.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/grenades.yml @@ -314,7 +314,7 @@ sprite: Objects/Weapons/Grenades/empgrenade.rsi - type: EmpOnTrigger range: 4 - energyConsumption: 50000 + energyConsumption: 2700000 - type: DeleteOnTrigger - type: Appearance - type: TimerTriggerVisuals diff --git a/Resources/Prototypes/Entities/Objects/Weapons/security.yml b/Resources/Prototypes/Entities/Objects/Weapons/security.yml index 9ac737e9cbb..a952713dd5f 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/security.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/security.yml @@ -35,6 +35,10 @@ types: Blunt: 7 bluntStaminaDamageFactor: 2.0 + heavyRateModifier: 0.75 + heavyDamageBaseModifier: 1.75 + heavyStaminaCost: 5 + maxTargets: 3 angle: 60 animation: WeaponArcSlash - type: StaminaDamageOnHit @@ -93,12 +97,16 @@ state: icon - type: MeleeWeapon wideAnimationRotation: -135 + attackRate: 0.8 damage: types: - Blunt: 20 + Blunt: 15 soundHit: collection: MetalThud - bluntStaminaDamageFactor: 1.5 + bluntStaminaDamageFactor: 2 + heavyRateModifier: 1 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 10 - type: Item size: Normal - type: Clothing diff --git a/Resources/Prototypes/Entities/Objects/base_item.yml b/Resources/Prototypes/Entities/Objects/base_item.yml index 55c4bbd6b79..84b5477f508 100644 --- a/Resources/Prototypes/Entities/Objects/base_item.yml +++ b/Resources/Prototypes/Entities/Objects/base_item.yml @@ -14,8 +14,6 @@ - type: EmitSoundOnLand sound: path: /Audio/Effects/drop.ogg - params: - volume: 2 - type: DamageOnHighSpeedImpact damage: types: diff --git a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/access.yml b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/access.yml index 23943307ad9..f12bd2b553e 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/access.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/access.yml @@ -11,7 +11,7 @@ layoutId: AirlockService - type: entity - parent: AirlockServiceLocked + parent: AirlockJustice # DeltaV - Lawyer is in Justice Dept id: AirlockLawyerLocked suffix: Lawyer, Locked components: @@ -421,8 +421,8 @@ layoutId: AirlockService - type: entity - parent: AirlockServiceGlassLocked - id: AirlockLawyerGlassLocked + parent: AirlockJusticeGlass + id: AirlockLawyerGlassLocked # DeltaV - Lawyer is in Justice Dept suffix: Lawyer, Locked components: - type: ContainerFill diff --git a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/easy_pry.yml b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/easy_pry.yml deleted file mode 100644 index 04a58eebe07..00000000000 --- a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/easy_pry.yml +++ /dev/null @@ -1,63 +0,0 @@ -- type: entity - parent: AirlockExternal - id: AirlockExternalEasyPry - suffix: External, EasyPry - description: It opens, it closes, it might crush you, and there might be only space behind it. Has to be manually activated. Has a valve labelled "TURN TO OPEN" - components: - - type: PryUnpowered - -- type: entity - parent: AirlockExternalGlass - id: AirlockExternalGlassEasyPry - suffix: External, Glass, EasyPry - description: It opens, it closes, it might crush you, and there might be only space behind it. Has to be manually activated. Has a valve labelled "TURN TO OPEN" - components: - - type: PryUnpowered - -- type: entity - parent: AirlockGlassShuttle - id: AirlockGlassShuttleEasyPry - suffix: EasyPry, Docking - description: Necessary for connecting two space craft together. Has a valve labelled "TURN TO OPEN" - components: - - type: PryUnpowered - -- type: entity - parent: AirlockShuttle - id: AirlockShuttleEasyPry - suffix: EasyPry, Docking - description: Necessary for connecting two space craft together. Has a valve labelled "TURN TO OPEN" - components: - - type: PryUnpowered - -- type: entity - parent: AirlockExternalLocked - id: AirlockExternalEasyPryLocked - suffix: External, EasyPry, Locked - description: It opens, it closes, it might crush you, and there might be only space behind it. Has to be manually activated. Has a valve labelled "TURN TO OPEN" - components: - - type: PryUnpowered - -- type: entity - parent: AirlockExternalGlassLocked - id: AirlockExternalGlassEasyPryLocked - suffix: External, Glass, EasyPry, Locked - description: It opens, it closes, it might crush you, and there might be only space behind it. Has to be manually activated. Has a valve labelled "TURN TO OPEN" - components: - - type: PryUnpowered - -- type: entity - parent: AirlockExternalGlassShuttleLocked - id: AirlockGlassShuttleEasyPryLocked - suffix: EasyPry, Docking, Locked - description: Necessary for connecting two space craft together. Has a valve labelled "TURN TO OPEN" - components: - - type: PryUnpowered - -- type: entity - parent: AirlockExternalShuttleLocked - id: AirlockShuttleEasyPryLocked - suffix: EasyPry, Docking, Locked - description: Necessary for connecting two space craft together. Has a valve labelled "TURN TO OPEN" - components: - - type: PryUnpowered diff --git a/Resources/Prototypes/Entities/Structures/Doors/airlock_groups.yml b/Resources/Prototypes/Entities/Structures/Doors/airlock_groups.yml index dfb37f49869..2cb30277d20 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/airlock_groups.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/airlock_groups.yml @@ -13,6 +13,7 @@ science: Structures/Doors/Airlocks/Standard/science.rsi security: Structures/Doors/Airlocks/Standard/security.rsi virology: Structures/Doors/Airlocks/Standard/virology.rsi + justice: DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi # Delta V - Add Justice Dept - type: AirlockGroup id: Glass @@ -28,6 +29,7 @@ medical: Structures/Doors/Airlocks/Glass/medical.rsi security: Structures/Doors/Airlocks/Glass/security.rsi virology: Structures/Doors/Airlocks/Glass/virology.rsi + justice: DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi # Delta V - Add Justice Dept - type: AirlockGroup id: Windoor diff --git a/Resources/Prototypes/Entities/Structures/Furniture/dresser.yml b/Resources/Prototypes/Entities/Structures/Furniture/dresser.yml index 2caa4010ca0..1d0a25ed852 100644 --- a/Resources/Prototypes/Entities/Structures/Furniture/dresser.yml +++ b/Resources/Prototypes/Entities/Structures/Furniture/dresser.yml @@ -51,6 +51,8 @@ parent: Dresser suffix: Filled components: + - type: StaticPrice + price: 15 - type: StorageFill contents: - id: ClothingNeckLGBTPin diff --git a/Resources/Prototypes/Entities/Structures/Machines/Computers/base_structurecomputers.yml b/Resources/Prototypes/Entities/Structures/Machines/Computers/base_structurecomputers.yml index 204e06c8600..b7ea7c6f6ca 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/Computers/base_structurecomputers.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/Computers/base_structurecomputers.yml @@ -61,3 +61,12 @@ - type: LightningTarget priority: 1 - type: RequireProjectileTarget + - type: LanguageSpeaker + currentLanguage: GalacticCommon + - type: LanguageKnowledge + speaks: + - GalacticCommon + - RobotTalk + understands: + - GalacticCommon + - RobotTalk diff --git a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml index 2f4ecae7645..7e861db0d5a 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml @@ -169,6 +169,7 @@ - ShellTranquilizer - CartridgeLightRifle - CartridgeRifle + - CombatKnife - MagazineBoxPistol - MagazineBoxMagnum - MagazineBoxRifle @@ -593,6 +594,8 @@ - BorgModuleAdvancedTool - BorgModuleGPS - BorgModuleRCD + - BorgModuleJetpack + - BorgModulePka - BorgModuleArtifact - BorgModuleAnomaly - BorgModuleGardening @@ -706,6 +709,7 @@ runningState: icon staticRecipes: - ClothingEyesHudSecurity + - CombatKnife - Flash - Handcuffs - Zipties diff --git a/Resources/Prototypes/Entities/Structures/Machines/telecomms.yml b/Resources/Prototypes/Entities/Structures/Machines/telecomms.yml index 6cc1fc79814..2a7d827522e 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/telecomms.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/telecomms.yml @@ -80,3 +80,85 @@ - EncryptionKeySecurity - EncryptionKeyService - EncryptionKeyCommand + - EncryptionKeyJustice #DeltaV - Justice dept + +- type: entity + parent: TelecomServer + id: TelecomServerFilledCommon + suffix: Common + components: + - type: ContainerFill + containers: + key_slots: + - EncryptionKeyCommon + +- type: entity + parent: TelecomServer + id: TelecomServerFilledCargo + suffix: Cargo + components: + - type: ContainerFill + containers: + key_slots: + - EncryptionKeyCargo + +- type: entity + parent: TelecomServer + id: TelecomServerFilledEngineering + suffix: Engineering + components: + - type: ContainerFill + containers: + key_slots: + - EncryptionKeyEngineering + +- type: entity + parent: TelecomServer + id: TelecomServerFilledMedical + suffix: Medical + components: + - type: ContainerFill + containers: + key_slots: + - EncryptionKeyMedical + +- type: entity + parent: TelecomServer + id: TelecomServerFilledScience + suffix: Science + components: + - type: ContainerFill + containers: + key_slots: + - EncryptionKeyScience + +- type: entity + parent: TelecomServer + id: TelecomServerFilledSecurity + suffix: Security + components: + - type: ContainerFill + containers: + key_slots: + - EncryptionKeySecurity + - EncryptionKeyJustice #DeltaV - Justice dept + +- type: entity + parent: TelecomServer + id: TelecomServerFilledService + suffix: Service + components: + - type: ContainerFill + containers: + key_slots: + - EncryptionKeyService + +- type: entity + parent: TelecomServer + id: TelecomServerFilledCommand + suffix: Command + components: + - type: ContainerFill + containers: + key_slots: + - EncryptionKeyCommand diff --git a/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml b/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml index fcc6e4974c1..02cdd80af35 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml @@ -322,7 +322,7 @@ parent: VendingMachine id: VendingMachineClothing name: ClothesMate - description: A vending machine for clothing. + description: A vending machine for dispensing the cheapest clothing Nanotrasen can buy. components: - type: VendingMachine pack: ClothesMateInventory diff --git a/Resources/Prototypes/Entities/Structures/Power/Generation/Singularity/singularity.yml b/Resources/Prototypes/Entities/Structures/Power/Generation/Singularity/singularity.yml index 25d219ab945..b8d66c61e38 100644 --- a/Resources/Prototypes/Entities/Structures/Power/Generation/Singularity/singularity.yml +++ b/Resources/Prototypes/Entities/Structures/Power/Generation/Singularity/singularity.yml @@ -3,6 +3,7 @@ name: gravitational singularity description: A mesmerizing swirl of darkness that sucks in everything. If it's moving towards you, run. components: + - type: SupermatterImmune - type: Clickable - type: AmbientSound volume: -4 diff --git a/Resources/Prototypes/Entities/Structures/Power/Generation/Supermatter/supermatter.yml b/Resources/Prototypes/Entities/Structures/Power/Generation/Supermatter/supermatter.yml new file mode 100644 index 00000000000..6fc3429600a --- /dev/null +++ b/Resources/Prototypes/Entities/Structures/Power/Generation/Supermatter/supermatter.yml @@ -0,0 +1,66 @@ +- type: entity + id: Supermatter + name: supermatter crystal + description: A strangely translucent and iridescent crystal. + placement: + mode: SnapgridCenter + components: + - type: Supermatter + - type: RadiationSource + - type: AmbientSound + range: 5 + volume: 0 + sound: + path: /Audio/Supermatter/calm.ogg + - type: Physics + - type: Speech + speechSounds: Pai + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeAabb + bounds: "-0.25,-0.25,0.25,0.25" + mask: + - Impassable + - MidImpassable + - HighImpassable + - LowImpassable + - InteractImpassable + - Opaque + layer: + - MidImpassable + - HighImpassable + - BulletImpassable + - InteractImpassable + - type: Transform + anchored: true + noRot: true + - type: CollisionWake + enabled: false + - type: Clickable + - type: InteractionOutline + - type: Sprite + drawdepth: WallMountedItems + sprite: Supermatter/supermatter.rsi + state: supermatter + - type: Icon + sprite: Supermatter/supermatter.rsi + state: supermatter + - type: PointLight + enabled: true + radius: 10 + energy: 5 + color: "#ffe000" + - type: Explosive + explosionType: Supermatter + maxIntensity: 25000 + intensitySlope: 5 + totalIntensity: 25000 + - type: GuideHelp + guides: [ Supermatter, Power ] + - type: WarpPoint + follow: true + location: supermatter + - type: SinguloFood + energy: 10000 \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Structures/Power/Generation/Tesla/coil.yml b/Resources/Prototypes/Entities/Structures/Power/Generation/Tesla/coil.yml index 48994ac7d84..55a22a59a58 100644 --- a/Resources/Prototypes/Entities/Structures/Power/Generation/Tesla/coil.yml +++ b/Resources/Prototypes/Entities/Structures/Power/Generation/Tesla/coil.yml @@ -5,6 +5,7 @@ placement: mode: SnapgridCenter components: + - type: SupermatterImmune - type: Transform anchored: true - type: Physics @@ -110,6 +111,7 @@ placement: mode: SnapgridCenter components: + - type: SupermatterImmune - type: Transform anchored: true - type: Physics diff --git a/Resources/Prototypes/Entities/Structures/Power/Generation/Tesla/energyball.yml b/Resources/Prototypes/Entities/Structures/Power/Generation/Tesla/energyball.yml index ea41ba3a20d..1cfdb9256a5 100644 --- a/Resources/Prototypes/Entities/Structures/Power/Generation/Tesla/energyball.yml +++ b/Resources/Prototypes/Entities/Structures/Power/Generation/Tesla/energyball.yml @@ -2,6 +2,7 @@ id: BaseEnergyBall abstract: true components: + - type: SupermatterImmune - type: Clickable - type: Physics bodyType: KinematicController diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Structures/Research/oracle.yml b/Resources/Prototypes/Entities/Structures/Specific/oracle.yml similarity index 55% rename from Resources/Prototypes/Nyanotrasen/Entities/Structures/Research/oracle.yml rename to Resources/Prototypes/Entities/Structures/Specific/oracle.yml index f7481abf1ed..51a25bffcdc 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Structures/Research/oracle.yml +++ b/Resources/Prototypes/Entities/Structures/Specific/oracle.yml @@ -13,7 +13,6 @@ - state: oracle-0 - map: ["enum.SolutionContainerLayers.Fill"] state: oracle-0 - - type: Oracle - type: Speech speechSounds: Tenor - type: Psionic @@ -42,3 +41,46 @@ - type: SpriteFade - type: Tag tags: [] + - type: Oracle + demandTypes: OracleDemandTypes + rewardReagents: OracleRewardReagents + rewardEntities: + - OracleRewardDisks + - OracleRewardCrystals + demandBlacklist: + tags: + - Bluespace + components: + - MobState + demandWhitelist: + components: + - Item + + +- type: weightedRandomEntity + id: OracleRewardDisks + weights: + ResearchDisk5000: 20 + ResearchDisk10000: 5 + ResearchDisk20000: 1 + +- type: weightedRandomEntity + id: OracleRewardCrystals + weights: + MaterialBluespace1: 3 + MaterialBluespace3: 10 + MaterialBluespace5: 2 + +- type: weightedRandom + id: OracleRewardReagents + weights: + LotophagoiOil: 7 + Ichor: 2 + Wine: 1.2 + Blood: 0.8 + +- type: weightedRandom + id: OracleDemandTypes + weights: + tech: 3 + plant: 1 # Plants are very annoying to procure most of the time diff --git a/Resources/Prototypes/Entities/Structures/Storage/Canisters/gas_canisters.yml b/Resources/Prototypes/Entities/Structures/Storage/Canisters/gas_canisters.yml index cd44f5f585a..52b008c7f2c 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/Canisters/gas_canisters.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/Canisters/gas_canisters.yml @@ -98,6 +98,7 @@ whitelist: components: - GasTank + - BorgJetpack - type: StaticPrice price: 1000 - type: AccessReader diff --git a/Resources/Prototypes/Entities/Structures/Storage/Closets/base_structureclosets.yml b/Resources/Prototypes/Entities/Structures/Storage/Closets/base_structureclosets.yml index 23b1efdf535..e966a41780c 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/Closets/base_structureclosets.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/Closets/base_structureclosets.yml @@ -50,8 +50,12 @@ - type: EntityStorage closeSound: path: /Audio/Effects/closet_close.ogg + params: + volume: -4 openSound: path: /Audio/Effects/closet_open.ogg + params: + volume: -4 - type: ContainerContainer containers: entity_storage: !type:Container diff --git a/Resources/Prototypes/Entities/Structures/Wallmounts/radalarm.yml b/Resources/Prototypes/Entities/Structures/Wallmounts/radalarm.yml new file mode 100644 index 00000000000..44bbe3e6170 --- /dev/null +++ b/Resources/Prototypes/Entities/Structures/Wallmounts/radalarm.yml @@ -0,0 +1,51 @@ +- type: entity + id: GeigerCounterWallMount + name: wall-mounted Geiger counter + description: A stationary device that emits a warning tone when it detects radiation pulses. + placement: + mode: SnapgridCenter + snap: + - Wallmount + components: + - type: InteractionOutline + - type: Clickable + - type: Rotatable + rotateWhileAnchored: false + rotateWhilePulling: true + - type: WallMount + - type: Transform + noRot: false + anchored: true + - type: Sprite + noRot: true + drawdepth: WallMountedItems + sprite: Structures/Wallmounts/radalarm.rsi + layers: + - state: geiger_base + - state: geiger_on_idle + map: ["enum.GeigerLayers.Screen"] + shader: unshaded + visible: false + - type: Geiger + showControl: true + showExamine: true + localSoundOnly: false + audioParameters: + volume: -4 + maxDistance: 10 + rolloffFactor: 4 + - type: Appearance + - type: GenericVisualizer + visuals: + enum.GeigerVisuals.IsEnabled: + GeigerLayers.Screen: + True: { visible: True } + False: { visible: False } + enum.GeigerVisuals.DangerLevel: + GeigerLayers.Screen: + None: {state: geiger_on_idle} + Low: {state: geiger_on_low} + Med: {state: geiger_on_med} + High: {state: geiger_on_high} + Extreme: {state: geiger_on_ext} + diff --git a/Resources/Prototypes/GameRules/events.yml b/Resources/Prototypes/GameRules/events.yml index 7863224436c..ca885117449 100644 --- a/Resources/Prototypes/GameRules/events.yml +++ b/Resources/Prototypes/GameRules/events.yml @@ -413,6 +413,22 @@ # - id: MobClownSpider # prob: 0.05 +- type: entity + id: OneirophageSpawn + parent: BaseGameRule + noSpawn: true + components: + - type: StationEvent + id: VentCritters + earliestStart: 15 + minimumPlayers: 15 + weight: 4 + duration: 60 + - type: VentCrittersRule + entries: + - id: MobGiantSpiderVampireAngry + prob: 0.01 + - type: entity id: ZombieOutbreak parent: BaseGameRule diff --git a/Resources/Prototypes/GameRules/roundstart.yml b/Resources/Prototypes/GameRules/roundstart.yml index e046b871fa7..0af55a7f9d0 100644 --- a/Resources/Prototypes/GameRules/roundstart.yml +++ b/Resources/Prototypes/GameRules/roundstart.yml @@ -132,21 +132,15 @@ components: - type: RampingStationEventScheduler -- type: entity - id: LongSurvivalStationEventScheduler - parent: BaseGameRule - noSpawn: true - components: - - type: RampingStationEventScheduler - shiftLengthOffset: -120 - - type: entity id: HellshiftStationEventScheduler parent: BaseGameRule noSpawn: true components: - type: RampingStationEventScheduler - shiftChaosModifier: 4 #30 minute HELL SHIFT + chaosModifier: 4 # By default, one event each 30-10 seconds after two hours. Changing CVars will cause this to deviate. + startingChaosRatio: 0.025 # Starts as slow as survival, but quickly ramps up + shiftLengthModifier: 2.5 # variation passes - type: entity diff --git a/Resources/Prototypes/Guidebook/engineering.yml b/Resources/Prototypes/Guidebook/engineering.yml index 21d17f02279..e08d46276cd 100644 --- a/Resources/Prototypes/Guidebook/engineering.yml +++ b/Resources/Prototypes/Guidebook/engineering.yml @@ -66,6 +66,7 @@ - Singularity - TEG - RTG + - Supermatter - type: guideEntry id: AME @@ -91,3 +92,8 @@ id: PortableGenerator name: guide-entry-portable-generator text: "/ServerInfo/Guidebook/Engineering/PortableGenerator.xml" + +- type: guideEntry + id: Supermatter + name: guide-entry-sm + text: "/ServerInfo/Guidebook/Engineering/Supermatter.xml" diff --git a/Resources/Prototypes/InventoryTemplates/anytaur_inventory_template.yml b/Resources/Prototypes/InventoryTemplates/anytaur_inventory_template.yml new file mode 100644 index 00000000000..0dd5961aef3 --- /dev/null +++ b/Resources/Prototypes/InventoryTemplates/anytaur_inventory_template.yml @@ -0,0 +1,112 @@ +- type: inventoryTemplate + id: anytaur + slots: + - name: jumpsuit + slotTexture: uniform + slotFlags: INNERCLOTHING + stripTime: 5 + uiWindowPos: 0,2 + strippingWindowPos: 0,2 + displayName: Jumpsuit + - name: outerClothing + slotTexture: suit + slotFlags: OUTERCLOTHING + slotGroup: MainHotbar + stripTime: 6 + uiWindowPos: 1,2 + strippingWindowPos: 1,2 + displayName: Suit + blacklist: + tags: + - FullBodyOuter + - name: gloves + slotTexture: gloves + slotFlags: GLOVES + uiWindowPos: 2,2 + strippingWindowPos: 2,2 + displayName: Gloves + - name: neck + slotTexture: neck + slotFlags: NECK + uiWindowPos: 0,1 + strippingWindowPos: 0,1 + displayName: Neck + - name: mask + slotTexture: mask + slotFlags: MASK + uiWindowPos: 1,1 + strippingWindowPos: 1,1 + displayName: Mask + - name: eyes + slotTexture: glasses + slotFlags: EYES + stripTime: 2 + uiWindowPos: 0,0 + strippingWindowPos: 0,0 + displayName: Eyes + - name: ears + slotTexture: ears + slotFlags: EARS + stripTime: 2 + uiWindowPos: 2,0 + strippingWindowPos: 2,1 + displayName: Ears + - name: head + slotTexture: head + slotFlags: HEAD + uiWindowPos: 1,0 + strippingWindowPos: 1,0 + displayName: Head + - name: pocket1 + slotTexture: pocket + slotFlags: POCKET + slotGroup: MainHotbar + stripTime: 2 + uiWindowPos: 0,3 + strippingWindowPos: 0,3 + dependsOn: jumpsuit + displayName: Pocket 1 + stripHidden: true + - name: pocket2 + slotTexture: pocket + slotFlags: POCKET + slotGroup: MainHotbar + stripTime: 2 + uiWindowPos: 2,3 + strippingWindowPos: 2,3 + dependsOn: jumpsuit + displayName: Pocket 2 + stripHidden: true + - name: suitstorage + slotTexture: suit_storage + slotFlags: SUITSTORAGE + stripTime: 2 + uiWindowPos: 2,0 + strippingWindowPos: 2,0 + dependsOn: outerClothing + displayName: Suit Storage + - name: id + slotTexture: id + slotFlags: IDCARD + slotGroup: SecondHotbar + stripTime: 6 + uiWindowPos: 2,1 + strippingWindowPos: 2,4 + dependsOn: jumpsuit + displayName: ID + - name: belt + slotTexture: belt + slotFlags: BELT + slotGroup: SecondHotbar + stripTime: 5 + uiWindowPos: 3,1 + strippingWindowPos: 1,3 + displayName: Belt + - name: back + slotTexture: back + slotFlags: BACK + slotGroup: SecondHotbar + stripTime: 5 + uiWindowPos: 3,0 + strippingWindowPos: 0,4 + displayName: Back diff --git a/Resources/Prototypes/Language/languages.yml b/Resources/Prototypes/Language/languages.yml index 566ee082914..65af93e02d4 100644 --- a/Resources/Prototypes/Language/languages.yml +++ b/Resources/Prototypes/Language/languages.yml @@ -39,7 +39,7 @@ - type: language id: Bubblish speech: - color: "#0077aa" + color: "#00a3e2dd" fontId: RubikBubbles obfuscation: !type:SyllableObfuscation @@ -56,7 +56,7 @@ - type: language id: Moffic speech: - color: "#869b29" + color: "#c7df2edd" fontId: Copperplate obfuscation: !type:SyllableObfuscation @@ -125,7 +125,7 @@ - type: language id: RootSpeak speech: - color: "#804000" + color: "#ce5e14dd" fontId: Noganas obfuscation: !type:SyllableObfuscation @@ -142,7 +142,7 @@ - type: language id: Nekomimetic speech: - color: "#803B56" + color: "#df57aaee" fontId: Manga obfuscation: !type:SyllableObfuscation @@ -202,7 +202,7 @@ - type: language id: Draconic speech: - color: "#228b22" + color: "#2aca2add" obfuscation: !type:SyllableObfuscation minSyllables: 2 @@ -297,7 +297,7 @@ - type: language id: Canilunzt speech: - color: "#b97a57" + color: "#d69b3dcc" obfuscation: !type:SyllableObfuscation minSyllables: 1 @@ -365,7 +365,7 @@ - type: language id: SolCommon speech: - color: "#8282fb" + color: "#8282fbaa" obfuscation: !type:SyllableObfuscation minSyllables: 1 @@ -576,6 +576,18 @@ - ss - ee +- type: language + id: Hissing + obfuscation: + !type:SyllableObfuscation + minSyllables: 2 + maxSyllables: 4 + replacement: + - hss + - iss + - ss + - is + # Example of a sign language. Not currently used anyhow. - type: language id: Sign diff --git a/Resources/Prototypes/Loadouts/Jobs/Heads/captain.yml b/Resources/Prototypes/Loadouts/Jobs/Heads/captain.yml index d8849472ff4..d77dabf557c 100644 --- a/Resources/Prototypes/Loadouts/Jobs/Heads/captain.yml +++ b/Resources/Prototypes/Loadouts/Jobs/Heads/captain.yml @@ -130,6 +130,11 @@ cost: 1 exclusive: true requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + - Harpy - !type:CharacterJobRequirement jobs: - Captain diff --git a/Resources/Prototypes/Loadouts/Jobs/Heads/chiefEngineer.yml b/Resources/Prototypes/Loadouts/Jobs/Heads/chiefEngineer.yml index c4905591124..4de22bc9593 100644 --- a/Resources/Prototypes/Loadouts/Jobs/Heads/chiefEngineer.yml +++ b/Resources/Prototypes/Loadouts/Jobs/Heads/chiefEngineer.yml @@ -39,6 +39,11 @@ cost: 1 exclusive: true requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + - Harpy - !type:CharacterJobRequirement jobs: - ChiefEngineer diff --git a/Resources/Prototypes/Loadouts/Jobs/Heads/chiefMedicalOfficer.yml b/Resources/Prototypes/Loadouts/Jobs/Heads/chiefMedicalOfficer.yml index c75c871b011..163bad29261 100644 --- a/Resources/Prototypes/Loadouts/Jobs/Heads/chiefMedicalOfficer.yml +++ b/Resources/Prototypes/Loadouts/Jobs/Heads/chiefMedicalOfficer.yml @@ -61,6 +61,11 @@ cost: 1 exclusive: true requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + - Harpy - !type:CharacterJobRequirement jobs: - ChiefMedicalOfficer diff --git a/Resources/Prototypes/Loadouts/Jobs/Heads/command.yml b/Resources/Prototypes/Loadouts/Jobs/Heads/command.yml new file mode 100644 index 00000000000..c8c98b5eb44 --- /dev/null +++ b/Resources/Prototypes/Loadouts/Jobs/Heads/command.yml @@ -0,0 +1,12 @@ +- type: loadout + id: LoadoutCommandGlovesInspection + category: Jobs + cost: 1 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - HeadOfPersonnel + - Captain + items: + - ClothingHandsGlovesInspection diff --git a/Resources/Prototypes/Loadouts/Jobs/Heads/headOfPersonnel.yml b/Resources/Prototypes/Loadouts/Jobs/Heads/headOfPersonnel.yml index 3d3799c0adf..e6bc6ada049 100644 --- a/Resources/Prototypes/Loadouts/Jobs/Heads/headOfPersonnel.yml +++ b/Resources/Prototypes/Loadouts/Jobs/Heads/headOfPersonnel.yml @@ -97,8 +97,25 @@ cost: 1 exclusive: true requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + - Harpy - !type:CharacterJobRequirement jobs: - HeadOfPersonnel items: - ClothingShoesBootsWinterHeadOfPersonel + +- type: loadout + id: LoadoutCommandHOPBedsheetIan + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - HeadOfPersonnel + items: + - BedsheetIan diff --git a/Resources/Prototypes/Loadouts/Jobs/Heads/headOfSecurity.yml b/Resources/Prototypes/Loadouts/Jobs/Heads/headOfSecurity.yml index 4f0d785b14d..7be380d7474 100644 --- a/Resources/Prototypes/Loadouts/Jobs/Heads/headOfSecurity.yml +++ b/Resources/Prototypes/Loadouts/Jobs/Heads/headOfSecurity.yml @@ -168,6 +168,11 @@ cost: 1 exclusive: true requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + - Harpy - !type:CharacterJobRequirement jobs: - HeadOfSecurity diff --git a/Resources/Prototypes/Loadouts/Jobs/Heads/quarterMaster.yml b/Resources/Prototypes/Loadouts/Jobs/Heads/quarterMaster.yml index 3359d8f5d74..15adc7d44e8 100644 --- a/Resources/Prototypes/Loadouts/Jobs/Heads/quarterMaster.yml +++ b/Resources/Prototypes/Loadouts/Jobs/Heads/quarterMaster.yml @@ -64,6 +64,11 @@ cost: 1 exclusive: true requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + - Harpy - !type:CharacterJobRequirement jobs: - Quartermaster diff --git a/Resources/Prototypes/Loadouts/Jobs/Heads/researchDirector.yml b/Resources/Prototypes/Loadouts/Jobs/Heads/researchDirector.yml index 87cb0db1790..5d06e54efab 100644 --- a/Resources/Prototypes/Loadouts/Jobs/Heads/researchDirector.yml +++ b/Resources/Prototypes/Loadouts/Jobs/Heads/researchDirector.yml @@ -50,6 +50,11 @@ cost: 1 exclusive: true requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + - Harpy - !type:CharacterJobRequirement jobs: - ResearchDirector diff --git a/Resources/Prototypes/Loadouts/Jobs/cargo.yml b/Resources/Prototypes/Loadouts/Jobs/cargo.yml index 87463862010..cdc83a3c0f7 100644 --- a/Resources/Prototypes/Loadouts/Jobs/cargo.yml +++ b/Resources/Prototypes/Loadouts/Jobs/cargo.yml @@ -1,3 +1,47 @@ +# Cargo technician +- type: loadout + id: LoadoutCargoOuterWinterCargo + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - CargoTechnician + items: + - ClothingOuterWinterCargo + +- type: loadout + id: LoadoutCargoShoesBootsWinterCargo + category: Jobs + cost: 1 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - CargoTechnician + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + - Harpy + items: + - ClothingShoesBootsWinterCargo + +# Salvage specialist + +- type: loadout + id: LoadoutCargoOuterWinterMiner + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - SalvageSpecialist + items: + - ClothingOuterWinterMiner + - type: loadout id: LoadoutCargoNeckGoliathCloak category: Jobs diff --git a/Resources/Prototypes/Loadouts/Jobs/medical.yml b/Resources/Prototypes/Loadouts/Jobs/medical.yml index edf51747d00..f193dfaea2d 100644 --- a/Resources/Prototypes/Loadouts/Jobs/medical.yml +++ b/Resources/Prototypes/Loadouts/Jobs/medical.yml @@ -495,3 +495,109 @@ - Nearsighted items: - ClothingEyesPrescriptionMedHud + +- type: loadout + id: LoadoutMedicalEyesGlassesChemical + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - Chemist + items: + - ClothingEyesGlassesChemical + +- type: loadout + id: LoadoutMedicalBedsheetMedical + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterDepartmentRequirement + departments: + - Medical + items: + - BedsheetMedical + +# Chemist PPE gear +- type: loadout + id: LoadoutMedicalUniformJumpsuitChemShirt + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - Chemist + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Harpy + items: + - ClothingUniformJumpsuitChemShirt + +- type: loadout + id: LoadoutMedicalNeckTieChem + category: Jobs + cost: 1 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - Chemist + items: + - ClothingNeckTieChem + +- type: loadout + id: LoadoutMedicalShoesEnclosedChem + category: Jobs + cost: 1 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - Chemist + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + - Harpy + items: + - ClothingShoesEnclosedChem + +- type: loadout + id: LoadoutMedicalOuterApronChemist + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - Chemist + items: + - ClothingOuterApronChemist + +- type: loadout + id: LoadoutMedicalEyesGlassesChemist + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - Chemist + items: + - ClothingEyesGlassesChemist + +- type: loadout + id: LoadoutMedicalHandsGlovesChemist + category: Jobs + cost: 1 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - Chemist + items: + - ClothingHandsGlovesChemist diff --git a/Resources/Prototypes/Loadouts/Jobs/security.yml b/Resources/Prototypes/Loadouts/Jobs/security.yml index 2809c9c1ae5..f1c64730378 100644 --- a/Resources/Prototypes/Loadouts/Jobs/security.yml +++ b/Resources/Prototypes/Loadouts/Jobs/security.yml @@ -255,6 +255,7 @@ - !type:CharacterSpeciesRequirement inverted: true species: + - Diona - Harpy - !type:CharacterJobRequirement jobs: @@ -362,6 +363,22 @@ items: - ClothingBeltSecurityWebbingFilled +# Equipment +- type: loadout + id: LoadoutSecurityCombatKnife + category: Jobs + cost: 1 + requirements: + - !type:CharacterSpeciesRequirement + species: + - Diona + - Harpy + - !type:CharacterDepartmentRequirement + departments: + - Security + items: + - CombatKnife + # TODO: Make this replace the secoff handgun and make it cheaper # # Species # - type: loadout diff --git a/Resources/Prototypes/Loadouts/Jobs/service.yml b/Resources/Prototypes/Loadouts/Jobs/service.yml index 0d3f1dc869f..4e41f035d7b 100644 --- a/Resources/Prototypes/Loadouts/Jobs/service.yml +++ b/Resources/Prototypes/Loadouts/Jobs/service.yml @@ -27,6 +27,149 @@ - ClothingHeadHatJesterAlt - ClothingShoesJester +- type: loadout + id: LoadoutServiceClownOuterWinter + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - Clown + items: + - ClothingOuterWinterClown + +- type: loadout + id: LoadoutServiceClownOuterClownPriest + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - Clown + items: + - ClothingOuterClownPriest + +- type: loadout + id: LoadoutServiceClownBootsWinter + category: Jobs + cost: 1 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - Clown + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + - Harpy + items: + - ClothingShoesBootsWinterClown + +- type: loadout + id: LoadoutServiceClownMaskSexy + category: Jobs + cost: 1 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - Clown + items: + - ClothingMaskSexyClown + +- type: loadout + id: LoadoutServiceClownBedsheetClown + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - Clown + items: + - BedsheetClown + +# Mime +- type: loadout + id: LoadoutServiceMimeOuterWinter + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - Mime + items: + - ClothingOuterWinterMime + +- type: loadout + id: LoadoutServiceMimeMaskSad + category: Jobs + cost: 1 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - Mime + items: + - ClothingMaskSadMime + +- type: loadout + id: LoadoutServiceMimeMaskScared + category: Jobs + cost: 1 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - Mime + items: + - ClothingMaskScaredMime + +- type: loadout + id: LoadoutServiceMimeMaskSexy + category: Jobs + cost: 1 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - Mime + items: + - ClothingMaskSexyMime + +- type: loadout + id: LoadoutServiceMimeShoesBootsWinter + category: Jobs + cost: 1 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - Mime + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + - Harpy + items: + - ClothingShoesBootsWinterMime + +- type: loadout + id: LoadoutServiceMimeBedsheetMime + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - Mime + items: + - BedsheetMime + # Bartender - type: loadout id: LoadoutServiceBartenderUniformPurple diff --git a/Resources/Prototypes/Loadouts/categories.yml b/Resources/Prototypes/Loadouts/categories.yml index 79d2d7fe2bf..0dfccb096ca 100644 --- a/Resources/Prototypes/Loadouts/categories.yml +++ b/Resources/Prototypes/Loadouts/categories.yml @@ -18,6 +18,9 @@ - type: loadoutCategory id: Jobs +- type: loadoutCategory + id: Mask + - type: loadoutCategory id: Neck diff --git a/Resources/Prototypes/Loadouts/eyes.yml b/Resources/Prototypes/Loadouts/eyes.yml index 74226604e92..fed07c6bd6f 100644 --- a/Resources/Prototypes/Loadouts/eyes.yml +++ b/Resources/Prototypes/Loadouts/eyes.yml @@ -5,6 +5,34 @@ items: - ClothingEyesEyepatch +- type: loadout + id: LoadoutEyesGlasses + category: Eyes + cost: 1 + requirements: + - !type:CharacterTraitRequirement + inverted: true + traits: + - Nearsighted + items: + - ClothingEyesGlasses + +- type: loadout + id: LoadoutEyesGlassesJamjar + category: Eyes + cost: 2 + exclusive: true + items: + - ClothingEyesGlassesJamjar + +- type: loadout + id: LoadoutEyesGlassesJensen + category: Eyes + cost: 2 + exclusive: true + items: + - ClothingEyesGlassesJensen + - type: loadout id: LoadoutEyesBlindfold category: Eyes @@ -12,6 +40,14 @@ items: - ClothingEyesBlindfold +- type: loadout + id: LoadoutItemCheapSunglasses + category: Eyes + cost: 2 + exclusive: true + items: + - ClothingEyesGlassesCheapSunglasses + - type: loadout id: LoadoutItemSunglasses category: Eyes diff --git a/Resources/Prototypes/Loadouts/hands.yml b/Resources/Prototypes/Loadouts/hands.yml index 3604678d387..6cef6420571 100644 --- a/Resources/Prototypes/Loadouts/hands.yml +++ b/Resources/Prototypes/Loadouts/hands.yml @@ -113,3 +113,11 @@ exclusive: true items: - ClothingHandsGlovesRobohands + +- type: loadout + id: LoadoutHandsGlovesFingerless + category: Hands + cost: 1 + exclusive: true + items: + - ClothingHandsGlovesFingerless diff --git a/Resources/Prototypes/Loadouts/head.yml b/Resources/Prototypes/Loadouts/head.yml index 9ee23f49e9f..e76e2f17ecd 100644 --- a/Resources/Prototypes/Loadouts/head.yml +++ b/Resources/Prototypes/Loadouts/head.yml @@ -6,6 +6,11 @@ exclusive: true items: - ClothingHeadHatBeaverHat + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security - type: loadout id: LoadoutHeadTophat @@ -23,6 +28,27 @@ items: - ClothingHeadHatFedoraBlack +- type: loadout + id: LoadoutHeadFedoraBrown + category: Head + cost: 2 + exclusive: true + items: + - ClothingHeadHatFedoraBrown + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + +- type: loadout + id: LoadoutHeadFedoraGrey + category: Head + cost: 2 + exclusive: true + items: + - ClothingHeadHatFedoraGrey + - type: loadout id: LoadoutHeadFedoraChoc category: Head @@ -30,6 +56,11 @@ exclusive: true items: - ClothingHeadHatFedoraChoc + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security - type: loadout id: LoadoutHeadFedoraWhite @@ -54,6 +85,11 @@ exclusive: true items: - ClothingHeadHatFlatBrown + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security - type: loadout id: LoadoutHeadTinfoil @@ -79,6 +115,11 @@ exclusive: true items: - ClothingHeadHatBluesoft + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security - type: loadout id: LoadoutHeadHatBluesoftFlipped @@ -87,6 +128,11 @@ exclusive: true items: - ClothingHeadHatBluesoftFlipped + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security - type: loadout id: LoadoutHeadHatCorpsoft @@ -111,6 +157,11 @@ exclusive: true items: - ClothingHeadHatGreensoft + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security - type: loadout id: LoadoutHeadHatGreensoftFlipped @@ -119,6 +170,11 @@ exclusive: true items: - ClothingHeadHatGreensoftFlipped + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security - type: loadout id: LoadoutHeadHatGreysoft @@ -136,6 +192,22 @@ items: - ClothingHeadHatGreysoftFlipped +- type: loadout + id: LoadoutHeadHatMimesoft + category: Head + cost: 1 + exclusive: true + items: + - ClothingHeadHatMimesoft + +- type: loadout + id: LoadoutHeadHatMimesoftFlipped + category: Head + cost: 1 + exclusive: true + items: + - ClothingHeadHatMimesoftFlipped + - type: loadout id: LoadoutHeadHatOrangesoft category: Head @@ -143,6 +215,11 @@ exclusive: true items: - ClothingHeadHatOrangesoft + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security - type: loadout id: LoadoutHeadHatOrangesoftFlipped @@ -151,6 +228,11 @@ exclusive: true items: - ClothingHeadHatOrangesoftFlipped + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security - type: loadout id: LoadoutHeadHatPurplesoft @@ -159,6 +241,11 @@ exclusive: true items: - ClothingHeadHatPurplesoft + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security - type: loadout id: LoadoutHeadHatPurplesoftFlipped @@ -167,6 +254,11 @@ exclusive: true items: - ClothingHeadHatPurplesoftFlipped + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security - type: loadout id: LoadoutHeadHatRedsoft @@ -191,6 +283,11 @@ exclusive: true items: - ClothingHeadHatYellowsoft + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security - type: loadout id: LoadoutHeadHatYellowsoftFlipped @@ -199,6 +296,11 @@ exclusive: true items: - ClothingHeadHatYellowsoftFlipped + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security # Headbands - type: loadout @@ -216,6 +318,11 @@ exclusive: true items: - ClothingHeadBandBlue + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security - type: loadout id: LoadoutHeadBandGold @@ -224,6 +331,11 @@ exclusive: true items: - ClothingHeadBandGold + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security - type: loadout id: LoadoutHeadBandGreen @@ -232,6 +344,11 @@ exclusive: true items: - ClothingHeadBandGreen + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security - type: loadout id: LoadoutHeadBandGrey @@ -240,6 +357,11 @@ exclusive: true items: - ClothingHeadBandGrey + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security - type: loadout id: LoadoutHeadBandRed @@ -264,6 +386,11 @@ exclusive: true items: - ClothingHeadBandMerc + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security - type: loadout id: LoadoutHeadBandBrown @@ -272,3 +399,135 @@ exclusive: true items: - ClothingHeadBandBrown + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + +- type: loadout + id: LoadoutHeadFishCap + category: Head + cost: 2 + exclusive: true + items: + - ClothingHeadFishCap + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + +- type: loadout + id: LoadoutHeadRastaHat + category: Head + cost: 4 + exclusive: true + items: + - ClothingHeadRastaHat + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + +- type: loadout + id: LoadoutHeadFez + category: Head + cost: 2 + exclusive: true + items: + - ClothingHeadHatFez + +- type: loadout + id: LoadoutHeadBowlerHat + category: Head + cost: 2 + exclusive: true + items: + - ClothingHeadHatBowlerHat + +# Flatcaps +- type: loadout + id: LoadoutHeadGreyFlatcap + category: Head + cost: 2 + exclusive: true + items: + - ClothingHeadHatGreyFlatcap + +- type: loadout + id: LoadoutHeadBrownFlatcap + category: Head + cost: 2 + exclusive: true + items: + - ClothingHeadHatBrownFlatcap + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + +# Berets +- type: loadout + id: LoadoutHeadBeret + category: Head + cost: 2 + exclusive: true + items: + - ClothingHeadHatBeret + +- type: loadout + id: LoadoutHeadBeretFrench + category: Head + cost: 2 + exclusive: true + items: + - ClothingHeadHatBeretFrench + +# Cowboy hats +- type: loadout + id: LoadoutHeadCowboyBrown + category: Head + cost: 2 + exclusive: true + items: + - ClothingHeadHatCowboyBrown + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + +- type: loadout + id: LoadoutHeadCowboyBlack + category: Head + cost: 2 + exclusive: true + items: + - ClothingHeadHatCowboyBlack + +- type: loadout + id: LoadoutHeadCowboyWhite + category: Head + cost: 2 + exclusive: true + items: + - ClothingHeadHatCowboyWhite + +- type: loadout + id: LoadoutHeadCowboyGrey + category: Head + cost: 2 + exclusive: true + items: + - ClothingHeadHatCowboyGrey + +- type: loadout + id: LoadoutHeadCowboyRed + category: Head + cost: 2 + exclusive: true + items: + - ClothingHeadHatCowboyRed diff --git a/Resources/Prototypes/Loadouts/items.yml b/Resources/Prototypes/Loadouts/items.yml index 35dcbf7b9ed..e09d02c463a 100644 --- a/Resources/Prototypes/Loadouts/items.yml +++ b/Resources/Prototypes/Loadouts/items.yml @@ -63,11 +63,18 @@ - CheapLighter - type: loadout - id: LoadoutItemMatches + id: LoadoutItemLighterFlippo category: Items - cost: 1 + cost: 3 + items: + - FlippoLighter + +- type: loadout + id: LoadoutItemSmokingPipeFilledTobacco + category: Items + cost: 2 items: - - Matchbox + - SmokingPipeFilledTobacco # Instruments - type: loadout @@ -176,6 +183,13 @@ items: - DoubleEmergencyOxygenTankFilled +- type: loadout + id: LoadoutItemClothingMaskBreath + category: Items + cost: 1 + items: + - ClothingMaskBreath + - type: loadout id: LoadoutItemsEmergencyCrowbar category: Items @@ -183,6 +197,277 @@ items: - CrowbarRed +- type: loadout + id: LoadoutItemFireExtinguisher + category: Items + cost: 3 + items: + - FireExtinguisher + +- type: loadout + id: LoadoutItemFlashlightLantern + category: Items + cost: 2 + items: + - FlashlightLantern + +- type: loadout + id: LoadoutItemFlare + category: Items + cost: 1 + items: + - Flare + +- type: loadout + id: LoadoutEmergencyMedipen + category: Items + cost: 1 + items: + - EmergencyMedipen + +- type: loadout + id: LoadoutSpaceMedipen + category: Items + cost: 1 + items: + - SpaceMedipen + +# Paperwork +- type: loadout + id: LoadoutItemPapers + category: Items + cost: 1 + items: + - Paper + - Paper + - Paper + - Paper + +- type: loadout + id: LoadoutItemBoxFolderGrey + category: Items + cost: 1 + items: + - BoxFolderGrey + +- type: loadout + id: LoadoutBookRandom + category: Items + cost: 1 + items: + - BookRandom + +- type: loadout + id: LoadoutPen + category: Items + cost: 1 + items: + - Pen + +# Food and drink +- type: loadout + id: LoadoutDrinkWaterBottleFull + category: Items + cost: 1 + items: + - DrinkWaterBottleFull + +- type: loadout + id: LoadoutItemLunchboxGenericFilledRandom + category: Items + cost: 3 + items: + - LunchboxGenericFilledRandom + +# Survival boxes +- type: loadout + id: LoadoutItemBoxSurvival + category: Items + cost: 2 #All survival kits are intentionally cheaper than their contents to help encourage people to buy them. The contents can be bought separately to save space, or as spares + items: + - BoxSurvival + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + - Medical + - Engineering + - Epistemics + - !type:CharacterJobRequirement + inverted: true + jobs: + - Clown + +- type: loadout + id: LoadoutItemBoxSurvivalEngineering + category: Items + cost: 2 + items: + - BoxSurvivalEngineering + requirements: + - !type:CharacterDepartmentRequirement + departments: + - Engineering + +- type: loadout + id: LoadoutItemBoxSurvivalSecurity + category: Items + cost: 2 + items: + - BoxSurvivalSecurity + requirements: + - !type:CharacterDepartmentRequirement + departments: + - Security + - !type:CharacterJobRequirement + inverted: true + jobs: + - Brigmedic + +- type: loadout + id: LoadoutItemBoxSurvivalBrigmedic + category: Items + cost: 2 + items: + - BoxSurvivalBrigmedic + requirements: + - !type:CharacterJobRequirement + jobs: + - Brigmedic + +- type: loadout + id: LoadoutItemBoxSurvivalMedical + category: Items + cost: 2 + items: + - BoxSurvivalMedical + requirements: + - !type:CharacterDepartmentRequirement + departments: + - Medical + +- type: loadout + id: LoadoutItemBoxHug + category: Items + cost: 2 + items: + - BoxHug + requirements: + - !type:CharacterJobRequirement + jobs: + - Clown + +# Medkits +- type: loadout + id: LoadoutMedkitFilled + category: Items + cost: 4 + items: + - MedkitFilled + +- type: loadout + id: LoadoutMedkitBruteFilled + category: Items + cost: 4 + items: + - MedkitBruteFilled + requirements: + - !type:CharacterJobRequirement + jobs: + - MedicalDoctor + - Paramedic + - ChiefMedicalOfficer + - MedicalIntern + - Brigmedic + +- type: loadout + id: LoadoutMedkitBurnFilled + category: Items + cost: 4 + items: + - MedkitBurnFilled + requirements: + - !type:CharacterJobRequirement + jobs: + - MedicalDoctor + - Paramedic + - ChiefMedicalOfficer + - MedicalIntern + - Brigmedic + +- type: loadout + id: LoadoutMedkitToxinFilled + category: Items + cost: 4 + items: + - MedkitToxinFilled + requirements: + - !type:CharacterJobRequirement + jobs: + - MedicalDoctor + - Paramedic + - ChiefMedicalOfficer + - MedicalIntern + - Brigmedic + +- type: loadout + id: LoadoutMedkitOxygenFilled + category: Items + cost: 4 + items: + - MedkitOxygenFilled + requirements: + - !type:CharacterJobRequirement + jobs: + - MedicalDoctor + - Paramedic + - ChiefMedicalOfficer + - MedicalIntern + - Brigmedic + +- type: loadout + id: LoadoutMedkitRadiationFilled + category: Items + cost: 4 + items: + - MedkitRadiationFilled + requirements: + - !type:CharacterJobRequirement + jobs: + - MedicalDoctor + - Paramedic + - ChiefMedicalOfficer + - MedicalIntern + - Brigmedic + +- type: loadout + id: LoadoutMedkitAdvancedFilled + category: Items + cost: 5 + items: + - MedkitAdvancedFilled + requirements: + - !type:CharacterJobRequirement + jobs: + - MedicalDoctor + - Paramedic + - ChiefMedicalOfficer + - MedicalIntern + - Brigmedic + +- type: loadout + id: LoadoutMedkitCombatFilled + category: Items + cost: 4 # Discounted for the CMO and Corpsman + items: + - MedkitCombatFilled + requirements: + - !type:CharacterJobRequirement + jobs: + - ChiefMedicalOfficer + - Brigmedic + #Misc Items - type: loadout id: LoadoutItemPAI @@ -191,12 +476,43 @@ items: - PersonalAI +- type: loadout + id: LoadoutItemBackpackSatchelLeather + category: Items + cost: 1 + items: + - ClothingBackpackSatchelLeather + requirements: + - !type:CharacterJobRequirement + inverted: true + jobs: + - Prisoner + - type: loadout id: LoadoutItemWaistbag category: Items cost: 2 items: - ClothingBeltStorageWaistbag + requirements: + - !type:CharacterJobRequirement + inverted: true + jobs: + - Prisoner + +- type: loadout + id: LoadoutItemCrayonBox + category: Items + cost: 4 + items: + - CrayonBox + +- type: loadout + id: LoadoutItemBarberScissors + category: Items + cost: 4 + items: + - BarberScissors - type: loadout id: LoadoutSolCommonTranslator @@ -204,3 +520,10 @@ cost: 3 items: - SolCommonTranslator + +- type: loadout + id: LoadoutHandLabeler + category: Items + cost: 3 + items: + - HandLabeler diff --git a/Resources/Prototypes/Loadouts/mask.yml b/Resources/Prototypes/Loadouts/mask.yml new file mode 100644 index 00000000000..67be1e70ffd --- /dev/null +++ b/Resources/Prototypes/Loadouts/mask.yml @@ -0,0 +1,143 @@ +- type: loadout + id: LoadoutMaskSterile + category: Mask + cost: 1 + exclusive: true + items: + - ClothingMaskSterile + +- type: loadout + id: LoadoutMaskMuzzle + category: Mask + cost: 2 + exclusive: true + items: + - ClothingMaskMuzzle + +- type: loadout + id: LoadoutMaskGas + category: Mask + cost: 1 + exclusive: true + items: + - ClothingMaskGas + +# Maskbands +- type: loadout + id: LoadoutMaskBandBlack + category: Mask + cost: 1 + exclusive: true + items: + - ClothingMaskBandBlack + +- type: loadout + id: LoadoutMaskBandBlue + category: Mask + cost: 1 + exclusive: true + items: + - ClothingMaskBandBlue + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + +- type: loadout + id: LoadoutMaskBandGold + category: Mask + cost: 1 + exclusive: true + items: + - ClothingMaskBandGold + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + +- type: loadout + id: LoadoutMaskBandGreen + category: Mask + cost: 1 + exclusive: true + items: + - ClothingMaskBandGreen + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + +- type: loadout + id: LoadoutMaskBandGrey + category: Mask + cost: 1 + exclusive: true + items: + - ClothingMaskBandGrey + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + +- type: loadout + id: LoadoutMaskBandRed + category: Mask + cost: 1 + exclusive: true + items: + - ClothingMaskBandRed + +- type: loadout + id: LoadoutMaskBandSkull + category: Mask + cost: 1 + exclusive: true + items: + - ClothingMaskBandSkull + +- type: loadout + id: LoadoutMaskBandMerc + category: Mask + cost: 2 + exclusive: true + items: + - ClothingMaskBandMerc + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + +- type: loadout + id: LoadoutMaskBandBrown + category: Mask + cost: 1 + exclusive: true + items: + - ClothingMaskBandBrown + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + +# Gaiters +- type: loadout + id: LoadoutMaskNeckGaiter + category: Mask + cost: 2 + exclusive: true + items: + - ClothingMaskNeckGaiter + +- type: loadout + id: LoadoutMaskNeckGaiterRed + category: Mask + cost: 2 + exclusive: true + items: + - ClothingMaskNeckGaiterRed diff --git a/Resources/Prototypes/Loadouts/neck.yml b/Resources/Prototypes/Loadouts/neck.yml index eb933de29ee..c7fc7003653 100644 --- a/Resources/Prototypes/Loadouts/neck.yml +++ b/Resources/Prototypes/Loadouts/neck.yml @@ -1,3 +1,12 @@ +- type: loadout + id: LoadoutNeckHeadphones + category: Neck + cost: 2 + exclusive: true + items: + - ClothingNeckHeadphones + +# Scarves - type: loadout id: LoadoutNeckScarfStripedRed category: Neck @@ -22,6 +31,46 @@ items: - ClothingNeckScarfStripedGreen +- type: loadout + id: LoadoutNeckScarfStripedBlack + category: Neck + cost: 1 + exclusive: true + items: + - ClothingNeckScarfStripedBlack + +- type: loadout + id: LoadoutNeckScarfStripedBrown + category: Neck + cost: 1 + exclusive: true + items: + - ClothingNeckScarfStripedBrown + +- type: loadout + id: LoadoutNeckScarfStripedLightBlue + category: Neck + cost: 1 + exclusive: true + items: + - ClothingNeckScarfStripedLightBlue + +- type: loadout + id: LoadoutNeckScarfStripedOrange + category: Neck + cost: 1 + exclusive: true + items: + - ClothingNeckScarfStripedOrange + +- type: loadout + id: LoadoutNeckScarfStripedPurple + category: Neck + cost: 1 + exclusive: true + items: + - ClothingNeckScarfStripedPurple + - type: loadout id: LoadoutNeckScarfStripedZebra category: Neck @@ -30,6 +79,48 @@ items: - ClothingNeckScarfStripedZebra +# Ties +- type: loadout + id: LoadoutNeckTieRed + category: Neck + cost: 1 + exclusive: true + items: + - ClothingNeckTieRed + +- type: loadout + id: LoadoutNeckTieWhite + category: Neck + cost: 1 + exclusive: true + items: + - ClothingNeckTieWhite + +- type: loadout + id: LoadoutNeckTieBlack + category: Neck + cost: 1 + exclusive: true + items: + - ClothingNeckTieBlack + +- type: loadout + id: LoadoutNeckTieBlue + category: Neck + cost: 1 + exclusive: true + items: + - ClothingNeckTieBlue + +- type: loadout + id: LoadoutNeckTieGreen + category: Neck + cost: 1 + exclusive: true + items: + - ClothingNeckTieGreen + + #Pride Accessories - type: loadout id: LoadoutItemsPrideLGBTPin @@ -102,3 +193,216 @@ exclusive: true items: - ClothingNeckTransPin + +# Bedsheets +- type: loadout + id: LoadoutNeckBedsheetBlack + category: Neck + cost: 2 + exclusive: true + items: + - BedsheetBlack + requirements: + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command + +- type: loadout + id: LoadoutNeckBedsheetBlue + category: Neck + cost: 2 + exclusive: true + items: + - BedsheetBlue + requirements: + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command + +- type: loadout + id: LoadoutNeckBedsheetBrown + category: Neck + cost: 2 + exclusive: true + items: + - BedsheetBrown + requirements: + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command + +- type: loadout + id: LoadoutNeckBedsheetCosmos + category: Neck + cost: 3 + exclusive: true + items: + - BedsheetCosmos + requirements: + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command + +- type: loadout + id: LoadoutNeckBedsheetGreen + category: Neck + cost: 2 + exclusive: true + items: + - BedsheetGreen + requirements: + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command + +- type: loadout + id: LoadoutNeckBedsheetGrey + category: Neck + cost: 2 + exclusive: true + items: + - BedsheetGrey + requirements: + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command + +- type: loadout + id: LoadoutNeckBedsheetOrange + category: Neck + cost: 2 + exclusive: true + items: + - BedsheetOrange + requirements: + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - Logistics + - !type:CharacterJobRequirement + inverted: true + jobs: + - HeadOfPersonnel # Need to blacklist HoP and not command so other heads can wear this bedsheet + +- type: loadout + id: LoadoutNeckBedsheetPurple + category: Neck + cost: 2 + exclusive: true + items: + - BedsheetPurple + requirements: + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - Epistemics + - !type:CharacterJobRequirement + inverted: true + jobs: + - HeadOfPersonnel # Need to blacklist HoP and not command so other heads can wear this bedsheet + +- type: loadout + id: LoadoutNeckBedsheetRainbow + category: Neck + cost: 2 + exclusive: true + items: + - BedsheetRainbow + requirements: + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command + +- type: loadout + id: LoadoutNeckBedsheetRed + category: Neck + cost: 2 + exclusive: true + items: + - BedsheetRed + requirements: + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - Security + - !type:CharacterJobRequirement + inverted: true + jobs: + - HeadOfPersonnel # Need to blacklist HoP and not command so other heads can wear this bedsheet + +- type: loadout + id: LoadoutNeckBedsheetWhite + category: Neck + cost: 2 + exclusive: true + items: + - BedsheetWhite + requirements: + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command + +- type: loadout + id: LoadoutNeckBedsheetYellow + category: Neck + cost: 2 + exclusive: true + items: + - BedsheetYellow + requirements: + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - Engineering + - !type:CharacterJobRequirement + inverted: true + jobs: + - HeadOfPersonnel # Need to blacklist HoP and not command so other heads can wear this bedsheet + +- type: loadout + id: LoadoutNeckBedsheetNT + category: Neck + cost: 2 + exclusive: true + items: + - BedsheetNT + requirements: + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command diff --git a/Resources/Prototypes/Loadouts/outerClothing.yml b/Resources/Prototypes/Loadouts/outerClothing.yml index c52f35b0f5d..da091412b6c 100644 --- a/Resources/Prototypes/Loadouts/outerClothing.yml +++ b/Resources/Prototypes/Loadouts/outerClothing.yml @@ -54,6 +54,13 @@ items: - ClothingOuterVestValet +- type: loadout + id: LoadoutOuterVest + category: Outer + cost: 1 + items: + - ClothingOuterVest + # Letterman Jackets - type: loadout id: LoadoutOuterCoatLettermanBlue @@ -168,3 +175,67 @@ cost: 2 items: - ClothingOuterZhCorporateJacket + +- type: loadout + id: LoadoutOuterDenimJacket + category: Outer + cost: 3 + items: + - ClothingOuterDenimJacket + +# Flannel +- type: loadout + id: LoadoutOuterFlannelRed + category: Outer + cost: 3 + items: + - ClothingOuterFlannelRed + +- type: loadout + id: LoadoutOuterFlannelGreen + category: Outer + cost: 3 + items: + - ClothingOuterFlannelGreen + +- type: loadout + id: LoadoutOuterFlannelBlue + category: Outer + cost: 3 + items: + - ClothingOuterFlannelBlue + +- type: loadout + id: LoadoutOuterCoatTrench + category: Outer + cost: 3 + items: + - ClothingOuterCoatTrench + +- type: loadout + id: LoadoutOuterCoatJensen + category: Outer + cost: 3 + items: + - ClothingOuterCoatJensen + +- type: loadout + id: LoadoutOuterCoatGentle + category: Outer + cost: 3 + items: + - ClothingOuterCoatGentle + +- type: loadout + id: LoadoutOuterCoatInspector + category: Outer + cost: 3 + items: + - ClothingOuterCoatInspector + +- type: loadout + id: LoadoutOuterCoatOvercoat + category: Outer + cost: 4 + items: + - ClothingOuterCoatOvercoat diff --git a/Resources/Prototypes/Loadouts/shoes.yml b/Resources/Prototypes/Loadouts/shoes.yml index bdea2b57ad1..470cac29834 100644 --- a/Resources/Prototypes/Loadouts/shoes.yml +++ b/Resources/Prototypes/Loadouts/shoes.yml @@ -8,6 +8,7 @@ - !type:CharacterSpeciesRequirement inverted: true species: + - Diona - Harpy items: - ClothingShoesColorBlack @@ -21,6 +22,7 @@ - !type:CharacterSpeciesRequirement inverted: true species: + - Diona - Harpy items: - ClothingShoesColorBlue @@ -34,6 +36,7 @@ - !type:CharacterSpeciesRequirement inverted: true species: + - Diona - Harpy items: - ClothingShoesColorBrown @@ -47,6 +50,7 @@ - !type:CharacterSpeciesRequirement inverted: true species: + - Diona - Harpy items: - ClothingShoesColorGreen @@ -60,6 +64,7 @@ - !type:CharacterSpeciesRequirement inverted: true species: + - Diona - Harpy items: - ClothingShoesColorOrange @@ -73,6 +78,7 @@ - !type:CharacterSpeciesRequirement inverted: true species: + - Diona - Harpy items: - ClothingShoesColorPurple @@ -86,6 +92,7 @@ - !type:CharacterSpeciesRequirement inverted: true species: + - Diona - Harpy items: - ClothingShoesColorRed @@ -99,6 +106,7 @@ - !type:CharacterSpeciesRequirement inverted: true species: + - Diona - Harpy items: - ClothingShoesColorWhite @@ -112,6 +120,7 @@ - !type:CharacterSpeciesRequirement inverted: true species: + - Diona - Harpy items: - ClothingShoesColorYellow @@ -125,10 +134,25 @@ - !type:CharacterSpeciesRequirement inverted: true species: + - Diona - Harpy items: - ClothingShoesGeta +- type: loadout + id: LoadoutShoesTourist + category: Shoes + cost: 2 + exclusive: true + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + - Harpy + items: + - ClothingShoesTourist + # Boots - type: loadout id: LoadoutShoesBootsWork @@ -139,6 +163,7 @@ - !type:CharacterSpeciesRequirement inverted: true species: + - Diona - Harpy items: - ClothingShoesBootsWork @@ -152,6 +177,7 @@ - !type:CharacterSpeciesRequirement inverted: true species: + - Diona - Harpy items: - ClothingShoesBootsLaceup @@ -165,6 +191,7 @@ - !type:CharacterSpeciesRequirement inverted: true species: + - Diona - Harpy items: - ClothingShoesBootsWinter @@ -178,6 +205,7 @@ - !type:CharacterSpeciesRequirement inverted: true species: + - Diona - Harpy items: - ClothingShoesBootsCowboyBrown @@ -191,6 +219,7 @@ - !type:CharacterSpeciesRequirement inverted: true species: + - Diona - Harpy items: - ClothingShoesBootsCowboyBlack @@ -204,6 +233,7 @@ - !type:CharacterSpeciesRequirement inverted: true species: + - Diona - Harpy items: - ClothingShoesBootsCowboyWhite @@ -217,10 +247,25 @@ - !type:CharacterSpeciesRequirement inverted: true species: + - Diona - Harpy items: - ClothingShoesBootsCowboyFancy +- type: loadout + id: LoadoutShoesBootsFishing + category: Shoes + cost: 2 + exclusive: true + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + - Harpy + items: + - ClothingShoesBootsFishing + # Miscellaneous - type: loadout id: LoadoutShoesSlippersDuck @@ -233,6 +278,7 @@ - !type:CharacterSpeciesRequirement inverted: true species: + - Diona - Harpy - !type:CharacterJobRequirement jobs: @@ -247,6 +293,7 @@ - !type:CharacterSpeciesRequirement inverted: true species: + - Diona - Harpy items: - ClothingShoesLeather @@ -260,6 +307,51 @@ - !type:CharacterSpeciesRequirement inverted: true species: + - Diona - Harpy items: - ClothingShoesMiscWhite + +- type: loadout + id: LoadoutShoesHighheelBoots + category: Shoes + cost: 3 + exclusive: true + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + - Harpy + items: + - ClothingShoesHighheelBoots + +# Socks +- type: loadout + id: LoadoutShoesUnderSocksCoder + category: Shoes + cost: 3 + exclusive: true + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + - Harpy + items: + - ClothingUnderSocksCoder + +# Socks +- type: loadout + id: LoadoutShoesUnderSocksBee + category: Shoes + cost: 3 + exclusive: true + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + - Harpy + items: + - ClothingUnderSocksBee diff --git a/Resources/Prototypes/Loadouts/uniform.yml b/Resources/Prototypes/Loadouts/uniform.yml index eb46acc2f60..5843cb30ee5 100644 --- a/Resources/Prototypes/Loadouts/uniform.yml +++ b/Resources/Prototypes/Loadouts/uniform.yml @@ -28,9 +28,14 @@ inverted: true species: - Harpy - - !type:CharacterJobRequirement - jobs: - - Passenger + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - Security + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout id: LoadoutUniformJumpskirtColorBlack @@ -40,9 +45,14 @@ items: - ClothingUniformJumpskirtColorBlack requirements: - - !type:CharacterJobRequirement - jobs: - - Passenger + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - Security + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout id: LoadoutUniformJumpsuitColorBlue @@ -56,9 +66,14 @@ inverted: true species: - Harpy - - !type:CharacterJobRequirement - jobs: - - Passenger + - !type:CharacterDepartmentRequirement + departments: + - Medical + - Civilian + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout id: LoadoutUniformJumpskirtColorBlue @@ -68,9 +83,14 @@ items: - ClothingUniformJumpskirtColorBlue requirements: - - !type:CharacterJobRequirement - jobs: - - Passenger + - !type:CharacterDepartmentRequirement + departments: + - Medical + - Civilian + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout id: LoadoutUniformJumpsuitColorGreen @@ -84,9 +104,13 @@ inverted: true species: - Harpy - - !type:CharacterJobRequirement - jobs: - - Passenger + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout id: LoadoutUniformJumpskirtColorGreen @@ -96,9 +120,13 @@ items: - ClothingUniformJumpskirtColorGreen requirements: - - !type:CharacterJobRequirement - jobs: - - Passenger + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout id: LoadoutUniformJumpsuitColorOrange @@ -112,9 +140,13 @@ inverted: true species: - Harpy - - !type:CharacterJobRequirement - jobs: - - Passenger + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout id: LoadoutUniformJumpskirtColorOrange @@ -124,9 +156,13 @@ items: - ClothingUniformJumpskirtColorOrange requirements: - - !type:CharacterJobRequirement - jobs: - - Passenger + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout id: LoadoutUniformJumpsuitColorPink @@ -140,9 +176,13 @@ inverted: true species: - Harpy - - !type:CharacterJobRequirement - jobs: - - Passenger + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout id: LoadoutUniformJumpskirtColorPink @@ -152,9 +192,13 @@ items: - ClothingUniformJumpskirtColorPink requirements: - - !type:CharacterJobRequirement - jobs: - - Passenger + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout id: LoadoutUniformJumpsuitColorRed @@ -168,9 +212,14 @@ inverted: true species: - Harpy - - !type:CharacterJobRequirement - jobs: - - Passenger + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - Security + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout id: LoadoutUniformJumpskirtColorRed @@ -180,9 +229,14 @@ items: - ClothingUniformJumpskirtColorRed requirements: - - !type:CharacterJobRequirement - jobs: - - Passenger + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - Security + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout id: LoadoutUniformJumpsuitColorWhite @@ -196,9 +250,15 @@ inverted: true species: - Harpy - - !type:CharacterJobRequirement - jobs: - - Passenger + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - Medical + - Epistemics + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout id: LoadoutUniformJumpskirtColorWhite @@ -208,9 +268,15 @@ items: - ClothingUniformJumpskirtColorWhite requirements: - - !type:CharacterJobRequirement - jobs: - - Passenger + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - Medical + - Epistemics + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout id: LoadoutUniformJumpsuitColorYellow @@ -224,9 +290,14 @@ inverted: true species: - Harpy - - !type:CharacterJobRequirement - jobs: - - Passenger + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - Engineering + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout id: LoadoutUniformJumpskirtColorYellow @@ -236,9 +307,14 @@ items: - ClothingUniformJumpskirtColorYellow requirements: - - !type:CharacterJobRequirement - jobs: - - Passenger + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - Engineering + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout id: LoadoutUniformJumpsuitColorDarkBlue @@ -252,9 +328,13 @@ inverted: true species: - Harpy - - !type:CharacterJobRequirement - jobs: - - Passenger + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout id: LoadoutUniformJumpskirtColorDarkBlue @@ -264,9 +344,13 @@ items: - ClothingUniformJumpskirtColorDarkBlue requirements: - - !type:CharacterJobRequirement - jobs: - - Passenger + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout id: LoadoutUniformJumpsuitColorTeal @@ -280,9 +364,13 @@ inverted: true species: - Harpy - - !type:CharacterJobRequirement - jobs: - - Passenger + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout id: LoadoutUniformJumpskirtColorTeal @@ -292,9 +380,13 @@ items: - ClothingUniformJumpskirtColorTeal requirements: - - !type:CharacterJobRequirement - jobs: - - Passenger + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout id: LoadoutUniformJumpsuitColorPurple @@ -308,9 +400,14 @@ inverted: true species: - Harpy - - !type:CharacterJobRequirement - jobs: - - Passenger + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - Epistemics + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout id: LoadoutUniformJumpskirtColorPurple @@ -320,9 +417,14 @@ items: - ClothingUniformJumpskirtColorPurple requirements: - - !type:CharacterJobRequirement - jobs: - - Passenger + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - Epistemics + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout id: LoadoutUniformJumpsuitColorDarkGreen @@ -336,9 +438,13 @@ inverted: true species: - Harpy - - !type:CharacterJobRequirement - jobs: - - Passenger + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout id: LoadoutUniformJumpskirtColorDarkGreen @@ -348,9 +454,13 @@ items: - ClothingUniformJumpskirtColorDarkGreen requirements: - - !type:CharacterJobRequirement - jobs: - - Passenger + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout id: LoadoutUniformJumpsuitColorLightBrown @@ -364,9 +474,13 @@ inverted: true species: - Harpy - - !type:CharacterJobRequirement - jobs: - - Passenger + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout id: LoadoutUniformJumpskirtColorLightBrown @@ -376,9 +490,13 @@ items: - ClothingUniformJumpskirtColorLightBrown requirements: - - !type:CharacterJobRequirement - jobs: - - Passenger + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout id: LoadoutUniformJumpsuitColorBrown @@ -392,9 +510,13 @@ inverted: true species: - Harpy - - !type:CharacterJobRequirement - jobs: - - Passenger + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout id: LoadoutUniformJumpskirtColorBrown @@ -404,9 +526,13 @@ items: - ClothingUniformJumpskirtColorBrown requirements: - - !type:CharacterJobRequirement - jobs: - - Passenger + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout id: LoadoutUniformJumpsuitColorMaroon @@ -420,9 +546,13 @@ inverted: true species: - Harpy - - !type:CharacterJobRequirement - jobs: - - Passenger + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout id: LoadoutUniformJumpskirtColorMaroon @@ -432,130 +562,957 @@ items: - ClothingUniformJumpskirtColorMaroon requirements: - - !type:CharacterJobRequirement - jobs: - - Passenger + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command -# Kendo - type: loadout - id: LoadoutUniformKendoHakama + id: LoadoutUniformJumpsuitFlannel category: Uniform cost: 2 exclusive: true items: - - ClothingUniformKendoHakama + - ClothingUniformJumpsuitFlannel + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Harpy + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout - id: LoadoutUniformMartialGi + id: LoadoutUniformJumpskirtCasualBlue category: Uniform cost: 2 exclusive: true items: - - ClothingUniformMartialGi + - ClothingUniformJumpskirtCasualBlue + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + - Command -# Kimono - type: loadout - id: LoadoutClothingKimonoBlue + id: LoadoutUniformJumpsuitCasualPurple category: Uniform - cost: 3 + cost: 2 exclusive: true items: - - ClothingKimonoBlue + - ClothingUniformJumpsuitCasualPurple + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Harpy + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + - Command - type: loadout - id: LoadoutClothingKimonoPink + id: LoadoutUniformJumpskirtCasualPurple category: Uniform - cost: 3 + cost: 2 exclusive: true items: - - ClothingKimonoPink + - ClothingUniformJumpskirtCasualPurple + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + - Command - type: loadout - id: LoadoutClothingKimonoPurple + id: LoadoutUniformJumpsuitCasualRed category: Uniform - cost: 3 + cost: 2 exclusive: true items: - - ClothingKimonoPurple + - ClothingUniformJumpsuitCasualRed + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Harpy + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout - id: LoadoutClothingKimonoSky + id: LoadoutUniformJumpskirtCasualRed category: Uniform - cost: 3 + cost: 2 exclusive: true items: - - ClothingKimonoSky + - ClothingUniformJumpskirtCasualRed + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout - id: LoadoutClothingKimonoGreen + id: LoadoutUniformJumpsuitTshirtJeans category: Uniform - cost: 3 + cost: 2 exclusive: true items: - - ClothingKimonoGreen + - ClothingUniformJumpsuitTshirtJeans + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Harpy + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + - Command -# Gakuran - type: loadout - id: LoadoutUniformSchoolGakuranBlack + id: LoadoutUniformJumpsuitTshirtJeansGray category: Uniform cost: 2 exclusive: true items: - - ClothingUniformSchoolGakuranBlack + - ClothingUniformJumpsuitTshirtJeansGray + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Harpy + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command -# MNK Uniforms - type: loadout - id: LoadoutClothingMNKOfficeSkirt + id: LoadoutUniformJumpsuitTshirtJeansPeach category: Uniform - cost: 3 + cost: 2 exclusive: true items: - - ClothingUniformMNKOfficeSkirt + - ClothingUniformJumpsuitTshirtJeansPeach + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Harpy + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout - id: LoadoutClothingMNKUnderGarment + id: LoadoutUniformJumpsuitJeansGreen category: Uniform - cost: 3 + cost: 2 exclusive: true items: - - ClothingUniformMNKUnderGarment + - ClothingUniformJumpsuitJeansGreen + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Harpy + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + - Command - type: loadout - id: LoadoutClothingMNKGymBra + id: LoadoutUniformJumpsuitJeansRed category: Uniform - cost: 3 + cost: 2 exclusive: true items: - - ClothingUniformMNKGymBra + - ClothingUniformJumpsuitJeansRed + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Harpy + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout - id: LoadoutClothingMNKDressBlack + id: LoadoutUniformJumpsuitJeansBrown category: Uniform - cost: 4 + cost: 2 exclusive: true items: - - ClothingUniformMNKDressBlack + - ClothingUniformJumpsuitJeansBrown + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Harpy + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + - Command - type: loadout - id: LoadoutClothingMNKBlackOveralls + id: LoadoutUniformJumpsuitLostTourist category: Uniform cost: 3 exclusive: true items: - - ClothingUniformMNKBlackOveralls + - ClothingUniformJumpsuitLostTourist + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Harpy + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + - Command +# Hawaiian shirts - type: loadout - id: LoadoutClothingMNKBlackShoulder + id: LoadoutUniformJumpsuitHawaiBlack category: Uniform - cost: 3 + cost: 2 exclusive: true items: - - ClothingUniformMNKBlackShoulder + - ClothingUniformJumpsuitHawaiBlack + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Harpy + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + - Command - type: loadout - id: LoadoutClothingMNKTracksuitBlack + id: LoadoutUniformJumpsuitHawaiBlue category: Uniform - cost: 3 + cost: 2 exclusive: true items: - - ClothingUniformMNKTracksuitBlack + - ClothingUniformJumpsuitHawaiBlue + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Harpy + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + - Command + +- type: loadout + id: LoadoutUniformJumpsuitHawaiRed + category: Uniform + cost: 2 + exclusive: true + items: + - ClothingUniformJumpsuitHawaiRed + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Harpy + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command + +- type: loadout + id: LoadoutUniformJumpsuitHawaiYellow + category: Uniform + cost: 2 + exclusive: true + items: + - ClothingUniformJumpsuitHawaiYellow + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Harpy + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + - Command + +# AutoDrobe clothes +- type: loadout + id: LoadoutUniformDressRed + category: Uniform + cost: 4 + exclusive: true + items: + - ClothingUniformDressRed + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command + +- type: loadout + id: LoadoutUniformJumpsuitSober + category: Uniform + cost: 2 + exclusive: true + items: + - ClothingUniformJumpsuitSober + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Harpy + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command + +- type: loadout + id: LoadoutUniformSkirtTurtle + category: Uniform + cost: 2 + exclusive: true + items: + - ClothingUniformSkirtTurtle + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command + +- type: loadout + id: LoadoutUniformGeisha + category: Uniform + cost: 3 + exclusive: true + items: + - UniformGeisha + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command + +- type: loadout + id: LoadoutUniformCostumeArcDress + category: Uniform + cost: 2 + exclusive: true + items: + - ClothingCostumeArcDress + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + - Command + +- type: loadout + id: LoadoutUniformCostumeMioSkirt + category: Uniform + cost: 2 + exclusive: true + items: + - ClothingCostumeMioSkirt + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + - Command + +- type: loadout + id: LoadoutUniformCostumeNaota + category: Uniform + cost: 2 + exclusive: true + items: + - ClothingCostumeNaota + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + - Command + +- type: loadout + id: LoadoutUniformJumpsuitLoungewear + category: Uniform + cost: 2 + exclusive: true + items: + - ClothingUniformJumpsuitLoungewear + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command + +# Bartender clothes +- type: loadout + id: LoadoutUniformJumpsuitBartender + category: Uniform + cost: 3 + exclusive: true + items: + - ClothingUniformJumpsuitBartender + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Harpy + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + - Command + +- type: loadout + id: LoadoutUniformJumpskirtBartender + category: Uniform + cost: 3 + exclusive: true + items: + - ClothingUniformJumpskirtBartender + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + - Command + +# Kendo +- type: loadout + id: LoadoutUniformKendoHakama + category: Uniform + cost: 2 + exclusive: true + items: + - ClothingUniformKendoHakama + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command + +- type: loadout + id: LoadoutUniformMartialGi + category: Uniform + cost: 2 + exclusive: true + items: + - ClothingUniformMartialGi + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + - Command + +# Kimono +- type: loadout + id: LoadoutClothingJumpsuitKimono + category: Uniform + cost: 3 + exclusive: true + items: + - ClothingUniformJumpsuitKimono + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + - Command + +- type: loadout + id: LoadoutClothingKimonoBlue + category: Uniform + cost: 3 + exclusive: true + items: + - ClothingKimonoBlue + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + - Command + +- type: loadout + id: LoadoutClothingKimonoPink + category: Uniform + cost: 3 + exclusive: true + items: + - ClothingKimonoPink + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + - Command + +- type: loadout + id: LoadoutClothingKimonoPurple + category: Uniform + cost: 3 + exclusive: true + items: + - ClothingKimonoPurple + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + - Command + +- type: loadout + id: LoadoutClothingKimonoSky + category: Uniform + cost: 3 + exclusive: true + items: + - ClothingKimonoSky + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + - Command + +- type: loadout + id: LoadoutClothingKimonoGreen + category: Uniform + cost: 3 + exclusive: true + items: + - ClothingKimonoGreen + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + - Command + +# Gakuran +- type: loadout + id: LoadoutUniformSchoolGakuranBlack + category: Uniform + cost: 2 + exclusive: true + items: + - ClothingUniformSchoolGakuranBlack + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command + +# Schoolgirl uniform +- type: loadout + id: LoadoutUniformSchoolgirlBlack + category: Uniform + cost: 3 + exclusive: true + items: + - UniformSchoolgirlBlack + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command + +- type: loadout + id: LoadoutUniformSchoolgirlBlue + category: Uniform + cost: 3 + exclusive: true + items: + - UniformSchoolgirlBlue + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + - Command + +- type: loadout + id: LoadoutUniformSchoolgirlCyan + category: Uniform + cost: 3 + exclusive: true + items: + - UniformSchoolgirlCyan + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + - Command + +- type: loadout + id: LoadoutUniformSchoolgirlGreen + category: Uniform + cost: 3 + exclusive: true + items: + - UniformSchoolgirlGreen + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + - Command + +- type: loadout + id: LoadoutUniformSchoolgirlOrange + category: Uniform + cost: 3 + exclusive: true + items: + - UniformSchoolgirlOrange + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + - Command + +- type: loadout + id: LoadoutUniformSchoolgirlPink + category: Uniform + cost: 3 + exclusive: true + items: + - UniformSchoolgirlPink + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + - Command + +- type: loadout + id: LoadoutUniformSchoolgirlPurple + category: Uniform + cost: 3 + exclusive: true + items: + - UniformSchoolgirlPurple + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + - Command + +- type: loadout + id: LoadoutUniformSchoolgirlRed + category: Uniform + cost: 3 + exclusive: true + items: + - UniformSchoolgirlRed + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command + +- type: loadout + id: LoadoutUniformSchoolgirlDusk + category: Uniform + cost: 3 + exclusive: true + items: + - UniformSchoolgirlDusk + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + - Command + +- type: loadout + id: LoadoutUniformSchoolgirlBlazerTan + category: Uniform + cost: 3 + exclusive: true + items: + - UniformSchoolgirlBlazerTan + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + - Command + +# MNK Uniforms +- type: loadout + id: LoadoutClothingMNKOfficeSkirt + category: Uniform + cost: 3 + exclusive: true + items: + - ClothingUniformMNKOfficeSkirt + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command + +- type: loadout + id: LoadoutClothingMNKUnderGarment + category: Uniform + cost: 3 + exclusive: true + items: + - ClothingUniformMNKUnderGarment + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command + +- type: loadout + id: LoadoutClothingMNKGymBra + category: Uniform + cost: 3 + exclusive: true + items: + - ClothingUniformMNKGymBra + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command + +- type: loadout + id: LoadoutClothingMNKDressBlack + category: Uniform + cost: 4 + exclusive: true + items: + - ClothingUniformMNKDressBlack + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command + +- type: loadout + id: LoadoutClothingMNKBlackOveralls + category: Uniform + cost: 3 + exclusive: true + items: + - ClothingUniformMNKBlackOveralls + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command + +- type: loadout + id: LoadoutClothingMNKBlackShoulder + category: Uniform + cost: 3 + exclusive: true + items: + - ClothingUniformMNKBlackShoulder + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command + +- type: loadout + id: LoadoutClothingMNKTracksuitBlack + category: Uniform + cost: 3 + exclusive: true + items: + - ClothingUniformMNKTracksuitBlack + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command + +# Suits +- type: loadout + id: LoadoutClothingJumpsuitSuitBlack + category: Uniform + cost: 2 + exclusive: true + items: + - ClothingUniformJumpsuitSuitBlack + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Harpy + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command + +- type: loadout + id: LoadoutClothingJumpsuitSuitBlackAlt + category: Uniform + cost: 2 + exclusive: true + items: + - ClothingUniformJumpsuitSuitBlackAlt + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Harpy + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command + +- type: loadout + id: LoadoutClothingJumpsuitSuitBlackMob + category: Uniform + cost: 2 + exclusive: true + items: + - ClothingUniformJumpsuitSuitBlackMob + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Harpy + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command + +- type: loadout + id: LoadoutClothingJumpsuitSuitBrown + category: Uniform + cost: 2 + exclusive: true + items: + - ClothingUniformJumpsuitSuitBrown + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Harpy + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command + - Security + +- type: loadout + id: LoadoutClothingJumpsuitSuitBrownAlt + category: Uniform + cost: 2 + exclusive: true + items: + - ClothingUniformJumpsuitSuitBrownAlt + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Harpy + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command + +- type: loadout + id: LoadoutClothingJumpsuitSuitBrownMob + category: Uniform + cost: 2 + exclusive: true + items: + - ClothingUniformJumpsuitSuitBrownMob + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Harpy + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command + +- type: loadout + id: LoadoutClothingJumpsuitSuitWhite + category: Uniform + cost: 2 + exclusive: true + items: + - ClothingUniformJumpsuitSuitWhite + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Harpy + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command + - Security + +- type: loadout + id: LoadoutClothingJumpsuitSuitWhiteAlt + category: Uniform + cost: 2 + exclusive: true + items: + - ClothingUniformJumpsuitSuitWhiteAlt + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Harpy + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command + +- type: loadout + id: LoadoutClothingJumpsuitSuitWhiteMob + category: Uniform + cost: 2 + exclusive: true + items: + - ClothingUniformJumpsuitSuitWhiteMob + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Harpy + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command diff --git a/Resources/Prototypes/Nyanotrasen/Actions/types.yml b/Resources/Prototypes/Nyanotrasen/Actions/types.yml index 04002f5755d..cab8f4a1f4e 100644 --- a/Resources/Prototypes/Nyanotrasen/Actions/types.yml +++ b/Resources/Prototypes/Nyanotrasen/Actions/types.yml @@ -18,141 +18,4 @@ charges: 1 icon: { sprite: Nyanotrasen/Objects/Specific/Species/felinid.rsi, state: icon } useDelay: 30 - event: !type:HairballActionEvent - -- type: entity - id: ActionDispel - name: action-name-dispel - description: action-description-dispel - noSpawn: true - components: - - type: EntityTargetAction - icon: Nyanotrasen/Interface/VerbIcons/dispel.png - useDelay: 45 - checkCanAccess: false - range: 6 - itemIconStyle: BigAction - canTargetSelf: false - event: !type:DispelPowerActionEvent - -- type: entity - id: ActionMassSleep - name: action-name-mass-sleep - description: action-description-mass-sleep - noSpawn: true - components: - - type: WorldTargetAction - icon: Nyanotrasen/Interface/VerbIcons/mass_sleep.png - useDelay: 60 - checkCanAccess: false - range: 8 - itemIconStyle: BigAction - event: !type:MassSleepPowerActionEvent - -- type: entity - id: ActionMindSwap - name: action-name-mind-swap - description: action-description-mind-swap - noSpawn: true - components: - - type: EntityTargetAction - icon: Nyanotrasen/Interface/VerbIcons/mind_swap.png - useDelay: 240 - checkCanAccess: false - range: 8 - itemIconStyle: BigAction - event: !type:MindSwapPowerActionEvent - -- type: entity - id: ActionMindSwapReturn - name: action-name-mind-swap-return - description: action-description-mind-swap-return - noSpawn: true - components: - - type: InstantAction - icon: Nyanotrasen/Interface/VerbIcons/mind_swap_return.png - useDelay: 20 - checkCanInteract: false - event: !type:MindSwapPowerReturnActionEvent - -- type: entity - id: ActionNoosphericZap - name: action-name-noospheric-zap - description: action-description-noospheric-zap - noSpawn: true - components: - - type: EntityTargetAction - icon: Nyanotrasen/Interface/VerbIcons/noospheric_zap.png - useDelay: 100 - range: 5 - itemIconStyle: BigAction - event: !type:NoosphericZapPowerActionEvent - -- type: entity - id: ActionPyrokinesis - name: action-name-pyrokinesis - description: action-description-pyrokinesis - noSpawn: true - components: - - type: EntityTargetAction - icon: Nyanotrasen/Interface/VerbIcons/pyrokinesis.png - useDelay: 50 - range: 6 - checkCanAccess: false - itemIconStyle: BigAction - event: !type:PyrokinesisPowerActionEvent - -- type: entity - id: ActionMetapsionic - name: action-name-metapsionic - description: action-description-metapsionic - noSpawn: true - components: - - type: InstantAction - icon: Nyanotrasen/Interface/VerbIcons/metapsionic.png - useDelay: 45 - event: !type:MetapsionicPowerActionEvent - -- type: entity - id: ActionPsionicRegeneration - name: action-name-psionic-regeneration - description: action-description-psionic-regeneration - noSpawn: true - components: - - type: InstantAction - icon: Nyanotrasen/Interface/VerbIcons/psionic_regeneration.png - useDelay: 120 - event: !type:PsionicRegenerationPowerActionEvent - -- type: entity - id: ActionTelegnosis - name: action-name-telegnosis - description: action-description-telegnosis - noSpawn: true - components: - - type: InstantAction - icon: Nyanotrasen/Interface/VerbIcons/telegnosis.png - useDelay: 150 - event: !type:TelegnosisPowerActionEvent - -- type: entity - id: ActionPsionicInvisibility - name: action-name-psionic-invisibility - description: action-description-psionic-invisibility - noSpawn: true - components: - - type: InstantAction - icon: Nyanotrasen/Interface/VerbIcons/psionic_invisibility.png - useDelay: 120 - event: !type:PsionicInvisibilityPowerActionEvent - -- type: entity - id: ActionPsionicInvisibilityUsed - name: action-name-psionic-invisibility-off - description: action-description-psionic-invisibility-off - noSpawn: true - components: - - type: InstantAction - icon: Nyanotrasen/Interface/VerbIcons/psionic_invisibility_off.png - event: !type:RemovePsionicInvisibilityOffPowerActionEvent - + event: !type:HairballActionEvent \ No newline at end of file diff --git a/Resources/Prototypes/Nyanotrasen/Catalog/Fills/Backpacks/StarterGear/backpack.yml b/Resources/Prototypes/Nyanotrasen/Catalog/Fills/Backpacks/StarterGear/backpack.yml index d72e0dd7cd8..810f9ec03b6 100644 --- a/Resources/Prototypes/Nyanotrasen/Catalog/Fills/Backpacks/StarterGear/backpack.yml +++ b/Resources/Prototypes/Nyanotrasen/Catalog/Fills/Backpacks/StarterGear/backpack.yml @@ -5,7 +5,6 @@ components: - type: StorageFill contents: - - id: BoxSurvival # - id: BoxForensicPad # DeltaV - Mantis is no longer a Detective - id: HandLabeler - id: PillMindbreakerToxin diff --git a/Resources/Prototypes/Nyanotrasen/Catalog/Fills/Backpacks/StarterGear/duffelbag.yml b/Resources/Prototypes/Nyanotrasen/Catalog/Fills/Backpacks/StarterGear/duffelbag.yml index 982b820ad10..88e33cdd252 100644 --- a/Resources/Prototypes/Nyanotrasen/Catalog/Fills/Backpacks/StarterGear/duffelbag.yml +++ b/Resources/Prototypes/Nyanotrasen/Catalog/Fills/Backpacks/StarterGear/duffelbag.yml @@ -5,7 +5,6 @@ components: - type: StorageFill contents: - - id: BoxSurvival # - id: BoxForensicPad # DeltaV - Mantis is no longer a Detective - id: HandLabeler - id: PillMindbreakerToxin diff --git a/Resources/Prototypes/Nyanotrasen/Catalog/Fills/Backpacks/StarterGear/satchel.yml b/Resources/Prototypes/Nyanotrasen/Catalog/Fills/Backpacks/StarterGear/satchel.yml index 5644f36c9ce..e90759ac8fb 100644 --- a/Resources/Prototypes/Nyanotrasen/Catalog/Fills/Backpacks/StarterGear/satchel.yml +++ b/Resources/Prototypes/Nyanotrasen/Catalog/Fills/Backpacks/StarterGear/satchel.yml @@ -5,7 +5,6 @@ components: - type: StorageFill contents: - - id: BoxSurvival # - id: BoxForensicPad # DeltaV - Mantis is no longer a Detective - id: HandLabeler - id: PillMindbreakerToxin diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Body/Mechanisms/vampiric.yml b/Resources/Prototypes/Nyanotrasen/Entities/Body/Mechanisms/vampiric.yml new file mode 100644 index 00000000000..23934b3ebcc --- /dev/null +++ b/Resources/Prototypes/Nyanotrasen/Entities/Body/Mechanisms/vampiric.yml @@ -0,0 +1,22 @@ +- type: entity + id: OrganVampiricHumanoidStomach + parent: OrganHumanStomach + components: + - type: Metabolizer + # mm yummy + maxReagents: 3 + metabolizerTypes: [Vampiric] + groups: + - id: Food + - id: Drink + +- type: entity + id: OrganVampiricStomach + parent: OrganAnimalStomach + components: + - type: Metabolizer + maxReagents: 3 + metabolizerTypes: [Vampiric] + groups: + - id: Food + - id: Drink diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Body/Parts/spider.yml b/Resources/Prototypes/Nyanotrasen/Entities/Body/Parts/spider.yml index a900f7524e7..7e71227dbcb 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Body/Parts/spider.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Body/Parts/spider.yml @@ -24,13 +24,33 @@ - ReagentId: DemonsBlood Quantity: 10 +- type: entity + id: ThoraxSpider + name: "spider thorax" #for arachne, actual spiders should get a cephalothorax that combines with head. + parent: PartSpider + components: + - type: Sprite + sprite: Mobs/Species/Moth/parts.rsi # placeholder sprite + state: "torso_m" + - type: Icon + sprite: Mobs/Species/Moth/parts.rsi + state: "torso_m" + - type: BodyPart #"Other" type + - type: Extractable + juiceSolution: + reagents: + - ReagentId: Fat + Quantity: 10 + - ReagentId: DemonsBlood + Quantity: 20 + - type: entity id: RightLegSpider name: "right spider leg" parent: PartSpider components: - type: Sprite - sprite: Objects/Consumable/Food/meat.rsi + sprite: Objects/Consumable/Food/meat.rsi # placeholder sprite state: spiderleg - type: Icon sprite: Objects/Consumable/Food/meat.rsi @@ -48,7 +68,7 @@ parent: PartSpider components: - type: Sprite - sprite: Objects/Consumable/Food/meat.rsi + sprite: Objects/Consumable/Food/meat.rsi # placeholder sprite state: spiderleg - type: Icon sprite: Objects/Consumable/Food/meat.rsi diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Body/Prototypes/arachne.yml b/Resources/Prototypes/Nyanotrasen/Entities/Body/Prototypes/arachne.yml new file mode 100644 index 00000000000..553391484e2 --- /dev/null +++ b/Resources/Prototypes/Nyanotrasen/Entities/Body/Prototypes/arachne.yml @@ -0,0 +1,63 @@ +- type: body + id: Arachne + name: "arachne" + root: torso + slots: + head: + part: HeadHuman + connections: + - torso + organs: + brain: OrganHumanBrain + eyes: OrganHumanEyes + torso: + part: TorsoHuman + connections: + - left arm + - right arm + - thorax + organs: + heart: OrganHumanHeart + lungs: OrganHumanLungs + stomach: OrganVampiricHumanoidStomach + liver: OrganHumanLiver + kidneys: OrganHumanKidneys + right arm: + part: RightArmHuman + connections: + - right hand + left arm: + part: LeftArmHuman + connections: + - left hand + right hand: + part: RightHandHuman + left hand: + part: LeftHandHuman + thorax: + part: ThoraxSpider + connections: + - left foreleg + - left second leg + - left third leg + - left hind leg + - right foreleg + - right second leg + - right third leg + - right hind leg + left foreleg: + part: LeftLegSpider + left second leg: + part: LeftLegSpider + left third leg: + part: LeftLegSpider + left hind leg: + part: LeftLegSpider + right foreleg: + part: RightLegSpider + right second leg: + part: RightLegSpider + right third leg: + part: RightLegSpider + right hind leg: + part: RightLegSpider diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Body/Prototypes/vampiricanimal.yml b/Resources/Prototypes/Nyanotrasen/Entities/Body/Prototypes/vampiricanimal.yml new file mode 100644 index 00000000000..3f4cdb06de1 --- /dev/null +++ b/Resources/Prototypes/Nyanotrasen/Entities/Body/Prototypes/vampiricanimal.yml @@ -0,0 +1,43 @@ +- type: body + id: VampiricAnimal + name: "vampiric animal" + root: torso + slots: + torso: + part: TorsoAnimal + connections: + - legs + organs: + lungs: OrganAnimalLungs + stomach: OrganVampiricStomach + liver: OrganAnimalLiver + heart: OrganAnimalHeart + kidneys: OrganAnimalKidneys + legs: + part: LegsAnimal + connections: + - feet + feet: + part: FeetAnimal + +- type: body + id: VampiricAnimalLarge + name: "large vampiric animal" + root: torso + slots: + torso: + part: TorsoAnimal + connections: + - legs + organs: + lungs: OrganAnimalLungs + stomach: OrganVampiricHumanoidStomach + liver: OrganAnimalLiver + heart: OrganAnimalHeart + kidneys: OrganAnimalKidneys + legs: + part: LegsAnimal + connections: + - feet + feet: + part: FeetAnimal diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Clothing/Belt/belts.yml b/Resources/Prototypes/Nyanotrasen/Entities/Clothing/Belt/belts.yml index 4f2ac846efa..8847f8d03a9 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Clothing/Belt/belts.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Clothing/Belt/belts.yml @@ -1,7 +1,7 @@ - type: entity parent: ClothingBeltStorageBase id: ClothingBeltMantis - name: psionic mantis' belt # DeltaV - Rename Forensic Mantis to Psionic Mantis + name: mantis' belt description: Perfect for storing all of your equipment. components: - type: Sprite diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Clothing/Head/hats.yml b/Resources/Prototypes/Nyanotrasen/Entities/Clothing/Head/hats.yml index 2cd9785d989..deaca17558a 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Clothing/Head/hats.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Clothing/Head/hats.yml @@ -124,7 +124,7 @@ - type: entity parent: ClothingHeadBase id: ClothingHeadHatFezMantis - name: psionic mantis' fez # DeltaV - Rename Forensic Mantis to Psionic Mantis + name: mantis' fez description: A fine red fez with a gold tassel. components: - type: Sprite diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Clothing/OuterClothing/coats.yml b/Resources/Prototypes/Nyanotrasen/Entities/Clothing/OuterClothing/coats.yml index a16f6cd2212..75f8c7ddd01 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Clothing/OuterClothing/coats.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Clothing/OuterClothing/coats.yml @@ -1,7 +1,7 @@ - type: entity parent: ClothingOuterStorageBase id: ClothingOuterCoatMantis - name: psionic mantis' jacket # DeltaV - Rename Forensic Mantis to Psionic Mantis + name: mantis' jacket description: Modeled after an ancient infantry uniform, this jacket may guard you against the unknown in your journey for the truth. components: - type: Sprite diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Clothing/OuterClothing/wintercoats.yml b/Resources/Prototypes/Nyanotrasen/Entities/Clothing/OuterClothing/wintercoats.yml index b83cd75fc11..748ae0e9a4d 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Clothing/OuterClothing/wintercoats.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Clothing/OuterClothing/wintercoats.yml @@ -47,7 +47,7 @@ - type: entity parent: ClothingOuterWinterCoat id: ClothingOuterWinterCoatMantis - name: psionic mantis' winter coat # DeltaV - Rename Forensic Mantis to Psionic Mantis + name: mantis' winter coat description: Solve cold cases in style. components: - type: Sprite diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Clothing/Shoes/boots.yml b/Resources/Prototypes/Nyanotrasen/Entities/Clothing/Shoes/boots.yml index 4b1cec27f6c..207abcba801 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Clothing/Shoes/boots.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Clothing/Shoes/boots.yml @@ -1,7 +1,7 @@ - type: entity parent: ClothingShoesBaseButcherable id: ClothingShoesBootsMantis - name: psionic mantis' boots # DeltaV - Rename Forensic Mantis to Psionic Mantis + name: mantis' boots description: Soft, comfortable, and good for rough terrain. components: - type: Sprite diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Clothing/Uniforms/jumpsuits.yml b/Resources/Prototypes/Nyanotrasen/Entities/Clothing/Uniforms/jumpsuits.yml index 11f6d32b5c3..b238ef7b063 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Clothing/Uniforms/jumpsuits.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Clothing/Uniforms/jumpsuits.yml @@ -72,7 +72,7 @@ - type: entity parent: ClothingUniformBase id: ClothingUniformJumpsuitMantis - name: psionic mantis' uniform # DeltaV - Rename Forensic Mantis to Psionic Mantis + name: mantis' uniform description: Modeled after an ancient infantry uniform, this uniform has superior mobility for tense situations. components: - type: Sprite @@ -83,7 +83,7 @@ - type: entity parent: ClothingUniformSkirtBase id: ClothingUniformSkirtMantis - name: psionic mantis' jumpskirt # DeltaV - Rename Forensic Mantis to Psionic Mantis + name: mantis' jumpskirt description: Adapted from an ancient infantry uniform, this jumpskirt has superior mobility for tense situations. components: - type: Sprite diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/ghost_roles.yml b/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/ghost_roles.yml index 2652a89127e..046a324e6f6 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/ghost_roles.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/ghost_roles.yml @@ -51,23 +51,23 @@ - state: prisoner # - type: MidRoundAntagSpawnLocation # When MidRoundAntag? -# - type: entity -# id: SpawnPointGhostVampSpider -# name: ghost role spawn point -# suffix: Vampire spider -# parent: MarkerBase -# noSpawn: true -# components: -# - type: GhostRoleMobSpawner -# prototype: MobGiantSpiderVampireAngry -# - type: GhostRole -# makeSentient: true -# name: ghost-role-information-giant-spider-vampire-name -# description: ghost-role-information-giant-spider-vampire-description -# rules: No antagonist restrictions. Just don't talk in emote; you have telepathic chat. -# - type: Sprite -# sprite: Markers/jobs.rsi -# layers: -# - state: green -# - sprite: Mobs/Animals/bat.rsi -# state: bat +- type: entity + id: SpawnPointGhostVampSpider + name: ghost role spawn point + suffix: Vampire spider + parent: MarkerBase + noSpawn: true + components: + - type: GhostRoleMobSpawner + prototype: MobGiantSpiderVampireAngry + - type: GhostRole + makeSentient: true + name: ghost-role-information-giant-spider-vampire-name + description: ghost-role-information-giant-spider-vampire-description + rules: No antagonist restrictions. Just don't talk in emote; you have telepathic chat. + - type: Sprite + sprite: Markers/jobs.rsi + layers: + - state: green + - sprite: Mobs/Animals/bat.rsi + state: bat diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/jobs.yml b/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/jobs.yml index ebe73808e53..62a24bd75b9 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/jobs.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/jobs.yml @@ -65,7 +65,7 @@ - type: entity id: SpawnPointForensicMantis parent: SpawnPointJobBase - name: psionic mantis # DeltaV - Rename Forensic Mantis to Psionic Mantis + name: mantis components: - type: SpawnPoint job_id: ForensicMantis diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/NPCs/mutants.yml b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/NPCs/mutants.yml index 5daf2e15e56..462b3254f1e 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/NPCs/mutants.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/NPCs/mutants.yml @@ -70,143 +70,130 @@ - type: Produce - type: NoSlip -# - type: entity -# name: oneirophage -# parent: SimpleMobBase -# id: MobGiantSpiderVampire -# description: The 'dream-eater' spider, rumored to be one of the potential genetic sources for arachne. -# components: -# - type: Sprite -# drawdepth: Mobs -# layers: -# - map: ["enum.DamageStateVisualLayers.Base"] -# state: viper -# sprite: Mobs/Animals/spider.rsi -# - type: Physics -# - type: Fixtures -# fixtures: -# fix1: -# shape: -# !type:PhysShapeCircle -# radius: 0.35 -# density: 130 -# mask: -# - SmallMobMask -# layer: -# - SmallMobLayer -# - type: Appearance -# - type: DamageStateVisuals -# states: -# Alive: -# Base: viper -# Critical: -# Base: viper_dead -# Dead: -# Base: viper_dead -# - type: Butcherable -# spawned: -# - id: FoodMeatSpider -# amount: 2 -# - type: CombatMode -# - type: ReplacementAccent -# accent: xeno -# - type: InteractionPopup -# successChance: 0.5 -# interactSuccessString: petting-success-tarantula -# interactFailureString: petting-failure-generic -# - type: Puller -# needsHands: false -# - type: Arachne -# cocoonDelay: 8 -# - type: SolutionContainerManager -# solutions: -# melee: -# reagents: -# - ReagentId: Nocturine -# Quantity: 20 -# - type: MeleeChemicalInjector -# solution: melee -# transferAmount: 3.5 -# - type: SolutionRegeneration -# solution: melee -# generated: -# reagents: -# - ReagentId: Nocturine -# Quantity: 0.15 -# - type: BloodSucker -# unitsToSucc: 35 -# injectWhenSucc: true -# injectReagent: Cryptobiolin -# unitsToInject: 10 -# webRequired: true -# - type: Bloodstream -# bloodReagent: DemonsBlood -# - type: Body -# prototype: VampiricAnimalLarge -# - type: PotentialPsionic -# - type: Psionic -# removable: false -# - type: MetapsionicPower -# - type: MeleeWeapon -# hidden: true -# angle: 0 -# animation: WeaponArcBite -# damage: -# types: -# Piercing: 8 -# - type: AntiPsionicWeapon -# punish: false -# modifiers: -# coefficients: -# Piercing: 2.25 -# - type: Damageable -# damageContainer: HalfSpirit -# damageModifierSet: HalfSpirit -# - type: StatusEffects -# allowed: -# - Stun -# - KnockedDown -# - SlowedDown -# - Stutter -# - SeeingRainbows -# - Electrocution -# - Drunk -# - SlurredSpeech -# - PressureImmunity -# - Muted -# - ForcedSleep -# - TemporaryBlindness -# - Pacified -# - PsionicsDisabled -# - PsionicallyInsulated -# - type: Tag -# tags: -# - Oneirophage -# - type: MovementAlwaysTouching -# - type: PsionicInvisibleContacts -# whitelist: -# tags: -# - ArachneWeb +- type: entity + name: oneirophage + parent: MobGiantSpider + id: MobGiantSpiderVampire + description: The 'dream-eater' spider, rumored to be one of the potential genetic sources for arachne. + components: + - type: Sprite + drawdepth: Mobs + layers: + - map: ["enum.DamageStateVisualLayers.Base", "movement"] + state: viper + sprite: Mobs/Animals/spider.rsi + - type: SpriteMovement + movementLayers: + movement: + state: viper-moving + noMovementLayers: + movement: + state: viper + - type: Appearance + - type: DamageStateVisuals + states: + Alive: + Base: viper + Critical: + Base: viper_dead + Dead: + Base: viper_dead + - type: ReplacementAccent + accent: xeno + - type: InteractionPopup + successChance: 0.5 + interactSuccessString: petting-success-tarantula + interactFailureString: petting-failure-generic + interactSuccessSpawn: EffectHearts + interactSuccessSound: + path: /Audio/Animals/snake_hiss.ogg + - type: Puller + needsHands: false + - type: Arachne + cocoonDelay: 8 + - type: SolutionContainerManager + solutions: + melee: + reagents: + - ReagentId: Nocturine + Quantity: 20 + - type: MeleeChemicalInjector + solution: melee + transferAmount: 3.5 + - type: SolutionRegeneration + solution: melee + generated: + reagents: + - ReagentId: Nocturine + Quantity: 0.15 + - type: BloodSucker + unitsToSucc: 35 + injectWhenSucc: true + injectReagent: Cryptobiolin + unitsToInject: 10 + webRequired: true + - type: Bloodstream + bloodReagent: DemonsBlood + - type: Body + prototype: VampiricAnimalLarge + - type: PotentialPsionic + - type: Psionic + removable: false + - type: MetapsionicPower + - type: AntiPsionicWeapon + punish: false + modifiers: + coefficients: + Piercing: 2.25 + - type: Damageable + damageContainer: HalfSpirit + damageModifierSet: HalfSpirit + - type: StatusEffects + allowed: + - Stun + - KnockedDown + - SlowedDown + - Stutter + - SeeingRainbows + - Electrocution + - Drunk + - SlurredSpeech + - PressureImmunity + - Muted + - ForcedSleep + - TemporaryBlindness + - Pacified + - PsionicsDisabled + - PsionicallyInsulated + - type: Tag + tags: + - Oneirophage + - type: MovementAlwaysTouching + - type: PsionicInvisibleContacts + whitelist: + tags: + - ArachneWeb -# - type: entity -# name: oneirophage -# parent: MobGiantSpiderVampire -# id: MobGiantSpiderVampireAngry -# suffix: Angry -# components: -# - type: NpcFactionMember -# factions: -# - SimpleHostile -# - type: InputMover -# - type: MobMover -# - type: HTN -# rootTask: SimpleHostileCompound -# - type: GhostRole -# makeSentient: true -# name: ghost-role-information-giant-spider-vampire-name -# description: ghost-role-information-giant-spider-vampire-description -# rules: No antagonist restrictions. Just don't talk in emote; you have telepathic chat. -# - type: GhostTakeoverAvailable +- type: entity + name: oneirophage + parent: MobGiantSpiderVampire + id: MobGiantSpiderVampireAngry + suffix: Angry + components: + - type: NpcFactionMember + factions: + - SimpleHostile + - type: InputMover + - type: MobMover + - type: HTN + rootTask: + task: SimpleHostileCompound + - type: GhostRole + makeSentient: true + name: ghost-role-information-giant-spider-vampire-name + description: ghost-role-information-giant-spider-vampire-description + rules: No antagonist restrictions. Just don't talk in emote; you have telepathic chat. + - type: GhostTakeoverAvailable - type: entity parent: SimpleMobBase diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Devices/Misc/identification_cards.yml b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Devices/Misc/identification_cards.yml index 94efc40530c..4338b836854 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Devices/Misc/identification_cards.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Devices/Misc/identification_cards.yml @@ -82,7 +82,7 @@ - type: entity parent: IDCardStandard id: ForensicMantisIDCard - name: psionic mantis ID card # DeltaV - Rename Forensic Mantis to Psionic Mantis + name: mantis ID card components: - type: Sprite layers: diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Devices/pda.yml b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Devices/pda.yml index 4e6115ba339..d898124b771 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Devices/pda.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Devices/pda.yml @@ -99,7 +99,7 @@ - type: entity parent: BasePDA id: ForensicMantisPDA - name: psionic mantis PDA # DeltaV - Rename Forensic Mantis to Psionic Mantis + name: mantis PDA description: Smells like illegal substances. components: - type: Pda diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Materials/materials.yml b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Materials/materials.yml index 75bb4727da2..5aed17363ba 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Materials/materials.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Materials/materials.yml @@ -1,47 +1,3 @@ -- type: entity - parent: MaterialBase - id: MaterialBluespace - suffix: Full - name: bluespace crystal - components: - - type: Sprite - sprite: Nyanotrasen/Objects/Materials/materials.rsi - layers: - - state: bluespace_3 - map: ["base"] - - type: Appearance - - type: Material - - type: PhysicalComposition - materialComposition: - Bluespace: 100 - - type: Tag - tags: - - BluespaceCrystal - - RawMaterial - - type: Stack - stackType: Bluespace - baseLayer: base - layerStates: - - bluespace - - bluespace_2 - - bluespace_3 - count: 5 - - type: Item - size: Small - -- type: entity - parent: MaterialBluespace - id: MaterialBluespace1 - suffix: 1 - components: - - type: Sprite - state: bluespace - - type: Stack - stackType: Bluespace - count: 1 - - type: Item - size: Tiny - - type: entity parent: BaseItem id: HideMothroach diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Misc/paper.yml b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Misc/paper.yml index 22361c9aef6..b381aaa0c7e 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Misc/paper.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Misc/paper.yml @@ -1,5 +1,5 @@ - type: entity - name: psionic mantis' seal # DeltaV - Rename Forensic Mantis to Psionic Mantis + name: mantis' seal parent: RubberStampBase id: RubberStampMantis suffix: DO NOT MAP diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Structures/Research/glimmer_prober.yml b/Resources/Prototypes/Nyanotrasen/Entities/Structures/Research/glimmer_prober.yml index e157f8b7ff4..102000f8b26 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Structures/Research/glimmer_prober.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Structures/Research/glimmer_prober.yml @@ -67,22 +67,22 @@ - type: AmbientSound range: 6 volume: -6 - sound: /Audio/Nyanotrasen/Ambience/Objects/prober_hum_low.ogg + sound: /Audio/Ambience/Objects/prober_hum_low.ogg - type: AmbientOnPowered - type: GlimmerSound glimmerTier: Minimal: - path: /Audio/Nyanotrasen/Ambience/Objects/prober_hum_low.ogg + path: /Audio/Ambience/Objects/prober_hum_low.ogg Low: - path: /Audio/Nyanotrasen/Ambience/Objects/prober_hum_low.ogg + path: /Audio/Ambience/Objects/prober_hum_low.ogg Moderate: - path: /Audio/Nyanotrasen/Ambience/Objects/prober_hum_moderate.ogg + path: /Audio/Ambience/Objects/prober_hum_moderate.ogg High: - path: /Audio/Nyanotrasen/Ambience/Objects/prober_hum_high.ogg + path: /Audio/Ambience/Objects/prober_hum_high.ogg Dangerous: - path: /Audio/Nyanotrasen/Ambience/Objects/prober_hum_dangerous.ogg + path: /Audio/Ambience/Objects/prober_hum_dangerous.ogg Critical: - path: /Audio/Nyanotrasen/Ambience/Objects/prober_hum_dangerous.ogg + path: /Audio/Ambience/Objects/prober_hum_dangerous.ogg - type: entity parent: BaseMachinePowered diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Structures/Storage/Closets/Lockers/lockers.yml b/Resources/Prototypes/Nyanotrasen/Entities/Structures/Storage/Closets/Lockers/lockers.yml index 2744f965e07..fe25a9cc53c 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Structures/Storage/Closets/Lockers/lockers.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Structures/Storage/Closets/Lockers/lockers.yml @@ -2,7 +2,7 @@ id: LockerForensicMantis parent: LockerDetective suffix: Empty - name: psionic mantis' cabinet # DeltaV - Rename Forensic Mantis to Psionic Mantis + name: mantis' cabinet description: You'll never know what's inside until you collapse the quantum superposition of all possible mysteries. components: # Because it holds a traitor objective, StrongMetallic, diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Structures/Webbing/webs.yml b/Resources/Prototypes/Nyanotrasen/Entities/Structures/Webbing/webs.yml new file mode 100644 index 00000000000..e483ea5da71 --- /dev/null +++ b/Resources/Prototypes/Nyanotrasen/Entities/Structures/Webbing/webs.yml @@ -0,0 +1,93 @@ +- type: entity + id: CocoonedHumanoid + name: cocooned humanoid + description: Unlucky. + placement: + mode: SnapgridCenter + snap: + - Wall + components: + - type: Sprite + layers: + - sprite: Nyanotrasen/Structures/cocoon.rsi + state: cocoon_large1 + map: [ "enum.DamageStateVisualLayers.Base" ] + - type: RandomSprite + available: + - enum.DamageStateVisualLayers.Base: + cocoon_large1: "" + - enum.DamageStateVisualLayers.Base: #your guess for why randomsprite requires an arbitrary layer is as good as mine friend + cocoon_large2: "" + - enum.DamageStateVisualLayers.Base: + cocoon_large3: "" + - type: Cocoon + - type: Clickable + - type: InteractionOutline + - type: Transform + noRot: true + - type: Damageable + damageModifierSet: Web + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 40 + behaviors: + - !type:DoActsBehavior + acts: [ "Destruction" ] + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeAabb + bounds: "-0.25,-0.4,0.25,0.1" + density: 20 + mask: + - SmallMobMask + layer: + - SmallMobLayer + - type: Physics + bodyType: Dynamic + - type: Pullable + - type: AntiRottingContainer + - type: ItemSlots + slots: + body_slot: + name: Body + locked: true + ejectOnBreak: true + - type: Butcherable + butcheringType: Knife + butcherDelay: 12 + spawned: + - id: MaterialCloth1 + amount: 1 + prob: 0.5 #This doesn't cost hunger so should at least make it not worth it time-wise + - type: Appearance + - type: ContainerContainer + containers: + body_slot: !type:ContainerSlot + +- type: entity + id: CocoonSmall + parent: CocoonedHumanoid + name: cocoon + description: What could be inside...? + placement: + mode: SnapgridCenter + snap: + - Wall + components: + - type: Sprite + layers: + - sprite: Nyanotrasen/Structures/cocoon.rsi + state: cocoon1 + map: [ "enum.DamageStateVisualLayers.Base" ] + - type: RandomSprite + available: + - enum.DamageStateVisualLayers.Base: + cocoon1: "" + - enum.DamageStateVisualLayers.Base: #your guess for why randomsprite requires an arbitrary layer is as good as mine friend + cocoon2: "" + - enum.DamageStateVisualLayers.Base: + cocoon3: "" diff --git a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml index c3e682e02a9..e2f99548429 100644 --- a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml +++ b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml @@ -4,11 +4,11 @@ description: job-description-mantis playTimeTracker: JobForensicMantis requirements: - - !type:OverallPlaytimeRequirement - time: 18000 + - !type:CharacterOverallTimeRequirement + min: 18000 - !type:DepartmentTimeRequirement department: Epistemics # DeltaV - Epistemics Department replacing Science - time: 3600 + min: 3600 startingGear: ForensicMantisGear icon: "JobIconForensicMantis" supervisors: job-supervisors-rd @@ -18,7 +18,7 @@ access: - Research - Maintenance - - Mantis # DeltaV - Psionic Mantis, see Resources/Prototypes/DeltaV/Access/epistemics.yml + - Mantis # DeltaV - Mantis, see Resources/Prototypes/DeltaV/Access/epistemics.yml special: - !type:AddComponentSpecial components: diff --git a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Security/prisonguard.yml b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Security/prisonguard.yml index 55d86d343dc..fec6ac685ed 100644 --- a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Security/prisonguard.yml +++ b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Security/prisonguard.yml @@ -4,11 +4,11 @@ description: job-description-guard playTimeTracker: JobPrisonGuard requirements: - - !type:OverallPlaytimeRequirement - time: 18000 + - !type:CharacterOverallTimeRequirement + min: 18000 - !type:DepartmentTimeRequirement department: Security - time: 14400 + min: 14400 startingGear: PrisonGuardGear alwaysUseSpawner: true canBeAntag: false @@ -30,7 +30,7 @@ equipment: jumpsuit: ClothingUniformJumpsuitPrisonGuard back: ClothingBackpackSecurityFilled - shoes: ClothingShoesBootsJack + shoes: ClothingShoesBootsCombatFilled eyes: ClothingEyesGlassesSecurity head: ClothingHeadPrisonGuard id: PrisonGuardPDA diff --git a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/gladiator.yml b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/gladiator.yml index 498477eb229..3651d223d77 100644 --- a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/gladiator.yml +++ b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/gladiator.yml @@ -13,7 +13,7 @@ requirements: - !type:DepartmentTimeRequirement department: Security - time: 21600 + min: 21600 special: - !type:AddComponentSpecial components: diff --git a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/martialartist.yml b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/martialartist.yml index 14c277ff7e5..8c3c80c72fd 100644 --- a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/martialartist.yml +++ b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/martialartist.yml @@ -4,8 +4,8 @@ description: job-description-martialartist playTimeTracker: JobMartialArtist requirements: - - !type:OverallPlaytimeRequirement - time: 7200 #2 hours + - !type:CharacterOverallTimeRequirement + min: 7200 #2 hours startingGear: MartialArtistGear icon: "JobIconMartialArtist" supervisors: job-supervisors-hop diff --git a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/prisoner.yml b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/prisoner.yml index 9df4832a584..00ffdde666f 100644 --- a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/prisoner.yml +++ b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/prisoner.yml @@ -12,7 +12,7 @@ requirements: - !type:DepartmentTimeRequirement department: Security - time: 21600 + min: 21600 - type: startingGear id: PrisonerGear diff --git a/Resources/Prototypes/Nyanotrasen/Species/Oni.yml b/Resources/Prototypes/Nyanotrasen/Species/Oni.yml index ee8be0e5892..a6a63b29526 100644 --- a/Resources/Prototypes/Nyanotrasen/Species/Oni.yml +++ b/Resources/Prototypes/Nyanotrasen/Species/Oni.yml @@ -35,8 +35,8 @@ points: 1 required: false Legs: - points: 2 + points: 6 required: false Arms: - points: 2 + points: 6 required: false diff --git a/Resources/Prototypes/Nyanotrasen/Species/felinid.yml b/Resources/Prototypes/Nyanotrasen/Species/felinid.yml index 4751d581746..5eb26edd518 100644 --- a/Resources/Prototypes/Nyanotrasen/Species/felinid.yml +++ b/Resources/Prototypes/Nyanotrasen/Species/felinid.yml @@ -35,8 +35,8 @@ points: 1 required: false Legs: - points: 2 + points: 6 required: false Arms: - points: 2 + points: 6 required: false diff --git a/Resources/Prototypes/Objectives/objectiveGroups.yml b/Resources/Prototypes/Objectives/objectiveGroups.yml index f00641702a2..263494f7987 100644 --- a/Resources/Prototypes/Objectives/objectiveGroups.yml +++ b/Resources/Prototypes/Objectives/objectiveGroups.yml @@ -26,6 +26,7 @@ LOLuckyBillStealObjective: 0.5 # DeltaV - LO steal objective, see Resources/Prototypes/DeltaV/Objectives/traitor.yml HoPBookIanDossierStealObjective: 1 # DeltaV - HoP steal objective, see Resources/Prototypes/DeltaV/Objectives/traitor.yml HoSGunStealObjective: 0.5 + StealSupermatterSliverObjective: 0.5 - type: weightedRandom id: TraitorObjectiveGroupKill diff --git a/Resources/Prototypes/Objectives/stealTargetGroups.yml b/Resources/Prototypes/Objectives/stealTargetGroups.yml index 11e503d7940..e93c9c319da 100644 --- a/Resources/Prototypes/Objectives/stealTargetGroups.yml +++ b/Resources/Prototypes/Objectives/stealTargetGroups.yml @@ -1,5 +1,12 @@ # Traitor single items +- type: stealTargetGroup + id: SupermatterSliver + name: supermatter sliver + sprite: + sprite: Supermatter/supermatter_sliver.rsi + state: icon + - type: stealTargetGroup id: Hypospray name: hypospray diff --git a/Resources/Prototypes/Objectives/traitor.yml b/Resources/Prototypes/Objectives/traitor.yml index ffeba32546d..d9c071c30c0 100644 --- a/Resources/Prototypes/Objectives/traitor.yml +++ b/Resources/Prototypes/Objectives/traitor.yml @@ -309,3 +309,15 @@ - type: StealCondition stealGroup: NukeDisk owner: objective-condition-steal-station + +- type: entity + noSpawn: true + parent: BaseTraitorStealObjective + id: StealSupermatterSliverObjective + components: + - type: Objective + difficulty: 3.5 + - type: StealCondition + stealGroup: SupermatterSliver + objectiveNoOwnerText: objective-condition-steal-smsliver-title + descriptionText: objective-condition-steal-smsliver-description \ No newline at end of file diff --git a/Resources/Prototypes/Palettes/departmental.yml b/Resources/Prototypes/Palettes/departmental.yml index c5e893397a3..ab8ac25a4ad 100644 --- a/Resources/Prototypes/Palettes/departmental.yml +++ b/Resources/Prototypes/Palettes/departmental.yml @@ -1,4 +1,4 @@ -- type: palette +- type: palette id: Departmental name: Departmental colors: @@ -10,6 +10,7 @@ bar: "#79150096" epistemics: "#D381C996" # DeltaV - Epistemics Department replacing Science logistics: "#A4610696" # DeltaV - Logistics Department replacing Cargo + justice: "#6b2833DD" #DeltaV - Added Justice Department janitor: "#8c347f96" chemistry: "#fa750096" virology: "#43990996" diff --git a/Resources/Prototypes/Reagents/biological.yml b/Resources/Prototypes/Reagents/biological.yml index 0c53ae10fd1..5c0cef314ca 100644 --- a/Resources/Prototypes/Reagents/biological.yml +++ b/Resources/Prototypes/Reagents/biological.yml @@ -23,6 +23,29 @@ - !type:OrganType type: Human shouldHave: false + - !type:SatiateHunger + factor: 0.5 + conditions: + - !type:OrganType + type: Vampiric + - !type:AdjustReagent + conditions: + - !type:OrganType + type: Vampiric + reagent: Water + amount: 0.15 + - !type:AdjustReagent + conditions: + - !type:OrganType + type: Vampiric + reagent: Protein + amount: 0.15 + - !type:AdjustReagent + conditions: + - !type:OrganType + type: Vampiric + reagent: Omnizine + amount: 0.2 Food: effects: - !type:AdjustReagent diff --git a/Resources/Prototypes/Nyanotrasen/Reagents/psionic.yml b/Resources/Prototypes/Reagents/psionic.yml similarity index 100% rename from Resources/Prototypes/Nyanotrasen/Reagents/psionic.yml rename to Resources/Prototypes/Reagents/psionic.yml diff --git a/Resources/Prototypes/Recipes/Cooking/medical_recipes.yml b/Resources/Prototypes/Recipes/Cooking/medical_recipes.yml index 9d1947f03eb..03ca5203582 100644 --- a/Resources/Prototypes/Recipes/Cooking/medical_recipes.yml +++ b/Resources/Prototypes/Recipes/Cooking/medical_recipes.yml @@ -2,7 +2,7 @@ id: RecipeAloeCream name: aloe cream recipe result: AloeCream - time: 10 + time: 15 solids: FoodAloe: 1 diff --git a/Resources/Prototypes/Recipes/Lathes/robotics.yml b/Resources/Prototypes/Recipes/Lathes/robotics.yml index f42e2851c78..bf6f479703e 100644 --- a/Resources/Prototypes/Recipes/Lathes/robotics.yml +++ b/Resources/Prototypes/Recipes/Lathes/robotics.yml @@ -612,3 +612,27 @@ Steel: 250 Glass: 250 Plastic: 250 + +- type: latheRecipe + id: BorgModulePka + result: BorgModulePka + category: Robotics + completetime: 3 + materials: + Steel: 1000 + Glass: 500 + Plastic: 500 + Silver: 100 + +- type: latheRecipe + id: BorgModuleJetpack + result: BorgModuleJetpack + category: Robotics + completetime: 3 + materials: + Steel: 250 + Glass: 250 + Plastic: 250 + Gold: 100 + Plasma: 1000 + diff --git a/Resources/Prototypes/Recipes/Lathes/security.yml b/Resources/Prototypes/Recipes/Lathes/security.yml index ffa74d460f9..08e11e4ff82 100644 --- a/Resources/Prototypes/Recipes/Lathes/security.yml +++ b/Resources/Prototypes/Recipes/Lathes/security.yml @@ -30,6 +30,15 @@ Steel: 300 Plastic: 300 +- type: latheRecipe + id: CombatKnife + result: CombatKnife + category: Weapons + completetime: 2 + materials: + Steel: 250 + Plastic: 100 + - type: latheRecipe id: WeaponLaserCarbine result: WeaponLaserCarbine diff --git a/Resources/Prototypes/Research/industrial.yml b/Resources/Prototypes/Research/industrial.yml index edcc9c66364..33377f52520 100644 --- a/Resources/Prototypes/Research/industrial.yml +++ b/Resources/Prototypes/Research/industrial.yml @@ -179,6 +179,19 @@ - BorgModuleAdvancedTool - BorgModuleRCD +- type: technology + id: MechanizedSalvaging + name: research-technology-mechanized-salvaging + icon: + sprite: Mobs/Silicon/chassis.rsi + state: miner + discipline: Industrial + tier: 2 + cost: 10000 + recipeUnlocks: + - BorgModulePka + - BorgModuleJetpack + # Tier 3 - type: technology diff --git a/Resources/Prototypes/Roles/Antags/ninja.yml b/Resources/Prototypes/Roles/Antags/ninja.yml index 23027805a1c..fd8a79ad254 100644 --- a/Resources/Prototypes/Roles/Antags/ninja.yml +++ b/Resources/Prototypes/Roles/Antags/ninja.yml @@ -5,5 +5,5 @@ setPreference: false objective: roles-antag-space-ninja-objective requirements: - - !type:OverallPlaytimeRequirement # DeltaV - Playtime requirement - time: 259200 # DeltaV - 72 hours + - !type:CharacterOverallTimeRequirement # DeltaV - Playtime requirement + min: 259200 # DeltaV - 72 hours diff --git a/Resources/Prototypes/Roles/Antags/nukeops.yml b/Resources/Prototypes/Roles/Antags/nukeops.yml index 7375c02639c..fe05393b9ca 100644 --- a/Resources/Prototypes/Roles/Antags/nukeops.yml +++ b/Resources/Prototypes/Roles/Antags/nukeops.yml @@ -5,11 +5,11 @@ setPreference: true objective: roles-antag-nuclear-operative-objective requirements: - - !type:OverallPlaytimeRequirement - time: 108000 # DeltaV - 30 hours - - !type:DepartmentTimeRequirement # DeltaV - Security dept time requirement + - !type:CharacterOverallTimeRequirement + min: 108000 # DeltaV - 30 hours + - !type:CharacterDepartmentTimeRequirement # DeltaV - Security dept time requirement department: Security - time: 36000 # DeltaV - 10 hours + min: 36000 # DeltaV - 10 hours - type: antag id: NukeopsMedic @@ -18,11 +18,11 @@ setPreference: true objective: roles-antag-nuclear-operative-agent-objective requirements: - - !type:OverallPlaytimeRequirement - time: 108000 # DeltaV - 30 hours - - !type:DepartmentTimeRequirement # DeltaV - Medical dept time requirement + - !type:CharacterOverallTimeRequirement + min: 108000 # DeltaV - 30 hours + - !type:CharacterDepartmentTimeRequirement # DeltaV - Medical dept time requirement department: Medical - time: 36000 # DeltaV - 10 hours + min: 36000 # DeltaV - 10 hours - type: antag id: NukeopsCommander @@ -31,12 +31,12 @@ setPreference: true objective: roles-antag-nuclear-operative-commander-objective requirements: - - !type:OverallPlaytimeRequirement - time: 216000 # DeltaV - 60 hours - - !type:DepartmentTimeRequirement # DeltaV - Security dept time requirement + - !type:CharacterOverallTimeRequirement + min: 216000 # DeltaV - 60 hours + - !type:CharacterDepartmentTimeRequirement # DeltaV - Security dept time requirement department: Security - time: 36000 # DeltaV - 10 hours - - !type:DepartmentTimeRequirement # DeltaV - Command dept time requirement + min: 36000 # DeltaV - 10 hours + - !type:CharacterDepartmentTimeRequirement # DeltaV - Command dept time requirement department: Command - time: 36000 # DeltaV - 10 hours + min: 36000 # DeltaV - 10 hours - !type:WhitelistRequirement # DeltaV - Whitelist requirement diff --git a/Resources/Prototypes/Roles/Antags/revolutionary.yml b/Resources/Prototypes/Roles/Antags/revolutionary.yml index 6f22bd1d58a..cc551fc4679 100644 --- a/Resources/Prototypes/Roles/Antags/revolutionary.yml +++ b/Resources/Prototypes/Roles/Antags/revolutionary.yml @@ -5,11 +5,11 @@ setPreference: true objective: roles-antag-rev-head-objective requirements: - - !type:OverallPlaytimeRequirement # DeltaV - Playtime requirement - time: 172800 # DeltaV - 48 hours - - !type:DepartmentTimeRequirement # DeltaV - Command dept time requirement + - !type:CharacterOverallTimeRequirement # DeltaV - Playtime requirement + min: 172800 # DeltaV - 48 hours + - !type:CharacterDepartmentTimeRequirement # DeltaV - Command dept time requirement department: Command - time: 36000 # DeltaV - 10 hours + min: 36000 # DeltaV - 10 hours - type: antag id: Rev diff --git a/Resources/Prototypes/Roles/Antags/traitor.yml b/Resources/Prototypes/Roles/Antags/traitor.yml index 98fdb0ee47d..fec2280ddc8 100644 --- a/Resources/Prototypes/Roles/Antags/traitor.yml +++ b/Resources/Prototypes/Roles/Antags/traitor.yml @@ -5,5 +5,5 @@ setPreference: true objective: roles-antag-syndicate-agent-objective requirements: - - !type:OverallPlaytimeRequirement # DeltaV - Playtime requirement - time: 86400 # DeltaV - 24 hours + - !type:CharacterOverallTimeRequirement # DeltaV - Playtime requirement + min: 86400 # DeltaV - 24 hours diff --git a/Resources/Prototypes/Roles/Antags/zombie.yml b/Resources/Prototypes/Roles/Antags/zombie.yml index 6ff0f17edc7..5ec90f68162 100644 --- a/Resources/Prototypes/Roles/Antags/zombie.yml +++ b/Resources/Prototypes/Roles/Antags/zombie.yml @@ -5,8 +5,8 @@ setPreference: true objective: roles-antag-initial-infected-objective requirements: - - !type:OverallPlaytimeRequirement # DeltaV - Playtime requirement - time: 43200 # DeltaV - 12 hours + - !type:CharacterOverallTimeRequirement # DeltaV - Playtime requirement + min: 43200 # DeltaV - 12 hours - type: antag id: Zombie diff --git a/Resources/Prototypes/Roles/Jobs/Cargo/quartermaster.yml b/Resources/Prototypes/Roles/Jobs/Cargo/quartermaster.yml index b7e8744c6ad..ee1a101154a 100644 --- a/Resources/Prototypes/Roles/Jobs/Cargo/quartermaster.yml +++ b/Resources/Prototypes/Roles/Jobs/Cargo/quartermaster.yml @@ -8,17 +8,17 @@ # - !type:RoleTimeRequirement #DeltaV # role: JobCargoTechnician # time: 21600 #6 hrs - - !type:RoleTimeRequirement - role: JobSalvageSpecialist - time: 10800 #3 hrs - - !type:RoleTimeRequirement # DeltaV - Courier role time requirement - role: JobMailCarrier - time: 7200 # 2 hours - - !type:DepartmentTimeRequirement + - !type:CharacterPlaytimeRequirement + tracker: JobSalvageSpecialist + min: 10800 #3 hrs + - !type:CharacterPlaytimeRequirement # DeltaV - Courier role time requirement + tracker: JobMailCarrier + min: 7200 # 2 hours + - !type:CharacterDepartmentTimeRequirement department: Logistics # DeltaV - Logistics Department replacing Cargo - time: 43200 #DeltaV 12 hours - - !type:OverallPlaytimeRequirement - time: 144000 #40 hrs + min: 43200 #DeltaV 12 hours + - !type:CharacterOverallTimeRequirement + min: 144000 #40 hrs weight: 10 startingGear: QuartermasterGear icon: "JobIconQuarterMaster" diff --git a/Resources/Prototypes/Roles/Jobs/Cargo/salvage_specialist.yml b/Resources/Prototypes/Roles/Jobs/Cargo/salvage_specialist.yml index f2f7c016412..8b806009ef8 100644 --- a/Resources/Prototypes/Roles/Jobs/Cargo/salvage_specialist.yml +++ b/Resources/Prototypes/Roles/Jobs/Cargo/salvage_specialist.yml @@ -5,9 +5,9 @@ playTimeTracker: JobSalvageSpecialist antagAdvantage: 3 # DeltaV - Reduced TC: External Access + Free hardsuit and weapons requirements: - - !type:DepartmentTimeRequirement + - !type:CharacterDepartmentTimeRequirement department: Logistics # DeltaV - Logistics Department replacing Cargo - time: 21600 #DeltaV 6 hrs + min: 21600 #DeltaV 6 hrs # - !type:OverallPlaytimeRequirement #DeltaV # time: 36000 #10 hrs icon: "JobIconShaftMiner" diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/bartender.yml b/Resources/Prototypes/Roles/Jobs/Civilian/bartender.yml index 8f6f9fc7de2..85a86dabce3 100644 --- a/Resources/Prototypes/Roles/Jobs/Civilian/bartender.yml +++ b/Resources/Prototypes/Roles/Jobs/Civilian/bartender.yml @@ -4,9 +4,9 @@ description: job-description-bartender playTimeTracker: JobBartender requirements: - - !type:DepartmentTimeRequirement + - !type:CharacterDepartmentTimeRequirement department: Civilian - time: 3600 #DeltaV + min: 3600 #DeltaV startingGear: BartenderGear icon: "JobIconBartender" supervisors: job-supervisors-hop diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/chaplain.yml b/Resources/Prototypes/Roles/Jobs/Civilian/chaplain.yml index 7f16cf16447..9b4f5ea1487 100644 --- a/Resources/Prototypes/Roles/Jobs/Civilian/chaplain.yml +++ b/Resources/Prototypes/Roles/Jobs/Civilian/chaplain.yml @@ -4,9 +4,9 @@ description: job-description-chaplain playTimeTracker: JobChaplain requirements: - - !type:DepartmentTimeRequirement + - !type:CharacterDepartmentTimeRequirement department: Epistemics # DeltaV - Epistemics Department replacing Science - time: 14400 #DeltaV 4 hours + min: 14400 #DeltaV 4 hours startingGear: ChaplainGear icon: "JobIconChaplain" supervisors: job-supervisors-rd diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/chef.yml b/Resources/Prototypes/Roles/Jobs/Civilian/chef.yml index 6ae2310474d..0837f1f3907 100644 --- a/Resources/Prototypes/Roles/Jobs/Civilian/chef.yml +++ b/Resources/Prototypes/Roles/Jobs/Civilian/chef.yml @@ -4,9 +4,9 @@ description: job-description-chef playTimeTracker: JobChef requirements: - - !type:DepartmentTimeRequirement + - !type:CharacterDepartmentTimeRequirement department: Civilian - time: 3600 #DeltaV 1 hour + min: 3600 #DeltaV 1 hour startingGear: ChefGear icon: "JobIconChef" supervisors: job-supervisors-hop @@ -17,10 +17,10 @@ extendedAccess: - Hydroponics - Bar #Nyano - Summary: After this line, Professional Che is a component to be added. Very important. - special: + special: - !type:AddComponentSpecial components: - - type: ProfessionalChef #Nyano - End Summary. + - type: ProfessionalChef #Nyano - End Summary. - type: startingGear id: ChefGear diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/clown.yml b/Resources/Prototypes/Roles/Jobs/Civilian/clown.yml index 43e07d0637c..141f4d39b76 100644 --- a/Resources/Prototypes/Roles/Jobs/Civilian/clown.yml +++ b/Resources/Prototypes/Roles/Jobs/Civilian/clown.yml @@ -4,8 +4,8 @@ description: job-description-clown playTimeTracker: JobClown requirements: - - !type:OverallPlaytimeRequirement # DeltaV - Playtime requirement - time: 7200 #2 hrs + - !type:CharacterOverallTimeRequirement # DeltaV - Playtime requirement + min: 7200 #2 hrs startingGear: ClownGear icon: "JobIconClown" supervisors: job-supervisors-hop diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/lawyer.yml b/Resources/Prototypes/Roles/Jobs/Civilian/lawyer.yml index b67275c9930..67afdf8aff9 100644 --- a/Resources/Prototypes/Roles/Jobs/Civilian/lawyer.yml +++ b/Resources/Prototypes/Roles/Jobs/Civilian/lawyer.yml @@ -5,14 +5,14 @@ playTimeTracker: JobLawyer antagAdvantage: 2 # DeltaV - Reduced TC: Security Radio and Access requirements: - - !type:OverallPlaytimeRequirement - time: 36000 # 10 hrs - - !type:DepartmentTimeRequirement # DeltaV - Security dept time requirement + - !type:CharacterOverallTimeRequirement + min: 36000 # 10 hrs + - !type:CharacterDepartmentTimeRequirement # DeltaV - Security dept time requirement department: Security - time: 14400 # 4 hours + min: 14400 # 4 hours startingGear: LawyerGear icon: "JobIconLawyer" - supervisors: job-supervisors-hop + supervisors: job-supervisors-cj # Delta V - Change supervisor to chief justice access: - Service - Lawyer diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/librarian.yml b/Resources/Prototypes/Roles/Jobs/Civilian/librarian.yml index 536c8635d1b..7f138c6d7d1 100644 --- a/Resources/Prototypes/Roles/Jobs/Civilian/librarian.yml +++ b/Resources/Prototypes/Roles/Jobs/Civilian/librarian.yml @@ -4,8 +4,8 @@ description: job-description-librarian playTimeTracker: JobLibrarian requirements: - - !type:OverallPlaytimeRequirement #DeltaV - time: 3600 # 1 hr + - !type:CharacterOverallTimeRequirement #DeltaV + min: 3600 # 1 hr startingGear: LibrarianGear icon: "JobIconLibrarian" supervisors: job-supervisors-hop diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/mime.yml b/Resources/Prototypes/Roles/Jobs/Civilian/mime.yml index 8da2c34231b..3e04285d601 100644 --- a/Resources/Prototypes/Roles/Jobs/Civilian/mime.yml +++ b/Resources/Prototypes/Roles/Jobs/Civilian/mime.yml @@ -4,8 +4,8 @@ description: job-description-mime playTimeTracker: JobMime requirements: - - !type:OverallPlaytimeRequirement - time: 7200 # DeltaV - 2 hours + - !type:CharacterOverallTimeRequirement + min: 7200 # DeltaV - 2 hours startingGear: MimeGear icon: "JobIconMime" supervisors: job-supervisors-hop diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/musician.yml b/Resources/Prototypes/Roles/Jobs/Civilian/musician.yml index f873ec5fe8c..28f9c597e58 100644 --- a/Resources/Prototypes/Roles/Jobs/Civilian/musician.yml +++ b/Resources/Prototypes/Roles/Jobs/Civilian/musician.yml @@ -4,8 +4,8 @@ description: job-description-musician playTimeTracker: JobMusician requirements: - - !type:OverallPlaytimeRequirement - time: 7200 # DeltaV - 2 hours + - !type:CharacterOverallTimeRequirement + min: 7200 # DeltaV - 2 hours startingGear: MusicianGear icon: "JobIconMusician" supervisors: job-supervisors-hire diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/service_worker.yml b/Resources/Prototypes/Roles/Jobs/Civilian/service_worker.yml index c21fafbdaa9..8bfd05ad014 100644 --- a/Resources/Prototypes/Roles/Jobs/Civilian/service_worker.yml +++ b/Resources/Prototypes/Roles/Jobs/Civilian/service_worker.yml @@ -4,8 +4,8 @@ description: job-description-serviceworker playTimeTracker: JobServiceWorker requirements: - - !type:OverallPlaytimeRequirement - time: 7200 # DeltaV - 2 hours + - !type:CharacterOverallTimeRequirement + min: 7200 # DeltaV - 2 hours startingGear: ServiceWorkerGear icon: "JobIconServiceWorker" supervisors: job-supervisors-service diff --git a/Resources/Prototypes/Roles/Jobs/Command/captain.yml b/Resources/Prototypes/Roles/Jobs/Command/captain.yml index 905121dbf8e..12ad83e6e5c 100644 --- a/Resources/Prototypes/Roles/Jobs/Command/captain.yml +++ b/Resources/Prototypes/Roles/Jobs/Command/captain.yml @@ -4,26 +4,26 @@ description: job-description-captain playTimeTracker: JobCaptain requirements: - - !type:DepartmentTimeRequirement + - !type:CharacterDepartmentTimeRequirement department: Logistics # DeltaV - Logistics Department replacing Cargo - time: 18000 # DeltaV - 5 hours - - !type:DepartmentTimeRequirement + min: 18000 # DeltaV - 5 hours + - !type:CharacterDepartmentTimeRequirement department: Engineering - time: 18000 # DeltaV - 5 hours - - !type:DepartmentTimeRequirement + min: 18000 # DeltaV - 5 hours + - !type:CharacterDepartmentTimeRequirement department: Medical - time: 18000 # DeltaV - 5 hours - - !type:DepartmentTimeRequirement + min: 18000 # DeltaV - 5 hours + - !type:CharacterDepartmentTimeRequirement department: Security - time: 18000 # DeltaV - 5 hours - - !type:DepartmentTimeRequirement # DeltaV - Epistemics dept time requirement + min: 18000 # DeltaV - 5 hours + - !type:CharacterDepartmentTimeRequirement # DeltaV - Epistemics dept time requirement department: Epistemics # DeltaV - Epistemics Department replacing Science - time: 18000 # 5 hours - - !type:DepartmentTimeRequirement + min: 18000 # 5 hours + - !type:CharacterDepartmentTimeRequirement department: Command - time: 108000 # DeltaV - 30 hours - - !type:OverallPlaytimeRequirement # DeltaV - Playtime requirement - time: 108000 # 30 hours + min: 108000 # DeltaV - 30 hours + - !type:CharacterOverallTimeRequirement # DeltaV - Playtime requirement + min: 108000 # 30 hours - !type:WhitelistRequirement # DeltaV - Whitelist requirement weight: 20 startingGear: CaptainGear diff --git a/Resources/Prototypes/Roles/Jobs/Command/head_of_personnel.yml b/Resources/Prototypes/Roles/Jobs/Command/head_of_personnel.yml index f999a4b6c70..6311eb9fee6 100644 --- a/Resources/Prototypes/Roles/Jobs/Command/head_of_personnel.yml +++ b/Resources/Prototypes/Roles/Jobs/Command/head_of_personnel.yml @@ -5,20 +5,20 @@ playTimeTracker: JobHeadOfPersonnel antagAdvantage: 6 # DeltaV - Reduced TC: Head of Staff requirements: - - !type:RoleTimeRequirement - role: JobChef - time: 14400 # DeltaV - 4 hours - - !type:RoleTimeRequirement - role: JobBartender - time: 14400 # DeltaV - 4 hours - - !type:RoleTimeRequirement - role: JobJanitor - time: 14400 # DeltaV - 4 hours - - !type:DepartmentTimeRequirement # DeltaV - Civilian dept time requirement + - !type:CharacterPlaytimeRequirement + tracker: JobChef + min: 14400 # DeltaV - 4 hours + - !type:CharacterPlaytimeRequirement + tracker: JobBartender + min: 14400 # DeltaV - 4 hours + - !type:CharacterPlaytimeRequirement + tracker: JobJanitor + min: 14400 # DeltaV - 4 hours + - !type:CharacterDepartmentTimeRequirement # DeltaV - Civilian dept time requirement department: Civilian - time: 72000 # 20 hours - - !type:OverallPlaytimeRequirement # DeltaV - Playtime requirement - time: 90000 # 25 hours + min: 72000 # 20 hours + - !type:CharacterOverallTimeRequirement # DeltaV - Playtime requirement + min: 90000 # 25 hours weight: 10 # DeltaV - Changed HoP weight from 20 to 10 due to them not being more important than other Heads startingGear: HoPGear icon: "JobIconHeadOfPersonnel" diff --git a/Resources/Prototypes/Roles/Jobs/Engineering/atmospheric_technician.yml b/Resources/Prototypes/Roles/Jobs/Engineering/atmospheric_technician.yml index a188e93388d..834a85e7a08 100644 --- a/Resources/Prototypes/Roles/Jobs/Engineering/atmospheric_technician.yml +++ b/Resources/Prototypes/Roles/Jobs/Engineering/atmospheric_technician.yml @@ -5,9 +5,9 @@ playTimeTracker: JobAtmosphericTechnician antagAdvantage: 10 # DeltaV - Reduced TC: External Access + Fireaxe + Free Hardsuit requirements: - - !type:DepartmentTimeRequirement + - !type:CharacterDepartmentTimeRequirement department: Engineering - time: 36000 # DeltaV - 10 hours + min: 36000 # DeltaV - 10 hours startingGear: AtmosphericTechnicianGear icon: "JobIconAtmosphericTechnician" supervisors: job-supervisors-ce diff --git a/Resources/Prototypes/Roles/Jobs/Engineering/chief_engineer.yml b/Resources/Prototypes/Roles/Jobs/Engineering/chief_engineer.yml index 644754750a7..eaa66d6f0cc 100644 --- a/Resources/Prototypes/Roles/Jobs/Engineering/chief_engineer.yml +++ b/Resources/Prototypes/Roles/Jobs/Engineering/chief_engineer.yml @@ -4,15 +4,15 @@ description: job-description-ce playTimeTracker: JobChiefEngineer requirements: - - !type:RoleTimeRequirement - role: JobAtmosphericTechnician - time: 36000 # DeltaV - 10 hours + - !type:CharacterPlaytimeRequirement + tracker: JobAtmosphericTechnician + min: 36000 # DeltaV - 10 hours # - !type:RoleTimeRequirement # DeltaV - No Station Engineer time requirement # role: JobStationEngineer # time: 21600 #6 hrs - - !type:DepartmentTimeRequirement + - !type:CharacterDepartmentTimeRequirement department: Engineering - time: 90000 # DeltaV - 25 hours + min: 90000 # DeltaV - 25 hours # - !type:OverallPlaytimeRequirement # time: 72000 # DeltaV - 20 hours weight: 10 diff --git a/Resources/Prototypes/Roles/Jobs/Engineering/senior_engineer.yml b/Resources/Prototypes/Roles/Jobs/Engineering/senior_engineer.yml index ba8a8f6acc8..5106f1129c4 100644 --- a/Resources/Prototypes/Roles/Jobs/Engineering/senior_engineer.yml +++ b/Resources/Prototypes/Roles/Jobs/Engineering/senior_engineer.yml @@ -5,15 +5,15 @@ playTimeTracker: JobSeniorEngineer setPreference: false # DeltaV - Disable Senior Roles round start selection requirements: - - !type:RoleTimeRequirement - role: JobAtmosphericTechnician - time: 21600 #6 hrs - - !type:RoleTimeRequirement - role: JobStationEngineer - time: 21600 #6 hrs - - !type:DepartmentTimeRequirement + - !type:CharacterPlaytimeRequirement + tracker: JobAtmosphericTechnician + min: 21600 #6 hrs + - !type:CharacterPlaytimeRequirement + tracker: JobStationEngineer + min: 21600 #6 hrs + - !type:CharacterDepartmentTimeRequirement department: Engineering - time: 216000 # 60 hrs + min: 216000 # 60 hrs startingGear: SeniorEngineerGear icon: "JobIconSeniorEngineer" supervisors: job-supervisors-ce diff --git a/Resources/Prototypes/Roles/Jobs/Engineering/station_engineer.yml b/Resources/Prototypes/Roles/Jobs/Engineering/station_engineer.yml index ab62d69d501..dc590045191 100644 --- a/Resources/Prototypes/Roles/Jobs/Engineering/station_engineer.yml +++ b/Resources/Prototypes/Roles/Jobs/Engineering/station_engineer.yml @@ -5,9 +5,9 @@ playTimeTracker: JobStationEngineer antagAdvantage: 3 # DeltaV - Reduced TC: External Access + Engineering requirements: - - !type:DepartmentTimeRequirement + - !type:CharacterDepartmentTimeRequirement department: Engineering - time: 14400 #4 hrs + min: 14400 #4 hrs startingGear: StationEngineerGear icon: "JobIconStationEngineer" supervisors: job-supervisors-ce diff --git a/Resources/Prototypes/Roles/Jobs/Engineering/technical_assistant.yml b/Resources/Prototypes/Roles/Jobs/Engineering/technical_assistant.yml index e0b5a268ca2..668af727519 100644 --- a/Resources/Prototypes/Roles/Jobs/Engineering/technical_assistant.yml +++ b/Resources/Prototypes/Roles/Jobs/Engineering/technical_assistant.yml @@ -5,8 +5,8 @@ playTimeTracker: JobTechnicalAssistant antagAdvantage: 3 # DeltaV - Reduced TC: External Access + Engineering requirements: - - !type:OverallPlaytimeRequirement # DeltaV - to prevent griefers from taking the role. - time: 14400 # 4 hours + - !type:CharacterOverallTimeRequirement # DeltaV - to prevent griefers from taking the role. + min: 14400 # 4 hours # - !type:DepartmentTimeRequirement # DeltaV - Removes time limit # department: Engineering # time: 54000 #15 hrs diff --git a/Resources/Prototypes/Roles/Jobs/Medical/chemist.yml b/Resources/Prototypes/Roles/Jobs/Medical/chemist.yml index d57fe982c57..66466352cbe 100644 --- a/Resources/Prototypes/Roles/Jobs/Medical/chemist.yml +++ b/Resources/Prototypes/Roles/Jobs/Medical/chemist.yml @@ -4,9 +4,9 @@ description: job-description-chemist playTimeTracker: JobChemist requirements: - - !type:DepartmentTimeRequirement + - !type:CharacterDepartmentTimeRequirement department: Medical - time: 28800 # DeltaV - 8 hours + min: 28800 # DeltaV - 8 hours startingGear: ChemistGear icon: "JobIconChemist" supervisors: job-supervisors-cmo @@ -14,6 +14,10 @@ - Medical - Chemistry - Maintenance + special: + - !type:AddComponentSpecial + components: + - type: CPRTraining - type: startingGear id: ChemistGear diff --git a/Resources/Prototypes/Roles/Jobs/Medical/chief_medical_officer.yml b/Resources/Prototypes/Roles/Jobs/Medical/chief_medical_officer.yml index aac50c526c9..61b1df7784f 100644 --- a/Resources/Prototypes/Roles/Jobs/Medical/chief_medical_officer.yml +++ b/Resources/Prototypes/Roles/Jobs/Medical/chief_medical_officer.yml @@ -7,17 +7,17 @@ playTimeTracker: JobChiefMedicalOfficer antagAdvantage: 6 # DeltaV - Reduced TC: Head of Staff requirements: - - !type:RoleTimeRequirement - role: JobChemist - time: 14400 #DeltaV 4 hrs + - !type:CharacterPlaytimeRequirement + tracker: JobChemist + min: 14400 #DeltaV 4 hrs # - !type:RoleTimeRequirement # DeltaV - No Medical Doctor time requirement # role: JobMedicalDoctor # time: 21600 #6 hrs - - !type:DepartmentTimeRequirement + - !type:CharacterDepartmentTimeRequirement department: Medical - time: 43200 # DeltaV - 12 hours - - !type:OverallPlaytimeRequirement - time: 72000 # DeltaV - 20 hours + min: 43200 # DeltaV - 12 hours + - !type:CharacterOverallTimeRequirement + min: 72000 # DeltaV - 20 hours weight: 10 startingGear: CMOGear icon: "JobIconChiefMedicalOfficer" @@ -44,6 +44,7 @@ components: - type: PsionicBonusChance #Nyano - Summary: makes it more likely to become psionic. flatBonus: 0.025 + - type: CPRTraining - type: startingGear id: CMOGear diff --git a/Resources/Prototypes/Roles/Jobs/Medical/medical_doctor.yml b/Resources/Prototypes/Roles/Jobs/Medical/medical_doctor.yml index fbc6116f46b..627b0e17dc3 100644 --- a/Resources/Prototypes/Roles/Jobs/Medical/medical_doctor.yml +++ b/Resources/Prototypes/Roles/Jobs/Medical/medical_doctor.yml @@ -4,9 +4,9 @@ description: job-description-doctor playTimeTracker: JobMedicalDoctor requirements: - - !type:DepartmentTimeRequirement + - !type:CharacterDepartmentTimeRequirement department: Medical - time: 14400 #4 hrs + min: 14400 #4 hrs startingGear: DoctorGear icon: "JobIconMedicalDoctor" supervisors: job-supervisors-cmo @@ -16,6 +16,10 @@ extendedAccess: - Chemistry - Paramedic # DeltaV - Add Paramedic access + special: + - !type:AddComponentSpecial + components: + - type: CPRTraining - type: startingGear id: DoctorGear diff --git a/Resources/Prototypes/Roles/Jobs/Medical/medical_intern.yml b/Resources/Prototypes/Roles/Jobs/Medical/medical_intern.yml index 0166a3dfadb..003eab22d25 100644 --- a/Resources/Prototypes/Roles/Jobs/Medical/medical_intern.yml +++ b/Resources/Prototypes/Roles/Jobs/Medical/medical_intern.yml @@ -15,6 +15,10 @@ access: - Medical - Maintenance + special: + - !type:AddComponentSpecial + components: + - type: CPRTraining - type: startingGear id: MedicalInternGear diff --git a/Resources/Prototypes/Roles/Jobs/Medical/paramedic.yml b/Resources/Prototypes/Roles/Jobs/Medical/paramedic.yml index e4ae7a7dd50..0937a4627ae 100644 --- a/Resources/Prototypes/Roles/Jobs/Medical/paramedic.yml +++ b/Resources/Prototypes/Roles/Jobs/Medical/paramedic.yml @@ -8,9 +8,9 @@ # - !type:RoleTimeRequirement # DeltaV - No Medical Doctor time requirement # role: JobMedicalDoctor # time: 14400 #4 hrs - - !type:DepartmentTimeRequirement # DeltaV - Medical dept time requirement + - !type:CharacterDepartmentTimeRequirement # DeltaV - Medical dept time requirement department: Medical - time: 28800 # DeltaV - 8 hours + min: 28800 # DeltaV - 8 hours # - !type:OverallPlaytimeRequirement # DeltaV - No playtime requirement # time: 54000 # 15 hrs startingGear: ParamedicGear @@ -23,6 +23,10 @@ - Paramedic # DeltaV - Add Paramedic access extendedAccess: - Chemistry + special: + - !type:AddComponentSpecial + components: + - type: CPRTraining - type: startingGear id: ParamedicGear diff --git a/Resources/Prototypes/Roles/Jobs/Medical/senior_physician.yml b/Resources/Prototypes/Roles/Jobs/Medical/senior_physician.yml index 03473cc7cbc..d13fd18afdd 100644 --- a/Resources/Prototypes/Roles/Jobs/Medical/senior_physician.yml +++ b/Resources/Prototypes/Roles/Jobs/Medical/senior_physician.yml @@ -5,15 +5,15 @@ playTimeTracker: JobSeniorPhysician setPreference: false # DeltaV - Disable Senior Roles round start selection requirements: - - !type:RoleTimeRequirement - role: JobChemist - time: 21600 #6 hrs - - !type:RoleTimeRequirement - role: JobMedicalDoctor - time: 21600 #6 hrs - - !type:DepartmentTimeRequirement + - !type:CharacterPlaytimeRequirement + tracker: JobChemist + min: 21600 #6 hrs + - !type:CharacterPlaytimeRequirement + tracker: JobMedicalDoctor + min: 21600 #6 hrs + - !type:CharacterDepartmentTimeRequirement department: Medical - time: 216000 # 60 hrs + min: 216000 # 60 hrs startingGear: SeniorPhysicianGear icon: "JobIconSeniorPhysician" supervisors: job-supervisors-cmo @@ -21,6 +21,10 @@ - Medical - Maintenance - Chemistry + special: + - !type:AddComponentSpecial + components: + - type: CPRTraining - type: startingGear id: SeniorPhysicianGear diff --git a/Resources/Prototypes/Roles/Jobs/Science/borg.yml b/Resources/Prototypes/Roles/Jobs/Science/borg.yml index fe829110051..456a761dba7 100644 --- a/Resources/Prototypes/Roles/Jobs/Science/borg.yml +++ b/Resources/Prototypes/Roles/Jobs/Science/borg.yml @@ -4,8 +4,8 @@ description: job-description-borg playTimeTracker: JobBorg requirements: - - !type:OverallPlaytimeRequirement - time: 216000 #60 hrs + - !type:CharacterOverallTimeRequirement + min: 216000 #60 hrs canBeAntag: false icon: JobIconBorg supervisors: job-supervisors-rd diff --git a/Resources/Prototypes/Roles/Jobs/Science/research_director.yml b/Resources/Prototypes/Roles/Jobs/Science/research_director.yml index 19cf1419111..747ee41b840 100644 --- a/Resources/Prototypes/Roles/Jobs/Science/research_director.yml +++ b/Resources/Prototypes/Roles/Jobs/Science/research_director.yml @@ -5,11 +5,11 @@ playTimeTracker: JobResearchDirector antagAdvantage: 6 # DeltaV - Reduced TC: Head of Staff requirements: - - !type:DepartmentTimeRequirement + - !type:CharacterDepartmentTimeRequirement department: Epistemics # DeltaV - Epistemics Department replacing Science - time: 54000 # DeltaV - 15 hours - - !type:OverallPlaytimeRequirement - time: 72000 # DeltaV - 20 hours + min: 54000 # DeltaV - 15 hours + - !type:CharacterOverallTimeRequirement + min: 72000 # DeltaV - 20 hours weight: 10 startingGear: ResearchDirectorGear icon: "JobIconResearchDirector" @@ -21,7 +21,7 @@ - Command - Maintenance - ResearchDirector - - Mantis # DeltaV - Psionic Mantis, see Resources/Prototypes/DeltaV/Access/epistemics.yml + - Mantis # DeltaV - Mantis, see Resources/Prototypes/DeltaV/Access/epistemics.yml - Chapel # DeltaV - Chaplain is in Epistemics - Cryogenics special: # Nyanotrasen - Mystagogue can use the Bible diff --git a/Resources/Prototypes/Roles/Jobs/Science/scientist.yml b/Resources/Prototypes/Roles/Jobs/Science/scientist.yml index fe00a72abb1..2d91e0e6ef9 100644 --- a/Resources/Prototypes/Roles/Jobs/Science/scientist.yml +++ b/Resources/Prototypes/Roles/Jobs/Science/scientist.yml @@ -4,9 +4,9 @@ description: job-description-scientist playTimeTracker: JobScientist requirements: - - !type:DepartmentTimeRequirement + - !type:CharacterDepartmentTimeRequirement department: Epistemics # DeltaV - Epistemics Department replacing Science - time: 14400 #4 hrs + min: 14400 #4 hrs startingGear: ScientistGear icon: "JobIconScientist" supervisors: job-supervisors-rd diff --git a/Resources/Prototypes/Roles/Jobs/Science/senior_researcher.yml b/Resources/Prototypes/Roles/Jobs/Science/senior_researcher.yml index 5010c7fb26f..90234250302 100644 --- a/Resources/Prototypes/Roles/Jobs/Science/senior_researcher.yml +++ b/Resources/Prototypes/Roles/Jobs/Science/senior_researcher.yml @@ -5,9 +5,9 @@ playTimeTracker: JobSeniorResearcher setPreference: false # DeltaV - Disable Senior Roles round start selection requirements: - - !type:DepartmentTimeRequirement + - !type:CharacterDepartmentTimeRequirement department: Epistemics # DeltaV - Epistemics Department replacing Science - time: 216000 #60 hrs + min: 216000 #60 hrs startingGear: SeniorResearcherGear icon: "JobIconSeniorResearcher" supervisors: job-supervisors-rd diff --git a/Resources/Prototypes/Roles/Jobs/Security/detective.yml b/Resources/Prototypes/Roles/Jobs/Security/detective.yml index feef023b450..861088b5e5c 100644 --- a/Resources/Prototypes/Roles/Jobs/Security/detective.yml +++ b/Resources/Prototypes/Roles/Jobs/Security/detective.yml @@ -4,9 +4,9 @@ description: job-description-detective playTimeTracker: JobDetective requirements: - - !type:DepartmentTimeRequirement + - !type:CharacterDepartmentTimeRequirement department: Security - time: 36000 # DeltaV - 10 hours + min: 36000 # DeltaV - 10 hours startingGear: DetectiveGear icon: "JobIconDetective" supervisors: job-supervisors-hos @@ -17,6 +17,8 @@ - Maintenance - Service - Detective + - External + - Cryogenics special: - !type:AddImplantSpecial implants: [ MindShieldImplant ] diff --git a/Resources/Prototypes/Roles/Jobs/Security/head_of_security.yml b/Resources/Prototypes/Roles/Jobs/Security/head_of_security.yml index a8b7013004e..675e7768fa7 100644 --- a/Resources/Prototypes/Roles/Jobs/Security/head_of_security.yml +++ b/Resources/Prototypes/Roles/Jobs/Security/head_of_security.yml @@ -4,17 +4,17 @@ description: job-description-hos playTimeTracker: JobHeadOfSecurity requirements: - - !type:RoleTimeRequirement - role: JobWarden - time: 14400 #DeltaV 4 hrs + - !type:CharacterPlaytimeRequirement + tracker: JobWarden + min: 14400 #DeltaV 4 hrs # - !type:RoleTimeRequirement # DeltaV - No Security Officer time requirement - REIMPLEMENT WHEN MORE PEOPLE HAVE IT # role: JobDetective # time: 14400 #DeltaV 4 hrs - - !type:DepartmentTimeRequirement # DeltaV - Command dept time requirement + - !type:CharacterDepartmentTimeRequirement # DeltaV - Command dept time requirement department: Command - time: 36000 # 10 hours - - !type:OverallPlaytimeRequirement - time: 90000 # DeltaV - 25 hours + min: 36000 # 10 hours + - !type:CharacterOverallTimeRequirement + min: 90000 # DeltaV - 25 hours - !type:WhitelistRequirement # DeltaV - Whitelist requirement weight: 10 startingGear: HoSGear diff --git a/Resources/Prototypes/Roles/Jobs/Security/security_cadet.yml b/Resources/Prototypes/Roles/Jobs/Security/security_cadet.yml index 324b697baff..0b28af78502 100644 --- a/Resources/Prototypes/Roles/Jobs/Security/security_cadet.yml +++ b/Resources/Prototypes/Roles/Jobs/Security/security_cadet.yml @@ -4,8 +4,8 @@ description: job-description-cadet playTimeTracker: JobSecurityCadet requirements: - - !type:OverallPlaytimeRequirement - time: 14400 # DeltaV - 4 hours + - !type:CharacterOverallTimeRequirement + min: 14400 # DeltaV - 4 hours # - !type:DepartmentTimeRequirement # DeltaV - Removes time limit # department: Security # time: 54000 #15 hrs diff --git a/Resources/Prototypes/Roles/Jobs/Security/security_officer.yml b/Resources/Prototypes/Roles/Jobs/Security/security_officer.yml index 695464e030f..b81cef667ed 100644 --- a/Resources/Prototypes/Roles/Jobs/Security/security_officer.yml +++ b/Resources/Prototypes/Roles/Jobs/Security/security_officer.yml @@ -4,9 +4,9 @@ description: job-description-security playTimeTracker: JobSecurityOfficer requirements: - - !type:DepartmentTimeRequirement + - !type:CharacterDepartmentTimeRequirement department: Security - time: 14400 # DeltaV - 4 hours + min: 14400 # DeltaV - 4 hours startingGear: SecurityOfficerGear icon: "JobIconSecurityOfficer" supervisors: job-supervisors-hos diff --git a/Resources/Prototypes/Roles/Jobs/Security/senior_officer.yml b/Resources/Prototypes/Roles/Jobs/Security/senior_officer.yml index 99167b8cd41..2623adf1fd0 100644 --- a/Resources/Prototypes/Roles/Jobs/Security/senior_officer.yml +++ b/Resources/Prototypes/Roles/Jobs/Security/senior_officer.yml @@ -5,18 +5,18 @@ playTimeTracker: JobSeniorOfficer setPreference: false # DeltaV - Disable Senior Roles round start selection requirements: - - !type:RoleTimeRequirement - role: JobWarden - time: 21600 #6 hrs - - !type:RoleTimeRequirement - role: JobDetective - time: 7200 #2 hrs - - !type:RoleTimeRequirement - role: JobSecurityOfficer - time: 21600 #6 hrs - - !type:DepartmentTimeRequirement + - !type:CharacterPlaytimeRequirement + tracker: JobWarden + min: 21600 #6 hrs + - !type:CharacterPlaytimeRequirement + tracker: JobDetective + min: 7200 #2 hrs + - !type:CharacterPlaytimeRequirement + tracker: JobSecurityOfficer + min: 21600 #6 hrs + - !type:CharacterDepartmentTimeRequirement department: Security - time: 216000 # 60 hrs + min: 216000 # 60 hrs startingGear: SeniorOfficerGear icon: "JobIconSeniorOfficer" supervisors: job-supervisors-hos diff --git a/Resources/Prototypes/Roles/Jobs/Security/warden.yml b/Resources/Prototypes/Roles/Jobs/Security/warden.yml index 3b7697cb680..a4c5c5a8fab 100644 --- a/Resources/Prototypes/Roles/Jobs/Security/warden.yml +++ b/Resources/Prototypes/Roles/Jobs/Security/warden.yml @@ -4,12 +4,12 @@ description: job-description-warden playTimeTracker: JobWarden requirements: - - !type:RoleTimeRequirement # DeltaV - JobSecurityOfficer time requirement. Make them experienced in proper officer work. - role: JobSecurityOfficer - time: 43200 # DeltaV - 12 hrs - - !type:RoleTimeRequirement # DeltaV - JobDetective time requirement. Give them an understanding of basic forensics. - role: JobDetective - time: 14400 # DeltaV - 4 hours + - !type:CharacterPlaytimeRequirement # DeltaV - JobSecurityOfficer time requirement. Make them experienced in proper officer work. + tracker: JobSecurityOfficer + min: 43200 # DeltaV - 12 hrs + - !type:CharacterPlaytimeRequirement # DeltaV - JobDetective time requirement. Give them an understanding of basic forensics. + tracker: JobDetective + min: 14400 # DeltaV - 4 hours - !type:WhitelistRequirement # DeltaV - Whitelist requirement startingGear: WardenGear icon: "JobIconWarden" diff --git a/Resources/Prototypes/Roles/Jobs/Wildcards/boxer.yml b/Resources/Prototypes/Roles/Jobs/Wildcards/boxer.yml index ea2faf14467..33def38bb08 100644 --- a/Resources/Prototypes/Roles/Jobs/Wildcards/boxer.yml +++ b/Resources/Prototypes/Roles/Jobs/Wildcards/boxer.yml @@ -4,8 +4,8 @@ description: job-description-boxer playTimeTracker: JobBoxer requirements: - - !type:OverallPlaytimeRequirement - time: 7200 #DeltaV 2 hours + - !type:CharacterOverallTimeRequirement + min: 7200 #DeltaV 2 hours startingGear: BoxerGear icon: "JobIconBoxer" supervisors: job-supervisors-hop diff --git a/Resources/Prototypes/Roles/Jobs/Wildcards/psychologist.yml b/Resources/Prototypes/Roles/Jobs/Wildcards/psychologist.yml index 7687049b685..a2974c6eb7a 100644 --- a/Resources/Prototypes/Roles/Jobs/Wildcards/psychologist.yml +++ b/Resources/Prototypes/Roles/Jobs/Wildcards/psychologist.yml @@ -4,11 +4,11 @@ description: job-description-psychologist playTimeTracker: JobPsychologist requirements: - - !type:OverallPlaytimeRequirement - time: 36000 #DeltaV 10 hours - - !type:DepartmentTimeRequirement + - !type:CharacterOverallTimeRequirement + min: 36000 #DeltaV 10 hours + - !type:CharacterDepartmentTimeRequirement department: Medical - time: 14400 #DeltaV 4 hrs + min: 14400 #DeltaV 4 hrs startingGear: PsychologistGear icon: "JobIconPsychologist" supervisors: job-supervisors-cmo diff --git a/Resources/Prototypes/Roles/Jobs/Wildcards/reporter.yml b/Resources/Prototypes/Roles/Jobs/Wildcards/reporter.yml index 6f7093f3ae5..ad810e970e9 100644 --- a/Resources/Prototypes/Roles/Jobs/Wildcards/reporter.yml +++ b/Resources/Prototypes/Roles/Jobs/Wildcards/reporter.yml @@ -4,8 +4,8 @@ description: job-description-reporter playTimeTracker: JobReporter requirements: - - !type:OverallPlaytimeRequirement - time: 7200 #DeltaV 2 hours + - !type:CharacterOverallTimeRequirement + min: 7200 #DeltaV 2 hours startingGear: ReporterGear icon: "JobIconReporter" supervisors: job-supervisors-hop diff --git a/Resources/Prototypes/Roles/Jobs/Wildcards/zookeeper.yml b/Resources/Prototypes/Roles/Jobs/Wildcards/zookeeper.yml index 04d10513331..1686e3290fa 100644 --- a/Resources/Prototypes/Roles/Jobs/Wildcards/zookeeper.yml +++ b/Resources/Prototypes/Roles/Jobs/Wildcards/zookeeper.yml @@ -4,8 +4,8 @@ description: job-description-zookeeper playTimeTracker: JobZookeeper requirements: - - !type:OverallPlaytimeRequirement - time: 7200 #DeltaV 2 hours + - !type:CharacterOverallTimeRequirement + min: 7200 #DeltaV 2 hours startingGear: ZookeeperGear icon: "JobIconZookeeper" supervisors: job-supervisors-hop diff --git a/Resources/Prototypes/Roles/Jobs/departments.yml b/Resources/Prototypes/Roles/Jobs/departments.yml index 83534425097..1609969f7e6 100644 --- a/Resources/Prototypes/Roles/Jobs/departments.yml +++ b/Resources/Prototypes/Roles/Jobs/departments.yml @@ -23,7 +23,7 @@ - Clown - HeadOfPersonnel - Janitor - - Lawyer + # - Lawyer # DeltaV - Move Lawyer into Justice - Librarian - Mime - Musician diff --git a/Resources/Prototypes/Roles/play_time_trackers.yml b/Resources/Prototypes/Roles/play_time_trackers.yml index 35b92357702..27043cfbfe4 100644 --- a/Resources/Prototypes/Roles/play_time_trackers.yml +++ b/Resources/Prototypes/Roles/play_time_trackers.yml @@ -37,12 +37,18 @@ - type: playTimeTracker id: JobChiefEngineer +- type: playTimeTracker + id: JobChiefJustice + - type: playTimeTracker id: JobChiefMedicalOfficer - type: playTimeTracker id: JobClown +- type: playTimeTracker + id: JobClerk + - type: playTimeTracker id: JobDetective @@ -100,6 +106,9 @@ - type: playTimeTracker id: JobPsychologist +- type: playTimeTracker + id: JobProsecutor + - type: playTimeTracker id: JobQuartermaster diff --git a/Resources/Prototypes/Species/arachne.yml b/Resources/Prototypes/Species/arachne.yml new file mode 100644 index 00000000000..ed494c37cc8 --- /dev/null +++ b/Resources/Prototypes/Species/arachne.yml @@ -0,0 +1,50 @@ +- type: species + id: Arachne + name: species-name-arachne + roundStart: true + prototype: MobArachne + sprites: MobArachneSprites + markingLimits: MobArachneMarkingLimits + dollPrototype: MobArachneDummy + skinColoration: HumanToned + sexes: + - Female + minAge: 60 + youngAge: 150 + oldAge: 400 + maxAge: 666 + +- type: markingPoints + id: MobArachneMarkingLimits + points: + Hair: + points: 1 + required: false + Tail: + points: 1 + required: false + Chest: + points: 1 + required: false + Arms: + points: 2 + required: false + + +- type: speciesBaseSprites + id: MobArachneSprites + sprites: + Head: MobHumanHead + Hair: MobHumanoidAnyMarking + Chest: MobHumanTorso + Eyes: MobArachneEyes + LArm: MobHumanLArm + RArm: MobHumanRArm + LHand: MobHumanLHand + RHand: MobHumanRHand + +- type: humanoidBaseSprite + id: MobArachneEyes + baseSprite: + sprite: Mobs/Species/eyes.rsi + state: eyes diff --git a/Resources/Prototypes/Species/arachnid.yml b/Resources/Prototypes/Species/arachnid.yml index 07a72cda176..5dedba1b447 100644 --- a/Resources/Prototypes/Species/arachnid.yml +++ b/Resources/Prototypes/Species/arachnid.yml @@ -64,10 +64,10 @@ points: 1 required: false Legs: - points: 2 + points: 6 required: false Arms: - points: 2 + points: 6 required: false - type: humanoidBaseSprite diff --git a/Resources/Prototypes/Species/human.yml b/Resources/Prototypes/Species/human.yml index 94b21ec9620..49f8839cac3 100644 --- a/Resources/Prototypes/Species/human.yml +++ b/Resources/Prototypes/Species/human.yml @@ -56,10 +56,10 @@ points: 1 required: false Legs: - points: 2 + points: 6 required: false Arms: - points: 2 + points: 6 required: false - type: humanoidBaseSprite diff --git a/Resources/Prototypes/Species/moth.yml b/Resources/Prototypes/Species/moth.yml index 724c268a0bb..44bf5e60769 100644 --- a/Resources/Prototypes/Species/moth.yml +++ b/Resources/Prototypes/Species/moth.yml @@ -68,10 +68,10 @@ points: 1 required: false Legs: - points: 2 + points: 6 required: false Arms: - points: 2 + points: 6 required: false - type: humanoidBaseSprite diff --git a/Resources/Prototypes/Species/reptilian.yml b/Resources/Prototypes/Species/reptilian.yml index 752918e2f0c..dc5a56534b4 100644 --- a/Resources/Prototypes/Species/reptilian.yml +++ b/Resources/Prototypes/Species/reptilian.yml @@ -65,10 +65,10 @@ points: 1 required: false Legs: - points: 2 + points: 6 required: false Arms: - points: 2 + points: 6 required: false - type: humanoidBaseSprite diff --git a/Resources/Prototypes/StatusEffects/job.yml b/Resources/Prototypes/StatusEffects/job.yml index 30c677dd2c9..96ad930bd51 100644 --- a/Resources/Prototypes/StatusEffects/job.yml +++ b/Resources/Prototypes/StatusEffects/job.yml @@ -121,8 +121,8 @@ parent: JobIcon id: JobIconLawyer icon: - sprite: /Textures/Interface/Misc/job_icons.rsi - state: Lawyer + sprite: /Textures/DeltaV/Interface/Misc/job_icons.rsi # DeltaV - Move Lawyer into Justice + state: Lawyer # DeltaV - Move Lawyer into Justice - type: statusIcon parent: JobIcon diff --git a/Resources/Prototypes/Traits/disabilities.yml b/Resources/Prototypes/Traits/disabilities.yml index eb96d37e01a..ca2453e41a1 100644 --- a/Resources/Prototypes/Traits/disabilities.yml +++ b/Resources/Prototypes/Traits/disabilities.yml @@ -94,3 +94,80 @@ - MedicalBorg components: - type: Snoring + +- type: trait + id: Sluggish + category: Physical + points: 1 + requirements: + - !type:CharacterTraitRequirement + inverted: true + traits: + - ParkourTraining + - SnailPaced + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + components: + - type: TraitSpeedModifier + sprintModifier: 0.85 + walkModifier: 0.85 + - type: ClimbDelayModifier + climbDelayMultiplier: 1.35 + - type: LayingDownModifier + layingDownCooldownMultiplier: 1.2 + +- type: trait + id: SnailPaced + category: Physical + points: 2 + requirements: + - !type:CharacterTraitRequirement + inverted: true + traits: + - ParkourTraining + - Sluggish + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + components: + - type: TraitSpeedModifier + sprintModifier: 0.7 + walkModifier: 0.7 + - type: ClimbDelayModifier + climbDelayMultiplier: 1.66 + - type: LayingDownModifier + layingDownCooldownMultiplier: 1.6 + +- type: trait + id: BloodDeficiency + category: Physical + points: 2 + requirements: + - !type:CharacterJobRequirement + inverted: true + jobs: + - Borg + - MedicalBorg + components: + - type: BloodDeficiency # 0.07 = start taking bloodloss damage at around ~21.4 minutes, + bloodLossAmount: 0.07 # then become crit ~10 minutes later + +- type: trait + id: Hemophilia + category: Physical + points: 1 + requirements: + - !type:CharacterJobRequirement + inverted: true + jobs: + - Borg + - MedicalBorg + components: + - type: Hemophilia + bleedReductionModifier: 0.5 + damageModifiers: + coefficients: + Blunt: 1.1 diff --git a/Resources/Prototypes/Traits/neutral.yml b/Resources/Prototypes/Traits/neutral.yml index 28f6adc170a..ab5bcb238d7 100644 --- a/Resources/Prototypes/Traits/neutral.yml +++ b/Resources/Prototypes/Traits/neutral.yml @@ -31,7 +31,6 @@ - type: trait id: NormalVision category: Visual - points: -1 requirements: - !type:CharacterSpeciesRequirement species: diff --git a/Resources/Prototypes/Traits/skills.yml b/Resources/Prototypes/Traits/skills.yml index 2cfbd244e7e..56a8549c933 100644 --- a/Resources/Prototypes/Traits/skills.yml +++ b/Resources/Prototypes/Traits/skills.yml @@ -1,3 +1,38 @@ +- type: trait + id: CPRTraining + category: Mental + points: -2 + components: + - type: CPRTraining + requirements: + - !type:CharacterJobRequirement + inverted: true + jobs: + - MedicalDoctor + - Chemist + - MedicalIntern + - Paramedic + - ChiefMedicalOfficer + - Brigmedic + +- type: trait + id: SelfAware + category: Mental + points: -2 + components: + - type: SelfAware + analyzableTypes: + - Blunt + - Slash + - Piercing + - Heat + - Shock + - Cold + - Caustic + detectableGroups: + - Airloss + - Toxin + - type: trait id: HeavyweightDrunk category: Physical @@ -31,3 +66,58 @@ inverted: true species: - Felinid + +- type: trait + id: SignLanguage + category: Visual + points: -1 + components: + - type: LanguageKnowledgeModifier + speaks: + - Sign + understands: + - Sign + +- type: trait + id: Voracious + category: Physical + points: -1 + components: + - type: ConsumeDelayModifier + foodDelayMultiplier: 0.5 + drinkDelayMultiplier: 0.5 + +- type: trait + id: ParkourTraining + category: Physical + points: -3 + requirements: + - !type:CharacterTraitRequirement + inverted: true + traits: + - Sluggish + - SnailPaced + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + components: + - type: ClimbDelayModifier + climbDelayMultiplier: 0.70 + - type: LayingDownModifier + layingDownCooldownMultiplier: 0.8 + downedSpeedMultiplierMultiplier: 1.25 + +- type: trait + id: LightStep + category: Auditory + points: -1 + components: + - type: FootstepVolumeModifier + sprintVolumeModifier: -10 + walkVolumeModifier: -10 + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Felinid diff --git a/Resources/Prototypes/Traits/species.yml b/Resources/Prototypes/Traits/species.yml new file mode 100644 index 00000000000..2c298252289 --- /dev/null +++ b/Resources/Prototypes/Traits/species.yml @@ -0,0 +1,62 @@ +- type: trait + id: Swashbuckler + category: Physical + points: -1 + components: + - type: OniDamageModifier + modifiers: + coefficients: + Blunt: 1.2 + Slash: 1.35 + Piercing: 1.2 + requirements: + - !type:CharacterSpeciesRequirement + species: + - Oni + - !type:CharacterTraitRequirement + inverted: true + traits: + - Spearmaster + - WeaponsGeneralist + +- type: trait + id: Spearmaster + category: Physical + points: -1 + components: + - type: OniDamageModifier + modifiers: + coefficients: + Blunt: 1.2 + Slash: 1.2 + Piercing: 1.35 + requirements: + - !type:CharacterSpeciesRequirement + species: + - Oni + - !type:CharacterTraitRequirement + inverted: true + traits: + - Swashbuckler + - WeaponsGeneralist + +- type: trait + id: WeaponsGeneralist + category: Physical + points: -1 + components: + - type: OniDamageModifier + modifiers: + coefficients: + Blunt: 1.25 + Slash: 1.25 + Piercing: 1.25 + requirements: + - !type:CharacterSpeciesRequirement + species: + - Oni + - !type:CharacterTraitRequirement + inverted: true + traits: + - Swashbuckler + - Spearmaster diff --git a/Resources/Prototypes/explosion.yml b/Resources/Prototypes/explosion.yml index 1eaf4f52ff4..7ef2e774a71 100644 --- a/Resources/Prototypes/explosion.yml +++ b/Resources/Prototypes/explosion.yml @@ -117,3 +117,19 @@ lightColor: Orange texturePath: /Textures/Effects/fire.rsi fireStates: 6 + +- type: explosion + id: Supermatter + damagePerIntensity: + types: + Radiation: 5 + Heat: 4 + Blunt: 3 + Piercing: 3 + tileBreakChance: [0, 0.5, 1] + tileBreakIntensity: [0, 10, 30] + tileBreakRerollReduction: 20 + lightColor: Yellow + fireColor: Green + texturePath: /Textures/Effects/fire_greyscale.rsi + fireStates: 3 diff --git a/Resources/Prototypes/game_presets.yml b/Resources/Prototypes/game_presets.yml index 7e83f224433..7d7169bf10a 100644 --- a/Resources/Prototypes/game_presets.yml +++ b/Resources/Prototypes/game_presets.yml @@ -20,17 +20,6 @@ - HellshiftStationEventScheduler - BasicRoundstartVariation -- type: gamePreset - id: SurvivalLonger - alias: - - longsurvival - showInVote: true - name: longsurvival-title - description: longsurvival-description - rules: - - LongSurvivalStationEventScheduler - - BasicRoundstartVariation - - type: gamePreset id: AllAtOnce name: all-at-once-title diff --git a/Resources/Prototypes/tags.yml b/Resources/Prototypes/tags.yml index c2e46d5f590..786f641ddd1 100644 --- a/Resources/Prototypes/tags.yml +++ b/Resources/Prototypes/tags.yml @@ -16,6 +16,9 @@ - type: Tag id: AppraisalTool +- type: Tag + id: ArachneWeb + - type: Tag id: ArtifactFragment @@ -602,6 +605,9 @@ - type: Tag id: Fruit +- type: Tag + id: FullBodyOuter + - type: Tag id: Galaxythistle @@ -919,6 +925,9 @@ - type: Tag id: Ointment +- type: Tag + id: Oneirophage + - type: Tag id: Ore @@ -1119,10 +1128,10 @@ id: SmallMech - type: Tag - id: SnapPop + id: Smokable - type: Tag - id: Smokable + id: SnapPop - type: Tag id: SnowyLabs diff --git a/Resources/ServerInfo/Guidebook/Engineering/Supermatter.xml b/Resources/ServerInfo/Guidebook/Engineering/Supermatter.xml new file mode 100644 index 00000000000..6e89df44324 --- /dev/null +++ b/Resources/ServerInfo/Guidebook/Engineering/Supermatter.xml @@ -0,0 +1,65 @@ + + + + + # The Supermatter Engine + + So you've decided to take on the challenge and set up the Supermatter Engine? First, let's give you a short overview of the main Supermatter crystal beforehand. + + Its primary features are emitting electrical arcs that are harnessed to power the station through tesla coils. + + Side effects include radiation emission, releasing hot oxygen and plasma, heating the air around, and exploding, transforming into a black hole or an energy ball and eating the entire station if you screw up hard enough. + + It begins inert but being hit by an object or a projectile will activate it and it'll start exhibiting nearly all of the aforementioned properties. + + ## Words of Warning + + 1. The Supermatter crystal is [color=red]VERY DANGEROUS[/color]. Activating the crystal should be the last step in setting up any form of Supermatter based power! + + 2. [color=red]PUT YOUR RADIATION SUIT ON[/color]. + + 3. Most the Supermatter setup involves a gas loop that is designed to cool down the Supermatter chamber. Please have at least some knowledge of gases and their atmospheric properties. + + 4. Anything that bumps into the Supermatter is [color=red]fundamentally annihilated[/color]. [color=red]Do not touch it[/color]. This means weld and bolt the door to the chamber. + + ## Gas Interactions + + Here's a list of all gases from least dangerous to most dangerous. + + 1. [color=#bffffe]Frezon[/color]. Aside from cooling down the Supermatter, it basically stops power and waste production, which may come handy if the Supermatter is close to delaminating and you need to shut it down fast. + + 2. [color=#c20000]Nitrogen[/color]. N2 is the basic gas most Supermatter setups will run exclusively, being very simple to set up for. It dampens the power generation from heat, and reduces the amount of plasma the SM belches out, making it good for when you aren't trying to do something silly. + + 3. [color=#b16d6d]Nitrous oxide[/color]. Reinforces the heat resistance of the crystal, allowing for much hotter setups than usual. However, at high temperatures it will decompose into Nitrogen and Oxygen. While N2 is good, O2 certainly is not. This O2 will also react with the Plasma to create Tritium and then a Tritium fire. + + 4. [color=#62d5ca]Oxygen[/color]. Provides a boost to power transmission without actively increasing the waste gas amount or temperature. Pretty risky to use, as any disruption of the cooling loop will soon cause a plasma fire in the crystal chamber. Even just a high concentration of O2 will activate and continuously power the crystal. + + 5. [color=#19b348]Ammonia[/color]. Increases the power generation slightly at a minor cost to the heat penalty. + + 6. [color=#979797]Carbon Dioxide[/color]. In low concentrations, it will increase the crystal's power generation. In high concentrations it will raise the crystal's energy to extremely high levels. With poor management and insufficient or downright bad preparation, it will eventually exceed safe energy levels and begin a charge delamination, producing electric arcs and anomalies until it eventually explodes into a Tesla ball. + + [color=red]7[/color]. [color=#ff9d00]Plasma[/color]. Very similar to Oxygen but provides a higher power boost as well as a much higher waste and heat penalty. The extreme pressures and volumes of gas produced by this gas are very likely to clog pipes and overheat the chamber. + + [color=red]8[/color]. [color=#08a800]Tritium[/color]. Increases the power production of the Supermatter by up to 3 times, there is one slight issue with it. It is dangerous. It is very dangerous. Tritium is a horrifyingly irritable and jumpy gas. While it isn't as harmful to the heat level as Plasma is (just barely), it also has the second worst heat capacity of all gasses while Plasma has the second highest. This means that Plasma can be kept happy with enough cooling, whereas Tritium eagerly goes from a safe space loop into a burning hellfire. Add to this the byproduct of large amounts of Oxygen production (not exclusive to Tritium, an issue in a Plasma engine too), and you have a tritium fire and a very hot crystal. Do not use this gas unless you have a very strong understanding of atmospherics and the Supermatter, and are willing to get creative. + + ## Practical guide to the Supermatter + + Now, forget about everything you've just read and get to setting up the most basic loop there is: the Nitrogen loop. + + The atmospheric setup in its' most basic form should look like this: + + (We did not have enough budget for images, here is a text representation) + + 1. Nitrogen gets pumped into the chamber by passive vents from one side + + 2. Every gas gets pumped out of the chamber by using scrubbers set on Siphon on the other side. + + 3. The output gets filtered, cooled down, and excess nitrogen gets either routed into space or rerouted into the input. + + That's basically it. I hope you understand at least something in this example. Now get to it! + + ## Experiment + + You're not a real engineer if you haven't figured out the most efficient way to produce electricity using the Supermatter crystal, are you? + + \ No newline at end of file diff --git a/Resources/ServerInfo/Rules.txt b/Resources/ServerInfo/Rules.txt index 9d5ed774b08..c16976b944c 100644 --- a/Resources/ServerInfo/Rules.txt +++ b/Resources/ServerInfo/Rules.txt @@ -92,7 +92,7 @@ Players that are revived by using a defibrillator CAN recall what killed them an [color=#a4885c]11.[/color] Psionics - Players that have psionic powers are allowed to use them at-will to accomplish their roleplay goals. It should be noted that in-character consequences can happen as a result of their use, including being stripped of psionic powers or even death. - - As a psionic mantis, it is not your goal to hunt down psionics. Do not mindbreak others against their will solely because they have psionic powers. + - As a mantis, it is not your goal to hunt down psionics. Do not mindbreak others against their will solely because they have psionic powers. [color=#a4885c]12.[/color] Don't rush for or prepare equipment unrelated to your job for no purpose other than to have it "just in case" (referred to as "Powergaming"). - A medical doctor does not need insulated gloves, and the Head of Personnel does not need to give themselves armory access so they can go grab a gun. Have an actual reason for needing these things. diff --git a/Resources/Textures/DeltaV/Clothing/Ears/Headsets/justice.rsi/alt-equipped-EARS.png b/Resources/Textures/DeltaV/Clothing/Ears/Headsets/justice.rsi/alt-equipped-EARS.png new file mode 100644 index 00000000000..9522966b6c7 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Ears/Headsets/justice.rsi/alt-equipped-EARS.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Ears/Headsets/justice.rsi/equipped-EARS.png b/Resources/Textures/DeltaV/Clothing/Ears/Headsets/justice.rsi/equipped-EARS.png new file mode 100644 index 00000000000..0633bb36441 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Ears/Headsets/justice.rsi/equipped-EARS.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Ears/Headsets/justice.rsi/icon.png b/Resources/Textures/DeltaV/Clothing/Ears/Headsets/justice.rsi/icon.png new file mode 100644 index 00000000000..0ce0c363f81 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Ears/Headsets/justice.rsi/icon.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Ears/Headsets/justice.rsi/icon_alt.png b/Resources/Textures/DeltaV/Clothing/Ears/Headsets/justice.rsi/icon_alt.png new file mode 100644 index 00000000000..2142eee0392 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Ears/Headsets/justice.rsi/icon_alt.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Ears/Headsets/justice.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/Ears/Headsets/justice.rsi/meta.json new file mode 100644 index 00000000000..116c0e53e70 --- /dev/null +++ b/Resources/Textures/DeltaV/Clothing/Ears/Headsets/justice.rsi/meta.json @@ -0,0 +1,25 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/f8f4aeda930fcd0805ca4cc76d9bc9412a5b3428 | Modified by leonardo_dabepis (Discord)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "icon_alt" + }, + { + "name": "equipped-EARS", + "directions": 4 + }, + { + "name": "alt-equipped-EARS", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/DeltaV/Clothing/Head/Hats/cj_toque.rsi/equipped-HELMET.png b/Resources/Textures/DeltaV/Clothing/Head/Hats/cj_toque.rsi/equipped-HELMET.png new file mode 100644 index 00000000000..2fc2172afa7 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Head/Hats/cj_toque.rsi/equipped-HELMET.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Head/Hats/cj_toque.rsi/icon.png b/Resources/Textures/DeltaV/Clothing/Head/Hats/cj_toque.rsi/icon.png new file mode 100644 index 00000000000..3a06285c67c Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Head/Hats/cj_toque.rsi/icon.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Head/Hats/cj_toque.rsi/inhand-left.png b/Resources/Textures/DeltaV/Clothing/Head/Hats/cj_toque.rsi/inhand-left.png new file mode 100644 index 00000000000..60426ff87fd Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Head/Hats/cj_toque.rsi/inhand-left.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Head/Hats/cj_toque.rsi/inhand-right.png b/Resources/Textures/DeltaV/Clothing/Head/Hats/cj_toque.rsi/inhand-right.png new file mode 100644 index 00000000000..d6ed79e225a Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Head/Hats/cj_toque.rsi/inhand-right.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Head/Hats/cj_toque.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/Head/Hats/cj_toque.rsi/meta.json new file mode 100644 index 00000000000..9d421b646b5 --- /dev/null +++ b/Resources/Textures/DeltaV/Clothing/Head/Hats/cj_toque.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC0-1.0", + "copyright": "Spritework by leonardo_dabepis (Discord)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-HELMET", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/DeltaV/Clothing/Neck/Cloaks/cjcloak.rsi/equipped-NECK.png b/Resources/Textures/DeltaV/Clothing/Neck/Cloaks/cjcloak.rsi/equipped-NECK.png new file mode 100644 index 00000000000..49bc499a870 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Neck/Cloaks/cjcloak.rsi/equipped-NECK.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Neck/Cloaks/cjcloak.rsi/icon.png b/Resources/Textures/DeltaV/Clothing/Neck/Cloaks/cjcloak.rsi/icon.png new file mode 100644 index 00000000000..ce23046a1fc Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Neck/Cloaks/cjcloak.rsi/icon.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Neck/Cloaks/cjcloak.rsi/inhand-left.png b/Resources/Textures/DeltaV/Clothing/Neck/Cloaks/cjcloak.rsi/inhand-left.png new file mode 100644 index 00000000000..80531e8b56f Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Neck/Cloaks/cjcloak.rsi/inhand-left.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Neck/Cloaks/cjcloak.rsi/inhand-right.png b/Resources/Textures/DeltaV/Clothing/Neck/Cloaks/cjcloak.rsi/inhand-right.png new file mode 100644 index 00000000000..0bd0f37f115 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Neck/Cloaks/cjcloak.rsi/inhand-right.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Neck/Cloaks/cjcloak.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/Neck/Cloaks/cjcloak.rsi/meta.json new file mode 100644 index 00000000000..a0670a97c96 --- /dev/null +++ b/Resources/Textures/DeltaV/Clothing/Neck/Cloaks/cjcloak.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC0-1.0", + "copyright": "Spritework by leonardo_dabepis (Discord)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-NECK", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/DeltaV/Clothing/Neck/Misc/prosecutorbadge.rsi/equipped-NECK.png b/Resources/Textures/DeltaV/Clothing/Neck/Misc/prosecutorbadge.rsi/equipped-NECK.png new file mode 100644 index 00000000000..ce4e527400f Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Neck/Misc/prosecutorbadge.rsi/equipped-NECK.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Neck/Misc/prosecutorbadge.rsi/icon.png b/Resources/Textures/DeltaV/Clothing/Neck/Misc/prosecutorbadge.rsi/icon.png new file mode 100644 index 00000000000..d3f712e8d76 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Neck/Misc/prosecutorbadge.rsi/icon.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Neck/Misc/prosecutorbadge.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/Neck/Misc/prosecutorbadge.rsi/meta.json new file mode 100644 index 00000000000..7f12698657f --- /dev/null +++ b/Resources/Textures/DeltaV/Clothing/Neck/Misc/prosecutorbadge.rsi/meta.json @@ -0,0 +1,18 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "sprites by leonardo_dabepis (Discord)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-NECK", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/DeltaV/Clothing/Neck/mantles/cjmantle.rsi/equipped-NECK.png b/Resources/Textures/DeltaV/Clothing/Neck/mantles/cjmantle.rsi/equipped-NECK.png new file mode 100644 index 00000000000..9a881bf0dd0 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Neck/mantles/cjmantle.rsi/equipped-NECK.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Neck/mantles/cjmantle.rsi/icon.png b/Resources/Textures/DeltaV/Clothing/Neck/mantles/cjmantle.rsi/icon.png new file mode 100644 index 00000000000..7fd93b7fd5b Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Neck/mantles/cjmantle.rsi/icon.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Neck/mantles/cjmantle.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/Neck/mantles/cjmantle.rsi/meta.json new file mode 100644 index 00000000000..a04b75dd785 --- /dev/null +++ b/Resources/Textures/DeltaV/Clothing/Neck/mantles/cjmantle.rsi/meta.json @@ -0,0 +1,18 @@ +{ + "version": 1, + "license": "CC0-1.0", + "copyright": "sprites by leonardo_dabepis (Discord)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-NECK", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/DeltaV/Clothing/OuterClothing/Coats/cjrobe.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/DeltaV/Clothing/OuterClothing/Coats/cjrobe.rsi/equipped-OUTERCLOTHING.png new file mode 100644 index 00000000000..7d77d8b53f9 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/OuterClothing/Coats/cjrobe.rsi/equipped-OUTERCLOTHING.png differ diff --git a/Resources/Textures/DeltaV/Clothing/OuterClothing/Coats/cjrobe.rsi/icon.png b/Resources/Textures/DeltaV/Clothing/OuterClothing/Coats/cjrobe.rsi/icon.png new file mode 100644 index 00000000000..eb6ff72244d Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/OuterClothing/Coats/cjrobe.rsi/icon.png differ diff --git a/Resources/Textures/DeltaV/Clothing/OuterClothing/Coats/cjrobe.rsi/inhand-left.png b/Resources/Textures/DeltaV/Clothing/OuterClothing/Coats/cjrobe.rsi/inhand-left.png new file mode 100644 index 00000000000..f7b9b21ebdb Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/OuterClothing/Coats/cjrobe.rsi/inhand-left.png differ diff --git a/Resources/Textures/DeltaV/Clothing/OuterClothing/Coats/cjrobe.rsi/inhand-right.png b/Resources/Textures/DeltaV/Clothing/OuterClothing/Coats/cjrobe.rsi/inhand-right.png new file mode 100644 index 00000000000..5d366f23d98 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/OuterClothing/Coats/cjrobe.rsi/inhand-right.png differ diff --git a/Resources/Textures/DeltaV/Clothing/OuterClothing/Coats/cjrobe.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/OuterClothing/Coats/cjrobe.rsi/meta.json new file mode 100644 index 00000000000..11ac46694ce --- /dev/null +++ b/Resources/Textures/DeltaV/Clothing/OuterClothing/Coats/cjrobe.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC0-1.0", + "copyright": "sprites by leonardo_dabepis (Discord)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-OUTERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/DeltaV/Clothing/OuterClothing/Vests/clerkvest.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/DeltaV/Clothing/OuterClothing/Vests/clerkvest.rsi/equipped-OUTERCLOTHING.png new file mode 100644 index 00000000000..a5575e393cc Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/OuterClothing/Vests/clerkvest.rsi/equipped-OUTERCLOTHING.png differ diff --git a/Resources/Textures/DeltaV/Clothing/OuterClothing/Vests/clerkvest.rsi/icon.png b/Resources/Textures/DeltaV/Clothing/OuterClothing/Vests/clerkvest.rsi/icon.png new file mode 100644 index 00000000000..443dbf1af97 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/OuterClothing/Vests/clerkvest.rsi/icon.png differ diff --git a/Resources/Textures/DeltaV/Clothing/OuterClothing/Vests/clerkvest.rsi/inhand-left.png b/Resources/Textures/DeltaV/Clothing/OuterClothing/Vests/clerkvest.rsi/inhand-left.png new file mode 100644 index 00000000000..cf49f4588a6 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/OuterClothing/Vests/clerkvest.rsi/inhand-left.png differ diff --git a/Resources/Textures/DeltaV/Clothing/OuterClothing/Vests/clerkvest.rsi/inhand-right.png b/Resources/Textures/DeltaV/Clothing/OuterClothing/Vests/clerkvest.rsi/inhand-right.png new file mode 100644 index 00000000000..c2e88069f8a Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/OuterClothing/Vests/clerkvest.rsi/inhand-right.png differ diff --git a/Resources/Textures/DeltaV/Clothing/OuterClothing/Vests/clerkvest.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/OuterClothing/Vests/clerkvest.rsi/meta.json new file mode 100644 index 00000000000..11ac46694ce --- /dev/null +++ b/Resources/Textures/DeltaV/Clothing/OuterClothing/Vests/clerkvest.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC0-1.0", + "copyright": "sprites by leonardo_dabepis (Discord)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-OUTERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/cj.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/cj.rsi/equipped-INNERCLOTHING.png new file mode 100644 index 00000000000..24c2af227bb Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/cj.rsi/equipped-INNERCLOTHING.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/cj.rsi/icon.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/cj.rsi/icon.png new file mode 100644 index 00000000000..77371a3ba8c Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/cj.rsi/icon.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/cj.rsi/inhand-left.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/cj.rsi/inhand-left.png new file mode 100644 index 00000000000..9b19bead358 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/cj.rsi/inhand-left.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/cj.rsi/inhand-right.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/cj.rsi/inhand-right.png new file mode 100644 index 00000000000..571ae1697c9 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/cj.rsi/inhand-right.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/cj.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/cj.rsi/meta.json new file mode 100644 index 00000000000..faf5084407b --- /dev/null +++ b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/cj.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC0-1.0", + "copyright": "sprites by leonardo_dabepis (Discord)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-INNERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/clerk.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/clerk.rsi/equipped-INNERCLOTHING.png new file mode 100644 index 00000000000..64e6927cf64 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/clerk.rsi/equipped-INNERCLOTHING.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/clerk.rsi/icon.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/clerk.rsi/icon.png new file mode 100644 index 00000000000..58a60bc768a Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/clerk.rsi/icon.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/clerk.rsi/inhand-left.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/clerk.rsi/inhand-left.png new file mode 100644 index 00000000000..5dcb8e026ee Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/clerk.rsi/inhand-left.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/clerk.rsi/inhand-right.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/clerk.rsi/inhand-right.png new file mode 100644 index 00000000000..5e7d3774518 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/clerk.rsi/inhand-right.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/clerk.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/clerk.rsi/meta.json new file mode 100644 index 00000000000..faf5084407b --- /dev/null +++ b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/clerk.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC0-1.0", + "copyright": "sprites by leonardo_dabepis (Discord)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-INNERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/prosecutorred.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/prosecutorred.rsi/equipped-INNERCLOTHING.png new file mode 100644 index 00000000000..a1ae36f2102 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/prosecutorred.rsi/equipped-INNERCLOTHING.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/prosecutorred.rsi/icon.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/prosecutorred.rsi/icon.png new file mode 100644 index 00000000000..5130d57e8cf Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/prosecutorred.rsi/icon.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/prosecutorred.rsi/inhand-left.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/prosecutorred.rsi/inhand-left.png new file mode 100644 index 00000000000..d04680f3ca6 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/prosecutorred.rsi/inhand-left.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/prosecutorred.rsi/inhand-right.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/prosecutorred.rsi/inhand-right.png new file mode 100644 index 00000000000..af7f24e84e4 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/prosecutorred.rsi/inhand-right.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/prosecutorred.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/prosecutorred.rsi/meta.json new file mode 100644 index 00000000000..322f9da00e0 --- /dev/null +++ b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/prosecutorred.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Heavily modified by leonardo_dabepis (Discord), original sprite taken from tgstation at commit https://github.com/tgstation/tgstation/commit/3a72dd925f7d6aeec620fe83bc4f88a3d7e5f693", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-INNERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj.rsi/equipped-INNERCLOTHING.png new file mode 100644 index 00000000000..b2e475bdbe1 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj.rsi/equipped-INNERCLOTHING.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj.rsi/icon.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj.rsi/icon.png new file mode 100644 index 00000000000..03f703a26cc Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj.rsi/icon.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj.rsi/inhand-left.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj.rsi/inhand-left.png new file mode 100644 index 00000000000..9b19bead358 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj.rsi/inhand-left.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj.rsi/inhand-right.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj.rsi/inhand-right.png new file mode 100644 index 00000000000..571ae1697c9 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj.rsi/inhand-right.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj.rsi/meta.json new file mode 100644 index 00000000000..faf5084407b --- /dev/null +++ b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC0-1.0", + "copyright": "sprites by leonardo_dabepis (Discord)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-INNERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj_white.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj_white.rsi/equipped-INNERCLOTHING.png new file mode 100644 index 00000000000..e735c5a2b21 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj_white.rsi/equipped-INNERCLOTHING.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj_white.rsi/icon.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj_white.rsi/icon.png new file mode 100644 index 00000000000..bf6ed67bc86 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj_white.rsi/icon.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj_white.rsi/inhand-left.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj_white.rsi/inhand-left.png new file mode 100644 index 00000000000..aa334048316 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj_white.rsi/inhand-left.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj_white.rsi/inhand-right.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj_white.rsi/inhand-right.png new file mode 100644 index 00000000000..deb205205ab Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj_white.rsi/inhand-right.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj_white.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj_white.rsi/meta.json new file mode 100644 index 00000000000..04451512800 --- /dev/null +++ b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj_white.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC0-1.0", + "copyright": "Taken from https://github.com/ParadiseSS13/Paradise/", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-INNERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cjformal.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cjformal.rsi/equipped-INNERCLOTHING.png new file mode 100644 index 00000000000..9caa2e705e7 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cjformal.rsi/equipped-INNERCLOTHING.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cjformal.rsi/icon.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cjformal.rsi/icon.png new file mode 100644 index 00000000000..0f2a20fa1ab Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cjformal.rsi/icon.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cjformal.rsi/inhand-left.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cjformal.rsi/inhand-left.png new file mode 100644 index 00000000000..4e73693046f Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cjformal.rsi/inhand-left.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cjformal.rsi/inhand-right.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cjformal.rsi/inhand-right.png new file mode 100644 index 00000000000..567d302dc52 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cjformal.rsi/inhand-right.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cjformal.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cjformal.rsi/meta.json new file mode 100644 index 00000000000..04451512800 --- /dev/null +++ b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cjformal.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC0-1.0", + "copyright": "Taken from https://github.com/ParadiseSS13/Paradise/", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-INNERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/clerk.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/clerk.rsi/equipped-INNERCLOTHING.png new file mode 100644 index 00000000000..330926db8c1 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/clerk.rsi/equipped-INNERCLOTHING.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/clerk.rsi/icon.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/clerk.rsi/icon.png new file mode 100644 index 00000000000..337c3132ca4 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/clerk.rsi/icon.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/clerk.rsi/inhand-left.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/clerk.rsi/inhand-left.png new file mode 100644 index 00000000000..5dcb8e026ee Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/clerk.rsi/inhand-left.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/clerk.rsi/inhand-right.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/clerk.rsi/inhand-right.png new file mode 100644 index 00000000000..5e7d3774518 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/clerk.rsi/inhand-right.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/clerk.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/clerk.rsi/meta.json new file mode 100644 index 00000000000..faf5084407b --- /dev/null +++ b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/clerk.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC0-1.0", + "copyright": "sprites by leonardo_dabepis (Discord)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-INNERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/prosecutorred.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/prosecutorred.rsi/equipped-INNERCLOTHING.png new file mode 100644 index 00000000000..f21dce44e2f Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/prosecutorred.rsi/equipped-INNERCLOTHING.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/prosecutorred.rsi/icon.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/prosecutorred.rsi/icon.png new file mode 100644 index 00000000000..0d2266c7ff7 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/prosecutorred.rsi/icon.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/prosecutorred.rsi/inhand-left.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/prosecutorred.rsi/inhand-left.png new file mode 100644 index 00000000000..d04680f3ca6 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/prosecutorred.rsi/inhand-left.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/prosecutorred.rsi/inhand-right.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/prosecutorred.rsi/inhand-right.png new file mode 100644 index 00000000000..af7f24e84e4 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/prosecutorred.rsi/inhand-right.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/prosecutorred.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/prosecutorred.rsi/meta.json new file mode 100644 index 00000000000..322f9da00e0 --- /dev/null +++ b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/prosecutorred.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Heavily modified by leonardo_dabepis (Discord), original sprite taken from tgstation at commit https://github.com/tgstation/tgstation/commit/3a72dd925f7d6aeec620fe83bc4f88a3d7e5f693", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-INNERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/DeltaV/Interface/Misc/job_icons.rsi/ChiefJustice.png b/Resources/Textures/DeltaV/Interface/Misc/job_icons.rsi/ChiefJustice.png new file mode 100644 index 00000000000..6cba0e4a93f Binary files /dev/null and b/Resources/Textures/DeltaV/Interface/Misc/job_icons.rsi/ChiefJustice.png differ diff --git a/Resources/Textures/DeltaV/Interface/Misc/job_icons.rsi/Clerk.png b/Resources/Textures/DeltaV/Interface/Misc/job_icons.rsi/Clerk.png new file mode 100644 index 00000000000..90e01b97cdf Binary files /dev/null and b/Resources/Textures/DeltaV/Interface/Misc/job_icons.rsi/Clerk.png differ diff --git a/Resources/Textures/DeltaV/Interface/Misc/job_icons.rsi/Lawyer.png b/Resources/Textures/DeltaV/Interface/Misc/job_icons.rsi/Lawyer.png new file mode 100644 index 00000000000..9ef5c305272 Binary files /dev/null and b/Resources/Textures/DeltaV/Interface/Misc/job_icons.rsi/Lawyer.png differ diff --git a/Resources/Textures/DeltaV/Interface/Misc/job_icons.rsi/Prosecutor.png b/Resources/Textures/DeltaV/Interface/Misc/job_icons.rsi/Prosecutor.png new file mode 100644 index 00000000000..997b29b2a44 Binary files /dev/null and b/Resources/Textures/DeltaV/Interface/Misc/job_icons.rsi/Prosecutor.png differ diff --git a/Resources/Textures/DeltaV/Interface/Misc/job_icons.rsi/meta.json b/Resources/Textures/DeltaV/Interface/Misc/job_icons.rsi/meta.json index 3f3c6b04e25..09d18e3ab7c 100644 --- a/Resources/Textures/DeltaV/Interface/Misc/job_icons.rsi/meta.json +++ b/Resources/Textures/DeltaV/Interface/Misc/job_icons.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/d917f4c2a088419d5c3aec7656b7ff8cebd1822e | nyanoPrisonGuard, nyanoMartialArtist, nyanoGladiator made by Floofers", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/d917f4c2a088419d5c3aec7656b7ff8cebd1822e | nyanoPrisonGuard, nyanoMartialArtist, nyanoGladiator made by Floofers | ChiefJustice, Clerk by leonardo_dabepis (Discord)", "size": { "x": 8, "y": 8 @@ -27,6 +27,18 @@ }, { "name": "MedicalBorg" + }, + { + "name": "ChiefJustice" + }, + { + "name": "Clerk" + }, + { + "name": "Prosecutor" + }, + { + "name": "Lawyer" } ] } diff --git a/Resources/Textures/DeltaV/Interface/Paper/paper_heading_warrant.svg b/Resources/Textures/DeltaV/Interface/Paper/paper_heading_warrant.svg new file mode 100644 index 00000000000..74e0876fb9a --- /dev/null +++ b/Resources/Textures/DeltaV/Interface/Paper/paper_heading_warrant.svg @@ -0,0 +1,127 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + diff --git a/Resources/Textures/DeltaV/Interface/Paper/paper_heading_warrant.svg.200dpi.png b/Resources/Textures/DeltaV/Interface/Paper/paper_heading_warrant.svg.200dpi.png new file mode 100644 index 00000000000..d13d8cf76b7 Binary files /dev/null and b/Resources/Textures/DeltaV/Interface/Paper/paper_heading_warrant.svg.200dpi.png differ diff --git a/Resources/Textures/Nyanotrasen/Interface/VerbIcons/dispel.png.yml b/Resources/Textures/DeltaV/Interface/Paper/paper_heading_warrant.svg.200dpi.png.yml similarity index 100% rename from Resources/Textures/Nyanotrasen/Interface/VerbIcons/dispel.png.yml rename to Resources/Textures/DeltaV/Interface/Paper/paper_heading_warrant.svg.200dpi.png.yml diff --git a/Resources/Textures/DeltaV/Markers/jobs.rsi/chiefjustice.png b/Resources/Textures/DeltaV/Markers/jobs.rsi/chiefjustice.png new file mode 100644 index 00000000000..b69ced20cf5 Binary files /dev/null and b/Resources/Textures/DeltaV/Markers/jobs.rsi/chiefjustice.png differ diff --git a/Resources/Textures/DeltaV/Markers/jobs.rsi/clerk.png b/Resources/Textures/DeltaV/Markers/jobs.rsi/clerk.png new file mode 100644 index 00000000000..5e6ce9fece5 Binary files /dev/null and b/Resources/Textures/DeltaV/Markers/jobs.rsi/clerk.png differ diff --git a/Resources/Textures/DeltaV/Markers/jobs.rsi/meta.json b/Resources/Textures/DeltaV/Markers/jobs.rsi/meta.json index 7e31fd29114..a7534b9ee5b 100644 --- a/Resources/Textures/DeltaV/Markers/jobs.rsi/meta.json +++ b/Resources/Textures/DeltaV/Markers/jobs.rsi/meta.json @@ -7,12 +7,21 @@ "y": 32 }, "states": [ + { + "name": "chiefjustice" + }, + { + "name": "clerk" + }, { "name": "nyanogladiator" }, { "name": "nyanoprisonguard" }, + { + "name": "prosecutor" + }, { "name": "nyanomailcarrier" }, diff --git a/Resources/Textures/DeltaV/Markers/jobs.rsi/prosecutor.png b/Resources/Textures/DeltaV/Markers/jobs.rsi/prosecutor.png new file mode 100644 index 00000000000..e384f90fb1b Binary files /dev/null and b/Resources/Textures/DeltaV/Markers/jobs.rsi/prosecutor.png differ diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Vulpkanin/tail_markings.rsi/corgi.png b/Resources/Textures/DeltaV/Mobs/Customization/Vulpkanin/tail_markings.rsi/corgi.png new file mode 100644 index 00000000000..fc9cb1c8917 Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Customization/Vulpkanin/tail_markings.rsi/corgi.png differ diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Vulpkanin/tail_markings.rsi/dalmatian.png b/Resources/Textures/DeltaV/Mobs/Customization/Vulpkanin/tail_markings.rsi/dalmatian.png new file mode 100644 index 00000000000..74d7e7cf9a2 Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Customization/Vulpkanin/tail_markings.rsi/dalmatian.png differ diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Vulpkanin/tail_markings.rsi/meta.json b/Resources/Textures/DeltaV/Mobs/Customization/Vulpkanin/tail_markings.rsi/meta.json index 15211a3bda6..2ae83a80f2e 100644 --- a/Resources/Textures/DeltaV/Mobs/Customization/Vulpkanin/tail_markings.rsi/meta.json +++ b/Resources/Textures/DeltaV/Mobs/Customization/Vulpkanin/tail_markings.rsi/meta.json @@ -96,6 +96,10 @@ "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, 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": "corgi", + "directions": 4 + }, { "name": "corgi_wag", "directions": 4, @@ -137,6 +141,10 @@ "name": "fluffy", "directions": 4 }, + { + "name": "dalmatian", + "directions": 4 + }, { "name": "dalmatian_wag", "directions": 4, diff --git a/Resources/Textures/DeltaV/Objects/Devices/encryption_keys.rsi/justice_label.png b/Resources/Textures/DeltaV/Objects/Devices/encryption_keys.rsi/justice_label.png new file mode 100644 index 00000000000..962d09200d0 Binary files /dev/null and b/Resources/Textures/DeltaV/Objects/Devices/encryption_keys.rsi/justice_label.png differ diff --git a/Resources/Textures/DeltaV/Objects/Devices/encryption_keys.rsi/meta.json b/Resources/Textures/DeltaV/Objects/Devices/encryption_keys.rsi/meta.json index 440000d647b..eb55c2b4e71 100644 --- a/Resources/Textures/DeltaV/Objects/Devices/encryption_keys.rsi/meta.json +++ b/Resources/Textures/DeltaV/Objects/Devices/encryption_keys.rsi/meta.json @@ -1,13 +1,14 @@ { "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Created by DangerRevolution for Space Station 14.", + "license": "CC0-1.0", + "copyright": "justice_label by leonardo_dabepis (Discord) | prisoner_label, crypt_orange Created by DangerRevolution for Space Station 14.", "size": { "x": 32, "y": 32 }, "states": [ - {"name": "prisoner_label"}, + {"name": "justice_label"}, + {"name": "prisoner_label"}, {"name": "crypt_orange"} ] -} \ No newline at end of file +} diff --git a/Resources/Textures/DeltaV/Objects/Devices/pda.rsi/meta.json b/Resources/Textures/DeltaV/Objects/Devices/pda.rsi/meta.json index 24d83ed6a04..176af077199 100644 --- a/Resources/Textures/DeltaV/Objects/Devices/pda.rsi/meta.json +++ b/Resources/Textures/DeltaV/Objects/Devices/pda.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/59f2a4e10e5ba36033c9734ddebfbbdc6157472d | pda-corpsman from yogstation at https://github.com/yogstation13/Yogstation/commit/a75671b22476ed8e117229f38501b9b63f8d6bc1 | pda-martialartist by Floofers", + "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/59f2a4e10e5ba36033c9734ddebfbbdc6157472d | pda-corpsman from yogstation at https://github.com/yogstation13/Yogstation/commit/a75671b22476ed8e117229f38501b9b63f8d6bc1 | pda-martialartist by Floofers | pda-chiefjustice and pda-clerk by leonardo_dabepis (Discord) | pda-prosecutor by Timemaster99 (Discord)", "size": { "x": 32, "y": 32 @@ -31,6 +31,15 @@ }, { "name": "pda-corpsman" + }, + { + "name": "pda-chiefjustice" + }, + { + "name": "pda-clerk" + }, + { + "name": "pda-prosecutor" } ] } diff --git a/Resources/Textures/DeltaV/Objects/Devices/pda.rsi/pda-chiefjustice.png b/Resources/Textures/DeltaV/Objects/Devices/pda.rsi/pda-chiefjustice.png new file mode 100644 index 00000000000..ec2543a97c4 Binary files /dev/null and b/Resources/Textures/DeltaV/Objects/Devices/pda.rsi/pda-chiefjustice.png differ diff --git a/Resources/Textures/DeltaV/Objects/Devices/pda.rsi/pda-clerk.png b/Resources/Textures/DeltaV/Objects/Devices/pda.rsi/pda-clerk.png new file mode 100644 index 00000000000..6f690e235d8 Binary files /dev/null and b/Resources/Textures/DeltaV/Objects/Devices/pda.rsi/pda-clerk.png differ diff --git a/Resources/Textures/DeltaV/Objects/Devices/pda.rsi/pda-prosecutor.png b/Resources/Textures/DeltaV/Objects/Devices/pda.rsi/pda-prosecutor.png new file mode 100644 index 00000000000..e44dcea1b57 Binary files /dev/null and b/Resources/Textures/DeltaV/Objects/Devices/pda.rsi/pda-prosecutor.png differ diff --git a/Resources/Textures/DeltaV/Objects/Misc/bureaucracy.rsi/meta.json b/Resources/Textures/DeltaV/Objects/Misc/bureaucracy.rsi/meta.json index 75c5548e647..5e2c34d5304 100644 --- a/Resources/Textures/DeltaV/Objects/Misc/bureaucracy.rsi/meta.json +++ b/Resources/Textures/DeltaV/Objects/Misc/bureaucracy.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/e1142f20f5e4661cb6845cfcf2dd69f864d67432 | modified by Floofers", + "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/e1142f20f5e4661cb6845cfcf2dd69f864d67432 | modified by Floofers. Stamp icon taken from tgstation at https://github.com/tgstation/tgstation/commit/fb1012102257b7b0a08d861fd2b8ba963c416e93, modified by leonardo_dabepis (Discord)", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/DeltaV/Objects/Misc/stamps.rsi/meta.json b/Resources/Textures/DeltaV/Objects/Misc/stamps.rsi/meta.json index 31a3b1bee37..d17e01e8bd9 100644 --- a/Resources/Textures/DeltaV/Objects/Misc/stamps.rsi/meta.json +++ b/Resources/Textures/DeltaV/Objects/Misc/stamps.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Stamp sprites taken from tgstation at commit https://github.com/tgstation/tgstation/commit/fb1012102257b7b0a08d861fd2b8ba963c416e93, modified by Guess-My-Name.", + "copyright": "Stamp sprites taken from tgstation at commit https://github.com/tgstation/tgstation/commit/fb1012102257b7b0a08d861fd2b8ba963c416e93, modified by Guess-My-Name. CJ stamp modified by Timemaster99 (Discord)", "size": { "x": 32, "y": 32 @@ -10,8 +10,14 @@ { "name": "stamp-lawyer" }, + { + "name": "stamp-notary" + }, { "name": "stamp-psychologist" + }, + { + "name": "stamp-cj" } ] } diff --git a/Resources/Textures/DeltaV/Objects/Misc/stamps.rsi/stamp-cj.png b/Resources/Textures/DeltaV/Objects/Misc/stamps.rsi/stamp-cj.png new file mode 100644 index 00000000000..3ca58c4bc60 Binary files /dev/null and b/Resources/Textures/DeltaV/Objects/Misc/stamps.rsi/stamp-cj.png differ diff --git a/Resources/Textures/DeltaV/Objects/Misc/stamps.rsi/stamp-notary.png b/Resources/Textures/DeltaV/Objects/Misc/stamps.rsi/stamp-notary.png new file mode 100644 index 00000000000..b726cab3d3a Binary files /dev/null and b/Resources/Textures/DeltaV/Objects/Misc/stamps.rsi/stamp-notary.png differ diff --git a/Resources/Textures/DeltaV/Objects/Specific/Justice/gavel.rsi/icon.png b/Resources/Textures/DeltaV/Objects/Specific/Justice/gavel.rsi/icon.png new file mode 100644 index 00000000000..3cf56d45371 Binary files /dev/null and b/Resources/Textures/DeltaV/Objects/Specific/Justice/gavel.rsi/icon.png differ diff --git a/Resources/Textures/DeltaV/Objects/Specific/Justice/gavel.rsi/inhand-left.png b/Resources/Textures/DeltaV/Objects/Specific/Justice/gavel.rsi/inhand-left.png new file mode 100644 index 00000000000..a41d27bcc71 Binary files /dev/null and b/Resources/Textures/DeltaV/Objects/Specific/Justice/gavel.rsi/inhand-left.png differ diff --git a/Resources/Textures/DeltaV/Objects/Specific/Justice/gavel.rsi/inhand-right.png b/Resources/Textures/DeltaV/Objects/Specific/Justice/gavel.rsi/inhand-right.png new file mode 100644 index 00000000000..cbabf3b291a Binary files /dev/null and b/Resources/Textures/DeltaV/Objects/Specific/Justice/gavel.rsi/inhand-right.png differ diff --git a/Resources/Textures/DeltaV/Objects/Specific/Justice/gavel.rsi/meta.json b/Resources/Textures/DeltaV/Objects/Specific/Justice/gavel.rsi/meta.json new file mode 100644 index 00000000000..39ff0ed9d9b --- /dev/null +++ b/Resources/Textures/DeltaV/Objects/Specific/Justice/gavel.rsi/meta.json @@ -0,0 +1,22 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Sprites sourced from https://github.com/tgstation/tgstation/pull/8495. In-hand sprites edited by Timemaster99 (Discord)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/DeltaV/Objects/Specific/Justice/gavelblock.rsi/icon.png b/Resources/Textures/DeltaV/Objects/Specific/Justice/gavelblock.rsi/icon.png new file mode 100644 index 00000000000..c1254bb8086 Binary files /dev/null and b/Resources/Textures/DeltaV/Objects/Specific/Justice/gavelblock.rsi/icon.png differ diff --git a/Resources/Textures/DeltaV/Objects/Specific/Justice/gavelblock.rsi/meta.json b/Resources/Textures/DeltaV/Objects/Specific/Justice/gavelblock.rsi/meta.json new file mode 100644 index 00000000000..5abad9b4225 --- /dev/null +++ b/Resources/Textures/DeltaV/Objects/Specific/Justice/gavelblock.rsi/meta.json @@ -0,0 +1,14 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Sprites sourced from https://github.com/tgstation/tgstation/pull/8495", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + } + ] +} diff --git a/Resources/Textures/DeltaV/Objects/Specific/Justice/trialtimer.rsi/meta.json b/Resources/Textures/DeltaV/Objects/Specific/Justice/trialtimer.rsi/meta.json new file mode 100644 index 00000000000..8081065c329 --- /dev/null +++ b/Resources/Textures/DeltaV/Objects/Specific/Justice/trialtimer.rsi/meta.json @@ -0,0 +1,14 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Original screen timer sprite by brainfood1183 (Github) for Space Station 14, modified by Leonardo_dabepis (Discord)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "trialtimer" + } + ] +} diff --git a/Resources/Textures/DeltaV/Objects/Specific/Justice/trialtimer.rsi/trialtimer.png b/Resources/Textures/DeltaV/Objects/Specific/Justice/trialtimer.rsi/trialtimer.png new file mode 100644 index 00000000000..34c8f1b90a9 Binary files /dev/null and b/Resources/Textures/DeltaV/Objects/Specific/Justice/trialtimer.rsi/trialtimer.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/assembly.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/assembly.png new file mode 100644 index 00000000000..056fcc5c141 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/assembly.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/bolted_unlit.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/bolted_unlit.png new file mode 100644 index 00000000000..6857f2a2415 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/bolted_unlit.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/closed.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/closed.png new file mode 100644 index 00000000000..04842eb1c7e Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/closed.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/closed_unlit.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/closed_unlit.png new file mode 100644 index 00000000000..c78d01c42d0 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/closed_unlit.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/closing.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/closing.png new file mode 100644 index 00000000000..fd27f05b3a2 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/closing.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/closing_unlit.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/closing_unlit.png new file mode 100644 index 00000000000..2a71f76d5d0 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/closing_unlit.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/deny_unlit.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/deny_unlit.png new file mode 100644 index 00000000000..7c56263f839 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/deny_unlit.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/emergency_unlit.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/emergency_unlit.png new file mode 100644 index 00000000000..817f2fb3f95 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/emergency_unlit.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/meta.json b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/meta.json new file mode 100644 index 00000000000..e4c020ff61d --- /dev/null +++ b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/meta.json @@ -0,0 +1,195 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c6e3401f2e7e1e55c57060cdf956a98ef1fefc24 and recolored by leonardo_dabepis (Discord)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "assembly" + }, + { + "name": "bolted_unlit" + }, + { + "name": "closed" + }, + { + "name": "closed_unlit" + }, + { + "name": "closing", + "delays": [ + [ + 0.1, + 0.1, + 0.07, + 0.07, + 0.07, + 0.2 + ] + ] + }, + { + "name": "closing_unlit", + "delays": [ + [ + 0.1, + 0.1, + 0.07, + 0.07, + 0.07, + 0.2 + ] + ] + }, + { + "name": "deny_unlit", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "open", + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "opening", + "delays": [ + [ + 0.1, + 0.1, + 0.07, + 0.07, + 0.07, + 0.2 + ] + ] + }, + { + "name": "opening_unlit", + "delays": [ + [ + 0.1, + 0.1, + 0.07, + 0.07, + 0.07, + 0.2 + ] + ] + }, + { + "name": "panel_closing", + "delays": [ + [ + 0.1, + 0.1, + 0.07, + 0.07, + 0.07, + 0.2 + ] + ] + }, + { + "name": "panel_open", + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "panel_opening", + "delays": [ + [ + 0.1, + 0.1, + 0.07, + 0.07, + 0.07, + 0.2 + ] + ] + }, + { + "name": "sparks", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "sparks_broken", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "sparks_damaged", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 1.7 + ] + ] + }, + { + "name": "sparks_open", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "welded" + }, + { + "name": "emergency_unlit", + "delays": [ + [ + 0.4, + 0.4 + ] + ] + } + ] +} diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/open.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/open.png new file mode 100644 index 00000000000..10d823bfe8d Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/open.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/opening.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/opening.png new file mode 100644 index 00000000000..540ccf3de45 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/opening.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/opening_unlit.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/opening_unlit.png new file mode 100644 index 00000000000..84933bd5ed9 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/opening_unlit.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/panel_closing.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/panel_closing.png new file mode 100644 index 00000000000..db7be0bc4a0 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/panel_closing.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/panel_open.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/panel_open.png new file mode 100644 index 00000000000..24eb2aedc22 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/panel_open.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/panel_opening.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/panel_opening.png new file mode 100644 index 00000000000..fc90acd637a Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/panel_opening.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/sparks.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/sparks.png new file mode 100644 index 00000000000..dd67e88a315 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/sparks.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/sparks_broken.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/sparks_broken.png new file mode 100644 index 00000000000..fb5d774588a Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/sparks_broken.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/sparks_damaged.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/sparks_damaged.png new file mode 100644 index 00000000000..f16a028dee5 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/sparks_damaged.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/sparks_open.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/sparks_open.png new file mode 100644 index 00000000000..630eabb976e Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/sparks_open.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/welded.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/welded.png new file mode 100644 index 00000000000..a0040dfdc73 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/welded.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/assembly.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/assembly.png new file mode 100644 index 00000000000..35efd5f6ddb Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/assembly.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/bolted_unlit.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/bolted_unlit.png new file mode 100644 index 00000000000..6857f2a2415 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/bolted_unlit.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/closed.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/closed.png new file mode 100644 index 00000000000..64e00a086dc Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/closed.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/closed_unlit.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/closed_unlit.png new file mode 100644 index 00000000000..c78d01c42d0 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/closed_unlit.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/closing.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/closing.png new file mode 100644 index 00000000000..2a33b5d48af Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/closing.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/closing_unlit.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/closing_unlit.png new file mode 100644 index 00000000000..2a71f76d5d0 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/closing_unlit.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/deny_unlit.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/deny_unlit.png new file mode 100644 index 00000000000..7c56263f839 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/deny_unlit.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/emergency_unlit.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/emergency_unlit.png new file mode 100644 index 00000000000..817f2fb3f95 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/emergency_unlit.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/meta.json b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/meta.json new file mode 100644 index 00000000000..e4c020ff61d --- /dev/null +++ b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/meta.json @@ -0,0 +1,195 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c6e3401f2e7e1e55c57060cdf956a98ef1fefc24 and recolored by leonardo_dabepis (Discord)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "assembly" + }, + { + "name": "bolted_unlit" + }, + { + "name": "closed" + }, + { + "name": "closed_unlit" + }, + { + "name": "closing", + "delays": [ + [ + 0.1, + 0.1, + 0.07, + 0.07, + 0.07, + 0.2 + ] + ] + }, + { + "name": "closing_unlit", + "delays": [ + [ + 0.1, + 0.1, + 0.07, + 0.07, + 0.07, + 0.2 + ] + ] + }, + { + "name": "deny_unlit", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "open", + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "opening", + "delays": [ + [ + 0.1, + 0.1, + 0.07, + 0.07, + 0.07, + 0.2 + ] + ] + }, + { + "name": "opening_unlit", + "delays": [ + [ + 0.1, + 0.1, + 0.07, + 0.07, + 0.07, + 0.2 + ] + ] + }, + { + "name": "panel_closing", + "delays": [ + [ + 0.1, + 0.1, + 0.07, + 0.07, + 0.07, + 0.2 + ] + ] + }, + { + "name": "panel_open", + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "panel_opening", + "delays": [ + [ + 0.1, + 0.1, + 0.07, + 0.07, + 0.07, + 0.2 + ] + ] + }, + { + "name": "sparks", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "sparks_broken", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "sparks_damaged", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 1.7 + ] + ] + }, + { + "name": "sparks_open", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "welded" + }, + { + "name": "emergency_unlit", + "delays": [ + [ + 0.4, + 0.4 + ] + ] + } + ] +} diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/open.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/open.png new file mode 100644 index 00000000000..0c731ca7960 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/open.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/opening.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/opening.png new file mode 100644 index 00000000000..e8e146a32d9 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/opening.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/opening_unlit.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/opening_unlit.png new file mode 100644 index 00000000000..84933bd5ed9 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/opening_unlit.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/panel_closing.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/panel_closing.png new file mode 100644 index 00000000000..db7be0bc4a0 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/panel_closing.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/panel_open.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/panel_open.png new file mode 100644 index 00000000000..24eb2aedc22 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/panel_open.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/panel_opening.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/panel_opening.png new file mode 100644 index 00000000000..fc90acd637a Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/panel_opening.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/sparks.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/sparks.png new file mode 100644 index 00000000000..dd67e88a315 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/sparks.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/sparks_broken.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/sparks_broken.png new file mode 100644 index 00000000000..fb5d774588a Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/sparks_broken.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/sparks_damaged.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/sparks_damaged.png new file mode 100644 index 00000000000..f16a028dee5 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/sparks_damaged.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/sparks_open.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/sparks_open.png new file mode 100644 index 00000000000..630eabb976e Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/sparks_open.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/welded.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/welded.png new file mode 100644 index 00000000000..a0040dfdc73 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/welded.png differ diff --git a/Resources/Textures/DeltaV/Structures/Wallmounts/signs.rsi/direction_court.png b/Resources/Textures/DeltaV/Structures/Wallmounts/signs.rsi/direction_court.png new file mode 100644 index 00000000000..dcb76fc2635 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Wallmounts/signs.rsi/direction_court.png differ diff --git a/Resources/Textures/DeltaV/Structures/Wallmounts/signs.rsi/direction_justice.png b/Resources/Textures/DeltaV/Structures/Wallmounts/signs.rsi/direction_justice.png new file mode 100644 index 00000000000..ef94a9998f3 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Wallmounts/signs.rsi/direction_justice.png differ diff --git a/Resources/Textures/DeltaV/Structures/Wallmounts/signs.rsi/meta.json b/Resources/Textures/DeltaV/Structures/Wallmounts/signs.rsi/meta.json index 0d38f6d8592..ab3feb6715c 100644 --- a/Resources/Textures/DeltaV/Structures/Wallmounts/signs.rsi/meta.json +++ b/Resources/Textures/DeltaV/Structures/Wallmounts/signs.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "directional sprites taken from https://github.com/space-wizards/space-station-14/commit/c1556214de46d66fe4057500e269b17438dc96ca | direction_mail modified by Hyenh, direction_logi modified by Floofers", + "copyright": "directional sprites taken from https://github.com/space-wizards/space-station-14/commit/c1556214de46d66fe4057500e269b17438dc96ca | direction_mail modified by Hyenh, direction_logi modified by Floofers | direction_court, direction_justice by leonardo_dabepis (Discord)", "size": { "x": 32, "y": 32 @@ -14,6 +14,14 @@ { "name": "direction_mail", "directions": 4 + }, + { + "name": "direction_court", + "directions": 4 + }, + { + "name": "direction_justice", + "directions": 4 } ] } \ No newline at end of file diff --git a/Resources/Textures/Interface/Actions/wagging.rsi/icon-on.png b/Resources/Textures/Interface/Actions/wagging.rsi/icon-on.png new file mode 100644 index 00000000000..4901ced9215 Binary files /dev/null and b/Resources/Textures/Interface/Actions/wagging.rsi/icon-on.png differ diff --git a/Resources/Textures/Interface/Actions/wagging.rsi/icon.png b/Resources/Textures/Interface/Actions/wagging.rsi/icon.png new file mode 100644 index 00000000000..6dbb54fe2f2 Binary files /dev/null and b/Resources/Textures/Interface/Actions/wagging.rsi/icon.png differ diff --git a/Resources/Textures/Interface/Actions/wagging.rsi/meta.json b/Resources/Textures/Interface/Actions/wagging.rsi/meta.json new file mode 100644 index 00000000000..022930052e5 --- /dev/null +++ b/Resources/Textures/Interface/Actions/wagging.rsi/meta.json @@ -0,0 +1,17 @@ +{ + "version": 1, + "license": "CC0-1.0", + "copyright": "Created by dootythefrooty (Discord 273243513800622090)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "icon-on" + } + ] +} diff --git a/Resources/Textures/Interface/Misc/health_icons.rsi/Critical.png b/Resources/Textures/Interface/Misc/health_icons.rsi/Critical.png index 779874eaaeb..15a49721745 100644 Binary files a/Resources/Textures/Interface/Misc/health_icons.rsi/Critical.png and b/Resources/Textures/Interface/Misc/health_icons.rsi/Critical.png differ diff --git a/Resources/Textures/Interface/Misc/health_icons.rsi/Dead.png b/Resources/Textures/Interface/Misc/health_icons.rsi/Dead.png index beceebd05cf..8cebd954186 100644 Binary files a/Resources/Textures/Interface/Misc/health_icons.rsi/Dead.png and b/Resources/Textures/Interface/Misc/health_icons.rsi/Dead.png differ diff --git a/Resources/Textures/Nyanotrasen/Interface/VerbIcons/dispel.png b/Resources/Textures/Interface/VerbIcons/dispel.png similarity index 100% rename from Resources/Textures/Nyanotrasen/Interface/VerbIcons/dispel.png rename to Resources/Textures/Interface/VerbIcons/dispel.png diff --git a/Resources/Textures/Nyanotrasen/Interface/VerbIcons/mass_sleep.png.yml b/Resources/Textures/Interface/VerbIcons/dispel.png.yml similarity index 100% rename from Resources/Textures/Nyanotrasen/Interface/VerbIcons/mass_sleep.png.yml rename to Resources/Textures/Interface/VerbIcons/dispel.png.yml diff --git a/Resources/Textures/Nyanotrasen/Interface/VerbIcons/license.txt b/Resources/Textures/Interface/VerbIcons/license.txt similarity index 100% rename from Resources/Textures/Nyanotrasen/Interface/VerbIcons/license.txt rename to Resources/Textures/Interface/VerbIcons/license.txt diff --git a/Resources/Textures/Nyanotrasen/Interface/VerbIcons/mass_sleep.png b/Resources/Textures/Interface/VerbIcons/mass_sleep.png similarity index 100% rename from Resources/Textures/Nyanotrasen/Interface/VerbIcons/mass_sleep.png rename to Resources/Textures/Interface/VerbIcons/mass_sleep.png diff --git a/Resources/Textures/Nyanotrasen/Interface/VerbIcons/metapsionic.png.yml b/Resources/Textures/Interface/VerbIcons/mass_sleep.png.yml similarity index 100% rename from Resources/Textures/Nyanotrasen/Interface/VerbIcons/metapsionic.png.yml rename to Resources/Textures/Interface/VerbIcons/mass_sleep.png.yml diff --git a/Resources/Textures/Nyanotrasen/Interface/VerbIcons/metapsionic.png b/Resources/Textures/Interface/VerbIcons/metapsionic.png similarity index 100% rename from Resources/Textures/Nyanotrasen/Interface/VerbIcons/metapsionic.png rename to Resources/Textures/Interface/VerbIcons/metapsionic.png diff --git a/Resources/Textures/Nyanotrasen/Interface/VerbIcons/mind_swap.png.yml b/Resources/Textures/Interface/VerbIcons/metapsionic.png.yml similarity index 100% rename from Resources/Textures/Nyanotrasen/Interface/VerbIcons/mind_swap.png.yml rename to Resources/Textures/Interface/VerbIcons/metapsionic.png.yml diff --git a/Resources/Textures/Nyanotrasen/Interface/VerbIcons/mind_swap.png b/Resources/Textures/Interface/VerbIcons/mind_swap.png similarity index 100% rename from Resources/Textures/Nyanotrasen/Interface/VerbIcons/mind_swap.png rename to Resources/Textures/Interface/VerbIcons/mind_swap.png diff --git a/Resources/Textures/Nyanotrasen/Interface/VerbIcons/mind_swap_return.png.yml b/Resources/Textures/Interface/VerbIcons/mind_swap.png.yml similarity index 100% rename from Resources/Textures/Nyanotrasen/Interface/VerbIcons/mind_swap_return.png.yml rename to Resources/Textures/Interface/VerbIcons/mind_swap.png.yml diff --git a/Resources/Textures/Nyanotrasen/Interface/VerbIcons/mind_swap_return.png b/Resources/Textures/Interface/VerbIcons/mind_swap_return.png similarity index 100% rename from Resources/Textures/Nyanotrasen/Interface/VerbIcons/mind_swap_return.png rename to Resources/Textures/Interface/VerbIcons/mind_swap_return.png diff --git a/Resources/Textures/Nyanotrasen/Interface/VerbIcons/noospheric_zap.png.yml b/Resources/Textures/Interface/VerbIcons/mind_swap_return.png.yml similarity index 100% rename from Resources/Textures/Nyanotrasen/Interface/VerbIcons/noospheric_zap.png.yml rename to Resources/Textures/Interface/VerbIcons/mind_swap_return.png.yml diff --git a/Resources/Textures/Nyanotrasen/Interface/VerbIcons/noospheric_zap.png b/Resources/Textures/Interface/VerbIcons/noospheric_zap.png similarity index 100% rename from Resources/Textures/Nyanotrasen/Interface/VerbIcons/noospheric_zap.png rename to Resources/Textures/Interface/VerbIcons/noospheric_zap.png diff --git a/Resources/Textures/Nyanotrasen/Interface/VerbIcons/psionic_invisibility.png.yml b/Resources/Textures/Interface/VerbIcons/noospheric_zap.png.yml similarity index 100% rename from Resources/Textures/Nyanotrasen/Interface/VerbIcons/psionic_invisibility.png.yml rename to Resources/Textures/Interface/VerbIcons/noospheric_zap.png.yml diff --git a/Resources/Textures/Nyanotrasen/Interface/VerbIcons/psionic_invisibility.png b/Resources/Textures/Interface/VerbIcons/psionic_invisibility.png similarity index 100% rename from Resources/Textures/Nyanotrasen/Interface/VerbIcons/psionic_invisibility.png rename to Resources/Textures/Interface/VerbIcons/psionic_invisibility.png diff --git a/Resources/Textures/Nyanotrasen/Interface/VerbIcons/psionic_invisibility_off.png.yml b/Resources/Textures/Interface/VerbIcons/psionic_invisibility.png.yml similarity index 100% rename from Resources/Textures/Nyanotrasen/Interface/VerbIcons/psionic_invisibility_off.png.yml rename to Resources/Textures/Interface/VerbIcons/psionic_invisibility.png.yml diff --git a/Resources/Textures/Nyanotrasen/Interface/VerbIcons/psionic_invisibility_off.png b/Resources/Textures/Interface/VerbIcons/psionic_invisibility_off.png similarity index 100% rename from Resources/Textures/Nyanotrasen/Interface/VerbIcons/psionic_invisibility_off.png rename to Resources/Textures/Interface/VerbIcons/psionic_invisibility_off.png diff --git a/Resources/Textures/Nyanotrasen/Interface/VerbIcons/psionic_regeneration.png.yml b/Resources/Textures/Interface/VerbIcons/psionic_invisibility_off.png.yml similarity index 100% rename from Resources/Textures/Nyanotrasen/Interface/VerbIcons/psionic_regeneration.png.yml rename to Resources/Textures/Interface/VerbIcons/psionic_invisibility_off.png.yml diff --git a/Resources/Textures/Nyanotrasen/Interface/VerbIcons/psionic_regeneration.png b/Resources/Textures/Interface/VerbIcons/psionic_regeneration.png similarity index 100% rename from Resources/Textures/Nyanotrasen/Interface/VerbIcons/psionic_regeneration.png rename to Resources/Textures/Interface/VerbIcons/psionic_regeneration.png diff --git a/Resources/Textures/Nyanotrasen/Interface/VerbIcons/pyrokinesis.png.yml b/Resources/Textures/Interface/VerbIcons/psionic_regeneration.png.yml similarity index 100% rename from Resources/Textures/Nyanotrasen/Interface/VerbIcons/pyrokinesis.png.yml rename to Resources/Textures/Interface/VerbIcons/psionic_regeneration.png.yml diff --git a/Resources/Textures/Nyanotrasen/Interface/VerbIcons/pyrokinesis.png b/Resources/Textures/Interface/VerbIcons/pyrokinesis.png similarity index 100% rename from Resources/Textures/Nyanotrasen/Interface/VerbIcons/pyrokinesis.png rename to Resources/Textures/Interface/VerbIcons/pyrokinesis.png diff --git a/Resources/Textures/Nyanotrasen/Interface/VerbIcons/telegnosis.png.yml b/Resources/Textures/Interface/VerbIcons/pyrokinesis.png.yml similarity index 100% rename from Resources/Textures/Nyanotrasen/Interface/VerbIcons/telegnosis.png.yml rename to Resources/Textures/Interface/VerbIcons/pyrokinesis.png.yml diff --git a/Resources/Textures/Nyanotrasen/Interface/VerbIcons/telegnosis.png b/Resources/Textures/Interface/VerbIcons/telegnosis.png similarity index 100% rename from Resources/Textures/Nyanotrasen/Interface/VerbIcons/telegnosis.png rename to Resources/Textures/Interface/VerbIcons/telegnosis.png diff --git a/Resources/Textures/Interface/VerbIcons/telegnosis.png.yml b/Resources/Textures/Interface/VerbIcons/telegnosis.png.yml new file mode 100644 index 00000000000..5c43e233050 --- /dev/null +++ b/Resources/Textures/Interface/VerbIcons/telegnosis.png.yml @@ -0,0 +1,2 @@ +sample: + filter: true diff --git a/Resources/Textures/Mobs/Aliens/Xenos/rouny.rsi/crit.png b/Resources/Textures/Mobs/Aliens/Xenos/rouny.rsi/crit.png index 0be8b9b1ddb..23a7ec0af6c 100644 Binary files a/Resources/Textures/Mobs/Aliens/Xenos/rouny.rsi/crit.png and b/Resources/Textures/Mobs/Aliens/Xenos/rouny.rsi/crit.png differ diff --git a/Resources/Textures/Mobs/Aliens/Xenos/rouny.rsi/dead.png b/Resources/Textures/Mobs/Aliens/Xenos/rouny.rsi/dead.png index 2761d22dbf7..cd355b61529 100644 Binary files a/Resources/Textures/Mobs/Aliens/Xenos/rouny.rsi/dead.png and b/Resources/Textures/Mobs/Aliens/Xenos/rouny.rsi/dead.png differ diff --git a/Resources/Textures/Mobs/Aliens/Xenos/rouny.rsi/meta.json b/Resources/Textures/Mobs/Aliens/Xenos/rouny.rsi/meta.json index ce2209e72dd..cc020d01c46 100644 --- a/Resources/Textures/Mobs/Aliens/Xenos/rouny.rsi/meta.json +++ b/Resources/Textures/Mobs/Aliens/Xenos/rouny.rsi/meta.json @@ -1,24 +1,24 @@ { - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "https://github.com/tgstation/TerraGov-Marine-Corps/blob/a2034543920664ddf0c0f3c681bf1d8003dc2ade/icons/Xeno/2x2_Xenos.dmi", - "size": { - "x": 64, - "y": 64 - }, - "states": [ - { - "name": "running", - "directions": 4 + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "DakoDragon, discord ID: 56038550335922176", + "size": { + "x": 64, + "y": 64 }, - { - "name": "sleeping" - }, - { - "name": "dead" - }, - { - "name": "crit" - } - ] + "states": [ + { + "name": "running", + "directions": 4 + }, + { + "name": "sleeping" + }, + { + "name": "dead" + }, + { + "name": "crit" + } + ] } diff --git a/Resources/Textures/Mobs/Aliens/Xenos/rouny.rsi/running.png b/Resources/Textures/Mobs/Aliens/Xenos/rouny.rsi/running.png index 2bbe1c603eb..1438285113f 100644 Binary files a/Resources/Textures/Mobs/Aliens/Xenos/rouny.rsi/running.png and b/Resources/Textures/Mobs/Aliens/Xenos/rouny.rsi/running.png differ diff --git a/Resources/Textures/Mobs/Aliens/Xenos/rouny.rsi/sleeping.png b/Resources/Textures/Mobs/Aliens/Xenos/rouny.rsi/sleeping.png index 06ff2250d0e..9221665dd85 100644 Binary files a/Resources/Textures/Mobs/Aliens/Xenos/rouny.rsi/sleeping.png and b/Resources/Textures/Mobs/Aliens/Xenos/rouny.rsi/sleeping.png differ diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/forked_long.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/forked_long.png new file mode 100644 index 00000000000..280768b40af Binary files /dev/null and b/Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/forked_long.png differ diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/haven_tone_1.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/haven_tone_1.png new file mode 100644 index 00000000000..e818e7dd11e Binary files /dev/null and b/Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/haven_tone_1.png differ diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/haven_tone_2.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/haven_tone_2.png new file mode 100644 index 00000000000..fe98ec53eb2 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/haven_tone_2.png differ diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/meta.json b/Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/meta.json index f33401617c0..94795a626ea 100644 --- a/Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/meta.json +++ b/Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Phoenix and Rooster by @leonardo_dabepis, Finch & Forked Tailfin by @stillxicarus", + "copyright": "Phoenix and Rooster by @leonardo_dabepis, Finch & Forked Tailfin by @stillxicarus, haven & forked_long & swallow by @Kilath", "size": { "x": 32, "y": 32 @@ -22,6 +22,22 @@ { "name": "whitescale_forked_tailfin", "directions": 4 + }, + { + "name": "haven_tone_1", + "directions": 4 + }, + { + "name": "haven_tone_2", + "directions": 4 + }, + { + "name": "forked_long", + "directions": 4 + }, + { + "name": "swallow_tail", + "directions": 4 } ] } diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/swallow_tail.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/swallow_tail.png new file mode 100644 index 00000000000..f9187b66f84 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/swallow_tail.png differ diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/bat_wings_tone_1.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/bat_wings_tone_1.png new file mode 100644 index 00000000000..a147739cc90 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/bat_wings_tone_1.png differ diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/bat_wings_tone_2.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/bat_wings_tone_2.png new file mode 100644 index 00000000000..b2170ff803c Binary files /dev/null and b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/bat_wings_tone_2.png differ diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/bionic_wings_tone_1.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/bionic_wings_tone_1.png new file mode 100644 index 00000000000..752d6cc9a20 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/bionic_wings_tone_1.png differ diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/bionic_wings_tone_2.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/bionic_wings_tone_2.png new file mode 100644 index 00000000000..528b5cbfa04 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/bionic_wings_tone_2.png differ diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/meta.json b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/meta.json index 7737af0afc2..c8bf28767a8 100644 --- a/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/meta.json +++ b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/meta.json @@ -5,7 +5,7 @@ "y": 32 }, "license": "CC-BY-SA-3.0", - "copyright": "classicharpy Taken from S.P.L.U.R.T at commit https://github.com/SPLURT-Station/S.P.L.U.R.T-Station-13/commit/285f6f86ac41a6246f250993486effeab8581c2c, edited by @raistlin_jag | harpyfolded, harpy, and owl by @stillxicarus", + "copyright": "classicharpy Taken from S.P.L.U.R.T at commit https://github.com/SPLURT-Station/S.P.L.U.R.T-Station-13/commit/285f6f86ac41a6246f250993486effeab8581c2c, edited by @raistlin_jag | harpyfolded, harpy, and owl by @stillxicarus, bat wings by @Kilath", "states": [ { "name": "huescale_harpy", @@ -78,6 +78,22 @@ { "name": "whitescale_harpy_wing_owl", "directions": 4 + }, + { + "name": "bat_wings_tone_1", + "directions": 4 + }, + { + "name": "bat_wings_tone_2", + "directions": 4 + }, + { + "name": "bionic_wings_tone_1", + "directions": 4 + }, + { + "name": "bionic_wings_tone_2", + "directions": 4 } ] } diff --git a/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/female_full.png b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/female_full.png new file mode 100644 index 00000000000..acb96562e73 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/female_full.png differ diff --git a/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/female_none.png b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/female_none.png new file mode 100644 index 00000000000..20ccfaa8db4 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/female_none.png differ diff --git a/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/female_top.png b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/female_top.png new file mode 100644 index 00000000000..acb96562e73 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/female_top.png differ diff --git a/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/full.png b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/full.png new file mode 100644 index 00000000000..20ccfaa8db4 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/full.png differ diff --git a/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/male_full.png b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/male_full.png new file mode 100644 index 00000000000..20ccfaa8db4 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/male_full.png differ diff --git a/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/male_none.png b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/male_none.png new file mode 100644 index 00000000000..20ccfaa8db4 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/male_none.png differ diff --git a/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/male_top.png b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/male_top.png new file mode 100644 index 00000000000..20ccfaa8db4 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/male_top.png differ diff --git a/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/meta.json b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/meta.json new file mode 100644 index 00000000000..b44be570c4f --- /dev/null +++ b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/meta.json @@ -0,0 +1,59 @@ +{ + "version": 1, + "copyright": "Rane", + "license": "CC-BY-SA-3.0", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "female_none", + "directions": 4 + }, + { + "name": "female_full", + "directions": 4 + }, + { + "name": "female_top", + "directions": 4 + }, + { + "name": "male_none", + "directions": 4 + }, + { + "name": "male_full", + "directions": 4 + }, + { + "name": "male_top", + "directions": 4 + }, + { + "name": "full", + "directions": 4 + }, + { + "name": "none", + "directions": 4 + }, + { + "name": "top", + "directions": 4 + }, + { + "name": "unisex_full", + "directions": 4 + }, + { + "name": "unisex_none", + "directions": 4 + }, + { + "name": "unisex_top", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/none.png b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/none.png new file mode 100644 index 00000000000..20ccfaa8db4 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/none.png differ diff --git a/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/top.png b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/top.png new file mode 100644 index 00000000000..20ccfaa8db4 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/top.png differ diff --git a/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/unisex_full.png b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/unisex_full.png new file mode 100644 index 00000000000..20ccfaa8db4 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/unisex_full.png differ diff --git a/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/unisex_none.png b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/unisex_none.png new file mode 100644 index 00000000000..20ccfaa8db4 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/unisex_none.png differ diff --git a/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/unisex_top.png b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/unisex_top.png new file mode 100644 index 00000000000..20ccfaa8db4 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/unisex_top.png differ diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_alt1.rsi/head.png b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_alt1.rsi/head.png new file mode 100644 index 00000000000..81c98564b9a Binary files /dev/null and b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_alt1.rsi/head.png differ diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_alt1.rsi/meta.json b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_alt1.rsi/meta.json new file mode 100644 index 00000000000..9f87381cd87 --- /dev/null +++ b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_alt1.rsi/meta.json @@ -0,0 +1,15 @@ +{ + "version": 1, + "copyright": "Sprites from Paradise Station (https://github.com/ParadiseSS13/Paradise)", + "license": "CC-BY-SA-3.0", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "head", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/head.png b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/head.png new file mode 100644 index 00000000000..a89de820f47 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/head.png differ diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/l_arm-primary.png b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/l_arm-primary.png new file mode 100644 index 00000000000..5d6b133523b Binary files /dev/null and b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/l_arm-primary.png differ diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/l_arm-secondary.png b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/l_arm-secondary.png new file mode 100644 index 00000000000..de40773897f Binary files /dev/null and b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/l_arm-secondary.png differ diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/l_arm-tertiary.png b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/l_arm-tertiary.png new file mode 100644 index 00000000000..7b83ecf161b Binary files /dev/null and b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/l_arm-tertiary.png differ diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/l_foot.png b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/l_foot.png new file mode 100644 index 00000000000..534085a97c3 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/l_foot.png differ diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/l_hand.png b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/l_hand.png new file mode 100644 index 00000000000..771cd025a86 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/l_hand.png differ diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/l_leg-primary.png b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/l_leg-primary.png new file mode 100644 index 00000000000..05f568654e6 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/l_leg-primary.png differ diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/l_leg-secondary.png b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/l_leg-secondary.png new file mode 100644 index 00000000000..a96f9eb3854 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/l_leg-secondary.png differ diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/meta.json b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/meta.json new file mode 100644 index 00000000000..a3e6753cc44 --- /dev/null +++ b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/meta.json @@ -0,0 +1,79 @@ +{ + "version": 1, + "copyright": "Sprites originally from Paradise Station (https://github.com/ParadiseSS13/Paradise). Monochromatic version made by: DayOS (https://github.com/Day-OS)", + "license": "CC-BY-SA-3.0", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "l_foot", + "directions": 4 + }, + { + "name": "r_foot", + "directions": 4 + }, + { + "name": "l_leg-primary", + "directions": 4 + }, + { + "name": "l_leg-secondary", + "directions": 4 + }, + { + "name": "r_leg-primary", + "directions": 4 + }, + { + "name": "r_leg-secondary", + "directions": 4 + }, + { + "name": "torso-primary", + "directions": 4 + }, + { + "name": "torso-secondary", + "directions": 4 + }, + { + "name": "l_arm-primary", + "directions": 4 + }, + { + "name": "l_arm-secondary", + "directions": 4 + }, + { + "name": "l_arm-tertiary", + "directions": 4 + }, + { + "name": "r_arm-primary", + "directions": 4 + }, + { + "name": "r_arm-secondary", + "directions": 4 + }, + { + "name": "r_arm-tertiary", + "directions": 4 + }, + { + "name": "l_hand", + "directions": 4 + }, + { + "name": "r_hand", + "directions": 4 + }, + { + "name": "head", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/r_arm-primary.png b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/r_arm-primary.png new file mode 100644 index 00000000000..c8087d3fc19 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/r_arm-primary.png differ diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/r_arm-secondary.png b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/r_arm-secondary.png new file mode 100644 index 00000000000..2cf2346bd84 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/r_arm-secondary.png differ diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/r_arm-tertiary.png b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/r_arm-tertiary.png new file mode 100644 index 00000000000..0b5cecfd6c3 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/r_arm-tertiary.png differ diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/r_foot.png b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/r_foot.png new file mode 100644 index 00000000000..a8fbe8635ea Binary files /dev/null and b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/r_foot.png differ diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/r_hand.png b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/r_hand.png new file mode 100644 index 00000000000..db11be34056 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/r_hand.png differ diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/r_leg-primary.png b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/r_leg-primary.png new file mode 100644 index 00000000000..d6288eedc3c Binary files /dev/null and b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/r_leg-primary.png differ diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/r_leg-secondary.png b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/r_leg-secondary.png new file mode 100644 index 00000000000..7a406c93187 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/r_leg-secondary.png differ diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/torso-primary.png b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/torso-primary.png new file mode 100644 index 00000000000..08cabfc99dc Binary files /dev/null and b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/torso-primary.png differ diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/torso-secondary.png b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/torso-secondary.png new file mode 100644 index 00000000000..4e61c144a95 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/torso-secondary.png differ diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_monitor.rsi/head-2.png b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_monitor.rsi/head-2.png new file mode 100644 index 00000000000..ca3cb6e9e36 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_monitor.rsi/head-2.png differ diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_monitor.rsi/head.png b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_monitor.rsi/head.png new file mode 100644 index 00000000000..a175f4dfcec Binary files /dev/null and b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_monitor.rsi/head.png differ diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_monitor.rsi/meta.json b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_monitor.rsi/meta.json new file mode 100644 index 00000000000..ea5456fea10 --- /dev/null +++ b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_monitor.rsi/meta.json @@ -0,0 +1,19 @@ +{ + "version": 1, + "copyright": "Sprites originally from Paradise Station (https://github.com/ParadiseSS13/Paradise). Monochromatic version made by: DayOS (https://github.com/Day-OS)", + "license": "CC-BY-SA-3.0", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "head", + "directions": 4 + }, + { + "name": "head-2", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_alt1.rsi/head.png b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_alt1.rsi/head.png new file mode 100644 index 00000000000..b6446e6a6d2 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_alt1.rsi/head.png differ diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_alt1.rsi/meta.json b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_alt1.rsi/meta.json new file mode 100644 index 00000000000..9f87381cd87 --- /dev/null +++ b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_alt1.rsi/meta.json @@ -0,0 +1,15 @@ +{ + "version": 1, + "copyright": "Sprites from Paradise Station (https://github.com/ParadiseSS13/Paradise)", + "license": "CC-BY-SA-3.0", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "head", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/l_arm-1.png b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/l_arm-1.png new file mode 100644 index 00000000000..54ecbe28321 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/l_arm-1.png differ diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/l_arm-2.png b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/l_arm-2.png new file mode 100644 index 00000000000..c9a529d9ebb Binary files /dev/null and b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/l_arm-2.png differ diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/l_foot-1.png b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/l_foot-1.png new file mode 100644 index 00000000000..a4e96f5d745 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/l_foot-1.png differ diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/l_foot-2.png b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/l_foot-2.png new file mode 100644 index 00000000000..6be2024018b Binary files /dev/null and b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/l_foot-2.png differ diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/l_hand-1.png b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/l_hand-1.png new file mode 100644 index 00000000000..87466284b3b Binary files /dev/null and b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/l_hand-1.png differ diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/l_hand-2.png b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/l_hand-2.png new file mode 100644 index 00000000000..b871a179333 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/l_hand-2.png differ diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/l_leg-1.png b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/l_leg-1.png new file mode 100644 index 00000000000..880384f5ee9 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/l_leg-1.png differ diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/l_leg-2.png b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/l_leg-2.png new file mode 100644 index 00000000000..90b10eb4be5 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/l_leg-2.png differ diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/meta.json b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/meta.json new file mode 100644 index 00000000000..9f4ca1ee51f --- /dev/null +++ b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/meta.json @@ -0,0 +1,83 @@ +{ + "version": 1, + "copyright": "Sprites originally from Paradise Station (https://github.com/ParadiseSS13/Paradise). Monochromatic version made by: DayOS (https://github.com/Day-OS)", + "license": "CC-BY-SA-3.0", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "l_foot-1", + "directions": 4 + }, + { + "name": "l_foot-2", + "directions": 4 + }, + { + "name": "r_foot-1", + "directions": 4 + }, + { + "name": "r_foot-2", + "directions": 4 + }, + { + "name": "l_leg-1", + "directions": 4 + }, + { + "name": "l_leg-2", + "directions": 4 + }, + { + "name": "r_leg-1", + "directions": 4 + }, + { + "name": "r_leg-2", + "directions": 4 + }, + { + "name": "torso-1", + "directions": 4 + }, + { + "name": "torso-2", + "directions": 4 + }, + { + "name": "l_arm-1", + "directions": 4 + }, + { + "name": "l_arm-2", + "directions": 4 + }, + { + "name": "r_arm-1", + "directions": 4 + }, + { + "name": "r_arm-2", + "directions": 4 + }, + { + "name": "l_hand-1", + "directions": 4 + }, + { + "name": "l_hand-2", + "directions": 4 + }, + { + "name": "r_hand-1", + "directions": 4 + }, + { + "name": "r_hand-2", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/r_arm-1.png b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/r_arm-1.png new file mode 100644 index 00000000000..5e770056ed9 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/r_arm-1.png differ diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/r_arm-2.png b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/r_arm-2.png new file mode 100644 index 00000000000..56b363d862a Binary files /dev/null and b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/r_arm-2.png differ diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/r_foot-1.png b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/r_foot-1.png new file mode 100644 index 00000000000..8994994011c Binary files /dev/null and b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/r_foot-1.png differ diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/r_foot-2.png b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/r_foot-2.png new file mode 100644 index 00000000000..9ca884025fd Binary files /dev/null and b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/r_foot-2.png differ diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/r_hand-1.png b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/r_hand-1.png new file mode 100644 index 00000000000..13a46c2e092 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/r_hand-1.png differ diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/r_hand-2.png b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/r_hand-2.png new file mode 100644 index 00000000000..d203e571fca Binary files /dev/null and b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/r_hand-2.png differ diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/r_leg-1.png b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/r_leg-1.png new file mode 100644 index 00000000000..bb762db0c49 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/r_leg-1.png differ diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/r_leg-2.png b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/r_leg-2.png new file mode 100644 index 00000000000..16f0ee16471 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/r_leg-2.png differ diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/torso-1.png b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/torso-1.png new file mode 100644 index 00000000000..45fb93052e4 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/torso-1.png differ diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/torso-2.png b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/torso-2.png new file mode 100644 index 00000000000..a8782ac3b04 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/torso-2.png differ diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_monitor.rsi/head-1.png b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_monitor.rsi/head-1.png new file mode 100644 index 00000000000..21e0ccbbcb8 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_monitor.rsi/head-1.png differ diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_monitor.rsi/head-2.png b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_monitor.rsi/head-2.png new file mode 100644 index 00000000000..0d351d8822a Binary files /dev/null and b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_monitor.rsi/head-2.png differ diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_monitor.rsi/meta.json b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_monitor.rsi/meta.json new file mode 100644 index 00000000000..9d2654d15cb --- /dev/null +++ b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_monitor.rsi/meta.json @@ -0,0 +1,19 @@ +{ + "version": 1, + "copyright": "Sprites originally from Paradise Station (https://github.com/ParadiseSS13/Paradise). Monochromatic version made by: DayOS (https://github.com/Day-OS)", + "license": "CC-BY-SA-3.0", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "head-1", + "directions": 4 + }, + { + "name": "head-2", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Mobs/Customization/makeup.rsi/blush.png b/Resources/Textures/Mobs/Customization/makeup.rsi/blush.png new file mode 100644 index 00000000000..9e672df8c31 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/makeup.rsi/blush.png differ diff --git a/Resources/Textures/Mobs/Customization/makeup.rsi/lips.png b/Resources/Textures/Mobs/Customization/makeup.rsi/lips.png new file mode 100644 index 00000000000..1e5034a92fb Binary files /dev/null and b/Resources/Textures/Mobs/Customization/makeup.rsi/lips.png differ diff --git a/Resources/Textures/Mobs/Customization/makeup.rsi/meta.json b/Resources/Textures/Mobs/Customization/makeup.rsi/meta.json new file mode 100644 index 00000000000..422f1eec834 --- /dev/null +++ b/Resources/Textures/Mobs/Customization/makeup.rsi/meta.json @@ -0,0 +1,35 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Sprites by angelofallars (github)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "lips", + "directions": 4 + }, + { + "name": "blush", + "directions": 4 + }, + { + "name": "nail_polish_l", + "directions": 4 + }, + { + "name": "nail_polish_r", + "directions": 4 + }, + { + "name": "moth_lips", + "directions": 4 + }, + { + "name": "moth_blush", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Mobs/Customization/makeup.rsi/moth_blush.png b/Resources/Textures/Mobs/Customization/makeup.rsi/moth_blush.png new file mode 100644 index 00000000000..c66a862be01 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/makeup.rsi/moth_blush.png differ diff --git a/Resources/Textures/Mobs/Customization/makeup.rsi/moth_lips.png b/Resources/Textures/Mobs/Customization/makeup.rsi/moth_lips.png new file mode 100644 index 00000000000..72c6f57c6ef Binary files /dev/null and b/Resources/Textures/Mobs/Customization/makeup.rsi/moth_lips.png differ diff --git a/Resources/Textures/Mobs/Customization/makeup.rsi/nail_polish_l.png b/Resources/Textures/Mobs/Customization/makeup.rsi/nail_polish_l.png new file mode 100644 index 00000000000..73175b4e2c8 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/makeup.rsi/nail_polish_l.png differ diff --git a/Resources/Textures/Mobs/Customization/makeup.rsi/nail_polish_r.png b/Resources/Textures/Mobs/Customization/makeup.rsi/nail_polish_r.png new file mode 100644 index 00000000000..6ce26ba4aec Binary files /dev/null and b/Resources/Textures/Mobs/Customization/makeup.rsi/nail_polish_r.png differ diff --git a/Resources/Textures/Mobs/Customization/spidereyes.rsi/eyes.png b/Resources/Textures/Mobs/Customization/spidereyes.rsi/eyes.png new file mode 100644 index 00000000000..0f253476944 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/spidereyes.rsi/eyes.png differ diff --git a/Resources/Textures/Mobs/Customization/spidereyes.rsi/meta.json b/Resources/Textures/Mobs/Customization/spidereyes.rsi/meta.json new file mode 100644 index 00000000000..0eb61ec1dde --- /dev/null +++ b/Resources/Textures/Mobs/Customization/spidereyes.rsi/meta.json @@ -0,0 +1,15 @@ +{ + "copyright" : "@Rane#7518", + "license" : "CC-BY-SA-3.0", + "size" : { + "x" : 32, + "y" : 32 + }, + "states" : [ + { + "directions" : 4, + "name" : "eyes" + } + ], + "version" : 1 +} diff --git a/Resources/Textures/Mobs/Species/arachne.rsi/meta.json b/Resources/Textures/Mobs/Species/arachne.rsi/meta.json new file mode 100644 index 00000000000..a985b24cca3 --- /dev/null +++ b/Resources/Textures/Mobs/Species/arachne.rsi/meta.json @@ -0,0 +1,19 @@ +{ + "version": 1, + "license": "CC-BY-4.0", + "copyright": "Created by @kes#0001, colored by Woods#1999", + "size": { + "x": 64, + "y": 64 + }, + "states": [ + { + "name": "spider_body", + "directions": 4 + }, + { + "name": "spider_body_front", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Mobs/Species/arachne.rsi/spider_body.png b/Resources/Textures/Mobs/Species/arachne.rsi/spider_body.png new file mode 100644 index 00000000000..d1432cc3fd6 Binary files /dev/null and b/Resources/Textures/Mobs/Species/arachne.rsi/spider_body.png differ diff --git a/Resources/Textures/Mobs/Species/arachne.rsi/spider_body_front.png b/Resources/Textures/Mobs/Species/arachne.rsi/spider_body_front.png new file mode 100644 index 00000000000..0171f16fe38 Binary files /dev/null and b/Resources/Textures/Mobs/Species/arachne.rsi/spider_body_front.png differ diff --git a/Resources/Textures/Mobs/Species/eyes.rsi/eyes.png b/Resources/Textures/Mobs/Species/eyes.rsi/eyes.png new file mode 100644 index 00000000000..b6250e22b38 Binary files /dev/null and b/Resources/Textures/Mobs/Species/eyes.rsi/eyes.png differ diff --git a/Resources/Textures/Mobs/Species/eyes.rsi/meta.json b/Resources/Textures/Mobs/Species/eyes.rsi/meta.json new file mode 100644 index 00000000000..a98aba406f1 --- /dev/null +++ b/Resources/Textures/Mobs/Species/eyes.rsi/meta.json @@ -0,0 +1,15 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Created by @Rane#7518", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "eyes", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Nyanotrasen/Structures/cocoon.rsi/cocoon1.png b/Resources/Textures/Nyanotrasen/Structures/cocoon.rsi/cocoon1.png new file mode 100644 index 00000000000..27741fdf314 Binary files /dev/null and b/Resources/Textures/Nyanotrasen/Structures/cocoon.rsi/cocoon1.png differ diff --git a/Resources/Textures/Nyanotrasen/Structures/cocoon.rsi/cocoon2.png b/Resources/Textures/Nyanotrasen/Structures/cocoon.rsi/cocoon2.png new file mode 100644 index 00000000000..252be2398af Binary files /dev/null and b/Resources/Textures/Nyanotrasen/Structures/cocoon.rsi/cocoon2.png differ diff --git a/Resources/Textures/Nyanotrasen/Structures/cocoon.rsi/cocoon3.png b/Resources/Textures/Nyanotrasen/Structures/cocoon.rsi/cocoon3.png new file mode 100644 index 00000000000..ca9cbb79bbe Binary files /dev/null and b/Resources/Textures/Nyanotrasen/Structures/cocoon.rsi/cocoon3.png differ diff --git a/Resources/Textures/Nyanotrasen/Structures/cocoon.rsi/cocoon_large1.png b/Resources/Textures/Nyanotrasen/Structures/cocoon.rsi/cocoon_large1.png new file mode 100644 index 00000000000..f9431f64285 Binary files /dev/null and b/Resources/Textures/Nyanotrasen/Structures/cocoon.rsi/cocoon_large1.png differ diff --git a/Resources/Textures/Nyanotrasen/Structures/cocoon.rsi/cocoon_large2.png b/Resources/Textures/Nyanotrasen/Structures/cocoon.rsi/cocoon_large2.png new file mode 100644 index 00000000000..885bb7b3c93 Binary files /dev/null and b/Resources/Textures/Nyanotrasen/Structures/cocoon.rsi/cocoon_large2.png differ diff --git a/Resources/Textures/Nyanotrasen/Structures/cocoon.rsi/cocoon_large3.png b/Resources/Textures/Nyanotrasen/Structures/cocoon.rsi/cocoon_large3.png new file mode 100644 index 00000000000..9a033961ffa Binary files /dev/null and b/Resources/Textures/Nyanotrasen/Structures/cocoon.rsi/cocoon_large3.png differ diff --git a/Resources/Textures/Nyanotrasen/Structures/cocoon.rsi/meta.json b/Resources/Textures/Nyanotrasen/Structures/cocoon.rsi/meta.json new file mode 100644 index 00000000000..08cfb264df9 --- /dev/null +++ b/Resources/Textures/Nyanotrasen/Structures/cocoon.rsi/meta.json @@ -0,0 +1,35 @@ +{ + "copyright" : "Taken from https://github.com/tgstation/tgstation", + "license" : "CC-BY-SA-3.0", + "size" : { + "x" : 32, + "y" : 32 + }, + "states" : [ + { + "directions" : 1, + "name" : "cocoon1" + }, + { + "directions" : 1, + "name" : "cocoon2" + }, + { + "directions" : 1, + "name" : "cocoon3" + }, + { + "directions" : 1, + "name" : "cocoon_large1" + }, + { + "directions" : 1, + "name" : "cocoon_large2" + }, + { + "directions" : 1, + "name" : "cocoon_large3" + } + ], + "version" : 1 +} diff --git a/Resources/Textures/Objects/Misc/bureaucracy.rsi/meta.json b/Resources/Textures/Objects/Misc/bureaucracy.rsi/meta.json index b57f9844bc7..dc7906e8590 100644 --- a/Resources/Textures/Objects/Misc/bureaucracy.rsi/meta.json +++ b/Resources/Textures/Objects/Misc/bureaucracy.rsi/meta.json @@ -260,6 +260,9 @@ { "name": "paper_stamp-psychologist" }, + { + "name": "paper_stamp-notary" + }, { "name": "paper_stamp-signature" } diff --git a/Resources/Textures/Objects/Misc/bureaucracy.rsi/paper_stamp-notary.png b/Resources/Textures/Objects/Misc/bureaucracy.rsi/paper_stamp-notary.png new file mode 100644 index 00000000000..603351ace58 Binary files /dev/null and b/Resources/Textures/Objects/Misc/bureaucracy.rsi/paper_stamp-notary.png differ diff --git a/Resources/Textures/Objects/Specific/Robotics/borgmodule.rsi/icon-jetpack.png b/Resources/Textures/Objects/Specific/Robotics/borgmodule.rsi/icon-jetpack.png new file mode 100644 index 00000000000..ec7033ec2fe Binary files /dev/null and b/Resources/Textures/Objects/Specific/Robotics/borgmodule.rsi/icon-jetpack.png differ diff --git a/Resources/Textures/Objects/Specific/Robotics/borgmodule.rsi/icon-pka.png b/Resources/Textures/Objects/Specific/Robotics/borgmodule.rsi/icon-pka.png new file mode 100644 index 00000000000..db086b229e9 Binary files /dev/null and b/Resources/Textures/Objects/Specific/Robotics/borgmodule.rsi/icon-pka.png differ diff --git a/Resources/Textures/Objects/Specific/Robotics/borgmodule.rsi/meta.json b/Resources/Textures/Objects/Specific/Robotics/borgmodule.rsi/meta.json index 24992441359..ce8f8187b7d 100644 --- a/Resources/Textures/Objects/Specific/Robotics/borgmodule.rsi/meta.json +++ b/Resources/Textures/Objects/Specific/Robotics/borgmodule.rsi/meta.json @@ -61,6 +61,9 @@ { "name": "icon-harvesting" }, + { + "name": "icon-jetpack" + }, { "name": "icon-light-replacer" }, @@ -79,6 +82,9 @@ { "name": "icon-pen" }, + { + "name": "icon-pka" + }, { "name": "icon-radiation" }, diff --git a/Resources/Textures/Objects/Storage/boxes.rsi/box.png b/Resources/Textures/Objects/Storage/boxes.rsi/box.png index e62e0f699fb..08c3cc3129b 100644 Binary files a/Resources/Textures/Objects/Storage/boxes.rsi/box.png and b/Resources/Textures/Objects/Storage/boxes.rsi/box.png differ diff --git a/Resources/Textures/Objects/Storage/boxes.rsi/box_hug.png b/Resources/Textures/Objects/Storage/boxes.rsi/box_hug.png index f9f0e4dbf3d..d00717065f9 100644 Binary files a/Resources/Textures/Objects/Storage/boxes.rsi/box_hug.png and b/Resources/Textures/Objects/Storage/boxes.rsi/box_hug.png differ diff --git a/Resources/Textures/Objects/Storage/boxes.rsi/box_of_doom.png b/Resources/Textures/Objects/Storage/boxes.rsi/box_of_doom.png index 50379bb4752..7f72fb85a44 100644 Binary files a/Resources/Textures/Objects/Storage/boxes.rsi/box_of_doom.png and b/Resources/Textures/Objects/Storage/boxes.rsi/box_of_doom.png differ diff --git a/Resources/Textures/Objects/Storage/boxes.rsi/box_of_doom_big.png b/Resources/Textures/Objects/Storage/boxes.rsi/box_of_doom_big.png index 00833bb163c..cbfd43456b9 100644 Binary files a/Resources/Textures/Objects/Storage/boxes.rsi/box_of_doom_big.png and b/Resources/Textures/Objects/Storage/boxes.rsi/box_of_doom_big.png differ diff --git a/Resources/Textures/Objects/Storage/boxes.rsi/box_olive.png b/Resources/Textures/Objects/Storage/boxes.rsi/box_olive.png index 4ddd8ac4fbf..db0d3b1ffd1 100644 Binary files a/Resources/Textures/Objects/Storage/boxes.rsi/box_olive.png and b/Resources/Textures/Objects/Storage/boxes.rsi/box_olive.png differ diff --git a/Resources/Textures/Objects/Storage/boxes.rsi/box_science.png b/Resources/Textures/Objects/Storage/boxes.rsi/box_science.png index de33c9b97e5..f0222fe9231 100644 Binary files a/Resources/Textures/Objects/Storage/boxes.rsi/box_science.png and b/Resources/Textures/Objects/Storage/boxes.rsi/box_science.png differ diff --git a/Resources/Textures/Objects/Storage/boxes.rsi/meta.json b/Resources/Textures/Objects/Storage/boxes.rsi/meta.json index 53ac39b639b..b30927da33c 100644 --- a/Resources/Textures/Objects/Storage/boxes.rsi/meta.json +++ b/Resources/Textures/Objects/Storage/boxes.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/cc65477c04f7403ca8a457bd5bae69a01abadbf0, encryptokey was taken from Baystation12 at https://github.com/infinitystation/Baystation12/blob/073f678cdce92edb8fcd55f9ffc9f0523bf31506/icons/obj/radio.dmi and modified by lapatison. boxwidetoy, shelltoy, swab, flare, inflatable, trashbag, magazine, holo and forensic created by potato1234x (github) for ss14 based on toys.rsi, mouth_swab.rsi, flare.rsi, inflatable_wall.rsi, trashbag.rsi, caseless_pistol_mag.rsi, guardians.rsi and bureaucracy.rsi respectively, candle and darts created by TheShuEd for ss14, throwing_knives and vials was drawn by Ubaser, evidence_markers by moomoobeef.", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/cc65477c04f7403ca8a457bd5bae69a01abadbf0, encryptokey was taken from Baystation12 at https://github.com/infinitystation/Baystation12/blob/073f678cdce92edb8fcd55f9ffc9f0523bf31506/icons/obj/radio.dmi and modified by lapatison. boxwidetoy, shelltoy, swab, flare, inflatable, trashbag, magazine, holo and forensic created by potato1234x (github) for ss14 based on toys.rsi, mouth_swab.rsi, flare.rsi, inflatable_wall.rsi, trashbag.rsi, caseless_pistol_mag.rsi, guardians.rsi and bureaucracy.rsi respectively, candle and darts created by TheShuEd for ss14, throwing_knives and vials was drawn by Ubaser, evidence_markers by moomoobeef, Boxes by mefinks.", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Objects/Tools/cmopenlight.rsi/meta.json b/Resources/Textures/Objects/Tools/cmopenlight.rsi/meta.json new file mode 100644 index 00000000000..8f4b8ba253f --- /dev/null +++ b/Resources/Textures/Objects/Tools/cmopenlight.rsi/meta.json @@ -0,0 +1,17 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "MistakeNot4892, https://github.com/NebulaSS13/Nebula/blob/dev/icons/obj/lighting/penlight.dmi", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "world" + }, + { + "name": "world-on" + } + ] +} diff --git a/Resources/Textures/Objects/Tools/cmopenlight.rsi/world-on.png b/Resources/Textures/Objects/Tools/cmopenlight.rsi/world-on.png new file mode 100644 index 00000000000..fbd87cad203 Binary files /dev/null and b/Resources/Textures/Objects/Tools/cmopenlight.rsi/world-on.png differ diff --git a/Resources/Textures/Objects/Tools/cmopenlight.rsi/world.png b/Resources/Textures/Objects/Tools/cmopenlight.rsi/world.png new file mode 100644 index 00000000000..40edaedd9e5 Binary files /dev/null and b/Resources/Textures/Objects/Tools/cmopenlight.rsi/world.png differ diff --git a/Resources/Textures/Objects/Tools/penlight.rsi/meta.json b/Resources/Textures/Objects/Tools/penlight.rsi/meta.json new file mode 100644 index 00000000000..8f4b8ba253f --- /dev/null +++ b/Resources/Textures/Objects/Tools/penlight.rsi/meta.json @@ -0,0 +1,17 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "MistakeNot4892, https://github.com/NebulaSS13/Nebula/blob/dev/icons/obj/lighting/penlight.dmi", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "world" + }, + { + "name": "world-on" + } + ] +} diff --git a/Resources/Textures/Objects/Tools/penlight.rsi/world-on.png b/Resources/Textures/Objects/Tools/penlight.rsi/world-on.png new file mode 100644 index 00000000000..afb10cdad4e Binary files /dev/null and b/Resources/Textures/Objects/Tools/penlight.rsi/world-on.png differ diff --git a/Resources/Textures/Objects/Tools/penlight.rsi/world.png b/Resources/Textures/Objects/Tools/penlight.rsi/world.png new file mode 100644 index 00000000000..4cf616bf959 Binary files /dev/null and b/Resources/Textures/Objects/Tools/penlight.rsi/world.png differ diff --git a/Resources/Textures/Objects/Weapons/Bombs/breaching.rsi/icon.png b/Resources/Textures/Objects/Weapons/Bombs/breaching.rsi/icon.png new file mode 100644 index 00000000000..5bd58663b6e Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Bombs/breaching.rsi/icon.png differ diff --git a/Resources/Textures/Objects/Weapons/Bombs/breaching.rsi/inhand-left.png b/Resources/Textures/Objects/Weapons/Bombs/breaching.rsi/inhand-left.png new file mode 100644 index 00000000000..4ea978c6992 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Bombs/breaching.rsi/inhand-left.png differ diff --git a/Resources/Textures/Objects/Weapons/Bombs/breaching.rsi/inhand-right.png b/Resources/Textures/Objects/Weapons/Bombs/breaching.rsi/inhand-right.png new file mode 100644 index 00000000000..2b675ecabf5 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Bombs/breaching.rsi/inhand-right.png differ diff --git a/Resources/Textures/Objects/Weapons/Bombs/breaching.rsi/meta.json b/Resources/Textures/Objects/Weapons/Bombs/breaching.rsi/meta.json new file mode 100644 index 00000000000..678ffd9abd5 --- /dev/null +++ b/Resources/Textures/Objects/Weapons/Bombs/breaching.rsi/meta.json @@ -0,0 +1,31 @@ + { + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "made by rosieposieeee (github) for ss14", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "primed", + "delays": [ + [ + 0.1, + 0.1 + ] + ] + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Objects/Weapons/Bombs/breaching.rsi/primed.png b/Resources/Textures/Objects/Weapons/Bombs/breaching.rsi/primed.png new file mode 100644 index 00000000000..135cc2d3492 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Bombs/breaching.rsi/primed.png differ diff --git a/Resources/Textures/Structures/Storage/closet.rsi/cj.png b/Resources/Textures/Structures/Storage/closet.rsi/cj.png new file mode 100644 index 00000000000..c57b4b88990 Binary files /dev/null and b/Resources/Textures/Structures/Storage/closet.rsi/cj.png differ diff --git a/Resources/Textures/Structures/Storage/closet.rsi/cj_door.png b/Resources/Textures/Structures/Storage/closet.rsi/cj_door.png new file mode 100644 index 00000000000..f406e398073 Binary files /dev/null and b/Resources/Textures/Structures/Storage/closet.rsi/cj_door.png differ diff --git a/Resources/Textures/Structures/Storage/closet.rsi/cj_open.png b/Resources/Textures/Structures/Storage/closet.rsi/cj_open.png new file mode 100644 index 00000000000..8ba72a5bccf Binary files /dev/null and b/Resources/Textures/Structures/Storage/closet.rsi/cj_open.png differ diff --git a/Resources/Textures/Structures/Storage/closet.rsi/clerk.png b/Resources/Textures/Structures/Storage/closet.rsi/clerk.png new file mode 100644 index 00000000000..d941ab4bf54 Binary files /dev/null and b/Resources/Textures/Structures/Storage/closet.rsi/clerk.png differ diff --git a/Resources/Textures/Structures/Storage/closet.rsi/clerk_door.png b/Resources/Textures/Structures/Storage/closet.rsi/clerk_door.png new file mode 100644 index 00000000000..e31a6468b9a Binary files /dev/null and b/Resources/Textures/Structures/Storage/closet.rsi/clerk_door.png differ diff --git a/Resources/Textures/Structures/Storage/closet.rsi/clerk_open.png b/Resources/Textures/Structures/Storage/closet.rsi/clerk_open.png new file mode 100644 index 00000000000..ab865e6cbe5 Binary files /dev/null and b/Resources/Textures/Structures/Storage/closet.rsi/clerk_open.png differ diff --git a/Resources/Textures/Structures/Storage/closet.rsi/meta.json b/Resources/Textures/Structures/Storage/closet.rsi/meta.json index c52bc13540e..d3802637c05 100644 --- a/Resources/Textures/Structures/Storage/closet.rsi/meta.json +++ b/Resources/Textures/Structures/Storage/closet.rsi/meta.json @@ -4,7 +4,7 @@ "x": 32, "y": 32 }, - "copyright": "Taken from tgstation, brigmedic locker is a resprited CMO locker by PuroSlavKing (Github), n2_door state modified by Flareguy from fire_door, using sprites from /vg/station at https://github.com/vgstation-coders/vgstation13/commit/02b9f6894af4419c9f7e699a22c402b086d8067e", + "copyright": "Taken from tgstation, brigmedic locker is a resprited CMO locker by PuroSlavKing (Github), CJ and Clerk lockers edited by Timemaster99 (Discord), n2_door state modified by Flareguy from fire_door, using sprites from /vg/station at https://github.com/vgstation-coders/vgstation13/commit/02b9f6894af4419c9f7e699a22c402b086d8067e", "license": "CC-BY-SA-3.0", "states": [ { @@ -163,6 +163,24 @@ { "name": "chemical_door" }, + { + "name": "cj" + }, + { + "name": "cj_door" + }, + { + "name": "cj_open" + }, + { + "name": "clerk" + }, + { + "name": "clerk_door" + }, + { + "name": "clerk_open" + }, { "name": "cmo" }, diff --git a/Resources/Textures/Structures/Wallmounts/radalarm.rsi/geiger_base.png b/Resources/Textures/Structures/Wallmounts/radalarm.rsi/geiger_base.png new file mode 100644 index 00000000000..778c4277350 Binary files /dev/null and b/Resources/Textures/Structures/Wallmounts/radalarm.rsi/geiger_base.png differ diff --git a/Resources/Textures/Structures/Wallmounts/radalarm.rsi/geiger_on_ext.png b/Resources/Textures/Structures/Wallmounts/radalarm.rsi/geiger_on_ext.png new file mode 100644 index 00000000000..7b7f3f4e767 Binary files /dev/null and b/Resources/Textures/Structures/Wallmounts/radalarm.rsi/geiger_on_ext.png differ diff --git a/Resources/Textures/Structures/Wallmounts/radalarm.rsi/geiger_on_high.png b/Resources/Textures/Structures/Wallmounts/radalarm.rsi/geiger_on_high.png new file mode 100644 index 00000000000..7b7f3f4e767 Binary files /dev/null and b/Resources/Textures/Structures/Wallmounts/radalarm.rsi/geiger_on_high.png differ diff --git a/Resources/Textures/Structures/Wallmounts/radalarm.rsi/geiger_on_idle.png b/Resources/Textures/Structures/Wallmounts/radalarm.rsi/geiger_on_idle.png new file mode 100644 index 00000000000..4038e100886 Binary files /dev/null and b/Resources/Textures/Structures/Wallmounts/radalarm.rsi/geiger_on_idle.png differ diff --git a/Resources/Textures/Structures/Wallmounts/radalarm.rsi/geiger_on_low.png b/Resources/Textures/Structures/Wallmounts/radalarm.rsi/geiger_on_low.png new file mode 100644 index 00000000000..a09613ad524 Binary files /dev/null and b/Resources/Textures/Structures/Wallmounts/radalarm.rsi/geiger_on_low.png differ diff --git a/Resources/Textures/Structures/Wallmounts/radalarm.rsi/geiger_on_med.png b/Resources/Textures/Structures/Wallmounts/radalarm.rsi/geiger_on_med.png new file mode 100644 index 00000000000..33d354a6a6e Binary files /dev/null and b/Resources/Textures/Structures/Wallmounts/radalarm.rsi/geiger_on_med.png differ diff --git a/Resources/Textures/Structures/Wallmounts/radalarm.rsi/meta.json b/Resources/Textures/Structures/Wallmounts/radalarm.rsi/meta.json new file mode 100644 index 00000000000..2ef22994bc0 --- /dev/null +++ b/Resources/Textures/Structures/Wallmounts/radalarm.rsi/meta.json @@ -0,0 +1,35 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "Made by @dootythefrooty (Discord)", + "states": [ + { + "name": "geiger_base", + "directions": 4 + }, + { + "name": "geiger_on_idle", + "directions": 4 + }, + { + "name": "geiger_on_low", + "directions": 4 + }, + { + "name": "geiger_on_med", + "directions": 4 + }, + { + "name": "geiger_on_high", + "directions": 4 + }, + { + "name": "geiger_on_ext", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Supermatter/supermatter.rsi/meta.json b/Resources/Textures/Supermatter/supermatter.rsi/meta.json new file mode 100644 index 00000000000..6bca0558a89 --- /dev/null +++ b/Resources/Textures/Supermatter/supermatter.rsi/meta.json @@ -0,0 +1,15 @@ +{ + "version": 1, + "copyright": "Taken and edited from https://tgstation13.org/wiki/images/a/a4/Supermatter-bg.gif", + "license": "CC-BY-SA-3.0", + "size": { + "x": 32, + "y": 48 + }, + "states": [ + { + "name": "supermatter", + "delays": [ [ 0.08, 0.08, 0.08 ] ] + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Supermatter/supermatter.rsi/supermatter.png b/Resources/Textures/Supermatter/supermatter.rsi/supermatter.png new file mode 100644 index 00000000000..0c5747a315f Binary files /dev/null and b/Resources/Textures/Supermatter/supermatter.rsi/supermatter.png differ diff --git a/Resources/Textures/Supermatter/supermatter_sliver.rsi/icon.png b/Resources/Textures/Supermatter/supermatter_sliver.rsi/icon.png new file mode 100644 index 00000000000..2187706b107 Binary files /dev/null and b/Resources/Textures/Supermatter/supermatter_sliver.rsi/icon.png differ diff --git a/Resources/Textures/Supermatter/supermatter_sliver.rsi/meta.json b/Resources/Textures/Supermatter/supermatter_sliver.rsi/meta.json new file mode 100644 index 00000000000..f157223291c --- /dev/null +++ b/Resources/Textures/Supermatter/supermatter_sliver.rsi/meta.json @@ -0,0 +1,14 @@ +{ + "version": 1, + "copyright": "Taken and edited from https://github.com/tgstation/tgstation/blob/master/icons/obj/antags/syndicate_tools.dmi", + "license": "CC-BY-SA-3.0", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + } + ] +} \ No newline at end of file diff --git a/Resources/toolshedEngineCommandPerms.yml b/Resources/toolshedEngineCommandPerms.yml index ac7ffddd5f9..97de43e0b1f 100644 --- a/Resources/toolshedEngineCommandPerms.yml +++ b/Resources/toolshedEngineCommandPerms.yml @@ -50,7 +50,8 @@ - methods - ioc -- Commands: +- Flags: ADMIN + Commands: - fuck - ent - as