From 81ad859c46fc48ca3b19e8165454bda5ad52f8f1 Mon Sep 17 00:00:00 2001 From: Mnemotechnican <69920617+Mnemotechnician@users.noreply.github.com> Date: Wed, 7 Aug 2024 00:22:11 +0300 Subject: [PATCH 01/57] Admeme Language Commands (Attempt 2) (#565) # Description #562 but using commands instead of tricks. Less user-friendly but makes you look like a hacker when you use them :trollface:

Media

![image](https://github.com/user-attachments/assets/818b6226-aea8-4f9a-b30d-5df39b8041e6) ![image](https://github.com/user-attachments/assets/f3c40feb-f84d-4083-bc9a-44f7b1dfb30d) ![image](https://github.com/user-attachments/assets/31827207-4903-4df1-9074-eb060d0cf63c) (ignore the missing locale, I fixes)

# Changelog :cl: - add: Admin tooling: added several admin commands to help manipulate entities' languages. --------- Signed-off-by: Mnemotechnican <69920617+Mnemotechnician@users.noreply.github.com> Co-authored-by: DEATHB4DEFEAT <77995199+DEATHB4DEFEAT@users.noreply.github.com> --- .../Language/Commands/AdminLanguageCommand.cs | 75 +++++++++ .../Commands/AdminTranslatorCommand.cs | 155 ++++++++++++++++++ Resources/Locale/en-US/language/commands.ftl | 18 ++ 3 files changed, 248 insertions(+) create mode 100644 Content.Server/Language/Commands/AdminLanguageCommand.cs create mode 100644 Content.Server/Language/Commands/AdminTranslatorCommand.cs 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/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. From 48c0770ff49c622491ded7ae9591e77842304e8b Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Tue, 6 Aug 2024 21:22:38 +0000 Subject: [PATCH 02/57] Automatic Changelog Update (#565) --- Resources/Changelog/Changelog.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index c66b99d2ea1..e3de08a18b0 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -5017,3 +5017,11 @@ Entries: 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' From 04d01f687fb479d7f86e2df81cce6b9285dcbad6 Mon Sep 17 00:00:00 2001 From: SleepyScarecrow <136123749+SleepyScarecrow@users.noreply.github.com> Date: Tue, 6 Aug 2024 17:51:21 -0400 Subject: [PATCH 03/57] Added Penlights (#567) # Description Added in penlights that spawn in Medical Staff PDAs. --- # TODO - [x] EyeCheck system - [x] Add in the bloody pens. ---

Media

https://github.com/user-attachments/assets/dc746aa2-782e-4d86-b9ef-9e012343fb87

--- # Changelog :cl: Tilkku - add: Added Pen Lights - add: Eye Examination --------- Signed-off-by: SleepyScarecrow <136123749+SleepyScarecrow@users.noreply.github.com> Co-authored-by: VMSolidus --- .../PenLight/UI/PenLightBoundUserInterface.cs | 47 +++++++ .../Eye/PenLight/UI/PenLightWindow.xaml | 11 ++ .../Eye/PenLight/UI/PenLightWindow.xaml.cs | 78 ++++++++++++ .../EyeProtection/EyeProtectionSystem.cs | 2 +- Content.Server/Medical/PenLightSystem.cs | 118 ++++++++++++++++++ Content.Shared/Medical/PenLightComponent.cs | 33 +++++ Content.Shared/Medical/PenLightUiKey.cs | 9 ++ Content.Shared/Medical/PenLightUserMessage.cs | 24 ++++ .../en-US/medical/components/penlight.ftl | 11 ++ .../Entities/Objects/Devices/pda.yml | 54 ++++++++ .../Entities/Objects/Tools/penlight.yml | 90 +++++++++++++ .../Objects/Tools/cmopenlight.rsi/meta.json | 17 +++ .../Tools/cmopenlight.rsi/world-on.png | Bin 0 -> 4345 bytes .../Objects/Tools/cmopenlight.rsi/world.png | Bin 0 -> 4325 bytes .../Objects/Tools/penlight.rsi/meta.json | 17 +++ .../Objects/Tools/penlight.rsi/world-on.png | Bin 0 -> 253 bytes .../Objects/Tools/penlight.rsi/world.png | Bin 0 -> 234 bytes 17 files changed, 510 insertions(+), 1 deletion(-) create mode 100644 Content.Client/Eye/PenLight/UI/PenLightBoundUserInterface.cs create mode 100644 Content.Client/Eye/PenLight/UI/PenLightWindow.xaml create mode 100644 Content.Client/Eye/PenLight/UI/PenLightWindow.xaml.cs create mode 100644 Content.Server/Medical/PenLightSystem.cs create mode 100644 Content.Shared/Medical/PenLightComponent.cs create mode 100644 Content.Shared/Medical/PenLightUiKey.cs create mode 100644 Content.Shared/Medical/PenLightUserMessage.cs create mode 100644 Resources/Locale/en-US/medical/components/penlight.ftl create mode 100644 Resources/Prototypes/Entities/Objects/Tools/penlight.yml create mode 100644 Resources/Textures/Objects/Tools/cmopenlight.rsi/meta.json create mode 100644 Resources/Textures/Objects/Tools/cmopenlight.rsi/world-on.png create mode 100644 Resources/Textures/Objects/Tools/cmopenlight.rsi/world.png create mode 100644 Resources/Textures/Objects/Tools/penlight.rsi/meta.json create mode 100644 Resources/Textures/Objects/Tools/penlight.rsi/world-on.png create mode 100644 Resources/Textures/Objects/Tools/penlight.rsi/world.png 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.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/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.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/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/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/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/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 0000000000000000000000000000000000000000..fbd87cad2035e7c2b6594b9c55a43c83c01d4fcc GIT binary patch literal 4345 zcmeHKe^3*577r*1Mew9rZ7sc9mSUCOCfUt~BpU)^KoV<^gIK}C(ar8RVTEMl?n(lR zR;4W-Erk}!w8vcQ&3U~tcic&>cPF)qq{X(LKZ>UwwXI{h+Up6_AJgic+WT(8&$-Ur zFmwHn%p|+}eth10pYMBbvbziN^Ah3~#wiqv1iLM#5MB}a8>@uBVs-TmcpCC2a?`rU(KVEces%1+ zy+3n!O?5mw5ZY`1>)P%k@4wuY8r_hY5`EIxw5#)9AFfh0{Vuoih1No5+wf<}7uWpp zw{5ip4}^r&X6yQGwU?3?Hau0YuO(|2n|CCiy7SY5)%~|-eV|-Z_X>IR-uAx43+288 zhu%DIZoa8)ihabJxi0`SzojlZ9xZ-OO1P|64ia1n$zZYFXJBF|K$eZ9}7s% zR#=)8b8hFZAJwl`E%2;+s5B<~s~Mrcb=yzpuDHFvuq^Sj?oC;re7xntp&7OAme<`U zlV08UVpD$ToziWqho<4VdBr7#btiZCCLBbrrkn$4b(x|?}m z@a#Pow<|mLHyl1Y)177KrTt$d&goaGJIpV?r79g#SXUinZ4CpjEtyw;_DJpp3Is3!tbv z-^o;$GbR?z%8bhhQV_rkBpL~ND|{jqw4h;J3f{|N4T^+Kq;d;d>?lC2yZ{hVO{%q6 zZjh@a(9Ad_Ltx!hVb1aq2>4_{%OuH9X*7XAKpoJjdBLN>O(v5@OK1oJgBF-r<&)?j z<`Yw7hzLdw5E+5r2{q{Bhz&>=EAisrlU^@PVeGHJHAh?=? zIJ91;WoUxL7%gGMNJF|Cqto?9%*E>UxX#VecselwVwJ$buB0m_W+g+h5Q-&rgwBBL zFhI~Qj5IO^%*3z&BN!t|695Ll^(g^8$AvL5%!{tifh%nh(b7%=bP%S}HS_6ffoVbqC z8z?P-X`y6-J7v zCFAMt`oGZ?H~umOeDEJo0KO{KoVj}wzGf+1kLBekq7+U=*_Chayay%s_-!SkLNPle zf1_F+o&6vbswBH3SM`NzZlWpLoJ@QRMSJWy+0Npg!87|3qVf2cQ^PYhhT@%PR6nmx zZ0y|eMpSEs|Gs){)Xr-meSG)KSCpq!`JIio9}c{D4df}?#1pG+?JL{K?OWfU<8X+r zZ`kUNKljMWMNQ5n$-<}oH--+#Vp4a=iCFon|43Cvb(FdXD`}5hgkV=$Ay7Gb?WIu-S7Tv z-lkUHYx7ssH*9XdQ_!FPFXQSwI?wlf{Azlz^WF~0zWYys!JHQubxnPW=H5%+B0ps@(mL0&d>W*GCIBrY&x*`vAMTbqa!{wM!01 zmD}MMNeL!$VAEc^t7nPfWJC2Iu>IH#^sjq<%hu`cUH4Ss?Czz~qNCRvBY)2`OD=D{ zA@f4pmY;S!q|5U^l3$-$_RoyokGkDw%a`A2@HWl7(!H+qvrjjC@@7W6xc_DGjNvzr zKE1cH_hkKJ4^4Xmdz{Rop4ij7!v0*{>9>@PpZ4@!I5y|Z&601vm{XNAKVu^{XgII$ zh;509=g-*&aw}@bj0uI;wve@{-fPI)3r%z6CQbX0FkHe7EG)8y{w0 z-kf#hXlK`lQ^ZoYtRB5KbH=4CgVbI zSsRjXY&uYa)Lnn{+bpYf%G=AIdb5A9|9JmrckSo<2Xx)JL^K*TMomUJ;wLDZ%|?(kLDM+2z?JnOm5bpa zr9gui#&80Kk4Rxvl0&G5$@%1F)sA6MkB-C_40}AI@F6A10_1~;abbcol0+~_q)IZ!D2_(`Hcmf1K5Sl7*RchRl6>d+} zsE0;@UkZj3UXbi@mZ~I|dwDNdZr_48N;kli5Ok1B7 zWL^^3#A6W!NWhqUxXs7WxY<%D=*;+*6K8`ozqEF;`K#L|b;8P%0MkH93Tp%?n4N8Def?ySVw2#4oATqew zW+HLU!Z0|`7cq=rrh#ZPC!hqLT_#6@9NbPR$oT;g4*3%bjc~TC%5BGJBRM9i3UI0j z9bgYgAwiBRW2zb{2&z?1q0u&mh3PpZ{k9J0Ov=tU`OQAcN7C7l2+10n{gj$wc%zT&*3(+g~KTy%~=I2Z!wYLcyvV; z)hHJMWq!ybh_fDuIX}TGI~pX`ei8E<#v|U)b{X=b249SoVBxU)spm=77#-XtA25J^9lUW z!GdR9t3EmV(W!R~`v$vi^;c|7%Z~53d2?vzy!(b^l^XI-J9WGCa%bbSr^v8&Mfx(X zZ!gQu&*@+WKNUr?& ZbY#lxhAUee&Y=iA+~t+dBTF0G{tH1$57+h>xLAI(1#IcCj#wmJ%lA!R zfkWhagFx-!tRp(}zWvft;wY58@aaf^VwSC9qr|!vT^6?E!dgpbC}{BCo_YP(w^d)6 xKCyJ|-daCD%h;*o-eh|w1x{uI24;f>?lqg@zvaAKupj7j22WQ%mvv4FO#sKoSf2m@ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..4cf616bf959f0b7b8905868edf5cdb484cb863b5 GIT binary patch literal 234 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5C^*N{ z#WAE}&fBX8c^edXSOa|K9C;YSXuiRx*JR<5f=x>sXZ(qq()`n3vy{J^8>pV)L41Su zu`}UbnX~yS+CT3Vclyd|VKRM{xA>9thCMsiq_Vz5j0Rj>jF-*<-@ zeTmsegyx;!rmfae$yf39$OVO0)rXoS=C#;1d0!URTO1)UE&c94)>?lbc8(;?10eS^ ZFz`# Date: Tue, 6 Aug 2024 21:51:47 +0000 Subject: [PATCH 04/57] Automatic Changelog Update (#567) --- Resources/Changelog/Changelog.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index e3de08a18b0..b3218a908e1 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -5025,3 +5025,11 @@ Entries: 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' From 8768df79121f3ccead72d97cba143cec49c9a369 Mon Sep 17 00:00:00 2001 From: Angelo Fallaria Date: Wed, 7 Aug 2024 06:03:35 +0800 Subject: [PATCH 05/57] Unique Glove Fibers (#642) # Description Cherry-picked from Delta-V, originally by @WarMechanic (https://github.com/DeltaV-Station/Delta-v/pull/1455). Original Description: > Every pair of gloves now has its own fingerprint, so items can be traced back to gloves which can then be traced back to people. > > ## Why / Balance > > Evidence is very important to court cases running smoothly, so detectives now have more evidence that can certify whether or not John Syndicate's behaviour is valid. Traitors are now encouraged to either clean evidence off syndicate gear regardless of glove status, or use a disposable pair of gloves specifically for handling syndicate gear to be disposed of later. > > Aside from being required to obfuscate evidence you leave behind, there is now a value proposition to searching glove prints of departments. Wearing gloves that does not correspond your department can punish an unknowing detective into searching the wrong people. > > ## Technical details > > `FiberComponent.cs` now stores a Fiberprint variable like `FingerprintComponent.cs`. The code for assigning a fiberprint is the same as the fingerprint. When evidence is placed on an object, the fiberprint is concatenated to its localised fiber type.

Original Media

> hm ok we have these specific gloves on an akms >
> > > > hm well we found the gloves and they have fingerprints >
> > > > gotem >
> >

# Changelog :cl: WarMechanic - add: Gloves now have unique fingerprints. Items can be traced back to gloves, which can then be traced back to people. --------- Signed-off-by: Angelo Fallaria Co-authored-by: WarMechanic <69510347+WarMechanic@users.noreply.github.com> Co-authored-by: deltanedas <39013340+deltanedas@users.noreply.github.com> Co-authored-by: Danger Revolution! <142105406+DangerRevolution@users.noreply.github.com> Co-authored-by: VMSolidus --- .../Forensics/Components/FiberComponent.cs | 3 +++ .../Forensics/Systems/ForensicsSystem.cs | 17 ++++++++++++++--- 2 files changed, 17 insertions(+), 3 deletions(-) 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; From 24a5f9201d906ee52b8a4da4c6e324cd2e64438e Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Tue, 6 Aug 2024 22:03:58 +0000 Subject: [PATCH 06/57] Automatic Changelog Update (#642) --- Resources/Changelog/Changelog.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index b3218a908e1..742c9222745 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -5033,3 +5033,11 @@ Entries: 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' From bd11307c54e0ed383246c81fec65a9d8dba1309f Mon Sep 17 00:00:00 2001 From: SleepyScarecrow <136123749+SleepyScarecrow@users.noreply.github.com> Date: Tue, 6 Aug 2024 18:04:15 -0400 Subject: [PATCH 07/57] Alphabetized physical-desc.ftl (Fr This Time) (#648) # Description alphabetized physical-desc.ftl because it annoyed me --- .../en-US/reagents/meta/physical-desc.ftl | 170 +++++++++--------- 1 file changed, 85 insertions(+), 85 deletions(-) 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 From ab2947b1ff5ba7ef8f60609454897616f8f13f55 Mon Sep 17 00:00:00 2001 From: Angelo Fallaria Date: Wed, 7 Aug 2024 14:07:35 +0800 Subject: [PATCH 08/57] Fix No Blood Regeneration (#689) # Description Being a little too clever with omitting braces in complicated if statement chains in #686 caused blood regeneration for entities without Blood Deficiency to stop working altogether. I added some braces and now blood regeneration works again. I also added `DataField` to `HasBloodDeficiency` because I forgot to add that. # Changelog :cl: Skubman - fix: Passive blood regeneration now works again. --- Content.Server/Body/Components/BloodstreamComponent.cs | 1 + Content.Server/Body/Systems/BloodstreamSystem.cs | 9 ++++++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/Content.Server/Body/Components/BloodstreamComponent.cs b/Content.Server/Body/Components/BloodstreamComponent.cs index 7a4af3e4cc1..76eadb99fd8 100644 --- a/Content.Server/Body/Components/BloodstreamComponent.cs +++ b/Content.Server/Body/Components/BloodstreamComponent.cs @@ -177,6 +177,7 @@ public sealed partial class BloodstreamComponent : Component /// If this is true, the entity will not passively regenerate blood, /// and instead will slowly lose blood. /// + [DataField] public bool HasBloodDeficiency = false; /// diff --git a/Content.Server/Body/Systems/BloodstreamSystem.cs b/Content.Server/Body/Systems/BloodstreamSystem.cs index fafc649eb29..b37ac5efeb4 100644 --- a/Content.Server/Body/Systems/BloodstreamSystem.cs +++ b/Content.Server/Body/Systems/BloodstreamSystem.cs @@ -120,12 +120,15 @@ public override void Update(float frameTime) // 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) - if (!_mobStateSystem.IsDead(uid)) - TryModifyBloodLevel(uid, bloodstream.BloodRefreshAmount, bloodstream); + else if (bloodSolution.Volume < bloodSolution.MaxVolume && !_mobStateSystem.IsDead(uid)) + { + TryModifyBloodLevel(uid, bloodstream.BloodRefreshAmount, bloodstream); + } // Removes blood from the bloodstream based on bleed amount (bleed rate) // as well as stop their bleeding to a certain extent. From cf310f302c2add2eb0fe25cc59d7807483049285 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Wed, 7 Aug 2024 06:08:10 +0000 Subject: [PATCH 09/57] Automatic Changelog Update (#689) --- Resources/Changelog/Changelog.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 742c9222745..73e90b2faf9 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -5041,3 +5041,9 @@ Entries: 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' From 69946f87ce695bd0f1378a6705678845608b3a32 Mon Sep 17 00:00:00 2001 From: Fansana <116083121+Fansana@users.noreply.github.com> Date: Wed, 7 Aug 2024 19:31:55 +0200 Subject: [PATCH 10/57] Fix BarotraumaSystem (#694) # Description This PR fixes an issue with the BarotraumaSystem which would constantly report high pressure damage, even when no such damage was applied. --- - [x] Tested High pressure damage correctly reported - [x] Tested Low pressure damage correctly reported - [x] Tested No pressure damage correctly reported --- # Changelog :cl: - fix: Barotrauma admin log spam --- .../Atmos/EntitySystems/BarotraumaSystem.cs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/Content.Server/Atmos/EntitySystems/BarotraumaSystem.cs b/Content.Server/Atmos/EntitySystems/BarotraumaSystem.cs index d55ef355f02..948373940e4 100644 --- a/Content.Server/Atmos/EntitySystems/BarotraumaSystem.cs +++ b/Content.Server/Atmos/EntitySystems/BarotraumaSystem.cs @@ -247,7 +247,11 @@ public override void Update(float frameTime) var damageScale = MathF.Min(((pressure / Atmospherics.HazardHighPressure) - 1) * Atmospherics.PressureDamageCoefficient, Atmospherics.MaxHighPressureDamage); _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 @@ -258,11 +262,6 @@ public override void Update(float frameTime) barotrauma.TakingDamage = false; _adminLogger.Add(LogType.Barotrauma, $"{ToPrettyString(uid):entity} stopped taking pressure damage"); } - if (!barotrauma.TakingDamage) - { - barotrauma.TakingDamage = true; - _adminLogger.Add(LogType.Barotrauma, $"{ToPrettyString(uid):entity} started taking high pressure damage"); - } // Set correct alert. switch (pressure) { From 1b2c946240b1ce5b229bc67ae5a1019d1f983f01 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Wed, 7 Aug 2024 17:32:22 +0000 Subject: [PATCH 11/57] Automatic Changelog Update (#694) --- Resources/Changelog/Changelog.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 73e90b2faf9..5aca84c9f32 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -5047,3 +5047,9 @@ Entries: 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' From a0f3f31a747268dea5f82db49089314ebe826a89 Mon Sep 17 00:00:00 2001 From: Mnemotechnican <69920617+Mnemotechnician@users.noreply.github.com> Date: Thu, 8 Aug 2024 01:38:04 +0300 Subject: [PATCH 12/57] Butlergone (Cherry-Pick From Delta-V) (#678) # Description Cherry-picks https://github.com/DeltaV-Station/Delta-v/pull/1100 and https://github.com/DeltaV-Station/Delta-v/pull/1222. Makes butlertron anchorable, pullable, and destructible, and disables logging of butlertron's messages. Credit to adeinitas and NullWanderer. # Note This was cherry-picked without testing, someone needs to test it first. # Changelog :cl: - add: Mr. Butlertron can now suffer for its crimes. --------- Signed-off-by: Null <56081759+NullWanderer@users.noreply.github.com> Co-authored-by: Adeinitas <147965189+adeinitas@users.noreply.github.com> Co-authored-by: Null <56081759+NullWanderer@users.noreply.github.com> --- .../DeltaV/NPC/Roboisseur/RoboisseurSystem.cs | 4 ++-- Resources/Prototypes/DeltaV/NPC/roboisseur.yml | 10 ++++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) 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/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 From 732b8e87c5236798edc1bf34937ca217a121cdf6 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Wed, 7 Aug 2024 22:38:28 +0000 Subject: [PATCH 13/57] Automatic Changelog Update (#678) --- Resources/Changelog/Changelog.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 5aca84c9f32..fb3fd2c343c 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -5053,3 +5053,9 @@ Entries: 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' From 2a6790ba9d703ecc825d59475187f70b96f031b1 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Wed, 7 Aug 2024 19:11:41 -0400 Subject: [PATCH 14/57] White Dream Harpy Markings (#696) # Description ONIKS was kind enough to provide me with several new Harpy markings, consisting of alternate Bat-wings, Haven Tail, Long Forked Tail, and Swallow Tail. I have also taken the liberty of actually making a basic set of "Bionic Wings", which are just a slightly edited version of the "harpsuit" wing sleeve, including hardsuit lights. Unfortunately due to limitations in the game's code concerning markings, I couldn't make the lights use the unshaded shader. This limitation irritates me. I'll probably fix that in a separate PR. I actually also received a pack of Arachnid and Felinid sprites! But I'm going to add those in a different PR entirely.

Media

Bionic wings ![image](https://github.com/user-attachments/assets/6acc64a9-be6b-435b-9c61-91287ef65c10) Bat Wings ![image](https://github.com/user-attachments/assets/e44fe12e-8410-47ca-a4c1-5e644fd36b8a) Haven tail ![image](https://github.com/user-attachments/assets/2adadcdd-04fc-458d-8491-61bd52a3b4d1) Swallow tail ![image](https://github.com/user-attachments/assets/615391eb-0314-4e6d-a87b-101d0a307955) Long Forked Tail ![image](https://github.com/user-attachments/assets/e3d672f7-b8cb-4497-a2a3-87d0c224847d)

# Changelog :cl: - add: The following new markings have been added for Harpies: Bat Wings, Simple Bionic Wings, Haven Tail, Swallow tail, and Long Forked Tail --- Resources/Locale/en-US/markings/harpy.ftl | 18 +++++ .../Mobs/Customization/Markings/harpy.yml | 73 ++++++++++++++++++ .../Harpy/harpy_tails.rsi/forked_long.png | Bin 0 -> 1245 bytes .../Harpy/harpy_tails.rsi/haven_tone_1.png | Bin 0 -> 853 bytes .../Harpy/harpy_tails.rsi/haven_tone_2.png | Bin 0 -> 630 bytes .../Harpy/harpy_tails.rsi/meta.json | 18 ++++- .../Harpy/harpy_tails.rsi/swallow_tail.png | Bin 0 -> 1092 bytes .../harpy_wings.rsi/bat_wings_tone_1.png | Bin 0 -> 1581 bytes .../harpy_wings.rsi/bat_wings_tone_2.png | Bin 0 -> 1753 bytes .../harpy_wings.rsi/bionic_wings_tone_1.png | Bin 0 -> 1448 bytes .../harpy_wings.rsi/bionic_wings_tone_2.png | Bin 0 -> 329 bytes .../Harpy/harpy_wings.rsi/meta.json | 18 ++++- 12 files changed, 125 insertions(+), 2 deletions(-) create mode 100644 Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/forked_long.png create mode 100644 Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/haven_tone_1.png create mode 100644 Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/haven_tone_2.png create mode 100644 Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/swallow_tail.png create mode 100644 Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/bat_wings_tone_1.png create mode 100644 Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/bat_wings_tone_2.png create mode 100644 Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/bionic_wings_tone_1.png create mode 100644 Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/bionic_wings_tone_2.png 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/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/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 0000000000000000000000000000000000000000..280768b40af24643cf1eea7660bf0cfd1d5ebe05 GIT binary patch literal 1245 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEU@Xscb`J1#c2)=|%1_J8No8Qr zI6rmbUTB$tEso0N_(!E$G%Bb%MPBO^qIGAdd_m8&3k6AS^4C)#pPp*5~QCP7M-|odeP1P zJ)R2bdTKM-C7lZ0VdtWtbT=@EASH5yXKKqK$*zd1Tlx81q_%67^Ao`!ubCbW0 zdv9HGVs|JIw%DDMIWzV_4Yx$ahLGsB-f?d2%NW-$cgUA|v72#MxYXvXd5@pSdE|cR zT-Ug_Het$t_VE3TiaRqTx9~hn0mcMpfk$L90|U1p2s75F#7|^kVCM03aSW-5dpj#} z)h!2+*2#;a1rG9VvC;YTZNU!qiMv=7cX0+5aEcZ3FVg_+xP2hT-NPRKk%NvoBe6g&#c*j`_*mU$_YHx6S{J{#_s#qf17uzOBC4X&W~d{ z{P4r;?@_+4l2wuh{|hV>PMwI?kQ3ozO=XIjwRFM>hT308Cz>@{{J48G>7wQQ^XKaJ zhabB5Yo2&czL~V8QY_y_HiJeJwk4hp@p@H?=vzVG|(xsrFeI~oeC zV{5sX@uWSy;dy2F?+-V2%zt_2zwU>uqOU4HxYjTV^&XW{xEMizp<0+Luzv0Py=Tup z@(#7VzT=P3d4|8Swbwi+XDcy3(C|AIem0WLQYn1zg-;zWYzwSP)=NwbouI89Rd_^- zL0!`>X2A)iGlG`tGgF+<1)D)(q8!4p>$i^diJF+3myilcb{iuaSfT#aOz9Z z&XBeZKIepX8ZkUFG??kb)UHuyHv4JXtNV+uX0fVG@LT>ksMvs6Vcw$1s=BZB4S%&) q<>$XT^k|-gaRSpZ9{qmnbMg;kc;eHRHDmxY3xlVtpUXO@geCyBy)|h7 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..e818e7dd11e8a67e719be7bd065da25e56a847ab GIT binary patch literal 853 zcmV-b1FHOqP)4Tx04UFuk-bX;K@i1XjFO;{6k3RgToJ`00Z|Z3iC~&&kwh?RbJ^q);qG$W zB}lLpY%Bs6qK#jL|ADrGt%4vZf{3NHUyX$GZ4yWjE!<^pe!RUm%+3NGaa|Zr=L}$& zB|8y|Dog2Q#rFaqh8cc@RpD6k$+;B%T%ULF$b1`-weY{ylg&8-@c7A7!m>+bc7ynO z$&$QH?iU3$OFkrrZ8k{0l6t1W&yw>EewS>g60^LUtf}PNIMc?WU>oEya>&rjqS=qU zNg!t~CYc8rLvWBl3{fb^po}%>C?UdZa%R8##_PTX6zLKCTByLLBaZ^TVX9?T%`t1# zbKE*Aa_&Fp>1dM^jp~6Y(DmfHZzF(j2dGtD_v^@YYsY~15x6j0{vziz{XxCj(n1G7 za1%JYY-yQY;Cu@hc(7DktxH};ho%9qr$BES=(_>BR~oZwp5x>mNNwy1LTR(v6Lcx3{-nU0uY)#Gjv^jEsz^sHmHpo0F51 zkB^T4005OnZi@f_01b3fPE-H?|NsC0|NsC0|Nj6z=pu#y000SaNLh0L01FWS01FWT ze`H^g0003vNklZv*wV;Pkr1iSxp>8%jGZiU;`RxB>P=XP1jl9ABLv@K zPA0$kz@-arG4h=~B%sAvk1 z1%N}w93V?NCQJg(T7U(h7GMFW1?T|B%jh4ur5rX0KuQ2{8x-NFIgdCM0Ofah1vkG*^t)BfOpK^MYwK07A%r?5Qn!B>y4KTAKZ fr#b%cUnsynzg)gFOz00000NkvXXu0mjfXVZOu literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..fe98ec53eb2c4f1b570ef1a891228a7586e37178 GIT binary patch literal 630 zcmV-+0*U>JP)4Tx04UFuk-bX;K@i1XjFO;{6k3RgToJ`00Z|Z3iC~&&kwh?RbJ^q);qG$W zB}lLpY%Bs6qK#jL|ADrGt%4vZf{3NHUyX$GZ4yWjE!<^pe!RUm%+3NGaa|Zr=L}$& zB|8y|Dog2Q#rFaqh8cc@RpD6k$+;B%T%ULF$b1`-weY{ylg&8-@c7A7!m>+bc7ynO z$&$QH?iU3$OFkrrZ8k{0l6t1W&yw>EewS>g60^LUtf}PNIMc?WU>oEya>&rjqS=qU zNg!t~CYc8rLvWBl3{fb^po}%>C?UdZa%R8##_PTX6zLKCTByLLBaZ^TVX9?T%`t1# zbKE*Aa_&Fp>1dM^jp~6Y(DmfHZzF(j2dGtD_v^@YYsY~15x6j0{vziz{XxCj(n1G7 za1%JYY-yQY;Cu@hc(7DktxH};ho%9qr$BES=(_>BR~oZwp5x>mNNwgoUh0LdQz2><{90(4SNQ~v1oG9HLxR|nsN{d zC=e*1K%n4%K}t3N32NFX)M;#eYe}}H>wfPIhY5uBjfzsL^{HjkzY?9Gj$k8@psPQO%C(2{wk@-f5YZ#0@<$e-Pd$XM%#9FGyq$zd$^i QBme*a07*qoM6N<$f@XjYK>z>% literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..f9187b66f84ad6bddfef3452079a7697372ed3a7 GIT binary patch literal 1092 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEU@Xscb`J1#c2)=|%1_J8No8Qr zI6rmbUTB$tEso0N_(!E$G%Bb%MPBO^qIGAdd_m8&3k6AS^4C)#pPp*5~QCP7M-|odeP1P zJ)R2bdTKM-C7lZ0VdtWtbT=@EASH5yXKKqK$*zd1Tlx81q_%67^Ao`!ubCbW0 zdv9HGVs|JIw%DDMIWzV_4Yx$ahLGsB-f?d2%NW-$cgUA|v72#MxYXvXd5@pSdE|cR zT-Ug_Het$t_VE3TiaRqTx9~hn0mcMpfk$L90|U1p2s75F#7|^kU@G=>aSW-5dppaq z>yU$h>*G6)ANeLJ$T{sftWeBhevbD}MTg=OzD3gh3P}QYb_=e5p!7I@)so)Mmq#Sk zX0Bp?czf-!Rrgbcf--s8nEj3Nmm~!;dmLTFHlfRvS3$H}%0Wxav>`+%i(zHN6^5XV zD;Sp~3FbSz&F{=LlddW~pSRt6*WGpHR&)0#a73B>bqK8MUDNQisM1@m%W!Y#EH|kO z@4xSTTb3Q?Y`D(rF^|Rk^PFM#*pkm&-XPMuhC%P|;fDz(xgL^SyayaL@;_JaJ@tRD zR>IW4PaeODc2*pJ{4tH~+3JwSV%8^bZE{Z~ZS;8a(LYhWf64XNTW9t^{-G+Y^`CW- zhF8<;gX~_x``xT6Rrc=gQ=ja~{i}=9k1e772jlFr-G5*H-WNE_=s|I6_(RFalg;Z5 zOrFx)QEM%U=6&Td?v8|cwxBNqO=CjW`f7Z_Ec@n`GHdmNk{_)0@ zZWF%#%%1w}-@nV+2XE%2H67>+$VO{@RvAZIY6yuZ^}{{XgS)l*s&I)&<5#?#{Amme@J_Y13rJ zJL!+#`OJMN5nJ8t$9CZ2)vT{ubVJ1jl#@!=HaRgrP$|3Cay4B*JE?4C({i>2&OKqp zB5l19wQL)e(vF;qeP?5Ip6Q2>%#pAuHL~ZKcy=9q|9E5OwWi~^Oat~u9zw@8=Cz7{W5~LTNXP>}z^z%N(GM}Yx(sM<+fN7G!)78&q Iol`;+090D%3;+NC literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..a147739cc90c5cc7bd164a8bb774730f17eed382 GIT binary patch literal 1581 zcmV+|2GaS7P)K@`MNB50!)F@jN>4us0f~|O4xJ%2X zR)vp*qmDEve693!nO_uV%KV|&NyI0?uWE)fHJq+tE$f)VgTfIrSJW!~sG9_JYhhk; zk3=snai)n8CQXqwaugVnY{|^(`-cB~bL7RN$={}gBaRGN@kT{0N>yF5A-XPKj*^=D z|9QH`=t#MGFa|Bpp7-7lfnE67@x1S2&-*!nrYE?xs{XvpY5Y_4ovIc&gwQ6OUsbjA z9$aie_oJP1Qh!pDgx@gW?F>4S(0L1O%jH>B_Bnlk#D+Z44eTGlfSeDl`~o4lXc-r; zD+mAp010qNS#tmY3labT3lag+-G2N400d=8L_t(|UhSGqPUAojg-sMLz=|`BV8kWh z7KjBKmPip|!GbLag*!x?feq|90SaiAXqJdGAZ2(So~Kf-?yimoeCr2^~(S)0sT>p6`O!x7SXy zmNI~&-QC^l_4TzretLSUMx#-y9_+Tax9k1Q&CTlm{@%39!5drJ=V~xd9v&W6M@L81 z!^1-(0Kq{@0Jad}6%ax;-V>YTYDo4bf=?eG=gv)TZd&yY_V?$e-1nWGiuFChC6U-` zAF)H#paGjkhetzGcz1U<+uPf#kDKf1GdLW{V<0<0HeTEEm;z)Rk`cSMu{z6pTTtJghs*>+nRYA#`9`OI-~$p#1?1&X9>CFhBQREzP@e*rfx>^ysWn_Qy$XogYP!ZI+6VkvcCA$a z#y?+P7Fxn2ayf%f-4MMBaF)r~eF1;)s~?P-_zZ6K_VMxYLLFe$V+<)`8L^2=!$&Vv z7Z(?;%3v~?bP~{|ewVtEzWfvlg+ifFC=?2X{~YUO<|^)8FFEuRRh|O|p(mBi&ZjlIdH6GXd$k~stu39!a zE8ABmu#r}lnv70P>hA%-$!O$`?K0ADYxKKyPCM@BCNyIpwoZ2Hc(jdWutPMLfX>^? zMz@j)pZR$NXM+(e_xf7|CSBxfEt%ku8VE53b&#Lr!;n&B7;XGQYdUNOgTY++GN!&p z#z1Un&~d2=+Sv}aOWM`n2i)G?R_p8QGx<$kDu-^3{IaIL#v1j|OaRt%0&MlS18(3@ zKNwkM%S5NwLS?;kc6Jv1LhLKC;^G(@Lv<|N%OIR@Y;3e{c-Ss`+FQtnBUuKGy$%Sc zx1L^KJ?%rpw7D*c(EoYfHLXUjO5;hWu`CaDMDvvxzs9ouW_s5CRUr0Eplugk1^(vS fA20uc#+Bk10P^udA=g`(00000NkvXXu0mjf*Ean; literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..b2170ff803c694b4080f0a18e8ec78b2ff383adb GIT binary patch literal 1753 zcmV;~1}6E5P)K@`MNB50!)F@jN>4us0f~|O4xJ%2X zR)vp*qmDEve693!nO_uV%KV|&NyI0?uWE)fHJq+tE$f)VgTfIrSJW!~sG9_JYhhk; zk3=snai)n8CQXqwaugVnY{|^(`-cB~bL7RN$={}gBaRGN@kT{0N>yF5A-XPKj*^=D z|9QH`=t#MGFa|Bpp7-7lfnE67@x1S2&-*!nrYE?xs{XvpY5Y_4ovIc&gwQ6OUsbjA z9$aie_oJP1Qh!pDgx@gW?F>4S(0L1O%jH>B_Bnlk#D+Z44eTGlfSeDl`~o4lXc-r; zD+mAp010qNS#tmY3labT3lag+-G2N400j|AL_t(|UhSGqN+d}X$0NlPxDb({4=}W% zYZo#!y6_4^(cVEkh14A!%DIHn%t~BZlrqa^Xa*4%E?o&Z@eAW0^C~|o(<)~Wj2|Rc zW_-Mlc=0mLm(FD}nM@{=$z(E_OeT}bd@zbxjg!fwyuZJ9H#axMWIUc~`)xEzzrPL! zQ*E1DTW(`xqg-2CbDNu+Gi8Y3aOkXzqvPWsdw+kw*Z6sLSZ=zA;S99KGhzH&`oFaa zbzS{Dg`cB*cz6hgbUEVa=qUWH%APgGVizRva$YdsEFBshAO#qJXMY_G%HKz$qRn`S z#)o$G_m_*ky}e*iUnKkD;vzWy{QSHoyJoEWHv+T(NoQ|^oZ7@v^#a}+v(nL92v(a9 zsqnX|fX>yfaVUZz%*VX01Id>07$e$b3!_7lqw(0%ro)s2@Dv@j@9@4~K|--QZYK0+ z9IFt|g96OoHb$})_KYQZUMpKf9ZGEA9GjYSNDffKv&JhNwYU2aL$F{R<5`hOG%U;& z74Y+i1FFeZ$?LVUMO6pu1git29AFc~>FH^?;qWz#K9*&iBYJ0rW-9U=BBjSc~HVE(EO zwIry}({?D!6fM0JaIqib6!r?mF05?E8rgHfc!hnN4pT;HZ`fSGHD%?l5Cm>V3d7;a zN%8aN&u)8rJKcubo(HV#>+9>{Prv#+3=#UQY9HAm>JSpRX5b|V3T!1jjOAx(kGRg4 z?-JY4OIFP(8MN`cZ}qs1#^R_&3Wz~0cd3jegX0_Ag_P+7^7O{ppBB7J#1UIj$I(ks zHqd7QIvs%VGMcxx7|v_!<>h7f{QT^AeN7)*-Qkrq#mv6Nj4o90RGAD}iV9x4;}ow` zc>Qjx(IXM2{YFw3RDeSP-1Rbz5PY zwM|+hz}D2Y>S2H}p2)DZ{FC7@6*=4Hofqchg9~IHztjrCR`7o7! z3NoEl8qlN)ce^F5@mymM_St){MY%|_ae^vPDdeMUwgo5}W>ux8F4zwUR##U;8%YMN zk)R}~1jx0w4*e>2D*%a5+fYdm6sT5 zT#<=vbkGMF(oYLztJ$)PcKdxmr@|^(gA!rW%In&HwfaI^K_5|ojRelEzFp4=t&R2$ z0CCmB7@P3^Pvb?^2^=Qu!!1}&=(-cMIzXS6K{V1mK0X$I|M+1O-dxq&w}b-dAQn_{ z!cU(*xs{cb-~=rmf9L;kQsh0m_%I_ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..752d6cc9a2062ae380ac67d49149f5c25e783f9a GIT binary patch literal 1448 zcmV;Z1y}lsP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGizyJUazyWI3i3tDz1wBbbK~#8N?V7tw zEHMMo5^HnW%PP4`N1%gOmfb5&Lo-L%?2Ki$K&yMJRXn7vMSQ{t5N4f zE-x>`YDJ(u`l({ow6wH{Px>|eFD@?T)TI@@9}d`)8y2jFT3cJuQLeA9uH^jq_$cS8 zsi{QgkuY&oUtcff$c~(chlgRuDVjj+`1rUgeFFb3-vk=yUuR`yB`6k)vHr0Ukk9AC zLZKkn2p*0ZJPgAD10}4ZWA;rqYq=Hxi#>U3ve0+Qy zJUu;0&^*$hw?}{20km6*wY4=&JGrhla1-{2J=nDoO8^BRfS#V7AeT!ua$}$$`ooS( zfXU|Orc50i=&KWrDCa0L@1s9$!LE&10w^Gwi^2Q*yPQ!5m7WOi+xjO7FyXWzdJ;G? zlF;v4lBcf9DN6uWOj|><&RmSla*_?M&Mu+_Glyw&a&l5iJki$%8|HoVhaK31T~%F1 zSpv|A0?y9Pq^_psqY0mG(n`#Fwqrlop@1Y2I#^66Cns~=-QB9@lPDl(f7^Z7fjx8K zCb20%0TUAwV(j|*TIxZi*N}dn{b0u>KnHDhcXu(A!{}*>Ehf|)(n+u#`@s(E!LCh1 zSpswc7Z(>{dwY8>3_to*D**k_A9h>4N0+H&n2u7y5{7isNz*mDOW)g@lKnEJK@=Z()rth-C z-w;6f08UR&GxJTTp{uJ)%2o{!fCEDY9aMEDz#i<4V$b+suT1r~Rr7JUl#vhlhvq zn;n0DpPQQto0^*BzDX7$ZNZbfySrd|dRpw`CwTns*VoqM0{i>>5&XN*DN32QX-^Yh`t!a~UHDb91-T*MoJWIgO{=stAcgc_+C zF(4MiBozi$!TQ{f783kNK*|_e`n-L)22M*tdf;R6WV z6+Au@{513l4fu2UlY7e^wh(Vkr7Dykt}aCDLxjfaDL88&YAzWG1RS`qCR0d Uhf+r841JJ!p00i_>zopr052DVy#N3J literal 0 HcmV?d00001 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 } ] } From 07325fcdf80e9545da7d38a718c225e5b792136d Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Wed, 7 Aug 2024 23:12:04 +0000 Subject: [PATCH 15/57] Automatic Changelog Update (#696) --- Resources/Changelog/Changelog.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index fb3fd2c343c..3334fd4e136 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -5059,3 +5059,11 @@ Entries: 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' From 020e90ab1d9c7adf4c293053881b15a4bc8b4aae Mon Sep 17 00:00:00 2001 From: Danger Revolution! <142105406+DangerRevolution@users.noreply.github.com> Date: Thu, 8 Aug 2024 00:16:30 +0100 Subject: [PATCH 16/57] Add Le Psionic Orb From Nyanotrasen (#685) # Description It says Psionic chat out loud

Media

![image](https://github.com/user-attachments/assets/a60c4110-ce1b-40ca-8177-df2d0b45b6da)

--- # Changelog :cl: - add: Readded Psionic Relay Orb --- .../Entities/Objects/Specific/Research/misc.yml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 Resources/Prototypes/Entities/Objects/Specific/Research/misc.yml 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 From 9e83f669c836e8934ad21585c2c1dcaed6ebec93 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Wed, 7 Aug 2024 23:16:55 +0000 Subject: [PATCH 17/57] Automatic Changelog Update (#685) --- Resources/Changelog/Changelog.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 3334fd4e136..b7ab981fc63 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -5067,3 +5067,9 @@ Entries: 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' From dfe5c2c54045c026621f009b676f7f3ef97692dc Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Wed, 7 Aug 2024 19:18:35 -0400 Subject: [PATCH 18/57] Psionic Refactor Part 1: Respacing To Keep Files Changed Down (#698) # Description Due to some inherent limitations of maintenance, code review, and me having both severely crippling ADHD and a lifelong adderal dependency, I've made the executive decision to break apart the Psionic Refactor into a multitude of smaller, bite sized PRs. I'm keeping the original Psionic Refactor PR open, because I'm going to need it for code reference to keep track of the changes I had originally worked on, but I need to essentially restart the entire refactor from scratch, and approach it from a new angle that's going to make everything actually way easier. I also need to be able to work on each available system individually wherever possible, and this fact is most readily shown by how the Lightning Refactor and Oracle Refactor were both done separately. To start off, this PR is ONLY moving all of the relevant psionics code to core folders, and nothing more. I'm doing this first so that I can immediately cut down massively on the "Files Changed" with the simplest, most basic change necessary to start my work. No changelog because this isn't player facing, and no media because there's literally nothing to show. --- .../CartridgeLoader/Cartridges/GlimmerMonitorUi.cs | 5 ++--- .../Cartridges/GlimmerMonitorUiFragment.xaml | 2 +- .../Cartridges/GlimmerMonitorUiFragment.xaml.cs | 4 ++-- .../{Nyanotrasen => }/Chat/PsionicChatUpdateSystem.cs | 2 +- .../Psionics/Glimmer/GlimmerReactiveVisuals.cs | 0 .../{Nyanotrasen => }/Psionics/UI/AcceptPsionicsEUI.cs | 0 .../{Nyanotrasen => }/Psionics/UI/AcceptPsionicsWindow.cs | 0 .../{Nyanotrasen => }/UserInterface/GlimmerGraph.cs | 2 +- .../UserInterface/Systems/Chat/ChatUIController.cs | 1 - .../Abilities/Psionics/Abilities/DispelPowerSystem.cs | 0 .../Psionics/Abilities/MetapsionicPowerSystem.cs | 0 .../Abilities/Psionics/Abilities/MindSwapPowerSystem.cs | 0 .../Abilities/Psionics/Abilities/MindSwappedComponent.cs | 0 .../Psionics/Abilities/NoosphericZapPowerSystem.cs | 0 .../Psionics/Abilities/PsionicInvisibilityPowerSystem.cs | 0 .../Psionics/Abilities/PsionicRegenerationPowerSystem.cs | 0 .../Psionics/Abilities/PyrokinesisPowerSystem.cs | 0 .../Abilities/Psionics/Abilities/TelegnosisPowerSystem.cs | 0 .../Abilities/Psionics/PsionicAbilitiesSystem.cs | 0 .../{Nyanotrasen => }/Audio/GlimmerSoundComponent.cs | 0 .../Cartridges}/GlimmerMonitorCartridgeComponent.cs | 0 .../Cartridges}/GlimmerMonitorCartridgeSystem.cs | 0 .../{Nyanotrasen/Chat => Chat/Commands}/TSayCommand.cs | 0 Content.Server/Chat/Systems/ChatSystem.cs | 8 +++----- .../NyanoChatSystem.cs => Chat/TelepathicChatSystem.cs} | 6 +++--- .../{Nyanotrasen => }/Chat/TelepathicRepeaterComponent.cs | 2 +- .../{Nyanotrasen => }/Psionics/AcceptPsionicsEui.cs | 0 .../Psionics/AntiPsychicWeaponComponent.cs | 0 .../{Nyanotrasen => }/Psionics/Dreams/DreamSystem.cs | 0 .../{Nyanotrasen => }/Psionics/Glimmer/GlimmerCommands.cs | 0 .../Psionics/Glimmer/GlimmerReactiveSystem.cs | 0 .../Psionics/Glimmer/PassiveGlimmerReductionSystem.cs | 0 .../Psionics/Glimmer/Structures/GlimmerSourceComponent.cs | 0 .../Glimmer/Structures/GlimmerStructuresSystem.cs | 0 .../Psionics/Invisibility/PsionicInvisibilitySystem.cs | 0 .../Invisibility/PsionicInvisibleContactsComponent.cs | 0 .../Invisibility/PsionicInvisibleContactsSystem.cs | 0 .../Invisibility/PsionicallyInvisibleComponent.cs | 0 .../Psionics/PotentialPsionicComponent.cs | 0 .../Psionics/PsionicAwaitingPlayerComponent.cs | 0 .../Psionics/PsionicBonusChanceComponent.cs | 0 .../{Nyanotrasen => }/Psionics/PsionicsCommands.cs | 0 .../{Nyanotrasen => }/Psionics/PsionicsSystem.cs | 0 .../StationEvents/Components/FreeProberRuleComponent.cs | 0 .../StationEvents/Components/GlimmerEventComponent.cs | 0 .../Components/GlimmerRandomSentienceRuleComponent.cs | 0 .../Components/GlimmerRevenantSpawnRuleComponent.cs | 0 .../StationEvents/Components/GlimmerWispRuleComponent.cs | 0 .../StationEvents/Components/MassMindSwapRuleComponent.cs | 0 .../Components/MundaneDischargeRuleComponent.cs | 0 .../Components/NoosphericFryRuleComponent.cs | 0 .../Components/NoosphericStormRuleComponent.cs | 0 .../Components/NoosphericZapRuleComponent.cs | 0 .../Components/PsionicCatGotYourTongueRuleComponent.cs | 0 .../StationEvents/Events/FreeProberRule.cs | 0 .../StationEvents/Events/GlimmerEventSystem.cs | 0 .../StationEvents/Events/GlimmerRandomSentienceRule.cs | 0 .../StationEvents/Events/GlimmerRevenantSpawnRule.cs | 0 .../StationEvents/Events/GlimmerWispSpawnRule.cs | 0 .../StationEvents/Events/MassMindSwapRule.cs | 0 .../StationEvents/Events/MundaneDischargeRule.cs | 0 .../StationEvents/Events/NoosphericFryRule.cs | 0 .../StationEvents/Events/NoosphericStormRule.cs | 0 .../StationEvents/Events/NoosphericZapRule.cs | 0 .../StationEvents/Events/PsionicCatGotYourTongueRule.cs | 0 .../Actions/Events/DispelPowerActionEvent.cs | 0 .../Actions/Events/EatMouseActionEvent.cs | 0 .../Actions/Events/HairballActionEvent.cs | 0 .../Actions/Events/MassSleepPowerActionEvent.cs | 0 .../Actions/Events/MetapsionicPowerActionEvent.cs | 0 .../Actions/Events/MindSwapPowerActionEvent.cs | 0 .../Actions/Events/NoosphericZapPowerActionEvent.cs | 0 .../Actions/Events/PsionicInvisibilityPowerActionEvent.cs | 0 .../Actions/Events/PsionicRegenerationPowerActionEvent.cs | 0 .../Actions/Events/PyrokinesisPowerActionEvent.cs | 0 .../RemovePsionicInvisibilityOffPowerActionEvent.cs | 0 .../Actions/Events/TelegnosisPowerActionEvent.cs | 0 .../CartridgeLoader/Cartridges/GlimmerMonitorUiState.cs | 0 .../{Nyanotrasen => }/Chapel/SacrificeDoAfterEvent.cs | 0 .../Psionics/Abilities/AcceptPsionicsEuiMessage.cs | 0 .../Psionics/Abilities/Dispel/DamageOnDispelComponent.cs | 0 .../Psionics/Abilities/Dispel/DispelPowerComponent.cs | 0 .../Psionics/Abilities/Dispel/DispellableComponent.cs | 0 .../Abilities/MassSleep/MassSleepPowerComponent.cs | 0 .../Psionics/Abilities/MassSleep/MassSleepPowerSystem.cs | 0 .../Abilities/Metapsionics/MetapsionicPowerComponent.cs | 0 .../Psionics/Abilities/MindSwap/MindSwapPowerComponent.cs | 0 .../NoosphericZap/NoosphericZapPowerComponent.cs | 0 .../PsionicInvisibilityPowerComponent.cs | 0 .../PsionicInvisibilityUsedComponent.cs | 0 .../PsionicRegenerationPowerComponent.cs | 0 .../Abilities/Pyrokinesis/PyrokinesisPowerComponent.cs | 0 .../Abilities/Telegnosis/TelegnosisPowerComponent.cs | 0 .../Telegnosis/TelegnosticProjectionComponent.cs | 0 Content.Shared/{Nyanotrasen => }/Psionics/Events.cs | 0 .../{Nyanotrasen => }/Psionics/Glimmer/GlimmerSystem.cs | 0 .../Psionics/Glimmer/SharedGlimmerReactiveComponent.cs | 0 .../Psionics/Glimmer/SharedGlimmerReactiveVisuals.cs | 0 .../Psionics/Items/ClothingGrantPsionicPowerComponent.cs | 0 .../Abilities => }/Psionics/Items/HeadCageComponent.cs | 0 .../Abilities => }/Psionics/Items/HeadCagedComponent.cs | 0 .../Abilities => }/Psionics/Items/PsionicItemsSystem.cs | 0 .../Abilities => }/Psionics/Items/TinfoilHatComponent.cs | 0 .../Abilities => }/Psionics/PsionicComponent.cs | 0 .../Abilities => }/Psionics/PsionicInsulationComponent.cs | 0 .../Abilities => }/Psionics/PsionicsDisabledComponent.cs | 0 .../Psionics/SharedPsionicAbilitiesSystem.cs | 0 Content.Shared/{Nyanotrasen => }/Soul/GolemMessages.cs | 0 .../{Nyanotrasen => }/Soul/GunHeldByGolemComponent.cs | 0 .../{Nyanotrasen => }/Soul/SharedGolemComponent.cs | 0 .../{Nyanotrasen => }/Soul/SharedGolemSystem.cs | 0 111 files changed, 14 insertions(+), 18 deletions(-) rename Content.Client/{Nyanotrasen => }/CartridgeLoader/Cartridges/GlimmerMonitorUi.cs (88%) rename Content.Client/{Nyanotrasen => }/CartridgeLoader/Cartridges/GlimmerMonitorUiFragment.xaml (93%) rename Content.Client/{Nyanotrasen => }/CartridgeLoader/Cartridges/GlimmerMonitorUiFragment.xaml.cs (96%) rename Content.Client/{Nyanotrasen => }/Chat/PsionicChatUpdateSystem.cs (96%) rename Content.Client/{Nyanotrasen => }/Psionics/Glimmer/GlimmerReactiveVisuals.cs (100%) rename Content.Client/{Nyanotrasen => }/Psionics/UI/AcceptPsionicsEUI.cs (100%) rename Content.Client/{Nyanotrasen => }/Psionics/UI/AcceptPsionicsWindow.cs (100%) rename Content.Client/{Nyanotrasen => }/UserInterface/GlimmerGraph.cs (97%) rename Content.Server/{Nyanotrasen => }/Abilities/Psionics/Abilities/DispelPowerSystem.cs (100%) rename Content.Server/{Nyanotrasen => }/Abilities/Psionics/Abilities/MetapsionicPowerSystem.cs (100%) rename Content.Server/{Nyanotrasen => }/Abilities/Psionics/Abilities/MindSwapPowerSystem.cs (100%) rename Content.Server/{Nyanotrasen => }/Abilities/Psionics/Abilities/MindSwappedComponent.cs (100%) rename Content.Server/{Nyanotrasen => }/Abilities/Psionics/Abilities/NoosphericZapPowerSystem.cs (100%) rename Content.Server/{Nyanotrasen => }/Abilities/Psionics/Abilities/PsionicInvisibilityPowerSystem.cs (100%) rename Content.Server/{Nyanotrasen => }/Abilities/Psionics/Abilities/PsionicRegenerationPowerSystem.cs (100%) rename Content.Server/{Nyanotrasen => }/Abilities/Psionics/Abilities/PyrokinesisPowerSystem.cs (100%) rename Content.Server/{Nyanotrasen => }/Abilities/Psionics/Abilities/TelegnosisPowerSystem.cs (100%) rename Content.Server/{Nyanotrasen => }/Abilities/Psionics/PsionicAbilitiesSystem.cs (100%) rename Content.Server/{Nyanotrasen => }/Audio/GlimmerSoundComponent.cs (100%) rename Content.Server/{Nyanotrasen/CartridgeLoader => CartridgeLoader/Cartridges}/GlimmerMonitorCartridgeComponent.cs (100%) rename Content.Server/{Nyanotrasen/CartridgeLoader => CartridgeLoader/Cartridges}/GlimmerMonitorCartridgeSystem.cs (100%) rename Content.Server/{Nyanotrasen/Chat => Chat/Commands}/TSayCommand.cs (100%) rename Content.Server/{Nyanotrasen/Chat/NyanoChatSystem.cs => Chat/TelepathicChatSystem.cs} (97%) rename Content.Server/{Nyanotrasen => }/Chat/TelepathicRepeaterComponent.cs (83%) rename Content.Server/{Nyanotrasen => }/Psionics/AcceptPsionicsEui.cs (100%) rename Content.Server/{Nyanotrasen => }/Psionics/AntiPsychicWeaponComponent.cs (100%) rename Content.Server/{Nyanotrasen => }/Psionics/Dreams/DreamSystem.cs (100%) rename Content.Server/{Nyanotrasen => }/Psionics/Glimmer/GlimmerCommands.cs (100%) rename Content.Server/{Nyanotrasen => }/Psionics/Glimmer/GlimmerReactiveSystem.cs (100%) rename Content.Server/{Nyanotrasen => }/Psionics/Glimmer/PassiveGlimmerReductionSystem.cs (100%) rename Content.Server/{Nyanotrasen => }/Psionics/Glimmer/Structures/GlimmerSourceComponent.cs (100%) rename Content.Server/{Nyanotrasen => }/Psionics/Glimmer/Structures/GlimmerStructuresSystem.cs (100%) rename Content.Server/{Nyanotrasen => }/Psionics/Invisibility/PsionicInvisibilitySystem.cs (100%) rename Content.Server/{Nyanotrasen => }/Psionics/Invisibility/PsionicInvisibleContactsComponent.cs (100%) rename Content.Server/{Nyanotrasen => }/Psionics/Invisibility/PsionicInvisibleContactsSystem.cs (100%) rename Content.Server/{Nyanotrasen => }/Psionics/Invisibility/PsionicallyInvisibleComponent.cs (100%) rename Content.Server/{Nyanotrasen => }/Psionics/PotentialPsionicComponent.cs (100%) rename Content.Server/{Nyanotrasen => }/Psionics/PsionicAwaitingPlayerComponent.cs (100%) rename Content.Server/{Nyanotrasen => }/Psionics/PsionicBonusChanceComponent.cs (100%) rename Content.Server/{Nyanotrasen => }/Psionics/PsionicsCommands.cs (100%) rename Content.Server/{Nyanotrasen => }/Psionics/PsionicsSystem.cs (100%) rename Content.Server/{Nyanotrasen => }/StationEvents/Components/FreeProberRuleComponent.cs (100%) rename Content.Server/{Nyanotrasen => }/StationEvents/Components/GlimmerEventComponent.cs (100%) rename Content.Server/{Nyanotrasen => }/StationEvents/Components/GlimmerRandomSentienceRuleComponent.cs (100%) rename Content.Server/{Nyanotrasen => }/StationEvents/Components/GlimmerRevenantSpawnRuleComponent.cs (100%) rename Content.Server/{Nyanotrasen => }/StationEvents/Components/GlimmerWispRuleComponent.cs (100%) rename Content.Server/{Nyanotrasen => }/StationEvents/Components/MassMindSwapRuleComponent.cs (100%) rename Content.Server/{Nyanotrasen => }/StationEvents/Components/MundaneDischargeRuleComponent.cs (100%) rename Content.Server/{Nyanotrasen => }/StationEvents/Components/NoosphericFryRuleComponent.cs (100%) rename Content.Server/{Nyanotrasen => }/StationEvents/Components/NoosphericStormRuleComponent.cs (100%) rename Content.Server/{Nyanotrasen => }/StationEvents/Components/NoosphericZapRuleComponent.cs (100%) rename Content.Server/{Nyanotrasen => }/StationEvents/Components/PsionicCatGotYourTongueRuleComponent.cs (100%) rename Content.Server/{Nyanotrasen => }/StationEvents/Events/FreeProberRule.cs (100%) rename Content.Server/{Nyanotrasen => }/StationEvents/Events/GlimmerEventSystem.cs (100%) rename Content.Server/{Nyanotrasen => }/StationEvents/Events/GlimmerRandomSentienceRule.cs (100%) rename Content.Server/{Nyanotrasen => }/StationEvents/Events/GlimmerRevenantSpawnRule.cs (100%) rename Content.Server/{Nyanotrasen => }/StationEvents/Events/GlimmerWispSpawnRule.cs (100%) rename Content.Server/{Nyanotrasen => }/StationEvents/Events/MassMindSwapRule.cs (100%) rename Content.Server/{Nyanotrasen => }/StationEvents/Events/MundaneDischargeRule.cs (100%) rename Content.Server/{Nyanotrasen => }/StationEvents/Events/NoosphericFryRule.cs (100%) rename Content.Server/{Nyanotrasen => }/StationEvents/Events/NoosphericStormRule.cs (100%) rename Content.Server/{Nyanotrasen => }/StationEvents/Events/NoosphericZapRule.cs (100%) rename Content.Server/{Nyanotrasen => }/StationEvents/Events/PsionicCatGotYourTongueRule.cs (100%) rename Content.Shared/{Nyanotrasen => }/Actions/Events/DispelPowerActionEvent.cs (100%) rename Content.Shared/{Nyanotrasen => }/Actions/Events/EatMouseActionEvent.cs (100%) rename Content.Shared/{Nyanotrasen => }/Actions/Events/HairballActionEvent.cs (100%) rename Content.Shared/{Nyanotrasen => }/Actions/Events/MassSleepPowerActionEvent.cs (100%) rename Content.Shared/{Nyanotrasen => }/Actions/Events/MetapsionicPowerActionEvent.cs (100%) rename Content.Shared/{Nyanotrasen => }/Actions/Events/MindSwapPowerActionEvent.cs (100%) rename Content.Shared/{Nyanotrasen => }/Actions/Events/NoosphericZapPowerActionEvent.cs (100%) rename Content.Shared/{Nyanotrasen => }/Actions/Events/PsionicInvisibilityPowerActionEvent.cs (100%) rename Content.Shared/{Nyanotrasen => }/Actions/Events/PsionicRegenerationPowerActionEvent.cs (100%) rename Content.Shared/{Nyanotrasen => }/Actions/Events/PyrokinesisPowerActionEvent.cs (100%) rename Content.Shared/{Nyanotrasen => }/Actions/Events/RemovePsionicInvisibilityOffPowerActionEvent.cs (100%) rename Content.Shared/{Nyanotrasen => }/Actions/Events/TelegnosisPowerActionEvent.cs (100%) rename Content.Shared/{Nyanotrasen => }/CartridgeLoader/Cartridges/GlimmerMonitorUiState.cs (100%) rename Content.Shared/{Nyanotrasen => }/Chapel/SacrificeDoAfterEvent.cs (100%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/Abilities/AcceptPsionicsEuiMessage.cs (100%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/Abilities/Dispel/DamageOnDispelComponent.cs (100%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/Abilities/Dispel/DispelPowerComponent.cs (100%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/Abilities/Dispel/DispellableComponent.cs (100%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/Abilities/MassSleep/MassSleepPowerComponent.cs (100%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/Abilities/MassSleep/MassSleepPowerSystem.cs (100%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/Abilities/Metapsionics/MetapsionicPowerComponent.cs (100%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/Abilities/MindSwap/MindSwapPowerComponent.cs (100%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/Abilities/NoosphericZap/NoosphericZapPowerComponent.cs (100%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/Abilities/PsionicInvisibility/PsionicInvisibilityPowerComponent.cs (100%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/Abilities/PsionicInvisibility/PsionicInvisibilityUsedComponent.cs (100%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/Abilities/PsionicRegeneration/PsionicRegenerationPowerComponent.cs (100%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/Abilities/Pyrokinesis/PyrokinesisPowerComponent.cs (100%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/Abilities/Telegnosis/TelegnosisPowerComponent.cs (100%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/Abilities/Telegnosis/TelegnosticProjectionComponent.cs (100%) rename Content.Shared/{Nyanotrasen => }/Psionics/Events.cs (100%) rename Content.Shared/{Nyanotrasen => }/Psionics/Glimmer/GlimmerSystem.cs (100%) rename Content.Shared/{Nyanotrasen => }/Psionics/Glimmer/SharedGlimmerReactiveComponent.cs (100%) rename Content.Shared/{Nyanotrasen => }/Psionics/Glimmer/SharedGlimmerReactiveVisuals.cs (100%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/Items/ClothingGrantPsionicPowerComponent.cs (100%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/Items/HeadCageComponent.cs (100%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/Items/HeadCagedComponent.cs (100%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/Items/PsionicItemsSystem.cs (100%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/Items/TinfoilHatComponent.cs (100%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/PsionicComponent.cs (100%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/PsionicInsulationComponent.cs (100%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/PsionicsDisabledComponent.cs (100%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/SharedPsionicAbilitiesSystem.cs (100%) rename Content.Shared/{Nyanotrasen => }/Soul/GolemMessages.cs (100%) rename Content.Shared/{Nyanotrasen => }/Soul/GunHeldByGolemComponent.cs (100%) rename Content.Shared/{Nyanotrasen => }/Soul/SharedGolemComponent.cs (100%) rename Content.Shared/{Nyanotrasen => }/Soul/SharedGolemSystem.cs (100%) 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/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/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.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 100% rename from Content.Server/Nyanotrasen/Abilities/Psionics/PsionicAbilitiesSystem.cs rename to Content.Server/Abilities/Psionics/PsionicAbilitiesSystem.cs 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/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 b41d2deda6f..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,9 +69,7 @@ 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 @@ -277,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; } } 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/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 100% rename from Content.Server/Nyanotrasen/Psionics/Glimmer/GlimmerCommands.cs rename to Content.Server/Psionics/Glimmer/GlimmerCommands.cs diff --git a/Content.Server/Nyanotrasen/Psionics/Glimmer/GlimmerReactiveSystem.cs b/Content.Server/Psionics/Glimmer/GlimmerReactiveSystem.cs similarity index 100% rename from Content.Server/Nyanotrasen/Psionics/Glimmer/GlimmerReactiveSystem.cs rename to Content.Server/Psionics/Glimmer/GlimmerReactiveSystem.cs diff --git a/Content.Server/Nyanotrasen/Psionics/Glimmer/PassiveGlimmerReductionSystem.cs b/Content.Server/Psionics/Glimmer/PassiveGlimmerReductionSystem.cs similarity index 100% rename from Content.Server/Nyanotrasen/Psionics/Glimmer/PassiveGlimmerReductionSystem.cs rename to Content.Server/Psionics/Glimmer/PassiveGlimmerReductionSystem.cs diff --git a/Content.Server/Nyanotrasen/Psionics/Glimmer/Structures/GlimmerSourceComponent.cs b/Content.Server/Psionics/Glimmer/Structures/GlimmerSourceComponent.cs similarity index 100% rename from Content.Server/Nyanotrasen/Psionics/Glimmer/Structures/GlimmerSourceComponent.cs rename to Content.Server/Psionics/Glimmer/Structures/GlimmerSourceComponent.cs diff --git a/Content.Server/Nyanotrasen/Psionics/Glimmer/Structures/GlimmerStructuresSystem.cs b/Content.Server/Psionics/Glimmer/Structures/GlimmerStructuresSystem.cs similarity index 100% rename from Content.Server/Nyanotrasen/Psionics/Glimmer/Structures/GlimmerStructuresSystem.cs rename to Content.Server/Psionics/Glimmer/Structures/GlimmerStructuresSystem.cs 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 100% rename from Content.Server/Nyanotrasen/Psionics/PsionicsSystem.cs rename to Content.Server/Psionics/PsionicsSystem.cs 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/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.Shared/Nyanotrasen/Actions/Events/DispelPowerActionEvent.cs b/Content.Shared/Actions/Events/DispelPowerActionEvent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Actions/Events/DispelPowerActionEvent.cs rename to Content.Shared/Actions/Events/DispelPowerActionEvent.cs diff --git a/Content.Shared/Nyanotrasen/Actions/Events/EatMouseActionEvent.cs b/Content.Shared/Actions/Events/EatMouseActionEvent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Actions/Events/EatMouseActionEvent.cs rename to Content.Shared/Actions/Events/EatMouseActionEvent.cs diff --git a/Content.Shared/Nyanotrasen/Actions/Events/HairballActionEvent.cs b/Content.Shared/Actions/Events/HairballActionEvent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Actions/Events/HairballActionEvent.cs rename to Content.Shared/Actions/Events/HairballActionEvent.cs diff --git a/Content.Shared/Nyanotrasen/Actions/Events/MassSleepPowerActionEvent.cs b/Content.Shared/Actions/Events/MassSleepPowerActionEvent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Actions/Events/MassSleepPowerActionEvent.cs rename to Content.Shared/Actions/Events/MassSleepPowerActionEvent.cs diff --git a/Content.Shared/Nyanotrasen/Actions/Events/MetapsionicPowerActionEvent.cs b/Content.Shared/Actions/Events/MetapsionicPowerActionEvent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Actions/Events/MetapsionicPowerActionEvent.cs rename to Content.Shared/Actions/Events/MetapsionicPowerActionEvent.cs diff --git a/Content.Shared/Nyanotrasen/Actions/Events/MindSwapPowerActionEvent.cs b/Content.Shared/Actions/Events/MindSwapPowerActionEvent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Actions/Events/MindSwapPowerActionEvent.cs rename to Content.Shared/Actions/Events/MindSwapPowerActionEvent.cs diff --git a/Content.Shared/Nyanotrasen/Actions/Events/NoosphericZapPowerActionEvent.cs b/Content.Shared/Actions/Events/NoosphericZapPowerActionEvent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Actions/Events/NoosphericZapPowerActionEvent.cs rename to Content.Shared/Actions/Events/NoosphericZapPowerActionEvent.cs diff --git a/Content.Shared/Nyanotrasen/Actions/Events/PsionicInvisibilityPowerActionEvent.cs b/Content.Shared/Actions/Events/PsionicInvisibilityPowerActionEvent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Actions/Events/PsionicInvisibilityPowerActionEvent.cs rename to Content.Shared/Actions/Events/PsionicInvisibilityPowerActionEvent.cs diff --git a/Content.Shared/Nyanotrasen/Actions/Events/PsionicRegenerationPowerActionEvent.cs b/Content.Shared/Actions/Events/PsionicRegenerationPowerActionEvent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Actions/Events/PsionicRegenerationPowerActionEvent.cs rename to Content.Shared/Actions/Events/PsionicRegenerationPowerActionEvent.cs diff --git a/Content.Shared/Nyanotrasen/Actions/Events/PyrokinesisPowerActionEvent.cs b/Content.Shared/Actions/Events/PyrokinesisPowerActionEvent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Actions/Events/PyrokinesisPowerActionEvent.cs rename to Content.Shared/Actions/Events/PyrokinesisPowerActionEvent.cs diff --git a/Content.Shared/Nyanotrasen/Actions/Events/RemovePsionicInvisibilityOffPowerActionEvent.cs b/Content.Shared/Actions/Events/RemovePsionicInvisibilityOffPowerActionEvent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Actions/Events/RemovePsionicInvisibilityOffPowerActionEvent.cs rename to Content.Shared/Actions/Events/RemovePsionicInvisibilityOffPowerActionEvent.cs diff --git a/Content.Shared/Nyanotrasen/Actions/Events/TelegnosisPowerActionEvent.cs b/Content.Shared/Actions/Events/TelegnosisPowerActionEvent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Actions/Events/TelegnosisPowerActionEvent.cs rename to Content.Shared/Actions/Events/TelegnosisPowerActionEvent.cs 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/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/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 From f79c6db8c9549bb595423205004893ed59cb1f8d Mon Sep 17 00:00:00 2001 From: Angelo Fallaria Date: Thu, 8 Aug 2024 07:38:33 +0800 Subject: [PATCH 19/57] New Trait: Sluggish / Snail-Paced (#692) # Description This PR adds two new negative traits that decrease your movement speed: **Sluggish** and **Snail-Paced**. - Sluggish (+1 points) - 15% slower movement speed - 35% slower climbing speed (for standard tables, from 1.5s to ~2.02 seconds) - Cooldown on laying down/standing up increased from 2.5 seconds to 3 seconds - Snail-Paced (+2 points) - 30% slower movement speed - 66% slower climbing speed (for standard tables, from 1.5s to ~2.48 seconds) - Cooldown on laying down/standing up increased from 2.5 seconds to 4 seconds ## Media
Expand **Trait entry** ![image](https://github.com/user-attachments/assets/cb483536-ec3e-4c28-a4b4-c431bb1b669e) ![image](https://github.com/user-attachments/assets/a251844e-7058-4d4b-b21d-a5637c39489f)
# Changelog :cl: Skubman - add: Add two new negative traits: Sluggish (+1) and Snail-Paced (+2) that make you move slower, and climb tables slower. --------- Signed-off-by: Angelo Fallaria Co-authored-by: VMSolidus --- .../Assorted/TraitSpeedModifierComponent.cs | 14 +++++++ .../Assorted/TraitSpeedModifierSystem.cs | 19 ++++++++++ Resources/Locale/en-US/traits/traits.ftl | 12 +++++- Resources/Prototypes/Traits/disabilities.yml | 38 +++++++++++++++++++ Resources/Prototypes/Traits/skills.yml | 6 +++ 5 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 Content.Server/Traits/Assorted/TraitSpeedModifierComponent.cs create mode 100644 Content.Server/Traits/Assorted/TraitSpeedModifierSystem.cs diff --git a/Content.Server/Traits/Assorted/TraitSpeedModifierComponent.cs b/Content.Server/Traits/Assorted/TraitSpeedModifierComponent.cs new file mode 100644 index 00000000000..6acb32e6c1d --- /dev/null +++ b/Content.Server/Traits/Assorted/TraitSpeedModifierComponent.cs @@ -0,0 +1,14 @@ +namespace Content.Server.Traits.Assorted; + +/// +/// This component is used for traits that modify movement speed. +/// +[RegisterComponent] +public sealed partial class TraitSpeedModifierComponent : Component +{ + [DataField(required: true)] + public float WalkModifier = 1.0f; + + [DataField(required: true)] + public float SprintModifier = 1.0f; +} diff --git a/Content.Server/Traits/Assorted/TraitSpeedModifierSystem.cs b/Content.Server/Traits/Assorted/TraitSpeedModifierSystem.cs new file mode 100644 index 00000000000..c804592347a --- /dev/null +++ b/Content.Server/Traits/Assorted/TraitSpeedModifierSystem.cs @@ -0,0 +1,19 @@ +using Content.Shared.Movement.Systems; +using Content.Server.Traits.Assorted; + +namespace Content.Shared.Traits.Assorted; + +public sealed class TraitSpeedModifierSystem : EntitySystem +{ + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnRefreshMovementSpeed); + } + + private void OnRefreshMovementSpeed(EntityUid uid, TraitSpeedModifierComponent component, RefreshMovementSpeedModifiersEvent args) + { + args.ModifySpeed(component.WalkModifier, component.SprintModifier); + } +} diff --git a/Resources/Locale/en-US/traits/traits.ftl b/Resources/Locale/en-US/traits/traits.ftl index 3439ffcdc97..5fb361af01f 100644 --- a/Resources/Locale/en-US/traits/traits.ftl +++ b/Resources/Locale/en-US/traits/traits.ftl @@ -89,6 +89,16 @@ 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. @@ -106,4 +116,4 @@ trait-description-Spearmaster = 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%. \ No newline at end of file + Your melee damage bonus for all Brute damage types (Blunt, Slash, Piercing) becomes 25%. diff --git a/Resources/Prototypes/Traits/disabilities.yml b/Resources/Prototypes/Traits/disabilities.yml index afdd27f339d..c47a673f84a 100644 --- a/Resources/Prototypes/Traits/disabilities.yml +++ b/Resources/Prototypes/Traits/disabilities.yml @@ -95,6 +95,44 @@ components: - type: Snoring +- type: trait + id: Sluggish + category: Physical + points: 1 + requirements: + - !type:CharacterTraitRequirement + inverted: true + traits: + - ParkourTraining + - SnailPaced + 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 + 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 diff --git a/Resources/Prototypes/Traits/skills.yml b/Resources/Prototypes/Traits/skills.yml index 1a4242aff80..0da622da3c9 100644 --- a/Resources/Prototypes/Traits/skills.yml +++ b/Resources/Prototypes/Traits/skills.yml @@ -91,6 +91,12 @@ id: ParkourTraining category: Physical points: -3 + requirements: + - !type:CharacterTraitRequirement + inverted: true + traits: + - Sluggish + - SnailPaced components: - type: ClimbDelayModifier climbDelayMultiplier: 0.70 From 04330a4cc89906508db781503f55a2ea8084b770 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Wed, 7 Aug 2024 23:38:58 +0000 Subject: [PATCH 20/57] Automatic Changelog Update (#692) --- Resources/Changelog/Changelog.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index b7ab981fc63..6de7dc7bf17 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -5073,3 +5073,11 @@ Entries: 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' From 54e59822b6098df2f399c67d3fb7f7b6e2f1cbdd Mon Sep 17 00:00:00 2001 From: Angelo Fallaria Date: Thu, 8 Aug 2024 07:39:52 +0800 Subject: [PATCH 21/57] New Trait: Hemophilia (#690) # Description **Hemophilia** is a +1 point negative Physical trait that makes you more susceptible to bleeding. You bleed twice as long, and you take 10% more Blunt damage. ## Media
Expand ![image](https://github.com/user-attachments/assets/ceb0e91e-73c8-4986-a566-40fb9cd0d32b)
--- # Changelog :cl: Skubman - add: 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. --- .../Body/Components/BloodstreamComponent.cs | 2 +- Content.Server/Traits/HemophiliaComponent.cs | 21 ++++++++++++++ Content.Server/Traits/HemophiliaSystem.cs | 28 +++++++++++++++++++ Resources/Locale/en-US/traits/traits.ftl | 5 ++++ Resources/Prototypes/Traits/disabilities.yml | 17 +++++++++++ 5 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 Content.Server/Traits/HemophiliaComponent.cs create mode 100644 Content.Server/Traits/HemophiliaSystem.cs diff --git a/Content.Server/Body/Components/BloodstreamComponent.cs b/Content.Server/Body/Components/BloodstreamComponent.cs index 76eadb99fd8..dd93da9598c 100644 --- a/Content.Server/Body/Components/BloodstreamComponent.cs +++ b/Content.Server/Body/Components/BloodstreamComponent.cs @@ -12,7 +12,7 @@ namespace Content.Server.Body.Components { - [RegisterComponent, Access(typeof(BloodstreamSystem), typeof(ReactionMixerSystem), typeof(BloodDeficiencySystem))] + [RegisterComponent, Access(typeof(BloodstreamSystem), typeof(ReactionMixerSystem), typeof(BloodDeficiencySystem), typeof(HemophiliaSystem))] public sealed partial class BloodstreamComponent : Component { public static string DefaultChemicalsSolutionName = "chemicals"; 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/Resources/Locale/en-US/traits/traits.ftl b/Resources/Locale/en-US/traits/traits.ftl index 5fb361af01f..16cae663009 100644 --- a/Resources/Locale/en-US/traits/traits.ftl +++ b/Resources/Locale/en-US/traits/traits.ftl @@ -28,6 +28,11 @@ 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 diff --git a/Resources/Prototypes/Traits/disabilities.yml b/Resources/Prototypes/Traits/disabilities.yml index c47a673f84a..915ea0bf674 100644 --- a/Resources/Prototypes/Traits/disabilities.yml +++ b/Resources/Prototypes/Traits/disabilities.yml @@ -146,3 +146,20 @@ 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 From 0fc4051e4f1333da6d8b1ea57531230aa9e48b9b Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Wed, 7 Aug 2024 23:40:16 +0000 Subject: [PATCH 22/57] Automatic Changelog Update (#690) --- Resources/Changelog/Changelog.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 6de7dc7bf17..744677a1147 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -5081,3 +5081,11 @@ Entries: 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' From c469961bf9944fdd37da2578f84211e51a075293 Mon Sep 17 00:00:00 2001 From: SleepyScarecrow <136123749+SleepyScarecrow@users.noreply.github.com> Date: Wed, 7 Aug 2024 19:51:29 -0400 Subject: [PATCH 23/57] Aloe Cream Recipe Fix, Now 15 Seconds (#688) # Description Changed the cooking time for aloe cream, so now it doesn't interfere with RegenerativeMesh any longer. # Changelog :cl: - fix: Fixed the RegenMesh recipe --- Resources/Prototypes/Recipes/Cooking/medical_recipes.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 From 7ef43ac75251636175c535ea610118b9870704b8 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Wed, 7 Aug 2024 23:51:52 +0000 Subject: [PATCH 24/57] Automatic Changelog Update (#688) --- Resources/Changelog/Changelog.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 744677a1147..bb19e08360c 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -5089,3 +5089,9 @@ Entries: 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' From f2e6d1a657588be369a9ac0c2a19c9a4962170af Mon Sep 17 00:00:00 2001 From: dootythefrooty <137359445+dootythefrooty@users.noreply.github.com> Date: Wed, 7 Aug 2024 16:54:13 -0700 Subject: [PATCH 25/57] New Plant Trait : Bluespace Slips (#674) # Description Adds a new trait which plants can mutate to have. It teleports both the slippee and the produce to a random location within a radius determined by how potent the produce is. Inert unless the plant also has the slippery trait. ~~Probably very stinky code considering this is my first time dealing with c#.~~ ---

Media

https://github.com/user-attachments/assets/cd22756d-ea5e-4a30-8043-c991549c9019

--- # Changelog :cl: - add: Added Bluespace Slips, a plant trait that teleports you randomly if you slip. --- .../Components/TeleportingTraitComponent.cs | 31 +++++++++++ Content.Server/Botany/SeedPrototype.cs | 8 ++- .../Botany/Systems/BotanySystem.Seed.cs | 5 ++ .../Botany/Systems/MutationSystem.cs | 6 ++- .../Botany/Systems/TeleportingTraitSystem.cs | 51 +++++++++++++++++++ .../teleporting-trait-component.ftl | 1 + 6 files changed, 99 insertions(+), 3 deletions(-) create mode 100644 Content.Server/Botany/Components/TeleportingTraitComponent.cs create mode 100644 Content.Server/Botany/Systems/TeleportingTraitSystem.cs create mode 100644 Resources/Locale/en-US/botany/components/teleporting-trait-component.ftl 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/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! From a243fca7063844cb2ec13bafce52e216f94f5cb9 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Wed, 7 Aug 2024 23:54:35 +0000 Subject: [PATCH 26/57] Automatic Changelog Update (#674) --- Resources/Changelog/Changelog.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index bb19e08360c..0aff29d638c 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -5095,3 +5095,11 @@ Entries: 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' From 4c4b37aacca1448842155a9a1bafa0d002e1c890 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Wed, 7 Aug 2024 20:09:41 -0400 Subject: [PATCH 27/57] 1984 Dresser Arbitrage 2, Electric Boogaloo (#682) # Description @DEATHB4DEFEAT ![image](https://github.com/user-attachments/assets/0ee6b468-7959-4ebd-8202-6fbc2794511c) No changelog because this isn't player facing. --- Resources/Prototypes/Entities/Structures/Furniture/dresser.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Prototypes/Entities/Structures/Furniture/dresser.yml b/Resources/Prototypes/Entities/Structures/Furniture/dresser.yml index 6c50b334091..1d0a25ed852 100644 --- a/Resources/Prototypes/Entities/Structures/Furniture/dresser.yml +++ b/Resources/Prototypes/Entities/Structures/Furniture/dresser.yml @@ -52,7 +52,7 @@ suffix: Filled components: - type: StaticPrice - price: 5 + price: 15 - type: StorageFill contents: - id: ClothingNeckLGBTPin From 9b112609e009fedccf7adb70292af914752fcd2c Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Wed, 7 Aug 2024 20:10:21 -0400 Subject: [PATCH 28/57] Respace Psionics Audio & Localization Files (#700) # Description Effectively Part 2 of splitting up the Psionic Refactor. This PR is partially respacing the non-C# side of Psionics code, such as Localizations, Audio files, some entities. I'm not respacing all of them in a single sitting because just finding them all is a complete pain in the ass. No media because there's nothing to show. No changelog because this isn't player facing. --- .../Ambience/Objects/prober_hum_dangerous.ogg | Bin .../Ambience/Objects/prober_hum_high.ogg | Bin .../Ambience/Objects/prober_hum_low.ogg | Bin .../Ambience/Objects/prober_hum_moderate.ogg | Bin .../Psionics/attributions.yml | 0 .../Psionics/heartbeat_fast.ogg | Bin .../{nyanotrasen => }/abilities/psionic.ftl | 0 .../en-US/cartridge-loader/cartridges.ftl | 5 + .../en-US/chemistry/reagent-effects.ftl | 2 +- .../en-US/guidebook/chemistry/effects.ftl | 18 +++ Resources/Locale/en-US/guidebook/guides.ftl | 4 + .../cartridge-loader/cartridges.ftl | 4 - .../en-US/nyanotrasen/chemistry/effects.ftl | 18 --- .../en-US/nyanotrasen/guidebook/guides.ftl | 3 - .../en-US/nyanotrasen/reagents/toxins.ftl | 8 - .../xenoarchaeology/artifact-hints.ftl | 1 - .../paper => psionics}/book-epistemics.ftl | 0 .../cargo => psionics}/cargo-epistemics.ftl | 0 .../{nyanotrasen => }/psionics/death-gasp.ftl | 0 .../crates => psionics}/epistemics-crates.ftl | 0 .../events => psionics}/noospheric-storm.ftl | 0 .../objectives.ftl} | 0 .../research => psionics}/oracle.ftl | 0 .../psionics/psionic-chat.ftl | 0 .../psionics/psionic-commands.ftl | 0 .../paper => psionics}/stamp-component.ftl | 0 .../research => psionics}/technologies.ftl | 0 .../Locale/en-US/reagents/meta/toxins.ftl | 9 ++ .../{nyanotrasen => }/reagents/psionic.ftl | 0 .../en-US/xenoarchaeology/artifact-hints.ftl | 3 + Resources/Prototypes/Actions/psionics.yml | 136 +++++++++++++++++ .../Prototypes/Nyanotrasen/Actions/types.yml | 139 +----------------- .../Structures/Research/glimmer_prober.yml | 14 +- .../Interface/VerbIcons/dispel.png | Bin .../Interface/VerbIcons/dispel.png.yml | 0 .../Interface/VerbIcons/license.txt | 0 .../Interface/VerbIcons/mass_sleep.png | Bin .../Interface/VerbIcons/mass_sleep.png.yml | 0 .../Interface/VerbIcons/metapsionic.png | Bin .../Interface/VerbIcons/metapsionic.png.yml | 0 .../Interface/VerbIcons/mind_swap.png | Bin .../Interface/VerbIcons/mind_swap.png.yml | 0 .../Interface/VerbIcons/mind_swap_return.png | Bin .../VerbIcons/mind_swap_return.png.yml | 0 .../Interface/VerbIcons/noospheric_zap.png | Bin .../VerbIcons/noospheric_zap.png.yml | 0 .../VerbIcons/psionic_invisibility.png | Bin .../VerbIcons/psionic_invisibility.png.yml | 0 .../VerbIcons/psionic_invisibility_off.png | Bin .../psionic_invisibility_off.png.yml | 0 .../VerbIcons/psionic_regeneration.png | Bin .../VerbIcons/psionic_regeneration.png.yml | 0 .../Interface/VerbIcons/pyrokinesis.png | Bin .../Interface/VerbIcons/pyrokinesis.png.yml | 0 .../Interface/VerbIcons/telegnosis.png | Bin .../Interface/VerbIcons/telegnosis.png.yml | 0 56 files changed, 184 insertions(+), 180 deletions(-) rename Resources/Audio/{Nyanotrasen => }/Ambience/Objects/prober_hum_dangerous.ogg (100%) rename Resources/Audio/{Nyanotrasen => }/Ambience/Objects/prober_hum_high.ogg (100%) rename Resources/Audio/{Nyanotrasen => }/Ambience/Objects/prober_hum_low.ogg (100%) rename Resources/Audio/{Nyanotrasen => }/Ambience/Objects/prober_hum_moderate.ogg (100%) rename Resources/Audio/{Nyanotrasen => }/Psionics/attributions.yml (100%) rename Resources/Audio/{Nyanotrasen => }/Psionics/heartbeat_fast.ogg (100%) rename Resources/Locale/en-US/{nyanotrasen => }/abilities/psionic.ftl (100%) delete mode 100644 Resources/Locale/en-US/nyanotrasen/cartridge-loader/cartridges.ftl delete mode 100644 Resources/Locale/en-US/nyanotrasen/guidebook/guides.ftl delete mode 100644 Resources/Locale/en-US/nyanotrasen/reagents/toxins.ftl delete mode 100644 Resources/Locale/en-US/nyanotrasen/xenoarchaeology/artifact-hints.ftl rename Resources/Locale/en-US/{nyanotrasen/paper => psionics}/book-epistemics.ftl (100%) rename Resources/Locale/en-US/{nyanotrasen/prototypes/catalog/cargo => psionics}/cargo-epistemics.ftl (100%) rename Resources/Locale/en-US/{nyanotrasen => }/psionics/death-gasp.ftl (100%) rename Resources/Locale/en-US/{nyanotrasen/prototypes/catalog/fills/crates => psionics}/epistemics-crates.ftl (100%) rename Resources/Locale/en-US/{nyanotrasen/station-events/events => psionics}/noospheric-storm.ftl (100%) rename Resources/Locale/en-US/{nyanotrasen/objectives/conditions/conditions.ftl => psionics/objectives.ftl} (100%) rename Resources/Locale/en-US/{nyanotrasen/research => psionics}/oracle.ftl (100%) rename Resources/Locale/en-US/{nyanotrasen => }/psionics/psionic-chat.ftl (100%) rename Resources/Locale/en-US/{nyanotrasen => }/psionics/psionic-commands.ftl (100%) rename Resources/Locale/en-US/{nyanotrasen/paper => psionics}/stamp-component.ftl (100%) rename Resources/Locale/en-US/{nyanotrasen/research => psionics}/technologies.ftl (100%) rename Resources/Locale/en-US/{nyanotrasen => }/reagents/psionic.ftl (100%) create mode 100644 Resources/Prototypes/Actions/psionics.yml rename Resources/Textures/{Nyanotrasen => }/Interface/VerbIcons/dispel.png (100%) rename Resources/Textures/{Nyanotrasen => }/Interface/VerbIcons/dispel.png.yml (100%) rename Resources/Textures/{Nyanotrasen => }/Interface/VerbIcons/license.txt (100%) rename Resources/Textures/{Nyanotrasen => }/Interface/VerbIcons/mass_sleep.png (100%) rename Resources/Textures/{Nyanotrasen => }/Interface/VerbIcons/mass_sleep.png.yml (100%) rename Resources/Textures/{Nyanotrasen => }/Interface/VerbIcons/metapsionic.png (100%) rename Resources/Textures/{Nyanotrasen => }/Interface/VerbIcons/metapsionic.png.yml (100%) rename Resources/Textures/{Nyanotrasen => }/Interface/VerbIcons/mind_swap.png (100%) rename Resources/Textures/{Nyanotrasen => }/Interface/VerbIcons/mind_swap.png.yml (100%) rename Resources/Textures/{Nyanotrasen => }/Interface/VerbIcons/mind_swap_return.png (100%) rename Resources/Textures/{Nyanotrasen => }/Interface/VerbIcons/mind_swap_return.png.yml (100%) rename Resources/Textures/{Nyanotrasen => }/Interface/VerbIcons/noospheric_zap.png (100%) rename Resources/Textures/{Nyanotrasen => }/Interface/VerbIcons/noospheric_zap.png.yml (100%) rename Resources/Textures/{Nyanotrasen => }/Interface/VerbIcons/psionic_invisibility.png (100%) rename Resources/Textures/{Nyanotrasen => }/Interface/VerbIcons/psionic_invisibility.png.yml (100%) rename Resources/Textures/{Nyanotrasen => }/Interface/VerbIcons/psionic_invisibility_off.png (100%) rename Resources/Textures/{Nyanotrasen => }/Interface/VerbIcons/psionic_invisibility_off.png.yml (100%) rename Resources/Textures/{Nyanotrasen => }/Interface/VerbIcons/psionic_regeneration.png (100%) rename Resources/Textures/{Nyanotrasen => }/Interface/VerbIcons/psionic_regeneration.png.yml (100%) rename Resources/Textures/{Nyanotrasen => }/Interface/VerbIcons/pyrokinesis.png (100%) rename Resources/Textures/{Nyanotrasen => }/Interface/VerbIcons/pyrokinesis.png.yml (100%) rename Resources/Textures/{Nyanotrasen => }/Interface/VerbIcons/telegnosis.png (100%) rename Resources/Textures/{Nyanotrasen => }/Interface/VerbIcons/telegnosis.png.yml (100%) 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/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/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/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/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/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/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/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/nyanotrasen/paper/stamp-component.ftl b/Resources/Locale/en-US/psionics/stamp-component.ftl similarity index 100% rename from Resources/Locale/en-US/nyanotrasen/paper/stamp-component.ftl rename to Resources/Locale/en-US/psionics/stamp-component.ftl 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/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/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/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/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/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/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/dispel.png.yml b/Resources/Textures/Interface/VerbIcons/dispel.png.yml similarity index 100% rename from Resources/Textures/Nyanotrasen/Interface/VerbIcons/dispel.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/mass_sleep.png.yml b/Resources/Textures/Interface/VerbIcons/mass_sleep.png.yml similarity index 100% rename from Resources/Textures/Nyanotrasen/Interface/VerbIcons/mass_sleep.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/metapsionic.png.yml b/Resources/Textures/Interface/VerbIcons/metapsionic.png.yml similarity index 100% rename from Resources/Textures/Nyanotrasen/Interface/VerbIcons/metapsionic.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.png.yml b/Resources/Textures/Interface/VerbIcons/mind_swap.png.yml similarity index 100% rename from Resources/Textures/Nyanotrasen/Interface/VerbIcons/mind_swap.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/mind_swap_return.png.yml b/Resources/Textures/Interface/VerbIcons/mind_swap_return.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_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/noospheric_zap.png.yml b/Resources/Textures/Interface/VerbIcons/noospheric_zap.png.yml similarity index 100% rename from Resources/Textures/Nyanotrasen/Interface/VerbIcons/noospheric_zap.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.png.yml b/Resources/Textures/Interface/VerbIcons/psionic_invisibility.png.yml similarity index 100% rename from Resources/Textures/Nyanotrasen/Interface/VerbIcons/psionic_invisibility.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_invisibility_off.png.yml b/Resources/Textures/Interface/VerbIcons/psionic_invisibility_off.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_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/psionic_regeneration.png.yml b/Resources/Textures/Interface/VerbIcons/psionic_regeneration.png.yml similarity index 100% rename from Resources/Textures/Nyanotrasen/Interface/VerbIcons/psionic_regeneration.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/pyrokinesis.png.yml b/Resources/Textures/Interface/VerbIcons/pyrokinesis.png.yml similarity index 100% rename from Resources/Textures/Nyanotrasen/Interface/VerbIcons/pyrokinesis.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/Nyanotrasen/Interface/VerbIcons/telegnosis.png.yml b/Resources/Textures/Interface/VerbIcons/telegnosis.png.yml similarity index 100% rename from Resources/Textures/Nyanotrasen/Interface/VerbIcons/telegnosis.png.yml rename to Resources/Textures/Interface/VerbIcons/telegnosis.png.yml From e9e10f29b69cef5b79114caec0786de3b801d757 Mon Sep 17 00:00:00 2001 From: BlueHNT <79374236+BlueHNT@users.noreply.github.com> Date: Thu, 8 Aug 2024 02:16:02 +0200 Subject: [PATCH 29/57] Updates WelderRefinable Component (#687) # Description I have made this originally for N14 as there was a heavy need for junk items to be list instead of a hash. It created a few issues where you were unable to put down 2 pieces of steel without making a new defined entity which spawns a stack of 2. I thought this was quite annoying so I decided to instead make it into a `EntitySpawnEntry` from a `string` which would also give it options of `amount` `prob` `maxAmount` and `orGroup` which would definitely aid in the scrapping needs there as you could randomize the refined amounts. I believe this could be useful upstream. As well as cleaning up code which is more modifiable than before. The new example of how it can be typed in yaml is also simpler in my opinion as it is self-explanatory and used in various places like StorageFill contents for one. ```YAML - type: WelderRefinable refineResult: - id: SheetGlass1 amount: 1 maxAmount: 2 prob: 0.5 orGroup: Glass ``` --- :cl: refactor: Refactors WelderRefinableComponent.cs and RefiningSystem.cs tweak: Tweaked the formatting for WelderRefinable refineResult to use EntitySpawnEntry format --- .../Components/WelderRefinableComponent.cs | 13 +++++----- Content.Server/Construction/RefiningSystem.cs | 15 +++-------- .../Entities/Objects/Materials/shards.yml | 18 ++++++------- .../Entities/Objects/Misc/broken_bottle.yml | 2 +- .../Entities/Objects/Power/lights.yml | 26 +++++++++---------- 5 files changed, 33 insertions(+), 41 deletions(-) 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/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/broken_bottle.yml b/Resources/Prototypes/Entities/Objects/Misc/broken_bottle.yml index b7c73f5e0cc..32222d0036c 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/broken_bottle.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/broken_bottle.yml @@ -28,4 +28,4 @@ - type: SpaceGarbage - type: WelderRefinable refineResult: - - SheetGlass1 + - id: SheetGlass1 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 From 844218c8180d2e4439642717ad1c91e1d7229381 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Thu, 8 Aug 2024 00:16:23 +0000 Subject: [PATCH 30/57] Automatic Changelog Update (#687) --- Resources/Changelog/Changelog.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 0aff29d638c..45e36fa3f08 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -5103,3 +5103,11 @@ Entries: 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' From 75d2ea8f35c9be1b76a6b6c15531fc2cf5592fe9 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Wed, 7 Aug 2024 20:18:08 -0400 Subject: [PATCH 31/57] 1984 Shit Colored Moths (#681) # Description I'll let google image search make my case. ![image](https://github.com/user-attachments/assets/c8fe9ec7-0292-4d77-bc94-f890219349e3) ![image](https://github.com/user-attachments/assets/1d871bff-4a18-4ce9-a121-d0282821c48c) ![image](https://github.com/user-attachments/assets/2375fe34-691c-49ab-b9d7-a16a17b2a3ce) Done. By popular request, I'm bringing back RGB Moths. # Changelog :cl: - fix: Moths can now once again be colorful. --- Content.Shared/Humanoid/SkinColor.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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); From ba9a93707855c63dcbbbdc5cf5fe0931f196c9b0 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Thu, 8 Aug 2024 00:18:30 +0000 Subject: [PATCH 32/57] Automatic Changelog Update (#681) --- Resources/Changelog/Changelog.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 45e36fa3f08..f6fba8d64b5 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -5111,3 +5111,9 @@ Entries: 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' From d1c8bf10953b63c675eb8629b119fb06f66b1ea5 Mon Sep 17 00:00:00 2001 From: Mnemotechnican <69920617+Mnemotechnician@users.noreply.github.com> Date: Fri, 9 Aug 2024 13:52:49 +0300 Subject: [PATCH 33/57] Tweak Skeleton Description (#707) # Description Cherry-picks https://github.com/Fansana/floofstation1/pull/88 from Floofstation - changes skeleton description to match with Delta-v. Credit to ShatteredSwords. # Changelog :cl: ShatteredSwords - tweak: Skeleton ghost role description has been adjusted to be less evil. --------- Signed-off-by: Mnemotechnican <69920617+Mnemotechnician@users.noreply.github.com> Co-authored-by: ShatteredSwords <135023515+ShatteredSwords@users.noreply.github.com> --- Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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... From 892f1e04c9861e04b2b1e7fc6c2279e80f1b53fa Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Fri, 9 Aug 2024 10:53:11 +0000 Subject: [PATCH 34/57] Automatic Changelog Update (#707) --- Resources/Changelog/Changelog.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index f6fba8d64b5..6e9745ffd8b 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -5117,3 +5117,9 @@ Entries: 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' From 7d92c3e69f2347fe4616600698f63e6d23280282 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Fri, 9 Aug 2024 07:13:13 -0400 Subject: [PATCH 35/57] Soft-Refactor Geiger Counters (#615) # Description This refactors Geiger Counters so that their behavior of "Only making sound to a person holding them" is no longer hardcoded. The GeigerCounterComponent now can define how loud it ticks, how far away people can hear the ticks, and whether it plays only for the person holding it or for anyone nearby. This PR partially fulfills one of the "Nice To Have" features requested for https://github.com/Simple-Station/Einstein-Engines/pull/341 by making it possible to create stationary radiation alarm objects. It also serves as a substantial quality of life improvement for Engineering and Science crew, since it's now possible to place an active Geiger counter in the artifact lab, and then be able to audibly hear if the lab becomes radioactive due to an artifact.

Media

https://github.com/user-attachments/assets/74122135-7345-4995-bb0e-d1216e1d53b6 https://github.com/user-attachments/assets/de79db6f-e1c1-471f-88b5-0a47ff4bfa16

# Changelog :cl: - add: Geiger Counters other than ones installed in Hardsuits now generate an audible sound when active and exposed to radiation. - add: Wall mounted geiger counters have been added to the game. --------- Signed-off-by: VMSolidus --- .../Radiation/Systems/GeigerSystem.cs | 28 +++++----- .../Radiation/Components/GeigerComponent.cs | 19 +++++-- .../OuterClothing/base_clothingouter.yml | 3 ++ .../Structures/Wallmounts/radalarm.yml | 51 ++++++++++++++++++ .../Wallmounts/radalarm.rsi/geiger_base.png | Bin 0 -> 1283 bytes .../Wallmounts/radalarm.rsi/geiger_on_ext.png | Bin 0 -> 375 bytes .../radalarm.rsi/geiger_on_high.png | Bin 0 -> 375 bytes .../radalarm.rsi/geiger_on_idle.png | Bin 0 -> 326 bytes .../Wallmounts/radalarm.rsi/geiger_on_low.png | Bin 0 -> 363 bytes .../Wallmounts/radalarm.rsi/geiger_on_med.png | Bin 0 -> 368 bytes .../Wallmounts/radalarm.rsi/meta.json | 35 ++++++++++++ 11 files changed, 117 insertions(+), 19 deletions(-) create mode 100644 Resources/Prototypes/Entities/Structures/Wallmounts/radalarm.yml create mode 100644 Resources/Textures/Structures/Wallmounts/radalarm.rsi/geiger_base.png create mode 100644 Resources/Textures/Structures/Wallmounts/radalarm.rsi/geiger_on_ext.png create mode 100644 Resources/Textures/Structures/Wallmounts/radalarm.rsi/geiger_on_high.png create mode 100644 Resources/Textures/Structures/Wallmounts/radalarm.rsi/geiger_on_idle.png create mode 100644 Resources/Textures/Structures/Wallmounts/radalarm.rsi/geiger_on_low.png create mode 100644 Resources/Textures/Structures/Wallmounts/radalarm.rsi/geiger_on_med.png create mode 100644 Resources/Textures/Structures/Wallmounts/radalarm.rsi/meta.json 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.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/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml index d6a2cd446be..358f91d2971 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml @@ -142,6 +142,9 @@ - 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% 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/Textures/Structures/Wallmounts/radalarm.rsi/geiger_base.png b/Resources/Textures/Structures/Wallmounts/radalarm.rsi/geiger_base.png new file mode 100644 index 0000000000000000000000000000000000000000..778c427735012720fbd093e0a7f54b9adb5b5dcb GIT binary patch literal 1283 zcmV+e1^oJnP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf1ei%gK~#8N?VC+# z6fqRXr&cSaqWD?6t)*JE2zpUb#DgLhKMo?O^ybN1p$8GygRlx-R>Xs_7x5&5hzjDt z4+L=!A{9I-i1nkTe$-ZrRV-3vsr%35)tF6YGP|?0vzi|~l1aBS$;-=|yq8_aVzF5M zXKHxqNhXt-)ae3=Hzx9}m3orr8fTS8Qwg6KOt$g=a8F#c!aQnthlTd=_ z1XXMP!^a_3mdgpQT(z!f=V|iHKo)?(%2F;c@KOeEiqUHj`+y*O00Mgf>;sCi02+MW zf>Ql2-ZKCtEQI1vn8Vm~zJm}zqAjc-ky^6=K*2n@X zfoK8PRbJ?8nJUQwyyB3Tub#!j0>S`;7R#V`SwK}N05eHa3|?_fRVY9Q%p7kWS%wN|%+zQ5a5bql8YVO2tzFVm4M5nXo!!3YGv& zzf?RGK(ntB5qB*{;{*vf-!S}+kq_{5Dj2-UYbZ?QwO=g03eY(f5pqaTLf&6SPK&G3 z|+1`002ovPDHLkV1lQfLi_*# literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..7b7f3f4e767822a0454026ece50fdf8aa63daccc GIT binary patch literal 375 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!7>k44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O`0(2Ka=yo-qubspz*wJ?a07p8pOJ|MxEk${c^8m;$8OOM?7@|APU8lsB^* zP>8d@BeIx*f$sJOGwXs7uI@pgKH7q$8)q86K*i9cof7b<0cat^NPii2}sJdh|QQQw?qxU9i%sA7!F7P~0;<4II9;|murgH5Pcbli+x?k44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O`0(2Ka=yo-qubspz*wJ?a07p8pOJ|MxEk${c^8m;$8OOM?7@|APU8lsB^* zP>8d@BeIx*f$sJOGwXs7uI@pgKH7q$8)q86K*i9cof7b<0cat^NPii2}sJdh|QQQw?qxU9i%sA7!F7P~0;<4II9;|murgH5Pcbli+x?k44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O_~O1^9%x+S`|Sc~6vEk-F}i@#+7YfWj|k1jGO-wvr&f;Qt`NuzCNI{Xh}U z0*}aI1_r((Aj~*bn@<`jxZ2ajF(ktM?X=r`4GJ6%d;k5{Hy4xSoVh*9^qlvtXMz)@ z)c6)P-RI?228@qvIwE(XyR3@?Nurq^Y~6x>W|$yl@f_MtwG zd)f+}n#D>H@zbP4no78RnGQW?=_|GO45;UJFLPAa3SczQ=qO~I8t?n@t65k9(Af;0 Lu6{1-oD!Mk44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O_~O1^9%xcKM4hij)2SKj*;`&i@}b0fpa6e^LQbY$ZW{!T&*kVe|ea`+*{y z1s;*b3=DinK$vl=HlH+5@Pem{V@QPi+i4fYniV)4m_ProuUw&1I>|Xx-}=t;{(1YYCyj+c)I$ztaD0e0swKOgqZ*U literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..33d354a6a6ecd6f9b410c95d9aa80557712694e8 GIT binary patch literal 368 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!7>k44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O_~O1^9%xPBP(H=Fb27kpHGeqyK07fx=#U>Y9KQTS<^#@P80s*t~zqexL|v zfk$L90|Va?5N4dJ%_j{Myz1%V7!u+BcABG5vjUH+r_%TRMT$$fR9zKv#pmwnJtjHt zBez$FTg->@rU?^2XRcywa9~ilsx!60z&Yq_Q27KY2XFRgJl|HZxI1dGn$DZb7tqH$ zzov!zYgm2&YxB+vtY7E4OMJA73}X!l>j~)$b=;nC&H90;a_FPyk|jG1uu6*WP}r>K zVc+^CaJ#dg`o4EQNM|}nc>gTe~DWM4f D7!iXk literal 0 HcmV?d00001 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 + } + ] +} From f0340314ad062d4bf7e2bfbfd7dc9efb67a62ce3 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Fri, 9 Aug 2024 11:13:38 +0000 Subject: [PATCH 36/57] Automatic Changelog Update (#615) --- Resources/Changelog/Changelog.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 6e9745ffd8b..f571aeb6bbf 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -5123,3 +5123,13 @@ Entries: 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' From f4d2e3551b78203cfa5bb4a068ebfbdc515a2c23 Mon Sep 17 00:00:00 2001 From: Angelo Fallaria Date: Sat, 10 Aug 2024 01:28:01 +0800 Subject: [PATCH 37/57] Make Dionas Slow And Steady (#704) # Description Dionas now have 25% slower movement speed in exchange for total slip immunity and slow immunity (except lying down). Note that this also prevents slowdowns from hunger and thirst. This also fixes an existing bug with Sluggish and Snail-Paced related to `TraitSpeedModifierSystem`, as it was not applying the reduced movement speed upon spawning, only when the movement speed has been modified by another source. `TraitSpeedModifierSystem` has been moved from `Content.Server` to `Content.Shared`. This used to be a trait costing 3 points, but is now given for free to all Dionas per request of @VMSolidus. ## Media
Expand **Speed with no items** ![image](https://github.com/user-attachments/assets/b723614a-79fe-401c-ae53-2ad98ff9a6d3) **Speed wearing a jugsuit, wearing a duffel bag, holding one duffel bag in each arm, and walking through a puddle of glue covered in spider webs.** ![image](https://github.com/user-attachments/assets/a934d2c1-437f-463c-8fe3-63b7b54a1f58)
# Changelog :cl: Skubman - add: 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. - fix: Sluggish and Snail-Paced will now properly apply their movement penalties upon joining. --- Content.Server/Standing/LayingDownSystem.cs | 2 +- .../Assorted/TraitSpeedModifierSystem.cs | 19 ------------ .../Systems/MovementSpeedModifierSystem.cs | 23 ++++++++++++-- .../SpeedModifierImmunityComponent.cs | 12 +++++++ .../TraitSpeedModifierComponent.cs | 10 +++--- .../Systems/TraitSpeedModifierSystem.cs | 31 +++++++++++++++++++ .../Entities/Mobs/Species/diona.yml | 5 +++ Resources/Prototypes/Traits/disabilities.yml | 8 +++++ Resources/Prototypes/Traits/skills.yml | 4 +++ 9 files changed, 88 insertions(+), 26 deletions(-) delete mode 100644 Content.Server/Traits/Assorted/TraitSpeedModifierSystem.cs create mode 100644 Content.Shared/Traits/Assorted/Components/SpeedModifierImmunityComponent.cs rename {Content.Server/Traits/Assorted => Content.Shared/Traits/Assorted/Components}/TraitSpeedModifierComponent.cs (52%) create mode 100644 Content.Shared/Traits/Assorted/Systems/TraitSpeedModifierSystem.cs 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/Traits/Assorted/TraitSpeedModifierSystem.cs b/Content.Server/Traits/Assorted/TraitSpeedModifierSystem.cs deleted file mode 100644 index c804592347a..00000000000 --- a/Content.Server/Traits/Assorted/TraitSpeedModifierSystem.cs +++ /dev/null @@ -1,19 +0,0 @@ -using Content.Shared.Movement.Systems; -using Content.Server.Traits.Assorted; - -namespace Content.Shared.Traits.Assorted; - -public sealed class TraitSpeedModifierSystem : EntitySystem -{ - public override void Initialize() - { - base.Initialize(); - - SubscribeLocalEvent(OnRefreshMovementSpeed); - } - - private void OnRefreshMovementSpeed(EntityUid uid, TraitSpeedModifierComponent component, RefreshMovementSpeedModifiersEvent args) - { - args.ModifySpeed(component.WalkModifier, component.SprintModifier); - } -} 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. + /// +/// 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.Server/Traits/Assorted/TraitSpeedModifierComponent.cs b/Content.Shared/Traits/Assorted/Components/TraitSpeedModifierComponent.cs similarity index 52% rename from Content.Server/Traits/Assorted/TraitSpeedModifierComponent.cs rename to Content.Shared/Traits/Assorted/Components/TraitSpeedModifierComponent.cs index 6acb32e6c1d..85dc52a21f5 100644 --- a/Content.Server/Traits/Assorted/TraitSpeedModifierComponent.cs +++ b/Content.Shared/Traits/Assorted/Components/TraitSpeedModifierComponent.cs @@ -1,14 +1,16 @@ -namespace Content.Server.Traits.Assorted; +using Robust.Shared.GameStates; + +namespace Content.Shared.Traits.Assorted.Components; /// /// This component is used for traits that modify movement speed. /// -[RegisterComponent] +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] public sealed partial class TraitSpeedModifierComponent : Component { - [DataField(required: true)] + [DataField, AutoNetworkedField] public float WalkModifier = 1.0f; - [DataField(required: true)] + [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/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/Traits/disabilities.yml b/Resources/Prototypes/Traits/disabilities.yml index 915ea0bf674..ca2453e41a1 100644 --- a/Resources/Prototypes/Traits/disabilities.yml +++ b/Resources/Prototypes/Traits/disabilities.yml @@ -105,6 +105,10 @@ traits: - ParkourTraining - SnailPaced + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona components: - type: TraitSpeedModifier sprintModifier: 0.85 @@ -124,6 +128,10 @@ traits: - ParkourTraining - Sluggish + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona components: - type: TraitSpeedModifier sprintModifier: 0.7 diff --git a/Resources/Prototypes/Traits/skills.yml b/Resources/Prototypes/Traits/skills.yml index 0da622da3c9..56a8549c933 100644 --- a/Resources/Prototypes/Traits/skills.yml +++ b/Resources/Prototypes/Traits/skills.yml @@ -97,6 +97,10 @@ traits: - Sluggish - SnailPaced + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona components: - type: ClimbDelayModifier climbDelayMultiplier: 0.70 From 3657ad42d2f0ab15f44bc6d32ee9f442c047090b Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Fri, 9 Aug 2024 17:28:26 +0000 Subject: [PATCH 38/57] Automatic Changelog Update (#704) --- Resources/Changelog/Changelog.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index f571aeb6bbf..3f94c100b5a 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -5133,3 +5133,17 @@ Entries: 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' From 31e3c02aad4fdb435b9682d42df90e27ef9af96b Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Fri, 9 Aug 2024 16:41:18 -0400 Subject: [PATCH 39/57] Psionic System Cleanup (#703) # Description Just some regular cleanup of PsionicSystem and PsionicAbilitiesSystem. No refactoring today, just cleanup. Tomorrow I will serialize this shit, assuming this gets merged. No media because there's nothing to show. No changelog because this isn't playerfacing. --- .../Psionics/PsionicAbilitiesSystem.cs | 48 +++++++------------ Content.Server/Psionics/PsionicsSystem.cs | 41 ++++------------ 2 files changed, 25 insertions(+), 64 deletions(-) diff --git a/Content.Server/Abilities/Psionics/PsionicAbilitiesSystem.cs b/Content.Server/Abilities/Psionics/PsionicAbilitiesSystem.cs index ee16aaccfb6..e59696aa904 100644 --- a/Content.Server/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/Psionics/PsionicsSystem.cs b/Content.Server/Psionics/PsionicsSystem.cs index 33505e3f6fc..fb5d18f2843 100644 --- a/Content.Server/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() @@ -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,7 +93,7 @@ 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"); @@ -112,24 +101,14 @@ private void OnRemove(EntityUid uid, PsionicComponent component, ComponentRemove private void OnStamHit(EntityUid uid, AntiPsionicWeaponComponent component, TakeStaminaDamageEvent args) { - var bonus = false; - if (HasComp(args.Target)) - bonus = true; - - if (!bonus) - return; - - - args.FlatModifier += component.PsychicStaminaDamage; + 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; @@ -154,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); From 05364c5ad8d465ea35241bf53397b4721012c5ce Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Fri, 9 Aug 2024 16:41:46 -0400 Subject: [PATCH 40/57] Minor Glimmer System Cleanup (#702) # Description More tedium to get out of the way, I can't do much more than this since by now in the day my adderall has worn off. This just does basic code cleanup of the glimmer system. No media because there's nothing to show. No changelog because this isn't player facing. --- .../Psionics/Glimmer/GlimmerCommands.cs | 6 +- .../Psionics/Glimmer/GlimmerReactiveSystem.cs | 139 ++++++------------ .../Glimmer/PassiveGlimmerReductionSystem.cs | 2 - .../Structures/GlimmerSourceComponent.cs | 8 +- .../Structures/GlimmerStructuresSystem.cs | 10 +- 5 files changed, 57 insertions(+), 108 deletions(-) diff --git a/Content.Server/Psionics/Glimmer/GlimmerCommands.cs b/Content.Server/Psionics/Glimmer/GlimmerCommands.cs index 744f4cdb9a8..9e05886adca 100644 --- a/Content.Server/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/Psionics/Glimmer/GlimmerReactiveSystem.cs b/Content.Server/Psionics/Glimmer/GlimmerReactiveSystem.cs index da3b07d6dab..f828874aacb 100644 --- a/Content.Server/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/Psionics/Glimmer/PassiveGlimmerReductionSystem.cs b/Content.Server/Psionics/Glimmer/PassiveGlimmerReductionSystem.cs index f0da85ce453..57c74398b08 100644 --- a/Content.Server/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/Psionics/Glimmer/Structures/GlimmerSourceComponent.cs b/Content.Server/Psionics/Glimmer/Structures/GlimmerSourceComponent.cs index 5babb6c446d..c7db2a5229f 100644 --- a/Content.Server/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/Psionics/Glimmer/Structures/GlimmerStructuresSystem.cs b/Content.Server/Psionics/Glimmer/Structures/GlimmerStructuresSystem.cs index 75125569cb5..8694147dc0e 100644 --- a/Content.Server/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--; - } } } } From c8c859a6a8cdf84ef5ecd08e0091edc719b2730f Mon Sep 17 00:00:00 2001 From: OldDanceJacket <98985560+OldDanceJacket@users.noreply.github.com> Date: Sat, 10 Aug 2024 05:00:06 -0700 Subject: [PATCH 41/57] Melee Pt2 (#693) # PT2 of Melee Weapons The Numbers Don't Lie This is part 2 of the ongoing work of Solid and myself going through and touching up the melee combat in the game. In this part I rebalance all of the melee weapons to generally do less damage, more stamina damage, and be more unique in regards to slight range changes, attack speed adjustments, along with every weapon getting slightly adjusted heavy swing changes ranging from attack rates, damage, range, angle, and how many targets you can hit. Majority of weapons will hit the standard amount of targets of 5(the old norm), but a few are lowered to be single target hits. These are usually tightened in the angle that they attack in(old angle range was 60). Similarly all melee weapons have individual stamina costs on their heavy swings, most of these are in the range of 5 or 10, and following this PR the new standard should be 10 as the outliers that would abuse this have been addressed in this PR. --- # Changelog Normally I would do a changelog but this took awhile and I forgo. :cl: ODJ - tweak: Melee Weapons now feel different across the board, from the Wrench to the Chainsaw, try out their normal swings and their heavy attacks! --------- Co-authored-by: VMSolidus Co-authored-by: jcsmithing --- .../Weapons/Melee/MeleeWeaponSystem.cs | 5 +- Content.Server/Execution/ExecutionSystem.cs | 2 +- .../Weapons/Melee/MeleeWeaponSystem.cs | 11 ++- .../Zombies/ZombieSystem.Transform.cs | 2 +- .../Damage/Systems/StaminaSystem.cs | 3 +- .../Weapons/Melee/MeleeSoundSystem.cs | 6 +- .../Weapons/Melee/MeleeWeaponComponent.cs | 71 ++++++++------ .../Weapons/Melee/SharedMeleeWeaponSystem.cs | 93 ++++++++++--------- .../Locale/en-US/damage/damage-examine.ftl | 1 + .../Consumable/Drinks/drinks_bottles.yml | 11 ++- .../Fun/Instruments/instruments_string.yml | 76 ++++++++++++--- .../Prototypes/Entities/Objects/Fun/toys.yml | 10 ++ .../Entities/Objects/Misc/briefcases.yml | 12 +++ .../Entities/Objects/Misc/broken_bottle.yml | 9 +- .../Objects/Misc/fire_extinguisher.yml | 9 +- .../Objects/Specific/Chapel/bibles.yml | 8 +- .../Objects/Specific/Hydroponics/tools.yml | 45 +++++++-- .../Objects/Specific/Janitorial/janitor.yml | 20 +++- .../Objects/Specific/Medical/surgery.yml | 78 +++++++++++++--- .../Entities/Objects/Tools/flashlights.yml | 16 +++- .../Entities/Objects/Tools/gas_tanks.yml | 9 +- .../Entities/Objects/Tools/jaws_of_life.yml | 12 ++- .../Entities/Objects/Tools/toolbox.yml | 14 ++- .../Entities/Objects/Tools/tools.yml | 68 ++++++++++++-- .../Entities/Objects/Tools/welders.yml | 4 +- .../Objects/Weapons/Melee/baseball_bat.yml | 11 ++- .../Objects/Weapons/Melee/chainsaw.yml | 6 +- .../Entities/Objects/Weapons/Melee/cult.yml | 28 ++++-- .../Objects/Weapons/Melee/e_sword.yml | 14 +-- .../Objects/Weapons/Melee/fireaxe.yml | 10 +- .../Entities/Objects/Weapons/Melee/knife.yml | 39 +++++--- .../Entities/Objects/Weapons/Melee/mining.yml | 22 ++++- .../Objects/Weapons/Melee/pickaxe.yml | 32 +++++-- .../Objects/Weapons/Melee/sledgehammer.yml | 10 +- .../Entities/Objects/Weapons/Melee/spear.yml | 32 ++++--- .../Objects/Weapons/Melee/stunprod.yml | 13 ++- .../Entities/Objects/Weapons/Melee/sword.yml | 48 ++++++++-- .../Objects/Weapons/Melee/white_cane.yml | 15 ++- .../Entities/Objects/Weapons/security.yml | 12 ++- 39 files changed, 675 insertions(+), 212 deletions(-) diff --git a/Content.Client/Weapons/Melee/MeleeWeaponSystem.cs b/Content.Client/Weapons/Melee/MeleeWeaponSystem.cs index 641d56d3d14..cf987e62c7b 100644 --- a/Content.Client/Weapons/Melee/MeleeWeaponSystem.cs +++ b/Content.Client/Weapons/Melee/MeleeWeaponSystem.cs @@ -1,5 +1,6 @@ using System.Linq; using Content.Client.Gameplay; +using Content.Shared.CCVar; using Content.Shared.CombatMode; using Content.Shared.Effects; using Content.Shared.Hands.Components; @@ -16,8 +17,6 @@ using Robust.Shared.Input; using Robust.Shared.Map; using Robust.Shared.Player; -using Robust.Shared.Prototypes; -using Robust.Shared.Timing; namespace Content.Client.Weapons.Melee; @@ -228,7 +227,7 @@ private void ClientHeavyAttack(EntityUid user, EntityCoordinates coordinates, En // This should really be improved. GetEntitiesInArc uses pos instead of bounding boxes. // Server will validate it with InRangeUnobstructed. var entities = GetNetEntityList(ArcRayCast(userPos, direction.ToWorldAngle(), component.Angle, distance, userXform.MapID, user).ToList()); - RaisePredictiveEvent(new HeavyAttackEvent(GetNetEntity(meleeUid), entities.GetRange(0, Math.Min(MaxTargets, entities.Count)), GetNetCoordinates(coordinates))); + RaisePredictiveEvent(new HeavyAttackEvent(GetNetEntity(meleeUid), entities.GetRange(0, Math.Min(component.MaxTargets, entities.Count)), GetNetCoordinates(coordinates))); } private void OnMeleeLunge(MeleeLungeEvent ev) diff --git a/Content.Server/Execution/ExecutionSystem.cs b/Content.Server/Execution/ExecutionSystem.cs index 3b87fa17cad..326aa1d6a49 100644 --- a/Content.Server/Execution/ExecutionSystem.cs +++ b/Content.Server/Execution/ExecutionSystem.cs @@ -251,7 +251,7 @@ private void OnDoafterMelee(EntityUid uid, SharpComponent component, DoAfterEven return; _damageableSystem.TryChangeDamage(victim, melee.Damage * DamageModifier, true); - _audioSystem.PlayEntity(melee.HitSound, Filter.Pvs(weapon), weapon, true, AudioParams.Default); + _audioSystem.PlayEntity(melee.SoundHit, Filter.Pvs(weapon), weapon, true, AudioParams.Default); if (attacker == victim) { diff --git a/Content.Server/Weapons/Melee/MeleeWeaponSystem.cs b/Content.Server/Weapons/Melee/MeleeWeaponSystem.cs index 22840cde8f5..d63dd093eec 100644 --- a/Content.Server/Weapons/Melee/MeleeWeaponSystem.cs +++ b/Content.Server/Weapons/Melee/MeleeWeaponSystem.cs @@ -57,6 +57,9 @@ private void OnMeleeExamineDamage(EntityUid uid, MeleeWeaponComponent component, return; _damageExamine.AddDamageExamine(args.Message, damageSpec, Loc.GetString("damage-melee")); + + if (damageSpec * component.HeavyDamageBaseModifier != damageSpec) + _damageExamine.AddDamageExamine(args.Message, damageSpec * component.HeavyDamageBaseModifier, Loc.GetString("damage-melee-heavy")); } protected override bool ArcRaySuccessful(EntityUid targetUid, Vector2 position, Angle angle, Angle arcWidth, float range, MapId mapId, @@ -132,7 +135,7 @@ protected override bool DoDisarm(EntityUid user, DisarmAttackEvent ev, EntityUid if (attemptEvent.Cancelled) return false; - var chance = CalculateDisarmChance(user, target, inTargetHand, combatMode) * _contests.MassContest(user, target); + var chance = CalculateDisarmChance(user, target, inTargetHand, combatMode); if (_random.Prob(chance)) { @@ -212,7 +215,11 @@ private float CalculateDisarmChance(EntityUid disarmer, EntityUid disarmed, Enti chance += malus.Malus; } - return Math.Clamp(chance, 0f, 1f); + return Math.Clamp(chance + * _contests.MassContest(disarmer, disarmed, false, 0.5f) + * _contests.StaminaContest(disarmer, disarmed, false, 0.5f) + * _contests.HealthContest(disarmer, disarmed, false, 0.5f), + 0f, 1f); } public override void DoLunge(EntityUid user, EntityUid weapon, Angle angle, Vector2 localPos, string? animation, bool predicted = true) diff --git a/Content.Server/Zombies/ZombieSystem.Transform.cs b/Content.Server/Zombies/ZombieSystem.Transform.cs index c87132cc3cb..c6c71b80345 100644 --- a/Content.Server/Zombies/ZombieSystem.Transform.cs +++ b/Content.Server/Zombies/ZombieSystem.Transform.cs @@ -143,7 +143,7 @@ public void ZombifyEntity(EntityUid target, MobStateComponent? mobState = null) melee.AltDisarm = false; melee.Range = 1.2f; melee.Angle = 0.0f; - melee.HitSound = zombiecomp.BiteSound; + melee.SoundHit = zombiecomp.BiteSound; if (mobState.CurrentState == MobState.Alive) { diff --git a/Content.Shared/Damage/Systems/StaminaSystem.cs b/Content.Shared/Damage/Systems/StaminaSystem.cs index 5c46e6055d1..54a88205b2d 100644 --- a/Content.Shared/Damage/Systems/StaminaSystem.cs +++ b/Content.Shared/Damage/Systems/StaminaSystem.cs @@ -260,7 +260,8 @@ public bool TryTakeStamina(EntityUid uid, float value, StaminaComponent? compone public void TakeStaminaDamage(EntityUid uid, float value, StaminaComponent? component = null, EntityUid? source = null, EntityUid? with = null, bool visual = true, SoundSpecifier? sound = null) { - if (!Resolve(uid, ref component, false)) + if (!Resolve(uid, ref component, false) + || value == 0) return; var ev = new BeforeStaminaDamageEvent(value); diff --git a/Content.Shared/Weapons/Melee/MeleeSoundSystem.cs b/Content.Shared/Weapons/Melee/MeleeSoundSystem.cs index 5bf74802026..350642105a5 100644 --- a/Content.Shared/Weapons/Melee/MeleeSoundSystem.cs +++ b/Content.Shared/Weapons/Melee/MeleeSoundSystem.cs @@ -20,7 +20,7 @@ public sealed class MeleeSoundSystem : EntitySystem /// public void PlaySwingSound(EntityUid userUid, EntityUid weaponUid, MeleeWeaponComponent weaponComponent) { - _audio.PlayPredicted(weaponComponent.SwingSound, weaponUid, userUid); + _audio.PlayPredicted(weaponComponent.SoundSwing, weaponUid, userUid); } /// @@ -32,8 +32,8 @@ public void PlaySwingSound(EntityUid userUid, EntityUid weaponUid, MeleeWeaponCo /// A sound can be supplied by the itself to override everything else public void PlayHitSound(EntityUid targetUid, EntityUid? userUid, string? damageType, SoundSpecifier? hitSoundOverride, MeleeWeaponComponent weaponComponent) { - var hitSound = weaponComponent.HitSound; - var noDamageSound = weaponComponent.NoDamageSound; + var hitSound = weaponComponent.SoundHit; + var noDamageSound = weaponComponent.SoundNoDamage; var playedSound = false; diff --git a/Content.Shared/Weapons/Melee/MeleeWeaponComponent.cs b/Content.Shared/Weapons/Melee/MeleeWeaponComponent.cs index 85d2e4675f7..d30e27e98c7 100644 --- a/Content.Shared/Weapons/Melee/MeleeWeaponComponent.cs +++ b/Content.Shared/Weapons/Melee/MeleeWeaponComponent.cs @@ -18,13 +18,12 @@ public sealed partial class MeleeWeaponComponent : Component /// /// Does this entity do a disarm on alt attack. /// - [DataField, ViewVariables(VVAccess.ReadWrite), AutoNetworkedField] + [DataField, AutoNetworkedField] public bool AltDisarm = true; /// /// Should the melee weapon's damage stats be examinable. /// - [ViewVariables(VVAccess.ReadWrite)] [DataField] public bool Hidden; @@ -32,14 +31,13 @@ public sealed partial class MeleeWeaponComponent : Component /// Next time this component is allowed to light attack. Heavy attacks are wound up and never have a cooldown. /// [DataField(customTypeSerializer: typeof(TimeOffsetSerializer)), AutoNetworkedField] - [ViewVariables(VVAccess.ReadWrite)] [AutoPausedField] public TimeSpan NextAttack; /// /// Starts attack cooldown when equipped if true. /// - [ViewVariables(VVAccess.ReadWrite), DataField] + [DataField] public bool ResetOnHandSelected = true; /* @@ -51,77 +49,98 @@ public sealed partial class MeleeWeaponComponent : Component /// /// How many times we can attack per second. /// - [ViewVariables(VVAccess.ReadWrite), DataField, AutoNetworkedField] + [DataField, AutoNetworkedField] public float AttackRate = 1f; + /// + /// When power attacking, the swing speed (in attacks per second) is multiplied by this amount + /// + [DataField, AutoNetworkedField] + public float HeavyRateModifier = 0.8f; /// /// Are we currently holding down the mouse for an attack. /// Used so we can't just hold the mouse button and attack constantly. /// - [ViewVariables(VVAccess.ReadWrite), AutoNetworkedField] + [AutoNetworkedField] public bool Attacking = false; /// /// If true, attacks will be repeated automatically without requiring the mouse button to be lifted. /// - [DataField, ViewVariables(VVAccess.ReadWrite), AutoNetworkedField] + [DataField, AutoNetworkedField] public bool AutoAttack; /// /// Base damage for this weapon. Can be modified via heavy damage or other means. /// [DataField(required: true)] - [ViewVariables(VVAccess.ReadWrite), AutoNetworkedField] + [AutoNetworkedField] public DamageSpecifier Damage = default!; - [DataField] - [ViewVariables(VVAccess.ReadWrite)] - public FixedPoint2 BluntStaminaDamageFactor = FixedPoint2.New(0.5f); + [DataField, AutoNetworkedField] + public FixedPoint2 BluntStaminaDamageFactor = FixedPoint2.New(1f); /// /// Multiplies damage by this amount for single-target attacks. /// - [ViewVariables(VVAccess.ReadWrite), DataField] + [DataField, AutoNetworkedField] public FixedPoint2 ClickDamageModifier = FixedPoint2.New(1); // TODO: Temporarily 1.5 until interactionoutline is adjusted to use melee, then probably drop to 1.2 /// /// Nearest edge range to hit an entity. /// - [ViewVariables(VVAccess.ReadWrite), DataField, AutoNetworkedField] + [DataField, AutoNetworkedField] public float Range = 1.5f; + /// + /// Attack range for heavy swings + /// + [DataField, AutoNetworkedField] + public float HeavyRangeModifier = 1f; + + /// + /// Weapon damage is multiplied by this amount for heavy swings + /// + [DataField, AutoNetworkedField] + public float HeavyDamageBaseModifier = 1.2f; + /// /// Total width of the angle for wide attacks. /// - [ViewVariables(VVAccess.ReadWrite), DataField] + [DataField, AutoNetworkedField] public Angle Angle = Angle.FromDegrees(60); - [ViewVariables(VVAccess.ReadWrite), DataField, AutoNetworkedField] + [DataField, AutoNetworkedField] public EntProtoId Animation = "WeaponArcPunch"; - [ViewVariables(VVAccess.ReadWrite), DataField, AutoNetworkedField] + [DataField, AutoNetworkedField] public EntProtoId WideAnimation = "WeaponArcSlash"; /// /// Rotation of the animation. /// 0 degrees means the top faces the attacker. /// - [ViewVariables(VVAccess.ReadWrite), DataField] + [DataField, AutoNetworkedField] public Angle WideAnimationRotation = Angle.Zero; - [ViewVariables(VVAccess.ReadWrite), DataField] + [DataField] public bool SwingLeft; + [DataField, AutoNetworkedField] + public float HeavyStaminaCost = 20f; + + [DataField, AutoNetworkedField] + public int MaxTargets = 5; + // Sounds /// /// This gets played whenever a melee attack is done. This is predicted by the client. /// - [ViewVariables(VVAccess.ReadWrite)] - [DataField("soundSwing"), AutoNetworkedField] - public SoundSpecifier SwingSound { get; set; } = new SoundPathSpecifier("/Audio/Weapons/punchmiss.ogg") + [DataField, AutoNetworkedField] + public SoundSpecifier SoundSwing { get; set; } = new SoundPathSpecifier("/Audio/Weapons/punchmiss.ogg") { Params = AudioParams.Default.WithVolume(-3f).WithVariation(0.025f), }; @@ -130,16 +149,14 @@ public sealed partial class MeleeWeaponComponent : Component // then a player may doubt if the target actually took damage or not. // If overwatch and apex do this then we probably should too. - [ViewVariables(VVAccess.ReadWrite)] - [DataField("soundHit"), AutoNetworkedField] - public SoundSpecifier? HitSound; + [DataField, AutoNetworkedField] + public SoundSpecifier? SoundHit; /// /// Plays if no damage is done to the target entity. /// - [ViewVariables(VVAccess.ReadWrite)] - [DataField("soundNoDamage"), AutoNetworkedField] - public SoundSpecifier NoDamageSound { get; set; } = new SoundCollectionSpecifier("WeakHit"); + [DataField, AutoNetworkedField] + public SoundSpecifier SoundNoDamage { get; set; } = new SoundCollectionSpecifier("WeakHit"); } /// diff --git a/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs b/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs index e59b4a13fed..b5a537b7e15 100644 --- a/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs +++ b/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs @@ -4,7 +4,9 @@ using Content.Shared.ActionBlocker; using Content.Shared.Administration.Logs; using Content.Shared.CombatMode; +using Content.Shared.Contests; using Content.Shared.Damage; +using Content.Shared.Damage.Components; using Content.Shared.Damage.Systems; using Content.Shared.Database; using Content.Shared.FixedPoint; @@ -12,7 +14,6 @@ using Content.Shared.Hands.Components; using Content.Shared.Interaction; using Content.Shared.Inventory; -using Content.Shared.Item; using Content.Shared.Item.ItemToggle.Components; using Content.Shared.Physics; using Content.Shared.Popups; @@ -27,35 +28,30 @@ using Robust.Shared.Player; using Robust.Shared.Prototypes; using Robust.Shared.Timing; -using Robust.Shared.Toolshed.Syntax; using ItemToggleMeleeWeaponComponent = Content.Shared.Item.ItemToggle.Components.ItemToggleMeleeWeaponComponent; namespace Content.Shared.Weapons.Melee; public abstract class SharedMeleeWeaponSystem : EntitySystem { - [Dependency] protected readonly ISharedAdminLogManager AdminLogger = default!; - [Dependency] protected readonly ActionBlockerSystem Blocker = default!; - [Dependency] protected readonly SharedCombatModeSystem CombatMode = default!; - [Dependency] protected readonly DamageableSystem Damageable = default!; - [Dependency] protected readonly SharedInteractionSystem Interaction = default!; - [Dependency] protected readonly IMapManager MapManager = default!; - [Dependency] protected readonly SharedPopupSystem PopupSystem = default!; - [Dependency] protected readonly IGameTiming Timing = default!; - [Dependency] protected readonly SharedTransformSystem TransformSystem = default!; - [Dependency] private readonly InventorySystem _inventory = default!; - [Dependency] private readonly MeleeSoundSystem _meleeSound = default!; - [Dependency] private readonly SharedPhysicsSystem _physics = default!; - [Dependency] private readonly IPrototypeManager _protoManager = default!; - [Dependency] private readonly StaminaSystem _stamina = default!; + [Dependency] protected readonly ISharedAdminLogManager AdminLogger = default!; + [Dependency] protected readonly ActionBlockerSystem Blocker = default!; + [Dependency] protected readonly SharedCombatModeSystem CombatMode = default!; + [Dependency] protected readonly DamageableSystem Damageable = default!; + [Dependency] protected readonly SharedInteractionSystem Interaction = default!; + [Dependency] protected readonly IMapManager MapManager = default!; + [Dependency] protected readonly SharedPopupSystem PopupSystem = default!; + [Dependency] protected readonly IGameTiming Timing = default!; + [Dependency] protected readonly SharedTransformSystem TransformSystem = default!; + [Dependency] private readonly InventorySystem _inventory = default!; + [Dependency] private readonly MeleeSoundSystem _meleeSound = default!; + [Dependency] private readonly SharedPhysicsSystem _physics = default!; + [Dependency] private readonly IPrototypeManager _protoManager = default!; + [Dependency] private readonly StaminaSystem _stamina = default!; + [Dependency] private readonly ContestsSystem _contests = default!; private const int AttackMask = (int) (CollisionGroup.MobMask | CollisionGroup.Opaque); - /// - /// Maximum amount of targets allowed for a wide-attack. - /// - public const int MaxTargets = 5; - /// /// If an attack is released within this buffer it's assumed to be full damage. /// @@ -80,8 +76,7 @@ public override void Initialize() SubscribeAllEvent(OnStopAttack); #if DEBUG - SubscribeLocalEvent (OnMapInit); + SubscribeLocalEvent(OnMapInit); } private void OnMapInit(EntityUid uid, MeleeWeaponComponent component, MapInitEvent args) @@ -252,7 +247,11 @@ public FixedPoint2 GetHeavyDamageModifier(EntityUid uid, EntityUid user, MeleeWe var ev = new GetHeavyDamageModifierEvent(uid, component.ClickDamageModifier, 1, user); RaiseLocalEvent(uid, ref ev); - return ev.DamageModifier * ev.Multipliers; + return ev.DamageModifier + * ev.Multipliers + * component.HeavyDamageBaseModifier + * _contests.StaminaContest(user, false, 2f) //Taking stamina damage reduces wide swing damage by up to 50% + / _contests.HealthContest(user, false, 0.8f); //Being injured grants up to 20% more wide swing damage } public bool TryGetWeapon(EntityUid entity, out EntityUid weaponUid, [NotNullWhen(true)] out MeleeWeaponComponent? melee) @@ -340,6 +339,8 @@ private bool AttemptAttack(EntityUid user, EntityUid weaponUid, MeleeWeaponCompo if (!CombatMode.IsInCombatMode(user)) return false; + var fireRateSwingModifier = 1f; + switch (attack) { case LightAttackEvent light: @@ -359,6 +360,9 @@ private bool AttemptAttack(EntityUid user, EntityUid weaponUid, MeleeWeaponCompo if (!Blocker.CanAttack(user, disarmTarget, (weaponUid, weapon), true)) return false; break; + case HeavyAttackEvent: + fireRateSwingModifier *= weapon.HeavyRateModifier; + break; default: if (!Blocker.CanAttack(user, weapon: (weaponUid, weapon))) return false; @@ -366,7 +370,7 @@ private bool AttemptAttack(EntityUid user, EntityUid weaponUid, MeleeWeaponCompo } // Windup time checked elsewhere. - var fireRate = TimeSpan.FromSeconds(1f / GetAttackRate(weaponUid, user, weapon)); + var fireRate = TimeSpan.FromSeconds(1f / GetAttackRate(weaponUid, user, weapon) * fireRateSwingModifier); var swings = 0; // TODO: If we get autoattacks then probably need a shotcounter like guns so we can do timing properly. @@ -436,8 +440,9 @@ private bool AttemptAttack(EntityUid user, EntityUid weaponUid, MeleeWeaponCompo protected virtual void DoLightAttack(EntityUid user, LightAttackEvent ev, EntityUid meleeUid, MeleeWeaponComponent component, ICommonSession? session) { - // If I do not come back later to fix Light Attacks being Heavy Attacks you can throw me in the spider pit -Errant - var damage = GetDamage(meleeUid, user, component) * GetHeavyDamageModifier(meleeUid, user, component); + var damage = GetDamage(meleeUid, user, component) + * _contests.StaminaContest(user) //Taking stamina damage reduces light attack damage by up to 25% + / _contests.HealthContest(user, false, 0.8f); //Being injured grants up to 20% more damage; var target = GetEntity(ev.Target); // For consistency with wide attacks stuff needs damageable. @@ -526,7 +531,7 @@ protected virtual void DoLightAttack(EntityUid user, LightAttackEvent ev, Entity } } - protected abstract void DoDamageEffect(List targets, EntityUid? user, TransformComponent targetXform); + protected abstract void DoDamageEffect(List targets, EntityUid? user, TransformComponent targetXform); private bool DoHeavyAttack(EntityUid user, HeavyAttackEvent ev, EntityUid meleeUid, MeleeWeaponComponent component, ICommonSession? session) { @@ -541,9 +546,9 @@ private bool DoHeavyAttack(EntityUid user, HeavyAttackEvent ev, EntityUid meleeU var userPos = TransformSystem.GetWorldPosition(userXform); var direction = targetMap.Position - userPos; - var distance = Math.Min(component.Range, direction.Length()); + var distance = Math.Min(component.Range * component.HeavyRangeModifier, direction.Length()); - var damage = GetDamage(meleeUid, user, component); + var damage = GetDamage(meleeUid, user, component) * GetHeavyDamageModifier(meleeUid, user, component); var entities = GetEntityList(ev.Entities); if (entities.Count == 0) @@ -567,11 +572,9 @@ private bool DoHeavyAttack(EntityUid user, HeavyAttackEvent ev, EntityUid meleeU return true; } - // Naughty input - if (entities.Count > MaxTargets) - { - entities.RemoveRange(MaxTargets, entities.Count - MaxTargets); - } + var maxTargets = component.MaxTargets; + if (entities.Count > maxTargets) + entities.RemoveRange(maxTargets, entities.Count - maxTargets); // Validate client for (var i = entities.Count - 1; i >= 0; i--) @@ -666,6 +669,10 @@ private bool DoHeavyAttack(EntityUid user, HeavyAttackEvent ev, EntityUid meleeU DoDamageEffect(targets, user, Transform(targets[0])); } + if (TryComp(user, out var stamina)) + _stamina.TakeStaminaDamage(user, component.HeavyStaminaCost, stamina); + + return true; } @@ -785,20 +792,20 @@ private void OnItemToggle(EntityUid uid, ItemToggleMeleeWeaponComponent itemTogg meleeWeapon.Damage = itemToggleMelee.ActivatedDamage; } - meleeWeapon.HitSound = itemToggleMelee.ActivatedSoundOnHit; + meleeWeapon.SoundHit = itemToggleMelee.ActivatedSoundOnHit; if (itemToggleMelee.ActivatedSoundOnHitNoDamage != null) { //Setting the deactivated sound on no damage hit to the weapon's regular value before changing it. - itemToggleMelee.DeactivatedSoundOnHitNoDamage ??= meleeWeapon.NoDamageSound; - meleeWeapon.NoDamageSound = itemToggleMelee.ActivatedSoundOnHitNoDamage; + itemToggleMelee.DeactivatedSoundOnHitNoDamage ??= meleeWeapon.SoundNoDamage; + meleeWeapon.SoundNoDamage = itemToggleMelee.ActivatedSoundOnHitNoDamage; } if (itemToggleMelee.ActivatedSoundOnSwing != null) { //Setting the deactivated sound on no damage hit to the weapon's regular value before changing it. - itemToggleMelee.DeactivatedSoundOnSwing ??= meleeWeapon.SwingSound; - meleeWeapon.SwingSound = itemToggleMelee.ActivatedSoundOnSwing; + itemToggleMelee.DeactivatedSoundOnSwing ??= meleeWeapon.SoundSwing; + meleeWeapon.SoundSwing = itemToggleMelee.ActivatedSoundOnSwing; } if (itemToggleMelee.DeactivatedSecret) @@ -809,13 +816,13 @@ private void OnItemToggle(EntityUid uid, ItemToggleMeleeWeaponComponent itemTogg if (itemToggleMelee.DeactivatedDamage != null) meleeWeapon.Damage = itemToggleMelee.DeactivatedDamage; - meleeWeapon.HitSound = itemToggleMelee.DeactivatedSoundOnHit; + meleeWeapon.SoundHit = itemToggleMelee.DeactivatedSoundOnHit; if (itemToggleMelee.DeactivatedSoundOnHitNoDamage != null) - meleeWeapon.NoDamageSound = itemToggleMelee.DeactivatedSoundOnHitNoDamage; + meleeWeapon.SoundNoDamage = itemToggleMelee.DeactivatedSoundOnHitNoDamage; if (itemToggleMelee.DeactivatedSoundOnSwing != null) - meleeWeapon.SwingSound = itemToggleMelee.DeactivatedSoundOnSwing; + meleeWeapon.SoundSwing = itemToggleMelee.DeactivatedSoundOnSwing; if (itemToggleMelee.DeactivatedSecret) meleeWeapon.Hidden = true; diff --git a/Resources/Locale/en-US/damage/damage-examine.ftl b/Resources/Locale/en-US/damage/damage-examine.ftl index 974b8fa9650..9e24d4d2f72 100644 --- a/Resources/Locale/en-US/damage/damage-examine.ftl +++ b/Resources/Locale/en-US/damage/damage-examine.ftl @@ -5,6 +5,7 @@ damage-examinable-verb-message = Examine the damage values. damage-hitscan = hitscan damage-projectile = projectile damage-melee = melee +damage-melee-heavy = power attack damage-throw = throw damage-examine = It does the following damage: 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/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/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 32222d0036c..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 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/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/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/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/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 d135b2f29bb..a6926f1d8c3 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/tools.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/tools.yml @@ -31,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 @@ -91,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 @@ -146,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 @@ -198,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 @@ -252,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 @@ -391,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" @@ -600,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 @@ -642,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/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/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 From c5fb2026ec7477fd32e6eec1b052f5641e6b8ee1 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Sat, 10 Aug 2024 12:00:29 +0000 Subject: [PATCH 42/57] Automatic Changelog Update (#693) --- Resources/Changelog/Changelog.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 3f94c100b5a..58afb71648b 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -5147,3 +5147,11 @@ Entries: 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' From cb6e6ae8b60f3442642b1b7e7ee3afc2ee29e142 Mon Sep 17 00:00:00 2001 From: Rane <60792108+Elijahrane@users.noreply.github.com> Date: Sat, 10 Aug 2024 08:03:11 -0400 Subject: [PATCH 43/57] Rename Mantis (#709) "Mantis" was going to be the original name, but the doubling as detective lead me to needing to add the qualifier "forensic" to make that part clearer. The "Mantis" was already there to imply the psionic part. For "psionic mantis" defenders, I propose an alternative renaming scheme: Mystagogue -> Psionic Mystagogue Mantis -> Psionic Mantis Cyborg -> Robotic Cyborg Chaplain -> Religious Chaplain Players either already know what a mantis is, or they've got little enough playtime that there's still some intrigue left in the setting and it's something they can learn by observation. Weird names are mostly restricted to one dept here and a tinge harder time understanding it is what I'd call "Mystery" rather than something that's undesirable here. The mechanic the mantis interacts with - psionics - is also somewhat hidden and esoteric. # Media ![image](https://github.com/user-attachments/assets/8706c0cd-97a3-4ed6-a0e4-e23012a461a7) ![image](https://github.com/user-attachments/assets/7e6296fb-52ca-4d4e-b40d-2e166520d4b5) # Changelog :cl: Rane - tweak: Renamed "Psionic Mantis" to "Mantis", as it was originally going to be called. --- Resources/Locale/en-US/deltav/prototypes/access/accesses.ftl | 2 +- Resources/Locale/en-US/nyanotrasen/job/job-names.ftl | 4 ++-- Resources/Locale/en-US/psionics/stamp-component.ftl | 2 +- Resources/Maps/hammurabi.yml | 2 +- Resources/Prototypes/Access/misc.yml | 2 +- Resources/Prototypes/Access/research.yml | 2 +- .../Prototypes/Nyanotrasen/Entities/Clothing/Belt/belts.yml | 2 +- .../Prototypes/Nyanotrasen/Entities/Clothing/Head/hats.yml | 2 +- .../Nyanotrasen/Entities/Clothing/OuterClothing/coats.yml | 2 +- .../Entities/Clothing/OuterClothing/wintercoats.yml | 2 +- .../Prototypes/Nyanotrasen/Entities/Clothing/Shoes/boots.yml | 2 +- .../Nyanotrasen/Entities/Clothing/Uniforms/jumpsuits.yml | 4 ++-- .../Prototypes/Nyanotrasen/Entities/Markers/Spawners/jobs.yml | 2 +- .../Entities/Objects/Devices/Misc/identification_cards.yml | 2 +- .../Prototypes/Nyanotrasen/Entities/Objects/Devices/pda.yml | 2 +- .../Prototypes/Nyanotrasen/Entities/Objects/Misc/paper.yml | 2 +- .../Entities/Structures/Storage/Closets/Lockers/lockers.yml | 2 +- .../Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml | 2 +- Resources/Prototypes/Roles/Jobs/Science/research_director.yml | 2 +- Resources/ServerInfo/Rules.txt | 2 +- 20 files changed, 22 insertions(+), 22 deletions(-) diff --git a/Resources/Locale/en-US/deltav/prototypes/access/accesses.ftl b/Resources/Locale/en-US/deltav/prototypes/access/accesses.ftl index 2c5a3c871c0..3ebfe8bf1b1 100644 --- a/Resources/Locale/en-US/deltav/prototypes/access/accesses.ftl +++ b/Resources/Locale/en-US/deltav/prototypes/access/accesses.ftl @@ -1,5 +1,5 @@ id-card-access-level-orders = Orders -id-card-access-level-mantis = Psionic Mantis +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 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/psionics/stamp-component.ftl b/Resources/Locale/en-US/psionics/stamp-component.ftl index 0434e6d26ac..381278f8cf9 100644 --- a/Resources/Locale/en-US/psionics/stamp-component.ftl +++ b/Resources/Locale/en-US/psionics/stamp-component.ftl @@ -1 +1 @@ -stamp-component-stamped-name-mantis = Psionic Mantis +stamp-component-stamped-name-mantis = Mantis 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 f717c57a000..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 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/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/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/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/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/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/Roles/Jobs/Epistemics/forensicmantis.yml b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml index 31c08140ac7..e2f99548429 100644 --- a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml +++ b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml @@ -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/Roles/Jobs/Science/research_director.yml b/Resources/Prototypes/Roles/Jobs/Science/research_director.yml index 6f965b31b49..747ee41b840 100644 --- a/Resources/Prototypes/Roles/Jobs/Science/research_director.yml +++ b/Resources/Prototypes/Roles/Jobs/Science/research_director.yml @@ -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/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. From 07c8eba9f7daf37090aa5fd629fc607be36a9900 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Sat, 10 Aug 2024 12:03:36 +0000 Subject: [PATCH 44/57] Automatic Changelog Update (#709) --- Resources/Changelog/Changelog.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 58afb71648b..1abacbd8fe1 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -5155,3 +5155,11 @@ Entries: 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' From 6a12eabbaa1daa99e58d4c4355d507f878141d9b Mon Sep 17 00:00:00 2001 From: Angelo Fallaria Date: Sun, 11 Aug 2024 04:59:22 +0800 Subject: [PATCH 45/57] =?UTF-8?q?New=20Trait:=20Liquor=20Lifeline=20?= =?UTF-8?q?=F0=9F=8D=BA=F0=9F=A9=B9=20(#706)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Description **Liquor Lifeline** 🍺 is a new trait (-3 points) that makes you slowly heal Brute and Burn (except Caustic) damage when drunk, healing more the drunker you are. Inspired by the SS13 /tg/station quirk called Drunken Resilience. Strength of Liquor Lifeline healing in terms of its Brute damage healed per tick compared to Bicaridine: - 0.1u to 0.5u Ethanol - 10% Bicaridine - 0.5u to 7u Ethanol - 20% Bicaridine - 7u to 11u Ethanol - 40% Bicaridine - 11u to 15u Ethanol - 80% Bicaridine - 15u+ Ethanol **(drunk poisoning starts)** - 120% Bicaridine ## Media **Trait entry** ![image](https://github.com/user-attachments/assets/31e8cb3a-c5d5-4596-8934-4ad1256b4981) # Changelog :cl: Skubman - add: Add Liquor Lifeline (-3 points), a new positive trait that makes you slowly heal Brute and Burn damage when drunk, healing more the drunker you are. The trait also gives you the benefits of Alcohol Tolerance. - tweak: The cost of the Alcohol Tolerance trait has been reduced from -2 points to -1 point. - add: Dwarves receive the Liquor Lifeline trait for free. --------- Signed-off-by: Angelo Fallaria --- .../Body/Components/MetabolizerComponent.cs | 3 +- .../Assorted/LiquorLifelineComponent.cs | 11 +++ .../Traits/Assorted/LiquorLifelineSystem.cs | 39 ++++++++ Resources/Locale/en-US/traits/traits.ftl | 9 +- Resources/Prototypes/Body/Organs/dwarf.yml | 4 +- .../Chemistry/metabolizer_types.yml | 4 + .../Entities/Mobs/Species/dwarf.yml | 2 + .../Reagents/Consumable/Drink/alcohol.yml | 88 +++++++++++++++---- .../Prototypes/Traits/inconveniences.yml | 7 +- Resources/Prototypes/Traits/skills.yml | 31 ++++++- 10 files changed, 175 insertions(+), 23 deletions(-) create mode 100644 Content.Server/Traits/Assorted/LiquorLifelineComponent.cs create mode 100644 Content.Server/Traits/Assorted/LiquorLifelineSystem.cs diff --git a/Content.Server/Body/Components/MetabolizerComponent.cs b/Content.Server/Body/Components/MetabolizerComponent.cs index 90c99df7db2..7fe7d23cf34 100644 --- a/Content.Server/Body/Components/MetabolizerComponent.cs +++ b/Content.Server/Body/Components/MetabolizerComponent.cs @@ -1,4 +1,5 @@ using Content.Server.Body.Systems; +using Content.Server.Traits.Assorted; using Content.Shared.Body.Prototypes; using Content.Shared.FixedPoint; using Robust.Shared.Prototypes; @@ -44,7 +45,7 @@ public sealed partial class MetabolizerComponent : Component /// List of metabolizer types that this organ is. ex. Human, Slime, Felinid, w/e. /// [DataField] - [Access(typeof(MetabolizerSystem), Other = AccessPermissions.ReadExecute)] // FIXME Friends + [Access(typeof(MetabolizerSystem), typeof(LiquorLifelineSystem), Other = AccessPermissions.ReadExecute)] // FIXME Friends public HashSet>? MetabolizerTypes = null; /// diff --git a/Content.Server/Traits/Assorted/LiquorLifelineComponent.cs b/Content.Server/Traits/Assorted/LiquorLifelineComponent.cs new file mode 100644 index 00000000000..124d0fa3d72 --- /dev/null +++ b/Content.Server/Traits/Assorted/LiquorLifelineComponent.cs @@ -0,0 +1,11 @@ +using Content.Shared.Damage; + +namespace Content.Server.Traits.Assorted; + +/// +/// This is used for the Liquor Lifeline trait. +/// +[RegisterComponent] +public sealed partial class LiquorLifelineComponent : Component +{ +} diff --git a/Content.Server/Traits/Assorted/LiquorLifelineSystem.cs b/Content.Server/Traits/Assorted/LiquorLifelineSystem.cs new file mode 100644 index 00000000000..49618548d3f --- /dev/null +++ b/Content.Server/Traits/Assorted/LiquorLifelineSystem.cs @@ -0,0 +1,39 @@ +using Content.Server.Body.Components; +using Content.Server.Body.Systems; +using Content.Shared.Body.Components; + +namespace Content.Server.Traits.Assorted; + +public sealed class LiquorLifelineSystem : EntitySystem +{ + [Dependency] private readonly BodySystem _bodySystem = default!; + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnSpawn); + } + + private void OnSpawn(Entity entity, ref ComponentInit args) + { + if (!TryComp(entity, out var body)) + return; + + if (!_bodySystem.TryGetBodyOrganComponents(entity, out var metabolizers, body)) + return; + + foreach (var (metabolizer, _) in metabolizers) + { + if (metabolizer.MetabolizerTypes is null + || metabolizer.MetabolismGroups is null) + continue; + + foreach (var metabolismGroup in metabolizer.MetabolismGroups) + { + // Add the LiquorLifeline metabolizer type to the liver and equivalent organs. + if (metabolismGroup.Id == "Alcohol") + metabolizer.MetabolizerTypes.Add("LiquorLifeline"); + } + } + } +} diff --git a/Resources/Locale/en-US/traits/traits.ftl b/Resources/Locale/en-US/traits/traits.ftl index 16cae663009..ac4eb206c6e 100644 --- a/Resources/Locale/en-US/traits/traits.ftl +++ b/Resources/Locale/en-US/traits/traits.ftl @@ -18,7 +18,14 @@ trait-name-LightweightDrunk = Lightweight Drunk trait-description-LightweightDrunk = Alcohol has a stronger effect on you trait-name-HeavyweightDrunk = Alcohol Tolerance -trait-description-HeavyweightDrunk = Alcohol is afraid of you. +trait-description-HeavyweightDrunk = + Alcohol is afraid of you. + +trait-name-LiquorLifeline = Liquor Lifeline +trait-description-LiquorLifeline = + Forget the doctor — just hit the bar for your "ethanol prescription"! + While drunk, you slowly heal [color=red]Brute[/color], [color=orange]Heat[/color], [color=orange]Shock[/color], and [color=orange]Cold[/color] damage, scaling with how drunk you are. + You also gain the benefits of [color=lightblue]Alcohol Tolerance[/color]. trait-name-Muted = Muted trait-description-Muted = You can't speak diff --git a/Resources/Prototypes/Body/Organs/dwarf.yml b/Resources/Prototypes/Body/Organs/dwarf.yml index 8da0cb1666f..497bc190cd1 100644 --- a/Resources/Prototypes/Body/Organs/dwarf.yml +++ b/Resources/Prototypes/Body/Organs/dwarf.yml @@ -1,4 +1,4 @@ -- type: entity +- type: entity id: OrganDwarfHeart parent: OrganHumanHeart name: dwarf heart @@ -12,7 +12,7 @@ name: dwarf liver components: - type: Metabolizer - metabolizerTypes: [Dwarf] + metabolizerTypes: [Dwarf, LiquorLifeline] - type: entity id: OrganDwarfStomach diff --git a/Resources/Prototypes/Chemistry/metabolizer_types.yml b/Resources/Prototypes/Chemistry/metabolizer_types.yml index 4d48dab9925..316b8f02b53 100644 --- a/Resources/Prototypes/Chemistry/metabolizer_types.yml +++ b/Resources/Prototypes/Chemistry/metabolizer_types.yml @@ -48,3 +48,7 @@ - type: metabolizerType id: Vampiric name: vampiric + +- type: metabolizerType + id: LiquorLifeline + name: liquorlifeline diff --git a/Resources/Prototypes/Entities/Mobs/Species/dwarf.yml b/Resources/Prototypes/Entities/Mobs/Species/dwarf.yml index b38ea2634fd..055c6522ddc 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/dwarf.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/dwarf.yml @@ -58,6 +58,8 @@ understands: - GalacticCommon - SolCommon + - type: LightweightDrunk + boozeStrengthMultiplier: 0.5 - type: entity parent: BaseSpeciesDummy diff --git a/Resources/Prototypes/Reagents/Consumable/Drink/alcohol.yml b/Resources/Prototypes/Reagents/Consumable/Drink/alcohol.yml index 12f5a80185a..e31087c309e 100644 --- a/Resources/Prototypes/Reagents/Consumable/Drink/alcohol.yml +++ b/Resources/Prototypes/Reagents/Consumable/Drink/alcohol.yml @@ -164,41 +164,95 @@ conditions: - !type:ReagentThreshold min: 15 - - !type:OrganType - type: Dwarf - shouldHave: false damage: types: Poison: 1 - # dwarves take less toxin damage and heal a marginal amount of brute - - !type:HealthChange + - !type:ChemVomit + probability: 0.04 conditions: - !type:ReagentThreshold - min: 15 + reagent: Ethanol + min: 12 + # dwarves immune to vomiting from alcohol - !type:OrganType type: Dwarf - damage: + shouldHave: false + # Drunken Resilience + - !type:HealthChange + conditions: + - !type:OrganType + type: LiquorLifeline + - !type:ReagentThreshold + reagent: Ethanol + min: 0.10 + max: 0.49 + damage: # NOTE: all damage sets for LiquorLifeline are halved due to + groups: # LightweightDrunkComponent making ethanol half as potent + Brute: -0.4 types: - Poison: 0.2 + Heat: -0.13 + Shock: -0.13 + Cold: -0.13 - !type:HealthChange conditions: + - !type:OrganType + type: LiquorLifeline - !type:ReagentThreshold - min: 15 + reagent: Ethanol + min: 0.50 + max: 6.99 + damage: + groups: + Brute: -0.8 + types: + Heat: -0.26 + Shock: -0.26 + Cold: -0.26 + - !type:HealthChange + conditions: - !type:OrganType - type: Dwarf + type: LiquorLifeline + - !type:ReagentThreshold + reagent: Ethanol + min: 7.00 + max: 10.99 damage: groups: - Brute: -1 - - !type:ChemVomit - probability: 0.04 + Brute: -1.6 + types: + Heat: -0.53 + Shock: -0.53 + Cold: -0.53 + - !type:HealthChange conditions: + - !type:OrganType + type: LiquorLifeline - !type:ReagentThreshold reagent: Ethanol - min: 12 - # dwarves immune to vomiting from alcohol + min: 11 + max: 14.99 + damage: + groups: + Brute: -3.2 + types: + Heat: -1.06 + Shock: -1.06 + Cold: -1.06 + - !type:HealthChange + conditions: - !type:OrganType - type: Dwarf - shouldHave: false + type: LiquorLifeline + - !type:ReagentThreshold + reagent: Ethanol + min: 15 # Overdose threshold + damage: + groups: + Brute: -4.8 + Burn: -4.8 + types: + Heat: -1.60 + Shock: -1.60 + Cold: -1.60 - !type:Drunk boozePower: 2 diff --git a/Resources/Prototypes/Traits/inconveniences.yml b/Resources/Prototypes/Traits/inconveniences.yml index 2dcc30cd97c..5e1e4e4b3f8 100644 --- a/Resources/Prototypes/Traits/inconveniences.yml +++ b/Resources/Prototypes/Traits/inconveniences.yml @@ -1,4 +1,4 @@ -- type: trait +- type: trait id: LightweightDrunk category: Physical requirements: @@ -11,6 +11,11 @@ inverted: true traits: - HeavyweightDrunk + - LiquorLifeline + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Dwarf components: - type: LightweightDrunk boozeStrengthMultiplier: 2 diff --git a/Resources/Prototypes/Traits/skills.yml b/Resources/Prototypes/Traits/skills.yml index 56a8549c933..40198b724ed 100644 --- a/Resources/Prototypes/Traits/skills.yml +++ b/Resources/Prototypes/Traits/skills.yml @@ -36,7 +36,7 @@ - type: trait id: HeavyweightDrunk category: Physical - points: -2 + points: -1 requirements: - !type:CharacterJobRequirement inverted: true @@ -47,7 +47,36 @@ inverted: true traits: - LightweightDrunk + - LiquorLifeline + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Dwarf + components: + - type: LightweightDrunk + boozeStrengthMultiplier: 0.5 + +- type: trait + id: LiquorLifeline + category: Physical + points: -3 + requirements: + - !type:CharacterJobRequirement + inverted: true + jobs: + - Borg + - MedicalBorg + - !type:CharacterTraitRequirement + inverted: true + traits: + - LightweightDrunk + - HeavyweightDrunk + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Dwarf components: + - type: LiquorLifeline - type: LightweightDrunk boozeStrengthMultiplier: 0.5 From 643df55879dcf76e3d106fb09b25eb3f2a8cce6d Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Sat, 10 Aug 2024 20:59:46 +0000 Subject: [PATCH 46/57] Automatic Changelog Update (#706) --- Resources/Changelog/Changelog.yml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 1abacbd8fe1..232c5b81535 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -5163,3 +5163,18 @@ Entries: called. id: 6246 time: '2024-08-10T12:03:12.0000000+00:00' +- author: Skubman + changes: + - type: Add + message: >- + Add Liquor Lifeline (-3 points), a new positive trait that makes you + slowly heal Brute and Burn damage when drunk, healing more the drunker + you are. The trait also gives you the benefits of Alcohol Tolerance. + - type: Tweak + message: >- + The cost of the Alcohol Tolerance trait has been reduced from -2 points + to -1 point. + - type: Add + message: Dwarves receive the Liquor Lifeline trait for free. + id: 6247 + time: '2024-08-10T20:59:22.0000000+00:00' From b9bf6e63b6997386cb7f5e4f35d079d361cf860a Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Sat, 10 Aug 2024 17:30:42 -0400 Subject: [PATCH 47/57] NyanoCombat 2, Part 1: Simple Melee Refactor (#605) # Description Done in partnership with @OldDanceJacket This is a simple refactor of the Melee System, which introduces some new implementations of Contests, but more importantly lightly refactors melee so that "Light Attack"(Left Click) and "Heavy Attack"(Right Click) are now no longer hardcoded to be the same thing, and now can have different modifiers. We've set things up so that weapons can have different behaviors and bonuses if they are used in a heavy attack as opposed to a light attack, including range and damage. In addition to simple code cleanup, I have done the following things: - Max Number of targets per Power Attack(Wide Swing) is now set via a CVar instead of a constant, but is still defaulted to 5. All Blunt Weapons have been changed to - Deal 100% of Blunt as Stamina(up from 50%) by default - BluntDamageStaminaFactor can now be overridden by specific weapons Light Attacks have been changed to: - Deal up to 25% less damage scaling with taken stamina damage - Deal up to 20% more damage with being injured Heavy Attacks have been changed to: - Deal up to 50% less damage scaling with taken stamina damage - Deal up to 20% more damage with being injured - Now deal (by default) 10 points of stamina damage to the wielder - In a separate PR, nearly every weapon in the game is going to have their Wide Swing(Now "Power Attack") mode stats looked at. - When examining the damage a weapon deals, if it has any damage modifiers when power attacking, these values will be shown in addition to the light attack damage. Heavy attacks can now have separate modifiers for: - Attack Range (multiply against light attack range) - Attack Damage (multiply against light attack damage) - Attack Speed (multiply against light attack speed) - Stamina Cost (overriding the default) We will be building upon this PR throughout the week with additional PRs, to include a full rework of melee weapon values across the entire board. For the most part, this PR is primarily here to give new options for contributors to balance melee weapons. # Note For Maintainers: @OldDanceJacket will be following this up with his own PR containing Part 2, which will include a comprehensive rework of the damage values for every melee weapon in the entire game. Due to this, I can't actually make that much in the way of significant changes to the components in review without messing with his side of things. I also have my own Part 3 that I will be working in partnership with ODJ on throughout this week, which will consist of a pack of combat-system related Traits. # Changelog :cl: @VMSolidus and @OldDanceJacket - add: Being injured now lets you deal up to 20% more damage in melee combat to simulate the adrenaline rush from taking a hit. - add: Taking stamina damage now makes you deal less damage in melee. Up to 25% less for Light Attacks, and 50% less for Power Attacks - add: Wide Swing has been reworked as "Power Attack". Power attacks cost 20 stamina(by default) to perform, and their effects can differ from Light attacks on a per-weapon basis. Individual weapons can also have different stamina costs to power attack with. --------- Signed-off-by: Danger Revolution! <142105406+DangerRevolution@users.noreply.github.com> Co-authored-by: Danger Revolution! <142105406+DangerRevolution@users.noreply.github.com> --- Content.Client/Weapons/Melee/MeleeWeaponSystem.cs | 2 +- Content.Shared/Weapons/Melee/MeleeWeaponComponent.cs | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/Content.Client/Weapons/Melee/MeleeWeaponSystem.cs b/Content.Client/Weapons/Melee/MeleeWeaponSystem.cs index cf987e62c7b..98528c691d4 100644 --- a/Content.Client/Weapons/Melee/MeleeWeaponSystem.cs +++ b/Content.Client/Weapons/Melee/MeleeWeaponSystem.cs @@ -222,7 +222,7 @@ private void ClientHeavyAttack(EntityUid user, EntityCoordinates coordinates, En var userPos = TransformSystem.GetWorldPosition(userXform); var direction = targetMap.Position - userPos; - var distance = MathF.Min(component.Range, direction.Length()); + var distance = MathF.Min(component.Range * component.HeavyRangeModifier, direction.Length()); // This should really be improved. GetEntitiesInArc uses pos instead of bounding boxes. // Server will validate it with InRangeUnobstructed. diff --git a/Content.Shared/Weapons/Melee/MeleeWeaponComponent.cs b/Content.Shared/Weapons/Melee/MeleeWeaponComponent.cs index d30e27e98c7..2708a07c6eb 100644 --- a/Content.Shared/Weapons/Melee/MeleeWeaponComponent.cs +++ b/Content.Shared/Weapons/Melee/MeleeWeaponComponent.cs @@ -133,7 +133,6 @@ public sealed partial class MeleeWeaponComponent : Component [DataField, AutoNetworkedField] public int MaxTargets = 5; - // Sounds /// From e6173420a32c30f8b6c1c679d7b8e625edfe604f Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Sat, 10 Aug 2024 21:31:03 +0000 Subject: [PATCH 48/57] Automatic Changelog Update (#605) --- Resources/Changelog/Changelog.yml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 232c5b81535..f19db16825b 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -5178,3 +5178,21 @@ Entries: message: Dwarves receive the Liquor Lifeline trait for free. id: 6247 time: '2024-08-10T20:59:22.0000000+00:00' +- author: VMSolidus + changes: + - type: Add + message: >- + Being injured now lets you deal up to 20% more damage in melee combat to + simulate the adrenaline rush from taking a hit. + - type: Add + message: >- + Taking stamina damage now makes you deal less damage in melee. Up to 25% + less for Light Attacks, and 50% less for Power Attacks + - type: Add + message: >- + Wide Swing has been reworked as "Power Attack". Power attacks cost 20 + stamina(by default) to perform, and their effects can differ from Light + attacks on a per-weapon basis. Individual weapons can also have + different stamina costs to power attack with. + id: 6248 + time: '2024-08-10T21:30:42.0000000+00:00' From 80c3d63c9b3be54e86f3b6fbb1d74c5254d4bbc2 Mon Sep 17 00:00:00 2001 From: Rane <60792108+Elijahrane@users.noreply.github.com> Date: Sat, 10 Aug 2024 17:34:21 -0400 Subject: [PATCH 49/57] Remove Hugging Interaction Popup From Humanoids (#710) # Description Reasoning: 1) Hugging your coworkers isn't necessarily always inappropriate, but it's something that should take a bit more intention than it does now. 2) Event subs in this game right now still have no good method of handling multiple subscriptions to the same event. The hugging event is occupying 2 pieces of prime real estate - the empty hand interaction, which is the most common, and the humanoid interaction, which is the most common and most important. And for what? Spamming popups and chat for something that could just be an emote. 3) Because of the above, it's too easy to accidentally hug people while doing something else - the lack of intersectionality makes people just ignore hugging because they assume it means nothing and was not intentional. This does not lead to good roleplay outcomes. 4) I left the petting stuff on animals because that's much more common and appropriate and you're less likely to be trying to do other complex interactions with them. Also, since they're usually NPCs, it doesn't matter if they get desensitized to the interaction as meaningless, or at least it's out of scope. # Changelog :cl: Rane - remove: Removed the spammable hugging on click. Consider using emotes for this instead. --- .../en-US/interaction/interaction-popup-component.ftl | 6 ------ .../Prototypes/DeltaV/Entities/Mobs/Player/vulpkanin.yml | 5 ----- Resources/Prototypes/Entities/Mobs/Player/arachne.yml | 5 ----- Resources/Prototypes/Entities/Mobs/Player/harpy.yml | 5 ----- Resources/Prototypes/Entities/Mobs/Player/skeleton.yml | 7 +------ Resources/Prototypes/Entities/Mobs/Species/base.yml | 5 ----- .../Prototypes/Nyanotrasen/Entities/Mobs/Player/Oni.yml | 5 ----- .../Nyanotrasen/Entities/Mobs/Player/felinid.yml | 5 ----- 8 files changed, 1 insertion(+), 42 deletions(-) diff --git a/Resources/Locale/en-US/interaction/interaction-popup-component.ftl b/Resources/Locale/en-US/interaction/interaction-popup-component.ftl index bb56233ff14..a6eacf13c5d 100644 --- a/Resources/Locale/en-US/interaction/interaction-popup-component.ftl +++ b/Resources/Locale/en-US/interaction/interaction-popup-component.ftl @@ -77,12 +77,6 @@ comp-window-knock = *knock knock* fence-rattle-success = *rattle* -## Hugging players - -hugging-success-generic = You hug {THE($target)}. -hugging-success-generic-others = { CAPITALIZE(THE($user)) } hugs {THE($target)}. -hugging-success-generic-target = { CAPITALIZE(THE($user)) } hugs you. - ## Other petting-success-tesla = You pet {THE($target)}, violating the laws of nature and physics. diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Player/vulpkanin.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Player/vulpkanin.yml index 06abe8c45fa..718dc3ca559 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/Player/vulpkanin.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Player/vulpkanin.yml @@ -5,11 +5,6 @@ id: MobVulpkanin 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 diff --git a/Resources/Prototypes/Entities/Mobs/Player/arachne.yml b/Resources/Prototypes/Entities/Mobs/Player/arachne.yml index bebf42f31ba..cd4123fa80d 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/arachne.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/arachne.yml @@ -5,11 +5,6 @@ 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 diff --git a/Resources/Prototypes/Entities/Mobs/Player/harpy.yml b/Resources/Prototypes/Entities/Mobs/Player/harpy.yml index 1f4eb696c65..fa6aa98d93c 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/harpy.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/harpy.yml @@ -5,11 +5,6 @@ id: MobHarpy 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 diff --git a/Resources/Prototypes/Entities/Mobs/Player/skeleton.yml b/Resources/Prototypes/Entities/Mobs/Player/skeleton.yml index bf41f2dda6e..d2a3225c070 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/skeleton.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/skeleton.yml @@ -3,12 +3,7 @@ parent: BaseMobSkeletonPerson id: MobSkeletonPerson components: - - type: InteractionPopup - successChance: 1 - interactSuccessString: hugging-success-generic - interactSuccessSound: /Audio/Effects/thudswoosh.ogg - messagePerceivedByOthers: hugging-success-generic-others - - type: PotentialPsionic #Nyano - Summary: makes potentially psionic. + - type: PotentialPsionic #Nyano - Summary: makes potentially psionic. - type: entity name: skeleton pirate diff --git a/Resources/Prototypes/Entities/Mobs/Species/base.yml b/Resources/Prototypes/Entities/Mobs/Species/base.yml index c4906f6f975..9fb241c40d7 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/base.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/base.yml @@ -180,11 +180,6 @@ - type: Dna - type: MindContainer showExamineInfo: true - - type: InteractionPopup - successChance: 1 - interactSuccessString: hugging-success-generic - interactSuccessSound: /Audio/Effects/thudswoosh.ogg - messagePerceivedByOthers: hugging-success-generic-others - type: CanHostGuardian - type: NpcFactionMember factions: diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Player/Oni.yml b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Player/Oni.yml index 562b9c564ec..e1c867691a1 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Player/Oni.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Player/Oni.yml @@ -5,11 +5,6 @@ id: MobOni 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 diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Player/felinid.yml b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Player/felinid.yml index db7936cc5b4..9b79c556707 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Player/felinid.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Player/felinid.yml @@ -5,11 +5,6 @@ id: MobFelinid 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 From c006ec8ecfc6a960812e6e785281b558df84d804 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Sat, 10 Aug 2024 21:34:48 +0000 Subject: [PATCH 50/57] Automatic Changelog Update (#710) --- Resources/Changelog/Changelog.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index f19db16825b..20054168fd9 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -5196,3 +5196,11 @@ Entries: different stamina costs to power attack with. id: 6248 time: '2024-08-10T21:30:42.0000000+00:00' +- author: Rane + changes: + - type: Remove + message: >- + Removed the spammable hugging on click. Consider using emotes for this + instead. + id: 6249 + time: '2024-08-10T21:34:22.0000000+00:00' From 79b3190683300e9f53a825b3a09afff019c62238 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Sat, 10 Aug 2024 17:36:09 -0400 Subject: [PATCH 51/57] NyanoCombat 2, Part 3: Physical Traits (#607) # Description Done in partnership with @OldDanceJacket This PR adds 9 additional physical traits to the game, 5 positive, and 4 negative. While this PR is intended to go with NyanoCombat 2, Part 1 and 2, I have made this PR function completely standalone. It does not require either of the two other PRs. ## Positive Traits - **Will To Live**: Increases your Dead threshold by 10 - **Tenacity**: Increases your Crit threshold by 5 - **Vigor**: Increases your maximum Stamina by 10 - **High Adrenaline**: You gain up to 10% more damage with all melee attacks when injured. - **Masochism**: You ignore the first 10% of stamina damage penalties to melee attacks. If NyanoCombat 2 Part 1 isn't merged yet, this makes you deal up to 10% more melee damage when you receive stamina damage. - **Martial Artist**: Your unarmed melee attacks have bonus range, and deal 50% more damage(for every species in the game, this means 7.5 instead of 5 damage). This trait is identical to one that the Boxer job receives for free, thus it cannot be taken by Boxers. ## Negative Traits - **Will To Die**: Decreases your Dead threshold by 15 - **Glass Jaw**: Decreases your Crit Threshold by 10 - **Lethargy**: Decreases your maximum Stamina by 15 - **Adrenal Dysfunction**: Your melee attacks are penalized by up to 20% when injured. If NyanoCombat 2 Part 1 is merged, this cancels out the natural bonus everyone globally gets to melee when injured. - **Low Pain Tolerance**: Your melee attacks are penalized by up to 15% when receiving stamina damage. If NyanoCombat 2 Part 1 is merged, this stacks with the natural penalties everyone globally gets to melee when taking stamina damage. # TODO - [ ] Let ODJ look over these for balance. # Media ![image](https://github.com/user-attachments/assets/242e8b50-8a5e-4079-bf1d-f952ceeade38) # Changelog :cl: VMSolidus and Skubman - add: 11 new Physical Traits have been added to the game! 6 positive traits, and 5 negative traits. --------- Signed-off-by: Danger Revolution! <142105406+DangerRevolution@users.noreply.github.com> Co-authored-by: Angelo Fallaria Co-authored-by: Danger Revolution! <142105406+DangerRevolution@users.noreply.github.com> --- .../Components/AdrenalineComponent.cs | 28 +++ .../Components/CritModifierComponent.cs | 16 ++ .../Components/DeadModifierComponent.cs | 16 ++ .../Components/PainToleranceComponent.cs | 28 +++ .../StaminaCritModifierComponent.cs | 16 ++ .../Systems/TraitStatModifierSystem.cs | 63 ++++++ Resources/Locale/en-US/traits/traits.ftl | 59 +++++ Resources/Prototypes/Traits/physical.yml | 208 ++++++++++++++++++ 8 files changed, 434 insertions(+) create mode 100644 Content.Shared/Traits/Assorted/Components/AdrenalineComponent.cs create mode 100644 Content.Shared/Traits/Assorted/Components/CritModifierComponent.cs create mode 100644 Content.Shared/Traits/Assorted/Components/DeadModifierComponent.cs create mode 100644 Content.Shared/Traits/Assorted/Components/PainToleranceComponent.cs create mode 100644 Content.Shared/Traits/Assorted/Components/StaminaCritModifierComponent.cs create mode 100644 Content.Shared/Traits/Assorted/Systems/TraitStatModifierSystem.cs create mode 100644 Resources/Prototypes/Traits/physical.yml diff --git a/Content.Shared/Traits/Assorted/Components/AdrenalineComponent.cs b/Content.Shared/Traits/Assorted/Components/AdrenalineComponent.cs new file mode 100644 index 00000000000..a0c58edb106 --- /dev/null +++ b/Content.Shared/Traits/Assorted/Components/AdrenalineComponent.cs @@ -0,0 +1,28 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Traits.Assorted.Components; + +/// +/// This is used for any trait that modifies the Melee System implementation of Health Contest +/// +[RegisterComponent, NetworkedComponent] +public sealed partial class AdrenalineComponent : Component +{ + /// + /// When true, multiplies by the inverse of the resulting Contest. + /// + [DataField] + public bool Inverse { get; private set; } = false; + + /// + /// Used as the RangeModifier input for a Health Contest. + /// + [DataField] + public float RangeModifier { get; private set; } = 1; + + /// + /// Used as the BypassClamp input for a Health Contest. + /// + [DataField] + public bool BypassClamp { get; private set; } = false; +} \ No newline at end of file diff --git a/Content.Shared/Traits/Assorted/Components/CritModifierComponent.cs b/Content.Shared/Traits/Assorted/Components/CritModifierComponent.cs new file mode 100644 index 00000000000..6cf11e3f7fb --- /dev/null +++ b/Content.Shared/Traits/Assorted/Components/CritModifierComponent.cs @@ -0,0 +1,16 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Traits.Assorted.Components; + +/// +/// This is used for any trait that modifies CritThreshold +/// +[RegisterComponent, NetworkedComponent] +public sealed partial class CritModifierComponent : Component +{ + /// + /// The amount that an entity's critical threshold will be incremented by. + /// + [DataField] + public int CritThresholdModifier { get; private set; } = 0; +} \ No newline at end of file diff --git a/Content.Shared/Traits/Assorted/Components/DeadModifierComponent.cs b/Content.Shared/Traits/Assorted/Components/DeadModifierComponent.cs new file mode 100644 index 00000000000..b4ac1bf64fc --- /dev/null +++ b/Content.Shared/Traits/Assorted/Components/DeadModifierComponent.cs @@ -0,0 +1,16 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Traits.Assorted.Components; + +/// +/// This is used for any trait that modifies DeadThreshold +/// +[RegisterComponent, NetworkedComponent] +public sealed partial class DeadModifierComponent : Component +{ + /// + /// The amount that an entity's DeadThreshold will be incremented by. + /// + [DataField] + public int DeadThresholdModifier { get; private set; } = 0; +} \ No newline at end of file diff --git a/Content.Shared/Traits/Assorted/Components/PainToleranceComponent.cs b/Content.Shared/Traits/Assorted/Components/PainToleranceComponent.cs new file mode 100644 index 00000000000..03b3bb116a8 --- /dev/null +++ b/Content.Shared/Traits/Assorted/Components/PainToleranceComponent.cs @@ -0,0 +1,28 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Traits.Assorted.Components; + +/// +/// This is used for any trait that modifies the Melee System implementation of Stamina Contest +/// +[RegisterComponent, NetworkedComponent] +public sealed partial class PainToleranceComponent : Component +{ + /// + /// When true, multiplies by the inverse of the resulting Contest. + /// + [DataField] + public bool Inverse { get; private set; } = false; + + /// + /// Used as the RangeModifier input for a Stamina Contest. + /// + [DataField] + public float RangeModifier { get; private set; } = 1; + + /// + /// Used as the BypassClamp input for a Stamina Contest. + /// + [DataField] + public bool BypassClamp { get; private set; } = false; +} \ No newline at end of file diff --git a/Content.Shared/Traits/Assorted/Components/StaminaCritModifierComponent.cs b/Content.Shared/Traits/Assorted/Components/StaminaCritModifierComponent.cs new file mode 100644 index 00000000000..28c8ab9b089 --- /dev/null +++ b/Content.Shared/Traits/Assorted/Components/StaminaCritModifierComponent.cs @@ -0,0 +1,16 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Traits.Assorted.Components; + +/// +/// This is used for any trait that modifies stamina CritThreshold +/// +[RegisterComponent, NetworkedComponent] +public sealed partial class StaminaCritModifierComponent : Component +{ + /// + /// The amount that an entity's stamina critical threshold will be incremented by. + /// + [DataField] + public int CritThresholdModifier { get; private set; } = 0; +} diff --git a/Content.Shared/Traits/Assorted/Systems/TraitStatModifierSystem.cs b/Content.Shared/Traits/Assorted/Systems/TraitStatModifierSystem.cs new file mode 100644 index 00000000000..85ecf151dd9 --- /dev/null +++ b/Content.Shared/Traits/Assorted/Systems/TraitStatModifierSystem.cs @@ -0,0 +1,63 @@ +using Content.Shared.Contests; +using Content.Shared.Mobs.Components; +using Content.Shared.Mobs.Systems; +using Content.Shared.Traits.Assorted.Components; +using Content.Shared.Weapons.Melee.Events; +using Content.Shared.Damage.Components; + +namespace Content.Shared.Traits.Assorted.Systems; + +public sealed partial class TraitStatModifierSystem : EntitySystem +{ + [Dependency] private readonly ContestsSystem _contests = default!; + [Dependency] private readonly MobThresholdSystem _threshold = default!; + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnCritStartup); + SubscribeLocalEvent(OnDeadStartup); + SubscribeLocalEvent(OnStaminaCritStartup); + SubscribeLocalEvent(OnAdrenalineGetDamage); + SubscribeLocalEvent(OnPainToleranceGetDamage); + } + + private void OnCritStartup(EntityUid uid, CritModifierComponent component, ComponentStartup args) + { + if (!TryComp(uid, out var threshold)) + return; + + var critThreshold = _threshold.GetThresholdForState(uid, Mobs.MobState.Critical, threshold); + if (critThreshold != 0) + _threshold.SetMobStateThreshold(uid, critThreshold + component.CritThresholdModifier, Mobs.MobState.Critical); + } + + private void OnDeadStartup(EntityUid uid, DeadModifierComponent component, ComponentStartup args) + { + if (!TryComp(uid, out var threshold)) + return; + + var deadThreshold = _threshold.GetThresholdForState(uid, Mobs.MobState.Dead, threshold); + if (deadThreshold != 0) + _threshold.SetMobStateThreshold(uid, deadThreshold + component.DeadThresholdModifier, Mobs.MobState.Dead); + } + + private void OnStaminaCritStartup(EntityUid uid, StaminaCritModifierComponent component, ComponentStartup args) + { + if (!TryComp(uid, out var stamina)) + return; + + stamina.CritThreshold += component.CritThresholdModifier; + } + + private void OnAdrenalineGetDamage(EntityUid uid, AdrenalineComponent component, ref GetMeleeDamageEvent args) + { + var modifier = _contests.HealthContest(uid, component.BypassClamp, component.RangeModifier); + args.Damage *= component.Inverse ? 1 / modifier : modifier; + } + + private void OnPainToleranceGetDamage(EntityUid uid, PainToleranceComponent component, ref GetMeleeDamageEvent args) + { + var modifier = _contests.StaminaContest(uid, component.BypassClamp, component.RangeModifier); + args.Damage *= component.Inverse ? 1 / modifier : modifier; + } +} diff --git a/Resources/Locale/en-US/traits/traits.ftl b/Resources/Locale/en-US/traits/traits.ftl index ac4eb206c6e..46ee8572a0b 100644 --- a/Resources/Locale/en-US/traits/traits.ftl +++ b/Resources/Locale/en-US/traits/traits.ftl @@ -86,6 +86,64 @@ 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-WillToLive = Will To Live +trait-description-WillToLive = + You have an unusually strong "will to live", and will resist death more than others. + Your damage threshold for becoming Dead is increased by 10 points. + +trait-name-WillToDie = Will To Die +trait-description-WillToDie = + You have an unusually weak "will to live", and will succumb to injuries sooner than others. + Your damage threshold for becoming Dead is decreased by 15 points. + +trait-name-Tenacity = Tenacity +trait-description-Tenacity = + Whether it be through raw grit, willpower, or subtle bionic augmentations, you are hardier than others. + Your damage threshold for becoming Critical is increased by 5 points. + +trait-name-GlassJaw = Glass Jaw +trait-description-GlassJaw = + Your body is more fragile than others, resulting in a greater susceptibility to critical injuries + Your damage threshold for becoming Critical is decreased by 10 points. + +trait-name-HighAdrenaline = High Adrenaline +trait-description-HighAdrenaline = + Whether by natural causes, genetic or bionic augmentation, you have a more potent adrenal gland. + When injured, your melee attacks deal up to 10% more damage, in addition to the natural bonuses from adrenaline. + The standard adrenaline bonuses to melee damage are up to a 20% increase. + +trait-name-AdrenalDysfunction = Adrenal Dysfunction +trait-description-AdrenalDysfunction = + Your adrenal gland is completely nonfunctional, or potentially missing outright. + Your melee attacks do not benefit from Adrenaline when injured. + The standard adrenaline bonuses to melee damage are up to a 20% increase. + +trait-name-Masochism = Masochism +trait-description-Masochism = + Deriving enjoyment from your own pain, you are not as inhibited by it as others. + You ignore the first 10% of stamina damage penalties to your melee attacks. + +trait-name-LowPainTolerance = Low Pain Tolerance +trait-description-LowPainTolerance = + Your tolerance for pain is far below average, and its effects are more inhibiting. + Your melee damage is penalized by up to an additional 15% when taking stamina damage. + +trait-name-MartialArtist = Martial Artist +trait-description-MartialArtist = + You have received formal training in unarmed combat, whether with Fists, Feet, or Claws. + Your unarmed melee attacks have a small range increase, and deal 50% more damage. + This does not apply to any form of armed melee, only the weapons you were naturally born with. + +trait-name-Vigor = Vigor +trait-description-Vigor = + Whether by pure determination, fitness, or bionic augmentations, your endurance is enhanced. + Your stamina is increased by 10 points. + +trait-name-Lethargy = Lethargy +trait-description-Lethargy = + You become tired faster than others, making you more vulnerable to exhaustion and fatigue. + Your stamina is decreased by 15 points. + trait-name-SignLanguage = Sign Language trait-description-SignLanguage = You can understand and use Galactic Sign Language (GSL). @@ -129,3 +187,4 @@ 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/Prototypes/Traits/physical.yml b/Resources/Prototypes/Traits/physical.yml new file mode 100644 index 00000000000..85d074ffe95 --- /dev/null +++ b/Resources/Prototypes/Traits/physical.yml @@ -0,0 +1,208 @@ +- type: trait + id: WillToLive + category: Physical + points: -2 + requirements: + - !type:CharacterJobRequirement + inverted: true + jobs: + - Borg + - MedicalBorg + - !type:CharacterTraitRequirement + inverted: true + traits: + - WillToDie + components: + - type: DeadModifier + deadThresholdModifier: 10 + +- type: trait + id: WillToDie + category: Physical + points: 1 + requirements: + - !type:CharacterJobRequirement + inverted: true + jobs: + - Borg + - MedicalBorg + - !type:CharacterTraitRequirement + inverted: true + traits: + - WillToLive + components: + - type: DeadModifier + deadThresholdModifier: -15 + +- type: trait + id: Tenacity + category: Physical + points: -2 + requirements: + - !type:CharacterJobRequirement + inverted: true + jobs: + - Borg + - MedicalBorg + - !type:CharacterTraitRequirement + inverted: true + traits: + - GlassJaw + components: + - type: CritModifier + critThresholdModifier: 5 + +- type: trait + id: GlassJaw + category: Physical + points: 1 + requirements: + - !type:CharacterJobRequirement + inverted: true + jobs: + - Borg + - MedicalBorg + - !type:CharacterTraitRequirement + inverted: true + traits: + - Tenacity + components: + - type: CritModifier + critThresholdModifier: -10 + +- type: trait + id: Vigor + category: Physical + points: -3 + requirements: + - !type:CharacterJobRequirement + inverted: true + jobs: + - Borg + - MedicalBorg + - !type:CharacterTraitRequirement + inverted: true + traits: + - Lethargy + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Oni + components: + - type: StaminaCritModifier + critThresholdModifier: 10 + +- type: trait + id: Lethargy + category: Physical + points: 1 + requirements: + - !type:CharacterJobRequirement + inverted: true + jobs: + - Borg + - MedicalBorg + - !type:CharacterTraitRequirement + inverted: true + traits: + - Vigor + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Felinid + components: + - type: StaminaCritModifier + critThresholdModifier: -15 + +- type: trait + id: HighAdrenaline + category: Physical + points: -3 + requirements: + - !type:CharacterJobRequirement + inverted: true + jobs: + - Borg + - MedicalBorg + - !type:CharacterTraitRequirement + inverted: true + traits: + - AdrenalDysfunction + components: + - type: Adrenaline + rangeModifier: 0.4 + inverse: true + +- type: trait + id: AdrenalDysfunction + category: Physical + points: 1 + requirements: + - !type:CharacterJobRequirement + inverted: true + jobs: + - Borg + - MedicalBorg + - !type:CharacterTraitRequirement + inverted: true + traits: + - HighAdrenaline + components: + - type: Adrenaline + rangeModifier: 0.8 + +- type: trait + id: Masochism + category: Physical + points: -3 + requirements: + - !type:CharacterJobRequirement + inverted: true + jobs: + - Borg + - MedicalBorg + - !type:CharacterTraitRequirement + inverted: true + traits: + - LowPainTolerance + components: + - type: PainTolerance + rangeModifier: 0.4 + inverse: true + +- type: trait + id: LowPainTolerance + category: Physical + points: 1 + requirements: + - !type:CharacterJobRequirement + inverted: true + jobs: + - Borg + - MedicalBorg + - !type:CharacterTraitRequirement + inverted: true + traits: + - Masochism + components: + - type: PainTolerance + rangeModifier: 0.6 + +- type: trait + id: MartialArtist + category: Physical + points: -2 + requirements: + - !type:CharacterJobRequirement + inverted: true + jobs: + - Borg + - MedicalBorg + - Boxer + components: + - type: Boxer + modifiers: + coefficients: + Blunt: 1.5 + Slash: 1.5 + Piercing: 1.5 From 98693301365b2c9770de8cc73fea12b0a76db3b1 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Sat, 10 Aug 2024 21:36:39 +0000 Subject: [PATCH 52/57] Automatic Changelog Update (#607) --- Resources/Changelog/Changelog.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 20054168fd9..8fe9f12d886 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -5204,3 +5204,11 @@ Entries: instead. id: 6249 time: '2024-08-10T21:34:22.0000000+00:00' +- author: VMSolidus and Skubman + changes: + - type: Add + message: >- + 11 new Physical Traits have been added to the game! 6 positive traits, + and 5 negative traits. + id: 6250 + time: '2024-08-10T21:36:09.0000000+00:00' From e4b925b0ea1a1689260de814dadd114ca9c7aeaf Mon Sep 17 00:00:00 2001 From: BlueHNT <79374236+BlueHNT@users.noreply.github.com> Date: Sat, 10 Aug 2024 23:36:48 +0200 Subject: [PATCH 53/57] Adds BeardTag (#608) # Description Adds `BeardTag = "HidesBeard"` for helmets which cover entire head, masks which should hide beards and such. --- # Changelog :cl: - add: Added `HidesBeard` tag --- .../Clothing/EntitySystems/ClothingSystem.cs | 11 ++++++++++- Resources/Prototypes/tags.yml | 3 +++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/Content.Shared/Clothing/EntitySystems/ClothingSystem.cs b/Content.Shared/Clothing/EntitySystems/ClothingSystem.cs index 087e2ecedab..b407b867f74 100644 --- a/Content.Shared/Clothing/EntitySystems/ClothingSystem.cs +++ b/Content.Shared/Clothing/EntitySystems/ClothingSystem.cs @@ -28,6 +28,10 @@ public abstract class ClothingSystem : EntitySystem [ValidatePrototypeId] private const string NoseTag = "HidesNose"; + [ValidatePrototypeId] + + private const string BeardTag = "HidesBeard"; + public override void Initialize() { base.Initialize(); @@ -106,7 +110,7 @@ private void ToggleVisualLayer(EntityUid equipee, HumanoidVisualLayers layer, st { if (_tagSystem.HasTag(item, tag)) { - if (tag == NoseTag) //Special check needs to be made for NoseTag, due to masks being toggleable + if (tag == NoseTag || tag == BeardTag) // Special check for NoseTag or BeardTag, due to masks being toggleable { if (TryComp(item, out MaskComponent? mask) && TryComp(item, out ClothingComponent? clothing)) { @@ -139,6 +143,8 @@ protected virtual void OnGotEquipped(EntityUid uid, ClothingComponent component, ToggleVisualLayer(args.Equipee, HumanoidVisualLayers.Hair, HairTag); if ((new string[] { "mask", "head" }).Contains(args.Slot) && _tagSystem.HasTag(args.Equipment, NoseTag)) ToggleVisualLayer(args.Equipee, HumanoidVisualLayers.Snout, NoseTag); + if ((new string[] { "mask", "head" }).Contains(args.Slot) && _tagSystem.HasTag(args.Equipment, BeardTag)) + ToggleVisualLayer(args.Equipee, HumanoidVisualLayers.FacialHair, BeardTag); } protected virtual void OnGotUnequipped(EntityUid uid, ClothingComponent component, GotUnequippedEvent args) @@ -148,6 +154,8 @@ protected virtual void OnGotUnequipped(EntityUid uid, ClothingComponent componen ToggleVisualLayer(args.Equipee, HumanoidVisualLayers.Hair, HairTag); if ((new string[] { "mask", "head" }).Contains(args.Slot) && _tagSystem.HasTag(args.Equipment, NoseTag)) ToggleVisualLayer(args.Equipee, HumanoidVisualLayers.Snout, NoseTag); + if ((new string[] { "mask", "head" }).Contains(args.Slot) && _tagSystem.HasTag(args.Equipment, BeardTag)) + ToggleVisualLayer(args.Equipee, HumanoidVisualLayers.FacialHair, BeardTag); } private void OnGetState(EntityUid uid, ClothingComponent component, ref ComponentGetState args) @@ -166,6 +174,7 @@ private void OnMaskToggled(Entity ent, ref ItemMaskToggledEve //TODO: sprites for 'pulled down' state. defaults to invisible due to no sprite with this prefix SetEquippedPrefix(ent, args.IsToggled ? args.equippedPrefix : null, ent); ToggleVisualLayer(args.Wearer, HumanoidVisualLayers.Snout, NoseTag); + ToggleVisualLayer(args.Wearer, HumanoidVisualLayers.FacialHair, BeardTag); } private void OnPickedUp(Entity ent, ref GettingPickedUpAttemptEvent args) diff --git a/Resources/Prototypes/tags.yml b/Resources/Prototypes/tags.yml index 786f641ddd1..928da630f6f 100644 --- a/Resources/Prototypes/tags.yml +++ b/Resources/Prototypes/tags.yml @@ -704,6 +704,9 @@ - type: Tag id: HidesNose # for non-standard noses. +- type: Tag + id: HidesBeard # for full coverage helmet / masks where beard shouldn't show + - type: Tag id: HighRiskItem From 9c74822d999ec2e0f7a7cf2d1fc2caae49b5e0f5 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Sat, 10 Aug 2024 21:37:36 +0000 Subject: [PATCH 54/57] Automatic Changelog Update (#608) --- Resources/Changelog/Changelog.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 8fe9f12d886..4a92df64a45 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -5212,3 +5212,9 @@ Entries: and 5 negative traits. id: 6250 time: '2024-08-10T21:36:09.0000000+00:00' +- author: BlueHNT + changes: + - type: Add + message: Added `HidesBeard` tag + id: 6251 + time: '2024-08-10T21:36:49.0000000+00:00' From eb64404e7481afb9bb2292f03ac8f37d2b51a9f9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 10 Aug 2024 19:04:05 -0700 Subject: [PATCH 55/57] Update Credits (#719) --- Resources/Credits/GitHub.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Credits/GitHub.txt b/Resources/Credits/GitHub.txt index 6e47a71e43f..ba4a72af1fb 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, 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 +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, BlueHNT, 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, clorl, 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, Fansana, 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, gluesniffler, GNF54, Golinth, GoodWheatley, graevy, GreyMario, Guess-My-Name, gusxyz, h3half, Hanzdegloker, Hardly3D, harikattar, Hebiman, HerCoyote23, HoofedEar, Hoolny, hord-brayden, hubismal, Hugal31, Huxellberger, 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, SleepyScarecrow, 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, whateverusername0, Willhelm53, wixoaGit, WlarusFromDaSpace, wrexbe, xRiriq, yathxyz, Ygg01, YotaXP, YuriyKiss, zach-hill, Zandario, Zap527, Zealith-Gamer, ZelteHonor, zerorulez, zionnBE, zlodo, ZNixian, ZoldorfTheWizard, Zumorica, Zymem From 09a8b9153c6a94ecb7ae97fbad61a645eced7ee2 Mon Sep 17 00:00:00 2001 From: Angelo Fallaria Date: Sun, 11 Aug 2024 10:08:36 +0800 Subject: [PATCH 56/57] Increase Trait Limit From 5 To 10 (#720) # Description Given the big influx of new traits, a maximum of 5 traits can feel constricting, as often you'll have unspent points but not enough trait slots to buy more traits. This doubles the default trait limit from 5 to 10 to increase player choice and allow more unique trait setups. Since the base trait points have not been increased, players will still need to take negative traits if they want to have more positive traits than before. ## Changelog :cl: Skubman - tweak: The maximum trait limit has increased from 5 traits to 10 traits. --- Content.Shared/CCVar/CCVars.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Shared/CCVar/CCVars.cs b/Content.Shared/CCVar/CCVars.cs index 3fc7e7247e6..ff2a915b1ba 100644 --- a/Content.Shared/CCVar/CCVars.cs +++ b/Content.Shared/CCVar/CCVars.cs @@ -361,7 +361,7 @@ public static readonly CVarDef /// How many traits a character can have at most. /// public static readonly CVarDef GameTraitsMax = - CVarDef.Create("game.traits_max", 5, CVar.REPLICATED); + CVarDef.Create("game.traits_max", 10, CVar.REPLICATED); /// /// How many points a character should start with. From 393116752ca73fba533ef404f0e7c0cafc1d6737 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Sun, 11 Aug 2024 02:09:03 +0000 Subject: [PATCH 57/57] Automatic Changelog Update (#720) --- Resources/Changelog/Changelog.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 4a92df64a45..c3101c7a468 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -5218,3 +5218,9 @@ Entries: message: Added `HidesBeard` tag id: 6251 time: '2024-08-10T21:36:49.0000000+00:00' +- author: Skubman + changes: + - type: Tweak + message: The maximum trait limit has increased from 5 traits to 10 traits. + id: 6252 + time: '2024-08-11T02:08:37.0000000+00:00'