Переглянути джерело

Nomads update 1 (#202)

* removes old ambient sounds

* yaml fixes

* stamina

* maybe fixes invites? needs testing

* linter error quickfix

* another quickfix

* cmon work
Taislin 6 місяців тому
батько
коміт
903c25ce89
100 змінених файлів з 489 додано та 1051 видалено
  1. 54 0
      Content.Client/Commands/AcceptFactionInviteCommand.cs
  2. 82 22
      Content.Client/UserInterface/Systems/Faction/FactionUIController.cs
  3. 1 6
      Content.Server/GameTicking/Rules/Components/NukeopsRuleComponent.cs
  4. 1 7
      Content.Server/GameTicking/Rules/Components/TraitorRuleComponent.cs
  5. 2 2
      Content.Server/GameTicking/Rules/NukeopsRuleSystem.cs
  6. 1 1
      Content.Server/GameTicking/Rules/RevolutionaryRuleSystem.cs
  7. 2 2
      Content.Server/GameTicking/Rules/TraitorRuleSystem.cs
  8. 0 2
      Content.Server/Zombies/ZombieSystem.Transform.cs
  9. 1 1
      Content.Shared/Civ14/CivFactions/FactionExamineSystem.cs
  10. 1 1
      Content.Shared/Nutrition/Components/HungerComponent.cs
  11. 0 6
      Content.Shared/Revolutionary/Components/RevolutionaryComponent.cs
  12. 0 7
      Content.Shared/Silicons/Laws/Components/EmagSiliconLawComponent.cs
  13. 1 2
      Content.Shared/Silicons/Laws/SharedSiliconLawSystem.cs
  14. 3 9
      Content.Shared/Zombies/ZombieComponent.cs
  15. 1 1
      Content.Shared/_Stalker/Stamina/StaminaActiveComponent.cs
  16. 0 24
      Resources/Audio/Ambience/Antag/attributions.yml
  17. BIN
      Resources/Audio/Ambience/Antag/emagged_borg.ogg
  18. BIN
      Resources/Audio/Ambience/Antag/headrev_start.ogg
  19. BIN
      Resources/Audio/Ambience/Antag/nukeops_start.ogg
  20. BIN
      Resources/Audio/Ambience/Antag/pirate_start.ogg
  21. BIN
      Resources/Audio/Ambience/Antag/silicon_lawboard_antimov.ogg
  22. BIN
      Resources/Audio/Ambience/Antag/traitor_start.ogg
  23. BIN
      Resources/Audio/Ambience/Antag/zombie_start.ogg
  24. BIN
      Resources/Audio/Ambience/ambiatmos.ogg
  25. BIN
      Resources/Audio/Ambience/ambiatmos2.ogg
  26. BIN
      Resources/Audio/Ambience/ambicave.ogg
  27. BIN
      Resources/Audio/Ambience/ambicha1.ogg
  28. BIN
      Resources/Audio/Ambience/ambicha2.ogg
  29. BIN
      Resources/Audio/Ambience/ambicha3.ogg
  30. BIN
      Resources/Audio/Ambience/ambicha4.ogg
  31. BIN
      Resources/Audio/Ambience/ambidanger.ogg
  32. BIN
      Resources/Audio/Ambience/ambidanger2.ogg
  33. BIN
      Resources/Audio/Ambience/ambigen1.ogg
  34. BIN
      Resources/Audio/Ambience/ambigen10.ogg
  35. BIN
      Resources/Audio/Ambience/ambigen11.ogg
  36. BIN
      Resources/Audio/Ambience/ambigen12.ogg
  37. BIN
      Resources/Audio/Ambience/ambigen13.ogg
  38. BIN
      Resources/Audio/Ambience/ambigen14.ogg
  39. BIN
      Resources/Audio/Ambience/ambigen15.ogg
  40. BIN
      Resources/Audio/Ambience/ambigen2.ogg
  41. BIN
      Resources/Audio/Ambience/ambigen3.ogg
  42. BIN
      Resources/Audio/Ambience/ambigen4.ogg
  43. BIN
      Resources/Audio/Ambience/ambigen5.ogg
  44. BIN
      Resources/Audio/Ambience/ambigen6.ogg
  45. BIN
      Resources/Audio/Ambience/ambigen7.ogg
  46. BIN
      Resources/Audio/Ambience/ambigen8.ogg
  47. BIN
      Resources/Audio/Ambience/ambigen9.ogg
  48. BIN
      Resources/Audio/Ambience/ambiholy.ogg
  49. BIN
      Resources/Audio/Ambience/ambiholy2.ogg
  50. BIN
      Resources/Audio/Ambience/ambiholy3.ogg
  51. BIN
      Resources/Audio/Ambience/ambilava1.ogg
  52. BIN
      Resources/Audio/Ambience/ambilava2.ogg
  53. BIN
      Resources/Audio/Ambience/ambilava3.ogg
  54. BIN
      Resources/Audio/Ambience/ambimaint1.ogg
  55. BIN
      Resources/Audio/Ambience/ambimaint2.ogg
  56. BIN
      Resources/Audio/Ambience/ambimaint3.ogg
  57. BIN
      Resources/Audio/Ambience/ambimaint4.ogg
  58. BIN
      Resources/Audio/Ambience/ambimaint5.ogg
  59. BIN
      Resources/Audio/Ambience/ambimine.ogg
  60. BIN
      Resources/Audio/Ambience/ambimo1.ogg
  61. BIN
      Resources/Audio/Ambience/ambimo2.ogg
  62. BIN
      Resources/Audio/Ambience/ambimystery.ogg
  63. BIN
      Resources/Audio/Ambience/ambinice.ogg
  64. BIN
      Resources/Audio/Ambience/ambiodd.ogg
  65. BIN
      Resources/Audio/Ambience/ambireebe1.ogg
  66. BIN
      Resources/Audio/Ambience/ambireebe3.ogg
  67. BIN
      Resources/Audio/Ambience/ambiruin.ogg
  68. BIN
      Resources/Audio/Ambience/ambiruin2.ogg
  69. BIN
      Resources/Audio/Ambience/ambiruin3.ogg
  70. BIN
      Resources/Audio/Ambience/ambiruin4.ogg
  71. BIN
      Resources/Audio/Ambience/ambiruin5.ogg
  72. BIN
      Resources/Audio/Ambience/ambiruin6.ogg
  73. BIN
      Resources/Audio/Ambience/ambiruin7.ogg
  74. BIN
      Resources/Audio/Ambience/ambisin1.ogg
  75. BIN
      Resources/Audio/Ambience/ambisin2.ogg
  76. BIN
      Resources/Audio/Ambience/ambisin3.ogg
  77. BIN
      Resources/Audio/Ambience/ambisin4.ogg
  78. BIN
      Resources/Audio/Ambience/ambispace2.ogg
  79. BIN
      Resources/Audio/Ambience/ambitech.ogg
  80. BIN
      Resources/Audio/Ambience/ambitech2.ogg
  81. BIN
      Resources/Audio/Ambience/ambitech3.ogg
  82. BIN
      Resources/Audio/Ambience/ambitrain1.ogg
  83. BIN
      Resources/Audio/Ambience/ambitrain2.ogg
  84. BIN
      Resources/Audio/Ambience/ambitrain3.ogg
  85. BIN
      Resources/Audio/Ambience/anomaly_drone.ogg
  86. BIN
      Resources/Audio/Ambience/anomaly_scary.ogg
  87. 0 119
      Resources/Audio/Ambience/attributions.yml
  88. BIN
      Resources/Audio/Ambience/constellations.ogg
  89. BIN
      Resources/Audio/Ambience/drifting.ogg
  90. BIN
      Resources/Audio/Ambience/maintambience.ogg
  91. BIN
      Resources/Audio/Ambience/spookyspace1.ogg
  92. BIN
      Resources/Audio/Ambience/spookyspace2.ogg
  93. BIN
      Resources/Audio/Ambience/starlight.ogg
  94. BIN
      Resources/Audio/Ambience/unanchored.ogg
  95. BIN
      Resources/Audio/Ambience/voyage_neverending.ogg
  96. 0 470
      Resources/Prototypes/Civ14/Entities/Clothing/entities_clothing_uniform.yml
  97. 82 88
      Resources/Prototypes/Entities/Effects/portal.yml
  98. 0 6
      Resources/Prototypes/Entities/Structures/Machines/anomaly_equipment.yml
  99. 0 12
      Resources/Prototypes/Entities/Structures/Specific/Anomaly/anomalies.yml
  100. 257 263
      Resources/Prototypes/Entities/Structures/Specific/Anomaly/anomaly_injectors.yml

+ 54 - 0
Content.Client/Commands/AcceptFactionInviteCommand.cs

@@ -0,0 +1,54 @@
+using Content.Shared.Civ14.CivFactions;
+using JetBrains.Annotations;
+using Robust.Shared.Console;
+using Robust.Shared.GameObjects;
+using Robust.Shared.IoC;
+using Robust.Shared.Network;
+
+namespace Content.Client.Commands
+{
+    [UsedImplicitly]
+    public sealed class AcceptFactionInviteCommand : IConsoleCommand
+    {
+        [Dependency] private readonly IEntityManager _entityManager = default!;
+
+        public string Command => "acceptfactioninvite";
+        public string Description => "Accepts an invitation to join a faction.";
+        public string Help => $"Usage: {Command} \"<faction_name>\" \"<inviter_user_id>\"";
+
+        public void Execute(IConsoleShell shell, string argStr, string[] args)
+        {
+            if (args.Length != 2)
+            {
+                shell.WriteError("Invalid number of arguments.");
+                shell.WriteLine(Help);
+                return;
+            }
+
+            var factionName = args[0];
+            var inviterUserIdStr = args[1];
+
+            if (string.IsNullOrWhiteSpace(factionName))
+            {
+                shell.WriteError("Faction name cannot be empty.");
+                return;
+            }
+
+            if (!Guid.TryParse(inviterUserIdStr, out var inviterGuid))
+            {
+                shell.WriteError($"Invalid inviter user ID format: {inviterUserIdStr}");
+                return;
+            }
+
+            var inviterNetId = new NetUserId(inviterGuid);
+
+            // Create and raise the network event to the server
+            // AcceptFactionInviteEvent is defined in Content.Shared.Civ14.CivFactions
+            // The server (CivFactionsSystem) handles this event.
+            var acceptEvent = new AcceptFactionInviteEvent(factionName, inviterNetId);
+            _entityManager.RaisePredictiveEvent(acceptEvent);
+
+            shell.WriteLine($"Sent request to join faction: '{factionName}' (invited by: {inviterNetId}).");
+        }
+    }
+}

+ 82 - 22
Content.Client/UserInterface/Systems/Faction/FactionUIController.cs

@@ -11,7 +11,7 @@
 using Robust.Shared.Utility;
 using static Robust.Client.UserInterface.Controls.BaseButton;
 using Robust.Client.Console;
-using Content.Shared.Civ14.CivFactions;
+using Content.Shared.Civ14.CivFactions; // Existing using
 using Content.Client.Popups;
 using Content.Shared.Popups;
 using System.Linq;
@@ -20,7 +20,8 @@
 using Robust.Shared.GameObjects;
 using Robust.Shared.Player; // Required for ICommonSession
 using Content.Client.UserInterface.Systems.MenuBar.Widgets;
-
+using Robust.Shared.IoC; // Added for IoCManager
+using Content.Client.Commands;
 
 namespace Content.Client.UserInterface.Systems.Faction;
 
@@ -33,24 +34,45 @@ public sealed class FactionUIController : UIController, IOnStateEntered<Gameplay
     [Dependency] private readonly IPrototypeManager _prototypeManager = default!;
     [Dependency] private readonly IClientConsoleHost _consoleHost = default!;
     [Dependency] private readonly IClientNetManager _netManager = default!;
-    private PopupSystem? _popupSystem; // Make nullable
+    private PopupSystem? _popupSystem;
+
+    // Store the command instance to manage its registration lifecycle
+    private AcceptFactionInviteCommand? _acceptInviteCmdInstance;
     private ISawmill _sawmill = default!;
     private FactionWindow? _window; // Make nullable
     // Ensure the namespace and class name are correct for GameTopMenuBar
     private MenuButton? FactionButton => UIManager.GetActiveUIWidgetOrNull<GameTopMenuBar>()?.FactionButton;
 
+    private bool _factionControllerResourcesCleanedUp = false;
+
     /// <summary>
     /// Performs initial setup for the faction UI controller, including subscribing to relevant network events and configuring logging.
     /// </summary>
     public override void Initialize()
     {
         base.Initialize();
-        // Try to get PopupSystem. If this fails (e.g., due to initialization order issues),
-        // _popupSystem will remain null. We'll attempt to resolve it lazily later if needed,
-        // or handle its absence. This avoids a startup crash if EntitySystemManager is problematic.
+
         SubscribeNetworkEvent<FactionInviteOfferEvent>(OnFactionInviteOffer);
         SubscribeNetworkEvent<PlayerFactionStatusChangedEvent>(OnPlayerFactionStatusChanged);
         _sawmill = _logMan.GetSawmill("faction");
+
+        // Create an instance of the command
+        var acceptInviteCmd = new AcceptFactionInviteCommand();
+        IoCManager.InjectDependencies(acceptInviteCmd); // Injects [Dependency] fields in AcceptFactionInviteCommand
+
+        try
+        {
+            _consoleHost.RegisterCommand(acceptInviteCmd);
+            _acceptInviteCmdInstance = acceptInviteCmd; // This instance successfully registered the command
+            _sawmill.Debug($"Command '{acceptInviteCmd.Command}' registered successfully by this FactionUIController instance.");
+        }
+        catch (ArgumentException e) when (e.Message.Contains("An item with the same key has already been added"))
+        {
+            // Command is already registered, likely by another client instance in a test/tool environment.
+            // Log this and assume the existing registration is fine.
+            _sawmill.Debug($"Command '{acceptInviteCmd.Command}' was already registered. Skipping registration for this FactionUIController instance. Exception: {e.Message}");
+            _acceptInviteCmdInstance = null; // This instance did not register the command.
+        }
     }
 
     /// <summary>
@@ -63,6 +85,9 @@ public void OnStateEntered(GameplayState state)
 
         _sawmill.Debug("FactionUIController entering GameplayState.");
 
+        // Retrieve PopupSystem here, as EntityManager should be more reliably initialized.
+        _ent.TrySystem(out _popupSystem);
+
         // Create the window instance
         _window = UIManager.CreateWindow<FactionWindow>();
         LayoutContainer.SetAnchorPreset(_window, LayoutContainer.LayoutPreset.CenterTop);
@@ -122,8 +147,7 @@ public void OnStateExited(GameplayState state)
             // Ensure window is closed before disposing
             if (_window.IsOpen)
                 _window.Close();
-            _window.Dispose();
-            _window = null; // Set to null after disposal
+            _window = null; // Set to null after closing
         }
 
         // Unregister keybind
@@ -133,8 +157,44 @@ public void OnStateExited(GameplayState state)
         // *** ADD THIS LINE ***
         // Unload the button hookup
         UnloadButton();
+
+        // Perform cleanup of resources specific to this controller when exiting the gameplay state.
+        // This is used as the primary cleanup point for the command registration
+        // due to apparent issues with overriding or extending UIController.Dispose in the current build environment.
+        CleanupFactionControllerResources(true); // True for 'disposing managed resources'
     }
 
+    /// <summary>
+    /// Performs cleanup of managed resources held by this FactionUIController,
+    /// such as unregistering console commands.
+    /// This method is called from OnStateExited as the primary cleanup path
+    /// because the standard IDisposable pattern with overriding Dispose(bool)
+    /// seems problematic in the current build/linting environment (based on CS0115, CS0117).
+    /// </summary>
+    /// <param name="disposing">True if called because managed resources should be disposed.</param>
+    private void CleanupFactionControllerResources(bool disposing)
+    {
+        if (_factionControllerResourcesCleanedUp)
+            return;
+
+        if (disposing)
+        {
+            if (_acceptInviteCmdInstance != null)
+            {
+                _consoleHost.UnregisterCommand(_acceptInviteCmdInstance.Command);
+                _sawmill.Debug($"Command '{_acceptInviteCmdInstance.Command}' unregistered by FactionUIController in CleanupFactionControllerResources.");
+                _acceptInviteCmdInstance = null;
+            }
+        }
+        _factionControllerResourcesCleanedUp = true;
+    }
+
+    // Note: The base UIController.Dispose() method (from IDisposable) will be called when this controller is disposed by the UserInterfaceManager.
+    // However, due to compiler errors (CS0115 'no suitable method to override' for Dispose(bool), and CS0117 'base.Dispose(bool) not found'),
+    // FactionUIController-specific cleanup (like command unregistration) has been moved to OnStateExited via CleanupFactionControllerResources.
+    // If the UIController API in the environment were to match the standard RobustToolbox pattern (with a protected virtual Dispose(bool)),
+    // that would be the ideal place for this cleanup logic.
+
     /// <summary>
     /// Retrieves the first available <see cref="CivFactionsComponent"/> found in the game state, or null if none exist.
     /// </summary>
@@ -186,25 +246,25 @@ private void OnFactionInviteOffer(FactionInviteOfferEvent msg, EntitySessionEven
 
         // Improved feedback using a clickable popup or chat message
         var message = $"{msg.InviterName} invited you to join faction '{msg.FactionName}'.";
-        var acceptCommand = $"/acceptfactioninvite \"{msg.FactionName}\""; // Use quotes for names with spaces
+        // Include InviterUserId in the command. It needs to be a string for the command line.
+        var acceptCommand = $"/acceptfactioninvite \"{msg.FactionName}\" \"{msg.InviterUserId.ToString()}\"";
 
         // You could use a more interactive popup system if available,
         // but for now, let's add the command hint to the popup/chat.
         var fullMessage = $"{message}\nType '{acceptCommand}' in chat to accept.";
 
-        if (_player.LocalSession?.AttachedEntity is { Valid: true } playerEntity)
+        var localPlayerEntity = _player.LocalSession?.AttachedEntity;
+        if (localPlayerEntity.HasValue && _ent.EntityExists(localPlayerEntity))
         {
-            // Only use _popupSystem if it was successfully retrieved
-            _popupSystem?.PopupEntity(fullMessage, playerEntity, PopupType.Medium);
+            _popupSystem?.PopupEntity(fullMessage, localPlayerEntity.Value, PopupType.Medium);
         }
         else
         {
-            // Fallback if player entity isn't available or popup system isn't
-            _popupSystem?.PopupCursor(fullMessage); // Show on cursor if possible
-            _sawmill.Warning($"Could not show faction invite popup on entity (player entity not found or PopupSystem unavailable). Falling back to cursor popup if PopupSystem exists. Message: {fullMessage}");
+            _popupSystem?.PopupCursor(fullMessage, PopupType.Medium);
+            _sawmill.Warning($"Could not show faction invite popup on player entity (entity not found or invalid). Falling back to cursor popup. Message: {fullMessage}");
         }
         // As a very robust fallback, also send to chat, as popups can sometimes be missed or problematic.
-        _consoleHost.ExecuteCommand($"say \"{message}\"");
+        // _consoleHost.ExecuteCommand($"say \"{message}\""); // Optional: 'say' might be too noisy. The popup and echo should suffice.
         _consoleHost.ExecuteCommand($"echo \"To accept, type: {acceptCommand}\""); // Echo to self for easy copy/paste
     }
 
@@ -382,10 +442,10 @@ private void HandleCreateFactionPressed()
         {
             _sawmill.Warning("Create Faction pressed with empty name.");
             var errorMsg = "Faction name cannot be empty.";
-            if (_player.LocalSession?.AttachedEntity is { Valid: true } playerEntity && _popupSystem != null)
-                _popupSystem.PopupEntity(errorMsg, playerEntity, PopupType.SmallCaution);
+            if (_player.LocalSession?.AttachedEntity is { Valid: true } playerEntity) // playerEntity here is EntityUid
+                _popupSystem?.PopupEntity(errorMsg, playerEntity, PopupType.SmallCaution); // Use playerEntity directly
             else // Fallback to cursor popup or console if entity/popupsystem is unavailable
-                _popupSystem?.PopupCursor(errorMsg); // Use null-conditional
+                _popupSystem?.PopupCursor(errorMsg, PopupType.SmallCaution);
             return;
         }
 
@@ -395,10 +455,10 @@ private void HandleCreateFactionPressed()
         {
             _sawmill.Warning($"Create Faction pressed with name too long: {desiredName}");
             var msg = $"Faction name is too long (max {maxNameLength} characters).";
-            if (_player.LocalSession?.AttachedEntity is { Valid: true } playerEntity && _popupSystem != null)
-                _popupSystem.PopupEntity(msg, playerEntity, PopupType.SmallCaution);
+            if (_player.LocalSession?.AttachedEntity is { Valid: true } playerEntity) // playerEntity here is EntityUid
+                _popupSystem?.PopupEntity(msg, playerEntity, PopupType.SmallCaution); // Use playerEntity directly
             else // Fallback
-                _popupSystem?.PopupCursor(msg); // Use null-conditional
+                _popupSystem?.PopupCursor(msg, PopupType.SmallCaution);
             return;
         }
         // --- End Client-side validation ---

+ 1 - 6
Content.Server/GameTicking/Rules/Components/NukeopsRuleComponent.cs

@@ -87,7 +87,7 @@ public sealed partial class NukeopsRuleComponent : Component
     public WinType WinType = WinType.Neutral;
 
     [DataField]
-    public List<WinCondition> WinConditions = new ();
+    public List<WinCondition> WinConditions = new();
 
     [DataField]
     public EntityUid? TargetStation;
@@ -95,11 +95,6 @@ public sealed partial class NukeopsRuleComponent : Component
     [DataField]
     public ProtoId<NpcFactionPrototype> Faction = "Syndicate";
 
-    /// <summary>
-    ///     Path to antagonist alert sound.
-    /// </summary>
-    [DataField]
-    public SoundSpecifier GreetSoundNotification = new SoundPathSpecifier("/Audio/Ambience/Antag/nukeops_start.ogg");
 }
 
 public enum WinType : byte

+ 1 - 7
Content.Server/GameTicking/Rules/Components/TraitorRuleComponent.cs

@@ -1,6 +1,6 @@
 using Content.Shared.Dataset;
 using Content.Shared.FixedPoint;
-using Content.Shared.NPC.Prototypes;
+using Content.Shared.NPC.Prototypes;
 using Content.Shared.Random;
 using Content.Shared.Roles;
 using Robust.Shared.Audio;
@@ -71,12 +71,6 @@ public enum SelectionState
     [DataField(customTypeSerializer: typeof(TimeOffsetSerializer)), ViewVariables(VVAccess.ReadWrite)]
     public TimeSpan? AnnounceAt;
 
-    /// <summary>
-    ///     Path to antagonist alert sound.
-    /// </summary>
-    [DataField]
-    public SoundSpecifier GreetSoundNotification = new SoundPathSpecifier("/Audio/Ambience/Antag/traitor_start.ogg");
-
     /// <summary>
     /// The amount of codewords that are selected.
     /// </summary>

+ 2 - 2
Content.Server/GameTicking/Rules/NukeopsRuleSystem.cs

@@ -104,7 +104,7 @@ public override void Initialize()
 
         args.AddLine(Loc.GetString("nukeops-list-start"));
 
-        var antags =_antag.GetAntagIdentifiers(uid);
+        var antags = _antag.GetAntagIdentifiers(uid);
 
         foreach (var (_, sessionData, name) in antags)
         {
@@ -481,7 +481,7 @@ private void OnAfterAntagEntSelected(Entity<NukeopsRuleComponent> ent, ref After
                 ("station", target),
                 ("name", Name(ent))),
             Color.Red,
-            ent.Comp.GreetSoundNotification);
+            null);
     }
 
     private void OnGetBriefing(Entity<NukeopsRoleComponent> role, ref GetBriefingEvent args)

+ 1 - 1
Content.Server/GameTicking/Rules/RevolutionaryRuleSystem.cs

@@ -166,7 +166,7 @@ private void OnPostFlash(EntityUid uid, HeadRevolutionaryComponent comp, ref Aft
         }
 
         if (mind?.Session != null)
-            _antag.SendBriefing(mind.Session, Loc.GetString("rev-role-greeting"), Color.Red, revComp.RevStartSound);
+            _antag.SendBriefing(mind.Session, Loc.GetString("rev-role-greeting"), Color.Red, null);
     }
 
     //TODO: Enemies of the revolution

+ 2 - 2
Content.Server/GameTicking/Rules/TraitorRuleSystem.cs

@@ -134,7 +134,7 @@ public bool MakeTraitor(EntityUid traitor, TraitorRuleComponent component)
 
         if (component.GiveBriefing)
         {
-            _antag.SendBriefing(traitor, GenerateBriefing(codewords, code, issuer), null, component.GreetSoundNotification);
+            _antag.SendBriefing(traitor, GenerateBriefing(codewords, code, issuer), null, null);
             Log.Debug($"MakeTraitor {ToPrettyString(traitor)} - Sent the Briefing");
         }
 
@@ -204,7 +204,7 @@ public bool MakeTraitor(EntityUid traitor, TraitorRuleComponent component)
     // TODO: AntagCodewordsComponent
     private void OnObjectivesTextPrepend(EntityUid uid, TraitorRuleComponent comp, ref ObjectivesTextPrependEvent args)
     {
-        if(comp.GiveCodewords)
+        if (comp.GiveCodewords)
             args.Text += "\n" + Loc.GetString("traitor-round-end-codewords", ("codewords", string.Join(", ", comp.Codewords)));
     }
 

+ 0 - 2
Content.Server/Zombies/ZombieSystem.Transform.cs

@@ -240,8 +240,6 @@ public void ZombifyEntity(EntityUid target, MobStateComponent? mobState = null)
             //Greeting message for new bebe zombers
             _chatMan.DispatchServerMessage(session, Loc.GetString("zombie-infection-greeting"));
 
-            // Notificate player about new role assignment
-            _audio.PlayGlobal(zombiecomp.GreetSoundNotification, session);
         }
         else
         {

+ 1 - 1
Content.Shared/Civ14/CivFactions/FactionExamineSystem.cs

@@ -42,7 +42,7 @@ private void OnFactionExamine(EntityUid uid, CivFactionComponent component, Exam
         }
         else
         {
-            var str = $"He is a member of [color=#7f0000]{component.FactionName}[/color].";
+            var str = $"He is not a member of any factions.";
             args.PushMarkup(str);
         }
     }

+ 1 - 1
Content.Shared/Nutrition/Components/HungerComponent.cs

@@ -34,7 +34,7 @@ public sealed partial class HungerComponent : Component
     /// </summary>
     /// <remarks>Any time this is modified, <see cref="HungerSystem.SetAuthoritativeHungerValue"/> should be called.</remarks>
     [DataField("baseDecayRate"), ViewVariables(VVAccess.ReadWrite)]
-    public float BaseDecayRate = 0.1f;
+    public float BaseDecayRate = 0.05f;
 
     /// <summary>
     /// The actual amount at which <see cref="LastAuthoritativeHungerValue"/> decays.

+ 0 - 6
Content.Shared/Revolutionary/Components/RevolutionaryComponent.cs

@@ -18,11 +18,5 @@ public sealed partial class RevolutionaryComponent : Component
     [DataField, ViewVariables(VVAccess.ReadWrite)]
     public ProtoId<FactionIconPrototype> StatusIcon { get; set; } = "RevolutionaryFaction";
 
-    /// <summary>
-    /// Sound that plays when you are chosen as Rev. (Placeholder until I find something cool I guess)
-    /// </summary>
-    [DataField]
-    public SoundSpecifier RevStartSound = new SoundPathSpecifier("/Audio/Ambience/Antag/headrev_start.ogg");
-
     public override bool SessionSpecific => true;
 }

+ 0 - 7
Content.Shared/Silicons/Laws/Components/EmagSiliconLawComponent.cs

@@ -29,11 +29,4 @@ public sealed partial class EmagSiliconLawComponent : Component
     [DataField, ViewVariables(VVAccess.ReadWrite)]
     public TimeSpan StunTime = TimeSpan.Zero;
 
-    /// <summary>
-    /// The sound that plays for the borg player
-    /// to let them know they've been emagged
-    /// </summary>
-    [DataField]
-    public SoundSpecifier EmaggedSound = new SoundPathSpecifier("/Audio/Ambience/Antag/emagged_borg.ogg");
-
 }

+ 1 - 2
Content.Shared/Silicons/Laws/SharedSiliconLawSystem.cs

@@ -53,8 +53,7 @@ private void OnGotEmagged(EntityUid uid, EmagSiliconLawComponent component, ref
 
         component.OwnerName = Name(args.UserUid);
 
-        NotifyLawsChanged(uid, component.EmaggedSound);
-        if(_mind.TryGetMind(uid, out var mindId, out _))
+        if (_mind.TryGetMind(uid, out var mindId, out _))
             EnsureSubvertedSiliconRole(mindId);
 
         _stunSystem.TryParalyze(uid, component.StunTime, true);

+ 3 - 9
Content.Shared/Zombies/ZombieComponent.cs

@@ -66,7 +66,7 @@ public sealed partial class ZombieComponent : Component
     /// The CustomBaseLayers of the humanoid to restore in case of cloning
     /// </summary>
     [DataField("beforeZombifiedCustomBaseLayers")]
-    public Dictionary<HumanoidVisualLayers, CustomBaseLayerInfo> BeforeZombifiedCustomBaseLayers = new ();
+    public Dictionary<HumanoidVisualLayers, CustomBaseLayerInfo> BeforeZombifiedCustomBaseLayers = new();
 
     /// <summary>
     /// The skin color of the humanoid to restore in case of cloning
@@ -85,7 +85,7 @@ public sealed partial class ZombieComponent : Component
 
     public EmoteSoundsPrototype? EmoteSounds;
 
-    [DataField("nextTick", customTypeSerializer:typeof(TimeOffsetSerializer))]
+    [DataField("nextTick", customTypeSerializer: typeof(TimeOffsetSerializer))]
     public TimeSpan NextTick;
 
     [DataField("zombieStatusIcon")]
@@ -97,7 +97,7 @@ public sealed partial class ZombieComponent : Component
     [DataField("passiveHealing")]
     public DamageSpecifier PassiveHealing = new()
     {
-        DamageDict = new ()
+        DamageDict = new()
         {
             { "Blunt", -0.4 },
             { "Slash", -0.2 },
@@ -127,12 +127,6 @@ public sealed partial class ZombieComponent : Component
         }
     };
 
-    /// <summary>
-    ///     Path to antagonist alert sound.
-    /// </summary>
-    [DataField("greetSoundNotification")]
-    public SoundSpecifier GreetSoundNotification = new SoundPathSpecifier("/Audio/Ambience/Antag/zombie_start.ogg");
-
     /// <summary>
     ///     Hit sound on zombie bite.
     /// </summary>

+ 1 - 1
Content.Shared/_Stalker/Stamina/StaminaActiveComponent.cs

@@ -9,7 +9,7 @@ public sealed partial class StaminaActiveComponent : Component
     /// Float on which our entity will be "stunned"
     /// </summary>
     [DataField("slowThreshold"), ViewVariables(VVAccess.ReadWrite), AutoNetworkedField]
-    public float SlowThreshold = 180f;
+    public float SlowThreshold = 200f;
 
     /// <summary>
     /// Value to compare with StaminaDamage and set default sprint speed back.

+ 0 - 24
Resources/Audio/Ambience/Antag/attributions.yml

@@ -1,24 +0,0 @@
-- files: ["nukeops_start.ogg, traitor_start.ogg"]
-  license: "CC-BY-SA-3.0"
-  copyright: "Taken from TG station"
-  source: "https://github.com/tgstation/tgstation/commit/827967c9650c23af64280ad1491405fed8f644c5#diff-6cc910b7cad9ac4333c8d0885fc844746066120b465d8d4ba8f7019169316574"
-- files: ["pirate_start.ogg"]
-  license: "CC-BY-NC-SA-3.0"
-  copyright: "Made by @MIXnikita#1474 (Discord) for SS14"
-  source: "https://github.com/SerbiaStrong-220/space-station-14/commit/f33ce80db9d8ac962ec36eb5ae61afa8c0035d1a"
-- files: ["zombie_start.ogg"]
-  license: "CC-BY-NC-SA-3.0"
-  copyright: "Made by @MIXnikita#1474 (Discord) for SS14"
-  source: "https://github.com/SerbiaStrong-220/space-station-14/commit/f33ce80db9d8ac962ec36eb5ae61afa8c0035d1a"
-- files: ["headrev_start.ogg"]
-  license: "CC0-1.0"
-  copyright: "Made by https://www.youtube.com/@a-guy173"
-  source: https://github.com/A-Guy173/Music/blob/main/revolution.mp3
-- files: ["emagged_borg.ogg"]
-  license: "CC-BY-SA-3.0"
-  copyright: "Made by @ps3moira on github"
-  source: https://www.youtube.com/watch?v=4-R-_DiqiLo
-- files: ["silicon_lawboard_antimov.ogg"]
-  license: "CC-BY-SA-3.0"
-  copyright: "Made by @ps3moira on Discord for SS14"
-  source: "https://www.youtube.com/watch?v=jf1sYGYVLsw"

BIN
Resources/Audio/Ambience/Antag/emagged_borg.ogg


BIN
Resources/Audio/Ambience/Antag/headrev_start.ogg


BIN
Resources/Audio/Ambience/Antag/nukeops_start.ogg


BIN
Resources/Audio/Ambience/Antag/pirate_start.ogg


BIN
Resources/Audio/Ambience/Antag/silicon_lawboard_antimov.ogg


BIN
Resources/Audio/Ambience/Antag/traitor_start.ogg


BIN
Resources/Audio/Ambience/Antag/zombie_start.ogg


BIN
Resources/Audio/Ambience/ambiatmos.ogg


BIN
Resources/Audio/Ambience/ambiatmos2.ogg


BIN
Resources/Audio/Ambience/ambicave.ogg


BIN
Resources/Audio/Ambience/ambicha1.ogg


BIN
Resources/Audio/Ambience/ambicha2.ogg


BIN
Resources/Audio/Ambience/ambicha3.ogg


BIN
Resources/Audio/Ambience/ambicha4.ogg


BIN
Resources/Audio/Ambience/ambidanger.ogg


BIN
Resources/Audio/Ambience/ambidanger2.ogg


BIN
Resources/Audio/Ambience/ambigen1.ogg


BIN
Resources/Audio/Ambience/ambigen10.ogg


BIN
Resources/Audio/Ambience/ambigen11.ogg


BIN
Resources/Audio/Ambience/ambigen12.ogg


BIN
Resources/Audio/Ambience/ambigen13.ogg


BIN
Resources/Audio/Ambience/ambigen14.ogg


BIN
Resources/Audio/Ambience/ambigen15.ogg


BIN
Resources/Audio/Ambience/ambigen2.ogg


BIN
Resources/Audio/Ambience/ambigen3.ogg


BIN
Resources/Audio/Ambience/ambigen4.ogg


BIN
Resources/Audio/Ambience/ambigen5.ogg


BIN
Resources/Audio/Ambience/ambigen6.ogg


BIN
Resources/Audio/Ambience/ambigen7.ogg


BIN
Resources/Audio/Ambience/ambigen8.ogg


BIN
Resources/Audio/Ambience/ambigen9.ogg


BIN
Resources/Audio/Ambience/ambiholy.ogg


BIN
Resources/Audio/Ambience/ambiholy2.ogg


BIN
Resources/Audio/Ambience/ambiholy3.ogg


BIN
Resources/Audio/Ambience/ambilava1.ogg


BIN
Resources/Audio/Ambience/ambilava2.ogg


BIN
Resources/Audio/Ambience/ambilava3.ogg


BIN
Resources/Audio/Ambience/ambimaint1.ogg


BIN
Resources/Audio/Ambience/ambimaint2.ogg


BIN
Resources/Audio/Ambience/ambimaint3.ogg


BIN
Resources/Audio/Ambience/ambimaint4.ogg


BIN
Resources/Audio/Ambience/ambimaint5.ogg


BIN
Resources/Audio/Ambience/ambimine.ogg


BIN
Resources/Audio/Ambience/ambimo1.ogg


BIN
Resources/Audio/Ambience/ambimo2.ogg


BIN
Resources/Audio/Ambience/ambimystery.ogg


BIN
Resources/Audio/Ambience/ambinice.ogg


BIN
Resources/Audio/Ambience/ambiodd.ogg


BIN
Resources/Audio/Ambience/ambireebe1.ogg


BIN
Resources/Audio/Ambience/ambireebe3.ogg


BIN
Resources/Audio/Ambience/ambiruin.ogg


BIN
Resources/Audio/Ambience/ambiruin2.ogg


BIN
Resources/Audio/Ambience/ambiruin3.ogg


BIN
Resources/Audio/Ambience/ambiruin4.ogg


BIN
Resources/Audio/Ambience/ambiruin5.ogg


BIN
Resources/Audio/Ambience/ambiruin6.ogg


BIN
Resources/Audio/Ambience/ambiruin7.ogg


BIN
Resources/Audio/Ambience/ambisin1.ogg


BIN
Resources/Audio/Ambience/ambisin2.ogg


BIN
Resources/Audio/Ambience/ambisin3.ogg


BIN
Resources/Audio/Ambience/ambisin4.ogg


BIN
Resources/Audio/Ambience/ambispace2.ogg


BIN
Resources/Audio/Ambience/ambitech.ogg


BIN
Resources/Audio/Ambience/ambitech2.ogg


BIN
Resources/Audio/Ambience/ambitech3.ogg


BIN
Resources/Audio/Ambience/ambitrain1.ogg


BIN
Resources/Audio/Ambience/ambitrain2.ogg


BIN
Resources/Audio/Ambience/ambitrain3.ogg


BIN
Resources/Audio/Ambience/anomaly_drone.ogg


BIN
Resources/Audio/Ambience/anomaly_scary.ogg


+ 0 - 119
Resources/Audio/Ambience/attributions.yml

@@ -1,123 +1,4 @@
-- files: ["anomaly_drone.ogg"]
-  license: "CC0-1.0"
-  copyright: "Created by Joao_Janz, edited and converted to Mono by EmoGarbage"
-  source: "https://freesound.org/people/Joao_Janz/sounds/478472/"
-
-- files: ["ambiatmos.ogg,
-          ambiatmos2.ogg,
-          ambicave.ogg,
-          ambicha1.ogg,
-          ambicha2.ogg,
-          ambicha3.ogg,
-          ambicha4.ogg,
-          ambidanger.ogg,
-          ambidanger2.ogg,
-          ambigen1.ogg,
-          ambigen2.ogg,
-          ambigen3.ogg,
-          ambigen4.ogg,
-          ambigen5.ogg,
-          ambigen6.ogg,
-          ambigen7.ogg,
-          ambigen8.ogg,
-          ambigen9.ogg,
-          ambigen10.ogg,
-          ambigen11.ogg,
-          ambigen12.ogg,
-          ambigen13.ogg,
-          ambigen14.ogg,
-          ambigen15.ogg,
-          ambiholy.ogg,
-          ambiholy2.ogg,
-          ambiholy3.ogg,
-          ambilava1.ogg,
-          ambilava2.ogg,
-          ambilava3.ogg,
-          ambimaint1.ogg,
-          ambimaint2.ogg,
-          ambimaint3.ogg,
-          ambimaint4.ogg,
-          ambimaint5.ogg,
-          ambimine.ogg,
-          ambimo1.ogg,
-          ambimo2.ogg,
-          ambimystery.ogg,
-          ambinice.ogg,
-          ambiodd.ogg,
-          ambireebe1.ogg,
-          ambireebe3.ogg,
-          ambiruin.ogg,
-          ambiruin2.ogg,
-          ambiruin3.ogg,
-          ambiruin4.ogg,
-          ambiruin5.ogg,
-          ambiruin6.ogg,
-          ambiruin7.ogg,
-          ambisin1.ogg,
-          ambisin2.ogg,
-          ambisin3.ogg,
-          ambisin4.ogg,
-          ambitech.ogg,
-          ambitech2.ogg,
-          ambitech3.ogg,
-          maintambience.ogg,
-          ambispace2.ogg"]
-  license: "CC-BY-SA-3.0"
-  copyright: "Taken from /tg/station"
-  source: "https://github.com/tgstation/tgstation/tree/ae9767664701396501af5dcef8e34c4b5add3d47/sound/ambience"
-
 - files: ["shipambience.ogg"]
   license: "CC-BY-SA-3.0"
   copyright: "Taken from /tg/station (see source), which took it from CEV Eris (commit https://github.com/discordia-space/CEV-Eris/blob/e4e40d38424afe88c8a81cf0e3857d8af4ef077f/sound/ambience/shipambience.ogg)"
   source: "https://github.com/tgstation/tgstation/blob/66a625e6df15eaa97e599248a2281c74238ce26e/sound/ambience/shipambience.ogg"
-
-- files: ["starlight.ogg"]
-  license: "CC-BY-SA-3.0"
-  copyright: "Taken from BeeStation"
-  source: "https://github.com/BeeStation/BeeStation-Hornet/commit/5228e20df942bb45e9469358022e2451bb9c0efe"
-
-- files: ["constellations.ogg"]
-  license: "CC-BY-SA-3.0"
-  copyright: "Taken from BeeStation"
-  source: "https://github.com/BeeStation/BeeStation-Hornet/commit/bdf79fbf44f776b7380ceec62a9f112a002b4121"
-
-- files: ["drifting.ogg"]
-  license: "CC-BY-SA-3.0"
-  copyright: "Taken from BeeStation"
-  source: "https://github.com/BeeStation/BeeStation-Hornet/commit/cf8c667dcca196c0e81af37ed0c27b9bdee9c888"
-
-- files: ["voyage_neverending.ogg"]
-  license: "CC0-1.0"
-  copyright: "Created by Discord handle derflerp"
-  source: "https://discord.com/channels/310555209753690112/536955542913024015/1162982443645665371"
-
-- files: ["unanchored.ogg"]
-  license: "CC-BY-SA-3.0"
-  copyright: "Created by Discord handle pigeonpeas, Soundcloud handle pigeonbeans"
-  source: "https://soundcloud.com/pigeonbeans/unanchored"
-
-- files: ["spookyspace1.ogg,
-          spookyspace2.ogg"]
-  license: "CC0-1.0"
-  copyright: "Taken from /vg/station"
-  source: "https://github.com/vgstation-coders/vgstation13/commit/23303188abe6fe31b114a218a1950d7325a23730"
-
-- files: ["ambitrain1.ogg"]
-  license: "CC-BY-4.0"
-  copyright: "Created by Badgie42 on Freesound.com, converted to Mono by TheShuEd"
-  source: "https://freesound.org/people/Badgie42/sounds/399876/"
-
-- files: ["ambitrain2.ogg"]
-  license: "CC0-1.0"
-  copyright: "Created by Hallkom on Freesound.com, cropped and converted to Mono by TheShuEd"
-  source: "https://freesound.org/people/Hallkom/sounds/588486/"
-
-- files: ["ambitrain3.ogg"]
-  license: "CC0-1.0"
-  copyright: "Created by ldezem on Freesound.com, cropped and converted to Mono by TheShuEd"
-  source: "https://freesound.org/people/ldezem/sounds/528238/"
-
-- files: ["anomaly_scary.ogg"]
-  license: "CC0-1.0"
-  copyright: "Created by dimbark1, edited and converted to mono by TheShuEd"
-  source: "https://freesound.org/people/dimbark1/sounds/316797/"

BIN
Resources/Audio/Ambience/constellations.ogg


BIN
Resources/Audio/Ambience/drifting.ogg


BIN
Resources/Audio/Ambience/maintambience.ogg


BIN
Resources/Audio/Ambience/spookyspace1.ogg


BIN
Resources/Audio/Ambience/spookyspace2.ogg


BIN
Resources/Audio/Ambience/starlight.ogg


BIN
Resources/Audio/Ambience/unanchored.ogg


BIN
Resources/Audio/Ambience/voyage_neverending.ogg


Різницю між файлами не показано, бо вона завелика
+ 0 - 470
Resources/Prototypes/Civ14/Entities/Clothing/entities_clothing_uniform.yml


+ 82 - 88
Resources/Prototypes/Entities/Effects/portal.yml

@@ -4,122 +4,116 @@
   name: bluespace portal
   description: Transports you to a linked destination!
   components:
-  - type: Transform
-    anchored: True
-  - type: InteractionOutline
-  - type: Clickable
-  - type: Physics
-    bodyType: Static
-  - type: Sprite
-    sprite: /Textures/Effects/portal.rsi
-  - type: Fixtures
-    fixtures:
-      portalFixture:
-        shape:
-          !type:PhysShapeAabb
-          bounds: "-0.25,-0.48,0.25,0.48"
-        mask:
-        - FullTileMask
-        layer:
-        - WallLayer
-        hard: false
-  - type: Portal
+    - type: Transform
+      anchored: True
+    - type: InteractionOutline
+    - type: Clickable
+    - type: Physics
+      bodyType: Static
+    - type: Sprite
+      sprite: /Textures/Effects/portal.rsi
+    - type: Fixtures
+      fixtures:
+        portalFixture:
+          shape: !type:PhysShapeAabb
+            bounds: "-0.25,-0.48,0.25,0.48"
+          mask:
+            - FullTileMask
+          layer:
+            - WallLayer
+          hard: false
+    - type: Portal
 
 - type: entity
   id: PortalRed
   parent: BasePortal
   description: This one looks more like a redspace portal.
   components:
-  - type: Sprite
-    layers:
-    - state: portal-red
-  - type: PointLight
-    color: OrangeRed
-    radius: 3
-    energy: 1
-    netsync: false
+    - type: Sprite
+      layers:
+        - state: portal-red
+    - type: PointLight
+      color: OrangeRed
+      radius: 3
+      energy: 1
+      netsync: false
 
 - type: entity
   id: PortalBlue
   parent: BasePortal
   components:
-  - type: Sprite
-    layers:
-    - state: portal-blue
-  - type: PointLight
-    color: SkyBlue
-    radius: 3
-    energy: 1
-    netsync: false
-    
+    - type: Sprite
+      layers:
+        - state: portal-blue
+    - type: PointLight
+      color: SkyBlue
+      radius: 3
+      energy: 1
+      netsync: false
+
 - type: entity
   id: PortalArtifact
   parent: BasePortal
   components:
-  - type: Sprite
-    layers:
-    - state: portal-artifact
-  - type: PointLight
-    color: "#ed85c2"
-    radius: 3
-    energy: 1
-    netsync: false
-  - type: TimedDespawn
-    lifetime: 1
-  - type: Portal
-    canTeleportToOtherMaps: true
+    - type: Sprite
+      layers:
+        - state: portal-artifact
+    - type: PointLight
+      color: "#ed85c2"
+      radius: 3
+      energy: 1
+      netsync: false
+    - type: TimedDespawn
+      lifetime: 1
+    - type: Portal
+      canTeleportToOtherMaps: true
 
 - type: entity
   id: PortalGatewayBlue
   parent: BasePortal
   components:
-  - type: Sprite
-    noRot: true
-    sprite: Structures/Machines/gateway.rsi
-    color: SkyBlue
-    layers:
-    - state: portal
-  - type: PointLight
-    color: SkyBlue
-    radius: 3
-    energy: 1
-    netsync: false
+    - type: Sprite
+      noRot: true
+      sprite: Structures/Machines/gateway.rsi
+      color: SkyBlue
+      layers:
+        - state: portal
+    - type: PointLight
+      color: SkyBlue
+      radius: 3
+      energy: 1
+      netsync: false
 
 - type: entity
   id: PortalGatewayOrange
   parent: BasePortal
   components:
-  - type: Sprite
-    noRot: true
-    sprite: Structures/Machines/gateway.rsi
-    color: OrangeRed
-    layers:
-    - state: portal
-  - type: PointLight
-    color: OrangeRed
-    radius: 3
-    energy: 1
-    netsync: false
+    - type: Sprite
+      noRot: true
+      sprite: Structures/Machines/gateway.rsi
+      color: OrangeRed
+      layers:
+        - state: portal
+    - type: PointLight
+      color: OrangeRed
+      radius: 3
+      energy: 1
+      netsync: false
 
 - type: entity
   id: ShadowPortal
   name: shadow rift
   description: Looks unstable.
-  parent: [ BasePortal, BaseShadow ]
+  parent: [BasePortal, BaseShadow]
   components:
-  - type: Portal
-    arrivalSound: /Audio/Items/hiss.ogg
-    departureSound: /Audio/Items/hiss.ogg
-  - type: Sprite
-    state: portal-artifact
-    color: "#793a80dd"
-  - type: PointLight
-    color: "#793a80dd"
-    radius: 3
-    energy: 1
-    netsync: false
-  - type: AmbientSound
-    range: 6
-    volume: -3
-    sound:
-      path: /Audio/Ambience/anomaly_scary.ogg
+    - type: Portal
+      arrivalSound: /Audio/Items/hiss.ogg
+      departureSound: /Audio/Items/hiss.ogg
+    - type: Sprite
+      state: portal-artifact
+      color: "#793a80dd"
+    - type: PointLight
+      color: "#793a80dd"
+      radius: 3
+      energy: 1
+      netsync: false

+ 0 - 6
Resources/Prototypes/Entities/Structures/Machines/anomaly_equipment.yml

@@ -37,12 +37,6 @@
       color: "#fca3c0"
     - type: Appearance
     - type: WiresPanel
-    - type: AmbientSound
-      enabled: false
-      range: 3
-      volume: -8
-      sound:
-        path: /Audio/Ambience/anomaly_drone.ogg
     - type: GenericVisualizer
       visuals:
         enum.PowerDeviceVisuals.Powered:

+ 0 - 12
Resources/Prototypes/Entities/Structures/Specific/Anomaly/anomalies.yml

@@ -10,11 +10,6 @@
         collection: RadiationPulse
         params:
           volume: 5
-    - type: AmbientSound
-      range: 5
-      volume: -5
-      sound:
-        path: /Audio/Ambience/anomaly_drone.ogg
     - type: Transform
       anchored: false
     - type: Physics
@@ -598,8 +593,6 @@
           spawns:
             - MobSpawnCrabGold
 
-
-
 - type: entity
   id: AnomalyRockCoal
   parent: AnomalyRockBase
@@ -877,11 +870,6 @@
       radius: 1.5
       energy: 12.5
       color: "#793a80"
-    - type: AmbientSound
-      range: 5
-      volume: -5
-      sound:
-        path: /Audio/Ambience/anomaly_scary.ogg
     - type: Anomaly
       corePrototype: AnomalyCoreShadow
       coreInertPrototype: AnomalyCoreShadowInert

+ 257 - 263
Resources/Prototypes/Entities/Structures/Specific/Anomaly/anomaly_injectors.yml

@@ -4,342 +4,336 @@
   id: BaseAnomalyInjector
   abstract: true
   components:
-  - type: Physics
-    bodyType: Static
-    fixedRotation: true
-  - type: AmbientSound
-    range: 5
-    volume: -5
-    sound:
-      path: /Audio/Ambience/anomaly_drone.ogg
-  - type: Fixtures
-    fixtures:
-      anom:
-        shape:
-          !type:PhysShapeCircle
-          radius: 2.27 # i love 27
-        hard: false
-        mask:
-        - MobMask
-        layer:
-        - MobLayer
-  - type: InnerBodyAnomalyInjector
-    whitelist:
-      tags:
-      - AnomalyHost
+    - type: Physics
+      bodyType: Static
+      fixedRotation: true
+    - type: Fixtures
+      fixtures:
+        anom:
+          shape: !type:PhysShapeCircle
+            radius: 2.27 # i love 27
+          hard: false
+          mask:
+            - MobMask
+          layer:
+            - MobLayer
+    - type: InnerBodyAnomalyInjector
+      whitelist:
+        tags:
+          - AnomalyHost
 
 - type: entity
   parent: BaseAnomalyInjector
   id: AnomalyTrapPyroclastic
   suffix: Pyroclastic
   components:
-  - type: Sprite
-    layers:
-    - state: pink
-    - sprite: Structures/Specific/Anomalies/pyro_anom.rsi
-      state: pulse
-    - sprite: Mobs/Species/Human/parts.rsi
-      state: full
-  - type: InnerBodyAnomalyInjector
-    injectionComponents:
-      - type: Anomaly
-        deleteEntity: false
-        maxPointsPerSecond: 100
-        corePrototype: AnomalyCorePyroclastic
-      - type: InnerBodyAnomaly
-        injectionProto: AnomalyInjectionPyroclastic
-        startMessage: inner-anomaly-start-message-pyro
-        fallbackSprite:
-          sprite: Structures/Specific/Anomalies/inner_anom_layer.rsi
-          state: fire
-        speciesSprites:
-          Vox:
+    - type: Sprite
+      layers:
+        - state: pink
+        - sprite: Structures/Specific/Anomalies/pyro_anom.rsi
+          state: pulse
+        - sprite: Mobs/Species/Human/parts.rsi
+          state: full
+    - type: InnerBodyAnomalyInjector
+      injectionComponents:
+        - type: Anomaly
+          deleteEntity: false
+          maxPointsPerSecond: 100
+          corePrototype: AnomalyCorePyroclastic
+        - type: InnerBodyAnomaly
+          injectionProto: AnomalyInjectionPyroclastic
+          startMessage: inner-anomaly-start-message-pyro
+          fallbackSprite:
             sprite: Structures/Specific/Anomalies/inner_anom_layer.rsi
-            state: fire_VOX
+            state: fire
+          speciesSprites:
+            Vox:
+              sprite: Structures/Specific/Anomalies/inner_anom_layer.rsi
+              state: fire_VOX
 
 - type: entity
   parent: BaseAnomalyInjector
   id: AnomalyTrapElectricity
   suffix: Electricity
   components:
-  - type: Sprite
-    layers:
-    - state: pink
-    - sprite: Structures/Specific/anomaly.rsi
-      state: anom3-pulse
-    - sprite: Mobs/Species/Human/parts.rsi
-      state: full
-  - type: InnerBodyAnomalyInjector
-    injectionComponents:
-      - type: Anomaly
-        deleteEntity: false
-        maxPointsPerSecond: 100
-        corePrototype: AnomalyCoreElectricity
-      - type: InnerBodyAnomaly
-        injectionProto: AnomalyInjectionElectric
-        startMessage: inner-anomaly-start-message-shock
-        fallbackSprite:
-          sprite: Structures/Specific/Anomalies/inner_anom_layer.rsi
-          state: shock
-        speciesSprites:
-          Vox:
+    - type: Sprite
+      layers:
+        - state: pink
+        - sprite: Structures/Specific/anomaly.rsi
+          state: anom3-pulse
+        - sprite: Mobs/Species/Human/parts.rsi
+          state: full
+    - type: InnerBodyAnomalyInjector
+      injectionComponents:
+        - type: Anomaly
+          deleteEntity: false
+          maxPointsPerSecond: 100
+          corePrototype: AnomalyCoreElectricity
+        - type: InnerBodyAnomaly
+          injectionProto: AnomalyInjectionElectric
+          startMessage: inner-anomaly-start-message-shock
+          fallbackSprite:
             sprite: Structures/Specific/Anomalies/inner_anom_layer.rsi
-            state: shock_VOX
+            state: shock
+          speciesSprites:
+            Vox:
+              sprite: Structures/Specific/Anomalies/inner_anom_layer.rsi
+              state: shock_VOX
 
 - type: entity
   parent: BaseAnomalyInjector
   id: AnomalyTrapShadow
   suffix: Shadow
   components:
-  - type: Sprite
-    layers:
-    - state: pink
-    - sprite: Structures/Specific/Anomalies/shadow_anom.rsi
-      state: pulse
-    - sprite: Mobs/Species/Human/parts.rsi
-      state: full
-  - type: InnerBodyAnomalyInjector
-    injectionComponents:
-      - type: Anomaly
-        deleteEntity: false
-        maxPointsPerSecond: 100
-        corePrototype: AnomalyCoreShadow
-      - type: InnerBodyAnomaly
-        injectionProto: AnomalyInjectionShadow
-        startMessage: inner-anomaly-start-message-shadow
-        fallbackSprite:
-          sprite: Structures/Specific/Anomalies/inner_anom_layer.rsi
-          state: shadow
-        speciesSprites:
-          Vox:
+    - type: Sprite
+      layers:
+        - state: pink
+        - sprite: Structures/Specific/Anomalies/shadow_anom.rsi
+          state: pulse
+        - sprite: Mobs/Species/Human/parts.rsi
+          state: full
+    - type: InnerBodyAnomalyInjector
+      injectionComponents:
+        - type: Anomaly
+          deleteEntity: false
+          maxPointsPerSecond: 100
+          corePrototype: AnomalyCoreShadow
+        - type: InnerBodyAnomaly
+          injectionProto: AnomalyInjectionShadow
+          startMessage: inner-anomaly-start-message-shadow
+          fallbackSprite:
             sprite: Structures/Specific/Anomalies/inner_anom_layer.rsi
-            state: shadow_VOX
+            state: shadow
+          speciesSprites:
+            Vox:
+              sprite: Structures/Specific/Anomalies/inner_anom_layer.rsi
+              state: shadow_VOX
 
 - type: entity
   parent: BaseAnomalyInjector
   id: AnomalyTrapIce
   suffix: Ice
   components:
-  - type: Sprite
-    layers:
-    - state: pink
-    - sprite: Structures/Specific/Anomalies/ice_anom.rsi
-      state: pulse
-    - sprite: Mobs/Species/Human/parts.rsi
-      state: full
-  - type: InnerBodyAnomalyInjector
-    injectionComponents:
-      - type: Anomaly
-        deleteEntity: false
-        maxPointsPerSecond: 100
-        corePrototype: AnomalyCoreIce
-      - type: InnerBodyAnomaly
-        injectionProto: AnomalyInjectionIce
-        startMessage: inner-anomaly-start-message-frost
-        fallbackSprite:
-          sprite: Structures/Specific/Anomalies/inner_anom_layer.rsi
-          state: frost
-        speciesSprites:
-          Vox:
+    - type: Sprite
+      layers:
+        - state: pink
+        - sprite: Structures/Specific/Anomalies/ice_anom.rsi
+          state: pulse
+        - sprite: Mobs/Species/Human/parts.rsi
+          state: full
+    - type: InnerBodyAnomalyInjector
+      injectionComponents:
+        - type: Anomaly
+          deleteEntity: false
+          maxPointsPerSecond: 100
+          corePrototype: AnomalyCoreIce
+        - type: InnerBodyAnomaly
+          injectionProto: AnomalyInjectionIce
+          startMessage: inner-anomaly-start-message-frost
+          fallbackSprite:
             sprite: Structures/Specific/Anomalies/inner_anom_layer.rsi
-            state: frost_VOX
+            state: frost
+          speciesSprites:
+            Vox:
+              sprite: Structures/Specific/Anomalies/inner_anom_layer.rsi
+              state: frost_VOX
 
 - type: entity
   parent: BaseAnomalyInjector
   id: AnomalyTrapFlora
   suffix: Flora
   components:
-  - type: Sprite
-    layers:
-    - state: pink
-    - sprite: Structures/Specific/Anomalies/flora_anom.rsi
-      state: pulse
-    - sprite: Mobs/Species/Human/parts.rsi
-      state: full
-  - type: InnerBodyAnomalyInjector
-    injectionComponents:
-      - type: Anomaly
-        deleteEntity: false
-        maxPointsPerSecond: 100
-        corePrototype: AnomalyCoreFlora
-      - type: InnerBodyAnomaly
-        injectionProto: AnomalyInjectionFlora
-        startMessage: inner-anomaly-start-message-flora
-        fallbackSprite:
-          sprite: Structures/Specific/Anomalies/inner_anom_layer.rsi
-          state: flora
-        speciesSprites:
-          Vox:
+    - type: Sprite
+      layers:
+        - state: pink
+        - sprite: Structures/Specific/Anomalies/flora_anom.rsi
+          state: pulse
+        - sprite: Mobs/Species/Human/parts.rsi
+          state: full
+    - type: InnerBodyAnomalyInjector
+      injectionComponents:
+        - type: Anomaly
+          deleteEntity: false
+          maxPointsPerSecond: 100
+          corePrototype: AnomalyCoreFlora
+        - type: InnerBodyAnomaly
+          injectionProto: AnomalyInjectionFlora
+          startMessage: inner-anomaly-start-message-flora
+          fallbackSprite:
             sprite: Structures/Specific/Anomalies/inner_anom_layer.rsi
-            state: flora_VOX
+            state: flora
+          speciesSprites:
+            Vox:
+              sprite: Structures/Specific/Anomalies/inner_anom_layer.rsi
+              state: flora_VOX
 
 - type: entity
   parent: BaseAnomalyInjector
   id: AnomalyTrapBluespace
   suffix: Bluespace
   components:
-  - type: Sprite
-    layers:
-    - state: pink
-    - sprite: Structures/Specific/anomaly.rsi
-      state: anom4-pulse
-    - sprite: Mobs/Species/Human/parts.rsi
-      state: full
-  - type: InnerBodyAnomalyInjector
-    injectionComponents:
-      - type: Anomaly
-        deleteEntity: false
-        maxPointsPerSecond: 100
-        corePrototype: AnomalyCoreBluespace
-      - type: InnerBodyAnomaly
-        injectionProto: AnomalyInjectionBluespace
-        startMessage: inner-anomaly-start-message-bluespace
-        fallbackSprite:
-          sprite: Structures/Specific/Anomalies/inner_anom_layer.rsi
-          state: bluespace
-        speciesSprites:
-          Vox:
+    - type: Sprite
+      layers:
+        - state: pink
+        - sprite: Structures/Specific/anomaly.rsi
+          state: anom4-pulse
+        - sprite: Mobs/Species/Human/parts.rsi
+          state: full
+    - type: InnerBodyAnomalyInjector
+      injectionComponents:
+        - type: Anomaly
+          deleteEntity: false
+          maxPointsPerSecond: 100
+          corePrototype: AnomalyCoreBluespace
+        - type: InnerBodyAnomaly
+          injectionProto: AnomalyInjectionBluespace
+          startMessage: inner-anomaly-start-message-bluespace
+          fallbackSprite:
             sprite: Structures/Specific/Anomalies/inner_anom_layer.rsi
-            state: bluespace_VOX
+            state: bluespace
+          speciesSprites:
+            Vox:
+              sprite: Structures/Specific/Anomalies/inner_anom_layer.rsi
+              state: bluespace_VOX
 
 - type: entity
   parent: BaseAnomalyInjector
   id: AnomalyTrapFlesh
   suffix: Flesh
   components:
-  - type: Sprite
-    layers:
-    - state: pink
-    - sprite: Structures/Specific/anomaly.rsi
-      state: anom5-pulse
-    - sprite: Mobs/Species/Human/parts.rsi
-      state: full
-  - type: InnerBodyAnomalyInjector
-    injectionComponents:
-      - type: Anomaly
-        deleteEntity: false
-        maxPointsPerSecond: 100
-        corePrototype: AnomalyCoreFlesh
-      - type: InnerBodyAnomaly
-        injectionProto: AnomalyInjectionFlesh
-        startMessage: inner-anomaly-start-message-flesh
-        fallbackSprite:
-          sprite: Structures/Specific/Anomalies/inner_anom_layer.rsi
-          state: flesh
-        speciesSprites:
-          Vox:
+    - type: Sprite
+      layers:
+        - state: pink
+        - sprite: Structures/Specific/anomaly.rsi
+          state: anom5-pulse
+        - sprite: Mobs/Species/Human/parts.rsi
+          state: full
+    - type: InnerBodyAnomalyInjector
+      injectionComponents:
+        - type: Anomaly
+          deleteEntity: false
+          maxPointsPerSecond: 100
+          corePrototype: AnomalyCoreFlesh
+        - type: InnerBodyAnomaly
+          injectionProto: AnomalyInjectionFlesh
+          startMessage: inner-anomaly-start-message-flesh
+          fallbackSprite:
             sprite: Structures/Specific/Anomalies/inner_anom_layer.rsi
-            state: flesh_VOX
+            state: flesh
+          speciesSprites:
+            Vox:
+              sprite: Structures/Specific/Anomalies/inner_anom_layer.rsi
+              state: flesh_VOX
 
 - type: entity
   parent: BaseAnomalyInjector
   id: AnomalyTrapGravity
   suffix: Gravity
   components:
-  - type: Sprite
-    layers:
-    - state: pink
-    - sprite: Structures/Specific/anomaly.rsi
-      state: anom2-pulse
-    - sprite: Mobs/Species/Human/parts.rsi
-      state: full
-  - type: InnerBodyAnomalyInjector
-    injectionComponents:
-      - type: Anomaly
-        deleteEntity: false
-        maxPointsPerSecond: 100
-        corePrototype: AnomalyCoreGravity
-      - type: InnerBodyAnomaly
-        injectionProto: AnomalyInjectionGravity
-        startMessage: inner-anomaly-start-message-grav
-        fallbackSprite:
-          sprite: Structures/Specific/Anomalies/inner_anom_layer.rsi
-          state: grav
-        speciesSprites:
-          Vox:
+    - type: Sprite
+      layers:
+        - state: pink
+        - sprite: Structures/Specific/anomaly.rsi
+          state: anom2-pulse
+        - sprite: Mobs/Species/Human/parts.rsi
+          state: full
+    - type: InnerBodyAnomalyInjector
+      injectionComponents:
+        - type: Anomaly
+          deleteEntity: false
+          maxPointsPerSecond: 100
+          corePrototype: AnomalyCoreGravity
+        - type: InnerBodyAnomaly
+          injectionProto: AnomalyInjectionGravity
+          startMessage: inner-anomaly-start-message-grav
+          fallbackSprite:
             sprite: Structures/Specific/Anomalies/inner_anom_layer.rsi
-            state: grav_VOX
+            state: grav
+          speciesSprites:
+            Vox:
+              sprite: Structures/Specific/Anomalies/inner_anom_layer.rsi
+              state: grav_VOX
 
 - type: entity
   parent: BaseAnomalyInjector
   id: AnomalyTrapTech
   suffix: Tech
   components:
-  - type: Sprite
-    layers:
-    - state: pink
-    - sprite: Structures/Specific/Anomalies/tech_anom.rsi
-      state: pulse
-    - sprite: Mobs/Species/Human/parts.rsi
-      state: full
-  - type: InnerBodyAnomalyInjector
-    injectionComponents:
-      - type: Anomaly
-        deleteEntity: false
-        maxPointsPerSecond: 100
-        corePrototype: AnomalyCoreTech
-      - type: InnerBodyAnomaly
-        injectionProto: AnomalyInjectionTech
-        startMessage: inner-anomaly-start-message-tech
-        fallbackSprite:
-          sprite: Structures/Specific/Anomalies/inner_anom_layer.rsi
-          state: tech
-        speciesSprites:
-          Vox:
+    - type: Sprite
+      layers:
+        - state: pink
+        - sprite: Structures/Specific/Anomalies/tech_anom.rsi
+          state: pulse
+        - sprite: Mobs/Species/Human/parts.rsi
+          state: full
+    - type: InnerBodyAnomalyInjector
+      injectionComponents:
+        - type: Anomaly
+          deleteEntity: false
+          maxPointsPerSecond: 100
+          corePrototype: AnomalyCoreTech
+        - type: InnerBodyAnomaly
+          injectionProto: AnomalyInjectionTech
+          startMessage: inner-anomaly-start-message-tech
+          fallbackSprite:
             sprite: Structures/Specific/Anomalies/inner_anom_layer.rsi
-            state: tech_VOX
+            state: tech
+          speciesSprites:
+            Vox:
+              sprite: Structures/Specific/Anomalies/inner_anom_layer.rsi
+              state: tech_VOX
 
 - type: entity
   parent: BaseAnomalyInjector
   id: AnomalyTrapRock
   suffix: Rock
   components:
-  - type: Sprite
-    layers:
-    - state: pink
-    - sprite: Structures/Specific/anomaly.rsi
-      state: anom6-pulse
-      color: "#5ca8cb"
-    - sprite: Mobs/Species/Human/parts.rsi
-      state: full
-  - type: InnerBodyAnomalyInjector
-    injectionComponents:
-      - type: Anomaly
-        deleteEntity: false
-        maxPointsPerSecond: 100
-        corePrototype: AnomalyCoreRock
-      - type: InnerBodyAnomaly
-        injectionProto: AnomalyInjectionRock
-        startMessage: inner-anomaly-start-message-rock
-        fallbackSprite:
-          sprite: Structures/Specific/Anomalies/inner_anom_layer.rsi
-          state: rock
-        speciesSprites:
-          Vox:
+    - type: Sprite
+      layers:
+        - state: pink
+        - sprite: Structures/Specific/anomaly.rsi
+          state: anom6-pulse
+          color: "#5ca8cb"
+        - sprite: Mobs/Species/Human/parts.rsi
+          state: full
+    - type: InnerBodyAnomalyInjector
+      injectionComponents:
+        - type: Anomaly
+          deleteEntity: false
+          maxPointsPerSecond: 100
+          corePrototype: AnomalyCoreRock
+        - type: InnerBodyAnomaly
+          injectionProto: AnomalyInjectionRock
+          startMessage: inner-anomaly-start-message-rock
+          fallbackSprite:
             sprite: Structures/Specific/Anomalies/inner_anom_layer.rsi
-            state: rock_VOX
+            state: rock
+          speciesSprites:
+            Vox:
+              sprite: Structures/Specific/Anomalies/inner_anom_layer.rsi
+              state: rock_VOX
 
 - type: entity
   parent: BaseAnomalyInjector
   id: AnomalyTrapSanta
   suffix: Santa
   components:
-  - type: Sprite
-    layers:
-    - state: pink
-    - sprite: Structures/Specific/Anomalies/santa_anom.rsi
-      state: pulse
-    - sprite: Mobs/Species/Human/parts.rsi
-      state: full
-  - type: InnerBodyAnomalyInjector
-    injectionComponents:
-      - type: Anomaly
-        deleteEntity: false
-        maxPointsPerSecond: 100
-        corePrototype: AnomalyCoreSanta
-      - type: InnerBodyAnomaly
-        injectionProto: AnomalyInjectionSanta
-        startMessage: inner-anomaly-start-message-santa
-        fallbackSprite:
-          sprite: Structures/Specific/Anomalies/inner_anom_layer.rsi
-          state: santa
+    - type: Sprite
+      layers:
+        - state: pink
+        - sprite: Structures/Specific/Anomalies/santa_anom.rsi
+          state: pulse
+        - sprite: Mobs/Species/Human/parts.rsi
+          state: full
+    - type: InnerBodyAnomalyInjector
+      injectionComponents:
+        - type: Anomaly
+          deleteEntity: false
+          maxPointsPerSecond: 100
+          corePrototype: AnomalyCoreSanta
+        - type: InnerBodyAnomaly
+          injectionProto: AnomalyInjectionSanta
+          startMessage: inner-anomaly-start-message-santa
+          fallbackSprite:
+            sprite: Structures/Specific/Anomalies/inner_anom_layer.rsi
+            state: santa

Деякі файли не було показано, через те що забагато файлів було змінено